浏览代码

Merge branch 'master' of http://192.168.1.12:3000/SmartCost/ConstructionCost

TonyKang 7 年之前
父节点
当前提交
b7964c4b66

+ 47 - 0
modules/glj/controllers/glj_controller.js

@@ -660,6 +660,53 @@ class GLJController extends BaseController {
         }
         res.json(result);
     }
+    async batchUpdateConsumption(req,res){
+        let result={
+            error:0
+        };
+        try {
+            let data = req.body.data;
+            data = JSON.parse(data);
+            let mixTasks = [],parent = null;
+            for(let d of data){
+                if(d.type == 'mix_ratio'){
+                    let task = {updateOne:{filter:d.query, update :d.doc}};
+                    mixTasks.push(task);
+                }else if(d.type =='parent'){
+                    parent = d;
+                }
+            }
+            if(mixTasks.length > 0){
+                let mixRatioModel = new MixRatioModel().model;
+                await mixRatioModel.bulkWrite(mixTasks);
+            }
+            if(parent){
+                let indexList = ['code','name','specs','unit','type'];
+                let keyList = parent.connect_key.split("|-|");
+                let condition = {unit_price_file_id: parent.unit_price_file_id};
+                for(let i = 1;i<keyList.length;i++){
+                    if(keyList[i]!='null'){
+                        condition[indexList[i]]=keyList[i];
+                    }
+                }
+                let unitPriceUpdate = {
+                    base_price: parent.base_price,
+                    market_price: parent.market_price
+                };
+                let unitPriceModel = new UnitPriceModel();
+                let unitPriceResult = await unitPriceModel.updatePrice(condition, unitPriceUpdate);
+                if (!unitPriceResult) {
+                    throw '更新单价数据失败';
+                }
+            }
+            result.data = "ok";
+        }catch (err){
+            logger.err(err);
+            result.error=1;
+            result.message = err.message;
+        }
+        res.json(result);
+    }
     async modifyKeyValue(req,res){//修改工料机关键的属性:名称、类型、规格、型号等
         let result={
             error:0

+ 1 - 0
modules/glj/routes/glj_router.js

@@ -25,6 +25,7 @@ router.post('/save-as', gljController.init, gljController.unitPriceSaveAs);
 router.post('/get-composition', gljController.init, gljController.getComposition);
 router.post('/updatePrice', gljController.init, gljController.updateUnitPrice);
 router.post('/batchUpdatePrices', gljController.init, gljController.batchUpdatePrices);
+router.post('/batchUpdateConsumption', gljController.init, gljController.batchUpdateConsumption);
 router.post('/modifyKeyValue',gljController.init, gljController.modifyKeyValue);
 
 router.get('/test', gljController.init, gljController.test);

+ 4 - 1
public/web/PerfectLoad.js

@@ -3,8 +3,11 @@
  */
 
 jQuery.bootstrapLoading = {
+    isLoading: function () {
+        return $('#loadingPage').is(':visible');
+    },
     start: function (options) {
-        if($('#loadingPage').is(':visible')){
+        if(this.isLoading()){
             return;
         }
         var defaults = {

+ 3 - 3
web/building_saas/main/js/controllers/project_controller.js

@@ -71,7 +71,7 @@ ProjectController = {
             if (std) {
                 let fixedNode = getRootFixedNode(target);
                 if(!isFlag(fixedNode.data) || (fixedNode.data.flagsIndex.fixed.flag !== fixedFlag.SUB_ENGINERRING && fixedNode.data.flagsIndex.fixed.flag !== fixedFlag.MEASURE)){
-                    return;
+                    return false;
                 }
                 //焦点行属于分部分项
                 if(fixedNode.data.flagsIndex.fixed.flag === fixedFlag.SUB_ENGINERRING){
@@ -79,7 +79,7 @@ ProjectController = {
                     //焦点行是分部分项
                     let subType = getSubType(target);
                     if(target.sourceType === project.Bills.getSourceType() && target.data.type === billType.DXFY && subType === billType.FB){
-                        return;
+                        return false;
                     }
                     //焦点行是分部
                     else if(target.sourceType === project.Bills.getSourceType() && target.data.type === billType.FB){
@@ -90,7 +90,7 @@ ProjectController = {
                             nodeNextSiblingID = project.mainTree.rootID();
                         }
                         else{
-                            return;
+                            return false;
                         }
                     }
                 }

+ 16 - 0
web/building_saas/main/js/models/project.js

@@ -355,6 +355,22 @@ var PROJECT = {
             }
             return false;
         };
+        //清单是否属于锁定范围(分部分项、措施项目)
+        project.prototype.withinBillsLocked = function (node) {
+            const lockedFixFlag = [fixedFlag.SUB_ENGINERRING, fixedFlag.MEASURE];
+            while(node){
+                if(!node.parent){
+                    if(node.data.flagsIndex && node.data.flagsIndex.fixed && lockedFixFlag.includes(node.data.flagsIndex.fixed.flag)){
+                        return true;
+                    }
+                    else {
+                        return false;
+                    }
+                }
+                node = node.parent;
+            }
+            return true;
+        };
         project.prototype.updateNodes = function (datas,callback) {
           /*  let datas = [
                 {

+ 34 - 1
web/building_saas/main/js/models/project_glj.js

@@ -352,10 +352,43 @@ ProjectGLJ.prototype.batchUpdatePrice = function (changeInfo,callback) {
             $.bootstrapLoading.end();
         });
     }
+};
 
+ProjectGLJ.prototype.batchUpdateConsumption = function (updateData,updateMap,callback) {
+    let me = this;
+    $.bootstrapLoading.start();
+    CommonAjax.post("/glj/batchUpdateConsumption", updateData, function (result) {
+        let parent = updateData[updateData.length - 1];
+        let parentGlj = me.getByConKey(parent.connect_key);
+        for(let u of updateData){
+            if(u.type == 'mix_ratio'){
+                let tem = updateMap[u.query.id];
+                tem.record.consumption = u.doc.consumption;//更新组成物表格的缓存
+                let subData = _.find(parentGlj.ratio_data,{"id":u.query.id});
+                if(subData){
+                    subData.consumption = u.doc.consumption;
+                }
+                let m_list = me.datas.mixRatioMap[parent.connect_key];
+                let m_ratioData = _.find(m_list,{"id":u.query.id});
+                if(m_ratioData){
+                    m_ratioData.consumption = u.doc.consumption;
+                }
+            }
+        }
+        parentGlj.unit_price.market_price =  parent.market_price;
+        parentGlj.unit_price.base_price =  parent.base_price;
+        me.calcQuantity();
+
+        if(callback){
+            callback();
+        }
+        $.bootstrapLoading.end();
+    },function () {
+        $.bootstrapLoading.end();
+    })
 
-};
 
+};
 
 ProjectGLJ.prototype.pGljUpdate= function (data,callback) {
     let me = this;

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

@@ -488,7 +488,7 @@ var Ration = {
                 $.bootstrapLoading.start();
                 //保证由于异步的关系loading界面被隐藏,比如清单指引插入清单定额时,endUpdate中提前隐藏了loading
                 let interval =setInterval(function () {
-                    if(!$('#loadingPage').is(':visible') && showLoding){
+                    if(!$.bootstrapLoading.isLoading()&& showLoding){
                         $.bootstrapLoading.start();
                         clearInterval(interval);
                     }

+ 4 - 0
web/building_saas/main/js/views/calc_base_view.js

@@ -166,6 +166,10 @@ let calcBaseView = {
         let showDatas;
         me.curType = type;
         if (type === me.type.bills) {
+            //锁定的清单不显示
+            if(projectObj.project.isBillsLocked() && projectObj.project.withinBillsLocked(projectObj.project.mainTree.selected)){
+                return;
+            }
             //显示清单基数分类
             $('#cbClassList').show();
             $('#qd-jsjs .modal-content').css('width', '670px');

+ 12 - 11
web/building_saas/main/js/views/character_content_view.js

@@ -165,7 +165,7 @@ let contentOprObj = {
         pageCCOprObj.setCharacterBySetting(selectedNode, setting, callback, contentOprObj);
     },
     onEditStart(sender, args){
-        if(projectInfoObj.projectInfo.property.lockBills){
+        if(projectInfoObj.projectInfo.property.lockBills && projectObj.project.withinBillsLocked(projectObj.project.mainTree.selected)){
             args.cancel = true;
             return;
         }
@@ -188,7 +188,7 @@ let contentOprObj = {
         if(args.sheet.isEditing()){
             args.sheet.endEdit(true);
         }
-        if(projectInfoObj.projectInfo.property.lockBills){
+        if(projectInfoObj.projectInfo.property.lockBills && projectObj.project.withinBillsLocked(projectObj.project.mainTree.selected)){
             args.sheet.setValue(args.row, args.col, 0);
             return;
         }
@@ -223,7 +223,7 @@ let contentOprObj = {
     },
     //复制粘贴
     onClipboardPasting: function (sender, args) {
-        if(projectInfoObj.projectInfo.property.lockBills){
+        if(projectInfoObj.projectInfo.property.lockBills && projectObj.project.withinBillsLocked(projectObj.project.mainTree.selected)){
             args.cancel = true;
             return;
         }
@@ -252,7 +252,7 @@ let contentOprObj = {
         let me = contentOprObj;
         let disObj = {jobAdd: false, jobInsert: true, jobDel: true, jobUp: true, jobDown: true};
         disObj.jobAdd = !pageCCOprObj.canAddType();
-        if(projectInfoObj.projectInfo.property.lockBills){
+        if(projectInfoObj.projectInfo.property.lockBills && projectObj.project.withinBillsLocked(projectObj.project.mainTree.selected)){
             disObj.jobAdd = true;
             disObj.jobInsert = true;
             disObj.jobDel = true;
@@ -309,7 +309,7 @@ let contentOprObj = {
                 let addDis = pageCCOprObj.canAddType() ? false : true,  insertDis = false, delDis = false, upDis = false, downDis = false;
                 if(target.hitTestType === 3){//在表格内&& typeof target.row !== 'undefined' && typeof target.col !== 'undefined'
                     //清单锁定,不可用
-                    if(projectInfoObj.projectInfo.property.lockBills){
+                    if(projectInfoObj.projectInfo.property.lockBills && projectObj.project.withinBillsLocked(projectObj.project.mainTree.selected)){
                         addDis = true;
                         insertDis = true;
                         delDis = true;
@@ -648,7 +648,7 @@ let characterOprObj = {
     },
     onEditStart: function (sender, args) {
         let me = characterOprObj;
-        if(projectInfoObj.projectInfo.property.lockBills){
+        if(projectInfoObj.projectInfo.property.lockBills && projectObj.project.withinBillsLocked(projectObj.project.mainTree.selected)){
             args.cancel = true;
             return;
         }
@@ -675,7 +675,7 @@ let characterOprObj = {
         }
     },
     onClipboardPasting: function (sender, args) {
-        if(projectInfoObj.projectInfo.property.lockBills){
+        if(projectInfoObj.projectInfo.property.lockBills && projectObj.project.withinBillsLocked(projectObj.project.mainTree.selected)){
             args.cancel = true;
         }
         if(args.cellRange.col + args.colCount - 1 > 1){
@@ -731,7 +731,7 @@ let characterOprObj = {
         if(args.sheet.isEditing()){
             args.sheet.endEdit(true);
         }
-        if(projectInfoObj.projectInfo.property.lockBills){
+        if(projectInfoObj.projectInfo.property.lockBills && projectObj.project.withinBillsLocked(projectObj.project.mainTree.selected)){
             args.sheet.setValue(args.row, args.col, 0);
             return;
         }
@@ -756,7 +756,7 @@ let characterOprObj = {
         let disObj = {itemAdd: false, itemInsert: true, itemDel: true, itemUp: true, itemDown: true};
         disObj.itemAdd = !pageCCOprObj.canAddType();
         //清单锁定,不可用
-        if(projectInfoObj.projectInfo.property.lockBills){
+        if(projectInfoObj.projectInfo.property.lockBills && projectObj.project.withinBillsLocked(projectObj.project.mainTree.selected)){
             disObj.itemAdd = true;
             disObj.itemInsert = true;
             disObj.itemDel = true;
@@ -801,7 +801,7 @@ let characterOprObj = {
                 let addDis = pageCCOprObj.canAddType() ? false : true, insertDis = false, delDis = false, upDis = false, downDis = false;
                 if(target.hitTestType === 3){//在表格内 && typeof target.row !== 'undefined' && typeof target.col !== 'undefined'
                     //清单锁定,则不可用
-                    if(projectInfoObj.projectInfo.property.lockBills){
+                    if(projectInfoObj.projectInfo.property.lockBills && projectObj.project.withinBillsLocked(projectObj.project.mainTree.selected)){
                         addDis = true;
                         insertDis = true;
                         delDis = true;
@@ -917,6 +917,7 @@ let pageCCOprObj = {
     },
     //设置特征及内容currentCache
     setCacheAndShow: function (node) {
+        this.refreshRuleTools(projectObj.project.isBillsLocked());
         if(node && node.sourceType === projectObj.project.Bills.getSourceType()){
             let theCont = contentOprObj, theCha = characterOprObj;
             node.data.jobContent = node && typeof node.data.jobContent !== 'undefined' ? node.data.jobContent : [];
@@ -991,7 +992,7 @@ let pageCCOprObj = {
     refreshRuleTools: function (lockBills) {
         $('#use-to-current').removeClass('disabled');
         $('#use-to-all').removeClass('disabled');
-        if(lockBills){
+        if(lockBills && projectObj.project.withinBillsLocked(projectObj.project.mainTree.selected)){
             $('#use-to-current').addClass('disabled');
             $('#use-to-all').addClass('disabled');
         }

+ 5 - 0
web/building_saas/main/js/views/fee_rate_view.js

@@ -332,6 +332,11 @@ var feeRateObject={
         return new FeeRateEditCellType();
     },
     showSelectModal:function (hitinfo) {
+        //锁定的清单不显示
+        let project = projectObj.project;
+        if(project.isBillsLocked() && project.withinBillsLocked(project.mainTree.selected)){
+            return;
+        }
         $("#fee_rate_tree").modal({show:true});
         $('#edit_from').val(hitinfo.sheet.name());
     },

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

@@ -279,7 +279,7 @@ var gljOprObj = {
         let selected = projectObj.project.mainTree.selected;
         if(selected) {
             //清单锁定时只读
-            if(selected.sourceType == ModuleNames.bills && projectObj.project.isBillsLocked()){
+            if(selected.sourceType == ModuleNames.bills && projectObj.project.isBillsLocked() && projectObj.project.withinBillsLocked(selected)){
                 return true;
             }
             //是主材或者是设备时只读

+ 1 - 1
web/building_saas/main/js/views/main_tree_col.js

@@ -275,7 +275,7 @@ let MainTreeCol = {
         }
     },
     editChecking:function(node){
-        if(node.sourceType==projectObj.project.Bills.getSourceType()&&projectObj.project.isBillsLocked()){
+        if(node.sourceType==projectObj.project.Bills.getSourceType()&&projectObj.project.isBillsLocked()&&projectObj.project.withinBillsLocked(node)){
             return true;
         }
         if(gljOprObj.isInstallationNode(node)){//如果是通过安装增加费自动生成的,都是只读类型

+ 91 - 14
web/building_saas/main/js/views/project_glj_view.js

@@ -111,6 +111,7 @@ projectGljObject={
         this.mixRatioSheet = this.mixRatioSpread .getSheet(0);
         this.initSheet(this.mixRatioSheet,this.mixRatioSetting);
         this.mixRatioSheet.name('mixRatioSheet');
+        this.mixRatioSheet.bind(GC.Spread.Sheets.Events.RangeChanged, this.onMixRatioRangeChange);
     },
     initMaterialTreeSheet:function () {
         this.materialTreeSheet = this.projectGljSpread.getSheet(1);
@@ -225,7 +226,8 @@ projectGljObject={
             type:glj.type,
             short_name:projectObj.project.projectGLJ.getShortNameByID(glj.type),
             consumption:glj.ratio_data.consumption,
-            unit_price:glj.unit_price
+            unit_price:glj.unit_price,
+            connect_key:glj.ratio_data.connect_key
         };
         gljOprObj.setGLJPrice(data,glj);
         return data;
@@ -238,7 +240,7 @@ projectGljObject={
             args.cancel = true;
         }
     },
-    projectGljEditChecking:function (row,col) {//return false表示不能编辑
+    projectGljEditChecking:function (row,col,isPaste=false) {//return false表示不能编辑
         let me = projectGljObject;
         let data = null, setting=null;
         let sheet = me.projectGljSpread.getActiveSheet();
@@ -256,7 +258,7 @@ projectGljObject={
             return false;
         }
 
-        if(dataCode=='is_adjust_price'||dataCode=='is_evaluate'||dataCode=='is_main_material'){
+        if(isPaste == false &&(dataCode=='is_adjust_price'||dataCode=='is_evaluate'||dataCode=='is_main_material')){//除了粘贴,拖动填充等操作,其它的都不能编辑
             return false;
         }
         if(dataCode=='basePrice'||dataCode=='marketPrice'||dataCode=='supply'){//有组成物时,市场单价、定额价、供货方式不能修改
@@ -282,7 +284,7 @@ projectGljObject={
     },
     onSelectionChange:function (){
         let me = projectGljObject;
-        me.projectGljRowChang();
+        me.showMixRatioData();
         me.materialTreeSheet.repaint();
     },
     onProjectGljSelectionChange:function (sender, args) {
@@ -296,7 +298,11 @@ projectGljObject={
     },
     projectGljRowChang:function(row){
         let me = projectGljObject;
-        me.mixRatioSheet.getSelections()[0].row = -1;
+        let sel = me.mixRatioSheet.getSelections()[0];
+        sel.row = -1;
+        sel.col = 0;
+        sel.rowCount = 1;
+        sel.colCount = 1;
         me.showMixRatioData();
     },
     rightClickCallback:function (row) {
@@ -312,18 +318,20 @@ projectGljObject={
         let me = projectGljObject;
         let changeInfo=[];
         let canChange = true;
-        if(me.projectGljEditChecking(info.row,info.col) == false){
-            canChange = false;
-        }else if (info.action == GC.Spread.Sheets.RangeChangedAction.clear) {
-            info.newValue = null;
-            me.onProjectGLJValueChange(sender,info);
-            return ;
+        if(info.action == GC.Spread.Sheets.RangeChangedAction.clear){
+            if(me.projectGljEditChecking(info.row,info.col) == false){
+                canChange = false;
+            }else {
+                info.newValue = null;
+                me.onProjectGLJValueChange(sender,info);
+                return ;
+            }
         }
 
         for(let c of info.changedCells){
             let value=  info.sheet.getCell(c.row, c.col).text();
             changeInfo.push({row:c.row,col:c.col,value:value});
-            if(me.projectGljEditChecking(c.row,c.col)==false){//如果不能编辑
+            if(me.projectGljEditChecking(c.row,c.col,true)==false){//如果不能编辑
                 canChange = false;
             }
             if (canChange==true&&!me.checkData(c.col,me.projectGljSetting,value)) {
@@ -334,18 +342,87 @@ projectGljObject={
         if(canChange == false){//恢复原来的值
             info.sheetName =="materialTreeSheet"?me.showMaterialTreeData():me.showProjectGljData();
         }else if(info.sheetName =="projectGljSheet"){
-            me.batchUpdatePrice(changeInfo);
+            me.batchUpdateProjectGLJ(changeInfo);
         }
     },
-    batchUpdatePrice(changeInfo){
+    onMixRatioRangeChange:function (sender,info){
+        let me = projectGljObject;
+        let canChange = true;
+        let changeInfo=[];
+        if (info.action == GC.Spread.Sheets.RangeChangedAction.clear) {
+            info.newValue = 0;
+            me.onMixRatioValueChange(sender,info);
+            info.sheet.getCell(info.row, info.col).text(0);
+            return ;
+        }
+
+        for(let c of info.changedCells){
+            let value = info.sheet.getCell(c.row, c.col).text();
+            if (!me.checkData(c.col,me.mixRatioSetting,value)) {
+                alert('输入的数据类型不对,请重新输入!');
+                canChange = false;
+                break;
+            }else {
+                changeInfo.push({row:c.row,col:c.col,value:value});
+            }
+        }
+
+        if(canChange == false){//数据类型不对
+            me.showMixRatioData();
+        }
+        if(changeInfo.length > 0){
+            me.batchUpdateConsumption(changeInfo);
+        }
+
+
+    },
+    batchUpdateProjectGLJ:function(changeInfo){
         let projectGLJ = projectObj.project.projectGLJ;
         let me = projectGljObject;
+        me.batchUpdateGLJProperty(changeInfo);
         projectGLJ.batchUpdatePrice(changeInfo,function (impactList) {
             let selected = me.projectGljSheet.getSelections()[0];
             me.showProjectGljData();
             me.projectGljSheet.setSelection(selected.row,selected.col,selected.rowCount,selected.colCount);
         });
     },
+    batchUpdateGLJProperty:function (changeInfo) {
+        console.log(changeInfo)
+    },
+    batchUpdateConsumption:function(changeInfo){
+        let projectGLJ = projectObj.project.projectGLJ;
+        let me = projectGljObject;
+        let updateMap = {},updateData = [],parentBasePrice = 0,parentMarketPrice = 0;
+        let parentKey = '',unit_price_file_id=null;
+        for(let c of changeInfo){
+            let record = me.mixRatioData[c.row];
+            let value = scMathUtil.roundForObj(c.value,getDecimal("glj.quantity"));
+            updateMap[record.mix_ratio_id] = {consumption: value,record:record };
+            updateData.push({type:'mix_ratio',query:{id:record.mix_ratio_id},doc:{consumption:value}});
+            parentKey = record.connect_key;
+            unit_price_file_id = record.unit_price.unit_price_file_id;
+        }
+        for(let sub of me.mixRatioData){
+            let marketPrice = scMathUtil.roundForObj(sub.unit_price.market_price,getDecimal("process"));
+            let basePrice = scMathUtil.roundForObj(sub.unit_price.base_price,getDecimal("process"));
+            let consumption =  updateMap[sub.mix_ratio_id]?updateMap[sub.mix_ratio_id].consumption:scMathUtil.roundForObj(sub.consumption,getDecimal("glj.quantity"));
+            parentMarketPrice = scMathUtil.roundForObj(marketPrice*consumption + parentMarketPrice,getDecimal("process"));
+            parentBasePrice = scMathUtil.roundForObj(basePrice*consumption + parentBasePrice,getDecimal("process"));
+        }
+        parentBasePrice = scMathUtil.roundForObj(parentBasePrice,getDecimal("glj.unitPrice"));
+        parentMarketPrice = scMathUtil.roundForObj(parentMarketPrice,getDecimal("glj.unitPrice"));
+        updateData.push({type:'parent',connect_key:parentKey,base_price:parentBasePrice,market_price:parentMarketPrice,unit_price_file_id:unit_price_file_id});
+        projectGLJ.batchUpdateConsumption(updateData,updateMap,function () {
+            //更新人材机汇总表
+            let parentSheet =  me.projectGljSpread.getActiveSheet();//三材汇总表和工料机汇总表
+            let prow = parentSheet.getActiveRowIndex();//取父机械或组成物的下标
+            let prowData = parentSheet.name() == 'projectGljSheet'?me.projectGljSheetData[prow]:me.materialTree.items[prow].data;
+            me.refreshParentData(prow,prowData.id);
+            me.onUnitFileChange(updateData);
+        });
+
+    },
+
     showProjectGljData:function () {
         this.projectGljSpread.setActiveSheetIndex(0);
         let sel = this.projectGljSheet.getSelections()[0];

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

@@ -31,7 +31,6 @@ var projectInfoObj = {
         CommonAjax.post('/pm/api/getProject', {"user_id": userID, "proj_id": scUrlUtil.GetQueryString('project')}, function (data) {
             if (data) {
                 that.projectInfo = data;
-                console.log(that.projectInfo);
                 //init decimal
                 setDecimal(decimalObj, data.property.decimal);
                 billsQuanDecimal.datas = data.property.billsQuantityDecimal || [billsDecimalView.angleDecimal];

+ 18 - 9
web/building_saas/main/js/views/project_view.js

@@ -66,7 +66,7 @@ var projectObj = {
             if(!node){
                 return false;
             }
-            if(projectObj.project.isBillsLocked()== true){
+            if(projectObj.project.isBillsLocked()== true && projectObj.project.withinBillsLocked(node)){
                 return false;
             }
             if(node.depth()<=1){//焦点行是树结构的第一/二层节点,灰显。
@@ -98,7 +98,7 @@ var projectObj = {
             if(!node){
                 return false;
             }
-            if(projectObj.project.isBillsLocked()== true){
+            if(projectObj.project.isBillsLocked()== true && projectObj.project.withinBillsLocked(node)){
                 return false;
             }
             if(node.depth()==0){//焦点行是树结构的第一层节点,灰显。
@@ -129,7 +129,7 @@ var projectObj = {
         let canUpMove = function (node) {
             if(node&&node.preSibling){//有前兄弟
                 if(node.sourceType==that.project.Bills.getSourceType()){
-                    if(projectObj.project.isBillsLocked()== true){
+                    if(projectObj.project.isBillsLocked()== true && projectObj.project.withinBillsLocked(node)){
                         return false;
                     }
                     if(node.data.type == billType.DXFY&&node.data.isAdd!==1){
@@ -143,7 +143,7 @@ var projectObj = {
         let canDownMove = function (node) {
             if(node&&node.nextSibling){
                 if(node.sourceType==that.project.Bills.getSourceType()){
-                    if(projectObj.project.isBillsLocked()== true){
+                    if(projectObj.project.isBillsLocked()== true && projectObj.project.withinBillsLocked(node)){
                         return false;
                     }
                     if(node.data.type == billType.DXFY&&node.data.isAdd!==1){
@@ -300,7 +300,14 @@ var projectObj = {
                 });
             }
         }
-        if(node.data.type==billType.FX||node.data.type==billType.BX||(node.data.type==billType.BILL&&node.source.children.length==0)){//是分项、补项或者叶子清单的情况下才需要查找替换
+        //分部分项、措施项目才匹配
+        let withinValidFixed = false;
+        let matchFixedFlags = [fixedFlag.SUB_ENGINERRING, fixedFlag.MEASURE];
+        let rootNode = getRootFixedNode(node);
+        if(rootNode && rootNode.data.flagsIndex && rootNode.data.flagsIndex.fixed && matchFixedFlags.includes(rootNode.data.flagsIndex.fixed.flag)){
+            withinValidFixed = true;
+        }
+        if(withinValidFixed && (node.data.type==billType.FX||node.data.type==billType.BX||(node.data.type==billType.BILL&&node.source.children.length==0))){//是分项、补项或者叶子清单的情况下才需要查找替换
             if (value&&value.length === 9 && /^[\d]+$/.test(value)) {
                 stdMatchCode = value;
                 formatCode = project.Bills.newFormatCode(stdMatchCode);
@@ -524,6 +531,8 @@ var projectObj = {
     mainSpreadEditEnded: function (sender, info) {
         let project = projectObj.project;
         let node = project.mainTree.items[info.row];
+        console.log( project.withinBillsLocked(node));
+        project.withinBillsLocked(node);
         let colSetting = projectObj.mainController.setting.cols[info.col];
         let fieldName = projectObj.mainController.setting.cols[info.col].data.field;
         // 检查输入类型等
@@ -706,7 +715,7 @@ var projectObj = {
                     name: "插入大项费用",
                     icon: 'fa-sign-in',
                     disabled: function () {
-                        return projectObj.project.isBillsLocked();
+                        return projectObj.project.isBillsLocked() && project.withinBillsLocked(project.mainTree.selected);
                         //return project.mainTree.selected ? project.mainTree.selected.sourceType !== project.Bills.getSourceType() : false;
                     },
                     callback: function (key, opt) {
@@ -788,7 +797,7 @@ var projectObj = {
                     icon: 'fa-sign-in',
                     disabled: function () {
                         let selected = project.mainTree.selected;
-                        if(projectObj.project.isBillsLocked()== false && selected && selected.sourceType === project.Bills.getSourceType()){
+                        if(!(projectObj.project.isBillsLocked()== true && project.withinBillsLocked(selected)) && selected && selected.sourceType === project.Bills.getSourceType()){
                             return false
                         }
                         return true;
@@ -1470,7 +1479,7 @@ $('#downMove').click(function () {
         };
     }
 });
-$("a[name='lockBills']").click(function () {
+$("a[name='lockBills']").click(function () {//
     let lockBills = projectInfoObj.projectInfo.property.lockBills;
     lockBills = !lockBills;
     projectObj.project.updateLockBills(lockBills,function () {
@@ -1874,7 +1883,7 @@ function ifCanDelete() {
                 if(node.data.type == billType.DXFY&&node.data.isAdd!=1){
                     return false;
                 }
-                if(projectObj.project.isBillsLocked()== true){
+                if(projectObj.project.isBillsLocked()== true && projectObj.project.withinBillsLocked(node)){
                     return false;
                 }
                 if(projectObj.project.Bills.hasFlags(node)){

+ 14 - 4
web/building_saas/main/js/views/std_bills_lib.js

@@ -122,7 +122,7 @@ var billsLibObj = {
         return features;
     },
     insertBills: function (stdBillsJobData, stdBillsFeatureData, node) {
-        if(projectInfoObj.projectInfo.property.lockBills == true){
+        if(projectInfoObj.projectInfo.property.lockBills == true && projectObj.project.withinBillsLocked(node)){
             return false;
         }
         $.bootstrapLoading.start();
@@ -137,14 +137,24 @@ var billsLibObj = {
             if (existB) {
                 let std = JSON.parse(JSON.stringify(node.data));
                 std.unit = existB.unit;
-                ProjectController.addBills(projectObj.project, projectObj.mainController, std);
+                let canAdd = ProjectController.addBills(projectObj.project, projectObj.mainController, std);
+                if(canAdd === false && $.bootstrapLoading.isLoading()){
+                    $.bootstrapLoading.end();
+                }
             } else {
                 ConfirmModal.stdBillsUnit.check(node.data, function (std) {
-                    ProjectController.addBills(projectObj.project, projectObj.mainController, std);
+                    let canAdd = ProjectController.addBills(projectObj.project, projectObj.mainController, std);
+                    if(canAdd === false && $.bootstrapLoading.isLoading()){
+                        $.bootstrapLoading.end();
+                    }
                 });
             }
         } else {
-            ProjectController.addBills(projectObj.project, projectObj.mainController, node.data);
+            let canAdd = ProjectController.addBills(projectObj.project, projectObj.mainController, node.data);
+            if(canAdd === false && $.bootstrapLoading.isLoading()){
+                console.log('enter');
+                $.bootstrapLoading.end();
+            }
         }
         return true;
     },

+ 4 - 1
web/building_saas/pm/js/pm_newMain.js

@@ -1186,7 +1186,10 @@ $(document).ready(function() {
 
     // 新增单位工程
     $("#add-tender-confirm").click(function() {
-        AddTender();
+        let suc = AddTender();
+        if(suc === false){
+            $('#add-tender-confirm').removeClass('disabled');
+        }
     });
 
     // 新增文件夹按钮点击