Browse Source

台账统一使用ledger

MaiXinRong 7 years ago
parent
commit
f979b76287

+ 2 - 2
app/controller/ledger_controller.js

@@ -32,8 +32,8 @@ module.exports = app => {
                 tender = tenderList[0].id;
             }
 
-            // 获取标段项目节点
-            const tenderNode = await ctx.service.tenderNode.getDataByTenderId(tender);
+            // 获取标段台账
+            const ledgerData = await ctx.service.ledger.getDataByTenderId(tender);
 
             const renderData = {
                 tenderList,

+ 51 - 43
app/service/tender_node.js

@@ -1,16 +1,24 @@
 'use strict';
 
 /**
- * 标段项目节数据模型
+ * 标段--台账 数据模型
  *
  * @author CaiAoLin
  * @date 2017/12/1
  * @version
  */
 
+const needField = {
+    id: 'ledger_id',
+    pid: 'ledger_pid',
+    order: 'order',
+    level: 'level',
+    fullPath: 'full_path'
+}
+
 module.exports = app => {
 
-    class TenderNode extends app.BaseService {
+    class Ledger extends app.BaseService {
 
         /**
          * 构造函数
@@ -20,7 +28,7 @@ module.exports = app => {
          */
         constructor(ctx) {
             super(ctx);
-            this.tableName = 'tender_node';
+            this.tableName = 'ledger';
         }
 
         /**
@@ -45,8 +53,8 @@ module.exports = app => {
                     // 整理数据
                     const insertData = [];
                     for (const tmp of data) {
-                        tmp.template_id = tmp.id;
-                        tmp.template_pid = tmp.pid;
+                        tmp.ledger_id = tmp.id;
+                        tmp.ledger_pid = tmp.pid;
                         tmp.tender_id = tenderId;
                         delete tmp.id;
                         delete tmp.pid;
@@ -113,7 +121,7 @@ module.exports = app => {
                 value: tenderId,
                 operate: '=',
             });
-            this.sqlBuilder.setAndWhere('template_id', {
+            this.sqlBuilder.setAndWhere('ledger_id', {
                 value: nodeId,
                 operate: '=',
             });
@@ -136,7 +144,7 @@ module.exports = app => {
                 value: tenderId,
                 operate: '='
             });
-            this.sqlBuilder.setAndWhere('template_pid', {
+            this.sqlBuilder.setAndWhere('ledger_pid', {
                 value: pid,
                 operate: '='
             });
@@ -165,7 +173,7 @@ module.exports = app => {
                 value: tenderId,
                 operate: '='
             });
-            this.sqlBuilder.setAndWhere('template_pid', {
+            this.sqlBuilder.setAndWhere('ledger_pid', {
                 value: pid,
                 operate: '=',
             });
@@ -209,7 +217,7 @@ module.exports = app => {
                 value: tenderId,
                 operate: '='
             });
-            this.sqlBuilder.setAndWhere('template_pid', {
+            this.sqlBuilder.setAndWhere('ledger_pid', {
                 value: pid,
                 operate: '=',
             });
@@ -242,8 +250,8 @@ module.exports = app => {
                 value: select.order + 1,
                 operate: '>=',
             });
-            this.sqlBuilder.setAndWhere('template_pid', {
-                value: select.template_pid,
+            this.sqlBuilder.setAndWhere('ledger_pid', {
+                value: select.ledger_pid,
                 operate: '=',
             });
             this.sqlBuilder.setUpdateData('order', {
@@ -266,7 +274,7 @@ module.exports = app => {
          */
         async _getMaxNodeId(tenderId) {
             const sql = 'SELECT Max(??) As max_id FROM ?? Where tender_id = ' + tenderId;
-            const sqlParam = ['template_id', this.tableName];
+            const sqlParam = ['ledger_id', this.tableName];
             const queryResult = await this.db.queryOne(sql, sqlParam);
             return queryResult.max_id;
         }
@@ -295,11 +303,11 @@ module.exports = app => {
             }
 
             data.tender_id = tenderId;
-            data.template_id = maxId + 1;
-            data.template_pid = selectData.template_pid;
+            data.ledger_id = maxId + 1;
+            data.ledger_pid = selectData.ledger_pid;
             data.level = selectData.level;
             data.order = selectData.order + 1;
-            data.full_path = selectData.full_path.replace(selectData.template_id, data.template_id);
+            data.full_path = selectData.full_path.replace(selectData.ledger_id, data.ledger_id);
             const result = await this.transaction.insert(this.tableName, data);
 
             this.cache.set(cacheKey, maxId + 1, 'EX', this.ctx.app.config.cacheTime);
@@ -340,8 +348,8 @@ module.exports = app => {
                     value: selectData.tender_id,
                     operate: '=',
                 });
-                this.sqlBuilder.setAndWhere('template_pid', {
-                    value: selectData.template_pid,
+                this.sqlBuilder.setAndWhere('ledger_pid', {
+                    value: selectData.ledger_pid,
                     operate: '=',
                 });
                 this.sqlBuilder.setAndWhere('order', {
@@ -423,7 +431,7 @@ module.exports = app => {
                 return [];
             }
             const selectData = await this.getDataByNodeId(tenderId, selectId);
-            const preData = await this.getDataByParentAndOrder(tenderId, selectData.template_pid, selectData.order - 1);
+            const preData = await this.getDataByParentAndOrder(tenderId, selectData.ledger_pid, selectData.order - 1);
             this.transaction = await this.db.beginTransaction();
 
             if (selectData && preData) {
@@ -436,7 +444,7 @@ module.exports = app => {
                     throw err;
                 }
 
-                const resultData = await this.getDataByParentAndOrder(tenderId, selectData.template_pid, [selectData.order, preData.order]);
+                const resultData = await this.getDataByParentAndOrder(tenderId, selectData.ledger_pid, [selectData.order, preData.order]);
                 return resultData;
             } else {
                 throw '上移节点数据错误';
@@ -455,7 +463,7 @@ module.exports = app => {
                 return [];
             }
             const selectData = await this.getDataByNodeId(tenderId, selectId);
-            const nextData = await this.getDataByParentAndOrder(tenderId, selectData.template_pid, selectData.order + 1);
+            const nextData = await this.getDataByParentAndOrder(tenderId, selectData.ledger_pid, selectData.order + 1);
             this.transaction = await this.db.beginTransaction();
 
             if (selectData && nextData) {
@@ -468,7 +476,7 @@ module.exports = app => {
                     throw err;
                 }
 
-                const resultData = await this.getDataByParentAndOrder(tenderId, selectData.template_pid, [selectData.order, nextData.order]);
+                const resultData = await this.getDataByParentAndOrder(tenderId, selectData.ledger_pid, [selectData.order, nextData.order]);
                 return resultData;
             } else {
                 throw '下移节点数据错误';
@@ -496,7 +504,7 @@ module.exports = app => {
                 selfOperate: '-'
             });
             this.sqlBuilder.setUpdateData('full_path', {
-                value: ['`full_path`', this.db.escape(selectData.template_pid + '.'), this.db.escape('')],
+                value: ['`full_path`', this.db.escape(selectData.ledger_pid + '.'), this.db.escape('')],
                 literal: 'Replace'
             });
             const [sql, sqlParam] = this.sqlBuilder.build(this.tableName, 'update');
@@ -513,21 +521,21 @@ module.exports = app => {
          */
         async _syncUpLevelNexts(selectData) {
             // 查询selectData的lastChild
-            const lastChildData = await this.getLastChildData(selectData.tender_id, selectData.template_id);
-            const nextsData = await this.getNextsData(selectData.tender_id, selectData.template_pid, selectData.order);
+            const lastChildData = await this.getLastChildData(selectData.tender_id, selectData.ledger_id);
+            const nextsData = await this.getNextsData(selectData.tender_id, selectData.ledger_pid, selectData.order);
             if (nextsData && nextsData.length > 0) {
                 // 修改nextsData pid, 排序
                 this.initSqlBuilder();
-                this.sqlBuilder.setUpdateData('template_pid', {
-                    value: selectData.template_id
+                this.sqlBuilder.setUpdateData('ledger_pid', {
+                    value: selectData.ledger_id
                 });
                 const orderInc = lastChildData ? lastChildData.order - selectData.order : - selectData.order;
                 this.sqlBuilder.setUpdateData('order', {
                     value: Math.abs(orderInc),
                     selfOperate: orderInc > 0 ? '+' : '-'
                 });
-                this.sqlBuilder.setAndWhere('template_pid', {
-                    value: selectData.template_pid,
+                this.sqlBuilder.setAndWhere('ledger_pid', {
+                    value: selectData.ledger_pid,
                     operate: '='
                 });
                 this.sqlBuilder.setAndWhere('order', {
@@ -538,8 +546,8 @@ module.exports = app => {
                 await this.transaction.query(sql1, sqlParam1);
 
                 // 修改nextsData及其子节点的full_path
-                const oldSubStr = this.db.escape(selectData.template_pid + '.');
-                const newSubStr = this.db.escape(selectData.template_id + '.');
+                const oldSubStr = this.db.escape(selectData.ledger_pid + '.');
+                const newSubStr = this.db.escape(selectData.ledger_id + '.');
                 const sqlArr = [];
                 sqlArr.push('Update ?? SET `full_path` = Replace(`full_path`,' + oldSubStr + ',' + newSubStr + ') Where');
                 sqlArr.push('(`tender_id` = ' + selectData.tender_id +')');
@@ -572,7 +580,7 @@ module.exports = app => {
             if (!selectData) {
                 throw '升级节点数据错误';
             }
-            const parentData = await this.getDataByNodeId(tenderId, selectData.template_pid);
+            const parentData = await this.getDataByNodeId(tenderId, selectData.ledger_pid);
             if (!parentData) {
                 throw '升级节点数据错误'
             }
@@ -583,10 +591,10 @@ module.exports = app => {
                 await this._updateSelectNextsOrder(parentData);
                 // 选中节点 修改pid, order, full_path
                 const updateData = {id: selectData.id,
-                    template_pid: parentData.template_pid,
+                    ledger_pid: parentData.ledger_pid,
                     order: parentData.order + 1,
                     level: selectData.level - 1,
-                    full_path: selectData.full_path.replace(selectData.template_pid + '.', '')
+                    full_path: selectData.full_path.replace(selectData.ledger_pid + '.', '')
                 };
                 await this.transaction.update(this.tableName, updateData);
                 // 选中节点--全部子节点(含孙) level-1, full_path变更
@@ -606,12 +614,12 @@ module.exports = app => {
                 operate: '='
             });
             this.sqlBuilder.setAndWhere('full_path', {
-                value: this.db.escape(selectData.full_path.replace(selectData.template_pid + '.', '') + '%'),
+                value: this.db.escape(selectData.full_path.replace(selectData.ledger_pid + '.', '') + '%'),
                 operate: 'Like'
             });
             const [sql, sqlParam] = this.sqlBuilder.build(this.tableName);
             const resultData1 = await this.db.query(sql, sqlParam);
-            const resultData2 = await this.getNextsData(tenderId, parentData.template_pid, parentData.order + 1);
+            const resultData2 = await this.getNextsData(tenderId, parentData.ledger_pid, parentData.order + 1);
             return resultData1.concat(resultData2);
         }
 
@@ -637,7 +645,7 @@ module.exports = app => {
                 selfOperate: '+'
             });
             this.sqlBuilder.setUpdateData('full_path', {
-                value: ['`full_path`', this.db.escape(selectData.template_id), this.db.escape(preData.template_id + '.' + selectData.template_id)],
+                value: ['`full_path`', this.db.escape(selectData.ledger_id), this.db.escape(preData.ledger_id + '.' + selectData.ledger_id)],
                 literal: 'Replace'
             });
             const [sql, sqlParam] = this.sqlBuilder.build(this.tableName, 'update');
@@ -661,11 +669,11 @@ module.exports = app => {
             if (!selectData) {
                 throw '降级节点数据错误';
             }
-            const preData = await this.getDataByParentAndOrder(tenderId, selectData.template_pid, selectData.order-1);
+            const preData = await this.getDataByParentAndOrder(tenderId, selectData.ledger_pid, selectData.order-1);
             if (!preData) {
                 throw '节点不可降级';
             }
-            const preLastChildData = await this.getLastChildData(tenderId, preData.template_id);
+            const preLastChildData = await this.getLastChildData(tenderId, preData.ledger_id);
 
             this.transaction = await this.db.beginTransaction();
             try {
@@ -673,10 +681,10 @@ module.exports = app => {
                 await this._updateSelectNextsOrder(selectData, -1);
                 // 选中节点 修改pid, level, order, full_path
                 const updateData = {id: selectData.id,
-                    template_pid: preData.template_pid,
+                    ledger_pid: preData.ledger_pid,
                     order: preLastChildData ? preLastChildData.order + 1 : 1,
                     level: selectData.level + 1,
-                    full_path: selectData.full_path.replace(selectData.template_id, preData.template_id + '.' + selectData.template_id)
+                    full_path: selectData.full_path.replace(selectData.ledger_id, preData.ledger_id + '.' + selectData.ledger_id)
                 };
                 await this.transaction.update(this.tableName, updateData);
                 // 选中节点--全部子节点(含孙) level++, full_path
@@ -694,15 +702,15 @@ module.exports = app => {
                 operate: '='
             });
             this.sqlBuilder.setAndWhere('full_path', {
-                value: this.db.escape(selectData.full_path.replace(selectData.template_id, preData.template_id + '.' + selectData.template_id) + '%'),
+                value: this.db.escape(selectData.full_path.replace(selectData.ledger_id, preData.ledger_id + '.' + selectData.ledger_id) + '%'),
                 operate: 'Like'
             });
             const [sql, sqlParam] = this.sqlBuilder.build(this.tableName);
             const resultData1 = await this.db.query(sql, sqlParam);
-            const resultData2 = await this.getNextsData(tenderId, preData.template_pid, preData.order);
+            const resultData2 = await this.getNextsData(tenderId, preData.ledger_pid, preData.order);
             return resultData1.concat(resultData2);
         }
     }
 
-    return TenderNode;
+    return Ledger;
 };

+ 2 - 2
app/service/tender.js

@@ -99,8 +99,8 @@ module.exports = app => {
                 // 获取标段项目节点模板
                 const tenderNodeTemplateData = await this.ctx.service.tenderNodeTemplate.getData();
                 // 复制模板数据到标段数据表
-                this.ctx.service.tenderNode.transaction = this.transaction;
-                const copyResult = await this.ctx.service.tenderNode.add(tenderNodeTemplateData, operate.insertId);
+                this.ctx.service.ledger.transaction = this.transaction;
+                const copyResult = await this.ctx.service.ledger.add(tenderNodeTemplateData, operate.insertId);
 
                 if (!copyResult) {
                     throw '新增标段项目节点失败';

+ 128 - 0
test/app/service/ledger.test.js

@@ -0,0 +1,128 @@
+
+/**
+ * 标段--台账 模型 单元测试
+ *
+ * @author Mai
+ * @date 2017/12/1
+ * @version
+ */
+'use strict';
+
+/* const testNodeData = [
+    { ledger_id: 1, ledger_pid: -1, order: 1, level: 1, full_path: '1', code: '1' },
+    { ledger_id: 2, ledger_pid: 1, order: 1, level: 2, full_path: '1.2', code: '1-1' },
+    { ledger_id: 6, ledger_pid: 2, order: 1, level: 3, full_path: '1.2.6', code: '1-1-1' },
+    { ledger_id: 7, ledger_pid: 6, order: 1, level: 4, full_path: '1.2.6.7', code: '202-1' },
+    { ledger_id: 10, ledger_pid: 7, order: 2, level: 5, full_path: '1.2.6.7.10', code: '202-1-a' },
+    { ledger_id: 9, ledger_pid: 7, order: 1, level: 5, full_path: '1.2.6.7.9', code: '202-1-b' },
+    { ledger_id: 8, ledger_pid: 6, order: 2, level: 4, full_path: '1.2.6.8', code: '202-2' },
+    { ledger_id: 11, ledger_pid: 8, order: 1, level: 5, full_path: '1.2.6.8.11', code: '202-2-c' },
+    { ledger_id: 12, ledger_pid: 8, order: 2, level: 5, full_path: '1.2.6.8.12', code: '202-2-e' },
+    { ledger_id: 13, ledger_pid: 2, order: 2, level: 3, full_path: '1.2.13', code: '1-1-2' },
+    { ledger_id: 14, ledger_pid: 2, order: 3, level: 3, full_path: '1.2.14', code: '1-1-3' },
+    { ledger_id: 3, ledger_pid: 1, order: 2, level: 2, full_path: '1.3', code: '1-2' },
+    { ledger_id: 4, ledger_pid: 1, order: 3, level: 2, full_path: '1.4', code: '1-3' },
+    { ledger_id: 5, ledger_pid: 1, order: 4, level: 2, full_path: '1.5', code: '1-4' },
+];*/
+const testNodeData = [
+    { ledger_id: 1, ledger_pid: -1, order: 1, level: 1, full_path: '1', code: '1' },
+    { ledger_id: 2, ledger_pid: 1, order: 1, level: 2, full_path: '1.2', code: '1-1' },
+    { ledger_id: 6, ledger_pid: 2, order: 1, level: 3, full_path: '1.2.6', code: '1-1-1' },
+    { ledger_id: 7, ledger_pid: 6, order: 1, level: 4, full_path: '1.2.6.7', code: '202-1' },
+    { ledger_id: 10, ledger_pid: 7, order: 2, level: 5, full_path: '1.2.6.7.10', code: '202-1-a' },
+    { ledger_id: 9, ledger_pid: 7, order: 1, level: 5, full_path: '1.2.6.7.9', code: '202-1-b' },
+    { ledger_id: 8, ledger_pid: 6, order: 2, level: 4, full_path: '1.2.6.8', code: '202-2' },
+    { ledger_id: 11, ledger_pid: 8, order: 1, level: 5, full_path: '1.2.6.8.11', code: '202-2-c' },
+    { ledger_id: 12, ledger_pid: 8, order: 2, level: 5, full_path: '1.2.6.8.12', code: '202-2-e' },
+    { ledger_id: 13, ledger_pid: 2, order: 2, level: 3, full_path: '1.2.13', code: '1-1-2' },
+    { ledger_id: 14, ledger_pid: 2, order: 3, level: 3, full_path: '1.2.14', code: '1-1-3' },
+    { ledger_id: 3, ledger_pid: 1, order: 2, level: 2, full_path: '1.3', code: '1-2' },
+    { ledger_id: 15, ledger_pid: 3, order: 1, level: 3, full_path: '1.3.15', code: '1-2-1'},
+    { ledger_id: 4, ledger_pid: 1, order: 3, level: 2, full_path: '1.4', code: '1-3' },
+    { ledger_id: 16, ledger_pid: 4, order: 1, level: 3, full_path: '1.4.16', code: '1-3-1'},
+    { ledger_id: 5, ledger_pid: 1, order: 4, level: 2, full_path: '1.5', code: '1-4' },
+];
+const testTenderId = 3;
+
+const { app, assert } = require('egg-mock/bootstrap');
+
+describe('test/app/service/ledger.test.js', () => {
+    it('clear history test data', function* () {
+        const ctx = app.mockContext();
+        const result = yield ctx.service.ledger.db.delete(ctx.service.ledger.tableName, { tender_id: testTenderId });
+        assert(result.affectedRows >= 0);
+    });
+
+    it('add test data', function* () {
+        const ctx = app.mockContext();
+        for (const data of testNodeData) {
+            data.tender_id = testTenderId;
+        }
+        const result = yield ctx.service.ledger.db.insert(ctx.service.ledger.tableName, testNodeData);
+        assert(result.affectedRows === testNodeData.length);
+    });
+
+    it('test addNode', function* () {
+        const ctx = app.mockContext();
+        // 选中1-1-1,插入节点
+        const resultData = yield ctx.service.ledger.addNode(testTenderId, 6);
+        assert(resultData.length === 3);
+    });
+
+    it('test deleteNode', function* () {
+        const ctx = app.mockContext();
+        // 选中202-1,删除节点
+        const resultData = yield ctx.service.ledger.deleteNode(testTenderId, 7);
+        assert(resultData.length === 3);
+    });
+
+    it('test upMoveNode', function* () {
+        const ctx = app.mockContext();
+        // 选中202-2-e上移
+        let resultData = yield ctx.service.ledger.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 downMoveNode', function* () {
+        const ctx = app.mockContext();
+        // 选中202-2-e下移
+        let resultData = yield ctx.service.ledger.downMoveNode(testTenderId, 12);
+        resultData.sort(function (x, y) {
+            return x.order - y.order;
+        });
+        assert(resultData.length === 2);
+        assert(resultData[0].code === '202-2-c');
+    });
+
+    it('test upLevelNode', function* () {
+        const ctx = app.mockContext();
+        // 选中 1-1-2 升级
+        let resultData = yield ctx.service.ledger.upLevelNode(testTenderId, 13);
+        assert(resultData);
+        assert(resultData.length === 5);
+        assert(resultData[0].full_path === '1.13');
+        assert(resultData[0].ledger_pid === 1);
+        assert(resultData[1].ledger_pid === 13);
+        assert(resultData[1].full_path === '1.13.14');
+        assert(resultData[2].order === 3);
+        assert(resultData[3].order === 4);
+        assert(resultData[4].order === 5);
+    });
+
+    it('test downLevelNode', function* () {
+        const ctx = app.mockContext();
+        // 选中1-3 降级
+        let resultData = yield ctx.service.ledger.downLevelNode(testTenderId, 4);
+        assert(resultData.length === 3);
+        assert(resultData[0].full_path === '1.3.4');
+        assert(resultData[0].level === 3);
+        assert(resultData[0].order === 2);
+        assert(resultData[1].level === 4);
+        assert(resultData[1].full_path === '1.3.4.16');
+        assert(resultData[2].order === 4);
+    })
+});

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

@@ -1,128 +0,0 @@
-
-/**
- * 标段 分项数据模型 单元测试
- *
- * @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' },
-];*/
-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: 15, template_pid: 3, order: 1, level: 3, full_path: '1.3.15', code: '1-2-1'},
-    { template_id: 4, template_pid: 1, order: 3, level: 2, full_path: '1.4', code: '1-3' },
-    { template_id: 16, template_pid: 4, order: 1, level: 3, full_path: '1.4.16', code: '1-3-1'},
-    { template_id: 5, template_pid: 1, order: 4, level: 2, full_path: '1.5', code: '1-4' },
-];
-const testTenderId = 3;
-
-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 (const data of testNodeData) {
-            data.tender_id = testTenderId;
-        }
-        const result = yield ctx.service.tenderNode.db.insert(ctx.service.tenderNode.tableName, testNodeData);
-        assert(result.affectedRows === testNodeData.length);
-    });
-
-    it('test addNode', function* () {
-        const ctx = app.mockContext();
-        // 选中1-1-1,插入节点
-        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 downMoveNode', 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');
-    });
-
-    it('test upLevelNode', function* () {
-        const ctx = app.mockContext();
-        // 选中 1-1-2 升级
-        let resultData = yield ctx.service.tenderNode.upLevelNode(testTenderId, 13);
-        assert(resultData);
-        assert(resultData.length === 5);
-        assert(resultData[0].full_path === '1.13');
-        assert(resultData[0].template_pid === 1);
-        assert(resultData[1].template_pid === 13);
-        assert(resultData[1].full_path === '1.13.14');
-        assert(resultData[2].order === 3);
-        assert(resultData[3].order === 4);
-        assert(resultData[4].order === 5);
-    });
-
-    it('test downLevelNode', function* () {
-        const ctx = app.mockContext();
-        // 选中1-3 降级
-        let resultData = yield ctx.service.tenderNode.downLevelNode(testTenderId, 4);
-        assert(resultData.length === 3);
-        assert(resultData[0].full_path === '1.3.4');
-        assert(resultData[0].level === 3);
-        assert(resultData[0].order === 2);
-        assert(resultData[1].level === 4);
-        assert(resultData[1].full_path === '1.3.4.16');
-        assert(resultData[2].order === 4);
-    })
-});