Преглед изворни кода

Merge branch 'master' of http://smartcost.f3322.net:3000/SmartCost/ConstructionCost

zhangweicheng пре 7 година
родитељ
комит
a03262ad3c

+ 3 - 1
modules/reports/util/rpt_excel_util.js

@@ -90,7 +90,9 @@ function writeCore() {
     rst.push('<cp:coreProperties xmlns:cp="http://schemas.openxmlformats.org/package/2006/metadata/core-properties" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:dcmitype="http://purl.org/dc/dcmitype/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">');
     rst.push('<dc:creator>SmartCost</dc:creator>');
     rst.push('<cp:lastModifiedBy>SmartCost</cp:lastModifiedBy>');
-    let dt = new Date(), dtStr = dt.getFullYear() + '-' + p_fillZero(dt.getMonth()+1) + '-' + p_fillZero(dt.getDate()) + 'T' +
+    let dt = new Date();
+    dt.setDate(dt.getDate() - 8/24); //it's GMT time, so please add the server offset time ( -8 hours )
+    let dtStr = dt.getFullYear() + '-' + p_fillZero(dt.getMonth()+1) + '-' + p_fillZero(dt.getDate()) + 'T' +
         p_fillZero(dt.getHours()) + ':' + p_fillZero(dt.getMinutes()) + ':' + p_fillZero(dt.getSeconds()) + 'Z';
     rst.push('<dcterms:created xsi:type="dcterms:W3CDTF">' + dtStr + '</dcterms:created>');
     rst.push('<dcterms:modified xsi:type="dcterms:W3CDTF">' + dtStr + '</dcterms:modified>');

+ 2 - 2
public/web/sheet/sheet_common.js

@@ -138,14 +138,14 @@ var sheetCommonObj = {
         }
         for (var row = 0; row < data.length; row++) {
             //var cell = sheet.getCell(row, col, GC.Spread.Sheets.SheetArea.viewport);
-            this.showRowData(sheet,setting,row,data);
+            this.showRowData(sheet,setting,row,data,distTypeTree);
         }
         this.lockCells(sheet,setting);
         sheet.resumeEvent();
         sheet.resumePaint();
         //me.shieldAllCells(sheet);
     },
-    showRowData:function (sheet,setting,row,data) {
+    showRowData:function (sheet,setting,row,data,distTypeTree=null) {
         let ch = GC.Spread.Sheets.SheetArea.viewport;
         for (var col = 0; col < setting.header.length; col++) {
             //var cell = sheet.getCell(row, col, GC.Spread.Sheets.SheetArea.viewport);

+ 6 - 6
web/building_saas/main/js/models/calc_base.js

@@ -577,7 +577,7 @@ let baseFigureTemplate = {
                 let adjPrc = calcBase.project.projectGLJ.getAdjustPrice(glj);
                 //价差
                 let dffPrc = parseFloat(glj.unit_price.market_price - adjPrc).toDecimal(decimalObj.glj.unitPrice);
-                rst = (rst + parseFloat(glj.quantity * dffPrc).toDecimal(2)).toDecimal(2);
+                rst = (rst + parseFloat(glj.subdivisionQuantity * dffPrc).toDecimal(2)).toDecimal(2);
             }
         }
         return rst;
@@ -872,14 +872,14 @@ let baseFigureTemplate = {
     },
     'FBRGGR': function () {//分包人工工日
         let rst = 0;
-        let rationIds = [];//查找定额工料机
+        let rationObjs = [];//查找定额工料机
         let rations = calcBase.project.Ration.datas;
         let rationGljs = calcBase.project.ration_glj.datas;
         for(let ration of rations){
             if(ration.isSubcontract){
                 //定额
                 if(ration.type === rationType.ration){
-                    rationIds.push(ration.ID);
+                    rationObjs.push({ID: ration.ID, quantity: ration.quantity});
                 }
                 //量人 type 2, subType 1
                 else if(ration.type === rationType.volumePrice && ration.subType === volumePriceMaps['量人']){
@@ -891,10 +891,10 @@ let baseFigureTemplate = {
                 }
             }
         }
-        for(let rationID of rationIds){
+        for(let ration of rationObjs){
             for(let glj of rationGljs){
-                if(rationID === glj.rationID){
-                    rst = parseFloat(rst + glj.quantity).toDecimal(decimalObj.glj.quantity);
+                if(ration.ID === glj.rationID && glj.type === gljType.LABOUR){
+                    rst = parseFloat(rst + parseFloat(glj.quantity * ration.quantity).toDecimal(decimalObj.glj.quantity)).toDecimal(decimalObj.glj.quantity);
                 }
             }
         }

+ 74 - 23
web/building_saas/main/js/models/calc_program.js

@@ -203,26 +203,40 @@ let calcTools = {
     rationBaseFee: function (treeNode, gljTypes, priceType){
         if (!treeNode.data.gljList) return 0;
         let me = this, result = 0;
+        let price = 0, temp = 0, temp2 = 0;
         for (let glj of treeNode.data.gljList) {
-            let price = 0, temp = 0;
             if (gljTypes.indexOf(glj.type) >= 0) {
-                if (priceType == priceTypes.ptDiffPrice){
+/*                if (priceType == priceTypes.ptDiffPrice){
                     let aprice = me.uiGLJPrice(glj["adjustPrice"]);
                     let mprice = me.uiGLJPrice(glj["marketPrice"]);
                     temp = (me.uiGLJQty(glj["quantity"]) * mprice).toDecimal(decimalObj.process) - (me.uiGLJQty(glj["quantity"]) * aprice).toDecimal(decimalObj.process);
                     temp = temp.toDecimal(decimalObj.process);
+                }*/
+                if (priceType == priceTypes.ptDiffPrice){
+                    let aprice = me.uiGLJPrice(glj["adjustPrice"]);
+                    let mprice = me.uiGLJPrice(glj["marketPrice"]);
+                    if (aprice != mprice){
+                        temp = (temp + (me.uiGLJQty(glj["quantity"]) * mprice).toDecimal(decimalObj.process)).toDecimal(decimalObj.process);
+                        temp2 = (temp2 + (me.uiGLJQty(glj["quantity"]) * aprice).toDecimal(decimalObj.process)).toDecimal(decimalObj.process);
+                    }
                 }
                 else {
                     if (priceType == priceTypes.ptBasePrice){ price = me.uiGLJPrice(glj["basePrice"]);}
                     else if (priceType == priceTypes.ptAdjustPrice){price = me.uiGLJPrice(glj["adjustPrice"]);}
                     else if (priceType == priceTypes.ptMarketPrice){price = me.uiGLJPrice(glj["marketPrice"]);}
                     temp = (me.uiGLJQty(glj["quantity"]) * price).toDecimal(decimalObj.process);
+                    result = (result + temp).toDecimal(decimalObj.process);
                 };
-                result = (result + temp).toDecimal(decimalObj.process);
             };
         };
 
-        result = result.toDecimal(decimalObj.ration.unitPrice);
+        if (priceType == priceTypes.ptDiffPrice){
+            result = (temp.toDecimal(decimalObj.ration.unitPrice) - temp2.toDecimal(decimalObj.ration.unitPrice)).toDecimal(decimalObj.ration.unitPrice);
+        }
+        else{
+            result = result.toDecimal(decimalObj.ration.unitPrice);
+        };
+
         return result;
     },
     machineLabourFee: function (gljArr) {
@@ -388,47 +402,72 @@ let calcTools = {
 
         let supplyT = [];
         if (baseName.includes('甲供'))
-            supplyT = [supplyType.BFJG, supplyType.WQJG]
+            supplyT = [supplyType.BFJG, supplyType.WQJG]  // 字段中存储的是汉字!
+            // supplyT = ['部分甲供', '完全甲供']
         else if (baseName.includes('甲定'))
             supplyT = [supplyType.JDYG];
+            // supplyT = ['甲定乙供'];
 
-        let gljT = [], compositionArr = [];
+        let gljT = [], compositionTypesArr = [];
         if (baseName == calcBaseNames.JGDEJJRGF || baseName == calcBaseNames.JDDEJJRGF){
             gljT = [gljType.LABOUR];
         }
         else if (baseName == calcBaseNames.JGDEJJCLF || baseName == calcBaseNames.JDDEJJCLF){
             gljT = baseMaterialTypes;
-            compositionArr = compositionTypes;
+            compositionTypesArr = compositionTypes;
         }
         else if (baseName == calcBaseNames.JGDEJJJXF || baseName == calcBaseNames.JDDEJJJXF){
             gljT = baseMachineTypes;
-            compositionArr = [gljType.GENERAL_MACHINE];
+            compositionTypesArr = [gljType.GENERAL_MACHINE];
         }
         else if (baseName == calcBaseNames.JGZCF || baseName == calcBaseNames.JDZCF){
             gljT = [gljType.MAIN_MATERIAL];
-            compositionArr = [gljType.MAIN_MATERIAL];
+            compositionTypesArr = [gljType.MAIN_MATERIAL];
         }
         else if (baseName == calcBaseNames.JGSBF || baseName == calcBaseNames.JDSBF){
             gljT = [gljType.EQUIPMENT];
         };
 
-        let pGLJs = projectGLJ.getGLJsBySupply(supplyT, gljT);
-        if (pGLJs.length == 0) return 0;
+        let supplyProjectGLJs = projectGLJ.getGLJsBySupply(supplyT, gljT);
+        if (supplyProjectGLJs.length == 0) return 0;
 
         let pGLJIdx = {};
-        for (let pglj of pGLJs){pGLJIdx[pglj.GLJID] = pglj};
+        for (let pglj of supplyProjectGLJs){pGLJIdx[pglj.id] = pglj};
 
         let sum = 0;
         for (let glj of treeNode.data.gljList){
-            // 组成物
-            if (compositionArr.includes(glj.type)) {
+            // 组成物的母体。母体如果有组成物,则母体无法作为甲供材料,无法设置,此时要看其组成物是否是甲供材料;母体如果没有组成物,则母体有可能成为甲供材料。
+            if (compositionTypesArr.includes(glj.type)) {
+                if (pGLJIdx[glj.projectGLJID]) {  // 组成物的母体是甲供材料
+                    sum = (sum + glj.basePrice * glj.quantity).toDecimal(decimalObj.process);
+                }
+                else{  // 组成物明细
+                    let pGLJ = projectGLJ.getDataByID(glj.projectGLJID);
+                    let compositions = pGLJ.ratio_data;
+                    if (compositions.length > 0){
+                        function isSupply(composition, supplies) {
+                            for (let supply of supplies){
+                                if(supply.code == composition.code && supply.name == composition.name && supply.unit == composition.unit &&
+                                    supply.specs == composition.specs && supply.type == composition.type ){
+                                    composition.basePrice = supply.unit_price.base_price;
+                                    return true;
+                                }
+                            };
+                            return false;
+                        };
 
+                        for (let composition of compositions){
+                            if (isSupply(composition, supplyProjectGLJs)) {
+                                sum = (sum + composition.basePrice * composition.consumption * glj.quantity).toDecimal(decimalObj.process);
+                            }
+                        };
+                    }
+                }
             }
             else {
-                if (pGLJIdx[glj.GLJID]) {
-
+                if (pGLJIdx[glj.projectGLJID]) {
+                    sum = (sum + glj.basePrice * glj.quantity).toDecimal(decimalObj.process);
                 }
-                sum = sum + glj.basePrice * glj.quantity;
             };
 
         };
@@ -589,24 +628,34 @@ const rationCalcBases = {
         return rst.toDecimal(decimalObj.glj.quantity);
     },
     '甲供定额基价人工费': function (node) {
+        return calcTools.supplyABFee(node, calcBaseNames.JGDEJJRGF);
     },
     '甲供定额基价材料费': function (node) {
+        return calcTools.supplyABFee(node, calcBaseNames.JGDEJJCLF);
     },
     '甲供定额基价机械费': function (node) {
+        return calcTools.supplyABFee(node, calcBaseNames.JGDEJJJXF);
     },
     '甲供主材费': function (node) {
+        return calcTools.supplyABFee(node, calcBaseNames.JGZCF);
     },
     '甲供设备费': function (node) {
+        return calcTools.supplyABFee(node, calcBaseNames.JGSBF);
     },
     '甲定定额基价人工费': function (node) {
+        return calcTools.supplyABFee(node, calcBaseNames.JDDEJJRGF);
     },
     '甲定定额基价材料费': function (node) {
+        return calcTools.supplyABFee(node, calcBaseNames.JDDEJJCLF);
     },
     '甲定定额基价机械费': function (node) {
+        return calcTools.supplyABFee(node, calcBaseNames.JDDEJJJXF);
     },
     '甲定主材费': function (node) {
+        return calcTools.supplyABFee(node, calcBaseNames.JDZCF);
     },
     '甲定设备费': function (node) {
+        return calcTools.supplyABFee(node, calcBaseNames.JDSBF);
     },
     '暂估材料费': function (node) {
         return calcTools.estimateFee(node, true);
@@ -1094,8 +1143,8 @@ class CalcProgram {
                             rttf = parseFloatPlus(node.data.feesIndex[ft.type].tenderTotalFee).toDecimal(decimalObj.bills.totalPrice);
                         };
                         if (me.project.property.billsCalcMode === leafBillGetFeeType.rationContent) {
-                            buf = (buf + (ruf * rq / bq).toDecimal(decimalObj.process)).toDecimal(decimalObj.process);
-                            btuf = (btuf + (rtuf * rq / bq).toDecimal(decimalObj.process)).toDecimal(decimalObj.process);
+                            buf = (buf + (ruf * parseFloatPlus(node.data.contain)).toDecimal(decimalObj.bills.unitPrice)).toDecimal(decimalObj.process);
+                            btuf = (btuf + (rtuf * parseFloatPlus(node.data.contain)).toDecimal(decimalObj.bills.unitPrice)).toDecimal(decimalObj.process);
                         };
                         sum_rtf = (sum_rtf + rtf).toDecimal(decimalObj.process);
                         sum_rttf = (sum_rttf + rttf).toDecimal(decimalObj.process);
@@ -1177,11 +1226,12 @@ class CalcProgram {
             }
 
             let f = treeNode.data.feeRate ? treeNode.data.feeRate : 100;
-            let q = calcTools.uiNodeQty(treeNode) ? calcTools.uiNodeQty(treeNode) : 1;
             let b = treeNode.data.calcBaseValue ? treeNode.data.calcBaseValue : 0;
-            let uf = (b * f * q / 100).toDecimal(decimalObj.bills.unitPrice);
+            let q = calcTools.uiNodeQty(treeNode) ? calcTools.uiNodeQty(treeNode) : 1;
+            let uf = (b * f * 0.01 / q).toDecimal(decimalObj.bills.unitPrice);
             let tuf = uf;
-            let tf = (me.project.property.billsCalcMode === leafBillGetFeeType.rationPrice) ? (b * f / 100).toDecimal(decimalObj.bills.totalPrice) : (uf * q).toDecimal(decimalObj.bills.totalPrice);
+            let tf = (me.project.property.billsCalcMode === leafBillGetFeeType.rationPrice) ? (b * f / 100) : (uf * q);
+            tf = tf.toDecimal(decimalObj.bills.totalPrice);
             let ttf = tf;
             deleteUselessFees(treeNode);
             calcTools.checkFeeField(treeNode, {'fieldName': 'common', 'unitFee': uf, 'totalFee': tf});
@@ -1222,7 +1272,8 @@ class CalcProgram {
             }
             else if (treeNode.calcType == treeNodeCalcType.ctBillCalcProgram) {
                 let rations = me.project.Ration.getBillsSortRation(treeNode.source.getID());
-                treeNode.data.gljList = me.project.ration_glj.getGatherGljArrByRations(rations);
+                let q = calcTools.uiNodeQty(treeNode) ? calcTools.uiNodeQty(treeNode) : 1;
+                treeNode.data.gljList = me.project.ration_glj.getGatherGljArrByRations(rations, q);
 
                 if (treeNode.data.programID == undefined){
                     treeNode.data.programID = projectInfoObj.projectInfo.property.engineering;

+ 8 - 3
web/building_saas/main/js/models/ration_glj.js

@@ -47,7 +47,7 @@ var ration_glj = {
             result = gljOprObj.combineWithProjectGlj(result);
             return result;
         };
-        ration_glj.prototype.getGatherGljArrByRations = function (rations) {
+        ration_glj.prototype.getGatherGljArrByRations = function (rations, billQuantity) {
             let result = [];
             let clone = function (obj) {
                 if (obj === null) return null;
@@ -79,10 +79,15 @@ var ration_glj = {
                     }
                 }
             }
-            ;
 
             result = gljOprObj.combineWithProjectGlj(result);
-            return result;
+
+            // 上面取的是清单下所有工料机的总量,我要算清单单价,所以要取单位清单的工料机数量,所以下面要除以清单数量。
+            let oneBill = Array.from(result);
+            for (let glj of oneBill){
+                  glj.quantity = (glj.quantity / billQuantity).toDecimal(decimalObj.glj.quantity);
+            };
+            return oneBill;
         }
 
         // 提交数据后返回数据处理

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

@@ -94,7 +94,7 @@ let calcBaseView = {
         let fuc = function () {
             sheet.setRowCount(datas.length);
             let style = new GC.Spread.Sheets.Style();
-            style.formatter = MainTreeCol.getNumberFormatter(decimalObj.bills.totalPrice, true);
+            //style.formatter = MainTreeCol.getNumberFormatter(decimalObj.bills.totalPrice, true);
             sheet.setStyle(-1, 1, style);
             for(let col = 0, cLen = cols.length; col < cLen; col++){
                 sheet.getRange(-1, col, -1, 1).hAlign(GC.Spread.Sheets.HorizontalAlign[cols[col]['hAlign']]);

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

@@ -1186,8 +1186,8 @@ var gljOprObj = {
     },
     showLibGLJSheetData: function () {
         this.gljLibSheetData = _.sortBy(this.gljLibSheetData, 'code');
-        this.gljLibSheet.setRowCount(this.gljLibSheetData.length);
         sheetCommonObj.showData(this.gljLibSheet, this.gljLibSheetSetting, this.gljLibSheetData, gljOprObj.distTypeTree);
+        this.gljLibSheet.setRowCount(this.gljLibSheetData.length);
     },
     filterLibGLJSheetData: function () {
         let me = this;

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

@@ -12,6 +12,11 @@ var projectObj = {
             subViewObj.saveComments(node);
         }*/
     },
+    // CSL, 2018-02-09 用于测试显示。使用示例:projectObj.testDisplay(‘总额’, 100);
+    testDisplay: function (caption, value) {
+        let s = `&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[ ${caption}: ${value} ]`;
+        $('#testDisplay').html(s);
+    },
     treeSelectedChanged: function (node) {
         let project = projectObj.project;
         subViewObj.loadComments(node);
@@ -31,21 +36,21 @@ var projectObj = {
         }
 
         // for test interface.  CSLAAAAA
-/*        node.data.gljList = project.ration_glj.getGljArrByRation(node.data.ID);
-        node.data.isSubcontract = true;
-        let bname = '分包人工工日';
-        alert(bname + ': ' + rationCalcBases[bname](node));*/
+        // projectObj.testDisplay('前四项累计值排除当前选中项' + projectObj.project.calcProgram.getBeforeTaxTotalFee([node]));
 
-/*        let value = projectObj.project.calcProgram.getBeforeTaxTotalFee([node]);
-        alert('前四项累计值排除当前选中项:' + value);*/
+        // 公式结果
+        /*        let t = projectObj.project.calcProgram.compiledTemplates[node.data.programID];
+                let c = t.calcItems[7];
+                c.dispExpr = '[定额基价人工费] + [定额基价材料费]  + F6 + [主材费]';
+                let rst = analyzer.analyzeUserExpr(t, c);
+                projectObj.testDisplay('结果', rst);*/
 
-/*        let t = projectObj.project.calcProgram.compiledTemplates[node.data.programID];
-        let c = t.calcItems[7];
-        c.dispExpr = '[定额基价人工费] + [定额基价材料费]  + F6 + [主材费]';
-        let rst = analyzer.analyzeUserExpr(t, c);
-        alert(`${rst}: ` + JSON.stringify(c));*/
+        // 基数
+/*        node.data.isSubcontract = true;
+        node.data.gljList = project.ration_glj.getGljArrByRation(node.data.ID);
+        let bname = '甲供定额基价材料费';
+        projectObj.testDisplay(bname, rationCalcBases[bname](node));*/
 
-        // console.log(projectObj.project.projectGLJ.getGLJsBySupply([7]));
     },
     refreshBaseActn: function (tree) {
         let setButtonValid = function (valid, btn) {

+ 1 - 0
web/common/html/header.html

@@ -33,6 +33,7 @@
         <!--<span class="text-truncate"><a href="/pm">项目管理</a></span>-->
         <% } %>
     </div>
+    <div id="testDisplay" style="color:#ff7e0e;">&nbsp;&nbsp;</div>
     <div class="ml-auto navbar-text p-0">
         <div class="dropdown d-inline-block navbar-nav">
             <button class="btn btn-link btn-sm dropdown-toggle" type="button" data-toggle="dropdown"><%= sessionUser.real_name === '' ? sessionUser.email : sessionUser.real_name %></button>