Browse Source

台账,新增节点

MaiXinRong 7 years ago
parent
commit
200a7ee1d9
2 changed files with 193 additions and 0 deletions
  1. 124 0
      app/service/tender_node.js
  2. 69 0
      test/app/service/tender_node.test.js

+ 124 - 0
app/service/tender_node.js

@@ -31,6 +31,7 @@ module.exports = app => {
          * @return {Boolean} - 返回新增的结果
          */
         async add(data, tenderId) {
+            this.transaction = await this.db.beginTransaction();
             let result = false;
             try {
                 if (tenderId <= 0) {
@@ -93,6 +94,129 @@ module.exports = app => {
 
             return data;
         }
+
+        /**
+         * 根据节点Id获取数据
+         *
+         * @param {Number} tenderId - 标段id
+         * @param {Number} nodeId - 项目节/工程量清单节点id
+         * @return {Object} - 返回查询到的节点数据
+         */
+        async getDataByNodeId(tenderId, nodeId) {
+            if ((nodeId <= 0) || (tenderId <= 0)) {
+                return undefined;
+            }
+
+            this.initSqlBuilder();
+            this.sqlBuilder.setAndWhere('tender_id', {
+                value: tenderId,
+                operate: '=',
+            });
+            this.sqlBuilder.setAndWhere('template_id', {
+                value: nodeId,
+                operate: '=',
+            });
+
+            const [sql, sqlParam] = this.sqlBuilder.build(this.tableName);
+            const data = await this.db.queryOne(sql, sqlParam);
+
+            return data;
+        }
+
+        /**
+         *  select的全部后兄弟节点,Order自增
+         *
+         * @param {Object} select - 选中的节点
+         * @return {Array} - 自增后的数据
+         * @private
+         */
+        async _updateSelectNextsOrder(select) {
+            this.initSqlBuilder();
+            this.sqlBuilder.setAndWhere('tender_id', {
+                value: select.tender_id,
+                operate: '=',
+            });
+            this.sqlBuilder.setAndWhere('order', {
+                value: select.order + 1,
+                operate: '>=',
+            });
+            this.sqlBuilder.setAndWhere('template_pid', {
+                value: select.template_pid,
+                operate: '=',
+            });
+            this.sqlBuilder.setUpdateData('order', {
+                value: 1,
+                selfOperate: '+',
+            });
+            // sql = update this.tableName set order = order + 1 where (tender_id = select.tender_id) && (pid = select.pid) && (order >= select.order+1)
+            const [sql, sqlParam] = this.sqlBuilder.build(this.tableName, 'update');
+            const data = await this.transaction.query(sql, sqlParam);
+
+            return data;
+        }
+
+        /**
+         * 根据selectData, data 新增数据
+         * @param {Number} tenderId - 标段id
+         * @param {Object} selectData - 选中节点的数据
+         * @param {Object} data - 新增节点的初始数据
+         * @return {Object} - 新增结果
+         * @private
+         */
+        async _addNodeData(tenderId, selectData, data) {
+            if (tenderId <= 0) {
+                return undefined;
+            }
+            if (!data) {
+                data = {};
+            }
+            data.tender_id = tenderId;
+            data.template_id = 15;
+            data.template_pid = selectData.template_pid;
+            data.level = selectData.level;
+            data.order = selectData.order + 1;
+            data.full_path = selectData.full_path.replace(selectData.template_id, data.template_id);
+            const result = await this.transaction.insert(this.tableName, data);
+
+            return result;
+        }
+
+        /**
+         * tenderId标段中, 在selectId后新增一个节点
+         * @param {Number} tenderId - 标段id
+         * @param {Number} selectId - 选中节点id
+         * @param {Object} data - 新增节点初始化数据
+         * @return {Array} 新增后的数据,其他被修改的数据
+         */
+        async addNode(tenderId, selectId, data) {
+            if ((tenderId <= 0) || (selectId <= 0)) {
+                return undefined;
+            }
+            const selectData = await this.getDataByNodeId(tenderId, selectId);
+            this.transaction = await this.db.beginTransaction();
+
+            let resultData = [];
+            if (selectData) {
+                try {
+                    // 选中节点的所有后兄弟节点,order+1
+                    const updateData = await this._updateSelectNextsOrder(selectData);
+                    console.log(updateData);
+                    // 数据库创建新增节点数据
+                    const addData = await this._addNodeData(tenderId, selectData, data);
+                    console.log(addData);
+                    resultData = await this.transaction.commit();
+                    console.log(resultData);
+
+                    resultData.concat(updateData, addData);
+                } catch (err) {
+                    await this.transaction.rollback();
+                    throw err;
+                }
+            } else {
+                throw '新增节点数据错误';
+            }
+            return resultData;
+        }
     }
 
     return TenderNode;

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

@@ -0,0 +1,69 @@
+
+/**
+ * 标段 分项数据模型 单元测试
+ *
+ * @author Mai
+ * @date 2017/12/1
+ * @version
+ */
+'use strict';
+
+/*const testNodeData = [
+    { template_id: 1, template_pid: -1, order: 1, level: 1, full_path: '1', code: '1' },
+    { template_id: 2, template_pid: 1, order: 1, level: 2, full_path: '1.2', code: '1-1' },
+    { template_id: 6, template_pid: 2, order: 1, level: 3, full_path: '1.2.6', code: '1-1-1' },
+    { template_id: 7, template_pid: 6, order: 1, level: 4, full_path: '1.2.6.7', code: '202-1' },
+    { template_id: 10, template_pid: 7, order: 2, level: 5, full_path: '1.2.6.7.10', code: '202-1-a' },
+    { template_id: 9, template_pid: 7, order: 1, level: 5, full_path: '1.2.6.7.9', code: '202-1-b' },
+    { template_id: 8, template_pid: 6, order: 2, level: 4, full_path: '1.2.6.8', code: '202-2' },
+    { template_id: 11, template_pid: 8, order: 1, level: 5, full_path: '1.2.6.8.11', code: '202-2-c' },
+    { template_id: 12, template_pid: 8, order: 2, level: 5, full_path: '1.2.6.8.12', code: '202-2-e' },
+    { template_id: 13, template_pid: 2, order: 2, level: 3, full_path: '1.2.13', code: '1-1-2' },
+    { template_id: 14, template_pid: 2, order: 3, level: 3, full_path: '1.2.14', code: '1-1-3' },
+    { template_id: 3, template_pid: 1, order: 2, level: 2, full_path: '1.3', code: '1-2' },
+    { template_id: 4, template_pid: 1, order: 3, level: 2, full_path: '1.4', code: '1-3' },
+    { template_id: 5, template_pid: 1, order: 4, level: 2, full_path: '1.5', code: '1-4' },
+];*/
+let testNodeData = [
+    { template_id: 1, template_pid: -1, order: 1, level: 1, full_path: '1', code: '1' },
+    { template_id: 2, template_pid: 1, order: 1, level: 2, full_path: '1.2', code: '1-1' },
+    { template_id: 6, template_pid: 2, order: 1, level: 3, full_path: '1.2.6', code: '1-1-1' },
+    { template_id: 7, template_pid: 6, order: 1, level: 4, full_path: '1.2.6.7', code: '202-1' },
+    { template_id: 10, template_pid: 7, order: 2, level: 5, full_path: '1.2.6.7.10', code: '202-1-a' },
+    { template_id: 9, template_pid: 7, order: 1, level: 5, full_path: '1.2.6.7.9', code: '202-1-b' },
+    { template_id: 8, template_pid: 6, order: 2, level: 4, full_path: '1.2.6.8', code: '202-2' },
+    { template_id: 11, template_pid: 8, order: 1, level: 5, full_path: '1.2.6.8.11', code: '202-2-c' },
+    { template_id: 12, template_pid: 8, order: 2, level: 5, full_path: '1.2.6.8.12', code: '202-2-e' },
+    { template_id: 13, template_pid: 2, order: 2, level: 3, full_path: '1.2.13', code: '1-1-2' },
+    { template_id: 14, template_pid: 2, order: 3, level: 3, full_path: '1.2.14', code: '1-1-3' },
+    { template_id: 3, template_pid: 1, order: 2, level: 2, full_path: '1.3', code: '1-2' },
+    { template_id: 4, template_pid: 1, order: 3, level: 2, full_path: '1.4', code: '1-3' },
+    { template_id: 5, template_pid: 1, order: 4, level: 2, full_path: '1.5', code: '1-4' },
+];
+const testTenderId = 2;
+
+const { app, assert } = require('egg-mock/bootstrap');
+
+describe('test/app/service/tender_node.test.js', () => {
+    it('clear history test data', function* () {
+        const ctx = app.mockContext();
+        const result = yield ctx.service.tenderNode.db.delete(ctx.service.tenderNode.tableName, {"tender_id": testTenderId});
+        assert(result.affectedRows > 0);
+    });
+
+    it('add test data', function* () {
+        const ctx = app.mockContext();
+        for (let data of testNodeData) {
+            data.tender_id = testTenderId;
+        }
+        const result = yield ctx.service.tenderNode.db.insert(ctx.service.tenderNode.tableName, testNodeData);
+        assert(result.affectedRows === 14);
+    });
+
+    it('test addNode', function* () {
+        const ctx = app.mockContext();
+        // 选中1-1-1,插入节点
+        const resultData = yield ctx.service.tenderNode.addNode(testTenderId, 6);
+        assert(resultData.length === 3);
+    });
+});