AcBaseController.java 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326
  1. package com.zhcs.dt.controller.activiti;
  2. import java.io.BufferedReader;
  3. import java.io.ByteArrayInputStream;
  4. import java.io.File;
  5. import java.io.FileInputStream;
  6. import java.io.FileNotFoundException;
  7. import java.io.IOException;
  8. import java.io.InputStream;
  9. import java.io.InputStreamReader;
  10. import java.io.UnsupportedEncodingException;
  11. import java.util.HashMap;
  12. import java.util.List;
  13. import java.util.Map;
  14. import java.util.zip.ZipInputStream;
  15. import javax.servlet.http.HttpServletResponse;
  16. import javax.xml.stream.XMLInputFactory;
  17. import javax.xml.stream.XMLStreamException;
  18. import javax.xml.stream.XMLStreamReader;
  19. import org.activiti.bpmn.converter.BpmnXMLConverter;
  20. import org.activiti.bpmn.model.BpmnModel;
  21. import org.activiti.editor.constants.ModelDataJsonConstants;
  22. import org.activiti.editor.language.json.converter.BpmnJsonConverter;
  23. import org.activiti.engine.HistoryService;
  24. import org.activiti.engine.ProcessEngine;
  25. import org.activiti.engine.RepositoryService;
  26. import org.activiti.engine.RuntimeService;
  27. import org.activiti.engine.repository.Deployment;
  28. import org.activiti.engine.repository.DeploymentBuilder;
  29. import org.activiti.engine.repository.Model;
  30. import org.activiti.engine.repository.ProcessDefinition;
  31. import org.apache.commons.io.IOUtils;
  32. import org.springframework.beans.factory.annotation.Autowired;
  33. import com.fasterxml.jackson.core.JsonProcessingException;
  34. import com.fasterxml.jackson.databind.ObjectMapper;
  35. import com.fasterxml.jackson.databind.node.ObjectNode;
  36. import com.zhcs.dt.controller.base.BaseController;
  37. import com.zhcs.dt.util.Const;
  38. import com.zhcs.dt.util.DelAllFile;
  39. import com.zhcs.dt.util.FileUpload;
  40. import com.zhcs.dt.util.PathUtil;
  41. /**
  42. * 类名称:流程管家总类
  43. * 创建人:FH Admin fh313596790qq(青苔)
  44. * 更新时间:2018年1月31日
  45. * @version
  46. */
  47. public class AcBaseController extends BaseController{
  48. @Autowired
  49. private ProcessEngine processEngine; //流程引擎对象
  50. @Autowired
  51. private RepositoryService repositoryService; //管理流程定义 与流程定义和部署对象相关的Service
  52. @Autowired
  53. private RuntimeService runtimeService; //与正在执行的流程实例和执行对象相关的Service(执行管理,包括启动、推进、删除流程实例等操作)
  54. @Autowired
  55. private HistoryService historyService; //历史管理(执行完的数据的管理)
  56. /**添加流程模型并返回modelId
  57. * @param process_id //流程唯一标识key
  58. * @param process_author //流程作者
  59. * @param name //流程名称
  60. * @param modelname //模型名称
  61. * @param description //模型描述
  62. * @param category //模型分类
  63. * @return
  64. * @throws UnsupportedEncodingException
  65. */
  66. protected String createModel(String process_id,String process_author,String name,String modelname,String description,String category) throws UnsupportedEncodingException{
  67. ObjectMapper objectMapper = new ObjectMapper();
  68. ObjectNode editorNode = objectMapper.createObjectNode();
  69. editorNode.put("id", "canvs");
  70. editorNode.put("resourceId", "canvs");
  71. ObjectNode stencilSetNode = objectMapper.createObjectNode();
  72. stencilSetNode.put("namespace", "http://b3mn.org/stencilset/bpmn2.0#"); //命名空间(禁止修改)
  73. stencilSetNode.put("author", ""); //流程节点作者
  74. editorNode.set("stencilset", stencilSetNode);
  75. ObjectNode propertiesNode = objectMapper.createObjectNode();
  76. propertiesNode.put("process_id",process_id); //流程唯一标识
  77. propertiesNode.put("process_author",process_author); //流程作者
  78. propertiesNode.put("name",name); //流程名称
  79. editorNode.set("properties", propertiesNode);
  80. ObjectNode modelObjectNode = objectMapper.createObjectNode();
  81. modelObjectNode.put("name", modelname); //模型名称
  82. modelObjectNode.put("revision", 1); //模型版本
  83. modelObjectNode.put("description", description); //模型描述
  84. Model modelData = repositoryService.newModel();
  85. modelData.setCategory(category); //模型分类
  86. modelData.setDeploymentId(null);
  87. modelData.setKey(null);
  88. modelData.setMetaInfo(modelObjectNode.toString());
  89. modelData.setName(modelname); //模型名称
  90. modelData.setTenantId("");
  91. modelData.setVersion(1);
  92. repositoryService.saveModel(modelData); //保存模型,存储数据到表:act_re_model 流程设计模型部署表
  93. repositoryService.addModelEditorSource(modelData.getId(), editorNode.toString().getBytes("utf-8"));//保存资源,存储数据到表:act_ge_bytearray 二进制数据表
  94. return modelData.getId();
  95. }
  96. /**从流程定义映射模型
  97. * @param processDefinitionId //流程定义ID
  98. * @return
  99. * @throws UnsupportedEncodingException
  100. * @throws XMLStreamException
  101. */
  102. protected Model saveModelFromPro(String processDefinitionId) throws Exception {
  103. ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(processDefinitionId).singleResult();
  104. InputStream bpmnStream = repositoryService.getResourceAsStream(processDefinition.getDeploymentId(),
  105. processDefinition.getResourceName());
  106. XMLInputFactory xif = XMLInputFactory.newInstance();
  107. InputStreamReader in = new InputStreamReader(bpmnStream, "UTF-8");
  108. XMLStreamReader xtr = xif.createXMLStreamReader(in);
  109. BpmnModel bpmnModel = new BpmnXMLConverter().convertToBpmnModel(xtr);
  110. BpmnJsonConverter converter = new BpmnJsonConverter();
  111. ObjectNode modelNode = converter.convertToJson(bpmnModel);
  112. Model modelData = repositoryService.newModel();
  113. modelData.setKey(processDefinition.getKey()); //唯一标识
  114. modelData.setName(processDefinition.getName()+"(反射)"); //名称
  115. modelData.setCategory("00102"); //分类,默认行政审批分类
  116. modelData.setDeploymentId(processDefinition.getDeploymentId());
  117. modelData.setVersion(Integer.parseInt(String.valueOf(repositoryService.createModelQuery().modelKey(modelData.getKey()).count()+1))); //版本
  118. ObjectNode modelObjectNode = new ObjectMapper().createObjectNode();
  119. modelObjectNode.put(ModelDataJsonConstants.MODEL_NAME, processDefinition.getName());
  120. modelObjectNode.put(ModelDataJsonConstants.MODEL_REVISION, modelData.getVersion());
  121. modelObjectNode.put(ModelDataJsonConstants.MODEL_DESCRIPTION, processDefinition.getDescription());
  122. modelData.setMetaInfo(modelObjectNode.toString());
  123. repositoryService.saveModel(modelData); //保存模型
  124. repositoryService.addModelEditorSource(modelData.getId(), modelNode.toString().getBytes("utf-8"));//保存资源
  125. return modelData;
  126. }
  127. /**通过模型ID获取流程基本信息
  128. * @param modelId //流程ID
  129. * @throws JsonProcessingException
  130. * @throws UnsupportedEncodingException
  131. * @throws IOException
  132. * @return
  133. */
  134. protected Map<String,String> getProcessProperties(String modelId) throws Exception{
  135. ObjectMapper objectMapper = new ObjectMapper();
  136. ObjectNode editorJsonNode = (ObjectNode)objectMapper.readTree(new String(repositoryService.getModelEditorSource(modelId), "utf-8")).get("properties");
  137. Map<String,String> map = new HashMap<String,String>();
  138. map.put("process_id",editorJsonNode.get("process_id").toString()); //流程唯一标识(KEY)
  139. map.put("process_author",editorJsonNode.get("process_author").toString()); //流程作者
  140. map.put("name",editorJsonNode.get("name").toString()); //流程名称
  141. return map;
  142. }
  143. /**删除模型
  144. * @param modelId //模型ID
  145. */
  146. protected void deleteModel(String modelId){
  147. repositoryService.deleteModel(modelId); //act_re_model 和 act_ge_bytearray 两张表中相关数据都删除
  148. }
  149. /**根据模型ID导出xml文件
  150. * @param response
  151. * @param modelId //模型ID
  152. * @throws Exception
  153. */
  154. protected void exportXmlFromModelId(HttpServletResponse response, String modelId) throws Exception{
  155. Model modelData = repositoryService.getModel(modelId);
  156. BpmnJsonConverter jsonConverter = new BpmnJsonConverter();
  157. ObjectNode modelNode = (ObjectNode) new ObjectMapper().readTree(repositoryService.getModelEditorSource(modelData.getId()));
  158. BpmnModel bpmnModel = jsonConverter.convertToBpmnModel(modelNode);
  159. BpmnXMLConverter xmlConverter = new BpmnXMLConverter();
  160. byte[] bpmnBytes = xmlConverter.convertToXML(bpmnModel);
  161. ByteArrayInputStream in = new ByteArrayInputStream(bpmnBytes);
  162. IOUtils.copy(in, response.getOutputStream());
  163. String filename = bpmnModel.getMainProcess().getId() + ".bpmn20.xml";
  164. response.setHeader("Content-Disposition", "attachment; filename=" + filename);
  165. response.flushBuffer();
  166. in.close();
  167. }
  168. /**根据模型ID预览xml文件
  169. * @param response
  170. * @param modelId //模型ID
  171. * @throws Exception
  172. */
  173. protected String viewXmlFromModelId(String modelId) throws Exception{
  174. Model modelData = repositoryService.getModel(modelId);
  175. BpmnJsonConverter jsonConverter = new BpmnJsonConverter();
  176. ObjectNode modelNode = (ObjectNode) new ObjectMapper().readTree(repositoryService.getModelEditorSource(modelData.getId()));
  177. BpmnModel bpmnModel = jsonConverter.convertToBpmnModel(modelNode);
  178. BpmnXMLConverter xmlConverter = new BpmnXMLConverter();
  179. byte[] bpmnBytes = xmlConverter.convertToXML(bpmnModel);
  180. ByteArrayInputStream in = new ByteArrayInputStream(bpmnBytes);
  181. InputStreamReader isr = new InputStreamReader(in,"utf-8");
  182. BufferedReader bufferedReader = new BufferedReader(isr);
  183. StringBuffer xmlContent = new StringBuffer();
  184. String lineTxt = null;
  185. while ((lineTxt = bufferedReader.readLine()) != null) {
  186. xmlContent.append(lineTxt);
  187. xmlContent.append("\n");
  188. }
  189. isr.close();
  190. return xmlContent.toString();
  191. }
  192. /**判断能否正常根据模型ID导出xml文件(当没有画流程图的时候会报异常)
  193. * @param response
  194. * @param modelId //模型ID
  195. * @throws Exception
  196. */
  197. protected void isCanexportXmlFromModelId(HttpServletResponse response, String modelId) throws Exception{
  198. Model modelData = repositoryService.getModel(modelId);
  199. BpmnJsonConverter jsonConverter = new BpmnJsonConverter();
  200. ObjectNode modelNode = (ObjectNode) new ObjectMapper().readTree(repositoryService.getModelEditorSource(modelData.getId()));
  201. BpmnModel bpmnModel = jsonConverter.convertToBpmnModel(modelNode);
  202. BpmnXMLConverter xmlConverter = new BpmnXMLConverter();
  203. xmlConverter.convertToXML(bpmnModel);
  204. }
  205. /**部署流程定义(根据modelId部署)
  206. * @param modelId //模型ID
  207. * @return 部署ID
  208. */
  209. protected String deploymentProcessDefinitionFromModelId(String modelId) throws Exception{
  210. Model modelData = repositoryService.getModel(modelId);
  211. ObjectNode modelNode = (ObjectNode) new ObjectMapper().readTree(repositoryService.getModelEditorSource(modelData.getId()));
  212. byte[] bpmnBytes = null;
  213. BpmnJsonConverter BpmnJsonConverter = new BpmnJsonConverter();
  214. BpmnModel model = BpmnJsonConverter.convertToBpmnModel(modelNode);
  215. bpmnBytes = new BpmnXMLConverter().convertToXML(model);
  216. String processName = modelData.getName() + ".bpmn20.xml";
  217. DeploymentBuilder deploymentBuilder = repositoryService.createDeployment().name(modelData.getName()); //部署名称
  218. Deployment deployment = deploymentBuilder.addString(processName, new String(bpmnBytes,"utf-8")).deploy(); //完成部署
  219. return deployment.getId(); //部署ID
  220. }
  221. /**部署流程定义(从Classpath)
  222. * @param name //部署名称
  223. * @param xmlpath //xml文件路径
  224. * @param pngpath //png文件路径
  225. * @return 部署ID
  226. */
  227. protected String deploymentProcessDefinitionFromClasspath(String name, String xmlpath, String pngpath){
  228. DeploymentBuilder deploymentBuilder = repositoryService.createDeployment(); //创建部署对象
  229. deploymentBuilder.name(name); //部署名称
  230. deploymentBuilder.addClasspathResource(xmlpath); //从文件中读取xml资源
  231. deploymentBuilder.addClasspathResource(pngpath); //从文件中读取png资源
  232. Deployment deployment = deploymentBuilder.deploy(); //完成部署
  233. return deployment.getId(); //部署ID
  234. }
  235. /**部署流程定义(从zip压缩包)
  236. * @param name //部署名称
  237. * @param zippath //zip文件路径
  238. * @return 部署ID
  239. * @throws FileNotFoundException
  240. */
  241. protected String deploymentProcessDefinitionFromZip(String name, String zippath) throws Exception{
  242. File outfile = new File(zippath);
  243. FileInputStream inputStream = new FileInputStream(outfile);
  244. ZipInputStream ipInputStream = new ZipInputStream(inputStream);
  245. DeploymentBuilder deploymentBuilder = repositoryService.createDeployment(); //创建部署对象
  246. deploymentBuilder.name(name); //部署名称
  247. deploymentBuilder.addZipInputStream(ipInputStream);
  248. Deployment deployment = deploymentBuilder.deploy(); //完成部署
  249. ipInputStream.close();
  250. inputStream.close();
  251. return deployment.getId(); //部署ID
  252. }
  253. /**根据流程定义的部署ID生成XML和PNG
  254. * @param DEPLOYMENT_ID_ //部署ID
  255. * @throws IOException
  256. */
  257. protected void createXmlAndPng(String DEPLOYMENT_ID_) throws IOException{
  258. DelAllFile.delFolder(PathUtil.getClasspath()+"uploadFiles/activitiFile"); //生成先清空之前生成的文件
  259. List<String> names = repositoryService.getDeploymentResourceNames(DEPLOYMENT_ID_);
  260. for (String name : names) {
  261. if(name.indexOf("zip")!=-1)continue;
  262. InputStream in = repositoryService.getResourceAsStream(DEPLOYMENT_ID_, name);
  263. FileUpload.copyFile(in,PathUtil.getClasspath()+Const.FILEACTIVITI,name); //把文件上传到文件目录里面
  264. in.close();
  265. }
  266. }
  267. /**删除部署的流程
  268. * @param DEPLOYMENT_ID_ //部署ID
  269. * @throws IOException
  270. */
  271. protected void deleteDeployment(String DEPLOYMENT_ID_) throws Exception{
  272. //repositoryService.deleteDeployment(DEPLOYMENT_ID_); //不带级联的删除,此删除只能删除没有启动的流程,否则抛出异常 .act_re_deployment,act_re_procdef 和 act_ge_bytearray 三张表中相关数据都删除
  273. repositoryService.deleteDeployment(DEPLOYMENT_ID_, true); //级联删除,不管流程是否启动,都可以删除
  274. }
  275. /**激活流程定义
  276. * @param DEPLOYMENT_ID_ //流程定义ID
  277. * @throws IOException
  278. */
  279. protected void activateProcessDefinitionById(String DEPLOYMENT_ID_) throws IOException{
  280. repositoryService.activateProcessDefinitionById(DEPLOYMENT_ID_, true, null);
  281. }
  282. /**挂起流程定义
  283. * @param DEPLOYMENT_ID_ //流程定义ID
  284. * @throws IOException
  285. */
  286. protected void suspendProcessDefinitionById(String DEPLOYMENT_ID_) throws IOException{
  287. repositoryService.suspendProcessDefinitionById(DEPLOYMENT_ID_, true, null);
  288. }
  289. }
  290. //创建人:FH Admin fh 3 1 3 596 790qq(青苔)