浏览代码

1. 台账分解,树结构基本操作,第一次代码优化
2. 台账分解,控制顶部按钮可用性

MaiXinRong 7 年之前
父节点
当前提交
83609c126d

+ 25 - 154
app/controller/ledger_controller.js

@@ -82,131 +82,11 @@ module.exports = app => {
         };
 
         /**
-         * 新增节点
-         * @param ctx
-         * @returns {Promise<void>}
-         */
-        async addNode(ctx) {
-            const responseData = {
-                err: 0,
-                msg: '',
-                data: []
-            };
-            try {
-                const tenderId = ctx.session.sessionUser.tenderId;
-                if (!tenderId) {
-                    throw '当前未打开标段';
-                }
-                const data = JSON.parse(ctx.request.body.data);
-                if (isNaN(data.id) || data.id <= 0) {
-                    throw '参数错误';
-                }
-
-                responseData.data = await ctx.service.ledger.addNode(tenderId, data.id);
-            } catch (err) {
-                responseData.err = 1;
-                responseData.msg = err;
-            }
-
-            ctx.body = responseData;
-        };
-
-        /**
-         * 删除节点
-         * @param ctx
-         * @returns {Promise<void>}
-         */
-        async deleteNode(ctx) {
-            const responseData = {
-                err: 0,
-                msg: '',
-                data: []
-            };
-            try {
-                const tenderId = ctx.session.sessionUser.tenderId;
-                if (!tenderId) {
-                    throw '当前未打开标段';
-                }
-                const data = JSON.parse(ctx.request.body.data);
-                if (isNaN(data.id) || data.id <= 0) {
-                    throw '参数错误';
-                }
-
-                responseData.data = await ctx.service.ledger.deleteNode(tenderId, data.id);
-            } catch (err) {
-                responseData.err = 1;
-                responseData.msg = err;
-            }
-
-            ctx.body = responseData;
-        };
-
-        /**
-         * 上移节点
-         * @param ctx
-         * @returns {Promise<void>}
-         */
-        async upMove(ctx) {
-            const responseData = {
-                err: 0,
-                msg: '',
-                data: []
-            };
-            try {
-                const tenderId = ctx.session.sessionUser.tenderId;
-                if (!tenderId) {
-                    throw '当前未打开标段';
-                }
-                const data = JSON.parse(ctx.request.body.data);
-                if (isNaN(data.id) || data.id <= 0) {
-                    throw '参数错误';
-                }
-
-                responseData.data = await ctx.service.ledger.upMoveNode(tenderId, data.id);
-            } catch (err) {
-                responseData.err = 1;
-                responseData.msg = err;
-            }
-
-            ctx.body = responseData;
-        };
-
-        /**
-         * 下移节点
-         * @param ctx
-         * @returns {Promise<void>}
-         */
-        async downMove(ctx) {
-            const responseData = {
-                err: 0,
-                msg: '',
-                data: []
-            };
-            try {
-                const tenderId = ctx.session.sessionUser.tenderId;
-                if (!tenderId) {
-                    throw '当前未打开标段';
-                }
-                const data = JSON.parse(ctx.request.body.data);
-                if (isNaN(data.id) || data.id <= 0) {
-                    throw '参数错误';
-                }
-
-                responseData.data = await ctx.service.ledger.downMoveNode(tenderId, data.id);
-            } catch (err) {
-                responseData.err = 1;
-                responseData.msg = err;
-            }
-
-            ctx.body = responseData;
-        };
-
-        /**
-         * 升级节点
-         * @param ctx
+         * 树结构基本操作(增、删、上下移、升降级)
+         * @param {Object} ctx - egg全局变量
          * @returns {Promise<void>}
          */
-        async upLevel(ctx) {
+        async baseOperation(ctx) {
             const responseData = {
                 err: 0,
                 msg: '',
@@ -218,41 +98,32 @@ module.exports = app => {
                     throw '当前未打开标段';
                 }
                 const data = JSON.parse(ctx.request.body.data);
-                if (isNaN(data.id) || data.id <= 0) {
+                if ((isNaN(data.id) || data.id <= 0) || (!data.postType)) {
                     throw '参数错误';
                 }
 
-                responseData.data = await ctx.service.ledger.upLevelNode(tenderId, data.id);
-            } catch (err) {
-                responseData.err = 1;
-                responseData.msg = err;
-            }
-
-            ctx.body = responseData;
-        };
-
-        /**
-         * 降级节点
-         * @param ctx
-         * @returns {Promise<void>}
-         */
-        async downLevel(ctx) {
-            const responseData = {
-                err: 0,
-                msg: '',
-                data: []
-            };
-            try {
-                const tenderId = ctx.session.sessionUser.tenderId;
-                if (!tenderId) {
-                    throw '当前未打开标段';
+                switch (data.postType) {
+                    case 'add':
+                        responseData.data = await ctx.service.ledger.addNode(tenderId, data.id);
+                        break;
+                    case 'delete':
+                        responseData.data = await ctx.service.ledger.deleteNode(tenderId, data.id);
+                        break;
+                    case 'up-move':
+                        responseData.data = await ctx.service.ledger.upMoveNode(tenderId, data.id);
+                        break;
+                    case 'down-move':
+                        responseData.data = await ctx.service.ledger.downMoveNode(tenderId, data.id);
+                        break;
+                    case 'up-level':
+                        responseData.data = await ctx.service.ledger.upLevelNode(tenderId, data.id);
+                        break;
+                    case 'down-level':
+                        responseData.data = await ctx.service.ledger.downLevelNode(tenderId, data.id);
+                        break;
+                    default:
+                        throw '未知操作';
                 }
-                const data = JSON.parse(ctx.request.body.data);
-                if (isNaN(data.id) || data.id <= 0) {
-                    throw '参数错误';
-                }
-
-                responseData.data = await ctx.service.ledger.downLevelNode(tenderId, data.id);
             } catch (err) {
                 responseData.err = 1;
                 responseData.msg = err;

+ 85 - 18
app/public/js/ledger.js

@@ -35,46 +35,86 @@ $(document).ready(function() {
     SpreadJsObj.loadSheetData(ledgerSpread.getActiveSheet(), 'tree', ledgerTree);
 
     const treeOperationObj = {
+        refreshOperationValid: function (sheet, selections) {
+            const setObjEnable = function (obj, enable) {
+                if (enable) {
+                    obj.removeClass('disabled');
+                } else {
+                    obj.addClass('disabled');
+                }
+            };
+
+            const row = selections[0].row;
+            const tree = sheet.zh_tree;
+            if (!tree) { return; }
+            const node = sheet.zh_tree.nodes[row];
+
+            setObjEnable($('#delete'), node);
+            setObjEnable($('#up-move'), node && node.order > 1);
+            setObjEnable($('#down-move'), node && !tree.isLastSibling(node));
+            setObjEnable($('#up-level'), tree.getParent(node));
+            setObjEnable($('#down-level'), node && node.order > 1);
+        },
+        /**
+         * 新增节点
+         * @param spread
+         */
         addNode: function (spread) {
+            const self = this;
             const sheet = spread.getActiveSheet();
             const row = sheet.getSelections()[0].row;
 
             const tree = sheet.zh_tree;
             if (!tree) { return; }
 
-            const node = spread.zh_tree.nodes[row];
+            const node = sheet.zh_tree.nodes[row];
             if (!node) { return; }
 
             SpreadJsObj.massOperationSheet(sheet, function () {
-                tree.addNode('add-node', node, function (newNodes) {
-                    newNodes.sort(function (a, b) {
-                        const aIndex = tree.nodes.indexOf(a);
-                        const bIndex = tree.nodes.indexOf(b);
-                        return aIndex - bIndex;
-                    });
-                    for (const node of newNodes) {
-                        const index = tree.nodes.indexOf(node);
-                        sheet.addRows(index, 1);
+                tree.baseOperation('base-operation', node, 'add', function (result) {
+                    const newNodes = result.create;
+                    if (newNodes) {
+                        newNodes.sort(function (a, b) {
+                            const aIndex = tree.nodes.indexOf(a);
+                            const bIndex = tree.nodes.indexOf(b);
+                            return aIndex - bIndex;
+                        });
+                        for (const node of newNodes) {
+                            const index = tree.nodes.indexOf(node);
+                            sheet.addRows(index, 1);
+                        }
                     }
+                    self.refreshOperationValid(sheet, sheet.getSelections());
                 });
             });
         },
+        /**
+         * 删除选中节点
+         * @param spread
+         */
         deleteNode: function (spread) {
+            const self = this;
             const sheet = spread.getActiveSheet();
             const row = sheet.getSelections()[0].row;
 
             const tree = sheet.zh_tree;
             if (!tree) { return; }
 
-            const node = spread.zh_tree.nodes[row];
+            const node = sheet.zh_tree.nodes[row];
             if (!node) { return; }
 
             const count = ledgerTree.getPosterity(node).length;
-            tree.deleteNode('delete-node', node, function () {
+            tree.baseOperation('base-operation', node, 'delete', function (result) {
                 sheet.deleteRows(row, count + 1);
+                self.refreshOperationValid(sheet, sheet.getSelections());
             });
         },
+        /**
+         * 上移选中节点
+         * @param spread
+         */
         upMove: function (spread) {
+            const self = this;
             const sheet = spread.getActiveSheet();
             const sel = sheet.getSelections()[0];
             const row = sel.row;
@@ -85,15 +125,22 @@ $(document).ready(function() {
             const node = tree.nodes[row];
             if (!node) { return; }
 
-            tree.upMoveNode('up-move', node, function (datas) {
-                for (const data of datas) {
+            tree.baseOperation('base-operation', node, 'up-move', function (result) {
+                for (const data of result.update) {
                     SpreadJsObj.reLoadRowData(sheet, tree.nodes.indexOf(data), tree.getPosterity(data).length + 1);
                 }
                 sheet.setSelection(tree.nodes.indexOf(node), sel.col, sel.rowCount, sel.colCount);
+                self.refreshOperationValid(sheet, sheet.getSelections());
                 //sheet.moveTo(row, -1, tree.nodes.indexOf(node), -1, tree.getPosterity(node).length + 1, -1, GC.Spread.Sheets.CopyToOptions.value);
             });
+
         },
+        /**
+         * 下移选中节点
+         * @param spread
+         */
         downMove: function (spread) {
+            const self = this;
             const sheet = spread.getActiveSheet();
             const sel = sheet.getSelections()[0];
             const row = sel.row;
@@ -104,14 +151,21 @@ $(document).ready(function() {
             const node = tree.nodes[row];
             if (!node) { return; }
 
-            tree.downMoveNode('down-move', node, function (datas) {
-                for (const data of datas) {
+            tree.baseOperation('base-operation', node, 'down-move', function (result) {
+                for (const data of result.update) {
                     SpreadJsObj.reLoadRowData(sheet, tree.nodes.indexOf(data), tree.getPosterity(data).length + 1);
                 }
                 sheet.setSelection(tree.nodes.indexOf(node), sel.col, sel.rowCount, sel.colCount);
+                self.refreshOperationValid(sheet, sheet.getSelections());
             });
+
         },
+        /**
+         * 升级选中节点
+         * @param spread
+         */
         upLevel: function (spread) {
+            const self = this;
             const sheet = spread.getActiveSheet();
             const row = sheet.getSelections()[0].row;
 
@@ -121,11 +175,18 @@ $(document).ready(function() {
             const node = tree.nodes[row];
             if (!node) { return; }
 
-            tree.upLevelNode('up-level', node, function () {
+            tree.baseOperation('base-operation', node, 'up-level', function (result) {
                 sheet.repaint();
+                self.refreshOperationValid(sheet, sheet.getSelections());
             });
+
         },
+        /**
+         * 降级选中节点
+         * @param spread
+         */
         downLevel: function (spread) {
+            const self = this;
             const sheet = spread.getActiveSheet();
             const row = sheet.getSelections()[0].row;
 
@@ -135,12 +196,17 @@ $(document).ready(function() {
             const node = tree.nodes[row];
             if (!node) { return; }
 
-            tree.downLevelNode('down-level', node, function () {
+            tree.baseOperation('base-operation', node, 'down-level', function (result) {
                 sheet.repaint();
+                self.refreshOperationValid(sheet, sheet.getSelections());
             });
         }
     };
 
+    ledgerSpread.bind(GC.Spread.Sheets.Events.SelectionChanged, function (e, info) {
+        treeOperationObj.refreshOperationValid(info.sheet, info.newSelections);
+    });
+
     // 绑定 删除等 顶部按钮
     $('#delete').click(function () {
         treeOperationObj.deleteNode(ledgerSpread);
@@ -157,6 +223,7 @@ $(document).ready(function() {
     $('#down-level').click(function () {
         treeOperationObj.downLevel(ledgerSpread);
     });
+    treeOperationObj.refreshOperationValid(ledgerSpread.getActiveSheet(), ledgerSpread.getActiveSheet().getSelections());
 
     // 右键菜单
     $.contextMenu({

+ 22 - 75
app/public/js/path_tree.js

@@ -206,84 +206,31 @@ const createNewPathTree = function (setting) {
         });
     };
     /**
-     * 新增节点
-     * @param {string} url - 请求连接
-     * @param {object} node - 当前选中节点
-     * @param {function} callback
-     */
-    proto.addNode = function (url, node, callback) {
-        const self = this;
-        postData(url, {id: node[treeSetting.id]}, function (data) {
-            self._loadData(data.update);
-            const newNodes = self._loadData(data.create);
-            callback(newNodes);
-        });
-    };
-    /**
-     * 删除节点
+     * 树结构基本操作
      * @param {String} url - 请求地址
-     * @param {Object} node - 要删除的节点
-     * @param {function} callback
-     */
-    proto.deleteNode = function (url, node, callback){
-        const self = this;
-        postData(url, {id: node[treeSetting.id]}, function (data) {
-            self._loadData(data.update);
-            self._freeData(data.delete);
-            callback();
-        });
-    };
-    /**
-     * 上移
-     * @param {String} url
-     * @param {Object} node
-     * @param {function} callback
-     */
-    proto.upMoveNode = function (url, node, callback) {
-        const self = this;
-        postData(url, {id: node[treeSetting.id]}, function (data) {
-            const nodes = self._loadData(data.update);
-            callback(nodes);
-        });
-    };
-    /**
-     * 下移
-     * @param {String} url
-     * @param {Object} node
-     * @param {function} callback
+     * @param {Object} node - 操作节点
+     * @param {String} type - 操作类型
+     * @param {function} callback - 界面刷新
      */
-    proto.downMoveNode = function (url, node, callback) {
+    proto.baseOperation = function (url, node, type, callback) {
         const self = this;
-        postData(url, {id: node[treeSetting.id]}, function (data) {
-            const nodes = self._loadData(data.update);
-            callback(nodes);
-        });
-    };
-    /**
-     * 升级
-     * @param {String} url
-     * @param {Object} node
-     * @param {function} callback
-     */
-    proto.upLevelNode = function (url, node, callback) {
-        const self = this;
-        postData(url, {id: node[treeSetting.id]}, function (data) {
-            self._loadData(data.update);
-            callback();
-        });
-    };
-    /**
-     * 降级
-     * @param {String} url
-     * @param {Object} node
-     * @param {function} callback
-     */
-    proto.downLevelNode = function (url, node, callback) {
-        const self = this;
-        postData(url, {id: node[treeSetting.id]}, function (data) {
-            self._loadData(data.update);
-            callback();
-        });
+        const data = {
+            id: node[treeSetting.id],
+            postType: type
+        };
+        postData(url, data, function (datas) {
+            const result = {};
+            if (datas.update) {
+                result.update = self._loadData(datas.update);
+            }
+            if (datas.create) {
+                result.create = self._loadData(datas.create);
+            }
+            if (datas.delete) {
+                result.delete = self._freeData(datas.delete);
+            }
+            callback(result);
+        })
     };
 
     return new PathTree();

+ 2 - 0
app/public/js/spreadjs_rela/spreadjs_zh.js

@@ -218,6 +218,8 @@ const SpreadJsObj = {
     reLoadRowData: function (sheet, row, count) {
         this.massOperationSheet(sheet, function () {
             const sortData = sheet.zh_dataType === 'tree' ? sheet.zh_tree.nodes : sheet.zh_data;
+            // 清空原单元格数据
+            sheet.clear(row, -1, count, -1, GC.Spread.Sheets.SheetArea.viewport, GC.Spread.Sheets.StorageType.data);
             // 单元格重新写入数据
             for (let i = row; i < row + count; i++) {
                 const data = sortData[i];

+ 1 - 6
app/router.js

@@ -34,12 +34,7 @@ module.exports = app => {
     // 台账管理相关
     app.get('/ledger/explode', sessionAuth, 'ledgerController.explode');
     app.post('/ledger/get-children', sessionAuth, 'ledgerController.getChildren');
-    app.post('/ledger/add-node', sessionAuth, 'ledgerController.addNode');
-    app.post('/ledger/delete-node', sessionAuth, 'ledgerController.deleteNode');
-    app.post('/ledger/up-move', sessionAuth, 'ledgerController.upMove');
-    app.post('/ledger/down-move', sessionAuth, 'ledgerController.downMove');
-    app.post('/ledger/up-level', sessionAuth, 'ledgerController.upLevel');
-    app.post('/ledger/down-level', sessionAuth, 'ledgerController.downLevel');
+    app.post('/ledger/base-operation', sessionAuth, 'ledgerController.baseOperation');
     app.get('/ledger/change', sessionAuth, 'ledgerController.change');
     app.get('/ledger/index', sessionAuth, 'ledgerController.index');
 

+ 1 - 1
app/view/ledger/explode.ejs

@@ -9,7 +9,7 @@
                        data-original-title="剪切"><i class="fa fa-scissors" aria-hidden="true"></i></a>
                     <a href="" class="btn btn-sm" data-toggle="tooltip" data-placement="bottom" title=""
                        data-original-title="粘贴"><i class="fa fa-clipboard" aria-hidden="true"></i></a>
-                    <a href="javascript:void(0)" id="delete-node" class="btn btn-sm" data-toggle="tooltip" data-placement="bottom" title=""
+                    <a href="javascript:void(0)" id="delete" class="btn btn-sm" data-toggle="tooltip" data-placement="bottom" title=""
                        data-original-title="删除"><i class="fa fa-remove" aria-hidden="true"></i></a>
                     <a href="javascript:void(0)" id="up-level" class="btn btn-sm" data-toggle="tooltip" data-placement="bottom" title=""
                        data-original-title="升级"><i class="fa fa-arrow-left" aria-hidden="true"></i></a>