Browse Source

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

TonyKang 5 years atrás
parent
commit
7fafd3fada

+ 0 - 1
app/base/base_service.js

@@ -168,7 +168,6 @@ class BaseService extends Service {
         }
 
         const [sql, sqlParam] = this.sqlBuilder.build(this.tableName);
-        console.log(sql, sqlParam);
         const list = await this.db.query(sql, sqlParam);
 
         return list;

+ 5 - 5
app/controller/dashboard_controller.js

@@ -65,9 +65,9 @@ module.exports = app => {
                 projectData,
                 salesmanData,
                 officeName,
-                versionList: JSON.parse(JSON.stringify(versionList).replace(/\\r\\n/g, '<br>').replace(/\\"/g, '&#34').replace(/'/g, '&#39')),
-                msgList: JSON.parse(JSON.stringify(msgList).replace(/\\r\\n/g, '<br>').replace(/\\"/g, '&#34').replace(/'/g, '&#39')),
-                sysMsgList: JSON.parse(JSON.stringify(sysMsgList).replace(/\\r\\n/g, '<br>').replace(/\\"/g, '&#34').replace(/'/g, '&#39')),
+                versionList: JSON.parse(JSON.stringify(versionList).replace(/\\r\\n/g, '<br>').replace(/\\"/g, '&#34;').replace(/'/g, '&#39;').replace(/\\t/g, '&#9;')),
+                msgList: JSON.parse(JSON.stringify(msgList).replace(/\\r\\n/g, '<br>').replace(/\\"/g, '&#34;').replace(/'/g, '&#39;').replace(/\\t/g, '&#9;')),
+                sysMsgList: JSON.parse(JSON.stringify(sysMsgList).replace(/\\r\\n/g, '<br>').replace(/\\"/g, '&#34;').replace(/'/g, '&#39;').replace(/\\t/g, '&#9;')),
                 userMsgPermission,
                 uid: ctx.session.sessionUser.accountId,
                 maintainData,
@@ -110,14 +110,14 @@ module.exports = app => {
                 total: Math.ceil(total / limit),
                 queryData: JSON.stringify(ctx.urlInfo.query),
             };
-
             const renderData = {
                 uid: ctx.session.sessionUser.accountId,
                 type,
                 pageInfo,
                 userMsgPermission,
-                msgList: JSON.parse(JSON.stringify(msgList).replace(/\\r\\n/g, '<br>').replace(/\\"/g, '&#34').replace(/'/g, '&#39')),
+                msgList: JSON.parse(JSON.stringify(msgList).replace(/\\r\\n/g, '<br>').replace(/\\"/g, '&#34;').replace(/'/g, '&#39;').replace(/\\t/g, '&#9;')),
             };
+            console.log(renderData.msgList);
             await this.layout('dashboard/msg.ejs', renderData);
         }
 

+ 40 - 21
app/controller/ledger_controller.js

@@ -72,7 +72,7 @@ module.exports = app => {
                 }
             }
             function setColFormat(cols, field, formatter) {
-                const col = _.find(cols, function (c) {
+                const col = _.find(cols, function(c) {
                     return c.field === field;
                 });
                 col.formatter = formatter;
@@ -223,7 +223,7 @@ module.exports = app => {
             if ((isNaN(data.id) || data.id <= 0) ||
                 (!data.tid && data.tid <= 0) ||
                 (!data.block || data.block.length <= 0)) throw '参数错误';
-            return await ctx.service.ledger.pasteBlock(ctx.tender.id, data.id, {tid: data.tid, block: data.block});
+            return await ctx.service.ledger.pasteBlock(ctx.tender.id, data.id, { tid: data.tid, block: data.block });
         }
         /**
          * 从标准项目表添加数据
@@ -234,7 +234,8 @@ module.exports = app => {
             if ((isNaN(data.id) || data.id <= 0) || !data.stdType || !data.stdNode) throw '参数错误';
             // todo 校验项目是否使用该库的权限
 
-            let stdLib, addType;
+            let stdLib,
+                addType;
             switch (data.stdType) {
                 case 'xmj':
                     stdLib = ctx.service.stdXmj;
@@ -268,7 +269,7 @@ module.exports = app => {
         /**
          * 从签约清单添加节点
          * @param ctx
-         * @returns {Promise<void>}
+         * @return {Promise<void>}
          */
         async _addDeal(ctx, data) {
             if (!data.type || !data.dealBills) throw '数据错误';
@@ -277,9 +278,9 @@ module.exports = app => {
                 return await ctx.service.ledger.addChild(ctx.tender.id, data.id, data.dealBills);
             } else if (data.type === 'next') {
                 return await ctx.service.ledger.addNode(ctx.tender.id, data.id, data.dealBills);
-            } else {
-                throw '数据错误';
             }
+            throw '数据错误';
+
         }
         /**
          * 批量插入数据
@@ -307,7 +308,7 @@ module.exports = app => {
         /**
          * 更新清单相关 (Ajax)
          * @param ctx
-         * @returns {Promise<void>}
+         * @return {Promise<void>}
          */
         async update(ctx) {
             try {
@@ -429,8 +430,8 @@ module.exports = app => {
             try {
                 const ledgerData = await ctx.service.ledger.getData(ctx.tender.id);
                 const posData = this.ctx.tender.data.measure_type === measureType.tz.value
-                    ? await ctx.service.pos.getPosData({tid: ctx.tender.id}) : [];
-                ctx.body = { err: 0, msg: '', data: {bills: ledgerData, pos: posData} };
+                    ? await ctx.service.pos.getPosData({ tid: ctx.tender.id }) : [];
+                ctx.body = { err: 0, msg: '', data: { bills: ledgerData, pos: posData } };
             } catch (err) {
                 this.log(err);
                 ctx.body = { err: 1, msg: err.toString(), data: [] };
@@ -458,7 +459,7 @@ module.exports = app => {
         /**
          * 复制粘贴 部位明细
          * @param ctx
-         * @returns {Promise<void>}
+         * @return {Promise<void>}
          */
         async posPaste(ctx) {
             try {
@@ -466,7 +467,7 @@ module.exports = app => {
                 const data = JSON.parse(ctx.request.body.data);
                 const result = await ctx.service.pos.pastePosData(data, ctx.tender.id);
                 ctx.body = { err: 0, msg: '', data: result };
-            } catch(err) {
+            } catch (err) {
                 this.log(err);
                 ctx.body = { err: 1, msg: err.toString(), data: null };
             }
@@ -482,7 +483,7 @@ module.exports = app => {
                 const ueType = ctx.params.ueType;
                 const compressData = ctx.request.body.data;
                 const data = JSON.parse(LzString.decompressFromUTF16(compressData));
-                const responseData = { err: 0, msg: '', data: {}, };
+                const responseData = { err: 0, msg: '', data: {} };
                 switch (ueType) {
                     case 'tz':
                         const templateId = await this.ctx.service.valuation.getValuationTemplate(
@@ -512,7 +513,7 @@ module.exports = app => {
         //         const fileInfo = path.parse(stream.filename);
         //         const fileName = this.app.config.filePath + '/cache/ledger/uploads/' + create_time + fileInfo.ext;
         //         await ctx.helper.saveStreamFile(stream, fileName);
-                
+
         //         // 读取excel
         //         console.log(ctx.query);
         //         const name = ctx.query.sheetName;
@@ -551,7 +552,7 @@ module.exports = app => {
          * 填设计量(Ajax)
          *
          * @param ctx
-         * @returns {Promise<void>}
+         * @return {Promise<void>}
          */
         async deal2sgfh(ctx) {
             try {
@@ -561,7 +562,7 @@ module.exports = app => {
 
                 await this.ctx.service.ledger.deal2sgfh(ctx.tender.id);
                 const ledgerData = await ctx.service.ledger.getData(ctx.tender.id);
-                ctx.body = {err: 0, msg: '', data: {bills: ledgerData}};
+                ctx.body = { err: 0, msg: '', data: { bills: ledgerData } };
             } catch (err) {
                 this.log(err);
                 ctx.body = { err: 1, msg: err.toString(), data: null };
@@ -599,15 +600,33 @@ module.exports = app => {
         }
 
         /**
+         * 部位台账 页面 (Get)
+         * @param ctx
+         * @return {Promise<void>}
+         */
+        async bwtz(ctx) {
+            try {
+                const renderData = {
+                    tender: ctx.tender.data,
+                    jsFiles: this.app.jsFiles.common.concat(this.app.jsFiles.ledger.bwtz),
+                };
+                await this.layout('ledger/bwtz.ejs', renderData);
+            } catch (err) {
+                this.log(err);
+                ctx.redirect(ctx.request.header.referer);
+            }
+        }
+
+        /**
          * 台账对比 页面 (Get)
          * @param ctx
-         * @returns {Promise<void>}
+         * @return {Promise<void>}
          */
         async gather(ctx) {
             try {
                 const renderData = {
                     tender: ctx.tender.data,
-                    jsFiles: this.app.jsFiles.common.concat(this.app.jsFiles.ledger.gather)
+                    jsFiles: this.app.jsFiles.common.concat(this.app.jsFiles.ledger.gather),
                 };
 
                 await this.layout('ledger/gather.ejs', renderData);
@@ -620,15 +639,15 @@ module.exports = app => {
         /**
          * 获取 台账对比 数据 (Ajax)
          * @param ctx
-         * @returns {Promise<void>}
+         * @return {Promise<void>}
          */
         async loadGatherData(ctx) {
             try {
                 const billsData = await ctx.service.ledger.getData(ctx.tender.id);
                 const posData = this.ctx.tender.data.measure_type === measureType.tz.value
-                    ? await ctx.service.pos.getPosData({tid: ctx.tender.id}) : [];
-                const dealBills = await ctx.service.dealBills.getAllDataByCondition({ where: {tender_id: this.ctx.tender.id} });
-                ctx.body = { err: 0, msg: '', data: {bills: billsData, pos: posData, dealBills: dealBills} };
+                    ? await ctx.service.pos.getPosData({ tid: ctx.tender.id }) : [];
+                const dealBills = await ctx.service.dealBills.getAllDataByCondition({ where: { tender_id: this.ctx.tender.id } });
+                ctx.body = { err: 0, msg: '', data: { bills: billsData, pos: posData, dealBills } };
             } catch (err) {
                 this.log(err);
                 ctx.body = { err: 1, msg: err.toString(), data: [] };

+ 3 - 1
app/controller/login_controller.js

@@ -27,7 +27,9 @@ module.exports = app => {
             // 获取系统维护信息
             const maintainData = await ctx.service.maintain.getDataById(1);
 
-            await ctx.service.maintain.syncMaintainData();
+            if (!ctx.app.config.is_debug) {
+                await ctx.service.maintain.syncMaintainData();
+            }
 
             const renderData = {
                 maintainData,

+ 1 - 4
app/controller/report_controller.js

@@ -657,11 +657,8 @@ async function getMultiRptsCommon(ctx, params, outputType, baseDir) {
             const dftOption = params.option || JV.PAGING_OPTION_NORMAL;
 
             printCom.initialize(rptTpl);
-            const cdDefine = await ctx.service.rptCustomDefine.getDataByCondition({
-                tid: params.tender_id, sid: params.stage_id, rid: params.rpt_tpl_id
-            });
             // console.log(rptTpl);
-            printCom.analyzeData(ctx.helper, rptTpl, tplData, defProperties, dftOption, outputType, cdDefine);
+            printCom.analyzeData(ctx.helper, rptTpl, tplData, defProperties, dftOption, outputType, customSelect);
             const maxPages = printCom.totalPages;
             let pageRst = null;
             // console.log(maxPages);

+ 38 - 9
app/controller/setting_controller.js

@@ -91,21 +91,37 @@ module.exports = app => {
                     throw '没有访问权限';
                 }
 
+                const page = ctx.page;
+
                 // 获取数据规则
                 // const rule = ctx.service.projectAccount.rule('updateUser');
                 // const frontRule = ctx.helper.validateConvert(rule);
 
+                const total = await ctx.service.projectAccount.count({ project_id: projectId });
+
                 // 获取项目用户列表
-                const accountData = await ctx.service.projectAccount.getAllDataByCondition({
-                    where: { project_id: projectId },
-                    columns: ['id', 'account', 'name', 'company', 'role', 'mobile', 'auth_mobile', 'telephone', 'enable', 'is_admin', 'account_group'],
-                });
+                // const accountData = await ctx.service.projectAccount.getAllDataByCondition({
+                //     where: { project_id: projectId },
+                //     columns: ['id', 'account', 'name', 'company', 'role', 'mobile', 'auth_mobile', 'telephone', 'enable', 'is_admin', 'account_group'],
+                //     limit: (app.config.pageSize * (page - 1)),
+                //     offset: app.config.pageSize,
+                // });
+                const columns = ['id', 'account', 'name', 'company', 'role', 'mobile', 'auth_mobile', 'telephone', 'enable', 'is_admin', 'account_group'];
+                const accountData = await ctx.service.projectAccount.getListByProjectId(columns, projectId);
+
+                // 分页相关
+                const pageInfo = {
+                    page,
+                    total: Math.ceil(total / app.config.pageSize),
+                    queryData: JSON.stringify(ctx.urlInfo.query),
+                };
 
                 const renderData = {
                     projectData,
                     accountData,
                     accountGroup,
                     permission,
+                    pageInfo,
                     // rule: JSON.stringify(frontRule),
                 };
                 await this.layout('setting/user.ejs', renderData, 'setting/user_modal.ejs');
@@ -135,12 +151,24 @@ module.exports = app => {
                 // 获取数据规则
                 // const rule = ctx.service.projectAccount.rule('updateUser');
                 // const frontRule = ctx.helper.validateConvert(rule);
-
+                const page = ctx.page;
+                const total = await ctx.service.projectAccount.count({ project_id: projectId });
                 // 获取项目用户列表
-                const accountData = await ctx.service.projectAccount.getAllDataByCondition({
-                    where: { project_id: projectId },
-                    columns: ['id', 'account', 'name', 'company', 'role', 'is_admin', 'account_group', 'permission', 'cooperation'],
-                });
+                // const accountData = await ctx.service.projectAccount.getAllDataByCondition({
+                //     where: { project_id: projectId },
+                //     columns: ['id', 'account', 'name', 'company', 'role', 'is_admin', 'account_group', 'permission', 'cooperation'],
+                // });
+
+                const columns = ['id', 'account', 'name', 'company', 'role', 'is_admin', 'account_group', 'permission', 'cooperation'];
+
+                const accountData = await ctx.service.projectAccount.getListByProjectId(columns, projectId);
+
+                // 分页相关
+                const pageInfo = {
+                    page,
+                    total: Math.ceil(total / app.config.pageSize),
+                    queryData: JSON.stringify(ctx.urlInfo.query),
+                };
 
                 const renderData = {
                     projectData,
@@ -148,6 +176,7 @@ module.exports = app => {
                     accountGroup,
                     permission,
                     permissionStr: JSON.stringify(permission),
+                    pageInfo,
                     // rule: JSON.stringify(frontRule),
                 };
                 await this.layout('setting/user_permission.ejs', renderData, 'setting/user_permission_modal.ejs');

+ 4 - 0
app/lib/ledger.js

@@ -61,6 +61,10 @@ class billsTree {
         return children;
     };
 
+    getNodeSerialNo(node) {
+        return this.nodes.indexOf(node);
+    }
+
     /**
      * 树结构根据显示排序
      */

+ 34 - 10
app/lib/rpt_data_analysis.js

@@ -641,6 +641,7 @@ const gatherStagePay = {
             {name: '本期完成计量', ptype: 4, order: 1, visible: false},
             {name: '业主违约罚金', match: '业主违约罚金', order: 2},
             {name: '迟付款利息', match: '迟付款利息', order: 3},
+            {flow: true, minus: 0, rid: ['业主违约罚金', '迟付款利息'], order: 4},
             {name: '其他付款', minus: 0, rid: ['业主违约罚金', '迟付款利息'], order: 4},
             {name: '合计', order: 5, order_calc: 'o1+o2+o3+o4', },
             {name: '动员预付款', order: 6},
@@ -655,7 +656,7 @@ const gatherStagePay = {
             {name: '支付', ptype: 2, order: 15},
         ]
     },
-    _gatherFields: function (ctx, d, source, calcFields) {
+    _filterFields: function (ctx, d, source) {
         let filterData = source;
         if (d.ptype) {
             filterData = filterData.filter(function (x) {
@@ -664,12 +665,16 @@ const gatherStagePay = {
         }
         if (d.match) {
             filterData = filterData.filter(function (x) {
-                if (d.match instanceof Array) {
-                    for (const m of d.match) {
-                        if (x.name.indexOf(m) >= 0) return true;
+                if (x.name) {
+                    if (d.match instanceof Array) {
+                        for (const m of d.match) {
+                            if (x.name.indexOf(m) >= 0) return true;
+                        }
+                    } else {
+                        return x.name.indexOf(d.match) >= 0;
                     }
                 } else {
-                    return x.name.indexOf(d.match) >= 0;
+                    return false;
                 }
             });
         }
@@ -680,12 +685,18 @@ const gatherStagePay = {
         }
         if (d.rid) {
             filterData = filterData.filter(function (x) {
-                for (const r of d.rid) {
-                    if (x.name.indexOf(r) >= 0) return false;
+                if (x.name) {
+                    for (const r of d.rid) {
+                        if (x.name.indexOf(r) >= 0) return false;
+                    }
                 }
                 return true;
             });
         }
+        return filterData;
+    },
+    _gatherFields: function (ctx, d, source, calcFields) {
+        const filterData = this._filterFields(ctx, d, source);
         for (const fd of filterData) {
             for (const prop in fd) {
                 if (prop.indexOf('tp') >= 0) {
@@ -702,15 +713,28 @@ const gatherStagePay = {
         const result = [], calcFields = [];
         for (const c of options.custom) {
             const cData = JSON.parse(JSON.stringify(c));
-            if (!cData.order_calc && cData.empty !== 1) {
-                this._gatherFields(ctx, cData, gatherData, calcFields);
+            cData.subOrder = 0;
+            if (cData.flow) {
+                const fData = this._filterFields(ctx, cData, gatherData);
+                for (const [i, f] of fData.entries()) {
+                    f.order = cData.order;
+                    f.subOrder = i;
+                    result.push(fData);
+                }
+            } else {
+                if (!cData.order_calc && cData.empty !== 1) {
+                    this._gatherFields(ctx, cData, gatherData, calcFields);
+                }
+                result.push(cData);
             }
-            result.push(cData);
         }
         rdaUtils.orderCalc(ctx, result, calcFields);
         data[options.table] = result.filter(function (x) {
             return x.visible === undefined || x.visible;
         });
+        data[options.table].sort(function (a, b) {
+            return a.order === b.order ? a.subOrder - b.subOrder : a.order - b.order;
+        })
     },
 };
 const union = {

+ 144 - 93
app/lib/stage_im.js

@@ -14,7 +14,7 @@ const mergeChar = ';';
 const version = '1.0';
 
 class StageIm {
-    constructor (ctx) {
+    constructor(ctx) {
         const self = this;
         this.ctx = ctx;
         this._ = this.ctx.helper._;
@@ -28,7 +28,7 @@ class StageIm {
             keys: ['id', 'tender_id', 'ledger_id'],
             stageId: 'id',
             calcFields: ['deal_tp', 'total_price', 'contract_tp', 'qc_tp', 'gather_tp'],
-            calc: function (node) {
+            calc(node) {
                 if (node.children && node.children.length === 0) {
                     node.pre_gather_qty = self.ctx.helper.add(node.pre_contract_qty, node.pre_qc_qty);
                     node.gather_qty = self.ctx.helper.add(node.contract_qty, node.qc_qty);
@@ -41,18 +41,18 @@ class StageIm {
                 node.end_contract_tp = self.ctx.helper.add(node.pre_contract_tp, node.contract_tp);
                 node.end_qc_tp = self.ctx.helper.add(node.pre_qc_tp, node.qc_tp);
                 node.end_gather_tp = self.ctx.helper.add(node.pre_gather_tp, node.gather_tp);
-            }
+            },
         });
         this.pos = new Ledger.pos({
             id: 'id', ledgerId: 'lid',
             updateFields: ['contract_qty', 'qc_qty', 'postil'],
-            calc: function (p) {
+            calc(p) {
                 p.pre_gather_qty = self.ctx.helper.add(p.pre_contract_qty, p.pre_qc_qty);
                 p.gather_qty = self.ctx.helper.add(p.contract_qty, p.qc_qty);
                 p.end_contract_qty = self.ctx.helper.add(p.pre_contract_qty, p.contract_qty);
                 p.end_qc_qty = self.ctx.helper.add(p.pre_qc_qty, p.qc_qty);
                 p.end_gather_qty = self.ctx.helper.add(p.pre_gather_qty, p.gather_qty);
-            }
+            },
         });
         // relaData
         this.change = null;
@@ -66,49 +66,49 @@ class StageIm {
     }
 
     // 加载数据
-    async _loadMainData () {
+    async _loadMainData() {
         const billsData = await this.ctx.service.ledger.getData(this.ctx.tender.id);
         if (this.ctx.stage.readOnly) {
             const curStage = await this.ctx.service.stageBills.getAuditorStageData(this.ctx.tender.id,
                 this.ctx.stage.id, this.ctx.stage.curTimes, this.ctx.stage.curOrder);
             this.ctx.helper.assignRelaData(billsData, [
-                {data: curStage, fields: ['contract_qty', 'contract_tp', 'qc_qty', 'qc_tp'], prefix: '', relaId: 'lid'}
+                { data: curStage, fields: ['contract_qty', 'contract_tp', 'qc_qty', 'qc_tp'], prefix: '', relaId: 'lid' },
             ]);
         } else {
             const curStage = await this.ctx.service.stageBills.getLastestStageData(this.ctx.tender.id, this.ctx.stage.id);
             this.ctx.helper.assignRelaData(billsData, [
-                {data: curStage, fields: ['contract_qty', 'contract_tp', 'qc_qty', 'qc_tp'], prefix: '', relaId: 'lid'}
+                { data: curStage, fields: ['contract_qty', 'contract_tp', 'qc_qty', 'qc_tp'], prefix: '', relaId: 'lid' },
             ]);
         }
         const preStage = this.ctx.stage.order > 1 ? await this.ctx.service.stageBillsFinal.getFinalData(this.ctx.tender, this.ctx.stage.order - 1) : [];
 
         this.ctx.helper.assignRelaData(billsData, [
-            {data: preStage, fields: ['contract_qty', 'contract_tp', 'qc_qty', 'qc_tp'], prefix: 'pre_', relaId: 'lid'}
+            { data: preStage, fields: ['contract_qty', 'contract_tp', 'qc_qty', 'qc_tp'], prefix: 'pre_', relaId: 'lid' },
         ]);
         this.billsTree.loadDatas(billsData);
         this.billsTree.calculateAll();
 
-        const posData = await this.ctx.service.pos.getAllDataByCondition({ where: {tid: this.ctx.tender.id }});
+        const posData = await this.ctx.service.pos.getAllDataByCondition({ where: { tid: this.ctx.tender.id } });
         if (this.ctx.stage.readOnly) {
             const curPosStage = await this.ctx.service.stagePos.getAuditorStageData2(this.ctx.tender.id,
                 this.ctx.stage.id, this.ctx.stage.curTimes, this.ctx.stage.curOrder);
             this.ctx.helper.assignRelaData(posData, [
-                {data: curPosStage, fields: ['contract_qty', 'qc_qty'], prefix: '', relaId: 'pid'}
+                { data: curPosStage, fields: ['contract_qty', 'qc_qty'], prefix: '', relaId: 'pid' },
             ]);
         } else {
             const curPosStage = await this.ctx.service.stagePos.getLastestStageData2(this.ctx.tender.id, this.ctx.stage.id);
             this.ctx.helper.assignRelaData(posData, [
-                {data: curPosStage, fields: ['contract_qty', 'qc_qty'], prefix: '', relaId: 'pid'}
+                { data: curPosStage, fields: ['contract_qty', 'qc_qty'], prefix: '', relaId: 'pid' },
             ]);
         }
         const prePosStage = this.ctx.stage.order > 1 ? await this.ctx.service.stagePosFinal.getFinalData(this.ctx.tender, this.ctx.stage.order - 1) : [];
         this.ctx.helper.assignRelaData(posData, [
-            {data: prePosStage, fields: ['contract_qty', 'qc_qty'], prefix: 'pre_', relaId: 'pid'}
+            { data: prePosStage, fields: ['contract_qty', 'qc_qty'], prefix: 'pre_', relaId: 'pid' },
         ]);
         this.pos.loadDatas(posData);
         this.pos.calculateAll();
     }
-    async _loadRelaData () {
+    async _loadRelaData() {
         if (this.ctx.stage.readOnly) {
             this.details = await this.ctx.service.stageDetail.getAuditorStageData(this.ctx.tender.id, this.ctx.stage.id, this.ctx.stage.curTimes, this.ctx.stage.curOrder);
         } else {
@@ -151,26 +151,26 @@ class StageIm {
         const result1 = text.match(pegReg1);
         if (result1) {
             return result1[0];
-        } else {
-            const pegReg2 = /[a-zA-Z]?[kK][0-9]+[++][0-9]{3}([.][0-9]+)?-[a-zA-Z]?[kK][0-9]+[++][0-9]{3}([.][0-9]+)?/;
-            const result2 = text.match(pegReg2);
-            if (result2) {
-                return result2[0];
-            } else {
-                const pegReg3 = /[a-zA-Z]?[kK][0-9]+[++][0-9]{3}([.][0-9]+)?/;
-                const result3 = text.match(pegReg3);
-                return result3 ? result3[0] : '';
-            }
         }
+        const pegReg2 = /[a-zA-Z]?[kK][0-9]+[++][0-9]{3}([.][0-9]+)?-[a-zA-Z]?[kK][0-9]+[++][0-9]{3}([.][0-9]+)?/;
+        const result2 = text.match(pegReg2);
+        if (result2) {
+            return result2[0];
+        }
+        const pegReg3 = /[a-zA-Z]?[kK][0-9]+[++][0-9]{3}([.][0-9]+)?/;
+        const result3 = text.match(pegReg3);
+        return result3 ? result3[0] : '';
+
+
     }
-    _getPegNode (node) {
+    _getPegNode(node) {
         if (node) {
             if (this._checkPeg(node.name)) {
                 return node;
-            } else {
-                const parent = this.billsTree.getParent(node);
-                return parent ? this._getPegNode(parent) : null;
             }
+            const parent = this.billsTree.getParent(node);
+            return parent ? this._getPegNode(parent) : null;
+
         }
     }
     _getDrawingCode(node) {
@@ -178,10 +178,9 @@ class StageIm {
             return '';
         } else if (node.drawing_code) {
             return node.drawing_code;
-        } else {
-            const parent = this.billsTree.getParent(node);
-            return parent ? this._getDrawingCode(parent) : '';
         }
+        const parent = this.billsTree.getParent(node);
+        return parent ? this._getDrawingCode(parent) : '';
     }
     _getZlNormalBw(node, peg) {
         if (peg) {
@@ -195,20 +194,21 @@ class StageIm {
                 }
             }
             return result;
-        } else {
-            if (node.level === 2 || node.level === 3) {
-                return node.name;
-            } else if (node.level >= 4) {
-                let parent = this.billsTree.getParent(node), result = parent.name;
-                while (parent.level > 3 && parent) {
-                    parent = this._getNodeByLevel(node, parent.level - 1);
-                    result = parent.name + mergeChar + result;
-                }
-                return result;
-            } else {
-                return '';
+        }
+        if (node.level === 2 || node.level === 3) {
+            return node.name;
+        } else if (node.level >= 4) {
+            let parent = this.billsTree.getParent(node),
+                result = parent.name;
+            while (parent.level > 3 && parent) {
+                parent = this._getNodeByLevel(node, parent.level - 1);
+                result = parent.name + mergeChar + result;
             }
+            return result;
         }
+        return '';
+
+
     }
     _getZlGatherBw(node, peg) {
         if (peg) {
@@ -218,23 +218,22 @@ class StageIm {
                 result = result + mergeChar + subPeg1.name;
             }
             return result;
-        } else {
-            if (node.level < 3) {
-                return node.name;
-            } else {
-                let parent = node, result = parent.name;
-                while (parent.level > 3 && parent) {
-                    parent = this._getNodeByLevel(node, parent.level - 1);
-                    result = parent.name + mergeChar + result;
-                }
-                return result;
-            }
         }
+        if (node.level < 3) {
+            return node.name;
+        }
+        let parent = node,
+            result = parent.name;
+        while (parent.level > 3 && parent) {
+            parent = this._getNodeByLevel(node, parent.level - 1);
+            result = parent.name + mergeChar + result;
+        }
+        return result;
     }
 
     _checkCustomDetail(im) {
         const self = this;
-        const cd = this._.find(this.details, function (d) {
+        const cd = this._.find(this.details, function(d) {
             return im.lid === d.lid &&
                 (!im.code || im.code === d.code) &&
                 (!im.name || im.name === d.name) &&
@@ -243,7 +242,7 @@ class StageIm {
                 (!im.pid || im.pid === d.pid);
         });
         if (cd) {
-            this._.assignInWith(im, cd, function (oV, sV, key) {
+            this._.assignInWith(im, cd, function(oV, sV, key) {
                 return self.imFields.indexOf(key) > -1 && sV !== undefined && sV !== null ? sV : oV;
             });
         }
@@ -264,17 +263,17 @@ class StageIm {
             const memo = [];
             for (const [i, b] of im.gclBills.entries()) {
                 if (b.pos && b.pos.length > 0) {
-                    memo.push('清单' + (i+1) + ':' + b.b_code + ' ' + b.name);
+                    memo.push('清单' + (i + 1) + ':' + b.b_code + ' ' + b.name);
                     for (const p of b.pos) {
                         memo.push(p.name + ':' + p.jl + ' ' + b.unit);
                     }
                 } else {
-                    memo.push('清单' + (i+1) + ':' + b.b_code + ' ' + b.name + ':' + b.jl + ' ' + b.unit);
+                    memo.push('清单' + (i + 1) + ':' + b.b_code + ' ' + b.name + ':' + b.jl + ' ' + b.unit);
                 }
             }
             im.calc_memo = memo.join('\n');
         } else {
-            im.calc_memo =  '';
+            im.calc_memo = '';
         }
     }
     _getChangeInfo(im) {
@@ -291,12 +290,12 @@ class StageIm {
             gclBills.pos = [];
         }
         const posRange = this.pos.getLedgerPos(node.id);
-        if (!posRange) { return }
+        if (!posRange) { return; }
         for (const p of posRange) {
             if (!p.gather_qty || this.ctx.helper.checkZero(p.gather_qty)) { continue; }
-            let lp = this._.find(gclBills.pos, {name: p.name});
+            let lp = this._.find(gclBills.pos, { name: p.name });
             if (!lp) {
-                lp = {name: p.name};
+                lp = { name: p.name };
                 gclBills.pos.push(lp);
             }
             lp.jl = this.ctx.helper.add(lp.jl, p.gather_qty);
@@ -315,25 +314,38 @@ class StageIm {
                 if ((!p.contract_tp || p.contract_tp === 0) && (!p.qc_tp || p.qc_tp === 0)) {
                     continue;
                 }
-                let b = this._.find(im.gclBills, {bid: p.id});
+                let b = this._.find(im.gclBills, { bid: p.id });
                 if (!b) {
-                    b = {imid: im.id, bid: p.id, b_code: p.b_code, name: p.name, unit: p.unit, unit_price: p.unit_price};
+                    b = { imid: im.id, bid: p.id, b_code: p.b_code, name: p.name, unit: p.unit, unit_price: p.unit_price };
                     im.gclBills.push(b);
                     this.ImBillsData.push(b);
                 }
                 b.quantity = this.ctx.helper.add(b.quantity, p.quantity);
+                b.total_price = this.ctx.helper.add(b.total_price, p.total_price);
 
                 b.jl = this.ctx.helper.add(b.jl, p.gather_qty);
                 b.contract_jl = this.ctx.helper.add(b.contract_jl, p.contract_qty);
                 b.qc_jl = this.ctx.helper.add(b.qc_jl, p.qc_qty);
 
+                b.tp = this.ctx.helper.add(b.tp, p.gather_tp);
+                b.contract_tp = this.ctx.helper.add(b.contract_tp, p.contract_tp);
+                b.qc_tp = this.ctx.helper.add(b.qc_tp, p.qc_tp);
+
                 b.pre_jl = this.ctx.helper.add(b.pre_jl, p.pre_gather_qty);
                 b.pre_contract_jl = this.ctx.helper.add(b.pre_contract_jl, p.pre_contract_qty);
                 b.pre_qc_jl = this.ctx.helper.add(b.pre_qc_jl, p.pre_qc_qty);
 
+                b.pre_tp = this.ctx.helper.add(b.pre_tp, p.pre_gather_tp);
+                b.pre_contract_tp = this.ctx.helper.add(b.pre_contract_tp, p.pre_contract_tp);
+                b.pre_qc_tp = this.ctx.helper.add(b.pre_qc_tp, p.pre_qc_tp);
+
                 b.end_jl = this.ctx.helper.add(b.end_jl, p.end_gather_qty);
                 b.end_contract_jl = this.ctx.helper.add(b.end_contract_jl, p.end_contract_qty);
                 b.end_qc_jl = this.ctx.helper.add(b.end_qc_jl, p.end_qc_qty);
+
+                b.end_tp = this.ctx.helper.add(b.end_tp, p.end_gather_tp);
+                b.end_contract_tp = this.ctx.helper.add(b.end_contract_tp, p.end_contract_tp);
+                b.end_qc_tp = this.ctx.helper.add(b.end_qc_tp, p.end_qc_tp);
                 this._generateTzPosData(p, b);
             }
         }
@@ -381,8 +393,9 @@ class StageIm {
      * 生成 0号台账 中间计量数据
      * @param {Object} node - 生成中间计量表的节点
      */
-    _generateTzImData (node) {
+    _generateTzImData(node) {
         if (node.gather_tp) {
+            const nodeIndex = this.billsTree.getNodeSerialNo(node);
             const peg = this._getPegNode(node);
             const im = {
                 id: this.ImData.length + 1,
@@ -392,6 +405,7 @@ class StageIm {
                 end_jl: node.end_gather_tp, end_contract_jl: node.end_contract_tp, end_qc_jl: node.end_qc_tp,
                 peg: peg ? this._getPegStr(peg.name) : '', drawing_code: this._getDrawingCode(node),
                 position: '',
+                lIndex: nodeIndex,
             };
             if (this.ctx.stage.im_gather && node.check) {
                 im.bw = this._getZlGatherBw(node, peg);
@@ -413,12 +427,12 @@ class StageIm {
             lx.pos = [];
         }
         const posRange = this.pos.getLedgerPos(node.id);
-        if (!posRange) { return }
+        if (!posRange) { return; }
         for (const p of posRange) {
             if (!p.gather_qty || this.ctx.helper.checkZero(p.gather_qty)) { continue; }
-            let lp = this._.find(lx.pos, {name: p.name});
+            let lp = this._.find(lx.pos, { name: p.name });
             if (!lp) {
-                lp = {name: p.name};
+                lp = { name: p.name };
                 lx.pos.push(lp);
             }
             lp.jl = this.ctx.helper.add(lp.jl, p.gather_qty);
@@ -431,13 +445,13 @@ class StageIm {
             im.leafXmjs = [];
         }
         const leafXmj = this.billsTree.getLeafXmjParent(node);
-        if (!leafXmj) { return }
-        let lx = this._.find(im.leafXmjs, {lxid: leafXmj.id});
+        if (!leafXmj) { return; }
+        let lx = this._.find(im.leafXmjs, { lxid: leafXmj.id });
         if (!lx) {
             lx = {
                 lxid: leafXmj.id,
                 code: leafXmj.code,
-                name: leafXmj.name
+                name: leafXmj.name,
             };
             im.leafXmjs.push(lx);
         }
@@ -477,14 +491,16 @@ class StageIm {
      * 生成 总量控制 中间计量数据
      * @param {Object} node - 生成中间计量表的节点
      */
-    _generateZlImData (node) {
+    _generateZlImData(node) {
         const self = this;
         const nodeImData = [], posterity = this.billsTree.getPosterity(node);
+        const nodeIndex = this.billsTree.getNodeSerialNo(node);
         for (const p of posterity) {
-            if (p.children && p.children.length > 0 ) { continue; }
-            if (!p.b_code || p.b_code === '') { continue }
-            if (this.ctx.helper.checkZero(p.contract_qty) && this.ctx.helper.checkZero(p.qc_qty) ) { continue; }
-            let im = nodeImData.find(function (d) {
+            if (p.children && p.children.length > 0) { continue; }
+            if (!p.b_code || p.b_code === '') { continue; }
+            if (!p.gather_tp || p.gather_tp === 0) { continue; }
+            // if (this.ctx.helper.checkZero(p.contract_qty) && this.ctx.helper.checkZero(p.qc_qty)) { continue; }
+            let im = nodeImData.find(function(d) {
                 return d.lid === node.id &&
                     d.code === p.b_code && p.name === d.name && p.unit === d.unit &&
                     self.ctx.helper.checkZero(self.ctx.helper.sub(p.unit_price, d.unit_price));
@@ -494,12 +510,16 @@ class StageIm {
                 im = {
                     id: this.ImData.length + 1,
                     lid: node.id, pid: '', code: p.b_code, name: p.name, unit: p.unit, unit_price: p.unit_price,
-                    quantity: 0,
+                    quantity: 0, total_price: 0,
                     jl: 0, contract_jl: 0, qc_jl: 0,
                     pre_jl: 0, pre_contract_jl: 0, pre_qc_jl: 0,
                     end_jl: 0, end_contract_jl: 0, end_qc_jl: 0,
+                    tp: 0, contract_tp: 0, qc_tp: 0,
+                    pre_tp: 0, pre_contract_tp: 0, pre_qc_tp: 0,
+                    end_tp: 0, end_contract_tp: 0, end_qc_tp: 0,
                     peg: peg ? this._getPegStr(peg.name) : '',
                     position: '',
+                    lIndex: nodeIndex,
                 };
                 if (this.ctx.stage.im_gather && node.check) {
                     im.check = true;
@@ -516,37 +536,52 @@ class StageIm {
                 this._checkCustomDetail(im);
                 this.ImData.push(im);
             }
-            //if (!this.ctx.stage.im_gather || !node.check) {
-                this._generateZlLeafXmjData(p, im, 'gather_qty');
-            //}
+            // if (!this.ctx.stage.im_gather || !node.check) {
+            this._generateZlLeafXmjData(p, im, 'gather_qty');
+            // }
             this._generateZlChangeData(p, im);
             im.quantity = this.ctx.helper.add(im.quantity, p.quantity);
+            im.total_price = this.ctx.helper.add(im.total_price, p.total_price);
 
             im.jl = this.ctx.helper.add(im.jl, p.gather_qty);
             im.contract_jl = this.ctx.helper.add(im.contract_jl, p.contract_qty);
             im.qc_jl = this.ctx.helper.add(im.qc_jl, p.qc_qty);
 
+            im.tp = this.ctx.helper.add(im.tp, p.gather_tp);
+            im.contract_tp = this.ctx.helper.add(im.contract_tp, p.contract_tp);
+            im.qc_tp = this.ctx.helper.add(im.qc_tp, p.qc_tp);
+
             im.pre_jl = this.ctx.helper.add(im.pre_jl, p.pre_gather_qty);
             im.pre_contract_jl = this.ctx.helper.add(im.pre_contract_jl, p.pre_contract_qty);
             im.pre_qc_jl = this.ctx.helper.add(im.pre_qc_jl, p.pre_qc_qty);
 
+            im.pre_tp = this.ctx.helper.add(im.pre_tp, p.pre_gather_tp);
+            im.pre_contract_tp = this.ctx.helper.add(im.pre_contract_tp, p.pre_contract_tp);
+            im.pre_qc_tp = this.ctx.helper.add(im.pre_qc_tp, p.pre_qc_tp);
+
             im.end_jl = this.ctx.helper.add(im.end_jl, p.end_gather_qty);
             im.end_contract_jl = this.ctx.helper.add(im.end_contract_jl, p.end_contract_qty);
             im.end_qc_jl = this.ctx.helper.add(im.end_qc_jl, p.end_qc_qty);
+
+            im.end_tp = this.ctx.helper.add(im.end_tp, p.end_gather_tp);
+            im.end_contract_tp = this.ctx.helper.add(im.end_contract_tp, p.end_contract_tp);
+            im.end_qc_tp = this.ctx.helper.add(im.end_qc_tp, p.end_qc_tp);
         }
     }
 
-    _generateBwImData (node) {
+    _generateBwImData(node) {
+        const tp_decimal = this.ctx.tender.info.decimal.tp;
         const posterity = this.billsTree.getPosterity(node);
         for (const p of posterity) {
-            if (p.children && p.children.length > 0 ) { continue; }
-            if (!p.b_code || p.b_code === '') { continue }
+            if (p.children && p.children.length > 0) { continue; }
+            if (!p.b_code || p.b_code === '') { continue; }
             const peg = this._getPegNode(node);
             const pPos = this.pos.getLedgerPos(p.id);
             const bw = this._getZlNormalBw(node, peg);
             if (pPos && pPos.length > 0) {
+                const nodeIndex = this.billsTree.getNodeSerialNo(node);
                 for (const pp of pPos) {
-                    if (this.ctx.helper.checkZero(pp.contract_qty) && this.ctx.helper.checkZero(pp.qc_qty)) { continue }
+                    if (this.ctx.helper.checkZero(pp.contract_qty) && this.ctx.helper.checkZero(pp.qc_qty)) { continue; }
                     const im = {
                         id: this.ImData.length + 1,
                         lid: node.id, code: p.b_code, name: p.name, unit: p.unit, unit_price: p.unit_price, pid: pp.id,
@@ -554,13 +589,24 @@ class StageIm {
                         jl: pp.gather_qty, contract_jl: pp.contract_qty, qc_jl: pp.qc_qty,
                         pre_jl: pp.pre_gather_qty, pre_contract_jl: pp.pre_contract_qty, pre_qc_jl: pp.pre_qc_qty,
                         end_jl: pp.end_gather_qty, end_contract_jl: pp.end_contract_qty, end_qc_jl: pp.end_qc_qty,
-                        bw: bw,
+                        bw,
                         peg: this._checkPeg(pp.name) ? this._getPegStr(pp.name) : (peg ? this._getPegStr(peg.name) : ''),
                         xm: pp.name,
                         drawing_code: pp.drawing_code,
                         changes: [],
                         position: pp.position,
+                        lIndex: nodeIndex * 1000 + pp.porder,
                     };
+                    im.total_price = this.ctx.helper.mul(im.quantity, im.unit_price, tp_decimal);
+                    im.tp = this.ctx.helper.mul(im.jl, im.unit_price, tp_decimal);
+                    im.contract_tp = this.ctx.helper.mul(im.contract_jl, im.unit_price, tp_decimal);
+                    im.qc_tp = this.ctx.helper.mul(im.pre_qc_jl, im.unit_price, tp_decimal);
+                    im.pre_tp = this.ctx.helper.mul(im.pre_jl, im.unit_price, tp_decimal);
+                    im.pre_contract_tp = this.ctx.helper.mul(im.pre_contract_jl, im.unit_price, tp_decimal);
+                    im.pre_qc_tp = this.ctx.helper.mul(im.pre_qc_jl, im.unit_price, tp_decimal);
+                    im.end_tp = this.ctx.helper.mul(im.end_jl, im.unit_price, tp_decimal);
+                    im.end_contract_tp = this.ctx.helper.mul(im.end_contract_jl, im.unit_price, tp_decimal);
+                    im.end_qc_tp = this.ctx.helper.mul(im.end_qc_jl, im.unit_price, tp_decimal);
                     im.calc_memo = '本期计量:' + im.jl + ' ' + im.unit;
                     this._checkCustomDetail(im);
                     this.ImData.push(im);
@@ -573,21 +619,25 @@ class StageIm {
                     }
                 }
             } else {
-                if (this.ctx.helper.checkZero(p.contract_qty) && this.ctx.helper.checkZero(p.qc_qty)) { continue }
+                if (this.ctx.helper.checkZero(p.contract_qty) && this.ctx.helper.checkZero(p.qc_qty)) { continue; }
 
                 const im = {
                     id: this.ImData.length + 1,
                     lid: node.id, code: p.b_code, name: p.name, unit: p.unit, unit_price: p.unit_price, pid: '',
-                    quantity: p.quantity,
+                    quantity: p.quantity, total_price: p.total_price,
                     jl: p.gather_qty, contract_jl: p.contract_qty, qc_jl: p.qc_qty,
                     pre_jl: p.pre_gather_qty, pre_contract_jl: p.pre_contract_qty, pre_qc_jl: p.pre_qc_qty,
                     end_jl: p.end_gather_qty, end_contract_jl: p.end_contract_qty, end_qc_jl: p.end_qc_qty,
-                    bw: bw,
+                    tp: p.gather_tp, contract_tp: p.contract_tp, qc_tp: p.qc_tp,
+                    pre_tp: p.pre_gather_tp, pre_contract_tp: p.pre_contract_tp, pre_qc_tp: p.pre_qc_tp,
+                    end_tp: p.end_gather_tp, end_contract_tp: p.end_contract_tp, end_qc_tp: p.end_qc_tp,
+                    bw,
                     peg: peg ? this._getPegStr(peg.name) : '',
                     xm: node.name,
                     drawing_code: this._getDrawingCode(p),
                     changes: [],
                     position: '',
+                    lIndex: this.billsTree.getNodeSerialNo(node),
                 };
                 im.calc_memo = '本期计量:' + im.jl + ' ' + im.unit;
                 this._checkCustomDetail(im);
@@ -607,7 +657,7 @@ class StageIm {
      * 递归 生成中间计量表
      * @param {Array} nodes
      */
-    _recursiveBuildImData (nodes) {
+    _recursiveBuildImData(nodes) {
         if (!nodes || nodes.length === 0) { return; }
         for (const node of nodes) {
             if (this.billsTree.isLeafXmj(node) || (this.ctx.stage.im_type !== imType.bw.value && this.ctx.stage.im_gather && node.check)) {
@@ -625,7 +675,7 @@ class StageIm {
     }
 
     // 生成中间计量数据
-    async buildImData () {
+    async buildImData() {
         const self = this;
         // 初始化
         await this._loadMainData();
@@ -637,8 +687,9 @@ class StageIm {
         this._recursiveBuildImData(this.billsTree.children);
         // 排序
         if (this.ctx.stage.im_type !== imType.tz.value) {
-            this.ImData.sort(function (x, y) {
-                return self.ctx.helper.compareCode(x.code, y.code);
+            this.ImData.sort(function(x, y) {
+                const iCode = self.ctx.helper.compareCode(x.code, y.code);
+                return iCode === 0 ? x.lIndex - y.lIndex : iCode;
             });
         }
         // 生成数据(需要缓存,并清理缓存)
@@ -661,4 +712,4 @@ class StageIm {
     }
 }
 
-module.exports = StageIm;
+module.exports = StageIm;

+ 1 - 1
app/middleware/auto_logger.js

@@ -26,7 +26,7 @@ module.exports = options => {
                 method: this.method,
                 user: this.session.sessionUser,
                 project: this.session.sessionProject,
-                data: this.body,
+                data: this.request.body,
             };
             bLogger.info(JSON.stringify(logData));
         } else {

+ 5 - 0
app/middleware/session_auth.js

@@ -38,6 +38,9 @@ module.exports = options => {
             yield this.service.notify.syncNotifyData();
             // 同步系统维护信息
             yield this.service.maintain.syncMaintainData();
+            if (this.session === null) {
+                throw '系统维护中~';
+            }
         } catch (error) {
             console.log(error);
             if (this.helper.isAjax(this.request)) {
@@ -46,6 +49,8 @@ module.exports = options => {
                     msg: '登录信息异常,请重新登录',
                     data: '',
                 };
+            } else if (this.session === null) {
+                return this.redirect('/login?referer=' + this.url);
             } else {
                 this.session.message = {
                     type: messageType.ERROR,

+ 12 - 3
app/middleware/stage_check.js

@@ -55,7 +55,9 @@ module.exports = options => {
             });
             // 权限相关
             // todo 校验权限 (标段参与人、分享)
-            const accountId = this.session.sessionUser.accountId, auditorIds = _.map(stage.auditors, 'aid'), shareIds = [];
+            const accountId = this.session.sessionUser.accountId,
+                auditorIds = _.map(stage.auditors, 'aid'),
+                shareIds = [];
             const permission = this.session.sessionUser.permission;
             if (accountId === stage.user_id) { // 原报
                 if (stage.curAuditor) {
@@ -80,7 +82,7 @@ module.exports = options => {
                     stage.curOrder = _.max(_.map(stage.auditors, 'order'));
                 } else if (stage.status === status.checkNo) {
                     const audit = yield this.service.stageAudit.getDataByCondition({
-                        sid: stage.id, times: stage.times - 1, status: status.checkNo
+                        sid: stage.id, times: stage.times - 1, status: status.checkNo,
                     });
                     stage.curOrder = audit.order;
                 } else {
@@ -93,7 +95,14 @@ module.exports = options => {
                 }
                 stage.readOnly = true;
                 stage.curTimes = stage.status === status.checkNo ? stage.times - 1 : stage.times;
-                stage.curOrder = stage.status === status.checked ? _.max(_.map(stage.auditors, 'order')) : stage.curAuditor.order - 1;
+                if (stage.status === status.checkNo) {
+                    const audit = yield this.service.stageAudit.getDataByCondition({
+                        sid: stage.id, times: stage.times - 1, status: status.checkNo,
+                    });
+                    stage.curOrder = audit.order;
+                } else {
+                    stage.curOrder = stage.status === status.checked ? _.max(_.map(stage.auditors, 'order')) : stage.curAuditor.order - 1;
+                }
             } else { // 其他不可见
                 throw '您无权查看该数据';
             }

+ 72 - 0
app/public/js/ledger_bwtz.js

@@ -0,0 +1,72 @@
+'use strict';
+
+/**
+ *
+ *
+ * @author Mai
+ * @date
+ * @version
+ */
+
+$(document).ready(() => {
+    const preUrl = window.location.pathname.split('/').slice(0, 4).join('/');
+    autoFlashHeight();
+    const xmjSpread = SpreadJsObj.createNewSpread($('#xmj-spread')[0]);
+    const xmjSheet = xmjSpread.getActiveSheet();
+    sjsSettingObj.setFxTreeStyle(xmjSpreadSetting, sjsSettingObj.FxTreeStyle.jz);
+    SpreadJsObj.initSheet(xmjSheet, xmjSpreadSetting);
+
+    const unitSpread = SpreadJsObj.createNewSpread($('#unit-spread')[0]);
+    const unitSheet = unitSpread.getActiveSheet();
+    SpreadJsObj.initSheet(unitSheet, unitSpreadSetting);
+
+    const unitTreeObj = {
+        loadCurUnitData: function () {
+            const node = SpreadJsObj.getSelectObject(xmjSheet);
+            if (node && node.unitTree) {
+                SpreadJsObj.loadSheetData(unitSheet, SpreadJsObj.DataType.Tree, node.unitTree);
+            } else {
+                SpreadJsObj.initSheet(unitSheet, unitSpreadSetting);
+            }
+        }
+    };
+    xmjSpread.bind(spreadNS.Events.SelectionChanged, function (e, info) {
+        unitTreeObj.loadCurUnitData();
+    });
+
+    postData(preUrl + '/load', {}, function (result) {
+        billsPosConvertModel.loadData(result.bills, result.pos, [], decimal);
+        const xmjTree = billsPosConvertModel.convert();
+        SpreadJsObj.loadSheetData(xmjSheet, SpreadJsObj.DataType.Tree, xmjTree);
+        unitTreeObj.loadCurUnitData();
+    });
+
+    $.subMenu({
+        menu: '#sub-menu', miniMenu: '#sub-mini-menu', miniMenuList: '#mini-menu-list',
+        toMenu: '#to-menu', toMiniMenu: '#to-mini-menu',
+        key: 'menu.1.0.0',
+        miniHint: '#sub-mini-hint', hintKey: 'menu.hint.1.0.1',
+        callback: function (info) {
+            if (info.mini) {
+                $('.panel-title').addClass('fluid');
+                $('#sub-menu').removeClass('panel-sidebar');
+            } else {
+                $('.panel-title').removeClass('fluid');
+                $('#sub-menu').addClass('panel-sidebar');
+            }
+            autoFlashHeight();
+            xmjSpread.refresh();
+            unitSpread.refresh();
+        }
+    });
+    // 加载上下窗口resizer
+    $.divResizer({
+        select: '#main-resize',
+        callback: function () {
+            xmjSpread.refresh();
+            let bcontent = $(".bcontent-wrap") ? $(".bcontent-wrap").height() : 0;
+            $(".sp-wrap").height(bcontent-30);
+            unitSpread.refresh();
+        }
+    });
+});

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

@@ -347,6 +347,9 @@ const createNewPathTree = function (type, setting) {
         getItems(id) {
             return this.items[itemsPre + id];
         };
+        getNodeIndex(node) {
+            return this.nodes.indexOf(node);
+        }
         /**
          * 查找node的parent
          * @param {Object} node

File diff suppressed because it is too large
+ 1 - 1
app/public/js/spreadjs_rela/spreadjs_zh.js


+ 9 - 1
app/public/js/stage_im.js

@@ -405,6 +405,7 @@ const stageIm = (function () {
      */
     function generateTzImData (node) {
         if (node.gather_tp) {
+            const nodeIndex = gsTree.getNodeIndex(node);
             const peg = getPegNode(node);
             const im = {
                 lid: node.id, pid: '', code: node.code,
@@ -412,6 +413,7 @@ const stageIm = (function () {
                 //im_code: getNewImCode(),
                 peg: peg ? getPegStr(peg.name) : '', drawing_code: getDrawingCode(node),
                 position: '',
+                lIndex: nodeIndex,
             };
             if (stage.im_gather && node.check) {
                 im.bw = getZlGatherBw(node, peg);
@@ -500,6 +502,7 @@ const stageIm = (function () {
      */
     function generateZlImData (node) {
         const nodeImData = [], posterity = gsTree.getPosterity(node);
+        const nodeIndex = gsTree.getNodeIndex(node);
         for (const p of posterity) {
             if (p.children && p.children.length > 0 ) { continue; }
             if (!p.b_code || p.b_code === '') { continue }
@@ -515,6 +518,7 @@ const stageIm = (function () {
                     jl: 0, contract_jl: 0, qc_jl: 0,
                     peg: peg ? getPegStr(peg.name) : '',
                     position: '',
+                    lIndex: nodeIndex,
                 };
                 if (stage.im_gather && node.check) {
                     im.bw = getZlGatherBw(node, peg);
@@ -548,6 +552,7 @@ const stageIm = (function () {
             const pPos = gsPos.getLedgerPos(p.id);
             const bw = getZlNormalBw(node, peg);
             if (pPos && pPos.length > 0) {
+                const nodeIndex = gsTree.getNodeIndex(node);
                 for (const pp of pPos) {
                     if ((!pp.contract_qty || pp.contract_qty === 0) && (!pp.qc_qty || pp.qc_qty === 0)) { continue }
                     const im = {
@@ -560,6 +565,7 @@ const stageIm = (function () {
                         drawing_code: pp.drawing_code,
                         changes: [],
                         position: pp.position,
+                        lIndex: nodeIndex,
                     };
                     im.calc_memo = '本期计量:' + im.jl + ' ' + im.unit;
                     checkCustomDetail(im);
@@ -585,6 +591,7 @@ const stageIm = (function () {
                     drawing_code: getDrawingCode(p),
                     changes: [],
                     position: '',
+                    lIndex: gsTree.getNodeIndex(node),
                 };
                 im.calc_memo = '本期计量:' + im.jl + ' ' + im.unit;
                 checkCustomDetail(im);
@@ -636,7 +643,8 @@ const stageIm = (function () {
         recursiveBuildImData(gsTree.children);
         if (stage.im_type !== imType.tz.value) {
             ImData.sort(function (x, y) {
-                return compareCode(x.code, y.code);
+                const iCode = compareCode(x.code, y.code);
+                return iCode === 0 ? x.lIndex - y.lIndex : iCode;
             });
         }
         for (const [i, im] of ImData.entries()) {

+ 5 - 2
app/router.js

@@ -111,6 +111,9 @@ module.exports = app => {
     app.post('/tender/:id/ledger/audit/start', sessionAuth, tenderCheck, 'ledgerAuditController.start');
     app.post('/tender/:id/ledger/audit/check', sessionAuth, tenderCheck, 'ledgerAuditController.check');
 
+    // 部位台账
+    app.get('/tender/:id/ledger/bwtz', sessionAuth, tenderCheck, 'ledgerController.bwtz');
+
     // 台账对比
     app.get('/tender/:id/ledger/gather', sessionAuth, tenderCheck, 'ledgerController.gather');
     app.post('/tender/:id/ledger/gather/load', sessionAuth, tenderCheck, 'ledgerController.loadGatherData');
@@ -120,7 +123,7 @@ module.exports = app => {
     app.post('/tender/:id/revise/add', sessionAuth, tenderCheck, 'reviseController.add');
     app.post('/tender/:id/revise/cancel', sessionAuth, tenderCheck, 'reviseController.cancel');
     app.post('/tender/:id/revise/save', sessionAuth, tenderCheck, 'reviseController.save');
-    //app.post('/tender/:id/revise/deal2sgfh', sessionAuth, tenderCheck, 'reviseController.deal2sgfh');
+    // app.post('/tender/:id/revise/deal2sgfh', sessionAuth, tenderCheck, 'reviseController.deal2sgfh');
     // 台账修订页面
     app.get('/tender/:id/revise/info', sessionAuth, tenderCheck, 'reviseController.info');
     app.post('/tender/:id/revise/auditors', sessionAuth, tenderCheck, 'reviseController.reviseAuditors');
@@ -162,7 +165,7 @@ module.exports = app => {
     app.post('/tender/:id/measure/stage/:order/pos', sessionAuth, tenderCheck, stageCheck, 'stageController.getStagePosData');
     app.post('/tender/:id/measure/stage/:order/update', sessionAuth, tenderCheck, stageCheck, 'stageController.updateStageData');
     app.post('/tender/:id/measure/stage/:order/valid-change', sessionAuth, tenderCheck, stageCheck, 'stageController.searchValidChange');
-    app.post('/tender/:id/measure/stage/:order/use-change',sessionAuth, tenderCheck, stageCheck, 'stageController.useChange');
+    app.post('/tender/:id/measure/stage/:order/use-change', sessionAuth, tenderCheck, stageCheck, 'stageController.useChange');
     // 计量附件
     app.post('/tender/:id/measure/stage/:order/upload/file', sessionAuth, tenderCheck, stageCheck, 'stageController.uploadFile');
     app.get('/tender/:id/measure/stage/:order/download/file/:fid', sessionAuth, 'stageController.downloadFile');

+ 6 - 3
app/service/maintain.js

@@ -48,6 +48,10 @@ module.exports = app => {
                     }
                 }
                 if (maintainData.status === status) {
+                    if (status === maintainConst.status.ongoing && this.ctx.session !== null) {
+                        this.ctx.session = null;
+                        throw '系统维护中~';
+                    }
                     return true;
                 }
                 const data = {};
@@ -57,10 +61,9 @@ module.exports = app => {
                     data.maintain_time = '';
                 }
                 const operate = this.db.update(this.tableName, data);
-
-                if (status === maintainConst.status.ongoing) {
+                if (status === maintainConst.status.ongoing && this.ctx.session !== null) {
                     this.ctx.session = null;
-                    this.ctx.redirect('/');
+                    throw '系统维护中~';
                 }
 
                 result = operate.affectedRows > 0;

+ 11 - 0
app/service/project_account.js

@@ -314,6 +314,17 @@ module.exports = app => {
             return info;
         }
 
+        async getListByProjectId(columns = '', pid) {
+            this.initSqlBuilder();
+            this.sqlBuilder.columns = columns !== '' ? columns : ['id', 'account', 'name', 'company', 'role', 'mobile', 'auth_mobile', 'telephone', 'enable', 'is_admin', 'account_group'];
+            this.sqlBuilder.setAndWhere('project_id', {
+                value: pid,
+                operate: '=',
+            });
+
+            return await this.getListWithBuilder();
+        }
+
         /**
          * 修改用户数据
          *

+ 3 - 3
app/service/report.js

@@ -109,15 +109,15 @@ module.exports = app => {
                             runnableKey.push(filter);
                             break;
                         case 'stage_jgcl':
-                            runnableRst.push(service.reportMemory.getStageJgcl(params.tender_id, param.stage_id, memFieldKeys[filter]));
+                            runnableRst.push(service.reportMemory.getStageJgcl(params.tender_id, params.stage_id, memFieldKeys[filter]));
                             runnableKey.push(filter);
                             break;
                         case 'stage_bonus':
-                            runnableRst.push(service.reportMemory.getStageBonus(params.tender_id, param.stage_id, memFieldKeys[filter]));
+                            runnableRst.push(service.reportMemory.getStageBonus(params.tender_id, params.stage_id, memFieldKeys[filter]));
                             runnableKey.push(filter);
                             break;
                         case 'stage_other':
-                            runnableRst.push(service.reportMemory.getStageOther(params.tender_id, param.stage_id, memFieldKeys[filter]));
+                            runnableRst.push(service.reportMemory.getStageOther(params.tender_id, params.stage_id, memFieldKeys[filter]));
                             runnableKey.push(filter);
                             break;
                         default:

+ 1 - 1
app/service/report_memory.js

@@ -773,7 +773,7 @@ module.exports = app => {
             await this.ctx.service.tender.checkTender(tid);
             await this.ctx.service.stage.checkStage(sid);
 
-            const data = await ctx.service.stageBonus.getEndStageData(this.ctx.stage.order);
+            const data = await this.ctx.service.stageBonus.getEndStageData(this.ctx.stage.order);
             return data;
         }
 

+ 16 - 9
app/service/stage.js

@@ -72,7 +72,14 @@ module.exports = app => {
                     }
                     stage.readOnly = true;
                     stage.curTimes = stage.status === status.checkNo ? stage.times - 1 : stage.times;
-                    stage.curOrder = stage.status === status.checked ? this._.max(this._.map(stage.auditors, 'order')) : stage.curAuditor.order - 1;
+                    if (stage.status === status.checkNo) {
+                        const audit = await this.service.stageAudit.getDataByCondition({
+                            sid: stage.id, times: stage.times - 1, status: status.checkNo,
+                        });
+                        stage.curOrder = audit.order;
+                    } else {
+                        stage.curOrder = stage.status === status.checked ? this._.max(this._.map(stage.auditors, 'order')) : stage.curAuditor.order - 1;
+                    }
                 }
 
                 this.ctx.stage = stage;
@@ -174,7 +181,7 @@ module.exports = app => {
          */
         async getValidStages(tenderId) {
             const stages = await this.db.select(this.tableName, {
-                where: {tid: tenderId},
+                where: { tid: tenderId },
                 orders: [['order', 'desc']],
             });
             for (const s of stages) {
@@ -216,21 +223,21 @@ module.exports = app => {
          */
         async addStage(tenderId, date, period) {
             const stages = await this.getAllDataByCondition({
-                where: {tid: tenderId},
+                where: { tid: tenderId },
                 order: ['order'],
             });
             const preStage = stages[stages.length - 1];
             if (stages.length > 0 && stages[stages.length - 1].status !== auditConst.status.checked) {
                 throw '上一期未审批通过,请等待上一期审批通过后,再新增数据';
-            };
+            }
             const order = stages.length + 1;
             const newStage = {
                 sid: this.uuid.v4(),
                 tid: tenderId,
-                order: order,
+                order,
                 in_time: new Date(),
                 s_time: date,
-                period: period,
+                period,
                 times: 1,
                 status: auditConst.status.uncheck,
                 user_id: this.ctx.session.sessionUser.accountId,
@@ -300,8 +307,8 @@ module.exports = app => {
         async saveStage(tenderId, order, date, period) {
             await this.db.update(this.tableName, {
                 s_time: date,
-                period: period,
-            }, { where: { tid: tenderId, order: order } });
+                period,
+            }, { where: { tid: tenderId, order } });
         }
 
         /**
@@ -314,7 +321,7 @@ module.exports = app => {
         async buildDetailData(tenderId, order, data) {
             const conn = await this.db.beginTransaction();
             try {
-                await conn.update(this.tableName, { im_type: data.im_type, im_pre: data.im_pre }, { where: { tid: tenderId, order: order } });
+                await conn.update(this.tableName, { im_type: data.im_type, im_pre: data.im_pre }, { where: { tid: tenderId, order } });
                 // to do 生成中间计量数据
                 await conn.commit();
             } catch (err) {

+ 2 - 2
app/view/dashboard/msg_add.ejs

@@ -17,8 +17,8 @@
                                 </div>
                                 <div class="form-group">
                                     <label>内容</label>
-                                    <div style="height: calc(100vh - 320px);">
-                                        <textarea id="content" name="content" class="form-control form-control-sm"><%- msgInfo.content %></textarea>
+                                    <div>
+                                        <textarea id="content" rows="15" name="content" class="form-control form-control-sm"><%- msgInfo.content %></textarea>
                                     </div>
                                 </div>
                             </div>

+ 79 - 0
app/view/ledger/bwtz.ejs

@@ -0,0 +1,79 @@
+<% include ../tender/tender_sub_menu.ejs %>
+<div class="panel-content">
+    <div class="panel-title">
+        <div class="title-main d-flex justify-content-between">
+            <% include ../tender/tender_sub_mini_menu.ejs %>
+            <div>
+                <div class="d-inline-block">
+                    部位台帐
+                </div>
+            </div>
+            <div class="ml-auto">
+            </div>
+        </div>
+    </div>
+    <div class="content-wrap">
+        <div class="c-header p-0"></div>
+        <div class="c-body">
+            <div class="sjs-height-1" id="xmj-spread">
+            </div>
+            <div class="bcontent-wrap" id="main-bottom">
+                <div id="main-resize" class="resize-y" r-Type="height" div1="#xmj-spread" div2="#main-bottom" store-id="stage-bwtz" store-version="1.0.0" min="100"></div>
+                <div class="bc-bar mb-1">
+                    <ul class="nav nav-tabs">
+                        <li class="nav-item">
+                            <a class="nav-link active" data-toggle="tab" href="#jldyjlqd" role="tab">计量单元/计量清单</a>
+                        </li>
+                    </ul>
+                </div>
+                <div class="sp-wrap" id="unit-spread">
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script>
+    const xmjSpreadSetting = {
+        cols: [
+            {title: '项目节编号', colSpan: '1', rowSpan: '2', field: 'code', hAlign: 0, width: 145, formatter: '@', cellType: 'tree'},
+            {title: '名称', colSpan: '1', rowSpan: '2', field: 'name', hAlign: 0, width: 185, formatter: '@'},
+            {title: '单位', colSpan: '1', rowSpan: '2', field: 'unit', hAlign: 1, width: 60, formatter: '@', cellType: 'unit'},
+            <% if (ctx.tender.info.display.ledger.dgnQty) { %>
+            {title: '项目节数量|数量1',  colSpan: '2|1', rowSpan: '1|1', field: 'dgn_qty1', hAlign: 2, width: 60, type: 'Number'},
+            {title: '|数量2',  colSpan: '|1', rowSpan: '|1', field: 'dgn_qty2', hAlign: 2, width: 60, type: 'Number'},
+            {title: '经济指标',  colSpan: '1', rowSpan: '2', field: 'dgn_price', hAlign: 2, width: 60, type: 'Number'},
+            <% } %>
+            {title: '台账金额', colSpan: '1', rowSpan: '2', field: 'total_price', hAlign: 2, width: 100, type: 'Number'},
+            {title: '图(册)号', colSpan: '1', rowSpan: '2', field: 'drawing_code', hAlign: 0, width: 100, formatter: '@'},
+            {title: '备注', colSpan: '1', rowSpan: '2', field: 'memo', hAlign: 0, width: 120, formatter: '@', cellType: 'ellipsisAutoTip'}
+        ],
+        emptyRows: 0,
+        headRows: 2,
+        headRowHeight: [25, 25],
+        defaultRowHeight: 21,
+        headerFont: '12px 微软雅黑',
+        font: '12px 微软雅黑',
+        readOnly: true,
+    };
+    const unitSpreadSetting = {
+        cols: [
+            {title: '计量单元', colSpan: '1', rowSpan: '2', field: 'pos_name', hAlign: 0, width: 120, formatter: '@', cellType: 'tree'},
+            {title: '清单编号', colSpan: '1', rowSpan: '2', field: 'b_code', hAlign: 0, width: 70, formatter: '@'},
+            {title: '名称', colSpan: '1', rowSpan: '2', field: 'name', hAlign: 0, width: 185, formatter: '@'},
+            {title: '单位', colSpan: '1', rowSpan: '2', field: 'unit', hAlign: 1, width: 60, formatter: '@', cellType: 'unit'},
+            {title: '单价', colSpan: '1', rowSpan: '2', field: 'unit_price', hAlign: 2, width: 60, type: 'Number'},
+            {title: '台账|数量', colSpan: '2|1', rowSpan: '1|1', field: 'quantity', hAlign: 2, width: 80, type: 'Number'},
+            {title: '|金额', colSpan: '|1', rowSpan: '|1', field: 'total_price', hAlign: 2, width: 80, type: 'Number'},
+            {title: '图(册)号', colSpan: '1', rowSpan: '2', field: 'drawing_code', hAlign: 0, width: 100, formatter: '@'},
+            {title: '备注', colSpan: '1', rowSpan: '2', field: 'memo', hAlign: 0, width: 120, formatter: '@', cellType: 'ellipsisAutoTip'},
+        ],
+        emptyRows: 0,
+        headRows: 2,
+        headRowHeight: [25, 25],
+        defaultRowHeight: 21,
+        headerFont: '12px 微软雅黑',
+        font: '12px 微软雅黑',
+        readOnly: true,
+    };
+    const decimal = <%- ctx.tender.info.decimal.tp %>;
+</script>

+ 2 - 0
app/view/measure/stage.ejs

@@ -22,6 +22,7 @@
                     <tr>
                         <th>期数</th>
                         <th class="text-center">计量月份</th>
+                        <th class="text-center">开始-截止日期</th>
                         <th class="text-center">本期合同计量</th>
                         <th class="text-center">本期数量变更计量</th>
                         <th class="text-center">本期完成计量</th>
@@ -41,6 +42,7 @@
                             <% } %>
                         </td>
                         <td class="text-center"><%- s.s_time %></td>
+                        <td class="text-center" width="12%"><%- s.period %></td>
                         <td class="text-right"><%- (s.contract_tp ? s.contract_tp : '')%></td>
                         <td class="text-right"><%- (s.qc_tp ? s.qc_tp : '')%></td>
                         <td class="text-right"><%- (s.tp ? s.tp : '')%></td>

+ 1 - 1
app/view/setting/sub_menu.ejs

@@ -9,7 +9,7 @@
             <ul class="nav-list list-unstyled">
                 <% if (projectData.user_account === ctx.session.sessionUser.account) { %>
                 <% for (const index in ctx.subMenu) { %>
-                <li <% if (ctx.url === ctx.subMenu[index].url) { %>class="active"<% } %>>
+                <li <% if (ctx.url.indexOf(ctx.subMenu[index].url) !== -1) { %>class="active"<% } %>>
                     <a href="<%- ctx.subMenu[index].url %>">
                         <span><%- ctx.subMenu[index].caption %></span>
                     </a>

+ 1 - 0
app/view/setting/user.ejs

@@ -53,6 +53,7 @@
                             <% } %>
                             </tbody>
                         </table>
+                        <% include ../layout/page.ejs %>
                     </div>
                 </div>
             </div>

+ 4 - 1
app/view/setting/user_permission.ejs

@@ -49,7 +49,9 @@
                                                         <% } %>
                                                     <% } %>
                                                 <% } else if (permission[ap].type === 'radio') { %>
-                                                    <%= permission[ap].title %>
+                                                    <% if (parseInt(accountPermission[ap]) === permission[ap].children[0].value) { %>
+                                                        <%= permission[ap].title %>
+                                                    <% } %>
                                                 <% } %>
                                             <% } %>
                                         <% } %>
@@ -58,6 +60,7 @@
                             <% } %>
                             </tbody>
                         </table>
+                        <% include ../layout/page.ejs %>
                     </div>
                 </div>
             </div>

+ 6 - 5
app/view/tender/tender_sub_menu.ejs

@@ -17,6 +17,7 @@
                 <% if (ctx.tender.data.ledger_status !== ctx.tender.auditLedgerConst.status.uncheck) { %>
                 <li <% if (ctx.url === '/tender/' + ctx.tender.id + '/ledger/audit') { %>class="active"<% } %>><a href="/tender/<%- ctx.tender.id %>/ledger/audit"><span>台帐审批</span></a></li>
                 <% } %>
+                <li <% if (ctx.url === '/tender/' + ctx.tender.id + '/ledger/bwtz') { %>class="active"<% } %>><a href="/tender/<%- ctx.tender.id %>/ledger/bwtz"><span>部位台帐</span></a></li>
                 <li <% if (ctx.url === '/tender/' + ctx.tender.id + '/ledger/gather') { %>class="active"<% } %>><a href="/tender/<%- ctx.tender.id %>/ledger/gather"><span>清单对比</span></a></li>
                 <li <% if (ctx.url.indexOf('/tender/' + ctx.tender.id + '/revise') >= 0) { %>class="active"<% } %>><a href="/tender/<%- ctx.tender.id %>/revise"><span>台帐修订</span></a></li>
             </ul>
@@ -33,11 +34,11 @@
                 <li <% if (ctx.url === '/tender/' + ctx.tender.id + '/change') { %>class="active"<% } %>><a href="/tender/<%- ctx.tender.id %>/change"><i class="fa fa-retweet"></i> <span>工程变更</span></a></li>
             </ul>
         </div>
-        <!--<div class="nav-box">-->
-            <!--<ul class="nav-list list-unstyled">-->
-                <!--<li <% if (ctx.url === '/tender/' + ctx.tender.id + '/measure/material') { %>class="active"<% } %>><a href="/tender/<%- ctx.tender.id %>/measure/material"><i class="fa fa-line-chart"></i> <span>材料调差</span></a></li>-->
-            <!--</ul>-->
-        <!--</div>-->
+        <div class="nav-box">
+            <ul class="nav-list list-unstyled">
+                <li <% if (ctx.url === '/tender/' + ctx.tender.id + '/measure/material') { %>class="active"<% } %>><a href="/tender/<%- ctx.tender.id %>/measure/material"><i class="fa fa-line-chart"></i> <span>材料调差</span></a></li>
+            </ul>
+        </div>
         <div class="nav-box">
             <ul class="nav-list list-unstyled">
                 <li <% if (ctx.url === '/tender/' + ctx.tender.id + '/report') { %>class="active"<% } %>><a href="/tender/<%- ctx.tender.id %>/report"><i class="fa fa-file-text-o"></i> <span>报表</span></a></li>

+ 6 - 5
app/view/tender/tender_sub_mini_menu.ejs

@@ -17,6 +17,7 @@
                 <% if (ctx.tender.data.ledger_status !== ctx.tender.auditLedgerConst.status.uncheck) { %>
                 <li <% if (ctx.url === '/tender/' + ctx.tender.id + '/ledger/audit') { %>class="active"<% } %>><a href="/tender/<%- ctx.tender.id %>/ledger/audit"><span>台帐审批</span></a></li>
                 <% } %>
+                <li <% if (ctx.url === '/tender/' + ctx.tender.id + '/ledger/bwtz') { %>class="active"<% } %>><a href="/tender/<%- ctx.tender.id %>/ledger/bwtz"><span>部位台帐</span></a></li>
                 <li <% if (ctx.url === '/tender/' + ctx.tender.id + '/ledger/gather') { %>class="active"<% } %>><a href="/tender/<%- ctx.tender.id %>/ledger/gather"><span>清单对比</span></a></li>
                 <li <% if (ctx.url === '/tender/' + ctx.tender.id + '/revise') { %>class="active"<% } %>><a href="/tender/<%- ctx.tender.id %>/revise"><span>台帐修订</span></a></li>
             </ul>
@@ -33,11 +34,11 @@
                 <li <% if (ctx.url === '/tender/' + ctx.tender.id + '/change') { %>class="active"<% } %>><a href="/tender/<%- ctx.tender.id %>/change"><i class="fa fa-retweet"></i> <span>工程变更</span></a></li>
             </ul>
         </div>
-        <!--<div class="nav-box">-->
-            <!--<ul class="nav-list list-unstyled">-->
-                <!--<li <% if (ctx.url === '/tender/' + ctx.tender.id + '/measure/material') { %>class="active"<% } %>><a href="/tender/<%- ctx.tender.id %>/measure/material"><i class="fa fa-line-chart"></i> <span>材料调差</span></a></li>-->
-            <!--</ul>-->
-        <!--</div>-->
+        <div class="nav-box">
+            <ul class="nav-list list-unstyled">
+                <li <% if (ctx.url === '/tender/' + ctx.tender.id + '/measure/material') { %>class="active"<% } %>><a href="/tender/<%- ctx.tender.id %>/measure/material"><i class="fa fa-line-chart"></i> <span>材料调差</span></a></li>
+            </ul>
+        </div>
         <div class="nav-box">
             <ul class="nav-list list-unstyled">
                 <li <% if (ctx.url === '/tender/' + ctx.tender.id + '/report') { %>class="active"<% } %>><a href="/tender/<%- ctx.tender.id %>/report"><i class="fa fa-file-text-o"></i> <span>报表</span></a></li>

+ 369 - 243
builder_report_index_define.js

@@ -19,8 +19,8 @@ const dataType = {
     time: 'string',
 };
 const tag = {
-    tp: {type: 'tp'},
-    up: {type: 'up'},
+    tp: { type: 'tp' },
+    up: { type: 'up' },
 };
 // 其他台账
 const stage_jgcl = {
@@ -30,29 +30,29 @@ const stage_jgcl = {
     key: 'stage_jgcl',
     prefix: '期-甲供材料',
     cols: [
-        {name: 'id', field: 'id', type: dataType.int},
-        {name: 'uuid', field: 'uuid', type: dataType.str},
-        {name: '名称', field: 'name', type: dataType.str},
-        {name: '单位', field: 'unit', type: dataType.str},
-        {name: '单价', field: 'unit_price', type: dataType.currency, tag: {type: 'up'}},
-        {name: '本期到场-数量', field: 'arrive_qty', type: dataType.currency, tag: {type: 'qty', unitKey: 4}},
-        {name: '本期到场-金额', field: 'arrive_tp', type: dataType.currency, tag: {type: 'tp'}},
-        {name: '本期扣回-数量', field: 'deduct_qty', type: dataType.currency, tag: {type: 'qty', unitKey: 4}},
-        {name: '本期扣回-金额', field: 'deduct_tp', type: dataType.currency, tag: {type: 'tp'}},
-        {name: '材料来源', field: 'source', type: dataType.str},
-        {name: '单据号', field: 'bills_code', type: dataType.str},
-        {name: '检验单编号', field: 'check_code', type: dataType.str},
-        {name: '新增人id', field: 'add_uid', type: dataType.int},
-        {name: '新增期id', field: 'add_sid', type: dataType.int},
-        {name: '所属期id', field: 'sid', type: dataType.int},
-        {name: '期历史记录', field: 'shistory', type: dataType.str},
-        {name: '排序', field: 'order', type: dataType.int},
-        {name: '往期是否已用', field: 'pre_used', type: dataType.int},
-        {name: '截止上期到场-数量', field: 'arrive_qty', type: dataType.currency, tag: {type: 'qty', unitKey: 4}},
-        {name: '截止上期到场-金额', field: 'arrive_tp', type: dataType.currency, tag: {type: 'tp'}},
-        {name: '截止上期扣回-数量', field: 'deduct_qty', type: dataType.currency, tag: {type: 'qty', unitKey: 4}},
-        {name: '截止上期扣回-金额', field: 'deduct_tp', type: dataType.currency, tag: {type: 'tp'}},
-    ]
+        { name: 'id', field: 'id', type: dataType.int },
+        { name: 'uuid', field: 'uuid', type: dataType.str },
+        { name: '名称', field: 'name', type: dataType.str },
+        { name: '单位', field: 'unit', type: dataType.str },
+        { name: '单价', field: 'unit_price', type: dataType.currency, tag: { type: 'up' } },
+        { name: '本期到场-数量', field: 'arrive_qty', type: dataType.currency, tag: { type: 'qty', unitKey: 4 } },
+        { name: '本期到场-金额', field: 'arrive_tp', type: dataType.currency, tag: { type: 'tp' } },
+        { name: '本期扣回-数量', field: 'deduct_qty', type: dataType.currency, tag: { type: 'qty', unitKey: 4 } },
+        { name: '本期扣回-金额', field: 'deduct_tp', type: dataType.currency, tag: { type: 'tp' } },
+        { name: '材料来源', field: 'source', type: dataType.str },
+        { name: '单据号', field: 'bills_code', type: dataType.str },
+        { name: '检验单编号', field: 'check_code', type: dataType.str },
+        { name: '新增人id', field: 'add_uid', type: dataType.int },
+        { name: '新增期id', field: 'add_sid', type: dataType.int },
+        { name: '所属期id', field: 'sid', type: dataType.int },
+        { name: '期历史记录', field: 'shistory', type: dataType.str },
+        { name: '排序', field: 'order', type: dataType.int },
+        { name: '往期是否已用', field: 'pre_used', type: dataType.int },
+        { name: '截止上期到场-数量', field: 'arrive_qty', type: dataType.currency, tag: { type: 'qty', unitKey: 4 } },
+        { name: '截止上期到场-金额', field: 'arrive_tp', type: dataType.currency, tag: { type: 'tp' } },
+        { name: '截止上期扣回-数量', field: 'deduct_qty', type: dataType.currency, tag: { type: 'qty', unitKey: 4 } },
+        { name: '截止上期扣回-金额', field: 'deduct_tp', type: dataType.currency, tag: { type: 'tp' } },
+    ],
 };
 const stage_bonus = {
     name: '期-奖罚金(mem_stage_bonus)',
@@ -61,20 +61,20 @@ const stage_bonus = {
     key: 'stage_bonus',
     prefix: '期-奖罚金',
     cols: [
-        {name: 'id', field: 'id', type: dataType.str},
-        {name: '所属标段id', field: 'tid', type: dataType.int},
-        {name: '所属期id', field: 'sid', type: dataType.int},
-        {name: '所属第几期', field: 'sorder', type: dataType.int},
-        {name: '新增人id', field: 'uid', type: dataType.int},
-        {name: '名称', field: 'name', type: dataType.str},
-        {name: '金额', field: 'tp', type: dataType.currency, tag: {type: 'tp'}},
-        {name: '证明材料', field: 'proof', type: dataType.str},
-        {name: '创建时间', field: 'create_time', type: dataType.time},
-        {name: '时间', field: 'real_time', type: dataType.time},
-        {name: '备注', field: 'memo', type: dataType.str},
-        {name: '期历史记录', field: 'shistory', type: dataType.str},
-        {name: '排序', field: 'order', type: dataType.int},
-    ]
+        { name: 'id', field: 'id', type: dataType.str },
+        { name: '所属标段id', field: 'tid', type: dataType.int },
+        { name: '所属期id', field: 'sid', type: dataType.int },
+        { name: '所属第几期', field: 'sorder', type: dataType.int },
+        { name: '新增人id', field: 'uid', type: dataType.int },
+        { name: '名称', field: 'name', type: dataType.str },
+        { name: '金额', field: 'tp', type: dataType.currency, tag: { type: 'tp' } },
+        { name: '证明材料', field: 'proof', type: dataType.str },
+        { name: '创建时间', field: 'create_time', type: dataType.time },
+        { name: '时间', field: 'real_time', type: dataType.time },
+        { name: '备注', field: 'memo', type: dataType.str },
+        { name: '期历史记录', field: 'shistory', type: dataType.str },
+        { name: '排序', field: 'order', type: dataType.int },
+    ],
 };
 const stage_other = {
     name: '期-其他(mem_stage_other)',
@@ -83,24 +83,24 @@ const stage_other = {
     key: 'stage_other',
     prefix: '期-其他',
     cols: [
-        {name: 'id', field: 'id', type: dataType.int},
-        {name: 'uuid', field: 'uuid', type: dataType.str},
-        {name: '所属标段id', field: 'tid', type: dataType.int},
-        {name: '所属期id', field: 'sid', type: dataType.int},
-        {name: '所属第几期', field: 'sorder', type: dataType.int},
-        {name: '新增人id', field: 'add_uid', type: dataType.int},
-        {name: '新增期id', field: 'add_sid', type: dataType.int},
-        {name: '创建时间', field: 'add_time', type: dataType.time},
-        {name: '名称', field: 'name', type: dataType.str},
-        {name: '金额', field: 'total_price', type: dataType.currency, tag: {type: 'tp'}},
-        {name: '本期金额', field: 'tp', type: dataType.currency, tag: {type: 'tp'}},
-        {name: '时间', field: 'real_time', type: dataType.time},
-        {name: '备注', field: 'memo', type: dataType.str},
-        {name: '期历史记录', field: 'shistory', type: dataType.str},
-        {name: '排序', field: 'order', type: dataType.int},
-        {name: '往期是否已用', field: 'pre_used', type: dataType.int},
-        {name: '截止上期-金额', field: 'pre_tp', type: dataType.currency, tag: {type: 'tp'}},
-    ]
+        { name: 'id', field: 'id', type: dataType.int },
+        { name: 'uuid', field: 'uuid', type: dataType.str },
+        { name: '所属标段id', field: 'tid', type: dataType.int },
+        { name: '所属期id', field: 'sid', type: dataType.int },
+        { name: '所属第几期', field: 'sorder', type: dataType.int },
+        { name: '新增人id', field: 'add_uid', type: dataType.int },
+        { name: '新增期id', field: 'add_sid', type: dataType.int },
+        { name: '创建时间', field: 'add_time', type: dataType.time },
+        { name: '名称', field: 'name', type: dataType.str },
+        { name: '金额', field: 'total_price', type: dataType.currency, tag: { type: 'tp' } },
+        { name: '本期金额', field: 'tp', type: dataType.currency, tag: { type: 'tp' } },
+        { name: '时间', field: 'real_time', type: dataType.time },
+        { name: '备注', field: 'memo', type: dataType.str },
+        { name: '期历史记录', field: 'shistory', type: dataType.str },
+        { name: '排序', field: 'order', type: dataType.int },
+        { name: '往期是否已用', field: 'pre_used', type: dataType.int },
+        { name: '截止上期-金额', field: 'pre_tp', type: dataType.currency, tag: { type: 'tp' } },
+    ],
 };
 // 变更令
 const change = {
@@ -110,39 +110,39 @@ const change = {
     key: 'mem_change',
     prefix: '变更令',
     cols: [
-        {name: '变更令id', field: 'cid', type: dataType.str},
-        {name: '变更令号', field: 'code', type: dataType.str},
-        {name: '批复文号', field: 'w_code', type: dataType.str},
-        {name: '批复编号', field: 'p_code', type: dataType.str},
-        {name: '变更名称', field: 'name', type: dataType.str},
-        {name: '桩号', field: 'peg', type: dataType.str},
-        {name: '原设计图名称', field: 'org_name', type: dataType.str},
-        {name: '原图号', field: 'org_code', type: dataType.str},
-        {name: '变更设计图名称', field: 'new_name', type: dataType.str},
-        {name: '变更图号', field: 'new_code', type: dataType.str},
-        {name: '工程变更理由及内容', field: 'content', type: dataType.str},
-        {name: '工程变更合同依据', field: 'basis', type: dataType.str},
-        {name: '变更工程量数量计算式', field: 'expr', type: dataType.str},
-        {name: '备注', field: 'memo', type: dataType.str},
-        {name: '变更类型', field: 'type', type: dataType.str},
-        {name: '变更类别', field: 'class', type: dataType.int},
-        {name: '变更性质', field: 'quality', type: dataType.int},
-        {name: '变更提出单位', field: 'company', type: dataType.str},
-        {name: '费用承担方', field: 'charge', type: dataType.int},
-        {name: '金额', field: 'total_price', type: dataType.currency, tag: {type: 'tp'}},
-        {name: '变更状态发生时间(时间戳)', field: 'cin_time', type: dataType.str},
-        {name: '完成审批时间(时间戳)', field: 'sin—_ime', type: dataType.str},
-        {name: '金额_1', field: 'tp_1', type: dataType.currency, tag: {type: 'tp'}},
-        {name: '金额_2', field: 'tp_2', type: dataType.currency, tag: {type: 'tp'}},
-        {name: '金额_3', field: 'tp_3', type: dataType.currency, tag: {type: 'tp'}},
-        {name: '金额_4', field: 'tp_4', type: dataType.currency, tag: {type: 'tp'}},
-        {name: '金额_5', field: 'tp_5', type: dataType.currency, tag: {type: 'tp'}},
-        {name: '金额_6', field: 'tp_6', type: dataType.currency, tag: {type: 'tp'}},
-        {name: '金额_7', field: 'tp_7', type: dataType.currency, tag: {type: 'tp'}},
-        {name: '金额_8', field: 'tp_8', type: dataType.currency, tag: {type: 'tp'}},
-        {name: '金额_9', field: 'tp_9', type: dataType.currency, tag: {type: 'tp'}},
-        {name: '附件名称列表', field: 'attNames', type: dataType.currency},
-    ]
+        { name: '变更令id', field: 'cid', type: dataType.str },
+        { name: '变更令号', field: 'code', type: dataType.str },
+        { name: '批复文号', field: 'w_code', type: dataType.str },
+        { name: '批复编号', field: 'p_code', type: dataType.str },
+        { name: '变更名称', field: 'name', type: dataType.str },
+        { name: '桩号', field: 'peg', type: dataType.str },
+        { name: '原设计图名称', field: 'org_name', type: dataType.str },
+        { name: '原图号', field: 'org_code', type: dataType.str },
+        { name: '变更设计图名称', field: 'new_name', type: dataType.str },
+        { name: '变更图号', field: 'new_code', type: dataType.str },
+        { name: '工程变更理由及内容', field: 'content', type: dataType.str },
+        { name: '工程变更合同依据', field: 'basis', type: dataType.str },
+        { name: '变更工程量数量计算式', field: 'expr', type: dataType.str },
+        { name: '备注', field: 'memo', type: dataType.str },
+        { name: '变更类型', field: 'type', type: dataType.str },
+        { name: '变更类别', field: 'class', type: dataType.int },
+        { name: '变更性质', field: 'quality', type: dataType.int },
+        { name: '变更提出单位', field: 'company', type: dataType.str },
+        { name: '费用承担方', field: 'charge', type: dataType.int },
+        { name: '金额', field: 'total_price', type: dataType.currency, tag: { type: 'tp' } },
+        { name: '变更状态发生时间(时间戳)', field: 'cin_time', type: dataType.str },
+        { name: '完成审批时间(时间戳)', field: 'sin—_ime', type: dataType.str },
+        { name: '金额_1', field: 'tp_1', type: dataType.currency, tag: { type: 'tp' } },
+        { name: '金额_2', field: 'tp_2', type: dataType.currency, tag: { type: 'tp' } },
+        { name: '金额_3', field: 'tp_3', type: dataType.currency, tag: { type: 'tp' } },
+        { name: '金额_4', field: 'tp_4', type: dataType.currency, tag: { type: 'tp' } },
+        { name: '金额_5', field: 'tp_5', type: dataType.currency, tag: { type: 'tp' } },
+        { name: '金额_6', field: 'tp_6', type: dataType.currency, tag: { type: 'tp' } },
+        { name: '金额_7', field: 'tp_7', type: dataType.currency, tag: { type: 'tp' } },
+        { name: '金额_8', field: 'tp_8', type: dataType.currency, tag: { type: 'tp' } },
+        { name: '金额_9', field: 'tp_9', type: dataType.currency, tag: { type: 'tp' } },
+        { name: '附件名称列表', field: 'attNames', type: dataType.currency },
+    ],
 };
 const change_bills = {
     name: '变更清单(mem_change_bills)',
@@ -151,40 +151,40 @@ const change_bills = {
     key: 'mem_change_bills',
     prefix: '变更清单',
     cols: [
-        {name: '变更令id', field: 'cid', type: dataType.str},
-        {name: '签约清单id或台账id', field: 'lid', type: dataType.str},
-        {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, tag: {type: 'up'}},
-        {name: '原-数量', field: 'o_qty', type: dataType.currency, tag: {type: 'qty', unitKey: 5}},
-        {name: '原-金额', field: 'o_tp', type: dataType.currency, tag: {type: 'tp'}},
-        {name: '变更-数量', field: 'c_qty', type: dataType.currency, tag: {type: 'qty', unitKey: 5}},
-        {name: '变更-金额', field: 'c_tp', type: dataType.currency, tag: {type: 'tp'}},
-        {name: '审批变更后-数量', field: 's_qty', type: dataType.currency, tag: {type: 'qty', unitKey: 5}},
-        {name: '审批变更后-金额', field: 's_tp', type: dataType.currency, tag: {type: 'tp'}},
-        {name: '部位明细', field: 'bwmx', type: dataType.str},
-        {name: '变更详情', field: 'detail', type: dataType.str},
-        {name: '数量_1', field: 'qty_1', type: dataType.currency, tag: {type: 'qty', unitKey: 5}},
-        {name: '金额_1', field: 'tp_1', type: dataType.currency, tag: {type: 'tp'}},
-        {name: '数量_2', field: 'qty_2', type: dataType.currency, tag: {type: 'qty', unitKey: 5}},
-        {name: '金额_2', field: 'tp_2', type: dataType.currency, tag: {type: 'tp'}},
-        {name: '数量_3', field: 'qty_3', type: dataType.currency, tag: {type: 'qty', unitKey: 5}},
-        {name: '金额_3', field: 'tp_3', type: dataType.currency, tag: {type: 'tp'}},
-        {name: '数量_4', field: 'qty_4', type: dataType.currency, tag: {type: 'qty', unitKey: 5}},
-        {name: '金额_4', field: 'tp_4', type: dataType.currency, tag: {type: 'tp'}},
-        {name: '数量_5', field: 'qty_5', type: dataType.currency, tag: {type: 'qty', unitKey: 5}},
-        {name: '金额_5', field: 'tp_5', type: dataType.currency, tag: {type: 'tp'}},
-        {name: '数量_6', field: 'qty_6', type: dataType.currency, tag: {type: 'qty', unitKey: 5}},
-        {name: '金额_6', field: 'tp_6', type: dataType.currency, tag: {type: 'tp'}},
-        {name: '数量_7', field: 'qty_7', type: dataType.currency, tag: {type: 'qty', unitKey: 5}},
-        {name: '金额_7', field: 'tp_7', type: dataType.currency, tag: {type: 'tp'}},
-        {name: '数量_8', field: 'qty_8', type: dataType.currency, tag: {type: 'qty', unitKey: 5}},
-        {name: '金额_8', field: 'tp_8', type: dataType.currency, tag: {type: 'tp'}},
-        {name: '数量_9', field: 'qty_9', type: dataType.currency, tag: {type: 'qty', unitKey: 5}},
-        {name: '金额_9', field: 'tp_9', type: dataType.currency, tag: {type: 'tp'}},
+        { name: '变更令id', field: 'cid', type: dataType.str },
+        { name: '签约清单id或台账id', field: 'lid', type: dataType.str },
+        { 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, tag: { type: 'up' } },
+        { name: '原-数量', field: 'o_qty', type: dataType.currency, tag: { type: 'qty', unitKey: 5 } },
+        { name: '原-金额', field: 'o_tp', type: dataType.currency, tag: { type: 'tp' } },
+        { name: '变更-数量', field: 'c_qty', type: dataType.currency, tag: { type: 'qty', unitKey: 5 } },
+        { name: '变更-金额', field: 'c_tp', type: dataType.currency, tag: { type: 'tp' } },
+        { name: '审批变更后-数量', field: 's_qty', type: dataType.currency, tag: { type: 'qty', unitKey: 5 } },
+        { name: '审批变更后-金额', field: 's_tp', type: dataType.currency, tag: { type: 'tp' } },
+        { name: '部位明细', field: 'bwmx', type: dataType.str },
+        { name: '变更详情', field: 'detail', type: dataType.str },
+        { name: '数量_1', field: 'qty_1', type: dataType.currency, tag: { type: 'qty', unitKey: 5 } },
+        { name: '金额_1', field: 'tp_1', type: dataType.currency, tag: { type: 'tp' } },
+        { name: '数量_2', field: 'qty_2', type: dataType.currency, tag: { type: 'qty', unitKey: 5 } },
+        { name: '金额_2', field: 'tp_2', type: dataType.currency, tag: { type: 'tp' } },
+        { name: '数量_3', field: 'qty_3', type: dataType.currency, tag: { type: 'qty', unitKey: 5 } },
+        { name: '金额_3', field: 'tp_3', type: dataType.currency, tag: { type: 'tp' } },
+        { name: '数量_4', field: 'qty_4', type: dataType.currency, tag: { type: 'qty', unitKey: 5 } },
+        { name: '金额_4', field: 'tp_4', type: dataType.currency, tag: { type: 'tp' } },
+        { name: '数量_5', field: 'qty_5', type: dataType.currency, tag: { type: 'qty', unitKey: 5 } },
+        { name: '金额_5', field: 'tp_5', type: dataType.currency, tag: { type: 'tp' } },
+        { name: '数量_6', field: 'qty_6', type: dataType.currency, tag: { type: 'qty', unitKey: 5 } },
+        { name: '金额_6', field: 'tp_6', type: dataType.currency, tag: { type: 'tp' } },
+        { name: '数量_7', field: 'qty_7', type: dataType.currency, tag: { type: 'qty', unitKey: 5 } },
+        { name: '金额_7', field: 'tp_7', type: dataType.currency, tag: { type: 'tp' } },
+        { name: '数量_8', field: 'qty_8', type: dataType.currency, tag: { type: 'qty', unitKey: 5 } },
+        { name: '金额_8', field: 'tp_8', type: dataType.currency, tag: { type: 'tp' } },
+        { name: '数量_9', field: 'qty_9', type: dataType.currency, tag: { type: 'qty', unitKey: 5 } },
+        { name: '金额_9', field: 'tp_9', type: dataType.currency, tag: { type: 'tp' } },
 
-    ]
+    ],
 };
 // 期 - 计量单元
 const stage_pos = {
@@ -194,29 +194,29 @@ const stage_pos = {
     key: 'mem_stage_pos',
     prefix: '期-计量单元',
     cols: [
-        {name: 'id', field: 'id', type: dataType.str},
-        {name: '所属标段id', field: 'tid', type: dataType.int},
-        {name: '所属清单id', field: 'lid', type: dataType.str},
-        {name: '名称', field: 'name', type: dataType.str},
-        {name: '位置', field: 'position', type: dataType.str},
-        {name: '施工复核-数量', field: 'sgfh_qty', type: dataType.currency},
-        {name: '其他错漏-数量', field: 'qtcl_qty', type: dataType.currency},
-        {name: '设计错漏-数量', field: 'sjcl_qty', type: dataType.currency},
-        {name: '台账-数量', field: 'quantity', type: dataType.currency},
-        {name: '图号', field: 'drawing_code', type: dataType.str},
-        {name: '排序', field: 'p_order', type: dataType.str},
-        {name: '本期-合同计量-数量', field: 'contract_qty', type: dataType.currency},
-        {name: '本期-数量变更-数量', field: 'qc_qty', type: dataType.currency},
-        {name: '本期-数量变更-变更令', field: 'qc_bgl_code', type: dataType.str},
-        {name: '本期-完成计量-数量', field: 'gather_qty', type: dataType.currency},
-        {name: '本期批注', field: 'postil', type: dataType.str},
-        {name: '截止上期-合同计量-数量', field: 'pre_contract_qty', type: dataType.currency},
-        {name: '截止上期-数量变更-数量', field: 'pre_qc_qty', type: dataType.currency},
-        {name: '截止上期-完成计量-数量', field: 'pre_gather_qty', type: dataType.currency},
-        {name: '截止本期-合同计量-数量', field: 'end_contract_qty', type: dataType.currency},
-        {name: '截止本期-数量变更-数量', field: 'end_qc_qty', type: dataType.currency},
-        {name: '截止本期-完成计量-数量', field: 'end_gather_qty', type: dataType.currency},
-        {name: '截止本期-完成率', field: 'final_ratio', type: dataType.currency},
+        { name: 'id', field: 'id', type: dataType.str },
+        { name: '所属标段id', field: 'tid', type: dataType.int },
+        { name: '所属清单id', field: 'lid', type: dataType.str },
+        { name: '名称', field: 'name', type: dataType.str },
+        { name: '位置', field: 'position', type: dataType.str },
+        { name: '施工复核-数量', field: 'sgfh_qty', type: dataType.currency },
+        { name: '其他错漏-数量', field: 'qtcl_qty', type: dataType.currency },
+        { name: '设计错漏-数量', field: 'sjcl_qty', type: dataType.currency },
+        { name: '台账-数量', field: 'quantity', type: dataType.currency },
+        { name: '图号', field: 'drawing_code', type: dataType.str },
+        { name: '排序', field: 'p_order', type: dataType.str },
+        { name: '本期-合同计量-数量', field: 'contract_qty', type: dataType.currency },
+        { name: '本期-数量变更-数量', field: 'qc_qty', type: dataType.currency },
+        { name: '本期-数量变更-变更令', field: 'qc_bgl_code', type: dataType.str },
+        { name: '本期-完成计量-数量', field: 'gather_qty', type: dataType.currency },
+        { name: '本期批注', field: 'postil', type: dataType.str },
+        { name: '截止上期-合同计量-数量', field: 'pre_contract_qty', type: dataType.currency },
+        { name: '截止上期-数量变更-数量', field: 'pre_qc_qty', type: dataType.currency },
+        { name: '截止上期-完成计量-数量', field: 'pre_gather_qty', type: dataType.currency },
+        { name: '截止本期-合同计量-数量', field: 'end_contract_qty', type: dataType.currency },
+        { name: '截止本期-数量变更-数量', field: 'end_qc_qty', type: dataType.currency },
+        { name: '截止本期-完成计量-数量', field: 'end_gather_qty', type: dataType.currency },
+        { name: '截止本期-完成率', field: 'final_ratio', type: dataType.currency },
     ],
 };
 const stage_pos_compare = {
@@ -226,86 +226,203 @@ const stage_pos_compare = {
     key: 'mem_stage_pos_compare',
     prefix: '期-计量单元-全参与人',
     cols: [
-        {name: 'id', field: 'id', type: dataType.str},
-        {name: '所属标段id', field: 'tid', type: dataType.int},
-        {name: '所属清单id', field: 'lid', type: dataType.str},
-        {name: '名称', field: 'name', type: dataType.str},
-        {name: '位置', field: 'position', type: dataType.str},
-        {name: '施工复核-数量', field: 'sgfh_qty', type: dataType.currency},
-        {name: '其他错漏-数量', field: 'qtcl_qty', type: dataType.currency},
-        {name: '设计错漏-数量', field: 'sjcl_qty', type: dataType.currency},
-        {name: '台账-数量', field: 'quantity', type: dataType.currency},
-        {name: '图号', field: 'drawing_code', type: dataType.str},
-        {name: '排序', field: 'p_order', type: dataType.str},
-        {name: '截止上期-合同计量-数量', field: 'pre_contract_qty', type: dataType.currency},
-        {name: '截止上期-数量变更-数量', field: 'pre_qc_qty', type: dataType.currency},
-        {name: '截止上期-完成计量-数量', field: 'pre_gather_qty', type: dataType.currency},
-        {name: '本期-合同计量-数量_0', field: 'r0_contract_qty', type: dataType.currency},
-        {name: '本期-数量变更-数量_0', field: 'r0_qc_qty', type: dataType.currency},
-        {name: '本期-完成计量-数量_0', field: 'r0_gather_qty', type: dataType.currency},
-        {name: '本期-合同计量-数量_1', field: 'r1_contract_qty', type: dataType.currency},
-        {name: '本期-数量变更-数量_1', field: 'r1_qc_qty', type: dataType.currency},
-        {name: '本期-完成计量-数量_1', field: 'r1_gather_qty', type: dataType.currency},
-        {name: '本期-合同计量-数量_2', field: 'r2_contract_qty', type: dataType.currency},
-        {name: '本期-数量变更-数量_2', field: 'r2_qc_qty', type: dataType.currency},
-        {name: '本期-完成计量-数量_2', field: 'r2_gather_qty', type: dataType.currency},
-        {name: '本期-合同计量-数量_3', field: 'r3_contract_qty', type: dataType.currency},
-        {name: '本期-数量变更-数量_3', field: 'r3_qc_qty', type: dataType.currency},
-        {name: '本期-完成计量-数量_3', field: 'r3_gather_qty', type: dataType.currency},
-        {name: '本期-合同计量-数量_4', field: 'r4_contract_qty', type: dataType.currency},
-        {name: '本期-数量变更-数量_4', field: 'r4_qc_qty', type: dataType.currency},
-        {name: '本期-完成计量-数量_4', field: 'r4_gather_qty', type: dataType.currency},
-        {name: '本期-合同计量-数量_5', field: 'r5_contract_qty', type: dataType.currency},
-        {name: '本期-数量变更-数量_5', field: 'r5_qc_qty', type: dataType.currency},
-        {name: '本期-完成计量-数量_5', field: 'r5_gather_qty', type: dataType.currency},
-        {name: '本期-合同计量-数量_6', field: 'r6_contract_qty', type: dataType.currency},
-        {name: '本期-数量变更-数量_6', field: 'r6_qc_qty', type: dataType.currency},
-        {name: '本期-完成计量-数量_6', field: 'r6_gather_qty', type: dataType.currency},
-        {name: '本期-合同计量-数量_7', field: 'r7_contract_qty', type: dataType.currency},
-        {name: '本期-数量变更-数量_7', field: 'r7_qc_qty', type: dataType.currency},
-        {name: '本期-完成计量-数量_7', field: 'r7_gather_qty', type: dataType.currency},
-        {name: '本期-合同计量-数量_8', field: 'r8_contract_qty', type: dataType.currency},
-        {name: '本期-数量变更-数量_8', field: 'r8_qc_qty', type: dataType.currency},
-        {name: '本期-完成计量-数量_8', field: 'r8_gather_qty', type: dataType.currency},
-        {name: '本期-合同计量-数量_9', field: 'r9_contract_qty', type: dataType.currency},
-        {name: '本期-数量变更-数量_9', field: 'r9_qc_qty', type: dataType.currency},
-        {name: '本期-完成计量-数量_9', field: 'r9_gather_qty', type: dataType.currency},
+        { name: 'id', field: 'id', type: dataType.str },
+        { name: '所属标段id', field: 'tid', type: dataType.int },
+        { name: '所属清单id', field: 'lid', type: dataType.str },
+        { name: '名称', field: 'name', type: dataType.str },
+        { name: '位置', field: 'position', type: dataType.str },
+        { name: '施工复核-数量', field: 'sgfh_qty', type: dataType.currency },
+        { name: '其他错漏-数量', field: 'qtcl_qty', type: dataType.currency },
+        { name: '设计错漏-数量', field: 'sjcl_qty', type: dataType.currency },
+        { name: '台账-数量', field: 'quantity', type: dataType.currency },
+        { name: '图号', field: 'drawing_code', type: dataType.str },
+        { name: '排序', field: 'p_order', type: dataType.str },
+        { name: '截止上期-合同计量-数量', field: 'pre_contract_qty', type: dataType.currency },
+        { name: '截止上期-数量变更-数量', field: 'pre_qc_qty', type: dataType.currency },
+        { name: '截止上期-完成计量-数量', field: 'pre_gather_qty', type: dataType.currency },
+        { name: '本期-合同计量-数量_0', field: 'r0_contract_qty', type: dataType.currency },
+        { name: '本期-数量变更-数量_0', field: 'r0_qc_qty', type: dataType.currency },
+        { name: '本期-完成计量-数量_0', field: 'r0_gather_qty', type: dataType.currency },
+        { name: '本期-合同计量-数量_1', field: 'r1_contract_qty', type: dataType.currency },
+        { name: '本期-数量变更-数量_1', field: 'r1_qc_qty', type: dataType.currency },
+        { name: '本期-完成计量-数量_1', field: 'r1_gather_qty', type: dataType.currency },
+        { name: '本期-合同计量-数量_2', field: 'r2_contract_qty', type: dataType.currency },
+        { name: '本期-数量变更-数量_2', field: 'r2_qc_qty', type: dataType.currency },
+        { name: '本期-完成计量-数量_2', field: 'r2_gather_qty', type: dataType.currency },
+        { name: '本期-合同计量-数量_3', field: 'r3_contract_qty', type: dataType.currency },
+        { name: '本期-数量变更-数量_3', field: 'r3_qc_qty', type: dataType.currency },
+        { name: '本期-完成计量-数量_3', field: 'r3_gather_qty', type: dataType.currency },
+        { name: '本期-合同计量-数量_4', field: 'r4_contract_qty', type: dataType.currency },
+        { name: '本期-数量变更-数量_4', field: 'r4_qc_qty', type: dataType.currency },
+        { name: '本期-完成计量-数量_4', field: 'r4_gather_qty', type: dataType.currency },
+        { name: '本期-合同计量-数量_5', field: 'r5_contract_qty', type: dataType.currency },
+        { name: '本期-数量变更-数量_5', field: 'r5_qc_qty', type: dataType.currency },
+        { name: '本期-完成计量-数量_5', field: 'r5_gather_qty', type: dataType.currency },
+        { name: '本期-合同计量-数量_6', field: 'r6_contract_qty', type: dataType.currency },
+        { name: '本期-数量变更-数量_6', field: 'r6_qc_qty', type: dataType.currency },
+        { name: '本期-完成计量-数量_6', field: 'r6_gather_qty', type: dataType.currency },
+        { name: '本期-合同计量-数量_7', field: 'r7_contract_qty', type: dataType.currency },
+        { name: '本期-数量变更-数量_7', field: 'r7_qc_qty', type: dataType.currency },
+        { name: '本期-完成计量-数量_7', field: 'r7_gather_qty', type: dataType.currency },
+        { name: '本期-合同计量-数量_8', field: 'r8_contract_qty', type: dataType.currency },
+        { name: '本期-数量变更-数量_8', field: 'r8_qc_qty', type: dataType.currency },
+        { name: '本期-完成计量-数量_8', field: 'r8_gather_qty', type: dataType.currency },
+        { name: '本期-合同计量-数量_9', field: 'r9_contract_qty', type: dataType.currency },
+        { name: '本期-数量变更-数量_9', field: 'r9_qc_qty', type: dataType.currency },
+        { name: '本期-完成计量-数量_9', field: 'r9_gather_qty', type: dataType.currency },
     ],
 };
 
 // 期 - 合同支付
 const stage_pay = {
-    Name: '期-合同支付-数据(mem_stage_pay)',
+    name: '期-合同支付-数据(mem_stage_pay)',
     remark: '',
     id: 27,
     key: 'mem_stage_pay',
     prefix: '期-合同支付',
     cols: [
-        {name: '名称', field: 'name', type: dataType.str},
-        {name: '计算公式', field: 'expr', type: dataType.str},
-        {name: '金额', field: 'tp', type: dataType.currency},
-        {name: '截止上期-金额', field: 'pre_tp', type: dataType.currency},
-        {name: '截止上期-金额', field: 'end_tp', type: dataType.currency},
-        {name: '排序', field: 'order', type: dataType.int},
-        {name: '是否扣款项', field: 'minus', type: dataType.int},
-        {name: '支付类型', field: 'ptype', type: dataType.int},
-        {name: '起扣金额', field: 'sprice', type: dataType.currency},
-        {name: '扣款限额', field: 'rprice', type: dataType.currency},
-        {name: '流程-本期-金额_0', field: 'r0_tp', type: dataType.currency},
-        {name: '流程-本期-金额_1', field: 'r1_tp', type: dataType.currency},
-        {name: '流程-本期-金额_2', field: 'r2_tp', type: dataType.currency},
-        {name: '流程-本期-金额_3', field: 'r3_tp', type: dataType.currency},
-        {name: '流程-本期-金额_4', field: 'r4_tp', type: dataType.currency},
-        {name: '流程-本期-金额_5', field: 'r5_tp', type: dataType.currency},
-        {name: '流程-本期-金额_6', field: 'r6_tp', type: dataType.currency},
-        {name: '流程-本期-金额_7', field: 'r7_tp', type: dataType.currency},
-        {name: '流程-本期-金额_8', field: 'r8_tp', type: dataType.currency},
-        {name: '流程-本期-金额_9', field: 'r9_tp', type: dataType.currency},
-        {name: '第几期开始计量', field: 'start_stage_order', type: dataType.int},
+        { name: '名称', field: 'name', type: dataType.str },
+        { name: '计算公式', field: 'expr', type: dataType.str },
+        { name: '金额', field: 'tp', type: dataType.currency },
+        { name: '截止上期-金额', field: 'pre_tp', type: dataType.currency },
+        { name: '截止上期-金额', field: 'end_tp', type: dataType.currency },
+        { name: '排序', field: 'order', type: dataType.int },
+        { name: '是否扣款项', field: 'minus', type: dataType.int },
+        { name: '支付类型', field: 'ptype', type: dataType.int },
+        { name: '起扣金额', field: 'sprice', type: dataType.currency },
+        { name: '扣款限额', field: 'rprice', type: dataType.currency },
+        { name: '流程-本期-金额_0', field: 'r0_tp', type: dataType.currency },
+        { name: '流程-本期-金额_1', field: 'r1_tp', type: dataType.currency },
+        { name: '流程-本期-金额_2', field: 'r2_tp', type: dataType.currency },
+        { name: '流程-本期-金额_3', field: 'r3_tp', type: dataType.currency },
+        { name: '流程-本期-金额_4', field: 'r4_tp', type: dataType.currency },
+        { name: '流程-本期-金额_5', field: 'r5_tp', type: dataType.currency },
+        { name: '流程-本期-金额_6', field: 'r6_tp', type: dataType.currency },
+        { name: '流程-本期-金额_7', field: 'r7_tp', type: dataType.currency },
+        { name: '流程-本期-金额_8', field: 'r8_tp', type: dataType.currency },
+        { name: '流程-本期-金额_9', field: 'r9_tp', type: dataType.currency },
+        { name: '第几期开始计量', field: 'start_stage_order', type: dataType.int },
     ],
 };
 
-const recursiveMkdirSync = async function (pathName) {
+// 期 - 中间计量
+const stage_im_zl = {
+    name: '期-中间计量-总量-数据(mem_stage_im_zl)',
+    remark: '',
+    id: 21,
+    key: 'mem_stage_im_zl',
+    prefix: '期-中间计量-总量',
+    cols: [
+        { name: '台账id', field: 'lid', type: dataType.str },
+        { name: '部位id', field: 'pid', type: dataType.str },
+        { 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: '本期数量', field: 'jl', type: dataType.currency },
+        { name: '本期合同数量', field: 'contract_jl', type: dataType.currency },
+        { name: '本期变更数量', field: 'qc_jl', type: dataType.currency },
+        { name: '桩号', field: 'peg', type: dataType.str },
+        { name: '图册号', field: 'drawing_code', type: dataType.str },
+        { name: '勾选标记 - 勿用', field: 'check', type: dataType.int },
+        { name: '部位', field: 'bw', type: dataType.str },
+        { name: '细目', field: 'xm', type: dataType.str },
+        { name: '凭证号', field: 'doc_code', type: dataType.str },
+        { name: '计算式说明', field: 'calc_memo', type: dataType.str },
+        { name: '草图', field: 'calc_img', type: dataType.str, isPic: true },
+        { name: '变更令号', field: 'bgl_code', type: dataType.str },
+        { name: '变更图号', field: 'bgl_drawing_code', type: dataType.str },
+        { name: '中间计量表号', field: 'im_code', type: dataType.str },
+        { name: '截止上期 - 数量', field: 'pre_jl', type: dataType.currency },
+        { name: '截止上期 - 合同数量', field: 'pre_contract_jl', type: dataType.currency },
+        { name: '截止上期 - 变更数量', field: 'pre_qc_jl', type: dataType.currency },
+        { name: '截止本期 - 数量', field: 'end_jl', type: dataType.currency },
+        { name: '截止本期 - 合同数量', field: 'end_contract_jl', type: dataType.currency },
+        { name: '截止本期 - 变更数量', field: 'end_qc_jl', type: dataType.currency },
+        { name: '本期金额', field: 'tp', type: dataType.currency },
+        { name: '本期合同金额', field: 'contract_tp', type: dataType.currency },
+        { name: '本期变更金额', field: 'qc_tp', type: dataType.currency },
+        { name: '截止上期 - 金额', field: 'pre_tp', type: dataType.currency },
+        { name: '截止上期 - 合同金额', field: 'pre_contract_tp', type: dataType.currency },
+        { name: '截止上期 - 变更金额', field: 'pre_qc_tp', type: dataType.currency },
+        { name: '截止本期 - 金额', field: 'end_tp', type: dataType.currency },
+        { name: '截止本期 - 合同金额', field: 'end_contract_tp', type: dataType.currency },
+        { name: '截止本期 - 变更金额', field: 'end_qc_tp', type: dataType.currency },
+        { name: '台账数量', field: 'quantity', type: dataType.currency },
+        { name: '台账金额', field: 'total_price', type: dataType.currency },
+    ],
+};
+const stage_im_tz = {
+    name: '期-中间计量-台账-数据(mem_stage_im_tz)',
+    remark: '',
+    id: 19,
+    key: 'mem_stage_im_tz',
+    prefix: '期-中间计量-台账',
+    cols: [
+        { name: 'id', field: 'id', type: dataType.int },
+        { name: '台账id', field: 'lid', type: dataType.str },
+        { name: '部位id', field: 'pid', type: dataType.str },
+        { name: '编号', field: 'code', type: dataType.str },
+        { name: '本期金额', field: 'jl', type: dataType.currency },
+        { name: '本期合同金额', field: 'contract_jl', type: dataType.currency },
+        { name: '本期变更金额', field: 'qc_jl', type: dataType.currency },
+        { name: '桩号', field: 'peg', type: dataType.str },
+        { name: '图册号', field: 'drawing_code', type: dataType.str },
+        { name: '部位', field: 'bw', type: dataType.str },
+        { name: '细目', field: 'xm', type: dataType.str },
+        { name: '勾选标记 - 勿用', field: 'check', type: dataType.int },
+        { name: '计算式说明', field: 'calc_memo', type: dataType.str },
+        { name: '变更令号', field: 'bgl_code', type: dataType.str },
+        { name: '变更图号', field: 'bgl_drawing_code', type: dataType.str },
+        { name: '中间计量表号', field: 'im_code', type: dataType.str },
+        { name: '凭证号', field: 'doc_code', type: dataType.str },
+        { name: '草图', field: 'calc_img', type: dataType.str, isPic: true },
+        { name: '截止上期 - 金额', field: 'pre_jl', type: dataType.currency },
+        { name: '截止上期 - 合同金额', field: 'pre_contract_jl', type: dataType.currency },
+        { name: '截止上期 - 变更金额', field: 'pre_qc_jl', type: dataType.currency },
+        { name: '截止本期 - 金额', field: 'end_jl', type: dataType.currency },
+        { name: '截止本期 - 合同金额', field: 'end_contract_jl', type: dataType.currency },
+        { name: '截止本期 - 变更金额', field: 'end_qc_jl', type: dataType.currency },
+    ],
+};
+const stage_im_tz_bills = {
+    name: '期-中间计量-台账清单-数据(mem_stage_im_tz_bills)',
+    remark: '',
+    id: 20,
+    key: 'mem_stage_im_tz_bills',
+    prefix: '期-中间计量-台账清单',
+    cols: [
+        { name: '中间计量id', field: 'imid', type: dataType.int },
+        { name: '清单id', field: 'bid', type: dataType.str },
+        { 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: 'jl', type: dataType.currency },
+        { name: '本期合同数量', field: 'contract_jl', type: dataType.currency },
+        { name: '本期变更数量', field: 'qc_jl', type: dataType.currency },
+        { name: '中间计量表号', field: 'im_code', type: dataType.str },
+        { name: '截止上期 - 数量', field: 'pre_jl', type: dataType.currency },
+        { name: '截止上期 - 合同数量', field: 'pre_contract_jl', type: dataType.currency },
+        { name: '截止上期 - 变更数量', field: 'pre_qc_jl', type: dataType.currency },
+        { name: '截止本期 - 数量', field: 'end_jl', type: dataType.currency },
+        { name: '截止本期 - 合同数量', field: 'end_contract_jl', type: dataType.currency },
+        { name: '截止本期 - 变更数量', field: 'end_qc_jl', type: dataType.currency },
+        { name: '本期金额', field: 'tp', type: dataType.currency },
+        { name: '本期合同金额', field: 'contract_tp', type: dataType.currency },
+        { name: '本期变更金额', field: 'qc_tp', type: dataType.currency },
+        { name: '截止上期 - 金额', field: 'pre_tp', type: dataType.currency },
+        { name: '截止上期 - 合同金额', field: 'pre_contract_tp', type: dataType.currency },
+        { name: '截止上期 - 变更金额', field: 'pre_qc_tp', type: dataType.currency },
+        { name: '截止本期 - 金额', field: 'end_tp', type: dataType.currency },
+        { name: '截止本期 - 合同金额', field: 'end_contract_tp', type: dataType.currency },
+        { name: '截止本期 - 变更金额', field: 'end_qc_tp', type: dataType.currency },
+        { name: '台账数量', field: 'quantity', type: dataType.currency },
+        { name: '台账金额', field: 'total_price', type: dataType.currency },
+    ],
+};
+
+const recursiveMkdirSync = async function(pathName) {
     if (!fs.existsSync(pathName)) {
         const upperPath = path.dirname(pathName);
         if (!fs.existsSync(upperPath)) {
@@ -314,7 +431,7 @@ const recursiveMkdirSync = async function (pathName) {
         await fs.mkdirSync(pathName);
     }
 };
-const saveBufferFile = async function (buffer, fileName) {
+const saveBufferFile = async function(buffer, fileName) {
     // 检查文件夹是否存在,不存在则直接创建文件夹
     const pathName = path.dirname(fileName);
     if (!fs.existsSync(pathName)) {
@@ -322,53 +439,56 @@ const saveBufferFile = async function (buffer, fileName) {
     }
     await fs.writeFileSync(fileName, buffer);
 };
-const addFields = function(table, name, field, type, tag) {
+const addFields = function(table, col) {
     const data = {};
-    data.ID = table.ID * 100 + table.items.length + 1;
-    data.Name = name + '(' + field + ')';
+    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 + ')' : '');
     if (table.prefix && table.prefix !== '') data.Name = table.prefix + '-' + data.Name;
-    data.DataType = type;
+    data.DataType = col.type;
     data.TableName = table.key;
     data.descr = '';
-    data.mapExpression = "$PROJECT.REPORT.getProperty('" + table.key + "', '" + field + "')";
-    if (tag) {
+    data.mapExpression = "$PROJECT.REPORT.getProperty('" + table.key + "', '" + col.field + "')";
+    if (col.tag) {
         switch (tag.type) {
             case 'up':
-                data.Precision = { type: "fixed", fixedMapExpression: "$PROJECT.REPORT.getProperty('tender_info', 'decimal.up')" };
+                data.Precision = { type: 'fixed', fixedMapExpression: "$PROJECT.REPORT.getProperty('tender_info', 'decimal.up')" };
                 break;
             case 'tp':
-                if (tag.subType) {
-                    data.Precision = { type: "fixed", fixedMapExpression: "$PROJECT.REPORT.getProperty('tender_info', 'decimal." + "_" + tag.subType + "_tp')" };
+                if (col.tag.subType) {
+                    data.Precision = { type: 'fixed', fixedMapExpression: "$PROJECT.REPORT.getProperty('tender_info', 'decimal." + '_' + col.tag.subType + "_tp')" };
                 } else {
-                    data.Precision = { type: "fixed", fixedMapExpression: "$PROJECT.REPORT.getProperty('tender_info', 'decimal.tp')" };
+                    data.Precision = { type: 'fixed', fixedMapExpression: "$PROJECT.REPORT.getProperty('tender_info', 'decimal.tp')" };
                 }
                 break;
             case 'qty':
-                data.Precision = { type: "flexible", flexibleRefFieldID: table.ID * 100 + tag.unitKey, flexibleMapExpression: "$PROJECT.REPORT.getProperty('tender_info', 'precision')" };
+                data.Precision = { type: 'flexible', flexibleRefFieldID: table.ID * 100 + tag.unitKey, flexibleMapExpression: "$PROJECT.REPORT.getProperty('tender_info', 'precision')" };
                 break;
         }
     }
+    if (col.isPic) {
+        data.isPic = true;
+    }
     table.items.push(data);
 };
-const saveTableDefine = async function (tableDefine, file) {
+const saveTableDefine = async function(tableDefine, file) {
     delete tableDefine.ID;
     delete tableDefine.key;
     delete tableDefine.prefix;
-    let defineStr = JSON.stringify(tableDefine, "", "\t");
+    let defineStr = JSON.stringify(tableDefine, '', '\t');
     const replaceStr = [
-        {match: '"Name":', str: 'Name:'},
-        {match: '"remark":', str: 'remark:'},
-        {match: '"items":', str: 'items:'},
-        {match: '"ID":', str: 'ID:'},
-        {match: '"DataType":', str: 'DataType:'},
-        {match: '"TableName":', str: 'TableName:'},
-        {match: '"descr":', str: 'descr:'},
-        {match: '"mapExpression":', str: 'mapExpression:'},
-        {match: '"Precision":', str: 'Precision:'},
-        {match: '"type":', str: 'type:'},
-        {match: '"flexibleRefFieldID":', str: 'flexibleRefFieldID:'},
-        {match: '"fixedMapExpression":', str: 'fixedMapExpression:'},
-        {match: '"flexibleMapExpression":', str: 'flexibleMapExpression:'},
+        { match: '"Name":', str: 'Name:' },
+        { match: '"remark":', str: 'remark:' },
+        { match: '"items":', str: 'items:' },
+        { match: '"ID":', str: 'ID:' },
+        { match: '"DataType":', str: 'DataType:' },
+        { match: '"TableName":', str: 'TableName:' },
+        { match: '"descr":', str: 'descr:' },
+        { match: '"mapExpression":', str: 'mapExpression:' },
+        { match: '"Precision":', str: 'Precision:' },
+        { match: '"type":', str: 'type:' },
+        { match: '"flexibleRefFieldID":', str: 'flexibleRefFieldID:' },
+        { match: '"fixedMapExpression":', str: 'fixedMapExpression:' },
+        { match: '"flexibleMapExpression":', str: 'flexibleMapExpression:' },
     ];
     for (const rs of replaceStr) {
         const reg = new RegExp(rs.match, 'gm');
@@ -377,7 +497,7 @@ const saveTableDefine = async function (tableDefine, file) {
     await saveBufferFile(defineStr, file);
 };
 
-const exportTableDefine = async function (define) {
+const exportTableDefine = async function(define) {
     const tableDefine = {};
     tableDefine.Name = define.name;// '期-清单-全参与人数据表(mem_stage_bills_compare)';
     tableDefine.remark = define.remark;
@@ -386,12 +506,18 @@ const exportTableDefine = async function (define) {
     tableDefine.items = [];
     tableDefine.prefix = define.prefix;
     for (const col of define.cols) {
-        addFields(tableDefine, col.name, col.field, col.type, col.tag);
+        addFields(tableDefine, col);
     }
+    addFields(tableDefine, { id: 99, name: '空白', field: '', type: dataType.str });
     await saveTableDefine(tableDefine, path.join(savePath, define.key + '_define.json'));
 };
 
-const defines = [stage_jgcl, stage_bonus, stage_other, change, change_bills, stage_pos, stage_pos_compare, stage_pay];
+const defines = [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,
+];
 for (const d of defines) {
     exportTableDefine(d);
 }

+ 0 - 8
sql/update.sql

@@ -1,8 +0,0 @@
-ALTER TABLE `zh_stage_pay`
-ADD COLUMN `start_stage_order`  tinyint(4) NULL COMMENT '第几期开始计量' AFTER `pre_finish`;
-
-INSERT INTO `calculation`.`zh_permission` (`id`, `name`, `controller`, `action`, `pid`, `icon_class`, `create_time`, `isshow`) VALUES ('60', '上传二维码', 'project', 'uploadQrCode', '38', '', NULL, '1');
-INSERT INTO `calculation`.`zh_permission` (`id`, `name`, `controller`, `action`, `pid`, `icon_class`, `create_time`, `isshow`) VALUES ('62', '升级说明', 'version', '', '31', '', NULL, '1');
-INSERT INTO `calculation`.`zh_permission` (`id`, `name`, `controller`, `action`, `pid`, `icon_class`, `create_time`, `isshow`) VALUES ('63', '添加版本', 'version', 'add', '62', '', NULL, '1');
-INSERT INTO `calculation`.`zh_permission` (`id`, `name`, `controller`, `action`, `pid`, `icon_class`, `create_time`, `isshow`) VALUES ('64', '修改版本', 'version', 'add', '62', '', NULL, '1');
-INSERT INTO `calculation`.`zh_permission` (`id`, `name`, `controller`, `action`, `pid`, `icon_class`, `create_time`, `isshow`) VALUES ('65', '删除版本', 'version', 'delete', '62', '', NULL, '1');

+ 4 - 5
sql/update20200323.sql

@@ -1,3 +1,6 @@
+-- ----------------------------
+-- 权限 新增合同支付修改权限
+-- ----------------------------
 INSERT INTO `calculation`.`zh_permission` (`id`, `name`, `controller`, `action`, `pid`, `icon_class`, `create_time`, `isshow`) VALUES ('66', '合同支付', 'project', 'dealpay', '38', '', NULL, '1');
 
 SET FOREIGN_KEY_CHECKS=0;
@@ -5,7 +8,6 @@ SET FOREIGN_KEY_CHECKS=0;
 -- ----------------------------
 -- Table structure for zh_stage_jgcl
 -- ----------------------------
-DROP TABLE IF EXISTS `zh_stage_jgcl`;
 CREATE TABLE `zh_stage_jgcl` (
   `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
   `uuid` varchar(50) CHARACTER SET ascii NOT NULL COMMENT '材料id(uuid)',
@@ -27,12 +29,11 @@ CREATE TABLE `zh_stage_jgcl` (
   `order` int(11) NOT NULL COMMENT '排序字段',
   `pre_used` tinyint(1) DEFAULT NULL COMMENT '是否计量过',
   PRIMARY KEY (`id`)
-) ENGINE=InnoDB AUTO_INCREMENT=132 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
 
 -- ----------------------------
 -- Table structure for zh_stage_bonus
 -- ----------------------------
-DROP TABLE IF EXISTS `zh_stage_bonus`;
 CREATE TABLE `zh_stage_bonus` (
   `id` varchar(50) CHARACTER SET ascii COLLATE ascii_bin NOT NULL COMMENT '主键id(uuid)',
   `tid` int(11) NOT NULL COMMENT '标段id',
@@ -54,7 +55,6 @@ CREATE TABLE `zh_stage_bonus` (
 -- ----------------------------
 -- Table structure for zh_stage_other
 -- ----------------------------
-DROP TABLE IF EXISTS `zh_stage_other`;
 CREATE TABLE `zh_stage_other` (
   `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id',
   `uuid` varchar(50) CHARACTER SET ascii NOT NULL COMMENT 'uuid',
@@ -78,7 +78,6 @@ CREATE TABLE `zh_stage_other` (
 -- ----------------------------
 -- Table structure for zh_rpt_custom_define
 -- ----------------------------
-DROP TABLE IF EXISTS `zh_rpt_custom_define`;
 CREATE TABLE `zh_rpt_custom_define` (
   `id` int(11) NOT NULL AUTO_INCREMENT,
   `tid` int(11) NOT NULL COMMENT '标段id',

+ 14 - 0
sql/update20200325.sql

@@ -0,0 +1,14 @@
+-- ----------------------------
+-- 合同支付,新增字段
+-- ----------------------------
+ALTER TABLE `zh_stage_pay`
+ADD COLUMN `start_stage_order`  tinyint(4) NULL COMMENT '第几期开始计量' AFTER `pre_finish`;
+
+-- ----------------------------
+-- 权限控制表,新增部分权限
+-- ----------------------------
+INSERT INTO `calculation`.`zh_permission` (`id`, `name`, `controller`, `action`, `pid`, `icon_class`, `create_time`, `isshow`) VALUES ('60', '上传二维码', 'project', 'uploadQrCode', '38', '', NULL, '1');
+INSERT INTO `calculation`.`zh_permission` (`id`, `name`, `controller`, `action`, `pid`, `icon_class`, `create_time`, `isshow`) VALUES ('62', '升级说明', 'version', '', '31', '', NULL, '1');
+INSERT INTO `calculation`.`zh_permission` (`id`, `name`, `controller`, `action`, `pid`, `icon_class`, `create_time`, `isshow`) VALUES ('63', '添加版本', 'version', 'add', '62', '', NULL, '1');
+INSERT INTO `calculation`.`zh_permission` (`id`, `name`, `controller`, `action`, `pid`, `icon_class`, `create_time`, `isshow`) VALUES ('64', '修改版本', 'version', 'add', '62', '', NULL, '1');
+INSERT INTO `calculation`.`zh_permission` (`id`, `name`, `controller`, `action`, `pid`, `icon_class`, `create_time`, `isshow`) VALUES ('65', '删除版本', 'version', 'delete', '62', '', NULL, '1');

+ 8 - 19
test/app/report_data.test.js

@@ -10,11 +10,11 @@
 
 const { app, assert } = require('egg-mock/bootstrap');
 const mockData = {};
-const tenderId = 2076;
-const stageOrder = 1;
+const tenderId = 2046;
+const stageOrder = 3;
 const postData = {
-    account: 'liangqibo',
-    project: 'P1116',
+    account: 'zengpeiwen',
+    project: 'P1201',
     project_password: '123456',
 };
 
@@ -31,21 +31,10 @@ describe('temp_report_test.js', () => {
     it('test temp', function* () {
         const ctx = app.mockContext(mockData);
         // test12 - 第4期
-        const stage = yield ctx.service.stage.getDataByCondition({tid: tenderId, order: stageOrder});
-        const mainData = yield ctx.service.reportMemory.getStageBillsCompareData(tenderId, stage.id, [
-            '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',
-            'r0_contract_qty', 'r0_contract_tp', 'r0_qc_qty', 'r0_qc_tp', 'r0_gather_qty', 'r0_gather_tp',
-            'r1_contract_qty', 'r1_contract_tp', 'r1_qc_qty', 'r1_qc_tp', 'r1_gather_qty', 'r1_gather_tp',
-            'pre_contract_qty', 'pre_contract_tp', 'pre_qc_qty', 'pre_qc_tp', 'pre_gather_qty', 'pre_gather_tp',
-            'chapter',
-        ]);
+        const stage = yield ctx.service.stage.getDataByCondition({ tid: tenderId, order: stageOrder });
+        const mainData = yield ctx.service.reportMemory.getStageImZlData(tenderId, stage.id);
         if (mainData instanceof Array) {
-            yield ctx.helper.saveBufferFile(JSON.stringify(mainData,"","\t"), ctx.app.baseDir + '/mem_stage_bills_compare.json');
+            yield ctx.helper.saveBufferFile(JSON.stringify(mainData, '', '\t'), ctx.app.baseDir + '/mem_stage_im_zl.json');
         }
     });
-});
+});