Browse Source

update installation fee

zhangweicheng 7 years ago
parent
commit
b997d07543

+ 16 - 14
modules/main/facade/installation_facade.js

@@ -23,26 +23,28 @@ async function updateInstallationFee(projectID,updateData) {
 
 function generateUpdateTask(projectID,updateData) {
     let tasks = [];
-    if(updateData instanceof Array){
-        for(let ud of updateData){
-            let [uquery,udoc] = createUpdateQuery(projectID,ud);
+    if(updateData){
+        if(updateData instanceof Array){
+            for(let ud of updateData){
+                let [uquery,udoc] = createUpdateQuery(projectID,ud);
+                let task={
+                    updateOne:{
+                        filter:uquery,
+                        update :udoc
+                    }
+                };
+                tasks.push(task);
+            }
+        } else {
+            let [query,doc] = createUpdateQuery(projectID,updateData);
             let task={
                 updateOne:{
-                    filter:uquery,
-                    update :udoc
+                    filter:query,
+                    update :doc
                 }
             };
             tasks.push(task);
         }
-    } else {
-        let [query,doc] = createUpdateQuery(projectID,updateData);
-        let task={
-            updateOne:{
-                filter:query,
-                update :doc
-            }
-        };
-        tasks.push(task);
     }
     return tasks;
 

+ 51 - 37
public/web/sheet/sheet_common.js

@@ -135,48 +135,62 @@ var sheetCommonObj = {
                 sheet.setValue(0, col, setting.header[col].headerName, header);
                 sheet.setColumnWidth(col, setting.header[col].headerWidth?setting.header[col].headerWidth:100);
             }
-            for (var row = 0; row < data.length; row++) {
-                //var cell = sheet.getCell(row, col, GC.Spread.Sheets.SheetArea.viewport);
-                var val = data[row][setting.header[col].dataCode];
-                if(val&&setting.header[col].dataType === "Number"){
-                    if(setting.header[col].hasOwnProperty('tofix')){
-                        val =scMathUtil.roundToString(val,setting.header[col].tofix);
-                    }
-                    else if(setting.header[col].hasOwnProperty('decimalField')){
-                        var decimal = getDecimal(setting.header[col].decimalField);
-                        val =scMathUtil.roundToString(val,decimal);
-                        sheet.setFormatter(-1, col,getFormatter(decimal), GC.Spread.Sheets.SheetArea.viewport);
-                    }else {
-                        val =scMathUtil.roundToString(val,2);
-                    }
-                }
-                if(val!=null&&setting.header[col].cellType === "checkBox"){
-                    this.setCheckBoxCell(row,col,sheet,val)
-                 }
-                 if(setting.header[col].cellType === "comboBox"){
-                     this.setComboBox(row,col,sheet,setting.header[col].options);
-                 }
-                if(setting.header[col].cellType === "selectButton"){
-                    this.setSelectButton(row,col,sheet,setting.header[col]);
-                }
-                 if(setting.owner==='gljTree'){
-                    if(setting.header[col].cellType === "checkBox"){
-                        val==1?val:0;
-                        this.setCheckBoxCell(row,col,sheet,val);
-                    }
-                    if(setting.header[col].dataCode === 'gljType' && data[row].gljType){
-                        let distTypeVal =  distTypeTree.distTypes[distTypeTree.prefix + data[row].gljType].data.fullName;
-                        val=distTypeVal;
-                    }
-                 }
-                sheet.setValue(row, col, val, ch);
-            }
+        }
+        for (var row = 0; row < data.length; row++) {
+            //var cell = sheet.getCell(row, col, GC.Spread.Sheets.SheetArea.viewport);
+            this.showRowData(sheet,setting,row,data);
         }
         this.lockCells(sheet,setting);
         sheet.resumeEvent();
         sheet.resumePaint();
         //me.shieldAllCells(sheet);
     },
+    showRowData:function (sheet,setting,row,data) {
+        let ch = GC.Spread.Sheets.SheetArea.viewport;
+        for (var col = 0; col < setting.header.length; col++) {
+            //var cell = sheet.getCell(row, col, GC.Spread.Sheets.SheetArea.viewport);
+            var val = data[row][setting.header[col].dataCode];
+            if(val&&setting.header[col].dataType === "Number"){
+                if(setting.header[col].hasOwnProperty('tofix')){
+                    val =scMathUtil.roundToString(val,setting.header[col].tofix);
+                }
+                else if(setting.header[col].hasOwnProperty('decimalField')){
+                    var decimal = getDecimal(setting.header[col].decimalField);
+                    val =scMathUtil.roundToString(val,decimal);
+                    sheet.setFormatter(-1, col,getFormatter(decimal), GC.Spread.Sheets.SheetArea.viewport);
+                }else {
+                    val =scMathUtil.roundToString(val,2);
+                }
+            }
+            if(val!=null&&setting.header[col].cellType === "checkBox"){
+                this.setCheckBoxCell(row,col,sheet,val)
+            }
+            if(setting.header[col].cellType === "comboBox"){
+                this.setComboBox(row,col,sheet,setting.header[col].options);
+            }
+            if(setting.header[col].cellType === "selectButton"){
+                this.setSelectButton(row,col,sheet,setting.header[col]);
+            }
+            if(setting.owner==='gljTree'){
+                if(setting.header[col].cellType === "checkBox"){
+                    val==1?val:0;
+                    this.setCheckBoxCell(row,col,sheet,val);
+                }
+                if(setting.header[col].dataCode === 'gljType' && data[row].gljType){
+                    let distTypeVal =  distTypeTree.distTypes[distTypeTree.prefix + data[row].gljType].data.fullName;
+                    val=distTypeVal;
+                }
+            }
+            if(setting.header[col].getText){
+                val = setting.getText[setting.header[col].getText](data[row],val)
+            }
+            sheet.setValue(row, col, val, ch);
+        }
+        if(setting.autoFit==true){
+            sheet.getRange(row, -1, 1, -1, GC.Spread.Sheets.SheetArea.viewport).wordWrap(true);
+            sheet.autoFitRow(row);
+        }
+    },
     analyzePasteData: function(setting, pastedInfo) {
         var rst = [], propId = pastedInfo.cellRange.col, preStrIdx = 0, itemObj = {};//propId = 0 to proId = pastedInfo.cellRange.col, update by zhong
         for (var i = 0; i < pastedInfo.pasteData.text.length; i++) {
@@ -235,7 +249,7 @@ var sheetCommonObj = {
     },
     setComboBox(row,col,sheet,options){
         //let combo = new GC.Spread.Sheets.CellTypes.ComboBox();
-        let dynamicCombo = sheetCommonObj.getDynamicCombo();
+        let dynamicCombo = sheetCommonObj.getDynamicCombo(true);
         dynamicCombo.itemHeight(options.length).items(options);
         sheet.setCellType(row, col,dynamicCombo,GC.Spread.Sheets.SheetArea.viewport);
     },

+ 26 - 3
web/building_saas/main/html/main.html

@@ -867,7 +867,7 @@
             <div class="modal-content" style="width: 1100px">
                 <div class="modal-header">
                     <h5 class="modal-title">统一设置计取安装费用</h5>
-                    <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                    <button type="button" class="close" id="calc_installation_fee_close" aria-label="Close">
                         <span aria-hidden="true">&times;</span>
                     </button>
                 </div>
@@ -903,8 +903,8 @@
                 </div>
                 <div class="modal-footer">
                     <button type="button" class="btn btn-link" >恢复默认值</button>
-                    <button type="button" class="btn btn-secondary" data-dismiss="modal">关闭</button>
-                    <a href="" class="btn btn-primary">确定</a>
+                  <!--  <button type="button" class="btn btn-secondary" data-dismiss="modal">关闭</button>-->
+                    <button  class="btn btn-primary" id="calc_installation_fee_confirm">确定</button>
                 </div>
             </div>
         </div>
@@ -944,6 +944,29 @@
             </div>
         </div>
     </div>
+
+    <!--弹出 查询安装费用-->
+    <div class="modal fade" id="more_feeRule" data-backdrop="static">
+        <div class="modal-dialog modal-lg" 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="more_feeRule_close">
+                        <span aria-hidden="true">&times;</span>
+                    </button>
+                </div>
+                <div class="modal-body">
+                    <div class="modal-fixed-height" id="moreFeeRuleSpread"><!--sjs ID设置此div--->
+                    </div>
+                </div>
+                <div class="modal-footer">
+                    <button type="button" class="btn btn-secondary" id="more_feeRule_concel" data-dismiss="modal">取消</button>
+                    <button class="btn btn-primary" id="more_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>
 

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

@@ -40,6 +40,10 @@ var installation_fee = {
             let installSections = _.filter(installationFee.installSection,{'feeItemId':feeItemId});
             return installSections;
         };
+        installation_fee.prototype.getFeeItemByID = function(libID,ID){
+            let installFee = projectObj.project.installation_fee.getInstallationFeeByLibID(libID);
+            return _.find(installFee.installFeeItem,{'ID':ID});
+        };
         installation_fee.prototype.getInstallSectionByID = function(libID,ID){
             let installFee = projectObj.project.installation_fee.getInstallationFeeByLibID(libID);
             return _.find(installFee.installSection,{'ID':ID});

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

@@ -659,7 +659,6 @@ var gljOprObj = {
                 me.updateRationAss(args);
             }
         }
-        ;
     },
     generateHtmlString: function () {
 //        return "<div id='edit'><div>";

+ 291 - 49
web/building_saas/main/js/views/installation_fee_view.js

@@ -23,9 +23,9 @@ let installationFeeObj={
     feeDetailSetting: {
         header: [
             {headerName: "分册章节", headerWidth: 150, dataCode: "name", dataType: "String"},
-            {headerName: "费用规则", headerWidth: 220, dataCode: "rule", hAlign: "left", dataType: "String"},
+            {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"},
+            {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"},
@@ -34,11 +34,40 @@ let installationFeeObj={
         ],
         view: {
             lockColumns: [0, 2]
+        },
+        autoFit:true,
+        getText:{
+            forRule:function (item,val) {
+                if(item.feeRuleId&&item.feeRuleId!=""){
+                    let subRule = _.find(item.impactRules,{'ID':item.feeRuleId});
+                    if(!subRule){
+                        val = item.ruleName;
+                    }
+                }
+                return val;
+            }
         }
     },
     positionSpread:null,
     positionSheet:null,
     positionData:null,
+    moreFeeRuleSpread:null,
+    moreFeeRuleSheet:null,
+    moreFeeRuleData:null,
+    moreFeeRuleSetting:{
+        header: [
+            {headerName: "编码", headerWidth: 70, dataCode: "code", hAlign: "left", dataType: "String"},
+            {headerName: "费用规则", headerWidth: 320, dataCode: "rule", hAlign: "left", dataType: "String"},
+            {headerName: "基数", headerWidth: 140, dataCode: "base", hAlign: "center", dataType: "String"},
+            {headerName: "费率(%)", headerWidth: 80, dataCode: "feeRate", hAlign: "right", dataType: "String"},
+            {headerName: "人工(%)", headerWidth: 80, dataCode: "labour", hAlign: "right", dataType: "String"},
+            {headerName: "材料(%)", headerWidth: 80, dataCode: "material", hAlign: "right", dataType: "String"},
+            {headerName: "机械(%)", headerWidth: 80, dataCode: "machine", hAlign: "right", dataType: "String"}
+        ],
+        view: {
+            lockColumns: [0,1,2,3,4,5,6]
+        }
+    },
     selectionTree:null,
     selectionTreeController:null,
     positionSetting:{
@@ -130,6 +159,7 @@ let installationFeeObj={
     },
     positionData:null,
     positionSelectedObject:null,
+    L_M_M:null,
     showCalcInstallSettingDiv:function () {
         $("#calc_installation_fee").modal({show:true});
     },
@@ -156,25 +186,48 @@ let installationFeeObj={
        this.feeDetailSheet = this.feeDetailSpread.getSheet(0);
        this.initSheet(this.feeDetailSheet,this.feeDetailSetting);
        this.feeDetailSheet.bind(GC.Spread.Sheets.Events.SelectionChanged,this.onFeeDetailSelectionChange);
+       this.feeDetailSheet.bind(GC.Spread.Sheets.Events.RangeChanged, this.onDetailRangeChanged);
        this.feeDetailSpread.bind(GC.Spread.Sheets.Events.ButtonClicked, this.onSelectButtonClick);
        this.feeDetailSheet.name('feeDetailSheet');
        this.feeDetailSheet.setRowCount(0);
     },
     onFeeItemSelectionChange:function (e, info) {
+        console.log('fee item selection change');
+        console.log(info);
+        let me = installationFeeObj;
         let newSelections = info.newSelections;
         let row = newSelections[0].row;
-        let selected = installationFeeObj.feeItemData[row];
-        if(selected&&selected.libID){//说明是选中了费用项
-            installationFeeObj.positionButtonChecking(row,selected);
-            installationFeeObj.showFeeDetailData(selected.libID,selected.ID);
+        let selected = me.feeItemData[row];
+        let canChange = me.detailResultCheck(info);
+        if(canChange == false){
+            let os = info.oldSelections[0];
+            setTimeout(function () {//这里是因为费用项名字的单元格是自定义的树结构,点击这一列单元格切换行时,如果不设置延时的话,selectionChange事件会触发两次
+                info.sheet.setSelection(os.row,os.col,os.rowCount,os.colCount);
+            },200);
         }else {
-            installationFeeObj.showFeeDetailData();
+            if(selected&&selected.libID){//说明是选中了费用项
+                me.positionButtonChecking(row,selected);
+                me.showFeeDetailData(selected.libID,selected.ID);
+            }else {
+                me.showFeeDetailData();
+            }
         }
-        installationFeeObj.feeItemSheet.repaint();
+       // me.feeItemSheet.repaint();
     },
     onFeeDetailSelectionChange:function (e,info) {
-
-        installationFeeObj.feeDetailSheet.repaint();
+        console.log('detail selection change');
+        let me = installationFeeObj;
+        if(me.detailReloadSelection){
+            info.sheet.setSelection(me.detailReloadSelection.row,me.detailReloadSelection.col,1,1);
+            me.detailReloadSelection=null;
+        }else {
+            let canChange = me.detailResultCheck(info);
+            if(canChange == false){
+                let os = info.oldSelections[0];
+                info.sheet.setSelection(os.row,os.col,os.rowCount,os.colCount);
+            }
+        }
+        me.feeDetailSheet.repaint();
     },
     positionButtonChecking:function (row,recode) {//按钮有效性检查
         if(recode.feeType){
@@ -246,15 +299,28 @@ let installationFeeObj={
             this.feeDetailSheet.resumePaint();
         }
     },
+    showMoreFeeRule:function () {
+        this.moreFeeRuleData = this.getMoreFeeRuleData();
+        this.moreFeeRuleSheet.setRowCount(0);
+        sheetCommonObj.showData(this.moreFeeRuleSheet, this.moreFeeRuleSetting, this.moreFeeRuleData);
+        this.moreFeeRuleSheet.setRowCount(this.moreFeeRuleData.length);
+        this.moreFeeRuleSheet.clearSelection();
+    },
+    refreshFeeDetailRow:function (row) {
+        let detail = this.feeDetailData[row];
+        let section = projectObj.project.installation_fee.getInstallSectionByID(detail.libID,detail.ID);
+        this.feeDetailData[row] = this.getDetailRowDataBySection(section,detail.libID);
+        sheetCommonObj.showRowData(this.feeDetailSheet, this.feeDetailSetting,row,this.feeDetailData);
+        let feeItem = projectObj.project.installation_fee.getFeeItemByID(detail.libID,detail.feeItemId);
+        this.lockDetailSheet(row,this.feeDetailData[row],feeItem);
+    },
     lockDetailSheet:function(row,detail,feeItem){
         if(detail.feeRuleId){//选中了规则项
             for(let col=0;col<this.feeDetailSetting.header.length;col++) {
                 let header = this.feeDetailSetting.header[col];
                 if(header.dataCode=='feeRate'){
                     let baseIndex = installSectionBase.indexOf(detail.base);
-                    if(baseIndex<1){
-                        this.feeDetailSheet.getCell(row,col).locked(true);
-                    }
+                    this.feeDetailSheet.getCell(row,col).locked(baseIndex<1);//当基数是“人材机乘系数”时,“费率(%)”列只读。
                 }
                 if(header.dataCode=='position'){
                     this.feeDetailSheet.getCell(row,col).locked(feeItem.feeType=='子目费用');
@@ -265,11 +331,11 @@ let installationFeeObj={
         }
     },
     setDetailRuleCell:function(row,detail){
-        let impactRules = projectObj.project.installation_fee.getFeeRuleBySection(detail);
         let options=[{text:"无",value:""}];
-        for(let ir of impactRules){
+        for(let ir of detail.impactRules){
             options.push({text:ir.rule,value:ir.ID});
         }
+        options.push({text:"更多",value:'more'});
         let dynamicCombo = sheetCommonObj.getDynamicCombo();//new GC.Spread.Sheets.CellTypes.ComboBox();
         dynamicCombo.items(options);
         dynamicCombo.editorValueType(GC.Spread.Sheets.CellTypes.EditorValueType.value);
@@ -307,34 +373,48 @@ let installationFeeObj={
         return  item.position;
     },
     getFeeDetailData : function(libID,feeItemId){
+        let me = installationFeeObj;
         let feeDetailArr = [];
         let installSections =projectObj.project.installation_fee.getInstallSectionsByfeeItemID(libID,feeItemId);
         for(let is of installSections){
-            let tem_detail = {
-                ID:is.ID,
-                feeItemId:is.feeItemId,
-                name:is.name,
-                feeRuleId:is.feeRuleId,
-                libID:libID,
-                rule:is.feeRuleId,
-            };
-            if(is.feeRuleId){
-                let feeRule = projectObj.project.installation_fee.getFeeRuleByID(libID,is.feeRuleId);
-                if(feeRule){
-                    tem_detail.code = feeRule.code;
-                    tem_detail.base = feeRule.base;
-                    tem_detail.feeRate = feeRule.feeRate;
-                    tem_detail.labour = feeRule.labour;
-                    tem_detail.material = feeRule.material;
-                    tem_detail.machine = feeRule.machine;
-                    tem_detail.position = installationFeeObj.getDisplayText(feeRule);
-                    tem_detail.billID = feeRule.billID;
-                }
-            }
+            let tem_detail = me.getDetailRowDataBySection(is,libID);
             feeDetailArr.push(tem_detail);
         }
         return feeDetailArr;
-
+    },
+    getMoreFeeRuleData:function () {
+        let me = installationFeeObj;
+        let fee_select = me.feeItemSheet.getSelections()[0];
+        let feeItem = me.feeItemData[fee_select.row];
+        let feeRules =  projectObj.project.installation_fee.getFeeRuleByFeeItem(feeItem);
+        return feeRules;
+    },
+    getDetailRowDataBySection(is,libID){
+        let me = this;
+        let tem_detail = {
+            ID:is.ID,
+            feeItemId:is.feeItemId,
+            name:is.name,
+            feeRuleId:is.feeRuleId,
+            libID:libID,
+            rule:is.feeRuleId,
+        };
+        if(is.feeRuleId){
+            let feeRule = projectObj.project.installation_fee.getFeeRuleByID(libID,is.feeRuleId);
+            if(feeRule){
+                tem_detail.code = feeRule.code;
+                tem_detail.base = feeRule.base;
+                tem_detail.feeRate = feeRule.feeRate;
+                tem_detail.labour = feeRule.labour;
+                tem_detail.material = feeRule.material;
+                tem_detail.machine = feeRule.machine;
+                tem_detail.position = me.getDisplayText(feeRule);
+                tem_detail.billID = feeRule.billID;
+                tem_detail.ruleName = feeRule.rule;
+            }
+        }
+        tem_detail.impactRules = projectObj.project.installation_fee.getFeeRuleBySection(tem_detail);
+        return tem_detail;
     },
     initSheet: function (sheet,setting) {
         var me = this;
@@ -348,6 +428,22 @@ let installationFeeObj={
         this.positionSheet = this.positionSpread.getActiveSheet();
         this.positionSpread.bind(GC.Spread.Sheets.Events.ButtonClicked, this.onPositionCheckBoxClick);
     },
+    initMoreFeeRuleSpread:function () {
+        this.moreFeeRuleSpread = SheetDataHelper.createNewSpread($("#moreFeeRuleSpread")[0]);
+        this.moreFeeRuleSheet = this.moreFeeRuleSpread.getSheet(0);
+        this.initSheet(this.moreFeeRuleSheet,this.moreFeeRuleSetting);
+        this.moreFeeRuleSheet.bind(GC.Spread.Sheets.Events.CellDoubleClick, this.onFeeRuleDoubleClick);
+        this.moreFeeRuleSheet.selectionUnit(1);//0 cell,1 row,2 col;
+        this.moreFeeRuleSheet.name('moreFeeRuleSheet');
+    },
+    onFeeRuleDoubleClick:function (e,info) {
+        if(info.row){
+            installationFeeObj.updateFeeRuleToSection(info.row);
+        }else {
+            return;
+        }
+        $('#more_feeRule').modal('hide');
+    },
     onPositionCheckBoxClick:function (e,args) {
         let me = installationFeeObj;
         var checkboxValue = args.sheet.getCell(args.row, args.col).value();
@@ -515,7 +611,7 @@ let installationFeeObj={
                 feeItem.position ="";
                 feeItem.billID = "";
                 feeItem.displayPosition = "";
-                me.feeItemSheet.getCell(itemSelection.row, itemSelection.col).value(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;
@@ -524,6 +620,21 @@ let installationFeeObj={
             $.bootstrapLoading.end();
         });
     },
+    updateFeeRuleToSection:function (row) {
+        let me = this;
+        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');
+        $.bootstrapLoading.start();
+        me.submitInstallationUpdate(updateData,function (data) {
+            let install_fee = projectObj.project.installation_fee;
+            let section = install_fee.getInstallSectionByID(detail.libID,detail.ID);
+            section.feeRuleId = feeRule.ID;
+            me.refreshFeeDetailRow(detailSelection.row);
+            $.bootstrapLoading.end();
+        });
+    },
     updateFeeItemPosition:function(recode){
         let me = this;
         let selection = this.feeItemSheet.getSelections()[0];
@@ -587,24 +698,102 @@ let installationFeeObj={
         });
     },
     onFeeDetailValueChange:function (e,info) {
-        console.log("value change");
+        if(info.newValue==info.oldValue){
+            return;
+        }
         let me = installationFeeObj;
         let feeDetail = this.feeDetailData[info.row];
         let header = this.feeDetailSetting.header[info.col];
-        let fiedID = header.dataCode;
+        let fieldID = header.dataCode;
         let updateData = null;
-        if(fiedID == 'rule'){//选择新的规则项
+        if(fieldID == 'rule'){//选择新的规则项
+            if(info.newValue=="more"){//选择的是更多
+                $("#more_feeRule").modal({show:true});
+                return;
+            }
             updateData = me.getDetailUpdateData(feeDetail,{"feeRuleId":info.newValue},'installSection');
+        }else if(fieldID == 'base'){
+            if(info.newValue == null){//如果基数为空,重新刷新显示
+                me.refreshFeeDetailRow(info.row);
+            }else {
+                let doc ={base:info.newValue};
+                if(installSectionBase.indexOf(info.newValue)===0){//如果选择的是“人材机乘系数”时,清空“费率(%)”列的值
+                    doc.feeRate = null;
+                }
+                updateData = me.getDetailUpdateData(feeDetail,doc,'feeRule');
+            }
+
+        }else {
+            if(info.newValue != null){
+                if(number_util.isNumber(info.newValue)){
+                    info.newValue = scMathUtil.roundForObj(info.newValue,getDecimal("feeRate"));
+                }else {
+                    alert('当前输入的数据类型不正确,请重新输入。');
+                    me.showFeeDetailData(feeDetail.libID,feeDetail.feeItemId);
+                    me.detailReloadSelection={row:info.row,col:info.col};
+                    return;
+                }
+            }
+            let doc = {};
+            doc[fieldID] = info.newValue;
+            feeDetail[fieldID] = info.newValue;
+            updateData = me.getDetailUpdateData(feeDetail,doc,'feeRule');
         }
         me.submitInstallationUpdate(updateData,function (data) {
-            if(updateData.type=="installSection"){
-                let section = projectObj.project.installation_fee.getInstallSectionByID(feeDetail.libID,feeDetail.ID);
-                section.feeRuleId = info.newValue;
+            let install_fee = projectObj.project.installation_fee;
+            if(updateData){
+                if(updateData.type=="installSection"){
+                    let section = install_fee.getInstallSectionByID(feeDetail.libID,feeDetail.ID);
+                    section.feeRuleId = info.newValue;
+                }
+                if(updateData.type=="feeRule"){
+                    let feeRule = install_fee.getFeeRuleByID(feeDetail.libID,feeDetail.feeRuleId);
+                    let updateDoc = updateData.doc;
+                    for(let key in updateDoc){
+                        feeRule[key] = updateDoc[key];
+                    }
+                }
+              me.refreshFeeDetailRow(info.row);
             }
-
-            me.showFeeDetailData(feeDetail.libID,feeDetail.feeItemId);
+            //me.showFeeDetailData(feeDetail.libID,feeDetail.feeItemId);
         });
     },
+    onDetailRangeChanged:function (e,info) {
+        let me = installationFeeObj;
+        if (info.action == GC.Spread.Sheets.RangeChangedAction.clear) {
+            let header = me.feeDetailSetting.header[info.col];
+            info.oldValue = me.feeDetailData[info.row][header.dataCode];
+            info.newValue = null;
+           me.onFeeDetailValueChange(e,info);
+        }
+    },
+    detailResultCheck:function (info) {
+        let me = installationFeeObj;
+        let canChange = true;
+        let os = null;
+        if(info.newSelections[0].row == info.oldSelections[0].row){//没有换行
+            return canChange;
+        }
+        if(info.sheetName=='feeDetailSheet'){
+            os = info.oldSelections[0];
+        }
+        if(info.sheetName=='feeItemSheet'){
+            os = me.feeDetailSheet.getSelections()[0];
+        }
+        if(this.feeDetailData&&this.feeDetailData.length>0&&this.feeDetailData[os.row]){
+            let detail = this.feeDetailData[os.row];
+            if(detail.base&&installSectionBase.indexOf(detail.base)>0){
+                let sum = detail.labour+detail.material+detail.machine;//三项的和要等于100
+                if(sum!=100){
+                    setTimeout(function () {//这里须用延时执行的办法,不然的弹窗确认窗口会和spreadjs 的事件有冲突,造成定额工料机数据不会根据树结点更新的问题
+                        alert("人工、材料、机械的和应等于100,请重新输入。");
+                    }, 200);
+                    canChange = false;
+                }
+            }
+        }
+        return canChange;
+    },
     getDetailUpdateData : function (detail,doc,type) {//type:installSection/feeRule
         let installationFee = projectObj.project.installation_fee.getInstallationFeeByLibID(detail.libID);
         let updateData = {
@@ -625,9 +814,11 @@ let installationFeeObj={
         return updateData;
     },
     submitInstallationUpdate:function (updateData,callback) {
-        CommonAjax.post('/installation/updateInstallationFee',{'projectID':projectInfoObj.projectInfo.ID,'updateData':updateData},function (data) {
-            callback(data);
-        })
+        if(updateData){
+            CommonAjax.post('/installation/updateInstallationFee',{'projectID':projectInfoObj.projectInfo.ID,'updateData':updateData},function (data) {
+                callback(data);
+            })
+        }
     }
 };
 
@@ -648,6 +839,12 @@ $(function () {
         }
         installationFeeObj.loadSelectionNodes();
     });
+    $('#more_feeRule').on('shown.bs.modal',function () {
+        if(installationFeeObj.moreFeeRuleSpread == null){//初始化显示
+            installationFeeObj.initMoreFeeRuleSpread();
+        }
+        installationFeeObj.showMoreFeeRule();
+    });
 
    /* $('#calc_position').on('hidden.bs.modal',function () {
 
@@ -664,7 +861,52 @@ $(function () {
     $('#select_position_confirm').click(function (){
         installationFeeObj.selectPositionConfirm();
     });
+    $('#calc_installation_fee_confirm').click(function (){
+        let me = installationFeeObj;
+        let info = {
+            sheetName:'feeDetailSheet',
+            newSelections:[{row:-1}],
+            oldSelections: me.feeDetailSheet.getSelections()
+        };
+        let canChange = me.detailResultCheck(info);
+        if(canChange==false){
+            return;
+        }
+        let val = $('input[name="install_setting_radios"]:checked').val();
+        console.log(val);
 
+    });
+    $('#calc_installation_fee_close').click(function (){
+        let me = installationFeeObj;
+        let info = {
+            sheetName:'feeDetailSheet',
+            newSelections:[{row:-1}],
+            oldSelections: me.feeDetailSheet.getSelections()
+        }
+        let canChange = me.detailResultCheck(info);
+        if(canChange==false){
+            return;
+        }
+        $('#calc_installation_fee').modal('hide');
+    });
 
+    $('#more_feeRule_confirm').click(function (){
+        let me = installationFeeObj;
+        let selections = me.moreFeeRuleSheet.getSelections();
+        $('#more_feeRule').modal('hide');
+        if(selections.length>0){
+            me.updateFeeRuleToSection(selections[0].row);
+        }else {
+            me.refreshFeeDetailRow(me.feeDetailSheet.getSelections()[0].row);
+        }
+    });
+    $('#more_feeRule_concel').click(function () {
+        let me = installationFeeObj;
+        me.refreshFeeDetailRow(me.feeDetailSheet.getSelections()[0].row);
+    });
+    $('#more_feeRule_close').click(function () {
+        let me = installationFeeObj;
+        me.refreshFeeDetailRow(me.feeDetailSheet.getSelections()[0].row);
+    });
 
 });