mbzm_view.js 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606
  1. /**
  2. * Created by zhang on 2018/11/26.
  3. */
  4. let mbzm_obj={
  5. spread:null,
  6. nodeChanged:false,
  7. datas:[],
  8. locateMap:{
  9. INMEASURE:1,
  10. INFBFX:2,
  11. AFTERRATION:3
  12. },
  13. setting:{
  14. header: [
  15. {headerName: "编码", headerWidth: 130, dataCode: "code", dataType: "String", formatter: "@"},
  16. {headerName: "模板类别", headerWidth: 260, dataCode: "name", dataType: "String", hAlign: "left"},
  17. {headerName: "单位", headerWidth: 45, dataCode: "unit", dataType: "String", hAlign: "center",getText:'forUnit'},
  18. {headerName: "系数", headerWidth: 65, dataCode: "coe", dataType: "Number",validator:"number"},
  19. {headerName: "工程量", headerWidth: 65, dataCode: "quantity", dataType: "Number",validator:"number",getText:'forQuantity'},//这里做成当系数不为0时,动态生成工程量,同步更新太麻烦
  20. {headerName: "关联类别", headerWidth: 100, dataCode: "type", dataType: "String"},
  21. {headerName: "清单位置", headerWidth: 200, dataCode: "position", hAlign: "left", dataType: "String",cellType:'selectButton',getText:'forPosition'},
  22. ],
  23. view: {
  24. lockColumns:["code","name","unit","type"],
  25. rowHeaderWidth:25
  26. },
  27. getText:{
  28. forPosition:function (item) {
  29. let createL = $('#createLocation').val();
  30. if(createL == mbzm_obj.locateMap.INMEASURE) return mbzm_obj.getDisplayText(item.billID,item.billsLocation);
  31. if(createL == mbzm_obj.locateMap.INFBFX) return mbzm_obj.getDisplayText(item.fxID,"");
  32. return ""
  33. },
  34. forUnit:function (item) {//这里显示的单位是去掉定额单位前面的数字的结果
  35. return item.unit &&_.isString(item.unit)?item.unit.replace(/^\d+/,""):""
  36. },
  37. forQuantity:function (item) {
  38. return mbzm_obj.getQuantity(item);
  39. }
  40. }
  41. },
  42. getDisplayText:function (billID,position) {
  43. if(billID && billID!=''){
  44. let node = projectObj.project.mainTree.getNodeByID(billID);
  45. if(node){
  46. let code = node.data.code?node.data.code:"";
  47. let name = node.data.name?node.data.name:"";
  48. return code +" "+name;
  49. }
  50. }
  51. return position;
  52. },
  53. //当点击应用的时候才保存数据
  54. initSpread:function () {
  55. this.spread = SheetDataHelper.createNewSpread($("#mbzmSpread")[0]);
  56. sheetCommonObj.spreadDefaultStyle(this.spread);
  57. this.sheet = this.spread.getSheet(0);
  58. sheetCommonObj.initSheet(this.sheet, this.setting);
  59. this.sheet.bind(GC.Spread.Sheets.Events.ValueChanged, this.onSheetValueChange);
  60. this.spread.bind(GC.Spread.Sheets.Events.ButtonClicked, installationFeeObj.onPositionButtonClick);//共用一个位置选择器
  61. this.sheet.name('ration_template');
  62. if(projectReadOnly){
  63. disableSpread(this.spread);
  64. }
  65. },
  66. refresh:function () {
  67. let total = $('#mbzmSpread').parent().height();
  68. let b_height = $('#mbzmSpread').prev('.col-12').height();
  69. $('#mbzmSpread').css('height',total- b_height);
  70. this.spread?this.spread.refresh():this.initSpread();
  71. },
  72. refreshSheetData:function () {
  73. if($('#mbzmSpread').is(':visible')) sheetCommonObj.showData(this.sheet, this.setting,this.datas);
  74. },
  75. showMBZMData:function(node){
  76. let selected = node?node:projectObj.project.mainTree.selected;
  77. if(this.nodeChanged == true){//选中的行改变了才做初始化,刷新当前缓存, 在project_view 中treeSelectedChanged方法里设置
  78. let datas = [];
  79. $("#createLocation").val(this.locateMap.INMEASURE);//初始化
  80. if(selected&&selected.sourceType == ModuleNames.ration){
  81. let ration = selected.data;
  82. let template = projectObj.project.ration_template.getTemplateByRationID(ration.ID);
  83. if(template) {
  84. $("#createLocation").val(template.createLocation);
  85. let pcol = _.findIndex(this.setting.header,{dataCode:"position"});
  86. this.setting.header[pcol].visible = template.createLocation == this.locateMap.AFTERRATION?false:true;
  87. datas = _.cloneDeep(template.templateList);
  88. }
  89. }
  90. this.datas = datas;
  91. this.nodeChanged = false;//这里要恢复成false 应为调用gljObj.refresh() 方法也会进到这里来,这时节点应是没有改变的
  92. }
  93. sheetCommonObj.showData(this.sheet, this.setting,this.datas);
  94. this.sheet.setRowCount(this.datas.length);
  95. },
  96. onSheetValueChange:function (e,info) {
  97. let me = mbzm_obj;
  98. let selected = projectObj.project.mainTree.selected;
  99. let row = info.row, col = info.col;
  100. let dataCode = me.setting.header[col].dataCode;
  101. let recode = me.datas[row], value = info.newValue;
  102. if (info.newValue === undefined) {
  103. return;
  104. }
  105. if (value && !sheetCommonObj.checkData(col, me.setting, value)) {
  106. alert('输入的数据类型不对,请重新输入!');
  107. me.refreshSheetData();
  108. return;
  109. }
  110. if (dataCode === 'coe') {// //为了避免各种同步更新,后面的工程量改成实时动态计算,所以这里更新为0
  111. recode["quantity"] = "0";
  112. }
  113. if (dataCode === 'quantity') {//定额默认显示为0,可输入数值,输入数值后,则清空前面的系数列
  114. value = scMathUtil.roundForObj(value, getDecimal('ration.quantity'))+"";
  115. recode["coe"] = "0";
  116. }
  117. recode[dataCode] = value;
  118. me.refreshSheetData();
  119. },
  120. getQuantity:function(item){//当系数不为0的时候实时获取消耗量
  121. if(item.coe && item.coe!="0"){
  122. let selected = projectObj.project.mainTree.selected;
  123. let rationQuantity = selected.data.quantity;
  124. rationQuantity = rationQuantity?scMathUtil.roundForObj(rationQuantity, getDecimal('ration.quantity')):0;
  125. let times = parseInt(selected.data.unit);
  126. times = isNaN(times)?1:times;//工程量要乘以定额单位的倍数
  127. let value = scMathUtil.roundForObj(item.coe, getDecimal('process'));
  128. //为了避免各种同步更新这里改成实时动态计算带系数的工程量
  129. return scMathUtil.roundForObj(rationQuantity * value*times, getDecimal('ration.quantity'))+"";
  130. }else {
  131. return item.quantity;
  132. }
  133. },
  134. updatePosition:function (recode) {
  135. let selection = this.sheet.getSelections()[0];
  136. let selectedItem =this.datas[selection.row];
  137. let updateField = $("#createLocation").val()==this.locateMap.INMEASURE?"billID":"fxID";
  138. if(selectedItem[updateField] == recode.ID) return;
  139. selectedItem[updateField] = recode.ID;
  140. if($("#createLocation").val()==this.locateMap.INMEASURE)selectedItem.billsLocation = recode.code;
  141. this.refreshSheetData();
  142. },
  143. applyTemplate:function () {//应用清单模板
  144. let selected = projectObj.project.mainTree.selected;
  145. let template = projectObj.project.ration_template.getTemplateByRationID(selected.data.ID);
  146. let createLocation = $("#createLocation").val();
  147. let rations = {update:[],create:[],delete:[]},bills={update:[],create:[]};
  148. if(this.datas.length <= 0) return;
  149. let quantityValide = false;
  150. for(let data of this.datas){
  151. let quantity = this.getQuantity(data);//取实时或手输工程量
  152. if(quantity&&quantity!='0') quantityValide = true;
  153. }
  154. if(quantityValide == false)return alert('请输入工程量');
  155. for(let d of this.datas){
  156. let ration = _.find(projectObj.project.Ration.datas,{'referenceRationID':selected.data.ID,'code':d.code});
  157. if(ration||(gljUtil.isDef(d.quantity)&& parseFloat(d.quantity)>0)||(d.coe && d.coe!="0")){
  158. if(this.positionChecking(createLocation,d) == false){//清单位置检查
  159. alert(`请选择${d.code}生成的清单位置`);
  160. return;
  161. }
  162. this.getNodeUpdateData(d,selected.data.ID,createLocation,rations,bills);
  163. }
  164. }
  165. let ration_template={type:ModuleNames.ration_template,data:{ID:template.ID, createLocation:createLocation, templateList:this.datas}};
  166. let data = {
  167. ration_template:ration_template,
  168. rations:rations,
  169. bills:bills
  170. };
  171. console.log(data);
  172. $.bootstrapLoading.start();
  173. CommonAjax.post('/ration/applyTemplate',data,function (result) {
  174. let parentsNodes = [];
  175. //先删除旧的定额
  176. if(data.rations.delete.length > 0){
  177. for(let d of data.rations.delete){
  178. let dRaNode = projectObj.project.mainTree.getNodeByID(d.ID);
  179. if(dRaNode){
  180. parentsNodes.push(dRaNode.parent);
  181. projectObj.project.Ration.deleteSubListOfRation({ID:d.ID});
  182. _.remove(projectObj.project.Ration.datas,{'ID':d.ID});
  183. projectObj.mainController.m_delete([dRaNode],dRaNode.serialNo(),false)//这里删除关联子目生成的定额因为是离散的树节点,所以要这样分开处理
  184. }
  185. }
  186. }
  187. let refreshNodes = projectObj.project.updateNodesCache(result.updateDatas);//更新要update的前端缓存,并返回要刷新的树节点
  188. let nodeDatas = {ration:{add:[]}, bills:{add:[]}};
  189. if(result.rationResult){
  190. for(let rr of result.rationResult){
  191. nodeDatas.ration.add.push(rr.ration);//定额datas数据的push在addNodes里面做
  192. projectObj.project.Ration.addSubListOfRation(rr,false);//添加定额子项缓存
  193. }
  194. }
  195. //对于新插入的清单:
  196. if(result.billsResult.length > 0){
  197. nodeDatas.bills.add = result.billsResult;
  198. }
  199. let calRations = ProjectController.addNewNodes(nodeDatas);
  200. if(refreshNodes.length > 0){
  201. for(let r of refreshNodes){
  202. if(r.sourceType == ModuleNames.ration){
  203. calRations.push(r);
  204. if(r.data.quantityEXP =="MBGCL" ) projectObj.project.quantity_detail.cleanQuantityDetail(r,true);
  205. }
  206. }
  207. projectObj.mainController.refreshTreeNode(refreshNodes, false);
  208. }
  209. projectObj.project.projectGLJ.calcQuantity();
  210. $.bootstrapLoading.end();
  211. cbTools.refreshFormulaNodes();
  212. //更新计算程序模板,并进行重新计算
  213. if(parentsNodes.length > 0) calRations = calRations.concat(parentsNodes);//计算被删除的子目关联定额的父节点
  214. projectObj.project.calcProgram.calcNodesAndSave(calRations,async function () {
  215. installationFeeObj.calcInstallationFee();
  216. await OVER_HEIGHT.reCalcOverHeightFee();
  217. await itemIncreaseFeeObj.calcItemIncreaseFeeByNodes(calRations);
  218. });
  219. mbzm_obj.showApplySuccess();
  220. })
  221. },
  222. showApplySuccess:function () {
  223. $(".applySuccess").show();
  224. setTimeout(function () {
  225. $(".applySuccess").hide();
  226. },1500)
  227. },
  228. positionChecking(type,data){//这个要之后再测试一下
  229. let validate = true;
  230. if(type == mbzm_obj.locateMap.INMEASURE){
  231. if(!_.isEmpty(data.billID)){
  232. let node = projectObj.project.mainTree.getNodeByID(data.billID);
  233. if(!node) validate = false;//ID有值,但是找不到,说明清单已经被删除
  234. }else if(_.isEmpty(data.billsLocation)){
  235. validate = false
  236. }
  237. }else if(type == mbzm_obj.locateMap.INFBFX){
  238. if(_.isEmpty(data.fxID)) {
  239. validate = false;
  240. }else {
  241. let node = projectObj.project.mainTree.getNodeByID(data.fxID);
  242. if(!node) validate = false;//ID有值,但是找不到,说明分项已经被删除
  243. }
  244. }
  245. return validate
  246. },
  247. getNodeUpdateData:function(data,referenceRationID,type,rations,bills){
  248. let quantity = this.getQuantity(data);//取实时或手输工程量
  249. quantity = this.transferToRationQuantity(data.unit,quantity);//工程量要经过转换
  250. let mainRation = projectObj.project.mainTree.getNodeByID(referenceRationID);
  251. let billsID="";
  252. //先检查要更新的定额是否已经存在
  253. let ration = this.getExistRation(data,referenceRationID,type,rations);
  254. if(ration) {//如果存在,则比较清耗量、工程量表达式是否一致
  255. let tem = this.getRationData(ration,data,quantity);//取更新信息
  256. if(tem){//如果不一致,则需要更新
  257. rations.update.push(tem);
  258. }
  259. //在定额存在的情况下,不用往下执行了
  260. return;
  261. }
  262. //定额不存在的情况下
  263. if(type == mbzm_obj.locateMap.AFTERRATION) {//如果是生成在主定额后面的位置
  264. this.createNewRationAfterMain(data,mainRation,quantity,rations);
  265. }else if(type == mbzm_obj.locateMap.INMEASURE){//生成在措施项目下
  266. this.createNewRationInMeasure(data,mainRation,quantity,rations,bills);
  267. }else {
  268. this.createNewRationInFBFX(data,mainRation,quantity,rations,bills);
  269. }
  270. },
  271. getRationData:function (ration,data,quantity) {
  272. let tem = {};
  273. if (ration.quantity + "" != quantity) tem.quantity = quantity;
  274. if (gljUtil.isDef(data.coe) && data.coe != "0"&&ration.quantityEXP != "MBGCL") {
  275. tem.isFromDetail = 0;
  276. tem.quantityEXP = "MBGCL";
  277. }
  278. if(!_.isEmpty(tem)) {
  279. tem.projectID = ration.projectID;
  280. tem.ID = ration.ID;
  281. tem.contain = projectObj.project.Ration.getContain(projectObj.project.mainTree.findNode(ration.billsItemID),tem.quantity);
  282. return tem;
  283. }
  284. return null;
  285. },
  286. createNewRationAfterMain:function (data,mainRation,quantity,rations) {
  287. //生成新的定额
  288. let newID = uuid.v1();
  289. let serialNo = mainRation.data.serialNo+1;
  290. //如果已经有正要生成的定额,则取这个序号再加1
  291. if(rations.create.length > 0){
  292. serialNo = rations.create[rations.create.length -1].newData.serialNo + 1
  293. }
  294. let n_ration = this.createNewRationData(data,newID,mainRation.data.ID,mainRation.data.billsItemID,serialNo,quantity,mainRation.data.libID,false,mainRation.data.manageFeeRate);
  295. rations.create.push(n_ration);
  296. //处理其它兄弟节点的序号
  297. let br = projectObj.project.Ration.getBillsSortRation();
  298. for(let i = mainRation.data.serialNo;i<br.length;i++){
  299. if(rations.update.length > 0){//如果update列表中有数据,要更新那里的序列号
  300. let u = _.find(rations.update,{'ID':br[i].ID});
  301. if(u){
  302. u.serialNo += 1;
  303. continue;
  304. }
  305. }
  306. rations.update.push({ID:br[i].ID,projectID:br[i].projectID,serialNo:br[i].serialNo+1})
  307. }
  308. },
  309. createNewRationInMeasure:function (data,mainRation,quantity,rations,bills) {
  310. let controller = projectObj.mainController;
  311. let billsID="";
  312. if(!_.isEmpty(data.billID)&&projectObj.project.mainTree.getNodeByID(data.billID)){
  313. billsID = data.billID;
  314. }else {//剩下的就是没找到的
  315. let rootNode = projectObj.project.Bills.getMeasureNode(controller);
  316. let leaveNodes = projectObj.mainController.tree.getLeavesNodes(rootNode.source);
  317. for(let n of leaveNodes){
  318. if (!(n.data.calcBase&&n.data.calcBase!="")&& n.data.code&&(n.data.code ==data.billsLocation||n.data.code.indexOf(data.billsLocation) != -1)){//没有使用基数计算的清单
  319. billsID = n.data.ID;
  320. break;
  321. }
  322. }
  323. if(billsID == ""){//还是没有找到的情况下,先查找是不是已经生成过了
  324. if(bills.create.length > 0){
  325. let t_b = _.find(bills.create,{"billsLocation":data.billsLocation});
  326. if(t_b) billsID = t_b.ID;
  327. }
  328. }
  329. if(billsID == ""){//也没有生成过的情况下,要自动生成清单
  330. //2018-12-19 对于新生成的清单,根据新清单编码的前6位去查询有没有完全匹配的清单,有的话将这一节点做为新清单的父项清单
  331. let subNodes=[];
  332. //默认没有找到编码匹配的就挂在技术措施项目下
  333. let parentNode = projectObj.project.Bills.getAutoParentNode("措施费用");
  334. if(data.billsLocation.length >= 6){
  335. projectObj.mainController.tree.getAllSubNode(rootNode,subNodes);
  336. let tem_code = data.billsLocation.substr(0,6);
  337. let n_parentNode = _.find(subNodes,function (n) {
  338. return n.data.code == tem_code;
  339. });
  340. if(n_parentNode) parentNode = n_parentNode;
  341. }
  342. billsID = uuid.v1();
  343. let newBill = {
  344. ID:billsID,
  345. projectID: parseInt(projectObj.project.ID()),
  346. ParentID:parentNode.data.ID,
  347. NextSiblingID:-1,
  348. code:projectObj.project.Bills.newFormatCode(data.billsLocation),
  349. type:billType.BILL,
  350. billsLibId:projectObj.project.projectInfo.engineeringInfo.bill_lib[0].id,//projectObj.project.projectInfo.engineeringInfo.billsGuidance_lib
  351. billsLocation : data.billsLocation//这个是用来在后端查找清单信息
  352. };
  353. let existB = projectObj.project.Bills.sameStdCodeBillsData(data.billsLocation);//对于多单位的清单
  354. if (existB) {
  355. newBill.unit = existB.unit;
  356. }
  357. //将这个节点的上一节点的NextSiblingID设置为这个新清单
  358. //先看有没有刚生成的清单,有的话直接修改最后一个清单的NextSiblingID即可
  359. let lastIndex = this.getLastIndex(bills.create,"ParentID",parentNode.data.ID);
  360. if(bills.create.length > 0 && lastIndex!=-1){
  361. bills.create[lastIndex].NextSiblingID = newBill.ID;
  362. }else if(parentNode.children.length > 0){//如果新生的没有找到的话,查看父节点下是否有子节点
  363. let pre = parentNode.children[parentNode.children.length-1];
  364. bills.update.push({ projectID:newBill.projectID,ID:pre.data.ID, NextSiblingID:newBill.ID});
  365. }
  366. bills.create.push(newBill);
  367. }
  368. }
  369. //生成定额
  370. let newID = uuid.v1();
  371. let serialNo = 1;
  372. serialNo = this.checkAndGetSerialNo(serialNo,billsID,rations);
  373. //先查看刚生成的定额中有没有相同父清单,有的话取最后的一个序列号加1
  374. let n_ration = this.createNewRationData(data,newID,mainRation.data.ID,billsID,serialNo,quantity,mainRation.data.libID,false,mainRation.data.manageFeeRate);
  375. rations.create.push(n_ration);
  376. },
  377. createNewRationInFBFX:function (data,mainRation,quantity,rations,bills) {
  378. let billsID = "";
  379. let parentNode = projectObj.project.mainTree.getNodeByID(data.fxID);
  380. //分部分项这里,如果没选择位置,或者选择后又删除了,是无法到这一步的,所以不用像生成在清单那里做很多检查
  381. if(!_.isEmpty(data.fxID)&&parentNode){
  382. billsID = data.fxID;
  383. }
  384. if(billsID !=""){
  385. //生成定额
  386. let newID = uuid.v1();
  387. let serialNo = 1;
  388. serialNo = this.checkAndGetSerialNo(serialNo,billsID,rations);
  389. let n_ration = this.createNewRationData(data,newID,mainRation.data.ID,billsID,serialNo,quantity,mainRation.data.libID,true,mainRation.data.manageFeeRate);
  390. rations.create.push(n_ration);
  391. }
  392. },
  393. getLastIndex:function (arrays,key,value) {
  394. let index = -1;
  395. for (let i = 0;i<arrays.length;i++) {
  396. if(arrays[i][key] == value){
  397. index = i;
  398. }
  399. }
  400. return index;
  401. },
  402. checkAndGetSerialNo:function (sNo,billsID,rations) {
  403. let serialNo = sNo;
  404. //先查看刚生成的定额中有没有相同父清单,有的话取最后的一个序列号加1
  405. let last_ration = this.getLastBrotherNewRation(billsID,rations.create);
  406. if(last_ration){
  407. serialNo = last_ration.serialNo +1;
  408. }else {
  409. let parentBillsNode = projectObj.project.mainTree.getNodeByID(billsID);
  410. if(parentBillsNode && parentBillsNode.children.length > 0){//如果能找到则说明已经存在的清单
  411. serialNo = parentBillsNode.children[parentBillsNode.children.length - 1].data.serialNo + 1
  412. }
  413. }
  414. return serialNo
  415. },
  416. getLastBrotherNewRation:function(billsItemID,rations){
  417. let newData = null;
  418. for(let tem of rations){
  419. if(tem.newData.billsItemID == billsItemID) newData = tem.newData;
  420. }
  421. return newData;
  422. },
  423. createNewRationData:function (data,newID,referenceRationID,billsID,serialNo,quantity,libID,isFBFX,manageFeeRate) {
  424. let newData = projectObj.project.Ration.getTempRationData(newID,billsID,serialNo,rationType.ration);
  425. newData.referenceRationID = referenceRationID;
  426. newData.quantity = quantity;
  427. newData.quantityEXP = gljUtil.isDef(data.coe) && data.coe != "0"?"MBGCL":quantity+"";
  428. //这里还要生成根据清单生成含量,父清单如果是刚自动生成的,其工程量为0,含量也为0
  429. newData.contain = projectObj.project.Ration.getContain(projectObj.project.mainTree.findNode(billsID),quantity);
  430. newData.manageFeeRate = manageFeeRate;
  431. let temRation = this.getDefaultRationCreateData(newData,data.code,libID,isFBFX);
  432. return temRation;
  433. },
  434. getDefaultRationCreateData:function(newData,code,libID,isFBFX){
  435. let itemQuery = {userID: userID, rationRepId: libID, code: code};
  436. let needInstall = false;
  437. if(projectObj.project.isInstall()) {//如果是安装工程,要看需不需要生成安装增加费
  438. needInstall = isFBFX;//在分部分项插入的定额才需要定额安装增加费
  439. }
  440. return{itemQuery:itemQuery,newData:newData,defaultLibID: rationLibObj.getDefaultStdRationLibID(),calQuantity:false,brUpdate:[],needInstall:needInstall}
  441. },
  442. /* getQuantity:function (data) {//取最新的消耗量,需经过转换
  443. if(data.unit){
  444. let times = parseInt(data.unit);
  445. if(!isNaN(times)){
  446. return scMathUtil.roundForObj(parseFloat(data.quantity)/times,getDecimal("ration.quantity"))+""
  447. }
  448. }
  449. return data.quantity
  450. },*/
  451. transferToRationQuantity:function (unit,quantity) {
  452. if(unit){
  453. let times = parseInt(unit);
  454. if(!isNaN(times)){
  455. return scMathUtil.roundForObj(parseFloat(quantity)/times,getDecimal("ration.quantity"))+""
  456. }
  457. }
  458. return quantity;
  459. },
  460. getExistRation:function (data,referenceRationID,type,updateRations) {
  461. let temRation = null;
  462. //先检查要更新的定额是否已经存在
  463. let rations =_.filter(projectObj.project.Ration.datas,{'referenceRationID':referenceRationID,'code':data.code});
  464. for(let r of rations){
  465. if(type == mbzm_obj.locateMap.AFTERRATION){//如果是生成在主定额后面的位置
  466. let mainRationNode = projectObj.project.mainTree.getNodeByID(referenceRationID);
  467. if(r.billsItemID == mainRationNode.data.billsItemID){//如果清单ID相同, 说明是兄弟节点,位置相同
  468. temRation = r;
  469. break;
  470. }
  471. }
  472. let billsNode = projectObj.project.mainTree.getNodeByID(r.billsItemID);
  473. if(billsNode){//将父清单与要生成的清单比较,看是否一致
  474. if(type == mbzm_obj.locateMap.INMEASURE && billsNode.data.type ==billType.BILL){
  475. if(!_.isEmpty(data.billID)){
  476. //说明生成位置已经有定额了,只需更新消耗量就好
  477. if(data.billID == r.billsItemID){
  478. temRation = r;
  479. break;
  480. }
  481. }else if(!_.isEmpty(data.billsLocation)){//按清单编号到找对应的位置
  482. if(billsNode.data.code && billsNode.data.code.indexOf(data.billsLocation)!=-1) {
  483. temRation = r;
  484. break;
  485. }
  486. }
  487. }else if(type == mbzm_obj.locateMap.INFBFX && (billsNode.data.type ==billType.FX||billsNode.data.type ==billType.BX)){
  488. if(!_.isEmpty(data.fxID) && data.fxID == r.billsItemID){//分项、补项下有对应的定额
  489. temRation = r;
  490. break;
  491. }
  492. }
  493. }
  494. //如果没有执行到break,则说明这条定额是要被删除的
  495. updateRations.delete.push({projectID:r.projectID,ID:r.ID});
  496. }
  497. return temRation;
  498. },
  499. hasReferenceRation:function (node) {
  500. if(node.sourceType == ModuleNames.ration){
  501. let template = projectObj.project.ration_template.getTemplateByRationID(node.data.ID);
  502. if(template){
  503. let ration = _.find(projectObj.project.Ration.datas,{'referenceRationID':node.data.ID});
  504. if(ration) return true;
  505. }
  506. }
  507. return false;
  508. },
  509. deleteReferenceRation:function (mainNodes,updateNodes) {
  510. let refNode = [];
  511. for(let m of mainNodes){
  512. if(this.hasReferenceRation(m)){
  513. let rations = _.filter(projectObj.project.Ration.datas,{'referenceRationID':m.data.ID});
  514. for(let r of rations){
  515. let temNode = projectObj.project.mainTree.getNodeByID(r.ID);
  516. if(temNode && updateNodes.indexOf(temNode) == -1){//能找到该节点,并且节点不在已经删除的列表中
  517. refNode.push(temNode);
  518. updateNodes.push(temNode);
  519. projectObj.mainController.tree.getAllSubNode(temNode,updateNodes)//添加显示到造价书页面的主材、设备节点
  520. }
  521. }
  522. }
  523. }
  524. return refNode;
  525. },
  526. updateReferenceRationNodeQuantity:function (node) {
  527. let rationNodes = [],codeMap={};
  528. let template = projectObj.project.ration_template.getTemplateByRationID(node.data.ID);
  529. if(template) {
  530. for(let t of template.templateList){
  531. if(t.coe && t.coe!="0"){
  532. codeMap[t.code] = t;
  533. }
  534. }
  535. let times = parseInt(node.data.unit);
  536. times = isNaN(times)?1:times;//工程量要乘以定额单位的倍数
  537. let referenceRations = this.findReferenceRation(node.data.ID);
  538. for(let r of referenceRations ){
  539. let t_tem = codeMap[r.code];
  540. if(t_tem){
  541. let rationQuantity = node.data.quantity?scMathUtil.roundForObj(node.data.quantity, getDecimal('ration.quantity')):0;
  542. let t_quantity = scMathUtil.roundForObj(rationQuantity * parseFloat(t_tem.coe)*times, getDecimal('ration.quantity')); //这个也要同步更新
  543. let rnode = projectObj.project.mainTree.findNode(r.ID);
  544. if(rnode && r.quantityEXP == "MBGCL"){//表达式是模板工程量的才要同步更新
  545. let t_times = parseInt(rnode.data.unit);
  546. t_times = isNaN(t_times)?1:t_times;//工程量要乘以定额单位的倍数
  547. rnode.data.quantity = scMathUtil.roundForObj(t_quantity/t_times,getDecimal('ration.quantity'));
  548. rnode.data.contain = projectObj.project.Ration.getContain(rnode.parent,rnode.data.quantity);
  549. rnode.change = true;
  550. rationNodes.push(rnode)
  551. }
  552. }
  553. }
  554. }
  555. return rationNodes;
  556. },
  557. findReferenceRation:function(rationID){
  558. return _.filter(projectObj.project.Ration.datas,{'referenceRationID':rationID})
  559. }
  560. };
  561. $('#createLocation').change(function(){
  562. let me = mbzm_obj;
  563. let pcol = _.findIndex(me.setting.header,{dataCode:"position"});
  564. me.setting.header[pcol].visible = $(this).val() == mbzm_obj.locateMap.AFTERRATION?false:true;
  565. me.refreshSheetData();
  566. });
  567. $('#next_mbzm').click(function () {
  568. if (projectReadOnly) {
  569. return;
  570. }
  571. let mainSheet = projectObj.mainSpread.getActiveSheet();
  572. let selection = mainSheet.getSelections()[0];
  573. let node = projectObj.project.mainTree.selected;
  574. let index = node.serialNo();
  575. let next = null;
  576. for(let i = index+1;i< projectObj.project.mainTree.items.length;i++){
  577. let temNode = projectObj.project.mainTree.items[i];
  578. if(temNode && temNode.sourceType == ModuleNames.ration){
  579. let template = projectObj.project.ration_template.getTemplateByRationID(temNode.data.ID);
  580. if(template) {
  581. next = temNode;
  582. break;
  583. }
  584. }
  585. }
  586. if(next){
  587. let row = next.serialNo();
  588. let col = selection.col?selection.col:0;
  589. mainSheet.setSelection(row, col, selection.rowCount, selection.colCount);
  590. projectObj.mainController.setTreeSelected(next);
  591. mainSheet.showRow(row, GC.Spread.Sheets.VerticalPosition.center);
  592. }
  593. });
  594. $('#apply_mbzm').click(function () {
  595. if(projectReadOnly) return;
  596. mbzm_obj.applyTemplate();
  597. });