diff --git a/src/main/java/com/rj/service/impl/LbBuyAccountServiceImpl.java b/src/main/java/com/rj/service/impl/LbBuyAccountServiceImpl.java index bffb83d..f9816d4 100644 --- a/src/main/java/com/rj/service/impl/LbBuyAccountServiceImpl.java +++ b/src/main/java/com/rj/service/impl/LbBuyAccountServiceImpl.java @@ -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 add(LbBuyAccount entity) { Map 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 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 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 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 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) {