diff --git a/beacon-cache/src/main/java/com/mashibing/cache/controller/CacheController.java b/beacon-cache/src/main/java/com/mashibing/cache/controller/CacheController.java index b6aa504..78b73c8 100644 --- a/beacon-cache/src/main/java/com/mashibing/cache/controller/CacheController.java +++ b/beacon-cache/src/main/java/com/mashibing/cache/controller/CacheController.java @@ -121,10 +121,19 @@ public class CacheController { @GetMapping("zremove/{key}/{member}/") public long zRemove(@PathVariable String key, @PathVariable String member) { Long l = redisClient.zRemove(key, member); - log.info("【缓存模块】zadd: key = {},member = {},编号 = {}", key, member, l); + log.info("【缓存模块】zRemove: key = {},member = {},编号 = {}", key, member, l); return l; } + @PostMapping("hincrby/{key}/{field}/{number}") + public Long hincrby(@PathVariable String key, @PathVariable String field, @PathVariable Long number) { + + Long result = redisClient.hIncrementBy(key, field, number); + log.info("【缓存模块】hincrby: key = {},field = {},number = {},result = {}", + key, field, number, result); + return result; + } + /** * 大批量写入String数据 * diff --git a/beacon-common/src/main/java/com/mashibing/common/clients/BeaconCacheClient.java b/beacon-common/src/main/java/com/mashibing/common/clients/BeaconCacheClient.java index 4cc7afd..7cefac9 100644 --- a/beacon-common/src/main/java/com/mashibing/common/clients/BeaconCacheClient.java +++ b/beacon-common/src/main/java/com/mashibing/common/clients/BeaconCacheClient.java @@ -64,6 +64,9 @@ public interface BeaconCacheClient { @GetMapping("cache/zremove/{key}/{member}/") long zRemove(@PathVariable String key, @PathVariable String member); + @PostMapping("cache/hincrby/{key}/{field}/{number}") + Long hincrby(@PathVariable String key, @PathVariable String field, @PathVariable Long number); + /** * 大批量写入String数据 * diff --git a/beacon-common/src/main/java/com/mashibing/common/constant/CacheConstant.java b/beacon-common/src/main/java/com/mashibing/common/constant/CacheConstant.java index 2a0864e..5ad1855 100644 --- a/beacon-common/src/main/java/com/mashibing/common/constant/CacheConstant.java +++ b/beacon-common/src/main/java/com/mashibing/common/constant/CacheConstant.java @@ -23,6 +23,9 @@ public class CacheConstant { @Description("客户余额") public static final String CLIENT_BALANCE = "client_balance:"; + @Description("客户余额-余额字段名") + public static final String FIELD_BALANCE = "balance"; + @Description("客户信息:ip白名单,ipAddress") public static final String CLIENT_BUSINESS_IPADDRESS = "ipAddress"; diff --git a/beacon-strategy/src/main/java/com/mashibing/strategy/service/strategyfilter/impl/FeeStrategyFilter.java b/beacon-strategy/src/main/java/com/mashibing/strategy/service/strategyfilter/impl/FeeStrategyFilter.java new file mode 100644 index 0000000..a41ba5e --- /dev/null +++ b/beacon-strategy/src/main/java/com/mashibing/strategy/service/strategyfilter/impl/FeeStrategyFilter.java @@ -0,0 +1,58 @@ +package com.mashibing.strategy.service.strategyfilter.impl; + +import com.mashibing.common.constant.CacheConstant; +import com.mashibing.common.enums.ExceptionEnums; +import com.mashibing.common.exception.StrategyException; +import com.mashibing.common.pojo.StandardSubmit; +import com.mashibing.strategy.feignclient.CacheClient; +import com.mashibing.strategy.service.strategyfilter.StrategyFilter; +import com.mashibing.strategy.utils.OutstandingFeeLimitUtil; +import com.mashibing.strategy.utils.StrategyCheckFailedUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * @author heqijun + * @ClassName: FeeStrategyFilter + * @Description: 策略模块扣费校验 + * @date 2025/6/11 15:07 + */ + +@Slf4j +@Service(value = "fee") +public class FeeStrategyFilter implements StrategyFilter { + + @Autowired + CacheClient cacheClient; + + @Autowired + StrategyCheckFailedUtil strategyCheckFailedUtil; + + private static final String STRATEGY_NAME = "扣费"; + + @Override + public void strategy(StandardSubmit submit) { + log.info("【策略模块-扣费校验】开始===================================="); + Long fee = submit.getFee(); + //欠费额度 + Long outstandingFeeLimit = OutstandingFeeLimitUtil.getClientOutstandingFeeLimit(); + + String key = CacheConstant.CLIENT_BALANCE + submit.getClientId(); + String filed = CacheConstant.FIELD_BALANCE; + //扣费 + Long balance = cacheClient.hincrby(key, filed, -1 * fee); + log.info("【策略模块-扣费校验】本条短信扣费{},预扣费后客户余额:{},欠费额度{}", fee, balance, outstandingFeeLimit); + //超额欠费 + if (balance < outstandingFeeLimit) { + log.info("【策略模块-扣费校验】超出欠费额度!!!"); + //加回去 + cacheClient.hincrby(key, filed, fee); + strategyCheckFailedUtil.smsSendLog(submit, STRATEGY_NAME); + strategyCheckFailedUtil.smsPushReport(submit, STRATEGY_NAME); + throw new StrategyException(ExceptionEnums.BALANCE_NOT_ENOUGH); + } + + log.info("【策略模块-扣费校验】扣费成功!!!"); + } +} diff --git a/beacon-strategy/src/main/java/com/mashibing/strategy/utils/OutstandingFeeLimitUtil.java b/beacon-strategy/src/main/java/com/mashibing/strategy/utils/OutstandingFeeLimitUtil.java new file mode 100644 index 0000000..19a3046 --- /dev/null +++ b/beacon-strategy/src/main/java/com/mashibing/strategy/utils/OutstandingFeeLimitUtil.java @@ -0,0 +1,25 @@ +package com.mashibing.strategy.utils; + +/** + * @author heqijun + * @ClassName: OutstandingFeeLimitUtil + * @Description: TODO(这里用一句话描述这个类的作用) + * @date 2025/6/11 15:12 + */ + +public class OutstandingFeeLimitUtil { + + /** + * 厘到元单位换算比例 + */ + private static final long CENTI_2_YUAN = 1000L; + + /** + * 默认欠款额度:-10元 + */ + private static final long DEFAULT_OUTSTANDING_FEE_LIMIT = -10 * CENTI_2_YUAN; + + public static Long getClientOutstandingFeeLimit() { + return DEFAULT_OUTSTANDING_FEE_LIMIT; + } +}