فهرست منبع

Merge branch 'budget' of http://192.168.1.41:3000/SmartCost/ConstructionCost into budget

vian 4 سال پیش
والد
کامیت
98d55170bf

+ 1 - 0
modules/all_models/project_glj.js

@@ -131,6 +131,7 @@ let modelSchema = {
     vender:String, //厂家
     qualityGrace:String,//质量等级
     brand:String,//品牌
+    premiumRate:Number,//采保费率
     subList:[Schema.Types.Mixed]
 };
 mongoose.model(collectionName, new Schema(modelSchema, {versionKey: false}));

+ 1 - 1
modules/glj/controllers/glj_controller.js

@@ -105,7 +105,7 @@ class GLJController extends BaseController {
         try {
             // 可编辑的字段
             let editableField = ['is_evaluate','unit_price.taxRate', 'unit_price.market_price', 'is_adjust_price', 'mix_ratio.consumption','is_eval_material','no_tax_eqp','is_coe_adjust','is_info_adjust','FI','FO','standardPrice','riskCoe',
-                'supply', 'supply_quantity','delivery_address','delivery','materialType','materialCoe','is_main_material','originPlace','vender','qualityGrace','brand','remark'];
+                'supply', 'supply_quantity','delivery_address','delivery','materialType','materialCoe','is_main_material','originPlace','vender','qualityGrace','brand','remark','premiumRate'];
             if (editableField.indexOf(field) < 0) {
                 throw '对应字段不能编辑';
             }

+ 9 - 9
modules/reports/controllers/rpt_controller.js

@@ -212,14 +212,14 @@ async function getAllPagesCommon(construct_id, user_id, prj_id, prj_ids, rpt_id,
             let promiseArr = [null, null, null];
             if (summaryRst.length > 0) {
                 if (summaryRst.indexOf(`Budget`) >= 0 || summaryRst.indexOf(`BudgetDetail`) >= 0) {
-                    promiseArr[0] = bill_facade.getBudgetSummary(construct_id); //与其他汇总类的请求互斥,不能同时出现!
-                    // if (flag.budgetSumType && flag.budgetSumType === 'budget_construct') {
-                    //     //建设项目level
-                    //     promiseArr[0] = bill_facade.getBudgetSummary(construct_id); //与其他汇总类的请求互斥,不能同时出现!
-                    // } else {
-                    //     //单项工程level
-                    //     promiseArr[0] = bill_facade.getSinglesBudgetSummary(construct_id); //与其他汇总类的请求互斥,不能同时出现!
-                    // }
+                    // promiseArr[0] = bill_facade.getBudgetSummary(construct_id, false); //与其他汇总类的请求互斥,不能同时出现!
+                    if (flag.budgetSumType && flag.budgetSumType === 'budget_single') {
+                        //单项工程level
+                        promiseArr[0] = bill_facade.getSinglesBudgetSummary(construct_id); //与其他汇总类的请求互斥,不能同时出现!
+                    } else {
+                        //建设项目level
+                        promiseArr[0] = bill_facade.getBudgetSummary(construct_id); //与其他汇总类的请求互斥,不能同时出现!
+                    }
                 }
                 if (summaryRst.indexOf(`Construct`) >= 0 || summaryRst.indexOf(`ConstructDetail`) >= 0) {
                     promiseArr[0] = pm_facade.getSummaryInfoByTender(prj_id, pm_facade.projectType.project);
@@ -281,7 +281,7 @@ async function getAllPagesCommon(construct_id, user_id, prj_id, prj_ids, rpt_id,
                     cb('Exception occurs while on going...', null);
                 }
             };
-        if (flag !== undefined && flag !== null && (flag.constructSumType === 'constructSum' || flag.auditType === 'audit_compare' || flag.budgetSumType === 'budget_single')) {
+        if (flag !== undefined && flag !== null && (flag.constructSumType === 'constructSum' || flag.auditType === 'audit_compare' || (flag.budgetSumType === 'budget_single' && summaryRst.indexOf(`BudgetDetail`) < 0))) {
                 //备注:原先这个功能是为了合并建设项目下所有的单位工程的数据,
                 //     现在发现就是通用型,审核对比也可以用这个逻辑把数据合并在一起再处理(审核对比的处理逻辑放在模板计算式里)
                 try {

+ 5 - 5
web/building_saas/main/html/main.html

@@ -80,7 +80,7 @@
         <li class="nav-item"><a data-toggle="tab" href="#calc_program_manage" id="tab_calc_program_manage" role="tab"
             style="display:none">总计算程序</a></li>
         <li class="nav-item"><a data-toggle="tab" href="#tender_price" id="tab_tender_price" role="tab" style="display:none">调价</a></li>
-     
+
         <li class="nav-item"><a data-toggle="tab" href="#reports" role="tab" id="tab_report"
             onclick="rptTplObj.iniPage();">报表</a></li>
         <li class="nav-item"><a data-toggle="tab" href="#index" id="tab_index" role="tab" style="display:none">指标信息</a>
@@ -174,7 +174,7 @@
                  <!--  <a id="menu_index_info" href="javascript:void(0);" style="display: none" class="dropdown-item"><i
                       class="fa fa-database" aria-hidden="true"></i> 指标信息</a> -->
                 </div>
-              </div> 
+              </div>
              <!--  <a href="javascript:void(0)" class="btn btn-light btn-sm" id="locate-sub">分项</a>
               <a href="javascript:void(0)" class="btn btn-light btn-sm" id="locate-measure">措施</a>
               <a href="javascript:void(0)" class="btn btn-light btn-sm" id="locate-other">其他</a> -->
@@ -281,9 +281,9 @@
                       <a class="nav-link sub-item" id="linkGCLMX" data-toggle="tab" href="#subSpread"
                         role="tab">工程量明细</a>
                     </li>
-                    <!--<li class="nav-item">-->
-                      <!--<a class="nav-link sub-item" id="linkJSCX" data-toggle="tab" href="#subSpread" role="tab">计算程序</a>-->
-                    <!--</li>-->
+                    <li class="nav-item">
+                      <a class="nav-link sub-item" id="linkJSCX" data-toggle="tab" href="#subSpread" role="tab">计算程序</a>
+                    </li>
                     <!-- <li class="nav-item">   2018-11-08  新需求,隐藏说明信息
                                       <a class="nav-link" data-toggle="tab" href="#comments" role="tab" id="linkComments">说明信息</a>
                                   </li>-->

+ 51 - 12
web/building_saas/main/js/models/calc_program.js

@@ -51,6 +51,15 @@ let calcTools = {
     isNullBill: function (treeNode) {
         return this.isLeafBill(treeNode) && (treeNode.children.length === 0) && (!treeNode.data.calcBase);
     },
+    // 无效的、影响正常计算的行(无意义的空行、没有金额的行等)
+    isInvalidNode: function (treeNode) {
+        return !(
+            treeNode.data &&
+            treeNode.data.feesIndex &&
+            treeNode.data.feesIndex.common &&
+            treeNode.data.feesIndex.common.totalFee
+        );
+    },
     isCalcBaseBill: function(treeNode){
         return this.isLeafBill(treeNode) && (treeNode.children.length === 0) && (treeNode.data.calcBase);
     },
@@ -1823,7 +1832,7 @@ class CalcProgram {
             me.innerCalcBillCustom(treeNode)
         // 定额:计算程序
         else
-            me.innerCalcRation2(treeNode, tenderType);
+            me.innerCalcRation(treeNode, tenderType);
 
         if (!calcTools.isTotalCostBill(treeNode))  // 已在上面的分支中计算过
             calcTools.estimateFee(treeNode);
@@ -2072,10 +2081,22 @@ class CalcProgram {
             if (calcTools.isVP_or_GLJR(treeNode)){
                 let u = treeNode.data.marketUnitFee ? treeNode.data.marketUnitFee : 0;
                 let t = (u * nQ).toDecimal(decimalObj.ration.totalPrice);
-                if (treeNode.data.marketTotalFee != t){
+                if ((treeNode.data.marketTotalFee != t) ||
+                    (!treeNode.data.feesIndex || !treeNode.data.feesIndex.common || (treeNode.data.feesIndex.common.totalFee != t))
+                ){
+
                     treeNode.data.marketTotalFee = t;
+                    let obj = {};
+                    obj.fieldName = 'common';
+                    obj.unitFee = u;
+                    obj.totalFee = t;
+                    obj.tenderUnitFee = obj.unitFee;
+                    obj.tenderTotalFee = obj.totalFee;
+                    calcTools.checkFeeField(treeNode, obj);
+                    me.deleteUselessFees(treeNode, budgetFields);
                     treeNode.changed = true;
                 } ;
+                return;
             };
         };
 
@@ -2089,6 +2110,33 @@ class CalcProgram {
 
             calcTools.initFees(treeNode);
 
+            // 只有人、材、机、主、设。
+            let sum = 0;
+            for (let i = 0; i < 5; i++) {
+                if (!rationCalcBases[budgetBaseNames[i]]){
+                    hintBox.infoBox('错误提示', `定额基数${hintBox.font('[' +funcNames[i] + ']')}未定义!`, 1);
+                    return;
+                }
+                let obj = {};
+                obj.fieldName = budgetFields[i];
+                obj.unitFee = (rationCalcBases[budgetBaseNames[i]](treeNode)).toDecimal(decimalObj.decimal('unitPrice', treeNode));
+                obj.totalFee = (obj.unitFee * nQ).toDecimal(decimalObj.decimal('totalPrice', treeNode));
+                obj.tenderUnitFee = obj.unitFee;
+                obj.tenderTotalFee = obj.totalFee;
+                sum = sum + obj.unitFee;
+                calcTools.checkFeeField(treeNode, obj);
+            };
+
+            let obj = {};
+            obj.fieldName = 'common';
+            obj.unitFee = obj.unitFee = sum.toDecimal(decimalObj.decimal('unitPrice', treeNode));
+            obj.totalFee = (obj.unitFee * nQ).toDecimal(decimalObj.decimal('totalPrice', treeNode));
+            obj.tenderUnitFee = obj.unitFee;
+            obj.tenderTotalFee = obj.totalFee;
+            calcTools.checkFeeField(treeNode, obj);
+
+            me.deleteUselessFees(treeNode, budgetFields);
+
             for (let idx of template.compiledSeq) {
                 let calcItem = template.calcItems[idx];
                 $CE.tempCalcItem = calcItem;
@@ -2102,17 +2150,7 @@ class CalcProgram {
                 let tExpr = analyzer.getCompiledTenderExpr(calcItem.compiledExpr);
                 calcItem.tenderUnitFee = (eval(tExpr) * feeRate * 0.01).toDecimal(decimalObj.decimal('unitPrice', treeNode));
                 calcItem.tenderTotalFee = (calcItem.tenderUnitFee * nTQ).toDecimal(decimalObj.decimal('totalPrice', treeNode));
-
-                if (calcItem.fieldName) {
-                    fnArr.push(calcItem.fieldName);
-                    calcTools.checkFeeField(treeNode, calcItem);
-                };
             };
-
-            if (tenderType == tenderTypes.ttReverseRation || tenderType == tenderTypes.ttReverseGLJ)
-              this.reverseTenderCalc(treeNode, tenderType);
-
-            me.deleteUselessFees(treeNode, fnArr);
         };
     };
 
@@ -2613,6 +2651,7 @@ class CalcProgram {
             let arr = [];
             for (let i = 0; i < tender_obj.tenderTree.items.length; i++) {
                 let node = tender_obj.tenderTree.items[i];
+                if (calcTools.isInvalidNode(node)) continue;
                 // 量价还是要参与,因为它贡献了金额,如果它的金额比重很大,它退出了,会导致其它结点过调。
                 // if (calcTools.isRationCategory(node) && (!calcTools.isVP_or_GLJR(node))){
                 if (calcTools.isRationCategory(node)){

+ 1 - 0
web/building_saas/main/js/views/glj_col.js

@@ -58,6 +58,7 @@ let gljCol = {
             {headerName: "三材类别", headerWidth: 70, dataCode: "materialType", hAlign: "center", dataType: "String",cellType:'comboBox',editorValueType:true,options:materialComboMap,spanRows: [2]},
             {headerName: "三材系数", headerWidth: 70, dataCode: "materialCoe", hAlign: "right", dataType: "Number",validator:"number",spanRows: [2]},//,decimalField:'material'
             {headerName: "交货方式", headerWidth: 70, dataCode: "delivery", hAlign: "left", dataType: "String",spanRows: [2]},
+            {headerName: "采保费率%", headerWidth: 70, dataCode: "premiumRate", hAlign: "right", dataType: "Number",validator:"number",spanRows: [2]},
             {headerName: "送达地点", headerWidth: 70, dataCode: "delivery_address", hAlign: "left", dataType: "String",spanRows: [2]},
             {headerName: "产地", headerWidth: 80, dataCode: "originPlace", hAlign: "left", dataType: "String",spanRows: [2]},
             {headerName: "厂家", headerWidth: 80, dataCode: "vender", hAlign: "left", dataType: "String",spanRows: [2]},

+ 3 - 1
web/building_saas/main/js/views/project_glj_view.js

@@ -1210,7 +1210,8 @@ let projectGljObject = {
       brand: glj.brand,
       unitPriceID: glj.unit_price.id,
       priceFrom: glj.unit_price.priceFrom,
-      remark: glj.remark
+      remark: glj.remark,
+      premiumRate:glj.premiumRate,
     };
     gljOprObj.setGLJPrice(data, glj);
 
@@ -1483,6 +1484,7 @@ let projectGljObject = {
         value = scMathUtil.roundForObj(value, getDecimal("material"));
       }
       if (dataCode == 'taxRate') value = scMathUtil.roundToString(value, 2);
+      if (dataCode == 'premiumRate') value = scMathUtil.roundToString(value, getDecimal('feeRate'));
 
       extend = Object.keys(extend).length > 0 ? JSON.stringify(extend) : '';
       if (recode[dataCode] == value) return;