DecisionServiceImpl.java 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606
  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.sms.SmsSenderUtils;
  9. import com.ruoyi.common.utils.uuid.IdUtils;
  10. import com.ruoyi.flowable.common.constant.ProcessConstants;
  11. import com.ruoyi.flowable.common.constant.UUIDGenerator;
  12. import com.ruoyi.flowable.common.enums.FlowStatusEnum;
  13. import com.ruoyi.flowable.factory.FlowServiceFactory;
  14. import com.ruoyi.flowable.service.IDecisionService;
  15. import com.ruoyi.flowable.service.IFlowInstanceService;
  16. import com.ruoyi.flowable.service.IFlowService;
  17. import com.ruoyi.invest.domain.*;
  18. import com.ruoyi.invest.domain.vo.ProjectDecisionVo;
  19. import com.ruoyi.invest.mapper.DecisionMapper;
  20. import com.ruoyi.invest.mapper.TProjectPoolMapper;
  21. import com.ruoyi.invest.mapper.TProjectScoringMapper;
  22. import com.ruoyi.invest.service.*;
  23. import com.ruoyi.system.mapper.SysDeptMapper;
  24. import com.ruoyi.system.service.ISysUserService;
  25. import com.ruoyi.tool.service.ITUnifyFileService;
  26. import org.flowable.engine.repository.ProcessDefinition;
  27. import org.flowable.engine.runtime.ProcessInstance;
  28. import org.flowable.task.api.Task;
  29. import org.slf4j.Logger;
  30. import org.slf4j.LoggerFactory;
  31. import org.springframework.beans.factory.annotation.Autowired;
  32. import org.springframework.beans.factory.annotation.Value;
  33. import org.springframework.stereotype.Service;
  34. import javax.servlet.http.HttpServletRequest;
  35. import java.io.IOException;
  36. import java.util.*;
  37. /**
  38. * 项目池Service业务层处理
  39. *
  40. * @author ruoyi
  41. * @date 2024-02-21
  42. */
  43. @Service
  44. public class DecisionServiceImpl extends FlowServiceFactory implements IDecisionService
  45. {
  46. protected final Logger logger = LoggerFactory.getLogger(this.getClass());
  47. @Value("${spring.profiles.active}")
  48. private String active;
  49. @Autowired
  50. private DecisionMapper decisionMapper;
  51. @Autowired
  52. private ITProjectDecisionService tProjectDecisionService;
  53. @Autowired
  54. private ITProjectPoolService tProjectPoolService;
  55. @Autowired
  56. private ITProjectCirculationService tProjectCirculationService;
  57. @Autowired
  58. private ITUnifyFileService tUnifyFileService;
  59. @Autowired
  60. private IFlowBaseInfoService activitiBaseInfoService;
  61. @Autowired
  62. private IFlowInstanceService flowInstanceService;
  63. @Autowired
  64. private ISysUserService sysUserService;
  65. @Autowired
  66. private SysDeptMapper sysDeptMapper;
  67. @Autowired
  68. private IFlowService flowService;
  69. @Autowired
  70. private ITProjectMeetingService tProjectMeetingService;
  71. @Autowired
  72. private ITProjectScoringService tProjectScoringService;
  73. @Autowired
  74. private TProjectScoringMapper tProjectScoringMapper;
  75. @Override
  76. public List<ProjectDecisionVo> selectAllDecisionList(TProjectDecision tProjectDecision){
  77. return decisionMapper.selectAllDecisionList(tProjectDecision);
  78. }
  79. @Override
  80. public List<ProjectDecisionVo> getMyTaskList(String userId, TProjectDecision tProjectDecision){
  81. return decisionMapper.getMyTaskList(userId, tProjectDecision);
  82. }
  83. @Override
  84. public List<ProjectDecisionVo> getMyDoneTaskList(String userId, TProjectDecision tProjectDecision){
  85. return decisionMapper.getMyDoneTaskList(userId, tProjectDecision);
  86. }
  87. @Override
  88. public List<ProjectDecisionVo> getMyList(String userId,TProjectDecision tProjectDecision){
  89. return decisionMapper.getMyList(userId, tProjectDecision);
  90. }
  91. /**
  92. * 查询项目池
  93. *
  94. * @param pInstId 流程实例Id
  95. * @return 项目池
  96. */
  97. @Override
  98. public TProjectDecision selectTProjectDecisionByProcInstId(String pInstId)
  99. {
  100. return decisionMapper.selectTProjectDecisionByProcInstId(pInstId);
  101. }
  102. @Override
  103. public AjaxResult start(TProjectDecision tProjectDecision) {
  104. // 根据key值获取最新的流程部署id
  105. String pDefId = null;
  106. ProcessInstance pInst = null;
  107. try {
  108. List<ProcessDefinition> list = repositoryService.createProcessDefinitionQuery()
  109. .processDefinitionKey("dgt-decision-workflow")
  110. .orderByProcessDefinitionVersion().desc().list();
  111. if(list.size()==0){
  112. return AjaxResult.error("未找到该流程,无法开启流程!");
  113. }
  114. pDefId = list.get(0).getId();
  115. ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(pDefId)
  116. .latestVersion().singleResult();
  117. if (Objects.nonNull(processDefinition) && processDefinition.isSuspended()) {
  118. return AjaxResult.error("流程已被挂起,请先激活流程");
  119. }
  120. if(StringUtils.isNotBlank(pDefId)){
  121. //设置参数
  122. Map<String, Object> formProperties = new HashMap<String, Object>();
  123. // 设置流程发起人Id到流程中
  124. SysUser sysUser = SecurityUtils.getLoginUser().getUser();
  125. identityService.setAuthenticatedUserId(sysUser.getUserId().toString());
  126. formProperties.put("auditPass",tProjectDecision.isFlag()?true:false);
  127. //暂存
  128. formProperties.put(ProcessConstants.PROCESS_INITIATOR, sysUser.getUserId());
  129. //投资部负责人
  130. String leader=sysDeptMapper.selectDeptLeader("投资部");
  131. formProperties.put("MANAGER",sysUserService.selectUserByUserName(leader).getUserId());
  132. pInst = runtimeService.startProcessInstanceById(pDefId, formProperties);
  133. // ProcessInstance p = runtimeService.startProcessInstanceById(procDefId, variables);
  134. if(pInst!=null){
  135. String nickName= SecurityUtils.getLoginUser().getUser().getNickName();
  136. String userId=SecurityUtils.getLoginUser().getUserId().toString();
  137. //保存信息
  138. tProjectDecision.setId(IdUtils.fastSimpleUUID());
  139. tProjectDecision.setProcInstId(pInst.getProcessInstanceId());
  140. tProjectDecision.setCreateBy(userId);
  141. if(tProjectDecision.isFlag()){
  142. tProjectDecision.setStatus(1);//提交
  143. }else{
  144. tProjectDecision.setStatus(0);//暂存
  145. }
  146. // todo 保存投决资料
  147. tUnifyFileService.insertTUnifyFileLists(tProjectDecision.getListFile(),
  148. tProjectDecision.getProjectPoolId(),
  149. tProjectDecision.getId(),
  150. String.valueOf(FileType.DECISION.ordinal()),
  151. nickName,"q","5");
  152. // todo 保存其他附件
  153. tUnifyFileService.insertTUnifyFileLists(tProjectDecision.getOtherFile(),
  154. tProjectDecision.getProjectPoolId(),
  155. tProjectDecision.getId(),
  156. String.valueOf(FileType.OTHER.ordinal()),
  157. nickName,"k","5");
  158. // todo 更改投决状态
  159. tProjectPoolService.updateTProjectPoolByDecisionFlag(tProjectDecision.getProjectPoolId(),"1");
  160. // todo 短信提醒
  161. /*if(StringUtils.isNotEmpty(tProjectDecision.getParticipantsId())){
  162. StringUtils.str2List(tProjectDecision.getParticipantsId(),",",true,true).stream().forEach(str -> {
  163. SysUser user = sysUserService.selectUserById(Long.valueOf(str));
  164. String contents = "您好,"+user.getNickName()+"," + tProjectDecision.getProjectName() + "已发起投决申请。";
  165. try {
  166. SmsSenderUtils.sendSms(user.getPhonenumber(),contents);
  167. } catch (IOException e) {
  168. logger.error("短信发送失败"+e.getMessage());
  169. }
  170. });
  171. }*/
  172. // todo 增加项目创建记录
  173. tProjectCirculationService.insertTProjectCirculation(tProjectDecision.getProjectPoolId(),"投决申请",nickName);
  174. tProjectDecisionService.insertTProjectDecision(tProjectDecision);
  175. FlowBaseInfo flowBaseInfo = new FlowBaseInfo();
  176. flowBaseInfo.setCreateBy(userId);
  177. flowBaseInfo.setId(UUIDGenerator.uuid());
  178. flowBaseInfo.setFormProperties(flowInstanceService.getFormProperties(pInst));
  179. flowBaseInfo.setProcDefId(pDefId);
  180. flowBaseInfo.setProcInsId(pInst.getId());
  181. flowBaseInfo.setTaskName("申请人");
  182. flowBaseInfo.setFlag(true);
  183. flowBaseInfo.setComment(tProjectDecision.isFlag() ? "[提交]" : "[暂存]");
  184. flowBaseInfo.setStatus(FlowStatusEnum.STARTED.getName());
  185. flowBaseInfo.setFlag(tProjectDecision.isFlag());
  186. activitiBaseInfoService.addActivitiBaseInfo(flowBaseInfo);
  187. TProjectPool tProjectPool=new TProjectPool();
  188. tProjectPool.setId(tProjectDecision.getProjectPoolId());
  189. tProjectPool.setProjectStage("5");//项目阶段-项目投决
  190. tProjectPool.setProjectState("h");//项目状态-准备项目投决材料
  191. tProjectPool.setProjectStatus("0");//项目机会状态-正常
  192. tProjectPoolService.updateTProjectPool(tProjectPool);
  193. if(flowBaseInfo.isFlag()){
  194. getAssignee(tProjectDecision,flowBaseInfo);
  195. }
  196. if (Objects.equals(active, "druid")) {
  197. // todo 短信
  198. sendMessage(flowBaseInfo,"");
  199. }
  200. return AjaxResult.success();
  201. }
  202. return AjaxResult.error();
  203. }
  204. return AjaxResult.error();
  205. } catch (Exception e) {
  206. /*res.put("status",false);
  207. res.put("msg", "流程定义id为空, 无法开启流程!");*/
  208. e.printStackTrace();
  209. return AjaxResult.error("msg", "流程定义id为空, 无法开启流程!");
  210. }
  211. }
  212. @Override
  213. public AjaxResult complete(TProjectDecision tProjectDecision, TProjectMeeting tProjectMeeting,TProjectScoring tProjectScoring, FlowBaseInfo flow,HttpServletRequest request) throws Exception {
  214. //Task task=taskService.createTaskQuery().processInstanceId(tProjectApproval.getProcInstId()).singleResult();
  215. Task task = taskService.createTaskQuery().taskId(flow.getTaskId()).singleResult();
  216. if (Objects.isNull(task)) {
  217. return AjaxResult.error("任务不存在");
  218. }
  219. //当前你登录人
  220. SysUser userInfo=SecurityUtils.getLoginUser().getUser();
  221. Map<String, Object> rs = new HashMap<String, Object>();
  222. rs.put("status",true);
  223. Map<String, Object> formProperties = new HashMap<>();
  224. formProperties.put("auditPass", tProjectDecision.isFlag());
  225. //会议投决人
  226. if("meeting".equals(task.getTaskDefinitionKey())&&tProjectDecision.isFlag()) {
  227. //立项审批人
  228. List<String> userIds = Arrays.asList(tProjectDecision.getParticipantsId().split(","));
  229. //List<String> userIds = Arrays.asList(tProjectMeeting.getParticipantsId().split(","));//会议人
  230. formProperties.put("decisionList", userIds);
  231. }
  232. if(StringUtils.isNotBlank(tProjectDecision.getIsTerminate())) {//不为空代表结束流程
  233. formProperties.put("whetherToEnd", true);
  234. }else{
  235. formProperties.put("whetherToEnd", false);
  236. }
  237. Map<String, Object> fpMap = flowService.getFormProperties(task.getProcessDefinitionId(), task.getId());
  238. try {
  239. rs = flowService.taskComplete( task.getId(), tProjectDecision.isFlag(), formProperties, userInfo.getUserId().toString());
  240. } catch (Exception e) {
  241. e.printStackTrace();
  242. rs.put("status", false);
  243. rs.put("msg", "流程审批失败");
  244. }
  245. boolean status = (boolean) rs.get("status");
  246. // 审核成功, 则记录审核信息
  247. if (status) {
  248. TProjectPool tProjectPool=new TProjectPool();
  249. tProjectPool.setId(tProjectDecision.getProjectPoolId());
  250. if("modifyApply".equals(task.getTaskDefinitionKey())) {
  251. // todo 保存投决资料
  252. tUnifyFileService.insertTUnifyFileLists(tProjectDecision.getListFile(),
  253. tProjectDecision.getProjectPoolId(),
  254. tProjectDecision.getId(),
  255. String.valueOf(FileType.DECISION.ordinal()),
  256. userInfo.getNickName(), "q", "5");
  257. // todo 保存其他附件
  258. tUnifyFileService.insertTUnifyFileLists(tProjectDecision.getOtherFile(),
  259. tProjectDecision.getProjectPoolId(),
  260. tProjectDecision.getId(),
  261. String.valueOf(FileType.OTHER.ordinal()),
  262. userInfo.getNickName(), "k", "5");
  263. }
  264. //发起会议
  265. if ("meeting".equals(task.getTaskDefinitionKey())&&tProjectDecision.isFlag()) {
  266. tProjectMeeting.setId(IdUtils.fastSimpleUUID());
  267. tProjectMeeting.setCreateBy(userInfo.getNickName());
  268. tProjectMeeting.setProjectPoolId(tProjectDecision.getProjectPoolId());
  269. if(tProjectMeeting.getMeetingType().equals("LX")||tProjectMeeting.getMeetingType().equals("TJ")){
  270. int number = tProjectMeetingService.selectTProjectMeetingCode(DateUtils.lastTwoDigits()+"-");
  271. tProjectMeeting.setMeetingCode(tProjectMeeting.getProjectGroup()+"-"+ DateUtils.lastTwoDigits() +"-"+tProjectMeeting.getMeetingType()+"-"+ String.format("%03d",number+1));
  272. }else{
  273. int number = tProjectMeetingService.selectTProjectMeetingCode(DateUtils.dateTimeNow("YYYY"));
  274. tProjectMeeting.setMeetingCode(DateUtils.dateNow()+ String.format("%03d",number+1));
  275. }
  276. // todo 保存附件信息
  277. tUnifyFileService.insertTUnifyFileList(tProjectMeeting.getListFile(),
  278. tProjectMeeting.getProjectPoolId(),
  279. tProjectMeeting.getId(),//会议ID
  280. String.valueOf(FileType.MEETING.ordinal()),//文件类型:会议
  281. userInfo.getNickName());
  282. if(StringUtils.isNotBlank(tProjectMeeting.getMeetingTheme())) {
  283. // todo 增加会议创建记录
  284. tProjectCirculationService.insertTProjectCirculation(tProjectMeeting.getProjectPoolId(), tProjectMeeting.getMeetingTheme() + "(会议)", userInfo.getNickName());
  285. }
  286. // todo 发送短信-参与人-发起人
  287. if(tProjectMeeting.getMeetingType().equals("LX") || tProjectMeeting.getMeetingType().equals("TJ")){
  288. // todo 参与人
  289. /*if(StringUtils.isNotEmpty(tProjectMeeting.getParticipantsId())){
  290. StringUtils.str2List(tProjectMeeting.getParticipantsId(),",",true,true).stream().forEach(str -> {
  291. SysUser user = sysUserService.selectUserById(Long.valueOf(str));
  292. String contents = "您好," + user.getNickName() + ",兹定于 " +
  293. DateUtils.parseDateToStr("yyyy/MM/dd HH:mm",tProjectMeeting.getStartTime()) + "至" + DateUtils.parseDateToStr("yyyy/MM/dd HH:mm",tProjectMeeting.getEndTime()) +
  294. "在" + tProjectMeeting.getPlace() + "召开" + tProjectMeeting.getMeetingTheme() + "会议,请提前做好准备按时参加。";
  295. try {
  296. SmsSenderUtils.sendSms(user.getPhonenumber(),contents);
  297. } catch (IOException e) {
  298. logger.error("短信发送失败"+e.getMessage());
  299. }
  300. });
  301. }*/
  302. // todo 发起人
  303. /*if(StringUtils.isNotEmpty(tProjectMeeting.getPromoterId())){
  304. SysUser user = sysUserService.selectUserById(Long.valueOf(tProjectMeeting.getPromoterId()));
  305. String contents = "您好," + user.getNickName() + ",兹定于 " +
  306. DateUtils.parseDateToStr("yyyy/MM/dd HH:mm",tProjectMeeting.getStartTime()) + "至" + DateUtils.parseDateToStr("yyyy/MM/dd HH:mm",tProjectMeeting.getEndTime()) +
  307. "在" + tProjectMeeting.getPlace() + "召开" + tProjectMeeting.getMeetingTheme() + "会议,请提前做好准备按时参加。";
  308. try {
  309. SmsSenderUtils.sendSms(user.getPhonenumber(),contents);
  310. } catch (IOException e) {
  311. logger.error("短信发送失败"+e.getMessage());
  312. }
  313. }*/
  314. }
  315. tProjectMeetingService.insertTProjectMeeting(tProjectMeeting);
  316. }
  317. //上传打分表
  318. if("decision".equals(task.getTaskDefinitionKey())){
  319. tProjectScoring.setCreateBy(userInfo.getNickName());
  320. tProjectScoring.setProjectPoolId(tProjectDecision.getProjectPoolId());
  321. // todo 增加项目创建记录
  322. tProjectCirculationService.insertTProjectCirculation(tProjectScoring.getProjectPoolId(),"上传打分表", userInfo.getNickName());
  323. tProjectScoringService.insertTProjectScoring(tProjectScoring);
  324. }
  325. if("president".equals(task.getTaskDefinitionKey())){
  326. tProjectPool.setProjectStage("5");//项目阶段-项目投决
  327. tProjectPool.setProjectState("i");//项目状态-项目投决通过
  328. }
  329. //FlowBaseInfo flow = new FlowBaseInfo();
  330. if(flow==null){
  331. flow = new FlowBaseInfo();
  332. }
  333. flow.setId(UUIDGenerator.uuid());
  334. flow.setFormProperties(flowService.getFormProperties(fpMap, request.getParameterMap()));
  335. flow.setStatus(FlowStatusEnum.RUNNING.getName());
  336. flow.setProcDefId(task.getProcessDefinitionId());
  337. flow.setProcInsId(task.getProcessInstanceId());
  338. flow.setTaskDefKey(task.getTaskDefinitionKey());
  339. String isOk = tProjectDecision.isFlag() ? "[同意]" : "[驳回]";
  340. if ("modifyApply".equals(task.getTaskDefinitionKey())) {
  341. tProjectDecision.setStatus(tProjectDecision.isFlag() ? 1 : 4);
  342. isOk = tProjectDecision.isFlag() ? "[提交]" : "[关闭]";
  343. } else {
  344. tProjectDecision.setStatus(tProjectDecision.isFlag() ? 2 : 0);
  345. if("president".equals(task.getTaskDefinitionKey())){//总裁室
  346. if(!tProjectDecision.isFlag()&&StringUtils.isNotBlank(tProjectDecision.getIsTerminate())){//如果不为空代表可能是驳回(终止)或者观望
  347. isOk= "[关闭]";
  348. }
  349. }
  350. }
  351. if (null != flow.getComment()) {
  352. flow.setComment(isOk + flow.getComment());
  353. } else {
  354. flow.setComment(isOk);
  355. }
  356. flow.setTaskName(task.getName());
  357. flow.setCreateBy(SecurityUtils.getLoginUser().getUserId().toString());
  358. flow.setFlag(tProjectDecision.isFlag());
  359. ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(task.getProcessInstanceId()).active().singleResult();
  360. String result="";
  361. // 表示流程已经审批结束了
  362. if (processInstance == null) {
  363. flow.setStatus(FlowStatusEnum.ENDED.getName());
  364. if (!"modifyApply".equals(task.getTaskDefinitionKey())&&!"president".equals(task.getTaskDefinitionKey())) {
  365. tProjectDecision.setStatus(3);
  366. tProjectPool.setProjectStage("6");//项目阶段-项目签约
  367. tProjectPool.setProjectState("j");//项目状态-签约协议沟通中
  368. tProjectPool.setUpdateBy(userInfo.getNickName());
  369. tProjectPool.setDecisionDate(new Date());//投决通过日期
  370. // todo 增加项目创建记录
  371. tProjectCirculationService.insertTProjectCirculation(tProjectPool.getId(),"项目投决完成", userInfo.getNickName());
  372. }else{
  373. tProjectPool.setProjectStage("5");//项目阶段-项目投决
  374. tProjectPool.setProjectState("c");//项目状态-
  375. tProjectPool.setDecisionFlag("0");
  376. tProjectPool.setUpdateBy(userInfo.getNickName());
  377. if("president".equals(task.getTaskDefinitionKey())){//终止和观望
  378. if(StringUtils.isNotBlank(tProjectDecision.getIsTerminate())) {
  379. tProjectDecision.setStatus(4);//流程状态为关闭
  380. if ("1".equals(tProjectDecision.getIsTerminate())) {
  381. result="【终止】";
  382. tProjectPool.setProjectStatus("1");//终止
  383. } else {
  384. result="【观望】";
  385. tProjectPool.setProjectStatus("2");//观望
  386. }
  387. }
  388. }
  389. }
  390. tProjectPoolService.updateTProjectPool(tProjectPool);
  391. }
  392. tProjectDecisionService.updateTProjectDecision(tProjectDecision);
  393. activitiBaseInfoService.addActivitiBaseInfo(flow);
  394. if(flow.isFlag()){
  395. getAssignee(tProjectDecision,flow);
  396. }
  397. if (Objects.equals(active, "druid")) {
  398. //todo 短信
  399. sendMessage(flow,result);
  400. }
  401. }
  402. return AjaxResult.success();
  403. }
  404. public TProjectMeeting selectTProjectMeetingByProcInstId(String pInstId){
  405. TProjectDecision tProjectDecision=this.selectTProjectDecisionByProcInstId(pInstId);
  406. TProjectMeeting tProjectMeeting=null;
  407. if(tProjectDecision!=null){
  408. tProjectMeeting=tProjectMeetingService.selectTProjectMeetingByProjectPoolId(tProjectDecision.getProjectPoolId());
  409. }
  410. return tProjectMeeting;
  411. }
  412. /**
  413. * 根据流程Id查询汇总分数和平均分数
  414. * @param pInstId
  415. * @return
  416. */
  417. @Override
  418. public Map<String, String> selectSumScore(String pInstId) {
  419. TProjectDecision tProjectDecision=this.selectTProjectDecisionByProcInstId(pInstId);
  420. Map<String, String> sumScore=new HashMap<>();
  421. if(tProjectDecision!=null){
  422. TProjectMeeting tProjectMeeting=tProjectMeetingService.selectTProjectMeetingByProjectPoolId(tProjectDecision.getProjectPoolId());
  423. sumScore=tProjectScoringMapper.selectMeetingId(tProjectMeeting.getId());
  424. }
  425. return sumScore;
  426. }
  427. // todo 短信
  428. public void sendMessage(FlowBaseInfo flowBaseInfo,String result) {
  429. boolean flag = flowBaseInfo.isFlag();
  430. String procInsId = flowBaseInfo.getProcInsId();
  431. // 待办任务
  432. List<Task> tasks = taskService.createTaskQuery().processInstanceId(procInsId).list();
  433. // 对应业务单据
  434. ProjectDecisionVo projectDecision = decisionMapper.selectProjectDecisionByProcInstId(procInsId);
  435. if (projectDecision == null) {
  436. return;
  437. }
  438. // 申请人
  439. SysUser applyUserInfo = sysUserService.selectUserById(Long.valueOf(projectDecision.getCreateBy()));
  440. // 当前登录人
  441. SysUser loginUser = SecurityUtils.getLoginUser().getUser();
  442. if(tasks.size()>0) {
  443. for (int i = 0; i < tasks.size(); i++) {
  444. Task task = tasks.get(i);
  445. if (task != null) {
  446. if (Objects.equals(applyUserInfo.getUserId(), loginUser.getUserId()) && !flag) {
  447. // 如果是申请人暂存或者关闭或者自己驳回,不用给自己发审批短信
  448. continue;
  449. } else {
  450. // 申请人提交,给下一个审批人发短信
  451. // 审批人同意,给下一个审批人发短信
  452. if (flag) { //给审批人发送短信
  453. if ("decision".equals(flowBaseInfo.getTaskDefKey())&&"decision".equals(task.getTaskDefinitionKey())){
  454. continue;
  455. }
  456. String assignee = task.getAssignee();
  457. if (org.apache.commons.lang3.StringUtils.isNotBlank(assignee)) { // 给审批人发送短信
  458. SysUser auditUser = sysUserService.selectUserById(Long.valueOf(assignee));
  459. String auditContents = auditUser.getNickName() + ",您好。投资系统中" + projectDecision.getProjectName() + "的项目投决流程待处理,请查看!";
  460. if (auditUser != null && StringUtils.isNotBlank(auditUser.getPhonenumber())) {
  461. try{
  462. SmsSenderUtils.sendSms(auditUser.getPhonenumber(), auditContents);
  463. } catch (IOException e) {
  464. logger.error("短信发送失败"+e.getMessage());
  465. }
  466. }
  467. }
  468. } else { // 审批人驳回,给申请人发短信
  469. String rejectContents = applyUserInfo.getNickName()+",您好。你在投资系统中提交" + projectDecision.getProjectName() + "的项目投决申请已审核,结果为【驳回】,请查看!";
  470. if (applyUserInfo != null && StringUtils.isNotBlank(applyUserInfo.getPhonenumber())) {
  471. try{
  472. SmsSenderUtils.sendSms(applyUserInfo.getPhonenumber(), rejectContents);
  473. } catch (IOException e) {
  474. logger.error("短信发送失败"+e.getMessage());
  475. }
  476. }
  477. }
  478. }
  479. }
  480. }
  481. }else{
  482. String completeContents ="";
  483. if(flag) {
  484. // 审批完成,给申请人发短信
  485. //XXX,您好。你在投资系统中提交“XXX”的项目投决申请已审核,结果为【通过】/【驳回】/【观望】!
  486. completeContents = applyUserInfo.getNickName()+",您好。你在投资系统中提交" + projectDecision.getProjectName() + "的项目投决申请已审核,结果为【同意】,请查看!";
  487. if (applyUserInfo != null && StringUtils.isNotBlank(applyUserInfo.getPhonenumber())) {
  488. try{
  489. SmsSenderUtils.sendSms(applyUserInfo.getPhonenumber(), completeContents);
  490. } catch (IOException e) {
  491. logger.error("短信发送失败"+e.getMessage());
  492. }
  493. }
  494. }else{
  495. if(StringUtils.isNotEmpty(result)){//代表是终止或者观望
  496. completeContents = applyUserInfo.getNickName()+",您好。你在投资系统中提交" + projectDecision.getProjectName() + "的项目投决申请已审核,结果为"+result+",请查看!";
  497. if (applyUserInfo != null && StringUtils.isNotBlank(applyUserInfo.getPhonenumber())) {
  498. try{
  499. SmsSenderUtils.sendSms(applyUserInfo.getPhonenumber(), completeContents);
  500. } catch (IOException e) {
  501. logger.error("短信发送失败"+e.getMessage());
  502. }
  503. }
  504. }
  505. }
  506. }
  507. }
  508. /**
  509. * 跳节点
  510. * @param projectDecision
  511. * @param flow
  512. * @throws Exception
  513. */
  514. public void getAssignee(TProjectDecision projectDecision, FlowBaseInfo flow) throws Exception {
  515. SysUser sysUser=SecurityUtils.getLoginUser().getUser();//当前登陆人
  516. if (sysUser == null) {
  517. sysUser=sysUserService.selectUserById(Long.parseLong(projectDecision.getCreateBy()));
  518. }
  519. List<Task> tasks = taskService.createTaskQuery().processInstanceId(flow.getProcInsId()).list();
  520. Long userId=sysUser.getUserId();
  521. for(int i = 0; i < tasks.size(); i++) {
  522. Task task = tasks.get(i);
  523. if (task == null || StringUtils.isBlank(task.getAssignee())) {
  524. return;
  525. }
  526. Long assignee = Long.parseLong(task.getAssignee());
  527. if ("deptLeader".equals(task.getTaskDefinitionKey()) && (userId.equals(assignee) || projectDecision.getCreateBy().equals(assignee))) {
  528. JumpNode(projectDecision, flow);
  529. }
  530. }
  531. }
  532. public Map<String, Object> JumpNode(TProjectDecision projectDecision, FlowBaseInfo flow) throws Exception{
  533. List<Task> list = taskService.createTaskQuery().processInstanceId(flow.getProcInsId()).list();
  534. String taskId=null;
  535. Map<String, Object> rs = new HashMap<String, Object>();
  536. rs.put("status",true);
  537. if (list.size()>0) {
  538. taskId = list.get(0).getId();
  539. Task task=list.get(0);
  540. flow.setTaskId(taskId);
  541. boolean flag = flow.isFlag();
  542. //当前流程节点Id信息
  543. // ExecutionEntity execution = (ExecutionEntity) runtimeService.createProcessInstanceQuery().processInstanceId(flow.getProcInsId()).singleResult();
  544. // String activitiId = execution.getActivityId();
  545. Map<String, Object> formProperties = new HashMap<>();
  546. formProperties.put("auditPass", flow.isFlag());
  547. //部门负责人
  548. String leader=sysDeptMapper.selectDeptLeader("投资部");
  549. SysUser sysUser=sysUserService.selectUserByUserName(leader);
  550. formProperties.put("MANAGER",sysUser.getUserId());
  551. //会议投决人
  552. if("meeting".equals(task.getTaskDefinitionKey())) {
  553. //立项审批人
  554. List<String> userIds = Arrays.asList(projectDecision.getParticipantsId().split(","));
  555. formProperties.put("decisionList", userIds);
  556. }
  557. if(StringUtils.isNotBlank(projectDecision.getIsTerminate())) {//不为空代表结束流程
  558. formProperties.put("whetherToEnd", true);
  559. }else{
  560. formProperties.put("whetherToEnd", false);
  561. }
  562. //当前登陆人
  563. Long userId=SecurityUtils.getUserId();
  564. try {
  565. //表单审核
  566. rs = flowService.taskComplete(taskId, flag, formProperties, userId.toString());
  567. } catch (Exception e) {
  568. e.printStackTrace();
  569. rs.put("status", false);
  570. rs.put("msg", "流程审批失败");
  571. }
  572. if (flow.isFlag()){
  573. getAssignee(projectDecision,flow);
  574. }
  575. }
  576. return rs;
  577. }
  578. }