소스 검색

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

zhongzewei 7 년 전
부모
커밋
26d24cedb3

+ 54 - 1
modules/main/controllers/bills_controller.js

@@ -3,6 +3,7 @@
  */
 var billsData = require('../models/bills');
 let ProjectsData = require('../../pm/models/project_model').project;
+let logger = require("../../../logs/log_helper").logger;
 //统一回调函数
 var callback = function(req, res, err, message, data){
     res.json({error: err, message: message, data: data});
@@ -73,6 +74,58 @@ module.exports = {
         const message = !result || !projectResult ? '修改失败' : '修改成功';
         const err = !result || !projectResult ? 1 : 0;
         callback(request, response, err, message, null);
+    },
+    singleDelete:async function(req, res){
+        let result={
+            error:0
+        }
+        try {
+            let data = req.body.data;
+            data = JSON.parse(data);
+            let tasks = generateSingleDeleteTasks(data);
+            let resultData= await billsData.model.bulkWrite(tasks);
+            result.data=resultData;
+        }catch (err){
+            logger.err(err);
+            result.error=1;
+            result.message = err.message;
+        }
+        res.json(result);
     }
 
-};
+};
+
+
+function  generateSingleDeleteTasks(data) {
+    let tasks=[];
+    let updateData = data.updateData;
+    for(let key in updateData){
+        if(updateData[key]==true){
+            let deleteInfo={deleted: true, deleteDateTime: new Date(), deleteBy: data.user_id};
+            let task={
+                updateOne:{
+                    filter:{
+                        ID:key,
+                        projectID:data.projectID
+                    },
+                    update:{
+                        deleteInfo:deleteInfo
+                    }
+                }
+            };
+            tasks.push(task);
+        }else {
+            let task={
+                updateOne:{
+                    filter:{
+                        ID:key,
+                        projectID:data.projectID
+                    },
+                    update:updateData[key]
+                }
+            };
+            tasks.push(task);
+        }
+    }
+    return tasks;
+}

+ 2 - 0
modules/main/routes/bills_route.js

@@ -12,6 +12,8 @@ module.exports = function (app) {
     billsRouter.post('/updateCharacterContent', billsController.updateCharacterContent);//特征及内容更新 zhong 2017-9-1
     // 批量更新bill数据
     billsRouter.post('/updateBill', billsController.updateBill);
+    //按条件更新清单
+    billsRouter.post('/singleDelete',billsController.singleDelete);
     app.use('/bills', billsRouter);
 };
 

+ 13 - 0
modules/pm/models/project_model.js

@@ -661,6 +661,19 @@ ProjectsDAO.prototype.updateProjectProperty = async function(projectId, property
     return result.ok === 1;
 };
 
+// CSL, 2018-01-11 获取指定ID节点(如单项工程、建设项目)下所有单位工程的各项汇总金额,用于报表计算汇总。
+ProjectsDAO.prototype.getSummaryFees = function (projectID, callback) {
+    Projects.find({'ParentID': projectID}, ['-_id','-property'], function (err, datas) {
+        if (err) {
+            callback(1, '查找单位工程失败');
+        } else {
+
+            callback(0, datas);
+        }
+    });
+};
+
+
 module.exports ={    project: new ProjectsDAO(),
     projType: projectType,
     fileType: fileType

+ 1 - 1
modules/ration_glj/facade/glj_calculate_facade.js

@@ -110,7 +110,7 @@ async function calculateQuantityPerGLJ(glj,index,coeList,assList,adjustState,noN
                 result.doc.customQuantity = glj.customQuantity;
             }
             let customerCoe = _.last(coeList);
-            if(customerCoe.isAdjust==1){
+            if(customerCoe&&customerCoe.isAdjust==1){
                 quantity = calculateQuantityByCustomerCoes(quantity,customerCoe,glj);
             }
             result.doc.quantity =scMathUtil.roundToString(quantity,decimal);

+ 1 - 0
modules/reports/models/tpl_tree_node.js

@@ -23,6 +23,7 @@ let TplNodeSchema = new Schema({
     ID: Number,         //template节点ID,只有在nodeType是模板节点有效
     refId: Number,      //引用报表模板id (引用 collection: rpt_templates)
     name: String,       //显示名称
+    released: Boolean,  //是否已发布
     items: []           //子节点
 });
 

+ 30 - 0
public/web/id_tree.js

@@ -585,6 +585,36 @@ var idTree = {
             }
             return success;
         };
+        Tree.prototype.singleDelete = function (node) {//删除本身不删除子项
+            let that = this;
+            let success = false;
+            delete that.nodes[that.prefix + node.getID()];//删除本身
+            if(node.children.length>0){
+                if(node.preSibling){//子项变成前兄弟的子项
+                    for(let c of node.children){
+                        node.preSibling.addChild(c);
+                    }
+                }else if(node.nextSibling){//没有前兄弟,有后兄弟
+                    let oldChild = node.parent.children;
+                    node.parent.children = [];
+                    for(let c of node.children){
+                        node.parent.addChild(c);
+                    }
+                    for(let oc of oldChild){
+                        node.parent.addChild(oc);
+                    }
+                }else {//都没有的情况
+                    for(let c of node.children){
+                        node.parent.addChild(c);
+                    }
+                }
+                tools.sortTreeItems(this);
+                success = true;
+            }
+            return success;
+        };
+
+
         Tree.prototype.getDeleteData = function (node) {
             var data = [];
             var addUpdateDataForDelete = function (datas, nodes) {

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

@@ -56,6 +56,18 @@ var TREE_SHEET_CONTROLLER = {
                 }
             }
         };
+        controller.prototype.singleDelete = function () {//只删除当前节点,不删除子节点
+            var that = this, sels = this.sheet.getSelections();
+            if (this.tree.selected) {
+                if (this.tree.singleDelete(this.tree.selected)) {
+                    TREE_SHEET_HELPER.massOperationSheet(this.sheet, function () {
+                        that.sheet.deleteRows(sels[0].row,1);
+                        that.setTreeSelected(that.tree.items[sels[0].row]);
+                    });
+                }
+            }
+        };
+
         controller.prototype.deleteNode = function (node,next) {
             var that = this;
             if (node){

+ 1 - 3
web/building_saas/glj/html/glj_index.html

@@ -18,6 +18,7 @@
                     <p style="text-align: center; margin-top: 30px;">正在加载数据</p>
                 </div>
             </div>
+            <div class="resize"></div>
             <div class="bottom-content">
                 <ul class="nav nav-tabs" role="tablist">
                     <li class="nav-item">
@@ -29,9 +30,6 @@
                     <li class="nav-item">
                         <a class="nav-link" data-toggle="tab" data-name="machine" href="#jx" role="tab">机械单价</a>
                     </li>
-                    <li class="nav-item ml-auto mr-4">
-                        <a class="nav-link text-muted position-absolute resize" data-toggle="tooltip" data-placement="bottom" title="按住,上下拖动调整高度"><i class="fa fa-arrows-v"></i></a>
-                    </li>
                 </ul>
                 <!-- Tab panes -->
                 <div class="tab-content">

+ 25 - 0
web/building_saas/main/html/main.html

@@ -764,6 +764,31 @@
             </div>
         </div>
     </div>
+
+    <!--弹出 是否删除所选行窗口-->
+    <div class="modal fade" id="delete_row" data-backdrop="static">
+        <div class="modal-dialog" role="document">
+            <div class="modal-content">
+                <div class="modal-header">
+                    <h5 class="modal-title">删除确认</h5>
+                    <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                        <span aria-hidden="true">&times;</span>
+                    </button>
+                </div>
+                <div class="modal-body">
+                    <div class="form-group">
+                        <label id="delete_showinfo">确认要删除当前选中行吗?</label>
+                    </div>
+                </div>
+                <div class="modal-footer" style="justify-content: center">
+                    <button type="button" class="btn btn-primary"  data-dismiss="modal" id="deleteY" >是</button>
+                    <button type="button" class="btn btn-primary"  data-dismiss="modal" id="deleteN" >否</button>
+                    <button type="button" class="btn btn-secondary" data-dismiss="modal" id="deleteCancel">取消</button>
+                </div>
+            </div>
+        </div>
+    </div>
+
         <!-- JS. -->
         <script type="text/javascript" src="/lib/spreadjs/sheets/gc.spread.sheets.all.10.0.1.min.js"></script>
 

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

@@ -237,6 +237,64 @@ var Bills = {
             return this.tree.delete(node);
         };
 
+        bills.prototype.singleDeleteBills=function(node,controller){
+            let updateData = {};
+            let updateNode={};
+            let me = this;
+            if(node){
+                updateData[node.data.ID]=true;
+                if(node.children.length>0){//有子项
+                    if(node.preSibling){//有前兄弟,则子项变成前兄弟的子项
+                        if(node.preSibling.children.length>0){//前兄弟有子项,
+                            let preNode = node.preSibling.children[node.preSibling.children.length-1];
+                            updateData[preNode.data.ID]={
+                                NextSiblingID:node.children[0].data.ID
+                            }
+                            updateNode[preNode.data.ID] = preNode;
+                        }
+                        for(let i=0;i<node.children.length;i++){
+                            updateData[node.children[i].data.ID]={
+                                ParentID:node.preSibling.data.ID
+                            };
+                            updateNode[node.children[i].data.ID]=node.children[i];
+                        }
+                    }else {//没有前兄弟,则子项升一级
+                        let parent = node.nextSibling.parent;
+                        for(let i=0;i<node.children.length;i++){
+                            if(i == node.children.length-1&&node.nextSibling){//最后一个子项,在有后兄弟的情况下,作为后兄弟的前兄弟
+                                updateData[node.children[i].data.ID]={
+                                    ParentID:parent.data.ID,
+                                    NextSiblingID:node.nextSibling.data.ID
+                                };
+                            }else {
+                                updateData[node.children[i].data.ID]={
+                                    ParentID:parent.data.ID
+                                };
+                            }
+                            updateNode[node.children[i].data.ID]=node.children[i];
+                        }
+                    }
+                }
+                $.bootstrapLoading.start();
+                CommonAjax.post("/bills/singleDelete", {updateData:updateData,projectID:node.data.projectID,user_id:userID}, function () {
+                    controller.singleDelete();//删除树节点
+                    me.tree.singleDelete(node);
+                    //更新缓存
+                    console.log(updateNode);
+                    _.remove(me.datas,{'ID':node.data.ID});
+                    for(let n_key in updateNode){
+                        let updateDoc =  updateData[n_key];
+                        for(let u_key in updateDoc){
+                            updateNode[n_key].data[u_key] =updateDoc[u_key];
+                        }
+                    }
+                    $.bootstrapLoading.end();
+                }, function () {
+                    $.bootstrapLoading.end();
+                });
+            }
+
+        };
         bills.prototype.upMoveBills = function (node) {
             var upMoveData = node.getUpMoveData();
             project.pushNow('upMoveBills', this.getSourceType(), tools.coverseTreeUpdateData(upMoveData, this.project.ID()));
@@ -404,17 +462,24 @@ var Bills = {
         };
         bills.prototype.getRootNode = function (node) {
             if(node.parent){
-                return this.getRootNode(node.parent)
+                return this.getRootNode(node.parent);
             }else {
-                return node
+                return node;
             }
         };
         bills.prototype.isFBFX = function (node) {//判读是否属于分部分项
            let rootNode = this.getRootNode(node);
             if(isFlag(rootNode.data)&&rootNode.data.flagsIndex.fixed.flag==fixedFlag.SUB_ENGINERRING){
-                return true
+                return true;
+            }else {
+                return false;
+            }
+        };
+        bills.prototype.isEngineeringCost = function (node) {//判断这个节点是否是工程造价节点
+            if(isFlag(node.data)&&node.data.flagsIndex.fixed.flag==fixedFlag.ENGINEERINGCOST){
+                return true;
             }else {
-                return false
+                return false;
             }
         };
         return new bills(project);

+ 39 - 1
web/building_saas/main/js/models/cache_tree.js

@@ -366,8 +366,15 @@ var cacheTree = {
         };
         Tree.prototype.delete = function (node) {
             var success = false;
+            var me = this;
+            var removeNodes = function (node) {
+                delete me.nodes[me.prefix + node.getID()];
+                for(let ch of node.children){
+                    removeNodes(ch);
+                }
+            };
             if (node) {
-                delete this.nodes[this.prefix + node.getID()];
+                removeNodes(node);
                 if (node.preSibling) {
                     node.preSibling.setNextSibling(node.nextSibling);
                 } else if (node.nextSibling) {
@@ -383,6 +390,37 @@ var cacheTree = {
             }
             return success;
         };
+        Tree.prototype.singleDelete = function (node) {//只删除当前节点,不删除子节点
+            var success = false;
+            var me = this;
+            if(node){
+                delete me.nodes[me.prefix + node.getID()];
+                if(node.children.length>0){
+                    if(node.preSibling){//子项变成前兄弟的子项
+                        for(let c of node.children){
+                            node.preSibling.addChild(c);
+                        }
+                    }else if(node.nextSibling){//没有前兄弟,有后兄弟
+                        let oldChild = node.parent.children;
+                        node.parent.children = [];
+                        for(let c of node.children){
+                            node.parent.addChild(c);
+                        }
+                        for(let oc of oldChild){
+                            node.parent.addChild(oc);
+                        }
+                    }else {//都没有的情况
+                        for(let c of node.children){
+                            node.parent.addChild(c);
+                        }
+                    }
+                    this.sortTreeItems();
+                    success = true;
+                }
+            }
+            return success;
+
+        };
         return new Tree(owner);
     }
 };

+ 12 - 1
web/building_saas/main/js/models/calc_program.js

@@ -1009,7 +1009,7 @@ class CalcProgram {
         if (treeNode.changed && !changedArr.includes(treeNode)) changedArr.push(treeNode);
     };
 
-    // 计算本节点、所有父节点(默认,可选)、公式引用节点。
+    // 计算本节点、所有父节点(默认,可选)、公式引用节点(默认,可选)
     calculate(treeNode, calcParents = true, calcFormulas = true){
         let me = this;
         let changedNodes = [];
@@ -1120,6 +1120,17 @@ class CalcProgram {
         me.saveNodes(allChangedNodes);
     };
 
+    // 计算多条零散的清单,并计算他们的父清单、引用清单,然后打包存储。如:花选删除树结点(如花选清单、定额等,不区分树结点类型)。
+    calcBillsAndSave(billNodes){
+        let me = this, allChangedNodes = [];
+        for (let node of billNodes) {
+            let curChangeds = me.calculate(node, true, false);
+            mergeArr(allChangedNodes, curChangeds);
+        };
+        me.calcFormulaNodes(allChangedNodes);
+        me.saveNodes(allChangedNodes);
+    };
+
     // 计算并保存指定的一个树节点。修改一个树节点,实际上要计算和保存的是一批树结点:层层父结点、被其它结点(的公式)引用的公式结点。
     // 这个方法实际上封装了calculate()和saveNodes()两个方法,主要目的是为了外部调用方便,少写一点累赘代码。
     calcAndSave(treeNode){

+ 9 - 5
web/building_saas/main/js/views/character_content_view.js

@@ -987,15 +987,19 @@ let pageCCOprObj = {
      * @return {Object} - 返回更新的数据
      */
     getCharacterUpdateData: function(setting, node) {
-        // 获取原名称
-        const name = node.data.name.split("\n");
-        this.nameCache = name[0] !== undefined ? name[0] : "";
-
         let updateData = {
             itemCharacterText: '',
             jobContentText: '',
-            name: this.nameCache,
+            name: '',
         };
+        if (node.data.name === undefined || node.data.itemCharacter.length <= 0 || node.data.jobContent.length <= 0) {
+            return updateData;
+        }
+        // 获取原名称
+        const name = node.data.name.split("\n");
+        this.nameCache = name[0] !== undefined ? name[0] : "";
+        updateData.name = this.nameCache;
+
         let contentArray = [];
 
         // 获取当前设置数据

+ 84 - 23
web/building_saas/main/js/views/project_view.js

@@ -66,9 +66,11 @@ var projectObj = {
         let canDelete = function (node) {
             if (selected) {
                 if (selected.sourceType === that.project.Bills.getSourceType()) {
-                    if(selected.data.type == billType.DXFY&&selected.data.isAdd!=1){
+                    if(selected.data.type == billType.DXFY&&selected.data.isAdd!=1){//如果
                         return false;
                     }
+                }if(selected.sourceType === that.project.ration_glj.getSourceType()){
+                    return false;
                 }
                 return true;
             } else {
@@ -707,7 +709,7 @@ var projectObj = {
             calc = null;
         }*/
         projectObj.project.calcProgram.calcAndSave(node);
-    },
+},
     // 计算全部清单
 /*    calculateAll: function () {
         let calc = new BillsCalcHelper(this.project);
@@ -831,29 +833,11 @@ $('#insert').click(function () {
         ProjectController.addRation(project, controller, selected.data.type);
     };
 });
-$('#delete').click(function () {
-    var controller = projectObj.mainController, project = projectObj.project;
-    var selected = controller.tree.selected, parent = selected.parent;
 
-    if (selected) {
-        if (selected.sourceType === project.Bills.getSourceType()) {
-            if (cbTools.isUsedByFormula(selected)){
-                alert('该清单行被其它公式结点引用,不允许删除!');
-                return;
-            };
-            project.Bills.deleteBills(selected.source);
-            controller.delete();
-        } else if (selected.sourceType === project.Ration.getSourceType()) {
-            project.Ration.delete(selected.source);
-            controller.delete();
-        }else if(selected.sourceType==ModuleNames.ration_glj){
-            project.ration_glj.updataOrdelete(selected.source);
-        };
-        if(parent){
-            projectObj.converseCalculateBills(parent);
-        }
-    };
+$('#delete').click(function () {
+    $("#delete_row").modal({show:true});//弹出删除提示框;
 });
+
 $('#upLevel').click(function () {
     var controller = projectObj.mainController, project = projectObj.project;
     var selected = controller.tree.selected, orgParent = selected.parent;
@@ -1051,3 +1035,80 @@ $('#property_ok').click(function () {
         });
     }
 });
+
+$('#delete_row').on('shown.bs.modal', function (e) {
+    var controller = projectObj.mainController, project = projectObj.project;
+    var selected = controller.tree.selected, parent = selected.parent;
+    var showinfo = "确认要删除当前选中行吗?";
+    var showN = false;
+    var cancelText = "否";
+    if(selected.sourceType == project.Bills.getSourceType()&&selected.data.type==billType.FB&&selected.children.length>0){
+         showinfo = "是否删除其下的子项?";
+         showN = true;
+         cancelText = "取消";
+    }
+    $('#delete_showinfo').text(showinfo);
+    showN==true? $('#deleteN').show():$('#deleteN').hide();
+    $('#deleteCancel').text(cancelText);
+});
+
+$('#deleteY').click(function () { //正常删除,级联删除子项
+     let controller = projectObj.mainController, project = projectObj.project;
+     let selected = controller.tree.selected, parent = selected.parent;
+     if (selected) {
+         if (selected.sourceType === project.Bills.getSourceType()) {
+             if (cbTools.isUsedByFormula(selected)){
+                 alert('该清单行被其它公式结点引用,不允许删除!');
+                 return;
+             }
+             project.Bills.deleteBills(selected.source);
+             controller.delete();
+         } else if (selected.sourceType === project.Ration.getSourceType()) {
+             project.Ration.delete(selected.source);
+             controller.delete();
+         }else if(selected.sourceType==ModuleNames.ration_glj){
+            project.ration_glj.updataOrdelete(selected.source);
+         }
+         if(parent){
+             projectObj.converseCalculateBills(parent);
+         }else { //删除的是大项费用要重新计算工程造价节点
+             let roots =  controller.tree.roots;
+             for(let root of roots){
+                 if(project.Bills.isEngineeringCost(root)==true){
+                     project.calcProgram.calcAndSave(root);
+                     break;
+                 }
+             }
+         }
+     }
+});
+
+$('#deleteN').click(function () {//不删除子项
+    let controller = projectObj.mainController, project = projectObj.project;
+    let selected = controller.tree.selected, parent = selected.parent;
+    let updateData = {};
+    if(selected){
+        let preNode = selected.preSibling;
+        let nextNode = selected.nextSibling;
+        if(preNode){//有前兄弟
+            if(preNode.children.length>0&&preNode.children[0].data.type != selected.children[0].data.type){//并且前兄弟子项和焦点行子项类别不同。
+                alert("删除分部会导致分部和分项同级,不允许该操作!");
+                return;
+            }
+        }else if(nextNode){
+            if(nextNode.data.type != selected.children[0].data.type){
+                alert("删除分部会导致分部和分项同级,不允许该操作! ");
+                return;
+            }
+        }
+        project.Bills.singleDeleteBills(selected,controller);
+
+
+    }
+
+
+
+
+
+
+});

+ 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>

+ 30 - 32
web/building_saas/pm/js/pm_main.js

@@ -1658,46 +1658,44 @@ function setDataToSideBar() {
         return;
     }*/
     if(selectedItem.children.length > 0){
-
-/*        function calcNode(node) {
-            let sum_tf = 0, sum_ef = 0, sum_sf = 0, sum_cf = 0;
-
-            if (node.children.length > 0){
-                for (let cNode of node.children){
-                     calcNode(cNode);
+        // 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);
+                }
             };
+        };
 
-            if (node.data.projType == projectType.tender){
-
-            }
-
-        }*/
         // 建设项目相关
         let counter = 1;
         let html = '';
-        let sum_tf = 0, sum_ef = 0, sum_sf = 0, sum_cf = 0;
+
+        calcNode(selectedItem);
         for(let tmp of selectedItem.children) {
-            let tf = 0, ef = 0, sf = 0, cf = 0;
-            if (tmp.data.summaryFees){
-                tf = parseFloat(tmp.data.summaryFees.totalFee);
-                ef = parseFloat(tmp.data.summaryFees.estimateFee);
-                sf = parseFloat(tmp.data.summaryFees.safetyFee);
-                cf = parseFloat(tmp.data.summaryFees.chargeFee);
-                sum_tf = sum_tf + tf;
-                sum_ef = sum_ef + ef;
-                sum_sf = sum_sf + sf;
-                sum_cf = sum_cf + cf;
-            };
 
             html += '<tr>' +
                 '<td>'+ counter +'</td>' +
                 '<td>'+ counter +'</td>' +
                 '<td>'+ tmp.data.name +'</td>' +
-                '<td>'+ tf + '</td>' +
-                '<td>'+ ef + '</td>' +
-                '<td>'+ sf + '</td>' +
-                '<td>'+ cf + '</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>';
 
         }
@@ -1706,10 +1704,10 @@ function setDataToSideBar() {
             '<td>'+ (counter + 1) +'</td>' +
             '<td> </td>' +
             '<td>合计</td>' +
-            '<td>'+ sum_tf + '</td>' +
-            '<td>'+ sum_ef + '</td>' +
-            '<td>'+ sum_sf + '</td>' +
-            '<td>'+ sum_cf + '</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);
     }