Browse Source

分摊功能bugs

zhangweicheng 5 years ago
parent
commit
a0c8a9288c

+ 19 - 15
web/building_saas/main/html/divide.html

@@ -18,11 +18,14 @@
   <div class="row" id="divideRow">
       <div class="main-content col p-0 " id="divide_main" style="overflow: hidden">
        <div class="top-content row"  id="divide_top" style="overflow: hidden;margin-left: 0px;margin-right: 0px;">
-          <div class="main-data-top left col-7" style="padding: 0px;" id="divide_main_sheet"></div>
-          <div class="main-data-top left col-5" style="padding: 0px;" id="divide_bills_sheet"></div>
+          <div class="main-data-top ovf-hidden left " id="divide_main_sheet" style="padding: 0px;width: 59%;" > </div>
+          <div class="main-data-top left  full-h" id="divide_bills_div"  style="padding: 0px;width: 41% " >
+            <div class="resize-x ovf-hidden left full-h" id="divideMiddleResize" style="width: 5px;"></div>
+            <div class="ovf-hidden left full-h" id="divide_bills_sheet"></div>
+          </div>
        </div>
-       <div class="resize-y" id="divideResize"></div>
           <div class="bottom-content" id="divideBottom">
+            <div class="resize-y" id="divideResize"></div>
               <ul class="nav nav-tabs d-flex" role="tablist">
                   <li class="nav-item">
                       <a class="nav-link active show" id="divide_glj_nav" data-toggle="tab" href="#divide_subItems" role="tab" aria-selected="true">工料机</a>
@@ -35,20 +38,20 @@
               <div class="tab-content"> 
                   <div class="tab-pane active" id="divide_subItems" role="tabpanel">
                       <div class="main-data-bottom" id="divide_subSpread" style="overflow:hidden;float: left;width: 100%;"></div>
-                      <div class="main-data-bottom ovf-hidden col-auto p-0" id="divide_itemTextDiv" style="display: none">
-                        <div class="resize-x main-data-bottom ovf-hidden" id="divide_rgResize" style="display: none"></div>
-                        <div class="item_spread main-data-bottom ovf-hidden " id="divide_gljSubDiv" style="width: 99%;">
-                            <div class="tab-content">
-                                <div class="tab-pane" id="divide_rnc-zm">
-                                    <div class="main-data-bottom ovf-hidden" id = "divide_coeSpread">
+                      <div class="main-data-bottom ovf-hidden  col-auto p-0" id="divide_itemTextDiv" style="display: none">
+                        <div class="resize-x  ovf-hidden full-h" id="divide_rgResize" style="display: none"></div>
+                        <div class="item_spread  ovf-hidden " id="divide_gljSubDiv" style="width: 99%;">
+                            <div class="tab-content full-h">
+                                <div class="tab-pane full-h" id="divide_rnc-zm">
+                                    <div class=" ovf-hidden full-h" id = "divide_coeSpread">
                                     </div>
                                 </div>
-                                <div class="tab-pane" id="divide_rnc-cus">
-                                    <div class="main-data-bottom ovf-hidden" id = "divide_cusSpread">
+                                <div class="tab-pane full-h" id="divide_rnc-cus">
+                                    <div class=" ovf-hidden full-h" id = "divide_cusSpread">
                                     </div>
                                 </div>
-                                <div class="tab-pane" id="divide_rnc-stable">
-                                    <div class="main-data-bottom ovf-hidden" id="divide_stableSpread"></div>
+                                <div class="tab-pane full-h" id="divide_rnc-stable">
+                                    <div class=" ovf-hidden full-h" id="divide_stableSpread"></div>
                                 </div>
                             </div>
                         </div>
@@ -79,8 +82,9 @@
           </div>
       </div>
       <div class="divide_side" style="display: inline-block" id="divide_side">
-        <div class="resize-x" id="divideSideResize"></div>
+      
         <div class="tab-content" style="width: 99%; height: 100%; float: left">
+          <div class="resize-x" id="divideSideResize"></div>
           <!--定额库-->
           <div class="tab-pane" id="divide_de">
             <div class="tools-bar-height-d container-fluid" id="divide_deToolsBar">
@@ -131,7 +135,7 @@
               </button>
           </div>
           <div class="modal-body">
-            <label>混凝土拌合站建设费分摊到:</label>
+            <label id="exec_divide_label">混凝土拌合站建设费<br>分摊到:</label>
               <div class="row" style="height:400px;border-top: 1px solid #ccc;"><!--sjs id设置在这个div-->
                   <div style="overflow: hidden; width: 100%;" id="billSelectedSheet" > </div>
               </div>

+ 8 - 0
web/building_saas/main/js/models/bills.js

@@ -610,6 +610,14 @@ var Bills = {
                 return false;
             }
         };
+        bills.prototype.isBelongOneToSeven = function (node) {//判读是否属于措施项目部分
+          let rootNode = this.getRootNode(node);
+          if(isFlag(rootNode.data)&&rootNode.data.flagsIndex.fixed.flag==fixedFlag.ONE_SEVEN_BILLS){
+              return true;
+          }else {
+              return false;
+          }
+        };
         bills.prototype.hasFlags = function (node) {
             return isFlag(node.data);
         };

+ 139 - 45
web/building_saas/main/js/views/divide_view.js

@@ -4,7 +4,7 @@ let divideObj = {
       {headerName: "类别", headerWidth: 60, dataCode: "itemType", hAlign:'center', dataType: "String"},
       {headerName: "清单编号", headerWidth: 130, dataCode: "code", hAlign:'left', dataType: "String", formatter: "@"},
       {headerName: "名称", headerWidth: 250, dataCode: "name", dataType: "String",formatter: "@"},
-      {headerName: "单位", headerWidth: 50, dataCode: "unit", dataType: "String",cellType:'comboBox',editable:true,options:['m', 'm2', 'm3', 'km', 't', 'kg', '台班', '工日', '昼夜', '元', '项', '处', '个', '件',
+      {headerName: "单位", headerWidth: 50, dataCode: "unit", hAlign:'center',dataType: "String",cellType:'comboBox',editable:true,options:['m', 'm2', 'm3', 'km', 't', 'kg', '台班', '工日', '昼夜', '元', '项', '处', '个', '件',
       '根', '组', '系统', '台', '套', '株', '丛', '缸', '支', '只', '块', '座', '对', '份', '樘', '攒', '榀']},
       {headerName: "工程量", headerWidth: 80, dataCode: "quantity", dataType: "Number",validator:"number",getText:"notZero"},
       {headerName: "单价", headerWidth: 80, dataCode: "marketPrice", dataType: "Number",validator:"number",getText:"notZero"},
@@ -14,6 +14,7 @@ let divideObj = {
     ],
     view:{ 
       lockColumns: [0],
+      rowHeaderWidth:25,
       colHeaderHeight:30
     },
     getText:{
@@ -54,7 +55,7 @@ let divideObj = {
   billsSetting:{
     header: [
       {headerName: "编号", headerWidth: 100, dataCode: "code", hAlign:'left', dataType: "String"},
-      {headerName: "名称", headerWidth: 250, dataCode: "name", dataType: "String"},
+      {headerName: "名称", headerWidth: 230, dataCode: "name", dataType: "String"},
       {headerName: "分摊比例", headerWidth: 70, dataCode: "divideRate", dataType: "Number",validator:"number"},
       {headerName: "分摊金额", headerWidth: 80, dataCode: "dividePrice", dataType: "Number",validator:"number"},
       {headerName: "原始金额", headerWidth: 80, dataCode: "originalPrice", dataType: "Number",validator:"number"},
@@ -63,6 +64,7 @@ let divideObj = {
     ],
     view:{ 
       lockColumns: [0,1,2,3,4,5,6],
+      rowHeaderWidth:25,
       colHeaderHeight:30
     }
   },
@@ -162,6 +164,9 @@ let divideObj = {
         if (commonFee){
           item.marketPrice = commonFee.unitFee;
           item.marketTotalFee = commonFee.totalFee;
+        }else{
+          delete item.marketPrice; 
+          delete item.marketTotalFee;
         }
           
       }
@@ -197,7 +202,8 @@ let divideObj = {
     }
     for(let b of this.selectedBillsDatas){
       if(b.selected == 1 && !parentMap[b.ID]){
-        let e = {ID:b.ID,code:b.code,name:b.name,divideRate:0,totalFee:b.totalFee};
+        let newCode = this.getExeBillCode(b.ID);
+        let e = {ID:b.ID,code:newCode,name:b.name,divideRate:0,totalFee:b.totalFee};
         if(b.totalFee != "") total = scMathUtil.roundForObj(total + parseFloat(b.totalFee),getDecimal("process"))
         if(divideType == 1 && billsRationGLJMap[b.ID]){
           let btotal = 0;
@@ -242,8 +248,38 @@ let divideObj = {
     this.execBillsSheet.setRowCount(this.execBillsDatas.length);
   },
 
-  
+  getExeBillCode:function(ID){
+    let bNode = projectObj.project.mainTree.findNode(ID);
+    if(!bNode) return "";
+    let nodes= [];
+    getNodes(bNode);
+    let newCode = "";
+    for(let n of nodes){
+      if(n.data.code && n.data.code !=""){
+        if(newCode == ""){
+          newCode = n.data.code;
+        }else{
+          let exp = new RegExp("^"+newCode);
+          if(exp.test(n.data.code)){
+            newCode = n.data.code
+          }else{
+            let mid = "-"
+            if(newCode.substr(-1,1) == "-" ||n.data.code.substr(0,1)=="-")mid="";
+            newCode = newCode+mid+n.data.code
+          }
+        }  
+      }
+    }
+    return newCode;
 
+
+    function getNodes (node){
+      nodes.unshift(node);
+      if(node.parent) getNodes(node.parent);
+    }
+
+
+  },
   showSelectedBillsDatas:function(datas){
     if(!datas)this.selectedBillsDatas = getSelectedBillsDatas();
     this.billsSelectedSheet.setRowCount(this.selectedBillsDatas.length);
@@ -279,7 +315,8 @@ let divideObj = {
         if(d.calcBase&&d.calcBase!="") t.unDivide = 1;
         //数量*单价的(判断金额列是否有值),不可选择
         if(d.calcFlag == treeNodeCalcFlag.customUnitPrice && t.totalFee !="") t.unDivide = 1;
-
+        //不属于100-700章的,不可选择
+        if(!projectObj.project.Bills.isBelongOneToSeven(node)) t.unDivide = 1;
         datas.push(t);
         if(!node.children) return;
         for(let c of node.children){
@@ -500,10 +537,46 @@ let divideObj = {
     let me = this;
     let data = me.rationGLJDatas[row],setting = gljCol.ration_glj_setting;
     let dataCode = setting.header[col].dataCode;
-    if(data.isMixRatio == true && (dataCode=="customQuantity"||dataCode=="basePrice")) return false;
+    if(dataCode=="basePrice") return false;
+    if(data.isMixRatio == true && dataCode=="customQuantity") return false;
+    for(let r of me.rationGLJDatas){
+      if(r.ParentID == data.ID) return false;
+    }  
     return true;
   },
 
+  calcExecBillsData:function(){
+    let item = divideObj.getSelectedItem();
+    for(let b of this.execBillsDatas){
+      let bNode = projectObj.project.mainTree.findNode(b.ID);
+      if (!bNode) continue;
+      if(!b.divideRate) continue;
+      b.dividePrice =0;
+      b.originalPrice=0;
+      b.totalPrice =0;
+      b.price=0;
+      b.divideRate = scMathUtil.roundForObj(b.divideRate * 0.01,3);
+      b.dividePrice = scMathUtil.roundForObj(item.marketTotalFee * b.divideRate,getDecimal("bills.totalPrice"));  
+      b.originalPrice = calcOriginalPrice(bNode);   
+      b.totalPrice = scMathUtil.roundForObj(b.dividePrice + b.originalPrice,getDecimal("bills.totalPrice"));
+    }
+
+    function calcOriginalPrice(node){//计算原始金额,清单下的除分摊下的所有定额的值汇总
+      let sum = 0; 
+      if(node.children){
+        for(let c of node.children){
+          if(c.data.divideID && c.data.divideID!="") continue;
+          if(c.data.feesIndex && c.data.feesIndex.common){
+            let totalFee =  scMathUtil.roundForObj(c.data.feesIndex.common.totalFee,getDecimal("bills.totalPrice"))
+            sum = scMathUtil.roundForObj(sum + totalFee,getDecimal("process")); 
+          } 
+        }
+      }
+      return scMathUtil.roundForObj(sum,getDecimal("bills.totalPrice")); 
+    }
+
+  },
+
   showBillsDatas:function(){
     if(!$('#divide_bills_sheet').is(':visible')) return;
     this.billsDatas = getBillsDatas();
@@ -515,29 +588,7 @@ let divideObj = {
       let item = divideObj.getSelectedItem();
       if(item.bills){
         for(let b of item.bills){
-          let bNode = projectObj.project.mainTree.findNode(b.ID);
-          if (!bNode) continue;
-          let t = {
-            ID:b.ID,
-            divideRate:b.divideRate,
-            name:bNode.data.name,
-            code:bNode.data.code,
-            dividePrice:0,
-            originalPrice:0,
-            totalPrice:0,
-            price:0
-          }
-          if(bNode.data.feesIndex.common.totalFee){
-            let totalFee = scMathUtil.roundForObj(bNode.data.feesIndex.common.totalFee,getDecimal("bills.totalPrice"));
-            t.price = totalFee;
-            t.divideRate = scMathUtil.roundForObj(t.divideRate * 0.01,3);
-            t.dividePrice = scMathUtil.roundForObj(item.marketTotalFee * t.divideRate,getDecimal("bills.totalPrice"));
-          }
-          if(bNode.data.feesIndex.rationCommon && bNode.data.feesIndex.rationCommon.totalFee){
-            t.originalPrice = scMathUtil.roundForObj(bNode.data.feesIndex.rationCommon.totalFee,getDecimal("bills.totalPrice"));
-          }
-          t.totalPrice = scMathUtil.roundForObj(t.dividePrice + t.originalPrice,getDecimal("bills.totalPrice"));
-          datas.push(t);
+          datas.push(b);
         }
       }
       return datas;
@@ -589,12 +640,11 @@ let divideObj = {
       } 
       if(c.ID == bills.ID) item = c;
     }
-    item.fees=[];
-    item.feesIndex={};
-    if(subNodes.length > 0) projectObj.project.calcProgram.innerCalcBill({data:item, sourceType:"bills", updateData:[],children:subNodes},3);
-    if(subNodes.length == 0){
+    this.initFeeIndexs(item);
+    if(subNodes.length > 0||deleteMap){
+      projectObj.project.calcProgram.innerCalcBill({data:item, sourceType:"bills", updateData:[],children:subNodes},3);
+    }else if(subNodes.length == 0){
       item.calcFlag = 2;
-      this.initFeeIndexs(item);
       projectObj.project.calcProgram.innerCalcBillCustom({data:item, sourceType:"bills", updateData:[],children:[]},3);
     } 
     return item;
@@ -925,6 +975,7 @@ let divideObj = {
     let checkboxValue = args.sheet.getCell(args.row, args.col).value();
     let newval = checkboxValue? 0:1;
     let data = divideObj.selectedBillsDatas[args.row];
+    if(data.unDivide == 1) return;
     let parentMap = {};
     parentMap[data.ID]=true;
     data.selected=newval;
@@ -1179,11 +1230,11 @@ let divideObj = {
     let divideResizeEles = {};
     divideResizeEles.eleObj = {
         module: 'divide',
-        resize: $('#divide_rgResize'),
+        resize: $('#divideResize'),
         top: $('#divide_top'),
         topSpread: $('#divide_main_sheet'),
-        bottom: $('#divideBottom').children().find('.main-data-bottom'),
-        bottomSpread: [$('#divide_subSpread')]
+        bottom: $('#divideBottom'),
+        bottomSpread: [$('#divide_subSpread'),$('#divide_itemTextDiv'),$('#divide_gljSubDiv'),$('#divide_gljItemTab')]
     };
 
     divideResizeEles.limit = {
@@ -1196,15 +1247,15 @@ let divideObj = {
     };
     return divideResizeEles;
   },
-  calcDivideNodes : async function(item){
+  calcDivideNodes : async function(item,bills,callback){
     if(!item.marketTotalFee) return;
     let changeNode=[];
     let datas = [];
     let usedIDMap={};
-    for(let b of item.bills){
+    for(let b of bills){
       let bNode = projectObj.project.mainTree.findNode(b.ID);
       if(!bNode) continue;
-      let divideRate = scMathUtil.roundForObj(b.divideRate * 0.01,3);
+      let divideRate = scMathUtil.roundForObj(b.divideRate,3);
       let marketUnitFee = item.marketPrice?scMathUtil.roundForObj(item.marketPrice,getDecimal("bills.unitPrice")):0;
       let quantity = item.quantity?scMathUtil.roundForObj(item.quantity,3):0;
       quantity = scMathUtil.roundForObj(quantity*divideRate,getDecimal("ration.quantity"))//量价数量为分摊项的数量*分摊比例
@@ -1259,7 +1310,18 @@ let divideObj = {
     let nodes = await projectObj.project.syncUpdateNodesAndRefresh(datas);
     //重新计算
     cbTools.refreshFormulaNodes();
-    projectObj.project.calcProgram.calcNodesAndSave(changeNode.concat(nodes));
+    projectObj.project.calcProgram.calcNodesAndSave(changeNode.concat(nodes),function(){
+      //反算分摊右边表中的金额
+      for(let b of bills){
+        let bNode = projectObj.project.mainTree.findNode(b.ID);
+        if(bNode.data.feesIndex&&bNode.data.feesIndex.common){
+          let totalFee = scMathUtil.roundForObj(bNode.data.feesIndex.common.totalFee,getDecimal("bills.totalPrice"));
+          b.price = totalFee;
+        }
+        callback();
+      }
+      
+    });
   },
   cancelDivide:async function(divideID){//如果不传ID,相当于取消所有
      let changeNode=[],datas=[],itemDatas=[];
@@ -1291,6 +1353,7 @@ let divideObj = {
 }
 
 
+
 function loadDivideHeight(){
   if(!$('#divide_main').is(':visible')) return;
   let me = divideObj;
@@ -1299,15 +1362,22 @@ function loadDivideHeight(){
       me.refreshViews();
       zmhs_obj.refresh();
   });
+  
+  SlideResize.verticalSlide(divideResizeEles.eleObj, divideResizeEles.limit, function(){
+    me.refreshViews();
+    zmhs_obj.refresh();
+  });
   if($('#divide_de').is(':visible')) showDivideSide($($("#divide_stdRationTab").attr('relaPanel')), true, $("#divide_stdRationTab").attr('id'));
 }
 
 $('#tab_divide').on('shown.bs.tab', function (e) {
   sessionStorage.setItem('mainTab', '#tab_divide');
+  $('#divide_bills_sheet').width($('#divide_bills_div').width()-$('#divideMiddleResize').width());
   loadDivideHeight();
   divideObj.initSpread();
   divideObj.showDatas();
   divideObj.initNavItem();
+
 })
 
 $('.divide-nav-link').bind('click', function () {//$('.side-tabs ul li a').bind   2018-11-23  使用更多标签,所以不能这样绑定事件了
@@ -1373,6 +1443,26 @@ SlideResize.horizontalSlide(dSideResizeEles.eleObj, dSideResizeEles.limit, funct
   divideObj.refreshViews();  
 });
 
+//分摊左和右表水平拖动
+let divideLeftAndRight={
+  eleObj:{
+    module: 'divideLeftRight',
+    resize: $('#divideMiddleResize'),
+    parent: $('#divide_top'),
+    left: $('#divide_main_sheet'),
+    right: $('#divide_bills_div')
+  },
+  limit:{
+    min: 150,
+    max: `$('#divide_top').width()-150`
+  }
+}
+SlideResize.horizontalSlide(divideLeftAndRight.eleObj, divideLeftAndRight.limit, function(){
+  if(divideObj.divideSpread) divideObj.divideSpread.refresh();
+  if(divideObj.billsSpread) divideObj.billsSpread.refresh();
+});
+
+
 function showDivideSide(tabPanel, show, id){
   let divideSideResizeEles = getDivideSideResizeEles();
   divideSideResizeEles.eleObj.module = id;
@@ -1458,7 +1548,8 @@ $('#exec_divide_btn').bind('click',function (){
    if(projectReadOnly) return;
    let selected = divideObj.getSelectedItem();
    if(selected.itemType !="分摊项") return;
-  $("#exec_divide_div").modal('show');
+   $("#exec_divide_label").html(`${selected.name}<br>分摊到:`)
+   $("#exec_divide_div").modal('show');
 });
 
 $('#cancel_divide_btn').bind('click',function (){
@@ -1492,9 +1583,12 @@ $('#exec_divide_div').on('shown.bs.modal',function () {
 $("#divide_confirm").bind('click',async function (){
   let divideType = parseInt($("input[name='divide_type']:checked").val());
   let item = divideObj.getSelectedItem();
-  let updateData = {ID:item.ID,type:'update',doc:{bills:divideObj.execBillsDatas,divideType:divideType}}
-  await divideObj.updateItem([updateData]);
-  await divideObj.calcDivideNodes(item);
+  divideObj.calcExecBillsData();
+  await divideObj.calcDivideNodes(item,divideObj.execBillsDatas,async function(){
+    let updateData = {ID:item.ID,type:'update',doc:{bills:divideObj.execBillsDatas,divideType:divideType}}
+    await divideObj.updateItem([updateData]);
+    divideObj.showDatas();
+  });
 });