瀏覽代碼

bug fixed and cal tenderQuantity

zhangweicheng 7 年之前
父節點
當前提交
657870a1c2

+ 57 - 18
public/web/gljUtil.js

@@ -6,7 +6,7 @@
 
 
 let gljUtil = {
-    calcProjectGLJQuantity:function (projectGLJDatas,rationGLJDatas,rationDatas,billsDatas,q_decimal,_,scMathUtil) {
+    calcProjectGLJQuantity:function (projectGLJDatas,rationGLJDatas,rationDatas,billsDatas,q_decimal,_,scMathUtil,isTender) {
         let project_gljs = projectGLJDatas.gljList;
         let mixRatioMap = projectGLJDatas.mixRatioMap;
         let rations = rationDatas;
@@ -15,16 +15,20 @@ let gljUtil = {
         let rationGljGroup = _.groupBy(rationGLJDatas,'projectGLJID');
         let IDarray =  this.getSubdivisionAndTechBillsLeavesID(billsDatas);//分别取分部分项和技术措施项目的所有叶子清单ID
         let billIDs = IDarray[0],tech_billIDS = IDarray[1];
+        let sField = isTender==true?"tenderSubdivisionQuantity":"subdivisionQuantity";
+        let tField = isTender==true?"tenderTechQuantity":"techQuantity";
+        let qField = isTender==true?"tenderQuantity":"quantity";
+
         for(let pglj of project_gljs ){
             let pg_index = this.getIndex(pglj,this.gljKeyArray);
-            pglj.subdivisionQuantity = 0;
-            pglj.techQuantity = 0;
-            pglj.quantity = 0;
+            pglj[sField] = 0;
+            pglj[tField] = 0;
+            pglj[qField] = 0;
             let gljGroup = rationGljGroup[pglj.id]?rationGljGroup[pglj.id]:[];//定额工料机没有,有可能是定额类型的工料机
-            let result = this.getQuantityPerGLJ(gljGroup,rations,rationMap,pglj,billIDs,tech_billIDS,q_decimal,_,scMathUtil);
-            pglj.subdivisionQuantity = result.subdivisionQuantity;
-            pglj.techQuantity = result.techQuantity;
-            pglj.quantity = result.quantity;
+            let result = this.getQuantityPerGLJ(gljGroup,rations,rationMap,pglj,billIDs,tech_billIDS,q_decimal,_,scMathUtil,isTender);
+            pglj[sField] = result.subdivisionQuantity;
+            pglj[tField] = result.techQuantity;
+            pglj[qField] = result.quantity;
             quantityMap[pg_index] = pglj;
         }
         //计算做为组成物的消耗量
@@ -35,20 +39,17 @@ let gljUtil = {
                 let m_glj = quantityMap[m_index];
                 let p_glj = quantityMap[pkey];
                 if(m_glj&&p_glj){
-                    let quantity = scMathUtil.roundForObj(parseFloat(p_glj.quantity)*parseFloat(m.consumption),q_decimal);
-                    let techQuantity = scMathUtil.roundForObj(parseFloat(p_glj.techQuantity)*parseFloat(m.consumption),q_decimal);
-                    let subdivisionQuantity = scMathUtil.roundForObj(parseFloat(p_glj.subdivisionQuantity)*parseFloat(m.consumption),q_decimal);
-                    m_glj.quantity =  scMathUtil.roundForObj(parseFloat(m_glj.quantity)+quantity,q_decimal);
-                    m_glj.techQuantity =  scMathUtil.roundForObj(parseFloat(m_glj.techQuantity)+techQuantity,q_decimal);
-                    m_glj.subdivisionQuantity =  scMathUtil.roundForObj(parseFloat(m_glj.subdivisionQuantity)+subdivisionQuantity,q_decimal);
-                    if(m_glj.id == 6832){
-                        console.log(m_glj.quantity)
-                    }
+                    let quantity = scMathUtil.roundForObj(parseFloat(p_glj[qField])*parseFloat(m.consumption),q_decimal);
+                    let techQuantity = scMathUtil.roundForObj(parseFloat(p_glj[tField])*parseFloat(m.consumption),q_decimal);
+                    let subdivisionQuantity = scMathUtil.roundForObj(parseFloat(p_glj[sField])*parseFloat(m.consumption),q_decimal);
+                    m_glj[qField] =  scMathUtil.roundForObj(parseFloat(m_glj[qField])+quantity,q_decimal);
+                    m_glj[tField] =  scMathUtil.roundForObj(parseFloat(m_glj[tField])+techQuantity,q_decimal);
+                    m_glj[sField] =  scMathUtil.roundForObj(parseFloat(m_glj[sField])+subdivisionQuantity,q_decimal);
                 }
             }
         }
     },
-    getQuantityPerGLJ : function (ration_glj_list,rations,rationMap,pglj,billIDs,tech_billIDS,q_decimal,_,scMathUtil) {
+    getQuantityPerGLJ : function (ration_glj_list,rations,rationMap,pglj,billIDs,tech_billIDS,q_decimal,_,scMathUtil,isTender) {
         let result={};
         let quantity_sum=0;//工料机汇总消耗量
         let sum = 0;//分部分项总消耗量
@@ -60,6 +61,10 @@ let gljUtil = {
             if(!r_quantity){
                 continue;
             }
+            if(isTender == true){
+                glj_quantity = this.getRationGLJTenderQuantity(rg,tem_ration,q_decimal,scMathUtil);
+                r_quantity = this.getRationTenderQuantity(tem_ration,q_decimal,scMathUtil);
+            }
             let total = scMathUtil.roundForObj(glj_quantity*r_quantity, q_decimal);
             quantity_sum = scMathUtil.roundForObj(quantity_sum+total,q_decimal);
             if(_.includes(billIDs,rg.billsItemID)){//计算分部分项
@@ -73,6 +78,9 @@ let gljUtil = {
             if(ra.type == this.rationType.gljRation&&ra.projectGLJID===pglj.id){
                 let r_quantity = scMathUtil.roundForObj(ra.quantity,q_decimal);
                 r_quantity = r_quantity?r_quantity:0;
+                if(isTender == true){
+                    r_quantity = this.getRationTenderQuantity(ra,q_decimal,scMathUtil);
+                }
                 quantity_sum = scMathUtil.roundForObj(quantity_sum+r_quantity,q_decimal);
                 if(_.includes(billIDs,ra.billsItemID)){//计算分部分项
                     sum = scMathUtil.roundForObj(sum+r_quantity,q_decimal);
@@ -88,6 +96,37 @@ let gljUtil = {
         result.quantity = quantity_sum;
         return result;
     },
+    getRationGLJTenderQuantity:function (ration_glj,ration,q_decimal,scMathUtil) {
+        let coeMap = {
+          1:'labour',  //人工
+          2:'material',//材料
+          3:'machine',//机械
+          4:'main', //主材
+          5:'equipment'//设备
+        };
+        let typeString = ration_glj.type +"";
+        let coeField = "";
+        for(let key in coeMap){
+            if(typeString.indexOf(key)!= -1){
+              coeField = coeMap[key];
+            }
+        }
+        let coe = ration.quantityCoe&&this.isNotEmpty(ration.quantityCoe[coeField])?ration.quantityCoe[coeField]:1;
+        coe = parseFloat(coe);
+        let glj_quantity = scMathUtil.roundForObj(ration_glj.quantity, q_decimal);
+        return scMathUtil.roundForObj(glj_quantity * coe,q_decimal);
+    },
+    getRationTenderQuantity:function (ration,q_decimal,scMathUtil) {
+        let rationQuantityCoe = this.isNotEmpty(ration.rationQuantityCoe)?ration.rationQuantityCoe:1;
+        rationQuantityCoe = parseFloat(rationQuantityCoe);
+        let r_quantity = ration?scMathUtil.roundForObj(ration.quantity,q_decimal):0;
+        return scMathUtil.roundForObj(r_quantity * rationQuantityCoe,q_decimal);
+    },
+
+    isNotEmpty:function (str) {
+        return this.isDef(str) && str!="";
+    },
+
     getSubdivisionAndTechBillsLeavesID:function (billsDatas) {//分别取分部分项和技术措施项目的所有叶子清单ID
          if(typeof (projectObj) !== 'undefined'){//存在,说明在前端调用
              return [projectObj.project.Bills.getSubdivisionProjectLeavesID(),projectObj.project.Bills.getTechLeavesID()];

+ 1 - 1
web/building_saas/main/html/tender_price.html

@@ -8,7 +8,7 @@
         </div>
         <div class="input-group input-group-sm mr-2" style="width:240px">
             <div class="input-group-prepend">
-                <span class="input-group-text" id="inputGroup-sizing-sm">工料机单价调整系数</span>
+                <span class="input-group-text" id="inputGroup-sizing-sm">人材机单价调整系数</span>
             </div>
             <input id = 'gljPriceTenderCoe' type="number" step="0.1" class="form-control" placeholder="请输入系数" value="1">
         </div>

+ 27 - 2
web/building_saas/main/js/models/installation_fee.js

@@ -25,6 +25,10 @@ var installation_fee = {
         installation_fee.prototype.getInstallationFeeByLibID=function(libID){
             return _.find(this.datas,{'libID':libID});
         };
+        installation_fee.prototype.getInstallationFeeByID=function(ID){
+            return _.find(this.datas,{'ID':ID});
+        };
+
         installation_fee.prototype.getFeeRuleByFeeItem = function (feeItem) {
             let installFee = projectObj.project.installation_fee.getInstallationFeeByLibID(feeItem.libID);
             let impacRules = _.filter(installFee.feeRule,{'feeItemId':feeItem.ID});
@@ -169,7 +173,7 @@ var installation_fee = {
            };
            return updateData;
        };
-       installation_fee.prototype.getFeeItemUpdateData = function (libID,itemID,doc) {
+        installation_fee.prototype.getFeeItemUpdateData = function (libID,itemID,doc) {
            let installationFee = this.getInstallationFeeByLibID(libID);
             let updateData = {
                 ID:installationFee.ID,
@@ -179,6 +183,23 @@ var installation_fee = {
             };
             return updateData;
         };
+        installation_fee.prototype.updateInstallation = function (updateData,callback) {
+            let me = this;
+            me.submitInstallationUpdate(updateData,null,function (data) {
+                for(let u of updateData){
+                    let insFee =  me.getInstallationFeeByID(u.ID);
+                    let item = _.find(insFee[u.type],{'ID':u.itemID})
+                    if(item){
+                        for(let key in u.doc){
+                            item[key] = u.doc[key] ;
+                        }
+                    }
+                }
+                if(callback){
+                    callback(data);
+                }
+            });
+        };
        installation_fee.prototype.submitInstallationUpdate = function (updateData,rationInstallations,callback) {
             if(updateData){
                 let data = {'projectID':projectInfoObj.projectInfo.ID,'updateData':updateData};
@@ -695,8 +716,12 @@ var installation_fee = {
                     callback();
                 }
             });
-
         };
+
+
+
+
+
         installation_fee.prototype.resetToDefault = function (callback) {
             let me = this;
             let installFees = [];

+ 7 - 0
web/building_saas/main/js/models/project_glj.js

@@ -722,4 +722,11 @@ ProjectGLJ.prototype.calcQuantity  = function (init=false){
         }
     }
     changeArray.length > 0 && projectGljObject.calcPartASupplyFeeByProjectGLJs ?projectGljObject.calcPartASupplyFeeByProjectGLJs(changeArray):'';
+};
+
+ProjectGLJ.prototype.calcTenderQuantity  = function (){
+    let rationGLJDatas = projectObj.project.ration_glj.datas;
+    let rationDatas = projectObj.project.Ration.datas;
+    let billsDatas = projectObj.project.Bills.datas;
+    gljUtil.calcProjectGLJQuantity(this.datas,rationGLJDatas,rationDatas,billsDatas,getDecimal("glj.quantity"),_,scMathUtil,true);
 };

+ 26 - 16
web/building_saas/main/js/models/quantity_detail.js

@@ -190,7 +190,7 @@ var quantity_detail = {
                     console.log(newNode.data.quantity);
                     this.updateBillQuantity(newNode.data.quantity,newNode,newNode.data.quantityEXP);
                 }else {//更新定额所使用的值要用还没转换前的
-                    this.updateRationQuantity(node.data.r_quantity,newNode,newNode.data.quantityEXP);
+                    node.data? this.updateRationQuantity(node.data.r_quantity,newNode,newNode.data.quantityEXP):"";
                 }
             }
         };
@@ -341,20 +341,28 @@ var quantity_detail = {
             var selected = projectObj.project.mainTree.selected;
             query.refreshQuantity=true;
             if(!selected.data.hasOwnProperty('isFromDetail')||selected.data.isFromDetail==0){
-                var c = confirm("确定要使用工程量明细替换原工程量吗?");
-                if(!c){
+                hintBox.infoBox('操作确认', '确定要使用工程量明细替换原工程量吗?', 2, function () {
+                    summationUpdate(args,detailList,newval,query);
+                }, function () {
                     query.refreshQuantity=false;
-                }
+                    summationUpdate(args,detailList,newval,query);
+                },['确定','取消']);
+                return;
             }
-            if(detailList[args.row].hasOwnProperty('rationID')){
-                query.rationID=detailList[args.row].rationID;
-            }else {
-                query.billID = detailList[args.row].billID
+            summationUpdate(args,detailList,newval,query);
+
+            function summationUpdate(args,detailList,newval,query) {
+                if(detailList[args.row].hasOwnProperty('rationID')){
+                    query.rationID=detailList[args.row].rationID;
+                }else {
+                    query.billID = detailList[args.row].billID
+                }
+                var doc={
+                    isSummation:newval
+                };
+                projectObj.project.quantity_detail.normalUpdate(query,doc);
             }
-            var doc={
-                isSummation:newval
-            };
-            this.normalUpdate(query,doc);
+
         };
         quantity_detail.prototype.commonUpdate = function (url,postData,args,batchCallback) {
             var me = this;
@@ -564,10 +572,12 @@ var quantity_detail = {
             if(option==false&&node.sourceType === project.Ration.getSourceType()&&EXPString!='GCLMXHJ'&&EXPString.indexOf("QDL")==-1&&data.unit){//勾选不根据单位转换工程量,且定额是手输的,
                 let times = parseInt(data.unit);
                 if(!isNaN(times)){///如果定额单位可以做转换
-                    if(isNum(EXPString)){//如果表达式中只是数字
-                        node.data.quantityEXP = EXPString+" * "+times;
-                    }else {//如果表达式是一个计算式,则要加一个括号
-                        node.data.quantityEXP = "("+EXPString+") * "+times;
+                    if(node.data.quantityEXP){
+                        if(isNum(EXPString)){//如果表达式中只是数字
+                            node.data.quantityEXP = EXPString+" * "+times;
+                        }else {//如果表达式是一个计算式,则要加一个括号
+                            node.data.quantityEXP = "("+EXPString+") * "+times;
+                        }
                     }
                     if(node.data.contain!=0){
                        let billQuantity = scMathUtil.roundForObj(node.parent.data.quantity,getDecimal("quantity",node.parent));

+ 64 - 23
web/building_saas/main/js/views/installation_fee_view.js

@@ -271,6 +271,7 @@ let installationFeeObj={
                 me.showFeeDetailData();
             }
         }
+        me.feeItemSheet.repaint();
     },
     onFeeDetailSelectionChange:function (e,info) {
         console.log('detail selection change');
@@ -326,6 +327,24 @@ let installationFeeObj={
         info.newValue = newval;
         me.onFeeItemValueChange(e,info);
     },
+    refreshView:function () {
+        if(this.feeItemSpread == null){
+            this.initInstallationFeeSpread();
+        }else {
+            let sel_f = this.feeItemSheet.getSelections()[0];
+            let sel_d = this.feeDetailSheet.getSelections()[0];
+            this.showFeeItemData();
+            this.feeItemSheet.setSelection(sel_f.row ==-1?0:sel_f.row,sel_f.col,sel_f.rowCount,sel_f.colCount);
+            let oldData = sel_f.row<this.feeItemData.length?this.feeItemData[sel_f.row]:null;
+            if(oldData){
+                this.showFeeDetailData(oldData.libID,oldData.ID);
+            }else {
+                this.showFeeDetailData();
+            }
+            this.feeDetailSheet.setSelection(sel_d.row ==-1?0:sel_d.row,sel_d.col,sel_d.rowCount,sel_d.colCount);
+        }
+
+    },
     showFeeItemData:function () {
         this.feeItemData = this.getFeeItemData(projectObj.project.installation_fee.datas);
         this.feeItemSheet.setRowCount(0);
@@ -338,6 +357,7 @@ let installationFeeObj={
                 this.feeItemSheet.getRange(i,-1, 1, -1, GC.Spread.Sheets.SheetArea.viewport).locked(true);//this.feeItemSheet.getCell(i, 2).locked(true);
                 this.feeItemSheet.getRange(i,2,1,2).cellType(new GC.Spread.Sheets.CellTypes.Text());//费用类型、记取位置两列替换成普通的单元格;
             }
+            this.positionButtonChecking(i,data);
         }
 
     },
@@ -716,8 +736,11 @@ let installationFeeObj={
         }else if(selectedItem.feeType=='分项费用'){
             rootNode = project.Bills.getFBFXNode(controller);
         }
-        allNodes.push(rootNode);
-        controller.tree.getAllSubNode(rootNode.source,allNodes);
+        if(rootNode){
+            allNodes.push(rootNode);
+            controller.tree.getAllSubNode(rootNode.source,allNodes);
+        }
+
         for(let n of allNodes){
             let temData = {
                 ID:n.data.ID,
@@ -925,13 +948,15 @@ let installationFeeObj={
         let dataArray = [];
         let impacRules = projectObj.project.installation_fee.getFeeRuleByFeeItem(feeItem);
         for(let ir of impacRules){
-            let tem_data = {
-                ID:feeItem.installFeeID,
-                itemID:ir.ID,
-                type:'feeRule',
-                doc:{position: recode.code, billID:recode.ID}
-            };
-            dataArray.push(tem_data);
+            if(ir.position !=recode.code || ir.billID != recode.ID){
+                let tem_data = {
+                    ID:feeItem.installFeeID,
+                    itemID:ir.ID,
+                    type:'feeRule',
+                    doc:{position: recode.code, billID:recode.ID}
+                };
+                dataArray.push(tem_data);
+            }
         }
         return [dataArray,impacRules]
     },
@@ -962,12 +987,36 @@ let installationFeeObj={
         }
         projectObj.project.installation_fee.updateFeeItem(doc,feeItem.libID,feeItem.ID,cleanPosition,function () {
             me.feeItemSheet.getCell(info.row, info.col).value(info.newValue);
+            me.positionButtonChecking(info.row,feeItem);
             if(cleanPosition==true){
                 me.feeItemSheet.getCell(info.row, info.col+1).value("");
                 me.showFeeDetailData(feeItem.libID,feeItem.ID);
             }
         });
     },
+    cleanPositionIfNeed:function (settingVal) {
+         let me = this;
+         let updateData = [];
+         let installation_fee = projectObj.project.installation_fee;
+         if(settingVal == 1){//分项费用选为“每个分部单独计取”时,分项费用类型的记取位置应自动清空。
+              for(let item of me.feeItemData){
+                  if(item.feeType == '分项费用'){
+                      if((item.position&&item.position!='')||(item.billID&&item.billID!='')){
+                          updateData.push(installation_fee.getFeeItemUpdateData(item.libID,item.ID,{position:'', billID:''}));
+                      }
+                      let [dataArray,impacRules] = me.getFeeRuleUpdateDataByFeeItem(item,{code: "",ID:''});
+                      dataArray.length >0? updateData = updateData.concat(dataArray):'';
+                  }
+              }
+         }
+        console.log(updateData);
+         if(updateData.length > 0){
+             installation_fee.updateInstallation(updateData,function () {
+                 me.refreshView();
+             })
+         }
+
+    },
     onRationInstallValueChange:function (e,info) {
         let me = installationFeeObj;
         let installation_fee = projectObj.project.installation_fee
@@ -1303,20 +1352,12 @@ let installationFeeObj={
             });
         })
     },
-    getRationByParentID:function () {
-
-    }
 };
 
 
 $(function () {
     $('#calc_installation_fee').on('shown.bs.modal',function () {
-        if(installationFeeObj.feeItemSpread == null){//初始化显示
-            installationFeeObj.initInstallationFeeSpread();
-        }else {
-            installationFeeObj.showFeeItemData();
-            installationFeeObj.showFeeDetailData();
-        }
+        installationFeeObj.refreshView();
         //radio 值设置
         installationFeeObj.initSettingRadio();
 
@@ -1375,8 +1416,7 @@ $(function () {
     });
     $('#btn_reset_to_default').click(function (){
         let ifModel =  projectObj.project.installation_fee;
-        let c = confirm("确定恢复系统默认值吗?");
-        if(c){
+        hintBox.infoBox('操作确认', '确定恢复系统默认值吗?', 2, function () {
             ifModel.resetToDefault(function () {
                 installationFeeObj.showFeeItemData();
                 installationFeeObj.showFeeDetailData();
@@ -1384,9 +1424,9 @@ $(function () {
             ifModel.updateInstallSetting("0",function () {
                 installationFeeObj.initSettingRadio();
             });
-        }
-      /*  installationFeeObj.showFeeItemData();
-        installationFeeObj.showFeeDetailData();*/
+        }, function () {
+
+        },['确定','取消']);
     });
 
     $("input[name='install_setting_radios']").each(function(){
@@ -1397,6 +1437,7 @@ $(function () {
                 return;
             }
             projectObj.project.installation_fee.updateInstallSetting(settingVal);
+            installationFeeObj.cleanPositionIfNeed(settingVal);
         });
     });
 

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

@@ -228,6 +228,9 @@ let tender_obj={
             let nextIndex = index + 1;
             let tkey = arr[index];
             if(nextIndex < arr.length){
+                if(obj[tkey]==undefined){
+                    obj[tkey] = {};
+                }
                 t_set(obj[tkey],value,arr,nextIndex)
             }else if(nextIndex == arr.length){
                 obj[tkey] = value;
@@ -328,6 +331,7 @@ $(function () {
         tender_obj.tenderSpread.refresh();
         tender_obj.showTenderData();
         tender_obj.initPageContent();
+        projectObj.project.projectGLJ.calcTenderQuantity();
     });
 
     $('#tenderGLJQuantity').bind('click',function () {