|
|
@@ -148,6 +148,8 @@ let calcTools = {
|
|
|
if (!treeNode.data.fees) {
|
|
|
treeNode.data.fees = [];
|
|
|
treeNode.data.feesIndex = {};
|
|
|
+ treeNode.updateData.fee = [];
|
|
|
+ treeNode.updateData.feesIndex = {};
|
|
|
treeNode.changed = true;
|
|
|
}
|
|
|
else if (!treeNode.data.feesIndex){
|
|
|
@@ -170,6 +172,7 @@ let calcTools = {
|
|
|
};
|
|
|
treeNode.data.fees.push(fee);
|
|
|
treeNode.data.feesIndex[fieldName] = fee;
|
|
|
+ treeNode.updateData.fees = _.cloneDeep(treeNode.data.fees);
|
|
|
treeNode.changed = true;
|
|
|
};
|
|
|
},
|
|
|
@@ -215,9 +218,10 @@ let calcTools = {
|
|
|
let arr = fieldName.split('.');
|
|
|
this.initFeeField(treeNode, arr[1]);
|
|
|
treeNode.data.feesIndex[arr[1]][arr[2]] = value;
|
|
|
+ treeNode.updateData.feesIndex[arr[1]][arr[2]] = value;
|
|
|
}
|
|
|
else{
|
|
|
- treeNode.data[fieldName] = value;
|
|
|
+ treeNode.updateData[fieldName] = value;
|
|
|
};
|
|
|
treeNode.changed = true;
|
|
|
},
|
|
|
@@ -229,6 +233,12 @@ let calcTools = {
|
|
|
safetyFee: 0,
|
|
|
chargeFee: 0
|
|
|
};
|
|
|
+ treeNode.updateData.summaryFees = {
|
|
|
+ totalFee: 0,
|
|
|
+ estimateFee: 0,
|
|
|
+ safetyFee: 0,
|
|
|
+ chargeFee: 0
|
|
|
+ };
|
|
|
treeNode.changed = true;
|
|
|
};
|
|
|
},
|
|
|
@@ -679,44 +689,36 @@ let calcTools = {
|
|
|
let me = this;
|
|
|
/* subType、quantity、calcBase、programID、marketUnitFee等等字段较为特殊,它们的改变一定会触发计算并导致计算
|
|
|
结果的变化,从而引发保存动作。将这些字段放在该位置跟计算结果一起保存,可减少前端跟后端的通讯频率。 */
|
|
|
- let data = {
|
|
|
- projectID: projectObj.project.ID(),
|
|
|
- ID: treeNode.data.ID,
|
|
|
- unit: treeNode.data.unit, //对清单来说,改变单位,工程量精度会跟着改变从而影响计算。
|
|
|
- subType: treeNode.data.subType,
|
|
|
- quantity: treeNode.data.quantity,
|
|
|
- calcBase: treeNode.data.calcBase,
|
|
|
- calcBaseValue: treeNode.data.calcBaseValue,
|
|
|
- programID: treeNode.data.programID,
|
|
|
- marketUnitFee: treeNode.data.marketUnitFee,
|
|
|
- marketTotalFee: treeNode.data.marketTotalFee,
|
|
|
- fees: treeNode.data.fees,
|
|
|
- isFromDetail:treeNode.data.isFromDetail,
|
|
|
- feeRate: treeNode.data.feeRate,
|
|
|
- feeRateID: treeNode.data.feeRateID,
|
|
|
- contain: treeNode.data.contain,
|
|
|
- quantityEXP: treeNode.data.quantityEXP,
|
|
|
- summaryFees: treeNode.data.summaryFees,
|
|
|
- name:treeNode.data.name,
|
|
|
- rationQuantityCoe: treeNode.data.rationQuantityCoe,
|
|
|
- quantityCoe: treeNode.data.quantityCoe == null ? {} : treeNode.data.quantityCoe,
|
|
|
- targetUnitFee: treeNode.data.targetUnitFee,
|
|
|
- targetTotalFee: treeNode.data.targetTotalFee,
|
|
|
- specialProvisional:treeNode.data.specialProvisional
|
|
|
- };
|
|
|
-
|
|
|
+ let data = treeNode.updateData;
|
|
|
+ data.projectID = projectObj.project.ID();
|
|
|
+ data.ID = treeNode.data.ID;
|
|
|
+ //对比计算结果与原数据的值,有改变的才提交保存
|
|
|
+ if(treeNode.temData){
|
|
|
+ for(let key in treeNode.data){
|
|
|
+ if(key == "feesIndex" || key =="flagsIndex" || key =="gljList" || key =="calcTemplate") continue;// 这两个字段不用保存到后台;
|
|
|
+ if(treeNode.data[key]&& typeof treeNode.data[key] == "object"){//对象类型转换成字符串比较
|
|
|
+ if(Array.isArray(treeNode.data[key])) treeNode.data[key].sort();
|
|
|
+ if(Array.isArray(treeNode.temData[key])) treeNode.temData[key].sort();
|
|
|
+ if(JSON.stringify(treeNode.temData[key])!== JSON.stringify(treeNode.data[key]) ){
|
|
|
+ data[key] = treeNode.data[key];
|
|
|
+ }
|
|
|
+ }else if(treeNode.temData[key]!==treeNode.data[key]){
|
|
|
+ data[key] = treeNode.data[key];
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
// 定额大类
|
|
|
if (me.isRationCategory(treeNode)) {
|
|
|
- data.isSubcontract = treeNode.data.isSubcontract;
|
|
|
- data.evaluationProject = treeNode.data.evaluationProject;
|
|
|
+ // 这4个位置要分别找到更新的地方按新的来更新
|
|
|
+ // data.isSubcontract = treeNode.data.isSubcontract;
|
|
|
+ // data.evaluationProject = treeNode.data.evaluationProject;
|
|
|
//定额类型的工料机做特殊处理
|
|
|
if(me.isGljRation(treeNode)){
|
|
|
- data.code = treeNode.data.code;
|
|
|
- data.projectGLJID = treeNode.data.projectGLJID;
|
|
|
+ // data.code = treeNode.data.code;
|
|
|
+ // data.projectGLJID = treeNode.data.projectGLJID;
|
|
|
delete data.marketUnitFee;
|
|
|
};
|
|
|
};
|
|
|
-
|
|
|
// 优化掉 undefined 属性
|
|
|
data = JSON.parse(JSON.stringify(data));
|
|
|
return data;
|
|
|
@@ -911,16 +913,35 @@ let rationCalcBasesNameKinds = {
|
|
|
};
|
|
|
|
|
|
let rationCalcBases = {
|
|
|
- '定额基价人工费': function (node, isTender) {
|
|
|
+ '人工费': function (node, isTender) {
|
|
|
+ return calcTools.rationBaseFee(node, [gljType.LABOUR], priceTypes.ptMarketPrice, isTender);
|
|
|
+ },
|
|
|
+ '材料费': function (node, isTender) {
|
|
|
+ return calcTools.rationBaseFee(node, baseMaterialTypes, priceTypes.ptMarketPrice, isTender);
|
|
|
+ },
|
|
|
+ '施工机具费': function (node, isTender) {
|
|
|
+ return calcTools.rationBaseFee(node, [gljType.GENERAL_MACHINE], priceTypes.ptMarketPrice, isTender);
|
|
|
+ },
|
|
|
+ '商品砼费': function (node, isTender) {
|
|
|
+ return calcTools.rationBaseFee(node, [gljType.COMMERCIAL_CONCRETE, gljType.COMMERCIAL_MORTAR], priceTypes.ptMarketPrice, isTender);
|
|
|
+ },
|
|
|
+ '设备购置费': function (node, isTender) {
|
|
|
+ return calcTools.rationBaseFee(node, [gljType.EQUIPMENT], priceTypes.ptMarketPrice, isTender);
|
|
|
+ },
|
|
|
+ '定额人工费': function (node, isTender) {
|
|
|
return calcTools.rationBaseFee(node, [gljType.LABOUR], priceTypes.ptBasePrice, isTender);
|
|
|
},
|
|
|
- '定额基价材料费': function (node, isTender) {
|
|
|
+ '定额材料费': function (node, isTender) {
|
|
|
return calcTools.rationBaseFee(node, baseMaterialTypes, priceTypes.ptBasePrice, isTender);
|
|
|
},
|
|
|
- '定额基价机械费': function (node, isTender) {
|
|
|
+ '定额施工机具使用费': function (node, isTender) {
|
|
|
return calcTools.rationBaseFee(node, [gljType.GENERAL_MACHINE], priceTypes.ptBasePrice, isTender);
|
|
|
},
|
|
|
- '定额基价机上人工费': function (node, isTender) {
|
|
|
+ '定额设备费': function (node, isTender) {
|
|
|
+ return calcTools.rationBaseFee(node, [gljType.EQUIPMENT], priceTypes.ptBasePrice, isTender);
|
|
|
+ }
|
|
|
+
|
|
|
+/* '定额基价机上人工费': function (node, isTender) {
|
|
|
return calcTools.machineDetailFee(node, node.data.gljList, [], gljType.MACHINE_LABOUR, isTender);
|
|
|
},
|
|
|
'人工费价差': function (node, isTender) {
|
|
|
@@ -1015,7 +1036,7 @@ let rationCalcBases = {
|
|
|
return calcTools.labourDays(node, isTender)
|
|
|
else
|
|
|
return 0;
|
|
|
- }
|
|
|
+ }*/
|
|
|
};
|
|
|
|
|
|
let analyzer = {
|
|
|
@@ -1581,9 +1602,10 @@ class CalcProgram {
|
|
|
// 只计算treeNode自身。changedArr: 外部传来的一个数组,专门存储发生变动的节点。
|
|
|
innerCalc(treeNode, changedArr, tender){
|
|
|
let me = this;
|
|
|
+ me.setUpdateDataToNode(treeNode);//先更新要计算的节点信息
|
|
|
+ if(!treeNode.temData) treeNode.temData = _.cloneDeep(treeNode.data); //有可能会有多次计算,只有第一次才保存原始数据,用来对于更新。
|
|
|
// 仅用作树节点显示的工料机不能参与计算。
|
|
|
if (treeNode.sourceType === ModuleNames.ration_glj) return;
|
|
|
-
|
|
|
treeNode.calcType = calcTools.getCalcType(treeNode);
|
|
|
let nQ = calcTools.uiNodeQty(treeNode);
|
|
|
let nTQ = calcTools.uiNodeTenderQty(treeNode);
|
|
|
@@ -1831,14 +1853,12 @@ class CalcProgram {
|
|
|
|
|
|
if (tender == tenderTypes.ttReverseRation || tender == tenderTypes.ttReverseGLJ)
|
|
|
this.calcTenderReverse(treeNode, tender);
|
|
|
-
|
|
|
deleteUselessFees(treeNode, fnArr);
|
|
|
};
|
|
|
};
|
|
|
|
|
|
if (!calcTools.isTotalCostBill(treeNode)) // 已在上面的分支中计算过
|
|
|
calcTools.estimateFee(treeNode);
|
|
|
-
|
|
|
if (treeNode.changed && !changedArr.includes(treeNode)) changedArr.push(treeNode);
|
|
|
};
|
|
|
|
|
|
@@ -1861,11 +1881,13 @@ class CalcProgram {
|
|
|
me.project.endUpdate();*/
|
|
|
|
|
|
let dataArr = [];
|
|
|
+ let updateMap = {};
|
|
|
for (let node of treeNodes){
|
|
|
if (node.changed){
|
|
|
let data = calcTools.cutNodeForSave(node);
|
|
|
let newData = {'type': node.sourceType, 'data': data};
|
|
|
dataArr.push(newData);
|
|
|
+ updateMap[node.data.ID] = data;
|
|
|
}
|
|
|
};
|
|
|
if (dataArr.length < 1) {
|
|
|
@@ -1877,13 +1899,15 @@ class CalcProgram {
|
|
|
me.project.updateNodes(dataArr, function (data) {
|
|
|
let endShowTime = +new Date();
|
|
|
console.log(`保存所需时间——${endShowTime - startTime}`);
|
|
|
+ for (let node of treeNodes){
|
|
|
+ delete node.changed;
|
|
|
+ delete node.temData;
|
|
|
+ node.updateData = {};
|
|
|
+ };
|
|
|
if(callback){
|
|
|
callback(data);
|
|
|
};
|
|
|
-
|
|
|
- for (let node of treeNodes){delete node.changed};
|
|
|
projectObj.mainController.refreshTreeNode(treeNodes);
|
|
|
-
|
|
|
// 批量树结点计算后,计算程序早已物是人非,所以这里要重新计算一下。警告:第二个参数千万不能改成3,否则死循环!
|
|
|
if (activeSubSheetIsCalcProgram())
|
|
|
calcProgramObj.refreshCalcProgram(projectObj.project.mainTree.selected, 2);
|
|
|
@@ -1915,8 +1939,9 @@ class CalcProgram {
|
|
|
};
|
|
|
// 计算并保存一个树节点。(修改一个树节点,实际上要计算和保存的是一批树结点:层层父结点、被其它结点(的公式)引用的公式结点)
|
|
|
calcAndSave(treeNode, callback, tender){
|
|
|
- let changedNodes = this.calculate(treeNode, true, true, tender);
|
|
|
- this.saveNodes(changedNodes, callback);
|
|
|
+ this.calcNodesAndSave([treeNode],callback,tender)
|
|
|
+ /* let changedNodes = this.calculate(treeNode, true, true, tender); 统一调用相同的方法
|
|
|
+ this.saveNodes(changedNodes, callback);*/
|
|
|
};
|
|
|
|
|
|
/* 计算所有树结点(分3种情况),并返回发生变动的零散的多个树结点。参数取值如下:
|
|
|
@@ -1930,6 +1955,7 @@ class CalcProgram {
|
|
|
let changedNodes = [];
|
|
|
function calcNodes(nodes) {
|
|
|
for (let node of nodes) {
|
|
|
+ me.setUpdateDataToNode(node);
|
|
|
if (node.children.length > 0) {
|
|
|
calcNodes(node.children);
|
|
|
};
|
|
|
@@ -1955,6 +1981,13 @@ class CalcProgram {
|
|
|
let changedNodes = this.calcAllNodes(calcType, tender);
|
|
|
this.saveNodes(changedNodes, callback);
|
|
|
};
|
|
|
+ setUpdateDataToNode(node){//将updateData里面的值设到node.data上,计算结点时才能拿到最新的值
|
|
|
+ if(!_.isEmpty(node.updateData)){
|
|
|
+ for(let key in node.updateData){
|
|
|
+ node.data[key] = node.updateData[key];
|
|
|
+ }
|
|
|
+ }
|
|
|
+ };
|
|
|
|
|
|
// 计算零散的、混杂的树节点:清单、定额混合等(如:用到某一计算程序的定额和清单)。
|
|
|
// 计算多条零散的定额,并计算他们所属的清单、父清单、引用清单。如:批量替换工料机后受影响的定额。
|
|
|
@@ -1962,6 +1995,7 @@ class CalcProgram {
|
|
|
calcNodesAndSave(nodes, callback, tender){
|
|
|
let me = this, rationNodes = [], billNodes = [], leafBills = [], allChangedNodes = [];
|
|
|
for (let node of nodes) {
|
|
|
+ me.setUpdateDataToNode(node);//多节点更新的情况,要先更新值,因为计算过程中有可能要引用新的值
|
|
|
if (node.sourceType == ModuleNames.ration)
|
|
|
rationNodes.push(node)
|
|
|
else
|