OfficialDocumentReceivedServiceImpl.java 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286
  1. package com.xjrsoft.module.oa.service.impl;
  2. import cn.hutool.core.util.IdUtil;
  3. import com.alibaba.fastjson.JSONObject;
  4. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  5. import com.github.yulichang.base.MPJBaseServiceImpl;
  6. import com.github.yulichang.wrapper.MPJLambdaWrapper;
  7. import com.xjrsoft.module.oa.entity.OfficialDocumentReceived;
  8. import com.xjrsoft.module.oa.mapper.OfficialDocumentReceivedMapper;
  9. import com.xjrsoft.module.oa.service.IOfficialDocumentReceivedService;
  10. import com.xjrsoft.module.oa.utils.PostNumberUtil;
  11. import com.xjrsoft.module.oa.vo.NextReviewerListVo;
  12. import com.xjrsoft.module.organization.dto.WeChatSendMessageDto;
  13. import com.xjrsoft.module.organization.entity.Department;
  14. import com.xjrsoft.module.organization.entity.Post;
  15. import com.xjrsoft.module.organization.entity.User;
  16. import com.xjrsoft.module.organization.entity.UserPostRelation;
  17. import com.xjrsoft.module.organization.mapper.PostMapper;
  18. import com.xjrsoft.module.organization.mapper.UserMapper;
  19. import com.xjrsoft.module.organization.service.IWeChatService;
  20. import com.xjrsoft.module.teacher.entity.WfTeacherleave;
  21. import com.xjrsoft.module.teacher.entity.XjrUser;
  22. import com.xjrsoft.module.teacher.mapper.XjrUserMapper;
  23. import com.xjrsoft.module.workflow.entity.WorkflowFormRelation;
  24. import com.xjrsoft.module.workflow.entity.WorkflowRecord;
  25. import com.xjrsoft.module.workflow.service.IWorkflowFormRelationService;
  26. import com.xjrsoft.module.workflow.service.IWorkflowRecordService;
  27. import lombok.AllArgsConstructor;
  28. import org.apache.commons.collections.CollectionUtils;
  29. import org.apache.commons.lang3.ObjectUtils;
  30. import org.apache.commons.lang3.StringUtils;
  31. import org.springframework.stereotype.Service;
  32. import org.springframework.transaction.annotation.Transactional;
  33. import java.time.LocalDateTime;
  34. import java.time.format.DateTimeFormatter;
  35. import java.util.ArrayList;
  36. import java.util.List;
  37. import java.util.regex.Matcher;
  38. import java.util.regex.Pattern;
  39. import java.util.stream.Collectors;
  40. /**
  41. * @title: 公文收文
  42. * @Author szs
  43. * @Date: 2024-03-13
  44. * @Version 1.0
  45. */
  46. @Service
  47. @AllArgsConstructor
  48. public class OfficialDocumentReceivedServiceImpl extends MPJBaseServiceImpl<OfficialDocumentReceivedMapper, OfficialDocumentReceived> implements IOfficialDocumentReceivedService {
  49. private final OfficialDocumentReceivedMapper officialDocumentReceivedMapper;
  50. private final IWeChatService weChatService;
  51. private final UserMapper userMapper;
  52. private final IWorkflowFormRelationService workflowFormRelationService;
  53. private final IWorkflowRecordService workflowRecordService;
  54. private final PostMapper postMapper;
  55. private final XjrUserMapper xjrUserMapper;
  56. @Override
  57. public String getMaxReceivedNumber() {
  58. Integer maxReceivedNumber = officialDocumentReceivedMapper.getMaxReceivedNumber();
  59. return PostNumberUtil.initMaxPostNumber(maxReceivedNumber, 3);
  60. }
  61. @Override
  62. public String getMaxMeetingNumber() {
  63. Integer maxReceivedNumber = officialDocumentReceivedMapper.getMaxMeetingNumber();
  64. return PostNumberUtil.initMaxPostNumber(maxReceivedNumber, 3);
  65. }
  66. @Override
  67. public Boolean noticeHandleDutyUser(Long formId) {
  68. OfficialDocumentReceived documentReceived = this.getById(formId);
  69. if(documentReceived.getHandleDutyUserId() != null){
  70. User user = userMapper.selectById(documentReceived.getHandleDutyUserId());
  71. WeChatSendMessageDto weChatSendMessageDto = new WeChatSendMessageDto();
  72. weChatSendMessageDto.setUserId(user.getOpenId());
  73. weChatSendMessageDto.setTemplateId("qmpXORPM1Cocqn503Qa4On6BJhR92UZ00eod2-6IcGo");
  74. //weChatSendMessageDto.setUrl(StrUtil.format("{}/pages/message/notice/detail?id={}", commonPropertiesConfig.getDomainApp(), id));
  75. weChatSendMessageDto.setMsgId(IdUtil.getSnowflakeNextIdStr());
  76. JSONObject data = new JSONObject();
  77. JSONObject thing23 = new JSONObject();
  78. thing23.put("value", "您有一个行政收文待处理");
  79. data.put("thing23", thing23);
  80. JSONObject data2 = new JSONObject();
  81. data2.put("value", user.getName());
  82. data.put("thing29", data2);
  83. JSONObject data3 = new JSONObject();
  84. data3.put("value", LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
  85. data.put("time17", data3);
  86. weChatSendMessageDto.setContent(data);
  87. weChatService.sendTemplateMessage(weChatSendMessageDto);
  88. }
  89. return true;
  90. }
  91. @Override
  92. @Transactional(rollbackFor = Exception.class)
  93. public void taskIdPersist(Long id) {
  94. // 根据当前表单数据获取流程信息
  95. LambdaQueryWrapper<WorkflowFormRelation> wrapper = new LambdaQueryWrapper<>();
  96. wrapper
  97. .eq(WorkflowFormRelation::getFormKeyValue, id)
  98. ;
  99. WorkflowFormRelation workflowFormRelation = workflowFormRelationService.getOne(wrapper);
  100. if(ObjectUtils.isNotEmpty(workflowFormRelation)){
  101. OfficialDocumentReceived update = new OfficialDocumentReceived();
  102. update.setId(id);
  103. update.setTaskId(workflowFormRelation.getProcessId());
  104. officialDocumentReceivedMapper.updateById(update);
  105. }
  106. }
  107. /**
  108. * 获取当前行政收文流程下一节点审核人列表
  109. * @param taskId
  110. */
  111. @Override
  112. @Transactional(rollbackFor = Exception.class)
  113. public List<NextReviewerListVo> nextReviewerList(String taskId) {
  114. // 根据流程Id获取分管领导审核节点的审核人
  115. LambdaQueryWrapper<WorkflowRecord> workflowRecordLambdaQueryWrapper = new LambdaQueryWrapper<>();
  116. workflowRecordLambdaQueryWrapper
  117. .eq(WorkflowRecord::getNodeType, "开始节点")
  118. .eq(WorkflowRecord::getNodeName, "分管领导意见")
  119. .ne(WorkflowRecord::getCreateUserId, 0)
  120. .eq(WorkflowRecord::getProcessId, taskId)
  121. .orderByDesc(WorkflowRecord::getRecordTime)
  122. .last("limit 1")
  123. ;
  124. WorkflowRecord workflowRecord = workflowRecordService.getOne(workflowRecordLambdaQueryWrapper);
  125. if(ObjectUtils.isEmpty(workflowRecord)){
  126. return new ArrayList<>();
  127. }
  128. // 取出分管领导姓名
  129. String message = workflowRecord.getMessage();
  130. if(StringUtils.isEmpty(message)){
  131. return new ArrayList<>();
  132. }
  133. Pattern pattern = Pattern.compile("【(.*?)】");
  134. Matcher matcher = pattern.matcher(message);
  135. if (!matcher.find()) {
  136. return new ArrayList<>();
  137. }
  138. String name = matcher.group(1);
  139. // 根据当前分管领导获取其负责的部门
  140. MPJLambdaWrapper<Post> postMPJLambdaWrapper = new MPJLambdaWrapper<>();
  141. postMPJLambdaWrapper
  142. .select(Post::getId)
  143. .innerJoin(UserPostRelation.class, UserPostRelation::getPostId, Post::getId)
  144. .innerJoin(XjrUser.class, XjrUser::getId, UserPostRelation::getUserId)
  145. .eq(XjrUser::getName, name)
  146. ;
  147. List<Post> posts = postMapper.selectJoinList(Post.class, postMPJLambdaWrapper);
  148. List<Long> postIds = posts.stream()
  149. .map(Post::getId)
  150. .collect(Collectors.toList());
  151. if(CollectionUtils.isEmpty(postIds)){
  152. return new ArrayList<>();
  153. }
  154. // 根据部门获取部门管理人员
  155. MPJLambdaWrapper<XjrUser> xjrUserMPJLambdaWrapper = new MPJLambdaWrapper<>();
  156. xjrUserMPJLambdaWrapper
  157. .selectAs(XjrUser::getId, NextReviewerListVo::getValue)
  158. .selectAs(XjrUser::getName, NextReviewerListVo::getLabel)
  159. .selectAs(Department::getName, NextReviewerListVo::getDeptName)
  160. .innerJoin(UserPostRelation.class, UserPostRelation::getUserId, XjrUser::getId)
  161. .innerJoin(Post.class, Post::getId, UserPostRelation::getPostId)
  162. .leftJoin(Department.class, Department::getId, Post::getDeptId)
  163. .in(Post::getParentId, postIds)
  164. .and(wrapper ->
  165. wrapper
  166. .like(Post::getName, "主任")
  167. .or()
  168. .like(Post::getName, "书记")
  169. )
  170. ;
  171. List<NextReviewerListVo> voList = xjrUserMapper.selectJoinList(NextReviewerListVo.class, xjrUserMPJLambdaWrapper);
  172. for (NextReviewerListVo vo : voList){
  173. if(ObjectUtils.isNotEmpty(vo.getDeptName())){
  174. vo.setLabel(vo.getLabel() + "(" + vo.getDeptName() + ")");
  175. }
  176. }
  177. return voList;
  178. }
  179. @Override
  180. @Transactional(rollbackFor = Exception.class)
  181. public List<NextReviewerListVo> nextExecutorList(String taskId) {
  182. // 根据流程Id获取部门主任意见审核节点的审核人
  183. LambdaQueryWrapper<WorkflowRecord> workflowRecordLambdaQueryWrapper = new LambdaQueryWrapper<>();
  184. workflowRecordLambdaQueryWrapper
  185. .eq(WorkflowRecord::getNodeType, "开始节点")
  186. .eq(WorkflowRecord::getNodeName, "部门主任意见")
  187. .ne(WorkflowRecord::getCreateUserId, 0)
  188. .eq(WorkflowRecord::getProcessId, taskId)
  189. .orderByDesc(WorkflowRecord::getRecordTime)
  190. .last("limit 1")
  191. ;
  192. WorkflowRecord workflowRecord = workflowRecordService.getOne(workflowRecordLambdaQueryWrapper);
  193. if(ObjectUtils.isEmpty(workflowRecord)){
  194. return new ArrayList<>();
  195. }
  196. // 取出分管领导姓名
  197. String message = workflowRecord.getMessage();
  198. if(StringUtils.isEmpty(message)){
  199. return new ArrayList<>();
  200. }
  201. Pattern pattern = Pattern.compile("【(.*?)】");
  202. Matcher matcher = pattern.matcher(message);
  203. if (!matcher.find()) {
  204. return new ArrayList<>();
  205. }
  206. String name = matcher.group(1);
  207. // 根据当前主任获取其负责的部门
  208. MPJLambdaWrapper<Post> postMPJLambdaWrapper = new MPJLambdaWrapper<>();
  209. postMPJLambdaWrapper
  210. .select(Post::getId)
  211. .innerJoin(UserPostRelation.class, UserPostRelation::getPostId, Post::getId)
  212. .innerJoin(XjrUser.class, XjrUser::getId, UserPostRelation::getUserId)
  213. .eq(XjrUser::getName, name)
  214. ;
  215. List<Post> posts = postMapper.selectJoinList(Post.class, postMPJLambdaWrapper);
  216. List<Long> postIds = posts.stream()
  217. .map(Post::getId)
  218. .collect(Collectors.toList());
  219. if(CollectionUtils.isEmpty(postIds)){
  220. return new ArrayList<>();
  221. }
  222. // 根据部门获取部门管理人员
  223. MPJLambdaWrapper<XjrUser> xjrUserMPJLambdaWrapper = new MPJLambdaWrapper<>();
  224. xjrUserMPJLambdaWrapper
  225. .selectAs(XjrUser::getId, NextReviewerListVo::getValue)
  226. .selectAs(XjrUser::getName, NextReviewerListVo::getLabel)
  227. .selectAs(Department::getName, NextReviewerListVo::getDeptName)
  228. .innerJoin(UserPostRelation.class, UserPostRelation::getUserId, XjrUser::getId)
  229. .innerJoin(Post.class, Post::getId, UserPostRelation::getPostId)
  230. .leftJoin(Department.class, Department::getId, Post::getDeptId)
  231. .in(Post::getParentId, postIds)
  232. .and(wrapper ->
  233. wrapper
  234. .like(Post::getName, "副主任")
  235. .or()
  236. .like(Post::getName, "副书记")
  237. )
  238. ;
  239. List<NextReviewerListVo> voList = xjrUserMapper.selectJoinList(NextReviewerListVo.class, xjrUserMPJLambdaWrapper);
  240. for (NextReviewerListVo vo : voList){
  241. if(ObjectUtils.isNotEmpty(vo.getDeptName())){
  242. vo.setLabel(vo.getLabel() + "(" + vo.getDeptName() + ")");
  243. }
  244. }
  245. return voList;
  246. }
  247. }