فهرست منبع

Merge branch 'master' into olym

olym 7 سال پیش
والد
کامیت
c551f1cf8e

+ 2 - 2
modules/common/base/base_model.js

@@ -22,9 +22,9 @@ class BaseModel {
      * @return {void}
      */
     constructor() {
-        if (new.target === BaseModel) {
+/*        if (new.target === BaseModel) {
             throw new Error('BaseModel不能实例化,只能继承使用。');
-        }
+        }*/
     }
 
     /**

+ 20 - 0
modules/pm/controllers/pm_controller.js

@@ -3,6 +3,7 @@
  */
 import UnitPriceFileModel from "../../glj/models/unit_price_file_model";
 let ProjectsData = require('../models/project_model').project;
+let projectM = require('../../main/models/project');
 let projType = require('../models/project_model').projType;
 let fileType = require('../models/project_model').fileType;
 const engineering = require("../../common/const/engineering");
@@ -58,6 +59,25 @@ module.exports = {
             }
         });
     },
+    // 该方法主要用于项目属性位置提交保存混合型数据,这些数据来自不同的表,包括projects.property、ration、bills、labour_coes.
+    updateMixDatas: function(req, res){
+        let callBackInner = function (err, message, data) {
+            if (err === 0) {
+                callback(req, res, err, message, data);
+            } else {
+                callback(req, res, err, message, null);
+            }
+        };
+        let datas = JSON.parse(req.body.data);
+        for (let data of datas){
+              if (data.sourceType == 'properties'){
+                  ProjectsData.updateUserProjects(req.session.sessionUser.ssoId, data.updateData, callBackInner);
+              }
+              else{
+                projectM.save(data, callBackInner);
+              }
+        };
+    },
     updateFiles: async function(req, res){
         let data = JSON.parse(req.body.data);
         let updateDatas = data.updateDatas;

+ 1 - 0
modules/pm/routes/pm_route.js

@@ -31,6 +31,7 @@ module.exports = function (app) {
      data.updateData.updateType: 1 of ['new', 'update', 'delete']
      */
     pmRouter.post('/updateProjects', pmController.updateProjects);
+    pmRouter.post('/updateMixDatas', pmController.updateMixDatas);
 
     /*
      req.body = {data: '{user_id: user_id, updateData: [{updateType, updateData}]}'}

+ 13 - 0
public/web/tree_sheet/tree_sheet_controller.js

@@ -54,6 +54,19 @@ var TREE_SHEET_CONTROLLER = {
                 }
             }
         };
+        controller.prototype.deleteNode = function (node,next) {
+            var that = this;
+            if (node){
+                var row = node.serialNo();
+                if (this.tree.delete(node)) {
+                    TREE_SHEET_HELPER.massOperationSheet(this.sheet, function () {
+                        that.sheet.deleteRows(row,1);
+                        next?that.setTreeSelected(that.tree.items[row]):"";
+                    });
+                }
+            }
+
+        };
         controller.prototype.upLevel = function () {
             var that = this;
             if (this.tree.selected) {

+ 3 - 3
test/unit/reports/test_tpl_09_1.js

@@ -40,8 +40,8 @@ let demoRptId = 226, pagesize = "A4";
 
 let userId_Leng = 1142; //小冷User Id
 // demoPrjId = 720; //QA: DW3
-demoPrjId = 838; //QA:
-/*/
+demoPrjId = 1296; //QA:
+//*/
 let userId_Dft = userId_Leng;
 /*/
 let userId_Dft = 76075;
@@ -120,8 +120,8 @@ test('测试 - 测试模板啦: ', function (t) {
         rptTplDataFacade.prepareProjectData(userId_Dft, demoPrjId, filter, function (err, msg, rawDataObj) {
             if (!err) {
                 try {
-                    let tplData = rptDataUtil.assembleData(rawDataObj);
                     // fsUtil.writeObjToFile(rawDataObj, "D:/GitHome/ConstructionCost/tmp/rptTplRawDataObject.js");
+                    let tplData = rptDataUtil.assembleData(rawDataObj);
                     //it's time to build the report!!!
                     let printCom = JpcEx.createNew();
                     rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_PAGE_SIZE] = pagesize;

+ 4 - 2
web/building_saas/complementary_glj_lib/js/glj.js

@@ -493,7 +493,7 @@ let repositoryGljObj = {
                 }
             }
         }
-        if(me.gljCurTypeId !== 732){
+        if(!me.parentNodeIds["_pNodeId_" + me.gljCurTypeId]){
             rObj.gljClass = me.gljCurTypeId;
         }
         if(updateArr.length >0 || addArr.length >0){
@@ -741,7 +741,9 @@ let repositoryGljObj = {
 
         }
         pasteObj.basePrice = !isNaN(parseFloat(pasteObj.basePrice)) && (pasteObj.basePrice && typeof pasteObj.basePrice !== 'undefined') ? parseFloat(pasteObj.basePrice) : 0;
-        pasteObj.gljClass = me.gljCurTypeId;
+        if(!me.parentNodeIds["_pNodeId_" + me.gljCurTypeId]){
+            pasteObj.gljClass = me.gljCurTypeId;
+        }
         return true;
     },
     canPasted: function (info) {

+ 7 - 0
web/building_saas/main/js/controllers/project_controller.js

@@ -14,6 +14,13 @@ ProjectController = {
             sc.sheet.showRow(newNode.serialNo(), GC.Spread.Sheets.VerticalPosition.center);
         });
     },
+    syncDisplayNewRationGljNode:function (sc,newNode) {
+        TREE_SHEET_HELPER.massOperationSheet(sc.sheet, function () {
+            sc.sheet.addRows(newNode.serialNo(), 1);
+            TREE_SHEET_HELPER.refreshTreeNodeData(sc.setting, sc.sheet, [newNode], false);
+            sc.sheet.showRow(newNode.serialNo(), GC.Spread.Sheets.VerticalPosition.center);
+        });
+    },
     addBills: function (project, sheetController, std) {
         if (!project || !sheetController) { return null; }
 

+ 5 - 5
web/building_saas/main/js/models/fee_rate.js

@@ -243,7 +243,7 @@ var FeeRate = {
                 })
             }
             project.calcProgram.compileAllTemps();
-            rationPM.refreshDetailSheet();
+            calcProgramManage.refreshDetailSheet();
         }
         FeeRate.prototype.refreshCalProgramByRateID=function (rateID,value) {
             var templates = project.calcProgram.datas.templates;
@@ -255,7 +255,7 @@ var FeeRate = {
                 })
             }
             project.calcProgram.compileAllTemps();
-            rationPM.refreshDetailSheet();
+            calcProgramManage.refreshDetailSheet();
         };
         FeeRate.prototype.refreshBillsByRateID=function(rateID,value){
             var nodes = _.filter(projectObj.project.mainTree.items,function (n) {
@@ -379,12 +379,12 @@ var FeeRate = {
                 editInfo.calcItem.feeRate=value;
                 editInfo.calcItem.feeRateID=null;
                 var data={'projectID': projectObj.project.ID(),'templatesID': editInfo.template.ID,'calcItem': editInfo.calcItem};
-                rationPM.saveCalcItem(data,function (result) {
+                calcProgramManage.saveCalcItem(data,function (result) {
                     project.calcProgram.compileAllTemps();
-                    rationPM.refreshDetailSheet();
+                    calcProgramManage.refreshDetailSheet();
                 })
             }else {
-                rationPM.refreshDetailSheet();
+                calcProgramManage.refreshDetailSheet();
             }
         };
         FeeRate.prototype.updateFeeRateByCalc=function (rate,value) {

+ 72 - 13
web/building_saas/main/js/models/ration_glj.js

@@ -86,34 +86,36 @@ var ration_glj = {
 
         // 提交数据后返回数据处理
         ration_glj.prototype.doAfterUpdate = function(err, data){
+            var me = this;
             if(!err){
                 if(data.updateTpye=='ut_update'){
-                    this.refreshAfterUpdate(data);
+                    me.refreshAfterUpdate(data);
                 }else if(data.updateTpye=='ut_delete'){
-                    this.refreshAfterDelete(data);
+                    me.refreshAfterDelete(data);
                 } else {
-                    this.refreshAfterSave(data);
+                    me.refreshAfterSave(data);
                 }
-                projectObj.project.projectGLJ.loadData();
             }
+            projectObj.project.projectGLJ.loadData();
         };
         ration_glj.prototype.refreshAfterSave=function(data){
+            let me = projectObj.project.ration_glj;
             let neRecodes=[];
             if(data){
                // neRecodes=data.newRecords;//原来是显示和缓存分开的,后来发现会导致数据不一致的问题所以改成统一的了,这里也只是会作为显示。
                 neRecodes = data.showDatas;
                 gljOprObj.sheetData=neRecodes;
             }
-            if(projectObj.project.ration_glj.datas&&Array.isArray(projectObj.project.ration_glj.datas)){
+            if(me.datas&&Array.isArray(me.datas)){
                 if(data){
-                    projectObj.project.ration_glj.datas = projectObj.project.ration_glj.datas.concat(neRecodes);
+                    me.datas = me.datas.concat(neRecodes);
                 }
             }else {
-                projectObj.project.ration_glj.datas = neRecodes;
+                me.datas = neRecodes;
             }
             gljOprObj.showRationGLJSheetData(true);
             //add to mainTree;
-
+            me.addToMainTree(neRecodes);
             let node = project.mainTree.selected;
             project.calcProgram.calculate(node);
             project.calcProgram.saveNode(node);
@@ -121,6 +123,33 @@ var ration_glj = {
                 calcProgramObj.showData(node, false);
             };
         };
+        ration_glj.prototype.addToMainTree = function (datas) {
+            datas = sortRationGLJ(datas);
+            for(let data of datas){
+                if(this.needShowToTree(data)){
+                    this.transferToNodeData(data);
+                    let parentNode = _.find(projectObj.project.mainTree.items,function (n) {//找父节点
+                        return n.sourceType==ModuleNames.ration &&n.data.ID==data.rationID;
+                    });
+                    if(parentNode){
+                        let nextNodeID=null;
+                        if(parentNode.children.length>0){
+                            for(let br of parentNode.children){
+                                if(compareRationGLJ(data,br.data)){//如果有兄弟节点则找到添加位置。
+                                    nextNodeID = br.getID();
+                                }
+                            }
+                        }
+                        nextNodeID = nextNodeID?nextNodeID:parentNode.tree.rootID();
+                        let newNode = projectObj.project.mainTree.insert(parentNode.getID(),nextNodeID);
+                        newNode.source = data;
+                        newNode.sourceType = this.getSourceType();
+                        newNode.data = data;
+                        ProjectController.syncDisplayNewRationGljNode(projectObj.mainController,newNode);
+                    }
+                }
+            }
+        };
         ration_glj.prototype.refreshAfterUpdate=function(data){
             var me = this;
             if(data.quantityRefresh){
@@ -147,13 +176,29 @@ var ration_glj = {
         };
         ration_glj.prototype.refreshAfterDelete=function(data){
             var glj_list = projectObj.project.ration_glj.datas;
-            _.remove(glj_list,data.query);
+            var oldData = _.remove(glj_list,data.query);
             _.remove(gljOprObj.sheetData,data.query);
             gljOprObj.showRationGLJSheetData();
             projectObj.project.projectGLJ.loadData();
+            var rationNode = null;
+            var next = null;
             var selected = projectObj.project.mainTree.selected;
-            selected.data.adjustState=data.adjustState;
-            projectObj.mainController.refreshTreeNode([selected]);
+            if(selected.sourceType==ModuleNames.ration){ //如果选中的是定额,说明是右键删除工料机操作,如果选中的是定额工料机,则说明是在造价书主界面中点击了删除按钮
+                rationNode= selected;
+            }else if(selected.sourceType==ModuleNames.ration_glj){
+                rationNode = selected.parent;
+                next = true;
+            }
+            rationNode.data.adjustState=data.adjustState;
+            projectObj.mainController.refreshTreeNode([rationNode]);
+            for(let o of oldData){
+                if(this.needShowToTree(o)){
+                    let node = _.find(projectObj.project.mainTree.items,function (n) {//找到对应的树节点
+                        return n.sourceType==ModuleNames.ration_glj &&n.data.ID==o.ID;
+                    });
+                    projectObj.mainController.deleteNode(node,next);
+                }
+            }
         };
         // CSL,2017.05.09
         ration_glj.prototype.modifyQuantity = function (data, newQuantity) {
@@ -298,7 +343,13 @@ var ration_glj = {
                     if(recode.subList&&recode.subList.length>0){
                         initShow = true;
                     }
-                    node?"":me.refreshTreeNodeIfNeeded(recode);//如果不是在造价书页面直接编辑,则不用刷新
+                    if(node){//如果不是在造价书页面直接编辑,则不用刷新
+                        if(updateField=="type"&&!(newval == gljType.MAIN_MATERIAL||newval==gljType.EQUIPMENT)){//如果改变类型后不是主材或设备,则在造价书树中移除
+                            projectObj.mainController.deleteNode(node,true);
+                        }else {
+                            me.refreshTreeNodeIfNeeded(recode);
+                        }
+                    }
                 }
                 if(initShow==false){//不需要初始化,只需耍新当前显示就可以了
                     gljOprObj.showRationGLJSheetData();
@@ -479,6 +530,7 @@ var ration_glj = {
            var gljList = _.filter(this.datas,function (n) {
               return n.rationID == rationID&&(n.type==gljType.MAIN_MATERIAL||n.type==gljType.EQUIPMENT)
            });
+           gljList = sortRationGLJ(gljList);
            return gljOprObj.combineWithProjectGlj(gljList);
         };
         ration_glj.prototype.transferToNodeData = function (data) {
@@ -513,10 +565,17 @@ var ration_glj = {
             projectObj.mainController.refreshTreeNode([node]);
         };
         ration_glj.prototype.refreshTreeNodeIfNeeded=function (data) {
-            if((data.type == gljType.MAIN_MATERIAL||data.type==gljType.EQUIPMENT)&&projectInfoObj.projectInfo.property.displaySetting.disPlayMainMateria==true){
+            if(this.needShowToTree(data)){
                 this.transferToNodeData(data);
                 gljOprObj.refreshTreeNode({"type":ModuleNames.ration_glj,"ID":data.ID});
             }
+        };
+
+        ration_glj.prototype.needShowToTree=function(data){
+            if((data.type == gljType.MAIN_MATERIAL||data.type==gljType.EQUIPMENT)&&projectInfoObj.projectInfo.property.displaySetting.disPlayMainMateria==true){
+                return true
+            }
+            return false
         }
         return new ration_glj(project);
     }

+ 4 - 4
web/building_saas/main/js/views/calc_program_manage.js

@@ -2,7 +2,7 @@
  * Created by CSL on 2017-08-03.
  * 计算程序管理。
  */
-let rationPM = {
+let calcProgramManage = {
     datas: [],
     mainSpread: null,
     detailSpread: null,
@@ -68,7 +68,7 @@ let rationPM = {
         sheetCommonObj.showData(dSheet, me.detailSetting, me.datas[0].calcItems);
     },
     onMainEnterCell: function(sender, args) {
-        var me = rationPM;
+        var me = calcProgramManage;
         var row = args.sheet.getActiveRowIndex();
 
         me.detailSpread.suspendPaint();
@@ -79,7 +79,7 @@ let rationPM = {
         me.detailSpread.resumePaint();
     },
     onEditEnded: function(sender, args) {
-        var me = rationPM;
+        var me = calcProgramManage;
         if(me.detailSetting.header[args.col].dataCode=='feeRate'){
             var editInfo= me.getSelectionInfo();
             projectObj.project.FeeRate.updateFeeRateFromCalc(args.editingText,editInfo);
@@ -126,7 +126,7 @@ let rationPM = {
 $(document).ready(function(){
     $('#tab_calc_program_manage').on('shown.bs.tab', function (e) {
         $(e.relatedTarget.hash).removeClass('active');
-        rationPM.buildSheet();
+        calcProgramManage.buildSheet();
     });
 });
 

+ 3 - 3
web/building_saas/main/js/views/fee_rate_view.js

@@ -660,14 +660,14 @@ var feeRateObject={
     },
     submitFeeRateFromCalc:function () {
         var rate = feeRateObject.feeRateSelection;
-        var calInfo = rationPM.getSelectionInfo();
+        var calInfo = calcProgramManage.getSelectionInfo();
         calInfo.calcItem.feeRateID=rate.ID;
         calInfo.calcItem.feeRate=null;
         var data={'projectID': projectObj.project.ID(),'templatesID': calInfo.template.ID,'calcItem': calInfo.calcItem};
-        rationPM.saveCalcItem(data,function (result) {
+        calcProgramManage.saveCalcItem(data,function (result) {
             calInfo.calcItem.feeRate=rate.rate;
             projectObj.project.calcProgram.compileAllTemps();
-            rationPM.refreshDetailSheet();
+            calcProgramManage.refreshDetailSheet();
             $("#fee_rate_tree").modal('hide');
         });
         console.log(calInfo);

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

@@ -956,6 +956,7 @@ var gljOprObj = {
                     project.ration_glj.datas = project.ration_glj.datas.concat(result.showData);
                     gljOprObj.sheetData = gljOprObj.sheetData.concat(result.showData);
                     gljOprObj.showRationGLJSheetData();
+                    project.ration_glj.addToMainTree(result.showData);
                     project.projectGLJ.loadData();
                     projectObj.mainController.refreshTreeNode([selected]);
                     $.bootstrapLoading.end();
@@ -1305,4 +1306,16 @@ function sortRationGLJ(list) {
         return item.type+"";
     },"code"])
     return list;
+}
+
+function compareRationGLJ(a,b) {
+    if((a.type+"")<(b.type+"")){
+        return true
+    }
+    if((a.type+"")==(b.type+"")){
+        if (a.code<b.code){
+            return true
+        }
+    }
+    return false;
 }

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

@@ -123,10 +123,11 @@ let MainTreeCol = {
     },
     cellType: {
         unit: function () {
-            let combo = new GC.Spread.Sheets.CellTypes.ComboBox();
-            combo.itemHeight(10).items(['m', 'm2', 'm3', 'km', 't', 'kg', '台班', '工日', '昼夜', '元', '项', '处', '个', '件',
+            //let combo = new GC.Spread.Sheets.CellTypes.ComboBox();
+            let dynamicCombo = sheetCommonObj.getDynamicCombo();
+            dynamicCombo.itemHeight(10).items(['m', 'm2', 'm3', 'km', 't', 'kg', '台班', '工日', '昼夜', '元', '项', '处', '个', '件',
                 '根', '组', '系统', '台', '套', '株', '丛', '缸', '支', '只', '块', '座', '对', '份', '樘', '攒', '榀']);
-            return combo;
+            return dynamicCombo;
         },
 
         units: function () {

+ 11 - 3
web/building_saas/main/js/views/project_property_labour_coe_view.js

@@ -131,7 +131,15 @@ let labourCoeView = {
         me.loadData(datas);
     },
 
-    save(){
+    refresh(data){
+        let me = this;
+        projectObj.project.labourCoe.refreshData(data);
+        me.needUpdateDatas.splice(0, me.needUpdateDatas.length);
+        $("#std_labour_coe_files").val('');
+        calcProgramManage.buildSheet();
+    }
+
+/*  save(){
         let me = this;
         if (me.needUpdateDatas.length > 0){
             let projectID = projectInfoObj.projectInfo.ID;
@@ -143,11 +151,11 @@ let labourCoeView = {
                 me.needUpdateDatas.splice(0, me.needUpdateDatas.length);
                 projectObj.project.calcProgram.compileAllTemps();
                 projectObj.project.calcProgram.calcAllNodes(calcAllType.catRations);
-                rationPM.buildSheet();
                 $("#std_labour_coe_files").val('');
+                calcProgramManage.buildSheet();
             });
         }
-    }
+    }*/
 };
 
 $(document).ready(function(){

+ 84 - 28
web/building_saas/main/js/views/project_view.js

@@ -335,6 +335,16 @@ var projectObj = {
             projectObj.mainController.refreshTreeNode([node], false);
         }
     },
+    mainSpreadLeaveCell: function (sender, info) {
+        let colSetting = projectObj.mainController.setting.cols[info.col];
+        projectObj.lastCol = colSetting;
+    },
+    mainSpreadEnterCell: function (sender, info) {
+        let colSetting = projectObj.mainController.setting.cols[info.col];
+        if(colSetting.data.field === 'unit' || projectObj.lastCol.data.field === 'unit'){
+            info.sheet.repaint();
+        }
+    },
     mainSpreadEditEnded: function (sender, info) {
         let project = projectObj.project;
         let node = project.mainTree.items[info.row];
@@ -443,6 +453,8 @@ var projectObj = {
                 that.mainController.bind(TREE_SHEET_CONTROLLER.eventName.beforeTreeSelectedChange, that.beforeMainTreeSelectedChange);
                 that.mainController.bind(TREE_SHEET_CONTROLLER.eventName.treeSelectedChanged, that.treeSelectedChanged);
 
+                that.mainSpread.bind(GC.Spread.Sheets.Events.LeaveCell, that.mainSpreadLeaveCell);
+                that.mainSpread.bind(GC.Spread.Sheets.Events.EnterCell, that.mainSpreadEnterCell);
                 that.mainSpread.bind(GC.Spread.Sheets.Events.EditEnded, that.mainSpreadEditEnded);
                 that.mainSpread.bind(GC.Spread.Sheets.Events.RangeChanged, that.mainSpreadRangeChanged);
                 that.loadMainSpreadContextMenu();
@@ -534,8 +546,8 @@ var projectObj = {
                 "calculateAll_RationContent": {
                     name: '造价计算',
                     callback: function () {
-                        // projectObj.calculateAll();
-                        project.calcProgram.calcAllNodes();
+                        let changedNodes = project.calcProgram.calcAllNodes();
+                        project.calcProgram.saveNodes(changedNodes);
                     }
                 }
             }
@@ -602,6 +614,8 @@ $('#delete').click(function () {
         } else if (selected.sourceType === project.Ration.getSourceType()) {
             project.Ration.delete(selected.source);
             controller.delete();
+        }else if(selected.sourceType==ModuleNames.ration_glj){
+            project.ration_glj.updataOrdelete(selected.source);
         };
         projectObj.converseCalculateBills(parent);
     }
@@ -664,45 +678,38 @@ $('#poj-set').on('show.bs.modal', function () {
     if (projectObj.project) {
         // let mode = projectObj.project.projSetting.billsCalcMode;
         // let settingConst = projectObj.project.projSetting.settingConst;
-        let mode = projectObj.project.property.billsCalcMode ? projectObj.project.property.billsCalcMode : leafBillGetFeeType.rationContent;
-        setCalcFlag($('#rationContent'), leafBillGetFeeType.rationContent, mode);
-        setCalcFlag($('#rationPriceConverse'), leafBillGetFeeType.rationPriceConverse, mode);
-        setCalcFlag($('#rationPrice'), leafBillGetFeeType.rationPrice, mode);
-        setCalcFlag($('#billsPrice'), leafBillGetFeeType.billsPrice, mode);
+        let ft = projectObj.project.property.billsCalcMode ? projectObj.project.property.billsCalcMode : leafBillGetFeeType.rationContent;
+        setCalcFlag($('#rationContent'), leafBillGetFeeType.rationContent, ft);
+        setCalcFlag($('#rationPriceConverse'), leafBillGetFeeType.rationPriceConverse, ft);
+        setCalcFlag($('#rationPrice'), leafBillGetFeeType.rationPrice, ft);
+        setCalcFlag($('#billsPrice'), leafBillGetFeeType.billsPrice, ft);
 
         // mode = projectObj.project.projSetting.zanguCalcType;
-        mode = projectObj.project.property.zanguCalcMode ? projectObj.project.property.zanguCalcMode : zanguCalcType.common;
-        setCalcFlag($('#zangu_common'), zanguCalcType.common, mode);
-        setCalcFlag($('#zangu_gatherMaterial'), zanguCalcType.gatherMaterial, mode);
+        let zg = projectObj.project.property.zanguCalcMode ? projectObj.project.property.zanguCalcMode : zanguCalcType.common;
+        setCalcFlag($('#zangu_common'), zanguCalcType.common, zg);
+        setCalcFlag($('#zangu_gatherMaterial'), zanguCalcType.gatherMaterial, zg);
     }
 });
 $('#property_ok').click(function () {
     let properties = [], projectID = parseInt(scUrlUtil.GetQueryString('project'));
-    let project = projectObj.project, reCalc= false;
+    let project = projectObj.project, reCalcBills= false, reCalcRations= false;
     let b = parseInt($("input[name='calcFlag']:checked").val());
+
     if (b !== project.property.billsCalcMode) {
-        let data1 = {updateType: 'update', updateData: {ID: projectID, 'property.billsCalcMode': b}};
-        properties.push(data1);
+        let bData = {updateType: 'update', updateData: {ID: projectID, 'property.billsCalcMode': b}};
+        properties.push(bData);
         project.property.billsCalcMode = b;
-        reCalc = true;
+        reCalcBills = true;
     };
 
     let zg = parseInt($("input[name='zangu']:checked").val());
     if (zg !== project.property.zanguCalcMode) {
-        let data2 = {updateType: 'update', updateData: {ID: projectID, 'property.zanguCalcMode': zg}};
-        properties.push(data2);
+        let zgData = {updateType: 'update', updateData: {ID: projectID, 'property.zanguCalcMode': zg}};
+        properties.push(zgData);
         project.property.zanguCalcMode = zg;
-        reCalc = true;
+        reCalcBills = true;
     };
 
-    if (labourCoeView.needSave()){
-        labourCoeView.save();
-        reCalc = true;
-    }
-
-    if (reCalc) {
-        project.calcProgram.calcAllNodes(calcAllType.catBills);
-    }
     //基本信息
     if(basicInfoView.toUpdate(basicInfoView.orgDatas, basicInfoView.datas)){
         let updateData = {updateType: 'update', updateData: {ID: projectID, 'property.basicInformation': basicInfoView.toSaveDatas(basicInfoView.datas)}};
@@ -716,6 +723,7 @@ $('#property_ok').click(function () {
     //清单工程量精度
     let newBillsDecimalDatas = billsDecimalView.toBillsDecimalDatas(billsDecimalView.cache);
     if(billsDecimalView.toUpdate(billsQuanDecimal.datas, newBillsDecimalDatas)){
+        reCalcBills = true;
         let updateData = {updateType: 'update', updateData: {ID: projectID, 'property.billsQuantityDecimal': newBillsDecimalDatas}};
         properties.push(updateData);
     }
@@ -723,15 +731,63 @@ $('#property_ok').click(function () {
     //获取更新的数据
     let updateDecimal = m_getDecimalData($('input', '#poj-settings-decimal'));
     if(toUpdateDecimal(decimalObj, updateDecimal)){
+        reCalcRations = true;
+        reCalcBills = true;
         let updateData = {updateType: 'update', updateData: {ID: projectID, 'property.decimal': updateDecimal}};
         properties.push(updateData);
     }
- // 呈现选项
-    projDisplayView.updateChecking(projectID,properties);
+    // 人工系数
+    let lcData;
+    if (labourCoeView.needSave()){
+        reCalcRations = true;
+        reCalcBills = true;
+        project.calcProgram.compileAllTemps();
+
+        let projectID = projectInfoObj.projectInfo.ID;
+        let libID = $("#std_labour_coe_files").children("option:selected").val();
+        let libName = $("#std_labour_coe_files").children("option:selected").text();
+        lcData = {projectID: projectID, libID: libID, libName: libName, newItemArr: labourCoeView.needUpdateDatas};
+        properties.push(lcData);
+    };
+
+    // 呈现选项
+    const autoHeight = $("#autoHeight:checked").length > 0;
+    const disPlayMainMaterial = $("#disPlayMainMaterial:checked").length > 0;
+    if (projDisplayView.needUpdate(autoHeight, disPlayMainMaterial)) {
+        const displaySetting = { autoHeight, disPlayMainMaterial };
+        let updateData = {updateType: 'update', updateData: {ID: projectID, 'property.displaySetting': displaySetting}};
+        properties.push(updateData);
+    }
+
+    // 重新计算树节点
+    let changedNodes = [];
+    if (reCalcRations)    // 定额动,全部计算。
+        changedNodes = project.calcProgram.calcAllNodes(calcAllType.catAll)
+    else if (reCalcBills)  // 清单动,可以只计算清单。
+        changedNodes = project.calcProgram.calcAllNodes(calcAllType.catBills);
+    if (changedNodes.length > 0) {
+        for (let node of changedNodes){
+            let data = {
+                projectID: project.ID(),
+                ID: node.data.ID,
+                quantity: node.data.quantity,
+                calcBase: node.data.calcBase,
+                calcBaseValue: node.data.calcBaseValue,
+                marketUnitFee: node.data.marketUnitFee,
+                marketTotalFee: node.data.marketTotalFee,
+                fees: node.data.fees,
+                feeRate: node.data.feeRate,
+                feeRateID: node.data.feeRateID
+            };
+            let dataObj = {updateType: 'ut_update', updateData: data};
+            properties.push(changedNodes);
+        };
+    };
 
     console.log(properties);
     if(properties.length > 0){
-        CommonAjax.post('/pm/api/updateProjects', {user_id: userID, updateData: properties}, function (rstData) {
+        CommonAjax.post('/pm/api/updateMixDatas', {user_id: userID, updateData: properties}, function (rstData) {
+            if (lcData) labourCoeView.refresh(lcData);
             window.location.href = '/main?project=' + projectID;
         });
     }