From d9cd915f735f9e8c51d161cdef4ef9a564b60c54 Mon Sep 17 00:00:00 2001 From: heqijun Date: Tue, 10 Jun 2025 16:07:59 +0800 Subject: [PATCH] =?UTF-8?q?=E7=AD=96=E7=95=A5=E6=A8=A1=E5=9D=97=E6=A0=A1?= =?UTF-8?q?=E9=AA=8C=E4=B8=8D=E9=80=9A=E8=BF=87=E5=8F=91=E9=80=81=E6=B6=88?= =?UTF-8?q?=E6=81=AF=E5=88=B0=E5=86=99=E6=97=A5=E5=BF=97=E9=98=9F=E5=88=97?= =?UTF-8?q?+=E7=AD=96=E7=95=A5=E6=A8=A1=E5=9D=97=E6=A0=A1=E9=AA=8C?= =?UTF-8?q?=E4=B8=8D=E9=80=9A=E8=BF=87=E5=8F=91=E9=80=81=E6=B6=88=E6=81=AF?= =?UTF-8?q?=E5=88=B0=E6=8E=A8=E9=80=81=E7=9F=AD=E4=BF=A1=E7=8A=B6=E6=80=81?= =?UTF-8?q?=E6=8A=A5=E5=91=8A=E9=98=9F=E5=88=97+?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/clients/BeaconCacheClient.java | 3 ++ .../common/constant/CacheConstant.java | 7 +++ .../common/constant/RabbitMQConstant.java | 10 ++++ .../common/constant/SMSConstant.java | 11 ++++ .../mashibing/common/pojo/StandardReport.java | 51 +++++++++++++++++++ .../strategy/config/RabbitMQConfig.java | 18 ++++++- .../strategy/mq/PreSendListener.java | 2 +- .../impl/DFADirtyWordStrategyFilter.java | 45 ++++++++++++---- .../strategy/utils/DirtyWordTree.java | 2 +- .../{StringUtil.java => SpringUtil.java} | 4 +- .../test/mapper/MobileAreaMapper.java | 3 ++ .../test/mapper/MobileAreaMapperTest.java | 11 ++++ 12 files changed, 153 insertions(+), 14 deletions(-) create mode 100644 beacon-common/src/main/java/com/mashibing/common/pojo/StandardReport.java rename beacon-strategy/src/main/java/com/mashibing/strategy/utils/{StringUtil.java => SpringUtil.java} (87%) 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 ac326fe..d8170a1 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 @@ -33,6 +33,9 @@ public interface BeaconCacheClient { @GetMapping("cache/hgetString/{key}/{field}") String hgetString(@PathVariable(value = "key") String key, @PathVariable(value = "field") String field); + @GetMapping("cache/hget/{key}/{field}") + Integer hgetInteger(@PathVariable(value = "key") String key, @PathVariable(value = "field") String field); + @PostMapping("cache/hset/{key}") void hset(@PathVariable String key, @RequestBody Map hash); 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 e93676c..8ae9244 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 @@ -31,4 +31,11 @@ public class CacheConstant { @Description("敏感词key") public static final String DIRTY_WORD = "dirty_word"; + + @Description("客户信息-是否需要回调") + public static final String IS_CALLBACK = "isCallback"; + + @Description("客户信息-回调地址") + public static final String CALLBACK_URL = "callbackUrl"; + } diff --git a/beacon-common/src/main/java/com/mashibing/common/constant/RabbitMQConstant.java b/beacon-common/src/main/java/com/mashibing/common/constant/RabbitMQConstant.java index 4389c6d..374c1c3 100644 --- a/beacon-common/src/main/java/com/mashibing/common/constant/RabbitMQConstant.java +++ b/beacon-common/src/main/java/com/mashibing/common/constant/RabbitMQConstant.java @@ -17,4 +17,14 @@ public interface RabbitMQConstant { * 策略模块发送【手机号归属地和运营商】到后台管理模块的队列名称 */ String MOBILE_AREA_OPERATOR = "mobile_area_operator_topic"; + + /** + * 写日志到ES的队列 + */ + String SMS_WRITE_LOG = "sms_write_log_topic"; + + /** + * 推送短信状态报告队列 + */ + String SMS_PUSH_REPORT = "sms_push_report_topic"; } diff --git a/beacon-common/src/main/java/com/mashibing/common/constant/SMSConstant.java b/beacon-common/src/main/java/com/mashibing/common/constant/SMSConstant.java index dd04d86..f42a553 100644 --- a/beacon-common/src/main/java/com/mashibing/common/constant/SMSConstant.java +++ b/beacon-common/src/main/java/com/mashibing/common/constant/SMSConstant.java @@ -1,5 +1,7 @@ package com.mashibing.common.constant; +import com.mashibing.common.annotation.Description; + /** * @author heqijun * @ClassName: Constant @@ -19,4 +21,13 @@ public class SMSConstant { public static final Long SINGLE_FEE = 50L; + @Description("短信的发送状态, 0-等待ing,1-成功,2-失败") + public static final int REPORT_STATE_WAITING = 0; + + @Description("短信的发送状态, 0-等待ing,1-成功,2-失败") + public static final int REPORT_STATE_SUCCESS = 1; + + @Description("短信的发送状态, 0-等待ing,1-成功,2-失败") + public static final int REPORT_STATE_FAILED = 2; + } diff --git a/beacon-common/src/main/java/com/mashibing/common/pojo/StandardReport.java b/beacon-common/src/main/java/com/mashibing/common/pojo/StandardReport.java new file mode 100644 index 0000000..b87159c --- /dev/null +++ b/beacon-common/src/main/java/com/mashibing/common/pojo/StandardReport.java @@ -0,0 +1,51 @@ +package com.mashibing.common.pojo; + +import com.mashibing.common.annotation.Description; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * @author heqijun + * @ClassName: StandardReport + * @Description: 向客户推送短信状态报告的封装对象 + * @date 2025/6/10 15:45 + */ + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class StandardReport implements Serializable { + + @Description("针对当前短信的唯一标识,雪花算法(保留)") + private Long sequenceId; + + @Description("客户端ID,基于apikey查询缓存模块得到客户的ID") + private Long clientId; + + @Description("客户业务内的uid,客户请求传递的") + private String uid; + + @Description("目标手机号,客户请求传递的") + private String mobile; + + @Description("短信的发送时间,当前系统时间") + private LocalDateTime sendTime; + + @Description("短信的发送状态, 0-等待/发送ing,1-成功,2-失败 ,默认情况就是0") + private int reportState; + + @Description("短信发送失败的原因是什么,记录在当前属性") + private String errorMsg; + + @Description("是否需要回调") + private Integer isCallback; + + @Description("回调url") + private String callbackUrl; + + +} diff --git a/beacon-strategy/src/main/java/com/mashibing/strategy/config/RabbitMQConfig.java b/beacon-strategy/src/main/java/com/mashibing/strategy/config/RabbitMQConfig.java index 898c368..6d9d12a 100644 --- a/beacon-strategy/src/main/java/com/mashibing/strategy/config/RabbitMQConfig.java +++ b/beacon-strategy/src/main/java/com/mashibing/strategy/config/RabbitMQConfig.java @@ -17,10 +17,26 @@ import org.springframework.context.annotation.Configuration; public class RabbitMQConfig { /** - * 构建策略模块发送【手机号归属地和运营商】到后台管理模块的队列名称 + * 构建策略模块发送【手机号归属地和运营商】到后台管理模块的队列 */ @Bean public Queue preSendQueue() { return QueueBuilder.durable(RabbitMQConstant.MOBILE_AREA_OPERATOR).build(); } + + /** + * 写日志到ES的队列 + */ + @Bean + public Queue writeLogQueue() { + return QueueBuilder.durable(RabbitMQConstant.SMS_WRITE_LOG).build(); + } + + /** + * 推送短信状态报告队列 + */ + @Bean + public Queue pushReportQueue() { + return QueueBuilder.durable(RabbitMQConstant.SMS_PUSH_REPORT).build(); + } } diff --git a/beacon-strategy/src/main/java/com/mashibing/strategy/mq/PreSendListener.java b/beacon-strategy/src/main/java/com/mashibing/strategy/mq/PreSendListener.java index 3541adf..9c3e8d3 100644 --- a/beacon-strategy/src/main/java/com/mashibing/strategy/mq/PreSendListener.java +++ b/beacon-strategy/src/main/java/com/mashibing/strategy/mq/PreSendListener.java @@ -36,7 +36,7 @@ public class PreSendListener { log.info("【策略模块-接收消息】消息消费完毕,手动ack"); channel.basicAck(message.getMessageProperties().getDeliveryTag(), false); } catch (StrategyException e) { - log.info("【策略模块-接收消息】消息消费失败!!!错误信息:{}", e.getMessage()); + log.error("【策略模块-接收消息】消息消费失败!!!错误信息:{}", e.getMessage()); channel.basicAck(message.getMessageProperties().getDeliveryTag(), false); } } diff --git a/beacon-strategy/src/main/java/com/mashibing/strategy/service/strategyfilter/impl/DFADirtyWordStrategyFilter.java b/beacon-strategy/src/main/java/com/mashibing/strategy/service/strategyfilter/impl/DFADirtyWordStrategyFilter.java index 5a02ffe..ebd99e6 100644 --- a/beacon-strategy/src/main/java/com/mashibing/strategy/service/strategyfilter/impl/DFADirtyWordStrategyFilter.java +++ b/beacon-strategy/src/main/java/com/mashibing/strategy/service/strategyfilter/impl/DFADirtyWordStrategyFilter.java @@ -1,18 +1,22 @@ package com.mashibing.strategy.service.strategyfilter.impl; import com.mashibing.common.constant.CacheConstant; +import com.mashibing.common.constant.RabbitMQConstant; +import com.mashibing.common.constant.SMSConstant; +import com.mashibing.common.enums.ExceptionEnums; +import com.mashibing.common.exception.StrategyException; +import com.mashibing.common.pojo.StandardReport; import com.mashibing.common.pojo.StandardSubmit; import com.mashibing.strategy.feignclient.CacheClient; import com.mashibing.strategy.service.strategyfilter.StrategyFilter; import com.mashibing.strategy.utils.DirtyWordTree; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang.StringUtils; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import org.wltea.analyzer.core.IKSegmenter; -import org.wltea.analyzer.core.Lexeme; -import java.io.IOException; -import java.io.StringReader; import java.util.HashSet; import java.util.Set; @@ -30,21 +34,44 @@ public class DFADirtyWordStrategyFilter implements StrategyFilter { @Autowired CacheClient cacheClient; + @Autowired + RabbitTemplate rabbitTemplate; + @Override public void strategy(StandardSubmit submit) { log.info("【策略模块-敏感词校验】开始===================================="); String text = submit.getText(); Set set = new HashSet<>(); - long start = System.currentTimeMillis(); - long end = System.currentTimeMillis(); - log.info("【策略模块-敏感词校验】通过敏感词树校验敏感词"); + log.info("【策略模块-敏感词校验】使用敏感词树校验敏感词"); + long start = System.currentTimeMillis(); Set result = DirtyWordTree.getDirtyWord(text); + long end = System.currentTimeMillis(); + log.info("【策略模块-敏感词校验】使用敏感词树校验敏感词耗时:{}ms", end - start); if (!result.isEmpty()) { log.error("【策略模块-敏感词校验】短信内容包含敏感词:{}", result); - return; -// throw new RuntimeException("短信内容包含敏感词"); + submit.setReportState(SMSConstant.REPORT_STATE_FAILED); + submit.setErrorMsg(ExceptionEnums.HAVE_DIRTY_WORD.getMsg() + result); + + //发送消息到写日志队列 + rabbitTemplate.convertAndSend(RabbitMQConstant.SMS_WRITE_LOG, submit); + log.error("【策略模块-敏感词校验】发送写日志消息到{}队列,消息:{}", RabbitMQConstant.SMS_WRITE_LOG, submit); + + //发送消息到推送状态报告队列 + Integer isCallback = cacheClient.hgetInteger(CacheConstant.CLIENT_BUSINESS + submit.getApikey(), CacheConstant.IS_CALLBACK); + if (isCallback != null && isCallback == 1) { + String callbackUrl = cacheClient.hgetString(CacheConstant.CLIENT_BUSINESS + submit.getApikey(), CacheConstant.CALLBACK_URL); + if (StringUtils.isNotBlank(callbackUrl)) { + StandardReport report = new StandardReport(); + BeanUtils.copyProperties(submit, report); + report.setIsCallback(isCallback); + report.setCallbackUrl(callbackUrl); + rabbitTemplate.convertAndSend(RabbitMQConstant.SMS_PUSH_REPORT, report); + log.info("【策略模块-敏感词校验】发送短信状态报告消息到{}队列,消息:{}", RabbitMQConstant.SMS_PUSH_REPORT, report); + } + } + throw new StrategyException(ExceptionEnums.HAVE_DIRTY_WORD); } log.info("【策略模块-敏感词校验】敏感词校验通过"); } diff --git a/beacon-strategy/src/main/java/com/mashibing/strategy/utils/DirtyWordTree.java b/beacon-strategy/src/main/java/com/mashibing/strategy/utils/DirtyWordTree.java index 6918760..4f089dc 100644 --- a/beacon-strategy/src/main/java/com/mashibing/strategy/utils/DirtyWordTree.java +++ b/beacon-strategy/src/main/java/com/mashibing/strategy/utils/DirtyWordTree.java @@ -21,7 +21,7 @@ public class DirtyWordTree { static { //通过SpringUtil,获取Spring中的CacheClient对象 - CacheClient cacheClient = (CacheClient) StringUtil.getBeanByClass(CacheClient.class); + CacheClient cacheClient = (CacheClient) SpringUtil.getBeanByClass(CacheClient.class); //调用缓存模块接口获取全部敏感词 Set dirtyWords = cacheClient.smember(CacheConstant.DIRTY_WORD); //构建敏感词树 diff --git a/beacon-strategy/src/main/java/com/mashibing/strategy/utils/StringUtil.java b/beacon-strategy/src/main/java/com/mashibing/strategy/utils/SpringUtil.java similarity index 87% rename from beacon-strategy/src/main/java/com/mashibing/strategy/utils/StringUtil.java rename to beacon-strategy/src/main/java/com/mashibing/strategy/utils/SpringUtil.java index 32e3e78..dfbf05a 100644 --- a/beacon-strategy/src/main/java/com/mashibing/strategy/utils/StringUtil.java +++ b/beacon-strategy/src/main/java/com/mashibing/strategy/utils/SpringUtil.java @@ -13,13 +13,13 @@ import org.springframework.stereotype.Component; */ @Component -public class StringUtil implements ApplicationContextAware { +public class SpringUtil implements ApplicationContextAware { private static ApplicationContext applicationContext; @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { - StringUtil.applicationContext = applicationContext; + SpringUtil.applicationContext = applicationContext; } public static Object getBeanByName(String beanName) { diff --git a/beacon-test/src/main/java/com/mashibing/test/mapper/MobileAreaMapper.java b/beacon-test/src/main/java/com/mashibing/test/mapper/MobileAreaMapper.java index bbd88d1..d249385 100644 --- a/beacon-test/src/main/java/com/mashibing/test/mapper/MobileAreaMapper.java +++ b/beacon-test/src/main/java/com/mashibing/test/mapper/MobileAreaMapper.java @@ -17,4 +17,7 @@ public interface MobileAreaMapper { @Select("select mobile_number,mobile_area,mobile_type from mobile_area ") List findAllMobileArea(); + + @Select("select mobile_number,mobile_area,mobile_type from mobile_area where mobile_number = #{mobileNumber}") + MobileArea findOneMobileAreaByMobileNumber(@Param("mobileNumber") String mobileNumber); } diff --git a/beacon-test/src/test/java/com/mashibing/test/mapper/MobileAreaMapperTest.java b/beacon-test/src/test/java/com/mashibing/test/mapper/MobileAreaMapperTest.java index d3e1a54..8a89618 100644 --- a/beacon-test/src/test/java/com/mashibing/test/mapper/MobileAreaMapperTest.java +++ b/beacon-test/src/test/java/com/mashibing/test/mapper/MobileAreaMapperTest.java @@ -3,6 +3,7 @@ package com.mashibing.test.mapper; import com.mashibing.test.entity.MobileArea; import com.mashibing.test.feignClient.CacheClient; import lombok.extern.slf4j.Slf4j; +import org.apache.ibatis.annotations.Param; import org.junit.jupiter.api.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; @@ -42,4 +43,14 @@ class MobileAreaMapperTest { endTime = System.currentTimeMillis(); log.info("【写入Redis耗时】: {} ms", endTime - startTime); } + + @Test + void findOneMobileAreaByMobileNumber() { + MobileArea mobileArea = mapper.findOneMobileAreaByMobileNumber("1322409"); + + cacheClient.set("phase:" + mobileArea.getMobileNumber(), + mobileArea.getMobileArea() + "," + mobileArea.getMobileType()); + + } + } \ No newline at end of file