Browse Source

bugs/ 人材机汇总批量更新

zhangweicheng 7 years ago
parent
commit
b8cf5dc02b

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

@@ -660,6 +660,33 @@ class GLJController extends BaseController {
         }
         res.json(result);
     }
+    async batchUpdateGLJProperty(req, res){
+        let result={
+            error:0
+        };
+        try {
+            let data = req.body.data;
+            data = JSON.parse(data);
+            let tasks = [];
+            for(let key in data){
+                let doc = data[key];
+                let query = {id:parseInt(key)};
+                let task = {updateOne:{filter:query, update :doc}};
+                tasks.push(task);
+            }
+            if(tasks.length > 0){
+                let gljModel = new GLJListModel().model;
+                await gljModel.bulkWrite(tasks);
+            }
+            result.data=data;
+        }catch (err){
+            logger.err(err);
+            result.error=1;
+            result.message = err.message;
+        }
+        res.json(result);
+    }
+
     async batchUpdateConsumption(req,res){
         let result={
             error:0
@@ -707,6 +734,7 @@ class GLJController extends BaseController {
         }
         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('/batchUpdateGLJProperty', gljController.init, gljController.batchUpdateGLJProperty);
 router.post('/batchUpdateConsumption', gljController.init, gljController.batchUpdateConsumption);
 router.post('/modifyKeyValue',gljController.init, gljController.modifyKeyValue);
 

+ 2 - 1
public/web/sheet/sheet_data_helper.js

@@ -55,8 +55,9 @@ var SheetDataHelper = {
         spread.options.allowContextMenu = false;
         spread.options.allowUserDragDrop = false;
         spread.options.allowUndo = false;//that.mainSpread.commandManager().setShortcutKey(undefined, GC.Spread.Commands.Key.z, true, false, false, false); 屏蔽undo
-        spread.options. allowUserEditFormula = false;
+        spread.options.allowUserEditFormula = false;
         spread.options.showDragFillSmartTag = false;
+        spread.options.defaultDragFillType =GC.Spread.Sheets.Fill.AutoFillType.fillWithoutFormatting;
         spread.getActiveSheet().setRowCount(3);
         return spread;
     },

+ 4 - 4
web/building_saas/main/html/main.html

@@ -1218,12 +1218,12 @@
         </div>
     </div>
 
-    <!--弹出 粘位置选择-->
+    <!--弹出 粘位置选择-->
     <div class="modal fade" id="pastePosition" data-backdrop="static">
         <div class="modal-dialog" role="document">
             <div class="modal-content">
                 <div class="modal-header">
-                    <h5 class="modal-title">粘位置选择</h5>
+                    <h5 class="modal-title">粘位置选择</h5>
                     <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                         <span aria-hidden="true">&times;</span>
                     </button>
@@ -1247,9 +1247,9 @@
                         </div>
                     </div>
                 </div>
-                <div class="modal-footer">
+                <div class="modal-footer" style="justify-content: center">
                     <button class="btn btn-primary" id="paste_confirm">确定</button>
-                    <button type="button" class="btn btn-secondary" data-dismiss="modal">关闭</button>
+                    <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
                 </div>
             </div>
         </div>

+ 32 - 4
web/building_saas/main/js/models/bills.js

@@ -506,14 +506,42 @@ var Bills = {
                 return false;
             }
         };
-        bills.prototype.isEngineerEst = function (node) {//判断是否是“专业工程暂估价”节点
-            return node && isFlag(node.data)&&node.data.flagsIndex.fixed.flag==fixedFlag.ENGINEERING_ESITIMATE;
+        bills.prototype.nodeFlagCheck = function (node,fixedFlag) {//判断节点类型
+            let flagCheck = function (checkNode) {
+                if(isFlag(checkNode.data)&&checkNode.data.flagsIndex.fixed.flag==fixedFlag){
+                    return true;
+                }else {
+                    if(checkNode.parent){
+                        return flagCheck(checkNode.parent);
+                    }else {
+                        return false;
+                    }
+                }
+            };
+            return flagCheck(node);
+        };
+
+        bills.prototype.getNodeByFlag = function(node,flag){//取节点类型,返回本身或父项节点
+            if(node){
+                if(isFlag(node.data)&&node.data.flagsIndex.fixed.flag==flag){
+                    return node;
+                }else {
+                    return this.getNodeByFlag(node.parent,flag);
+                }
+            }else {
+                return null;
+            }
+        };
+
+        bills.prototype.isEngineerEst = function (node) {//判断是否是“专业工程暂估价”节点或者子项
+           return this.nodeFlagCheck(node,fixedFlag.ENGINEERING_ESITIMATE);
+            //return node && isFlag(node.data)&&node.data.flagsIndex.fixed.flag==fixedFlag.ENGINEERING_ESITIMATE;
         };
         bills.prototype.isTotalService = function (node) {//判断是否是“总承包服务费”节点
-            return node && isFlag(node.data)&&node.data.flagsIndex.fixed.flag==fixedFlag.TURN_KEY_CONTRACT;
+            return this.nodeFlagCheck(node,fixedFlag.TURN_KEY_CONTRACT);
         };
         bills.prototype.isClaimVisa = function (node) {//判断是否是“签证及索赔计价”节点
-            return node && isFlag(node.data)&&node.data.flagsIndex.fixed.flag==fixedFlag.CLAIM_VISA;
+            return this.nodeFlagCheck(node,fixedFlag.CLAIM_VISA);
         };
         bills.prototype.isMeasure = function (node) {//判读是否属于措施项目部分
             let rootNode = this.getRootNode(node);

+ 23 - 3
web/building_saas/main/js/models/project_glj.js

@@ -298,16 +298,36 @@ ProjectGLJ.prototype.updatePrice = function (recode, updateField, newval,from,cb
     }
 };
 
-ProjectGLJ.prototype.batchUpdatePrice = function (changeInfo,callback) {
+ProjectGLJ.prototype.batchUpdateGLJProperty = function (updateMap,callback) {
+    //更新是否暂估和供货方式时,要做特殊处理
+    $.bootstrapLoading.start();
+    CommonAjax.post("/glj/batchUpdateGLJProperty", updateMap,function (result) {
+        $.bootstrapLoading.end();
+
+        if(callback){
+            callback();
+        }
+
+    })
+
+
+};
+
+ProjectGLJ.prototype.batchUpdatePrice = function (changeInfo,sheetName,callback) {
     let me = this;
     let projectGljs = me.datas.gljList;
     let decimal = getDecimal('glj.unitPrice');
     let updateData = [];
     let newValueMap = {};
     let gljs=[];
+    let setting = sheetName =="materialTreeSheet"?projectGljObject.materialSetting:projectGljObject.projectGljSetting;
+    if(changeInfo.length<=0){
+        callback?callback():'';
+        return
+    }
     for(let ci of changeInfo){
-        let dataCode = projectGljObject.projectGljSetting.header[ci.col].dataCode;
-        let recode = projectGljObject.projectGljSheetData[ci.row];
+        let dataCode = setting.header[ci.col].dataCode;
+        let recode = sheetName =="materialTreeSheet"?projectGljObject.materialTree.items[ci.row].data:projectGljObject.projectGljSheetData[ci.row];
         if(dataCode=='basePrice'||dataCode=='marketPrice'){
             let editField = dataCode === 'basePrice'?"base_price":"market_price";
             let newValue= scMathUtil.roundForObj(ci.value,decimal);

+ 1 - 2
web/building_saas/main/js/models/quantity_detail.js

@@ -677,6 +677,7 @@ var quantity_detail = {
                     project.projectGLJ.loadData();
                 });*/
                 project.calcProgram.calcNodesAndSave(needUpdateChildren, function () {
+                    project.projectGLJ.calcQuantity();
                     if(project.Bills.isFBFX(node)) { //判断是否属于分部分项工程 ,是的话才需要做计取安装费计算
                         project.installation_fee.calcInstallationFee(function (isChange,rations) {
                             if(isChange){
@@ -685,8 +686,6 @@ var quantity_detail = {
                                 });
                             }
                         });
-                    }else {
-                        project.projectGLJ.calcQuantity();
                     }
                 });
 

+ 74 - 9
web/building_saas/main/js/views/project_glj_view.js

@@ -250,6 +250,10 @@ projectGljObject={
         }else if(sheet.name() ==  'materialTreeSheet'){
             data = me.materialTree.selected.data;
             setting = me.materialSetting;
+            let notEditId= ['GC','GJ','MC','SN','SZ'];
+            if(notEditId.indexOf(data.id)!= -1){
+                return false;
+            }
         }
         let dataCode = setting.header[col].dataCode;
         let lockColumns = setting.view.lockColumns;
@@ -342,7 +346,7 @@ projectGljObject={
         if(canChange == false){//恢复原来的值
             info.sheetName =="materialTreeSheet"?me.showMaterialTreeData():me.showProjectGljData();
         }else if(info.sheetName =="projectGljSheet"){
-            me.batchUpdateProjectGLJ(changeInfo);
+            me.batchUpdateProjectGLJ(changeInfo,info.sheetName);
         }
     },
     onMixRatioRangeChange:function (sender,info){
@@ -376,18 +380,79 @@ projectGljObject={
 
 
     },
-    batchUpdateProjectGLJ:function(changeInfo){
+    batchUpdateProjectGLJ:function(changeInfo,sheetName){
         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);
+        let propertyCells=[],priceCells=[];
+        let setting = sheetName =="materialTreeSheet"?me.materialSetting:me.projectGljSetting;
+        for(let c of changeInfo){
+            c.dataCode = setting.header[c.col].dataCode;
+            if(c.dataCode == 'basePrice'||c.dataCode=='marketPrice'){
+                priceCells.push(c);
+            }else {
+                propertyCells.push(c);
+            }
+        }
+        me.batchUpdateGLJProperty(propertyCells,sheetName,function () {
+            //价格属于单价文件表,如果与项目工料机的其它属性一起的话计算起来会比较复杂,同时出现价格与其它属性一起更新的情况也会比较少;
+            projectGLJ.batchUpdatePrice(priceCells,sheetName,function (impactList) {
+                me.refreshBySheetName(sheetName);
+            });
         });
     },
-    batchUpdateGLJProperty:function (changeInfo) {
-        console.log(changeInfo)
+    refreshBySheetName:function (sheetName) {
+        let me = projectGljObject;
+        if(sheetName =="projectGljSheet"){
+            me.showProjectGljData();
+        }else if(sheetName =="materialTreeSheet"){
+            me.showMaterialTreeData();
+        }
+    },
+
+    batchUpdateGLJProperty:function (changeInfo,sheetName,callback) {
+        let me = projectGljObject,updateMap = {};
+        let projectGLJ = projectObj.project.projectGLJ;
+        for(let c of changeInfo){
+            let recode = sheetName =="materialTreeSheet"?me.materialTree.items[c.row].data:me.projectGljSheetData[c.row];
+            if(recode[c.dataCode] == c.value){
+                continue;
+            }
+            me.getUpdateData(recode.id,c.value,c.dataCode,c.quantity,updateMap);
+        }
+        if(_.isEmpty(updateMap)){
+            callback?callback():'';
+            return;
+        }
+        projectGLJ.batchUpdateGLJProperty(updateMap,callback);
+        console.log(updateMap)
+    },
+    getUpdateData :function (id,value,dataCode,quantity,updateMap) {
+        let me = projectGljObject;
+        let data = updateMap[id]?updateMap[id]:{};
+        // 如果是供货方式则需要处理数据
+        if (data === 'supply') {
+            data.supply_quantity = me.getSupplyQuantity(value,quantity);
+        }
+        if(dataCode === 'supply_quantity'){//修改数量需做4舍5入
+            value =  scMathUtil.roundForObj(value,getDecimal('glj.quantity'));
+        }
+        if(dataCode === 'is_evaluate'||dataCode === 'is_adjust_price'||dataCode === 'is_main_material'){
+            if(value){
+                value = 1;
+            }else {
+                value = 0;
+            }
+        }
+        if(dataCode === 'materialType' && (value == null || value=="")){//删除三材类别时,清空三材系数
+            value = null;
+            data.materialCoe = null;
+        }
+        if(dataCode == 'materialCoe'){
+            value = scMathUtil.roundForObj(value,getDecimal("material"));
+        }
+
+        data[dataCode] = value ;
+        updateMap[id] = data;
     },
     batchUpdateConsumption:function(changeInfo){
         let projectGLJ = projectObj.project.projectGLJ;

+ 12 - 4
web/building_saas/main/js/views/project_view.js

@@ -959,8 +959,10 @@ var projectObj = {
                          return project.Bills.isEngineerEst(project.mainTree.selected);//当焦点行是“专业工程暂估价”时,右键可见并有效。
                     },
                     callback: function () {
-                        projectObj.editContent(project.mainTree.selected,'engineeringContent');
-                        //BlockController.pasteBlock(project.mainTree.selected);
+                        let node = project.Bills.getNodeByFlag(project.mainTree.selected,fixedFlag.ENGINEERING_ESITIMATE);
+                        if(node){
+                            projectObj.editContent(node,'engineeringContent');
+                        }
                     }
                 },
                 "editService": {
@@ -970,7 +972,10 @@ var projectObj = {
                         return project.Bills.isTotalService(project.mainTree.selected);//当焦点行是“总承包服务费”时,右键可见并有效。
                     },
                     callback: function () {
-                        projectObj.editContent(project.mainTree.selected,'serviceContent');
+                        let node = project.Bills.getNodeByFlag(project.mainTree.selected,fixedFlag.TURN_KEY_CONTRACT);
+                        if(node){
+                            projectObj.editContent(node,'serviceContent');
+                        }
                     }
                 },
                 "editAccording": {
@@ -980,7 +985,10 @@ var projectObj = {
                         return project.Bills.isClaimVisa(project.mainTree.selected);//当焦点行是“签证及索赔计价”时,右键可见并有效。
                     },
                     callback: function () {
-                        projectObj.editContent(project.mainTree.selected,'claimVisa');
+                        let node = project.Bills.getNodeByFlag(project.mainTree.selected,fixedFlag.CLAIM_VISA);
+                        if(node){
+                            projectObj.editContent(node,'claimVisa');
+                        }
                     }
                 }
             }