Jelajahi Sumber

report filter

TonyKang 7 tahun lalu
induk
melakukan
4d11e8997a

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

@@ -314,7 +314,7 @@ function filterData(sourceData, handleCfg, prjData) {
     for (let item of tempRstArr) {
         let compRst = true;
         let curComparePrjData = null;
-        for (let cfg of handleCfg[JV.PROP_FILTER_KEY]) {
+        for (let cfg of handleCfg[JV.PROP_FILTER_KEYS]) {
             if (cfg[JV.PROP_FILTER_COMPARE_VAL]) {
                 //比较key值
                 compRst = private_chkVal(item[cfg.key], cfg[JV.PROP_FILTER_COMPARE_VAL], cfg[JV.PROP_FILTER_CONDITION]);

+ 1 - 1
public/web/rpt_value_define.js

@@ -53,7 +53,7 @@ const JV = {
     PROP_CHILD_SORT_KEYS: "子排序键值集",
     PROP_OTHER_SUB_SORT: "其他子排序",
     PROP_HANDLE_TYPE: "预处理类型",
-    PROP_FILTER_KEY: "过滤键值集",
+    PROP_FILTER_KEYS: "过滤键值集",
     PROP_FILTER_COMPARE_OBJ: "compareObjKey",
     PROP_FILTER_COMPARE_OBJ_KEY: "compareObjIdKey",
     PROP_FILTER_COMPARE_VAL: "compareValue",

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

@@ -514,6 +514,39 @@ let sortingKeysSetting = {
     }
 };
 
+let filterKeysSetting = {
+    view: {
+        addDiyDom: preHandleFilterObj.addDiyDom
+    },
+    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: preHandleFilterObj.onCheck,
+        beforeDrag: function(){return false;}
+    }
+};
+
 const engineering = {
     // 建筑工程
     ARCHITECTURE: 1,

+ 3 - 1
web/maintain/report/js/rpt_tpl_helper.js

@@ -107,7 +107,9 @@ let tplHelper = {
             dataInfoMapTreeOprObj.extractTabFields(rptTpl);
             dataInfoMapTreeOprObj.extractDiscreteFieldParam(rptTpl);
             discreteFieldParamTreeOprObj.extractFieldMaps(rptTpl);
-            //5. 计算式
+            //5. 指标预处理
+            preHandleObj.extractTabFields(rptTpl);
+            //6. 计算式
             calculationTreeOprObj.extractCalculation(rptTpl);
         } else {
             rst = false;

+ 277 - 18
web/maintain/report/js/rpt_tpl_pre_handle.js

@@ -109,11 +109,66 @@ let preHandleObj = {
             }
         }
     },
-    addNewNode: function() {
-        let me = this, item = {Name: "预处理环节", Title: "", "映射数据对象": "bills", "预处理类型": "排序", "排序方式": "normal", "排序键值集":[], Operations: []};
+    addNewNode: function(nodeType) {
+        let me = this, item = null, preHandleType = nodeType;
+        if (!nodeType) {
+            preHandleType = JV.PROP_HANDLE_TYPE_SORT;
+        }
+        switch (nodeType) {
+            case JV.PROP_HANDLE_TYPE_SORT:
+                item = {Name: "预处理环节", Title: "", "映射数据对象": "bills", "预处理类型": preHandleType, "排序方式": "normal", "排序键值集":[]};
+                break;
+            case JV.PROP_HANDLE_TYPE_FILTER:
+                item = {Name: "预处理环节", Title: "", "映射数据对象": "bills", "预处理类型": preHandleType, "过滤键值集": []};
+                break;
+            case JV.PROP_HANDLE_TYPE_SUM:
+                item = {Name: "预处理环节", Title: "", "映射数据对象": "bills", "预处理类型": preHandleType, "分组键值集": [], "统计键值集":[]};
+                break;
+            case JV.PROP_HANDLE_TYPE_ADJUST:
+                item = {Name: "预处理环节", Title: "", "映射数据对象": "bills", "预处理类型": preHandleType, "数据调整集":[]};
+                break;
+            case JV.PROP_HANDLE_TYPE_ADD_DUMMY:
+                item = {Name: "预处理环节", Title: "", "映射数据对象": "bills", "预处理类型": preHandleType, "Dummy数据集":[]};
+                break;
+            default:
+                item = {Name: "预处理环节", Title: "", "映射数据对象": "bills", "预处理类型": "排序", "排序方式": "normal", "排序键值集":[]};
+                break;
+        }
         me.private_set_title(item);
         me.treeObj.addNodes(null, -1, [item], true);
     },
+    private_change_node_by_type: function(handleType, item) {
+        let preHandleType = handleType;
+        if (!handleType) {
+            preHandleType = JV.PROP_HANDLE_TYPE_SORT;
+        }
+        item[JV.PROP_HANDLE_TYPE] = preHandleType;
+        switch (handleType) {
+            case JV.PROP_HANDLE_TYPE_SORT:
+                item[JV.PROP_SORT_TYPE] = "normal";
+                item[JV.PROP_SORT_KEYS] = [];
+                break;
+            case JV.PROP_HANDLE_TYPE_FILTER:
+                item[JV.PROP_FILTER_KEYS] = [];
+                break;
+            case JV.PROP_HANDLE_TYPE_SUM:
+                item[JV.PROP_SUM_GROUP_KEYS] = [];
+                item[JV.PROP_SUM_SUM_KEYS] = [];
+                break;
+            case JV.PROP_HANDLE_TYPE_ADJUST:
+                item[JV.PROP_ADJUST_COLLECTION] = [];
+                break;
+            case JV.PROP_HANDLE_TYPE_ADD_DUMMY:
+                item[JV.PROP_DUMMY_COLLECTION] = [];
+                break;
+            default:
+                item[JV.PROP_HANDLE_TYPE] = JV.PROP_HANDLE_TYPE_SORT;
+                item[JV.PROP_SORT_TYPE] = "normal";
+                item[JV.PROP_SORT_KEYS] = [];
+                break;
+        }
+        // return rst;
+    },
     private_copy_node: function(src, dest) {
         let me = this;
         dest[JV.PROP_DATA_KEY] = src[JV.PROP_DATA_KEY];
@@ -197,7 +252,8 @@ let preHandleObj = {
         //选择预处理类型(排序、过滤。。。)
         let me = preHandleObj;
         if (me.currentNode) {
-            me.currentNode[JV.PROP_HANDLE_TYPE] = treeNode[JV.PROP_NAME];
+            // me.currentNode[JV.PROP_HANDLE_TYPE] = treeNode[JV.PROP_NAME];
+            me.private_change_node_by_type(treeNode[JV.PROP_NAME], me.currentNode);
             me.private_set_title(me.currentNode);
             me.treeObj.updateNode(me.currentNode, false);
             me.refreshByNode(me.currentNode);
@@ -209,6 +265,7 @@ let preHandleObj = {
         if (oprType === "top") {
             me.childTreeObj = $.fn.zTree.init($("#child_sorting_keys"), sortingKeysSetting, exposed_properties_arr[dom.selectedIndex]);
             me.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") {
             me.parentTreeObj = $.fn.zTree.init($("#parent_sorting_keys"), sortingKeysSetting, exposed_properties_arr[dom.selectedIndex]);
         }
@@ -242,29 +299,32 @@ let preHandleObj = {
         return rst;
     },
     extractTabFields: function (rptTpl) {
-        if (rptTpl[JV.NODE_MAP_DATA_HANDLE_INFO]) {
-            for (let handleObj of rptTpl[JV.NODE_MAP_DATA_HANDLE_INFO]) {
+        let me = this, nodes = me.treeObj.getNodes();
+        let rst = [];
+        if (nodes && nodes.length > 0) {
+            for (let handleObj of nodes) {
                 switch (handleObj[JV.PROP_HANDLE_TYPE]) {
                     case JV.PROP_HANDLE_TYPE_SORT:
-                        preHandleSortObj.extractTabFields(handleObj);
+                        rst.push(preHandleSortObj.extractTabFields(handleObj));
                         break;
                     case JV.PROP_HANDLE_TYPE_FILTER:
-                        preHandleFilterObj.extractTabFields(handleObj);
+                        rst.push(preHandleFilterObj.extractTabFields(handleObj));
                         break;
                     case JV.PROP_HANDLE_TYPE_SUM:
-                        preHandleSummaryObj.extractTabFields(handleObj);
+                        rst.push(preHandleSummaryObj.extractTabFields(handleObj));
                         break;
                     case JV.PROP_HANDLE_TYPE_ADJUST:
-                        preHandleAdjustObj.extractTabFields(handleObj);
+                        rst.push(preHandleAdjustObj.extractTabFields(handleObj));
                         break;
                     case JV.PROP_HANDLE_TYPE_ADD_DUMMY:
-                        preHandleAddDummyObj.extractTabFields(handleObj);
+                        rst.push(preHandleAddDummyObj.extractTabFields(handleObj));
                         break;
                     default:
                         break;
                 }
             }
         }
+        rptTpl[JV.NODE_MAP_DATA_HANDLE_INFO] = rst;
     }
 };
 
@@ -280,6 +340,43 @@ let preHandleSortObj = {
                 break;
             case 0 :
                 //normal
+                let sortTypeIdx = sort_types.indexOf(src[JV.PROP_SORT_TYPE]);
+                switch (sortTypeIdx) {
+                    case -1:
+                        //unknown!
+                        break;
+                    case 0 :
+                        //normal
+                        let keys = [];
+                        for (let sortKeyItem of src[JV.PROP_SORT_KEYS]) {
+                            let item = {key: sortKeyItem.key, order: sortKeyItem.order};
+                            keys.push(item);
+                        }
+                        dest[JV.PROP_SORT_KEYS] = keys;
+                        break;
+                    case 1 :
+                        //tree
+                        //tree排序是我们特有的数据结构方式,与数据结构有关,非common用, 无其他参数
+                        break;
+                    case 2 :
+                        //according to parent
+                        // $("#div_sort_type_according_to_parent")[0].style.display = "";
+                        // $("#div_sort_type_parent_data")[0].style.display = "";
+                        // sel = $("#select_mapping_data_for_sort_type")[0];
+                        // idx = pre_handle_data_objects.indexOf(preHandleObj.currentNode[JV.PROP_PARENT_CHILD_SORT_KEY][JV.PROP_PARENT_DATA_KEY]);
+                        // sel.selectedIndex = idx;
+                        // me.parentTreeObj = $.fn.zTree.init($("#parent_sorting_keys"), sortingKeysSetting, exposed_properties_arr[idx]);
+                        // me.checkupNode(preHandleObj.currentNode[JV.PROP_PARENT_CHILD_SORT_KEY][JV.PROP_PARENT_SORT_KEYS], me.parentTreeObj);
+                        // idx = pre_handle_data_objects.indexOf(preHandleObj.currentNode[JV.PROP_DATA_KEY]);
+                        // me.childTreeObj = $.fn.zTree.init($("#child_sorting_keys"), sortingKeysSetting, exposed_properties_arr[idx]);
+                        // me.checkupNode(preHandleObj.currentNode[JV.PROP_PARENT_CHILD_SORT_KEY][JV.PROP_CHILD_SORT_KEYS], me.childTreeObj);
+                        break;
+                    case 3 :
+                        //self define
+                        break;
+                    default:
+                        break;
+                }
                 break;
             case 1 :
                 //tree
@@ -392,13 +489,12 @@ let preHandleSortObj = {
         }
     },
     resetNormalSort: function() {
-        let nodes = me.treeObj.getNodes();
+        let me = preHandleSortObj;
+        let nodes = me.treeObj.getCheckedNodes();
         let normalSortKeys = [];
         for (let node of nodes) {
-            if (node.checked) {
-                let keyObj = {key: node.Key, order: node.Order};
-                normalSortKeys.push(keyObj);
-            }
+            let keyObj = {key: node.Key, order: node.Order};
+            normalSortKeys.push(keyObj);
         }
         preHandleObj.currentNode[JV.PROP_SORT_KEYS] = normalSortKeys;
     },
@@ -410,25 +506,182 @@ let preHandleSortObj = {
         if (sel) {
             sel.bind("change", function(){
                 treeNode.Order = sel[0].value;
+                preHandleSortObj.resetNormalSort();
             });
         }
     },
     extractTabFields: function (handleObj) {
-        //
+        let me = this, rst = {};
+        rst[JV.PROP_HANDLE_TYPE] = handleObj[JV.PROP_HANDLE_TYPE];
+        rst[JV.PROP_DATA_KEY] = handleObj[JV.PROP_DATA_KEY];
+        rst[JV.PROP_SORT_TYPE] = handleObj[JV.PROP_SORT_TYPE];
+        switch (sort_types.indexOf(handleObj[JV.PROP_SORT_TYPE])) {
+            case -1:
+                //unknown!
+                break;
+            case 0 :
+                //normal
+                rst[JV.PROP_SORT_KEYS] = handleObj[JV.PROP_SORT_KEYS];
+                break;
+            case 1 :
+                //tree
+                break;
+            case 2 :
+                //according to parent
+                break;
+            case 3 :
+                //self define
+                break;
+            default:
+                break;
+        }
+        return rst;
     }
 };
 
 let preHandleFilterObj = {
+    treeObj: null,
     copyNode: function (src, dest) {
-        //
+        let keys = [];
+        for (let filterItem of src[JV.PROP_FILTER_KEYS]) {
+            let item = {key: filterItem.key};
+            item[JV.PROP_FILTER_CONDITION] = filterItem[JV.PROP_FILTER_CONDITION];
+            item[JV.PROP_FILTER_COMPARE_VAL] = filterItem[JV.PROP_FILTER_COMPARE_VAL];
+            if (filterItem[JV.PROP_FILTER_COMPARE_OBJ]) {
+                item[JV.PROP_FILTER_COMPARE_OBJ] = filterItem[JV.PROP_FILTER_COMPARE_OBJ];
+                item[JV.PROP_FILTER_COMPARE_OBJ_KEY] = filterItem[JV.PROP_FILTER_COMPARE_OBJ_KEY];
+            }
+            keys.push(item);
+        }
+        dest[JV.PROP_FILTER_KEYS] = keys;
     },
     refresh_node: function () {
+        let me = this;
         $("#div_filter_type")[0].style.display = "";
         if (preHandleObj.currentNode) {
+            let idx = pre_handle_data_objects.indexOf(preHandleObj.currentNode[JV.PROP_DATA_KEY]);
+            me.treeObj = $.fn.zTree.init($("#pre_handle_filter_keys_reversed"), filterKeysSetting, exposed_properties_arr[idx]);
+            let nodes = me.treeObj.getNodes();
+            for (let filterItem of preHandleObj.currentNode[JV.PROP_FILTER_KEYS]) {
+                for (let keyNode of nodes) {
+                    if (filterItem.key === keyNode.Key) {
+                        me.treeObj.checkNode(keyNode, true, false, false);
+                        break;
+                    }
+                }
+            }
+        }
+    },
+    onCheck: function(event,treeId,treeNode) {
+        // let me = preHandleFilterObj;
+        // if (treeId.indexOf("parent_sorting_keys") >= 0) {
+        // } else if (treeId.indexOf("child_sorting_keys") >= 0) {
+        // } else {
+        //     me.resetFilter();
+        // }
+    },
+    resetFilter: function() {
+        let me = this;
+        let nodes = me.treeObj.getCheckedNodes();
+        let normalSortKeys = [];
+        for (let node of nodes) {
+            let keyObj = {key: node.Key};
+            keyObj[JV.PROP_FILTER_CONDITION] = node[JV.PROP_FILTER_CONDITION];
+            keyObj[JV.PROP_FILTER_COMPARE_VAL] = node[JV.PROP_FILTER_COMPARE_VAL];
+            if (node[JV.PROP_FILTER_COMPARE_OBJ]) {
+                keyObj[JV.PROP_FILTER_COMPARE_OBJ] = node[JV.PROP_FILTER_COMPARE_OBJ];
+                keyObj[JV.PROP_FILTER_COMPARE_OBJ_KEY] = node[JV.PROP_FILTER_COMPARE_OBJ_KEY];
+            }
+            normalSortKeys.push(keyObj);
+        }
+        preHandleObj.currentNode[JV.PROP_FILTER_KEYS] = normalSortKeys;
+    },
+    build_filter_handle_data_selection_str: function(treeId,treeNode) {
+        let rst = [];
+        rst.push("<select class='selDemo' id='diyDataSelect_" + treeNode.tId + "'>");
+        rst.push("<option value='empty'>无</option>");
+        for (let i = 0; i < pre_handle_data_objects.length; i++) {
+            rst.push("<option value='" + pre_handle_data_objects[i] + "'>" + pre_handle_data_objects_name[i] + "</option>");
+        }
+        rst.push("</select>");
+        return rst.join("");
+    },
+    build_filter_handle_data_detail_selection_str: function(treeId,treeNode) {
+        let rst = [];
+        rst.push("<select class='selDemo' id='diyDataDetailSelect_" + treeNode.tId + "'>");
+        rst.push("</select>");
+        return rst.join("");
+    },
+    addDiyDom: function(treeId,treeNode) {
+        let me = preHandleFilterObj;
+        let aObj = $("#" + treeNode.tId + IDMark_A);
+        let dataDtlSelStr = me.build_filter_handle_data_detail_selection_str(treeId,treeNode);
+        aObj.after(dataDtlSelStr);
+        let dataSelStr = me.build_filter_handle_data_selection_str(treeId,treeNode);
+        aObj.after(dataSelStr);
+        let editStr = "<input type='text' id='diyInput_" + treeNode.tId + "' width='10'/>";
+        aObj.after(editStr);
+        let selStr = "<select class='selDemo' id='diySelect_" + treeNode.tId + "'><option value='=='>等于</option><option value='==='>全等于</option><option value='>'>大于</option><option value='>='>大于等于</option><option value='<'>小于</option><option value='<='>小于等于</option><option value='!='>不等于</option></select>";
+        aObj.after(selStr);
+        let sel = $("#diySelect_" + treeNode.tId);
+        if (sel) {
+            sel.bind("change", me.filterConditionChange);
+        }
+        sel = $("#diyDataSelect_" + treeNode.tId);
+        if (sel) {
+            sel.bind("change", me.filterCompareObjChange);
+        }
+        sel = $("#diyDataDetailSelect_" + treeNode.tId);
+        if (sel) {
+            sel.bind("change", me.filterCompareObjKeyChange);
+        }
+    },
+    filterConditionChange: function(event) {
+        let me = preHandleFilterObj, sel = event.currentTarget, tId = sel.id.slice(10);
+        let node = me.treeObj.getNodeByTId(tId);
+        node[JV.PROP_FILTER_CONDITION] = sel.value;
+        me.resetFilter();
+    },
+    filterCompareObjChange: function(event) {
+        let me = preHandleFilterObj, sel = event.currentTarget, tId = sel.id.slice(14);
+        let node = me.treeObj.getNodeByTId(tId);
+        node[JV.PROP_FILTER_COMPARE_OBJ] = sel.value;
+        let idx = pre_handle_data_objects.indexOf(sel.value);
+        let dtlKey = "diyDataDetailSelect_" + tId;
+        let dtlSel = document.getElementById(dtlKey);
+        dtlSel.length = 0;
+        if (idx >= 0) {
+            let jdtlSel = $("#" + dtlKey);
+            for (let item of exposed_properties_arr[idx]) {
+                jdtlSel.append("<option value='" + item.Key + "'>" + item.Name + "</option>");
+            }
+        } else {
+            //清除所有key选项
+            node[JV.PROP_FILTER_COMPARE_OBJ_KEY] = null;
         }
+        me.resetFilter();
+    },
+    filterCompareObjKeyChange: function(event) {
+        let me = preHandleFilterObj, sel = event.currentTarget, tId = sel.id.slice(20);
+        let node = me.treeObj.getNodeByTId(tId);
+        node[JV.PROP_FILTER_COMPARE_OBJ_KEY] = sel.value;
+        me.resetFilter();
     },
     extractTabFields: function (handleObj) {
-        //
+        let me = this, rst = {};
+        rst[JV.PROP_HANDLE_TYPE] = handleObj[JV.PROP_HANDLE_TYPE];
+        rst[JV.PROP_DATA_KEY] = handleObj[JV.PROP_DATA_KEY];
+        rst[JV.PROP_FILTER_KEYS] = [];
+        for (let item of handleObj[JV.PROP_FILTER_KEYS]) {
+            let dtl = {};
+            dtl.key = item.key;
+            dtl[JV.PROP_FILTER_CONDITION] = item[JV.PROP_FILTER_CONDITION];
+            dtl[JV.PROP_FILTER_COMPARE_VAL] = item[JV.PROP_FILTER_COMPARE_VAL]?item[JV.PROP_FILTER_COMPARE_VAL]:null;
+            dtl[JV.PROP_FILTER_COMPARE_OBJ] = item[JV.PROP_FILTER_COMPARE_OBJ]?item[JV.PROP_FILTER_COMPARE_OBJ]:null;
+            dtl[JV.PROP_FILTER_COMPARE_OBJ_KEY] = item[JV.PROP_FILTER_COMPARE_OBJ_KEY]?item[JV.PROP_FILTER_COMPARE_OBJ_KEY]:null;
+            rst[JV.PROP_FILTER_KEYS].push(dtl);
+        }
+        return rst;
     }
 };
 
@@ -442,7 +695,9 @@ let preHandleSummaryObj = {
         }
     },
     extractTabFields: function (handleObj) {
+        let rst = {};
         //
+        return rst;
     }
 };
 
@@ -456,7 +711,9 @@ let preHandleAdjustObj = {
         }
     },
     extractTabFields: function (handleObj) {
+        let rst = {};
         //
+        return rst;
     }
 };
 
@@ -470,6 +727,8 @@ let preHandleAddDummyObj = {
         }
     },
     extractTabFields: function (handleObj) {
+        let rst = {};
         //
+        return rst;
     }
 };

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

@@ -2,7 +2,7 @@
     <div class="main-data">
         <div class="p-3">
             <div class="tab-bar">
-                <a onclick="preHandleObj.addNewNode()" class="btn btn-secondary btn-sm fa fa-plus-square">预处理环节</a>
+                <a onclick="preHandleObj.addNewNode('排序')" class="btn btn-secondary btn-sm fa fa-plus-square">预处理环节</a>
             </div>
             <div class="form-group row">
                 <div class="form-group col-md-7">

+ 6 - 0
web/maintain/report/rpt_tpl_detail_pre_handle_filter.html

@@ -1,2 +1,8 @@
 <div class="form-group row" id="div_filter_type">
+    <div class="form-group col-md-12">
+        <label>过滤键值集</label>
+        <div class="ztree-warp">
+            <ul id="pre_handle_filter_keys_reversed" class="ztree"></ul>
+        </div>
+    </div>
 </div>

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

@@ -16,6 +16,7 @@
 </div>
 <div class="form-group row" id="div_sort_type_normal">
     <div class="form-group col-md-7">
+        <label>排序键值集</label>
         <div class="ztree-warp">
             <ul id="pre_handle_sort_keys_reversed" class="ztree"></ul>
         </div>