فهرست منبع

报表模板改进

TonyKang 7 سال پیش
والد
کامیت
f7b1a31738

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

@@ -148,14 +148,15 @@ JpcFlowTabSrv.prototype.createNew = function(){
             let actH = JpcFlowTabHelper.getActualContentAreaHeight(bands, rptTpl, me.segments, page);
             let offsetY = actH - (flowContentBand.Bottom - flowContentBand.Top);
             JpcBandHelper.resetBandPos(rptTpl[JV.NODE_BAND_COLLECTION], bands, flowContentBand, 0, offsetY);
-
+            // 2.1 Content-Tab
             tabRstLst.push(me.outputContent(rptTpl, dataObj, page, bands, unitFactor, controls, 0, $CURRENT_RPT));
             // 2.2 Column tab
             tabRstLst.push(me.outputColumn(rptTpl, dataObj, page, segIdx, bands, unitFactor, controls, 0));
             // 2.3 Sum Seg
             tabRstLst.push(me.outputSegSum(rptTpl, dataObj, page, segIdx, bands, unitFactor, controls));
             // 2.4 Sum Page
-            // 2.5 Discrete
+            // 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));
             //3. reset merge band position
             if (bands[JV.BAND_PROP_MERGE_BAND] && adHocMergePos) {
@@ -180,14 +181,15 @@ JpcFlowTabSrv.prototype.createNew = function(){
             //2. start to output detail-part
             for (let pi = 0; pi < me.multiCols; pi++) {
                 let actualPage = (page - 1) * me.multiCols + pi + 1;
-                //2.1 Content-Tab
+                // 2.1 Content-Tab
                 tabRstLst.push(me.outputContent(rptTpl, dataObj, actualPage, bands, unitFactor, controls, pi, $CURRENT_RPT));
-                //2.2 Column tab
+                // 2.2 Column tab
                 tabRstLst.push(me.outputColumn(rptTpl, dataObj, actualPage, segIdx, bands, unitFactor, controls, pi));
-                //2.3 Sum Seg
+                // 2.3 Sum Seg
                 tabRstLst.push(me.outputSegSum(rptTpl, dataObj, actualPage, segIdx, bands, unitFactor, controls));
-                //2.4 Sum Page
-                //2.5 Discrete
+                // 2.4 Sum Page
+                // 2.5 Group
+                // 2.6 Discrete
                 if (pi === 0) {
                     tabRstLst.push(JpcDiscreteHelper.outputDiscreteInfo(rptTpl[FLOW_NODE_STR][JV.NODE_DISCRETE_INFO], bands, dataObj, unitFactor, me.pageStatusLst[actualPage - 1], segIdx, 1, pi, $CURRENT_RPT));
                 }

+ 4 - 2
modules/reports/rpt_component/jpc_function.js

@@ -6,8 +6,10 @@ let JpcFunc = {
         if (rptTpl[JV.NODE_FORMULAS]) {
             for (let i = 0; i < rptTpl[JV.NODE_FORMULAS].length; i++) {
                 let item = {};
-                item[JV.PROP_RUN_TYPE] = rptTpl[JV.NODE_FORMULAS][i][JV.PROP_RUN_TYPE];
-                item[JV.PROP_EXPRESSION] = rptTpl[JV.NODE_FORMULAS][i][JV.PROP_EXPRESSION];
+                let propArr = Object.getOwnPropertyNames(rptTpl[JV.NODE_FORMULAS][i]);
+                for (let key of propArr) {
+                    item[key] = rptTpl[JV.NODE_FORMULAS][i][key];
+                }
                 rst.push(item);
             }
         }

+ 10 - 0
modules/reports/rpt_component/jpc_rte.js

@@ -45,6 +45,16 @@ let JE = {
             rst = $CURRENT_RPT.totalPages;
         }
         return rst;
+    },
+    setFieldValue: function (field, newValue, dataObj, valIdx) {
+        if (!(field.DataNodeName)) {
+            //that means this is a self-defined discrete field!
+            field.DataNodeName = JV.DATA_DISCRETE_DATA;
+            let len = dataObj[JV.DATA_DISCRETE_DATA];
+            field.DataSeq = len;
+            dataObj[JV.DATA_DISCRETE_DATA].push([]);
+        }
+        dataObj[field.DataNodeName][field.DataSeq][valIdx] = newValue;
     }
 }
 

+ 10 - 0
public/web/rpt_value_define.js

@@ -31,12 +31,20 @@ const JV = {
     NODE_FLOW_COLUMN : "流水式表_列",
     NODE_FLOW_CONTENT : "流水式表_数据",
     PROP_MULTI_COLUMN: "多列显示数量",
+    PROP_FLOW_EX_DISPLAY_MODE: "流水拓展显示模式",
+    DISPLAY_MODE_INDEPENDENT: "单独模式",
+    DISPLAY_MODE_FOLLOW: "紧随模式",
+
 
     NODE_MAIN_INFO: "主信息",
     NODE_MAIN_INFO_RPT_NAME: "报表名称",
     NODE_PAGE_INFO: "打印页面_信息",
     NODE_PAGE_SIZE: "纸张宽高",
     NODE_MARGINS: "页边距",
+    NODE_RPT_BIZ_TYPE: "报表业务类型",
+    NODE_BIZ_TYPE_AUDI: "审核类型",
+    NODE_BIZ_TYPE_SUM: "汇总类型",
+    NODE_BIZ_TYPE_DETAIL: "明细类型",
 
     NODE_FONT_COLLECTION: "font_collection",
     NODE_STYLE_COLLECTION: "style_collection",
@@ -49,6 +57,7 @@ const JV = {
     PROP_BAND_NAME: "BandName",
     PROP_BAND_NORMAL_ONLY: "normalOnly",
     PROP_BAND_EX_ONLY: "exOnly",
+    PROP_BAND_EX_JOIN_AFTER: "isJoinAfter",
 
     PROP_UNITS: "单位",
     PROP_PAGE_SIZE: "页规格",
@@ -79,6 +88,7 @@ const JV = {
     PROP_SUM_FIELDS: "sum_field_s",
     PROP_TEXTS: "text_s",
     PROP_TEXT: "text",
+    PROP_PARAMS: "param_s",
     PROP_FIELD_ID: "FieldID",
     PROP_PARAM_ID: "ParamID",
     PROP_PREFIX: "Prefix",

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

@@ -115,6 +115,72 @@ let bandSetting = {
     }
 };
 
+let bandSetting2 = {
+    view: {
+        showIcon: true,
+        expandSpeed: "",
+        selectedMulti: false
+    },
+    edit: {
+        enable: true,
+        editNameSelectAll: false,
+        showRemoveBtn: false,
+        showRenameBtn: false
+    },
+    data: {
+        keep: {
+            parent:true,
+            leaf:true
+        },
+        key: {
+            children: 'items',
+            name: "Name"
+        },
+        simpleData: {
+            enable: true
+        }
+    },
+    callback:{
+        onClick: dataInfoMapTreeOprObj.onBandClick(),
+        beforeDrag: function() {return false;}
+    }
+};
+
+let selectedFieldMapSetting = {
+    view: {
+        showIcon: true,
+        expandSpeed: "",
+        selectedMulti: false
+    },
+    edit: {
+        enable: true,
+        editNameSelectAll: false,
+        showRemoveBtn: false,
+        showRenameBtn: false,
+        drag: {
+            isCopy: true,
+            isMove: false
+        }
+    },
+    data: {
+        keep: {
+            parent:true,
+            leaf:true
+        },
+        key: {
+            children: 'items',
+            name: "Name"
+        },
+        simpleData: {
+            enable: true
+        }
+    },
+    callback:{
+        beforeDrag: dataInfoMapTreeOprObj.onBeforeDrag,
+        beforeDrop: dataInfoMapTreeOprObj.onBeforeDrop
+    }
+};
+
 let fieldMapSetting = {
     view: {
         showIcon: true,
@@ -156,6 +222,44 @@ let fieldMapSetting = {
     }
 };
 
+let rptDataInfoSetting = {
+    view: {
+        showIcon: true,
+        expandSpeed: "",
+        selectedMulti: false
+    },
+    edit: {
+        enable: true,
+        editNameSelectAll: true,
+        showRemoveBtn: true,
+        showRenameBtn: false,
+        removeTitle: "删除",
+        drag: {
+            isCopy: false,
+            isMove: true
+        }
+    },
+    data: {
+        keep: {
+            parent:true,
+            leaf:true
+        },
+        key: {
+            children: 'items',
+            name: "Name"
+        },
+        simpleData: {
+            enable: true
+        }
+    },
+    callback:{
+        onClick: dataInfoMapTreeOprObj.onClick,
+        beforeRemove: dataInfoMapTreeOprObj.onBeforeRemove,
+        onRemove: dataInfoMapTreeOprObj.onRemove
+        //,beforeDrop: dataInfoMapTreeOprObj.onBeforeDrop
+    }
+};
+
 let selectableFieldSetting = {
     view: {
         showIcon: true,
@@ -195,6 +299,49 @@ let selectableFieldSetting = {
     }
 };
 
+let discreteFieldParamSetting = {
+    view: {
+        showIcon: true,
+        expandSpeed: "",
+        selectedMulti: false,
+        addHoverDom: discreteFieldParamTreeOprObj.addHoverDom,
+        removeHoverDom: discreteFieldParamTreeOprObj.removeHoverDom
+    },
+    edit: {
+        enable: true,
+        editNameSelectAll: false,
+        showRemoveBtn: true,
+        showRenameBtn: true,
+        removeTitle: "删除",
+        renameTitle: "更改名称",
+        drag: {
+            isCopy: true,
+            isMove: false
+        }
+    },
+    data: {
+        keep: {
+            parent:true,
+            leaf:true
+        },
+        key: {
+            children: 'items',
+            name: "Name"
+        },
+        simpleData: {
+            enable: true
+        }
+    },
+    callback:{
+        beforeRename: discreteFieldParamTreeOprObj.beforeRename,
+        beforeRemove: discreteFieldParamTreeOprObj.onBeforeRemove,
+        onRemove: discreteFieldParamTreeOprObj.onRemove,
+        onRename: discreteFieldParamTreeOprObj.onRename,
+        beforeDrag: discreteFieldParamTreeOprObj.onBeforeDrag,
+        beforeDrop: discreteFieldParamTreeOprObj.onBeforeDrop
+    }
+};
+
 const engineering = {
     // 建筑工程
     ARCHITECTURE: 1,

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

@@ -13,6 +13,40 @@ let bandTreeOprObj = {
         me.treeObj = $.fn.zTree.init($("#band_tree_reversed"), bandSetting, bandList);
         me.treeObj.expandAll(true);
     },
+    copyBandList: function (isAllParent) {
+        let me = this, rst = null;
+        if (me.treeObj) {
+            rst = [];
+            let nodes = me.treeObj.getNodes();
+            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];
+                item[JV.BAND_PROP_STYLE] = parentNode[JV.BAND_PROP_STYLE];
+                item[JV.BAND_PROP_CONTROL] = parentNode[JV.BAND_PROP_CONTROL];
+                if (parentNode[JV.BAND_PROP_HEIGHT]) item[JV.BAND_PROP_HEIGHT] = parentNode[JV.BAND_PROP_HEIGHT];
+                if (parentNode[JV.BAND_PROP_WIDTH]) item[JV.BAND_PROP_WIDTH] = parentNode[JV.BAND_PROP_WIDTH];
+                item[JV.BAND_PROP_DISPLAY_TYPE] = parentNode[JV.BAND_PROP_DISPLAY_TYPE];
+                item[JV.BAND_PROP_ALIGNMENT] = parentNode[JV.BAND_PROP_ALIGNMENT];
+                item[JV.BAND_PROP_MERGE_BORDER] = parentNode[JV.BAND_PROP_MERGE_BORDER];
+                if (isAllParent) item.isParent = true;
+                if (parentNode[JV.BAND_PROP_SUB_BANDS]) {
+                    item.items = [];
+                    for (let subNode of parentNode[JV.BAND_PROP_SUB_BANDS]) {
+                        let subItem = {};
+                        private_copy_nodes(subNode, subItem);
+                        item.items.push(subItem);
+                    }
+                }
+            }
+            for (let node of nodes) {
+                let item = {};
+                if (isAllParent) item.isParent = true;
+                private_copy_nodes(node, item);
+                rst.push(item);
+            }
+        }
+        return rst;
+    },
     buildTreeData: function(bandList){
         let rst = [], startIdx = 1;
         //zTreeHelper.createTree(result, setting, "rptTplTree", me);

+ 205 - 0
web/maintain/report/js/rpt_tpl_data_map.js

@@ -0,0 +1,205 @@
+/**
+ * Created by Tony on 2017/10/5.
+ */
+'use strict'
+
+let dataInfoMapTreeOprObj = {
+    treeObj : null,
+    currentNode: null,
+    dataTypeDef: ['string', 'int32', 'int64', 'double', 'currency', 'date', 'image'],
+    iniTree: function(rptTpl) {
+        var me = this;
+        let fieldMapList = me.buildTreeData(rptTpl);
+        me.treeObj = $.fn.zTree.init($("#tpl_data_info_reversed"), rptDataInfoSetting, fieldMapList);
+        me.treeObj.expandAll(true);
+    },
+    iniDataMap: function () {
+        let me = this, bandList = bandTreeOprObj.copyBandList(true);
+        if (bandList) {
+            let bandTree = $.fn.zTree.init($("#band_tree2_reversed"), bandSetting2, bandList);
+            bandTree.expandAll(true);
+        }
+        let selectedFieldList = fieldMapTreeOprObj.copySelectedFieldList();
+        let selectedFieldTree = $.fn.zTree.init($("#tpl_data_selected_field_map_reversed"), selectedFieldMapSetting, selectedFieldList);
+        selectedFieldTree.expandAll(true);
+    },
+    buildTreeData: function (rptTpl) {
+        let me = this, rst = null;
+
+        $("#dispRowHeight")[0].style.display = "";
+        $("#dispColWidth")[0].style.display = "";
+        if (rptTpl[JV.NODE_FLOW_INFO]) {
+            //
+        } else if (rptTpl[JV.NODE_CROSS_INFO]) {
+            //
+        } else if (rptTpl[JV.NODE_BILL_INFO]) {
+            rst = me.buildBillData(rptTpl);
+            $("#dispRowHeight")[0].style.display = "none";
+            $("#dispColWidth")[0].style.display = "none";
+        }
+
+        return rst;
+    },
+    buildBillData: function(rptTpl) {
+        let me = this, rst = [];
+        let rootFieldNode = {Name: JV.NODE_BILL_CONTENT, type: "bill_data", isParent: true};
+        let discreteNode = {Name: JV.NODE_DISCRETE_INFO};
+        rst.push(rootFieldNode);
+        rst.push(discreteNode);
+        me.private_build_bill_data(rootFieldNode, rptTpl[JV.NODE_BILL_INFO][JV.NODE_BILL_CONTENT]);
+        me.private_build_bill_discrete_data(discreteNode, rptTpl[JV.NODE_BILL_INFO][JV.NODE_DISCRETE_INFO]);
+
+        return rst;
+    },
+
+    private_build_bill_data: function (rootFieldNode, billData) {
+        let me = this, bandName = billData[JV.PROP_BAND_NAME];
+        if (rootFieldNode) {
+            rootFieldNode.items = [];
+            for (let fieldItem of billData[JV.PROP_BILL_FIELDS]) {
+                rootFieldNode.items.push(me.private_build_field_node(bandName, fieldItem));
+            }
+        }
+    },
+    private_build_bill_discrete_data: function (discreteNode, discreteData) {
+        let me = this;
+        if (discreteNode) {
+            discreteNode.items = [];
+            let fieldItem = {Name: "Fields", items:[], isParent: true};
+            let paramItem = {Name: "Params", items:[], isParent: true};
+            let textItem = {Name: "Texts", items:[], isParent: true};
+            discreteNode.items.push(fieldItem);
+            discreteNode.items.push(paramItem);
+            discreteNode.items.push(textItem);
+            for (let bandItem of discreteData) {
+                let bandName = bandItem[JV.PROP_BAND_NAME];
+                if (bandItem[JV.PROP_DISCRETE_FIELDS]) {
+                    for (let dtlItem of bandItem[JV.PROP_DISCRETE_FIELDS]) {
+                        fieldItem.items.push(me.private_build_field_node(bandName, dtlItem));
+                    }
+                }
+                if (bandItem[JV.PROP_PARAMS]) {
+                    for (let dtlItem of bandItem[JV.PROP_PARAMS]) {
+                        paramItem.items.push(me.private_build_param_node(bandName, dtlItem));
+                    }
+                }
+
+                if (bandItem[JV.PROP_TEXTS]) {
+                    for (let dtlItem of bandItem[JV.PROP_TEXTS]) {
+                        textItem.items.push(me.private_build_text_node(bandName, dtlItem));
+                    }
+                }
+                if (bandItem[JV.PROP_TEXT]) {
+                    textItem.items.push(me.private_build_text_node(bandName, bandItem[JV.PROP_TEXT]));
+                }
+            }
+        }
+    },
+    private_build_field_node: function (bandName, fieldData) {
+        let me = this, rst = null;
+        if (fieldData) {
+            rst = {};
+            rst[JV.PROP_BAND_NAME] = bandName;
+            rst[JV.PROP_FIELD_ID] = fieldData[JV.PROP_FIELD_ID];
+            rst[JV.TAB_FIELD_PROP_SORT] = fieldData[JV.TAB_FIELD_PROP_SORT];
+            rst[JV.PROP_FONT] = fieldData[JV.PROP_FONT];
+            rst[JV.PROP_CONTROL] = fieldData[JV.PROP_CONTROL];
+            rst[JV.PROP_STYLE] = fieldData[JV.PROP_STYLE];
+            rst[JV.PROP_PREFIX] = fieldData[JV.PROP_PREFIX];
+            rst[JV.PROP_SUFFIX] = fieldData[JV.PROP_SUFFIX];
+            rst[JV.PROP_AREA] = {};
+            me.private_copy_area(fieldData[JV.PROP_AREA], rst[JV.PROP_AREA]);
+        }
+        return rst;
+    },
+    private_copy_area: function (orgArea, destArea) {
+        destArea[JV.PROP_LEFT] = orgArea[[JV.PROP_LEFT]];
+        destArea[JV.PROP_RIGHT] = orgArea[[JV.PROP_RIGHT]];
+        destArea[JV.PROP_TOP] = orgArea[[JV.PROP_TOP]];
+        destArea[JV.PROP_BOTTOM] = orgArea[[JV.PROP_BOTTOM]];
+        destArea[JV.PROP_H_CALCULATION] = orgArea[[JV.PROP_H_CALCULATION]];
+        destArea[JV.PROP_V_CALCULATION] = orgArea[[JV.PROP_V_CALCULATION]];
+    },
+    private_build_param_node: function (bandName, param) {
+        let me = this, rst = null;
+        if (param) {
+            rst = {};
+            rst[JV.PROP_BAND_NAME] = bandName;
+            rst[JV.PROP_PARAM_ID] = param[JV.PROP_PARAM_ID];
+            rst[JV.PROP_FONT] = param[JV.PROP_FONT];
+            rst[JV.PROP_CONTROL] = param[JV.PROP_CONTROL];
+            rst[JV.PROP_STYLE] = param[JV.PROP_STYLE];
+            rst[JV.PROP_PREFIX] = param[JV.PROP_PREFIX];
+            rst[JV.PROP_SUFFIX] = param[JV.PROP_SUFFIX];
+            rst[JV.PROP_AREA] = {};
+            me.private_copy_area(param[JV.PROP_AREA], rst[JV.PROP_AREA]);
+        }
+        return rst;
+    },
+
+    private_build_text_node: function (bandName, text) {
+        //
+    },
+
+    onClick: function (event,treeId,treeNode) {
+        //
+    },
+    onBandClick: function (event,treeId,treeNode) {
+        //
+    },
+    onBeforeRemove: function(treeId, treeNode){
+        let rst = true;
+        if (treeNode.isParent) {
+            rst = false;
+        } else {
+            //
+        }
+        return rst;
+    },
+    beforeRename: function(treeId, treeNode, newName, isCancel) {
+        //
+    },
+    onBeforeDrag: function (treeId, treeNodes) {
+        let rst = true;
+        for (let node of treeNodes) {
+            if (node.level === 0) {
+                rst = false;
+                break;
+            }
+        }
+        return rst;
+    },
+    onBeforeDrop: function(treeId, treeNodes, targetNode, moveType){
+        let rst = false;
+        if (targetNode.tId && targetNode.tId.indexOf("tpl_data_info_reversed") >= 0 && (!(targetNode.isParent && moveType !== 'inner')) ) {
+            if (targetNode.level === 0) {
+                if (targetNode.Name !== "离散信息" && moveType === 'inner') {
+                    rst = true;
+                }
+            } else {
+                let parentNode = targetNode.getParentNode();
+                if (parentNode.Name === "离散信息") {
+                    if (targetNode.Name === "Fields") {
+                        rst = true;
+                    }
+                } else if (parentNode.Name === "Fields") {
+                    rst = true;
+                }
+            }
+        }
+        return rst;
+    },
+    onRemove: function () {
+        //
+    },
+    onRename: function () {
+        //
+    },
+    extractFieldMaps: function (rptTpl) {
+        //
+    },
+    createMapFieldByNode: function (node) {
+        //
+    }
+};
+

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

@@ -33,6 +33,21 @@ let fieldMapTreeOprObj = {
 
         return rst;
     },
+    copySelectedFieldList: function () {
+        let me = this, rst = [];
+        let nodes = me.treeObj.getNodes();
+        for (let node of nodes) {
+            let item = {Name: node.Name, items: [], isParent: true};
+            if (node.items) {
+                for (let subNode of node.items) {
+                    let subItem = me.createMapFieldByNode(subNode);
+                    item.items.push(subItem);
+                }
+            }
+            rst.push(item)
+        }
+        return rst;
+    },
     onClick: function (event,treeId,treeNode) {
         let me = fieldMapTreeOprObj;
         me.currentNode = treeNode;
@@ -165,4 +180,82 @@ let selectableFiledTreeOprObj = {
             if (btn) btn.bind("click", function(){alert("diy Button for " + treeNode.name);});
         }
     }
-}
+};
+
+let discreteFieldParamTreeOprObj = {
+    treeObj : null,
+    currentNode: null,
+    iniTree: function(rptTpl) {
+        var me = this;
+        let fieldMapList = me.buildTreeData(rptTpl);
+        me.treeObj = $.fn.zTree.init($("#tpl_discrete_fields_params_reversed"), discreteFieldParamSetting, fieldMapList);
+        me.treeObj.expandAll(true);
+    },
+    buildTreeData: function(rptTpl){
+        let rst = [];
+        let disFieldNode = {Name: JV.NODE_NO_MAPPING_FIELDS, items: [], isParent: true};
+        let disParamNode = {Name: JV.NODE_DISCRETE_PARAMS, items: [], isParent: true};
+        rst.push(disFieldNode);
+        rst.push(disParamNode);
+        //rptTpl[JV.NODE_NO_MAPPING_FIELDS]
+        //rptTpl[JV.NODE_DISCRETE_PARAMS]
+        return rst;
+    },
+    addHoverDom: function(treeId, treeNode) {
+        let me = discreteFieldParamTreeOprObj, sObj = $("#" + treeNode.tId + "_span");
+        if (treeNode.level > 0 || $("#addBtn_"+treeNode.tId).length > 0) 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(){
+            //
+        });
+    },
+    removeHoverDom: function(treeId, treeNode) {
+        $("#addBtn_"+treeNode.tId).unbind().remove();
+    },
+    onBeforeRemove: function(treeId, treeNode){
+        let rst = true;
+        if (treeNode.isParent) {
+            rst = false;
+        }
+        return rst;
+    },
+    beforeRename: function(treeId, treeNode, newName, isCancel) {
+        let rst = true;
+        if (treeNode.isParent && !isCancel) {
+            rst = false;
+        }
+        return rst;
+    },
+    onBeforeDrag: function (treeId, treeNodes) {
+        //
+    },
+    onBeforeDrop: function(treeId, treeNodes, targetNode, moveType){
+        // let rst = false;
+        // if (targetNode.tId && targetNode.tId.indexOf("tpl_data_info_reversed") >= 0 && (!(targetNode.isParent && moveType !== 'inner')) ) {
+        //     if (targetNode.level === 0) {
+        //         if (targetNode.Name !== "离散信息" && moveType === 'inner') {
+        //             rst = true;
+        //         }
+        //     } else {
+        //         let parentNode = targetNode.getParentNode();
+        //         if (parentNode.Name === "离散信息") {
+        //             if (targetNode.Name === "Fields") {
+        //                 rst = true;
+        //             }
+        //         } else if (parentNode.Name === "Fields") {
+        //             rst = true;
+        //         }
+        //     }
+        // }
+        // return rst;
+    },
+    onRemove: function () {
+        //
+    },
+    onRename: function () {
+        //
+    }
+
+};

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

@@ -63,6 +63,8 @@ let tplHelper = {
             //3. 指标映射
             fieldMapTreeOprObj.iniTree(rptTpl);
             //4. 指标摆放
+            dataInfoMapTreeOprObj.iniTree(rptTpl);
+            discreteFieldParamTreeOprObj.iniTree(rptTpl);
             //5. 计算式
         }
     },

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

@@ -139,7 +139,6 @@ let zTreeOprObj = {
         return itemRst;
     },
 
-    //*
     addHoverDom: function(treeId, treeNode) {
         let me = zTreeOprObj, sObj = $("#" + treeNode.tId + "_span");
         if (treeNode.editNameFlag || $("#addBtn_"+treeNode.tId).length > 0 || treeNode.nodeType == RT.NodeType.TEMPLATE) return;
@@ -381,257 +380,7 @@ let zTreeOprObj = {
             }
         }
     },
-    /*/
-    addHoverDom: function(treeId, treeNode) {
-        let me = zTreeOprObj, 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 rawNode = me.createIniRootNode(), lastNodeId = -1, insertIdx = -1, lastNode = null;
-            rawNode.ParentID = treeNode.ID;
-            rawNode.name = "新增子节点";
-            if (treeNode.items.length > 0) {
-                for (let i = treeNode.items.length - 1; i >= 0; i--) {
-                    if (treeNode.items[i].nodeType == RT.NodeType.NODE) {
-                        lastNodeId = treeNode.items[i].ID;
-                        lastNode = treeNode.items[i];
-                        rawNode.NextSiblingID = treeNode.items[i].NextSiblingID;
-                        insertIdx = i + 1;
-                        break;
-                    } else {
-                        rawNode.NextSiblingID = treeNode.items[i].ID;
-                        insertIdx = i;
-                    }
-                }
-            }
-            zTreeOprObj.addNewNode(rawNode, lastNodeId, function(rst){
-                let newNodes = [], isSilent = false;
-                if (lastNode) {
-                    lastNode.NextSiblingID = rst.ID;
-                }
-                rawNode.ID = rst.ID;
-                rawNode.NextSiblingID = rst.NextSiblingID;
-                rawNode.isParent = true;
-                rawNode.items = [];
-                newNodes.push(rawNode);
-                treeNode.isParent = true;
-                if (me.treeObj) {
-                    me.treeObj.addNodes(treeNode, insertIdx, newNodes, isSilent);
-                } else {
-                    me.treeObj = $.fn.zTree.init($("#rptTplTree"), setting, newNodes);
-                }
-            }, null);
-        });
-    },
-    removeHoverDom: function(treeId, treeNode) {
-        $("#addBtn_"+treeNode.tId).unbind().remove();
-    },
-
-    addNewNode: function(rawNode, lastNodeId, callback, failCallback) {
-        let params = {};
-        params.lastNodeId = lastNodeId;
-        params.rawNodeData = rawNode;
-        CommonAjax.postEx("report_tpl_api/createTplTreeNode", params, 5000, true, callback, failCallback, null);
-    },
-    moveUpNode: function() {
-        let me = this, nodes = [];
-        if (me.currentNode && me.currentNode.getPreNode()) {
-            let preNode = me.currentNode.getPreNode(), pre_preNode = preNode.getPreNode();
-            me.treeObj.moveNode(preNode, me.currentNode, "prev", true);
-            //then update the db
-            if (pre_preNode) {
-                pre_preNode.NextSiblingID = me.currentNode.ID;
-                nodes.push(me.createNodeFromZTreeNode(pre_preNode));
-            }
-            preNode.NextSiblingID = me.currentNode.NextSiblingID;
-            me.currentNode.NextSiblingID = preNode.ID;
-            nodes.push(me.createNodeFromZTreeNode(me.currentNode));
-            nodes.push(me.createNodeFromZTreeNode(preNode));
-            me.updateNodes(nodes);
-        }
-    },
-    moveDownNode: function() {
-        let me = this, nodes = [];
-        if (me.currentNode && me.currentNode.getNextNode()) {
-            let preNode = me.currentNode.getPreNode(), nextNode = me.currentNode.getNextNode();
-            me.treeObj.moveNode(nextNode, me.currentNode, "next", true);
-            //then update the db
-            if (preNode) {
-                preNode.NextSiblingID = nextNode.ID;
-                nodes.push(me.createNodeFromZTreeNode(preNode));
-            }
-            me.currentNode.NextSiblingID = nextNode.NextSiblingID;
-            nextNode.NextSiblingID = me.currentNode.ID;
-            nodes.push(me.createNodeFromZTreeNode(me.currentNode));
-            nodes.push(me.createNodeFromZTreeNode(nextNode));
-            me.updateNodes(nodes);
-        }
-    },
-    getReportTemplateTree: function(grpType) {
-        let me = zTreeOprObj, params = {};
-        params.grpType = grpType;
-        params.userId = (userAccount ===  'admin')?('-100'):userID;
-        params.tplType = RT.TplType.ALL;
-        CommonAjax.postEx("report_tpl_api/getRptTplTree", params, 20000, true, function(result){
-                zTreeHelper.createTree(result, setting, "rptTplTree", me);
-                me.refreshNodes();
-            }, null, null
-        );
-    },
-    addTplNode: function (){
-        let me = this;
-        if (me.currentNode && me.currentNode.nodeType === RT.NodeType.NODE) {
-            let rawNode = me.createIniRootNode(), lastNodeId = -1, lastNode = null;
-            rawNode.nodeType = RT.NodeType.TEMPLATE;
-            rawNode.ParentID = me.currentNode.ID;
-            rawNode.name = "新增报表模板";
-            if (me.treeObj) {
-                let nodes = me.currentNode.items;
-                if (nodes.length > 0) {
-                    lastNodeId = nodes[nodes.length - 1].ID;
-                    lastNode = nodes[nodes.length - 1];
-                }
-                me.addNewNode(rawNode, lastNodeId, function(rst){
-                    let newNodes = [], isSilent = false;
-                    if (lastNode) {
-                        lastNode.NextSiblingID = rst.ID;
-                    }
-                    rawNode.ID = rst.ID;
-                    rawNode.isParent = false;
-                    rawNode.items = [];
-                    newNodes.push(rawNode);
-                    if (me.treeObj) {
-                        me.treeObj.addNodes(me.currentNode, -1, newNodes, isSilent);
-                    } else {
-                        me.treeObj = $.fn.zTree.init($("#rptTplTree"), setting, newNodes);
-                    }
-                }, null);
-            }
-        }
-    },
-
-    updateNodes: function(nodes){
-        if (nodes && nodes.length > 0) {
-            let me = this;
-            for (let i = 0; i < nodes.length; i++) {
-                if (nodes[i].__v != null) node.__v = nodes[i].__v + 1
-                else nodes[i].__v = 0;
-            }
-            let params = {};
-            params.nodes = nodes;
-            CommonAjax.postEx("report_tpl_api/updateRptTplNodes", params, 5000, true, null, null, null);
-        }
-    },
-    addRootNode: function() {
-        let me = this, rawNode = me.createIniRootNode(), lastNodeId = -1, lastNode = null;
-        if (me.treeObj) {
-            let rootNodes = me.treeObj.getNodes();
-            if (rootNodes.length > 0) {
-                lastNodeId = rootNodes[rootNodes.length - 1].ID;
-                lastNode = rootNodes[rootNodes.length - 1];
-            }
-            me.addNewNode(rawNode, lastNodeId, function(rst){
-                let newNodes = [], isSilent = false;
-                if (lastNode) {
-                    lastNode.NextSiblingID = rst.ID;
-                }
-                rawNode.ID = rst.ID;
-                rawNode.isParent = true;
-                rawNode.items = [];
-                newNodes.push(rawNode);
-                if (me.treeObj) {
-                    me.treeObj.addNodes(null, -1, newNodes, isSilent);
-                } else {
-                    me.treeObj = $.fn.zTree.init($("#rptTplTree"), setting, newNodes);
-                }
-            }, null);
-        }
-    },
-
-    createIniRootNode: function() {
-        let rst = {
-            ID: -1,
-            ParentID: -1,
-            NextSiblingID: -1,
-            grpType: RT.GrpType.CONSTRUCT,
-            nodeType: RT.NodeType.NODE,
-            tplType: RT.TplType.ALL,
-            userId: (userAccount ===  'admin')?('-100'):userID,
-            refId: -1,
-            name: '新增节点'
-        };
-        return rst;
-    },
-
-    onBeforeRemove: function(treeId, treeNode){
-        let nodeIds = [], preNode = treeNode.getPreNode(), preNodeId = -1, canRemove = false, params = {};
-        if (preNode) {
-            preNodeId = preNode.ID;
-        }
-        let private_fetchAllSubItems = function(pItem){
-            nodeIds.push(pItem.ID);
-            if (pItem.items && pItem.items.length > 0) {
-                for (let i = 0; i < pItem.items.length; i++) {
-                    private_fetchAllSubItems(pItem.items[i]);
-                }
-            }
-        };
-        nodeIds.push(treeNode.ID);
-        for (let i = 0; i < treeNode.items.length; i++) {
-            private_fetchAllSubItems(treeNode.items[i]);
-        }
-        params.nodeIds = nodeIds;
-        params.preNodeId = preNodeId;
-        params.preNodeNextId = treeNode.NextSiblingID;
-        CommonAjax.postEx("report_tpl_api/deleteRptTplNodes", params, 5000, false, function(data){
-            canRemove = true;
-        }, null, null);
-        return canRemove;
-    },
-    onRemove: function(e, treeId, treeNode){
-        let me = zTreeOprObj, pNode = me.treeObj.getNodeByTId(treeNode.parentTId);
-        if (pNode && pNode.items && pNode.items.length === 0) {
-            if (pNode.nodeType === RT.NodeType.NODE) pNode.isParent = true
-            else pNode.isParent = false;
-            me.treeObj.refresh();
-        }
-    },
-    beforeRename: function(treeId, treeNode, newName, isCancel) {
-        if (newName.length === 0) {
-            return false;
-        }
-        return true;
-    },
-    onRename : function(e, treeId, treeNode, isCancel) {
-        let me = zTreeOprObj, nodes = [];
-        nodes.push(me.createNodeFromZTreeNode(treeNode));
-        me.updateNodes(nodes);
-        if (treeNode.nodeType === RT.NodeType.TEMPLATE && treeNode.refId >= 0) {
-            if (treeNode.rptTpl !== null) {
-                treeNode.rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MAIN_INFO_RPT_NAME] = treeNode.name;
-                $("#rptTplName")[0].value = treeNode.rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MAIN_INFO_RPT_NAME];
-            } else {
-                me.onClick(e, treeId, treeNode);
-            }
-        }
-    },
-    createNodeFromZTreeNode: function(treeNode) {
-        let rst = {};
-        rst.ID = treeNode.ID;
-        rst.ParentID = treeNode.ParentID;
-        rst.NextSiblingID = treeNode.NextSiblingID;
-        rst.grpType = treeNode.grpType;
-        rst.nodeType = treeNode.nodeType;
-        rst.tplType = treeNode.tplType;
-        rst.userId = treeNode.userId;
-        rst.refId = treeNode.refId;
-        rst.name = treeNode.name;
-        return rst;
-    },
 
-    //*/
     createNewTpl: function () {
         let me = zTreeOprObj, params = {};
         if (me.currentNode && me.currentNode.nodeType === RT.NodeType.TEMPLATE) {

+ 30 - 15
web/maintain/report/rpt_tpl_main.html

@@ -77,7 +77,7 @@
                                                 <a class="nav-link p-1" data-toggle="tab" href="#rpttplfieldmap" role="tab">指标映射</a>
                                             </li>
                                             <li class="nav-item">
-                                                <a class="nav-link p-1" data-toggle="tab" href="#rpttplfieldlocation" role="tab">指标摆放</a>
+                                                <a class="nav-link p-1" data-toggle="tab" href="#rpttplfieldlocation" role="tab" onclick="dataInfoMapTreeOprObj.iniDataMap();">指标摆放</a>
                                             </li>
                                             <li class="nav-item">
                                                 <a class="nav-link p-1" data-toggle="tab" href="#rpttplformula" role="tab">计算式</a>
@@ -230,29 +230,43 @@
                                             <div class="tab-pane" id="rpttplfieldlocation" role="tabpanel">
                                                 <div class="main-data">
                                                     <div class="p-3">
-                                                        <div class="ztree-warp">
-                                                            ztree 保留空间
-                                                        </div>
-                                                        <div class="form-group">
-                                                            <label>所属Band</label>
-                                                            <select class="form-control"><option> </option></select>
+                                                        <div class="row">
+                                                            <div class="form-group col-md-6">
+                                                                <div class="ztree-warp">
+                                                                    <ul id="tpl_data_info_reversed" class="ztree"></ul>
+                                                                </div>
+                                                            </div>
+                                                            <div class="form-group col-md-6">
+                                                                <div class="ztree-warp">
+                                                                    <ul id="band_tree2_reversed" class="ztree"></ul>
+                                                                </div>
+                                                            </div>
                                                         </div>
-                                                        <div class="form-group">
+                                                        <div class="form-group" id="dispRowHeight">
                                                             <label>显示行高度</label>
                                                             <select class="form-control"><option> </option></select>
                                                             <small class="form-text text-muted">用于 流水行/交叉行</small>
                                                         </div>
-                                                        <div class="form-group">
+                                                        <div class="form-group" id="dispColWidth">
                                                             <label>显示列宽度</label>
                                                             <select class="form-control"><option> </option></select>
                                                             <small class="form-text text-muted">用于 交叉列</small>
                                                         </div>
-                                                        <div class="ztree-warp">
-                                                            ztree 保留空间
-                                                        </div>
-                                                        <div class="form-group">
-                                                            <label>映射指标</label>
-                                                            <select class="form-control"><option> </option></select>
+                                                        <div class="row">
+                                                            <div class="form-group col-md-6">
+                                                                <div class="ztree-warp">
+                                                                    <label>离散独立指标/参数</label>
+                                                                    <ul id="tpl_discrete_fields_params_reversed" class="ztree"></ul>
+                                                                </div>
+                                                            </div>
+                                                            <div class="form-group col-md-6">
+                                                                <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>
                                                     </div>
                                                 </div>
@@ -337,6 +351,7 @@
     <script src="/web/maintain/report/js/rpt_tpl_field_cfg.js"></script>
     <script src="/web/maintain/report/js/rpt_tpl_calculation.js"></script>
     <script src="/web/maintain/report/js/rpt_tpl_helper.js"></script>
+    <script src="/web/maintain/report/js/rpt_tpl_data_map.js"></script>
     <script src="/web/maintain/report/js/cfg_const.js"></script>
     <script src="/web/maintain/report/js/rpt_tpl_preview_util.js"></script>
     <!-- zTree -->