瀏覽代碼

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

Conflicts:
	web/building_saas/main/js/views/project_view.js
zhangweicheng 7 年之前
父節點
當前提交
932357814a

+ 16 - 1
modules/main/models/bills.js

@@ -12,6 +12,7 @@ let consts = require('./project_consts');
 let projectConsts = consts.projectConst;
 let commonConsts = consts.commonConst;
 let quantity_detial = require('../facade/quantity_detail_facade');
+let projectModel = require('../../pm/models/project_schema');
 
 
 let billsSchema = new Schema({
@@ -91,7 +92,21 @@ class billsModel extends baseModel {
             return function (cb) {
                 switch (doc.updateType) {
                     case commonConsts.UT_UPDATE:
-                        bills.update({projectID: doc.updateData.projectID, ID: doc.updateData.ID,deleteInfo: null}, doc.updateData, cb);
+                        async.parallel([      // CSL,2018.01.10 如果是总造价清单,要将4个汇总金额写到projects表中
+                            function (asyncCB) {
+                                bills.update({projectID: doc.updateData.projectID, ID: doc.updateData.ID,deleteInfo: null}, doc.updateData, asyncCB);
+                            },
+                            function (asyncCB) {
+                                if (doc.updateData.summaryFees){
+                                    // console.log('%%%%%%%%%%%%%%%%%%%  ' + doc.updateData.projectID + ' | ' + JSON.stringify(doc.updateData.summaryFees));
+                                    projectModel.update({ID: doc.updateData.projectID}, {"summaryFees": doc.updateData.summaryFees}, asyncCB);
+                                }else {
+                                    asyncCB(null, {});
+                                };
+                            }
+                        ], function(err,result){
+                            cb(err, {});
+                        });
                         break;
                     case commonConsts.UT_CREATE:
                         bills.create(doc.updateData, cb);

+ 7 - 0
modules/pm/models/project_schema.js

@@ -7,6 +7,7 @@ let Schema = mongoose.Schema;
 let deleteSchema = require('../../../public/models/delete_schema');
 
 let collectionName = 'projects';
+
 let ProjectSchema = new Schema({
     "ID": Number,
     "ParentID": Number,
@@ -22,6 +23,12 @@ let ProjectSchema = new Schema({
     "property": {
         type: Schema.Types.Mixed,
         default: {}
+    },
+    "summaryFees":{
+        totalFee: String,
+        estimateFee: String,
+        safetyFee: String,
+        chargeFee: String
     }
 });
 

+ 3 - 0
public/web/tree_sheet/tree_sheet_controller.js

@@ -39,6 +39,7 @@ var TREE_SHEET_CONTROLLER = {
                         that.setTreeSelected(newNode);
                         that.sheet.setSelection(newNode.serialNo(), sels[0].col, 1, 1);
                         that.sheet.showRow(newNode.serialNo(), GC.Spread.Sheets.VerticalPosition.center);
+                        cbTools.refreshFormulaNodes();
                     });
                 }
             }
@@ -51,6 +52,7 @@ var TREE_SHEET_CONTROLLER = {
                         that.sheet.deleteRows(sels[0].row, that.tree.selected.posterityCount() + 1);
                         that.setTreeSelected(that.tree.items[sels[0].row]);
                     });
+                    cbTools.refreshFormulaNodes();
                 }
             }
         };
@@ -75,6 +77,7 @@ var TREE_SHEET_CONTROLLER = {
                         that.sheet.deleteRows(row,1);
                         next?that.setTreeSelected(that.tree.items[row]):"";
                     });
+                    cbTools.refreshFormulaNodes();
                 }
             }
 

+ 6 - 5
public/web/tree_sheet/tree_sheet_helper.js

@@ -161,6 +161,7 @@ var TREE_SHEET_HELPER = {
     },
     showTreeData: function (setting, sheet, tree) {
         let indent = 20;
+        let levelIndent = -5;
         let halfBoxLength = 5;
         let halfExpandLength = 3;
 
@@ -229,7 +230,7 @@ var TREE_SHEET_HELPER = {
             let showTreeLine = true;
             if (!node) { return; }
 
-            let centerX = Math.floor(x) + node.depth() * indent + indent / 2;
+            let centerX = Math.floor(x) + node.depth() * indent + node.depth() * levelIndent + indent / 2;
             let x1 = centerX + indent / 2;
             let centerY = Math.floor((y + (y + h)) / 2);
             let y1;
@@ -255,7 +256,7 @@ var TREE_SHEET_HELPER = {
             }
             // Draw Parent Line
             if (showTreeLine) {
-                var parent = node.parent, parentCenterX = centerX - indent;
+                var parent = node.parent, parentCenterX = centerX - indent - levelIndent;
                 while (parent) {
                     if (!parent.isLast()) {
                         if (parentCenterX < x + w) {
@@ -263,11 +264,11 @@ var TREE_SHEET_HELPER = {
                         }
                     }
                     parent = parent.parent;
-                    parentCenterX -= indent;
+                    parentCenterX -= (indent + levelIndent);
                 }
             };
             // Draw Text
-            x = x + (node.depth() + 1) * indent;
+            x = x + (node.depth() + 1) * indent +  node.depth() * levelIndent;
             GC.Spread.Sheets.CellTypes.Text.prototype.paint.apply(this, arguments);
         };
         TreeNodeCellType.prototype.getHitInfo = function (x, y, cellStyle, cellRect, context) {
@@ -286,7 +287,7 @@ var TREE_SHEET_HELPER = {
             let node = tree.items[hitinfo.row];
             tree.selected = node;
             if (!node || node.children.length === 0) { return; }
-            let centerX = hitinfo.cellRect.x + offset + node.depth() * indent + indent / 2;
+            let centerX = hitinfo.cellRect.x + offset + node.depth() * indent + node.depth() * levelIndent + indent / 2;
             let centerY = (hitinfo.cellRect.y + offset + (hitinfo.cellRect.y + offset + hitinfo.cellRect.height)) / 2;
 
             if (hitinfo.x > centerX - halfBoxLength && hitinfo.x < centerX + halfBoxLength && hitinfo.y > centerY - halfBoxLength && hitinfo.y < centerY + halfBoxLength) {

+ 2 - 0
web/building_saas/main/js/controllers/project_controller.js

@@ -12,6 +12,7 @@ ProjectController = {
             sc.setTreeSelected(newNode);
             sc.sheet.setSelection(newNode.serialNo(), sels[0].col, 1, 1);
             sc.sheet.showRow(newNode.serialNo(), GC.Spread.Sheets.VerticalPosition.center);
+            cbTools.refreshFormulaNodes();
         });
     },
     syncDisplayNewRationGljNode:function (sc,newNode) {
@@ -19,6 +20,7 @@ ProjectController = {
             sc.sheet.addRows(newNode.serialNo(), 1);
             TREE_SHEET_HELPER.refreshTreeNodeData(sc.setting, sc.sheet, [newNode], false);
             sc.sheet.showRow(newNode.serialNo(), GC.Spread.Sheets.VerticalPosition.center);
+            cbTools.refreshFormulaNodes();
         });
     },
     addBills: function (project, sheetController, std) {

+ 7 - 3
web/building_saas/main/js/models/calc_base.js

@@ -25,7 +25,7 @@ let cbTools = {
     findBill: function (fixedFlag) {
         let bills = projectObj.project.Bills.datas;
         for(let i = 0, len = bills.length; i < len; i++){
-            if(bills[i].flagsIndex.flag === fixedFlag){
+            if(bills[i].flagsIndex && bills[i].flagsIndex.fixed && bills[i].flagsIndex.fixed.flag && bills[i].flagsIndex.fixed.flag === fixedFlag){
                 return bills[i];
             }
         }
@@ -303,8 +303,12 @@ let cbTools = {
     },
     // 刷新全部行引用的公式清单。 CSL, 2018-01-05
     refreshFormulaNodes: function () {
-        let nodes = this.getFormulaNodes();
-        if (nodes.length > 0) projectObj.mainController.refreshTreeNode(nodes);
+        try {
+            let nodes = this.getFormulaNodes();
+            if (nodes.length > 0) projectObj.mainController.refreshTreeNode(nodes);
+        } catch (err) {
+            alert('公式引用行号显示刷新失败:' + err.message);
+        }
     },
     // 判断结点是否被其它结点的表达式引用。
     isUsedByFormula: function(node){

+ 38 - 7
web/building_saas/main/js/models/calc_program.js

@@ -433,6 +433,10 @@ let treeNodeTools = {
     isNullBill: function (treeNode) {
         return this.isLeafBill(treeNode) && (treeNode.children.length === 0) && (!treeNode.data.calcBase);
     },
+    isEngineeringCostBill: function (treeNode) {
+        return treeNode.data.flagsIndex && treeNode.data.flagsIndex.fixed && treeNode.data.flagsIndex.fixed.flag &&
+            treeNode.data.flagsIndex.fixed.flag == fixedFlag.ENGINEERINGCOST;
+    },
 
     isRationCategory: function(treeNode){
         return treeNode.sourceType === ModuleNames.ration;
@@ -465,7 +469,17 @@ let treeNodeTools = {
         };
         treeNode.changed = true;
     },
-
+    initSummaryFee(treeNode){
+        if (!treeNode.data.summaryFees){
+            treeNode.data.summaryFees = {
+                totalFee: 0,
+                estimateFee: 0,
+                safetyFee: 0,
+                chargeFee: 0
+            };
+            treeNode.changed = true;
+        };
+    },
     getCalcType(treeNode) {
         if (this.isRationCategory(treeNode)){
             return treeNodeCalcType.ctRationCalcProgram;
@@ -721,6 +735,7 @@ class CalcProgram {
                     contain:node.data.contain,
                     quantityEXP:node.data.quantityEXP
                 };
+                if (node.data.summaryFees) data.summaryFees = node.data.summaryFees;
                 if(node.sourceType==ModuleNames.ration && node.data.type==rationType.gljRation){//定额类型的工料机做特殊处理
                     data.code=node.data.code;
                     data.projectGLJID = node.data.projectGLJID;
@@ -900,6 +915,25 @@ class CalcProgram {
             let tf = (me.project.property.billsCalcMode === leafBillGetFeeType.rationPrice) ? (b * f / 100).toDecimal(decimalObj.bills.totalPrice) : (uf * q).toDecimal(decimalObj.bills.totalPrice);
             let ttf = tf;
 
+            function newCommonFee(){
+                treeNodeTools.initFeeField(treeNode, 'common');
+                treeNode.data.feesIndex.common.unitFee = uf;
+                treeNode.data.feesIndex.common.totalFee = tf;
+                treeNode.data.feesIndex.common.tenderUnitFee = tuf;
+                treeNode.data.feesIndex.common.tenderTotalFee = ttf;
+                treeNode.changed = true;
+                // 如果是总造价清单,还要做单项工程、建设项目金额汇总
+                if (treeNodeTools.isEngineeringCostBill(treeNode)){
+                    treeNodeTools.initSummaryFee(treeNode);
+                    treeNode.data.summaryFees.totalFee = tf;
+                    treeNode.data.summaryFees.estimateFee = 0;//treeNode.data.feesIndex.zangu.totalFee;
+                    let bill_safe = cbTools.findBill(fixedFlag.SAFETY_CONSTRUCTION);
+                    treeNode.data.summaryFees.safetyFee = (bill_safe && bill_safe.feesIndex && bill_safe.feesIndex.common)?bill_safe.feesIndex.common.totalFee:0;
+                    let bill_charge = cbTools.findBill(fixedFlag.CHARGE);
+                    treeNode.data.summaryFees.chargeFee = (bill_charge && bill_charge.feesIndex && bill_charge.feesIndex.common)?bill_charge.feesIndex.common.totalFee:0;
+                }
+            };
+
             if (treeNode.data.feesIndex && treeNode.data.feesIndex.common){
                 if (treeNode.data.feesIndex.common.unitFee != uf ||
                     treeNode.data.feesIndex.common.totalFee != tf ||
@@ -907,13 +941,10 @@ class CalcProgram {
                     treeNode.data.feesIndex.common.tenderTotalFee != ttf ){
                     delete treeNode.data.fees;    // 直接删掉再新增。从其它计算方式切换到公式计算方式,会多出其它的费(不光是common)所以这里直接删掉,不用一个个费判断更新,效率更高。
                     delete treeNode.data.feesIndex;
-                    treeNodeTools.initFeeField(treeNode, 'common');
-                    treeNode.data.feesIndex.common.unitFee = uf;
-                    treeNode.data.feesIndex.common.totalFee = tf;
-                    treeNode.data.feesIndex.common.tenderUnitFee = tuf;
-                    treeNode.data.feesIndex.common.tenderTotalFee = ttf;
-                    treeNode.changed = true;
+                    newCommonFee();
                 }
+            }else{
+                newCommonFee();
             };
             treeNode.data.calcTemplate = {"calcItems": []};
         }

+ 2 - 11
web/building_saas/main/js/views/project_view.js

@@ -504,7 +504,6 @@ var projectObj = {
                     },
                     callback: function (key, opt) {
                         ProjectController.addRootBill(project, controller);
-                        cbTools.refreshFormulaNodes();
                     },
                     visible: function(key, opt){
                         return project.mainTree.selected&&project.mainTree.selected.parent==null;
@@ -531,7 +530,6 @@ var projectObj = {
                     },
                     callback: function (key, opt) {
                         ProjectController.addFB(project, controller);
-                        cbTools.refreshFormulaNodes();
                     },
                     visible: function(key, opt){
                         return project.Bills.isFBFX(project.mainTree.selected );//不属于分部分项的话隐藏
@@ -565,7 +563,6 @@ var projectObj = {
                     },
                     callback: function (key, opt) {
                         ProjectController.addFX(project, controller);
-                        cbTools.refreshFormulaNodes();
                     },
                     visible: function(key, opt){
                         return project.Bills.isFBFX(project.mainTree.selected );//不属于分部分项的话隐藏
@@ -585,7 +582,6 @@ var projectObj = {
                             }
                         }
                         ProjectController.addBills(project, controller);
-                        cbTools.refreshFormulaNodes();
                     },
                      visible: function(key, opt){
                          return  project.Bills.isFBFX(project.mainTree.selected)==true?false:true;//不属于分部分项的话隐藏
@@ -600,7 +596,6 @@ var projectObj = {
                     },
                     callback: function (key, opt) {
                         ProjectController.addRation(project, controller, rationType.ration);
-                        cbTools.refreshFormulaNodes();
                     },
                     visible: function(key, opt){
                         var selected = project.mainTree.selected;
@@ -620,7 +615,6 @@ var projectObj = {
                     },
                     callback: function (key, opt) {
                         ProjectController.addRation(project, controller, rationType.volumePrice);
-                        cbTools.refreshFormulaNodes();
                     },
                     visible: function(key, opt){
                         var selected = project.mainTree.selected;
@@ -649,7 +643,6 @@ var projectObj = {
                             }
                         }
                         getGLJData('insert');// ProjectController.addRation(project, controller, rationType.volumePrice);
-                        cbTools.refreshFormulaNodes();
                     },
                     visible: function(key, opt){
                         var selected = project.mainTree.selected;
@@ -683,7 +676,6 @@ var projectObj = {
                                 controller.delete();
                             };
                             projectObj.converseCalculateBills(parent);
-                            cbTools.refreshFormulaNodes();
                         }
                     }
                 },
@@ -838,11 +830,10 @@ $('#insert').click(function () {
     } else if (selected.sourceType === project.Ration.getSourceType()) {
         ProjectController.addRation(project, controller, selected.data.type);
     };
-
-    cbTools.refreshFormulaNodes();
 });
 $('#delete').click(function () {
-    $("#delete_row").modal({show:true});//弹出删除提示框;
+
+$("#delete_row").modal({show:true});//弹出删除提示框;
 });
 $('#upLevel').click(function () {
     var controller = projectObj.mainController, project = projectObj.project;

+ 14 - 14
web/building_saas/pm/html/project-management.html

@@ -123,15 +123,15 @@
                     <thead>
                     <tr>
                         <th rowspan="2"></th>
-                        <th rowspan="2">序号</th>
-                        <th rowspan="2">单位工程名称</th>
-                        <th rowspan="2">金额(元)</th>
-                        <th colspan="3">其中</th>
+                        <th rowspan="2" style="text-align:center;vertical-align:middle;">序号</th>
+                        <th rowspan="2" style="text-align:center;vertical-align:middle;">单位工程名称</th>
+                        <th rowspan="2" style="text-align:center;vertical-align:middle;">金额(元)</th>
+                        <th colspan="3" style="text-align:center;vertical-align:middle;">其中</th>
                     </tr>
                     <tr>
-                        <th>暂估价(元)</th>
-                        <th>安全文明施工费(元)</th>
-                        <th>规费(元)</th>
+                        <th style="text-align:center;vertical-align:middle;">暂估价(元)</th>
+                        <th style="text-align:center;vertical-align:middle;">安全文明施工费(元)</th>
+                        <th style="text-align:center;vertical-align:middle;">规费(元)</th>
                     </tr>
                     </thead>
                     <tbody></tbody>
@@ -168,15 +168,15 @@
                     <thead>
                     <tr>
                         <th rowspan="2"></th>
-                        <th rowspan="2">序号</th>
-                        <th rowspan="2">单位工程名称</th>
-                        <th rowspan="2">金额(元)</th>
-                        <th colspan="3">其中</th>
+                        <th rowspan="2" style="text-align:center;vertical-align:middle">序号</th>
+                        <th rowspan="2" style="text-align:center;vertical-align:middle">单位工程名称</th>
+                        <th rowspan="2" style="text-align:center;vertical-align:middle">金额(元)</th>
+                        <th colspan="3" style="text-align:center;vertical-align:middle">其中</th>
                     </tr>
                     <tr>
-                        <th>暂估价(元)</th>
-                        <th>安全文明施工费(元)</th>
-                        <th>规费(元)</th>
+                        <th style="text-align:center;vertical-align:middle;">暂估价(元)</th>
+                        <th style="text-align:center;vertical-align:middle;">安全文明施工费(元)</th>
+                        <th style="text-align:center;vertical-align:middle;">规费(元)</th>
                     </tr>
                     </thead>
                     <tbody>

+ 38 - 9
web/building_saas/pm/js/pm_main.js

@@ -101,7 +101,9 @@ let ProjTreeSetting = {
             event: {
                 getText: function (html, node, text) {
                     if(node.data.projType === projectType.tender){
-                        let engineeringCostText = node.data.engineeringCost ? node.data.engineeringCost : 0;
+                        // let engineeringCostText = node.data.engineeringCost ? node.data.engineeringCost : 0;
+                        let engineeringCostText = node.data.summaryFees ? node.data.summaryFees.totalFee : 0;
+                        html.push(engineeringCostText);
                     }
                 }
             }
@@ -1656,29 +1658,56 @@ function setDataToSideBar() {
         return;
     }*/
     if(selectedItem.children.length > 0){
+        // CSL, 2018-01-11 汇总单项工程、建设项目。
+        function calcNode(node){
+            if (node.data.projType == projectType.project || node.data.projType == projectType.engineering){
+                node.data.summaryFees = {totalFee: 0.00, estimateFee: 0.00, safetyFee: 0.00, chargeFee: 0.00};
+                for (let child of node.children){
+                    calcNode(child);
+                    node.data.summaryFees.totalFee = (parseFloat(node.data.summaryFees.totalFee) + parseFloat(child.data.summaryFees.totalFee)).toFixed(2);
+                    node.data.summaryFees.estimateFee = (parseFloat(node.data.summaryFees.estimateFee) + parseFloat(child.data.summaryFees.estimateFee)).toFixed(2);
+                    node.data.summaryFees.safetyFee = (parseFloat(node.data.summaryFees.safetyFee) + parseFloat(child.data.summaryFees.safetyFee)).toFixed(2);
+                    node.data.summaryFees.chargeFee = (parseFloat(node.data.summaryFees.chargeFee) + parseFloat(child.data.summaryFees.chargeFee)).toFixed(2);
+                };
+            }else{
+                if (!node.data.summaryFees)
+                    node.data.summaryFees = {totalFee: 0.00, estimateFee: 0.00, safetyFee: 0.00, chargeFee: 0.00}
+                else{
+                    node.data.summaryFees.totalFee = parseFloat(node.data.summaryFees.totalFee).toFixed(2);
+                    node.data.summaryFees.estimateFee = parseFloat(node.data.summaryFees.estimateFee).toFixed(2);
+                    node.data.summaryFees.safetyFee = parseFloat(node.data.summaryFees.safetyFee).toFixed(2);
+                    node.data.summaryFees.chargeFee = parseFloat(node.data.summaryFees.chargeFee).toFixed(2);
+                }
+            };
+        };
+
         // 建设项目相关
         let counter = 1;
         let html = '';
+
+        calcNode(selectedItem);
         for(let tmp of selectedItem.children) {
+
             html += '<tr>' +
                 '<td>'+ counter +'</td>' +
                 '<td>'+ counter +'</td>' +
                 '<td>'+ tmp.data.name +'</td>' +
-                '<td></td>' +
-                '<td></td>' +
-                '<td></td>' +
-                '<td></td>' +
+                '<td style="text-align:right">'+ tmp.data.summaryFees.totalFee + '</td>' +
+                '<td style="text-align:right">'+ tmp.data.summaryFees.estimateFee + '</td>' +
+                '<td style="text-align:right">'+ tmp.data.summaryFees.safetyFee + '</td>' +
+                '<td style="text-align:right">'+ tmp.data.summaryFees.chargeFee + '</td>' +
                 '</tr>';
 
         }
+
         html += '<tr>' +
             '<td>'+ (counter + 1) +'</td>' +
             '<td> </td>' +
             '<td>合计</td>' +
-            '<td></td>' +
-            '<td></td>' +
-            '<td></td>' +
-            '<td></td>' +
+            '<td style="text-align:right">'+ selectedItem.data.summaryFees.totalFee + '</td>' +
+            '<td style="text-align:right">'+ selectedItem.data.summaryFees.estimateFee + '</td>' +
+            '<td style="text-align:right">'+ selectedItem.data.summaryFees.safetyFee + '</td>' +
+            '<td style="text-align:right">'+ selectedItem.data.summaryFees.chargeFee + '</td>' +
             '</tr>';
         $(target + '-table tbody').html(html);
     }