Commit 727faac8d829daab32e8955a39bf0689274023e8

Authored by YunaiV
1 parent 6d44bf0d

BPM:增加流程表达式的管理

Showing 11 changed files with 365 additions and 3 deletions
yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/ErrorCodeConstants.java
@@ -72,4 +72,7 @@ public interface ErrorCodeConstants { @@ -72,4 +72,7 @@ public interface ErrorCodeConstants {
72 ErrorCode PROCESS_LISTENER_CLASS_IMPLEMENTS_ERROR = new ErrorCode(1_009_013_002, "流程监听器类({})没有实现接口({})"); 72 ErrorCode PROCESS_LISTENER_CLASS_IMPLEMENTS_ERROR = new ErrorCode(1_009_013_002, "流程监听器类({})没有实现接口({})");
73 ErrorCode PROCESS_LISTENER_EXPRESSION_INVALID = new ErrorCode(1_009_013_003, "流程监听器表达式({})不合法"); 73 ErrorCode PROCESS_LISTENER_EXPRESSION_INVALID = new ErrorCode(1_009_013_003, "流程监听器表达式({})不合法");
74 74
  75 + // ========== BPM 流程表达式 1-009-014-000 ==========
  76 + ErrorCode PROCESS_EXPRESSION_NOT_EXISTS = new ErrorCode(1_009_014_000, "流程表达式不存在");
  77 +
75 } 78 }
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmProcessExpressionController.java 0 → 100644
  1 +package cn.iocoder.yudao.module.bpm.controller.admin.definition;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.CommonResult;
  4 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  5 +import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
  6 +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.expression.BpmProcessExpressionPageReqVO;
  7 +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.expression.BpmProcessExpressionRespVO;
  8 +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.expression.BpmProcessExpressionSaveReqVO;
  9 +import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessExpressionDO;
  10 +import cn.iocoder.yudao.module.bpm.service.definition.BpmProcessExpressionService;
  11 +import io.swagger.v3.oas.annotations.Operation;
  12 +import io.swagger.v3.oas.annotations.Parameter;
  13 +import io.swagger.v3.oas.annotations.tags.Tag;
  14 +import jakarta.annotation.Resource;
  15 +import jakarta.validation.Valid;
  16 +import org.springframework.security.access.prepost.PreAuthorize;
  17 +import org.springframework.validation.annotation.Validated;
  18 +import org.springframework.web.bind.annotation.*;
  19 +
  20 +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
  21 +
  22 +@Tag(name = "管理后台 - BPM 流程表达式")
  23 +@RestController
  24 +@RequestMapping("/bpm/process-expression")
  25 +@Validated
  26 +public class BpmProcessExpressionController {
  27 +
  28 + @Resource
  29 + private BpmProcessExpressionService processExpressionService;
  30 +
  31 + @PostMapping("/create")
  32 + @Operation(summary = "创建流程表达式")
  33 + @PreAuthorize("@ss.hasPermission('bpm:process-expression:create')")
  34 + public CommonResult<Long> createProcessExpression(@Valid @RequestBody BpmProcessExpressionSaveReqVO createReqVO) {
  35 + return success(processExpressionService.createProcessExpression(createReqVO));
  36 + }
  37 +
  38 + @PutMapping("/update")
  39 + @Operation(summary = "更新流程表达式")
  40 + @PreAuthorize("@ss.hasPermission('bpm:process-expression:update')")
  41 + public CommonResult<Boolean> updateProcessExpression(@Valid @RequestBody BpmProcessExpressionSaveReqVO updateReqVO) {
  42 + processExpressionService.updateProcessExpression(updateReqVO);
  43 + return success(true);
  44 + }
  45 +
  46 + @DeleteMapping("/delete")
  47 + @Operation(summary = "删除流程表达式")
  48 + @Parameter(name = "id", description = "编号", required = true)
  49 + @PreAuthorize("@ss.hasPermission('bpm:process-expression:delete')")
  50 + public CommonResult<Boolean> deleteProcessExpression(@RequestParam("id") Long id) {
  51 + processExpressionService.deleteProcessExpression(id);
  52 + return success(true);
  53 + }
  54 +
  55 + @GetMapping("/get")
  56 + @Operation(summary = "获得流程表达式")
  57 + @Parameter(name = "id", description = "编号", required = true, example = "1024")
  58 + @PreAuthorize("@ss.hasPermission('bpm:process-expression:query')")
  59 + public CommonResult<BpmProcessExpressionRespVO> getProcessExpression(@RequestParam("id") Long id) {
  60 + BpmProcessExpressionDO processExpression = processExpressionService.getProcessExpression(id);
  61 + return success(BeanUtils.toBean(processExpression, BpmProcessExpressionRespVO.class));
  62 + }
  63 +
  64 + @GetMapping("/page")
  65 + @Operation(summary = "获得流程表达式分页")
  66 + @PreAuthorize("@ss.hasPermission('bpm:process-expression:query')")
  67 + public CommonResult<PageResult<BpmProcessExpressionRespVO>> getProcessExpressionPage(
  68 + @Valid BpmProcessExpressionPageReqVO pageReqVO) {
  69 + PageResult<BpmProcessExpressionDO> pageResult = processExpressionService.getProcessExpressionPage(pageReqVO);
  70 + return success(BeanUtils.toBean(pageResult, BpmProcessExpressionRespVO.class));
  71 + }
  72 +
  73 +}
0 \ No newline at end of file 74 \ No newline at end of file
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/expression/BpmProcessExpressionPageReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.expression;
  2 +
  3 +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
  4 +import cn.iocoder.yudao.framework.common.pojo.PageParam;
  5 +import cn.iocoder.yudao.framework.common.validation.InEnum;
  6 +import io.swagger.v3.oas.annotations.media.Schema;
  7 +import lombok.Data;
  8 +import lombok.EqualsAndHashCode;
  9 +import lombok.ToString;
  10 +import org.springframework.format.annotation.DateTimeFormat;
  11 +
  12 +import java.time.LocalDateTime;
  13 +
  14 +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
  15 +
  16 +@Schema(description = "管理后台 - BPM 流程表达式分页 Request VO")
  17 +@Data
  18 +@EqualsAndHashCode(callSuper = true)
  19 +@ToString(callSuper = true)
  20 +public class BpmProcessExpressionPageReqVO extends PageParam {
  21 +
  22 + @Schema(description = "表达式名字", example = "李四")
  23 + private String name;
  24 +
  25 + @Schema(description = "表达式状态", example = "1")
  26 + @InEnum(CommonStatusEnum.class)
  27 + private Integer status;
  28 +
  29 + @Schema(description = "创建时间")
  30 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
  31 + private LocalDateTime[] createTime;
  32 +
  33 +}
0 \ No newline at end of file 34 \ No newline at end of file
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/expression/BpmProcessExpressionRespVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.expression;
  2 +
  3 +import com.alibaba.excel.annotation.ExcelProperty;
  4 +import io.swagger.v3.oas.annotations.media.Schema;
  5 +import lombok.Data;
  6 +
  7 +import java.time.LocalDateTime;
  8 +
  9 +@Schema(description = "管理后台 - BPM 流程表达式 Response VO")
  10 +@Data
  11 +public class BpmProcessExpressionRespVO {
  12 +
  13 + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "3870")
  14 + @ExcelProperty("编号")
  15 + private Long id;
  16 +
  17 + @Schema(description = "表达式名字", requiredMode = Schema.RequiredMode.REQUIRED, example = "李四")
  18 + @ExcelProperty("表达式名字")
  19 + private String name;
  20 +
  21 + @Schema(description = "表达式状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  22 + private Integer status;
  23 +
  24 + @Schema(description = "表达式", requiredMode = Schema.RequiredMode.REQUIRED)
  25 + private String expression;
  26 +
  27 + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
  28 + private LocalDateTime createTime;
  29 +
  30 +}
0 \ No newline at end of file 31 \ No newline at end of file
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/expression/BpmProcessExpressionSaveReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.expression;
  2 +
  3 +import io.swagger.v3.oas.annotations.media.Schema;
  4 +import jakarta.validation.constraints.NotEmpty;
  5 +import jakarta.validation.constraints.NotNull;
  6 +import lombok.Data;
  7 +
  8 +@Schema(description = "管理后台 - BPM 流程表达式新增/修改 Request VO")
  9 +@Data
  10 +public class BpmProcessExpressionSaveReqVO {
  11 +
  12 + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "3870")
  13 + private Long id;
  14 +
  15 + @Schema(description = "表达式名字", requiredMode = Schema.RequiredMode.REQUIRED, example = "李四")
  16 + @NotEmpty(message = "表达式名字不能为空")
  17 + private String name;
  18 +
  19 + @Schema(description = "表达式状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  20 + @NotNull(message = "表达式状态不能为空")
  21 + private Integer status;
  22 +
  23 + @Schema(description = "表达式", requiredMode = Schema.RequiredMode.REQUIRED)
  24 + @NotEmpty(message = "表达式不能为空")
  25 + private String expression;
  26 +
  27 +}
0 \ No newline at end of file 28 \ No newline at end of file
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/definition/BpmProcessExpressionDO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.bpm.dal.dataobject.definition;
  2 +
  3 +import lombok.*;
  4 +import java.util.*;
  5 +import java.time.LocalDateTime;
  6 +import java.time.LocalDateTime;
  7 +import com.baomidou.mybatisplus.annotation.*;
  8 +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
  9 +
  10 +/**
  11 + * BPM 流程表达式 DO
  12 + *
  13 + * @author 芋道源码
  14 + */
  15 +@TableName("bpm_process_expression")
  16 +@KeySequence("bpm_process_expression_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
  17 +@Data
  18 +@EqualsAndHashCode(callSuper = true)
  19 +@ToString(callSuper = true)
  20 +@Builder
  21 +@NoArgsConstructor
  22 +@AllArgsConstructor
  23 +public class BpmProcessExpressionDO extends BaseDO {
  24 +
  25 + /**
  26 + * 编号
  27 + */
  28 + @TableId
  29 + private Long id;
  30 + /**
  31 + * 表达式名字
  32 + */
  33 + private String name;
  34 + /**
  35 + * 表达式状态
  36 + *
  37 + * 枚举 {@link TODO common_status 对应的类}
  38 + */
  39 + private Integer status;
  40 + /**
  41 + * 表达式
  42 + */
  43 + private String expression;
  44 +
  45 +}
0 \ No newline at end of file 46 \ No newline at end of file
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/definition/BpmProcessExpressionMapper.java 0 → 100644
  1 +package cn.iocoder.yudao.module.bpm.dal.mysql.definition;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
  5 +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
  6 +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.expression.BpmProcessExpressionPageReqVO;
  7 +import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessExpressionDO;
  8 +import org.apache.ibatis.annotations.Mapper;
  9 +
  10 +/**
  11 + * BPM 流程表达式 Mapper
  12 + *
  13 + * @author 芋道源码
  14 + */
  15 +@Mapper
  16 +public interface BpmProcessExpressionMapper extends BaseMapperX<BpmProcessExpressionDO> {
  17 +
  18 + default PageResult<BpmProcessExpressionDO> selectPage(BpmProcessExpressionPageReqVO reqVO) {
  19 + return selectPage(reqVO, new LambdaQueryWrapperX<BpmProcessExpressionDO>()
  20 + .likeIfPresent(BpmProcessExpressionDO::getName, reqVO.getName())
  21 + .eqIfPresent(BpmProcessExpressionDO::getStatus, reqVO.getStatus())
  22 + .betweenIfPresent(BpmProcessExpressionDO::getCreateTime, reqVO.getCreateTime())
  23 + .orderByDesc(BpmProcessExpressionDO::getId));
  24 + }
  25 +
  26 +}
0 \ No newline at end of file 27 \ No newline at end of file
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/candidate/expression/BpmTaskAssignLeaderExpression.java
@@ -34,7 +34,7 @@ public class BpmTaskAssignLeaderExpression { @@ -34,7 +34,7 @@ public class BpmTaskAssignLeaderExpression {
34 @Resource 34 @Resource
35 private BpmProcessInstanceService processInstanceService; 35 private BpmProcessInstanceService processInstanceService;
36 36
37 - protected Set<Long> calculateUsers(DelegateExecution execution, int level) { 37 + public Set<Long> calculateUsers(DelegateExecution execution, int level) {
38 Assert.isTrue(level > 0, "level 必须大于 0"); 38 Assert.isTrue(level > 0, "level 必须大于 0");
39 // 获得发起人 39 // 获得发起人
40 ProcessInstance processInstance = processInstanceService.getProcessInstance(execution.getProcessInstanceId()); 40 ProcessInstance processInstance = processInstanceService.getProcessInstance(execution.getProcessInstanceId());
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/candidate/expression/BpmTaskAssignStartUserExpression.java
@@ -4,7 +4,6 @@ import cn.iocoder.yudao.framework.common.util.collection.SetUtils; @@ -4,7 +4,6 @@ import cn.iocoder.yudao.framework.common.util.collection.SetUtils;
4 import cn.iocoder.yudao.framework.common.util.number.NumberUtils; 4 import cn.iocoder.yudao.framework.common.util.number.NumberUtils;
5 import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService; 5 import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService;
6 import jakarta.annotation.Resource; 6 import jakarta.annotation.Resource;
7 -import org.flowable.engine.delegate.DelegateExecution;  
8 import org.flowable.engine.runtime.ProcessInstance; 7 import org.flowable.engine.runtime.ProcessInstance;
9 import org.springframework.stereotype.Component; 8 import org.springframework.stereotype.Component;
10 9
@@ -21,7 +20,7 @@ public class BpmTaskAssignStartUserExpression { @@ -21,7 +20,7 @@ public class BpmTaskAssignStartUserExpression {
21 @Resource 20 @Resource
22 private BpmProcessInstanceService processInstanceService; 21 private BpmProcessInstanceService processInstanceService;
23 22
24 - public Set<Long> calculateUsers(DelegateExecution execution) { 23 + public Set<Long> calculateUsers(org.flowable.engine.impl.persistence.entity.ExecutionEntityImpl execution) {
25 ProcessInstance processInstance = processInstanceService.getProcessInstance(execution.getProcessInstanceId()); 24 ProcessInstance processInstance = processInstanceService.getProcessInstance(execution.getProcessInstanceId());
26 Long startUserId = NumberUtils.parseLong(processInstance.getStartUserId()); 25 Long startUserId = NumberUtils.parseLong(processInstance.getStartUserId());
27 return SetUtils.asSet(startUserId); 26 return SetUtils.asSet(startUserId);
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmProcessExpressionService.java 0 → 100644
  1 +package cn.iocoder.yudao.module.bpm.service.definition;
  2 +
  3 +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.expression.BpmProcessExpressionPageReqVO;
  4 +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.expression.BpmProcessExpressionSaveReqVO;
  5 +import jakarta.validation.*;
  6 +import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessExpressionDO;
  7 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  8 +
  9 +/**
  10 + * BPM 流程表达式 Service 接口
  11 + *
  12 + * @author 芋道源码
  13 + */
  14 +public interface BpmProcessExpressionService {
  15 +
  16 + /**
  17 + * 创建流程表达式
  18 + *
  19 + * @param createReqVO 创建信息
  20 + * @return 编号
  21 + */
  22 + Long createProcessExpression(@Valid BpmProcessExpressionSaveReqVO createReqVO);
  23 +
  24 + /**
  25 + * 更新流程表达式
  26 + *
  27 + * @param updateReqVO 更新信息
  28 + */
  29 + void updateProcessExpression(@Valid BpmProcessExpressionSaveReqVO updateReqVO);
  30 +
  31 + /**
  32 + * 删除流程表达式
  33 + *
  34 + * @param id 编号
  35 + */
  36 + void deleteProcessExpression(Long id);
  37 +
  38 + /**
  39 + * 获得流程表达式
  40 + *
  41 + * @param id 编号
  42 + * @return 流程表达式
  43 + */
  44 + BpmProcessExpressionDO getProcessExpression(Long id);
  45 +
  46 + /**
  47 + * 获得流程表达式分页
  48 + *
  49 + * @param pageReqVO 分页查询
  50 + * @return 流程表达式分页
  51 + */
  52 + PageResult<BpmProcessExpressionDO> getProcessExpressionPage(BpmProcessExpressionPageReqVO pageReqVO);
  53 +
  54 +}
0 \ No newline at end of file 55 \ No newline at end of file
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmProcessExpressionServiceImpl.java 0 → 100644
  1 +package cn.iocoder.yudao.module.bpm.service.definition;
  2 +
  3 +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.expression.BpmProcessExpressionPageReqVO;
  4 +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.expression.BpmProcessExpressionSaveReqVO;
  5 +import org.springframework.stereotype.Service;
  6 +import jakarta.annotation.Resource;
  7 +import org.springframework.validation.annotation.Validated;
  8 +
  9 +import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessExpressionDO;
  10 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  11 +import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
  12 +
  13 +import cn.iocoder.yudao.module.bpm.dal.mysql.definition.BpmProcessExpressionMapper;
  14 +
  15 +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
  16 +import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.*;
  17 +
  18 +/**
  19 + * BPM 流程表达式 Service 实现类
  20 + *
  21 + * @author 芋道源码
  22 + */
  23 +@Service
  24 +@Validated
  25 +public class BpmProcessExpressionServiceImpl implements BpmProcessExpressionService {
  26 +
  27 + @Resource
  28 + private BpmProcessExpressionMapper processExpressionMapper;
  29 +
  30 + @Override
  31 + public Long createProcessExpression(BpmProcessExpressionSaveReqVO createReqVO) {
  32 + // 插入
  33 + BpmProcessExpressionDO processExpression = BeanUtils.toBean(createReqVO, BpmProcessExpressionDO.class);
  34 + processExpressionMapper.insert(processExpression);
  35 + // 返回
  36 + return processExpression.getId();
  37 + }
  38 +
  39 + @Override
  40 + public void updateProcessExpression(BpmProcessExpressionSaveReqVO updateReqVO) {
  41 + // 校验存在
  42 + validateProcessExpressionExists(updateReqVO.getId());
  43 + // 更新
  44 + BpmProcessExpressionDO updateObj = BeanUtils.toBean(updateReqVO, BpmProcessExpressionDO.class);
  45 + processExpressionMapper.updateById(updateObj);
  46 + }
  47 +
  48 + @Override
  49 + public void deleteProcessExpression(Long id) {
  50 + // 校验存在
  51 + validateProcessExpressionExists(id);
  52 + // 删除
  53 + processExpressionMapper.deleteById(id);
  54 + }
  55 +
  56 + private void validateProcessExpressionExists(Long id) {
  57 + if (processExpressionMapper.selectById(id) == null) {
  58 + throw exception(PROCESS_EXPRESSION_NOT_EXISTS);
  59 + }
  60 + }
  61 +
  62 + @Override
  63 + public BpmProcessExpressionDO getProcessExpression(Long id) {
  64 + return processExpressionMapper.selectById(id);
  65 + }
  66 +
  67 + @Override
  68 + public PageResult<BpmProcessExpressionDO> getProcessExpressionPage(BpmProcessExpressionPageReqVO pageReqVO) {
  69 + return processExpressionMapper.selectPage(pageReqVO);
  70 + }
  71 +
  72 +}
0 \ No newline at end of file 73 \ No newline at end of file