记录抢单历史
This commit is contained in:
@@ -6,7 +6,9 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import com.rj.dto.LbBuyAccountRushBuyContext;
|
||||
import com.rj.dto.LbRushBuyGoodsCoordinator;
|
||||
import com.rj.entity.LbBuyAccount;
|
||||
import com.rj.entity.LbBuyAccountHistory;
|
||||
import com.rj.mapper.LbBuyAccountMapper;
|
||||
import com.rj.service.ILbBuyAccountHistoryService;
|
||||
import com.rj.service.ILbBuyAccountService;
|
||||
import com.rj.service.ILbGoodsService;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
@@ -45,6 +47,9 @@ public class LbBuyAccountServiceImpl
|
||||
@Autowired
|
||||
private ILbGoodsService lbGoodsService;
|
||||
|
||||
@Autowired
|
||||
private ILbBuyAccountHistoryService lbBuyAccountHistoryService;
|
||||
|
||||
@Override
|
||||
public Map<String, Object> add(LbBuyAccount entity) {
|
||||
Map<String, Object> result = new HashMap<>();
|
||||
@@ -390,9 +395,10 @@ public class LbBuyAccountServiceImpl
|
||||
resultMessage = attachAccountLabel(
|
||||
accountLabel, formatRushBuyResultMessage(rushBuyResult));
|
||||
persistRushBuyOutcome(
|
||||
account.getId(),
|
||||
account,
|
||||
accountLabel,
|
||||
formatRushBuyResultForDb(accountLabel, rushBuyResult));
|
||||
formatRushBuyResultForDb(accountLabel, rushBuyResult),
|
||||
rushBuyResult);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -400,7 +406,7 @@ public class LbBuyAccountServiceImpl
|
||||
item.put("message", resultMessage);
|
||||
log.info("抢单任务结束,{},success={},message={}", accountLabel, item.get("success"), resultMessage);
|
||||
if (account != null && account.getId() != null && item.get("rushBuyResult") == null) {
|
||||
persistRushBuyOutcome(account.getId(), accountLabel, resultMessage);
|
||||
persistRushBuyOutcome(account, accountLabel, resultMessage, null);
|
||||
}
|
||||
return item;
|
||||
}
|
||||
@@ -412,9 +418,10 @@ public class LbBuyAccountServiceImpl
|
||||
String accountLabel = formatRushBuyAccountLabel(account.getId(), account);
|
||||
Object message = item.get("message");
|
||||
persistRushBuyOutcome(
|
||||
account.getId(),
|
||||
account,
|
||||
accountLabel,
|
||||
message != null ? message.toString() : "未知抢单结果");
|
||||
message != null ? message.toString() : "未知抢单结果",
|
||||
null);
|
||||
}
|
||||
|
||||
private Map<String, Object> validateRequiredForAdd(LbBuyAccount entity) {
|
||||
@@ -494,18 +501,24 @@ public class LbBuyAccountServiceImpl
|
||||
}
|
||||
|
||||
/**
|
||||
* 将本次抢单结果与抢单时间写入 lb_buy_account(rush_buy_result、last_rush_buy_time)。
|
||||
* 将本次抢单结果与抢单时间写入 lb_buy_account(rush_buy_result、last_rush_buy_time),
|
||||
* 并新增一条 lb_buy_account_history 抢单历史记录。
|
||||
*/
|
||||
private void persistRushBuyOutcome(String accountId, String accountLabel, String resultMessage) {
|
||||
if (accountId == null || accountId.trim().isEmpty()) {
|
||||
private void persistRushBuyOutcome(
|
||||
LbBuyAccount account,
|
||||
String accountLabel,
|
||||
String resultMessage,
|
||||
Map<String, Object> rushBuyResult) {
|
||||
if (account == null || account.getId() == null || account.getId().trim().isEmpty()) {
|
||||
return;
|
||||
}
|
||||
String accountId = account.getId().trim();
|
||||
String storedResult = truncateRushBuyResult(
|
||||
resultMessage != null && !resultMessage.isEmpty() ? resultMessage : "未知抢单结果");
|
||||
LocalDateTime now = LocalDateTime.now();
|
||||
try {
|
||||
int rows = this.baseMapper.updateRushBuyOutcome(
|
||||
accountId.trim(), storedResult, now, now);
|
||||
accountId, storedResult, now, now);
|
||||
if (rows <= 0) {
|
||||
log.warn("抢单结果落库未更新任何行,{},accountId={},lastRushBuyTime={}",
|
||||
accountLabel, accountId, now);
|
||||
@@ -517,6 +530,103 @@ public class LbBuyAccountServiceImpl
|
||||
log.error("抢单结果落库异常,{},accountId={},lastRushBuyTime={}",
|
||||
accountLabel, accountId, now, e);
|
||||
}
|
||||
persistRushBuyHistory(account, storedResult, rushBuyResult, now);
|
||||
}
|
||||
|
||||
/**
|
||||
* 每次抢单完成后向 lb_buy_account_history 新增一条历史记录。
|
||||
*/
|
||||
private void persistRushBuyHistory(
|
||||
LbBuyAccount account,
|
||||
String rushBuyResultText,
|
||||
Map<String, Object> rushBuyResult,
|
||||
LocalDateTime rushBuyTime) {
|
||||
if (account == null) {
|
||||
return;
|
||||
}
|
||||
String tenantId = account.getTenantId();
|
||||
String tenantName = account.getTenantName();
|
||||
String loginAccount = account.getLoginAccount();
|
||||
if (tenantId == null || tenantId.trim().isEmpty()
|
||||
|| tenantName == null || tenantName.trim().isEmpty()
|
||||
|| loginAccount == null || loginAccount.trim().isEmpty()) {
|
||||
log.warn("抢单历史落库跳过,账号缺少必填字段,accountId={}", account.getId());
|
||||
return;
|
||||
}
|
||||
|
||||
LbBuyAccountHistory history = new LbBuyAccountHistory();
|
||||
history.setId(UUID.randomUUID().toString());
|
||||
history.setTenantId(tenantId.trim());
|
||||
history.setTenantName(tenantName.trim());
|
||||
history.setLoginAccount(loginAccount.trim());
|
||||
history.setLoginPassword(
|
||||
account.getLoginPassword() != null ? account.getLoginPassword().trim() : "");
|
||||
if (account.getNickname() != null) {
|
||||
history.setNickname(account.getNickname().trim());
|
||||
}
|
||||
populateRushBuyHistoryStats(history, rushBuyResult);
|
||||
history.setRushBuyResult(rushBuyResultText);
|
||||
history.setLastRushBuyTime(rushBuyTime);
|
||||
history.setCreateTime(rushBuyTime);
|
||||
history.setUpdateTime(rushBuyTime);
|
||||
|
||||
try {
|
||||
boolean ok = lbBuyAccountHistoryService.save(history);
|
||||
if (ok) {
|
||||
log.info("抢单历史已落库,accountId={},loginAccount={},lastRushBuyTime={},"
|
||||
+ "maxGrabCount={},rushBuyFailCount={},maxGrabAmount={}",
|
||||
account.getId(), loginAccount, rushBuyTime,
|
||||
history.getMaxGrabCount(), history.getRushBuyFailCount(), history.getMaxGrabAmount());
|
||||
} else {
|
||||
log.warn("抢单历史落库失败,accountId={},loginAccount={}",
|
||||
account.getId(), loginAccount);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
log.error("抢单历史落库异常,accountId={},loginAccount={}",
|
||||
account.getId(), loginAccount, e);
|
||||
}
|
||||
}
|
||||
|
||||
private static void populateRushBuyHistoryStats(
|
||||
LbBuyAccountHistory history, Map<String, Object> rushBuyResult) {
|
||||
int successCount = 0;
|
||||
int failCount = 0;
|
||||
int totalAmount = 0;
|
||||
|
||||
if (rushBuyResult != null) {
|
||||
successCount = toNonNegativeInt(rushBuyResult.get("successCount"));
|
||||
failCount = toNonNegativeInt(rushBuyResult.get("failCount"));
|
||||
|
||||
Object detailsObj = rushBuyResult.get("details");
|
||||
if (detailsObj instanceof List<?> details) {
|
||||
for (Object detailObj : details) {
|
||||
if (!(detailObj instanceof Map<?, ?> detail)) {
|
||||
continue;
|
||||
}
|
||||
if (Boolean.TRUE.equals(detail.get("success"))) {
|
||||
totalAmount += toNonNegativeInt(detail.get("totalMoney"));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
history.setMaxGrabAmount(totalAmount);
|
||||
history.setMaxGrabCount(successCount + failCount);
|
||||
history.setRushBuyFailCount(failCount);
|
||||
}
|
||||
|
||||
private static int toNonNegativeInt(Object value) {
|
||||
if (value == null) {
|
||||
return 0;
|
||||
}
|
||||
if (value instanceof Number number) {
|
||||
return Math.max(0, number.intValue());
|
||||
}
|
||||
try {
|
||||
return Math.max(0, Integer.parseInt(value.toString().trim()));
|
||||
} catch (NumberFormatException e) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
private static String formatRushBuyAccountLabel(String accountId, LbBuyAccount account) {
|
||||
|
||||
Reference in New Issue
Block a user