Explorar el Código

Merge branch '1.0.0_online' of http://smartcost.f3322.net:3000/SmartCost/ConstructionCost into 1.0.0_online

Conflicts:
	web/over_write/js/chongqing_2018.js
chenshilong hace 6 años
padre
commit
a034ae06a5

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

+ 1 - 1
modules/reports/rpt_component/jpc_flow_tab.js

@@ -946,7 +946,7 @@ JpcFlowTabSrv.prototype.createNew = function(){
             if (pageStatus[band[JV.BAND_PROP_DISPLAY_TYPE]]) {
                 let tab_fields = me.page_sum_tab_fields;
                 for (let i = 0; i < tab_fields.length; i++) {
-                    let cellItem = JpcCommonOutputHelper.createCommonOutput(tab_fields[i], me.pageSumValLst[page - 1], controls);
+                    let cellItem = JpcCommonOutputHelper.createCommonOutput(tab_fields[i], me.pageSumValLst[page - 1][i], controls);
                     cellItem[JV.PROP_AREA] = JpcAreaHelper.outputArea(tab_fields[i][JV.PROP_AREA], band, unitFactor, 1, 0, 1, 0, me.multiCols, 0, true, false);
                     rst.push(cellItem);
                 }

+ 1 - 1
modules/reports/util/rpt_construct_data_util.js

@@ -1235,7 +1235,7 @@ function pri_getFee(dItem, feeKey, dtlFeeKey) {
         }
     } else if (dItem[feeKey]) {
         hasValue = true;
-        rst = dItem[feeKey];
+        rst = parseFloat(dItem[feeKey]);
     } else {
         hasValue = true;
         rst = 0;

+ 5 - 5
test/unit/reports/test_rpt_test_template.js

@@ -32,8 +32,8 @@ let demoPrjId = - 1;
 // let demoRptId = 361; //封1
 // let demoRptId = 279; //表04
 // let demoRptId = 261; //封3
-// let demoRptId = 232; //09
-let demoRptId = 280; //11-1 暂列金
+let demoRptId = 301; //09
+// let demoRptId = 280; //11-1 暂列金
 // let demoRptId = 2260; //测试基本信息
 let pagesize = "A4";
 //288: 11-2表(新)
@@ -44,7 +44,7 @@ let userId_Leng = "5acac1e885bf55000bd055ba"; //小冷User Id2
 // demoPrjId = 720; //QA: DW3
 //demoPrjId = 1626; //QA:
 // demoPrjId = 2260; //QA:
-demoPrjId = 3602; //QA:
+demoPrjId = 3440; //QA:
 //*/
 let userId_Dft = userId_Leng;
 // let userId_Dft = "5a025c4c15074d134c2b9689";
@@ -77,8 +77,8 @@ test('测试 - 测试模板啦: ', function (t) {
                 try {
                     // fsUtil.writeObjToFile(rawDataObj, "D:/GitHome/ConstructionCost/tmp/rptTplRawDataObject_测试模板.jsp");
                     let tplData = rptDataUtil.assembleData(rawDataObj);
-                    // fsUtil.writeObjToFile(rawDataObj, "D:/GitHome/ConstructionCost/tmp/rptTplRawDataAfterCacl_测试模板.jsp");
-                    // fsUtil.writeObjToFile(tplData, "D:/GitHome/ConstructionCost/tmp/rptTplAssembledData_测试模板.jsp");
+                    fsUtil.writeObjToFile(rawDataObj, "D:/GitHome/ConstructionCost/tmp/rptTplRawDataAfterCacl_测试模板.jsp");
+                    fsUtil.writeObjToFile(tplData, "D:/GitHome/ConstructionCost/tmp/rptTplAssembledData_测试模板.jsp");
                     //it's time to build the report!!!
                     let printCom = JpcEx.createNew();
                     rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_PAGE_SIZE] = pagesize;

+ 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

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

+ 5 - 0
web/building_saas/pm/html/project-management.html

@@ -326,6 +326,11 @@
                         <select style="margin-left: 5px; border-radius: .25rem;" class="form-control" id="tender-engineering"></select>
                     </div>
                     <span class="form-text text-danger" id="engineering-info" style="display: none;">请选择工程专业</span>
+                    <div style="margin-top: 15px;" class="input-group">
+                        <label style="margin-top: 8px;">费用标准</label>
+                        <select style="margin-left: 5px; border-radius: .25rem;" class="form-control" id="tender-feeStandard"></select>
+                    </div>
+                    <span class="form-text text-danger" id="feeStandard-info" style="display: none;">请选择费用标准</span>
                     <div style="margin-top: 15px;" class="input-group" id="taxType_div">
                         <label style="margin-top: 8px;">计税方式</label>
                         <select style="margin-left: 5px; border-radius: .25rem;" class="form-control" id="taxType">

+ 89 - 46
web/building_saas/pm/js/pm_newMain.js

@@ -1177,6 +1177,7 @@ $(document).ready(function() {
     //选择计价规则
     $("#valuation").change(function () {
         let engineeringList = getEngineeringList();
+        console.log(engineeringList);
         let engineeringHtml = getEngineeringHtml(engineeringList);
         $("#tender-engineering").html(engineeringHtml);
         $('#valuation-info').hide();
@@ -1519,28 +1520,52 @@ $(document).ready(function() {
     });
     function changeEngineering(){
         $('#engineering-info').hide();
-        let engineeringList = getEngineeringList();
-        if(engineeringList.length > 0){
-            let selectedEngineering = $("#tender-engineering").val();
-            let currentLib = {};
-            for(let engineering of engineeringList) {
-                if (engineering.engineering_id === selectedEngineering) {
-                    currentLib = engineering.lib;
-                }
+        initFeeStandardSel();
+    }
+
+    function changeFeeRate(engLib) {
+        if(engLib){
+            if (engLib.fee_lib !== undefined && engLib.fee_lib.length > 0) {
+                $("#tender-fee-rate").children("option").first().val("newFeeRate-"+engLib.fee_lib[0].id);
             }
+            $("#tender-engineering").parent().siblings('.hidden-area').slideDown('fast');
+        }
+        else {
+            $("#tender-fee-rate").children("option").first().val($('#tender-name').val());
+        }
+    }
 
-            if (Object.keys(currentLib).length > 0) {
-                // 输出数据到页面
-                if (currentLib.fee_lib !== undefined && currentLib.fee_lib.length > 0) {
-                    $("#tender-fee-rate").children("option").first().val("newFeeRate-"+currentLib.fee_lib[0].id);
-                }
-                $("#tender-engineering").parent().siblings('.hidden-area').slideDown('fast');
+    function initFeeStandardSel() {
+        $('#tender-feeStandard').empty();
+        let feeStandards = [];
+        let engineeringList = getEngineeringList();
+        let currentEngName = $('#tender-engineering').val();
+        for(let eng of engineeringList){
+            if(eng.lib.name && eng.lib.name === currentEngName && eng.lib.feeName && eng.lib.feeName !== ''){
+                feeStandards.push(eng.lib.feeName);
             }
         }
+        for(let feeName of feeStandards){
+            let $opt = $(`<option value="${feeName}">${feeName}</option>`);
+            $('#tender-feeStandard').append($opt);
+        }
+        if(feeStandards.length > 0){
+            if($('#feeStandard-info').is(':visible')){
+                $('#feeStandard-info').hide();
+            }
+        }
+        let currentEngLib = getEngineeringLib(currentEngName + $('#tender-feeStandard').val(), engineeringList);
+        changeFeeRate(currentEngLib);
         setTaxGroupHtml();
         getStdCalcProgramFiles();
     }
 
+    function changeFeeStandard() {
+        let currentEngLib = getEngineeringLib($('#tender-engineering').val() + $('#tender-feeStandard').val(), getEngineeringList());
+        changeFeeRate(currentEngLib);
+        setTaxGroupHtml();
+        getStdCalcProgramFiles();
+    }
 
     function setTaxGroupHtml() {
         let groups = getTaxGroupList();
@@ -1589,6 +1614,9 @@ $(document).ready(function() {
     $("#tender-engineering").change(function() {
         changeEngineering()
     });
+    $('#tender-feeStandard').change(function () {
+       changeFeeStandard();
+    });
 });
 
 //获取工作表总宽度
@@ -1959,6 +1987,18 @@ function AddSiblingsItem(selected, name, property, type, existCallback, sucCallb
     }
 }
 
+//根据工程专业名称+费用标准名称获取工程专业库
+function getEngineeringLib(cascadeName, engineeringList) {
+    for(let eng of engineeringList){
+        let engName = eng.lib.name ? eng.lib.name : '';
+        let engFeeName = eng.lib.feeName ? eng.lib.feeName : '';
+        if(cascadeName === engName + engFeeName){
+            return eng.lib;
+        }
+    }
+    return null;
+}
+
 function getEngineeringList(){
     let valuation = $("#valuation").val();
     let valuationType = $("input[name='valuation_type']:checked").val();
@@ -1978,8 +2018,20 @@ function getEngineeringList(){
 function getTaxGroupList(type){//getcalcProgramList
     let egrs = getEngineeringList();
     let groupList = [];
-    let egrID = $("#tender-engineering").val();
-    for(let egr of egrs) {
+    //let egrID = $("#tender-engineering").val();
+    let engLib = getEngineeringLib($('#tender-engineering').val() + $('#tender-feeStandard').val(), egrs);
+    if(engLib){
+        if(type){//是否要过滤,如果这个参数不传,则返回整个数组;
+            for(let group of engLib.tax_group){
+                if(group.taxType == type && group.program_lib){
+                    groupList.push(group);
+                }
+            }
+        }else {
+            groupList = engLib.tax_group;
+        }
+    }
+    /*for(let egr of egrs) {
         if (egr.engineering_id == egrID && egr.lib) {
             if(type){//是否要过滤,如果这个参数不传,则返回整个数组;
                 for(let group of egr.lib.tax_group){
@@ -1991,7 +2043,7 @@ function getTaxGroupList(type){//getcalcProgramList
                 groupList = egr.lib.tax_group;
             }
         }
-    }
+    }*/
     return groupList;
 }
 
@@ -2270,24 +2322,29 @@ function AddTender() {
         let feeFileObj = getAddTenderFile(tenderName, $('#tender-fee-rate'), $("#tender-fee-rate").children());
 
         let valuation = $("#valuation").val();
-        if(valuation === ''){
+        if(!valuation || valuation === ''){
             setDangerInfo($('#valuation-info'), '请选择计价规则');
             return false;
         }
 
-        let engineering_id = $("#tender-engineering").val();
-        if (engineering_id === '') {
+        let engineeringName = $("#tender-engineering").val();
+        if (!engineeringName || engineeringName === '') {
             setDangerInfo($('#engineering-info'), '请选择工程专业');
             return false;
         }
+        let feeName = $('#tender-feeStandard').val();
+        if(!feeName || feeName === ''){
+            setDangerInfo($('#feeStandard-info'), '请选择费用标准');
+            return false;
+        }
 
         let taxType = $("#taxType").val();
-        if(taxType ===""){
+        /*if(!taxType || taxType ===""){
             return false;
-        }
+        }*/
 
         let IDGroup = $("#tender-calcProgram").val();
-        if (IDGroup === '') {
+        if (!IDGroup || IDGroup === '') {
             setDangerInfo($('#calcProgram-info'), '请选择计算程序');
             return false;
         }
@@ -2313,19 +2370,14 @@ function AddTender() {
                 break;
             }
         }
-        let libs = null;
-        for(let tmp of engineeringList) {
-            if (tmp.engineering_id == engineering_id) {
-                engineering = tmp.engineering;
-                libs = tmp.lib;
-                break;
-            }
+        let libs = getEngineeringLib(engineeringName + feeName, engineeringList);
+        if(!libs){
+            alert('数据错误,无法确定工程专业库!');
+            return;
         }
         // 一个项目里面,这两个文件必须得有,而界面又没有像费率、单价文件那样给出可选项。所以这里给出提示。
         if (!libs.artificial_lib)  throw '编办没有绑定人工系数标准文件';
-        //if (!libs.program_lib)  throw '编办没有绑定计算程序标准文件';
 
-        let engineeringName = $('#tender-engineering').children("option:selected").text();
         let calcProgramName = $('#tender-calcProgram').children("option:selected").text();
 
         let callback = function() {
@@ -2346,8 +2398,9 @@ function AddTender() {
             valuation: valuation,
             valuationType: valuationType,
             valuationName: valuationName,
-            engineering: engineering,
-            engineering_id: engineering_id,
+            isInstall: libs.isInstall !== undefined ? libs.isInstall : false,
+            engineering: libs.engineering,
+            engineering_id: libs._id,
             engineeringName: engineeringName,
             unitPriceFile: {name: unitPriceFileObj.name, id: unitPriceFileObj.id},
             feeFile: {name: feeFileObj.name, id: feeFileObj.id},
@@ -2679,7 +2732,7 @@ function GetTargetTreeNode(zTreeObj) {
  * @param {Array} engineeringList
  * @return {String}
  */
-function getEngineeringHtml(engineeringList) {
+function getEngineeringHtml(engineeringList) {//
     let result = '';
     if (engineeringList.length <= 0) {
         return result;
@@ -2691,18 +2744,8 @@ function getEngineeringHtml(engineeringList) {
 
     for(let i = 0; i < engineeringList.length; i++){
         let tmp = engineeringList[i];
-        result += `<option ${i === 0 ? 'selected' : ''} value="${tmp.engineering_id}">${tmp.lib.name}</option>`;
-        /*if (engineeringObject[tmp.engineering] !== undefined) {
-            result += `<option ${i === 0 ? 'selected' : ''} value="${tmp.engineering}">${engineeringObject[tmp.engineering]}</option>`;
-        }*/
+        result += `<option ${i === 0 ? 'selected' : ''} value="${tmp.lib.name}">${tmp.lib.name}</option>`;
     }
-
-    /*for(let tmp of engineeringList) {
-        if (engineeringObject[tmp.engineering] !== undefined) {
-            result += '<option value="'+ tmp.engineering +'">'+ engineeringObject[tmp.engineering] +'</option>';
-        }
-    }*/
-
     return result;
 }
 

+ 1 - 1
web/building_saas/report/html/rpt_main.html

@@ -74,7 +74,7 @@
                                     <button type="button" class="btn btn-outline-primary btn-sm" data-toggle="tooltip" data-placement="bottom" title="首页" onclick="rptControlObj.firstPage(this)"><i class="fa fa-angle-double-left"></i></button>
                                     <button type="button" class="btn btn-outline-primary btn-sm" data-toggle="tooltip" data-placement="bottom" title="上一页" onclick="rptControlObj.prePage(this)"><i class="fa fa-angle-left"></i></button>
                                 </span>
-                                <input class="form-control" id="rpt_page_num" value="" onKeydown="rptControlObj.onKeydown(event, this)" style="width:60px"  data-toggle="tooltip" data-placement="bottom" title="输入页码按回车键,快速跳转">
+                                &nbsp<input class="form-control" id="rpt_page_num" value="" onKeydown="rptControlObj.onKeydown(event, this)" style="width:60px"  data-toggle="tooltip" data-placement="bottom" title="输入页码按回车键,快速跳转">&nbsp
                                 <span class="input-group-btn">
                                     <button type="button" class="btn btn-outline-primary btn-sm" data-toggle="tooltip" data-placement="bottom" title="下一页" onclick="rptControlObj.nextPage(this)"><i class="fa fa-angle-right"></i></button>
                                     <button type="button" class="btn btn-outline-primary btn-sm" data-toggle="tooltip" data-placement="bottom" title="尾页" onclick="rptControlObj.lastPage(this)"><i class="fa fa-angle-double-right"></i></button>

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

@@ -201,3 +201,74 @@ var cpFeeTypes2018 = [
 ];
 cpFeeTypes.splice(0, cpFeeTypes.length);
 for (let e of cpFeeTypes2018) cpFeeTypes.push(e);
+
+
+//清单计算基数相关
+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']}
+};
+
+