瀏覽代碼

修复资金测试bug

ellisran 7 月之前
父節點
當前提交
68e8ea8eed

+ 6 - 3
app/controller/financial_controller.js

@@ -710,8 +710,8 @@ module.exports = app => {
                         if (auditList.length !== uids.length) {
                             throw '该用户已不存在填报人列表中,移除失败';
                         }
-                        await ctx.service.financialPayTenderAudit.delAudit(uids);
-                        responseData.data = await ctx.service.financialPayTenderAudit.getList(ctx.subProject.id, data.tid);
+                        responseData.data = await ctx.service.financialPayTenderAudit.delAudits(ctx.subProject.id, data.tid, auditList);
+                        // responseData.data = await ctx.service.financialPayTenderAudit.getList(ctx.subProject.id, data.tid);
                         break;
                     case 'save-permission':
                         result = await ctx.service.financialPayTenderAudit.updatePermission(data.updateData);
@@ -719,11 +719,14 @@ module.exports = app => {
                             throw '修改权限失败';
                         }
                         break;
+                    case 'copy-tender-audit':
+                        responseData.data = await ctx.service.financialPayTenderAudit.copyAudit2otherTender(ctx.subProject.id, data, data.this_tid);
+                        break;
                     case 'add-shenpi-audit':
                         responseData.data = await ctx.service.financialPayTenderAudit.addShenpiAudit(ctx.subProject.id, data.shenpi, data.tid);
                         break;
                     case 'copy-shenpi-audit':
-                        responseData.data = await ctx.service.financialPayTenderAudit.copyAudit2otherTender(ctx.subProject.id, data, data.this_tid);
+                        responseData.data = await ctx.service.financialPayTenderAudit.copyShenpi2otherTender(ctx.subProject.id, data, data.this_tid);
                         break;
                     case 'add-pay':
                         responseData.data = await ctx.service.financialPay.addPay(ctx.subProject.id, data.updateData);

+ 111 - 7
app/public/js/financial_pay.js

@@ -97,16 +97,19 @@ $(function () {
             toastr.error('请选择标段');
             return;
         }
-        auditUtils. makeReportListHtml(tender);
+        auditUtils.makeReportListHtml(tender);
         auditUtils.makeShenpiListHtml(tender);
     });
     auditUtils = {
         makeReportListHtml: function (flow) {
             let addHtml = '';
+            $('#select-all-ptAudits').prop('checked', false);
             for (const pl of flow.permissionList) {
-                addHtml += this.getAuditHtml(pl, 1);
+                addHtml += `<tr>
+                                <td class="text-center"><input type="checkbox" class="select-ptAudit" data-id="${pl.id}"></td><td>${pl.name}</td><td>${pl.company}</td>
+                                <td class="text-center"><input type="checkbox" class="save-report" data-id="${pl.id}" ${pl.is_report ? 'checked' : ''}></td><td class="text-center"><a href="javascript:void(0);" class="text-danger remove-audit" data-id="${pl.id}">移除</a></td>
+                            </tr>`;
             }
-            addHtml += this.getSelectAuditHtml('tender_audit', 1);
             $('#report-list').html(addHtml);
         },
         makeShenpiListHtml: function (flow) {
@@ -235,7 +238,7 @@ $(function () {
     };
 
     // 选中填报人
-    $('body').on('click', '#report-list div[id$="_dropdownMenu"] dl dd', function () {
+    $('body').on('click', 'div[id="report_audit_dropdownMenu"] dl dd', function () {
         const tid = parseInt($('#shenpi-tender-list tr.bg-warning').data('tid'));
         const tender = tenders.find(t => t.id === tid);
         if (!tender) {
@@ -261,9 +264,108 @@ $(function () {
             return;
         }
         const id = parseInt($(this).data('id'));
-        postData('/financial/'+ spid + '/pay/save', {type: 'del-tender-audit', id, tid: tender.id }, function (result) {
-            tender.permissionList = result;
-            auditUtils.makeReportListHtml(tender);
+        deleteAfterHint(function () {
+            postData('/financial/'+ spid + '/pay/save', {type: 'del-tender-audit', id, tid: tender.id }, function (result) {
+                tender.permissionList = result.permissionList;
+                tender.auditGroupList = result.auditGroupList;
+                auditUtils.makeReportListHtml(tender);
+                auditUtils.makeShenpiListHtml(tender);
+            });
+        }, '确认删除该标段用户?');
+    });
+
+    // 勾选是否为填报人
+    $('body').on('click', '#report-list .save-report', function () {
+        const tid = parseInt($('#shenpi-tender-list tr.bg-warning').data('tid'));
+        const tender = tenders.find(t => t.id === tid);
+        if (!tender) {
+            toastr.error('请选择标段');
+            return;
+        }
+        const id = parseInt($(this).data('id'));
+        const isReport = $(this).prop('checked');
+        const permission = tender.permissionList.find(p => p.id === id);
+        if (!permission) {
+            toastr.error('该用户不存在');
+            return;
+        }
+        postData('/financial/'+ spid + '/pay/save', {type: 'save-permission', updateData: { id, is_report: isReport } }, function (result) {
+            permission.is_report = isReport;
+        });
+    });
+
+    $('#select-all-ptAudits').click(function () {
+        $('#report-list .select-ptAudit').prop('checked', $(this).prop('checked'));
+    });
+
+    $('#batch-del-ptAudit').click(function () {
+        const tid = parseInt($('#shenpi-tender-list tr.bg-warning').data('tid'));
+        const tender = tenders.find(t => t.id === tid);
+        if (!tender) {
+            toastr.error('请选择标段');
+            return;
+        }
+        const ids = [];
+        $('#report-list .select-ptAudit:checked').each(function () {
+            ids.push(parseInt($(this).data('id')));
+        });
+        if (ids.length === 0) {
+            toastr.warning('请勾选要删除的用户');
+            return;
+        }
+        deleteAfterHint(function () {
+            postData('/financial/'+ spid + '/pay/save', {type: 'del-tender-audit', id: ids, tid: tender.id }, function (result) {
+                tender.permissionList = result.permissionList;
+                tender.auditGroupList = result.auditGroupList;
+                auditUtils.makeReportListHtml(tender);
+                auditUtils.makeShenpiListHtml(tender);
+            });
+        }, '确认删除已勾选的标段用户?');
+    });
+
+    $('#batch-other-ptAudit').click(function () {
+        const cur_tenderid = parseInt($('#shenpi-tender-list tr.bg-warning').data('tid'));
+        const tender = tenders.find(t => t.id === cur_tenderid);
+        if (!tender) {
+            toastr.error('请选择标段');
+            return;
+        }
+        const ids = [];
+        $('#report-list .select-ptAudit:checked').each(function () {
+            ids.push(parseInt($(this).data('id')));
+        });
+        if (ids.length === 0) {
+            toastr.warning('请勾选要同步的用户');
+            return;
+        }
+        const num = $('#shenpi-tender-list input:checked').length;
+        if (num === 0 || (num === 1 && parseInt($('#shenpi-tender-list input:checked').eq(0).parents('tr').data('tid')) === cur_tenderid)) {
+            toastr.warning('请选择需要设置审批同步的标段');
+            return;
+        }
+        const tenderList = [];
+        for (let i = 0; i < num; i++) {
+            const tid = parseInt($('#shenpi-tender-list input:checked').eq(i).parents('tr').data('tid'));
+            if (tid !== cur_tenderid) {
+                tenderList.push(tid);
+            }
+        }
+        const data = {
+            type: 'copy-tender-audit',
+            id: ids,
+            this_tid: tender.id,
+        }
+        data.tidList = tenderList.join(',');
+        postData('/financial/'+ spid + '/pay/save',  data, function (result) {
+            toastr.success('已同步到其它勾选标段');
+            for (let i = 0; i < num; i++) {
+                const tid = parseInt($('#shenpi-tender-list input:checked').eq(i).parents('tr').data('tid'));
+                if (tid !== cur_tenderid) {
+                    const other_tender = tenders.find(t => t.id === tid);
+                    const permissionList = _.filter(result.otherPermissionList, { tid: tid });
+                    other_tender.permissionList = permissionList;
+                }
+            }
         });
     });
 
@@ -309,6 +411,8 @@ $(function () {
                     '                                        </li>');
             }
             _self.parents('li').html(auditUtils.getAuditGroupInnerHtml(this_code, auditGroup, prop.audit_order));
+            tender.permissionList = result.permissionList;
+            auditUtils.makeReportListHtml(tender);
         });
     });
 

+ 103 - 6
app/service/financial_pay_tender_audit.js

@@ -40,6 +40,7 @@ module.exports = app => {
                     continue;
                 }
                 l.name = accountInfo.name;
+                l.company = accountInfo.company;
             }
             if (removeList.length > 0) {
                 for (const r of removeList) {
@@ -89,8 +90,53 @@ module.exports = app => {
             return true;
         }
 
-        async delAudit(id) {
-            return await this.db.delete(this.tableName, { id });
+        async delAudits(spid, tid, datas) {
+            // return await this.db.delete(this.tableName, { id });
+            // 需要同时移除审批流程里的人
+            const reponseData = {};
+            const transaction = await this.db.beginTransaction();
+            try {
+                await transaction.delete(this.tableName, { id: this._.map(datas, 'id') });
+                const shenpiAudits = await this.ctx.service.shenpiAudit.getAuditList(tid, shenpiConst.sp_other_type.financial, shenpiConst.sp_status.gdspl);
+                const uids = this._.map(datas, 'uid');
+                const removeData = [];
+                for (const sp of shenpiAudits) {
+                    if (this._.includes(uids, sp.audit_id)) {
+                        removeData.push(sp.id);
+                    }
+                }
+                if (removeData.length > 0) {
+                    await transaction.delete(this.ctx.service.shenpiAudit.tableName, { id: removeData });
+                    // 重新分配order值
+                    const newSpAudits = await transaction.select(this.ctx.service.shenpiAudit.tableName, { where: { tid, sp_type: shenpiConst.sp_other_type.financial, sp_status: shenpiConst.sp_status.gdspl }, orders: [['audit_order', 'asc'], ['id', 'asc']] });
+                    // groupby audit_order
+                    const newSpAuditsGroup = this._.groupBy(newSpAudits, 'audit_order');
+                    const updateData = [];
+                    let order = 1;
+                    for (const a in newSpAuditsGroup) {
+                        const sameOrderAudits = newSpAuditsGroup[a];
+                        for (const sa of sameOrderAudits) {
+                            if (sa.audit_order !== order) {
+                                updateData.push({
+                                    id: sa.id,
+                                    audit_order: order,
+                                });
+                            }
+                        }
+                        order++;
+                    }
+                    if (updateData.length > 0) {
+                        await transaction.updateRows(this.ctx.service.shenpiAudit.tableName, updateData);
+                    }
+                }
+                await transaction.commit();
+                reponseData.permissionList = await this.getList(spid, tid);
+                reponseData.auditGroupList = await this.ctx.service.shenpiAudit.getAuditGroupList(tid, shenpiConst.sp_other_type.financial, shenpiConst.sp_status.gdspl);
+            } catch (error) {
+                console.log(error);
+                await transaction.rollback();
+            }
+            return reponseData;
         }
 
         async updatePermission(updateData) {
@@ -108,11 +154,17 @@ module.exports = app => {
                 const transaction = await this.db.beginTransaction();
                 try {
                     // 判断是否存在并加入到成员表中
+                    const fptAudit = await this.getDataByCondition({ spid, tid, uid: data.audit_id });
+                    if (!fptAudit) {
+                        await transaction.insert(this.tableName, { spid, tid, uid: data.audit_id, create_time: new Date() });
+                    }
+                    // 判断是否存在并加入到成员表中
                     const fAudit = await this.ctx.service.financialAudit.getDataByCondition({ spid, uid: data.audit_id });
                     if (!fAudit) {
                         await transaction.insert(this.ctx.service.financialAudit.tableName, { spid, uid: data.audit_id, create_time: new Date() });
                     }
                     await transaction.commit();
+                    reponseData.permissionList = await this.getList(spid, tid);
                 } catch (error) {
                     console.log(error);
                     await transaction.rollback();
@@ -121,14 +173,14 @@ module.exports = app => {
             return reponseData;
         }
 
-        async copyAudit2otherTender(spid, data, tid) {
+        async copyShenpi2otherTender(spid, data, tid) {
             const reponseData = {};
             const info = await this.ctx.service.shenpiAudit.copyAudit2otherTender(data, tid);
             if (info) {
                 const transaction = await this.db.beginTransaction();
                 try {
-                    const permissionList = await this.getAllDataByCondition({ where: { spid, tid } });
-                    const uidList = this._.map(permissionList, 'uid');
+                    // const permissionList = await this.getAllDataByCondition({ where: { spid, tid } });
+                    const uidList = this._.map(data.auditList, 'audit_id');
                     const tidList = data.tidList.split(',');
                     if (tidList.length === 0) {
                         throw '没有选择要复制的标段';
@@ -140,7 +192,10 @@ module.exports = app => {
                             const tenderAudits = await this.getAllDataByCondition({ where: { spid, tid: t } });
                             const diffList = this._.difference(uidList, this._.map(tenderAudits, 'uid'));
                             for (const d of diffList) {
-                                pushData.push({ spid, tid: t, uid: d, create_time: times });
+                                pushData.push({
+                                    spid, tid: t, uid: d,
+                                    create_time: times,
+                                });
                             }
                         }
                         if (pushData.length > 0) await transaction.insert(this.tableName, pushData);
@@ -154,6 +209,48 @@ module.exports = app => {
             }
             return reponseData;
         }
+
+        async copyAudit2otherTender(spid, data, tid) {
+            const reponseData = {};
+            const transaction = await this.db.beginTransaction();
+            try {
+                const permissionList = await this.getAllDataByCondition({ where: { spid, tid } });
+                const uidList = this._.map(permissionList, 'uid');
+                const tidList = data.tidList.split(',');
+                if (tidList.length === 0) {
+                    throw '没有选择要复制的标段';
+                }
+                if (uidList.length > 0) {
+                    const pushData = [];
+                    const updateData = [];
+                    const times = new Date();
+                    for (const t of tidList) {
+                        const tenderAudits = await this.getAllDataByCondition({ where: { spid, tid: t } });
+                        const diffList = this._.difference(uidList, this._.map(tenderAudits, 'uid'));
+                        for (const d of diffList) {
+                            const p = permissionList.find(item => item.uid === d);
+                            pushData.push({ spid, tid: t, uid: p.uid, is_report: p.is_report, create_time: times });
+                        }
+                        const sameList = this._.intersection(this._.map(tenderAudits, 'uid'), uidList);
+                        for (const s of sameList) {
+                            const p = permissionList.find(item => item.uid === s);
+                            const t = tenderAudits.find(item => item.uid === s);
+                            if (p.is_report !== t.is_report) {
+                                updateData.push({ id: t.id, is_report: p.is_report });
+                            }
+                        }
+                    }
+                    if (pushData.length > 0) await transaction.insert(this.tableName, pushData);
+                    if (updateData.length > 0) await transaction.updateRows(this.tableName, updateData);
+                }
+                await transaction.commit();
+                reponseData.otherPermissionList = await this.getList(spid, tidList);
+            } catch (error) {
+                console.log(error);
+                await transaction.rollback();
+            }
+            return reponseData;
+        }
     }
     return FinancialPayTenderAudit;
 };

+ 49 - 14
app/view/financial/pay_modal.ejs

@@ -116,15 +116,15 @@
     </div>
 </div>
 <% if (ctx.session.sessionUser.is_admin) { %>
-<div class="modal fade" id="liucheng" data-backdrop="static">
-    <div class="modal-dialog modal-lg" role="document">
+<div class="modal fade" id="liucheng" data-backdrop="static" style="z-index: 1049">
+    <div class="modal-dialog modal-xl" role="document">
         <div class="modal-content">
             <div class="modal-header">
                 <h5 class="modal-title">审批流程</h5>
             </div>
             <div class="modal-body pt-0">
-                <div class="row">
-                    <div class="col-4">
+                <div class="row" style="min-height: 400px;max-height: 700px;overflow:auto;">
+                    <div class="col-3">
                         <div class="p-2">标段列表</div>
                         <table class="table table-bordered">
                             <thead>
@@ -137,19 +137,54 @@
                             </tbody>
                         </table>
                     </div>
-                    <div class="col">
+                    <div class="col-4">
                         <div class="d-flex flex-row bg-graye">
-                            <div class="p-2"><a href="javascript:void(0);" id="set-other-tenders">设置填报人及流程至其他已勾选标段</a></div>
+                            <div class="px-2 pt-1 dropdown">
+                                <button class="btn btn-outline-primary btn-sm dropdown-toggle" type="button" id="report_audit_dropdownMenuButton" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
+                                    添加用户
+                                </button>
+                                <div class="dropdown-menu dropdown-menu-right" id="report_audit_dropdownMenu" aria-labelledby="report_audit_dropdownMenuButton" style="width:220px">
+                                    <div class="mb-2 p-2"><input class="form-control form-control-sm gr-search" placeholder="姓名/手机 检索" data-code="report_audit" autocomplete="off"></div>
+                                    <dl class="list-unstyled book-list">
+                                        <% accountGroup.forEach((group, idx) => { %>
+                                            <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 => { %>
+                                                    <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>
+                                                <% });%>
+                                            </div>
+                                        <% }) %>
+                                    </dl>
+                                </div>
+                            </div>
+                            <div class="p-2"><a href="javascript:void(0);" class="text-danger" id="batch-del-ptAudit">批量删除</a></div>
+                            <div class="p-2"><a href="javascript:void(0);" id="batch-other-ptAudit">同步勾选用户至其他已勾选标段</a></div>
                         </div>
-                        <div>
-                            <ul class="list-unstyled">
-                                <li class="d-flex justify-content-start align-items-center">
-                                    <span class="col-auto">填报人</span>
-                                    <span class="col-10 spr-span" id="report-list">
-                                    </span>
-                                </li>
-                            </ul>
+                        <table class="table table-bordered">
+                            <thead>
+                            <tr class="text-center"><th><input type="checkbox" id="select-all-ptAudits"></th><th>用户名</th><th>单位</th><th>填报</th><th>操作</th></tr>
+                            </thead>
+                            <tbody id="report-list">
+                            </tbody>
+                        </table>
+                    </div>
+                    <div class="col-5">
+                        <div class="d-flex flex-row bg-graye">
+                            <div class="p-2"><a href="javascript:void(0);" id="set-other-tenders">设置流程至其他已勾选标段</a></div>
                         </div>
+<!--                        <div>-->
+<!--                            <ul class="list-unstyled">-->
+<!--                                <li class="d-flex justify-content-start align-items-center">-->
+<!--                                    <span class="col-auto">填报人</span>-->
+<!--                                    <span class="col-10 spr-span" id="report-list">-->
+<!--                                    </span>-->
+<!--                                </li>-->
+<!--                            </ul>-->
+<!--                        </div>-->
                         <div id="shenpi-list">
                         </div>
                     </div>