zlfb_view.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300
  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){
  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 = $('#bill_resort').prop('checked'),recode=$('#bill_recode').prop('checked'),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. $.bootstrapLoading.start();
  72. if(me.sectionInfo){
  73. let FX_nodes =me.sectionInfo.FX_nodes,fxMap = me.sectionInfo.fxMap,FB_nodes =me.sectionInfo.FB_nodes;
  74. let codeMap = {},sectionNodeMap={},allNewNode=[],updateData={},newDataMap={};
  75. let first_FX_ID = -1;
  76. if(FB_nodes.length>0){
  77. updateData.delete = me.getDeleteData(FB_nodes);
  78. }
  79. Bill.deleteAllSubNodes();//在造价书树结构上先删除所有节点
  80. if(resort){
  81. FX_nodes = _.sortBy(FX_nodes,'data.code');
  82. }
  83. for(let tem_node of FX_nodes){
  84. let isStd = true;//是标准工料机
  85. let l_code = me.getLibCode(tem_node.data.code);
  86. let parentNode = FBFX;
  87. let newCode = tem_node.data.code;
  88. if(l_code!=false&&fxMap[l_code]){//能找到说明是标准工料机
  89. let tem_sectionInfo = fxMap[l_code].sectionInfo;
  90. if(first&&tem_sectionInfo['first']){//需要专业分部标题
  91. parentNode= me.createSectionNode(sectionNodeMap,tem_sectionInfo['first'],parentNode,allNewNode,newDataMap,true);
  92. }
  93. if(second&&tem_sectionInfo['second']){//需要章分部标题
  94. let isRoot = first==true?false:true;
  95. parentNode= me.createSectionNode(sectionNodeMap,tem_sectionInfo['second'],parentNode,allNewNode,newDataMap,isRoot);
  96. }
  97. if(third&&tem_sectionInfo['third']){//需要章分部标题
  98. let isRoot = first==true||second==true?false:true;
  99. parentNode= me.createSectionNode(sectionNodeMap,tem_sectionInfo['third'],parentNode,allNewNode,newDataMap,isRoot);
  100. }
  101. if(recode==true){//需要重新编号
  102. if(codeMap[l_code]){
  103. codeMap[l_code]+=1;
  104. }else {
  105. codeMap[l_code]=1;
  106. }
  107. newCode = l_code+me.getEndCode(codeMap[l_code],3);
  108. }
  109. }else {//自定义分项
  110. if(needSelf==true){
  111. parentNode= me.createSectionNode(sectionNodeMap,"customer",parentNode,allNewNode,newDataMap,true);
  112. }
  113. isStd = false;
  114. }
  115. let nextID=-1;
  116. if(needSelf==false){//如果章节信息三项都不勾选的情况下,要插在自定义分项前
  117. if(isStd==false&&first_FX_ID==-1){//如果是自定义分项,并且是第一个,要记住ID
  118. first_FX_ID = tem_node.getID();
  119. }
  120. if(isStd==true){//如果是标准的分部,则要插入到第一个自定义分部前面
  121. nextID = first_FX_ID;
  122. }
  123. }
  124. let newFXNode = controller.tree.insert(parentNode.getID(), nextID,tem_node.getID());
  125. let newSource = Bill.tree.insertByData(tem_node.data,parentNode.getID(), nextID, true);
  126. newFXNode.source = newSource;
  127. newFXNode.sourceType = project.Bills.getSourceType();
  128. newFXNode.data = newSource.data;
  129. allNewNode.push(newFXNode);
  130. newFXNode.data.code = newCode;
  131. newFXNode.data.ParentID = parentNode.getID();
  132. newFXNode.data.NextSiblingID=nextID;
  133. newDataMap[newFXNode.getID()]={
  134. code:newCode,
  135. ParentID:parentNode.getID(),
  136. NextSiblingID:nextID
  137. }
  138. if(newFXNode.preSibling){
  139. newFXNode.preSibling.data.NextSiblingID = newFXNode.getID();
  140. newDataMap[newFXNode.preSibling.getID()].NextSiblingID=newFXNode.getID();
  141. }
  142. //生成定额或工料机节点
  143. if(tem_node.children.length>0){
  144. me.addSubNode(newFXNode,tem_node.children,allNewNode,controller)
  145. }
  146. };
  147. me.submitRequest(newDataMap,allNewNode,updateData,FBFX,controller);
  148. }else {
  149. $.bootstrapLoading.end();
  150. }
  151. },
  152. addSubNode:function (parentNode,oldChildren,allNewNode,controller) {
  153. for(let c of oldChildren){
  154. let newChild = controller.tree.insert(parentNode.getID(), -1,c.getID());
  155. newChild.source = c.data;
  156. newChild.sourceType = c.sourceType;
  157. newChild.data = c.data;
  158. allNewNode.push(newChild);
  159. if(c.children.length>0){
  160. zlfb_object.addSubNode(newChild,c.children,allNewNode,controller);
  161. }
  162. }
  163. },
  164. getDeleteData:function (FB_nodes) {
  165. let fbIDs=[];
  166. for(let fb of FB_nodes){
  167. fbIDs.push(fb.getID());
  168. }
  169. return fbIDs;
  170. },
  171. createSectionNode:function (sectionNodeMap,ID,parentNode,allNewNode,newDataMap,isRoot) {
  172. let sectionMap = zlfb_object.sectionInfo.sectionMap;
  173. let controller = projectObj.mainController;
  174. if(sectionNodeMap[ID]){//如果这个节点已经存在
  175. parentNode = sectionNodeMap[ID];
  176. }else {//不存在就生成一个
  177. let nodeID = uuid.v1();
  178. let nextID=-1;
  179. if(isRoot==true&&ID!='customer'&&sectionNodeMap['customer']){//如果自定义分部存在,插入到自定文分部前面
  180. nextID=sectionNodeMap['customer'].getID();
  181. }
  182. let newNode = controller.tree.insert(parentNode.getID(), nextID,nodeID);
  183. let data ={
  184. ID:nodeID,
  185. projectID:parseInt(projectObj.project.ID()),
  186. ParentID:parentNode.getID(),
  187. NextSiblingID:nextID,
  188. type:billType.FB
  189. };
  190. if(newNode.preSibling){
  191. newDataMap[newNode.preSibling.getID()].NextSiblingID=newNode.getID();
  192. newNode.preSibling.data.NextSiblingID=newNode.getID();
  193. }
  194. if(ID=='customer'){
  195. data.name = '补充分部';
  196. }else {
  197. if(sectionMap[ID]==undefined){
  198. console.log(ID);
  199. }
  200. data.code = sectionMap[ID].code;
  201. data.name = sectionMap[ID].name;
  202. }
  203. let newSource = projectObj.project.Bills.tree.insertByData(data,parentNode.getID(), nextID, true);
  204. newNode.source = newSource;
  205. newNode.sourceType = projectObj.project.Bills.getSourceType();
  206. newNode.data = newSource.data;
  207. sectionNodeMap[ID]=newNode;
  208. parentNode = newNode;
  209. allNewNode.push(newNode);
  210. newDataMap[nodeID]=data;
  211. }
  212. return parentNode;
  213. },
  214. getEndCode:function (number,length) {
  215. let preString = '000000000000';
  216. preString = preString+number;
  217. return preString.substr(preString.length-length,length);
  218. },
  219. submitRequest:function(newDataMap,allNewNode,updateData,FBFX,controller){
  220. for(let ID in newDataMap){ //生成更新数据
  221. if(newDataMap[ID].type==billType.FB){//分部类型是插入
  222. if(updateData['create']){
  223. updateData['create'].push(newDataMap[ID]);
  224. }else {
  225. updateData['create']=[newDataMap[ID]];
  226. }
  227. }else {
  228. if(updateData['update']){
  229. let u_data = {
  230. ID:ID,
  231. data:newDataMap[ID]
  232. };
  233. updateData['update'].push(u_data);
  234. }else {
  235. let u_data = {
  236. ID:ID,
  237. data:newDataMap[ID]
  238. };
  239. updateData['update'] = [u_data];
  240. }
  241. }
  242. }
  243. updateData.projectID = FBFX.data.projectID;
  244. updateData.user_id = userID;
  245. CommonAjax.post('/bills/reorganizeFBFX',updateData,function (data) {
  246. //更新前端缓存
  247. let billDatas = projectObj.project.Bills.datas;
  248. let quantity_detail_datas = projectObj.project.quantity_detail.datas;
  249. let mainTree = projectObj.mainController.tree;
  250. if(updateData.delete && updateData.delete.length > 0){//删除
  251. for( let d_ID of updateData.delete){
  252. _.remove(billDatas,{'ID':d_ID});
  253. _.remove(quantity_detail_datas,{'billID':d_ID});
  254. }
  255. }
  256. if(updateData.update && updateData.update.length > 0){//更新数据
  257. for(let u_data of updateData.update){
  258. let m_node = mainTree.findNode(u_data.ID);
  259. if(m_node){
  260. let m_data = m_node.data;
  261. for(let u_key in u_data.data){
  262. m_data[u_key] = u_data.data[u_key];
  263. }
  264. }
  265. }
  266. }
  267. if(updateData.create && updateData.create.length > 0){
  268. for(let n_data of updateData.create){
  269. billDatas.push(n_data);
  270. }
  271. }
  272. controller.sheet.addRows(1, allNewNode.length);
  273. for(let c of FBFX.children){
  274. TREE_SHEET_HELPER.massOperationSheet(controller.sheet, function () {
  275. TREE_SHEET_HELPER.refreshTreeNodeData(controller.setting, controller.sheet, [c], true);
  276. controller.sheet.showRow(1, GC.Spread.Sheets.VerticalPosition.center);
  277. });
  278. }
  279. cbTools.refreshFormulaNodes();
  280. //重新计算
  281. projectObj.project.Bills.getEngineeringCostNode(controller).changed = true;
  282. projectObj.project.calcProgram.calcAllNodesAndSave();
  283. },function () {
  284. //errorCallback
  285. });
  286. }
  287. }
  288. $(function () {
  289. $('#zlfb_confirm').click(function (){
  290. $("#zlfb").modal('hide');
  291. zlfb_object.reorganizeNodes();
  292. });
  293. $('#zlfb').on('hidden.bs.modal', function (e) {
  294. zlfb_object.sectionInfo=null;
  295. })
  296. });