Browse Source

面积增加费

zhangweicheng 5 năm trước cách đây
mục cha
commit
9e983ab4a2

+ 1 - 0
config/gulpConfig.js

@@ -151,6 +151,7 @@ module.exports = {
         'web/building_saas/main/js/views/confirm_modal.js',
         'web/building_saas/main/js/views/zlfb_view.js',
         'web/building_saas/main/js/views/installation_fee_view.js',
+        'web/building_saas/main/js/views/area_increase_fee_view.js',
         'web/building_saas/main/js/views/material_adjust_view.js',
         'web/building_saas/main/js/views/config_material_view.js',
         'web/building_saas/main/js/views/index_view.js',

+ 2 - 0
modules/all_models/bills.js

@@ -65,6 +65,8 @@ let billsSchema = new Schema({
     deleteInfo: deleteSchema,
     isEstimate:{type: Number,default:0},       // 1 true 0 false 是否暂估
     mainBills:{type:Schema.Types.Mixed,default:false},//true 是,false否,null 不确定,三个状态
+    //是否记取面积增加费
+    areaIncreaseFee:{type:Schema.Types.Mixed,default:false},//true 是,false否,null 不确定,三个状态
     outPutMaxPrice:{type:Schema.Types.Mixed,default:false},//输出最高限价 true 是,false否,null 不确定,三个状态
     maxPrice:String,//最高限价
     remark:String,

+ 2 - 0
modules/all_models/ration.js

@@ -76,6 +76,8 @@ let rationSchema = new Schema({
     // 工作内容 (选择自清单)
     jobContentText: String,
     manageFeeRate:String,//管理费率
+    //是否记取面积增加费
+    areaIncreaseFee:{type:Schema.Types.Mixed,default:false},//true 是,false否,null 不确定,三个状态
 
     //工料机特有属性
     projectGLJID:Number,  //项目工料机ID

+ 7 - 1
modules/main/facade/project_facade.js

@@ -284,7 +284,13 @@ async function updateNodes(datas){
             }else if(type == projectConsts.RATION){
                 //处理面积增加费的数据
                 if(node.data.hasOwnProperty("areaIncreaseFee")){
-                    let t = await glj_calculate_facade.calculateQuantity({rationID:node.data.ID},true,false,node.data.areaIncreaseFee);
+                    let areaSetting = null;
+                    if(nodeGroups[projectConsts.PROJECT]){
+                        for(let pn of nodeGroups[projectConsts.PROJECT]){
+                            if(pn.data['property.areaSetting']) areaSetting = pn.data['property.areaSetting'];
+                        }
+                    }
+                    let t = await glj_calculate_facade.calculateQuantity({rationID:node.data.ID},true,false,node.data.areaIncreaseFee,areaSetting);
                     node.data.adjustState = t.adjustState;
                 }
                 rationTasks.push(getTask(node));

+ 37 - 5
modules/ration_glj/facade/glj_calculate_facade.js

@@ -10,6 +10,7 @@ let ration = mongoose.model('ration');
 let ration_coe = mongoose.model('ration_coe');
 let std_ration_lib_ration_items = mongoose.model('std_ration_lib_ration_items');
 let std_glj_lib_gljList_model = mongoose.model('std_glj_lib_gljList');
+let project_model = mongoose.model('projects');
 let glj_type_util = require('../../../public/cache/std_glj_type_util');
 const scMathUtil = require('../../../public/scMathUtil').getUtil();
 let decimal_facade = require('../../main/facade/decimal_facade');
@@ -19,7 +20,7 @@ module.exports={
     calculateQuantity:calculateQuantity,
     getGLJTypeByID:getGLJTypeByID
 }
-//辅助定额调整、替换工料机、标准附注条件调整、添加工料机、自定义消耗量(包括删除工料机)、自定义乘系数、市场单价调整
+//辅助定额调整、替换工料机、标准附注条件调整、添加工料机、自定义消耗量(包括删除工料机)、自定义乘系数、面积增加、市场单价调整
 let stateSeq ={
     ass:1,
     replace:2,
@@ -27,7 +28,8 @@ let stateSeq ={
     add:4,
     cusQuantity:5,
     cusCoe:6,
-    adjMak:7
+    area:7,
+    adjMak:8
 };
 //自定义乘系数与定额工料机类型映射表
 let coeTypeMap = {
@@ -40,7 +42,7 @@ let coeTypeMap = {
 };
 
 
-async function calculateQuantity(query,noNeedCal,refreshRationName = false){
+async function calculateQuantity(query,noNeedCal,refreshRationName = false,areaIncreaseFee,areaSetting){
     try {
          let  result ={
              glj_result:[],
@@ -55,6 +57,7 @@ async function calculateQuantity(query,noNeedCal,refreshRationName = false){
          if(!impactRation){//如果定额不存在或者已删除,返回空
              return null;
          }
+        if(areaIncreaseFee !== null || areaIncreaseFee !== undefined) impactRation.areaIncreaseFee = areaIncreaseFee;
          if(impactRation._doc.hasOwnProperty("rationAssList")&&impactRation.rationAssList.length>0){
              let temTimes = [];
              let thirdRationCodes=[];
@@ -89,6 +92,8 @@ async function calculateQuantity(query,noNeedCal,refreshRationName = false){
          if(noNeedCal==null && result.glj_result.length > 0){
             await ration_glj.bulkWrite(generateUpdateTasks(result.glj_result));
          }
+         if(impactRation.areaIncreaseFee == true) await setAreaAdjustState(impactRation.projectID,adjustState,areaSetting);
+
          adjustState= _.sortByOrder(adjustState, ['index'], ['asc']);
          adjustState=_.map(adjustState, _.property('content'));
          let adjustStateString = adjustState.join(';');
@@ -98,7 +103,8 @@ async function calculateQuantity(query,noNeedCal,refreshRationName = false){
              setData.name = newName;
              result.rationName = newName;
          }
-         await ration.update({ID:query.rationID},setData);
+         //如果uareaIncreaseFee有值说明是从其它更新定额的地方进来的,后面会一起更新
+         if(areaIncreaseFee === null || areaIncreaseFee === undefined) await ration.update({ID:query.rationID},setData);
          result.adjustState=adjustStateString;
          return result;
     }catch (err){
@@ -107,6 +113,31 @@ async function calculateQuantity(query,noNeedCal,refreshRationName = false){
     }
 }
 
+async function setAreaAdjustState(projectID,adjustState,areaSetting){
+    if(!areaSetting){
+        let project =  await project_model.findOne({ID:projectID},'property.areaSetting');
+        areaSetting = project.property.areaSetting;
+    }
+    if(areaSetting){
+        let stringArr = [];
+        let labour = getStr(areaSetting.labour);
+        let material = getStr(areaSetting.material);
+        let machine  = getStr(areaSetting.machine);
+        if(labour !="") stringArr.push(`人工*${labour}`);
+        if(material !="") stringArr.push(`材料*${material}`);
+        if(machine !="") stringArr.push(`机械*${machine}`);
+        if(stringArr.length > 0){
+            adjustState.push({index:stateSeq.area,content:`面积:${stringArr.join(',')}`});//面积:人工*1.1,材料*1.015”。
+        }
+    }
+
+    function getStr(num) {
+        if(num != 0) return 1 + num/100;
+        return "";
+    }
+
+}
+
 function quantityUpdateCheck(glj,r) {//检查,有改变的才更新
     for(let key in r.doc){
         if(glj._doc[key] != r.doc[key]) return true
@@ -259,7 +290,8 @@ function generateAdjustState(glj,coeList,adjustState,gljList,quantity) {
         for(let i=0;i<coeList.length;i++){
             if(coeList[i].isAdjust==1){
                 if(i==coeList.length-1){
-                    adjustState.push({index:stateSeq.cusCoe,content:getContent(coeList[i].coes)});//自定义乘系数要去掉倍数为1的
+                    let cus_content = getContent(coeList[i].coes);
+                    if(cus_content !="") adjustState.push({index:stateSeq.cusCoe,content:cus_content});//自定义乘系数要去掉倍数为1的
                 }else {
                     if(coeList[i].select_code && coeList[i].select_code!=""){
                         _.remove(adjustState,{'content':coeList[i].original_code+'换'+coeList[i].select_code});//去掉替换工料机自动生成的调整状态

+ 5 - 0
public/web/number_util.js

@@ -33,5 +33,10 @@ var  number_util = {
             value = scMathUtil.roundTo(Number(obj),-decimal);
         }
         return value.toFixed(decimal);
+    },
+    isNum(thisValue){
+        var regPos = /^\d+(\.\d+)?$/; //非负浮点数
+        var regNeg = /^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$/; //负浮点数
+        return (regPos.test(thisValue) || regNeg.test(thisValue));
     }
 }

+ 38 - 0
web/building_saas/main/html/main.html

@@ -2278,6 +2278,43 @@
     </div>
 </div>
 
+
+<!--弹出 面积增加费窗口-->
+<div class="modal fade" id="areaIncreaseFeeDiv" data-backdrop="static">
+    <div class="modal-dialog" role="document">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="modal-title">建筑面积500m2以下的调整</h5>
+                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                    <span aria-hidden="true">&times;</span>
+                </button>
+            </div>
+            <div class="modal-body">
+                <fieldset class="form-group"  style="border:1px solid #b3b3b3;padding: 15px">
+                    <legend class="legend" style="font-size:16px">设置系数</legend>
+                    <div style="margin-top:-20px">请输入调整的百分比比例,0代表不调整,负数表示下调(不小于-100)</div>
+                    <br>
+                    <div class="form-group">
+                        <label >人工(%)</label>
+                        <input class="form-control" id="areaIncreaseFee_labour" value="">
+                        <label >材料(%)</label>
+                        <input class="form-control" id="areaIncreaseFee_material" value="">
+                        <label >机械(%)</label>
+                        <input class="form-control" id="areaIncreaseFee_machine" value="">
+                    </div>
+                </fieldset>
+
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-primary" id="areaIncreaseFeeConfirm">确定</button>
+                <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
+            </div>
+        </div>
+    </div>
+</div>
+
+
+
     <img src="/web/dest/css/img/folder_open.png" id="folder_open_pic" style="display: none">
     <img src="/web/dest/css/img/folder_close.png" id="folder_close_pic" style="display: none">
     <img src="/web/dest/css/img/project.png" id="proj_pic" style="display: none">
@@ -2409,6 +2446,7 @@
     <script type="text/javascript" src='/web/building_saas/main/js/views/confirm_modal.js'></script>
     <script type="text/javascript" src='/web/building_saas/main/js/views/zlfb_view.js'></script>
     <script type="text/javascript" src='/web/building_saas/main/js/views/installation_fee_view.js'></script>
+    <script type="text/javascript" src='/web/building_saas/main/js/views/area_increase_fee_view.js'></script>
     <script type="text/javascript" src='/web/building_saas/main/js/views/material_adjust_view.js'></script>
     <script type="text/javascript" src='/web/building_saas/main/js/views/config_material_view.js'></script>
     <script type="text/javascript" src='/web/building_saas/main/js/views/index_view.js'></script>

+ 28 - 1
web/building_saas/main/js/models/project.js

@@ -410,6 +410,20 @@ var PROJECT = {
             }
             return true;
         };
+        project.prototype.updateProjectProperty = function(datas,field,callback){
+            let pfield = "property."+field;
+            let tem ={
+                type:'project',
+                data:{ID:projectObj.project.ID()}
+            };
+            tem.data[pfield] = datas;
+
+            projectObj.project.updateNodes([tem],function () {
+                projectObj.project.property[field] = datas;
+                if(callback) callback();
+            })
+
+        };
         project.prototype.updateCasCadeBills = function(node,newval,fieldName){
             let datas = [];
             let data =  {
@@ -474,7 +488,6 @@ var PROJECT = {
                 data[fieldName] = avalue;
                 if(fieldName == "outPutMaxPrice") data.maxPrice = null;
             }
-
         };
         project.prototype.updateNodesAndRefresh=function (datas,callback) {
             let me = this;
@@ -484,6 +497,18 @@ var PROJECT = {
             })
         };
 
+        project.prototype.syncUpdateNodesAndRefresh =async function (datas) {
+            let me = this;
+            return new Promise(function (resolve, reject) {
+                me.updateNodes(datas,function (result) {
+                    let nodes = me.updateNodesCache(result);
+                    projectObj.mainController.refreshTreeNode(nodes);
+                    resolve(nodes);
+                });
+            });
+        };
+
+
         project.prototype.updateNodes = function (datas,callback) {
           /*  let datas = [
                 {
@@ -522,6 +547,8 @@ var PROJECT = {
                         temObj = temNode.data;
                         refreshNode.push(temNode);
                     }
+                }else if(d.type == ModuleNames.project){
+                    temObj = this;
                 }else {//其它类型,更新datas
                     temObj = _.find(this[d.type].datas,{"ID":d.data.ID});
                 }

+ 95 - 2
web/building_saas/main/js/views/area_increase_fee_view.js

@@ -6,8 +6,8 @@ let areaIncreaseFeeObj = {
         if(!gljUtil.isDef(projectObj.project.property.areaSetting)){
             let data={
                 labour:10,
-                machine:1.5,
-                material:0
+                material:1.5,
+                machine:0,
             };
             projectObj.project.updateProjectProperty(data,"areaSetting")
         }
@@ -23,6 +23,8 @@ let areaIncreaseFeeObj = {
         datas.push(data);
         setChildren(node,newval,datas);//同步设置所有子项
         let nodes = await projectObj.project.syncUpdateNodesAndRefresh(datas);
+        projectObj.project.calcProgram.calcNodesAndSave(nodes);
+
 
         function setChildren(pnode,newValue,datas) {//同步设置所有子项
             if(pnode.children.length > 0 && (pnode.children[0].sourceType == ModuleNames.bills || pnode.children[0].sourceType == ModuleNames.ration)){//设置子项
@@ -41,6 +43,97 @@ let areaIncreaseFeeObj = {
             data[fieldName] = avalue;
             if(fieldName == "outPutMaxPrice") data.maxPrice = null;
         }
+    },
+    confirmAreaIncreaseFeeSetting:async function () {
+        let labour = $("#areaIncreaseFee_labour").val();
+        let material = $("#areaIncreaseFee_material").val();
+        let machine = $("#areaIncreaseFee_machine").val();
+        if(!settingNumCheck(labour,"人工")) return;
+        if(!settingNumCheck(material,"材料")) return;
+        if(!settingNumCheck(machine,"机械")) return;
+
+        let areaSetting = {
+            labour:scMathUtil.roundForObj(labour,2),
+            material:scMathUtil.roundForObj(material,2),
+            machine:scMathUtil.roundForObj(machine,2)
+        };
+        let tem ={
+            type:'project',
+            data:{ID:projectObj.project.ID(),"property.areaSetting":areaSetting}
+        };
+        $('#areaIncreaseFeeDiv').modal('hide');
+        let needUpdate = false;
+        for(let key in areaSetting){
+            if(areaSetting[key] != projectObj.project.property.areaSetting[key]){
+                needUpdate = true;
+                break;
+            }
+        }
+        if(needUpdate){
+            let datas = this.getAreaIncreaseDatas();
+            datas.push(tem);
+            let nodes = await projectObj.project.syncUpdateNodesAndRefresh(datas);
+            projectObj.project.calcProgram.calcNodesAndSave(nodes);
+        }
+
+        function settingNumCheck(value,type) {
+            if(!number_util.isNum(value)){
+                alert("输入的"+type+"数据类型不对,请重新输入!");
+                return   false;
+            }
+            if(parseFloat(value) < -100){
+                alert("输入的"+type+"不能小于负100,请重新输入!");
+                return false
+            }
+            return true;
+        }
+    },
+     getAreaIncreaseDatas:function (withBills = false) {
+        let datas = [];
+        let rations = projectObj.project.Ration.datas;
+        for(let r of rations){
+            if(r.areaIncreaseFee == true){
+                datas.push({type:"ration",data:{ID:r.ID,areaIncreaseFee:true}})
+            }
+        }
+        if(withBills == true){
+            let bills = projectObj.project.Bills.datas;
+            for(let b of bills){
+                if(b.areaIncreaseFee == true){
+                    datas.push({type:"bills",data:{ID:b.ID,areaIncreaseFee:true}})
+                }
+            }
+        }
+        return datas;
+     },
+    cancelAreaIncreaseFee:async function () {
+        let datas = this.getAreaIncreaseDatas(true);
+        //将值设置为false
+        for(let d of datas){
+            d.data.areaIncreaseFee = false;
+        }
+        let nodes = await projectObj.project.syncUpdateNodesAndRefresh(datas);
+        projectObj.project.calcProgram.calcNodesAndSave(nodes);
     }
     
 };
+
+
+
+$(function () {
+    $("#areaIncreaseFeeConfirm").on("click",async function(e){
+        areaIncreaseFeeObj.confirmAreaIncreaseFeeSetting();
+    });
+
+    $('#areaIncreaseFeeDiv').on('show.bs.modal', function (e) {
+        let areaSetting = {
+            labour:10,
+            material:1.5,
+            machine:0,
+        };
+        if(gljUtil.isDef(projectObj.project.property.areaSetting)) areaSetting = projectObj.project.property.areaSetting;
+        $("#areaIncreaseFee_labour").val(areaSetting.labour);
+        $("#areaIncreaseFee_material").val(areaSetting.material);
+        $("#areaIncreaseFee_machine").val(areaSetting.machine);
+    });
+});

+ 1 - 10
web/building_saas/main/js/views/index_view.js

@@ -509,18 +509,9 @@ let indexObj= {
 
     },
     updateProjectProperty: function(datas,field){
-        let pfield = "property."+field;
-        let tem ={
-            type:'project',
-            data:{ID:projectObj.project.ID()}
-        };
-        tem.data[pfield] = datas;    
-             
-        projectObj.project.updateNodes([tem],function () {
-            projectObj.project.property[field] = datas;
+        projectObj.project.updateProjectProperty(datas,field,function () {
             indexObj.showDatas();
         })
-
     },
     getNewPropertyData:function (datas,property) {
         if(!property) return null;

+ 4 - 0
web/building_saas/main/js/views/main_tree_col.js

@@ -420,6 +420,10 @@ let MainTreeCol = {
         mainBills:function (node) {
             if(MainTreeCol.mainBillsEnable(node)) return sheetCommonObj.getCheckBox(true);
         },
+        mainNodeCheckBox:function (node) {//分部分项、措施项目下的清单、定额
+            let Bills = projectObj.project.Bills;
+            if((Bills.isFBFX(node)||Bills.isMeasure(node)) && node.sourceType != ModuleNames.ration_glj) return sheetCommonObj.getCheckBox(false);
+        },
         outPutMaxPrice:function (node) {
             if(MainTreeCol.mainBillsEnable(node)) {
                 // 投标项目,复选框不可改变

+ 40 - 2
web/building_saas/main/js/views/project_view.js

@@ -1504,6 +1504,40 @@ var projectObj = {
                         return false;
                     },
                 },
+                "areaIncreaseFee":{
+                    name:"面积增加费",
+                    icon: 'fa-sign-in',
+                    visible:function () {
+                        return typeof cpFeeTypes != 'undefined';
+                    },
+                    items:{
+                        "calcAreaIncreaseFee":{
+                            name:"计取面积增加费",
+                            icon: 'fa-sign-in',
+                            callback:function () {
+                                areaIncreaseFeeObj.setDefaultSetting();
+                                colSettingObj.setVisible('areaIncreaseFee', true);
+                                colSettingObj.updateColSetting(true);
+                            }
+                        },
+                        "setArea":{
+                            name:"设置调整系数",
+                            icon: 'fa-sign-in',
+                            callback:function(){
+                                $("#areaIncreaseFeeDiv").modal('show');
+                            }
+                        },
+                        "cancelAreaIncreaseFee":{
+                            name:"取消面积增加费",
+                            icon: 'fa-sign-in',
+                            callback:function(){
+                                colSettingObj.setVisible('areaIncreaseFee', false);
+                                colSettingObj.updateColSetting(true);
+                                areaIncreaseFeeObj.cancelAreaIncreaseFee();
+                            }
+                        }
+                    }
+                },
                 "setBookMark": {
                     name: '设置书签批注',
                     icon: 'fa-flag',
@@ -1890,7 +1924,7 @@ var projectObj = {
             projectObj.onIsEstimateClick(node,info);
         }else if(fieldName == "evaluationProject"){
             projectObj.onEvaluationProjectClic(node,info);
-        }else if(fieldName == "mainBills"||fieldName == "outPutMaxPrice"){
+        }else if(fieldName == "mainBills"||fieldName == "outPutMaxPrice"||fieldName=="areaIncreaseFee"){
             projectObj.onCasCadeButtonClick(node,info,fieldName);
         }
     },
@@ -1940,7 +1974,11 @@ var projectObj = {
         } else {
             newval = true;
         }
-        projectObj.project.updateCasCadeBills(node,newval,fieldName);
+        if(fieldName == "areaIncreaseFee"){
+            areaIncreaseFeeObj.casCadeUpdate(node,newval,fieldName);
+        }else {
+            projectObj.project.updateCasCadeBills(node,newval,fieldName);
+        }
     },
     onSubcontractClick:function (node) {//点击分包费checkbox
         if (node.data.isSubcontract) node.data.isSubcontract = false;