From 4ccf5c576240711478238d101a8ecd643300ef1c Mon Sep 17 00:00:00 2001 From: heqijun Date: Wed, 11 Jun 2025 15:39:13 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E7=AD=96=E7=95=A5=E6=A8=A1?= =?UTF-8?q?=E5=9D=97=E6=89=A3=E8=B4=B9=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cache/controller/CacheController.java | 11 +++- .../common/clients/BeaconCacheClient.java | 3 + .../common/constant/CacheConstant.java | 3 + .../impl/FeeStrategyFilter.java | 58 +++++++++++++++++++ .../utils/OutstandingFeeLimitUtil.java | 25 ++++++++ 5 files changed, 99 insertions(+), 1 deletion(-) create mode 100644 beacon-strategy/src/main/java/com/mashibing/strategy/service/strategyfilter/impl/FeeStrategyFilter.java create mode 100644 beacon-strategy/src/main/java/com/mashibing/strategy/utils/OutstandingFeeLimitUtil.java 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; + } +}