This commit is contained in:
王奎兴
2026-09-05 18:19:25 +08:00
parent d9e5cede10
commit 104fc8bbef
@@ -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;
}
/**
* 批量删除结算对象
*/