v1.0.13 #20
+63
-37
@@ -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;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user