MaiXinRong 3 rokov pred
rodič
commit
595513af45
3 zmenil súbory, kde vykonal 258 pridanie a 0 odobranie
  1. 84 0
      app/lib/rm/budget.js
  2. 18 0
      app/service/report.js
  3. 156 0
      builder_report_index_define.js

+ 84 - 0
app/lib/rm/budget.js

@@ -0,0 +1,84 @@
+'use strict';
+
+/**
+ *
+ *
+ * @author Mai
+ * @date
+ * @version
+ */
+
+const ledger = require('../ledger');
+
+class reportMemoryBudget {
+    constructor(ctx) {
+        this.ctx = ctx;
+        this.budget = null;
+        this.getBudget = false;
+    }
+
+    async budgetGai(bid) {
+        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 tree.getDefaultDatas();
+    }
+    async budgetYu(bid) {
+        const yu = 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(yu);
+        tree.calculateAll();
+        return tree.getDefaultDatas();
+    }
+    async budgetGu(bid) {
+        const yu = 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(yu);
+        tree.calculateAll();
+        return tree.getDefaultDatas();
+    }
+    async budgetFinal(bid) {
+        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 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) {
+        await this._getTenderBudget(tid);
+        return this.budget ? await this.budgetGai(this.budget.id) : [];
+    }
+
+    async tenderYu(tid) {
+        await this._getTenderBudget(tid);
+        return this.budget ? await this.budgetYu(this.budget.id) : [];
+    }
+
+    async tenderGu(tid) {
+        await this._getTenderBudget(tid);
+        return this.budget ? await this.budgetGu(this.budget.id) : [];
+    }
+
+    async tenderFinal(tid) {
+        await this._getTenderBudget(tid);
+        return this.budget ? await this.budgetFinal(this.budget.id) : [];
+    }
+}
+
+module.exports = reportMemoryBudget;

+ 18 - 0
app/service/report.js

@@ -8,6 +8,7 @@
  * @version
  */
 
+const BudgetSource = require('../lib/rm/budget');
 const rptCustomData = require('../lib/rptCustomData');
 
 module.exports = app => {
@@ -38,6 +39,7 @@ module.exports = app => {
             const rst = {};
             const runnableRst = [];
             const runnableKey = []; // 这个配合runnableRst用,未来考虑并行查询优化
+            const budgetSource = new BudgetSource(this.ctx);
             for (const filter of filters) {
                 if (runnableKey.indexOf(filter) < 0) {
                     switch (filter) {
@@ -246,6 +248,22 @@ module.exports = app => {
                             runnableRst.push(service.stageRelaImBills.getAllDataByCondition({ where: { tid: params.tender_id, sid: params.stage_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);
+                            break;
+                        case 'mem_budget_gai':
+                            runnableRst.push(params.budget_id ? budgetSource.budgetGai(params.budget_id) : budgetSource.tenderGai(params.tender_id));
+                            runnableKey.push(filter);
+                            break;
+                        case 'mem_budget_yu':
+                            runnableRst.push(params.budget_id ? budgetSource.budgetYu(params.budget_id) : budgetSource.tenderYu(params.tender_id));
+                            runnableKey.push(filter);
+                            break;
+                        case 'mem_budget_final':
+                            runnableRst.push(params.budget_id ? budgetSource.budgetFinal(params.budget_id) : budgetSource.tenderFinal(params.tender_id));
+                            runnableKey.push(filter);
+                            break;
                         default:
                             break;
                     }

+ 156 - 0
builder_report_index_define.js

@@ -2461,6 +2461,161 @@ const custom_select = {
     ]
 };
 
+const budget = {
+    gu: {
+        name: '【动态决算】 估算 (mem_budget_gu)',
+        remark: '',
+        id: 90,
+        key: 'mem_budget_gu',
+        prefix: '【动态决算】 估算',
+        cols: [
+            { name: 'ID', field: 'id', type: dataType.int },
+            { name: '概算投资ID', field: 'bid', type: dataType.int },
+            { name: '树结构-ID', field: 'tree_id', type: dataType.int },
+            { name: '树结构-父项ID', field: 'tree_pid', type: dataType.int },
+            { name: '树结构-层级', field: 'level', type: dataType.int },
+            { name: '树结构-同层排序', field: 'order', type: dataType.int },
+            { name: '树结构-完整路径', field: 'full_path', type: dataType.str },
+            { name: '树结构-是否子项', field: 'is_leaf', type: dataType.int }, // 8
+
+            { name: '项目节编号', field: 'code', type: dataType.str },
+            { name: '清单编号', field: 'b_code', type: dataType.str },
+            { name: '名称', field: 'name', type: dataType.str },
+            { name: '单位', field: 'unit', type: dataType.str }, // 12
+            { name: '单价', field: 'unit_price', type: dataType.currency },
+
+            { name: '台账-数量', field: 'quantity', type: dataType.currency },
+            { name: '台账-金额', field: 'total_price', type: dataType.currency },
+
+            { name: '项目节-数量1', field: 'dgn_qty1', type: dataType.currency },
+            { name: '项目节-数量2', field: 'dgn_qty2', type: dataType.currency },
+
+            { name: '图册号', field: 'drawing_code', type: dataType.str },
+            { name: '备注', field: 'memo', type: dataType.str },
+            { name: '节点类型', field: 'node_type', type: dataType.int },
+        ],
+    },
+    gai: {
+        name: '【动态决算】 概算 (mem_budget_gai)',
+        remark: '',
+        id: 91,
+        key: 'mem_budget_gai',
+        prefix: '【动态决算】 概算',
+        cols: [
+            { name: 'ID', field: 'id', type: dataType.int },
+            { name: '概算投资ID', field: 'bid', type: dataType.int },
+            { name: '树结构-ID', field: 'tree_id', type: dataType.int },
+            { name: '树结构-父项ID', field: 'tree_pid', type: dataType.int },
+            { name: '树结构-层级', field: 'level', type: dataType.int },
+            { name: '树结构-同层排序', field: 'order', type: dataType.int },
+            { name: '树结构-完整路径', field: 'full_path', type: dataType.str },
+            { name: '树结构-是否子项', field: 'is_leaf', type: dataType.int }, // 8
+
+            { name: '项目节编号', field: 'code', type: dataType.str },
+            { name: '清单编号', field: 'b_code', type: dataType.str },
+            { name: '名称', field: 'name', type: dataType.str },
+            { name: '单位', field: 'unit', type: dataType.str }, // 12
+            { name: '单价', field: 'unit_price', type: dataType.currency },
+
+            { name: '台账-数量', field: 'quantity', type: dataType.currency },
+            { name: '台账-金额', field: 'total_price', type: dataType.currency },
+
+            { name: '项目节-数量1', field: 'dgn_qty1', type: dataType.currency },
+            { name: '项目节-数量2', field: 'dgn_qty2', type: dataType.currency },
+
+            { name: '图册号', field: 'drawing_code', type: dataType.str },
+            { name: '备注', field: 'memo', type: dataType.str },
+            { name: '节点类型', field: 'node_type', type: dataType.int },
+        ],
+    },
+    yu: {
+        name: '【动态决算】 预算 (mem_budget_yu)',
+        remark: '',
+        id: 92,
+        key: 'mem_budget_yu',
+        prefix: '【动态决算】 预算',
+        cols: [
+            { name: 'ID', field: 'id', type: dataType.int },
+            { name: '概算投资ID', field: 'bid', type: dataType.int },
+            { name: '树结构-ID', field: 'tree_id', type: dataType.int },
+            { name: '树结构-父项ID', field: 'tree_pid', type: dataType.int },
+            { name: '树结构-层级', field: 'level', type: dataType.int },
+            { name: '树结构-同层排序', field: 'order', type: dataType.int },
+            { name: '树结构-完整路径', field: 'full_path', type: dataType.str },
+            { name: '树结构-是否子项', field: 'is_leaf', type: dataType.int }, // 8
+
+            { name: '项目节编号', field: 'code', type: dataType.str },
+            { name: '清单编号', field: 'b_code', type: dataType.str },
+            { name: '名称', field: 'name', type: dataType.str },
+            { name: '单位', field: 'unit', type: dataType.str }, // 12
+            { name: '单价', field: 'unit_price', type: dataType.currency },
+
+            { name: '台账-数量', field: 'quantity', type: dataType.currency },
+            { name: '台账-金额', field: 'total_price', type: dataType.currency },
+
+            { name: '项目节-数量1', field: 'dgn_qty1', type: dataType.currency },
+            { name: '项目节-数量2', field: 'dgn_qty2', type: dataType.currency },
+
+            { name: '图册号', field: 'drawing_code', type: dataType.str },
+            { name: '备注', field: 'memo', type: dataType.str },
+            { name: '节点类型', field: 'node_type', type: dataType.int },
+        ],
+    },
+    final: {
+        name: '【动态决算】 决算对比 (mem_budget_final)',
+        remark: '',
+        id: 93,
+        key: 'mem_budget_final',
+        prefix: '【动态决算】 决算对比',
+        cols: [
+            { name: 'ID', field: 'id', type: dataType.int },
+            { name: '概算投资ID', field: 'bid', type: dataType.int },
+            { name: '决算ID', field: 'final_id', type: dataType.int },
+
+            { name: '树结构-ID', field: 'tree_id', type: dataType.int },
+            { name: '树结构-父项ID', field: 'tree_pid', type: dataType.int },
+            { name: '树结构-层级', field: 'level', type: dataType.int },
+            { name: '树结构-同层排序', field: 'order', type: dataType.int },
+            { name: '树结构-完整路径', field: 'full_path', type: dataType.str },
+            { name: '树结构-是否子项', field: 'is_leaf', type: dataType.int }, // 8
+
+            { name: '项目节编号', field: 'code', type: dataType.str },
+            { name: '名称', field: 'name', type: dataType.str },
+            { name: '单位', field: 'unit', type: dataType.str }, // 12
+            { name: '单价', field: 'unit_price', type: dataType.currency },
+
+            { name: '估算-项目节-数量1', field: 'gu_dgn_qty1', type: dataType.currency },
+            { name: '估算-项目节-数量2', field: 'gu_dgn_qty2', type: dataType.currency },
+            { name: '估算-金额', field: 'gu_tp', type: dataType.currency },
+
+            { name: '概算-项目节-数量1', field: 'gai_dgn_qty1', type: dataType.currency },
+            { name: '概算-项目节-数量2', field: 'gai_dgn_qty2', type: dataType.currency },
+            { name: '概算-金额', field: 'gai_tp', type: dataType.currency },
+
+            { name: '预算-项目节-数量1', field: 'yu_dgn_qty1', type: dataType.currency },
+            { name: '预算-项目节-数量2', field: 'yu_dgn_qty2', type: dataType.currency },
+            { name: '预算-金额', field: 'yu_tp', type: dataType.currency },
+
+            { name: '决算-台账-项目节-数量1', field: 'dgn_qty1', type: dataType.currency },
+            { name: '决算-台账-项目节-数量2', field: 'dgn_qty2', type: dataType.currency },
+            { name: '决算-台账-金额', field: 'total_price', type: dataType.currency },
+            { name: '决算-台账-经济指标', field: 'dgn_price', type: dataType.currency },
+            { name: '决算-台账-数量1/数量2', field: 'dgn_qty', type: dataType.currency },
+
+            { name: '决算-项目节-数量1', field: 'final_dgn_qty1', type: dataType.currency },
+            { name: '决算-项目节-数量2', field: 'final_dgn_qty2', type: dataType.currency },
+            { name: '决算-金额', field: 'final_tp', type: dataType.currency },
+            { name: '决算-经济指标', field: 'final_dgn_price', type: dataType.currency },
+            { name: '决算-数量1/数量2', field: 'final_dgn_qty', type: dataType.currency },
+
+            { name: '增减%-项目节-数量1', field: 'grow_dgn_qty1', type: dataType.currency },
+            { name: '增减%-项目节-数量2', field: 'grow_dgn_qty2', type: dataType.currency },
+            { name: '增减%-金额', field: 'grow_tp', type: dataType.currency },
+            { name: '增减%-数量1/数量2', field: 'grow_dgn_qty', type: dataType.currency },
+        ],
+    }
+};
+
 const recursiveMkdirSync = async function(pathName) {
     if (!fs.existsSync(pathName)) {
         const upperPath = path.dirname(pathName);
@@ -2580,6 +2735,7 @@ const defines = [
     jh_im_change, jh_gather_im_change, jh_gather_stage_bills_compare,
     custom_select,
     stage_change_info, stage_change_info_bills,
+    budget.gu, budget.gai, budget.yu, budget.final,
 ];
 for (const d of defines) {
     exportTableDefine(d);