SentMessageUtil.java 71 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371
  1. package jnpf.base.util;
  2. import cn.hutool.core.util.ObjectUtil;
  3. import cn.hutool.http.HttpRequest;
  4. import cn.hutool.http.Method;
  5. import com.alibaba.fastjson.JSONObject;
  6. import jnpf.base.UserInfo;
  7. import jnpf.base.entity.SysConfigEntity;
  8. import jnpf.base.service.SysconfigService;
  9. import jnpf.config.ConfigValueUtil;
  10. import jnpf.constant.MsgCode;
  11. import jnpf.flowable.model.trigger.TriggerModel;
  12. import jnpf.message.entity.*;
  13. import jnpf.message.enums.MessageTypeEnum;
  14. import jnpf.message.model.WxgzhMessageModel;
  15. import jnpf.message.model.message.DingTalkModel;
  16. import jnpf.message.model.message.EmailModel;
  17. import jnpf.message.model.SentMessageForm;
  18. import jnpf.base.SmsModel;
  19. import jnpf.message.service.*;
  20. import jnpf.message.util.*;
  21. import jnpf.util.wxutil.mp.WXGZHWebChatUtil;
  22. import jnpf.model.SocialsSysConfig;
  23. import jnpf.permission.entity.UserEntity;
  24. import jnpf.permission.service.UserService;
  25. import jnpf.util.*;
  26. import jnpf.util.message.SmsUtil;
  27. import jnpf.util.third.DingTalkUtil;
  28. import lombok.extern.slf4j.Slf4j;
  29. import org.apache.commons.text.StringSubstitutor;
  30. import org.springframework.beans.factory.annotation.Autowired;
  31. import org.springframework.stereotype.Component;
  32. import java.nio.charset.StandardCharsets;
  33. import java.util.*;
  34. import java.util.regex.Pattern;
  35. /**
  36. * 消息实体类
  37. *
  38. * @版本: V3.2.0
  39. * @版权: 引迈信息技术有限公司(https://www.jnpfsoft.com)
  40. * @作者: JNPF开发平台组
  41. * @日期: 2021/4/22 9:06
  42. */
  43. @Component
  44. @Slf4j
  45. public class SentMessageUtil {
  46. @Autowired
  47. private UserService userService;
  48. @Autowired
  49. private SysconfigService sysconfigService;
  50. @Autowired
  51. private MessageService messageService;
  52. @Autowired
  53. private SynThirdInfoService synThirdInfoService;
  54. @Autowired
  55. private SendMessageConfigService sendMessageConfigService;
  56. @Autowired
  57. private SendConfigTemplateService sendConfigTemplateService;
  58. @Autowired
  59. private AccountConfigService accountConfigService;
  60. @Autowired
  61. private MessageTemplateConfigService messageTemplateConfigService;
  62. @Autowired
  63. private MessageMonitorService messageMonitorService;
  64. @Autowired
  65. private SmsFieldService smsFieldService;
  66. @Autowired
  67. private ShortLinkService shortLinkService;
  68. @Autowired
  69. private WechatUserService wechatUserService;
  70. @Autowired
  71. protected AuthUtil authUtil;
  72. @Autowired
  73. private ConfigValueUtil configValueUtil;
  74. /**
  75. * 发送消息
  76. *
  77. * @param sentMessageForm
  78. */
  79. public void sendMessage(SentMessageForm sentMessageForm) {
  80. List<String> toUserIdsList = sentMessageForm.getToUserIds();
  81. // 模板id
  82. String templateId = sentMessageForm.getTemplateId();
  83. // 参数
  84. Map<String, Object> parameterMap = sentMessageForm.getParameterMap();
  85. UserInfo userInfo = sentMessageForm.getUserInfo();
  86. boolean flag = true;
  87. if (!(toUserIdsList != null && toUserIdsList.size() > 0)) {
  88. log.error("接收人员为空");
  89. flag = false;
  90. }
  91. if (StringUtil.isEmpty(templateId)) {
  92. log.error("模板Id为空");
  93. flag = false;
  94. }
  95. if (flag) {
  96. // 获取发送配置详情
  97. // MessageTemplateEntity entity = messageTemplateService.getInfo(templateId);
  98. SendMessageConfigEntity entity = sendMessageConfigService.getInfoByEnCode(templateId);
  99. if (entity != null) {
  100. templateId = entity.getId();
  101. } else {
  102. entity = sendMessageConfigService.getInfo(templateId);
  103. }
  104. if (entity != null) {
  105. List<SendConfigTemplateEntity> list = sendConfigTemplateService.getDetailListByParentId(templateId);
  106. if (list != null && list.size() > 0) {
  107. for (SendConfigTemplateEntity entity1 : list) {
  108. if (parameterMap.get(entity1.getId() + "@Title") == null) {
  109. parameterMap.put(entity1.getId() + "@Title", sentMessageForm.getTitle());
  110. }
  111. if (parameterMap.get(entity1.getId() + "@CreatorUserName") == null || StringUtil.isEmpty(String.valueOf(parameterMap.get(entity1.getId() + "@CreatorUserName")))) {
  112. parameterMap.put(entity1.getId() + "@CreatorUserName", sentMessageForm.getUserInfo().getUserName());
  113. }
  114. if (parameterMap.get(entity1.getId() + "@SendTime") == null || StringUtil.isEmpty(String.valueOf(parameterMap.get(entity1.getId() + "@SendTime")))) {
  115. parameterMap.put(entity1.getId() + "@SendTime", DateUtil.getNow().substring(11));
  116. }
  117. if (parameterMap.get(entity1.getId() + "@FlowLink") == null) {
  118. parameterMap.put(entity1.getId() + "@FlowLink", "");
  119. }
  120. if ("1".equals(String.valueOf(entity1.getEnabledMark()))) {
  121. String sendType = entity1.getMessageType();
  122. MessageTypeEnum typeEnum = MessageTypeEnum.getByCode(sendType);
  123. Map<String, String> contentMsg = sentMessageForm.getContentMsg();
  124. switch (typeEnum) {
  125. case SysMessage:
  126. // 站内消息、
  127. for (String toUserId : toUserIdsList) {
  128. List<String> toUser = new ArrayList<>();
  129. String content = sentMessageForm.getContent();
  130. MessageTemplateConfigEntity templateConfigEntity = messageTemplateConfigService.getInfo(entity1.getTemplateId());
  131. String title = sentMessageForm.getTitle();
  132. String appLink = "";
  133. if (templateConfigEntity != null) {
  134. title = templateConfigEntity.getTitle();
  135. String msg = contentMsg.get(toUserId) != null ? contentMsg.get(toUserId) : "{}";
  136. byte[] bytes = msg.getBytes(StandardCharsets.UTF_8);
  137. String encode = Base64.getEncoder().encodeToString(bytes);
  138. //流程审批页面链接地址
  139. //流程审批页面链接地址
  140. String pcLink = "/workFlowDetail?config=" + encode;
  141. appLink = "/pages/workFlow/flowBefore/index?config=" + encode;
  142. //转换为短链
  143. String shortLink = shortLinkService.shortLink(pcLink + toUserId + templateConfigEntity.getMessageType());
  144. shortLink = getShortLink(pcLink, toUserId, shortLink, templateConfigEntity.getMessageType());
  145. String link = configValueUtil.getApiDomain() + "/api/message/ShortLink/" + shortLink;
  146. if (StringUtil.isNotBlank(userInfo.getTenantId())) {
  147. link = link + "/" + userInfo.getTenantId();
  148. }
  149. if (title.contains("{@FlowLink}")) {
  150. title = title.replace("{@FlowLink}", link + " ");
  151. //链接数据保存
  152. this.saveShortLink(pcLink, appLink, shortLink, userInfo, toUserId, msg);
  153. }
  154. Map<String, Object> msgMap = new HashMap<>();
  155. msgMap = getParamMap(entity1.getId(), parameterMap);
  156. if (StringUtil.isNotEmpty(title)) {
  157. StringSubstitutor strSubstitutor = new StringSubstitutor(msgMap, "{", "}");
  158. title = strSubstitutor.replace(title);
  159. }
  160. }
  161. toUser.add(toUserId);
  162. messageService.sentMessage(toUser, title, content, contentMsg, userInfo);
  163. //消息监控写入
  164. MessageMonitorEntity monitorEntity = new MessageMonitorEntity();
  165. monitorEntity.setId(RandomUtil.uuId());
  166. monitorEntity.setReceiveUser(JsonUtil.getObjectToString(toUser));
  167. monitorEntity.setSendTime(DateUtil.getNowDate());
  168. monitorEntity.setCreatorTime(DateUtil.getNowDate());
  169. monitorEntity.setCreatorUserId(userInfo.getUserId());
  170. createMessageMonitor(monitorEntity, templateConfigEntity, null, null, userInfo, toUser, title);
  171. messageMonitorService.create(monitorEntity);
  172. }
  173. try {
  174. String url = configValueUtil.getApiDomain() + "/api/workflow/trigger/MsgExecute";
  175. TriggerModel model = new TriggerModel();
  176. model.setUserInfo(userInfo);
  177. model.setId(entity1.getTemplateId());
  178. HttpRequest request = HttpRequest.of(url).method(Method.POST).body(JsonUtil.getObjectToString(model));
  179. request.header(Constants.AUTHORIZATION, userInfo.getToken());
  180. request.execute().body();
  181. }catch (Exception e) {
  182. log.error("消息触发流程报错信息:"+e.getMessage());
  183. }
  184. break;
  185. case SmsMessage:
  186. // 发送短信
  187. sendSms(toUserIdsList, userInfo, entity1, parameterMap, contentMsg);
  188. break;
  189. case MailMessage:
  190. // 邮件
  191. SendMail(toUserIdsList, userInfo, sendType, entity1, parameterMap, contentMsg);
  192. break;
  193. case QyMessage:
  194. // 企业微信
  195. JSONObject jsonObject = SendQyWebChat(toUserIdsList, userInfo, sendType, entity1, parameterMap, contentMsg);
  196. if (!(Boolean) jsonObject.get("code")) {
  197. log.error("发送企业微信消息失败,错误:" + jsonObject.get("error"));
  198. }
  199. break;
  200. case DingMessage:
  201. // 钉钉
  202. JSONObject jsonObject1 = SendDingTalk(toUserIdsList, userInfo, sendType, entity1, parameterMap, contentMsg);
  203. if (!(Boolean) jsonObject1.get("code")) {
  204. log.error("发送企业微信消息失败,错误:" + jsonObject1.get("error"));
  205. }
  206. break;
  207. case WebHookMessage:
  208. // webhook
  209. SendWebHook(sendType, userInfo, entity1, parameterMap, new HashMap<>());
  210. break;
  211. case WechatMessage:
  212. // 微信公众号
  213. SendWXGzhChat(toUserIdsList, userInfo, sendType, entity1, contentMsg, parameterMap);
  214. break;
  215. default:
  216. break;
  217. }
  218. }
  219. }
  220. }
  221. } else {
  222. for (String toUserId : toUserIdsList) {
  223. List<String> toUser = new ArrayList<>();
  224. toUser.add(toUserId);
  225. String content = sentMessageForm.getContent();
  226. Map<String, String> contentMsg = sentMessageForm.getContentMsg();
  227. String title = sentMessageForm.getTitle();
  228. messageService.sentMessage(toUser, title, content, contentMsg, userInfo);
  229. //消息监控写入
  230. MessageMonitorEntity monitorEntity = new MessageMonitorEntity();
  231. monitorEntity.setId(RandomUtil.uuId());
  232. monitorEntity.setReceiveUser(JsonUtil.getObjectToString(toUser));
  233. monitorEntity.setSendTime(DateUtil.getNowDate());
  234. monitorEntity.setCreatorTime(DateUtil.getNowDate());
  235. monitorEntity.setCreatorUserId(userInfo.getUserId());
  236. monitorEntity.setMessageType("1");
  237. createMessageMonitor(monitorEntity, null, null, null, userInfo, toUser, title);
  238. messageMonitorService.create(monitorEntity);
  239. }
  240. }
  241. }
  242. }
  243. public void SendWebHook(String sendType, UserInfo userInfo, SendConfigTemplateEntity entity, Map<String, Object> parameterMap, Map<String, String> contentMsg) {
  244. MessageTemplateConfigEntity msgTemEntity = messageTemplateConfigService.getInfo(entity.getTemplateId());
  245. AccountConfigEntity accountEntity = accountConfigService.getInfo(entity.getAccountConfigId());
  246. MessageMonitorEntity monitorEntity = new MessageMonitorEntity();
  247. monitorEntity.setId(RandomUtil.uuId());
  248. monitorEntity.setSendTime(DateUtil.getNowDate());
  249. monitorEntity.setCreatorTime(DateUtil.getNowDate());
  250. monitorEntity.setCreatorUserId(userInfo.getUserId());
  251. String content = msgTemEntity.getContent();
  252. //获取消息模板参数
  253. parameterMap = getParamMap(entity.getId(), parameterMap);
  254. // 替换参数
  255. if (StringUtil.isNotEmpty(content)) {
  256. StringSubstitutor strSubstitutor = new StringSubstitutor(parameterMap, "{", "}");
  257. content = strSubstitutor.replace(content);
  258. }
  259. String title = msgTemEntity.getTitle();
  260. if (StringUtil.isNotEmpty(title)) {
  261. StringSubstitutor strSubstitutor = new StringSubstitutor(parameterMap, "{", "}");
  262. title = strSubstitutor.replace(title);
  263. }
  264. title = systemParam(parameterMap, contentMsg, title, userInfo);
  265. content = systemParam(parameterMap, contentMsg, content, userInfo);
  266. if (entity != null) {
  267. if (accountEntity != null) {
  268. //创建消息监控
  269. monitorEntity = createMessageMonitor(monitorEntity, msgTemEntity, accountEntity, content, userInfo, null, title);
  270. messageMonitorService.create(monitorEntity);
  271. switch (accountEntity.getWebhookType()) {
  272. case 1:
  273. //钉钉
  274. if (Objects.equals(1, accountEntity.getApproveType())) {
  275. WebHookUtil.sendDDMessage(accountEntity.getWebhookAddress(), content);
  276. } else if (Objects.equals(2, accountEntity.getApproveType())) {
  277. WebHookUtil.sendDingDing(accountEntity.getWebhookAddress(), accountEntity.getBearer(), content);
  278. }
  279. break;
  280. case 2:
  281. if (Objects.equals(1, accountEntity.getApproveType())) {
  282. WebHookUtil.callWeChatBot(accountEntity.getWebhookAddress(), content);
  283. }
  284. break;
  285. default:
  286. break;
  287. }
  288. } else {
  289. monitorEntity = createMessageMonitor(monitorEntity, msgTemEntity, null, content, userInfo, null, title);
  290. messageMonitorService.create(monitorEntity);
  291. }
  292. } else {
  293. monitorEntity = createMessageMonitor(monitorEntity, msgTemEntity, null, content, userInfo, null, title);
  294. messageMonitorService.create(monitorEntity);
  295. }
  296. }
  297. /**
  298. * 发送企业微信消息
  299. *
  300. * @param toUserIdsList
  301. * @param userInfo
  302. * @param sendType
  303. * @param entity
  304. * @param parameterMap
  305. * @return
  306. */
  307. public JSONObject SendQyWebChat(List<String> toUserIdsList, UserInfo userInfo, String sendType, SendConfigTemplateEntity entity, Map<String, Object> parameterMap, Map<String, String> contentMsg) {
  308. MessageTemplateConfigEntity msgTemEntity = messageTemplateConfigService.getInfo(entity.getTemplateId());
  309. JSONObject retJson = new JSONObject();
  310. boolean code = true;
  311. StringBuilder error = new StringBuilder();
  312. // 获取接收人员的企业微信号、创建消息用户实体
  313. for (String userId : toUserIdsList) {
  314. error = new StringBuilder();
  315. MessageMonitorEntity monitorEntity = new MessageMonitorEntity();
  316. monitorEntity.setId(RandomUtil.uuId());
  317. monitorEntity.setSendTime(DateUtil.getNowDate());
  318. monitorEntity.setCreatorTime(DateUtil.getNowDate());
  319. monitorEntity.setCreatorUserId(userInfo.getUserId());
  320. if (StringUtil.isEmpty(userId)) {
  321. code = false;
  322. error = error.append(";").append("接收人为空!");
  323. messageMonitorService.create(monitorEntity);
  324. continue;
  325. }
  326. monitorEntity.setReceiveUser(userId);
  327. UserEntity userEntity = userService.getInfo(userId);
  328. if (ObjectUtil.isEmpty(userEntity)) {
  329. code = false;
  330. error = error.append(";").append("用户不存在!");
  331. messageMonitorService.create(monitorEntity);
  332. continue;
  333. }
  334. if (msgTemEntity != null) {
  335. //获取消息模板参数
  336. Map<String, Object> msgMap = getParamMap(entity.getId(), parameterMap);
  337. // 替换参数
  338. String content = msgTemEntity.getContent();
  339. String msg = contentMsg.get(userId) != null ? contentMsg.get(userId) : "{}";
  340. byte[] bytes = msg.getBytes(StandardCharsets.UTF_8);
  341. String encode = Base64.getEncoder().encodeToString(bytes);
  342. //流程审批页面链接地址
  343. String pcLink = "/workFlowDetail?config=" + encode;
  344. String appLink = "/pages/workFlow/flowBefore/index?config=" + encode;
  345. //转换为短链
  346. String shortLink = shortLinkService.shortLink(pcLink + userId + msgTemEntity.getMessageType());
  347. shortLink = getShortLink(pcLink, userId, shortLink, msgTemEntity.getMessageType());
  348. String msgTC = msgTemEntity.getTitle() + msgTemEntity.getContent();
  349. if (StringUtil.isNotBlank(msgTC)) {
  350. if (msgTC.contains("{@FlowLink}")) {
  351. //链接数据保存
  352. this.saveShortLink(pcLink, appLink, shortLink, userInfo, userId, msg);
  353. }
  354. }
  355. String link = configValueUtil.getApiDomain() + "/api/message/ShortLink/" + shortLink;
  356. if (StringUtil.isNotBlank(userInfo.getTenantId())) {
  357. link = link + "/" + userInfo.getTenantId();
  358. }
  359. if (StringUtil.isNotEmpty(content)) {
  360. if (content.contains("{@FlowLink}")) {
  361. content = content.replace("{@FlowLink}", link + " ");
  362. }
  363. StringSubstitutor strSubstitutor = new StringSubstitutor(msgMap, "{", "}");
  364. content = strSubstitutor.replace(content);
  365. }
  366. // 替换参数
  367. String title = msgTemEntity.getTitle();
  368. if (StringUtil.isNotEmpty(title)) {
  369. if (title.contains("{@FlowLink}")) {
  370. title = title.replace("{@FlowLink}", link + " ");
  371. }
  372. StringSubstitutor strSubstitutor = new StringSubstitutor(msgMap, "{", "}");
  373. title = strSubstitutor.replace(title);
  374. }
  375. title = systemParam(parameterMap, contentMsg, title, userInfo);
  376. content = systemParam(parameterMap, contentMsg, content, userInfo);
  377. monitorEntity.setTitle(title);
  378. monitorEntity.setContent(content);
  379. // 获取系统配置
  380. SocialsSysConfig config = sysconfigService.getSocialsConfig();
  381. String corpId = config.getQyhCorpId();
  382. String agentId = config.getQyhAgentId();
  383. // 获取的应用的Secret值(某个修复导致俩个秘钥反了,只能反正修复了)
  384. String corpSecret = config.getQyhCorpSecret();
  385. String wxUserId = "";
  386. StringBuilder toWxUserId = new StringBuilder();
  387. String toUserIdAll = "";
  388. StringBuilder nullUserInfo = new StringBuilder();
  389. List<MessageReceiveEntity> messageReceiveList = new ArrayList<>();
  390. // 相关参数验证
  391. if (StringUtil.isEmpty(corpId)) {
  392. log.error("企业ID为空");
  393. code = false;
  394. error = error.append(";").append(userEntity.getRealName() + ":企业ID为空!");
  395. messageMonitorService.create(monitorEntity);
  396. continue;
  397. }
  398. if (StringUtil.isEmpty(corpSecret)) {
  399. code = false;
  400. error = error.append(";").append(userEntity.getRealName() + ":Secret为空!");
  401. messageMonitorService.create(monitorEntity);
  402. continue;
  403. }
  404. if (StringUtil.isEmpty(agentId)) {
  405. code = false;
  406. error = error.append(";").append(userEntity.getRealName() + ":AgentId为空!");
  407. messageMonitorService.create(monitorEntity);
  408. continue;
  409. }
  410. if (StringUtil.isEmpty(content)) {
  411. code = false;
  412. error = error.append(";").append(userEntity.getRealName() + ":内容为空!");
  413. messageMonitorService.create(monitorEntity);
  414. continue;
  415. }
  416. // 创建消息实体
  417. MessageEntity messageEntity = JnpfMessageUtil.setMessageEntity(userInfo.getUserId(), content, null, Integer.parseInt(sendType));
  418. //创建消息监控
  419. monitorEntity = createMessageMonitor(monitorEntity, msgTemEntity, null, content, userInfo, null, title);
  420. // 获取接收人员的企业微信号、创建消息用户实体
  421. // for (String userId : toUserIdsList) {
  422. wxUserId = "";
  423. // 从同步表获取对应的企业微信ID
  424. SynThirdInfoEntity synThirdInfoEntity = synThirdInfoService.getInfoBySysObjId("1", "2", userId);
  425. if(synThirdInfoEntity == null){
  426. synThirdInfoEntity = synThirdInfoService.getInfoBySysObjId("11", "2", userId);
  427. }
  428. if (synThirdInfoEntity != null) {
  429. wxUserId = synThirdInfoEntity.getThirdObjId();
  430. }
  431. if (StringUtil.isEmpty(wxUserId)) {
  432. nullUserInfo = nullUserInfo.append(",").append(userId);
  433. } else {
  434. toWxUserId = toWxUserId.append("|").append(wxUserId);
  435. }
  436. messageReceiveList.add(JnpfMessageUtil.setMessageReceiveEntity(userId, title, Integer.valueOf(sendType)));
  437. // }
  438. // 处理企业微信号信息串并验证
  439. toUserIdAll = toWxUserId.toString();
  440. if (StringUtil.isNotEmpty(toUserIdAll)) {
  441. toUserIdAll = toUserIdAll.substring(1);
  442. }
  443. if (StringUtil.isEmpty(toUserIdAll)) {
  444. code = false;
  445. error = error.append(";").append(userEntity.getRealName() + ":接收人对应的企业微信号全部为空!");
  446. messageMonitorService.create(monitorEntity);
  447. continue;
  448. }
  449. // 发送企业信息信息
  450. retJson = QyWebChatUtil.sendWxMessage(corpId, corpSecret, agentId, toUserIdAll, content);
  451. if (!retJson.getBoolean("code")) {
  452. code = false;
  453. error = error.append(";").append(userEntity.getRealName() + ":" + retJson.get("error"));
  454. messageMonitorService.create(monitorEntity);
  455. continue;
  456. }
  457. // 批量发送企业信息信息
  458. // retJson = QyWebChatUtil.sendWxMessage(corpId, corpSecret, agentId, toUserIdAll, content);
  459. // messageMonitorService.create(monitorEntity);
  460. // if (!retJson.getBoolean("code")) {
  461. // return retJson;
  462. // }
  463. // 企业微信号为空的信息写入备注
  464. if (StringUtil.isNotEmpty(nullUserInfo.toString())) {
  465. messageEntity.setExcerpt(nullUserInfo.substring(1) + "对应的企业微信号为空");
  466. }
  467. messageMonitorService.create(monitorEntity);
  468. continue;
  469. } else {
  470. code = false;
  471. error = error.append(";").append(userEntity.getRealName() + ":消息模板数据不存在!");
  472. messageMonitorService.create(monitorEntity);
  473. continue;
  474. }
  475. }
  476. if (code) {
  477. retJson.put("code", true);
  478. retJson.put("error", MsgCode.SU012.get());
  479. } else {
  480. String msg = error.toString();
  481. if (StringUtil.isNotBlank(msg)) {
  482. msg = msg.substring(1);
  483. }
  484. retJson.put("code", false);
  485. retJson.put("error", msg);
  486. }
  487. return retJson;
  488. }
  489. /**
  490. * List<String> toUserIdsList, UserInfo userInfo, String sendType, MessageTemplateEntity entity, Map<String, String> parameterMap
  491. *
  492. * @param toUserIdsList
  493. * @param userInfo
  494. * @param sendType
  495. * @param entity
  496. * @param parameterMap
  497. * @return
  498. */
  499. public JSONObject SendDingTalk(List<String> toUserIdsList, UserInfo userInfo, String sendType, SendConfigTemplateEntity entity, Map<String, Object> parameterMap, Map<String, String> contentMsg) {
  500. MessageTemplateConfigEntity msgTemEntity = messageTemplateConfigService.getInfo(entity.getTemplateId());
  501. boolean code = true;
  502. StringBuilder error = new StringBuilder();
  503. JSONObject retJson = new JSONObject();
  504. for (String userId : toUserIdsList) {
  505. error = new StringBuilder();
  506. //消息监控
  507. MessageMonitorEntity monitorEntity = new MessageMonitorEntity();
  508. monitorEntity.setId(RandomUtil.uuId());
  509. monitorEntity.setSendTime(DateUtil.getNowDate());
  510. monitorEntity.setCreatorTime(DateUtil.getNowDate());
  511. monitorEntity.setCreatorUserId(userInfo.getUserId());
  512. monitorEntity.setReceiveUser(userId);
  513. if (StringUtil.isEmpty(userId)) {
  514. code = false;
  515. error = error.append(";").append("接收人为空!");
  516. messageMonitorService.create(monitorEntity);
  517. continue;
  518. }
  519. UserEntity userEntity = userService.getInfo(userId);
  520. if (ObjectUtil.isEmpty(userEntity)) {
  521. code = false;
  522. error = error.append(";").append("用户不存在!");
  523. messageMonitorService.create(monitorEntity);
  524. continue;
  525. }
  526. if (msgTemEntity != null) {
  527. String content = msgTemEntity.getContent();
  528. //获取消息模板参数
  529. Map<String, Object> msgMap = getParamMap(entity.getId(), parameterMap);
  530. //转换链接
  531. String msg = contentMsg.get(userId) != null ? contentMsg.get(userId) : "{}";
  532. byte[] bytes = msg.getBytes(StandardCharsets.UTF_8);
  533. String encode = Base64.getEncoder().encodeToString(bytes);
  534. //流程审批页面链接地址
  535. String pcLink = "/workFlowDetail?config=" + encode;
  536. String appLink = "/pages/workFlow/flowBefore/index?config=" + encode;
  537. //转换为短链
  538. String shortLink = shortLinkService.shortLink(pcLink + userId + msgTemEntity.getMessageType());
  539. shortLink = getShortLink(pcLink, userId, shortLink, msgTemEntity.getMessageType());
  540. String msgTC = msgTemEntity.getTitle() + msgTemEntity.getContent();
  541. if (StringUtil.isNotBlank(msgTC)) {
  542. if (msgTC.contains("{@FlowLink}")) {
  543. //链接数据保存
  544. this.saveShortLink(pcLink, appLink, shortLink, userInfo, userId, msg);
  545. }
  546. }
  547. String link = configValueUtil.getApiDomain() + "/api/message/ShortLink/" + shortLink;
  548. if (StringUtil.isNotBlank(userInfo.getTenantId())) {
  549. link = link + "/" + userInfo.getTenantId();
  550. }
  551. if (StringUtil.isNotEmpty(content)) {
  552. if (content.contains("{@FlowLink}")) {
  553. content = content.replace("{@FlowLink}", link + " ");
  554. }
  555. StringSubstitutor strSubstitutor = new StringSubstitutor(msgMap, "{", "}");
  556. content = strSubstitutor.replace(content);
  557. }
  558. // 替换参数
  559. String title = msgTemEntity.getTitle();
  560. if (StringUtil.isNotEmpty(title)) {
  561. if (title.contains("{@FlowLink}")) {
  562. title = title.replace("{@FlowLink}", link + " ");
  563. }
  564. StringSubstitutor strSubstitutor = new StringSubstitutor(msgMap, "{", "}");
  565. title = strSubstitutor.replace(title);
  566. }
  567. title = systemParam(parameterMap, contentMsg, title, userInfo);
  568. content = systemParam(parameterMap, contentMsg, content, userInfo);
  569. monitorEntity.setTitle(title);
  570. monitorEntity.setContent(content);
  571. Map<String, String> objModel = getSystemConfig();
  572. DingTalkModel dingTalkModel = JsonUtil.getJsonToBean(objModel, DingTalkModel.class);
  573. String appKey = dingTalkModel.getDingSynAppKey();
  574. String appSecret = dingTalkModel.getDingSynAppSecret();
  575. String agentId = dingTalkModel.getDingAgentId();
  576. String dingUserId = "";
  577. StringBuilder toDingUserId = new StringBuilder();
  578. String toUserIdAll = "";
  579. StringBuilder nullUserInfo = new StringBuilder();
  580. List<MessageReceiveEntity> messageReceiveList = new ArrayList<>();
  581. // 相关参数验证
  582. if (StringUtil.isEmpty(appKey)) {
  583. code = false;
  584. error = error.append(";").append(userEntity.getRealName() + ":AppKey为空!");
  585. messageMonitorService.create(monitorEntity);
  586. continue;
  587. }
  588. if (StringUtil.isEmpty(appSecret)) {
  589. code = false;
  590. error = error.append(";").append(userEntity.getRealName() + ":AppSecret为空!");
  591. messageMonitorService.create(monitorEntity);
  592. continue;
  593. }
  594. if (StringUtil.isEmpty(agentId)) {
  595. code = false;
  596. error = error.append(";").append(userEntity.getRealName() + ":AgentId为空!");
  597. messageMonitorService.create(monitorEntity);
  598. continue;
  599. }
  600. if (StringUtil.isEmpty(content)) {
  601. code = false;
  602. error = error.append(";").append(userEntity.getRealName() + ":AgentId为空!");
  603. messageMonitorService.create(monitorEntity);
  604. continue;
  605. }
  606. // 创建消息实体
  607. MessageEntity messageEntity = JnpfMessageUtil.setMessageEntity(userInfo.getUserId(), content, null, Integer.parseInt(sendType));
  608. //创建消息监控
  609. monitorEntity = createMessageMonitor(monitorEntity, msgTemEntity, null, content, userInfo, null, title);
  610. // 获取接收人员的钉钉号、创建消息用户实体
  611. // for (String userId : toUserIdsList) {
  612. dingUserId = "";
  613. dingUserId = "";
  614. // 从同步表获取对应用户的钉钉ID
  615. SynThirdInfoEntity synThirdInfoEntity = synThirdInfoService.getInfoBySysObjId("2", "2", userId);
  616. if(synThirdInfoEntity == null){
  617. synThirdInfoEntity = synThirdInfoService.getInfoBySysObjId("22", "2", userId);
  618. }
  619. if (synThirdInfoEntity != null) {
  620. dingUserId = synThirdInfoEntity.getThirdObjId();
  621. }
  622. if (StringUtil.isEmpty(dingUserId)) {
  623. nullUserInfo = nullUserInfo.append(",").append(userId);
  624. } else {
  625. toDingUserId = toDingUserId.append(",").append(dingUserId);
  626. }
  627. messageReceiveList.add(JnpfMessageUtil.setMessageReceiveEntity(userId, title, Integer.valueOf(sendType)));
  628. // 处理接收人员的钉钉号信息串并验证
  629. toUserIdAll = toDingUserId.toString();
  630. if (StringUtil.isNotEmpty(toUserIdAll)) {
  631. toUserIdAll = toUserIdAll.substring(1);
  632. }
  633. if (StringUtil.isEmpty(toUserIdAll)) {
  634. code = false;
  635. error = error.append(";").append(userEntity.getRealName() + ":接收人对应的钉钉号为空!");
  636. messageMonitorService.create(monitorEntity);
  637. continue;
  638. }
  639. // 发送钉钉信息
  640. retJson = DingTalkUtil.sendDingMessage(appKey, appSecret, agentId, toUserIdAll, content);
  641. if (!retJson.getBoolean("code")) {
  642. code = false;
  643. error = error.append(";").append(userEntity.getRealName() + ":" + retJson.get("error"));
  644. messageMonitorService.create(monitorEntity);
  645. continue;
  646. }
  647. // 钉钉号为空的信息写入备注
  648. if (StringUtil.isNotEmpty(nullUserInfo.toString())) {
  649. messageEntity.setExcerpt(nullUserInfo.toString().substring(1) + "对应的钉钉号为空");
  650. }
  651. messageMonitorService.create(monitorEntity);
  652. continue;
  653. } else {
  654. code = false;
  655. error = error.append(";").append(userEntity.getRealName() + ":消息模板数据不存在");
  656. messageMonitorService.create(monitorEntity);
  657. continue;
  658. }
  659. }
  660. if (code) {
  661. retJson.put("code", true);
  662. retJson.put("error", MsgCode.SU012.get());
  663. } else {
  664. String msg = error.toString();
  665. if (StringUtil.isNotBlank(msg)) {
  666. msg = msg.substring(1);
  667. }
  668. retJson.put("code", false);
  669. retJson.put("error", msg);
  670. }
  671. return retJson;
  672. }
  673. /**
  674. * 发送邮件
  675. *
  676. * @param toUserIdsList
  677. * @param userInfo
  678. * @param sendType
  679. * @param entity
  680. * @param parameterMap
  681. * @return
  682. */
  683. public List<String> SendMail(List<String> toUserIdsList, UserInfo userInfo, String sendType, SendConfigTemplateEntity entity, Map<String, Object> parameterMap, Map<String, String> contentMsg) {
  684. List<String> errList = new ArrayList<>();
  685. MessageTemplateConfigEntity msgTemEntity = messageTemplateConfigService.getInfo(entity.getTemplateId());
  686. AccountConfigEntity accountEntity = accountConfigService.getInfo(entity.getAccountConfigId());
  687. for (String userId : toUserIdsList) {
  688. //消息监控
  689. MessageMonitorEntity monitorEntity = new MessageMonitorEntity();
  690. monitorEntity.setId(RandomUtil.uuId());
  691. monitorEntity.setReceiveUser(JsonUtil.getObjectToString(toUserIdsList));
  692. monitorEntity.setSendTime(DateUtil.getNowDate());
  693. monitorEntity.setCreatorTime(DateUtil.getNowDate());
  694. monitorEntity.setCreatorUserId(userInfo.getUserId());
  695. if (StringUtil.isEmpty(userId)) {
  696. log.error("接收人为空");
  697. messageMonitorService.create(monitorEntity);
  698. errList.add("接收人为空");
  699. continue;
  700. }
  701. monitorEntity.setReceiveUser(userId);
  702. UserEntity userEntity = userService.getInfo(userId);
  703. if (msgTemEntity != null) {
  704. String msg = contentMsg.get(userId) != null ? contentMsg.get(userId) : "{}";
  705. byte[] bytes = msg.getBytes(StandardCharsets.UTF_8);
  706. String encode = Base64.getEncoder().encodeToString(bytes);
  707. //流程审批页面链接地址
  708. String pcLink = "/workFlowDetail?config=" + encode;
  709. String appLink = "/pages/workFlow/flowBefore/index?config=" + encode;
  710. //转换为短链
  711. String shortLink = shortLinkService.shortLink(pcLink + userId + msgTemEntity.getMessageType());
  712. shortLink = getShortLink(pcLink, userId, shortLink, msgTemEntity.getMessageType());
  713. String msgTC = msgTemEntity.getTitle() + msgTemEntity.getContent();
  714. if (StringUtil.isNotBlank(msgTC)) {
  715. if (msgTC.contains("{@FlowLink}")) {
  716. //链接数据保存
  717. this.saveShortLink(pcLink, appLink, shortLink, userInfo, userId, msg);
  718. }
  719. }
  720. String link = configValueUtil.getApiDomain() + "/api/message/ShortLink/" + shortLink;
  721. if (StringUtil.isNotBlank(userInfo.getTenantId())) {
  722. link = link + "/" + userInfo.getTenantId();
  723. }
  724. Map<String, Object> msgMap = getParamMap(entity.getId(), parameterMap);
  725. // 设置邮件标题
  726. String title = msgTemEntity.getTitle();
  727. if (title.contains("{@FlowLink}")) {
  728. title = title.replace("{@FlowLink}", link + " ");
  729. }
  730. if (StringUtil.isNotEmpty(title)) {
  731. StringSubstitutor strSubstitutor = new StringSubstitutor(msgMap, "{", "}");
  732. title = strSubstitutor.replace(title);
  733. }
  734. // 设置邮件内容
  735. String content = msgTemEntity.getContent();
  736. if (content.contains("{@FlowLink}")) {
  737. content = content.replace("{@FlowLink}", link + " ");
  738. }
  739. //获取消息模板参数
  740. if (StringUtil.isNotEmpty(content)) {
  741. StringSubstitutor strSubstitutor = new StringSubstitutor(msgMap, "{", "}");
  742. content = strSubstitutor.replace(content);
  743. }
  744. title = systemParam(parameterMap, contentMsg, title, userInfo);
  745. content = systemParam(parameterMap, contentMsg, content, userInfo);
  746. monitorEntity.setTitle(title);
  747. monitorEntity.setContent(content);
  748. if (accountEntity != null) {
  749. // 获取系统配置
  750. Map<String, String> objModel = new HashMap<>();
  751. objModel.put("emailSmtpHost", accountEntity.getSmtpServer());
  752. objModel.put("emailSmtpPort", accountEntity.getSmtpPort().toString());
  753. objModel.put("emailSenderName", accountEntity.getAddressorName());
  754. objModel.put("emailAccount", accountEntity.getSmtpUser());
  755. objModel.put("emailPassword", accountEntity.getSmtpPassword());
  756. objModel.put("emailSsl", accountEntity.getSslLink().equals(1) ? "true" : "false");
  757. EmailModel emailModel = JsonUtil.getJsonToBean(objModel, EmailModel.class);
  758. StringBuilder nullUserInfo = new StringBuilder();
  759. List<MessageReceiveEntity> messageReceiveList = new ArrayList<>();
  760. StringBuilder toUserMail = new StringBuilder();
  761. String userEmailAll = "";
  762. String userEmail = "";
  763. String userName = "";
  764. // 相关参数验证
  765. if (StringUtil.isEmpty(emailModel.getEmailSmtpHost())) {
  766. log.error("SMTP服务为空");
  767. messageMonitorService.create(monitorEntity);
  768. errList.add("SMTP服务为空");
  769. continue;
  770. } else if (StringUtil.isEmpty(emailModel.getEmailSmtpPort())) {
  771. log.error("SMTP端口为空");
  772. messageMonitorService.create(monitorEntity);
  773. errList.add("SMTP端口为空");
  774. continue;
  775. } else if (StringUtil.isEmpty(emailModel.getEmailAccount())) {
  776. log.error("发件人邮箱为空");
  777. messageMonitorService.create(monitorEntity);
  778. errList.add("发件人邮箱为空");
  779. continue;
  780. } else if (StringUtil.isEmpty(emailModel.getEmailPassword())) {
  781. log.error("发件人密码为空");
  782. messageMonitorService.create(monitorEntity);
  783. errList.add("发件人密码为空");
  784. continue;
  785. } else {
  786. // 设置邮件标题
  787. emailModel.setEmailTitle(title);
  788. // 设置邮件内容
  789. emailModel.setEmailContent(content);
  790. // 创建消息实体
  791. MessageEntity messageEntity = JnpfMessageUtil.setMessageEntity(userInfo.getUserId(), title, emailModel.getEmailContent(), Integer.parseInt(sendType));
  792. //创建消息监控
  793. monitorEntity = createMessageMonitor(monitorEntity, msgTemEntity, accountEntity, content, userInfo, null, title);
  794. // 获取收件人的邮箱地址、创建消息用户实体
  795. // for (String userId : toUserIdsList) {
  796. if (userEntity != null) {
  797. userEmail = StringUtil.isEmpty(userEntity.getEmail()) ? "" : userEntity.getEmail();
  798. userName = userEntity.getRealName();
  799. }
  800. if (userEmail != null && !"".equals(userEmail)) {
  801. if (EmailUtil.isEmail(userEmail)) {
  802. toUserMail = toUserMail.append(",").append(userName).append("<").append(userEmail).append(">");
  803. }
  804. } else {
  805. nullUserInfo = nullUserInfo.append(",").append(userId);
  806. }
  807. messageReceiveList.add(JnpfMessageUtil.setMessageReceiveEntity(userId, title, Integer.parseInt(sendType)));
  808. // }
  809. // 处理接收人员的邮箱信息串并验证
  810. userEmailAll = toUserMail.toString();
  811. if (StringUtil.isNotEmpty(userEmailAll)) {
  812. userEmailAll = userEmailAll.substring(1);
  813. }
  814. if (StringUtil.isEmpty(userEmailAll)) {
  815. log.error("接收人对应的邮箱格式错误");
  816. messageMonitorService.create(monitorEntity);
  817. errList.add("接收人对应的邮箱格式错误");
  818. continue;
  819. } else {
  820. // 设置接收人员
  821. emailModel.setEmailToUsers(userEmailAll);
  822. // 发送邮件
  823. JSONObject retJson = EmailUtil.sendMail(emailModel);
  824. messageMonitorService.create(monitorEntity);
  825. if (!retJson.getBoolean("code")) {
  826. log.error("发送失败");
  827. errList.add("发送失败");
  828. continue;
  829. } else {
  830. // 邮箱地址为空的信息写入备注
  831. if (StringUtil.isNotEmpty(nullUserInfo.toString())) {
  832. messageEntity.setExcerpt(nullUserInfo.substring(1) + "对应的邮箱为空");
  833. }
  834. continue;
  835. // 写入系统的消息表、消息用户表
  836. }
  837. }
  838. }
  839. }
  840. continue;
  841. }
  842. continue;
  843. }
  844. return errList;
  845. }
  846. /**
  847. * 发送短信
  848. *
  849. * @param toUserIdsList
  850. * @param entity
  851. * @param parameterMap
  852. * @return
  853. */
  854. public List<String> sendSms(List<String> toUserIdsList, UserInfo userInfo, SendConfigTemplateEntity entity, Map<String, Object> parameterMap, Map<String, String> contentMsg) {
  855. List<String> errList = new ArrayList<>();
  856. //获取短信配置
  857. AccountConfigEntity accountEntity = accountConfigService.getInfo(entity.getAccountConfigId());
  858. // 获取消息模板详情
  859. MessageTemplateConfigEntity msgTemEntity = messageTemplateConfigService.getInfo(entity.getTemplateId());
  860. // // 得到参数详情列表
  861. // List<TemplateParamEntity> detailListByParentId = templateParamService.getDetailListByParentId(msgTemEntity.getId());
  862. // detailListByParentId.forEach(t-> {
  863. //
  864. // });
  865. for (String toUserId : toUserIdsList) {
  866. //消息监控
  867. MessageMonitorEntity monitorEntity = new MessageMonitorEntity();
  868. monitorEntity.setId(RandomUtil.uuId());
  869. monitorEntity.setSendTime(DateUtil.getNowDate());
  870. monitorEntity.setCreatorTime(DateUtil.getNowDate());
  871. monitorEntity.setCreatorUserId(userInfo.getUserId());
  872. monitorEntity.setReceiveUser(toUserId);
  873. String msg = contentMsg.get(toUserId) != null ? contentMsg.get(toUserId) : "{}";
  874. byte[] bytes = msg.getBytes(StandardCharsets.UTF_8);
  875. String encode = Base64.getEncoder().encodeToString(bytes);
  876. //流程审批页面链接地址
  877. //流程审批页面链接地址
  878. String pcLink = "/workFlowDetail?config=" + encode;
  879. String appLink = "/pages/workFlow/flowBefore/index?config=" + encode;
  880. //转换为短链
  881. String shortLink = shortLinkService.shortLink(pcLink + toUserId + msgTemEntity.getMessageType());
  882. shortLink = getShortLink(pcLink, toUserId, shortLink, msgTemEntity.getMessageType());
  883. //发送给用户的链接
  884. String link = configValueUtil.getApiDomain() + "/api/message/ShortLink/" + shortLink;
  885. if (StringUtil.isNotBlank(userInfo.getTenantId())) {
  886. link = link + "/" + userInfo.getTenantId();
  887. }
  888. //转换为短链
  889. if (accountEntity != null) {
  890. monitorEntity.setAccountId(accountEntity.getId());
  891. //账号配置——短信
  892. Map<String, String> objModel = new HashMap<>(16);
  893. objModel.put("aliAccessKey", accountEntity.getAppId());
  894. objModel.put("aliSecret", accountEntity.getAppSecret());
  895. objModel.put("tencentSecretId", accountEntity.getAppId());
  896. objModel.put("tencentSecretKey", accountEntity.getAppSecret());
  897. objModel.put("tencentAppId", accountEntity.getSdkAppId());
  898. objModel.put("tencentAppKey", accountEntity.getAppKey());
  899. SmsModel smsConfig = JsonUtil.getJsonToBean(objModel, SmsModel.class);
  900. int company = accountEntity.getChannel();
  901. // 组装接受用户
  902. StringBuffer toUserIdList = new StringBuffer();
  903. // for (String toUserId : toUserIdsList) {
  904. UserEntity userEntity = userService.getInfo(toUserId);
  905. if (isPhone(userEntity.getMobilePhone())) {
  906. toUserIdList.append(userEntity.getMobilePhone() + ",");
  907. }
  908. // }
  909. //获取消息模板参数
  910. Map<String, Object> msgMap = getParamMap(entity.getId(), parameterMap);
  911. // if(parameterMap.containsKey("@flowLink")){
  912. // parameterMap.put("@flowLink",link);
  913. // }
  914. //短信参数
  915. Map<String, Object> smsMap = new HashMap<>();
  916. if (entity != null) {
  917. smsMap = smsFieldService.getParamMap(entity.getTemplateId(), msgMap);
  918. if (ObjectUtil.isNotEmpty(smsMap)) {
  919. if (smsMap.containsValue("@FlowLink")) {
  920. //链接数据保存
  921. this.saveShortLink(pcLink, appLink, shortLink, userInfo, toUserId, msg);
  922. for (String key : smsMap.keySet()) {
  923. if (smsMap.get(key).equals("@FlowLink")) {
  924. smsMap.put(key, link + " ");
  925. }
  926. }
  927. }
  928. }
  929. }
  930. // if(smsMap.containsKey("title")) {
  931. // smsMap.keySet().removeIf(k -> k.equals("title"));
  932. // }
  933. if (msgTemEntity != null) {
  934. monitorEntity.setMessageTemplateId(msgTemEntity.getId());
  935. String endPoint = "";
  936. if (Objects.equals(1, accountEntity.getChannel())) {
  937. endPoint = accountEntity.getEndPoint();
  938. } else if (Objects.equals(2, accountEntity.getChannel())) {
  939. endPoint = accountEntity.getZoneName();
  940. }
  941. String content = SmsUtil.querySmsTemplateContent(company, smsConfig, endPoint, accountEntity.getZoneParam(), msgTemEntity.getTemplateCode());
  942. if (StringUtil.isNotBlank(content) && !"null".equals(content)) {
  943. if (ObjectUtil.isNotEmpty(smsMap) && !"null".equals(smsMap)) {
  944. if (Objects.equals(1, accountEntity.getChannel())) {
  945. if (content.contains("${")) {
  946. for (String key : smsMap.keySet()) {
  947. content = content.replace("${" + key + "}", smsMap.get(key).toString());
  948. }
  949. }
  950. } else if (Objects.equals(2, accountEntity.getChannel())) {
  951. if (content.contains("{")) {
  952. for (String key : smsMap.keySet()) {
  953. content = content.replace("{" + key + "}", smsMap.get(key).toString());
  954. }
  955. }
  956. }
  957. }
  958. }
  959. //创建消息监控
  960. monitorEntity = createMessageMonitor(monitorEntity, msgTemEntity, accountEntity, content, userInfo, null, null);
  961. if (StringUtil.isEmpty(toUserIdList)) {
  962. log.error("全部接收人对应的手机号码格式错误");
  963. messageMonitorService.create(monitorEntity);
  964. errList.add("全部接收人对应的手机号码格式错误");
  965. continue;
  966. }
  967. SmsUtil.sentSms(company, smsConfig, endPoint, accountEntity.getZoneParam(), toUserIdList.toString(), accountEntity.getSmsSignature(), msgTemEntity.getTemplateCode(), smsMap);
  968. messageMonitorService.create(monitorEntity);
  969. continue;
  970. } else {
  971. log.error("消息模板数据不存在");
  972. messageMonitorService.create(monitorEntity);
  973. errList.add("消息模板数据不存在");
  974. continue;
  975. }
  976. } else {
  977. log.error("账号配置数据不存在");
  978. messageMonitorService.create(monitorEntity);
  979. errList.add("账号配置数据不存在");
  980. continue;
  981. }
  982. }
  983. return errList;
  984. }
  985. /**
  986. * 发送微信公众号消息
  987. *
  988. * @param toUserIdsList
  989. * @param userInfo
  990. * @param sendType
  991. * @param entity
  992. * @param parameterMap
  993. * @return
  994. */
  995. public JSONObject SendWXGzhChat(List<String> toUserIdsList, UserInfo userInfo, String sendType, SendConfigTemplateEntity entity, Map<String, String> contentMsg, Map<String, Object> parameterMap) {
  996. //获取短信配置
  997. AccountConfigEntity accountEntity = accountConfigService.getInfo(entity.getAccountConfigId());
  998. // 获取消息模板详情
  999. MessageTemplateConfigEntity msgTemEntity = messageTemplateConfigService.getInfo(entity.getTemplateId());
  1000. //消息监控
  1001. JSONObject retJson = new JSONObject();
  1002. boolean code = true;
  1003. StringBuilder error = new StringBuilder();
  1004. for (String userId : toUserIdsList) {
  1005. MessageMonitorEntity monitorEntity = new MessageMonitorEntity();
  1006. monitorEntity.setId(RandomUtil.uuId());
  1007. monitorEntity.setSendTime(DateUtil.getNowDate());
  1008. monitorEntity.setCreatorTime(DateUtil.getNowDate());
  1009. monitorEntity.setCreatorUserId(userInfo.getUserId());
  1010. error = new StringBuilder();
  1011. if (StringUtil.isEmpty(userId)) {
  1012. code = false;
  1013. error = error.append(";").append("接收人为空!");
  1014. messageMonitorService.create(monitorEntity);
  1015. continue;
  1016. }
  1017. UserEntity userEntity = userService.getById(userId);
  1018. if (ObjectUtil.isEmpty(userEntity)) {
  1019. code = false;
  1020. error = error.append(";").append("用户不存在!");
  1021. messageMonitorService.create(monitorEntity);
  1022. continue;
  1023. }
  1024. monitorEntity.setReceiveUser(userId);
  1025. if (ObjectUtil.isEmpty(msgTemEntity)) {
  1026. code = false;
  1027. error = error.append(";").append(userEntity.getRealName() + ":消息模板数据不存在!");
  1028. messageMonitorService.create(monitorEntity);
  1029. continue;
  1030. }
  1031. monitorEntity.setMessageTemplateId(msgTemEntity.getId());
  1032. String content = msgTemEntity.getContent();
  1033. String templateKId = msgTemEntity.getTemplateCode();
  1034. if (ObjectUtil.isEmpty(accountEntity)) {
  1035. code = false;
  1036. error = error.append(";").append(userEntity.getRealName() + ":公众号账号配置数据不存在!");
  1037. messageMonitorService.create(monitorEntity);
  1038. continue;
  1039. }
  1040. monitorEntity.setAccountId(accountEntity.getId());
  1041. //创建消息监控
  1042. monitorEntity = createMessageMonitor(monitorEntity, msgTemEntity, accountEntity, content, userInfo, toUserIdsList, null);
  1043. // 获取系统配置
  1044. String appId = accountEntity.getAppId();
  1045. String appsecret = accountEntity.getAppSecret();
  1046. String wxxcxAppId = msgTemEntity.getXcxAppId();
  1047. String type = msgTemEntity.getWxSkip();
  1048. String title = "";
  1049. //获取消息模板参数
  1050. Map<String, Object> msgMap = getParamMap(entity.getId(), parameterMap);
  1051. // if(parameterMap.containsKey("@flowLink")){
  1052. // parameterMap.put("@flowLink",link);
  1053. // }
  1054. //微信公众号参数
  1055. Map<String, Object> smsMap = new HashMap<>();
  1056. if (entity != null) {
  1057. smsMap = smsFieldService.getParamMap(entity.getTemplateId(), msgMap);
  1058. }
  1059. if (smsMap.containsKey("title")) {
  1060. title = smsMap.get("title").toString();
  1061. smsMap.keySet().removeIf(k -> k.equals("title"));
  1062. }
  1063. monitorEntity.setTitle(title);
  1064. // 相关参数验证
  1065. if (StringUtil.isEmpty(templateKId)) {
  1066. code = false;
  1067. error = error.append(";").append(userEntity.getRealName() + ":微信公众号模板id未创建!");
  1068. messageMonitorService.create(monitorEntity);
  1069. continue;
  1070. }
  1071. if (StringUtil.isEmpty(appId)) {
  1072. code = false;
  1073. error = error.append(";").append(userEntity.getRealName() + ":公众号appid为空为空!");
  1074. messageMonitorService.create(monitorEntity);
  1075. continue;
  1076. }
  1077. if (StringUtil.isEmpty(appsecret)) {
  1078. code = false;
  1079. error = error.append(";").append(userEntity.getRealName() + ":公众号appsecret为空为空!");
  1080. messageMonitorService.create(monitorEntity);
  1081. continue;
  1082. }
  1083. // 获取微信公众号的token
  1084. String token = WXGZHWebChatUtil.getAccessToken(appId, appsecret);
  1085. if (StringUtil.isEmpty(token)) {
  1086. code = false;
  1087. error = error.append(";").append(userEntity.getRealName() + ":获取微信公众号token失败!");
  1088. messageMonitorService.create(monitorEntity);
  1089. continue;
  1090. }
  1091. // 微信公众号发送消息
  1092. String msg = contentMsg.get(userId) != null ? contentMsg.get(userId) : "{}";
  1093. byte[] bytes = msg.getBytes(StandardCharsets.UTF_8);
  1094. String encode = Base64.getEncoder().encodeToString(bytes);
  1095. //流程审批页面链接地址
  1096. String pcLink = "/workFlowDetail?config=" + encode;
  1097. String appLink = "/pages/workFlow/flowBefore/index?config=" + encode;
  1098. //转换为短链
  1099. String shortLink = shortLinkService.shortLink(pcLink + userId + msgTemEntity.getMessageType());
  1100. shortLink = getShortLink(pcLink, userId, shortLink, msgTemEntity.getMessageType());
  1101. if (!"1".equals(type)) {
  1102. //链接数据保存
  1103. this.saveShortLink(pcLink, appLink, shortLink, userInfo, userId, msg);
  1104. }
  1105. String link = configValueUtil.getApiDomain() + "/api/message/ShortLink/" + shortLink;
  1106. if (StringUtil.isNotBlank(userInfo.getTenantId())) {
  1107. link = link + "/" + userInfo.getTenantId();
  1108. }
  1109. if (ObjectUtil.isNotEmpty(smsMap)) {
  1110. for (String key : smsMap.keySet()) {
  1111. if (smsMap.get(key).equals("@FlowLink")) {
  1112. smsMap.put(key, link);
  1113. }
  1114. }
  1115. } else {
  1116. code = false;
  1117. error = error.append(";").append(userEntity.getRealName() + ":公众号模板参数为空!");
  1118. messageMonitorService.create(monitorEntity);
  1119. continue;
  1120. }
  1121. WechatUserEntity wechatUserEntity = wechatUserService.getInfoByGzhId(userId, accountEntity.getAppKey());
  1122. if (wechatUserEntity != null) {
  1123. if (StringUtil.isNotBlank(wechatUserEntity.getOpenId())) {
  1124. String openid = wechatUserEntity.getOpenId();
  1125. String apptoken = authUtil.loginTempUser(userId, userInfo.getTenantId());
  1126. String pagepath = "/pages/workFlow/flowBefore/index?config=" + encode + "&token=" + apptoken;
  1127. if (ObjectUtil.isNotEmpty(smsMap)) {
  1128. //参数封装
  1129. String message = WXGZHWebChatUtil.messageJson(templateKId, openid, wxxcxAppId, pagepath, smsMap, title, type, link);
  1130. //发送信息
  1131. retJson = WXGZHWebChatUtil.sendMessage(token, message);
  1132. }
  1133. JSONObject rstObj = WXGZHWebChatUtil.getMessageList(token);
  1134. List<WxgzhMessageModel> wxgzhMessageModelList = JsonUtil.getJsonToList(rstObj.get("template_list"), WxgzhMessageModel.class);
  1135. WxgzhMessageModel messageModel = wxgzhMessageModelList.stream().filter(t -> t.getTemplateId().equals(templateKId)).findFirst().orElse(null);
  1136. if (ObjectUtil.isNotEmpty(messageModel)) {
  1137. content = messageModel.getContent();
  1138. if (StringUtil.isNotBlank(content) && !"null".equals(content)) {
  1139. if (ObjectUtil.isNotEmpty(smsMap) && !"null".equals(smsMap)) {
  1140. if (content.contains(".DATA}")) {
  1141. for (String key : smsMap.keySet()) {
  1142. content = content.replace(key, smsMap.get(key).toString());
  1143. }
  1144. }
  1145. }
  1146. }
  1147. }
  1148. if (!retJson.getBoolean("code")) {
  1149. code = false;
  1150. error = error.append(";").append(userEntity.getRealName() + ":" + retJson.get("error"));
  1151. messageMonitorService.create(monitorEntity);
  1152. continue;
  1153. }
  1154. messageMonitorService.create(monitorEntity);
  1155. continue;
  1156. } else {
  1157. code = false;
  1158. error = error.append(";").append(userEntity.getRealName() + ":" + "账号未绑定公众号");
  1159. messageMonitorService.create(monitorEntity);
  1160. continue;
  1161. }
  1162. } else {
  1163. code = false;
  1164. error = error.append(";").append(userEntity.getRealName() + ":" + "账号未绑定公众号");
  1165. messageMonitorService.create(monitorEntity);
  1166. continue;
  1167. }
  1168. }
  1169. if (code) {
  1170. retJson.put("code", true);
  1171. retJson.put("error", MsgCode.SU012.get());
  1172. } else {
  1173. String msg = error.toString();
  1174. if (StringUtil.isNotBlank(msg)) {
  1175. msg = msg.substring(1);
  1176. }
  1177. retJson.put("code", false);
  1178. retJson.put("error", msg);
  1179. }
  1180. return retJson;
  1181. }
  1182. /**
  1183. * 获取系统配置
  1184. */
  1185. private Map<String, String> getSystemConfig() {
  1186. // 获取系统配置
  1187. List<SysConfigEntity> configList = sysconfigService.getList("SysConfig");
  1188. Map<String, String> objModel = new HashMap<>(16);
  1189. for (SysConfigEntity entity : configList) {
  1190. objModel.put(entity.getFkey(), entity.getValue());
  1191. }
  1192. return objModel;
  1193. }
  1194. private Map<String, Object> getParamMap(String templateId, Map<String, Object> paramMap) {
  1195. Map<String, Object> map = new HashMap<>();
  1196. for (String key : paramMap.keySet()) {
  1197. if (key.contains(templateId)) {
  1198. map.put(key.substring(templateId.length()), paramMap.get(key));
  1199. }
  1200. }
  1201. return map;
  1202. }
  1203. private MessageMonitorEntity createMessageMonitor(MessageMonitorEntity monitorEntity, MessageTemplateConfigEntity msgTemEntity, AccountConfigEntity accountEntity, String content, UserInfo userInfo, List<String> toUserIdsList, String title) {
  1204. if (msgTemEntity != null) {
  1205. monitorEntity.setMessageTemplateId(msgTemEntity.getId());
  1206. monitorEntity.setMessageSource(msgTemEntity.getMessageSource());
  1207. if (StringUtil.isNotBlank(title)) {
  1208. monitorEntity.setTitle(title);
  1209. } else {
  1210. monitorEntity.setTitle(msgTemEntity.getTitle());
  1211. }
  1212. monitorEntity.setMessageType(msgTemEntity.getMessageType());
  1213. if ("6".equals(msgTemEntity.getMessageType()) && accountEntity != null) {
  1214. monitorEntity.setReceiveUser(accountEntity.getWebhookAddress());
  1215. } else {
  1216. if (toUserIdsList != null && toUserIdsList.size() > 0) {
  1217. monitorEntity.setReceiveUser(JsonUtil.getObjectToString(toUserIdsList));
  1218. }
  1219. }
  1220. } else {
  1221. if (StringUtil.isNotBlank(title)) {
  1222. monitorEntity.setTitle(title);
  1223. }
  1224. monitorEntity.setMessageType("1");
  1225. }
  1226. if (accountEntity != null) {
  1227. monitorEntity.setAccountId(accountEntity.getId());
  1228. monitorEntity.setAccountCode(accountEntity.getEnCode());
  1229. monitorEntity.setAccountName(accountEntity.getFullName());
  1230. }
  1231. monitorEntity.setContent(content);
  1232. return monitorEntity;
  1233. }
  1234. private String getShortLink(String pcLink, String userId, String shortLink, String type) {
  1235. if (StringUtil.isNotBlank(shortLink)) {
  1236. ShortLinkEntity entity = shortLinkService.getInfoByLink(shortLink);
  1237. if (entity != null) {
  1238. if (pcLink.equals(entity.getRealPcLink())) {
  1239. return shortLink;
  1240. } else {
  1241. shortLink = shortLinkService.shortLink(pcLink + userId + type);
  1242. return getShortLink(pcLink, userId, shortLink, type);
  1243. }
  1244. } else {
  1245. return shortLink;
  1246. }
  1247. } else {
  1248. shortLink = shortLinkService.shortLink(pcLink + userId + type);
  1249. return getShortLink(pcLink, userId, shortLink, type);
  1250. }
  1251. }
  1252. private void saveShortLink(String pcLink, String appLink, String shortLink, UserInfo userInfo, String userId, String bodyText) {
  1253. ShortLinkEntity shortLinkEntity = shortLinkService.getInfoByLink(shortLink);
  1254. if (shortLinkEntity == null) {
  1255. ShortLinkEntity entity = new ShortLinkEntity();
  1256. Map<String, String> sysConfig = getSystemConfig();
  1257. String linkTime = sysConfig.get("linkTime");
  1258. Integer isClick = 0;
  1259. if (StringUtil.isNotBlank(sysConfig.get("isClick")) && !"null".equals(sysConfig.get("isClick"))) {
  1260. isClick = Integer.parseInt(sysConfig.get("isClick"));
  1261. }
  1262. int unClickNum = 20;
  1263. if (StringUtil.isNotBlank(sysConfig.get("unClickNum")) && !"null".equals(sysConfig.get("unClickNum"))) {
  1264. unClickNum = Integer.parseInt(sysConfig.get("unClickNum"));
  1265. }
  1266. entity.setId(RandomUtil.uuId());
  1267. entity.setRealPcLink(pcLink);
  1268. entity.setRealAppLink(appLink);
  1269. entity.setShortLink(shortLink);
  1270. entity.setBodyText(bodyText);
  1271. // entity.setTenantId(userInfo.getTenantId());
  1272. entity.setUserId(userId);
  1273. entity.setIsUsed(isClick);
  1274. entity.setUnableNum(unClickNum);
  1275. entity.setClickNum(0);
  1276. if (StringUtil.isNotEmpty(linkTime)) {
  1277. Date unableTime = getUnableTime(linkTime);
  1278. entity.setUnableTime(unableTime);
  1279. } else {
  1280. entity.setUnableTime(DateUtil.dateAddHours(DateUtil.getNowDate(), 24));
  1281. }
  1282. entity.setCreatorTime(DateUtil.getNowDate());
  1283. entity.setCreatorUserId(userInfo.getUserId());
  1284. shortLinkService.save(entity);
  1285. }
  1286. }
  1287. private Date getUnableTime(String linkTime) {
  1288. Double time = Double.parseDouble(linkTime);
  1289. int second = Double.valueOf(time * 60 * 60).intValue();
  1290. Date unableTime = DateUtil.dateAddSeconds(DateUtil.getNowDate(), second);
  1291. return unableTime;
  1292. }
  1293. public static boolean isPhone(String phone) {
  1294. if (StringUtil.isNotBlank(phone) && !"null".equals(phone)) {
  1295. return Pattern.matches("^1[3-9]\\d{9}$", phone);
  1296. }
  1297. return false;
  1298. }
  1299. public List<String> sendDelegateMsg(SentMessageForm sentMessageForm){
  1300. return messageService.sentScheduleMessage(sentMessageForm,"");
  1301. }
  1302. /**
  1303. * 系统参数替换
  1304. *
  1305. * @param parameterMap
  1306. * @param contentMsg
  1307. * @param title
  1308. * @param userInfo
  1309. * @return
  1310. */
  1311. private String systemParam(Map<String, Object> parameterMap, Map<String, String> contentMsg, String title, UserInfo userInfo) {
  1312. if (parameterMap.isEmpty()) {
  1313. return title = title.replaceAll("\\{@Title}", contentMsg.get("Title")!=null?contentMsg.get("Title"):"")
  1314. .replaceAll("\\{@CreatorUserName}", userInfo.getUserName())
  1315. .replaceAll("\\{@SendTime}", DateUtil.getNow().substring(11))
  1316. .replaceAll("\\{@Content}", contentMsg.get("Content")!=null?contentMsg.get("Content"):"")
  1317. .replaceAll("\\{@Remark}", contentMsg.get("Remark")!=null?contentMsg.get("Remark"):"")
  1318. .replaceAll("\\{@StartDate}", contentMsg.get("StartDate")!=null?contentMsg.get("StartDate"):"")
  1319. .replaceAll("\\{@StartTime}", contentMsg.get("StartTime")!=null?contentMsg.get("StartTime"):"")
  1320. .replaceAll("\\{@EndDate}", contentMsg.get("EndDate")!=null?contentMsg.get("EndDate"):"")
  1321. .replaceAll("\\{@FlowLink}", "")
  1322. .replaceAll("\\{@EndTime}", contentMsg.get("EndTime")!=null?contentMsg.get("EndTime"):"");
  1323. }
  1324. return title;
  1325. }
  1326. }