IncidentTaskServiceImpl.java 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275
  1. package com.ruoyi.zhdd.service.impl;
  2. import cn.hutool.core.bean.BeanUtil;
  3. import cn.hutool.core.collection.CollUtil;
  4. import cn.hutool.core.util.StrUtil;
  5. import cn.hutool.json.JSONArray;
  6. import cn.hutool.json.JSONObject;
  7. import cn.hutool.json.JSONUtil;
  8. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  9. import com.baomidou.mybatisplus.core.toolkit.Wrappers;
  10. import com.ruoyi.common.constant.Constants;
  11. import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl;
  12. import com.ruoyi.common.core.page.PagePlus;
  13. import com.ruoyi.common.core.page.TableDataInfo;
  14. import com.ruoyi.common.exception.ServiceException;
  15. import com.ruoyi.common.utils.PageUtils;
  16. import com.ruoyi.common.utils.RedisUtils;
  17. import com.ruoyi.zhdd.domain.IncidentTask;
  18. import com.ruoyi.zhdd.domain.IncidentUser;
  19. import com.ruoyi.zhdd.domain.bo.IncidentTaskBo;
  20. import com.ruoyi.zhdd.domain.bo.IncidentTasksBo;
  21. import com.ruoyi.zhdd.domain.bo.MessagePushUser;
  22. import com.ruoyi.zhdd.domain.vo.IncidentTaskVo;
  23. import com.ruoyi.zhdd.mapper.IncidentTaskMapper;
  24. import com.ruoyi.zhdd.service.IIncidentTaskService;
  25. import lombok.extern.slf4j.Slf4j;
  26. import org.springframework.stereotype.Service;
  27. import org.springframework.transaction.annotation.Transactional;
  28. import java.util.ArrayList;
  29. import java.util.Collection;
  30. import java.util.List;
  31. import java.util.Map;
  32. import java.util.stream.Collectors;
  33. /**
  34. * 事件处置流程Service业务层处理
  35. *
  36. * @author xitong
  37. * @date 2021-09-28
  38. */
  39. @Service
  40. @Slf4j
  41. public class IncidentTaskServiceImpl extends ServicePlusImpl<IncidentTaskMapper, IncidentTask, IncidentTaskVo> implements IIncidentTaskService {
  42. @Override
  43. public IncidentTaskVo queryById(String id) {
  44. return getVoById(id);
  45. }
  46. @Override
  47. public TableDataInfo<IncidentTaskVo> queryPageList(IncidentTaskBo bo) {
  48. PagePlus<IncidentTask, IncidentTaskVo> result = pageVo(PageUtils.buildPagePlus(), buildQueryWrapper(bo));
  49. return PageUtils.buildDataInfo(result);
  50. }
  51. @Override
  52. public List<IncidentTaskVo> queryList(IncidentTaskBo bo) {
  53. return listVo(buildQueryWrapper(bo));
  54. }
  55. private LambdaQueryWrapper<IncidentTask> buildQueryWrapper(IncidentTaskBo bo) {
  56. Map<String, Object> params = bo.getParams();
  57. LambdaQueryWrapper<IncidentTask> lqw = Wrappers.lambdaQuery();
  58. lqw.eq(bo.getIncidentId() != null, IncidentTask::getIncidentId, bo.getIncidentId());
  59. return lqw;
  60. }
  61. @Override
  62. @Transactional(rollbackFor = Exception.class)
  63. public Boolean insertByBo(IncidentTasksBo bo) {
  64. JSONObject jsonObject = new JSONObject();
  65. // 待删除事件用户关系的array
  66. JSONArray removeJsonArray = new JSONArray();
  67. // 待新增事件用户关系的array
  68. JSONArray saveJsonArray = new JSONArray();
  69. if (StrUtil.isNotBlank(bo.getId())) {
  70. // 更新操作
  71. // 先查询是否已经发送过
  72. IncidentTaskVo incidentTaskVo = this.queryById(bo.getId());
  73. if (incidentTaskVo == null) {
  74. throw new ServiceException("方案不存在!");
  75. }
  76. if ("1".equals(incidentTaskVo.getTaskSend())) {
  77. throw new ServiceException("该消息已发送,不能再次编辑!");
  78. }
  79. IncidentTask update = BeanUtil.toBean(bo, IncidentTask.class);
  80. update.setExprJson(JSONUtil.toJsonStr(bo.getMessagePushUsers()));
  81. updateById(update);
  82. jsonObject.set("des", "更新处置方案:" + bo.getTaskName());
  83. jsonObject.set("taskId", update.getId());
  84. // 校验原有的人员和新的人员的区别
  85. List<String> oldUserId = JSONUtil.toList(StrUtil.blankToDefault(incidentTaskVo.getExprJson(), "[]"), MessagePushUser.class).stream().map(MessagePushUser::getUserId).collect(Collectors.toList());
  86. List<String> newUserId = CollUtil.defaultIfEmpty(bo.getMessagePushUsers(), new ArrayList<>()).stream().map(MessagePushUser::getUserId).collect(Collectors.toList());
  87. // 1:通知消息。2:处置消息
  88. String oldSendFlag = StrUtil.equals(incidentTaskVo.getSendFlag(), "1") ? "1" : "2";
  89. String newSendFlag = StrUtil.equals(bo.getSendFlag(), "1") ? "1" : "2";
  90. List<String> removeUserId = CollUtil.subtractToList(oldUserId, newUserId);
  91. List<String> addUserId = CollUtil.subtractToList(newUserId, oldUserId);
  92. // 如果消息类型的变更,则直接将原来的人员删除,保存新的人员。否则按照比对来增删人员
  93. String removeSource;
  94. String addSource;
  95. if (oldSendFlag.equals(newSendFlag)) {
  96. if ("1".equals(newSendFlag)) {
  97. removeSource = "7";
  98. addSource = "7";
  99. } else {
  100. removeSource = "3";
  101. addSource = "3";
  102. }
  103. } else {
  104. removeSource = oldSendFlag;
  105. removeUserId = oldUserId;
  106. addSource = newSendFlag;
  107. addUserId = newUserId;
  108. }
  109. for (String userId : removeUserId) {
  110. // 删除关系
  111. IncidentUser remove = new IncidentUser();
  112. remove.setIncidentId(bo.getId());
  113. remove.setUserId(userId);
  114. remove.setSource(removeSource);
  115. removeJsonArray.add(remove);
  116. }
  117. for (String userId : addUserId) {
  118. IncidentUser save = new IncidentUser();
  119. save.setIncidentId(bo.getId());
  120. save.setUserId(userId);
  121. save.setSource(addSource);
  122. saveJsonArray.add(save);
  123. }
  124. } else {
  125. IncidentTask add = BeanUtil.toBean(bo, IncidentTask.class);
  126. add.setId(null);
  127. add.setExprJson(JSONUtil.toJsonStr(bo.getMessagePushUsers()));
  128. save(add);
  129. jsonObject.set("des", "新增处置方案:" + bo.getTaskName());
  130. jsonObject.set("taskId", add.getId());
  131. List<String> newUserId = CollUtil.defaultIfEmpty(bo.getMessagePushUsers(), new ArrayList<>()).stream().map(MessagePushUser::getUserId).collect(Collectors.toList());
  132. for (String userId : newUserId) {
  133. IncidentUser save = new IncidentUser();
  134. save.setIncidentId(bo.getId());
  135. save.setUserId(userId);
  136. save.setSource(StrUtil.equals(bo.getSendFlag(), "1") ? "1" : "2");
  137. saveJsonArray.add(save);
  138. }
  139. }
  140. // 发送消息(1-应急处置消息、2-应急处置待办、3-资源管理待办)
  141. jsonObject.set("incidentId", bo.getIncidentId());
  142. jsonObject.set("incidentStatus", 3);
  143. RedisUtils.publish(Constants.PROCESS_RECORD, jsonObject);
  144. if (removeJsonArray.size() > 0) {
  145. RedisUtils.publish(Constants.INCIDENT_USER_DELETE, removeJsonArray);
  146. }
  147. if (saveJsonArray.size() > 0) {
  148. RedisUtils.publish(Constants.INCIDENT_USER_BATCH, saveJsonArray);
  149. }
  150. return true;
  151. }
  152. /**
  153. * 事件方案发送
  154. *
  155. * @param bo
  156. * @return
  157. */
  158. @Override
  159. public boolean taskSend(IncidentTasksBo bo) {
  160. List<IncidentTask> list = this.list(Wrappers.<IncidentTask>lambdaQuery()
  161. .eq(IncidentTask::getTaskSend, "0")
  162. .and(a -> a.eq(StrUtil.isNotBlank(bo.getId()), IncidentTask::getId, bo.getId())
  163. .or()
  164. .eq(StrUtil.isNotBlank(bo.getIncidentId()), IncidentTask::getIncidentId, bo.getIncidentId()))
  165. );
  166. if (list != null && list.size() > 0) {
  167. for (IncidentTask incidentTask : list) {
  168. // 更新方案为已发送状态
  169. incidentTask.setTaskSend("1");
  170. this.updateById(incidentTask);
  171. RedisUtils.publish(Constants.NOTICE_PUSH, incidentTask.getSendFlag() + "B" + incidentTask.getId(), msg -> {
  172. log.info("应急方案消息发送 => " + msg);
  173. });
  174. }
  175. }
  176. return true;
  177. }
  178. @Override
  179. public Boolean updateByBo(IncidentTaskBo bo) {
  180. IncidentTask update = BeanUtil.toBean(bo, IncidentTask.class);
  181. validEntityBeforeSave(update);
  182. return updateById(update);
  183. }
  184. @Override
  185. public List<IncidentTaskVo> listTaskInfo(String id) {
  186. List<IncidentTaskVo> incidentTaskVo = listVo(Wrappers.<IncidentTask>lambdaQuery().eq(IncidentTask::getIncidentId, id).orderByAsc(IncidentTask::getCreateTime));
  187. if (incidentTaskVo != null) {
  188. // 查询指令和人员
  189. for (IncidentTaskVo taskVo : incidentTaskVo) {
  190. if (StrUtil.isNotBlank(taskVo.getExprJson())) {
  191. taskVo.setMessagePushUsers(JSONUtil.toList(taskVo.getExprJson(), MessagePushUser.class));
  192. }
  193. }
  194. }
  195. return incidentTaskVo;
  196. }
  197. /**
  198. * 复制旧的方案到新事件中
  199. *
  200. * @param oldId
  201. * @param newId
  202. * @return
  203. */
  204. @Override
  205. public boolean copyTask(String oldId, String newId) {
  206. // 查询旧的方案
  207. List<IncidentTaskVo> incidentTaskVos = listTaskInfo(oldId);
  208. if (incidentTaskVos != null && incidentTaskVos.size() > 0) {
  209. List<IncidentTask> incidentTasks = new ArrayList<>();
  210. for (IncidentTaskVo incidentTaskVo : incidentTaskVos) {
  211. IncidentTask incidentTask = new IncidentTask();
  212. incidentTask.setTaskName(incidentTaskVo.getTaskName());
  213. incidentTask.setIncidentId(newId);
  214. incidentTask.setSendFlag(incidentTaskVo.getSendFlag());
  215. incidentTasks.add(incidentTask);
  216. }
  217. saveAll(incidentTasks);
  218. }
  219. return true;
  220. }
  221. /**
  222. * 保存前的数据校验
  223. *
  224. * @param entity 实体类数据
  225. */
  226. private void validEntityBeforeSave(IncidentTask entity) {
  227. //TODO 做一些数据校验,如唯一约束
  228. }
  229. @Override
  230. public Boolean deleteWithValidByIds(Collection<String> ids, Boolean isValid) {
  231. if (isValid) {
  232. //TODO 做一些业务上的校验,判断是否需要校验
  233. }
  234. // 查询处置方案。默认这边只有一个id
  235. String id = ids.iterator().next();
  236. IncidentTaskVo incidentTaskVo = queryById(id);
  237. if (incidentTaskVo != null) {
  238. if ("1".equals(incidentTaskVo.getTaskSend())) {
  239. throw new ServiceException("该消息已发送,不能删除!");
  240. }
  241. JSONObject jsonObject = new JSONObject();
  242. jsonObject.set("des", "处置方案:" + incidentTaskVo.getTaskName() + "删除");
  243. jsonObject.set("incidentId", incidentTaskVo.getIncidentId());
  244. jsonObject.set("taskId", incidentTaskVo.getId());
  245. jsonObject.set("incidentStatus", 3);
  246. RedisUtils.publish(Constants.PROCESS_RECORD, jsonObject, msg -> {
  247. log.info("事件处置方案删除消息 => " + msg);
  248. });
  249. }
  250. return removeByIds(ids);
  251. }
  252. }