Browse Source

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

Conflicts:
	web/building_saas/main/js/views/project_property_display_view.js
	web/building_saas/main/js/views/project_view.js
zhangweicheng 7 years ago
parent
commit
9078b6c308

+ 43 - 14
modules/reports/rpt_component/helper/jpc_helper_area.js

@@ -8,29 +8,58 @@ let JpcAreaHelper = {
             let areaWidth = 1.0 * (band[JV.PROP_RIGHT] - band[JV.PROP_LEFT]) / multipleDispCol;
             areaWidth = areaWidth / colAmount;
             let innerLeft = 0.0, innerRight = areaWidth;
-            switch (areaNode[JV.PROP_H_CALCULATION]) {
-                case JV.CAL_TYPE[JV.CAL_TYPE_PERCENTAGE] :
+            //
+            if (typeof areaNode[JV.PROP_H_CALCULATION]  === "string") {
+                switch (areaNode[JV.PROP_H_CALCULATION]) {
+                    case JV.CAL_TYPE[JV.CAL_TYPE_PERCENTAGE] :
+                        innerLeft = (1.0 * areaNode[JV.PROP_LEFT] * areaWidth / JV.HUNDRED_PERCENT);
+                        innerRight = (1.0 * areaNode[JV.PROP_RIGHT] * areaWidth / JV.HUNDRED_PERCENT);
+                        break;
+                    case JV.CAL_TYPE[JV.CAL_TYPE_ABSTRACT] :
+                        innerLeft = 1.0 * areaNode[JV.PROP_LEFT] * unitFactor;
+                        innerRight = 1.0 * areaNode[JV.PROP_RIGHT] * unitFactor;
+                        break;
+                }
+            } else {
+                //颗粒度更加细化的控制,可能左右两边的计算坐标方式都不同
+                if (areaNode[JV.PROP_H_CALCULATION][JV.PROP_LEFT] === JV.CAL_TYPE[JV.CAL_TYPE_PERCENTAGE]) {
                     innerLeft = (1.0 * areaNode[JV.PROP_LEFT] * areaWidth / JV.HUNDRED_PERCENT);
-                    innerRight = (1.0 * areaNode[JV.PROP_RIGHT] * areaWidth / JV.HUNDRED_PERCENT) ;
-                    break;
-                case JV.CAL_TYPE[JV.CAL_TYPE_ABSTRACT] :
+                } else {
                     innerLeft = 1.0 * areaNode[JV.PROP_LEFT] * unitFactor;
-                    innerRight = 1.0 * areaNode[JV.PROP_RIGHT] * unitFactor ;
-                    break;
+                }
+                if (areaNode[JV.PROP_H_CALCULATION][JV.PROP_RIGHT] === JV.CAL_TYPE[JV.CAL_TYPE_PERCENTAGE]) {
+                    innerRight = (1.0 * areaNode[JV.PROP_RIGHT] * areaWidth / JV.HUNDRED_PERCENT);
+                } else {
+                    innerRight = 1.0 * areaNode[JV.PROP_RIGHT] * unitFactor;
+                }
             }
             //2. calculate top/bottom
             let  areaHeight = 1.0 * (band[JV.PROP_BOTTOM] - band[JV.PROP_TOP]);
             areaHeight = areaHeight / rowAmount;
             let innerTop = 0.0, innerBottom = areaHeight;
-            switch (areaNode[JV.PROP_V_CALCULATION]) {
-                case JV.CAL_TYPE[JV.CAL_TYPE_PERCENTAGE] :
+            if (typeof areaNode[JV.PROP_V_CALCULATION]  === "string") {
+                switch (areaNode[JV.PROP_V_CALCULATION]) {
+                    case JV.CAL_TYPE[JV.CAL_TYPE_PERCENTAGE] :
+                        innerTop = (1.0 * areaNode[JV.PROP_TOP] * areaHeight / JV.HUNDRED_PERCENT);
+                        innerBottom = (1.0 * areaNode[JV.PROP_BOTTOM] * areaHeight / JV.HUNDRED_PERCENT);
+                        break;
+                    case JV.CAL_TYPE[JV.CAL_TYPE_ABSTRACT] :
+                        innerTop = 1.0 * areaNode[JV.PROP_TOP] * unitFactor;
+                        innerBottom = 1.0 * areaNode[JV.PROP_BOTTOM] * unitFactor;
+                        break;
+                }
+            } else {
+                //颗粒度更加细化的控制,可能上下两边的计算坐标方式都不同
+                if (areaNode[JV.PROP_H_CALCULATION][JV.PROP_TOP] === JV.CAL_TYPE[JV.CAL_TYPE_PERCENTAGE]) {
                     innerTop = (1.0 * areaNode[JV.PROP_TOP] * areaHeight / JV.HUNDRED_PERCENT);
-                    innerBottom = (1.0 * areaNode[JV.PROP_BOTTOM] * areaHeight / JV.HUNDRED_PERCENT) ;
-                    break;
-                case JV.CAL_TYPE[JV.CAL_TYPE_ABSTRACT] :
+                } else {
                     innerTop = 1.0 * areaNode[JV.PROP_TOP] * unitFactor;
-                    innerBottom = 1.0 * areaNode[JV.PROP_BOTTOM] * unitFactor ;
-                    break;
+                }
+                if (areaNode[JV.PROP_H_CALCULATION][JV.PROP_BOTTOM] === JV.CAL_TYPE[JV.CAL_TYPE_PERCENTAGE]) {
+                    innerBottom = (1.0 * areaNode[JV.PROP_BOTTOM] * areaHeight / JV.HUNDRED_PERCENT);
+                } else {
+                    innerBottom = 1.0 * areaNode[JV.PROP_BOTTOM] * unitFactor;
+                }
             }
             //
             let rstLeft = 0.0, rstRight = 0.0, rstTop = 0.0, rstBottom = 0.0;

+ 2 - 1
server.js

@@ -52,7 +52,8 @@ app.use(bodyParser.json({limit: '3mb'}));
 app.use(session({
     name: 'usersSession',
     secret: 'session users secret',
-    cookie: {maxAge: 1000*60*60},
+    // @todo 上线前修改回正常值 (目前为24小时)
+    cookie: {maxAge: 3600 * 24 * 1000},
     resave: false,
     rolling: true,
     saveUninitialized: true

+ 4 - 0
web/building_saas/css/main.css

@@ -319,4 +319,8 @@ body {
 }
 .text-green{
     color: #172a30
+}
+label.title{
+    display: inline-block;
+    width: 100px;
 }

+ 76 - 17
web/building_saas/main/html/main.html

@@ -120,9 +120,67 @@
                                           <textarea class="form-control" rows="8" readonly=""></textarea>
                                       </div>
                                       <div id="tzjnrCon" class="main-data-bottom">
-                                          <div class="main-data-bottom ovf-hidden" style="width: 40%; float: left;" id="jobSpread">
+                                          <div class="main-data-bottom ovf-hidden" style="width: 33%; float: left;" id="jobSpread">
                                           </div>
-                                          <div class="main-data-bottom ovf-hidden" style="width: 60%; float: left;" id="itemSpread">
+                                          <div class="main-data-bottom ovf-hidden" style="width: 33%; float: left;" id="itemSpread">
+                                          </div>
+                                          <div id="add-rule" style="width: 33%;float: left;background: #EFEFEF; height: 100%;display: none;">
+                                              <p style="text-align: center">添加规则</p>
+                                              <p>
+                                                  <label class="title">添加位置:</label>
+                                                  <select name="" id="add-position">
+                                                      <option value="">添加到项目特征列</option>
+                                                      <option value="">添加到清单名称列</option>
+                                                      <option value="">添加到工作内容列</option>
+                                                      <option value="">分别添加到对应列</option>
+                                                  </select>
+                                              </p>
+                                              <p>
+                                                  <label class="title">添加内容:</label>
+                                                  <select name="" id="add-content">
+                                                      <option value="">无</option>
+                                                      <option value="">项目特征+工作内容</option>
+                                                      <option value="">工作内容+项目特征</option>
+                                                      <option value="">项目特征</option>
+                                                      <option value="">工作内容</option>
+                                                      <option value="">定额子目</option>
+                                                  </select>
+                                              </p>
+                                              <p>
+                                                  <label class="title">显示格式:</label>
+                                                  <select name="" id="format">
+                                                      <option value="">换行分隔</option>
+                                                      <option value="">逗号分隔</option>
+                                                      <option value="">括号分隔</option>
+                                                  </select>
+                                              </p>
+                                              <p>
+                                                  <label class="title">特征生成方式:</label>
+                                                  <select name="" id="">
+                                                      <option value="">特征值</option>
+                                                      <option value="">特征:特征值</option>
+                                                  </select>
+                                              </p>
+                                              <p>
+                                                  <label class="title">子目生成方式:</label>
+                                                  <select name="" id="">
+                                                      <option value="">编号+定额名称</option>
+                                                      <option value="">序号+定额名称</option>
+                                                  </select>
+                                              </p>
+                                              <p>
+                                                  <label class="title">序号格式:</label>
+                                                  <select name="" id="">
+                                                      <option value="">无</option>
+                                                      <option value="">1.</option>
+                                                      <option value="">a.</option>
+                                                      <option value="">A.</option>
+                                                  </select>
+                                              </p>
+                                              <p style="text-align: center">
+                                                  <button class="btn btn-primary btn-sm" type="button">应用到选中清单</button>
+                                                  <button class="btn btn-primary btn-sm" type="button">应用到所有清单</button>
+                                              </p>
                                           </div>
                                       </div>
                                   </div>
@@ -235,7 +293,7 @@
                                 <li class="nav-item"><a class="nav-link" data-toggle="pill" href="#poj-settings-billsQuanDecimal" id="tab_poj-settings-bqDecimal" role="tab">清单工程量精度</a></li>
                                 <li class="nav-item"><a class="nav-link" data-toggle="pill" href="#poj-settings-decimal" role="tab" id="tab_poj-settings-decimal">小数位数</a></li>
                                 <li class="nav-item"><a class="nav-link" data-toggle="pill" href="#poj-settings-6" role="tab" id="tab_poj-settings-6">人工单价调整</a></li>
-                                <li class="nav-item"><a class="nav-link" data-toggle="pill" href="#display_setting" role="tab" id="tab_display_setting">呈现选项</a></li>
+                                <li class="nav-item"><a class="nav-link" data-toggle="pill" href="#display-setting" role="tab" id="tab_display_setting">呈现选项</a></li>
                             </ul>
                         </div>
                         <div class="col-9">
@@ -384,23 +442,24 @@
                                     <div style="height:8px;"></div>
                                     <div class="modal-auto-height" id="labourCoeSpread"></div>
                                 </div>
-                                <!--人工单价调整-->
-                                <div class="tab-pane fade" id="display_setting" role="tabpanel">
-                                    <fieldset class="form-group">
-                                        <div class="row px-3">
-                                            <div class="checkbox">
+                                <!--呈现选项-->
+                                <div class="tab-pane fade" id="display-setting" role="tabpanel">
+                                    <div class="modal-auto-height" style="overflow: hidden">
+                                        <fieldset class="form-group">
+                                            <div class="form-check">
+                                                <label class="form-check-label">
+                                                    <input class="form-check-input" id="autoHeight" value="1" type="checkbox">
+                                                    造价书表格自动调整行高
+                                                </label>
+                                            </div>
+                                            <div class="form-check">
                                                 <label class="form-check-label">
-                                                    <input type="checkbox" id="autoHeight" class="form-check-input">造价书表格自动调整行高
+                                                    <input class="form-check-input" id="disPlayMainMaterial" value="1" type="checkbox">
+                                                    定额下显示主材、设备
                                                 </label>
                                             </div>
-                                        </div>
-                                        <div style="height:8px;"></div>
-                                        <div class="checkbox">
-                                            <label class="form-check-label">
-                                                <input type="checkbox" id="disPlayMainMateria" class="form-check-input">定额下显示主材、设备
-                                            </label>
-                                        </div>
-                                    </fieldset>
+                                        </fieldset>
+                                    </div>
                                 </div>
                             </div>
                         </div>

+ 9 - 7
web/building_saas/main/js/main.js

@@ -3,6 +3,11 @@
  */
 
 $(function () {
+    // 读取本地存储的高度(必须放在载入spread之前)
+    loadSize("main", function() {
+        refreshSubSpread();
+    });
+
     projectInfoObj.showProjectInfo();
     projectObj.checkMainSpread();
     projectObj.loadProjectData();
@@ -19,11 +24,6 @@ $(function () {
         // do something
     });
 
-    // 读取本地存储的高度
-    loadSize("main", function() {
-        refreshSubSpread();
-    });
-
     slideResize($("#main"), function() {
         projectObj.mainSpread.refresh();
         refreshSubSpread();
@@ -113,12 +113,14 @@ function loadSize(tag, callback) {
     if (tag === '') {
         return;
     }
-    const topHeight = getLocalCache('topHeight:' + tag);
-    const bottomHeight = getLocalCache('bottomHeight:' + tag);
+    let topHeight = getLocalCache('topHeight:' + tag);
+    let bottomHeight = getLocalCache('bottomHeight:' + tag);
     if (topHeight === null || bottomHeight === null) {
         return;
     }
     const navHeight = $("#"+ tag +" .bottom-content").children('ul.nav').height();
+    topHeight = parseFloat(topHeight);
+    bottomHeight = parseFloat(bottomHeight);
     $("#"+ tag +" .main-data-top").height(topHeight);
     $("#"+ tag +" .main-data-bottom").height(bottomHeight - navHeight);
     $("#"+ tag +" .bottom-content").height(bottomHeight);

+ 226 - 68
web/building_saas/main/js/models/calc_base.js

@@ -51,6 +51,9 @@ let cbTools = {
     isNum: function (v) {
         return this.isDef(v) && !isNaN(v) && v !== Infinity;
     },
+    isFlag: function (v) {
+        return this.isDef(v.flagsIndex) && this.isDef(v.flagsIndex.fixed);
+    },
     returnV: function (v, r) {
         if(this.isDef(v)){
             return v;
@@ -72,12 +75,25 @@ let cbTools = {
             if(this.isDef(bills[i].flagsIndex.fixed)){
                 for(let flag in fixedFlag){
                     if(fixedFlag[flag] === bills[i].flagsIndex.fixed.flag){
-                        billsObj[fixedFlag[flag]] = bills[i];
+                        billsObj[fixedFlag[flag]] = Object.create(null);
+                        billsObj[fixedFlag[flag]]['base']  = Object.create(null);
+                        billsObj[fixedFlag[flag]]['bill']  = bills[i];
                     }
                 }
             }
         }
     },
+    //清单基数设置所属固定清单属性
+    setBaseBills: function (baseFigure, fixedBills) {
+        for(let i in baseFigure){
+            let calcBase = baseFigure[i];
+            calcBase.fixedBill = null;
+            if(cbTools.isDef(fixedBills[calcBase.fixedFlag])){
+                fixedBills[calcBase.fixedFlag]['base'][i] = calcBase;
+                calcBase.fixedBill = fixedBills[calcBase.fixedFlag];
+            }
+        }
+    },
     //生成清单基数计算分类模板
     setBaseFigureClass: function (baseFigures, mapObj) {
         mapObj['CONSTRUCTION_ORGANIZATION'] = Object.create(null);
@@ -87,68 +103,169 @@ let cbTools = {
         mapObj['OTHERS'] = Object.create(null);
         let filter = ['CSXMF', 'ZZCSXMF', 'ZZCSXMDEJJZJGCF', 'ZZCSXMDEJJRGF', 'ZZCSXMDEJJCLF', 'ZZCSXMDEJJJXF', 'QTXMF', 'GF', 'SJ'];
         for(let figure in baseFigures){
-            if(filter.indexOf(baseFigures[figure]) === -1){
+            if(filter.indexOf(baseFigures[figure]['base']) === -1){
                 mapObj['CONSTRUCTION_ORGANIZATION'][figure] = baseFigures[figure];
             }
-            if(baseFigures[figure] !== 'QTXMF'){
+            if(baseFigures[figure]['base'] !== 'QTXMF'){
                 mapObj['OTHER'][figure] = baseFigures[figure];
             }
-            if(baseFigures[figure] !== 'GF'){
+            if(baseFigures[figure]['base'] !== 'GF'){
                 mapObj['CHARGE'][figure] = baseFigures[figure];
             }
-            if(baseFigures[figure] !== 'SJ'){
+            if(baseFigures[figure]['base'] !== 'SJ'){
                 mapObj['TAX'][figure] = baseFigures[figure];
             }
             mapObj['OTHERS'][figure] = baseFigures[figure];
         }
+    },
+    getFigure: function (node) {
+        let calcBase = projectObj.project.calcBase;
+        let parent = node.parent;
+        if(this.isFlag(node.data) && (node.data.flagsIndex.fixed.flag === calcBase.fixedFlag.SUB_ENGINERRING
+            || node.data.flagsIndex.fixed.flag === calcBase.fixedFlag.CONSTRUCTION_TECH)){
+            //node.data.baseFigureClass = null;
+            return null;
+        }
+        else if(this.isFlag(node.data) && node.data.flagsIndex.fixed.flag === calcBase.fixedFlag.CONSTRUCTION_ORGANIZATION){
+            //node.data.baseFigureClass = 'CONSTRUCTION_ORGANIZATION';
+            return calcBase.baseFigureClass.CONSTRUCTION_ORGANIZATION;
+        }
+        else if(this.isFlag(node.data) && node.data.flagsIndex.fixed.flag === calcBase.fixedFlag.OTHER){
+            //node.data.baseFigureClass = 'OTHER';
+            return calcBase.baseFigureClass.OTHER;
+        }
+        else if(this.isFlag(node.data) && node.data.flagsIndex.fixed.flag === calcBase.fixedFlag.CHARGE){
+            //node.data.baseFigureClass = 'CHARGE';
+            return calcBase.baseFigureClass.CHARGE;
+        }
+        else if(this.isFlag(node.data) && node.data.flagsIndex.fixed.flag === calcBase.fixedFlag.TAX){
+            //node.data.baseFigureClass = 'TAX';
+            return calcBase.baseFigureClass.TAX;
+        }
+        else {
+            if(!parent){
+                //node.data.baseFigureClass = 'OTHERS';
+                return calcBase.baseFigureClass.OTHERS;
+            }
+            else {
+                return this.getFigure(parent);
+            }
+        }
+    },
+    getBaseBill: function (node) {
+        let calcBase = projectObj.project.calcBase;
+        let parent = node.parent;
+        if(this.isFlag(node.data) && (node.data.flagsIndex.fixed.flag === calcBase.fixedFlag.SUB_ENGINERRING
+            || node.data.flagsIndex.fixed.flag === calcBase.fixedFlag.CONSTRUCTION_TECH)){
+            return node;
+        }
+        else if(this.isFlag(node.data) && node.data.flagsIndex.fixed.flag === calcBase.fixedFlag.CONSTRUCTION_ORGANIZATION){
+            return node;
+        }
+        else if(this.isFlag(node.data) && node.data.flagsIndex.fixed.flag === calcBase.fixedFlag.OTHER){
+            return node;
+        }
+        else if(this.isFlag(node.data) && node.data.flagsIndex.fixed.flag === calcBase.fixedFlag.CHARGE){
+            return node;
+        }
+        else if(this.isFlag(node.data) && node.data.flagsIndex.fixed.flag === calcBase.fixedFlag.TAX){
+            return node;
+        }
+        else {
+            if(!parent){
+                return node;
+            }
+            else {
+                return this.getBaseBill(parent);
+            }
+        }
+    },
+    //获取清单(有基数计算)引用了的其他清单,(循环引用栈中的一块)
+    getStackBlock: function (billID) {
+        let tempBases = [], block = [];//存引用的清单ID
+        let node = getBill(billID);
+        if(!node){
+            return tempBases;
+        }
+        else {
+            getBase(node);
+            let bases = Array.from(new Set(tempBases));
+            for(let i = 0, len = bases.length; i < len; i++){
+                if(cbTools.isDef(calcBase.baseFigures[bases[i]])){
+                    block.push(calcBase.baseFigures[bases[i]]['fixedBill']['bill']['ID']);
+                }
+            }
+            return Array.from(new Set(block));
+        }
+        function getBase(node){
+            if(node && node.children.length === 0){
+                if(cbTools.isDef(node.data.calcBase)){
+                    let figures = cbParser.getFigure(node.data.calcBase);
+                    tempBases = tempBases.concat(figures);
+                }
+            }
+            else if(node && node.children.length > 0) {
+                for(let i = 0, len = node.children.length; i < len; i++){
+                    getBase(node.children[i]);
+                }
+            }
+        }
+        function getBill(ID){
+            for(let i = 0, len = calcBase.project.mainTree.items.length; i < len; i++){
+                if(calcBase.project.mainTree.items[i].data.ID === ID && calcBase.project.mainTree.items[i].sourceType === calcBase.project.Bills.getSourceType()){
+                    return calcBase.project.mainTree.items[i];
+                }
+            }
+            return null;
+        }
     }
 };
 
 let baseFigureTemplate = {
     'FBFXGCF': function () {
-        let bill = calcBase.fixedBills[calcBase.fixedFlag.SUB_ENGINERRING];
+        let bill = calcBase.fixedBills[calcBase.fixedFlag.SUB_ENGINERRING]['bill'];
         if(cbTools.isUnDef(bill)) return 0;
         if(cbTools.isUnDef(bill.feesIndex) || Object.keys(bill.feesIndex).length === 0) return 0;
         return bill.feesIndex.common.totalFee || 0;
     },
     'FBFXDEJJRGF': function () {
-        let bill = calcBase.fixedBills[calcBase.fixedFlag.SUB_ENGINERRING];
+        let bill = calcBase.fixedBills[calcBase.fixedFlag.SUB_ENGINERRING]['bill'];
         if(cbTools.isUnDef(bill)) return 0;
         if(cbTools.isUnDef(bill.feesIndex) || Object.keys(bill.feesIndex).length === 0) return 0;
         return bill.feesIndex.labour.totalFee || 0;
     },
     'FBFXDEJJCLF': function () {
-        let bill = calcBase.fixedBills[calcBase.fixedFlag.SUB_ENGINERRING];
+        let bill = calcBase.fixedBills[calcBase.fixedFlag.SUB_ENGINERRING]['bill'];
         if(cbTools.isUnDef(bill)) return 0;
         if(cbTools.isUnDef(bill.feesIndex) || Object.keys(bill.feesIndex).length === 0) return 0;
         return bill.feesIndex.material.totalFee || 0;
     },
     'FBFXDEJJJXF': function () {
-        let bill = calcBase.fixedBills[calcBase.fixedFlag.SUB_ENGINERRING];
+        let bill = calcBase.fixedBills[calcBase.fixedFlag.SUB_ENGINERRING]['bill'];
         if(cbTools.isUnDef(bill)) return 0;
         if(cbTools.isUnDef(bill.feesIndex) || Object.keys(bill.feesIndex).length === 0) return 0;
         return bill.feesIndex.machine.totalFee || 0;
     },
     'FBFXTZRGF': function () {
-        let bill = calcBase.fixedBills[calcBase.fixedFlag.SUB_ENGINERRING];
+        let bill = calcBase.fixedBills[calcBase.fixedFlag.SUB_ENGINERRING]['bill'];
         if(cbTools.isUnDef(bill)) return 0;
         if(cbTools.isUnDef(bill.feesIndex) || Object.keys(bill.feesIndex).length === 0) return 0;
         return bill.feesIndex.adjustLabour.totalFee || 0;
     },
     'FBFXTZJSRGF': function () {
-        let bill = calcBase.fixedBills[calcBase.fixedFlag.SUB_ENGINERRING];
+        let bill = calcBase.fixedBills[calcBase.fixedFlag.SUB_ENGINERRING]['bill'];
         if(cbTools.isUnDef(bill)) return 0;
         if(cbTools.isUnDef(bill.feesIndex) || Object.keys(bill.feesIndex).length === 0) return 0;
         return bill.feesIndex.adjustMachineLabour.totalFee || 0;
     },
     'FBFXZCF': function () {
-        let bill = calcBase.fixedBills[calcBase.fixedFlag.SUB_ENGINERRING];
+        let bill = calcBase.fixedBills[calcBase.fixedFlag.SUB_ENGINERRING]['bill'];
         if(cbTools.isUnDef(bill)) return 0;
         if(cbTools.isUnDef(bill.feesIndex) || Object.keys(bill.feesIndex).length === 0) return 0;
         return bill.feesIndex.mainMaterial.totalFee || 0;
     },
     'FBFXSBF': function () {
-        let bill = calcBase.fixedBills[calcBase.fixedFlag.SUB_ENGINERRING];
+        let bill = calcBase.fixedBills[calcBase.fixedFlag.SUB_ENGINERRING]['bill'];
         if(cbTools.isUnDef(bill)) return 0;
         if(cbTools.isUnDef(bill.feesIndex) || Object.keys(bill.feesIndex).length === 0) return 0;
         return bill.feesIndex.mainMaterial.totalFee || 0;
@@ -163,13 +280,13 @@ let baseFigureTemplate = {
         return this['FBFXDEJJRGF']() + this['FBFXDEJJCLF']() + this['FBFXDEJJJXF']();
     },
     'CSXMF': function () {
-        let bill = calcBase.fixedBills[calcBase.fixedFlag.MEASURE];
+        let bill = calcBase.fixedBills[calcBase.fixedFlag.MEASURE]['bill'];
         if(cbTools.isUnDef(bill)) return 0;
         if(cbTools.isUnDef(bill.feesIndex) || Object.keys(bill.feesIndex).length === 0) return 0;
         return bill.feesIndex.common.totalFee || 0;
     },
     'ZZCSXMF': function () {
-        let bill = calcBase.fixedBills[calcBase.fixedFlag.CONSTRUCTION_ORGANIZATION];
+        let bill = calcBase.fixedBills[calcBase.fixedFlag.CONSTRUCTION_ORGANIZATION]['bill'];
         if(cbTools.isUnDef(bill)) return 0;
         if(cbTools.isUnDef(bill.feesIndex) || Object.keys(bill.feesIndex).length === 0) return 0;
         return bill.feesIndex.common.totalFee || 0;
@@ -178,61 +295,61 @@ let baseFigureTemplate = {
         return this['ZZCSXMDEJJRGF']() + this['ZZCSXMDEJJCLF']() + this['ZZCSXMDEJJJXF']()
     },
     'ZZCSXMDEJJRGF': function () {
-        let bill = calcBase.fixedBills[calcBase.fixedFlag.CONSTRUCTION_ORGANIZATION];
+        let bill = calcBase.fixedBills[calcBase.fixedFlag.CONSTRUCTION_ORGANIZATION]['bill'];
         if(cbTools.isUnDef(bill)) return 0;
         if(cbTools.isUnDef(bill.feesIndex) || Object.keys(bill.feesIndex).length === 0) return 0;
         return bill.feesIndex.labour.totalFee || 0;
     },
     'ZZCSXMDEJJCLF': function () {
-        let bill = calcBase.fixedBills[calcBase.fixedFlag.CONSTRUCTION_ORGANIZATION];
+        let bill = calcBase.fixedBills[calcBase.fixedFlag.CONSTRUCTION_ORGANIZATION]['bill'];
         if(cbTools.isUnDef(bill)) return 0;
         if(cbTools.isUnDef(bill.feesIndex) || Object.keys(bill.feesIndex).length === 0) return 0;
         return bill.feesIndex.material.totalFee || 0;
     },
     'ZZCSXMDEJJJXF': function () {
-        let bill = calcBase.fixedBills[calcBase.fixedFlag.CONSTRUCTION_ORGANIZATION];
+        let bill = calcBase.fixedBills[calcBase.fixedFlag.CONSTRUCTION_ORGANIZATION]['bill'];
         if(cbTools.isUnDef(bill)) return 0;
         if(cbTools.isUnDef(bill.feesIndex) || Object.keys(bill.feesIndex).length === 0) return 0;
         return bill.feesIndex.machine.totalFee || 0;
     },
     'JSCSXMF': function () {
-        let bill = calcBase.fixedBills[calcBase.fixedFlag.CONSTRUCTION_TECH];
+        let bill = calcBase.fixedBills[calcBase.fixedFlag.CONSTRUCTION_TECH]['bill'];
         if(cbTools.isUnDef(bill)) return 0;
         if(cbTools.isUnDef(bill.feesIndex) || Object.keys(bill.feesIndex).length === 0) return 0;
         return bill.feesIndex.common.totalFee || 0;
     },
     'JSCSXMDEJJRGF': function () {
-        let bill = calcBase.fixedBills[calcBase.fixedFlag.CONSTRUCTION_TECH];
+        let bill = calcBase.fixedBills[calcBase.fixedFlag.CONSTRUCTION_TECH]['bill'];
         if(cbTools.isUnDef(bill)) return 0;
         if(cbTools.isUnDef(bill.feesIndex) || Object.keys(bill.feesIndex).length === 0) return 0;
         return bill.feesIndex.labour.totalFee || 0;
     },
     'JSCSXMDEJJCLF': function () {
-        let bill = calcBase.fixedBills[calcBase.fixedFlag.CONSTRUCTION_TECH];
+        let bill = calcBase.fixedBills[calcBase.fixedFlag.CONSTRUCTION_TECH]['bill'];
         if(cbTools.isUnDef(bill)) return 0;
         if(cbTools.isUnDef(bill.feesIndex) || Object.keys(bill.feesIndex).length === 0) return 0;
         return bill.feesIndex.material.totalFee || 0;
     },
     'JSCSXMDEJJJXF': function () {
-        let bill = calcBase.fixedBills[calcBase.fixedFlag.CONSTRUCTION_TECH];
+        let bill = calcBase.fixedBills[calcBase.fixedFlag.CONSTRUCTION_TECH]['bill'];
         if(cbTools.isUnDef(bill)) return 0;
         if(cbTools.isUnDef(bill.feesIndex) || Object.keys(bill.feesIndex).length === 0) return 0;
         return bill.feesIndex.machine.totalFee || 0;
     },
     'JSCSXMTZRGF': function () {
-        let bill = calcBase.fixedBills[calcBase.fixedFlag.CONSTRUCTION_TECH];
+        let bill = calcBase.fixedBills[calcBase.fixedFlag.CONSTRUCTION_TECH]['bill'];
         if(cbTools.isUnDef(bill)) return 0;
         if(cbTools.isUnDef(bill.feesIndex) || Object.keys(bill.feesIndex).length === 0) return 0;
         return bill.feesIndex.adjustLabour.totalFee || 0;
     },
     'JSCSXMTZJSRGF': function () {
-        let bill = calcBase.fixedBills[calcBase.fixedFlag.CONSTRUCTION_TECH];
+        let bill = calcBase.fixedBills[calcBase.fixedFlag.CONSTRUCTION_TECH]['bill'];
         if(cbTools.isUnDef(bill)) return 0;
         if(cbTools.isUnDef(bill.feesIndex) || Object.keys(bill.feesIndex).length === 0) return 0;
         return bill.feesIndex.adjustMachineLabour.totalFee || 0;
     },
     'JSCSXMZCF': function () {
-        let bill = calcBase.fixedBills[calcBase.fixedFlag.CONSTRUCTION_TECH];
+        let bill = calcBase.fixedBills[calcBase.fixedFlag.CONSTRUCTION_TECH]['bill'];
         if(cbTools.isUnDef(bill)) return 0;
         if(cbTools.isUnDef(bill.feesIndex) || Object.keys(bill.feesIndex).length === 0) return 0;
         return bill.feesIndex.mainMaterial.totalFee || 0;
@@ -250,19 +367,19 @@ let baseFigureTemplate = {
         return this['JSCSXMDEJJRGF']() + this['JSCSXMDEJJCLF']() + this['JSCSXMDEJJJXF']();
     },
     'QTXMF': function () {
-        let bill = calcBase.fixedBills[calcBase.fixedFlag.OTHER];
+        let bill = calcBase.fixedBills[calcBase.fixedFlag.OTHER]['bill'];
         if(cbTools.isUnDef(bill)) return 0;
         if(cbTools.isUnDef(bill.feesIndex) || Object.keys(bill.feesIndex).length === 0) return 0;
         return bill.feesIndex.common.totalFee || 0;
     },
     'GF': function () {
-        let bill = calcBase.fixedBills[calcBase.fixedFlag.CHARGE];
+        let bill = calcBase.fixedBills[calcBase.fixedFlag.CHARGE]['bill'];
         if(cbTools.isUnDef(bill)) return 0;
         if(cbTools.isUnDef(bill.feesIndex) || Object.keys(bill.feesIndex).length === 0) return 0;
         return bill.feesIndex.common.totalFee || 0;
     },
     'SJ': function () {
-        let bill = calcBase.fixedBills[calcBase.fixedFlag.TAX];
+        let bill = calcBase.fixedBills[calcBase.fixedFlag.TAX]['bill'];
         if(cbTools.isUnDef(bill)) return 0;
         if(cbTools.isUnDef(bill.feesIndex) || Object.keys(bill.feesIndex).length === 0) return 0;
         return bill.feesIndex.common.totalFee || 0;
@@ -270,37 +387,37 @@ let baseFigureTemplate = {
 };
 
 let baseFigureMap = {
-    '分部分项工程费': 'FBFXGCF',
-    '分部分项定额基价人工费': 'FBFXDEJJRGF',
-    '分部分项定额基价材料费': 'FBFXDEJJCLF',
-    '分部分项定额基价机械费': 'FBFXDEJJJXF',
-    '分部分项调整人工费': 'FBFXTZRGF',
-    '分部分项调整机上人工费': 'FBFXTZJSRGF',
-    '分部分项主材费': 'FBFXZCF',
-    '分部分项设备费': 'FBFXSBF',
-    '分部分项未计价材料费': 'FBFXWJJCLF',
-    '分部分项人工工日': 'FBFXRGGR',
-    '分部分项工程量清单中的基价直接工程费': 'FBFXGCLQDJJZJGCF',
-    '措施项目费': 'CSXMF',
-    '组织措施项目费': 'ZZCSXMF',
-    '组织措施项目定额基价直接工程费': 'ZZCSXMDEJJZJGCF',
-    '组织措施项目定额基价人工费': 'ZZCSXMDEJJRGF',
-    '组织措施项目定额基价材料费': 'ZZCSXMDEJJCLF',
-    '组织措施项目定额基价机械费': 'ZZCSXMDEJJJXF',
-    '技术措施项目费': 'JSCSXMF',
-    '技术措施项目定额基价人工费': 'JSCSXMDEJJRGF',
-    '技术措施项目定额基价材料费': 'JSCSXMDEJJCLF',
-    '技术措施项目定额基价机械费': 'JSCSXMDEJJJXF',
-    '技术措施项目调整人工费': 'JSCSXMTZRGF',
-    '技术措施项目调整机上人工费': 'JSCSXMTZJSRGF',
-    '技术措施项目主材费': 'JSCSXMZCF',
-    '技术措施项目设备费': 'JSCSXMSBF',
-    '技术措施项目未计价材料费': 'JSCSXMWJJCLF',
-    '技术措施项目人工工日': 'JSCSXMRGGR',
-    '技术措施项目清单中的定额基价直接工程费': 'JSCSXMQDDEJJZJGCF',
-    '其他项目费': 'QTXMF',
-    '规费': 'GF',
-    '税金': 'SJ'
+    '分部分项工程费': {base: 'FBFXGCF', fixedFlag: fixedFlag.SUB_ENGINERRING},
+    '分部分项定额基价人工费': {base: 'FBFXDEJJRGF', fixedFlag: fixedFlag.SUB_ENGINERRING},
+    '分部分项定额基价材料费': {base: 'FBFXDEJJCLF', fixedFlag: fixedFlag.SUB_ENGINERRING},
+    '分部分项定额基价机械费': {base: 'FBFXDEJJJXF', fixedFlag: fixedFlag.SUB_ENGINERRING},
+    '分部分项调整人工费': {base: 'FBFXTZRGF', fixedFlag: fixedFlag.SUB_ENGINERRING},
+    '分部分项调整机上人工费': {base: 'FBFXTZJSRGF', fixedFlag: fixedFlag.SUB_ENGINERRING},
+    '分部分项主材费': {base: 'FBFXZCF', fixedFlag: fixedFlag.SUB_ENGINERRING},
+    '分部分项设备费': {base: 'FBFXSBF', fixedFlag: fixedFlag.SUB_ENGINERRING},
+    '分部分项未计价材料费': {base: 'FBFXWJJCLF', fixedFlag: fixedFlag.SUB_ENGINERRING},
+    '分部分项人工工日': {base: 'FBFXRGGR', fixedFlag: fixedFlag.SUB_ENGINERRING},
+    '分部分项工程量清单中的基价直接工程费': {base: 'FBFXGCLQDJJZJGCF', fixedFlag: fixedFlag.SUB_ENGINERRING},
+    '措施项目费': {base: 'CSXMF', fixedFlag: fixedFlag.MEASURE},
+    '组织措施项目费': {base: 'ZZCSXMF', fixedFlag: fixedFlag.CONSTRUCTION_ORGANIZATION},
+    '组织措施项目定额基价直接工程费': {base: 'ZZCSXMDEJJZJGCF', fixedFlag: fixedFlag.CONSTRUCTION_ORGANIZATION},
+    '组织措施项目定额基价人工费': {base: 'ZZCSXMDEJJRGF', fixedFlag: fixedFlag.CONSTRUCTION_ORGANIZATION},
+    '组织措施项目定额基价材料费': {base: 'ZZCSXMDEJJCLF', fixedFlag: fixedFlag.CONSTRUCTION_ORGANIZATION},
+    '组织措施项目定额基价机械费': {base: 'ZZCSXMDEJJJXF', fixedFlag: fixedFlag.CONSTRUCTION_ORGANIZATION},
+    '技术措施项目费': {base: 'JSCSXMF', fixedFlag: fixedFlag.CONSTRUCTION_TECH},
+    '技术措施项目定额基价人工费': {base: 'JSCSXMDEJJRGF', fixedFlag: fixedFlag.CONSTRUCTION_TECH},
+    '技术措施项目定额基价材料费': {base: 'JSCSXMDEJJCLF', fixedFlag: fixedFlag.CONSTRUCTION_TECH},
+    '技术措施项目定额基价机械费': {base: 'JSCSXMDEJJJXF', fixedFlag: fixedFlag.CONSTRUCTION_TECH},
+    '技术措施项目调整人工费': {base: 'JSCSXMTZRGF', fixedFlag: fixedFlag.CONSTRUCTION_TECH},
+    '技术措施项目调整机上人工费': {base: 'JSCSXMTZJSRGF', fixedFlag: fixedFlag.CONSTRUCTION_TECH},
+    '技术措施项目主材费': {base: 'JSCSXMZCF', fixedFlag: fixedFlag.CONSTRUCTION_TECH},
+    '技术措施项目设备费': {base: 'JSCSXMSBF', fixedFlag: fixedFlag.CONSTRUCTION_TECH},
+    '技术措施项目未计价材料费': {base: 'JSCSXMWJJCLF', fixedFlag: fixedFlag.CONSTRUCTION_TECH},
+    '技术措施项目人工工日': {base: 'JSCSXMRGGR', fixedFlag: fixedFlag.CONSTRUCTION_TECH},
+    '技术措施项目清单中的定额基价直接工程费': {base: 'JSCSXMQDDEJJZJGCF', fixedFlag: fixedFlag.CONSTRUCTION_TECH},
+    '其他项目费': {base: 'QTXMF',  fixedFlag: fixedFlag.OTHER},
+    '规费': {base: 'GF', fixedFlag: fixedFlag.CHARGE},
+    '税金': {base: 'SJ', fixedFlag: fixedFlag.TAX}
 };
 
 //输入式分析器
@@ -329,18 +446,55 @@ let cbAnalyzer = {
         }
         return true;
     },
+    //循环计算
+    cycleCalc: function (node, baseFigures, exp) {
+        let stack = [];
+        if(node.sourceType !== calcBase.project.Bills.getSourceType()){
+            return false;
+        }
+        let sbillID = cbTools.getBaseBill(node).data.ID;
+        let expFigures = cbParser.getFigure(exp);
+        for(let i = 0, len = expFigures.length; i < len; i++){
+            let figure = expFigures[i];
+            if(cbTools.isDef(baseFigures[figure])){
+                let bill = baseFigures[figure]['fixedBill']['bill'];
+                if(checkStack(getRefStack([bill.ID]), sbillID)){
+                    console.log('循环计算');
+                    return true;
+                }
+            }
+        }
+        return false;
+        function checkStack(stack, startBillID){
+            //引用栈发现了初始引用
+            return stack.indexOf(startBillID) !== -1;
+        }
+        function getRefStack(billIDs){
+            stack = Array.from(new Set(stack.concat(billIDs)));
+            for(let i = 0, len = billIDs.length; i < len; i++){
+                let block = cbTools.getStackBlock(billIDs[i]);
+                if(block.length > 0){
+                    stack = Array.from(new Set(stack.concat(block)));
+                    getRefStack(block);
+                }
+            }
+            return stack;
+        }
+    },
     //四则运算合法性,前端控制不允许重复出现运算符,这里主要判断()的使用问题,这里再判断一次
     arithmeticLeagl: function (exp) {
         let ilegalRex = /[\+,\-,\*,\/]{2}/g;
         return !ilegalRex.test(exp);
     },
     //
-    legalExp: function (exp) {
-        exp = this.standar(exp);
+    legalExp: function (node) {
+        let exp = this.standar(node.data.userCalcBase);
         if(this.inputLegal(exp)){
-            if(this.baseLegal(calcBase.baseFigures, exp)){
-                if(this.arithmeticLeagl(exp)){
-                    return exp;
+            if(this.baseLegal(cbTools.getFigure(node), exp)){
+                if(!this.cycleCalc(node, cbTools.getFigure(node), exp)){
+                    if(this.arithmeticLeagl(exp)){
+                        return exp;
+                    }
                 }
             }
             return null;
@@ -390,7 +544,7 @@ let cbParser = {
 let cbCalctor = {
     //计算基数
     base: function (figure) {
-        return baseFigureTemplate[calcBase.baseFigures[figure]]();
+        return baseFigureTemplate[calcBase.baseFigures[figure]['base']]();
     },
     //计算
     exec: function () {
@@ -414,13 +568,17 @@ let calcBase = {
         me.fixedFlag = fixedFlag;
         cbTools.setFixedBills(project, me.fixedBills, me.fixedFlag);
         me.baseFigures = baseFigureMap;
+        cbTools.setBaseBills(me.baseFigures, me.fixedBills);
         //me.baseFigures.fixedBills = me.fixedBills;
         cbTools.setBaseFigureClass(me.baseFigures, me.baseFigureClass);
     },
     getBase: function (figure) {
-       return  cbCalctor.base(figure);
+       return cbCalctor.base(figure);
 
     },
+    getBaseByClass: function (node) {
+        return cbTools.getFigure(node);
+    },
     calculate: function (node) {
         let me = calcBase,
             $CBA = cbAnalyzer,
@@ -429,7 +587,7 @@ let calcBase = {
         try {
             me.success = false;
             //分析输入式合法性
-            let exp = $CBA.legalExp(node.data.userCalcBase);
+            let exp = $CBA.legalExp(node);
             if(!exp){
                 throw '表达式不正确';
             }
@@ -449,7 +607,7 @@ let calcBase = {
             me.project.calcProgram.saveNode(node);
         }
         catch (err){
-            alert('表达式不正确');
+            alert(err);
         }
     },
 };

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

@@ -118,35 +118,6 @@ let calcBaseView = {
     canBase: function (node) {
         return node.sourceType === projectObj.project.Bills.getSourceType() && node.children.length === 0;
     },
-    //根据节点获取可用计算基数
-    getFigure: function (node) {
-        let calcBase = projectObj.project.calcBase;
-        let parent = node.parent;
-        if(this.isFlag(node.data) && (node.data.flagsIndex.fixed.flag === calcBase.fixedFlag.SUB_ENGINERRING
-            || node.data.flagsIndex.fixed.flag === calcBase.fixedFlag.CONSTRUCTION_TECH)){
-            return null;
-        }
-        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.OTHER){
-            return calcBase.baseFigureClass.OTHER;
-        }
-        else if(this.isFlag(node.data) && node.data.flagsIndex.fixed.flag === calcBase.fixedFlag.CHARGE){
-            return calcBase.baseFigureClass.CHARGE;
-        }
-        else if(this.isFlag(node.data) && node.data.flagsIndex.fixed.flag === calcBase.fixedFlag.TAX){
-            return calcBase.baseFigureClass.TAX;
-        }
-        else {
-            if(!parent){
-                return calcBase.baseFigureClass.OTHERS;
-            }
-            else {
-                return this.getFigure(parent);
-            }
-        }
-    },
     //计算基数转换为显示数据Obj to Array
     toViewData: function (obj) {
         let rst = [];
@@ -166,7 +137,7 @@ let calcBaseView = {
             me.inputExpr.val(node.data.calcBase);
         }
         me.buildSheet();
-        let baseObj = me.getFigure(node);
+        let baseObj = projectObj.project.calcBase.getBaseByClass(node);
         me.showData(me.toViewData(baseObj));
 
     },

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

@@ -70,7 +70,8 @@ let MainTreeCol = {
                     return this.calcBaseType(parent);
                 }
             }
-        },        bills: function (node) {
+        },
+        bills: function (node) {
             return node.sourceType === projectObj.project.Bills.getSourceType();
         },
         ration: function (node) {

+ 7 - 1
web/building_saas/main/js/views/project_property_display_view.js

@@ -5,10 +5,16 @@ let projDisplayView = {
     datas: null,//just for view
     init:function () {
         this.datas = projectInfoObj.projectInfo.property.displaySetting;
+        this.datas = this.datas === undefined ? { autoHeight: true, disPlayMainMaterial: true } : this.datas;
         $("#autoHeight").attr("checked",this.datas.autoHeight);
-        $("#disPlayMainMateria").attr("checked",this.datas.disPlayMainMateria);
+        $("#disPlayMainMaterial").attr("checked",this.datas.disPlayMainMaterial);
         //$('#disPlayMainMateria').prop('checked')
+ },
+
+    needUpdate: function(autoHeight, disPlayMainMaterial) {
+        return autoHeight !== this.datas.autoHeight || disPlayMainMaterial !== this.datas.disPlayMainMaterial;
     },
+
     updateChecking:function (projectID,properties) {
         if(this.datas==null){
             return;

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

@@ -383,6 +383,7 @@ var projectObj = {
                 that.project.projSetting.mainGridSetting = JSON.parse(str);
                 that.project.projSetting.mainGridSetting.frozenCols = 4;
                 TREE_SHEET_HELPER.initSetting($('#billsSpread')[0], that.project.projSetting.mainGridSetting);
+                const autoHeight = that.project.property.displaySetting.autoHeight;
                 that.project.projSetting.mainGridSetting.cols.forEach(function (col) {
                     // for test.  后端没有绑定,暂时写死用于测试。
 /*                    if (col.data.field == '' && col.head.titleNames[0] == "取费专业") {
@@ -410,6 +411,18 @@ var projectObj = {
                         col.data.formatter = '@';
                     }
 
+                    // 根据配置设置自动行高
+                    if (col.data.field === 'name' || col.data.field === 'itemCharacterText' ||
+                        col.data.field === 'jobContentText' || col.data.field === 'adjustState') {
+                        if (!autoHeight) {
+                            col.data.wordWrap = false;
+                            col.showHint = true;
+                        } else {
+                            col.data.wordWrap = true;
+                            col.showHint = false;
+                        }
+                    }
+
                     // for test digit. CSLAAAAA
                     if (col.data.field.hasSubStr("totalFee"))
                        col.data.formatter = MainTreeCol.getNumberFormatter(decimalObj.ration.totalPrice, true)
@@ -708,8 +721,7 @@ $('#property_ok').click(function () {
         let updateData = {updateType: 'update', updateData: {ID: projectID, 'property.decimal': updateDecimal}};
         properties.push(updateData);
     }
-
-    //呈现选项 检查如需更新则加入数组中
+ // 呈现选项
     projDisplayView.updateChecking(projectID,properties);
 
     console.log(properties);

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

@@ -100,6 +100,7 @@ $("#linkJSCX").click(function(){        // 计算程序
 $("#linkTZJNR").click(function () {
     $("#subItems").children().hide();
     $("#tzjnrCon").show();
+    $("#add-rule").show();
     pageCCOprObj.active = true;
     refreshSubSpread();
     let selectedNode = projectObj.mainController.tree.selected;