瀏覽代碼

流水表制作 code sync

TonyKang 7 年之前
父節點
當前提交
b0d4af2abf

+ 53 - 3
modules/reports/rpt_component/jpc_flow_tab.js

@@ -85,6 +85,7 @@ JpcFlowTabSrv.prototype.createNew = function(){
         me.seg_sum_fields_idx = [];
         me.seg_sum_tab_fields = [];
         me.page_sum_fields_idx = [];
+        me.page_sum_tab_fields = [];
 
         me.group_fields = [];
         me.group_sum_fields = [];
@@ -95,6 +96,7 @@ JpcFlowTabSrv.prototype.createNew = function(){
         me.pageStatusLst = [];
         me.groupSumValLst = [];
         me.segSumValLst = [];
+        me.pageSumValLst = [];
         me.multiCols = 1;
         me.pagesAmt = 0;
     };
@@ -102,7 +104,7 @@ JpcFlowTabSrv.prototype.createNew = function(){
         let me = this;
         let FLOW_NODE_STR = me.isEx?JV.NODE_FLOW_INFO_EX:JV.NODE_FLOW_INFO;
         JpcFieldHelper.findAndPutDataFieldIdx(rptTpl, rptTpl[FLOW_NODE_STR][JV.NODE_FLOW_SEG_SUM][JV.PROP_SUM_FIELDS], me.seg_sum_tab_fields, me.seg_sum_fields_idx, me.isEx);
-        JpcFieldHelper.findAndPutDataFieldIdx(rptTpl, rptTpl[FLOW_NODE_STR][JV.NODE_FLOW_PAGE_SUM][JV.PROP_SUM_FIELDS], null, me.page_sum_fields_idx, me.isEx);
+        JpcFieldHelper.findAndPutDataFieldIdx(rptTpl, rptTpl[FLOW_NODE_STR][JV.NODE_FLOW_PAGE_SUM][JV.PROP_SUM_FIELDS], me.page_sum_tab_fields, me.page_sum_fields_idx, me.isEx);
         JpcFieldHelper.findAndPutDataFieldIdx(rptTpl, rptTpl[FLOW_NODE_STR][JV.NODE_FLOW_GROUP][JV.PROP_GROUP_FIELDS], me.group_fields, null, me.isEx);
         JpcFieldHelper.findAndPutDataFieldIdx(rptTpl, rptTpl[FLOW_NODE_STR][JV.NODE_FLOW_GROUP][JV.PROP_SUM_FIELDS], me.group_sum_fields, null, me.isEx);
         for (let si = 0; si < dataSeq.length; si++) {
@@ -355,15 +357,18 @@ JpcFlowTabSrv.prototype.createNew = function(){
                     } else {
                         if (currentRecAmt + maxRowRec >= ttlSegRecAmt) {
                             pageStatus[JV.STATUS_SEGMENT_END] = true;
+                            pageStatus[JV.STATUS_REPORT_END] = true;
                             private_resetBandArea();
                             let hasAdHocRow = !JpcFlowTabHelper.chkSegEnd(bands, rptTpl, ttlSegRecAmt, currentRecAmt, maxRowRec, me.isEx);
                             if (hasAdHocRow) {
                                 //add page info(pre segment end)
                                 pageStatus[JV.STATUS_SEGMENT_END] = false;
+                                pageStatus[JV.STATUS_REPORT_END] = false;
                                 private_addPage(segIdx, grpSeqInfo, false, false, -1);
                             }
                             //add page info
                             pageStatus[JV.STATUS_SEGMENT_END] = true;
+                            pageStatus[JV.STATUS_REPORT_END] = true;
                             private_addPage(segIdx, grpSeqInfo, false, false, -1);
                         } else {
                             private_addPage(segIdx, grpSeqInfo, false, false, -1);
@@ -503,6 +508,7 @@ JpcFlowTabSrv.prototype.createNew = function(){
             // 2.3 Sum Seg
             tabRstLst.push(me.outputSegSum(rptTpl, dataObj, page, segIdx, bands, unitFactor, controls));
             // 2.4 Sum Page
+            tabRstLst.push(me.outputPageSum(rptTpl, dataObj, page, segIdx, bands, unitFactor, controls));
             // 2.5 Group
             // 2.6 Discrete
             tabRstLst.push(JpcDiscreteHelper.outputDiscreteInfo(rptTpl[FLOW_NODE_STR][JV.NODE_DISCRETE_INFO], bands, dataObj, unitFactor, me.pageStatusLst[page - 1], segIdx, 1, 0, $CURRENT_RPT));
@@ -536,6 +542,7 @@ JpcFlowTabSrv.prototype.createNew = function(){
                 // 2.3 Sum Seg
                 tabRstLst.push(me.outputSegSum(rptTpl, dataObj, actualPage, segIdx, bands, unitFactor, controls));
                 // 2.4 Sum Page
+                tabRstLst.push(me.outputPageSum(rptTpl, dataObj, actualPage, segIdx, bands, unitFactor, controls));
                 // 2.5 Group
                 // 2.6 Discrete
                 if (pi === 0) {
@@ -563,6 +570,15 @@ JpcFlowTabSrv.prototype.createNew = function(){
                 let data_details = me.isEx?dataObj[JV.DATA_DETAIL_DATA_EX]:dataObj[JV.DATA_DETAIL_DATA];
                 let data_details_ex = $CURRENT_RPT.isFollowMode?dataObj[JV.DATA_DETAIL_DATA_EX]:null;
                 let contentValuesIdx = me.dispValueIdxLst[page - 1];
+                let page_sum_data_fields = [];
+                for (let i = 0; i < me.page_sum_fields_idx.length; i++) {
+                    let data_field = data_details[me.page_sum_fields_idx[i]];
+                    page_sum_data_fields.push(data_field);
+                }
+                let rowGrandTotal = [];
+                for (let di = 0; di < page_sum_data_fields.length; di++) {
+                    rowGrandTotal.push(0.0);
+                }
                 //normal content
                 for (let rowIdx = 0; rowIdx < contentValuesIdx.length; rowIdx++) {
                     for (let i = 0; i < tab_fields.length; i++) {
@@ -603,7 +619,12 @@ JpcFlowTabSrv.prototype.createNew = function(){
                             }
                         }
                     }
+                    //page sum content
+                    for (let di = 0; di < page_sum_data_fields.length; di++) {
+                        rowGrandTotal[di] = rowGrandTotal[di] + 1.0 * JpcFieldHelper.getValue(page_sum_data_fields[di], contentValuesIdx[rowIdx][2]);
+                    }
                 }
+                me.pageSumValLst.push(rowGrandTotal);
                 //grouping content
                 for (let rowIdx = 0; rowIdx < contentValuesIdx.length; rowIdx++) {
                     if (contentValuesIdx[rowIdx][1] === JV.DISPLAY_VAL_TYPE_GROUP) {
@@ -672,6 +693,35 @@ JpcFlowTabSrv.prototype.createNew = function(){
         }
         return rst;
     };
+    JpcFlowTabResult.outputPageSum = function (rptTpl, dataObj, page, segIdx, bands, unitFactor, controls) {
+        let me = this, rst = [];
+        let FLOW_NODE_STR = me.isEx?JV.NODE_FLOW_INFO_EX:JV.NODE_FLOW_INFO;
+        let tab = rptTpl[FLOW_NODE_STR][JV.NODE_FLOW_PAGE_SUM];
+        let band = bands[tab[JV.PROP_BAND_NAME]];
+        if (band) {
+            let pageStatus = me.pageStatusLst[page - 1];
+            if (pageStatus[band[JV.BAND_PROP_DISPLAY_TYPE]]) {
+                let tab_fields = me.page_sum_tab_fields;
+                for (let i = 0; i < tab_fields.length; i++) {
+                    let cellItem = JpcCommonOutputHelper.createCommonOutput(tab_fields[i], me.pageSumValLst[page - 1], controls);
+                    cellItem[JV.PROP_AREA] = JpcAreaHelper.outputArea(tab_fields[i][JV.PROP_AREA], band, unitFactor, 1, 0, 1, 0, me.multiCols, 0, true, false);
+                    rst.push(cellItem);
+                }
+                if (tab[JV.PROP_TEXT]) {
+                    rst.push(JpcTextHelper.outputText(tab[JV.PROP_TEXT], band, unitFactor, 1, 0, 1, 0, me.multiCols, 0));
+                }
+                if (tab[JV.PROP_TEXTS]) {
+                    for (let j = 0; j < tab[JV.PROP_TEXTS].length; j++) {
+                        rst.push(JpcTextHelper.outputText(tab[JV.PROP_TEXTS][j], band, unitFactor, 1, 0, 1, 0, me.multiCols, 0));
+                    }
+                }
+                if (tab[JV.NODE_DISCRETE_INFO]) {
+                    rst = rst.concat(JpcDiscreteHelper.outputDiscreteInfo(tab[JV.NODE_DISCRETE_INFO], bands, dataObj, unitFactor, me.pageStatusLst[page - 1], segIdx, me.multiCols, 0));
+                }
+            }
+        }
+        return rst;
+    };
     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);
@@ -695,10 +745,10 @@ JpcFlowTabSrv.prototype.createNew = function(){
             }
         }
         if (grp_line[JV.PROP_DISCRETE_FIELDS]) {
-            //
+            //暂时不支持
         }
         if (grp_line[JV.PROP_PARAMS]) {
-            //
+            //暂时不支持
         }
         // console.log(rst);
         return rst;

+ 2 - 2
modules/reports/util/rpt_construct_data_util.js

@@ -747,7 +747,7 @@ function ext_getFee(feeKey, dtlFeeKey) {
 function pri_getFee(dItem, feeKey, dtlFeeKey) {
     let rst = 0;
     let hasValue = false;
-    if (dItem.hasOwnProperty("fees")) {
+    if (dItem["fees"]) {
         for (let fee of dItem["fees"]) {
             if (fee["fieldName"] === feeKey) {
                 if (dtlFeeKey) {
@@ -759,7 +759,7 @@ function pri_getFee(dItem, feeKey, dtlFeeKey) {
                 break;
             }
         }
-    } else if (dItem.hasOwnProperty(feeKey)) {
+    } else if (dItem[feeKey]) {
         hasValue = true;
         rst = dItem[feeKey];
     } else {

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

@@ -88,8 +88,9 @@ let dataInfoMapTreeOprObj = {
         rst.push(discreteNode);
         me.private_build_content_field_data(rootFieldNode, rptTpl[JV.NODE_FLOW_INFO][JV.NODE_FLOW_CONTENT], JV.PROP_FLOW_FIELDS, rptTpl);
         me.private_build_discrete_data(discreteNode, rptTpl[JV.NODE_FLOW_INFO][JV.NODE_DISCRETE_INFO], rptTpl);
-        me.private_build_column_data(rootColumnNode, rptTpl[JV.NODE_FLOW_INFO][JV.NODE_FLOW_COLUMN], rptTpl);
-
+        me.private_build_column_data(rootColumnNode, rptTpl[JV.NODE_FLOW_INFO][JV.NODE_FLOW_COLUMN]);
+        me.private_build_sum_data(rootChapterSumNode, rptTpl[JV.NODE_FLOW_INFO][JV.NODE_FLOW_SEG_SUM], rptTpl);
+        me.private_build_sum_data(rootPageSumNode, rptTpl[JV.NODE_FLOW_INFO][JV.NODE_FLOW_PAGE_SUM], rptTpl);
         return rst;
     },
     buildBillData: function(rptTpl) {
@@ -103,10 +104,29 @@ let dataInfoMapTreeOprObj = {
 
         return rst;
     },
+    private_build_sum_data: function(sumNode, sumData, rptTpl) {
+        let me = this;
+        sumNode.items = [];
+        let sum_fields = {Name: "统计指标集", items: [], isParent: true};
+        let texts = {Name: "文本集", items: [], isParent: true};
+        sumNode.items.push(sum_fields);
+        sumNode.items.push(texts);
+        if (sumData[JV.PROP_SUM_FIELDS]) {
+            for (let fieldItem of sumData[JV.PROP_SUM_FIELDS]) {
+                sum_fields.items.push(me.private_build_field_node(fieldItem, rptTpl))
+            }
+        }
+        if (sumData[JV.PROP_TEXTS]) {
+            for (let txt of sumData[JV.PROP_TEXTS]) {
+                texts.items.push(me.private_build_text_node(txt));
+            }
+        }
+    },
     private_build_column_data: function(columnNode, columnData) {
         let me = this;
         if (columnData[JV.PROP_TEXTS] && columnData[JV.PROP_TEXTS].length > 0) {
             columnNode.items = [];
+            columnNode.Title = "所在区域: " + columnNode[JV.PROP_BAND_NAME];
             for (let txt of columnData[JV.PROP_TEXTS]) {
                 columnNode.items.push(me.private_build_text_node(txt));
             }
@@ -367,10 +387,14 @@ let dataInfoMapTreeOprObj = {
     },
     onCheck: function (event,treeId,treeNode) {
         let me = dataInfoMapTreeOprObj;
-        if (me.currentNode[JV.PROP_BAND_NAME] && me.currentNode[JV.PROP_BAND_NAME] !== treeNode[JV.PROP_NAME])  {
+        if (me.currentNode.hasOwnProperty(JV.PROP_BAND_NAME) && me.currentNode[JV.PROP_BAND_NAME] !== treeNode[JV.PROP_NAME])  {
             // alert("change band from: " + me.currentNode[JV.PROP_BAND_NAME] + " to : " + treeNode[JV.PROP_NAME]);
             me.currentNode[JV.PROP_BAND_NAME] = treeNode[JV.PROP_NAME];
-            me.currentNode[JV.PROP_NAME] = "子项(所在区域:" + treeNode[JV.PROP_NAME] + ")";
+            if (me.currentNode[JV.PROP_NAME].indexOf("子项") >= 0) {
+                me.currentNode[JV.PROP_NAME] = "子项(所在区域:" + treeNode[JV.PROP_NAME] + ")";
+            } else {
+                me.currentNode.Title = "所在区域:" + treeNode[JV.PROP_NAME];
+            }
             me.treeObj.updateNode(me.currentNode);
         }
     },
@@ -410,7 +434,7 @@ let dataInfoMapTreeOprObj = {
         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 === "离散字段集" ) {
+            || targetNode.Name === "离散字段集" || targetNode.Name === "统计指标集") {
             rst = true;
         }
         return rst;
@@ -431,7 +455,7 @@ let dataInfoMapTreeOprObj = {
     },
     checkIfCanAddTxt: function(treeNode) {
         let rst = false;
-        if (treeNode[JV.PROP_NAME] === "离散文本集" || treeNode[JV.PROP_NAME] === JV.NODE_FLOW_COLUMN) {
+        if (treeNode[JV.PROP_NAME] === "离散文本集" || treeNode[JV.PROP_NAME] === "文本集" || treeNode[JV.PROP_NAME] === JV.NODE_FLOW_COLUMN) {
             rst = true;
         }
         return rst;
@@ -475,6 +499,7 @@ let dataInfoMapTreeOprObj = {
     extractTabFields: function (rptTpl) {
         let me = dataInfoMapTreeOprObj;
         if (rptTpl[JV.NODE_FLOW_INFO]) {
+            //1. 流水式数据整理收集
             let nodes = me.treeObj.getNodes();
             for (let node of nodes) {
                 if (node[JV.PROP_NAME] === JV.NODE_DISCRETE_INFO) {
@@ -503,18 +528,39 @@ let dataInfoMapTreeOprObj = {
                     }
                     rptTpl[JV.NODE_FLOW_INFO][JV.NODE_FLOW_COLUMN] = newColumn;
                 } else if (node[JV.PROP_NAME] === JV.NODE_FLOW_SEG_SUM) {
-                    //
+                    let newSegSum = me.private_extract_sum_info(node);
+                    // newSegSum[JV.PROP_BAND_NAME] = node[JV.PROP_BAND_NAME];
+                    // newSegSum[JV.PROP_SUM_FIELDS] = [];
+                    // newSegSum[JV.PROP_TEXTS] = [];
+                    // for (let subNode of node.items) {
+                    //     if (subNode[JV.PROP_NAME] === "统计指标集") {
+                    //         for (let sumField of subNode.items) {
+                    //             let item = {};
+                    //             newSegSum[JV.PROP_SUM_FIELDS].push(item);
+                    //             me.private_copy_field_properties(sumField, item);
+                    //         }
+                    //     } else if (subNode[JV.PROP_NAME] === "文本集") {
+                    //         for (let txt of subNode.items) {
+                    //             let item = {};
+                    //             newSegSum[JV.PROP_TEXTS].push(item);
+                    //             me.private_copy_text_properties(txt, item);
+                    //         }
+                    //     }
+                    // }
+                    rptTpl[JV.NODE_FLOW_INFO][JV.NODE_FLOW_SEG_SUM] = newSegSum;
                 } else if (node[JV.PROP_NAME] === JV.NODE_FLOW_PAGE_SUM) {
-                    //
+                    let newSegSum = me.private_extract_sum_info(node);
+                    rptTpl[JV.NODE_FLOW_INFO][JV.NODE_FLOW_PAGE_SUM] = newSegSum;
                 } else if (node[JV.PROP_NAME] === JV.NODE_FLOW_GROUP) {
                     //
                 }
             }
         }
         if (rptTpl[JV.NODE_CROSS_INFO]) {
-            //
+            //2. 交叉表数据整理收集
         }
         if (rptTpl[JV.NODE_BILL_INFO]) {
+            //3. 账单式数据整理收集
             let nodes = me.treeObj.getNodes();
             for (let node of nodes) {
                 if (node[JV.PROP_NAME] === JV.NODE_BILL_CONTENT) {
@@ -533,6 +579,28 @@ let dataInfoMapTreeOprObj = {
             }
         }
     },
+    private_extract_sum_info: function(sumNode) {
+        let me = dataInfoMapTreeOprObj, rst = {};
+        rst[JV.PROP_BAND_NAME] = sumNode[JV.PROP_BAND_NAME];
+        rst[JV.PROP_SUM_FIELDS] = [];
+        rst[JV.PROP_TEXTS] = [];
+        for (let subNode of sumNode.items) {
+            if (subNode[JV.PROP_NAME] === "统计指标集") {
+                for (let sumField of subNode.items) {
+                    let item = {};
+                    rst[JV.PROP_SUM_FIELDS].push(item);
+                    me.private_copy_field_properties(sumField, item);
+                }
+            } else if (subNode[JV.PROP_NAME] === "文本集") {
+                for (let txt of subNode.items) {
+                    let item = {};
+                    rst[JV.PROP_TEXTS].push(item);
+                    me.private_copy_text_properties(txt, item);
+                }
+            }
+        }
+        return rst;
+    },
     private_extract_discrete_info: function(discreteNode) {
         let me = this, rst = [];
         for (let dtlItemNode of discreteNode.items) {

+ 1 - 1
web/maintain/report/rpt_tpl_detail.html

@@ -26,7 +26,7 @@
             <%include ./rpt_tpl_detail_mapping_fields.html %>
             <!--指标摆放-->
             <%include ./rpt_tpl_detail_field_location.html %>
-            <!--预处理-->
+            <!--报表数据预处理-->
             <!--计算式-->
             <%include ./rpt_tpl_detail_calculation.html %>
         </div>

+ 4 - 4
web/maintain/report/rpt_tpl_detail_field_location.html

@@ -100,19 +100,19 @@
             <div class="row" id="element_area_1">
                 <div class="form-group col-md-3">
                     <label>输出区域-左</label>
-                    <input class="form-control input-sm" id="elementArea_Left" type="number" value="0" step="1" min="0" max="100" onchange="rpt_tpl_cfg_helper.changeArea(this, 'Left')" onkeypress="rpt_tpl_cfg_helper.changeArea(this, 'Left')">
+                    <input class="form-control input-sm" id="elementArea_Left" type="number" value="0" step="1" min="0" max="100" onchange="rpt_tpl_cfg_helper.changeArea(this, 'Left')" onkeyup="rpt_tpl_cfg_helper.changeArea(this, 'Left')">
                 </div>
                 <div class="form-group col-md-3">
                     <label>输出区域-右</label>
-                    <input class="form-control input-sm" id="elementArea_Right" type="number" value="0" step="1" min="0" max="100" onchange="rpt_tpl_cfg_helper.changeArea(this, 'Right')" onkeypress="rpt_tpl_cfg_helper.changeArea(this, 'Right')">
+                    <input class="form-control input-sm" id="elementArea_Right" type="number" value="0" step="1" min="0" max="100" onchange="rpt_tpl_cfg_helper.changeArea(this, 'Right')" onkeyup="rpt_tpl_cfg_helper.changeArea(this, 'Right')">
                 </div>
                 <div class="form-group col-md-3">
                     <label>输出区域-上</label>
-                    <input class="form-control input-sm" id="elementArea_Top" type="number" value="0" step="1" min="0" max="100" onchange="rpt_tpl_cfg_helper.changeArea(this, 'Top')" onkeypress="rpt_tpl_cfg_helper.changeArea(this, 'Top')">
+                    <input class="form-control input-sm" id="elementArea_Top" type="number" value="0" step="1" min="0" max="100" onchange="rpt_tpl_cfg_helper.changeArea(this, 'Top')" onkeyup="rpt_tpl_cfg_helper.changeArea(this, 'Top')">
                 </div>
                 <div class="form-group col-md-3">
                     <label>输出区域-下</label>
-                    <input class="form-control input-sm" id="elementArea_Bottom" type="number" value="0" step="1" min="0" max="100" onchange="rpt_tpl_cfg_helper.changeArea(this, 'Bottom')" onkeypress="rpt_tpl_cfg_helper.changeArea(this, 'Bottom')">
+                    <input class="form-control input-sm" id="elementArea_Bottom" type="number" value="0" step="1" min="0" max="100" onchange="rpt_tpl_cfg_helper.changeArea(this, 'Bottom')" onkeyup="rpt_tpl_cfg_helper.changeArea(this, 'Bottom')">
                 </div>
             </div>
             <div class="row" id="element_area_2">

+ 10 - 0
web/maintain/report/rpt_tpl_detail_field_location_layout_detail.html

@@ -0,0 +1,10 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>Title</title>
+</head>
+<body>
+
+</body>
+</html>

+ 22 - 0
web/maintain/report/rpt_tpl_detail_field_location_selectableFields.html

@@ -0,0 +1,22 @@
+<div class="tab-pane" id="rpttplselectablefields" role="tabpanel">
+    <div class="main-data">
+        <div class="p-3">
+            <div class="row">
+                <div class="form-group col-md-7">
+                    <div class="form-group">
+                        <label>已选映射指标</label>
+                        <div class="ztree-warp">
+                            <ul id="tpl_data_selected_field_map_reversed" class="ztree"></ul>
+                        </div>
+                    </div>
+                </div>
+                <div class="form-group col-md-5">
+                    <div class="ztree-warp">
+                        <label>离散独立指标/参数</label>
+                        <ul id="tpl_discrete_fields_params_reversed" class="ztree"></ul>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>

+ 35 - 0
web/maintain/report/rpt_tpl_detail_field_location_tab.html

@@ -0,0 +1,35 @@
+<div class="tab-pane" id="rpttplfieldlocation" role="tabpanel">
+    <div class="main-data">
+        <div class="p-3">
+            <div class="row">
+                <div class="form-group col-md-8">
+                    <div class="ztree-warp">
+                        <ul id="tpl_data_info_reversed" class="ztree"></ul>
+                    </div>
+                </div>
+                <div class="form-group col-md-4" id="band_tree2_div">
+                    <div class="ztree-warp">
+                        <ul id="band_tree2_reversed" class="ztree"></ul>
+                    </div>
+                </div>
+            </div>
+            <div class="main-data">
+                <div class="main-data-top">
+                    <ul class="nav nav-tabs tools-bar" role="tablist">
+                        <li class="nav-item">
+                            <a class="nav-link p-1 active" data-toggle="tab" href="#rpttplselectablefields" role="tab">可映射指标</a>
+                        </li>
+                        <li class="nav-item">
+                            <a class="nav-link p-1" data-toggle="tab" href="#rpttpllayoutdetail" role="tab">控制明细</a>
+                        </li>
+                    </ul>
+                    <div class="tab-content">
+                        <!--模板信息-->
+                        <%include ./rpt_tpl_detail_field_location_selectableFields.html %>
+                        <!--模板布局-->
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>

+ 10 - 0
web/maintain/report/rpt_tpl_detail_pre_handle.html

@@ -0,0 +1,10 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>Title</title>
+</head>
+<body>
+
+</body>
+</html>