Ver código fonte

重庆18清单基数、清单固定行新增增值税

zhongzewei 7 anos atrás
pai
commit
ed31fde075

+ 3 - 0
modules/all_models/stdRation_ration.js

@@ -34,6 +34,9 @@ const rationItemSchema = new Schema({
     name: String,
     unit: String,
     basePrice: Number,
+    labourPrice: Number,
+    materialPrice: Number,
+    machinePrice: Number,
     sectionId: Number,
     rationRepId: Number,
     caption: String,

+ 3 - 1
modules/common/const/bills_fixed.js

@@ -39,7 +39,9 @@ const fixedFlag = {
     // 税金
     TAX: 18,
     //工程造价
-    ENGINEERINGCOST: 19
+    ENGINEERINGCOST: 19,
+    //增值税
+    ADDED_VALUE_TAX: 20
 };
 
 export default fixedFlag;

+ 127 - 31
web/building_saas/main/js/models/calc_base.js

@@ -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;

+ 3 - 1
web/building_saas/main/js/models/main_consts.js

@@ -229,7 +229,9 @@ const fixedFlag = {
     // 税金
     TAX: 18,
     //工程造价
-    ENGINEERINGCOST: 19
+    ENGINEERINGCOST: 19,
+    //增值税
+    ADDED_VALUE_TAX: 20
 };
 
 const gljKeyArray =['code','name','specs','unit','type'];

+ 1 - 0
web/building_saas/pm/js/pm_newMain.js

@@ -1169,6 +1169,7 @@ $(document).ready(function() {
         $("#valuation").html(html);
         //$("#tender-engineering").html('<option value="">请选择对应的工程专业</option>');
         let engineeringList = getEngineeringList();
+        console.log(engineeringList);
         let engineeringHtml = getEngineeringHtml(engineeringList);
         $("#tender-engineering").html(engineeringHtml);
         changeEngineering();

+ 68 - 0
web/over_write/js/chongqing_2018.js

@@ -128,3 +128,71 @@ else {
     alert(s);
 }
 
+//清单计算基数相关
+if(typeof baseFigureMap !== 'undefined'){
+    let oldNames = [
+        '分部分项定额基价人工费',
+        '分部分项定额基价材料费',
+        '分部分项定额基价机械费',
+        '组织措施项目定额基价人工费',
+        '组织措施项目定额基价材料费',
+        '组织措施项目定额基价机械费',
+        '技术措施项目定额基价人工费',
+        '技术措施项目定额基价材料费',
+        '技术措施项目定额基价机械费',
+        '机械价差',
+        '分部分项机械价差',
+    ];
+    let newNames = [
+        '分部分项定额人工费',
+        '分部分项定额材料费',
+        '分部分项定额施工机具使用费',
+        '组织措施项目定额人工费',
+        '组织措施项目定额材料费',
+        '组织措施项目定额施工机具使用费',
+        '技术措施项目定额人工费',
+        '技术措施项目定额材料费',
+        '技术措施项目定额施工机具使用费',
+        '施工机具使用费价差',
+        '分部分项施工机具使用费价差',
+    ];
+    changePropNames(baseFigureMap, oldNames, newNames);
+    let deleteNames = [
+        '分部分项定额基价直接工程费',
+        '分部分项调整人工费',
+        '分部分项调整机上人工费',
+        '分部分项设备费',
+        '分部分项未计价材料费',
+        '组织措施项目定额基价直接工程费',
+        '技术措施项目定额基价直接工程费',
+        '技术措施项目调整人工费',
+        '技术措施项目调整机上人工费',
+        '技术措施项目设备费',
+        '技术措施项目未计价材料费',
+        '分包费',
+        '分包定额基价人工费',
+        '分包定额基价材料费',
+        '分包定额基价机械费',
+        '分包主材费',
+        '分包设备费',
+        '分包人工工日',
+    ];
+    deletePropNames(baseFigureMap, deleteNames);
+    baseFigureMap['增值税'] = {base: 'ZZS', class: 'SJ', fixedFlag: fixedFlag.ADDED_VALUE_TAX};
+}
+if(typeof baseFigureTemplate !== 'undefined'){
+    baseFigureTemplate['ZZS'] =  function (tender) {//增值税
+        if(cbTools.isUnDef(calcBase.fixedBills[fixedFlag.ADDED_VALUE_TAX])){
+            return 0;
+        }
+        const totalFeeType = tender ? 'tenderTotalFee' : 'totalFee';
+        let bill = calcBase.fixedBills[fixedFlag.ADDED_VALUE_TAX]['bill'];
+        if(cbTools.isUnDef(bill)) return 0;
+        if(cbTools.isUnDef(bill.feesIndex) || Object.keys(bill.feesIndex).length === 0) return 0;
+        return cbTools.isDef(bill.feesIndex.common) && cbTools.isDef(bill.feesIndex.common[totalFeeType]) ? bill.feesIndex.common[totalFeeType] : 0;
+    };
+}
+if(typeof figureClassTemplate !== 'undefined'){
+    figureClassTemplate['ADDED_VALUE_TAX'] = {flag: fixedFlag.ADDED_VALUE_TAX, filter: ['SJ', 'ZZS', 'SQGCZJ']}
+}
+