bills_template_edit.js 25 KB

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