fix:消息通知策略改造

This commit is contained in:
2026-01-07 19:31:04 +08:00
parent 5882200f4b
commit 7531a59b5a
10 changed files with 264 additions and 78 deletions

View File

@@ -0,0 +1,31 @@
package com.sdm.system.config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.Map;
/**
* 客户定制化消息推送配置
*/
@Data
@ConfigurationProperties(prefix = "message")
@Component
public class CustomMessageConfig {
/**
* 客户配置映射
*/
private Map<String, CustomerProperties> customers = new HashMap<>();
/**
* 当前活跃客户配置
*/
private String activeCustomer;
@Data
public static class CustomerProperties {
private boolean enabled = false;
}
}

View File

@@ -0,0 +1,51 @@
package com.sdm.system.service.handle;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson2.JSON;
import com.sdm.common.common.SdmResponse;
import com.sdm.common.entity.req.system.SendMsgReq;
import com.sdm.common.utils.HttpClientUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.util.concurrent.CompletableFuture;
@Service
@Slf4j
public class BasicMessageSender implements IMessageSender {
@Value("${cid.url}")
private String cidUrl;
@Value("${cid.msg.sendMessage}")
private String sendMessagePath;
@Autowired
private HttpClientUtil httpClientUtil;
@Override
public void send(SendMsgReq req) {
log.info("BasicMessageSender start....");
String url = cidUrl + sendMessagePath;
CompletableFuture.runAsync(() -> {
try {
log.info("开始异步调用Cid Msg服务...");
if (req.isSendCid()) {
log.info("[sendMessage] cid url:{}, param:{}", url, JSONUtil.toJsonStr(req));
String resultString = httpClientUtil.doPostJson(url, JSON.toJSONString(req));
SdmResponse response = JSON.parseObject(resultString, SdmResponse.class);
log.info("[sendMessage] cid url:{}, response:{}", url, JSONUtil.toJsonStr(response));
}
} catch (Exception e) {
log.error("异步调用Cid Msg服务异常: {}", e.getMessage(), e);
}
});
}
@Override
public boolean supports(String customerCode) {
return "basic".equals(customerCode);
}
}

View File

@@ -0,0 +1,15 @@
package com.sdm.system.service.handle;
import com.sdm.common.entity.req.system.SendMsgReq;
public interface IMessageSender {
/**
* 发送消息
*/
void send(SendMsgReq req);
/**
* 是否支持该客户
*/
boolean supports(String customerCode);
}

View File

@@ -0,0 +1,87 @@
package com.sdm.system.service.handle;
import com.sdm.common.common.SdmResponse;
import com.sdm.common.common.ThreadLocalContext;
import com.sdm.common.entity.req.system.SendMsgReq;
import com.sdm.common.entity.req.system.UserQueryReq;
import com.sdm.common.entity.resp.system.CIDUserResp;
import com.sdm.common.feign.impl.system.SysUserFeignClientImpl;
import com.sdm.outbridge.mode.FreeLinkMsg;
import com.sdm.outbridge.mode.FreelinkAndDingdingInformReq;
import com.sdm.outbridge.service.lyric.LyricIntegrateService;
import com.sdm.system.config.CustomMessageConfig;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.util.concurrent.CompletableFuture;
@Service
@Slf4j
public class LyricMessageSender implements IMessageSender {
@Value("${thirdparty.freelink.sendUserId}")
private String sendUserId;
@Value("${thirdparty.freelink.switchFlag}")
private String switchFlag;
@Autowired
private LyricIntegrateService lyricIntegrateService;
@Autowired
SysUserFeignClientImpl sysUserFeignClient;
@Autowired
private BasicMessageSender basicSender;
@Autowired
private CustomMessageConfig customerConfig;
@Override
public void send(SendMsgReq req) {
log.info("LyricMessageSender start....");
// 1、先调用基础发送
basicSender.send(req);
// 2、异步发送即时通消息通知
CompletableFuture.runAsync(() -> {
sendMsgToFreelink(req);
});
}
private void sendMsgToFreelink(SendMsgReq req) {
FreelinkAndDingdingInformReq param = new FreelinkAndDingdingInformReq();
// 根据userId查询工号
UserQueryReq userReq = new UserQueryReq();
userReq.setUserId(ThreadLocalContext.getUserId());
userReq.setTenantId(ThreadLocalContext.getTenantId());
SdmResponse<CIDUserResp> sdmResponse = sysUserFeignClient.queryUserDetail(userReq);
if (sdmResponse.getData() != null) {
param.setJobNo(sdmResponse.getData().getUsername());
}
FreeLinkMsg freeLinkMsg = new FreeLinkMsg();
if (switchFlag.equals("true")) {
userReq.setUserId(Long.valueOf(req.getUserId()));
SdmResponse<CIDUserResp> response = sysUserFeignClient.queryUserDetail(userReq);
if (response.getData() != null) {
freeLinkMsg.setId(response.getData().getUsername());
}
} else {
freeLinkMsg.setId(sendUserId);
}
freeLinkMsg.setType("text");
freeLinkMsg.setMsg(req.getContent());
freeLinkMsg.setUser("66666");
freeLinkMsg.setPawd("lyric@123");
freeLinkMsg.setFreelinkAppId("d7eb3ef7c8e8c93e7c6e978fee848646");
param.setFreeLinkMsg(freeLinkMsg);
lyricIntegrateService.pushFreeLinkMsg(param);
}
@Override
public boolean supports(String customerCode) {
return "lyric".equals(customerCode);
}
}

View File

@@ -0,0 +1,42 @@
package com.sdm.system.service.handle;
import com.sdm.system.config.CustomMessageConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class MessageSenderSelector {
@Autowired
private List<IMessageSender> senders;
@Autowired
private BasicMessageSender basicSender;
@Autowired
private CustomMessageConfig messageConfig;
/**
* 根据客户选择发送策略
*/
public IMessageSender selectSender() {
String customerCode = messageConfig.getActiveCustomer();
if (customerCode == null) {
return basicSender;
}
CustomMessageConfig.CustomerProperties config = messageConfig.getCustomers().get(customerCode);
// 如果配置不存在或未启用,直接返回基础策略
if (config == null || !config.isEnabled()) {
return basicSender;
}
for (IMessageSender sender : senders) {
if (sender.supports(customerCode)) {
return sender;
}
}
return basicSender;
}
}

View File

@@ -1,101 +1,29 @@
package com.sdm.system.service.impl;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson2.JSON;
import com.sdm.common.common.SdmResponse;
import com.sdm.common.common.ThreadLocalContext;
import com.sdm.common.entity.req.system.SendMsgReq;
import com.sdm.common.entity.req.system.UserQueryReq;
import com.sdm.common.entity.resp.system.CIDUserResp;
import com.sdm.common.feign.impl.system.SysUserFeignClientImpl;
import com.sdm.common.utils.HttpClientUtil;
import com.sdm.outbridge.mode.FreeLinkMsg;
import com.sdm.outbridge.mode.FreelinkAndDingdingInformReq;
import com.sdm.outbridge.service.lyric.LyricIntegrateService;
import com.sdm.system.service.ISimulationMessageService;
import com.sdm.system.service.handle.IMessageSender;
import com.sdm.system.service.handle.MessageSenderSelector;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.util.concurrent.CompletableFuture;
@Service
@Slf4j
public class SimulationMessageServiceImpl implements ISimulationMessageService {
@Value("${cid.url}")
private String cidUrl;
@Value("${cid.msg.sendMessage}")
private String sendMessagePath;
@Value("${thirdparty.freelink.sendUserId}")
private String sendUserId;
@Value("${thirdparty.freelink.switchFlag}")
private String switchFlag;
@Autowired
private HttpClientUtil httpClientUtil;
@Autowired
private LyricIntegrateService lyricIntegrateService;
@Autowired
SysUserFeignClientImpl sysUserFeignClient;
private MessageSenderSelector senderSelector;
@Override
public SdmResponse sendMessage(SendMsgReq req) {
String url = cidUrl + sendMessagePath;
CompletableFuture.runAsync(() -> {
try {
log.info("开始异步调用Cid Msg服务...");
if (req.isSendCid()) {
log.info("[sendMessage] cid url:{}, param:{}", url, JSONUtil.toJsonStr(req));
String resultString = httpClientUtil.doPostJson(url, JSON.toJSONString(req));
SdmResponse response = JSON.parseObject(resultString, SdmResponse.class);
log.info("[sendMessage] cid url:{}, response:{}", url, JSONUtil.toJsonStr(response));
}
} catch (Exception e) {
log.error("异步调用Cid Msg服务异常: {}", e.getMessage(), e);
}
});
// 异步发送即时通消息通知
CompletableFuture.runAsync(() -> {
sendMsgToFreelink(req);
});
IMessageSender messageSender = senderSelector.selectSender();
messageSender.send(req);
return SdmResponse.success();
}
private void sendMsgToFreelink(SendMsgReq req) {
FreelinkAndDingdingInformReq param = new FreelinkAndDingdingInformReq();
// 根据userId查询工号
UserQueryReq userReq = new UserQueryReq();
userReq.setUserId(ThreadLocalContext.getUserId());
userReq.setTenantId(ThreadLocalContext.getTenantId());
SdmResponse<CIDUserResp> sdmResponse = sysUserFeignClient.queryUserDetail(userReq);
if (sdmResponse.getData() != null) {
param.setJobNo(sdmResponse.getData().getUsername());
}
FreeLinkMsg freeLinkMsg = new FreeLinkMsg();
if (switchFlag.equals("true")) {
userReq.setUserId(Long.valueOf(req.getUserId()));
SdmResponse<CIDUserResp> response = sysUserFeignClient.queryUserDetail(userReq);
if (response.getData() != null) {
freeLinkMsg.setId(response.getData().getUsername());
}
} else {
freeLinkMsg.setId(sendUserId);
}
freeLinkMsg.setType("text");
freeLinkMsg.setMsg(req.getContent());
freeLinkMsg.setUser("66666");
freeLinkMsg.setPawd("lyric@123");
freeLinkMsg.setFreelinkAppId("d7eb3ef7c8e8c93e7c6e978fee848646");
param.setFreeLinkMsg(freeLinkMsg);
lyricIntegrateService.pushFreeLinkMsg(param);
}
}

View File

@@ -179,6 +179,14 @@ thirdparty:
sendUserId: Q12345
switchFlag: false
message:
active-customer: basic
customers:
basic:
enabled: true
lyric:
enabled: false
security:
whitelist:
paths:

View File

@@ -179,6 +179,14 @@ thirdparty:
sendUserId: Q12345
switchFlag: false
message:
active-customer: basic
customers:
basic:
enabled: true
lyric:
enabled: false
security:
whitelist:
paths:

View File

@@ -179,6 +179,14 @@ thirdparty:
sendUserId: Q12345
switchFlag: false
message:
active-customer: lyric
customers:
basic:
enabled: false
lyric:
enabled: true
security:
whitelist:
paths:

View File

@@ -179,6 +179,14 @@ thirdparty:
sendUserId: Q12345
switchFlag: false
message:
active-customer: basic
customers:
basic:
enabled: true
lyric:
enabled: false
security:
whitelist:
paths: