Bladeren bron

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

zhongzewei 6 jaren geleden
bovenliggende
commit
1c86ed1f51

+ 7 - 1
modules/reports/facade/rpt_tpl_data_facade.js

@@ -7,9 +7,11 @@
 // let projectConst = consts.projectConst;
 let prjMdl = require('../../../modules/pm/models/project_model');
 let projectDataMdl = require('../../../modules/main/models/project');
+let projectFacade = require('../../../modules/main/facade/project_facade');
 
 module.exports = {
-    prepareProjectData: prepareProjectData
+    prepareProjectData: prepareProjectData,
+    getBudgetSummayDatas: getBudgetSummayDatas
 };
 
 function prepareProjectData(userId, prjId, filter, callback) {
@@ -38,4 +40,8 @@ function prepareProjectData(userId, prjId, filter, callback) {
             callback(err, msg, null);
         }
     });
+}
+
+async function getBudgetSummayDatas(prjIds) {
+    return await projectFacade.getBudgetSummayDatas(prjIds);
 }

+ 4 - 1
modules/reports/rpt_component/helper/jpc_helper_field.js

@@ -31,8 +31,11 @@ let JpcFieldHelper = {
     resetFormat: function (tab_field, map_field, customizeCfg) {
         let rst = false;
         if (map_field && map_field[JV.PROP_PRECISION] && map_field[JV.PROP_PRECISION].type === "fixed") {
-            let formatStrs = ["#."], ffStr = (customizeCfg && customizeCfg.fillZero)?"0":"#";
+            let formatStrs = ["#"], ffStr = (customizeCfg && customizeCfg.fillZero)?"0":"#";
             for (let idx = 0; idx < parseInt(map_field[JV.PROP_FIXED_PRECISION_AMT]); idx++) {
+                if (idx === 0) {
+                    formatStrs.push(".");
+                }
                 formatStrs.push(ffStr);
             }
             if (tab_field[JV.PROP_FORMAT] && tab_field[JV.PROP_FORMAT].indexOf(",") >= 0) {

+ 45 - 14
modules/reports/rpt_component/jpc_cross_tab.js

@@ -363,7 +363,9 @@ JpcCrossTabSrv.prototype.createNew = function(){
         return rst;
     };
     JpcCrossTabResult.outputPreviewRowTab = function(rptTpl, bands, controls, $CURRENT_RPT, customizeCfg, maxRowRec, unitFactor) {
-        return this.private_OutputPreviewCommon(rptTpl, bands, controls, $CURRENT_RPT, customizeCfg, maxRowRec, 1, rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_ROW], unitFactor);
+        let rst = this.private_OutputPreviewCommon(rptTpl, bands, controls, $CURRENT_RPT, customizeCfg, maxRowRec, 1, rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_ROW], unitFactor);
+        rst = rst.concat(this.private_OutputPreviewCommon(rptTpl, bands, controls, $CURRENT_RPT, customizeCfg, maxRowRec, 1, rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_ROW_AD_HOC], unitFactor));
+        return rst;
     };
     JpcCrossTabResult.outputPreviewColTab = function(rptTpl, bands, controls, $CURRENT_RPT, customizeCfg, maxColRec, unitFactor) {
         return this.private_OutputPreviewCommon(rptTpl, bands, controls, $CURRENT_RPT, customizeCfg, 1, maxColRec, rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_COL], unitFactor);
@@ -384,7 +386,7 @@ JpcCrossTabSrv.prototype.createNew = function(){
     };
     JpcCrossTabResult.private_OutputPreviewCommon = function(rptTpl, bands, controls, $CURRENT_RPT, customizeCfg, maxRowRec, maxColRec, tab, unitFactor) {
         let me = this, rst = [];
-        let band = bands[tab[JV.PROP_BAND_NAME]];
+        let band = (tab)?bands[tab[JV.PROP_BAND_NAME]]:null;
         if (band) {
             let tab_fields = tab[JV.PROP_CROSS_FIELDS];
             for (let rowIdx = 0; rowIdx < maxRowRec; rowIdx++) {
@@ -449,17 +451,19 @@ JpcCrossTabSrv.prototype.createNew = function(){
             JpcBandHelper.setBandArea(bands, rptTpl, me.pageStatusLst[page - 1]);
             //2. start to output detail-part
             //2.1 Row-Tab
-            tabRstLst.push(me.outputRowTab(rptTpl, dataObj, page, bands, unitFactor, controls, $CURRENT_RPT, customizeCfg));
+            //tabRstLst.push(me.outputRowTab(rptTpl, dataObj, page, bands, unitFactor, controls, $CURRENT_RPT, customizeCfg));
+            tabRstLst.push(me.outputRowTabCommon(rptTpl, dataObj, page, bands, JV.NODE_CROSS_ROW, unitFactor, controls, $CURRENT_RPT, customizeCfg));
+            tabRstLst.push(me.outputRowTabCommon(rptTpl, dataObj, page, bands, JV.NODE_CROSS_ROW_AD_HOC, unitFactor, controls, $CURRENT_RPT, customizeCfg));
             //2.2 Col-Tab
             tabRstLst.push(me.outputColTab(rptTpl, dataObj, page, bands, unitFactor, controls, $CURRENT_RPT, customizeCfg));
             //2.3 Content-Tab
             tabRstLst.push(me.outputContent(rptTpl, dataObj, page, bands, unitFactor, controls, $CURRENT_RPT, customizeCfg));
             //2.4 Sum-Tab Row
             //2.4 Sum-tab Col
-            tabRstLst.push(me.outputTabSum(rptTpl, dataObj, page, bands, unitFactor, JV.NODE_CROSS_COL_SUM, controls));
+            tabRstLst.push(me.outputTabSum(rptTpl, dataObj, page, bands, unitFactor, JV.NODE_CROSS_COL_SUM, controls, $CURRENT_RPT, customizeCfg));
             //2.x row tab ext
-            tabRstLst.push(me.outputTabExt(rptTpl, dataObj, page, bands, unitFactor, controls));
-            tabRstLst.push(me.outputSumTabExt(rptTpl, dataObj, page, bands, unitFactor, segIdx, controls));
+            tabRstLst.push(me.outputTabExt(rptTpl, dataObj, page, bands, unitFactor, controls, $CURRENT_RPT, customizeCfg));
+            tabRstLst.push(me.outputSumTabExt(rptTpl, dataObj, page, bands, unitFactor, segIdx, controls, $CURRENT_RPT, customizeCfg));
             //2.5 Discrete
             tabRstLst.push(JpcDiscreteHelper.outputDiscreteInfo(rptTpl[JV.NODE_CROSS_INFO][JV.NODE_DISCRETE_INFO], bands, dataObj, unitFactor, me.pageStatusLst[page - 1], segIdx, 1, 0, $CURRENT_RPT, customizeCfg));
         }
@@ -469,10 +473,10 @@ JpcCrossTabSrv.prototype.createNew = function(){
         }
         return rst;
     };
-    JpcCrossTabResult.outputRowTab = function(rptTpl, dataObj, page, bands, unitFactor, controls, $CURRENT_RPT, customizeCfg) {
+    JpcCrossTabResult.outputRowTabCommon = function(rptTpl, dataObj, page, bands, tabStr, unitFactor, controls, $CURRENT_RPT, customizeCfg) {
         let me = this, rst = [];
-        let tab = rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_ROW];
-        let band = bands[tab[JV.PROP_BAND_NAME]];
+        let tab = rptTpl[JV.NODE_CROSS_INFO][tabStr];
+        let band = (tab)?bands[tab[JV.PROP_BAND_NAME]]:null;
         if (band) {
             let pageStatus = me.pageStatusLst[page - 1];
             if (pageStatus[band[JV.BAND_PROP_DISPLAY_TYPE]] === true) {
@@ -616,7 +620,7 @@ JpcCrossTabSrv.prototype.createNew = function(){
         }
         return rst;
     };
-    JpcCrossTabResult.outputTabSum = function (rptTpl, dataObj, page, bands, unitFactor, tabNodeName, controls) {
+    JpcCrossTabResult.outputTabSum = function (rptTpl, dataObj, page, bands, unitFactor, tabNodeName, controls, $CURRENT_RPT, customizeCfg) {
         let me = this, rst = [],
             tab = rptTpl[JV.NODE_CROSS_INFO][tabNodeName],
             band = bands[tab[JV.PROP_BAND_NAME]];
@@ -625,6 +629,12 @@ JpcCrossTabSrv.prototype.createNew = function(){
             if (pageStatus[band[JV.BAND_PROP_DISPLAY_TYPE]] === true) {
                 let tab_fields = tab[JV.PROP_CROSS_FIELDS];
                 for (let i = 0; i < me.dispSumValueLst_Col[page - 1].length; i++) {
+                    if (i === 0) {
+                        for (let tfIdx = 0; tfIdx < tab_fields.length; tfIdx++) {
+                            let map_data_field = JE.F(tab_fields[tfIdx][JV.PROP_FIELD_ID], $CURRENT_RPT);
+                            JpcFieldHelper.resetFormat(tab_fields[tfIdx], map_data_field, customizeCfg);
+                        }
+                    }
                     if (me.dispSumValueLst_Col[page - 1][i] !== null) {
                         for (let j = 0; j < me.dispSumValueLst_Col[page - 1][i].length; j++) {
                             let tab_field = tab_fields[j];
@@ -654,7 +664,7 @@ JpcCrossTabSrv.prototype.createNew = function(){
         }
         return rst;
     };
-    JpcCrossTabResult.outputTabExt = function (rptTpl, dataObj, page, bands, unitFactor, controls) {
+    JpcCrossTabResult.outputTabExt = function (rptTpl, dataObj, page, bands, unitFactor, controls, $CURRENT_RPT, customizeCfg) {
         let me = this, rst = [], firstTextOutput = true,
             tab = rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_ROW_EXT];
         let band = bands[tab[JV.PROP_BAND_NAME]];
@@ -666,10 +676,20 @@ JpcCrossTabSrv.prototype.createNew = function(){
                     valuesIdx = me.dispValueIdxLst_Col[page - 1];
                 for (let i = 0; i < me.row_extension_fields_idx.length; i++) {
                     let tab_field = tab_fields[i];
-                    let data_field = data_details[me.row_extension_fields_idx[i]];
+                    let data_field = null;
+                    let map_data_field = JE.F(tab_field[JV.PROP_FIELD_ID], $CURRENT_RPT);
+                    if (typeof me.row_extension_fields_idx[i] !== 'object') {
+                        data_field = data_details[me.row_extension_fields_idx[i]];
+                    } else {
+                        if (map_data_field) {
+                            data_field = map_data_field[JV.PROP_AD_HOC_DATA];
+                        }
+                    }
+
                     if (!(tab_field[JV.PROP_HIDDEN])) {
                         let cols = valuesIdx.length;
                         for (let colIdx = 0; colIdx < cols; colIdx++) {
+                            if (colIdx === 0) JpcFieldHelper.resetFormat(tab_field, map_data_field, customizeCfg);
                             rst.push(me.outputTabField(band, tab_field, data_field, valuesIdx[colIdx], -1, 1, 0, cols, colIdx, unitFactor, false, controls));
                             //2. output texts if has
                             if (firstTextOutput) {
@@ -690,7 +710,7 @@ JpcCrossTabSrv.prototype.createNew = function(){
         }
         return rst;
     };
-    JpcCrossTabResult.outputSumTabExt = function (rptTpl, dataObj, page, bands, unitFactor, segIdx, controls) {
+    JpcCrossTabResult.outputSumTabExt = function (rptTpl, dataObj, page, bands, unitFactor, segIdx, controls, $CURRENT_RPT, customizeCfg) {
         let me = this, rst = [],
             tab = rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_ROW_SUM_EXT];
         let band = bands[tab[JV.PROP_BAND_NAME]];
@@ -701,7 +721,18 @@ JpcCrossTabSrv.prototype.createNew = function(){
                     data_details = dataObj[JV.DATA_DETAIL_DATA],
                     data_fields = [];
                 for (let i = 0; i < me.row_sum_extension_fields_idx.length; i++) {
-                    let data_field = data_details[me.row_sum_extension_fields_idx[i]];
+                    // let data_field = data_details[me.row_sum_extension_fields_idx[i]];
+                    let tab_field = tab_fields[i];
+                    let data_field = null;
+                    let map_data_field = JE.F(tab_field[JV.PROP_FIELD_ID], $CURRENT_RPT);
+                    if (typeof me.row_sum_extension_fields_idx[i] !== 'object') {
+                        data_field = data_details[me.row_sum_extension_fields_idx[i]];
+                    } else {
+                        if (map_data_field) {
+                            data_field = map_data_field[JV.PROP_AD_HOC_DATA];
+                        }
+                    }
+                    JpcFieldHelper.resetFormat(tab_field, map_data_field, customizeCfg);
                     data_fields.push(data_field);
                 }
                 //2. initialize grand total value

+ 7 - 7
modules/reports/rpt_component/jpc_flow_tab.js

@@ -911,7 +911,7 @@ JpcFlowTabSrv.prototype.createNew = function(){
                     for (let i = 0; i < tab_fields.length; i++) {
                         let tab_field = tab_fields[i];
                         if (!(tab_field[JV.PROP_HIDDEN])) {
-                            rst.push(me.outputTabField(band, tab_field, null, -1, -1, maxRec, rowIdx, 1, 0, unitFactor, true, controls, 0));
+                            rst.push(me.outputTabField(band, tab_field, null, -1, -1, maxRec, rowIdx, 1, 0, unitFactor, false, controls, 0));
                         }
                     }
                 }
@@ -981,11 +981,11 @@ JpcFlowTabSrv.prototype.createNew = function(){
                         }
                         if (!(tab_field[JV.PROP_HIDDEN])) {
                             if (contentValuesIdx[rowIdx][0] !== JV.TYPE_FOLLOW_MODE && contentValuesIdx[rowIdx][1] === JV.DISPLAY_VAL_TYPE_NORMAL) {
-                                rst.push(me.outputTabField(band, tab_field, data_field, contentValuesIdx[rowIdx][2], -1, contentValuesIdx.length, rowIdx, 1, 0, unitFactor, true, controls, multiColIdx));
+                                rst.push(me.outputTabField(band, tab_field, data_field, contentValuesIdx[rowIdx][2], -1, contentValuesIdx.length, rowIdx, 1, 0, unitFactor, false, controls, multiColIdx));
                             } else if (contentValuesIdx[rowIdx][1] === JV.DISPLAY_VAL_TYPE_AUTO_HEIGHT) {
                                 if (contentValuesIdx[rowIdx][4] === 1) {
                                     //等效于普通输出
-                                    rst.push(me.outputTabField(band, tab_field, data_field, contentValuesIdx[rowIdx][2], -1, contentValuesIdx.length, rowIdx, 1, 0, unitFactor, true, controls, multiColIdx));
+                                    rst.push(me.outputTabField(band, tab_field, data_field, contentValuesIdx[rowIdx][2], -1, contentValuesIdx.length, rowIdx, 1, 0, unitFactor, false, controls, multiColIdx));
                                 } else {
                                     //这里需要做些style调整(中间的那些横杠线去掉)
                                     let cellItem = me.outputAutoHeightTabField(band, tab_field, data_field, contentValuesIdx[rowIdx], contentValuesIdx.length, rowIdx, 1, 0, unitFactor, true, controls, multiColIdx);
@@ -1038,7 +1038,7 @@ JpcFlowTabSrv.prototype.createNew = function(){
                             }
                             if (!(tab_fieldex[JV.PROP_HIDDEN])) {
                                 if (contentValuesIdx[rowIdx][0] === JV.TYPE_FOLLOW_MODE && contentValuesIdx[rowIdx][1] === JV.DISPLAY_VAL_TYPE_NORMAL) {
-                                    rst.push(me.outputTabField(band, tab_fieldex, data_fieldex, contentValuesIdx[rowIdx][2], -1, contentValuesIdx.length, rowIdx, 1, 0, unitFactor, true, controls, multiColIdx));
+                                    rst.push(me.outputTabField(band, tab_fieldex, data_fieldex, contentValuesIdx[rowIdx][2], -1, contentValuesIdx.length, rowIdx, 1, 0, unitFactor, false, controls, multiColIdx));
                                 }
                             }
                         }
@@ -1164,7 +1164,7 @@ JpcFlowTabSrv.prototype.createNew = function(){
                     }
                     //备注:考虑到有时候会出现没有数据可合计的scenario,得有容错处理
                     let cellItem = JpcCommonOutputHelper.createCommonOutput(tab_fields[i], sumVal, controls);
-                    cellItem[JV.PROP_AREA] = JpcAreaHelper.outputArea(tab_fields[i][JV.PROP_AREA], band, unitFactor, 1, 0, 1, 0, me.multiCols, 0, true, false);
+                    cellItem[JV.PROP_AREA] = JpcAreaHelper.outputArea(tab_fields[i][JV.PROP_AREA], band, unitFactor, 1, 0, 1, 0, me.multiCols, 0, false, false);
                     rst.push(cellItem);
                 }
                 rst = rst.concat(me.commonTabRestOutput(dataObj, page, segIdx, bands, band, unitFactor, tab, 0));
@@ -1194,7 +1194,7 @@ JpcFlowTabSrv.prototype.createNew = function(){
                         }
                     }
                     let cellItem = JpcCommonOutputHelper.createCommonOutput(tab_fields[i], me.pageSumValLst[page - 1][i], controls);
-                    cellItem[JV.PROP_AREA] = JpcAreaHelper.outputArea(tab_fields[i][JV.PROP_AREA], band, unitFactor, 1, 0, 1, 0, me.multiCols, 0, true, false);
+                    cellItem[JV.PROP_AREA] = JpcAreaHelper.outputArea(tab_fields[i][JV.PROP_AREA], band, unitFactor, 1, 0, 1, 0, me.multiCols, 0, false, false);
                     rst.push(cellItem);
                 }
                 rst = rst.concat(me.commonTabRestOutput(dataObj, page, segIdx, bands, band, unitFactor, tab, 0));
@@ -1205,7 +1205,7 @@ JpcFlowTabSrv.prototype.createNew = function(){
     JpcFlowTabResult.outputTabField = function (band, tab_field, data_field, valueIdx, serialIdx, rows, rowIdx, cols, colIdx, unitFactor, isRow, controls, multiColIdx) {
         let me = this,
             rst = JpcCommonOutputHelper.createCommonOutput(tab_field, JpcFieldHelper.getValue(data_field, valueIdx), controls);
-        rst[JV.PROP_AREA] = JpcAreaHelper.outputArea(tab_field[JV.PROP_AREA], band, unitFactor, rows, rowIdx, cols, colIdx, me.multiCols, multiColIdx, true, false);
+        rst[JV.PROP_AREA] = JpcAreaHelper.outputArea(tab_field[JV.PROP_AREA], band, unitFactor, rows, rowIdx, cols, colIdx, me.multiCols, multiColIdx, isRow, false);
         return rst;
     };
     JpcFlowTabResult.outputAutoHeightTabField = function (band, tab_field, data_field, contentValInfo, rows, rowIdx, cols, colIdx, unitFactor, isRow, controls, multiColIdx) {

+ 2 - 1
modules/reports/rpt_component/jpc_rte.js

@@ -64,7 +64,7 @@ let JE = {
         }
     },
     getFieldValue: function (field, dataObj, valIdx, newVal) {
-        let rst = newVal;
+        let rst = null;
         if (field.DataNodeName === "NA") {
             if (!field[JV.PROP_AD_HOC_DATA]) {
                 field[JV.PROP_AD_HOC_DATA] = [];
@@ -91,6 +91,7 @@ let JE = {
                 }
             }
         }
+        if (rst === null || rst === undefined) rst = newVal;
         return rst;
     },
     removeFieldValue: function (field, dataObj, valIdx) {

+ 8 - 3
modules/reports/util/rpt_yanghu_data_util.js

@@ -1115,6 +1115,7 @@ function sortData(sourceData, sortCfg, prjData) {
             let destArr = [];
             // fsUtil.writeObjToFile(newTopArr, "D:/GitHome/ConstructionCost/tmp/sortedAndFlattedRstBefore.jsp");
             treeUtil.getFlatArray(newTopArr, destArr, true);
+            // console.log(destArr);
             replaceActDataArr(sourceData, destArr);
             // fsUtil.writeObjToFile(sourceData.data, "D:/GitHome/ConstructionCost/tmp/sortedAndFlattedRst.jsp");
             break;
@@ -1212,7 +1213,7 @@ function setupFeeRate(feeRateData){
         }
     };
     for (let topRate of topArr) {
-        let rstItem = {"name": topRate.obj.name};
+        let rstItem = {"name": topRate.obj.name, "ID": topRate.obj.ID};
         for (let property of rateProperties) {
             rstItem[property] = 0;
         }
@@ -1585,7 +1586,7 @@ function ext_getCalcProperty(templateIDs, calcItemKey, calcItemKeyVal, calcItemR
     return rst;
 }
 
-function ext_getFeeRate(fee_Ids){
+function ext_getFeeRate(fee_Ids, feeName){
     let rst = [], parentObj = this; //this should be "feeRate" object
     let dtObj = parentObj["myOwnRawDataObj"];
     let optimizeObj = {};
@@ -1602,7 +1603,8 @@ function ext_getFeeRate(fee_Ids){
             }
         }
         if (feeRateItemObj) {
-            rst.push(feeRateItemObj.rate);
+            //rst.push(feeRateItemObj.rate);
+            rst.push(feeRateItemObj[feeName]);
         } else {
             rst.push(0);
         }
@@ -1792,6 +1794,9 @@ function getActDataArr(dtObj) {
         if (dtObj.moduleName === "projectGLJ") {
             rst = dtObj.data.gljList;
         }
+        if (dtObj.moduleName === "calc_program") {
+            rst = dtObj.data.templates;
+        }
     }
     return rst;
 }

+ 1 - 0
public/web/rpt_value_define.js

@@ -10,6 +10,7 @@ const JV = {
     NODE_CROSS_COL_SUM: "交叉列合计",
     NODE_CROSS_ROW_EXT: "交叉行拓展",
     NODE_CROSS_ROW_SUM_EXT: "交叉行拓展合计",
+    NODE_CROSS_ROW_AD_HOC: "交叉行AD_HOC",
     NODE_FIELD_MAP: "指标_数据_映射",
     NODE_DISCRETE_FIELDS: "离散指标_集合",
     NODE_NO_MAPPING_FIELDS: "无映射离散指标_集合",

+ 4 - 0
web/maintain/report/js/rpt_tpl_band.js

@@ -151,6 +151,10 @@ let bandTreeOprObj = {
             let newBand = me.createDftBand();
             let newNodes = [], isSilent = false;
             newNodes.push(newBand);
+            if (!treeNode.hasOwnProperty("band_s")) {
+                treeNode["band_s"] = [];
+                treeNode.isParent = true;
+            }
             me.treeObj.addNodes(treeNode, -1, newNodes, isSilent);
         });
     },

+ 16 - 11
web/maintain/report/js/rpt_tpl_data_map.js

@@ -170,6 +170,7 @@ let dataInfoMapTreeOprObj = {
     buildCrossData: function (rptTpl) {
         let me = this, rst = [];
         let rootRowNode = {Name: JV.NODE_CROSS_ROW, type: "cross_row", isParent: true, Title: ""};
+        let rootRowAdHocNode = {Name: JV.NODE_CROSS_ROW_AD_HOC, 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: ""};
@@ -178,6 +179,7 @@ let dataInfoMapTreeOprObj = {
         let discreteNode = {Name: JV.NODE_DISCRETE_INFO, type: "discrete_data", isParent: true, Title: ""};
 
         rst.push(rootRowNode);
+        rst.push(rootRowAdHocNode);
         rst.push(rootColNode);
         rst.push(rootFieldNode);
         rst.push(rootColSumNode);
@@ -186,6 +188,7 @@ let dataInfoMapTreeOprObj = {
         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(rootRowAdHocNode, rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_ROW_AD_HOC], 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);
@@ -276,15 +279,17 @@ let dataInfoMapTreeOprObj = {
         }
     },
     private_build_content_field_data: function(rootFieldNode, contentData, fieldsStr, rptTpl) {
-        let me = this, bandName = contentData[JV.PROP_BAND_NAME];
         if (rootFieldNode) {
-            rootFieldNode[JV.PROP_BAND_NAME] = bandName;
+            let me = this;
             rootFieldNode.items = [];
-            for (let fieldItem of contentData[fieldsStr]) {
-                if (fieldItem[JV.PROP_FIELD_ID]) {
-                    rootFieldNode.items.push(me.private_build_field_node(fieldItem, rptTpl))
-                } else if (fieldItem[JV.PROP_PARAM_ID]) {
-                    rootFieldNode.items.push(me.private_build_param_node(fieldItem, rptTpl));
+            if (contentData) {
+                rootFieldNode[JV.PROP_BAND_NAME] = contentData[JV.PROP_BAND_NAME];
+                for (let fieldItem of contentData[fieldsStr]) {
+                    if (fieldItem[JV.PROP_FIELD_ID]) {
+                        rootFieldNode.items.push(me.private_build_field_node(fieldItem, rptTpl))
+                    } else if (fieldItem[JV.PROP_PARAM_ID]) {
+                        rootFieldNode.items.push(me.private_build_param_node(fieldItem, rptTpl));
+                    }
                 }
             }
         }
@@ -586,8 +591,8 @@ let dataInfoMapTreeOprObj = {
     onBeforeDrop: function(treeId, treeNodes, targetNode, moveType){
         let rst = false;
         if (targetNode.Name === JV.NODE_FLOW_CONTENT || targetNode.Name === JV.NODE_BILL_CONTENT || targetNode.Name === JV.NODE_CROSS_CONTENT
-            || targetNode.Name === JV.NODE_CROSS_ROW || targetNode.Name === JV.NODE_CROSS_COL || targetNode.Name === JV.NODE_CROSS_COL_SUM
-            || targetNode.Name === JV.NODE_CROSS_ROW_SUM
+            || targetNode.Name === JV.NODE_CROSS_ROW || targetNode.Name === JV.NODE_CROSS_ROW_AD_HOC || targetNode.Name === JV.NODE_CROSS_COL
+            || targetNode.Name === JV.NODE_CROSS_COL_SUM || targetNode.Name === JV.NODE_CROSS_ROW_SUM
             || targetNode.Name === "离散字段集" || targetNode.Name === "统计指标集" || targetNode.Name === "分组判断指标集"
             || targetNode.Name === "分组字段集" || targetNode.Name === "字段集") {
             rst = true;
@@ -777,7 +782,7 @@ let dataInfoMapTreeOprObj = {
             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) {
+                } else if (node[JV.PROP_NAME] === JV.NODE_CROSS_ROW || node[JV.PROP_NAME] === JV.NODE_CROSS_ROW_AD_HOC) {
                     let newCrossRow = {};
                     newCrossRow[JV.PROP_BAND_NAME] = node[JV.PROP_BAND_NAME];
                     newCrossRow[JV.PROP_CMN_HEIGHT] = $("#element_cross_row_height")[0].value;
@@ -788,7 +793,7 @@ let dataInfoMapTreeOprObj = {
                         me.private_copy_field_properties(subNode, f);
                         newCrossRow[JV.PROP_CROSS_FIELDS].push(f);
                     }
-                    rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_ROW] = newCrossRow;
+                    rptTpl[JV.NODE_CROSS_INFO][node[JV.PROP_NAME]] = newCrossRow;
                 } else if (node[JV.PROP_NAME] === JV.NODE_CROSS_COL) {
                     let newCrossCol = {};
                     newCrossCol[JV.PROP_CMN_WIDTH] = $("#element_content_width")[0].value;

+ 8 - 1
web/maintain/report/js/rpt_tpl_pre_handle.js

@@ -189,7 +189,12 @@ const fixed_bills_types = [
     {Name: "分部(2)", Title: "", Value: 2},
     {Name: "分项(3)", Title: "", Value: 3},
     {Name: "清单(4)", Title: "", Value: 4},
-    {Name: "补项(5)", Title: "", Value: 5},
+    {Name: "补项(5)", Title: "", Value: 5}
+];
+const fixed_bills_special_provisional_types = [
+    {Name: "材料", Title: "", Value: "材料"},
+    {Name: "工程设备", Title: "", Value: "工程设备"},
+    {Name: "专业工程", Title: "", Value: "专业工程"}
 ];
 const exposed_bills_properties = [
     {Name: "清单_所属项目ID", Title: "", Key: "projectID", Order: "ascend"}
@@ -198,6 +203,8 @@ const exposed_bills_properties = [
     ,{Name: "清单_层次", Title: "", Key: "treeLevel", Order: "ascend"}
     ,{Name: "清单_类别", Title: "", Key: "type", Order: "ascend", individualType: fixed_bills_types}
     ,{Name: "清单_标记", Title: "", Key: "flags.flag", Order: "ascend", individualType: fixed_bills_flags}
+    ,{Name: "清单_顺序号", Title: "", Key: "treeFlatSerialOrder", Order: "ascend"}
+    ,{Name: "清单_专项类型", Title: "", Key: "specialProvisional", Order: "ascend", individualType: fixed_bills_special_provisional_types}
 ];
 const exposed_ration_properties = [
     {Name: "定额_工程内部ID", Title: "", Key: "ID", Order: "ascend"}