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 javax.annotation.Resource;
import java.time.LocalDate; import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@@ -339,8 +340,10 @@ public class SettlementCustomersApplicationService {
if (settlementEntityId != null) { if (settlementEntityId != null) {
stopXxlJob(settlementCustomersDO.getPushBillingRecordJobId()); stopXxlJob(settlementCustomersDO.getPushBillingRecordJobId());
stopXxlJob(settlementCustomersDO.getPushBillManageJobId()); stopXxlJob(settlementCustomersDO.getPushBillManageJobId());
Integer jobId = addXxlJob(String.valueOf(settlementEntityId)); //生成唯一业务流水号拼接至JobDesc,保证本次新建任务的JobDesc唯一,据此查询jobId不会命中历史任务
Integer jobId1 = addXxlJob1(String.valueOf(settlementEntityId)); String xxlJobBizNo = generateXxlJobBizNo();
Integer jobId = addXxlJob(String.valueOf(settlementEntityId), xxlJobBizNo);
Integer jobId1 = addXxlJob1(String.valueOf(settlementEntityId), xxlJobBizNo);
settlementCustomersDO.setPushBillingRecordJobId(jobId); settlementCustomersDO.setPushBillingRecordJobId(jobId);
settlementCustomersDO.setPushBillManageJobId(jobId1); settlementCustomersDO.setPushBillManageJobId(jobId1);
} }
@@ -358,12 +361,13 @@ public class SettlementCustomersApplicationService {
/** /**
* 创建夜间23点定时任务 * 创建夜间23点定时任务
* @param shipperId 结算对象id,作为任务参数 * @param shipperId 结算对象id,作为任务参数
* @param bizNo 业务流水号,拼接进JobDesc保证每个任务描述唯一,据此精确查询本次新建的xxlJobId
* @return xxlJobId 保存到业务表,后续用于删除/暂停 * @return xxlJobId 保存到业务表,后续用于删除/暂停
*/ */
public Integer addXxlJob(String shipperId) { public Integer addXxlJob(String shipperId, String bizNo) {
XxlJobOpenApiUtil.JobInfoAddReq req = new XxlJobOpenApiUtil.JobInfoAddReq(); XxlJobOpenApiUtil.JobInfoAddReq req = new XxlJobOpenApiUtil.JobInfoAddReq();
req.setJobGroup(3); req.setJobGroup(3);
req.setJobDesc("散租推送计费单据/流水任务,结算对象id:" + shipperId); req.setJobDesc("散租推送计费单据/流水任务,结算对象id:" + shipperId + ",业务流水号:" + bizNo);
req.setAuthor("system"); req.setAuthor("system");
req.setAlarmEmail(""); req.setAlarmEmail("");
req.setScheduleType("CRON"); req.setScheduleType("CRON");
@@ -395,12 +399,13 @@ public class SettlementCustomersApplicationService {
/** /**
* 创建夜间23点定时任务 * 创建夜间23点定时任务
* @param shipperId 结算对象id,作为任务参数 * @param shipperId 结算对象id,作为任务参数
* @param bizNo 业务流水号,拼接进JobDesc保证每个任务描述唯一,据此精确查询本次新建的xxlJobId
* @return xxlJobId 保存到业务表,后续用于删除/暂停 * @return xxlJobId 保存到业务表,后续用于删除/暂停
*/ */
public Integer addXxlJob1(String shipperId) { public Integer addXxlJob1(String shipperId, String bizNo) {
XxlJobOpenApiUtil.JobInfoAddReq req = new XxlJobOpenApiUtil.JobInfoAddReq(); XxlJobOpenApiUtil.JobInfoAddReq req = new XxlJobOpenApiUtil.JobInfoAddReq();
req.setJobGroup(6); req.setJobGroup(6);
req.setJobDesc("计费单据/流水生成发票任务,结算对象id:" + shipperId); req.setJobDesc("计费单据/流水生成发票任务,结算对象id:" + shipperId + ",业务流水号:" + bizNo);
req.setAuthor("system"); req.setAuthor("system");
req.setAlarmEmail(""); req.setAlarmEmail("");
req.setScheduleType("CRON"); req.setScheduleType("CRON");
@@ -438,6 +443,7 @@ public class SettlementCustomersApplicationService {
} }
private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyMMdd"); 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(); private static final Random RANDOM = new Random();
/** /**
@@ -454,6 +460,18 @@ public class SettlementCustomersApplicationService {
return "HT" + dateStr + randomStr; 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;
}
/** /**
* 批量删除结算对象 * 批量删除结算对象
*/ */