Browse Source

Merge branch 'master' of http://192.168.1.12:3000/SmartCost/ConstructionCost

TonyKang 7 năm trước cách đây
mục cha
commit
4d5dd26235

+ 1 - 0
config/gulpConfig.js

@@ -80,6 +80,7 @@ module.exports = {
         'web/building_saas/main/js/models/ration_ass.js',
         // 'web/building_saas/main/js/models/volume_price.js',
         'web/building_saas/main/js/models/labour_coe.js',
+        'web/building_saas/main/js/models/installation_fee.js',
         'public/web/id_tree.js',
         'web/building_saas/main/js/models/cache_tree.js',
         'web/building_saas/main/js/calc/calc_fees.js',

+ 99 - 0
modules/main/facade/installation_facade.js

@@ -0,0 +1,99 @@
+/**
+ * Created by zhang on 2018/1/31.
+ */
+import {installSectionModel,installFeeItemModel} from "../../complementary_ration_lib/models/schemas";
+import installationFeeModel from "../models/installation_fee";
+import engineeringModel from "../../users/models/schema/engineering_lib";
+const uuidV1 = require('uuid/v1');
+let consts = require('../../main/models/project_consts')
+
+module.exports={
+    copyInstallationFeeFromLib:copyInstallationFeeFromLib,
+    getData:getData
+};
+
+async function copyInstallationFeeFromLib(projectID,engineering_id) {
+
+    //安装增加费用内嵌文档的方式
+    let engineering = await engineeringModel.findById(engineering_id);
+    let ration_lib = engineering.ration_lib;
+    let installationFeeList = [];
+    for(let rl of ration_lib){
+       let installFeeItems = await installFeeItemModel.find({'rationRepId':rl.id});
+       let installSections = await installSectionModel.find({'rationRepId':rl.id});
+       let newInstallationFee = {
+           libID:rl.id,
+           libName:rl.name,
+           projectID:projectID
+       };
+        newInstallationFee.ID = uuidV1();
+       let create = false;
+       if(installFeeItems && installFeeItems.length > 0) {//费用项
+           create = true;
+           let tem_installFeeItem = [];
+           for(let ifee of installFeeItems){
+                let tem_fee ={
+                    feeItem:ifee.feeItem,
+                    feeType:ifee.feeType,
+                    position:ifee.position,
+                    ID:ifee.ID
+                };
+               tem_installFeeItem.push(tem_fee);
+           }
+           newInstallationFee.installFeeItem = tem_installFeeItem;
+       }
+
+       if(installSections && installSections.length > 0){//章节项
+           create = true;
+           let tem_installSections = [];
+           let tem_feeRules = [];
+           for(let isect of installSections){
+                let tem_sec={
+                    ID:isect.ID,
+                    feeItemId:isect.feeItemId,
+                    name:isect.name
+                };
+                if(isect.feeRule && isect.feeRule.length > 0){//规则项
+                    tem_sec.feeRuleId = isect.feeRule[0].ID; //选中第一个
+                    for(let ifeeR of isect.feeRule){
+                        let tem_feeRule = {
+                            ID: ifeeR.ID,
+                            code: ifeeR.code,
+                            rule: ifeeR.rule,
+                            base: ifeeR.base,
+                            feeRate: ifeeR.feeRate,
+                            labour: ifeeR.labour,
+                            material: ifeeR.material,
+                            machine: ifeeR.machine
+                        };
+                        tem_feeRule.sectionId = isect.ID;
+                        tem_feeRule.feeItemId = isect.feeItemId;
+                        tem_feeRules.push(tem_feeRule);
+                    }
+                }
+               tem_installSections.push(tem_sec);
+           }
+           newInstallationFee.installSection = tem_installSections;
+           newInstallationFee.feeRule = tem_feeRules;
+       }
+       if(create==true){
+           installationFeeList.push(newInstallationFee);
+       }
+    }
+    console.log(installationFeeList);
+    if(installationFeeList.length > 0){
+        await installationFeeModel.insertMany(installationFeeList);
+    }
+}
+
+function getData(projectID, callback) {
+    installationFeeModel.find({'projectID': projectID}, (err, datas) => {
+        if (err) {
+            callback(1, '', null);
+        } else {
+            callback(0, consts.projectConst.INSTALLATION_FEE, datas);
+        }
+    })
+}
+
+

+ 51 - 0
modules/main/models/installation_fee.js

@@ -0,0 +1,51 @@
+/**
+ * Created by Zhong on 2017/9/13.
+ */
+import mongoose from "mongoose";
+let Schema = mongoose.Schema;
+
+//安装增加费-费用规则
+let feeRuleSchema = new Schema({
+    ID: String,
+    sectionId: String, //分册章节id
+    feeItemId:String,
+    code: String,
+    rule: String,
+    base: String,
+    feeRate: Number,
+    labour: Number,
+    material: Number,
+    machine: Number
+});
+
+//安装增加费-分册章节
+let installSectionSchema = new Schema({
+    ID: String,
+    feeItemId: String,
+    feeRuleId: String,
+    name: String,
+    position: String//记取位置
+});
+
+//安装增加费-费用项
+let installFeeItemSchema = new Schema({
+    ID: String,
+    feeItem: String, //费用项
+    feeType: String, //费用类型
+    position: String//记取位置
+});
+
+let installationFeeSchema = new Schema({
+    ID:String,
+    libID:Number,
+    libName:String,
+    projectID:String,
+    installFeeItem:[installFeeItemSchema],
+    installSection:[installSectionSchema],
+    feeRule:[feeRuleSchema]
+},{versionKey:false});
+
+let installationFeeModel = mongoose.model("installation_fee",installationFeeSchema,"installation_fee");
+
+
+export{ installationFeeModel as default}

+ 2 - 0
modules/main/models/project.js

@@ -15,6 +15,7 @@ let projSetting = require('./proj_setting_model');
 var labour_coe_facade = require('../facade/labour_coe_facade');
 var calc_program_facade = require('../facade/calc_program_facade');
 import GLJController from "../../glj/controllers/glj_controller";
+let installation_facade = require('../facade/installation_facade');
 
 
 const ProjectModel = require('../../pm/models/project_model').project;
@@ -40,6 +41,7 @@ moduleMap[projectConsts.FEERATE] = fee_rate_data;
 moduleMap[projectConsts.LABOUR_COE] = labour_coe_facade;
 moduleMap[projectConsts.CALC_PROGRAM] = calc_program_facade;
 moduleMap[projectConsts.PROJECTGLJ] = new GLJController();
+moduleMap[projectConsts.INSTALLATION_FEE] = installation_facade;
 
 var Project = function (){};
 

+ 2 - 1
modules/main/models/project_consts.js

@@ -16,7 +16,8 @@ let projectConst = {
     // VOLUMEPRICE: 'volume_price',
     FEERATE:'feeRate',
     LABOUR_COE:'labour_coe',
-    CALC_PROGRAM:'calc_program'
+    CALC_PROGRAM:'calc_program',
+    INSTALLATION_FEE:'installation_fee'
 };
 
 let projectConstList = [

+ 4 - 4
modules/options/models/optionTypes.js

@@ -25,25 +25,25 @@ const optionSetting = {
             numFont: 'bold 13px Arial'
         },
         FB: {
-            backColor: '#C1D3E3',
+            backColor: '#C4CAFB',
             foreColor: 'default',
             stringFont: 'default',
             numFont: 'default'
         },
         UNLEAFBILL: {
-            backColor: '#C1D3E3',
+            backColor: '#C4CAFB',
             foreColor: 'default',
             stringFont: 'default',
             numFont: 'default'
         },
         FX: {
-            backColor: '#DAE5EE',
+            backColor: '#DFE8F9',
             foreColor: 'default',
             stringFont: 'default',
             numFont: 'default'
         },
         UNCBBILL: {
-            backColor: '#DAE5EE',
+            backColor: '#DFE8F9',
             foreColor: 'default',
             stringFont: 'default',
             numFont: 'default'

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

@@ -22,6 +22,7 @@ let copyProjController = require('../controllers/copy_proj_controller');
 let feeRateFacade = require('../../fee_rates/facade/fee_rates_facade');
 let labourCoeFacade = require('../../main/facade/labour_coe_facade');
 let calcProgramFacade = require('../../main/facade/calc_program_facade');
+let installationFacade = require('../../main/facade/installation_facade');
 let logger = require("../../../logs/log_helper").logger;
 let BillsModel = require("../../main/models/bills").model;
 
@@ -140,6 +141,11 @@ ProjectsDAO.prototype.updateUserProjects = async function (userId, compilationId
                     data.updateData.property.zanguCalcMode = 0;
                     //计算选项
                     data.updateData.property.calcOptions = calcOptions
+                    //安装增加费
+                    if(parseInt(data.updateData.property.engineering)==4){
+                        await installationFacade.copyInstallationFeeFromLib(data.updateData.ID,data.updateData.property.engineering_id);
+                    }
+
 
                 }
                 newProject = new Projects(data.updateData);

+ 10 - 1
modules/ration_glj/models/ration_glj_temp.js

@@ -122,6 +122,12 @@ var rationAssItemSchema = mongoose.Schema({
     maxValue: String
 }, { _id: false });
 
+//定额安装增加费用
+let rationInstSchema = mongoose.Schema({
+    feeItemId: String,
+    sectionId: String
+},{_id: false});
+
 var rationItemSchema = mongoose.Schema({
     ID:Number,
     code: String,
@@ -132,9 +138,12 @@ var rationItemSchema = mongoose.Schema({
     rationRepId: Number,
     caption: String,
     feeType: Number,
+    jobContent: String,
+    annotation: String,
     rationGljList: [rationGljItemSchema],
     rationCoeList: Array,
-    rationAssList: [rationAssItemSchema]
+    rationAssList: [rationAssItemSchema],
+    rationInstList: [rationInstSchema]
 });
 mongoose.model("std_ration_lib_ration_items",rationItemSchema, "std_ration_lib_ration_items");
 

+ 2 - 2
web/building_saas/glj/js/project_glj_spread.js

@@ -48,8 +48,8 @@ ProjectGLJSpread.prototype.init = function () {
         {name: 'ID', field: 'id', visible: false},
         {name: '类型', field: 'unit_price.type', visible: false},
         {name: '总消耗量', field: 'quantity', visible: true,width:100,decimalField:'glj.quantity'},
-        {name: '分部分项总消耗量', field: 'subdivisionQuantity', visible: false,width:100,decimalField:'glj.quantity'},
-        {name: '技术措施项目总消耗量', field: 'techQuantity', visible: false,width:100,decimalField:'glj.quantity'},
+        {name: '分部分项总消耗量', field: 'subdivisionQuantity', visible: true,width:100,decimalField:'glj.quantity'},
+        {name: '技术措施项目总消耗量', field: 'techQuantity', visible: true,width:100,decimalField:'glj.quantity'},
         {name: '定额价', field: "base_price", visible: true,width:70,decimalField:"glj.unitPrice",validator: 'number'},//这里feiedID设置是为了在计不计取价差的时候做显示用
         {name: '调整价', field: 'adjust_price', visible: true,width:70,decimalField:"glj.unitPrice"},
         {name: '市场价', field: "unit_price.market_price", visible: true, validator: 'number',width:70,decimalField:"glj.unitPrice"},

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

@@ -96,6 +96,9 @@
                                   <li class="nav-item">
                                       <a class="nav-link" id="linkFZDE" data-toggle="tab" href="#subSpread" role="tab">辅助定额</a>
                                   </li>
+                                  <li class="nav-item" id="AZZJF_div" style="display: none">
+                                      <a class="nav-link" id="linkAZZJF" data-toggle="tab" href="#subSpread" role="tab">安装增加费</a>
+                                  </li>
                                   <li class="nav-item">
                                       <a class="nav-link" id="linkGCLMX" data-toggle="tab" href="#subSpread" role="tab">工程量明细</a>
                                   </li>
@@ -858,6 +861,64 @@
         </div>
     </div>
 
+    <!--弹出 计取安装费用-->
+    <div class="modal fade" id="calc_installation_fee" data-backdrop="static">
+        <div class="modal-dialog modal-lg" 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 style="height:200px"><!--sjs id设置在这个div-->
+                        <div class="row">
+                            <div class="modal-auto-height col-8" style="overflow: hidden" id="feeItemSheet">
+                                test ....
+                            </div>
+                            <div class="modal-auto-height col-4" style="overflow: hidden" id="install_setting">
+                                <div style="height: 100px;border:1px solid #f00" >
+                                    <fieldset class="form-group" >
+                                        <h5>分项费用</h5>
+                                        <div class="form-check">
+                                            <label class="form-check-label">
+                                                <input class="form-check-input" name="install_setting_radios" id="all_project_calc" value="0" type="radio">
+                                                整个项目统一计取
+                                            </label>
+                                        </div>
+                                        <div class="form-check">
+                                            <label class="form-check-label">
+                                                <input class="form-check-input" name="install_setting_radios" id="FB_calc" value="1" type="radio">
+                                                每个分部单独计取
+                                            </label>
+                                        </div>
+                                    </fieldset>
+                                </div>
+                            </div>
+                        </div>
+                        <!--<table class="table table-sm table-bordered m-0">
+                            <thead><tr><th></th><th>计取</th><th>费用项</th><th>费用类型</th><th>记取位置</th></tr></thead>
+                            <tr><td>1</td><td></td><td>重庆市安装工程计价定额(2008)</td><td></td><td></td></tr>
+                            <tr><td>2</td><td><input type="checkbox"></td><td>-高层增加费</td><td>子目费用</td><td><a href="javacript:void(0);" data-toggle="modal" data-target="#jqaz-wz">点击</a></td></tr>
+                        </table>-->
+                    </div>
+                    <div style="height:200px"><!--sjs id设置在这个div-->
+                        <table class="table table-sm table-bordered m-0">
+                            <thead><tr><th></th><th>分册章节</th><th>费用规则</th><th>编码</th><th>基数</th><th>费率(%)</th><th>其中人工(%)</th><th>其中材料(%)</th><th>其中机械(%)</th><th>记取位置</th></tr></thead>
+                            <tr><td>1</td><td>第一册 机械设备安装工程1~6、8~16章节</td><td>超高费(标高15m以内(第一册 机械设备安装工程1~6章节))</td><td>AZFY1</td><td>人材机乘系数</td><td></td><td>25</td><td></td><td>25</td><td><a href="javacript:void(0);" data-toggle="modal" data-target="#jqaz-wz">点击</a></td></tr>
+                        </table>
+                    </div>
+                </div>
+                <div class="modal-footer">
+                    <button type="button" class="btn btn-link" >恢复默认值</button>
+                    <button type="button" class="btn btn-secondary" data-dismiss="modal">关闭</button>
+                    <a href="" class="btn btn-primary">确定</a>
+                </div>
+            </div>
+        </div>
+    </div>
+
         <!-- JS. -->
         <script type="text/javascript" src="/lib/spreadjs/sheets/gc.spread.sheets.all.10.0.1.min.js"></script>
 
@@ -930,9 +991,11 @@
         <script type="text/javascript" src="/web/building_saas/main/js/models/labour_coe.js"></script>
         <script type="text/javascript" src="/web/building_saas/main/js/models/calc_program.js"></script>
         <script type="text/javascript" src="/web/building_saas/main/js/models/calc_base.js"></script>
+        <script type="text/javascript" src="/web/building_saas/main/js/models/installation_fee.js"></script>
         <script type="text/javascript" src="/web/building_saas/main/js/views/calc_program_manage.js"></script>
 
 
+
         <script type="text/javascript" src="/public/web/id_tree.js"></script>
         <script type="text/javascript" src="/web/building_saas/main/js/models/cache_tree.js"></script>
         <script type="text/javascript" src="/web/building_saas/main/js/calc/calc_fees.js"></script>
@@ -965,6 +1028,7 @@
         <script type="text/javascript" src="/web/building_saas/main/js/views/calc_program_view.js"></script>
         <script type="text/javascript" src='/web/building_saas/main/js/views/confirm_modal.js'></script>
         <script type="text/javascript" src='/web/building_saas/main/js/views/zlfb_view.js'></script>
+        <script type="text/javascript" src='/web/building_saas/main/js/views/installation_fee_view.js'></script>
         <!--报表-->
         <script type="text/javascript" src="/public/web/rpt_tpl_def.js"></script>
         <script type="text/javascript" src="/public/web/treeDataHelper.js"></script>

+ 1 - 1
web/building_saas/main/js/models/bills.js

@@ -437,7 +437,7 @@ var Bills = {
 
 
         bills.prototype.getTechLeavesID=function () {//取所有分计算技术措施项目清单叶子节点ID
-            let items = projectObj.project.mainTree.roots;//所有节点;
+            let items = projectObj.project.mainTree.items;//所有节点;
             let techNode = null;
             for(let item of items){
                 if(isFlag(item.data)&&item.data.flagsIndex.fixed.flag==fixedFlag.CONSTRUCTION_TECH){

+ 488 - 12
web/building_saas/main/js/models/calc_base.js

@@ -81,7 +81,7 @@ let cbTools = {
         for(let i = 0, len = figureF.length; i < len; i++){
             let figure = figureF[i];
             if(figure.type === 'base' && cbTools.isDef(calcBase.baseFigures[figure.value])){
-                let bill = calcBase.baseFigures[figure.value]['fixedBill']['bill'];
+                let bill = this.isDef(calcBase.baseFigures[figure.value]['fixedBill']) ? calcBase.baseFigures[figure.value]['fixedBill']['bill'] : null;
                 if(this.isDef(bill) && ids.indexOf(bill.ID) === -1){
                     let node = this.getNodeByID(bill.ID);
                     if(this.isDef(node)){
@@ -120,7 +120,7 @@ let cbTools = {
         for(let i in baseFigure){
             let calcBase = baseFigure[i];
             calcBase.fixedBill = null;
-            if(cbTools.isDef(fixedBills[calcBase.fixedFlag])){
+            if(cbTools.isDef(calcBase.fixedFlag) && cbTools.isDef(fixedBills[calcBase.fixedFlag])){
                 fixedBills[calcBase.fixedFlag]['base'][i] = calcBase;
                 calcBase.fixedBill = fixedBills[calcBase.fixedFlag];
             }
@@ -129,26 +129,34 @@ let cbTools = {
     //生成清单基数计算分类模板
     setBaseFigureClass: function (baseFigures, mapObj) {
         mapObj['CONSTRUCTION_ORGANIZATION'] = Object.create(null);
+        mapObj['SAFETY_CONSTRUCTION'] = Object.create(null);
         mapObj['OTHER'] = Object.create(null);
         mapObj['CHARGE'] = Object.create(null);
         mapObj['TAX'] = Object.create(null);
         mapObj['OTHERS'] = Object.create(null);
-        let filter = ['CSXMF', 'ZZCSXMF', 'ZZCSXMDEJJZJGCF', 'ZZCSXMDEJJRGF', 'ZZCSXMDEJJCLF', 'ZZCSXMDEJJJXF', 'QTXMF', 'GF', 'SJ'];
+        let filter = ['CSXMF', 'ZZCSXMF', 'ZZCSXMDEJJZJGCF', 'ZZCSXMDEJJRGF', 'ZZCSXMDEJJCLF', 'ZZCSXMDEJJJXF', 'QTXMF', 'GF', 'SJ', 'SQGCZJ'];
         for(let figure in baseFigures){
             if(filter.indexOf(baseFigures[figure]['base']) === -1){
                 mapObj['CONSTRUCTION_ORGANIZATION'][figure] = baseFigures[figure];
             }
-            if(baseFigures[figure]['base'] !== 'QTXMF'){
+            if(baseFigures[figure]['base'] !== 'QTXMF' && baseFigures[figure]['base'] !== 'SQGCZJ'){
                 mapObj['OTHER'][figure] = baseFigures[figure];
             }
-            if(baseFigures[figure]['base'] !== 'GF'){
+            if(baseFigures[figure]['base'] !== 'GF' && baseFigures[figure]['base'] !== 'SQGCZJ'){
                 mapObj['CHARGE'][figure] = baseFigures[figure];
             }
-            if(baseFigures[figure]['base'] !== 'SJ'){
+            if(baseFigures[figure]['base'] !== 'SJ' && baseFigures[figure]['base'] !== 'SQGCZJ'){
                 mapObj['TAX'][figure] = baseFigures[figure];
             }
-            mapObj['OTHERS'][figure] = baseFigures[figure];
+            if(baseFigures[figure]['base'] !== 'SQGCZJ'){
+                mapObj['OTHERS'][figure] = baseFigures[figure];
+            }
+            if(baseFigures[figure]['base'] === 'SQGCZJ'){
+                mapObj['SAFETY_CONSTRUCTION'][figure] = baseFigures[figure];
+            }
         }
+        mapObj['SAFETY_CONSTRUCTION'] = Object.assign(mapObj['SAFETY_CONSTRUCTION'], mapObj['CONSTRUCTION_ORGANIZATION']);
+
     },
     getFigure: function (node) {
         let calcBase = projectObj.project.calcBase;
@@ -160,6 +168,9 @@ let cbTools = {
         else if(this.isFlag(node.data) && node.data.flagsIndex.fixed.flag === calcBase.fixedFlag.CONSTRUCTION_ORGANIZATION){
             return calcBase.baseFigureClass.CONSTRUCTION_ORGANIZATION;
         }
+        else if(this.isFlag(node.data) && node.data.flagsIndex.fixed.flag === calcBase.fixedFlag.SAFETY_CONSTRUCTION){
+            return calcBase.baseFigureClass.SAFETY_CONSTRUCTION;
+        }
         else if(this.isFlag(node.data) && node.data.flagsIndex.fixed.flag === calcBase.fixedFlag.OTHER){
             return calcBase.baseFigureClass.OTHER;
         }
@@ -219,7 +230,9 @@ let cbTools = {
             let bases = Array.from(new Set(tempBases));
             //根据基数和行引用获取清单ID
             for(let i = 0, len = bases.length; i < len; i++){
-                if(bases[i]['type'] === 'base' && cbTools.isDef(calcBase.baseFigures[bases[i]['value']])){
+                //基数是跟清单直接关联的
+                if(bases[i]['type'] === 'base' && cbTools.isDef(calcBase.baseFigures[bases[i]['value']])
+                    && cbTools.isDef(calcBase.baseFigures[bases[i]['value']]['fixedBill'])){
                     block.push(calcBase.baseFigures[bases[i]['value']]['fixedBill']['bill']['ID']);
                 }
                 else if(bases[i]['type'] === 'id'){
@@ -353,8 +366,18 @@ let baseFigureTemplate = {
     'FBFXWJJCLF': function () {
         return (this['FBFXZCF']() + this['FBFXSBF']()).toDecimal(decimalObj.bills.totalPrice);
     },
+    //统计分部分项下工料机类型为“人工”的总消耗量
     'FBFXRGGR': function () {
-        return 0;
+        let projGljs = calcBase.project.projectGLJ.datas.gljList;
+        let rst = 0;
+        for(let glj of projGljs){
+            if(glj.type === gljType.LABOUR){
+                if(cbTools.isDef(glj.subdivisionQuantity)){
+                    rst = parseFloat(rst + glj.subdivisionQuantity).toDecimal(decimalObj.glj.quantity);
+                }
+            }
+        }
+        return rst;
     },
     'FBFXGCLQDJJZJGCF': function () {
         return (this['FBFXDEJJRGF']() + this['FBFXDEJJCLF']() + this['FBFXDEJJJXF']()).toDecimal(decimalObj.bills.totalPrice);
@@ -444,6 +467,15 @@ let baseFigureTemplate = {
         return (this['JSCSXMZCF']() + this['JSCSXMSBF']()).toDecimal(decimalObj.bills.totalPrice);
     },
     'JSCSXMRGGR': function () {
+        let rst = 0;
+        let projGljs = calcBase.project.projectGLJ.datas.gljList;
+        for(let glj of projGljs){
+            if(glj.type === gljType.LABOUR){
+                if(cbTools.isDef(glj.techQuantity)){
+                    rst = parseFloat(rst + glj.techQuantity).toDecimal(decimalObj.glj.quantity);
+                }
+            }
+        }
         return 0;
     },
     'JSCSXMQDDEJJZJGCF': function () {
@@ -466,10 +498,415 @@ let baseFigureTemplate = {
         if(cbTools.isUnDef(bill)) return 0;
         if(cbTools.isUnDef(bill.feesIndex) || Object.keys(bill.feesIndex).length === 0) return 0;
         return cbTools.isDef(bill.feesIndex.common) && cbTools.isDef(bill.feesIndex.common.totalFee) ? bill.feesIndex.common.totalFee : 0;
+    },
+    'SQGCZJ': function () {//税前工程造价
+        let bill = calcBase.fixedBills[calcBase.fixedFlag.SAFETY_CONSTRUCTION]['bill'];
+        if(cbTools.isUnDef(bill) || cbTools.isUnDef(bill.ID)) return 0;
+        let node = cbTools.getNodeByID(bill.ID);
+        if(cbTools.isUnDef(node)) return 0;
+        return projectObj.project.calcProgram.getBeforeTaxTotalFee([node]);
+    },
+    'RCJJC': function () {//人材机价差
+        return (this['RGJC']() + this['CLJC']() + this['JXJC']()).toDecimal(2);
+    },
+    'RGJC': function () {//人工价差
+        let rst = 0;
+        let projGljs = calcBase.project.projectGLJ.datas.gljList;
+        for(let glj of projGljs){
+            if(glj.type === gljType.LABOUR){
+                //调整价
+                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);
+            }
+        }
+        return rst;
+    },
+    'CLJC': function () {//材料价差
+        let rst = 0;
+        let projGljs = calcBase.project.projectGLJ.datas.gljList;
+        for(let glj of projGljs){
+            if(baseMaterialTypes.includes(glj.type) && glj.ratio_data.length === 0){//含有组成物的则用组成物计算,不含则自身算
+                //调整价
+                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);
+            }
+        }
+        return rst;
+    },
+    'JXJC': function () {//机械价差
+        let rst = 0;
+        let projGljs = calcBase.project.projectGLJ.datas.gljList;
+        for(let glj of projGljs){
+            if(baseMachineTypes.includes(glj.type) && glj.ratio_data.length === 0){
+                //调整价
+                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);
+            }
+        }
+        return rst;
+    },
+    'FBFXRCJJC': function () {//分部分项人材机价差
+        return (this['FBFXRGJC']() + this['FBFXCLJC']() + this['FBFXJXJC']()).toDecimal(2);
+    },
+    'FBFXRGJC': function () {//分部分项人工价差
+        let rst = 0;
+        let projGljs = calcBase.project.projectGLJ.datas.gljList;
+        for(let glj of projGljs){
+            if(glj.type === gljType.LABOUR && cbTools.isDef(glj.subdivisionQuantity)){
+                //调整价
+                let adjPrc = calcBase.project.projectGLJ.getAdjustPrice(glj);
+                //价差
+                let dffPrc = parseFloat(glj.unit_price.market_price - adjPrc).toDecimal(decimalObj.glj.unitPrice);
+                rst = (rst + parseFloat(glj.subdivisionQuantity * dffPrc).toDecimal(2)).toDecimal(2);
+            }
+        }
+        return rst;
+    },
+    'FBFXCLJC': function () {//分部分项材料价差
+        let rst = 0;
+        let projGljs = calcBase.project.projectGLJ.datas.gljList;
+        for(let glj of projGljs){
+            if(baseMaterialTypes.includes(glj.type) && cbTools.isDef(glj.subdivisionQuantity) &&glj.ratio_data.length === 0){//含有组成物的则用组成物计算,不含则自身算
+                //调整价
+                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);
+            }
+        }
+        return rst;
+    },
+    'FBFXJXJC': function () {//分部分项机械价差
+        let rst = 0;
+        let projGljs = calcBase.project.projectGLJ.datas.gljList;
+        for(let glj of projGljs){
+            if(baseMachineTypes.includes(glj.type) && cbTools.isDef(glj.subdivisionQuantity) && glj.ratio_data.length === 0){
+                //调整价
+                let adjPrc = calcBase.project.projectGLJ.getAdjustPrice(glj);
+                //价差
+                let dffPrc = parseFloat(glj.unit_price.market_price - adjPrc).toDecimal(decimalObj.glj.unitPrice);
+                rst = (rst + parseFloat(glj.subdivisionQuantity * dffPrc).toDecimal(2)).toDecimal(2);
+            }
+        }
+        return rst;
+    },
+    'JSCSXMRCJJC': function () {//技术措施项目人材机价差
+        return (this['JSCSXMRGJC']() + this['JSCSXMCLJC']() + this['JSCSXMJXJC']()).toDecimal(2);
+    },
+    'JSCSXMRGJC': function () {//技术措施项目人工价差
+        let rst = 0;
+        let projGljs = calcBase.project.projectGLJ.datas.gljList;
+        for(let glj of projGljs){
+            if(glj.type === gljType.LABOUR && cbTools.isDef(glj.techQuantity)){
+                //调整价
+                let adjPrc = calcBase.project.projectGLJ.getAdjustPrice(glj);
+                //价差
+                let dffPrc = parseFloat(glj.unit_price.market_price - adjPrc).toDecimal(decimalObj.glj.unitPrice);
+                rst = (rst + parseFloat(glj.techQuantity * dffPrc).toDecimal(2)).toDecimal(2);
+            }
+        }
+        return rst;
+    },
+    'JSCSXMCLJC': function () {//技术措施项目材料价差
+        let rst = 0;
+        let projGljs = calcBase.project.projectGLJ.datas.gljList;
+        for(let glj of projGljs){
+            if(baseMaterialTypes.includes(glj.type) && cbTools.isDef(glj.techQuantity) &&glj.ratio_data.length === 0){//含有组成物的则用组成物计算,不含则自身算
+                //调整价
+                let adjPrc = calcBase.project.projectGLJ.getAdjustPrice(glj);
+                //价差
+                let dffPrc = parseFloat(glj.unit_price.market_price - adjPrc).toDecimal(decimalObj.glj.unitPrice);
+                rst = (rst + parseFloat(glj.techQuantity * dffPrc).toDecimal(2)).toDecimal(2);
+            }
+        }
+        return rst;
+    },
+    'JSCSXMJXJC': function () {//技术措施项目机械价差
+        let rst = 0;
+        let projGljs = calcBase.project.projectGLJ.datas.gljList;
+        for(let glj of projGljs){
+            if(baseMachineTypes.includes(glj.type) && cbTools.isDef(glj.techQuantity) && glj.ratio_data.length === 0){
+                //调整价
+                let adjPrc = calcBase.project.projectGLJ.getAdjustPrice(glj);
+                //价差
+                let dffPrc = parseFloat(glj.unit_price.market_price - adjPrc).toDecimal(decimalObj.glj.unitPrice);
+                rst = (rst + parseFloat(glj.techQuantity * dffPrc).toDecimal(2)).toDecimal(2);
+            }
+        }
+        return rst;
+    },
+    'JGDEJJRGF': function () {//甲供定额基价人工费
+        let rst = 0;
+        let projGljs = calcBase.project.projectGLJ.datas.gljList;
+        for(let glj of projGljs){
+            if(glj.type === gljType.LABOUR){
+                rst = (rst + parseFloat(glj.supply_quantity * glj.basePrice).toDecimal(2)).toDecimal(2);
+            }
+        }
+        return rst;
+    },
+    'JGDEJJCLF': function () {//甲供定额基价材料费
+        let rst = 0;
+        let projGljs = calcBase.project.projectGLJ.datas.gljList;
+        for(let glj of projGljs){
+            if(baseMaterialTypes.includes(glj.type) && glj.ratio_data.length === 0){
+                rst = (rst + parseFloat(glj.supply_quantity * glj.basePrice).toDecimal(2)).toDecimal(2);
+            }
+        }
+        return rst;
+    },
+    'JGDEJJJXF': function () {//甲供定额基价机械费
+        let rst = 0;
+        let projGljs = calcBase.project.projectGLJ.datas.gljList;
+        for(let glj of projGljs){
+            if(baseMachineTypes.includes(glj.type) && glj.ratio_data.length === 0){
+                rst = (rst + parseFloat(glj.supply_quantity * glj.basePrice).toDecimal(2)).toDecimal(2);
+            }
+        }
+        return rst;
+    },
+    'JGRGF': function () {//甲供人工费
+        let rst = 0;
+        let projGljs = calcBase.project.projectGLJ.datas.gljList;
+        for(let glj of projGljs){
+            if(glj.type === gljType.LABOUR){
+                rst = (rst + parseFloat(glj.supply_quantity * glj.unit_price.market_price).toDecimal(2)).toDecimal(2);
+            }
+        }
+        return rst;
+    },
+    'JGCLF': function () {//甲供材料费
+        let rst = 0;
+        let projGljs = calcBase.project.projectGLJ.datas.gljList;
+        for(let glj of projGljs){
+            if(baseMaterialTypes.includes(glj.type) && glj.ratio_data.length === 0){
+                rst = (rst + parseFloat(glj.supply_quantity * glj.unit_price.market_price).toDecimal(2)).toDecimal(2);
+            }
+        }
+        return rst;
+    },
+    'JGJXF': function () {//甲供机械费
+        let rst = 0;
+        let projGljs = calcBase.project.projectGLJ.datas.gljList;
+        for(let glj of projGljs){
+            if(baseMachineTypes.includes(glj.type) && glj.ratio_data.length === 0){
+                rst = (rst + parseFloat(glj.supply_quantity * glj.unit_price.market_price).toDecimal(2)).toDecimal(2);
+            }
+        }
+        return rst;
+    },
+    'JGZCF': function () {//甲供主材费
+        let rst = 0;
+        let projGljs = calcBase.project.projectGLJ.datas.gljList;
+        for(let glj of projGljs){
+            if(glj.type === gljType.MAIN_MATERIAL && glj.ratio_data.length === 0){
+                rst = (rst + parseFloat(glj.supply_quantity * glj.unit_price.market_price).toDecimal(2)).toDecimal(2);
+            }
+        }
+        return rst;
+    },
+    'JGSBF': function () {//甲供设备费
+        let rst = 0;
+        let projGljs = calcBase.project.projectGLJ.datas.gljList;
+        for(let glj of projGljs){
+            if(glj.type === gljType.EQUIPMENT){
+                rst = (rst + parseFloat(glj.supply_quantity * glj.unit_price.market_price).toDecimal(2)).toDecimal(2);
+            }
+        }
+        return rst;
+    },
+    'JDDEJJRGF': function () {//甲定定额基价人工费
+        let rst = 0;
+        let projGljs = calcBase.project.projectGLJ.datas.gljList;
+        for(let glj of projGljs){
+            if(glj.type === gljType.LABOUR && glj.supply === supplyType.JDYG){
+                rst = (rst + parseFloat(glj.quantity * glj.basePrice).toDecimal(2)).toDecimal(2);
+            }
+        }
+        return rst;
+    },
+    'JDDEJJCLF': function () {//甲定定额基价材料费
+        let rst = 0;
+        let projGljs = calcBase.project.projectGLJ.datas.gljList;
+        for(let glj of projGljs){
+            if(baseMaterialTypes.includes(glj.type) && glj.ratio_data.length === 0 && glj.supply === supplyType.JDYG){
+                rst = (rst + parseFloat(glj.quantity * glj.basePrice).toDecimal(2)).toDecimal(2);
+            }
+        }
+        return rst;
+    },
+    'JDDEJJJXF': function () {//甲定定额基价机械费
+        let rst = 0;
+        let projGljs = calcBase.project.projectGLJ.datas.gljList;
+        for(let glj of projGljs){
+            if(baseMachineTypes.includes(glj.type) && glj.ratio_data.length === 0 && glj.supply === supplyType.JDYG){
+                rst = (rst + parseFloat(glj.quantity * glj.basePrice).toDecimal(2)).toDecimal(2);
+            }
+        }
+        return rst;
+    },
+    'JDRGF': function () {//甲定人工费
+        let rst = 0;
+        let projGljs = calcBase.project.projectGLJ.datas.gljList;
+        for(let glj of projGljs){
+            if(glj.type === gljType.LABOUR && glj.supply === supplyType.JDYG){
+                rst = (rst + parseFloat(glj.quantity * glj.unit_price.market_price).toDecimal(2)).toDecimal(2);
+            }
+        }
+        return rst;
+    },
+    'JDCLF': function () {//甲定材料费
+        let rst = 0;
+        let projGljs = calcBase.project.projectGLJ.datas.gljList;
+        for(let glj of projGljs){
+            if(baseMaterialTypes.includes(glj.type) && glj.ratio_data.length === 0 && glj.supply === supplyType.JDYG){
+                rst = (rst + parseFloat(glj.quantity * glj.unit_price.market_price).toDecimal(2)).toDecimal(2);
+            }
+        }
+        return rst;
+    },
+    'JDJXF': function () {//甲定机械费
+        let rst = 0;
+        let projGljs = calcBase.project.projectGLJ.datas.gljList;
+        for(let glj of projGljs){
+            if(baseMachineTypes.includes(glj.type) && glj.ratio_data.length === 0 && glj.supply === supplyType.JDYG){
+                console.log(glj);
+                rst = (rst + parseFloat(glj.quantity * glj.unit_price.market_price).toDecimal(2)).toDecimal(2);
+                console.log(rst);
+            }
+        }
+        return rst;
+    },
+    'JDZCF': function () {//甲定主材费
+        let rst = 0;
+        let projGljs = calcBase.project.projectGLJ.datas.gljList;
+        for(let glj of projGljs){
+            if(glj.type === gljType.MAIN_MATERIAL && glj.supply === supplyType.JDYG){
+                rst = (rst + parseFloat(glj.quantity * glj.unit_price.market_price).toDecimal(2)).toDecimal(2);
+            }
+        }
+        return rst;
+    },
+    'JDSBF': function () {//甲定设备费
+        let rst = 0;
+        let projGljs = calcBase.project.projectGLJ.datas.gljList;
+        for(let glj of projGljs){
+            if(glj.type === gljType.EQUIPMENT && glj.supply === supplyType.JDYG){
+                rst = (rst + parseFloat(glj.quantity * glj.unit_price.market_price).toDecimal(2)).toDecimal(2);
+            }
+        }
+        return rst;
+    },
+    'ZGCLFFZM': function () {//暂估材料费(从子目汇总)
+        let bill = calcBase.fixedBills[calcBase.fixedFlag.ENGINEERINGCOST]['bill'];
+        if(cbTools.isUnDef(bill)) return 0;
+        if(cbTools.isUnDef(bill.feesIndex) || Object.keys(bill.feesIndex).length === 0) return 0;
+        return cbTools.isDef(bill.feesIndex.estimate) && cbTools.isDef(bill.feesIndex.estimate.totalFee) ? bill.feesIndex.estimate.totalFee : 0;
+    },
+    'ZGCLFFGLJ': function () {//暂估材料费(从工料机汇总表汇总)
+        return 0;
+    },
+    'FBF': function () {//分包费
+        let rst = 0;
+        let rations = calcBase.project.Ration.datas;
+        for(let ration of rations){
+            if(ration.isSubcontract && ration.feesIndex && ration.feesIndex.common){
+                rst = parseFloat(rst + ration.feesIndex.common.totalFee).toDecimal(decimalObj.ration.totalPrice)
+            }
+        }
+        return rst;
+    },
+    'FBDEJJRGF': function () {//分包定额基价人工费
+        let rst = 0;
+        let rations = calcBase.project.Ration.datas;
+        for(let ration of rations){
+            if(ration.isSubcontract && ration.feesIndex && ration.feesIndex.labour){
+                rst = parseFloat(rst + ration.feesIndex.labour.totalFee).toDecimal(decimalObj.ration.totalPrice)
+            }
+        }
+        return rst;
+    },
+    'FBDEJJCLF': function () {//分包定额基价材料费
+        let rst = 0;
+        let rations = calcBase.project.Ration.datas;
+        for(let ration of rations){
+            if(ration.isSubcontract && ration.feesIndex && ration.feesIndex.material){
+                rst = parseFloat(rst + ration.feesIndex.material.totalFee).toDecimal(decimalObj.ration.totalPrice)
+            }
+        }
+        return rst;
+    },
+    'FBDEJJJXF': function(){//分包定额基价机械费
+        let rst = 0;
+        let rations = calcBase.project.Ration.datas;
+        for(let ration of rations){
+            if(ration.isSubcontract && ration.feesIndex && ration.feesIndex.machine){
+                rst = parseFloat(rst + ration.feesIndex.machine.totalFee).toDecimal(decimalObj.ration.totalPrice)
+            }
+        }
+        return rst;
+    },
+    'FBZCF': function () {//分包主材费
+        let rst = 0;
+        let rations = calcBase.project.Ration.datas;
+        for(let ration of rations){
+            if(ration.isSubcontract && ration.feesIndex && ration.feesIndex.mainMaterial){
+                rst = parseFloat(rst + ration.feesIndex.mainMaterial.totalFee).toDecimal(decimalObj.ration.totalPrice)
+            }
+        }
+        return rst;
+    },
+    'FBSBF': function () {//分包设备费
+        let rst = 0;
+        let rations = calcBase.project.Ration.datas;
+        for(let ration of rations){
+            if(ration.isSubcontract && ration.feesIndex && ration.feesIndex.equipment){
+                rst = parseFloat(rst + ration.feesIndex.equipment.totalFee).toDecimal(decimalObj.ration.totalPrice)
+            }
+        }
+        return rst;
+    },
+    'FBRGGR': function () {//分包人工工日
+        let rst = 0;
+        let rationIds = [];//查找定额工料机
+        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);
+                }
+                //量人 type 2, subType 1
+                else if(ration.type === rationType.volumePrice && ration.subType === volumePriceMaps['量人']){
+                    rst = parseFloat(rst + ration.quantity).toDecimal(decimalObj.glj.quantity);
+                }
+                //定额类型的人工工料机,type 3, subType 1
+                else if(ration.type === rationType.gljRation && ration.subType === gljType.LABOUR){
+                    rst = parseFloat(rst + ration.quantity).toDecimal(decimalObj.glj.quantity);
+                }
+            }
+        }
+        for(let rationID of rationIds){
+            for(let glj of rationGljs){
+                if(rationID === glj.rationID){
+                    rst = parseFloat(rst + glj.quantity).toDecimal(decimalObj.glj.quantity);
+                }
+            }
+        }
+        return rst;
     }
 };
 
+//基数的值不是通过清单节点获得的,则该基数的fixedBill为空,如价差、甲供、分包
 let baseFigureMap = {
+    //与清单直接关联=======
     '分部分项工程费': {base: 'FBFXGCF', fixedFlag: fixedFlag.SUB_ENGINERRING},
     '分部分项定额基价人工费': {base: 'FBFXDEJJRGF', fixedFlag: fixedFlag.SUB_ENGINERRING},
     '分部分项定额基价材料费': {base: 'FBFXDEJJCLF', fixedFlag: fixedFlag.SUB_ENGINERRING},
@@ -500,7 +937,46 @@ let baseFigureMap = {
     '技术措施项目清单中的定额基价直接工程费': {base: 'JSCSXMQDDEJJZJGCF', fixedFlag: fixedFlag.CONSTRUCTION_TECH},
     '其他项目费': {base: 'QTXMF',  fixedFlag: fixedFlag.OTHER},
     '规费': {base: 'GF', fixedFlag: fixedFlag.CHARGE},
-    '税金': {base: 'SJ', fixedFlag: fixedFlag.TAX}
+    '税金': {base: 'SJ', fixedFlag: fixedFlag.TAX},
+    '税前工程造价': {base: 'SQGCZJ', fixedFlag: fixedFlag.SAFETY_CONSTRUCTION},//安全文明施工专项费用使用
+    //不于清单直接关联==========
+    '人材机价差': {base: 'RCJJC'},
+    '人工价差': {base: 'RGJC'},
+    '材料价差': {base: 'CLJC'},
+    '机械价差': {base: 'JXJC'},
+    '分部分项人材机价差': {base: 'FBFXRCJJC'},
+    '分部分项人工价差': {base: 'FBFXRGJC'},
+    '分部分项材料价差': {base: 'FBFXCLJC'},
+    '分部分项机械价差': {base: 'FBFXJXJC'},
+    '技术措施项目人材机价差': {base: 'JSCSXMRCJJC'},
+    '技术措施项目人工价差': {base: 'JSCSXMRGJC'},
+    '技术措施项目材料价差': {base: 'JSCSXMCLJC'},
+    '技术措施项目机械价差': {base: 'JSCSXMJXJC'},
+    '甲供定额基价人工费': {base: 'JGDEJJRGF'},
+    '甲供定额基价材料费': {base: 'JGDEJJCLF'},
+    '甲供定额基价机械费': {base: 'JGDEJJJXF'},
+    '甲供人工费': {base: 'JGRGF'},
+    '甲供材料费': {base: 'JGCLF'},
+    '甲供机械费': {base: 'JGJXF'},
+    '甲供主材费': {base: 'JGZCF'},
+    '甲供设备费': {base: 'JGSBF'},
+    '甲定定额基价人工费': {base: 'JDDEJJRGF'},
+    '甲定定额基价材料费': {base: 'JDDEJJCLF'},
+    '甲定定额基价机械费': {base: 'JDDEJJJXF'},
+    '甲定人工费': {base: 'JDRGF'},
+    '甲定材料费': {base: 'JDCLF'},
+    '甲定机械费': {base: 'JDJXF'},
+    '甲定主材费': {base: 'JDZCF'},
+    '甲定设备费': {base: 'JDSBF'},
+    '暂估材料费(从子目汇总)': {base: 'ZGCLFFZM'},
+    '暂估材料费(从工料机汇总表汇总)': {base: 'ZGCLFFGLJ'},
+    '分包费': {base: 'FBF'},
+    '分包定额基价人工费': {base: 'FBDEJJRGF'},
+    '分包定额基价材料费': {base: 'FBDEJJCLF'},
+    '分包定额基价机械费': {base: 'FBDEJJJXF'},
+    '分包主材费': {base: 'FBZCF'},
+    '分包设备费': {base: 'FBSBF'},
+    '分包人工工日': {base: 'FBRGGR'}
 };
 
 //输入式分析器
@@ -576,7 +1052,7 @@ let cbAnalyzer = {
             let figure = figureF[i];
             let bill = null;
             if(figure.type === 'base' && cbTools.isDef(baseFigures[figure.value])){
-                bill = baseFigures[figure.value]['fixedBill']['bill'];
+                bill = cbTools.isDef(baseFigures[figure.value]['fixedBill']) ? baseFigures[figure.value]['fixedBill']['bill'] : null;
             }
             else if(figure.type === 'id'){
                 let node = cbTools.getNodeByID(figure.value);
@@ -868,7 +1344,7 @@ let calcBase = {
         cbTools.setBaseFigureClass(me.baseFigures, me.baseFigureClass);
     },
     getBase: function (figure) {
-       return cbCalctor.base(figure);
+        return cbCalctor.base(figure);
 
     },
     getBaseByClass: function (node) {

+ 130 - 129
web/building_saas/main/js/models/calc_program.js

@@ -192,6 +192,7 @@ let calcTools = {
     },
     // 参数fieldName值: 'common.totalFee'、'equipment.unitFee'
     getFee: function (treeNode, fieldName) {
+        if (!treeNode) return 0;
         let ns = fieldName.split(".");
         if (ns.length != 2)
             return 0
@@ -552,7 +553,6 @@ const rationCalcBases = {
 
 let analyzer = {
     calcTemplate: null,
-    success: true,
 
     standard: function(expr){
         let str = expr;
@@ -562,132 +562,113 @@ let analyzer = {
         str = str.replace(/f/g, "F");               // f换成F
         return str;
     },
-
-    analyzeCalcBase: function(expr){
-        // 前提:必须无空格、无特殊符号
-        function getCalcBase(expr){
-            let base = '',
-                iPos1 = -1, iPos2 = -1;
-            for (let i = 0; i < expr.length; i++) {
-                if (expr[i] === '['){
-                    iPos1 = i;
+    getFArr: function (expr) {
+        let pattF = new RegExp(/F\d+/gi);
+        let arrF = expr.match(pattF);
+        return arrF ? arrF : [];
+    },
+    getAtIDArr: function (expr) {
+        let patt = new RegExp(/@\d+/gi);
+        let arr = expr.match(patt);
+        return arr ? arr : [];
+    },
+    getFID: function (FName) {          // F3、F22
+        let me = this;
+        let idx = FName.slice(1) - 1;
+        let id = me.calcTemplate.calcItems[idx] ? me.calcTemplate.calcItems[idx].ID : null;
+        return id;
+    },
+    getFItem: function (FName){
+        let me = this;
+        let idx = FName.slice(1) - 1;
+        return me.calcTemplate.calcItems[idx];
+    },
+    isCycleCalc: function (expr) {     // @5+@6  这里已经是ID引用
+        let me = this;
+        
+        function isCycle(nodeExpr) {
+            let atIDArr = me.getAtIDArr(nodeExpr);
+            for (let atID of atIDArr){
+                let ID = atID.slice(1);
+                let item = me.calcTemplate.compiledCalcItems[ID];
+                if (item.expression.includes(atID)) {
+                    return true;
                 }
-                else if (iPos1 != -1 && expr[i]===']'){
-                    iPos2 = i;
-                };
-
-                if (iPos1 != -1 && iPos2 != -1){
-                    base = expr.slice(iPos1, iPos2 + 1);
-                    break;
+                else {
+                    isCycle(item.expression);
                 }
             };
-            return base;
+            return false;
         };
-        function calcBaseToIDExpr(base){
-            /*// for test. 公路模式,基数到ID
-            let id = -1;
-            if (base == '[人工费]'){
-                id = 111;
-            }
-            else if (base == '[材料费]'){
-                id = 222;
-            }
-            else if (base == '[机械费]'){
-                id = 333;
-            }
-            else id = "错误";
 
-            return "@('" + id + "')";*/
-            let baseValue = base.slice(1, -1);
-            return "base('" + baseValue + "')";
-        };
-
-        while (expr.indexOf('[') > 0) {
-            let base = getCalcBase(expr);
-            let id = calcBaseToIDExpr(base);
-            let baseValue = base.slice(1, -1);   // []会给下面的正则带来干扰,这里去掉
-            var pattBase =new RegExp(baseValue, "g");
-            expr = expr.replace(pattBase, id);
-            expr = expr.replace(/\[base\('/g, "base('");      // [@('       [base('
-            expr = expr.replace(/'\)\]/g, "')");        // ')]
-        };
-
-        return expr;
+        return isCycle(expr);
     },
-
-    analyzeLineRef: function(expr){
+    isLegal: function (expr) {   // 调用前必须先标准化
         let me = this;
-        function isOperator(char){
-            var operator = "+-*/()";
-            return operator.indexOf(char) > -1;
-        };
-        function lineNumToID(lineNum){
-            if (lineNum > me.calcTemplate.calcItems.length){
-                me.success = false;
-                return '越界';
-            }
-            else{
-                let id = me.calcTemplate.calcItems[lineNum - 1].ID;
-                return id;
-            }
+
+        let invalidChars = /[^0-9\u4e00-\u9fa5\+\-\*\/\(\)\.\[\]F%]/g;
+        if (invalidChars.test(expr)){
+            alert('表达式中含有无效的字符!');
+            return false;
         };
-        // 前提:必须无空格、无特殊符号、标准大写F
-        function getSection(expr){
-            let section = '',
-                iPos1 = -1, iPos2 = -1;
-            for (let i = 0; i < expr.length; i++) {
-                if (expr[i] === 'F'){
-                    iPos1 = i;
-                }
-                else if (iPos1 != -1 && isOperator(expr[i])){
-                    iPos2 = i;
-                }
-                else if (iPos1 != -1 && i == expr.length - 1){
-                    iPos2 = i + 1;
 
-                };
-                if (iPos1 != -1 && iPos2 != -1){
-                    section = expr.slice(iPos1, iPos2);
-                    break;
-                }
+        let pattCn = new RegExp(/[\u4E00-\u9FA5]+/gi);
+        let arrCn = expr.match(pattCn);
+        let pattBase = new RegExp(/\[[\u4E00-\u9FA5]+\]/gi);
+        let arrBase = expr.match(pattBase);
+        if (arrCn.length != arrBase.length){
+            for (let cn of arrCn){
+                let tempBase = `[${cn}]`;
+                  if (!arrBase.includes(tempBase)){
+                      alert(`定额基数“${cn}”必须用中括号[]括起来!`);
+                      return false;
+                  }
             };
-            return section;
+            // 这里要加一个保险。因为上面的 for 循环在“主材费 + [主材费]” 情况下有Bug
+            alert('定额基数必须用中括号[]括起来!');
+            return false;
         };
-        function sectionToIDExpr(section){
-            if (section){
-                let lineNum = section.slice(1);
-                if (isNaN(lineNum)){
-                    me.success = false;
-                    return '错误';      // 这里的返回提示不能加上section,因为会无限循环
-                }
-                else
-                    return "@('" + lineNumToID(lineNum) + "')";
+
+        for (let base of arrBase){
+            let baseName = base.slice(1, -1);
+            if (!rationCalcBases[baseName]){
+                alert('定额基数 [' + baseName + '] 末定义!');
+                return false;
             }
-            else return '';
         };
 
-        while (expr.indexOf('F') > 0) {
-            let sec = getSection(expr);
-            let id = sectionToIDExpr(sec);
-            var pattSec =new RegExp(sec, "g");
-            expr = expr.replace(pattSec, id);
+        // 行引用检测、行引用转ID引用
+        let arrF = me.getFArr(expr);
+        for (let F of arrF){
+            let num = F.slice(1);
+            if (num > me.calcTemplate.calcItems.length){
+                alert('表达式中 “F'+ num +'” 行号引用错误!');
+                return false;
+            };
+            let id = me.getFID(F);
+            let fn = new RegExp(F, "g");
+            expr = expr.replace(fn, `@('${id}')`);
         };
-        return expr;
-    },
 
+        // 循环计算
+        if (me.isCycleCalc(expr)){
+            alert('表达式中有循环计算!');
+            return false;
+        }
+
+        return true;
+    },
     analyzeUserExpr: function(calcTemplate, calcItem){
         let me = this;
         me.calcTemplate = calcTemplate;
         let expr = calcItem.dispExpr;
-        // 标准化:处理特殊字符、中文符号、大小写
         expr = me.standard(expr);
         calcItem.dispExpr = expr;
-        // 先换掉计算基数
-        expr = me.analyzeCalcBase(expr);
-        // 再换掉行引用
-        expr = me.analyzeLineRef(expr);
-        calcItem.expression = expr;
-        return me.success;
+        if (me.isLegal(expr)){
+            calcItem.expression = expr;
+            return true;
+        }else
+            return false;
     }
 };
 
@@ -997,10 +978,12 @@ class CalcProgram {
             let nodes = (treeNode.calcType == treeNodeCalcType.ctGatherBillsFees) ? treeNode.children : me.project.Ration.getRationNodes(treeNode);
             let rst = [];
             for (let ft of cpFeeTypes) {
+                let isEstimate = ft.name == '暂估费';
                 let ftObj = {};
                 ftObj.fieldName = ft.type;
                 ftObj.name = ft.name;
                 let buf = 0, btf = 0, btuf = 0, bttf = 0;
+                let bq = calcTools.uiNodeQty(treeNode) ? calcTools.uiNodeQty(treeNode) : 1;
 
                 if (treeNode.calcType == treeNodeCalcType.ctGatherBillsFees){
                     for (let node of nodes) {
@@ -1015,7 +998,6 @@ class CalcProgram {
                 }
                 else if (treeNode.calcType == treeNodeCalcType.ctGatherRationsFees){     // 这里的算法要配合冷姐姐的神图才能看懂^_^
                     let sum_rtf = 0, sum_rttf = 0;
-                    let bq = calcTools.uiNodeQty(treeNode) ? calcTools.uiNodeQty(treeNode) : 1;
                     for (let node of nodes) {
                         let rq = calcTools.uiNodeQty(node) ? calcTools.uiNodeQty(node) : 0;
                         let ruf = 0, rtuf = 0, rtf = 0, rttf = 0;
@@ -1026,33 +1008,46 @@ class CalcProgram {
                             rttf = parseFloat(node.data.feesIndex[ft.type].tenderTotalFee);
                         };
                         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 * rq / bq).toDecimal(decimalObj.bills.unitFee)).toDecimal(decimalObj.bills.unitFee);
+                            btuf = (btuf + (rtuf * rq / bq).toDecimal(decimalObj.bills.unitFee)).toDecimal(decimalObj.bills.unitFee);
                         };
                         sum_rtf = (sum_rtf + rtf).toDecimal(decimalObj.process);
                         sum_rttf = (sum_rttf + rttf).toDecimal(decimalObj.process);
                     };
-
-                    if (me.project.property.billsCalcMode == leafBillGetFeeType.rationPriceConverse ||
-                        me.project.property.billsCalcMode == leafBillGetFeeType.rationPrice) {
-                        buf = (sum_rtf / bq).toDecimal(decimalObj.process);
-                        btuf = (sum_rttf / bq).toDecimal(decimalObj.process);
-                    };
-                    if (isBaseFeeType(ft.type) ||
-                        (me.project.property.billsCalcMode === leafBillGetFeeType.rationPrice && ft.type == "common")){
+                    if (isEstimate){
                         btf = sum_rtf;
                         bttf = sum_rttf;
-                    }
-                    else{
-                        btf = (buf.toDecimal(decimalObj.bills.unitPrice) * bq).toDecimal(decimalObj.process);
-                        bttf = (btuf.toDecimal(decimalObj.bills.unitPrice) * bq).toDecimal(decimalObj.process);
+                    }else{
+                        if (me.project.property.billsCalcMode == leafBillGetFeeType.rationPriceConverse ||
+                            me.project.property.billsCalcMode == leafBillGetFeeType.rationPrice) {
+                            buf = (sum_rtf / bq).toDecimal(decimalObj.process);
+                            btuf = (sum_rttf / bq).toDecimal(decimalObj.process);
+                        };
+                        if (isBaseFeeType(ft.type) ||
+                            (me.project.property.billsCalcMode === leafBillGetFeeType.rationPrice && ft.type == "common")){
+                            btf = sum_rtf;
+                            bttf = sum_rttf;
+                        }
+                        else{
+                            btf = (buf.toDecimal(decimalObj.bills.unitPrice) * bq).toDecimal(decimalObj.process);
+                            bttf = (btuf.toDecimal(decimalObj.bills.unitPrice) * bq).toDecimal(decimalObj.process);
+                        };
                     };
                 };
 
-                ftObj.unitFee = buf.toDecimal(decimalObj.bills.unitPrice);
                 ftObj.totalFee = btf.toDecimal(decimalObj.bills.totalPrice);
-                ftObj.tenderUnitFee = btuf.toDecimal(decimalObj.bills.unitPrice);
                 ftObj.tenderTotalFee = bttf.toDecimal(decimalObj.bills.totalPrice);
+                if (isEstimate){
+                    if (treeNode.calcType == treeNodeCalcType.ctGatherRationsFees){
+                        ftObj.unitFee = (ftObj.totalFee / bq).toDecimal(decimalObj.bills.unitPrice);
+                        ftObj.tenderUnitFee = (ftObj.tenderTotalFee / bq).toDecimal(decimalObj.bills.unitPrice);
+                    }
+                }
+                else{
+                    ftObj.unitFee = buf.toDecimal(decimalObj.bills.unitPrice);
+                    ftObj.tenderUnitFee = btuf.toDecimal(decimalObj.bills.unitPrice);
+                }
+
                 calcTools.checkFeeField(treeNode, ftObj);
 
                 rst.push(ftObj);
@@ -1321,11 +1316,8 @@ class CalcProgram {
     };
 
     // 排除指定项的综合合价计算(用于带循环计算的情况)
-    getTotalFee(excludeNodes){
-        excludeNodes.push(calcTools.getNodeByFlag(fixedFlag.ENGINEERINGCOST));
-        let me = this;
+    getTotalFee(baseNodes, excludeNodes){
         let rst = 0;
-
         function calcNodes(nodes) {
             for (let node of nodes) {
                 if (!excludeNodes.includes(node)){
@@ -1334,14 +1326,23 @@ class CalcProgram {
                     }
                     else{
                         if (node.sourceType != ModuleNames.ration_glj) {
-                            rst = (rst + calcTools.getFee(node, 'common.totalFee')).toDecimal(decimalObj.bills.totalPrice);
+                            rst = (rst + calcTools.getFee(node, 'common.totalFee')).toDecimal(decimalObj.decimal("totalPrice", node));
                         };
                     }
                 }
             }
         };
-
-        calcNodes(me.project.mainTree.roots);
+        calcNodes(baseNodes);
         return rst;
     };
+
+    // 税前工程造价
+    getBeforeTaxTotalFee(excludeNodes){
+        let baseNodes = [], me = this;
+        baseNodes.push(calcTools.getNodeByFlag(fixedFlag.SUB_ENGINERRING));
+        baseNodes.push(calcTools.getNodeByFlag(fixedFlag.MEASURE));
+        baseNodes.push(calcTools.getNodeByFlag(fixedFlag.OTHER));
+        baseNodes.push(calcTools.getNodeByFlag(fixedFlag.CHARGE));
+        return me.getTotalFee(baseNodes, excludeNodes);
+    };
 };

+ 33 - 0
web/building_saas/main/js/models/installation_fee.js

@@ -0,0 +1,33 @@
+/**
+ * Created by zhang on 2018/1/31.
+ */
+var installation_fee = {
+    createNew: function (project) {
+        // 用户定义private方法
+        var tools = {};
+
+        // 所有通过this访问的属性,都不应在此单元外部进行写入操作
+        var installation_fee = function (proj) {
+            // this.project = proj;
+            this.datas = [];
+
+            var sourceType = ModuleNames.installation_fee;
+            this.getSourceType = function () {
+                return sourceType;
+            }
+            proj.registerModule(ModuleNames.installation_fee, this);
+        };
+
+        // prototype用于定义public方法
+        installation_fee.prototype.loadData = function (datas) {
+            this.datas = datas;
+        };
+
+        // 提交数据后返回数据处理
+        installation_fee.prototype.doAfterUpdate = function(err, data){
+
+        };
+        return new installation_fee(project);
+    }
+
+};

+ 51 - 2
web/building_saas/main/js/models/main_consts.js

@@ -12,7 +12,8 @@ const ModuleNames = {
     ration_ass:'ration_ass',
     quantity_detail:'quantity_detail',
     labour_coe: 'labour_coe',
-    calc_program: 'calc_program'
+    calc_program: 'calc_program',
+    installation_fee:'installation_fee'
 };
 
 const gljType = {
@@ -54,6 +55,11 @@ const baseMaterialTypes = [
     gljType.COMMERCIAL_CONCRETE,
     gljType.COMMERCIAL_MORTAR
 ];
+const baseMachineTypes = [
+    gljType.GENERAL_MACHINE,
+    gljType.MACHINE_COMPOSITION,
+    gljType.MACHINE_LABOUR
+];
 // 全部材料类型。用于暂估等 (多了主材和设备)
 const allMaterialTypes = [
     gljType.GENERAL_MATERIAL,
@@ -158,6 +164,18 @@ const zanguCalcType = {
     gatherMaterial: 1
 };
 
+//供货方式
+const supplyType = {
+    //自行采购
+    ZXCG: 0,
+    //部分甲供
+    BFJG: 1,
+    //完全甲供
+    WQJG: 2,
+    //甲定乙供
+    JDYG: 3
+};
+
 //清单固定行
 const fixedFlag = {
     // 分部分项工程
@@ -233,4 +251,35 @@ const cpFeeTypes = [
     {type: 'adjustMachineLabour', name: '调整机上人工费'},
     {type: 'estimate', name: '暂估费'},
     {type: 'common', name: '工程造价'}
-];
+];
+
+const engineeringType = {
+    // 建筑工程
+    ARCHITECTURE: 1,
+    // 装饰工程
+    DECORATE: 2,
+    // 仿古建筑工程
+    ANTIQUE_ARCHITECTURE: 3,
+    // 安装工程
+    BUILD_IN: 4,
+    // 市政土建工程
+    MUNICIPAL_CONSTRUCTION: 5,
+    // 市政安装工程
+    MUNICIPAL_BUILD_IN: 6,
+    // 人工土石方工程
+    ARTIFICIAL_EARTHWORK: 7,
+    // 机械土石方工程
+    MECHANICAL_EARTHWORK: 8,
+    // 炉窖砌筑工程
+    KILN_MASONRY: 9,
+    // 园林工程
+    GARDEN: 10,
+    // 绿化工程
+    PLANTING: 11,
+    // 单拆除工程
+    DISMANTLE: 12,
+    // 建筑修缮工程
+    BUILDING_REPAIR: 13,
+    // 安装修缮工程
+    BUILD_IN_REPAIR: 14
+};

+ 1 - 0
web/building_saas/main/js/models/project.js

@@ -80,6 +80,7 @@ var PROJECT = {
             this.ration_coe = ration_coe.createNew(this);
             this.ration_ass = ration_ass.createNew(this);
             this.quantity_detail = quantity_detail.createNew(this);
+            this.installation_fee = installation_fee.createNew(this);
             this.FeeRate = FeeRate.createNew(this);
             // this.VolumePrice = VolumePrice.createNew(this);
             this.projectGLJ = new ProjectGLJ();

+ 0 - 2
web/building_saas/main/js/models/ration_ass.js

@@ -125,6 +125,4 @@ var ration_ass = {
         return new ration_ass(project);
     }
 
-
-
 };

+ 47 - 0
web/building_saas/main/js/views/installation_fee_view.js

@@ -0,0 +1,47 @@
+/**
+ * Created by zhang on 2018/1/30.
+ */
+let installationFeeObj={
+    rationInstallSheet:null,
+    installationFeeSpread:null,
+    rationInstallsetting: {
+        header: [
+            {headerName: "按统一设置", headerWidth: 100, dataCode: "name", dataType: "String"},
+            {headerName: "费用项", headerWidth: 120, dataCode: "stdValue", hAlign: "right", dataType: "String"},
+            {headerName: "费用规则", headerWidth: 120, dataCode: "actualValue", hAlign: "right", dataType: "String"},
+            {headerName: "编码", headerWidth: 120, dataCode: "actualValue", hAlign: "right", dataType: "String"},
+            {headerName: "基数", headerWidth: 120, dataCode: "actualValue", hAlign: "right", dataType: "String"},
+            {headerName: "费率(%)", headerWidth: 120, dataCode: "actualValue", hAlign: "right", dataType: "String"},
+            {headerName: "其中人工(%)", headerWidth: 120, dataCode: "actualValue", hAlign: "right", dataType: "String"},
+            {headerName: "其中材料(%)", headerWidth: 120, dataCode: "actualValue", hAlign: "right", dataType: "String"},
+            {headerName: "其中机械(%)", headerWidth: 120, dataCode: "actualValue", hAlign: "right", dataType: "String"},
+            {headerName: "费用类型", headerWidth: 120, dataCode: "actualValue", hAlign: "right", dataType: "String"},
+            {headerName: "记取位置", headerWidth: 120, dataCode: "actualValue", hAlign: "right", dataType: "String"}
+        ],
+        view: {
+            lockColumns: [0, 1]
+        }
+    },
+    showCalcInstallSettingDiv:function () {
+        $("#calc_installation_fee").modal({show:true});
+    },
+    engineeringTypeChecking:function () {
+        let property = projectInfoObj.projectInfo.property;
+        let engineering = property.engineering;
+        if(engineering==engineeringType.BUILD_IN){//如果是安装工程,则显示
+            $('#AZZJF_div').show();
+        }
+    }
+};
+
+$(function () {
+    $('#calc_installation_fee').on('shown.bs.modal',function () {
+        if(installationFeeObj.installationFeeSpread == null){//初始化显示
+
+        }
+
+    })
+
+
+
+});

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

@@ -49,7 +49,7 @@ let MainTreeCol = {
         },
         marketPrice:function (node) {
             if((node.sourceType === projectObj.project.Ration.getSourceType()&&node.data.type!=rationType.ration)||node.sourceType==projectObj.project.ration_glj.getSourceType()){
-                return assistCalcer.uiGLJPrice(node.data.marketUnitFee);
+                return calcTools.uiGLJPrice(node.data.marketUnitFee);
             }
         }
     },

+ 24 - 9
web/building_saas/main/js/views/project_view.js

@@ -16,8 +16,6 @@ var projectObj = {
         let project = projectObj.project;
         subViewObj.loadComments(node);
         gljOprObj.showDataIfRationSelect(node);
-
-        // CSL.2017.07.25
         if (activeSubSheetIs(subSheetIndex.ssiCalcProgram)) {
             calcProgramObj.showData(node);
         };
@@ -37,6 +35,15 @@ var projectObj = {
         node.data.isSubcontract = true;
         let bname = '分包人工工日';
         alert(bname + ': ' + rationCalcBases[bname](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);
+        alert(`${rst}: ` + JSON.stringify(c));*/
     },
     refreshBaseActn: function (tree) {
         let setButtonValid = function (valid, btn) {
@@ -426,13 +433,6 @@ var projectObj = {
                 const autoHeight = that.project.property.displaySetting !== undefined ?
                     that.project.property.displaySetting.autoHeight : false;
                 that.project.projSetting.mainGridSetting.cols.forEach(function (col) {
-                    // for test.  后端没有绑定,暂时写死用于测试。
-/*                    if (col.data.field == '' && col.head.titleNames[0] == "取费专业") {
-                        col.data.field = 'programID';
-                        col.data.getText = 'getText.calcProgramName';
-                        col.data.cellType = 'cellType.calcProgramName';
-                    };*/
-
                     col.data.splitFields = col.data.field.split('.');
                     if (col.data.getText && Object.prototype.toString.apply(col.data.getText) === "[object String]") {
                         col.data.getText = MainTreeCol.getEvent(col.data.getText);
@@ -497,6 +497,7 @@ var projectObj = {
                 console.log("加载完成-----"+endTime);
                 console.log(`时间——${endTime - startTime}`);
                 that.project.projectMarkChecking();//是否需要重新进行造价计算
+                installationFeeObj.engineeringTypeChecking();//检查是否安装工程
             }
             else {
 
@@ -705,6 +706,20 @@ var projectObj = {
                         return true;
                     }
                 },
+                "calc_installation_fee": {
+                    name: "计取安装费用",
+                    icon: 'fa-sign-in',
+                    disabled: function () {
+                        return false;
+                    },
+                    callback: function (key, opt) {
+                        installationFeeObj.showCalcInstallSettingDiv();
+                    },
+                    visible: function(key, opt){
+                        let engineering = projectInfoObj.projectInfo.property.engineering;
+                        return engineering==engineeringType.BUILD_IN;
+                    }
+                },
                 "spr1": '--------',
                 "delete": {
                     name: '删除',

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

@@ -8,7 +8,7 @@ contentOprObj.buildSheet($("#jobSpread")[0]);
 characterOprObj.buildSheet($("#itemSpread")[0]);
 $("#tzjnrCon").hide();
 $("#subSpread").show();
-var subSpread = sheetCommonObj.createSpread($("#subSpread")[0], 5);
+var subSpread = sheetCommonObj.createSpread($("#subSpread")[0], 6);
 subSpread.getSheet(4).name('JSCX');
 
 pageCCOprObj.active = false;

+ 2 - 5
web/building_saas/main/js/views/zlfb_view.js

@@ -20,7 +20,7 @@ let zlfb_object={
                     FX_nodes.push(tem_node);
                     let l_code = zlfb_object.getLibCode(tem_node.data.code);
                     if(tem_node.data.billsLibId&&l_code!=false){
-                        reorganize= true;
+                        reorganize = true;
                         if(codeMap[l_code]){
                             codeMap[l_code].push(tem_node);
                         }else {
@@ -243,7 +243,6 @@ let zlfb_object={
         }
         updateData.projectID = FBFX.data.projectID;
         updateData.user_id = userID;
-        console.log(updateData);
         CommonAjax.post('/bills/reorganizeFBFX',updateData,function (data) {
             //更新前端缓存
             let billDatas = projectObj.project.Bills.datas;
@@ -285,8 +284,6 @@ let zlfb_object={
         },function () {
             //errorCallback
         });
-        console.log(newDataMap);
-        console.log(allNewNode);
     }
 }
 
@@ -300,4 +297,4 @@ $(function () {
         zlfb_object.sectionInfo=null;
     })
 
-})
+});