|
@@ -239,19 +239,15 @@ let cbTools = {
|
|
//根据基数和行引用获取清单ID
|
|
//根据基数和行引用获取清单ID
|
|
for(let i = 0, len = bases.length; i < len; i++){
|
|
for(let i = 0, len = bases.length; i < len; i++){
|
|
//基数是跟清单直接关联的
|
|
//基数是跟清单直接关联的
|
|
- /*if(bases[i]['type'] === 'base' && cbTools.isDef(calcBase.baseFigures[bases[i]['value']])){
|
|
|
|
- //税前工程造价算法用了分部分项、项目措施、其他项目、规费里的底层价格,相当于引用了4条固定清单,特殊处理
|
|
|
|
|
|
+ if(bases[i]['type'] === 'base' && cbTools.isDef(calcBase.baseFigures[bases[i]['value']])){
|
|
|
|
+ //税前工程造价算法用了分部分项、项目措施(已排除)、其他项目、规费里的底层价格,相当于引用了4条固定清单,特殊处理
|
|
if(bases[i]['value'] === '税前工程造价'){
|
|
if(bases[i]['value'] === '税前工程造价'){
|
|
let subEngineering = cbTools.findBill(calcBase.fixedFlag.SUB_ENGINERRING),
|
|
let subEngineering = cbTools.findBill(calcBase.fixedFlag.SUB_ENGINERRING),
|
|
- measure = cbTools.findBill(calcBase.fixedFlag.MEASURE),
|
|
|
|
other = cbTools.findBill(calcBase.fixedFlag.OTHER),
|
|
other = cbTools.findBill(calcBase.fixedFlag.OTHER),
|
|
charge = cbTools.findBill(calcBase.fixedFlag.CHARGE);
|
|
charge = cbTools.findBill(calcBase.fixedFlag.CHARGE);
|
|
if(subEngineering){
|
|
if(subEngineering){
|
|
block.push(subEngineering.ID);
|
|
block.push(subEngineering.ID);
|
|
}
|
|
}
|
|
- if(measure){
|
|
|
|
- block.push(measure.ID);
|
|
|
|
- }
|
|
|
|
if(other){
|
|
if(other){
|
|
block.push(other.ID);
|
|
block.push(other.ID);
|
|
}
|
|
}
|
|
@@ -262,11 +258,11 @@ let cbTools = {
|
|
else if(cbTools.isDef(calcBase.baseFigures[bases[i]['value']]['fixedBill'])){
|
|
else if(cbTools.isDef(calcBase.baseFigures[bases[i]['value']]['fixedBill'])){
|
|
block.push(calcBase.baseFigures[bases[i]['value']]['fixedBill']['bill']['ID']);
|
|
block.push(calcBase.baseFigures[bases[i]['value']]['fixedBill']['bill']['ID']);
|
|
}
|
|
}
|
|
- }*/
|
|
|
|
- if(bases[i]['type'] === 'base' && cbTools.isDef(calcBase.baseFigures[bases[i]['value']])
|
|
|
|
|
|
+ }
|
|
|
|
+ /* if(bases[i]['type'] === 'base' && cbTools.isDef(calcBase.baseFigures[bases[i]['value']])
|
|
&& cbTools.isDef(calcBase.baseFigures[bases[i]['value']]['fixedBill'])){
|
|
&& cbTools.isDef(calcBase.baseFigures[bases[i]['value']]['fixedBill'])){
|
|
block.push(calcBase.baseFigures[bases[i]['value']]['fixedBill']['bill']['ID']);
|
|
block.push(calcBase.baseFigures[bases[i]['value']]['fixedBill']['bill']['ID']);
|
|
- }
|
|
|
|
|
|
+ }*/
|
|
else if(bases[i]['type'] === 'id'){
|
|
else if(bases[i]['type'] === 'id'){
|
|
let node = cbTools.getNodeByID(bases[i]['value']);
|
|
let node = cbTools.getNodeByID(bases[i]['value']);
|
|
if(cbTools.isDef(node)){
|
|
if(cbTools.isDef(node)){
|
|
@@ -1164,15 +1160,32 @@ let cbAnalyzer = {
|
|
let figureF = cbParser.getFigureF(cbParser.getFigure(exp), cbParser.getUID(cbParser.getFIDArr(exp)));
|
|
let figureF = cbParser.getFigureF(cbParser.getFigure(exp), cbParser.getUID(cbParser.getFIDArr(exp)));
|
|
for(let i = 0, len = figureF.length; i < len; i++){
|
|
for(let i = 0, len = figureF.length; i < len; i++){
|
|
let figure = figureF[i];
|
|
let figure = figureF[i];
|
|
- let bill = null;
|
|
|
|
|
|
+ let billsIDs = [];
|
|
if(figure.type === 'base' && cbTools.isDef(baseFigures[figure.value])){
|
|
if(figure.type === 'base' && cbTools.isDef(baseFigures[figure.value])){
|
|
- bill = cbTools.isDef(baseFigures[figure.value]['fixedBill']) ? baseFigures[figure.value]['fixedBill']['bill'] : null;
|
|
|
|
|
|
+ if(figure.value === '税前工程造价'){
|
|
|
|
+ //税前工程造价算法在措施项目已排除自身,税前工程造价与措施项目无会造成循环的引用关系
|
|
|
|
+ let subEngineering = cbTools.findBill(calcBase.fixedFlag.SUB_ENGINERRING),
|
|
|
|
+ other = cbTools.findBill(calcBase.fixedFlag.OTHER),
|
|
|
|
+ charge = cbTools.findBill(calcBase.fixedFlag.CHARGE);
|
|
|
|
+ if(subEngineering){
|
|
|
|
+ billsIDs.push(subEngineering.ID);
|
|
|
|
+ }
|
|
|
|
+ if(other){
|
|
|
|
+ billsIDs.push(other.ID);
|
|
|
|
+ }
|
|
|
|
+ if(charge){
|
|
|
|
+ billsIDs.push(charge.ID);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ billsIDs = cbTools.isDef(baseFigures[figure.value]['fixedBill']) ? [baseFigures[figure.value]['fixedBill']['bill']['ID']] : [];
|
|
|
|
+ }
|
|
}
|
|
}
|
|
else if(figure.type === 'id'){
|
|
else if(figure.type === 'id'){
|
|
let node = cbTools.getNodeByID(figure.value);
|
|
let node = cbTools.getNodeByID(figure.value);
|
|
- bill = cbTools.isDef(node) ? node.data : null;
|
|
|
|
|
|
+ billsIDs = cbTools.isDef(node) ? [node.data.ID] : [];
|
|
}
|
|
}
|
|
- if(cbTools.isDef(bill) && checkStack(getRefStack([bill.ID]), sIDs)){
|
|
|
|
|
|
+ if(cbTools.isDef(billsIDs) && billsIDs.length > 0 && isCycle(billsIDs)){
|
|
console.log('循环计算');
|
|
console.log('循环计算');
|
|
calcBase.errMsg = '表达式出现循环计算';
|
|
calcBase.errMsg = '表达式出现循环计算';
|
|
return true;
|
|
return true;
|
|
@@ -1188,16 +1201,18 @@ let cbAnalyzer = {
|
|
}
|
|
}
|
|
return false;
|
|
return false;
|
|
}
|
|
}
|
|
- function getRefStack(billIDs){
|
|
|
|
|
|
+ function isCycle(billIDs){
|
|
stack = Array.from(new Set(stack.concat(billIDs)));
|
|
stack = Array.from(new Set(stack.concat(billIDs)));
|
|
for(let i = 0, len = billIDs.length; i < len; i++){
|
|
for(let i = 0, len = billIDs.length; i < len; i++){
|
|
let block = cbTools.getStackBlock(billIDs[i]);
|
|
let block = cbTools.getStackBlock(billIDs[i]);
|
|
if(block.length > 0){
|
|
if(block.length > 0){
|
|
stack = Array.from(new Set(stack.concat(block)));
|
|
stack = Array.from(new Set(stack.concat(block)));
|
|
- getRefStack(block);
|
|
|
|
|
|
+ if(checkStack(stack, sIDs)){
|
|
|
|
+ return true;
|
|
|
|
+ }
|
|
|
|
+ return isCycle(block);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
- return stack;
|
|
|
|
}
|
|
}
|
|
},
|
|
},
|
|
//四则运算合法性,控制不允许重复出现运算符,这里再判断一次,控制行引用只能F
|
|
//四则运算合法性,控制不允许重复出现运算符,这里再判断一次,控制行引用只能F
|