ProcessDefinitionServiceImpl.java 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  1. package com.ruoyi.project.activiti.service.impl;
  2. import com.ruoyi.common.utils.StringUtils;
  3. import com.ruoyi.project.activiti.domain.MyProcessDefinition;
  4. import com.ruoyi.project.activiti.domain.MyTask;
  5. import com.ruoyi.project.activiti.domain.SelectVo;
  6. import org.activiti.bpmn.model.BpmnModel;
  7. import org.activiti.engine.*;
  8. import org.activiti.engine.form.FormProperty;
  9. import org.activiti.engine.form.TaskFormData;
  10. import org.activiti.engine.identity.Group;
  11. import org.activiti.engine.identity.User;
  12. import org.activiti.engine.repository.DeploymentBuilder;
  13. import org.activiti.engine.repository.Model;
  14. import org.activiti.engine.repository.ProcessDefinition;
  15. import org.activiti.engine.repository.ProcessDefinitionQuery;
  16. import org.activiti.engine.runtime.ProcessInstance;
  17. import org.activiti.engine.task.Task;
  18. import org.apache.commons.lang3.builder.ToStringBuilder;
  19. import org.apache.commons.lang3.builder.ToStringStyle;
  20. import org.slf4j.Logger;
  21. import org.slf4j.LoggerFactory;
  22. import org.springframework.beans.BeanUtils;
  23. import org.springframework.beans.factory.annotation.Autowired;
  24. import org.springframework.stereotype.Service;
  25. import org.springframework.transaction.annotation.Transactional;
  26. import org.springframework.util.CollectionUtils;
  27. import org.springframework.web.multipart.MultipartFile;
  28. import java.io.FileInputStream;
  29. import java.io.FileNotFoundException;
  30. import java.io.IOException;
  31. import java.io.InputStream;
  32. import java.util.*;
  33. import java.util.stream.Collectors;
  34. import java.util.zip.ZipInputStream;
  35. @Service
  36. public class ProcessDefinitionServiceImpl {
  37. private static final Logger LOGGER = LoggerFactory.getLogger(ProcessDefinitionServiceImpl.class);
  38. @Autowired
  39. private RuntimeService runtimeService;
  40. @Autowired
  41. private TaskService taskService;
  42. @Autowired
  43. private FormService formService;
  44. @Autowired
  45. private RepositoryService repositoryService;
  46. @Autowired
  47. private IdentityService identityService;
  48. @Transactional
  49. public void startProcess(String assignee) {
  50. runtimeService.startProcessInstanceByKey("oneTaskProcess");
  51. }
  52. public List<Task> getTasks(String assignee) {
  53. return taskService.createTaskQuery().taskAssignee(assignee).list();
  54. }
  55. /**
  56. * 分页查询流程定义文件
  57. *
  58. * @return
  59. */
  60. public List<ProcessDefinition> listProcessDefinition() {
  61. ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery();
  62. List<ProcessDefinition> processDefinitions = processDefinitionQuery.listPage(0, 100);
  63. return processDefinitions;
  64. }
  65. @Transactional
  66. public void deployProcessDefinition(String filePath) throws FileNotFoundException {
  67. if (StringUtils.isNotBlank(filePath)) {
  68. if (filePath.endsWith(".zip")) {
  69. ZipInputStream inputStream = new ZipInputStream(new FileInputStream(filePath));
  70. repositoryService.createDeployment()
  71. .addZipInputStream(inputStream)
  72. .deploy();
  73. } else if (filePath.endsWith(".bpmn") || filePath.endsWith(".bpmn20.xml")) {
  74. repositoryService.createDeployment()
  75. .addInputStream(filePath, new FileInputStream(filePath))
  76. .deploy();
  77. }
  78. }
  79. }
  80. /**
  81. * 部署流程文件
  82. *
  83. * @param file
  84. * @throws IOException
  85. */
  86. @Transactional
  87. public void deployProcessDefinition(MultipartFile file) throws IOException {
  88. InputStream inputStream = file.getInputStream();
  89. String originalFilename = file.getOriginalFilename();
  90. DeploymentBuilder deployment = repositoryService.createDeployment();
  91. deployment.addInputStream(originalFilename, inputStream).deploy();
  92. }
  93. @Transactional
  94. public int deleteProcessDeploymentByIds(List<String> deploymentIds) {
  95. int counter = 0;
  96. for (String deploymentId : deploymentIds) {
  97. List<ProcessInstance> instanceList = runtimeService.createProcessInstanceQuery()
  98. .deploymentId(deploymentId)
  99. .list();
  100. if (!CollectionUtils.isEmpty(instanceList)) {
  101. // 跳过存在流程实例的流程定义
  102. continue;
  103. }
  104. // true 表示级联删除引用,比如 act_ru_execution 数据
  105. repositoryService.deleteDeployment(deploymentId, true);
  106. counter++;
  107. }
  108. return counter;
  109. }
  110. public List<MyProcessDefinition> list(Integer pageNum, Integer pageSize) {
  111. List<ProcessDefinition> list = repositoryService.createProcessDefinitionQuery().listPage((pageNum - 1) * pageSize, pageSize);
  112. List<MyProcessDefinition> collect = list.stream().map(x -> {
  113. MyProcessDefinition myProcessDefinition = new MyProcessDefinition();
  114. myProcessDefinition.setId(x.getDeploymentId());
  115. myProcessDefinition.setProcessId(x.getId());
  116. myProcessDefinition.setKey(x.getKey());
  117. myProcessDefinition.setName(x.getName());
  118. myProcessDefinition.setVersion(x.getVersion());
  119. myProcessDefinition.setDescription(x.getDescription());
  120. return myProcessDefinition;
  121. }).collect(Collectors.toList());
  122. return collect;
  123. }
  124. public void start() {
  125. startModel();
  126. // testUserAndGroup();
  127. }
  128. private void testUserAndGroup() {
  129. User user1 = identityService.newUser("user1"); //初始化用户user1
  130. user1.setEmail("user1@111.com");
  131. User user2 = identityService.newUser("user2");
  132. user2.setEmail("user2@111.com");
  133. identityService.saveUser(user1); //将用户保存
  134. identityService.saveUser(user2);
  135. Group group1 = identityService.newGroup("group1"); //初始化用户组group1
  136. identityService.saveGroup(group1);
  137. Group group2 = identityService.newGroup("group2");
  138. identityService.saveGroup(group2);
  139. identityService.createMembership("user1", "group1"); //构建用户与用户组的关系
  140. identityService.createMembership("user2", "group1");
  141. identityService.createMembership("user1", "group2");
  142. User user1_2 = identityService.createUserQuery().userId("user1").singleResult(); //将用户名修改,版本号改为2
  143. user1_2.setLastName("user1_2");
  144. identityService.saveUser(user1_2);
  145. List<User> userList = identityService.createUserQuery().memberOfGroup("group1").listPage(0, 100);//查询用户列表
  146. for (User user : userList) { //查询group1组中的所有用户
  147. LOGGER.info("group1的user : [{}]", ToStringBuilder.reflectionToString(user, ToStringStyle.JSON_STYLE)); //按照json格式输出
  148. }
  149. List<Group> groupList = identityService.createGroupQuery().groupMember("user1").listPage(0, 100);
  150. for (Group group : groupList) { //查询user1用户所属的组
  151. LOGGER.info("user1的group : [{}]", ToStringBuilder.reflectionToString(group, ToStringStyle.JSON_STYLE));
  152. }
  153. }
  154. private void startModel() {
  155. //获取流程定义对象
  156. ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().singleResult();
  157. //启动运行流程
  158. ProcessInstance taskService = getTaskService(processDefinition);
  159. //处理流程
  160. runProcess(taskService);
  161. }
  162. private ProcessInstance getTaskService(ProcessDefinition processDefinition) {
  163. ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinition.getId());
  164. LOGGER.info("流程启动 {}", processInstance);
  165. return processInstance;
  166. }
  167. private void runProcess(ProcessInstance processInstance) {
  168. //部署结束继续输入
  169. while (processInstance != null && !processInstance.isEnded()) {
  170. Scanner scanner = new Scanner(System.in);
  171. List<Task> list = taskService.createTaskQuery().list();
  172. for (Task task : list) {
  173. LOGGER.info("待处理任务[{}]", task.getName());
  174. //获取表单数据
  175. TaskFormData taskFormData = formService.getTaskFormData(task.getId());
  176. List<FormProperty> formProperties = taskFormData.getFormProperties();
  177. Map<String, Object> inparms = new HashMap<String, Object>();
  178. String s = null;
  179. for (FormProperty formProperty : formProperties) {
  180. String name = formProperty.getName();
  181. LOGGER.info("请输入[{}]", name);
  182. s = scanner.nextLine();
  183. inparms.put(formProperty.getId(), s);
  184. LOGGER.info("你输入的是[{}]", s);
  185. }
  186. //将参数提交到userTask的表单中
  187. taskService.complete(task.getId(), inparms);
  188. //同步流程状态
  189. processInstance = runtimeService
  190. .createProcessInstanceQuery()
  191. .processInstanceId(processInstance.getId())
  192. .singleResult();
  193. }
  194. LOGGER.info("待处理任务数[{}]", list.size());
  195. }
  196. }
  197. public List<SelectVo> select() {
  198. List<SelectVo> collect=new ArrayList<>();
  199. List<ProcessDefinition> list = repositoryService.createProcessDefinitionQuery().list();
  200. if(!StringUtils.isNull(list)){
  201. collect = list.stream().map(x -> {
  202. SelectVo selectVo = new SelectVo();
  203. int version = x.getVersion();
  204. String id = x.getId();
  205. selectVo.setText(x.getName()+" v"+version);
  206. selectVo.setValue(id);
  207. return selectVo;
  208. }).collect(Collectors.toList());
  209. }
  210. return collect;
  211. }
  212. public BpmnModel get(String id) {
  213. ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionKey(id).singleResult();
  214. BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefinition.getId());
  215. return bpmnModel;
  216. }
  217. }