浏览代码

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

Tony Kang 1 年之前
父节点
当前提交
1ca832a292

+ 7 - 0
app/controller/change_controller.js

@@ -131,6 +131,7 @@ module.exports = app => {
                 },
             });
             const apLists = allPlanCodes.length > 0 ? ctx.app._.uniq(ctx.app._.map(allPlanCodes, 'plan_code')) : [];
+            const need_checking = await ctx.service.change.getCheckingList(ctx.tender.id, ctx.session.sessionUser.accountId, true);
 
             const renderData = {
                 moment,
@@ -157,6 +158,7 @@ module.exports = app => {
                 apLists,
                 auditType,
                 precision: ctx.tender.info.precision,
+                need_checking,
             };
 
             if (ctx.session.sessionProject.page_show.openChangeState) {
@@ -354,6 +356,11 @@ module.exports = app => {
                     case 'get_shenpi_list':
                         responseData.data.checkingList = await ctx.service.change.getCheckingList(ctx.tender.id, ctx.session.sessionUser.accountId);
                         break;
+
+                    case 'set_shenpi_list':
+                        await ctx.service.changeAudit.batchSetAudits(ctx.tender.id, data.cids, data.from_cid);
+                        responseData.data.uncheckList = await ctx.service.change.getUncheckList(ctx.tender.id, ctx.tender.info.shenpi.change);
+                        break;
                     default: throw '参数有误';
                 }
                 ctx.body = responseData;

+ 5 - 1
app/controller/stage_controller.js

@@ -28,6 +28,7 @@ const stdConst = require('../const/standard');
 const LzString = require('lz-string');
 const spreadSetting = require('../lib/spread_setting');
 const funSetConst = require('../const/fun_set');
+const PermissionCheck = require('../const/account_permission').PermissionCheck;
 
 module.exports = app => {
     class StageController extends app.BaseController {
@@ -188,6 +189,7 @@ module.exports = app => {
                 renderData.hintMinusCb = projectFunInfo.banMinusChangeBills && ctx.tender.info.ledger_check.banMinusChangeBills;
                 renderData.categoryData = await ctx.service.category.getAllCategory(this.ctx.session.sessionProject.id);
                 renderData.settleStatus = ctx.service.settle.settleStatus;
+                renderData.deleteFilePermission = PermissionCheck.delFile(this.ctx.session.sessionUser.permission);
                 await this.layout('stage/index.ejs', renderData, 'stage/modal.ejs');
             } catch (err) {
                 this.log(err);
@@ -1033,6 +1035,7 @@ module.exports = app => {
 
                 const projectFunInfo = await this.ctx.service.project.getFunRela(ctx.session.sessionProject.id);
                 renderData.lockPayExpr = projectFunInfo.lockPayExpr;
+                renderData.deleteFilePermission = PermissionCheck.delFile(this.ctx.session.sessionUser.permission);
 
                 if (!ctx.stage.readOnly || ctx.tender.isTourist) {
                     // 计算 本期金额
@@ -1794,13 +1797,14 @@ module.exports = app => {
             };
             try {
                 this._checkStageCanModifyRe(ctx);
+                const deleteFilePermission = PermissionCheck.delFile(this.ctx.session.sessionUser.permission);
 
                 const data = JSON.parse(ctx.request.body.data);
                 const fileInfo = await ctx.service.stageAtt.getDataById(data.id);
                 if (!fileInfo || !Object.keys(fileInfo).length) {
                     throw '该文件不存在';
                 }
-                if (!fileInfo.extra_upload && ctx.stage.status === auditConst.status.checked) {
+                if (!fileInfo.extra_upload && ctx.stage.status === auditConst.status.checked && !deleteFilePermission) {
                     throw '无权限删除';
                 }
                 if (fileInfo !== undefined && fileInfo !== '') {

+ 5 - 2
app/controller/stage_extra_controller.js

@@ -12,6 +12,7 @@ const sendToWormhole = require('stream-wormhole');
 const path = require('path');
 const moment = require('moment');
 const fs = require('fs');
+const PermissionCheck = require('../const/account_permission').PermissionCheck;
 
 module.exports = app => {
 
@@ -94,6 +95,7 @@ module.exports = app => {
                     jsFiles: this.app.jsFiles.common.concat(this.app.jsFiles.stageExtra.bonus),
                     auditConst,
                     stage: ctx.stage,
+                    deleteFilePermission: PermissionCheck.delFile(this.ctx.session.sessionUser.permission),
                 };
                 await this.layout('stage_extra/bonus.ejs', renderData, 'stage_extra/bonus_modal.ejs');
             } catch (err) {
@@ -417,7 +419,8 @@ module.exports = app => {
                 const fileInfo = bonus.proof_file[data.index];
                 if (fileInfo.uid !== ctx.session.sessionUser.accountId) throw '您无权删除该文件';
 
-                if (ctx.stage.status === auditConst.status.checked && !fileInfo.renew) throw '不可删除该文件';
+                const deleteFilePermission = PermissionCheck.delFile(this.ctx.session.sessionUser.permission);
+                if (ctx.stage.status === auditConst.status.checked && !fileInfo.renew && !deleteFilePermission) throw '不可删除该文件';
 
                 // 先删除文件
                 await fs.unlinkSync(path.join(this.app.baseDir, fileInfo.filepath));
@@ -435,7 +438,7 @@ module.exports = app => {
                 ctx.body = {err: 0, msg: '', data: bonus.proof_file};
             } catch (err) {
                 this.log(err);
-                this.postError(err, '删除文件失败');
+                this.ctx.ajaxErrorBody(err, '删除文件失败');
             }
         }
     }

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

@@ -4719,7 +4719,7 @@ $(document).ready(function() {
           $('#showAttachment').hide();
           $('#showAttachment').attr('file-id', '');
       });
-  })
+  });
 });
 // 生成当前节点列表
 function getNodeList(node) {

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

@@ -160,7 +160,7 @@ $(document).ready(() => {
                     // 下载
                     html.push('<a href="download/file?b_id=' + id + '&index=' + i + '" title="下载"><i class="fa fa-download "></i></a>');
                     // 删除
-                    if (f.uid === userID && ((!isPre(data) && !stageChecked) || f.renew)) {
+                    if (f.uid === userID && ((!isPre(data) && !stageChecked) || f.renew || deleteFilePermission)) {
                         html.push('<a class="delete-att text-danger ml-1" href="javascript:void(0);" data-id ="' + id + '"file-index="' + i + '" title="删除"><i class="fa fa-remove "></i></a>');
                     }
                     html.push('</td>');

+ 37 - 6
app/public/js/stage.js

@@ -122,12 +122,15 @@ function getAllList(currPageNum = 1) {
     let html = '';
     // '/tender/' + tender.id + '/measure/stage/' + stage.order + '/download/file/' + att.id
     for(const att of currPageAttData) {
+        const delHtml = deleteFilePermission && parseInt(cur_uid) === att.uid
+            ? `<a class="ml-1 text-danger" href="javascript:void(0)" name="att-delete" file-id="${att.id}"><i class="fa fa-close" title="删除"></i></a>`
+            : '';
         html += `<tr>
         <td width="25"><input type="checkbox" class="check-file" file-id=${att.id}></td>
         <td>
         <div class="d-flex">
-            <a href="javascript:void(0)" class="pl-0 col-11 att-file-name" file-id=${att.id}>${att.filename}${att.fileext}</a>
-            <a href="/tender/${tender.id}/measure/stage/${stage.order}/download/file/${att.id}" class="col-1 pl-0 att-file-btn"><i class="fa fa-download"></i></a>
+            <a href="javascript:void(0)" class="pl-0 col-10 att-file-name" file-id=${att.id}>${att.filename}${att.fileext}</a>
+            <div class="att-file-btn col-2"><a href="/tender/${tender.id}/ledger/download/file/${att.id}" class="pl-0"><i class="fa fa-download"></i></a>${delHtml}</div>
         </div>
         </td><td>${att.username}</td></tr>`
     }
@@ -135,20 +138,23 @@ function getAllList(currPageNum = 1) {
     $('#alllist-table').on('click', 'tr', function() {
         $('#alllist-table tr').removeClass('bg-light')
         $(this).addClass('bg-light')
-    })
+    });
 }
 // 生成当前节点列表
 function getNodeList(node) {
     let html = '';
     for(const att of attData) {
         if (node === att.lid) {
+            const delHtml = deleteFilePermission && parseInt(cur_uid) === att.uid
+                ? `<a class="ml-1 text-danger" href="javascript:void(0)" name="att-delete" file-id="${att.id}"><i class="fa fa-close" title="删除"></i></a>`
+                : '';
             // html += '<tr><td><a href="javascript:void(0)" file-id="'+ att.id +'">'+ att.filename + att.fileext +'</a></td><td>'+ att.username +'</td></tr>';
             html += `<tr>
             <td width="25"><input type="checkbox" class="check-file" file-id=${att.id}></td>
             <td>
             <div class="d-flex">
-                <a href="javascript:void(0)" class="pl-0 col-11 att-file-name" file-id=${att.id}>${att.filename}${att.fileext}</a>
-                <a href="/tender/${tender.id}/measure/stage/${stage.order}/download/file/${att.id}" class="col-1 pl-0 att-file-btn"><i class="fa fa-download"></i></a>
+                <a href="javascript:void(0)" class="pl-0 col-10 att-file-name" file-id=${att.id}>${att.filename}${att.fileext}</a>
+                <div class="att-file-btn col-2"><a href="/tender/${tender.id}/ledger/download/file/${att.id}" class="pl-0"><i class="fa fa-download"></i></a>${delHtml}</div>
             </div>
             </td><td>${att.username}</td></tr>`
         }
@@ -3151,7 +3157,7 @@ $(document).ready(() => {
             let html = [];
             if (data.attachment) {
                 for (const att of data.attachment) {
-                    const delHtml = (parseInt(att.uid) === userID && (att.renew || stage.status !== auditConst.status.checked))
+                    const delHtml = (parseInt(att.uid) === userID && (att.renew || stage.status !== auditConst.status.checked || deleteFilePermission))
                         ? '<a class="delete-att text-danger ml-1" href="javascript:void(0);" data-imid="'+ data.att_uuid +'" data-attid="'+ att.file_id +'" title="删除"><i class="fa fa-remove "></i></a>'
                         : '';
                     const viewHtml = att.viewpath ? `<a class="ml-1" href="${att.viewpath}" target="_blank" title="预览"><i class="fa fa-eye"></i></a>` : '';
@@ -5320,6 +5326,31 @@ $(document).ready(() => {
             stageAssistRela.refreshAssistTable();
         });
     });
+    $('body').on('click', 'a[name=att-delete]', function() {
+        const fid = this.getAttribute('file-id');
+        if (!fid) return;
+
+        const node = SpreadJsObj.getSelectObject(slSpread.getActiveSheet());
+        const data = {id: fid};
+        postData('/tender/' + tender.id + '/measure/stage/' + stage.order + '/delete/file', data, function (result) {
+            // 删除到attData中
+            const att_index = attData.findIndex(function (item) {
+                return item.id === parseInt(fid);
+            });
+            attData.splice(att_index, 1);
+            // 重新生成List
+
+            if ($('#alllist-table tr').length === 1) {
+                getAllList(parseInt($('#currentPage').text()) - 1);
+
+            } else {
+                getAllList(parseInt($('#currentPage').text()));
+            }
+            getNodeList(node.id);
+            $('#showAttachment').hide();
+            $('#showAttachment').attr('file-id', '');
+        });
+    });
 });
 function makeOneShouFang(sf) {
     const lData = _.find(ledgerData, { id: sf.lid });

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

@@ -34,7 +34,7 @@ function makeAttTable(payNode) {
     let html = '';
     if (attachment !== null) {
         for (const att of attachment) {
-            const delhtml = uploadPermission && parseInt(att.uid) === userID && (att.renew || stage.status !== auditConst.status.checked)
+            const delhtml = uploadPermission && parseInt(att.uid) === userID && (att.renew || stage.status !== auditConst.status.checked || deleteFilePermission)
                 ? '<a class="delete-att text-danger" href="javascript:void(0);" data-fileid="'+ att.id +'" title="删除"><i class="fa fa-remove "></i></a>'
                 : '';
             html += '<tr><td style="width: 200px">' + att.filename + att.fileext + '</td><td>' + att.username + '</td><td>' + att.in_time + '</td>' +

+ 7 - 4
app/service/change.js

@@ -2099,7 +2099,7 @@ module.exports = app => {
 
         async getUncheckList(tid, shenpi_status) {
             const sql = 'select c.* from ?? as c where c.tid = ? ' +
-                'and (c.status = ? OR c.status = ?) AND c.code != "" AND c.name != "" AND c.content is not NULL AND c.content != ""';
+                'and (c.status = ? OR c.status = ?) AND c.code != "" AND c.name != "" AND c.content is not NULL AND c.content != "" ORDER BY CHAR_LENGTH(c.code) DESC,convert(c.code using gbk) DESC';
             const sqlParams = [this.tableName, tid, audit.change.status.uncheck, audit.change.status.checkNo];
             const list = await this.db.query(sql, sqlParams);
             const returnList = [];
@@ -2140,7 +2140,7 @@ module.exports = app => {
                         }
                     }
                 } else if (shenpi_status === shenpiConst.sp_status.gdzs) {
-                    const shenpiInfo = await this.service.shenpiAudit.getDataByCondition({ tid: this.tender.id, sp_type: shenpiConst.sp_type.change, sp_status: shenpi_status });
+                    const shenpiInfo = await this.service.shenpiAudit.getDataByCondition({ tid, sp_type: shenpiConst.sp_type.change, sp_status: shenpi_status });
                     // 判断最后一个id是否与固定终审id相同,不同则删除原审批流中如果存在的id和添加终审
                     const lastAuditors = auditList.filter(x => { return x.usite === auditList.length - 1; });
                     if (shenpiInfo && (lastAuditors.length === 0 || (lastAuditors.length > 1 || shenpiInfo.audit_id !== lastAuditors[0].uid))) {
@@ -2154,10 +2154,13 @@ module.exports = app => {
             return returnList;
         }
 
-        async getCheckingList(tid, uid) {
-            const sql = 'select c.* from ?? as c LEFT JOIN ?? as ca ON c.cid = ca.cid where c.tid = ? and ca.status = ? and ca.uid = ? and ca.usite != 0';
+        async getCheckingList(tid, uid, checking_count = false) {
+            const sql = 'select c.* from ?? as c LEFT JOIN ?? as ca ON c.cid = ca.cid where c.tid = ? and ca.status = ? and ca.uid = ? and ca.usite != 0 ORDER BY CHAR_LENGTH(c.code) DESC,convert(c.code using gbk) DESC';
             const sqlParams = [this.tableName, this.ctx.service.changeAudit.tableName, tid, audit.change.status.checking, uid];
             const list = await this.db.query(sql, sqlParams);
+            if (checking_count) {
+                return list.length;
+            }
             const returnList = [];
             // 判断是否是终审
             for (const l of list) {

+ 44 - 0
app/service/change_audit.js

@@ -1369,6 +1369,50 @@ module.exports = app => {
                 throw err;
             }
         }
+
+        async batchSetAudits(tid, cids, from_cid) {
+            const transaction = await this.db.beginTransaction();
+            try {
+                const changes = await this.ctx.service.change.getAllDataByCondition({ where: { tid, cid: cids } });
+                const from_change = await this.ctx.service.change.getDataByCondition({ tid, cid: from_cid });
+                const new_audits = await transaction.select(this.tableName, { where: { cid: from_cid, times: from_change.times }, orders: [['audit_order', 'asc']] });
+                new_audits.shift();
+                const insertAudits = [];
+                const updateChanges = [];
+                for (const c of changes) {
+                    if (from_change.sp_group !== c.sp_group) {
+                        updateChanges.push({
+                            row: { sp_group: from_change.sp_group },
+                            where: { tid, cid: c.cid }
+                        });
+                    }
+                    const newAudits = new_audits.map(x => {
+                        return {
+                            tid, cid: c.cid, uid: x.uid, name: x.name,
+                            company: x.company, jobs: x.role,
+                            usort: x.usort, usite: x.usite,
+                            audit_order: x.audit_order, audit_type: x.audit_type,
+                            times: c.times, status: auditConst.status.uncheck,
+                        };
+                    });
+                    // 先删除旧的审批流(除了原报),再添加新的
+                    const sql = 'DELETE FROM ?? WHERE `cid`= ? AND `times` = ? AND `usite` != 0';
+                    const sqlParam = [this.tableName, c.cid, c.times];
+                    await transaction.query(sql, sqlParam);
+                    // await transaction.delete(this.tableName, { tid, cid: c.cid, times: c.times });
+                    insertAudits.push(...newAudits);
+                }
+                if (updateChanges.length > 0) await transaction.updateRows(this.ctx.service.change.tableName, updateChanges);
+                if (insertAudits.length > 0) await transaction.insert(this.tableName, insertAudits);
+                // 更新到审批流程方法
+                await transaction.commit();
+                return true;
+            } catch (err) {
+                console.log(err);
+                await transaction.rollback();
+                throw err;
+            }
+        }
     }
 
     return ChangeAudit;

+ 3 - 1
app/view/change/index.ejs

@@ -74,7 +74,9 @@
                     <a href="#setting" data-toggle="modal" data-target="#setting" class="btn btn-sm btn-outline-primary pull-right ml-2"><i class="fa fa-cog"></i></a>
                     <a href="#batch-sb" data-toggle="modal" data-target="#batch-sb" class="btn btn-sm btn-primary pull-right ml-2">批量上报</a>
                 <% } %>
+                <% if (need_checking) { %>
                     <a href="#batch-sp" data-toggle="modal" data-target="#batch-sp" class="btn btn-sm btn-success pull-right">批量审批</a>
+                <% } %>
             </div>
         </div>
     </div>
@@ -123,7 +125,7 @@
                                 <% if (curAudit.status === auditConst.status.checking) { %>
                                 <a href="<%- '/tender/' + ctx.tender.id + '/change/' + c.cid %>/information" class="btn <%- auditConst.statusButtonClass[c.status] %> btn-sm"><%- auditConst.statusButton[c.status] %></a>
                                 <% } else { %>
-                                <span class="<%- auditConst.auditStringClass[curAudit.status] %>"><%- auditConst.auditString[curAudit.status] %></span>
+                                <span class="<%- auditConst.auditStringClass[c.status] %>"><%- auditConst.auditString[c.status] %></span>
                                 <% } %>
                             <% } else if (c.status === auditConst.status.checkNoPre && c.curAuditor2 && c.curAuditor2.findIndex(x => { return x.uid === ctx.session.sessionUser.accountId; }) >= 0) { %>
                                 <% const curAudit = c.curAuditors2.find(x => { return x.uid === ctx.session.sessionUser.accountId; }); %>

+ 70 - 34
app/view/change/modal.ejs

@@ -217,11 +217,12 @@
                 <div class="row">
                     <!-- 左侧变更令 -->
                     <div class="col-6" >
-                        <div class="modal-height-500" style="overflow-y:auto;">
+                        <div class="modal-height-500" style="height:521px;overflow-y:auto;">
                             <table class="table table-hover table-bordered">
                                 <thead>
                                 <tr>
-                                    <th width="15%" class="text-center"><div class="align-middle"><input id="select-all-uncheck" type="checkbox"></div></th>
+                                    <th width="10%" class="text-center"><div class="align-middle"><input id="select-all-uncheck" type="checkbox"></div></th>
+                                    <th width="7%">序号</th>
                                     <th width="40%">变更令编号</th>
                                     <th width="">原审批流程</th>
                                 </tr>
@@ -233,8 +234,10 @@
                     </div>
                     <!-- 右侧新审批流程 -->
                     <div class="col-6">
-                        <div class=" ml-auto">
-                            <div class="dropdown text-right" id="show-audit-select">
+                        <div class="ml-auto">
+                            <div class="dropdown row">
+                                <span class="col-7"><button class="btn btn-sm btn-primary" id="synchronize_shenpi_btn">同步流程至其它已勾选变更令</button></span>
+                                <span class="col-5 text-right" id="show-audit-select"></span>
                             </div>
                             <div class="card mt-1">
                                 <div class="card-header">
@@ -248,11 +251,11 @@
                         </div>
                     </div>
                 </div>
-                <div class="alert alert-warning mt-2 mb-0">批量操作会覆盖原审批流程,请合理选择。</div>
+                <div class="alert alert-warning mt-2 mb-0">没有设置审批流的变更令将无法上报,请先设置审批流。</div>
             </div>
             <div class="modal-footer">
                 <button type="button" class="btn btn-sm btn-secondary" data-dismiss="modal">取消</button>
-                <button class="btn btn-sm btn-primary" id="batch_uncheck_btn">确定</button>
+                <button class="btn btn-sm btn-primary" id="batch_uncheck_btn">确定上报</button>
             </div>
         </div>
     </div>
@@ -269,7 +272,7 @@
                     <div class="progress-tz-bar progress-bar progress-bar-striped progress-bar-animated" role="progressbar" style="width: 100%" aria-valuenow="100" aria-valuemin="0" aria-valuemax="100"></div>
                 </div>
                 <div class="mt-1 progress-tz-text">台账获取并处理中...</div>
-                <div class="change-progress">
+                <div class="change-progress modal-height-500" style="overflow-y:auto;">
                 </div>
             </div>
             <div class="modal-footer" style="display: none">
@@ -295,9 +298,10 @@
                         <thead>
                         <tr>
                             <th width="5%"><div class="align-middle text-center"><input type="checkbox" id="select-all-checking"></div></th>
+                            <th width="7%">序号</th>
                             <th width="25%">变更令编号</th>
                             <th width="">变更令名称</th>
-                            <th width="25%">批编号</th>
+                            <th width="25%">批编号</th>
                         </tr>
                         </thead>
                         <tbody id="checking_list">
@@ -324,7 +328,7 @@
                     <div class="progress-tz-bar progress-bar progress-bar-striped progress-bar-animated" role="progressbar" style="width: 100%" aria-valuenow="100" aria-valuemin="0" aria-valuemax="100"></div>
                 </div>
                 <div class="mt-1 progress-tz-text">台账获取并处理中...</div>
-                <div class="change-progress">
+                <div class="change-progress modal-height-500" style="overflow-y:auto;">
                 </div>
             </div>
             <div class="modal-footer" style="display: none">
@@ -383,12 +387,14 @@
                 $('#select-all-uncheck').prop('checked', false);
                 shenpi_status = res.shenpi_status;
                 uncheckList = res.uncheckList;
-                for (const l of res.uncheckList) {
-                    html += '<tr>' +
-                        `<td class="text-center"><input type="checkbox" value="${l.cid}"></td>` +
-                        `<td class=""><a href="/tender/${tenderId}/change/${l.cid}/information" target="_blank">${l.code}</a></td>` +
-                        '<td>' + setAuditList(l.auditList) +'</td>' +
-                        '</tr>';
+                if (res.uncheckList.length > 0) {
+                    for (const [i, l] of res.uncheckList.entries()) {
+                        html += '<tr>' +
+                            `<td class="text-center"><input type="checkbox" value="${l.cid}"></td><td>${i + 1}</td>` +
+                            `<td class=""><a href="/tender/${tenderId}/change/${l.cid}/information" target="_blank">${l.code}</a></td>` +
+                            '<td>' + setAuditList(l.auditList) +'</td>' +
+                            '</tr>';
+                    }
                 }
                 $('#uncheck_list').html(html);
                 if (res.uncheckList.length > 0) {
@@ -406,11 +412,8 @@
                     for (const g of res.spGroupList) { %>
                         optionHtml += `<option value="${g.id}" ${res.uncheckList.length > 0 && g.id === res.uncheckList[0].sp_group ? 'selected' : ''}>${g.name}</option>`;
                     }
-                    showAuditSelectHtml += '<div class="row">' +
-                        '<div class="col-7"></div>' +
-                    '<div class="col-5">' +
-                        '<select class="form-control form-control-sm change-sp-group">' + optionHtml + '</select>' +
-                    '</div></div>';
+                    showAuditSelectHtml += '<select class="form-control form-control-sm change-sp-group">' + optionHtml + '</select>';
+                    $('#synchronize_shenpi_btn').css('margin-top', '5px');
                 } else {
                     accountList = res.accountList;
                     accountGroup = res.accountGroup;
@@ -484,6 +487,36 @@
             $('#uncheck_list tr').find('input[type="checkbox"]').prop('checked', $(this).prop('checked'));
         });
 
+        $('#synchronize_shenpi_btn').click(function () {
+            const this_cid = $('#uncheck_list tr[class="table-warning"]').find('a').attr('href').split('/')[4];
+            const info = uncheckList.find(l => l.cid === this_cid);
+            if (!this_cid || !info) {
+                toastr.error('请先选择一个变更令');
+                return false;
+            }
+            if ($('#uncheck_list input:checked').length === 0) {
+                toastr.error('请至少勾选一个变更令');
+                return false;
+            }
+            const cids = [];
+            $('#uncheck_list input:checked').each(function () {
+                cids.push($(this).val());
+            });
+            if (cids.length === 1 && cids[0] === this_cid) {
+                toastr.error('请至少勾选一个其它变更令');
+                return false;
+            }
+            if (cids.indexOf(this_cid) !== -1) cids.splice(cids.indexOf(this_cid), 1);
+            console.log(cids, info);
+            postData(`/tender/${tenderId}/change/batch/fun`, { type: 'set_shenpi_list', cids, from_cid: this_cid }, function (res) {
+                toastr.success('同步流程成功');
+                uncheckList = res.uncheckList;
+                for (const index in res.uncheckList) {
+                    $('#uncheck_list tr').eq(index).children('td').eq(3).html(setAuditList(res.uncheckList[index].auditList));
+                }
+            });
+        });
+
         let timer = null;
         let oldSearchVal = null;
         $('body').on('input propertychange', 'div[id$="_dropdownMenu"] .gr-search', function(e) {
@@ -559,7 +592,7 @@
                     const index = uncheckList.findIndex(item => item.cid === this_cid);
                     if (index !== -1) {
                         uncheckList[index].auditList = datas;
-                        $('#uncheck_list tr').eq(index).children('td').eq(2).html(setAuditList(datas));
+                        $('#uncheck_list tr').eq(index).children('td').eq(3).html(setAuditList(datas));
                     }
                 });
             }
@@ -586,7 +619,7 @@
                 const index = uncheckList.findIndex(item => item.cid === this_cid);
                 if (index !== -1) {
                     uncheckList[index].auditList = datas;
-                    $('#uncheck_list tr').eq(index).children('td').eq(2).html(setAuditList(datas));
+                    $('#uncheck_list tr').eq(index).children('td').eq(3).html(setAuditList(datas));
                 }
             });
         });
@@ -610,7 +643,7 @@
                 const index = uncheckList.findIndex(item => item.cid === this_cid);
                 if (index !== -1) {
                     uncheckList[index].auditList = datas;
-                    $('#uncheck_list tr').eq(index).children('td').eq(2).html(setAuditList(datas));
+                    $('#uncheck_list tr').eq(index).children('td').eq(3).html(setAuditList(datas));
                 }
             });
         });
@@ -709,10 +742,10 @@
                 for (const c of cids) {
                     const cInfo = uncheckList.find(item => item.cid === c);
                     if (cInfo) {
-                        $('#batch-sb-progress .change-progress').append(`<div id="change-${cInfo.cid}-progress"><div class="mt-3 progress">` +
+                        $('#batch-sb-progress .change-progress').append(`<div class="mt-3" id="change-${cInfo.cid}-progress"><div>变更令 <a href="/tender/${cInfo.tid}/change/${cInfo.cid}/information" target="_blank"><b>${cInfo.code}</b></a> :</div><div class="progress">` +
                             '<div class="progress-bar progress-bar-striped progress-bar-animated" role="progressbar" style="width: 0%" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100"></div>' +
-                    '</div>' +
-                    `<div class="mt-1">变更令 <b>${cInfo.code}</b> <span class="progress-change-text">上报处理中...</span></div></div>`);
+                            '</div>' +
+                    `<div class="mt-1"><span class="progress-change-text">上报处理中...</span></div></div>`);
                         await checkAndChange(cInfo, changeListData, result.changeLedgerList);
                     }
                 }
@@ -726,14 +759,17 @@
                 let html = '';
                 $('#select-all-checking').prop('checked', false);
                 checkingList = res.checkingList;
-                for (const l of res.checkingList) {
-                    const finalHtml = l.is_finalAudit ? `<input type="text" class="form-control form-control-sm final_pcode_input" data-cid="${l.cid}" value="${l.p_code}" />` : '';
-                    html += '<tr>' +
-                        `<td class="text-center"><input type="checkbox" value="${l.cid}"></td>` +
-                        `<td class=""><a href="/tender/${tenderId}/change/${l.cid}/information" target="_blank">${l.code}</a></td>` +
-                        `<td>${l.name}</td>` +
-                        `<td>${finalHtml}</td>` +
-                        '</tr>';
+                if (checkingList.length > 0) {
+                    for (const [i, l] of res.checkingList.entries()) {
+                        const finalHtml = l.is_finalAudit ? `<input type="text" class="form-control form-control-sm final_pcode_input" data-cid="${l.cid}" value="${l.p_code}" />` : '';
+                        html += '<tr>' +
+                            `<td class="text-center"><input type="checkbox" value="${l.cid}"></td>` +
+                            `<td>${i+1}</td>` +
+                            `<td class=""><a href="/tender/${tenderId}/change/${l.cid}/information" target="_blank">${l.code}</a></td>` +
+                            `<td>${l.name}</td>` +
+                            `<td>${finalHtml}</td>` +
+                            '</tr>';
+                    }
                 }
                 $('#checking_list').html(html);
             });

+ 1 - 0
app/view/stage/index.ejs

@@ -557,6 +557,7 @@
     let currPageFileData = [];
     const settleStatus = JSON.parse('<%- JSON.stringify(settleStatus) %>');
     const contractExpr = <%- !!ctx.session.sessionProject.page_show.openContractExpr %>;
+    const deleteFilePermission = <%- deleteFilePermission %>;
 </script>
 <style>
 

+ 1 - 0
app/view/stage/pay.ejs

@@ -70,4 +70,5 @@
     const preGatherTp = <%- (pre.gather_tp || 0) %>;
     const auditConst = JSON.parse('<%- JSON.stringify(auditConst) %>');
     const lockPayExpr = <%- lockPayExpr %>;
+    const deleteFilePermission = <%- deleteFilePermission %>;
 </script>

+ 1 - 0
app/view/stage_extra/bonus.ejs

@@ -51,4 +51,5 @@
     const whiteList = JSON.parse('<%- JSON.stringify(ctx.app.config.multipart.whitelist) %>');
     const thousandth = <%- ctx.tender.info.display.thousandth %>;
     const stageChecked = <%- ctx.stage.status === auditConst.status.checked %>;
+    const deleteFilePermission = <%- deleteFilePermission %>;
 </script>