浏览代码

Merge branch 'master' of http://192.168.1.41:3000/SmartCost/ConstructionOperation

vian 5 年之前
父节点
当前提交
0542d9aa69

+ 107 - 0
modules/reports/controllers/rpt_tpl_controller.js

@@ -222,6 +222,113 @@ let mExport = {
             }
         })
     },
+    partialUpdateTreeNode: function (req, res) {
+        const params = JSON.parse(req.body.params);
+        const pathArray = params.pathArray;
+        const nodeArray = params.nodeArray;
+
+        const _getCurrentNodeSerialOrder = function(parentItems, pathName) {
+            let rst = -1;
+            if (parentItems) {
+                for (let idx = 0; idx < parentItems.length; idx++) {
+                    if (parentItems[idx].name === pathName) {
+                        rst = idx;
+                        break;
+                    }
+                }
+            }
+            return rst;
+        };
+
+        const _updateNodeByPath = function(path, node, topNodeItems) {
+            let rst = false;
+            let tmpParentItems = topNodeItems;
+            for (let idx = 0; idx < path.node_path.length; idx++) {
+                const nIdx = _getCurrentNodeSerialOrder(tmpParentItems, path.node_path[idx]);
+                if (nIdx >= 0) {
+                    if (idx === path.node_path.length - 1) {
+                        tmpParentItems[nIdx] = node;
+                        rst = true;
+                    } else {
+                        tmpParentItems = tmpParentItems[nIdx].items;
+                    }
+                }
+            }
+            return rst;
+        };
+        const _addNodeByPath = function(path, node, topNodeItems) {
+            let rst = false;
+            let tmpParentItems = topNodeItems;
+            if (path === null || path === '') {
+                topNodeItems.push(node);
+                rst = true;
+            } else {
+                for (let idx = 0; idx < path.node_path.length; idx++) {
+                    const nIdx = _getCurrentNodeSerialOrder(tmpParentItems, path.node_path[idx]);
+                    if (nIdx >= 0) {
+                        if (idx === path.node_path.length - 1) {
+                            if (tmpParentItems[nIdx].nodeType === 1) {
+                                if (!tmpParentItems[nIdx].items) {
+                                    tmpParentItems[nIdx].items = [];
+                                }
+                                tmpParentItems[nIdx].items.push(node);
+                                rst = true;
+                            }
+                        } else {
+                            tmpParentItems = tmpParentItems[nIdx].items;
+                        }
+                    }
+                }
+            }
+            return rst;
+        };
+        const _deleteNodeByPath = function(path, node, topNodeItems) {
+            let rst = false;
+            let tmpParentItems = topNodeItems;
+            for (let idx = 0; idx < path.node_path.length; idx++) {
+                const nIdx = _getCurrentNodeSerialOrder(tmpParentItems, path.node_path[idx]);
+                if (nIdx >= 0) {
+                    if (idx === path.node_path.length - 1) {
+                        tmpParentItems.splice(nIdx, 1);
+                        rst = true;
+                    } else {
+                        tmpParentItems = tmpParentItems[nIdx].items;
+                    }
+                }
+            }
+            return rst;
+        };
+        // console.log('compilationId: ' + compilationId);
+        rttFacade.findTplTree(params.compilationId, params.userId).then(function (targetTplTreeNode) {
+            if (pathArray && pathArray.length > 0 && nodeArray && nodeArray.length === pathArray.length) {
+                let doc = targetTplTreeNode._doc ? targetTplTreeNode._doc[0] : targetTplTreeNode[0];
+                // console.log(doc);
+                const topNodeItems = doc.items;
+
+                for (let idx = 0; idx < pathArray.length; idx++) {
+                    if (pathArray[idx].operation_type === 'update') {
+                        _updateNodeByPath(pathArray[idx], nodeArray[idx], topNodeItems);
+                    } else if (pathArray[idx].operation_type === 'add') {
+                        _addNodeByPath(pathArray[idx], nodeArray[idx], topNodeItems);
+                    } else if (pathArray[idx].operation_type === 'delete') {
+                        _deleteNodeByPath(pathArray[idx], nodeArray[idx, topNodeItems]);
+                    } else {
+                        // out of control
+                    }
+                }
+                // console.log(topNodeItems);
+                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);
+                    }
+                })
+            }
+        })
+    },
     updateTopNodeName: function (req, res) {
         //备注:因设计的更改,此方法将被放弃
         let params = JSON.parse(req.body.params),

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

@@ -21,6 +21,7 @@ module.exports = function (app) {
 
     rptTplRouter.post('/createTreeRootNode', reportTplController.createTreeRootNode);
     rptTplRouter.post('/updateTreeRootNode', reportTplController.updateTreeRootNode);
+    rptTplRouter.post('/partialUpdateTreeNode', reportTplController.partialUpdateTreeNode);
     rptTplRouter.post('/updateTopNodeName', reportTplController.updateTopNodeName);
     rptTplRouter.post('/updateSubLevelOneNode', reportTplController.updateSubLevelOneNode);
     rptTplRouter.post('/removeTreeRootNode', reportTplController.removeTreeRootNode);

+ 5 - 0
web/maintain/report/html/rpt_tpl_dtl_pre_hdl_sort.html

@@ -50,3 +50,8 @@
         </div>
     </div>
 </div>
+<div class="form-group row" id="div_sort_self_define">
+    <div class="col-md-6">
+        <textarea rows="15" cols="50" style="width: 100%; height: 100%; overflow: auto; work-break: break-all;" id="selfDefineSort" onkeyup="preHandleSortObj.changeSelfDefineExpression(this)"></textarea>
+    </div>
+</div>

+ 98 - 36
web/maintain/report/js/rpt_tpl_main.js

@@ -87,6 +87,22 @@ let zTreeOprObj = {
         params.doc = rawNode;
         CommonAjax.postEx("report_tpl_api/updateTreeRootNode", params, 5000, isAsync, callback, failCallback, null);
     },
+    partialUpdateTreeNode: function (rawNode, pathArray, nodeArray, isAsync, callback, failCallback) {
+        // 这个是局部刷新,原理是根据topNodeId找到后台的topNode,根据路径(有多个路径,可以实现多个子节点同时刷新)来替换(nodeArray里的)后台数据库的相关节点
+        // 这里需要一个调整,就是新增目录及模板需要加给后缀(new(Date)).getTime() ,以保证不重叠(真重叠了算倒霉)
+        // path描述:{ operation_type: '', // 操作类型:‘update’ ‘add’、‘delete’
+        //            node_path: [],      // 节点路径:如:['02.广东', '03.增城北绕线项目定制报表'],表示Top节点的items下的那个‘02.广东’子节点(要full scan)的items下的 ‘03.增城北绕线项目定制报表’子节点
+        //          }
+        // nodeArray: 与pathArray一一对应
+        //
+        let params = {};
+        params.compilationId = rawNode.compilationId;
+        params.engineerId = rawNode.engineerId;
+        params.userId = rawNode.userId;
+        params.pathArray = pathArray;
+        params.nodeArray = nodeArray;
+        CommonAjax.postEx("report_tpl_api/partialUpdateTreeNode", params, 5000, isAsync, callback, failCallback, null);
+    },
     updateTopNodeName: function (topNode, isAsync, callback, failCallback) {
         let params = {};
         params.compilationId = topNode.compilationId;
@@ -128,6 +144,21 @@ let zTreeOprObj = {
         }
         return rst;
     },
+    getNodePath: function(node, includeCurrentNode) {
+        const rst = [];
+        if (includeCurrentNode) {
+            rst.push(node.name);
+        }
+        let parentNode = node.getParentNode();
+        while (parentNode && parentNode.level > 0) { //顶节点是dummy的
+            rst.unshift(parentNode.name);
+            parentNode = parentNode.getParentNode();
+            if (parentNode === null || parentNode === undefined || parentNode.level === 0) {
+                rst.splice(0,1); // 删除头节点(后台不需要)
+            }
+        }
+        return rst;
+    },
     buildSubRootNodeDoc: function(subNode) {
         let me = this, rst = null;
         if (subNode) {
@@ -181,40 +212,40 @@ let zTreeOprObj = {
         let me = zTreeOprObj, sObj = $("#" + treeNode.tId + "_span");
         if (treeNode.editNameFlag || $("#addBtn_"+treeNode.tId).length > 0 || treeNode.nodeType === RT.NodeType.TEMPLATE) return;
         if (treeNode.level === 0) {
-            let addStr = "<span class='button star' 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.createIniComilationNode();
-                if (!me.chkIfDupCompilationNode(rawNode, treeNode)) {
-                    rawNode.userId = treeNode.userId;
-                    me.addNewNodeEx(rawNode, function(rst){
-                        if (rst) {
-                            let newNodes = [], isSilent = false;
-                            rawNode.isParent = true;
-                            newNodes.push(rawNode);
-                            if (treeNode.items && treeNode.items.length > 0) {
-                                let insertIdx = -1;
-                                for (let i = 0; i < treeNode.items.length; i++) {
-                                    if (treeNode.items[i].compilationId === rawNode.compilationId) {
-                                        if (treeNode.items[i].engineerId > rawNode.engineerId) {
-                                            insertIdx = i;
-                                            break;
-                                        }
-                                    }
-                                }
-                                me.treeObj.addNodes(treeNode, insertIdx, newNodes, isSilent);
-                            } else {
-                                me.treeObj.addNodes(treeNode, 0, newNodes, isSilent);
-                            }
-                        } else {
-                            alert("后台创建失败,请确认是否有重复类型跟节点!")
-                        }
-                    }, null);
-                } else {
-                    alert("有重复编办!");
-                }
-            });
+            // let addStr = "<span class='button star' 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.createIniComilationNode();
+            //     if (!me.chkIfDupCompilationNode(rawNode, treeNode)) {
+            //         rawNode.userId = treeNode.userId;
+            //         me.addNewNodeEx(rawNode, function(rst){
+            //             if (rst) {
+            //                 let newNodes = [], isSilent = false;
+            //                 rawNode.isParent = true;
+            //                 newNodes.push(rawNode);
+            //                 if (treeNode.items && treeNode.items.length > 0) {
+            //                     let insertIdx = -1;
+            //                     for (let i = 0; i < treeNode.items.length; i++) {
+            //                         if (treeNode.items[i].compilationId === rawNode.compilationId) {
+            //                             if (treeNode.items[i].engineerId > rawNode.engineerId) {
+            //                                 insertIdx = i;
+            //                                 break;
+            //                             }
+            //                         }
+            //                     }
+            //                     me.treeObj.addNodes(treeNode, insertIdx, newNodes, isSilent);
+            //                 } else {
+            //                     me.treeObj.addNodes(treeNode, 0, newNodes, isSilent);
+            //                 }
+            //             } else {
+            //                 alert("后台创建失败,请确认是否有重复类型跟节点!")
+            //             }
+            //         }, null);
+            //     } else {
+            //         alert("有重复编办!");
+            //     }
+            // });
         } else {
             let addStr = "<span class='button add' id='addBtn_" + treeNode.tId + "' title='新增子目录' onfocus='this.blur();'></span>";
             sObj.after(addStr);
@@ -223,7 +254,7 @@ let zTreeOprObj = {
                 me.getNewNodeID(1, function (newNodeID) {
                     let rawNode = me.createIniNode();
                     rawNode.nodeType = RT.NodeType.NODE;
-                    rawNode.name = "新增子节点";
+                    rawNode.name = "新增子节点" + (new Date()).getTime();
                     rawNode.ID = newNodeID;
                     let newNodes = [], isSilent = false;
                     newNodes.push(rawNode);
@@ -242,12 +273,28 @@ let zTreeOprObj = {
                         me.treeObj.addNodes(treeNode, insertIdx, newNodes, isSilent);
                         let tn = me.getParentNodeByNodeLevel(treeNode, NODE_LEVEL_COMPILATION_NEW);
                         let newTopNode = me.buildRootNodeDoc(tn);
+
+                        //*
+                        let pathArr = [];
+                        let nodeArr = [];
+                        let path = {operation_type: 'add', node_path: []};
+                        path.node_path = me.getNodePath(treeNode, true);
+                        pathArr.push(path);
+                        nodeArr.push(rawNode);
+                        me.partialUpdateTreeNode(newTopNode, pathArr, nodeArr, true, function(rst){
+                            if (!(rst)) {
+                                alert("新增节点失败!");
+                            }
+                            me.refreshNodes();
+                        }, null);
+                        /*/
                         me.updateTreeRootNode(newTopNode, true, function(rst){
                             if (!(rst)) {
                                 alert("新增节点失败!");
                             }
                             me.refreshNodes();
                         }, null);
+                        //*/
                     }
                 });
             });
@@ -260,7 +307,7 @@ let zTreeOprObj = {
                     me.getNewNodeID(1, function (newNodeID) {
                         let rawNode = me.createIniNode();
                         rawNode.nodeType = RT.NodeType.TEMPLATE;
-                        rawNode.name = "新增报表模板";
+                        rawNode.name = "新增报表模板" + (new Date()).getTime();
                         rawNode.ID = newNodeID;
                         rawNode.released = false;
                         let newNodes = [], isSilent = false;
@@ -268,12 +315,27 @@ let zTreeOprObj = {
                         me.treeObj.addNodes(treeNode, -1, newNodes, isSilent);
                         let tn = me.getParentNodeByNodeLevel(treeNode, NODE_LEVEL_COMPILATION_NEW);
                         let topNode = me.buildRootNodeDoc(tn);
+                        //*
+                        let pathArr = [];
+                        let nodeArr = [];
+                        let path = {operation_type: 'add', node_path: []};
+                        path.node_path = me.getNodePath(treeNode, true);
+                        pathArr.push(path);
+                        nodeArr.push(rawNode);
+                        me.partialUpdateTreeNode(topNode, pathArr, nodeArr, true, function(rst){
+                            if (!(rst)) {
+                                alert("新增节点失败!");
+                            }
+                            me.refreshNodes();
+                        }, null);
+                        /*/
                         me.updateTreeRootNode(topNode, true, function(rst){
                             if (!(rst)) {
                                 alert("新增空白模板失败!");
                             }
                             me.refreshNodes();
                         }, null);
+                        //*/
                     });
                 }
             });

+ 16 - 0
web/maintain/report/js/rpt_tpl_pre_handle.js

@@ -336,6 +336,7 @@ let preHandleObj = {
         $("#div_sort_type_according_to_parent")[0].style.display = "none";
         $("#div_sort_type_parent_data")[0].style.display = "none";
         $("#div_sort_tree")[0].style.display = "none";
+        $("#div_sort_self_define")[0].style.display = "none";
     },
     onPreHandleClick: function(event,treeId,treeNode) {
         //点击预处理环节 节点
@@ -525,6 +526,7 @@ let preHandleSortObj = {
                 break;
             case 3 :
                 //self define
+                dest[JV.PROP_SORT_TYPE_SELF_DEFINE_LOGIC] = src[JV.PROP_SORT_TYPE_SELF_DEFINE_LOGIC];
                 break;
             default:
                 break;
@@ -605,6 +607,8 @@ let preHandleSortObj = {
                     break;
                 case 3 :
                     //self define
+                    $("#div_sort_self_define")[0].style.display = "";
+                    $("#selfDefineSort")[0].value = preHandleObj.currentNode[JV.PROP_SORT_TYPE_SELF_DEFINE_LOGIC];
                     break;
                 default:
                     break;
@@ -722,9 +726,20 @@ let preHandleSortObj = {
         } else if (dom.selectedIndex === 1) {
             $("#div_sort_tree")[0].style.display = "";
             preHandleSortObj.normalTreeObj = $.fn.zTree.init($("#bills_top_nodes"), sortingTreeSetting, fixed_top_bills_nodes);
+        } else {
+            //自定义
+            $("#div_sort_self_define")[0].style.display = "";
+            $("#selfDefineSort")[0].value = "";
+            me.currentNode[JV.PROP_SORT_TYPE_SELF_DEFINE_LOGIC] = '';
         }
         me.currentNode[JV.PROP_SORT_TYPE] = dom.value;
     },
+    changeSelfDefineExpression: function (dom) {
+        let me = preHandleObj;
+        if (me.currentNode) {
+            me.currentNode[JV.PROP_SORT_TYPE_SELF_DEFINE_LOGIC] = dom.value;
+        }
+    },
     extractTabFields: function (handleObj) {
         let me = this, rst = {};
         rst[JV.PROP_HANDLE_TYPE] = handleObj[JV.PROP_HANDLE_TYPE];
@@ -760,6 +775,7 @@ let preHandleSortObj = {
                 break;
             case 3 :
                 //self define
+                rst[JV.PROP_SORT_TYPE_SELF_DEFINE_LOGIC] = handleObj[JV.PROP_SORT_TYPE_SELF_DEFINE_LOGIC];
                 break;
             default:
                 break;