bills_template_edit.js 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696
  1. /**
  2. * Created by zhang on 2018/7/13.
  3. */
  4. const locked = lockUtil.getLocked();
  5. let TEMPLATE_BILLS_SETTING = {
  6. "emptyRows": 1,
  7. "headRows": 1,
  8. "headRowHeight": [35],
  9. "treeCol": 1,
  10. "cols": [{
  11. "width": 80,
  12. "readOnly": locked,
  13. "head": {
  14. "titleNames": ["类别"],
  15. "spanCols": [1],
  16. "spanRows": [1],
  17. "vAlign": [1],
  18. "hAlign": [1],
  19. "font": ["Arial"]
  20. },
  21. "data": {
  22. "field": "type",
  23. "vAlign": 0,
  24. "hAlign": 1,
  25. "font": "Arail",
  26. }
  27. }, {
  28. "width": 200,
  29. "readOnly": locked,
  30. "head": {
  31. "titleNames": ["编号"],
  32. "spanCols": [1],
  33. "spanRows": [1],
  34. "vAlign": [1],
  35. "hAlign": [1],
  36. "font": ["Arial"],
  37. },
  38. "data": {
  39. "field": "code",
  40. "vAlign": 0,
  41. "hAlign": 3,
  42. "font": "Arail",
  43. "formatter": '@'
  44. }
  45. }, {
  46. "width": 300,
  47. "readOnly": locked,
  48. "head": {
  49. "titleNames": ["名称"],
  50. "spanCols": [1],
  51. "spanRows": [1],
  52. "vAlign": [1],
  53. "hAlign": [1],
  54. "font": ["Arial"]
  55. },
  56. "data": {
  57. "field": "name",
  58. "vAlign": 0,
  59. "hAlign": 3,
  60. "font": "Arail"
  61. }
  62. }, {
  63. "width": 50,
  64. "readOnly": locked,
  65. "head": {
  66. "titleNames": ["单位"],
  67. "spanCols": [1],
  68. "spanRows": [1],
  69. "vAlign": [1],
  70. "hAlign": [1],
  71. "font": ["Arial"]
  72. },
  73. "data": {
  74. "field": "unit",
  75. "vAlign": 0,
  76. "hAlign": 1,
  77. "font": "Arail"
  78. }
  79. }, {
  80. "width": 80,
  81. "readOnly": locked,
  82. "head": {
  83. "titleNames": ["工程量"],
  84. "spanCols": [1],
  85. "spanRows": [1],
  86. "vAlign": [1],
  87. "hAlign": [1],
  88. "font": ["Arial"]
  89. },
  90. "data": {
  91. "field": "quantity",
  92. "type": 'Number',
  93. "vAlign": 0,
  94. "hAlign": 2,
  95. "font": "Arail"
  96. }
  97. }, {
  98. "width": 200,
  99. "readOnly": locked,
  100. "head": {
  101. "titleNames": ["清单固定类别"],
  102. "spanCols": [1],
  103. "spanRows": [1],
  104. "vAlign": [1],
  105. "hAlign": [1],
  106. "font": ["Arial"]
  107. },
  108. "data": {
  109. "field": "flagsIndex.fixed.flag",
  110. "vAlign": 0,
  111. "hAlign": 3,
  112. "font": "Arail",
  113. }
  114. },
  115. {
  116. width: 40,
  117. readOnly: locked,
  118. head: {
  119. titleNames: ["不可\n删除"],
  120. spanCols: [1],
  121. spanRows: [1],
  122. vAlign: [1],
  123. hAlign: [1],
  124. font: ["Arial"],
  125. },
  126. data: {
  127. field: "cantDelete",
  128. vAlign: 0,
  129. hAlign: 1,
  130. font: "Arail",
  131. },
  132. },
  133. {
  134. width: 200,
  135. readOnly: locked,
  136. head: {
  137. titleNames: ["计价规则"],
  138. spanCols: [1],
  139. spanRows: [1],
  140. vAlign: [1],
  141. hAlign: [1],
  142. font: ["Arial"],
  143. },
  144. data: {
  145. field: "itemCharacterText",
  146. vAlign: 0,
  147. hAlign: 3,
  148. font: "Arail",
  149. },
  150. },
  151. {
  152. width: 200,
  153. readOnly: locked,
  154. head: {
  155. titleNames: ["计价内容"],
  156. spanCols: [1],
  157. spanRows: [1],
  158. vAlign: [1],
  159. hAlign: [1],
  160. font: ["Arial"],
  161. },
  162. data: {
  163. field: "jobContentText",
  164. vAlign: 0,
  165. hAlign: 3,
  166. font: "Arail",
  167. },
  168. },
  169. {
  170. "width": 250,
  171. "readOnly": locked,
  172. "head": {
  173. "titleNames": ["计算基数"],
  174. "spanCols": [1],
  175. "spanRows": [1],
  176. "vAlign": [1],
  177. "hAlign": [1],
  178. "font": ["Arial"]
  179. },
  180. "data": {
  181. "field": "calcBase",
  182. "vAlign": 0,
  183. "hAlign": 3,
  184. "font": "Arail",
  185. }
  186. }, {
  187. "width": 50,
  188. "readOnly": locked,
  189. "head": {
  190. "titleNames": ["费率ID"],
  191. "spanCols": [1],
  192. "spanRows": [1],
  193. "vAlign": [1],
  194. "hAlign": [1],
  195. "font": ["Arial"]
  196. },
  197. "data": {
  198. "field": "feeRateID",
  199. "type": 'Number',
  200. "vAlign": 0,
  201. "hAlign": 1,
  202. "font": "Arail"
  203. }
  204. }, {
  205. "width": 50,
  206. "readOnly": true,
  207. "head": {
  208. "titleNames": ["ID"],
  209. "spanCols": [1],
  210. "spanRows": [1],
  211. "vAlign": [1],
  212. "hAlign": [1],
  213. "font": ["Arial"]
  214. },
  215. "data": {
  216. "field": "ID",
  217. "vAlign": 0,
  218. "hAlign": 1,
  219. "font": "Arail"
  220. }
  221. }, {
  222. "width": 50,
  223. "readOnly": true,
  224. "head": {
  225. "titleNames": ["ParentID"],
  226. "spanCols": [1],
  227. "spanRows": [1],
  228. "vAlign": [1],
  229. "hAlign": [1],
  230. "font": ["Arial"]
  231. },
  232. "data": {
  233. "field": "ParentID",
  234. "vAlign": 0,
  235. "hAlign": 1,
  236. "font": "Arail"
  237. }
  238. }, {
  239. "width": 50,
  240. "readOnly": true,
  241. "head": {
  242. "titleNames": ["NextSiblingID"],
  243. "spanCols": [1],
  244. "spanRows": [1],
  245. "vAlign": [1],
  246. "hAlign": [1],
  247. "font": ["Arial"]
  248. },
  249. "data": {
  250. "field": "NextSiblingID",
  251. "vAlign": 0,
  252. "hAlign": 1,
  253. "font": "Arail"
  254. }
  255. }]
  256. };
  257. $(document).ready(function () {
  258. autoFlashHeight();
  259. let RefreshBaseActn = function (tree) {
  260. if (locked) {
  261. return;
  262. }
  263. let setButtonValid = function (valid, btn) {
  264. if (valid) {
  265. btn.removeClass('disabled');
  266. } else {
  267. btn.addClass('disabled');
  268. }
  269. };
  270. setButtonValid(tree.selected && tree.selected.canUpLevel(), $('#upLevel'));
  271. setButtonValid(tree.selected && tree.selected.canDownLevel(), $('#downLevel'));
  272. setButtonValid(tree.selected && tree.selected.canUpMove(), $('#upMove'));
  273. setButtonValid(tree.selected && tree.selected.canDownMove(), $('#downMove'));
  274. setButtonValid(tree.selected ? true : false, $('#delete'));
  275. };
  276. let RefreshBillsData = function (datas) {
  277. datas.forEach(function (data) {
  278. let node = tree.findNode(data.data.ID);
  279. if (node) {
  280. setFlagsIndex(data.data, node.data.flagsIndex);
  281. $.extend(true, node.data, data.data);
  282. }
  283. });
  284. };
  285. let getNameValueComboCellType = function (datas) {
  286. let comboItems = [];
  287. for (let data of datas) {
  288. comboItems.push({ text: data.name, value: data.value });
  289. }
  290. let combo = new GC.Spread.Sheets.CellTypes.ComboBox();
  291. combo.editorValueType(GC.Spread.Sheets.CellTypes.EditorValueType.value)
  292. .items(comboItems);
  293. return combo;
  294. };
  295. let getFixedFlagCellType = function () {
  296. let billsFixedFlagData = JSON.parse(billsFixedFlagList);
  297. return getNameValueComboCellType(billsFixedFlagData);
  298. };
  299. let getNameToValueMap = function (listString) {
  300. let map = {};
  301. let datas = JSON.parse(listString);
  302. for (let data of datas) {
  303. map[data.name] = data.value;
  304. }
  305. return map;
  306. };
  307. let getTypeFlagCellType = function () {
  308. let billsTypeFlagData = JSON.parse(billsTypeFlagList);
  309. return getNameValueComboCellType(billsTypeFlagData);
  310. };
  311. let setFee = function (data, fullField, value) {
  312. let fields = fullField.split('.'), valueField = data;
  313. for (let i in fields) {
  314. if (valueField[fields[i]]) {
  315. if (i == fields.length - 1) {
  316. valueField[fields[i]] = value;
  317. } else {
  318. valueField = valueField[fields[i]];
  319. }
  320. } else {
  321. if (i == fields.length - 1) {
  322. valueField[fields[i]] = value;
  323. } else {
  324. valueField[fields[i]] = {};
  325. };
  326. valueField = valueField[fields[i]];
  327. }
  328. }
  329. };
  330. let getRealValue = function (value, map) {//中文到实际值的转换
  331. if (value) value = value.replace(/[\s\r\n]/g, "");//去掉空格,回车等无用字符
  332. if (map[value] !== undefined && map[value] !== null) value = map[value];
  333. return value;
  334. };
  335. let setUpdateData = function (node, data, col, value, setting) {
  336. let fieldName = setting.cols[col].data.field;
  337. let valueType = setting.cols[col].data.type;
  338. if (fieldName == 'type') {
  339. value = getRealValue(value, typeMap);
  340. }
  341. if (fieldName == 'flagsIndex.fixed.flag') {
  342. value = getRealValue(value, fixedFlagMap);
  343. }
  344. if (/flagsIndex/.test(fieldName)) {
  345. data.data.flags = [];
  346. let flagField = fieldName.split('.');
  347. data.data.flags.push({ fieldName: flagField[1], flag: value });
  348. } else {
  349. if (value && valueType == 'Number') value = parseInt(value);
  350. setFee(data.data, fieldName, value);
  351. }
  352. };
  353. let setFlagsIndex = function (data, flagsIndex) {
  354. if (data.flags) {
  355. flagsIndex ? data.flagsIndex = flagsIndex : data.flagsIndex = {};
  356. for (let flag of data.flags) {
  357. data.flagsIndex[flag.fieldName] = flag;
  358. }
  359. }
  360. };
  361. billsTemplateData = billsTemplateData.replace(/\n/g, '\\n');
  362. let templateData = JSON.parse(billsTemplateData);
  363. for (let data of templateData) {
  364. setFlagsIndex(data);
  365. /* if (data.flags) {
  366. data.flagsIndex = {};
  367. for (let flag of data.flags) {
  368. data.flagsIndex[flag.fieldName] = flag;
  369. }
  370. }*/
  371. }
  372. for (col of TEMPLATE_BILLS_SETTING.cols) {
  373. if (col.data.field === 'type' && TEMPLATE_BILLS_SETTING.cols.indexOf(col) !== TEMPLATE_BILLS_SETTING.treeCol) {
  374. col.data.cellType = getTypeFlagCellType();
  375. } else if (col.data.field === 'flagsIndex.fixed.flag' && TEMPLATE_BILLS_SETTING.cols.indexOf(col) !== TEMPLATE_BILLS_SETTING.treeCol) {
  376. col.data.cellType = getFixedFlagCellType();
  377. } else if (col.data.field === 'cantDelete' && TEMPLATE_BILLS_SETTING.cols.indexOf(col) !== TEMPLATE_BILLS_SETTING.treeCol) {
  378. col.data.cellType = new GC.Spread.Sheets.CellTypes.CheckBox();
  379. }
  380. }
  381. let tree = idTree.createNew({ id: 'ID', pid: 'ParentID', nid: 'NextSiblingID', rootId: -1, autoUpdate: true });
  382. let billsSpread = TREE_SHEET_HELPER.createNewSpread($('#billsSpread')[0]);
  383. sheetCommonObj.bindEscKey(billsSpread, [{ sheet: billsSpread.getSheet(0), editStarting: null, editEnded: billsOnEditEnded }]);
  384. let controller = TREE_SHEET_CONTROLLER.createNew(tree, billsSpread.getActiveSheet(), TEMPLATE_BILLS_SETTING);
  385. let fixedFlagMap = getNameToValueMap(billsFixedFlagList);
  386. let typeMap = getNameToValueMap(billsTypeFlagList);
  387. //format code
  388. //billsSpread.getSheet(0).setFormatter(-1, 1, '@');
  389. controller.bind('refreshBaseActn', RefreshBaseActn);
  390. function onButtonClicked(sender, info) {
  391. if (info.sheet.isEditing()) {
  392. info.sheet.endEdit(true);
  393. }
  394. const fieldName = controller.setting.cols[info.col].data.field;
  395. var node = controller.tree.items[info.row];
  396. if (node && fieldName === 'cantDelete') {
  397. const isChecked = Boolean(info.sheet.getValue(info.row, info.col));
  398. const data = { type: "update", data: { ID: node.getID() } };
  399. setFee(data.data, fieldName, isChecked);
  400. console.log(isChecked);
  401. const updateData = [data];
  402. CommonAjax.post(
  403. updateUrl,
  404. updateData,
  405. function (data) {
  406. setFee(node.data, fieldName, isChecked);
  407. controller.refreshTreeNode([node], false);
  408. },
  409. function () {
  410. controller.refreshTreeNode([node], false);
  411. }
  412. );
  413. }
  414. }
  415. function billsOnEditEnded(sender, info) {
  416. var node = controller.tree.items[info.row];
  417. var fieldName = controller.setting.cols[info.col].data.field;
  418. var valueType = controller.setting.cols[info.col].data.type;
  419. let value = info.editingText;
  420. if (node) {
  421. var data = { type: 'update', data: { ID: node.getID() } };
  422. if (/flagsIndex/.test(fieldName)) {
  423. data.data.flags = [];
  424. let flagField = fieldName.split('.');
  425. data.data.flags.push({ fieldName: flagField[1], flag: info.editingText });
  426. } else {
  427. if (value && valueType == 'Number') value = parseInt(info.editingText);
  428. setFee(data.data, fieldName, value);
  429. }
  430. var updateData = [data];
  431. CommonAjax.post(updateUrl, updateData, function (data) {
  432. setFee(node.data, fieldName, value);
  433. controller.refreshTreeNode([node], false);
  434. }, function () {
  435. controller.refreshTreeNode([node], false);
  436. });
  437. } else {
  438. info.sheet.getCell(info.row, info.col).value("");
  439. }
  440. }
  441. billsSpread.bind(GC.Spread.Sheets.Events.EditEnded, billsOnEditEnded);
  442. billsSpread.bind(GC.Spread.Sheets.Events.ButtonClicked, onButtonClicked);
  443. billsSpread.bind(GC.Spread.Sheets.Events.ClipboardPasted, function (e, info) {
  444. console.log("ClipboardPasted");
  445. var node, iRow, iCol, curRow, curCol, datas = [], data, fieldName, valueType, value, updateData;
  446. for (iRow = 0; iRow < info.cellRange.rowCount; iRow++) {
  447. curRow = info.cellRange.row + iRow;
  448. node = controller.tree.items[curRow];
  449. if (node) {
  450. data = { type: 'update', data: { ID: node.getID() } };
  451. for (iCol = 0; iCol < info.cellRange.colCount; iCol++) {
  452. curCol = info.cellRange.col + iCol;
  453. value = info.sheet.getText(curRow, curCol);
  454. setUpdateData(node, data, curCol, value, controller.setting);
  455. }
  456. datas.push(data);
  457. }
  458. };
  459. CommonAjax.post(updateUrl, datas, function (data) {
  460. RefreshBillsData(data);
  461. controller.showTreeData();
  462. }, function () {
  463. controller.showTreeData();
  464. });
  465. });
  466. billsSpread.bind(GC.Spread.Sheets.Events.RangeChanged, function (e, info) {
  467. let datas = [];
  468. let changGroup = _.groupBy(info.changedCells, 'row');
  469. for (let row in changGroup) {
  470. let node = controller.tree.items[row];
  471. if (node) {
  472. let data = { type: 'update', data: { ID: node.getID() } };
  473. for (let cell of changGroup[row]) {
  474. let value = info.sheet.getText(cell.row, cell.col);
  475. if (value == "") value = null;
  476. setUpdateData(node, data, cell.col, value, controller.setting);
  477. }
  478. datas.push(data);
  479. }
  480. }
  481. CommonAjax.post(updateUrl, datas, function (data) {
  482. RefreshBillsData(data);
  483. controller.showTreeData();
  484. }, function () {
  485. controller.showTreeData();
  486. });
  487. });
  488. tree.loadDatas(templateData);
  489. controller.showTreeData();
  490. let sel = billsSpread.getActiveSheet().getSelections()[0];
  491. controller.setTreeSelected(tree.items[sel.row == -1 ? 0 : sel.row]);//初始化选中项
  492. RefreshBaseActn(tree);
  493. lockUtil.lockSpreadsAndTools([billsSpread], $(document.body), locked);
  494. $('#insert').click(function () {
  495. let me = this;
  496. $(me).addClass('disabled');
  497. var selected = controller.tree.selected, updateData;
  498. if (selected) {
  499. updateData = controller.tree.getInsertData(selected.getParentID(), selected.getNextSiblingID());
  500. } else {
  501. updateData = controller.tree.getInsertData();
  502. }
  503. if (updateData.length > 0) {
  504. CommonAjax.post(updateUrl, updateData, function (data) {
  505. controller.insert();
  506. controller.showTreeData();
  507. $(me).removeClass('disabled');
  508. });
  509. } else {
  510. alert('新增节点失败, 请重试.');
  511. $(me).removeClass('disabled');
  512. }
  513. });
  514. $('#m_insert_confirm').click(function () {
  515. let me = this;
  516. let insertCount = $("#insertCount").val();
  517. if (isNaN(insertCount) || insertCount < 1) {
  518. $("#insertError").show();
  519. return;
  520. }
  521. $(me).addClass('disabled');
  522. let selected = controller.tree.selected, updateData;
  523. if (selected) {
  524. updateData = controller.tree.getInsertDatas(insertCount, selected.getParentID(), selected.getNextSiblingID());
  525. } else {
  526. updateData = controller.tree.getInsertDatas(insertCount);
  527. }
  528. if (updateData.length > 0) {
  529. CommonAjax.post(updateUrl, updateData, function (data) {
  530. data = _.filter(data, { 'type': 'new' });
  531. console.log(data);
  532. controller.m_insert(data);
  533. controller.showTreeData();
  534. $("#insertInputDiv").modal('hide');
  535. $("#insertError").hide();
  536. $(me).removeClass('disabled');
  537. });
  538. } else {
  539. alert('新增节点失败, 请重试.');
  540. $(me).removeClass('disabled');
  541. }
  542. /* var selected = controller.tree.selected, updateData;
  543. if (selected) {
  544. updateData = controller.tree.getInsertData(selected.getParentID(), selected.getNextSiblingID());
  545. } else {
  546. updateData = controller.tree.getInsertData();
  547. }
  548. if (updateData.length > 0) {
  549. CommonAjax.post(updateUrl, updateData, function (data) {
  550. controller.insert();
  551. controller.showTreeData();
  552. $(me).removeClass('disabled');
  553. });
  554. } else {
  555. alert('新增节点失败, 请重试.');
  556. $(me).removeClass('disabled');
  557. }*/
  558. });
  559. $('#delete').click(function () {
  560. let me = this;
  561. $(me).addClass('disabled');
  562. let [deleteMap, deleteNodes] = getNodesAndMapFromSheet(controller);
  563. if (deleteNodes.length > 0) {
  564. let updateData = controller.tree.getDeleteDatas(deleteMap, deleteNodes);
  565. CommonAjax.post(updateUrl, updateData, function (data) {
  566. controller.m_delete(deleteNodes);
  567. controller.showTreeData();
  568. $(me).removeClass('disabled');
  569. });
  570. }
  571. });
  572. $('#upLevel').click(function () {
  573. let me = this;
  574. $(me).addClass('disabled');
  575. let [dMap, dNodes] = getNodesAndMapFromSheet(controller);
  576. let newNodes = [dNodes[0]];
  577. if (dNodes.length > 1) {//如果是多选,则去掉与第一个节点不同级的节点
  578. for (let i = 1; i < dNodes.length; i++) {
  579. if (dNodes[i].parent == dNodes[0].parent) newNodes.push(dNodes[i])
  580. }
  581. }
  582. let updateDatas = controller.tree.getUpLevelDatas(newNodes);
  583. if (updateDatas.length > 0) {
  584. CommonAjax.post(updateUrl, updateDatas, function (data) {
  585. controller.m_upLevel(newNodes);
  586. for (let u of updateDatas) {
  587. let node = controller.tree.findNode(u.data.ID);
  588. refreshNodeData(node, u.data);
  589. }
  590. controller.showTreeData();
  591. $(me).removeClass('disabled');
  592. });
  593. }
  594. });
  595. $('#downLevel').click(function () {
  596. let me = this;
  597. $(me).addClass('disabled');
  598. let [dMap, dNodes] = getNodesAndMapFromSheet(controller);
  599. let newNodes = [dNodes[0]];
  600. if (dNodes.length > 1) {//如果是多选,则去掉与第一个节点不同级的节点
  601. for (let i = 1; i < dNodes.length; i++) {
  602. if (dNodes[i].parent == dNodes[0].parent) newNodes.push(dNodes[i])
  603. }
  604. }
  605. let updateDatas = controller.tree.getDownLevelDatas(newNodes);
  606. if (updateDatas.length > 0) {
  607. CommonAjax.post(updateUrl, updateDatas, function (data) {
  608. controller.m_downLevel(newNodes);
  609. for (let u of updateDatas) {
  610. let node = controller.tree.findNode(u.data.ID);
  611. refreshNodeData(node, u.data);
  612. }
  613. controller.showTreeData();
  614. $(me).removeClass('disabled');
  615. });
  616. }
  617. });
  618. $('#upMove').click(function () {
  619. let me = this;
  620. $(me).addClass('disabled');
  621. var selected = controller.tree.selected, updateData;
  622. if (selected) {
  623. updateData = selected.getUpMoveData();
  624. CommonAjax.post(updateUrl, updateData, function (data) {
  625. controller.upMove();
  626. controller.showTreeData();
  627. $(me).removeClass('disabled');
  628. });
  629. }
  630. });
  631. $('#downMove').click(function () {
  632. let me = this;
  633. $(me).addClass('disabled');
  634. var selected = controller.tree.selected, updateData;
  635. if (selected) {
  636. updateData = selected.getDownMoveData();
  637. CommonAjax.post(updateUrl, updateData, function (data) {
  638. controller.downMove();
  639. controller.showTreeData();
  640. $(me).removeClass('disabled');
  641. });
  642. }
  643. });
  644. function getNodesAndMapFromSheet(controller) {//表格中选中的节点整理,只留下父节点
  645. let selection = controller.sheet.getSelections()[0], map = {}, nodes = [];
  646. for (let i = 0; i < selection.rowCount; i++) {
  647. let tem_node = controller.tree.items[selection.row + i];
  648. if (i == 0) {//第一个直接添加;
  649. map[tem_node.getID()] = tem_node;
  650. nodes.push(tem_node);
  651. } else {
  652. setNodeToMapAndArray(tem_node, map, nodes);
  653. }
  654. }
  655. return [map, nodes];
  656. }
  657. function setNodeToMapAndArray(node, map, array) {
  658. let nodeID = node.getID();
  659. if (map[nodeID] == undefined || map[nodeID] == null) {
  660. newMap(node, node.parent, map, array)
  661. }
  662. function newMap(node, parent, map, array) {
  663. let nodeID = node.getID();
  664. if (parent == null) {//说明已经是最顶层了
  665. map[nodeID] = node;
  666. array.push(node);
  667. } else {
  668. let parentID = parent.getID();
  669. if (map[parentID] == undefined || map[parentID] == null) {
  670. newMap(node, parent.parent, map, array);
  671. }
  672. }
  673. }
  674. }
  675. function refreshNodeData(node, data) {
  676. for (let key in data) {
  677. if (key == 'ID') continue;
  678. node.data[key] = data[key];
  679. }
  680. }
  681. });