Browse Source

feat: 预付款页面及数据模型设计

lanjianrong 5 years ago
parent
commit
672cc93dec

+ 16 - 4
app/controller/advance_controller.js

@@ -1,4 +1,5 @@
 'use strict'
+const accountGroup = require('../const/account_group').group
 
 module.exports = app => {
     class advanceController extends app.BaseController {
@@ -36,17 +37,28 @@ module.exports = app => {
         }
 
         /**
-         * 开始新一期(AJAX) GET
+         * 开始新一期页面(AJAX) GET
          * @param {Object} ctx 全局上下文
          */
-        async add(ctx) {
+        async createInfo(ctx) {
             const type = ctx.params.type
-            console.log(ctx.tender)
+            // 获取所有项目参与者
+            const accountList = await ctx.service.projectAccount.getAllDataByCondition({
+                where: { project_id: ctx.session.sessionProject.id, enable: 1 },
+                columns: ['id', 'name', 'company', 'role', 'enable', 'is_admin', 'account_group']
+            })
             const renderData = {
-                isEdited: true
+                isEdited: true,
+                accountGroup,
+                accountList
             }
             await this.layout('advance/detail.ejs', renderData)
         }
+
+        /**
+         * 添加审核人
+         */
+        async add(ctx) {}
     }
     return advanceController
 }

+ 106 - 0
app/public/js/advance_audit.js

@@ -0,0 +1,106 @@
+'use strict';
+
+/**
+ *
+ *
+ * @author lanjianrong
+ * @date 2020/8/7
+ * @version
+ */
+
+$(document).ready(function () {
+    // 获取审核相关url
+    function getUrlPre () {
+        const path = window.location.pathname.split('/');
+        return _.take(path, 3).join('/');
+    }
+    // 审批人分组选择
+    $('#account_group').change(function () {
+        let account_html = '<option value="0">选择审批人</option>'
+        for (const account of accountList) {
+            if ((parseInt($(this).val()) === 0 || parseInt($(this).val()) === account.account_group) && account.id !== parseInt(userID)) {
+                const role = account.role !== '' ? '(' + account.role + ')' : ''
+                const company = account.company !== '' ? ' -' + account.company : ''
+                account_html += '<option value="' + account.id + '">' + account.name + role + company + '</option>'
+            }
+        }
+        $('#account_list').html(account_html)
+    });
+    // 添加到审批流程中
+    $('body').on('change', '#account_list', function () {
+        let id = $(this).val()
+        id = parseInt(id)
+        if (id !== 0) {
+            postData(getUrlPre() + '/audit/add', { auditorId: id }, (data) => {
+                const html = []
+                html.push('<li class="list-group-item" auditorId="'+ data.aid +'"><a href="javascript: void(0)" class="text-danger pull-right">移除</a>')
+                html.push('<span>')
+                html.push(data.order + ' ')
+                html.push(data.name + ' ')
+                html.push('</span>')
+                html.push('<small class="text-muted">')
+                html.push(data.role)
+                html.push('</small></li>')
+                $('#auditors').append(html.join(''))
+
+                // 如果是重新上报,添加到重新上报列表中
+                const auditorshtml = []
+                // 重新上报时。令其它的审批人流程图标转换
+                $('#auditors-list li i').removeClass('fa-stop-circle').addClass('fa-chevron-circle-down')
+                for (let i = 0; i < $('#auditors-list li').length; i++) {
+                    $('#auditors-list li').eq(i).find('.pull-right').text(transFormToChinese(i+1) + '审')
+                    $('#auditors-list2 li').eq(i).find('.pull-right').text(transFormToChinese(i+1) + '审')
+                }
+                // 添加新审批人
+                auditorshtml.push('<li class="list-group-item" data-auditid="' + data.aid + '">')
+                auditorshtml.push('<i class="fa fa-stop-circle"></i> ')
+                auditorshtml.push(data.name + ' <small class="text-muted">' + data.role + '</small>')
+                auditorshtml.push('<span class="pull-right">终审</span>')
+                auditorshtml.push('</li>')
+                $('#auditors-list').append(auditorshtml.join(''))
+
+                const auditorshtml2 = [];
+                // 重新上报时。令其它的审批人流程图标转换
+                $('#auditors-list2 li i').removeClass('fa-stop-circle').addClass('fa-chevron-circle-down')
+                // 添加新审批人
+                auditorshtml2.push('<li class="list-group-item" data-auditid="' + data.aid + '">')
+                auditorshtml2.push('<h5 class="card-title"><i class="fa fa-stop-circle"></i> ')
+                auditorshtml2.push(data.name + ' <small class="text-muted">' + data.role + '</small>')
+                auditorshtml2.push('<span class="pull-right">终审</span>')
+                auditorshtml2.push('</h5></li>');
+                $('#auditors-list2').append(auditorshtml2.join(''))
+            });
+        }
+    });
+    // 删除审批人
+    $('body').on('click', '#auditors li>a', function () {
+        const li = $(this).parent()
+        const data = {
+            auditorId: parseInt(li.attr('auditorId')),
+        };
+        postData(getUrlPre() + '/audit/delete', data, (result) => {
+            li.remove();
+            for (const rst of result) {
+                const aLi = $('li[auditorId=' + rst.aid + ']');
+                $('span', aLi).text(rst.order + ' ' + rst.name + ' ')
+            }
+
+            // 如果是重新上报
+            // 令最后一个图标转换
+            $('#auditors-list li[data-auditid="' + data.auditorId + '"]').remove()
+            if ($('#auditors-list li').length !== 0 && !$('#auditors-list li i').hasClass('fa-stop-circle')) {
+                $('#auditors-list li').eq($('#auditors-list li').length-1).children('i')
+                    .removeClass('fa-chevron-circle-down').addClass('fa-stop-circle')
+            }
+            $('#auditors-list2 li[data-auditid="' + data.auditorId + '"]').remove();
+            if ($('#auditors-list2 li').length !== 0 && !$('#auditors-list2 li i').hasClass('fa-stop-circle')) {
+                $('#auditors-list2 li').eq($('#auditors-list2 li').length-1).children('i')
+                    .removeClass('fa-chevron-circle-down').addClass('fa-stop-circle')
+            }
+            for (let i = 0; i < $('#auditors-list li').length; i++) {
+                $('#auditors-list li').eq(i).find('.pull-right').text((i+1 === $('#auditors-list li').length ? '终' : transFormToChinese(i+1)) + '审')
+                $('#auditors-list2 li').eq(i).find('.pull-right').text((i+1 === $('#auditors-list2 li').length ? '终' : transFormToChinese(i+1)) + '审')
+            }
+        })
+    })
+})

+ 260 - 262
app/router.js

@@ -1,47 +1,46 @@
-'use strict';
+'use strict'
 
 module.exports = app => {
-
     // session验证中间件
-    const sessionAuth = app.middlewares.sessionAuth();
+    const sessionAuth = app.middlewares.sessionAuth()
     // 创建时间自动填充中间件
-    const datetimeFill = app.middlewares.datetimeFill();
+    const datetimeFill = app.middlewares.datetimeFill()
     // 项目管理员判断中间件
-    const projectManagerCheck = app.middlewares.projectManagerCheck();
+    const projectManagerCheck = app.middlewares.projectManagerCheck()
     // 标段读取中间件
-    const tenderCheck = app.middlewares.tenderCheck();
+    const tenderCheck = app.middlewares.tenderCheck()
     // 期读取中间件
-    const stageCheck = app.middlewares.stageCheck();
+    const stageCheck = app.middlewares.stageCheck()
     // 材料调差读取中间件
-    const materialCheck = app.middlewares.materialCheck();
+    const materialCheck = app.middlewares.materialCheck()
     // 第三方接口认证判断中间件
-    const api2otherCheck = app.middlewares.api2otherCheck();
+    const api2otherCheck = app.middlewares.api2otherCheck()
     // 微信验证登录中间件
-    const wechatAuth = app.middlewares.wechatAuth();
+    const wechatAuth = app.middlewares.wechatAuth()
 
     // 登入登出相关
-    app.get('/login', 'loginController.index');
-    app.get('/login/port', api2otherCheck, 'loginController.port');
-    app.get('/', 'loginController.index');
-    app.get('/logout', 'loginController.logout');
-    app.post('/login', 'loginController.login');
-    app.post('/login/port', 'loginController.loginPort');
-    app.get('/project/name', 'loginController.projectName');
-
-    app.get('/sign', 'signController.index');
-    app.post('/sign/save', 'signController.save');
-    app.post('/reset/password', 'loginController.resetPassword');
+    app.get('/login', 'loginController.index')
+    app.get('/login/port', api2otherCheck, 'loginController.port')
+    app.get('/', 'loginController.index')
+    app.get('/logout', 'loginController.logout')
+    app.post('/login', 'loginController.login')
+    app.post('/login/port', 'loginController.loginPort')
+    app.get('/project/name', 'loginController.projectName')
+
+    app.get('/sign', 'signController.index')
+    app.post('/sign/save', 'signController.save')
+    app.post('/reset/password', 'loginController.resetPassword')
 
     // 用户信息初始化相关
-    app.get('/boot', sessionAuth, 'bootController.index');
-    app.post('/boot', sessionAuth, 'bootController.boot');
+    app.get('/boot', sessionAuth, 'bootController.index')
+    app.post('/boot', sessionAuth, 'bootController.boot')
 
     // 控制面板相关
-    app.get('/dashboard', sessionAuth, 'dashboardController.index');
-    app.get('/dashboard/msg/list', sessionAuth, 'dashboardController.msgList');
-    app.get('/dashboard/msg/add/:id', sessionAuth, 'dashboardController.msgAdd');
-    app.post('/dashboard/msg/set/:id', sessionAuth, datetimeFill, 'dashboardController.msgSet');
-    app.get('/dashboard/msg/del/:id', sessionAuth, 'dashboardController.msgDelete');
+    app.get('/dashboard', sessionAuth, 'dashboardController.index')
+    app.get('/dashboard/msg/list', sessionAuth, 'dashboardController.msgList')
+    app.get('/dashboard/msg/add/:id', sessionAuth, 'dashboardController.msgAdd')
+    app.post('/dashboard/msg/set/:id', sessionAuth, datetimeFill, 'dashboardController.msgSet')
+    app.get('/dashboard/msg/del/:id', sessionAuth, 'dashboardController.msgDelete')
 
     // 推送相关
     // app.post('/dashboard/push', sessionAuth, 'dashboardController.pushSet');
@@ -49,339 +48,338 @@ module.exports = app => {
      * 项目设置
      */
     // 项目信息
-    app.get('/setting/info', sessionAuth, 'settingController.info');
-    app.post('/setting/updateinfo/:id', sessionAuth, 'settingController.updateinfo');
+    app.get('/setting/info', sessionAuth, 'settingController.info')
+    app.post('/setting/updateinfo/:id', sessionAuth, 'settingController.updateinfo')
     // 账号设置
-    app.get('/setting/user', sessionAuth, 'settingController.user');
-    app.get('/setting/user/permission/set', sessionAuth, 'settingController.userPermissionSet');
+    app.get('/setting/user', sessionAuth, 'settingController.user')
+    app.get('/setting/user/permission/set', sessionAuth, 'settingController.userPermissionSet')
     // 账号停用和启用
-    app.post('/setting/user/switch', sessionAuth, 'settingController.userSwitch');
-    app.post('/setting/user/add', sessionAuth, datetimeFill, 'settingController.addUser');
-    app.post('/setting/user/update', sessionAuth, 'settingController.updateUser');
-    app.post('/setting/user/permission', sessionAuth, 'settingController.permission');
-    app.post('/setting/user/reset/password', sessionAuth, 'settingController.resetUserPassword');
-    app.post('/setting/user/exist', sessionAuth, 'settingController.accountExist');
-    app.post('/setting/user/unbind', sessionAuth, 'settingController.userUnbind');
+    app.post('/setting/user/switch', sessionAuth, 'settingController.userSwitch')
+    app.post('/setting/user/add', sessionAuth, datetimeFill, 'settingController.addUser')
+    app.post('/setting/user/update', sessionAuth, 'settingController.updateUser')
+    app.post('/setting/user/permission', sessionAuth, 'settingController.permission')
+    app.post('/setting/user/reset/password', sessionAuth, 'settingController.resetUserPassword')
+    app.post('/setting/user/exist', sessionAuth, 'settingController.accountExist')
+    app.post('/setting/user/unbind', sessionAuth, 'settingController.userUnbind')
 
     // 显示设置
-    app.get('/setting/show', sessionAuth, 'settingController.show');
-    app.post('/setting/show/update', sessionAuth, 'settingController.showListUpdate');
+    app.get('/setting/show', sessionAuth, 'settingController.show')
+    app.post('/setting/show/update', sessionAuth, 'settingController.showListUpdate')
 
     // 标段自定义类别
-    app.get('/setting/category', sessionAuth, 'settingController.category');
-    app.post('/setting/category/add', sessionAuth, 'settingController.addCategory');
-    app.post('/setting/category/del', sessionAuth, 'settingController.deleteCategory');
-    app.post('/setting/category/update', sessionAuth, 'settingController.updateCategory');
-    app.post('/setting/category/value', sessionAuth, 'settingController.setCategoryValue');
-    app.post('/setting/category/level', sessionAuth, 'settingController.resetCategoryLevel');
+    app.get('/setting/category', sessionAuth, 'settingController.category')
+    app.post('/setting/category/add', sessionAuth, 'settingController.addCategory')
+    app.post('/setting/category/del', sessionAuth, 'settingController.deleteCategory')
+    app.post('/setting/category/update', sessionAuth, 'settingController.updateCategory')
+    app.post('/setting/category/value', sessionAuth, 'settingController.setCategoryValue')
+    app.post('/setting/category/level', sessionAuth, 'settingController.resetCategoryLevel')
 
     // 项目相关
-    app.get('/project/info', sessionAuth, 'projectController.info');
-    app.get('/project/account', sessionAuth, projectManagerCheck, 'accountController.index');
-    app.post('/project/account/permission/:accountId', sessionAuth, projectManagerCheck, 'accountController.savePermission');
-    app.get('/project/account/enable/:accountId', sessionAuth, projectManagerCheck, 'accountController.enable');
-    app.get('/project/account/disable/:accountId', sessionAuth, projectManagerCheck, 'accountController.enable');
-    app.get('/project/switch/:projectId', sessionAuth, projectManagerCheck, 'projectController.switchProject');
-    app.post('/project/info', sessionAuth, 'projectController.saveInfo');
+    app.get('/project/info', sessionAuth, 'projectController.info')
+    app.get('/project/account', sessionAuth, projectManagerCheck, 'accountController.index')
+    app.post('/project/account/permission/:accountId', sessionAuth, projectManagerCheck, 'accountController.savePermission')
+    app.get('/project/account/enable/:accountId', sessionAuth, projectManagerCheck, 'accountController.enable')
+    app.get('/project/account/disable/:accountId', sessionAuth, projectManagerCheck, 'accountController.enable')
+    app.get('/project/switch/:projectId', sessionAuth, projectManagerCheck, 'projectController.switchProject')
+    app.post('/project/info', sessionAuth, 'projectController.saveInfo')
 
     /**
      * 标段管理
      */
     // 金额概况
-    app.get('/list', sessionAuth, 'tenderController.listDefault');
-    app.get('/list/info', sessionAuth, 'tenderController.listInfo');
+    app.get('/list', sessionAuth, 'tenderController.listDefault')
+    app.get('/list/info', sessionAuth, 'tenderController.listInfo')
 
     // 计量进度
-    app.get('/list/progress', sessionAuth, 'tenderController.listProgress');
+    app.get('/list/progress', sessionAuth, 'tenderController.listProgress')
 
     // 管理标段
-    app.get('/list/manage', sessionAuth, 'tenderController.listManage');
-    app.post('/list/add', sessionAuth, 'tenderController.addTender');
-    app.post('/list/update', sessionAuth, 'tenderController.updateTender');
-    app.post('/list/del', sessionAuth, 'tenderController.deleteTender');
+    app.get('/list/manage', sessionAuth, 'tenderController.listManage')
+    app.post('/list/add', sessionAuth, 'tenderController.addTender')
+    app.post('/list/update', sessionAuth, 'tenderController.updateTender')
+    app.post('/list/del', sessionAuth, 'tenderController.deleteTender')
 
     // 标段概况
-    app.get('/tender/:id', sessionAuth, tenderCheck, 'tenderController.tenderInfo');
-    app.get('/tender/:id/type', sessionAuth, 'tenderController.tenderType');
-    app.post('/tender/:id/save', sessionAuth, tenderCheck, 'tenderController.saveTenderInfo');
-    app.post('/tender/rule', sessionAuth, 'tenderController.rule');
-    app.post('/tender/:id/rule/first', sessionAuth, tenderCheck, 'tenderController.ruleFirst');
+    app.get('/tender/:id', sessionAuth, tenderCheck, 'tenderController.tenderInfo')
+    app.get('/tender/:id/type', sessionAuth, 'tenderController.tenderType')
+    app.post('/tender/:id/save', sessionAuth, tenderCheck, 'tenderController.saveTenderInfo')
+    app.post('/tender/rule', sessionAuth, 'tenderController.rule')
+    app.post('/tender/:id/rule/first', sessionAuth, tenderCheck, 'tenderController.ruleFirst')
 
     // 预付款
-    app.get('/tender/:id/advance', sessionAuth, tenderCheck, 'advanceController.index');
-    app.get('/tender/:id/advance/material', sessionAuth, tenderCheck, 'advanceController.materialInfo');
-    app.get('/tender/:id/advance/:order/detail', sessionAuth, tenderCheck, 'advanceController.detail');
-    app.get('/tender/:id/advance/:type/add', sessionAuth, tenderCheck, 'advanceController.add');
-
+    app.get('/tender/:id/advance', sessionAuth, tenderCheck, 'advanceController.index')
+    app.get('/tender/:id/advance/material', sessionAuth, tenderCheck, 'advanceController.materialInfo')
+    app.get('/tender/:id/advance/:order/detail', sessionAuth, tenderCheck, 'advanceController.detail')
+    app.get('/tender/:id/advance/:type/create', sessionAuth, tenderCheck, 'advanceController.createInfo')
+    // app.post('/tender/:id/advance/:type/start', sessionAuth, tenderCheck, 'advanceController.start')
     // 标段协作办公
-    app.get('/tender/:id/cooperation', sessionAuth, tenderCheck, 'tenderController.tenderCooperation');
+    app.get('/tender/:id/cooperation', sessionAuth, tenderCheck, 'tenderController.tenderCooperation')
 
     // 台账管理相关
-    app.get('/tender/:id/ledger', sessionAuth, tenderCheck, 'ledgerController.explode');
-    app.post('/tender/:id/ledger/load', sessionAuth, tenderCheck, 'ledgerController.loadExplodeData');
-    app.post('/tender/:id/ledger/get-children', sessionAuth, tenderCheck, 'ledgerController.getChildren');
-    app.post('/tender/:id/ledger/update', sessionAuth, tenderCheck, 'ledgerController.update');
-    app.post('/tender/:id/ledger/upload-excel/:ueType', sessionAuth, tenderCheck, 'ledgerController.uploadExcel');
-    app.get('/tender/:id/ledger/download/:file', sessionAuth, tenderCheck, 'ledgerController.download');
-    app.post('/tender/:id/pos/update', sessionAuth, tenderCheck, 'ledgerController.posUpdate');
-    app.post('/tender/:id/pos/paste', sessionAuth, tenderCheck, 'ledgerController.posPaste');
-    app.post('/tender/:id/ledger/deal2sgfh', sessionAuth, tenderCheck, 'ledgerController.deal2sgfh');
-    app.post('/tender/:id/ledger/check', sessionAuth, tenderCheck, 'ledgerController.check');
+    app.get('/tender/:id/ledger', sessionAuth, tenderCheck, 'ledgerController.explode')
+    app.post('/tender/:id/ledger/load', sessionAuth, tenderCheck, 'ledgerController.loadExplodeData')
+    app.post('/tender/:id/ledger/get-children', sessionAuth, tenderCheck, 'ledgerController.getChildren')
+    app.post('/tender/:id/ledger/update', sessionAuth, tenderCheck, 'ledgerController.update')
+    app.post('/tender/:id/ledger/upload-excel/:ueType', sessionAuth, tenderCheck, 'ledgerController.uploadExcel')
+    app.get('/tender/:id/ledger/download/:file', sessionAuth, tenderCheck, 'ledgerController.download')
+    app.post('/tender/:id/pos/update', sessionAuth, tenderCheck, 'ledgerController.posUpdate')
+    app.post('/tender/:id/pos/paste', sessionAuth, tenderCheck, 'ledgerController.posPaste')
+    app.post('/tender/:id/ledger/deal2sgfh', sessionAuth, tenderCheck, 'ledgerController.deal2sgfh')
+    app.post('/tender/:id/ledger/check', sessionAuth, tenderCheck, 'ledgerController.check')
 
     // 台账审批相关
-    app.get('/tender/:id/ledger/audit', sessionAuth, tenderCheck, 'ledgerAuditController.index');
-    app.post('/tender/:id/ledger/audit/add', sessionAuth, tenderCheck, 'ledgerAuditController.add');
-    app.post('/tender/:id/ledger/audit/delete', sessionAuth, tenderCheck, 'ledgerAuditController.remove');
-    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/audit', sessionAuth, tenderCheck, 'ledgerAuditController.index')
+    app.post('/tender/:id/ledger/audit/add', sessionAuth, tenderCheck, 'ledgerAuditController.add')
+    app.post('/tender/:id/ledger/audit/delete', sessionAuth, tenderCheck, 'ledgerAuditController.remove')
+    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.post('/tender/:id/ledger/bwtz/load', sessionAuth, tenderCheck, 'ledgerController.loadBwtz');
+    app.get('/tender/:id/ledger/bwtz', sessionAuth, tenderCheck, 'ledgerController.bwtz')
+    app.post('/tender/:id/ledger/bwtz/load', sessionAuth, tenderCheck, 'ledgerController.loadBwtz')
 
     // 台账对比
-    app.get('/tender/:id/ledger/gather', sessionAuth, tenderCheck, 'ledgerController.gather');
-    app.post('/tender/:id/ledger/gather/load', sessionAuth, tenderCheck, 'ledgerController.loadGatherData');
+    app.get('/tender/:id/ledger/gather', sessionAuth, tenderCheck, 'ledgerController.gather')
+    app.post('/tender/:id/ledger/gather/load', sessionAuth, tenderCheck, 'ledgerController.loadGatherData')
 
     // 台账修订
-    app.get('/tender/:id/revise', sessionAuth, tenderCheck, 'reviseController.index');
-    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.get('/tender/:id/revise', sessionAuth, tenderCheck, 'reviseController.index')
+    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.get('/tender/:id/revise/info', sessionAuth, tenderCheck, 'reviseController.info');
-    app.post('/tender/:id/revise/auditors', sessionAuth, tenderCheck, 'reviseController.reviseAuditors');
-    app.post('/tender/:id/revise/info/load', sessionAuth, tenderCheck, 'reviseController.loadInfoData');
-    app.post('/tender/:id/revise/info/update', sessionAuth, tenderCheck, 'reviseController.update');
-    app.post('/tender/:id/revise/info/upload-excel/:ueType', sessionAuth, tenderCheck, 'reviseController.uploadExcel');
-    app.post('/tender/:id/revise/info/check', sessionAuth, tenderCheck, 'reviseController.checkData');
+    app.get('/tender/:id/revise/info', sessionAuth, tenderCheck, 'reviseController.info')
+    app.post('/tender/:id/revise/auditors', sessionAuth, tenderCheck, 'reviseController.reviseAuditors')
+    app.post('/tender/:id/revise/info/load', sessionAuth, tenderCheck, 'reviseController.loadInfoData')
+    app.post('/tender/:id/revise/info/update', sessionAuth, tenderCheck, 'reviseController.update')
+    app.post('/tender/:id/revise/info/upload-excel/:ueType', sessionAuth, tenderCheck, 'reviseController.uploadExcel')
+    app.post('/tender/:id/revise/info/check', sessionAuth, tenderCheck, 'reviseController.checkData')
 
     // 查看修订数据
-    app.get('/tender/:id/revise/history', sessionAuth, tenderCheck, 'reviseController.history');
-    app.post('/tender/:id/revise/history/load', sessionAuth, tenderCheck, 'reviseController.loadHistoryData');
-    app.post('/tender/:id/revise/history/info', sessionAuth, tenderCheck, 'reviseController.historyInfo');
+    app.get('/tender/:id/revise/history', sessionAuth, tenderCheck, 'reviseController.history')
+    app.post('/tender/:id/revise/history/load', sessionAuth, tenderCheck, 'reviseController.loadHistoryData')
+    app.post('/tender/:id/revise/history/info', sessionAuth, tenderCheck, 'reviseController.historyInfo')
 
     // 修订审批
-    app.post('/tender/:id/revise/audit/add', sessionAuth, tenderCheck, 'reviseController.addAuditor');
-    app.post('/tender/:id/revise/audit/remove', sessionAuth, tenderCheck, 'reviseController.removeAuditor');
-    app.post('/tender/:id/revise/audit/start', sessionAuth, tenderCheck, 'reviseController.start');
-    app.post('/tender/:id/revise/audit/check', sessionAuth, tenderCheck, 'reviseController.check');
+    app.post('/tender/:id/revise/audit/add', sessionAuth, tenderCheck, 'reviseController.addAuditor')
+    app.post('/tender/:id/revise/audit/remove', sessionAuth, tenderCheck, 'reviseController.removeAuditor')
+    app.post('/tender/:id/revise/audit/start', sessionAuth, tenderCheck, 'reviseController.start')
+    app.post('/tender/:id/revise/audit/check', sessionAuth, tenderCheck, 'reviseController.check')
 
     // 签约清单
-    app.post('/tender/:id/deal/get-data', sessionAuth, tenderCheck, 'dealBillsController.getData');
-    app.post('/tender/:id/deal/upload-excel', sessionAuth, tenderCheck, 'dealBillsController.loadExcel');
-    app.get('/tender/:id/deal/download/:file', sessionAuth, tenderCheck, 'dealBillsController.download');
+    app.post('/tender/:id/deal/get-data', sessionAuth, tenderCheck, 'dealBillsController.getData')
+    app.post('/tender/:id/deal/upload-excel', sessionAuth, tenderCheck, 'dealBillsController.loadExcel')
+    app.get('/tender/:id/deal/download/:file', sessionAuth, tenderCheck, 'dealBillsController.download')
 
     // 计量台账
     // 期计量
-    app.get('/tender/:id/measure/stage', sessionAuth, tenderCheck, 'measureController.stage');
-    app.post('/tender/:id/measure/stage/auditors', sessionAuth, tenderCheck, 'measureController.stageAuditors');
-    app.post('/tender/:id/measure/add', sessionAuth, tenderCheck, 'measureController.add');
-    app.post('/tender/:id/measure/save', sessionAuth, tenderCheck, 'measureController.save');
-    app.post('/tender/:id/measure/stage/delete', sessionAuth, tenderCheck, 'measureController.delete');
+    app.get('/tender/:id/measure/stage', sessionAuth, tenderCheck, 'measureController.stage')
+    app.post('/tender/:id/measure/stage/auditors', sessionAuth, tenderCheck, 'measureController.stageAuditors')
+    app.post('/tender/:id/measure/add', sessionAuth, tenderCheck, 'measureController.add')
+    app.post('/tender/:id/measure/save', sessionAuth, tenderCheck, 'measureController.save')
+    app.post('/tender/:id/measure/stage/delete', sessionAuth, tenderCheck, 'measureController.delete')
 
     // 计量台账 -- 清单汇总
-    app.get('/tender/:id/measure/gather', sessionAuth, tenderCheck, 'measureController.gather');
+    app.get('/tender/:id/measure/gather', sessionAuth, tenderCheck, 'measureController.gather')
 
     // 计量台账 -- 审核比较
-    app.get('/tender/:id/measure/compare', sessionAuth, tenderCheck, 'measureController.compare');
-    app.post('/tender/:id/measure/compare/load', sessionAuth, tenderCheck, 'measureController.loadCompareData');
+    app.get('/tender/:id/measure/compare', sessionAuth, tenderCheck, 'measureController.compare')
+    app.post('/tender/:id/measure/compare/load', sessionAuth, tenderCheck, 'measureController.loadCompareData')
 
     // 期计量详细
     // 本期计量台账
-    app.get('/tender/:id/measure/stage/:order', sessionAuth, tenderCheck, stageCheck, 'stageController.index');
-    app.post('/tender/:id/measure/stage/:order/load', sessionAuth, tenderCheck, stageCheck, 'stageController.getStageData');
-    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/check', sessionAuth, tenderCheck, stageCheck, 'stageController.check');
+    app.get('/tender/:id/measure/stage/:order', sessionAuth, tenderCheck, stageCheck, 'stageController.index')
+    app.post('/tender/:id/measure/stage/:order/load', sessionAuth, tenderCheck, stageCheck, 'stageController.getStageData')
+    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/check', sessionAuth, tenderCheck, stageCheck, 'stageController.check')
 
     // 计量附件
-    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');
-    app.post('/tender/:id/measure/stage/:order/delete/file', sessionAuth, tenderCheck, stageCheck, 'stageController.deleteFile');
-    app.post('/tender/:id/measure/stage/:order/save/file', sessionAuth, tenderCheck, stageCheck, 'stageController.saveFile');
-    app.post('/tender/:id/measure/stage/:order/check/file', sessionAuth, tenderCheck, stageCheck, 'stageController.checkFile');
+    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')
+    app.post('/tender/:id/measure/stage/:order/delete/file', sessionAuth, tenderCheck, stageCheck, 'stageController.deleteFile')
+    app.post('/tender/:id/measure/stage/:order/save/file', sessionAuth, tenderCheck, stageCheck, 'stageController.saveFile')
+    app.post('/tender/:id/measure/stage/:order/check/file', sessionAuth, tenderCheck, stageCheck, 'stageController.checkFile')
 
     // 中间计量
-    app.get('/tender/:id/measure/stage/:order/detail', sessionAuth, tenderCheck, stageCheck, 'stageController.detail');
-    app.post('/tender/:id/measure/stage/:order/detail/build', sessionAuth, tenderCheck, stageCheck, 'stageController.buildDetailData');
-    app.post('/tender/:id/measure/stage/:order/detail/adv', sessionAuth, tenderCheck, stageCheck, 'stageController.setAdvancedConfig');
-    app.post('/tender/:id/measure/stage/:order/detail/load', sessionAuth, tenderCheck, stageCheck, 'stageController.loadDetailRelaData');
-    app.post('/tender/:id/measure/stage/:order/detail/save', sessionAuth, tenderCheck, stageCheck, 'stageController.saveDetailData');
-    app.post('/tender/:id/measure/stage/:order/detail/add-img', sessionAuth, tenderCheck, stageCheck, 'stageController.addCalcImage');
-    app.post('/tender/:id/measure/stage/:order/detail/merge-img', sessionAuth, tenderCheck, stageCheck, 'stageController.mergeCalcImage');
+    app.get('/tender/:id/measure/stage/:order/detail', sessionAuth, tenderCheck, stageCheck, 'stageController.detail')
+    app.post('/tender/:id/measure/stage/:order/detail/build', sessionAuth, tenderCheck, stageCheck, 'stageController.buildDetailData')
+    app.post('/tender/:id/measure/stage/:order/detail/adv', sessionAuth, tenderCheck, stageCheck, 'stageController.setAdvancedConfig')
+    app.post('/tender/:id/measure/stage/:order/detail/load', sessionAuth, tenderCheck, stageCheck, 'stageController.loadDetailRelaData')
+    app.post('/tender/:id/measure/stage/:order/detail/save', sessionAuth, tenderCheck, stageCheck, 'stageController.saveDetailData')
+    app.post('/tender/:id/measure/stage/:order/detail/add-img', sessionAuth, tenderCheck, stageCheck, 'stageController.addCalcImage')
+    app.post('/tender/:id/measure/stage/:order/detail/merge-img', sessionAuth, tenderCheck, stageCheck, 'stageController.mergeCalcImage')
 
     // 合同支付
-    app.get('/tender/:id/measure/stage/:order/pay', sessionAuth, tenderCheck, stageCheck, 'stageController.pay');
-    app.post('/tender/:id/measure/stage/:order/pay/detail', sessionAuth, tenderCheck, stageCheck, 'stageController.chapterDetail');
-    app.post('/tender/:id/measure/stage/:order/pay/save', sessionAuth, tenderCheck, stageCheck, 'stageController.savePayData');
-    app.post('/tender/:id/measure/stage/:order/pay/upload/file', sessionAuth, tenderCheck, stageCheck, 'stageController.payUploadFile');
-    app.get('/tender/:id/measure/stage/:order/pay/download/file/:pid/:index', sessionAuth, 'stageController.payDownloadFile');
-    app.post('/tender/:id/measure/stage/:order/pay/delete/file', sessionAuth, tenderCheck, stageCheck, 'stageController.payDeleteFile');
+    app.get('/tender/:id/measure/stage/:order/pay', sessionAuth, tenderCheck, stageCheck, 'stageController.pay')
+    app.post('/tender/:id/measure/stage/:order/pay/detail', sessionAuth, tenderCheck, stageCheck, 'stageController.chapterDetail')
+    app.post('/tender/:id/measure/stage/:order/pay/save', sessionAuth, tenderCheck, stageCheck, 'stageController.savePayData')
+    app.post('/tender/:id/measure/stage/:order/pay/upload/file', sessionAuth, tenderCheck, stageCheck, 'stageController.payUploadFile')
+    app.get('/tender/:id/measure/stage/:order/pay/download/file/:pid/:index', sessionAuth, 'stageController.payDownloadFile')
+    app.post('/tender/:id/measure/stage/:order/pay/delete/file', sessionAuth, tenderCheck, stageCheck, 'stageController.payDeleteFile')
 
     // 变更概况
-    app.get('/tender/:id/measure/stage/:order/change', sessionAuth, tenderCheck, stageCheck, 'stageController.change');
-    app.post('/tender/:id/measure/stage/:order/change/data', sessionAuth, tenderCheck, stageCheck, 'stageController.getChangeData');
-    app.post('/tender/:id/measure/stage/:order/change/detail', sessionAuth, tenderCheck, stageCheck, 'stageController.changeDetail');
+    app.get('/tender/:id/measure/stage/:order/change', sessionAuth, tenderCheck, stageCheck, 'stageController.change')
+    app.post('/tender/:id/measure/stage/:order/change/data', sessionAuth, tenderCheck, stageCheck, 'stageController.getChangeData')
+    app.post('/tender/:id/measure/stage/:order/change/detail', sessionAuth, tenderCheck, stageCheck, 'stageController.changeDetail')
 
     // 审批
-    app.post('/tender/:id/measure/stage/:order/audit/add', sessionAuth, tenderCheck, stageCheck, 'stageController.addAudit');
-    app.post('/tender/:id/measure/stage/:order/audit/delete', sessionAuth, tenderCheck, stageCheck, 'stageController.deleteAudit');
-    app.post('/tender/:id/measure/stage/:order/audit/start', sessionAuth, tenderCheck, stageCheck, 'stageController.startAudit');
-    app.post('/tender/:id/measure/stage/:order/audit/check', sessionAuth, tenderCheck, stageCheck, 'stageController.checkAudit');
-    app.get('/tender/:id/measure/stage/:order/audit/check/again', sessionAuth, tenderCheck, stageCheck, 'stageController.checkAuditAgain');
+    app.post('/tender/:id/measure/stage/:order/audit/add', sessionAuth, tenderCheck, stageCheck, 'stageController.addAudit')
+    app.post('/tender/:id/measure/stage/:order/audit/delete', sessionAuth, tenderCheck, stageCheck, 'stageController.deleteAudit')
+    app.post('/tender/:id/measure/stage/:order/audit/start', sessionAuth, tenderCheck, stageCheck, 'stageController.startAudit')
+    app.post('/tender/:id/measure/stage/:order/audit/check', sessionAuth, tenderCheck, stageCheck, 'stageController.checkAudit')
+    app.get('/tender/:id/measure/stage/:order/audit/check/again', sessionAuth, tenderCheck, stageCheck, 'stageController.checkAuditAgain')
 
     // 部位台账
-    app.get('/tender/:id/measure/stage/:order/bwtz', sessionAuth, tenderCheck, stageCheck, 'stageController.bwtz');
-    app.post('/tender/:id/measure/stage/:order/bwtz/load', sessionAuth, tenderCheck, stageCheck, 'stageController.loadBwtz');
+    app.get('/tender/:id/measure/stage/:order/bwtz', sessionAuth, tenderCheck, stageCheck, 'stageController.bwtz')
+    app.post('/tender/:id/measure/stage/:order/bwtz/load', sessionAuth, tenderCheck, stageCheck, 'stageController.loadBwtz')
 
     // 清单汇总
-    app.get('/tender/:id/measure/stage/:order/gather', sessionAuth, tenderCheck, stageCheck, 'stageController.gather');
+    app.get('/tender/:id/measure/stage/:order/gather', sessionAuth, tenderCheck, stageCheck, 'stageController.gather')
 
     // 审核比较
-    app.get('/tender/:id/measure/stage/:order/compare', sessionAuth, tenderCheck, stageCheck, 'stageController.compare');
-    app.post('/tender/:id/measure/stage/:order/compare/load', sessionAuth, tenderCheck, stageCheck, 'stageController.compareAuditor');
+    app.get('/tender/:id/measure/stage/:order/compare', sessionAuth, tenderCheck, stageCheck, 'stageController.compare')
+    app.post('/tender/:id/measure/stage/:order/compare/load', sessionAuth, tenderCheck, stageCheck, 'stageController.compareAuditor')
 
     // 附加功能
-    app.get('/tender/:id/measure/stage/:order/extra/jgcl', sessionAuth, tenderCheck, stageCheck, 'stageExtraController.jgcl');
-    app.post('/tender/:id/measure/stage/:order/extra/jgcl/load', sessionAuth, tenderCheck, stageCheck, 'stageExtraController.loadJgcl');
-    app.post('/tender/:id/measure/stage/:order/extra/jgcl/update', sessionAuth, tenderCheck, stageCheck, 'stageExtraController.updateJgcl');
-    app.get('/tender/:id/measure/stage/:order/extra/bonus', sessionAuth, tenderCheck, stageCheck, 'stageExtraController.bonus');
-    app.post('/tender/:id/measure/stage/:order/extra/bonus/load', sessionAuth, tenderCheck, stageCheck, 'stageExtraController.loadBonus');
-    app.post('/tender/:id/measure/stage/:order/extra/bonus/update', sessionAuth, tenderCheck, stageCheck, 'stageExtraController.updateBonus');
-    app.get('/tender/:id/measure/stage/:order/extra/other', sessionAuth, tenderCheck, stageCheck, 'stageExtraController.other');
-    app.post('/tender/:id/measure/stage/:order/extra/other/load', sessionAuth, tenderCheck, stageCheck, 'stageExtraController.loadOther');
-    app.post('/tender/:id/measure/stage/:order/extra/other/update', sessionAuth, tenderCheck, stageCheck, 'stageExtraController.updateOther');
-    app.post('/tender/:id/measure/stage/:order/extra/upload/file', sessionAuth, tenderCheck, stageCheck, 'stageExtraController.uploadFile');
-    app.get('/tender/:id/measure/stage/:order/extra/download/file', sessionAuth, tenderCheck, stageCheck, 'stageExtraController.downloadFile');
-    app.post('/tender/:id/measure/stage/:order/extra/delete/file', sessionAuth, tenderCheck, stageCheck, 'stageExtraController.deleteFile');
+    app.get('/tender/:id/measure/stage/:order/extra/jgcl', sessionAuth, tenderCheck, stageCheck, 'stageExtraController.jgcl')
+    app.post('/tender/:id/measure/stage/:order/extra/jgcl/load', sessionAuth, tenderCheck, stageCheck, 'stageExtraController.loadJgcl')
+    app.post('/tender/:id/measure/stage/:order/extra/jgcl/update', sessionAuth, tenderCheck, stageCheck, 'stageExtraController.updateJgcl')
+    app.get('/tender/:id/measure/stage/:order/extra/bonus', sessionAuth, tenderCheck, stageCheck, 'stageExtraController.bonus')
+    app.post('/tender/:id/measure/stage/:order/extra/bonus/load', sessionAuth, tenderCheck, stageCheck, 'stageExtraController.loadBonus')
+    app.post('/tender/:id/measure/stage/:order/extra/bonus/update', sessionAuth, tenderCheck, stageCheck, 'stageExtraController.updateBonus')
+    app.get('/tender/:id/measure/stage/:order/extra/other', sessionAuth, tenderCheck, stageCheck, 'stageExtraController.other')
+    app.post('/tender/:id/measure/stage/:order/extra/other/load', sessionAuth, tenderCheck, stageCheck, 'stageExtraController.loadOther')
+    app.post('/tender/:id/measure/stage/:order/extra/other/update', sessionAuth, tenderCheck, stageCheck, 'stageExtraController.updateOther')
+    app.post('/tender/:id/measure/stage/:order/extra/upload/file', sessionAuth, tenderCheck, stageCheck, 'stageExtraController.uploadFile')
+    app.get('/tender/:id/measure/stage/:order/extra/download/file', sessionAuth, tenderCheck, stageCheck, 'stageExtraController.downloadFile')
+    app.post('/tender/:id/measure/stage/:order/extra/delete/file', sessionAuth, tenderCheck, stageCheck, 'stageExtraController.deleteFile')
 
     // 期审批管理
-    app.get('/tender/:id/measure/stage/:order/manager', sessionAuth, tenderCheck, stageCheck, 'stageController.manager');
-    app.post('/tender/:id/measure/stage/:order/manager/audit/delete', sessionAuth, tenderCheck, stageCheck, 'stageController.managerAuditDelete');
+    app.get('/tender/:id/measure/stage/:order/manager', sessionAuth, tenderCheck, stageCheck, 'stageController.manager')
+    app.post('/tender/:id/measure/stage/:order/manager/audit/delete', sessionAuth, tenderCheck, stageCheck, 'stageController.managerAuditDelete')
 
     // 报表
-    app.get('/tender/:id/report', sessionAuth, tenderCheck, 'reportController.index');
-    app.get('/tender/:id/measure/stage/:order/report', sessionAuth, tenderCheck, stageCheck, 'reportController.index');
-    app.get('/printReport/:size', sessionAuth, 'reportController.showPrintPage');
-    app.post('/tender/report_api/getReport', sessionAuth, 'reportController.getReport');
-    app.post('/tender/report_api/getMultiReports', sessionAuth, 'reportController.getMultiReportsEx');
-    app.post('/tender/report_api/createExcelFiles', sessionAuth, 'reportController.createExcelFilesEx');
-    app.post('/tender/report_api/createExcelFilesInOneBook', sessionAuth, 'reportController.createExcelFilesInOneBookEx');
-    app.get('/getFileByUUID/:uuid/:rptName/:suffix', sessionAuth, 'reportController.getFileByUUID');
+    app.get('/tender/:id/report', sessionAuth, tenderCheck, 'reportController.index')
+    app.get('/tender/:id/measure/stage/:order/report', sessionAuth, tenderCheck, stageCheck, 'reportController.index')
+    app.get('/printReport/:size', sessionAuth, 'reportController.showPrintPage')
+    app.post('/tender/report_api/getReport', sessionAuth, 'reportController.getReport')
+    app.post('/tender/report_api/getMultiReports', sessionAuth, 'reportController.getMultiReportsEx')
+    app.post('/tender/report_api/createExcelFiles', sessionAuth, 'reportController.createExcelFilesEx')
+    app.post('/tender/report_api/createExcelFilesInOneBook', sessionAuth, 'reportController.createExcelFilesInOneBookEx')
+    app.get('/getFileByUUID/:uuid/:rptName/:suffix', sessionAuth, 'reportController.getFileByUUID')
     // rptRouter.get('/getFileByUUID/:uuid/:rptName/:suffix', reportController.getFileByUUID);
-    app.post('/tender/report_api/createSignatureRole', sessionAuth, 'signatureController.createSignatureRole');
-    app.post('/tender/report_api/updateSignatureUsed', sessionAuth, datetimeFill, 'signatureController.updateSignatureUsed');
-    app.post('/tender/report_api/updateRoleRelationship', sessionAuth, 'signatureController.updateRoleRel');
-    app.post('/tender/report_api/createRoleRelationship', sessionAuth, 'signatureController.createRoleRel');
-    app.post('/tender/report_api/updateCustNode', sessionAuth, 'reportController.updateCustNode');
-    app.post('/report/cDefine', sessionAuth, 'reportController.setCustomDefine');
+    app.post('/tender/report_api/createSignatureRole', sessionAuth, 'signatureController.createSignatureRole')
+    app.post('/tender/report_api/updateSignatureUsed', sessionAuth, datetimeFill, 'signatureController.updateSignatureUsed')
+    app.post('/tender/report_api/updateRoleRelationship', sessionAuth, 'signatureController.updateRoleRel')
+    app.post('/tender/report_api/createRoleRelationship', sessionAuth, 'signatureController.createRoleRel')
+    app.post('/tender/report_api/updateCustNode', sessionAuth, 'reportController.updateCustNode')
+    app.post('/report/cDefine', sessionAuth, 'reportController.setCustomDefine')
 
     // 变更管理
-    app.get('/tender/:id/change', sessionAuth, tenderCheck, 'changeController.index');
-    app.get('/tender/:id/change/status/:status', sessionAuth, tenderCheck, 'changeController.status');
-    app.post('/tender/:id/change/newCode', sessionAuth, tenderCheck, 'changeController.newCode');
-    app.post('/tender/:id/change/add', sessionAuth, tenderCheck, 'changeController.add');
-    app.post('/tender/:id/change/defaultBills', sessionAuth, tenderCheck, 'changeController.defaultBills');
-    app.get('/tender/:id/change/:cid/info', sessionAuth, tenderCheck, 'changeController.info');
-    app.post('/change/upload/file', sessionAuth, 'changeController.uploadFile');
-    app.get('/change/download/file/:id', sessionAuth, 'changeController.downloadFile');
-    app.post('/change/delete/file', sessionAuth, 'changeController.deleteFile');
-    app.post('/tender/:id/change/delete', sessionAuth, tenderCheck, 'changeController.delete');
-    app.post('/tender/:id/change/bills', sessionAuth, tenderCheck, 'changeController.bills');
+    app.get('/tender/:id/change', sessionAuth, tenderCheck, 'changeController.index')
+    app.get('/tender/:id/change/status/:status', sessionAuth, tenderCheck, 'changeController.status')
+    app.post('/tender/:id/change/newCode', sessionAuth, tenderCheck, 'changeController.newCode')
+    app.post('/tender/:id/change/add', sessionAuth, tenderCheck, 'changeController.add')
+    app.post('/tender/:id/change/defaultBills', sessionAuth, tenderCheck, 'changeController.defaultBills')
+    app.get('/tender/:id/change/:cid/info', sessionAuth, tenderCheck, 'changeController.info')
+    app.post('/change/upload/file', sessionAuth, 'changeController.uploadFile')
+    app.get('/change/download/file/:id', sessionAuth, 'changeController.downloadFile')
+    app.post('/change/delete/file', sessionAuth, 'changeController.deleteFile')
+    app.post('/tender/:id/change/delete', sessionAuth, tenderCheck, 'changeController.delete')
+    app.post('/tender/:id/change/bills', sessionAuth, tenderCheck, 'changeController.bills')
 
-    app.post('/tender/:id/change/save', sessionAuth, tenderCheck, 'changeController.save');
+    app.post('/tender/:id/change/save', sessionAuth, tenderCheck, 'changeController.save')
 
-    app.post('/tender/:id/change/approval', sessionAuth, tenderCheck, 'changeController.approval');
-    app.post('/tender/:id/change/check/again', sessionAuth, tenderCheck, 'changeController.checkAgain');
+    app.post('/tender/:id/change/approval', sessionAuth, tenderCheck, 'changeController.approval')
+    app.post('/tender/:id/change/check/again', sessionAuth, tenderCheck, 'changeController.checkAgain')
 
-    app.post('/tender/:id/change/:cid/check/codeRepeat', sessionAuth, tenderCheck, 'changeController.checkCodeRepeat');
+    app.post('/tender/:id/change/:cid/check/codeRepeat', sessionAuth, tenderCheck, 'changeController.checkCodeRepeat')
 
     // 变更单位管理
-    app.post('/change/update/company', sessionAuth, 'changeController.updateCompany');
+    app.post('/change/update/company', sessionAuth, 'changeController.updateCompany')
 
     // 材料调差
-    app.get('/tender/:id/measure/material', sessionAuth, tenderCheck, 'materialController.index');
-    app.post('/tender/:id/measure/material/add', sessionAuth, tenderCheck, 'materialController.add');
-    app.post('/tender/:id/measure/material/delete', sessionAuth, tenderCheck, 'materialController.delete');
-    app.post('/tender/:id/measure/material/auditors', sessionAuth, tenderCheck, 'materialController.materialAuditors');
+    app.get('/tender/:id/measure/material', sessionAuth, tenderCheck, 'materialController.index')
+    app.post('/tender/:id/measure/material/add', sessionAuth, tenderCheck, 'materialController.add')
+    app.post('/tender/:id/measure/material/delete', sessionAuth, tenderCheck, 'materialController.delete')
+    app.post('/tender/:id/measure/material/auditors', sessionAuth, tenderCheck, 'materialController.materialAuditors')
     // 审批
-    app.post('/tender/:id/measure/material/:order/audit/add', sessionAuth, tenderCheck, materialCheck, 'materialController.addAudit');
-    app.post('/tender/:id/measure/material/:order/audit/delete', sessionAuth, tenderCheck, materialCheck, 'materialController.deleteAudit');
-    app.post('/tender/:id/measure/material/:order/audit/start', sessionAuth, tenderCheck, materialCheck, 'materialController.startAudit');
-    app.post('/tender/:id/measure/material/:order/audit/check', sessionAuth, tenderCheck, materialCheck, 'materialController.checkAudit');
+    app.post('/tender/:id/measure/material/:order/audit/add', sessionAuth, tenderCheck, materialCheck, 'materialController.addAudit')
+    app.post('/tender/:id/measure/material/:order/audit/delete', sessionAuth, tenderCheck, materialCheck, 'materialController.deleteAudit')
+    app.post('/tender/:id/measure/material/:order/audit/start', sessionAuth, tenderCheck, materialCheck, 'materialController.startAudit')
+    app.post('/tender/:id/measure/material/:order/audit/check', sessionAuth, tenderCheck, materialCheck, 'materialController.checkAudit')
     // 调差工料
-    app.get('/tender/:id/measure/material/:order', sessionAuth, tenderCheck, materialCheck, 'materialController.info');
-    app.post('/tender/:id/measure/material/:order/save', sessionAuth, tenderCheck, materialCheck, 'materialController.saveBillsData');
+    app.get('/tender/:id/measure/material/:order', sessionAuth, tenderCheck, materialCheck, 'materialController.info')
+    app.post('/tender/:id/measure/material/:order/save', sessionAuth, tenderCheck, materialCheck, 'materialController.saveBillsData')
     // 调差清单
-    app.get('/tender/:id/measure/material/:order/list', sessionAuth, tenderCheck, materialCheck, 'materialController.list');
-    app.post('/tender/:id/measure/material/:order/list/save', sessionAuth, tenderCheck, materialCheck, 'materialController.saveListsData');
+    app.get('/tender/:id/measure/material/:order/list', sessionAuth, tenderCheck, materialCheck, 'materialController.list')
+    app.post('/tender/:id/measure/material/:order/list/save', sessionAuth, tenderCheck, materialCheck, 'materialController.saveListsData')
 
     // 附件
-    app.get('/tender/:id/measure/material/:order/file', sessionAuth, tenderCheck, materialCheck, 'materialController.file');
-    app.post('/tender/:id/measure/material/:order/file/upload', sessionAuth, tenderCheck, materialCheck, 'materialController.upload');
-    app.post('/tender/:id/measure/material/:order/file/find', sessionAuth, tenderCheck, materialCheck, 'materialController.getCurMatericalFiles');
-    app.post('/tender/measure/material/file/delete', sessionAuth, 'materialController.deleteFile');
+    app.get('/tender/:id/measure/material/:order/file', sessionAuth, tenderCheck, materialCheck, 'materialController.file')
+    app.post('/tender/:id/measure/material/:order/file/upload', sessionAuth, tenderCheck, materialCheck, 'materialController.upload')
+    app.post('/tender/:id/measure/material/:order/file/find', sessionAuth, tenderCheck, materialCheck, 'materialController.getCurMatericalFiles')
+    app.post('/tender/measure/material/file/delete', sessionAuth, 'materialController.deleteFile')
 
     // 个人账号相关
-    app.get('/profile/info', sessionAuth, 'profileController.info');
-    app.get('/profile/sms', sessionAuth, 'profileController.sms');
-    app.post('/profile/sms/type', sessionAuth, 'profileController.smsType');
-    app.get('/profile/sign', sessionAuth, 'profileController.sign');
-    app.post('/profile/sign/delete', sessionAuth, 'profileController.signDelete');
-    app.post('/profile/sign/upload', sessionAuth, 'profileController.signUpload');
-    app.get('/profile/safe', sessionAuth, 'profileController.safe');
-    app.post('/profile/save', sessionAuth, 'profileController.saveBase');
-    app.post('/profile/password', sessionAuth, 'profileController.modifyPassword');
-    app.post('/profile/code', sessionAuth, 'profileController.getCode');
-    app.post('/profile/bind', sessionAuth, 'profileController.bindMobile');
-    app.get('/profile/qrCode', sessionAuth, 'profileController.qrCode');
-    app.get('/profile/wechat', sessionAuth, 'profileController.wechat');
-    app.post('/profile/wechat/remove', sessionAuth, 'profileController.removeWechat');
+    app.get('/profile/info', sessionAuth, 'profileController.info')
+    app.get('/profile/sms', sessionAuth, 'profileController.sms')
+    app.post('/profile/sms/type', sessionAuth, 'profileController.smsType')
+    app.get('/profile/sign', sessionAuth, 'profileController.sign')
+    app.post('/profile/sign/delete', sessionAuth, 'profileController.signDelete')
+    app.post('/profile/sign/upload', sessionAuth, 'profileController.signUpload')
+    app.get('/profile/safe', sessionAuth, 'profileController.safe')
+    app.post('/profile/save', sessionAuth, 'profileController.saveBase')
+    app.post('/profile/password', sessionAuth, 'profileController.modifyPassword')
+    app.post('/profile/code', sessionAuth, 'profileController.getCode')
+    app.post('/profile/bind', sessionAuth, 'profileController.bindMobile')
+    app.get('/profile/qrCode', sessionAuth, 'profileController.qrCode')
+    app.get('/profile/wechat', sessionAuth, 'profileController.wechat')
+    app.post('/profile/wechat/remove', sessionAuth, 'profileController.removeWechat')
 
     // 标准库相关
-    app.post('/std-lib/get-data', sessionAuth, 'standardLibController.getData');
+    app.post('/std-lib/get-data', sessionAuth, 'standardLibController.getData')
 
     // 查询
-    app.post('/search/user', sessionAuth, 'projectController.searchAccount');
+    app.post('/search/user', sessionAuth, 'projectController.searchAccount')
 
     // 示例
-    app.get('/template/:file', sessionAuth, 'templateController.download');
+    app.get('/template/:file', sessionAuth, 'templateController.download')
 
     // 标段对比
-    app.get('/compare/tz', sessionAuth, 'spssController.compareTz');
-    app.post('/compare/tz/load', sessionAuth, 'spssController.loadCompareTz');
-    app.get('/compare/stage', sessionAuth, 'spssController.compareStage');
-    app.post('/compare/stage/load', sessionAuth, 'spssController.loadCompareStage');
-    app.get('/gather/tz', sessionAuth, 'spssController.gatherTz');
-    app.post('/gather/tz/load', sessionAuth, 'spssController.loadGatherTz');
-    app.get('/gather/stage', sessionAuth, 'spssController.gatherStage');
-    app.post('/gather/stage/load', sessionAuth, 'spssController.loadGatherStage');
-    app.get('/tools/check-tz', sessionAuth, 'spssController.checkTz');
-    app.post('/tools/load', sessionAuth, 'spssController.loadBaseData');
+    app.get('/compare/tz', sessionAuth, 'spssController.compareTz')
+    app.post('/compare/tz/load', sessionAuth, 'spssController.loadCompareTz')
+    app.get('/compare/stage', sessionAuth, 'spssController.compareStage')
+    app.post('/compare/stage/load', sessionAuth, 'spssController.loadCompareStage')
+    app.get('/gather/tz', sessionAuth, 'spssController.gatherTz')
+    app.post('/gather/tz/load', sessionAuth, 'spssController.loadGatherTz')
+    app.get('/gather/stage', sessionAuth, 'spssController.gatherStage')
+    app.post('/gather/stage/load', sessionAuth, 'spssController.loadGatherStage')
+    app.get('/tools/check-tz', sessionAuth, 'spssController.checkTz')
+    app.post('/tools/load', sessionAuth, 'spssController.loadBaseData')
 
     // wap页面
-    app.get('/wap', 'wapController.index');
-    app.get('/wap/login', 'wapController.index');
-    app.post('/wap/login', 'wapController.login');
-    app.get('/wap/logout', 'wapController.logout');
-    app.get('/wap/dashboard', sessionAuth, 'wapController.dashboard');
-    app.get('/wap/list', sessionAuth, 'wapController.list');
-    app.get('/wap/tender/:id', sessionAuth, tenderCheck, 'wapController.tender');
-    app.get('/wap/tender/:id/stage/:order', sessionAuth, tenderCheck, 'wapController.stage');
-    app.get('/wap/tender/:id/change/:cid/info', sessionAuth, tenderCheck, 'wapController.change');
-    app.post('/wap/tender/:id/change/approval', sessionAuth, tenderCheck, 'wapController.changeApproval');
+    app.get('/wap', 'wapController.index')
+    app.get('/wap/login', 'wapController.index')
+    app.post('/wap/login', 'wapController.login')
+    app.get('/wap/logout', 'wapController.logout')
+    app.get('/wap/dashboard', sessionAuth, 'wapController.dashboard')
+    app.get('/wap/list', sessionAuth, 'wapController.list')
+    app.get('/wap/tender/:id', sessionAuth, tenderCheck, 'wapController.tender')
+    app.get('/wap/tender/:id/stage/:order', sessionAuth, tenderCheck, 'wapController.stage')
+    app.get('/wap/tender/:id/change/:cid/info', sessionAuth, tenderCheck, 'wapController.change')
+    app.post('/wap/tender/:id/change/approval', sessionAuth, tenderCheck, 'wapController.changeApproval')
 
     // 微信
-    app.get('/wx', 'wechatController.index');
-    app.get('/wx/oauth', 'wechatController.oauth');
-    app.get('/wx/bind', wechatAuth, 'wechatController.bind');
-    app.post('/wx/bindwx', wechatAuth, 'wechatController.bindwx');
-    app.get('/wx/test', wechatAuth, 'wechatController.testwx');
-    app.get('/wx/url2wap', wechatAuth, 'wechatController.url2wap');
-    app.get('/MP_verify_t3MkWAMqplVxPjmr.txt', 'wechatController.oauthTxt');
-};
+    app.get('/wx', 'wechatController.index')
+    app.get('/wx/oauth', 'wechatController.oauth')
+    app.get('/wx/bind', wechatAuth, 'wechatController.bind')
+    app.post('/wx/bindwx', wechatAuth, 'wechatController.bindwx')
+    app.get('/wx/test', wechatAuth, 'wechatController.testwx')
+    app.get('/MP_verify_t3MkWAMqplVxPjmr.txt', 'wechatController.oauthTxt')
+}

+ 48 - 0
app/service/advance_audit.js

@@ -0,0 +1,48 @@
+'use strict'
+
+module.exports = app => {
+    class AdvanceAudit extends app.BaseService {
+        constructor(ctx) {
+            super(ctx)
+            this.tableName = 'advance_audit'
+        }
+
+        /**
+         * 获取审核人流程列表
+         * @param {Number} vid 预付款记录id
+         * @param {Number} times 审核次数
+         */
+        async getAuditGroupByList(vid, times) {
+            const sql =
+                'SELECT la.`aid`, pa.`name`, pa.`company`, pa.`role`, la.`times`, la.`sid`, la.`aid`, la.`order` ' +
+                'FROM ?? AS la, ?? AS pa ' +
+                'WHERE la.`sid` = ? and la.`times` = ? and la.`aid` = pa.`id` GROUP BY la.`aid` ORDER BY la.`order`'
+            const sqlParam = [this.tableName, this.ctx.service.projectAccount.tableName, vid, times]
+            return await this.db.query(sql, sqlParam)
+        }
+
+        /**
+         * 获取审核人流程列表(包括原报)
+         * @param {Number} vid 预付款记录id
+         * @param {Number} times 审核次数
+         */
+        async getAuditGroupByListWithOwner(vid, times) {
+            const result = await this.getAuditGroupByList(vid, times)
+            const sql =
+                'SELECT pa.`id` As aid, pa.`name`, pa.`company`, pa.`role`, ? As times, ? As sid, 0 As `order`' +
+                '  FROM ' +
+                this.ctx.service.advance.tableName +
+                ' As s' +
+                '  LEFT JOIN ' +
+                this.ctx.service.projectAccount.tableName +
+                ' As pa' +
+                '  ON s.user_id = pa.id' +
+                '  WHERE s.id = ?'
+            const sqlParam = [times, stageId, stageId]
+            const user = await this.db.queryOne(sql, sqlParam)
+            result.unshift(user)
+            return result
+        }
+    }
+    return AdvanceAudit
+}

+ 68 - 218
app/service/change.js

@@ -79,16 +79,8 @@ module.exports = app => {
         }
 
         async add(tenderId, userId, code, name) {
-            const sql =
-                'SELECT COUNT(*) as count FROM ?? WHERE `tid` = ? AND ((`code` = ? AND `status` != ?) OR (`p_code` = ? AND `status` = ?))'
-            const sqlParam = [
-                this.tableName,
-                tenderId,
-                code,
-                audit.flow.status.checked,
-                code,
-                audit.flow.status.checked
-            ]
+            const sql = 'SELECT COUNT(*) as count FROM ?? WHERE `tid` = ? AND ((`code` = ? AND `status` != ?) OR (`p_code` = ? AND `status` = ?))'
+            const sqlParam = [this.tableName, tenderId, code, audit.flow.status.checked, code, audit.flow.status.checked]
             const codeCount = await this.db.queryOne(sql, sqlParam)
             const count = codeCount.count
             if (count > 0) {
@@ -138,10 +130,7 @@ module.exports = app => {
                 const changeInfo = await this.ctx.service.change.getHaveAuditLastInfo(tenderId)
                 if (changeInfo) {
                     // 再获取非原报审批人
-                    const auditList = await this.ctx.service.changeAudit.getListGroupByTimes(
-                        changeInfo.cid,
-                        changeInfo.times
-                    )
+                    const auditList = await this.ctx.service.changeAudit.getListGroupByTimes(changeInfo.cid, changeInfo.times)
                     let sort = 1
                     for (const audit of auditList) {
                         if (audit.usite !== 0) {
@@ -175,8 +164,7 @@ module.exports = app => {
         }
 
         async getHaveAuditLastInfo(tenderId) {
-            const sql =
-                'SELECT * FROM ?? as a LEFT JOIN ?? as b ON a.`cid` = b.`cid` WHERE a.`tid` = ? AND b.`usite` > 0 ORDER BY a.`in_time` DESC'
+            const sql = 'SELECT * FROM ?? as a LEFT JOIN ?? as b ON a.`cid` = b.`cid` WHERE a.`tid` = ? AND b.`usite` > 0 ORDER BY a.`in_time` DESC'
             const sqlParam = [this.tableName, this.ctx.service.changeAudit.tableName, tenderId]
             return await this.db.queryOne(sql, sqlParam)
         }
@@ -255,15 +243,8 @@ module.exports = app => {
                     ]
                     break
                 case 1: // 待处理(你的)
-                    sql =
-                        'SELECT a.* FROM ?? as a WHERE cid in(SELECT b.cid FROM ?? as b WHERE tid = ? AND uid = ? AND status = ?) ORDER BY in_time DESC'
-                    sqlParam = [
-                        this.tableName,
-                        this.ctx.service.changeAudit.tableName,
-                        tenderId,
-                        this.ctx.session.sessionUser.accountId,
-                        audit.flow.auditStatus.checking
-                    ]
+                    sql = 'SELECT a.* FROM ?? as a WHERE cid in(SELECT b.cid FROM ?? as b WHERE tid = ? AND uid = ? AND status = ?) ORDER BY in_time DESC'
+                    sqlParam = [this.tableName, this.ctx.service.changeAudit.tableName, tenderId, this.ctx.session.sessionUser.accountId, audit.flow.auditStatus.checking]
                     break
                 case 5: // 待上报(所有的)PS:取未上报和退回的变更令
                     sql =
@@ -285,13 +266,7 @@ module.exports = app => {
                         'SELECT a.* FROM ?? AS a WHERE ' +
                         'a.cid IN (SELECT b.cid FROM ?? AS b WHERE b.uid = ? AND a.times = b.times GROUP BY b.cid) AND ' +
                         'a.status = ? AND a.tid = ? ORDER BY a.in_time DESC'
-                    sqlParam = [
-                        this.tableName,
-                        this.ctx.service.changeAudit.tableName,
-                        this.ctx.session.sessionUser.accountId,
-                        status,
-                        tenderId
-                    ]
+                    sqlParam = [this.tableName, this.ctx.service.changeAudit.tableName, this.ctx.session.sessionUser.accountId, status, tenderId]
                     break
                 case 3: // 已完成(所有的)
                     sql = 'SELECT a.* FROM ?? AS a WHERE ' + 'a.status = ? AND a.tid = ? ORDER BY a.in_time DESC'
@@ -357,13 +332,7 @@ module.exports = app => {
                     const sql3 =
                         'SELECT count(*) AS count FROM ?? AS a WHERE ' +
                         'a.cid IN (SELECT b.cid FROM ?? AS b WHERE b.uid = ? AND a.times = b.times GROUP BY b.cid) AND a.status = ? AND a.tid = ?'
-                    const sqlParam3 = [
-                        this.tableName,
-                        this.ctx.service.changeAudit.tableName,
-                        this.ctx.session.sessionUser.accountId,
-                        status,
-                        tenderId
-                    ]
+                    const sqlParam3 = [this.tableName, this.ctx.service.changeAudit.tableName, this.ctx.session.sessionUser.accountId, status, tenderId]
                     const result3 = await this.db.query(sql3, sqlParam3)
                     return result3[0].count
                 case 3: // 已完成(所有的)
@@ -414,10 +383,7 @@ module.exports = app => {
                     let uSort = parseInt(lastUser.usort) + 1
                     for (const [index, ca] of changeAudit.entries()) {
                         const auditInfo = ca.split('/%/')
-                        const uStatus =
-                            change_status && index === 0
-                                ? audit.flow.auditStatus.checking
-                                : audit.flow.auditStatus.uncheck
+                        const uStatus = change_status && index === 0 ? audit.flow.auditStatus.checking : audit.flow.auditStatus.uncheck
                         const sin_time = change_status && index === 0 ? new Date() : null
                         const caArray = {
                             tid: tenderId,
@@ -452,21 +418,12 @@ module.exports = app => {
                             const sms = new SMS(this.ctx)
                             const code = await sms.contentChange(changeInfo.code)
                             const shenpiUrl = await this.ctx.helper.urlToShort(
-                                'http://' +
-                                    this.ctx.request.header.host +
-                                    '/wap/tender/' +
-                                    changeInfo.tid +
-                                    '/change/' +
-                                    changeInfo.cid +
-                                    '/info#shenpi'
-                            )
-                            await this.ctx.helper.sendAliSms(
-                                auditInfo[0],
-                                smsTypeConst.const.BG,
-                                smsTypeConst.judge.approval.toString(),
-                                SmsAliConst.template.change_check,
-                                { biangeng: code, code: shenpiUrl }
+                                'http://' + this.ctx.request.header.host + '/wap/tender/' + changeInfo.tid + '/change/' + changeInfo.cid + '/info#shenpi'
                             )
+                            await this.ctx.helper.sendAliSms(auditInfo[0], smsTypeConst.const.BG, smsTypeConst.judge.approval.toString(), SmsAliConst.template.change_check, {
+                                biangeng: code,
+                                code: shenpiUrl
+                            })
                         }
                     }
                     await this.transaction.insert(this.ctx.service.changeAudit.tableName, insertCA)
@@ -504,10 +461,7 @@ module.exports = app => {
                             delete clArray.unit_price
                         }
                         insertCL.push(clArray)
-                        total_price = this.ctx.helper.accAdd(
-                            total_price,
-                            this.ctx.helper.mul(clArray.unit_price, clArray.spamount, tenderInfo.decimal.tp)
-                        )
+                        total_price = this.ctx.helper.accAdd(total_price, this.ctx.helper.mul(clArray.unit_price, clArray.spamount, tenderInfo.decimal.tp))
                     }
                     await this.transaction.insert(this.ctx.service.changeAuditList.tableName, insertCL)
                 }
@@ -568,12 +522,7 @@ module.exports = app => {
                 console.log('auditors', auditors)
                 console.log('postData', postData)
                 // 添加到消息推送表
-                const noticeContent = await this.getNoticeContent(
-                    pid,
-                    changeData.tid,
-                    changeData.cid,
-                    this.ctx.session.sessionUser.accountId
-                )
+                const noticeContent = await this.getNoticeContent(pid, changeData.tid, changeData.cid, this.ctx.session.sessionUser.accountId)
                 const records = []
                 auditors.forEach(auditor => {
                     records.push({
@@ -611,14 +560,8 @@ module.exports = app => {
                         tenderInfo = await this.ctx.service.tenderInfo.getTenderInfo(changeListInfo.tid)
                     }
                     if (changeListInfo !== undefined) {
-                        total_price = this.ctx.helper.add(
-                            total_price,
-                            this.ctx.helper.mul(changeListInfo.unit_price, amount, tenderInfo.decimal.tp)
-                        )
-                        const audit_amount =
-                            changeListInfo.audit_amount !== null && changeListInfo.audit_amount !== ''
-                                ? changeListInfo.audit_amount.split(',')
-                                : []
+                        total_price = this.ctx.helper.add(total_price, this.ctx.helper.mul(changeListInfo.unit_price, amount, tenderInfo.decimal.tp))
+                        const audit_amount = changeListInfo.audit_amount !== null && changeListInfo.audit_amount !== '' ? changeListInfo.audit_amount.split(',') : []
                         audit_amount.push(amount)
                         const list_update = {
                             id: lid,
@@ -639,10 +582,7 @@ module.exports = app => {
 
                     // 添加短信通知-审批通过提醒功能
                     // const mobile_array = [];
-                    const auditList = await this.ctx.service.changeAudit.getListGroupByTimes(
-                        changeData.cid,
-                        changeData.times
-                    )
+                    const auditList = await this.ctx.service.changeAudit.getListGroupByTimes(changeData.cid, changeData.times)
                     // for (const user of auditList) {
                     //     const smsUser = await this.ctx.service.projectAccount.getDataById(user.uid);
                     //     if (smsUser.auth_mobile !== '' && smsUser.auth_mobile !== undefined && smsUser.sms_type !== '' && smsUser.sms_type !== null) {
@@ -660,13 +600,10 @@ module.exports = app => {
                     const users = this._.map(auditList, 'uid')
                     const sms = new SMS(this.ctx)
                     const code = await sms.contentChange(changeData.code)
-                    await this.ctx.helper.sendAliSms(
-                        users,
-                        smsTypeConst.const.BG,
-                        smsTypeConst.judge.result.toString(),
-                        SmsAliConst.template.change_result,
-                        { biangeng: code, status: SmsAliConst.status.success }
-                    )
+                    await this.ctx.helper.sendAliSms(users, smsTypeConst.const.BG, smsTypeConst.judge.result.toString(), SmsAliConst.template.change_result, {
+                        biangeng: code,
+                        status: SmsAliConst.status.success
+                    })
                 } else {
                     // 设置下一个审批人为审批状态
                     const nextAudit_update = {
@@ -691,21 +628,12 @@ module.exports = app => {
                     //     }
                     // }
                     const shenpiUrl = await this.ctx.helper.urlToShort(
-                        'http://' +
-                            this.ctx.request.header.host +
-                            '/wap/tender/' +
-                            changeData.tid +
-                            '/change/' +
-                            changeData.cid +
-                            '/info#shenpi'
-                    )
-                    await this.ctx.helper.sendAliSms(
-                        nextAuditData.uid,
-                        smsTypeConst.const.BG,
-                        smsTypeConst.judge.approval.toString(),
-                        SmsAliConst.template.change_check,
-                        { biangeng: code, code: shenpiUrl }
+                        'http://' + this.ctx.request.header.host + '/wap/tender/' + changeData.tid + '/change/' + changeData.cid + '/info#shenpi'
                     )
+                    await this.ctx.helper.sendAliSms(nextAuditData.uid, smsTypeConst.const.BG, smsTypeConst.judge.approval.toString(), SmsAliConst.template.change_check, {
+                        biangeng: code,
+                        code: shenpiUrl
+                    })
                 }
                 change_update.total_price = total_price
                 const options = {
@@ -778,12 +706,7 @@ module.exports = app => {
                 // 获取所有审核人列表
                 const auditors = await this.ctx.service.changeAudit.getAllAuditors(changeData.tid)
                 // 添加到消息推送表
-                const noticeContent = await this.getNoticeContent(
-                    pid,
-                    changeData.tid,
-                    changeData.cid,
-                    this.ctx.session.sessionUser.accountId
-                )
+                const noticeContent = await this.getNoticeContent(pid, changeData.tid, changeData.cid, this.ctx.session.sessionUser.accountId)
                 const records = []
                 auditors.forEach(auditor => {
                     records.push({
@@ -807,16 +730,8 @@ module.exports = app => {
                 await this.transaction.update(this.ctx.service.changeAudit.tableName, audit_update)
                 // 新增新一次的审批人列表
                 // 获取当前次数审批人列表
-                const auditList = await this.ctx.service.changeAudit.getListGroupByTimes(
-                    changeInfo.cid,
-                    changeInfo.times
-                )
-                const lastauditInfo = await this.ctx.service.changeAudit.getLastUser(
-                    changeInfo.cid,
-                    changeInfo.times,
-                    1,
-                    0
-                )
+                const auditList = await this.ctx.service.changeAudit.getListGroupByTimes(changeInfo.cid, changeInfo.times)
+                const lastauditInfo = await this.ctx.service.changeAudit.getLastUser(changeInfo.cid, changeInfo.times, 1, 0)
                 let usort = lastauditInfo.usort + 1
                 const newTimes = changeInfo.times + 1
                 const insert_audit_array = []
@@ -843,10 +758,7 @@ module.exports = app => {
                 })
                 let total_price = 0
                 for (const cl of changeList) {
-                    total_price = this.ctx.helper.add(
-                        total_price,
-                        this.ctx.helper.mul(cl.unit_price, cl.camount, tenderInfo.decimal.tp)
-                    )
+                    total_price = this.ctx.helper.add(total_price, this.ctx.helper.mul(cl.unit_price, cl.camount, tenderInfo.decimal.tp))
                 }
                 // 设置变更令退回
                 const change_update = {
@@ -886,13 +798,10 @@ module.exports = app => {
                 const users = this._.map(insert_audit_array, 'uid')
                 const sms = new SMS(this.ctx)
                 const code = await sms.contentChange(changeData.code)
-                await this.ctx.helper.sendAliSms(
-                    users,
-                    smsTypeConst.const.BG,
-                    smsTypeConst.judge.result.toString(),
-                    SmsAliConst.template.change_result,
-                    { biangeng: code, status: SmsAliConst.status.back }
-                )
+                await this.ctx.helper.sendAliSms(users, smsTypeConst.const.BG, smsTypeConst.judge.result.toString(), SmsAliConst.template.change_result, {
+                    biangeng: code,
+                    status: SmsAliConst.status.back
+                })
             } catch (error) {
                 await this.transaction.rollback()
                 result = false
@@ -915,12 +824,7 @@ module.exports = app => {
                 // 获取所有审核人列表
                 const auditors = await this.ctx.service.changeAudit.getAllAuditors(changeData.tid)
                 // 添加到消息推送表
-                const noticeContent = await this.getNoticeContent(
-                    pid,
-                    changeData.tid,
-                    changeData.cid,
-                    this.ctx.session.sessionUser.accountId
-                )
+                const noticeContent = await this.getNoticeContent(pid, changeData.tid, changeData.cid, this.ctx.session.sessionUser.accountId)
                 const records = []
                 auditors.forEach(auditor => {
                     records.push({
@@ -1007,10 +911,7 @@ module.exports = app => {
                         audit_amount: audit_amount.join(','),
                         spamount: parseFloat(last_amount)
                     }
-                    total_price = this.ctx.helper.add(
-                        total_price,
-                        this.ctx.helper.mul(cl.unit_price, parseFloat(last_amount), tenderInfo.decimal.tp)
-                    )
+                    total_price = this.ctx.helper.add(total_price, this.ctx.helper.mul(cl.unit_price, parseFloat(last_amount), tenderInfo.decimal.tp))
                     await this.transaction.update(this.ctx.service.changeAuditList.tableName, list_update)
                 }
 
@@ -1045,21 +946,12 @@ module.exports = app => {
                 const sms = new SMS(this.ctx)
                 const code = await sms.contentChange(changeData.code)
                 const shenpiUrl = await this.ctx.helper.urlToShort(
-                    'http://' +
-                        this.ctx.request.header.host +
-                        '/wap/tender/' +
-                        changeData.tid +
-                        '/change/' +
-                        changeData.cid +
-                        '/info#shenpi'
-                )
-                await this.ctx.helper.sendAliSms(
-                    lastauditInfo.uid,
-                    smsTypeConst.const.BG,
-                    smsTypeConst.judge.approval.toString(),
-                    SmsAliConst.template.change_check,
-                    { biangeng: code, code: shenpiUrl }
+                    'http://' + this.ctx.request.header.host + '/wap/tender/' + changeData.tid + '/change/' + changeData.cid + '/info#shenpi'
                 )
+                await this.ctx.helper.sendAliSms(lastauditInfo.uid, smsTypeConst.const.BG, smsTypeConst.judge.approval.toString(), SmsAliConst.template.change_check, {
+                    biangeng: code,
+                    code: shenpiUrl
+                })
             } catch (error) {
                 await this.transaction.rollback()
                 result = false
@@ -1120,17 +1012,8 @@ module.exports = app => {
             const sqlParam = [tid, tid, audit.flow.status.checked]
             const changes = await this.db.query(sql, sqlParam)
             for (const c of changes) {
-                const aSql =
-                    'SELECT ca.*, pa.name As u_name, pa.role As u_role ' +
-                    '  FROM ?? As ca ' +
-                    '  Left Join ?? As pa ' +
-                    '  On ca.uid = pa.id ' +
-                    '  Where ca.cid = ?'
-                const aSqlParam = [
-                    this.ctx.service.changeAtt.tableName,
-                    this.ctx.service.projectAccount.tableName,
-                    c.cid
-                ]
+                const aSql = 'SELECT ca.*, pa.name As u_name, pa.role As u_role ' + '  FROM ?? As ca ' + '  Left Join ?? As pa ' + '  On ca.uid = pa.id ' + '  Where ca.cid = ?'
+                const aSqlParam = [this.ctx.service.changeAtt.tableName, this.ctx.service.projectAccount.tableName, c.cid]
                 c.attachments = await this.db.query(aSql, aSqlParam)
             }
             return changes
@@ -1145,33 +1028,29 @@ module.exports = app => {
             const lastStage = await this.ctx.service.stage.getLastestStage(tid, true)
             let filter
             if (lastStage.id === this.ctx.stage.id) {
-                filter = this.db.format(
-                    ' And (s.`order` < ? OR (s.`order` = ? And (sChange.`stimes` < ? OR (sChange.`stimes` = ? And sChange.`sorder` <= ?))))',
-                    [
-                        lastStage.order,
-                        lastStage.order,
-                        this.ctx.stage.curTimes,
-                        this.ctx.stage.curTimes,
-                        this.ctx.stage.curOrder
-                    ]
-                )
+                filter = this.db.format(' And (s.`order` < ? OR (s.`order` = ? And (sChange.`stimes` < ? OR (sChange.`stimes` = ? And sChange.`sorder` <= ?))))', [
+                    lastStage.order,
+                    lastStage.order,
+                    this.ctx.stage.curTimes,
+                    this.ctx.stage.curTimes,
+                    this.ctx.stage.curOrder
+                ])
             } else {
                 if (lastStage.status === audit.stage.status.uncheck) {
                     filter = ' And s.order < ' + lastStage.order
                 } else if (lastStage.status === audit.stage.status.checked) {
                     filter = ''
                 } else if (lastStage.status === audit.stage.status.checkNo) {
-                    filter = this.db.format(' And (s.`order` < ? OR (s.`order` = ? And sChange.`stimes` <= ?))', [
+                    filter = this.db.format(' And (s.`order` < ? OR (s.`order` = ? And sChange.`stimes` <= ?))', [lastStage.order, lastStage.order, lastStage.times])
+                } else {
+                    const curAuditor = await this.ctx.service.stageAudit.getCurAuditor(lastStage.id, lastStage.times)
+                    filter = this.db.format(' And (s.`order` < ? OR (s.`order` = ? And (sChange.`stimes` < ? OR (sChange.`stimes` = ? And sChange.`sorder` <= ?))))', [
                         lastStage.order,
                         lastStage.order,
-                        lastStage.times
+                        lastStage.times,
+                        lastStage.times,
+                        curAuditor.order - 1
                     ])
-                } else {
-                    const curAuditor = await this.ctx.service.stageAudit.getCurAuditor(lastStage.id, lastStage.times)
-                    filter = this.db.format(
-                        ' And (s.`order` < ? OR (s.`order` = ? And (sChange.`stimes` < ? OR (sChange.`stimes` = ? And sChange.`sorder` <= ?))))',
-                        [lastStage.order, lastStage.order, lastStage.times, lastStage.times, curAuditor.order - 1]
-                    )
                 }
             }
             const sql =
@@ -1310,10 +1189,7 @@ module.exports = app => {
                         audit_amount: audit_amount.join(','),
                         samount: ''
                     }
-                    total_price = this.ctx.helper.add(
-                        total_price,
-                        this.ctx.helper.mul(cl.unit_price, parseFloat(last_amount), tenderInfo.decimal.tp)
-                    )
+                    total_price = this.ctx.helper.add(total_price, this.ctx.helper.mul(cl.unit_price, parseFloat(last_amount), tenderInfo.decimal.tp))
                     await this.transaction.update(this.ctx.service.changeAuditList.tableName, list_update)
                 }
 
@@ -1349,21 +1225,12 @@ module.exports = app => {
                 const sms = new SMS(this.ctx)
                 const code = await sms.contentChange(changeInfo.code)
                 const shenpiUrl = await this.ctx.helper.urlToShort(
-                    'http://' +
-                        this.ctx.request.header.host +
-                        '/wap/tender/' +
-                        changeInfo.tid +
-                        '/change/' +
-                        changeInfo.cid +
-                        '/info#shenpi'
-                )
-                await this.ctx.helper.sendAliSms(
-                    auditInfo.uid,
-                    smsTypeConst.const.BG,
-                    smsTypeConst.judge.approval.toString(),
-                    SmsAliConst.template.change_check,
-                    { biangeng: code, code: shenpiUrl }
+                    'http://' + this.ctx.request.header.host + '/wap/tender/' + changeInfo.tid + '/change/' + changeInfo.cid + '/info#shenpi'
                 )
+                await this.ctx.helper.sendAliSms(auditInfo.uid, smsTypeConst.const.BG, smsTypeConst.judge.approval.toString(), SmsAliConst.template.change_check, {
+                    biangeng: code,
+                    code: shenpiUrl
+                })
             } catch (error) {
                 await this.transaction.rollback()
                 result = false
@@ -1379,17 +1246,8 @@ module.exports = app => {
          * @return {Promise<void>}
          */
         async isRepeat(cid, code, tid) {
-            const sql =
-                'SELECT COUNT(*) as count FROM ?? WHERE ((`code` = ? AND `status` != ?) OR (`p_code` = ? AND `status` = ?)) AND `cid` != ? AND `tid` = ?'
-            const sqlParam = [
-                this.tableName,
-                code,
-                audit.flow.status.checked,
-                code,
-                audit.flow.status.checked,
-                cid,
-                tid
-            ]
+            const sql = 'SELECT COUNT(*) as count FROM ?? WHERE ((`code` = ? AND `status` != ?) OR (`p_code` = ? AND `status` = ?)) AND `cid` != ? AND `tid` = ?'
+            const sqlParam = [this.tableName, code, audit.flow.status.checked, code, audit.flow.status.checked, cid, tid]
             const result = await this.db.queryOne(sql, sqlParam)
             return result.count !== 0
         }
@@ -1416,15 +1274,7 @@ module.exports = app => {
                 '  LEFT JOIN ?? As c ON c.`cid` = ?' +
                 '  LEFT JOIN ?? As pa ON pa.`id` = ?' +
                 '  WHERE  t.`project_id` = ? ) as new_t GROUP BY new_t.`tid`'
-            const noticeSqlParam = [
-                this.ctx.service.tender.tableName,
-                tid,
-                this.ctx.service.change.tableName,
-                cid,
-                this.ctx.service.projectAccount.tableName,
-                uid,
-                pid
-            ]
+            const noticeSqlParam = [this.ctx.service.tender.tableName, tid, this.ctx.service.change.tableName, cid, this.ctx.service.projectAccount.tableName, uid, pid]
             const content = await this.db.query(noticeSql, noticeSqlParam)
             return content.length ? JSON.stringify(content[0]) : ''
         }

+ 15 - 9
app/view/advance/detail.ejs

@@ -122,17 +122,19 @@
                                         <label>选择审批人</label>
                                         <div class="input-group">
                                             <div class="input-group-prepend">
-                                                <select class="form-control">
-                                                    <option>所有分组</option>
-                                                    <option>建设单位</option>
-                                                    <option>监理单位</option>
-                                                    <option>施工单位</option>
-                                                    <option>设计单位</option>
+                                                <select class="form-control" id="account_group">
+                                                    <% for (const dw in accountGroup) { %>
+                                                        <option value="<%= dw %>"><%= accountGroup[dw] %></option>
+                                                    <% } %>
                                                 </select>
                                             </div>
-                                            <select class="form-control">
-                                                <option>选择审批人</option>
-                                                <option>张三(监理)-中交第一公路工程局有限公司国道311线满别公路施工一分部</option>
+                                            <select class="form-control" id="account_list">
+                                                <option value="0">选择审批人</option>
+                                                <% for (const account of accountList) { %>
+                                                    <% if (account.id !== ctx.session.sessionUser.accountId) { %>
+                                                        <option value="<%= account.id %>"><%= account.name %><% if (account.role !== '') { %>(<%= account.role %>)<% } %><% if (account.company !== '') { %> -<%= account.company %><% } %></option>
+                                                    <% } %>
+                                                <% } %>
                                             </select>
                                         </div>
                                     </div>
@@ -265,3 +267,7 @@
         </div>
     </div>
 </div>
+<script>
+    const accountGroup = JSON.parse('<%- JSON.stringify(accountGroup) %>');
+    const accountList = JSON.parse('<%- JSON.stringify(accountList) %>');
+</script>

+ 1 - 1
app/view/advance/index.ejs

@@ -33,7 +33,7 @@
                 </div>
             </div>
             <div>
-                <a href="/tender/<%- ctx.tender.id %>/advance/<%- type %>/add" class="btn btn-primary btn-sm pull-right">开始新一期</a>
+                <a href="/tender/<%- ctx.tender.id %>/advance/<%- type %>/create" class="btn btn-primary btn-sm pull-right">开始新一期</a>
             </div>
         </div>
     </div>

+ 1 - 1
app/view/dashboard/index.ejs

@@ -198,7 +198,7 @@
                                                     <div class="row">
                                                         <div class="col-auto"><span class="badge badge-info">台帐审批</span></div>
                                                         <div class="col-6">
-                                                            <a data-id="<%- notice.id %>"href="/tender/<%- notice.tid %>/ledger"><%- notice.name %></a> 台帐<%- acLedger.statusString[notice.status]%>
+                                                            <a data-id="<%- notice.id %>"href="/tender/<%- notice.tid %>/ledger"><%- notice.name %></a> <%- acLedger.statusString[notice.status]%>
                                                         </div>
                                                     </div>
                                                     <p class="mt-1 mb-0"><%- notice.su_name %><small class="ml-1 text-muted"><%- (notice.su_role ? '- ' + notice.su_role : '') %></small>

+ 24 - 0
sql/update.sql

@@ -55,3 +55,27 @@ CREATE TABLE `calculation`.`zh_advance_pay` (
   PRIMARY KEY (`id`))
 COMMENT = '预付款记录';
 
+CREATE TABLE `calculation`.`zh_advance_audit` (
+  `id` INT(11) NOT NULL,
+  `vid` INT(11) NOT NULL COMMENT '预付款记录id',
+  `type` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '预付款类型,0为开工预付款,1为材料预付款',
+  `times` TINYINT(4) NULL DEFAULT NULL COMMENT '审批次数',
+  `audit_order` TINYINT(4) NULL DEFAULT NULL,
+  `audit_id` INT(11) NULL DEFAULT NULL,
+  `status` TINYINT(1) NULL DEFAULT NULL,
+  `begin_time` DATETIME NULL DEFAULT NULL,
+  `end_time` DATETIME NULL DEFAULT NULL,
+  `options` VARCHAR(1000) NULL DEFAULT NULL,
+  PRIMARY KEY (`id`))
+COMMENT = '预付款审核表';
+
+CREATE TABLE `calculation`.`zh_advance_file` (
+  `id` INT(11) NOT NULL,
+  `v_id` INT(11) NOT NULL COMMENT '预付款记录id',
+  `uid` INT(11) NOT NULL COMMENT '上传者id',
+  `in_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '上传时间',
+  `filepath` VARCHAR(255) NOT NULL COMMENT '附件路径',
+  `filesize` VARCHAR(255) NOT NULL COMMENT '附件大小',
+  `filename` VARCHAR(255) NOT NULL COMMENT '附件名字',
+  PRIMARY KEY (`id`))
+COMMENT = '预付款附件';