소스 검색

安全生产费审批流程配置

MaiXinRong 2 년 전
부모
커밋
8c2abbfb40
5개의 변경된 파일269개의 추가작업 그리고 33개의 파일을 삭제
  1. 2 0
      app/controller/payment_controller.js
  2. 247 5
      app/public/js/payment_process.js
  3. 1 1
      app/service/payment_tender_rpt.js
  4. 15 26
      app/view/payment/process.ejs
  5. 4 1
      sql/update.sql

+ 2 - 0
app/controller/payment_controller.js

@@ -651,6 +651,7 @@ module.exports = app => {
                     throw '权限不足';
                 }
                 let [tenderRptList, rptProjectList] = await this._returnRptProjectList(ctx, true);
+                const safeRpt = tenderRptList.find(x => { return x.type === 1 });
                 tenderRptList = ctx.helper._.filter(tenderRptList, { type: 0, is_del: 0 });
                 // for (const tr of tenderRptList) {
                 //     if (tr.status === shenpiConst.sp_status.gdspl) {
@@ -672,6 +673,7 @@ module.exports = app => {
                 const renderData = {
                     tender: ctx.paymentTender,
                     jsFiles: this.app.jsFiles.common.concat(this.app.jsFiles.payment.process),
+                    safeRpt,
                     rptProjectList,
                     tenderRptList,
                     shenpi: shenpiConst,

+ 247 - 5
app/public/js/payment_process.js

@@ -228,7 +228,6 @@ $(function () {
         return false;
     });
 
-
     // 更改审批流程状态
     $('#process_set .form-check input').on('change', function () {
         // 获取所有审批的checked值并更新
@@ -250,7 +249,7 @@ $(function () {
     });
 
     // 选中审批流里的审批人
-    $('body').on('click', '.lc-show dl dd', function () {
+    $('body').on('click', '#process_set .lc-show dl dd', function () {
         const id = parseInt($(this).data('id'));
         if (!id) return;
 
@@ -370,7 +369,7 @@ $(function () {
     });
 
     // 移除审批人
-    $('body').on('click', '.remove-audit', function () {
+    $('body').on('click', '#process_set .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'));
@@ -412,7 +411,7 @@ $(function () {
     });
 
     // 固定审批流-添加流程
-    $('body').on('click', '.add-audit', function () {
+    $('body').on('click', '#process_set .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));
@@ -464,7 +463,7 @@ $(function () {
             '                                            <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' +
+            '                                                <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' +
@@ -510,5 +509,248 @@ $(function () {
                 }
             }
         }
+    };
+
+    // 安全生产费 流程设置相关
+    class ProgressMaker {
+        constructor (setting) {
+            const self = this;
+            this.domId = setting.domId;
+            this.obj = $(setting.domId);
+            if (setting.rptInfo) this.loadRptInfo(setting.rptInfo);
+
+            // 选中上报人
+            $(setting.domId).on('click', '[name=user] dl dd', function () {
+                const uid = parseInt($(this).data('id'));
+                if (!uid) return;
+
+                let tr_id = self.rptInfo.id;
+                const user = _.find(accountList, function (item) { return item.id === uid; });
+                if (!user) {
+                    toastr.error('用户列表不存在此人');
+                    return;
+                }
+
+                const data = { tr_id, uid, type: 'update-report' };
+                postData('process/save', data, function (result) {
+                    for (const prop in result.updateData) {
+                        self.rptInfo[prop] = result.updateData[prop];
+                    }
+                    self.refreshUserHtml();
+                    if (result.updateRows) {
+                        toastr.warning('上报人不能同时作为审批人,审批流已移除 ' + user.name);
+                        self.loadAuditList();
+                    }
+                });
+            });
+
+            // 更改审批流程状态
+            $('.form-check input', setting.domId).on('change', function () {
+                // 获取所有审批的checked值并更新
+                const status = parseInt($(this).val());
+                let tr_id = self.rptInfo.id;
+                const spt = sp_status_list[status];
+                $(this).parents('.form-group').siblings('.alert-warning').text(spt.name + ':' + spt.msg);
+                // 拼接post json
+                const prop = { type: 'change-status', tr_id, status };
+                postData('/payment/' + tenderId + '/process/save', prop, function (data) {
+                    self.rptInfo.sp_status = status;
+                    self.setLcShowHtml(self.rptInfo, data);
+                });
+            });
+
+            // 选中审批流里的审批人
+            $(setting.domId).on('click', '.lc-show dl dd', function () {
+                const tr_id = self.rptInfo.id;
+                const id = parseInt($(this).data('id'));
+                if (!id) return;
+                const user = _.find(accountList, function (item) {
+                    return item.id === id;
+                });
+
+                const status = parseInt($(this).parents('.lc-show').siblings('.form-group').find('input:checked').val());
+                if (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, tr_id, audit_id: id, type: 'add-audit' };
+                const _self = $(this);
+                postData('/payment/' + tenderId + '/process/save', prop, function (data) {
+                    if (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');
+                });
+            });
+
+            // 移除审批人
+            $(setting.domId).on('click', '.remove-audit', function () {
+                const id = parseInt($(this).data('id'));
+                const status = parseInt($(this).parents('.lc-show').siblings('.form-group').find('input:checked').val());
+                const tr_id = self.rptInfo.id;
+                const prop = { status, tr_id, audit_id: id, type: 'del-audit' };
+                const _self = $(this);
+                postData('process/save', prop, function (data) {
+                    if (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(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 (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 += self.getAuditSelectHtml();
+                        addhtml += '</ul>\n';
+                        _self.parents('.lc-show').html(addhtml);
+                    }
+                })
+            });
+
+            // 固定审批流-添加流程
+            $(setting.domId).on('click', '.add-audit', function () {
+                const num = $(this).parents('ul').children('li').length;
+                const addhtml = self.getAuditSelectHtml(transFormToChinese(num));
+                $(this).parents('ul').append(addhtml);
+                $(this).parents('li').remove();
+            });
+        }
+        getAccountHtml(uid) {
+            const html = [];
+            accountGroup.forEach((group, idx) => {
+                if (!group) return;
+
+                const groupHtml = [];
+                group.groupList.forEach(item => {
+                    if (item.id === uid) return;
+                    groupHtml.push('<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');
+                });
+                html.push(`<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}">${groupHtml.join('')}</div>`);
+            });
+            return html.join('');
+        }
+        getSelectHtml(name) {
+            const tr_id = this.rptInfo.id;
+            return '<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 + '_dropdownMenuButton2" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">\n' +
+                `                                                        ${name}\n` +
+                '                                                    </button>\n' +
+                '                                                    <div class="dropdown-menu dropdown-menu-left" id="' + tr_id + '_dropdownMenu2" aria-labelledby="' + tr_id + '_dropdownMenuButton2" 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' + this.getAccountHtml(this.rptInfo.uid) +
+                '                                                        </dl>\n' +
+                '                                                    </div>\n' +
+                '                                                </div>\n' +
+                '                                            </span>\n';
+        }
+        getAuditSelectHtml(i = '终') {
+            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' + this.getSelectHtml('选择审批人') +
+                '                                        </span>\n' +
+                '                                        </li>';
+            return html;
+        }
+        refreshUserHtml() {
+            const html = ['<div class="mr-2">上报人<b class="text-danger">*</b></div>'];
+            if (this.rptInfo.uid) {
+                const userInfo = _.find(accountList, { id: this.rptInfo.uid });
+                html.push(`<div class="mr-2">${userInfo.name}</div>`, `<div>${this.getSelectHtml('替换')}</div>`);
+            } else {
+                html.push(`<div>${this.getSelectHtml('选择上报人')}</div>`);
+            }
+            $('[name=user]', this.domId).html(html.join(''));
+        }
+        setLcShowHtml() {
+            if (this.rptInfo.sp_status === sp_status.sqspr) {
+                $('.lc-show', this.domId).html('');
+            } else if (this.rptInfo.sp_status === sp_status.gdspl) {
+                let addhtml = '<ul class="list-unstyled">\n';
+                if (this.rptInfo.auditData.length !== 0) {
+                    for(const [i, audit] of this.rptInfo.auditData.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 += this.getAuditSelectHtml('一');
+                }
+                addhtml += '</ul>\n';
+                $('.lc-show', this.domId).html(addhtml);
+            } else if (this.rptInfo.sp_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 += this.rptInfo.auditData ? makeAudit(this.rptInfo.auditData) : this.getAuditSelectHtml();
+                addhtml += '</ul>\n';
+                $('.lc-show', this.domId).html(addhtml);
+            }
+        }
+        async loadAuditList() {
+            const prop = {
+                type: 'get-audits',
+                tr_id: this.rptInfo.id,
+                status: this.rptInfo.sp_status,
+            };
+            this.rptInfo.auditData = await postDataAsync('process/save', prop);
+            this.setLcShowHtml();
+        }
+        initProgress() {
+            this.obj.attr('data-trid', this.rptInfo.id);
+            $('.card-title', this.domId).find('.card-title').text(this.rptInfo.rpt_name);
+            this.refreshUserHtml();
+            $('input[name="tender_process"][value="'+ this.rptInfo.sp_status +'"]', this.obj).prop('checked', true).attr('data-trid', this.rptInfo.id);
+            const spt = sp_status_list[this.rptInfo.sp_status];
+            $('.alert-warning', this.domId).text(spt.name + ':' + spt.msg);
+            this.loadAuditList();
+        }
+        loadRptInfo(rptInfo) {
+            this.rptInfo = rptInfo;
+            this.initProgress();
+        }
     }
+    const safeProgress = new ProgressMaker({ domId: '#safe', rptInfo: safeRpt });
 });

+ 1 - 1
app/service/payment_tender_rpt.js

@@ -241,7 +241,7 @@ module.exports = app => {
                 await transaction.commit();
                 let tenderRptList = await this.getProcessList(this.ctx.paymentTender.id);
                 tenderRptList = this._.filter(tenderRptList, { type: 0, is_del: 0 });
-                return { list: tenderRptList, updateRows: result2.affectedRows };
+                return { list: tenderRptList, updateRows: result2.affectedRows, updateData };
             } catch (err) {
                 await transaction.rollback();
                 throw err;

+ 15 - 26
app/view/payment/process.ejs

@@ -25,37 +25,26 @@
                         <div class="tab-pane fade show active" id="home" role="tabpanel" aria-labelledby="home-tab">
                             <div class="row mt-3">
                                 <div class="col-8 mt-3">
-                                    <div class="card">
+                                    <div class="card" id="safe">
                                         <div class="card-body">
                                             <h5 class="card-title">安全生成费</h5>
-                                            <div class="form-group">
-                                                <div class="form-check form-check-inline">
-                                                    <input class="form-check-input" type="checkbox" id="inlineCheckbox3" value="option1">
-                                                    <label class="form-check-label" for="inlineCheckbox16">授权审批流</label>
-                                                </div>
-                                                <div class="form-check form-check-inline">
-                                                    <input class="form-check-input" type="checkbox" id="inlineCheckbox4" value="option1" checked>
-                                                    <label class="form-check-label" for="inlineCheckbox16">固定审批流</label>
+                                            <div  class="my-3">
+                                                <div class="d-flex justify-content-start align-items-center mt-3" name="user">
+                                                    <div class="mr-2">上报人<b class="text-danger">*</b></div>
                                                 </div>
                                             </div>
-                                            <div class="alert alert-warning mb-0 mt-3" role="alert">固定审批流:审批流程固定,上报人只能按照设置好的审批流程进行。</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 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="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 class="alert alert-warning mb-0 mt-3" role="alert"></div>
+                                            <div class="lc-show mt-3"></div>
                                         </div>
                                     </div>
                                 </div>
@@ -130,7 +119,7 @@
     const accountGroup = JSON.parse(unescape('<%- escape(JSON.stringify(accountGroup)) %>'));
     const accountList = JSON.parse(unescape('<%- escape(JSON.stringify(accountList)) %>'));
     let cur_uid = null;
+    const safeRpt = <% if (safeRpt) { %> JSON.parse(unescape('<%- escape(JSON.stringify(safeRpt)) %>')) <% } else {%> null <% } %>;
     let tenderRptList = JSON.parse(unescape('<%- escape(JSON.stringify(tenderRptList)) %>'));
     const rptProjectList = JSON.parse(unescape('<%- escape(JSON.stringify(rptProjectList)) %>'));
-    console.log(rptProjectList);
 </script>

+ 4 - 1
sql/update.sql

@@ -9,4 +9,7 @@ ALTER TABLE `zh_rpt_tree_node`
 ADD COLUMN `source_type`  int(11) UNSIGNED NOT NULL DEFAULT 1 COMMENT '数据源类型' AFTER `last_update_time`;
 
 ALTER TABLE `zh_rpt_tpl`
-ADD COLUMN `source_type`  int(11) UNSIGNED NOT NULL DEFAULT 1 COMMENT '数据源类型' AFTER `rpt_content`;
+ADD COLUMN `source_type`  int(11) UNSIGNED NOT NULL DEFAULT 1 COMMENT '数据源类型' AFTER `rpt_content`;
+
+ALTER TABLE `zh_rpt_mapping_field`
+ADD COLUMN `source_type`  int(11) UNSIGNED NOT NULL COMMENT '数据源类型' AFTER `items`;