Gqingci 3 days ago
parent
commit
d7197fef57

+ 19 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/controller/PortalCheckController.java

@@ -164,6 +164,25 @@ public class PortalCheckController extends BaseController {
         return R.ok(mainBackOrderService.confirmPortalCandidateAuthorization(recordId, tenantId));
     }
 
+    @PostMapping("/order/candidate/{recordId}/authorize/reject")
+    public R<MainBackOrderCandidateVo> rejectPortalCandidateAuthorization(@PathVariable Long recordId) {
+        String tenantId = LoginHelper.getTenantId();
+        if (tenantId == null || tenantId.isBlank()) {
+            return R.fail("未登录或token已失效");
+        }
+        return R.ok(mainBackOrderService.rejectPortalCandidateAuthorization(recordId, tenantId));
+    }
+
+    @PostMapping("/candidate/{recordId}/authorize/confirm")
+    public R<MainBackOrderCandidateVo> publicConfirmCandidateAuthorization(@PathVariable Long recordId) {
+        return R.ok(mainBackOrderService.confirmPortalCandidateAuthorizationPublic(recordId));
+    }
+
+    @PostMapping("/candidate/{recordId}/authorize/reject")
+    public R<MainBackOrderCandidateVo> publicRejectCandidateAuthorization(@PathVariable Long recordId) {
+        return R.ok(mainBackOrderService.rejectPortalCandidateAuthorizationPublic(recordId));
+    }
+
     @GetMapping("/order/candidate/{recordId}/report")
     public R<String> generatePortalCandidateReport(@PathVariable Long recordId) {
         String tenantId = LoginHelper.getTenantId();

+ 1 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/domain/vo/MainBackOrderCandidateVo.java

@@ -16,4 +16,5 @@ public class MainBackOrderCandidateVo implements Serializable {
     private Integer status;
     private String statusText;
     private String reportUrl;
+    private Integer reportStatus;
 }

+ 15 - 0
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/service/IMainBackOrderService.java

@@ -50,6 +50,21 @@ public interface IMainBackOrderService {
      */
     MainBackOrderCandidateVo confirmPortalCandidateAuthorization(Long recordId, String tenantId);
 
+    /**
+     * 门户候选人拒绝授权
+     */
+    MainBackOrderCandidateVo rejectPortalCandidateAuthorization(Long recordId, String tenantId);
+
+    /**
+     * 公开接口-候选人确认授权(无需登录)
+     */
+    MainBackOrderCandidateVo confirmPortalCandidateAuthorizationPublic(Long recordId);
+
+    /**
+     * 公开接口-候选人拒绝授权(无需登录)
+     */
+    MainBackOrderCandidateVo rejectPortalCandidateAuthorizationPublic(Long recordId);
+
     /**
      * 生成或获取门户候选人报告
      */

+ 169 - 9
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/service/impl/MainBackOrderServiceImpl.java

@@ -81,10 +81,11 @@ public class MainBackOrderServiceImpl implements IMainBackOrderService {
     private static final String RECORD_STATUS_PENDING_AUTH = "未完成";
     private static final String RECORD_STATUS_AUTHORIZED = "已授权";
     private static final String RECORD_STATUS_UNAUTHORIZED = "未授权";
+    private static final String RECORD_STATUS_REJECTED = "已拒绝";
     private static final DateTimeFormatter REPORT_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
 
     private static final Set<String> AUTHORIZATION_TERMINAL_STATUSES =
-        new HashSet<>(List.of(RECORD_STATUS_AUTHORIZED, RECORD_STATUS_UNAUTHORIZED));
+        new HashSet<>(List.of(RECORD_STATUS_AUTHORIZED, RECORD_STATUS_UNAUTHORIZED, RECORD_STATUS_REJECTED));
 
     private final MainBackOrderMapper baseMapper;
     private final MainBackRecordMapper recordMapper;
@@ -542,6 +543,135 @@ public class MainBackOrderServiceImpl implements IMainBackOrderService {
         return buildPortalCandidateVo(record);
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public MainBackOrderCandidateVo rejectPortalCandidateAuthorization(Long recordId, String tenantId) {
+        if (recordId == null) {
+            throw new ServiceException("候选人记录不能为空");
+        }
+        if (StringUtils.isBlank(tenantId)) {
+            throw new ServiceException("未登录或token已失效");
+        }
+
+        MainBackRecord record = recordMapper.selectById(recordId);
+        if (record == null) {
+            throw new ServiceException("候选人记录不存在");
+        }
+
+        MainBackOrder backOrder = baseMapper.selectById(record.getOrderId());
+        if (backOrder == null || !StringUtils.equals(backOrder.getTenantId(), tenantId)) {
+            throw new ServiceException("无权操作该候选人授权记录");
+        }
+
+        MainOrder mainOrder = mainOrderMapper.selectOne(
+            Wrappers.<MainOrder>lambdaQuery()
+                .eq(MainOrder::getBusinessId, backOrder.getId())
+                .eq(MainOrder::getOrderType, 3)
+                .eq(MainOrder::getTenantId, tenantId)
+                .last("limit 1")
+        );
+        if (mainOrder == null) {
+            throw new ServiceException("订单不存在");
+        }
+
+        if (!RECORD_STATUS_REJECTED.equals(record.getStatus())) {
+            MainBackRecord update = new MainBackRecord();
+            update.setId(record.getId());
+            update.setStatus(RECORD_STATUS_REJECTED);
+            update.setFinishTime(LocalDateTime.now());
+            recordMapper.updateById(update);
+            record.setStatus(RECORD_STATUS_REJECTED);
+            record.setFinishTime(update.getFinishTime());
+        }
+
+        completePortalOrderWhenAuthorizationFinished(backOrder, mainOrder);
+        return buildPortalCandidateVo(record);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public MainBackOrderCandidateVo confirmPortalCandidateAuthorizationPublic(Long recordId) {
+        if (recordId == null) {
+            throw new ServiceException("候选人记录不能为空");
+        }
+
+        MainBackRecord record = recordMapper.selectById(recordId);
+        if (record == null) {
+            throw new ServiceException("候选人记录不存在");
+        }
+
+        MainBackOrder backOrder = baseMapper.selectById(record.getOrderId());
+        if (backOrder == null) {
+            throw new ServiceException("订单不存在");
+        }
+
+        MainOrder mainOrder = mainOrderMapper.selectOne(
+            Wrappers.<MainOrder>lambdaQuery()
+                .eq(MainOrder::getBusinessId, backOrder.getId())
+                .eq(MainOrder::getOrderType, 3)
+                .eq(MainOrder::getTenantId, backOrder.getTenantId())
+                .last("limit 1")
+        );
+        if (mainOrder == null) {
+            throw new ServiceException("订单不存在");
+        }
+
+        if (!RECORD_STATUS_AUTHORIZED.equals(record.getStatus())) {
+            MainBackRecord update = new MainBackRecord();
+            update.setId(record.getId());
+            update.setStatus(RECORD_STATUS_AUTHORIZED);
+            update.setFinishTime(LocalDateTime.now());
+            recordMapper.updateById(update);
+            record.setStatus(RECORD_STATUS_AUTHORIZED);
+            record.setFinishTime(update.getFinishTime());
+        }
+
+        completePortalOrderWhenAuthorizationFinished(backOrder, mainOrder);
+        return buildPortalCandidateVo(record);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public MainBackOrderCandidateVo rejectPortalCandidateAuthorizationPublic(Long recordId) {
+        if (recordId == null) {
+            throw new ServiceException("候选人记录不能为空");
+        }
+
+        MainBackRecord record = recordMapper.selectById(recordId);
+        if (record == null) {
+            throw new ServiceException("候选人记录不存在");
+        }
+
+        MainBackOrder backOrder = baseMapper.selectById(record.getOrderId());
+        if (backOrder == null) {
+            throw new ServiceException("订单不存在");
+        }
+
+        MainOrder mainOrder = mainOrderMapper.selectOne(
+            Wrappers.<MainOrder>lambdaQuery()
+                .eq(MainOrder::getBusinessId, backOrder.getId())
+                .eq(MainOrder::getOrderType, 3)
+                .eq(MainOrder::getTenantId, backOrder.getTenantId())
+                .last("limit 1")
+        );
+        if (mainOrder == null) {
+            throw new ServiceException("订单不存在");
+        }
+
+        if (!RECORD_STATUS_REJECTED.equals(record.getStatus())) {
+            MainBackRecord update = new MainBackRecord();
+            update.setId(record.getId());
+            update.setStatus(RECORD_STATUS_REJECTED);
+            update.setFinishTime(LocalDateTime.now());
+            recordMapper.updateById(update);
+            record.setStatus(RECORD_STATUS_REJECTED);
+            record.setFinishTime(update.getFinishTime());
+        }
+
+        completePortalOrderWhenAuthorizationFinished(backOrder, mainOrder);
+        return buildPortalCandidateVo(record);
+    }
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public String generatePortalCandidateReport(Long recordId, String tenantId) {
@@ -620,7 +750,20 @@ public class MainBackOrderServiceImpl implements IMainBackOrderService {
             mainOrder.getCreateTime().toInstant().atZone(java.time.ZoneId.systemDefault()).toLocalDateTime());
         vo.setOrderType(vo.getCategoryId() != null ? 1 : 2);
         vo.setOrderStatus(parseIntOrDefault(vo.getStatus(), 0));
-        vo.setMainOrderStatus(mainOrder.getOrderStatus());
+        // 订单状态为已完成时,需检查所有候选人报告是否已出具
+        int mainStatus = mainOrder.getOrderStatus() == null ? 0 : mainOrder.getOrderStatus();
+        if (mainStatus == 2) {
+            List<MainBackRecord> records = recordMapper.selectList(
+                Wrappers.<MainBackRecord>lambdaQuery()
+                    .eq(MainBackRecord::getOrderId, vo.getId())
+            );
+            boolean allReportIssued = records.stream()
+                .allMatch(r -> r.getReportStatus() != null && r.getReportStatus() == 1);
+            if (!allReportIssued) {
+                mainStatus = 7; // 报告未全部出具,显示待背调
+            }
+        }
+        vo.setMainOrderStatus(mainStatus);
 
         if (count != null && count > 0 && vo.getTotalAmount() != null) {
             vo.setUnitPrice(vo.getTotalAmount().divide(BigDecimal.valueOf(count), 2, java.math.RoundingMode.HALF_UP));
@@ -736,9 +879,10 @@ public class MainBackOrderServiceImpl implements IMainBackOrderService {
         vo.setCandidatePhone(student == null ? null : student.getMobile());
         vo.setCandidateIdType("1");
         vo.setCandidateIdNumber(student == null ? null : student.getIdCardNumber());
-        vo.setStatus(mapRecordStatus(record.getStatus()));
-        vo.setStatusText(mapRecordStatusText(record.getStatus()));
+        vo.setStatus(mapRecordStatus(record.getStatus(), record.getReportStatus()));
+        vo.setStatusText(mapRecordStatusText(record.getStatus(), record.getReportStatus()));
         vo.setReportUrl(record.getReportUrl());
+        vo.setReportStatus(record.getReportStatus());
         return vo;
     }
 
@@ -796,9 +940,10 @@ public class MainBackOrderServiceImpl implements IMainBackOrderService {
             vo.setCandidatePhone(student == null ? null : student.getMobile());
             vo.setCandidateIdType("1");
             vo.setCandidateIdNumber(student == null ? null : student.getIdCardNumber());
-            vo.setStatus(mapRecordStatus(record.getStatus()));
-            vo.setStatusText(mapRecordStatusText(record.getStatus()));
+            vo.setStatus(mapRecordStatus(record.getStatus(), record.getReportStatus()));
+            vo.setStatusText(mapRecordStatusText(record.getStatus(), record.getReportStatus()));
             vo.setReportUrl(record.getReportUrl());
+            vo.setReportStatus(record.getReportStatus());
             result.add(vo);
         }
         return result;
@@ -841,28 +986,43 @@ public class MainBackOrderServiceImpl implements IMainBackOrderService {
             + cn.hutool.core.util.RandomUtil.randomNumbers(4);
     }
 
-    private Integer mapRecordStatus(String status) {
+    private Integer mapRecordStatus(String status, Integer reportStatus) {
         if (StringUtils.isBlank(status)) {
             return 0;
         }
+        // 已授权:根据report_status判断显示待背调还是已完成
+        if (RECORD_STATUS_AUTHORIZED.equals(status)) {
+            if (reportStatus != null && reportStatus == 1) {
+                return 2; // 报告已出具,显示已完成
+            }
+            return 7; // 报告待填写,显示待背调
+        }
         return switch (status) {
             case "进行中" -> 1;
             case "已完成", "完成" -> 2;
-            case "已授权" -> 4;
             case "未授权" -> 5;
+            case "已拒绝" -> 6;
             case "已取消", "失败" -> 3;
             default -> 0;
         };
     }
 
-    private String mapRecordStatusText(String status) {
+    private String mapRecordStatusText(String status, Integer reportStatus) {
         if (StringUtils.isBlank(status)) {
             return "待授权";
         }
+        // 已授权:根据report_status判断显示待背调还是已完成
+        if (RECORD_STATUS_AUTHORIZED.equals(status)) {
+            if (reportStatus != null && reportStatus == 1) {
+                return "已完成";
+            }
+            return "待背调";
+        }
         return switch (status) {
             case RECORD_STATUS_PENDING_AUTH -> "待授权";
             case RECORD_STATUS_AUTHORIZED -> RECORD_STATUS_AUTHORIZED;
             case RECORD_STATUS_UNAUTHORIZED -> RECORD_STATUS_UNAUTHORIZED;
+            case RECORD_STATUS_REJECTED -> RECORD_STATUS_REJECTED;
             case "进行中" -> "背调中";
             case "已完成", "完成" -> "已完成";
             case "已取消", "失败" -> "已取消";