add -- 添加流程模型和部署管理模块
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -19,6 +19,14 @@ public interface IWfDeployFormService {
|
||||
*/
|
||||
int insertWfDeployForm(WfDeployForm wfDeployForm);
|
||||
|
||||
/**
|
||||
* 保存流程实例关联表单
|
||||
* @param deployId
|
||||
* @param formId
|
||||
* @return
|
||||
*/
|
||||
int saveInternalDeployForm(String deployId, Long formId);
|
||||
|
||||
/**
|
||||
* 查询流程挂着的表单
|
||||
*
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询流程挂着的表单
|
||||
*
|
||||
|
||||
@@ -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文件异常");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user