提交 9dd9ce90 authored 作者: 刘海泉's avatar 刘海泉

Merge remote-tracking branch 'origin/v30.2_break_contract_20241021' into test_jdk17

# Conflicts: # clx-performance-web/src/main/java/com/clx/performance/config/RabbitBeanConfig.java # clx-performance-web/src/main/java/com/clx/performance/constant/RabbitKeyConstants.java Former-commit-id: 88e77d0e
...@@ -405,6 +405,33 @@ public class RabbitBeanConfig { ...@@ -405,6 +405,33 @@ public class RabbitBeanConfig {
.with(RabbitKeyConstants.SYNC_PENDING_FREIGHT_FOR_ORDER_CHILD_ROUTING_KEY); .with(RabbitKeyConstants.SYNC_PENDING_FREIGHT_FOR_ORDER_CHILD_ROUTING_KEY);
} }
/**
*发送短信通知
*/
@Bean
public Queue sendSmsNoticeQueue() {
return new Queue(RabbitKeyConstants.NOTICE_SEND_SMS_QUEUE,
true, false, false);
}
/**
* 发送短信通知
**/
@Bean
public DirectExchange sendSmsNoticeExchange() {
return new DirectExchange(RabbitKeyConstants.NOTICE_SEND_SMS_QUEUE_EXCHANGE);
}
/**
*发送短信通知
*/
@Bean
public Binding sendSmsNoticeBind() {
return BindingBuilder.bind(sendSmsNoticeQueue()).to(sendSmsNoticeExchange())
.with(RabbitKeyConstants.NOTICE_SEND_SMS_QUEUE_ROUTING_KEY);
}
} }
...@@ -200,4 +200,16 @@ public class RabbitKeyConstants { ...@@ -200,4 +200,16 @@ public class RabbitKeyConstants {
//保存货单调价记录queue
public static final String NOTICE_SEND_SMS_QUEUE = "clx_performance.notice.send.sms.queue";
//保存货单调价记录exchange
public static final String NOTICE_SEND_SMS_QUEUE_EXCHANGE = "clx_performance.notice.send.sms.exchange";
//保存货单调价记录routing_key
public static final String NOTICE_SEND_SMS_QUEUE_ROUTING_KEY = "clx_performance.notice.send.sms.routing.key";
} }
package com.clx.performance.listener;
import cn.hutool.core.lang.TypeReference;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSON;
import com.clx.open.sdk.callback.message.OrderInfoMessage;
import com.clx.order.enums.OrderEnum;
import com.clx.order.feign.OrderFeign;
import com.clx.order.vo.feign.FeignOrderVO;
import com.clx.performance.common.MqWrapper;
import com.clx.performance.config.ConfiguredOpenProperties;
import com.clx.performance.constant.RabbitKeyConstants;
import com.clx.performance.dao.vehiclewarn.VehicleWarnUserDao;
import com.clx.performance.model.vehiclewarn.VehicleWarnUser;
import com.clx.performance.param.mq.SendSmsNoticeParam;
import com.msl.common.open.ConfiguredOpenClient;
import com.msl.common.result.Result;
import com.msl.message.sdk.action.MessageAction;
import com.msl.message.sms.api.sms.SmsMessage;
import com.msl.message.sms.api.sms.content.SmsMessageContentImpl;
import com.msl.message.sms.api.sms.recipient.SmsMessageRecipientImpl;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.exception.ExceptionUtils;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;
import static com.clx.performance.enums.OrderEnum.Status.*;
import static com.msl.message.sms.api.enums.RecipientTypeEnum.USER_MOBILE;
@Slf4j
@Component
@AllArgsConstructor
public class SendSmsListener {
private final ConfiguredOpenClient configuredOpenClient;
private final ConfiguredOpenProperties properties;
@RabbitListener(queues = RabbitKeyConstants.NOTICE_SEND_SMS_QUEUE)
public void onMessage(Message message) {
try{
log.info("监听到通用发送通知短信,消息内容{}", new String(message.getBody()));
SendSmsNoticeParam messageParam = JSONUtil.toBean(new String(message.getBody()),
new TypeReference<MqWrapper<SendSmsNoticeParam>>() {
},false).getData();
log.info("发送短信的手机号列表:{}",messageParam.getMobileList());
if(CollectionUtils.isEmpty(messageParam.getMobileList())){
return;
}
SmsMessage smsMessage = new SmsMessage();
//设置消息内容
SmsMessageContentImpl smsMessageContent= new SmsMessageContentImpl();
//模版code
smsMessageContent.setCode(messageParam.getCode());
smsMessageContent.setParams(messageParam.getParams());
//设置消息接收人
SmsMessageRecipientImpl smsMessageRecipient = new SmsMessageRecipientImpl();
smsMessageRecipient.setUserType(USER_MOBILE.getCode());
smsMessageRecipient.setTargets(String.join(",", messageParam.getMobileList()));
smsMessage.setContent(smsMessageContent);
smsMessage.setRecipient(smsMessageRecipient);
//从消息中心注册获取的通道key
smsMessage.setAccessKey(properties.getAccessKey());
//向消息中心发送消息
log.info("开始发送消息中心短信,请求参数:{}", JSON.toJSONString(smsMessage));
Result<Object> result = configuredOpenClient.doAction(new MessageAction(smsMessage));
if(result.succeed()){
log.info("结束发送消息中心短信成功,响应结果:{}", JSON.toJSONString(result));
}else{
log.error("结束发送消息中心短信失败,响应结果:{}", JSON.toJSONString(result));
}
}catch (Exception e){
log.info("监听发送通知短信发生异常,异常原因:{}", ExceptionUtils.getStackTrace(e));
}
}
}
package com.clx.performance.service;
import com.clx.performance.enums.SmsTemplateEnum;
import java.util.List;
public interface SendSmsService {
void sendChildWarnConfigSmsNotice(Integer warnTypeCode, SmsTemplateEnum.Type smsTemplateType,
List<String> paramList);
}
...@@ -17,6 +17,8 @@ import com.clx.performance.dao.OrderChildExceptionReportDealLogDao; ...@@ -17,6 +17,8 @@ import com.clx.performance.dao.OrderChildExceptionReportDealLogDao;
import com.clx.performance.dao.OrderChildExceptionReportOperationLogDao; import com.clx.performance.dao.OrderChildExceptionReportOperationLogDao;
import com.clx.performance.dao.breakcontract.BreakContractDriverRecordDao; import com.clx.performance.dao.breakcontract.BreakContractDriverRecordDao;
import com.clx.performance.enums.*; import com.clx.performance.enums.*;
import com.clx.performance.enums.linewarn.LineWarnConfigEnum;
import com.clx.performance.enums.vehiclewarn.VehicleWarnConfigEnum;
import com.clx.performance.model.OrderChild; import com.clx.performance.model.OrderChild;
import com.clx.performance.model.OrderChildExceptionReport; import com.clx.performance.model.OrderChildExceptionReport;
import com.clx.performance.model.OrderChildExceptionReportDealLog; import com.clx.performance.model.OrderChildExceptionReportDealLog;
...@@ -26,6 +28,7 @@ import com.clx.performance.param.pc.DealExceptionReportParam; ...@@ -26,6 +28,7 @@ import com.clx.performance.param.pc.DealExceptionReportParam;
import com.clx.performance.param.pc.PageExceptionReportParam; import com.clx.performance.param.pc.PageExceptionReportParam;
import com.clx.performance.param.pc.TransferDriverBreakContractParam; import com.clx.performance.param.pc.TransferDriverBreakContractParam;
import com.clx.performance.service.OrderChildExceptionReportService; import com.clx.performance.service.OrderChildExceptionReportService;
import com.clx.performance.service.SendSmsService;
import com.clx.performance.service.breakcontract.BreakContractDriverRecordService; import com.clx.performance.service.breakcontract.BreakContractDriverRecordService;
import com.clx.performance.struct.OrderChildExceptionReportOperationLogStruct; import com.clx.performance.struct.OrderChildExceptionReportOperationLogStruct;
import com.clx.performance.struct.OrderChildExceptionReportStruct; import com.clx.performance.struct.OrderChildExceptionReportStruct;
...@@ -77,6 +80,7 @@ public class OrderChildExceptionReportServiceImpl implements OrderChildExceptio ...@@ -77,6 +80,7 @@ public class OrderChildExceptionReportServiceImpl implements OrderChildExceptio
private final OrderChildDao orderChildDao; private final OrderChildDao orderChildDao;
private final BreakContractDriverRecordDao breakContractDriverRecordDao; private final BreakContractDriverRecordDao breakContractDriverRecordDao;
private final OrderChildExceptionReportOperationLogStruct orderChildExceptionReportOperationLogStruct; private final OrderChildExceptionReportOperationLogStruct orderChildExceptionReportOperationLogStruct;
private final SendSmsService sendSmsService;
@Override @Override
public Result<String> smbSyncExceptionReportInfo(SmbSyncExceptionReportInfoAction action) { public Result<String> smbSyncExceptionReportInfo(SmbSyncExceptionReportInfoAction action) {
...@@ -175,6 +179,9 @@ public class OrderChildExceptionReportServiceImpl implements OrderChildExceptio ...@@ -175,6 +179,9 @@ public class OrderChildExceptionReportServiceImpl implements OrderChildExceptio
report.setStatus(CarrierExceptionReportEnum.Status.WAIT_DEAL.getCode()); report.setStatus(CarrierExceptionReportEnum.Status.WAIT_DEAL.getCode());
orderChildExceptionReportDao.saveEntity(report); orderChildExceptionReportDao.saveEntity(report);
saveOperationLog(report.getReportNo(),CarrierExceptionLogEnum.Type.CREATE,null,null,SyncPlatformEnum.Source.getNameByCode(source)); saveOperationLog(report.getReportNo(),CarrierExceptionLogEnum.Type.CREATE,null,null,SyncPlatformEnum.Source.getNameByCode(source));
//发送预警短信
sendSmsService.sendChildWarnConfigSmsNotice(VehicleWarnConfigEnum.WarnType.EXCEPTION_REPORT_DEAL.getCode(),SmsTemplateEnum.Type.EXCEPTION_REPORT_DEAL,List.of(report.getChildNo()));
return report.getReportNo(); return report.getReportNo();
} }
......
package com.clx.performance.service.impl;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSON;
import com.clx.performance.common.MqWrapper;
import com.clx.performance.dao.vehiclewarn.VehicleWarnUserDao;
import com.clx.performance.enums.SmsTemplateEnum;
import com.clx.performance.model.vehiclewarn.VehicleWarnUser;
import com.clx.performance.param.mq.SendSmsNoticeParam;
import com.clx.performance.service.SendSmsService;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageBuilder;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.stream.Collectors;
import static com.clx.performance.constant.RabbitKeyConstants.NOTICE_SEND_SMS_QUEUE_EXCHANGE;
import static com.clx.performance.constant.RabbitKeyConstants.NOTICE_SEND_SMS_QUEUE_ROUTING_KEY;
/**
* @ClassName SendSmsServiceImpl
* @Description
* @Author kavin
* @Date 2024/11/6 10:14
* @Version 1.0
*/
@Service
@Slf4j
@AllArgsConstructor
public class SendSmsServiceImpl implements SendSmsService {
private final RabbitTemplate rabbitTemplate;
private final VehicleWarnUserDao vehicleWarnUserDao;
@Override
public void sendChildWarnConfigSmsNotice(Integer warnTypeCode, SmsTemplateEnum.Type smsTemplateType,
List<String> paramList){
String params = replaceContent(smsTemplateType.getParam(), paramList);
List<String> targets = getTargets(warnTypeCode);
SendSmsNoticeParam param = new SendSmsNoticeParam();
param.setCode(smsTemplateType.getCode());
param.setMobileList(targets);
param.setParams(JSON.parseObject(params));
log.info("开始运单预警通知配置短信消息,短信模版code:{},请求参数:{}",smsTemplateType.getCode(),JSON.toJSONString(param));
Message body = MessageBuilder.withBody(JSON.toJSONString(new MqWrapper<>(param)).getBytes()).build();
rabbitTemplate.send(NOTICE_SEND_SMS_QUEUE_EXCHANGE,NOTICE_SEND_SMS_QUEUE_ROUTING_KEY, body);
log.info("结束运单预警通知配置短信消息,短信模版code:{},", smsTemplateType.getCode());
}
private List<String> getTargets(int code){
return vehicleWarnUserDao.listAllEnable()
.stream()
.filter(item -> JSONUtil.toList(item.getWarnTypeJson(), Integer.class).contains(code))
.map(VehicleWarnUser::getMobile).collect(Collectors.toList());
}
//构建站内信中的内容,替换变量
private static String replaceContent(String content,List<String> list){
int listSize = 0;
int times = countCharTimes(content, "%s");
if(CollectionUtils.isNotEmpty(list)){
listSize = list.size();
}
if(times != listSize){
log.error("替换的变量和字符串中需要的变量数量不一致");
return null;
}
return String.format(content, list.toArray());
}
//查找字符在字符串出现的次数
public static int countCharTimes(String mainStr,String subStr){
// 声明一个要返回的变量
int count = 0;
// 声明一个初始的下标,从初始位置开始查找
int index = 0;
// 获取主数据的长度
int mainStrLength = mainStr.length();
// 获取要查找的数据长度
int subStrLength = subStr.length();
// 如果要查找的数据长度大于主数据的长度则返回0
if (subStrLength > mainStrLength){
return 0;
}
// 循环使用indexOf查找出现的下标,如果出现一次则count++
while ((index = mainStr.indexOf(subStr, index)) != -1) {
count++;
index += subStrLength;
}
return count;
}
}
package com.clx.performance.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
@Getter
@AllArgsConstructor
public enum SmsTemplateEnum {
;
@Getter
@AllArgsConstructor
public enum Type {
EXCEPTION_REPORT_DEAL("childExceptionReportDeal", "异常上报处理","{childNo:%s}"),
;
private final String code;
private final String msg;
private final String param;
}
}
...@@ -22,7 +22,7 @@ public enum VehicleWarnConfigEnum { ...@@ -22,7 +22,7 @@ public enum VehicleWarnConfigEnum {
LOAD_TIMEOUT(7, "运单-装车超时"), LOAD_TIMEOUT(7, "运单-装车超时"),
UNLOAD_TIMEOUT(8, "运单-卸车超时"), UNLOAD_TIMEOUT(8, "运单-卸车超时"),
DELAY(9, "运单-运单延误"), DELAY(9, "运单-运单延误"),
EXCEPTION_REPORT_DEAL(10, "异常上报处理"),
; ;
private final Integer code; private final Integer code;
......
package com.clx.performance.param.mq;
import lombok.Getter;
import lombok.Setter;
import java.util.List;
import java.util.Map;
/**
* @ClassName SendSmsNoticeParam
* @Description
* @Author kavin
* @Date 2024/11/6 10:21
* @Version 1.0
*/
@Setter
@Getter
public class SendSmsNoticeParam {
//短信模版code码
private String code;
//发送手机号列表
private List<String> mobileList;
//短信模版参数
private Map<String, Object> params;
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论