zlfb_view.js 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455
  1. /**
  2. * Created by zhang on 2018/1/22.
  3. */
  4. let zlfb_object={
  5. sectionInfo:null,
  6. getSectionInfo:function () {
  7. let controller = projectObj.mainController, project = projectObj.project;
  8. let Bill = project.Bills;
  9. let FBFX = Bill.getFBFXNode(controller);//取分部分项工程节点;
  10. let all_sub_nodes=[],FB_nodes =[],FX_nodes =[], query={};
  11. let codeMap = {};
  12. let reorganize = false;
  13. controller.tree.getAllSubNode(FBFX,all_sub_nodes);//取分部分项工程节点下的所有节点,不包括定额和工料机节点;
  14. for(let tem_node of all_sub_nodes){
  15. if(tem_node.sourceType==Bill.getSourceType()){
  16. if(tem_node.data.type == billType.FB){
  17. FB_nodes.push(tem_node);
  18. }
  19. if(tem_node.data.type == billType.FX||tem_node.data.type == billType.BX){
  20. FX_nodes.push(tem_node);
  21. let l_code = zlfb_object.getLibCode(tem_node.data.code);
  22. if(tem_node.data.billsLibId&&l_code!=false){
  23. reorganize = true;
  24. if(codeMap[l_code]){
  25. codeMap[l_code].push(tem_node);
  26. }else {
  27. codeMap[l_code]=[tem_node];
  28. }
  29. if(query[tem_node.data.billsLibId]){
  30. query[tem_node.data.billsLibId][l_code]=true;
  31. }else {
  32. query[tem_node.data.billsLibId]={};
  33. query[tem_node.data.billsLibId][l_code]=true;
  34. }
  35. }
  36. }
  37. }
  38. }
  39. if(reorganize==true){
  40. zlfb_object.sectionInfo = {
  41. 'codeMap':codeMap,
  42. 'FB_nodes':FB_nodes,
  43. 'FX_nodes':FX_nodes
  44. }
  45. CommonAjax.post('/bills/getSectionInfo',query,function (data) {
  46. if(data){
  47. zlfb_object.sectionInfo.fxMap = data.fxMap;
  48. zlfb_object.sectionInfo.sectionMap = data.sectionMap;
  49. }
  50. $("#zlfb").modal({show:true});
  51. });
  52. }else {
  53. $("#zlfb").modal({show:true});
  54. }
  55. },
  56. getLibCode:function (billCode) {//根据清单编号得到清单库中的编号
  57. if(billCode&&billCode.length>=9){
  58. return billCode.substr(0,9);
  59. }else {
  60. return false;
  61. }
  62. },
  63. reorganizeNodes:function () {
  64. let me = this;
  65. let controller = projectObj.mainController, project = projectObj.project;
  66. let Bill = project.Bills;
  67. let FBFX = Bill.getFBFXNode(controller);//取分部分项工程节点;
  68. let resort = true,recode=false,first=$('#bill_first').prop('checked');//清单排序和重新编码放到另外的页面
  69. let second =$('#bill_second').prop('checked'), third =$('#bill_third').prop('checked');
  70. let needSelf = first==true||second==true||third==true;//需要补充分部节点;
  71. if(me.sectionInfo){
  72. let FX_nodes =me.sectionInfo.FX_nodes,fxMap = me.sectionInfo.fxMap,FB_nodes =me.sectionInfo.FB_nodes;
  73. let codeMap = {},sectionNodeMap={},allNewNode=[],updateData={},newDataMap={};
  74. let first_FX_ID = -1;
  75. if(FB_nodes.length>0){
  76. updateData.delete = me.getDeleteData(FB_nodes);
  77. }
  78. Bill.deleteAllSubNodes();//在造价书树结构上先删除所有节点
  79. if(resort){
  80. FX_nodes = _.sortBy(FX_nodes,'data.code');
  81. }
  82. for(let tem_node of FX_nodes){
  83. let isStd = true;//是标准工料机
  84. let l_code = me.getLibCode(tem_node.data.code);
  85. let parentNode = FBFX;
  86. let newCode = tem_node.data.code;
  87. if(l_code!=false&&fxMap[l_code]){//能找到说明是标准工料机
  88. let tem_sectionInfo = fxMap[l_code].sectionInfo;
  89. if(first&&tem_sectionInfo['first']){//需要专业分部标题
  90. parentNode= me.createSectionNode(sectionNodeMap,tem_sectionInfo['first'],parentNode,allNewNode,newDataMap,true);
  91. }
  92. if(second&&tem_sectionInfo['second']){//需要章分部标题
  93. let isRoot = first==true?false:true;
  94. parentNode= me.createSectionNode(sectionNodeMap,tem_sectionInfo['second'],parentNode,allNewNode,newDataMap,isRoot);
  95. }
  96. if(third&&tem_sectionInfo['third']){//需要章分部标题
  97. let isRoot = first==true||second==true?false:true;
  98. parentNode= me.createSectionNode(sectionNodeMap,tem_sectionInfo['third'],parentNode,allNewNode,newDataMap,isRoot);
  99. }
  100. if(recode==true){//需要重新编号
  101. if(codeMap[l_code]){
  102. codeMap[l_code]+=1;
  103. }else {
  104. codeMap[l_code]=1;
  105. }
  106. newCode = l_code+me.getEndCode(codeMap[l_code],3);
  107. }
  108. }else {//自定义分项
  109. if(needSelf==true){
  110. parentNode= me.createSectionNode(sectionNodeMap,"customer",parentNode,allNewNode,newDataMap,true);
  111. }
  112. isStd = false;
  113. }
  114. let nextID=-1;
  115. if(needSelf==false){//如果章节信息三项都不勾选的情况下,要插在自定义分项前
  116. if(isStd==false&&first_FX_ID==-1){//如果是自定义分项,并且是第一个,要记住ID
  117. first_FX_ID = tem_node.getID();
  118. }
  119. if(isStd==true){//如果是标准的分部,则要插入到第一个自定义分部前面
  120. nextID = first_FX_ID;
  121. }
  122. }
  123. let newFXNode = controller.tree.insert(parentNode.getID(), nextID,tem_node.getID());
  124. let newSource = Bill.tree.insertByData(tem_node.data,parentNode.getID(), nextID, true);
  125. newFXNode.source = newSource;
  126. newFXNode.sourceType = project.Bills.getSourceType();
  127. newFXNode.data = newSource.data;
  128. allNewNode.push(newFXNode);
  129. newFXNode.data.code = newCode;
  130. newFXNode.data.ParentID = parentNode.getID();
  131. newFXNode.data.NextSiblingID=nextID;
  132. newDataMap[newFXNode.getID()]={
  133. code:newCode,
  134. ParentID:parentNode.getID(),
  135. NextSiblingID:nextID
  136. }
  137. if(newFXNode.preSibling){
  138. newFXNode.preSibling.data.NextSiblingID = newFXNode.getID();
  139. newDataMap[newFXNode.preSibling.getID()].NextSiblingID=newFXNode.getID();
  140. }
  141. //生成定额或工料机节点
  142. if(tem_node.children.length>0){
  143. me.addSubNode(newFXNode,tem_node.children,allNewNode,controller)
  144. }
  145. };
  146. me.submitRequest(newDataMap,allNewNode,updateData,FBFX,controller);
  147. }
  148. },
  149. ZLQD:async function(){//只清单排序或者重新编码
  150. //
  151. let me = this;
  152. let selected = projectObj.project.mainTree.selected;
  153. let resort = $('#bill_resort').prop('checked'),recode=$('#bill_recode').prop('checked')
  154. let startNum = parseInt($('#bill_recode_start').val());
  155. let FBNodes = [],updateMap = {},codeMap={};
  156. let recoverMap = {};//排序失败后用来恢复原状的缓存
  157. let tree = projectObj.mainController.tree;
  158. if(resort||recode){
  159. //先找出需要排序和重新编码的节点
  160. for(let node of tree.items){
  161. if(node.sourceType===ModuleNames.bills){
  162. if(node.data.type == billType.FB && node.children.length > 1){//有两个以上的才需要排序
  163. let subType = node.children[0].data.type;
  164. if(subType === billType.FX || subType === billType.BX){
  165. FBNodes.push(node);
  166. recoverMap[node.data.ID] = node.children;
  167. }
  168. }
  169. }
  170. }
  171. try {
  172. if(resort){//如果需要重新排序 -- 重新排序还必须得先改变缓存,如果勾选了重新编码,顺序依赖于排好序的清单
  173. for(let FB of FBNodes){
  174. me.resortChildren(FB,updateMap)
  175. }
  176. tree.sortTreeItems(tree);
  177. }
  178. if(recode){
  179. if(!(startNum >= 1)){
  180. return alert("起始编码必须大于1!")
  181. }
  182. for(let node of tree.items){
  183. if(node.data.billsLibId){
  184. let l_code = me.getLibCode(node.data.code);
  185. if(l_code !== false){
  186. if(codeMap[l_code]){
  187. codeMap[l_code]+=1;
  188. }else {
  189. codeMap[l_code]=startNum;
  190. }
  191. newCode = l_code+me.getEndCode(codeMap[l_code],3);
  192. if(updateMap[node.data.ID]){
  193. updateMap[node.data.ID].data.code = newCode;
  194. }else{
  195. updateMap[node.data.ID] = {
  196. type:'bills',
  197. data:{
  198. projectID:node.data.projectID,
  199. ID:node.data.ID,
  200. code :newCode
  201. }
  202. };
  203. }
  204. }
  205. }
  206. }
  207. }
  208. let datas = [];
  209. for(let ID in updateMap){
  210. datas.push(updateMap[ID]);
  211. }
  212. if(datas.length > 0) await projectObj.project.syncUpdateNodesAndRefresh(datas);
  213. projectObj.mainController.refreshTreeNode(FBNodes,true);
  214. this.refreshVisable(FBNodes);
  215. let sel = projectObj.mainController.sheet.getSelections()[0];
  216. sel.row = selected.serialNo();
  217. projectObj.mainController.sheet.setSelection(sel.row,sel.col,sel.rowCount,sel.colCount);
  218. projectObj.mainController.setTreeSelected(selected);
  219. } catch (error) {
  220. alert('清单排序/重新编码失败,请重试!');
  221. console.log(error);
  222. //恢复排序
  223. for(let FB of FBNodes){
  224. me.resortChildren(FB,{},recoverMap[FB.data.ID]);
  225. }
  226. tree.sortTreeItems(tree);
  227. this.refreshVisable(FBNodes);
  228. }
  229. }
  230. },
  231. refreshVisable:function (FBNodes) {
  232. let sheet = projectObj.mainController.sheet;
  233. let tree = projectObj.mainController.tree;
  234. sheet.suspendPaint();
  235. sheet.suspendEvent();
  236. for(let pnode of FBNodes){
  237. TREE_SHEET_HELPER.refreshChildrenVisiable(sheet,tree,pnode,pnode.serialNo());
  238. for(let node of pnode.children){
  239. TREE_SHEET_HELPER.refreshChildrenVisiable(sheet,tree,node,node.serialNo());
  240. }
  241. }
  242. sheet.resumeEvent();
  243. sheet.resumePaint();
  244. },
  245. resortChildren:function(node,updateMap,recoverChildren){
  246. if(recoverChildren){
  247. node.children = recoverChildren;
  248. }else{
  249. node.children = _.sortBy(node.children,'data.code');
  250. }
  251. for(let i=0;i<node.children.length;i++){
  252. let subNode = node.children[i];
  253. let tem = {
  254. type:'bills',
  255. data:{
  256. projectID:subNode.data.projectID,
  257. ID:subNode.data.ID,
  258. }
  259. };
  260. if(i===0){
  261. subNode.preSibling == 0;
  262. }else{
  263. subNode.preSibling = node.children[i-1];
  264. }
  265. if(i == node.children.length-1){//如果是最后一个节点
  266. tem.data.NextSiblingID=-1;
  267. subNode.nextSibling = null
  268. }else{
  269. tem.data.NextSiblingID= node.children[i+1].data.ID;
  270. subNode.nextSibling = node.children[i+1];
  271. }
  272. updateMap[subNode.data.ID] = tem
  273. }
  274. },
  275. addSubNode:function (parentNode,oldChildren,allNewNode,controller) {
  276. for(let c of oldChildren){
  277. let newChild = controller.tree.insert(parentNode.getID(), -1,c.getID());
  278. newChild.source = c.data;
  279. newChild.sourceType = c.sourceType;
  280. newChild.data = c.data;
  281. allNewNode.push(newChild);
  282. if(c.children.length>0){
  283. zlfb_object.addSubNode(newChild,c.children,allNewNode,controller);
  284. }
  285. }
  286. },
  287. getDeleteData:function (FB_nodes) {
  288. let fbIDs=[];
  289. for(let fb of FB_nodes){
  290. fbIDs.push(fb.getID());
  291. }
  292. return fbIDs;
  293. },
  294. createSectionNode:function (sectionNodeMap,ID,parentNode,allNewNode,newDataMap,isRoot) {
  295. let sectionMap = zlfb_object.sectionInfo.sectionMap;
  296. let controller = projectObj.mainController;
  297. if(sectionNodeMap[ID]){//如果这个节点已经存在
  298. parentNode = sectionNodeMap[ID];
  299. }else {//不存在就生成一个
  300. let nodeID = uuid.v1();
  301. let nextID=-1;
  302. if(isRoot==true&&ID!='customer'&&sectionNodeMap['customer']){//如果自定义分部存在,插入到自定文分部前面
  303. nextID=sectionNodeMap['customer'].getID();
  304. }
  305. let newNode = controller.tree.insert(parentNode.getID(), nextID,nodeID);
  306. let data ={
  307. ID:nodeID,
  308. projectID:parseInt(projectObj.project.ID()),
  309. ParentID:parentNode.getID(),
  310. NextSiblingID:nextID,
  311. type:billType.FB
  312. };
  313. if(newNode.preSibling){
  314. newDataMap[newNode.preSibling.getID()].NextSiblingID=newNode.getID();
  315. newNode.preSibling.data.NextSiblingID=newNode.getID();
  316. }
  317. if(ID=='customer'){
  318. data.name = '补充分部';
  319. }else {
  320. if(sectionMap[ID]==undefined){
  321. console.log(ID);
  322. }
  323. data.code = sectionMap[ID].code;
  324. data.name = sectionMap[ID].name;
  325. }
  326. let newSource = projectObj.project.Bills.tree.insertByData(data,parentNode.getID(), nextID, true);
  327. newNode.source = newSource;
  328. newNode.sourceType = projectObj.project.Bills.getSourceType();
  329. newNode.data = newSource.data;
  330. sectionNodeMap[ID]=newNode;
  331. parentNode = newNode;
  332. allNewNode.push(newNode);
  333. newDataMap[nodeID]=data;
  334. }
  335. return parentNode;
  336. },
  337. getEndCode:function (number,length) {
  338. let preString = '000000000000';
  339. preString = preString+number;
  340. return preString.substr(preString.length-length,length);
  341. },
  342. submitRequest:function(newDataMap,allNewNode,updateData,FBFX,controller){
  343. for(let ID in newDataMap){ //生成更新数据
  344. if(newDataMap[ID].type==billType.FB){//分部类型是插入
  345. if(updateData['create']){
  346. updateData['create'].push(newDataMap[ID]);
  347. }else {
  348. updateData['create']=[newDataMap[ID]];
  349. }
  350. }else {
  351. if(updateData['update']){
  352. let u_data = {
  353. ID:ID,
  354. data:newDataMap[ID]
  355. };
  356. updateData['update'].push(u_data);
  357. }else {
  358. let u_data = {
  359. ID:ID,
  360. data:newDataMap[ID]
  361. };
  362. updateData['update'] = [u_data];
  363. }
  364. }
  365. }
  366. updateData.projectID = FBFX.data.projectID;
  367. updateData.user_id = userID;
  368. $.bootstrapLoading.start();
  369. CommonAjax.post('/bills/reorganizeFBFX',updateData,async function (data) {
  370. $.bootstrapLoading.end();
  371. //更新前端缓存
  372. let billDatas = projectObj.project.Bills.datas;
  373. let quantity_detail_datas = projectObj.project.quantity_detail.datas;
  374. let mainTree = projectObj.mainController.tree;
  375. if(updateData.delete && updateData.delete.length > 0){//删除
  376. for( let d_ID of updateData.delete){
  377. _.remove(billDatas,{'ID':d_ID});
  378. _.remove(quantity_detail_datas,{'billID':d_ID});
  379. }
  380. }
  381. if(updateData.update && updateData.update.length > 0){//更新数据
  382. for(let u_data of updateData.update){
  383. let m_node = mainTree.findNode(u_data.ID);
  384. if(m_node){
  385. let m_data = m_node.data;
  386. for(let u_key in u_data.data){
  387. m_data[u_key] = u_data.data[u_key];
  388. }
  389. }
  390. }
  391. }
  392. if(updateData.create && updateData.create.length > 0){
  393. for(let n_data of updateData.create){
  394. billDatas.push(n_data);
  395. }
  396. }
  397. controller.sheet.addRows(1, allNewNode.length);
  398. for(let c of FBFX.children){
  399. TREE_SHEET_HELPER.massOperationSheet(controller.sheet, function () {
  400. TREE_SHEET_HELPER.refreshTreeNodeData(controller.setting, controller.sheet, [c], true);
  401. controller.sheet.showRow(1, GC.Spread.Sheets.VerticalPosition.center);
  402. });
  403. }
  404. mainTree.preSelected = null;
  405. let selected = mainTree.findNode(mainTree.selected.getID());
  406. if(!selected){
  407. selected = controller.tree.items[0];
  408. }
  409. let sel = controller.sheet.getSelections()[0];
  410. sel.row = selected.serialNo();
  411. controller.sheet.setSelection(sel.row,sel.col,sel.rowCount,sel.colCount);
  412. controller.setTreeSelected(selected);
  413. cbTools.refreshFormulaNodes();
  414. projectObj.project.installation_fee.calcInstallationFee(function () {
  415. //重新计算
  416. projectObj.project.Bills.getEngineeringCostNode(controller).changed = true;
  417. projectObj.project.calcProgram.calcAllNodesAndSave();
  418. });
  419. await OVER_HEIGHT.reCalcOverHeightFee();
  420. },function () {
  421. //errorCallback
  422. });
  423. }
  424. }
  425. $(function () {
  426. $('#zlfb_confirm').click(function (){
  427. $("#zlfb").modal('hide');
  428. zlfb_object.reorganizeNodes();
  429. });
  430. $('#zlfb').on('hidden.bs.modal', function (e) {
  431. zlfb_object.sectionInfo=null;
  432. })
  433. $('#ZLQD_btn').click(function () {
  434. $("#zlqd").modal('show');
  435. });
  436. $('#zlqd_confirm').click(function (){
  437. $("#zlqd").modal('hide');
  438. zlfb_object.ZLQD();
  439. });
  440. });