浏览代码

过滤新场景(in / not in)

TonyKang 7 年之前
父节点
当前提交
37df1a8a7f

+ 87 - 12
modules/reports/util/rpt_construct_data_util.js

@@ -143,6 +143,36 @@ class Rpt_Data_Extractor {
         pri_setup_filter(JV.NODE_DETAIL_FIELDS);
         pri_setup_filter(JV.NODE_MASTER_FIELDS_EX);
         pri_setup_filter(JV.NODE_DETAIL_FIELDS_EX);
+        if (tpl[JV.NODE_MAP_DATA_HANDLE_INFO] && tpl[JV.NODE_MAP_DATA_HANDLE_INFO].length > 0) {
+            for (let preHandle of tpl[JV.NODE_MAP_DATA_HANDLE_INFO]) {
+                if (rst.indexOf(preHandle[JV.PROP_DATA_KEY]) < 0) {
+                    rst.push(preHandle[JV.PROP_DATA_KEY]);
+                }
+                if (preHandle[JV.PROP_HANDLE_TYPE] === JV.PROP_HANDLE_TYPE_FILTER) {
+                    if (preHandle[JV.PROP_FILTER_KEYS]) {
+                        for (let filter of preHandle[JV.PROP_FILTER_KEYS]) {
+                            if (filter[JV.PROP_FILTER_COMPARE_OBJ] && rst.indexOf(filter[JV.PROP_FILTER_COMPARE_OBJ]) < 0) {
+                                rst.push(filter[JV.PROP_FILTER_COMPARE_OBJ]);
+                            }
+                        }
+                    }
+                } else if (preHandle[JV.PROP_HANDLE_TYPE] === JV.PROP_HANDLE_TYPE_SUM) {
+                    if (preHandle[JV.PROP_SUM_GROUP_KEYS]) {
+                        for (let grpKey of preHandle[JV.PROP_SUM_GROUP_KEYS]) {
+                            if (grpKey.seeking_parent && rst.indexOf(grpKey.seeking_parent) < 0) {
+                                rst.push(grpKey.seeking_parent);
+                            }
+                        }
+                    }
+                } else if (preHandle[JV.PROP_PARENT_CHILD_SORT_KEY] && preHandle[JV.PROP_PARENT_CHILD_SORT_KEY].length > 0) {
+                    for (let item of preHandle[JV.PROP_PARENT_CHILD_SORT_KEY]) {
+                        if (rst.indexOf(item[JV.PROP_PARENT_DATA_KEY]) < 0) {
+                            rst.push(item[JV.PROP_PARENT_DATA_KEY]);
+                        }
+                    }
+                }
+            }
+        }
         if (rst.length === 0) {
             rst.push(projectConst.RATION_ASS);
         }
@@ -279,41 +309,69 @@ function filterData(sourceData, handleCfg, prjData) {
             tempRstArr.push(item);
         }
     }
-    let private_chkVal = function (src, dest, compStr) {
+    let private_chkVal = function (src, compVal, compStr) {
         let rst = true;
         switch (compStr) {
             case "==" :
-                rst = (src == dest);
+                rst = (src == compVal);
                 break;
             case "===" :
-                rst = (src === dest);
+                rst = (src === compVal);
                 break;
             case ">" :
-                rst = (src > dest);
+                rst = (src > compVal);
                 break;
             case ">=" :
-                rst = (src >= dest);
+                rst = (src >= compVal);
                 break;
             case "<" :
-                rst = (src < dest);
+                rst = (src < compVal);
                 break;
             case "<=" :
-                rst = (src <= dest);
+                rst = (src <= compVal);
                 break;
             case "!=" :
-                rst = (src != dest);
+                rst = (src != compVal);
                 break;
             case "!==" :
-                rst = (src !== dest);
+                rst = (src !== compVal);
+                break;
+            case "in" :
+                if (compVal instanceof Array) {
+                    rst = compVal.indexOf(src) >= 0;
+                } else {
+                    //string,需要转类型
+                    let newCv = JSON.parse(compVal);
+                    if (newCv instanceof Array) {
+                        rst = newCv.indexOf(src) >= 0;
+                    } else {
+                        rst = false;
+                    }
+                }
+                break;
+            case "not in":
+                if (compVal instanceof Array) {
+                    rst = compVal.indexOf(src) < 0;
+                } else {
+                    //string,需要转类型
+                    let newCv = JSON.parse(compVal);
+                    if (newCv instanceof Array) {
+                        rst = newCv.indexOf(src) < 0;
+                    } else {
+                        rst = true;
+                    }
+                }
                 break;
             default:
                 rst = true;
         }
         return rst;
     };
+    let compareObj = {};
     for (let item of tempRstArr) {
         let compRst = true;
         let curComparePrjData = null;
+        let startIdx = 0;
         for (let cfg of handleCfg[JV.PROP_FILTER_KEYS]) {
             if (cfg[JV.PROP_FILTER_COMPARE_VAL]) {
                 //比较key值
@@ -323,11 +381,28 @@ function filterData(sourceData, handleCfg, prjData) {
                 if (!curComparePrjData) {
                     curComparePrjData = getModuleDataByKey(prjData, cfg[JV.PROP_FILTER_COMPARE_OBJ]);
                 }
-                for (let data of curComparePrjData.data) {
-                    compRst = private_chkVal(item[cfg.key], data[cfg[JV.PROP_FILTER_COMPARE_OBJ_KEY]], cfg[JV.PROP_FILTER_CONDITION]);
-                    if (compRst) break;
+                if (cfg[JV.PROP_FILTER_CONDITION] === "in" || cfg[JV.PROP_FILTER_CONDITION] === "not in") {
+                    let compareArr = null;
+                    if (!compareObj.hasOwnProperty(cfg[JV.PROP_FILTER_COMPARE_OBJ_KEY] + startIdx.toString())) {
+                        compareObj[cfg[JV.PROP_FILTER_COMPARE_OBJ_KEY] + startIdx.toString()] = [];
+                        compareArr = compareObj[cfg[JV.PROP_FILTER_COMPARE_OBJ_KEY] + startIdx.toString()];
+                        for (let data of curComparePrjData.data) {
+                            if (compareArr.indexOf(data[cfg[JV.PROP_FILTER_COMPARE_OBJ_KEY]]) < 0) {
+                                compareArr.push(data[cfg[JV.PROP_FILTER_COMPARE_OBJ_KEY]]);
+                            }
+                        }
+                    } else {
+                        compareArr = compareObj[cfg[JV.PROP_FILTER_COMPARE_OBJ_KEY] + startIdx.toString()];
+                    }
+                    compRst = private_chkVal(item[cfg.key], compareArr, cfg[JV.PROP_FILTER_CONDITION]);
+                } else {
+                    for (let data of curComparePrjData.data) {
+                        compRst = private_chkVal(item[cfg.key], data[cfg[JV.PROP_FILTER_COMPARE_OBJ_KEY]], cfg[JV.PROP_FILTER_CONDITION]);
+                        if (compRst) break;
+                    }
                 }
             }
+            startIdx++;
         }
         if (compRst) {
             rstArr.push(item);

+ 38 - 10
web/maintain/report/js/rpt_tpl_pre_handle.js

@@ -3,6 +3,7 @@
  */
 
 const sort_types = ["normal", "tree", "accord_to_parent", "self_define"];
+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 = [
@@ -284,7 +285,7 @@ let preHandleObj = {
         } else if (dom.selectedIndex === 0) {
             $("#div_sort_type_normal")[0].style.display = "";
         }
-
+        me.currentNode[JV.PROP_SORT_TYPE] = dom.value;
     },
     onBeforeDrop: function(treeId, treeNodes, targetNode, moveType){
         //
@@ -566,6 +567,30 @@ let preHandleFilterObj = {
                 for (let keyNode of nodes) {
                     if (filterItem.key === keyNode.Key) {
                         me.treeObj.checkNode(keyNode, true, false, false);
+                        //and then others...
+                        //过滤条件
+                        keyNode[JV.PROP_FILTER_CONDITION] = filterItem[JV.PROP_FILTER_CONDITION];
+                        $("#diySelect_" + keyNode.tId)[0].selectedIndex = condition_types.indexOf(filterItem[JV.PROP_FILTER_CONDITION]);
+                        //条件值
+                        keyNode[JV.PROP_FILTER_COMPARE_VAL] = filterItem[JV.PROP_FILTER_COMPARE_VAL];
+                        $("#diyInput_" + keyNode.tId)[0].selectedIndex = filterItem[JV.PROP_FILTER_COMPARE_VAL];
+                        //其他关联业务数据对象
+                        if (filterItem[JV.PROP_FILTER_COMPARE_OBJ]) {
+                            let cmpObjDom = $("#diyDataSelect_" + keyNode.tId)[0];
+                            keyNode[JV.PROP_FILTER_COMPARE_OBJ] = filterItem[JV.PROP_FILTER_COMPARE_OBJ];
+                            let idx = pre_handle_data_objects.indexOf(filterItem[JV.PROP_FILTER_COMPARE_OBJ]);
+                            cmpObjDom.selectedIndex = idx + 1;
+                            me.private_setup_compare_obj(cmpObjDom);
+                            let cmpObjIdDom = $("#diyDataDetailSelect_" + keyNode.tId)[0];
+                            for (let i = 0; i < cmpObjIdDom.children.length; i++) {
+                                let option = cmpObjIdDom.children[i];
+                                if (option.value === filterItem[JV.PROP_FILTER_COMPARE_OBJ_KEY]) {
+                                    keyNode[JV.PROP_FILTER_COMPARE_OBJ_KEY] = filterItem[JV.PROP_FILTER_COMPARE_OBJ_KEY]
+                                    cmpObjIdDom.selectedIndex = i;
+                                    break;
+                                }
+                            }
+                        }
                         break;
                     }
                 }
@@ -573,12 +598,8 @@ let preHandleFilterObj = {
         }
     },
     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();
-        // }
+        let me = preHandleFilterObj;
+        me.resetFilter();
     },
     resetFilter: function() {
         let me = this;
@@ -586,6 +607,9 @@ let preHandleFilterObj = {
         let normalSortKeys = [];
         for (let node of nodes) {
             let keyObj = {key: node.Key};
+            if (!node[JV.PROP_FILTER_CONDITION]) {
+                node[JV.PROP_FILTER_CONDITION] = "==";
+            }
             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]) {
@@ -621,7 +645,7 @@ let preHandleFilterObj = {
         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>";
+        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><option value='in'>在</option><option value='not in'>不在</option></select>";
         aObj.after(selStr);
         let sel = $("#diySelect_" + treeNode.tId);
         if (sel) {
@@ -642,8 +666,8 @@ let preHandleFilterObj = {
         node[JV.PROP_FILTER_CONDITION] = sel.value;
         me.resetFilter();
     },
-    filterCompareObjChange: function(event) {
-        let me = preHandleFilterObj, sel = event.currentTarget, tId = sel.id.slice(14);
+    private_setup_compare_obj: function(dom) {
+        let me = this, sel = dom, 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);
@@ -659,6 +683,10 @@ let preHandleFilterObj = {
             //清除所有key选项
             node[JV.PROP_FILTER_COMPARE_OBJ_KEY] = null;
         }
+    },
+    filterCompareObjChange: function(event) {
+        let me = preHandleFilterObj, sel = event.currentTarget;
+        me.private_setup_compare_obj(sel);
         me.resetFilter();
     },
     filterCompareObjKeyChange: function(event) {

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

@@ -1,6 +1,6 @@
 <div class="form-group row" id="div_sort_type">
     <div class="input-group col-5">
-        <div class="input-group-addon">排序类型</div>
+        <div class="input-group-addon">排序方式</div>
         <select class="form-control input-sm" id="select_sort_types" onchange="preHandleObj.onSortTypeChange(this)">
             <option value="normal">普通</option>
             <option value="tree">树结构</option>