Jelajahi Sumber

Merge branch 'master' of http://192.168.1.41:3000/maixinrong/Calculation

TonyKang 5 tahun lalu
induk
melakukan
3f6634ac4b

+ 3 - 2
app/lib/rpt_data_analysis.js

@@ -108,11 +108,12 @@ const gatherGcl = {
             if (fields.indexOf(nf) === -1) return;
         }
         const gatherOther = fields.indexOf('chapter') >= 0;
-
-        ctx.helper._.pull(data.mem_stage_bills, 'is_leaf');
         const gclBills = [], other = {name: '未计入清单章节项', chapter: '10000'};
 
         for (const b of data.mem_stage_bills) {
+            const child = ctx.helper._.find(data.mem_stage_bills, {ledger_pid: b.ledger_id});
+            if (child) continue;
+
             if (b.b_code && b.b_code !== '') {
                 let gcl = gclBills.find(function (g) {
                     return g.b_code === b.b_code && g.name === b.name && g.unit === b.unit

+ 2 - 2
app/public/js/ledger.js

@@ -1223,7 +1223,7 @@ $(document).ready(function() {
                         return !(parent && ledgerTree.isLeafXmj(parent));
                     }
                 } else {
-                    return false;
+                    return true;
                 }
             },
             callback: function (key, opt) {
@@ -1286,7 +1286,7 @@ $(document).ready(function() {
             icon: 'fa-file-excel-o',
             disabled: function (key, opt) {
                 const node = SpreadJsObj.getSelectObject(ledgerSpread.getActiveSheet());
-                return readOnly
+                return readOnly || !node
                     || (node.children && node.children.length > 0)
                     || (!_.isNil(node.b_code) && node.b_code !== '');
             },

+ 6 - 5
app/public/report/js/rpt_custom.js

@@ -114,7 +114,7 @@ const rptCustomObj = (function () {
             SpreadJsObj.reLoadRowsData(info.sheet, refreshRows);
         },
         initSelectTenders: function (tenders) {
-            if (!tenders || tenders.length === 0) return;
+            if (!tenders) return;
 
             const specCol = gsObj.setting.special ? gsObj.setting.special : [];
             const select = [];
@@ -130,10 +130,10 @@ const rptCustomObj = (function () {
                     st[sc.key] = t[sc.key];
                 }
             }
-            SpreadJsObj.reLoadNodesData(gsObj.gsSheet, select);
-            if (select.length > 0) SpreadJsObj.locateTreeNode(gsObj.gsSheet, select.tmt_id);
+            SpreadJsObj.reLoadColsData(gsObj.gsSheet, [0]);
+            if (select.length > 0) SpreadJsObj.locateTreeNode(gsObj.gsSheet, select[0].tmt_id);
             this.reloadResultData();
-        }
+        },
     };
 
     const getStageFlowSelectHtml = function (select, id) {
@@ -208,6 +208,7 @@ const rptCustomObj = (function () {
     };
 
     const initGatherSelect = function (gsSetting, gsSelect) {
+        gsObj.grArray = [];
         gsObj.setting = JSON.parse(gsSetting);
         gsObj.orgSelect = gsSelect;
         $('#gather-select-count').html(gsSelect ? gsSelect.tenders.length : 0);
@@ -232,8 +233,8 @@ const rptCustomObj = (function () {
             } else if (gsSelect.month) {
                 $('#gather-month').val(gsSelect.month ? gsSelect.month: '');
             }
-            gatherSelectSpreadObj.initSelectTenders(gsSelect.tenders);
         }
+        gatherSelectSpreadObj.initSelectTenders(gsSelect ? gsSelect.tenders : []);
         // 初始化
         $("#gather-select").modal('show');
     };

+ 8 - 0
app/service/deal_bills.js

@@ -20,6 +20,14 @@ module.exports = app => {
             this.tableName = 'deal_bills';
         }
 
+        async getSum(tenderId) {
+            const sql = 'SELECT Sum(`total_price`) As `total_price` ' +
+                '  From ' + this.tableName +
+                '  WHERE `tender_id` = ? ';
+            const sqlParam = [tenderId];
+            return await this.db.queryOne(sql, sqlParam);
+        }
+
         /**
          * 导入Excel数据(node-xlsx)
          *

+ 5 - 0
app/service/report.js

@@ -135,6 +135,11 @@ module.exports = app => {
                                 customDefine.gather_select, customSelect ? customSelect.gather_select : null));
                             runnableKey.push(filter);
                             break;
+                        case 'mem_gather_deal_bills':
+                            runnableRst.push(service.rptGatherMemory.getGatherDealBills(memFieldKeys[filter],
+                                customDefine.gather_select, customSelect ? customSelect.gather_select : null));
+                            runnableKey.push(filter);
+                            break;
                         default:
                             break;
                     }

+ 74 - 0
app/service/rpt_gather_memory.js

@@ -131,6 +131,7 @@ module.exports = app => {
             });
             this.resultTenderInfo = [];
             this.resultDealpPay = [];
+            this.resultDealBills = [];
         }
 
         _checkSpecialTender(tender, special) {
@@ -407,6 +408,8 @@ module.exports = app => {
                 deal_tp: tender.deal_tp,
                 tp: tender.total_price
             };
+            const deal_bills_sum = await this.ctx.service.dealBills.getSum(tender.id);
+            info.deal_bills_tp = deal_bills_sum ? deal_bills_sum.total_price : 0;
             if (tender.ledger_status === auditConst.ledger.status.uncheck || tender.ledger_status === auditConst.ledger.status.checkNo) {
                 const sum = await this.ctx.service.ledger.addUp({tender_id: tender.id/*, is_leaf: true*/});
                 info.tp = sum.total_price;
@@ -716,6 +719,77 @@ module.exports = app => {
             }
             return this.resultDealpPay;
         }
+
+        /**
+         * 签约清单
+         */
+        async _gatherDealBills(tender, fun) {
+            const dealBills = await this.ctx.service.dealBills.getAllDataByCondition({
+                where: { tender_id: tender.id }
+            });
+            for (const db of dealBills) {
+                let rdb = this.ctx.helper._.find(this.resultDealBills, {
+                    code: db.code,
+                    name: db.name,
+                    unit: db.unit,
+                    unit_price: db.unit_price ? db.unit_price: 0,
+                });
+                if (!rdb) {
+                    rdb = {
+                        code: db.code,
+                        name: db.name,
+                        unit: db.unit,
+                        unit_price: db.unit_price ? db.unit_price: 0,
+                    };
+                    this.resultDealBills.push(rdb);
+                }
+                if (fun) fun(rdb, db);
+            }
+        }
+
+        async _gatherCommonDealBills(sTender, index) {
+            const tender = await this.ctx.service.tender.getCheckTender(sTender.tid);
+            await this._gatherDealBills(tender, function (gatherData, sourceData) {
+                const prefix = 't_' + index + '_';
+                gatherData[prefix + 'id'] = tender.id;
+                gatherData[prefix + 'name'] = tender.name;
+
+                gatherData[prefix + 'qty'] = sourceData.quantity;
+                gatherData[prefix + 'tp'] = sourceData.total_price;
+
+                gatherData['s_' + 'qty'] = sourceData.quantity;
+                gatherData['s_' + 'tp'] = sourceData.total_price;
+            });
+        }
+
+        async _gatherSpecialDealBills(sTender, sKey) {
+            const tender = await this.ctx.service.tender.getCheckTender(sTender.tid);
+            await this._gatherDealBills(tender, function (gatherData, sourceData) {
+                const prefix = 'st_' + sKey + '_';
+
+                gatherData[prefix + 'qty'] = sourceData.quantity;
+                gatherData[prefix + 'tp'] = sourceData.total_price;
+            });
+        }
+
+        async getGatherDealBills(memFieldKeys, gsDefine, gsCustom) {
+            if (!gsDefine || !gsDefine.enable) return [];
+            if (!gsCustom || !gsCustom.tenders || gsCustom.tenders.length === 0) return [];
+
+            this.resultTenderInfo = [];
+            const gsSetting = JSON.parse(gsDefine.setting);
+            let commonIndex = 0;
+            for (const tender of gsCustom.tenders) {
+                const specialKey = this._checkSpecialTender(tender, gsSetting.special);
+                if (specialKey === '') {
+                    await this._gatherCommonDealBills(tender, commonIndex);
+                    commonIndex++;
+                } else {
+                    await this._gatherSpecialDealBills(tender, specialKey);
+                }
+            }
+            return this.resultDealBills;
+        }
     }
 
     return RptGatherMemory;

+ 3 - 3
app/service/tender.js

@@ -89,7 +89,7 @@ module.exports = app => {
                     '  FROM ?? As t ' +
                     '  Left Join ?? As pa ' +
                     '  ON t.`user_id` = pa.`id` ' +
-                    '  WHERE t.`project_id` = ? AND t.`user_id` = ?';
+                    '  WHERE t.`project_id` = ? AND t.`user_id` = ? ORDER BY CONVERT(t.`name` USING GBK) ASC';
                 sqlParam = [this.tableName, this.ctx.service.projectAccount.tableName, session.sessionProject.id, session.sessionUser.accountId];
             } else if (permission !== null && permission.tender !== undefined && permission.tender.indexOf('2') !== -1) {
                 // 具有查看所有标段权限的用户查阅标段
@@ -98,7 +98,7 @@ module.exports = app => {
                     '  FROM ?? As t ' +
                     '  Left Join ?? As pa ' +
                     '  ON t.`user_id` = pa.`id` ' +
-                    '  WHERE t.`project_id` = ?';
+                    '  WHERE t.`project_id` = ? ORDER BY CONVERT(t.`name` USING GBK) ASC';
                 sqlParam = [this.tableName, this.ctx.service.projectAccount.tableName, session.sessionProject.id];
             } else {
                 // 根据用户权限查阅标段
@@ -127,7 +127,7 @@ module.exports = app => {
                     '    OR (t.`ledger_status` = ' + auditConst.ledger.status.checked + ' AND ' +
                     '        t.id IN ( SELECT ra.`tender_id` FROM ?? AS ra WHERE ra.`audit_id` = ? GROUP BY ra.`tender_id`))' +
                     // 未参与,但可见的标段
-                    ')';
+                    ') ORDER BY CONVERT(t.`name` USING GBK) ASC';
                 sqlParam = [this.tableName, this.ctx.service.projectAccount.tableName, session.sessionProject.id, session.sessionUser.accountId,
                     this.ctx.service.ledgerAudit.tableName, session.sessionUser.accountId,
                     this.ctx.service.stageAudit.tableName, session.sessionUser.accountId,

+ 297 - 5
builder_report_index_define.js

@@ -190,6 +190,204 @@ const change_bills = {
 
     ],
 };
+// 期 - 清单
+const stage_bills = {
+    name: '期-清单 数据表(mem_stage_bills)',
+    remark: '',
+    id: 25,
+    key: 'mem_stage_bills',
+    prefix: '期-清单',
+    cols: [
+        { name: '台账ID', field: 'id', type: dataType.int },
+        { name: '标段ID', field: 'tender_id', type: dataType.int },
+        { name: '树结构-ID', field: 'ledger_id', type: dataType.int },
+        { name: '树结构-父项ID', field: 'ledger_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, tag: {type: 'up'} },
+
+        { name: '签约-数量', field: 'deal_qty', type: dataType.currency, tag: {type: 'qty', unitKey: 12} },
+        { name: '签约-金额', field: 'deal_tp', type: dataType.currency, tag: {type: 'tp'} },
+
+        { name: '施工复核-数量', field: 'sgfh_qty', type: dataType.currency, tag: {type: 'qty', unitKey: 12} },
+        { name: '施工复核-金额', field: 'sgfh_tp', type: dataType.currency, tag: {type: 'tp'} },
+        { name: '设计错漏-数量', field: 'sjcl_qty', type: dataType.currency, tag: {type: 'qty', unitKey: 12} },
+        { name: '设计错漏-金额', field: 'sjcl_tp', type: dataType.currency, tag: {type: 'tp'} },
+        { name: '其他错漏-数量', field: 'qtcl_qty', type: dataType.currency, tag: {type: 'qty', unitKey: 12} },
+        { name: '其他错漏-金额', field: 'qtcl_tp', type: dataType.currency, tag: {type: 'tp'} },
+        { name: '台账-数量', field: 'quantity', type: dataType.currency, tag: {type: 'qty', unitKey: 12} },
+        { name: '台账-金额', field: 'total_price', type: dataType.currency, tag: {type: 'tp'} },
+
+        { 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 },
+        { name: '总额计量', field: 'is_tp', type: dataType.int },
+
+        { name: '本期-合同-数量', field: 'contract_qty', type: dataType.currency, tag: {type: 'qty', unitKey: 12} },
+        { name: '本期-合同-金额', field: 'contract_tp', type: dataType.currency, tag: {type: 'tp'} },
+        { name: '本期-数量变更-数量', field: 'qc_qty', type: dataType.currency, tag: {type: 'qty', unitKey: 12} },
+        { name: '本期-数量变更-金额', field: 'qc_tp', type: dataType.currency, tag: {type: 'tp'} },
+        { name: '本期-完成-数量', field: 'gather_qty', type: dataType.currency, tag: {type: 'qty', unitKey: 12} },
+        { name: '本期-完成-金额', field: 'gather_tp', type: dataType.currency, tag: {type: 'tp'} },
+        { name: '本期批注', field: 'postil', type: dataType.str },
+
+        { name: '截止上期-合同-数量', field: 'pre_contract_qty', type: dataType.currency, tag: {type: 'qty', unitKey: 12} },
+        { name: '截止上期-合同-金额', field: 'pre_contract_tp', type: dataType.currency, tag: {type: 'tp'} },
+        { name: '截止上期-数量变更-数量', field: 'pre_qc_qty', type: dataType.currency, tag: {type: 'qty', unitKey: 12} },
+        { name: '截止上期-数量变更-金额', field: 'pre_qc_tp', type: dataType.currency, tag: {type: 'tp'} },
+        { name: '截止上期-完成-数量', field: 'pre_gather_qty', type: dataType.currency, tag: {type: 'qty', unitKey: 12} },
+        { name: '截止上期-完成-金额', field: 'pre_gather_tp', type: dataType.currency, tag: {type: 'tp'} },
+
+        { name: '截止本期-合同-数量', field: 'end_contract_qty', type: dataType.currency, tag: {type: 'qty', unitKey: 12} },
+        { name: '截止本期-合同-金额', field: 'end_contract_tp', type: dataType.currency, tag: {type: 'tp'} },
+        { name: '截止本期-数量变更-数量', field: 'end_qc_qty', type: dataType.currency, tag: {type: 'qty', unitKey: 12} },
+        { name: '截止本期-数量变更-金额', field: 'end_qc_tp', type: dataType.currency, tag: {type: 'tp'} },
+        { name: '截止本期-完成-数量', field: 'end_gather_qty', type: dataType.currency, tag: {type: 'qty', unitKey: 12} },
+        { name: '截止本期-完成-金额', field: 'end_gather_tp', type: dataType.currency, tag: {type: 'tp'} },
+
+        { name: '(台账 + 截止本期变更)-金额', field: 'final_tp', type: dataType.currency, tag: {type: 'tp'} },
+        { name: '截止本期完成率(%)', field: 'final_ratio', type: dataType.double },
+
+        { name: '本期-数量变更-变更令', field: 'qc_bgl_code', type: dataType.str },
+
+        { name: '章节编号', field: 'chapter', type: dataType.str },
+
+        { name: '预留扩展字段_1', field: 'ex_value1', type: dataType.currency },
+        { name: '预留扩展字段_2', field: 'ex_value1', type: dataType.currency },
+    ],
+};
+const stage_bills_compare = {
+    name: '期-清单-全参与人 数据表(mem_stage_bills_compare)',
+    remark: '',
+    id: 26,
+    key: 'mem_stage_bills_compare',
+    prefix: '期-清单-全参与人',
+    cols: [
+        { name: '台账ID', field: 'id', type: dataType.int },
+        { name: '标段ID', field: 'tender_id', type: dataType.int },
+        { name: '树结构-ID', field: 'ledger_id', type: dataType.int },
+        { name: '树结构-父项ID', field: 'ledger_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, tag: {type: 'up'} },
+
+        { name: '签约-数量', field: 'deal_qty', type: dataType.currency, tag: {type: 'qty', unitKey: 12} },
+        { name: '签约-金额', field: 'deal_tp', type: dataType.currency, tag: {type: 'tp'} },
+
+        { name: '施工复核-数量', field: 'sgfh_qty', type: dataType.currency, tag: {type: 'qty', unitKey: 12} },
+        { name: '施工复核-金额', field: 'sgfh_tp', type: dataType.currency, tag: {type: 'tp'} },
+        { name: '设计错漏-数量', field: 'sjcl_qty', type: dataType.currency, tag: {type: 'qty', unitKey: 12} },
+        { name: '设计错漏-金额', field: 'sjcl_tp', type: dataType.currency, tag: {type: 'tp'} },
+        { name: '其他错漏-数量', field: 'qtcl_qty', type: dataType.currency, tag: {type: 'qty', unitKey: 12} },
+        { name: '其他错漏-金额', field: 'qtcl_tp', type: dataType.currency, tag: {type: 'tp'} },
+        { name: '台账-数量', field: 'quantity', type: dataType.currency, tag: {type: 'qty', unitKey: 12} },
+        { name: '台账-金额', field: 'total_price', type: dataType.currency, tag: {type: 'tp'} },
+
+        { 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 },
+        { name: '总额计量', field: 'is_tp', type: dataType.int },
+
+        { name: '截止上期-合同-数量', field: 'pre_contract_qty', type: dataType.currency, tag: {type: 'qty', unitKey: 12} },
+        { name: '截止上期-合同-金额', field: 'pre_contract_tp', type: dataType.currency, tag: {type: 'tp'} },
+        { name: '截止上期-数量变更-数量', field: 'pre_qc_qty', type: dataType.currency, tag: {type: 'qty', unitKey: 12} },
+        { name: '截止上期-数量变更-金额', field: 'pre_qc_tp', type: dataType.currency, tag: {type: 'tp'} },
+        { name: '截止上期-完成-数量', field: 'pre_gather_qty', type: dataType.currency, tag: {type: 'qty', unitKey: 12} },
+        { name: '截止上期-完成-金额', field: 'pre_gather_tp', type: dataType.currency, tag: {type: 'tp'} },
+
+        { name: '本期-合同-数量_0', field: 'r0_contract_qty', type: dataType.currency, tag: {type: 'qty', unitKey: 12} },
+        { name: '本期-合同-金额_0', field: 'r0_contract_tp', type: dataType.currency, tag: {type: 'tp'} },
+        { name: '本期-数量变更-数量_0', field: 'r0_qc_qty', type: dataType.currency, tag: {type: 'qty', unitKey: 12} },
+        { name: '本期-数量变更-金额_0', field: 'r0_qc_tp', type: dataType.currency, tag: {type: 'tp'} },
+        { name: '本期-完成-数量_0', field: 'r0_gather_qty', type: dataType.currency, tag: {type: 'qty', unitKey: 12} },
+        { name: '本期-完成-金额_0', field: 'r0_gather_tp', type: dataType.currency, tag: {type: 'tp'} },
+
+        { name: '本期-合同-数量_1', field: 'r1_contract_qty', type: dataType.currency, tag: {type: 'qty', unitKey: 12} },
+        { name: '本期-合同-金额_1', field: 'r1_contract_tp', type: dataType.currency, tag: {type: 'tp'} },
+        { name: '本期-数量变更-数量_1', field: 'r1_qc_qty', type: dataType.currency, tag: {type: 'qty', unitKey: 12} },
+        { name: '本期-数量变更-金额_1', field: 'r1_qc_tp', type: dataType.currency, tag: {type: 'tp'} },
+        { name: '本期-完成-数量_1', field: 'r1_gather_qty', type: dataType.currency, tag: {type: 'qty', unitKey: 12} },
+        { name: '本期-完成-金额_1', field: 'r1_gather_tp', type: dataType.currency, tag: {type: 'tp'} },
+
+        { name: '本期-合同-数量_2', field: 'r2_contract_qty', type: dataType.currency, tag: {type: 'qty', unitKey: 12} },
+        { name: '本期-合同-金额_2', field: 'r2_contract_tp', type: dataType.currency, tag: {type: 'tp'} },
+        { name: '本期-数量变更-数量_2', field: 'r2_qc_qty', type: dataType.currency, tag: {type: 'qty', unitKey: 12} },
+        { name: '本期-数量变更-金额_2', field: 'r2_qc_tp', type: dataType.currency, tag: {type: 'tp'} },
+        { name: '本期-完成-数量_2', field: 'r2_gather_qty', type: dataType.currency, tag: {type: 'qty', unitKey: 12} },
+        { name: '本期-完成-金额_2', field: 'r2_gather_tp', type: dataType.currency, tag: {type: 'tp'} },
+
+        { name: '本期-合同-数量_3', field: 'r3_contract_qty', type: dataType.currency, tag: {type: 'qty', unitKey: 12} },
+        { name: '本期-合同-金额_3', field: 'r3_contract_tp', type: dataType.currency, tag: {type: 'tp'} },
+        { name: '本期-数量变更-数量_3', field: 'r3_qc_qty', type: dataType.currency, tag: {type: 'qty', unitKey: 12} },
+        { name: '本期-数量变更-金额_3', field: 'r3_qc_tp', type: dataType.currency, tag: {type: 'tp'} },
+        { name: '本期-完成-数量_3', field: 'r3_gather_qty', type: dataType.currency, tag: {type: 'qty', unitKey: 12} },
+        { name: '本期-完成-金额_3', field: 'r3_gather_tp', type: dataType.currency, tag: {type: 'tp'} },
+
+        { name: '本期-合同-数量_4', field: 'r4_contract_qty', type: dataType.currency, tag: {type: 'qty', unitKey: 12} },
+        { name: '本期-合同-金额_4', field: 'r4_contract_tp', type: dataType.currency, tag: {type: 'tp'} },
+        { name: '本期-数量变更-数量_4', field: 'r4_qc_qty', type: dataType.currency, tag: {type: 'qty', unitKey: 12} },
+        { name: '本期-数量变更-金额_4', field: 'r4_qc_tp', type: dataType.currency, tag: {type: 'tp'} },
+        { name: '本期-完成-数量_4', field: 'r4_gather_qty', type: dataType.currency, tag: {type: 'qty', unitKey: 12} },
+        { name: '本期-完成-金额_4', field: 'r4_gather_tp', type: dataType.currency, tag: {type: 'tp'} },
+
+        { name: '本期-合同-数量_5', field: 'r5_contract_qty', type: dataType.currency, tag: {type: 'qty', unitKey: 12} },
+        { name: '本期-合同-金额_5', field: 'r5_contract_tp', type: dataType.currency, tag: {type: 'tp'} },
+        { name: '本期-数量变更-数量_5', field: 'r5_qc_qty', type: dataType.currency, tag: {type: 'qty', unitKey: 12} },
+        { name: '本期-数量变更-金额_5', field: 'r5_qc_tp', type: dataType.currency, tag: {type: 'tp'} },
+        { name: '本期-完成-数量_5', field: 'r5_gather_qty', type: dataType.currency, tag: {type: 'qty', unitKey: 12} },
+        { name: '本期-完成-金额_5', field: 'r5_gather_tp', type: dataType.currency, tag: {type: 'tp'} },
+
+        { name: '本期-合同-数量_6', field: 'r6_contract_qty', type: dataType.currency, tag: {type: 'qty', unitKey: 12} },
+        { name: '本期-合同-金额_6', field: 'r6_contract_tp', type: dataType.currency, tag: {type: 'tp'} },
+        { name: '本期-数量变更-数量_6', field: 'r6_qc_qty', type: dataType.currency, tag: {type: 'qty', unitKey: 12} },
+        { name: '本期-数量变更-金额_6', field: 'r6_qc_tp', type: dataType.currency, tag: {type: 'tp'} },
+        { name: '本期-完成-数量_6', field: 'r6_gather_qty', type: dataType.currency, tag: {type: 'qty', unitKey: 12} },
+        { name: '本期-完成-金额_6', field: 'r6_gather_tp', type: dataType.currency, tag: {type: 'tp'} },
+
+        { name: '本期-合同-数量_7', field: 'r7_contract_qty', type: dataType.currency, tag: {type: 'qty', unitKey: 12} },
+        { name: '本期-合同-金额_7', field: 'r7_contract_tp', type: dataType.currency, tag: {type: 'tp'} },
+        { name: '本期-数量变更-数量_7', field: 'r7_qc_qty', type: dataType.currency, tag: {type: 'qty', unitKey: 12} },
+        { name: '本期-数量变更-金额_7', field: 'r7_qc_tp', type: dataType.currency, tag: {type: 'tp'} },
+        { name: '本期-完成-数量_7', field: 'r7_gather_qty', type: dataType.currency, tag: {type: 'qty', unitKey: 12} },
+        { name: '本期-完成-金额_7', field: 'r7_gather_tp', type: dataType.currency, tag: {type: 'tp'} },
+
+        { name: '本期-合同-数量_8', field: 'r8_contract_qty', type: dataType.currency, tag: {type: 'qty', unitKey: 12} },
+        { name: '本期-合同-金额_8', field: 'r8_contract_tp', type: dataType.currency, tag: {type: 'tp'} },
+        { name: '本期-数量变更-数量_8', field: 'r8_qc_qty', type: dataType.currency, tag: {type: 'qty', unitKey: 12} },
+        { name: '本期-数量变更-金额_8', field: 'r8_qc_tp', type: dataType.currency, tag: {type: 'tp'} },
+        { name: '本期-完成-数量_8', field: 'r8_gather_qty', type: dataType.currency, tag: {type: 'qty', unitKey: 12} },
+        { name: '本期-完成-金额_8', field: 'r8_gather_tp', type: dataType.currency, tag: {type: 'tp'} },
+
+        { name: '本期-合同-数量_9', field: 'r9_contract_qty', type: dataType.currency, tag: {type: 'qty', unitKey: 12} },
+        { name: '本期-合同-金额_9', field: 'r9_contract_tp', type: dataType.currency, tag: {type: 'tp'} },
+        { name: '本期-数量变更-数量_9', field: 'r9_qc_qty', type: dataType.currency, tag: {type: 'qty', unitKey: 12} },
+        { name: '本期-数量变更-金额_9', field: 'r9_qc_tp', type: dataType.currency, tag: {type: 'tp'} },
+        { name: '本期-完成-数量_9', field: 'r9_gather_qty', type: dataType.currency, tag: {type: 'qty', unitKey: 12} },
+        { name: '本期-完成-金额_9', field: 'r9_gather_tp', type: dataType.currency, tag: {type: 'tp'} },
+
+        { name: '章节编号', field: 'chapter', type: dataType.str },
+    ],
+};
 // 期 - 计量单元
 const stage_pos = {
     name: '期-计量单元(mem_stage_pos)',
@@ -276,6 +474,70 @@ const stage_pos_compare = {
         { name: '本期-完成计量-数量_9', field: 'r9_gather_qty', type: dataType.currency },
     ],
 };
+// 工程进度
+const month_progress = {
+    name: '工程进度 数据表(mem_month_progress)',
+    remark: '',
+    id: 22,
+    key: 'mem_month_progress',
+    prefix: '工程进度',
+    cols: [
+        { name: '计量年月', field: 'month', type: dataType.str },
+        { name: '本月计量', field: 'tp', type: dataType.currency, tag: {type: 'tp'} },
+        { name: '本月完成度', field: 'ratio', type: dataType.double },
+        { name: '累计计量', field: 'end_tp', type: dataType.currency, tag: {type: 'tp'} },
+        { name: '累计完成度', field: 'end_ratio', type: dataType.double },
+    ],
+};
+// 预留扩展数据
+const union_data = {
+    name: '预留扩展-合并 数据表(mem_union_data)',
+    remark: '',
+    id: 28,
+    key: 'mem_union_data',
+    prefix: '预留扩展-合并',
+    cols: [
+        { name: '字符串1', field: 'str1', type: dataType.str },
+        { name: '字符串2', field: 'str2', type: dataType.str },
+        { name: '字符串3', field: 'str3', type: dataType.str },
+        { name: '字符串4', field: 'str4', type: dataType.str },
+        { name: '字符串5', field: 'str5', type: dataType.str },
+        { name: '字符串6', field: 'str6', type: dataType.str },
+        { name: '字符串7', field: 'str7', type: dataType.str },
+        { name: '字符串8', field: 'str8', type: dataType.str },
+        { name: '字符串9', field: 'str9', type: dataType.str },
+        { name: '字符串10', field: 'str10', type: dataType.str },
+
+        { name: '整数1', field: 'int1', type: dataType.int },
+        { name: '整数2', field: 'int2', type: dataType.int },
+        { name: '整数3', field: 'int3', type: dataType.int },
+        { name: '整数4', field: 'int4', type: dataType.int },
+        { name: '整数5', field: 'int5', type: dataType.int },
+        { name: '整数6', field: 'int6', type: dataType.int },
+
+        { name: '数量1', field: 'qty1', type: dataType.currency },
+        { name: '数量2', field: 'qty2', type: dataType.currency },
+        { name: '数量3', field: 'qty3', type: dataType.currency },
+        { name: '数量4', field: 'qty4', type: dataType.currency },
+        { name: '数量5', field: 'qty5', type: dataType.currency },
+        { name: '数量6', field: 'qty6', type: dataType.currency },
+        { name: '数量7', field: 'qty7', type: dataType.currency },
+        { name: '数量8', field: 'qty8', type: dataType.currency },
+        { name: '数量9', field: 'qty9', type: dataType.currency },
+        { name: '数量10', field: 'qty10', type: dataType.currency },
+
+        { name: '金额1', field: 'tp1', type: dataType.currency },
+        { name: '金额2', field: 'tp2', type: dataType.currency },
+        { name: '金额3', field: 'tp3', type: dataType.currency },
+        { name: '金额4', field: 'tp4', type: dataType.currency },
+        { name: '金额5', field: 'tp5', type: dataType.currency },
+        { name: '金额6', field: 'tp6', type: dataType.currency },
+        { name: '金额7', field: 'tp7', type: dataType.currency },
+        { name: '金额8', field: 'tp8', type: dataType.currency },
+        { name: '金额9', field: 'tp9', type: dataType.currency },
+        { name: '金额10', field: 'tp10', type: dataType.currency },
+    ],
+};
 
 // 期 - 合同支付
 const stage_pay = {
@@ -440,7 +702,7 @@ const gather_stage_bills = {
         { name: '单价', field: 'unit_price', type: dataType.currency },
 
         { name: '标段id', field: 't_id', type: dataType.int },
-        { name: '标段-名称', field: 't_name', type: dataType.int },
+        { name: '标段-名称', field: 't_name', type: dataType.str },
 
         { name: '(标段)台账-数量', field: 't_qty', type: dataType.currency },
         { name: '(标段)台账-金额', field: 't_tp', type: dataType.currency },
@@ -529,6 +791,8 @@ const gather_tender_info = {
         { name: '截止上期-应付', field: 'pre_yf', type: dataType.currency },
         { name: '本期-应付', field: 'yf', type: dataType.currency },
         { name: '截止本期-应付', field: 'end_yf', type: dataType.currency },
+
+        { name: '签约清单-金额', field: 'deal_bills_tp', type: dataType.currency },
     ],
 };
 const gather_stage_pay = {
@@ -544,7 +808,7 @@ const gather_stage_pay = {
         { name: '是否参与本期应付计算', field: 'minus', type: dataType.int },
 
         { name: '标段id', field: 't_id', type: dataType.int },
-        { name: '标段-名称', field: 't_name', type: dataType.int },
+        { name: '标段-名称', field: 't_name', type: dataType.str },
 
         { name: '(标段)本期-金额', field: 't_tp', type: dataType.currency },
         { name: '(标段)截止上期-金额', field: 't_pre_tp', type: dataType.currency },
@@ -555,6 +819,30 @@ const gather_stage_pay = {
         { name: '(合计)截止本期-金额', field: 's_end_tp', type: dataType.currency },
     ],
 };
+const gather_deal_bills = {
+    name: '汇总-签约清单 数据表(mem_gather_deal_bills)',
+    remark: '',
+    id: 39,
+    key: 'mem_gather_deal_bills',
+    prefix: '汇总-期-合同支付',
+    cols: [
+        { name: '编号', field: 'code', type: dataType.str },
+        { name: '名称', field: 'name', type: dataType.str },
+        { name: '单位', field: 'unit', type: dataType.str },
+        { name: '单价', field: 'unit_price', type: dataType.currency },
+
+        { name: '标段id', field: 't_id', type: dataType.int },
+        { name: '标段-名称', field: 't_name', type: dataType.str },
+
+        { name: '(标段)本期-金额', field: 't_tp', type: dataType.currency },
+
+        { name: '(合计)本期-金额', field: 's_tp', type: dataType.currency },
+
+        { name: '(特殊1)本期-金额', field: 'ts_key1_tp', type: dataType.currency },
+        { name: '(特殊2)本期-金额', field: 'ts_key2_tp', type: dataType.currency },
+        { name: '(特殊3)本期-金额', field: 'ts_key3_tp', type: dataType.currency },
+    ],
+};
 
 const recursiveMkdirSync = async function(pathName) {
     if (!fs.existsSync(pathName)) {
@@ -576,7 +864,7 @@ const saveBufferFile = async function(buffer, fileName) {
 const addFields = function(table, col) {
     const data = {};
     data.ID = table.ID * 100 + (col.id ? Math.max(table.items.length + 1, col.id) : table.items.length + 1);
-    data.Name = col.name + (col.field ? '(' + col.field + ')' : '');
+    data.Name = col.name + (col.field ? '(' + col.field + ')' : '') + (data.ID ? '(id: ' + data.ID + ')' : '');
     if (table.prefix && table.prefix !== '') data.Name = table.prefix + '-' + data.Name;
     data.DataType = col.type;
     data.TableName = table.key;
@@ -646,12 +934,16 @@ const exportTableDefine = async function(define) {
     await saveTableDefine(tableDefine, path.join(savePath, define.key + '_define.json'));
 };
 
-const defines = [stage_jgcl, stage_bonus, stage_other,
+const defines = [
+    union_data,
+    month_progress,
+    stage_bills, stage_bills_compare,
+    stage_jgcl, stage_bonus, stage_other,
     change, change_bills,
     stage_pos, stage_pos_compare,
     stage_pay,
     stage_im_zl, stage_im_tz, stage_im_tz_bills,
-    gather_stage_bills, gather_tender_info, gather_stage_pay
+    gather_stage_bills, gather_tender_info, gather_stage_pay, gather_deal_bills,
 ];
 for (const d of defines) {
     exportTableDefine(d);

+ 42 - 0
test/app/service/rpt_gather_memory.test.js

@@ -156,4 +156,46 @@ describe('test/app/service/rpt_gather_memory.test.js', () => {
         // yield ctx.helper.saveBufferFile(JSON.stringify(reportData, "", "\t"), path.join(savePath, 'mem_gather_stage_bills_coverse.json'));
         // assert(reportData.mem_gather_stage_bills.length === mem_gather_stage_bills.length * 2);
     });
+    it('test getGatherDealBills - final', function* () {
+        const ctx = app.mockContext(mockData);
+
+        // const select = {
+        //     tenders: [{tid: 2256}, {tid: 2257}, {tid: 2258, gs: true}],
+        //     type: 'month',
+        //     month: '2020-01',
+        // };
+        const select = {
+            tenders: [{tid: 2256}, {tid: 2257}],
+            type: 'final',
+        };
+        // const define = {
+        //     enable: true,
+        //     setting: JSON.stringify({
+        //         title: '请选择汇总的标段',
+        //         type: 'month',
+        //         special: [
+        //             {"title": "批复概算", "key": "gs"}
+        //         ]
+        //     })
+        // };
+        const define = {
+            enable: true,
+            setting: JSON.stringify({
+                title: '请选择汇总的标段',
+                type: 'final',
+            })
+        };
+
+        const mem_gather_stage_bills = yield ctx.service.rptGatherMemory.getGatherDealBills([], define, select);
+        yield ctx.helper.saveBufferFile(JSON.stringify(mem_gather_stage_bills, "", "\t"), path.join(savePath, 'mem_gather_deal_pay.json'));
+
+        // const reportDataAnalysis = require('../../../app/lib/rpt_data_analysis');
+        // const reportData = {mem_gather_stage_bills: mem_gather_stage_bills};
+        // reportDataAnalysis.analysisObj.gatherSelectConverse.fun(ctx, reportData, [], {table: ["mem_gather_stage_bills"]}, {
+        //     cDefine: { gather_select: select },
+        //     tplDefine: {gather_select: define },
+        // });
+        // yield ctx.helper.saveBufferFile(JSON.stringify(reportData, "", "\t"), path.join(savePath, 'mem_gather_stage_bills_coverse.json'));
+        // assert(reportData.mem_gather_stage_bills.length === mem_gather_stage_bills.length * 2);
+    });
 });