TerminationServiceImpl.java 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456
  1. package com.ruoyi.flowable.service.impl;
  2. import com.ruoyi.common.core.domain.AjaxResult;
  3. import com.ruoyi.common.core.domain.entity.SysUser;
  4. import com.ruoyi.common.utils.DateUtils;
  5. import com.ruoyi.common.utils.SecurityUtils;
  6. import com.ruoyi.common.utils.StringUtils;
  7. import com.ruoyi.common.utils.sms.SmsSenderUtils;
  8. import com.ruoyi.common.utils.uuid.IdUtils;
  9. import com.ruoyi.flowable.common.constant.ProcessConstants;
  10. import com.ruoyi.flowable.common.constant.UUIDGenerator;
  11. import com.ruoyi.flowable.common.enums.FlowStatusEnum;
  12. import com.ruoyi.flowable.factory.FlowServiceFactory;
  13. import com.ruoyi.flowable.service.*;
  14. import com.ruoyi.invest.domain.*;
  15. import com.ruoyi.invest.domain.vo.ProjectTerminationVo;
  16. import com.ruoyi.invest.mapper.TerminationMapper;
  17. import com.ruoyi.invest.mapper.TProjectScoringMapper;
  18. import com.ruoyi.invest.service.*;
  19. import com.ruoyi.system.mapper.SysDeptMapper;
  20. import com.ruoyi.system.service.ISysUserService;
  21. import com.ruoyi.tool.service.ITUnifyFileService;
  22. import org.flowable.engine.repository.ProcessDefinition;
  23. import org.flowable.engine.runtime.ProcessInstance;
  24. import org.flowable.task.api.Task;
  25. import org.slf4j.Logger;
  26. import org.slf4j.LoggerFactory;
  27. import org.springframework.beans.factory.annotation.Autowired;
  28. import org.springframework.beans.factory.annotation.Value;
  29. import org.springframework.stereotype.Service;
  30. import javax.servlet.http.HttpServletRequest;
  31. import java.io.IOException;
  32. import java.util.*;
  33. /**
  34. * 项目池Service业务层处理
  35. *
  36. * @author ruoyi
  37. * @date 2024-02-21
  38. */
  39. @Service
  40. public class TerminationServiceImpl extends FlowServiceFactory implements ITerminationService
  41. {
  42. protected final Logger logger = LoggerFactory.getLogger(this.getClass());
  43. @Value("${spring.profiles.active}")
  44. private String active;
  45. @Autowired
  46. private TerminationMapper terminationMapper;
  47. @Autowired
  48. private ITProjectPoolService tProjectPoolService;
  49. @Autowired
  50. private ITProjectCirculationService tProjectCirculationService;
  51. @Autowired
  52. private IFlowBaseInfoService activitiBaseInfoService;
  53. @Autowired
  54. private IFlowInstanceService flowInstanceService;
  55. @Autowired
  56. private ISysUserService sysUserService;
  57. @Autowired
  58. private SysDeptMapper sysDeptMapper;
  59. @Autowired
  60. private IFlowService flowService;
  61. @Autowired
  62. private ITProjectMeetingService tProjectMeetingService;
  63. @Autowired
  64. private TProjectScoringMapper tProjectScoringMapper;
  65. @Autowired
  66. private ISysFormService sysFormService;
  67. @Override
  68. public List<ProjectTerminationVo> selectAllTerminationList(TProjectTermination tProjectTermination){
  69. return terminationMapper.selectAllTerminationList(tProjectTermination);
  70. }
  71. @Override
  72. public List<ProjectTerminationVo> getMyTaskList(String userId, TProjectTermination tProjectTermination){
  73. return terminationMapper.getMyTaskList(userId, tProjectTermination);
  74. }
  75. @Override
  76. public List<ProjectTerminationVo> getMyDoneTaskList(String userId, TProjectTermination tProjectTermination){
  77. return terminationMapper.getMyDoneTaskList(userId, tProjectTermination);
  78. }
  79. @Override
  80. public List<ProjectTerminationVo> getMyList(String userId,TProjectTermination tProjectTermination){
  81. return terminationMapper.getMyList(userId, tProjectTermination);
  82. }
  83. /**
  84. * 查询项目池
  85. *
  86. * @param pInstId 流程实例Id
  87. * @return 项目池
  88. */
  89. @Override
  90. public TProjectTermination selectTProjectTerminationByProcInstId(String pInstId)
  91. {
  92. return terminationMapper.selectTProjectTerminationByProcInstId(pInstId);
  93. }
  94. @Override
  95. public AjaxResult start(TProjectTermination tProjectTermination) {
  96. // 根据key值获取最新的流程部署id
  97. String pDefId = null;
  98. ProcessInstance pInst = null;
  99. try {
  100. List<ProcessDefinition> list = repositoryService.createProcessDefinitionQuery()
  101. .processDefinitionKey("dgt-termination-workflow")
  102. .orderByProcessDefinitionVersion().desc().list();
  103. if(list.size()==0){
  104. return AjaxResult.error("未找到该流程,无法开启流程!");
  105. }
  106. pDefId = list.get(0).getId();
  107. ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(pDefId)
  108. .latestVersion().singleResult();
  109. if (Objects.nonNull(processDefinition) && processDefinition.isSuspended()) {
  110. return AjaxResult.error("流程已被挂起,请先激活流程");
  111. }
  112. if(StringUtils.isNotBlank(pDefId)){
  113. //设置参数
  114. Map<String, Object> formProperties = new HashMap<String, Object>();
  115. // 设置流程发起人Id到流程中
  116. SysUser sysUser = SecurityUtils.getLoginUser().getUser();
  117. identityService.setAuthenticatedUserId(sysUser.getUserId().toString());
  118. formProperties.put("auditPass",tProjectTermination.isFlag()?true:false);
  119. //暂存
  120. formProperties.put(ProcessConstants.PROCESS_INITIATOR, sysUser.getUserId());
  121. //投资部负责人
  122. String leader=sysDeptMapper.selectDeptLeader("投资部");
  123. formProperties.put("MANAGER",sysUserService.selectUserByUserName(leader).getUserId());
  124. pInst = runtimeService.startProcessInstanceById(pDefId, formProperties);
  125. // ProcessInstance p = runtimeService.startProcessInstanceById(procDefId, variables);
  126. if(pInst!=null){
  127. String nickName= SecurityUtils.getLoginUser().getUser().getNickName();
  128. String userId=SecurityUtils.getLoginUser().getUserId().toString();
  129. //保存信息
  130. tProjectTermination.setId(IdUtils.fastSimpleUUID());
  131. tProjectTermination.setProcInstId(pInst.getProcessInstanceId());
  132. tProjectTermination.setCreateBy(userId);
  133. if(tProjectTermination.isFlag()){
  134. tProjectTermination.setStatus(1);//提交
  135. }else{
  136. tProjectTermination.setStatus(0);//暂存
  137. }
  138. // todo 更改终止状态
  139. tProjectPoolService.updateTProjectPoolByApprovalFlag(tProjectTermination.getProjectPoolId(),"1");
  140. // todo 短信提醒
  141. /*if(StringUtils.isNotEmpty(tProjectTermination.getParticipantsId())){
  142. StringUtils.str2List(tProjectTermination.getParticipantsId(),",",true,true).stream().forEach(str -> {
  143. SysUser user = sysUserService.selectUserById(Long.valueOf(str));
  144. String contents = "您好,"+user.getNickName()+"," + tProjectTermination.getProjectName() + "已发起投决申请。";
  145. try {
  146. SmsSenderUtils.sendSms(user.getPhonenumber(),contents);
  147. } catch (IOException e) {
  148. logger.error("短信发送失败"+e.getMessage());
  149. }
  150. });
  151. }*/
  152. // todo 增加项目创建记录
  153. tProjectCirculationService.insertTProjectCirculation(tProjectTermination.getProjectPoolId(),"终止申请",nickName);
  154. // todo 更改终止状态
  155. tProjectPoolService.updateTProjectPoolByTerminationFlag(tProjectTermination.getProjectPoolId(),"1");//1是代表已发起终止申请
  156. // todo 新增终止数据
  157. tProjectTermination.setCreateTime(DateUtils.getNowDate());
  158. terminationMapper.insertTProjectTermination(tProjectTermination);
  159. FlowBaseInfo flowBaseInfo = new FlowBaseInfo();
  160. flowBaseInfo.setCreateBy(userId);
  161. flowBaseInfo.setId(UUIDGenerator.uuid());
  162. flowBaseInfo.setFormProperties(flowInstanceService.getFormProperties(pInst));
  163. flowBaseInfo.setProcDefId(pDefId);
  164. flowBaseInfo.setProcInsId(pInst.getId());
  165. flowBaseInfo.setTaskName("申请人");
  166. flowBaseInfo.setFlag(true);
  167. flowBaseInfo.setComment(tProjectTermination.isFlag() ? "[提交]" : "[暂存]");
  168. flowBaseInfo.setStatus(FlowStatusEnum.STARTED.getName());
  169. flowBaseInfo.setFlag(tProjectTermination.isFlag());
  170. activitiBaseInfoService.addActivitiBaseInfo(flowBaseInfo);
  171. TProjectPool tProjectPool=new TProjectPool();
  172. tProjectPool.setId(tProjectTermination.getProjectPoolId());
  173. // tProjectPool.setProjectStage("8");//项目阶段-项目终止
  174. // tProjectPool.setProjectState("o");//项目状态-项目终止
  175. tProjectPoolService.updateTProjectPool(tProjectPool);
  176. if(flowBaseInfo.isFlag()){
  177. getAssignee(tProjectTermination,flowBaseInfo);
  178. }
  179. if (Objects.equals(active, "druid")) {
  180. // todo 短信
  181. sendMessage(flowBaseInfo);
  182. }
  183. //更新代办任务数量
  184. sysFormService.updateToDoNumber();
  185. return AjaxResult.success();
  186. }
  187. return AjaxResult.error();
  188. }
  189. return AjaxResult.error();
  190. } catch (Exception e) {
  191. /*res.put("status",false);
  192. res.put("msg", "流程定义id为空, 无法开启流程!");*/
  193. e.printStackTrace();
  194. return AjaxResult.error("msg", "流程定义id为空, 无法开启流程!");
  195. }
  196. }
  197. @Override
  198. public AjaxResult complete(TProjectTermination tProjectTermination, FlowBaseInfo flow,HttpServletRequest request) throws Exception {
  199. //Task task=taskService.createTaskQuery().processInstanceId(tProjectApproval.getProcInstId()).singleResult();
  200. Task task = taskService.createTaskQuery().taskId(flow.getTaskId()).singleResult();
  201. if (Objects.isNull(task)) {
  202. return AjaxResult.error("任务不存在");
  203. }
  204. //当前你登录人
  205. SysUser userInfo=SecurityUtils.getLoginUser().getUser();
  206. Map<String, Object> rs = new HashMap<String, Object>();
  207. rs.put("status",true);
  208. Map<String, Object> formProperties = new HashMap<>();
  209. formProperties.put("auditPass", tProjectTermination.isFlag());
  210. Map<String, Object> fpMap = flowService.getFormProperties(task.getProcessDefinitionId(), task.getId());
  211. try {
  212. rs = flowService.taskComplete( task.getId(), tProjectTermination.isFlag(), formProperties, userInfo.getUserId().toString());
  213. } catch (Exception e) {
  214. e.printStackTrace();
  215. rs.put("status", false);
  216. rs.put("msg", "流程审批失败");
  217. }
  218. boolean status = (boolean) rs.get("status");
  219. // 审核成功, 则记录审核信息
  220. if (status) {
  221. TProjectPool tProjectPool=new TProjectPool();
  222. tProjectPool.setId(tProjectTermination.getProjectPoolId());
  223. //FlowBaseInfo flow = new FlowBaseInfo();
  224. if(flow==null){
  225. flow = new FlowBaseInfo();
  226. }
  227. flow.setId(UUIDGenerator.uuid());
  228. flow.setFormProperties(flowService.getFormProperties(fpMap, request.getParameterMap()));
  229. flow.setStatus(FlowStatusEnum.RUNNING.getName());
  230. flow.setProcDefId(task.getProcessDefinitionId());
  231. flow.setProcInsId(task.getProcessInstanceId());
  232. flow.setTaskDefKey(task.getTaskDefinitionKey());
  233. String isOk = tProjectTermination.isFlag() ? "[同意]" : "[驳回]";
  234. if ("modifyApply".equals(task.getTaskDefinitionKey())) {
  235. tProjectTermination.setStatus(tProjectTermination.isFlag() ? 1 : 4);
  236. isOk = tProjectTermination.isFlag() ? "[提交]" : "[关闭]";
  237. } else {
  238. tProjectTermination.setStatus(tProjectTermination.isFlag() ? 2 : 0);
  239. }
  240. if (null != flow.getComment()) {
  241. flow.setComment(isOk + flow.getComment());
  242. } else {
  243. flow.setComment(isOk);
  244. }
  245. flow.setTaskName(task.getName());
  246. flow.setCreateBy(SecurityUtils.getLoginUser().getUserId().toString());
  247. flow.setFlag(tProjectTermination.isFlag());
  248. ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(task.getProcessInstanceId()).active().singleResult();
  249. // 表示流程已经审批结束了
  250. if (processInstance == null) {
  251. flow.setStatus(FlowStatusEnum.ENDED.getName());
  252. if (!"modifyApply".equals(task.getTaskDefinitionKey())) {
  253. //关闭该项目存在的流程(投资机会、项目立项、尽职背调、项目投决)
  254. tProjectTermination.setStatus(3);
  255. tProjectPool.setUpdateBy(userInfo.getNickName());
  256. tProjectPool.setProjectStatus("1");//项目机会状态为终止
  257. // todo 增加项目创建记录
  258. tProjectCirculationService.insertTProjectCirculation(tProjectPool.getId(),"项目终止完成", userInfo.getNickName());
  259. }else{
  260. tProjectPool.setTerminationFlag("0");
  261. }
  262. }
  263. tProjectPoolService.updateTProjectPool(tProjectPool);
  264. tProjectTermination.setUpdateTime(DateUtils.getNowDate());
  265. terminationMapper.updateTProjectTermination(tProjectTermination);
  266. activitiBaseInfoService.addActivitiBaseInfo(flow);
  267. if(flow.isFlag()){
  268. getAssignee(tProjectTermination,flow);
  269. }
  270. if (Objects.equals(active, "druid")) {
  271. //todo 短信
  272. sendMessage(flow);
  273. }
  274. }
  275. return AjaxResult.success();
  276. }
  277. public TProjectMeeting selectTProjectMeetingByProcInstId(String pInstId){
  278. TProjectTermination tProjectTermination=this.selectTProjectTerminationByProcInstId(pInstId);
  279. TProjectMeeting tProjectMeeting=null;
  280. if(tProjectTermination!=null){
  281. tProjectMeeting=tProjectMeetingService.selectTProjectMeetingByProjectPoolId(tProjectTermination.getProjectPoolId());
  282. }
  283. return tProjectMeeting;
  284. }
  285. /**
  286. * 根据流程Id查询汇总分数和平均分数
  287. * @param pInstId
  288. * @return
  289. */
  290. @Override
  291. public Map<String, String> selectSumScore(String pInstId) {
  292. TProjectTermination tProjectTermination=this.selectTProjectTerminationByProcInstId(pInstId);
  293. Map<String, String> sumScore=new HashMap<>();
  294. if(tProjectTermination!=null){
  295. TProjectMeeting tProjectMeeting=tProjectMeetingService.selectTProjectMeetingByProjectPoolId(tProjectTermination.getProjectPoolId());
  296. sumScore=tProjectScoringMapper.selectMeetingId(tProjectMeeting.getId());
  297. }
  298. return sumScore;
  299. }
  300. /**
  301. * 根据项目ID获取最新终止申请
  302. * @param projectPoolId
  303. * @return
  304. */
  305. @Override
  306. public TProjectTermination listProjectPoolIdNew(String projectPoolId) {
  307. return terminationMapper.listProjectPoolIdNew(projectPoolId);
  308. }
  309. // todo 短信
  310. public void sendMessage(FlowBaseInfo flowBaseInfo) {
  311. boolean flag = flowBaseInfo.isFlag();
  312. String procInsId = flowBaseInfo.getProcInsId();
  313. // 待办任务
  314. List<Task> tasks = taskService.createTaskQuery().processInstanceId(procInsId).list();
  315. // 对应业务单据
  316. ProjectTerminationVo projectTermination =terminationMapper.selectProjectTerminationByProcInstId(procInsId);
  317. if (projectTermination == null) {
  318. return;
  319. }
  320. // 申请人
  321. SysUser applyUserInfo = sysUserService.selectUserById(Long.valueOf(projectTermination.getCreateBy()));
  322. // 当前登录人
  323. SysUser loginUser = SecurityUtils.getLoginUser().getUser();
  324. if(tasks.size()>0) {
  325. for (int i = 0; i < tasks.size(); i++) {
  326. Task task = tasks.get(i);
  327. if (task != null) {
  328. if (Objects.equals(applyUserInfo.getUserId(), loginUser.getUserId()) && !flag) {
  329. // 如果是申请人暂存或者关闭或者自己驳回,不用给自己发审批短信
  330. continue;
  331. } else {
  332. // 申请人提交,给下一个审批人发短信
  333. // 审批人同意,给下一个审批人发短信
  334. if (flag) { //给审批人发送短信
  335. String assignee = task.getAssignee();
  336. if (org.apache.commons.lang3.StringUtils.isNotBlank(assignee)) { // 给审批人发送短信
  337. SysUser auditUser = sysUserService.selectUserById(Long.valueOf(assignee));
  338. String auditContents = auditUser.getNickName() + ",您好。投资系统中" + projectTermination.getProjectName() + "的项目终止流程待处理,请查看!";
  339. if (auditUser != null && StringUtils.isNotBlank(auditUser.getPhonenumber())) {
  340. try{
  341. SmsSenderUtils.sendSms(auditUser.getPhonenumber(), auditContents);
  342. } catch (IOException e) {
  343. logger.error("短信发送失败"+e.getMessage());
  344. }
  345. }
  346. }
  347. } else { // 审批人驳回,给申请人发短信
  348. String rejectContents = applyUserInfo.getNickName()+",您好。你在投资系统中提交" + projectTermination.getProjectName() + "的项目终止申请已审核,结果为【驳回】,请查看!";
  349. if (applyUserInfo != null && StringUtils.isNotBlank(applyUserInfo.getPhonenumber())) {
  350. try{
  351. SmsSenderUtils.sendSms(applyUserInfo.getPhonenumber(), rejectContents);
  352. } catch (IOException e) {
  353. logger.error("短信发送失败"+e.getMessage());
  354. }
  355. }
  356. }
  357. }
  358. }
  359. }
  360. }else{
  361. String completeContents ="";
  362. if(flag) {
  363. // 审批完成,给申请人发短信
  364. //XXX,您好。你在投资系统中提交“XXX”的项目终止申请已审核,结果为【通过】/【驳回】/【观望】!
  365. completeContents = applyUserInfo.getNickName()+",您好。你在投资系统中提交" + projectTermination.getProjectName() + "的项目终止申请已审核,结果为【同意】,请查看!";
  366. if (applyUserInfo != null && StringUtils.isNotBlank(applyUserInfo.getPhonenumber())) {
  367. try{
  368. SmsSenderUtils.sendSms(applyUserInfo.getPhonenumber(), completeContents);
  369. } catch (IOException e) {
  370. logger.error("短信发送失败"+e.getMessage());
  371. }
  372. }
  373. }
  374. }
  375. }
  376. /**
  377. * 跳节点
  378. * @param projectTermination
  379. * @param flow
  380. * @throws Exception
  381. */
  382. public void getAssignee(TProjectTermination projectTermination, FlowBaseInfo flow) throws Exception {
  383. SysUser sysUser=SecurityUtils.getLoginUser().getUser();//当前登陆人
  384. if (sysUser == null) {
  385. sysUser=sysUserService.selectUserById(Long.parseLong(projectTermination.getCreateBy()));
  386. }
  387. List<Task> tasks = taskService.createTaskQuery().processInstanceId(flow.getProcInsId()).list();
  388. Long userId=sysUser.getUserId();
  389. for(int i = 0; i < tasks.size(); i++) {
  390. Task task = tasks.get(i);
  391. if (task == null || StringUtils.isBlank(task.getAssignee())) {
  392. return;
  393. }
  394. Long assignee = Long.parseLong(task.getAssignee());
  395. if ("deptLeader".equals(task.getTaskDefinitionKey()) && (userId.equals(assignee) || projectTermination.getCreateBy().equals(assignee))) {
  396. JumpNode(projectTermination, flow);
  397. }
  398. }
  399. }
  400. public Map<String, Object> JumpNode(TProjectTermination projectTermination, FlowBaseInfo flow) throws Exception{
  401. List<Task> list = taskService.createTaskQuery().processInstanceId(flow.getProcInsId()).list();
  402. String taskId=null;
  403. Map<String, Object> rs = new HashMap<String, Object>();
  404. rs.put("status",true);
  405. if (list.size()>0) {
  406. taskId = list.get(0).getId();
  407. flow.setTaskId(taskId);
  408. boolean flag = flow.isFlag();
  409. //当前流程节点Id信息
  410. // ExecutionEntity execution = (ExecutionEntity) runtimeService.createProcessInstanceQuery().processInstanceId(flow.getProcInsId()).singleResult();
  411. // String activitiId = execution.getActivityId();
  412. Map<String, Object> formProperties = new HashMap<>();
  413. formProperties.put("auditPass", flow.isFlag());
  414. //部门负责人
  415. String leader=sysDeptMapper.selectDeptLeader("投资部");
  416. SysUser sysUser=sysUserService.selectUserByUserName(leader);
  417. formProperties.put("MANAGER",sysUser.getUserId());
  418. //当前登陆人
  419. Long userId=SecurityUtils.getUserId();
  420. try {
  421. //表单审核
  422. rs = flowService.taskComplete(taskId, flag, formProperties, userId.toString());
  423. } catch (Exception e) {
  424. e.printStackTrace();
  425. rs.put("status", false);
  426. rs.put("msg", "流程审批失败");
  427. }
  428. if (flow.isFlag()){
  429. getAssignee(projectTermination,flow);
  430. }
  431. }
  432. return rs;
  433. }
  434. }