1
This commit is contained in:
@@ -0,0 +1,74 @@
|
||||
package com.klp.workflow.domain;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.TableId;
|
||||
import com.baomidou.mybatisplus.annotation.TableLogic;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import com.klp.common.core.domain.BaseEntity;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
/**
|
||||
* 流程抄送对象 wf_copy
|
||||
*
|
||||
* @author KonBAI
|
||||
* @date 2022-05-19
|
||||
*/
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@TableName("wf_copy")
|
||||
public class WfCopy extends BaseEntity {
|
||||
|
||||
private static final long serialVersionUID=1L;
|
||||
|
||||
/**
|
||||
* 抄送主键
|
||||
*/
|
||||
@TableId(value = "copy_id")
|
||||
private Long copyId;
|
||||
/**
|
||||
* 抄送标题
|
||||
*/
|
||||
private String title;
|
||||
/**
|
||||
* 流程主键
|
||||
*/
|
||||
private String processId;
|
||||
/**
|
||||
* 流程名称
|
||||
*/
|
||||
private String processName;
|
||||
/**
|
||||
* 流程分类主键
|
||||
*/
|
||||
private String categoryId;
|
||||
/**
|
||||
* 部署主键
|
||||
*/
|
||||
private String deploymentId;
|
||||
/**
|
||||
* 流程实例主键
|
||||
*/
|
||||
private String instanceId;
|
||||
/**
|
||||
* 任务主键
|
||||
*/
|
||||
private String taskId;
|
||||
/**
|
||||
* 用户主键
|
||||
*/
|
||||
private Long userId;
|
||||
/**
|
||||
* 发起人Id
|
||||
*/
|
||||
private Long originatorId;
|
||||
/**
|
||||
* 发起人名称
|
||||
*/
|
||||
private String originatorName;
|
||||
/**
|
||||
* 删除标志(0代表存在 2代表删除)
|
||||
*/
|
||||
@TableLogic
|
||||
private String delFlag;
|
||||
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
package com.klp.workflow.domain;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* 流程实例关联表单对象 sys_instance_form
|
||||
*
|
||||
* @author KonBAI
|
||||
* @createTime 2022/3/7 22:07
|
||||
*/
|
||||
@Data
|
||||
@TableName("wf_deploy_form")
|
||||
public class WfDeployForm {
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/**
|
||||
* 流程部署主键
|
||||
*/
|
||||
private String deployId;
|
||||
|
||||
/**
|
||||
* 表单Key
|
||||
*/
|
||||
private String formKey;
|
||||
|
||||
/**
|
||||
* 节点Key
|
||||
*/
|
||||
private String nodeKey;
|
||||
|
||||
/**
|
||||
* 表单名称
|
||||
*/
|
||||
private String formName;
|
||||
|
||||
/**
|
||||
* 节点名称
|
||||
*/
|
||||
private String nodeName;
|
||||
|
||||
/**
|
||||
* 表单内容
|
||||
*/
|
||||
private String content;
|
||||
}
|
||||
@@ -0,0 +1,57 @@
|
||||
package com.klp.workflow.domain.vo;
|
||||
|
||||
import com.alibaba.excel.annotation.ExcelProperty;
|
||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* 待签流程对象导出VO
|
||||
*
|
||||
* @author konbai
|
||||
*/
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
public class WfClaimTaskExportVo implements Serializable {
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/**
|
||||
* 任务编号
|
||||
*/
|
||||
@ExcelProperty(value = "任务编号")
|
||||
private String taskId;
|
||||
|
||||
/**
|
||||
* 流程名称
|
||||
*/
|
||||
@ExcelProperty(value = "流程名称")
|
||||
private String procDefName;
|
||||
|
||||
/**
|
||||
* 任务节点
|
||||
*/
|
||||
@ExcelProperty(value = "任务节点")
|
||||
private String taskName;
|
||||
|
||||
/**
|
||||
* 流程版本
|
||||
*/
|
||||
@ExcelProperty(value = "流程版本")
|
||||
private int procDefVersion;
|
||||
|
||||
/**
|
||||
* 流程发起人名称
|
||||
*/
|
||||
@ExcelProperty(value = "流程发起人")
|
||||
private String startUserName;
|
||||
|
||||
/**
|
||||
* 接收时间
|
||||
*/
|
||||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
@ExcelProperty(value = "接收时间")
|
||||
private Date createTime;
|
||||
}
|
||||
@@ -0,0 +1,59 @@
|
||||
package com.klp.workflow.domain.vo;
|
||||
|
||||
import com.alibaba.excel.annotation.ExcelProperty;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* 流程模型对象导出VO
|
||||
*
|
||||
* @author konbai
|
||||
*/
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
public class WfModelExportVo implements Serializable {
|
||||
private static final long serialVersionUID = 1L;
|
||||
/**
|
||||
* 模型ID
|
||||
*/
|
||||
@ExcelProperty(value = "模型ID")
|
||||
private String modelId;
|
||||
/**
|
||||
* 模型Key
|
||||
*/
|
||||
@ExcelProperty(value = "模型Key")
|
||||
private String modelKey;
|
||||
/**
|
||||
* 模型名称
|
||||
*/
|
||||
@ExcelProperty(value = "模型名称")
|
||||
private String modelName;
|
||||
/**
|
||||
* 分类编码
|
||||
*/
|
||||
@ExcelProperty(value = "分类编码")
|
||||
private String category;
|
||||
/**
|
||||
* 流程分类
|
||||
*/
|
||||
@ExcelProperty(value = "流程分类")
|
||||
private String categoryName;
|
||||
/**
|
||||
* 模型版本
|
||||
*/
|
||||
@ExcelProperty(value = "模型版本")
|
||||
private Integer version;
|
||||
/**
|
||||
* 模型描述
|
||||
*/
|
||||
@ExcelProperty(value = "模型描述")
|
||||
private String description;
|
||||
/**
|
||||
* 创建时间
|
||||
*/
|
||||
@ExcelProperty(value = "创建时间")
|
||||
private Date createTime;
|
||||
}
|
||||
@@ -0,0 +1,75 @@
|
||||
package com.klp.workflow.domain.vo;
|
||||
|
||||
import com.alibaba.excel.annotation.ExcelProperty;
|
||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* 我拥有流程对象导出VO
|
||||
*
|
||||
* @author konbai
|
||||
*/
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
public class WfOwnTaskExportVo implements Serializable {
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/**
|
||||
* 流程实例ID
|
||||
*/
|
||||
@ExcelProperty(value = "流程编号")
|
||||
private String procInsId;
|
||||
|
||||
/**
|
||||
* 流程名称
|
||||
*/
|
||||
@ExcelProperty(value = "流程名称")
|
||||
private String procDefName;
|
||||
|
||||
/**
|
||||
* 流程类别
|
||||
*/
|
||||
@ExcelProperty(value = "流程类别")
|
||||
private String category;
|
||||
|
||||
/**
|
||||
* 流程版本
|
||||
*/
|
||||
@ExcelProperty(value = "流程版本")
|
||||
private int procDefVersion;
|
||||
|
||||
/**
|
||||
* 提交时间
|
||||
*/
|
||||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
@ExcelProperty(value = "提交时间")
|
||||
private Date createTime;
|
||||
|
||||
/**
|
||||
* 流程状态
|
||||
*/
|
||||
@ExcelProperty(value = "流程状态")
|
||||
private String status;
|
||||
|
||||
/**
|
||||
* 任务耗时
|
||||
*/
|
||||
@ExcelProperty(value = "任务耗时")
|
||||
private String duration;
|
||||
|
||||
/**
|
||||
* 当前节点
|
||||
*/
|
||||
@ExcelProperty(value = "当前节点")
|
||||
private String taskName;
|
||||
|
||||
/**
|
||||
* 任务完成时间
|
||||
*/
|
||||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
private Date finishTime;
|
||||
}
|
||||
@@ -0,0 +1,132 @@
|
||||
package com.klp.workflow.domain.vo;
|
||||
|
||||
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
|
||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
import com.klp.workflow.domain.dto.WfCommentDto;
|
||||
import lombok.Data;
|
||||
import org.flowable.engine.task.Comment;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 工作流任务视图对象
|
||||
*
|
||||
* @author KonBAI
|
||||
* @createTime 2022/3/10 00:12
|
||||
*/
|
||||
@Data
|
||||
@ExcelIgnoreUnannotated
|
||||
public class WfTaskVo implements Serializable {
|
||||
/**
|
||||
* 任务编号
|
||||
*/
|
||||
private String taskId;
|
||||
/**
|
||||
* 任务名称
|
||||
*/
|
||||
private String taskName;
|
||||
/**
|
||||
* 任务Key
|
||||
*/
|
||||
private String taskDefKey;
|
||||
/**
|
||||
* 任务执行人Id
|
||||
*/
|
||||
private Long assigneeId;
|
||||
/**
|
||||
* 部门名称
|
||||
*/
|
||||
@Deprecated
|
||||
private String deptName;
|
||||
/**
|
||||
* 流程发起人部门名称
|
||||
*/
|
||||
@Deprecated
|
||||
private String startDeptName;
|
||||
/**
|
||||
* 任务执行人名称
|
||||
*/
|
||||
private String assigneeName;
|
||||
/**
|
||||
* 流程发起人Id
|
||||
*/
|
||||
private Long startUserId;
|
||||
/**
|
||||
* 流程发起人名称
|
||||
*/
|
||||
private String startUserName;
|
||||
/**
|
||||
* 流程类型
|
||||
*/
|
||||
private String category;
|
||||
/**
|
||||
* 流程变量信息
|
||||
*/
|
||||
private Object procVars;
|
||||
/**
|
||||
* 局部变量信息
|
||||
*/
|
||||
private Object taskLocalVars;
|
||||
/**
|
||||
* 流程部署编号
|
||||
*/
|
||||
private String deployId;
|
||||
/**
|
||||
* 流程ID
|
||||
*/
|
||||
private String procDefId;
|
||||
/**
|
||||
* 流程key
|
||||
*/
|
||||
private String procDefKey;
|
||||
/**
|
||||
* 流程定义名称
|
||||
*/
|
||||
private String procDefName;
|
||||
/**
|
||||
* 流程定义内置使用版本
|
||||
*/
|
||||
private int procDefVersion;
|
||||
/**
|
||||
* 流程实例ID
|
||||
*/
|
||||
private String procInsId;
|
||||
/**
|
||||
* 历史流程实例ID
|
||||
*/
|
||||
private String hisProcInsId;
|
||||
/**
|
||||
* 任务耗时
|
||||
*/
|
||||
private String duration;
|
||||
/**
|
||||
* 任务意见
|
||||
*/
|
||||
private WfCommentDto comment;
|
||||
/**
|
||||
* 任务意见
|
||||
*/
|
||||
private List<Comment> commentList;
|
||||
/**
|
||||
* 候选执行人
|
||||
*/
|
||||
private String candidate;
|
||||
/**
|
||||
* 任务创建时间
|
||||
*/
|
||||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
private Date createTime;
|
||||
/**
|
||||
* 任务完成时间
|
||||
*/
|
||||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
private Date finishTime;
|
||||
|
||||
/**
|
||||
* 流程状态
|
||||
*/
|
||||
private String processStatus;
|
||||
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
package com.klp.workflow.mapper;
|
||||
|
||||
import com.klp.common.core.mapper.BaseMapperPlus;
|
||||
import com.klp.workflow.domain.WfCopy;
|
||||
import com.klp.workflow.domain.vo.WfCopyVo;
|
||||
|
||||
/**
|
||||
* 流程抄送Mapper接口
|
||||
*
|
||||
* @author KonBAI
|
||||
* @date 2022-05-19
|
||||
*/
|
||||
public interface WfCopyMapper extends BaseMapperPlus<WfCopyMapper, WfCopy, WfCopyVo> {
|
||||
|
||||
}
|
||||
@@ -0,0 +1,117 @@
|
||||
package com.klp.workflow.service;
|
||||
|
||||
import com.klp.workflow.domain.bo.WfTaskBo;
|
||||
import org.flowable.bpmn.model.FlowElement;
|
||||
import org.flowable.engine.runtime.ProcessInstance;
|
||||
|
||||
import java.io.InputStream;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* @author KonBAI
|
||||
* @createTime 2022/3/10 00:12
|
||||
*/
|
||||
public interface IWfTaskService {
|
||||
|
||||
/**
|
||||
* 审批任务
|
||||
*
|
||||
* @param task 请求实体参数
|
||||
*/
|
||||
void complete(WfTaskBo task);
|
||||
|
||||
/**
|
||||
* 拒绝任务
|
||||
*
|
||||
* @param taskBo
|
||||
*/
|
||||
void taskReject(WfTaskBo taskBo);
|
||||
|
||||
|
||||
/**
|
||||
* 退回任务
|
||||
*
|
||||
* @param bo 请求实体参数
|
||||
*/
|
||||
void taskReturn(WfTaskBo bo);
|
||||
|
||||
/**
|
||||
* 获取所有可回退的节点
|
||||
*
|
||||
* @param bo
|
||||
* @return
|
||||
*/
|
||||
List<FlowElement> findReturnTaskList(WfTaskBo bo);
|
||||
|
||||
/**
|
||||
* 删除任务
|
||||
*
|
||||
* @param bo 请求实体参数
|
||||
*/
|
||||
void deleteTask(WfTaskBo bo);
|
||||
|
||||
/**
|
||||
* 认领/签收任务
|
||||
*
|
||||
* @param bo 请求实体参数
|
||||
*/
|
||||
void claim(WfTaskBo bo);
|
||||
|
||||
/**
|
||||
* 取消认领/签收任务
|
||||
*
|
||||
* @param bo 请求实体参数
|
||||
*/
|
||||
void unClaim(WfTaskBo bo);
|
||||
|
||||
/**
|
||||
* 委派任务
|
||||
*
|
||||
* @param bo 请求实体参数
|
||||
*/
|
||||
void delegateTask(WfTaskBo bo);
|
||||
|
||||
|
||||
/**
|
||||
* 转办任务
|
||||
*
|
||||
* @param bo 请求实体参数
|
||||
*/
|
||||
void transferTask(WfTaskBo bo);
|
||||
|
||||
/**
|
||||
* 取消申请
|
||||
* @param bo
|
||||
* @return
|
||||
*/
|
||||
void stopProcess(WfTaskBo bo);
|
||||
|
||||
/**
|
||||
* 撤回流程
|
||||
* @param bo
|
||||
* @return
|
||||
*/
|
||||
void revokeProcess(WfTaskBo bo);
|
||||
|
||||
/**
|
||||
* 获取流程过程图
|
||||
* @param processId
|
||||
* @return
|
||||
*/
|
||||
InputStream diagram(String processId);
|
||||
|
||||
/**
|
||||
* 获取流程变量
|
||||
* @param taskId 任务ID
|
||||
* @return 流程变量
|
||||
*/
|
||||
Map<String, Object> getProcessVariables(String taskId);
|
||||
|
||||
/**
|
||||
* 启动第一个任务
|
||||
* @param processInstance 流程实例
|
||||
* @param variables 流程参数
|
||||
*/
|
||||
void startFirstTask(ProcessInstance processInstance, Map<String, Object> variables);
|
||||
}
|
||||
@@ -0,0 +1,93 @@
|
||||
package com.klp.workflow.service.impl;
|
||||
|
||||
import cn.hutool.core.bean.BeanUtil;
|
||||
import cn.hutool.core.util.ObjectUtil;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.klp.common.core.domain.PageQuery;
|
||||
import com.klp.common.core.page.TableDataInfo;
|
||||
import com.klp.common.utils.StringUtils;
|
||||
import com.klp.workflow.domain.WfCategory;
|
||||
import com.klp.workflow.domain.vo.WfCategoryVo;
|
||||
import com.klp.workflow.mapper.WfCategoryMapper;
|
||||
import com.klp.workflow.service.IWfCategoryService;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* 流程分类Service业务层处理
|
||||
*
|
||||
* @author KonBAI
|
||||
* @date 2022-01-15
|
||||
*/
|
||||
@RequiredArgsConstructor
|
||||
@Service
|
||||
public class WfCategoryServiceImpl implements IWfCategoryService {
|
||||
|
||||
private final WfCategoryMapper baseMapper;
|
||||
|
||||
@Override
|
||||
public WfCategoryVo queryById(Long categoryId){
|
||||
return baseMapper.selectVoById(categoryId);
|
||||
}
|
||||
|
||||
@Override
|
||||
public TableDataInfo<WfCategoryVo> queryPageList(WfCategory category, PageQuery pageQuery) {
|
||||
LambdaQueryWrapper<WfCategory> lqw = buildQueryWrapper(category);
|
||||
Page<WfCategoryVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
|
||||
return TableDataInfo.build(result);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<WfCategoryVo> queryList(WfCategory category) {
|
||||
LambdaQueryWrapper<WfCategory> lqw = buildQueryWrapper(category);
|
||||
return baseMapper.selectVoList(lqw);
|
||||
}
|
||||
|
||||
private LambdaQueryWrapper<WfCategory> buildQueryWrapper(WfCategory category) {
|
||||
Map<String, Object> params = category.getParams();
|
||||
LambdaQueryWrapper<WfCategory> lqw = Wrappers.lambdaQuery();
|
||||
lqw.like(StringUtils.isNotBlank(category.getCategoryName()), WfCategory::getCategoryName, category.getCategoryName());
|
||||
lqw.eq(StringUtils.isNotBlank(category.getCode()), WfCategory::getCode, category.getCode());
|
||||
return lqw;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int insertCategory(WfCategory categoryBo) {
|
||||
WfCategory add = BeanUtil.toBean(categoryBo, WfCategory.class);
|
||||
return baseMapper.insert(add);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int updateCategory(WfCategory categoryBo) {
|
||||
WfCategory update = BeanUtil.toBean(categoryBo, WfCategory.class);
|
||||
return baseMapper.updateById(update);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
|
||||
if(isValid){
|
||||
//TODO 做一些业务上的校验,判断是否需要校验
|
||||
}
|
||||
return baseMapper.deleteBatchIds(ids);
|
||||
}
|
||||
|
||||
/**
|
||||
* 校验分类编码是否唯一
|
||||
*
|
||||
* @param category 流程分类
|
||||
* @return 结果
|
||||
*/
|
||||
@Override
|
||||
public boolean checkCategoryCodeUnique(WfCategory category) {
|
||||
boolean exist = baseMapper.exists(new LambdaQueryWrapper<WfCategory>()
|
||||
.eq(WfCategory::getCode, category.getCode())
|
||||
.ne(ObjectUtil.isNotNull(category.getCategoryId()), WfCategory::getCategoryId, category.getCategoryId()));
|
||||
return !exist;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,114 @@
|
||||
package com.klp.workflow.service.impl;
|
||||
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.klp.common.core.domain.PageQuery;
|
||||
import com.klp.common.core.page.TableDataInfo;
|
||||
import com.klp.common.helper.LoginHelper;
|
||||
import com.klp.common.utils.StringUtils;
|
||||
import com.klp.workflow.domain.WfCopy;
|
||||
import com.klp.workflow.domain.bo.WfCopyBo;
|
||||
import com.klp.workflow.domain.bo.WfTaskBo;
|
||||
import com.klp.workflow.domain.vo.WfCopyVo;
|
||||
import com.klp.workflow.mapper.WfCopyMapper;
|
||||
import com.klp.workflow.service.IWfCopyService;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.flowable.engine.HistoryService;
|
||||
import org.flowable.engine.history.HistoricProcessInstance;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* 流程抄送Service业务层处理
|
||||
*
|
||||
* @author KonBAI
|
||||
* @date 2022-05-19
|
||||
*/
|
||||
@RequiredArgsConstructor
|
||||
@Service
|
||||
public class WfCopyServiceImpl implements IWfCopyService {
|
||||
|
||||
private final WfCopyMapper baseMapper;
|
||||
|
||||
private final HistoryService historyService;
|
||||
|
||||
/**
|
||||
* 查询流程抄送
|
||||
*
|
||||
* @param copyId 流程抄送主键
|
||||
* @return 流程抄送
|
||||
*/
|
||||
@Override
|
||||
public WfCopyVo queryById(Long copyId){
|
||||
return baseMapper.selectVoById(copyId);
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询流程抄送列表
|
||||
*
|
||||
* @param bo 流程抄送
|
||||
* @return 流程抄送
|
||||
*/
|
||||
@Override
|
||||
public TableDataInfo<WfCopyVo> selectPageList(WfCopyBo bo, PageQuery pageQuery) {
|
||||
LambdaQueryWrapper<WfCopy> lqw = buildQueryWrapper(bo);
|
||||
lqw.orderByDesc(WfCopy::getCreateTime);
|
||||
Page<WfCopyVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
|
||||
return TableDataInfo.build(result);
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询流程抄送列表
|
||||
*
|
||||
* @param bo 流程抄送
|
||||
* @return 流程抄送
|
||||
*/
|
||||
@Override
|
||||
public List<WfCopyVo> selectList(WfCopyBo bo) {
|
||||
LambdaQueryWrapper<WfCopy> lqw = buildQueryWrapper(bo);
|
||||
return baseMapper.selectVoList(lqw);
|
||||
}
|
||||
|
||||
private LambdaQueryWrapper<WfCopy> buildQueryWrapper(WfCopyBo bo) {
|
||||
Map<String, Object> params = bo.getParams();
|
||||
LambdaQueryWrapper<WfCopy> lqw = Wrappers.lambdaQuery();
|
||||
lqw.eq(bo.getUserId() != null, WfCopy::getUserId, bo.getUserId());
|
||||
lqw.like(StringUtils.isNotBlank(bo.getProcessName()), WfCopy::getProcessName, bo.getProcessName());
|
||||
lqw.like(StringUtils.isNotBlank(bo.getOriginatorName()), WfCopy::getOriginatorName, bo.getOriginatorName());
|
||||
return lqw;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Boolean makeCopy(WfTaskBo taskBo) {
|
||||
if (StringUtils.isBlank(taskBo.getCopyUserIds())) {
|
||||
// 若抄送用户为空,则不需要处理,返回成功
|
||||
return true;
|
||||
}
|
||||
HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery()
|
||||
.processInstanceId(taskBo.getProcInsId()).singleResult();
|
||||
String[] ids = taskBo.getCopyUserIds().split(",");
|
||||
List<WfCopy> copyList = new ArrayList<>(ids.length);
|
||||
Long originatorId = LoginHelper.getUserId();
|
||||
String originatorName = LoginHelper.getNickName();
|
||||
String title = historicProcessInstance.getProcessDefinitionName() + "-" + taskBo.getTaskName();
|
||||
for (String id : ids) {
|
||||
Long userId = Long.valueOf(id);
|
||||
WfCopy copy = new WfCopy();
|
||||
copy.setTitle(title);
|
||||
copy.setProcessId(historicProcessInstance.getProcessDefinitionId());
|
||||
copy.setProcessName(historicProcessInstance.getProcessDefinitionName());
|
||||
copy.setDeploymentId(historicProcessInstance.getDeploymentId());
|
||||
copy.setInstanceId(taskBo.getProcInsId());
|
||||
copy.setTaskId(taskBo.getTaskId());
|
||||
copy.setUserId(userId);
|
||||
copy.setOriginatorId(originatorId);
|
||||
copy.setOriginatorName(originatorName);
|
||||
copyList.add(copy);
|
||||
}
|
||||
return baseMapper.insertBatch(copyList);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,134 @@
|
||||
package com.klp.workflow.service.impl;
|
||||
|
||||
import cn.hutool.core.collection.CollUtil;
|
||||
import cn.hutool.core.convert.Convert;
|
||||
import cn.hutool.core.util.ObjectUtil;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
import com.klp.common.exception.ServiceException;
|
||||
import com.klp.common.utils.StringUtils;
|
||||
import com.klp.flowable.utils.ModelUtils;
|
||||
import com.klp.workflow.domain.WfDeployForm;
|
||||
import com.klp.workflow.domain.WfForm;
|
||||
import com.klp.workflow.domain.vo.WfFormVo;
|
||||
import com.klp.workflow.mapper.WfDeployFormMapper;
|
||||
import com.klp.workflow.mapper.WfFormMapper;
|
||||
import com.klp.workflow.service.IWfDeployFormService;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.flowable.bpmn.model.BpmnModel;
|
||||
import org.flowable.bpmn.model.FlowNode;
|
||||
import org.flowable.bpmn.model.StartEvent;
|
||||
import org.flowable.bpmn.model.UserTask;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 流程实例关联表单Service业务层处理
|
||||
*
|
||||
* @author KonBAI
|
||||
* @createTime 2022/3/7 22:07
|
||||
*/
|
||||
@RequiredArgsConstructor
|
||||
@Service
|
||||
public class WfDeployFormServiceImpl implements IWfDeployFormService {
|
||||
|
||||
private final WfDeployFormMapper baseMapper;
|
||||
|
||||
private final WfFormMapper formMapper;
|
||||
|
||||
/**
|
||||
* 新增流程实例关联表单
|
||||
*
|
||||
* @param deployForm 流程实例关联表单
|
||||
* @return 结果
|
||||
*/
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public int insertWfDeployForm(WfDeployForm deployForm) {
|
||||
// 删除部署流程和表单的关联关系
|
||||
baseMapper.delete(new LambdaQueryWrapper<WfDeployForm>().eq(WfDeployForm::getDeployId, deployForm.getDeployId()));
|
||||
// 新增部署流程和表单关系
|
||||
return baseMapper.insert(deployForm);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public boolean saveInternalDeployForm(String deployId, BpmnModel bpmnModel) {
|
||||
List<WfDeployForm> deployFormList = new ArrayList<>();
|
||||
// 获取开始节点
|
||||
StartEvent startEvent = ModelUtils.getStartEvent(bpmnModel);
|
||||
if (ObjectUtil.isNull(startEvent)) {
|
||||
throw new RuntimeException("开始节点不存在,请检查流程设计是否有误!");
|
||||
}
|
||||
// 保存开始节点表单信息
|
||||
WfDeployForm startDeployForm = buildDeployForm(deployId, startEvent);
|
||||
if (ObjectUtil.isNotNull(startDeployForm)) {
|
||||
deployFormList.add(startDeployForm);
|
||||
}
|
||||
// 保存用户节点表单信息
|
||||
Collection<UserTask> userTasks = ModelUtils.getAllUserTaskEvent(bpmnModel);
|
||||
if (CollUtil.isNotEmpty(userTasks)) {
|
||||
for (UserTask userTask : userTasks) {
|
||||
WfDeployForm userTaskDeployForm = buildDeployForm(deployId, userTask);
|
||||
if (ObjectUtil.isNotNull(userTaskDeployForm)) {
|
||||
deployFormList.add(userTaskDeployForm);
|
||||
}
|
||||
}
|
||||
}
|
||||
// 批量新增部署流程和表单关联信息
|
||||
return baseMapper.insertBatch(deployFormList);
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询流程挂着的表单
|
||||
*
|
||||
* @param deployId
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public WfFormVo selectDeployFormByDeployId(String deployId) {
|
||||
QueryWrapper<WfForm> wrapper = Wrappers.query();
|
||||
wrapper.eq("t2.deploy_id", deployId);
|
||||
List<WfFormVo> list = formMapper.selectFormVoList(wrapper);
|
||||
if (ObjectUtil.isNotEmpty(list)) {
|
||||
if (list.size() != 1) {
|
||||
throw new ServiceException("表单信息查询错误");
|
||||
} else {
|
||||
return list.get(0);
|
||||
}
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 构建部署表单关联信息对象
|
||||
* @param deployId 部署ID
|
||||
* @param node 节点信息
|
||||
* @return 部署表单关联对象。若无表单信息(formKey),则返回null
|
||||
*/
|
||||
private WfDeployForm buildDeployForm(String deployId, FlowNode node) {
|
||||
String formKey = ModelUtils.getFormKey(node);
|
||||
if (StringUtils.isEmpty(formKey)) {
|
||||
return null;
|
||||
}
|
||||
Long formId = Convert.toLong(StringUtils.substringAfter(formKey, "key_"));
|
||||
WfForm wfForm = formMapper.selectById(formId);
|
||||
if (ObjectUtil.isNull(wfForm)) {
|
||||
throw new ServiceException("表单信息查询错误");
|
||||
}
|
||||
WfDeployForm deployForm = new WfDeployForm();
|
||||
deployForm.setDeployId(deployId);
|
||||
deployForm.setFormKey(formKey);
|
||||
deployForm.setNodeKey(node.getId());
|
||||
deployForm.setFormName(wfForm.getFormName());
|
||||
deployForm.setNodeName(node.getName());
|
||||
deployForm.setContent(wfForm.getContent());
|
||||
return deployForm;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,146 @@
|
||||
package com.klp.workflow.service.impl;
|
||||
|
||||
import cn.hutool.core.io.IORuntimeException;
|
||||
import cn.hutool.core.io.IoUtil;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.klp.common.core.domain.PageQuery;
|
||||
import com.klp.common.core.page.TableDataInfo;
|
||||
import com.klp.flowable.core.domain.ProcessQuery;
|
||||
import com.klp.flowable.utils.ProcessUtils;
|
||||
import com.klp.workflow.domain.WfDeployForm;
|
||||
import com.klp.workflow.domain.vo.WfDeployVo;
|
||||
import com.klp.workflow.mapper.WfDeployFormMapper;
|
||||
import com.klp.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 org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
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;
|
||||
private final WfDeployFormMapper deployFormMapper;
|
||||
|
||||
@Override
|
||||
public TableDataInfo<WfDeployVo> queryPageList(ProcessQuery processQuery, PageQuery pageQuery) {
|
||||
// 流程定义列表数据查询
|
||||
ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery()
|
||||
.latestVersion()
|
||||
.orderByProcessDefinitionKey()
|
||||
.asc();
|
||||
// 构建搜索条件
|
||||
ProcessUtils.buildProcessSearch(processDefinitionQuery, processQuery);
|
||||
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文件异常");
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void deleteByIds(List<String> deployIds) {
|
||||
for (String deployId : deployIds) {
|
||||
repositoryService.deleteDeployment(deployId, true);
|
||||
deployFormMapper.delete(new LambdaQueryWrapper<WfDeployForm>().eq(WfDeployForm::getDeployId, deployId));
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user