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 b83734c..0cea5fb 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 @@ -41,4 +41,9 @@ public class CacheConstant { @Description("黑名单前缀") public static final String BLACK = "black:"; + @Description("冒号") + public static final String COLON = ":"; + + @Description("携号转网前缀") + public static final String TRANSFER = "transfer:"; } diff --git a/beacon-common/src/main/java/com/mashibing/common/enums/ExceptionEnums.java b/beacon-common/src/main/java/com/mashibing/common/enums/ExceptionEnums.java index 0a12283..19e8fc8 100644 --- a/beacon-common/src/main/java/com/mashibing/common/enums/ExceptionEnums.java +++ b/beacon-common/src/main/java/com/mashibing/common/enums/ExceptionEnums.java @@ -21,11 +21,13 @@ public enum ExceptionEnums { SNOWFLAKE_OUT_OF_RANGE(-11, "机器id超过最大范围!"), SNOWFLAKE_TIME_BACK(-12, "雪花算法出现时间回拨!!!"), HAVE_DIRTY_WORD(-13, "短信中包含敏感词信息!!"), + BLACK_GLOBAL(-14, "手机号是全局黑名单!!"), + BLACK_CLIENT(-15, "手机号是客户黑名单!!"), ; - private int code; + private final int code; - private String msg; + private final String msg; ExceptionEnums(int code, String msg) { this.code = code; diff --git a/beacon-common/src/main/java/com/mashibing/common/enums/OperatorEnums.java b/beacon-common/src/main/java/com/mashibing/common/enums/OperatorEnums.java new file mode 100644 index 0000000..f9dab47 --- /dev/null +++ b/beacon-common/src/main/java/com/mashibing/common/enums/OperatorEnums.java @@ -0,0 +1,25 @@ +package com.mashibing.common.enums; + +/** + * @author heqijun + * @ClassName: OperatorEnums + * @Description: 运营商id和名称的枚举 + * @date 2025/6/10 18:25 + */ + +public enum OperatorEnums { + + MOBILE(1, "移动"), + UNICOM(2, "联通"), + TELECOM(3, "电信"), + ; + + public final int operatorId; + + public final String operatorName; + + OperatorEnums(int operatorId, String operatorName) { + this.operatorId = operatorId; + this.operatorName = operatorName; + } +} diff --git a/beacon-common/src/main/java/com/mashibing/common/pojo/StandardSubmit.java b/beacon-common/src/main/java/com/mashibing/common/pojo/StandardSubmit.java index 99db7b7..8e3b4fe 100644 --- a/beacon-common/src/main/java/com/mashibing/common/pojo/StandardSubmit.java +++ b/beacon-common/src/main/java/com/mashibing/common/pojo/StandardSubmit.java @@ -80,4 +80,7 @@ public class StandardSubmit implements Serializable { @Description("state短信类型 0-验证码短信 1-通知类短信 2-营销类短信") private Integer state; + @Description("是否携号转网") + private Boolean isTransfer; + } diff --git a/beacon-strategy/src/main/java/com/mashibing/strategy/service/strategyfilter/StrategyFilter.java b/beacon-strategy/src/main/java/com/mashibing/strategy/service/strategyfilter/StrategyFilter.java index ca3456e..f2fb520 100644 --- a/beacon-strategy/src/main/java/com/mashibing/strategy/service/strategyfilter/StrategyFilter.java +++ b/beacon-strategy/src/main/java/com/mashibing/strategy/service/strategyfilter/StrategyFilter.java @@ -14,6 +14,6 @@ public interface StrategyFilter { /** * 策略校验 */ - void strategy(StandardSubmit standardSubmit); + void strategy(StandardSubmit submit); } diff --git a/beacon-strategy/src/main/java/com/mashibing/strategy/service/strategyfilter/StrategyFilterContext.java b/beacon-strategy/src/main/java/com/mashibing/strategy/service/strategyfilter/StrategyFilterContext.java index 6cb58f8..c1133d2 100644 --- a/beacon-strategy/src/main/java/com/mashibing/strategy/service/strategyfilter/StrategyFilterContext.java +++ b/beacon-strategy/src/main/java/com/mashibing/strategy/service/strategyfilter/StrategyFilterContext.java @@ -29,8 +29,8 @@ public class StrategyFilterContext { private final String CLIENT_FILTERS = "clientFilters"; - public void strategy(StandardSubmit standardSubmit) { - String s = cacheClient.hgetString(CacheConstant.CLIENT_BUSINESS + standardSubmit.getApikey(), CLIENT_FILTERS); + public void strategy(StandardSubmit submit) { + String s = cacheClient.hgetString(CacheConstant.CLIENT_BUSINESS + submit.getApikey(), CLIENT_FILTERS); if (StringUtils.isBlank(s)) { log.info("【策略模块-策略为空】没有校验。。。"); return; @@ -39,7 +39,7 @@ public class StrategyFilterContext { for (String strategyFilter : strategyFilterArr) { StrategyFilter check = strategyFilters.get(strategyFilter); if (check != null) { - check.strategy(standardSubmit); + check.strategy(submit); } } } diff --git a/beacon-strategy/src/main/java/com/mashibing/strategy/service/strategyfilter/impl/BlackClientStrategyFilter.java b/beacon-strategy/src/main/java/com/mashibing/strategy/service/strategyfilter/impl/BlackClientStrategyFilter.java new file mode 100644 index 0000000..0b7c581 --- /dev/null +++ b/beacon-strategy/src/main/java/com/mashibing/strategy/service/strategyfilter/impl/BlackClientStrategyFilter.java @@ -0,0 +1,49 @@ +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.StrategyCheckFailedUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * @author heqijun + * @ClassName: BlackClientStrategyFilter + * @Description: TODO(这里用一句话描述这个类的作用) + * @date 2025/6/10 17:29 + */ + +@Slf4j +@Service(value = "blackClient") +public class BlackClientStrategyFilter implements StrategyFilter { + + @Autowired + CacheClient cacheClient; + + @Autowired + StrategyCheckFailedUtil strategyCheckFailedUtil; + + private static final String STRATEGY_NAME = "客户黑名单"; + + private static final String IN_BLACK = "1"; + + @Override + public void strategy(StandardSubmit submit) { + log.info("【策略模块-客户黑名单校验】开始====================================="); + String mobile = submit.getMobile(); + Long clientId = submit.getClientId(); + String value = cacheClient.get(CacheConstant.BLACK + clientId + CacheConstant.COLON + mobile); + if (IN_BLACK.equals(value)) { + log.info("【策略模块-客户黑名单校验】当前手机号:{}是客户黑名单!", mobile); + strategyCheckFailedUtil.smsSendLog(submit, STRATEGY_NAME); + strategyCheckFailedUtil.smsPushReport(submit, STRATEGY_NAME); + throw new StrategyException(ExceptionEnums.BLACK_CLIENT); + } + log.info("【策略模块-客户黑名单校验】当前手机号:{}客户黑名单校验通过!!!", mobile); + } +} diff --git a/beacon-strategy/src/main/java/com/mashibing/strategy/service/strategyfilter/impl/BlackGlobalStrategyFilter.java b/beacon-strategy/src/main/java/com/mashibing/strategy/service/strategyfilter/impl/BlackGlobalStrategyFilter.java new file mode 100644 index 0000000..f4a7cef --- /dev/null +++ b/beacon-strategy/src/main/java/com/mashibing/strategy/service/strategyfilter/impl/BlackGlobalStrategyFilter.java @@ -0,0 +1,49 @@ +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.StrategyCheckFailedUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * @author heqijun + * @ClassName: BlackStrategyFilter + * @Description: 黑名单校验 + * @date 2025/6/7 20:26 + */ + +@Slf4j +@Service(value = "blackGlobal") +public class BlackGlobalStrategyFilter implements StrategyFilter { + + @Autowired + CacheClient cacheClient; + + @Autowired + StrategyCheckFailedUtil strategyCheckFailedUtil; + + private static final String STRATEGY_NAME = "全局黑名单"; + + private static final String IN_BLACK = "1"; + + + @Override + public void strategy(StandardSubmit submit) { + log.info("【策略模块-全局黑名单校验】开始====================================="); + String mobile = submit.getMobile(); + String value = cacheClient.get(CacheConstant.BLACK + mobile); + if (IN_BLACK.equals(value)) { + log.info("【策略模块-全局黑名单校验】当前手机号:{}是全局黑名单!", mobile); + strategyCheckFailedUtil.smsSendLog(submit, STRATEGY_NAME); + strategyCheckFailedUtil.smsPushReport(submit, STRATEGY_NAME); + throw new StrategyException(ExceptionEnums.BLACK_GLOBAL); + } + log.info("【策略模块-全局黑名单校验】当前手机号:{}全局黑名单校验通过!!!", mobile); + } +} diff --git a/beacon-strategy/src/main/java/com/mashibing/strategy/service/strategyfilter/impl/BlackStrategyFilter.java b/beacon-strategy/src/main/java/com/mashibing/strategy/service/strategyfilter/impl/BlackStrategyFilter.java deleted file mode 100644 index 5e5098f..0000000 --- a/beacon-strategy/src/main/java/com/mashibing/strategy/service/strategyfilter/impl/BlackStrategyFilter.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.mashibing.strategy.service.strategyfilter.impl; - -import com.mashibing.common.pojo.StandardSubmit; -import com.mashibing.strategy.service.strategyfilter.StrategyFilter; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -/** - * @author heqijun - * @ClassName: BlackStrategyFilter - * @Description: 黑名单校验 - * @date 2025/6/7 20:26 - */ - -@Slf4j -@Service(value = "black") -public class BlackStrategyFilter implements StrategyFilter { - - @Override - public void strategy(StandardSubmit standardSubmit) { - log.info("【策略模块-黑名单校验】。。。"); - } -} diff --git a/beacon-strategy/src/main/java/com/mashibing/strategy/service/strategyfilter/impl/LimitMinuteStrategyFilter.java b/beacon-strategy/src/main/java/com/mashibing/strategy/service/strategyfilter/impl/LimitMinuteStrategyFilter.java new file mode 100644 index 0000000..6bf5e62 --- /dev/null +++ b/beacon-strategy/src/main/java/com/mashibing/strategy/service/strategyfilter/impl/LimitMinuteStrategyFilter.java @@ -0,0 +1,28 @@ +package com.mashibing.strategy.service.strategyfilter.impl; + +import com.mashibing.common.pojo.StandardSubmit; +import com.mashibing.strategy.feignclient.CacheClient; +import com.mashibing.strategy.service.strategyfilter.StrategyFilter; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * @author heqijun + * @ClassName: LimitMinuteStrategyFilter + * @Description: 分钟限流策略 + * @date 2025/6/10 20:41 + */ + +@Slf4j +@Service(value = "limitMinute") +public class LimitMinuteStrategyFilter implements StrategyFilter { + + @Autowired + CacheClient cacheClient; + + @Override + public void strategy(StandardSubmit submit) { + + } +} diff --git a/beacon-strategy/src/main/java/com/mashibing/strategy/service/strategyfilter/impl/RouteStrategyFilter.java b/beacon-strategy/src/main/java/com/mashibing/strategy/service/strategyfilter/impl/RouteStrategyFilter.java index 5181343..aef08af 100644 --- a/beacon-strategy/src/main/java/com/mashibing/strategy/service/strategyfilter/impl/RouteStrategyFilter.java +++ b/beacon-strategy/src/main/java/com/mashibing/strategy/service/strategyfilter/impl/RouteStrategyFilter.java @@ -17,7 +17,7 @@ import org.springframework.stereotype.Service; public class RouteStrategyFilter implements StrategyFilter { @Override - public void strategy(StandardSubmit standardSubmit) { + public void strategy(StandardSubmit submit) { log.info("【策略模块-路由校验】。。。"); } } diff --git a/beacon-strategy/src/main/java/com/mashibing/strategy/service/strategyfilter/impl/TransferStrategyFilter.java b/beacon-strategy/src/main/java/com/mashibing/strategy/service/strategyfilter/impl/TransferStrategyFilter.java new file mode 100644 index 0000000..caedc79 --- /dev/null +++ b/beacon-strategy/src/main/java/com/mashibing/strategy/service/strategyfilter/impl/TransferStrategyFilter.java @@ -0,0 +1,39 @@ +package com.mashibing.strategy.service.strategyfilter.impl; + +import com.mashibing.common.constant.CacheConstant; +import com.mashibing.common.pojo.StandardSubmit; +import com.mashibing.strategy.feignclient.CacheClient; +import com.mashibing.strategy.service.strategyfilter.StrategyFilter; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * @author heqijun + * @ClassName: TransferStrategyFilter + * @Description: 携号转网判断 + * @date 2025/6/10 18:36 + */ + +@Slf4j +@Service(value = "transfer") +public class TransferStrategyFilter implements StrategyFilter { + + @Autowired + CacheClient cacheClient; + + @Override + public void strategy(StandardSubmit submit) { + log.info("【策略模块-携号转网判断】开始====================================="); + + String mobile = submit.getMobile(); + String value = cacheClient.get(CacheConstant.TRANSFER + mobile); + if (!StringUtils.isBlank(value)) { + submit.setOperatorId(Integer.valueOf(value)); + submit.setIsTransfer(Boolean.TRUE); + log.info("【策略模块-携号转网判断】携号转网!!!手机号:{}", mobile); + } + log.info("【策略模块-携号转网判断】结束====================================="); + } +} diff --git a/beacon-test/src/main/java/com/mashibing/test/entity/MobileTransfer.java b/beacon-test/src/main/java/com/mashibing/test/entity/MobileTransfer.java new file mode 100644 index 0000000..e8fecc8 --- /dev/null +++ b/beacon-test/src/main/java/com/mashibing/test/entity/MobileTransfer.java @@ -0,0 +1,157 @@ +package com.mashibing.test.entity; + + +public class MobileTransfer { + + private long id; + private String transferNumber; + private String areaCode; + private long initIsp; + private long nowIsp; + private long isTransfer; + private java.sql.Timestamp created; + private long createId; + private java.sql.Timestamp updated; + private long updateId; + private long isDelete; + private String extend1; + private String extend2; + private String extend3; + private String extend4; + + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + + public String getTransferNumber() { + return transferNumber; + } + + public void setTransferNumber(String transferNumber) { + this.transferNumber = transferNumber; + } + + + public String getAreaCode() { + return areaCode; + } + + public void setAreaCode(String areaCode) { + this.areaCode = areaCode; + } + + + public long getInitIsp() { + return initIsp; + } + + public void setInitIsp(long initIsp) { + this.initIsp = initIsp; + } + + + public long getNowIsp() { + return nowIsp; + } + + public void setNowIsp(long nowIsp) { + this.nowIsp = nowIsp; + } + + + public long getIsTransfer() { + return isTransfer; + } + + public void setIsTransfer(long isTransfer) { + this.isTransfer = isTransfer; + } + + + public java.sql.Timestamp getCreated() { + return created; + } + + public void setCreated(java.sql.Timestamp created) { + this.created = created; + } + + + public long getCreateId() { + return createId; + } + + public void setCreateId(long createId) { + this.createId = createId; + } + + + public java.sql.Timestamp getUpdated() { + return updated; + } + + public void setUpdated(java.sql.Timestamp updated) { + this.updated = updated; + } + + + public long getUpdateId() { + return updateId; + } + + public void setUpdateId(long updateId) { + this.updateId = updateId; + } + + + public long getIsDelete() { + return isDelete; + } + + public void setIsDelete(long isDelete) { + this.isDelete = isDelete; + } + + + public String getExtend1() { + return extend1; + } + + public void setExtend1(String extend1) { + this.extend1 = extend1; + } + + + public String getExtend2() { + return extend2; + } + + public void setExtend2(String extend2) { + this.extend2 = extend2; + } + + + public String getExtend3() { + return extend3; + } + + public void setExtend3(String extend3) { + this.extend3 = extend3; + } + + + public String getExtend4() { + return extend4; + } + + public void setExtend4(String extend4) { + this.extend4 = extend4; + } + +} diff --git a/beacon-test/src/main/java/com/mashibing/test/mapper/MobileTransferMapper.java b/beacon-test/src/main/java/com/mashibing/test/mapper/MobileTransferMapper.java new file mode 100644 index 0000000..fafe72f --- /dev/null +++ b/beacon-test/src/main/java/com/mashibing/test/mapper/MobileTransferMapper.java @@ -0,0 +1,18 @@ +package com.mashibing.test.mapper; + +import com.mashibing.test.entity.MobileTransfer; +import org.apache.ibatis.annotations.Select; + +import java.util.List; + +/** + * @author heqijun + * @ClassName: MobileTransferMapper + * @Description: TODO(这里用一句话描述这个类的作用) + * @date 2025/6/10 18:14 + */ + +public interface MobileTransferMapper { + @Select("select transfer_number,now_isp from mobile_transfer where is_transfer = 1 and is_delete = 0") + List findAll1(); +} diff --git a/beacon-test/src/test/java/com/mashibing/test/mapper/MobileTransferMapperTest.java b/beacon-test/src/test/java/com/mashibing/test/mapper/MobileTransferMapperTest.java new file mode 100644 index 0000000..e863bb2 --- /dev/null +++ b/beacon-test/src/test/java/com/mashibing/test/mapper/MobileTransferMapperTest.java @@ -0,0 +1,33 @@ +package com.mashibing.test.mapper; + +import com.mashibing.test.entity.MobileTransfer; +import com.mashibing.test.feignClient.CacheClient; +import org.junit.jupiter.api.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +@SpringBootTest +@RunWith(SpringRunner.class) +class MobileTransferMapperTest { + + @Autowired + CacheClient cacheClient; + + @Autowired + MobileTransferMapper mapper; + + @Test + void findAll1() { + List mobileTransfers = mapper.findAll1(); + for (MobileTransfer mobileTransfer : mobileTransfers) { + cacheClient.set("transfer:" + mobileTransfer.getTransferNumber(), String.valueOf(mobileTransfer.getNowIsp())); + } + + } +} \ No newline at end of file