package com.ycl.controller;
|
|
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 io.swagger.annotations.Api;
|
import io.swagger.annotations.ApiOperation;
|
import lombok.RequiredArgsConstructor;
|
import org.apache.commons.io.IOUtils;
|
|
import org.flowable.bpmn.model.BpmnModel;
|
import org.flowable.editor.constants.ModelDataJsonConstants;
|
import org.flowable.editor.language.json.converter.BpmnJsonConverter;
|
import org.flowable.engine.ProcessEngineConfiguration;
|
import org.flowable.engine.RepositoryService;
|
import org.flowable.engine.RuntimeService;
|
import org.flowable.engine.TaskService;
|
import org.flowable.engine.repository.Model;
|
import org.flowable.engine.repository.ProcessDefinition;
|
import org.flowable.engine.repository.ProcessDefinitionQuery;
|
import org.flowable.image.ProcessDiagramGenerator;
|
import org.springframework.stereotype.Controller;
|
import org.springframework.web.bind.annotation.*;
|
import org.springframework.web.multipart.MultipartFile;
|
import com.ycl.system.domain.Process;
|
|
import javax.annotation.Resource;
|
import javax.servlet.ServletOutputStream;
|
import javax.servlet.http.HttpServletResponse;
|
import java.io.InputStream;
|
import java.nio.charset.StandardCharsets;
|
import java.text.SimpleDateFormat;
|
import java.util.ArrayList;
|
import java.util.List;
|
import java.util.zip.ZipInputStream;
|
|
/**
|
* 流程管理
|
*/
|
@Api(value = "部署管理接口")
|
@Controller
|
@RequiredArgsConstructor
|
@RequestMapping("/flow/manage")
|
public class FlowController extends BaseController {
|
|
private final RuntimeService runtimeService;
|
|
private final TaskService taskService;
|
|
private final RepositoryService repositoryService;
|
|
private final ProcessEngineConfiguration configuration;
|
|
private static final String prefix = "flowable/manage";
|
|
@GetMapping("")
|
public String processList()
|
{
|
return prefix + "/processList";
|
}
|
|
@GetMapping("deploy")
|
public String deploy()
|
{
|
return prefix + "/deployProcess";
|
}
|
|
@ApiOperation("上传一个工作流文件")
|
@RequestMapping(value = "/uploadworkflow", method = RequestMethod.POST)
|
@ResponseBody
|
public AjaxResult fileupload(@RequestParam MultipartFile uploadfile) {
|
try {
|
String filename = uploadfile.getOriginalFilename();
|
InputStream is = uploadfile.getInputStream();
|
if (filename.endsWith("zip")) {
|
repositoryService.createDeployment().name(filename).addZipInputStream(new ZipInputStream(is)).deploy();
|
} else if (filename.endsWith("bpmn") || filename.endsWith("xml")) {
|
repositoryService.createDeployment().name(filename).addInputStream(filename, is).deploy();
|
} else {
|
return AjaxResult.error("文件格式错误");
|
}
|
} catch (Exception e) {
|
e.printStackTrace();
|
return AjaxResult.error("部署失败");
|
}
|
return AjaxResult.success("部署成功");
|
}
|
|
@ApiOperation("查询已部署工作流列表")
|
@GetMapping(value = "/getprocesslists")
|
@ResponseBody
|
public TableDataInfo getlist(@RequestParam(required = false) String key, @RequestParam(required = false) String name,
|
@RequestParam(required = true) Boolean latest, Integer pageSize, Integer pageNum) {
|
ProcessDefinitionQuery queryCondition = repositoryService.createProcessDefinitionQuery();
|
if (StringUtils.isNotEmpty(key)) {
|
queryCondition.processDefinitionKey(key);
|
}
|
if (StringUtils.isNotEmpty(name)) {
|
queryCondition.processDefinitionName(name);
|
}
|
if (latest) {
|
queryCondition.latestVersion();
|
}
|
int total = queryCondition.list().size();
|
int start = (pageNum - 1) * pageSize;
|
List<ProcessDefinition> pageList = queryCondition.orderByDeploymentId().desc().listPage(start, pageSize);
|
List<Process> mylist = new ArrayList<Process>();
|
for (int i = 0; i < pageList.size(); i++) {
|
Process p = new Process();
|
p.setDeploymentId(pageList.get(i).getDeploymentId());
|
p.setId(pageList.get(i).getId());
|
p.setKey(pageList.get(i).getKey());
|
p.setName(pageList.get(i).getName());
|
p.setResourceName(pageList.get(i).getResourceName());
|
p.setDiagramresourceName(pageList.get(i).getDiagramResourceName());
|
p.setSuspended(pageList.get(i).isSuspended());
|
p.setVersion(pageList.get(i).getVersion());
|
mylist.add(p);
|
}
|
TableDataInfo rspData = new TableDataInfo();
|
rspData.setCode(0);
|
rspData.setRows(mylist);
|
rspData.setTotal(total);
|
return rspData;
|
}
|
|
@ApiOperation("删除一次部署的工作流")
|
@RequestMapping(value = "/remove/{deploymentId}", method = RequestMethod.POST)
|
@ResponseBody
|
public AjaxResult remove(@PathVariable String deploymentId) {
|
repositoryService.deleteDeployment(deploymentId, true);
|
return AjaxResult.success();
|
}
|
|
|
@ApiOperation("查看工作流图片")
|
@RequestMapping(value = "/showresource", method = RequestMethod.GET)
|
public void showresource(@RequestParam("pdid") String pdid,
|
HttpServletResponse response) throws Exception {
|
response.setContentType("image/jpeg;charset=UTF-8");
|
response.setHeader("Content-Disposition","inline;filename=process.jpg");
|
BpmnModel bpmnModel = repositoryService.getBpmnModel(pdid);
|
ProcessDiagramGenerator diagramGenerator = configuration.getProcessDiagramGenerator();
|
InputStream is = diagramGenerator.generateDiagram(bpmnModel, "png", "宋体", "宋体", "宋体", configuration.getClassLoader(), true);
|
ServletOutputStream output = response.getOutputStream();
|
IOUtils.copy(is, output);
|
}
|
|
@ApiOperation("查看工作流定义")
|
@RequestMapping(value = "/showProcessDefinition/{pdid}/{resource}", method = RequestMethod.GET)
|
public void showProcessDefinition(@PathVariable("pdid") String pdid, @PathVariable(value="resource") String resource,
|
HttpServletResponse response) throws Exception {
|
response.setContentType("application/xml");
|
response.setHeader("Content-Disposition","inline;filename=process.bpmn20.xml");
|
InputStream is = repositoryService.getResourceAsStream(pdid, resource);
|
ServletOutputStream output = response.getOutputStream();
|
IOUtils.copy(is, output);
|
}
|
|
@ApiOperation("将流程定义转为模型")
|
@RequestMapping(value = "/exchangeProcessToModel/{pdid}", method = RequestMethod.GET)
|
@ResponseBody
|
public String exchangeProcessToModel(@PathVariable("pdid") String pdid, HttpServletResponse response) throws Exception {
|
ProcessDefinition definition = repositoryService.createProcessDefinitionQuery().processDefinitionId(pdid).singleResult();
|
BpmnModel bpmnModel = repositoryService.getBpmnModel(definition.getId());
|
ObjectNode objectNode = new BpmnJsonConverter().convertToJson(bpmnModel);
|
Model modelData = repositoryService.newModel();
|
modelData.setKey(definition.getKey());
|
modelData.setName(definition.getName());
|
modelData.setCategory(definition.getCategory());
|
ObjectNode modelJson = new ObjectMapper().createObjectNode();
|
modelJson.put(ModelDataJsonConstants.MODEL_NAME, definition.getName());
|
modelJson.put(ModelDataJsonConstants.MODEL_DESCRIPTION, definition.getDescription());
|
List<Model> models = repositoryService.createModelQuery().modelKey(definition.getKey()).list();
|
if (models.size() > 0) {
|
Integer version = models.get(0).getVersion();
|
version++;
|
modelJson.put(ModelDataJsonConstants.MODEL_REVISION, version);
|
// 删除旧模型
|
repositoryService.deleteModel(models.get(0).getId());
|
modelData.setVersion(version);
|
} else {
|
modelJson.put(ModelDataJsonConstants.MODEL_REVISION, 1);
|
}
|
modelData.setMetaInfo(modelJson.toString());
|
modelData.setDeploymentId(definition.getDeploymentId());
|
// 保存新模型
|
repositoryService.saveModel(modelData);
|
// 保存模型json
|
repositoryService.addModelEditorSource(modelData.getId(), objectNode.toString().getBytes(StandardCharsets.UTF_8));
|
return objectNode.toString();
|
}
|
|
@ApiOperation("挂起一个流程定义")
|
@RequestMapping(value = "/suspendProcessDefinition", method = RequestMethod.GET)
|
@ResponseBody
|
public AjaxResult suspendProcessDefinition(@RequestParam("pdid") String pdid, @RequestParam("flag") Boolean flag,
|
@RequestParam(value="date", required = false) String date) throws Exception {
|
if (StringUtils.isNotEmpty(date)) {
|
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
repositoryService.suspendProcessDefinitionById(pdid, flag, sdf.parse(date));
|
} else {
|
repositoryService.suspendProcessDefinitionById(pdid, flag, null);
|
}
|
return AjaxResult.success();
|
}
|
|
@ApiOperation("激活一个流程定义")
|
@RequestMapping(value = "/activateProcessDefinition", method = RequestMethod.GET)
|
@ResponseBody
|
public AjaxResult activateProcessDefinition(@RequestParam("pdid") String pdid, @RequestParam("flag") Boolean flag, @RequestParam(value="date", required = false) String date) throws Exception {
|
if (StringUtils.isNotEmpty(date)) {
|
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
repositoryService.activateProcessDefinitionById(pdid, flag, sdf.parse(date));
|
} else {
|
repositoryService.activateProcessDefinitionById(pdid, flag, null);
|
}
|
return AjaxResult.success();
|
}
|
}
|