Sfoglia il codice sorgente

report template tree

TonyKang 7 anni fa
parent
commit
4a2f24eb29

+ 87 - 20
modules/reports/controllers/rpt_tpl_controller.js

@@ -16,6 +16,7 @@ let rptTplDef = rpttplDefObj.getUtil();
 //import stringUtil from "../../../public/stringUtil";
 import JV from "../rpt_component/jpc_value_define";
 import rttFacade from "../facade/rpt_tpl_tree_node_facade";
+import CompilationModel from "../../users/models/compilation_model";
 
 //import test_glj_type_util from "../../../public/cache/std_glj_type_util");
 
@@ -35,6 +36,17 @@ let mExport = {
             }
         });
     },
+    getCompilationList(req, res) {
+        let compilationModel = new CompilationModel();
+        let compilationList = compilationModel.getCompilationList();
+        if (compilationList) {
+            compilationList.then(function (rst) {
+                callback(req,res,false,"", rst);
+            })
+        } else {
+            callback(req,res, true,"no result", null);
+        }
+    },
     getRptTplTree: function(req, res) {
         let params = JSON.parse(req.body.params),
             compilationId = params.compilationId,
@@ -110,30 +122,85 @@ let mExport = {
             callback(req,res, err, "", results);
         });
     },
-    createTplTreeNode: function(req, res){
+    createTreeRootNode: function(req, res){
+        let params = JSON.parse(req.body.params),
+            doc = params.doc;
+        rttFacade.createNewTree(doc).then(function (rst) {
+            if (rst) {
+                //success
+                callback(req,res, false, "", rst);
+            } else {
+                //failed
+                callback(req,res, true, "创建失败!", null);
+            }
+        })
+    },
+    updateTreeRootNode: function(req, res){
+        let params = JSON.parse(req.body.params),
+            doc = params.doc;
+        rttFacade.updateTree(doc.compilationId, doc.engineerId, doc.userId, doc).then(function (rst) {
+            if (rst) {
+                //success
+                callback(req,res, false, "", rst);
+            } else {
+                //failed
+                callback(req,res, true, "更新失败!", null);
+            }
+        })
+    },
+    removeTreeRootNode: function (req, res) {
         let params = JSON.parse(req.body.params),
-            lastNodeId = params.lastNodeId,
-            nodeData = params.rawNodeData;
-        counter.counterDAO.getIDAfterCount(counter.moduleName.report, 1, function(err, result){
-            nodeData.ID = result.value.sequence_value;
-            let node = new TreeNodeModel(nodeData);
-            node.save(function (err, result) {
-                if (err) {
-                    callback(req,res, "树节点错误!", "", null);
+            compilationId = params.compilationId,
+            engineerId = params.engineerId,
+            userId = params.userId,
+            isPhysically = params.isPhysically
+            ;
+        if (isPhysically) {
+            rttFacade.removeTreePhycically(compilationId, engineerId, userId).then(function (rst) {
+                if (rst) {
+                    //success
+                    callback(req,res, false, "", rst);
                 } else {
-                    if (lastNodeId > 0) {
-                        TreeNodeModel.update({ID: lastNodeId}, {"NextSiblingID": nodeData.ID}, function(err, rst){
-                            if (err) {
-                                callback(req,res, "树节点错误!", "", null);
-                            } else {
-                                callback(req,res, false, "", result);
-                            }
-                        });
-                    } else callback(req,res, false, "", result);
+                    //failed
+                    callback(req,res, true, "删除失败!", null);
                 }
-            });
-        });
+            })
+        } else {
+            rttFacade.removeTree(compilationId, engineerId, userId).then(function (rst) {
+                if (rst) {
+                    //success
+                    callback(req,res, false, "", rst);
+                } else {
+                    //failed
+                    callback(req,res, true, "删除失败!", null);
+                }
+            })
+        }
     },
+    // createTplTreeNode: function(req, res){
+    //     let params = JSON.parse(req.body.params),
+    //         lastNodeId = params.lastNodeId,
+    //         nodeData = params.rawNodeData;
+    //     counter.counterDAO.getIDAfterCount(counter.moduleName.report, 1, function(err, result){
+    //         nodeData.ID = result.value.sequence_value;
+    //         let node = new TreeNodeModel(nodeData);
+    //         node.save(function (err, result) {
+    //             if (err) {
+    //                 callback(req,res, "树节点错误!", "", null);
+    //             } else {
+    //                 if (lastNodeId > 0) {
+    //                     TreeNodeModel.update({ID: lastNodeId}, {"NextSiblingID": nodeData.ID}, function(err, rst){
+    //                         if (err) {
+    //                             callback(req,res, "树节点错误!", "", null);
+    //                         } else {
+    //                             callback(req,res, false, "", result);
+    //                         }
+    //                     });
+    //                 } else callback(req,res, false, "", result);
+    //             }
+    //         });
+    //     });
+    // },
     createDftRptTpl: function(req, res) {
         let params = JSON.parse(req.body.params),
             treeNodeId = params.treeNodeId,

+ 3 - 3
modules/reports/facade/rpt_tpl_tree_node_facade.js

@@ -29,17 +29,17 @@ async function createNewTree(doc) {
 }
 
 async function updateTree(compilationId, engineerId, userId, doc) {
-    let filter = {"compilationId": compilationId, "engineerId": engineerId, "userId": userId};
+    let filter = {"compilationId": compilationId, "engineerId": engineerId, "userId": userId, "$or": [{"isDeleted": null}, {"isDeleted": false}]};
     return await rpt_tpl_tree_mdl.update(filter, doc);
 }
 
 async function removeTree(compilationId, engineerId, userId, cb) {
-    let filter = {"compilationId": compilationId, "engineerId": engineerId, "userId": userId};
+    let filter = {"compilationId": compilationId, "engineerId": engineerId, "userId": userId, "$or": [{"isDeleted": null}, {"isDeleted": false}]};
     return await rpt_tpl_tree_mdl.findAndModify(filter, [], { $set: { "isDeleted": true } }, {'new':true}, cb);
 }
 
 async function removeTreePhycically(compilationId, engineerId, userId) {
-    let filter = {"compilationId": compilationId, "engineerId": engineerId, "userId": userId};
+    let filter = {"compilationId": compilationId, "engineerId": engineerId, "userId": userId, "$or": [{"isDeleted": null}, {"isDeleted": false}]};
     return await rpt_tpl_tree_mdl.remove(filter);
 }
 

+ 4 - 1
modules/reports/routes/rpt_tpl_router.js

@@ -15,13 +15,16 @@ module.exports = function (app) {
         }
     });
 
-    rptTplRouter.post('/createTplTreeNode', reportTplController.createTplTreeNode);
+    rptTplRouter.post('/createTreeRootNode', reportTplController.createTreeRootNode);
+    rptTplRouter.post('/updateTreeRootNode', reportTplController.updateTreeRootNode);
+    rptTplRouter.post('/removeTreeRootNode', reportTplController.removeTreeRootNode);
     rptTplRouter.post('/getRptTplTree', reportTplController.getRptTplTree);
     rptTplRouter.post('/updateRptTplNodes', reportTplController.updateTreeNodes);
     rptTplRouter.post('/deleteRptTplNodes', reportTplController.deleteRptTplNodes);
     rptTplRouter.post('/createDftRptTpl', reportTplController.createDftRptTpl);
     rptTplRouter.post('/getRefRptTpl', reportTplController.getRefRptTpl);
     rptTplRouter.post('/updateRptTpl', reportTplController.updateRptTpl);
+    rptTplRouter.post('/getCompilationList', reportTplController.getCompilationList);
 
     rptTplRouter.post('/getUserRptCfg', reportCfgController.getReportUserCfg);
     rptTplRouter.post('/getMappingFields', reportCfgController.getAllMappingFields);

+ 11 - 10
modules/reports/rpt_component/jpc_value_define.js

@@ -1,13 +1,14 @@
-const fs = require('fs');
-let VAL_DEF = null;
+import fs from 'fs';
 
-let getValDefine = function() {
-    if (!(VAL_DEF)) {
-        let data = fs.readFileSync(__dirname.slice(0, __dirname.length - 30) + '/public/web/rpt_value_define.js', 'utf8', 'r');
-        eval(data + ' ; VAL_DEF = JV;');
-    }
-    return VAL_DEF;
-}
+function getValDefine() {
+    let tmpRst = null;
+    let data = fs.readFileSync(__dirname.slice(0, __dirname.length - 30) + '/public/web/rpt_value_define.js', 'utf8', 'r');
+    eval(data + ' ; tmpRst = JV;');
+    return tmpRst;
+};
 
+const VAL_DEF = getValDefine();
 
-module.exports = getValDefine();
+//export default VAL_DEF;
+//export {VAL_DEF as default};
+module.exports = VAL_DEF;

+ 2 - 2
public/web/rpt_value_define.js

@@ -1,7 +1,7 @@
 /**
  * Created by Tony on 2017/6/7.
  */
-let JV = {
+const JV = {
     NODE_CROSS_INFO: "交叉表_信息",
     NODE_CROSS_ROW: "交叉行",
     NODE_CROSS_COL: "交叉列",
@@ -211,4 +211,4 @@ let JV = {
     ANTI_VERTICAL_ANGLE: "-90",
 
     LAST_DEF: ""
-}
+};

+ 0 - 19
public/web/ztree_common.js

@@ -4,25 +4,6 @@
 zTreeHelper = {
     createTree: function(sourceData, setting, containerId, caller){
         let me = this, treeArr = tree_Data_Helper.buildTreeNodeDirectly(sourceData);
-        // let private_build_parentNodeIds = function(pNodeId, nodesArr){
-        //     let rst = [];
-        //     for (let i = 0; i < nodesArr.length; i++) {
-        //         if (nodesArr[i].items.length > 0) {
-        //             rst = rst.concat(private_build_parentNodeIds(nodesArr[i].ID, nodesArr[i].items));
-        //         } else {
-        //             rst.push(nodesArr[i].ID);
-        //         }
-        //     }
-        //     if (pNodeId && rst.length > 0) {
-        //         caller.parentNodeIds["_pNodeId_" + pNodeId] = rst;
-        //     }
-        //     return rst;
-        // };
-        // if (caller.parentNodeIds) {
-        //     private_build_parentNodeIds(null, treeArr);
-        // }
-        // caller.treeObj = $.fn.zTree.init($("#" + containerId), setting, treeArr);
-        // caller.treeObj.expandAll(true);
         me.createTreeDirectly(treeArr, setting, containerId, caller);
     },
     createTreeDirectly: function (treeArr, setting, containerId, caller) {

+ 9 - 9
test/unit/reports/rpt_tpl_tree_test.js

@@ -24,8 +24,8 @@ test('测试 - 创建dummy报表树: ', function (t) {
     tprTplTree.isDeleted = false;
     tprTplTree.items = [];
 
-    tprTplTree.items.push( {nodeType: 1, refId: -1, name: "【封-1】招标工程量清单", items: null} );
-    tprTplTree.items.push( {nodeType: 1, refId: -1, name: "【表-09】分部分项工程/施工技术措施项目清单计价表", items: null} );
+    tprTplTree.items.push( {nodeType: 2, refId: -1, name: "【封-1】招标工程量清单", items: null} );
+    tprTplTree.items.push( {nodeType: 2, refId: -1, name: "【表-09】分部分项工程/施工技术措施项目清单计价表", items: null} );
 
     let results = rttFacade.createNewTree(tprTplTree);
     results.then(function(rst) {
@@ -48,8 +48,8 @@ test('测试 - 创建dummy报表树2: ', function (t) {
     tprTplTree.isDeleted = false;
     tprTplTree.items = [];
 
-    tprTplTree.items.push( {nodeType: 1, refId: -1, name: "【封-1】招标工程量清单", items: null} );
-    tprTplTree.items.push( {nodeType: 1, refId: -1, name: "【表-09】分部分项工程/施工技术措施项目清单计价表", items: null} );
+    tprTplTree.items.push( {nodeType: 2, refId: -1, name: "【封-1】招标工程量清单", items: null} );
+    tprTplTree.items.push( {nodeType: 2, refId: -1, name: "【表-09】分部分项工程/施工技术措施项目清单计价表", items: null} );
 
     let results = rttFacade.createNewTree(tprTplTree);
     results.then(function(rst) {
@@ -60,7 +60,7 @@ test('测试 - 创建dummy报表树2: ', function (t) {
 });
 //*/
 
-/*
+//*
 test('测试 - 更新 dummy报表树2: ', function (t) {
     let tprTplTree = {};
     tprTplTree.compilationId = "598d239605cdd825682925d1";
@@ -72,9 +72,9 @@ test('测试 - 更新 dummy报表树2: ', function (t) {
     tprTplTree.isDeleted = false;
     tprTplTree.items = [];
 
-    tprTplTree.items.push( {nodeType: 1, refId: -1, name: "【封-1】招标工程量清单", items: null} );
-    tprTplTree.items.push( {nodeType: 1, refId: -1, name: "【表-09】分部分项工程/施工技术措施项目清单计价表", items: null} );
-    tprTplTree.items.push( {nodeType: 1, refId: -1, name: "【表-09-1】分部分项工程/施工技术措施项目清单计价表(一)", items: null} );
+    tprTplTree.items.push( {nodeType: 2, refId: -1, name: "【封-1】招标工程量清单", items: null} );
+    tprTplTree.items.push( {nodeType: 2, refId: -1, name: "【表-09】分部分项工程/施工技术措施项目清单计价表", items: null} );
+    tprTplTree.items.push( {nodeType: 2, refId: -1, name: "【表-09-1】分部分项工程/施工技术措施项目清单计价表(一)", items: null} );
 
     let results = rttFacade.updateTree(tprTplTree.compilationId, tprTplTree.engineerId, tprTplTree.userId, tprTplTree);
     results.then(function(rst) {
@@ -122,7 +122,7 @@ test('测试 - find dummy 报表树 by ObjectId: ', function (t) {
 });
 //*/
 
-//*
+/*
 test('测试 - find dummy 报表树 ', function (t) {
     let results = rttFacade.findTplTree("598d239605cdd825682925d1", [1], [-101]);
     results.then(function(rst) {

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

@@ -194,3 +194,51 @@ let selectableFieldSetting = {
         beforeDrop: selectableFiledTreeOprObj.onBeforeDrop
     }
 };
+
+const engineering = {
+    // 建筑工程
+    ARCHITECTURE: 1,
+    // 装饰工程
+    DECORATE: 2,
+    // 仿古建筑工程
+    ANTIQUE_ARCHITECTURE: 3,
+    // 安装工程
+    BUILD_IN: 4,
+    // 市政土建工程
+    MUNICIPAL_CONSTRUCTION: 5,
+    // 市政安装工程
+    MUNICIPAL_BUILD_IN: 6,
+    // 人工土石方工程
+    ARTIFICIAL_EARTHWORK: 7,
+    // 机械土石方工程
+    MECHANICAL_EARTHWORK: 8,
+    // 炉窖砌筑工程
+    KILN_MASONRY: 9,
+    // 园林工程
+    GARDEN: 10,
+    // 绿化工程
+    PLANTING: 11,
+    // 单拆除工程
+    DISMANTLE: 12,
+    // 建筑修缮工程
+    BUILDING_REPAIR: 13,
+    // 安装修缮工程
+    BUILD_IN_REPAIR: 14
+};
+
+const engineeringList = [
+    {name: "建筑工程", value: engineering.ARCHITECTURE},
+    {name: "装饰工程", value: engineering.DECORATE},
+    {name: "仿古建筑工程", value: engineering.ANTIQUE_ARCHITECTURE},
+    {name: "安装工程", value: engineering.BUILD_IN},
+    {name: "市政土建工程", value: engineering.MUNICIPAL_CONSTRUCTION},
+    {name: "市政安装工程", value: engineering.MUNICIPAL_BUILD_IN},
+    {name: "人工土石方工程", value: engineering.ARTIFICIAL_EARTHWORK},
+    {name: "机械土石方工程", value: engineering.MECHANICAL_EARTHWORK},
+    {name: "炉窖砌筑工程", value: engineering.KILN_MASONRY},
+    {name: "园林工程", value: engineering.GARDEN},
+    {name: "绿化工程", value: engineering.PLANTING},
+    {name: "单拆除工程", value: engineering.DISMANTLE},
+    {name: "建筑修缮工程", value: engineering.BUILDING_REPAIR},
+    {name: "安装修缮工程", value: engineering.BUILD_IN_REPAIR},
+];

+ 432 - 134
web/maintain/report/js/rpt_tpl_main.js

@@ -2,8 +2,9 @@
 
 let rptTplObj = {
     iniPage: function() {
-        //zTreeOprObj.getReportTemplateTree(RT.GrpType.CONSTRUCT);
-        zTreeOprObj.getReportTemplateTree("598d239605cdd825682925d1", [1,2]);
+        zTreeOprObj.iniEngineerIdList();
+        zTreeOprObj.getCompilationList();
+        // zTreeOprObj.getReportTemplateTree(RT.GrpType.CONSTRUCT);
         bandTreeOprObj.getReportTplCfg();
         selectableFiledTreeOprObj.iniTree();
         preview_util.drawBorder($("#tplCanvas")[0]);
@@ -13,35 +14,28 @@ let rptTplObj = {
 let zTreeOprObj = {
     treeObj: null,
     currentNode: null,
+    iniEngineerIdList: function() {
+        for (let item of engineeringList) {
+            $("#engineerIds").append("<option value='" + item.value + "'>" + item.name + "</option>");
+        }
+    },
     getCompilationList: function(){
-        //
-    },
-    // getReportTemplateTree: function(grpType) {
-    //     let me = zTreeOprObj, params = {};
-    //     params.grpType = grpType;
-    //     params.userId = (userAccount ===  'admin')?('-100'):userID;
-    //     params.tplType = RT.TplType.ALL;
-    //     CommonAjax.postEx("report_tpl_api/getRptTplTree", params, 20000, true, function(result){
-    //             zTreeHelper.createTree(result, setting, "rptTplTree", me);
-    //             me.refreshNodes();
-    //         }, null, null
-    //     );
-    // },
-    getReportTemplateTree: function(compilationId, engineerId) {
         let me = zTreeOprObj, params = {};
-        params.compilationId = compilationId;
-        params.userId = (userAccount ===  'admin')?(parseInt(-100)):parseInt(userID);
-        params.engineerId = engineerId;
-        CommonAjax.postEx("report_tpl_api/getRptTplTree", params, 20000, true, function(result){
-                zTreeHelper.createTreeDirectly(result, setting, "rptTplTree", me);
-                me.refreshNodes();
+        CommonAjax.postEx("report_tpl_api/getCompilationList", params, 20000, true, function(result){
+                //console.log(result);
+                for (let item of result) {
+                    if (item.is_release) {
+                        $("#compilations").append("<option value='" + item._id + "'>" + item.name + "</option>");
+                    }
+                }
+                me.getReportTemplateTree($("#compilations").get(0));
             }, null, null
         );
     },
     refreshNodes: function() {
         let me = this;
         let private_setupIsParent = function(node){
-            if (node.nodeType == RT.NodeType.NODE) {
+            if (node.nodeType === RT.NodeType.NODE || node.level === 0) {
                 node.isParent = true;
             } else {
                 node.isParent = false;
@@ -58,6 +52,364 @@ let zTreeOprObj = {
         }
         me.treeObj.refresh();
     },
+    updateNodes: function(nodes){
+        if (nodes && nodes.length > 0) {
+            let me = this;
+            for (let i = 0; i < nodes.length; i++) {
+                if (nodes[i].__v != null) node.__v = nodes[i].__v + 1
+                else nodes[i].__v = 0;
+            }
+            let params = {};
+            params.nodes = nodes;
+            CommonAjax.postEx("report_tpl_api/updateRptTplNodes", params, 5000, true, null, null, null);
+        }
+    },
+    removeTreeRootNode: function(rawNode, isSync, callback, failCallback) {
+        let params = {};
+        params.compilationId = rawNode.compilationId;
+        params.engineerId = rawNode.engineerId;
+        params.userId = rawNode.userId;
+        params.isPhysically = true;
+        CommonAjax.postEx("report_tpl_api/removeTreeRootNode", params, 5000, isSync, callback, failCallback, null);
+    },
+    updateTreeRootNode: function(rawNode, isSync, callback, failCallback) {
+        let params = {};
+        params.doc = rawNode;
+        CommonAjax.postEx("report_tpl_api/updateTreeRootNode", params, 5000, isSync, callback, failCallback, null);
+    },
+    createIniNode: function() {
+        let rst = {
+            nodeType: RT.NodeType.TEMPLATE,
+            refId: -1,
+            name: "",
+            items: null
+        };
+        return rst;
+    },
+    buildRootNodeDoc: function(topNode, excludeNode) {
+        let me = this, rst = null;
+        let private_build_items = function (items) {
+            let itemRst = null;
+            if (items && items.length > 0) {
+                itemRst = [];
+                for (let item of items) {
+                    if (item !== excludeNode) {
+                        let ir = {};
+                        ir.nodeType = item.nodeType;
+                        ir.refId = item.refId;
+                        ir.name = item.name;
+                        ir.items = private_build_items(item.items);
+                        itemRst.push(ir);
+                    }
+                }
+            }
+            return itemRst;
+        }
+        if (topNode) {
+            rst = {
+                compilationId: topNode.compilationId,
+                engineerId: topNode.engineerId,
+                userId: topNode.userId,
+                properties: topNode.properties,
+                released: topNode.released,
+                isDeleted: topNode.isDeleted,
+                items: private_build_items(topNode.items),
+                name: topNode.name
+            };
+        }
+        return rst;
+    },
+    createNodeFromZTreeNode: function(treeNode) {
+        let rst = {};
+        rst.ID = treeNode.ID;
+        rst.ParentID = treeNode.ParentID;
+        rst.NextSiblingID = treeNode.NextSiblingID;
+        rst.grpType = treeNode.grpType;
+        rst.nodeType = treeNode.nodeType;
+        rst.tplType = treeNode.tplType;
+        rst.userId = treeNode.userId;
+        rst.refId = treeNode.refId;
+        rst.name = treeNode.name;
+        return rst;
+    },
+
+    //*
+    addHoverDom: function(treeId, treeNode) {
+        let me = zTreeOprObj, sObj = $("#" + treeNode.tId + "_span");
+        if (treeNode.editNameFlag || $("#addBtn_"+treeNode.tId).length > 0 || treeNode.nodeType == RT.NodeType.TEMPLATE) return;
+        let addStr = "<span class='button add' id='addBtn_" + treeNode.tId + "' title='新增子节点' onfocus='this.blur();'></span>";
+        sObj.after(addStr);
+        let btn = $("#addBtn_"+treeNode.tId);
+        if (btn) btn.bind("click", function(){
+            let rawNode = me.createIniNode();
+            rawNode.nodeType = RT.NodeType.NODE;
+            rawNode.name = "新增子节点";
+            let newNodes = [], isSilent = false;
+            newNodes.push(rawNode);
+            if (me.treeObj) {
+                let insertIdx = -1;
+                if (treeNode.items.length > 0) {
+                    for (let i = treeNode.items.length - 1; i >= 0; i--) {
+                        if (treeNode.items[i].nodeType === RT.NodeType.NODE) {
+                            insertIdx = i + 1;
+                            break;
+                        } else {
+                            insertIdx = i;
+                        }
+                    }
+                }
+                me.treeObj.addNodes(treeNode, insertIdx, newNodes, isSilent);
+                let tn = me.getTopNodeByCurrentNode(treeNode);
+                let newTopNode = me.buildRootNodeDoc(tn);
+                me.updateTreeRootNode(newTopNode, true, function(rst){
+                    if (rst) {
+                        //
+                    } else {
+                        alert("新增节点失败!");
+                    }
+                    me.refreshNodes();
+                }, null);
+            }
+        });
+    },
+    removeHoverDom: function(treeId, treeNode) {
+        $("#addBtn_"+treeNode.tId).unbind().remove();
+    },
+    addNewNodeEx: function(rawNode, callback, failCallback) {
+        let params = {};
+        params.doc = rawNode;
+        CommonAjax.postEx("report_tpl_api/createTreeRootNode", params, 5000, true, callback, failCallback, null);
+    },
+    moveUpNode: function() {
+        let me = this;
+        if (me.currentNode && me.currentNode.getPreNode() && me.currentNode.level > 0) {
+            let preNode = me.currentNode.getPreNode();
+            if (preNode.nodeType === me.currentNode.nodeType) {
+                me.treeObj.moveNode(preNode, me.currentNode, "prev", true);
+                //then update the db
+                let topPNode = me.getTopNodeByCurrentNode(preNode);
+                me.updateTreeRootNode(topPNode, true, function(rst){
+                    if (!(rst)) {
+                        alert("移动请求失败!");
+                    }
+                });
+            }
+        }
+    },
+    moveDownNode: function() {
+        let me = this;
+        if (me.currentNode && me.currentNode.getNextNode() && me.currentNode.level > 0) {
+            let nextNode = me.currentNode.getNextNode();
+            if (nextNode.nodeType === me.currentNode.nodeType) {
+                me.treeObj.moveNode(nextNode, me.currentNode, "next", true);
+                //then update the db
+                let topPNode = me.getTopNodeByCurrentNode(nextNode);
+                me.updateTreeRootNode(topPNode, true, function(rst){
+                    if (!(rst)) {
+                        alert("移动请求失败!");
+                    }
+                });
+            }
+        }
+    },
+    getReportTemplateTree: function(compilationSelect) {
+        let me = zTreeOprObj, params = {};
+        params.compilationId = compilationSelect.value;
+        params.userId = (userAccount ===  'admin')?(parseInt(-100)):parseInt(userID);
+        let allEngIds = [];
+        for (let item of engineeringList) {
+            allEngIds.push(item.value);
+        }
+        params.engineerId = allEngIds;
+        CommonAjax.postEx("report_tpl_api/getRptTplTree", params, 20000, true, function(result){
+            result.sort(function(item1, item2){
+                let rst = 0;
+                if (item1.userId < item2.userId) {
+                    rst = 1
+                } else if (item1.userId > item2.userId) {
+                    rst = -1;
+                } else {
+                    rst = (item1.engineerId > item2.engineerId)?1:((item1.engineerId < item2.engineerId)?-1:0);
+                }
+                return rst;
+            });
+            zTreeHelper.createTreeDirectly(result, setting, "rptTplTree", me);
+            me.refreshNodes();
+        }, null, null);
+    },
+    addTplNode: function (){
+        let me = this;
+        if (me.currentNode && me.currentNode.nodeType === RT.NodeType.NODE || me.currentNode.level === 0) {
+            let rawNode = me.createIniNode();
+            rawNode.nodeType = RT.NodeType.TEMPLATE;
+            rawNode.name = "新增报表模板";
+            let newNodes = [], isSilent = false;
+            newNodes.push(rawNode);
+            if (me.treeObj) {
+                me.treeObj.addNodes(me.currentNode, -1, newNodes, isSilent);
+                let rawNode = me.buildRootNodeDoc(me.currentNode);
+                me.updateTreeRootNode(rawNode, true, function(rst){
+                    if (rst) {
+                        //
+                    } else {
+                        //
+                    }
+                    me.refreshNodes();
+                }, null);
+
+            }
+        }
+    },
+    addRootNode: function() {
+        let me = this, rawNode = me.createIniRootNode();
+        if (!me.chkIfDupRootNode(rawNode)) {
+            me.addNewNodeEx(rawNode, function(rst){
+                if (rst) {
+                    let newNodes = [], isSilent = false;
+                    rawNode.isParent = true;
+                    newNodes.push(rawNode);
+                    if (me.treeObj) {
+                        let insertIdx = -1;
+                        let nodes = me.treeObj.getNodes();
+                        for (let i = 0; i < nodes.length; i++) {
+                            if (nodes[i].compilationId === rawNode.compilationId) {
+                                if (nodes[i].engineerId > rawNode.engineerId) {
+                                    insertIdx = i;
+                                    break;
+                                }
+                            }
+                        }
+                        me.treeObj.addNodes(null, insertIdx, newNodes, isSilent);
+                    } else {
+                        me.treeObj = $.fn.zTree.init($("#rptTplTree"), setting, newNodes);
+                    }
+                } else {
+                    alert("创建失败,请确认是否有重复类型跟节点!")
+                }
+            }, null);
+        } else {
+            alert("有重复编办及工程类型!");
+        }
+    },
+    chkIfDupRootNode: function (rawNode) {
+        let me = this, rst = false;
+        if (me.treeObj) {
+            let nodes = me.treeObj.getNodes();
+            for (let node of nodes) {
+                if (node.compilationId === rawNode.compilationId && node.engineerId === rawNode.engineerId && node.userId === rawNode.userId) {
+                    rst = true;
+                    break;
+                }
+            }
+        }
+        return rst;
+    },
+    createIniRootNode: function() {
+        let rst = {
+            compilationId: $("#compilations").get(0).selectedOptions[0].value,
+            engineerId: parseInt($("#engineerIds").get(0).selectedOptions[0].value),
+            userId: (userAccount ===  'admin')?(-100):userID,
+            properties: [],
+            released: true,
+            isDeleted: false,
+            items: [],
+            name: $("#compilations").get(0).selectedOptions[0].innerText + $("#engineerIds").get(0).selectedOptions[0].innerText
+        };
+        return rst;
+    },
+    onBeforeRemove: function(treeId, treeNode){
+        let canRemove = false;
+        if (!(treeNode.items) || treeNode.items.length < 1) {
+            canRemove = true;
+        } else {
+            alert("含有子项,不能删除!");
+        }
+        return canRemove;
+    },
+    onRemove: function(e, treeId, treeNode){
+        let me = zTreeOprObj, topPNode = me.getTopNodeByCurrentNode(treeNode);
+        let rawNode = me.buildRootNodeDoc(topPNode, treeNode);
+        if (treeNode.level === 0) rawNode.isDeleted = true;
+        me.removeTreeRootNode(rawNode, true, function(rst){
+            if (!(rst)) {
+                alert("删除请求失败!");
+            }
+        });
+        me.refreshNodes();
+    },
+    beforeRename: function(treeId, treeNode, newName, isCancel) {
+        if (newName.length === 0) {
+            return false;
+        }
+        return true;
+    },
+    onRename : function(e, treeId, treeNode, isCancel) {
+        if (!isCancel) {
+            let me = zTreeOprObj, topPNode = me.getTopNodeByCurrentNode(treeNode);
+            let rawNode = me.buildRootNodeDoc(topPNode);
+            me.updateTreeRootNode(rawNode, true, function(rst){
+                if (rst) {
+                    //
+                } else {
+                    alert('修改名称请求失败!');
+                }
+            });
+        }
+    },
+    /*/
+    addHoverDom: function(treeId, treeNode) {
+        let me = zTreeOprObj, sObj = $("#" + treeNode.tId + "_span");
+        if (treeNode.editNameFlag || $("#addBtn_"+treeNode.tId).length > 0 || treeNode.nodeType == RT.NodeType.TEMPLATE) return;
+        let addStr = "<span class='button add' id='addBtn_" + treeNode.tId + "' title='新增子节点' onfocus='this.blur();'></span>";
+        sObj.after(addStr);
+        let btn = $("#addBtn_"+treeNode.tId);
+        if (btn) btn.bind("click", function(){
+            let rawNode = me.createIniRootNode(), lastNodeId = -1, insertIdx = -1, lastNode = null;
+            rawNode.ParentID = treeNode.ID;
+            rawNode.name = "新增子节点";
+            if (treeNode.items.length > 0) {
+                for (let i = treeNode.items.length - 1; i >= 0; i--) {
+                    if (treeNode.items[i].nodeType == RT.NodeType.NODE) {
+                        lastNodeId = treeNode.items[i].ID;
+                        lastNode = treeNode.items[i];
+                        rawNode.NextSiblingID = treeNode.items[i].NextSiblingID;
+                        insertIdx = i + 1;
+                        break;
+                    } else {
+                        rawNode.NextSiblingID = treeNode.items[i].ID;
+                        insertIdx = i;
+                    }
+                }
+            }
+            zTreeOprObj.addNewNode(rawNode, lastNodeId, function(rst){
+                let newNodes = [], isSilent = false;
+                if (lastNode) {
+                    lastNode.NextSiblingID = rst.ID;
+                }
+                rawNode.ID = rst.ID;
+                rawNode.NextSiblingID = rst.NextSiblingID;
+                rawNode.isParent = true;
+                rawNode.items = [];
+                newNodes.push(rawNode);
+                treeNode.isParent = true;
+                if (me.treeObj) {
+                    me.treeObj.addNodes(treeNode, insertIdx, newNodes, isSilent);
+                } else {
+                    me.treeObj = $.fn.zTree.init($("#rptTplTree"), setting, newNodes);
+                }
+            }, null);
+        });
+    },
+    removeHoverDom: function(treeId, treeNode) {
+        $("#addBtn_"+treeNode.tId).unbind().remove();
+    },
+
+    addNewNode: function(rawNode, lastNodeId, callback, failCallback) {
+        let params = {};
+        params.lastNodeId = lastNodeId;
+        params.rawNodeData = rawNode;
+        CommonAjax.postEx("report_tpl_api/createTplTreeNode", params, 5000, true, callback, failCallback, null);
+    },
     moveUpNode: function() {
         let me = this, nodes = [];
         if (me.currentNode && me.currentNode.getPreNode()) {
@@ -92,42 +444,16 @@ let zTreeOprObj = {
             me.updateNodes(nodes);
         }
     },
-    addRootNode: function() {
-        let me = this, rawNode = me.createIniRootNode(), lastNodeId = -1, lastNode = null;
-        if (me.treeObj) {
-            let rootNodes = me.treeObj.getNodes();
-            if (rootNodes.length > 0) {
-                lastNodeId = rootNodes[rootNodes.length - 1].ID;
-                lastNode = rootNodes[rootNodes.length - 1];
-            }
-            me.addNewNode(rawNode, lastNodeId, function(rst){
-                let newNodes = [], isSilent = false;
-                if (lastNode) {
-                    lastNode.NextSiblingID = rst.ID;
-                }
-                rawNode.ID = rst.ID;
-                rawNode.isParent = true;
-                rawNode.items = [];
-                newNodes.push(rawNode);
-                if (me.treeObj) {
-                    me.treeObj.addNodes(null, -1, newNodes, isSilent);
-                } else {
-                    me.treeObj = $.fn.zTree.init($("#rptTplTree"), setting, newNodes);
-                }
-            }, null);
-        }
-    },
-    updateNodes: function(nodes){
-        if (nodes && nodes.length > 0) {
-            let me = this;
-            for (let i = 0; i < nodes.length; i++) {
-                if (nodes[i].__v != null) node.__v = nodes[i].__v + 1
-                else nodes[i].__v = 0;
-            }
-            let params = {};
-            params.nodes = nodes;
-            CommonAjax.postEx("report_tpl_api/updateRptTplNodes", params, 5000, true, null, null, null);
-        }
+    getReportTemplateTree: function(grpType) {
+        let me = zTreeOprObj, params = {};
+        params.grpType = grpType;
+        params.userId = (userAccount ===  'admin')?('-100'):userID;
+        params.tplType = RT.TplType.ALL;
+        CommonAjax.postEx("report_tpl_api/getRptTplTree", params, 20000, true, function(result){
+                zTreeHelper.createTree(result, setting, "rptTplTree", me);
+                me.refreshNodes();
+            }, null, null
+        );
     },
     addTplNode: function (){
         let me = this;
@@ -160,85 +486,48 @@ let zTreeOprObj = {
             }
         }
     },
-    addNewNode: function(rawNode, lastNodeId, callback, failCallback) {
-        let params = {};
-        params.lastNodeId = lastNodeId;
-        params.rawNodeData = rawNode;
-        CommonAjax.postEx("report_tpl_api/createTplTreeNode", params, 5000, true, callback, failCallback, null);
-    },
-    createIniRootNode: function() {
-        let rst = {
-            ID: -1,
-            ParentID: -1,
-            NextSiblingID: -1,
-            grpType: RT.GrpType.CONSTRUCT,
-            nodeType: RT.NodeType.NODE,
-            tplType: RT.TplType.ALL,
-            userId: (userAccount ===  'admin')?('-100'):userID,
-            refId: -1,
-            name: '新增节点'
-        };
-        return rst;
-    },
-    createNodeFromZTreeNode: function(treeNode) {
-        let rst = {};
-        rst.ID = treeNode.ID;
-        rst.ParentID = treeNode.ParentID;
-        rst.NextSiblingID = treeNode.NextSiblingID;
-        rst.grpType = treeNode.grpType;
-        rst.nodeType = treeNode.nodeType;
-        rst.tplType = treeNode.tplType;
-        rst.userId = treeNode.userId;
-        rst.refId = treeNode.refId;
-        rst.name = treeNode.name;
-        return rst;
-    },
-    addHoverDom: function(treeId, treeNode) {
-        let me = zTreeOprObj, sObj = $("#" + treeNode.tId + "_span");
-        if (treeNode.editNameFlag || $("#addBtn_"+treeNode.tId).length > 0 || treeNode.nodeType == RT.NodeType.TEMPLATE) return;
-        let addStr = "<span class='button add' id='addBtn_" + treeNode.tId + "' title='新增子节点' onfocus='this.blur();'></span>";
-        sObj.after(addStr);
-        let btn = $("#addBtn_"+treeNode.tId);
-        if (btn) btn.bind("click", function(){
-            let rawNode = me.createIniRootNode(), lastNodeId = -1, insertIdx = -1, lastNode = null;
-            rawNode.ParentID = treeNode.ID;
-            rawNode.name = "新增子节点";
-            if (treeNode.items.length > 0) {
-                for (let i = treeNode.items.length - 1; i >= 0; i--) {
-                    if (treeNode.items[i].nodeType == RT.NodeType.NODE) {
-                        lastNodeId = treeNode.items[i].ID;
-                        lastNode = treeNode.items[i];
-                        rawNode.NextSiblingID = treeNode.items[i].NextSiblingID;
-                        insertIdx = i + 1;
-                        break;
-                    } else {
-                        rawNode.NextSiblingID = treeNode.items[i].ID;
-                        insertIdx = i;
-                    }
-                }
+
+    addRootNode: function() {
+        let me = this, rawNode = me.createIniRootNode(), lastNodeId = -1, lastNode = null;
+        if (me.treeObj) {
+            let rootNodes = me.treeObj.getNodes();
+            if (rootNodes.length > 0) {
+                lastNodeId = rootNodes[rootNodes.length - 1].ID;
+                lastNode = rootNodes[rootNodes.length - 1];
             }
-            zTreeOprObj.addNewNode(rawNode, lastNodeId, function(rst){
+            me.addNewNode(rawNode, lastNodeId, function(rst){
                 let newNodes = [], isSilent = false;
                 if (lastNode) {
                     lastNode.NextSiblingID = rst.ID;
                 }
                 rawNode.ID = rst.ID;
-                rawNode.NextSiblingID = rst.NextSiblingID;
                 rawNode.isParent = true;
                 rawNode.items = [];
                 newNodes.push(rawNode);
-                treeNode.isParent = true;
                 if (me.treeObj) {
-                    me.treeObj.addNodes(treeNode, insertIdx, newNodes, isSilent);
+                    me.treeObj.addNodes(null, -1, newNodes, isSilent);
                 } else {
                     me.treeObj = $.fn.zTree.init($("#rptTplTree"), setting, newNodes);
                 }
             }, null);
-        });
+        }
     },
-    removeHoverDom: function(treeId, treeNode) {
-        $("#addBtn_"+treeNode.tId).unbind().remove();
+
+    createIniRootNode: function() {
+        let rst = {
+            ID: -1,
+            ParentID: -1,
+            NextSiblingID: -1,
+            grpType: RT.GrpType.CONSTRUCT,
+            nodeType: RT.NodeType.NODE,
+            tplType: RT.TplType.ALL,
+            userId: (userAccount ===  'admin')?('-100'):userID,
+            refId: -1,
+            name: '新增节点'
+        };
+        return rst;
     },
+
     onBeforeRemove: function(treeId, treeNode){
         let nodeIds = [], preNode = treeNode.getPreNode(), preNodeId = -1, canRemove = false, params = {};
         if (preNode) {
@@ -266,14 +555,14 @@ let zTreeOprObj = {
     },
     onRemove: function(e, treeId, treeNode){
         let me = zTreeOprObj, pNode = me.treeObj.getNodeByTId(treeNode.parentTId);
-        if (pNode && pNode.items && pNode.items.length == 0) {
-            if (pNode.nodeType == RT.NodeType.NODE) pNode.isParent = true
+        if (pNode && pNode.items && pNode.items.length === 0) {
+            if (pNode.nodeType === RT.NodeType.NODE) pNode.isParent = true
             else pNode.isParent = false;
             me.treeObj.refresh();
         }
     },
     beforeRename: function(treeId, treeNode, newName, isCancel) {
-        if (newName.length == 0) {
+        if (newName.length === 0) {
             return false;
         }
         return true;
@@ -282,8 +571,8 @@ let zTreeOprObj = {
         let me = zTreeOprObj, nodes = [];
         nodes.push(me.createNodeFromZTreeNode(treeNode));
         me.updateNodes(nodes);
-        if (treeNode.nodeType == RT.NodeType.TEMPLATE && treeNode.refId >= 0) {
-            if (treeNode.rptTpl != null) {
+        if (treeNode.nodeType === RT.NodeType.TEMPLATE && treeNode.refId >= 0) {
+            if (treeNode.rptTpl !== null) {
                 treeNode.rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MAIN_INFO_RPT_NAME] = treeNode.name;
                 $("#rptTplName")[0].value = treeNode.rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MAIN_INFO_RPT_NAME];
             } else {
@@ -291,13 +580,14 @@ let zTreeOprObj = {
             }
         }
     },
+    //*/
     onClick: function(event,treeId,treeNode) {
         let me = zTreeOprObj;
         me.currentNode = treeNode;
         bandTreeOprObj.currentNode = null;
-        if (treeNode.nodeType == RT.NodeType.NODE) {
+        if (treeNode.nodeType === RT.NodeType.NODE) {
             $("#rpt_tpl_display_label")[0].innerText = "...";
-        } else if (treeNode.nodeType == RT.NodeType.TEMPLATE) {
+        } else if (treeNode.nodeType === RT.NodeType.TEMPLATE) {
             let showText = treeNode.name, parentNode = treeNode.getParentNode();
             while (parentNode !== null) {
                 showText = parentNode.name + ' > ' + showText;
@@ -315,12 +605,12 @@ let zTreeOprObj = {
     },
     createNewTpl: function () {
         let me = zTreeOprObj, params = {};
-        if (me.currentNode && me.currentNode.nodeType == RT.NodeType.TEMPLATE) {
+        if (me.currentNode && me.currentNode.nodeType === RT.NodeType.TEMPLATE) {
             params.treeNodeId = me.currentNode.ID;
             let rptTypeId = common_rpt_type_ids.flow;
             if ($("#crossTypeOpt")[0].checked) rptTypeId = common_rpt_type_ids.cross;
             if ($("#billTypeOpt")[0].checked) rptTypeId = common_rpt_type_ids.bill;
-            params.rptDftTplId = rptTypeId
+            params.rptDftTplId = rptTypeId;
             CommonAjax.postEx("report_tpl_api/createDftRptTpl", params, 20000, true, function(result){
                     me.currentNode.rptTpl = result;
                 }, null, null
@@ -329,7 +619,7 @@ let zTreeOprObj = {
     },
     chkAndRreshRefTpl: function() {
         let me = zTreeOprObj, params = {};
-        if (me.currentNode && me.currentNode.nodeType == RT.NodeType.TEMPLATE && me.currentNode.refId > 0) {
+        if (me.currentNode && me.currentNode.nodeType === RT.NodeType.TEMPLATE && me.currentNode.refId > 0) {
             if (!(me.currentNode.rptTpl)) {
                 params.rptTplId = me.currentNode.refId;
                 CommonAjax.postEx("report_tpl_api/getRefRptTpl", params, 20000, true, function(result){
@@ -346,7 +636,7 @@ let zTreeOprObj = {
     },
     getRefTpl: function() {
         let me = zTreeOprObj, rst = null;
-        if (me.currentNode && me.currentNode.nodeType == RT.NodeType.TEMPLATE && me.currentNode.refId > 0) {
+        if (me.currentNode && me.currentNode.nodeType === RT.NodeType.TEMPLATE && me.currentNode.refId > 0) {
             rst = me.currentNode.rptTpl
         }
         return rst;
@@ -355,7 +645,7 @@ let zTreeOprObj = {
         //模板信息
         rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MAIN_INFO_RPT_NAME] = $("#rptTplName")[0].value;
         rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_PAGE_SIZE] = JV.PAGES_SIZE_STR[$("#rptTplPageSize")[0].selectedIndex];
-        if ($("#rptTplPageOrientation")[0].selectedIndex == 1) {
+        if ($("#rptTplPageOrientation")[0].selectedIndex === 1) {
             rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_ORIENTATION] = JV.ORIENTATION_PORTRAIT;
         } else {
             rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_ORIENTATION] = JV.ORIENTATION_LANDSCAPE;
@@ -367,5 +657,13 @@ let zTreeOprObj = {
         rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS][JV.PROP_RIGHT] = $("#rptTplMarginRight")[0].value;
         rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS][JV.PROP_TOP] = $("#rptTplMarginTop")[0].value;
         rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS][JV.PROP_BOTTOM] = $("#rptTplMarginBottom")[0].value;
+    },
+    getTopNodeByCurrentNode: function (currentNode) {
+        let topPNode = currentNode, pNode = currentNode.getParentNode();
+        while (pNode !== null) {
+            topPNode = pNode;
+            pNode = pNode.getParentNode();
+        }
+        return topPNode;
     }
 };

+ 7 - 1
web/maintain/report/rpt_tpl_main.html

@@ -12,6 +12,9 @@
     <link rel="stylesheet" href="/lib/font-awesome/font-awesome.min.css">
     <!--zTree-->
     <link rel="stylesheet" href="/lib/ztree/css/zTreeStyle.css" type="text/css">
+    <style type="text/css">
+        .ztree li span.button.add{margin-right:2px;background-position:-144px 0;vertical-align:top;*vertical-align:middle}
+    </style>
     <script>
         // 这里的变量供页面调用
         var userAccount = '<%- userAccount %>';
@@ -34,7 +37,10 @@
                     <a class="nav-link px-3" href="#"><i class="fa fa-sign-out" aria-hidden="true"></i></a>
                 </li>
                 <li class="nav-item">
-                    <a class="nav-link active px-3" href="#">系统模板</a>
+                    <a class="nav-link active px-3" ><select class="form-control form-control-sm" id="compilations" onchange="zTreeOprObj.getReportTemplateTree(this)"></select></a>
+                </li>
+                <li class="nav-item">
+                    <a class="nav-link active px-3" ><select class="form-control form-control-sm" id="engineerIds"></select></a>
                 </li>
             </ul>
         </nav>