MaiXinRong преди 6 години
родител
ревизия
d971dad13c

+ 2 - 19
app/base/base_controller.js

@@ -107,17 +107,6 @@ class BaseController extends Controller {
         };
     }
 
-    async getCommonRenderData (ctx) {
-        const tenderId = ctx.params.id;
-        const tender = await ctx.service.tender.getTender(tenderId);
-        if (tender.project_id !== ctx.session.sessionProject.id) {
-            this.setMessage('您无权查看该项目', this.messageType.ERROR);
-            throw '您无权查看该项目';
-        }
-
-        return { tender, tenderMenu: this.menu.tenderMenu, preUrl: '/tender/' + tenderId, };
-    }
-
     log(error) {
         if (error.stack) {
             this.ctx.logger.error(error);
@@ -131,14 +120,8 @@ class BaseController extends Controller {
         }
     }
 
-    async checkMeasureType (tenderId, mt) {
-        if (!this.ctx.tender) {
-            this.ctx.tender = await this.ctx.service.tender.getTender(tenderId);
-        }
-        if (!this.ctx.tender.measure_type) {
-            throw '请先确认计量模式后再录入数据';
-        }
-        if (this.ctx.tender.measure_type !== mt) {
+    async checkMeasureType (mt) {
+        if (this.ctx.tender.data.measure_type !== mt) {
             throw '该模式下不可提交此数据';
         }
     }

+ 12 - 5
app/const/spread.js

@@ -8,6 +8,9 @@
  * @version
  */
 
+const tzWithoutCols = ['deal_qty', 'deal_tp'];
+const dgnCols = ['dgn_qty1', 'dgn_qty2', 'dgn_price'];
+
 const ledgerSpread = {
     cols: [
         {title: '项目节编号', colSpan: '1', rowSpan: '2', field: 'code', hAlign: 0, width: 150, formatter: '@', cellType: 'tree'},
@@ -15,13 +18,13 @@ const ledgerSpread = {
         {title: '名称', colSpan: '1', rowSpan: '2', field: 'name', hAlign: 0, width: 230, formatter: '@'},
         {title: '单位', colSpan: '1', rowSpan: '2', field: 'unit', hAlign: 1, width: 50, formatter: '@'},
         {title: '单价', colSpan: '1', rowSpan: '2', field: 'unit_price', hAlign: 2, width: 60, type: 'Number'},
-        {title: '设计数量1',  colSpan: '1', rowSpan: '2', field: 'dgn_quantity1', hAlign: 2, width: 60, type: 'Number'},
-        {title: '设计数量2',  colSpan: '1', rowSpan: '2', field: 'dgn_quantity2', hAlign: 2, width: 60, type: 'Number'},
+        {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: '2|1', rowSpan: '1|1', field: 'quantity', hAlign: 2, width: 60, type: 'Number'},
+        {title: '签约|数量', colSpan: '2|1', rowSpan: '1|1', field: 'deal_qty', hAlign: 2, width: 60, type: 'Number'},
+        {title: '|金额', colSpan: '|1', rowSpan: '|1', field: 'deal_tp', hAlign: 2, width: 60, type: 'Number'},
+        {title: '施工图复核|数量', colSpan: '2|1', rowSpan: '1|1', field: 'quantity', hAlign: 2, width: 60, type: 'Number'},
         {title: '|金额', colSpan: '|1', rowSpan: '|1', field: 'total_price', hAlign: 2, width: 60, type: 'Number'},
-        {title: '施工图复核|数量', colSpan: '2|1', rowSpan: '1|1', field: 'f_quantity', hAlign: 2, width: 60, type: 'Number'},
-        {title: '|金额', colSpan: '|1', rowSpan: '|1', field: 'f_total_price', hAlign: 2, width: 60, type: 'Number'},
         {title: '图(册)号', colSpan: '1', rowSpan: '2', field: 'drawing_code', hAlign: 0, width: 80, formatter: '@'},
         {title: '备注', colSpan: '1', rowSpan: '2', field: 'memo', hAlign: 0, width: 100, formatter: '@'}
     ],
@@ -93,4 +96,8 @@ module.exports = {
     ledgerPosSpread,
     measureSpread,
     measurePosSpread,
+    filterCols: {
+        tzWithoutCols,
+        dgnCols,
+    }
 };

+ 5 - 18
app/controller/deal_bills_controller.js

@@ -27,13 +27,9 @@ module.exports = app => {
                 data: [],
             };
             try {
-                const tenderId = ctx.params.id;
-                if (isNaN(tenderId) || tenderId <= 0) {
-                    throw '参数错误';
-                }
-
-                responseData.data =  await ctx.service.dealBills.getAllDataByCondition({ where: {tender_id: tenderId} });
+                responseData.data =  await ctx.service.dealBills.getAllDataByCondition({ where: {tender_id: ctx.tender.id} });
             } catch (error) {
+                this.log(error);
                 responseData.err = 1;
                 responseData.msg = error.toString();
             }
@@ -54,11 +50,6 @@ module.exports = app => {
             };
             let stream;
             try {
-                const tenderId = ctx.session.sessionUser.tenderId;
-                if (isNaN(tenderId) || tenderId <= 0) {
-                    throw '参数错误';
-                }
-
                 stream = await ctx.getFileStream();
                 const create_time = Date.parse(new Date())/1000;
                 const fileInfo = path.parse(stream.filename);
@@ -70,12 +61,12 @@ module.exports = app => {
                 if (!sheet || sheet.length === 0 || sheet[0] === undefined || sheet[0].data === undefined) {
                     throw 'excel没有对应数据';
                 }
-                const result = await ctx.service.dealBills.importData(sheet[0], tenderId);
+                const result = await ctx.service.dealBills.importData(sheet[0], ctx.tender.id);
                 if (!result) {
                     throw '导入数据失败';
                 }
 
-                responseData.data =  await this.ctx.service.dealBills.getAllDataByCondition({ where: {tender_id: tenderId} });
+                responseData.data =  await this.ctx.service.dealBills.getAllDataByCondition({ where: {tender_id: ctx.tender.id} });
             } catch (err) {
                 this.log(err);
                 // 失败需要消耗掉stream 以防卡死
@@ -101,12 +92,8 @@ module.exports = app => {
                     if (file === 'template.xls') {
                         fileName = this.app.baseDir + '/app/public/deal_bills/deal_template.xls';
                     } else {
-                        const tenderId = ctx.session.sessionUser.tenderId;
-                        if (isNaN(tenderId) || data.tenderId <= 0) {
-                            throw '参数错误';
-                        }
                         const create_time = Date.parse(new Date())/1000;
-                        fileName = this.app.baseDir + '/app/public/deal_bills/downloads/' + tenderId + '-' + create_time + '.xlsx';
+                        fileName = this.app.baseDir + '/app/public/deal_bills/downloads/' + ctx.tender.id + '-' + create_time + '.xlsx';
                         // todo 导出签约清单Excel
                     }
                     ctx.body = await fs.readFileSync(fileName);

+ 42 - 80
app/controller/ledger_audit_controller.js

@@ -30,23 +30,26 @@ module.exports = app => {
          * @returns {Promise<void>}
          */
         async index(ctx) {
-            const tenderId = parseInt(ctx.params.id);
             try {
-                const renderData = await this.getCommonRenderData(ctx);
-                const tender = renderData.tender;
-                if (!tender.ledger_times) {
-                    tender.ledger_times = 1;
-                }
+                const renderData = {
+                    tender: ctx.tender.data,
+                    tenderMenu: this.menu.tenderMenu,
+                    preUrl: '/tender/' + ctx.tender.id,
+                };
 
-                const curAuditor = await ctx.service.ledgerAudit.getCurAuditor(tenderId, tender.ledger_times);
+                const curAuditor = await ctx.service.ledgerAudit.getCurAuditor(ctx.tender.id, ctx.tender.data.ledger_times);
                 if (curAuditor && curAuditor.audit_id !== ctx.session.sessionUser.accountId) {
                     throw '审核信息错误';
                 }
 
-                const auditors = await ctx.service.ledgerAudit.getAuditors(tenderId, tender.ledger_times);
-                const ledgerData = await ctx.service.ledger.getDataByTenderId(tenderId);
+                const auditors = await ctx.service.ledgerAudit.getAuditors(ctx.tender.id, ctx.tender.data.ledger_times);
+                const ledgerData = await ctx.service.ledger.getDataByTenderId(ctx.tender.id);
                 const content = await ctx.service.ledgerAuditContent.getAllDataByCondition({
-                    where: {tender_id: tenderId, times: tender.ledger_times, audit_id: auditors[0].audit_id}
+                    where: {
+                        tender_id: ctx.tender.id,
+                        times: ctx.tender.data.ledger_times,
+                        audit_id: auditors[0].audit_id,
+                    }
                 });
                 renderData.curAuditor = curAuditor;
                 renderData.auditConst = auditConst;
@@ -57,8 +60,8 @@ module.exports = app => {
                 renderData.readOnly = true;
                 await this.layout('ledger/audit.ejs', renderData, 'ledger/audit_modal.ejs');
             } catch(err) {
-                console.log(err);
-                ctx.redirect('/tender/'+tenderId);
+                this.log(err);
+                ctx.redirect('/tender/'+ ctx.tender.id);
             }
         }
 
@@ -75,22 +78,18 @@ module.exports = app => {
                 data: [],
             };
             try {
-                const tenderId = ctx.params.id;
-                if (!tenderId) {
-                    throw '当前未打开标段';
-                }
                 const data = JSON.parse(ctx.request.body.data);
                 const id = data.auditorId;
                 if (isNaN(id) || id <= 0) {
                     throw '参数错误';
                 }
 
-                const result = await ctx.service.ledgerAudit.addAuditor(tenderId, id);
+                const result = await ctx.service.ledgerAudit.addAuditor(ctx.tender.id, id);
                 if (!result) {
                     throw '添加审核人失败';
                 }
 
-                responseData.data = await ctx.service.ledgerAudit.getAuditor(tenderId, id);
+                responseData.data = await ctx.service.ledgerAudit.getAuditor(ctx.tender.id, id);
             } catch (err) {
                 responseData.err = 1;
                 responseData.msg = err.toString();
@@ -112,22 +111,18 @@ module.exports = app => {
                 data: [],
             };
             try {
-                const tenderId = ctx.params.id;
-                if (!tenderId) {
-                    throw '当前未打开标段';
-                }
                 const data = JSON.parse(ctx.request.body.data);
-                const id = data.auditorId;
-                if (!(id instanceof Number) || isNaN(id) || id <= 0) {
+                const id = data.auditorId instanceof Number ? data.auditorId : this.app._.toNumber(data.auditorId);
+                if ( isNaN(id) || id <= 0) {
                     throw '参数错误';
                 }
 
-                const result = await ctx.service.ledgerAudit.deleteAuditor(tenderId, id);
+                const result = await ctx.service.ledgerAudit.deleteAuditor(ctx.tender.id, id);
                 if (!result) {
                     throw '移除审核人失败';
                 }
 
-                responseData.data = await ctx.service.ledgerAudit.getAuditors(tenderId);
+                responseData.data = await ctx.service.ledgerAudit.getAuditors(ctx.tender.id);
             } catch (err) {
                 responseData.err = 1;
                 responseData.msg = err.toString();
@@ -144,28 +139,20 @@ module.exports = app => {
          */
         async start(ctx) {
             try {
-                const tenderId = ctx.params.id;
-                if (!tenderId) {
-                    throw '未打开标段';
-                }
-                const tenderData = await ctx.service.tender.getDataById(tenderId);
-                if (!tenderData || tenderData.ledger_status === auditConst.status.checking || tenderData.ledger_status === auditConst.status.checked) {
+                if (!ctx.tender.data || ctx.tender.data.ledger_status === auditConst.status.checking || ctx.tender.data.ledger_status === auditConst.status.checked) {
                     throw '标段数据有误';
                 }
-                if (tenderData.user_id !== ctx.session.sessionUser.accountId) {
+                if (ctx.tender.data.user_id !== ctx.session.sessionUser.accountId) {
                     throw '上报失败';
                 }
-                if (!tenderData.ledger_times) {
-                    tenderData.ledger_times = 1;
-                }
 
-                await ctx.service.ledgerAudit.start(tenderId, tenderData.ledger_times);
+                await ctx.service.ledgerAudit.start(ctx.tender.id, ctx.tender.data.ledger_times);
 
-                ctx.redirect('/ledger/explode');
+                ctx.redirect('/tender/' + ctx.tender.id + '/ledger/explode');
             } catch (err) {
-                console.log(err);
+                this.log(err);
                 ctx.session.postError = err.toString();
-                ctx.redirect('/ledger/explode');
+                ctx.redirect('/tender/' + ctx.tender.id + '/ledger/explode');
             }
         }
 
@@ -177,18 +164,11 @@ module.exports = app => {
          */
         async check(ctx) {
             try {
-                const tenderId = ctx.params.id;
-                if (!tenderId) {
-                    throw '当前未打开标段';
-                }
-                const tenderData = await ctx.service.tender.getDataById(tenderId);
-                if (!tenderData || tenderData.ledger_status !== auditConst.status.checking ) {
+                const tender = ctx.tender;
+                if (!tender.data || tender.data.ledger_status !== auditConst.status.checking ) {
                     throw '当前标段数据有误';
                 }
-                if (!tenderData.ledger_times) {
-                    tenderData.ledger_times = 1;
-                }
-                const curAudit = await ctx.service.ledgerAudit.getCurAuditor(tenderId, tenderData.ledger_times);
+                const curAudit = await ctx.service.ledgerAudit.getCurAuditor(tender.id, tender.data.ledger_times);
                 if (curAudit.audit_id !== ctx.session.sessionUser.accountId) {
                     throw '审批失败';
                 }
@@ -197,11 +177,11 @@ module.exports = app => {
                     throw '提交数据错误';
                 }
 
-                await ctx.service.ledgerAudit.check(tenderId, checkType, ctx.request.body.opinion, tenderData.ledger_times);
+                await ctx.service.ledgerAudit.check(tender.id, checkType, ctx.request.body.opinion, tender.data.ledger_times);
 
-                ctx.redirect('/ledger/explode');
+                ctx.redirect('/tender/'+ ctx.tender.id + '/ledger/explode');
             } catch (err) {
-                console.log(err);
+                this.log(err);
                 ctx.session.postError = err.toString();
                 ctx.redirect(ctx.request.header.referer);
             }
@@ -219,29 +199,22 @@ module.exports = app => {
                 data: [],
             };
             try {
-                const tenderId = ctx.params.id;
-                if (!tenderId) {
-                    throw '当前未打开标段';
-                }
-                const tenderData = await ctx.service.tender.getDataById(tenderId);
-                if (!tenderData || tenderData.ledger_status !== auditConst.status.checking ) {
+                const tender = ctx.tender;
+                if (!tender.data || tender.data.ledger_status !== auditConst.status.checking ) {
                     throw '当前标段数据有误';
                 }
-                if (!tenderData.ledger_times) {
-                    tenderData.ledger_times = 1;
-                }
-                const curAudit = await ctx.service.ledgerAudit.getCurAuditor(tenderId, tenderData.ledger_times);
+                const curAudit = await ctx.service.ledgerAudit.getCurAuditor(tender.id, tender.data.ledger_times);
                 if (curAudit.audit_id !== ctx.session.sessionUser.accountId) {
                     throw '添加清单意见失败';
                 }
                 const data = JSON.parse(ctx.request.body.data);
 
-                await ctx.service.ledgerAuditContent.add(tenderData, curAudit.audit_id, data);
+                await ctx.service.ledgerAuditContent.add(tender.data, curAudit.audit_id, data);
                 responseData.data = await ctx.service.ledgerAuditContent.getAllDataByCondition({
-                    where: {tender_id: tenderId, times: tenderData.ledger_times, audit_id: curAudit.audit_id}
+                    where: {tender_id: tenderId, times: tender.data.ledger_times, audit_id: curAudit.audit_id}
                 });
             } catch (err) {
-                console.log(err);
+                this.log(err);
                 responseData.err = 1;
                 responseData.msg = err.toString();
             }
@@ -261,25 +234,14 @@ module.exports = app => {
                 data: [],
             };
             try {
-                const tenderId = ctx.params.id;
-                if (!tenderId) {
-                    throw '当前未打开标段';
-                }
-                const tenderData = await ctx.service.tender.getDataById(tenderId);
-                if (!tenderData) {
-                    throw '当前标段数据有误';
-                }
-                if (!tenderData.ledger_times) {
-                    tenderData.ledger_times = 1;
-                }
                 const data = JSON.parse(ctx.request.body.data);
 
-                const times = tenderData.ledger_status === auditConst.status.checkNo ? tenderData.ledger_times - 1 : tenderData.ledger_times;
+                const times = ctx.tender.data.ledger_status === auditConst.status.checkNo ? ctx.tender.data.ledger_times - 1 : ctx.tender.data.ledger_times;
                 responseData.data = await ctx.service.ledgerAuditContent.getAllDataByCondition({
-                    where: {tender_id: tenderId, times: times, audit_id: data.audit_id}
+                    where: {tender_id: ctx.tender.id, times: times, audit_id: data.audit_id}
                 });
             } catch (err) {
-                console.log(err);
+                this.log(err);
                 responseData.err = 1;
                 responseData.msg = err.toString();
             }

+ 71 - 87
app/controller/ledger_controller.js

@@ -35,6 +35,33 @@ module.exports = app => {
         }
 
         /**
+         * 获取SpreadSetting
+         * @private
+         */
+        _getSpreadSetting() {
+            const _ = this.app._;
+            function removeFieldCols(setting, cols) {
+                _.remove(setting.cols, function (c) {
+                    return cols.indexOf(c.field) > -1;
+                });
+            }
+            const ledger = JSON.parse(JSON.stringify(spreadConst.ledgerSpread));
+            const pos = JSON.parse(JSON.stringify(spreadConst.ledgerPosSpread));
+            const tender = this.ctx.tender;
+            if (this._ledgerReadOnly(tender.data)) {
+                ledger.readOnly = true;
+                pos.readOnly = true;
+            }
+            if (tender.data.measure_type === measureType.tz.value) {
+                removeFieldCols(ledger, spreadConst.filterCols.tzWithoutCols);
+            }
+            if (!tender.info.display.ledger.dgnQty) {
+                removeFieldCols(ledger, spreadConst.filterCols.dgnCols);
+            }
+            return [ledger, pos];
+        }
+
+        /**
          * 台账分解页面 (Get)
          *
          * @param {Object} ctx - egg全局变量
@@ -42,35 +69,28 @@ module.exports = app => {
          */
         async explode(ctx) {
             try {
-                const tenderId = ctx.params.id;
-                const tender = await this.service.tender.getTender(tenderId);
-                const tenderInfo = await this.service.tenderInfo.getTenderInfo(tenderId);
+                const tender = ctx.tender;
+                const [ledgerSpread, posSpread] = this._getSpreadSetting();
 
-                if (!tender.ledger_status) {
-                    tender.ledger_status = auditConst.status.uncheck;
-                }
-                if (!tender.ledger_times) {
-                    tender.ledger_times = 1;
-                }
-                const curAuditor = await ctx.service.ledgerAudit.getCurAuditor(tenderId, tender.ledger_times);
-                const times = tender.ledger_status === auditConst.status.checkNo ? tender.ledger_times - 1 : tender.ledger_times;
-                const auditors = await ctx.service.ledgerAudit.getAuditors(tenderId, times);
+                const curAuditor = await ctx.service.ledgerAudit.getCurAuditor(tender.id, tender.data.ledger_times);
+                const times = tender.data.ledger_status === auditConst.status.checkNo ? tender.data.ledger_times - 1 : tender.data.ledger_times;
+                const auditors = await ctx.service.ledgerAudit.getAuditors(tender.id, times);
                 const content = auditors.length > 0 ? await ctx.service.ledgerAuditContent.getAllDataByCondition({
-                    where: {tender_id: tenderId, times: times, audit_id: auditors[0].audit_id}
+                    where: {tender_id: tender.id, times: times, audit_id: auditors[0].audit_id}
                 }) : null;
-                const ledgerData = await ctx.service.ledger.getDataByTenderId(tenderId, -1);
+                const ledgerData = await ctx.service.ledger.getDataByTenderId(tender.id, -1);
                 const renderData = {
-                    tender,
-                    tenderInfo,
+                    tender: tender.data,
+                    tenderInfo: tender.info,
                     auditConst,
                     auditors,
                     curAuditor,
                     content,
                     ledger: JSON.stringify(ledgerData),
-                    ledgerSpreadSetting: JSON.stringify(spreadConst.ledgerSpread),
-                    posSpreadSetting: JSON.stringify(spreadConst.ledgerPosSpread),
+                    ledgerSpreadSetting: JSON.stringify(ledgerSpread),
+                    posSpreadSetting: JSON.stringify(posSpread),
                     tenderMenu,
-                    preUrl: '/tender/' + tenderId,
+                    preUrl: '/tender/' + tender.id,
                     measureType,
                 };
                 await this.layout('ledger/explode.ejs', renderData, 'ledger/explode_modal.ejs');
@@ -86,8 +106,9 @@ module.exports = app => {
          * @returns {boolean}
          * @private
          */
-        _ledgerReadOnly (tenderData) {
-            return tenderData.ledger_status === auditConst.status.checking || tenderData.ledger_status === auditConst.status.checked;
+        _ledgerReadOnly () {
+            const tender = this.ctx.tender.data;
+            return tender.ledger_status === auditConst.status.checking || tender.ledger_status === auditConst.status.checked;
         }
 
         /**
@@ -102,17 +123,13 @@ module.exports = app => {
                 data: [],
             };
             try {
-                const tenderId = ctx.params.id;
-                if (!tenderId) {
-                    throw '当前未打开标段';
-                }
                 const data = JSON.parse(ctx.request.body.data);
                 const id = data.ledger_id;
                 if (isNaN(id) || id <= 0) {
                     throw '参数错误';
                 }
 
-                responseData.data = await ctx.service.ledger.getChildrenByParentId(tenderId, id);
+                responseData.data = await ctx.service.ledger.getChildrenByParentId(ctx.tender.id, id);
             } catch (err) {
                 responseData.err = 1;
                 responseData.msg = err;
@@ -133,37 +150,28 @@ module.exports = app => {
                 data: [],
             };
             try {
-                const tenderId = ctx.params.id;
-                if (!tenderId) {
-                    throw '当前未打开标段';
-                }
-                const tenderData = await ctx.service.tender.getDataById(tenderId);
-                if (!tenderData || tenderData.user_id !== ctx.session.sessionUser.accountId || this._ledgerReadOnly(tenderData)) {
+                if (!ctx.tender.data || ctx.tender.data.user_id !== ctx.session.sessionUser.accountId || this._ledgerReadOnly()) {
                     throw '标段数据错误';
                 }
-                const data = JSON.parse(ctx.request.body.data);
-                if ((isNaN(data.id) || data.id <= 0) || (!data.postType)) {
-                    throw '参数错误';
-                }
 
                 switch (data.postType) {
                     case 'add':
-                        responseData.data = await ctx.service.ledger.addNode(tenderId, data.id);
+                        responseData.data = await ctx.service.ledger.addNode(ctx.tender.id, data.id);
                         break;
                     case 'delete':
-                        responseData.data = await ctx.service.ledger.deleteNode(tenderId, data.id);
+                        responseData.data = await ctx.service.ledger.deleteNode(ctx.tender.id, data.id);
                         break;
                     case 'up-move':
-                        responseData.data = await ctx.service.ledger.upMoveNode(tenderId, data.id);
+                        responseData.data = await ctx.service.ledger.upMoveNode(ctx.tender.id, data.id);
                         break;
                     case 'down-move':
-                        responseData.data = await ctx.service.ledger.downMoveNode(tenderId, data.id);
+                        responseData.data = await ctx.service.ledger.downMoveNode(ctx.tender.id, data.id);
                         break;
                     case 'up-level':
-                        responseData.data = await ctx.service.ledger.upLevelNode(tenderId, data.id);
+                        responseData.data = await ctx.service.ledger.upLevelNode(ctx.tender.id, data.id);
                         break;
                     case 'down-level':
-                        responseData.data = await ctx.service.ledger.downLevelNode(tenderId, data.id);
+                        responseData.data = await ctx.service.ledger.downLevelNode(ctx.tender.id, data.id);
                         break;
                     default:
                         throw '未知操作';
@@ -189,19 +197,14 @@ module.exports = app => {
                 data: [],
             };
             try {
-                const tenderId = ctx.params.id;
-                if (!tenderId) {
-                    throw '当前未打开标段';
-                }
-                const tenderData = await ctx.service.tender.getDataById(tenderId);
-                if (!tenderData || tenderData.user_id !== ctx.session.sessionUser.accountId || this._ledgerReadOnly(tenderData)) {
+                if (!ctx.tender.data || ctx.tender.data.user_id !== ctx.session.sessionUser.accountId || this._ledgerReadOnly()) {
                     throw '标段数据错误';
                 }
                 const data = JSON.parse(ctx.request.body.data);
                 if (data instanceof Array) {
-                    responseData.data = await ctx.service.ledger.updateInfos(tenderId, data);
+                    responseData.data = await ctx.service.ledger.updateInfos(ctx.tender.id, data);
                 } else {
-                    responseData.data = await ctx.service.ledger.updateInfo(tenderId, data);
+                    responseData.data = await ctx.service.ledger.updateInfo(ctx.tender.id, data);
                 }
             } catch (err) {
                 responseData.err = 1;
@@ -227,7 +230,7 @@ module.exports = app => {
                     throw '标段数据错误';
                 }
                 const data = JSON.parse(ctx.request.body.data);
-                responseData.data = await ctx.service.ledger.updateCalc(tenderId, data);
+                responseData.data = await ctx.service.ledger.updateCalc(ctx.tender.id, data);
             } catch (err) {
                 this.log(err);
                 responseData.err = 1;
@@ -250,12 +253,7 @@ module.exports = app => {
                 data: [],
             };
             try {
-                const tenderId = ctx.params.id;
-                if (!tenderId) {
-                    throw '当前未打开标段';
-                }
-                const tenderData = await ctx.service.tender.getDataById(tenderId);
-                if (!tenderData || tenderData.user_id !== ctx.session.sessionUser.accountId || this._ledgerReadOnly(tenderData)) {
+                if (!ctx.tender.data || ctx.tender.data.user_id !== ctx.session.sessionUser.accountId || this._ledgerReadOnly()) {
                     throw '标段数据错误';
                 }
                 const data = JSON.parse(ctx.request.body.data);
@@ -263,7 +261,7 @@ module.exports = app => {
                     throw '参数错误';
                 }
 
-                responseData.data = await ctx.service.ledger.pasteBlock(tenderId, data.id, data.block);
+                responseData.data = await ctx.service.ledger.pasteBlock(ctx.tender.id, data.id, data.block);
             } catch (err) {
                 responseData.err = 1;
                 responseData.msg = err;
@@ -284,12 +282,7 @@ module.exports = app => {
                 data: [],
             };
             try {
-                const tenderId = ctx.params.id;
-                if (!tenderId) {
-                    throw '当前未打开标段';
-                }
-                const tenderData = await ctx.service.tender.getDataById(tenderId);
-                if (!tenderData || tenderData.user_id !== ctx.session.sessionUser.accountId || this._ledgerReadOnly(tenderData)) {
+                if (!ctx.tender.data || ctx.tender.data.user_id !== ctx.session.sessionUser.accountId || this._ledgerReadOnly()) {
                     throw '标段数据错误';
                 }
                 const data = JSON.parse(ctx.request.body.data);
@@ -313,10 +306,10 @@ module.exports = app => {
                 const addType = stdDataAddType.withParent;
                 switch (addType) {
                     case stdDataAddType.self:
-                        responseData.data = await ctx.service.ledger.addStdNode(tenderId, data.id, stdData);
+                        responseData.data = await ctx.service.ledger.addStdNode(ctx.tender.id, data.id, stdData);
                         break;
                     case stdDataAddType.withParent:
-                        responseData.data = await ctx.service.ledger.addStdNodeWithParent(tenderId, stdData, stdLib);
+                        responseData.data = await ctx.service.ledger.addStdNodeWithParent(ctx.tender.id, stdData, stdLib);
                         break;
                     default:
                         throw '未知添加方法';
@@ -347,12 +340,7 @@ module.exports = app => {
                 data: [],
             };
             try {
-                const tenderId = ctx.params.id;
-                if (!tenderId) {
-                    throw '当前未打开标段';
-                }
-                const tenderData = await ctx.service.tender.getDataById(tenderId);
-                if (!tenderData || tenderData.user_id !== ctx.session.sessionUser.accountId || this._ledgerReadOnly(tenderData)) {
+                if (!ctx.tender.data || ctx.tender.data.user_id !== ctx.session.sessionUser.accountId || this._ledgerReadOnly()) {
                     throw '标段数据错误';
                 }
                 const data = JSON.parse(ctx.request.body.data);
@@ -362,10 +350,10 @@ module.exports = app => {
 
                 switch (data.batchType) {
                     case 'child':
-                        responseData.data = await ctx.service.ledger.batchInsertChild(tenderId, data.id, data.batchData);
+                        responseData.data = await ctx.service.ledger.batchInsertChild(ctx.tender.id, data.id, data.batchData);
                         break;
                     case 'next':
-                        responseData.data = await ctx.service.ledger.batchInsertNext(tenderId, data.id, data.batchData);
+                        responseData.data = await ctx.service.ledger.batchInsertNext(ctx.tender.id, data.id, data.batchData);
                         break;
                     default:
                         throw '参数错误';
@@ -484,13 +472,9 @@ module.exports = app => {
          */
         async pos(ctx) {
             try {
-                const tenderId = ctx.params.id;
-                if (!tenderId) {
-                    throw '当前未打开标段';
-                }
-                await this.checkMeasureType(tenderId, measureType.tz.value);
+                await this.checkMeasureType(measureType.tz.value);
                 const condition = JSON.parse(ctx.request.body.data) || {};
-                condition.tid = tenderId;
+                condition.tid = ctx.tender.id;
 
                 const posData = await ctx.service.pos.getPosData(condition);
                 ctx.body = {err: 0, msg: '', data: posData};
@@ -508,13 +492,9 @@ module.exports = app => {
          */
         async posUpdate(ctx) {
             try {
-                const tenderId = ctx.params.id;
-                if (!tenderId) {
-                    throw '当前未打开标段';
-                }
-                await this.checkMeasureType(tenderId, measureType.tz.value);
+                await this.checkMeasureType(measureType.tz.value);
                 const data = JSON.parse(ctx.request.body.data);
-                const responseData = await ctx.service.pos.savePosData(data, tenderId);
+                const responseData = await ctx.service.pos.savePosData(data, ctx.tender.id);
                 ctx.body = { err: 0, msg: '', data: responseData };
             } catch(err) {
                 this.log(err);
@@ -530,7 +510,11 @@ module.exports = app => {
          */
         async change(ctx) {
             try {
-                const renderData = await this.getCommonRenderData(ctx);
+                const renderData = {
+                    tender: ctx.tender.data,
+                    tenderMenu: this.menu.tenderMenu,
+                    preUrl: '/tender/' + ctx.tender.id,
+                };
                 await this.layout('ledger/change.ejs', renderData, 'ledger/change_modal.ejs');
             } catch(err) {
                 this.log(err);

+ 2 - 9
app/controller/stage_controller.js

@@ -33,17 +33,15 @@ module.exports = app => {
          */
         async index(ctx) {
             try {
-                const tenderId = ctx.params.id;
-                const tender = await this.service.tender.getDataById(tenderId);
                 const tenderList = await this.service.tender.getList();
 
                 const stages = await ctx.service.stage.getAllDataByCondition({
-                    where: {tid: tender.id},
+                    where: {tid: ctx.tender.id},
                     order: ['order'],
                 });
                 const renderData = {
                     moment,
-                    tender,
+                    tender: ctx.tender.data,
                     tenderList,
                     stages,
                     auditConst: audit.flow,
@@ -64,11 +62,6 @@ module.exports = app => {
          */
         async add(ctx) {
             try {
-                const tenderId = ctx.params.id;
-                if (!tenderId) {
-                    throw '当前未打开标段';
-                }
-
                 const data = JSON.parse(ctx.request.body.data);
                 const stage = await ctx.service.stage.add(tenderId, data.name, moment(data.time).toDate());
                 console.log(stage);

+ 18 - 9
app/controller/tender_controller.js

@@ -132,14 +132,15 @@ module.exports = app => {
          */
         async tenderInfo(ctx) {
             try {
-                const tenderId = ctx.params.id;
-                const renderData = await this.getCommonRenderData(ctx);
-                if (!renderData.tender.measure_type) {
-                    throw '请先选择计量模式';
-                }
-                renderData.tenderInfo = await ctx.service.tenderInfo.getTenderInfo(tenderId);
+                const renderData = {
+                    tender: ctx.tender.data,
+                    tenderInfo: ctx.tender.info,
+                    tenderMenu: this.menu.tenderMenu,
+                    preUrl: '/tender/' + ctx.tender.id,
+                };
                 await this.layout('tender/detail.ejs', renderData);
             } catch (error) {
+                console.log(error);
                 this.log(error);
                 this.ctx.redirect('/list');
             }
@@ -153,9 +154,11 @@ module.exports = app => {
          */
         async saveTenderInfo(ctx) {
             try {
-                const tenderId = ctx.params.id;
                 const data = JSON.parse(ctx.request.body.data);
-                await ctx.service.tenderInfo.saveTenderInfo(tenderId, data);
+                if (!data) {
+                    throw '提交数据错误';
+                }
+                await ctx.service.tenderInfo.saveTenderInfo(ctx.tender.id, data);
                 ctx.body = {err: 0, msg: '', data: data};
             } catch(err) {
                 this.log(err);
@@ -172,9 +175,15 @@ module.exports = app => {
         async tenderType(ctx) {
             try {
                 const tenderId = ctx.params.id, type = ctx.params.type;
+                if (!tenderId) {
+                    throw '当前未打开标段';
+                }
                 const tender = await ctx.service.tender.getTender(tenderId);
+                if (!tender) {
+                    throw '标段数据错误';
+                }
                 if (!tender.measure_type) {
-                    await ctx.service.tender.update({measure_type: type}, {id: tenderId});
+                    await ctx.service.tender.update({measure_type: type}, {id: tender.id});
                 }
                 ctx.redirect('/tender/' + tenderId);
             } catch(error) {

+ 70 - 0
app/middleware/tender_check.js

@@ -0,0 +1,70 @@
+'use strict';
+
+/**
+ *
+ *
+ * @author Mai
+ * @date
+ * @version
+ */
+
+const auditConst = require('../const/audit').flow;
+
+module.exports = options => {
+    /**
+     * 标段校验 中间件
+     * 1. 读取标段数据(包括属性)
+     * 2. 检验用户是否可见标段(不校验具体权限)
+     *
+     * @param {function} next - 中间件继续执行的方法
+     * @return {void}
+     */
+    return function* tenderCheck(next) {
+        try {
+            // 读取标段数据
+            const tender = { id: this.params.id, };
+            if (!tender.id) {
+                throw '当前未打开标段';
+            }
+            tender.data = yield this.service.tender.getTender(tender.id);
+            if (!tender.data) {
+                throw '标段数据错误';
+            }
+            if (!tender.data.measure_type) {
+                throw '请先选择计量模式';
+            }
+            tender.info = yield this.service.tenderInfo.getTenderInfo(tender.id);
+            if (!tender.data.ledger_status) {
+                tender.data.ledger_status = auditConst.status.uncheck;
+            }
+            if (!tender.data.ledger_times) {
+                tender.data.ledger_times = 1;
+            }
+            // todo 校验权限 (标段参与人、分享)
+            if (tender.data.project_id !== this.session.sessionProject.id) {
+                this.session.message = {
+                    type: 'error',
+                    icon: 'exclamation-circle',
+                    message: '您无权查看该项目',
+                };
+                throw '您无权查看该项目';
+            }
+            this.tender = tender;
+            yield next;
+        } catch (err) {
+            // 输出错误到日志
+            if (error.stack) {
+                this.ctx.logger.error(err);
+            } else {
+                this.getLogger('fail').info(JSON.stringify({
+                    error: err,
+                    project: this.session.sessionProject,
+                    user: this.session.sessionUser,
+                    body: this.session.body,
+                }));
+            }
+            // 重定向值标段管理
+            this.redirect('/list');
+        }
+    };
+};

+ 5 - 0
app/public/js/global.js

@@ -203,4 +203,9 @@ function getQueryVariable(variable) {
         if(pair[0] == variable){return pair[1];}
     }
     return(false);
+}
+
+const zeroRange = 0.00000001;
+function checkZero(value) {
+    return value && Math.abs(value) > zeroRange;
 }

+ 21 - 8
app/public/js/ledger.js

@@ -45,7 +45,7 @@ $(document).ready(function() {
     // 初始化台账
     const ledgerSpread = SpreadJsObj.createNewSpread($('#ledger-spread')[0]);
     SpreadJsObj.addDeleteBind(ledgerSpread);
-    const ledgerTree = createNewPathTree('ledger', {
+    const treeSetting = {
         id: 'ledger_id',
         pid: 'ledger_pid',
         order: 'order',
@@ -53,9 +53,22 @@ $(document).ready(function() {
         rootId: -1,
         keys: ['id', 'tender_id', 'ledger_id'],
         preUrl: '/ledger'
-    });
+    };
+    if (checkTzMeasureType()) {
+        treeSetting.calcFields = ['total_price'];
+    } else {
+        treeSetting.calcFields = ['deal_tp'];
+    }
+    treeSetting.calcFun = function (node) {
+        if (checkZero(node.dgn_qty1)) {
+            node.dgn_price = _.round(node.total_price/node.dgn_qty1, 2);
+        } else {
+            node.dgn_price = null;
+        }
+    };
+    const ledgerTree = createNewPathTree('ledger', treeSetting);
     ledgerTree.loadDatas(ledger);
-    treeCalc.calculateAll(ledgerTree, ['total_price']);
+    treeCalc.calculateAll(ledgerTree, ledgerTree.setting.calcFields, ledgerTree.setting.calcFun);
     SpreadJsObj.initSheet(ledgerSpread.getActiveSheet(), ledgerSpreadSetting);
     // 加载台账数据到界面
     SpreadJsObj.loadSheetData(ledgerSpread.getActiveSheet(), 'tree', ledgerTree);
@@ -962,7 +975,7 @@ $(document).ready(function() {
                 const mainNode = mainTree.nodes[sel.row];
                 if (!stdNode) { return; }
 
-                mainTree.postData('add-by-std', mainNode, {
+                mainTree.postData(preUrl + '/ledger/add-by-std', mainNode, {
                     tender_id: mainNode.tender_id,
                     stdType: stdType,
                     stdLibId: stdNode.list_id,
@@ -1177,7 +1190,7 @@ $(document).ready(function() {
 
             $('#searchLedger', this.obj).bind('click', function () {
                 const data = { keyword: $('input', self.obj).val() };
-                postData('/ledger/search', data, function (result) {
+                postData(preUrl + '/ledger/search', data, function (result) {
                     SpreadJsObj.loadSheetData(self.spread.getActiveSheet(), 'data', result);
                 });
             });
@@ -1220,7 +1233,7 @@ $(document).ready(function() {
             auditorId: $('#addAuditor').attr('auditorId'),
         };
         console.log(data);
-        postData('/ledger/audit/add', data, (data) => {
+        postData(preUrl + '/ledger/audit/add', data, (data) => {
             const html = [];
             html.push('<li class="list-group-item" auditorId="'+ data.audit_id +'"><a href="javascript: void(0)" class="text-danger pull-right">移除</a>');
             html.push('<span>');
@@ -1238,7 +1251,7 @@ $(document).ready(function() {
         const data = {
             auditorId: parseInt(li.attr('auditorId')),
         };
-        postData('/ledger/audit/delete', data, (data) => {
+        postData(preUrl + '/ledger/audit/delete', data, (data) => {
             li.remove();
             for (const a of data) {
                 const aLi = $('li[auditorId=' + a.audit_id + ']');
@@ -1248,7 +1261,7 @@ $(document).ready(function() {
     });
 
     $('select', '#opinion').change(function () {
-        postData('/ledger/audit/getContent', {audit_id: parseInt($(this).val())}, (data) => {
+        postData(preUrl + '/ledger/audit/getContent', {audit_id: parseInt($(this).val())}, (data) => {
             $('legend', '#opinion').text($(this).find('option:selected').text() + ' 清单意见');
             loadContents(data);
         });

+ 15 - 9
app/public/js/path_tree.js

@@ -128,7 +128,7 @@ const createNewPathTree = function (type, setting) {
             // 索引
             this.children = {};
             // 树设置
-            this.setting = JSON.parse(JSON.stringify(setting));
+            this.setting = setting;
         }
         /**
          * 树结构根据显示排序
@@ -593,6 +593,9 @@ const createNewPathTree = function (type, setting) {
                         }
                     }
                 }
+                if (node.children.length > 0) {
+                    parents.push(node);
+                }
             }
         }
 
@@ -629,7 +632,7 @@ const createNewPathTree = function (type, setting) {
                 return b.level - a.level;
             });
             for (const parent of parents) {
-                treeCalc.calculateNode(this, parent, ['total_price']);
+                treeCalc.calculateNode(this, parent, this.setting.calcFields, this.setting.calcFun);
             }
             result.update = result.update ? result.update.concat(parents) : parents;
             callback(result);
@@ -756,7 +759,7 @@ const treeCalc = {
     getMaxLevel: function (tree) {
         return Math.max.apply(Math, tree.datas.map(function(o) {return o.level}));
     },
-    calculateNode: function (tree, node, calcFields) {
+    calculateNode: function (tree, node, calcFields, calcFun) {
         const children = tree.getChildren(node);
         if (children.length > 0) {
             const gather = children.reduce(function (rst, x) {
@@ -779,25 +782,28 @@ const treeCalc = {
                 }
             }
         }
+        if (calcFun) {
+            calcFun(node);
+        }
     },
-    calculateLevelNode: function (tree, level, calcFields) {
+    calculateLevelNode: function (tree, level, calcFields, calcFun) {
         const nodes = tree.datas.filter((n) => { return n.level === level });
         for (const node of nodes) {
-            this.calculateNode(tree, node, calcFields);
+            this.calculateNode(tree, node, calcFields, calcFun);
         }
     },
-    calculateAll: function (tree, calcFields) {
+    calculateAll: function (tree, calcFields, calcFun) {
         for (let i = this.getMaxLevel(tree); i >= 0; i--) {
-            this.calculateLevelNode(tree, i, calcFields);
+            this.calculateLevelNode(tree, i, calcFields, calcFun);
         }
     },
-    calculateParent: function (tree, node, calcFields) {
+    calculateParent: function (tree, node, calcFields, calcFun) {
         const nodes = tree.getFullPathNodes(node.full_path);
         nodes.sort((a, b) => {
             return b.level - a.level;
         });
         for (const n of nodes) {
-            this.calculateNode(tree, n, calcFields);
+            this.calculateNode(tree, n, calcFields, calcFun);
         }
         return nodes;
     }

+ 27 - 29
app/router.js

@@ -9,6 +9,7 @@ module.exports = app => {
     // 项目管理员判断中间件
     const projectManagerCheck = app.middlewares.projectManagerCheck();
     // 标段读取中间件
+    const tenderCheck = app.middlewares.tenderCheck();
     const tenderSelect = app.middlewares.tenderSelect();
 
     // 登入登出相关
@@ -62,43 +63,40 @@ module.exports = app => {
     app.post('/api/list/update', sessionAuth, 'tenderController.updateTender');
     app.post('/api/list/del', sessionAuth, 'tenderController.deleteTender');
     // 标段概况
-    app.get('/tender/:id', sessionAuth, 'tenderController.tenderInfo');
+    app.get('/tender/:id', sessionAuth, tenderCheck, 'tenderController.tenderInfo');
     app.get('/tender/:id/:type', sessionAuth, 'tenderController.tenderType');
-    app.post('/api/tender/:id/save', sessionAuth, 'tenderController.saveTenderInfo');
+    app.post('/api/tender/:id/save', sessionAuth, tenderCheck, 'tenderController.saveTenderInfo');
     app.post('/tender/rule', sessionAuth, 'tenderController.rule');
 
 
     // 台账管理相关
-    app.get('/tender/:id/ledger/explode', sessionAuth, 'ledgerController.explode');
-    app.post('/api/tender/:id/ledger/get-children', sessionAuth, 'ledgerController.getChildren');
-    app.post('/api/tender/:id/ledger/base-operation', sessionAuth, 'ledgerController.baseOperation');
-    app.post('/api/tender/:id/ledger/update', sessionAuth, 'ledgerController.update');
-    app.post('/api/tender/:id/ledger/update-info', sessionAuth, 'ledgerController.updateInfo');
-    app.post('/api/tender/:id/ledger/paste-block', sessionAuth, 'ledgerController.pasteBlock');
-    app.post('/api/tender/:id/ledger/add-by-std', sessionAuth, 'ledgerController.addFromStandardLib');
-    app.post('/api/tender/:id/ledger/batch-insert', sessionAuth, 'ledgerController.batchInsert');
-    //app.post('/api/tender/:id/ledger/search', sessionAuth, 'ledgerController.search');
-    //app.post('/api/tender/:id/ledger/locate', sessionAuth, 'ledgerController.locate');
-    //app.post('/api/tender/:id/ledger/posterity', sessionAuth, 'ledgerController.posterity');
-    app.post('/api/tender/:id/pos', sessionAuth, 'ledgerController.pos');
-    app.post('/api/tender/:id/pos/update', sessionAuth, 'ledgerController.posUpdate');
-
-    app.get('/tender/:id/ledger/change', sessionAuth, 'ledgerController.change');
+    app.get('/tender/:id/ledger/explode', sessionAuth, tenderCheck, 'ledgerController.explode');
+    app.post('/api/tender/:id/ledger/get-children', sessionAuth, tenderCheck, 'ledgerController.getChildren');
+    app.post('/api/tender/:id/ledger/base-operation', sessionAuth, tenderCheck, 'ledgerController.baseOperation');
+    app.post('/api/tender/:id/ledger/update', sessionAuth, tenderCheck, 'ledgerController.update');
+    app.post('/api/tender/:id/ledger/update-info', sessionAuth, tenderCheck, 'ledgerController.updateInfo');
+    app.post('/api/tender/:id/ledger/paste-block', sessionAuth, tenderCheck, 'ledgerController.pasteBlock');
+    app.post('/api/tender/:id/ledger/add-by-std', sessionAuth, tenderCheck, 'ledgerController.addFromStandardLib');
+    app.post('/api/tender/:id/ledger/batch-insert', sessionAuth, tenderCheck, 'ledgerController.batchInsert');
+    app.post('/api/tender/:id/pos', sessionAuth, tenderCheck, 'ledgerController.pos');
+    app.post('/api/tender/:id/pos/update', sessionAuth, tenderCheck, 'ledgerController.posUpdate');
+
+    app.get('/tender/:id/ledger/change', sessionAuth, tenderCheck, 'ledgerController.change');
     app.get('/tender/:id/ledger/index', sessionAuth, 'ledgerController.index');
 
     // 台账审批相关
-    app.get('/tender/:id/ledger/audit', sessionAuth, 'ledgerAuditController.index');
-    app.post('/api/tender/:id/ledger/audit/add', sessionAuth, 'ledgerAuditController.add');
-    app.post('/api/tender/:id/ledger/audit/delete', sessionAuth, 'ledgerAuditController.remove');
-    app.post('/api/tender/:id/ledger/audit/start', sessionAuth, 'ledgerAuditController.start');
-    app.post('/api/tender/:id/ledger/audit/check', sessionAuth, 'ledgerAuditController.check');
-    app.post('/api/tender/:id/ledger/audit/addContent', sessionAuth, 'ledgerAuditController.addContent');
-    app.post('/api/tender/:id/ledger/audit/getContent', sessionAuth, 'ledgerAuditController.getContent');
+    app.get('/tender/:id/ledger/audit', sessionAuth, tenderCheck, 'ledgerAuditController.index');
+    app.post('/api/tender/:id/ledger/audit/add', sessionAuth, tenderCheck, 'ledgerAuditController.add');
+    app.post('/api/tender/:id/ledger/audit/delete', sessionAuth, tenderCheck, 'ledgerAuditController.remove');
+    app.post('/api/tender/:id/ledger/audit/start', sessionAuth, tenderCheck, 'ledgerAuditController.start');
+    app.post('/api/tender/:id/ledger/audit/check', sessionAuth, tenderCheck, 'ledgerAuditController.check');
+    app.post('/api/tender/:id/ledger/audit/addContent', sessionAuth, tenderCheck, 'ledgerAuditController.addContent');
+    app.post('/api/tender/:id/ledger/audit/getContent', sessionAuth, tenderCheck, 'ledgerAuditController.getContent');
 
     // 签约清单
-    app.post('/api/tender/:id/deal/get-data', sessionAuth, 'dealBillsController.getData');
-    app.post('/api/tender/:id/deal/upload-excel', sessionAuth, 'dealBillsController.loadExcel');
-    app.get('/api/tender/:id/deal/download/:file', sessionAuth, 'dealBillsController.download');
+    app.post('/api/tender/:id/deal/get-data', sessionAuth, tenderCheck, 'dealBillsController.getData');
+    app.post('/api/tender/:id/deal/upload-excel', sessionAuth, tenderCheck, 'dealBillsController.loadExcel');
+    app.get('/api/tender/:id/deal/download/:file', sessionAuth, tenderCheck, 'dealBillsController.download');
 
     // 变更管理
     app.get('/tender/:id/change', sessionAuth, 'changeController.index');
@@ -138,8 +136,8 @@ module.exports = app => {
     app.post('/measure/audit/check', sessionAuth, 'measureAuditController.check');
 
     // 期计量管理相关
-    app.get('/tender/:id/measure/stage', sessionAuth, 'stageController.index');
-    app.post('/tender/:id/stage/add', sessionAuth, 'stageController.add');
+    app.get('/tender/:id/measure/stage', sessionAuth, tenderCheck, 'stageController.index');
+    app.post('/tender/:id/stage/add', sessionAuth, tenderCheck, 'stageController.add');
     app.get('/tender/:id/stage/:order/measure', sessionAuth, tenderSelect, 'stageController.stageMeasure');
     app.get('/tender/:id/stage/:order/deal', sessionAuth, tenderSelect, 'stageController.stageDeal');
     app.get('/tender/:id/stage/:order/report', sessionAuth, tenderSelect, 'stageController.stageReport');

+ 1 - 0
app/service/ledger.js

@@ -1513,6 +1513,7 @@ module.exports = app => {
                         const calcData = this.ctx.helper.updateObj(updateNode, row);
                         if (updateNode.is_leaf) {
                             calcData.total_price = calcData.quantity * calcData.unit_price;
+                            calcData.deal_tp = calcData.deal_qty * calcData.unit_price;
                         }
                         const data1 = this._filterChangedField(updateNode, calcData);
                         updateData = this._filterUpdateInvalidField(updateNode.id, data1);

+ 2 - 2
app/view/ledger/explode_modal.ejs

@@ -96,7 +96,7 @@
                     </ul>
                 </div>
             </div>
-            <form class="modal-footer" method="post" action="/ledger/audit/start">
+            <form class="modal-footer" method="post" action="/api/tender/<%- tender.id %>/ledger/audit/start">
                 <button type="button" class="btn btn-secondary" data-dismiss="modal">关闭</button>
                 <input type="hidden" name="_csrf" value="<%= ctx.csrf %>">
                 <button class="btn btn-primary" type="submit">确认上报</button>
@@ -134,7 +134,7 @@
                     </ul>
                 </div>
             </div>
-            <form class="modal-footer" action="/ledger/audit/start" method="post">
+            <form class="modal-footer" action="/api/tender/<%- tender.id %>/ledger/audit/start" method="post">
                 <button type="submit" class="btn btn-primary">确认上报</button>
                 <input type="hidden" name="_csrf" value="<%= ctx.csrf %>">
                 <button type="button" class="btn btn-secondary" data-dismiss="modal">关闭</button>