Przeglądaj źródła

1. 审批流程配置相关
2. 导入计价文件,编办过滤调整

MaiXinRong 2 tygodni temu
rodzic
commit
1ff3a55802

+ 3 - 2
app/const/audit.js

@@ -11,9 +11,10 @@
 const auditType = (function () {
     const types = [
         { key: 'common', name: '个人', value: 1, short: '', long: '', class: '', },
-        { key: 'and', name: '会签', value: 2, short: '会', long: '多人会签', class: 'primary', valid: ['ledger', 'revise', 'stage', 'change', 'material', 'financial', 'phasePay'] },
-        { key: 'or', name: '或签', value: 3, short: '或', long: '多人或签', class: 'success', valid: ['ledger', 'revise', 'stage', 'change', 'material', 'financial', 'phasePay'] },
+        { key: 'and', name: '会签', value: 2, short: '会', long: '多人会签', class: 'primary', valid: ['ledger', 'revise', 'stage', 'change', 'material', 'financial', 'phasePay'], setValid: ['stage'] },
+        { key: 'or', name: '或签', value: 3, short: '或', long: '多人或签', class: 'success', valid: ['ledger', 'revise', 'stage', 'change', 'material', 'financial', 'phasePay'], setValid: ['stage'] },
         { key: 'union', name: '协同', value: 4, short: '协', long: '多人协同', class: 'warning', valid: ['stage']},
+        { key: 'multi', name: '分组审批', value: 5, short: '组', long: '分组审批', class: 'danger', valid: ['stage'] },
     ];
     const key = {};
     const info = [];

+ 11 - 0
app/controller/tender_controller.js

@@ -1349,6 +1349,17 @@ module.exports = app => {
             }
         }
 
+        async saveMultiAudit(ctx) {
+            try {
+                const data = JSON.parse(ctx.request.body.data);
+                const result = await this.ctx.service.shenpiAudit.saveMultiAudit(ctx.tender.id, data);
+                ctx.body = { err: 0, msg: '', data: result };
+            } catch (err) {
+                ctx.log(err);
+                ctx.ajaxErrorBody(err, '保存分组审批数据错误');
+            }
+        }
+
         async billsTag(ctx) {
             try {
                 const isValidTourist = ctx.tender.isTourist && ctx.tender.touristPermission.tag;

+ 4 - 1
app/lib/dsk.js

@@ -73,10 +73,13 @@ class DSK {
 
     async getCompilation() {
         const validName = ['全国公路(2018)', '广东公路(2023)', '浙江公路(2025)', '重庆建设(2018)', '广东建设(2018)', '重庆公路(2018)'];
+        // 含两个广东建设
+        const validId = ['5de61133d46f6f000d15d347', '63f31fe113566500140e4902', '66b1f3f6ad66620013c13883', '5b52b027fd3bb0000b257cf8', '5c66649650da2d000d8d37ba', '68da3abe86d439035390afb6', '68946f6f6b1989001314bc07'];
         const url = this.url + 'api/compilation/external/list';
         const postData = {};
         const result = this.dealWith(await this.ctx.helper.sendRequest(url, postData, 'GET', 'json', true));
-        return result.filter(item => { return validName.indexOf(item.name) >= 0; });
+        // return result.filter(item => { return validName.indexOf(item.name) >= 0; });
+        return result.filter(item => { return validId.indexOf(item.ID) >= 0; });
     }
 
     async getProjectList(mobile, compilationId) {

+ 155 - 2
app/public/js/shenpi.js

@@ -302,6 +302,15 @@ $(document).ready(function () {
             if (type !== auditType.key.common || auditGroup.length === 0) {
                 html.push(this.getSelectAuditHtml(code));
             }
+            if (type === auditType.key.and && auditType.info[auditType.key.and].setValid.indexOf(code) >= 0 && auditGroup.length > 0) {
+                html.push(`<button class="btn btn-sm btn-outline-primary" sp_type="${code}" audit_order="${i}" name="and-set">会签设置</button>`);
+            }
+            if (type === auditType.key.or && auditType.info[auditType.key.or].setValid.indexOf(code) >= 0 && auditGroup.length > 0) {
+                html.push(`<button class="btn btn-sm btn-outline-primary" sp_type="${code}" audit_order="${i}" name="or-set">或签设置</button>`);
+            }
+            if (type === auditType.key.multi && auditGroup.length > 0) {
+                html.push(`<button class="btn btn-sm btn-outline-primary" sp_type="${code}" audit_order="${i}" name="multi-set">分组设置</button>`);
+            }
             if (type === auditType.key.union && auditGroup.length > 0) {
                 html.push(`<button class="btn btn-sm btn-outline-primary" sp_type="${code}" audit_order="${i}" name="union-set">协同设置</button>`);
             }
@@ -530,7 +539,7 @@ $(document).ready(function () {
             const _self = $(this);
             postData('/tender/' + cur_tenderid + '/shenpi/audit/save', prop, function (data) {
                 if (this_status === sp_status.gdspl) {
-                    const auditGroup = auditUtils.addAudit(this_code, { audit_id: data.audit_id, name: user.name, audit_type: data.audit_type, audit_order: data.audit_order }, prop.audit_order - 1);
+                    const auditGroup = auditUtils.addAudit(this_code, data, prop.audit_order - 1);
                     if (_self.parents('ul').find('.add-audit').length === 0) {
                         const flow = sp_lc.find(x => { return x.code === this_code; });
                         const addGroupHtml = (this_code === 'change'||this_code ==='stage') && (!flow.groupList || (flow.groupList && flow.groupList.length === 0)) ?
@@ -621,14 +630,22 @@ $(document).ready(function () {
         const this_status = parseInt($(this).siblings('.lc-show').siblings('.form-group').find('input:checked').val());
         const lis = $(this).siblings('.lc-show').find('li');
         const auditList = [], aidList = [];
+
+        const flow = sp_lc.find(x => { return x.code === this_code; });
         lis.each((i, li) => {
             const removes = $(li).find('.remove-audit');
             if (removes.length === 0) return;
 
             const select = $(li).find('select[class*="audit-type-key"]');
             const audit_type = select.length > 0 ? parseInt(select.val()) : 1;
+            const multiData = flow.auditGroupList.find(x => { return x[0].audit_order == i+1; });
             for (const remove of removes) {
-                auditList.push({ audit_id: parseInt(remove.getAttribute('data-id')), audit_type, audit_order: i + 1 });
+                const auditData = { audit_id: parseInt(remove.getAttribute('data-id')), audit_type, audit_order: i + 1 };
+                const removeMultiData = multiData.find(x => { return x.audit_id === auditData.audit_id; });
+                auditData.audit_group = removeMultiData ? removeMultiData.audit_group : '';
+                auditData.audit_group_order = removeMultiData ? removeMultiData.audit_group_order : 0;
+                auditData.audit_group_limit = removeMultiData ? removeMultiData.audit_group_limit : 0;
+                auditList.push(auditData);
                 aidList.push(parseInt(remove.getAttribute('data-id')));
             }
         });
@@ -1100,6 +1117,142 @@ $(document).ready(function () {
         auditUnion.loadUnionData(this.getAttribute('sp_type'), this.getAttribute('audit_order'));
     });
 
+
+    class AuditMulti {
+        constructor() {
+            this.spread = SpreadJsObj.createNewSpread($('#multi-spread')[0]);
+            this.sheet = this.spread.getActiveSheet();
+            this.spreadSetting = {
+                cols: [
+                    {title: '审批人', colSpan: '1', rowSpan: '1', field: 'name', hAlign: 1, width: 80, formatter: '@', readOnly: true },
+                    {title: '分组/部门', colSpan: '1', rowSpan: '1', field: 'audit_group', hAlign: 0, width: 100, formatter: '@' },
+                    {title: '顺序', colSpan: '1', rowSpan: '1', field: 'audit_group_order', hAlign: 1, width: 80 },
+                    {title: '受限', colSpan: '1', rowSpan: '1', field: 'audit_group_limit', hAlign: 1, width: 60, cellType: 'checkbox' },
+                    {title: '允许退回', colSpan: '1', rowSpan: '1', field: 'audit_checkno_valid', hAlign: 1, width: 60, cellType: 'checkbox' },
+                    {title: '最少审批', colSpan: '1', rowSpan: '1', field: 'audit_group_need', hAlign: 1, width: 80 },
+                ],
+                emptyRows: 0,
+                headRows: 1,
+                headRowHeight: [32],
+                defaultRowHeight: 21,
+                headerFont: '12px 微软雅黑',
+                font: '12px 微软雅黑',
+            };
+            SpreadJsObj.initSheet(this.sheet, this.spreadSetting);
+
+            const self = this;
+            SpreadJsObj.selChangedRefreshBackColor(this.sheet);
+
+            $('#multi').on('shown.bs.modal', function() {
+                self.spread.refresh();
+            });
+            $('#multi-ok').click(function() {
+                const data = self.getAuditData();
+                if (self.audit_type === auditType.key.and) {
+                    const exist = !data[0].audit_group_order ? data.find(x => { return !!x.audit_group_order; }) : data.find(x => { return !x.audit_group_order; });
+                    if (exist) {
+                        toastr.error('如需设置顺序,所有审批人均应配置顺序');
+                        return;
+                    }
+                } else if (self.audit_type === auditType.key.multi) {
+                    const exist = data.find(x => { return !x.audit_group || !x.audit_group_order; });
+                    if (exist) {
+                        toastr.error('分组审批时,分组/部门、顺序均不可为空');
+                        return;
+                    }
+                } else if (self.audit_type === auditType.key.or) {
+                    for (const d of data) {
+                        if (!d.audit_group_need) {
+                            toastr.error('或签必须设置最少审批人数');
+                            return;
+                        }
+                        if (d.audit_group_need < 1 || d.audit_group_need >= data.length) {
+                            toastr.error('最少审批人数必须大于0,小于审批人数');
+                            return;
+                        }
+                    }
+                }
+                postData(`/tender/${cur_tenderid}/shenpi/multi/save`, data, function(result) {
+                    const flow = sp_lc.find(x => { return x.code === self.sp_type; });
+                    const multiData = flow.auditGroupList.find(x => { return x[0].audit_order == self.audit_order});
+                    for (const d of result) {
+                        const md = multiData.find(x => { return x.id === d.id; });
+                        if (!md) continue;
+                        for (const prop in d) {
+                            md[prop] = d[prop];
+                        }
+                    }
+                    multiData.sort((a, b) => {
+                        if (a.audit_group === b.audit_group) {
+                            return a.audit_group_order - b.audit_group_order;
+                        } else {
+                            return a.audit_group === b.audit_group ? 0 : (a.audit_group < b.audit_group ? -1 : 1)
+                        }
+                    });
+                    $('#multi').modal('hide');
+                    $(self.multiBtn).parent().parent().html(auditUtils.getAuditGroupInnerHtml(self.sp_type, multiData, self.audit_order));
+                });
+            });
+        }
+        loadData(audit_type, sp_type, audit_order, multiBtn) {
+            this.audit_type = audit_type;
+            if (this.audit_type === auditType.key.multi) {
+                $('#multi-title').html('分组审批');
+            } else if (this.audit_type === auditType.key.and) {
+                $('#multi-title').html('会签设置');
+            } else if (this.audit_type === auditType.key.or) {
+                $('#multi-title').html('或签设置');
+            }
+            $('[name=set-hint]').hide();
+            $(`[name=set-hint][htype=${audit_type}]`).show();
+            this.multiBtn = multiBtn;
+            this.sp_type = sp_type;
+            this.audit_order = audit_order;
+            const flow = sp_lc.find(x => { return x.code === sp_type; });
+            const multiData = flow.auditGroupList.find(x => { return x[0].audit_order == audit_order});
+            this.data = JSON.parse(JSON.stringify(multiData));
+
+            const typeNeedCol = [
+                { key: auditType.key.multi, cols: ['name', 'audit_group', 'audit_group_limit', 'audit_group_order', 'audit_checkno_valid'] },
+                { key: auditType.key.and, cols: ['name', 'audit_group_order', 'audit_checkno_valid'] },
+                { key: auditType.key.or, cols: ['name', 'audit_group_need'] },
+            ];
+            const needCol = typeNeedCol.find(x => { return x.key === this.audit_type; });
+            this.sheet.zh_setting.cols.forEach(c => {
+                c.visible = needCol.cols.indexOf(c.field) >= 0;
+            });
+            SpreadJsObj.refreshColumnVisible(this.sheet);
+            SpreadJsObj.loadSheetData(this.sheet, SpreadJsObj.DataType.Data, this.data);
+            $('#multi').modal('show');
+        }
+        getAuditData() {
+            const sheet = this.sheet;
+            const col = { group: 1, order: 2, limit: 3, checkno: 4, need: 5, };
+            const updateData = this.data.map((x, i) => {
+                const data = { id: x.id };
+                data.audit_group = this.audit_type === auditType.key.multi ? sheet.getText(i, col.group) : '';
+                const order = sheet.getText(i, col.order);
+                data.audit_group_order = order ? _.parseInt(order) || 0 : 0;
+                data.audit_group_limit = this.audit_type === auditType.key.multi ? (sheet.getValue(i, col.limit) ? 1 : 0) : 0;
+                data.audit_checkno_valid = sheet.getValue(i, col.checkno) ? 1 : 0;
+                const need = sheet.getText(i, col.need);
+                data.audit_group_need = this.audit_type === auditType.key.or ? (need ? _.parseInt(need) || 1 : 1) : 1;
+                return data;
+            });
+            return updateData;
+        }
+    }
+    const auditMulti = new AuditMulti();
+    $('body').on('click', '[name=multi-set]', function() {
+        auditMulti.loadData(auditType.key.multi, this.getAttribute('sp_type'), this.getAttribute('audit_order'), this);
+    });
+    $('body').on('click', '[name=and-set]', function() {
+        auditMulti.loadData(auditType.key.and, this.getAttribute('sp_type'), this.getAttribute('audit_order'), this);
+    });
+    $('body').on('click', '[name=or-set]', function() {
+        auditMulti.loadData(auditType.key.or, this.getAttribute('sp_type'), this.getAttribute('audit_order'), this);
+    });
+
     $.subMenu({
         menu: '#sub-menu', miniMenu: '#sub-mini-menu', miniMenuList: '#mini-menu-list',
         toMenu: '#to-menu', toMiniMenu: '#to-mini-menu',

+ 1 - 0
app/router.js

@@ -580,6 +580,7 @@ module.exports = app => {
     app.post('/tender/:id/shenpi/audit/save', sessionAuth, tenderCheck, subProjectCheck, 'tenderController.saveShenpiAudit');
     app.post('/tender/:id/shenpi/ass/load', sessionAuth, tenderCheck, subProjectCheck, 'tenderController.loadAuditAss');
     app.post('/tender/:id/shenpi/save-sign', sessionAuth, tenderCheck, subProjectCheck, 'tenderController.saveCooperateSign');
+    app.post('/tender/:id/shenpi/multi/save', sessionAuth, tenderCheck, subProjectCheck, 'tenderController.saveMultiAudit');
     app.post('/tender/:id/shenpi/union/load', sessionAuth, tenderCheck, subProjectCheck, 'tenderController.loadUnionAudit');
     app.post('/tender/:id/shenpi/union/save', sessionAuth, tenderCheck, subProjectCheck, 'tenderController.saveUnionAudit');
     app.post('/tender/:id/copy-setting', sessionAuth, tenderCheck, subProjectCheck, 'tenderController.copyTender');

+ 41 - 5
app/service/shenpi_audit.js

@@ -69,7 +69,8 @@ module.exports = app => {
         }
 
         async getAllAuditGroupList(tids, type, status, group_id = 0) {
-            const sql = 'SELECT sp.tid, sp.audit_id, sp.audit_type, sp.audit_order, sp.sp_group, pa.name FROM ?? AS sp LEFT JOIN ?? AS pa ON sp.audit_id = pa.id' +
+            const sql = 'SELECT sp.id, sp.tid, sp.audit_id, sp.audit_type, sp.audit_order, sp.sp_group, sp.audit_group, sp.audit_group_order, sp.audit_group_limit, sp.audit_checkno_valid, sp.audit_group_need, ' +
+                '  pa.name FROM ?? AS sp LEFT JOIN ?? AS pa ON sp.audit_id = pa.id' +
                 ' WHERE sp.tid in (' + this.ctx.helper.getInArrStrSqlFilter(tids) + ') AND sp.sp_type = ? AND sp.sp_status = ? AND sp.sp_group = ? ORDER BY sp.audit_order ASC, sp.id ASC';
             const sqlParam = [this.tableName, this.ctx.service.projectAccount.tableName, type, status, group_id];
             const audits = await this.db.query(sql, sqlParam);
@@ -94,7 +95,8 @@ module.exports = app => {
         }
 
         async getAuditGroupList(tid, type, status, group_id = 0) {
-            const sql = 'SELECT sp.audit_id, sp.audit_type, sp.audit_order, sp.sp_group, pa.name FROM ?? AS sp LEFT JOIN ?? AS pa ON sp.audit_id = pa.id' +
+            const sql = 'SELECT sp.id, sp.audit_id, sp.audit_type, sp.audit_order, sp.sp_group, sp.audit_group, sp.audit_group_order, sp.audit_group_limit, sp.audit_checkno_valid, sp.audit_group_need, ' +
+                '  pa.name FROM ?? AS sp LEFT JOIN ?? AS pa ON sp.audit_id = pa.id' +
                 ' WHERE sp.tid = ? AND sp.sp_type = ? AND sp.sp_status = ? AND sp.sp_group = ? ORDER BY sp.audit_order ASC, sp.id ASC';
             const sqlParam = [this.tableName, this.ctx.service.projectAccount.tableName, tid, type, status, group_id];
             const audits = await this.db.query(sql, sqlParam);
@@ -146,8 +148,11 @@ module.exports = app => {
                 throw err;
             }
             if (result.affectedRows !== 1) throw '添加审批人失败';
-            data.id = result.insertId;
-            return data;
+            const sql = 'SELECT sp.id, sp.audit_id, sp.audit_type, sp.audit_order, sp.sp_group, sp.audit_group, sp.audit_group_order, sp.audit_group_limit, sp.audit_checkno_valid, sp.audit_group_need, ' +
+                '  pa.name, pa.company, pa.role FROM ?? AS sp LEFT JOIN ?? AS pa ON sp.audit_id = pa.id' +
+                ' WHERE sp.id = ?';
+            const sqlParam = [this.tableName, this.ctx.service.projectAccount.tableName, result.insertId];
+            return await this.db.queryOne(sql, sqlParam);
         }
 
         async removeAudit(data) {
@@ -257,6 +262,11 @@ module.exports = app => {
                                         audit_id: s.audit_id,
                                         audit_type: s.audit_type,
                                         audit_order: s.audit_order,
+                                        audit_group: s.audit_group || '',
+                                        audit_group_order: s.audit_group_order || 0,
+                                        audit_group_limit: s.audit_group_limit || 0,
+                                        audit_checkno_valid: s.audit_checkno_valid,
+                                        audit_group_need: s.audit_group_need || 1,
                                         sp_group: result.insertId,
                                     });
                                 }
@@ -277,6 +287,11 @@ module.exports = app => {
                                     audit_id: s.audit_id,
                                     audit_type: s.audit_type,
                                     audit_order: audit_order,
+                                    audit_group: s.audit_group || '',
+                                    audit_group_order: s.audit_group_order || 0,
+                                    audit_group_limit: s.audit_group_limit || 0,
+                                    audit_checkno_valid: s.audit_checkno_valid,
+                                    audit_group_need: s.audit_group_need || 1,
                                     sp_group: 0,
                                 });
                             }
@@ -402,7 +417,6 @@ module.exports = app => {
                     // 判断哪些audit_id不存在了,哪些audit_为新增
                     const exist = this._.difference(ids, oldIds);// 判断新增的
                     const unExist = this._.difference(oldIds, ids);// 判断已删除的
-                    console.log(ids, oldIds, exist, unExist);
                     if (exist.length > 0) {
                         const options = {
                             where: {
@@ -468,6 +482,11 @@ module.exports = app => {
                     audit_id: a.aid || a.uid || a.audit_id,
                     audit_order: a.audit_order,
                     audit_type: a.audit_type,
+                    audit_group: a.audit_group || '',
+                    audit_group_order: a.audit_group_order || 0,
+                    audit_group_limit: a.audit_group_limit || 0,
+                    audit_checkno_valid: a.audit_checkno_valid,
+                    audit_group_need: a.audit_group_need || 1,
                     audit_ledger_id: a.audit_ledger_id || '',
                     sp_group,
                 });
@@ -532,6 +551,23 @@ module.exports = app => {
             const updateData = data.map(x => { return { id: x.id, audit_ledger_id: x.audit_ledger_id }; });
             if (updateData.length > 0) await this.db.updateRows(this.tableName, updateData);
         }
+
+        async saveMultiAudit(tid, data) {
+            const orgData = await this.getAllDataByCondition({ where: { id: data.map(x => { return x.id; }) } });
+            if (orgData.length !== data.length) throw '保存数据错误,请刷新页面后重试';
+            for (const od of orgData) {
+                if (od.tid !== tid) throw '保存数据错误,请刷新页面后重试';
+            }
+            const updateData = data.map(x => {
+                return {
+                    id: x.id, audit_group: x.audit_group,
+                    audit_group_order: x.audit_group_order, audit_group_limit: x.audit_group_limit,
+                    audit_checkno_valid: x.audit_checkno_valid, audit_group_need: x.audit_group_need,
+                };
+            });
+            if (updateData.length > 0) await this.db.updateRows(this.tableName, updateData);
+            return updateData;
+        }
     }
 
     return ShenpiAudit;

+ 9 - 1
app/view/tender/shenpi.ejs

@@ -32,7 +32,6 @@
                                             <% } %>
                                         </div>
                                     </div>
-                                    <% console.log(sp, sp.status) %>
                                     <div class="alert alert-warning"><%- shenpi.sp_status_list[sp.status].name %>:<%- shenpi.sp_status_list[sp.status].msg %></div>
                                     <div class="lc-show">
                                     <% if (sp.status === shenpi.sp_status.gdspl) { %>
@@ -110,6 +109,15 @@
                                                 <% if (auditGroup[0].audit_type === auditType.key.union) { %>
                                                 <button class="btn btn-outline-primary btn-sm" sp_type="<%- sp.code %>" audit_order="<%- auditGroup[0].audit_order %>" name="union-set">协同设置</button>
                                                 <% } %>
+                                                <% if (auditGroup[0].audit_type === auditType.key.and && auditType.info[auditType.key.and].setValid.indexOf(sp.code) >= 0) { %>
+                                                <button class="btn btn-outline-primary btn-sm" sp_type="<%- sp.code %>" audit_order="<%- auditGroup[0].audit_order %>" name="and-set">会签设置</button>
+                                                <% } %>
+                                                <% if (auditGroup[0].audit_type === auditType.key.or && auditType.info[auditType.key.or].setValid.indexOf(sp.code) >= 0) { %>
+                                                <button class="btn btn-outline-primary btn-sm" sp_type="<%- sp.code %>" audit_order="<%- auditGroup[0].audit_order %>" name="or-set">或签设置</button>
+                                                <% } %>
+                                                <% if (auditGroup[0].audit_type === auditType.key.multi) { %>
+                                                <button class="btn btn-outline-primary btn-sm" sp_type="<%- sp.code %>" audit_order="<%- auditGroup[0].audit_order %>" name="multi-set">分组设置</button>
+                                                <% } %>
                                             </span>
                                         </li>
                                         <% } %>

+ 27 - 0
app/view/tender/shenpi_modal.ejs

@@ -198,6 +198,33 @@
         </div>
     </div>
 </div>
+<div class="modal fade" id="multi" data-backdrop="static">
+    <div class="modal-dialog" role="document">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="modal-title" id="multi-title">分组审批</h5>
+            </div>
+            <div class="modal-body">
+                <div class="modal-height-500" style="overflow: auto;" id="multi-spread">
+                </div>
+                <div name="set-hint" htype="<%- auditType.key.multi %>">
+                    顺序:从1开始,务必连续,某审批人审批通过时,将会跳过其前面所有的审批人。<br/>
+                    受限:受限时,前面所有的审批人都审批通过后,方可审批。
+                </div>
+                <div name="set-hint" htype="<%- auditType.key.and %>">
+                    顺序:从1开始,务必连续,某审批人审批通过时,将会跳过其前面所有的审批人。
+                </div>
+                <div name="set-hint" htype="<%- auditType.key.or %>">
+                    最少审批:该审批人审批通过时,审批通过人数满足则结束本流程。
+                </div>
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-sm btn-secondary" data-dismiss="modal">关闭</button>
+                <button type="button" class="btn btn-sm btn-primary" id="multi-ok">保存</button>
+            </div>
+        </div>
+    </div>
+</div>
 <!--存为审批组-->
 <div class="modal fade" id="spzsave" data-backdrop="static">
     <div class="modal-dialog" role="document">

+ 13 - 1
sql/update.sql

@@ -7,8 +7,20 @@
 -- 表结构
 ------------------------------------
 
+ALTER TABLE `zh_shenpi_audit`
+ADD COLUMN `audit_group` varchar(20) NOT NULL DEFAULT '' COMMENT '审批分组' AFTER `audit_ledger_id`,
+ADD COLUMN `audit_group_order` tinyint(4) NOT NULL DEFAULT 0 COMMENT '组内审批顺序' AFTER `audit_group`,
+ADD COLUMN `audit_group_limit` tinyint(4) NOT NULL DEFAULT 0 COMMENT '组内是否受限' AFTER `audit_group_order`,
+ADD COLUMN `audit_checkno_valid` tinyint(4) UNSIGNED NOT NULL DEFAULT 1 COMMENT '是否允许审批退回' AFTER `audit_group_limit`,
+ADD COLUMN `audit_group_need` tinyint(4) UNSIGNED NOT NULL DEFAULT 1 COMMENT '组内最少审批人数' AFTER `audit_checkno_valid`,
+ADD COLUMN `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后修改时间' AFTER `sp_group`;
 
-
+ALTER TABLE `zh_stage_audit`
+ADD COLUMN `audit_group` varchar(20) NOT NULL DEFAULT '' COMMENT '审批分组' AFTER `audit_ledger_id`,
+ADD COLUMN `audit_group_order` tinyint(4) NOT NULL DEFAULT 0 COMMENT '组内顺序' AFTER `audit_group`,
+ADD COLUMN `audit_group_limit` tinyint(4) NOT NULL DEFAULT 0 COMMENT '组内是否受限' AFTER `audit_group_order`,
+ADD COLUMN `audit_checkno_valid` tinyint(4) UNSIGNED NOT NULL DEFAULT 1 COMMENT '是否允许审批退回' AFTER `audit_group_limit`,
+ADD COLUMN `audit_group_need` tinyint(4) UNSIGNED NOT NULL DEFAULT 1 COMMENT '组内最少审批人数' AFTER `audit_checkno_valid`;
 
 ------------------------------------
 -- 表数据