浏览代码

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

zhongzewei 7 年之前
父节点
当前提交
f55a49fbcc

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

@@ -107,10 +107,16 @@ JpcFlowTabSrv.prototype.createNew = function(){
                     if (couldBreak) break;
                     if (couldBreak) break;
                 } else {
                 } else {
                     //备注: 在有group的情况下,如果grpPageInfo[JV.PROP_SEG_GRP_IDX] 范围大于 grpSequenceInfo.length,则表示已经到最后了,不要再加空白数据了
                     //备注: 在有group的情况下,如果grpPageInfo[JV.PROP_SEG_GRP_IDX] 范围大于 grpSequenceInfo.length,则表示已经到最后了,不要再加空白数据了
+                    //      !!!但这是在有ex数据的情况下!!!
                     if (grpPageInfo[JV.PROP_SEG_GRP_IDX] < grpSequenceInfo.length) {
                     if (grpPageInfo[JV.PROP_SEG_GRP_IDX] < grpSequenceInfo.length) {
                         if (private_normal_add_rec(vi)) break;
                         if (private_normal_add_rec(vi)) break;
                     } else {
                     } else {
-                        break;
+                        //还得判断是否是普通的流水数据情况,这里可以用isFollow来进行判断,暂时不需要特意加新参数(以后如isFollow的意义有变化则需要调整)
+                        if (!isFollow) {
+                            if (private_normal_add_rec(vi)) break;
+                        } else {
+                            break;
+                        }
                     }
                     }
                 }
                 }
             } else {
             } else {
@@ -197,7 +203,7 @@ JpcFlowTabSrv.prototype.createNew = function(){
                 }
                 }
                 let sumV = 0;
                 let sumV = 0;
                 for (let si = preGrpIdx; si <= nexGrpIdx; si++) {
                 for (let si = preGrpIdx; si <= nexGrpIdx; si++) {
-                    sumV += JpcFieldHelper.getValue(data_field, segDataIdx[si]);
+                    sumV += parseFloat(JpcFieldHelper.getValue(data_field, segDataIdx[si]));
                 }
                 }
                 // me.group_sum_values[segIdx][j].push(sumV);
                 // me.group_sum_values[segIdx][j].push(sumV);
                 me.group_sum_values[segIdx][me.group_sum_fields[j][JV.PROP_SUM_KEY]].push(sumV);
                 me.group_sum_values[segIdx][me.group_sum_fields[j][JV.PROP_SUM_KEY]].push(sumV);
@@ -587,7 +593,7 @@ JpcFlowTabSrv.prototype.createNew = function(){
                             }
                             }
                             //add page info
                             //add page info
                             pageStatus[JV.STATUS_SEGMENT_END] = true;
                             pageStatus[JV.STATUS_SEGMENT_END] = true;
-                            pageStatus[JV.STATUS_REPORT_END] = true;
+                            pageStatus[JV.STATUS_REPORT_END] = (segIdx === me.segments.length - 1);
                             private_addPage(segIdx, grpSeqInfo, false, false, -1);
                             private_addPage(segIdx, grpSeqInfo, false, false, -1);
                         } else {
                         } else {
                             private_addPage(segIdx, grpSeqInfo, false, false, -1);
                             private_addPage(segIdx, grpSeqInfo, false, false, -1);

+ 136 - 62
modules/reports/util/rpt_construct_data_util.js

@@ -12,6 +12,8 @@ let stringUtil = require("../../../public/stringUtil");
 let treeUtil = require('../../../public/treeUtil');
 let treeUtil = require('../../../public/treeUtil');
 let projectConst = consts.projectConst;
 let projectConst = consts.projectConst;
 let projectConstList = consts.projectConstList;
 let projectConstList = consts.projectConstList;
+const gljUtil = require('../../../public/gljUtil');
+
 
 
 const GLJ_TYPE = {
 const GLJ_TYPE = {
     Labour: 1,
     Labour: 1,
@@ -134,11 +136,25 @@ class Rpt_Data_Extractor {
                             if (key === projectConst.RATION_GLJ && (rst.indexOf(projectConst.PROJECTGLJ) < 0)) {
                             if (key === projectConst.RATION_GLJ && (rst.indexOf(projectConst.PROJECTGLJ) < 0)) {
                                 rst.push(projectConst.PROJECTGLJ);
                                 rst.push(projectConst.PROJECTGLJ);
                             }
                             }
-                            if (key === projectConst.PROJECTGLJ && (rst.indexOf(projectConst.RATION_GLJ) < 0)) {
-                                rst.push(projectConst.RATION_GLJ);
+                            if (key === projectConst.PROJECTGLJ) {
+                                if (rst.indexOf(projectConst.RATION_GLJ) < 0) rst.push(projectConst.RATION_GLJ);
+                                if (field[JV.PROP_FIELD_EXP_MAP].indexOf("'quantity'") > 0 ||
+                                    field[JV.PROP_FIELD_EXP_MAP].indexOf("'subdivisionQuantity'") > 0 ||
+                                    field[JV.PROP_FIELD_EXP_MAP].indexOf("'techQuantity'") > 0 ) {
+                                    if (rst.indexOf(projectConst.RATION) < 0) rst.push(projectConst.RATION);
+                                    if (rst.indexOf(projectConst.BILLS) < 0) rst.push(projectConst.BILLS);
+                                }
                             }
                             }
                         }
                         }
                     }
                     }
+                } else if (key === projectConst.PROJECTGLJ) {
+                    if (rst.indexOf(projectConst.RATION_GLJ) < 0) rst.push(projectConst.RATION_GLJ);
+                    if (field[JV.PROP_FIELD_EXP_MAP].indexOf("'quantity'") > 0 ||
+                        field[JV.PROP_FIELD_EXP_MAP].indexOf("'subdivisionQuantity'") > 0 ||
+                        field[JV.PROP_FIELD_EXP_MAP].indexOf("'techQuantity'") > 0 ) {
+                        if (rst.indexOf(projectConst.RATION) < 0) rst.push(projectConst.RATION);
+                        if (rst.indexOf(projectConst.BILLS) < 0) rst.push(projectConst.BILLS);
+                    }
                 }
                 }
             }
             }
         };
         };
@@ -202,6 +218,14 @@ class Rpt_Data_Extractor {
         for (let item of rawDataObj.prjData) {
         for (let item of rawDataObj.prjData) {
             setupFunc($PROJECT.DETAIL, item.moduleName, item);
             setupFunc($PROJECT.DETAIL, item.moduleName, item);
         }
         }
+        let projectGLJDatas = getModuleDataByKey(rawDataObj.prjData, "projectGLJ");
+        let rationGLJDatas = getModuleDataByKey(rawDataObj.prjData, "ration_glj");
+        let rationDatas = getModuleDataByKey(rawDataObj.prjData, "ration");
+        let billsDatas = getModuleDataByKey(rawDataObj.prjData, "bills");
+        if (projectGLJDatas && rationGLJDatas && rationDatas && billsDatas) {
+            gljUtil.calcProjectGLJQuantity(projectGLJDatas.data, rationGLJDatas.data, rationDatas.data, billsDatas.data, 4);
+        }
+
         if (tpl[JV.NODE_MAP_DATA_HANDLE_INFO]) {
         if (tpl[JV.NODE_MAP_DATA_HANDLE_INFO]) {
             for (let preHandle of 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]);
                 let srcData = getModuleDataByKey(rawDataObj.prjData, preHandle[JV.PROP_DATA_KEY]);
@@ -292,7 +316,7 @@ function getModuleDataByKey(prjData, key) {
 function summaryData(sourceData, handleCfg, prjData){
 function summaryData(sourceData, handleCfg, prjData){
     let rstArr = [], tempRstArr = [];
     let rstArr = [], tempRstArr = [];
     let curParentPrjData = {};
     let curParentPrjData = {};
-    for (let item of sourceData.data) {
+    for (let item of getActDataArr(sourceData)) {
         if (item._doc) {
         if (item._doc) {
             tempRstArr.push(item._doc);
             tempRstArr.push(item._doc);
         } else {
         } else {
@@ -368,14 +392,13 @@ function summaryData(sourceData, handleCfg, prjData){
             }
             }
         }
         }
     }
     }
-    delete sourceData.data;
-    sourceData.data = rstArr;
+    replaceActDataArr(sourceData, rstArr);
     // fsUtil.writeObjToFile(sourceData.data, "D:/GitHome/ConstructionCost/tmp/sumRst.jsp");
     // fsUtil.writeObjToFile(sourceData.data, "D:/GitHome/ConstructionCost/tmp/sumRst.jsp");
 }
 }
 
 
 function filterData(sourceData, handleCfg, prjData) {
 function filterData(sourceData, handleCfg, prjData) {
     let rstArr = [], tempRstArr = [];
     let rstArr = [], tempRstArr = [];
-    for (let item of sourceData.data) {
+    for (let item of getActDataArr(sourceData)) {
         if (item._doc) {
         if (item._doc) {
             tempRstArr.push(item._doc);
             tempRstArr.push(item._doc);
         } else {
         } else {
@@ -414,9 +437,9 @@ function filterData(sourceData, handleCfg, prjData) {
                     rst = compVal.indexOf(src) >= 0;
                     rst = compVal.indexOf(src) >= 0;
                 } else {
                 } else {
                     //string,需要转类型
                     //string,需要转类型
-                    let newCv = JSON.parse(compVal);
-                    if (newCv instanceof Array) {
-                        rst = newCv.indexOf(src) >= 0;
+                    let newInCv = JSON.parse(compVal);
+                    if (newInCv instanceof Array) {
+                        rst = newInCv.indexOf(src) >= 0;
                     } else {
                     } else {
                         rst = false;
                         rst = false;
                     }
                     }
@@ -427,9 +450,9 @@ function filterData(sourceData, handleCfg, prjData) {
                     rst = compVal.indexOf(src) < 0;
                     rst = compVal.indexOf(src) < 0;
                 } else {
                 } else {
                     //string,需要转类型
                     //string,需要转类型
-                    let newCv = JSON.parse(compVal);
-                    if (newCv instanceof Array) {
-                        rst = newCv.indexOf(src) < 0;
+                    let newNotInCv = JSON.parse(compVal);
+                    if (newNotInCv instanceof Array) {
+                        rst = (newNotInCv.indexOf(src) < 0);
                     } else {
                     } else {
                         rst = true;
                         rst = true;
                     }
                     }
@@ -442,12 +465,25 @@ function filterData(sourceData, handleCfg, prjData) {
     };
     };
     let private_chkArrVal = function(arr, key, compVal, compStr){
     let private_chkArrVal = function(arr, key, compVal, compStr){
         let rst = false;
         let rst = false;
-        for (let arrItem of arr) {
-            if (arrItem[key]) {
-                rst = private_chkVal(arrItem[key], compVal, compStr);
+        if (arr.length > 0) {
+            for (let arrItem of arr) {
+                if (arrItem[key]) {
+                    rst = private_chkVal(arrItem[key], compVal, compStr);
+                }
+                if (rst) {
+                    break;
+                }
             }
             }
-            if (rst) {
-                break;
+        } else {
+            //在某些判断条件下(含有'非'判断),如arr没有数组项,默认结果反而是true
+            switch (compStr) {
+                case "!=" :
+                case "!==" :
+                case "not in":
+                    rst = true;
+                    break;
+                default:
+                    break;
             }
             }
         }
         }
         return rst;
         return rst;
@@ -462,11 +498,7 @@ function filterData(sourceData, handleCfg, prjData) {
             curComparePrjData = getModuleDataByKey(prjData, targetDataKey);
             curComparePrjData = getModuleDataByKey(prjData, targetDataKey);
             try {
             try {
                 if (curComparePrjData !== null) {
                 if (curComparePrjData !== null) {
-                    if (targetDataKey === "projectGLJ") {
-                        objDataArr = curComparePrjData.data.gljList;
-                    } else {
-                        objDataArr = curComparePrjData.data;
-                    }
+                    objDataArr = getActDataArr(curComparePrjData);
                     for (let dtl of objDataArr) {
                     for (let dtl of objDataArr) {
                         if (item[refKey] === dtl[targetPropertyKey]) {
                         if (item[refKey] === dtl[targetPropertyKey]) {
                             rst = dtl;
                             rst = dtl;
@@ -523,7 +555,7 @@ function filterData(sourceData, handleCfg, prjData) {
                     if (!compareObj.hasOwnProperty(cfg[JV.PROP_FILTER_COMPARE_OBJ_KEY] + startIdx.toString())) {
                     if (!compareObj.hasOwnProperty(cfg[JV.PROP_FILTER_COMPARE_OBJ_KEY] + startIdx.toString())) {
                         compareObj[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()];
                         compareArr = compareObj[cfg[JV.PROP_FILTER_COMPARE_OBJ_KEY] + startIdx.toString()];
-                        for (let data of curComparePrjData.data) {
+                        for (let data of getActDataArr(curComparePrjData)) {
                             if (compareArr.indexOf(data[cfg[JV.PROP_FILTER_COMPARE_OBJ_KEY]]) < 0) {
                             if (compareArr.indexOf(data[cfg[JV.PROP_FILTER_COMPARE_OBJ_KEY]]) < 0) {
                                 compareArr.push(data[cfg[JV.PROP_FILTER_COMPARE_OBJ_KEY]]);
                                 compareArr.push(data[cfg[JV.PROP_FILTER_COMPARE_OBJ_KEY]]);
                             }
                             }
@@ -533,16 +565,35 @@ function filterData(sourceData, handleCfg, prjData) {
                     }
                     }
                     compRst = private_chkVal(item[cfg.key], compareArr, cfg[JV.PROP_FILTER_CONDITION]);
                     compRst = private_chkVal(item[cfg.key], compareArr, cfg[JV.PROP_FILTER_CONDITION]);
                 } else {
                 } else {
-                    for (let data of curComparePrjData.data) {
+                    for (let data of getActDataArr(curComparePrjData)) {
                         compRst = private_chkVal(item[cfg.key], data[cfg[JV.PROP_FILTER_COMPARE_OBJ_KEY]], cfg[JV.PROP_FILTER_CONDITION]);
                         compRst = private_chkVal(item[cfg.key], data[cfg[JV.PROP_FILTER_COMPARE_OBJ_KEY]], cfg[JV.PROP_FILTER_CONDITION]);
                         if (compRst) break;
                         if (compRst) break;
                     }
                     }
                 }
                 }
             }
             }
             startIdx++;
             startIdx++;
+            if (!compRst) {
+                break; //有不符合条件的数据则退出(这里的判断条件是and关系)
+            }
         }
         }
         return compRst;
         return compRst;
     };
     };
+    let private_sub_filter_compare = function (dtlItem, subFilters) {
+        let cmpRst = false;
+        for (let dtlCfg of subFilters) {
+            cmpRst = private_filter_compare(dtlItem, dtlCfg);
+            if (cmpRst) {
+                if (dtlCfg[JV.PROP_OTHER_SUB_FILTER] && dtlCfg[JV.PROP_OTHER_SUB_FILTER].length > 0) {
+                    cmpRst = private_sub_filter_compare(dtlItem, dtlCfg[JV.PROP_OTHER_SUB_FILTER]);
+                    if (cmpRst) break;
+                } else {
+                    break;
+                }
+            }
+        }
+        return cmpRst;
+    };
+
     for (let item of tempRstArr) {
     for (let item of tempRstArr) {
         if (private_filter_compare(item, handleCfg)) {
         if (private_filter_compare(item, handleCfg)) {
             rstArr.push(item);
             rstArr.push(item);
@@ -551,25 +602,20 @@ function filterData(sourceData, handleCfg, prjData) {
     if (handleCfg[JV.PROP_OTHER_SUB_FILTER] && handleCfg[JV.PROP_OTHER_SUB_FILTER].length > 0) {
     if (handleCfg[JV.PROP_OTHER_SUB_FILTER] && handleCfg[JV.PROP_OTHER_SUB_FILTER].length > 0) {
         let newRstArr = [];
         let newRstArr = [];
         for (let dtlItem of rstArr) {
         for (let dtlItem of rstArr) {
-            let cmpRst = false;
-            for (let dtlCfg of handleCfg[JV.PROP_OTHER_SUB_FILTER]) {
-                cmpRst = private_filter_compare(dtlItem, dtlCfg);
-                if (cmpRst) {
-                    newRstArr.push(dtlItem);
-                    break;
-                }
+            let cmpRst = private_sub_filter_compare(dtlItem, handleCfg[JV.PROP_OTHER_SUB_FILTER]);
+            if (cmpRst) {
+                newRstArr.push(dtlItem);
             }
             }
         }
         }
         rstArr = newRstArr;
         rstArr = newRstArr;
     }
     }
-    delete sourceData.data;
-    sourceData.data = rstArr;
-    // fsUtil.writeObjToFile(sourceData.data, "D:/GitHome/ConstructionCost/tmp/filteredRst.js");
+    replaceActDataArr(sourceData, rstArr);
+    // fsUtil.writeObjToFile(sourceData.data, "D:/GitHome/ConstructionCost/tmp/filteredRst.jsp");
 }
 }
 
 
 function adjustData(sourceData, adjustCfg) {
 function adjustData(sourceData, adjustCfg) {
     let rstArr = [];
     let rstArr = [];
-    for (let item of sourceData.data) {
+    for (let item of getActDataArr(sourceData)) {
         if (item._doc) {
         if (item._doc) {
             rstArr.push(item._doc);
             rstArr.push(item._doc);
         } else {
         } else {
@@ -585,8 +631,7 @@ function adjustData(sourceData, adjustCfg) {
             }
             }
         }
         }
     }
     }
-    delete sourceData.data;
-    sourceData.data = rstArr;
+    replaceActDataArr(sourceData, rstArr);
 }
 }
 
 
 function moveRationData(rationData, rawDataObj) {
 function moveRationData(rationData, rawDataObj) {
@@ -595,7 +640,7 @@ function moveRationData(rationData, rawDataObj) {
         let rationGljData = getModuleDataByKey(rawDataObj.prjData, projectConst.RATION_GLJ);
         let rationGljData = getModuleDataByKey(rawDataObj.prjData, projectConst.RATION_GLJ);
         let prjGljData = getModuleDataByKey(rawDataObj.prjData, projectConst.PROJECTGLJ);
         let prjGljData = getModuleDataByKey(rawDataObj.prjData, projectConst.PROJECTGLJ);
         let dummyCode = " ", dummyPRJID = 10101010;
         let dummyCode = " ", dummyPRJID = 10101010;
-        for (let rationItem of rationData.data) {
+        for (let rationItem of getActDataArr(rationData)) {
             if (rationItem.type === 2 || rationItem.type === 3) {
             if (rationItem.type === 2 || rationItem.type === 3) {
                 //2: 量材(人工/材料/机械/主材/设备) 3:材料(材料/主材/设备)
                 //2: 量材(人工/材料/机械/主材/设备) 3:材料(材料/主材/设备)
                 let copyItem = {};
                 let copyItem = {};
@@ -672,7 +717,7 @@ function getDupGrpKeyVals(sourceData, segKeys) {
 
 
 function addDummyData(sourceData, addCfg) {
 function addDummyData(sourceData, addCfg) {
     let rstArr = [], tempRstArr = [];
     let rstArr = [], tempRstArr = [];
-    for (let item of sourceData.data) {
+    for (let item of getActDataArr(sourceData)) {
         if (item._doc) {
         if (item._doc) {
             tempRstArr.push(item._doc);
             tempRstArr.push(item._doc);
         } else {
         } else {
@@ -705,8 +750,7 @@ function addDummyData(sourceData, addCfg) {
         }
         }
     }
     }
     rstArr = rstArr.concat(tempRstArr);
     rstArr = rstArr.concat(tempRstArr);
-    delete sourceData.data;
-    sourceData.data = rstArr;
+    replaceActDataArr(sourceData, rstArr);
 }
 }
 
 
 function getGLJBizType(orgType, orgCode, orgName) {
 function getGLJBizType(orgType, orgCode, orgName) {
@@ -746,9 +790,10 @@ function getGLJBizType(orgType, orgCode, orgName) {
 }
 }
 
 
 function sortData(sourceData, sortCfg, prjData) {
 function sortData(sourceData, sortCfg, prjData) {
-    let rst = sourceData.data, tempRstArr = [];
+    let rst = getActDataArr(sourceData), tempRstArr = [];
     let sortType = sortCfg[JV.PROP_SORT_TYPE];
     let sortType = sortCfg[JV.PROP_SORT_TYPE];
-    for (let item of sourceData.data) {
+    let srcData = getActDataArr(sourceData);
+    for (let item of srcData) {
         if (item._doc) {
         if (item._doc) {
             tempRstArr.push(item._doc);
             tempRstArr.push(item._doc);
         } else {
         } else {
@@ -849,14 +894,12 @@ function sortData(sourceData, sortCfg, prjData) {
             }
             }
             let destArr = [];
             let destArr = [];
             treeUtil.getFlatArray(newTopArr, destArr);
             treeUtil.getFlatArray(newTopArr, destArr);
-            delete sourceData.data;
-            sourceData.data = destArr;
+            replaceActDataArr(sourceData, destArr);
             // fsUtil.writeObjToFile(sourceData.data, "D:/GitHome/ConstructionCost/tmp/sortedAndFlattedRst.jsp");
             // fsUtil.writeObjToFile(sourceData.data, "D:/GitHome/ConstructionCost/tmp/sortedAndFlattedRst.jsp");
             break;
             break;
         case "normal":
         case "normal":
             private_normal_sort(tempRstArr, sortCfg[JV.PROP_SORT_KEYS]);
             private_normal_sort(tempRstArr, sortCfg[JV.PROP_SORT_KEYS]);
-            delete sourceData.data;
-            sourceData.data = tempRstArr;
+            replaceActDataArr(sourceData, tempRstArr);
             // fsUtil.writeObjToFile(sourceData.data, "D:/GitHome/ConstructionCost/tmp/normalSortedRst.jsp");
             // fsUtil.writeObjToFile(sourceData.data, "D:/GitHome/ConstructionCost/tmp/normalSortedRst.jsp");
             break;
             break;
         case "accord_to_parent":
         case "accord_to_parent":
@@ -864,7 +907,7 @@ function sortData(sourceData, sortCfg, prjData) {
             let parentSrcData = getModuleDataByKey(prjData, pcKey[JV.PROP_PARENT_DATA_KEY]);
             let parentSrcData = getModuleDataByKey(prjData, pcKey[JV.PROP_PARENT_DATA_KEY]);
             if (parentSrcData) {
             if (parentSrcData) {
                 let tempParentArr = [];
                 let tempParentArr = [];
-                for (let item of parentSrcData.data) {
+                for (let item of getActDataArr(parentSrcData)) {
                     if (item._doc) {
                     if (item._doc) {
                         tempParentArr.push(item._doc);
                         tempParentArr.push(item._doc);
                     } else {
                     } else {
@@ -896,8 +939,7 @@ function sortData(sourceData, sortCfg, prjData) {
                     }
                     }
                 }
                 }
             }
             }
-            delete sourceData.data;
-            sourceData.data = tempRstArr;
+            replaceActDataArr(sourceData, tempRstArr);
             break;
             break;
         case "self_define":
         case "self_define":
             if (sortCfg[JV.PROP_SORT_TYPE_SELF_DEFINE_LOGIC]) {
             if (sortCfg[JV.PROP_SORT_TYPE_SELF_DEFINE_LOGIC]) {
@@ -905,8 +947,7 @@ function sortData(sourceData, sortCfg, prjData) {
                 eval('selfDefFunc = ' + sortCfg[JV.PROP_SORT_TYPE_SELF_DEFINE_LOGIC]);
                 eval('selfDefFunc = ' + sortCfg[JV.PROP_SORT_TYPE_SELF_DEFINE_LOGIC]);
                 tempRstArr.sort(selfDefFunc);
                 tempRstArr.sort(selfDefFunc);
             }
             }
-            delete sourceData.data;
-            sourceData.data = tempRstArr;
+            replaceActDataArr(sourceData, tempRstArr);
             break;
             break;
         default:
         default:
             //
             //
@@ -1010,9 +1051,10 @@ function ext_getPropety(propKey) {
     let rst = [], parentObj = this;
     let rst = [], parentObj = this;
     let dtObj = parentObj["myOwnRawDataObj"];
     let dtObj = parentObj["myOwnRawDataObj"];
     if (propKey && dtObj) {
     if (propKey && dtObj) {
-        for (let dItem of dtObj.data) {
+        for (let dItem of getActDataArr(dtObj)) {
             let doc = (dItem._doc === null || dItem._doc === undefined)?dItem:dItem._doc;
             let doc = (dItem._doc === null || dItem._doc === undefined)?dItem:dItem._doc;
             if (propKey instanceof Array) {
             if (propKey instanceof Array) {
+                //备注:这里的key数组表示取value的优先级
                 for (let pi = 0; pi < propKey.length; pi++) {
                 for (let pi = 0; pi < propKey.length; pi++) {
                     if (doc.hasOwnProperty("property")) {
                     if (doc.hasOwnProperty("property")) {
                         if (doc["property"].hasOwnProperty(propKey[pi])) {
                         if (doc["property"].hasOwnProperty(propKey[pi])) {
@@ -1022,6 +1064,16 @@ function ext_getPropety(propKey) {
                     } else if (doc.hasOwnProperty(propKey[pi])) {
                     } else if (doc.hasOwnProperty(propKey[pi])) {
                         rst.push(doc[propKey[pi]]);
                         rst.push(doc[propKey[pi]]);
                         break;
                         break;
+                    } else {
+                        let lenBefore = rst.length;
+                        getDeepProperty(propKey[pi], doc, rst);
+                        if (rst.length === (lenBefore + 1)) {
+                            if (rst[lenBefore] !== null && rst[lenBefore] !== undefined && rst[lenBefore] !== "") {
+                                break;
+                            } else {
+                                rst.splice(-1, 1); //删除末尾一条数据,给后面留空间
+                            }
+                        }
                     }
                     }
                     if (pi === propKey.length - 1) rst.push('');
                     if (pi === propKey.length - 1) rst.push('');
                 }
                 }
@@ -1031,7 +1083,8 @@ function ext_getPropety(propKey) {
                 } else if (doc.hasOwnProperty(propKey)) {
                 } else if (doc.hasOwnProperty(propKey)) {
                     rst.push(doc[propKey]);
                     rst.push(doc[propKey]);
                 } else {
                 } else {
-                    rst.push('');
+                    // rst.push('');
+                    getDeepProperty(propKey, doc, rst);
                 }
                 }
             }
             }
         }
         }
@@ -1044,7 +1097,7 @@ function ext_getPropertyByRefId(baseKey, refIDKey, propertyKey){
     let dtObj = parentObj["myOwnRawDataObj"];
     let dtObj = parentObj["myOwnRawDataObj"];
     let orgDtObj = parentObj["myOwnOrgRawDataObj"];
     let orgDtObj = parentObj["myOwnOrgRawDataObj"];
     if (baseKey && refIDKey && propertyKey && dtObj) {
     if (baseKey && refIDKey && propertyKey && dtObj) {
-        for (let dItem of dtObj.data) {
+        for (let dItem of getActDataArr(dtObj)) {
             let doc = (dItem._doc === null || dItem._doc === undefined)?dItem:dItem._doc;
             let doc = (dItem._doc === null || dItem._doc === undefined)?dItem:dItem._doc;
             let tmpRst = doc[baseKey];
             let tmpRst = doc[baseKey];
             if (typeof tmpRst === "string" && tmpRst[0] === "@") {
             if (typeof tmpRst === "string" && tmpRst[0] === "@") {
@@ -1098,7 +1151,7 @@ function ext_getFee(feeKey, dtlFeeKey) {
     let rst = [], parentObj = this;
     let rst = [], parentObj = this;
     let dtObj = parentObj["myOwnRawDataObj"];
     let dtObj = parentObj["myOwnRawDataObj"];
     if (feeKey && dtObj) {
     if (feeKey && dtObj) {
-        for (let dItem of dtObj.data) {
+        for (let dItem of getActDataArr(dtObj)) {
             rst.push(pri_getFee(dItem, feeKey, dtlFeeKey));
             rst.push(pri_getFee(dItem, feeKey, dtlFeeKey));
         }
         }
     }
     }
@@ -1209,7 +1262,7 @@ function ext_getArrayValues(itemKey) {
     let rst = [], parentObj = this;
     let rst = [], parentObj = this;
     let dtObj = parentObj["myOwnRawDataObj"];
     let dtObj = parentObj["myOwnRawDataObj"];
     let keysArr = itemKey.split(".");
     let keysArr = itemKey.split(".");
-    for (let dataItem of dtObj.data) {
+    for (let dataItem of getActDataArr(dtObj)) {
         let itemArr = [];
         let itemArr = [];
         if (keysArr.length <= 2) {
         if (keysArr.length <= 2) {
             if (dataItem[keysArr[0]] instanceof Array) {
             if (dataItem[keysArr[0]] instanceof Array) {
@@ -1269,7 +1322,8 @@ function ext_getBlank(dftVal) {
     let rst = [], parentObj = this;
     let rst = [], parentObj = this;
     let dtObj = parentObj["myOwnRawDataObj"];
     let dtObj = parentObj["myOwnRawDataObj"];
     if (dtObj) {
     if (dtObj) {
-        for (let i = 0; i < dtObj.data.length; i++) {
+        let dtData = getActDataArr(dtObj);
+        for (let i = 0; i < dtData.length; i++) {
             if (dftVal !== null && dftVal !== undefined) {
             if (dftVal !== null && dftVal !== undefined) {
                 rst.push(dftVal)
                 rst.push(dftVal)
             } else rst.push('');
             } else rst.push('');
@@ -1283,7 +1337,7 @@ function ext_getPropertyByFlag(flagVal, rstKey, dftValIfEmpty) {
     let dtObj = parentObj["myOwnRawDataObj"];
     let dtObj = parentObj["myOwnRawDataObj"];
     if (flagVal && rstKey && dtObj) {
     if (flagVal && rstKey && dtObj) {
         let isArr = (flagVal instanceof Array);
         let isArr = (flagVal instanceof Array);
-        for (let dItem of dtObj.data) {
+        for (let dItem of getActDataArr(dtObj)) {
             let doc = (dItem._doc)?dItem._doc:dItem;
             let doc = (dItem._doc)?dItem._doc:dItem;
             if (doc.hasOwnProperty("flags")) {
             if (doc.hasOwnProperty("flags")) {
                 let bFlag = false;
                 let bFlag = false;
@@ -1325,8 +1379,7 @@ function ext_getPropertyByForeignId(foreignIdVal, adHocIdKey, propKey, dftValIfN
         if (foreignIdVal instanceof Array) {
         if (foreignIdVal instanceof Array) {
             for (let idVal of foreignIdVal) {
             for (let idVal of foreignIdVal) {
                 isFound = false;
                 isFound = false;
-                let dataArr = dtObj.data;
-                if (dtObj.moduleName === "projectGLJ") dataArr = dtObj.data.gljList;
+                let dataArr = getActDataArr(dtObj);
                 for (let i = 0; i < dataArr.length; i++) {
                 for (let i = 0; i < dataArr.length; i++) {
                     let item = (dataArr[i]._doc)?dataArr[i]._doc:dataArr[i];
                     let item = (dataArr[i]._doc)?dataArr[i]._doc:dataArr[i];
                     if (item[IdKey] === idVal) {
                     if (item[IdKey] === idVal) {
@@ -1357,7 +1410,7 @@ function ext_getPropertyByForeignId(foreignIdVal, adHocIdKey, propKey, dftValIfN
                 }
                 }
             }
             }
         } else {
         } else {
-            for (let item of dtObj.data) {
+            for (let item of getActDataArr(dtObj)) {
                 if (item[IdKey] === foreignIdVal) {
                 if (item[IdKey] === foreignIdVal) {
                     rst.push(item[propKey]);
                     rst.push(item[propKey]);
                     isFound = true;
                     isFound = true;
@@ -1372,4 +1425,25 @@ function ext_getPropertyByForeignId(foreignIdVal, adHocIdKey, propKey, dftValIfN
     return rst;
     return rst;
 }
 }
 
 
+function getActDataArr(dtObj) {
+    let rst = null;
+    if (dtObj) {
+        rst = dtObj.data;
+        if (dtObj.moduleName === "projectGLJ") {
+            rst = dtObj.data.gljList;
+        }
+    }
+    return rst;
+}
+
+function replaceActDataArr(dtObj, newArr) {
+    if (dtObj.moduleName === "projectGLJ") {
+        delete dtObj.data.gljList;
+        dtObj.data.gljList = newArr;
+    } else {
+        delete dtObj.data;
+        dtObj.data = newArr;
+    }
+}
+
 export default Rpt_Data_Extractor;
 export default Rpt_Data_Extractor;

+ 43 - 2
modules/users/controllers/user_controller.js

@@ -23,9 +23,18 @@ class UserController extends BaseController {
         let total = 0;
         let total = 0;
         let pageData = {};
         let pageData = {};
         let userList = [];
         let userList = [];
+        let filter = request.query;
         try {
         try {
+            let condition = userModel.getFilterCondition(request);
+
+            //获取注册时间
+            let regtime = request.query.regtime;
+            if(regtime !== '' && regtime !== undefined){
+                filter.regtimeMsg = userModel.getDayMsg(regtime);
+            }
+
             // 获取用户总数
             // 获取用户总数
-            total = await userModel.count();
+            total = await userModel.count(condition);
 
 
             // 分页数据
             // 分页数据
             let page = request.query.page === undefined ? 1 : request.query.page;
             let page = request.query.page === undefined ? 1 : request.query.page;
@@ -36,7 +45,7 @@ class UserController extends BaseController {
             };
             };
 
 
             // 获取用户列表
             // 获取用户列表
-            userList = await userModel.getList(null, page, Config.pageSize);
+            userList = await userModel.getList(condition, page, Config.pageSize);
         } catch (error) {
         } catch (error) {
             console.log(error);
             console.log(error);
         }
         }
@@ -46,12 +55,44 @@ class UserController extends BaseController {
             userList: userList,
             userList: userList,
             pages: pageData,
             pages: pageData,
             total: total,
             total: total,
+            filter: filter,
             model: userModel,
             model: userModel,
             layout: 'users/views/layout/layout'
             layout: 'users/views/layout/layout'
         };
         };
         response.render('users/views/user/index', renderData);
         response.render('users/views/user/index', renderData);
     }
     }
 
 
+
+    /**
+     * 获取搜索用户json
+     *
+     * @param {object} request
+     * @param {object} response
+     * @return {string}
+     */
+    async search(request, response) {
+        let userModel = new UserModel();
+        let responseData = {
+            error: 0,
+            msg: '',
+            data: null
+        };
+        try{
+            let keyword = request.query.keyword;
+            if(keyword === undefined || keyword === '') {
+                throw { code: 1, err: '参数有误或为空'};
+            }
+            let condition = userModel.getFilterCondition(request);
+            let userList = await userModel.getList(condition);
+            responseData.data = userList;
+        } catch (error) {
+            console.log(error);
+            responseData.error = error.code;
+            responseData.msg = error.err;
+        }
+
+        response.json(responseData);
+    }
 }
 }
 
 
 export default UserController;
 export default UserController;

+ 68 - 0
modules/users/models/user_model.js

@@ -32,6 +32,13 @@ class UserModel extends BaseModel {
     companyScale = ['1-20', '20-50', '50-100', '100+'];
     companyScale = ['1-20', '20-50', '50-100', '100+'];
 
 
     /**
     /**
+     * 最近天数
+     *
+     * @var
+     */
+    dayMsg = ['所有', '最近24小时', '最近3天', '最近7天', '最近30天'];
+
+    /**
      * 构造函数
      * 构造函数
      *
      *
      * @return {void}
      * @return {void}
@@ -61,6 +68,67 @@ class UserModel extends BaseModel {
         return userList;
         return userList;
     }
     }
 
 
+    /**
+     * 获取过滤条件
+     *
+     * @return {Object}
+     */
+    getFilterCondition(request) {
+        let condition = {};
+        let regtime = request.query.regtime;
+        regtime = regtime !== '' && regtime !== undefined ? parseInt(regtime) : 0;
+        if (regtime !== 0) {
+            condition.create_time = this.getTimestamp(regtime);
+        }
+
+        let version = request.query.version;
+        if(version !== '' && version !== undefined) {
+            condition.version = version;
+        }
+
+        let keyword = request.query.keyword;
+        if (keyword !== '' && keyword !== undefined) {
+            condition.$or = [{real_name : {$regex: keyword}},{email : {$regex: keyword}},{mobile : {$regex: keyword}},{company : {$regex: keyword}}];
+        }
+
+        return condition;
+    }
+
+    /**
+     * 获取时间戳区间
+     *
+     * @return {Object}
+     */
+    getTimestamp(type) {
+        let startTime = '';
+        switch (type) {
+            case 1 :
+                startTime = Date.parse(new Date())-86400*1000;
+                break;
+            case 2 :
+                startTime = Date.parse(new Date())-86400*1000*3;
+                break;
+            case 3 :
+                startTime = Date.parse(new Date())-86400*1000*7;
+                break;
+            case 4 :
+                startTime = Date.parse(new Date())-86400*1000*30;
+                break;
+            default :
+                break;
+        }
+        let endTime =  Date.parse(new Date());
+        return startTime === '' ? '' : {'$gte': startTime, '$lt': endTime};
+    }
+
+    /**
+     * 获取daymsg
+     *
+     */
+    getDayMsg(index){
+        return this.dayMsg[index];
+    }
+
 }
 }
 
 
 export default UserModel;
 export default UserModel;

+ 1 - 0
modules/users/routes/user_route.js

@@ -14,6 +14,7 @@ const userController = new UserController();
 module.exports =function (app) {
 module.exports =function (app) {
     // action定义区域
     // action定义区域
     router.get('/', userController.auth, userController.init, userController.lastRegister);
     router.get('/', userController.auth, userController.init, userController.lastRegister);
+    router.get('/search', userController.auth, userController.init, userController.search);
 
 
     app.use("/user", router);
     app.use("/user", router);
 };
 };

+ 21 - 4
public/web/treeDataHelper.js

@@ -1,7 +1,8 @@
 /**
 /**
  * Created by Tony on 2017/1/23.
  * Created by Tony on 2017/1/23.
  */
  */
-const NODE_ID = "ID", P_ID = "ParentID", NEXT_ID = "NextSiblingID", ADHOC_PRE_ID="Previous_ID", CHILDREN_NODE = "items", SUB_ID = "sub_ids", EMPTY_ID_VAL = -1, TREE_LEVEL = 'treeLevel';
+const NODE_ID = "ID", P_ID = "ParentID", NEXT_ID = "NextSiblingID", ADHOC_PRE_ID="Previous_ID", CHILDREN_NODE = "items", SUB_ID = "sub_ids",
+      EMPTY_ID_VAL = -1, TREE_LEVEL = 'treeLevel', TOP_BILL_ID = "topBillID";
 
 
 let tree_Data_Helper = {
 let tree_Data_Helper = {
     buildTreeNodeDirectly: function(data, addLevel) {
     buildTreeNodeDirectly: function(data, addLevel) {
@@ -16,7 +17,7 @@ let tree_Data_Helper = {
             }
             }
             return tmpNodeRst;
             return tmpNodeRst;
         };
         };
-        let private_buildNodeData = function(parentItem, idArr, treeLevel) {
+        let private_buildNodeData = function(parentItem, idArr, treeLevel, tbID) {
             let iter = [], nextNode = private_getStartNode(idArr);
             let iter = [], nextNode = private_getStartNode(idArr);
             while (nextNode !== null && nextNode !== undefined ) {
             while (nextNode !== null && nextNode !== undefined ) {
                 if (parentItem) {
                 if (parentItem) {
@@ -25,11 +26,27 @@ let tree_Data_Helper = {
                     rst.push(nextNode);
                     rst.push(nextNode);
                 }
                 }
                 iter.push(nextNode);
                 iter.push(nextNode);
+                nextNode[TOP_BILL_ID] = tbID;
+                if (parentItem === null) {
+                    nextNode[TOP_BILL_ID] = nextNode[NODE_ID];
+                    if (nextNode.flags && nextNode.flags.length > 0) {
+                        for (let flag of nextNode.flags) {
+                            if (flag.fieldName === "fixed") {
+                                nextNode[TOP_BILL_ID] = flag.flag;
+                                break;
+                            }
+                        }
+                    }
+                }
                 if (addLevel) nextNode[TREE_LEVEL] = treeLevel;
                 if (addLevel) nextNode[TREE_LEVEL] = treeLevel;
                 nextNode = tmpNodes[prefix + nextNode[NEXT_ID]];
                 nextNode = tmpNodes[prefix + nextNode[NEXT_ID]];
             }
             }
             for (let i = 0; i < iter.length; i++) {
             for (let i = 0; i < iter.length; i++) {
-                private_buildNodeData(iter[i], iter[i][SUB_ID], (treeLevel + 1));
+                let rtbID = tbID;
+                if (parentItem === null) {
+                    rtbID = iter[i][TOP_BILL_ID];
+                }
+                private_buildNodeData(iter[i], iter[i][SUB_ID], (treeLevel + 1), rtbID);
             }
             }
         };
         };
 
 
@@ -52,7 +69,7 @@ let tree_Data_Helper = {
                 tmpNodes[prefix + data[i][P_ID]][SUB_ID].push(data[i][NODE_ID]);
                 tmpNodes[prefix + data[i][P_ID]][SUB_ID].push(data[i][NODE_ID]);
             }
             }
         }
         }
-        private_buildNodeData(null, topArr, 0);
+        private_buildNodeData(null, topArr, 0, -1);
         //try to release and return
         //try to release and return
         tmpNodes = null;
         tmpNodes = null;
         topArr.length = 0;
         topArr.length = 0;

+ 4 - 2
web/maintain/report/js/rpt_tpl_data_map.js

@@ -405,6 +405,7 @@ let dataInfoMapTreeOprObj = {
         let me = this, rst = {};
         let me = this, rst = {};
         rst[JV.PROP_NAME] = "文本";
         rst[JV.PROP_NAME] = "文本";
         rst[JV.PROP_LABEL] = "文本";
         rst[JV.PROP_LABEL] = "文本";
+        rst.Title = "";
         rst[JV.PROP_FONT] = "Content";
         rst[JV.PROP_FONT] = "Content";
         rst[JV.PROP_CONTROL] = "Default";
         rst[JV.PROP_CONTROL] = "Default";
         rst[JV.PROP_STYLE] = "Default_None";
         rst[JV.PROP_STYLE] = "Default_None";
@@ -656,7 +657,8 @@ let dataInfoMapTreeOprObj = {
                     let newSegSum = me.private_extract_sum_info(node);
                     let newSegSum = me.private_extract_sum_info(node);
                     rptTpl[JV.NODE_FLOW_INFO][JV.NODE_FLOW_PAGE_SUM] = newSegSum;
                     rptTpl[JV.NODE_FLOW_INFO][JV.NODE_FLOW_PAGE_SUM] = newSegSum;
                 } else if (node[JV.PROP_NAME] === JV.NODE_FLOW_GROUP) {
                 } else if (node[JV.PROP_NAME] === JV.NODE_FLOW_GROUP) {
-                    //
+                    let grpInfo = me.private_extract_grp_info(node);
+                    rptTpl[JV.NODE_FLOW_INFO][JV.NODE_FLOW_GROUP] = grpInfo;
                 }
                 }
             }
             }
         }
         }
@@ -707,7 +709,7 @@ let dataInfoMapTreeOprObj = {
                                     rst[JV.PROP_SUM_FIELDS].push({"FieldID": gf[JV.PROP_FIELD_ID], "SumKey": gf[JV.PROP_NAME]});
                                     rst[JV.PROP_SUM_FIELDS].push({"FieldID": gf[JV.PROP_FIELD_ID], "SumKey": gf[JV.PROP_NAME]});
                                 }
                                 }
                                 let item = {};
                                 let item = {};
-                                rst[JV.PROP_SUM_FIELDS].push(item);
+                                // rst[JV.PROP_SUM_FIELDS].push(item);
                                 me.private_copy_field_properties(gf, item);
                                 me.private_copy_field_properties(gf, item);
                                 item[JV.PROP_SUM_KEY] = gf[JV.PROP_NAME];
                                 item[JV.PROP_SUM_KEY] = gf[JV.PROP_NAME];
                                 grpLine[JV.PROP_GROUP_SUM_KEYS].push(item);
                                 grpLine[JV.PROP_GROUP_SUM_KEYS].push(item);

+ 54 - 35
web/maintain/report/js/rpt_tpl_pre_handle.js

@@ -35,6 +35,29 @@ const fixed_glj_types = [
     {Name: "主材(4)", Title: "", Value: 4},
     {Name: "主材(4)", Title: "", Value: 4},
     {Name: "设备(5)", Title: "", Value: 5}
     {Name: "设备(5)", Title: "", Value: 5}
 ];
 ];
+const fixed_top_bills_nodes = [
+    {Name: "分部分项工程(1)", Title: "", Value: 1}
+    ,{Name: "措施项目(2)", Title: "", Value: 2}
+    ,{Name: "其他项目(7)", Title: "", Value: 7}
+    ,{Name: "规费(15)", Title: "", Value: 15}
+    ,{Name: "税金(18)", Title: "", Value: 18}
+    ,{Name: "工程造价(19)", Title: "", Value: 19}
+];
+const fixed_other_bills_types = [
+    {Name: "施工技术措施项目(3)", Title: "", Value: 3}
+    ,{Name: "安全文明施工按实计算费用(4)", Title: "", Value: 4}
+    ,{Name: "施工组织措施专项费用(5)", Title: "", Value: 5}
+    ,{Name: "安全文明施工专项费用(6)", Title: "", Value: 6}
+    ,{Name: "暂列金额(8)", Title: "", Value: 8}
+    ,{Name: "暂估价(9)", Title: "", Value: 9}
+    ,{Name: "材料(工程设备)暂估价(10)", Title: "", Value: 10}
+    ,{Name: "专业工程暂估价(11)", Title: "", Value: 11}
+    ,{Name: "计日工(12)", Title: "", Value: 12}
+    ,{Name: "总承包服务费(13)", Title: "", Value: 13}
+    ,{Name: "索赔与现场签证(14)", Title: "", Value: 14}
+    ,{Name: "社会保险费及住房公积金(16)", Title: "", Value: 16}
+    ,{Name: "工程排污费(17)", Title: "", Value: 17}
+];
 const fixed_bills_flags = [
 const fixed_bills_flags = [
     {Name: "分部分项工程(1)", Title: "", Value: 1},
     {Name: "分部分项工程(1)", Title: "", Value: 1},
     {Name: "措施项目(2)", Title: "", Value: 2},
     {Name: "措施项目(2)", Title: "", Value: 2},
@@ -56,10 +79,19 @@ const fixed_bills_flags = [
     {Name: "税金(18)", Title: "", Value: 18},
     {Name: "税金(18)", Title: "", Value: 18},
     {Name: "工程造价(19)", Title: "", Value: 19}
     {Name: "工程造价(19)", Title: "", Value: 19}
 ];
 ];
+const fixed_bills_types = [
+    {Name: "大项费用(1)", Title: "", Value: 1},
+    {Name: "分部(2)", Title: "", Value: 2},
+    {Name: "分项(3)", Title: "", Value: 3},
+    {Name: "清单(4)", Title: "", Value: 4},
+    {Name: "补项(5)", Title: "", Value: 5},
+];
 const exposed_bills_properties = [
 const exposed_bills_properties = [
     {Name: "清单_所属项目ID", Title: "", Key: "projectID", Order: "ascend"}
     {Name: "清单_所属项目ID", Title: "", Key: "projectID", Order: "ascend"}
     ,{Name: "清单_ID", Title: "", Key: "ID", Order: "ascend"}
     ,{Name: "清单_ID", Title: "", Key: "ID", Order: "ascend"}
+    ,{Name: "顶层父清单_标记", Title: "", Key: "topBillID", Order: "ascend", individualType: fixed_top_bills_nodes}
     ,{Name: "清单_层次", Title: "", Key: "treeLevel", Order: "ascend"}
     ,{Name: "清单_层次", Title: "", Key: "treeLevel", Order: "ascend"}
+    ,{Name: "清单_类别", Title: "", Key: "type", Order: "ascend", individualType: fixed_bills_types}
     ,{Name: "清单_标记", Title: "", Key: "flags.flag", Order: "ascend", individualType: fixed_bills_flags}
     ,{Name: "清单_标记", Title: "", Key: "flags.flag", Order: "ascend", individualType: fixed_bills_flags}
 ];
 ];
 const exposed_ration_properties = [
 const exposed_ration_properties = [
@@ -84,34 +116,12 @@ const exposed_prj_glj_properties = [
     ,{Name: "项目人材机_所属工程ID", Title: "", Key: "projectID", Order: "ascend"}
     ,{Name: "项目人材机_所属工程ID", Title: "", Key: "projectID", Order: "ascend"}
     ,{Name: "项目人材机_代码", Title: "", Key: "code", Order: "ascend"}
     ,{Name: "项目人材机_代码", Title: "", Key: "code", Order: "ascend"}
     ,{Name: "项目人材机_类型", Title: "", Key: "type", Order: "ascend", individualType: fixed_glj_types}
     ,{Name: "项目人材机_类型", Title: "", Key: "type", Order: "ascend", individualType: fixed_glj_types}
+    ,{Name: "项目人材机_数量", Title: "", Key: "quantity", Order: "ascend"}
     ,{Name: "项目人材机_是否暂估", Title: "", Key: "is_evaluate", Order: "ascend", isBoolean: true, booleanOptions: [1,0]}
     ,{Name: "项目人材机_是否暂估", Title: "", Key: "is_evaluate", Order: "ascend", isBoolean: true, booleanOptions: [1,0]}
     ,{Name: "项目人材机_供货方式", Title: "", Key: "supply", Order: "ascend", individualType: fixed_supply_types}
     ,{Name: "项目人材机_供货方式", Title: "", Key: "supply", Order: "ascend", individualType: fixed_supply_types}
     ,{Name: "项目人材机_三材类别", Title: "", Key: "materialType", Order: "ascend", individualType: fixed_material_types}
     ,{Name: "项目人材机_三材类别", Title: "", Key: "materialType", Order: "ascend", individualType: fixed_material_types}
 ];
 ];
 const exposed_properties_arr = [exposed_bills_properties, exposed_ration_properties, exposed_ration_glj_properties, exposed_prj_glj_properties];
 const exposed_properties_arr = [exposed_bills_properties, exposed_ration_properties, exposed_ration_glj_properties, exposed_prj_glj_properties];
-const fixed_top_bills_nodes = [
-    {Name: "分部分项工程(1)", Title: "", Value: 1}
-    ,{Name: "措施项目(2)", Title: "", Value: 2}
-    ,{Name: "其他项目(7)", Title: "", Value: 7}
-    ,{Name: "规费(15)", Title: "", Value: 15}
-    ,{Name: "税金(18)", Title: "", Value: 18}
-    ,{Name: "工程造价(19)", Title: "", Value: 19}
-];
-const fixed_other_bills_types = [
-    {Name: "施工技术措施项目(3)", Title: "", Value: 3}
-    ,{Name: "安全文明施工按实计算费用(4)", Title: "", Value: 4}
-    ,{Name: "施工组织措施专项费用(5)", Title: "", Value: 5}
-    ,{Name: "安全文明施工专项费用(6)", Title: "", Value: 6}
-    ,{Name: "暂列金额(8)", Title: "", Value: 8}
-    ,{Name: "暂估价(9)", Title: "", Value: 9}
-    ,{Name: "材料(工程设备)暂估价(10)", Title: "", Value: 10}
-    ,{Name: "专业工程暂估价(11)", Title: "", Value: 11}
-    ,{Name: "计日工(12)", Title: "", Value: 12}
-    ,{Name: "总承包服务费(13)", Title: "", Value: 13}
-    ,{Name: "索赔与现场签证(14)", Title: "", Value: 14}
-    ,{Name: "社会保险费及住房公积金(16)", Title: "", Value: 16}
-    ,{Name: "工程排污费(17)", Title: "", Value: 17}
-];
 
 
 let preHandleObj = {
 let preHandleObj = {
     treeObj: null,
     treeObj: null,
@@ -369,7 +379,7 @@ let preHandleObj = {
     },
     },
     addHoverDom: function(treeId, treeNode) {
     addHoverDom: function(treeId, treeNode) {
         let me = preHandleObj, sObj = $("#" + treeNode.tId + "_span");
         let me = preHandleObj, sObj = $("#" + treeNode.tId + "_span");
-        if (treeNode.level > 0 || $("#addBtn_"+treeNode.tId).length > 0) return;
+        if ((treeNode.level > 0 && treeNode[JV.PROP_HANDLE_TYPE] !== JV.PROP_HANDLE_TYPE_FILTER) || ($("#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") {
         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>";
             let addStr = "<span class='button add' id='addBtn_" + treeNode.tId + "' title='新增子排序' onfocus='this.blur();'></span>";
             sObj.after(addStr);
             sObj.after(addStr);
@@ -394,7 +404,9 @@ let preHandleObj = {
                 let newNode = me.createNewNode(treeNode[JV.PROP_HANDLE_TYPE]);
                 let newNode = me.createNewNode(treeNode[JV.PROP_HANDLE_TYPE]);
                 newNode.Name = "子过滤";
                 newNode.Name = "子过滤";
                 newNode[JV.PROP_DATA_KEY] = treeNode[JV.PROP_DATA_KEY];
                 newNode[JV.PROP_DATA_KEY] = treeNode[JV.PROP_DATA_KEY];
-                me.private_set_title(newNode);
+                newNode.Title = "";
+                newNode[JV.PROP_HANDLE_TYPE] = JV.PROP_HANDLE_TYPE_FILTER;
+                // me.private_set_title(newNode);
                 newSubNodes.push(newNode);
                 newSubNodes.push(newNode);
                 treeNode.isParent = true;
                 treeNode.isParent = true;
                 me.treeObj.addNodes(treeNode, -1, newSubNodes, true);
                 me.treeObj.addNodes(treeNode, -1, newSubNodes, true);
@@ -759,7 +771,8 @@ let preHandleFilterObj = {
         if (src[JV.PROP_OTHER_SUB_FILTER] && src[JV.PROP_OTHER_SUB_FILTER].length > 0) {
         if (src[JV.PROP_OTHER_SUB_FILTER] && src[JV.PROP_OTHER_SUB_FILTER].length > 0) {
             dest.items = [];
             dest.items = [];
             for (let subFilter of src[JV.PROP_OTHER_SUB_FILTER]) {
             for (let subFilter of src[JV.PROP_OTHER_SUB_FILTER]) {
-                let dtlRst = {Name: "子过滤"};
+                let dtlRst = {Name: "子过滤", Title: ""};
+                subFilter[JV.PROP_DATA_KEY] = src[JV.PROP_DATA_KEY];
                 me.copyNode(subFilter, dtlRst);
                 me.copyNode(subFilter, dtlRst);
                 dtlRst[JV.PROP_HANDLE_TYPE] = src[JV.PROP_HANDLE_TYPE];
                 dtlRst[JV.PROP_HANDLE_TYPE] = src[JV.PROP_HANDLE_TYPE];
                 dtlRst[JV.PROP_DATA_KEY] = src[JV.PROP_DATA_KEY];
                 dtlRst[JV.PROP_DATA_KEY] = src[JV.PROP_DATA_KEY];
@@ -995,19 +1008,25 @@ let preHandleFilterObj = {
     },
     },
     extractTabFields: function (handleObj) {
     extractTabFields: function (handleObj) {
         let me = preHandleFilterObj, rst = {};
         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);
         me.copyNode(handleObj, rst);
         rst[JV.PROP_OTHER_SUB_FILTER] = [];
         rst[JV.PROP_OTHER_SUB_FILTER] = [];
+        let private_extract_other_sub_filter = function (parentFilter, currentFilterNode) {
+            let dtlRst = {};
+            me.copyNode(currentFilterNode, dtlRst);
+            parentFilter[JV.PROP_OTHER_SUB_FILTER].push(dtlRst);
+            if (currentFilterNode.items && currentFilterNode.items.length > 0) {
+                dtlRst[JV.PROP_OTHER_SUB_FILTER] = [];
+                for (let subFilterNode of currentFilterNode.items) {
+                    private_extract_other_sub_filter(dtlRst, subFilterNode);
+                }
+            }
+            delete dtlRst.Name;
+            delete dtlRst[JV.PROP_DATA_KEY];
+            dtlRst = null;
+        };
         if (handleObj.items && handleObj.items.length > 0) {
         if (handleObj.items && handleObj.items.length > 0) {
             for (let subFilter of handleObj.items) {
             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;
+                private_extract_other_sub_filter(rst, subFilter);
             }
             }
         }
         }
         return rst;
         return rst;

+ 17 - 0
web/users/js/user.js

@@ -0,0 +1,17 @@
+/**
+ * 消息管理相关js
+ *
+ * @author CaiAoLin
+ * @date 2017/9/21
+ * @version
+ */
+$(document).ready(function() {
+    // 选择框
+    $(".selector > li > a").click(function() {
+        let value = $(this).data("value");
+        let string = $(this).text();
+        let selector = $(this).parent().parent();
+        selector.next("input:hidden").val(value);
+        selector.prev("button").html(string + ' <span class="caret"></span>');
+    });
+});

+ 42 - 36
web/users/views/user/index.html

@@ -7,45 +7,50 @@
     </div>
     </div>
     <div class="content-wrap">
     <div class="content-wrap">
         <div class="c-header">
         <div class="c-header">
-            <!--最新注册-->
-            <div class="btn-group">
-                <button type="button" class="btn btn-default dropdown-toggle btn-sm" data-toggle="dropdown"
-                        aria-haspopup="true" aria-expanded="false">
-                    最新注册:最近24小时<span class="caret"></span>
-                </button>
-                <ul class="dropdown-menu">
-                    <li><a href="#">最近24小时</a></li>
-                    <li><a href="#">最近3天</a></li>
-                    <li><a href="#">最近7天</a></li>
-                    <li><a href="#">最近30天</a></li>
-                </ul>
-            </div>
-            <!--版本-->
-            <div class="btn-group">
-                <button type="button" class="btn btn-default dropdown-toggle btn-sm" data-toggle="dropdown"
-                        aria-haspopup="true" aria-expanded="false">
-                    版本 <span class="caret"></span>
-                </button>
-                <ul class="dropdown-menu">
-                    <li><a href="#">广东版</a></li>
-                    <li><a href="#">重庆版</a></li>
-                </ul>
-            </div>
-            <!--结果-->
-            <div class="btn-group">
-                &nbsp;共 <%= total %> 条结果
-            </div>
-            <!--搜索-->
-            <div class="btn-group pull-right">
-                <div class="input-group">
-                    <input type="text" class="form-control input-sm" placeholder="手机/邮箱/姓名/公司">
-                    <span class="input-group-btn">
-                        <button class="btn btn-default btn-sm" type="button">
+            <form class="form-inline" method="get" action="">
+                <!--最新注册-->
+                <div class="btn-group">
+                    <button type="button" class="btn btn-default dropdown-toggle btn-sm" data-toggle="dropdown"
+                            aria-haspopup="true" aria-expanded="false">
+                        最新注册:<%= filter.regtimeMsg === undefined ? '所有' : filter.regtimeMsg %><span class="caret"></span>
+                    </button>
+                    <ul class="dropdown-menu selector">
+                        <li><a href="javascript:void(0);" data-value="0">所有</a></li>
+                        <li><a href="javascript:void(0);" data-value="1">最近24小时</a></li>
+                        <li><a href="javascript:void(0);" data-value="2">最近3天</a></li>
+                        <li><a href="javascript:void(0);" data-value="3">最近7天</a></li>
+                        <li><a href="javascript:void(0);" data-value="4">最近30天</a></li>
+                    </ul>
+                    <input type="hidden" name="regtime" value="<%= filter.regtime%>" />
+                </div>
+                <!--版本-->
+                <div class="btn-group">
+                    <button type="button" class="btn btn-default dropdown-toggle btn-sm" data-toggle="dropdown"
+                            aria-haspopup="true" aria-expanded="false">
+                        <%= filter.version === undefined || filter.version === '' ? '版本' : (filter.version === "1" ? '广东版' : '重庆版')%> <span class="caret"></span>
+                    </button>
+                    <ul class="dropdown-menu selector">
+                        <li><a href="javascript:void(0);" data-value="1">广东版</a></li>
+                        <li><a href="javascript:void(0);" data-value="2">重庆版</a></li>
+                    </ul>
+                    <!--<input type="hidden" name="version" value="<%= filter.version%>" />-->
+                </div>
+                <!--结果-->
+                <div class="btn-group">
+                    &nbsp;共 <%= total %> 条结果
+                </div>
+                <!--搜索-->
+                <div class="btn-group pull-right">
+                    <div class="input-group">
+                        <input type="text" name="keyword" class="form-control input-sm" value="<%= filter.keyword === undefined ? '' : filter.keyword %>" placeholder="手机/邮箱/姓名/公司">
+                        <span class="input-group-btn">
+                        <button class="btn btn-default btn-sm" type="submit">
                             <i class="glyphicon glyphicon-search"></i>
                             <i class="glyphicon glyphicon-search"></i>
                         </button>
                         </button>
                     </span>
                     </span>
+                    </div>
                 </div>
                 </div>
-            </div>
+            </form>
         </div>
         </div>
         <div class="c-body">
         <div class="c-body">
             <table class="table">
             <table class="table">
@@ -77,4 +82,5 @@
             </nav>
             </nav>
         </div>
         </div>
     </div>
     </div>
-</div>
+</div>
+<script type="text/javascript" src="/web/users/js/user.js"></script>