浏览代码

Merge branch 'dev' of http://192.168.1.41:3000/maixinrong/Calculation into dev

TonyKang 4 年之前
父节点
当前提交
d90a26dff5

+ 2 - 0
app/controller/material_controller.js

@@ -876,6 +876,7 @@ module.exports = app => {
                 const files = [];
                 const files = [];
                 const create_time = Date.parse(new Date()) / 1000;
                 const create_time = Date.parse(new Date()) / 1000;
                 let idx = 0;
                 let idx = 0;
+                const extra_upload = ctx.material.status === auditConst.status.checked;
                 while ((stream = await parts()) !== undefined) {
                 while ((stream = await parts()) !== undefined) {
                     if (!stream.filename) {
                     if (!stream.filename) {
                         // 如果没有传入直接返回
                         // 如果没有传入直接返回
@@ -906,6 +907,7 @@ module.exports = app => {
                         file_size: ctx.helper.bytesToSize(idx === 'isString' ? parts.field.size : parts.field.size[idx]),
                         file_size: ctx.helper.bytesToSize(idx === 'isString' ? parts.field.size : parts.field.size[idx]),
                         file_name: file.name,
                         file_name: file.name,
                         fileext: file.ext,
                         fileext: file.ext,
+                        extra_upload,
                     };
                     };
                     return newFile;
                     return newFile;
                 });
                 });

+ 20 - 12
app/controller/revise_controller.js

@@ -18,6 +18,7 @@ const accountGroup = require('../const/account_group').group;
 const tenderMenu = require('../../config/menu').tenderMenu;
 const tenderMenu = require('../../config/menu').tenderMenu;
 const measureType = require('../const/tender').measureType;
 const measureType = require('../const/tender').measureType;
 const spreadConst = require('../const/spread');
 const spreadConst = require('../const/spread');
+const shenpiConst = require('../const/shenpi');
 const fs = require('fs');
 const fs = require('fs');
 const LzString = require('lz-string');
 const LzString = require('lz-string');
 
 
@@ -62,13 +63,15 @@ module.exports = app => {
                 const ledgerRevise = await ctx.service.ledgerRevise.getReviseList(ctx.tender.id);
                 const ledgerRevise = await ctx.service.ledgerRevise.getReviseList(ctx.tender.id);
                 if (ledgerRevise.length > 0) {
                 if (ledgerRevise.length > 0) {
                     const revise = ledgerRevise[0];
                     const revise = ledgerRevise[0];
-                    if (revise.status === audit.revise.status.checked || !revise.valid) {
-                        revise.lastest = true;
-                    } else {
-                        if (ledgerRevise.length > 1) ledgerRevise[1].lastest = true;
-                        // if (revise.status === audit.revise.status.checking) {
-                        //     revise.curAuditor = await ctx.service.reviseAudit.getCurAuditor(revise.id, revise.times);
-                        // }
+                    if (ctx.page === 1) {
+                        if (revise.status === audit.revise.status.checked || !revise.valid) {
+                            revise.lastest = true;
+                        } else {
+                            if (ledgerRevise.length > 1) ledgerRevise[1].lastest = true;
+                            // if (revise.status === audit.revise.status.checking) {
+                            //     revise.curAuditor = await ctx.service.reviseAudit.getCurAuditor(revise.id, revise.times);
+                            // }
+                        }
                     }
                     }
                 }
                 }
                 for (const lr of ledgerRevise) {
                 for (const lr of ledgerRevise) {
@@ -260,9 +263,11 @@ module.exports = app => {
             const [stdBills, stdChapters] = await this.ctx.service.valuation.getValuationStdList(
             const [stdBills, stdChapters] = await this.ctx.service.valuation.getValuationStdList(
                 ctx.tender.data.valuation, ctx.tender.data.measure_type);
                 ctx.tender.data.valuation, ctx.tender.data.measure_type);
             const curAuditor = await ctx.service.reviseAudit.getCurAuditor(revise.id, revise.times);
             const curAuditor = await ctx.service.reviseAudit.getCurAuditor(revise.id, revise.times);
-            const auditors = await ctx.service.reviseAudit.getAuditorsWithOwner(revise.id, revise.times);
             const user = await ctx.service.projectAccount.getAccountInfoById(revise.uid);
             const user = await ctx.service.projectAccount.getAccountInfoById(revise.uid);
             const times = revise.status === audit.revise.status.checkNo ? revise.times - 1 : revise.times;
             const times = revise.status === audit.revise.status.checkNo ? revise.times - 1 : revise.times;
+            const auditors = revise.status === audit.revise.status.checkNo && revise.uid === ctx.session.sessionUser.accountId ?
+                await ctx.service.reviseAudit.getAuditorsWithOwner(revise.id, revise.times) :
+                await ctx.service.reviseAudit.getAuditorsWithOwner(revise.id, times);
             const auditHistory = [];
             const auditHistory = [];
             if (times >= 1) {
             if (times >= 1) {
                 for (let i = 1; i <= times; i++) {
                 for (let i = 1; i <= times; i++) {
@@ -283,6 +288,7 @@ module.exports = app => {
                 auditors,
                 auditors,
                 user,
                 user,
                 auditHistory,
                 auditHistory,
+                shenpiConst,
             };
             };
         }
         }
 
 
@@ -299,7 +305,7 @@ module.exports = app => {
             renderData.posSpread.readOnly = true;
             renderData.posSpread.readOnly = true;
             renderData.readOnly = true;
             renderData.readOnly = true;
             renderData.history = true;
             renderData.history = true;
-            renderData.historyRevise = await ctx.service.ledgerRevise.getReviseList(ctx.tender.id);
+            renderData.historyRevise = await ctx.service.ledgerRevise.getAllReviseList(ctx.tender.id);
             await this.layout('revise/info.ejs', renderData, 'revise/info_modal.ejs');
             await this.layout('revise/info.ejs', renderData, 'revise/info_modal.ejs');
         }
         }
 
 
@@ -490,7 +496,7 @@ module.exports = app => {
                 const [ledgerSpread, posSpread] = this._getSpreadSetting(revise);
                 const [ledgerSpread, posSpread] = this._getSpreadSetting(revise);
                 ledgerSpread.readOnly = true;
                 ledgerSpread.readOnly = true;
                 posSpread.readOnly = true;
                 posSpread.readOnly = true;
-                const historyRevise = await ctx.service.ledgerRevise.getReviseList(ctx.tender.id);
+                const historyRevise = await ctx.service.ledgerRevise.getAllReviseList(ctx.tender.id);
                 // 获取审批流程中右边列表
                 // 获取审批流程中右边列表
                 const auditHistory = [];
                 const auditHistory = [];
                 const times = revise.status === audit.revise.status.checkNo ? revise.times - 1 : revise.times;
                 const times = revise.status === audit.revise.status.checkNo ? revise.times - 1 : revise.times;
@@ -799,10 +805,11 @@ module.exports = app => {
                 const exist = await ctx.service.reviseAudit.getAuditor(revise.id, id, revise.times);
                 const exist = await ctx.service.reviseAudit.getAuditor(revise.id, id, revise.times);
                 if (exist) throw '该审核人已存在,请勿重复添加';
                 if (exist) throw '该审核人已存在,请勿重复添加';
 
 
-                const result = await ctx.service.reviseAudit.addAuditor(revise, id);
+                const is_gdzs = ctx.tender.info.shenpi.revise === shenpiConst.sp_status.gdzs ? 1 : 0;
+                const result = await ctx.service.reviseAudit.addAuditor(revise, id, is_gdzs);
                 if (!result) throw '添加审核人失败';
                 if (!result) throw '添加审核人失败';
 
 
-                const resultData = await ctx.service.reviseAudit.getAuditor(revise.id, id, revise.times);
+                const resultData = await ctx.service.reviseAudit.getAuditorsWithOwner(revise.id, revise.times);
                 ctx.body = { err: 0, msg: '', data: resultData };
                 ctx.body = { err: 0, msg: '', data: resultData };
             } catch (err) {
             } catch (err) {
                 this.log(err, '数据错误');
                 this.log(err, '数据错误');
@@ -858,6 +865,7 @@ module.exports = app => {
                 ctx.body = { err: 0, msg: '', data: {} };
                 ctx.body = { err: 0, msg: '', data: {} };
             } catch (err) {
             } catch (err) {
                 this.log(err);
                 this.log(err);
+                ctx.session.postError = err.toString();
                 ctx.body = this.ajaxErrorBody(err, '上报失败');
                 ctx.body = this.ajaxErrorBody(err, '上报失败');
             }
             }
         }
         }

+ 70 - 0
app/middleware/revise_audit_check.js

@@ -0,0 +1,70 @@
+'use strict';
+
+/**
+ *
+ *
+ * @author Ellisran
+ * @date 2020/10/15
+ * @version
+ */
+
+const status = require('../const/audit').revise.status;
+const shenpiConst = require('../const/shenpi');
+const _ = require('lodash');
+
+module.exports = options => {
+    /**
+     * 标段校验 中间件
+     * 1. 读取标段数据(包括属性)
+     * 2. 检验用户是否可见标段(不校验具体权限)
+     *
+     * @param {function} next - 中间件继续执行的方法
+     * @return {void}
+     */
+    return function* reviseAuditCheck(next) {
+        try {
+            // 获取revise
+            const revise = yield this.service.ledgerRevise.getLastestRevise(this.tender.id);
+            if (!revise) throw '台账修订数据有误';
+            if ((revise.status === status.uncheck || revise.status === status.checkNo) && this.tender.info.shenpi.revise !== shenpiConst.sp_status.sqspr) {
+                const shenpi_status = this.tender.info.shenpi.revise;
+                // 进一步比较审批流是否与审批流程设置的相同,不同则替换为固定审批流或固定的终审
+                const auditList = yield this.service.reviseAudit.getAllDataByCondition({ where: { tender_id: this.tender.id, times: revise.times } });
+                const auditIdList = _.map(auditList, 'audit_id');
+                if (shenpi_status === shenpiConst.sp_status.gdspl) {
+                    const shenpiList = yield this.service.shenpiAudit.getAllDataByCondition({ where: { tid: this.tender.id, sp_type: shenpiConst.sp_type.revise, sp_status: shenpi_status } });
+                    const shenpiIdList = _.map(shenpiList, 'audit_id');
+                    // 判断2个id数组是否相同,不同则删除原审批流,切换成固定的审批流
+                    if (!_.isEqual(auditIdList, shenpiIdList)) {
+                        yield this.service.reviseAudit.updateNewAuditList(revise, shenpiIdList);
+                    }
+                } else if (shenpi_status === shenpiConst.sp_status.gdzs) {
+                    const shenpiInfo = yield this.service.shenpiAudit.getDataByCondition({ tid: this.tender.id, sp_type: shenpiConst.sp_type.revise, sp_status: shenpi_status });
+                    // 判断最后一个id是否与固定终审id相同,不同则删除原审批流中如果存在的id和添加终审
+                    if (shenpiInfo && shenpiInfo.audit_id !== _.last(auditIdList)) {
+                        yield this.service.reviseAudit.updateLastAudit(revise, auditList, shenpiInfo.audit_id);
+                    } else if (!shenpiInfo) {
+                        // 不存在终审人的状态下这里恢复为授权审批人
+                        this.tender.info.shenpi.revise = shenpiConst.sp_status.sqspr;
+                    }
+                }
+            }
+            yield next;
+        } catch (err) {
+            console.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);
+        }
+    };
+};

+ 138 - 121
app/public/js/login.js

@@ -1,121 +1,138 @@
-$(document).ready(function() {
-    const lSPName = getLocalCache('project_name');
-    const lSPCode = getLocalCache('project_code');
-    if (lSPName !== null) {
-        $('#project_name').text(lSPName);
-        $('#project').val(lSPCode);
-        $('#forget-project').val(lSPCode);
-        $('#account').focus();
-    }
-    $("#login-tab a[data-toggle='tab']").on('shown.bs.tab', function () {
-        let type = $(this).data('type');
-        type = parseInt(type);
-        type = isNaN(type) || type <= 0 ? 1 : type;
-        $("input[name='type']:hidden").val(type);
-    });
-    // $('#username').blur(function () {
-    //     let account = $(this).val();
-    //     // 判断输入的邮箱/手机是否格式正确
-    //     if(/^1[3456789]\d{9}$/.test(account) || /^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$/.test(account)) {
-    //         $('#error-msg').hide();
-    //     } else {
-    //         $('#error-msg').show();
-    //         $('#error-msg').text('账号格式有误');
-    //     }
-    // })
-    $('#project').blur(function () {
-        if ($(this).val() == '') {
-            $('#project_name').text('');
-            $('#forget-project').val('');
-            removeLocalCache('project_code');
-            removeLocalCache('project_name');
-        } else {
-            const pcode = getLocalCache('project_code');
-            if ($(this).val() !== pcode) {
-                const pc = $(this).val();
-                $.ajax({
-                    type: 'get',
-                    url: '/project/name',
-                    data: { code: pc },
-                    dataType: 'json',
-                    success: function (result) {
-                        setLocalCache('project_code', pc);
-                        if (result.err === 1) {
-                            $('#project_name').text('');
-                            $('#forget-project').val('');
-                            console.log(result.msg);
-                            toast(result.msg, 'error', 'exclamation-circle');
-                            removeLocalCache('project_name');
-                        } else {
-                            setLocalCache('project_name', result.data);
-                            $('#project_name').text(result.data);
-                            $('#forget-project').val(pc);
-                        }
-                    }
-                })
-            }
-        }
-    });
-
-    $('#forget-btn').click(function () {
-        let flag = true;
-        if ($('#forget-project').val() == '') {
-            $('#forget-project').addClass('is-invalid');
-            $('#forget-project').siblings('div.invalid-feedback').html('项目编号不能为空。');
-            flag = false;
-        }
-        if ($('#forget-name').val() == '') {
-            $('#forget-name').addClass('is-invalid');
-            $('#forget-name').siblings('div.invalid-feedback').html('登录账号不能为空。');
-            flag = false;
-        }
-        if(flag) {
-            $.ajax({
-                type: 'post',
-                url: '/reset/password',
-                data: { code: $('#forget-project').val(), name: $('#forget-name').val() },
-                dataType: 'json',
-                beforeSend: function(xhr) {
-                    let csrfToken = csrf;
-                    xhr.setRequestHeader('x-csrf-token', csrfToken);
-                },
-                success: function (result) {
-                    if (result.err === 1) {
-                        if (result.index === 1) {
-                            $('#forget-project').addClass('is-invalid');
-                            $('#forget-project').siblings('div.invalid-feedback').html(result.msg);
-                        } else if (result.index === 2) {
-                            $('#forget-name').addClass('is-invalid');
-                            $('#forget-name').siblings('div.invalid-feedback').html(result.msg);
-                        } else {
-                            toast(result.msg, 'error');
-                        }
-                    } else {
-                        $('#fg-password-done').find('b').eq(0).text(result.data.name);
-                        $('#fg-password-done').find('b').eq(1).text(result.data.account);
-                        $('#fg-password-done').find('b').eq(2).text(result.data.mobile);
-                        setLocalCache('project_name', result.data.pName);
-                        setLocalCache('project_code', $('#forget-project').val());
-                        $('#fg-password').modal('hide');
-                        $('#fg-password-done').modal('show');
-                        $('#account').val($('#forget-name').val());
-                        $('#project').val($('#forget-project').val());
-                        $('#project_name').text(result.data.pName);
-                        $('#forget-name').val('');
-                    }
-                }
-            })
-        }
-    })
-
-    $('input').focus(function () {
-        if($(this).hasClass('is-invalid')) {
-            $(this).removeClass('is-invalid');
-            $(this).siblings('div.invalid-feedback').html('');
-        }
-    });
-
-    $('#focus-pwd').click(function () {
-        $('#project-password').focus();
-    })
-});
+$(document).ready(function() {
+    // const lSPName = getLocalCache('project_name');
+    const lSPCode = getLocalCache('project_code');
+    if (lSPCode !== null) {
+        // $('#project_name').text(lSPName);
+        $('#project').val(lSPCode);
+        $('#forget-project').val(lSPCode);
+        $('#account').focus();
+
+        $.ajax({
+            type: 'get',
+            url: '/project/name',
+            data: { code: lSPCode },
+            dataType: 'json',
+            success: function (result) {
+                if (result.err === 1) {
+                    $('#project_name').text('');
+                    $('#forget-project').val('');
+                    toast(result.msg, 'error', 'exclamation-circle');
+                } else {
+                    $('#project_name').text(result.data);
+                }
+            }
+        })
+    }
+
+    $("#login-tab a[data-toggle='tab']").on('shown.bs.tab', function () {
+        let type = $(this).data('type');
+        type = parseInt(type);
+        type = isNaN(type) || type <= 0 ? 1 : type;
+        $("input[name='type']:hidden").val(type);
+    });
+    // $('#username').blur(function () {
+    //     let account = $(this).val();
+    //     // 判断输入的邮箱/手机是否格式正确
+    //     if(/^1[3456789]\d{9}$/.test(account) || /^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$/.test(account)) {
+    //         $('#error-msg').hide();
+    //     } else {
+    //         $('#error-msg').show();
+    //         $('#error-msg').text('账号格式有误');
+    //     }
+    // })
+    $('#project').blur(function () {
+        if ($(this).val() == '') {
+            $('#project_name').text('');
+            $('#forget-project').val('');
+            removeLocalCache('project_code');
+            removeLocalCache('project_name');
+        } else {
+            const pcode = getLocalCache('project_code');
+            if ($(this).val() !== pcode) {
+                const pc = $(this).val();
+                $.ajax({
+                    type: 'get',
+                    url: '/project/name',
+                    data: { code: pc },
+                    dataType: 'json',
+                    success: function (result) {
+                        setLocalCache('project_code', pc);
+                        if (result.err === 1) {
+                            $('#project_name').text('');
+                            $('#forget-project').val('');
+                            console.log(result.msg);
+                            toast(result.msg, 'error', 'exclamation-circle');
+                            removeLocalCache('project_name');
+                        } else {
+                            setLocalCache('project_name', result.data);
+                            $('#project_name').text(result.data);
+                            $('#forget-project').val(pc);
+                        }
+                    }
+                })
+            }
+        }
+    });
+
+    $('#forget-btn').click(function () {
+        let flag = true;
+        if ($('#forget-project').val() == '') {
+            $('#forget-project').addClass('is-invalid');
+            $('#forget-project').siblings('div.invalid-feedback').html('项目编号不能为空。');
+            flag = false;
+        }
+        if ($('#forget-name').val() == '') {
+            $('#forget-name').addClass('is-invalid');
+            $('#forget-name').siblings('div.invalid-feedback').html('登录账号不能为空。');
+            flag = false;
+        }
+        if(flag) {
+            $.ajax({
+                type: 'post',
+                url: '/reset/password',
+                data: { code: $('#forget-project').val(), name: $('#forget-name').val() },
+                dataType: 'json',
+                beforeSend: function(xhr) {
+                    let csrfToken = csrf;
+                    xhr.setRequestHeader('x-csrf-token', csrfToken);
+                },
+                success: function (result) {
+                    if (result.err === 1) {
+                        if (result.index === 1) {
+                            $('#forget-project').addClass('is-invalid');
+                            $('#forget-project').siblings('div.invalid-feedback').html(result.msg);
+                        } else if (result.index === 2) {
+                            $('#forget-name').addClass('is-invalid');
+                            $('#forget-name').siblings('div.invalid-feedback').html(result.msg);
+                        } else {
+                            toast(result.msg, 'error');
+                        }
+                    } else {
+                        $('#fg-password-done').find('b').eq(0).text(result.data.name);
+                        $('#fg-password-done').find('b').eq(1).text(result.data.account);
+                        $('#fg-password-done').find('b').eq(2).text(result.data.mobile);
+                        setLocalCache('project_name', result.data.pName);
+                        setLocalCache('project_code', $('#forget-project').val());
+                        $('#fg-password').modal('hide');
+                        $('#fg-password-done').modal('show');
+                        $('#account').val($('#forget-name').val());
+                        $('#project').val($('#forget-project').val());
+                        $('#project_name').text(result.data.pName);
+                        $('#forget-name').val('');
+                    }
+                }
+            })
+        }
+    })
+
+    $('input').focus(function () {
+        if($(this).hasClass('is-invalid')) {
+            $(this).removeClass('is-invalid');
+            $(this).siblings('div.invalid-feedback').html('');
+        }
+    });
+
+    $('#focus-pwd').click(function () {
+        $('#project-password').focus();
+    })
+});

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

@@ -185,9 +185,9 @@ $(document).ready(function () {
 function checkAuditorFrom () {
 function checkAuditorFrom () {
     if ($('#auditors li').length === 0) {
     if ($('#auditors li').length === 0) {
         if(shenpi_status === shenpiConst.sp_status.gdspl) {
         if(shenpi_status === shenpiConst.sp_status.gdspl) {
-            toastr.err('请联系管理员添加审批人');
+            toastr.error('请联系管理员添加审批人');
         } else {
         } else {
-            toastr.err('请先选择审批人,再上报数据');
+            toastr.error('请先选择审批人,再上报数据');
         }
         }
         return false;
         return false;
     }
     }

+ 17 - 10
app/public/js/material_file.js

@@ -117,16 +117,18 @@ $(document).ready(function () {
     })
     })
     // 生成所有附件列表
     // 生成所有附件列表
     function getAllList(currPageNum = 1) {
     function getAllList(currPageNum = 1) {
+        const isCheckAll = $('#dropdownMenuButton').attr('btn-type') === 'all'
          // 未选中checkbox,需要过滤出来当前期的数据
          // 未选中checkbox,需要过滤出来当前期的数据
-        const filterFileData = fileData && fileData.filter(file => file.mid === parseInt(mid) && file.tid === parseInt(tid))
-        const total = calcCount(filterFileData);
+        const filterFileData = fileData && isCheckAll ? fileData : fileData.filter(file => file.mid === parseInt(mid) && file.tid === parseInt(tid))
+        const total = calcCount();
         // 总页数
         // 总页数
         const pageNum = Math.ceil(total/pageCount);
         const pageNum = Math.ceil(total/pageCount);
         // 当前页附件内容
         // 当前页附件内容
-        const currPageAttData = fileData && $('#dropdownMenuButton').attr('type') === 'all' ? fileData.slice((currPageNum-1)*pageCount, currPageNum*pageCount) : filterFileData.map((v, index) => {
+        const currPageAttData = fileData && isCheckAll ? fileData.slice((currPageNum-1)*pageCount, currPageNum*pageCount) : filterFileData.map((v, index) => {
             return {...v, index }
             return {...v, index }
         }).slice((currPageNum-1)*pageCount, currPageNum*pageCount);
         }).slice((currPageNum-1)*pageCount, currPageNum*pageCount);
 
 
+        console.log(currPageAttData)
         renderHtml(currPageAttData)
         renderHtml(currPageAttData)
         // 渲染分页器
         // 渲染分页器
         renderPagination(currPageNum, pageNum)
         renderPagination(currPageNum, pageNum)
@@ -212,7 +214,7 @@ $(document).ready(function () {
             <td>${fileInfo.file_size}</td>
             <td>${fileInfo.file_size}</td>
             <td>第${fileInfo.s_order}期</td>
             <td>第${fileInfo.s_order}期</td>
             <td>${fileInfo.upload_time}</td>`
             <td>${fileInfo.upload_time}</td>`
-            if (fileInfo.canDel ) {
+            if (fileInfo.showDel ) {
                 html += `<td>
                 html += `<td>
                 <a href="/${fileInfo.filepath}" class="btn btn-light btn-sm" title="下载"><span class="fa fa-download text-primary"></span></a>
                 <a href="/${fileInfo.filepath}" class="btn btn-light btn-sm" title="下载"><span class="fa fa-download text-primary"></span></a>
                 <a href="javascript:void(0);" class="btn btn-light btn-sm delete-file" data-attid="${fileInfo.id}" title="删除附件">
                 <a href="javascript:void(0);" class="btn btn-light btn-sm delete-file" data-attid="${fileInfo.id}" title="删除附件">
@@ -263,21 +265,26 @@ $(document).ready(function () {
             let showDel = false
             let showDel = false
             // 只判断当前期,因为以往期都是只读的
             // 只判断当前期,因为以往期都是只读的
             if (file.mid === parseInt(mid) && file.tid === parseInt(tid) && file.user_id === parseInt(cur_uid)) {
             if (file.mid === parseInt(mid) && file.tid === parseInt(tid) && file.user_id === parseInt(cur_uid)) {
-                if (!curAuditor) {
-                    materialStatus === auditConst.status.uncheck && parseInt(cur_uid) === materialUid && (showDel = true)
-                    materialStatus === auditConst.status.checkNo && parseInt(cur_uid) === materialUid && (showDel = true)
+                if (materialStatus === auditConst.status.checked) {
+                    showDel = Boolean(file.extra_upload )
                 } else {
                 } else {
-                    curAuditor.aid === parseInt(cur_uid) && (showDel = true)
+                    showDel = true
                 }
                 }
+                // if (!curAuditor) {
+                //     materialStatus === auditConst.status.uncheck && parseInt(cur_uid) === materialUid && (showDel = true)
+                //     materialStatus === auditConst.status.checkNo && parseInt(cur_uid) === materialUid && (showDel = true)
+                // } else {
+                //     curAuditor.aid === parseInt(cur_uid) && (showDel = true)
+                // }
             }
             }
-            return showDel ? {...file, canDel: true, index} : {...file, index}
+            return {...file, index, showDel}
         })
         })
     };
     };
 
 
     function calcCount() {
     function calcCount() {
         // 附件总数
         // 附件总数
         let total = fileData && fileData.length;
         let total = fileData && fileData.length;
-        if(!$('#file-checkbox').is(':checked')) {
+        if(!$('#dropdownMenuButton').attr('btn-type') === 'all') {
             total = fileData && fileData.filter(file => file.mid === parseInt(mid) && file.tid === parseInt(tid)).length
             total = fileData && fileData.filter(file => file.mid === parseInt(mid) && file.tid === parseInt(tid)).length
         }
         }
         return total
         return total

+ 4 - 8
app/public/js/stage_im.js

@@ -261,9 +261,10 @@ const stageIm = (function () {
                 im.org[f] = im[f];
                 im.org[f] = im[f];
             }
             }
         }
         }
+        im.custom_define_exist = im.custom_define !== null;
         im.custom_define = detail.custom_define ? detail.custom_define.split(',') : [];
         im.custom_define = detail.custom_define ? detail.custom_define.split(',') : [];
         _.assignInWith(im, detail, function (oV, sV, key) {
         _.assignInWith(im, detail, function (oV, sV, key) {
-            return im.custom_define.length > 0
+            return im.custom_define_exist
                 ? (im.custom_define.indexOf(key) > -1 ? sV : ((resetFields.indexOf(key) > -1) ? im.org[key] : oV))
                 ? (im.custom_define.indexOf(key) > -1 ? sV : ((resetFields.indexOf(key) > -1) ? im.org[key] : oV))
                 : (imFields.indexOf(key) > -1 ? sV : ((resetFields.indexOf(key) > -1) ? im.org[key] : oV));
                 : (imFields.indexOf(key) > -1 ? sV : ((resetFields.indexOf(key) > -1) ? im.org[key] : oV));
         });
         });
@@ -509,7 +510,6 @@ const stageIm = (function () {
                 im.bw = getZlNormalBw(node, peg);
                 im.bw = getZlNormalBw(node, peg);
                 im.xm = node.name;
                 im.xm = node.name;
             }
             }
-            checkCustomDetail(im);
             //if (!stage.im_gather || !node.check) {
             //if (!stage.im_gather || !node.check) {
                 generateTzGclBillsData(node, im);
                 generateTzGclBillsData(node, im);
             //}
             //}
@@ -560,7 +560,6 @@ const stageIm = (function () {
                 custom_define: [],
                 custom_define: [],
                 source: [{id: node.ledger_id, code: node.code, b_code: node.b_code}],
                 source: [{id: node.ledger_id, code: node.code, b_code: node.b_code}],
             };
             };
-            checkCustomDetail(imDefault);
             for (const p of posterity) {
             for (const p of posterity) {
                 if (p.children && p.children.length > 0) continue;
                 if (p.children && p.children.length > 0) continue;
                 if (!p.b_code || p.b_code === '') continue;
                 if (!p.b_code || p.b_code === '') continue;
@@ -585,7 +584,6 @@ const stageIm = (function () {
                                 source: [],
                                 source: [],
                             };
                             };
                             nodeImData.push(im);
                             nodeImData.push(im);
-                            checkCustomDetail(im);
                         }
                         }
                         im.source.push({id: p.ledger_id, code: p.code, b_code: p.b_code});
                         im.source.push({id: p.ledger_id, code: p.code, b_code: p.b_code});
 
 
@@ -737,7 +735,6 @@ const stageIm = (function () {
                     im.drawing_code = getDrawingCode(p);
                     im.drawing_code = getDrawingCode(p);
                 }
                 }
                 nodeImData.push(im);
                 nodeImData.push(im);
-                checkCustomDetail(im);
                 ImData.push(im);
                 ImData.push(im);
             }
             }
             im.source.push({id: p.ledger_id, code: p.code, b_code: p.b_code});
             im.source.push({id: p.ledger_id, code: p.code, b_code: p.b_code});
@@ -778,7 +775,6 @@ const stageIm = (function () {
                         source: [{id: p.ledger_id, code: p.code, b_code: p.b_code}],
                         source: [{id: p.ledger_id, code: p.code, b_code: p.b_code}],
                     };
                     };
                     im.calc_memo = '本期计量:' + (checkZero(im.jl) ? 0 : im.jl) + ' ' + im.unit;
                     im.calc_memo = '本期计量:' + (checkZero(im.jl) ? 0 : im.jl) + ' ' + im.unit;
-                    checkCustomDetail(im);
                     ImData.push(im);
                     ImData.push(im);
                     if (pp.qc_qty && pp.qc_qty !== 0) {
                     if (pp.qc_qty && pp.qc_qty !== 0) {
                         for (const c of changes) {
                         for (const c of changes) {
@@ -806,7 +802,6 @@ const stageIm = (function () {
                     source: [{id: p.ledger_id, code: p.code, b_code: p.b_code}],
                     source: [{id: p.ledger_id, code: p.code, b_code: p.b_code}],
                 };
                 };
                 im.calc_memo = '本期计量:' + (checkZero(im.jl) ? 0 : im.jl) + ' ' + im.unit;
                 im.calc_memo = '本期计量:' + (checkZero(im.jl) ? 0 : im.jl) + ' ' + im.unit;
-                checkCustomDetail(im);
                 ImData.push(im);
                 ImData.push(im);
                 if (p.qc_qty && p.qc_qty !== 0) {
                 if (p.qc_qty && p.qc_qty !== 0) {
                     for (const c of changes) {
                     for (const c of changes) {
@@ -869,7 +864,8 @@ const stageIm = (function () {
             }
             }
             getCalcMemo(im);
             getCalcMemo(im);
             getChangeInfo(im);
             getChangeInfo(im);
-            im.im_code = pre + getNumberFormat(stage.order, 2) + splitChar + getNumberFormat(i + 1, 3)
+            im.im_code = pre + getNumberFormat(stage.order, 2) + splitChar + getNumberFormat(i + 1, 3);
+            checkCustomDetail(im);
         }
         }
         return ImData;
         return ImData;
     }
     }

+ 5 - 4
app/router.js

@@ -10,6 +10,7 @@ module.exports = app => {
     // 标段读取中间件
     // 标段读取中间件
     const tenderCheck = app.middlewares.tenderCheck();
     const tenderCheck = app.middlewares.tenderCheck();
     const ledgerAuditCheck = app.middlewares.ledgerAuditCheck();
     const ledgerAuditCheck = app.middlewares.ledgerAuditCheck();
+    const reviseAuditCheck = app.middlewares.reviseAuditCheck();
     const uncheckTenderCheck = app.middlewares.uncheckTenderCheck();
     const uncheckTenderCheck = app.middlewares.uncheckTenderCheck();
     // 期读取中间件
     // 期读取中间件
     const stageCheck = app.middlewares.stageCheck();
     const stageCheck = app.middlewares.stageCheck();
@@ -141,13 +142,13 @@ module.exports = app => {
     app.post('/tender/:id/pos/update', sessionAuth, tenderCheck, uncheckTenderCheck, 'ledgerController.posUpdate');
     app.post('/tender/:id/pos/update', sessionAuth, tenderCheck, uncheckTenderCheck, 'ledgerController.posUpdate');
     app.post('/tender/:id/pos/paste', sessionAuth, tenderCheck, uncheckTenderCheck, 'ledgerController.posPaste');
     app.post('/tender/:id/pos/paste', sessionAuth, tenderCheck, uncheckTenderCheck, 'ledgerController.posPaste');
     app.post('/tender/:id/ledger/deal2sgfh', sessionAuth, tenderCheck, uncheckTenderCheck, 'ledgerController.deal2sgfh');
     app.post('/tender/:id/ledger/deal2sgfh', sessionAuth, tenderCheck, uncheckTenderCheck, 'ledgerController.deal2sgfh');
-    app.post('/tender/:id/ledger/check', sessionAuth, tenderCheck, uncheckTenderCheck, ledgerAuditCheck, 'ledgerController.check');
+    app.post('/tender/:id/ledger/check', sessionAuth, tenderCheck, uncheckTenderCheck, 'ledgerController.check');
 
 
     // 台账审批相关
     // 台账审批相关
     app.get('/tender/:id/ledger/audit', sessionAuth, tenderCheck, uncheckTenderCheck, 'ledgerAuditController.index');
     app.get('/tender/:id/ledger/audit', sessionAuth, tenderCheck, uncheckTenderCheck, 'ledgerAuditController.index');
     app.post('/tender/:id/ledger/audit/add', sessionAuth, tenderCheck, uncheckTenderCheck, 'ledgerAuditController.add');
     app.post('/tender/:id/ledger/audit/add', sessionAuth, tenderCheck, uncheckTenderCheck, 'ledgerAuditController.add');
     app.post('/tender/:id/ledger/audit/delete', sessionAuth, tenderCheck, uncheckTenderCheck, 'ledgerAuditController.remove');
     app.post('/tender/:id/ledger/audit/delete', sessionAuth, tenderCheck, uncheckTenderCheck, 'ledgerAuditController.remove');
-    app.post('/tender/:id/ledger/audit/start', sessionAuth, tenderCheck, uncheckTenderCheck, 'ledgerAuditController.start');
+    app.post('/tender/:id/ledger/audit/start', sessionAuth, tenderCheck, uncheckTenderCheck, ledgerAuditCheck, 'ledgerAuditController.start');
     app.post('/tender/:id/ledger/audit/check', sessionAuth, tenderCheck, uncheckTenderCheck, 'ledgerAuditController.check');
     app.post('/tender/:id/ledger/audit/check', sessionAuth, tenderCheck, uncheckTenderCheck, 'ledgerAuditController.check');
 
 
     // 部位台账
     // 部位台账
@@ -166,7 +167,7 @@ module.exports = app => {
     // app.post('/tender/:id/revise/deal2sgfh', sessionAuth, tenderCheck, uncheckTenderCheck, 'reviseController.deal2sgfh');
     // app.post('/tender/:id/revise/deal2sgfh', sessionAuth, tenderCheck, uncheckTenderCheck, 'reviseController.deal2sgfh');
 
 
     // 台账修订页面
     // 台账修订页面
-    app.get('/tender/:id/revise/info', sessionAuth, tenderCheck, uncheckTenderCheck, 'reviseController.info');
+    app.get('/tender/:id/revise/info', sessionAuth, tenderCheck, uncheckTenderCheck, reviseAuditCheck, 'reviseController.info');
     app.post('/tender/:id/revise/auditors', sessionAuth, tenderCheck, uncheckTenderCheck, 'reviseController.reviseAuditors');
     app.post('/tender/:id/revise/auditors', sessionAuth, tenderCheck, uncheckTenderCheck, 'reviseController.reviseAuditors');
     app.post('/tender/:id/revise/info/load', sessionAuth, tenderCheck, uncheckTenderCheck, 'reviseController.loadInfoData');
     app.post('/tender/:id/revise/info/load', sessionAuth, tenderCheck, uncheckTenderCheck, 'reviseController.loadInfoData');
     app.post('/tender/:id/revise/info/update', sessionAuth, tenderCheck, uncheckTenderCheck, 'reviseController.update');
     app.post('/tender/:id/revise/info/update', sessionAuth, tenderCheck, uncheckTenderCheck, 'reviseController.update');
@@ -181,7 +182,7 @@ module.exports = app => {
     // 修订审批
     // 修订审批
     app.post('/tender/:id/revise/audit/add', sessionAuth, tenderCheck, uncheckTenderCheck, 'reviseController.addAuditor');
     app.post('/tender/:id/revise/audit/add', sessionAuth, tenderCheck, uncheckTenderCheck, 'reviseController.addAuditor');
     app.post('/tender/:id/revise/audit/remove', sessionAuth, tenderCheck, uncheckTenderCheck, 'reviseController.removeAuditor');
     app.post('/tender/:id/revise/audit/remove', sessionAuth, tenderCheck, uncheckTenderCheck, 'reviseController.removeAuditor');
-    app.post('/tender/:id/revise/audit/start', sessionAuth, tenderCheck, uncheckTenderCheck, 'reviseController.start');
+    app.post('/tender/:id/revise/audit/start', sessionAuth, tenderCheck, uncheckTenderCheck, reviseAuditCheck, 'reviseController.start');
     app.post('/tender/:id/revise/audit/check', sessionAuth, tenderCheck, uncheckTenderCheck, 'reviseController.check');
     app.post('/tender/:id/revise/audit/check', sessionAuth, tenderCheck, uncheckTenderCheck, 'reviseController.check');
 
 
     // 签约清单
     // 签约清单

+ 16 - 0
app/service/ledger_revise.js

@@ -42,6 +42,22 @@ module.exports = app => {
             return await this.db.query(sql, sqlParam);
             return await this.db.query(sql, sqlParam);
         }
         }
 
 
+        /**
+         * 获取全部修订
+         * @param tid
+         * @returns {Promise<*>}
+         */
+        async getAllReviseList (tid) {
+            const sql = 'SELECT lc.id, lc.tid, lc.corder, lc.in_time, lc.uid, lc.begin_time, lc.end_time, lc.times, lc.status, lc.valid,' +
+                '    pa.name As user_name, pa.role As user_role, pa.company As user_company' +
+                '  FROM ' + this.tableName + ' As lc' +
+                '  INNER JOIN ' + this.ctx.service.projectAccount.tableName + ' As pa ON lc.uid = pa.id' +
+                '  WHERE lc.tid = ?' +
+                '  ORDER BY lc.in_time DESC';
+            const sqlParam = [tid];
+            return await this.db.query(sql, sqlParam);
+        }
+
         async getLastestRevise(tid, valid = true) {
         async getLastestRevise(tid, valid = true) {
             const sql = 'SELECT lc.*,' +
             const sql = 'SELECT lc.*,' +
                 '    pa.name As user_name, pa.role As user_role, pa.company As user_company' +
                 '    pa.name As user_name, pa.role As user_role, pa.company As user_company' +

+ 86 - 17
app/service/revise_audit.js

@@ -12,6 +12,7 @@ const auditConst = require('../const/audit').revise;
 const smsTypeConst = require('../const/sms_type');
 const smsTypeConst = require('../const/sms_type');
 const SmsAliConst = require('../const/sms_alitemplate');
 const SmsAliConst = require('../const/sms_alitemplate');
 const wxConst = require('../const/wechat_template');
 const wxConst = require('../const/wechat_template');
+const shenpiConst = require('../const/shenpi');
 const pushType = require('../const/audit').pushType;
 const pushType = require('../const/audit').pushType;
 
 
 module.exports = app => {
 module.exports = app => {
@@ -129,20 +130,31 @@ module.exports = app => {
          * @param {Number} times - 第几次审批
          * @param {Number} times - 第几次审批
          * @return {Promise<number>}
          * @return {Promise<number>}
          */
          */
-        async addAuditor(revise, auditorId) {
-            const times = revise.times ? revise.times : 1;
-            const newOrder = await this.getNewOrder(revise.id, times);
-            const data = {
-                tender_id: revise.tid,
-                audit_id: auditorId,
-                times,
-                audit_order: newOrder,
-                status: auditConst.status.uncheck,
-                rid: revise.id,
-                in_time: new Date(),
-            };
-            const result = await this.db.insert(this.tableName, data);
-            return (result.effectRows = 1);
+        async addAuditor(revise, auditorId, is_gdzs = 0) {
+            const transaction = await this.db.beginTransaction();
+            try {
+                const times = revise.times ? revise.times : 1;
+                let newOrder = await this.getNewOrder(revise.id, times);
+                // 判断是否存在固定终审,存在则newOrder - 1并使终审order+1
+                newOrder = is_gdzs === 1 ? newOrder - 1 : newOrder;
+                if (is_gdzs) await this._syncOrderByDelete(transaction, revise.id, newOrder, times, '+');
+                const data = {
+                    tender_id: revise.tid,
+                    audit_id: auditorId,
+                    times,
+                    audit_order: newOrder,
+                    status: auditConst.status.uncheck,
+                    rid: revise.id,
+                    in_time: new Date(),
+                };
+                const result = await transaction.insert(this.tableName, data);
+                await transaction.commit();
+                return (result.effectRows = 1);
+            } catch (err) {
+                await transaction.rollback();
+                throw err;
+            }
+            return false;
         }
         }
 
 
         /**
         /**
@@ -154,7 +166,7 @@ module.exports = app => {
          * @return {Promise<*>}
          * @return {Promise<*>}
          * @private
          * @private
          */
          */
-        async _syncOrderByDelete(transaction, reviseId, order, times) {
+        async _syncOrderByDelete(transaction, reviseId, order, times, selfOperate = '-') {
             this.initSqlBuilder();
             this.initSqlBuilder();
             this.sqlBuilder.setAndWhere('rid', {
             this.sqlBuilder.setAndWhere('rid', {
                 value: this.db.escape(reviseId),
                 value: this.db.escape(reviseId),
@@ -170,7 +182,7 @@ module.exports = app => {
             });
             });
             this.sqlBuilder.setUpdateData('audit_order', {
             this.sqlBuilder.setUpdateData('audit_order', {
                 value: 1,
                 value: 1,
-                selfOperate: '-',
+                selfOperate: selfOperate,
             });
             });
             const [sql, sqlParam] = this.sqlBuilder.build(this.tableName, 'update');
             const [sql, sqlParam] = this.sqlBuilder.build(this.tableName, 'update');
             const data = await transaction.query(sql, sqlParam);
             const data = await transaction.query(sql, sqlParam);
@@ -214,7 +226,13 @@ module.exports = app => {
          */
          */
         async start(revise, times = 1) {
         async start(revise, times = 1) {
             const audit = await this.getDataByCondition({ rid: revise.id, times, audit_order: 1 });
             const audit = await this.getDataByCondition({ rid: revise.id, times, audit_order: 1 });
-            if (!audit) throw '审核人信息错误';
+            if (!audit) {
+                if(this.ctx.tender.info.shenpi.revise === shenpiConst.sp_status.gdspl) {
+                    throw '请联系管理员添加审批人';
+                } else {
+                    throw '请先选择审批人,再上报数据';
+                }
+            }
             const time = new Date();
             const time = new Date();
 
 
             // 拷贝备份台账数据
             // 拷贝备份台账数据
@@ -683,6 +701,57 @@ module.exports = app => {
             const sqlParam = [tenderId];
             const sqlParam = [tenderId];
             return this.db.query(sql, sqlParam);
             return this.db.query(sql, sqlParam);
         }
         }
+
+        async updateNewAuditList(revise, newIdList) {
+            const transaction = await this.db.beginTransaction();
+            try {
+                // 先删除旧的审批流,再添加新的
+                transaction.delete(this.tableName, { rid: revise.id, times: revise.times });
+                const newAuditors = [];
+                let order = 1;
+                for (const aid of newIdList) {
+                    newAuditors.push({
+                        tender_id: revise.tid, audit_id: aid,
+                        times: revise.times, audit_order: order, status: auditConst.status.uncheck,
+                        rid: revise.id,in_time: new Date(),
+                    });
+                    order++;
+                }
+                if(newAuditors.length > 0) await transaction.insert(this.tableName, newAuditors);
+                await transaction.commit();
+            } catch (err) {
+                await transaction.rollback();
+                throw err;
+            }
+        }
+
+        async updateLastAudit(revise, auditList, lastId) {
+            const transaction = await this.db.beginTransaction();
+            try {
+                // 先判断auditList里的aid是否与lastId相同,相同则删除并重新更新order
+                const idList = this._.map(auditList, 'audit_id');
+                let order = idList.length + 1;
+                if (idList.indexOf(lastId) !== -1) {
+                    transaction.delete(this.tableName, { rid: revise.id, times: revise.times, audit_id: lastId });
+                    const audit = this._.find(auditList, { 'audit_id': lastId });
+                    // 顺移之后审核人流程顺序
+                    await this._syncOrderByDelete(transaction, revise.id, audit.audit_order, revise.times);
+                    order = order - 1;
+                }
+
+                // 添加终审
+                const newAuditor = {
+                    tender_id: revise.tid, audit_id: lastId,
+                    times: revise.times, audit_order: order, status: auditConst.status.uncheck,
+                    rid: revise.id, in_time: new Date(),
+                };
+                await transaction.insert(this.tableName, newAuditor);
+                await transaction.commit();
+            } catch (err) {
+                await transaction.rollback();
+                throw err;
+            }
+        }
     }
     }
 
 
     return ReviseAudit;
     return ReviseAudit;

+ 1 - 1
app/view/ledger/explode.ejs

@@ -186,7 +186,7 @@
 <script type="text/javascript">
 <script type="text/javascript">
     const readOnly = <%- ctx.tender.ledgerReadOnly %>;
     const readOnly = <%- ctx.tender.ledgerReadOnly %>;
     const tender = JSON.parse('<%- JSON.stringify(tender) %>');
     const tender = JSON.parse('<%- JSON.stringify(tender) %>');
-    const tenderInfo = JSON.parse('<%- JSON.stringify(tenderInfo) %>');
+    const tenderInfo = JSON.parse(unescape('<%- escape(JSON.stringify(tenderInfo)) %>'));
     const thousandth = <%- ctx.tender.info.display.thousandth %>;
     const thousandth = <%- ctx.tender.info.display.thousandth %>;
     const measureType = JSON.parse('<%- JSON.stringify(measureType) %>');
     const measureType = JSON.parse('<%- JSON.stringify(measureType) %>');
     let ledgerSpreadSetting = '<%- ledgerSpreadSetting %>';
     let ledgerSpreadSetting = '<%- ledgerSpreadSetting %>';

+ 45 - 46
app/view/revise/info_modal.ejs

@@ -45,6 +45,7 @@
             </div>
             </div>
             <div class="modal-body">
             <div class="modal-body">
                 <div class="dropdown text-right">
                 <div class="dropdown text-right">
+                    <% if (ctx.tender.info.shenpi.revise !== shenpiConst.sp_status.gdspl) { %>
                     <button class="btn btn-outline-primary btn-sm dropdown-toggle" type="button" id="dropdownMenuButton"
                     <button class="btn btn-outline-primary btn-sm dropdown-toggle" type="button" id="dropdownMenuButton"
                         data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
                         data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
                         添加审批流程
                         添加审批流程
@@ -69,6 +70,7 @@
                             <% }) %>
                             <% }) %>
                         </dl>
                         </dl>
                     </div>
                     </div>
+                    <% } %>
                 </div>
                 </div>
                 <div class="card mt-3">
                 <div class="card mt-3">
                     <div class="card-header">
                     <div class="card-header">
@@ -78,8 +80,11 @@
                         <ul class="list-group list-group-flush" id="auditors">
                         <ul class="list-group list-group-flush" id="auditors">
                             <% for (let i = 0, iLen = auditorList.length; i < iLen; i++) { %>
                             <% for (let i = 0, iLen = auditorList.length; i < iLen; i++) { %>
                             <li class="list-group-item" auditorId="<%- auditorList[i].audit_id %>">
                             <li class="list-group-item" auditorId="<%- auditorList[i].audit_id %>">
+                                <% if (ctx.tender.info.shenpi.revise === shenpiConst.sp_status.sqspr ||
+                                        (ctx.tender.info.shenpi.revise === shenpiConst.sp_status.gdzs && i+1 !== iLen)) { %>
                                 <a href="javascript: void(0)" class="text-danger pull-right">移除</a>
                                 <a href="javascript: void(0)" class="text-danger pull-right">移除</a>
-                                <%- auditorList[i].audit_order %> <%- auditorList[i].name %>
+                                <% } %>
+                                <span><%- auditorList[i].audit_order %> <%- auditorList[i].name %></span>
                                 <small class="text-muted"><%- auditorList[i].role %></small>
                                 <small class="text-muted"><%- auditorList[i].role %></small>
                             </li>
                             </li>
                             <% } %>
                             <% } %>
@@ -97,7 +102,7 @@
     </div>
     </div>
 </div>
 </div>
 <% } %>
 <% } %>
-<% if (revise.status === auditConst.status.checking || revise.status === auditConst.status.checkNoPre) { %>
+<% if (revise.status === auditConst.status.checking) { %>
 <% if (curAuditor && curAuditor.audit_id === ctx.session.sessionUser.accountId) { %>
 <% if (curAuditor && curAuditor.audit_id === ctx.session.sessionUser.accountId) { %>
 <<!--审批通过-->
 <<!--审批通过-->
     <div class="modal fade sp-location-list" id="sp-done" data-backdrop="static">
     <div class="modal fade sp-location-list" id="sp-done" data-backdrop="static">
@@ -542,7 +547,7 @@
                                 id="hideSp">修改审批流程</a>
                                 id="hideSp">修改审批流程</a>
                             <% } %>
                             <% } %>
                             <div class="card mt-3">
                             <div class="card mt-3">
-                                <ul class="list-group list-group-flush">
+                                <ul class="list-group list-group-flush" id="auditors-list">
                                     <% auditors.forEach((item, idx) => { %>
                                     <% auditors.forEach((item, idx) => { %>
                                     <% if (idx === 0) { %>
                                     <% if (idx === 0) { %>
                                     <li class="list-group-item" data-auditorId="<%- item.audit_id %>">
                                     <li class="list-group-item" data-auditorId="<%- item.audit_id %>">
@@ -721,6 +726,8 @@
         const cur_uid = '<%- ctx.session.sessionUser.accountId %>';
         const cur_uid = '<%- ctx.session.sessionUser.accountId %>';
         const accountList = JSON.parse('<%- JSON.stringify(accountList) %>');
         const accountList = JSON.parse('<%- JSON.stringify(accountList) %>');
         const accountGroup = JSON.parse('<%- JSON.stringify(accountGroup ) %>');
         const accountGroup = JSON.parse('<%- JSON.stringify(accountGroup ) %>');
+        const shenpi_status = <%- ctx.tender.info.shenpi.revise %>;
+        const shenpiConst = JSON.parse('<%- JSON.stringify(shenpiConst) %>');
         let timer = null;
         let timer = null;
         let oldSearchVal = null;
         let oldSearchVal = null;
 
 
@@ -768,44 +775,32 @@
         $('dl').on('click', 'dd', function () {
         $('dl').on('click', 'dd', function () {
             const auditorId = parseInt($(this).data('id'))
             const auditorId = parseInt($(this).data('id'))
             if (auditorId) {
             if (auditorId) {
-                postData('/tender/<%- ctx.tender.id %>/revise/audit/add', { auditorId }, (data) => {
+                postData('/tender/<%- ctx.tender.id %>/revise/audit/add', { auditorId }, (datas) => {
                     const html = [];
                     const html = [];
-                    html.push('<li class="list-group-item" auditorId="' + data.audit_id + '"><a href="javascript: void(0)" class="text-danger pull-right">移除</a>');
-                    html.push('<span>');
-                    html.push(data.audit_order + ' ');
-                    html.push(data.name + ' ');
-                    html.push('</span>');
-                    html.push('<small class="text-muted">');
-                    html.push(data.role);
-                    html.push('</small></li>');
-                    $('#auditors').append(html.join(''));
-
                     // 如果是重新上报,添加到重新上报列表中
                     // 如果是重新上报,添加到重新上报列表中
                     const auditorshtml = [];
                     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) + '审');
+                    for (const [index,data] of datas.entries()) {
+                        if (index !== 0) {
+                            html.push('<li class="list-group-item" auditorId="' + data.audit_id + '">');
+                            if (shenpi_status === shenpiConst.sp_status.sqspr || (shenpi_status === shenpiConst.sp_status.gdzs && index+1 !== datas.length)) {
+                                html.push('<a href="javascript: void(0)" class="text-danger pull-right">移除</a>');
+                            }
+                            html.push('<span>');
+                            html.push(data.audit_order + ' ');
+                            html.push(data.name + ' ');
+                            html.push('</span>');
+                            html.push('<small class="text-muted">');
+                            html.push(data.role);
+                            html.push('</small></li>');
+                        }
+                        auditorshtml.push('<li class="list-group-item" data-auditid="' + data.audit_id + '">');
+                        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>');
                     }
                     }
-                    // 添加新审批人
-                    auditorshtml.push('<li class="list-group-item" data-auditid="' + data.audit_id + '">');
-                    auditorshtml.push('<i class="fa fa-stop-circle"></i> ');
-                    auditorshtml.push(data.name + ' <small class="text-muted">' + data.role + '</small>');
-                    auditorshtml.push('<span class="pull-right">终审</span>');
-                    auditorshtml.push('</li>');
-                    $('#auditors-list').append(auditorshtml.join(''));
-
-                    const auditorshtml2 = [];
-                    // 重新上报时。令其它的审批人流程图标转换
-                    $('#auditors-list2 li i').removeClass('fa-stop-circle').addClass('fa-chevron-circle-down');
-                    // 添加新审批人
-                    auditorshtml2.push('<li class="list-group-item" data-auditid="' + data.audit_id + '">');
-                    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(''));
+                    $('#auditors').html(html.join(''));
+                    $('#auditors-list').html(auditorshtml.join(''));
                 });
                 });
             }
             }
         });
         });
@@ -824,19 +819,19 @@
 
 
                 // 如果是重新上报
                 // 如果是重新上报
                 // 令最后一个图标转换
                 // 令最后一个图标转换
-                $('#auditors-list li[data-auditid="' + data.auditorId + '"]').remove();
+                $('#auditors-list li[data-auditorid="' + data.auditorId + '"]').remove();
                 if ($('#auditors-list li').length !== 0 && !$('#auditors-list li i').hasClass('fa-stop-circle')) {
                 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')
                     $('#auditors-list li').eq($('#auditors-list li').length - 1).children('i')
                         .removeClass('fa-chevron-circle-down').addClass('fa-stop-circle');
                         .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');
-                }
+                // $('#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++) {
                 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)) + '审');
+                    $('#auditors-list li').eq(i).find('.pull-right').text(i === 0 ? '原报' : (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)) + '审');
                 }
                 }
             });
             });
         });
         });
@@ -893,7 +888,11 @@
                 return false;
                 return false;
             }
             }
             if ($('#auditors li').length === 0) {
             if ($('#auditors li').length === 0) {
-                toastr.error('请先选择审批人,再上报数据');
+                if(shenpi_status === shenpiConst.sp_status.gdspl) {
+                    toastr.error('请联系管理员添加审批人');
+                } else {
+                    toastr.error('请先选择审批人,再上报数据');
+                }
                 return false;
                 return false;
             }
             }
             $('#hide-all').show();
             $('#hide-all').show();

+ 1 - 1
app/view/tender/detail_modal.ejs

@@ -615,7 +615,7 @@
     </div>
     </div>
 </div>
 </div>
 <script>
 <script>
-    let property = JSON.parse('<%- JSON.stringify(tenderInfo) %>');
+    let property = JSON.parse(unescape('<%- escape(JSON.stringify(tenderInfo)) %>'));
     let ledgerChecked = <%- (tender.ledger_status === audit.ledger.status.checked) && ((lastStage !== undefined && lastStage !== null) || !revise || !revise.valid || revise.status === audit.revise.status.checked) %>;
     let ledgerChecked = <%- (tender.ledger_status === audit.ledger.status.checked) && ((lastStage !== undefined && lastStage !== null) || !revise || !revise.valid || revise.status === audit.revise.status.checked) %>;
     let firstStageChecked = <%- lastStage !== undefined && lastStage !== null && (lastStage.order > 1 || (lastStage.order === 1 && lastStage.status === audit.stage.status.checked)) %>;
     let firstStageChecked = <%- lastStage !== undefined && lastStage !== null && (lastStage.order > 1 || (lastStage.order === 1 && lastStage.status === audit.stage.status.checked)) %>;
 
 

+ 3 - 0
sql/update.sql

@@ -2,3 +2,6 @@ ALTER TABLE `zh_s2b_proj`
 ADD COLUMN `common_option`  text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '通用配置' AFTER `dagl_option`;
 ADD COLUMN `common_option`  text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '通用配置' AFTER `dagl_option`;
 
 
 ALTER TABLE `zh_tender_info` ADD `shenpi` VARCHAR(1000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '审批流程设置' AFTER `pay_account`;
 ALTER TABLE `zh_tender_info` ADD `shenpi` VARCHAR(1000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '审批流程设置' AFTER `pay_account`;
+
+ALTER TABLE `zh_material_file`
+ADD COLUMN `extra_upload` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否是审核完成后上传的,0:否、1:是' AFTER `fileext`;