Просмотр исходного кода

feat(inspection): 统一审批退回操作为模态框选择退回位置

- 将"退回上报人"和"退回上一审批节点"两个按钮合并为"审批退回"单入口
- 新增 flow-return 动作类型,点击后在模态框中展示退回位置选择
- 模态框内动态显示退回原报和退回上一步骤的 radio 选项组
- 提交时先校验退回位置选择再转换为 flow-check 类型处理
- 动态切换模态框提示、按钮文字和意见标签以适配不同操作场景
- 质量巡检和安全巡检模块同步应用相同改动
caipin 2 недель назад
Родитель
Сommit
d768de7679

+ 22 - 7
app/public/js/quality_inspection_information.js

@@ -858,22 +858,37 @@ function bindQualityInspectionFlow() {
         } else if (type === 'flow-check') {
             message = pending.checkType === 3 ? '确认本次审批通过?' : pending.checkType === 4 ? '确认关闭本次巡检?' : inspection.flow_stage === 3 ? '确认退回重新整改?所有整改人将同时开始新一轮整改。' : pending.checkType === 5 ? '确认退回上报人重新上报?' : '确认退回上一个上报审批节点?';
         }
+        const isReturn = type === 'flow-return';
         $('#quality-flow-title').text($(this).text());
-        $('#quality-flow-message').text(message);
+        $('#quality-flow-message').text(message).toggle(!isReturn);
+        $('#quality-flow-return-group').toggleClass('d-none', !isReturn);
+        $('[name="quality-flow-return-type"]').prop('checked', false);
         $('#quality-flow-opinion').val('').css('height', '');
-        $('#quality-flow-opinion-group').toggle(type === 'flow-check');
+        $('#quality-flow-opinion-group').toggle(type === 'flow-check' || isReturn).find('label').text(isReturn ? '退回意见' : '处理意见');
+        $('#quality-flow-cancel').text(isReturn ? '关闭' : '取消');
+        $('#quality-flow-submit').text(isReturn ? '确认退回' : '确认').toggleClass('btn-warning', isReturn).toggleClass('btn-primary', !isReturn);
         $('#quality-flow-confirm').modal('show');
     });
     $('#quality-flow-submit').on('click', function () {
         if (!pending || busy) return;
-        if (pending.type === 'flow-check') {
-            pending.opinion = $('#quality-flow-opinion').val().trim();
-            if (pending.checkType !== 3 && !pending.opinion) {
-                toastr.error('请填写退回或关闭原因');
+        const data = Object.assign({}, pending);
+        if (data.type === 'flow-return') {
+            const checkType = Number($('[name="quality-flow-return-type"]:checked').val());
+            if (![5, 6].includes(checkType) || (checkType === 6 && !inspection.flowCanReturnPrevious)) {
+                toastr.error('请选择退回位置');
                 return;
             }
+            data.type = 'flow-check';
+            data.checkType = checkType;
         }
-        request(pending, $(this), true);
+        if (data.type === 'flow-check') {
+            data.opinion = $('#quality-flow-opinion').val().trim();
+            if (data.checkType !== 3 && !data.opinion) {
+                toastr.error(pending.type === 'flow-return' ? '请填写退回意见' : '请填写退回或关闭原因');
+                return;
+            }
+        }
+        request(data, $(this), true);
     });
 }
 

+ 22 - 7
app/public/js/safe_inspection_information.js

@@ -858,22 +858,37 @@ function bindSafeInspectionFlow() {
         } else if (type === 'flow-check') {
             message = pending.checkType === 3 ? '确认本次审批通过?' : pending.checkType === 4 ? '确认关闭本次巡检?' : inspection.flow_stage === 3 ? '确认退回重新整改?所有整改人将同时开始新一轮整改。' : pending.checkType === 5 ? '确认退回上报人重新上报?' : '确认退回上一个上报审批节点?';
         }
+        const isReturn = type === 'flow-return';
         $('#safe-flow-title').text($(this).text());
-        $('#safe-flow-message').text(message);
+        $('#safe-flow-message').text(message).toggle(!isReturn);
+        $('#safe-flow-return-group').toggleClass('d-none', !isReturn);
+        $('[name="safe-flow-return-type"]').prop('checked', false);
         $('#safe-flow-opinion').val('').css('height', '');
-        $('#safe-flow-opinion-group').toggle(type === 'flow-check');
+        $('#safe-flow-opinion-group').toggle(type === 'flow-check' || isReturn).find('label').text(isReturn ? '退回意见' : '处理意见');
+        $('#safe-flow-cancel').text(isReturn ? '关闭' : '取消');
+        $('#safe-flow-submit').text(isReturn ? '确认退回' : '确认').toggleClass('btn-warning', isReturn).toggleClass('btn-primary', !isReturn);
         $('#safe-flow-confirm').modal('show');
     });
     $('#safe-flow-submit').on('click', function () {
         if (!pending || busy) return;
-        if (pending.type === 'flow-check') {
-            pending.opinion = $('#safe-flow-opinion').val().trim();
-            if (pending.checkType !== 3 && !pending.opinion) {
-                toastr.error('请填写退回或关闭原因');
+        const data = Object.assign({}, pending);
+        if (data.type === 'flow-return') {
+            const checkType = Number($('[name="safe-flow-return-type"]:checked').val());
+            if (![5, 6].includes(checkType) || (checkType === 6 && !inspection.flowCanReturnPrevious)) {
+                toastr.error('请选择退回位置');
                 return;
             }
+            data.type = 'flow-check';
+            data.checkType = checkType;
         }
-        request(pending, $(this), true);
+        if (data.type === 'flow-check') {
+            data.opinion = $('#safe-flow-opinion').val().trim();
+            if (data.checkType !== 3 && !data.opinion) {
+                toastr.error(pending.type === 'flow-return' ? '请填写退回意见' : '请填写退回或关闭原因');
+                return;
+            }
+        }
+        request(data, $(this), true);
     });
 }
 

+ 1 - 2
app/view/quality/inspection_information.ejs

@@ -20,8 +20,7 @@
                         <button type="button" class="btn btn-success btn-sm flow-action" data-action="start-inspection">提交上报</button>
                     <% } else if (inspection.flowCurrentAudit && inspection.shenpiPower) { %>
                         <button type="button" class="btn btn-success btn-sm flow-action" data-action="flow-check" data-result="3" data-id="<%= inspection.flowCurrentAudit.id %>"><%= inspection.flow_stage === 1 ? '审批' : '批复' %>通过</button>
-                        <button type="button" class="btn btn-warning btn-sm flow-action" data-action="flow-check" data-result="5" data-id="<%= inspection.flowCurrentAudit.id %>"><%= inspection.flow_stage === 1 ? '退回上报人' : '退回重新整改' %></button>
-                        <% if (inspection.flowCanReturnPrevious) { %><button type="button" class="btn btn-outline-warning btn-sm flow-action" data-action="flow-check" data-result="6" data-id="<%= inspection.flowCurrentAudit.id %>">退回上一审批节点</button><% } %>
+                        <button type="button" class="btn btn-warning btn-sm flow-action" data-action="<%= inspection.flow_stage === 1 ? 'flow-return' : 'flow-check' %>" data-result="5" data-id="<%= inspection.flowCurrentAudit.id %>"><%= inspection.flow_stage === 1 ? '审批退回' : '退回重新整改' %></button>
                         <button type="button" class="btn btn-outline-danger btn-sm flow-action" data-action="flow-check" data-result="4" data-id="<%= inspection.flowCurrentAudit.id %>">关闭巡检</button>
                     <% } else if (inspection.flowCurrentAudit && inspection.rectificationPower) { %>
                         <button type="button" class="btn btn-outline-primary btn-sm flow-save-rectification" data-id="<%= inspection.flowCurrentAudit.id %>">保存整改</button>

+ 20 - 1
app/view/quality/inspection_information_modal.ejs

@@ -257,10 +257,29 @@
             <div class="modal-header"><h5 class="modal-title" id="quality-flow-title">确认操作</h5></div>
             <div class="modal-body">
                 <p id="quality-flow-message"></p>
+                <% if (inspection.shenpiPower && inspection.flow_stage === 1 && inspection.flowCurrentAudit) { %>
+                <div class="alert alert-warning d-none" id="quality-flow-return-group">
+                    <div class="form-check form-check-inline">
+                        <input class="form-check-input" type="radio" name="quality-flow-return-type" id="quality-flow-return-origin" value="5">
+                        <label class="form-check-label" for="quality-flow-return-origin">退回原报</label>
+                    </div>
+                    <% if (inspection.flowCanReturnPrevious) {
+                        const report = inspection.flowStages.find(phase => phase.stage === 1).auditors;
+                        const earlier = report.filter(audit => audit.audit_order < inspection.flowCurrentAudit.audit_order);
+                        const previousOrder = Math.max(...earlier.map(audit => audit.audit_order));
+                        const previousNames = report.filter(audit => audit.audit_order === previousOrder).map(audit => audit.name).join('、');
+                    %>
+                    <div class="form-check form-check-inline">
+                        <input class="form-check-input" type="radio" name="quality-flow-return-type" id="quality-flow-return-previous" value="6">
+                        <label class="form-check-label" for="quality-flow-return-previous">退回上一步骤:<%= previousNames %></label>
+                    </div>
+                    <% } %>
+                </div>
+                <% } %>
                 <div id="quality-flow-opinion-group"><label for="quality-flow-opinion">处理意见</label><textarea id="quality-flow-opinion" class="form-control" rows="3" maxlength="1000"></textarea></div>
             </div>
             <div class="modal-footer">
-                <button type="button" class="btn btn-secondary btn-sm" data-dismiss="modal">取消</button>
+                <button type="button" class="btn btn-secondary btn-sm" id="quality-flow-cancel" data-dismiss="modal">取消</button>
                 <button type="button" class="btn btn-primary btn-sm" id="quality-flow-submit">确认</button>
             </div>
         </div>

+ 1 - 2
app/view/safe/inspection_information.ejs

@@ -20,8 +20,7 @@
                         <button type="button" class="btn btn-success btn-sm flow-action" data-action="start-inspection">提交上报</button>
                     <% } else if (inspection.flowCurrentAudit && inspection.shenpiPower) { %>
                         <button type="button" class="btn btn-success btn-sm flow-action" data-action="flow-check" data-result="3" data-id="<%= inspection.flowCurrentAudit.id %>"><%= inspection.flow_stage === 1 ? '审批' : '批复' %>通过</button>
-                        <button type="button" class="btn btn-warning btn-sm flow-action" data-action="flow-check" data-result="5" data-id="<%= inspection.flowCurrentAudit.id %>"><%= inspection.flow_stage === 1 ? '退回上报人' : '退回重新整改' %></button>
-                        <% if (inspection.flowCanReturnPrevious) { %><button type="button" class="btn btn-outline-warning btn-sm flow-action" data-action="flow-check" data-result="6" data-id="<%= inspection.flowCurrentAudit.id %>">退回上一审批节点</button><% } %>
+                        <button type="button" class="btn btn-warning btn-sm flow-action" data-action="<%= inspection.flow_stage === 1 ? 'flow-return' : 'flow-check' %>" data-result="5" data-id="<%= inspection.flowCurrentAudit.id %>"><%= inspection.flow_stage === 1 ? '审批退回' : '退回重新整改' %></button>
                         <button type="button" class="btn btn-outline-danger btn-sm flow-action" data-action="flow-check" data-result="4" data-id="<%= inspection.flowCurrentAudit.id %>">关闭巡检</button>
                     <% } else if (inspection.flowCurrentAudit && inspection.rectificationPower) { %>
                         <button type="button" class="btn btn-outline-primary btn-sm flow-save-rectification" data-id="<%= inspection.flowCurrentAudit.id %>">保存整改</button>

+ 20 - 1
app/view/safe/inspection_information_modal.ejs

@@ -255,10 +255,29 @@
             <div class="modal-header"><h5 class="modal-title" id="safe-flow-title">确认操作</h5></div>
             <div class="modal-body">
                 <p id="safe-flow-message"></p>
+                <% if (inspection.shenpiPower && inspection.flow_stage === 1 && inspection.flowCurrentAudit) { %>
+                <div class="alert alert-warning d-none" id="safe-flow-return-group">
+                    <div class="form-check form-check-inline">
+                        <input class="form-check-input" type="radio" name="safe-flow-return-type" id="safe-flow-return-origin" value="5">
+                        <label class="form-check-label" for="safe-flow-return-origin">退回原报</label>
+                    </div>
+                    <% if (inspection.flowCanReturnPrevious) {
+                        const report = inspection.flowStages.find(phase => phase.stage === 1).auditors;
+                        const earlier = report.filter(audit => audit.audit_order < inspection.flowCurrentAudit.audit_order);
+                        const previousOrder = Math.max(...earlier.map(audit => audit.audit_order));
+                        const previousNames = report.filter(audit => audit.audit_order === previousOrder).map(audit => audit.name).join('、');
+                    %>
+                    <div class="form-check form-check-inline">
+                        <input class="form-check-input" type="radio" name="safe-flow-return-type" id="safe-flow-return-previous" value="6">
+                        <label class="form-check-label" for="safe-flow-return-previous">退回上一步骤:<%= previousNames %></label>
+                    </div>
+                    <% } %>
+                </div>
+                <% } %>
                 <div id="safe-flow-opinion-group"><label for="safe-flow-opinion">处理意见</label><textarea id="safe-flow-opinion" class="form-control" rows="3" maxlength="1000"></textarea></div>
             </div>
             <div class="modal-footer">
-                <button type="button" class="btn btn-secondary btn-sm" data-dismiss="modal">取消</button>
+                <button type="button" class="btn btn-secondary btn-sm" id="safe-flow-cancel" data-dismiss="modal">取消</button>
                 <button type="button" class="btn btn-primary btn-sm" id="safe-flow-submit">确认</button>
             </div>
         </div>