package com.ycl.controller; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; import com.ycl.common.core.controller.BaseController; import com.ycl.common.core.domain.AjaxResult; import com.ycl.common.core.page.TableDataInfo; import com.ycl.common.utils.StringUtils; import com.ycl.system.domain.ModelParam; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; import org.apache.poi.util.IOUtils; import org.flowable.bpmn.converter.BpmnXMLConverter; import org.flowable.bpmn.model.BpmnModel; import org.flowable.editor.constants.ModelDataJsonConstants; import org.flowable.editor.language.json.converter.BpmnJsonConverter; import org.flowable.engine.RepositoryService; import org.flowable.engine.repository.Deployment; import org.flowable.engine.repository.Model; import org.flowable.engine.repository.ModelQuery; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; import java.io.ByteArrayInputStream; import java.io.IOException; import java.util.HashMap; import java.util.List; @Api(value = "模型管理接口") @Controller @RequiredArgsConstructor @RequestMapping("/model/manage") public class ModelManageController extends BaseController { private final RepositoryService repositoryService; private final ObjectMapper objectMapper; private static final String prefix = "flowable/manage"; @ApiOperation("查询所有模型") @RequestMapping(value = "/modelLists", method = RequestMethod.POST) @ResponseBody public TableDataInfo modelLists(@RequestParam(required = false) String key, @RequestParam(required = false) String name, Integer pageSize, Integer pageNum) { ModelQuery query = repositoryService.createModelQuery(); if (StringUtils.isNotEmpty(key)) { query.modelKey(key); } if (StringUtils.isNotEmpty(name)) { query.modelName(name); } int start = (pageNum - 1) * pageSize; List page = query.orderByCreateTime().desc().listPage(start, pageSize); int total = repositoryService.createModelQuery().list().size(); TableDataInfo rspData = new TableDataInfo(); rspData.setCode(0); rspData.setRows(page); rspData.setTotal(total); return rspData; } /** * 新增模型页面 * @return */ @GetMapping("/add") public String add() { return prefix + "/add"; } /** * 新增模型 */ @PostMapping("/add") @ResponseBody public AjaxResult addSave(ModelParam modelRequest) throws JsonProcessingException { Model model = repositoryService.newModel(); model.setCategory(modelRequest.getCategory()); model.setKey(modelRequest.getKey()); ObjectNode modelNode = objectMapper.createObjectNode(); modelNode.put(ModelDataJsonConstants.MODEL_NAME, modelRequest.getName()); modelNode.put(ModelDataJsonConstants.MODEL_DESCRIPTION, modelRequest.getDescription()); modelNode.put(ModelDataJsonConstants.MODEL_REVISION, modelRequest.getVersion()); model.setMetaInfo(modelNode.toString()); model.setName(modelRequest.getName()); model.setVersion(modelRequest.getVersion()); ModelQuery modelQuery = repositoryService.createModelQuery(); List list = modelQuery.modelKey(modelRequest.getKey()).list(); if (list.size() > 0) { return AjaxResult.error("模型标识不能重复"); } else { // 保存模型到act_re_model表 repositoryService.saveModel(model); HashMap content = new HashMap(); content.put("resourceId", model.getId()); HashMap properties = new HashMap(); properties.put("process_id", modelRequest.getKey()); properties.put("name", modelRequest.getName()); properties.put("category", modelRequest.getCategory()); content.put("properties", properties); HashMap stencilset = new HashMap(); stencilset.put("namespace", "http://b3mn.org/stencilset/bpmn2.0#"); content.put("stencilset", stencilset); // 保存模型文件到act_ge_bytearray表 repositoryService.addModelEditorSource(model.getId(), objectMapper.writeValueAsBytes(content)); return AjaxResult.success(model); } } @RequestMapping("/deploy/{modelId}") @ResponseBody public AjaxResult modelDeployment(@PathVariable String modelId) { try { Model model = repositoryService.getModel(modelId); byte[] modelData = repositoryService.getModelEditorSource(modelId); JsonNode jsonNode = objectMapper.readTree(modelData); BpmnModel bpmnModel = (new BpmnJsonConverter()).convertToBpmnModel(jsonNode); Deployment deploy = repositoryService.createDeployment().category(model.getCategory()) .name(model.getName()).key(model.getKey()) .addBpmnModel(model.getKey() + ".bpmn20.xml", bpmnModel) .deploy(); model.setDeploymentId(deploy.getId()); repositoryService.saveModel(model); return AjaxResult.success(); } catch (Exception e) { e.printStackTrace(); return AjaxResult.error("流程图不合规范,请重新设计"); } } @PostMapping("/remove/{modelId}") @ResponseBody public AjaxResult removeModel(@PathVariable String modelId) { repositoryService.deleteModel(modelId); return AjaxResult.success("删除成功"); } @GetMapping("/export/{modelId}") public void modelExport(@PathVariable String modelId, HttpServletResponse response) throws IOException { byte[] modelData = repositoryService.getModelEditorSource(modelId); JsonNode jsonNode = objectMapper.readTree(modelData); BpmnModel bpmnModel = (new BpmnJsonConverter()).convertToBpmnModel(jsonNode); byte[] xmlBytes = (new BpmnXMLConverter()).convertToXML(bpmnModel, "UTF-8"); ByteArrayInputStream in = new ByteArrayInputStream(xmlBytes); String filename = bpmnModel.getMainProcess().getId() + ".bpmn20.xml"; response.setHeader("Content-Disposition","attachment;filename=" + filename); response.setHeader("content-Type", "application/xml"); response.flushBuffer(); IOUtils.copy(in, response.getOutputStream()); } }