diff --git a/mhd_bms/src/main/java/com/mhd/bms/application/server/settlementCustomers/SettlementCustomersApplicationService.java b/mhd_bms/src/main/java/com/mhd/bms/application/server/settlementCustomers/SettlementCustomersApplicationService.java index 9e2ac4778..7c0893de5 100644 --- a/mhd_bms/src/main/java/com/mhd/bms/application/server/settlementCustomers/SettlementCustomersApplicationService.java +++ b/mhd_bms/src/main/java/com/mhd/bms/application/server/settlementCustomers/SettlementCustomersApplicationService.java @@ -46,6 +46,7 @@ import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.time.LocalDate; +import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.*; import java.util.stream.Collectors; @@ -339,8 +340,10 @@ public class SettlementCustomersApplicationService { if (settlementEntityId != null) { stopXxlJob(settlementCustomersDO.getPushBillingRecordJobId()); stopXxlJob(settlementCustomersDO.getPushBillManageJobId()); - Integer jobId = addXxlJob(String.valueOf(settlementEntityId)); - Integer jobId1 = addXxlJob1(String.valueOf(settlementEntityId)); + //生成唯一业务流水号拼接至JobDesc,保证本次新建任务的JobDesc唯一,据此查询jobId不会命中历史任务 + String xxlJobBizNo = generateXxlJobBizNo(); + Integer jobId = addXxlJob(String.valueOf(settlementEntityId), xxlJobBizNo); + Integer jobId1 = addXxlJob1(String.valueOf(settlementEntityId), xxlJobBizNo); settlementCustomersDO.setPushBillingRecordJobId(jobId); settlementCustomersDO.setPushBillManageJobId(jobId1); } @@ -358,12 +361,13 @@ public class SettlementCustomersApplicationService { /** * 创建夜间23点定时任务 * @param shipperId 结算对象id,作为任务参数 + * @param bizNo 业务流水号,拼接进JobDesc保证每个任务描述唯一,据此精确查询本次新建的xxlJobId * @return xxlJobId 保存到业务表,后续用于删除/暂停 */ - public Integer addXxlJob(String shipperId) { + public Integer addXxlJob(String shipperId, String bizNo) { XxlJobOpenApiUtil.JobInfoAddReq req = new XxlJobOpenApiUtil.JobInfoAddReq(); req.setJobGroup(3); - req.setJobDesc("散租推送计费单据/流水任务,结算对象id:" + shipperId); + req.setJobDesc("散租推送计费单据/流水任务,结算对象id:" + shipperId + ",业务流水号:" + bizNo); req.setAuthor("system"); req.setAlarmEmail(""); req.setScheduleType("CRON"); @@ -395,12 +399,13 @@ public class SettlementCustomersApplicationService { /** * 创建夜间23点定时任务 * @param shipperId 结算对象id,作为任务参数 + * @param bizNo 业务流水号,拼接进JobDesc保证每个任务描述唯一,据此精确查询本次新建的xxlJobId * @return xxlJobId 保存到业务表,后续用于删除/暂停 */ - public Integer addXxlJob1(String shipperId) { + public Integer addXxlJob1(String shipperId, String bizNo) { XxlJobOpenApiUtil.JobInfoAddReq req = new XxlJobOpenApiUtil.JobInfoAddReq(); req.setJobGroup(6); - req.setJobDesc("计费单据/流水生成发票任务,结算对象id:" + shipperId); + req.setJobDesc("计费单据/流水生成发票任务,结算对象id:" + shipperId + ",业务流水号:" + bizNo); req.setAuthor("system"); req.setAlarmEmail(""); req.setScheduleType("CRON"); @@ -438,6 +443,7 @@ public class SettlementCustomersApplicationService { } private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyMMdd"); + private static final DateTimeFormatter JOB_BIZ_NO_FORMATTER = DateTimeFormatter.ofPattern("yyMMddHHmmssSSS"); private static final Random RANDOM = new Random(); /** @@ -454,6 +460,18 @@ public class SettlementCustomersApplicationService { return "HT" + dateStr + randomStr; } + /** + * 生成xxl-job任务业务流水号:JOB + 当天yyMMddHHmmssSSS + 6位随机数字,保证每次创建的JobDesc唯一 + * 示例:JOB260905102030123123456 + * @return 业务流水号字符串 + */ + public static String generateXxlJobBizNo() { + String dateTimeStr = LocalDateTime.now().format(JOB_BIZ_NO_FORMATTER); + int randomNum = RANDOM.nextInt(1_000_000); + String randomStr = String.format("%06d", randomNum); + return "JOB" + dateTimeStr + randomStr; + } + /** * 批量删除结算对象 */