Bladeren bron

Merge branch 'master' of http://smartcost.f3322.net:3000/SmartCost/ConstructionCost

zhongzewei 7 jaren geleden
bovenliggende
commit
86bba5db69

+ 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);

+ 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();

+ 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 - 10
modules/main/models/ration_installation.js

@@ -15,16 +15,6 @@ 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});
 

+ 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 - 0
modules/reports/rpt_component/helper/jpc_helper_common.js

@@ -70,6 +70,7 @@ let JpcCommonHelper = {
         let me = this, arrDPI = [];
         if (!me.commonConstant.resolution) {
             arrDPI = [96,96];
+            // arrDPI = [100,100];
             me.commonConstant.resolution = arrDPI;
         } else {
             arrDPI = me.commonConstant.resolution;

+ 17 - 0
modules/reports/rpt_component/helper/jpc_helper_field.js

@@ -20,6 +20,7 @@ let JpcFieldHelper = {
         }
     },
     findAndPutDataFieldIdx: function (rptTpl, tab_fields, rstFields, rstFieldsIdx, isEx) {
+        //通过FieldID找到相关映射指标的位置IDX并记录下来,方便后续引用
         if (tab_fields) {
             let DTL_STR = isEx?JV.NODE_DETAIL_FIELDS_EX:JV.NODE_DETAIL_FIELDS;
             let detail_fields = rptTpl[JV.NODE_FIELD_MAP][DTL_STR];
@@ -39,6 +40,22 @@ let JpcFieldHelper = {
                 }
             }
         }
+    },
+    findAutoHeightFieldIdx: function(rptTpl, tab_fields, rstFieldsIdx, isEx) {
+        if (tab_fields) {
+            let DTL_STR = isEx?JV.NODE_DETAIL_FIELDS_EX:JV.NODE_DETAIL_FIELDS;
+            let detail_fields = rptTpl[JV.NODE_FIELD_MAP][DTL_STR];
+            for (let i = 0; i < tab_fields.length; i++) {
+                if (tab_fields[i][JV.PROP_IS_AUTO_HEIGHT]) {
+                    for (let j = 0; j < detail_fields.length; j++) {
+                        if (tab_fields[i]["FieldID"] === detail_fields[j]["ID"]) {
+                            rstFieldsIdx.push(j);
+                            break;
+                        }
+                    }
+                }
+            }
+        }
     }
 };
 

+ 17 - 97
modules/reports/rpt_component/jpc_flow_tab.js

@@ -9,6 +9,7 @@ let JpcDiscreteHelper = require('./helper/jpc_helper_discrete');
 let JpcTextHelper = require('./helper/jpc_helper_text');
 let JpcCommonOutputHelper = require('./helper/jpc_helper_common_output');
 let JpcAreaHelper = require('./helper/jpc_helper_area');
+let PDFKit = require('pdfkit');
 
 let JpcFlowTabSrv = function(){};
 //let grpPageInfo = {"segGrpRecStartIdx": 0, "insertedGrpRecAmt": 0, "preAddPageGrpInfo": null};
@@ -87,6 +88,7 @@ JpcFlowTabSrv.prototype.createNew = function(){
         me.page_sum_fields_idx = [];
         me.page_sum_tab_fields = [];
 
+        me.auto_height_fields_idx = [];//那些被标记为判断自动行高的指标集合
         me.group_fields = [];
         me.group_sum_fields = [];
         me.group_sum_values = null;
@@ -107,6 +109,7 @@ JpcFlowTabSrv.prototype.createNew = function(){
         JpcFieldHelper.findAndPutDataFieldIdx(rptTpl, rptTpl[FLOW_NODE_STR][JV.NODE_FLOW_PAGE_SUM][JV.PROP_SUM_FIELDS], me.page_sum_tab_fields, me.page_sum_fields_idx, me.isEx);
         JpcFieldHelper.findAndPutDataFieldIdx(rptTpl, rptTpl[FLOW_NODE_STR][JV.NODE_FLOW_GROUP][JV.PROP_GROUP_FIELDS], me.group_fields, null, me.isEx);
         JpcFieldHelper.findAndPutDataFieldIdx(rptTpl, rptTpl[FLOW_NODE_STR][JV.NODE_FLOW_GROUP][JV.PROP_SUM_FIELDS], me.group_sum_fields, null, me.isEx);
+        JpcFieldHelper.findAutoHeightFieldIdx(rptTpl, rptTpl[FLOW_NODE_STR][JV.NODE_FLOW_CONTENT][JV.PROP_FLOW_FIELDS], me.auto_height_fields_idx, me.isEx);
         for (let si = 0; si < dataSeq.length; si++) {
             me.segments.push(dataSeq[si].slice(0));
         }
@@ -209,6 +212,14 @@ JpcFlowTabSrv.prototype.createNew = function(){
             }
         }
     };
+    JpcFlowTabResult.setupAutoHeightData = function(rptTpl, dataObj, $CURRENT_RPT) {
+        //自动行高功能,需要考虑以下情况:
+        //1. 每一Segment的需要增加行的数量
+        //2. 边界条件(跨页处理)
+        let me = this;
+        let CURRENT_FLOW_INFO = (me.isEx)?JV.NODE_FLOW_INFO_EX:JV.NODE_FLOW_INFO;
+        //rptTpl[CURRENT_FLOW_INFO][JV.NODE_FLOW_GROUP][JV.PROP_GROUP_LINES].length;
+    };
 
     JpcFlowTabResult.preSetupPages = function (rptTpl, dataObj, defProperties, option, $CURRENT_RPT, followTabEx) {
         //换一种思路来整理流水式数据
@@ -302,13 +313,14 @@ JpcFlowTabSrv.prototype.createNew = function(){
                 currentRecAmt = 0;
                 counterRowRec = 0;
                 counterRowRecEx = 0;
-                let ttlSegRecAmtNormal = me.segments[segIdx].length + grpRecAmt;
-                let ttlSegRecAmt = (followTabEx)?(me.segments[segIdx].length + grpRecAmt + followTabEx.segments[segIdx].length + grpRecAmtEx):(me.segments[segIdx].length + grpRecAmt);
+                let ttlSegRecAmtNormal = me.segments[segIdx].length + grpRecAmt; //正常的segment下的数据长度累计(含grouping data)
+                let ttlSegRecAmt = (followTabEx)?(me.segments[segIdx].length + grpRecAmt + followTabEx.segments[segIdx].length + grpRecAmtEx):(me.segments[segIdx].length + grpRecAmt); //所有的segment下的数据长度累计(包括ex部分)
                 while (true) {
                     if (currentRecAmt > 0) pageStatus[JV.STATUS_SEGMENT_START] = false;
                     if (pageIdx > 0) pageStatus[JV.STATUS_REPORT_START] = false;
                     //开始判断各种scenarios
                     if (ttlSegRecAmtNormal < ttlSegRecAmt) {
+                        //有流水拓展,并且是follow mode
                         if (currentRecAmt + maxRowRec > ttlSegRecAmtNormal) {
                             if (currentRecAmt >= ttlSegRecAmtNormal) {
                                 //纯 followTabEx 数据
@@ -355,6 +367,7 @@ JpcFlowTabSrv.prototype.createNew = function(){
                             private_addPage(segIdx, grpSeqInfo, false, false, -1);
                         }
                     } else {
+                        //普通流水数据情况
                         if (currentRecAmt + maxRowRec >= ttlSegRecAmt) {
                             pageStatus[JV.STATUS_SEGMENT_END] = true;
                             pageStatus[JV.STATUS_REPORT_END] = true;
@@ -379,9 +392,9 @@ JpcFlowTabSrv.prototype.createNew = function(){
                         //备注:这里必须得考虑多栏的情况,否则会造成pageStatus出界的问题
                         break;
                     }
-                    //控制阀值,超过阀值则强制退出,防止死循环
+                    //控制阈值,超过阈值则强制退出,防止死循环
                     threshold++;
-                    if (threshold > 500) {
+                    if (threshold > 1000) {
                         console.log("Hey! There may be a dead loop here!!!");
                         break;
                     }
@@ -394,99 +407,6 @@ JpcFlowTabSrv.prototype.createNew = function(){
         return rst;
     };
 
-    JpcFlowTabResult.preSetupPages_Org = function (rptTpl, dataObj, defProperties, option, $CURRENT_RPT, followTabEx) {
-        let me = this, rst = 1, counterRowRec = 0, maxRowRec = 1, pageIdx = 0;
-        me.setupGroupingData(rptTpl, dataObj, $CURRENT_RPT);
-        if (followTabEx) {
-            followTabEx.setupGroupingData(rptTpl, dataObj, $CURRENT_RPT);
-        }
-        //console.log(me.group_sum_values);
-        me.paging_option = option||JV.PAGING_OPTION_NORMAL;
-        let CURRENT_FLOW_INFO = (me.isEx)?JV.NODE_FLOW_INFO_EX:JV.NODE_FLOW_INFO;
-        JpcFieldHelper.findAndPutDataFieldIdx(rptTpl, rptTpl[CURRENT_FLOW_INFO][JV.NODE_FLOW_CONTENT][JV.PROP_FLOW_FIELDS], null, me.disp_fields_idx, me.isEx);
-        if (me.paging_option === JV.PAGING_OPTION_INFINITY) {
-            rst = me.segments.length;
-            let pageStatus = [true, true, false, true, true, true, false, false];
-            for (let segIdx = 0; segIdx < me.segments.length; segIdx++) {
-                if (segIdx === me.segments.length - 1) {
-                    pageStatus[JV.STATUS_REPORT_END] = true;
-                }
-                if (segIdx > 0) {
-                    pageStatus[JV.STATUS_REPORT_START] = false;
-                }
-                me.pageStatusLst.push(pageStatus.slice(0));
-                pageIdx++;
-                let grpSeqInfo = (me.group_node_info)?me.group_node_info[segIdx]:null;
-                private_addPageValue(me.dispValueIdxLst, me.segments[segIdx], grpSeqInfo, 0, me.segments[segIdx].length, me.page_seg_map, segIdx, pageIdx, null, false);
-                if (followTabEx) {
-                    //
-                }
-            }
-        } else {
-            let bands = JpcBand.createNew(rptTpl, defProperties);
-            let pageStatus = [true, true, false, true, false, false, false, false];
-            if (me.isEx) {
-                pageStatus[JV.STATUS_REPORT_START] = false;
-            }
-            if (rptTpl[CURRENT_FLOW_INFO][JV.PROP_MULTI_COLUMN]) {
-                me.multiCols = 1 * rptTpl[CURRENT_FLOW_INFO][JV.PROP_MULTI_COLUMN];
-            }
-            function private_resetBandArea() {
-                JpcBandHelper.setBandArea(bands, rptTpl, pageStatus, !me.isEx, me.isEx);
-                maxRowRec = JpcFlowTabHelper.getMaxRowsPerPage(bands, rptTpl, me.isEx);
-            }
-            let grpPageInfo = {};
-            for (let segIdx = 0; segIdx < me.segments.length; segIdx++) {
-                let grpSeqInfo = (me.group_node_info)?me.group_node_info[segIdx]:null;
-                grpPageInfo[JV.PROP_SEG_GRP_IDX] = 0;
-                grpPageInfo[JV.PROP_INSERTED_GRP_REC] = 0;
-                grpPageInfo[JV.PROP_PRE_ADD_GRP_REC_INFO] = [];
-                grpPageInfo[JV.PROP_GRP_LINES] = me.group_lines_amt;
-                private_resetBandArea();
-                let orgMaxRowRec = maxRowRec;
-                let grpRecAmt = (grpSeqInfo)?(grpSeqInfo.length*me.group_lines_amt):0;
-                let grpRecAmtEx = 0;
-                let rowSplitCnt = Math.ceil(1.0 * (me.segments[segIdx].length + grpRecAmt) / orgMaxRowRec);
-                let rowSplitCntEx = rowSplitCnt;
-                if (followTabEx) {
-                    rowSplitCntEx = Math.ceil(1.0 * (me.segments[segIdx].length + grpRecAmt + followTabEx.segments[segIdx].length + grpRecAmtEx) / orgMaxRowRec);
-                }
-                pageStatus[JV.STATUS_SEGMENT_END] = true;
-                private_resetBandArea();
-                let len = (followTabEx)?(me.segments[segIdx].length + grpRecAmt + followTabEx.segments[segIdx].length + grpRecAmtEx):(me.segments[segIdx].length + grpRecAmt);
-                //let hasAdHocRow = !JpcFlowTabHelper.chkSegEnd(bands, rptTpl, me.segments[segIdx].length, (rowSplitCntEx - 1) * orgMaxRowRec, maxRowRec, me.isEx);
-                let hasAdHocRow = !JpcFlowTabHelper.chkSegEnd(bands, rptTpl, len, (rowSplitCntEx - 1) * orgMaxRowRec, maxRowRec, me.isEx);
-                if (hasAdHocRow) rowSplitCntEx++;
-                if (rowSplitCntEx % me.multiCols > 0) {
-                    rowSplitCntEx++
-                }
-                counterRowRec = 0;
-                for (let segPageIdx = 0; segPageIdx < rowSplitCntEx; segPageIdx++) {
-                    pageStatus[JV.STATUS_SEGMENT_END] = (segPageIdx === (rowSplitCntEx - 1));
-                    if (pageIdx > 0) pageStatus[JV.STATUS_REPORT_START] = false;
-                    private_resetBandArea();
-                    me.pageStatusLst.push(pageStatus.slice(0));
-                    pageIdx++;
-                    if (followTabEx) {
-                        //
-                    } else {
-                        //
-                    }
-                    private_addPageValue(me.dispValueIdxLst, me.segments[segIdx], grpSeqInfo, counterRowRec, maxRowRec,me.page_seg_map, segIdx, pageIdx, grpPageInfo, false);
-                    //备注: 考虑到分组数据是临时融入的,所以需要知道这一页的数据融入了多少条group数据,并且得考虑边界条件情况(group数据可能跨页!)
-                    for (let dv of me.dispValueIdxLst[me.dispValueIdxLst.length - 1]) {
-                        if (dv[1] === JV.DISPLAY_VAL_TYPE_NORMAL) counterRowRec++;
-                    }
-                }
-                pageStatus[JV.STATUS_SEGMENT_END] = false;
-                pageStatus[JV.STATUS_REPORT_START] = false;
-            }
-            // console.log(me.dispValueIdxLst);
-            rst = Math.ceil(pageIdx / me.multiCols);
-        }
-        me.pagesAmt = rst;
-        return rst;
-    };
     JpcFlowTabResult.outputAsSimpleJSONPage = function (rptTpl, dataObj, page, bands, controls, adHocMergePos, $CURRENT_RPT) {
         let me = this, rst = [], tabRstLst = [];
         let FLOW_NODE_STR = me.isEx?JV.NODE_FLOW_INFO_EX:JV.NODE_FLOW_INFO;

+ 4 - 2
modules/reports/util/rpt_excel_util.js

@@ -634,7 +634,7 @@ function writeSheet(pageData, sheetData, paperSize, sharedStrList, stylesObj){
             rst.push('<col min="' + i +'" max="' + i +'" width="' + w + '" customWidth="1"/>');
         }
         /*/
-        for (let i = 1; i < xPos.length - 2; i++) {
+        for (let i = 1; i < xPos.length - 1; i++) {
             w = 1.0 * (xPos[i + 1] - xPos[i]) / DPI * 25.4 / 2.117;
             w = Math.round(w * 1000) / 1000;
             rst.push('<col min="' + i +'" max="' + i +'" width="' + w + '" customWidth="1"/>');
@@ -825,7 +825,9 @@ function writeSheet(pageData, sheetData, paperSize, sharedStrList, stylesObj){
     private_setSheetData();
     private_setMergedCells();
     rst.push('<phoneticPr fontId="1" type="noConversion"/>');
-    rst.push('<pageMargins left="0.315" right="0.215" top="0.315" bottom="0.315" header="0" footer="0"/>');
+    // rst.push('<pageMargins left="0.315" right="0.215" top="0.315" bottom="0.315" header="0" footer="0"/>');
+    rst.push('<pageMargins left="' + (parseFloat(pageData[JV.NODE_PAGE_INFO][JV.NODE_MARGINS][JV.PROP_LEFT]) * 0.39375) +
+        '" right="0.215" top="0.315" bottom="0.315" header="0" footer="0"/>');
     let paperSizeIdx = JV.PAGES_SIZE_STR.indexOf(paperSize);
     let pStr = '';
     if (paperSizeIdx >= 0) {

+ 1 - 0
public/web/rpt_value_define.js

@@ -107,6 +107,7 @@ const JV = {
     PROP_POSITION: "Position",
     PROP_HIDDEN: "Hidden",
     PROP_IS_SERIAL: "isSerial",
+    PROP_IS_AUTO_HEIGHT: "isAutoHeight",
     PROP_FONT: "font",
     PROP_CONTROL: "control",
     PROP_STYLE: "style",

+ 8 - 6
test/unit/reports/test_tpl_09.js

@@ -44,12 +44,12 @@ let demoRptId = 232, pagesize = "A4";
 
 let userId_Leng = 1142; //小冷User Id
 // demoPrjId = 720; //QA: DW3
-demoPrjId = 1348; //QA:
-/*/
+demoPrjId = 1626; //QA:
+//*/
 let userId_Dft = userId_Leng;
 /*/
- let userId_Dft = 76075;
- //*/
+let userId_Dft = 76075;
+//*/
 
 let rptTplFacade = require("../../../modules/reports/facade/rpt_template_facade");
 let rptTplDataFacade = require("../../../modules/reports/facade/rpt_tpl_data_facade");
@@ -124,7 +124,7 @@ test('测试 - 测试模板啦: ', function (t) {
         rptTplDataFacade.prepareProjectData(userId_Dft, demoPrjId, filter, function (err, msg, rawDataObj) {
             if (!err) {
                 try {
-                    // fsUtil.writeObjToFile(rawDataObj, "D:/GitHome/ConstructionCost/tmp/rptTplRawDataObject.js");
+                    // fsUtil.writeObjToFile(rawDataObj, "D:/GitHome/ConstructionCost/tmp/rptTplRawDataObject.jsp");
                     let tplData = rptDataUtil.assembleData(rawDataObj);
                     //it's time to build the report!!!
                     let printCom = JpcEx.createNew();
@@ -132,11 +132,13 @@ test('测试 - 测试模板啦: ', function (t) {
                     let defProperties = rpt_cfg;
                     let dftOption = JV.PAGING_OPTION_NORMAL;
                     printCom.initialize(rptTpl);
+                    // fsUtil.writeObjToFile(tplData, "D:/GitHome/ConstructionCost/tmp/rptAssembledData.jsp");
+                    // fsUtil.writeObjToFile(rawDataObj, "D:/GitHome/ConstructionCost/tmp/rptRawDataAfterAssembled.jsp");
                     printCom.analyzeData(rptTpl, tplData, defProperties, dftOption);
                     let maxPages = printCom.totalPages;
                     let pageRst = printCom.outputAsSimpleJSONPageArray(rptTpl, tplData, 1, maxPages, defProperties);
                     if (pageRst) {
-                        // fsUtil.writeObjToFile(pageRst, "D:/GitHome/ConstructionCost/tmp/testBuiltPageResult.js");
+                        // fsUtil.writeObjToFile(pageRst, "D:/GitHome/ConstructionCost/tmp/rptPageResult.jsp");
                     } else {
                         console.log("oh! no pages were created!");
                     }

+ 23 - 2
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">
@@ -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>
 

+ 37 - 40
web/building_saas/main/js/models/calc_program.js

@@ -403,76 +403,73 @@ let calcTools = {
         }
         return result;
     },
-    supplyABFee: function (treeNode, baseName) {
+    partASupplyFee: function (treeNode, baseName) {
         if (!treeNode.data.gljList) return 0;
         let projectGLJ = projectObj.project.projectGLJ;
 
         let supplyT = [];
         if (baseName.includes('甲供'))
-            supplyT = [supplyType.BFJG, supplyType.WQJG]  // 字段中存储的是汉字!
-            // supplyT = ['部分甲供', '完全甲供']
+            supplyT = [supplyType.BFJG, supplyType.WQJG]  // 字段中存储的是汉字、数字混杂!
         else if (baseName.includes('甲定'))
             supplyT = [supplyType.JDYG];
-            // supplyT = ['甲定乙供'];
 
-        let gljT = [], compositionTypesArr = [];
+        let gljT = [], compT = [];
         if (baseName == calcBaseNames.JGDEJJRGF || baseName == calcBaseNames.JDDEJJRGF){
             gljT = [gljType.LABOUR];
         }
         else if (baseName == calcBaseNames.JGDEJJCLF || baseName == calcBaseNames.JDDEJJCLF){
             gljT = baseMaterialTypes;
-            compositionTypesArr = compositionTypes;
+            compT = compositionTypes;
         }
         else if (baseName == calcBaseNames.JGDEJJJXF || baseName == calcBaseNames.JDDEJJJXF){
             gljT = baseMachineTypes;
-            compositionTypesArr = [gljType.GENERAL_MACHINE];
+            compT = [gljType.GENERAL_MACHINE];
         }
         else if (baseName == calcBaseNames.JGZCF || baseName == calcBaseNames.JDZCF){
             gljT = [gljType.MAIN_MATERIAL];
-            compositionTypesArr = [gljType.MAIN_MATERIAL];
+            compT = [gljType.MAIN_MATERIAL];
         }
         else if (baseName == calcBaseNames.JGSBF || baseName == calcBaseNames.JDSBF){
             gljT = [gljType.EQUIPMENT];
         };
         // alert(JSON.stringify(projectGLJ.testGLJs()));
-        let supplyProjectGLJs = projectGLJ.getGLJsBySupply(supplyT, gljT);
-        if (supplyProjectGLJs.length == 0) return 0;
-
-        let pGLJIdx = {};
-        for (let pglj of supplyProjectGLJs){pGLJIdx[pglj.id] = pglj};
+        let supplyGLJs = projectGLJ.getGLJsBySupply(supplyT, gljT);
+        if (supplyGLJs.length == 0) return 0;
+        let supplyGLJsIdx = {};
+        for (let sglj of supplyGLJs){supplyGLJsIdx[sglj.id] = sglj};
+
+        function isSupply(composition, supplies) {
+            for (let supply of supplies){
+                if(supply.code == composition.code && supply.name == composition.name && supply.unit == composition.unit &&
+                    supply.specs == composition.specs && supply.type == composition.type ){
+                    composition.basePrice = supply.unit_price.base_price;
+                    return true;
+                }
+            };
+            return false;
+        };
 
         let sum = 0;
         for (let glj of treeNode.data.gljList){
             // 组成物的母体。母体如果有组成物,则母体无法作为甲供材料,无法设置,此时要看其组成物是否是甲供材料;母体如果没有组成物,则母体有可能成为甲供材料。
-            if (compositionTypesArr.includes(glj.type)) {
-                if (pGLJIdx[glj.projectGLJID]) {  // 组成物的母体是甲供材料
+            if (compT.includes(glj.type)) {
+                if (supplyGLJsIdx[glj.projectGLJID]) {  // 组成物的母体是甲供材料
                     sum = (sum + glj.basePrice * glj.quantity).toDecimal(decimalObj.process);
                 }
                 else{  // 组成物明细
                     let pGLJ = projectGLJ.getDataByID(glj.projectGLJID);
                     let compositions = pGLJ.ratio_data;
                     if (compositions.length > 0){
-                        function isSupply(composition, supplies) {
-                            for (let supply of supplies){
-                                if(supply.code == composition.code && supply.name == composition.name && supply.unit == composition.unit &&
-                                    supply.specs == composition.specs && supply.type == composition.type ){
-                                    composition.basePrice = supply.unit_price.base_price;
-                                    return true;
-                                }
-                            };
-                            return false;
-                        };
-
-                        for (let composition of compositions){
-                            if (isSupply(composition, supplyProjectGLJs)) {
-                                sum = (sum + composition.basePrice * composition.consumption * glj.quantity).toDecimal(decimalObj.process);
+                        for (let c of compositions){
+                            if (isSupply(c, supplyGLJs)) {
+                                sum = (sum + c.basePrice * c.consumption * glj.quantity).toDecimal(decimalObj.process);
                             }
                         };
                     }
                 }
             }
             else {
-                if (pGLJIdx[glj.projectGLJID]) {
+                if (supplyGLJsIdx[glj.projectGLJID]) {
                     sum = (sum + glj.basePrice * glj.quantity).toDecimal(decimalObj.process);
                 }
             };
@@ -635,34 +632,34 @@ const rationCalcBases = {
         return rst.toDecimal(decimalObj.glj.quantity);
     },
     '甲供定额基价人工费': function (node) {
-        return calcTools.supplyABFee(node, calcBaseNames.JGDEJJRGF);
+        return calcTools.partASupplyFee(node, calcBaseNames.JGDEJJRGF);
     },
     '甲供定额基价材料费': function (node) {
-        return calcTools.supplyABFee(node, calcBaseNames.JGDEJJCLF);
+        return calcTools.partASupplyFee(node, calcBaseNames.JGDEJJCLF);
     },
     '甲供定额基价机械费': function (node) {
-        return calcTools.supplyABFee(node, calcBaseNames.JGDEJJJXF);
+        return calcTools.partASupplyFee(node, calcBaseNames.JGDEJJJXF);
     },
     '甲供主材费': function (node) {
-        return calcTools.supplyABFee(node, calcBaseNames.JGZCF);
+        return calcTools.partASupplyFee(node, calcBaseNames.JGZCF);
     },
     '甲供设备费': function (node) {
-        return calcTools.supplyABFee(node, calcBaseNames.JGSBF);
+        return calcTools.partASupplyFee(node, calcBaseNames.JGSBF);
     },
     '甲定定额基价人工费': function (node) {
-        return calcTools.supplyABFee(node, calcBaseNames.JDDEJJRGF);
+        return calcTools.partASupplyFee(node, calcBaseNames.JDDEJJRGF);
     },
     '甲定定额基价材料费': function (node) {
-        return calcTools.supplyABFee(node, calcBaseNames.JDDEJJCLF);
+        return calcTools.partASupplyFee(node, calcBaseNames.JDDEJJCLF);
     },
     '甲定定额基价机械费': function (node) {
-        return calcTools.supplyABFee(node, calcBaseNames.JDDEJJJXF);
+        return calcTools.partASupplyFee(node, calcBaseNames.JDDEJJJXF);
     },
     '甲定主材费': function (node) {
-        return calcTools.supplyABFee(node, calcBaseNames.JDZCF);
+        return calcTools.partASupplyFee(node, calcBaseNames.JDZCF);
     },
     '甲定设备费': function (node) {
-        return calcTools.supplyABFee(node, calcBaseNames.JDSBF);
+        return calcTools.partASupplyFee(node, calcBaseNames.JDSBF);
     },
     '暂估材料费': function (node) {
         return calcTools.estimateFee(node, true);

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

@@ -57,6 +57,139 @@ 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;
+            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);
+                        if(feeItem.position!=''&&feeItem.billID!=doc.billID){
+                            itemUpdateData = me.getFeeItemUpdateData(libID,feeItem.ID,{position: "", billID:""});
+                            updateData.push(itemUpdateData);
+                        }
+                    }
+                    $.bootstrapLoading.start();
+                    me.submitInstallationUpdate(updateData,null,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(isFeeItemUpdate);
+                        }
+                        $.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 (libID,itemID,doc) {
+           let installationFee = this.getInstallationFeeByLibID(libID);
+            let updateData = {
+                ID:installationFee.ID,
+                itemID:itemID,
+                type:'installFeeItem',
+                doc:doc
+            };
+            return updateData;
+        };
+        installation_fee.prototype.submitInstallationUpdate = function (updateData,rationInstallations,callback) {
+            if(updateData){
+                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})

+ 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);

+ 248 - 116
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]
@@ -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.getRIShowData(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.getRIShowData(tem_ri.ruleId,tem_ri,tem_ri);
         sheetCommonObj.showRowData(this.rationInstallSheet, this.rationInstallSetting,row,this.rationInstallData);
     },
     refreshFeeDetailRow:function (row) {
@@ -420,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;
@@ -499,6 +554,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 +586,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 +675,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 +702,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 +748,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 +821,30 @@ 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 rationInstallations = [];
+        let updateData = installation_fee.getSectionUpdateData(detail.libID,detail.ID,{"feeRuleId":feeRule.ID});
+        installation_fee.getRIUpdateDataBySectionUpdate(detail.ID,feeRule.ID,rationInstallations);//生成受影响的定额安装增加费并加入到数组中
         $.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,rationInstallations,function (data) {
+            let section = installation_fee.getInstallSectionByID(detail.libID,detail.ID);
             section.feeRuleId = feeRule.ID;
             me.refreshFeeDetailRow(detailSelection.row);
             $.bootstrapLoading.end();
@@ -756,7 +859,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 +876,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.libID,feeItem.ID,{ 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,null,function (data) {
             //更新缓存
             feeItem.position =recode.code;
             feeItem.billID = recode.ID;
@@ -786,7 +894,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 +918,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,13 +928,8 @@ let installationFeeObj={
         let header = this.feeItemSetting.header[info.col];
         let doc={};
         doc[header.dataCode] = info.newValue;
-        let updateData = installationFeeObj.getFeeItemUpdateData(feeItem,doc);
-        $.bootstrapLoading.start();
-        me.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) {
@@ -831,9 +937,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,28 +954,65 @@ 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;
         let updateData = null;
+        let rationInstallations=null;
         if(fieldID == 'rule'){//选择新的规则项
             if(info.newValue=="more"){//选择的是更多
                 $("#more_from").val("feeDetail");
@@ -878,7 +1024,9 @@ let installationFeeObj={
             }else if(info.newValue == feeDetail.ruleName){
                 return;
             }else {
-                updateData = me.getDetailUpdateData(feeDetail,{"feeRuleId":info.newValue},'installSection');
+                rationInstallations=[];
+                updateData = install_fee.getSectionUpdateData(feeDetail.libID,feeDetail.ID,{"feeRuleId":info.newValue});
+                install_fee.getRIUpdateDataBySectionUpdate(feeDetail.ID,info.newValue,rationInstallations);//生成受影响的定额安装增加费并加入到数组中
             }
 
         }else if(fieldID == 'base'){
@@ -889,7 +1037,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 +1054,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,rationInstallations,function (data) {
             if(updateData){
                 if(updateData.type=="installSection"){
                     let section = install_fee.getInstallSectionByID(feeDetail.libID,feeDetail.ID);
@@ -940,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'){
@@ -954,7 +1101,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 +1110,8 @@ let installationFeeObj={
         }
         return canChange;
     },
-    getRIRuleUpdateData:function (newRuleID,rationInstallation) {
-        let data={
-            ID:rationInstallation.ID,
-            projectID:rationInstallation.projectID,
-            ruleId:newRuleID,
-            unifiedSetting:0
-        };
-        if(newRuleID==''){//选择的是无
+    getRIShowData : function (ruleID,rationInstallation,data) {
+        if(ruleID==''){//选择的是无
             data.code = '';
             data.rule = '';
             data.base = '';
@@ -981,7 +1122,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;
@@ -993,34 +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;
     },
-    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;
+    calcInstallationFee:function(){//计算定额安装费
+
+
+
+
     },
-    submitInstallationUpdate:function (updateData,callback) {
-        if(updateData){
-            CommonAjax.post('/installation/updateInstallationFee',{'projectID':projectInfoObj.projectInfo.ID,'updateData':updateData},function (data) {
-                callback(data);
-            })
-        }
-    }
 };
 
 
@@ -1047,9 +1172,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 +1192,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 +1261,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;