浏览代码

Merge branch 'master' into olym

olym 8 年之前
父节点
当前提交
e71b02e728

+ 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;

+ 7 - 1
modules/users/models/engineering_lib_model.js

@@ -59,7 +59,13 @@ class EngineeringLibModel extends BaseModel {
         if (data.main_tree_col) {
             data.main_tree_col = JSON.parse(data.main_tree_col);
         } else {
-            delete data['main_tree_col'];
+            data.main_tree_col = {
+                emptyRows: 3,
+                headRows: 0,
+                treeCol: 0,
+                headRowHeight: [],
+                cols:[]
+            }
         }
 
         let result = false;

+ 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) {

+ 1 - 1
web/maintain/ration_repository/dinge.html

@@ -458,7 +458,7 @@
                 });
 
                 $("#linkFZTJ").click(function(){
-                    rationGLJOprObj.unBindDel();
+                    rationCoeOprObj.bindRationCoeDel();
                     rdSpread.setActiveSheetIndex(2);
                 });
             });

+ 125 - 55
web/maintain/ration_repository/js/ration_coe.js

@@ -1,14 +1,16 @@
 /**
  * Created by CSL on 2017-06-08.
  */
+ //modified by zhong on 2017-09-25
 var rationCoeOprObj = {
     sheet: null,
     libID: null,
     curRation: null,
+    tempDelArr: [],
     cache: {},
     setting: {
         header:[
-            {headerName:"编码",headerWidth:120,dataCode:"ID", dataType: "Number"},
+            {headerName:"编码",headerWidth:120,dataCode:"ID", dataType: "Number", hAlign: 'left'},
             {headerName:"名称",headerWidth:400,dataCode:"name", dataType: "String"},
             {headerName:"内容",headerWidth:300,dataCode:"content", dataType: "String"}
         ],
@@ -27,7 +29,7 @@ var rationCoeOprObj = {
         me.sheet.bind(GC.Spread.Sheets.Events.ClipboardPasting, me.onClipboardPasting);
         me.sheet.bind(GC.Spread.Sheets.Events.ClipboardPasted, me.onClipboardPasted);
         me.sheet.bind(GC.Spread.Sheets.Events.EditEnded, me.onEditEnded);
-        me.sheet.bind(GC.Spread.Sheets.Events.RangeChanged, me.onRangeChanged);
+       // me.sheet.bind(GC.Spread.Sheets.Events.RangeChanged, me.onRangeChanged);
     },
 
     onClipboardPasting: function(sender, args) {
@@ -42,12 +44,49 @@ var rationCoeOprObj = {
         if (me.libID) {
             // 修改第一列(编号)
             if (info.cellRange.col == 0) {
+                me.tempDelArr = [];
                 var coeIDs = [];
-                var temp = sheetCommonObj.analyzePasteData({header:[{dataCode: "ID"}] }, info);
-                for (let obj of temp) {
-                    coeIDs.push(obj.ID);
-                };
+                var items = sheetCommonObj.analyzePasteData({header:[{dataCode: "ID"}] }, info);
+                let curCache = typeof me.cache["_Coe_" + me.curRation.ID] !== 'undefined' ? me.cache["_Coe_" + me.curRation.ID] : [];
+                let isRefresh = false;
+                for(let i = 0, len = items.length; i < len; i++){
+                    let row = i + info.cellRange.row;
+                    //update
+                    if(row < curCache.length){
+                        let isExist = false;
+                        for(let j = 0, jLen = curCache.length; j < jLen; j++){
+                            if(items[i].ID === curCache[j].ID && j !== row){
+                                isExist = true;
+                                break;
+                            }
+                        }
+                        if(!isExist){
+                            me.tempDelArr.push({org: curCache[row], newID: items[i].ID});
+                            coeIDs.push(items[i].ID);
+                        }
+                        else{
+                            isRefresh = true;
+                        }
+                    }
+                    else{
+                        coeIDs.push(items[i].ID);
+                    }
+                }
+                //delete in front
+                if(me.tempDelArr.length > 0){
+                   for(let i = 0, len = me.tempDelArr.length; i < len; i++){
+                       for(let j = 0; j < curCache.length; j++){
+                           if(me.tempDelArr[i].org.ID === curCache[j].ID){
+                               curCache.splice(j, 1);
+                               break;
+                           }
+                       }
+                   }
+                }
                 me.addCoeItems(coeIDs);
+                if(isRefresh){
+                    me.showCoeItems(me.curRation.ID);
+                }
             } else {
                 //修改其它列。
             }
@@ -56,52 +95,79 @@ var rationCoeOprObj = {
 
     onEditEnded: function(sender, args){
         var me = rationCoeOprObj;
-        if (args.col == 0) {   // 编号列
-            //delete
-            if (args.editingText == null || args.editingText.trim() == "") {
-                var curCache = me.cache["_Coe_" + me.curRation.ID];
-                if (curCache) {
-                    if (args.row < curCache.length) {
-                        curCache.splice(args.row, 1);
-                        me.updateCurRation();
-                        sheetCommonObj.cleanSheet(me.sheet, me.setting, -1);
-                        me.showCoeItems(me.curRation.ID);
+        if (args.col == 0 && args.editingText && args.editingText.toString().trim().length > 0 && !isNaN(args.editingText)) {   // 编号列
+            let curCahe = typeof me.cache["_Coe_" + me.curRation.ID] !== 'undefined' ? me.cache["_Coe_" + me.curRation.ID] : [];
+            me.tempDelArr = [];
+            //update
+            if(args.row < curCahe.length && args.editingText != curCahe[args.row].ID){
+                let isExist = false;
+                for(let i = 0, len = curCahe.length; i < len; i++){
+                    if(args.editingText == curCahe[i].ID){
+                        isExist = true;
+                        break;
                     }
                 }
-            } else {
-                if (me.libID) {
-                    var ID = args.editingText.trim();
-                    if (!isNaN(ID)) {
-                        me.addCoeItems([ID]);
-                    };
-                };
-            };
-        };
-    },
-
-    onRangeChanged: function(sender, args) {
-        if (args.action == GC.Spread.Sheets.RangeChangedAction.clear) {
-            if (!confirm(`确定要删除选中的 ${args.rowCount} 条附注条件吗?`)){return; }
-            var me = rationCoeOprObj;
-            if (args.col == 0) {
-                var curCache = me.cache["_Coe_" + me.curRation.ID];
-                if (curCache) {
-                    for (var i = args.rowCount - 1; i >= 0; i--) {
-                        if (args.row + i < curCache.length) {
-                            curCache.splice(args.row + i, 1);
-                        };
-                    };
-                    me.updateCurRation();
-                    sheetCommonObj.cleanSheet(me.sheet, me.setting, -1);
+                if(!isExist){
+                    me.tempDelArr.push({org: curCahe[args.row], newID: args.editingText});
+                    curCahe.splice(args.row, 1);
+                    me.addCoeItems([args.editingText]);
+                }
+                else{
                     me.showCoeItems(me.curRation.ID);
-                };
-            };
-        };
+                }
+            }
+            //insert
+            else{
+                me.addCoeItems([args.editingText]);
+            }
+        }
+        else{
+            me.showCoeItems(me.curRation.ID);
+        }
     },
 
+    bindRationCoeDel: function () {
+        let me = rationCoeOprObj;
+        let workBook = me.sheet.getParent();
+        workBook.commandManager().register('rationCoeDel', function () {
+            let sels = me.sheet.getSelections(), isUpdate = false;
+            let curCahe = me.cache["_Coe_" + me.curRation.ID];
+            for(let i = 0, len = sels.length; i < len; i ++ ){
+                if(sels[i].colCount === me.setting.header.length){
+                    if(sels[i].row < curCahe.length){
+                        isUpdate = true;
+                        curCahe.splice(sels[i].row, sels[i].rowCount);
+                    }
+                }
+            }
+            if(isUpdate){
+                me.updateCurRation();
+                sheetCommonObj.cleanData(me.sheet, me.setting, -1);
+                me.showCoeItems(me.curRation.ID);
+            }
+        });
+        workBook.commandManager().setShortcutKey(null, GC.Spread.Commands.Key.del, false, false, false, false);
+        workBook.commandManager().setShortcutKey('rationCoeDel', GC.Spread.Commands.Key.del, false, false, false, false);
+    },
+    getRecoveryArr: function (tempDelArr, newArr) {//获得更新的coe不存在,恢复删除的被更新数据
+        let rst = [];
+        for(let i = 0, len = tempDelArr.length; i < len; i++){
+            let isExist = false;
+            for(let j = 0, jLen = newArr.length; j < jLen; j++){
+                if(tempDelArr[i].newID == newArr[j].ID){
+                    isExist = true;
+                    break;
+                }
+            }
+            if(!isExist){
+                rst.push(tempDelArr[i].org);
+            }
+        }
+        return rst;
+    },
     addCoeItems: function(coeIDs) {
         var me = this;
-        sheetCommonObj.cleanSheet(me.sheet, me.setting, -1);
+        sheetCommonObj.cleanData(me.sheet, me.setting, -1);
 
         var curCache = me.cache["_Coe_" + me.curRation.ID];
         var temp = [];
@@ -142,14 +208,10 @@ var rationCoeOprObj = {
                         }else{
                             curCache = rstArr;
                         }
-
-                        curCache.sort(function(a, b) {
-                            var rst = 0;
-                            if (a.ID > b.ID) rst = 1
-                            else if (a.ID < b.ID) rst = -1;
-                            return rst;
-                        });
-
+                        let recoveryArr = me.getRecoveryArr(me.tempDelArr, result.data);
+                        if(recoveryArr.length > 0){
+                            curCache = curCache.concat(recoveryArr);
+                        }
                         me.cache["_Coe_" + me.curRation.ID] = curCache;
                         me.updateCurRation();
                         me.showCoeItems(me.curRation.ID);
@@ -186,7 +248,7 @@ var rationCoeOprObj = {
                 cache:false,
                 timeout:5000,
                 success:function(result){
-                    sheetCommonObj.cleanSheet(me.sheet, me.setting, -1);
+                    sheetCommonObj.cleanData(me.sheet, me.setting, -1);
                     if (result.data) {
                         var tempResult = [];
                         for (let obj of result.data) {
@@ -211,6 +273,12 @@ var rationCoeOprObj = {
         var me = this;
         var curCache = me.cache["_Coe_" + rationID];
         if (curCache) {
+            curCache.sort(function(a, b) {
+                var rst = 0;
+                if (a.ID > b.ID) rst = 1
+                else if (a.ID < b.ID) rst = -1;
+                return rst;
+            });
             sheetCommonObj.showData(me.sheet, me.setting, curCache);
         }
     },
@@ -230,4 +298,6 @@ var rationCoeOprObj = {
             };
         };
     }
-}
+}
+
+

+ 0 - 1
web/maintain/ration_repository/js/ration_glj.js

@@ -342,7 +342,6 @@ var rationGLJOprObj = {
                 //sheetCommonObj.cleanSheet(me.sheet, me.setting, -1);
                 if (result) {
                     if(result.data.length > 0){
-                        console.log(`enter1`);
                         //sheetCommonObj.cleanSheet(me.sheet, me.setting, -1);
                         sheetCommonObj.cleanData(me.sheet, me.setting, -1);
                         var rstArr = [], dummyR = {gljId: 0, consumeAmt:0}, newAddArr = [];

+ 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>

+ 8 - 2
web/users/js/col_setting.js

@@ -12,7 +12,7 @@ let ColSettingObj = {
         readOnly: null,
         checkBox: null
     },
-    Rows: {data: 0, filedName: 0, getText: 1, wordWrap: 2, cellType: 3, width: 4, readOnly: 5, showHint: 6, visible: 7},
+    Rows: {data: 0, filedName: 0, getText: 1, wordWrap: 2, cellType: 3, width: 4, readOnly: 5, showHint: 6, visible: 7, customize: 8},
     columnValueChanged: function (e, info) {
         let that = ColSettingObj;
         info.colList.forEach(function (iCol) {
@@ -67,7 +67,7 @@ let ColSettingObj = {
         sheet.setColumnCount(2, GC.Spread.Sheets.SheetArea.rowHeader);
         sheet.setColumnWidth(0, 80, GC.Spread.Sheets.SheetArea.rowHeader);
         sheet.setColumnWidth(1, 70, GC.Spread.Sheets.SheetArea.rowHeader);
-        sheet.setRowCount(setting.headRows + this.Rows.visible + 1);
+        sheet.setRowCount(setting.headRows + this.Rows.customize + 1);
 
         sheet.setText(setting.headRows + this.Rows.data, 0, 'Data', GC.Spread.Sheets.SheetArea.rowHeader);
         sheet.setStyle(setting.headRows + this.Rows.data, -1, this.DEFAULT_DATA_STYLE);
@@ -82,6 +82,7 @@ let ColSettingObj = {
         initColProperty(this.Rows.showHint, 'ShowHint');
         initColProperty(this.Rows.visible, 'Visible');
         initColProperty(this.Rows.cellType, 'CellType');
+        initColProperty(this.Rows.customize, 'Customize');
     },
     initColSetting: function (setting) {
         this.DEFAULT_TITLE_STYLE = this.getCellStyle('Arial', GC.Spread.Sheets.HorizontalAlign.center, GC.Spread.Sheets.VerticalAlign.center);
@@ -159,6 +160,9 @@ let ColSettingObj = {
                 // visible
                 cell = sheet.getCell(this.colSetting.headRows + this.Rows.visible, iCol, GC.Spread.Sheets.SheetArea.viewport);
                 cell.cellType(this.cellType.checkBox).value(col.visible).hAlign(GC.Spread.Sheets.HorizontalAlign.center);
+                // customize
+                cell = sheet.getCell(this.colSetting.headRows + this.Rows.customize, iCol, GC.Spread.Sheets.SheetArea.viewport);
+                cell.cellType(this.cellType.checkBox).value(col.customize).hAlign(GC.Spread.Sheets.HorizontalAlign.center);
             }
         }
 
@@ -185,6 +189,7 @@ let ColSettingObj = {
             sheet.setValue(this.colSetting.headRows + this.Rows.readOnly, iCol, false, GC.Spread.Sheets.SheetArea.viewport);
             sheet.getCell(this.colSetting.headRows + this.Rows.showHint, iCol).cellType(this.cellType.checkBox).hAlign(GC.Spread.Sheets.HorizontalAlign.center);
             sheet.getCell(this.colSetting.headRows + this.Rows.visible, iCol).cellType(this.cellType.checkBox).hAlign(GC.Spread.Sheets.HorizontalAlign.center).value(true);
+            sheet.getCell(this.colSetting.headRows + this.Rows.customize, iCol).cellType(this.cellType.checkBox).hAlign(GC.Spread.Sheets.HorizontalAlign.center).value(false);
         }
     },
     setHeaderRowCount: function (count) {
@@ -244,6 +249,7 @@ let ColSettingObj = {
                 col.showHint = sheet.getValue(setting.headRows + this.Rows.showHint, iCol) || false;
             }
             col.visible = sheet.getValue(setting.headRows + this.Rows.visible, iCol) || false;
+            col.customize = sheet.getValue(setting.headRows + this.Rows.customize, iCol) || false;
 
             col.head = {};
             col.head.titleNames = [];

+ 6 - 4
web/users/js/compilation.js

@@ -234,19 +234,21 @@ function initCompilation() {
     let rationLibData = rationList === undefined ? [] : JSON.parse(rationList);
     let gljLibData = gljList === undefined ? [] : JSON.parse(gljList);
     let feeLibData = feeRateList === undefined ? [] : JSON.parse(feeRateList);
-    mainTreeCol = mainTreeCol !== '' ? mainTreeCol.replace(/\n/g, '\\n') : mainTreeCol;
-    mainTreeCol = mainTreeCol === '' ? '' : JSON.parse(mainTreeCol);
     let artificialCoefficientData = artificialCoefficientList === undefined ? [] : JSON.parse(artificialCoefficientList);
+
+    mainTreeCol = mainTreeCol !== '' ? mainTreeCol.replace(/\n/g, '\\n') : mainTreeCol;
     billsTemplateData = billsTemplateData.replace(/\n/g, '\\n');
 
+    let mainTreeColObj = mainTreeCol === '' ? {} : JSON.parse(mainTreeCol);
+
     // 初始化 造价书列设置
     colSpread = TREE_SHEET_HELPER.createNewSpread($('#main-tree-col')[0]);
     let billsTemplateTree = idTree.createNew({id: 'ID', pid: 'ParentID', nid: 'NextSiblingID', rootId: -1});
 
     billsTemplateTree.loadDatas(JSON.parse(billsTemplateData));
     if (mainTreeCol !== '') {
-        TREE_SHEET_HELPER.loadSheetHeader(mainTreeCol, colSpread.getActiveSheet());
-        TREE_SHEET_HELPER.showTreeData(mainTreeCol, colSpread.getActiveSheet(), billsTemplateTree);
+        TREE_SHEET_HELPER.loadSheetHeader(mainTreeColObj, colSpread.getActiveSheet());
+        TREE_SHEET_HELPER.showTreeData(mainTreeColObj, colSpread.getActiveSheet(), billsTemplateTree);
     }
 
     if (billListData.length <= 0 || rationLibData.length <= 0 || gljLibData.length <= 0) {