|
@@ -1,4 +1,3 @@
|
|
|
-
|
|
|
/**
|
|
|
* 标段--台账 模型 单元测试
|
|
|
*
|
|
@@ -8,23 +7,7 @@
|
|
|
*/
|
|
|
'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 = [
|
|
|
+/*const testNodeData = [
|
|
|
{ ledger_id: 1, ledger_pid: -1, order: 1, level: 1, full_path: '1', code: '1', is_leaf: false },
|
|
|
{ ledger_id: 2, ledger_pid: 1, order: 1, level: 2, full_path: '1.2', code: '1-1', is_leaf: false },
|
|
|
{ ledger_id: 6, ledger_pid: 2, order: 1, level: 3, full_path: '1.2.6', code: '1-1-1', is_leaf: false },
|
|
@@ -41,6 +24,24 @@ const testNodeData = [
|
|
|
{ ledger_id: 4, ledger_pid: 1, order: 3, level: 2, full_path: '1.4', code: '1-3', is_leaf: false },
|
|
|
{ ledger_id: 16, ledger_pid: 4, order: 1, level: 3, full_path: '1.4.16', code: '1-3-1', is_leaf: true },
|
|
|
{ ledger_id: 5, ledger_pid: 1, order: 4, level: 2, full_path: '1.5', code: '1-4', is_leaf: true },
|
|
|
+];*/
|
|
|
+const testNodeData = [
|
|
|
+ { id: 1, pid: -1, order: 1, level: 1, full_path: '1', code: '1', is_leaf: false },
|
|
|
+ { id: 2, pid: 1, order: 1, level: 2, full_path: '1.2', code: '1-1', is_leaf: false },
|
|
|
+ { id: 6, pid: 2, order: 1, level: 3, full_path: '1.2.6', code: '1-1-1', is_leaf: false },
|
|
|
+ { id: 7, pid: 6, order: 1, level: 4, full_path: '1.2.6.7', code: '202-1', is_leaf: false },
|
|
|
+ { id: 10, pid: 7, order: 2, level: 5, full_path: '1.2.6.7.10', code: '202-1-a', is_leaf: true },
|
|
|
+ { id: 9, pid: 7, order: 1, level: 5, full_path: '1.2.6.7.9', code: '202-1-b', is_leaf: true },
|
|
|
+ { id: 8, pid: 6, order: 2, level: 4, full_path: '1.2.6.8', code: '202-2', is_leaf: false },
|
|
|
+ { id: 11, pid: 8, order: 1, level: 5, full_path: '1.2.6.8.11', code: '202-2-c', is_leaf: true },
|
|
|
+ { id: 12, pid: 8, order: 2, level: 5, full_path: '1.2.6.8.12', code: '202-2-e', is_leaf: true },
|
|
|
+ { id: 13, pid: 2, order: 2, level: 3, full_path: '1.2.13', code: '1-1-2', is_leaf: true },
|
|
|
+ { id: 14, pid: 2, order: 3, level: 3, full_path: '1.2.14', code: '1-1-3', is_leaf: true },
|
|
|
+ { id: 3, pid: 1, order: 2, level: 2, full_path: '1.3', code: '1-2', is_leaf: false },
|
|
|
+ { id: 15, pid: 3, order: 1, level: 3, full_path: '1.3.15', code: '1-2-1', is_leaf: true },
|
|
|
+ { id: 4, pid: 1, order: 3, level: 2, full_path: '1.4', code: '1-3', is_leaf: false },
|
|
|
+ { id: 16, pid: 4, order: 1, level: 3, full_path: '1.4.16', code: '1-3-1', is_leaf: true },
|
|
|
+ { id: 5, pid: 1, order: 4, level: 2, full_path: '1.5', code: '1-4', is_leaf: true },
|
|
|
];
|
|
|
const testTenderId = 3;
|
|
|
|
|
@@ -59,13 +60,15 @@ describe('test/app/service/ledger.test.js', () => {
|
|
|
const result = yield ctx.service.ledger.db.delete(ctx.service.ledger.tableName, { tender_id: testTenderId });
|
|
|
assert(result.affectedRows >= 0);
|
|
|
});
|
|
|
- it('add test data', function* () {
|
|
|
+ it('add test data(test add)', 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);
|
|
|
+ //const result = yield ctx.service.ledger.db.insert(ctx.service.ledger.tableName, testNodeData);
|
|
|
+ //assert(result.affectedRows === testNodeData.length);
|
|
|
+ const result = yield ctx.service.ledger.add(testNodeData, testTenderId);
|
|
|
+ assert(result);
|
|
|
ctx.service.ledger.cache.set('tender_node_maxId:' + testTenderId, 16, 'EX', ctx.app.config.cacheTime);
|
|
|
});
|
|
|
/* 期望运行结果:
|
|
@@ -120,6 +123,16 @@ describe('test/app/service/ledger.test.js', () => {
|
|
|
node = findById(result, 9);
|
|
|
assert(node.full_path === '1.2.6.7.9');
|
|
|
});
|
|
|
+ it('test getDataByIds', function* () {
|
|
|
+ const ctx = app.mockContext();
|
|
|
+
|
|
|
+ // 查询节点202-1
|
|
|
+ const node = yield ctx.service.ledger.getDataByNodeId(testTenderId, 7);
|
|
|
+ const result = yield ctx.service.ledger.getDataByIds([node.id]);
|
|
|
+ assert(result.length === 1);
|
|
|
+ assert(node.code === result[0].code);
|
|
|
+ assert(node.full_path === result[0].full_path);
|
|
|
+ });
|
|
|
it('test getLastChildData', function* () {
|
|
|
const ctx = app.mockContext();
|
|
|
|
|
@@ -163,10 +176,25 @@ describe('test/app/service/ledger.test.js', () => {
|
|
|
assert(node);
|
|
|
assert(node.full_path === '1.2.6.8.12');
|
|
|
});
|
|
|
+ it('test getNextsData', function* () {
|
|
|
+ const ctx = app.mockContext();
|
|
|
+
|
|
|
+ // 查询节点1-1-1的全部子节点
|
|
|
+ const result = yield ctx.service.ledger.getNextsData(testTenderId, 2, 1);
|
|
|
+ assert(result.length === 2);
|
|
|
+
|
|
|
+ let node = findById(result, 13);
|
|
|
+ assert(node);
|
|
|
+ assert(node.code === '1-1-2');
|
|
|
+
|
|
|
+ node = findById(result, 14);
|
|
|
+ assert(node);
|
|
|
+ assert(node.code === '1-1-3');
|
|
|
+ });
|
|
|
it('test getDataByFullPath', function* () {
|
|
|
const ctx = app.mockContext();
|
|
|
|
|
|
- // 查询节点202-1最后一个子节点
|
|
|
+ // 查询节点202-2及其子节点
|
|
|
const result = yield ctx.service.ledger.getDataByFullPath(testTenderId, '1.2.6.8%');
|
|
|
assert(result.length === 3);
|
|
|
|
|
@@ -181,24 +209,24 @@ describe('test/app/service/ledger.test.js', () => {
|
|
|
node = findById(result, 12);
|
|
|
assert(node);
|
|
|
assert(node.full_path === '1.2.6.8.12');
|
|
|
+
|
|
|
+ // 查询1-1-1的子孙节点
|
|
|
+ const result1 = yield ctx.service.ledger.getDataByFullPath(testTenderId, '1.2.6.%');
|
|
|
+ assert(result1.length === 6);
|
|
|
});
|
|
|
- it('test getNextsData', function* () {
|
|
|
+ it('test getFullLevelDataByFullPath', function* () {
|
|
|
const ctx = app.mockContext();
|
|
|
|
|
|
- // 查询节点202-1最后一个子节点
|
|
|
- const result = yield ctx.service.ledger.getNextsData(testTenderId, 2, 1);
|
|
|
- assert(result.length === 2);
|
|
|
-
|
|
|
- let node = findById(result, 13);
|
|
|
- assert(node);
|
|
|
- assert(node.code === '1-1-2');
|
|
|
+ // 查询202-2-c及其全部父节点
|
|
|
+ const result1 = yield ctx.service.ledger.getFullLevelDataByFullPath(testTenderId, '1.2.6.8.11');
|
|
|
+ assert(result1.length === 5);
|
|
|
|
|
|
- node = findById(result, 14);
|
|
|
- assert(node);
|
|
|
- assert(node.code === '1-1-3');
|
|
|
+ const result2 = yield ctx.service.ledger.getFullLevelDataByFullPath(testTenderId, ['1.2.6.8.11', '1.2.6.7.9']);
|
|
|
+ assert(result2.length === 7);
|
|
|
});
|
|
|
|
|
|
// 测试CUD类方法
|
|
|
+ // 基本树结构操作
|
|
|
it('test addNode', function* () {
|
|
|
const ctx = app.mockContext();
|
|
|
// 选中1-1-1,插入节点
|
|
@@ -307,7 +335,7 @@ describe('test/app/service/ledger.test.js', () => {
|
|
|
// 选中 1-1-2 升级
|
|
|
const resultData = yield ctx.service.ledger.upLevelNode(testTenderId, 13);
|
|
|
assert(resultData);
|
|
|
- assert(resultData.update.length === 5);
|
|
|
+ assert(resultData.update.length === 6);
|
|
|
|
|
|
let node = findById(resultData.update, 13);
|
|
|
assert(node.full_path === '1.13');
|
|
@@ -378,6 +406,7 @@ describe('test/app/service/ledger.test.js', () => {
|
|
|
│ └── 1-3-1
|
|
|
└── 1-4
|
|
|
*/
|
|
|
+ // 复制整块
|
|
|
it('test pasteBlock', function* () {
|
|
|
const ctx = app.mockContext();
|
|
|
// 选中1-2-1, 粘贴1-1-1和new
|
|
@@ -416,6 +445,7 @@ describe('test/app/service/ledger.test.js', () => {
|
|
|
│ └── 1-3-1
|
|
|
└── 1-4
|
|
|
*/
|
|
|
+ // 增量计算
|
|
|
it('test updateInfo', function* () {
|
|
|
const ctx = app.mockContext();
|
|
|
|
|
@@ -438,7 +468,7 @@ describe('test/app/service/ledger.test.js', () => {
|
|
|
│ │ └── 202-2
|
|
|
│ │ ├── 202-2-c
|
|
|
│ │ └── 202-2-e
|
|
|
- │ └── 1-1-3
|
|
|
+ │ └── 1-1-4
|
|
|
├── 1-1-2
|
|
|
│ └── 1-1-3
|
|
|
├── 1-2
|
|
@@ -455,7 +485,7 @@ describe('test/app/service/ledger.test.js', () => {
|
|
|
it('test updateInfos', function* () {
|
|
|
const ctx = app.mockContext();
|
|
|
|
|
|
- // 修改new(id=17)的code 为 1-1-4
|
|
|
+ // 修改1-1-1(id=18)的code 为 1-2-2、修改new(id=22)的code 为 1-2-3
|
|
|
const node1 = yield ctx.service.ledger.getDataByNodeId(testTenderId, 18);
|
|
|
assert(node1);
|
|
|
const node2 = yield ctx.service.ledger.getDataByNodeId(testTenderId, 22);
|
|
@@ -483,6 +513,383 @@ describe('test/app/service/ledger.test.js', () => {
|
|
|
│ │ └── 202-2
|
|
|
│ │ ├── 202-2-c
|
|
|
│ │ └── 202-2-e
|
|
|
+ │ └── 1-1-4
|
|
|
+ ├── 1-1-2
|
|
|
+ │ └── 1-1-3
|
|
|
+ ├── 1-2
|
|
|
+ │ ├── 1-2-1
|
|
|
+ │ ├── 1-2-2
|
|
|
+ │ │ └── 202-2
|
|
|
+ │ │ ├── 202-2-c
|
|
|
+ │ │ └── 202-2-e
|
|
|
+ │ ├── 1-2-3
|
|
|
+ │ └── 1-3
|
|
|
+ │ └── 1-3-1
|
|
|
+ └── 1-4
|
|
|
+ */
|
|
|
+ it('test updateCalc - update 1', function* () {
|
|
|
+ const ctx = app.mockContext();
|
|
|
+ // 修改202-2-e(1-1-1下)(id=12)的quantity为2.00000001, unit_price位3.0000005
|
|
|
+ const qty = 2.00000001;
|
|
|
+ const up = 3.0000005;
|
|
|
+ const tp = 6.00000103;
|
|
|
+ const node1 = yield ctx.service.ledger.getDataByNodeId(testTenderId, 12);
|
|
|
+ assert(node1);
|
|
|
+ const resultData = yield ctx.service.ledger.updateCalc(testTenderId, {
|
|
|
+ id: node1.id,
|
|
|
+ tender_id: node1.tender_id,
|
|
|
+ ledger_id: node1.ledger_id,
|
|
|
+ quantity: qty,
|
|
|
+ unit_price: up
|
|
|
+ });
|
|
|
+ assert(resultData.length === 5);
|
|
|
+ let node = findById(resultData, 12);
|
|
|
+ assert(node.total_price.toFixed(8) == tp);
|
|
|
+ node = findById(resultData, 8);
|
|
|
+ assert(node.total_price.toFixed(8) == tp);
|
|
|
+ node = findById(resultData, 6);
|
|
|
+ assert(node.total_price.toFixed(8) == tp);
|
|
|
+ node = findById(resultData, 2);
|
|
|
+ assert(node.total_price.toFixed(8) == tp);
|
|
|
+ node = findById(resultData, 1);
|
|
|
+ assert(node.total_price.toFixed(8) == tp);
|
|
|
+ });
|
|
|
+ /* 期望运行结果:
|
|
|
+ 1 6.00000103
|
|
|
+ ├── 1-1 6.00000103
|
|
|
+ │ ├── 1-1-1 6.00000103
|
|
|
+ │ │ └── 202-2 6.00000103
|
|
|
+ │ │ ├── 202-2-c
|
|
|
+ │ │ └── 202-2-e 2.00000001 3.0000005 6.00000103
|
|
|
+ │ └── 1-1-4
|
|
|
+ ├── 1-1-2
|
|
|
+ │ └── 1-1-3
|
|
|
+ ├── 1-2
|
|
|
+ │ ├── 1-2-1
|
|
|
+ │ ├── 1-2-2
|
|
|
+ │ │ └── 202-2
|
|
|
+ │ │ ├── 202-2-c
|
|
|
+ │ │ └── 202-2-e
|
|
|
+ │ ├── 1-2-3
|
|
|
+ │ └── 1-3
|
|
|
+ │ └── 1-3-1
|
|
|
+ └── 1-4
|
|
|
+ */
|
|
|
+ it('test updateCalc - update N', function* () {
|
|
|
+ const ctx = app.mockContext();
|
|
|
+ // 修改202-2-c(1-1-1下)(id=11)的quantity为4.00000025, unit_price为6.0000083
|
|
|
+ // 202-2-c(1-2-2下)(id=20)的quantity为2.0000001, unit_price为5.000065
|
|
|
+ // 202-2-e(1-2-2下)(id=21)的quantity为8.0000579, unit_price为4.0000086
|
|
|
+ const qty = [4.00000025, 2.0000001, 8.0000579];
|
|
|
+ const up = [6.0000083, 5.000065, 4.0000086];
|
|
|
+ const tp = [24.0000347, 10.0001305, 32.0003004];
|
|
|
+ const sum = [30.00003573, 42.0004309, 72.00046663]
|
|
|
+ const node1 = yield ctx.service.ledger.getDataByNodeId(testTenderId, 11);
|
|
|
+ assert(node1);
|
|
|
+ const node2 = yield ctx.service.ledger.getDataByNodeId(testTenderId, 20);
|
|
|
+ assert(node2);
|
|
|
+ const node3 = yield ctx.service.ledger.getDataByNodeId(testTenderId, 21);
|
|
|
+ assert(node3);
|
|
|
+
|
|
|
+ const resultData = yield ctx.service.ledger.updateCalc(testTenderId, [{
|
|
|
+ id: node1.id,
|
|
|
+ tender_id: node1.tender_id,
|
|
|
+ ledger_id: node1.ledger_id,
|
|
|
+ quantity: qty[0],
|
|
|
+ unit_price: up[0]
|
|
|
+ }, {
|
|
|
+ id: node2.id,
|
|
|
+ tender_id: node2.tender_id,
|
|
|
+ ledger_id: node2.ledger_id,
|
|
|
+ quantity: qty[1],
|
|
|
+ unit_price: up[1]
|
|
|
+ }, {
|
|
|
+ id: node3.id,
|
|
|
+ tender_id: node3.tender_id,
|
|
|
+ ledger_id: node3.ledger_id,
|
|
|
+ quantity: qty[2],
|
|
|
+ unit_price: up[2]
|
|
|
+ }]);
|
|
|
+
|
|
|
+ assert(resultData.length === 10);
|
|
|
+
|
|
|
+ let node = findById(resultData, 11);
|
|
|
+ assert(node.total_price.toFixed(8) == tp[0]);
|
|
|
+
|
|
|
+ node = findById(resultData, 8);
|
|
|
+ assert(node.total_price.toFixed(8) == sum[0]);
|
|
|
+ node = findById(resultData, 6);
|
|
|
+ assert(node.total_price.toFixed(8) == sum[0]);
|
|
|
+ node = findById(resultData, 2);
|
|
|
+ assert(node.total_price.toFixed(8) == sum[0]);
|
|
|
+
|
|
|
+ node = findById(resultData, 20);
|
|
|
+ assert(node.total_price.toFixed(8) == tp[1]);
|
|
|
+ node = findById(resultData, 21);
|
|
|
+ assert(node.total_price.toFixed(8) == tp[2]);
|
|
|
+
|
|
|
+ node = findById(resultData, 19);
|
|
|
+ assert(node.total_price.toFixed(8) == sum[1]);
|
|
|
+ node = findById(resultData, 18);
|
|
|
+ assert(node.total_price.toFixed(8) == sum[1]);
|
|
|
+ node = findById(resultData, 3);
|
|
|
+ assert(node.total_price.toFixed(8) == sum[1]);
|
|
|
+
|
|
|
+ node = findById(resultData, 1);
|
|
|
+ assert(node.total_price.toFixed(8) == sum[2]);
|
|
|
+ });
|
|
|
+ /* 期望运行结果:
|
|
|
+ 1 72.00046663
|
|
|
+ ├── 1-1 30.00003573
|
|
|
+ │ ├── 1-1-1 30.00003573
|
|
|
+ │ │ └── 202-2 30.00003573
|
|
|
+ │ │ ├── 202-2-c 4.00000025 6.0000083 24.0000347
|
|
|
+ │ │ └── 202-2-e 2.00000001 3.0000005 6.00000103
|
|
|
+ │ └── 1-1-4
|
|
|
+ ├── 1-1-2
|
|
|
+ │ └── 1-1-3
|
|
|
+ ├── 1-2 42.0004309
|
|
|
+ │ ├── 1-2-1
|
|
|
+ │ ├── 1-2-2 42.0004309
|
|
|
+ │ │ └── 202-2 42.0004309
|
|
|
+ │ │ ├── 202-2-c 2.0000001 5.000065 10.0001305
|
|
|
+ │ │ └── 202-2-e 8.0000579 4.0000086 32.0003004
|
|
|
+ │ ├── 1-2-3
|
|
|
+ │ └── 1-3
|
|
|
+ │ └── 1-3-1
|
|
|
+ └── 1-4
|
|
|
+ */
|
|
|
+ // 复制整块+实时计算
|
|
|
+ it('test pasteBlock - with Increment Calculate', function* () {
|
|
|
+ const ctx = app.mockContext();
|
|
|
+ // 选中1-1-4, 粘贴202-2(1-1-1下)
|
|
|
+ const resultData = yield ctx.service.ledger.pasteBlock(testTenderId, 17, [8]);
|
|
|
+
|
|
|
+ assert(resultData.update.length === 2);
|
|
|
+
|
|
|
+ let node = findById(resultData.update, 2);
|
|
|
+ assert(node.total_price.toFixed(8) == 60.00007146);
|
|
|
+
|
|
|
+ node = findById(resultData.update, 1);
|
|
|
+ assert(node.total_price.toFixed(8) == 102.00050236);
|
|
|
+ });
|
|
|
+ /* 期望运行结果:
|
|
|
+ 1 102.00050236
|
|
|
+ ├── 1-1 60.00007146
|
|
|
+ │ ├── 1-1-1 30.00003573
|
|
|
+ │ │ └── 202-2 30.00003573
|
|
|
+ │ │ ├── 202-2-c 4.00000025 6.0000083 24.0000347
|
|
|
+ │ │ └── 202-2-e 2.00000001 3.0000005 6.00000103
|
|
|
+ │ ├── 1-1-4
|
|
|
+ │ └── 202-2 30.00003573
|
|
|
+ │ ├── 202-2-c 4.00000025 6.0000083 24.0000347
|
|
|
+ │ └── 202-2-e 2.00000001 3.0000005 6.00000103
|
|
|
+ ├── 1-1-2
|
|
|
+ │ └── 1-1-3
|
|
|
+ ├── 1-2 42.0004309
|
|
|
+ │ ├── 1-2-1
|
|
|
+ │ ├── 1-2-2 42.0004309
|
|
|
+ │ │ └── 202-2 42.0004309
|
|
|
+ │ │ ├── 202-2-c 2.0000001 5.000065 10.0001305
|
|
|
+ │ │ └── 202-2-e 8.0000579 4.0000086 32.0003004
|
|
|
+ │ ├── 1-2-3
|
|
|
+ │ └── 1-3
|
|
|
+ │ └── 1-3-1
|
|
|
+ └── 1-4
|
|
|
+ */
|
|
|
+ // 树结构基本操作+实时计算
|
|
|
+ it('test downLevel - with Increment Calculate', function* () {
|
|
|
+ const ctx = app.mockContext();
|
|
|
+ // 选中202-2(1-1-4后兄弟节点) 降级
|
|
|
+ const resultData = yield ctx.service.ledger.downLevelNode(testTenderId, 23);
|
|
|
+ assert(resultData.update.length === 4);
|
|
|
+ const node = findById(resultData.update, 17);
|
|
|
+ assert(node.total_price.toFixed(8) == 30.00003573);
|
|
|
+ });
|
|
|
+ /* 期望运行结果:
|
|
|
+ 1 102.00050236
|
|
|
+ ├── 1-1 60.00007146
|
|
|
+ │ ├── 1-1-1 30.00003573
|
|
|
+ │ │ └── 202-2 30.00003573
|
|
|
+ │ │ ├── 202-2-c 4.00000025 6.0000083 24.0000347
|
|
|
+ │ │ └── 202-2-e 2.00000001 3.0000005 6.00000103
|
|
|
+ │ └── 1-1-4 30.00003573
|
|
|
+ │ └── 202-2 30.00003573
|
|
|
+ │ ├── 202-2-c 4.00000025 6.0000083 24.0000347
|
|
|
+ │ └── 202-2-e 2.00000001 3.0000005 6.00000103
|
|
|
+ ├── 1-1-2
|
|
|
+ │ └── 1-1-3
|
|
|
+ ├── 1-2 42.0004309
|
|
|
+ │ ├── 1-2-1
|
|
|
+ │ ├── 1-2-2 42.0004309
|
|
|
+ │ │ └── 202-2 42.0004309
|
|
|
+ │ │ ├── 202-2-c 2.0000001 5.000065 10.0001305
|
|
|
+ │ │ └── 202-2-e 8.0000579 4.0000086 32.0003004
|
|
|
+ │ ├── 1-2-3
|
|
|
+ │ └── 1-3
|
|
|
+ │ └── 1-3-1
|
|
|
+ └── 1-4
|
|
|
+ */
|
|
|
+ it('test upLevel - with Increment Calculate', function* () {
|
|
|
+ const ctx = app.mockContext();
|
|
|
+ yield ctx.service.ledger.pasteBlock(testTenderId, 23, [23]);
|
|
|
+ /* 期望运行结果:
|
|
|
+ 1 132.00053809
|
|
|
+ ├── 1-1 90.00009719
|
|
|
+ │ ├── 1-1-1 30.00003573
|
|
|
+ │ │ └── 202-2 30.00003573
|
|
|
+ │ │ ├── 202-2-c 4.00000025 6.0000083 24.0000347
|
|
|
+ │ │ └── 202-2-e 2.00000001 3.0000005 6.00000103
|
|
|
+ │ └── 1-1-4 60.00007146
|
|
|
+ │ ├── 202-2 30.00003573
|
|
|
+ │ │ ├── 202-2-c 4.00000025 6.0000083 24.0000347
|
|
|
+ │ │ └── 202-2-e 2.00000001 3.0000005 6.00000103
|
|
|
+ │ └── 202-2 30.00003573
|
|
|
+ │ ├── 202-2-c 4.00000025 6.0000083 24.0000347
|
|
|
+ │ └── 202-2-e 2.00000001 3.0000005 6.00000103
|
|
|
+ ├── 1-1-2
|
|
|
+ │ └── 1-1-3
|
|
|
+ ├── 1-2 42.0004309
|
|
|
+ │ ├── 1-2-1
|
|
|
+ │ ├── 1-2-2 42.0004309
|
|
|
+ │ │ └── 202-2 42.0004309
|
|
|
+ │ │ ├── 202-2-c 2.0000001 5.000065 10.0001305
|
|
|
+ │ │ └── 202-2-e 8.0000579 4.0000086 32.0003004
|
|
|
+ │ ├── 1-2-3
|
|
|
+ │ └── 1-3
|
|
|
+ │ └── 1-3-1
|
|
|
+ └── 1-4
|
|
|
+ */
|
|
|
+ // 选中202-2-c(1-1-4下)(id=23)升级
|
|
|
+ const resultData = yield ctx.service.ledger.upLevelNode(testTenderId, 23);
|
|
|
+ assert(resultData.update.length === 7);
|
|
|
+
|
|
|
+ let node = findById(resultData.update, 23);
|
|
|
+ assert(node.total_price.toFixed(8) == 60.00007146);
|
|
|
+ node = findById(resultData.update, 17);
|
|
|
+ assert(node.total_price.toFixed(8) == 0);
|
|
|
+ });
|
|
|
+ /* 期望运行结果:
|
|
|
+ 1 132.00053809
|
|
|
+ ├── 1-1 90.00009719
|
|
|
+ │ ├── 1-1-1 30.00003573
|
|
|
+ │ │ └── 202-2 30.00003573
|
|
|
+ │ │ ├── 202-2-c 4.00000025 6.0000083 24.0000347
|
|
|
+ │ │ └── 202-2-e 2.00000001 3.0000005 6.00000103
|
|
|
+ │ ├── 1-1-4
|
|
|
+ │ └── 202-2 60.00007146
|
|
|
+ │ ├── 202-2-c 4.00000025 6.0000083 24.0000347
|
|
|
+ │ ├── 202-2-e 2.00000001 3.0000005 6.00000103
|
|
|
+ │ └── 202-2 30.00003573
|
|
|
+ │ ├── 202-2-c 4.00000025 6.0000083 24.0000347
|
|
|
+ │ └── 202-2-e 2.00000001 3.0000005 6.00000103
|
|
|
+ ├── 1-1-2
|
|
|
+ │ └── 1-1-3
|
|
|
+ ├── 1-2 42.0004309
|
|
|
+ │ ├── 1-2-1
|
|
|
+ │ ├── 1-2-2 42.0004309
|
|
|
+ │ │ └── 202-2 42.0004309
|
|
|
+ │ │ ├── 202-2-c 2.0000001 5.000065 10.0001305
|
|
|
+ │ │ └── 202-2-e 8.0000579 4.0000086 32.0003004
|
|
|
+ │ ├── 1-2-3
|
|
|
+ │ └── 1-3
|
|
|
+ │ └── 1-3-1
|
|
|
+ └── 1-4
|
|
|
+ */
|
|
|
+ it('test deleteNode - with Increment Calculate', function* () {
|
|
|
+ const ctx = app.mockContext();
|
|
|
+
|
|
|
+ // 选中202-2-c(1-2-2下)(id=20),删除节点
|
|
|
+ const resultData = yield ctx.service.ledger.deleteNode(testTenderId, 20);
|
|
|
+ assert(resultData.delete.length === 1);
|
|
|
+ assert(resultData.update.length === 5);
|
|
|
+
|
|
|
+ let node = findById(resultData.update, 21);
|
|
|
+ assert(node.order === 1);
|
|
|
+
|
|
|
+ node = findById(resultData.update, 19);
|
|
|
+ assert(node.total_price.toFixed(8) == 32.0003004);
|
|
|
+
|
|
|
+ node = findById(resultData.update, 18);
|
|
|
+ assert(node.total_price.toFixed(8) == 32.0003004);
|
|
|
+
|
|
|
+ node = findById(resultData.update, 3);
|
|
|
+ assert(node.total_price.toFixed(8) == 32.0003004);
|
|
|
+
|
|
|
+ node = findById(resultData.update, 1);
|
|
|
+ assert(node.total_price.toFixed(8) == 122.00040759);
|
|
|
+ });
|
|
|
+ /* 期望运行结果:
|
|
|
+ 1 122.00040759
|
|
|
+ ├── 1-1 90.00009719
|
|
|
+ │ ├── 1-1-1 30.00003573
|
|
|
+ │ │ └── 202-2 30.00003573
|
|
|
+ │ │ ├── 202-2-c 4.00000025 6.0000083 24.0000347
|
|
|
+ │ │ └── 202-2-e 2.00000001 3.0000005 6.00000103
|
|
|
+ │ ├── 1-1-4
|
|
|
+ │ └── 202-2 60.00007146
|
|
|
+ │ ├── 202-2-c 4.00000025 6.0000083 24.0000347
|
|
|
+ │ ├── 202-2-e 2.00000001 3.0000005 6.00000103
|
|
|
+ │ └── 202-2 30.00003573
|
|
|
+ │ ├── 202-2-c 4.00000025 6.0000083 24.0000347
|
|
|
+ │ └── 202-2-e 2.00000001 3.0000005 6.00000103
|
|
|
+ ├── 1-1-2
|
|
|
+ │ └── 1-1-3
|
|
|
+ ├── 1-2 32.0003004
|
|
|
+ │ ├── 1-2-1
|
|
|
+ │ ├── 1-2-2 32.0003004
|
|
|
+ │ │ └── 202-2 32.0003004
|
|
|
+ │ │ └── 202-2-e 8.0000579 4.0000086 32.0003004
|
|
|
+ │ ├── 1-2-3
|
|
|
+ │ └── 1-3
|
|
|
+ │ └── 1-3-1
|
|
|
+ └── 1-4
|
|
|
+ */
|
|
|
+
|
|
|
+ // 测试统计类方法
|
|
|
+ it('test addUpChildren', function* () {
|
|
|
+ const ctx = app.mockContext();
|
|
|
+
|
|
|
+ // 统计202-2(id=23)前两个子节点的金额
|
|
|
+ const result1 = yield ctx.service.ledger.addUpChildren(testTenderId, 23, 2, '<=');
|
|
|
+ assert(result1 && result1.toFixed(8) == 30.00003573);
|
|
|
+ // 统计202-2(id=23)后两个子节点的金额
|
|
|
+ const result2 = yield ctx.service.ledger.addUpChildren(testTenderId, 23, 2, '>=');
|
|
|
+ assert(result2 && result2.toFixed(8) == 36.00003676);
|
|
|
+ // 统计202-2(id=23)全部子节点的金额
|
|
|
+ const result3 = yield ctx.service.ledger.addUpChildren(testTenderId, 23, 0, '>');
|
|
|
+ assert(result3 && result3.toFixed(8) == 60.00007146);
|
|
|
+ });
|
|
|
+
|
|
|
+ // 小数位数策略示例:
|
|
|
+ /* 先加总再保留3位小数:
|
|
|
+ 1 35.585
|
|
|
+ ├── 1-1 35.585
|
|
|
+ │ ├── 1-1-1 35.585
|
|
|
+ │ │ └── 202-2 35.585
|
|
|
+ │ │ ├── 202-2-c 4.25 6.83 29.028(29.0275)
|
|
|
+ │ │ └── 202-2-e 2.15 3.05 6.558(6.5575)
|
|
|
+ │ └── 1-1-3
|
|
|
+ ├── 1-1-2
|
|
|
+ │ └── 1-1-3
|
|
|
+ ├── 1-2
|
|
|
+ │ ├── 1-2-1
|
|
|
+ │ ├── 1-2-2
|
|
|
+ │ │ └── 202-2
|
|
|
+ │ │ ├── 202-2-c
|
|
|
+ │ │ └── 202-2-e
|
|
|
+ │ ├── 1-2-3
|
|
|
+ │ └── 1-3
|
|
|
+ │ └── 1-3-1
|
|
|
+ └── 1-4
|
|
|
+ */
|
|
|
+ /* 先保留3位小数再加总:
|
|
|
+ 1 35.586
|
|
|
+ ├── 1-1 35.586
|
|
|
+ │ ├── 1-1-1 35.586
|
|
|
+ │ │ └── 202-2 35.586
|
|
|
+ │ │ ├── 202-2-c 4.25 6.83 29.028(29.0275)
|
|
|
+ │ │ └── 202-2-e 2.15 3.05 6.558(6.5575)
|
|
|
│ └── 1-1-3
|
|
|
├── 1-1-2
|
|
|
│ └── 1-1-3
|