Explorar o código

季华项目,定制表相关

MaiXinRong %!s(int64=4) %!d(string=hai) anos
pai
achega
31bfae29a1

+ 23 - 0
app/extend/helper.js

@@ -1364,6 +1364,29 @@ module.exports = {
         return counts(array, val);
     },
 
+    filterTimesOrderData(data, keyFields, times, order) {
+        const dataIndex = {};
+        for (const d of data) {
+            if (d.times > times || (d.times = times || d.order > order)) continue;
+            let key = 'd';
+            for (const kf of keyFields) {
+                key = key + '.' + (d[kf] || '');
+            }
+
+            const di = dataIndex[key];
+            if (di) {
+                if ((di.times * timesLen + di.order) < (d.times * timesLen + d.order)) dataIndex[key] = d;
+            } else {
+                dataIndex[key] = d;
+            }
+        }
+        const result = [];
+        for (const prop in dataIndex) {
+            result.push(dataIndex[prop]);
+        }
+        return result;
+    },
+
     filterLastestData(data, keyFields) {
         const dataIndex = {};
         for (const d of data) {

+ 10 - 0
app/lib/ledger.js

@@ -27,6 +27,16 @@ class baseTree {
         // 树设置
         this.setting = setting;
     }
+    clear() {
+        // 无索引
+        this.datas = [];
+        // 以key为索引
+        this.items = {};
+        // 以排序为索引
+        this.nodes = [];
+        // 根节点
+        this.children = [];
+    }
 
     /**
      * 根据id获取树结构节点数据

+ 381 - 0
app/lib/rptCustomData.js

@@ -0,0 +1,381 @@
+'use strict';
+
+/**
+ * 定制报表 注意不做任何混用,也不做任何继承
+ *
+ * @author Mai
+ * @date
+ * @version
+ */
+const auditConst = require('../const/audit');
+
+/**
+ * 季华项目 定制报表
+ * 汇总表,流水汇总2个标段(N个),汇总到期,每期汇总3个人的数据(3个),工程量清单流水表,并根据截至本期变更令使用情况筛选
+ *
+ * 借用 通用汇总标段选的界面
+ * 故配置可与汇总标段选择相同
+ *
+ * define: {
+ *     "title": "请选择汇总的标段", "type": "month/final/checked-final/stage",
+ *    "defaultCompare": [1, 2, 3], // 结果按序 t_n_qty, t_n_tp
+ *    "match": { "quality": [2, 3], "qty": "<0" }, // class根据变更类型过滤,qty根据数量过滤
+ *    "selectCompare": [{ "key": "jl", "title": "驻地监理" }, ...] // 结果按key t_key_qty, t_key_tp
+ *    "merge": true,
+ * }
+ * defaultCompare为默认选择的审批人,0为原报,1-N为1-N审
+ * match为保留的类型
+ * 如需要用户选择审批人,则应配置selectCompare(目前不可用,不可配置,如需使用,则需要额外界面),为后期可能的变动预留
+ *
+ */
+class jhHelper {
+
+    constructor (ctx) {
+        this.ctx = ctx;
+        this.result = [];
+    }
+
+    async _getValidStages(tenderId) {
+        const stages = await this.ctx.service.stage.db.select(this.ctx.service.stage.tableName, {
+            where: { tid: tenderId },
+            orders: [['order', 'desc']],
+        });
+        if (stages.length !== 0) {
+            const lastStage = stages[0];
+            if (lastStage.status === auditConst.stage.status.uncheck && lastStage.user_id !== this.ctx.session.sessionUser.accountId) {
+                stages.splice(0, 1);
+            }
+        }
+        return stages;
+    }
+
+    async _getCheckedStages(tenderId) {
+        const stages = await this.db.select(this.ctx.service.stage.tableName, {
+            where: { tid: tenderId },
+            orders: [['order', 'desc']],
+        });
+        if (stages.length !== 0) {
+            const lastStage = stages[0];
+            if (lastStage.status !== auditConst.stage.status.checked) {
+                stages.splice(0, 1);
+            }
+        }
+        return stages;
+    }
+
+    /**
+     * 查询本期所有变更明细
+     * @param tid
+     * @param sid
+     * @returns {Promise<void>}
+    */
+    async getCurChangeDetailData(tid, sid) {
+        const sql = 'SELECT sc.*, c.type As c_type, c.class As c_class, c.quality As c_quality FROM ' + this.ctx.service.stageChange.tableName + ' sc' +
+                    '  Left Join ' + this.ctx.service.change.tableName + ' c ON sc.cid = c.cid' +
+                    '  WHERE sc.tid = ? and sc.sid = ?';
+        return await this.ctx.service.stageChange.db.query(sql, [tid, sid]);
+    }
+
+    async getPreChangeDetailData(tid, sOrder) {
+        const sql = 'SELECT sc.*, c.type As c_type, c.class As c_class, c.quality As c_quality FROM ' + this.ctx.service.stageChangeFinal.tableName + ' sc' +
+                    '  Left Join ' + this.ctx.service.change.tableName + ' c ON sc.cid = c.cid' +
+                    '  Left Join ' + this.ctx.service.stage.tableName + ' s ON sc.sid = s.id' +
+                    '  WHERE sc.tid = ? and s.order < ?';
+        return await this.ctx.service.stageChangeFinal.db.query(sql, [tid, sOrder]);
+    }
+
+    getLastestAuditors(auditors) {
+        const index = {};
+        for (const auditor of auditors) {
+            if (!index[auditor.aid] || auditor.order > index[auditor.aid].order) index[auditor.aid] = auditor;
+        }
+        const result = [];
+        for (const i in index) {
+            result.push(index[i]);
+        }
+        result.sort((x, y) => { return x.order - y.order; });
+        return result;
+    }
+
+    _loadChangeDetail(billsIndex, changeDetail, gsDefine, prefix) {
+        for (const cd of changeDetail) {
+            if (!cd.qty) continue;
+
+            let match = false;
+            for (const m of gsDefine.match) {
+                if (m.quality === cd.c_quality && ((m.minus && cd.qty < 0) || (!m.minus && cd.qty > 0))) match = true;
+            }
+            if (!match) continue;
+
+            const bills = billsIndex[cd.lid];
+            if (!bills) continue;
+
+            if (!bills[prefix + 'cd']) bills[prefix + 'cd'] = [];
+            bills[prefix + 'cd'].push(cd);
+            if (cd.pid) {
+                const pos = bills.pos.find(x => {return x.id === cd.pid});
+                if (pos) {
+                    if (!pos[prefix + 'cd']) pos[prefix + 'cd'] = [];
+                    pos[prefix + 'cd'].push(cd);
+                }
+            }
+        }
+    }
+
+    _loadMergeResult(bills, prefixes) {
+        const rst = {
+            id: bills.id,
+            tid: bills.tender_id,
+            b_code: bills.b_code,
+            name: bills.name,
+            unit: bills.unit,
+            unit_price: bills.unit_price
+        };
+        if (bills.pos && bills.pos.length > 0) {
+            for (const p of bills.pos) {
+                let gather = false;
+                if (p.pre_cd && p.pre_cd.length > 0) gather = true;
+                for (const prefix of prefixes) {
+                    if (p[prefix + '_cd'] && p[prefix + '_cd'].length > 0) gather = true;
+                }
+                if (gather) {
+                    rst.qc_qty = this.ctx.helper.add(rst.qc_qty, p.qc_qty);
+                    rst.qc_tp = this.ctx.helper.add(rst.qc_qty, p.qc_tp);
+                    rst.pre_qc_qty = this.ctx.helper.add(rst.pre_qc_qty, p.pre_qc_qty);
+                    rst.pre_qc_tp = this.ctx.helper.add(rst.pre_qc_tp, p.pre_qc_tp);
+                    rst.end_qc_qty = this.ctx.helper.add(rst.end_qc_qty, p.end_qc_qty);
+                    rst.end_qc_tp = this.ctx.helper.add(rst.end_qc_tp, p.end_qc_tp);
+                    for (const prefix of prefixes) {
+                        rst[prefix + 'qc_qty'] = this.ctx.helper.add(rst[prefix + 'qc_qty'], p[prefix + 'qc_qty']);
+                    }
+                }
+            }
+            for (const prefix of prefixes) {
+                rst[prefix + 'qc_tp'] = this.ctx.helper.mul(rst.unit_price, rst[prefix + 'qc_qty'], 2);
+            }
+        } else {
+            rst.qc_qty = bills.qc_qty;
+            rst.qc_tp = bills.qc_tp;
+            rst.pre_qc_qty = bills.pre_qc_qty;
+            rst.pre_qc_tp = bills.pre_qc_tp;
+            rst.end_qc_qty = bills.end_qc_qty;
+            rst.end_qc_tp = bills.end_qc_tp;
+            for (const prefix of prefixes) {
+                rst[prefix + 'qc_qty'] = bills[prefix + 'qc_qty'];
+                rst[prefix + 'qc_tp'] = bills[prefix + 'qc_tp'];
+            }
+        }
+        this.result.push(rst);
+    }
+
+    _loadResult(bills, prefixes) {
+        if (bills.pos) {
+            for (const p of bills.pos) {
+                let load = false;
+                if (p.pre_cd && p.pre_cd.length > 0) load = true;
+                for (const prefix of prefixes) {
+                    if (p[prefix + '_cd'] && p[prefix + '_cd'].length > 0) load = true;
+                }
+                if (!load) continue;
+
+                const rst = {
+                    b_code: bills.b_code,
+                    name: bills.name,
+                    unit: bills.unit,
+                    unit_price: bills.unit_price, 
+                };
+                rst.qc_qty = p.qc_qty;
+                rst.qc_tp = p.qc_tp;
+                rst.pre_qc_qty = p.pre_qc_qty;
+                rst.pre_qc_tp = p.pre_qc_tp;
+                rst.end_qc_qty = p.end_qc_qty;
+                rst.end_qc_tp = p.end_qc_tp;
+                for (const prefix of prefixes) {
+                    rst[prefix + 'qc_qty'] = p[prefix + 'qc_qty'];
+                    rst[prefix + 'qc_tp'] = p[prefix + 'qc_tp'];
+                }
+                this.result.push(rst);
+            }
+        } else {
+            const rst = {
+                b_code: bills.b_code,
+                name: bills.name,
+                unit: bills.unit,
+                unit_price: bills.unit_price, 
+            };
+            rst.qc_qty = bills.qc_qty;
+            rst.qc_tp = bills.qc_tp;
+            rst.pre_qc_qty = bills.pre_qc_qty;
+            rst.pre_qc_tp = bills.pre_qc_tp;
+            rst.end_qc_qty = bills.end_qc_qty;
+            rst.end_qc_tp = bills.end_qc_tp;
+            for (const prefix of prefixes) {
+                rst[prefix + 'qc_qty'] = bills[prefix + 'qc_qty'];
+                rst[prefix + 'qc_tp'] = bills[prefix + 'qc_tp'];
+            }
+            this.result.push(rst);
+        }
+    }
+
+    _generateResult(billsData, gsDefine) {
+        for (const bills of billsData) {
+            let load = false;
+            if (bills.pre_cd && bills.pre_cd.length > 0) load = true;
+            for (const dc of gsDefine.defaultCompare) {
+                if (bills['t_' + dc + '_cd'] && bills['t_' + dc + '_cd'].length > 0) load = true;
+            }
+            if (!load) continue;
+            gsDefine.merge ? this._loadMergeResult(bills, this.prefixes) : this._loadResult(bills, this.prefixes);
+        }
+    }
+
+    async _loadStageBillsData(tender, stage, gsDefine, auditors) {
+        const helper = this.ctx.helper;
+        // 加载截止上期/本期
+        let billsData = await this.ctx.service.ledger.getData(tender.id);
+        billsData = billsData.filter(x => { return x.b_code && x.is_leaf });
+        const curStage = await this.ctx.service.stageBills.getLastestStageData(tender.id, stage.id);
+        const preStage = stage.order > 1 ? await this.ctx.service.stageBillsFinal.getFinalData(tender, stage.order - 1) : [];
+        const loadData = [
+            { data: curStage, fields: ['qc_qty', 'qc_tp'], prefix: '', relaId: 'lid' },
+            { data: preStage, fields: ['qc_qty', 'qc_tp'], prefix: 'pre_', relaId: 'lid' }
+        ];
+        for (const dc of gsDefine.defaultCompare) {
+            const auditor = auditors[dc];
+            const auditorStage = await this.ctx.service.stagePos.getAuditorStageData2(tender.id, stage.id, auditor.times, auditor.order);
+            loadData.push({ data: auditorStage, fields: ['qc_qty', 'qc_tp'], prefix: `t_${dc}_`, relaId: 'pid' });
+        }
+        helper.assignRelaData(billsData, loadData);
+        // 计算截止本期
+        billsData.forEach(x => {
+            x.end_qc_qty = helper.add(x.qc_qty, x.pre_qc_qty);
+            x.end_qc_tp = helper.add(x.qc_tp, x.pre_qc_tp);
+        });
+        return billsData;
+    }
+
+    async _loadStagePosData(tender, stage, gsDefine, auditors) {
+        const helper = this.ctx.helper;
+        const posData = await this.ctx.service.pos.getPosData({tid: tender.id});
+        const curStage = await this.ctx.service.stagePos.getLastestStageData2(tender.id, stage.id);
+        const preStage = stage.order > 1 ? await this.ctx.service.stagePosFinal.getFinalData(tender, stage.order - 1) : [];
+        const loadData = [
+            { data: curStage, fields: ['qc_qty'], prefix: '', relaId: 'pid' },
+            { data: preStage, fields: ['qc_qty'], prefix: 'pre_', relaId: 'pid' }
+        ];
+        for (const dc of gsDefine.defaultCompare) {
+            const auditor = auditors[dc];
+            const auditorStage = await this.ctx.service.stagePos.getAuditorStageData2(tender.id, stage.id, auditor.times, auditor.order);
+            loadData.push({ data: auditorStage, fields: ['qc_qty'], prefix: `t_${dc}_`, relaId: 'pid' });
+        }
+        helper.assignRelaData(posData, loadData);
+        posData.forEach(x => {
+            x.end_qc_qty = helper.add(x.qc_qty, x.pre_qc_qty);
+        });
+        return posData;
+    }
+
+    async _gatherStageData(tender, stage, gsDefine) {
+        if (!stage) return;
+        const helper = this.ctx.helper;
+
+        await this.ctx.service.stage.doCheckStage(stage);
+        const auditors = this.getLastestAuditors(stage.auditors);
+        const billsData = await this._loadStageBillsData(tender, stage, gsDefine, auditors);
+        const posData = await this._loadStagePosData(tender, stage, gsDefine, auditors);
+        // 创建索引
+        const billsIndex = {};
+        for (const b of billsData) {
+            billsIndex[b.id] = b;
+            b.pos = posData.filter(x => { return x.lid === b.id; });
+            b.pos.forEach(x => {
+                x.qc_tp = helper.mul(b.unit_price, x.qc_qty, 2);
+                x.pre_qc_tp = helper.mul(b.unit_price, x.pre_qc_qty, 2);
+                x.end_qc_tp = helper.add(x.qc_tp, x.pre_qc_tp);
+            })
+        }
+
+        // 查询比较人数据
+        this.prefixes = [];
+        const stageChangeDetail = await this.getCurChangeDetailData(tender.id, stage.id);
+        for (const dc of gsDefine.defaultCompare) {
+            const scd = helper.filterTimesOrderData(stageChangeDetail, ['lid', 'pid', 'cid', 'cbid'], auditors[dc].times, auditors[dc].order);
+            this._loadChangeDetail(billsIndex, scd, gsDefine, `t_${dc}_`);
+            this.prefixes.push(`t_${dc}_`);
+        }
+        const finalChangeData = await this.getPreChangeDetailData(tender.id, stage.order);
+        this._loadChangeDetail(billsIndex, finalChangeData, gsDefine, 'pre_');
+        this._generateResult(billsData, gsDefine);
+    }
+
+    async _gatherMonthData(tender, month, defaultCompare) {
+        const stages = await this._getValidStages(tender.id);
+        const stage = this.ctx.helper._.find(stages, {s_time: month});
+        await this._gatherStageData(tender, stage, defaultCompare);
+    }
+
+    async _gatherFinalData(tender, defaultCompare) {
+        const stages = await this._getValidStages(tender.id);
+        await this._gatherStageData(tender, stages[0], defaultCompare);
+    }
+
+    async _gatherCheckedFinalData(tender, defaultCompare) {
+        const stages = await this._getCheckedStages(tender.id);
+        await this._gatherStageData(tender, stages[0], defaultCompare);
+    }
+
+    async _gatherIndexData(tender, index, defaultCompare) {
+        const stages = await this._getValidStages(tender.id);
+        const stage = this.ctx.helper._.find(stages, {order: index});
+        await this._gatherStageData(tender, stage, defaultCompare);
+    }
+
+    /**
+     *
+     * @param {Array} memFieldKeys 报表添加的指标字段
+     * @param {object} gsDefine
+     * @param {object} gsCustom
+     * @returns {Promise<Array>}
+     */
+    async gather(memFieldKeys, gsDefine, gsCustom) {
+        if (!gsDefine || !gsDefine.enable) return [];
+        if (!gsCustom || !gsCustom.tenders || gsCustom.tenders.length === 0) return [];
+
+        const gsSetting = JSON.parse(gsDefine.setting);
+        if (!gsSetting.defaultCompare || !gsSetting.match) return[];
+        for (const t of gsCustom.tenders) {
+            const tender = await this.ctx.service.tender.getCheckTender(t.tid);
+
+            switch (gsSetting.type) {
+                case 'month':
+                    await this._gatherMonthData(tender, gsCustom.month, gsSetting);
+                    break;
+                case 'final':
+                    await this._gatherFinalData(tender, gsSetting);
+                    break;
+                case 'checked-final':
+                    await this._gatherCheckedFinalData(tender, gsSetting);
+                    break;
+                case 'stage':
+                    await this._gatherIndexData(tender, gsCustom.stage, gsSetting);
+                    break;
+                default: throw '未知汇总类型';
+            }
+        }
+        const helper = this.ctx.helper;
+        // 排序
+        this.result.sort((x, y) => { return helper.compareCode(x.b_code, y.b_code); });
+        return this.result;
+    }
+
+    async convert(tid, sid, memFieldKeys, setting) {
+        if (!setting || !setting.defaultCompare) return [];
+        const tender = await this.ctx.service.tender.getCheckTender(tid);
+        const stage = await this.ctx.service.stage.getDataById(sid);
+        await this._gatherStageData(tender, stage, { defaultCompare: setting.defaultCompare });
+    }
+}
+
+module.exports = {
+    jhHelper,
+};

+ 3 - 0
app/public/js/stage.js

@@ -181,6 +181,9 @@ function getHintMsg () {
 
 
 $(document).ready(() => {
+    ledgerSpreadSetting.cols.unshift(
+        {title: 'id', colSpan: '1', rowSpan: '2', field: 'id', hAlign: 2, width: 60, type: 'Number', readOnly: true},
+    );
     const exportExcelSetting = {
         cols: [
             {title: '项目节编号', colSpan: '1', rowSpan: '2', field: 'code', hAlign: 0, width: 145, formatter: '@', cellType: 'tree'},

+ 2 - 0
app/public/report/js/rpt_custom.js

@@ -143,6 +143,8 @@ const rptCustomObj = (function () {
             }
             for (const t of tenders) {
                 const tender = gsObj.tenderSourceTree.nodes.find(function (x) { return x.tid === t.tid});
+                if (!tender) continue;
+
                 tender.selected = true;
                 select.push(tender);
                 const st = this._addTender(tender);

+ 14 - 0
app/service/report.js

@@ -188,6 +188,10 @@ module.exports = app => {
                             runnableRst.push(service.reportMemory.getSignSelect(params.tender_id, params.stage_id, customSelect));
                             runnableKey.push(filter);
                             break;
+                        case 'mem_stage_change':
+                            runnableRst.push(service.stageChange.getAllDataByCondition({ where: { tid: params.tender_id, sid: params.stage_id } }));
+                            runnableKey.push(filter);
+                            break;
                         case 'mem_stage_change_bills':
                             runnableRst.push(service.stageChangeFinal.getFinalData(params.tender_id));
                             runnableKey.push(filter);
@@ -230,6 +234,16 @@ module.exports = app => {
                     case 'mem_change_bills':
                         rst[filter] = await service.reportMemory.getChangeBillsData(params.tender_id, params.stage_id, memFieldKeys[filter]);
                         break;
+                    case 'mem_jh_im_change':
+                        const rptCustomData = require('../lib/rptCustomData');
+                        const jhHelper = new rptCustomData.jhHelper(this.ctx);
+                        rst[filter] = await jhHelper.convert(params.tender_id, params.stage_id, memFieldKeys[filter], customDefine.setting);
+                        break;
+                    case 'mem_jh_gather_im_change':
+                        const rptCustomData = require('../lib/rptCustomData');
+                        const jhHelper = new rptCustomData.jhHelper(this.ctx);
+                        rst[filter] = await jhHelper.gather(memFieldKeys[filter], customDefine.gather_select, customSelect ? customSelect.gather_select : null);
+                        break;
                     // case 'mem_material_bills':
                     //     rst[filter] = await service.rptGatherMemory.getMaterialBills(params.tender_id, params.material_order, memFieldKeys[filter]);
                     //     break;

+ 1 - 0
app/service/rpt_gather_memory.js

@@ -482,6 +482,7 @@ module.exports = app => {
             if (!gsDefine || !gsDefine.enable) return [];
             if (!gsCustom || !gsCustom.tenders || gsCustom.tenders.length === 0) return [];
 
+            this.resultTree.clear();
             const gsSetting = JSON.parse(gsDefine.setting);
             let commonIndex = 0;
             const completeDatas = [];

+ 8 - 4
app/service/stage_change_final.js

@@ -31,12 +31,16 @@ module.exports = app => {
          * @return {Promise<void>}
          */
         async getFinalData(tid) {
-            const sql = 'Select cf.*, c.code As c_code, c.name As c_name, c.new_code As c_new_code, c.new_name As c_new_name, c.content As c_content, c.basis As c_basis, c.cin_time As c_cin_time' +
-                '  FROM ' + this.tableName + ' cf Left Join ' + this.ctx.service.change.tableName + ' c' +
-                '  ON cf.cid = c.cid' +
+            const sql = 'Select cf.*,' +
+                '    c.code As c_code, c.name As c_name, c.new_code As c_new_code, c.new_name As c_new_name,' +
+                '    c.content As c_content, c.basis As c_basis, c.cin_time As c_cin_time,' +
+                '    c.class As c_class, c.type As c_type, c.quality As c_quality,' +
+                '    s.order As s_order' +
+                '  FROM ' + this.tableName + ' cf' +
+                '  Left Join ' + this.ctx.service.change.tableName + ' c ON cf.cid = c.cid' +
+                '  Left Join ' + this.ctx.service.stage.tableName + ' c ON cf.sid = s.id' +
                 '  Where cf.tid = ?';
             return await this.db.query(sql, [tid]);
-            //return await this.getAllDataByCondition({ where: { tid: tid } });
         }
 
         /**

+ 2 - 1
app/service/stage_detail.js

@@ -34,11 +34,12 @@ module.exports = app => {
             const sql = 'SELECT * FROM ' + this.tableName + ' As Bills ' +
                 '  INNER JOIN ( ' +
                 '    SELECT MAX(`times` * ' + timesLen + ' + `order`) As `flow`, `lid`, `uuid` From ' + this.tableName +
+                '        WHERE tid = ? AND sid = ?' +
                 '      GROUP BY `lid`, `uuid`' +
                 '  ) As MaxFilter ' +
                 '  ON (Bills.times * ' + timesLen + ' + Bills.order) = MaxFilter.flow And Bills.lid = MaxFilter.lid And Bills.uuid = MaxFilter.uuid' +
                 '  WHERE Bills.tid = ? And Bills.sid = ?' + lidSql;
-            const sqlParam = [tid, sid];
+            const sqlParam = [tid, sid, tid, sid];
             if (!lid) {
                 return await this.db.query(sql, sqlParam);
             } else if (lid instanceof Array) {

+ 2 - 13
app/service/stage_pos_final.js

@@ -32,19 +32,8 @@ module.exports = app => {
          * @returns {Promise<void>}
          */
         async getFinalData(tender, stageOrder) {
-            // const sql = 'SELECT Pos.* FROM ' +
-            //     //'  (SELECT pid, contract_qty, qc_qty, sorder FROM ' + this.tableName + ' WHERE tid = ?) As Pos' +
-            //     this.tableName + ' As Pos' +
-            //     '  INNER JOIN ( ' +
-            //     '    SELECT MAX(`sorder`) As `sorder`, `pid` From ' + this.tableName +
-            //     '      WHERE tid = ? AND sorder < ?' +
-            //     '      GROUP BY `pid`' +
-            //     '  ) As MaxFilter ' +
-            //     '  ON Pos.sorder = MaxFilter.sorder And Pos.pid = MaxFilter.pid';
-            // //const sqlParam = [tender.id, tender.id, stage.order];
-            // const sqlParam = [tender.id, stage.order];
-            return await this.getAllDataByCondition({
-                //columns: ['pid', 'contract_qty', 'qc_qty'],
+            return await this.db.select(this.departTableName(tender.id), {
+                //columns: ['lid', 'contract_qty', 'qc_qty', 'contract_tp', 'qc_tp'],
                 where: {tid: tender.id, sorder: stageOrder},
             });
         }

+ 98 - 1
builder_report_index_define.js

@@ -1419,6 +1419,10 @@ const stage_change_bills = {
         { name: '变更清单-名称', field: 'name', type: dataType.str },
         { name: '变更清单-单位', field: 'unit', type: dataType.str },
         { name: '变更清单-单价', field: 'unit_price', type: dataType.str },
+        { name: '变更令-变更类型', field: 'c_type', type: dataType.str },
+        { name: '变更令-变更类别', field: 'c_class', type: dataType.int },
+        { name: '变更令-变更性质', field: 'c_quality', type: dataType.int },
+        { name: '调用期-序号', field: 's_order', type: dataType.int },
     ],
 };
 
@@ -1582,6 +1586,98 @@ const all_tag = {
         { name: '最后编辑时间', field: 'modify_time', type: dataType.time },
     ],
 };
+const stage_change = {
+    name: '本期-变更清单-全审批人 调用明细(mem_stage_change)',
+    remark: '',
+    key: 'mem_stage_change',
+    id: 60,
+    prefix: '本期-变更清单-全审批人 调用明细',
+    cols: [
+        { name: 'id', field: 'id', type: dataType.str },
+        { name: '标段id', field: 'tid', type: dataType.str },
+        { name: '期id', field: 'sid', type: dataType.str },
+        { name: '台账id', field: 'lid', type: dataType.str },
+        { name: '计量单元id', field: 'pid', type: dataType.str },
+        { name: '变更令id', field: 'cid', type: dataType.str },
+        { name: '变更清单id', field: 'cbid', type: dataType.int },
+        { name: '期-调用人-第几轮', field: 'stimes', type: dataType.str },
+        { name: '期-调用人-排序', field: 'sorder', type: dataType.str },
+        { name: '变更数量', field: 'qty', type: dataType.int },
+    ],
+};
+
+// 定制表
+// 季华项目 中间计量报表--变更相关 汇总对比表
+const jh_im_change = {
+    name: '【定制】季华-中间计量-变更 数据表(mem_jh_im_change)',
+    remark: '',
+    id: 61,
+    key: 'mem_jh_im_change',
+    prefix: '【定制】季华-中间计量-变更',
+    cols: [
+        { 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: 'pre_qc_qty', type: dataType.currency },
+        { name: '截止上期-数量变更-金额', field: 'pre_qc_tp', type: dataType.currency },
+        { name: '本期-数量变更-数量', field: 'qc_qty', type: dataType.currency },
+        { name: '本期-数量变更-金额', field: 'qc_tp', type: dataType.currency },
+        { name: '截止本期-数量变更-数量', field: 'end_qc_qty', type: dataType.currency },
+        { name: '截止本期-数量变更-金额', field: 'end_qc_tp', type: dataType.currency },
+
+        { name: '本期-数量变更-数量_0', field: 'r0_qc_qty', type: dataType.currency },
+        { name: '本期-数量变更-金额_0', field: 'r0_qc_tp', type: dataType.currency },
+
+        { name: '本期-数量变更-数量_1', field: 'r1_qc_qty', type: dataType.currency },
+        { name: '本期-数量变更-金额_1', field: 'r1_qc_tp', type: dataType.currency },
+
+        { name: '本期-数量变更-数量_2', field: 'r2_qc_qty', type: dataType.currency },
+        { name: '本期-数量变更-金额_2', field: 'r2_qc_tp', type: dataType.currency },
+
+        { name: '本期-数量变更-数量_3', field: 'r3_qc_qty', type: dataType.currency },
+        { name: '本期-数量变更-金额_3', field: 'r3_qc_tp', type: dataType.currency },
+
+        { name: '本期-数量变更-数量_4', field: 'r4_qc_qty', type: dataType.currency },
+        { name: '本期-数量变更-金额_4', field: 'r4_qc_tp', type: dataType.currency },
+    ],
+};
+const jh_gather_im_change = {
+    name: '【定制】季华-中间计量-变更-汇总 数据表(mem_jh_gather_im_change)',
+    remark: '',
+    id: 62,
+    key: 'mem_jh_gather_im_change',
+    prefix: '【定制】季华-中间计量-变更-汇总',
+    cols: [
+        { 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: 'pre_qc_qty', type: dataType.currency },
+        { name: '截止上期-数量变更-金额', field: 'pre_qc_tp', type: dataType.currency },
+        { name: '本期-数量变更-数量', field: 'qc_qty', type: dataType.currency },
+        { name: '本期-数量变更-金额', field: 'qc_tp', type: dataType.currency },
+        { name: '截止本期-数量变更-数量', field: 'end_qc_qty', type: dataType.currency },
+        { name: '截止本期-数量变更-金额', field: 'end_qc_tp', type: dataType.currency },
+
+        { name: '本期-数量变更-数量_0', field: 'r0_qc_qty', type: dataType.currency },
+        { name: '本期-数量变更-金额_0', field: 'r0_qc_tp', type: dataType.currency },
+
+        { name: '本期-数量变更-数量_1', field: 'r1_qc_qty', type: dataType.currency },
+        { name: '本期-数量变更-金额_1', field: 'r1_qc_tp', type: dataType.currency },
+
+        { name: '本期-数量变更-数量_2', field: 'r2_qc_qty', type: dataType.currency },
+        { name: '本期-数量变更-金额_2', field: 'r2_qc_tp', type: dataType.currency },
+
+        { name: '本期-数量变更-数量_3', field: 'r3_qc_qty', type: dataType.currency },
+        { name: '本期-数量变更-金额_3', field: 'r3_qc_tp', type: dataType.currency },
+
+        { name: '本期-数量变更-数量_4', field: 'r4_qc_qty', type: dataType.currency },
+        { name: '本期-数量变更-金额_4', field: 'r4_qc_tp', type: dataType.currency },
+    ],
+};
 
 const recursiveMkdirSync = async function(pathName) {
     if (!fs.existsSync(pathName)) {
@@ -1687,9 +1783,10 @@ const defines = [
     gather_stage_bills, gather_tender_info, gather_stage_pay, gather_deal_bills,
     material, materialGl, material_bills, material_pos, material_gl_detail,
     stage_sum_bills, stage_sum_pay, stage_audit, sign_select,
-    stage_change_bills, stage_change_ledger,
+    stage_change, stage_change_bills, stage_change_ledger,
     gcl_gather_bills, gcl_gather_xmj,
     ledger_tag, stage_tag, all_tag,
+    jh_im_change, jh_gather_im_change,
 ];
 for (const d of defines) {
     exportTableDefine(d);