FlowConstructor.java 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. package com.fjhx.utils;
  2. import cn.hutool.core.bean.BeanUtil;
  3. import cn.hutool.core.util.ObjectUtil;
  4. import cn.hutool.extra.spring.SpringUtil;
  5. import com.alibaba.fastjson.JSONObject;
  6. import com.fjhx.constants.FlowConstant;
  7. import com.fjhx.constants.FlowExplainConstant;
  8. import com.fjhx.constants.StatusConstant;
  9. import com.fjhx.entity.example.ExampleDetails;
  10. import com.fjhx.entity.example.ExampleInfo;
  11. import com.fjhx.entity.process.ProcessNodeButton;
  12. import com.fjhx.entity.process.ProcessTenant;
  13. import com.fjhx.enums.ButtonNameEnum;
  14. import com.fjhx.feign.IFlowClient;
  15. import com.fjhx.params.ExampleInfoEx;
  16. import com.fjhx.params.FlowInfo;
  17. import com.fjhx.params.GetNodeButtonVo;
  18. import org.springblade.core.tool.api.R;
  19. public class FlowConstructor {
  20. private static final IFlowClient flowClient = SpringUtil.getBean(IFlowClient.class);
  21. private ExampleAbstract exampleAbstract;
  22. private FlowConstructor() {
  23. }
  24. /**
  25. * 初始化
  26. */
  27. public static FlowConstructor init(ExampleAbstract exampleAbstract) {
  28. FlowConstructor flowConstructor = new FlowConstructor();
  29. flowConstructor.exampleAbstract = exampleAbstract;
  30. return flowConstructor;
  31. }
  32. /**
  33. * 创建流程
  34. *
  35. * @param flowLinkNo 流程关联编号
  36. * @return 流程实例对象
  37. */
  38. public ExampleInfo create(Long flowLinkNo, String remarks) {
  39. // 获取流程编码
  40. String code = exampleAbstract.getCode();
  41. Assert.notEmpty(code, FlowExplainConstant.CODE_EMPTY);
  42. // 获取租户流程
  43. R<FlowInfo> r = flowClient.getProcessTenant(flowLinkNo, code);
  44. Assert.eqTrue(r.isSuccess(), r.getMsg());
  45. FlowInfo flowInfo = r.getData();
  46. // 创建流程实例
  47. ExampleInfoEx exampleInfo = new ExampleInfoEx();
  48. exampleInfo.setProcessInfoId(flowInfo.getId());
  49. exampleInfo.setFlowLinkNo(flowLinkNo);
  50. if (ObjectUtil.isNotEmpty(exampleAbstract.cacheData)) {
  51. exampleInfo.setCacheData(JSONObject.toJSONString(exampleAbstract.cacheData));
  52. }
  53. ExampleDetails startExampleDetails = new ExampleDetails();
  54. startExampleDetails.setRemarks(remarks);
  55. // 如果租户流程为空,直接完成流程
  56. ProcessTenant processTenant = flowInfo.processTenantEntity();
  57. if (ObjectUtil.isEmpty(processTenant)) {
  58. exampleInfo.setProcessNodeId(FlowConstant.OVER_PROCESS_FLAG);
  59. exampleInfo.setComplete(StatusConstant.YES);
  60. exampleInfo.setProcessNodeCode(FlowConstant.END_CODE);
  61. startExampleDetails.setNameType(ButtonNameEnum.START.getType());
  62. // 执行流程结束方法
  63. exampleAbstract.end();
  64. }
  65. // 租户流程不为空,走租户流程
  66. else {
  67. Long processTenantId = processTenant.getId();
  68. // 赋值租户流程id
  69. exampleInfo.setProcessTenantId(processTenantId);
  70. // 调用方法查看是否有指定跳转节点,没有则正常流转
  71. String circulation = exampleAbstract.circulation(FlowConstant.START_CODE);
  72. GetNodeButtonVo getNodeButtonVo = new GetNodeButtonVo();
  73. getNodeButtonVo.setProcessTenantId(processTenantId);
  74. getNodeButtonVo.setNodeCode(ObjectUtil.isEmpty(circulation) ? FlowConstant.START_CODE : circulation);
  75. R<ProcessNodeButton> nodeButtonResult = flowClient.getNodeButton(getNodeButtonVo);
  76. Assert.eqTrue(nodeButtonResult.isSuccess(), nodeButtonResult.getMsg());
  77. ProcessNodeButton processNodeButton = nodeButtonResult.getData();
  78. startExampleDetails.setProcessNodeId(processNodeButton.getProcessNodeId());
  79. startExampleDetails.setProcessNodeButtonId(processNodeButton.getId());
  80. startExampleDetails.setNameType(processNodeButton.getNameType());
  81. // 流转节点
  82. Long jumpNodeId = processNodeButton.getJumpNodeId();
  83. // 流程结束
  84. if (jumpNodeId.equals(FlowConstant.OVER_PROCESS_FLAG)) {
  85. exampleInfo.setComplete(StatusConstant.YES);
  86. exampleInfo.setProcessNodeCode(FlowConstant.END_CODE);
  87. exampleAbstract.end();
  88. }
  89. // 正常流转到下一节点
  90. else {
  91. exampleInfo.setComplete(StatusConstant.No);
  92. }
  93. // 赋值跳转节点id
  94. exampleInfo.setProcessNodeId(jumpNodeId);
  95. exampleInfo.setProcessNodeCode(processNodeButton.getProcessNodeCode());
  96. }
  97. exampleInfo.setExampleDetails(startExampleDetails);
  98. // 保存流程实例
  99. R<ExampleInfo> exampleInfoSaveResult = flowClient.exampleInfoSave(exampleInfo);
  100. Assert.eqTrue(exampleInfoSaveResult.isSuccess(), exampleInfoSaveResult.getMsg());
  101. return exampleInfoSaveResult.getData();
  102. }
  103. /**
  104. * 流程跳转
  105. *
  106. * @param flowLinkNo 流程关联编号
  107. * @param buttonId 按钮id
  108. * @param remarks 审批意见
  109. */
  110. public void jump(Long flowLinkNo, Long buttonId, String remarks) {
  111. R<ExampleInfo> exampleInfoResult = flowClient.getExampleInfo(flowLinkNo);
  112. Assert.eqTrue(exampleInfoResult.isSuccess(), exampleInfoResult.getMsg());
  113. ExampleInfo exampleInfo = exampleInfoResult.getData();
  114. // 获取流程缓存
  115. exampleAbstract.cacheData = exampleInfo.getCacheData();
  116. // 赋值新缓存
  117. if (ObjectUtil.isNotEmpty(exampleAbstract.cacheData)) {
  118. exampleInfo.setCacheData(JSONObject.toJSONString(exampleAbstract.cacheData));
  119. }
  120. // 调用方法查看是否有指定跳转节点,没有则正常流转
  121. GetNodeButtonVo getNodeButtonVo = new GetNodeButtonVo();
  122. getNodeButtonVo.setProcessTenantId(exampleInfo.getProcessTenantId());
  123. getNodeButtonVo.setNodeCode(exampleAbstract.circulation(exampleInfo.getProcessNodeCode()));
  124. getNodeButtonVo.setButtonId(buttonId);
  125. R<ProcessNodeButton> nodeButtonResult = flowClient.getNodeButton(getNodeButtonVo);
  126. Assert.eqTrue(nodeButtonResult.isSuccess(), nodeButtonResult.getMsg());
  127. ProcessNodeButton processNodeButton = nodeButtonResult.getData();
  128. // 赋值跳转节点id
  129. exampleInfo.setProcessNodeId(processNodeButton.getJumpNodeId());
  130. exampleInfo.setProcessNodeCode(processNodeButton.getProcessNodeCode());
  131. // 流程正常结束
  132. if (processNodeButton.getJumpNodeId().equals(FlowConstant.OVER_PROCESS_FLAG)) {
  133. exampleInfo.setComplete(StatusConstant.YES);
  134. exampleInfo.setProcessNodeCode(FlowConstant.END_CODE);
  135. exampleAbstract.end();
  136. }
  137. // 驳回结束
  138. else if (ButtonNameEnum.REJECT.getType().equals(processNodeButton.getNameType())) {
  139. exampleInfo.setComplete(StatusConstant.YES);
  140. exampleInfo.setProcessNodeCode(FlowConstant.END_CODE);
  141. exampleAbstract.fail(processNodeButton.getProcessNodeCode());
  142. }
  143. // 正常流转到下一节点
  144. else {
  145. exampleInfo.setComplete(StatusConstant.No);
  146. }
  147. // 流程明细
  148. ExampleDetails startExampleDetails = new ExampleDetails();
  149. startExampleDetails.setRemarks(remarks);
  150. startExampleDetails.setProcessNodeId(processNodeButton.getProcessNodeId());
  151. startExampleDetails.setProcessNodeButtonId(processNodeButton.getId());
  152. startExampleDetails.setNameType(processNodeButton.getNameType());
  153. // 创建vo
  154. ExampleInfoEx exampleInfoEx = BeanUtil.toBean(exampleInfo, ExampleInfoEx.class);
  155. exampleInfoEx.setExampleDetails(startExampleDetails);
  156. // 保存流程实例
  157. R<ExampleInfo> exampleInfoSaveResult = flowClient.exampleInfoSave(exampleInfoEx);
  158. Assert.eqTrue(exampleInfoSaveResult.isSuccess(), exampleInfoSaveResult.getMsg());
  159. }
  160. }