Browse Source

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

zhongzewei 7 years ago
parent
commit
49f8687208

+ 5 - 1
modules/reports/rpt_component/jpc_ex.js

@@ -222,7 +222,11 @@ JpcExSrv.prototype.createNew = function(){
                 if (expression) {
                     let $ME = me.formulas[i];
                     // console.log(expression);
-                    eval(expression);
+                    try {
+                        eval(expression);
+                    } catch (ex) {
+                        console.log(ex);
+                    }
                 }
             }
         }

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

@@ -51,7 +51,8 @@ JpcFlowTabSrv.prototype.createNew = function(){
         let private_inner_add_grp_rec = function(vi) {
             let hasFullGrp = true, couldBreak = false;
             for (let i = 0; i < grp_lines; i++) {
-                if ( ((vi + insertedGrpAmt * grp_lines) + i + 1) >= (maxRecPerPage - preAmt)) {
+                // if ( ((vi + insertedGrpAmt * grp_lines) + i + 1) >= (maxRecPerPage - preAmt)) {
+                if ( (vIdx.length + i ) >= maxRecPerPage) {
                     for (let j = i; j < grp_lines; j++) {
                         grpPageInfo[JV.PROP_PRE_ADD_GRP_REC_INFO].push(j);
                     }
@@ -105,7 +106,12 @@ JpcFlowTabSrv.prototype.createNew = function(){
                     if (private_inner_add_grp_rec(vi)) break;
                     if (couldBreak) break;
                 } else {
-                    if (private_normal_add_rec(vi)) break;
+                    //备注: 在有group的情况下,如果grpPageInfo[JV.PROP_SEG_GRP_IDX] 范围大于 grpSequenceInfo.length,则表示已经到最后了,不要再加空白数据了
+                    if (grpPageInfo[JV.PROP_SEG_GRP_IDX] < grpSequenceInfo.length) {
+                        if (private_normal_add_rec(vi)) break;
+                    } else {
+                        break;
+                    }
                 }
             } else {
                 if (private_normal_add_rec(vi)) break;
@@ -428,7 +434,9 @@ JpcFlowTabSrv.prototype.createNew = function(){
                         private_chk_handle_rec_amt(dv, false);
                     }
                     //再处理下半部分
-                    private_addPageValue(me.dispValueIdxLst, followTabEx.segments[segIdx], null, counterRowRecEx, maxRowRec - mixSplitPoint, me.page_seg_map, segIdx, pageIdx, null, true, null, 0);
+                    let restRecAmt = maxRowRec - me.dispValueIdxLst[me.dispValueIdxLst.length - 1].length; //备注:在一些极端条件下,mixSplitPoint这个分割点不合适处理下半部分数据,以实际生成的value-index数量为准
+                    // private_addPageValue(me.dispValueIdxLst, followTabEx.segments[segIdx], null, counterRowRecEx, maxRowRec - mixSplitPoint, me.page_seg_map, segIdx, pageIdx, null, true, null, 0);
+                    private_addPageValue(me.dispValueIdxLst, followTabEx.segments[segIdx], null, counterRowRecEx, restRecAmt, me.page_seg_map, segIdx, pageIdx, null, true, null, 0);
                     for (let dv of me.dispValueIdxLst[me.dispValueIdxLst.length - 1]) {
                         private_chk_handle_rec_amt(dv, true);
                     }

+ 67 - 4
modules/reports/util/rpt_construct_data_util.js

@@ -7,6 +7,7 @@ let $JE = require('../rpt_component/jpc_rte');
 let consts = require('../../../modules/main/models/project_consts');
 
 let fsUtil = require("../../../public/fsUtil");
+let stringUtil = require("../../../public/stringUtil");
 
 let treeUtil = require('../../../public/treeUtil');
 let projectConst = consts.projectConst;
@@ -102,6 +103,13 @@ class Rpt_Common{
         }
         return rst;
     };
+    FormatString(arrVal, formatStr){
+        let rst = [];
+        for (let val of arrVal) {
+            rst.push(stringUtil.replaceAll(formatStr, '%S', val));
+        }
+        return rst;
+    };
 }
 
 class Rpt_Data_Extractor {
@@ -191,6 +199,9 @@ class Rpt_Data_Extractor {
         $PROJECT.MAIN["myOwnRawDataObj"] = rawDataObj.prj._doc;
         $PROJECT.MAIN.getProperty = ext_mainGetPropety;
         $PROJECT.MAIN.getFee = ext_mainGetFee;
+        for (let item of rawDataObj.prjData) {
+            setupFunc($PROJECT.DETAIL, item.moduleName, item);
+        }
         if (tpl[JV.NODE_MAP_DATA_HANDLE_INFO]) {
             for (let preHandle of tpl[JV.NODE_MAP_DATA_HANDLE_INFO]) {
                 let srcData = getModuleDataByKey(rawDataObj.prjData, preHandle[JV.PROP_DATA_KEY]);
@@ -220,9 +231,6 @@ class Rpt_Data_Extractor {
                 }
             }
         }
-        for (let item of rawDataObj.prjData) {
-            setupFunc($PROJECT.DETAIL, item.moduleName, item);
-        }
         let rptDataObj = {};
         rptDataObj[JV.DATA_DISCRETE_DATA] = [];
         rptDataObj[JV.DATA_MASTER_DATA] = [];
@@ -716,16 +724,39 @@ function sortData(sourceData, sortCfg, prjData) {
             let addLevel = true;
             rst = treeUtil.buildTreeNodeDirectly(tempRstArr, addLevel);
             let newTopArr = [];
-            if (sortCfg[JV.PROP_FILTER_TOP_BILLS_NODES] && sortCfg[JV.PROP_FILTER_TOP_BILLS_NODES].length > 0) {
+            if ((sortCfg[JV.PROP_FILTER_TOP_BILLS_NODES] && sortCfg[JV.PROP_FILTER_TOP_BILLS_NODES].length > 0) ||
+                (sortCfg[JV.PROP_FILTER_OTHER_BILLS_NODES] && sortCfg[JV.PROP_FILTER_OTHER_BILLS_NODES].length > 0)) {
+                let local_check_bills = function(tItem) {
+                    let chkDtl = false;
+                    if (tItem.flags && tItem.flags.length > 0) {
+                        for (let flagItem of tItem.flags) {
+                            if (sortCfg[JV.PROP_FILTER_OTHER_BILLS_NODES].indexOf(flagItem.flag) >= 0) {
+                                newTopArr.push(tItem);
+                                chkDtl = true;
+                                break;
+                            }
+                        }
+                    }
+                    if (!chkDtl && tItem.items && tItem.items.length > 0) {
+                        for (let dtlItem of tItem.items) {
+                            local_check_bills(dtlItem);
+                        }
+                    }
+                };
                 for (let topItem of rst) {
+                    let chkTop = false;
                     if (topItem.flags && topItem.flags.length > 0) {
                         for (let flagItem of topItem.flags) {
                             if (sortCfg[JV.PROP_FILTER_TOP_BILLS_NODES].indexOf(flagItem.flag) >= 0) {
                                 newTopArr.push(topItem);
+                                chkTop = true;
                                 break;
                             }
                         }
                     }
+                    if (!chkTop && sortCfg[JV.PROP_FILTER_OTHER_BILLS_NODES] && sortCfg[JV.PROP_FILTER_OTHER_BILLS_NODES].length > 0) {
+                        local_check_bills(topItem);
+                    }
                 }
             } else {
                 newTopArr = rst;
@@ -800,7 +831,9 @@ function sortData(sourceData, sortCfg, prjData) {
 function setupFunc(obj, prop, ownRawObj) {
     obj[prop] = {};
     obj[prop]["myOwnRawDataObj"] = ownRawObj;
+    obj[prop]["myOwnOrgRawDataObj"] = ownRawObj.data;
     obj[prop].getProperty = ext_getPropety;
+    obj[prop].getPropertyByRefId = ext_getPropertyByRefId;
     obj[prop].getFee = ext_getFee;
     obj[prop].getPropertyByForeignId = ext_getPropertyByForeignId;
     obj[prop].getArrayValues = ext_getArrayValues;
@@ -920,6 +953,36 @@ function ext_getPropety(propKey) {
     return rst;
 }
 
+function ext_getPropertyByRefId(baseKey, refIDKey, propertyKey){
+    let rst = [], parentObj = this;
+    let dtObj = parentObj["myOwnRawDataObj"];
+    let orgDtObj = parentObj["myOwnOrgRawDataObj"];
+    if (baseKey && refIDKey && propertyKey && dtObj) {
+        for (let dItem of dtObj.data) {
+            let doc = (dItem._doc === null || dItem._doc === undefined)?dItem:dItem._doc;
+            let tmpRst = doc[baseKey];
+            if (typeof tmpRst === "string" && tmpRst[0] === "@") {
+                let refKey = tmpRst.slice(1);
+                let hasGetRef = false;
+                for (let orgDItem of orgDtObj) {
+                    let oDoc = (orgDItem._doc === null || orgDItem._doc === undefined)?orgDItem:orgDItem._doc;
+                    if (oDoc[refIDKey] === refKey) {
+                        rst.push(oDoc[propertyKey]);
+                        hasGetRef = true;
+                        break;
+                    }
+                }
+                if (!hasGetRef) {
+                    rst.push(tmpRst);
+                }
+            } else {
+                rst.push(tmpRst);
+            }
+        }
+    }
+    return rst;
+}
+
 function ext_mainGetFee(feeKey, dtlFeeKey) {
     let rst = [];
     let parentObj = this;

+ 1 - 0
public/web/rpt_value_define.js

@@ -55,6 +55,7 @@ const JV = {
     PROP_HANDLE_TYPE: "预处理类型",
     PROP_FILTER_KEYS: "过滤键值集",
     PROP_FILTER_TOP_BILLS_NODES: "清单顶节点集",
+    PROP_FILTER_OTHER_BILLS_NODES: "其他清单节点集",
     PROP_FILTER_COMPARE_OBJ: "compareObjKey",
     PROP_FILTER_COMPARE_OBJ_KEY: "compareObjIdKey",
     PROP_FILTER_COMPARE_VAL: "compareValue",

+ 46 - 0
web/maintain/report/js/cfg_const.js

@@ -93,6 +93,8 @@ let common_rpt_type_ids = {
 
 let bandSetting = {
     view: {
+        addHoverDom: bandTreeOprObj.addHoverDom,
+        removeHoverDom: bandTreeOprObj.removeHoverDom,
         showIcon: true,
         expandSpeed: "",
         selectedMulti: false
@@ -105,6 +107,15 @@ let bandSetting = {
         removeTitle: "删除模板框",
         renameTitle: "更改名称"
     },
+    check: {
+        enable: true,
+        chkStyle: "radio",
+        radioType: "all"
+    },
+    drag: {
+        isCopy: false,
+        isMove: true
+    },
     data: {
         keep: {
             parent:true,
@@ -123,6 +134,9 @@ let bandSetting = {
     },
     callback:{
         onClick: bandTreeOprObj.onClick,
+        onCheck: bandTreeOprObj.onCheck,
+        beforeDrag: bandTreeOprObj.onBeforeDrag,
+        beforeDrop: bandTreeOprObj.onBeforeDrop,
         beforeRemove: bandTreeOprObj.onBeforeRemove
     }
 };
@@ -557,6 +571,38 @@ let sortingTreeSetting = {
     }
 };
 
+let sortingTreeSetting2 = {
+    view: {
+    },
+    edit: {
+        enable: false,
+        editNameSelectAll: false,
+        showRemoveBtn: false,
+        showRenameBtn: false
+    },
+    check: {
+        enable: true
+    },
+    data: {
+        keep: {
+            parent:true,
+            leaf:true
+        },
+        key: {
+            children: 'items',
+            name: "Name",
+            title: "Title",
+        },
+        simpleData: {
+            enable: true
+        }
+    },
+    callback:{
+        onCheck: preHandleSortObj.onOtherBillsNodeCheck
+        // beforeDrag: function(){return false;}
+    }
+};
+
 let filterKeysSetting = {
     view: {
         addDiyDom: preHandleFilterObj.addDiyDom

+ 80 - 38
web/maintain/report/js/rpt_tpl_band.js

@@ -6,17 +6,45 @@ let bandTreeOprObj = {
     innerCounter: 1,
     canTrickEvent: false,
     iniTree: function(rptTpl) {
-        var me = this;
+        let me = bandTreeOprObj;
         let bandList = rptTpl[JV.NODE_BAND_COLLECTION];
         me.buildTreeData(bandList);
-        me.treeObj = $.fn.zTree.init($("#band_tree_reversed"), bandSetting, bandList);
+        let rootNode = {Name: "布局框", isParent: true};
+        rootNode[JV.BAND_PROP_SUB_BANDS] = bandList;
+        // me.treeObj = $.fn.zTree.init($("#band_tree_reversed"), bandSetting, bandList);
+        me.treeObj = $.fn.zTree.init($("#band_tree_reversed"), bandSetting, rootNode);
         me.treeObj.expandAll(true);
+        me.setupMergeBorderChk();
+    },
+    setupMergeBorderChk: function() {
+        let me = bandTreeOprObj;
+        let nodes = me.treeObj.getNodes();
+        me.treeObj.setChkDisabled(nodes[0], true);
+        function checkIsMergeBorder(bandNode) {
+            if (bandNode[JV.BAND_PROP_MERGE_BORDER] != null && bandNode[JV.BAND_PROP_MERGE_BORDER] != undefined) {
+                if (stringUtil.convertStrToBoolean(bandNode[JV.BAND_PROP_MERGE_BORDER])) {
+                    me.treeObj.checkNode(bandNode, true);
+                    return false;
+                }
+            }
+            if (bandNode[JV.BAND_PROP_SUB_BANDS] && bandNode[JV.BAND_PROP_SUB_BANDS].length > 0) {
+                for (let subBandNode of bandNode[JV.BAND_PROP_SUB_BANDS]) {
+                    if (!checkIsMergeBorder(subBandNode)) {
+                        return false;
+                    }
+                }
+            }
+            return true;
+        }
+        for (let bNode of nodes) {
+            checkIsMergeBorder(bNode);
+        }
     },
     copyBandList: function (isAllParent) {
         let me = this, rst = null;
         if (me.treeObj) {
             rst = [];
-            let nodes = me.treeObj.getNodes();
+            let nodes = me.treeObj.getNodes()[0][JV.BAND_PROP_SUB_BANDS];
             let private_copy_nodes = function (parentNode, item) {
                 item[JV.PROP_ID] = parentNode[JV.PROP_ID];
                 item[JV.BAND_PROP_NAME] = parentNode[JV.BAND_PROP_NAME];
@@ -113,41 +141,40 @@ let bandTreeOprObj = {
         rst[JV.BAND_PROP_MERGE_BORDER] = 'F';
         return rst;
     },
-    addRootBand: function (rptTpl) {
-        let me = this;
-        if (rptTpl) {
+    addHoverDom: function(treeId, treeNode) {
+        let me = bandTreeOprObj, sObj = $("#" + treeNode.tId + "_span");
+        if (treeNode.editNameFlag || $("#addBtn_"+treeNode.tId).length > 0 || treeNode.nodeType === RT.NodeType.TEMPLATE) return;
+        let addStr = "<span class='button add' id='addBtn_" + treeNode.tId + "' title='新增布局框' onfocus='this.blur();'></span>";
+        sObj.after(addStr);
+        let btn = $("#addBtn_"+treeNode.tId);
+        if (btn) btn.bind("click", function(){
             let newBand = me.createDftBand();
             let newNodes = [], isSilent = false;
             newNodes.push(newBand);
-            if (me.treeObj) {
-                me.treeObj.addNodes(null, -1, newNodes, isSilent);
-            } else {
-                me.treeObj = $.fn.zTree.init($("#band_tree_reversed"), bandSetting, newNodes);
-            }
-        }
+            me.treeObj.addNodes(treeNode, -1, newNodes, isSilent);
+        });
     },
-    addSubBand: function (rptTpl) {
-        let me = this;
-        if (rptTpl && me.currentNode != null) {
-            let newBand = me.createDftBand();
-            let newNodes = [], isSilent = false;
-            newNodes.push(newBand);
-            me.treeObj.addNodes(me.currentNode, -1, newNodes, isSilent);
-        }
+    removeHoverDom: function(treeId, treeNode) {
+        $("#addBtn_"+treeNode.tId).unbind().remove();
     },
-    moveDownBand: function (rptTpl) {
-        let me = bandTreeOprObj;
-        if (rptTpl && me.currentNode && me.currentNode.getNextNode()) {
-            let nextNode = me.currentNode.getNextNode();
-            me.treeObj.moveNode(nextNode, me.currentNode, "next", true);
+    onBeforeDrag: function (treeId, treeNodes) {
+        let rst = true;
+        for (let node of treeNodes) {
+            if (node.level === 0) {
+                rst = false;
+                break;
+            }
         }
+        return rst;
     },
-    moveUpBand: function (rptTpl) {
-        let me = bandTreeOprObj;
-        if (rptTpl && me.currentNode && me.currentNode.getPreNode()) {
-            let preNode = me.currentNode.getPreNode();
-            me.treeObj.moveNode(preNode, me.currentNode, "prev", true);
+    onBeforeDrop: function (treeId, treeNodes, targetNode, moveType, isCopy) {
+        let me = bandTreeOprObj, rst = true;
+        if (targetNode.level === 0) {
+            if (moveType !== 'inner') {
+                rst = false;
+            }
         }
+        return rst;
     },
     onClick: function(event,treeId,treeNode) {
         let me = bandTreeOprObj;
@@ -157,7 +184,7 @@ let bandTreeOprObj = {
         //边框样式borderStyles
         $("#borderStyles").get(0).selectedIndex = rpt_tpl_cfg_helper.reportCfg.borderArr.indexOf(treeNode[JV.PROP_STYLE]);
         //边框合并
-        $("#mergeBandBorder").get(0).checked = stringUtil.convertStrToBoolean(treeNode[JV.BAND_PROP_MERGE_BORDER]);
+        // $("#mergeBandBorder").get(0).checked = stringUtil.convertStrToBoolean(treeNode[JV.BAND_PROP_MERGE_BORDER]);
         //位置
         let posIdx = JV.LAYOUT.indexOf(treeNode[JV.BAND_PROP_ALIGNMENT])
         $("#bandAlignment").get(0).selectedIndex = posIdx;
@@ -168,6 +195,26 @@ let bandTreeOprObj = {
         //
         me.canTrickEvent = true;
     },
+    onCheck: function (event,treeId,treeNode) {
+        let me = bandTreeOprObj;
+        let nodes = me.treeObj.getNodes();
+        function unCheckMergeBorder(bandNode) {
+            if (bandNode[JV.BAND_PROP_MERGE_BORDER] != null && bandNode[JV.BAND_PROP_MERGE_BORDER] != undefined) {
+                bandNode[JV.BAND_PROP_MERGE_BORDER] = 'F';
+            }
+            if (bandNode[JV.BAND_PROP_SUB_BANDS] && bandNode[JV.BAND_PROP_SUB_BANDS].length > 0) {
+                for (let subBandNode of bandNode[JV.BAND_PROP_SUB_BANDS]) {
+                    unCheckMergeBorder(subBandNode)
+                }
+            }
+        }
+        for (let bNode of nodes) {
+            unCheckMergeBorder(bNode);
+        }
+        if (treeNode.checked) {
+            treeNode[JV.BAND_PROP_MERGE_BORDER] = 'T';
+        }
+    },
     onBeforeRemove: function(treeId, treeNode){
         let rst = true;
         if (treeNode.band_s && treeNode.band_s.length > 0) {
@@ -238,17 +285,12 @@ let bandTreeOprObj = {
             me.currentNode[JV.BAND_PROP_DISPLAY_TYPE] = JV.PAGE_STATUS[dom.selectedIndex];
         }
     },
-    bandBorderMergeChange: function (dom) {
-        let me = this;
-        if (me.currentNode) {
-            me.currentNode[JV.BAND_PROP_MERGE_BORDER] = dom.checked?'T':'F';
-        }
-    },
     extractBands: function (rptTpl) {
         let me = this;
         if (rptTpl) {
             let newBandList = [];
-            for (let node of me.treeObj.getNodes()) {
+            let nodes = me.treeObj.getNodes()[0][JV.BAND_PROP_SUB_BANDS];
+            for (let node of nodes) {
                 newBandList.push(me.createBandFromNode(node));
             }
             rptTpl[JV.NODE_BAND_COLLECTION] = newBandList;

+ 16 - 0
web/maintain/report/js/rpt_tpl_calculation.js

@@ -2,6 +2,12 @@
  * Created by Tony on 2017/7/7.
  */
 
+let expr_templates = [
+    // {Name: "整理序号(单层)", Expression: "let destField = $JE.F(/*指标ID*/,$CURRENT_RPT);\n  destField[JV.PROP_AD_HOC_DATA] = [];\n  for (let innerFmlIdx = 0; innerFmlIdx < $CURRENT_DATA[JV.DATA_DETAIL_DATA][0].length; innerFmlIdx++) {\n    $JE.setFieldValue(destField, $CURRENT_DATA, innerFmlIdx, (innerFmlIdx + 1));\n}"},
+    {Name: "转换大写金额", Expression: "let capF = $JE.F(/*目标指标ID*/, $CURRENT_RPT), orgF = $JE.F(/*原始指标ID*/, $CURRENT_RPT);\n $JE.setFieldValue(capF, $CURRENT_DATA, 0, $JE.$STR_UTIL.convertToCaptionNum(parseFloat($JE.getFieldValue(orgF, $CURRENT_DATA, 0, 0)).toFixed(2), true, true));"},
+    {Name: "总计汇总", Expression: "let totalFee = $JE.F(/*目标指标ID*/,$CURRENT_RPT), bill1 = $JE.F(/*原始指标ID*/,$CURRENT_RPT);\n let sumValue = 0.0;\n sumValue += parseFloat($JE.getFieldValue(bill1,$CURRENT_DATA,0,0));\n $JE.setFieldValue(totalFee,$CURRENT_DATA,0,sumValue);"}
+];
+
 let calculationTreeOprObj = {
     treeObj : null,
     currentNode: null,
@@ -14,6 +20,12 @@ let calculationTreeOprObj = {
         // $("#exprFormat").get(0).value = "";
         // $("#exprContent").get(0).value = "";
     },
+    buildExprTemplates: function () {
+        let et = $("#exprTemplatesSelect");
+        for (let i = 0; i < expr_templates.length; i++) {
+            et.append("<option>" + expr_templates[i].Name + "</option>");
+        }
+    },
     buildRunType: function() {
         let et = $("#exprRunType");
         et.append("<option value='" + JV.RUN_TYPE_BEFORE_PAGING + "'>预运行</option>");
@@ -46,6 +58,10 @@ let calculationTreeOprObj = {
             me.currentNode[JV.PROP_RUN_TYPE] = dom.value;
         }
     },
+    setTemplateExpression: function (dom) {
+        let selIdx = $("#exprTemplatesSelect")[0].selectedIndex;
+        $("#exprContent")[0].value = expr_templates[selIdx].Expression;
+    },
     changeFormat: function (dom) {
         let me = calculationTreeOprObj;
         if (me.currentNode) {

+ 5 - 1
web/maintain/report/js/rpt_tpl_field_map.js

@@ -163,7 +163,11 @@ let selectableFiledTreeOprObj = {
                     }
                 }
                 me.treeObj = $.fn.zTree.init($("#selectable_field_tree_reversed"), selectableFieldSetting, showRst);
-                me.treeObj.expandAll(true);
+                let nodes = me.treeObj.getNodes();
+                for (let node of nodes) {
+                    me.treeObj.expandNode(node, true, false);
+                }
+                // me.treeObj.expandAll(true);
                 showRst = null;
             }, null, null
         );

+ 4 - 4
web/maintain/report/js/rpt_tpl_helper.js

@@ -56,10 +56,10 @@ let tplHelper = {
             } else {
                 $("#multiColCnt")[0].style.display = "none";
             }
-            $("#rptTplMarginLeft")[0].value = rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS][JV.PROP_LEFT];
-            $("#rptTplMarginRight")[0].value = rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS][JV.PROP_RIGHT];
-            $("#rptTplMarginTop")[0].value = rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS][JV.PROP_TOP];
-            $("#rptTplMarginBottom")[0].value = rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS][JV.PROP_BOTTOM];
+            // $("#rptTplMarginLeft")[0].value = rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS][JV.PROP_LEFT];
+            // $("#rptTplMarginRight")[0].value = rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS][JV.PROP_RIGHT];
+            // $("#rptTplMarginTop")[0].value = rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS][JV.PROP_TOP];
+            // $("#rptTplMarginBottom")[0].value = rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS][JV.PROP_BOTTOM];
             //2. 模板布局
             bandTreeOprObj.iniTree(rptTpl);
             //3. 指标映射

+ 22 - 22
web/maintain/report/js/rpt_tpl_main.js

@@ -8,6 +8,7 @@ let rptTplObj = {
         selectableFiledTreeOprObj.iniTree();
         preview_util.drawBorder($("#tplCanvas")[0]);
         calculationTreeOprObj.buildRunType();
+        calculationTreeOprObj.buildExprTemplates();
         preHandleObj.buildTypeData();
     }
 }
@@ -62,9 +63,9 @@ let zTreeOprObj = {
         params.isPhysically = true;
         CommonAjax.postEx("report_tpl_api/removeTreeRootNode", params, 5000, isAsync, callback, failCallback, null);
     },
-    copyReportTemplate: function(rawNode, newID, isAsync, callback, failCallback) {
+    copyReportTemplate: function(orgID, newID, isAsync, callback, failCallback) {
         let params = {};
-        params.orgRptTplId = rawNode.ID;
+        params.orgRptTplId = orgID;
         params.newRptTplId = newID;
         CommonAjax.postEx("report_tpl_api/copyRptTpl", params, 5000, isAsync, callback, failCallback, null);
     },
@@ -313,36 +314,35 @@ let zTreeOprObj = {
         let canContinue = false;
         if (isCopy) {
             me.getNewNodeID(1, function (newNodeID) {
+                let orgID = treeNodes[0].ID;
                 treeNodes[0].ID = newNodeID;
                 treeNodes[0].refId = newNodeID;
                 newTopNode = me.buildRootNodeDoc(targetTopNode);
-                me.copyReportTemplate(treeNodes[0], newNodeID, true, function(goodResult){
-                    me.updateTreeRootNode(newTopNode, false, function(rst){
-                        if (!(rst)) {
-                            displayMessage("移动请求失败!", "red", 1000);
-                        } else {
-                            canContinue = true;
-                        }
+                me.copyReportTemplate(orgID, newNodeID, true, function(goodResult){
+                    me.updateTreeRootNode(newTopNode, false, function(goodRst){
+                        canContinue = true;
+                    }, function(badRst){
+                        displayMessage("更新模板节点失败!", "red", 2000);
                     });
                 }, function(badResult){
-                    displayMessage("Copy请求失败!", "red", 1000);
+                    displayMessage("Copy请求失败!", "red", 2000);
                 });
             });
         } else {
             newTopNode = me.buildRootNodeDoc(targetTopNode);
             me.updateTreeRootNode(newTopNode, false, function(rst){
-                if (!(rst)) {
-                    displayMessage("移动请求失败!", "red", 1000);
-                } else {
-                    canContinue = true;
-                }
+                canContinue = true;
+            }, function(badResult){
+                displayMessage("移动请求失败!", "red", 2000);
+                canContinue = false;
             });
             if (canContinue && !isCopy && me.moveSrcTopNode) {
                 let newSrcTopNode = me.buildRootNodeDoc(me.moveSrcTopNode);
                 me.updateTreeRootNode(newSrcTopNode, true, function(rst){
-                    if (!(rst)) {
-                        displayMessage("移动请求失败!", "red", 1000);
-                    }
+                    // canContinue = true;
+                }, function(badResult){
+                    displayMessage("移动请求失败!", "red", 2000);
+                    canContinue = true;
                 });
             }
             me.moveSrcTopNode = null;
@@ -652,10 +652,10 @@ let zTreeOprObj = {
         if (rptTpl[JV.NODE_FLOW_INFO]) {
             rptTpl[JV.NODE_FLOW_INFO][JV.PROP_MULTI_COLUMN] = parseInt($("#rptTplMultiCols")[0].value);
         }
-        rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS][JV.PROP_LEFT] = $("#rptTplMarginLeft")[0].value;
-        rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS][JV.PROP_RIGHT] = $("#rptTplMarginRight")[0].value;
-        rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS][JV.PROP_TOP] = $("#rptTplMarginTop")[0].value;
-        rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS][JV.PROP_BOTTOM] = $("#rptTplMarginBottom")[0].value;
+        // rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS][JV.PROP_LEFT] = $("#rptTplMarginLeft")[0].value;
+        // rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS][JV.PROP_RIGHT] = $("#rptTplMarginRight")[0].value;
+        // rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS][JV.PROP_TOP] = $("#rptTplMarginTop")[0].value;
+        // rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS][JV.PROP_BOTTOM] = $("#rptTplMarginBottom")[0].value;
     },
     getTopNodeByCurrentNode: function (currentNode) {
         let topPNode = currentNode, pNode = currentNode.getParentNode();

+ 74 - 15
web/maintain/report/js/rpt_tpl_pre_handle.js

@@ -7,8 +7,8 @@ const condition_types = ["==", "===", ">", ">=", "<", "<=", "!=", "in", "not in"
 const pre_handle_data_objects = ["bills", "ration", "ration_glj"];
 const pre_handle_data_objects_name = ["清单", "定额", "定额工料机"];
 const exposed_bills_properties = [
-    {Name: "清单_ID", Title: "", Key: "ID", Order: "ascend"}
-    ,{Name: "清单_所属项目ID", Title: "", Key: "projectID", Order: "ascend"}
+    {Name: "清单_所属项目ID", Title: "", Key: "projectID", Order: "ascend"}
+    ,{Name: "清单_ID", Title: "", Key: "ID", Order: "ascend"}
     ,{Name: "清单_层次", Title: "", Key: "treeLevel", Order: "ascend"}
     ,{Name: "清单_标记", Title: "", Key: "flags.flag", Order: "ascend"}
     // ,{Name: "清单_项目编码", Title: "", Key: "code", Order: "ascend"}
@@ -22,8 +22,9 @@ const exposed_bills_properties = [
 ];
 const exposed_ration_properties = [
     {Name: "定额_工程内部ID", Title: "", Key: "ID", Order: "ascend"}
-    ,{Name: "定额_所属清单ID", Title: "", Key: "billsItemID", Order: "ascend"}
     ,{Name: "定额_所属项目ID", Title: "", Key: "projectID", Order: "ascend"}
+    ,{Name: "定额_所属清单ID", Title: "", Key: "billsItemID", Order: "ascend"}
+    ,{Name: "定额_清单内顺序", Title: "", Key: "serialNo", Order: "ascend"}
     // ,{Name: "定额_编号", Title: "", Key: "code", Order: "ascend"}
     // ,{Name: "定额_项目名称", Title: "", Key: "caption", Order: "ascend"}
     // ,{Name: "定额_单位", Title: "", Key: "unit", Order: "ascend"}
@@ -301,11 +302,13 @@ let preHandleObj = {
         //更改(或选择)预处理环节中的 数据依据(就是说报表想预处理什么数据)
         let me = preHandleObj;
         if (oprType === "top") {
+            preHandleObj.currentNode[JV.PROP_DATA_KEY] = dom.value;
             preHandleSortObj.childTreeObj = $.fn.zTree.init($("#child_sorting_keys"), sortingKeysSetting, exposed_properties_arr[dom.selectedIndex]);
             preHandleSortObj.treeObj = $.fn.zTree.init($("#pre_handle_sort_keys_reversed"), sortingKeysSetting, exposed_properties_arr[dom.selectedIndex]);
             preHandleFilterObj.treeObj = $.fn.zTree.init($("#pre_handle_filter_keys_reversed"), filterKeysSetting, exposed_properties_arr[dom.selectedIndex]);
         } else if (oprType === "accord_to_parent") {
             preHandleSortObj.parentTreeObj = $.fn.zTree.init($("#parent_sorting_keys"), sortingKeysSetting, exposed_properties_arr[dom.selectedIndex]);
+            preHandleObj.currentNode[JV.PROP_PARENT_CHILD_SORT_KEY][JV.PROP_PARENT_DATA_KEY] = dom.value;
         }
     },
     onBeforeDrop: function(treeId, treeNodes, targetNode, moveType){
@@ -355,6 +358,7 @@ let preHandleSortObj = {
     parentTreeObj: null,
     childTreeObj: null,
     topBillsTreeObj: null,
+    otherBillsTreeObj: null,
     copyNode: function (src, dest) {
         dest[JV.PROP_SORT_TYPE] = src[JV.PROP_SORT_TYPE];
         switch (sort_types.indexOf(src[JV.PROP_SORT_TYPE])) {
@@ -377,6 +381,11 @@ let preHandleSortObj = {
                     billKeys = billKeys.concat(src[JV.PROP_FILTER_TOP_BILLS_NODES]);
                 }
                 dest[JV.PROP_FILTER_TOP_BILLS_NODES] = billKeys;
+                let otherBillKeys = [];
+                if (src[JV.PROP_FILTER_OTHER_BILLS_NODES] && src[JV.PROP_FILTER_OTHER_BILLS_NODES].length > 0) {
+                    otherBillKeys = otherBillKeys.concat(src[JV.PROP_FILTER_OTHER_BILLS_NODES]);
+                }
+                dest[JV.PROP_FILTER_OTHER_BILLS_NODES] = otherBillKeys;
                 break;
             case 2 :
                 //according to parent
@@ -391,17 +400,19 @@ let preHandleSortObj = {
                 for (let item of src[JV.PROP_PARENT_CHILD_SORT_KEY][JV.PROP_CHILD_SORT_KEYS]) {
                     dest[JV.PROP_PARENT_CHILD_SORT_KEY][JV.PROP_CHILD_SORT_KEYS].push(item);
                 }
-                for (let subSort of src[JV.PROP_OTHER_SUB_SORT]) {
-                    let st = {};
-                    st[JV.PROP_SORT_TYPE] = subSort[JV.PROP_SORT_TYPE];
-                    if (subSort[JV.PROP_SORT_TYPE] === "normal") {
-                        st[JV.PROP_SORT_KEYS] = [];
-                        for (let item of subSort[JV.PROP_SORT_KEYS]) {
-                            let di = {key: item.key, order: item.order};
-                            st[JV.PROP_SORT_KEYS].push(di);
+                if (src[JV.PROP_OTHER_SUB_SORT] !== null && src[JV.PROP_OTHER_SUB_SORT] !== undefined) {
+                    for (let subSort of src[JV.PROP_OTHER_SUB_SORT]) {
+                        let st = {};
+                        st[JV.PROP_SORT_TYPE] = subSort[JV.PROP_SORT_TYPE];
+                        if (subSort[JV.PROP_SORT_TYPE] === "normal") {
+                            st[JV.PROP_SORT_KEYS] = [];
+                            for (let item of subSort[JV.PROP_SORT_KEYS]) {
+                                let di = {key: item.key, order: item.order};
+                                st[JV.PROP_SORT_KEYS].push(di);
+                            }
+                        } else {
+                            //其他暂时不实现,目前没那么复杂
                         }
-                    } else {
-                        //其他暂时不实现,目前没那么复杂
                     }
                 }
                 break;
@@ -457,6 +468,20 @@ let preHandleSortObj = {
                     } else {
                         preHandleObj.currentNode[JV.PROP_FILTER_TOP_BILLS_NODES] = [];
                     }
+                    me.otherBillsTreeObj = $.fn.zTree.init($("#bills_other_nodes"), sortingTreeSetting2, fixed_other_bills_types);
+                    let otherBillnodes = me.otherBillsTreeObj.getNodes();
+                    if (preHandleObj.currentNode[JV.PROP_FILTER_OTHER_BILLS_NODES]) {
+                        for (let otherBillsNodeId of preHandleObj.currentNode[JV.PROP_FILTER_OTHER_BILLS_NODES]) {
+                            for (let otherBillsNode of otherBillnodes) {
+                                if (otherBillsNode.Value === otherBillsNodeId) {
+                                    me.otherBillsTreeObj.checkNode(otherBillsNode, true, false, false);
+                                    break;
+                                }
+                            }
+                        }
+                    } else {
+                        preHandleObj.currentNode[JV.PROP_FILTER_OTHER_BILLS_NODES] = [];
+                    }
                     break;
                 case 2 :
                     //according to parent
@@ -493,9 +518,9 @@ let preHandleSortObj = {
     onCheck: function(event,treeId,treeNode) {
         let me = preHandleSortObj;
         if (treeId.indexOf("parent_sorting_keys") >= 0) {
-            //preHandleObj.currentNode
+            me.resetParentSort();
         } else if (treeId.indexOf("child_sorting_keys") >= 0) {
-            //
+            me.resetChildSort();
         } else {
             me.resetNormalSort();
         }
@@ -513,6 +538,37 @@ let preHandleSortObj = {
             }
         }
     },
+    onOtherBillsNodeCheck: function (event,treeId,treeNode) {
+        let me = preHandleSortObj;
+        if (treeNode.checked) {
+            if (preHandleObj.currentNode[JV.PROP_FILTER_OTHER_BILLS_NODES].indexOf(treeNode.Value) < 0) {
+                preHandleObj.currentNode[JV.PROP_FILTER_OTHER_BILLS_NODES].push(treeNode.Value);
+            }
+        } else {
+            let idx = preHandleObj.currentNode[JV.PROP_FILTER_OTHER_BILLS_NODES].indexOf(treeNode.Value);
+            if (idx >= 0) {
+                preHandleObj.currentNode[JV.PROP_FILTER_OTHER_BILLS_NODES].splice(idx, 1);
+            }
+        }
+    },
+    resetParentSort: function () {
+        let me = preHandleSortObj;
+        let nodes = me.parentTreeObj.getCheckedNodes();
+        let sortKeys = [];
+        for (let node of nodes) {
+            sortKeys.push(node.Key);
+        }
+        preHandleObj.currentNode[JV.PROP_PARENT_CHILD_SORT_KEY][JV.PROP_PARENT_SORT_KEYS] = sortKeys;
+    },
+    resetChildSort: function () {
+        let me = preHandleSortObj;
+        let nodes = me.childTreeObj.getCheckedNodes();
+        let sortKeys = [];
+        for (let node of nodes) {
+            sortKeys.push(node.Key);
+        }
+        preHandleObj.currentNode[JV.PROP_PARENT_CHILD_SORT_KEY][JV.PROP_CHILD_SORT_KEYS] = sortKeys;
+    },
     resetNormalSort: function() {
         let me = preHandleSortObj;
         let nodes = me.normalTreeObj.getCheckedNodes();
@@ -551,6 +607,7 @@ let preHandleSortObj = {
             me.currentNode[JV.PROP_PARENT_CHILD_SORT_KEY][JV.PROP_PARENT_DATA_KEY] = pre_handle_data_objects[0];
             me.currentNode[JV.PROP_PARENT_CHILD_SORT_KEY][JV.PROP_PARENT_SORT_KEYS] = [];
             me.currentNode[JV.PROP_PARENT_CHILD_SORT_KEY][JV.PROP_CHILD_SORT_KEYS] = [];
+            me.currentNode[JV.PROP_OTHER_SUB_SORT] = [];
         } else if (dom.selectedIndex === 0) {
             $("#div_sort_type_normal")[0].style.display = "";
             preHandleSortObj.normalTreeObj = $.fn.zTree.init($("#pre_handle_sort_keys_reversed"), sortingKeysSetting, exposed_properties_arr[data_dom.selectedIndex]);
@@ -577,9 +634,11 @@ let preHandleSortObj = {
             case 1 :
                 //tree
                 rst[JV.PROP_FILTER_TOP_BILLS_NODES] = handleObj[JV.PROP_FILTER_TOP_BILLS_NODES];
+                rst[JV.PROP_FILTER_OTHER_BILLS_NODES] = handleObj[JV.PROP_FILTER_OTHER_BILLS_NODES];
                 break;
             case 2 :
                 //according to parent
+                rst[JV.PROP_PARENT_CHILD_SORT_KEY] = handleObj[JV.PROP_PARENT_CHILD_SORT_KEY];
                 break;
             case 3 :
                 //self define

+ 14 - 30
web/maintain/report/rpt_tpl_detail_bands.html

@@ -1,47 +1,31 @@
 <div class="tab-pane" id="rpttpllayout" role="tabpanel">
     <div class="main-data">
         <div class="p-3">
-            <div class="tab-bar">
-                <a onclick="bandTreeOprObj.addRootBand(zTreeOprObj.getRefTpl())" class="btn btn-secondary btn-sm fa fa-plus-square">根模板框</a>
-                <a onclick="bandTreeOprObj.addSubBand(zTreeOprObj.getRefTpl())" class="btn btn-secondary btn-sm fa fa-plus-square">子模板框</a>
-                <a onclick="bandTreeOprObj.moveDownBand(zTreeOprObj.getRefTpl())" class="btn btn-sm" id="downMoveBand"><i class="fa fa-arrow-down" aria-hidden="true"></i>下移</a>
-                <a onclick="bandTreeOprObj.moveUpBand(zTreeOprObj.getRefTpl())" class="btn btn-sm" id="upMoveBand"><i class="fa fa-arrow-up" aria-hidden="true"></i>上移</a>
-            </div>
             <div class="ztree-warp">
                 <ul id="band_tree_reversed" class="ztree"></ul>
             </div>
-            <div class="form-group">
-                <label>边框样式</label>
-                <select class="form-control" id="borderStyles" onchange="bandTreeOprObj.bandStyleChange(this)"></select>
-            </div>
-            <div class="form-group">
-                <label>位置</label>
-                <select class="form-control" id="bandAlignment" onchange="bandTreeOprObj.bandAlignmentChange(this)"></select>
-            </div>
-
             <div class="row">
-                <div class="form-group col-md-6">
+                <div class="form-group col-md-3">
+                    <label>边框样式</label>
+                    <select class="form-control" id="borderStyles" onchange="bandTreeOprObj.bandStyleChange(this)"></select>
+                </div>
+                <div class="form-group col-md-2">
+                    <label>位置</label>
+                    <select class="form-control" id="bandAlignment" onchange="bandTreeOprObj.bandAlignmentChange(this)"></select>
+                </div>
+                <div class="form-group col-md-3">
+                    <label>出现频率</label>
+                    <select class="form-control" id="pageFrequency" onchange="bandTreeOprObj.bandShowFrequencyChange(this)"></select>
+                </div>
+                <div class="form-group col-md-2">
                     <label>高度</label>
                     <input class="form-control mr-2" id="bandHeight" type="number" step="0.1" disabled onchange="bandTreeOprObj.bandHeightWidthChange(this)">
                 </div>
-                <div class="form-group col-md-6">
+                <div class="form-group col-md-2">
                     <label>宽度</label>
                     <input class="form-control mr-2" id="bandWidth"  type="number" step="0.1" disabled onchange="bandTreeOprObj.bandHeightWidthChange(this)">
                 </div>
             </div>
-
-            <div class="form-group">
-                <label>出现频率</label>
-                <select class="form-control" id="pageFrequency" onchange="bandTreeOprObj.bandShowFrequencyChange(this)"></select>
-            </div>
-            <div class="form-group">
-                <div class="form-check">
-                    <label class="form-check-label">
-                        <input type="checkbox" class="form-check-input" id="mergeBandBorder" onchange="bandTreeOprObj.bandBorderMergeChange(this)">
-                        边框合并
-                    </label>
-                </div>
-            </div>
         </div>
     </div>
 </div>

+ 12 - 2
web/maintain/report/rpt_tpl_detail_calculation.html

@@ -9,16 +9,26 @@
         <div class="p-3" id="exprDetail">
             <div class="row">
                 <div class="form-group col-md-3">
+                    <label></label>
+                    <select class="form-control" id="exprTemplatesSelect"></select>
+                </div>
+                <div class="form-group col-md-1">
+                    <label></label>
+                    <button class="btn btn-primary" id="expr_tpl_select_btn" onclick="calculationTreeOprObj.setTemplateExpression(this)">套用</button>
+                </div>
+            </div>
+            <div class="row">
+                <div class="form-group col-md-3">
                     <label>计算式执行点</label>
                     <select class="form-control" id="exprRunType" onchange="calculationTreeOprObj.changeRunType(this)"></select>
                 </div>
-                <div class="form-group col-md-9">
+                <div class="form-group col-md-4">
                     <label>格式串(format)</label>
                     <input class="form-control" id="exprFormat" value="" onkeyup="calculationTreeOprObj.changeFormat(this)">
                 </div>
             </div>
             <div class="form-group">
-                <textarea rows="16" cols="98" id="exprContent" onkeyup="calculationTreeOprObj.changeExpression(this)"></textarea>
+                <textarea rows="16" cols="118" id="exprContent" onkeyup="calculationTreeOprObj.changeExpression(this)"></textarea>
             </div>
         </div>
     </div>

+ 6 - 41
web/maintain/report/rpt_tpl_detail_info.html

@@ -8,20 +8,18 @@
             <div class="form-group">
                 <label>页面</label>
                 <div class="row">
-                    <div class="input-group col-6">
+                    <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-6">
+                    <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>
-            </div>
-            <div class="form-group row">
-                <div class="input-group col-6">
-                    <div class="input-group-addon">单位</div>
-                    <select class="form-control input-sm" id="rptTplUnit"><option>厘米</option></select>
+                    <div class="input-group col-4">
+                        <div class="input-group-addon">单位</div>
+                        <select class="form-control input-sm" id="rptTplUnit"><option>厘米</option></select>
+                    </div>
                 </div>
             </div>
             <div class="form-group" id="multiColCnt">
@@ -37,39 +35,6 @@
                     </div>
                 </div>
             </div>
-            <div class="form-group row" style="display: none">
-                <div class="input-group col-6">
-                    <div class="input-group-addon">空行提上</div>
-                    <select class="form-control input-sm"><option>提上</option></select>
-                </div>
-                <div class="input-group col-6">
-                    <div class="input-group-addon">空行显示</div>
-                    <select class="form-control input-sm"><option>显示</option></select>
-                </div>
-            </div>
-            <div class="form-group">
-                <label>页边距</label>
-                <div class="row">
-                    <div class="input-group col-6">
-                        <div class="input-group-addon">左</div>
-                        <input class="form-control input-sm" id="rptTplMarginLeft" type="number" value="0.8" step="0.1" min="0">
-                    </div>
-                    <div class="input-group col-6">
-                        <div class="input-group-addon">右</div>
-                        <input class="form-control input-sm" id="rptTplMarginRight" type="number" value="0.8" step="0.1" min="0">
-                    </div>
-                </div>
-            </div>
-            <div class="form-group row">
-                <div class="input-group col-6">
-                    <div class="input-group-addon">上</div>
-                    <input class="form-control input-sm" id="rptTplMarginTop" type="number" value="0.8" step="0.1" min="0">
-                </div>
-                <div class="input-group col-6">
-                    <div class="input-group-addon">下</div>
-                    <input class="form-control input-sm" id="rptTplMarginBottom" type="number" value="0.8" step="0.1" min="0">
-                </div>
-            </div>
             <div class="row" id="element_content_height_width">
                 <div class="form-group col-md-6">
                     <label>显示行 - 高度</label>

+ 12 - 9
web/maintain/report/rpt_tpl_detail_mapping_fields.html

@@ -1,15 +1,18 @@
 <div class="tab-pane" id="rpttplfieldmap" role="tabpanel">
     <div class="main-data">
         <div class="p-3">
-            <label>报表映射指标(勾选表示:主从关系的ID关联指标)</label>
-            <div class="tab-content">
-                <ul id="field_map_tree_reversed" class="ztree"></ul>
-            </div>
-            <p/>
-            <div class="tab-content">
-                <label>可映射指标</label>
-                <div class="tab-content">
-                    <ul id="selectable_field_tree_reversed" class="ztree"></ul>
+            <div class="row">
+                <div class="form-group col-md-6">
+                    <label>报表映射指标(勾选表示:主从关系的ID关联指标)</label>
+                    <div style="max-height: 750px; overflow: auto">
+                        <ul id="field_map_tree_reversed" class="ztree"></ul>
+                    </div>
+                </div>
+                <div class="form-group col-md-6">
+                    <label>可映射指标</label>
+                    <div style="max-height: 750px; overflow: auto">
+                        <ul id="selectable_field_tree_reversed" class="ztree"></ul>
+                    </div>
                 </div>
             </div>
         </div>

+ 7 - 1
web/maintain/report/rpt_tpl_detail_pre_handle_sort.html

@@ -37,10 +37,16 @@
     </div>
 </div>
 <div class="form-group row" id="div_sort_tree">
-    <div class="form-group col-md-7">
+    <div class="form-group col-md-6">
         <label>清单顶节点(全空白表示全部)</label>
         <div class="ztree-warp">
             <ul id="bills_top_nodes" class="ztree"></ul>
         </div>
     </div>
+    <div class="form-group col-md-6">
+        <label>清单其他节点(全空白表示全部)</label>
+        <div class="ztree-warp">
+            <ul id="bills_other_nodes" class="ztree"></ul>
+        </div>
+    </div>
 </div>