Procházet zdrojové kódy

台账,删除、上移、下移节点

MaiXinRong před 7 roky
rodič
revize
9fee54142f
2 změnil soubory, kde provedl 189 přidání a 1 odebrání
  1. 160 1
      app/service/tender_node.js
  2. 29 0
      test/app/service/tender_node.test.js

+ 160 - 1
app/service/tender_node.js

@@ -125,6 +125,50 @@ module.exports = app => {
         }
 
         /**
+         * 根据 父节点id 和 节点排序order 获取数据
+         * @param {Number} tenderId - 标段id
+         * @param {Number} pid - 父节点id
+         * @param {Number|Array} order - 排序
+         * @returns {Object|Array} - 查询结果
+         */
+        async getDataByParentAndOrder(tenderId, pid, order) {
+            if ((tenderId <= 0) || (pid <= 0) || (order <= 0)) {
+                return undefined;
+            }
+
+            this.initSqlBuilder();
+            this.sqlBuilder.setAndWhere('tender_id', {
+                value: tenderId,
+                operate: '='
+            });
+            this.sqlBuilder.setAndWhere('template_pid', {
+                value: pid,
+                operate: '=',
+            });
+            if (order instanceof Array) {
+                this.sqlBuilder.setAndWhere('order', {
+                    value: order,
+                    operate: 'in'
+                });
+            } else {
+                this.sqlBuilder.setAndWhere('order', {
+                    value: order,
+                    operate: '='
+                });
+            }
+
+            const [sql, sqlParam] = this.sqlBuilder.build(this.tableName);
+            let data;
+            if (order instanceof Array) {
+                data = await this.db.query(sql, sqlParam);
+            } else {
+                data = await this.db.queryOne(sql, sqlParam);
+            }
+
+            return data;
+        }
+
+        /**
          *  select的全部后兄弟节点,Order自增
          *
          * @param {Object} select - 选中的节点
@@ -248,9 +292,124 @@ module.exports = app => {
                 const resultData = this.db.query(sql, sqlParam);
 
                 return resultData;
+            } else {
+                throw '新增节点数据错误';
+            }
+
+        }
+
+        /**
+         *  tenderId标段中, 删除选中节点及其子节点
+         * @param {Number} tenderId - 标段id
+         * @param {Number} selectId - 选中节点id
+         * @return {Array} - 被删除的数据
+         */
+        async deleteNode(tenderId, selectId) {
+            if ((tenderId <= 0) || (selectId <= 0)) {
+                return [];
             }
-            throw '新增节点数据错误';
+            const selectData = await this.getDataByNodeId(tenderId, selectId);
+            this.transaction = await this.db.beginTransaction();
 
+            let resultData = [];
+            if (selectData) {
+                try {
+                    // 获取将要被删除的数据
+                    this.initSqlBuilder();
+                    this.sqlBuilder.setAndWhere('tender_id', {
+                        value: tenderId,
+                        operate: '='
+                    });
+                    this.sqlBuilder.setAndWhere('full_path', {
+                        value: this.db.escape(selectData.full_path + '%'),
+                        operate: 'Like'
+                    });
+                    let [sql, sqlParam] = this.sqlBuilder.build(this.tableName);
+                    resultData = await this.db.query(sql, sqlParam);
+                    // 删除
+                    this.initSqlBuilder();
+                    this.sqlBuilder.setAndWhere('tender_id', {
+                        value: tenderId,
+                        operate: '='
+                    });
+                    this.sqlBuilder.setAndWhere('full_path', {
+                        value: this.db.escape(selectData.full_path + '%'),
+                        operate: 'Like'
+                    });
+                    [sql, sqlParam] = this.sqlBuilder.build(this.tableName, 'delete');
+                    const operate = await this.transaction.query(sql, sqlParam);
+                    this.transaction.commit();
+                } catch(err) {
+                    resultData = [];
+                    await this.transaction.rollback();
+                    throw err;
+                }
+                return resultData;
+            } else {
+                throw '删除节点数据错误';
+            }
+        }
+
+        /**
+         * tenderId标段中, 选中节点selectId上移
+         * @param {Number} tenderId - 标段id
+         * @param {Number} selectId - 选中节点id
+         * @return {Array} - 发生改变的数据
+         */
+        async upMoveNode(tenderId, selectId) {
+            if ((tenderId <= 0) || (selectId <= 0)) {
+                return [];
+            }
+            const selectData = await this.getDataByNodeId(tenderId, selectId);
+            const preData = await this.getDataByParentAndOrder(tenderId, selectData.template_pid, selectData.order - 1);
+            this.transaction = await this.db.beginTransaction();
+
+            if (selectData && preData) {
+                try {
+                    const sData = await this.transaction.update(this.tableName, {id: selectData.id, order: selectData.order - 1});
+                    const pData = await this.transaction.update(this.tableName, {id: preData.id, order: preData.order + 1});
+                    this.transaction.commit();
+                } catch (err) {
+                    await this.transaction.rollback();
+                    throw err;
+                }
+
+                const resultData = await this.getDataByParentAndOrder(tenderId, selectData.template_pid, [selectData.order, preData.order]);
+                return resultData;
+            } else {
+                throw '上移节点数据错误';
+            }
+        }
+
+        /**
+         * tenderId标段中, 选中节点selectId下移
+         * @param {Number} tenderId - 标段id
+         * @param {Number} selectId - 选中节点id
+         * @return {Array} - 发生改变的数据
+         */
+        async downMoveNode(tenderId, selectId) {
+            if ((tenderId <= 0) || (selectId <= 0)) {
+                return [];
+            }
+            const selectData = await this.getDataByNodeId(tenderId, selectId);
+            const nextData = await this.getDataByParentAndOrder(tenderId, selectData.template_pid, selectData.order + 1);
+            this.transaction = await this.db.beginTransaction();
+
+            if (selectData && nextData) {
+                try {
+                    const sData = await this.transaction.update(this.tableName, {id: selectData.id, order: selectData.order + 1});
+                    const pData = await this.transaction.update(this.tableName, {id: nextData.id, order: nextData.order - 1});
+                    this.transaction.commit();
+                } catch (err) {
+                    await this.transaction.rollback();
+                    throw err;
+                }
+
+                const resultData = await this.getDataByParentAndOrder(tenderId, selectData.template_pid, [selectData.order, nextData.order]);
+                return resultData;
+            } else {
+                throw '下移节点数据错误';
+            }
         }
     }
 

+ 29 - 0
test/app/service/tender_node.test.js

@@ -66,4 +66,33 @@ describe('test/app/service/tender_node.test.js', () => {
         const resultData = yield ctx.service.tenderNode.addNode(testTenderId, 6);
         assert(resultData.length === 3);
     });
+
+    it('test deleteNode', function* () {
+        const ctx = app.mockContext();
+        // 选中202-1,删除节点
+        const resultData = yield ctx.service.tenderNode.deleteNode(testTenderId, 7);
+        assert(resultData.length === 3);
+    });
+
+    it('test upMoveNode', function* () {
+        const ctx = app.mockContext();
+        // 选中202-2-e上移
+        let resultData = yield ctx.service.tenderNode.upMoveNode(testTenderId, 12);
+        resultData.sort(function (x, y) {
+            return x.order - y.order;
+        });
+        assert(resultData.length === 2);
+        assert(resultData[0].code === '202-2-e');
+    });
+
+    it('test upMoveNode', function* () {
+        const ctx = app.mockContext();
+        // 选中202-2-e下移
+        let resultData = yield ctx.service.tenderNode.downMoveNode(testTenderId, 12);
+        resultData.sort(function (x, y) {
+            return x.order - y.order;
+        });
+        assert(resultData.length === 2);
+        assert(resultData[0].code === '202-2-c');
+    });
 });