v1.0.13 #20

Merged
timi merged 2 commits from dev into master 2026-08-13 09:52:26 +00:00
Showing only changes of commit 348f7396a1 - Show all commits
@@ -15,6 +15,8 @@ import com.imyeyu.api.modules.gao.service.GaoPointAccountService;
import com.imyeyu.api.modules.gao.service.GaoPointLedgerService; import com.imyeyu.api.modules.gao.service.GaoPointLedgerService;
import com.imyeyu.api.modules.gao.vo.GaoPointAdjustRequest; import com.imyeyu.api.modules.gao.vo.GaoPointAdjustRequest;
import com.imyeyu.api.modules.gao.vo.GaoPointLedgerPage; import com.imyeyu.api.modules.gao.vo.GaoPointLedgerPage;
import com.imyeyu.api.modules.system.entity.Logger;
import com.imyeyu.api.modules.system.service.LoggerService;
import com.imyeyu.api.modules.user.service.UserLoginService; import com.imyeyu.api.modules.user.service.UserLoginService;
import com.imyeyu.java.TimiJava; import com.imyeyu.java.TimiJava;
import com.imyeyu.java.bean.timi.TimiCode; import com.imyeyu.java.bean.timi.TimiCode;
@@ -24,6 +26,7 @@ import com.imyeyu.spring.mapper.BaseMapper;
import com.imyeyu.spring.service.AbstractEntityService; import com.imyeyu.spring.service.AbstractEntityService;
import com.imyeyu.utils.Time; import com.imyeyu.utils.Time;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
@@ -34,6 +37,7 @@ import java.util.Map;
/// ///
/// @author Codex /// @author Codex
/// @since 2026-08-11 /// @since 2026-08-11
@Slf4j
@Service @Service
@RequiredArgsConstructor @RequiredArgsConstructor
public class GaoPointLedgerServiceImplement extends AbstractEntityService<GaoPointLedger, String> implements GaoPointLedgerService { public class GaoPointLedgerServiceImplement extends AbstractEntityService<GaoPointLedger, String> implements GaoPointLedgerService {
@@ -42,6 +46,7 @@ public class GaoPointLedgerServiceImplement extends AbstractEntityService<GaoPoi
private final GaoPointAccountService accountService; private final GaoPointAccountService accountService;
private final GaoCustomerService customerService; private final GaoCustomerService customerService;
private final AttachmentService attachmentService; private final AttachmentService attachmentService;
private final LoggerService loggerService;
private final UserLoginService userLoginService; private final UserLoginService userLoginService;
@Override @Override
@@ -128,43 +133,64 @@ public class GaoPointLedgerServiceImplement extends AbstractEntityService<GaoPoi
} }
private GaoPointLedger apply(String storeId, String customerId, GaoPointLedger.ChangeType changeType, long pointDelta, String ruleId, String eventId, String eventRecordId, JsonNode sourcePayload, String idempotencyKey, String remark, String operatorUserId, Long occurredAt) { private GaoPointLedger apply(String storeId, String customerId, GaoPointLedger.ChangeType changeType, long pointDelta, String ruleId, String eventId, String eventRecordId, JsonNode sourcePayload, String idempotencyKey, String remark, String operatorUserId, Long occurredAt) {
GaoPointLedger existing = mapper.selectByIdempotencyKey(idempotencyKey); Logger logger = new Logger(Logger.Module.GAO, "GAO_POINT_LEDGER_APPLY");
if (existing != null) { logger.setContent("storeId=%s, customerId=%s, changeType=%s, pointDelta=%d, idempotencyKey=%s, remark=%s".formatted(storeId, customerId, changeType, pointDelta, idempotencyKey, remark));
return existing; try {
GaoPointLedger existing = mapper.selectByIdempotencyKey(idempotencyKey);
if (existing != null) {
logger.setLevel(Logger.Level.INFO);
logger.setResult(existing.getId());
return existing;
}
GaoPointAccount account = accountService.getOrCreateForUpdate(storeId, customerId);
existing = mapper.selectByIdempotencyKey(idempotencyKey);
if (existing != null) {
logger.setLevel(Logger.Level.INFO);
logger.setResult(existing.getId());
return existing;
}
long balanceBefore = account.getBalance();
long balanceAfter = Math.addExact(balanceBefore, pointDelta);
long totalEarnedDelta = changeType == GaoPointLedger.ChangeType.EARN ? pointDelta : 0L;
long totalRevokedDelta = changeType == GaoPointLedger.ChangeType.REVOKE ? -pointDelta : 0L;
long totalAdjustedDelta = changeType == GaoPointLedger.ChangeType.ADJUST ? pointDelta : 0L;
GaoPointLedger ledger = new GaoPointLedger();
ledger.setAccountId(account.getId());
ledger.setStoreId(storeId);
ledger.setCustomerId(customerId);
ledger.setChangeType(changeType);
ledger.setDirection(0 < pointDelta ? GaoPointLedger.Direction.INCREASE : GaoPointLedger.Direction.DECREASE);
ledger.setPointDelta(pointDelta);
ledger.setBalanceBefore(balanceBefore);
ledger.setBalanceAfter(balanceAfter);
ledger.setRuleId(ruleId);
ledger.setEventId(eventId);
ledger.setEventRecordId(eventRecordId);
ledger.setSourcePayload(sourcePayload);
ledger.setIdempotencyKey(idempotencyKey);
ledger.setRemark(remark);
ledger.setOperatorUserId(operatorUserId);
ledger.setOccurredAt(occurredAt);
create(ledger);
int updated = accountService.updateBalance(account.getId(), pointDelta, totalEarnedDelta, totalRevokedDelta, totalAdjustedDelta);
TimiException.requiredTrue(0 < updated, "积分余额不足");
logger.setLevel(Logger.Level.INFO);
logger.setResult(ledger.getId());
return ledger;
} catch (TimiException e) {
logger.setLevel(Logger.Level.WARN);
logger.setException(e.getMessage());
throw e;
} catch (Exception e) {
logger.setLevel(Logger.Level.ERROR);
logger.setException(TimiJava.serializeThrowable(e));
log.error("应用 GAO 积分流水失败", e);
throw new TimiException(TimiCode.ERROR, "应用 GAO 积分流水失败", e);
} finally {
loggerService.create(logger);
} }
GaoPointAccount account = accountService.getOrCreateForUpdate(storeId, customerId);
existing = mapper.selectByIdempotencyKey(idempotencyKey);
if (existing != null) {
return existing;
}
long balanceBefore = account.getBalance();
long balanceAfter = Math.addExact(balanceBefore, pointDelta);
long totalEarnedDelta = changeType == GaoPointLedger.ChangeType.EARN ? pointDelta : 0L;
long totalRevokedDelta = changeType == GaoPointLedger.ChangeType.REVOKE ? -pointDelta : 0L;
long totalAdjustedDelta = changeType == GaoPointLedger.ChangeType.ADJUST ? pointDelta : 0L;
GaoPointLedger ledger = new GaoPointLedger();
ledger.setAccountId(account.getId());
ledger.setStoreId(storeId);
ledger.setCustomerId(customerId);
ledger.setChangeType(changeType);
ledger.setDirection(0 < pointDelta ? GaoPointLedger.Direction.INCREASE : GaoPointLedger.Direction.DECREASE);
ledger.setPointDelta(pointDelta);
ledger.setBalanceBefore(balanceBefore);
ledger.setBalanceAfter(balanceAfter);
ledger.setRuleId(ruleId);
ledger.setEventId(eventId);
ledger.setEventRecordId(eventRecordId);
ledger.setSourcePayload(sourcePayload);
ledger.setIdempotencyKey(idempotencyKey);
ledger.setRemark(remark);
ledger.setOperatorUserId(operatorUserId);
ledger.setOccurredAt(occurredAt);
create(ledger);
int updated = accountService.updateBalance(account.getId(), pointDelta, totalEarnedDelta, totalRevokedDelta, totalAdjustedDelta);
TimiException.requiredTrue(0 < updated, "积分余额不足");
return ledger;
} }
} }