Explorar o código

动态投资数据源相关

MaiXinRong %!s(int64=2) %!d(string=hai) anos
pai
achega
8b87429ea5

+ 1 - 0
app/const/source_type.js

@@ -10,6 +10,7 @@ const sourceTypeData = [
     { id: 30, name: '材料调差', key: 'material' },
     { id: 100, name: '支付审批', key: 'payment' },
     { id: 101, name: '安全生产费', key: 'payment_safe' },
+    { id: 200, name: '动态投资', key: 'budget' },
 ];
 const sourceType = (function (data){
     const result = {};

+ 61 - 38
app/lib/rm/budget.js

@@ -8,13 +8,36 @@
  * @version
  */
 
+const RptMemBase = require('./base');
+const bindData = {};
 const ledger = require('../ledger');
 
-class reportMemoryBudget {
+class rptMemPaymentSafe extends RptMemBase {
     constructor(ctx) {
-        this.ctx = ctx;
-        this.budget = null;
-        this.getBudget = false;
+        super(ctx, bindData);
+    }
+
+    async doCheckSubProj(id) {
+        if (this.ctx.subProject) return;
+        this.ctx.subProject = await this.ctx.service.subProject.getDataById(id);
+        this.ctx.subProject.info = await this.ctx.service.subProjInfo.getInfo4Report(ctx.subProject.id);
+        if (!this.ctx.budget) {
+            this.ctx.budget = await this.ctx.service.budget.getCurBudget(this.ctx.subProject.budget_id);
+        }
+    }
+
+    async doCheckBudget(id) {
+        if (this.ctx.budget) return;
+        this.ctx.budget = await this.ctx.service.budget.getCurBudget(id);
+        if (!this.ctx.subProject) {
+            this.ctx.subProject = await this.ctx.service.subProject.getDataByCondition({ budget_id: id });
+            this.ctx.subProject.info = await this.ctx.service.subProjInfo.getInfo4Report(ctx.subProject.id);
+        }
+    }
+
+    async doBeforeLoadReport(params) {
+        await this.doCheckSubProj(params.sp_id);
+        await this.doCheckBudget(params.budget_id);
     }
 
     async budgetGai(bid, showLevel = false) {
@@ -22,21 +45,24 @@ class reportMemoryBudget {
         const tree = new ledger.billsTree(this.ctx, { id: 'tree_id', pid: 'tree_pid', order: 'order', level: 'level', rootId: -1, calcFields: ['total_price'] });
         tree.loadDatas(gai);
         tree.calculateAll();
-        return showLevel ? tree.getDefaultDatasByLevel(this.ctx.tender.rpt_show_level) : tree.getDefaultDatas();
+        // return showLevel ? tree.getDefaultDatasByLevel(this.ctx.tender.rpt_show_level) : tree.getDefaultDatas();
+        return tree.getDefaultDatas();
     }
     async budgetYu(bid, showLevel = false) {
         const yu = await this.ctx.service.budgetYu.getAllDataByCondition({ where: { bid } });
         const tree = new ledger.billsTree(this.ctx, { id: 'tree_id', pid: 'tree_pid', order: 'order', level: 'level', rootId: -1, calcFields: ['total_price'] });
         tree.loadDatas(yu);
         tree.calculateAll();
-        return showLevel ? tree.getDefaultDatasByLevel(this.ctx.tender.rpt_show_level) : tree.getDefaultDatas();
+        // return showLevel ? tree.getDefaultDatasByLevel(this.ctx.tender.rpt_show_level) : tree.getDefaultDatas();
+        return tree.getDefaultDatas();
     }
     async budgetGu(bid, showLevel = false) {
         const gu = await this.ctx.service.budgetGu.getAllDataByCondition({ where: { bid } });
         const tree = new ledger.billsTree(this.ctx, { id: 'tree_id', pid: 'tree_pid', order: 'order', level: 'level', rootId: -1, calcFields: ['total_price'] });
         tree.loadDatas(gu);
         tree.calculateAll();
-        return showLevel ? tree.getDefaultDatasByLevel(this.ctx.tender.rpt_show_level) : tree.getDefaultDatas();
+        // return showLevel ? tree.getDefaultDatasByLevel(this.ctx.tender.rpt_show_level) : tree.getDefaultDatas();
+        return tree.getDefaultDatas();
     }
     async budgetFinal(bid, showLevel = false) {
         const budget = this.ctx.budget && this.ctx.budget.id === bid
@@ -46,39 +72,36 @@ class reportMemoryBudget {
         const final = await this.ctx.service.budgetFinal.getAllDataByCondition({ where: { final_id: budget.final_id } });
         const tree = new ledger.billsTree(this.ctx, { id: 'tree_id', pid: 'tree_pid', order: 'order', level: 'level', rootId: -1, calcFields: [] });
         tree.loadDatas(final);
-        return showLevel ? tree.getDefaultDatasByLevel(this.ctx.tender.rpt_show_level) : tree.getDefaultDatas();
-    }
-
-    async _getTenderBudget(tid) {
-        if (this.getBudget) return;
-
-        const budgets = await this.ctx.service.budget.getBudget(true);
-        this.budget = budgets.find(x => {
-            const relaTender = x.rela_tender.split(',');
-            return relaTender.indexOf(tid + '') >= 0;
-        });
-        this.getBudget = true;
-    }
-
-    async tenderGai(tid, filter = false) {
-        await this._getTenderBudget(tid);
-        return this.budget ? await this.budgetGai(this.budget.id, filter) : [];
-    }
-
-    async tenderYu(tid, filter = false) {
-        await this._getTenderBudget(tid);
-        return this.budget ? await this.budgetYu(this.budget.id, filter) : [];
-    }
-
-    async tenderGu(tid, filter = false) {
-        await this._getTenderBudget(tid);
-        return this.budget ? await this.budgetGu(this.budget.id, filter) : [];
+        // return showLevel ? tree.getDefaultDatasByLevel(this.ctx.tender.rpt_show_level) : tree.getDefaultDatas();
+        return tree.getDefaultDatas();
     }
 
-    async tenderFinal(tid, filter = false) {
-        await this._getTenderBudget(tid);
-        return this.budget ? await this.budgetFinal(this.budget.id, filter) : [];
+    getCommonData(params, tableName, fields, customDefine, customSelect) {
+        switch (tableName) {
+            case 'mem_info':
+                return this.ctx.subProject.info;
+            case 'mem_qty_info':
+                return [...this.ctx.subProject.info.main_quantity, ...this.ctx.subProject.info.gcl_quantity];
+            case 'mem_budget_gu':
+                return this.budgetGu(this.ctx.budget.id);
+            case 'mem_budget_gai':
+                return this.budgetGai(this.ctx.budget.id);
+            case 'mem_budget_yu':
+                return this.budgetYu(this.ctx.budget.id);
+            case 'mem_budget_final':
+                return this.budgetFinal(this.ctx.budget.id);
+            case 'mem_budget_gu_filter':
+                return this.budgetGu(this.ctx.budget.id, true);
+            case 'mem_budget_gai_filter':
+                return this.budgetGai(this.ctx.budget.id, true);
+            case 'mem_budget_yu_filter':
+                return this.budgetYu(this.ctx.budget.id, true);
+            case 'mem_budget_final_filter':
+                return this.budgetFinal(this.ctx.budget.id, true);
+            default:
+                return [];
+        }
     }
 }
 
-module.exports = reportMemoryBudget;
+module.exports = rptMemPaymentSafe;

+ 94 - 0
app/lib/rm/tender_budget.js

@@ -0,0 +1,94 @@
+'use strict';
+
+/**
+ *
+ *
+ * @author Mai
+ * @date
+ * @version
+ */
+
+const ledger = require('../ledger');
+
+class reportMemoryBudget {
+    constructor(ctx) {
+        this.ctx = ctx;
+        this.budget = null;
+        this.getBudget = false;
+    }
+
+    async budgetInfo(bid) {
+        const subProject = await this.ctx.service.subProject.getDataByCondition({ budget_id: bid });
+        return await this.ctx.service.subProjInfo.getInfo4Report(subProject.id);
+    }
+
+    async budgetGai(bid, showLevel = false) {
+        const gai = await this.ctx.service.budgetGai.getAllDataByCondition({ where: { bid } });
+        const tree = new ledger.billsTree(this.ctx, { id: 'tree_id', pid: 'tree_pid', order: 'order', level: 'level', rootId: -1, calcFields: ['total_price'] });
+        tree.loadDatas(gai);
+        tree.calculateAll();
+        return showLevel ? tree.getDefaultDatasByLevel(this.ctx.tender.rpt_show_level) : tree.getDefaultDatas();
+    }
+    async budgetYu(bid, showLevel = false) {
+        const yu = await this.ctx.service.budgetYu.getAllDataByCondition({ where: { bid } });
+        const tree = new ledger.billsTree(this.ctx, { id: 'tree_id', pid: 'tree_pid', order: 'order', level: 'level', rootId: -1, calcFields: ['total_price'] });
+        tree.loadDatas(yu);
+        tree.calculateAll();
+        return showLevel ? tree.getDefaultDatasByLevel(this.ctx.tender.rpt_show_level) : tree.getDefaultDatas();
+    }
+    async budgetGu(bid, showLevel = false) {
+        const gu = await this.ctx.service.budgetGu.getAllDataByCondition({ where: { bid } });
+        const tree = new ledger.billsTree(this.ctx, { id: 'tree_id', pid: 'tree_pid', order: 'order', level: 'level', rootId: -1, calcFields: ['total_price'] });
+        tree.loadDatas(gu);
+        tree.calculateAll();
+        return showLevel ? tree.getDefaultDatasByLevel(this.ctx.tender.rpt_show_level) : tree.getDefaultDatas();
+    }
+    async budgetFinal(bid, showLevel = false) {
+        const budget = this.ctx.budget && this.ctx.budget.id === bid
+            ? this.ctx.budget
+            : await this.ctx.service.budget.getDataById(bid);
+        if (!budget.final_id) return [];
+        const final = await this.ctx.service.budgetFinal.getAllDataByCondition({ where: { final_id: budget.final_id } });
+        const tree = new ledger.billsTree(this.ctx, { id: 'tree_id', pid: 'tree_pid', order: 'order', level: 'level', rootId: -1, calcFields: [] });
+        tree.loadDatas(final);
+        return showLevel ? tree.getDefaultDatasByLevel(this.ctx.tender.rpt_show_level) : tree.getDefaultDatas();
+    }
+
+    async _getTenderBudget(tid) {
+        if (this.getBudget) return;
+
+        const budgets = await this.ctx.service.budget.getBudget(true);
+        this.budget = budgets.find(x => {
+            const relaTender = x.rela_tender.split(',');
+            return relaTender.indexOf(tid + '') >= 0;
+        });
+        this.getBudget = true;
+    }
+
+    async tenderBudgetInfo(tid) {
+        await this._getTenderBudget(tid);
+        return this.budget ? await this.budgetInfo(this.budget.id) : [];
+    }
+
+    async tenderGai(tid, filter = false) {
+        await this._getTenderBudget(tid);
+        return this.budget ? await this.budgetGai(this.budget.id, filter) : [];
+    }
+
+    async tenderYu(tid, filter = false) {
+        await this._getTenderBudget(tid);
+        return this.budget ? await this.budgetYu(this.budget.id, filter) : [];
+    }
+
+    async tenderGu(tid, filter = false) {
+        await this._getTenderBudget(tid);
+        return this.budget ? await this.budgetGu(this.budget.id, filter) : [];
+    }
+
+    async tenderFinal(tid, filter = false) {
+        await this._getTenderBudget(tid);
+        return this.budget ? await this.budgetFinal(this.budget.id, filter) : [];
+    }
+}
+
+module.exports = reportMemoryBudget;

+ 12 - 1
app/service/report.js

@@ -8,7 +8,7 @@
  * @version
  */
 
-const BudgetSource = require('../lib/rm/budget');
+const BudgetSource = require('../lib/rm/tender_budget');
 const MaterialSource = require('../lib/rm/material');
 
 const rptCustomData = require('../lib/rptCustomData');
@@ -346,6 +346,10 @@ module.exports = app => {
                             runnableRst.push(service.stageRelaImBills.getAllDataByCondition({ where: { tid: params.tender_id, sid: params.stage_id } }));
                             runnableKey.push(filter);
                             break;
+                        case 'mem_budget_info':
+                            runnableRst.push(params.budget_id ? budgetSource.budgetInfo(params.budget_id) : budgetSource.tenderBudgetInfo(params.tender_id));
+                            runnableKey.push(filter);
+                            break;
                         case 'mem_budget_gu':
                             runnableRst.push(params.budget_id ? budgetSource.budgetGu(params.budget_id) : budgetSource.tenderGu(params.tender_id));
                             runnableKey.push(filter);
@@ -517,6 +521,13 @@ module.exports = app => {
             return rptPayment.getReportData(params, sourceFilters, memFieldKeys, customDefine, customSelect);
         }
 
+        async budget(params, sourceFilters, memFieldKeys, customDefine, customSelect) {
+            const RptPayment = require('../lib/rm/budget');
+            const rptPayment = new RptPayment(this.ctx);
+
+            return rptPayment.getReportData(params, sourceFilters, memFieldKeys, customDefine, customSelect);
+        }
+
         async getReportData(source_type, params, sourceFilters, memFieldKeys, customDefine, customSelect) {
             const sourceType = sourceTypeConst.sourceTypeData.find(x => { return x.id === source_type; });
             if (!sourceType && !this[sourceType.key]) return {};

+ 14 - 0
app/service/sub_proj_info.js

@@ -85,6 +85,20 @@ module.exports = app => {
             return info;
         }
 
+        async getInfo4Report(id) {
+            let info = await this.getDataByCondition({ id });
+            // 兼容不存在info的情况
+            if (!info) info = await this.addInfo(id, this.ctx.session.sessionProject.id);
+
+            for (const ai in defaultInfo) {
+                info[ai] = !info[ai] || info[ai] === '' ? defaultInfo[ai] : JSON.parse(info[ai]);
+                info[ai].forEach(x => {
+                    x.type = ai;
+                });
+            }
+            return info;
+        }
+
         async _saveCommonInfo(id, data) {
             const updateData = { id };
             for (const d in data) {