|  | @@ -141,34 +141,38 @@ let preHandleObj = {
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |      },
 | 
	
		
			
				|  |  | -    addNewNode: function(nodeType) {
 | 
	
		
			
				|  |  | -        let me = this, item = null, preHandleType = nodeType;
 | 
	
		
			
				|  |  | +    createNewNode: function (nodeType) {
 | 
	
		
			
				|  |  | +        let rst = 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", "排序键值集":[]};
 | 
	
		
			
				|  |  | +                rst = {Name: "预处理环节", Title: "", "映射数据对象": "bills", "预处理类型": preHandleType, "排序方式": "normal", "排序键值集":[]};
 | 
	
		
			
				|  |  |                  break;
 | 
	
		
			
				|  |  |              case JV.PROP_HANDLE_TYPE_FILTER:
 | 
	
		
			
				|  |  | -                item = {Name: "预处理环节", Title: "", "映射数据对象": "bills", "预处理类型": preHandleType, "过滤键值集": []};
 | 
	
		
			
				|  |  | +                rst = {Name: "预处理环节", Title: "", "映射数据对象": "bills", "预处理类型": preHandleType, "过滤键值集": []};
 | 
	
		
			
				|  |  |                  break;
 | 
	
		
			
				|  |  |              case JV.PROP_HANDLE_TYPE_BILLS_DATA_MOVE:
 | 
	
		
			
				|  |  | -                item = {Name: "预处理环节", Title: "", "映射数据对象": "ration", "预处理类型": preHandleType};
 | 
	
		
			
				|  |  | +                rst = {Name: "预处理环节", Title: "", "映射数据对象": "ration", "预处理类型": preHandleType};
 | 
	
		
			
				|  |  |                  break;
 | 
	
		
			
				|  |  |              case JV.PROP_HANDLE_TYPE_SUM:
 | 
	
		
			
				|  |  | -                item = {Name: "预处理环节", Title: "", "映射数据对象": "bills", "预处理类型": preHandleType, "分组键值集": [], "统计键值集":[]};
 | 
	
		
			
				|  |  | +                rst = {Name: "预处理环节", Title: "", "映射数据对象": "bills", "预处理类型": preHandleType, "分组键值集": [], "统计键值集":[]};
 | 
	
		
			
				|  |  |                  break;
 | 
	
		
			
				|  |  |              case JV.PROP_HANDLE_TYPE_ADJUST:
 | 
	
		
			
				|  |  | -                item = {Name: "预处理环节", Title: "", "映射数据对象": "bills", "预处理类型": preHandleType, "数据调整集":[]};
 | 
	
		
			
				|  |  | +                rst = {Name: "预处理环节", Title: "", "映射数据对象": "bills", "预处理类型": preHandleType, "数据调整集":[]};
 | 
	
		
			
				|  |  |                  break;
 | 
	
		
			
				|  |  |              case JV.PROP_HANDLE_TYPE_ADD_DUMMY:
 | 
	
		
			
				|  |  | -                item = {Name: "预处理环节", Title: "", "映射数据对象": "bills", "预处理类型": preHandleType, "Dummy数据集":[]};
 | 
	
		
			
				|  |  | +                rst = {Name: "预处理环节", Title: "", "映射数据对象": "bills", "预处理类型": preHandleType, "Dummy数据集":[]};
 | 
	
		
			
				|  |  |                  break;
 | 
	
		
			
				|  |  |              default:
 | 
	
		
			
				|  |  | -                item = {Name: "预处理环节", Title: "", "映射数据对象": "bills", "预处理类型": "排序", "排序方式": "normal", "排序键值集":[]};
 | 
	
		
			
				|  |  | +                rst = {Name: "预处理环节", Title: "", "映射数据对象": "bills", "预处理类型": "排序", "排序方式": "normal", "排序键值集":[]};
 | 
	
		
			
				|  |  |                  break;
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  | +        return rst;
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    addNewNode: function(nodeType) {
 | 
	
		
			
				|  |  | +        let me = this, item = me.createNewNode(nodeType);
 | 
	
		
			
				|  |  |          me.private_set_title(item);
 | 
	
		
			
				|  |  |          me.treeObj.addNodes(null, -1, [item], true);
 | 
	
		
			
				|  |  |      },
 | 
	
	
		
			
				|  | @@ -323,6 +327,44 @@ let preHandleObj = {
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |          return rst;
 | 
	
		
			
				|  |  |      },
 | 
	
		
			
				|  |  | +    addHoverDom: function(treeId, treeNode) {
 | 
	
		
			
				|  |  | +        let me = preHandleObj, sObj = $("#" + treeNode.tId + "_span");
 | 
	
		
			
				|  |  | +        if (treeNode.level > 0 || $("#addBtn_"+treeNode.tId).length > 0) return;
 | 
	
		
			
				|  |  | +        if (treeNode[JV.PROP_HANDLE_TYPE] === JV.PROP_HANDLE_TYPE_SORT && treeNode[JV.PROP_SORT_TYPE] === "accord_to_parent") {
 | 
	
		
			
				|  |  | +            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 newSubNodes = [];
 | 
	
		
			
				|  |  | +                let newNode = me.createNewNode(treeNode[JV.PROP_HANDLE_TYPE]);
 | 
	
		
			
				|  |  | +                newNode.Name = "子排序";
 | 
	
		
			
				|  |  | +                newNode[JV.PROP_DATA_KEY] = treeNode[JV.PROP_DATA_KEY];
 | 
	
		
			
				|  |  | +                me.private_set_title(newNode);
 | 
	
		
			
				|  |  | +                newSubNodes.push(newNode);
 | 
	
		
			
				|  |  | +                treeNode.isParent = true;
 | 
	
		
			
				|  |  | +                me.treeObj.addNodes(treeNode, -1, newSubNodes, true);
 | 
	
		
			
				|  |  | +                me.treeObj.expandNode(treeNode, true, false);
 | 
	
		
			
				|  |  | +            });
 | 
	
		
			
				|  |  | +        } else if (treeNode[JV.PROP_HANDLE_TYPE] === JV.PROP_HANDLE_TYPE_FILTER) {
 | 
	
		
			
				|  |  | +            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 newSubNodes = [];
 | 
	
		
			
				|  |  | +                let newNode = me.createNewNode(treeNode[JV.PROP_HANDLE_TYPE]);
 | 
	
		
			
				|  |  | +                newNode.Name = "子过滤";
 | 
	
		
			
				|  |  | +                newNode[JV.PROP_DATA_KEY] = treeNode[JV.PROP_DATA_KEY];
 | 
	
		
			
				|  |  | +                me.private_set_title(newNode);
 | 
	
		
			
				|  |  | +                newSubNodes.push(newNode);
 | 
	
		
			
				|  |  | +                treeNode.isParent = true;
 | 
	
		
			
				|  |  | +                me.treeObj.addNodes(treeNode, -1, newSubNodes, true);
 | 
	
		
			
				|  |  | +                me.treeObj.expandNode(treeNode, true, false);
 | 
	
		
			
				|  |  | +            });
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    removeHoverDom: function (treeId, treeNode) {
 | 
	
		
			
				|  |  | +        $("#addBtn_"+treeNode.tId).unbind().remove();
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  |      extractTabFields: function (rptTpl) {
 | 
	
		
			
				|  |  |          let me = this, nodes = me.treeObj.getNodes();
 | 
	
		
			
				|  |  |          let rst = [];
 | 
	
	
		
			
				|  | @@ -360,6 +402,7 @@ let preHandleSortObj = {
 | 
	
		
			
				|  |  |      topBillsTreeObj: null,
 | 
	
		
			
				|  |  |      otherBillsTreeObj: null,
 | 
	
		
			
				|  |  |      copyNode: function (src, dest) {
 | 
	
		
			
				|  |  | +        let me = preHandleSortObj;
 | 
	
		
			
				|  |  |          dest[JV.PROP_SORT_TYPE] = src[JV.PROP_SORT_TYPE];
 | 
	
		
			
				|  |  |          switch (sort_types.indexOf(src[JV.PROP_SORT_TYPE])) {
 | 
	
		
			
				|  |  |              case -1:
 | 
	
	
		
			
				|  | @@ -390,7 +433,6 @@ let preHandleSortObj = {
 | 
	
		
			
				|  |  |              case 2 :
 | 
	
		
			
				|  |  |                  //according to parent
 | 
	
		
			
				|  |  |                  dest[JV.PROP_PARENT_CHILD_SORT_KEY] = {};
 | 
	
		
			
				|  |  | -                dest[JV.PROP_OTHER_SUB_SORT] = [];
 | 
	
		
			
				|  |  |                  dest[JV.PROP_PARENT_CHILD_SORT_KEY][JV.PROP_PARENT_DATA_KEY] = src[JV.PROP_PARENT_CHILD_SORT_KEY][JV.PROP_PARENT_DATA_KEY];
 | 
	
		
			
				|  |  |                  dest[JV.PROP_PARENT_CHILD_SORT_KEY][JV.PROP_PARENT_SORT_KEYS] = [];
 | 
	
		
			
				|  |  |                  for (let item of src[JV.PROP_PARENT_CHILD_SORT_KEY][JV.PROP_PARENT_SORT_KEYS]) {
 | 
	
	
		
			
				|  | @@ -400,19 +442,14 @@ 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);
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  | +                dest[JV.PROP_OTHER_SUB_SORT] = [];
 | 
	
		
			
				|  |  |                  if (src[JV.PROP_OTHER_SUB_SORT] !== null && src[JV.PROP_OTHER_SUB_SORT] !== undefined) {
 | 
	
		
			
				|  |  | +                    dest.items = [];
 | 
	
		
			
				|  |  |                      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 {
 | 
	
		
			
				|  |  | -                            //其他暂时不实现,目前没那么复杂
 | 
	
		
			
				|  |  | -                        }
 | 
	
		
			
				|  |  | +                        let destSubSort = {Name: "子排序"};
 | 
	
		
			
				|  |  | +                        me.copyNode(subSort, destSubSort);
 | 
	
		
			
				|  |  | +                        destSubSort[JV.PROP_DATA_KEY] = src[JV.PROP_DATA_KEY];
 | 
	
		
			
				|  |  | +                        dest.items.push(destSubSort);
 | 
	
		
			
				|  |  |                      }
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  |                  break;
 | 
	
	
		
			
				|  | @@ -639,6 +676,17 @@ let preHandleSortObj = {
 | 
	
		
			
				|  |  |              case 2 :
 | 
	
		
			
				|  |  |                  //according to parent
 | 
	
		
			
				|  |  |                  rst[JV.PROP_PARENT_CHILD_SORT_KEY] = handleObj[JV.PROP_PARENT_CHILD_SORT_KEY];
 | 
	
		
			
				|  |  | +                rst[JV.PROP_OTHER_SUB_SORT] = [];
 | 
	
		
			
				|  |  | +                if (handleObj.items && handleObj.items.length > 0) {
 | 
	
		
			
				|  |  | +                    for (let subSort of handleObj.items) {
 | 
	
		
			
				|  |  | +                        let dtlRst = {};
 | 
	
		
			
				|  |  | +                        me.copyNode(subSort, dtlRst);
 | 
	
		
			
				|  |  | +                        delete dtlRst.Name;
 | 
	
		
			
				|  |  | +                        delete dtlRst.PROP_DATA_KEY;
 | 
	
		
			
				|  |  | +                        rst[JV.PROP_OTHER_SUB_SORT].push(dtlRst);
 | 
	
		
			
				|  |  | +                        dtlRst = null;
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  |                  break;
 | 
	
		
			
				|  |  |              case 3 :
 | 
	
		
			
				|  |  |                  //self define
 | 
	
	
		
			
				|  | @@ -653,7 +701,7 @@ let preHandleSortObj = {
 | 
	
		
			
				|  |  |  let preHandleFilterObj = {
 | 
	
		
			
				|  |  |      treeObj: null,
 | 
	
		
			
				|  |  |      copyNode: function (src, dest) {
 | 
	
		
			
				|  |  | -        let keys = [];
 | 
	
		
			
				|  |  | +        let me = preHandleFilterObj, 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];
 | 
	
	
		
			
				|  | @@ -664,7 +712,20 @@ let preHandleFilterObj = {
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |              keys.push(item);
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  | +        dest[JV.PROP_HANDLE_TYPE] = src[JV.PROP_HANDLE_TYPE];
 | 
	
		
			
				|  |  | +        dest[JV.PROP_DATA_KEY] = src[JV.PROP_DATA_KEY];
 | 
	
		
			
				|  |  |          dest[JV.PROP_FILTER_KEYS] = keys;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        if (src[JV.PROP_OTHER_SUB_FILTER] && src[JV.PROP_OTHER_SUB_FILTER].length > 0) {
 | 
	
		
			
				|  |  | +            dest.items = [];
 | 
	
		
			
				|  |  | +            for (let subFilter of src[JV.PROP_OTHER_SUB_FILTER]) {
 | 
	
		
			
				|  |  | +                let dtlRst = {Name: "子过滤"};
 | 
	
		
			
				|  |  | +                me.copyNode(subFilter, dtlRst);
 | 
	
		
			
				|  |  | +                dtlRst[JV.PROP_HANDLE_TYPE] = src[JV.PROP_HANDLE_TYPE];
 | 
	
		
			
				|  |  | +                dtlRst[JV.PROP_DATA_KEY] = src[JV.PROP_DATA_KEY];
 | 
	
		
			
				|  |  | +                dest.items.push(dtlRst);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  |      },
 | 
	
		
			
				|  |  |      refresh_node: function () {
 | 
	
		
			
				|  |  |          let me = this;
 | 
	
	
		
			
				|  | @@ -816,18 +877,21 @@ let preHandleFilterObj = {
 | 
	
		
			
				|  |  |          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);
 | 
	
		
			
				|  |  | +        let me = preHandleFilterObj, 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] = [];
 | 
	
		
			
				|  |  | +        me.copyNode(handleObj, rst);
 | 
	
		
			
				|  |  | +        rst[JV.PROP_OTHER_SUB_FILTER] = [];
 | 
	
		
			
				|  |  | +        if (handleObj.items && handleObj.items.length > 0) {
 | 
	
		
			
				|  |  | +            for (let subFilter of handleObj.items) {
 | 
	
		
			
				|  |  | +                let dtlRst = {};
 | 
	
		
			
				|  |  | +                me.copyNode(subFilter, dtlRst);
 | 
	
		
			
				|  |  | +                delete dtlRst.Name;
 | 
	
		
			
				|  |  | +                delete dtlRst[JV.PROP_DATA_KEY];
 | 
	
		
			
				|  |  | +                rst[JV.PROP_OTHER_SUB_FILTER].push(dtlRst);
 | 
	
		
			
				|  |  | +                dtlRst = null;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |          return rst;
 | 
	
		
			
				|  |  |      }
 |