MessageServiceImpl.java 41 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842
  1. package jnpf.message.service.impl;
  2. import cn.hutool.core.bean.BeanUtil;
  3. import cn.hutool.core.collection.CollectionUtil;
  4. import cn.hutool.http.HttpRequest;
  5. import cn.hutool.http.Method;
  6. import com.alibaba.fastjson.JSONObject;
  7. import com.baomidou.dynamic.datasource.annotation.DSTransactional;
  8. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  9. import com.baomidou.mybatisplus.core.metadata.IPage;
  10. import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
  11. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  12. import jnpf.base.Pagination;
  13. import jnpf.base.UserInfo;
  14. import jnpf.base.entity.DictionaryDataEntity;
  15. import jnpf.base.entity.DictionaryTypeEntity;
  16. import jnpf.base.entity.MessageTemplateEntity;
  17. import jnpf.base.entity.SuperBaseEntity;
  18. import jnpf.base.service.DictionaryDataService;
  19. import jnpf.base.service.DictionaryTypeService;
  20. import jnpf.base.service.SuperServiceImpl;
  21. import jnpf.base.util.SentMessageUtil;
  22. import jnpf.config.ConfigValueUtil;
  23. import jnpf.flowable.model.trigger.TriggerModel;
  24. import jnpf.message.entity.*;
  25. import jnpf.message.mapper.MessageMapper;
  26. import jnpf.message.model.NoticePagination;
  27. import jnpf.message.model.SentMessageForm;
  28. import jnpf.message.model.message.MessageInfoVO;
  29. import jnpf.message.model.message.NoticeVO;
  30. import jnpf.message.model.message.PaginationMessage;
  31. import jnpf.message.service.*;
  32. import jnpf.message.util.OnlineUserProvider;
  33. import jnpf.message.util.PushMessageUtil;
  34. import jnpf.permission.entity.UserEntity;
  35. import jnpf.permission.service.UserService;
  36. import jnpf.util.*;
  37. import lombok.extern.slf4j.Slf4j;
  38. import org.apache.commons.lang3.StringUtils;
  39. import org.apache.commons.text.StringSubstitutor;
  40. import org.springframework.beans.BeanUtils;
  41. import org.springframework.beans.factory.annotation.Autowired;
  42. import org.springframework.stereotype.Service;
  43. import java.util.*;
  44. import java.util.concurrent.Callable;
  45. import java.util.concurrent.Future;
  46. import java.util.stream.Collectors;
  47. /**
  48. * 消息实例
  49. *
  50. * @author JNPF开发平台组
  51. * @version V3.1.0
  52. * @copyright 引迈信息技术有限公司
  53. * @date 2019年9月27日 上午9:18
  54. */
  55. @Service
  56. @Slf4j
  57. public class MessageServiceImpl extends SuperServiceImpl<MessageMapper, MessageEntity> implements MessageService {
  58. @Autowired
  59. private MessagereceiveService messagereceiveService;
  60. @Autowired
  61. private MessageMonitorService messageMonitorService;
  62. @Autowired
  63. private RedisUtil redisUtil;
  64. @Autowired
  65. private SentMessageUtil sentMessageUtil;
  66. @Autowired
  67. private SendMessageConfigService sendMessageConfigService;
  68. @Autowired
  69. private SendConfigTemplateService sendConfigTemplateService;
  70. @Autowired
  71. private MessageTemplateConfigService messageTemplateConfigService;
  72. @Autowired
  73. private UserService userService;
  74. @Autowired
  75. private DictionaryTypeService dictionaryTypeService;
  76. @Autowired
  77. private DictionaryDataService dictionaryDataService;
  78. @Autowired
  79. private ConfigValueUtil configValueUtil;
  80. @Override
  81. public List<MessageEntity> getNoticeList(NoticePagination pagination) {
  82. // 定义变量判断是否需要使用修改时间倒序
  83. QueryWrapper<MessageEntity> queryWrapper = new QueryWrapper<>();
  84. //关键词(消息标题)
  85. if (!StringUtils.isEmpty(pagination.getKeyword())) {
  86. queryWrapper.lambda().like(MessageEntity::getTitle, pagination.getKeyword());
  87. }
  88. // 类型
  89. if (CollectionUtil.isNotEmpty(pagination.getType())) {
  90. queryWrapper.lambda().in(MessageEntity::getCategory, pagination.getType());
  91. }
  92. // 状态
  93. if (CollectionUtil.isNotEmpty(pagination.getEnabledMark())) {
  94. queryWrapper.lambda().in(MessageEntity::getEnabledMark, pagination.getEnabledMark());
  95. } else {
  96. queryWrapper.lambda().and(t -> t.ne(MessageEntity::getEnabledMark, 3)
  97. .or().isNull(MessageEntity::getEnabledMark));
  98. queryWrapper.lambda().ne(MessageEntity::getEnabledMark, -1);
  99. }
  100. // 发布人
  101. if (CollectionUtil.isNotEmpty(pagination.getReleaseUser())) {
  102. queryWrapper.lambda().in(MessageEntity::getLastModifyUserId, pagination.getReleaseUser());
  103. }
  104. // 发布时间
  105. if (CollectionUtil.isNotEmpty(pagination.getReleaseTime())) {
  106. queryWrapper.lambda().between(MessageEntity::getLastModifyTime, new Date(pagination.getReleaseTime().get(0)), new Date(pagination.getReleaseTime().get(1)));
  107. }
  108. // 失效时间
  109. if (CollectionUtil.isNotEmpty(pagination.getExpirationTime())) {
  110. queryWrapper.lambda().between(MessageEntity::getExpirationTime, new Date(pagination.getExpirationTime().get(0)), new Date(pagination.getExpirationTime().get(1)));
  111. }
  112. // 创建人
  113. if (CollectionUtil.isNotEmpty(pagination.getCreatorUser())) {
  114. queryWrapper.lambda().in(MessageEntity::getCreatorUserId, pagination.getCreatorUser());
  115. }
  116. // 创建时间
  117. if (CollectionUtil.isNotEmpty(pagination.getCreatorTime())) {
  118. queryWrapper.lambda().between(MessageEntity::getCreatorTime, new Date(pagination.getCreatorTime().get(0)), new Date(pagination.getCreatorTime().get(1)));
  119. }
  120. //默认排序
  121. queryWrapper.lambda().orderByAsc(MessageEntity::getEnabledMark).orderByDesc(MessageEntity::getLastModifyTime).orderByDesc(MessageEntity::getCreatorTime);
  122. queryWrapper.lambda().select(MessageEntity::getId, MessageEntity::getCreatorUserId, MessageEntity::getEnabledMark,
  123. MessageEntity::getLastModifyTime, MessageEntity::getTitle, MessageEntity::getCreatorTime,
  124. MessageEntity::getLastModifyUserId, MessageEntity::getExpirationTime, MessageEntity::getCategory);
  125. Page<MessageEntity> page = new Page<>(pagination.getCurrentPage(), pagination.getPageSize());
  126. IPage<MessageEntity> userIPage = this.page(page, queryWrapper);
  127. return pagination.setData(userIPage.getRecords(), page.getTotal());
  128. }
  129. @Override
  130. public List<MessageEntity> getNoticeList() {
  131. QueryWrapper<MessageEntity> queryWrapper = new QueryWrapper<>();
  132. queryWrapper.lambda().eq(MessageEntity::getEnabledMark, 1);
  133. queryWrapper.lambda().orderByAsc(MessageEntity::getSortCode);
  134. return this.baseMapper.selectList(queryWrapper);
  135. }
  136. @Override
  137. public List<MessageEntity> getDashboardNoticeList(List<String> typeList) {
  138. List<MessageEntity> list = new ArrayList<>(16);
  139. // 判断哪些消息是自己接收的
  140. QueryWrapper<MessageReceiveEntity> queryWrapper = new QueryWrapper<>();
  141. queryWrapper.lambda().eq(MessageReceiveEntity::getUserId, UserProvider.getUser().getUserId());
  142. queryWrapper.lambda().eq(MessageReceiveEntity::getType, 1);
  143. List<MessageReceiveEntity> receiveEntities = messagereceiveService.list(queryWrapper);
  144. for (int i = 0; i < receiveEntities.size(); i++) {
  145. // 得到message
  146. MessageReceiveEntity messageReceiveEntity = receiveEntities.get(i);
  147. try {
  148. MessageEntity entity = JsonUtil.getJsonToBean(messageReceiveEntity.getBodyText(), MessageEntity.class);
  149. if (entity != null) {
  150. if (StringUtil.isNotEmpty(entity.getId())) {
  151. MessageEntity messageEntity = this.getInfo(entity.getId());
  152. if (messageEntity != null) {
  153. if ((typeList != null && typeList.size() > 0 && typeList.contains(messageEntity.getCategory()) || typeList == null || typeList.size() == 0)) {
  154. if (Objects.equals(messageEntity.getEnabledMark(), 1)
  155. && (entity.getExpirationTime() == null || entity.getExpirationTime().getTime() > System.currentTimeMillis())) {
  156. messageEntity.setId(messageReceiveEntity.getId());
  157. list.add(messageEntity);
  158. }
  159. }
  160. }
  161. } else {
  162. entity.setId(messageReceiveEntity.getId());
  163. list.add(entity);
  164. }
  165. }
  166. } catch (Exception e) {
  167. MessageEntity messageEntity = JsonUtil.getJsonToBean(messageReceiveEntity, MessageEntity.class);
  168. list.add(messageEntity);
  169. }
  170. if (list.size() > 49) {
  171. break;
  172. }
  173. }
  174. list = list.stream().sorted(Comparator.comparing(MessageEntity::getLastModifyTime, Comparator.nullsFirst(Comparator.naturalOrder())).reversed()).collect(Collectors.toList());
  175. return list;
  176. }
  177. @Override
  178. public List<MessageReceiveEntity> getMessageList3(PaginationMessage pagination) {
  179. PaginationMessage paginationMessage = BeanUtil.copyProperties(pagination, PaginationMessage.class);
  180. List<MessageReceiveEntity> messageColumnList = getMessageColumnList(paginationMessage,
  181. MessageReceiveEntity::getId,
  182. MessageReceiveEntity::getUserId,
  183. MessageReceiveEntity::getType,
  184. MessageReceiveEntity::getTitle,
  185. MessageReceiveEntity::getFlowType,
  186. MessageReceiveEntity::getIsRead,
  187. MessageReceiveEntity::getSortCode,
  188. MessageReceiveEntity::getCreatorTime,
  189. MessageReceiveEntity::getCreatorUserId);
  190. return pagination.setData(messageColumnList, paginationMessage.getTotal());
  191. }
  192. @Override
  193. public List<MessageReceiveEntity> getMessageColumnList(PaginationMessage pagination, SFunction<MessageReceiveEntity, ?>... columns) {
  194. QueryWrapper<MessageReceiveEntity> queryWrapper = new QueryWrapper<>();
  195. queryWrapper.lambda().select(MessageReceiveEntity::getId);
  196. if (StringUtil.isNotEmpty(pagination.getUserId())) {
  197. queryWrapper.lambda().eq(MessageReceiveEntity::getUserId, pagination.getUserId());
  198. } else {
  199. queryWrapper.lambda().eq(MessageReceiveEntity::getUserId, UserProvider.getLoginUserId());
  200. }
  201. if (pagination.getType() != null) {
  202. queryWrapper.lambda().eq(MessageReceiveEntity::getType, pagination.getType());
  203. }
  204. if (pagination.getNotType() != null) {
  205. queryWrapper.lambda().ne(MessageReceiveEntity::getType, pagination.getNotType());
  206. }
  207. if (pagination.getIsRead() != null) {
  208. queryWrapper.lambda().eq(MessageReceiveEntity::getIsRead, pagination.getIsRead());
  209. }
  210. if (StringUtil.isNotEmpty(pagination.getKeyword())) {
  211. queryWrapper.lambda().like(MessageReceiveEntity::getTitle, pagination.getKeyword());
  212. }
  213. queryWrapper.lambda().orderByDesc(MessageReceiveEntity::getCreatorTime);
  214. Page<MessageReceiveEntity> page = new Page<>(pagination.getCurrentPage(), pagination.getPageSize());
  215. IPage<MessageReceiveEntity> userIPage = messagereceiveService.page(page, queryWrapper);
  216. List<String> ids = userIPage.getRecords().stream().map(MessageReceiveEntity::getId).collect(Collectors.toList());
  217. List<MessageReceiveEntity> list = new ArrayList<>();
  218. if (CollectionUtil.isNotEmpty(ids)) {
  219. QueryWrapper<MessageReceiveEntity> wrapper = new QueryWrapper<>();
  220. if (columns != null && columns.length > 0) {
  221. wrapper.lambda().select(columns);
  222. }
  223. wrapper.lambda().in(MessageReceiveEntity::getId, ids);
  224. wrapper.lambda().orderByDesc(MessageReceiveEntity::getCreatorTime);
  225. list = messagereceiveService.list(wrapper);
  226. }
  227. return pagination.setData(list, page.getTotal());
  228. }
  229. @Override
  230. public List<MessageReceiveEntity> getMessageList(Pagination pagination) {
  231. PaginationMessage paginationMessage = BeanUtil.copyProperties(pagination, PaginationMessage.class);
  232. return this.getMessageList3(paginationMessage);
  233. }
  234. @Override
  235. public MessageEntity getInfo(String id) {
  236. QueryWrapper<MessageEntity> queryWrapper = new QueryWrapper<>();
  237. queryWrapper.lambda().eq(MessageEntity::getId, id);
  238. return this.getOne(queryWrapper);
  239. }
  240. @Override
  241. public MessageEntity getInfoDefault(int type) {
  242. QueryWrapper<MessageEntity> queryWrapper = new QueryWrapper<>();
  243. queryWrapper.lambda().eq(MessageEntity::getEnabledMark, 1);
  244. if (type == 1) {
  245. queryWrapper.lambda().orderByDesc(MessageEntity::getCreatorTime);
  246. } else {
  247. queryWrapper.lambda().orderByDesc(MessageEntity::getLastModifyTime);
  248. }
  249. // 只查询id
  250. queryWrapper.lambda().select(MessageEntity::getId, MessageEntity::getTitle, MessageEntity::getCreatorTime);
  251. List<MessageEntity> list = this.page(new Page<>(1, 1, false), queryWrapper).getRecords();
  252. MessageEntity entity = new MessageEntity();
  253. if (list.size() > 0) {
  254. entity = list.get(0);
  255. }
  256. return entity;
  257. }
  258. @Override
  259. @DSTransactional
  260. public void delete(MessageEntity entity) {
  261. entity.setEnabledMark(-1);
  262. this.updateById(entity);
  263. this.removeById(entity.getId());
  264. }
  265. @Override
  266. public void create(MessageEntity entity) {
  267. entity.setId(RandomUtil.uuId());
  268. entity.setBodyText(XSSEscape.escapeImgOnlyBase64(entity.getBodyText()));
  269. entity.setEnabledMark(0);
  270. entity.setCreatorUserId(UserProvider.getUser().getUserId());
  271. this.save(entity);
  272. }
  273. @Override
  274. public boolean update(String id, MessageEntity entity) {
  275. entity.setId(id);
  276. entity.setBodyText(XSSEscape.escapeImgOnlyBase64(entity.getBodyText()));
  277. entity.setCreatorUserId(UserProvider.getUser().getUserId());
  278. entity.setLastModifyUserId(null);
  279. entity.setLastModifyTime(null);
  280. return this.updateById(entity);
  281. }
  282. @Override
  283. public MessageReceiveEntity messageRead(String messageId) {
  284. String userId = UserProvider.getUser().getUserId();
  285. QueryWrapper<MessageReceiveEntity> queryWrapper = new QueryWrapper<>();
  286. queryWrapper.lambda().eq(MessageReceiveEntity::getUserId, userId).eq(MessageReceiveEntity::getId, messageId);
  287. MessageReceiveEntity entity = messagereceiveService.getOne(queryWrapper);
  288. if (entity != null) {
  289. entity.setIsRead(1);
  290. messagereceiveService.updateById(entity);
  291. }
  292. return entity;
  293. }
  294. @Override
  295. @DSTransactional
  296. public void messageRead(List<String> idList) {
  297. String userId = UserProvider.getUser().getUserId();
  298. QueryWrapper<MessageReceiveEntity> queryWrapper = new QueryWrapper<>();
  299. queryWrapper.lambda().select(MessageReceiveEntity::getId)
  300. .eq(MessageReceiveEntity::getUserId, userId).eq(MessageReceiveEntity::getIsRead, 0);
  301. // queryWrapper.lambda().in(MessageReceiveEntity::getMessageId,idList);
  302. List<MessageReceiveEntity> entitys = messagereceiveService.list(queryWrapper);
  303. if (entitys.size() > 0) {
  304. for (MessageReceiveEntity entity : entitys) {
  305. entity.setIsRead(1);
  306. messagereceiveService.updateById(entity);
  307. }
  308. }
  309. }
  310. @Override
  311. @DSTransactional
  312. public void deleteRecord(List<String> messageIds) {
  313. // 删除已读表
  314. QueryWrapper<MessageReceiveEntity> queryWrapper = new QueryWrapper<>();
  315. if (messageIds.size() > 0) {
  316. queryWrapper.lambda().in(MessageReceiveEntity::getId, messageIds);
  317. }
  318. // 通过id删除无需判断接收人
  319. queryWrapper.lambda().eq(MessageReceiveEntity::getUserId, UserProvider.getLoginUserId());
  320. messagereceiveService.remove(queryWrapper);
  321. }
  322. @Override
  323. public int getUnreadCount(String userId, Integer type) {
  324. int result = this.baseMapper.getUnreadCount(userId, type);
  325. return result;
  326. }
  327. @Override
  328. public boolean sentNotice(List<String> toUserIds, MessageEntity entity) {
  329. // 存到redis中的key对象
  330. UserInfo userInfo = UserProvider.getUser();
  331. List<String> idList = new ArrayList<>();
  332. // 修改发送状态
  333. entity.setEnabledMark(1);
  334. entity.setLastModifyTime(new Date());
  335. entity.setLastModifyUserId(userInfo.getUserId());
  336. this.updateById(entity);
  337. // 存到redis,生成Redis的key
  338. Callable executeInsert = () -> {
  339. executeInsert(toUserIds, idList);
  340. return true;
  341. };
  342. Future<Boolean> submit = ThreadPoolExecutorUtil.getExecutor().submit(executeInsert);
  343. try {
  344. if (submit.get()) {
  345. // 执行发送公告操作
  346. Runnable runnable = () -> executeBatch(idList, entity, userInfo);
  347. ThreadPoolExecutorUtil.getExecutor().submit(runnable);
  348. }
  349. return true;
  350. } catch (Exception e) {
  351. // 还原公告状态
  352. entity.setEnabledMark(0);
  353. entity.setLastModifyTime(null);
  354. entity.setLastModifyUserId(null);
  355. this.updateById(entity);
  356. }
  357. return false;
  358. }
  359. /**
  360. * 数据存到redis中
  361. *
  362. * @param toUserIds 接受者id
  363. */
  364. private void executeInsert(List<String> toUserIds, List<String> idList) throws Exception {
  365. List<String> key = new ArrayList<>();
  366. try {
  367. int frequency = 10000;
  368. int count = toUserIds.size() / frequency + 1;
  369. if (toUserIds.size() < 1) return;
  370. for (int i = 0; i < count; i++) {
  371. // 生成redis的key
  372. String cacheKey = RandomUtil.uuId() + toUserIds.get(i);
  373. // 存到redis
  374. int endSize = Math.min(((i + 1) * frequency), toUserIds.size());
  375. redisUtil.insert(cacheKey, toUserIds.subList(i * frequency, endSize));
  376. key.add(cacheKey);
  377. }
  378. } catch (Exception e) {
  379. key.forEach(k -> redisUtil.remove(k));
  380. key.clear();
  381. throw new Exception();
  382. }
  383. idList.addAll(key);
  384. }
  385. /**
  386. * 执行发送操作
  387. *
  388. * @param idList 存到redis中的key
  389. * @param entity
  390. * @param userInfo
  391. */
  392. private void executeBatch(List<String> idList, MessageEntity entity, UserInfo userInfo) {
  393. if (idList.size() == 0 || "3".equals(String.valueOf(entity.getRemindCategory()))) {
  394. return;
  395. }
  396. SentMessageForm sentMessageForm = new SentMessageForm();
  397. List<String> toUserId = new ArrayList<>();
  398. for (String cacheKey : idList) {
  399. List<String> cacheValue = (List) redisUtil.get(cacheKey, 0, -1);
  400. toUserId.addAll(cacheValue);
  401. }
  402. sentMessageForm.setToUserIds(toUserId);
  403. sentMessageForm.setTitle(entity.getTitle());
  404. sentMessageForm.setContent(entity.getBodyText());
  405. sentMessageForm.setContentMsg(Collections.EMPTY_MAP);
  406. sentMessageForm.setUserInfo(userInfo);
  407. sentMessageForm.setType(1);
  408. sentMessageForm.setId(entity.getId());
  409. // 站内信
  410. if ("1".equals(String.valueOf(entity.getRemindCategory()))) {
  411. message(sentMessageForm);
  412. } else if ("2".equals(String.valueOf(entity.getRemindCategory()))) {
  413. SendMessageConfigEntity sendMessageConfigEntity = sendMessageConfigService.getInfo(entity.getSendConfigId());
  414. if (sendMessageConfigEntity != null) {
  415. List<SendConfigTemplateEntity> configTemplateEntityList = sendConfigTemplateService.getDetailListByParentId(sendMessageConfigEntity.getId());
  416. for (SendConfigTemplateEntity sendConfigTemplateEntity : configTemplateEntityList) {
  417. Map<String, String> map = new HashMap<>();
  418. map.put("Title", entity.getTitle());
  419. map.put("Content", entity.getBodyText());
  420. map.put("Remark", entity.getExcerpt());
  421. Map<String, Object> paramMap = new HashMap<>();
  422. paramMap.put("@title", entity.getTitle());
  423. paramMap.put("@Content", entity.getBodyText());
  424. paramMap.put("@Remark", entity.getExcerpt());
  425. switch (sendConfigTemplateEntity.getMessageType()) {
  426. case "1":
  427. MessageTemplateConfigEntity configEntity = messageTemplateConfigService.getInfo(sendConfigTemplateEntity.getTemplateId());
  428. if (configEntity != null) {
  429. sentMessageForm.setTitle(configEntity.getTitle());
  430. }
  431. message(sentMessageForm);
  432. break;
  433. case "2":
  434. // 邮件
  435. sentMessageUtil.SendMail(toUserId, userInfo, "2", sendConfigTemplateEntity, new HashMap<>(), map);
  436. break;
  437. case "3":
  438. // 发送短信
  439. sentMessageUtil.sendSms(toUserId, userInfo, sendConfigTemplateEntity, paramMap, new HashMap<>());
  440. break;
  441. case "4":
  442. // 钉钉
  443. JSONObject jsonObject1 = sentMessageUtil.SendDingTalk(toUserId, userInfo, "4", sendConfigTemplateEntity, new HashMap<>(), map);
  444. if (!(Boolean) jsonObject1.get("code")) {
  445. log.error("发送企业微信消息失败,错误:" + jsonObject1.get("error"));
  446. }
  447. break;
  448. case "5":
  449. // 企业微信
  450. JSONObject jsonObject = sentMessageUtil.SendQyWebChat(toUserId, userInfo, "5", sendConfigTemplateEntity, new HashMap<>(), map);
  451. if (!(Boolean) jsonObject.get("code")) {
  452. log.error("发送企业微信消息失败,错误:" + jsonObject.get("error"));
  453. }
  454. break;
  455. case "6":
  456. // webhook
  457. sentMessageUtil.SendWebHook(null, userInfo, sendConfigTemplateEntity, new HashMap<>(), map);
  458. break;
  459. case "7":
  460. // 微信公众号
  461. sentMessageUtil.SendWXGzhChat(toUserId, userInfo, "7", sendConfigTemplateEntity, new HashMap<>(), paramMap);
  462. break;
  463. default:
  464. break;
  465. }
  466. }
  467. }
  468. }
  469. }
  470. @Override
  471. public void sentMessage(List<String> toUserIds, String title) {
  472. this.sentMessage(toUserIds, title, null);
  473. }
  474. @Override
  475. @DSTransactional
  476. public void sentMessage(List<String> toUserIds, String title, String bodyText) {
  477. UserInfo userInfo = UserProvider.getUser();
  478. MessageReceiveEntity messageReceiveEntity = new MessageReceiveEntity();
  479. messageReceiveEntity.setTitle(title);
  480. messageReceiveEntity.setType(2);
  481. messageReceiveEntity.setFlowType(1);
  482. messageReceiveEntity.setIsRead(0);
  483. Map<String, MessageReceiveEntity> map = new HashMap<>();
  484. for (String item : toUserIds) {
  485. MessageReceiveEntity messageReceiveEntitys = new MessageReceiveEntity();
  486. BeanUtils.copyProperties(messageReceiveEntity, messageReceiveEntitys);
  487. messageReceiveEntitys.setId(RandomUtil.uuId());
  488. messageReceiveEntitys.setUserId(item);
  489. messageReceiveEntitys.setBodyText(bodyText);
  490. messagereceiveService.save(messageReceiveEntitys);
  491. map.put(messageReceiveEntitys.getUserId(), messageReceiveEntitys);
  492. }
  493. //消息推送 - PC端
  494. PushMessageUtil.pushMessage(map, userInfo, 2);
  495. }
  496. @Override
  497. @DSTransactional
  498. public void sentMessage(List<String> toUserIds, String title, String bodyText, Map<String, String> contentMsg, UserInfo userInfo) {
  499. MessageReceiveEntity messageReceiveEntity = new MessageReceiveEntity();
  500. messageReceiveEntity.setTitle(title);
  501. messageReceiveEntity.setType(2);
  502. messageReceiveEntity.setFlowType(1);
  503. messageReceiveEntity.setIsRead(0);
  504. Map<String, MessageReceiveEntity> map = new HashMap<>();
  505. for (String item : toUserIds) {
  506. MessageReceiveEntity messageReceiveEntitys = new MessageReceiveEntity();
  507. BeanUtils.copyProperties(messageReceiveEntity, messageReceiveEntitys);
  508. messageReceiveEntitys.setId(RandomUtil.uuId());
  509. messageReceiveEntitys.setUserId(item);
  510. String msg = contentMsg.get(item) != null ? contentMsg.get(item) : "{}";
  511. messageReceiveEntitys.setBodyText(msg);
  512. messageReceiveEntitys.setCreatorUserId(userInfo.getUserId());
  513. messageReceiveEntitys.setCreatorTime(new Date());
  514. messagereceiveService.save(messageReceiveEntitys);
  515. map.put(messageReceiveEntitys.getUserId(), messageReceiveEntitys);
  516. }
  517. //消息推送 - PC端
  518. PushMessageUtil.pushMessage(map, userInfo, 2);
  519. }
  520. @Override
  521. @DSTransactional
  522. public void sentMessage(List<String> toUserIds, String title, String bodyText, UserInfo userInfo, Integer source, Integer type) {
  523. sentMessage(toUserIds, title, bodyText, userInfo, source, type, false);
  524. }
  525. @Override
  526. @DSTransactional
  527. public void sentMessage(List<String> toUserIds, String title, String bodyText, UserInfo userInfo, Integer source, Integer type, boolean testMessage) {
  528. MessageReceiveEntity messageReceiveEntity = new MessageReceiveEntity();
  529. messageReceiveEntity.setTitle(title);
  530. messageReceiveEntity.setType(source);
  531. messageReceiveEntity.setFlowType(1);
  532. messageReceiveEntity.setBodyText(bodyText);
  533. messageReceiveEntity.setIsRead(0);
  534. Map<String, MessageReceiveEntity> map = new HashMap<>();
  535. for (String item : toUserIds) {
  536. MessageReceiveEntity messageReceiveEntitys = new MessageReceiveEntity();
  537. BeanUtils.copyProperties(messageReceiveEntity, messageReceiveEntitys);
  538. messageReceiveEntitys.setId(RandomUtil.uuId());
  539. messageReceiveEntitys.setUserId(item);
  540. messagereceiveService.save(messageReceiveEntitys);
  541. map.put(messageReceiveEntitys.getUserId(), messageReceiveEntitys);
  542. }
  543. //消息监控写入
  544. MessageMonitorEntity monitorEntity = new MessageMonitorEntity();
  545. monitorEntity.setId(RandomUtil.uuId());
  546. monitorEntity.setTitle(title);
  547. monitorEntity.setMessageType(String.valueOf(type));
  548. monitorEntity.setMessageSource(String.valueOf(source));
  549. monitorEntity.setReceiveUser(JsonUtil.getObjectToString(toUserIds));
  550. monitorEntity.setSendTime(DateUtil.getNowDate());
  551. monitorEntity.setCreatorTime(DateUtil.getNowDate());
  552. monitorEntity.setCreatorUserId(userInfo.getUserId());
  553. messageMonitorService.create(monitorEntity);
  554. PushMessageUtil.pushMessage(map, userInfo, source);
  555. }
  556. @Override
  557. public void sentFlowMessage(List<String> toUserIds, MessageTemplateEntity entity, String content) {
  558. if (entity != null) {
  559. // 消息标题
  560. String title = entity.getTitle();
  561. this.sentMessage(toUserIds, title, content);
  562. }
  563. }
  564. @Override
  565. public void logoutWebsocketByToken(String token, String userId) {
  566. if (StringUtil.isNotEmpty(token)) {
  567. OnlineUserProvider.removeWebSocketByToken(token.split(","));
  568. } else {
  569. OnlineUserProvider.removeWebSocketByUser(userId);
  570. }
  571. }
  572. @Override
  573. public List<String> sentScheduleMessage(SentMessageForm sentMessageForm, String type) {
  574. List<String> errList = new ArrayList<>();
  575. UserInfo userInfo = sentMessageForm.getUserInfo();
  576. String templateId = sentMessageForm.getTemplateId();
  577. String title = sentMessageForm.getTitle();
  578. List<String> toUserIds = sentMessageForm.getToUserIds();
  579. //获取发送配置详情
  580. SendMessageConfigEntity configEntity = sendMessageConfigService.getInfoByEnCode(templateId);
  581. if (configEntity != null) {
  582. templateId = configEntity.getId();
  583. } else {
  584. configEntity = sendMessageConfigService.getInfo(templateId);
  585. }
  586. List<SendConfigTemplateEntity> list = sendConfigTemplateService.getDetailListByParentId(templateId);
  587. if (configEntity != null) {
  588. for (SendConfigTemplateEntity sendConfigTemplateEntity : list) {
  589. Map<String, Object> objectMap = new HashMap<>(sentMessageForm.getParameterMap());
  590. Map<String, Object> parameterMap = new HashMap<>();
  591. for (String key : objectMap.keySet()) {
  592. if (key.contains(sendConfigTemplateEntity.getId())) {
  593. parameterMap.put(key.substring(sendConfigTemplateEntity.getId().length()), objectMap.get(key));
  594. }
  595. }
  596. parameterMap.putAll(objectMap);
  597. Map<String, String> contentMsg = new HashMap<>();
  598. for (String key : parameterMap.keySet()) {
  599. contentMsg.put(key, String.valueOf(parameterMap.get(key)));
  600. }
  601. String sendType = sendConfigTemplateEntity.getMessageType();
  602. switch (sendType) {
  603. case "1":
  604. MessageTemplateConfigEntity templateConfigEntity = messageTemplateConfigService.getInfo(sendConfigTemplateEntity.getTemplateId());
  605. String messageTitle = StringUtil.isNotEmpty(templateConfigEntity.getTitle()) ? templateConfigEntity.getTitle() : "";
  606. String content = StringUtil.isNotEmpty(templateConfigEntity.getContent()) ? templateConfigEntity.getContent() : "";
  607. StringSubstitutor strSubstitutor = new StringSubstitutor(parameterMap, "{", "}");
  608. messageTitle = strSubstitutor.replace(messageTitle);
  609. content = strSubstitutor.replace(content);
  610. sentMessageForm.setTitle(messageTitle);
  611. sentMessageForm.setContent(content);
  612. // 站内消息
  613. message(sentMessageForm);
  614. // 通知触发
  615. try {
  616. String url = configValueUtil.getApiDomain() + "/api/workflow/trigger/MsgExecute";
  617. TriggerModel model = new TriggerModel();
  618. model.setUserInfo(userInfo);
  619. model.setId(templateConfigEntity.getId());
  620. HttpRequest request = HttpRequest.of(url).method(Method.POST).body(JsonUtil.getObjectToString(model));
  621. request.header(Constants.AUTHORIZATION, userInfo.getToken());
  622. request.execute().body();
  623. }catch (Exception e) {
  624. log.error("消息触发流程报错信息:"+e.getMessage());
  625. }
  626. break;
  627. case "2":
  628. // 邮件
  629. List<String> mailErrs = sentMessageUtil.SendMail(toUserIds, userInfo, sendType, sendConfigTemplateEntity, new HashMap<>(), contentMsg);
  630. errList.addAll(mailErrs.stream().distinct().collect(Collectors.toList()));
  631. break;
  632. case "3":
  633. // 发送短信
  634. List<String> smsErrs = sentMessageUtil.sendSms(toUserIds, userInfo, sendConfigTemplateEntity, parameterMap, new HashMap<>());
  635. errList.addAll(smsErrs.stream().distinct().collect(Collectors.toList()));
  636. break;
  637. case "4":
  638. // 钉钉
  639. JSONObject jsonObject1 = sentMessageUtil.SendDingTalk(toUserIds, userInfo, sendType, sendConfigTemplateEntity, new HashMap<>(), contentMsg);
  640. if (!(Boolean) jsonObject1.get("code")) {
  641. log.error("发送企业微信消息失败,错误:" + jsonObject1.get("error"));
  642. errList.add("发送钉钉消息失败,错误:" + jsonObject1.get("error"));
  643. }
  644. break;
  645. case "5":
  646. // 企业微信
  647. JSONObject jsonObject = sentMessageUtil.SendQyWebChat(toUserIds, userInfo, sendType, sendConfigTemplateEntity, new HashMap<>(), contentMsg);
  648. if (!(Boolean) jsonObject.get("code")) {
  649. log.error("发送企业微信消息失败,错误:" + jsonObject.get("error"));
  650. errList.add("发送企业微信消息失败,错误:" + jsonObject.get("error"));
  651. }
  652. break;
  653. case "6":
  654. // webhook
  655. sentMessageUtil.SendWebHook(sendType, userInfo, sendConfigTemplateEntity, new HashMap<>(), contentMsg);
  656. break;
  657. case "7":
  658. // 微信公众号
  659. JSONObject jsonObject2 = sentMessageUtil.SendWXGzhChat(toUserIds, userInfo, sendType, sendConfigTemplateEntity, new HashMap<>(), parameterMap);
  660. if (!(Boolean) jsonObject2.get("code")) {
  661. errList.add("发送微信公众号消息失败,错误:" + jsonObject2.get("error"));
  662. }
  663. break;
  664. default:
  665. break;
  666. }
  667. }
  668. }
  669. return errList;
  670. }
  671. @Override
  672. public Boolean updateEnabledMark() {
  673. QueryWrapper<MessageEntity> queryWrapper = new QueryWrapper<>();
  674. queryWrapper.lambda().and(t -> t.eq(MessageEntity::getEnabledMark, 1).lt(MessageEntity::getExpirationTime, new Date()));
  675. List<MessageEntity> list = this.list(queryWrapper);
  676. list.forEach(t -> {
  677. t.setEnabledMark(2);
  678. this.updateById(t);
  679. });
  680. return true;
  681. }
  682. private void message(SentMessageForm sentMessageForm) {
  683. List<String> toUserIds = sentMessageForm.getToUserIds();
  684. Integer type = sentMessageForm.getType();
  685. String title = sentMessageForm.getTitle();
  686. String content = sentMessageForm.getContent();
  687. String bodyText = Objects.equals(type, 3) ? content : JsonUtil.getObjectToString(sentMessageForm.getContentMsg());
  688. UserInfo userInfo = sentMessageForm.getUserInfo();
  689. MessageReceiveEntity messageReceiveEntity = new MessageReceiveEntity();
  690. messageReceiveEntity.setIsRead(0);
  691. messageReceiveEntity.setId(RandomUtil.uuId());
  692. messageReceiveEntity.setType(sentMessageForm.getType());
  693. if (type != null) {
  694. messageReceiveEntity.setId(sentMessageForm.getId());
  695. messageReceiveEntity.setType(type);
  696. messageReceiveEntity.setCreatorUserId(userInfo.getUserId());
  697. messageReceiveEntity.setCreatorTime(DateUtil.getNowDate());
  698. }
  699. //消息监控写入
  700. MessageMonitorEntity monitorEntity = new MessageMonitorEntity();
  701. MessageEntity messageEntity = this.getInfo(sentMessageForm.getId());
  702. if (!"1".equals(String.valueOf(messageReceiveEntity.getType()))) {
  703. monitorEntity.setMessageSource(sentMessageForm.getType() + "");
  704. messageReceiveEntity.setFlowType(sentMessageForm.getFlowType());
  705. monitorEntity.setTitle(title);
  706. } else {
  707. monitorEntity.setMessageSource("1");
  708. title = title.replaceAll("\\{@Title}", messageEntity.getTitle())
  709. .replaceAll("\\{@CreatorUserName}", userInfo.getUserName())
  710. .replaceAll("\\{@SendTime}", DateUtil.getNow().substring(11))
  711. .replaceAll("\\{@Content}", messageEntity.getBodyText())
  712. .replaceAll("\\{@Remark}", StringUtil.isNotEmpty(messageEntity.getExcerpt()) ? messageEntity.getExcerpt() : "");
  713. monitorEntity.setTitle(title);
  714. MessageEntity messageEntity2 = new MessageEntity();
  715. messageEntity2.setId(messageEntity.getId());
  716. bodyText = JsonUtil.getObjectToString(messageEntity2);
  717. }
  718. Map<String, MessageReceiveEntity> map = new HashMap<>();
  719. for (String item : toUserIds) {
  720. MessageReceiveEntity messageReceiveEntitys = new MessageReceiveEntity();
  721. BeanUtils.copyProperties(messageReceiveEntity, messageReceiveEntitys);
  722. messageReceiveEntitys.setId(RandomUtil.uuId());
  723. messageReceiveEntitys.setUserId(item);
  724. messageReceiveEntitys.setTitle(title);
  725. // if(ObjectUtil.isNotEmpty(messageEntity)) {
  726. // messageReceiveEntitys.setTitle(title.replaceAll("\\{@Title}", messageEntity.getTitle())
  727. // .replaceAll("\\{@CreatorUserName}", userInfo.getUserName())
  728. // .replaceAll("\\{@Content}", messageEntity.getBodyText())
  729. // .replaceAll("\\{@Remark}", StringUtil.isNotEmpty(messageEntity.getExcerpt()) ? messageEntity.getExcerpt() : ""));
  730. // }
  731. messageReceiveEntitys.setBodyText(bodyText);
  732. messagereceiveService.save(messageReceiveEntitys);
  733. map.put(messageReceiveEntitys.getUserId(), messageReceiveEntitys);
  734. }
  735. monitorEntity.setId(RandomUtil.uuId());
  736. monitorEntity.setMessageType("1");
  737. monitorEntity.setReceiveUser(JsonUtil.getObjectToString(toUserIds));
  738. monitorEntity.setSendTime(DateUtil.getNowDate());
  739. monitorEntity.setCreatorTime(DateUtil.getNowDate());
  740. monitorEntity.setCreatorUserId(userInfo.getUserId());
  741. monitorEntity.setContent(content);
  742. messageMonitorService.create(monitorEntity);
  743. //消息推送 - PC端
  744. PushMessageUtil.pushMessage(map, userInfo, type != null ? type : 2);
  745. }
  746. public List<NoticeVO> getNoticeList(List<String> list) {
  747. List<MessageEntity> dashboardNoticeList = this.getDashboardNoticeList(list);
  748. List<UserEntity> userList = userService.getUserName(dashboardNoticeList.stream().map(MessageEntity::getCreatorUserId).collect(Collectors.toList()));
  749. DictionaryTypeEntity dictionaryTypeEntity = dictionaryTypeService.getInfoByEnCode("NoticeType");
  750. List<DictionaryDataEntity> noticeType = dictionaryDataService.getDicList(dictionaryTypeEntity.getId());
  751. dashboardNoticeList.forEach(t -> {
  752. // 转换创建人、发布人
  753. UserEntity user = userList.stream().filter(ul -> ul.getId().equals(t.getCreatorUserId())).findFirst().orElse(null);
  754. t.setCreatorUserId(user != null ? user.getRealName() + "/" + user.getAccount() : "");
  755. if (t.getEnabledMark() != null && t.getEnabledMark() != 0) {
  756. UserEntity entity = userService.getInfo(t.getLastModifyUserId());
  757. t.setLastModifyUserId(entity != null ? entity.getRealName() + "/" + entity.getAccount() : "");
  758. }
  759. DictionaryDataEntity dictionaryDataEntity = noticeType.stream().filter(notice -> notice.getEnCode().equals(t.getCategory())).findFirst().orElse(new DictionaryDataEntity());
  760. t.setCategory(dictionaryDataEntity.getFullName());
  761. });
  762. List<NoticeVO> jsonToList = new ArrayList<>();
  763. dashboardNoticeList.forEach(t -> {
  764. NoticeVO vo = JsonUtil.getJsonToBean(t, NoticeVO.class);
  765. vo.setReleaseTime(t.getLastModifyTime() != null ? t.getLastModifyTime().getTime() : null);
  766. vo.setReleaseUser(t.getLastModifyUserId());
  767. vo.setCreatorUser(t.getCreatorUserId());
  768. jsonToList.add(vo);
  769. });
  770. return jsonToList;
  771. }
  772. @Override
  773. public List<MessageInfoVO> getUserMessageList() {
  774. List<MessageInfoVO> listVO = new ArrayList<>();
  775. PaginationMessage pagination = new PaginationMessage();
  776. pagination.setPageSize(5);
  777. pagination.setUserId(UserProvider.getUser().getUserId());
  778. List<MessageReceiveEntity> list = this.getMessageList3(pagination);
  779. List<UserEntity> userList = userService.getUserName(list.stream().map(SuperBaseEntity.SuperCBaseEntity::getCreatorUserId).collect(Collectors.toList()));
  780. List<DictionaryDataEntity> msgSourceTypeList = dictionaryDataService.getListByTypeDataCode("msgSourceType");
  781. list.forEach(t -> {
  782. MessageInfoVO vo = JsonUtil.getJsonToBean(t, MessageInfoVO.class);
  783. UserEntity user = userList.stream().filter(ul -> ul.getId().equals(t.getCreatorUserId())).findFirst().orElse(null);
  784. if (user != null) {
  785. vo.setReleaseTime(t.getCreatorTime() != null ? t.getCreatorTime().getTime() : null);
  786. vo.setReleaseUser(user.getRealName() + "/" + user.getAccount());
  787. vo.setCreatorUser(user.getRealName() + "/" + user.getAccount());
  788. }
  789. if (t.getType() != null) {
  790. msgSourceTypeList.stream().filter(m -> t.getType().toString().equals(m.getEnCode())).findFirst()
  791. .ifPresent(n -> vo.setTypeName(n.getFullName()));
  792. }
  793. listVO.add(vo);
  794. });
  795. return listVO;
  796. }
  797. }