|
|
@@ -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 "已取消", "失败" -> "已取消";
|