|
@@ -77,7 +77,7 @@ let cbTools = {
|
|
|
if(this.isUnDef(exp) || exp === ''){
|
|
|
return rst;
|
|
|
}
|
|
|
- if(exp.includes('{税前工程造价}')){
|
|
|
+ /* if(exp.includes('{税前工程造价}')){
|
|
|
let findChildNodes = [];
|
|
|
let subEngingeering = this.findBill(fixedFlag.SUB_ENGINERRING) ? this.getNodeByID(this.findBill(fixedFlag.SUB_ENGINERRING).ID) : null,
|
|
|
measure = this.findBill(fixedFlag.MEASURE) ? this.getNodeByID(this.findBill(fixedFlag.MEASURE).ID) : null,
|
|
@@ -101,14 +101,29 @@ let cbTools = {
|
|
|
ids.push(cNode.data.ID);
|
|
|
}
|
|
|
rst = rst.concat(childrenNodes);
|
|
|
- }
|
|
|
+ }*/
|
|
|
//获取表达式中的基数和行引用
|
|
|
let figureF = cbParser.getFigureF(cbParser.getFigure(exp), cbParser.getUID(cbParser.getFIDArr(exp)));
|
|
|
for(let i = 0, len = figureF.length; i < len; i++){
|
|
|
let figure = figureF[i];
|
|
|
if(figure.type === 'base' && cbTools.isDef(calcBase.baseFigures[figure.value])){
|
|
|
let bill = this.isDef(calcBase.baseFigures[figure.value]['fixedBill']) ? calcBase.baseFigures[figure.value]['fixedBill']['bill'] : null;
|
|
|
- if(this.isDef(bill) && ids.indexOf(bill.ID) === -1){
|
|
|
+ let figureMultiRef = calcBase.baseFigures[figure.value]['multiRef'];
|
|
|
+ if(this.isDef(figureMultiRef)){
|
|
|
+ let findChildNodes = [];
|
|
|
+ for(let flag of figureMultiRef){
|
|
|
+ let refBill = this.findBill(flag);
|
|
|
+ if(refBill){
|
|
|
+ findChildNodes.push(refBill);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ let childrenNodes = calcTools.getChildrenFormulaNodes(node, formulaNodesArr, findChildNodes);
|
|
|
+ for(let cNode of childrenNodes){
|
|
|
+ ids.push(cNode.data.ID);
|
|
|
+ }
|
|
|
+ rst = rst.concat(childrenNodes);
|
|
|
+ }
|
|
|
+ else if(this.isDef(bill) && ids.indexOf(bill.ID) === -1){
|
|
|
let node = this.getNodeByID(bill.ID);
|
|
|
if(this.isDef(node)){
|
|
|
ids.push(node.data.ID);
|
|
@@ -154,6 +169,52 @@ let cbTools = {
|
|
|
},
|
|
|
//生成清单基数计算分类模板
|
|
|
setBaseFigureClass: function (baseFigures, mapObj) {
|
|
|
+ for(let figureClass in figureClassTemplate){
|
|
|
+ mapObj[figureClass] = Object.create(null);
|
|
|
+ }
|
|
|
+ let needFixedBillsClass = ['FBFX', 'CXSM', 'QTXM', 'GF', 'SJ'];
|
|
|
+ //不需要关联节点的、但是下挂在固定清单分类下的基数
|
|
|
+ let noneFixedBillsFigures = ['JZMJ'];
|
|
|
+ //安全文明施工专项费用只有税金和工程造价能用
|
|
|
+ for(let figure in baseFigures){
|
|
|
+ if(!noneFixedBillsFigures.includes(baseFigures[figure]['base'])){
|
|
|
+ //过滤相关清单固定行不存在的
|
|
|
+ if(needFixedBillsClass.includes(baseFigures[figure]['class']) && !baseFigures[figure]['fixedBill']){
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ for(let figureClass in figureClassTemplate){
|
|
|
+ let figureClassFilter = figureClassTemplate[figureClass]['filter'];
|
|
|
+ if(!figureClassFilter.includes(baseFigures[figure]['base'])){
|
|
|
+ mapObj[figureClass][figure] = baseFigures[figure];
|
|
|
+ }
|
|
|
+ }
|
|
|
+ /*if(filter.indexOf(baseFigures[figure]['base']) === -1){
|
|
|
+ mapObj['CONSTRUCTION_ORGANIZATION'][figure] = baseFigures[figure];
|
|
|
+ }
|
|
|
+ if(baseFigures[figure]['base'] !== 'QTXMF' && baseFigures[figure]['base'] !== 'SQGCZJ' && baseFigures[figure]['base'] !== 'AQWMSGZXF'){
|
|
|
+ mapObj['OTHER'][figure] = baseFigures[figure];
|
|
|
+ }
|
|
|
+ if(baseFigures[figure]['base'] !== 'GF' && baseFigures[figure]['base'] !== 'SQGCZJ' && baseFigures[figure]['base'] !== 'AQWMSGZXF'){
|
|
|
+ mapObj['CHARGE'][figure] = baseFigures[figure];
|
|
|
+ }
|
|
|
+ if(baseFigures[figure]['base'] !== 'SJ' && baseFigures[figure]['base'] !== 'SQGCZJ'){
|
|
|
+ mapObj['TAX'][figure] = baseFigures[figure];
|
|
|
+ }
|
|
|
+ if(baseFigures[figure]['base'] !== 'SQGCZJ'){
|
|
|
+ mapObj['ENGINEERINGCOST'][figure] = baseFigures[figure];
|
|
|
+ }
|
|
|
+ if(baseFigures[figure]['base'] !== 'SQGCZJ' && baseFigures[figure]['base'] !== 'AQWMSGZXF'){
|
|
|
+ mapObj['OTHERS'][figure] = baseFigures[figure];
|
|
|
+ }
|
|
|
+ if(baseFigures[figure]['base'] === 'SQGCZJ'){
|
|
|
+ mapObj['SAFETY_CONSTRUCTION'][figure] = baseFigures[figure];
|
|
|
+ }*/
|
|
|
+ }
|
|
|
+ // mapObj['SAFETY_CONSTRUCTION'] = Object.assign(mapObj['SAFETY_CONSTRUCTION'], mapObj['CONSTRUCTION_ORGANIZATION']);
|
|
|
+
|
|
|
+ },
|
|
|
+ /*setBaseFigureClass: function (baseFigures, mapObj) {
|
|
|
mapObj['CONSTRUCTION_ORGANIZATION'] = Object.create(null);
|
|
|
mapObj['SAFETY_CONSTRUCTION'] = Object.create(null);
|
|
|
mapObj['OTHER'] = Object.create(null);
|
|
@@ -197,7 +258,7 @@ let cbTools = {
|
|
|
}
|
|
|
mapObj['SAFETY_CONSTRUCTION'] = Object.assign(mapObj['SAFETY_CONSTRUCTION'], mapObj['CONSTRUCTION_ORGANIZATION']);
|
|
|
|
|
|
- },
|
|
|
+ },*/
|
|
|
getFigure: function (node) {
|
|
|
let calcBase = projectObj.project.calcBase;
|
|
|
let parent = node.parent;
|
|
@@ -205,6 +266,28 @@ let cbTools = {
|
|
|
|| node.data.flagsIndex.fixed.flag === calcBase.fixedFlag.CONSTRUCTION_TECH)){
|
|
|
return null;
|
|
|
}
|
|
|
+ if(this.isFlag(node.data)){
|
|
|
+ for(let figureClass in figureClassTemplate){
|
|
|
+ let figureClassFlag = figureClassTemplate[figureClass]['flag'];
|
|
|
+ if(figureClassFlag && node.data.flagsIndex.fixed.flag === figureClassFlag){
|
|
|
+ return calcBase.baseFigureClass[figureClass]
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if(!parent){
|
|
|
+ return calcBase.baseFigureClass.OTHERS;
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ return this.getFigure(parent);
|
|
|
+ }
|
|
|
+ },
|
|
|
+ /*getFigure: function (node) {
|
|
|
+ let calcBase = projectObj.project.calcBase;
|
|
|
+ let parent = node.parent;
|
|
|
+ if(this.isFlag(node.data) && (node.data.flagsIndex.fixed.flag === calcBase.fixedFlag.SUB_ENGINERRING
|
|
|
+ || node.data.flagsIndex.fixed.flag === calcBase.fixedFlag.CONSTRUCTION_TECH)){
|
|
|
+ return null;
|
|
|
+ }
|
|
|
else if(this.isFlag(node.data) && node.data.flagsIndex.fixed.flag === calcBase.fixedFlag.CONSTRUCTION_ORGANIZATION){
|
|
|
return calcBase.baseFigureClass.CONSTRUCTION_ORGANIZATION;
|
|
|
}
|
|
@@ -231,7 +314,7 @@ let cbTools = {
|
|
|
return this.getFigure(parent);
|
|
|
}
|
|
|
}
|
|
|
- },
|
|
|
+ },*/
|
|
|
getBaseBill: function (node) {
|
|
|
let calcBase = projectObj.project.calcBase;
|
|
|
let parent = node.parent;
|
|
@@ -275,8 +358,19 @@ let cbTools = {
|
|
|
for(let i = 0, len = bases.length; i < len; i++){
|
|
|
//基数是跟清单直接关联的
|
|
|
if(bases[i]['type'] === 'base' && cbTools.isDef(calcBase.baseFigures[bases[i]['value']])){
|
|
|
+ let figureMultiRef= calcBase.baseFigures[bases[i]['value']]['multiRef'];
|
|
|
+ //重构后:
|
|
|
+ if(cbTools.isDef(figureMultiRef)){
|
|
|
+ for(let flag of figureMultiRef){
|
|
|
+ let bills = cbTools.findBill(flag);
|
|
|
+ if(cbTools.isDef(bills)){
|
|
|
+ block.push(bills.ID);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
//税前工程造价算法用了分部分项、项目措施(已排除)、其他项目、规费里的底层价格,相当于引用了4条固定清单,特殊处理
|
|
|
- if(bases[i]['value'] === '税前工程造价'){
|
|
|
+ /* if(bases[i]['value'] === '税前工程造价'){
|
|
|
let subEngineering = cbTools.findBill(calcBase.fixedFlag.SUB_ENGINERRING),
|
|
|
other = cbTools.findBill(calcBase.fixedFlag.OTHER),
|
|
|
charge = cbTools.findBill(calcBase.fixedFlag.CHARGE);
|
|
@@ -289,7 +383,7 @@ let cbTools = {
|
|
|
if(charge){
|
|
|
block.push(charge.ID);
|
|
|
}
|
|
|
- }
|
|
|
+ }*/
|
|
|
else if(cbTools.isDef(calcBase.baseFigures[bases[i]['value']]['fixedBill'])){
|
|
|
block.push(calcBase.baseFigures[bases[i]['value']]['fixedBill']['bill']['ID']);
|
|
|
}
|
|
@@ -1120,7 +1214,18 @@ let baseFigureTemplate = {
|
|
|
}
|
|
|
};
|
|
|
|
|
|
+let figureClassTemplate = {
|
|
|
+ 'CONSTRUCTION_ORGANIZATION': {flag: fixedFlag.CONSTRUCTION_ORGANIZATION, filter: ['CSXMF', 'ZZCSXMF', 'ZZCSXMDEJJZJGCF', 'ZZCSXMDEJJRGF', 'ZZCSXMDEJJCLF', 'ZZCSXMDEJJJXF', 'QTXMF', 'GF', 'SJ', 'SQGCZJ', 'AQWMSGZXF']},
|
|
|
+ 'SAFETY_CONSTRUCTION': {flag: fixedFlag.SAFETY_CONSTRUCTION, filter: ['CSXMF', 'ZZCSXMF', 'ZZCSXMDEJJZJGCF', 'ZZCSXMDEJJRGF', 'ZZCSXMDEJJCLF', 'ZZCSXMDEJJJXF', 'QTXMF', 'GF', 'SJ', 'AQWMSGZXF']},
|
|
|
+ 'OTHER': {flag: fixedFlag.OTHER, filter: ['QTXMF', 'SQGCZJ', 'AQWMSGZXF']},
|
|
|
+ 'CHARGE': {flag: fixedFlag.CHARGE, filter: ['GF', 'SQGCZJ', 'AQWMSGZXF']},
|
|
|
+ 'TAX': {flag: fixedFlag.TAX, filter: ['SJ', 'SQGCZJ']},
|
|
|
+ 'ENGINEERINGCOST': {flag: fixedFlag.ENGINEERINGCOST, filter: ['SQGCZJ']},
|
|
|
+ 'OTHERS': {flag: fixedFlag.ENGINEERINGCOST, filter: ['SQGCZJ', 'AQWMSGZXF']},
|
|
|
+};
|
|
|
+
|
|
|
//基数的值不是通过清单节点获得的,则该基数的fixedBill为空,如价差、甲供、分包; class:分类,用于基数选择界面分类显示
|
|
|
+//基数本身不与清单节点关联、但是其由与清单关联的节点四则运算得到,则拥有字段multiRef: [flags...]
|
|
|
let baseFigureMap = {
|
|
|
//与清单直接关联=======
|
|
|
'分部分项工程费': {base: 'FBFXGCF', fixedFlag: fixedFlag.SUB_ENGINERRING, class: 'FBFX'},
|
|
@@ -1157,7 +1262,7 @@ let baseFigureMap = {
|
|
|
'安全文明施工专项费': {base: 'AQWMSGZXF', fixedFlag: fixedFlag.SAFETY_CONSTRUCTION, class: 'CSXM'},
|
|
|
//不于清单直接关联==========
|
|
|
'建筑面积': {base: 'JZMJ', class: 'FBFX'},
|
|
|
- '税前工程造价': {base: 'SQGCZJ', class: 'SQGCZJ'},//安全文明施工专项费用使用
|
|
|
+ '税前工程造价': {base: 'SQGCZJ', class: 'SQGCZJ', multiRef: [fixedFlag.SUB_ENGINERRING, fixedFlag.OTHER, fixedFlag.CHARGE]},//安全文明施工专项费用使用
|
|
|
'人材机价差': {base: 'RCJJC', class: 'RCJ'},
|
|
|
'人工价差': {base: 'RGJC', class: 'RCJ'},
|
|
|
'材料价差': {base: 'CLJC', class: 'RCJ'},
|
|
@@ -1275,7 +1380,18 @@ let cbAnalyzer = {
|
|
|
let figure = figureF[i];
|
|
|
let billsIDs = [];
|
|
|
if(figure.type === 'base' && cbTools.isDef(baseFigures[figure.value])){
|
|
|
- if(figure.value === '税前工程造价'){
|
|
|
+ //重构后:
|
|
|
+ //多重引用基数
|
|
|
+ let figureMultiRef = baseFigures[figure.value]['multiRef'];
|
|
|
+ if(cbTools.isDef(figureMultiRef)){
|
|
|
+ for(let flag of figureMultiRef){
|
|
|
+ let bills = cbTools.findBill(flag);
|
|
|
+ if(bills){
|
|
|
+ billsIDs.push(bills.ID);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ /* if(figure.value === '税前工程造价'){
|
|
|
//税前工程造价算法在措施项目已排除自身,税前工程造价与措施项目无会造成循环的引用关系
|
|
|
let subEngineering = cbTools.findBill(calcBase.fixedFlag.SUB_ENGINERRING),
|
|
|
other = cbTools.findBill(calcBase.fixedFlag.OTHER),
|
|
@@ -1289,7 +1405,7 @@ let cbAnalyzer = {
|
|
|
if(charge){
|
|
|
billsIDs.push(charge.ID);
|
|
|
}
|
|
|
- }
|
|
|
+ }*/
|
|
|
else {
|
|
|
billsIDs = cbTools.isDef(baseFigures[figure.value]['fixedBill']) ? [baseFigures[figure.value]['fixedBill']['bill']['ID']] : [];
|
|
|
}
|
|
@@ -1358,27 +1474,7 @@ let cbAnalyzer = {
|
|
|
if(this.cycleCalc(node, calcBase.baseFigures, exp)){
|
|
|
throw '出现循环计算';
|
|
|
}
|
|
|
- /* if(this.cycleCalc(node, cbTools.getFigure(node), exp)){
|
|
|
- throw '出现循环计算';
|
|
|
- }*/
|
|
|
return exp;
|
|
|
- /* if(this.inputLegal(exp)){
|
|
|
- if(this.arithmeticLegal(exp)){
|
|
|
- if(this.baseLegal(cbTools.getFigure(node), exp)){
|
|
|
- if(this.fLegal(calcBase.project.mainTree.items, exp)){
|
|
|
- //转换成ID引用
|
|
|
- exp = cbParser.toIDExpr(exp);
|
|
|
- if(!this.cycleCalc(node, cbTools.getFigure(node), exp)){
|
|
|
- return exp;
|
|
|
- }
|
|
|
- }
|
|
|
- else {
|
|
|
- calcBase.errMsg = '行引用不合法';
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- return null;*/
|
|
|
}
|
|
|
};
|
|
|
|
|
@@ -1627,7 +1723,7 @@ let calcBase = {
|
|
|
//清单可选基数映射,分两类:组织措施项目:排除父项和计算的父项; 其他项目、规费、税金、工程造价,及新增部分:显示所有计算基数
|
|
|
baseFigureClass: Object.create(null),
|
|
|
//初始化
|
|
|
- init: function (project) {
|
|
|
+ init: function (project) {//
|
|
|
let me = this;
|
|
|
me.project = project;
|
|
|
me.fixedFlag = fixedFlag;
|