浏览代码

解决qa决策大屏bug及支付审批部分提交

laiguoran 2 年之前
父节点
当前提交
a70da9e49e

+ 86 - 23
app/controller/payment_controller.js

@@ -1,6 +1,7 @@
 'use strict';
 'use strict';
 const accountGroup = require('../const/account_group').group;
 const accountGroup = require('../const/account_group').group;
 const JV = require('../reports/rpt_component/jpc_value_define');
 const JV = require('../reports/rpt_component/jpc_value_define');
+const shenpiConst = require('../const/shenpi');
 
 
 module.exports = app => {
 module.exports = app => {
 
 
@@ -58,7 +59,7 @@ module.exports = app => {
             }
             }
         }
         }
 
 
-        async paymentLoad(ctx) {
+        async listLoad(ctx) {
             const responseData = {
             const responseData = {
                 err: 0, msg: '', data: {},
                 err: 0, msg: '', data: {},
             };
             };
@@ -204,7 +205,7 @@ module.exports = app => {
          */
          */
         async detail(ctx) {
         async detail(ctx) {
             try {
             try {
-                const id = parseInt(ctx.params.id);
+                const id = parseInt(ctx.params.did);
                 if (!id) throw '参数错误';
                 if (!id) throw '参数错误';
                 const info = await ctx.service.paymentDetail.getDataById(id);
                 const info = await ctx.service.paymentDetail.getDataById(id);
                 const rptTpl = await ctx.service.rptTpl.getDataById(3029);
                 const rptTpl = await ctx.service.rptTpl.getDataById(3029);
@@ -223,40 +224,102 @@ module.exports = app => {
 
 
         async process(ctx) {
         async process(ctx) {
             try {
             try {
-                const id = parseInt(ctx.params.tid);
-                if (!id) throw '参数错误';
-                const info = await ctx.service.paymentTender.getDataById(id);
-                if (!info) throw '标段不存在';
+                const auditPermission = await this.ctx.service.paymentPermissionAudit.getOnePermission(ctx.session.sessionUser.is_admin, ctx.session.sessionUser.accountId);
+                if (!auditPermission || !auditPermission.process) {
+                    throw '权限不足';
+                }
                 // 获取报表表单列表
                 // 获取报表表单列表
                 const rptProject = await ctx.service.rptTreeNode.getDataByCondition({ name: '01.支付审批报表' });
                 const rptProject = await ctx.service.rptTreeNode.getDataByCondition({ name: '01.支付审批报表' });
-                const rptProjectList = rptProject.items ? JSON.parse(rptProject.items) : [];
-                const rptTplList = [];
-                if (rptProjectList.length > 0) {
-                    const params = { tender_id: id };
-                    for (const rpt of rptProjectList) {
-                        const rptTpl = await ctx.service.rptTpl.getDataById(rpt.ID);
-                        // 根据模板ID获取报表JSON
-                        const pageRst = ctx.service.jpcReport.getAllPreviewPagesCommon(rptTpl, 'A4');
-                        console.log(pageRst.items[0]);
-                        // return;
-                        rptTplList.push(pageRst.items[0]);
-                    }
-                }
-                const tenderRptList = await ctx.service.paymentTenderRpt.getProcessList(id, rptProjectList);
+                let rptProjectList = rptProject.items ? JSON.parse(rptProject.items) : [];
+                // const rptTplList = [];
+                // if (rptProjectList.length > 0) {
+                //     const params = { tender_id: id };
+                //     for (const rpt of rptProjectList) {
+                //         const rptTpl = await ctx.service.rptTpl.getDataById(rpt.ID);
+                //         // 根据模板ID获取报表JSON
+                //         const pageRst = ctx.service.jpcReport.getAllPreviewPagesCommon(rptTpl, 'A4');
+                //         console.log(pageRst.items[0]);
+                //         // return;
+                //         rptTplList.push(pageRst.items[0]);
+                //     }
+                // }
+                let tenderRptList = await ctx.service.paymentTenderRpt.getProcessList(ctx.tender.id, rptProjectList);
+                [tenderRptList, rptProjectList] = await ctx.service.paymentTenderRpt.checkAndUpdateList(tenderRptList, rptProjectList);
+                // for (const tr of tenderRptList) {
+                //     if (tr.status === shenpiConst.sp_status.gdspl) {
+                //         tr.auditList = await ctx.service.paymentShenpiAudit.getAuditList(ctx.tender.id, tr.id, tr.sp_status);
+                //     } else if (tr.status === shenpiConst.sp_status.gdzs) {
+                //         tr.audit = await ctx.service.paymentShenpiAudit.getAudit(ctx.tender.id, tr.id, tr.sp_status);
+                //     }
+                // }
+                // 获取所有项目参与者
+                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', 'mobile'],
+                });
+                const accountGroupList = accountGroup.map((item, idx) => {
+                    const groupList = accountList.filter(item => item.account_group === idx);
+                    return { groupName: item, groupList };
+                });
                 const renderData = {
                 const renderData = {
-                    info,
+                    tender: ctx.tender,
                     jsFiles: this.app.jsFiles.common.concat(this.app.jsFiles.payment.process),
                     jsFiles: this.app.jsFiles.common.concat(this.app.jsFiles.payment.process),
                     rptProjectList,
                     rptProjectList,
-                    rptTplList,
                     tenderRptList,
                     tenderRptList,
+                    shenpi: shenpiConst,
+                    accountList,
+                    accountGroup: accountGroupList,
                 };
                 };
                 await this.layout('payment/process.ejs', renderData, 'payment/process_modal.ejs');
                 await this.layout('payment/process.ejs', renderData, 'payment/process_modal.ejs');
             } catch (err) {
             } catch (err) {
                 console.log(err);
                 console.log(err);
                 this.log(err);
                 this.log(err);
-                ctx.redirect(this.menu.menu.dashboard.url);
+                ctx.redirect(this.request.headers.referer ? this.request.headers.referer : this.menu.menu.dashboard.url);
             }
             }
         }
         }
+
+        async processSave(ctx) {
+            try {
+                const auditPermission = await this.ctx.service.paymentPermissionAudit.getOnePermission(ctx.session.sessionUser.is_admin, ctx.session.sessionUser.accountId);
+                if (!auditPermission || !auditPermission.process) {
+                    throw '权限不足';
+                }
+                const responseData = {
+                    err: 0, msg: '', data: {},
+                };
+
+                const data = JSON.parse(ctx.request.body.data);
+                if (!data.type) {
+                    throw '提交数据错误';
+                }
+                switch (data.type) {
+                    case 'add-rpt':
+                        responseData.data = await ctx.service.paymentTenderRpt.setRpt(ctx.tender.id, data.rpt_list);
+                        break;
+                    case 'change-status':
+                        responseData.data = await ctx.service.paymentTenderRpt.setStatus(data.tr_id, data.status);
+                        break;
+                    case 'get-audits':
+                        responseData.data = await ctx.service.paymentShenpiAudit.getShenpiAudit(data.tr_id, data.status);
+                        break;
+                    case 'add-audit':
+                        responseData.data = await ctx.service.paymentShenpiAudit.addAudit(data);
+                        break;
+                    case 'del-audit':
+                        responseData.data = await ctx.service.paymentShenpiAudit.removeAudit(data);
+                        break;
+                    default: throw '参数有误';
+                }
+                ctx.body = responseData;
+            } catch (err) {
+                this.log(err);
+                ctx.body = { err: 1, msg: err.toString(), data: null };
+            }
+        }
+
+        async rptList(ctx) {
+
+        }
     }
     }
 
 
     return PaymentController;
     return PaymentController;

+ 67 - 0
app/middleware/payment_tender_check.js

@@ -0,0 +1,67 @@
+'use strict';
+
+/**
+ *
+ *
+ * @author Mai
+ * @date
+ * @version
+ */
+
+const auditConst = require('../const/audit').ledger;
+const messageType = require('../const/message_type');
+const scPermission = require('../const/schedule').permission;
+
+module.exports = options => {
+    /**
+     * 标段校验 中间件
+     * 1. 读取标段数据(包括属性)
+     * 2. 检验用户是否可见标段(不校验具体权限)
+     *
+     * @param {function} next - 中间件继续执行的方法
+     * @return {void}
+     */
+    return function* paymentTenderCheck(next) {
+        try {
+            if (!this.params.id) {
+                throw '当前未打开标段';
+            }
+            const tender = yield this.service.paymentTender.getDataById(this.params.id);
+            if (!tender) {
+                throw '标段不存在';
+            }
+            this.tender = tender;
+            yield next;
+        } catch (err) {
+            // 输出错误到日志
+            if (err.stack) {
+                this.logger.error(err);
+            } else {
+                this.session.message = {
+                    type: messageType.ERROR,
+                    icon: 'exclamation-circle',
+                    message: err,
+                };
+                this.getLogger('fail').info(JSON.stringify({
+                    error: err,
+                    project: this.session.sessionProject,
+                    user: this.session.sessionUser,
+                    body: this.session.body,
+                }));
+            }
+            if (this.helper.isAjax(this.request)) {
+                if (err.stack) {
+                    this.body = {err: 4, msg: '标段数据未知错误', data: null};
+                } else {
+                    this.body = {err: 3, msg: err.toString(), data: null};
+                }
+            } else {
+                if (this.helper.isWap(this.request)) {
+                    this.redirect('/wap/list');
+                } else {
+                    err === '您无权查看该内容' ? this.redirect(this.request.headers.referer) : this.redirect('/payment');
+                }
+            }
+        }
+    };
+};

+ 1 - 1
app/public/js/payment_index.js

@@ -129,7 +129,7 @@ $(function () {
     }
     }
 
 
     // 首次加载展示目录
     // 首次加载展示目录
-    postData('/payment/load', {}, function (result) {
+    postData('/payment/list/load', {}, function (result) {
         allFolders = result.folderList;
         allFolders = result.folderList;
         allTenders = result.tenderList;
         allTenders = result.tenderList;
         makeList(result.folderList, result.tenderList);
         makeList(result.folderList, result.tenderList);

+ 339 - 0
app/public/js/payment_process.js

@@ -1,3 +1,342 @@
 $(function () {
 $(function () {
     autoFlashHeight();
     autoFlashHeight();
+
+    // 全选报表
+    $('#select_all_rpt_checkbox').click(function () {
+        $('#rpt_table input[name="rptId[]"]').prop('checked', true);
+        $(this).prop('checked', false);
+    });
+
+    $('#add_rpt_btn').click(function () {
+        const checkArray = [];
+        $('#rpt_table input[name="rptId[]"]:checked').each(function() {
+            checkArray.push({
+                id: parseInt($(this).val()),
+                name: $(this).attr('data-name'),
+            }); //向数组中添加元素
+        });
+        postData('/payment/' + tenderId + '/process/save', { type: 'add-rpt', rpt_list: checkArray }, function (result) {
+            const html = [];
+            for (const data of result) {
+                html.push(`<tr data-id="${data.id}">\n`);
+                html.push(`<td>${data.rpt_name}</td>\n`);
+                html.push(`<td>${data.user_name}</td>\n`);
+                html.push('</tr>\n');
+            }
+            $('#tender_rpt_table').html(html.join(''));
+            $('#add-rpt').modal('hide');
+            tenderRptList = result;
+        })
+    });
+
+    let timer = null;
+    let oldSearchVal = null;
+    $('body').on('input propertychange', '.gr-search', function(e) {
+        oldSearchVal = e.target.value;
+        timer && clearTimeout(timer);
+        timer = setTimeout(() => {
+            const newVal = $(this).val();
+            const code = $(this).attr('data-trid');
+            let html = '';
+            if (newVal && newVal === oldSearchVal) {
+                accountList.filter(item => item && item.id !== cur_uid && (item.name.indexOf(newVal) !== -1 || (item.mobile && item.mobile.indexOf(newVal) !== -1))).forEach(item => {
+                    html += `<dd class="border-bottom p-2 mb-0 " data-id="${item.id}" >
+                        <p class="mb-0 d-flex"><span class="text-primary">${item.name}</span><span
+                                class="ml-auto">${item.mobile || ''}</span></p>
+                        <span class="text-muted">${item.role || ''}</span>
+                    </dd>`
+                });
+                $('#' + code + '_dropdownMenu .book-list').empty();
+                $('#' + code + '_dropdownMenu .book-list').append(html);
+            } else {
+                if (!$('#' + code + '_dropdownMenu .acc-btn').length) {
+                    accountGroup.forEach((group, idx) => {
+                        if (!group) return;
+                        html += `<dt><a href="javascript: void(0);" class="acc-btn" data-groupid="${idx}" data-type="hide"><i class="fa fa-plus-square"></i>
+                        </a> ${group.groupName}</dt>
+                        <div class="dd-content" data-toggleid="${idx}">`;
+                        group.groupList.forEach(item => {
+                            if (item.id !== cur_uid) {
+                                html += `<dd class="border-bottom p-2 mb-0 " data-id="${item.id}" >
+                                    <p class="mb-0 d-flex"><span class="text-primary">${item.name}</span><span
+                                            class="ml-auto">${item.mobile || ''}</span></p>
+                                    <span class="text-muted">${item.role || ''}</span>
+                                </dd>`;
+                            }
+                        });
+                        html += '</div>';
+                    });
+                    $('#' + code + '_dropdownMenu .book-list').empty();
+                    $('#' + code + '_dropdownMenu .book-list').append(html);
+                }
+            }
+        }, 400);
+    });
+
+    function setLcShowHtml(this_status, this_tr_id, data) {
+        if (this_status === sp_status.sqspr) {
+            $('#process_set').find('.lc-show').html('');
+        } else if (this_status === sp_status.gdspl) {
+            let addhtml = '<ul class="list-unstyled">\n';
+            if (data.length !== 0) {
+                for(const [i, audit] of data.entries()) {
+                    addhtml += makeAudit(audit, transFormToChinese(i+1));
+                }
+                addhtml += '<li class="pl-3"><a href="javascript:void(0);" class="add-audit"><i class="fa fa-plus"></i> 添加流程</a></li>';
+            } else {
+                addhtml += makeSelectAudit(this_tr_id, '一');
+            }
+            addhtml += '</ul>\n';
+            $('#process_set').find('.lc-show').html(addhtml);
+
+        } else if (this_status === sp_status.gdzs) {
+            let addhtml = '<ul class="list-unstyled">\n' +
+                '                                        <li class="d-flex justify-content-start mb-3">\n' +
+                '                                            <span class="col-auto">授权审批人</span>\n' +
+                '                                            <span class="col-7">\n' +
+                '                                                <span class="d-inline-block"></span>\n' +
+                '                                            </span>\n' +
+                '                                        </li>\n';
+            addhtml += data ? makeAudit(data) : makeSelectAudit(this_tr_id);
+            addhtml += '</ul>\n';
+            $('#process_set').find('.lc-show').html(addhtml);
+        }
+    }
+
+    // 初始化选中table
+    if ($('#tender_rpt_table tr').length > 0) {
+        $('#tender_rpt_table tr').eq(0).addClass('table-warning');
+        const tr_id = parseInt($('#tender_rpt_table tr').eq(0).attr('data-id'));
+        $('#process_set').show();
+        makeProcess(tr_id);
+    }
+
+    // 选中切换table
+    $('#tender_rpt_table tr').click(function () {
+        if (!$(this).hasClass('table-warning')) {
+            $('#tender_rpt_table tr').removeClass('table-warning');
+            $(this).addClass('table-warning');
+            const tr_id = parseInt($(this).attr('data-id'));
+            makeProcess(tr_id);
+        }
+    });
+
+    // 初始化审批流程
+    function makeProcess(tr_id) {
+        const trInfo = _.find(tenderRptList, { id: tr_id });
+        $('#process_set').find('.card-title').text(trInfo.rpt_name);
+        $('#process_set input[name="tender_process"][value="'+ trInfo.sp_status +'"]').prop('checked', true);
+        const spt = sp_status_list[trInfo.sp_status];
+        $('#process_set').find('.alert-warning').text(spt.name + ':' + spt.msg);
+        const prop = {
+            type: 'get-audits',
+            tr_id: trInfo.id,
+            status: trInfo.sp_status,
+        };
+        postData('/payment/' + tenderId + '/process/save', prop, function (data) {
+            setLcShowHtml(trInfo.sp_status, trInfo.id, data);
+        });
+    }
+
+    // 添加审批流程按钮逻辑
+    $('body').on('click', '.book-list dt', function () {
+        const idx = $(this).find('.acc-btn').attr('data-groupid');
+        const type = $(this).find('.acc-btn').attr('data-type');
+        if (type === 'hide') {
+            $(this).parent().find(`div[data-toggleid="${idx}"]`).show(() => {
+                $(this).children().find('i').removeClass('fa-plus-square').addClass('fa-minus-square-o');
+                $(this).find('.acc-btn').attr('data-type', 'show');
+
+            })
+        } else {
+            $(this).parent().find(`div[data-toggleid="${idx}"]`).hide(() => {
+                $(this).children().find('i').removeClass('fa-minus-square-o').addClass('fa-plus-square');
+                $(this).find('.acc-btn').attr('data-type', 'hide');
+            })
+        }
+        return false;
+    });
+
+
+    // 更改审批流程状态
+    $('#process_set .form-check input').on('change', function () {
+        // 获取所有审批的checked值并更新
+        const this_status = parseInt($(this).val());
+        const this_tr_id = parseInt($('#tender_rpt_table').find('.table-warning').attr('data-id'));
+        const spt = sp_status_list[this_status];
+        $(this).parents('.form-group').siblings('.alert-warning').text(spt.name + ':' + spt.msg);
+        // 拼接post json
+        const prop = {
+            type: 'change-status',
+            tr_id: this_tr_id,
+            status: this_status
+        };
+        postData('/payment/' + tenderId + '/process/save', prop, function (data) {
+            setLcShowHtml(this_status, this_tr_id, data);
+        });
+    });
+
+    // 选中审批人
+    $('body').on('click', 'dl dd', function () {
+        const id = parseInt($(this).data('id'));
+        if (!id) return;
+
+        let this_tr_id = parseInt($('#tender_rpt_table').find('.table-warning').attr('data-id'));
+        if (!this_tr_id) this_tr_id = $(this).parents('.dropdown').attr('data-trid');
+        const user = _.find(accountList, function (item) {
+            return item.id === id;
+        });
+
+        const this_status = parseInt($(this).parents('.lc-show').siblings('.form-group').find('input:checked').val());
+        if (this_status === sp_status.gdspl) {
+            // 判断是否已存在审批人
+            const aid_num = $(this).parents('ul').find('.remove-audit').length;
+            for (let i = 0; i < aid_num; i++) {
+                const aid = parseInt($(this).parents('ul').find('.remove-audit').eq(i).data('id'));
+                if (aid === id) {
+                    toastr.warning('该审核人已存在,请勿重复添加');
+                    return;
+                }
+            }
+
+        }
+        const prop = {
+            status: this_status,
+            tr_id: this_tr_id,
+            audit_id: id,
+            type: 'add-audit',
+        };
+        const _self = $(this);
+        postData('/payment/' + tenderId + '/process/save', prop, function (data) {
+            if (this_status === sp_status.gdspl) {
+                _self.parents('ul').append('<li class="pl-3"><a href="javascript:void(0);" class="add-audit"><i class="fa fa-plus"></i> 添加流程</a></li>');
+            }
+            _self.parents('.spr-span').html('<span class="d-inline-block"></span>\n' +
+                '<span class="d-inline-block"><span class="badge badge-light">'+ user.name +' <span class="dropdown">\n' +
+                '                                                            <a href="javascript:void(0);" class="btn-sm text-danger px-1" title="移除" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"><i class="fa fa-remove"></i></a>\n' +
+                '                                                            <div class="dropdown-menu">\n' +
+                '                                                                <a class="dropdown-item" href="javascript:void(0);">确认移除审批人?</a>\n' +
+                '                                                                <div class="dropdown-divider"></div>\n' +
+                '                                                                <div class="px-2 py-1 text-center">\n' +
+                '                                                                    <button class="remove-audit btn btn-sm btn-danger" data-id="' + user.id + '">移除</button>\n' +
+                '                                                                    <button class="btn btn-sm btn-secondary">取消</button>\n' +
+                '                                                                </div>\n' +
+                '                                                            </div>\n' +
+                '                                                        </span> ' +
+                '                                            </span></span></span>\n');
+            // <a href="javascript:void(0);" class="remove-audit btn-sm text-danger px-1" title="移除" data-id="'+ user.id +'"><i class="fa fa-remove"></i></a></span> </span>');
+        });
+    });
+
+    // 移除审批人
+    $('body').on('click', '.remove-audit', function () {
+        const id = parseInt($(this).data('id'));
+        const this_status = parseInt($(this).parents('.lc-show').siblings('.form-group').find('input:checked').val());
+        const this_tr_id = parseInt($('#tender_rpt_table').find('.table-warning').attr('data-id'));
+        const prop = {
+            status: this_status,
+            tr_id: this_tr_id,
+            audit_id: id,
+            type: 'del-audit',
+        };
+        const _self = $(this);
+        postData('/payment/' + tenderId + '/process/save', prop, function (data) {
+            if (this_status === sp_status.gdspl) {
+                const _selflc = _self.parents('.lc-show');
+                _self.parents('li').remove();
+                const aid_num = parseInt(_selflc.children('ul').find('li.d-flex').length);
+                if (aid_num === 0) {
+                    let addhtml = '<ul class="list-unstyled">\n';
+                    addhtml += makeSelectAudit(this_tr_id, '一');
+                    addhtml += '</ul>\n';
+                    _selflc.html(addhtml);
+                } else {
+                    for (let i = 0; i < aid_num; i++) {
+                        _selflc.find('li.d-flex').eq(i).find('.col-auto').text(transFormToChinese(i+1) + '审');
+                    }
+                }
+            } else if (this_status === sp_status.gdzs) {
+                let addhtml = '<ul class="list-unstyled">\n' +
+                    '                                        <li class="d-flex justify-content-start mb-3">\n' +
+                    '                                            <span class="col-auto">授权审批人</span>\n' +
+                    '                                            <span class="col-7">\n' +
+                    '                                                <span class="d-inline-block"></span>\n' +
+                    '                                            </span>\n' +
+                    '                                        </li>\n';
+                addhtml += makeSelectAudit(this_tr_id);
+                addhtml += '</ul>\n';
+                _self.parents('.lc-show').html(addhtml);
+            }
+        })
+    });
+
+    // 固定审批流-添加流程
+    $('body').on('click', '.add-audit', function () {
+        const num = $(this).parents('ul').children('li').length;
+        const this_tr_id = parseInt($('#tender_rpt_table').find('.table-warning').attr('data-id'));
+        const addhtml = makeSelectAudit(this_tr_id, transFormToChinese(num));
+        $(this).parents('ul').append(addhtml);
+        $(this).parents('li').remove();
+    });
+
+    // 审批流程-审批人html 生成
+    function makeAudit(audit, i = '终') {
+        return '<li class="d-flex justify-content-start mb-3">\n' +
+            '                                            <span class="col-auto">'+ i +'审</span>\n' +
+            '                                            <span class="col-7 spr-span">\n' +
+            '                                            <span class="d-inline-block"></span>\n' +
+            '                                            <span class="d-inline-block"><span class="badge badge-light">'+ audit.name +' <span class="dropdown">\n' +
+            '                                                            <a href="javascript:void(0);" class="btn-sm text-danger px-1" title="移除" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"><i class="fa fa-remove"></i></a>\n' +
+            '                                                            <div class="dropdown-menu">\n' +
+            '                                                                <a class="dropdown-item" href="javascript:void(0);">确认移除审批人?</a>\n' +
+            '                                                                <div class="dropdown-divider"></div>\n' +
+            '                                                                <div class="px-2 py-1 text-center">\n' +
+            '                                                                    <button class="remove-audit btn btn-sm btn-danger" data-id="' + audit.audit_id + '">移除</button>\n' +
+            '                                                                    <button class="btn btn-sm btn-secondary">取消</button>\n' +
+            '                                                                </div>\n' +
+            '                                                            </div>\n' +
+            '                                                        </span> ' +
+            // '<a href="javascript:void(0);" class="remove-audit btn-sm text-danger px-1" title="移除" data-id="'+ audit.audit_id +'"><i class="fa fa-remove"></i></a></span> </span>\n' +
+            '                                            </span></span></span>\n' +
+            '                                        </li>';
+    }
+
+    // 审批流程-选择审批人html 生成
+    function makeSelectAudit(tr_id, i = '终') {
+        let divhtml = '';
+        accountGroup.forEach((group, idx) => {
+            let didivhtml = '';
+            if(group) {
+                group.groupList.forEach(item => {
+                    didivhtml += item.id !== cur_uid ? '<dd class="border-bottom p-2 mb-0 " data-id="' + item.id + '" >\n' +
+                        '<p class="mb-0 d-flex"><span class="text-primary">' + item.name + '</span><span\n' +
+                        '                                                                                class="ml-auto">' + item.mobile + '</span></p>\n' +
+                        '                                                                    <span class="text-muted">' + item.role + '</span>\n' +
+                        '                                                                    </dd>\n' : '';
+                });
+                divhtml += '<dt><a href="javascript: void(0);" class="acc-btn" data-groupid="' + idx + '" data-type="hide"><i class="fa fa-plus-square"></i></a> ' + group.groupName + '</dt>\n' +
+                    '                                                                <div class="dd-content" data-toggleid="' + idx + '">\n' + didivhtml +
+                    '                                                                </div>\n';
+            }
+        });
+        let html = '<li class="d-flex justify-content-start mb-3">\n' +
+            '                                            <span class="col-auto">' + i + '审</span>\n' +
+            '                                            <span class="col-7 spr-span">\n' +
+            '                                            <span class="d-inline-block">\n' +
+            '                                                <div class="dropdown text-right">\n' +
+            '                                                    <button class="btn btn-outline-primary btn-sm dropdown-toggle" type="button" id="' + tr_id + '_dropdownMenuButton" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">\n' +
+            '                                                        选择审批人\n' +
+            '                                                    </button>\n' +
+            '                                                    <div class="dropdown-menu dropdown-menu-right" id="' + tr_id + '_dropdownMenu" aria-labelledby="' + tr_id + '_dropdownMenuButton" style="width:220px">\n' +
+            '                                                        <div class="mb-2 p-2"><input class="form-control form-control-sm gr-search"\n' +
+            '                                                                                     placeholder="姓名/手机 检索" autocomplete="off" data-trid="' + tr_id + '"></div>\n' +
+            '                                                        <dl class="list-unstyled book-list">\n' + divhtml +
+            '                                                        </dl>\n' +
+            '                                                    </div>\n' +
+            '                                                </div>\n' +
+            '                                            </span>\n' +
+            '                                        </span>\n' +
+            '                                        </li>';
+        return html;
+    }
 });
 });

+ 7 - 3
app/router.js

@@ -40,6 +40,8 @@ module.exports = app => {
     // 修订
     // 修订
     const reviseCheck = app.middlewares.reviseCheck();
     const reviseCheck = app.middlewares.reviseCheck();
     const budgetCheck = app.middlewares.budgetCheck();
     const budgetCheck = app.middlewares.budgetCheck();
+    // 支付审批中间件
+    const paymentTenderCheck = app.middlewares.paymentTenderCheck();
     // 登入登出相关
     // 登入登出相关
     app.get('/login', 'loginController.index');
     app.get('/login', 'loginController.index');
     app.get('/login/:code', 'loginController.index');
     app.get('/login/:code', 'loginController.index');
@@ -718,10 +720,12 @@ module.exports = app => {
     // 支付审批
     // 支付审批
     app.get('/payment', sessionAuth, 'paymentController.index');
     app.get('/payment', sessionAuth, 'paymentController.index');
     app.post('/payment/permission/save', sessionAuth, 'paymentController.permissionSave');
     app.post('/payment/permission/save', sessionAuth, 'paymentController.permissionSave');
-    app.get('/payment/:tid/detail/:id', sessionAuth, 'paymentController.detail');
+    app.get('/payment/:id/detail/:did', sessionAuth, 'paymentController.detail');
     app.post('/payment/save', sessionAuth, 'paymentController.save');
     app.post('/payment/save', sessionAuth, 'paymentController.save');
-    app.post('/payment/load', sessionAuth, 'paymentController.paymentLoad');
-    app.get('/payment/:tid/process', sessionAuth, 'paymentController.process');
+    app.post('/payment/list/load', sessionAuth, 'paymentController.listLoad');
+    app.get('/payment/:id/process', sessionAuth, paymentTenderCheck, 'paymentController.process');
+    app.post('/payment/:id/process/save', sessionAuth, paymentTenderCheck, 'paymentController.processSave');
+    app.post('/payment/:id/rpt', sessionAuth, paymentTenderCheck, 'paymentController.rptList');
 
 
     // 企业微信回调
     // 企业微信回调
     app.get('/wx/work/callback/command', 'wechatController.command');
     app.get('/wx/work/callback/command', 'wechatController.command');

+ 5 - 0
app/service/payment_detail.js

@@ -6,6 +6,11 @@ module.exports = app => {
             super(ctx);
             super(ctx);
             this.tableName = 'payment_detail';
             this.tableName = 'payment_detail';
         }
         }
+
+        async hadDetail(trId) {
+            const result = await this.count({ tr_id: trId });
+            return result !== 0;
+        }
     }
     }
     return PaymentDetail;
     return PaymentDetail;
 };
 };

+ 87 - 0
app/service/payment_shenpi_audit.js

@@ -0,0 +1,87 @@
+'use strict';
+
+/**
+ * 版本数据模型
+ *
+ * @author CaiAoLin
+ * @date 2017/10/25
+ * @version
+ */
+const shenpiConst = require('../const/shenpi');
+
+module.exports = app => {
+
+    class PaymentShenpiAudit extends app.BaseService {
+
+        /**
+         * 构造函数
+         *
+         * @param {Object} ctx - egg全局变量
+         * @return {void}
+         */
+        constructor(ctx) {
+            super(ctx);
+            this.tableName = 'payment_shenpi_audit';
+        }
+
+        async getShenpiAudit(tr_id, status) {
+            if (status === shenpiConst.sp_status.gdspl) {
+                return await this.getAuditList(this.ctx.tender.id, tr_id, status);
+            } else if (status === shenpiConst.sp_status.gdzs) {
+                return await this.getAudit(this.ctx.tender.id, tr_id, status);
+            }
+        }
+
+        async getAudit(tid, tr_id, status) {
+            const sql = 'SELECT sp.audit_id, pa.name FROM ?? AS sp LEFT JOIN ?? AS pa ON sp.audit_id = pa.id' +
+                ' WHERE sp.tid = ? AND sp.tr_id = ? AND sp.sp_status = ?';
+            const sqlParam = [this.tableName, this.ctx.service.projectAccount.tableName, tid, tr_id, status];
+            return await this.db.queryOne(sql, sqlParam);
+        }
+
+        async getAuditList(tid, tr_id, status) {
+            const sql = 'SELECT sp.audit_id, pa.name FROM ?? AS sp LEFT JOIN ?? AS pa ON sp.audit_id = pa.id' +
+                ' WHERE sp.tid = ? AND sp.tr_id = ? AND sp.sp_status = ? ORDER BY sp.id ASC';
+            const sqlParam = [this.tableName, this.ctx.service.projectAccount.tableName, tid, tr_id, status];
+            return await this.db.query(sql, sqlParam);
+        }
+
+        async addAudit(data) {
+            const transaction = await this.db.beginTransaction();
+            try {
+                const insertData = {
+                    tid: this.ctx.tender.id,
+                    tr_id: data.tr_id,
+                    sp_status: data.status,
+                    audit_id: data.audit_id,
+                };
+                await transaction.insert(this.tableName, insertData);
+                await transaction.commit();
+                return await this.getShenpiAudit(data.tr_id, data.status);
+            } catch (err) {
+                await transaction.rollback();
+                throw err;
+            }
+        }
+
+        async removeAudit(data) {
+            const transaction = await this.db.beginTransaction();
+            try {
+                const delData = {
+                    tid: this.ctx.tender.id,
+                    tr_id: data.tr_id,
+                    sp_status: data.status,
+                    audit_id: data.audit_id,
+                };
+                await transaction.delete(this.tableName, delData);
+                await transaction.commit();
+                return await this.getShenpiAudit(data.tr_id, data.status);
+            } catch (err) {
+                await transaction.rollback();
+                throw err;
+            }
+        }
+    }
+
+    return PaymentShenpiAudit;
+};

+ 91 - 9
app/service/payment_tender_rpt.js

@@ -16,20 +16,30 @@ module.exports = app => {
             this.tableName = 'payment_tender_rpt';
             this.tableName = 'payment_tender_rpt';
         }
         }
 
 
-        async getProcessList(id, rptProjectList) {
+        async getProcessList(id) {
             const sql = 'SELECT ptr.*, pa.name as user_name FROM ?? as ptr LEFT JOIN ?? as pa ON ptr.`uid` = pa.`id` WHERE ptr.`tender_id` = ?';
             const sql = 'SELECT ptr.*, pa.name as user_name FROM ?? as ptr LEFT JOIN ?? as pa ON ptr.`uid` = pa.`id` WHERE ptr.`tender_id` = ?';
             const params = [this.tableName, this.ctx.service.projectAccount.tableName, id];
             const params = [this.tableName, this.ctx.service.projectAccount.tableName, id];
-            const tenderRptList = await this.db.query(sql, params);
+            return await this.db.query(sql, params);
+        }
+
+        async checkAndUpdateList(tenderRptList, rptProjectList) {
             if (tenderRptList.length > 0) {
             if (tenderRptList.length > 0) {
                 const updateDatas = [];
                 const updateDatas = [];
+                const delDatas = [];
                 for (const tr of tenderRptList) {
                 for (const tr of tenderRptList) {
                     const rptInfo = this._.find(rptProjectList, { ID: tr.rpt_id });
                     const rptInfo = this._.find(rptProjectList, { ID: tr.rpt_id });
+                    // 判断是否已经新建过报表次
+                    const had_rpt = await this.ctx.service.paymentDetail.hadDetail(tr.id);
                     if (tr.is_del === 0 && !rptInfo) {
                     if (tr.is_del === 0 && !rptInfo) {
-                        updateDatas.push({
-                            id: tr.id,
-                            is_del: 1,
-                        });
-                        tr.is_del = 1;
+                        if (had_rpt) {
+                            updateDatas.push({
+                                id: tr.id,
+                                is_del: 1,
+                            });
+                            tr.is_del = 1;
+                        } else {
+                            delDatas.push(tr.id);
+                        }
                     } else if (rptInfo && tr.rpt_name !== rptInfo.name) {
                     } else if (rptInfo && tr.rpt_name !== rptInfo.name) {
                         updateDatas.push({
                         updateDatas.push({
                             id: tr.id,
                             id: tr.id,
@@ -37,11 +47,83 @@ module.exports = app => {
                         });
                         });
                         tr.rpt_name = rptInfo.name;
                         tr.rpt_name = rptInfo.name;
                     }
                     }
-                    tr.rpt_sign_audit_num = 0;
+                    rptInfo.had_rpt = had_rpt;
                 }
                 }
                 if (updateDatas.length > 0) await this.db.updateRows(this.tableName, updateDatas);
                 if (updateDatas.length > 0) await this.db.updateRows(this.tableName, updateDatas);
+                if (delDatas.length > 0) {
+                    this._.remove(tenderRptList, function(item) {
+                        return delDatas.indexOf(item.id) !== -1;
+                    });
+                    await this.db.delete(this.tableName, { id: delDatas });
+                }
+            }
+            return [tenderRptList, rptProjectList];
+        }
+
+        async setRpt(tid, rpt_list) {
+            const transaction = await this.db.beginTransaction();
+            try {
+                const originList = await this.getAllDataByCondition({ where: { tender_id: tid, is_del: 0 } });
+                const insertData = [];
+                let deleteData = [];
+                if (originList.length === 0 && rpt_list.length !== 0) {
+                    // 添加到tender_rpt
+                    for (const rpt of rpt_list) {
+                        insertData.push({
+                            tender_id: tid,
+                            rpt_id: rpt.id,
+                            rpt_name: rpt.name,
+                            uid: this.ctx.session.sessionUser.accountId,
+                            in_time: new Date(),
+                        });
+                    }
+                } else if (originList.length !== 0 && rpt_list.length === 0) {
+                    // 删除原有
+                    deleteData = this._.map(originList, 'id');
+                } else if (originList.length !== 0 && rpt_list.length !== 0) {
+                    const orginRptIds = this._.map(originList, 'rpt_id');
+                    const newIds = this._.map(rpt_list, 'id');
+                    console.log(orginRptIds, newIds);
+                    const insertRptIds = this._.difference(newIds, orginRptIds);
+                    const deleteRptIds = this._.difference(orginRptIds, newIds);
+                    if (deleteRptIds.length > 0) {
+                        for (const id of deleteRptIds) {
+                            const orginInfo = this._.find(originList, { rpt_id: id });
+                            deleteData.push(orginInfo.id);
+                        }
+                    }
+                    console.log(insertRptIds, deleteData);
+                    for (const id of insertRptIds) {
+                        const info = this._.find(rpt_list, { id });
+                        insertData.push({
+                            tender_id: tid,
+                            rpt_id: id,
+                            rpt_name: info.name,
+                            uid: this.ctx.session.sessionUser.accountId,
+                            in_time: new Date(),
+                        });
+                    }
+                }
+                if (insertData.length > 0) await transaction.insert(this.tableName, insertData);
+                if (deleteData.length > 0) await transaction.delete(this.tableName, { id: deleteData });
+                await transaction.commit();
+                return await this.getProcessList(tid);
+            } catch (err) {
+                await transaction.rollback();
+                throw err;
+            }
+        }
+
+        async setStatus(id, sp_status) {
+            const transaction = await this.db.beginTransaction();
+            try {
+                await transaction.update(this.tableName, { id, sp_status });
+                await transaction.commit();
+                return await this.ctx.service.paymentShenpiAudit.getShenpiAudit(id, sp_status);
+            } catch (err) {
+                await transaction.rollback();
+                throw err;
             }
             }
-            return tenderRptList;
         }
         }
     }
     }
     return paymentTenderRpt;
     return paymentTenderRpt;

+ 53 - 270
app/view/payment/process.ejs

@@ -84,288 +84,62 @@
                         </div>
                         </div>
                         <div class="tab-pane fade" id="profile" role="tabpanel" aria-labelledby="profile-tab">
                         <div class="tab-pane fade" id="profile" role="tabpanel" aria-labelledby="profile-tab">
                             <div class="row">
                             <div class="row">
-                                <div class="col-4">
-                                    <div class="my-3"><a href="#add-rpt" data-toggle="modal" data-target="#add-rpt">添加表单</a></div>
+                                <div class="col-4 mt-3">
                                     <table class="table table-bordered">
                                     <table class="table table-bordered">
                                         <thead>
                                         <thead>
                                         <tr>
                                         <tr>
                                             <th>名称</th>
                                             <th>名称</th>
                                             <th>添加人</th>
                                             <th>添加人</th>
-                                            <th>表单角色</th>
                                         </tr>
                                         </tr>
                                         </thead>
                                         </thead>
-                                        <tbody>
-                                        <tr>
-                                            <td>指挥部工程结算款</td>
-                                            <td>管理员</td>
-                                            <td>6</td>
-                                        </tr>
-                                        <tr>
-                                            <td>指挥部工程结算付款</td>
-                                            <td>管理员</td>
-                                            <td>6</td>
-                                        </tr>
-                                        <tr>
-                                            <td>指挥部监理、设计等预付款</td>
-                                            <td>管理员</td>
-                                            <td>7</td>
-                                        </tr>
-                                        <tr>
-                                            <td>指挥部监理、设计等结算款</td>
-                                            <td>邓莹洁</td>
-                                            <td>4</td>
-                                        </tr>
-                                        <tr>
-                                            <td>招标文件合同送审单</td>
-                                            <td>邓莹洁</td>
-                                            <td>4</td>
+                                        <tbody id="tender_rpt_table">
+                                        <% for (const tr of tenderRptList) { %>
+                                        <% if (tr.is_del === 0) { %>
+                                        <tr data-id="<%- tr.id %>">
+                                            <td><%- tr.rpt_name  %></td>
+                                            <td><%- tr.user_name %></td>
                                         </tr>
                                         </tr>
+                                        <% } %>
+                                        <% } %>
                                         </tbody>
                                         </tbody>
                                     </table>
                                     </table>
+                                    <div class="my-3"><a href="#add-rpt" data-toggle="modal" data-target="#add-rpt">添加表单</a></div>
                                 </div>
                                 </div>
                                 <div class="col-8">
                                 <div class="col-8">
-                                    <ul class="nav nav-tabs my-2" id="myTab" role="tablist">
-                                        <li class="nav-item">
-                                            <a class="nav-link active" id="home-tab" data-toggle="tab" href="#role" role="tab" aria-controls="role" aria-selected="true">表单角色</a>
-                                        </li>
-                                        <li class="nav-item">
-                                            <a class="nav-link" id="profile-tab" data-toggle="tab" href="#process" role="tab" aria-controls="process" aria-selected="false">审批流程</a>
-                                        </li>
-                                    </ul>
-                                    <div class="tab-content" id="myTabContent">
-                                        <div class="tab-pane fade show active" id="role" role="tabpanel" aria-labelledby="home-tab">
-                                            <div class="row">
-                                                <div class="col-6">
-                                                    <table class="table table-bordered">
-                                                        <thead>
-                                                        <tr>
-                                                            <th>序号</th>
-                                                            <th>表单角色</th>
-                                                            <th>不参与审批</th>
-                                                            <th>签字签章</th>
-                                                        </tr>
-                                                        </thead>
-                                                        <tbody>
-                                                        <tr>
-                                                            <td>1</td>
-                                                            <td>监理公司</td>
-                                                            <td><input type="checkbox"></td>
-                                                            <td></td>
-                                                        </tr>
-                                                        <tr>
-                                                            <td>2</td>
-                                                            <td>造价咨询单位</td>
-                                                            <td><input type="checkbox"></td>
-                                                            <td></td>
-                                                        </tr>
-                                                        <tr>
-                                                            <td>3</td>
-                                                            <td>经办人</td>
-                                                            <td><input type="checkbox"></td>
-                                                            <td></td>
-                                                        </tr>
-                                                        <tr>
-                                                            <td>4</td>
-                                                            <td>合同管理人</td>
-                                                            <td><input type="checkbox"></td>
-                                                            <td></td>
-                                                        </tr>
-                                                        <tr>
-                                                            <td>5</td>
-                                                            <td>相关科室负责人</td>
-                                                            <td><input type="checkbox" checked></td>
-                                                            <td></td>
-                                                        </tr>
-                                                        <tr>
-                                                            <td>6</td>
-                                                            <td>计划财务科科长</td>
-                                                            <td><input type="checkbox"></td>
-                                                            <td></td>
-                                                        </tr>
-                                                        <tr>
-                                                            <td>7</td>
-                                                            <td>分管领导</td>
-                                                            <td><input type="checkbox"></td>
-                                                            <td></td>
-                                                        </tr>
-                                                        </tbody>
-                                                    </table>
-                                                </div>
-                                                <div class="col-6">
-                                                    <table class="table table-bordered">
-                                                        <thead>
-                                                        <tr>
-                                                            <th>序号</th>
-                                                            <th>表单角色</th>
-                                                            <th>不参与审批</th>
-                                                            <th>签字签章</th>
-                                                            <th>操作</th>
-                                                        </tr>
-                                                        </thead>
-                                                        <tbody>
-                                                        <tr>
-                                                            <td>1</td>
-                                                            <td>监理公司</td>
-                                                            <td><input type="checkbox"></td>
-                                                            <td></td>
-                                                            <td></td>
-                                                        </tr>
-                                                        <tr>
-                                                            <td>2</td>
-                                                            <td>造价咨询单位</td>
-                                                            <td><input type="checkbox"></td>
-                                                            <td></td>
-                                                            <td></td>
-                                                        </tr>
-                                                        <tr>
-                                                            <td>3</td>
-                                                            <td>经办人</td>
-                                                            <td><input type="checkbox"></td>
-                                                            <td></td>
-                                                            <td></td>
-                                                        </tr>
-                                                        <tr>
-                                                            <td>4</td>
-                                                            <td>合同管理人</td>
-                                                            <td><input type="checkbox"></td>
-                                                            <td></td>
-                                                            <td></td>
-                                                        </tr>
-                                                        <tr>
-                                                            <td>5</td>
-                                                            <td>相关科室负责人</td>
-                                                            <td><input type="checkbox" checked></td>
-                                                            <td><span class="mr-2">张三</span><a href="#">更改</a></td>
-                                                            <td><a href="#">预览</a></td>
-                                                        </tr>
-                                                        <tr>
-                                                            <td>6</td>
-                                                            <td>计划财务科科长</td>
-                                                            <td><input type="checkbox"></td>
-                                                            <td></td>
-                                                            <td></td>
-                                                        </tr>
-                                                        <tr>
-                                                            <td>7</td>
-                                                            <td>分管领导</td>
-                                                            <td><input type="checkbox"></td>
-                                                            <td></td>
-                                                            <td></td>
-                                                        </tr>
-                                                        </tbody>
-                                                    </table>
-                                                </div>
-                                            </div>
-                                        </div>
-                                        <div class="tab-pane fade" id="process" role="tabpanel" aria-labelledby="profile-tab">
-                                            <div class="row">
-                                                <div class="col-6">
-                                                    <table class="table table-bordered">
-                                                        <thead>
-                                                        <tr>
-                                                            <th>审批流程</th>
-                                                            <th>表单角色</th>
-                                                            <th><b class="text-danger">*&nbsp;</b>审批人</th>
-                                                            <th>更换顺序</th>
-                                                        </tr>
-                                                        </thead>
-                                                        <tbody>
-                                                        <tr>
-                                                            <td>一审</td>
-                                                            <td>监理公司</td>
-                                                            <td><select class="form-control form-control-sm"><option>请选择审批人</option></select></td>
-                                                            <td><a href="" class="btn btn-sm btn-link text-primary" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="下移"><i class="fa fa-arrow-down" aria-hidden="true"></i></a><a href="" class="btn btn-sm btn-link text-primary" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="上移"><i class="fa fa-arrow-up" aria-hidden="true"></i></a></td>
-                                                        </tr>
-                                                        <tr>
-                                                            <td>二审</td>
-                                                            <td>造价咨询单位</td>
-                                                            <td><select class="form-control form-control-sm"><option>李四</option></select></td>
-                                                            <td><a href="" class="btn btn-sm btn-link text-primary" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="下移"><i class="fa fa-arrow-down" aria-hidden="true"></i></a><a href="" class="btn btn-sm btn-link text-primary" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="上移"><i class="fa fa-arrow-up" aria-hidden="true"></i></a></td>
-                                                        </tr>
-                                                        <tr>
-                                                            <td>三审</td>
-                                                            <td>经办人</td>
-                                                            <td><select class="form-control form-control-sm"><option>王五</option></select></td>
-                                                            <td><a href="" class="btn btn-sm btn-link text-primary" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="下移"><i class="fa fa-arrow-down" aria-hidden="true"></i></a><a href="" class="btn btn-sm btn-link text-primary" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="上移"><i class="fa fa-arrow-up" aria-hidden="true"></i></a></td>
-                                                        </tr>
-                                                        <tr>
-                                                            <td>四审</td>
-                                                            <td>合同管理人</td>
-                                                            <td><select class="form-control form-control-sm"><option>老六</option></select></td>
-                                                            <td><a href="" class="btn btn-sm btn-link text-primary" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="下移"><i class="fa fa-arrow-down" aria-hidden="true"></i></a><a href="" class="btn btn-sm btn-link text-primary" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="上移"><i class="fa fa-arrow-up" aria-hidden="true"></i></a></td>
-                                                        </tr>
-                                                        <tr>
-                                                            <td>五审</td>
-                                                            <td>计划财务科科长</td>
-                                                            <td><select class="form-control form-control-sm"><option>邓莹洁</option></select></td>
-                                                            <td><a href="" class="btn btn-sm btn-link text-primary" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="下移"><i class="fa fa-arrow-down" aria-hidden="true"></i></a><a href="" class="btn btn-sm btn-link text-primary" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="上移"><i class="fa fa-arrow-up" aria-hidden="true"></i></a></td>
-                                                        </tr>
-                                                        <tr>
-                                                            <td>六审</td>
-                                                            <td>分管领导</td>
-                                                            <td><select class="form-control form-control-sm"><option>仁温书</option></select></td>
-                                                            <td><a href="" class="btn btn-sm btn-link text-primary" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="下移"><i class="fa fa-arrow-down" aria-hidden="true"></i></a><a href="" class="btn btn-sm btn-link text-primary" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="上移"><i class="fa fa-arrow-up" aria-hidden="true"></i></a></td>
-                                                        </tr>
-                                                        </tbody>
-                                                    </table>
-                                                    <div class="my-3"><a href="#">添加流程</a></div>
-                                                </div>
-                                                <div class="col-6">
-                                                    <table class="table table-bordered">
-                                                        <thead>
-                                                        <tr>
-                                                            <th>审批流程</th>
-                                                            <th>表单角色</th>
-                                                            <th><b class="text-danger">*&nbsp;</b>审批人</th>
-                                                            <th>更换顺序</th>
-                                                        </tr>
-                                                        </thead>
-                                                        <tbody>
-                                                        <tr>
-                                                            <td>一审</td>
-                                                            <td>监理公司</td>
-                                                            <td><select class="form-control form-control-sm"><option>请选择审批人</option></select></td>
-                                                            <td><a href="" class="btn btn-sm btn-link text-primary" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="下移"><i class="fa fa-arrow-down" aria-hidden="true"></i></a><a href="" class="btn btn-sm btn-link text-primary" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="上移"><i class="fa fa-arrow-up" aria-hidden="true"></i></a></td>
-                                                        </tr>
-                                                        <tr>
-                                                            <td>二审</td>
-                                                            <td>造价咨询单位</td>
-                                                            <td><select class="form-control form-control-sm"><option>李四</option></select></td>
-                                                            <td><a href="" class="btn btn-sm btn-link text-primary" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="下移"><i class="fa fa-arrow-down" aria-hidden="true"></i></a><a href="" class="btn btn-sm btn-link text-primary" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="上移"><i class="fa fa-arrow-up" aria-hidden="true"></i></a></td>
-                                                        </tr>
-                                                        <tr>
-                                                            <td>三审</td>
-                                                            <td>经办人</td>
-                                                            <td><select class="form-control form-control-sm"><option>王五</option></select></td>
-                                                            <td><a href="" class="btn btn-sm btn-link text-primary" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="下移"><i class="fa fa-arrow-down" aria-hidden="true"></i></a><a href="" class="btn btn-sm btn-link text-primary" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="上移"><i class="fa fa-arrow-up" aria-hidden="true"></i></a></td>
-                                                        </tr>
-                                                        <tr>
-                                                            <td>四审</td>
-                                                            <td>合同管理人</td>
-                                                            <td><select class="form-control form-control-sm"><option>老六</option></select></td>
-                                                            <td><a href="" class="btn btn-sm btn-link text-primary" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="下移"><i class="fa fa-arrow-down" aria-hidden="true"></i></a><a href="" class="btn btn-sm btn-link text-primary" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="上移"><i class="fa fa-arrow-up" aria-hidden="true"></i></a></td>
-                                                        </tr>
-                                                        <tr>
-                                                            <td>五审</td>
-                                                            <td>计划财务科科长</td>
-                                                            <td><select class="form-control form-control-sm"><option>邓莹洁</option></select></td>
-                                                            <td><a href="" class="btn btn-sm btn-link text-primary" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="下移"><i class="fa fa-arrow-down" aria-hidden="true"></i></a><a href="" class="btn btn-sm btn-link text-primary" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="上移"><i class="fa fa-arrow-up" aria-hidden="true"></i></a></td>
-                                                        </tr>
-                                                        <tr>
-                                                            <td>六审</td>
-                                                            <td>分管领导</td>
-                                                            <td><select class="form-control form-control-sm"><option>仁温书</option></select></td>
-                                                            <td><a href="" class="btn btn-sm btn-link text-primary" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="下移"><i class="fa fa-arrow-down" aria-hidden="true"></i></a><a href="" class="btn btn-sm btn-link text-primary" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="上移"><i class="fa fa-arrow-up" aria-hidden="true"></i></a></td>
-                                                        </tr>
-                                                        <tr>
-                                                            <td>七审</td>
-                                                            <td>主管领导(新添加的流程)</td>
-                                                            <td><select class="form-control form-control-sm"><option>请选择审批人</option></select></td>
-                                                            <td><a href="" class="btn btn-sm btn-link text-primary" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="下移"><i class="fa fa-arrow-down" aria-hidden="true"></i></a><a href="" class="btn btn-sm btn-link text-primary" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="上移"><i class="fa fa-arrow-up" aria-hidden="true"></i></a></td>
-                                                        </tr>
-                                                        </tbody>
-                                                    </table>
-                                                    <div class="my-3"><a href="#">添加流程</a></div>
+                                    <div class="row">
+                                        <div class="col-8 mt-3">
+                                            <div class="card" id="process_set" <% if (tenderRptList.length === 0) { %>style="display: none" <% } %>>
+                                                <div class="card-body">
+                                                    <h5 class="card-title"></h5>
+                                                    <div class="form-group">
+                                                        <div class="form-group form-check">
+                                                            <% for (const st in shenpi.sp_status_list) { %>
+                                                                <div class="custom-control custom-checkbox custom-control-inline">
+                                                                    <input type="radio" class="custom-control-input" value="<%- shenpi.sp_status_list[st].status %>" name="tender_process" id="tender_process_<%- shenpi.sp_status_list[st].status %>">
+                                                                    <label class="custom-control-label" for="tender_process_<%- shenpi.sp_status_list[st].status %>"><%- shenpi.sp_status_list[st].name %></label>
+                                                                </div>
+                                                            <% } %>
+                                                        </div>
+                                                    </div>
+                                                    <div class="alert alert-warning mb-0 mt-3" role="alert"></div>
+                                                    <div class="lc-show mt-3"></div>
+                                                    <!--<div class="d-flex justify-content-start align-items-center mt-3">-->
+                                                        <!--<div class="mr-2"><a href="#">一审</a></div>-->
+                                                        <!--<div>-->
+                                                            <!--<select class="form-control form-control-sm" id="exampleFormControlSelect1">-->
+                                                                <!--<option>选择审批人</option>-->
+                                                            <!--</select>-->
+                                                        <!--</div>-->
+                                                    <!--</div>-->
+                                                    <!--<div class="d-flex justify-content-start align-items-center mt-3">-->
+                                                        <!--<div class="mr-2"><a href="#">一审</a></div>-->
+                                                        <!--<div class="mr-2">邓莹洁</div>-->
+                                                        <!--<div><i class="fa fa-remove text-danger" aria-hidden="true"></i></div>-->
+                                                    <!--</div>-->
+                                                    <!--<div class="d-flex justify-content-start align-items-center mt-3">-->
+                                                        <!--<div class="mr-2"><a href="#"><i class="fa fa-plus" aria-hidden="true"></i></a></div>-->
+                                                        <!--<div><a href="#">添加流程</a></div>-->
+                                                    <!--</div>-->
                                                 </div>
                                                 </div>
                                             </div>
                                             </div>
                                         </div>
                                         </div>
@@ -379,3 +153,12 @@
         </div>
         </div>
     </div>
     </div>
 </div>
 </div>
+<script>
+    const tenderId = parseInt('<%- ctx.tender.id %>');
+    const sp_status = JSON.parse('<%- JSON.stringify(shenpi.sp_status) %>');
+    const sp_status_list = JSON.parse('<%- JSON.stringify(shenpi.sp_status_list) %>');
+    const accountGroup = JSON.parse(unescape('<%- escape(JSON.stringify(accountGroup)) %>'));
+    const accountList = JSON.parse(unescape('<%- escape(JSON.stringify(accountList)) %>'));
+    const cur_uid = parseInt('<%- ctx.tender.uid %>');
+    let tenderRptList = JSON.parse(unescape('<%- escape(JSON.stringify(tenderRptList)) %>'));
+</script>

+ 8 - 13
app/view/payment/process_modal.ejs

@@ -8,30 +8,25 @@
                 <table id="rpt-table" class="table table-bordered">
                 <table id="rpt-table" class="table table-bordered">
                     <thead>
                     <thead>
                     <tr>
                     <tr>
-                        <th class="text-center"><input type="checkbox">选择</th>
+                        <th class="text-center"><input type="checkbox" id="select_all_rpt_checkbox"> 选择</th>
                         <th class="text-center">表单名</th>
                         <th class="text-center">表单名</th>
                     </tr>
                     </tr>
                     </thead>
                     </thead>
-                    <tbody>
+                    <tbody id="rpt_table">
+                    <% for (const rpt of rptProjectList) { %>
                     <tr>
                     <tr>
-                        <td class="text-center"><input type="checkbox"></td>
-                        <td>指挥部工程结算款</td>
-                    </tr>
-                    <tr>
-                        <td class="text-center"><input type="checkbox"></td>
-                        <td>指挥部工程结算付款</td>
-                    </tr>
-                    <tr>
-                        <td class="text-center"><input type="checkbox"></td>
-                        <td>指挥部监理、设计等预付款</td>
+                        <td class="text-center"><input type="checkbox" name="rptId[]" data-name="<%- rpt.name %>" value="<%- rpt.ID %>"
+                                                       <% if (ctx.helper._.findIndex(tenderRptList, { rpt_id: rpt.ID }) !== -1) { %>checked<% } %> <% if (rpt.had_rpt) { %>disabled<% } %>></td>
+                        <td><%- rpt.name %></td>
                     </tr>
                     </tr>
+                    <% } %>
                     </tbody>
                     </tbody>
                 </table>
                 </table>
             </div>
             </div>
             <div class="modal-footer">
             <div class="modal-footer">
                 <input type="hidden" id="add_tender_folder_id" />
                 <input type="hidden" id="add_tender_folder_id" />
                 <button type="button" class="btn btn-sm btn-secondary" data-dismiss="modal">取消</button>
                 <button type="button" class="btn btn-sm btn-secondary" data-dismiss="modal">取消</button>
-                <button type="button" class="btn btn-sm btn-primary" id="new_tender_btn">确定添加</button>
+                <button type="button" class="btn btn-sm btn-primary" id="add_rpt_btn">确定添加</button>
             </div>
             </div>
         </div>
         </div>
     </div>
     </div>

+ 3 - 1
sql/update20230329.sql

@@ -32,4 +32,6 @@ CREATE TABLE `zh_global_log` (
   `is_response` tinyint(4) unsigned NOT NULL DEFAULT '0' COMMENT '是否返回数据',
   `is_response` tinyint(4) unsigned NOT NULL DEFAULT '0' COMMENT '是否返回数据',
   `run_time` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '运行时长,毫秒',
   `run_time` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '运行时长,毫秒',
   PRIMARY KEY (`id`)
   PRIMARY KEY (`id`)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
+
+ALTER TABLE `zh_project` ADD `after_login_url` VARCHAR(255) NULL DEFAULT NULL COMMENT '登录后跳转页url' AFTER `can_api`;