add -- 添加流程模型和部署管理模块

This commit is contained in:
konbai
2022-07-08 21:33:58 +08:00
parent 49042c47eb
commit 2249519522
22 changed files with 2225 additions and 10 deletions

View File

@@ -1,8 +1,5 @@
package com.ruoyi.workflow.domain;
import com.alibaba.excel.annotation.ExcelProperty;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import lombok.Data;
@@ -22,13 +19,25 @@ public class WfDeployForm {
/**
* 流程定义主键
*/
@TableId(type = IdType.INPUT)
@ExcelProperty(value = "流程定义主键")
private String deployId;
/**
* 表单主键
*/
@ExcelProperty(value = "表单主键")
private Long formId;
/**
* 节点Key
*/
private String nodeKey;
/**
* 节点名称
*/
private String nodeName;
/**
* 表单内容
*/
private String content;
}

View File

@@ -0,0 +1,50 @@
package com.ruoyi.workflow.domain.bo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
/**
* @author KonBAI
* @createTime 2022/6/21 9:16
*/
@Data
@ApiModel("流程模型对象")
public class WfModelBo {
@ApiModelProperty(value = "模型主键")
private String modelId;
@ApiModelProperty(value = "模型名称", required = true)
@NotNull(message = "模型名称不能为空")
private String modelName;
@ApiModelProperty(value = "模型Key", required = true)
@NotNull(message = "模型Key不能为空")
private String modelKey;
@ApiModelProperty(value = "流程分类", required = true)
@NotBlank(message = "流程分类不能为空")
private String category;
@ApiModelProperty(value = "描述")
private String description;
@ApiModelProperty(value = "表单类型", required = true)
@NotBlank(message = "表单类型不能为空")
private Integer formType;
@ApiModelProperty(value = "表单主键", required = true)
@NotBlank(message = "表单不能为空")
private Long formId;
@ApiModelProperty(value = "流程xml", required = true)
@NotBlank(message = "流程xml不能为空")
private String bpmnXml;
@ApiModelProperty(value = "是否保存为新版本", required = true)
private Boolean newVersion;
}

View File

@@ -14,6 +14,15 @@ import lombok.Data;
@ApiModel("流程业务对象")
public class WfProcessBo {
@ApiModelProperty("流程标识")
private String processKey;
@ApiModelProperty("流程名称")
private String processName;
@ApiModelProperty("流程分类")
private String category;
@ApiModelProperty("状态")
private String state;
}

View File

@@ -0,0 +1,25 @@
package com.ruoyi.workflow.domain.dto;
import lombok.Data;
/**
* @author KonBAI
* @createTime 2022/6/21 9:16
*/
@Data
public class WfMetaInfoDto {
/**
* 流程描述
*/
private String description;
/**
* 表单类型
*/
private Integer formType;
/**
* 表单编号
*/
private Long formId;
}

View File

@@ -0,0 +1,90 @@
package com.ruoyi.workflow.domain.vo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
/**
* 流程部署视图对象
*
* @author KonBAI
* @date 2022-06-30
*/
@Data
@ApiModel("流程部署视图对象")
@ExcelIgnoreUnannotated
public class WfDeployVo {
private static final long serialVersionUID = 1L;
/**
* 流程定义ID
*/
@ExcelProperty(value = "流程定义ID")
@ApiModelProperty("流程定义ID")
private String definitionId;
/**
* 流程名称
*/
@ExcelProperty(value = "流程名称")
@ApiModelProperty("流程名称")
private String processName;
/**
* 流程Key
*/
@ExcelProperty(value = "流程Key")
@ApiModelProperty("流程Key")
private String processKey;
/**
* 分类编码
*/
@ExcelProperty(value = "分类编码")
@ApiModelProperty("分类编码")
private String category;
@ApiModelProperty("版本")
private Integer version;
/**
* 表单ID
*/
@ExcelProperty(value = "表单ID")
@ApiModelProperty("表单ID")
private Long formId;
/**
* 表单名称
*/
@ExcelProperty(value = "表单名称")
@ApiModelProperty("表单名称")
private String formName;
/**
* 部署ID
*/
@ExcelProperty(value = "部署ID")
@ApiModelProperty("部署ID")
private String deploymentId;
/**
* 流程定义状态: 1:激活 , 2:中止
*/
@ExcelProperty(value = "流程定义状态: 1:激活 , 2:中止")
@ApiModelProperty("流程定义状态: 1:激活 , 2:中止")
private Boolean suspended;
/**
* 部署时间
*/
@ExcelProperty(value = "部署时间")
@ApiModelProperty("部署时间")
private Date deploymentTime;
}

View File

@@ -0,0 +1,63 @@
package com.ruoyi.workflow.domain.vo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
/**
* @author KonBAI
* @createTime 2022/6/21 9:16
*/
@Data
@ApiModel("流程模型视图对象")
@ExcelIgnoreUnannotated
public class WfModelVo {
@ExcelProperty(value = "模型ID")
@ApiModelProperty("模型ID")
private String modelId;
@ExcelProperty(value = "模型名称")
@ApiModelProperty("模型名称")
private String modelName;
@ExcelProperty(value = "模型Key")
@ApiModelProperty("模型Key")
private String modelKey;
@ExcelProperty(value = "分类编码")
@ApiModelProperty("分类编码")
private String category;
@ExcelProperty(value = "版本")
@ApiModelProperty("版本")
private Integer version;
@ExcelProperty(value = "表单类型")
@ApiModelProperty("表单类型")
private Integer formType;
@ExcelProperty(value = "表单ID")
@ApiModelProperty("表单ID")
private Long formId;
@ExcelProperty(value = "模型描述")
@ApiModelProperty("模型描述")
private String description;
@ExcelProperty(value = "创建时间")
@ApiModelProperty("创建时间")
private Date createTime;
@ExcelProperty(value = "流程xml")
@ApiModelProperty("流程xml")
private String bpmnXml;
@ExcelProperty(value = "表单内容")
@ApiModelProperty("表单内容")
private String content;
}

View File

@@ -19,6 +19,14 @@ public interface IWfDeployFormService {
*/
int insertWfDeployForm(WfDeployForm wfDeployForm);
/**
* 保存流程实例关联表单
* @param deployId
* @param formId
* @return
*/
int saveInternalDeployForm(String deployId, Long formId);
/**
* 查询流程挂着的表单
*

View File

@@ -0,0 +1,21 @@
package com.ruoyi.workflow.service;
import com.ruoyi.common.core.domain.PageQuery;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.workflow.domain.bo.WfProcessBo;
import com.ruoyi.workflow.domain.vo.WfDeployVo;
/**
* @author KonBAI
* @createTime 2022/6/30 9:03
*/
public interface IWfDeployService {
TableDataInfo<WfDeployVo> queryPageList(WfProcessBo processBo, PageQuery pageQuery);
TableDataInfo<WfDeployVo> queryPublishList(String processKey, PageQuery pageQuery);
void updateState(String definitionId, String stateCode);
String queryBpmnXmlById(String definitionId);
}

View File

@@ -0,0 +1,31 @@
package com.ruoyi.workflow.service;
import com.ruoyi.common.core.domain.PageQuery;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.workflow.domain.bo.WfModelBo;
import com.ruoyi.workflow.domain.vo.WfModelVo;
import java.util.Collection;
/**
* @author KonBAI
* @createTime 2022/6/21 9:11
*/
public interface IWfModelService {
TableDataInfo<WfModelVo> list(WfModelBo modelBo, PageQuery pageQuery);
TableDataInfo<WfModelVo> historyList(WfModelBo modelBo, PageQuery pageQuery);
WfModelVo getModel(String modelId);
String queryBpmnXmlById(String modelId);
void saveModel(WfModelBo modelBo);
void latestModel(String modelId);
void deleteByIds(Collection<String> ids);
void deployModel(String modelId);
}

View File

@@ -46,6 +46,20 @@ public class WfDeployFormServiceImpl implements IWfDeployFormService {
return baseMapper.insert(deployForm);
}
@Override
@Transactional(rollbackFor = Exception.class)
public int saveInternalDeployForm(String deployId, Long formId) {
WfDeployForm deployForm = new WfDeployForm();
deployForm.setDeployId(deployId);
deployForm.setFormId(formId);
WfForm wfForm = formMapper.selectById(formId);
if (ObjectUtil.isNotNull(wfForm)) {
deployForm.setContent(wfForm.getContent());
}
// 新增部署流程和表单关系
return baseMapper.insert(deployForm);
}
/**
* 查询流程挂着的表单
*

View File

@@ -0,0 +1,147 @@
package com.ruoyi.workflow.service.impl;
import cn.hutool.core.io.IORuntimeException;
import cn.hutool.core.io.IoUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.core.domain.PageQuery;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.workflow.domain.bo.WfProcessBo;
import com.ruoyi.workflow.domain.vo.WfDeployVo;
import com.ruoyi.workflow.service.IWfDeployService;
import lombok.RequiredArgsConstructor;
import org.flowable.common.engine.impl.db.SuspensionState;
import org.flowable.engine.RepositoryService;
import org.flowable.engine.repository.Deployment;
import org.flowable.engine.repository.ProcessDefinition;
import org.flowable.engine.repository.ProcessDefinitionQuery;
import org.springframework.stereotype.Service;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
/**
* @author KonBAI
* @createTime 2022/6/30 9:04
*/
@RequiredArgsConstructor
@Service
public class WfDeployServiceImpl implements IWfDeployService {
private final RepositoryService repositoryService;
@Override
public TableDataInfo<WfDeployVo> queryPageList(WfProcessBo processBo, PageQuery pageQuery) {
// 流程定义列表数据查询
ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery()
.latestVersion()
.orderByProcessDefinitionKey()
.asc();
if (StringUtils.isNotBlank(processBo.getProcessKey())) {
processDefinitionQuery.processDefinitionKeyLike("%" + processBo.getProcessKey() + "%");
}
if (StringUtils.isNotBlank(processBo.getProcessName())) {
processDefinitionQuery.processDefinitionNameLike("%" + processBo.getProcessName() + "%");
}
if (StringUtils.isNotBlank(processBo.getCategory())) {
processDefinitionQuery.processDefinitionCategory(processBo.getCategory());
}
if (StringUtils.isNotBlank(processBo.getState())) {
if (SuspensionState.ACTIVE.toString().equals(processBo.getState())) {
processDefinitionQuery.active();
} else if (SuspensionState.SUSPENDED.toString().equals(processBo.getState())) {
processDefinitionQuery.suspended();
}
}
// SuspensionState.ACTIVE
long pageTotal = processDefinitionQuery.count();
if (pageTotal <= 0) {
return TableDataInfo.build();
}
int offset = pageQuery.getPageSize() * (pageQuery.getPageNum() - 1);
List<ProcessDefinition> definitionList = processDefinitionQuery.listPage(offset, pageQuery.getPageSize());
List<WfDeployVo> deployVoList = new ArrayList<>(definitionList.size());
for (ProcessDefinition processDefinition : definitionList) {
String deploymentId = processDefinition.getDeploymentId();
Deployment deployment = repositoryService.createDeploymentQuery().deploymentId(deploymentId).singleResult();
WfDeployVo vo = new WfDeployVo();
vo.setDefinitionId(processDefinition.getId());
vo.setProcessKey(processDefinition.getKey());
vo.setProcessName(processDefinition.getName());
vo.setVersion(processDefinition.getVersion());
vo.setCategory(processDefinition.getCategory());
vo.setDeploymentId(processDefinition.getDeploymentId());
vo.setSuspended(processDefinition.isSuspended());
// 流程部署信息
vo.setCategory(deployment.getCategory());
vo.setDeploymentTime(deployment.getDeploymentTime());
deployVoList.add(vo);
}
Page<WfDeployVo> page = new Page<>();
page.setRecords(deployVoList);
page.setTotal(pageTotal);
return TableDataInfo.build(page);
}
@Override
public TableDataInfo<WfDeployVo> queryPublishList(String processKey, PageQuery pageQuery) {
// 创建查询条件
ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery()
.processDefinitionKey(processKey)
.orderByProcessDefinitionVersion()
.desc();
long pageTotal = processDefinitionQuery.count();
if (pageTotal <= 0) {
return TableDataInfo.build();
}
// 根据查询条件,查询所有版本
int offset = pageQuery.getPageSize() * (pageQuery.getPageNum() - 1);
List<ProcessDefinition> processDefinitionList = processDefinitionQuery
.listPage(offset, pageQuery.getPageSize());
List<WfDeployVo> deployVoList = processDefinitionList.stream().map(item -> {
WfDeployVo vo = new WfDeployVo();
vo.setDefinitionId(item.getId());
vo.setProcessKey(item.getKey());
vo.setProcessName(item.getName());
vo.setVersion(item.getVersion());
vo.setCategory(item.getCategory());
vo.setDeploymentId(item.getDeploymentId());
vo.setSuspended(item.isSuspended());
return vo;
}).collect(Collectors.toList());
Page<WfDeployVo> page = new Page<>();
page.setRecords(deployVoList);
page.setTotal(pageTotal);
return TableDataInfo.build(page);
}
/**
* 激活或挂起流程
*
* @param state 状态
* @param definitionId 流程定义ID
*/
@Override
public void updateState(String definitionId, String state) {
if (SuspensionState.ACTIVE.toString().equals(state)) {
// 激活
repositoryService.activateProcessDefinitionById(definitionId, true, null);
} else if (SuspensionState.SUSPENDED.toString().equals(state)) {
// 挂起
repositoryService.suspendProcessDefinitionById(definitionId, true, null);
}
}
@Override
public String queryBpmnXmlById(String definitionId) {
InputStream inputStream = repositoryService.getProcessModel(definitionId);
try {
return IoUtil.readUtf8(inputStream);
} catch (IORuntimeException exception) {
throw new RuntimeException("加载xml文件异常");
}
}
}

View File

@@ -0,0 +1,286 @@
package com.ruoyi.workflow.service.impl;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.core.domain.PageQuery;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.utils.JsonUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.flowable.common.constant.ProcessConstants;
import com.ruoyi.flowable.common.enums.FormType;
import com.ruoyi.flowable.factory.FlowServiceFactory;
import com.ruoyi.flowable.utils.ModelUtils;
import com.ruoyi.workflow.domain.bo.WfModelBo;
import com.ruoyi.workflow.domain.dto.WfMetaInfoDto;
import com.ruoyi.workflow.domain.vo.WfFormVo;
import com.ruoyi.workflow.domain.vo.WfModelVo;
import com.ruoyi.workflow.service.IWfDeployFormService;
import com.ruoyi.workflow.service.IWfFormService;
import com.ruoyi.workflow.service.IWfModelService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.flowable.bpmn.model.BpmnModel;
import org.flowable.engine.repository.Deployment;
import org.flowable.engine.repository.Model;
import org.flowable.engine.repository.ModelQuery;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
/**
* @author KonBAI
* @createTime 2022/6/21 9:11
*/
@RequiredArgsConstructor
@Service
@Slf4j
public class WfModelServiceImpl extends FlowServiceFactory implements IWfModelService {
private final IWfFormService formService;
private final IWfDeployFormService deployFormService;
@Override
public TableDataInfo<WfModelVo> list(WfModelBo modelBo, PageQuery pageQuery) {
ModelQuery modelQuery = repositoryService.createModelQuery().latestVersion().orderByCreateTime().desc();
// 构建查询条件
if (StringUtils.isNotBlank(modelBo.getModelKey())) {
modelQuery.modelKey(modelBo.getModelKey());
}
if (StringUtils.isNotBlank(modelBo.getModelName())) {
modelQuery.modelNameLike("%" + modelBo.getModelName() + "%");
}
if (StringUtils.isNotBlank(modelBo.getCategory())) {
modelQuery.modelCategory(modelBo.getCategory());
}
// 执行查询
long pageTotal = modelQuery.count();
if (pageTotal <= 0) {
return TableDataInfo.build();
}
int offset = pageQuery.getPageSize() * (pageQuery.getPageNum() - 1);
List<Model> modelList = modelQuery.listPage(offset, pageQuery.getPageSize());
List<WfModelVo> modelVoList = new ArrayList<>(modelList.size());
modelList.forEach(model -> {
WfModelVo modelVo = new WfModelVo();
modelVo.setModelId(model.getId());
modelVo.setModelName(model.getName());
modelVo.setModelKey(model.getKey());
modelVo.setCategory(model.getCategory());
modelVo.setCreateTime(model.getCreateTime());
modelVo.setVersion(model.getVersion());
WfMetaInfoDto metaInfo = JsonUtils.parseObject(model.getMetaInfo(), WfMetaInfoDto.class);
if (metaInfo != null) {
modelVo.setDescription(metaInfo.getDescription());
modelVo.setFormType(metaInfo.getFormType());
modelVo.setFormId(metaInfo.getFormId());
}
modelVoList.add(modelVo);
});
Page<WfModelVo> page = new Page<>();
page.setRecords(modelVoList);
page.setTotal(pageTotal);
return TableDataInfo.build(page);
}
@Override
public TableDataInfo<WfModelVo> historyList(WfModelBo modelBo, PageQuery pageQuery) {
ModelQuery modelQuery = repositoryService.createModelQuery()
.modelKey(modelBo.getModelKey())
.orderByModelVersion()
.desc();
// 执行查询(不显示最新版,-1
long pageTotal = modelQuery.count() - 1;
if (pageTotal <= 0) {
return TableDataInfo.build();
}
// offset+1去掉最新版
int offset = 1 + pageQuery.getPageSize() * (pageQuery.getPageNum() - 1);
List<Model> modelList = modelQuery.listPage(offset, pageQuery.getPageSize());
List<WfModelVo> modelVoList = new ArrayList<>(modelList.size());
modelList.forEach(model -> {
WfModelVo modelVo = new WfModelVo();
modelVo.setModelId(model.getId());
modelVo.setModelName(model.getName());
modelVo.setModelKey(model.getKey());
modelVo.setCategory(model.getCategory());
modelVo.setCreateTime(model.getCreateTime());
modelVo.setVersion(model.getVersion());
WfMetaInfoDto metaInfo = JsonUtils.parseObject(model.getMetaInfo(), WfMetaInfoDto.class);
if (metaInfo != null) {
modelVo.setDescription(metaInfo.getDescription());
modelVo.setFormType(metaInfo.getFormType());
modelVo.setFormId(metaInfo.getFormId());
}
modelVoList.add(modelVo);
});
Page<WfModelVo> page = new Page<>();
page.setRecords(modelVoList);
page.setTotal(pageTotal);
return TableDataInfo.build(page);
}
@Override
public WfModelVo getModel(String modelId) {
// 获取流程模型
Model model = repositoryService.getModel(modelId);
if (ObjectUtil.isNull(model)) {
throw new RuntimeException("流程模型不存在!");
}
// 获取流程图
String bpmnXml = queryBpmnXmlById(modelId);
WfModelVo modelVo = new WfModelVo();
modelVo.setModelId(model.getId());
modelVo.setModelName(model.getName());
modelVo.setModelKey(model.getKey());
modelVo.setCategory(model.getCategory());
modelVo.setCreateTime(model.getCreateTime());
modelVo.setVersion(model.getVersion());
modelVo.setBpmnXml(bpmnXml);
WfMetaInfoDto metaInfo = JsonUtils.parseObject(model.getMetaInfo(), WfMetaInfoDto.class);
if (metaInfo != null) {
modelVo.setDescription(metaInfo.getDescription());
modelVo.setFormType(metaInfo.getFormType());
modelVo.setFormId(metaInfo.getFormId());
if (FormType.PROCESS.getType().equals(metaInfo.getFormType())) {
WfFormVo wfFormVo = formService.queryById(metaInfo.getFormId());
modelVo.setContent(wfFormVo.getContent());
}
}
return modelVo;
}
@Override
public String queryBpmnXmlById(String modelId) {
byte[] bpmnBytes = repositoryService.getModelEditorSource(modelId);
if (ObjectUtil.isNull(bpmnBytes)) {
throw new RuntimeException("流程图不存在!");
}
return StrUtil.utf8Str(bpmnBytes);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void saveModel(WfModelBo modelBo) {
// 根据模型Key查询模型信息
Model model = repositoryService.createModelQuery().modelKey(modelBo.getModelKey()).singleResult();
Model newModel;
if (ObjectUtil.isNull(model)) {
newModel = repositoryService.newModel();
} else {
if (modelBo.getNewVersion() != null && modelBo.getNewVersion()) {
newModel = repositoryService.newModel();
newModel.setVersion(model.getVersion() + 1);
} else {
newModel = model;
}
}
newModel.setName(modelBo.getModelName());
newModel.setKey(modelBo.getModelKey());
newModel.setCategory(modelBo.getCategory());
newModel.setMetaInfo(buildMetaInfo(modelBo));
// 保存流程模型
repositoryService.saveModel(newModel);
// 保存 BPMN XML
saveModelBpmnXml(newModel.getId(), modelBo.getBpmnXml());
}
@Override
@Transactional(rollbackFor = Exception.class)
public void latestModel(String modelId) {
// 获取流程模型
Model model = repositoryService.getModel(modelId);
if (ObjectUtil.isNull(model)) {
throw new RuntimeException("流程模型不存在!");
}
String bpmnXml = queryBpmnXmlById(modelId);
Integer latestVersion = repositoryService.createModelQuery()
.modelKey(model.getKey())
.latestVersion()
.singleResult()
.getVersion();
if (model.getVersion().equals(latestVersion)) {
throw new RuntimeException("当前版本已是最新版!");
}
Model newModel = repositoryService.newModel();
newModel.setName(model.getName());
newModel.setKey(model.getKey());
newModel.setCategory(model.getCategory());
newModel.setMetaInfo(model.getMetaInfo());
newModel.setVersion(latestVersion + 1);
// 保存流程模型
repositoryService.saveModel(newModel);
// 保存 BPMN XML
saveModelBpmnXml(newModel.getId(), bpmnXml);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void deleteByIds(Collection<String> ids) {
ids.forEach(id -> {
Model model = repositoryService.getModel(id);
if (ObjectUtil.isNull(model)) {
throw new RuntimeException("流程模型不存在!");
}
repositoryService.deleteModel(id);
});
}
@Override
@Transactional(rollbackFor = Exception.class)
public void deployModel(String modelId) {
// 获取流程模型
Model model = repositoryService.getModel(modelId);
if (ObjectUtil.isNull(model)) {
throw new RuntimeException("流程模型不存在!");
}
WfMetaInfoDto metaInfo = getMetaInfo(model.getMetaInfo());
// 获取流程图
String bpmnXml = queryBpmnXmlById(modelId);
BpmnModel bpmnModel = ModelUtils.getBpmnModel(bpmnXml);
String processName = model.getName() + ProcessConstants.SUFFIX;
Deployment deployment = repositoryService.createDeployment()
.name(model.getName())
.key(model.getKey())
.addBpmnModel(processName, bpmnModel)
.category(model.getCategory())
.deploy();
// 保存部署表单
if (FormType.PROCESS.getType().equals(metaInfo.getFormType())) {
deployFormService.saveInternalDeployForm(deployment.getId(), metaInfo.getFormId());
}
}
private String buildMetaInfo(WfModelBo modelBo) {
WfMetaInfoDto metaInfo = new WfMetaInfoDto();
// 只有非空,才进行设置,避免更新时的覆盖
if (StringUtils.isNotEmpty(modelBo.getDescription())) {
metaInfo.setDescription(modelBo.getDescription());
}
if (ObjectUtil.isNotNull(modelBo.getFormType())) {
metaInfo.setFormType(modelBo.getFormType());
metaInfo.setFormId(modelBo.getFormId());
}
return JsonUtils.toJsonString(metaInfo);
}
private WfMetaInfoDto getMetaInfo(String metaInfoJson) {
WfMetaInfoDto metaInfo = JsonUtils.parseObject(metaInfoJson, WfMetaInfoDto.class);
if (ObjectUtil.isNull(metaInfo) || ObjectUtil.hasNull(metaInfo.getFormType(), metaInfo.getFormId())) {
throw new RuntimeException("未配置表单信息!");
}
return metaInfo;
}
private void saveModelBpmnXml(String modelId, String bpmnXml) {
if (StringUtils.isBlank(modelId)) {
throw new RuntimeException("模板主键不能为空!");
}
if (StringUtils.isNotEmpty(bpmnXml)) {
repositoryService.addModelEditorSource(modelId, StrUtil.utf8Bytes(bpmnXml));
}
}
}