本文建议你熟悉Activiti之后在阅读,是Activiti的应用篇。直接上应用代码,包含模型查询,添加,删除,在线设计,导出model的xml文件等功能。Springboot搭建Activiti整合流程设计器 请查看这篇博客https://blog.csdn.net/yy756127197/article/details/101211510
后台服务基于Springboot2 + Mybatis-plus3 + Lombok + Swagger + Hutool工具类
1. Service代码
/**
* 添加
*
* @param actReModel Activiti数据表ACT_RE_MODEL
* @return
*/
@Transactional(rollbackFor = Exception.class)
@Override
public String save(ActReModelEntity actReModel) {
String description = actReModel.getDescription();
String key = actReModel.getKey();
String name = actReModel.getName();
//版本号
int revision = 1;
// 元数据
ObjectNode modelNode = objectMapper.createObjectNode();
modelNode.put(ModelDataJsonConstants.MODEL_NAME, name);
modelNode.put(ModelDataJsonConstants.MODEL_DESCRIPTION, description);
modelNode.put(ModelDataJsonConstants.MODEL_REVISION, revision);
// 模型
Model model = repositoryService.newModel();
model.setName(name);
model.setKey(key);
model.setMetaInfo(modelNode.toString());
repositoryService.saveModel(model);
String id = model.getId();
// 保存模型编辑器源文件
ObjectNode editorNode = objectMapper.createObjectNode();
editorNode.put("id", "canvas");
editorNode.put("resourceId", "canvas");
ObjectNode stencilSetNode = objectMapper.createObjectNode();
stencilSetNode.put("namespace",
"http://b3mn.org/stencilset/bpmn2.0#");
editorNode.put("stencilset", stencilSetNode);
try {
repositoryService.addModelEditorSource(id, editorNode.toString().getBytes("utf-8"));
} catch (UnsupportedEncodingException e) {
throw new YYException("保存模型编辑器源文件失败", e);
}
return id;
}
/**
* 部署
* @param id 模型ID
*/
@Transactional(rollbackFor = Exception.class)
@Override
public void deploy(String id) {
Model modelData = repositoryService.getModel(id);
BpmnJsonConverter jsonConverter = new BpmnJsonConverter();
JsonNode editor = null;
try {
editor = new ObjectMapper().readTree(repositoryService.getModelEditorSource(modelData.getId()));
} catch (IOException e) {
throw new YYException("部署解析失败", e);
}
BpmnModel bpmnModel = jsonConverter.convertToBpmnModel(editor);
BpmnXMLConverter xmlConverter = new BpmnXMLConverter();
byte[] bpmnBytes = xmlConverter.convertToXML(bpmnModel);
String processName = modelData.getName();
if (!StringUtils.endsWith(processName, ActivitiConstant.BPMN20)) {
processName += ActivitiConstant.BPMN20;
}
ByteArrayInputStream in = new ByteArrayInputStream(bpmnBytes);
Deployment deployment = repositoryService.createDeployment()
.name(modelData.getName())
.addInputStream(processName, in)
.deploy();
}
/**
* 导出
*
* @param id 模型ID
* @param type 导出类型
* @param response
*/
@Override
public void export(String id, String type, HttpServletResponse response) {
try {
Model modelData = repositoryService.getModel(id);
BpmnJsonConverter jsonConverter = new BpmnJsonConverter();
byte[] modelEditorSource = repositoryService.getModelEditorSource(modelData.getId());
JsonNode editor = new ObjectMapper().readTree(modelEditorSource);
BpmnModel bpmnModel = jsonConverter.convertToBpmnModel(editor);
String mainProcessId = bpmnModel.getMainProcess().getId();
String filename = "";
byte[] exportBytes = null;
if (type.equals("xml")) {
BpmnXMLConverter xmlConverter = new BpmnXMLConverter();
exportBytes = xmlConverter.convertToXML(bpmnModel);
filename = mainProcessId + ".bpmn20.xml";
} else if (type.equals("json")) {
exportBytes = modelEditorSource;
filename = mainProcessId + ".json";
}
ByteArrayInputStream in = new ByteArrayInputStream(exportBytes);
IOUtils.copy(in, response.getOutputStream());
// filename = URLEncoder.encode(bpmnModel.getMainProcess().getName() + ".bpmn20.xml", "UTF-8");
response.setHeader("Content-Disposition", "attachment; filename=" + filename);
response.flushBuffer();
} catch (Exception e) {
throw new YYException("导出model的xml文件失败,模型ID:" + id, e);
}
}
/**
* 批量删除
*
* @param ids 模型ID
*/
@Override
public void deleteBatch(String[] ids) {
Optional.ofNullable(ids).ifPresent(item -> {
Arrays.stream(item).forEach(id -> {
repositoryService.deleteModel(id);
});
});
}
2. ActReModelEntity
Activiti数据表ACT_RE_MODEL
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import java.sql.Timestamp;
import java.time.LocalDateTime;
import com.baomidou.mybatisplus.annotation.TableField;
import java.io.Serializable;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
* <p>
*
* </p>
*
* @author 司马缸砸缸了
* @since 2019-08-23
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("ACT_RE_MODEL")
public class ActReModelEntity implements Serializable {
@TableId(value = "ID_")
private String id;
@ApiModelProperty(value = "乐观锁版本号")
@TableField("REV_")
private Integer rev;
@ApiModelProperty(value = "模型的名称")
@TableField("NAME_")
private String name;
@ApiModelProperty(value = "模型的关键字")
@TableField("KEY_")
private String key;
@ApiModelProperty(value = "类型")
@TableField("CATEGORY_")
private String category;
@ApiModelProperty(value = "创建时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@TableField("CREATE_TIME_")
private Timestamp createTime;
@ApiModelProperty(value = "最后修改时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@TableField("LAST_UPDATE_TIME_")
private Timestamp lastUpdateTime;
@ApiModelProperty(value = "版本,从1开始")
@TableField("VERSION_")
private Integer version;
@ApiModelProperty(value = "数据元信息,json格式")
@TableField("META_INFO_")
private String metaInfo;
@ApiModelProperty(value = "部署ID")
@TableField("DEPLOYMENT_ID_")
private String deploymentId;
@ApiModelProperty(value = "编辑源值ID,是 ACT_GE_BYTEARRAY 表中的ID_值")
@TableField("EDITOR_SOURCE_VALUE_ID_")
private String editorSourceValueId;
@ApiModelProperty(value = "编辑源额外值ID,是 ACT_GE_BYTEARRAY 表中的ID_值")
@TableField("EDITOR_SOURCE_EXTRA_VALUE_ID_")
private String editorSourceExtraValueId;
@TableField("TENANT_ID_")
private String tenantId;
@TableField(exist = false)
private String description;
}
源码地址
IT-CLOUD :IT服务管理平台,集成基础服务,中间件服务,监控告警服务等。
开源项目,持续不断更新中,喜欢请 Star~