zhangweicheng 7 éve
szülő
commit
3aef1bcb28

+ 0 - 9
modules/main/facade/ration_facade.js

@@ -142,15 +142,6 @@ async function addRationInstallFee(std,newRation) {
                     let feeRule = _.find(installFee.feeRule,{'ID':section.feeRuleId});
                     if(feeRule){
                         tem_r_i.ruleId = feeRule.ID;
-                        tem_r_i.code = feeRule.code;
-                        tem_r_i.rule = feeRule.rule;
-                        tem_r_i.base = feeRule.base;
-                        tem_r_i.feeRate = feeRule.feeRate;
-                        tem_r_i.labour = feeRule.labour;
-                        tem_r_i.material = feeRule.material;
-                        tem_r_i.machine = feeRule.machine;
-                        tem_r_i.position = feeRule.position;
-                        tem_r_i.billID = feeRule.billID;
                     }
                 }
                 tem_r_i.ID = uuidV1();

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

@@ -15,16 +15,7 @@ var ration_installation = new Schema({
     ruleId:String,
     itemName:String,
     sectionName:String,
-    code: String,
-    rule: String,
-    base: String,
-    feeRate: Number,
-    labour: Number,
-    material: Number,
-    machine: Number,
     feeType: String, //费用类型
-    position: String,//记取位置
-    billID:String,//记取位置对应的清单ID
     unifiedSetting:{type: Number,default:1},//0:false 1:true  按统一设置
 },{versionKey:false});
 

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

@@ -955,7 +955,7 @@
     </div>
 
     <!--弹出 指定具体位置(计取安装费用)-->
-    <div class="modal fade" id="calc_position" data-backdrop="static">
+    <div class="modal fade" id="calc_position" data-backdrop="static" style="z-index: 1060">
         <input type="hidden" id ='calc_position_from'>
         <div class="modal-dialog modal-lg"  role="document">
             <div class="modal-content">
@@ -1012,6 +1012,27 @@
         </div>
     </div>
 
+    <!--弹出 修改费用规则-->
+    <div class="modal fade" id="modify_feeRule" data-backdrop="static">
+        <div class="modal-dialog " style="max-width: 950px" role="document">
+            <div class="modal-content">
+                <div class="modal-header">
+                    <h5 class="modal-title">修改费用规则</h5>
+                    <button type="button" class="close" data-dismiss="modal" aria-label="Close" id="modify_feeRule_close">
+                        <span aria-hidden="true">&times;</span>
+                    </button>
+                </div>
+                <div class="modal-body">
+                    <div style="height: 100px" id="modifyFeeRuleSpread"><!--sjs ID设置此div--->
+                    </div>
+                </div>
+                <div class="modal-footer">
+                    <button type="button" class="btn btn-secondary" id="modify_feeRule_concel" data-dismiss="modal">取消</button>
+                    <button class="btn btn-primary" id="modify_feeRule_confirm">确定</button>
+                </div>
+            </div>
+        </div>
+    </div>
         <!-- JS. -->
         <script type="text/javascript" src="/lib/spreadjs/sheets/gc.spread.sheets.all.10.0.1.min.js"></script>
 

+ 79 - 0
web/building_saas/main/js/models/installation_fee.js

@@ -57,6 +57,85 @@ var installation_fee = {
             let installationFee = this.getInstallationFeeByLibID(libID);
             return _.find(installationFee.feeRule,{'ID':feeRuleID});
         };
+        installation_fee.prototype.updateFeeRule = function (doc,libID,feeRuleID,callback) {
+            let me = this;
+            let itemUpdateData = null;
+            let feeItem=null;
+            let ruleUpdateData=null;
+            let updateData = [];
+            let feeRule = me.getFeeRuleByID(libID,feeRuleID);
+            if(feeRule){
+                if(doc){//如果有需要更新的属性
+                    ruleUpdateData = me.getFeeRuleUpdateData(libID,feeRuleID,doc);
+                    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);
+                            updateData.push(itemUpdateData);
+                        }
+                    }
+                    $.bootstrapLoading.start();
+                    me.submitInstallationUpdate(updateData,function (data) {
+                        //更新缓存
+                        let isFeeItemUpdate = false;
+                        if(itemUpdateData){
+                            feeItem.position ="";
+                            feeItem.billID = "";
+                            isFeeItemUpdate= true;
+                        }
+                        for(let ukey in doc){
+                            feeRule[ukey]=doc[ukey];
+                        }
+                        if(callback){//回调
+                            callback(true);
+                        }
+                        $.bootstrapLoading.end();
+                    });
+                }
+            }else {
+                if(callback){
+                    callback(false);
+                }
+            }
+        };
+       installation_fee.prototype.getFeeRuleUpdateData = function (libID,feeRuleID,doc) {
+            let installationFee = this.getInstallationFeeByLibID(libID);
+            let updateData = {
+                ID:installationFee.ID,
+                itemID:feeRuleID,
+                type:"feeRule",
+                doc:doc
+            };
+            return updateData;
+        };
+       installation_fee.prototype.getSectionUpdateData = function (libID,sectionID,doc) {
+           let installationFee = this.getInstallationFeeByLibID(libID);
+           let updateData = {
+               ID:installationFee.ID,
+               itemID:sectionID,
+               type:"installSection",
+               doc:doc
+           };
+           return updateData;
+       };
+       installation_fee.prototype.getFeeItemUpdateData = function (item,doc,installationFee) {
+            let updateData = {
+                ID:installationFee?installationFee.ID:item.installFeeID,
+                itemID:item.ID,
+                type:'installFeeItem',
+                doc:doc
+            };
+            return updateData;
+        };
+        installation_fee.prototype.submitInstallationUpdate = function (updateData,callback) {
+            if(updateData){
+                CommonAjax.post('/installation/updateInstallationFee',{'projectID':projectInfoObj.projectInfo.ID,'updateData':updateData},function (data) {
+                    callback(data);
+                })
+            }
+        }
         // 提交数据后返回数据处理
         installation_fee.prototype.doAfterUpdate = function(err, data){
 

+ 99 - 12
web/building_saas/main/js/views/glj_view_contextMenu.js

@@ -26,6 +26,9 @@ var gljContextMenu = {
                         var sheetData = gljOprObj.sheetData;
                         var deleteRow = sheetData[gljContextMenu.selectedRow];
                         projectObj.project.ration_glj.updataOrdelete(deleteRow);
+                    },
+                    visible: function(key, opt){
+                        return subSpread.getActiveSheet().name()=='ration_glj';
                     }
                 },
                 "add_glj": {
@@ -45,6 +48,9 @@ var gljContextMenu = {
                     },
                     callback:function () {
                         getGLJData('add');
+                    },
+                    visible: function(key, opt){
+                        return subSpread.getActiveSheet().name()=='ration_glj';
                     }
                 },
                 "replace_glj": {
@@ -60,6 +66,9 @@ var gljContextMenu = {
                     },
                     callback: function () {
                         getGLJData('replace');
+                    },
+                    visible: function(key, opt){
+                        return subSpread.getActiveSheet().name()=='ration_glj';
                     }
                 },
                 "m_replace_glj": {
@@ -75,6 +84,9 @@ var gljContextMenu = {
                     },
                     callback: function () {
                         getGLJData('m_replace');
+                    },
+                    visible: function(key, opt){
+                        return subSpread.getActiveSheet().name()=='ration_glj';
                     }
                 },
                 "add_to_lib": {
@@ -93,16 +105,11 @@ var gljContextMenu = {
                         var sheetData = gljOprObj.sheetData;
                         var recode = sheetData[gljContextMenu.selectedRow];
                         showGLJClassTree(recode);
+                    },
+                    visible: function(key, opt){
+                        return subSpread.getActiveSheet().name()=='ration_glj';
                     }
-                }
-            }
-        });
-    },
-    loadQuantityDetailMenu:function () {
-        $.contextMenu({
-            selector: '#subSpread',
-            build: this.onbuild,
-            items: {
+                },
                 "insert_detail": {
                     name: '插入行',
                     icon: 'fa-sign-in',
@@ -112,6 +119,9 @@ var gljContextMenu = {
                     },
                     callback: function () {
                         projectObj.project.quantity_detail.insertQuantityDetail(gljContextMenu.selectedRow);
+                    },
+                    visible: function(key, opt){
+                        return subSpread.getActiveSheet().name()=='quantity_detail';
                     }
                 },
                 "delete_detail": {
@@ -123,6 +133,9 @@ var gljContextMenu = {
                     },
                     callback:function () {
                         projectObj.project.quantity_detail.deleteQuantityDetail(gljContextMenu.selectedRow);
+                    },
+                    visible: function(key, opt){
+                        return subSpread.getActiveSheet().name()=='quantity_detail';
                     }
                 },
                 "move_up": {
@@ -134,6 +147,9 @@ var gljContextMenu = {
                     },
                     callback: function () {
                         projectObj.project.quantity_detail.moveUp(gljContextMenu.selectedRow);
+                    },
+                    visible: function(key, opt){
+                        return subSpread.getActiveSheet().name()=='quantity_detail';
                     }
                 },
                 "move_down": {
@@ -145,6 +161,9 @@ var gljContextMenu = {
                     },
                     callback: function () {
                         projectObj.project.quantity_detail.moveDown(gljContextMenu.selectedRow);
+                    },
+                    visible: function(key, opt){
+                        return subSpread.getActiveSheet().name()=='quantity_detail';
                     }
                 },
                 "copy": {
@@ -158,9 +177,12 @@ var gljContextMenu = {
                     },
                     callback: function () {
                         gljContextMenu.clipboard={
-                          row:gljContextMenu.selectedRow,
-                          col:gljContextMenu.selectedCol
+                            row:gljContextMenu.selectedRow,
+                            col:gljContextMenu.selectedCol
                         };
+                    },
+                    visible: function(key, opt){
+                        return subSpread.getActiveSheet().name()=='quantity_detail';
                     }
                 },
                 "paste": {
@@ -180,11 +202,76 @@ var gljContextMenu = {
                             'editingText':sheet.getCell(c.row,c.col).value()
                         }
                         gljOprObj.onEditDetailSheet(args);
+                    },
+                    visible: function(key, opt){
+                        return subSpread.getActiveSheet().name()=='quantity_detail';
+                    }
+                },
+                "modify_rule": {
+                    name: '修改规则',
+                    icon: 'fa-sign-in',
+                    disabled: function () {//当选中空行或者ruleID为空的情况下,灰显
+                        let sheetData = installationFeeObj.rationInstallData;
+                        if(gljContextMenu.selectedRow>sheetData.length-1){
+                            return true
+                        }
+                        let ri = sheetData[gljContextMenu.selectedRow];
+                        if(!ri.ruleId||ri.ruleId==''){
+                            return true;
+                        }
+                        return false;
+                    },
+                    callback: function () {
+                        $("#modify_feeRule").modal({show:true});
+                    },
+                    visible: function(key, opt){
+                        return subSpread.getActiveSheet().name()=='rationInstallSheet';
+                    }
+                },
+                "apply_to_FX": {
+                    name: '应用到当前分项',
+                    icon: 'fa-sign-in',
+                    disabled: function () {
+                        /* var sheetData = gljOprObj.detailData;
+                         return gljContextMenu.selectedRow>sheetData.length-2;*/
+                    },
+                    callback: function () {
+                        //projectObj.project.quantity_detail.moveDown(gljContextMenu.selectedRow);
+                    },
+                    visible: function(key, opt){
+                        return subSpread.getActiveSheet().name()=='rationInstallSheet';
+                    }
+                },
+                "apply_to_FB": {
+                    name: '应用到当前分部',
+                    icon: 'fa-sign-in',
+                    disabled: function () {
+                        /* var sheetData = gljOprObj.detailData;
+                         return gljContextMenu.selectedRow>sheetData.length-2;*/
+                    },
+                    callback: function () {
+                        //projectObj.project.quantity_detail.moveDown(gljContextMenu.selectedRow);
+                    },
+                    visible: function(key, opt){
+                        return subSpread.getActiveSheet().name()=='rationInstallSheet';
+                    }
+                },
+                "apply_to_PRO": {
+                    name: '应用到当前项目',
+                    icon: 'fa-sign-in',
+                    disabled: function () {
+                        /* var sheetData = gljOprObj.detailData;
+                         return gljContextMenu.selectedRow>sheetData.length-2;*/
+                    },
+                    callback: function () {
+                        //projectObj.project.quantity_detail.moveDown(gljContextMenu.selectedRow);
+                    },
+                    visible: function(key, opt){
+                        return subSpread.getActiveSheet().name()=='rationInstallSheet';
                     }
                 }
             }
         });
-
     },
     onbuild:function ($trigger, e) {
         var target = SheetDataHelper.safeRightClickSelection($trigger, e, subSpread);

+ 220 - 100
web/building_saas/main/js/views/installation_fee_view.js

@@ -99,6 +99,31 @@ let installationFeeObj={
             lockColumns: [0,1,2,3,4,5,6]
         }
     },
+    modifyFeeRuleSpread:null,
+    modifyFeeRuleSheet:null,
+    modifyFeeRuleData:null,
+    modifyFeeRuleSetting:{
+        header: [
+            {headerName: "编码", headerWidth: 70, dataCode: "code", hAlign: "left", dataType: "String"},
+            {headerName: "费用规则", headerWidth: 220, dataCode: "rule", 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',getText:'forPosition'}
+        ],
+        view: {
+            lockColumns: [0, 1]
+        },
+        getText:{
+            forPosition:function (item,val) {//记取位置转换
+                return installationFeeObj.getDisplayText(item);
+            }
+        },
+        autoFit:true
+    },
+    modifyEditedObj:null,
     selectionTree:null,
     selectionTreeController:null,
     positionSetting:{
@@ -275,6 +300,13 @@ let installationFeeObj={
         $('#calc_position_from').val(info.sheetName);
         $('#calc_position').modal({show:true});
     },
+    onModifyFeeRuleEditStarting:function (e,args) {
+        let me = installationFeeObj;
+        let rowData = me.modifyFeeRuleData[args.row];
+        if(me.modifyFeeRuleSetting.header[args.col].dataCode=='feeRate'&&installSectionBase.indexOf(rowData.base)===0){//当基数是分别按人材机乘系数时,费率列只读
+            args.cancel = true;
+        }
+    },
     onCalcCheckBoxClick: function(e,info){
         let me = installationFeeObj;
         var checkboxValue = info.sheet.getCell(info.row, info.col).value();
@@ -334,12 +366,32 @@ let installationFeeObj={
         this.moreFeeRuleSheet.setRowCount(this.moreFeeRuleData.length);
         this.moreFeeRuleSheet.clearSelection();
     },
+    showModifyFeeRule:function () {
+        let riselection = this.rationInstallSheet.getSelections()[0];
+        let ration_install = this.rationInstallData[riselection.row];
+        let feeRule =  _.cloneDeep(projectObj.project.installation_fee.getFeeRuleByID(ration_install.libID,ration_install.ruleId));//不改变原有对象
+        feeRule.libID = ration_install.libID;
+        feeRule.feeType = ration_install.feeType;
+        this.modifyFeeRuleData = [feeRule];
+        this.modifyFeeRuleSheet.setRowCount(0);
+        sheetCommonObj.showData(this.modifyFeeRuleSheet, this.modifyFeeRuleSetting, this.modifyFeeRuleData);
+        this.modifyFeeRuleSheet.setRowCount(this.modifyFeeRuleData.length);
+        let positionCol = _.findIndex(this.modifyFeeRuleSetting.header,{ 'dataCode': "position"});
+        this.modifyFeeRuleSheet.getRange(-1,positionCol, -1, 1, GC.Spread.Sheets.SheetArea.viewport).locked(ration_install.feeType=='子目费用'||ration_install.unifiedSetting==1);//设置选取位置列只读
+    },
     showRationInstallationData:function (node) {
         var installationList = [];
         var ration_installation = projectObj.project.ration_installation;
         var ration = node.data;
         if (ration_installation.datas && ration_installation.datas.length > 0) {
-            installationList = _.filter(ration_installation.datas, {'projectID': ration.projectID, 'rationID': ration.ID})
+            for(let i =0; i < ration_installation.datas.length;i++){
+                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);
+                   installationList.push(tem_ri);
+                }
+            }
         }
         this.rationInstallData = installationList;
         this.rationInstallSheet.setRowCount(0);
@@ -357,7 +409,8 @@ let installationFeeObj={
     },
     refreshRationInstallationRow:function (row) {
         let ri = this.rationInstallData[row];
-        this.rationInstallData[row] = projectObj.project.ration_installation.getByID(ri.ID);
+        let tem_ri = _.cloneDeep(projectObj.project.ration_installation.getByID(ri.ID));
+        this.rationInstallData[row] = this.getRIRuleData(tem_ri.ruleId,tem_ri,tem_ri);
         sheetCommonObj.showRowData(this.rationInstallSheet, this.rationInstallSetting,row,this.rationInstallData);
     },
     refreshFeeDetailRow:function (row) {
@@ -499,6 +552,15 @@ let installationFeeObj={
         this.moreFeeRuleSheet.selectionUnit(1);//0 cell,1 row,2 col;
         this.moreFeeRuleSheet.name('moreFeeRuleSheet');
     },
+    initModifyFeeRuleSpread:function () {
+        let me = this;
+        me.modifyFeeRuleSpread = SheetDataHelper.createNewSpread($("#modifyFeeRuleSpread")[0]);
+        me.modifyFeeRuleSheet = me.modifyFeeRuleSpread.getSheet(0);
+        me.initSheet(me.modifyFeeRuleSheet, me.modifyFeeRuleSetting);
+        this.modifyFeeRuleSpread.bind(GC.Spread.Sheets.Events.ButtonClicked, this.onPositionButtonClick);
+        me.modifyFeeRuleSheet.bind(GC.Spread.Sheets.Events.EditStarting, this.onModifyFeeRuleEditStarting);
+        this.modifyFeeRuleSheet.name('modifyFeeRuleSheet');
+    },
     initRationInstallSheet:function (sheet) {
         let me = this;
         this.rationInstallSheet = sheet;
@@ -522,6 +584,8 @@ let installationFeeObj={
                 locked = true;
             }else if(me.rationInstallData[row].unifiedSetting==1){
                 locked = true;
+            }else if(!me.rationInstallData[row].ruleId||me.rationInstallData[row].ruleId==''){
+                locked = true;
             }
             installationFeeObj.rationInstallSheet.getCell(row,col).locked(locked);
         }
@@ -609,20 +673,24 @@ let installationFeeObj={
             }
         }
     },
-    getBillDataForSelect:function () {//这里有个地方共用
+    getBillDataForSelect:function () {//这里有个地方共用
         let controller = projectObj.mainController, project = projectObj.project;
         let from = $('#calc_position_from').val();
-        let rootNode = null,allNodes = [],datas = [],billID = null,feeItem=null;
+        let rootNode = null,allNodes = [],datas = [],billID = null,selectedItem=null;
         if(from=="rationInstallSheet"){
             let riSelection = this.rationInstallSheet.getSelections()[0];
-            feeItem = this.rationInstallData[riSelection.row];
-            billID = feeItem.billID;
+            selectedItem = this.rationInstallData[riSelection.row];
+            billID = selectedItem.billID;
+        }else if(from=="modifyFeeRuleSheet"){
+            let riSelection = this.modifyFeeRuleSheet.getSelections()[0];
+            selectedItem = this.modifyFeeRuleData[riSelection.row];
+            billID = selectedItem.billID;
         }else {
             let selection = this.feeItemSheet.getSelections()[0];
-            feeItem = this.feeItemData[selection.row];
+            selectedItem = this.feeItemData[selection.row];
             if(from =="feeItemSheet"){
-                if(feeItem.billID){
-                    billID = feeItem.billID;
+                if(selectedItem.billID){
+                    billID = selectedItem.billID;
                 }
             }else if(from =="feeDetailSheet") {
                 let detailSelection = this.feeDetailSheet.getSelections()[0];
@@ -632,9 +700,9 @@ let installationFeeObj={
                 }
             }
         }
-        if(feeItem.feeType=='措施费用'){
+        if(selectedItem.feeType=='措施费用'){
             rootNode = project.Bills.getMeasureNode(controller);
-        }else if(feeItem.feeType=='分项费用'){
+        }else if(selectedItem.feeType=='分项费用'){
             rootNode = project.Bills.getFBFXNode(controller);
         }
         allNodes.push(rootNode);
@@ -678,27 +746,72 @@ let installationFeeObj={
                 this.updateFeeRulePosition(pobj.recode);
             }else if(from=='rationInstallSheet'){
                 this.updateRationInstallPosition(pobj.recode);
+            }else if(from =='modifyFeeRuleSheet'){
+                this.updateModifyFeeRulePosition(pobj.recode);
             }
         }
         $("#calc_position").modal('hide');
     },
-    updateRationInstallPosition:function(recode){
+    confirmFeeRuleModify:function () {
+        let me = this,installation_fee = projectObj.project.installation_fee;
+        let modifyRule = me.modifyFeeRuleData[0];
+        let updateMap = null;
+        console.log(me.modifyEditedObj);
+        if(me.modifyEditedObj==null){
+            $("#modify_feeRule").modal('hide');
+            return;
+        }
+        let feeRule = installation_fee.getFeeRuleByID(modifyRule.libID,modifyRule.ID);
+        if(feeRule){
+            for(let mkey in me.modifyEditedObj){
+                if(me.modifyEditedObj[mkey]!=feeRule[mkey]){//说明是值发生了改变
+                    updateMap==null?updateMap={}:"";
+                    updateMap[mkey] =me.modifyEditedObj[mkey];
+                }
+            }
+            if(updateMap){//如果有需要更新的属性
+                if(modifyRule.base&&installSectionBase.indexOf(modifyRule.base)>0){
+                    let sum = modifyRule.labour+modifyRule.material+modifyRule.machine;//三项的和要等于100
+                    if(sum!=100){
+                       alert("人工、材料、机械的和应等于100,请重新输入。");
+                       return;
+                    }
+                }
+                $("#modify_feeRule").modal('hide');
+                installation_fee.updateFeeRule(updateMap,modifyRule.libID,modifyRule.ID,function () {
+                    me.refreshRationInstallationRow(me.rationInstallSheet.getSelections()[0].row);
+                });
+            }
+        }
+    },
+    updateModifyFeeRulePosition:function (recode) {
         let me = this;
+        let riselection = me.modifyFeeRuleSheet.getSelections()[0];
+        let modifyFee = me.modifyFeeRuleData[riselection.row];
+        let positionCol = _.findIndex(me.modifyFeeRuleSetting.header,{ 'dataCode': "position"});
+        if(modifyFee.billID == recode.ID){//和原来的位置没变
+            return
+        }
+        if(me.modifyEditedObj==null){//初始化
+            me.modifyEditedObj={};
+        }
+        me.modifyEditedObj.position = recode.code;
+        me.modifyEditedObj.billID = recode.ID;
+        modifyFee.position = recode.code;
+        modifyFee.billID = recode.ID;
+        me.modifyFeeRuleSheet.setValue(riselection.row,positionCol,me.getDisplayText(modifyFee));
+        console.log(me.modifyEditedObj);
+    },
+    updateRationInstallPosition:function(recode){
+        let me = this, installation_fee = projectObj.project.installation_fee;
         let riselection = me.rationInstallSheet.getSelections()[0];
         let rationInstall = me.rationInstallData[riselection.row];
         if(rationInstall.billID == recode.ID){//和原来的位置没变
-            return
+            return;
         }
-        let updateData = {
-            projectID:rationInstall.projectID,
-            ID:rationInstall.ID,
-            position:recode.code,
-            billID:recode.ID
-        };
-        projectObj.project.ration_installation.update(updateData,function (data) {
+        installation_fee.updateFeeRule({position:recode.code,billID:recode.ID},rationInstall.libID,rationInstall.ruleId,function (){
             me.refreshRationInstallationRow(riselection.row);
         });
-
     },
     updateFeeRulePosition:function (recode) {
         let me = this;
@@ -706,42 +819,28 @@ let installationFeeObj={
         let feeItem = this.feeItemData[itemSelection.row];
         let detailSelection = this.feeDetailSheet.getSelections()[0];
         let detail = this.feeDetailData[detailSelection.row];
-        let itemUpdateData = null;
-        let updateData = null;
         if(detail.billID ==recode.ID ){//和原来的位置没变
             return;
         }
-        let detailUpdateData = me.getDetailUpdateData(detail,{position:recode.code,billID:recode.ID},'feeRule');
-        if(recode.ID!=feeItem.billID){//不一样的情况下要清空费用项的选取位置
-            itemUpdateData = me.getFeeItemUpdateData(feeItem,{ position: "", billID:""});
-        }
-        itemUpdateData==null?updateData = detailUpdateData:updateData=[detailUpdateData,itemUpdateData];
-        $.bootstrapLoading.start();
-        me.submitInstallationUpdate(updateData,function (data) {
-            //更新缓存
-            if(itemUpdateData){
+        projectObj.project.installation_fee.updateFeeRule({position:recode.code,billID:recode.ID},feeItem.libID,detail.feeRuleId,function (isFeeItemUpdate){
+            if(isFeeItemUpdate){
                 feeItem.position ="";
                 feeItem.billID = "";
                 feeItem.displayPosition = "";
                 me.feeItemSheet.getCell(itemSelection.row, 3).value(feeItem.displayPosition);
             }
-            let feeRule = projectObj.project.installation_fee.getFeeRuleByID(feeItem.libID,detail.feeRuleId);
-            feeRule.position = recode.code;
-            feeRule.billID = recode.ID;
             me.showFeeDetailData(feeItem.libID,feeItem.ID);
-            $.bootstrapLoading.end();
         });
     },
     updateFeeRuleToSection:function (row) {
-        let me = this;
+        let me = this, installation_fee=projectObj.project.installation_fee;
         let feeRule = me.moreFeeRuleData[row];
         let detailSelection = me.feeDetailSheet.getSelections()[0];
         let detail = this.feeDetailData[detailSelection.row];
-        let updateData = me.getDetailUpdateData(detail,{"feeRuleId":feeRule.ID},'installSection');
+        let updateData = installation_fee.getSectionUpdateData(detail.libID,detail.ID,{"feeRuleId":feeRule.ID});
         $.bootstrapLoading.start();
-        me.submitInstallationUpdate(updateData,function (data) {
-            let install_fee = projectObj.project.installation_fee;
-            let section = install_fee.getInstallSectionByID(detail.libID,detail.ID);
+        installation_fee.submitInstallationUpdate(updateData,function (data) {
+            let section = installation_fee.getInstallSectionByID(detail.libID,detail.ID);
             section.feeRuleId = feeRule.ID;
             me.refreshFeeDetailRow(detailSelection.row);
             $.bootstrapLoading.end();
@@ -756,7 +855,12 @@ let installationFeeObj={
             me.refreshRationInstallationRow(ri_row);
             return;
         }
-        let updateData = me.getRIRuleUpdateData(feeRule.ID,raInstallation);
+        let updateData = {
+            ID:raInstallation.ID,
+            projectID:raInstallation.projectID,
+            ruleId:feeRule.ID,
+            unifiedSetting:0
+        };
         projectObj.project.ration_installation.update(updateData,function (data) {
             me.refreshRationInstallationRow(ri_row);
         });
@@ -768,11 +872,11 @@ let installationFeeObj={
         if(feeItem.billID ==recode.ID ){//和原来的位置没变
             return;
         }
-        let updateData = me.getFeeItemUpdateData(feeItem,{ position: recode.code, billID:recode.ID});
-        let [dataArray,impacRules] = me.getFeeRuleUpdateData(feeItem,recode);
+        let updateData =  projectObj.project.installation_fee.getFeeItemUpdateData(feeItem,{ position: recode.code, billID:recode.ID});
+        let [dataArray,impacRules] = me.getFeeRuleUpdateDataByFeeItem(feeItem,recode);
         dataArray.push(updateData);
         $.bootstrapLoading.start();
-        me.submitInstallationUpdate(dataArray,function (data) {
+        projectObj.project.installation_fee.submitInstallationUpdate(dataArray,function (data) {
             //更新缓存
             feeItem.position =recode.code;
             feeItem.billID = recode.ID;
@@ -786,7 +890,7 @@ let installationFeeObj={
             $.bootstrapLoading.end();
         });
     },
-    getFeeRuleUpdateData : function (feeItem,recode) {
+    getFeeRuleUpdateDataByFeeItem : function (feeItem,recode) {
         let dataArray = [];
         let impacRules = projectObj.project.installation_fee.getFeeRuleByFeeItem(feeItem);
         for(let ir of impacRules){
@@ -810,6 +914,9 @@ let installationFeeObj={
         if(info.sheetName == 'rationInstallSheet'){
             installationFeeObj.onRationInstallValueChange(e,info);
         }
+        if(info.sheetName == 'modifyFeeRuleSheet'){
+            installationFeeObj.modifyFeeRuleValueChange(e,info);
+        }
     },
     onFeeItemValueChange:function (e,info) {
         let me = installationFeeObj;
@@ -817,9 +924,9 @@ let installationFeeObj={
         let header = this.feeItemSetting.header[info.col];
         let doc={};
         doc[header.dataCode] = info.newValue;
-        let updateData = installationFeeObj.getFeeItemUpdateData(feeItem,doc);
+        let updateData =  projectObj.project.installation_fee.getFeeItemUpdateData(feeItem,doc);
         $.bootstrapLoading.start();
-        me.submitInstallationUpdate(updateData,function (data) {
+        projectObj.project.installation_fee.submitInstallationUpdate(updateData,function (data) {
             //更新缓存
             feeItem[header.dataCode]=info.newValue;
             me.feeItemSheet.getCell(info.row, info.col).value(info.newValue);
@@ -831,9 +938,12 @@ let installationFeeObj={
         if(info.newValue==info.oldValue){
             return;
         }
-        let updateData = null;
         let raInstallation = me.rationInstallData[info.row];
         let fieldID =  me.rationInstallSetting.header[info.col].dataCode;
+        let updateData = {
+            projectID:raInstallation.projectID,
+            ID:  raInstallation.ID
+        };
         if(fieldID=='ruleId'){//选择新的规则项
             if(info.newValue=="more"){//选择的是更多
                 $("#more_from").val("rationInstallation");
@@ -845,24 +955,60 @@ let installationFeeObj={
             }else if(info.newValue == raInstallation.rule){
                 return;
             }else {
-                updateData = me.getRIRuleUpdateData(info.newValue,raInstallation);
+                updateData.unifiedSetting = 0;//切换费用规则时去掉统一设置勾选。
             }
-        }else {
-            updateData = {
-                projectID:raInstallation.projectID,
-                ID:  raInstallation.ID
-            };
-            updateData[fieldID] = info.newValue;
         }
+        if(fieldID=='unifiedSetting'){//勾选统一设置
+            updateData.ruleId = '';
+            let feeItem =  projectObj.project.installation_fee.getFeeItemByID(raInstallation.libID,raInstallation.feeItemId);
+            let section = projectObj.project.installation_fee.getInstallSectionByID(raInstallation.libID,raInstallation.sectionId);
+            if(section&&feeItem&&feeItem.isCal == 1){
+                updateData.ruleId = section.feeRuleId;
+            }
+        }
+        updateData[fieldID] = info.newValue;
         projectObj.project.ration_installation.update(updateData,function (data) {
             me.refreshRationInstallationRow(info.row);
         });
     },
+    modifyFeeRuleValueChange:function (e,info) {
+        let me = installationFeeObj;
+        let fieldID = me.modifyFeeRuleSetting.header[info.col].dataCode;
+        let value = info.newValue;
+        if(me.modifyEditedObj==null){//初始化
+            me.modifyEditedObj={};
+        }
+        if(fieldID=="position"){//改变选取位置时不触发
+            return;
+        }
+        if(fieldID == 'base'){//修改基数
+            if(installSectionBase.indexOf(info.newValue)===0){//如果选择的是“人材机乘系数”时,清空“费率(%)”列的值
+                me.modifyEditedObj.feeRate = null;
+                let feeRateCol = _.findIndex(me.modifyFeeRuleSetting.header,{ 'dataCode': "feeRate"});
+                me.modifyFeeRuleSheet.setValue(info.row, feeRateCol, null);
+            }
+        }else if(fieldID=="feeRate"||fieldID=='machine'||fieldID=='material'||fieldID=="labour"){
+            if(value != null){
+                if(number_util.isNumber(value)){
+                    value = scMathUtil.roundForObj(info.newValue,getDecimal("feeRate"));
+                    me.modifyFeeRuleSheet.setValue(info.row, info.col, value);
+                }else {
+                    alert('当前输入的数据类型不正确,请重新输入。');
+                    me.modifyFeeRuleSheet.setValue(info.row, info.col, info.oldValue);
+                    return;
+                }
+            }
+        }
+        me.modifyEditedObj[fieldID] = value;
+        me.modifyFeeRuleData[info.row][fieldID] = value;
+        console.log(me.modifyEditedObj);
+    },
     onFeeDetailValueChange:function (e,info) {
         if(info.newValue==info.oldValue){
             return;
         }
         let me = installationFeeObj;
+        let install_fee = projectObj.project.installation_fee;
         let feeDetail = this.feeDetailData[info.row];
         let header = this.feeDetailSetting.header[info.col];
         let fieldID = header.dataCode;
@@ -878,7 +1024,7 @@ let installationFeeObj={
             }else if(info.newValue == feeDetail.ruleName){
                 return;
             }else {
-                updateData = me.getDetailUpdateData(feeDetail,{"feeRuleId":info.newValue},'installSection');
+                updateData = install_fee.getSectionUpdateData(feeDetail.libID,feeDetail.ID,{"feeRuleId":info.newValue});
             }
 
         }else if(fieldID == 'base'){
@@ -889,7 +1035,7 @@ let installationFeeObj={
                 if(installSectionBase.indexOf(info.newValue)===0){//如果选择的是“人材机乘系数”时,清空“费率(%)”列的值
                     doc.feeRate = null;
                 }
-                updateData = me.getDetailUpdateData(feeDetail,doc,'feeRule');
+                updateData = install_fee.getFeeRuleUpdateData(feeDetail.libID,feeDetail.feeRuleId,doc);
             }
 
         }else {
@@ -906,10 +1052,9 @@ let installationFeeObj={
             let doc = {};
             doc[fieldID] = info.newValue;
             feeDetail[fieldID] = info.newValue;
-            updateData = me.getDetailUpdateData(feeDetail,doc,'feeRule');
+            updateData =  install_fee.getFeeRuleUpdateData(feeDetail.libID,feeDetail.feeRuleId,doc);
         }
-        me.submitInstallationUpdate(updateData,function (data) {
-            let install_fee = projectObj.project.installation_fee;
+        install_fee.submitInstallationUpdate(updateData,function (data) {
             if(updateData){
                 if(updateData.type=="installSection"){
                     let section = install_fee.getInstallSectionByID(feeDetail.libID,feeDetail.ID);
@@ -954,7 +1099,7 @@ let installationFeeObj={
             if(detail.base&&installSectionBase.indexOf(detail.base)>0){
                 let sum = detail.labour+detail.material+detail.machine;//三项的和要等于100
                 if(sum!=100){
-                    setTimeout(function () {//这里须用延时执行的办法,不然的弹窗确认窗口会和spreadjs 的事件有冲突,造成定额工料机数据不会根据树结点更新的问题
+                    setTimeout(function () {//这里须用延时执行的办法,不然的弹窗确认窗口会和spreadjs 的事件有冲突
                         alert("人工、材料、机械的和应等于100,请重新输入。");
                     }, 200);
                     canChange = false;
@@ -963,14 +1108,8 @@ let installationFeeObj={
         }
         return canChange;
     },
-    getRIRuleUpdateData:function (newRuleID,rationInstallation) {
-        let data={
-            ID:rationInstallation.ID,
-            projectID:rationInstallation.projectID,
-            ruleId:newRuleID,
-            unifiedSetting:0
-        };
-        if(newRuleID==''){//选择的是无
+    getRIRuleData : function (ruleID,rationInstallation,data) {
+        if(ruleID==''){//选择的是无
             data.code = '';
             data.rule = '';
             data.base = '';
@@ -981,7 +1120,7 @@ let installationFeeObj={
             data.position = '';
             data.billID = '';
         }
-        let feeRule = projectObj.project.installation_fee.getFeeRuleByID(rationInstallation.libID,newRuleID);
+        let feeRule = projectObj.project.installation_fee.getFeeRuleByID(rationInstallation.libID,ruleID);
         if(feeRule){
             data.code = feeRule.code;
             data.rule = feeRule.rule;
@@ -994,32 +1133,6 @@ let installationFeeObj={
             data.billID = feeRule.billID;
         }
         return data;
-    },
-    getDetailUpdateData : function (detail,doc,type) {//type:installSection/feeRule
-        let installationFee = projectObj.project.installation_fee.getInstallationFeeByLibID(detail.libID);
-        let updateData = {
-            ID:installationFee.ID,
-            itemID:type=="installSection"?detail.ID:detail.feeRuleId,
-            type:type,
-            doc:doc
-        };
-        return updateData;
-    },
-    getFeeItemUpdateData : function (item,doc) {
-        let updateData = {
-            ID:item.installFeeID,
-            itemID:item.ID,
-            type:'installFeeItem',
-            doc:doc
-        };
-        return updateData;
-    },
-    submitInstallationUpdate:function (updateData,callback) {
-        if(updateData){
-            CommonAjax.post('/installation/updateInstallationFee',{'projectID':projectInfoObj.projectInfo.ID,'updateData':updateData},function (data) {
-                callback(data);
-            })
-        }
     }
 };
 
@@ -1047,9 +1160,14 @@ $(function () {
         installationFeeObj.showMoreFeeRule();
     });
 
-   /* $('#calc_position').on('hidden.bs.modal',function () {
+    $('#modify_feeRule').on('shown.bs.modal',function () {
+        installationFeeObj.modifyEditedObj=null;//清空已编辑信息
+        if(installationFeeObj.modifyFeeRuleSpread == null){//修改规则表格初始化
+            installationFeeObj.initModifyFeeRuleSpread();
+        }
+        installationFeeObj.showModifyFeeRule();
+    });
 
-    });*/
     $('#positionSheetFilter').click(function (){
         installationFeeObj.positionSelectedObject = null;//清空选中记录
         installationFeeObj.filterSelectionNodes();
@@ -1062,6 +1180,9 @@ $(function () {
     $('#select_position_confirm').click(function (){
         installationFeeObj.selectPositionConfirm();
     });
+    $('#modify_feeRule_confirm').click(function (){
+        installationFeeObj.confirmFeeRuleModify();
+    });
     $('#calc_installation_fee_confirm').click(function (){
         let me = installationFeeObj;
         let info = {
@@ -1128,6 +1249,5 @@ $(function () {
         }else if(from == 'rationInstallation'){//在定额安装增加费那里点击更多
             me.refreshRationInstallationRow(me.rationInstallSheet.getSelections()[0].row);
         }
-
     });
 });

+ 1 - 17
web/building_saas/main/js/views/sub_view.js

@@ -34,6 +34,7 @@ SheetDataHelper.protectdSheet(subSpread.getSheet(3));
 //安装增加费
 installationFeeObj.initRationInstallSheet(subSpread.getSheet(5));
 SheetDataHelper.protectdSheet(subSpread.getSheet(5));
+gljContextMenu.loadGLJSpreadContextMenu();
 
 $("#linkGLJ").click(function(){
     $("#subItems").children().hide();//控制显示subSpread,隐藏特征及内容spread
@@ -41,8 +42,6 @@ $("#linkGLJ").click(function(){
     pageCCOprObj.active = false;
     refreshSubSpread();
     subSpread.setActiveSheetIndex(0);
-    $.contextMenu( 'destroy', "#subSpread" );
-    gljContextMenu.loadGLJSpreadContextMenu();
     gljOprObj.activeTab='#linkGLJ';
     // for test
     //subSpread.getActiveSheet().setValue(0, 0, "工料机");
@@ -54,10 +53,7 @@ $("#linkFZDE").click(function(){
     pageCCOprObj.active = false;
     refreshSubSpread();
     subSpread.setActiveSheetIndex(1);
-    $.contextMenu( 'destroy', "#subSpread" );
     gljOprObj.activeTab='#linkFZDE';
-    // for test
-  //  subSpread.getActiveSheet().setValue(0, 0, "辅助定额");
 });
 $("#linkFZTJ").click(function(){
     $("#subItems").children().hide();
@@ -65,10 +61,7 @@ $("#linkFZTJ").click(function(){
     pageCCOprObj.active = false;
     refreshSubSpread();
     subSpread.setActiveSheetIndex(2);
-    $.contextMenu( 'destroy', "#subSpread" );
     gljOprObj.activeTab='#linkFZTJ';
-    // for test
-    //subSpread.getActiveSheet().setValue(0, 0, "附注条件");
 });
 
 
@@ -79,11 +72,7 @@ $("#linkAZZJF").click(function(){
     pageCCOprObj.active = false;
     refreshSubSpread();
     subSpread.setActiveSheetIndex(5);
-    $.contextMenu( 'destroy', "#subSpread" );
-    //gljContextMenu.loadQuantityDetailMenu();
     gljOprObj.activeTab='#linkAZZJF';
-    // for test
-    //subSpread.getActiveSheet().setValue(0, 0, "安装增加费");
 });
 
 $("#linkGCLMX").click(function(){
@@ -92,15 +81,10 @@ $("#linkGCLMX").click(function(){
     pageCCOprObj.active = false;
     refreshSubSpread();
     subSpread.setActiveSheetIndex(3);
-    $.contextMenu( 'destroy', "#subSpread" );
-    gljContextMenu.loadQuantityDetailMenu();
     gljOprObj.activeTab='#linkGCLMX';
-    // for test
-    //subSpread.getActiveSheet().setValue(0, 0, "工程量明细");
 });
 
 $("#linkJSCX").click(function(){        // 计算程序
-    $.contextMenu( 'destroy', "#subSpread" );
     $("#subItems").children().hide();
     $("#subSpread").show();
     pageCCOprObj.active = false;