Bläddra i källkod

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

zhongzewei 6 år sedan
förälder
incheckning
d4255ed6ef

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 11 - 0
config/config.js


+ 5 - 1
modules/reports/rpt_component/helper/jpc_helper_common_output.js

@@ -2,7 +2,7 @@ let JV = require('../jpc_value_define');
 let JpcFieldHelper = require('./jpc_helper_field');
 
 let JpcCommonOutputHelper = {
-    createCommonOutputWithoutDecorate: function (node, value) {
+    createCommonOutputWithoutDecorate: function (node, value, forceCombine) {
         let me = this, rst = {};
         //1. font/style/control
         rst[JV.PROP_FONT] = node[[JV.PROP_FONT]];
@@ -14,9 +14,13 @@ let JpcCommonOutputHelper = {
         // innerFormat(node[JV.PROP_FORMAT], rst);
         if (node[JV.PROP_PREFIX] && rst[JV.PROP_VALUE] !== null) {
             rst[JV.PROP_VALUE] = node[JV.PROP_PREFIX] + rst[JV.PROP_VALUE];
+        } else if (node[JV.PROP_PREFIX] && forceCombine) {
+            rst[JV.PROP_VALUE] = node[JV.PROP_PREFIX];
         }
         if (node[JV.PROP_SUFFIX] && rst[JV.PROP_VALUE] !== null) {
             rst[JV.PROP_VALUE] = rst[JV.PROP_VALUE] + node[JV.PROP_SUFFIX];
+        } else if (node[JV.PROP_SUFFIX] && forceCombine) {
+            rst[JV.PROP_VALUE] = node[JV.PROP_SUFFIX];
         }
         return rst;
     },

+ 1 - 1
modules/reports/rpt_component/helper/jpc_helper_discrete.js

@@ -60,7 +60,7 @@ let JpcDiscreteHelper = {
                                 let param = JE.P(df[JV.PROP_PARAM_ID], $CURRENT_RPT);
                                 value = param[JV.PROP_DFT_VALUE];
                             }
-                            let item = JpcCommonOutputHelper.createCommonOutputWithoutDecorate(df, value, null);
+                            let item = JpcCommonOutputHelper.createCommonOutputWithoutDecorate(df, value, true);
                             //position
                             item[JV.PROP_AREA] = JpcAreaHelper.outputArea(df[JV.PROP_AREA], band, unitFactor, 1, 0, 1, 0, multiCols, multiColIdx, false, false);
                             rst.push(item);

+ 21 - 12
modules/reports/rpt_component/jpc_cross_tab.js

@@ -109,7 +109,7 @@ JpcCrossTabSrv.prototype.createNew = function(){
             let sIDX = 0;
             //1. prepare and sort by tab-field
             let fields = [];
-            JpcFieldHelper.findAndPutDataFieldIdx(rptTpl, tab[JV.TAB_CROSS_FIELDS], fields, rstFieldsIdx);
+            JpcFieldHelper.findAndPutDataFieldIdx(rptTpl, tab[JV.PROP_CROSS_FIELDS], fields, rstFieldsIdx);
             let data_details = dataObj[JV.DATA_DETAIL_DATA];
             JpcCrossTabHelper.sortTabFields(fields, rstFieldsIdx, data_details, dataSeq);
             //2. distinguish sort tab fields value
@@ -148,7 +148,7 @@ JpcCrossTabSrv.prototype.createNew = function(){
         let result = [];
         let tab = rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_CONTENT];
         if (tab) {
-            JpcFieldHelper.findAndPutDataFieldIdx(rptTpl, tab[JV.TAB_CROSS_FIELDS], null, rstFieldsIdx);
+            JpcFieldHelper.findAndPutDataFieldIdx(rptTpl, tab[JV.PROP_CROSS_FIELDS], null, rstFieldsIdx);
         }
         for (let i = 0; i < rowSeq.length; i++) {
             let rl = rowSeq[i], cl = colSeq[i];
@@ -201,7 +201,7 @@ JpcCrossTabSrv.prototype.createNew = function(){
         me.sortedRowSequence = private_SortAndOptimize(rptTpl, dataObj, dataSeq, JV.NODE_CROSS_ROW, me.row_fields_idx);
         me.sortedColSequence = private_SortAndOptimize(rptTpl, dataObj, dataSeq, JV.NODE_CROSS_COL, me.col_fields_idx);
         me.sortedContentSequence = private_SortForDisplayContent(rptTpl, me.sortedRowSequence, me.sortedColSequence, me.content_fields_idx);
-        JpcFieldHelper.findAndPutDataFieldIdx(rptTpl, rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_COL_SUM][JV.TAB_CROSS_FIELDS], null, me.col_sum_fields_idx);
+        JpcFieldHelper.findAndPutDataFieldIdx(rptTpl, rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_COL_SUM][JV.PROP_CROSS_FIELDS], null, me.col_sum_fields_idx);
         //pre-sum the data(for col sum display)
         let data_details = dataObj[JV.DATA_DETAIL_DATA],
             data_fields = [];
@@ -240,8 +240,8 @@ JpcCrossTabSrv.prototype.createNew = function(){
             maxRowRec = JpcCrossTabHelper.getMaxRowsPerPage(bands, rptTpl);
             maxColRec = JpcCrossTabHelper.getMaxColsPerPage(bands, rptTpl);
         }
-        JpcFieldHelper.findAndPutDataFieldIdx(rptTpl, rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_ROW_EXT][JV.TAB_CROSS_FIELDS], null, me.row_extension_fields_idx);
-        JpcFieldHelper.findAndPutDataFieldIdx(rptTpl, rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_ROW_SUM_EXT][JV.TAB_CROSS_FIELDS], null, me.row_sum_extension_fields_idx);
+        JpcFieldHelper.findAndPutDataFieldIdx(rptTpl, rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_ROW_EXT][JV.PROP_CROSS_FIELDS], null, me.row_extension_fields_idx);
+        JpcFieldHelper.findAndPutDataFieldIdx(rptTpl, rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_ROW_SUM_EXT][JV.PROP_CROSS_FIELDS], null, me.row_sum_extension_fields_idx);
         if (me.paging_option === JV.PAGING_OPTION_INFINITY) {
             /*
             rst = segCnt;
@@ -323,7 +323,10 @@ JpcCrossTabSrv.prototype.createNew = function(){
     };
     JpcCrossTabResult.outputAsPreviewPage = function (rptTpl, bands, controls, $CURRENT_RPT) {
         let me = this, rst = [];
-        //...
+        let pageStatus = [true, true, true, true, true, true, true, true];
+        me.pageStatusLst.push(pageStatus);
+        // JpcFieldHelper.findAndPutDataFieldIdx(rptTpl, rptTpl[JV.NODE_FLOW_INFO][JV.NODE_FLOW_CONTENT][JV.PROP_FLOW_FIELDS], null, me.disp_fields_idx, false);
+        JpcBandHelper.setBandArea(bands, rptTpl, pageStatus, true, false);
         return rst;
     };
     JpcCrossTabResult.outputAsSimpleJSONPage = function(rptTpl, dataObj, page, bands, controls, $CURRENT_RPT, customizeCfg) {
@@ -384,6 +387,12 @@ JpcCrossTabSrv.prototype.createNew = function(){
         }
         return rst;
     };
+    JpcCrossTabResult.outputPreviewRowTab = function(rptTpl, bands, controls, $CURRENT_RPT, customizeCfg) {
+        //
+    };
+    JpcCrossTabResult.outputPreviewColTab = function(rptTpl, bands, controls, $CURRENT_RPT, customizeCfg) {
+        //
+    };
     JpcCrossTabResult.outputRowTab = function(rptTpl, dataObj, page, bands, unitFactor, controls, $CURRENT_RPT, customizeCfg) {
         let me = this, rst = [];
         let tab = rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_ROW];
@@ -391,7 +400,7 @@ JpcCrossTabSrv.prototype.createNew = function(){
         if (band) {
             let pageStatus = me.pageStatusLst[page - 1];
             if (pageStatus[band[JV.BAND_PROP_DISPLAY_TYPE]] === true) {
-                let tab_fields = tab[JV.TAB_CROSS_FIELDS];
+                let tab_fields = tab[JV.PROP_CROSS_FIELDS];
                 let data_details = dataObj[JV.DATA_DETAIL_DATA];
                 let valuesIdx = me.dispValueIdxLst_Row[page - 1];
                 let serialsIdx = me.dispSerialIdxLst_Row[page - 1];
@@ -431,7 +440,7 @@ JpcCrossTabSrv.prototype.createNew = function(){
         if (band) {
             let pageStatus = me.pageStatusLst[page - 1];
             if (pageStatus[band[JV.BAND_PROP_DISPLAY_TYPE]] === true) {
-                let tab_fields = tab[JV.TAB_CROSS_FIELDS];
+                let tab_fields = tab[JV.PROP_CROSS_FIELDS];
                 let data_details = dataObj[JV.DATA_DETAIL_DATA];
                 let valuesIdx = me.dispValueIdxLst_Col[page - 1];
                 let flexiblePrecisionRefObj = null, flexibleRefField = null, precision_ref_data = null;
@@ -482,7 +491,7 @@ JpcCrossTabSrv.prototype.createNew = function(){
         if (band) {
             let pageStatus = me.pageStatusLst[page - 1];
             if (pageStatus[band[JV.BAND_PROP_DISPLAY_TYPE]] === true) {
-                let tab_fields = tab[JV.TAB_CROSS_FIELDS];
+                let tab_fields = tab[JV.PROP_CROSS_FIELDS];
                 let data_details = dataObj[JV.DATA_DETAIL_DATA];
                 let contentValuesIdx = me.dispValueIdxLst_Content[page - 1];
                 let flexiblePrecisionRefObj = null, flexibleRefField = null, precision_ref_data = null;
@@ -524,7 +533,7 @@ JpcCrossTabSrv.prototype.createNew = function(){
         if (band) {
             let pageStatus = me.pageStatusLst[page - 1];
             if (pageStatus[band[JV.BAND_PROP_DISPLAY_TYPE]] === true) {
-                let tab_fields = tab[JV.TAB_CROSS_FIELDS];
+                let tab_fields = tab[JV.PROP_CROSS_FIELDS];
                 for (let i = 0; i < me.dispSumValueLst_Col[page - 1].length; i++) {
                     if (me.dispSumValueLst_Col[page - 1][i] !== null) {
                         for (let j = 0; j < me.dispSumValueLst_Col[page - 1][i].length; j++) {
@@ -562,7 +571,7 @@ JpcCrossTabSrv.prototype.createNew = function(){
         if (band) {
             let pageStatus = me.pageStatusLst[page - 1];
             if (pageStatus[band[JV.BAND_PROP_DISPLAY_TYPE]] === true) {
-                let tab_fields = tab[JV.TAB_CROSS_FIELDS],
+                let tab_fields = tab[JV.PROP_CROSS_FIELDS],
                     data_details = dataObj[JV.DATA_DETAIL_DATA],
                     valuesIdx = me.dispValueIdxLst_Col[page - 1];
                 for (let i = 0; i < me.row_extension_fields_idx.length; i++) {
@@ -598,7 +607,7 @@ JpcCrossTabSrv.prototype.createNew = function(){
         if (band) {
             let pageStatus = me.pageStatusLst[page - 1];
             if (pageStatus[band[JV.BAND_PROP_DISPLAY_TYPE]] === true && pageStatus[JV.STATUS_CROSS_ROW_END] === true) {
-                let tab_fields = tab[JV.TAB_CROSS_FIELDS],
+                let tab_fields = tab[JV.PROP_CROSS_FIELDS],
                     data_details = dataObj[JV.DATA_DETAIL_DATA],
                     data_fields = [];
                 for (let i = 0; i < me.row_sum_extension_fields_idx.length; i++) {

+ 89 - 0
modules/reports/util/rpt_construct_data_util.js

@@ -8,6 +8,8 @@ let consts = require('../../../modules/main/models/project_consts');
 
 let fsUtil = require("../../../public/fsUtil");
 let stringUtil = require("../../../public/stringUtil");
+let scMathUtil = require("../../../public/scMathUtil");
+let _ = require("lodash");
 
 let treeUtil = require('../../../public/treeUtil');
 let projectConst = consts.projectConst;
@@ -220,6 +222,12 @@ class Rpt_Data_Extractor {
                 }
             }
         }
+        if (rst.indexOf(projectConst.RATION) >= 0 &&
+            rst.indexOf(projectConst.RATION_GLJ) >= 0 && rst.indexOf(projectConst.RATION_COE) < 0) {
+            rst.push(projectConst.RATION_COE);
+            //备注:在此情况下,根据业务特点,有可能需要额外计算project工料机的基价单价及市场单价,需要用到一些额外信息处理。
+            //     这里也不精细控制,直接多加一个请求类型。以后说不定还有其他类型的请求,到时候再加。
+        }
         if (rst.length === 0) {
             rst.push(projectConst.RATION_ASS);
         }
@@ -276,6 +284,15 @@ class Rpt_Data_Extractor {
                 setupFunc($PROJECT.SUMMARY, `SegmentDetail`, {"data": rawDataObj.SegmentDetail});
             }
         }
+        //综合费率
+        let feeRate = getModuleDataByKey(rawDataObj.prjData, "feeRate");
+        if (feeRate) {
+            //把综合费率树结构数据拉扁
+            // console.log(feeRate);
+            let newFeeRates = setupFeeRate(feeRate.data._doc);
+            // console.log(newFeeRates);
+            feeRate.data._doc.rates = newFeeRates;
+        }
 
         if (tpl[JV.NODE_MAP_DATA_HANDLE_INFO]) {
             for (let preHandle of tpl[JV.NODE_MAP_DATA_HANDLE_INFO]) {
@@ -311,6 +328,28 @@ class Rpt_Data_Extractor {
                 }
             }
         }
+        //一些计算(不保存数据,需要动态计算的)
+        if (rawDataObj.hasOwnProperty(`prj`)) {
+            let calcOptions = rawDataObj.prj._doc.property.calcOptions;
+            let decimalObj = rawDataObj.prj._doc.property.decimal;
+            let labourCoeDatas =  getModuleDataByKey(rawDataObj.prjData, "labour_coe");
+            let prjGLJDatas = getModuleDataByKey(rawDataObj.prjData, "projectGLJ");
+            let rationDatas = getModuleDataByKey(rawDataObj.prjData, "ration");
+            if (calcOptions && decimalObj && labourCoeDatas && labourCoeDatas && prjGLJDatas && rationDatas) {
+                for (let rationItem of rationDatas.data) {
+                    let glj = _.find(prjGLJDatas.data.gljList, {'id': rationItem.projectGLJID});
+                    if (glj) {
+                        let newGlj = gljUtil.getGLJPrice(glj, prjGLJDatas.data, calcOptions, labourCoeDatas, decimalObj, false, _, scMathUtil);
+                        rationItem.marketPrice = newGlj.marketPrice;
+                        rationItem.basePrice =  newGlj.basePrice;
+                        rationItem.adjustPrice = newGlj.adjustPrice;
+                        rationItem.marketUnitFee = newGlj.marketPrice;//更新树节点市场单价列的值
+                    }
+                }
+            }
+            // console.log("重新计算!");
+        }
+        //
         let rptDataObj = {};
         rptDataObj[JV.DATA_DISCRETE_DATA] = [];
         rptDataObj[JV.DATA_MASTER_DATA] = [];
@@ -1143,6 +1182,43 @@ function setupMainFunc(obj, prop, ownRawObj) {
     obj[prop].getFee = ext_mainGetFee;
 }
 
+function setupFeeRate(feeRateData){
+    let cacheObj = {}, topArr = [], rstArr = [], id_pre = 'ID_';
+    const rateProperties = [];
+    for (let rate of feeRateData.rates) {
+        cacheObj[id_pre + rate._doc.ID] = {"obj": rate._doc, "items": []};
+        // cacheObj[id_pre + rate.ID].items = [];
+        if (rate._doc.ParentID === null || rate._doc.ParentID === undefined) {
+            topArr.push(cacheObj[id_pre + rate._doc.ID]);
+        }
+    }
+    for (let rate of feeRateData.rates) {
+        if (rate._doc.ParentID && cacheObj[id_pre + rate._doc.ParentID]) {
+            cacheObj[id_pre + rate._doc.ParentID].items.push(cacheObj[id_pre + rate._doc.ID]);
+            if (rateProperties.indexOf(rate._doc.name) < 0) {
+                rateProperties.push(rate._doc.name);
+            }
+        }
+    }
+    let pri_func_set_property_rate = function (orgRateItem, rstRateItem) {
+        rstRateItem[orgRateItem.obj.name] = orgRateItem.obj.rate;
+        for (let subOrgRateItem of orgRateItem.items) {
+            pri_func_set_property_rate(subOrgRateItem, rstRateItem);
+        }
+    };
+    for (let topRate of topArr) {
+        let rstItem = {"name": topRate.obj.name};
+        for (let property of rateProperties) {
+            rstItem[property] = 0;
+        }
+        for (let dtlRateItem of topRate.items) {
+            pri_func_set_property_rate(dtlRateItem, rstItem);
+        }
+        rstArr.push(rstItem);
+    }
+    return rstArr;
+}
+
 function setupFunc(obj, prop, ownRawObj) {
     obj[prop] = {};
     obj[prop]["myOwnRawDataObj"] = ownRawObj;
@@ -1154,6 +1230,8 @@ function setupFunc(obj, prop, ownRawObj) {
     obj[prop].getArrayValues = ext_getArrayValues;
     obj[prop].getArrayItemByKey = ext_getArrayItemByKey;
     obj[prop].getPropertyByFlag = ext_getPropertyByFlag;
+    obj[prop].getSubRateProperty = ext_getRateProperty;
+    obj[prop].getRateProperty = ext_getRateProperty;
     obj[prop].getBlank = ext_getBlank;
     if (prop === projectConst.CALC_PROGRAM) obj[prop].getCalcProperty = ext_getCalcProperty;
     if (prop === projectConst.FEERATE) obj[prop].getFeeRate = ext_getFeeRate;
@@ -1250,6 +1328,17 @@ function ext_mainGetPropety(propKey) {
     return rst;
 }
 
+function ext_getRateProperty(propKey) {
+    let rst = [], parentObj = this;
+    let dtObj = parentObj["myOwnRawDataObj"];
+    if (propKey && dtObj) {
+        for (let rate of dtObj.data._doc.rates) {
+            rst.push(rate[propKey]);
+        }
+    }
+    return rst;
+}
+
 function ext_getPropety(propKey) {
     let rst = [], parentObj = this;
     let dtObj = parentObj["myOwnRawDataObj"];

+ 1 - 1
public/web/rpt_value_define.js

@@ -130,6 +130,7 @@ const JV = {
     PROP_DISCRETE_FIELDS: "discrete_field_s",
     PROP_FLOW_FIELDS: "flow_field_s",
     PROP_BILL_FIELDS: "bill_field_s",
+    PROP_CROSS_FIELDS: "cross_field_s",
     PROP_GROUP_FIELDS: "group_field_s", //用来分组的指标(如按清单、定额etc...)
     PROP_GROUP_LINES: "group_lines",    //显示分组行,因分组的特殊性,分组的数据当成流水数据一样(行高相同),group_lines里的每一条数据占用流水的一整行,里面再细分(指标/text)
     PROP_GROUP_SUM_KEYS: "SumKey_S",
@@ -177,7 +178,6 @@ const JV = {
     PROP_IS_ID: "isID",
     PROP_ID_SEQ: "IDSeq",
 
-    TAB_CROSS_FIELDS: "cross_field_s",
     TAB_FIELD_PROP_SORT: "Sort",
     TAB_FIELD_PROP_SORT_VAL_NOSORT: "no_sort",
     TAB_FIELD_PROP_SORT_VAL_ASC: "ascend",

+ 25 - 0
web/maintain/report/html/rpt_tpl_dtl_field_loc.html

@@ -18,6 +18,30 @@
                     </div>
                 </div>
             </div>
+            <div class="row" id="element_hidden">
+                <!--
+                <div class="form-group col-md-2">
+                    <label>排序类型</label>
+                    <select class="form-control" id="elementSortType" onchange=""><option>ascend</option><option>descend</option></select>
+                </div>
+                -->
+                <div class="form-group col-md-1">
+                    <label>是否隐藏</label>
+                    <div class="form-check">
+                        <label class="form-check-label">
+                            <input type="checkbox" class="form-check-input" id="eleFieldHidden" onchange="rpt_tpl_cfg_helper.hiddenChange(this)">
+                        </label>
+                    </div>
+                </div>
+                <div class="form-group col-md-2">
+                    <label>交叉行序号字段</label>
+                    <div class="form-check">
+                        <label class="form-check-label">
+                            <input type="checkbox" class="form-check-input" id="eleFieldSerial" onchange="rpt_tpl_cfg_helper.crossRowIsSerialChange(this)">
+                        </label>
+                    </div>
+                </div>
+            </div>
             <div class="row" id="element_font">
                 <div class="form-group col-md-3">
                     <label>字体选择</label>
@@ -163,6 +187,7 @@
                     <input class="form-control" id="eleDftValue" value="" onkeyup="rpt_tpl_cfg_helper.changeDftValue(this)">
                 </div>
             </div>
+
             <div class="row" id="element_visual_div1" style="display: none">
                 <%include ./rpt_tpl_dtl_vis_column.html %>
             </div>

+ 15 - 11
web/maintain/report/html/rpt_tpl_dtl_info.html

@@ -9,14 +9,14 @@
                 <label>页面</label>
                 <div class="row">
                     <div class="input-group col-4">
-                        <div class="input-group-addon">纸张</div>
-                        <select class="form-control input-sm" id="rptTplPageSize"><option>A3</option><option>A4</option></select>
-                    </div>
-                    <div class="input-group col-4">
                         <div class="input-group-addon">方向</div>
                         <select class="form-control input-sm" id="rptTplPageOrientation"><option>横向</option><option>竖向</option></select>
                     </div>
                     <div class="input-group col-4">
+                        <div class="input-group-addon">纸张</div>
+                        <select class="form-control input-sm" id="rptTplPageSize"><option>A3</option><option>A4</option></select>
+                    </div>
+                    <div class="input-group col-4">
                         <div class="input-group-addon">单位</div>
                         <select class="form-control input-sm" id="rptTplUnit"><option>厘米</option></select>
                     </div>
@@ -36,19 +36,23 @@
                 </div>
             </div>
             <div class="row" id="element_content_height_width">
-                <div class="form-group col-md-6">
-                    <label>显示行 - 高度</label>
+                <div class="form-group col-md-3" id="flow_content_height_div">
+                    <label>流水显示行 - 高度</label>
                     <input class="form-control input-sm" id="element_content_height" type="number" value="0.6" step="0.1" min="0" max="50" onchange="zTreeOprObj.changeProperty(`流水式表_信息.流水式表_数据.CommonHeight`, this)" disabled>
                 </div>
-                <div class="form-group col-md-6">
-                    <label>显示列 - 宽度</label>
-                    <input class="form-control input-sm" id="element_content_width" type="number" value="4.0" step="0.1" min="0" max="50" onchange="zTreeOprObj.changeProperty(`流水式表_信息.流水式表_数据.CommonWidth`, this)" disabled>
+                <div class="form-group col-md-3" id="cross_row_height_div" style="display: none">
+                    <label>交叉显示行 - 高度</label>
+                    <input class="form-control input-sm" id="element_cross_row_height" type="number" value="3.0" step="0.1" min="0" max="50" onchange="zTreeOprObj.changeProperty(`交叉表_信息.交叉行.CommonHeight`, this)" disabled>
+                </div>
+                <div class="form-group col-md-3">
+                    <label>交叉显示列 - 宽度</label>
+                    <input class="form-control input-sm" id="element_content_width" type="number" value="4.0" step="0.1" min="0" max="50" onchange="zTreeOprObj.changeProperty(`交叉表_信息.交叉列.CommonWidth`, this)" disabled>
                 </div>
             </div>
             <div class="row" id="element_adhoc_flags">
                 <div class="input-group col-2">
-                    <div class="input-group-addon">计税方式</div>
-                    <select class="form-control input-sm" id="element_flags_select" onchange="zTreeOprObj.onChangeFlag('taxType', this)"><option value ="NA">N/A</option><option value ="1">一般计税</option><option value ="2">简易计税</option></select>
+                    <div class="input-group-addon">额外标记</div>
+                    <select class="form-control input-sm" id="element_flags_select" onchange="zTreeOprObj.onChangeFlag('taxType', this)"><option value ="NA">N/A</option><option value ="1">一般计税</option><option value ="2">简易计税</option><option value ="3">预算</option><option value ="4">工程量清单</option></select>
                 </div>
             </div>
         </div>

+ 24 - 0
web/maintain/report/js/rpt_tpl_cfg_helper.js

@@ -71,6 +71,7 @@ let rpt_tpl_cfg_helper = {
     checkAndSetSelectedNodeCfg: function (treeNode) {
         let me = rpt_tpl_cfg_helper;
         if (treeNode[JV.PROP_AREA]) {
+            $("#element_hidden")[0].style.display = "";
             $("#element_font")[0].style.display = "";
             $("#element_border")[0].style.display = "";
             $("#element_control")[0].style.display = "";
@@ -103,6 +104,7 @@ let rpt_tpl_cfg_helper = {
                 }
             } else {
                 $("#element_pre_suff")[0].style.display = "none";
+                $("#element_hidden")[0].style.display = "none";
             }
             //setup auto height
             if (treeNode[JV.PROP_IS_AUTO_HEIGHT]) {
@@ -110,6 +112,18 @@ let rpt_tpl_cfg_helper = {
             } else {
                 $("#eleAutoHeight").get(0).checked = false;
             }
+            //setup hidden
+            if (treeNode[JV.PROP_HIDDEN]) {
+                $("#eleFieldHidden").get(0).checked = true;
+            } else {
+                $("#eleFieldHidden").get(0).checked = false;
+            }
+            //setup cross-row serial
+            if (treeNode[JV.PROP_IS_SERIAL]) {
+                $("#eleFieldSerial").get(0).checked = true;
+            } else {
+                $("#eleFieldSerial").get(0).checked = false;
+            }
             //setup font
             let fontDom = $("#elementFonts").get(0);
             fontDom.removeAttribute("disabled");
@@ -136,6 +150,7 @@ let rpt_tpl_cfg_helper = {
             me.private_setup_area(treeNode);
         } else {
             $("#elementFonts").get(0).disabled = "disabled" ;
+            $("#element_hidden")[0].style.display = "none";
             $("#element_font")[0].style.display = "none";
             $("#element_border")[0].style.display = "none";
             $("#element_control")[0].style.display = "none";
@@ -177,6 +192,15 @@ let rpt_tpl_cfg_helper = {
                 $("#element_visual_div3")[0].style.display = "none";
             }
         }
+        if (!zTreeOprObj.isCrossTpl()) {
+            $("#element_hidden")[0].style.display = "none";
+        }
+    },
+    hiddenChange: function (dom) {
+        dataInfoMapTreeOprObj.currentNode[JV.PROP_HIDDEN] = dom.checked;
+    },
+    crossRowIsSerialChange: function (dom) {
+        dataInfoMapTreeOprObj.currentNode[JV.PROP_IS_SERIAL] = dom.checked;
     },
     fontChange: function(dom) {
         let me = rpt_tpl_cfg_helper, fontAttr = dom.value;

+ 164 - 9
web/maintain/report/js/rpt_tpl_data_map.js

@@ -20,6 +20,7 @@ let dataInfoMapTreeOprObj = {
             }
         }
         // me.treeObj.expandAll(true);
+        $("#element_hidden")[0].style.display = "none";
         $("#element_font")[0].style.display = "none";
         $("#element_border")[0].style.display = "none";
         $("#element_control")[0].style.display = "none";
@@ -55,7 +56,7 @@ let dataInfoMapTreeOprObj = {
         let private_addBandOption = function(prefix, bandObj, selector, nodeBandName) {
             selector.append("<option value='" + bandObj[JV.PROP_NAME] + "'>" + prefix + bandObj[JV.PROP_NAME] + "</option>");
             currentIdx++;
-            if (nodeBandName === bandObj[JV.PROP_NAME]) {
+            if (nodeBandName === $.trim(bandObj[JV.PROP_NAME])) {
                 selector[0].selectedIndex = currentIdx;
             }
             //selector.selectedIndex
@@ -100,8 +101,23 @@ let dataInfoMapTreeOprObj = {
             }
             $("#element_content_height").get(0).removeAttribute("disabled");
             $("#element_content_width").get(0).disabled = "disabled" ;
+            $("#element_cross_row_height").get(0).disabled = "disabled" ;
         } else if (rptTpl[JV.NODE_CROSS_INFO]) {
-            //
+            rst = me.buildCrossData(rptTpl);
+            $("#element_content_height_width")[0].style.display = "";
+            $("#element_content_width").get(0).removeAttribute("disabled");
+            $("#element_content_height").get(0).disabled = "disabled" ;
+            $("#element_cross_row_height").get(0).removeAttribute("disabled");
+            if (rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_ROW][JV.PROP_CMN_HEIGHT]) {
+                $("#element_cross_row_height")[0].value = rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_ROW][JV.PROP_CMN_HEIGHT];
+            } else {
+                $("#element_cross_row_height")[0].value = 0.6;
+            }
+            if (rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_COL][JV.PROP_CMN_WIDTH]) {
+                $("#element_content_width")[0].value = rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_COL][JV.PROP_CMN_WIDTH];
+            } else {
+                $("#element_content_width")[0].value = 2.6;
+            }
         } else if (rptTpl[JV.NODE_BILL_INFO]) {
             rst = me.buildBillData(rptTpl);
             $("#element_content_height_width")[0].style.display = "none";
@@ -151,6 +167,35 @@ let dataInfoMapTreeOprObj = {
 
         return rst;
     },
+    buildCrossData: function (rptTpl) {
+        let me = this, rst = [];
+        let rootRowNode = {Name: JV.NODE_CROSS_ROW, type: "cross_row", isParent: true, Title: ""};
+        let rootColNode = {Name: JV.NODE_CROSS_COL, type: "cross_col", isParent: true, Title: "", items: [{"Name": "字段集", "items": [], "isParent": true, Title: ""}, {"Name": "文本集", "items": [], "isParent": true, Title: ""}]};
+        let rootFieldNode = {Name: JV.NODE_CROSS_CONTENT, type: "cross_field_data", isParent: true, Title: ""};
+        let rootColSumNode = {Name: JV.NODE_CROSS_COL_SUM, type: "cross_col_sum", isParent: true, Title: ""};
+        let rootRowExtNode = {Name: JV.NODE_CROSS_ROW_EXT, type: "cross_row_ext", isParent: true, Title: "", items: [{"Name": "字段集", "items": [], "isParent": true, Title: ""}, {"Name": "文本集", "items": [], "isParent": true, Title: ""}]};
+        let rootRowExtSumNode = {Name: JV.NODE_CROSS_ROW_SUM_EXT, type: "cross_row_ext_sum", isParent: true, Title: "", items: [{"Name": "字段集", "items": [], "isParent": true, Title: ""}, {"Name": "文本集", "items": [], "isParent": true, Title: ""}]};
+        let discreteNode = {Name: JV.NODE_DISCRETE_INFO, type: "discrete_data", isParent: true, Title: ""};
+
+        rst.push(rootRowNode);
+        rst.push(rootColNode);
+        rst.push(rootFieldNode);
+        rst.push(rootColSumNode);
+        rst.push(rootRowExtNode);
+        rst.push(rootRowExtSumNode);
+        rst.push(discreteNode);
+
+        me.private_build_content_field_data(rootRowNode, rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_ROW], JV.PROP_CROSS_FIELDS, rptTpl);
+        me.private_build_content_field_data(rootFieldNode, rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_CONTENT], JV.PROP_CROSS_FIELDS, rptTpl);
+        me.private_build_content_field_data(rootColSumNode, rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_COL_SUM], JV.PROP_CROSS_FIELDS, rptTpl);
+        me.private_build_cross_field_text_data(rootColNode, rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_COL], rptTpl);
+
+        me.private_build_cross_field_text_data(rootRowExtNode, rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_ROW_EXT], rptTpl);
+        me.private_build_cross_field_text_data(rootRowExtSumNode, rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_ROW_SUM_EXT], rptTpl);
+
+        me.private_build_discrete_data(discreteNode, rptTpl[JV.NODE_CROSS_INFO][JV.NODE_DISCRETE_INFO], rptTpl);
+        return rst;
+    },
     private_build_grp_data: function (grpNode, grpData, rptTpl) {
         let me = this;
         grpNode.items = [];
@@ -244,6 +289,24 @@ let dataInfoMapTreeOprObj = {
             }
         }
     },
+    private_build_cross_field_text_data: function(rootFieldNode, contentData, rptTpl) {
+        let me = this, bandName = contentData[JV.PROP_BAND_NAME];
+        if (rootFieldNode) {
+            rootFieldNode[JV.PROP_BAND_NAME] = bandName;
+            rootFieldNode.items[0].items = []; //指标集合
+            rootFieldNode.items[1].items = []; //文本集合
+            if (contentData[JV.PROP_CROSS_FIELDS] && contentData[JV.PROP_CROSS_FIELDS].length > 0) {
+                for (let fieldItem of contentData[JV.PROP_CROSS_FIELDS]) {
+                    rootFieldNode.items[0].push(me.private_build_field_node(fieldItem, rptTpl));
+                }
+            }
+            if (contentData[JV.PROP_TEXTS] && contentData[JV.PROP_TEXTS].length > 0) {
+                for (let txt of contentData[JV.PROP_TEXTS]) {
+                    rootFieldNode.items[1].push(me.private_build_text_node(txt));
+                }
+            }
+        }
+    },
     private_build_discrete_data: function (discreteNode, discreteData, rptTpl) {
         let me = this;
         discreteNode.isParent = true;
@@ -337,6 +400,8 @@ let dataInfoMapTreeOprObj = {
         if (source[JV.PROP_FORMAT]) destination[JV.PROP_FORMAT] = source[JV.PROP_FORMAT];
         if (source[JV.PROP_IS_AUTO_HEIGHT]) destination[JV.PROP_IS_AUTO_HEIGHT] = true
         else destination[JV.PROP_IS_AUTO_HEIGHT] = false;
+        if (source[JV.PROP_HIDDEN]) destination[JV.PROP_HIDDEN] = true;
+        if (source[JV.PROP_IS_SERIAL]) destination[JV.PROP_IS_SERIAL] = true;
         if (source[JV.PROP_AREA]) {
             destination[JV.PROP_AREA] = {};
             me.private_copy_area(source[JV.PROP_AREA], destination[JV.PROP_AREA]);
@@ -464,14 +529,18 @@ let dataInfoMapTreeOprObj = {
     },
     onBeforeRemove: function(treeId, treeNode){
         let rst = true;
-        if (treeNode.isParent) {
-            if (treeNode.Name === `子项` && treeNode.getParentNode() !== null && treeNode.getParentNode().Name === `离散信息`) {
-                rst = confirm(`确认要删除此离散子项?`);
-            } else if (treeNode.Name === `行`) {
-                rst = confirm(`确认要删除此分组行?`);
-            }
+        if (treeNode.level === 0) {
+            rst = false;
         } else {
-            //
+            if (treeNode.isParent) {
+                if (treeNode.Name === `子项` && treeNode.getParentNode() !== null && treeNode.getParentNode().Name === `离散信息`) {
+                    rst = confirm(`确认要删除此离散子项?`);
+                } else if (treeNode.Name === `行`) {
+                    rst = confirm(`确认要删除此分组行?`);
+                }
+            } else {
+                //
+            }
         }
         return rst;
     },
@@ -554,6 +623,7 @@ let dataInfoMapTreeOprObj = {
                 treeNode[JV.PROP_NAME].indexOf(JV.NODE_FLOW_PAGE_SUM) === 0 ||
                 treeNode[JV.PROP_NAME].indexOf(JV.NODE_FLOW_SEG_SUM) === 0 ||
                 treeNode[JV.PROP_NAME].indexOf(JV.NODE_BILL_CONTENT) === 0 ||
+                treeNode[JV.PROP_NAME].indexOf("交叉") === 0 ||
                 treeNode[JV.PROP_NAME].indexOf("子项") === 0) {
                 rst = true;
             }
@@ -673,6 +743,68 @@ let dataInfoMapTreeOprObj = {
         }
         if (rptTpl[JV.NODE_CROSS_INFO]) {
             //2. 交叉表数据整理收集
+            let nodes = me.treeObj.getNodes();
+            for (let node of nodes) {
+                if (node[JV.PROP_NAME] === JV.NODE_DISCRETE_INFO) {
+                    rptTpl[JV.NODE_CROSS_INFO][JV.NODE_DISCRETE_INFO] = me.private_extract_discrete_info(node, rptTpl);
+                } else if (node[JV.PROP_NAME] === JV.NODE_CROSS_ROW) {
+                    let newCrossRow = {};
+                    newCrossRow[JV.PROP_BAND_NAME] = node[JV.PROP_BAND_NAME];
+                    newCrossRow[JV.PROP_CMN_HEIGHT] = $("#element_cross_row_height")[0].value;
+                    newCrossRow[JV.PROP_CALCULATION] = JV.CAL_TYPE[JV.CAL_TYPE_ABSTRACT];
+                    newCrossRow[JV.PROP_CROSS_FIELDS] = [];
+                    for (let subNode of node.items) {
+                        let f = {};
+                        me.private_copy_field_properties(subNode, f);
+                        newCrossRow[JV.PROP_CROSS_FIELDS].push(f);
+                    }
+                    rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_ROW] = newCrossRow;
+                } else if (node[JV.PROP_NAME] === JV.NODE_CROSS_COL) {
+                    let newCrossCol = {};
+                    newCrossCol[JV.PROP_CMN_WIDTH] = $("#element_content_width")[0].value;
+                    newCrossCol[JV.PROP_CALCULATION] = JV.CAL_TYPE[JV.CAL_TYPE_ABSTRACT];
+                    newCrossCol[JV.PROP_CROSS_FIELDS] = [];
+                    newCrossCol[JV.PROP_TEXTS] = [];
+                    me.private_assemble_cross_info(newCrossCol, node);
+                    rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_COL] = newCrossCol;
+                } else if (node[JV.PROP_NAME] === JV.NODE_CROSS_CONTENT) {
+                    let newCrossContent = {};
+                    newCrossContent[JV.PROP_BAND_NAME] = node[JV.PROP_BAND_NAME];
+                    newCrossContent[JV.PROP_CROSS_FIELDS] = [];
+                    for (let subNode of node.items) {
+                        let f = {};
+                        me.private_copy_field_properties(subNode, f);
+                        newCrossContent[JV.PROP_CROSS_FIELDS].push(f);
+                    }
+                    rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_CONTENT] = newCrossContent;
+                } else if (node[JV.PROP_NAME] === JV.NODE_CROSS_ROW_SUM) {
+                    //暂时木有,空白
+                } else if (node[JV.PROP_NAME] === JV.NODE_CROSS_COL_SUM) {
+                    let newCrossSumCol = {};
+                    newCrossSumCol[JV.PROP_BAND_NAME] = node[JV.PROP_BAND_NAME];
+                    newCrossSumCol[JV.PROP_CROSS_FIELDS] = [];
+                    for (let subNode of node.items) {
+                        let f = {};
+                        me.private_copy_field_properties(subNode, f);
+                        newCrossSumCol[JV.PROP_CROSS_FIELDS].push(f);
+                    }
+                    rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_COL_SUM] = newCrossSumCol;
+                } else if (node[JV.PROP_NAME] === JV.NODE_CROSS_ROW_EXT) {
+                    let newCrossRowExt = {};
+                    newCrossRowExt[JV.PROP_EXTENSION_TYPE] = "show_content";
+                    newCrossRowExt[JV.PROP_CROSS_FIELDS] = [];
+                    newCrossRowExt[JV.PROP_TEXTS] = [];
+                    me.private_assemble_cross_info(newCrossRowExt, node);
+                    rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_ROW_EXT] = newCrossRowExt;
+                } else if (node[JV.PROP_NAME] === JV.NODE_CROSS_ROW_SUM_EXT) {
+                    let newCrossRowSumExt = {};
+                    newCrossRowSumExt[JV.PROP_EXTENSION_TYPE] = "sum_row";
+                    newCrossRowSumExt[JV.PROP_CROSS_FIELDS] = [];
+                    newCrossRowSumExt[JV.PROP_TEXTS] = [];
+                    me.private_assemble_cross_info(newCrossRowSumExt, node);
+                    rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_ROW_SUM_EXT] = newCrossRowSumExt;
+                }
+            }
         }
         if (rptTpl[JV.NODE_BILL_INFO]) {
             //3. 账单式数据整理收集
@@ -740,6 +872,29 @@ let dataInfoMapTreeOprObj = {
         }
         return rst;
     },
+    private_assemble_cross_info: function (parentNode, treeNode) {
+        let me = dataInfoMapTreeOprObj;
+        parentNode[JV.PROP_BAND_NAME] = treeNode[JV.PROP_BAND_NAME];
+        for (let subNode of treeNode.items) {
+            if (subNode[JV.PROP_NAME] === "字段集") {
+                if (subNode.items && subNode.items.length > 0) {
+                    for (let sumField of subNode.items) {
+                        let item = {};
+                        parentNode[JV.PROP_CROSS_FIELDS].push(item);
+                        me.private_copy_field_properties(sumField, item);
+                    }
+                }
+            } else if (subNode[JV.PROP_NAME] === "文本集") {
+                if (subNode.items && subNode.items.length > 0) {
+                    for (let txt of subNode.items) {
+                        let item = {};
+                        parentNode[JV.PROP_TEXTS].push(item);
+                        me.private_copy_text_properties(txt, item);
+                    }
+                }
+            }
+        }
+    },
     private_extract_sum_info: function(sumNode) {
         let me = dataInfoMapTreeOprObj, rst = {};
         rst[JV.PROP_BAND_NAME] = sumNode[JV.PROP_BAND_NAME];

+ 10 - 0
web/maintain/report/js/rpt_tpl_helper.js

@@ -85,7 +85,17 @@ let tplHelper = {
             }
             if (rptTpl[JV.NODE_FLOW_INFO]) {
                 $("#multiColCnt")[0].style.display = "";
+                $("#flow_content_height_div")[0].style.display = "";
+                $("#cross_row_height_div")[0].style.display = "none";
+                $("#element_content_height").get(0).removeAttribute("disabled");
+                $("#element_content_width").get(0).disabled = "disabled" ;
                 $("#rptTplMultiCols")[0].value = rptTpl[JV.NODE_FLOW_INFO][JV.PROP_MULTI_COLUMN];
+            } else if (rptTpl[JV.NODE_CROSS_INFO]) {
+                $("#flow_content_height_div")[0].style.display = "none";
+                $("#cross_row_height_div")[0].style.display = "";
+                $("#multiColCnt")[0].style.display = "none";
+                $("#element_content_width").get(0).removeAttribute("disabled");
+                $("#element_content_height").get(0).disabled = "disabled" ;
             } else {
                 $("#multiColCnt")[0].style.display = "none";
             }

+ 24 - 0
web/maintain/report/js/rpt_tpl_main.js

@@ -821,6 +821,30 @@ let zTreeOprObj = {
             }
         }
     },
+    isFlowTpl: function () {
+        let rst = false;
+        let me = zTreeOprObj;
+        if (me.currentNode && me.currentNode.nodeType === RT.NodeType.TEMPLATE) {
+            rst = !!(me.currentNode.rptTpl[JV.NODE_FLOW_INFO]);
+        }
+        return rst;
+    },
+    isCrossTpl: function () {
+        let rst = false;
+        let me = zTreeOprObj;
+        if (me.currentNode && me.currentNode.nodeType === RT.NodeType.TEMPLATE) {
+            rst = !!(me.currentNode.rptTpl[JV.NODE_CROSS_INFO]);
+        }
+        return rst;
+    },
+    isBillTpl: function () {
+        let rst = false;
+        let me = zTreeOprObj;
+        if (me.currentNode && me.currentNode.nodeType === RT.NodeType.TEMPLATE) {
+            rst = !!(me.currentNode.rptTpl[JV.NODE_BILL_INFO]);
+        }
+        return rst;
+    },
     getFolderText: function (treeNode, separator) {
         let rst = "";
         if (treeNode) {

+ 131 - 41
web/maintain/report/js/rpt_tpl_pre_handle.js

@@ -21,6 +21,33 @@ const fixed_material_types = [
     {Name: "水泥(4)", Title: "", Value: 4},
     {Name: "标准砖(5)", Title: "", Value: 5}
 ];
+// const fixed_glj_types = [
+//     {Name: "人工(1)", Title: "", Value: 1},
+//     {Name: "普通材料(201)", Title: "", Value: 201},
+//     {Name: "混凝土(202)", Title: "", Value: 202},
+//     {Name: "砂浆(203)", Title: "", Value: 203},
+//     {Name: "配合比(204)", Title: "", Value: 204},
+//     {Name: "商品混凝土(205)", Title: "", Value: 205},
+//     {Name: "商品砂浆(206)", Title: "", Value: 206},
+//     {Name: "其他材料(207)", Title: "", Value: 207},
+//     {Name: "普通机械(301)", Title: "", Value: 301},
+//     {Name: "机械组成物(302)", Title: "", Value: 302},
+//     {Name: "机上人工(303)", Value: 303},
+//     {Name: "仪器仪表(304)", Value: 304},
+//     {Name: "燃料动力费(305)", Value: 305},
+//     {Name: "折旧费(306)", Value: 306},
+//     {Name: "检修费(307)", Value: 307},
+//     {Name: "维护费(308)", Value: 308},
+//     {Name: "安拆费及场外运费(309)", Value: 309},
+//     {Name: "校验费(310)", Value: 310},
+//     {Name: "其他费用(311)", Value: 311},
+//     {Name: "其他施工机具使用费(312)", Value: 312},
+//     {Name: "主材(4)", Title: "", Value: 4},
+//     {Name: "设备(5)", Title: "", Value: 5},
+//     {Name: "企业管理费(6)", Title: "", Value: 6},
+//     {Name: "利润(7)", Title: "", Value: 7},
+//     {Name: "一般风险费(8)", Title: "", Value: 8}
+// ];
 const fixed_glj_types = [
     {Name: "人工(1)", Title: "", Value: 1},
     {Name: "普通材料(201)", Title: "", Value: 201},
@@ -30,7 +57,7 @@ const fixed_glj_types = [
     {Name: "商品混凝土(205)", Title: "", Value: 205},
     {Name: "商品砂浆(206)", Title: "", Value: 206},
     {Name: "其他材料(207)", Title: "", Value: 207},
-    {Name: "普通机械(301)", Title: "", Value: 301},
+    {Name: "机械台班(301)", Title: "", Value: 301},
     {Name: "机械组成物(302)", Title: "", Value: 302},
     {Name: "机上人工(303)", Value: 303},
     {Name: "仪器仪表(304)", Value: 304},
@@ -48,51 +75,114 @@ const fixed_glj_types = [
     {Name: "利润(7)", Title: "", Value: 7},
     {Name: "一般风险费(8)", Title: "", Value: 8}
 ];
+// const fixed_top_bills_nodes = [
+//     {Name: "分部分项工程(1)", Title: "", Value: 1}
+//     ,{Name: "措施项目(2)", Title: "", Value: 2}
+//     ,{Name: "其他项目(7)", Title: "", Value: 7}
+//     ,{Name: "规费(15)", Title: "", Value: 15}
+//     ,{Name: "税金(18)", Title: "", Value: 18}
+//     ,{Name: "工程造价(19)", Title: "", Value: 19}
+// ];
 const fixed_top_bills_nodes = [
-    {Name: "分部分项工程(1)", Title: "", Value: 1}
-    ,{Name: "措施项目(2)", Title: "", Value: 2}
-    ,{Name: "其他项目(7)", Title: "", Value: 7}
-    ,{Name: "规费(15)", Title: "", Value: 15}
-    ,{Name: "税金(18)", Title: "", Value: 18}
-    ,{Name: "工程造价(19)", Title: "", Value: 19}
+    {Name: "建筑安装工程费(1)", Title: "", Value: 1}
+    ,{Name: "土地使用及拆迁补偿费(2)", Title: "", Value: 2}
+    ,{Name: "养护工程其他费用(3)", Title: "", Value: 3}
+    ,{Name: "预备费(4)", Title: "", Value: 4}
+    ,{Name: "一二三四部分合计(7)", Title: "", Value: 7}
+    ,{Name: "贷款利息(8)", Title: "", Value: 8}
+    ,{Name: "总造价(9)", Title: "", Value: 9}
 ];
+
+// const fixed_other_bills_types = [
+//     {Name: "施工技术措施项目(3)", Title: "", Value: 3}
+//     ,{Name: "安全文明施工按实计算费用(4)", Title: "", Value: 4}
+//     ,{Name: "施工组织措施专项费用(5)", Title: "", Value: 5}
+//     ,{Name: "安全文明施工专项费用(6)", Title: "", Value: 6}
+//     ,{Name: "暂列金额(8)", Title: "", Value: 8}
+//     ,{Name: "暂估价(9)", Title: "", Value: 9}
+//     ,{Name: "材料(工程设备)暂估价(10)", Title: "", Value: 10}
+//     ,{Name: "专业工程暂估价(11)", Title: "", Value: 11}
+//     ,{Name: "计日工(12)", Title: "", Value: 12}
+//     ,{Name: "总承包服务费(13)", Title: "", Value: 13}
+//     ,{Name: "索赔与现场签证(14)", Title: "", Value: 14}
+//     ,{Name: "社会保险费及住房公积金(16)", Title: "", Value: 16}
+//     ,{Name: "工程排污费(17)", Title: "", Value: 17}
+//     ,{Name: "增值税(20)", Title: "", Value: 20}
+// ];
 const fixed_other_bills_types = [
-    {Name: "施工技术措施项目(3)", Title: "", Value: 3}
-    ,{Name: "安全文明施工按实计算费用(4)", Title: "", Value: 4}
-    ,{Name: "施工组织措施专项费用(5)", Title: "", Value: 5}
-    ,{Name: "安全文明施工专项费用(6)", Title: "", Value: 6}
-    ,{Name: "暂列金额(8)", Title: "", Value: 8}
-    ,{Name: "暂估价(9)", Title: "", Value: 9}
-    ,{Name: "材料(工程设备)暂估价(10)", Title: "", Value: 10}
-    ,{Name: "专业工程暂估价(11)", Title: "", Value: 11}
-    ,{Name: "计日工(12)", Title: "", Value: 12}
-    ,{Name: "总承包服务费(13)", Title: "", Value: 13}
-    ,{Name: "索赔与现场签证(14)", Title: "", Value: 14}
-    ,{Name: "社会保险费及住房公积金(16)", Title: "", Value: 16}
-    ,{Name: "工程排污费(17)", Title: "", Value: 17}
-    ,{Name: "增值税(20)", Title: "", Value: 20}
+    {Name: "基本预备费(5)", Title: "", Value: 5}
+    ,{Name: "价差预备费(6)", Title: "", Value: 6}
+    ,{Name: "设备购置费(10)", Title: "", Value: 10}
+    ,{Name: "专项费用(11)", Title: "", Value: 11}
+    ,{Name: "施工场地建设费(12)", Title: "", Value: 12}
+    ,{Name: "养护单位(业主)管理费(13)", Title: "", Value: 13}
+    ,{Name: "信息化费", Title: "", Value: 14}
+    ,{Name: "工程监理费(15)", Title: "", Value: 15}
+    ,{Name: "设计文件审查费(16)", Title: "", Value: 16}
+    ,{Name: "勘察设计费(17)", Title: "", Value: 17}
+    ,{Name: "招标代理及标底编制费(18)", Title: "", Value: 18}
+    ,{Name: "第100章至700章清单(19)", Title: "", Value: 19}
+    ,{Name: "专项暂定合计(20)", Title: "", Value: 20}
+    ,{Name: "清单合计扣除专项暂定合计(21)", Title: "", Value: 21}
+    ,{Name: "计日工(22)", Title: "", Value: 22}
+    ,{Name: "劳务(23)", Title: "", Value: 23}
+    ,{Name: "材料(24)", Title: "", Value: 24}
+    ,{Name: "施工机械(25)", Title: "", Value: 25}
+    ,{Name: "暂列金额(26)", Title: "", Value: 26}
+    ,{Name: "安全生产费(27)", Title: "", Value: 27}
+    ,{Name: "100章清单(28)", Title: "", Value: 28}
 ];
+// const fixed_bills_flags = [
+//     {Name: "分部分项工程(1)", Title: "", Value: 1},
+//     {Name: "措施项目(2)", Title: "", Value: 2},
+//     {Name: "施工技术措施项目(3)", Title: "", Value: 3},
+//     {Name: "安全文明施工按实计算费用(4)", Title: "", Value: 4},
+//     {Name: "施工组织措施专项费用(5)", Title: "", Value: 5},
+//     {Name: "安全文明施工专项费用(6)", Title: "", Value: 6},
+//     {Name: "其他项目(7)", Title: "", Value: 7},
+//     {Name: "暂列金额(8)", Title: "", Value: 8},
+//     {Name: "暂估价(9)", Title: "", Value: 9},
+//     {Name: "材料(工程设备)暂估价(10)", Title: "", Value: 10},
+//     {Name: "专业工程暂估价(11)", Title: "", Value: 11},
+//     {Name: "计日工(12)", Title: "", Value: 12},
+//     {Name: "总承包服务费(13)", Title: "", Value: 13},
+//     {Name: "索赔与现场签证(14)", Title: "", Value: 14},
+//     {Name: "规费(15)", Title: "", Value: 15},
+//     {Name: "社会保险费及住房公积金(16)", Title: "", Value: 16},
+//     {Name: "工程排污费(17)", Title: "", Value: 17},
+//     {Name: "税金(18)", Title: "", Value: 18},
+//     {Name: "工程造价(19)", Title: "", Value: 19},
+//     {Name: "增值税(20)", Title: "", Value: 20}
+// ];
 const fixed_bills_flags = [
-    {Name: "分部分项工程(1)", Title: "", Value: 1},
-    {Name: "措施项目(2)", Title: "", Value: 2},
-    {Name: "施工技术措施项目(3)", Title: "", Value: 3},
-    {Name: "安全文明施工按实计算费用(4)", Title: "", Value: 4},
-    {Name: "施工组织措施专项费用(5)", Title: "", Value: 5},
-    {Name: "安全文明施工专项费用(6)", Title: "", Value: 6},
-    {Name: "其他项目(7)", Title: "", Value: 7},
-    {Name: "暂列金额(8)", Title: "", Value: 8},
-    {Name: "暂估价(9)", Title: "", Value: 9},
-    {Name: "材料(工程设备)暂估价(10)", Title: "", Value: 10},
-    {Name: "专业工程暂估价(11)", Title: "", Value: 11},
-    {Name: "计日工(12)", Title: "", Value: 12},
-    {Name: "总承包服务费(13)", Title: "", Value: 13},
-    {Name: "索赔与现场签证(14)", Title: "", Value: 14},
-    {Name: "规费(15)", Title: "", Value: 15},
-    {Name: "社会保险费及住房公积金(16)", Title: "", Value: 16},
-    {Name: "工程排污费(17)", Title: "", Value: 17},
-    {Name: "税金(18)", Title: "", Value: 18},
-    {Name: "工程造价(19)", Title: "", Value: 19},
-    {Name: "增值税(20)", Title: "", Value: 20}
+    {Name: "建筑安装工程费(1)", Title: "", Value: 1}
+    ,{Name: "土地使用及拆迁补偿费(2)", Title: "", Value: 2}
+    ,{Name: "养护工程其他费用(3)", Title: "", Value: 3}
+    ,{Name: "预备费(4)", Title: "", Value: 4}
+    ,{Name: "基本预备费(5)", Title: "", Value: 5}
+    ,{Name: "价差预备费(6)", Title: "", Value: 6}
+    ,{Name: "一二三四部分合计(7)", Title: "", Value: 7}
+    ,{Name: "贷款利息(8)", Title: "", Value: 8}
+    ,{Name: "总造价(9)", Title: "", Value: 9}
+    ,{Name: "设备购置费(10)", Title: "", Value: 10}
+    ,{Name: "专项费用(11)", Title: "", Value: 11}
+    ,{Name: "施工场地建设费(12)", Title: "", Value: 12}
+    ,{Name: "养护单位(业主)管理费(13)", Title: "", Value: 13}
+    ,{Name: "信息化费", Title: "", Value: 14}
+    ,{Name: "工程监理费(15)", Title: "", Value: 15}
+    ,{Name: "设计文件审查费(16)", Title: "", Value: 16}
+    ,{Name: "勘察设计费(17)", Title: "", Value: 17}
+    ,{Name: "招标代理及标底编制费(18)", Title: "", Value: 18}
+    ,{Name: "第100章至700章清单(19)", Title: "", Value: 19}
+    ,{Name: "专项暂定合计(20)", Title: "", Value: 20}
+    ,{Name: "清单合计扣除专项暂定合计(21)", Title: "", Value: 21}
+    ,{Name: "计日工(22)", Title: "", Value: 22}
+    ,{Name: "劳务(23)", Title: "", Value: 23}
+    ,{Name: "材料(24)", Title: "", Value: 24}
+    ,{Name: "施工机械(25)", Title: "", Value: 25}
+    ,{Name: "暂列金额(26)", Title: "", Value: 26}
+    ,{Name: "安全生产费(27)", Title: "", Value: 27}
+    ,{Name: "100章清单(28)", Title: "", Value: 28}
 ];
 const fixed_bills_types = [
     {Name: "大项费用(1)", Title: "", Value: 1},