package jnpf.message.util;
|
|
import cn.hutool.core.util.ObjectUtil;
|
import cn.hutool.http.HttpRequest;
|
import cn.hutool.http.Method;
|
import com.alibaba.fastjson.JSONObject;
|
import jnpf.base.SysConfigApi;
|
import jnpf.base.UserInfo;
|
import jnpf.base.entity.SysConfigEntity;
|
import jnpf.config.ConfigValueUtil;
|
import jnpf.constant.MsgCode;
|
import jnpf.message.entity.*;
|
import jnpf.message.enums.MessageTypeEnum;
|
import jnpf.message.mapper.*;
|
import jnpf.message.model.SentMessageForm;
|
import jnpf.message.model.TriggerModel;
|
import jnpf.message.model.WxgzhMessageModel;
|
import jnpf.permission.UserApi;
|
import jnpf.permission.entity.UserEntity;
|
import jnpf.util.*;
|
import jnpf.util.wxutil.mp.WXGZHWebChatUtil;
|
import lombok.extern.slf4j.Slf4j;
|
import org.apache.commons.text.StringSubstitutor;
|
import org.springframework.beans.BeanUtils;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Component;
|
|
import java.nio.charset.StandardCharsets;
|
import java.util.*;
|
import java.util.concurrent.Callable;
|
import java.util.concurrent.Future;
|
import java.util.stream.Collectors;
|
|
@Component
|
@Slf4j
|
public class SendFlowMsgUtil {
|
@Autowired
|
private RedisUtil redisUtil;
|
@Autowired
|
private SentMessageUtil sentMessageUtil;
|
@Autowired
|
private ConfigValueUtil configValueUtil;
|
@Autowired
|
private UserApi userApi;
|
@Autowired
|
private SysConfigApi sysconfigService;
|
|
@Autowired
|
private MessageMapper messageMapper;
|
@Autowired
|
private MessagereceiveMapper messagereceiveMapper;
|
@Autowired
|
private MessageMonitorMapper messageMonitorMapper;
|
@Autowired
|
private SendMessageConfigMapper sendMessageConfigMapper;
|
@Autowired
|
private SendConfigTemplateMapper sendConfigTemplateMapper;
|
@Autowired
|
private MessageTemplateConfigMapper messageTemplateConfigMapper;
|
@Autowired
|
private ShortLInkMapper shortLInkMapper;
|
@Autowired
|
private AccountConfigMapper accountConfigMapper;
|
@Autowired
|
private SmsFieldMapper smsFieldMapper;
|
@Autowired
|
private AuthUtil authUtil;
|
@Autowired
|
private WechatUserMapper wechatUserMapper;
|
|
|
public void sendMessage(SentMessageForm sentMessageForm) {
|
List<String> toUserIdsList = sentMessageForm.getToUserIds();
|
// 模板id
|
String templateId = sentMessageForm.getTemplateId();
|
// 参数
|
Map<String, Object> parameterMap = sentMessageForm.getParameterMap();
|
UserInfo userInfo = sentMessageForm.getUserInfo();
|
boolean flag = true;
|
if (!(toUserIdsList != null && toUserIdsList.size() > 0)) {
|
log.error("接收人员为空");
|
flag = false;
|
}
|
if (StringUtil.isEmpty(templateId)) {
|
log.error("模板Id为空");
|
flag = false;
|
}
|
if (flag) {
|
// 获取发送配置详情
|
// MessageTemplateEntity entity = messageTemplateService.getInfo(templateId);
|
SendMessageConfigEntity entity = sendMessageConfigMapper.getInfoByEnCode(templateId);
|
if (entity != null) {
|
templateId = entity.getId();
|
} else {
|
entity = sendMessageConfigMapper.getInfo(templateId);
|
}
|
if (entity != null) {
|
List<SendConfigTemplateEntity> list = sendConfigTemplateMapper.getDetailListByParentId(templateId);
|
if (list != null && list.size() > 0) {
|
for (SendConfigTemplateEntity entity1 : list) {
|
if (parameterMap.get(entity1.getId() + "@Title") == null) {
|
parameterMap.put(entity1.getId() + "@Title", sentMessageForm.getTitle());
|
}
|
if (parameterMap.get(entity1.getId() + "@CreatorUserName") == null || StringUtil.isEmpty(String.valueOf(parameterMap.get(entity1.getId() + "@CreatorUserName")))) {
|
parameterMap.put(entity1.getId() + "@CreatorUserName", sentMessageForm.getUserInfo().getUserName());
|
}
|
if (parameterMap.get(entity1.getId() + "@SendTime") == null || StringUtil.isEmpty(String.valueOf(parameterMap.get(entity1.getId() + "@SendTime")))) {
|
parameterMap.put(entity1.getId() + "@SendTime", DateUtil.getNow().substring(11));
|
}
|
if (parameterMap.get(entity1.getId() + "@FlowLink") == null) {
|
parameterMap.put(entity1.getId() + "@FlowLink", "");
|
}
|
if ("1".equals(String.valueOf(entity1.getEnabledMark()))) {
|
String sendType = entity1.getMessageType();
|
MessageTypeEnum typeEnum = MessageTypeEnum.getByCode(sendType);
|
Map<String, String> contentMsg = sentMessageForm.getContentMsg();
|
switch (typeEnum) {
|
case SysMessage:
|
// 站内消息、
|
for (String toUserId : toUserIdsList) {
|
List<String> toUser = new ArrayList<>();
|
String content = sentMessageForm.getContent();
|
MessageTemplateConfigEntity templateConfigEntity = messageTemplateConfigMapper.getInfo(entity1.getTemplateId());
|
String title = sentMessageForm.getTitle();
|
String appLink = "";
|
if (templateConfigEntity != null) {
|
title = templateConfigEntity.getTitle();
|
String msg = contentMsg.get(toUserId) != null ? contentMsg.get(toUserId) : "{}";
|
byte[] bytes = msg.getBytes(StandardCharsets.UTF_8);
|
String encode = Base64.getEncoder().encodeToString(bytes);
|
//流程审批页面链接地址
|
//流程审批页面链接地址
|
String pcLink = "/workFlowDetail?config=" + encode;
|
appLink = "/pages/workFlow/flowBefore/index?config=" + encode;
|
//转换为短链
|
String shortLink = shortLInkMapper.shortLink(pcLink + toUserId + templateConfigEntity.getMessageType());
|
shortLink = shortLInkMapper.shortLink(pcLink + toUserId + templateConfigEntity.getMessageType());
|
String link = configValueUtil.getApiDomain() + "/api/message/ShortLink/" + shortLink;
|
if (StringUtil.isNotBlank(userInfo.getTenantId())) {
|
link = link + "/" + userInfo.getTenantId();
|
}
|
if (title.contains("{@FlowLink}")) {
|
title = title.replace("{@FlowLink}", link + " ");
|
//链接数据保存
|
sentMessageUtil.saveShortLink(pcLink, appLink, shortLink, userInfo, toUserId, msg);
|
}
|
Map<String, Object> msgMap = new HashMap<>();
|
msgMap = sentMessageUtil.getParamMap(entity1.getId(), parameterMap);
|
if (StringUtil.isNotEmpty(title)) {
|
StringSubstitutor strSubstitutor = new StringSubstitutor(msgMap, "{", "}");
|
title = strSubstitutor.replace(title);
|
}
|
}
|
toUser.add(toUserId);
|
messagereceiveMapper.sentMessage(toUser, title, content, contentMsg, userInfo);
|
//消息监控写入
|
MessageMonitorEntity monitorEntity = new MessageMonitorEntity();
|
monitorEntity.setId(RandomUtil.uuId());
|
monitorEntity.setReceiveUser(JsonUtil.getObjectToString(toUser));
|
monitorEntity.setSendTime(DateUtil.getNowDate());
|
monitorEntity.setCreatorTime(DateUtil.getNowDate());
|
monitorEntity.setCreatorUserId(userInfo.getUserId());
|
sentMessageUtil.createMessageMonitor(monitorEntity, templateConfigEntity, null, null, userInfo, toUser, title);
|
messageMonitorMapper.insert(monitorEntity);
|
}
|
String url = configValueUtil.getApiDomain() + "/api/workflow/trigger/MsgExecute";
|
Map<String, Object> map = new HashMap<>();
|
map.put("id", entity1.getTemplateId());
|
map.put("userInfo", userInfo);
|
HttpRequest request = HttpRequest.of(url).method(Method.POST).body(JsonUtil.getObjectToString(map));
|
request.header(Constants.AUTHORIZATION, userInfo.getToken());
|
request.execute().body();
|
break;
|
case SmsMessage:
|
// 发送短信
|
sentMessageUtil.sendSms(toUserIdsList, userInfo, entity1, parameterMap, contentMsg);
|
break;
|
case MailMessage:
|
// 邮件
|
sentMessageUtil.SendMail(toUserIdsList, userInfo, sendType, entity1, parameterMap, contentMsg);
|
break;
|
case QyMessage:
|
// 企业微信
|
JSONObject jsonObject = sentMessageUtil.SendQyWebChat(toUserIdsList, userInfo, sendType, entity1, parameterMap, contentMsg);
|
if (!(Boolean) jsonObject.get("code")) {
|
log.error("发送企业微信消息失败,错误:" + jsonObject.get("error"));
|
}
|
break;
|
case DingMessage:
|
// 钉钉
|
JSONObject jsonObject1 = sentMessageUtil.SendDingTalk(toUserIdsList, userInfo, sendType, entity1, parameterMap, contentMsg);
|
if (!(Boolean) jsonObject1.get("code")) {
|
log.error("发送企业微信消息失败,错误:" + jsonObject1.get("error"));
|
}
|
break;
|
case WebHookMessage:
|
// webhook
|
this.SendWebHook(sendType, userInfo, entity1, parameterMap, new HashMap<>());
|
break;
|
case WechatMessage:
|
// 微信公众号
|
this.SendWXGzhChat(toUserIdsList, userInfo, sendType, entity1, contentMsg, parameterMap);
|
break;
|
default:
|
break;
|
}
|
}
|
}
|
}
|
}
|
}
|
}
|
|
public List<String> sendScheduleMessage(SentMessageForm sentMessageForm) {
|
List<String> errList = new ArrayList<>();
|
UserInfo userInfo = sentMessageForm.getUserInfo();
|
String templateId = sentMessageForm.getTemplateId();
|
String title = sentMessageForm.getTitle();
|
List<String> toUserIds = sentMessageForm.getToUserIds();
|
//获取发送配置详情
|
SendMessageConfigEntity configEntity = sendMessageConfigMapper.getInfoByEnCode(templateId);
|
if (configEntity != null) {
|
templateId = configEntity.getId();
|
} else {
|
configEntity = sendMessageConfigMapper.getInfo(templateId);
|
}
|
List<SendConfigTemplateEntity> list = sendConfigTemplateMapper.getDetailListByParentId(templateId);
|
if (configEntity != null) {
|
for (SendConfigTemplateEntity sendConfigTemplateEntity : list) {
|
Map<String, Object> objectMap = new HashMap<>(sentMessageForm.getParameterMap());
|
Map<String, Object> parameterMap = new HashMap<>();
|
for (String key : objectMap.keySet()) {
|
if (key.contains(sendConfigTemplateEntity.getId())) {
|
parameterMap.put(key.substring(sendConfigTemplateEntity.getId().length()), objectMap.get(key));
|
}
|
}
|
parameterMap.putAll(objectMap);
|
Map<String, String> contentMsg = new HashMap<>();
|
for (String key : parameterMap.keySet()) {
|
contentMsg.put(key, String.valueOf(parameterMap.get(key)));
|
}
|
String sendType = sendConfigTemplateEntity.getMessageType();
|
switch (sendType) {
|
case "1":
|
MessageTemplateConfigEntity templateConfigEntity = messageTemplateConfigMapper.getInfo(sendConfigTemplateEntity.getTemplateId());
|
String messageTitle = StringUtil.isNotEmpty(templateConfigEntity.getTitle()) ? templateConfigEntity.getTitle() : "";
|
String content = StringUtil.isNotEmpty(templateConfigEntity.getContent()) ? templateConfigEntity.getContent() : "";
|
StringSubstitutor strSubstitutor = new StringSubstitutor(parameterMap, "{", "}");
|
messageTitle = strSubstitutor.replace(messageTitle);
|
content = strSubstitutor.replace(content);
|
sentMessageForm.setTitle(messageTitle);
|
sentMessageForm.setContent(content);
|
// 站内消息
|
message(sentMessageForm);
|
// 通知触发
|
try {
|
String url = configValueUtil.getApiDomain() + "/api/workflow/trigger/MsgExecute";
|
TriggerModel model = new TriggerModel();
|
model.setUserInfo(userInfo);
|
model.setId(templateConfigEntity.getId());
|
HttpRequest request = HttpRequest.of(url).method(Method.POST).body(JsonUtil.getObjectToString(model));
|
request.header(Constants.AUTHORIZATION, userInfo.getToken());
|
request.execute().body();
|
} catch (Exception e) {
|
log.error("消息触发流程报错信息:" + e.getMessage());
|
}
|
break;
|
case "2":
|
// 邮件
|
List<String> mailErrs = sentMessageUtil.SendMail(toUserIds, userInfo, sendType, sendConfigTemplateEntity, new HashMap<>(), contentMsg);
|
errList.addAll(mailErrs.stream().distinct().collect(Collectors.toList()));
|
break;
|
case "3":
|
// 发送短信
|
List<String> smsErrs = sentMessageUtil.sendSms(toUserIds, userInfo, sendConfigTemplateEntity, parameterMap, new HashMap<>());
|
errList.addAll(smsErrs.stream().distinct().collect(Collectors.toList()));
|
break;
|
case "4":
|
// 钉钉
|
JSONObject jsonObject1 = sentMessageUtil.SendDingTalk(toUserIds, userInfo, sendType, sendConfigTemplateEntity, new HashMap<>(), contentMsg);
|
if (!(Boolean) jsonObject1.get("code")) {
|
log.error("发送企业微信消息失败,错误:" + jsonObject1.get("error"));
|
errList.add("发送钉钉消息失败,错误:" + jsonObject1.get("error"));
|
}
|
break;
|
case "5":
|
// 企业微信
|
JSONObject jsonObject = sentMessageUtil.SendQyWebChat(toUserIds, userInfo, sendType, sendConfigTemplateEntity, new HashMap<>(), contentMsg);
|
if (!(Boolean) jsonObject.get("code")) {
|
log.error("发送企业微信消息失败,错误:" + jsonObject.get("error"));
|
errList.add("发送企业微信消息失败,错误:" + jsonObject.get("error"));
|
}
|
break;
|
case "6":
|
// webhook
|
this.SendWebHook(sendType, userInfo, sendConfigTemplateEntity, new HashMap<>(), contentMsg);
|
break;
|
case "7":
|
// 微信公众号
|
JSONObject jsonObject2 = this.SendWXGzhChat(toUserIds, userInfo, sendType, sendConfigTemplateEntity, new HashMap<>(), parameterMap);
|
if (!(Boolean) jsonObject2.get("code")) {
|
errList.add("发送微信公众号消息失败,错误:" + jsonObject2.get("error"));
|
}
|
break;
|
default:
|
break;
|
}
|
}
|
}
|
return errList;
|
}
|
|
public void SendWebHook(String sendType, UserInfo userInfo, SendConfigTemplateEntity entity, Map<String, Object> parameterMap, Map<String, String> contentMsg) {
|
MessageTemplateConfigEntity msgTemEntity = messageTemplateConfigMapper.getInfo(entity.getTemplateId());
|
AccountConfigEntity accountEntity = accountConfigMapper.getInfo(entity.getAccountConfigId());
|
MessageMonitorEntity monitorEntity = new MessageMonitorEntity();
|
monitorEntity.setId(RandomUtil.uuId());
|
monitorEntity.setSendTime(DateUtil.getNowDate());
|
monitorEntity.setCreatorTime(DateUtil.getNowDate());
|
monitorEntity.setCreatorUserId(userInfo.getUserId());
|
String content = msgTemEntity.getContent();
|
//获取消息模板参数
|
parameterMap = SentMessageUtil.getParamMap(entity.getId(), parameterMap);
|
// 替换参数
|
if (StringUtil.isNotEmpty(content)) {
|
StringSubstitutor strSubstitutor = new StringSubstitutor(parameterMap, "{", "}");
|
content = strSubstitutor.replace(content);
|
}
|
String title = msgTemEntity.getTitle();
|
if (StringUtil.isNotEmpty(title)) {
|
StringSubstitutor strSubstitutor = new StringSubstitutor(parameterMap, "{", "}");
|
title = strSubstitutor.replace(title);
|
}
|
title = SentMessageUtil.systemParam(parameterMap, contentMsg, title, userInfo);
|
content = SentMessageUtil.systemParam(parameterMap, contentMsg, content, userInfo);
|
if (entity != null) {
|
if (accountEntity != null) {
|
//创建消息监控
|
monitorEntity = SentMessageUtil.createMessageMonitor(monitorEntity, msgTemEntity, accountEntity, content, userInfo, null, title);
|
messageMonitorMapper.create(monitorEntity);
|
switch (accountEntity.getWebhookType()) {
|
case 1:
|
//钉钉
|
if (Objects.equals(1, accountEntity.getApproveType())) {
|
WebHookUtil.sendDDMessage(accountEntity.getWebhookAddress(), content);
|
} else if (Objects.equals(2, accountEntity.getApproveType())) {
|
WebHookUtil.sendDingDing(accountEntity.getWebhookAddress(), accountEntity.getBearer(), content);
|
}
|
break;
|
case 2:
|
if (Objects.equals(1, accountEntity.getApproveType())) {
|
WebHookUtil.callWeChatBot(accountEntity.getWebhookAddress(), content);
|
}
|
break;
|
default:
|
break;
|
}
|
} else {
|
monitorEntity = SentMessageUtil.createMessageMonitor(monitorEntity, msgTemEntity, null, content, userInfo, null, title);
|
messageMonitorMapper.create(monitorEntity);
|
}
|
} else {
|
monitorEntity = SentMessageUtil.createMessageMonitor(monitorEntity, msgTemEntity, null, content, userInfo, null, title);
|
messageMonitorMapper.create(monitorEntity);
|
}
|
}
|
|
public JSONObject SendWXGzhChat(List<String> toUserIdsList, UserInfo userInfo, String sendType, SendConfigTemplateEntity entity, Map<String, String> contentMsg, Map<String, Object> parameterMap) {
|
//获取短信配置
|
AccountConfigEntity accountEntity = accountConfigMapper.getInfo(entity.getAccountConfigId());
|
// 获取消息模板详情
|
MessageTemplateConfigEntity msgTemEntity = messageTemplateConfigMapper.getInfo(entity.getTemplateId());
|
//消息监控
|
JSONObject retJson = new JSONObject();
|
boolean code = true;
|
StringBuilder error = new StringBuilder();
|
for (String userId : toUserIdsList) {
|
MessageMonitorEntity monitorEntity = new MessageMonitorEntity();
|
monitorEntity.setId(RandomUtil.uuId());
|
monitorEntity.setSendTime(DateUtil.getNowDate());
|
monitorEntity.setCreatorTime(DateUtil.getNowDate());
|
monitorEntity.setCreatorUserId(userInfo.getUserId());
|
error = new StringBuilder();
|
if (StringUtil.isEmpty(userId)) {
|
code = false;
|
error = error.append(";").append("接收人为空!");
|
messageMonitorMapper.create(monitorEntity);
|
continue;
|
}
|
UserEntity userEntity = userApi.getInfoById(userId);
|
if (ObjectUtil.isEmpty(userEntity)) {
|
code = false;
|
error = error.append(";").append("用户不存在!");
|
messageMonitorMapper.create(monitorEntity);
|
continue;
|
}
|
monitorEntity.setReceiveUser(userId);
|
|
if (ObjectUtil.isEmpty(msgTemEntity)) {
|
code = false;
|
error = error.append(";").append(userEntity.getRealName() + ":消息模板数据不存在!");
|
messageMonitorMapper.create(monitorEntity);
|
continue;
|
}
|
monitorEntity.setMessageTemplateId(msgTemEntity.getId());
|
String content = msgTemEntity.getContent();
|
String templateKId = msgTemEntity.getTemplateCode();
|
if (ObjectUtil.isEmpty(accountEntity)) {
|
code = false;
|
error = error.append(";").append(userEntity.getRealName() + ":公众号账号配置数据不存在!");
|
messageMonitorMapper.create(monitorEntity);
|
continue;
|
}
|
monitorEntity.setAccountId(accountEntity.getId());
|
//创建消息监控
|
monitorEntity = SentMessageUtil.createMessageMonitor(monitorEntity, msgTemEntity, accountEntity, content, userInfo, toUserIdsList, null);
|
// 获取系统配置
|
String appId = accountEntity.getAppId();
|
String appsecret = accountEntity.getAppSecret();
|
String wxxcxAppId = msgTemEntity.getXcxAppId();
|
String type = msgTemEntity.getWxSkip();
|
|
String title = "";
|
//获取消息模板参数
|
Map<String, Object> msgMap = SentMessageUtil.getParamMap(entity.getId(), parameterMap);
|
// if(parameterMap.containsKey("@flowLink")){
|
// parameterMap.put("@flowLink",link);
|
// }
|
//微信公众号参数
|
Map<String, Object> smsMap = new HashMap<>();
|
if (entity != null) {
|
smsMap = smsFieldMapper.getParamMap(entity.getTemplateId(), msgMap);
|
}
|
if (smsMap.containsKey("title")) {
|
title = smsMap.get("title").toString();
|
smsMap.keySet().removeIf(k -> k.equals("title"));
|
}
|
monitorEntity.setTitle(title);
|
// 相关参数验证
|
if (StringUtil.isEmpty(templateKId)) {
|
code = false;
|
error = error.append(";").append(userEntity.getRealName() + ":微信公众号模板id未创建!");
|
messageMonitorMapper.create(monitorEntity);
|
continue;
|
}
|
if (StringUtil.isEmpty(appId)) {
|
code = false;
|
error = error.append(";").append(userEntity.getRealName() + ":公众号appid为空为空!");
|
messageMonitorMapper.create(monitorEntity);
|
continue;
|
}
|
if (StringUtil.isEmpty(appsecret)) {
|
code = false;
|
error = error.append(";").append(userEntity.getRealName() + ":公众号appsecret为空为空!");
|
messageMonitorMapper.create(monitorEntity);
|
continue;
|
}
|
// 获取微信公众号的token
|
String token = WXGZHWebChatUtil.getAccessToken(appId, appsecret);
|
if (StringUtil.isEmpty(token)) {
|
code = false;
|
error = error.append(";").append(userEntity.getRealName() + ":获取微信公众号token失败!");
|
messageMonitorMapper.create(monitorEntity);
|
continue;
|
}
|
// 微信公众号发送消息
|
String msg = contentMsg.get(userId) != null ? contentMsg.get(userId) : "{}";
|
byte[] bytes = msg.getBytes(StandardCharsets.UTF_8);
|
String encode = Base64.getEncoder().encodeToString(bytes);
|
//流程审批页面链接地址
|
String pcLink = "/workFlowDetail?config=" + encode;
|
String appLink = "/pages/workFlow/flowBefore/index?config=" + encode;
|
//转换为短链
|
String shortLink = shortLInkMapper.shortLink(pcLink + userId + msgTemEntity.getMessageType());
|
shortLink = getShortLink(pcLink, userId, shortLink, msgTemEntity.getMessageType());
|
if (!"1".equals(type)) {
|
//链接数据保存
|
this.saveShortLink(pcLink, appLink, shortLink, userInfo, userId, msg);
|
}
|
String link = configValueUtil.getApiDomain() + "/api/message/ShortLink/" + shortLink;
|
if (StringUtil.isNotBlank(userInfo.getTenantId())) {
|
link = link + "/" + userInfo.getTenantId();
|
}
|
if (ObjectUtil.isNotEmpty(smsMap)) {
|
for (String key : smsMap.keySet()) {
|
if (smsMap.get(key).equals("@FlowLink")) {
|
smsMap.put(key, link);
|
}
|
}
|
} else {
|
code = false;
|
error = error.append(";").append(userEntity.getRealName() + ":公众号模板参数为空!");
|
messageMonitorMapper.create(monitorEntity);
|
continue;
|
}
|
WechatUserEntity wechatUserEntity = wechatUserMapper.getInfoByGzhId(userId, accountEntity.getAppKey());
|
if (wechatUserEntity != null) {
|
if (StringUtil.isNotBlank(wechatUserEntity.getOpenId())) {
|
String openid = wechatUserEntity.getOpenId();
|
String apptoken = authUtil.loginTempUser(userId, userInfo.getTenantId());
|
String pagepath = "/pages/workFlow/flowBefore/index?config=" + encode + "&token=" + apptoken;
|
if (ObjectUtil.isNotEmpty(smsMap)) {
|
//参数封装
|
String message = WXGZHWebChatUtil.messageJson(templateKId, openid, wxxcxAppId, pagepath, smsMap, title, type, link);
|
//发送信息
|
retJson = WXGZHWebChatUtil.sendMessage(token, message);
|
}
|
JSONObject rstObj = WXGZHWebChatUtil.getMessageList(token);
|
List<WxgzhMessageModel> wxgzhMessageModelList = JsonUtil.getJsonToList(rstObj.get("template_list"), WxgzhMessageModel.class);
|
WxgzhMessageModel messageModel = wxgzhMessageModelList.stream().filter(t -> t.getTemplateId().equals(templateKId)).findFirst().orElse(null);
|
if (ObjectUtil.isNotEmpty(messageModel)) {
|
content = messageModel.getContent();
|
if (StringUtil.isNotBlank(content) && !"null".equals(content)) {
|
if (ObjectUtil.isNotEmpty(smsMap) && !"null".equals(smsMap)) {
|
if (content.contains(".DATA}")) {
|
for (String key : smsMap.keySet()) {
|
content = content.replace(key, smsMap.get(key).toString());
|
}
|
}
|
}
|
}
|
}
|
if (!retJson.getBoolean("code")) {
|
code = false;
|
error = error.append(";").append(userEntity.getRealName() + ":" + retJson.get("error"));
|
messageMonitorMapper.create(monitorEntity);
|
continue;
|
}
|
messageMonitorMapper.create(monitorEntity);
|
continue;
|
|
} else {
|
code = false;
|
error = error.append(";").append(userEntity.getRealName() + ":" + "账号未绑定公众号");
|
messageMonitorMapper.create(monitorEntity);
|
continue;
|
}
|
} else {
|
code = false;
|
error = error.append(";").append(userEntity.getRealName() + ":" + "账号未绑定公众号");
|
messageMonitorMapper.create(monitorEntity);
|
continue;
|
}
|
}
|
if (code) {
|
retJson.put("code", true);
|
retJson.put("error", MsgCode.SU012.get());
|
} else {
|
String msg = error.toString();
|
if (StringUtil.isNotBlank(msg)) {
|
msg = msg.substring(1);
|
}
|
retJson.put("code", false);
|
retJson.put("error", msg);
|
}
|
return retJson;
|
}
|
|
public boolean sentNotice(List<String> toUserIds, MessageEntity entity) {
|
// 存到redis中的key对象
|
UserInfo userInfo = UserProvider.getUser();
|
List<String> idList = new ArrayList<>();
|
// 修改发送状态
|
entity.setEnabledMark(1);
|
entity.setLastModifyTime(new Date());
|
entity.setLastModifyUserId(userInfo.getUserId());
|
messageMapper.updateById(entity);
|
// 存到redis,生成Redis的key
|
Callable executeInsert = () -> {
|
executeInsert(toUserIds, idList);
|
return true;
|
};
|
Future<Boolean> submit = ThreadPoolExecutorUtil.getExecutor().submit(executeInsert);
|
try {
|
if (submit.get()) {
|
// 执行发送公告操作
|
Runnable runnable = () -> executeBatch(idList, entity, userInfo);
|
ThreadPoolExecutorUtil.getExecutor().submit(runnable);
|
}
|
return true;
|
} catch (Exception e) {
|
// 还原公告状态
|
entity.setEnabledMark(0);
|
entity.setLastModifyTime(null);
|
entity.setLastModifyUserId(null);
|
messageMapper.updateById(entity);
|
}
|
return false;
|
}
|
|
private void executeBatch(List<String> idList, MessageEntity entity, UserInfo userInfo) {
|
if (idList.size() == 0 || "3".equals(String.valueOf(entity.getRemindCategory()))) {
|
return;
|
}
|
SentMessageForm sentMessageForm = new SentMessageForm();
|
List<String> toUserId = new ArrayList<>();
|
for (String cacheKey : idList) {
|
List<String> cacheValue = (List) redisUtil.get(cacheKey, 0, -1);
|
toUserId.addAll(cacheValue);
|
}
|
sentMessageForm.setToUserIds(toUserId);
|
sentMessageForm.setTitle(entity.getTitle());
|
sentMessageForm.setContent(entity.getBodyText());
|
sentMessageForm.setContentMsg(Collections.EMPTY_MAP);
|
sentMessageForm.setUserInfo(userInfo);
|
sentMessageForm.setType(1);
|
sentMessageForm.setId(entity.getId());
|
|
// 站内信
|
if ("1".equals(String.valueOf(entity.getRemindCategory()))) {
|
message(sentMessageForm);
|
} else if ("2".equals(String.valueOf(entity.getRemindCategory()))) {
|
SendMessageConfigEntity sendMessageConfigEntity = sendMessageConfigMapper.getInfo(entity.getSendConfigId());
|
if (sendMessageConfigEntity != null) {
|
List<SendConfigTemplateEntity> configTemplateEntityList = sendConfigTemplateMapper.getDetailListByParentId(sendMessageConfigEntity.getId());
|
for (SendConfigTemplateEntity sendConfigTemplateEntity : configTemplateEntityList) {
|
Map<String, String> map = new HashMap<>();
|
map.put("Title", entity.getTitle());
|
map.put("Content", entity.getBodyText());
|
map.put("Remark", entity.getExcerpt());
|
Map<String, Object> paramMap = new HashMap<>();
|
paramMap.put("@Title", entity.getTitle());
|
paramMap.put("@Content", entity.getBodyText());
|
paramMap.put("@Remark", entity.getExcerpt());
|
paramMap.put("@CreatorUserName", userInfo.getUserName());
|
paramMap.put("@SendTime", DateUtil.getNow().substring(11));
|
paramMap.put(sendConfigTemplateEntity.getId()+"@Title", entity.getTitle());
|
paramMap.put(sendConfigTemplateEntity.getId()+"@Content", entity.getBodyText());
|
paramMap.put(sendConfigTemplateEntity.getId()+"@Remark", entity.getExcerpt());
|
paramMap.put(sendConfigTemplateEntity.getId()+"@CreatorUserName", userInfo.getUserName());
|
paramMap.put(sendConfigTemplateEntity.getId()+"@SendTime", DateUtil.getNow().substring(11));
|
switch (sendConfigTemplateEntity.getMessageType()) {
|
case "1":
|
MessageTemplateConfigEntity configEntity = messageTemplateConfigMapper.getInfo(sendConfigTemplateEntity.getTemplateId());
|
if (configEntity != null) {
|
sentMessageForm.setTitle(configEntity.getTitle());
|
}
|
message(sentMessageForm);
|
break;
|
case "2":
|
// 邮件
|
sentMessageUtil.SendMail(toUserId, userInfo, "2", sendConfigTemplateEntity, new HashMap<>(), map);
|
break;
|
case "3":
|
// 发送短信
|
sentMessageUtil.sendSms(toUserId, userInfo, sendConfigTemplateEntity, paramMap, new HashMap<>());
|
break;
|
case "4":
|
// 钉钉
|
JSONObject jsonObject1 = sentMessageUtil.SendDingTalk(toUserId, userInfo, "4", sendConfigTemplateEntity, new HashMap<>(), map);
|
if (!(Boolean) jsonObject1.get("code")) {
|
log.error("发送企业微信消息失败,错误:" + jsonObject1.get("error"));
|
}
|
break;
|
case "5":
|
// 企业微信
|
JSONObject jsonObject = sentMessageUtil.SendQyWebChat(toUserId, userInfo, "5", sendConfigTemplateEntity, new HashMap<>(), map);
|
if (!(Boolean) jsonObject.get("code")) {
|
log.error("发送企业微信消息失败,错误:" + jsonObject.get("error"));
|
}
|
break;
|
case "6":
|
// webhook
|
this.SendWebHook(null, userInfo, sendConfigTemplateEntity, new HashMap<>(), map);
|
break;
|
case "7":
|
// 微信公众号
|
this.SendWXGzhChat(toUserId, userInfo, "7", sendConfigTemplateEntity, new HashMap<>(), paramMap);
|
break;
|
default:
|
break;
|
}
|
}
|
|
}
|
}
|
}
|
|
private void message(SentMessageForm sentMessageForm) {
|
List<String> toUserIds = sentMessageForm.getToUserIds();
|
Integer type = sentMessageForm.getType();
|
String title = sentMessageForm.getTitle();
|
String content = sentMessageForm.getContent();
|
String bodyText = Objects.equals(type, 3) ? content : JsonUtil.getObjectToString(sentMessageForm.getContentMsg());
|
UserInfo userInfo = sentMessageForm.getUserInfo();
|
MessageReceiveEntity messageReceiveEntity = new MessageReceiveEntity();
|
messageReceiveEntity.setIsRead(0);
|
messageReceiveEntity.setId(RandomUtil.uuId());
|
messageReceiveEntity.setType(sentMessageForm.getType());
|
if (type != null) {
|
messageReceiveEntity.setId(sentMessageForm.getId());
|
messageReceiveEntity.setType(type);
|
messageReceiveEntity.setCreatorUserId(userInfo.getUserId());
|
messageReceiveEntity.setCreatorTime(DateUtil.getNowDate());
|
}
|
//消息监控写入
|
MessageMonitorEntity monitorEntity = new MessageMonitorEntity();
|
MessageEntity messageEntity = messageMapper.getInfo(sentMessageForm.getId());
|
if (!"1".equals(String.valueOf(messageReceiveEntity.getType()))) {
|
monitorEntity.setMessageSource(sentMessageForm.getType() + "");
|
messageReceiveEntity.setFlowType(sentMessageForm.getFlowType());
|
monitorEntity.setTitle(title);
|
} else {
|
monitorEntity.setMessageSource("1");
|
title = title.replaceAll("\\{@Title}", messageEntity.getTitle())
|
.replaceAll("\\{@CreatorUserName}", userInfo.getUserName())
|
.replaceAll("\\{@SendTime}", DateUtil.getNow().substring(11))
|
.replaceAll("\\{@Content}", messageEntity.getBodyText())
|
.replaceAll("\\{@Remark}", StringUtil.isNotEmpty(messageEntity.getExcerpt()) ? messageEntity.getExcerpt() : "");
|
monitorEntity.setTitle(title);
|
|
MessageEntity messageEntity2 = new MessageEntity();
|
messageEntity2.setId(messageEntity.getId());
|
bodyText = JsonUtil.getObjectToString(messageEntity2);
|
}
|
Map<String, MessageReceiveEntity> map = new HashMap<>();
|
for (String item : toUserIds) {
|
MessageReceiveEntity messageReceiveEntitys = new MessageReceiveEntity();
|
BeanUtils.copyProperties(messageReceiveEntity, messageReceiveEntitys);
|
messageReceiveEntitys.setId(RandomUtil.uuId());
|
messageReceiveEntitys.setUserId(item);
|
messageReceiveEntitys.setTitle(title);
|
// if(ObjectUtil.isNotEmpty(messageEntity)) {
|
// messageReceiveEntitys.setTitle(title.replaceAll("\\{@Title}", messageEntity.getTitle())
|
// .replaceAll("\\{@CreatorUserName}", userInfo.getUserName())
|
// .replaceAll("\\{@Content}", messageEntity.getBodyText())
|
// .replaceAll("\\{@Remark}", StringUtil.isNotEmpty(messageEntity.getExcerpt()) ? messageEntity.getExcerpt() : ""));
|
// }
|
messageReceiveEntitys.setBodyText(bodyText);
|
messagereceiveMapper.insert(messageReceiveEntitys);
|
map.put(messageReceiveEntitys.getUserId(), messageReceiveEntitys);
|
}
|
monitorEntity.setId(RandomUtil.uuId());
|
monitorEntity.setMessageType("1");
|
monitorEntity.setReceiveUser(JsonUtil.getObjectToString(toUserIds));
|
monitorEntity.setSendTime(DateUtil.getNowDate());
|
monitorEntity.setCreatorTime(DateUtil.getNowDate());
|
monitorEntity.setCreatorUserId(userInfo.getUserId());
|
monitorEntity.setContent(content);
|
messageMonitorMapper.insert(monitorEntity);
|
//消息推送 - PC端
|
PushMessageUtil.pushMessage(map, userInfo, type != null ? type : 2);
|
}
|
|
|
/**
|
* 数据存到redis中
|
*
|
* @param toUserIds 接受者id
|
*/
|
private void executeInsert(List<String> toUserIds, List<String> idList) throws Exception {
|
List<String> key = new ArrayList<>();
|
try {
|
int frequency = 10000;
|
int count = toUserIds.size() / frequency + 1;
|
if (toUserIds.size() < 1) return;
|
for (int i = 0; i < count; i++) {
|
// 生成redis的key
|
String cacheKey = RandomUtil.uuId() + toUserIds.get(i);
|
// 存到redis
|
int endSize = Math.min(((i + 1) * frequency), toUserIds.size());
|
redisUtil.insert(cacheKey, toUserIds.subList(i * frequency, endSize));
|
key.add(cacheKey);
|
}
|
} catch (Exception e) {
|
key.forEach(k -> redisUtil.remove(k));
|
key.clear();
|
throw new Exception();
|
}
|
idList.addAll(key);
|
}
|
|
public void saveShortLink(String pcLink, String appLink, String shortLink, UserInfo userInfo, String userId, String bodyText) {
|
ShortLinkEntity shortLinkEntity = shortLInkMapper.getInfoByLink(shortLink);
|
if (shortLinkEntity == null) {
|
ShortLinkEntity entity = new ShortLinkEntity();
|
Map<String, String> sysConfig = getSystemConfig();
|
String linkTime = sysConfig.get("linkTime");
|
Integer isClick = 0;
|
if (StringUtil.isNotBlank(sysConfig.get("isClick")) && !"null".equals(sysConfig.get("isClick"))) {
|
isClick = Integer.parseInt(sysConfig.get("isClick"));
|
}
|
int unClickNum = 20;
|
if (StringUtil.isNotBlank(sysConfig.get("unClickNum")) && !"null".equals(sysConfig.get("unClickNum"))) {
|
unClickNum = Integer.parseInt(sysConfig.get("unClickNum"));
|
}
|
entity.setId(RandomUtil.uuId());
|
entity.setRealPcLink(pcLink);
|
entity.setRealAppLink(appLink);
|
entity.setShortLink(shortLink);
|
entity.setBodyText(bodyText);
|
// entity.setTenantId(userInfo.getTenantId());
|
entity.setUserId(userId);
|
entity.setIsUsed(isClick);
|
entity.setUnableNum(unClickNum);
|
entity.setClickNum(0);
|
if (StringUtil.isNotEmpty(linkTime)) {
|
Date unableTime = SentMessageUtil.getUnableTime(linkTime);
|
entity.setUnableTime(unableTime);
|
} else {
|
entity.setUnableTime(DateUtil.dateAddHours(DateUtil.getNowDate(), 24));
|
}
|
entity.setCreatorTime(DateUtil.getNowDate());
|
entity.setCreatorUserId(userInfo.getUserId());
|
shortLInkMapper.insert(entity);
|
}
|
}
|
|
private Map<String, String> getSystemConfig() {
|
// 获取系统配置
|
List<SysConfigEntity> configList = sysconfigService.getList("SysConfig");
|
Map<String, String> objModel = new HashMap<>(16);
|
for (SysConfigEntity entity : configList) {
|
objModel.put(entity.getFkey(), entity.getValue());
|
}
|
return objModel;
|
}
|
|
private String getShortLink(String pcLink, String userId, String shortLink, String type) {
|
if (StringUtil.isNotBlank(shortLink)) {
|
ShortLinkEntity entity = shortLInkMapper.getInfoByLink(shortLink);
|
if (entity != null) {
|
if (pcLink.equals(entity.getRealPcLink())) {
|
return shortLink;
|
} else {
|
shortLink = shortLInkMapper.shortLink(pcLink + userId + type);
|
return getShortLink(pcLink, userId, shortLink, type);
|
}
|
} else {
|
return shortLink;
|
}
|
} else {
|
shortLink = shortLInkMapper.shortLink(pcLink + userId + type);
|
return getShortLink(pcLink, userId, shortLink, type);
|
}
|
}
|
}
|