zhangweicheng 7 gadi atpakaļ
vecāks
revīzija
302bc5d2ba

+ 3 - 0
modules/main/controllers/installation_controller.js

@@ -35,6 +35,9 @@ async function  updateInstallationFee(req, res) {
         let data = req.body.data;
         data = JSON.parse(data);
         let datas= await installation_facade.updateInstallationFee(data.projectID,data.updateData);
+        if(data.hasOwnProperty("rationInstallations")){
+            await ration_installation_facade.updateFromInstallationFee(data.projectID,data.rationInstallations);
+        }
         result.data=datas;
     }catch (err){
         logger.err(err);

+ 38 - 1
modules/main/facade/ration_installation_facade.js

@@ -8,7 +8,9 @@ let projectConsts = consts.projectConst;
 
 module.exports={
     updateRationInstallation:updateRationInstallation,
-    getData:getData
+    updateFromInstallationFee:updateFromInstallationFee,
+    getData:getData,
+    deleteByRation:deleteByRation
 };
 
 async function updateRationInstallation(data){
@@ -20,6 +22,41 @@ async function updateRationInstallation(data){
     }
 }
 
+async function updateFromInstallationFee(projectID,rationInstallations) {
+    let tasks = [];
+    for (let ri of rationInstallations){
+        let task = {
+            updateOne:{
+                filter:{
+                    ID:ri.ID,
+                    projectID:projectID
+                },
+                update :ri.doc
+            }
+        };
+        tasks.push(task);
+    }
+    if(tasks.length>0){
+        await rationInstallationModel.bulkWrite(tasks);
+    }
+}
+function deleteByRation(data) {
+    return function (callback) {
+        rationInstallationModel.deleteMany({projectID: data.projectID, rationID: data.ID},(err,result)=>{
+            commonCallback(callback,result,err);
+        });
+    }
+}
+
+function commonCallback(callback,result,err) {
+    if(err){
+        callback(err,'');
+    }else {
+        callback(null,result);
+    }
+}
+
+
 function getData(projectID, callback) {
     rationInstallationModel.find({'projectID': projectID}, (err, datas) => {
         if (err) {

+ 0 - 1
modules/main/models/ration_installation.js

@@ -15,7 +15,6 @@ var ration_installation = new Schema({
     ruleId:String,
     itemName:String,
     sectionName:String,
-    feeType: String, //费用类型
     unifiedSetting:{type: Number,default:1},//0:false 1:true  按统一设置
 },{versionKey:false});
 

+ 3 - 0
modules/ration_glj/facade/ration_glj_facade.js

@@ -18,6 +18,7 @@ let std_ration_lib_ration_items = mongoose.model('std_ration_lib_ration_items');
 let glj_calculate_facade = require('./glj_calculate_facade');
 let glj_type_util = require('../../../public/cache/std_glj_type_util');
 let quantity_detail_facade = require('../../main/facade/quantity_detail_facade');
+let ration_installation_facade = require('../../main/facade/ration_installation_facade');
 let logger = require("../../../logs/log_helper").logger;
 import stdgljutil  from "../../../public/cache/std_glj_type_util";
 import EngineeringLibModel from "../../users/models/engineering_lib_model";
@@ -330,6 +331,7 @@ function deleteByRation(datas, callback) {
     tasks.push(deleteGLJList(data));
     tasks.push(ration_coe_facade.delete_ration_coe(data));
     tasks.push(quantity_detail_facade.deleteByRation(data));
+    tasks.push(ration_installation_facade.deleteByRation(data));
     async_n.parallel(tasks, function (err, result) {
         commonCallback(callback, result, err)
     })
@@ -456,6 +458,7 @@ function deleteByMultiRations(datas) {
             delete_tasks.push(deleteOne(rations[i]._doc));
             delete_tasks.push(ration_coe_facade.delete_ration_coe(rations[i]._doc));
             delete_tasks.push(quantity_detail_facade.deleteByRation(rations[i]._doc));
+            delete_tasks.push(ration_installation_facade.deleteByRation(rations[i]._doc));
         }
         delete_tasks.push(quantity_detail_facade.deleteByBill(datas.updateData));
         async_n.parallel(delete_tasks, (err, results) => {

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

@@ -916,7 +916,7 @@
                     </button>
                 </div>
                 <div class="modal-body">
-                    <div class="row" style="height:300px"><!--sjs id设置在这个div-->
+                    <div class="row" style="height:250px"><!--sjs id设置在这个div-->
                         <div class=" col-8" style="overflow: hidden" id="feeItemSheet">
                         </div>
                         <div class=" col-4" style="overflow: hidden" id="install_setting">

+ 64 - 10
web/building_saas/main/js/models/installation_fee.js

@@ -57,6 +57,44 @@ var installation_fee = {
             let installationFee = this.getInstallationFeeByLibID(libID);
             return _.find(installationFee.feeRule,{'ID':feeRuleID});
         };
+        installation_fee.prototype.updateFeeItem = function(doc,libID,feeItemID,callback){
+            let me = this,ration_install=projectObj.project.ration_installation;
+            let feeItem = me.getFeeItemByID(libID,feeItemID);
+            let temFeeItem = _.cloneDeep(feeItem);//暂时不更新缓存
+            let updateData = [];
+            let rationInstallations = [];
+            for(let d_key in doc){
+                temFeeItem[d_key] = doc[d_key]
+            }
+            updateData.push(me.getFeeItemUpdateData(libID,feeItemID,doc));
+            if(temFeeItem.isCal == 1){//勾选记取的时候要同步更新对应的定额安装费
+                let sections = me.getInstallSectionsByfeeItemID(libID,feeItemID);
+                for (let s of sections){
+                    me.getRIUpdateDataBySectionUpdate(s.ID,s.feeRuleId,rationInstallations);//生成受影响的定额安装增加费并加入到数组中
+                }
+            }
+            $.bootstrapLoading.start();
+            me.submitInstallationUpdate(updateData,rationInstallations,function (data) {
+                //更新缓存
+                for(let d_key in doc){
+                    feeItem[d_key] = doc[d_key]
+                }
+                if(callback){
+                    callback();
+                }
+                $.bootstrapLoading.end();
+            });
+        };
+        installation_fee.prototype.getRIUpdateDataBySectionUpdate = function (sectionID,newRuleID,rationInstallations) {
+            let ration_install=projectObj.project.ration_installation;
+            let ris = ration_install.getBySectionID(sectionID);
+            for(let ri of ris){
+                if(ri.unifiedSetting==1&&ri.ruleId!=newRuleID){//勾选按统一设置并且费率规则选择的不一样
+                    rationInstallations.push({ID:ri.ID,doc:{'ruleId':newRuleID}});
+                }
+            }
+        };
+
         installation_fee.prototype.updateFeeRule = function (doc,libID,feeRuleID,callback) {
             let me = this;
             let itemUpdateData = null;
@@ -70,14 +108,13 @@ var installation_fee = {
                     updateData.push(ruleUpdateData);
                     if(doc.hasOwnProperty("billID")){//改变了选取位置后如果与费用项里的位置不一致的话要清空费用项的选取位置
                         feeItem = me.getFeeItemByID(libID,feeRule.feeItemId);
-                        let installationFee = me.getInstallationFeeByLibID(libID);
                         if(feeItem.position!=''&&feeItem.billID!=doc.billID){
-                            itemUpdateData = me.getFeeItemUpdateData(feeItem,{position: "", billID:""},installationFee);
+                            itemUpdateData = me.getFeeItemUpdateData(libID,feeItem.ID,{position: "", billID:""});
                             updateData.push(itemUpdateData);
                         }
                     }
                     $.bootstrapLoading.start();
-                    me.submitInstallationUpdate(updateData,function (data) {
+                    me.submitInstallationUpdate(updateData,null,function (data) {
                         //更新缓存
                         let isFeeItemUpdate = false;
                         if(itemUpdateData){
@@ -89,7 +126,7 @@ var installation_fee = {
                             feeRule[ukey]=doc[ukey];
                         }
                         if(callback){//回调
-                            callback(true);
+                            callback(isFeeItemUpdate);
                         }
                         $.bootstrapLoading.end();
                     });
@@ -120,22 +157,39 @@ var installation_fee = {
            };
            return updateData;
        };
-       installation_fee.prototype.getFeeItemUpdateData = function (item,doc,installationFee) {
+       installation_fee.prototype.getFeeItemUpdateData = function (libID,itemID,doc) {
+           let installationFee = this.getInstallationFeeByLibID(libID);
             let updateData = {
-                ID:installationFee?installationFee.ID:item.installFeeID,
-                itemID:item.ID,
+                ID:installationFee.ID,
+                itemID:itemID,
                 type:'installFeeItem',
                 doc:doc
             };
             return updateData;
         };
-        installation_fee.prototype.submitInstallationUpdate = function (updateData,callback) {
+        installation_fee.prototype.submitInstallationUpdate = function (updateData,rationInstallations,callback) {
             if(updateData){
-                CommonAjax.post('/installation/updateInstallationFee',{'projectID':projectInfoObj.projectInfo.ID,'updateData':updateData},function (data) {
+                let data = {'projectID':projectInfoObj.projectInfo.ID,'updateData':updateData};
+                if(rationInstallations){//是否附带更新定额安装费
+                    data['rationInstallations'] = rationInstallations;
+                }
+                CommonAjax.post('/installation/updateInstallationFee',data,function (data) {
+                    //更新定额安装费的缓存
+                    if(rationInstallations){
+                        for(let ri of rationInstallations){
+                            let c_ri = project.ration_installation.getByID(ri.ID);
+                            if(c_ri){
+                                for(let rkey in ri.doc){
+                                    c_ri[rkey] = ri.doc[rkey];
+                                }
+                            }
+                        }
+                    }
                     callback(data);
                 })
             }
-        }
+        };
+
         // 提交数据后返回数据处理
         installation_fee.prototype.doAfterUpdate = function(err, data){
 

+ 1 - 0
web/building_saas/main/js/models/ration.js

@@ -262,6 +262,7 @@ var Ration = {
             project.ration_glj.deleteByRation(ration);
             project.ration_coe.deleteByRation(ration);
             project.quantity_detail.deleteByRation(ration);
+            project.ration_installation.deleteByRation(ration);
             this.datas.splice(this.datas.indexOf(ration), 1);
         };
         ration.prototype.getDeleteDataByBill = function (nodes) {

+ 1 - 0
web/building_saas/main/js/models/ration_glj.js

@@ -315,6 +315,7 @@ var ration_glj = {
                 this.deleteByRation(deleteRationList[i]);
                 projectObj.project.ration_coe.deleteByRation(deleteRationList[i]);
                 projectObj.project.quantity_detail.deleteByRation(deleteRationList[i]);
+                projectObj.project.ration_installation.deleteByRation(deleteRationList[i]);
                 projectObj.project.Ration.datas.splice(projectObj.project.Ration.datas.indexOf(deleteRationList[i]), 1);
             }
         }

+ 8 - 0
web/building_saas/main/js/models/ration_installation.js

@@ -32,6 +32,14 @@ let ration_installation = {
                 }
             }
         };
+        ration_installation.prototype.getBySectionID = function(sectionID){
+            var ri_list = this.datas;
+            return _.filter(ri_list,{'sectionId':sectionID});
+        };
+        ration_installation.prototype.deleteByRation = function(ration){
+            var ri_list = projectObj.project.ration_installation.datas;
+            _.remove(ri_list,{'rationID':ration.ID});
+        };
         ration_installation.prototype.getByID = function (ID) {
             let  me = this;
             let ri = _.find(me.datas,{'ID':ID})

+ 39 - 27
web/building_saas/main/js/views/installation_fee_view.js

@@ -11,10 +11,10 @@ let installationFeeObj={
             {headerName: "费用规则", headerWidth: 300, dataCode: "ruleId", hAlign: "left", dataType: "String",getText:'forRule'},
             {headerName: "编码", headerWidth: 70, dataCode: "code", hAlign: "left", dataType: "String"},
             {headerName: "基数", headerWidth: 150, dataCode: "base", hAlign: "left", dataType: "String",cellType:'comboBox',options:installSectionBase},
-            {headerName: "费率(%)", headerWidth: 80, dataCode: "feeRate", hAlign: "right", dataType: "String"},
-            {headerName: "其中人工(%)", headerWidth: 100, dataCode: "labour", hAlign: "right", dataType: "String"},
-            {headerName: "其中材料(%)", headerWidth: 100, dataCode: "material", hAlign: "right", dataType: "String"},
-            {headerName: "其中机械(%)", headerWidth: 100, dataCode: "machine", hAlign: "right", dataType: "String"},
+            {headerName: "费率(%)", headerWidth: 70, dataCode: "feeRate", hAlign: "right", dataType: "String"},
+            {headerName: "人工(%)", headerWidth: 70, dataCode: "labour", hAlign: "right", dataType: "String"},
+            {headerName: "材料(%)", headerWidth: 70, dataCode: "material", hAlign: "right", dataType: "String"},
+            {headerName: "机械(%)", headerWidth: 70, dataCode: "machine", hAlign: "right", dataType: "String"},
             {headerName: "费用类型", headerWidth: 100, dataCode: "feeType", hAlign: "center", dataType: "String",cellType:'comboBox',options:installFeeType},
             {headerName: "记取位置", headerWidth: 200, dataCode: "position", hAlign: "left", dataType: "String",cellType:'selectButton',getText:'forPosition'}
         ],
@@ -39,10 +39,10 @@ let installationFeeObj={
     feeItemData:null,
     feeItemSetting:{
         header: [
-            {headerName: "计取", headerWidth: 90, dataCode: "isCal", dataType: "String",cellType: "checkBox"},
+            {headerName: "计取", headerWidth: 50, dataCode: "isCal", dataType: "String",cellType: "checkBox"},
             {headerName: "费用项", headerWidth: 300, dataCode: "feeItem", hAlign: "left", dataType: "String"},
             {headerName: "费用类型", headerWidth: 100, dataCode: "feeType", hAlign: "center", dataType: "String",cellType:'comboBox',options:installFeeType},
-            {headerName: "记取位置", headerWidth: 140, dataCode: "displayPosition", hAlign: "left", dataType: "String",cellType:'selectButton'}
+            {headerName: "记取位置", headerWidth: 180, dataCode: "displayPosition", hAlign: "left", dataType: "String",cellType:'selectButton'}
         ],
         view: {
             lockColumns: [0,1]
@@ -57,11 +57,11 @@ let installationFeeObj={
             {headerName: "费用规则", headerWidth: 220, dataCode: "rule", hAlign: "left", dataType: "String",getText:'forRule'},
             {headerName: "编码", headerWidth: 70, dataCode: "code", hAlign: "left", dataType: "String"},
             {headerName: "基数", headerWidth: 80, dataCode: "base", hAlign: "left", dataType: "String",cellType:'comboBox',options:installSectionBase},
-            {headerName: "费率(%)", headerWidth: 80, dataCode: "feeRate", hAlign: "right", dataType: "String"},
-            {headerName: "其中人工(%)", headerWidth: 100, dataCode: "labour", hAlign: "right", dataType: "String"},
-            {headerName: "其中材料(%)", headerWidth: 100, dataCode: "material", hAlign: "right", dataType: "String"},
-            {headerName: "其中机械(%)", headerWidth: 100, dataCode: "machine", hAlign: "right", dataType: "String"},
-            {headerName: "记取位置", headerWidth: 100, dataCode: "position", hAlign: "left", dataType: "String",cellType:'selectButton'}
+            {headerName: "费率(%)", headerWidth: 70, dataCode: "feeRate", hAlign: "right", dataType: "String"},
+            {headerName: "人工(%)", headerWidth: 70, dataCode: "labour", hAlign: "right", dataType: "String"},
+            {headerName: "材料(%)", headerWidth: 70, dataCode: "material", hAlign: "right", dataType: "String"},
+            {headerName: "机械(%)", headerWidth: 70, dataCode: "machine", hAlign: "right", dataType: "String"},
+            {headerName: "记取位置", headerWidth: 200, dataCode: "position", hAlign: "left", dataType: "String",cellType:'selectButton'}
         ],
         view: {
             lockColumns: [0, 2]
@@ -388,7 +388,7 @@ let installationFeeObj={
                 let ri = ration_installation.datas[i];
                 if(ration.projectID == ri.projectID && ration.ID == ri.rationID){
                    let tem_ri =  _.cloneDeep(ri);
-                   this.getRIRuleData(tem_ri.ruleId,tem_ri,tem_ri);
+                   this.getRIShowData(tem_ri.ruleId,tem_ri,tem_ri);
                    installationList.push(tem_ri);
                 }
             }
@@ -410,7 +410,7 @@ let installationFeeObj={
     refreshRationInstallationRow:function (row) {
         let ri = this.rationInstallData[row];
         let tem_ri = _.cloneDeep(projectObj.project.ration_installation.getByID(ri.ID));
-        this.rationInstallData[row] = this.getRIRuleData(tem_ri.ruleId,tem_ri,tem_ri);
+        this.rationInstallData[row] = this.getRIShowData(tem_ri.ruleId,tem_ri,tem_ri);
         sheetCommonObj.showRowData(this.rationInstallSheet, this.rationInstallSetting,row,this.rationInstallData);
     },
     refreshFeeDetailRow:function (row) {
@@ -473,7 +473,9 @@ let installationFeeObj={
         if(item.billID&&item.billID!=''){
             let node = projectObj.project.mainTree.getNodeByID(item.billID);
             if(node){
-                return node.data.code +" "+node.data.name;
+                let code = node.data.code?node.data.code:"";
+                let name = node.data.name?node.data.name:"";
+                return code +" "+name;
             }
         }
         return  item.position;
@@ -837,9 +839,11 @@ let installationFeeObj={
         let feeRule = me.moreFeeRuleData[row];
         let detailSelection = me.feeDetailSheet.getSelections()[0];
         let detail = this.feeDetailData[detailSelection.row];
+        let rationInstallations = [];
         let updateData = installation_fee.getSectionUpdateData(detail.libID,detail.ID,{"feeRuleId":feeRule.ID});
+        installation_fee.getRIUpdateDataBySectionUpdate(detail.ID,feeRule.ID,rationInstallations);//生成受影响的定额安装增加费并加入到数组中
         $.bootstrapLoading.start();
-        installation_fee.submitInstallationUpdate(updateData,function (data) {
+        installation_fee.submitInstallationUpdate(updateData,rationInstallations,function (data) {
             let section = installation_fee.getInstallSectionByID(detail.libID,detail.ID);
             section.feeRuleId = feeRule.ID;
             me.refreshFeeDetailRow(detailSelection.row);
@@ -872,11 +876,11 @@ let installationFeeObj={
         if(feeItem.billID ==recode.ID ){//和原来的位置没变
             return;
         }
-        let updateData =  projectObj.project.installation_fee.getFeeItemUpdateData(feeItem,{ position: recode.code, billID:recode.ID});
+        let updateData =  projectObj.project.installation_fee.getFeeItemUpdateData(feeItem.libID,feeItem.ID,{ position: recode.code, billID:recode.ID});
         let [dataArray,impacRules] = me.getFeeRuleUpdateDataByFeeItem(feeItem,recode);
         dataArray.push(updateData);
         $.bootstrapLoading.start();
-        projectObj.project.installation_fee.submitInstallationUpdate(dataArray,function (data) {
+        projectObj.project.installation_fee.submitInstallationUpdate(dataArray,null,function (data) {
             //更新缓存
             feeItem.position =recode.code;
             feeItem.billID = recode.ID;
@@ -924,13 +928,8 @@ let installationFeeObj={
         let header = this.feeItemSetting.header[info.col];
         let doc={};
         doc[header.dataCode] = info.newValue;
-        let updateData =  projectObj.project.installation_fee.getFeeItemUpdateData(feeItem,doc);
-        $.bootstrapLoading.start();
-        projectObj.project.installation_fee.submitInstallationUpdate(updateData,function (data) {
-            //更新缓存
-            feeItem[header.dataCode]=info.newValue;
+        projectObj.project.installation_fee.updateFeeItem(doc,feeItem.libID,feeItem.ID,function () {
             me.feeItemSheet.getCell(info.row, info.col).value(info.newValue);
-            $.bootstrapLoading.end();
         });
     },
     onRationInstallValueChange:function (e,info) {
@@ -1013,6 +1012,7 @@ let installationFeeObj={
         let header = this.feeDetailSetting.header[info.col];
         let fieldID = header.dataCode;
         let updateData = null;
+        let rationInstallations=null;
         if(fieldID == 'rule'){//选择新的规则项
             if(info.newValue=="more"){//选择的是更多
                 $("#more_from").val("feeDetail");
@@ -1024,7 +1024,9 @@ let installationFeeObj={
             }else if(info.newValue == feeDetail.ruleName){
                 return;
             }else {
+                rationInstallations=[];
                 updateData = install_fee.getSectionUpdateData(feeDetail.libID,feeDetail.ID,{"feeRuleId":info.newValue});
+                install_fee.getRIUpdateDataBySectionUpdate(feeDetail.ID,info.newValue,rationInstallations);//生成受影响的定额安装增加费并加入到数组中
             }
 
         }else if(fieldID == 'base'){
@@ -1054,7 +1056,7 @@ let installationFeeObj={
             feeDetail[fieldID] = info.newValue;
             updateData =  install_fee.getFeeRuleUpdateData(feeDetail.libID,feeDetail.feeRuleId,doc);
         }
-        install_fee.submitInstallationUpdate(updateData,function (data) {
+        install_fee.submitInstallationUpdate(updateData,rationInstallations,function (data) {
             if(updateData){
                 if(updateData.type=="installSection"){
                     let section = install_fee.getInstallSectionByID(feeDetail.libID,feeDetail.ID);
@@ -1085,7 +1087,7 @@ let installationFeeObj={
         let me = installationFeeObj;
         let canChange = true;
         let os = null;
-        if(info.newSelections[0].row == info.oldSelections[0].row){//没有换行
+        if(info.oldSelections==undefined||info.newSelections[0].row == info.oldSelections[0].row){//没有换行
             return canChange;
         }
         if(info.sheetName=='feeDetailSheet'){
@@ -1108,7 +1110,7 @@ let installationFeeObj={
         }
         return canChange;
     },
-    getRIRuleData : function (ruleID,rationInstallation,data) {
+    getRIShowData : function (ruleID,rationInstallation,data) {
         if(ruleID==''){//选择的是无
             data.code = '';
             data.rule = '';
@@ -1132,8 +1134,18 @@ let installationFeeObj={
             data.position = feeRule.position;
             data.billID = feeRule.billID;
         }
+        let feeItem = projectObj.project.installation_fee.getFeeItemByID(rationInstallation.libID,rationInstallation.feeItemId);
+        if(feeItem){
+            data.feeType = feeItem.feeType;
+        }
         return data;
-    }
+    },
+    calcInstallationFee:function(){//计算定额安装费
+
+
+
+
+    },
 };