SendMessageUtil.java 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346
  1. package com.xjrsoft.module.oa.utils;
  2. import cn.hutool.core.lang.TypeReference;
  3. import cn.hutool.core.util.StrUtil;
  4. import cn.hutool.extra.mail.MailAccount;
  5. import cn.hutool.extra.mail.MailUtil;
  6. import cn.hutool.extra.spring.SpringUtil;
  7. import com.alibaba.fastjson.JSONObject;
  8. import com.xjrsoft.common.constant.GlobalConstant;
  9. import com.xjrsoft.common.enums.MessageType;
  10. import com.xjrsoft.common.enums.YesOrNoEnum;
  11. import com.xjrsoft.common.sms.SmsSender;
  12. import com.xjrsoft.common.utils.LocalDateTimeUtil;
  13. import com.xjrsoft.common.utils.RedisUtil;
  14. import com.xjrsoft.common.utils.WeChatUtil;
  15. import com.xjrsoft.module.oa.entity.Message;
  16. import com.xjrsoft.module.oa.service.IMessageService;
  17. import com.xjrsoft.module.organization.entity.User;
  18. import com.xjrsoft.module.organization.service.IUserService;
  19. import com.xjrsoft.module.workflow.model.NoticePolicyParam;
  20. import lombok.extern.slf4j.Slf4j;
  21. import java.time.LocalDateTime;
  22. import java.time.format.DateTimeFormatter;
  23. import java.util.ArrayList;
  24. import java.util.List;
  25. import java.util.stream.Collectors;
  26. /**
  27. * 发送信息工具类
  28. *
  29. * @Author: tzx
  30. * @Date: 2022/10/26 16:59
  31. */
  32. @Slf4j
  33. public class SendMessageUtil {
  34. public static final String SCHEDULE_CONTENT_TEMPLATE = "您有一则新的日程《{}》,请及时查看.";
  35. public static final String WORKFLOW_APPROVE_TEMPLATE = "《{}》等待审批。";
  36. public static final String WORKFLOW_CIRULATED_TEMPLATE = "《{}》等待查看。";
  37. public static final String WORKFLOW_TIMEOUT_TEMPLATE = "《{}》任务已超时,等待审批。";
  38. /**
  39. * 添加日程消息
  40. */
  41. public static void sendScheduleMessage(Long userId, String objectId, String title) {
  42. IMessageService messageService = SpringUtil.getBean(IMessageService.class);
  43. Message message = new Message();
  44. message.setMessageType(MessageType.SCHEDULE.getCode());
  45. message.setSendTime(LocalDateTime.now());
  46. message.setIsRead(YesOrNoEnum.NO.getCode());
  47. message.setUserId(userId);
  48. message.setObjectId(objectId);
  49. message.setMessageContent(StrUtil.format(SCHEDULE_CONTENT_TEMPLATE, title));
  50. messageService.save(message);
  51. }
  52. /**
  53. * 发送工作流审批微信消息
  54. */
  55. public static void sendWorkflowApproveWx(NoticePolicyParam param, String name) {
  56. IUserService userService = SpringUtil.getBean(IUserService.class);
  57. RedisUtil redisUtil = SpringUtil.getBean(RedisUtil.class);
  58. WeChatUtil weChatUtil = SpringUtil.getBean(WeChatUtil.class);
  59. //获取用户相关信息
  60. List<User> userList = redisUtil.get(GlobalConstant.USER_CACHE_KEY, new TypeReference<List<User>>() {
  61. });
  62. //如果缓存中不存在用户信息,就直接去数据库查询,并保存到缓存中去
  63. if (userList.size() == 0) {
  64. userList = userService.list();
  65. redisUtil.set(GlobalConstant.USER_CACHE_KEY, userList);
  66. }
  67. if (param.getNoticeUserIds().size() > 0) {
  68. for (Long userId : param.getNoticeUserIds()) {
  69. User user = userList.stream().filter(u -> userId.equals(u.getId())).findFirst().orElse(new User());
  70. String openId = user.getOpenId();
  71. if (StrUtil.isEmpty(openId)) {
  72. break;
  73. }
  74. JSONObject data = new JSONObject();
  75. // 任务名称
  76. data.put("thing8", new JSONObject() {{
  77. put("value", param.getSchemaName());
  78. }});
  79. // 事项名称
  80. data.put("thing2", new JSONObject() {{
  81. put("value", String.format("《%s》发起了《%s》,待审批!", param.getStartUserName(), param.getSchemaName()));
  82. }});
  83. // 申请人
  84. data.put("thing6", new JSONObject() {{
  85. put("value", param.getStartUserName());
  86. }});
  87. // 时间
  88. data.put("time3", new JSONObject() {{
  89. put("value", LocalDateTimeUtil.format(LocalDateTime.now(), LocalDateTimeUtil.LOCAL_DATE_TIME_FORMAT));
  90. }});
  91. JSONObject object = new JSONObject();
  92. object.put("touser", openId);
  93. object.put("template_id", "sHsmz7LRj7HLd7GSTS3r2jCLvK-4Wp19iGzEvYK8n_I");
  94. object.put("miniprogram", new JSONObject() {{
  95. put("appid", weChatUtil.getAppletAppKey());
  96. put("pagepath", StrUtil.format("/xjrsoft/pages/workflow/approval?taskId={}&processId={}&type=todo", param.getTaskId(), param.getProcessId()));
  97. }});
  98. object.put("client_msg_id", param.getTaskId());
  99. object.put("data", data);
  100. weChatUtil.sendTemplateMessage(object);
  101. }
  102. }
  103. }
  104. /**
  105. * 添加工作流审批消息
  106. */
  107. public static void sendWorkflowApproveMessage(NoticePolicyParam param) {
  108. IMessageService messageService = SpringUtil.getBean(IMessageService.class);
  109. List<Message> messageList = new ArrayList<>();
  110. for (Long userId : param.getNoticeUserIds()) {
  111. Message message = new Message();
  112. message.setMessageType(MessageType.APPROVE.getCode());
  113. message.setSendTime(LocalDateTime.now());
  114. message.setIsRead(YesOrNoEnum.NO.getCode());
  115. message.setUserId(userId);
  116. message.setObjectId(param.getTaskId());
  117. message.setMessageContent(StrUtil.format(WORKFLOW_APPROVE_TEMPLATE, param.getTaskName()));
  118. message.setProcessId(param.getProcessId());
  119. message.setSchemaId(param.getSchemaId());
  120. messageList.add(message);
  121. }
  122. messageService.saveBatch(messageList);
  123. }
  124. /**
  125. * 发送工作流审批短信
  126. */
  127. public static void sendWorkflowApproveSms(NoticePolicyParam param, String name) {
  128. IUserService userService = SpringUtil.getBean(IUserService.class);
  129. RedisUtil redisUtil = SpringUtil.getBean(RedisUtil.class);
  130. SmsSender smsSender = SpringUtil.getBean(SmsSender.class);
  131. //获取用户相关信息
  132. List<User> userList = redisUtil.get(GlobalConstant.USER_CACHE_KEY, new TypeReference<List<User>>() {
  133. });
  134. //如果缓存中不存在用户信息,就直接去数据库查询,并保存到缓存中去
  135. if (userList.size() == 0) {
  136. userList = userService.list();
  137. redisUtil.set(GlobalConstant.USER_CACHE_KEY, userList);
  138. }
  139. //构造短信参数,调用短信服务进行短信发送
  140. if (param.getNoticeUserIds().size() > 0) {
  141. //获取用户id对应的手机号,用户名
  142. for (Long userId : param.getNoticeUserIds()) {
  143. User user = userList.stream().filter(u -> userId.equals(u.getId())).findFirst().orElse(new User());
  144. String mobile = user.getMobile();
  145. //调用短信接口服务
  146. smsSender.sendTimeout(mobile, name);
  147. }
  148. }
  149. }
  150. /**
  151. * 添加工作流传阅消息
  152. */
  153. public static void sendWorkflowCirculatedMessage(NoticePolicyParam param) {
  154. IMessageService messageService = SpringUtil.getBean(IMessageService.class);
  155. List<Message> messageList = new ArrayList<>();
  156. for (Long userId : param.getNoticeUserIds()) {
  157. Message message = new Message();
  158. message.setMessageType(MessageType.CIRCULATED.getCode());
  159. message.setSendTime(LocalDateTime.now());
  160. message.setIsRead(YesOrNoEnum.NO.getCode());
  161. message.setUserId(userId);
  162. message.setObjectId(param.getTaskId());
  163. message.setMessageContent(StrUtil.format(WORKFLOW_CIRULATED_TEMPLATE, param.getTaskName()));
  164. message.setProcessId(param.getProcessId());
  165. message.setSchemaId(param.getSchemaId());
  166. messageList.add(message);
  167. }
  168. messageService.saveBatch(messageList);
  169. }
  170. /**
  171. * 发送工作流传阅短信
  172. */
  173. public static void sendWorkflowCirculatedSms(NoticePolicyParam param, String name) {
  174. IUserService userService = SpringUtil.getBean(IUserService.class);
  175. RedisUtil redisUtil = SpringUtil.getBean(RedisUtil.class);
  176. SmsSender smsSender = SpringUtil.getBean(SmsSender.class);
  177. //获取用户相关信息
  178. List<User> userList = redisUtil.get(GlobalConstant.USER_CACHE_KEY, new TypeReference<List<User>>() {
  179. });
  180. //如果缓存中不存在用户信息,就直接去数据库查询,并保存到缓存中去
  181. if (userList.size() == 0) {
  182. userList = userService.list();
  183. redisUtil.set(GlobalConstant.USER_CACHE_KEY, userList);
  184. }
  185. //构造短信参数,调用短信服务进行短信发送
  186. if (param.getNoticeUserIds().size() > 0) {
  187. //获取用户id对应的手机号,用户名
  188. for (Long userId : param.getNoticeUserIds()) {
  189. User user = userList.stream().filter(u -> userId.equals(u.getId())).findFirst().orElse(new User());
  190. String mobile = user.getMobile();
  191. // //构建参数,您有一个 %s - %s 创建的《%s》任务已超时,请及时处理.StrUtil.format():使用占位符进行替换
  192. // String text = StrUtil.format(SendMessageUtil.WORKFLOW_TIMEOUT_TEMPLATE, param.getStartUserName(), LocalDateTime.now().format(DateTimeFormatter.ofPattern(GlobalConstant.YYYY_MM_DD_HH_MM_SS_24)), param.getSchemaName());
  193. //调用短信接口服务
  194. smsSender.sendCirculated(mobile, name);
  195. }
  196. }
  197. }
  198. /**
  199. * 添加工作流超时
  200. */
  201. public static void sendWorkflowTimeoutMessage(NoticePolicyParam param) {
  202. IMessageService messageService = SpringUtil.getBean(IMessageService.class);
  203. List<Message> messageList = new ArrayList<>();
  204. for (Long userId : param.getNoticeUserIds()) {
  205. Message message = new Message();
  206. //将超时提醒显示在工作流审批消息中
  207. message.setMessageType(MessageType.APPROVE.getCode());
  208. message.setSendTime(LocalDateTime.now());
  209. message.setIsRead(YesOrNoEnum.NO.getCode());
  210. message.setUserId(userId);
  211. message.setObjectId(param.getTaskId());
  212. String format = StrUtil.format(WORKFLOW_TIMEOUT_TEMPLATE, param.getTaskName());
  213. message.setMessageContent(format);
  214. message.setProcessId(param.getProcessId());
  215. message.setSchemaId(param.getSchemaId());
  216. messageList.add(message);
  217. }
  218. messageService.saveBatch(messageList);
  219. }
  220. /**
  221. * 添加工作流超时短信提醒服务
  222. */
  223. public static void sendWorkflowTimeoutSms(NoticePolicyParam param, String name) {
  224. IUserService userService = SpringUtil.getBean(IUserService.class);
  225. RedisUtil redisUtil = SpringUtil.getBean(RedisUtil.class);
  226. SmsSender smsSender = SpringUtil.getBean(SmsSender.class);
  227. //获取用户相关信息
  228. List<User> userList = redisUtil.get(GlobalConstant.USER_CACHE_KEY, new TypeReference<List<User>>() {
  229. });
  230. //如果缓存中不存在用户信息,就直接去数据库查询,并保存到缓存中去
  231. if (userList.size() == 0) {
  232. userList = userService.list();
  233. redisUtil.set(GlobalConstant.USER_CACHE_KEY, userList);
  234. }
  235. //构造短信参数,调用短信服务进行短信发送
  236. if (param.getNoticeUserIds().size() > 0) {
  237. //获取用户id对应的手机号,用户名
  238. for (Long userId : param.getNoticeUserIds()) {
  239. User user = userList.stream().filter(u -> userId.equals(u.getId())).findFirst().orElse(new User());
  240. String mobile = user.getMobile();
  241. // //构建参数,您有一个 %s - %s 创建的《%s》任务已超时,请及时处理.StrUtil.format():使用占位符进行替换
  242. // String text = StrUtil.format(SendMessageUtil.WORKFLOW_TIMEOUT_TEMPLATE, param.getStartUserName(), LocalDateTime.now().format(DateTimeFormatter.ofPattern(GlobalConstant.YYYY_MM_DD_HH_MM_SS_24)), param.getSchemaName());
  243. //调用短信接口服务
  244. smsSender.sendTimeout(mobile, name);
  245. }
  246. }
  247. }
  248. /**
  249. * 添加工作流超时 断行
  250. */
  251. public static void sendWorkflowTimeoutEmail(NoticePolicyParam param) {
  252. MailAccount mailAccount = SpringUtil.getBean(MailAccount.class);
  253. RedisUtil redisUtil = SpringUtil.getBean(RedisUtil.class);
  254. //获取到需要提醒的人员
  255. List<User> allUser = redisUtil.get(GlobalConstant.USER_CACHE_KEY, new TypeReference<List<User>>() {
  256. });
  257. List<String> allEmail = allUser.stream().filter(u -> param.getNoticeUserIds().contains(u.getId())).map(User::getEmail).collect(Collectors.toList());
  258. String content = StrUtil.format(SendMessageUtil.WORKFLOW_TIMEOUT_TEMPLATE, param.getStartUserName(), LocalDateTime.now().format(DateTimeFormatter.ofPattern(GlobalConstant.YYYY_MM_DD_HH_MM_SS_24)), param.getSchemaName());
  259. MailUtil.send(mailAccount, allEmail, "超时消息提醒", content, false);
  260. }
  261. /**
  262. * 添加工作流超时 断行
  263. */
  264. public static void sendWorkflowApproveEmail(NoticePolicyParam param) {
  265. MailAccount mailAccount = SpringUtil.getBean(MailAccount.class);
  266. RedisUtil redisUtil = SpringUtil.getBean(RedisUtil.class);
  267. //获取到需要提醒的人员
  268. List<User> allUser = redisUtil.get(GlobalConstant.USER_CACHE_KEY, new TypeReference<List<User>>() {
  269. });
  270. List<String> allEmail = allUser.stream().filter(u -> param.getNoticeUserIds().contains(u.getId())).map(User::getEmail).collect(Collectors.toList());
  271. String content = StrUtil.format(SendMessageUtil.WORKFLOW_TIMEOUT_TEMPLATE, param.getStartUserName(), LocalDateTime.now().format(DateTimeFormatter.ofPattern(GlobalConstant.YYYY_MM_DD_HH_MM_SS_24)), param.getSchemaName());
  272. MailUtil.send(mailAccount, allEmail, "用户审批", content, false);
  273. }
  274. /**
  275. * 添加工作流超时 断行
  276. */
  277. public static void sendWorkflowCirculatedEmail(NoticePolicyParam param) {
  278. MailAccount mailAccount = SpringUtil.getBean(MailAccount.class);
  279. RedisUtil redisUtil = SpringUtil.getBean(RedisUtil.class);
  280. //获取到需要提醒的人员
  281. List<User> allUser = redisUtil.get(GlobalConstant.USER_CACHE_KEY, new TypeReference<List<User>>() {
  282. });
  283. List<String> allEmail = allUser.stream().filter(u -> param.getNoticeUserIds().contains(u.getId())).map(User::getEmail).collect(Collectors.toList());
  284. String content = StrUtil.format(SendMessageUtil.WORKFLOW_TIMEOUT_TEMPLATE, param.getStartUserName(), LocalDateTime.now().format(DateTimeFormatter.ofPattern(GlobalConstant.YYYY_MM_DD_HH_MM_SS_24)), param.getSchemaName());
  285. MailUtil.send(mailAccount, allEmail, "用户传阅", content, false);
  286. }
  287. }