bills_template_edit.js 21 KB

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