Browse Source

材差汇总指标

MaiXinRong 3 years ago
parent
commit
25e7d9a151

+ 4 - 0
app/extend/context.js

@@ -76,4 +76,8 @@ module.exports = {
         return this.app.hisOss;
     },
 
+    saveTempFile(filename, text) {
+        const filepath = path.join(this.app.config.logger.dir, this.app.config.version, filename);
+        this.helper.saveBufferFile(text, filepath);
+    }
 };

+ 17 - 0
app/lib/gcl_gather.js

@@ -334,6 +334,23 @@ const gclGatherModel = class {
         this.convertResultData();
         return [this.gclList, this.leafXmjs];
     }
+    gatherObj(bills, pos, deal) {
+        const helper = this.ctx.helper;
+        this.billsTree = bills;
+        this.pos = pos;
+
+        this.gclList = [];
+        this.leafXmjs = [];
+
+        this.recursiveGatherGclData(this.billsTree.children, null);
+        this.gatherDealBillsData(deal);
+        this.gclList.sort(function (a, b) {
+            return helper.compareCode(a.b_code, b.b_code);
+        });
+
+        this.convertResultData();
+        return [this.gclList, this.leafXmjs];
+    }
 };
 
 module.exports = {

+ 296 - 0
app/lib/rm/material.js

@@ -0,0 +1,296 @@
+'use strict';
+
+/**
+ *
+ *
+ * @author Mai
+ * @date
+ * @version
+ */
+
+const materialConst = require('../../const/material');
+
+const Ledger = require('../../lib/ledger');
+
+const billsFields = (function () {
+    const cur = ['contract_qty', 'contract_tp', 'contract_expr', 'qc_qty', 'qc_tp', 'gather_qty', 'gather_tp', 'postil'];
+    const pre = ['pre_contract_qty', 'pre_contract_tp', 'pre_qc_qty', 'pre_qc_tp', 'pre_gather_qty', 'pre_gather_tp'];
+    const end = ['end_contract_qty', 'end_contract_tp', 'end_qc_qty', 'end_qc_tp', 'end_gather_qty', 'end_gather_tp'];
+    const final = ['final_tp', 'final_ratio'];
+    const stageDgn = ['deal_dgn_qty1', 'deal_dgn_qty2', 'c_dgn_qty1', 'c_dgn_qty2'];
+
+    const stage = cur.concat(pre, end, final);
+    const stageEnd = pre.concat(end, final);
+    const bgl = ['qc_bgl_code'];
+    const leafXmj = ['leaf_xmj_id'];
+
+    return {cur, pre, end, final, stageDgn, stage, stageEnd, bgl, leafXmj};
+})();
+const posFields = (function () {
+    const cur = ['contract_qty', 'qc_qty', 'gather_qty', 'postil'];
+    const pre = ['pre_contract_qty', 'pre_qc_qty', 'pre_gather_qty'];
+    const end = ['end_contract_qty', 'end_qc_qty', 'end_gather_qty'];
+    const final = ['final_ratio'];
+
+    const stage = cur.concat(pre, end, final);
+    const stageEnd = pre.concat(end, final);
+    const bgl = ['qc_bgl_code'];
+
+    return {cur, pre, end, final, stage, stageEnd, bgl};
+})();
+
+class ReportMemoryMaterial {
+    constructor(ctx) {
+        this.ctx = ctx;
+    }
+
+    _getNewPos(updateFields) {
+        const helper = this.ctx.helper;
+        return new Ledger.pos({
+            id: 'id', ledgerId: 'lid',
+            updateFields: ['contract_qty', 'qc_qty', 'postil'],
+            calc: function (p) {
+                p.pre_gather_qty = helper.add(p.pre_contract_qty, p.pre_qc_qty);
+                p.gather_qty = helper.add(p.contract_qty, p.qc_qty);
+                p.end_contract_qty = helper.add(p.pre_contract_qty, p.contract_qty);
+                p.end_qc_qty = helper.add(p.pre_qc_qty, p.qc_qty);
+                p.end_gather_qty = helper.add(p.pre_gather_qty, p.gather_qty);
+            }
+        });
+    }
+
+    _getNewBillsTree(calcFields) {
+        return new Ledger.billsTree(this.ctx, {
+            id: 'ledger_id',
+            pid: 'ledger_pid',
+            order: 'order',
+            level: 'level',
+            rootId: -1,
+            keys: ['id', 'tender_id', 'ledger_id'],
+            stageId: 'id',
+            calcFields: calcFields || ['deal_tp', 'total_price', 'contract_tp', 'qc_tp', 'gather_tp', 'pre_contract_tp', 'pre_qc_tp', 'pre_gather_tp'],
+            calc: function (node, helper) {
+                if (node.children && node.children.length === 0) {
+                    node.pre_gather_qty = helper.add(node.pre_contract_qty, node.pre_qc_qty);
+                    node.gather_qty = helper.add(node.contract_qty, node.qc_qty);
+                    node.end_contract_qty = helper.add(node.pre_contract_qty, node.contract_qty);
+                    node.end_qc_qty = helper.add(node.pre_qc_qty, node.qc_qty);
+                    node.end_gather_qty = helper.add(node.pre_gather_qty, node.gather_qty);
+                }
+                node.pre_gather_tp = helper.add(node.pre_contract_tp, node.pre_qc_tp);
+                node.gather_tp = helper.add(node.contract_tp, node.qc_tp);
+                node.end_contract_tp = helper.add(node.pre_contract_tp, node.contract_tp);
+                node.end_qc_tp = helper.add(node.pre_qc_tp, node.qc_tp);
+                node.end_gather_tp = helper.add(node.pre_gather_tp, node.gather_tp);
+
+                node.final_tp = helper.add(node.total_price, node.end_qc_tp);
+                node.final_ratio = helper.mul(helper.div(node.end_gather_tp, node.final_tp, 4), 100);
+            }
+        });
+    }
+
+    _checkFieldsExist(source, check) {
+        for (const s of source) {
+            if (check.indexOf(s) >= 0) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    async getSelectMaterialAuditors(tid, material_order, fields) {
+        await this.ctx.service.material.checkMaterial(tid, material_order);
+        const auditors = await this.ctx.service.materialAudit.getFinalAuditGroup(this.ctx.material.id, this.ctx.material.curTimes);
+        const user = await this.ctx.service.projectAccount.getDataById(this.ctx.material.user_id);
+        const result = [{
+            aid: user.id,
+            name: user.name,
+            company: user.company,
+            role: user.role,
+            mobile: user.mobile,
+            telephone: user.telephone,
+            sign_path: user.sign_path,
+            opinion: user.opinion,
+            end_time: auditors && auditors.length > 0 ? auditors[0].begin_time : null,
+            sort: 0,
+        }, ...auditors];
+        return result;
+    }
+
+    async getMaterial(tender_id, material_order, fields) {
+        const result = await this.ctx.service.material.getValidMaterials(tender_id);
+        if (this._checkFieldsExist(fields, ['checked_time'])) {
+            for (const r of result) {
+                const auditors = await this.ctx.service.materialAudit.getFinalAuditGroup(r.id, r.curTimes || r.times);
+                r.checked_time = !r.curTimes ? auditors[auditors.length - 1].end_time : null;
+            }
+        }
+        return result;
+    }
+
+    _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, fields) {
+        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 mb.id, mb.tid, mb.mid, mb.order, mb.order, mb.t_type, mb.code, mb.name, mb.unit, mb.spec, mb.m_type,' +
+                    '    mbh.quantity, mbh.expr,' +
+                    '    mb.basic_price, mb.basic_times, ' +
+                    '    mbh.msg_tp, mbh.msg_times, mbh.msg_spread, mbh.m_up_risk, mbh.m_down_risk, mbh.m_spread, mbh.m_tp, mbh.pre_tp, mbh.m_tax_tp, mbh.tax_pre_tp, mbh.origin, ' +
+                    '    mb.remark, mb.is_summary, mbh.m_tax, mb.in_time' +
+                    '  FROM ' + this.ctx.service.materialBillsHistory.tableName + ' mbh ' +
+                    '  LEFT JOIN ' + this.ctx.service.materialBills.tableName + ' mb ON mbh.mb_id = mb.id ' +
+                    '  WHERE mbh.tid = ? And mbh.mid = ?';
+                result = await this.ctx.app.mysql.query(sql, [tender_id, material.id]);
+            }
+            this._completeMaterialGl(result);
+            return result;
+        } else {
+            return [];
+        }
+    }
+
+    async getMaterialGlDetail(tender_id, material_order, fields) {
+        const material = await this.ctx.service.material.getDataByCondition({tid: tender_id, order: material_order});
+        return material ? await this.ctx.service.materialList.getMaterialData(tender_id, material.id) : [];
+    }
+
+    async getMaterialBills(tender_id, material_order, fields) {
+        const material = await this.ctx.service.material.getDataByCondition({tid: tender_id, order: material_order});
+        try {
+            const billsData = await this.ctx.service.ledger.getData(tender_id);
+            if (this._checkFieldsExist(fields, billsFields.stage)) {
+                const curStage = await this.ctx.service.stageBills.getStagesData(tender_id, material.stage_id);
+                this.ctx.helper.assignRelaData(billsData, [
+                    {data: curStage, fields: ['contract_qty', 'contract_tp', 'contract_expr', 'qc_qty', 'qc_tp', 'postil'], prefix: '', relaId: 'lid'}
+                ]);
+            }
+
+            const billsTree = this._getNewBillsTree();
+            billsTree.loadDatas(billsData);
+            billsTree.calculateAll();
+
+            return billsTree.getDatas([
+                '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',
+                'sgfh_expr', 'sjcl_expr', 'qtcl_expr', 'contract_expr',
+            ]);
+        } catch(err) {
+            this.ctx.helper.log(err);
+            return [];
+        }
+    }
+
+    async getMaterialPos(tender_id, material_order, fields) {
+        const material = await this.ctx.service.material.getDataByCondition({tid: tender_id, order: material_order});
+        try {
+            const posData = await this.ctx.service.pos.getAllDataByCondition({ where: {tid: tender_id }});
+            if (this._checkFieldsExist(fields, posFields.stage)) {
+                const curPosStage = await this.ctx.service.stagePos.getStagesData(tender_id, material.stage_id);
+                this.ctx.helper.assignRelaData(posData, [
+                    {data: curPosStage, fields: ['contract_qty', 'qc_qty', 'contract_expr', 'postil'], prefix: '', relaId: 'pid'}
+                ]);
+            }
+            const pos = this._getNewPos();
+            pos.loadDatas(posData);
+            pos.calculateAll();
+
+            return pos.getDatas();
+        } catch (err) {
+            this.ctx.helper.log(err);
+            return [];
+        }
+    }
+
+    async getMaterialGatherBills(tender_id, material_order) {
+        const materials = await this.ctx.service.material.getAllDataByCondition({
+            where: { tid: tender_id },
+            orders: [['order', 'desc']],
+        });
+        if (materials.length === 0) return {};
+
+        const material = await this.ctx.service.material.getDataByCondition({ tid: tender_id, order: material_order });
+        const decimal = material.decimal ? JSON.parse(material.decimal) : materialConst.decimal;
+        try {
+
+            const billsData = await this.ctx.service.ledger.getData(tender_id);
+            const billsTree = this._getNewBillsTree();
+            billsTree.loadDatas(billsData);
+            billsTree.calculateAll();
+
+            const posData = await this.ctx.service.pos.getPosData({ tid: tender_id });
+            const curStage = await this.ctx.service.stagePos.getStagesData(tender_id, material.stage_id);
+            this.ctx.helper.assignRelaData(posData, [
+                { data: curStage, fields: ['contract_qty', 'contract_tp', 'contract_expr', 'qc_qty', 'qc_tp', 'postil'], prefix: '', relaId: 'pid' },
+            ]);
+            const pos = this._getNewPos();
+            pos.loadDatas(posData);
+            pos.calculateAll();
+
+            const gclGatherModel = require('../gcl_gather').gclGather;
+            const gatherUtil = new gclGatherModel(this.ctx);
+            gatherUtil.gatherObj(billsTree, pos);
+            const materialGl = material_order === materials[0].order
+                ? await this.ctx.service.materialList.getMaterialData(tender_id, material.id)
+                : await this.ctx.service.materialList.getPreMaterialData(tender_id, material.id);
+            const materialNotJoin = await this.ctx.service.materialListNotjoin.getAllDataByCondition({ where: { mid: material.id } });
+
+            const helper = this.ctx.helper;
+            for (const g of gatherUtil.gclList) {
+                g.jiacha = 0;
+                for (const x of g.leafXmjs) {
+                    x.jiacha = 0;
+                    const mnj = materialNotJoin.find(m => {
+                        return m.gcl_id === x.org_gcl_id && m.xmj_id === x.id && (x.mx_id ? x.mx_id === m.mx_id : true);
+                    });
+                    if (mnj) continue;
+                    const list = materialGl.filter(g => {
+                        return g.gcl_id === x.org_gcl_id && g.xmj_id === x.id && (x.mx_id ? x.mx_id === g.mx_id : true);
+                    });
+                    for (const l of list) {
+                        x.jiacha = helper.add(x.jiacha, helper.mul(helper.mul(x.gather_qty, l.quantity), l.m_spread));
+                    }
+                    x.jiacha = helper.round(x.jiacha, decimal.tp);
+                    g.jiacha = helper.add(g.jiacha, x.jiacha);
+                }
+            }
+            return { mem_material_gather_bills: gatherUtil.gclList, mem_material_gather_xmj: gatherUtil.leafXmjs, mem_material_gather_gl: materialGl };
+        } catch (err) {
+            this.ctx.log(err);
+            return {};
+        }
+    }
+}
+
+module.exports = ReportMemoryMaterial;

+ 11 - 1
app/service/material_list.js

@@ -248,7 +248,7 @@ module.exports = app => {
          * @return {void}
          */
         async getMaterialData(tid, mid) {
-            const sql = 'SELECT ml.`id`, mb.`code`, mb.`name`, mb.`unit`, ml.`order`, ml.`quantity`, ml.`expr`, ml.`mb_id`, ml.`gcl_id`, ml.`xmj_id`, ml.`mx_id`, ml.`tid`, ml.`mid`' +
+            const sql = 'SELECT ml.`id`, mb.`code`, mb.`name`, mb.`unit`, ml.`order`, ml.`quantity`, ml.`expr`, ml.`mb_id`, ml.`gcl_id`, ml.`xmj_id`, ml.`mx_id`, ml.`tid`, ml.`mid`, mb.m_spread' +
                 ' FROM ' + this.tableName + ' as ml' +
                 ' LEFT JOIN ' + this.ctx.service.materialBills.tableName + ' as mb' +
                 ' ON ml.`mb_id` = mb.`id`' +
@@ -257,6 +257,16 @@ module.exports = app => {
             return await this.db.query(sql, sqlParam);
         }
 
+        async getPreMaterialData(tid, mid) {
+            const sql = 'SELECT ml.`id`, mb.`code`, mb.`name`, mb.`unit`, ml.`order`, ml.`quantity`, ml.`expr`, ml.`mb_id`, ml.`gcl_id`, ml.`xmj_id`, ml.`mx_id`, ml.`tid`, ml.`mid`, mbh.m_spread' +
+                ' FROM ' + this.tableName + ' as ml' +
+                ' LEFT JOIN ' + this.ctx.service.materialBills.tableName + ' as mb ON ml.`mb_id` = mb.`id`' +
+                ' LEFT JOIN ' + this.ctx.service.materialBillsHistory.tableName + ' as mbh ON ml.`mb_id` = mbh.`mb_id` and mbh.mid = ?' +
+                ' WHERE ml.`tid` = ? AND ml.`mid` = ?';
+            const sqlParam = [mid, tid, mid];
+            return await this.db.query(sql, sqlParam);
+        }
+
         /**
          * 复制上一期并生成新一期清单工料关联,计算新一期小计值
          * @param transaction

+ 47 - 7
app/service/report.js

@@ -9,7 +9,13 @@
  */
 
 const BudgetSource = require('../lib/rm/budget');
+const MaterialSource = require('../lib/rm/material');
+
 const rptCustomData = require('../lib/rptCustomData');
+const bindData = {
+    materialGather: ['mem_material_gather_bills', 'mem_material_gather_xmj', 'mem_material_gather_gl'],
+};
+
 
 module.exports = app => {
     class Report extends app.BaseService {
@@ -33,9 +39,31 @@ module.exports = app => {
             }
         }
 
-        async getReportData(params, filters, memFieldKeys, customDefine, customSelect) {
+
+        getFilter(sourceFilters) {
+            const common = [], spec = [];
+            for (const sf of sourceFilters) {
+                let bSpec = false;
+                for (const key in bindData) {
+                    const b = bindData[key];
+                    if (b.indexOf(sf) >= 0) {
+                        bSpec = true;
+                        if (spec.indexOf(key) === -1) {
+                            spec.push(key);
+                            break;
+                        }
+                    }
+                }
+                if (!bSpec) common.push(sf);
+            }
+            return [common, spec];
+        }
+
+        async getReportData(params, sourceFilters, memFieldKeys, customDefine, customSelect) {
+            const [filters, specFilters] = this.getFilter(sourceFilters);
             const service = this.ctx.service;
             await service.tender.checkTender(params.tender_id);
+            const materialSource = new MaterialSource(this.ctx);
             const rst = {};
             const runnableRst = [];
             const runnableKey = []; // 这个配合runnableRst用,未来考虑并行查询优化
@@ -166,27 +194,27 @@ module.exports = app => {
                             runnableKey.push(filter);
                             break;
                         case 'mem_select_material_audit':
-                            runnableRst.push(service.reportMemory.getSelectMaterialAuditors(params.tender_id, params.material_order));
+                            runnableRst.push(materialSource.getSelectMaterialAuditors(params.tender_id, params.material_order));
                             runnableKey.push(filter);
                             break;
                         case 'mem_material':
-                            runnableRst.push(service.reportMemory.getMaterial(params.tender_id, params.material_order, memFieldKeys[filter]));
+                            runnableRst.push(materialSource.getMaterial(params.tender_id, params.material_order, memFieldKeys[filter]));
                             runnableKey.push(filter);
                             break;
                         case 'mem_material_gl':
-                            runnableRst.push(service.reportMemory.getMaterialGl(params.tender_id, params.material_order, memFieldKeys[filter]));
+                            runnableRst.push(materialSource.getMaterialGl(params.tender_id, params.material_order, memFieldKeys[filter]));
                             runnableKey.push(filter);
                             break;
                         case 'mem_material_gl_detail':
-                            runnableRst.push(service.reportMemory.getMaterialGlDetail(params.tender_id, params.material_order, memFieldKeys[filter]));
+                            runnableRst.push(materialSource.getMaterialGlDetail(params.tender_id, params.material_order, memFieldKeys[filter]));
                             runnableKey.push(filter);
                             break;
                         case 'mem_material_bills':
-                            runnableRst.push(service.reportMemory.getMaterialBills(params.tender_id, params.material_order, memFieldKeys[filter]));
+                            runnableRst.push(materialSource.getMaterialBills(params.tender_id, params.material_order, memFieldKeys[filter]));
                             runnableKey.push(filter);
                             break;
                         case 'mem_material_pos':
-                            runnableRst.push(service.reportMemory.getMaterialPos(params.tender_id, params.material_order, memFieldKeys[filter]));
+                            runnableRst.push(materialSource.getMaterialPos(params.tender_id, params.material_order, memFieldKeys[filter]));
                             runnableKey.push(filter);
                             break;
                         case 'mem_stage_sum_bills':
@@ -348,6 +376,18 @@ module.exports = app => {
                         break;
                 }
             }
+            for (const s of specFilters) {
+                switch (s) {
+                    case 'materialGather':
+                        const mgResult = await materialSource.getMaterialGatherBills(params.tender_id, params.material_order);
+                        for (const d in mgResult) {
+                            rst[d] = mgResult[d];
+                        }
+                        break;
+                    default:
+                        break;
+                }
+            }
             return rst;
         }
     }

+ 0 - 135
app/service/report_memory.js

@@ -14,7 +14,6 @@ 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');
 
@@ -1197,140 +1196,6 @@ module.exports = app => {
             }
         }
 
-        async getSelectMaterialAuditors(tid, material_order, fields) {
-            await this.ctx.service.material.checkMaterial(tid, material_order);
-            const auditors = await this.ctx.service.materialAudit.getFinalAuditGroup(this.ctx.material.id, this.ctx.material.curTimes);
-            const user = await this.ctx.service.projectAccount.getDataById(this.ctx.material.user_id);
-            const result = [{
-                aid: user.id,
-                name: user.name,
-                company: user.company,
-                role: user.role,
-                mobile: user.mobile,
-                telephone: user.telephone,
-                sign_path: user.sign_path,
-                opinion: user.opinion,
-                end_time: auditors && auditors.length > 0 ? auditors[0].begin_time : null,
-                sort: 0,
-            }, ...auditors];
-            return result;
-        }
-
-        async getMaterial(tender_id, material_order, fields) {
-            const result = await this.ctx.service.material.getValidMaterials(tender_id);
-            if (this._checkFieldsExist(fields, ['checked_time'])) {
-                for (const r of result) {
-                    const auditors = await this.ctx.service.materialAudit.getFinalAuditGroup(r.id, r.curTimes || r.times);
-                    r.checked_time = !r.curTimes ? auditors[auditors.length - 1].end_time : null;
-                }
-            }
-            return result;
-        }
-
-        _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, fields) {
-            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 mb.id, mb.tid, mb.mid, mb.order, mb.order, mb.t_type, mb.code, mb.name, mb.unit, mb.spec, mb.m_type,' +
-                        '    mbh.quantity, mbh.expr,' +
-                        '    mb.basic_price, mb.basic_times, ' +
-                        '    mbh.msg_tp, mbh.msg_times, mbh.msg_spread, mbh.m_up_risk, mbh.m_down_risk, mbh.m_spread, mbh.m_tp, mbh.pre_tp, mbh.m_tax_tp, mbh.tax_pre_tp, mbh.origin, ' +
-                        '    mb.remark, mb.is_summary, mbh.m_tax, mb.in_time' +
-                        '  FROM ' + this.ctx.service.materialBillsHistory.tableName + ' mbh ' +
-                        '  LEFT JOIN ' + this.ctx.service.materialBills.tableName + ' mb ON mbh.mb_id = mb.id ' +
-                        '  WHERE mbh.tid = ? And mbh.mid = ?';
-                    result = await this.ctx.app.mysql.query(sql, [tender_id, material.id]);
-                }
-                this._completeMaterialGl(result);
-                return result;
-            } else {
-                return [];
-            }
-        }
-
-        async getMaterialGlDetail(tender_id, material_order, fields) {
-            const material = await this.ctx.service.material.getDataByCondition({tid: tender_id, order: material_order});
-            return material ? await this.ctx.service.materialList.getMaterialData(tender_id, material.id) : [];
-        }
-
-        async getMaterialBills(tender_id, material_order, fields) {
-            const material = await this.ctx.service.material.getDataByCondition({tid: tender_id, order: material_order});
-            try {
-                const billsData = await this.ctx.service.ledger.getData(tender_id);
-                if (this._checkFieldsExist(fields, billsFields.stage)) {
-                    const curStage = await this.ctx.service.stageBills.getStagesData(tender_id, material.stage_id);
-                    this.ctx.helper.assignRelaData(billsData, [
-                        {data: curStage, fields: ['contract_qty', 'contract_tp', 'contract_expr', 'qc_qty', 'qc_tp', 'postil'], prefix: '', relaId: 'lid'}
-                    ]);
-                }
-
-                const billsTree = this._getNewBillsTree();
-                billsTree.loadDatas(billsData);
-                billsTree.calculateAll();
-
-                return billsTree.getDatas([
-                    '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',
-                    'sgfh_expr', 'sjcl_expr', 'qtcl_expr', 'contract_expr',
-                ]);
-            } catch(err) {
-                this.ctx.helper.log(err);
-                return [];
-            }
-        }
-
-        async getMaterialPos(tender_id, material_order, fields) {
-            const material = await this.ctx.service.material.getDataByCondition({tid: tender_id, order: material_order});
-            try {
-                const posData = await this.ctx.service.pos.getAllDataByCondition({ where: {tid: tender_id }});
-                if (this._checkFieldsExist(fields, posFields.stage)) {
-                    const curPosStage = await this.ctx.service.stagePos.getStagesData(tender_id, material.stage_id);
-                    this.ctx.helper.assignRelaData(posData, [
-                        {data: curPosStage, fields: ['contract_qty', 'qc_qty', 'contract_expr', 'postil'], prefix: '', relaId: 'pid'}
-                    ]);
-                }
-                this.pos.loadDatas(posData);
-                this.pos.calculateAll();
-
-                return this.pos.getDatas();
-            } catch (err) {
-                this.ctx.helper.log(err);
-                return [];
-            }
-        }
-
         async getSumStageBillsData(tid, sid, fields) {
             try {
                 await this.ctx.service.tender.checkTender(tid);

+ 1 - 1
app/service/rpt_stage_sum_memory.js

@@ -181,7 +181,7 @@ module.exports = app => {
                     ? await this.ctx.service.stageBills.getAuditorStageData2(this.ctx.tender.id, stage.id, stage.curTimes, stage.curOrder)
                     : await this.ctx.service.stageBills.getLastestStageData2(this.ctx.tender.id, stage.id);
                 this.ctx.helper.assignRelaData(billsData, [
-                    {data: curStage, fields: ['contract_qty', 'contract_tp', 'contract_expr', 'qc_qty', 'qc_tp'], prefix: prefix, relaId: 'lid', defaultData: defaultData}
+                    {data: curStage, fields: ['contract_qty', 'contract_tp', 'contract_expr', 'qc_qty', 'qc_tp'], prefix: prefix, relaId: 'lid', defaultData}
                 ]);
             }
 

+ 72 - 0
builder_report_index_define.js

@@ -1832,6 +1832,77 @@ const material_gl_detail = {
     ]
 };
 
+const materialGather = {
+    bills: {
+        name: '材差清单汇总 - 工程量清单',
+        remark: '',
+        key: 'mem_material_gather_bills',
+        id: 85,
+        prefix: '材差清单汇总-清单',
+        cols: [
+            { name: 'id', field: 'id', type: dataType.int },
+            { name: '清单编号', field: 'b_code', type: dataType.str },
+            { name: '名称', field: 'name', type: dataType.str },
+            { name: '单位', field: 'unit', type: dataType.str },
+            { name: '单价', field: 'unit_price', type: dataType.currency },
+            { name: '签约-数量', field: 'deal_qty', type: dataType.currency },
+            { name: '签约-金额', field: 'deal_tp', type: dataType.currency },
+            { name: '数量', field: 'quantity', type: dataType.currency },
+            { name: '金额', field: 'total_price', type: dataType.currency },
+            { name: '本期-合同-数量', field: 'contract_qty', type: dataType.currency },
+            { name: '本期-合同-金额', field: 'contract_tp', type: dataType.currency },
+            { name: '本期-变更-数量', field: 'qc_qty', type: dataType.currency },
+            { name: '本期-变更-金额', field: 'qc_tp', type: dataType.currency },
+            { name: '本期-完成-数量', field: 'gather_qty', type: dataType.currency },
+            { name: '本期-完成-金额', field: 'gather_tp', type: dataType.currency },
+            { name: '本期-价差', field: 'jiacha', type: dataType.currency },
+        ],
+    },
+    xmj: {
+        name: '材差清单汇总 - 相关项目节',
+        remark: '',
+        key: 'mem_material_gather_xmj',
+        id: 86,
+        prefix: '材差清单汇总-项目节',
+        cols: [
+            { name: 'id(项目节id)', field: 'id', type: dataType.int },
+            { name: '清单id(所属工程量清单id)', field: 'gcl_id', type: dataType.int },
+            { name: '明细id(在台账中的id)', field: 'mx_id', type: dataType.str },
+            { name: '编号', field: 'code', type: dataType.str },
+            { name: '计量单元', field: 'jldy', type: dataType.str },
+            { name: '分部工程', field: 'fbgc', type: dataType.str },
+            { name: '分项工程', field: 'fxgc', type: dataType.str },
+            { name: '单位工程', field: 'dwgc', type: dataType.str },
+            { name: '部位明细', field: 'bwmx', type: dataType.str },
+            { name: '图册号', field: 'drawing_code', type: dataType.str },
+            { name: '数量', field: 'quantity', type: dataType.currency },
+            { name: '本期-合同-数量', field: 'contract_qty', type: dataType.currency },
+            { name: '本期-变更-数量', field: 'qc_qty', type: dataType.currency },
+            { name: '本期-完成-数量', field: 'gather_qty', type: dataType.currency },
+            { name: '本期-价差', field: 'jiacha', type: dataType.currency },
+        ],
+    },
+    gl: {
+        name: '材差清单汇总 - 相关工料',
+        remark: '',
+        key: 'mem_material_gather_gl',
+        id: 87,
+        prefix: '材差清单汇总-工料',
+        cols: [
+            { name: 'id', field: 'id', type: dataType.int },
+            { name: '排序', field: 'order', type: dataType.int },
+            { name: '所属标段id', field: 'tid', type: dataType.int },
+            { name: '创建期id', field: 'mid', type: dataType.int },
+            { name: '所属工料id', field: 'mb_id', type: dataType.int },
+            { name: '清单id', field: 'gcl_id', type: dataType.int },
+            { name: '项目节id', field: 'xmj_id', type: dataType.int },
+            { name: '部位明细id', field: 'mx_id', type: dataType.int },
+            { name: '本期计量数量-小计', field: 'gather_qty', type: dataType.int },
+            { name: '数量', field: 'quantity', type: dataType.int },
+        ],
+    },
+};
+
 const stage_sum_bills = {
     name: '期汇总-清单-交叉数据表(mem_stage_sum_bills)',
     remark: '',
@@ -2737,6 +2808,7 @@ const defines = [
     custom_select,
     stage_change_info, stage_change_info_bills,
     budget.gu, budget.gai, budget.yu, budget.final,
+    materialGather.bills, materialGather.xmj, materialGather.gl,
 ];
 for (const d of defines) {
     exportTableDefine(d);