CostProjectProccessManagerImpl.java 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267
  1. package com.hotent.project.manager.impl;
  2. import cn.hutool.core.util.ObjectUtil;
  3. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  4. import com.hotent.constant.NodeConstant;
  5. import com.hotent.project.manager.*;
  6. import com.hotent.project.model.CostProjectProccess;
  7. import com.hotent.project.dao.CostProjectProccessDao;
  8. import com.hotent.base.manager.impl.BaseManagerImpl;
  9. import com.hotent.project.model.CostProjectProccessNode;
  10. import com.hotent.project.model.CostProjectProccessNodeTemplete;
  11. import com.hotent.project.req.CostProjectProcessNodeReq;
  12. import com.hotent.project.req.CostProjectProcessReq;
  13. import com.hotent.project.resp.CostProjectProccessNodeResp;
  14. import com.hotent.project.resp.CostProjectProccessResp;
  15. import com.hotent.uc.exception.BaseException;
  16. import com.hotent.uc.manager.UserManager;
  17. import com.hotent.uc.model.User;
  18. import org.springframework.beans.factory.annotation.Autowired;
  19. import org.springframework.stereotype.Service;
  20. import org.springframework.transaction.annotation.Transactional;
  21. import java.util.ArrayList;
  22. import java.util.Arrays;
  23. import java.util.List;
  24. import java.util.Map;
  25. import java.util.function.Function;
  26. import java.util.stream.Collectors;
  27. /**
  28. * 流程表 服务实现类
  29. *
  30. * @author 超级管理员0
  31. * @company 山西清众科技股份有限公司
  32. * @since 2025-10-01
  33. */
  34. @Service
  35. public class CostProjectProccessManagerImpl extends BaseManagerImpl<CostProjectProccessDao, CostProjectProccess> implements CostProjectProccessManager {
  36. @Autowired
  37. private CostProjectProccessNodeTempleteManager costProjectProccessNodeTempleteManager;
  38. @Autowired
  39. private CostProjectProccessNodeManager costProjectProccessNodeManager;
  40. @Autowired
  41. private CostProjectProccessPersonnelManager costProjectProccessPersonnelManager;
  42. @Autowired
  43. private UserManager userManager;
  44. @Override
  45. public CostProjectProccessResp getDetail(String id) {
  46. //获取流程
  47. LambdaQueryWrapper<CostProjectProccess> qw = new LambdaQueryWrapper<>();
  48. qw.eq(CostProjectProccess::getProjectId, id);
  49. CostProjectProccess projectProccess = this.getOne(qw, false);
  50. if (projectProccess == null) {
  51. return new CostProjectProccessResp();
  52. }
  53. //获取流程节点
  54. LambdaQueryWrapper<CostProjectProccessNode> qwNode = new LambdaQueryWrapper<>();
  55. qwNode.eq(CostProjectProccessNode::getProcessId, projectProccess.getProcessId());
  56. List<CostProjectProccessNode> nodeList = costProjectProccessNodeManager.list(qwNode);
  57. List<String> userIdList = new ArrayList<>();
  58. nodeList.stream().forEach(node -> {
  59. if (!ObjectUtil.isEmpty(node.getMainUserId())) {
  60. userIdList.add(node.getMainUserId());
  61. }
  62. if (!ObjectUtil.isEmpty(node.getUserId())) {
  63. if (node.getUserId().contains(",")) {
  64. String[] split = node.getUserId().split(",");
  65. userIdList.addAll(Arrays.asList(split));
  66. } else {
  67. userIdList.add(node.getUserId());
  68. }
  69. }
  70. });
  71. if (ObjectUtil.isEmpty(userIdList)) {
  72. throw new BaseException("未找到流程节点人员");
  73. }
  74. //获取流程节点人员名称
  75. List<User> users = userManager.listByIds(userIdList.stream().distinct().collect(Collectors.toList()));
  76. Map<String, User> userMap = users.stream().collect(Collectors.toMap(User::getId, Function.identity()));
  77. //返回流程数据
  78. CostProjectProccessResp costProjectProccessResp = new CostProjectProccessResp();
  79. costProjectProccessResp.setProjectId(projectProccess.getProjectId());
  80. costProjectProccessResp.setProcessId(projectProccess.getProcessId());
  81. costProjectProccessResp.setPlannedAuditStartDate(projectProccess.getPlannedAuditStartDate());
  82. costProjectProccessResp.setPlannedAuditEndDate(projectProccess.getPlannedAuditEndDate());
  83. costProjectProccessResp.setNodeList(nodeList.stream().map(node -> {
  84. CostProjectProccessNodeResp nodeResp = new CostProjectProccessNodeResp();
  85. nodeResp.setId(node.getId());
  86. nodeResp.setProcessId(node.getProcessId());
  87. nodeResp.setProcessNodeValue(node.getProcessNodeValue());
  88. nodeResp.setProcessNodeKey(node.getProcessNodeKey());
  89. nodeResp.setNodeType(node.getNodeType());
  90. nodeResp.setOrderNum(node.getOrderNum());
  91. nodeResp.setStatus(node.getStatus());
  92. nodeResp.setUserId(node.getUserId());
  93. nodeResp.setMainUserId(node.getMainUserId());
  94. nodeResp.setStatusValue("node.getStatusValue() 后面填写");
  95. if("1".equals(node.getNodeType())) {
  96. nodeResp.setMainUserName(userMap.get(node.getMainUserId()).getFullname());
  97. if (node.getUserId().contains(",")) {
  98. String[] userIds = node.getUserId().split(",");
  99. String userName = "";
  100. for (String userId : userIds) {
  101. User user = userMap.get(userId);
  102. userName = userName + user.getFullname() + ",";
  103. }
  104. nodeResp.setUserName(userName.substring(0, userName.length() - 1));
  105. } else {
  106. nodeResp.setUserName(userMap.get(node.getUserId()).getFullname());
  107. }
  108. }
  109. nodeResp.setEndTime(node.getEndTime());
  110. nodeResp.setActEndTime(node.getActEndTime());
  111. nodeResp.setActStartTime(node.getActStartTime());
  112. nodeResp.setActRemarks(node.getActRemarks());
  113. nodeResp.setActUserNames(node.getActUserNames());
  114. return nodeResp;
  115. }).collect(Collectors.toList()));
  116. return costProjectProccessResp;
  117. }
  118. @Override
  119. @Transactional
  120. public void createOrUpdate(CostProjectProccess costProjectProccess) {
  121. //新建或更新
  122. this.saveOrUpdate(costProjectProccess);
  123. }
  124. @Override
  125. @Transactional
  126. public void createProcess(CostProjectProcessReq req) {
  127. for (CostProjectProcessNodeReq nodeReq : req.getNodeReqList()) {
  128. if ("1".equals(nodeReq.getNodeType())) {
  129. if (req.getPlannedAuditEndDate().isBefore(nodeReq.getEndTime())) {
  130. throw new BaseException("流程节点的结束时间不能早于流程的结束时间");
  131. }
  132. if (ObjectUtil.isEmpty(nodeReq.getUserId())) {
  133. throw new BaseException("流程节点人员不能为空");
  134. }
  135. if (ObjectUtil.isEmpty(nodeReq.getMainUserId())) {
  136. throw new BaseException("流程节点主办人员不能为空");
  137. }
  138. if (ObjectUtil.isEmpty(nodeReq.getProcessNodeKey())) {
  139. throw new BaseException("流程环节实际值不能为空");
  140. }
  141. if (ObjectUtil.isEmpty(nodeReq.getStatus())) {
  142. throw new BaseException("流程节点流转操作不能为空");
  143. }
  144. }
  145. }
  146. LambdaQueryWrapper<CostProjectProccess> qw = new LambdaQueryWrapper<>();
  147. qw.eq(CostProjectProccess::getProjectId, req.getProjectId());
  148. CostProjectProccess one = this.getOne(qw);
  149. if(one != null) {
  150. this.remove(qw);
  151. LambdaQueryWrapper<CostProjectProccessNode> qwNode = new LambdaQueryWrapper<>();
  152. qwNode.eq(CostProjectProccessNode::getProcessId, one.getProcessId());
  153. }
  154. //新增流程
  155. CostProjectProccess costProjectProccess = new CostProjectProccess();
  156. if (ObjectUtil.isNotEmpty(req.getProcessId())) {
  157. req.setProcessId(req.getProcessId());
  158. }
  159. costProjectProccess.setProjectId(req.getProjectId());
  160. costProjectProccess.setPlannedAuditStartDate(req.getPlannedAuditStartDate());
  161. costProjectProccess.setPlannedAuditEndDate(req.getPlannedAuditEndDate());
  162. costProjectProccess.setStatus(1);
  163. costProjectProccess.setCurrentNode(NodeConstant.clcs.getNodeKey());
  164. costProjectProccess.setProccessTempleteId("1");
  165. this.saveOrUpdate(costProjectProccess);
  166. //获取流程节点
  167. List<CostProjectProccessNodeTemplete> nodeList = costProjectProccessNodeTempleteManager.list();
  168. if (req.getNodeReqList().size() != nodeList.size()) {
  169. throw new BaseException("流程节点数量不一致");
  170. }
  171. Map<String, CostProjectProcessNodeReq> nodeReqMap = req.getNodeReqList().stream().collect(Collectors.toMap(CostProjectProcessNodeReq::getProcessNodeKey, Function.identity()));
  172. List<CostProjectProccessNode> nodes = new ArrayList<>();
  173. for (CostProjectProccessNodeTemplete nodeTemplete : nodeList) {
  174. CostProjectProcessNodeReq nodeReq = nodeReqMap.get(nodeTemplete.getProcessNodeKey());
  175. if (nodeReq == null) {
  176. throw new BaseException("未找到节点配置: " + nodeTemplete.getProcessNodeKey());
  177. }
  178. CostProjectProccessNode costProjectProccessNode = getCostProjectProccessNode(nodeTemplete, costProjectProccess, nodeReq);
  179. nodes.add(costProjectProccessNode);
  180. }
  181. costProjectProccessNodeManager.saveOrUpdateBatch(nodes);
  182. // Map<String, CostProjectProccessNode> proccessNodeMap = nodes.stream().collect(Collectors.toMap(CostProjectProccessNode::getProcessNodeKey, Function.identity()));
  183. // Map<String, List<CostProjectProccessPersonnel>> personMap = persons.stream().collect(Collectors.groupingBy(CostProjectProccessPersonnel::getNodeId));
  184. // personMap.forEach((nodeId, personList) -> {
  185. // CostProjectProccessNode node = proccessNodeMap.get(nodeId);
  186. // personList.forEach(person -> {
  187. // person.setNodeId(node.getId());
  188. // });
  189. // });
  190. // costProjectProccessPersonnelManager.saveOrUpdateBatch(persons);
  191. // System.out.println(JSON.toJSONString(persons));
  192. }
  193. @Override
  194. public CostProjectProccess getProcessByProjectId(String projectId) {
  195. LambdaQueryWrapper<CostProjectProccess> queryWrapper = new LambdaQueryWrapper<>();
  196. queryWrapper.eq(CostProjectProccess::getProjectId, projectId);
  197. CostProjectProccess one = this.getOne(queryWrapper, false);
  198. if (one == null) {
  199. return new CostProjectProccess();
  200. }
  201. return one;
  202. }
  203. private static CostProjectProccessNode getCostProjectProccessNode(CostProjectProccessNodeTemplete
  204. nodeTemplete, CostProjectProccess costProjectProccess, CostProjectProcessNodeReq nodeReq) {
  205. CostProjectProccessNode costProjectProccessNode = new CostProjectProccessNode();
  206. costProjectProccessNode.setProcessId(costProjectProccess.getProcessId());
  207. costProjectProccessNode.setMainUserId(nodeReq.getMainUserId());
  208. costProjectProccessNode.setUserId(nodeReq.getUserId());
  209. costProjectProccessNode.setProcessNodeValue(nodeTemplete.getProcessNodeValue());
  210. costProjectProccessNode.setProcessNodeKey(nodeReq.getProcessNodeKey());
  211. costProjectProccessNode.setNodeType(nodeTemplete.getNodeType());
  212. costProjectProccessNode.setOrderNum(nodeTemplete.getOrderNum());
  213. costProjectProccessNode.setEndTime(nodeReq.getEndTime());
  214. costProjectProccessNode.setStartTime(costProjectProccess.getPlannedAuditStartDate());
  215. costProjectProccessNode.setStatus(nodeReq.getStatus());
  216. return costProjectProccessNode;
  217. }
  218. }