实现我的流程的后端 API 接口

This commit is contained in:
YunaiV 2022-01-07 23:34:12 +08:00
parent 1031b78f64
commit 55a6ec78e4
10 changed files with 178 additions and 26 deletions

View File

@ -1,4 +1,4 @@
### 请求 /login 接口 => 成功 ### 请求 /bpm/process-instance/create 接口 => 成功
POST {{baseUrl}}/bpm/process-instance/create POST {{baseUrl}}/bpm/process-instance/create
Content-Type: application/json Content-Type: application/json
tenant-id: 1 tenant-id: 1
@ -11,3 +11,8 @@ Authorization: Bearer {{token}}
"b": "2" "b": "2"
} }
} }
### 请求 /bpm/process-instance/my-page 接口 => 成功
GET {{baseUrl}}/bpm/process-instance/my-page
tenant-id: 1
Authorization: Bearer {{token}}

View File

@ -1,15 +1,15 @@
package cn.iocoder.yudao.adminserver.modules.bpm.controller.task; package cn.iocoder.yudao.adminserver.modules.bpm.controller.task;
import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.instance.BpmProcessInstanceCreateReqVO; import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.instance.BpmProcessInstanceCreateReqVO;
import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.instance.BpmProcessInstanceMyPageReqVO;
import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.instance.BpmProcessInstancePageItemRespVO;
import cn.iocoder.yudao.adminserver.modules.bpm.service.task.BpmProcessInstanceService; import cn.iocoder.yudao.adminserver.modules.bpm.service.task.BpmProcessInstanceService;
import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.validation.Valid; import javax.validation.Valid;
@ -26,11 +26,19 @@ public class BpmProcessInstanceController {
@Resource @Resource
private BpmProcessInstanceService processInstanceService; private BpmProcessInstanceService processInstanceService;
// TODO 芋艿权限
@PostMapping("/create") @PostMapping("/create")
@ApiOperation("新建流程实例") @ApiOperation("新建流程实例")
public CommonResult<String> createProcessInstance(@Valid @RequestBody BpmProcessInstanceCreateReqVO createReqVO) { public CommonResult<String> createProcessInstance(@Valid @RequestBody BpmProcessInstanceCreateReqVO createReqVO) {
return success(processInstanceService.createProcessInstance(getLoginUserId(), createReqVO)); return success(processInstanceService.createProcessInstance(getLoginUserId(), createReqVO));
// processInstanceService.getMyProcessInstancePage(getLoginUserId()); }
@GetMapping("/my-page")
@ApiOperation(value = "获得我的实例分页列表", notes = "在【我的流程】菜单中,进行调用")
public CommonResult<PageResult<BpmProcessInstancePageItemRespVO>> getMyProcessInstancePage(
@Valid BpmProcessInstanceMyPageReqVO pageReqVO) {
return success(processInstanceService.getMyProcessInstancePage(getLoginUserId(), pageReqVO));
} }
} }

View File

@ -9,8 +9,6 @@ import java.util.Map;
@ApiModel("流程实例的创建 Request VO") @ApiModel("流程实例的创建 Request VO")
@Data @Data
//@EqualsAndHashCode(callSuper = true)
//@ToString(callSuper = true)
public class BpmProcessInstanceCreateReqVO { public class BpmProcessInstanceCreateReqVO {
@ApiModelProperty(value = "流程定义的编号", required = true, example = "1024") @ApiModelProperty(value = "流程定义的编号", required = true, example = "1024")

View File

@ -1,6 +1,41 @@
package cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.instance; package cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.instance;
import cn.iocoder.yudao.framework.common.pojo.PageParam; import cn.iocoder.yudao.framework.common.pojo.PageParam;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@ApiModel("流程实例的分页 Item Response VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class BpmProcessInstanceMyPageReqVO extends PageParam { public class BpmProcessInstanceMyPageReqVO extends PageParam {
@ApiModelProperty(value = "流程名称", example = "芋道")
private String name;
@ApiModelProperty(value = "流程定义的编号", example = "2048")
private String processDefinitionId;
@ApiModelProperty(value = "流程实例的状态", notes = "参见 bpm_process_instance_status", example = "1")
private Integer status;
@ApiModelProperty(value = "流程实例的结果", notes = "参见 bpm_process_instance_result", example = "2")
private Integer result;
@ApiModelProperty(value = "开始的创建时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private Date beginCreateTime;
@ApiModelProperty(value = "结束的创建时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private Date endCreateTime;
} }

View File

@ -0,0 +1,36 @@
package cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.instance;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
@ApiModel("流程实例的分页 Item Response VO")
@Data
public class BpmProcessInstancePageItemRespVO {
@ApiModelProperty(value = "流程实例的编号", required = true, example = "1024")
private String id;
@ApiModelProperty(value = "流程名称", required = true, example = "芋道")
private String name;
@ApiModelProperty(value = "流程定义的编号", required = true, example = "2048")
private String processDefinitionId;
@ApiModelProperty(value = "流程分类", required = true, notes = "参见 bpm_model_category 数据字典", example = "1")
private String category;
@ApiModelProperty(value = "流程实例的状态", required = true, notes = "参见 bpm_process_instance_status", example = "1")
private Integer status;
@ApiModelProperty(value = "流程实例的结果", required = true, notes = "参见 bpm_process_instance_result", example = "2")
private Integer result;
@ApiModelProperty(value = "创建时间", required = true)
private Date createTime;
// TODO 芋艿tasks
}

View File

@ -1,12 +1,17 @@
package cn.iocoder.yudao.adminserver.modules.bpm.convert.task; package cn.iocoder.yudao.adminserver.modules.bpm.convert.task;
import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.instance.BpmProcessInstancePageItemRespVO;
import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.task.BpmProcessInstanceExtDO; import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.task.BpmProcessInstanceExtDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.engine.runtime.ProcessInstance; import org.activiti.engine.runtime.ProcessInstance;
import org.mapstruct.Mapper; import org.mapstruct.Mapper;
import org.mapstruct.Mapping; import org.mapstruct.Mapping;
import org.mapstruct.Mappings; import org.mapstruct.Mappings;
import org.mapstruct.factory.Mappers; import org.mapstruct.factory.Mappers;
import java.util.List;
/** /**
* 流程实例 Convert * 流程实例 Convert
* *
@ -18,10 +23,20 @@ public interface BpmProcessInstanceConvert {
BpmProcessInstanceConvert INSTANCE = Mappers.getMapper(BpmProcessInstanceConvert.class); BpmProcessInstanceConvert INSTANCE = Mappers.getMapper(BpmProcessInstanceConvert.class);
@Mappings({ @Mappings({
@Mapping(source = "startUserId", target = "userId"), @Mapping(source = "instance.startUserId", target = "userId"),
@Mapping(source = "id", target = "processInstanceId"), @Mapping(source = "instance.id", target = "processInstanceId"),
@Mapping(source = "startTime", target = "createTime") @Mapping(source = "instance.startTime", target = "createTime"),
@Mapping(source = "definition.id", target = "processDefinitionId"),
@Mapping(source = "definition.name", target = "name"),
@Mapping(source = "definition.category", target = "category")
}) })
BpmProcessInstanceExtDO convert(ProcessInstance bean); BpmProcessInstanceExtDO convert(ProcessInstance instance, ProcessDefinition definition);
PageResult<BpmProcessInstancePageItemRespVO> convertPage(PageResult<BpmProcessInstanceExtDO> page);
List<BpmProcessInstancePageItemRespVO> convertList(List<BpmProcessInstanceExtDO> list);
@Mapping(source = "processInstanceId", target = "id")
BpmProcessInstancePageItemRespVO convert(BpmProcessInstanceExtDO bean);
} }

View File

@ -6,6 +6,7 @@ import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import lombok.*; import lombok.*;
import org.activiti.engine.history.HistoricProcessInstance; import org.activiti.engine.history.HistoricProcessInstance;
import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.engine.runtime.ProcessInstance; import org.activiti.engine.runtime.ProcessInstance;
/** /**
@ -18,9 +19,9 @@ import org.activiti.engine.runtime.ProcessInstance;
@Data @Data
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true) @ToString(callSuper = true)
@Builder //@Builder
@NoArgsConstructor //@NoArgsConstructor
@AllArgsConstructor //@AllArgsConstructor
public class BpmProcessInstanceExtDO extends BaseDO { public class BpmProcessInstanceExtDO extends BaseDO {
/** /**
@ -41,6 +42,19 @@ public class BpmProcessInstanceExtDO extends BaseDO {
* 关联 {@link ProcessInstance#getId()} * 关联 {@link ProcessInstance#getId()}
*/ */
private String processInstanceId; private String processInstanceId;
/**
* 流程定义的编号
*
* 关联 {@link ProcessDefinition#getId()}
*/
private String processDefinitionId;
/**
* 流程分类
*
* 冗余 {@link ProcessDefinition#getCategory()}
* 数据字典 bpm_model_category
*/
private String category;
/** /**
* 流程实例的状态 * 流程实例的状态
* *
@ -48,7 +62,7 @@ public class BpmProcessInstanceExtDO extends BaseDO {
*/ */
private Integer status; private Integer status;
/** /**
* 结果 * 流程实例的结果
* *
* 枚举 {@link BpmProcessInstanceResultEnum} * 枚举 {@link BpmProcessInstanceResultEnum}
*/ */

View File

@ -1,9 +1,24 @@
package cn.iocoder.yudao.adminserver.modules.bpm.dal.mysql.task; package cn.iocoder.yudao.adminserver.modules.bpm.dal.mysql.task;
import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.instance.BpmProcessInstanceMyPageReqVO;
import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.task.BpmProcessInstanceExtDO; import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.task.BpmProcessInstanceExtDO;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
@Mapper @Mapper
public interface BpmProcessInstanceExtMapper extends BaseMapper<BpmProcessInstanceExtDO> { public interface BpmProcessInstanceExtMapper extends BaseMapperX<BpmProcessInstanceExtDO> {
default PageResult<BpmProcessInstanceExtDO> selectPage(Long userId, BpmProcessInstanceMyPageReqVO reqVO) {
return selectPage(reqVO, new QueryWrapperX<BpmProcessInstanceExtDO>()
.eqIfPresent("user_id", userId)
.likeIfPresent("name", reqVO.getName())
.eqIfPresent("process_definition_id", reqVO.getProcessDefinitionId())
.eqIfPresent("status", reqVO.getStatus())
.eqIfPresent("result", reqVO.getResult())
.betweenIfPresent("create_time", reqVO.getBeginCreateTime(), reqVO.getEndCreateTime())
.orderByDesc("id"));
}
} }

View File

@ -1,7 +1,9 @@
package cn.iocoder.yudao.adminserver.modules.bpm.service.task; package cn.iocoder.yudao.adminserver.modules.bpm.service.task;
import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.instance.BpmProcessInstanceCreateReqVO; import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.instance.BpmProcessInstanceCreateReqVO;
import cn.iocoder.yudao.adminserver.modules.bpm.service.task.listener.BpmProcessInstanceEventListener; import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.instance.BpmProcessInstanceMyPageReqVO;
import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.instance.BpmProcessInstancePageItemRespVO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import javax.validation.Valid; import javax.validation.Valid;
@ -21,6 +23,14 @@ public interface BpmProcessInstanceService {
*/ */
String createProcessInstance(Long userId, @Valid BpmProcessInstanceCreateReqVO createReqVO); String createProcessInstance(Long userId, @Valid BpmProcessInstanceCreateReqVO createReqVO);
void getMyProcessInstancePage(Long userId); /**
* 获得流程实例的分页
*
* @param userId 用户编号
* @param pageReqVO 分页请求
* @return 流程实例的分页
*/
PageResult<BpmProcessInstancePageItemRespVO> getMyProcessInstancePage(Long userId,
@Valid BpmProcessInstanceMyPageReqVO pageReqVO);
} }

View File

@ -1,7 +1,10 @@
package cn.iocoder.yudao.adminserver.modules.bpm.service.task.impl; package cn.iocoder.yudao.adminserver.modules.bpm.service.task.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.lang.Assert; import cn.hutool.core.lang.Assert;
import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.instance.BpmProcessInstanceCreateReqVO; import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.instance.BpmProcessInstanceCreateReqVO;
import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.instance.BpmProcessInstanceMyPageReqVO;
import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.instance.BpmProcessInstancePageItemRespVO;
import cn.iocoder.yudao.adminserver.modules.bpm.convert.task.BpmProcessInstanceConvert; import cn.iocoder.yudao.adminserver.modules.bpm.convert.task.BpmProcessInstanceConvert;
import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.task.BpmProcessInstanceExtDO; import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.task.BpmProcessInstanceExtDO;
import cn.iocoder.yudao.adminserver.modules.bpm.dal.mysql.task.BpmProcessInstanceExtMapper; import cn.iocoder.yudao.adminserver.modules.bpm.dal.mysql.task.BpmProcessInstanceExtMapper;
@ -11,6 +14,7 @@ import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmProcessDef
import cn.iocoder.yudao.adminserver.modules.bpm.service.task.BpmProcessInstanceService; import cn.iocoder.yudao.adminserver.modules.bpm.service.task.BpmProcessInstanceService;
import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService; import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService;
import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.activiti.engine.HistoryService; import org.activiti.engine.HistoryService;
import org.activiti.engine.RuntimeService; import org.activiti.engine.RuntimeService;
@ -81,7 +85,7 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService
// 设置流程名字 // 设置流程名字
runtimeService.setProcessInstanceName(instance.getId(), definition.getName()); runtimeService.setProcessInstanceName(instance.getId(), definition.getName());
// 记录流程实例的拓展表 // 记录流程实例的拓展表
createProcessInstanceExt(instance, definition.getName()); createProcessInstanceExt(instance, definition);
// 添加初始的评论 TODO 芋艿在思考下 // 添加初始的评论 TODO 芋艿在思考下
Task task = taskService.createTaskQuery().processInstanceId(instance.getId()).singleResult(); Task task = taskService.createTaskQuery().processInstanceId(instance.getId()).singleResult();
@ -101,22 +105,34 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService
/** /**
* 创建流程实例的拓展 * 创建流程实例的拓展
* *
* @param definition 流程定义
* @param instance 流程实例 * @param instance 流程实例
* @param name 实例名此时instance name 为空所以需要传递该参数
*/ */
private void createProcessInstanceExt(ProcessInstance instance, String name) { private void createProcessInstanceExt(ProcessInstance instance, ProcessDefinition definition) {
BpmProcessInstanceExtDO instanceExt = BpmProcessInstanceConvert.INSTANCE.convert(instance); BpmProcessInstanceExtDO instanceExt = BpmProcessInstanceConvert.INSTANCE.convert(instance, definition);
instanceExt.setName(name);
instanceExt.setStatus(BpmProcessInstanceStatusEnum.RUNNING.getStatus()); instanceExt.setStatus(BpmProcessInstanceStatusEnum.RUNNING.getStatus());
instanceExt.setResult(BpmProcessInstanceResultEnum.PROCESS.getResult()); instanceExt.setResult(BpmProcessInstanceResultEnum.PROCESS.getResult());
processInstanceExtMapper.insert(instanceExt); processInstanceExtMapper.insert(instanceExt);
} }
@Override
public PageResult<BpmProcessInstancePageItemRespVO> getMyProcessInstancePage(Long userId,
BpmProcessInstanceMyPageReqVO pageReqVO) {
// 通过 BpmProcessInstanceExtDO 先查询到对应的分页
PageResult<BpmProcessInstanceExtDO> pageResult = processInstanceExtMapper.selectPage(userId, pageReqVO);
if (CollUtil.isEmpty(pageResult.getList())) {
return new PageResult<>(pageResult.getTotal());
}
// TODO 芋艿tasks
// 转换返回
return BpmProcessInstanceConvert.INSTANCE.convertPage(pageResult);
}
public void getMyProcessInstancePage(Long userId) { public void getMyProcessInstancePage(Long userId) {
// id title 所属流程 当前审批环节 状态 结果 创建时间 提交申请时间 标题状态ActBusiness // id title 所属流程 当前审批环节 状态 结果 创建时间 提交申请时间 标题状态ActBusiness
// id title 流程类别 流程版本 提交时间 流程状态 耗时 当前节点 办理 标题提交时间HistoricProcessInstanceQuery // id title 流程类别 流程版本 提交时间 流程状态 耗时 当前节点 办理 标题提交时间HistoricProcessInstanceQuery
// id title 所属流程 流程类别 创建时间 状态 当前审批环节 标题状态 // id name 所属流程 流程类别 创建时间 状态 当前审批环节 标题流程时间状态结果
runtimeService.createProcessInstanceQuery().list(); runtimeService.createProcessInstanceQuery().list();
HistoricProcessInstanceQuery historicProcessInstanceQuery = historyService.createHistoricProcessInstanceQuery() HistoricProcessInstanceQuery historicProcessInstanceQuery = historyService.createHistoricProcessInstanceQuery()