瀏覽代碼

材料调差,报表数据相关

MaiXinRong 5 年之前
父節點
當前提交
172c24724e

+ 52 - 0
app/service/report_memory.js

@@ -14,6 +14,7 @@ const StageIm = require('../lib/stage_im');
 const imType = require('../const/tender').imType;
 const audit = require('../const/audit');
 const changeConst = require('../const/change');
+const materialConst = require('../const/material');
 // const path = require('path');
 // const fs = require('fs');
 
@@ -792,6 +793,57 @@ module.exports = app => {
             }
             return data;
         }
+
+        async getMaterial(tender_id, material_order, memFieldKeys) {
+            return await this.ctx.service.material.getValidMaterials(tender_id);
+        }
+
+        _completeMaterialGl(materialGl) {
+            const tTypeStr = [], mTypeStr = [];
+            for (const t of materialConst.t_type) {
+                tTypeStr[t.value] = t.text;
+            }
+            for (const m of materialConst.m_type) {
+                mTypeStr[m.value] = m.text;
+            }
+            for (const gl of materialGl) {
+                gl.tp = this.ctx.helper.mul(gl.quantity, gl.m_spread, 2);
+                gl.t_type_str = tTypeStr[gl.t_type];
+                gl.m_type_str = mTypeStr[gl.m_type];
+                gl.end_tp = this.ctx.helper.add(gl.tp, gl.pre_tp);
+            }
+        }
+
+        async getMaterialGl(tender_id, material_order, memFieldKeys) {
+            const materials = await this.ctx.service.material.getAllDataByCondition({
+                where: {tid: tender_id},
+                orders: [['order', 'desc']],
+            });
+            if (materials.length > 0) {
+                let result;
+                if (materials[0].order === material_order) {
+                    result = await this.ctx.service.materialBills.getAllDataByCondition({
+                        where: {tid: tender_id}
+                    });
+                } else {
+                    const material = this.ctx.helper._.find(materials, {order: material_order});
+                    if (!material) return [];
+                    const sql = 'SELECT m.id, m.tid, m.mid, m.t_type, m.code, m.name, m.unit, m.spec, m.m_type,' +
+                        '    m.basic_price, m.basic_times, m.remark, m.in_time,' +
+                        '    mh.quantity, mh.expr, mh.msg_tp, mh.msg_times, mh.msg_spread, mh.m_up_risk, mh.m_down_risk, mh.m_spread' +
+                        '  FROM ' + this.ctx.service.materialBills.tableName + ' m' +
+                        '  LEFT JOIN ' + this.ctx.service.materialBillsHistory.tableName + ' mh' +
+                        '  ON m.id = mh.mb_id' +
+                        '  WHERE mh.mid = ?';
+                    const sqlParam = [material.id];
+                    result = await this.ctx.app.mysql.query(sql, sqlParam);
+                }
+                this._completeMaterialGl(result);
+                return result;
+            } else {
+                return [];
+            }
+        }
     }
 
     return ReportMemory;

+ 4 - 55
app/service/rpt_gather_memory.js

@@ -13,7 +13,6 @@ const PayCalculator = require('../lib/pay_calc');
 
 const auditConst = require('../const/audit');
 const payConst = require('../const/deal_pay');
-const materialConst = require('../const/material');
 
 const moment = require('moment');
 
@@ -599,8 +598,8 @@ module.exports = app => {
                     dp.end_tp = helper.add(dp.pre_tp, dp.tp);
                     this._gatherPayRecord(dp, function (gatherData, sourceData) {
                         const preFix = 't_' + index + '_';
-                        gatherData[preFix + '_id'] = tender.id;
-                        gatherData[preFix + '_name'] = tender.name;
+                        gatherData[preFix + 'id'] = tender.id;
+                        gatherData[preFix + 'name'] = tender.name;
 
                         gatherData[preFix + 'tp'] = helper.add(gatherData[preFix + 'tp'], sourceData.tp);
                         gatherData[preFix + 'pre_tp'] = helper.add(gatherData[preFix + 'pre_tp'], sourceData.pre_tp);
@@ -643,8 +642,8 @@ module.exports = app => {
                         dp.end_tp = helper.add(dp.pre_tp, dp.tp);
                         this._gatherPayRecord(dp, function (gatherData, sourceData) {
                             const preFix = 't_' + index + '_';
-                            gatherData[preFix + '_id'] = tender.id;
-                            gatherData[preFix + '_name'] = tender.name;
+                            gatherData[preFix + 'id'] = tender.id;
+                            gatherData[preFix + 'name'] = tender.name;
 
                             gatherData[preFix + 'tp'] = helper.add(gatherData[preFix + 'tp'], sourceData.tp);
                             gatherData['s_' + 'tp'] = helper.add(gatherData['s_' + 'tp'], sourceData.tp);
@@ -767,56 +766,6 @@ module.exports = app => {
             }
             return this.resultDealBills;
         }
-
-        async getMaterial(tender_id, material_order, memFieldKeys) {
-            return await this.ctx.service.material.getValidMaterials(tender_id);
-        }
-
-        _completeMaterialGl(materialGl) {
-            const tTypeStr = [], mTypeStr = [];
-            for (const t of materialConst.t_type) {
-                tTypeStr[t.value] = t.text;
-            }
-            for (const m of materialConst.m_type) {
-                mTypeStr[m.value] = m.text;
-            }
-            for (const gl of materialGl) {
-                gl.tp = this.ctx.helper.mul(gl.quantity, gl.m_spread);
-                gl.t_type_str = tTypeStr[gl.t_type];
-                gl.m_type_str = tTypeStr[gl.m_type];
-            }
-        }
-
-        async getMaterialGl(tender_id, material_order, memFieldKeys) {
-            const materials = await this.ctx.service.material.getAllDataByCondition({
-                where: {tid: tender_id},
-                orders: [['order', 'desc']],
-            });
-            if (materials.length > 0) {
-                let result;
-                if (materials[0].order === material_order) {
-                    result = await this.ctx.service.materialBills.getAllDataByCondition({
-                        where: {tid: tender_id}
-                    });
-                } else {
-                    const material = this.ctx.helper.find(materials, {order: material_order});
-                    if (!material) return [];
-                    const sql = 'SELECT m.id, m.tid, m.mid, m.t_type, m.code, m.name, m.unit, m.spec, m.m_type,' +
-                        '    m.base_price, m.base_times, m.remark, m.in_time,' +
-                        '    mh.quantity, mh.expr, mh.msg_tp, mh.msg_times, mh.msg_spread, mh.m_up_risk, mh.m_down_risk, mh.m_spread' +
-                        '  FROM ' + this.ctx.service.materialBills.tableName + ' m' +
-                        '  LEFT JOIN ' + this.ctx.service.materialBillsHistory.tableName + ' mh' +
-                        '  ON m.id = mh.mb_id' +
-                        '  WHERE mh.mid = ?';
-                    const sqlParam = [material.id];
-                    result = this.ctx.app.mysql.query(sql, sqlParam);
-                }
-                this._completeMaterialGl(result);
-                return result;
-            } else {
-                return [];
-            }
-        }
     }
 
     return RptGatherMemory;

+ 68 - 1
builder_report_index_define.js

@@ -805,7 +805,7 @@ const gather_stage_pay = {
         { name: '名称', field: 'name', type: dataType.str },
         { name: '类型', field: 'ptype', type: dataType.int },
         { name: '是否扣款项', field: 'minus', type: dataType.int },
-        { name: '是否参与本期应付计算', field: 'minus', type: dataType.int },
+        { name: '是否参与本期应付计算', field: 'is_yf', type: dataType.int },
 
         { name: '标段id', field: 't_id', type: dataType.int },
         { name: '标段-名称', field: 't_name', type: dataType.str },
@@ -844,6 +844,72 @@ const gather_deal_bills = {
     ],
 };
 
+// 材差
+const material = {
+    name: '材料调差-期列表-数据(mem_material)',
+    remark: '',
+    id: 40,
+    key: 'mem_material',
+    prefix: '材料调差-期列表',
+    cols: [
+        { name: 'id', field: 'id', type: dataType.int },
+        { name: '标段id', field: 'tid', type: dataType.int },
+        { name: '创建者id', field: 'user_id', type: dataType.int },
+        { name: '审批次数', field: 'times', type: dataType.int },
+        { name: '审批状态', field: 'status', type: dataType.int },
+        { name: '期id列表', field: 'stage_id', type: dataType.str },
+        { name: '期order列表', field: 's_order', type: dataType.str },
+        { name: '材料调差期数', field: 'order', type: dataType.int },
+        { name: '本期金额', field: 'm_tp', type: dataType.currency },
+        { name: '截止上期金额', field: 'pre_tp', type: dataType.currency },
+        { name: '税率', field: 'rate', type: dataType.int },
+        { name: '创建时间', field: 'in_time', type: dataType.str },
+
+    ],
+};
+const materialGl = {
+    name: '材料调差-期-调差工料-数据(mem_material_gl)',
+    remark: '',
+    id: 41,
+    key: 'mem_material_gl',
+    prefix: '材料调差-期-调差工料',
+    cols: [
+        { name: 'id', field: 'id', type: dataType.int },
+        { name: '标段id', field: 'tid', type: dataType.int },
+        { name: '创建期id', field: 'mid', type: dataType.int },
+
+        { name: '调差类型', field: 't_type', type: dataType.int },
+        { name: '调差类型s', field: 't_type_str', type: dataType.str },
+        { name: '工料分类', field: 'm_type', type: dataType.int },
+        { name: '工料分类s', field: 'm_type_str', type: dataType.str },
+
+        { name: '编号', field: 'code', type: dataType.str },
+        { name: '名称', field: 'name', type: dataType.str },
+        { name: '单位', field: 'unit', type: dataType.str },
+        { name: '规格', field: 'spec', type: dataType.str },
+
+        { name: '基准价', field: 'basic_price', type: dataType.currency },
+        { name: '基准时间', field: 'basic_time', type: dataType.str },
+
+        { name: '本期信息价-单价', field: 'msg_tp', type: dataType.currency },
+        { name: '本期信息价-时间', field: 'msg_times', type: dataType.str },
+        { name: '本期信息价-价差', field: 'msg_spread', type: dataType.currency },
+
+        { name: '本期材料调差-上涨幅度', field: 'm_up_risk', type: dataType.int },
+        { name: '本期材料调差-下跌幅度', field: 'm_down_risk', type: dataType.int },
+        { name: '本期材料调差-有效价差', field: 'm_spread', type: dataType.currency },
+
+        { name: '本期应耗数据', field: 'quantity', type: dataType.currency },
+        { name: '计算式', field: 'expr', type: dataType.str },
+        { name: '本期-调差金额', field: 'tp', type: dataType.currency },
+        { name: '截止上期-调差金额', field: 'pre_tp', type: dataType.currency },
+        { name: '截止本期-调差金额', field: 'end_tp', type: dataType.currency },
+
+        { name: '创建时间', field: 'in_time', type: dataType.str },
+        { name: '备注', field: 'remark', type: dataType.str },
+    ],
+};
+
 const recursiveMkdirSync = async function(pathName) {
     if (!fs.existsSync(pathName)) {
         const upperPath = path.dirname(pathName);
@@ -944,6 +1010,7 @@ const defines = [
     stage_pay,
     stage_im_zl, stage_im_tz, stage_im_tz_bills,
     gather_stage_bills, gather_tender_info, gather_stage_pay, gather_deal_bills,
+    material, materialGl
 ];
 for (const d of defines) {
     exportTableDefine(d);

文件差異過大導致無法顯示
+ 13 - 0
sql/update.sql


+ 151 - 0
test/app/service/report_memory_material.test.js

@@ -0,0 +1,151 @@
+'use strict';
+
+/**
+ *
+ *
+ * @author Mai
+ * @date
+ * @version
+ */
+
+const { app, assert } = require('egg-mock/bootstrap');
+const path = require('path');
+let savePath;
+const mockData = {};
+const dataType = {
+    int: 'int',
+    str: 'string',
+    double: 'double',
+    currency: 'currency',
+};
+const checkData = function (target, source) {
+    for (const prop in source) {
+        if (source[prop] !== target[prop]) return false;
+    }
+    return true;
+};
+
+describe('test/app/service/report_memory.test.js', () => {
+    // 准备测试数据
+    before(function* () {
+        const ctx = app.mockContext();
+        savePath = path.join(ctx.app.baseDir,'report_temp');
+        const postData = {
+            account: 'fuqingqing',
+            project: 'P0505',
+            project_password: '123456',
+        };
+        ctx.session = {};
+        const loginResult = yield ctx.service.projectAccount.accountLogin(postData, 2);
+        assert(loginResult);
+        mockData.session = ctx.session;
+    });
+    // 材料调差 - 期列表
+    it('test getMaterial', function* () {
+        const ctx = app.mockContext(mockData);
+
+        const result = yield ctx.service.reportMemory.getMaterial(2418);
+        yield ctx.helper.saveBufferFile(JSON.stringify(result, "", "\t"), path.join(savePath, 'mem-material.json'));
+    });
+    // 材料调差 - 期 - 调差工料
+    it('test getMaterialGl Order1', function* () {
+        const ctx = app.mockContext(mockData);
+
+        const result = yield ctx.service.reportMemory.getMaterialGl(2418, 2);
+        //yield ctx.helper.saveBufferFile(JSON.stringify(result, "", "\t"), path.join(savePath, 'mem-material-gl.json'));
+        assert(result.length === 4);
+    });
+    it('test getMaterialGl Order2', function* () {
+        const ctx = app.mockContext(mockData);
+
+        const checkResult = [
+            {
+                "id": 131, "tid": 2418, "mid": 131,
+                "code": "101", "name": "光圆钢筋", "unit": "kg", "spec": null,
+                "t_type": 1, "m_type": 1, "t_type_str": "消耗量", "m_type_str": "分类",
+                "quantity": 145.635, "expr": null,
+                "basic_price": 4350, "basic_times": null,
+                "msg_tp": 5100, "msg_times": "2020-05-08", "msg_spread": 750,
+                "m_up_risk": 5, "m_down_risk": 5, "m_spread": 532.5,
+                "tp": 77550.64, "end_tp": 1060588.24, "pre_tp": 983037.6,
+                "remark": null, "in_time": "2020-05-08T08:09:33.000Z",
+            },
+            {
+                "id": 132, "tid": 2418, "mid": 131,
+                "t_type": 1, "m_type": 1, "t_type_str": "消耗量", "m_type_str": "分类",
+                "code": "102", "name": "带肋钢筋", "unit": "kg", "spec": null,
+                "quantity": 145.55, "expr": null,
+                "basic_price": 4620, "basic_times": null,
+                "msg_tp": 5500, "msg_times": "2020-05-09", "msg_spread": 880,
+                "m_up_risk": 5, "m_down_risk": 5, "m_spread": 649,
+                "tp": 94461.95, "end_tp": 1783456.95, "pre_tp": 1688995,
+                "remark": null, "in_time": "2020-05-08T08:09:33.000Z",
+            },
+            {
+                "id": 133,
+                "tid": 2418,
+                "mid": 131,
+                "t_type": 1,
+                "code": "103",
+                "name": "水泥",
+                "unit": "m3",
+                "spec": null,
+                "m_type": 1,
+                "quantity": 498.732,
+                "expr": null,
+                "basic_price": 236.98,
+                "basic_times": null,
+                "msg_tp": 200.69,
+                "msg_times": "2020-05-09",
+                "msg_spread": -36.29,
+                "m_up_risk": 5,
+                "m_down_risk": 5,
+                "m_spread": -24.441,
+                "pre_tp": -3770872.11,
+                "remark": null,
+                "in_time": "2020-05-08T08:09:34.000Z",
+                "tp": -12189.51,
+                "t_type_str": "消耗量",
+                "m_type_str": "分类",
+                "end_tp": -3783061.62
+            },
+            {
+                "id": 134,
+                "tid": 2418,
+                "mid": 131,
+                "t_type": 2,
+                "code": "985",
+                "name": "汽油",
+                "unit": "kg",
+                "spec": null,
+                "m_type": 1,
+                "quantity": 1170.1512,
+                "expr": "bqwc/10000*12",
+                "basic_price": 4.9,
+                "basic_times": null,
+                "msg_tp": 6.2,
+                "msg_times": "2020-05-08",
+                "msg_spread": 1.3,
+                "m_up_risk": 3,
+                "m_down_risk": 3,
+                "m_spread": 1.153,
+                "pre_tp": null,
+                "remark": null,
+                "in_time": "2020-05-08T08:09:36.000Z",
+                "tp": 1349.18,
+                "t_type_str": "费用",
+                "m_type_str": "分类",
+                "end_tp": 1349.18
+            }
+        ];
+        const result = yield ctx.service.reportMemory.getMaterialGl(2418, 2);
+        //yield ctx.helper.saveBufferFile(JSON.stringify(result, "", "\t"), path.join(savePath, 'mem-material-gl.json'));
+        assert(result.length === 4);
+
+        assert(checkData(result[0], checkResult[0]));
+        assert(checkData(result[1], checkResult[1]));
+        assert(checkData(result[2], checkResult[2]));
+        assert(checkData(result[3], checkResult[3]));
+    });
+
+});

+ 9 - 13
test/app/service/report_memory_temp.test.js

@@ -18,16 +18,16 @@ describe('test/app/service/report_memory.test.js', () => {
     before(function* () {
         const ctx = app.mockContext();
         savePath = path.join(ctx.app.baseDir,'report_temp');
-        const postData = {
-            account: '734406061@qq.com',
-            project: 'T201711273363',
-            project_password: 'mai654321',
-        };
         // const postData = {
-        //     account: 'chente',
+        //     account: '734406061@qq.com',
         //     project: 'T201711273363',
-        //     project_password: '123456',
+        //     project_password: 'mai654321',
         // };
+        const postData = {
+            account: 'fuqingqing',
+            project: 'P0505',
+            project_password: '123456',
+        };
         ctx.session = {};
         const loginResult = yield ctx.service.projectAccount.accountLogin(postData, 2);
         assert(loginResult);
@@ -37,11 +37,7 @@ describe('test/app/service/report_memory.test.js', () => {
     it('test getStagePos', function* () {
         const ctx = app.mockContext(mockData);
 
-        // test12 - 第6期
-        const stage = yield ctx.service.stage.getDataByCondition({tid: 2155, order: 2});
-        const mainData = yield ctx.service.reportMemory.getStagePayData(12, stage.id, ['start_stage_order']);
-        if (mainData instanceof Array) {
-            yield ctx.helper.saveBufferFile(JSON.stringify(mainData,"","\t"), path.join(savePath, 'mem_stage_pay.json'));
-        }
+        const result = yield ctx.service.reportMemory.getMaterialGl(2418, 2);
+        yield ctx.helper.saveBufferFile(JSON.stringify(result, "", "\t"), path.join(savePath, 'test-result.json'));
     });
 });