ActProcessController.java 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  1. /**
  2. * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
  3. */
  4. package com.jeeplus.modules.act.web;
  5. import java.io.IOException;
  6. import java.io.InputStream;
  7. import java.io.UnsupportedEncodingException;
  8. import java.net.URLDecoder;
  9. import java.util.HashMap;
  10. import java.util.List;
  11. import java.util.Map;
  12. import javax.servlet.http.HttpServletRequest;
  13. import javax.servlet.http.HttpServletResponse;
  14. import javax.xml.stream.XMLStreamException;
  15. import com.jeeplus.common.json.AjaxJson;
  16. import org.activiti.engine.ActivitiObjectNotFoundException;
  17. import org.activiti.engine.HistoryService;
  18. import org.activiti.engine.history.HistoricProcessInstance;
  19. import org.activiti.engine.runtime.ProcessInstance;
  20. import org.apache.shiro.authz.annotation.RequiresPermissions;
  21. import org.springframework.beans.factory.annotation.Autowired;
  22. import org.springframework.beans.factory.annotation.Value;
  23. import org.springframework.stereotype.Controller;
  24. import org.springframework.ui.Model;
  25. import org.springframework.web.bind.annotation.PathVariable;
  26. import org.springframework.web.bind.annotation.RequestMapping;
  27. import org.springframework.web.bind.annotation.RequestMethod;
  28. import org.springframework.web.bind.annotation.ResponseBody;
  29. import org.springframework.web.multipart.MultipartFile;
  30. import org.springframework.web.servlet.mvc.support.RedirectAttributes;
  31. import com.jeeplus.common.utils.StringUtils;
  32. import com.jeeplus.core.persistence.Page;
  33. import com.jeeplus.core.web.BaseController;
  34. import com.jeeplus.modules.act.service.ActProcessService;
  35. /**
  36. * 流程定义相关Controller
  37. * @author jeeplus
  38. * @version 2016-11-03
  39. */
  40. @Controller
  41. @RequestMapping(value = "${adminPath}/act/process")
  42. public class ActProcessController extends BaseController {
  43. @Autowired
  44. private ActProcessService actProcessService;
  45. @Autowired
  46. private HistoryService historyService;
  47. /**
  48. * 流程定义列表
  49. */
  50. @RequiresPermissions("act:process:edit")
  51. @RequestMapping(value = {"list", ""})
  52. public String processList(String category, HttpServletRequest request, HttpServletResponse response, Model model) {
  53. /*
  54. * 保存两个对象,一个是ProcessDefinition(流程定义),一个是Deployment(流程部署)
  55. */
  56. return "modules/bpm/process/definition/processList";
  57. }
  58. @ResponseBody
  59. @RequiresPermissions("act:process:edit")
  60. @RequestMapping("list/data")
  61. public Map<String, Object> processListData(String category, HttpServletRequest request, HttpServletResponse response, Model model) {
  62. /*
  63. * 保存两个对象,一个是ProcessDefinition(流程定义),一个是Deployment(流程部署)
  64. */
  65. Page<Map> page = actProcessService.processList(new Page<Map>(request, response), category);
  66. return getBootstrapData(page);
  67. }
  68. /**
  69. * 运行中的实例列表
  70. */
  71. @RequiresPermissions("act:process:edit")
  72. @RequestMapping(value = "running")
  73. public String runningList(String procInsId, String procDefKey, HttpServletRequest request, HttpServletResponse response, Model model) {
  74. return "modules/bpm/process/running/processRunningList";
  75. }
  76. @ResponseBody
  77. @RequiresPermissions("act:process:edit")
  78. @RequestMapping(value = "runningData")
  79. public Map<String, Object> runningListData(String procInsId, String procDefKey, HttpServletRequest request, HttpServletResponse response, Model model) throws Exception {
  80. Page<HashMap<String,Object>> page = actProcessService.runningList(new Page<ProcessInstance>(request, response), procInsId, procDefKey);
  81. return getBootstrapData(page);
  82. }
  83. /**
  84. * 已结束的实例
  85. */
  86. @RequiresPermissions("act:process:edit")
  87. @RequestMapping(value = "historyList")
  88. public String historyList(String procInsId, String procDefKey, HttpServletRequest request, HttpServletResponse response, Model model) {
  89. return "modules/bpm/process/history/processHistoryList";
  90. }
  91. /**
  92. * 已结束的实例
  93. */
  94. @ResponseBody
  95. @RequiresPermissions("act:process:edit")
  96. @RequestMapping(value = "historyListData")
  97. public Map<String, Object> historyListData(String procInsId, String procDefKey, HttpServletRequest request, HttpServletResponse response, Model model) {
  98. Page<HistoricProcessInstance> page = actProcessService.historyList(new Page<HistoricProcessInstance>(request, response), procInsId, procDefKey);
  99. return getBootstrapData(page);
  100. }
  101. /**
  102. * 读取资源,通过部署ID
  103. * @param response
  104. * @throws Exception
  105. */
  106. @RequiresPermissions("act:process:edit")
  107. @RequestMapping(value = "resource/read")
  108. public void resourceRead(String procDefId, String proInsId, String resType, HttpServletResponse response) throws Exception {
  109. InputStream resourceAsStream = actProcessService.resourceRead(procDefId, proInsId, resType);
  110. byte[] b = new byte[1024];
  111. int len = -1;
  112. while ((len = resourceAsStream.read(b, 0, 1024)) != -1) {
  113. response.getOutputStream().write(b, 0, len);
  114. }
  115. }
  116. /**
  117. * 部署流程
  118. */
  119. @RequiresPermissions("act:process:edit")
  120. @RequestMapping(value = "/deploy", method=RequestMethod.GET)
  121. public String deploy(Model model) {
  122. return "modules/bpm/process/deploy/processDeploy";
  123. }
  124. /**
  125. * 部署流程 - 保存
  126. * @param file
  127. * @return
  128. */
  129. @ResponseBody
  130. @RequiresPermissions("act:process:edit")
  131. @RequestMapping(value = "/deploy", method=RequestMethod.POST)
  132. public AjaxJson deploy(@Value("#{APP_PROP['activiti.export.diagram.path']}") String exportDir,
  133. String category, MultipartFile file) {
  134. AjaxJson j = new AjaxJson();
  135. String fileName = file.getOriginalFilename();
  136. if (StringUtils.isBlank(fileName)){
  137. j.setSuccess(false);
  138. j.setMsg("请选择要部署的流程文件");
  139. }else{
  140. j = actProcessService.deploy(exportDir, category, file);
  141. }
  142. return j;
  143. }
  144. /**
  145. * 设置流程分类
  146. */
  147. @RequiresPermissions("act:process:edit")
  148. @RequestMapping(value = "updateCategory")
  149. public String updateCategory(String procDefId, String category, RedirectAttributes redirectAttributes) {
  150. actProcessService.updateCategory(procDefId, category);
  151. return "redirect:" + adminPath + "/act/process";
  152. }
  153. /**
  154. * 挂起、激活流程实例
  155. */
  156. @ResponseBody
  157. @RequiresPermissions("act:process:edit")
  158. @RequestMapping(value = "update/{state}")
  159. public AjaxJson updateState(@PathVariable("state") String state, String procDefId) {
  160. AjaxJson j = new AjaxJson();
  161. String message = actProcessService.updateState(state, procDefId);
  162. j.setMsg(message);
  163. return j;
  164. }
  165. /**
  166. * 将部署的流程转换为模型
  167. * @param procDefId
  168. * @return
  169. * @throws UnsupportedEncodingException
  170. * @throws XMLStreamException
  171. */
  172. @ResponseBody
  173. @RequiresPermissions("act:process:edit")
  174. @RequestMapping(value = "convert/toModel")
  175. public AjaxJson convertToModel(String procDefId) throws UnsupportedEncodingException, XMLStreamException {
  176. AjaxJson j = new AjaxJson();
  177. org.activiti.engine.repository.Model modelData = actProcessService.convertToModel(procDefId);
  178. j.setMsg("转换模型成功,模型ID=" + modelData.getId());
  179. return j;
  180. }
  181. /**
  182. * 导出图片文件到硬盘
  183. */
  184. @RequiresPermissions("act:process:edit")
  185. @RequestMapping(value = "export/diagrams")
  186. @ResponseBody
  187. public List<String> exportDiagrams(@Value("#{APP_PROP['activiti.export.diagram.path']}") String exportDir) throws IOException {
  188. List<String> files = actProcessService.exportDiagrams(exportDir);;
  189. return files;
  190. }
  191. /**
  192. * 删除部署的流程,级联删除流程实例
  193. * @param deploymentId 流程部署ID
  194. */
  195. @ResponseBody
  196. @RequiresPermissions("act:process:edit")
  197. @RequestMapping(value = "delete")
  198. public AjaxJson delete(String deploymentId) {
  199. AjaxJson j = new AjaxJson();
  200. actProcessService.deleteDeployment(deploymentId);
  201. j.setMsg("删除成功!");
  202. return j;
  203. }
  204. /**
  205. * 删除流程实例
  206. * @param procInsId 流程实例ID
  207. * @param reason 删除原因
  208. */
  209. @ResponseBody
  210. @RequiresPermissions("act:process:edit")
  211. @RequestMapping(value = "deleteProcIns")
  212. public AjaxJson deleteProcIns(String procInsId, String reason) {
  213. AjaxJson j = new AjaxJson();
  214. try {
  215. reason = URLDecoder.decode(reason,"UTF-8");
  216. } catch (UnsupportedEncodingException e) {
  217. e.printStackTrace();
  218. }
  219. if (StringUtils.isBlank(reason)){
  220. j.setSuccess(false);
  221. j.setMsg("请填写作废原因");
  222. }else{
  223. try{
  224. actProcessService.deleteProcIns(procInsId, reason);
  225. j.setSuccess(true);
  226. j.setMsg("作废成功,流程实例ID=" + procInsId);
  227. }catch (ActivitiObjectNotFoundException e){
  228. j.setSuccess(false);
  229. j.setMsg("操作失败,流程已经结束!");
  230. }
  231. }
  232. return j;
  233. }
  234. }