TerminationServiceImpl.java 19 KB

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