Browse Source

feat: 预付款审核接口完成

lanjianrong 4 years atrás
parent
commit
3080f46839

+ 9 - 4
app/const/audit.js

@@ -347,8 +347,12 @@ const material = (function () {
 })()
 
 // 预付款审批流程
-// 台账审批流程
 const advance = (function () {
+    const type = {
+        start: 0,
+        material: 1
+    }
+
     const status = {
         uncheck: 1, // 待上报
         checking: 2, // 待审批|审批中
@@ -358,7 +362,7 @@ const advance = (function () {
     }
 
     const statusString = []
-    statusString[status.uncheck] = ''
+    statusString[status.uncheck] = '未上报'
     statusString[status.checking] = '审批中'
     statusString[status.checked] = '审批通过'
     statusString[status.checkNo] = '审批退回'
@@ -382,7 +386,7 @@ const advance = (function () {
     auditStringClass[status.checking] = 'text-warning'
     auditStringClass[status.checked] = 'text-success'
     auditStringClass[status.checkNo] = 'text-warning'
-    return { status, statusString, statusClass, auditString, auditStringClass }
+    return { type, status, statusString, statusClass, auditString, auditStringClass }
 })()
 // 推送类型
 const pushType = {
@@ -390,7 +394,8 @@ const pushType = {
     stage: 2,
     change: 3,
     revise: 4,
-    ledger: 5
+    ledger: 5,
+    advance: 6
 }
 
 module.exports = {

+ 198 - 20
app/controller/advance_controller.js

@@ -1,5 +1,6 @@
 'use strict'
 const accountGroup = require('../const/account_group').group
+const auditConst = require('../const/audit').advance
 
 module.exports = app => {
     class advanceController extends app.BaseController {
@@ -8,8 +9,15 @@ module.exports = app => {
          * @param {Object} ctx 全局上下文
          */
         async index(ctx) {
+            const type = auditConst.type.start
+            const advanceList = await ctx.service.advance.getAdvanceList(ctx.tender.id, type)
+            const latestOrder = await ctx.service.advance.getLastestAdvance(ctx.tender.id, type, true)
             const renderData = {
-                type: 'start',
+                type,
+                advanceList,
+                latestOrder,
+                auditConst,
+                jsFiles: this.app.jsFiles.common.concat(this.app.jsFiles.advance.main),
                 advancePayTotal: ctx.tender.info.deal_param.startAdvance
             }
             await this.layout('advance/index.ejs', renderData, 'advance/modal.ejs')
@@ -19,46 +27,216 @@ module.exports = app => {
          * 材料预付款页面(AJAX) GET
          * @param {Object} ctx 全局上下文
          */
-        async materialInfo(ctx) {
+        async materialList(ctx) {
+            const type = auditConst.type.material
+            const advanceList = await ctx.service.advance.getAdvanceList(ctx.tender.id, type)
+            const latestOrder = await ctx.service.advance.getLastestAdvance(ctx.tender.id, type, true)
             const renderData = {
-                type: 'material',
+                type,
+                advanceList,
+                latestOrder,
+                auditConst,
+                jsFiles: this.app.jsFiles.common.concat(this.app.jsFiles.advance.main),
                 advancePayTotal: ctx.tender.info.deal_param.materialAdvance
             }
             await this.layout('advance/index.ejs', renderData, 'advance/modal.ejs')
         }
 
         /**
+         * 获取通用的renderData(用于layout, Menu, subMenu部分)
+         * @param {Object} ctx 全局上下文
+         * @return {{auditConst, jsFiles, accountGroup?, accountList?, auditors, auditHistory}}
+         * @private
+         */
+        async _getDefaultRenderData(ctx) {
+            const data = {
+                auditConst,
+                jsFiles: this.app.jsFiles.common.concat(this.app.jsFiles.advance.info)
+            }
+            // 获取所有项目参与者
+            if ((ctx.advance.status === auditConst.status.uncheck || ctx.advance.status === auditConst.status.checkNo) && ctx.session.sessionUser.accountId === ctx.advance.uid) {
+                data.accountGroup = accountGroup
+                // 获取所有项目参与者
+                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']
+                })
+                data.accountList = accountList
+            }
+            // 获取审核人左边列表
+            data.auditors = await ctx.service.advanceAudit.getAuditorsWithOwner(ctx.advance.id, ctx.advance.times)
+            // 获取审批流程中右边列表
+            const auditHistory = []
+            const times = ctx.advance.status === auditConst.status.checkNo ? ctx.advance.times - 1 : ctx.advance.times
+            if (times >= 1) {
+                for (let i = 1; i <= times; i++) {
+                    auditHistory.push(await ctx.service.advanceAudit.getAuditors(ctx.advance.id, i))
+                }
+            }
+            data.auditHistory = auditHistory
+            return data
+        }
+
+        /**
          * 预付款详情页(AJAX) GET
          * @param {Object} ctx 全局上下文
          */
         async detail(ctx) {
-            const renderData = {}
-            await this.layout('advance/detail.ejs', renderData)
+            const advancePayTotal = ctx.advance.type === 0 ? ctx.tender.info.deal_param.startAdvance : ctx.tender.info.deal_param.materialAdvance
+            try {
+                const renderData = await this._getDefaultRenderData(ctx)
+                const { uncheck, checkNo } = auditConst.status
+                const { status } = ctx.advance
+                // 获取上一期预付款记录
+                const prevAdvance = await ctx.service.advance.getPreviousRecord(ctx.tender.id, ctx.advance.type)
+                renderData.isEdited = status === uncheck || status === checkNo
+                renderData.advance = ctx.advance
+                renderData.advancePayTotal = advancePayTotal
+                renderData.prevAdvance = prevAdvance
+                await this.layout('advance/detail.ejs', renderData, 'advance/modal_audit.ejs')
+            } catch (error) {
+                this.log(error)
+                ctx.redirect('/tender/' + ctx.tender.id + '/advance')
+            }
         }
 
         /**
-         * 开始新一期页面(AJAX) GET
+         * 添加新一期
          * @param {Object} ctx 全局上下文
          */
-        async createInfo(ctx) {
-            const type = ctx.params.type
-            // 获取所有项目参与者
-            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,
-                accountGroup,
-                accountList
+        async create(ctx) {
+            const response = { err: 0, msg: '', data: {} }
+            const type = parseInt(ctx.params.type)
+            try {
+                const record = await ctx.service.advance.createRecord(type)
+                response.data = record
+            } catch (error) {
+                response.err = 1
+                response.msg = error
+            }
+            ctx.body = response
+        }
+
+        /**
+         * 添加审批人
+         * @param {Object} ctx 全局上下文
+         */
+        async addAudit(ctx) {
+            try {
+                const data = JSON.parse(ctx.request.body.data)
+                const audit_id = data && this.app._.toInteger(data.auditorId)
+                if (isNaN(audit_id) || audit_id <= 0) {
+                    throw '参数错误'
+                }
+                // 检查权限等
+                if (ctx.advance.uid !== ctx.session.sessionUser.accountId) {
+                    throw '您无权添加审核人'
+                }
+                if (ctx.advance.status === auditConst.status.checking || ctx.advance.status === auditConst.status.checked) {
+                    throw '当前不允许添加审核人'
+                }
+                // 检查审核人是否已存在
+                const exist = this.app._.find(ctx.advance.auditors, { audit_id })
+                if (exist) {
+                    throw '该审核人已存在,请勿重复添加'
+                }
+
+                const result = await ctx.service.advanceAudit.addAuditor(ctx.advance.id, audit_id, ctx.advance.times)
+                if (!result) {
+                    throw '添加审核人失败'
+                }
+
+                const audit = await ctx.service.advanceAudit.getAuditor(ctx.advance.id, audit_id, ctx.advance.times)
+                ctx.body = { err: 0, msg: '', data: audit }
+            } catch (err) {
+                this.log(err)
+                ctx.body = { err: 1, msg: err.toString(), data: null }
+            }
+        }
+        /**
+         * 移除审批人
+         * @param {Object} ctx 全局上下文
+         */
+        async deleteAudit(ctx) {
+            try {
+                const data = JSON.parse(ctx.request.body.data)
+                const id = data && data.auditorId instanceof Number ? data.auditorId : this.app._.toNumber(data.auditorId)
+                if (isNaN(id) || id <= 0) {
+                    throw '参数错误'
+                }
+
+                const result = await ctx.service.advanceAudit.deleteAuditor(ctx.advance.id, id, ctx.advance.times)
+                if (!result) {
+                    throw '移除审核人失败'
+                }
+
+                const auditors = await ctx.service.advanceAudit.getAuditGroupByList(ctx.advance.id, ctx.advance.times)
+                ctx.body = { err: 0, msg: '', data: auditors }
+            } catch (err) {
+                ctx.body = { err: 1, msg: err.toString(), data: null }
             }
-            await this.layout('advance/detail.ejs', renderData)
         }
 
         /**
-         * 添加审核人
+         * 上报审批
+         * @param {Object} ctx 全局上下文
          */
-        async add(ctx) {}
+        async start(ctx) {
+            const data = JSON.parse(ctx.request.body.data)
+            try {
+                // 检查权限等
+                if (!ctx.advance) {
+                    throw '数据错误'
+                }
+                if (ctx.advance.uid !== ctx.session.sessionUser.accountId) {
+                    throw '您无权上报该期数据'
+                }
+                if (ctx.advance.status === auditConst.status.checking || ctx.advance.status === auditConst.status.checked) {
+                    throw '该预付款期数据当前无法上报'
+                }
+                await ctx.service.advanceAudit.check(ctx.advance.id, data, ctx.advance.times, data)
+                ctx.redirect(ctx.request.header.referer)
+            } catch (error) {
+                this.log(error)
+                ctx.session.postError = error.toString()
+                ctx.redirect(ctx.request.header.referer)
+            }
+        }
+
+        /**
+         * 审批
+         * @param {Object} ctx 全局上下文
+         */
+        async checkAudit(ctx) {
+            try {
+                if (!ctx.advance || ctx.advance.status !== auditConst.status.checking) {
+                    throw '当前材料调差期数据有误'
+                }
+                if (!ctx.advance.curAuditor || ctx.advance.curAuditor.audit_id !== ctx.session.sessionUser.accountId) {
+                    throw '您无权进行该操作'
+                }
+                const data = {
+                    checkType: parseInt(ctx.request.body.checkType),
+                    opinion: ctx.request.body.opinion
+                }
+                if (!data.checkType || isNaN(data.checkType)) {
+                    throw '提交数据错误'
+                }
+                if (data.checkType === auditConst.status.checkNo) {
+                    if (!data.checkType || isNaN(data.checkType)) {
+                        throw '提交数据错误'
+                    }
+                }
+
+                await ctx.service.advanceAudit.check(ctx.advance.id, data, ctx.advance.times)
+
+                ctx.redirect(ctx.request.header.referer)
+            } catch (err) {
+                this.log(err)
+                ctx.session.postError = err.toString()
+                ctx.redirect(ctx.request.header.referer)
+            }
+        }
     }
     return advanceController
 }

+ 76 - 0
app/middleware/advance_check.js

@@ -0,0 +1,76 @@
+'use strict'
+
+/**
+ * 预付款中间件
+ * @author lanjianrong
+ * @date 2020/8/10
+ * @version
+ */
+
+const status = require('../const/audit').advance.status
+// const _ = require('lodash')
+
+module.exports = () => {
+    /**
+     * 预付款 中间件
+     * 1. 读取期数据
+     * 2. 检验用户是否参与期(不校验具体权限)
+     *
+     * 写入ctx.advance数据
+     * 其中:
+     * advance.auditors: 审批人列表(退回原报时,加载上一流程)
+     * advance.curAuditor: 当前审批人(未上报为空,审批通过 or 退回原报时,为空)
+     * advance.readonly: 登录人,是否可操作
+     * advance.curTimes: 当前登录人,操作、查阅数据times
+     * advance.curOrder: 当前登录人,操作、查阅数据order
+     *
+     * 该方法为通用方法,如需advance其他数据,请在controller中查询
+     *
+     * @param {function} next - 中间件继续执行的方法
+     * @return {void}
+     */
+    return function* advanceCheck(next) {
+        try {
+            // 读取预付款id
+            const id = parseInt(this.params.order)
+            if (!id || id <= 0) {
+                throw '您访问的预付款期不存在'
+            }
+            const advance = yield this.service.advance.getDataByCondition({
+                tid: this.tender.id,
+                id
+            })
+            if (!advance) {
+                throw '预付款数据错误'
+            }
+
+            // 读取审核人列表数据
+            advance.auditors = yield this.service.advanceAudit.getAuditors(advance.id, advance.times)
+            advance.curAuditor = yield this.service.advanceAudit.getCurAuditor(advance.id, advance.times)
+
+            // 获取最新的期
+            // advance.highOrder = yield this.service.advance.getLastestAdvance(this.tender.id, type, true)
+
+            this.advance = advance
+            yield next
+        } catch (err) {
+            console.log('err:', err)
+            this.helper.log(err)
+            // 输出错误到日志
+            if (err.stack) {
+                this.logger.error(err)
+            } else {
+                this.getLogger('fail').info(
+                    JSON.stringify({
+                        error: err,
+                        project: this.session.sessionProject,
+                        user: this.session.sessionUser,
+                        body: this.session.body
+                    })
+                )
+            }
+            // 重定向值标段管理
+            this.redirect(this.request.headers.referer)
+        }
+    }
+}

+ 42 - 0
app/public/js/advance.js

@@ -0,0 +1,42 @@
+'use strict';
+
+/**
+ *
+ *
+ * @author lanjianrong
+ * @date 2020/8/12
+ * @version
+ */
+
+$(document).ready(function () {
+    $('#advance_add').click(function() {
+        postData(`${window.location.pathname}/${type}/create`, {}, res => {
+            const html = `<tr>
+                <td><a href="/tender/${res.tid}/advance/${res.id}/detail" data-id="${res.id}">第${res.order}期</a></td>
+                <td>${res.pay_ratio || 0}%</td>
+                <td class="text-right">${formatMoney(res.cur_amount || 0)}</td>
+                <td class="text-right">${formatMoney(res.prev_amount || 0)}</td>
+                <td class="text-right">${formatMoney(res.prev_total_amount || 0)}</td>
+                <td><a class="btn btn-sm" href="#file" data-toggle="modal" data-target="#file"><i class="fa fa-paperclip "></i> 3</a></td>
+                <td>${auditConst.statusString[res.status]}</td>
+                <td><a href="/tender/${res.tid}/advance/${res.id}/detail" class="btn btn-primary btn-sm">编辑</a></td>
+                </tr>`
+            $('#advanceList').prepend(html)
+            $('advance_add').remove()
+            // $(`#advanceList a[data-id=${res.id}]`).trigger('click')
+        })
+        return false
+    })
+
+    function formatMoney(s, dot = ',') {
+        if (!s) return '0.00';
+        s = parseFloat((s + '').replace(/[^\d\.-]/g, '')).toFixed(2) + '';
+        let l = s.split('.')[0].split('').reverse(),
+            r = s.split('.')[1];
+        let t = '';
+        for (let i = 0; i < l.length; i++) {
+            t += l[i] + ((i + 1) % 3 == 0 && (i + 1) != l.length ? dot : '');
+        }
+        return t.split('').reverse().join('') + '.' + r;
+    }
+})

+ 110 - 44
app/public/js/advance_audit.js

@@ -9,10 +9,22 @@
  */
 
 $(document).ready(function () {
+    // 控制上报弹窗的文案
+    function checkModal(isHide) {
+        if (isHide) {
+            $('#tm-fail').show()
+            $('#tm-success').hide()
+            $('#tm-submit').hide()
+        } else {
+            $('#tm-fail').hide()
+            $('#tm-success').show()
+            $('#tm-submit').show()
+        }
+    }
     // 获取审核相关url
     function getUrlPre () {
         const path = window.location.pathname.split('/');
-        return _.take(path, 3).join('/');
+        return _.take(path, 4).join('/') + '/' + advance.id;
     }
     // 审批人分组选择
     $('#account_group').change(function () {
@@ -32,46 +44,32 @@ $(document).ready(function () {
         id = parseInt(id)
         if (id !== 0) {
             postData(getUrlPre() + '/audit/add', { auditorId: id }, (data) => {
+                // <p class="m-0 ml-2"><small class="text-muted">中交第一公路工程局有限公司国道311线满别公路施工一分部</small></p>
                 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('<li class="list-group-item" auditorId="'+ data.audit_id +'"><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>')
+                html.push('</small>')
+                html.push(`<p class="m-0 ml-2"><small class="text-muted">${data.company}</small></p></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) + '审')
+                if ($('.fa-stop-circle').length) {
+                    $('.fa-stop-circle').removeClass('fa-stop-circle').addClass('fa-chevron-circle-down')
                 }
-                // 添加新审批人
-                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 auditorsHTML = `<li class="list-group-item" data-auditorId='${data.audit_id}'><i class="fa fa fa-stop-circle" ></i> ${data.name} <small class="text-muted">${data.role}</small></li>`
+                $('#auditors2').append(auditorsHTML)
 
-                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(''))
+                if ($('#auditors')[0].children.length > 0) {
+                    checkModal(false)
+                }
             });
         }
     });
+
     // 删除审批人
     $('body').on('click', '#auditors li>a', function () {
         const li = $(this).parent()
@@ -81,26 +79,94 @@ $(document).ready(function () {
         postData(getUrlPre() + '/audit/delete', data, (result) => {
             li.remove();
             for (const rst of result) {
-                const aLi = $('li[auditorId=' + rst.aid + ']');
+                const aLi = $('li[auditorId=' + rst.audit_id + ']');
                 $('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)) + '审')
-            }
+
+            // 删除左边审核人
+            $(`#auditors2 li[data-auditorId='${data.auditorId}']`).remove()
         })
     })
+
+    $('#au-btn').on('click','a', function() {
+        const content = $(this).data('target')
+        switch (content) {
+            case '#sub-sp':
+                if ($('#auditors')[0].children.length) {
+                    checkModal(false)
+                }
+                break;
+
+            default:
+                break;
+        }
+    })
+
+    // 上报审批
+    $('#tm-submit').click(function() {
+        const pay_ratio = parseInt($(`.pay-input[data-type=0]`).val())
+        const cur_amount = parseInt($(`.pay-input[data-type=1]`).val())
+        const prev_amount = prevAdvance && prevAdvance.prev_total_amount || 0
+        const prev_total_amount = ZhCalc.add(cur_amount, prev_amount)
+        const remark = $('#ad-remark').val() || null
+        const data = {pay_ratio, cur_amount, prev_amount, prev_total_amount, remark, status: auditConst.status.checking}
+        postData(getUrlPre() + '/audit/start', data, (data) => {})
+    })
+
+    // 自动转换支付比例和本期金额
+    $('.pay-input').on('input propertychange', function(e) {
+        let val = e.target.value
+        const p_amount = prevAdvance && prevAdvance.prev_total_amount || 0 // 截止本期金额
+        const re_amount = ZhCalc.sub(advancePayTotal, p_amount)
+        const min = parseInt($(this).attr('min'))
+        const max = parseInt($(this).attr('max'))
+        const type = parseInt($(this).data('type'))
+        if (val < min) {
+            // 限制最小值为min
+            $(this).val(min)
+            val = min
+        }
+        if (max && val > max) {
+            // 限制最大值为max
+            $(this).val(max)
+            val = max
+        }
+        // 本期金额转化
+        if (type === 1) {
+            if (val > re_amount) {
+                // 限制超过最大值
+                $(this).val(re_amount)
+                val = re_amount
+            }
+            const pay_a_input = $(`.pay-input[data-type=${reverse(type)}]`)
+            pay_a_input.val(ZhCalc.round(ZhCalc.mul(ZhCalc.div(val, re_amount), 100), 2))
+            // 截止本期金额文案更新
+            $('#p_total').text(formatMoney(ZhCalc.add(val, p_amount)))
+        } else {
+            // 支付比例转化
+            const cur_m_input = $(`.pay-input[data-type=${reverse(type)}]`)
+            const newVal = ZhCalc.mul(re_amount, ZhCalc.div(val, 100))
+            cur_m_input.val(newVal)
+            // 截止本期金额文案更新
+            $('#p_total').text(formatMoney(ZhCalc.add(newVal, p_amount)))
+        }
+    })
+
+    function reverse(num){
+        return 1^num
+    }
+
+    function formatMoney(s, dot = ',') {
+        if (!s) return '0.00';
+        s = parseFloat((s + '').replace(/[^\d\.-]/g, '')).toFixed(2) + '';
+        let l = s.split('.')[0].split('').reverse(),
+            r = s.split('.')[1];
+        let t = '';
+        for (let i = 0; i < l.length; i++) {
+            t += l[i] + ((i + 1) % 3 == 0 && (i + 1) != l.length ? dot : '');
+        }
+        return t.split('').reverse().join('') + '.' + r;
+    }
 })
+

+ 11 - 5
app/router.js

@@ -17,7 +17,8 @@ module.exports = app => {
     const api2otherCheck = app.middlewares.api2otherCheck()
     // 微信验证登录中间件
     const wechatAuth = app.middlewares.wechatAuth()
-
+    // 预付款中间件
+    const advanceCheck = app.middlewares.advanceCheck()
     // 登入登出相关
     app.get('/login', 'loginController.index')
     app.get('/login/port', api2otherCheck, 'loginController.port')
@@ -108,10 +109,15 @@ module.exports = app => {
 
     // 预付款
     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/advance/material', sessionAuth, tenderCheck, 'advanceController.materialList')
+    app.post('/tender/:id/advance/create', sessionAuth, tenderCheck, 'advanceController.create')
+    app.get('/tender/:id/advance/:order/detail', sessionAuth, tenderCheck, advanceCheck, 'advanceController.detail')
+    app.post('/tender/:id/advance/:type/create', sessionAuth, tenderCheck, 'advanceController.create')
+    app.post('/tender/:id/advance/:order/audit/add', sessionAuth, tenderCheck, advanceCheck, 'advanceController.addAudit')
+    app.post('/tender/:id/advance/:order/audit/delete', sessionAuth, tenderCheck, advanceCheck, 'advanceController.deleteAudit')
+    app.post('/tender/:id/advance/:order/audit/start', sessionAuth, tenderCheck, advanceCheck, 'advanceController.start')
+    app.post('/tender/:id/advance/:order/audit/check', sessionAuth, tenderCheck, advanceCheck, 'advanceController.start')
+
     // 标段协作办公
     app.get('/tender/:id/cooperation', sessionAuth, tenderCheck, 'tenderController.tenderCooperation')
 

+ 97 - 0
app/service/advance.js

@@ -1,11 +1,108 @@
 'use strict'
 
+const auditConst = require('../const/audit').advance
+
 module.exports = app => {
     class Advance extends app.BaseService {
         constructor(ctx) {
             super(ctx)
             this.tableName = 'advance_pay'
         }
+
+        /**
+         * 获取预付款列表
+         * @param {Number} tid 标段id
+         * @param {Number} type 预付款类型
+         */
+        async getAdvanceList(tid, type) {
+            this.initSqlBuilder()
+            this.sqlBuilder.setAndWhere('tid', {
+                value: tid,
+                operate: '='
+            })
+            this.sqlBuilder.setAndWhere('type', {
+                value: type,
+                operate: '='
+            })
+            this.sqlBuilder.orderBy = [['order', 'desc']]
+            const [sql, sqlParam] = this.sqlBuilder.build(this.tableName)
+            const advance = await this.db.query(sql, sqlParam)
+            return advance
+        }
+
+        /**
+         * 获取预付款最新一期
+         * @param {Number} tid 标段id
+         * @param {String} type 类型: 开工预付款|材料预付款 (0|1)
+         * @param {Boolean} includeUnCheck 包括未上报的
+         * @return {Promise<*>} 实例结果集
+         */
+        async getLastestAdvance(tid, type, includeUnCheck = false) {
+            this.initSqlBuilder()
+            this.sqlBuilder.setAndWhere('tid', {
+                value: tid,
+                operate: '='
+            })
+            this.sqlBuilder.setAndWhere('type', {
+                value: type,
+                operate: '='
+            })
+            if (!includeUnCheck) {
+                this.sqlBuilder.setAndWhere('status', {
+                    value: auditConst.status.uncheck,
+                    operate: '!='
+                })
+            }
+            this.sqlBuilder.orderBy = [['order', 'desc']]
+            const [sql, sqlParam] = this.sqlBuilder.build(this.tableName)
+            const advance = await this.db.queryOne(sql, sqlParam)
+            return advance
+        }
+
+        /**
+         * 创建一条新的记录
+         * @param {String} type 类型: 开工预付款|材料预付款 (start|material)
+         * @return {Promise<*>} 插入结果集
+         */
+        async createRecord(type) {
+            const { ctx } = this
+            const uid = ctx.session.sessionUser.accountId
+            const tid = ctx.tender.id
+            const latestOrder = await this.getLastestAdvance(tid, type)
+            const order = !latestOrder ? 1 : latestOrder.order + 1
+            const record = await this.db.insert(this.tableName, { type, uid, tid, status: auditConst.status.uncheck, order })
+            return await this.getDataById(record.insertId)
+        }
+
+        /**
+         * 获取上一期预付款记录
+         * @param {Number} tid 标段id
+         * @param {Number} type 预付款类型
+         */
+        async getPreviousRecord(tid, type) {
+            this.initSqlBuilder()
+            this.sqlBuilder.setAndWhere('tid', {
+                value: tid,
+                operate: '='
+            })
+            this.sqlBuilder.setAndWhere('type', {
+                value: type,
+                operate: '='
+            })
+            this.sqlBuilder.orderBy = [['order', 'desc']]
+            const [sql, sqlParam] = this.sqlBuilder.build(this.tableName)
+            return await this.db.queryOne(sql, sqlParam)
+        }
+
+        // /**
+        //  * 更新预付款记录
+        //  * @param {Object} data 载荷
+        //  * @param {Number} id 预付款id
+        //  */
+        // async updateAdvance(data, id) {
+        //     const result = await this.db.update(this.tableName, data, { where: { id } })
+        //     console.log(result)
+        // }
     }
     return Advance
 }

+ 390 - 7
app/service/advance_audit.js

@@ -1,5 +1,7 @@
 'use strict'
 
+const auditConst = require('../const/audit').advance
+const pushType = require('../const/audit').pushType
 module.exports = app => {
     class AdvanceAudit extends app.BaseService {
         constructor(ctx) {
@@ -11,12 +13,13 @@ module.exports = app => {
          * 获取审核人流程列表
          * @param {Number} vid 预付款记录id
          * @param {Number} times 审核次数
+         * @return {Promise<Array>} 查询结果集
          */
-        async getAuditGroupByList(vid, times) {
+        async getAuditGroupByList(vid, times = 1) {
             const sql =
-                'SELECT la.`aid`, pa.`name`, pa.`company`, pa.`role`, la.`times`, la.`sid`, la.`aid`, la.`order` ' +
+                'SELECT la.`audit_id`, pa.`name`, pa.`company`, pa.`role`, la.`times`, la.`vid`, 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`'
+                'WHERE la.`vid` = ? and la.`times` = ? and la.`audit_id` = pa.`id` GROUP BY la.`audit_id` ORDER BY la.`order`'
             const sqlParam = [this.tableName, this.ctx.service.projectAccount.tableName, vid, times]
             return await this.db.query(sql, sqlParam)
         }
@@ -25,24 +28,404 @@ module.exports = app => {
          * 获取审核人流程列表(包括原报)
          * @param {Number} vid 预付款记录id
          * @param {Number} times 审核次数
+         * @return {Promise<Array>} 查询结果集(包括原报)
          */
-        async getAuditGroupByListWithOwner(vid, times) {
+        async getAuditorsWithOwner(vid, times = 1) {
             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`' +
+                'SELECT pa.`id` As aid, pa.`name`, pa.`company`, pa.`role`, ? As times, ? As vid, 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' +
+                '  ON s.uid = pa.id' +
                 '  WHERE s.id = ?'
-            const sqlParam = [times, stageId, stageId]
+            const sqlParam = [times, vid, vid]
             const user = await this.db.queryOne(sql, sqlParam)
             result.unshift(user)
             return result
         }
+
+        /**
+         * 获取最新审核顺序
+         * @param {Number} vid - 预付款id
+         * @param {Number} times - 第几次审批
+         * @return {Number} 审核顺序
+         */
+        async getNewOrder(vid, times = 1) {
+            const sql = 'SELECT Max(??) As max_order FROM ?? Where `vid` = ? and `times` = ?'
+            const sqlParam = ['order', this.tableName, vid, times]
+            const result = await this.db.queryOne(sql, sqlParam)
+            return result && result.max_order ? result.max_order + 1 : 1
+        }
+
+        /**
+         * 新增审核人
+         * @param {Number} vid - 预付款id
+         * @param {Number} audit_id - 审核人id
+         * @param {Number} times - 第几次审批
+         * @return {Boolean} 是否插入成功
+         */
+        async addAuditor(vid, audit_id, times = 1) {
+            const newOrder = await this.getNewOrder(vid, times)
+            const record = {
+                vid,
+                audit_id,
+                times,
+                order: newOrder,
+                status: auditConst.status.uncheck
+            }
+            const result = await this.db.insert(this.tableName, record)
+            return result && result.affectedRows === 1
+        }
+
+        /**
+         * 移除审核人
+         * @param {Number} vid - 预付款id
+         * @param {Number} audit_id - 审核人id
+         * @param {Number} times - 第几次审批
+         * @return {Promise<boolean>}
+         */
+        async deleteAuditor(vid, audit_id, times = 1) {
+            const transaction = await this.db.beginTransaction()
+            try {
+                const condition = { vid, audit_id, times }
+                const auditor = await this.getDataByCondition(condition)
+                if (!auditor) {
+                    throw '该审核人不存在'
+                }
+                await this._syncOrderByDelete(transaction, vid, auditor.order, times)
+                await transaction.delete(this.tableName, condition)
+                await transaction.commit()
+            } catch (err) {
+                await transaction.rollback()
+                throw err
+            }
+            return true
+        }
+
+        /**
+         * 移除审核人时,同步其后审核人order
+         * @param {Function} transaction - 事务
+         * @param {Number} vid - 预付款id
+         * @param {Number} order - 审核顺序
+         * @param {Number} times - 第几次审批
+         * @return {Promise<*>} 查询结果集
+         * @private
+         */
+        async _syncOrderByDelete(transaction, vid, order, times) {
+            this.initSqlBuilder()
+            this.sqlBuilder.setAndWhere('vid', {
+                value: this.db.escape(vid),
+                operate: '='
+            })
+            this.sqlBuilder.setAndWhere('order', {
+                value: order,
+                operate: '>='
+            })
+            this.sqlBuilder.setAndWhere('times', {
+                value: times,
+                operate: '='
+            })
+            this.sqlBuilder.setUpdateData('order', {
+                value: 1,
+                selfOperate: '-'
+            })
+            const [sql, sqlParam] = this.sqlBuilder.build(this.tableName, 'update')
+            const data = await transaction.query(sql, sqlParam)
+            return data
+        }
+
+        /**
+         * 获取当前审核人
+         * @param {Number} vid - 预付款id
+         * @param {Number} times - 第几次审批
+         * @return {Promise<Object>} 查询结果集
+         */
+        async getCurAuditor(vid, times = 1) {
+            const sql =
+                'SELECT la.`audit_id`, pa.`name`, pa.`company`, pa.`role`, pa.`mobile`, pa.`telephone`, la.`times`, la.`order`, la.`status`, la.`opinion`, la.`begin_time`, la.`end_time` ' +
+                'FROM ?? AS la, ?? AS pa ' +
+                'WHERE la.`vid` = ? and la.`status` = ? and la.`times` = ?' +
+                '    and la.`audit_id` = pa.`id`'
+            const sqlParam = [this.tableName, this.ctx.service.projectAccount.tableName, vid, auditConst.status.checking, times]
+            return await this.db.queryOne(sql, sqlParam)
+        }
+
+        /**
+         * 获取审核列表信息
+         * @param {Number} vid - 预付款id
+         * @param {Number} times - 第几次审批
+         * @return {Promise<Array>} 查询结果集
+         */
+        async getAuditors(vid, times = 1) {
+            const sql =
+                'SELECT la.`audit_id`, pa.`name`, pa.`company`, pa.`role`, pa.`mobile`, pa.`telephone`, la.`times`, la.`order`, la.`status`, la.`opinion`, la.`begin_time`, la.`end_time`, g.`sort` ' +
+                'FROM ?? AS la, ?? AS pa, (SELECT `audit_id`,(@i:=@i+1) as `sort` FROM ??, (select @i:=0) as it WHERE `vid` = ? AND `times` = ? GROUP BY `audit_id`) as g ' +
+                'WHERE la.`vid` = ? and la.`times` = ? and la.`audit_id` = pa.`id` and g.`audit_id` = la.`audit_id` order by la.`order`'
+            const sqlParam = [this.tableName, this.ctx.service.projectAccount.tableName, this.tableName, vid, times, vid, times]
+            const result = await this.db.query(sql, sqlParam)
+            const sql2 = 'SELECT COUNT(a.`audit_id`) as num FROM (SELECT `audit_id` FROM ?? WHERE `vid` = ? AND `times` = ? GROUP BY `audit_id`) as a'
+            const sqlParam2 = [this.tableName, vid, times]
+            const count = await this.db.queryOne(sql2, sqlParam2)
+            for (const i in result) {
+                result[i].max_sort = count.num
+            }
+            return result
+        }
+
+        /**
+         * 获取审核人信息
+         * @param {Number} vid - 预付款id
+         * @param {Number} audit_id - 审核人id
+         * @param {Number} times - 第几次审批
+         * @return {Promise<*>} 查询结果
+         */
+        async getAuditor(vid, audit_id, times = 1) {
+            const sql =
+                'SELECT la.`audit_id`, pa.`name`, pa.`company`, pa.`role`, pa.`mobile`, pa.`telephone`, la.`times`, la.`order`, la.`status`, la.`opinion`, la.`begin_time`, la.`end_time` ' +
+                'FROM ?? AS la, ?? AS pa ' +
+                'WHERE la.`vid` = ? and la.`audit_id` = ? and la.`times` = ?' +
+                '    and la.`audit_id` = pa.`id`'
+            const sqlParam = [this.tableName, this.ctx.service.projectAccount.tableName, vid, audit_id, times]
+            return await this.db.queryOne(sql, sqlParam)
+        }
+
+        /**
+         * 开始审批
+         * @param {Number} vid - 预付款id
+         * @param {Number} times - 第几次审批
+         * @param {Object} data - 载荷
+         */
+        async start(vid, times = 1, data) {
+            const audit = await this.getDataByCondition({ vid, times, order: 1 })
+            if (!audit) {
+                throw '请先选择审批人,再上报数据'
+            }
+            const transaction = await this.db.beginTransaction()
+            try {
+                await transaction.update(this.tableName, { id: audit.id, status: auditConst.status.checking, begin_time: new Date() })
+                await transaction.update(this.ctx.service.advance.tableName, {
+                    id: audit.vid,
+                    ...data
+                })
+                await transaction.commit()
+            } catch (err) {
+                await transaction.rollback()
+                throw err
+            }
+            return true
+        }
+
+        async _checked(pid, advanceId, checkData, times) {
+            const time = new Date()
+
+            // 整理当前流程审核人状态更新
+            const audit = await this.getDataByCondition({ vid: advanceId, times, status: auditConst.status.checking })
+            if (!audit) {
+                throw '审核数据错误'
+            }
+
+            // 获取审核人列表
+            const sql = 'SELECT `tid`, `vid`, `audit_id`, `order` FROM ?? WHERE `vid` = ? and `times` = ? GROUP BY `audit_id` ORDER BY `id` ASC'
+            const sqlParam = [this.tableName, advanceId, times]
+            const auditors = await this.db.query(sql, sqlParam)
+
+            const nextAudit = await this.getDataByCondition({ vid: advanceId, times, order: audit.order + 1 })
+
+            const transaction = await this.db.beginTransaction()
+            try {
+                await transaction.update(this.tableName, { id: audit.id, status: checkData.checkType, opinion: checkData.opinion, end_time: time })
+                // 获取推送必要信息
+                const noticeContent = await this.getNoticeContent(pid, audit.tid, advanceId, audit.audit_id)
+                // 添加推送
+                const records = [{ pid, type: pushType.advance, uid: this.ctx.advance.uid, status: auditConst.status.checked, content: noticeContent }]
+                auditors.forEach(audit => {
+                    records.push({ pid, type: pushType.advance, uid: audit.aid, status: auditConst.status.checked, content: noticeContent })
+                })
+                await transaction.insert(this.ctx.service.notice.tableName, records)
+                // 无下一审核人表示,审核结束
+                if (nextAudit) {
+                    // 流程至下一审批人
+                    await transaction.update(this.tableName, { id: nextAudit.id, status: auditConst.status.checking, begin_time: time })
+
+                    // 同步期信息
+                    await transaction.update(this.ctx.service.advance.tableName, {
+                        id: advanceId,
+                        status: auditConst.status.checking
+                    })
+                } else {
+                    await transaction.update(this.ctx.service.advance.tableName, {
+                        id: advanceId,
+                        status: checkData.checkType
+                    })
+                }
+                await transaction.commit()
+            } catch (err) {
+                await transaction.rollback()
+                throw err
+            }
+        }
+
+        async _checkNo(pid, advanceId, checkData, times) {
+            const time = new Date()
+            // 整理当前流程审核人状态更新
+            const audit = await this.getDataByCondition({ vid: advanceId, times, status: auditConst.status.checking })
+            if (!audit) {
+                throw '审核数据错误'
+            }
+            const sql = 'SELECT `tid`, `vid`, `audit_id`, `order` FROM ?? WHERE `vid` = ? and `times` = ? GROUP BY `audit_id` ORDER BY `id` ASC'
+            const sqlParam = [this.tableName, advanceId, times]
+            const auditors = await this.db.query(sql, sqlParam)
+            let order = 1
+            for (const a of auditors) {
+                a.times = times + 1
+                a.order = order
+                a.status = auditConst.status.uncheck
+                order++
+            }
+            const transaction = await this.db.beginTransaction()
+            try {
+                await transaction.update(this.tableName, { id: audit.id, status: checkData.checkType, opinion: checkData.opinion, end_time: time })
+
+                // 添加到消息推送表
+                const noticeContent = await this.getNoticeContent(pid, audit.tid, advanceId, audit.aid)
+                const records = [{ pid, type: pushType.advance, uid: this.ctx.advance.uid, status: auditConst.status.checkNo, content: noticeContent }]
+                auditors.forEach(audit => {
+                    records.push({ pid, type: pushType.advance, uid: audit.aid, status: auditConst.status.checkNo, content: noticeContent })
+                })
+                await transaction.insert(this.ctx.service.notice.tableName, records)
+
+                // 同步期信息
+                await transaction.update(this.ctx.service.advance.tableName, {
+                    id: advanceId,
+                    status: checkData.checkType,
+                    times: times + 1
+                })
+                // 拷贝新一次审核流程列表
+                await transaction.insert(this.tableName, auditors)
+                await transaction.commit()
+            } catch (err) {
+                await transaction.rollback()
+                throw err
+            }
+        }
+
+        async _checkNoPre(pid, advanceId, checkData, times) {
+            const time = new Date()
+            // 整理当前流程审核人状态更新
+            const audit = await this.getDataByCondition({ vid: advanceId, times, status: auditConst.status.checking })
+            if (!audit || audit.order <= 1) {
+                throw '审核数据错误'
+            }
+            // 添加重新审批后,不能用order-1,取groupby值里的上一个才对
+            const auditors2 = await this.getAuditGroupByList(advanceId, times)
+            const auditorIndex = await auditors2.findIndex(function (item) {
+                return item.audit_id === audit.audit_id
+            })
+            const preAuditor = auditors2[auditorIndex - 1]
+            const noticeContent = await this.getNoticeContent(pid, audit.tid, advanceId, audit.aid)
+            const transaction = await this.db.beginTransaction()
+            try {
+                // 添加到消息推送表
+                const records = [{ pid, type: pushType.advance, uid: this.ctx.advance.uid, status: auditConst.status.checkNoPre, content: noticeContent }]
+                auditors2.forEach(audit => {
+                    records.push({ pid, type: pushType.advance, uid: audit.aid, status: auditConst.status.checkNoPre, content: noticeContent })
+                })
+                await transaction.insert(this.ctx.service.notice.tableName, records)
+                await transaction.update(this.tableName, { id: audit.id, status: checkData.checkType, opinion: checkData.opinion, end_time: time })
+                // 顺移气候审核人流程顺序
+                this.initSqlBuilder()
+                this.sqlBuilder.setAndWhere('vid', { value: advanceId, operate: '=' })
+                this.sqlBuilder.setAndWhere('order', { value: audit.order, operate: '>' })
+                this.sqlBuilder.setUpdateData('order', { value: 2, selfOperate: '+' })
+                const [sql, sqlParam] = this.sqlBuilder.build(this.tableName, 'update')
+                await transaction.query(sql, sqlParam)
+                const newAuditors = []
+                newAuditors.push({
+                    tid: audit.tid,
+                    vid: audit.vid,
+                    audit_id: preAuditor.audit_id,
+                    times: audit.times,
+                    order: audit.order + 1,
+                    status: auditConst.status.checking,
+                    begin_time: time
+                })
+                newAuditors.push({
+                    tid: audit.tid,
+                    vid: audit.vid,
+                    audit_id: audit.audit_id,
+                    times: audit.times,
+                    order: audit.order + 2,
+                    status: auditConst.status.uncheck
+                })
+
+                await transaction.insert(this.tableName, newAuditors)
+                await transaction.commit()
+            } catch (error) {
+                await transaction.rollback()
+                throw error
+            }
+        }
+
+        /**
+         * 审批
+         * @param {Number} advanceId - 预付款id
+         * @param {auditConst.status.checked|auditConst.status.checkNo} checkData - 审批结果
+         * @param {Number} times - 第几次审批
+         * @return {Promise<void>}
+         */
+        async check(advanceId, checkData, times = 1) {
+            if (checkData.checkType !== auditConst.status.checked && checkData.checkType !== auditConst.status.checkNo && checkData.checkType !== auditConst.status.checkNoPre) {
+                throw '提交数据错误'
+            }
+            const pid = this.ctx.session.sessionProject.id
+            switch (checkData.checkType) {
+                case auditConst.status.checked:
+                    await this._checked(pid, advanceId, checkData, times)
+                    break
+                case auditConst.status.checkNo:
+                    await this._checkNo(pid, advanceId, checkData, times)
+                    break
+                case auditConst.status.checkNoPre:
+                    await this._checkNoPre(pid, advanceId, checkData, times)
+                    break
+                default:
+                    throw '无效审批操作'
+            }
+        }
+
+        /**
+         * 用于添加推送所需的content内容
+         * @param {Number} pid 项目id
+         * @param {Number} tid 台账id
+         * @param {Number} vid 预付款id
+         * @param {Number} uid 审批人id
+         */
+        async getAdvanceContent(pid, tid, vid, uid) {
+            const noticeSql =
+                'SELECT * FROM (SELECT ' +
+                '  t.`id` As `tid`, ad.`vid`, t.`name`, m.`order`, pa.`name` As `su_name`, pa.role As `su_role`' +
+                '  FROM (SELECT * FROM ?? WHERE `id` = ? ) As t' +
+                '  LEFT JOIN ?? As m On t.`id` = m.`tid` AND m.`id` = ?' +
+                '  LEFT JOIN ?? As ad ON m.`id` = ad.`vid`' +
+                '  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.advance.tableName,
+                vid,
+                this.tableName,
+                this.ctx.service.projectAccount.tableName,
+                uid,
+                pid
+            ]
+            const content = await this.db.query(noticeSql, noticeSqlParam)
+            return content.length ? JSON.stringify(content[0]) : ''
+        }
     }
     return AdvanceAudit
 }

+ 30 - 0
app/view/advance/audit_btn.ejs

@@ -0,0 +1,30 @@
+
+<% if (ctx.advance.status === auditConst.status.uncheck) { %>
+<a href="#sub-sp" data-toggle="modal" data-target="#sub-sp" class="btn btn-primary btn-sm">上报审批</a>
+<% } else if (ctx.advance.status === auditConst.status.checking) { %>
+    <% if (ctx.advance.curAuditor && ctx.advance.curAuditor.audit_id === ctx.session.sessionUser.accountId) { %>
+        <a id="sp-done-btn" href="javascript: void(0);" data-toggle="modal" data-target="#sp-done" class="btn btn-success btn-sm">审批通过</a>
+        <a href="#sp-back" data-toggle="modal" data-target="#sp-back" class="btn btn-warning btn-sm">审批退回</a>
+    <% } else { %>
+        <a href="#sp-list" data-toggle="modal" data-target="#sp-list" class="btn btn-outline-secondary btn-sm">审批中</a>
+    <% } %>
+<% } else if (ctx.advance.status === auditConst.status.checked) { %>
+    <a href="#sp-list" data-toggle="modal" data-target="#sp-list" class="btn btn-outline-secondary btn-sm">审批完成</a>
+<% } else if (ctx.advance.status === auditConst.status.checkNo) { %>
+    <a href="#sp-list" data-toggle="modal" data-target="#sp-list" class="btn btn-outline-warning btn-sm text-muted">审批退回</a>
+    <% if (ctx.session.sessionUser.accountId === ctx.advance.uid) { %>
+        <a id="sp-list2-btn" href="javascript: void(0);" data-toggle="modal" data-target="#sp-list2" class="btn btn-primary btn-sm">重新上报</a>
+    <% } %>
+<% } else if (ctx.advance.status === auditConst.status.checkNoPre) { %>
+    <a href="#sp-list" data-toggle="modal" data-target="#sp-list" class="btn btn-outline-warning btn-sm text-muted">审批退回</a>
+    <% if (ctx.session.sessionUser.accountId === ctx.advance.curAuditor.audit_id) { %>
+        <a id="sp-done-btn" href="javascript: void(0);" data-toggle="modal" data-target="#sp-done" class="btn btn-success btn-sm">审批通过</a>
+        <a href="#sp-back" data-toggle="modal" data-target="#sp-back" class="btn btn-warning btn-sm">审批退回</a>
+    <% } %>
+<% } %>
+<!-- <% if (ctx.advance.auditors !== undefined && ctx.advance.auditors.length !== 0 && ctx.advance.auditors[ctx.advance.auditors.length-1].audit_id === ctx.session.sessionUser.accountId && ctx.advance.status === auditConst.status.checked && ctx.advance.order === ctx.advance.highOrder) { %>
+    <a href="javascript: void(0);" data-toggle="modal" data-target="#sp-down-back" class="btn btn-warning btn-sm">重新审批</a>
+<% } %>
+<% if (ctx.advance.uid === ctx.session.sessionUser.accountId && ctx.advance.order === ctx.advance.highOrder && (ctx.advance.status === auditConst.status.checkNo || ctx.advance.status === auditConst.status.uncheck)) { %>
+    <a href="#del-qi" data-toggle="modal" data-target="#del-qi" class="btn btn-outline-danger btn-sm mt-5">删除本期</a>
+<% } %> -->

+ 144 - 107
app/view/advance/detail.ejs

@@ -4,71 +4,75 @@
         <div class="title-main d-flex justify-content-between">
             <div>
                 <div class="d-inline-block">
-                    第3
+                    第<%- advance.order %>
                 </div>
             </div>
-            <div>
-                <a href="#sp-back" data-toggle="modal" data-target="#sp-back" class="btn btn-warning btn-sm">审批退回</a>
-                <a href="#sp-done" data-toggle="modal" data-target="#sp-done" class="btn btn-success btn-sm">审批通过</a>
+            <div id="au-btn">
+                <% include ./audit_btn.ejs %>
             </div>
         </div>
     </div>
     <div class="content-wrap">
         <div class="c-body">
-            <div class="sjs-height-0">
+            <div class="sjs-height-0" style="height: 942px;">
                 <div class="col-8 mx-auto">
-                    <h4 class="mt-3 text-center">第3期 开工预付款</h4>
+                    <h4 class="mt-3 text-center">第<%- advance.order %>期 <%- advance.type === auditConst.type.start ? '开工' : '材料' %>预付款</h4>
                     <table class="table table-bordered">
                         <thead>
                             <tr>
                                 <th colspan="4" class="text-center">
-                                    <h5>签约开工预付款:8,121,212.00 元</h5>
+                                    <h5>签约<%- advance.type === auditConst.type.start ? '开工' : '材料' %>预付款:<%- ctx.helper.formatMoney(advancePayTotal) %> 元</h5>
                                 </th>
                             </tr>
                         </thead>
-                        <tbody>
+                        <tbody id="pay-content">
                             <% if(isEdited) { %>
-                                <th width="150">支付比例</th>
-                                <td class="text-right">
-                                    <div class="input-group input-group-sm"><input type="number"
-                                            class="form-control nospin text-right" value="2" max="100" min="1"
-                                            placeholder="请填写支付比例,将自动计算本期金额">
-                                        <div class="input-group-append"><span class="input-group-text">%</span></div>
-                                    </div>
-                                </td>
-                                <th width="150">本期金额</th>
-                                <td class="text-right">
-                                    <div class="input-group input-group-sm"><input type="number"
-                                            class="form-control nospin text-right" min="1" placeholder="请填写本期金额,将自动计算支付比例">
-                                        <div class="input-group-append"><span class="input-group-text">元</span></div>
-                                    </div>
-                                </td>
+                                <tr>
+                                    <th width="150">支付比例</th>
+                                    <td class="text-right">
+                                        <div class="input-group input-group-sm">
+                                            <input type="number" class="pay-input form-control nospin text-right" max="100" min="1"
+                                                placeholder="请填写支付比例,将自动计算本期金额" data-type="0">
+                                            <div class="input-group-append"><span class="input-group-text">%</span></div>
+                                        </div>
+                                    </td>
+                                    <th width="150">本期金额</th>
+                                    <td class="text-right">
+                                        <div class="input-group input-group-sm">
+                                            <input type="number"
+                                                class="pay-input form-control nospin text-right" min="1" placeholder="请填写本期金额,将自动计算支付比例" data-type="1">
+                                            <div class="input-group-append"><span class="input-group-text">元</span></div>
+                                        </div>
+                                    </td>
                                 </tr>
                             <% } else {%>
                                 <tr>
                                     <th width="150">支付比例</th>
                                     <td class="text-right">
-                                        <h5>20%</h5>
+                                        <h5><%- advance.pay_ratio %>%</h5>
                                     </td>
                                     <th width="150">本期金额</th>
                                     <td class="text-right">
-                                        <h5>30000.00</h5>
+                                        <h5><%- advance.cur_amount %></h5>
                                     </td>
                                 </tr>
                             <% } %>
                             <tr>
                                 <th>截止上期</th>
                                 <td class="text-right">
-                                    <h5>40000.00</h5>
+                                    <h5><%- ctx.helper.formatMoney(advance.prev_amount) %></h5>
                                 </td>
                                 <th>截止本期金额</th>
                                 <td class="text-right">
-                                    <h5>70000.00</h5>
+                                    <h5 id="p_total"><%- ctx.helper.formatMoney(advance.prev_total_amount) %></h5>
                                 </td>
                             </tr>
                             <tr>
                                 <th>备注</th>
-                                <td colspan="3"></td>
+                                <td colspan="3">
+                                    <textarea  id="ad-remark" class="form-control form-control-sm"
+                                    disabled="<%- isEdited ? false : true %>" value="<%- advance.remark %>"></textarea>
+                                </td>
                             </tr>
                         </tbody>
                     </table>
@@ -94,77 +98,80 @@
                         </tbody>
                     </table>
                     <% if(isEdited) { %>
-                    <table class="table table-bordered mt-3">
-                        <thead>
-                            <tr>
-                                <th colspan="2" class="text-center">审批流程</th>
-                            </tr>
-                        </thead>
-                        <tbody>
-                            <tr>
-                                <td width="30%">
-                                    <div class="card">
-                                        <ul class="list-group list-group-flush">
-                                            <li class="list-group-item"><i
-                                                    class="fa fa fa-play-circle fa-rotate-90"></i> 布尔 <small
-                                                    class="text-muted">施工</small></li>
-                                            <li class="list-group-item"><i class="fa fa-chevron-circle-down"></i> 张三
-                                                <small class="text-muted">监理</small></li>
-                                            <li class="list-group-item"><i class="fa fa-chevron-circle-down"></i> 王五
-                                                <small class="text-muted">监理</small></li>
-                                            <li class="list-group-item"><i class="fa fa fa-stop-circle"></i> 李四 <small
-                                                    class="text-muted">监理</small></li>
-                                        </ul>
-                                    </div>
-                                </td>
-                                <td width="70%">
-                                    <div class="form-group">
-                                        <label>选择审批人</label>
-                                        <div class="input-group">
-                                            <div class="input-group-prepend">
-                                                <select class="form-control" id="account_group">
-                                                    <% for (const dw in accountGroup) { %>
-                                                        <option value="<%= dw %>"><%= accountGroup[dw] %></option>
+                        <table class="table table-bordered mt-3">
+                            <thead>
+                                <tr>
+                                    <th colspan="2" class="text-center">审批流程</th>
+                                </tr>
+                            </thead>
+                            <tbody>
+                                <tr>
+                                    <td width="30%">
+                                        <div class="card">
+                                            <ul class="list-group list-group-flush" id="auditors2">
+                                                <% auditors.forEach((item, idx) => { %>
+                                                    <% if (idx === 0) { %>
+                                                        <li class="list-group-item" data-auditorId="<%- item.audit_id %>">
+                                                            <i class="fa fa fa-play-circle fa-rotate-90"></i> <%- item.name %>
+                                                            <small class="text-muted"><%- item.role %></small>
+                                                        </li>
+                                                    <% } else if(idx === auditors.length -1 && idx !== 0) { %>
+                                                        <li class="list-group-item" data-auditorId="<%- item.audit_id %>">
+                                                            <i class="fa fa fa-stop-circle"></i> <%- item.name %>
+                                                            <small class="text-muted"><%- item.role %></small>
+                                                        </li>
+                                                    <% } else {%>
+                                                        <li class="list-group-item" data-auditorId="<%- item.audit_id %>">
+                                                            <i class="fa fa-chevron-circle-down"></i> <%- item.name %>
+                                                            <small class="text-muted"><%- item.role %></small>
+                                                        </li>
+                                                    <% } %>
+                                                <% }) %>
+                                            </ul>
+                                        </div>
+                                    </td>
+                                    <td width="70%">
+                                        <div class="form-group">
+                                            <label>选择审批人</label>
+                                            <div class="input-group">
+                                                <div class="input-group-prepend">
+                                                    <select class="form-control" id="account_group">
+                                                        <% for (const dw in accountGroup) { %>
+                                                            <option value="<%= dw %>"><%= accountGroup[dw] %></option>
+                                                        <% } %>
+                                                    </select>
+                                                </div>
+                                                <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>
-                                            <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>
-                                    <div class="card mt-3">
-                                        <div class="card-header">
-                                            审批流程
+                                        <div class="card mt-3">
+                                            <div class="card-header">
+                                                审批流程
+                                            </div>
+                                            <ul class="list-group list-group-flush" id="auditors">
+                                                <% auditHistory && auditHistory[0] && auditHistory[0].length && auditHistory[0].forEach((item, idx) => { %>
+                                                    <li class="list-group-item" auditorId="<%- item.audit_id %>">
+                                                        <a href="" class="text-danger pull-right">移除</a><%- idx+1 %> <%- item.name %>
+                                                        <small class="text-muted"><%- item.role %>  </small>
+                                                        <p class="m-0 ml-2">
+                                                            <small class="text-muted"><%- item.company %></small>
+                                                        </p>
+                                                    </li>
+
+                                                <% }) %>
+                                            </ul>
                                         </div>
-                                        <ul class="list-group list-group-flush">
-                                            <li class="list-group-item"><a href=""
-                                                    class="text-danger pull-right">移除</a>1 张三 <small
-                                                    class="text-muted">监理</small>
-                                                <p class="m-0 ml-2"><small
-                                                        class="text-muted">中交第一公路工程局有限公司国道311线满别公路施工一分部</small></p>
-                                            </li>
-                                            <li class="list-group-item"><a href=""
-                                                    class="text-danger pull-right">移除</a>2 王五 <small
-                                                    class="text-muted">监理</small>
-                                                <p class="m-0 ml-2"><small class="text-muted">XXX单位</small></p>
-                                            </li>
-                                            <li class="list-group-item"><a href=""
-                                                    class="text-danger pull-right">移除</a>3 李四 <small
-                                                    class="text-muted">监理</small>
-                                                <p class="m-0 ml-2"><small class="text-muted">XXX单位</small></p>
-                                            </li>
-                                        </ul>
-                                    </div>
-                                </td>
-                            </tr>
-                        </tbody>
-                    </table>
+                                    </td>
+                                </tr>
+                            </tbody>
+                        </table>
                     <% } else {%>
                     <table class="table table-bordered mt-3">
                         <thead>
@@ -177,22 +184,42 @@
                                 <td width="30%">
                                     <div class="card">
                                         <ul class="list-group list-group-flush">
-                                            <li class="list-group-item"><i
-                                                    class="fa fa fa-play-circle fa-rotate-90"></i> 布尔 <small
-                                                    class="text-muted">施工</small></li>
-                                            <li class="list-group-item"><i class="fa fa-chevron-circle-down"></i> 张三
-                                                <small class="text-muted">监理</small></li>
-                                            <li class="list-group-item"><i class="fa fa-chevron-circle-down"></i> 王五
-                                                <small class="text-muted">监理</small></li>
-                                            <li class="list-group-item"><i class="fa fa fa-stop-circle"></i> 李四 <small
-                                                    class="text-muted">监理</small></li>
+                                            <% auditors.forEach((item, idx) => { %>
+                                                <% if (idx === 0) { %>
+                                                    <li class="list-group-item" data-auditorId="<%- item.audit_id %>">
+                                                        <i class="fa fa fa-play-circle fa-rotate-90"></i> <%- item.name %>
+                                                        <small class="text-muted"><%- item.role %></small>
+                                                    </li>
+                                                <% } else if(idx === auditors.length -1 && idx !== 0) { %>
+                                                    <li class="list-group-item" data-auditorId="<%- item.audit_id %>">
+                                                        <i class="fa fa fa-stop-circle"></i> <%- item.name %>
+                                                        <small class="text-muted"><%- item.role %></small>
+                                                    </li>
+                                                <% } else {%>
+                                                    <li class="list-group-item" data-auditorId="<%- item.audit_id %>">
+                                                        <i class="fa fa-chevron-circle-down"></i> <%- item.name %>
+                                                        <small class="text-muted"><%- item.role %></small>
+                                                    </li>
+                                                <% } %>
+                                            <% }) %>
                                         </ul>
                                     </div>
                                 </td>
                                 <td width="70%">
                                     <div class="card mb-1">
                                         <ul class="list-group list-group-flush">
-                                            <li class="list-group-item">
+                                            <% auditHistory.forEach(auditors => { %>
+                                                <% auditors.forEach(auditor => { %>
+                                                    <li class="list-group-item">
+                                                        <span class="text-success pull-right">上报</span>
+                                                        <h5 class="card-title"><i
+                                                                class="fa fa-play-circle fa-rotate-90 text-success"></i> 布尔
+                                                            <small class="text-muted">施工</small></h5>
+                                                        <p class="card-text">2017-11-25</p>
+                                                    </li>
+                                                <% }) %>
+                                            <% }) %>
+                                            <!-- <li class="list-group-item">
                                                 <span class="text-success pull-right">上报</span>
                                                 <h5 class="card-title"><i
                                                         class="fa fa-play-circle fa-rotate-90 text-success"></i> 布尔
@@ -218,7 +245,7 @@
                                                 <h5 class="card-title"><i class="fa fa-stop-circle text-warning"></i> 李四
                                                     <small class="text-muted">监理</small></h5>
                                                 <p class="card-text">审批退回,审批意见文本。2017-11-27</p>
-                                            </li>
+                                            </li> -->
                                         </ul>
                                     </div>
                                     <div class="card mb-1">
@@ -268,6 +295,16 @@
     </div>
 </div>
 <script>
-    const accountGroup = JSON.parse('<%- JSON.stringify(accountGroup) %>');
-    const accountList = JSON.parse('<%- JSON.stringify(accountList) %>');
+    const auditConst = JSON.parse('<%- JSON.stringify(auditConst) %>');
+    const advance = JSON.parse('<%- JSON.stringify(advance) %>');
+    const prevAdvance = JSON.parse('<%- JSON.stringify(prevAdvance) %>');
+    const isEdited = JSON.parse('<%- isEdited %>');
+    const advancePayTotal = parseInt('<%- advancePayTotal %>');
 </script>
+<% if(isEdited) { %>
+    <script>
+        const accountGroup = JSON.parse('<%- JSON.stringify(accountGroup) %>');
+        const accountList = JSON.parse('<%- JSON.stringify(accountList) %>');
+    </script>
+<% } %>
+

+ 28 - 83
app/view/advance/index.ejs

@@ -5,21 +5,17 @@
             <div>
                 <div class="d-inline-block">
                     <div class="btn-group">
-                        <a class="btn btn-sm btn-light <%- type === 'start' ? 'active' : '' %>" href="/tender/<%- ctx.tender.id %>/advance">
-                            开工预付款(第3期)
+                        <a class="btn btn-sm btn-light <%- type === 0 ? 'active' : '' %>" href="/tender/<%- ctx.tender.id %>/advance">
+                            开工预付款<%- type === 0 && latestOrder ? `(第${latestOrder.order}期)` : '' %>
                         </a>
-                        <a class="btn btn-sm btn-light <%- type === 'material' ? 'active' : '' %>" href="/tender/<%- ctx.tender.id %>/advance/material">
-                            材料预付款(第5期)
+                        <a class="btn btn-sm btn-light <%- type === 1 ? 'active' : '' %>" href="/tender/<%- ctx.tender.id %>/advance/material">
+                            材料预付款<%- type === 1 && latestOrder ? `(第${latestOrder.order}期)` : '' %>
                         </a>
                     </div>
                 </div>
                 <div class="d-inline-block ml-2">
-                    <% if(type === 'start') { %>
-                        签约开工预付款:
-                    <% } else {%>
-                        签约材料预付款:
-                    <% } %>
-                    <b><%- advancePayTotal %></b> 元
+                    签约<%- type === 0 ? '开工' : '材料' %>预付款
+                    <b><%- ctx.helper.formatMoney(advancePayTotal) %></b> 元
                 </div>
                 <div class="d-inline-block ml-4" style="width:300px">
                     <div class="progress">
@@ -33,13 +29,15 @@
                 </div>
             </div>
             <div>
-                <a href="/tender/<%- ctx.tender.id %>/advance/<%- type %>/create" class="btn btn-primary btn-sm pull-right">开始新一期</a>
+                <% if(latestOrder.status === auditConst.status.checked) { %>
+                    <a id="advance_add" href="" class="btn btn-primary btn-sm pull-right">开始新一期</a>
+                <% } %>
             </div>
         </div>
     </div>
     <div class="content-wrap">
         <div class="c-body">
-            <div class="sjs-height-0">
+            <div class="sjs-height-0" >
                 <table class="table table-bordered">
                     <thead>
                         <tr>
@@ -53,77 +51,20 @@
                             <th class="text-center" width="100">操作</th>
                         </tr>
                     </thead>
-                    <tbody>
-                        <tr>
-                            <td><a href="yufukuan-qi-detail.html">第3期</a></td>
-                            <td>20%</td>
-                            <td class="text-right">30000.00</td>
-                            <td class="text-right">40000.00</td>
-                            <td class="text-right">70000.00</td>
-                            <td><a class="btn btn-sm" href="#file" data-toggle="modal" data-target="#file"><i
-                                        class="fa fa-paperclip "></i> 3</a></td>
-                            <td>待上报</td>
-                            <td><a href="yufukuan-qi-add.html" class="btn btn-primary btn-sm">编辑</a></td>
-                        </tr>
-                        <tr>
-                            <td><a href="yufukuan-qi-detail.html">第3期</a></td>
-                            <td>20%</td>
-                            <td class="text-right">30000.00</td>
-                            <td class="text-right">40000.00</td>
-                            <td class="text-right">70000.00</td>
-                            <td><a class="btn btn-sm" href="#file" data-toggle="modal" data-target="#file"><i
-                                        class="fa fa-paperclip "></i> 3</a></td>
-                            <td class="text-warning">审批退回</td>
-                            <td><a href="yufukuan-qi-add.html" class="btn btn-primary btn-sm">编辑</a></td>
-                        </tr>
-                        <tr>
-                            <td><a href="yufukuan-qi-detail.html">第3期</a></td>
-                            <td>20%</td>
-                            <td class="text-right">30000.00</td>
-                            <td class="text-right">40000.00</td>
-                            <td class="text-right">70000.00</td>
-                            <td><a class="btn btn-sm" href="#file" data-toggle="modal" data-target="#file"><i
-                                        class="fa fa-paperclip "></i> 3</a></td>
-                            <td class=" text-warning"><a href="#sp-list" data-toggle="modal"
-                                    data-target="#sp-list">张三</a> 审批中</td>
-                            <td><a href="yufukuan-qi-detail.html" class="btn btn-success btn-sm">审批</a></td>
-                        </tr>
-                        <tr>
-                            <td><a href="yufukuan-qi-detail.html">第3期</a></td>
-                            <td>20%</td>
-                            <td class="text-right">30000.00</td>
-                            <td class="text-right">40000.00</td>
-                            <td class="text-right">70000.00</td>
-                            <td><a class="btn btn-sm" href="#file" data-toggle="modal" data-target="#file"><i
-                                        class="fa fa-paperclip "></i> 3</a></td>
-                            <td class=" text-warning"><a href="#sp-list" data-toggle="modal"
-                                    data-target="#sp-list">张三</a> 审批中</td>
-                            <td class="text-warning">审批中</td>
-                        </tr>
-                        <tr>
-                            <td><a href="yufukuan-qi-detail.html">第2期</a></td>
-                            <td>20%</td>
-                            <td class="text-right">30000.00</td>
-                            <td class="text-right">40000.00</td>
-                            <td class="text-right">70000.00</td>
-                            <td><a class="btn btn-sm" href="#file" data-toggle="modal" data-target="#file"><i
-                                        class="fa fa-paperclip "></i> 3</a></td>
-                            <td class=" text-success"><a href="#sp-list" data-toggle="modal"
-                                    data-target="#sp-list">张三</a> 审批通过</td>
-                            <td class="text-success">审批通过</td>
-                        </tr>
-                        <tr>
-                            <td><a href="yufukuan-qi-detail.html">第1期</a></td>
-                            <td>20%</td>
-                            <td class="text-right">30000.00</td>
-                            <td class="text-right">40000.00</td>
-                            <td class="text-right">70000.00</td>
-                            <td><a class="btn btn-sm" href="#file" data-toggle="modal" data-target="#file"><i
-                                        class="fa fa-paperclip "></i> 3</a></td>
-                            <td class=" text-success"><a href="#sp-list" data-toggle="modal"
-                                    data-target="#sp-list">张三</a> 审批通过</td>
-                            <td class="text-success">审批通过</td>
-                        </tr>
+                    <tbody id="advanceList">
+                        <% advanceList.forEach(item => { %>
+                            <tr>
+                                <td><a href="/tender/<%- ctx.tender.id %>/advance/<%- item.id %>/detail" data-id="<%- item.id %>">第<%- item.order %>期</a></td>
+                                <td><%- item.pay_ratio || 0%>%</td>
+                                <td class="text-right"><%- item.cur_amount%></td>
+                                <td class="text-right"><%- item.prev_amount%></td>
+                                <td class="text-right"><%- item.prev_total_amount%></td>
+                                <td><a class="btn btn-sm" href="#file" data-toggle="modal" data-target="#file"><i
+                                            class="fa fa-paperclip "></i> 3</a></td>
+                                <td><%- auditConst.statusString[item.status]%></td>
+                                <td><a href="/tender/<%- ctx.tender.id %>/advance/<%- item.id %>/detail" class="btn btn-primary btn-sm">编辑</a></td>
+                            </tr>
+                        <% }) %>
                     </tbody>
                 </table>
             </div>
@@ -131,3 +72,7 @@
     </div>
 </div>
 </div>
+<script>
+    const type = parseInt('<%- type %>');
+    const auditConst = JSON.parse('<%- JSON.stringify(auditConst) %>');
+</script>

+ 7 - 152
app/view/advance/modal.ejs

@@ -1,58 +1,4 @@
-<!--弹出添加期-->
-<div class="modal fade" id="add-qi" data-backdrop="static">
-    <div class="modal-dialog" role="document">
-        <div class="modal-content">
-            <div class="modal-header">
-                <h5 class="modal-title">添加新一期</h5>
-            </div>
-            <div class="modal-body">
-                <div class="form-group">
-                    <label>调差期</label>
-                    <input class="form-control" value="第 6 期" type="text" readonly="">
-                </div>
-                <div class="form-group">
-                    <label>本期调差,包含计量期<span class="ml-2 text-danger">第<b class="mx-2">9,10</b>期</span></label>
-                    <div class="row">
-                        <div class="col-4">
-                            <div class="custom-control custom-checkbox">
-                                <input type="checkbox" class="custom-control-input" id="customCheck9" checked="">
-                                <label class="custom-control-label" for="customCheck9">第9期</label>
-                            </div>
-                        </div>
-                        <div class="col-4">
-                            <div class="custom-control custom-checkbox">
-                                <input type="checkbox" class="custom-control-input" id="customCheck10">
-                                <label class="custom-control-label" for="customCheck10">第10期</label>
-                            </div>
-                        </div>
-                        <div class="col-4">
-                            <div class="custom-control custom-checkbox">
-                                <input type="checkbox" class="custom-control-input" id="customCheck11">
-                                <label class="custom-control-label" for="customCheck11">第11期</label>
-                            </div>
-                        </div>
-                        <div class="col-4">
-                            <div class="custom-control custom-checkbox">
-                                <input type="checkbox" class="custom-control-input" id="customCheck12">
-                                <label class="custom-control-label" for="customCheck12">第12期</label>
-                            </div>
-                        </div>
-                        <div class="col-4">
-                            <div class="custom-control custom-checkbox">
-                                <input type="checkbox" class="custom-control-input" id="customCheck3">
-                                <label class="custom-control-label" for="customCheck3">第13期</label>
-                            </div>
-                        </div>
-                    </div>
-                </div>
-            </div>
-            <div class="modal-footer">
-                <button type="button" class="btn btn-secondary" data-dismiss="modal">关闭</button>
-                <button type="button" class="btn btn-primary">确定添加</button>
-            </div>
-        </div>
-    </div>
-</div>
+
 <!--附件-->
 <div class="modal fade" id="file" data-backdrop="static">
     <div class="modal-dialog" role="document">
@@ -73,12 +19,16 @@
                         <tr>
                             <td>XXXX.jpg</td>
                             <td>2018-01-01</td>
-                            <td><a href="#" target="_blank" title="下载"><i class="fa fa-download "></i></a></td>
+                            <td>
+                                <a href="#" target="_blank" title="下载"><i class="fa fa-download"></i></a>
+                            </td>
                         </tr>
                         <tr>
                             <td>YYYY.jpg</td>
                             <td>2018-01-01</td>
-                            <td><a href="#" target="_blank" title="下载"><i class="fa fa-download "></i></a></td>
+                            <td>
+                                <a href="#" target="_blank" title="下载"><i class="fa fa-download"></i></a>
+                            </td>
                         </tr>
                     </table>
                 </div>
@@ -90,98 +40,3 @@
         </div>
     </div>
 </div>
-<!--审批流程/结果-->
-<div class="modal fade" id="sp-list" data-backdrop="static">
-    <div class="modal-dialog modal-lg" role="document">
-        <div class="modal-content">
-            <div class="modal-header">
-                <h5 class="modal-title">审批流程</h5>
-            </div>
-            <div class="modal-body">
-                <div class="row">
-                    <div class="col-4">
-                        <div class="card mt-3">
-                            <ul class="list-group list-group-flush">
-                                <li class="list-group-item"><i class="fa fa fa-play-circle fa-rotate-90"></i> 布尔 <small
-                                        class="text-muted">施工</small></li>
-                                <li class="list-group-item"><i class="fa fa-chevron-circle-down"></i> 张三 <small
-                                        class="text-muted">监理</small></li>
-                                <li class="list-group-item"><i class="fa fa-chevron-circle-down"></i> 王五 <small
-                                        class="text-muted">监理</small></li>
-                                <li class="list-group-item"><i class="fa fa fa-stop-circle"></i> 李四 <small
-                                        class="text-muted">监理</small></li>
-                            </ul>
-                        </div>
-                    </div>
-                    <div class="col-8 modal-height-500" style="overflow: auto">
-                        <div class="card mt-3">
-                            <ul class="list-group list-group-flush">
-                                <li class="list-group-item">
-                                    <span class="text-success pull-right">上报</span>
-                                    <h5 class="card-title"><i class="fa fa-play-circle fa-rotate-90 text-success"></i>
-                                        布尔 <small class="text-muted">施工</small></h5>
-                                    <p class="card-text">2017-11-25</p>
-                                </li>
-                                <li class="list-group-item">
-                                    <span class="text-success pull-right">审批通过</span>
-                                    <h5 class="card-title"><i class="fa fa-chevron-circle-down text-success"></i> 张三
-                                        <small class="text-muted">监理</small></h5>
-                                    <p class="card-text">审批意见。2017-11-25</p>
-                                </li>
-                                <li class="list-group-item">
-                                    <span class="text-success pull-right">审批通过</span>
-                                    <h5 class="card-title"><i class="fa fa-chevron-circle-down text-success"></i> 王五
-                                        <small class="text-muted">监理</small></h5>
-                                    <p class="card-text">审批通过。2017-11-26</p>
-                                </li>
-                                <li class="list-group-item">
-                                    <span class="text-warning pull-right">审批退回 布尔</span>
-                                    <h5 class="card-title"><i class="fa fa-stop-circle text-warning"></i> 李四 <small
-                                            class="text-muted">监理</small></h5>
-                                    <p class="card-text">审批退回,审批意见文本。2017-11-27</p>
-                                </li>
-                            </ul>
-                        </div>
-                        <!--退回原报重新上报-->
-                        <div class="card mt-3">
-                            <ul class="list-group list-group-flush">
-                                <li class="list-group-item">
-                                    <span class="text-success pull-right">重新上报</span>
-                                    <h5 class="card-title"><i class="fa fa-play-circle fa-rotate-90 text-success"></i>
-                                        布尔 <small class="text-muted">施工</small></h5>
-                                    <p class="card-text">2017-12-01</p>
-                                </li>
-                                <li class="list-group-item">
-                                    <span class="text-success pull-right">审批通过</span>
-                                    <h5 class="card-title"><i class="fa fa-chevron-circle-down text-success"></i> 张三
-                                        <small class="text-muted">监理</small></h5>
-                                    <p class="card-text">审批通过 2017-12-02</p>
-                                </li>
-                                <li class="list-group-item">
-                                    <span class="text-warning pull-right">审批退回 张三</span>
-                                    <h5 class="card-title"><i class="fa fa-chevron-circle-down text-warning"></i> 王五
-                                        <small class="text-muted">监理</small></h5>
-                                    <p class="card-text">审批退回 2017-12-02</p>
-                                </li>
-                                <!--王五退回上一审批人 张三,张三重新审批-->
-                                <li class="list-group-item">
-                                    <span class="pull-right">审批中</span>
-                                    <h5 class="card-title"><i class="fa fa-chevron-circle-down"></i> 张三 <small
-                                            class="text-muted">监理</small></h5>
-                                    <p class="card-text"></p>
-                                </li>
-                                <li class="list-group-item">
-                                    <h5 class="card-title"><i class="fa fa-stop-circle"></i> 李四 <small
-                                            class="text-muted">监理</small></h5>
-                                </li>
-                            </ul>
-                        </div>
-                    </div>
-                </div>
-            </div>
-            <div class="modal-footer">
-                <button type="button" class="btn btn-secondary" data-dismiss="modal">关闭</button>
-            </div>
-        </div>
-    </div>
-</div>

+ 153 - 0
app/view/advance/modal_audit.ejs

@@ -0,0 +1,153 @@
+<!--上报审批-->
+<div class="modal fade" id="sub-sp" data-backdrop="static">
+    <div class="modal-dialog" role="document">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="modal-title">上报审批</h5>
+            </div>
+            <div class="modal-body">
+                <h5 id="tm-success" style="display: none;">确认上报第<%- advance.order %>期<%- advance.type === 0 ? '开工' : '材料' %>预付款?</h5>
+                <h5 id="tm-fail" class="text-danger">无法上报,请设置审批流程。</h5>
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-sm btn-secondary" data-dismiss="modal">关闭</button>
+                <!--可以上报显示 确认上报 按钮-->
+                <button id="tm-submit" style="display: none;" type="button" class="btn btn-sm btn-primary">确认上报</button>
+            </div>
+        </div>
+    </div>
+</div>
+<!--审批流程/结果-->
+<div class="modal fade" id="sp-list" data-backdrop="static">
+    <div class="modal-dialog modal-lg" role="document">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="modal-title">审批流程</h5>
+            </div>
+            <div class="modal-body">
+                <div class="row">
+                    <div class="col-4">
+                        <div class="card mt-3">
+                            <ul class="list-group list-group-flush">
+                                <li class="list-group-item">
+                                    <i class="fa fa fa-play-circle fa-rotate-90"></i>
+                                    布尔
+                                    <small class="text-muted">施工</small>
+                                </li>
+                                <li class="list-group-item">
+                                    <i class="fa fa-chevron-circle-down"></i>
+                                    张三
+                                    <small class="text-muted">监理</small>
+                                </li>
+                                <li class="list-group-item">
+                                    <i class="fa fa-chevron-circle-down"></i>
+                                    王五
+                                    <small class="text-muted">监理</small>
+                                </li>
+                                <li class="list-group-item">
+                                    <i class="fa fa fa-stop-circle"></i>
+                                    李四
+                                    <small class="text-muted">监理</small>
+                                </li>
+                            </ul>
+                        </div>
+                    </div>
+                    <div class="col-8 modal-height-500" style="overflow: auto;">
+                        <div class="card mt-3">
+                            <ul class="list-group list-group-flush">
+                                <li class="list-group-item">
+                                    <span class="text-success pull-right">上报</span>
+                                    <h5 class="card-title">
+                                        <i class="fa fa-play-circle fa-rotate-90 text-success"></i>
+                                        布尔
+                                        <small class="text-muted">施工</small>
+                                    </h5>
+                                    <p class="card-text">2017-11-25</p>
+                                </li>
+                                <li class="list-group-item">
+                                    <span class="text-success pull-right">审批通过</span>
+                                    <h5 class="card-title">
+                                        <i class="fa fa-chevron-circle-down text-success"></i>
+                                        张三
+                                        <small class="text-muted">监理</small>
+                                    </h5>
+                                    <p class="card-text">审批意见。2017-11-25</p>
+                                </li>
+                                <li class="list-group-item">
+                                    <span class="text-success pull-right">审批通过</span>
+                                    <h5 class="card-title">
+                                        <i class="fa fa-chevron-circle-down text-success"></i>
+                                        王五
+                                        <small class="text-muted">监理</small>
+                                    </h5>
+                                    <p class="card-text">审批通过。2017-11-26</p>
+                                </li>
+                                <li class="list-group-item">
+                                    <span class="text-warning pull-right">审批退回 布尔</span>
+                                    <h5 class="card-title">
+                                        <i class="fa fa-stop-circle text-warning"></i>
+                                        李四
+                                        <small class="text-muted">监理</small>
+                                    </h5>
+                                    <p class="card-text">审批退回,审批意见文本。2017-11-27</p>
+                                </li>
+                            </ul>
+                        </div>
+                        <!--退回原报重新上报-->
+                        <div class="card mt-3">
+                            <ul class="list-group list-group-flush">
+                                <li class="list-group-item">
+                                    <span class="text-success pull-right">重新上报</span>
+                                    <h5 class="card-title">
+                                        <i class="fa fa-play-circle fa-rotate-90 text-success"></i>
+                                        布尔
+                                        <small class="text-muted">施工</small>
+                                    </h5>
+                                    <p class="card-text">2017-12-01</p>
+                                </li>
+                                <li class="list-group-item">
+                                    <span class="text-success pull-right">审批通过</span>
+                                    <h5 class="card-title">
+                                        <i class="fa fa-chevron-circle-down text-success"></i>
+                                        张三
+                                        <small class="text-muted">监理</small>
+                                    </h5>
+                                    <p class="card-text">审批通过 2017-12-02</p>
+                                </li>
+                                <li class="list-group-item">
+                                    <span class="text-warning pull-right">审批退回 张三</span>
+                                    <h5 class="card-title">
+                                        <i class="fa fa-chevron-circle-down text-warning"></i>
+                                        王五
+                                        <small class="text-muted">监理</small>
+                                    </h5>
+                                    <p class="card-text">审批退回 2017-12-02</p>
+                                </li>
+                                <!--王五退回上一审批人 张三,张三重新审批-->
+                                <li class="list-group-item">
+                                    <span class="pull-right">审批中</span>
+                                    <h5 class="card-title">
+                                        <i class="fa fa-chevron-circle-down"></i>
+                                        张三
+                                        <small class="text-muted">监理</small>
+                                    </h5>
+                                    <p class="card-text"></p>
+                                </li>
+                                <li class="list-group-item">
+                                    <h5 class="card-title">
+                                        <i class="fa fa-stop-circle"></i>
+                                        李四
+                                        <small class="text-muted">监理</small>
+                                    </h5>
+                                </li>
+                            </ul>
+                        </div>
+                    </div>
+                </div>
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-secondary" data-dismiss="modal">关闭</button>
+            </div>
+        </div>
+    </div>
+</div>

+ 127 - 194
config/web.js

@@ -1,4 +1,4 @@
-'use strict';
+'use strict'
 
 /**
  * 前端所需js
@@ -49,85 +49,63 @@ const JsFiles = {
         '/public/js/lz-string/lz-string.js',
         '/public/js/number-precision.js',
         '/public/js/toastr.min.js',
-        '/public/js/global.js',
+        '/public/js/global.js'
     ],
     controller: {
         tender: {
             list: {
-                files: [
-                    '/public/js/ztree/jquery.ztree.core.js',
-                    '/public/js/ztree/jquery.ztree.exedit.js',
-                    '/public/js/decimal.min.js',
-                    '/public/js/moment/moment.min.js',
-                ],
+                files: ['/public/js/ztree/jquery.ztree.core.js', '/public/js/ztree/jquery.ztree.exedit.js', '/public/js/decimal.min.js', '/public/js/moment/moment.min.js'],
                 mergeFiles: [
                     '/public/js/zh_calc.js',
                     '/public/js/PinYinOrder.bundle.js',
                     '/public/js/shares/tender_list_order.js',
                     '/public/js/tender_showhide.js',
-                    '/public/js/tender_list.js',
+                    '/public/js/tender_list.js'
                 ],
-                mergeFile: 'tender_list',
+                mergeFile: 'tender_list'
             },
             info: {
-                files: [
-                    '/public/js/ztree/jquery.ztree.core.js',
-                    '/public/js/ztree/jquery.ztree.exedit.js',
-                    '/public/js/decimal.min.js',
-                ],
+                files: ['/public/js/ztree/jquery.ztree.core.js', '/public/js/ztree/jquery.ztree.exedit.js', '/public/js/decimal.min.js'],
                 mergeFiles: [
                     '/public/js/zh_calc.js',
                     '/public/js/PinYinOrder.bundle.js',
                     '/public/js/shares/tender_list_order.js',
                     '/public/js/tender_showhide.js',
-                    '/public/js/tender_list_info.js',
+                    '/public/js/tender_list_info.js'
                 ],
-                mergeFile: 'tender_list_info',
+                mergeFile: 'tender_list_info'
             },
             progress: {
-                files: [
-                    '/public/js/ztree/jquery.ztree.core.js',
-                    '/public/js/ztree/jquery.ztree.exedit.js',
-                    '/public/js/decimal.min.js',
-                ],
+                files: ['/public/js/ztree/jquery.ztree.core.js', '/public/js/ztree/jquery.ztree.exedit.js', '/public/js/decimal.min.js'],
                 mergeFiles: [
                     '/public/js/zh_calc.js',
                     '/public/js/PinYinOrder.bundle.js',
                     '/public/js/shares/tender_list_order.js',
                     '/public/js/tender_showhide.js',
-                    '/public/js/tender_list_progress.js',
+                    '/public/js/tender_list_progress.js'
                 ],
-                mergeFile: 'tender_list_progress',
+                mergeFile: 'tender_list_progress'
             },
             manage: {
-                files: [
-                    '/public/js/ztree/jquery.ztree.core.js',
-                    '/public/js/ztree/jquery.ztree.exedit.js',
-                    '/public/js/moment/moment.min.js',
-                    '/public/js/decimal.min.js',
-                ],
+                files: ['/public/js/ztree/jquery.ztree.core.js', '/public/js/ztree/jquery.ztree.exedit.js', '/public/js/moment/moment.min.js', '/public/js/decimal.min.js'],
                 mergeFiles: [
                     '/public/js/zh_calc.js',
                     '/public/js/PinYinOrder.bundle.js',
                     '/public/js/shares/tender_list_order.js',
                     '/public/js/tender_showhide.js',
-                    '/public/js/tender_list_manage.js',
+                    '/public/js/tender_list_manage.js'
                 ],
-                mergeFile: 'tender_list_manage',
+                mergeFile: 'tender_list_manage'
             },
             tenderInfo: {
-                files: [
-                    '/public/js/echarts/echarts.min.js',
-                    '/public/js/spreadjs/sheets/v11/gc.spread.sheets.all.11.2.2.min.js',
-                    '/public/js/decimal.min.js',
-                ],
+                files: ['/public/js/echarts/echarts.min.js', '/public/js/spreadjs/sheets/v11/gc.spread.sheets.all.11.2.2.min.js', '/public/js/decimal.min.js'],
                 mergeFiles: [
                     '/public/js/spreadjs_rela/spreadjs_zh.js',
-                    '/public/js/zh_calc.js',
+                    '/public/js/zh_calc.js'
                     // "/public/js/tender.js",
                 ],
-                mergeFile: 'tender',
-            },
+                mergeFile: 'tender'
+            }
         },
         ledger: {
             explode: {
@@ -139,7 +117,7 @@ const JsFiles = {
                     '/public/js/decimal.min.js',
                     '/public/js/math.min.js',
                     '/public/js/file-saver/FileSaver.js',
-                    '/public/js/shares/export_excel.js',
+                    '/public/js/shares/export_excel.js'
                 ],
                 mergeFiles: [
                     '/public/js/sub_menu.js',
@@ -152,15 +130,12 @@ const JsFiles = {
                     '/public/js/path_tree.js',
                     '/public/js/ledger_tree_col.js',
                     '/public/js/std_lib.js',
-                    '/public/js/ledger.js',
+                    '/public/js/ledger.js'
                 ],
-                mergeFile: 'explode',
+                mergeFile: 'explode'
             },
             audit: {
-                files: [
-                    '/public/js/spreadjs/sheets/v11/gc.spread.sheets.all.11.2.2.min.js',
-                    '/public/js/decimal.min.js',
-                ],
+                files: ['/public/js/spreadjs/sheets/v11/gc.spread.sheets.all.11.2.2.min.js', '/public/js/decimal.min.js'],
                 mergeFiles: [
                     '/public/js/sub_menu.js',
                     '/public/js/div_resizer.js',
@@ -169,9 +144,9 @@ const JsFiles = {
                     '/public/js/shares/cs_tools.js',
                     '/public/js/zh_calc.js',
                     '/public/js/path_tree.js',
-                    '/public/js/ledger_audit.js',
+                    '/public/js/ledger_audit.js'
                 ],
-                mergeFile: 'ledger_audit',
+                mergeFile: 'ledger_audit'
             },
             bwtz: {
                 files: [
@@ -179,7 +154,7 @@ const JsFiles = {
                     '/public/js/spreadjs/sheets/v11/interop/gc.spread.excelio.11.2.2.min.js',
                     '/public/js/decimal.min.js',
                     '/public/js/file-saver/FileSaver.js',
-                    '/public/js/shares/export_excel.js',
+                    '/public/js/shares/export_excel.js'
                 ],
                 mergeFiles: [
                     '/public/js/sub_menu.js',
@@ -190,9 +165,9 @@ const JsFiles = {
                     '/public/js/zh_calc.js',
                     '/public/js/path_tree.js',
                     '/public/js/shares/bills_pos_convert.js',
-                    '/public/js/ledger_bwtz.js',
+                    '/public/js/ledger_bwtz.js'
                 ],
-                mergeFile: 'ledger_bwtz',
+                mergeFile: 'ledger_bwtz'
             },
             gather: {
                 files: [
@@ -200,7 +175,7 @@ const JsFiles = {
                     '/public/js/spreadjs/sheets/v11/interop/gc.spread.excelio.11.2.2.min.js',
                     '/public/js/decimal.min.js',
                     '/public/js/file-saver/FileSaver.js',
-                    '/public/js/shares/export_excel.js',
+                    '/public/js/shares/export_excel.js'
                 ],
                 mergeFiles: [
                     '/public/js/sub_menu.js',
@@ -210,15 +185,12 @@ const JsFiles = {
                     '/public/js/zh_calc.js',
                     '/public/js/path_tree.js',
                     '/public/js/gcl_gather.js',
-                    '/public/js/ledger_gather.js',
+                    '/public/js/ledger_gather.js'
                 ],
-                mergeFile: 'ledger_gather',
+                mergeFile: 'ledger_gather'
             },
             revise: {
-                files: [
-                    '/public/js/spreadjs/sheets/v11/gc.spread.sheets.all.11.2.2.min.js',
-                    '/public/js/decimal.min.js',
-                ],
+                files: ['/public/js/spreadjs/sheets/v11/gc.spread.sheets.all.11.2.2.min.js', '/public/js/decimal.min.js'],
                 mergeFiles: [
                     '/public/js/sub_menu.js',
                     '/public/js/div_resizer.js',
@@ -227,10 +199,10 @@ const JsFiles = {
                     '/public/js/zh_calc.js',
                     '/public/js/path_tree.js',
                     '/public/js/std_lib.js',
-                    '/public/js/revise.js',
+                    '/public/js/revise.js'
                 ],
-                mergeFile: 'revise',
-            },
+                mergeFile: 'revise'
+            }
         },
         revise: {
             info: {
@@ -239,7 +211,7 @@ const JsFiles = {
                     '/public/js/js-xlsx/xlsx.utils.js',
                     '/public/js/spreadjs/sheets/v11/gc.spread.sheets.all.11.2.2.min.js',
                     '/public/js/decimal.min.js',
-                    '/public/js/math.min.js',
+                    '/public/js/math.min.js'
                 ],
                 mergeFiles: [
                     '/public/js/sub_menu.js',
@@ -251,15 +223,12 @@ const JsFiles = {
                     '/public/js/zh_calc.js',
                     '/public/js/path_tree.js',
                     '/public/js/std_lib.js',
-                    '/public/js/revise.js',
+                    '/public/js/revise.js'
                 ],
-                mergeFile: 'revise',
+                mergeFile: 'revise'
             },
             history: {
-                files: [
-                    '/public/js/spreadjs/sheets/v11/gc.spread.sheets.all.11.2.2.min.js',
-                    '/public/js/decimal.min.js',
-                ],
+                files: ['/public/js/spreadjs/sheets/v11/gc.spread.sheets.all.11.2.2.min.js', '/public/js/decimal.min.js'],
                 mergeFiles: [
                     '/public/js/sub_menu.js',
                     '/public/js/div_resizer.js',
@@ -268,10 +237,10 @@ const JsFiles = {
                     '/public/js/shares/cs_tools.js',
                     '/public/js/zh_calc.js',
                     '/public/js/path_tree.js',
-                    '/public/js/revise_history.js',
+                    '/public/js/revise_history.js'
                 ],
-                mergeFile: 'revise_history',
-            },
+                mergeFile: 'revise_history'
+            }
         },
         stage: {
             // 本期计量台账
@@ -281,7 +250,7 @@ const JsFiles = {
                     '/public/js/spreadjs/sheets/v11/interop/gc.spread.excelio.11.2.2.min.js',
                     '/public/js/decimal.min.js',
                     '/public/js/math.min.js',
-                    '/public/js/file-saver/FileSaver.js',
+                    '/public/js/file-saver/FileSaver.js'
                 ],
                 mergeFiles: [
                     '/public/js/sub_menu.js',
@@ -296,16 +265,16 @@ const JsFiles = {
                     '/public/js/path_tree.js',
                     '/public/js/stage_im.js',
                     '/public/js/stage.js',
-                    '/public/js/stage_audit.js',
+                    '/public/js/stage_audit.js'
                 ],
-                mergeFile: 'stage',
+                mergeFile: 'stage'
             },
             detail: {
                 files: [
                     '/public/js/spreadjs/sheets/v11/gc.spread.sheets.all.11.2.2.min.js',
                     '/public/js/decimal.min.js',
                     '/public/js/html2canvas/html2canvas.min.js',
-                    '/public/js/html2canvas/canvas2image.js',
+                    '/public/js/html2canvas/canvas2image.js'
                 ],
                 mergeFiles: [
                     '/public/js/sub_menu.js',
@@ -315,24 +284,21 @@ const JsFiles = {
                     '/public/js/shares/cs_tools.js',
                     '/public/js/stage_im.js',
                     '/public/js/stage_detail.js',
-                    '/public/js/stage_audit.js',
+                    '/public/js/stage_audit.js'
                 ],
-                mergeFile: 'stage_detail',
+                mergeFile: 'stage_detail'
             },
             pay: {
-                files: [
-                    '/public/js/spreadjs/sheets/v11/gc.spread.sheets.all.11.2.2.min.js',
-                    '/public/js/math.min.js',
-                ],
+                files: ['/public/js/spreadjs/sheets/v11/gc.spread.sheets.all.11.2.2.min.js', '/public/js/math.min.js'],
                 mergeFiles: [
                     '/public/js/sub_menu.js',
                     '/public/js/spreadjs_rela/spreadjs_zh.js',
                     '/public/js/shares/sjs_setting.js',
                     '/public/js/shares/cs_tools.js',
                     '/public/js/stage_pay.js',
-                    '/public/js/stage_audit.js',
+                    '/public/js/stage_audit.js'
                 ],
-                mergeFile: 'stage_pay',
+                mergeFile: 'stage_pay'
             },
             bwtz: {
                 files: [
@@ -340,7 +306,7 @@ const JsFiles = {
                     '/public/js/spreadjs/sheets/v11/interop/gc.spread.excelio.11.2.2.min.js',
                     '/public/js/decimal.min.js',
                     '/public/js/file-saver/FileSaver.js',
-                    '/public/js/shares/export_excel.js',
+                    '/public/js/shares/export_excel.js'
                 ],
                 mergeFiles: [
                     '/public/js/sub_menu.js',
@@ -352,15 +318,12 @@ const JsFiles = {
                     '/public/js/path_tree.js',
                     '/public/js/shares/bills_pos_convert.js',
                     '/public/js/stage_bwtz.js',
-                    '/public/js/stage_audit.js',
+                    '/public/js/stage_audit.js'
                 ],
-                mergeFile: 'stage_bwtz',
+                mergeFile: 'stage_bwtz'
             },
             change: {
-                files: [
-                    '/public/js/spreadjs/sheets/v11/gc.spread.sheets.all.11.2.2.min.js',
-                    '/public/js/decimal.min.js',
-                ],
+                files: ['/public/js/spreadjs/sheets/v11/gc.spread.sheets.all.11.2.2.min.js', '/public/js/decimal.min.js'],
                 mergeFiles: [
                     '/public/js/sub_menu.js',
                     '/public/js/div_resizer.js',
@@ -369,9 +332,9 @@ const JsFiles = {
                     '/public/js/zh_calc.js',
                     '/public/js/path_tree.js',
                     '/public/js/stage_change.js',
-                    '/public/js/stage_audit.js',
+                    '/public/js/stage_audit.js'
                 ],
-                mergeFile: 'stage_change',
+                mergeFile: 'stage_change'
             },
             gather: {
                 files: [
@@ -379,7 +342,7 @@ const JsFiles = {
                     '/public/js/spreadjs/sheets/v11/interop/gc.spread.excelio.11.2.2.min.js',
                     '/public/js/decimal.min.js',
                     '/public/js/file-saver/FileSaver.js',
-                    '/public/js/shares/export_excel.js',
+                    '/public/js/shares/export_excel.js'
                 ],
                 mergeFiles: [
                     '/public/js/sub_menu.js',
@@ -391,9 +354,9 @@ const JsFiles = {
                     '/public/js/path_tree.js',
                     '/public/js/gcl_gather.js',
                     '/public/js/stage_gather.js',
-                    '/public/js/stage_audit.js',
+                    '/public/js/stage_audit.js'
                 ],
-                mergeFile: 'stage_gather',
+                mergeFile: 'stage_gather'
             },
             compare: {
                 files: [
@@ -401,7 +364,7 @@ const JsFiles = {
                     '/public/js/spreadjs/sheets/v11/interop/gc.spread.excelio.11.2.2.min.js',
                     '/public/js/decimal.min.js',
                     '/public/js/file-saver/FileSaver.js',
-                    '/public/js/shares/export_excel.js',
+                    '/public/js/shares/export_excel.js'
                 ],
                 mergeFiles: [
                     '/public/js/sub_menu.js',
@@ -412,23 +375,15 @@ const JsFiles = {
                     '/public/js/zh_calc.js',
                     '/public/js/path_tree.js',
                     '/public/js/stage_compare.js',
-                    '/public/js/stage_audit.js',
+                    '/public/js/stage_audit.js'
                 ],
-                mergeFile: 'stage_compare',
+                mergeFile: 'stage_compare'
             },
             manager: {
-                files: [
-                    '/public/js/decimal.min.js',
-                ],
-                mergeFiles: [
-                    '/public/js/sub_menu.js',
-                    '/public/js/div_resizer.js',
-                    '/public/js/shares/cs_tools.js',
-                    '/public/js/zh_calc.js',
-                    '/public/js/stage_audit.js',
-                ],
-                mergeFile: 'stage_manager',
-            },
+                files: ['/public/js/decimal.min.js'],
+                mergeFiles: ['/public/js/sub_menu.js', '/public/js/div_resizer.js', '/public/js/shares/cs_tools.js', '/public/js/zh_calc.js', '/public/js/stage_audit.js'],
+                mergeFile: 'stage_manager'
+            }
         },
         stageExtra: {
             jgcl: {
@@ -437,16 +392,16 @@ const JsFiles = {
                     '/public/js/spreadjs/sheets/v11/interop/gc.spread.excelio.11.2.2.min.js',
                     '/public/js/decimal.min.js',
                     '/public/js/file-saver/FileSaver.js',
-                    '/public/js/shares/export_excel.js',
+                    '/public/js/shares/export_excel.js'
                 ],
                 mergeFiles: [
                     '/public/js/sub_menu.js',
                     '/public/js/spreadjs_rela/spreadjs_zh.js',
                     '/public/js/shares/sjs_setting.js',
                     '/public/js/zh_calc.js',
-                    '/public/js/se_jgcl.js',
+                    '/public/js/se_jgcl.js'
                 ],
-                mergeFile: 'se_jgcl',
+                mergeFile: 'se_jgcl'
             },
             bonus: {
                 files: [
@@ -456,16 +411,16 @@ const JsFiles = {
                     '/public/js/datepicker/datepicker.min.js',
                     '/public/js/datepicker/datepicker.zh.js',
                     '/public/js/file-saver/FileSaver.js',
-                    '/public/js/shares/export_excel.js',
+                    '/public/js/shares/export_excel.js'
                 ],
                 mergeFiles: [
                     '/public/js/sub_menu.js',
                     '/public/js/spreadjs_rela/spreadjs_zh.js',
                     '/public/js/shares/sjs_setting.js',
                     '/public/js/zh_calc.js',
-                    '/public/js/se_bonus.js',
+                    '/public/js/se_bonus.js'
                 ],
-                mergeFile: 'se_bonus',
+                mergeFile: 'se_bonus'
             },
             other: {
                 files: [
@@ -475,7 +430,7 @@ const JsFiles = {
                     '/public/js/datepicker/datepicker.min.js',
                     '/public/js/datepicker/datepicker.zh.js',
                     '/public/js/file-saver/FileSaver.js',
-                    '/public/js/shares/export_excel.js',
+                    '/public/js/shares/export_excel.js'
                 ],
                 mergeFiles: [
                     '/public/js/sub_menu.js',
@@ -484,10 +439,10 @@ const JsFiles = {
                     '/public/js/shares/sjs_setting.js',
                     '/public/js/zh_calc.js',
                     '/public/js/path_tree.js',
-                    '/public/js/se_other.js',
+                    '/public/js/se_other.js'
                 ],
-                mergeFile: 'se_other',
-            },
+                mergeFile: 'se_other'
+            }
         },
         measure: {
             compare: {
@@ -496,7 +451,7 @@ const JsFiles = {
                     '/public/js/spreadjs/sheets/v11/interop/gc.spread.excelio.11.2.2.min.js',
                     '/public/js/decimal.min.js',
                     '/public/js/file-saver/FileSaver.js',
-                    '/public/js/shares/export_excel.js',
+                    '/public/js/shares/export_excel.js'
                 ],
                 mergeFiles: [
                     '/public/js/sub_menu.js',
@@ -505,18 +460,14 @@ const JsFiles = {
                     '/public/js/shares/sjs_setting.js',
                     '/public/js/zh_calc.js',
                     '/public/js/path_tree.js',
-                    '/public/js/measure_compare.js',
+                    '/public/js/measure_compare.js'
                 ],
-                mergeFile: 'measure_compare',
-            },
+                mergeFile: 'measure_compare'
+            }
         },
         material: {
             info: {
-                files: [
-                    '/public/js/spreadjs/sheets/v11/gc.spread.sheets.all.11.2.2.min.js',
-                    '/public/js/decimal.min.js',
-                    '/public/js/toastr.min.js',
-                ],
+                files: ['/public/js/spreadjs/sheets/v11/gc.spread.sheets.all.11.2.2.min.js', '/public/js/decimal.min.js', '/public/js/toastr.min.js'],
                 mergeFiles: [
                     '/public/js/sub_menu.js',
                     '/public/js/div_resizer.js',
@@ -524,16 +475,12 @@ const JsFiles = {
                     '/public/js/zh_calc.js',
                     '/public/js/path_tree.js',
                     '/public/js/material.js',
-                    '/public/js/material_audit.js',
+                    '/public/js/material_audit.js'
                 ],
-                mergeFile: 'material',
+                mergeFile: 'material'
             },
             list: {
-                files: [
-                    '/public/js/spreadjs/sheets/v11/gc.spread.sheets.all.11.2.2.min.js',
-                    '/public/js/decimal.min.js',
-                    '/public/js/toastr.min.js',
-                ],
+                files: ['/public/js/spreadjs/sheets/v11/gc.spread.sheets.all.11.2.2.min.js', '/public/js/decimal.min.js', '/public/js/toastr.min.js'],
                 mergeFiles: [
                     '/public/js/sub_menu.js',
                     '/public/js/div_resizer.js',
@@ -542,28 +489,19 @@ const JsFiles = {
                     '/public/js/path_tree.js',
                     '/public/js/gcl_gather.js',
                     '/public/js/material_list.js',
-                    '/public/js/material_audit.js',
+                    '/public/js/material_audit.js'
                 ],
-                mergeFile: 'material_list',
+                mergeFile: 'material_list'
             },
             file: {
-                files: [
-                    '/public/js/toastr.min.js',
-                ],
-                mergeFiles: [
-                    '/public/js/sub_menu.js',
-                    '/public/js/material_file.js',
-                    '/public/js/material_audit.js',
-                ],
-                mergeFile: 'material_file',
-            },
+                files: ['/public/js/toastr.min.js'],
+                mergeFiles: ['/public/js/sub_menu.js', '/public/js/material_file.js', '/public/js/material_audit.js'],
+                mergeFile: 'material_file'
+            }
         },
         compare: {
             tz: {
-                files: [
-                    '/public/js/spreadjs/sheets/v11/gc.spread.sheets.all.11.2.2.min.js',
-                    '/public/js/decimal.min.js',
-                ],
+                files: ['/public/js/spreadjs/sheets/v11/gc.spread.sheets.all.11.2.2.min.js', '/public/js/decimal.min.js'],
                 mergeFiles: [
                     '/public/js/sub_menu.js',
                     '/public/js/div_resizer.js',
@@ -571,15 +509,12 @@ const JsFiles = {
                     '/public/js/shares/sjs_setting.js',
                     '/public/js/zh_calc.js',
                     '/public/js/path_tree.js',
-                    '/public/js/compare_tz.js',
+                    '/public/js/compare_tz.js'
                 ],
-                mergeFile: 'compare_tz',
+                mergeFile: 'compare_tz'
             },
             stage: {
-                files: [
-                    '/public/js/spreadjs/sheets/v11/gc.spread.sheets.all.11.2.2.min.js',
-                    '/public/js/decimal.min.js',
-                ],
+                files: ['/public/js/spreadjs/sheets/v11/gc.spread.sheets.all.11.2.2.min.js', '/public/js/decimal.min.js'],
                 mergeFiles: [
                     '/public/js/sub_menu.js',
                     '/public/js/div_resizer.js',
@@ -587,17 +522,14 @@ const JsFiles = {
                     '/public/js/shares/sjs_setting.js',
                     '/public/js/zh_calc.js',
                     '/public/js/path_tree.js',
-                    '/public/js/compare_stage.js',
+                    '/public/js/compare_stage.js'
                 ],
-                mergeFile: 'compare_stage',
-            },
+                mergeFile: 'compare_stage'
+            }
         },
         gather: {
             tz: {
-                files: [
-                    '/public/js/spreadjs/sheets/v11/gc.spread.sheets.all.11.2.2.min.js',
-                    '/public/js/decimal.min.js',
-                ],
+                files: ['/public/js/spreadjs/sheets/v11/gc.spread.sheets.all.11.2.2.min.js', '/public/js/decimal.min.js'],
                 mergeFiles: [
                     '/public/js/sub_menu.js',
                     '/public/js/div_resizer.js',
@@ -605,15 +537,12 @@ const JsFiles = {
                     '/public/js/shares/sjs_setting.js',
                     '/public/js/zh_calc.js',
                     '/public/js/path_tree.js',
-                    '/public/js/gather_tz.js',
+                    '/public/js/gather_tz.js'
                 ],
-                mergeFile: 'gather_tz',
+                mergeFile: 'gather_tz'
             },
             stage: {
-                files: [
-                    '/public/js/spreadjs/sheets/v11/gc.spread.sheets.all.11.2.2.min.js',
-                    '/public/js/decimal.min.js',
-                ],
+                files: ['/public/js/spreadjs/sheets/v11/gc.spread.sheets.all.11.2.2.min.js', '/public/js/decimal.min.js'],
                 mergeFiles: [
                     '/public/js/sub_menu.js',
                     '/public/js/div_resizer.js',
@@ -621,17 +550,14 @@ const JsFiles = {
                     '/public/js/shares/sjs_setting.js',
                     '/public/js/zh_calc.js',
                     '/public/js/path_tree.js',
-                    '/public/js/gather_stage.js',
+                    '/public/js/gather_stage.js'
                 ],
-                mergeFile: 'gather_stage',
-            },
+                mergeFile: 'gather_stage'
+            }
         },
         tools: {
             checkTz: {
-                files: [
-                    '/public/js/spreadjs/sheets/v11/gc.spread.sheets.all.11.2.2.min.js',
-                    '/public/js/decimal.min.js',
-                ],
+                files: ['/public/js/spreadjs/sheets/v11/gc.spread.sheets.all.11.2.2.min.js', '/public/js/decimal.min.js'],
                 mergeFiles: [
                     '/public/js/sub_menu.js',
                     '/public/js/div_resizer.js',
@@ -639,31 +565,38 @@ const JsFiles = {
                     '/public/js/shares/sjs_setting.js',
                     '/public/js/zh_calc.js',
                     '/public/js/path_tree.js',
-                    '/public/js/spss_check_tz.js',
+                    '/public/js/spss_check_tz.js'
                 ],
-                mergeFile: 'spss_check_tz',
-            },
+                mergeFile: 'spss_check_tz'
+            }
         },
         report: {
             main: {
-                files: [
-                    '/public/js/spreadjs/sheets/v11/gc.spread.sheets.all.11.2.2.min.js',
-                    '/public/js/decimal.min.js',
-                    '/public/js/moment/moment.min.js',
-                ],
+                files: ['/public/js/spreadjs/sheets/v11/gc.spread.sheets.all.11.2.2.min.js', '/public/js/decimal.min.js', '/public/js/moment/moment.min.js'],
                 mergeFiles: [
                     '/public/js/zh_calc.js',
                     '/public/js/path_tree.js',
                     '/public/js/spreadjs_rela/spreadjs_zh.js',
                     '/public/js/shares/tenders2tree.js',
                     '/public/report/js/rpt_custom.js',
-                    '/public/js/stage_audit.js',
+                    '/public/js/stage_audit.js'
                 ],
-                mergeFile: 'report_main',
-            },
+                mergeFile: 'report_main'
+            }
         },
-    },
-
-};
+        advance: {
+            main: {
+                files: ['/public/js/decimal.min.js'],
+                mergeFiles: ['/public/js/zh_calc.js', '/public/js/advance.js'],
+                mergeFile: 'advance'
+            },
+            info: {
+                files: ['/public/js/decimal.min.js'],
+                mergeFiles: ['/public/js/zh_calc.js', '/public/js/advance_audit.js'],
+                mergeFile: 'advance_audit'
+            }
+        }
+    }
+}
 
-module.exports = JsFiles;
+module.exports = JsFiles

+ 44 - 38
sql/update.sql

@@ -39,43 +39,49 @@ CREATE TABLE `zh_s2b_log` (
   PRIMARY KEY (`id`)
 ) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
 
-CREATE TABLE `calculation`.`zh_advance_pay` (
-  `id` INT(11) NOT NULL,
-  `pid` INT(11) NOT NULL COMMENT '项目id',
-  `uid` INT(11) NOT NULL COMMENT '创建者id',
-  `status` INT(11) NOT NULL COMMENT '审核状态',
-  `tid` INT(11) NOT NULL COMMENT '标段id',
-  `order` INT(11) NOT NULL COMMENT '期数索引',
-  `pay_ratio` DECIMAL(3,2) NOT NULL COMMENT '支付比例',
-  `cur_amount` DECIMAL(24,8) NOT NULL COMMENT '本期金额',
-  `prev_amount` DECIMAL(24,8) NOT NULL COMMENT '截止上期金额',
-  `prev_total_amount` DECIMAL(24,8) NOT NULL COMMENT '截止本期金额',
-  `create_time` DATETIME NULL DEFAULT CURRENT_TIMESTAMP,
-  `type` INT(1) NOT NULL DEFAULT 0 COMMENT '预付款类型,0为开工预付款,1为材料预付款',
-  PRIMARY KEY (`id`))
-COMMENT = '预付款记录';
+CREATE TABLE `zh_advance_pay` (
+  `id` int(11) NOT NULL AUTO_INCREMENT,
+  `uid` int(11) NOT NULL COMMENT '创建者id',
+  `times` int(11) DEFAULT '1' COMMENT '审批次数',
+  `status` int(11) DEFAULT NULL COMMENT '审核状态',
+  `tid` int(11) NOT NULL COMMENT '标段id',
+  `order` int(11) DEFAULT NULL COMMENT '期数索引',
+  `type` int(1) NOT NULL DEFAULT '0' COMMENT '预付款类型,0为开工预付款,1为材料预付款',
+  `pay_ratio` decimal(5,2) DEFAULT NULL COMMENT '支付比例',
+  `cur_amount` decimal(24,8) DEFAULT NULL COMMENT '本期金额',
+  `prev_amount` decimal(24,8) DEFAULT NULL COMMENT '截止上期金额',
+  `prev_total_amount` decimal(24,8) DEFAULT NULL COMMENT '截止本期金额',
+  `create_time` datetime DEFAULT CURRENT_TIMESTAMP,
+  `remark` text COLLATE utf8_unicode_ci COMMENT '备注',
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=214 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci 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 = '预付款附件';
+
+CREATE TABLE `zh_advance_audit` (
+  `id` int(11) NOT NULL AUTO_INCREMENT,
+  `vid` int(11) NOT NULL COMMENT '预付款记录id',
+  `type` tinyint(1) NOT NULL DEFAULT '0' COMMENT '预付款类型,0为开工预付款,1为材料预付款',
+  `times` tinyint(4) DEFAULT NULL COMMENT '审批次数',
+  `order` tinyint(4) DEFAULT NULL COMMENT '审核顺序',
+  `audit_id` int(11) DEFAULT NULL COMMENT '审核人id',
+  `status` tinyint(1) DEFAULT NULL COMMENT '审核状态',
+  `create_time` datetime DEFAULT NULL,
+  `end_time` datetime DEFAULT NULL,
+  `opinion` varchar(1000) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT '审核意见',
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=66 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='预付款审核表';
+
+
+
+CREATE TABLE `zh_advance_file` (
+  `id` int(11) NOT NULL AUTO_INCREMENT,
+  `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) COLLATE utf8_unicode_ci NOT NULL COMMENT '附件路径',
+  `filesize` varchar(255) COLLATE utf8_unicode_ci NOT NULL COMMENT '附件大小',
+  `filename` varchar(255) COLLATE utf8_unicode_ci NOT NULL COMMENT '附件名字',
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='预付款附件';
+