MaiXinRong преди 5 години
родител
ревизия
434340d8ed
променени са 3 файла, в които са добавени 227 реда и са изтрити 26 реда
  1. 7 0
      app/extend/helper.js
  2. 116 4
      app/lib/rpt_data_analysis.js
  3. 104 22
      test/app/lib/rpt_data_analysis.test.js

+ 7 - 0
app/extend/helper.js

@@ -1020,6 +1020,13 @@ module.exports = {
         return result;
     },
 
+    check18MainCode(code) {
+        return /^([0-9]([0-9][0-9])*)?(GD[0-9]{3}([0-9][0-9])*)?$/.test(code);
+    },
+    check18SubCode(code) {
+        return /^(GD)?G?[A-Z]{2}[A-Z]{0,2}([0-9]{2})+$/.test(code);
+    },
+
     /**
      * 判断是否是移动端访问
      * @param request

+ 116 - 4
app/lib/rpt_data_analysis.js

@@ -1161,8 +1161,6 @@ const unionPos = {
         if (!options || !options.bills || !options.pos) return;
         const bills = data[options.bills];
         const pos = data[options.pos];
-        console.log(bills.length);
-        console.log(pos.length);
         if (!bills || bills.length === 0 || !pos || pos.length === 0) return;
         const posIndex = new PosIndex({
             id: 'id',
@@ -1175,7 +1173,6 @@ const unionPos = {
             unionData.push(b);
             const posRange = posIndex.getLedgerPos(b.id);
             b.posCount = posRange ? posRange.length : 0;
-            console.log(b.id + '-posCount: ' + b.posCount);
             if (!posRange || posRange.length === 0) continue;
 
             for (const p of posRange) {
@@ -1184,7 +1181,121 @@ const unionPos = {
         }
         data[options.bills] = unionData;
     }
-}
+};
+const splitXmjCode = {
+    name: '拆分项目节编号',
+    hint: '',
+    defaultSetting: {
+        table: 'mem_stage_bills',
+        type: '11', // '18', '18-0-1', '18-1', '18-1-1'
+        code: 'code',
+        targetField: ['xiang', 'mu', 'jie', 'ximu'],
+    },
+    // 11标准
+    _split11Std: function (data, options, helper) {
+        for (const d of data) {
+            if (!d[options.code]) continue;
+
+            const splitCodes = d[options.code].split('-');
+            if (d.level === 2) {
+                const field = options.targetField[0];
+                if (field && splitCodes.length > 1) {
+                    d[field] = helper.transFormToChinese(splitCodes[1]);
+                }
+            } else if (d.level === 3) {
+                const field = options.targetField[1];
+                if (field && splitCodes.length > 2) {
+                    d[field] = splitCodes[2];
+                }
+            } else if (d.level === 4) {
+                const field = options.targetField[2];
+                if (field && splitCodes.length > 3) {
+                    d[field] = splitCodes[3];
+                }
+            } else if (d.level > 4) {
+                const field = options.targetField[3];
+                if (field && splitCodes.length > 4) {
+                    d[field] = splitCodes.reduce(function (s, v, i) { return i >= 4 ? s + '-' + v : ''});
+                }
+            }
+        }
+    },
+    _getParentByLevel: function (data, node, level) {
+        if (node.full_path) {
+            const pid = node.full_path.split('-');
+            return data.find(function (x) {
+                return x.level === level && x.ledger_pid === pid;
+            });
+        } else {
+            return null;
+        }
+    },
+    // 18标准
+    _split18Std: function (data, options, helper) {
+        const types = options.type.split('-');
+        const isSplitSub = types[1] && types[1] === '1' ? true : false;
+        const isKeepGD = types[2] && types[2] === '1' ? true : false;
+        for (const d of data) {
+            if (!d[options.code]) continue;
+
+            let target = '';
+            if (d.level === 2) {
+                target = options.targetField[0] ? options.targetField[0]: '';
+            } else if (d.level === 3) {
+                target = options.targetField[1] ? options.targetField[1]: '';
+            } else if (d.level === 4) {
+                target = options.targetField[2] ? options.targetField[2]: '';
+            } else if (d.level > 4) {
+                target = options.targetField[3] ? options.targetField[3]: '';
+            }
+            if (!target) continue;
+
+            if (helper.check18MainCode(d[options.code])) {
+                const parent = helper._.find(data, {ledger_id: d.ledger_pid});
+                const splitParent = !parent && parent.level < 5 ? parent : this._getParentByLevel(data, d, 4);
+                d[target] = !splitParent
+                    ? d[options.code]
+                    : d[options.code].replace(splitParent[options.code], '');
+            } if (helper.check18SubCode(d[options.code]) && isSplitSub) {
+                const parent = helper._.find(data, {ledger_id: d.ledger_pid});
+                const splitParent = !parent && parent.level < 5 ? parent : this._getParentByLevel(data, d, 4);
+                d[target] = !splitParent || helper.check18MainCode(splitParent.code)
+                    ? d[options.code]
+                    : d[options.code].replace(splitParent[options.code], '');
+            } else {
+                d[target] = d[options.code];
+            }
+            if (!isKeepGD) d[target] = d[target].replace(/^G[D]?/, '');
+        }
+    },
+    // 根据层次填入
+    _splitDefault: function (data, options) {
+        for (const d of data) {
+            if (!d[options.code]) continue;
+
+            if (d.level === 2) {
+                if (options.targetField[0]) d[options.targetField[0]] = d[options.code];
+            } else if (d.level === 3) {
+                if (options.targetField[1]) d[options.targetField[1]] = d[options.code];
+            } else if (d.level === 4) {
+                if (options.targetField[2]) d[options.targetField[2]] = d[options.code];
+            } else if (d.level > 4) {
+                if (options.targetField[3]) d[options.targetField[3]] = d[options.code];
+            }
+        }
+    },
+    fun: function (ctx, data, fieldsKey, options, csRela) {
+        if (!options || !options.table || !options.code || !options.targetField) return;
+        if (!data[options.table]) return;
+        if (options.type === '11') {
+            this._split11Std(data[options.table], options, ctx.helper);
+        } else if (/^18(-[0,1]){0,2}$/.test(options.type)) {
+            this._split18Std(data[options.table], options, ctx.helper);
+        } else {
+            this._splitDefault(data[options.table], options);
+        }
+    }
+};
 
 const analysisObj = {
     changeSort,
@@ -1202,6 +1313,7 @@ const analysisObj = {
     gatherSelectConverse,
     sortPos,
     unionPos,
+    splitXmjCode,
 };
 const analysisDefine = (function (obj) {
     const result = [];

+ 104 - 22
test/app/lib/rpt_data_analysis.test.js

@@ -494,39 +494,121 @@ describe('test/app/service/report_memory.test.js', () => {
         // ctx.helper.saveBufferFile(JSON.stringify(x, "", "\t"), ctx.app.baseDir + '/mem_stage_pos.json');
     });
     it('test sortPos/unionPos', function* () {
-        const ctx = app.mockContext(mockData);
+        const ctx = app.mockContext();
+        const postData = {
+            account: 'zengpeiwen',
+            project: 'P1201',
+            project_password: '123456',
+        };
+        ctx.session = {};
+        const loginResult = yield ctx.service.projectAccount.accountLogin(postData, 2);
 
         // test12 - 第6期
-        const stage = yield ctx.service.stage.getDataByCondition({tid: 12, order: 6});
         const params = {
-            tender_id: stage.tid,
-            stage_id: stage.id,
+            tender_id: 2546,
         };
         const filters = ['mem_stage_bills', 'tender_info', 'mem_stage_pos'];
         const data = yield ctx.service.report.getReportData(params, filters, {
             mem_stage_bills: [
-                'id', 'tender_id', 'ledger_id', 'ledger_pid', 'level', 'order', 'full_path', 'is_leaf',
-                'code', 'b_code', 'name', 'unit', 'unit_price',
-                'deal_qty', 'deal_tp',
-                'sgfh_qty', 'sgfh_tp', 'sjcl_qty', 'sjcl_tp', 'qtcl_qty', 'qtcl_tp', 'quantity', 'total_price',
-                'dgn_qty1', 'dgn_qty2',
-                'drawing_code', 'memo', 'node_type', 'is_tp',
-                'contract_qty', 'contract_tp', 'qc_qty', 'qc_tp', 'gather_qty', 'gather_tp', 'postil',
-                'pre_contract_qty', 'pre_contract_tp', 'pre_qc_qty', 'pre_qc_tp', 'pre_gather_qty', 'pre_gather_tp',
-                'end_contract_qty', 'end_contract_tp', 'end_qc_qty', 'end_qc_tp', 'end_gather_qty', 'end_gather_tp',
-                'final_tp', 'final_ratio',
-                'qc_bgl_code',
-                'chapter',
+                'id'
             ],
-            mem_stage_pos: [],
+            mem_stage_pos: ['name'],
         });
         // sortPos
-        // reportDataAnalysis.analysisObj.sortPos.fun(ctx, data, [], {bills: 'mem_stage_bills', pos: 'mem_stage_pos'});
-        // yield ctx.helper.saveBufferFile(JSON.stringify(data.mem_stage_bills, "", "\t"), path.join(savePath, 'mem_stage_bills.json'));
-        // yield ctx.helper.saveBufferFile(JSON.stringify(data.mem_stage_pos, "", "\t"), path.join(savePath, 'mem_stage_pos.json'));
+        reportDataAnalysis.analysisObj.sortPos.fun(ctx, data, [], {bills: 'mem_stage_bills', pos: 'mem_stage_pos'});
+        yield ctx.helper.saveBufferFile(JSON.stringify(data.mem_stage_bills, "", "\t"), path.join(savePath, 'mem_stage_bills.json'));
+        yield ctx.helper.saveBufferFile(JSON.stringify(data.mem_stage_pos, "", "\t"), path.join(savePath, 'mem_stage_pos.json'));
 
         // unionPos
-        reportDataAnalysis.analysisObj.unionPos.fun(ctx, data, [], {bills: 'mem_stage_bills', pos: 'mem_stage_pos'});
-        yield ctx.helper.saveBufferFile(JSON.stringify(data.mem_stage_bills, "", "\t"), path.join(savePath, 'mem_stage_bills.json'));
+        // reportDataAnalysis.analysisObj.unionPos.fun(ctx, data, [], {bills: 'mem_stage_bills', pos: 'mem_stage_pos'});
+        // yield ctx.helper.saveBufferFile(JSON.stringify(data.mem_stage_bills, "", "\t"), path.join(savePath, 'mem_stage_bills.json'));
+    });
+    it('test splitXmjCode', function* () {
+        const ctx = app.mockContext(mockData);
+
+        // test12 - 第6期
+        const testData11 = {
+            bills: [
+                { code: '1', level: 1 },
+                { code: '1-1', level: 2 },
+                { code: '1-1-1', level: 3 },
+                { code: '1-1-1-1', level: 4 },
+                { code: '1-1-1-1-1', level: 5 },
+                { code: '1-1-1-1-1-1', level: 6 },
+            ]
+        };
+        reportDataAnalysis.analysisObj.splitXmjCode.fun(ctx, testData11, [], {table: 'bills', type: '11', code: 'code', targetField: ['xiang', 'mu', 'jie', 'ximu']});
+        assert(testData11.bills[1].xiang, '一' );
+        assert(testData11.bills[2].mu, '1');
+        assert(testData11.bills[3].jie, '1');
+        assert(testData11.bills[4].ximu, '1');
+        assert(testData11.bills[5].ximu, '1-1');
+
+        reportDataAnalysis.analysisObj.splitXmjCode.fun(ctx, testData11, [], {table: 'bills', code: 'code', targetField: ['xiang', 'mu', 'jie', 'ximu']});
+        assert(testData11.bills[1].xiang, '1-1' );
+        assert(testData11.bills[2].mu, '1-1-1');
+        assert(testData11.bills[3].jie, '1-1-1-1');
+        assert(testData11.bills[4].ximu, '1-1-1-1-1');
+        assert(testData11.bills[5].ximu, '1-1-1-1-1-1');
+
+        const testData18 = {
+            bills: [
+                { code: '1', level: 1, ledger_id: 1, ledger_pid: -1, full_path: '1' }, // 0
+                { code: '101', level: 2, ledger_id: 2, ledger_pid: 1, full_path: '1-2' },
+                { code: '10101', level: 3, ledger_id: 3, ledger_pid: 2, full_path: '1-2-3' },
+                { code: '1010101', level: 4, ledger_id: 4, ledger_pid: 3, full_path: '1-2-3-4' },
+                { code: '1010103', level: 4, ledger_id: 5, ledger_pid: 3, full_path: '1-2-3-5' },
+                { code: '101010301', level: 5, ledger_id: 6, ledger_pid: 5, full_path: '1-2-3-5-6' }, // 5
+                { code: '102', level: 2, ledger_id: 7, ledger_pid: 1, full_path: '1-7' },
+                { code: 'LJ05', level: 3, ledger_id: 8, ledger_pid: 7, full_path: '1-7-8' },
+                { code: 'LJ0502', level: 4, ledger_id: 9, ledger_pid: 8, full_path: '1-7-8-9' },
+                { code: 'LJ050204', level: 5, ledger_id: 10, ledger_pid: 9, full_path: '1-7-8-10' },
+                { code: 'GDLJ05020401', level: 6, ledger_id: 11, ledger_pid: 10, full_path: '1-7-8-10-11' }, // 10
+            ]
+        };
+        reportDataAnalysis.analysisObj.splitXmjCode.fun(ctx, testData18, [], {table: 'bills', type:'18', code: 'code', targetField: ['xiang', 'mu', 'jie', 'ximu']});
+        assert(testData18.bills[1].xiang, '01');
+        assert(testData18.bills[2].mu, '01');
+        assert(testData18.bills[3].jie, '01');
+        assert(testData18.bills[4].jie, '03');
+        assert(testData18.bills[5].ximu, '01');
+        assert(testData18.bills[6].xiang, '02');
+        assert(testData18.bills[7].mu, 'LJ05');
+        assert(testData18.bills[8].jie, '02');
+        assert(testData18.bills[9].ximu, '04');
+        assert(testData18.bills[10].ximu, '0401');
+        reportDataAnalysis.analysisObj.splitXmjCode.fun(ctx, testData18, [], {table: 'bills', type:'18-1', code: 'code', targetField: ['xiang', 'mu', 'jie', 'ximu']});
+        assert(testData18.bills[1].xiang, '01');
+        assert(testData18.bills[2].mu, '01');
+        assert(testData18.bills[3].jie, '01');
+        assert(testData18.bills[4].jie, '03');
+        assert(testData18.bills[5].ximu, '01');
+        assert(testData18.bills[6].xiang, '02');
+        assert(testData18.bills[7].mu, 'LJ05');
+        assert(testData18.bills[8].jie, 'LJ0502');
+        assert(testData18.bills[9].ximu, 'LJ050204');
+        assert(testData18.bills[10].ximu, 'LJ05020401');
+        reportDataAnalysis.analysisObj.splitXmjCode.fun(ctx, testData18, [], {table: 'bills', type:'18-0-1', code: 'code', targetField: ['xiang', 'mu', 'jie', 'ximu']});
+        assert(testData18.bills[1].xiang, '01');
+        assert(testData18.bills[2].mu, '01');
+        assert(testData18.bills[3].jie, '01');
+        assert(testData18.bills[4].jie, '03');
+        assert(testData18.bills[5].ximu, '01');
+        assert(testData18.bills[6].xiang, '02');
+        assert(testData18.bills[7].mu, 'LJ05');
+        assert(testData18.bills[8].jie, '02');
+        assert(testData18.bills[9].ximu, '04');
+        assert(testData18.bills[10].ximu, 'GD0401');
+        reportDataAnalysis.analysisObj.splitXmjCode.fun(ctx, testData18, [], {table: 'bills', type:'18-1-1', code: 'code', targetField: ['xiang', 'mu', 'jie', 'ximu']});
+        assert(testData18.bills[1].xiang, '01');
+        assert(testData18.bills[2].mu, '01');
+        assert(testData18.bills[3].jie, '01');
+        assert(testData18.bills[4].jie, '03');
+        assert(testData18.bills[5].ximu, '01');
+        assert(testData18.bills[6].xiang, '02');
+        assert(testData18.bills[7].mu, 'LJ05');
+        assert(testData18.bills[8].jie, 'LJ0502');
+        assert(testData18.bills[9].ximu, 'LJ050204');
+        assert(testData18.bills[10].ximu, 'GDLJ05020401');
     });
 });