DecisionServiceImpl.java 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439
  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.enums.FileType;
  5. import com.ruoyi.common.utils.DateUtils;
  6. import com.ruoyi.common.utils.SecurityUtils;
  7. import com.ruoyi.common.utils.StringUtils;
  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.IDecisionService;
  14. import com.ruoyi.flowable.service.IFlowInstanceService;
  15. import com.ruoyi.flowable.service.IFlowService;
  16. import com.ruoyi.invest.domain.*;
  17. import com.ruoyi.invest.domain.vo.ProjectDecisionVo;
  18. import com.ruoyi.invest.mapper.DecisionMapper;
  19. import com.ruoyi.invest.mapper.TProjectPoolMapper;
  20. import com.ruoyi.invest.mapper.TProjectScoringMapper;
  21. import com.ruoyi.invest.service.*;
  22. import com.ruoyi.system.mapper.SysDeptMapper;
  23. import com.ruoyi.system.service.ISysUserService;
  24. import com.ruoyi.tool.service.ITUnifyFileService;
  25. import org.flowable.engine.repository.ProcessDefinition;
  26. import org.flowable.engine.runtime.ProcessInstance;
  27. import org.flowable.task.api.Task;
  28. import org.springframework.beans.factory.annotation.Autowired;
  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 DecisionServiceImpl extends FlowServiceFactory implements IDecisionService
  41. {
  42. @Autowired
  43. private DecisionMapper decisionMapper;
  44. @Autowired
  45. private ITProjectDecisionService tProjectDecisionService;
  46. @Autowired
  47. private TProjectPoolMapper tProjectPoolMapper;
  48. @Autowired
  49. private ITProjectPoolService tProjectPoolService;
  50. @Autowired
  51. private ITProjectCompanyService tProjectCompanyService;
  52. @Autowired
  53. private ITProjectContactsService tProjectContactsService;
  54. @Autowired
  55. private ITProjectCirculationService tProjectCirculationService;
  56. @Autowired
  57. private ITUnifyFileService tUnifyFileService;
  58. @Autowired
  59. private IFlowBaseInfoService activitiBaseInfoService;
  60. @Autowired
  61. private IFlowInstanceService flowInstanceService;
  62. @Autowired
  63. private ISysUserService sysUserService;
  64. @Autowired
  65. private SysDeptMapper sysDeptMapper;
  66. @Autowired
  67. private ITProjectReviewService tProjectReviewService;
  68. @Autowired
  69. private IFlowService flowService;
  70. @Autowired
  71. private ITProjectMeetingService tProjectMeetingService;
  72. @Autowired
  73. private ITProjectScoringService tProjectScoringService;
  74. @Autowired
  75. private TProjectScoringMapper tProjectScoringMapper;
  76. @Override
  77. public List<ProjectDecisionVo> selectAllDecisionList(TProjectDecision tProjectDecision){
  78. return decisionMapper.selectAllDecisionList(tProjectDecision);
  79. }
  80. @Override
  81. public List<ProjectDecisionVo> getMyTaskList(String userId, TProjectDecision tProjectDecision){
  82. return decisionMapper.getMyTaskList(userId, tProjectDecision);
  83. }
  84. @Override
  85. public List<ProjectDecisionVo> getMyDoneTaskList(String userId, TProjectDecision tProjectDecision){
  86. return decisionMapper.getMyDoneTaskList(userId, tProjectDecision);
  87. }
  88. @Override
  89. public List<ProjectDecisionVo> getMyList(String userId,TProjectDecision tProjectDecision){
  90. return decisionMapper.getMyList(userId, tProjectDecision);
  91. }
  92. /**
  93. * 查询项目池
  94. *
  95. * @param pInstId 流程实例Id
  96. * @return 项目池
  97. */
  98. @Override
  99. public TProjectDecision selectTProjectDecisionByProcInstId(String pInstId)
  100. {
  101. return decisionMapper.selectTProjectDecisionByProcInstId(pInstId);
  102. }
  103. @Override
  104. public AjaxResult start(TProjectDecision tProjectDecision) {
  105. // 根据key值获取最新的流程部署id
  106. String pDefId = null;
  107. ProcessInstance pInst = null;
  108. try {
  109. List<ProcessDefinition> list = repositoryService.createProcessDefinitionQuery()
  110. .processDefinitionKey("dgt-decision-workflow")
  111. .orderByProcessDefinitionVersion().desc().list();
  112. if(list.size()==0){
  113. return AjaxResult.error("未找到该流程,无法开启流程!");
  114. }
  115. pDefId = list.get(0).getId();
  116. ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(pDefId)
  117. .latestVersion().singleResult();
  118. if (Objects.nonNull(processDefinition) && processDefinition.isSuspended()) {
  119. return AjaxResult.error("流程已被挂起,请先激活流程");
  120. }
  121. if(StringUtils.isNotBlank(pDefId)){
  122. //设置参数
  123. Map<String, Object> formProperties = new HashMap<String, Object>();
  124. // 设置流程发起人Id到流程中
  125. SysUser sysUser = SecurityUtils.getLoginUser().getUser();
  126. identityService.setAuthenticatedUserId(sysUser.getUserId().toString());
  127. formProperties.put("auditPass",tProjectDecision.isFlag()?true:false);
  128. //暂存
  129. formProperties.put(ProcessConstants.PROCESS_INITIATOR, sysUser.getUserId());
  130. //投资部负责人
  131. String leader=sysDeptMapper.selectDeptLeader("投资部");
  132. formProperties.put("MANAGER",sysUserService.selectUserByUserName(leader).getUserId());
  133. pInst = runtimeService.startProcessInstanceById(pDefId, formProperties);
  134. // ProcessInstance p = runtimeService.startProcessInstanceById(procDefId, variables);
  135. if(pInst!=null){
  136. String nickName= SecurityUtils.getLoginUser().getUser().getNickName();
  137. String userId=SecurityUtils.getLoginUser().getUserId().toString();
  138. //保存信息
  139. tProjectDecision.setId(IdUtils.fastSimpleUUID());
  140. tProjectDecision.setProcInstId(pInst.getProcessInstanceId());
  141. tProjectDecision.setCreateBy(userId);
  142. if(tProjectDecision.isFlag()){
  143. tProjectDecision.setStatus(1);//提交
  144. }else{
  145. tProjectDecision.setStatus(0);//暂存
  146. }
  147. // todo 保存投决资料
  148. tUnifyFileService.insertTUnifyFileLists(tProjectDecision.getListFile(),
  149. tProjectDecision.getProjectPoolId(),
  150. tProjectDecision.getId(),
  151. String.valueOf(FileType.DECISION.ordinal()),
  152. nickName,"q","5");
  153. // todo 保存其他附件
  154. tUnifyFileService.insertTUnifyFileLists(tProjectDecision.getOtherFile(),
  155. tProjectDecision.getProjectPoolId(),
  156. tProjectDecision.getId(),
  157. String.valueOf(FileType.DECISION.ordinal()),
  158. nickName,"k","5");
  159. // todo 更改投决状态
  160. tProjectPoolService.updateTProjectPoolByDecisionFlag(tProjectDecision.getProjectPoolId(),"1");
  161. // todo 短信提醒
  162. /*if(StringUtils.isNotEmpty(tProjectDecision.getParticipantsId())){
  163. StringUtils.str2List(tProjectDecision.getParticipantsId(),",",true,true).stream().forEach(str -> {
  164. SysUser user = sysUserService.selectUserById(Long.valueOf(str));
  165. String contents = "您好,"+user.getNickName()+"," + tProjectDecision.getProjectName() + "已发起投决申请。";
  166. try {
  167. SmsSenderUtils.sendSms(user.getPhonenumber(),contents);
  168. } catch (IOException e) {
  169. logger.error("短信发送失败"+e.getMessage());
  170. }
  171. });
  172. }*/
  173. // todo 增加项目创建记录
  174. tProjectCirculationService.insertTProjectCirculation(tProjectDecision.getProjectPoolId(),"投决申请",nickName);
  175. tProjectDecisionService.insertTProjectDecision(tProjectDecision);
  176. FlowBaseInfo flowBaseInfo = new FlowBaseInfo();
  177. flowBaseInfo.setCreateBy(userId);
  178. flowBaseInfo.setId(UUIDGenerator.uuid());
  179. flowBaseInfo.setFormProperties(flowInstanceService.getFormProperties(pInst));
  180. flowBaseInfo.setProcDefId(pDefId);
  181. flowBaseInfo.setProcInsId(pInst.getId());
  182. flowBaseInfo.setTaskName("申请人");
  183. flowBaseInfo.setFlag(true);
  184. flowBaseInfo.setComment(tProjectDecision.isFlag() ? "[提交]" : "[暂存]");
  185. flowBaseInfo.setStatus(FlowStatusEnum.STARTED.getName());
  186. activitiBaseInfoService.addActivitiBaseInfo(flowBaseInfo);
  187. TProjectPool tProjectPool=new TProjectPool();
  188. tProjectPool.setId(tProjectDecision.getProjectPoolId());
  189. tProjectPool.setProjectStage("5");//项目阶段-项目投决
  190. tProjectPool.setProjectState("h");//项目状态-准备项目投决材料
  191. tProjectPoolService.updateTProjectPool(tProjectPool);
  192. return AjaxResult.success();
  193. }
  194. return AjaxResult.error();
  195. }
  196. return AjaxResult.error();
  197. } catch (Exception e) {
  198. /*res.put("status",false);
  199. res.put("msg", "流程定义id为空, 无法开启流程!");*/
  200. e.printStackTrace();
  201. return AjaxResult.error("msg", "流程定义id为空, 无法开启流程!");
  202. }
  203. }
  204. @Override
  205. public AjaxResult complete(TProjectDecision tProjectDecision, TProjectMeeting tProjectMeeting,TProjectScoring tProjectScoring, FlowBaseInfo flow,HttpServletRequest request){
  206. //Task task=taskService.createTaskQuery().processInstanceId(tProjectApproval.getProcInstId()).singleResult();
  207. Task task = taskService.createTaskQuery().taskId(flow.getTaskId()).singleResult();
  208. if (Objects.isNull(task)) {
  209. return AjaxResult.error("任务不存在");
  210. }
  211. //当前你登录人
  212. SysUser userInfo=SecurityUtils.getLoginUser().getUser();
  213. Map<String, Object> rs = new HashMap<String, Object>();
  214. rs.put("status",true);
  215. Map<String, Object> formProperties = new HashMap<>();
  216. formProperties.put("auditPass", tProjectDecision.isFlag());
  217. //会议投决人
  218. if("meeting".equals(task.getTaskDefinitionKey())) {
  219. //立项审批人
  220. List<String> userIds = Arrays.asList(tProjectDecision.getParticipantsId().split(","));
  221. //List<String> userIds = Arrays.asList(tProjectMeeting.getParticipantsId().split(","));//会议人
  222. formProperties.put("decisionList", userIds);
  223. }
  224. if(StringUtils.isNotBlank(tProjectDecision.getIsTerminate())) {//不为空代表结束流程
  225. formProperties.put("whetherToEnd", true);
  226. }else{
  227. formProperties.put("whetherToEnd", false);
  228. }
  229. Map<String, Object> fpMap = flowService.getFormProperties(task.getProcessDefinitionId(), task.getId());
  230. try {
  231. rs = flowService.taskComplete( task.getId(), tProjectDecision.isFlag(), formProperties, userInfo.getUserId().toString());
  232. } catch (Exception e) {
  233. e.printStackTrace();
  234. rs.put("status", false);
  235. rs.put("msg", "流程审批失败");
  236. }
  237. boolean status = (boolean) rs.get("status");
  238. // 审核成功, 则记录审核信息
  239. if (status) {
  240. TProjectPool tProjectPool=new TProjectPool();
  241. tProjectPool.setId(tProjectDecision.getProjectPoolId());
  242. if("modifyApply".equals(task.getTaskDefinitionKey())) {
  243. // todo 保存投决资料
  244. tUnifyFileService.insertTUnifyFileLists(tProjectDecision.getListFile(),
  245. tProjectDecision.getProjectPoolId(),
  246. tProjectDecision.getId(),
  247. String.valueOf(FileType.DECISION.ordinal()),
  248. userInfo.getNickName(), "q", "5");
  249. // todo 保存其他附件
  250. tUnifyFileService.insertTUnifyFileLists(tProjectDecision.getOtherFile(),
  251. tProjectDecision.getProjectPoolId(),
  252. tProjectDecision.getId(),
  253. String.valueOf(FileType.OTHER.ordinal()),
  254. userInfo.getNickName(), "k", "5");
  255. }
  256. //发起会议
  257. if ("meeting".equals(task.getTaskDefinitionKey())) {
  258. tProjectMeeting.setId(IdUtils.fastSimpleUUID());
  259. tProjectMeeting.setCreateBy(userInfo.getNickName());
  260. tProjectMeeting.setProjectPoolId(tProjectDecision.getProjectPoolId());
  261. if(tProjectMeeting.getMeetingType().equals("LX")||tProjectMeeting.getMeetingType().equals("TJ")){
  262. int number = tProjectMeetingService.selectTProjectMeetingCode(DateUtils.lastTwoDigits()+"-");
  263. tProjectMeeting.setMeetingCode(tProjectMeeting.getProjectGroup()+"-"+ DateUtils.lastTwoDigits() +"-"+tProjectMeeting.getMeetingType()+"-"+ String.format("%03d",number+1));
  264. }else{
  265. int number = tProjectMeetingService.selectTProjectMeetingCode(DateUtils.dateTimeNow("YYYY"));
  266. tProjectMeeting.setMeetingCode(DateUtils.dateNow()+ String.format("%03d",number+1));
  267. }
  268. // todo 保存附件信息
  269. tUnifyFileService.insertTUnifyFileList(tProjectMeeting.getListFile(),
  270. tProjectMeeting.getProjectPoolId(),
  271. tProjectMeeting.getId(),//会议ID
  272. String.valueOf(FileType.MEETING.ordinal()),//文件类型:会议
  273. userInfo.getNickName());
  274. if(StringUtils.isNotBlank(tProjectMeeting.getMeetingTheme())) {
  275. // todo 增加会议创建记录
  276. tProjectCirculationService.insertTProjectCirculation(tProjectMeeting.getProjectPoolId(), tProjectMeeting.getMeetingTheme() + "(会议)", userInfo.getNickName());
  277. }
  278. // todo 发送短信-参与人-发起人
  279. if(tProjectMeeting.getMeetingType().equals("LX") || tProjectMeeting.getMeetingType().equals("TJ")){
  280. // todo 参与人
  281. /*if(StringUtils.isNotEmpty(tProjectMeeting.getParticipantsId())){
  282. StringUtils.str2List(tProjectMeeting.getParticipantsId(),",",true,true).stream().forEach(str -> {
  283. SysUser user = sysUserService.selectUserById(Long.valueOf(str));
  284. String contents = "您好," + user.getNickName() + ",兹定于 " +
  285. DateUtils.parseDateToStr("yyyy/MM/dd HH:mm",tProjectMeeting.getStartTime()) + "至" + DateUtils.parseDateToStr("yyyy/MM/dd HH:mm",tProjectMeeting.getEndTime()) +
  286. "在" + tProjectMeeting.getPlace() + "召开" + tProjectMeeting.getMeetingTheme() + "会议,请提前做好准备按时参加。";
  287. try {
  288. SmsSenderUtils.sendSms(user.getPhonenumber(),contents);
  289. } catch (IOException e) {
  290. logger.error("短信发送失败"+e.getMessage());
  291. }
  292. });
  293. }*/
  294. // todo 发起人
  295. /*if(StringUtils.isNotEmpty(tProjectMeeting.getPromoterId())){
  296. SysUser user = sysUserService.selectUserById(Long.valueOf(tProjectMeeting.getPromoterId()));
  297. String contents = "您好," + user.getNickName() + ",兹定于 " +
  298. DateUtils.parseDateToStr("yyyy/MM/dd HH:mm",tProjectMeeting.getStartTime()) + "至" + DateUtils.parseDateToStr("yyyy/MM/dd HH:mm",tProjectMeeting.getEndTime()) +
  299. "在" + tProjectMeeting.getPlace() + "召开" + tProjectMeeting.getMeetingTheme() + "会议,请提前做好准备按时参加。";
  300. try {
  301. SmsSenderUtils.sendSms(user.getPhonenumber(),contents);
  302. } catch (IOException e) {
  303. logger.error("短信发送失败"+e.getMessage());
  304. }
  305. }*/
  306. }
  307. tProjectMeetingService.insertTProjectMeeting(tProjectMeeting);
  308. }
  309. //上传打分表
  310. if("decision".equals(task.getTaskDefinitionKey())){
  311. tProjectScoring.setCreateBy(userInfo.getNickName());
  312. tProjectScoring.setProjectPoolId(tProjectDecision.getProjectPoolId());
  313. // todo 增加项目创建记录
  314. tProjectCirculationService.insertTProjectCirculation(tProjectScoring.getProjectPoolId(),"上传打分表", userInfo.getNickName());
  315. tProjectScoringService.insertTProjectScoring(tProjectScoring);
  316. }
  317. if("president".equals(task.getTaskDefinitionKey())){
  318. tProjectPool.setProjectStage("5");//项目阶段-项目投决
  319. tProjectPool.setProjectState("i");//项目状态-项目投决通过
  320. }
  321. //FlowBaseInfo flow = new FlowBaseInfo();
  322. if(flow==null){
  323. flow = new FlowBaseInfo();
  324. }
  325. flow.setId(UUIDGenerator.uuid());
  326. flow.setFormProperties(flowService.getFormProperties(fpMap, request.getParameterMap()));
  327. flow.setStatus(FlowStatusEnum.RUNNING.getName());
  328. flow.setProcDefId(task.getProcessDefinitionId());
  329. flow.setProcInsId(task.getProcessInstanceId());
  330. flow.setTaskDefKey(task.getTaskDefinitionKey());
  331. String isOk = tProjectDecision.isFlag() ? "[同意]" : "[驳回]";
  332. if ("modifyApply".equals(task.getTaskDefinitionKey())) {
  333. tProjectDecision.setStatus(tProjectDecision.isFlag() ? 1 : 4);
  334. isOk = tProjectDecision.isFlag() ? "[提交]" : "[关闭]";
  335. } else {
  336. tProjectDecision.setStatus(tProjectDecision.isFlag() ? 2 : 0);
  337. if("president".equals(task.getTaskDefinitionKey())){//总裁室
  338. if(!tProjectDecision.isFlag()&&StringUtils.isNotBlank(tProjectDecision.getIsTerminate())){//如果不为空代表可能是驳回(终止)或者观望
  339. isOk= "[关闭]";
  340. }
  341. }
  342. }
  343. if (null != flow.getComment()) {
  344. flow.setComment(isOk + flow.getComment());
  345. } else {
  346. flow.setComment(isOk);
  347. }
  348. flow.setTaskName(task.getName());
  349. flow.setCreateBy(SecurityUtils.getLoginUser().getUserId().toString());
  350. ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(task.getProcessInstanceId()).active().singleResult();
  351. // 表示流程已经审批结束了
  352. if (processInstance == null) {
  353. flow.setStatus(FlowStatusEnum.ENDED.getName());
  354. if (!"modifyApply".equals(task.getTaskDefinitionKey())&&!"president".equals(task.getTaskDefinitionKey())) {
  355. tProjectDecision.setStatus(3);
  356. tProjectPool.setProjectStage("6");//项目阶段-项目签约
  357. tProjectPool.setProjectState("j");//项目状态-签约协议沟通中
  358. tProjectPool.setUpdateBy(userInfo.getNickName());
  359. tProjectPool.setDecisionDate(new Date());//投决通过日期
  360. // todo 增加项目创建记录
  361. tProjectCirculationService.insertTProjectCirculation(tProjectPool.getId(),"项目投决完成", userInfo.getNickName());
  362. }else{
  363. tProjectPool.setProjectStage("5");//项目阶段-项目投决
  364. tProjectPool.setProjectState("c");//项目状态-
  365. tProjectPool.setDecisionFlag("0");
  366. tProjectPool.setUpdateBy(userInfo.getNickName());
  367. if("president".equals(task.getTaskDefinitionKey())){//终止和观望
  368. if(StringUtils.isNotBlank(tProjectDecision.getIsTerminate())) {
  369. tProjectDecision.setStatus(4);//流程状态为关闭
  370. if ("1".equals(tProjectDecision.getIsTerminate())) {
  371. tProjectPool.setProjectStatus("1");//终止
  372. } else {
  373. tProjectPool.setProjectStatus("2");//观望
  374. }
  375. }
  376. }
  377. }
  378. tProjectPoolService.updateTProjectPool(tProjectPool);
  379. }
  380. tProjectDecisionService.updateTProjectDecision(tProjectDecision);
  381. activitiBaseInfoService.addActivitiBaseInfo(flow);
  382. }
  383. return AjaxResult.success();
  384. }
  385. public TProjectMeeting selectTProjectMeetingByProcInstId(String pInstId){
  386. TProjectDecision tProjectDecision=this.selectTProjectDecisionByProcInstId(pInstId);
  387. TProjectMeeting tProjectMeeting=null;
  388. if(tProjectDecision!=null){
  389. tProjectMeeting=tProjectMeetingService.selectTProjectMeetingByProjectPoolId(tProjectDecision.getProjectPoolId());
  390. }
  391. return tProjectMeeting;
  392. }
  393. /**
  394. * 根据流程Id查询汇总分数和平均分数
  395. * @param pInstId
  396. * @return
  397. */
  398. @Override
  399. public Map<String, String> selectSumScore(String pInstId) {
  400. TProjectDecision tProjectDecision=this.selectTProjectDecisionByProcInstId(pInstId);
  401. Map<String, String> sumScore=new HashMap<>();
  402. if(tProjectDecision!=null){
  403. TProjectMeeting tProjectMeeting=tProjectMeetingService.selectTProjectMeetingByProjectPoolId(tProjectDecision.getProjectPoolId());
  404. sumScore=tProjectScoringMapper.selectMeetingId(tProjectMeeting.getId());
  405. }
  406. return sumScore;
  407. }
  408. }