Commit e5444c5d47a2f71d6d0acfe998eaf763acbcaef8

Authored by YunaiV
1 parent c1041918

BPM:优化 convert 的逻辑

Showing 42 changed files with 267 additions and 439 deletions
yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/event/BpmProcessInstanceResultEvent.java renamed to yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/event/BpmProcessInstanceStatusEvent.java
... ... @@ -5,14 +5,13 @@ import lombok.Data;
5 5 import org.springframework.context.ApplicationEvent;
6 6  
7 7 /**
8   - * 流程实例的结果发生变化的 Event
9   - * 定位:由于额外增加了 {@link BpmProcessInstanceExtDO#getResult()} 结果,所以增加该事件
  8 + * 流程实例的状态(结果)发生变化的 Event
10 9 *
11 10 * @author 芋道源码
12 11 */
13 12 @SuppressWarnings("ALL")
14 13 @Data
15   -public class BpmProcessInstanceResultEvent extends ApplicationEvent {
  14 +public class BpmProcessInstanceStatusEvent extends ApplicationEvent {
16 15  
17 16 /**
18 17 * 流程实例的编号
... ... @@ -27,15 +26,15 @@ public class BpmProcessInstanceResultEvent extends ApplicationEvent {
27 26 /**
28 27 * 流程实例的结果
29 28 */
30   - @NotNull(message = "流程实例的结果不能为空")
31   - private Integer result;
  29 + @NotNull(message = "流程实例的状态不能为空")
  30 + private Integer status;
32 31 /**
33 32 * 流程实例对应的业务标识
34 33 * 例如说,请假
35 34 */
36 35 private String businessKey;
37 36  
38   - public BpmProcessInstanceResultEvent(Object source) {
  37 + public BpmProcessInstanceStatusEvent(Object source) {
39 38 super(source);
40 39 }
41 40  
... ...
yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/event/BpmProcessInstanceResultEventListener.java renamed to yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/event/BpmProcessInstanceStatusEventListener.java
... ... @@ -4,15 +4,15 @@ import cn.hutool.core.util.StrUtil;
4 4 import org.springframework.context.ApplicationListener;
5 5  
6 6 /**
7   - * {@link BpmProcessInstanceResultEvent} 的监听器
  7 + * {@link BpmProcessInstanceStatusEvent} 的监听器
8 8 *
9 9 * @author 芋道源码
10 10 */
11   -public abstract class BpmProcessInstanceResultEventListener
12   - implements ApplicationListener<BpmProcessInstanceResultEvent> {
  11 +public abstract class BpmProcessInstanceStatusEventListener
  12 + implements ApplicationListener<BpmProcessInstanceStatusEvent> {
13 13  
14 14 @Override
15   - public final void onApplicationEvent(BpmProcessInstanceResultEvent event) {
  15 + public final void onApplicationEvent(BpmProcessInstanceStatusEvent event) {
16 16 if (!StrUtil.equals(event.getProcessDefinitionKey(), getProcessDefinitionKey())) {
17 17 return;
18 18 }
... ... @@ -29,6 +29,6 @@ public abstract class BpmProcessInstanceResultEventListener
29 29 *
30 30 * @param event 事件
31 31 */
32   - protected abstract void onEvent(BpmProcessInstanceResultEvent event);
  32 + protected abstract void onEvent(BpmProcessInstanceStatusEvent event);
33 33  
34 34 }
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/BpmFormController.java
1 1 package cn.iocoder.yudao.module.bpm.controller.admin.definition;
2 2  
3   -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.form.*;
4   -import cn.iocoder.yudao.module.bpm.convert.definition.BpmFormConvert;
5   -import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO;
6   -import cn.iocoder.yudao.module.bpm.service.definition.BpmFormService;
7 3 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
8 4 import cn.iocoder.yudao.framework.common.pojo.PageResult;
9   -import io.swagger.v3.oas.annotations.tags.Tag;
10   -import io.swagger.v3.oas.annotations.Parameter;
  5 +import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
  6 +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.form.BpmFormPageReqVO;
  7 +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.form.BpmFormRespVO;
  8 +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.form.BpmFormSaveReqVO;
  9 +import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO;
  10 +import cn.iocoder.yudao.module.bpm.service.definition.BpmFormService;
11 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;
12 16 import org.springframework.security.access.prepost.PreAuthorize;
13 17 import org.springframework.validation.annotation.Validated;
14 18 import org.springframework.web.bind.annotation.*;
15 19  
16   -import jakarta.annotation.Resource;
17   -import jakarta.validation.Valid;
18 20 import java.util.List;
19 21  
20 22 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
  23 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
21 24  
22 25 @Tag(name = "管理后台 - 动态表单")
23 26 @RestController
... ... @@ -31,14 +34,14 @@ public class BpmFormController {
31 34 @PostMapping("/create")
32 35 @Operation(summary = "创建动态表单")
33 36 @PreAuthorize("@ss.hasPermission('bpm:form:create')")
34   - public CommonResult<Long> createForm(@Valid @RequestBody BpmFormCreateReqVO createReqVO) {
  37 + public CommonResult<Long> createForm(@Valid @RequestBody BpmFormSaveReqVO createReqVO) {
35 38 return success(formService.createForm(createReqVO));
36 39 }
37 40  
38 41 @PutMapping("/update")
39 42 @Operation(summary = "更新动态表单")
40 43 @PreAuthorize("@ss.hasPermission('bpm:form:update')")
41   - public CommonResult<Boolean> updateForm(@Valid @RequestBody BpmFormUpdateReqVO updateReqVO) {
  44 + public CommonResult<Boolean> updateForm(@Valid @RequestBody BpmFormSaveReqVO updateReqVO) {
42 45 formService.updateForm(updateReqVO);
43 46 return success(true);
44 47 }
... ... @@ -58,14 +61,15 @@ public class BpmFormController {
58 61 @PreAuthorize("@ss.hasPermission('bpm:form:query')")
59 62 public CommonResult<BpmFormRespVO> getForm(@RequestParam("id") Long id) {
60 63 BpmFormDO form = formService.getForm(id);
61   - return success(BpmFormConvert.INSTANCE.convert(form));
  64 + return success(BeanUtils.toBean(form, BpmFormRespVO.class));
62 65 }
63 66  
64   - @GetMapping("/list-all-simple")
  67 + @GetMapping({"/list-all-simple", "/simple-list"})
65 68 @Operation(summary = "获得动态表单的精简列表", description = "用于表单下拉框")
66   - public CommonResult<List<BpmFormSimpleRespVO>> getSimpleForms() {
  69 + public CommonResult<List<BpmFormRespVO>> getFormSimpleList() {
67 70 List<BpmFormDO> list = formService.getFormList();
68   - return success(BpmFormConvert.INSTANCE.convertList2(list));
  71 + return success(convertList(list, formDO -> // 只返回 id、name 字段
  72 + new BpmFormRespVO().setId(formDO.getId()).setName(formDO.getName())));
69 73 }
70 74  
71 75 @GetMapping("/page")
... ... @@ -73,7 +77,7 @@ public class BpmFormController {
73 77 @PreAuthorize("@ss.hasPermission('bpm:form:query')")
74 78 public CommonResult<PageResult<BpmFormRespVO>> getFormPage(@Valid BpmFormPageReqVO pageVO) {
75 79 PageResult<BpmFormDO> pageResult = formService.getFormPage(pageVO);
76   - return success(BpmFormConvert.INSTANCE.convertPage(pageResult));
  80 + return success(BeanUtils.toBean(pageResult, BpmFormRespVO.class));
77 81 }
78 82  
79 83 }
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/form/BpmFormBaseVO.java deleted
1   -package cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.form;
2   -import io.swagger.v3.oas.annotations.media.Schema;
3   -import lombok.*;
4   -import jakarta.validation.constraints.*;
5   -
6   -/**
7   -* 动态表单 Base VO,提供给添加、修改、详细的子 VO 使用
8   -* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成
9   -*/
10   -@Data
11   -public class BpmFormBaseVO {
12   -
13   - @Schema(description = "表单名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋道")
14   - @NotNull(message = "表单名称不能为空")
15   - private String name;
16   -
17   - @Schema(description = "表单状态-参见 CommonStatusEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
18   - @NotNull(message = "表单状态不能为空")
19   - private Integer status;
20   -
21   - @Schema(description = "备注", example = "我是备注")
22   - private String remark;
23   -
24   -}
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/form/BpmFormRespVO.java
1 1 package cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.form;
  2 +
2 3 import io.swagger.v3.oas.annotations.media.Schema;
  4 +import jakarta.validation.constraints.NotNull;
3 5 import lombok.Data;
4   -import lombok.EqualsAndHashCode;
5   -import lombok.ToString;
6 6  
7   -import jakarta.validation.constraints.NotNull;
8 7 import java.time.LocalDateTime;
9 8 import java.util.List;
10 9  
11 10 @Schema(description = "管理后台 - 动态表单 Response VO")
12 11 @Data
13   -@EqualsAndHashCode(callSuper = true)
14   -@ToString(callSuper = true)
15   -public class BpmFormRespVO extends BpmFormBaseVO {
  12 +public class BpmFormRespVO {
16 13  
17 14 @Schema(description = "表单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
18 15 private Long id;
19 16  
  17 + @Schema(description = "表单名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋道")
  18 + @NotNull(message = "表单名称不能为空")
  19 + private String name;
  20 +
20 21 @Schema(description = "表单的配置-JSON 字符串", requiredMode = Schema.RequiredMode.REQUIRED)
21 22 @NotNull(message = "表单的配置不能为空")
22 23 private String conf;
... ... @@ -25,6 +26,13 @@ public class BpmFormRespVO extends BpmFormBaseVO {
25 26 @NotNull(message = "表单项的数组不能为空")
26 27 private List<String> fields;
27 28  
  29 + @Schema(description = "表单状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  30 + @NotNull(message = "表单状态不能为空")
  31 + private Integer status; // 参见 CommonStatusEnum 枚举
  32 +
  33 + @Schema(description = "备注", example = "我是备注")
  34 + private String remark;
  35 +
28 36 @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
29 37 private LocalDateTime createTime;
30 38  
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/form/BpmFormCreateReqVO.java renamed to yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/form/BpmFormSaveReqVO.java
... ... @@ -5,11 +5,16 @@ import lombok.*;
5 5 import jakarta.validation.constraints.NotNull;
6 6 import java.util.List;
7 7  
8   -@Schema(description = "管理后台 - 动态表单创建 Request VO")
  8 +@Schema(description = "管理后台 - 动态表单创建/更新 Request VO")
9 9 @Data
10   -@EqualsAndHashCode(callSuper = true)
11   -@ToString(callSuper = true)
12   -public class BpmFormCreateReqVO extends BpmFormBaseVO {
  10 +public class BpmFormSaveReqVO {
  11 +
  12 + @Schema(description = "表单编号", example = "1024")
  13 + private Long id;
  14 +
  15 + @Schema(description = "表单名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋道")
  16 + @NotNull(message = "表单名称不能为空")
  17 + private String name;
13 18  
14 19 @Schema(description = "表单的配置-JSON 字符串", requiredMode = Schema.RequiredMode.REQUIRED)
15 20 @NotNull(message = "表单的配置不能为空")
... ... @@ -19,4 +24,11 @@ public class BpmFormCreateReqVO extends BpmFormBaseVO {
19 24 @NotNull(message = "表单项的数组不能为空")
20 25 private List<String> fields;
21 26  
  27 + @Schema(description = "表单状态-参见 CommonStatusEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  28 + @NotNull(message = "表单状态不能为空")
  29 + private Integer status;
  30 +
  31 + @Schema(description = "备注", example = "我是备注")
  32 + private String remark;
  33 +
22 34 }
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/form/BpmFormSimpleRespVO.java deleted
1   -package cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.form;
2   -
3   -import io.swagger.v3.oas.annotations.media.Schema;
4   -import lombok.Data;
5   -
6   -@Schema(description = "管理后台 - 流程表单精简 Response VO")
7   -@Data
8   -public class BpmFormSimpleRespVO {
9   -
10   - @Schema(description = "表单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
11   - private Long id;
12   -
13   - @Schema(description = "表单名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋道")
14   - private String name;
15   -
16   -}
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/form/BpmFormUpdateReqVO.java deleted
1   -package cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.form;
2   -import io.swagger.v3.oas.annotations.media.Schema;
3   -import lombok.*;
4   -import jakarta.validation.constraints.*;
5   -import java.util.List;
6   -
7   -@Schema(description = "管理后台 - 动态表单更新 Request VO")
8   -@Data
9   -@EqualsAndHashCode(callSuper = true)
10   -@ToString(callSuper = true)
11   -public class BpmFormUpdateReqVO extends BpmFormBaseVO {
12   -
13   - @Schema(description = "表单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
14   - @NotNull(message = "表单编号不能为空")
15   - private Long id;
16   -
17   - @Schema(description = "表单的配置-JSON 字符串", requiredMode = Schema.RequiredMode.REQUIRED)
18   - @NotNull(message = "表单的配置不能为空")
19   - private String conf;
20   -
21   - @Schema(description = "表单项的数组-JSON 字符串的数组", requiredMode = Schema.RequiredMode.REQUIRED)
22   - @NotNull(message = "表单项的数组不能为空")
23   - private List<String> fields;
24   -
25   -}
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/definition/vo/process/BpmProcessDefinitionRespVO.java
... ... @@ -50,7 +50,10 @@ public class BpmProcessDefinitionRespVO {
50 50 @Schema(description = "中断状态-参见 SuspensionState 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
51 51 private Integer suspensionState;
52 52  
53   - @Schema(description = "部署时间", requiredMode = Schema.RequiredMode.REQUIRED)
54   - private LocalDateTime deploymentTime; // 需要从对应的 Deployment 读取
  53 + @Schema(description = "部署时间")
  54 + private LocalDateTime deploymentTime; // 需要从对应的 Deployment 读取,非必须返回
  55 +
  56 + @Schema(description = "BPMN XML")
  57 + private String bpmnXml; // 需要从对应的 BpmnModel 读取,非必须返回
55 58  
56 59 }
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/BpmOALeaveController.java
1 1 package cn.iocoder.yudao.module.bpm.controller.admin.oa;
2 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;
3 6 import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.BpmOALeaveCreateReqVO;
4 7 import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.BpmOALeavePageReqVO;
5 8 import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.BpmOALeaveRespVO;
6   -import cn.iocoder.yudao.module.bpm.convert.oa.BpmOALeaveConvert;
7 9 import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOALeaveDO;
8   -import cn.iocoder.yudao.framework.common.pojo.CommonResult;
9   -import cn.iocoder.yudao.framework.common.pojo.PageResult;
10 10 import cn.iocoder.yudao.module.bpm.service.oa.BpmOALeaveService;
11   -import io.swagger.v3.oas.annotations.tags.Tag;
12   -import io.swagger.v3.oas.annotations.Parameter;
13 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;
14 16 import org.springframework.security.access.prepost.PreAuthorize;
15 17 import org.springframework.validation.annotation.Validated;
16 18 import org.springframework.web.bind.annotation.*;
17 19  
18   -import jakarta.annotation.Resource;
19   -import jakarta.validation.Valid;
20   -
21 20 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
22 21 import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
23 22  
... ... @@ -49,7 +48,7 @@ public class BpmOALeaveController {
49 48 @Parameter(name = "id", description = "编号", required = true, example = "1024")
50 49 public CommonResult<BpmOALeaveRespVO> getLeave(@RequestParam("id") Long id) {
51 50 BpmOALeaveDO leave = leaveService.getLeave(id);
52   - return success(BpmOALeaveConvert.INSTANCE.convert(leave));
  51 + return success(BeanUtils.toBean(leave, BpmOALeaveRespVO.class));
53 52 }
54 53  
55 54 @GetMapping("/page")
... ... @@ -57,7 +56,7 @@ public class BpmOALeaveController {
57 56 @Operation(summary = "获得请假申请分页")
58 57 public CommonResult<PageResult<BpmOALeaveRespVO>> getLeavePage(@Valid BpmOALeavePageReqVO pageVO) {
59 58 PageResult<BpmOALeaveDO> pageResult = leaveService.getLeavePage(getLoginUserId(), pageVO);
60   - return success(BpmOALeaveConvert.INSTANCE.convertPage(pageResult));
  59 + return success(BeanUtils.toBean(pageResult, BpmOALeaveRespVO.class));
61 60 }
62 61  
63 62 }
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/BpmOALeaveBaseVO.java deleted
1   -package cn.iocoder.yudao.module.bpm.controller.admin.oa.vo;
2   -
3   -import io.swagger.v3.oas.annotations.media.Schema;
4   -import lombok.*;
5   -import java.time.LocalDateTime;
6   -import jakarta.validation.constraints.*;
7   -import org.springframework.format.annotation.DateTimeFormat;
8   -
9   -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
10   -
11   -/**
12   -* 请假申请 Base VO,提供给添加、修改、详细的子 VO 使用
13   -* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成
14   -*/
15   -@Data
16   -public class BpmOALeaveBaseVO {
17   -
18   - @Schema(description = "请假的开始时间", requiredMode = Schema.RequiredMode.REQUIRED)
19   - @NotNull(message = "开始时间不能为空")
20   - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
21   - private LocalDateTime startTime;
22   - @Schema(description = "请假的结束时间", requiredMode = Schema.RequiredMode.REQUIRED)
23   - @NotNull(message = "结束时间不能为空")
24   - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
25   - private LocalDateTime endTime;
26   -
27   - @Schema(description = "请假类型-参见 bpm_oa_type 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
28   - private Integer type;
29   -
30   - @Schema(description = "原因", requiredMode = Schema.RequiredMode.REQUIRED, example = "阅读芋道源码")
31   - private String reason;
32   -
33   -}
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/BpmOALeaveCreateReqVO.java
1 1 package cn.iocoder.yudao.module.bpm.controller.admin.oa.vo;
  2 +
2 3 import io.swagger.v3.oas.annotations.media.Schema;
  4 +import jakarta.validation.constraints.AssertTrue;
  5 +import jakarta.validation.constraints.NotNull;
3 6 import lombok.Data;
4   -import lombok.EqualsAndHashCode;
5   -import lombok.ToString;
  7 +import org.springframework.format.annotation.DateTimeFormat;
6 8  
7   -import jakarta.validation.constraints.AssertTrue;
  9 +import java.time.LocalDateTime;
  10 +
  11 +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
8 12  
9 13 @Schema(description = "管理后台 - 请假申请创建 Request VO")
10 14 @Data
11   -@EqualsAndHashCode(callSuper = true)
12   -@ToString(callSuper = true)
13   -public class BpmOALeaveCreateReqVO extends BpmOALeaveBaseVO {
  15 +public class BpmOALeaveCreateReqVO {
  16 +
  17 + @Schema(description = "请假的开始时间", requiredMode = Schema.RequiredMode.REQUIRED)
  18 + @NotNull(message = "开始时间不能为空")
  19 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
  20 + private LocalDateTime startTime;
  21 +
  22 + @Schema(description = "请假的结束时间", requiredMode = Schema.RequiredMode.REQUIRED)
  23 + @NotNull(message = "结束时间不能为空")
  24 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
  25 + private LocalDateTime endTime;
  26 +
  27 + @Schema(description = "请假类型-参见 bpm_oa_type 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  28 + private Integer type;
  29 +
  30 + @Schema(description = "原因", requiredMode = Schema.RequiredMode.REQUIRED, example = "阅读芋道源码")
  31 + private String reason;
14 32  
15 33 @AssertTrue(message = "结束时间,需要在开始时间之后")
16 34 public boolean isEndTimeValid() {
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/BpmOALeavePageReqVO.java
1 1 package cn.iocoder.yudao.module.bpm.controller.admin.oa.vo;
2   -import io.swagger.v3.oas.annotations.media.Schema;
3   -import lombok.*;
4   -import java.time.LocalDateTime;
  2 +
5 3 import cn.iocoder.yudao.framework.common.pojo.PageParam;
  4 +import io.swagger.v3.oas.annotations.media.Schema;
  5 +import lombok.Data;
  6 +import lombok.EqualsAndHashCode;
  7 +import lombok.ToString;
6 8 import org.springframework.format.annotation.DateTimeFormat;
7 9  
  10 +import java.time.LocalDateTime;
  11 +
8 12 import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
9 13  
10 14 @Schema(description = "管理后台 - 请假申请分页 Request VO")
... ... @@ -13,13 +17,13 @@ import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_
13 17 @ToString(callSuper = true)
14 18 public class BpmOALeavePageReqVO extends PageParam {
15 19  
16   - @Schema(description = "状态-参见 bpm_process_instance_result 枚举", example = "1")
17   - private Integer result;
  20 + @Schema(description = "状态", example = "1")
  21 + private Integer status; // 参见 BpmProcessInstanceResultEnum 枚举
18 22  
19   - @Schema(description = "请假类型-参见 bpm_oa_type", example = "1")
  23 + @Schema(description = "请假类型,参见 bpm_oa_type", example = "1")
20 24 private Integer type;
21 25  
22   - @Schema(description = "原因-模糊匹配", example = "阅读芋道源码")
  26 + @Schema(description = "原因,模糊匹配", example = "阅读芋道源码")
23 27 private String reason;
24 28  
25 29 @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/BpmOALeaveRespVO.java
1 1 package cn.iocoder.yudao.module.bpm.controller.admin.oa.vo;
2 2  
3 3 import io.swagger.v3.oas.annotations.media.Schema;
4   -import lombok.*;
5   -import org.springframework.format.annotation.DateTimeFormat;
  4 +import lombok.Data;
6 5  
7   -import jakarta.validation.constraints.NotNull;
8 6 import java.time.LocalDateTime;
9 7  
10   -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
11   -
12 8 @Schema(description = "管理后台 - 请假申请 Response VO")
13 9 @Data
14   -@EqualsAndHashCode(callSuper = true)
15   -@ToString(callSuper = true)
16   -public class BpmOALeaveRespVO extends BpmOALeaveBaseVO {
  10 +public class BpmOALeaveRespVO {
17 11  
18 12 @Schema(description = "请假表单主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
19 13 private Long id;
20 14  
21   - @Schema(description = "状态-参见 bpm_process_instance_result 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
22   - private Integer result;
  15 + @Schema(description = "请假类型,参见 bpm_oa_type 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  16 + private Integer type;
  17 +
  18 + @Schema(description = "原因", requiredMode = Schema.RequiredMode.REQUIRED, example = "阅读芋道源码")
  19 + private String reason;
23 20  
24 21 @Schema(description = "申请时间", requiredMode = Schema.RequiredMode.REQUIRED)
25   - @NotNull(message = "申请时间不能为空")
26   - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
27 22 private LocalDateTime createTime;
28 23  
29   - @Schema(description = "流程id")
  24 + @Schema(description = "请假的开始时间", requiredMode = Schema.RequiredMode.REQUIRED)
  25 + private LocalDateTime startTime;
  26 +
  27 + @Schema(description = "请假的结束时间", requiredMode = Schema.RequiredMode.REQUIRED)
  28 + private LocalDateTime endTime;
  29 +
  30 + @Schema(description = "流程编号")
30 31 private String processInstanceId;
31 32  
  33 + @Schema(description = "审批结果", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  34 + private Integer status; // 参见 BpmProcessInstanceStatusEnum 枚举
  35 +
32 36 }
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmProcessInstanceController.java
... ... @@ -3,13 +3,19 @@ package cn.iocoder.yudao.module.bpm.controller.admin.task;
3 3 import cn.hutool.core.collection.CollUtil;
4 4 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
5 5 import cn.iocoder.yudao.framework.common.pojo.PageResult;
  6 +import cn.iocoder.yudao.framework.common.util.number.NumberUtils;
6 7 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.*;
7 8 import cn.iocoder.yudao.module.bpm.convert.task.BpmProcessInstanceConvert;
8 9 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmCategoryDO;
  10 +import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionInfoDO;
9 11 import cn.iocoder.yudao.module.bpm.service.definition.BpmCategoryService;
10 12 import cn.iocoder.yudao.module.bpm.service.definition.BpmProcessDefinitionService;
11 13 import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService;
12 14 import cn.iocoder.yudao.module.bpm.service.task.BpmTaskService;
  15 +import cn.iocoder.yudao.module.system.api.dept.DeptApi;
  16 +import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
  17 +import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
  18 +import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
13 19 import io.swagger.v3.oas.annotations.Operation;
14 20 import io.swagger.v3.oas.annotations.Parameter;
15 21 import io.swagger.v3.oas.annotations.tags.Tag;
... ... @@ -45,10 +51,15 @@ public class BpmProcessInstanceController {
45 51 @Resource
46 52 private BpmCategoryService categoryService;
47 53  
  54 + @Resource
  55 + private AdminUserApi adminUserApi;
  56 + @Resource
  57 + private DeptApi deptApi;
  58 +
48 59 @GetMapping("/my-page")
49 60 @Operation(summary = "获得我的实例分页列表", description = "在【我的流程】菜单中,进行调用")
50 61 @PreAuthorize("@ss.hasPermission('bpm:process-instance:query')")
51   - public CommonResult<PageResult<BpmProcessInstancePageItemRespVO>> getMyProcessInstancePage(
  62 + public CommonResult<PageResult<BpmProcessInstanceRespVO>> getMyProcessInstancePage(
52 63 @Valid BpmProcessInstanceMyPageReqVO pageReqVO) {
53 64 PageResult<HistoricProcessInstance> pageResult = processInstanceService.getMyProcessInstancePage(getLoginUserId(), pageReqVO);
54 65 if (CollUtil.isEmpty(pageResult.getList())) {
... ... @@ -62,7 +73,8 @@ public class BpmProcessInstanceController {
62 73 convertSet(pageResult.getList(), HistoricProcessInstance::getProcessDefinitionId));
63 74 Map<String, BpmCategoryDO> categoryMap = categoryService.getCategoryMap(
64 75 convertSet(processDefinitionMap.values(), ProcessDefinition::getCategory));
65   - return success(BpmProcessInstanceConvert.INSTANCE.convertPage(pageResult, processDefinitionMap, categoryMap, taskMap));
  76 + return success(BpmProcessInstanceConvert.INSTANCE.buildMyProcessInstancePage(pageResult,
  77 + processDefinitionMap, categoryMap, taskMap));
66 78 }
67 79  
68 80 @PostMapping("/create")
... ... @@ -77,7 +89,24 @@ public class BpmProcessInstanceController {
77 89 @Parameter(name = "id", description = "流程实例的编号", required = true)
78 90 @PreAuthorize("@ss.hasPermission('bpm:process-instance:query')")
79 91 public CommonResult<BpmProcessInstanceRespVO> getProcessInstance(@RequestParam("id") String id) {
80   - return success(processInstanceService.getProcessInstanceVO(id));
  92 + HistoricProcessInstance processInstance = processInstanceService.getHistoricProcessInstance(id);
  93 + if (processInstance == null) {
  94 + return success(null);
  95 + }
  96 +
  97 + // 拼接返回
  98 + ProcessDefinition processDefinition = processDefinitionService.getProcessDefinition(
  99 + processInstance.getProcessDefinitionId());
  100 + BpmProcessDefinitionInfoDO processDefinitionInfo = processDefinitionService.getProcessDefinitionInfo(
  101 + processInstance.getProcessDefinitionId());
  102 + String bpmnXml = processDefinitionService.getProcessDefinitionBpmnXML(processInstance.getProcessDefinitionId());
  103 + AdminUserRespDTO startUser = adminUserApi.getUser(NumberUtils.parseLong(processInstance.getStartUserId()));
  104 + DeptRespDTO dept = null;
  105 + if (startUser != null) {
  106 + dept = deptApi.getDept(startUser.getDeptId());
  107 + }
  108 + return success(BpmProcessInstanceConvert.INSTANCE.buildProcessInstance(processInstance,
  109 + processDefinition, processDefinitionInfo, bpmnXml, startUser, dept));
81 110 }
82 111  
83 112 @DeleteMapping("/cancel")
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/activity/BpmActivityRespVO.java
... ... @@ -19,7 +19,7 @@ public class BpmActivityRespVO {
19 19 @Schema(description = "流程活动的结束时间", requiredMode = Schema.RequiredMode.REQUIRED)
20 20 private LocalDateTime endTime;
21 21  
22   - @Schema(description = "关联的流程任务的编号-关联的流程任务,只有 UserTask 等类型才有", example = "2048")
23   - private String taskId;
  22 + @Schema(description = "关联的流程任务的编号", example = "2048")
  23 + private String taskId; // 关联的流程任务,只有 UserTask 等类型才有
24 24  
25 25 }
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessInstancePageItemRespVO.java deleted
1   -package cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance;
2   -
3   -import io.swagger.v3.oas.annotations.media.Schema;
4   -import lombok.Data;
5   -
6   -import java.time.LocalDateTime;
7   -import java.util.List;
8   -
9   -// TODO @芋艿:是不是要融合?
10   -@Schema(description = "管理后台 - 流程实例的分页 Item Response VO")
11   -@Data
12   -public class BpmProcessInstancePageItemRespVO {
13   -
14   - @Schema(description = "流程实例的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
15   - private String id;
16   -
17   - @Schema(description = "流程名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋道")
18   - private String name;
19   -
20   - @Schema(description = "流程定义的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048")
21   - private String processDefinitionId;
22   -
23   - @Schema(description = "流程分类", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
24   - private String category;
25   - @Schema(description = "流程分类名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "请假")
26   - private String categoryName;
27   -
28   - @Schema(description = "流程实例的状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
29   - private Integer status; // 参见 BpmProcessInstanceStatusEnum 枚举
30   -
31   - @Schema(description = "提交时间", requiredMode = Schema.RequiredMode.REQUIRED)
32   - private LocalDateTime startTime;
33   -
34   - @Schema(description = "结束时间", requiredMode = Schema.RequiredMode.REQUIRED)
35   - private LocalDateTime endTime;
36   -
37   - /**
38   - * 当前任务
39   - */
40   - private List<Task> tasks;
41   -
42   - @Schema(description = "流程任务")
43   - @Data
44   - public static class Task {
45   -
46   - @Schema(description = "流程任务的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
47   - private String id;
48   -
49   - @Schema(description = "任务名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋道")
50   - private String name;
51   -
52   - }
53   -
54   -}
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessInstanceRespVO.java
1 1 package cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance;
2 2  
  3 +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionRespVO;
3 4 import io.swagger.v3.oas.annotations.media.Schema;
4 5 import lombok.Data;
5 6  
... ... @@ -19,12 +20,14 @@ public class BpmProcessInstanceRespVO {
19 20  
20 21 @Schema(description = "流程分类", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
21 22 private String category;
  23 + @Schema(description = "流程分类名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "请假")
  24 + private String categoryName;
22 25  
23 26 @Schema(description = "流程实例的状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
24 27 private Integer status; // 参见 BpmProcessInstanceStatusEnum 枚举
25 28  
26 29 @Schema(description = "提交时间", requiredMode = Schema.RequiredMode.REQUIRED)
27   - private LocalDateTime createTime;
  30 + private LocalDateTime startTime;
28 31  
29 32 @Schema(description = "结束时间", requiredMode = Schema.RequiredMode.REQUIRED)
30 33 private LocalDateTime endTime;
... ... @@ -40,10 +43,17 @@ public class BpmProcessInstanceRespVO {
40 43 */
41 44 private User startUser;
42 45  
  46 + @Schema(description = "流程定义的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048")
  47 + private String processDefinitionId;
43 48 /**
44 49 * 流程定义
45 50 */
46   - private ProcessDefinition processDefinition;
  51 + private BpmProcessDefinitionRespVO processDefinition;
  52 +
  53 + /**
  54 + * 当前审批中的任务
  55 + */
  56 + private List<Task> tasks; // 仅在流程实例分页才返回
47 57  
48 58 @Schema(description = "用户信息")
49 59 @Data
... ... @@ -61,30 +71,15 @@ public class BpmProcessInstanceRespVO {
61 71  
62 72 }
63 73  
64   - @Schema(description = "流程定义信息")
  74 + @Schema(description = "流程任务")
65 75 @Data
66   - public static class ProcessDefinition {
  76 + public static class Task {
67 77  
68   - @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
  78 + @Schema(description = "流程任务的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
69 79 private String id;
70 80  
71   - @Schema(description = "表单类型-参见 bpm_model_form_type 数据字典", example = "1")
72   - private Integer formType;
73   - @Schema(description = "表单编号-在表单类型为 {@link BpmModelFormTypeEnum#CUSTOM} 时,必须非空", example = "1024")
74   - private Long formId;
75   - @Schema(description = "表单的配置-JSON 字符串。在表单类型为 {@link BpmModelFormTypeEnum#CUSTOM} 时,必须非空", requiredMode = Schema.RequiredMode.REQUIRED)
76   - private String formConf;
77   - @Schema(description = "表单项的数组-JSON 字符串的数组。在表单类型为 {@link BpmModelFormTypeEnum#CUSTOM} 时,必须非空", requiredMode = Schema.RequiredMode.REQUIRED)
78   - private List<String> formFields;
79   - @Schema(description = "自定义表单的提交路径,使用 Vue 的路由地址-在表单类型为 {@link BpmModelFormTypeEnum#CUSTOM} 时,必须非空",
80   - example = "/bpm/oa/leave/create")
81   - private String formCustomCreatePath;
82   - @Schema(description = "自定义表单的查看路径,使用 Vue 的路由地址-在表单类型为 {@link BpmModelFormTypeEnum#CUSTOM} 时,必须非空",
83   - example = "/bpm/oa/leave/view")
84   - private String formCustomViewPath;
85   -
86   - @Schema(description = "BPMN XML", requiredMode = Schema.RequiredMode.REQUIRED)
87   - private String bpmnXml;
  81 + @Schema(description = "任务名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋道")
  82 + private String name;
88 83  
89 84 }
90 85  
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/task/BpmTaskRespVO.java
... ... @@ -42,9 +42,6 @@ public class BpmTaskRespVO {
42 42 */
43 43 private BpmProcessInstanceRespVO.User assigneeUser;
44 44  
45   - // TODO @芋艿:这个 key 有点问题,应该是 taskDefinitionId
46   - @Schema(description = "任务定义的标识", requiredMode = Schema.RequiredMode.REQUIRED, example = "user-001")
47   - private String definitionKey;
48 45 @Schema(description = "任务定义的标识", requiredMode = Schema.RequiredMode.REQUIRED, example = "Activity_one")
49 46 private String taskDefinitionKey;
50 47  
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/convert/definition/BpmFormConvert.java deleted
1   -package cn.iocoder.yudao.module.bpm.convert.definition;
2   -
3   -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.form.BpmFormCreateReqVO;
4   -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.form.BpmFormRespVO;
5   -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.form.BpmFormSimpleRespVO;
6   -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.form.BpmFormUpdateReqVO;
7   -import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO;
8   -import cn.iocoder.yudao.framework.common.pojo.PageResult;
9   -import org.mapstruct.Mapper;
10   -import org.mapstruct.factory.Mappers;
11   -
12   -import java.util.List;
13   -
14   -/**
15   - * 动态表单 Convert
16   - *
17   - * @author 芋艿
18   - */
19   -@Mapper
20   -public interface BpmFormConvert {
21   -
22   - BpmFormConvert INSTANCE = Mappers.getMapper(BpmFormConvert.class);
23   -
24   - BpmFormDO convert(BpmFormCreateReqVO bean);
25   -
26   - BpmFormDO convert(BpmFormUpdateReqVO bean);
27   -
28   - BpmFormRespVO convert(BpmFormDO bean);
29   -
30   - List<BpmFormSimpleRespVO> convertList2(List<BpmFormDO> list);
31   -
32   - PageResult<BpmFormRespVO> convertPage(PageResult<BpmFormDO> page);
33   -
34   -}
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/convert/oa/BpmOALeaveConvert.java deleted
1   -package cn.iocoder.yudao.module.bpm.convert.oa;
2   -
3   -import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.BpmOALeaveCreateReqVO;
4   -import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.BpmOALeaveRespVO;
5   -import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOALeaveDO;
6   -import cn.iocoder.yudao.framework.common.pojo.PageResult;
7   -import org.mapstruct.Mapper;
8   -import org.mapstruct.factory.Mappers;
9   -
10   -import java.util.List;
11   -
12   -/**
13   - * 请假申请 Convert
14   - *
15   - * @author 芋艿
16   - */
17   -@Mapper
18   -public interface BpmOALeaveConvert {
19   -
20   - BpmOALeaveConvert INSTANCE = Mappers.getMapper(BpmOALeaveConvert.class);
21   -
22   - BpmOALeaveDO convert(BpmOALeaveCreateReqVO bean);
23   -
24   - BpmOALeaveRespVO convert(BpmOALeaveDO bean);
25   -
26   - List<BpmOALeaveRespVO> convertList(List<BpmOALeaveDO> list);
27   -
28   - PageResult<BpmOALeaveRespVO> convertPage(PageResult<BpmOALeaveDO> page);
29   -
30   -}
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmProcessInstanceConvert.java
... ... @@ -4,12 +4,12 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 4 import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
5 5 import cn.iocoder.yudao.framework.common.util.number.NumberUtils;
6 6 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
7   -import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.FlowableUtils;
8   -import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstancePageItemRespVO;
  7 +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionRespVO;
9 8 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceRespVO;
10 9 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmCategoryDO;
11 10 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionInfoDO;
12   -import cn.iocoder.yudao.module.bpm.event.BpmProcessInstanceResultEvent;
  11 +import cn.iocoder.yudao.module.bpm.event.BpmProcessInstanceStatusEvent;
  12 +import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.FlowableUtils;
13 13 import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenProcessInstanceApproveReqDTO;
14 14 import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenProcessInstanceRejectReqDTO;
15 15 import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
... ... @@ -18,6 +18,7 @@ import org.flowable.engine.history.HistoricProcessInstance;
18 18 import org.flowable.engine.repository.ProcessDefinition;
19 19 import org.flowable.engine.runtime.ProcessInstance;
20 20 import org.flowable.task.api.Task;
  21 +import org.mapstruct.Mapper;
21 22 import org.mapstruct.Mapping;
22 23 import org.mapstruct.MappingTarget;
23 24 import org.mapstruct.factory.Mappers;
... ... @@ -30,39 +31,43 @@ import java.util.Map;
30 31 *
31 32 * @author 芋道源码
32 33 */
  34 +@Mapper
33 35 public interface BpmProcessInstanceConvert {
34 36  
35 37 BpmProcessInstanceConvert INSTANCE = Mappers.getMapper(BpmProcessInstanceConvert.class);
36 38  
37   - default PageResult<BpmProcessInstancePageItemRespVO> convertPage(PageResult<HistoricProcessInstance> pageResult,
38   - Map<String, ProcessDefinition> processDefinitionMap,
39   - Map<String, BpmCategoryDO> categoryMap,
40   - Map<String, List<Task>> taskMap) {
41   - PageResult<BpmProcessInstancePageItemRespVO> vpPageResult = BeanUtils.toBean(pageResult, BpmProcessInstancePageItemRespVO.class);
  39 + default PageResult<BpmProcessInstanceRespVO> buildMyProcessInstancePage(PageResult<HistoricProcessInstance> pageResult,
  40 + Map<String, ProcessDefinition> processDefinitionMap,
  41 + Map<String, BpmCategoryDO> categoryMap,
  42 + Map<String, List<Task>> taskMap) {
  43 + PageResult<BpmProcessInstanceRespVO> vpPageResult = BeanUtils.toBean(pageResult, BpmProcessInstanceRespVO.class);
42 44 for (int i = 0; i < pageResult.getList().size(); i++) {
43   - BpmProcessInstancePageItemRespVO respVO = vpPageResult.getList().get(i);
  45 + BpmProcessInstanceRespVO respVO = vpPageResult.getList().get(i);
44 46 respVO.setStatus(FlowableUtils.getProcessInstanceStatus(pageResult.getList().get(i)));
45 47 MapUtils.findAndThen(processDefinitionMap, respVO.getProcessDefinitionId(),
46 48 processDefinition -> respVO.setCategory(processDefinition.getCategory()));
47 49 MapUtils.findAndThen(categoryMap, respVO.getCategory(), category -> respVO.setCategoryName(category.getName()));
48   - respVO.setTasks(BeanUtils.toBean(taskMap.get(respVO.getId()), BpmProcessInstancePageItemRespVO.Task.class));
  50 + respVO.setTasks(BeanUtils.toBean(taskMap.get(respVO.getId()), BpmProcessInstanceRespVO.Task.class));
49 51 }
50 52 return vpPageResult;
51 53 }
52 54  
53   - default BpmProcessInstanceRespVO convert2(HistoricProcessInstance processInstance,
54   - ProcessDefinition processDefinition, BpmProcessDefinitionInfoDO processDefinitionExt,
55   - String bpmnXml, AdminUserRespDTO startUser, DeptRespDTO dept) {
56   - BpmProcessInstanceRespVO respVO = convert2(processInstance);
  55 + default BpmProcessInstanceRespVO buildProcessInstance(HistoricProcessInstance processInstance,
  56 + ProcessDefinition processDefinition,
  57 + BpmProcessDefinitionInfoDO processDefinitionExt,
  58 + String bpmnXml,
  59 + AdminUserRespDTO startUser,
  60 + DeptRespDTO dept) {
  61 + BpmProcessInstanceRespVO respVO = BeanUtils.toBean(processInstance, BpmProcessInstanceRespVO.class);
57 62 respVO.setStatus(FlowableUtils.getProcessInstanceStatus(processInstance));
58 63 respVO.setFormVariables(FlowableUtils.filterProcessInstanceFormVariable(processInstance.getProcessVariables()));
59 64 // definition
60   - respVO.setProcessDefinition(convert2(processDefinition));
  65 + respVO.setProcessDefinition(BeanUtils.toBean(processDefinition, BpmProcessDefinitionRespVO.class));
61 66 copyTo(processDefinitionExt, respVO.getProcessDefinition());
62 67 respVO.getProcessDefinition().setBpmnXml(bpmnXml);
63 68 // user
64 69 if (startUser != null) {
65   - respVO.setStartUser(convert2(startUser));
  70 + respVO.setStartUser(BeanUtils.toBean(startUser, BpmProcessInstanceRespVO.User.class));
66 71 if (dept != null) {
67 72 respVO.getStartUser().setDeptName(dept.getName());
68 73 }
... ... @@ -70,42 +75,27 @@ public interface BpmProcessInstanceConvert {
70 75 return respVO;
71 76 }
72 77  
73   - BpmProcessInstanceRespVO convert2(HistoricProcessInstance bean);
74   -
75   - BpmProcessInstanceRespVO.ProcessDefinition convert2(ProcessDefinition bean);
76   -
77 78 @Mapping(source = "from.id", target = "to.id", ignore = true)
78   - void copyTo(BpmProcessDefinitionInfoDO from, @MappingTarget BpmProcessInstanceRespVO.ProcessDefinition to);
79   -
80   - BpmProcessInstanceRespVO.User convert2(AdminUserRespDTO bean);
  79 + void copyTo(BpmProcessDefinitionInfoDO from, @MappingTarget BpmProcessDefinitionRespVO to);
81 80  
82   - default BpmProcessInstanceResultEvent convert(Object source, HistoricProcessInstance instance, Integer result) {
83   - BpmProcessInstanceResultEvent event = new BpmProcessInstanceResultEvent(source);
84   - event.setId(instance.getId());
85   - event.setProcessDefinitionKey(instance.getProcessDefinitionKey());
86   - event.setBusinessKey(instance.getBusinessKey());
87   - event.setResult(result);
88   - return event;
  81 + default BpmProcessInstanceStatusEvent buildProcessInstanceStatusEvent(Object source, HistoricProcessInstance instance, Integer status) {
  82 + return new BpmProcessInstanceStatusEvent(source).setId(instance.getId()).setStatus(status)
  83 + .setProcessDefinitionKey(instance.getProcessDefinitionKey()).setBusinessKey(instance.getBusinessKey());
89 84 }
90 85  
91   - // TODO @芋艿:需要改下 key!
92   - default BpmProcessInstanceResultEvent convert(Object source, ProcessInstance instance, Integer result) {
93   - BpmProcessInstanceResultEvent event = new BpmProcessInstanceResultEvent(source);
94   - event.setId(instance.getId());
95   - event.setProcessDefinitionKey(instance.getProcessDefinitionKey());
96   - event.setBusinessKey(instance.getBusinessKey());
97   - event.setResult(result);
98   - return event;
  86 + default BpmProcessInstanceStatusEvent buildProcessInstanceStatusEvent(Object source, ProcessInstance instance, Integer status) {;
  87 + return new BpmProcessInstanceStatusEvent(source).setId(instance.getId()).setStatus(status)
  88 + .setProcessDefinitionKey(instance.getProcessDefinitionKey()).setBusinessKey(instance.getBusinessKey());
99 89 }
100 90  
101   - default BpmMessageSendWhenProcessInstanceApproveReqDTO convert2ApprovedReq(ProcessInstance instance){
102   - return new BpmMessageSendWhenProcessInstanceApproveReqDTO()
  91 + default BpmMessageSendWhenProcessInstanceApproveReqDTO buildProcessInstanceApproveMessage(ProcessInstance instance) {
  92 + return new BpmMessageSendWhenProcessInstanceApproveReqDTO()
103 93 .setStartUserId(NumberUtils.parseLong(instance.getStartUserId()))
104 94 .setProcessInstanceId(instance.getId())
105 95 .setProcessInstanceName(instance.getName());
106 96 }
107 97  
108   - default BpmMessageSendWhenProcessInstanceRejectReqDTO convert2RejectReq(ProcessInstance instance, String reason) {
  98 + default BpmMessageSendWhenProcessInstanceRejectReqDTO buildProcessInstanceRejectMessage(ProcessInstance instance, String reason) {
109 99 return new BpmMessageSendWhenProcessInstanceRejectReqDTO()
110 100 .setProcessInstanceName(instance.getName())
111 101 .setProcessInstanceId(instance.getId())
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmTaskConvert.java
... ... @@ -6,10 +6,10 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
6 6 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
7 7 import cn.iocoder.yudao.framework.common.util.number.NumberUtils;
8 8 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
9   -import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.FlowableUtils;
10 9 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceRespVO;
11 10 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskRespVO;
12 11 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO;
  12 +import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.FlowableUtils;
13 13 import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenTaskCreatedReqDTO;
14 14 import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
15 15 import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
... ... @@ -18,6 +18,7 @@ import org.flowable.engine.runtime.ProcessInstance;
18 18 import org.flowable.task.api.Task;
19 19 import org.flowable.task.api.history.HistoricTaskInstance;
20 20 import org.flowable.task.service.impl.persistence.entity.TaskEntityImpl;
  21 +import org.mapstruct.Mapper;
21 22 import org.mapstruct.factory.Mappers;
22 23  
23 24 import java.util.Date;
... ... @@ -32,6 +33,7 @@ import static cn.iocoder.yudao.framework.common.util.collection.MapUtils.findAnd
32 33 *
33 34 * @author 芋道源码
34 35 */
  36 +@Mapper
35 37 public interface BpmTaskConvert {
36 38  
37 39 BpmTaskConvert INSTANCE = Mappers.getMapper(BpmTaskConvert.class);
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/oa/BpmOALeaveDO.java
... ... @@ -57,12 +57,12 @@ public class BpmOALeaveDO extends BaseDO {
57 57 */
58 58 private Long day;
59 59 /**
60   - * 请假的结果
  60 + * 审批结果
61 61 *
62 62 * 枚举 {@link BpmTaskStatustEnum}
63   - * 考虑到简单,所以直接复用了 BpmProcessInstanceResultEnum 枚举,也可以自己定义一个枚举哈
  63 + * 考虑到简单,所以直接复用了 BpmProcessInstanceStatusEnum 枚举,也可以自己定义一个枚举哈
64 64 */
65   - private Integer result;
  65 + private Integer status;
66 66  
67 67 /**
68 68 * 对应的流程编号
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/mysql/oa/BpmOALeaveMapper.java
... ... @@ -19,7 +19,7 @@ public interface BpmOALeaveMapper extends BaseMapperX&lt;BpmOALeaveDO&gt; {
19 19 default PageResult<BpmOALeaveDO> selectPage(Long userId, BpmOALeavePageReqVO reqVO) {
20 20 return selectPage(reqVO, new LambdaQueryWrapperX<BpmOALeaveDO>()
21 21 .eqIfPresent(BpmOALeaveDO::getUserId, userId)
22   - .eqIfPresent(BpmOALeaveDO::getResult, reqVO.getResult())
  22 + .eqIfPresent(BpmOALeaveDO::getStatus, reqVO.getStatus())
23 23 .eqIfPresent(BpmOALeaveDO::getType, reqVO.getType())
24 24 .likeIfPresent(BpmOALeaveDO::getReason, reqVO.getReason())
25 25 .betweenIfPresent(BpmOALeaveDO::getCreateTime, reqVO.getCreateTime())
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/flowable/core/event/BpmProcessInstanceResultEventPublisher.java
1 1 package cn.iocoder.yudao.module.bpm.framework.flowable.core.event;
2 2  
3   -import cn.iocoder.yudao.module.bpm.event.BpmProcessInstanceResultEvent;
  3 +import cn.iocoder.yudao.module.bpm.event.BpmProcessInstanceStatusEvent;
4 4 import lombok.AllArgsConstructor;
5 5 import org.springframework.context.ApplicationEventPublisher;
6 6 import org.springframework.validation.annotation.Validated;
... ... @@ -8,7 +8,7 @@ import org.springframework.validation.annotation.Validated;
8 8 import jakarta.validation.Valid;
9 9  
10 10 /**
11   - * {@link BpmProcessInstanceResultEvent} 的生产者
  11 + * {@link BpmProcessInstanceStatusEvent} 的生产者
12 12 *
13 13 * @author 芋道源码
14 14 */
... ... @@ -18,7 +18,7 @@ public class BpmProcessInstanceResultEventPublisher {
18 18  
19 19 private final ApplicationEventPublisher publisher;
20 20  
21   - public void sendProcessInstanceResultEvent(@Valid BpmProcessInstanceResultEvent event) {
  21 + public void sendProcessInstanceResultEvent(@Valid BpmProcessInstanceStatusEvent event) {
22 22 publisher.publishEvent(event);
23 23 }
24 24  
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmFormService.java
... ... @@ -2,9 +2,8 @@ package cn.iocoder.yudao.module.bpm.service.definition;
2 2  
3 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 4 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
5   -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.form.BpmFormCreateReqVO;
6 5 import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.form.BpmFormPageReqVO;
7   -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.form.BpmFormUpdateReqVO;
  6 +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.form.BpmFormSaveReqVO;
8 7 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO;
9 8 import jakarta.validation.Valid;
10 9  
... ... @@ -26,14 +25,14 @@ public interface BpmFormService {
26 25 * @param createReqVO 创建信息
27 26 * @return 编号
28 27 */
29   - Long createForm(@Valid BpmFormCreateReqVO createReqVO);
  28 + Long createForm(@Valid BpmFormSaveReqVO createReqVO);
30 29  
31 30 /**
32 31 * 更新动态表单
33 32 *
34 33 * @param updateReqVO 更新信息
35 34 */
36   - void updateForm(@Valid BpmFormUpdateReqVO updateReqVO);
  35 + void updateForm(@Valid BpmFormSaveReqVO updateReqVO);
37 36  
38 37 /**
39 38 * 删除动态表单
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmFormServiceImpl.java
... ... @@ -4,10 +4,9 @@ import cn.hutool.core.collection.CollUtil;
4 4 import cn.hutool.core.lang.Assert;
5 5 import cn.iocoder.yudao.framework.common.pojo.PageResult;
6 6 import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
7   -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.form.BpmFormCreateReqVO;
  7 +import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
8 8 import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.form.BpmFormPageReqVO;
9   -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.form.BpmFormUpdateReqVO;
10   -import cn.iocoder.yudao.module.bpm.convert.definition.BpmFormConvert;
  9 +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.form.BpmFormSaveReqVO;
11 10 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO;
12 11 import cn.iocoder.yudao.module.bpm.dal.mysql.definition.BpmFormMapper;
13 12 import cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants;
... ... @@ -33,22 +32,22 @@ public class BpmFormServiceImpl implements BpmFormService {
33 32 private BpmFormMapper formMapper;
34 33  
35 34 @Override
36   - public Long createForm(BpmFormCreateReqVO createReqVO) {
37   - this.checkFields(createReqVO.getFields());
  35 + public Long createForm(BpmFormSaveReqVO createReqVO) {
  36 + this.vadateFields(createReqVO.getFields());
38 37 // 插入
39   - BpmFormDO form = BpmFormConvert.INSTANCE.convert(createReqVO);
  38 + BpmFormDO form = BeanUtils.toBean(createReqVO, BpmFormDO.class);
40 39 formMapper.insert(form);
41 40 // 返回
42 41 return form.getId();
43 42 }
44 43  
45 44 @Override
46   - public void updateForm(BpmFormUpdateReqVO updateReqVO) {
47   - this.checkFields(updateReqVO.getFields());
  45 + public void updateForm(BpmFormSaveReqVO updateReqVO) {
  46 + vadateFields(updateReqVO.getFields());
48 47 // 校验存在
49   - this.validateFormExists(updateReqVO.getId());
  48 + validateFormExists(updateReqVO.getId());
50 49 // 更新
51   - BpmFormDO updateObj = BpmFormConvert.INSTANCE.convert(updateReqVO);
  50 + BpmFormDO updateObj = BeanUtils.toBean(updateReqVO, BpmFormDO.class);
52 51 formMapper.updateById(updateObj);
53 52 }
54 53  
... ... @@ -94,7 +93,7 @@ public class BpmFormServiceImpl implements BpmFormService {
94 93 *
95 94 * @param fields field 数组
96 95 */
97   - private void checkFields(List<String> fields) {
  96 + private void vadateFields(List<String> fields) {
98 97 if (true) { // TODO 芋艿:兼容 Vue3 工作流:因为采用了新的表单设计器,所以暂时不校验
99 98 return;
100 99 }
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/definition/BpmModelServiceImpl.java
... ... @@ -87,7 +87,7 @@ public class BpmModelServiceImpl implements BpmModelService {
87 87 @Override
88 88 @Transactional(rollbackFor = Exception.class)
89 89 public String createModel(@Valid BpmModelCreateReqVO createReqVO, String bpmnXml) {
90   - if (!ValidationUtils.isXmlNCName(createReqVO.getName())) {
  90 + if (!ValidationUtils.isXmlNCName(createReqVO.getKey())) {
91 91 throw exception(MODEL_KEY_VALID);
92 92 }
93 93 // 校验流程标识已经存在
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/BpmOALeaveService.java
... ... @@ -29,9 +29,9 @@ public interface BpmOALeaveService {
29 29 * 更新请假申请的状态
30 30 *
31 31 * @param id 编号
32   - * @param result 结果
  32 + * @param status 结果
33 33 */
34   - void updateLeaveResult(Long id, Integer result);
  34 + void updateLeaveStatus(Long id, Integer status);
35 35  
36 36 /**
37 37 * 获得请假申请
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/BpmOALeaveServiceImpl.java
... ... @@ -2,19 +2,19 @@ package cn.iocoder.yudao.module.bpm.service.oa;
2 2  
3 3 import cn.hutool.core.date.LocalDateTimeUtil;
4 4 import cn.iocoder.yudao.framework.common.pojo.PageResult;
  5 +import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
5 6 import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi;
6 7 import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO;
7 8 import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.BpmOALeaveCreateReqVO;
8 9 import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.BpmOALeavePageReqVO;
9   -import cn.iocoder.yudao.module.bpm.convert.oa.BpmOALeaveConvert;
10 10 import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOALeaveDO;
11 11 import cn.iocoder.yudao.module.bpm.dal.mysql.oa.BpmOALeaveMapper;
12 12 import cn.iocoder.yudao.module.bpm.enums.task.BpmTaskStatustEnum;
  13 +import jakarta.annotation.Resource;
13 14 import org.springframework.stereotype.Service;
14 15 import org.springframework.transaction.annotation.Transactional;
15 16 import org.springframework.validation.annotation.Validated;
16 17  
17   -import jakarta.annotation.Resource;
18 18 import java.util.HashMap;
19 19 import java.util.Map;
20 20  
... ... @@ -47,8 +47,8 @@ public class BpmOALeaveServiceImpl implements BpmOALeaveService {
47 47 public Long createLeave(Long userId, BpmOALeaveCreateReqVO createReqVO) {
48 48 // 插入 OA 请假单
49 49 long day = LocalDateTimeUtil.between(createReqVO.getStartTime(), createReqVO.getEndTime()).toDays();
50   - BpmOALeaveDO leave = BpmOALeaveConvert.INSTANCE.convert(createReqVO).setUserId(userId).setDay(day)
51   - .setResult(BpmTaskStatustEnum.RUNNING.getStatus());
  50 + BpmOALeaveDO leave = BeanUtils.toBean(createReqVO, BpmOALeaveDO.class)
  51 + .setUserId(userId).setDay(day).setStatus(BpmTaskStatustEnum.RUNNING.getStatus());
52 52 leaveMapper.insert(leave);
53 53  
54 54 // 发起 BPM 流程
... ... @@ -64,9 +64,9 @@ public class BpmOALeaveServiceImpl implements BpmOALeaveService {
64 64 }
65 65  
66 66 @Override
67   - public void updateLeaveResult(Long id, Integer result) {
  67 + public void updateLeaveStatus(Long id, Integer status) {
68 68 validateLeaveExists(id);
69   - leaveMapper.updateById(new BpmOALeaveDO().setId(id).setResult(result));
  69 + leaveMapper.updateById(new BpmOALeaveDO().setId(id).setStatus(status));
70 70 }
71 71  
72 72 private void validateLeaveExists(Long id) {
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/listener/BpmOALeaveResultListener.java renamed to yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/listener/BpmOALeaveStatusListener.java
1 1 package cn.iocoder.yudao.module.bpm.service.oa.listener;
2 2  
3   -import cn.iocoder.yudao.module.bpm.event.BpmProcessInstanceResultEvent;
4   -import cn.iocoder.yudao.module.bpm.event.BpmProcessInstanceResultEventListener;
  3 +import cn.iocoder.yudao.module.bpm.event.BpmProcessInstanceStatusEvent;
  4 +import cn.iocoder.yudao.module.bpm.event.BpmProcessInstanceStatusEventListener;
5 5 import cn.iocoder.yudao.module.bpm.service.oa.BpmOALeaveService;
6 6 import cn.iocoder.yudao.module.bpm.service.oa.BpmOALeaveServiceImpl;
7 7 import org.springframework.stereotype.Component;
... ... @@ -14,7 +14,7 @@ import jakarta.annotation.Resource;
14 14 * @author 芋道源码
15 15 */
16 16 @Component
17   -public class BpmOALeaveResultListener extends BpmProcessInstanceResultEventListener {
  17 +public class BpmOALeaveStatusListener extends BpmProcessInstanceStatusEventListener {
18 18  
19 19 @Resource
20 20 private BpmOALeaveService leaveService;
... ... @@ -25,8 +25,8 @@ public class BpmOALeaveResultListener extends BpmProcessInstanceResultEventListe
25 25 }
26 26  
27 27 @Override
28   - protected void onEvent(BpmProcessInstanceResultEvent event) {
29   - leaveService.updateLeaveResult(Long.parseLong(event.getBusinessKey()), event.getResult());
  28 + protected void onEvent(BpmProcessInstanceStatusEvent event) {
  29 + leaveService.updateLeaveStatus(Long.parseLong(event.getBusinessKey()), event.getStatus());
30 30 }
31 31  
32 32 }
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceService.java
... ... @@ -5,7 +5,6 @@ import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO;
5 5 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceCancelReqVO;
6 6 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceCreateReqVO;
7 7 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceMyPageReqVO;
8   -import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceRespVO;
9 8 import jakarta.validation.Valid;
10 9 import org.flowable.engine.delegate.event.FlowableCancelledEvent;
11 10 import org.flowable.engine.history.HistoricProcessInstance;
... ... @@ -116,14 +115,6 @@ public interface BpmProcessInstanceService {
116 115 String createProcessInstance(Long userId, @Valid BpmProcessInstanceCreateReqDTO createReqDTO);
117 116  
118 117 /**
119   - * 获得流程实例 VO 信息
120   - *
121   - * @param id 流程实例的编号
122   - * @return 流程实例
123   - */
124   - BpmProcessInstanceRespVO getProcessInstanceVO(String id);
125   -
126   - /**
127 118 * 取消流程实例
128 119 *
129 120 * @param userId 用户编号
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java
1   -package cn.iocoder.yudao.module.bpm.service.task; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.StrUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.date.DateUtils; import cn.iocoder.yudao.framework.common.util.number.NumberUtils; import cn.iocoder.yudao.framework.common.util.object.PageUtils; import cn.iocoder.yudao.module.bpm.framework.FlowableContextHolder; import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.FlowableUtils; import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO; import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceCancelReqVO; import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceCreateReqVO; import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceMyPageReqVO; import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceRespVO; import cn.iocoder.yudao.module.bpm.convert.task.BpmProcessInstanceConvert; import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionInfoDO; import cn.iocoder.yudao.module.bpm.enums.task.BpmDeleteReasonEnum; import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceStatusEnum; import cn.iocoder.yudao.module.bpm.framework.flowable.core.event.BpmProcessInstanceResultEventPublisher; import cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmConstants; import cn.iocoder.yudao.module.bpm.service.definition.BpmProcessDefinitionService; import cn.iocoder.yudao.module.bpm.service.message.BpmMessageService; import cn.iocoder.yudao.module.system.api.dept.DeptApi; import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO; import cn.iocoder.yudao.module.system.api.user.AdminUserApi; import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; import jakarta.annotation.Resource; import jakarta.validation.Valid; import lombok.extern.slf4j.Slf4j; import org.flowable.engine.HistoryService; import org.flowable.engine.RuntimeService; import org.flowable.engine.delegate.event.FlowableCancelledEvent; import org.flowable.engine.history.HistoricProcessInstance; import org.flowable.engine.history.HistoricProcessInstanceQuery; import org.flowable.engine.repository.ProcessDefinition; import org.flowable.engine.runtime.ProcessInstance; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; import java.util.*; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.*; /** * 流程实例 Service 实现类 * * ProcessDefinition & ProcessInstance & Execution & Task 的关系: * 1. <a href="https://blog.csdn.net/bobozai86/article/details/105210414" /> * * HistoricProcessInstance & ProcessInstance 的关系: * 1. <a href=" https://my.oschina.net/843294669/blog/71902" /> * * 简单来说,前者 = 历史 + 运行中的流程实例,后者仅是运行中的流程实例 * * @author 芋道源码 */ @Service @Validated @Slf4j public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService { @Resource private RuntimeService runtimeService; @Resource private HistoryService historyService; @Resource private BpmProcessDefinitionService processDefinitionService; @Resource private BpmMessageService messageService; @Resource private BpmProcessInstanceResultEventPublisher processInstanceResultEventPublisher; @Resource private AdminUserApi adminUserApi; @Resource private DeptApi deptApi; @Override public ProcessInstance getProcessInstance(String id) { return runtimeService.createProcessInstanceQuery() .includeProcessVariables() .processInstanceId(id) .singleResult(); } @Override public List<ProcessInstance> getProcessInstances(Set<String> ids) { return runtimeService.createProcessInstanceQuery().processInstanceIds(ids).list(); } @Override public HistoricProcessInstance getHistoricProcessInstance(String id) { return historyService.createHistoricProcessInstanceQuery().processInstanceId(id).includeProcessVariables().singleResult(); } @Override public List<HistoricProcessInstance> getHistoricProcessInstances(Set<String> ids) { return historyService.createHistoricProcessInstanceQuery().processInstanceIds(ids).list(); } @Override public PageResult<HistoricProcessInstance> getMyProcessInstancePage(Long userId, BpmProcessInstanceMyPageReqVO pageReqVO) { // 通过 BpmProcessInstanceExtDO 表,先查询到对应的分页 HistoricProcessInstanceQuery processInstanceQuery = historyService.createHistoricProcessInstanceQuery().includeProcessVariables() .startedBy(String.valueOf(userId)) .orderByProcessInstanceStartTime().desc(); if (StrUtil.isNotEmpty(pageReqVO.getName())) { processInstanceQuery.processInstanceNameLike("%" + pageReqVO.getName() + "%"); } if (StrUtil.isNotEmpty(pageReqVO.getProcessDefinitionId())) { processInstanceQuery.processDefinitionId("%" + pageReqVO.getProcessDefinitionId() + "%"); } if (StrUtil.isNotEmpty(pageReqVO.getCategory())) { processInstanceQuery.processDefinitionCategory(pageReqVO.getCategory()); } if (pageReqVO.getStatus() != null) { processInstanceQuery.variableValueEquals(BpmConstants.PROCESS_INSTANCE_VARIABLE_STATUS, pageReqVO.getStatus()); } if (ArrayUtil.isNotEmpty(pageReqVO.getCreateTime())) { processInstanceQuery.startedAfter(DateUtils.of(pageReqVO.getCreateTime()[0])); processInstanceQuery.startedBefore(DateUtils.of(pageReqVO.getCreateTime()[1])); } // 查询数量 long processInstanceCount = processInstanceQuery.count(); if (processInstanceCount == 0) { return PageResult.empty(processInstanceCount); } // 查询列表 List<HistoricProcessInstance> processInstanceList = processInstanceQuery.listPage(PageUtils.getStart(pageReqVO), pageReqVO.getPageSize()); return new PageResult<>(processInstanceList, processInstanceCount); } @Override @Transactional(rollbackFor = Exception.class) public String createProcessInstance(Long userId, @Valid BpmProcessInstanceCreateReqVO createReqVO) { // 获得流程定义 ProcessDefinition definition = processDefinitionService.getProcessDefinition(createReqVO.getProcessDefinitionId()); // 发起流程 return createProcessInstance0(userId, definition, createReqVO.getVariables(), null, createReqVO.getAssignee()); } @Override public String createProcessInstance(Long userId, @Valid BpmProcessInstanceCreateReqDTO createReqDTO) { // 获得流程定义 ProcessDefinition definition = processDefinitionService.getActiveProcessDefinition(createReqDTO.getProcessDefinitionKey()); // 发起流程 return createProcessInstance0(userId, definition, createReqDTO.getVariables(), createReqDTO.getBusinessKey(), createReqDTO.getAssignee()); } private String createProcessInstance0(Long userId, ProcessDefinition definition, Map<String, Object> variables, String businessKey, Map<String, List<Long>> assignee) { // 校验流程定义 if (definition == null) { throw exception(PROCESS_DEFINITION_NOT_EXISTS); } if (definition.isSuspended()) { throw exception(PROCESS_DEFINITION_IS_SUSPENDED); } // 设置上下文信息 // TODO @hai:要不往 variables 存到一个全局固定 key 里,减少对上下文的依赖 FlowableContextHolder.setAssignee(assignee); // 创建流程实例 FlowableUtils.filterProcessInstanceFormVariable(variables); // 过滤一下,避免 ProcessInstance 系统级的变量被占用 variables.put(BpmConstants.PROCESS_INSTANCE_VARIABLE_STATUS, // 流程实例状态:审批中 BpmProcessInstanceStatusEnum.RUNNING.getStatus()); ProcessInstance instance = runtimeService.createProcessInstanceBuilder() .processDefinitionId(definition.getId()) .businessKey(businessKey) .name(definition.getName().trim()) .variables(variables) .start(); return instance.getId(); } @Override public BpmProcessInstanceRespVO getProcessInstanceVO(String id) { // 获得流程实例 HistoricProcessInstance processInstance = getHistoricProcessInstance(id); if (processInstance == null) { return null; } // 获得流程定义 ProcessDefinition processDefinition = processDefinitionService .getProcessDefinition(processInstance.getProcessDefinitionId()); Assert.notNull(processDefinition, "流程定义({}) 不存在", processInstance.getProcessDefinitionId()); BpmProcessDefinitionInfoDO processDefinitionExt = processDefinitionService.getProcessDefinitionInfo( processInstance.getProcessDefinitionId()); Assert.notNull(processDefinitionExt, "流程定义拓展({}) 不存在", id); String bpmnXml = processDefinitionService.getProcessDefinitionBpmnXML(processInstance.getProcessDefinitionId()); // 获得 User AdminUserRespDTO startUser = adminUserApi.getUser(NumberUtils.parseLong(processInstance.getStartUserId())); DeptRespDTO dept = null; if (startUser != null) { dept = deptApi.getDept(startUser.getDeptId()); } // 拼接结果 return BpmProcessInstanceConvert.INSTANCE.convert2(processInstance, processDefinition, processDefinitionExt, bpmnXml, startUser, dept); } @Override public void cancelProcessInstance(Long userId, @Valid BpmProcessInstanceCancelReqVO cancelReqVO) { // 1.1 校验流程实例存在 ProcessInstance instance = getProcessInstance(cancelReqVO.getId()); if (instance == null) { throw exception(PROCESS_INSTANCE_CANCEL_FAIL_NOT_EXISTS); } // 1.2 只能取消自己的 if (!Objects.equals(instance.getStartUserId(), String.valueOf(userId))) { throw exception(PROCESS_INSTANCE_CANCEL_FAIL_NOT_SELF); } // 2. 通过删除流程实例,实现流程实例的取消, // 删除流程实例,正则执行任务 ACT_RU_TASK. 任务会被删除。通过历史表查询 deleteProcessInstance(cancelReqVO.getId(), BpmDeleteReasonEnum.CANCEL_PROCESS_INSTANCE.format(cancelReqVO.getReason())); // 3. 进一步的处理,交给 updateProcessInstanceCancel 方法 } @Override public void updateProcessInstanceWhenCancel(FlowableCancelledEvent event) { // 1. 判断是否为 Reject 不通过。如果是,则不进行更新. // 因为,updateProcessInstanceReject 方法(审批不通过),已经进行更新了 if (BpmDeleteReasonEnum.isRejectReason((String) event.getCause())) { return; } // 2. 更新流程实例 status runtimeService.setVariable(event.getProcessInstanceId(), BpmConstants.PROCESS_INSTANCE_VARIABLE_STATUS, BpmProcessInstanceStatusEnum.CANCEL.getStatus()); // 3. 发送流程实例的状态事件 // 注意:此时如果去查询 ProcessInstance 的话,字段是不全的,所以去查询了 HistoricProcessInstance HistoricProcessInstance processInstance = getHistoricProcessInstance(event.getProcessInstanceId()); // 发送流程实例的状态事件 processInstanceResultEventPublisher.sendProcessInstanceResultEvent( BpmProcessInstanceConvert.INSTANCE.convert(this, processInstance, BpmProcessInstanceStatusEnum.CANCEL.getStatus())); } @Override public void updateProcessInstanceWhenApprove(ProcessInstance instance) { // 1. 更新流程实例 status runtimeService.setVariable(instance.getId(), BpmConstants.PROCESS_INSTANCE_VARIABLE_STATUS, BpmProcessInstanceStatusEnum.APPROVE.getStatus()); // 2. 发送流程被【通过】的消息 messageService.sendMessageWhenProcessInstanceApprove(BpmProcessInstanceConvert.INSTANCE.convert2ApprovedReq(instance)); // 3. 发送流程实例的状态事件 // 注意:此时如果去查询 ProcessInstance 的话,字段是不全的,所以去查询了 HistoricProcessInstance HistoricProcessInstance processInstance = getHistoricProcessInstance(instance.getId()); processInstanceResultEventPublisher.sendProcessInstanceResultEvent( BpmProcessInstanceConvert.INSTANCE.convert(this, processInstance, BpmProcessInstanceStatusEnum.APPROVE.getStatus())); } @Override @Transactional(rollbackFor = Exception.class) public void updateProcessInstanceReject(String id, String reason) { // 1. 更新流程实例 status runtimeService.setVariable(id, BpmConstants.PROCESS_INSTANCE_VARIABLE_STATUS, BpmProcessInstanceStatusEnum.REJECT.getStatus()); // 2. 删除流程实例,以实现驳回任务时,取消整个审批流程 ProcessInstance processInstance = getProcessInstance(id); deleteProcessInstance(id, StrUtil.format(BpmDeleteReasonEnum.REJECT_TASK.format(reason))); // 3. 发送流程被【不通过】的消息 messageService.sendMessageWhenProcessInstanceReject(BpmProcessInstanceConvert.INSTANCE.convert2RejectReq(processInstance, reason)); // 4. 发送流程实例的状态事件 processInstanceResultEventPublisher.sendProcessInstanceResultEvent( BpmProcessInstanceConvert.INSTANCE.convert(this, processInstance, BpmProcessInstanceStatusEnum.REJECT.getStatus())); } private void deleteProcessInstance(String id, String reason) { runtimeService.deleteProcessInstance(id, reason); } @Override public List<Long> getAssigneeByProcessInstanceIdAndTaskDefinitionKey(String processInstanceId, String taskDefinitionKey) { // 1. 先从上下文获取,首次提交数据库中查询不到 List<Long> result = FlowableContextHolder.getAssigneeByTaskDefinitionKey(taskDefinitionKey); if (CollUtil.isNotEmpty(result)) { return result; } // 2. 从数据库中获取 // TODO @芋艿:指定审批人,这里的存储方案有问题,后续优化下 // BpmProcessInstanceExtDO instance = processInstanceExtMapper.selectByProcessInstanceId(processInstanceId); // if (instance == null) { // throw exception(PROCESS_INSTANCE_CANCEL_FAIL_NOT_EXISTS); // } // if (CollUtil.isNotEmpty(instance.getAssignee())) { // return instance.getAssignee().get(taskDefinitionKey); // } return Collections.emptyList(); } }
2 1 \ No newline at end of file
  2 +package cn.iocoder.yudao.module.bpm.service.task; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.StrUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.date.DateUtils; import cn.iocoder.yudao.framework.common.util.object.PageUtils; import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO; import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceCancelReqVO; import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceCreateReqVO; import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceMyPageReqVO; import cn.iocoder.yudao.module.bpm.convert.task.BpmProcessInstanceConvert; import cn.iocoder.yudao.module.bpm.enums.task.BpmDeleteReasonEnum; import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceStatusEnum; import cn.iocoder.yudao.module.bpm.framework.FlowableContextHolder; import cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmConstants; import cn.iocoder.yudao.module.bpm.framework.flowable.core.event.BpmProcessInstanceResultEventPublisher; import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.FlowableUtils; import cn.iocoder.yudao.module.bpm.service.definition.BpmProcessDefinitionService; import cn.iocoder.yudao.module.bpm.service.message.BpmMessageService; import jakarta.annotation.Resource; import jakarta.validation.Valid; import lombok.extern.slf4j.Slf4j; import org.flowable.engine.HistoryService; import org.flowable.engine.RuntimeService; import org.flowable.engine.delegate.event.FlowableCancelledEvent; import org.flowable.engine.history.HistoricProcessInstance; import org.flowable.engine.history.HistoricProcessInstanceQuery; import org.flowable.engine.repository.ProcessDefinition; import org.flowable.engine.runtime.ProcessInstance; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; import java.util.*; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.*; /** * 流程实例 Service 实现类 * * ProcessDefinition & ProcessInstance & Execution & Task 的关系: * 1. <a href="https://blog.csdn.net/bobozai86/article/details/105210414" /> * * HistoricProcessInstance & ProcessInstance 的关系: * 1. <a href=" https://my.oschina.net/843294669/blog/71902" /> * * 简单来说,前者 = 历史 + 运行中的流程实例,后者仅是运行中的流程实例 * * @author 芋道源码 */ @Service @Validated @Slf4j public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService { @Resource private RuntimeService runtimeService; @Resource private HistoryService historyService; @Resource private BpmProcessDefinitionService processDefinitionService; @Resource private BpmMessageService messageService; @Resource private BpmProcessInstanceResultEventPublisher processInstanceResultEventPublisher; @Override public ProcessInstance getProcessInstance(String id) { return runtimeService.createProcessInstanceQuery() .includeProcessVariables() .processInstanceId(id) .singleResult(); } @Override public List<ProcessInstance> getProcessInstances(Set<String> ids) { return runtimeService.createProcessInstanceQuery().processInstanceIds(ids).list(); } @Override public HistoricProcessInstance getHistoricProcessInstance(String id) { return historyService.createHistoricProcessInstanceQuery().processInstanceId(id).includeProcessVariables().singleResult(); } @Override public List<HistoricProcessInstance> getHistoricProcessInstances(Set<String> ids) { return historyService.createHistoricProcessInstanceQuery().processInstanceIds(ids).list(); } @Override public PageResult<HistoricProcessInstance> getMyProcessInstancePage(Long userId, BpmProcessInstanceMyPageReqVO pageReqVO) { // 通过 BpmProcessInstanceExtDO 表,先查询到对应的分页 HistoricProcessInstanceQuery processInstanceQuery = historyService.createHistoricProcessInstanceQuery().includeProcessVariables() .startedBy(String.valueOf(userId)) .orderByProcessInstanceStartTime().desc(); if (StrUtil.isNotEmpty(pageReqVO.getName())) { processInstanceQuery.processInstanceNameLike("%" + pageReqVO.getName() + "%"); } if (StrUtil.isNotEmpty(pageReqVO.getProcessDefinitionId())) { processInstanceQuery.processDefinitionId("%" + pageReqVO.getProcessDefinitionId() + "%"); } if (StrUtil.isNotEmpty(pageReqVO.getCategory())) { processInstanceQuery.processDefinitionCategory(pageReqVO.getCategory()); } if (pageReqVO.getStatus() != null) { processInstanceQuery.variableValueEquals(BpmConstants.PROCESS_INSTANCE_VARIABLE_STATUS, pageReqVO.getStatus()); } if (ArrayUtil.isNotEmpty(pageReqVO.getCreateTime())) { processInstanceQuery.startedAfter(DateUtils.of(pageReqVO.getCreateTime()[0])); processInstanceQuery.startedBefore(DateUtils.of(pageReqVO.getCreateTime()[1])); } // 查询数量 long processInstanceCount = processInstanceQuery.count(); if (processInstanceCount == 0) { return PageResult.empty(processInstanceCount); } // 查询列表 List<HistoricProcessInstance> processInstanceList = processInstanceQuery.listPage(PageUtils.getStart(pageReqVO), pageReqVO.getPageSize()); return new PageResult<>(processInstanceList, processInstanceCount); } @Override @Transactional(rollbackFor = Exception.class) public String createProcessInstance(Long userId, @Valid BpmProcessInstanceCreateReqVO createReqVO) { // 获得流程定义 ProcessDefinition definition = processDefinitionService.getProcessDefinition(createReqVO.getProcessDefinitionId()); // 发起流程 return createProcessInstance0(userId, definition, createReqVO.getVariables(), null, createReqVO.getAssignee()); } @Override public String createProcessInstance(Long userId, @Valid BpmProcessInstanceCreateReqDTO createReqDTO) { // 获得流程定义 ProcessDefinition definition = processDefinitionService.getActiveProcessDefinition(createReqDTO.getProcessDefinitionKey()); // 发起流程 return createProcessInstance0(userId, definition, createReqDTO.getVariables(), createReqDTO.getBusinessKey(), createReqDTO.getAssignee()); } private String createProcessInstance0(Long userId, ProcessDefinition definition, Map<String, Object> variables, String businessKey, Map<String, List<Long>> assignee) { // 校验流程定义 if (definition == null) { throw exception(PROCESS_DEFINITION_NOT_EXISTS); } if (definition.isSuspended()) { throw exception(PROCESS_DEFINITION_IS_SUSPENDED); } // 设置上下文信息 // TODO @hai:要不往 variables 存到一个全局固定 key 里,减少对上下文的依赖 FlowableContextHolder.setAssignee(assignee); // 创建流程实例 FlowableUtils.filterProcessInstanceFormVariable(variables); // 过滤一下,避免 ProcessInstance 系统级的变量被占用 variables.put(BpmConstants.PROCESS_INSTANCE_VARIABLE_STATUS, // 流程实例状态:审批中 BpmProcessInstanceStatusEnum.RUNNING.getStatus()); ProcessInstance instance = runtimeService.createProcessInstanceBuilder() .processDefinitionId(definition.getId()) .businessKey(businessKey) .name(definition.getName().trim()) .variables(variables) .start(); return instance.getId(); } @Override public void cancelProcessInstance(Long userId, @Valid BpmProcessInstanceCancelReqVO cancelReqVO) { // 1.1 校验流程实例存在 ProcessInstance instance = getProcessInstance(cancelReqVO.getId()); if (instance == null) { throw exception(PROCESS_INSTANCE_CANCEL_FAIL_NOT_EXISTS); } // 1.2 只能取消自己的 if (!Objects.equals(instance.getStartUserId(), String.valueOf(userId))) { throw exception(PROCESS_INSTANCE_CANCEL_FAIL_NOT_SELF); } // 2. 通过删除流程实例,实现流程实例的取消, // 删除流程实例,正则执行任务 ACT_RU_TASK. 任务会被删除。通过历史表查询 deleteProcessInstance(cancelReqVO.getId(), BpmDeleteReasonEnum.CANCEL_PROCESS_INSTANCE.format(cancelReqVO.getReason())); // 3. 进一步的处理,交给 updateProcessInstanceCancel 方法 } @Override public void updateProcessInstanceWhenCancel(FlowableCancelledEvent event) { // 1. 判断是否为 Reject 不通过。如果是,则不进行更新. // 因为,updateProcessInstanceReject 方法(审批不通过),已经进行更新了 if (BpmDeleteReasonEnum.isRejectReason((String) event.getCause())) { return; } // 2. 更新流程实例 status runtimeService.setVariable(event.getProcessInstanceId(), BpmConstants.PROCESS_INSTANCE_VARIABLE_STATUS, BpmProcessInstanceStatusEnum.CANCEL.getStatus()); // 3. 发送流程实例的状态事件 // 注意:此时如果去查询 ProcessInstance 的话,字段是不全的,所以去查询了 HistoricProcessInstance HistoricProcessInstance processInstance = getHistoricProcessInstance(event.getProcessInstanceId()); // 发送流程实例的状态事件 processInstanceResultEventPublisher.sendProcessInstanceResultEvent( BpmProcessInstanceConvert.INSTANCE.buildProcessInstanceStatusEvent(this, processInstance, BpmProcessInstanceStatusEnum.CANCEL.getStatus())); } @Override public void updateProcessInstanceWhenApprove(ProcessInstance instance) { // 1. 更新流程实例 status runtimeService.setVariable(instance.getId(), BpmConstants.PROCESS_INSTANCE_VARIABLE_STATUS, BpmProcessInstanceStatusEnum.APPROVE.getStatus()); // 2. 发送流程被【通过】的消息 messageService.sendMessageWhenProcessInstanceApprove(BpmProcessInstanceConvert.INSTANCE.buildProcessInstanceApproveMessage(instance)); // 3. 发送流程实例的状态事件 // 注意:此时如果去查询 ProcessInstance 的话,字段是不全的,所以去查询了 HistoricProcessInstance HistoricProcessInstance processInstance = getHistoricProcessInstance(instance.getId()); processInstanceResultEventPublisher.sendProcessInstanceResultEvent( BpmProcessInstanceConvert.INSTANCE.buildProcessInstanceStatusEvent(this, processInstance, BpmProcessInstanceStatusEnum.APPROVE.getStatus())); } @Override @Transactional(rollbackFor = Exception.class) public void updateProcessInstanceReject(String id, String reason) { // 1. 更新流程实例 status runtimeService.setVariable(id, BpmConstants.PROCESS_INSTANCE_VARIABLE_STATUS, BpmProcessInstanceStatusEnum.REJECT.getStatus()); // 2. 删除流程实例,以实现驳回任务时,取消整个审批流程 ProcessInstance processInstance = getProcessInstance(id); deleteProcessInstance(id, StrUtil.format(BpmDeleteReasonEnum.REJECT_TASK.format(reason))); // 3. 发送流程被【不通过】的消息 messageService.sendMessageWhenProcessInstanceReject(BpmProcessInstanceConvert.INSTANCE.buildProcessInstanceRejectMessage(processInstance, reason)); // 4. 发送流程实例的状态事件 processInstanceResultEventPublisher.sendProcessInstanceResultEvent( BpmProcessInstanceConvert.INSTANCE.buildProcessInstanceStatusEvent(this, processInstance, BpmProcessInstanceStatusEnum.REJECT.getStatus())); } private void deleteProcessInstance(String id, String reason) { runtimeService.deleteProcessInstance(id, reason); } @Override public List<Long> getAssigneeByProcessInstanceIdAndTaskDefinitionKey(String processInstanceId, String taskDefinitionKey) { // 1. 先从上下文获取,首次提交数据库中查询不到 List<Long> result = FlowableContextHolder.getAssigneeByTaskDefinitionKey(taskDefinitionKey); if (CollUtil.isNotEmpty(result)) { return result; } // 2. 从数据库中获取 // TODO @芋艿:指定审批人,这里的存储方案有问题,后续优化下 // BpmProcessInstanceExtDO instance = processInstanceExtMapper.selectByProcessInstanceId(processInstanceId); // if (instance == null) { // throw exception(PROCESS_INSTANCE_CANCEL_FAIL_NOT_EXISTS); // } // if (CollUtil.isNotEmpty(instance.getAssignee())) { // return instance.getAssignee().get(taskDefinitionKey); // } return Collections.emptyList(); } }
3 3 \ No newline at end of file
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java
... ... @@ -187,8 +187,12 @@ public class BpmTaskServiceImpl implements BpmTaskService {
187 187 BpmCommentTypeEnum.APPROVE.formatComment(reqVO.getReason()));
188 188 // 3.3 调用 BPM complete 去完成任务
189 189 // 其中,variables 是存储动态表单到 local 任务级别。过滤一下,避免 ProcessInstance 系统级的变量被占用
190   - Map<String, Object> variables = FlowableUtils.filterTaskFormVariable(reqVO.getVariables());
191   - taskService.complete(task.getId(), variables, true);
  190 + if (CollUtil.isNotEmpty(reqVO.getVariables())) {
  191 + Map<String, Object> variables = FlowableUtils.filterTaskFormVariable(reqVO.getVariables());
  192 + taskService.complete(task.getId(), variables, true);
  193 + } else {
  194 + taskService.complete(task.getId());
  195 + }
192 196  
193 197 // 【加签专属】处理加签任务
194 198 handleParentTaskIfSign(task.getParentTaskId());
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/main/resources/mapper/category/BpmCategoryMapper.xml deleted
1   -<?xml version="1.0" encoding="UTF-8"?>
2   -<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
3   -<mapper namespace="cn.iocoder.yudao.module.bpm.dal.mysql.category.BpmCategoryMapper">
4   -
5   - <!--
6   - 一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。
7   - 无法满足的场景,例如说多表关联查询,才使用 XML 编写 SQL。
8   - 代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。
9   - 文档可见:https://www.iocoder.cn/MyBatis/x-plugins/
10   - -->
11   -
12   -</mapper>
13 0 \ No newline at end of file
yudao-module-bpm/yudao-module-bpm-biz/src/test/java/cn/iocoder/yudao/module/bpm/service/definition/BpmFormServiceTest.java
... ... @@ -4,7 +4,7 @@ import cn.hutool.core.util.RandomUtil;
4 4 import cn.iocoder.yudao.framework.common.pojo.PageResult;
5 5 import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
6 6 import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
7   -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.form.BpmFormCreateReqVO;
  7 +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.form.BpmFormSaveReqVO;
8 8 import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.form.BpmFormPageReqVO;
9 9 import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.form.BpmFormUpdateReqVO;
10 10 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO;
... ... @@ -43,7 +43,7 @@ public class BpmFormServiceTest extends BaseDbUnitTest {
43 43 @Test
44 44 public void testCreateForm_success() {
45 45 // 准备参数
46   - BpmFormCreateReqVO reqVO = randomPojo(BpmFormCreateReqVO.class, o -> {
  46 + BpmFormSaveReqVO reqVO = randomPojo(BpmFormSaveReqVO.class, o -> {
47 47 o.setConf("{}");
48 48 o.setFields(randomFields());
49 49 });
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/test/java/cn/iocoder/yudao/module/bpm/service/definition/BpmUserGroupServiceTest.java
... ... @@ -7,7 +7,6 @@ import cn.iocoder.yudao.framework.test.core.util.AssertUtils;
7 7 import cn.iocoder.yudao.framework.test.core.util.RandomUtils;
8 8 import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.group.BpmUserGroupSaveReqVO;
9 9 import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.group.BpmUserGroupPageReqVO;
10   -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.group.BpmUserGroupUpdateReqVO;
11 10 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmUserGroupDO;
12 11 import cn.iocoder.yudao.module.bpm.dal.mysql.definition.BpmUserGroupMapper;
13 12 import org.junit.jupiter.api.Assertions;
... ... @@ -56,7 +55,7 @@ public class BpmUserGroupServiceTest extends BaseDbUnitTest {
56 55 BpmUserGroupDO dbUserGroup = RandomUtils.randomPojo(BpmUserGroupDO.class);
57 56 userGroupMapper.insert(dbUserGroup);// @Sql: 先插入出一条存在的数据
58 57 // 准备参数
59   - BpmUserGroupUpdateReqVO reqVO = RandomUtils.randomPojo(BpmUserGroupUpdateReqVO.class, o -> {
  58 + BpmUserGroupSaveReqVO reqVO = RandomUtils.randomPojo(BpmUserGroupSaveReqVO.class, o -> {
60 59 o.setId(dbUserGroup.getId()); // 设置更新的 ID
61 60 });
62 61  
... ... @@ -70,7 +69,7 @@ public class BpmUserGroupServiceTest extends BaseDbUnitTest {
70 69 @Test
71 70 public void testUpdateUserGroup_notExists() {
72 71 // 准备参数
73   - BpmUserGroupUpdateReqVO reqVO = RandomUtils.randomPojo(BpmUserGroupUpdateReqVO.class);
  72 + BpmUserGroupSaveReqVO reqVO = RandomUtils.randomPojo(BpmUserGroupSaveReqVO.class);
74 73  
75 74 // 调用, 并断言异常
76 75 AssertUtils.assertServiceException(() -> userGroupService.updateUserGroup(reqVO), USER_GROUP_NOT_EXISTS);
... ...
yudao-module-bpm/yudao-module-bpm-biz/src/test/resources/sql/create_tables.sql
... ... @@ -3,7 +3,7 @@ CREATE TABLE IF NOT EXISTS &quot;bpm_user_group&quot; (
3 3 "name" varchar(63) NOT NULL,
4 4 "description" varchar(255) NOT NULL,
5 5 "status" tinyint NOT NULL,
6   - "member_user_ids" varchar(255) NOT NULL,
  6 + "user_ids" varchar(255) NOT NULL,
7 7 "creator" varchar(64) DEFAULT '',
8 8 "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
9 9 "updater" varchar(64) DEFAULT '',
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contract/listener/CrmContractResultListener.java renamed to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/contract/listener/CrmContractStatusListener.java
1 1 package cn.iocoder.yudao.module.crm.service.contract.listener;
2 2  
3   -import cn.iocoder.yudao.module.bpm.event.BpmProcessInstanceResultEvent;
4   -import cn.iocoder.yudao.module.bpm.event.BpmProcessInstanceResultEventListener;
  3 +import cn.iocoder.yudao.module.bpm.event.BpmProcessInstanceStatusEvent;
  4 +import cn.iocoder.yudao.module.bpm.event.BpmProcessInstanceStatusEventListener;
5 5 import cn.iocoder.yudao.module.crm.service.contract.CrmContractService;
6 6 import cn.iocoder.yudao.module.crm.service.contract.CrmContractServiceImpl;
7 7 import jakarta.annotation.Resource;
... ... @@ -13,7 +13,7 @@ import org.springframework.stereotype.Component;
13 13 * @author HUIHUI
14 14 */
15 15 @Component
16   -public class CrmContractResultListener extends BpmProcessInstanceResultEventListener {
  16 +public class CrmContractStatusListener extends BpmProcessInstanceStatusEventListener {
17 17  
18 18 @Resource
19 19 private CrmContractService contractService;
... ... @@ -24,8 +24,8 @@ public class CrmContractResultListener extends BpmProcessInstanceResultEventList
24 24 }
25 25  
26 26 @Override
27   - protected void onEvent(BpmProcessInstanceResultEvent event) {
28   - contractService.updateContractAuditStatus(Long.parseLong(event.getBusinessKey()), event.getResult());
  27 + protected void onEvent(BpmProcessInstanceStatusEvent event) {
  28 + contractService.updateContractAuditStatus(Long.parseLong(event.getBusinessKey()), event.getStatus());
29 29 }
30 30  
31 31 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/receivable/listener/CrmReceivableResultListener.java renamed to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/receivable/listener/CrmReceivableStatusListener.java
1 1 package cn.iocoder.yudao.module.crm.service.receivable.listener;
2 2  
3   -import cn.iocoder.yudao.module.bpm.event.BpmProcessInstanceResultEvent;
4   -import cn.iocoder.yudao.module.bpm.event.BpmProcessInstanceResultEventListener;
  3 +import cn.iocoder.yudao.module.bpm.event.BpmProcessInstanceStatusEvent;
  4 +import cn.iocoder.yudao.module.bpm.event.BpmProcessInstanceStatusEventListener;
5 5 import cn.iocoder.yudao.module.crm.service.receivable.CrmReceivableService;
6 6 import cn.iocoder.yudao.module.crm.service.receivable.CrmReceivableServiceImpl;
7 7 import jakarta.annotation.Resource;
... ... @@ -13,7 +13,7 @@ import org.springframework.stereotype.Component;
13 13 * @author HUIHUI
14 14 */
15 15 @Component
16   -public class CrmReceivableResultListener extends BpmProcessInstanceResultEventListener {
  16 +public class CrmReceivableStatusListener extends BpmProcessInstanceStatusEventListener {
17 17  
18 18 @Resource
19 19 private CrmReceivableService receivableService;
... ... @@ -24,8 +24,8 @@ public class CrmReceivableResultListener extends BpmProcessInstanceResultEventLi
24 24 }
25 25  
26 26 @Override
27   - public void onEvent(BpmProcessInstanceResultEvent event) {
28   - receivableService.updateReceivableAuditStatus(Long.parseLong(event.getBusinessKey()), event.getResult());
  27 + public void onEvent(BpmProcessInstanceStatusEvent event) {
  28 + receivableService.updateReceivableAuditStatus(Long.parseLong(event.getBusinessKey()), event.getStatus());
29 29 }
30 30  
31 31 }
... ...
yudao-server/src/main/resources/application.yaml
... ... @@ -59,7 +59,7 @@ flowable:
59 59 database-schema-update: true # 设置为 false,可通过 https://github.com/flowable/flowable-sql 初始化
60 60 db-history-used: true # flowable6 默认 true 生成信息表,无需手动设置
61 61 check-process-definitions: false # 设置为 false,禁用 /resources/processes 自动部署 BPMN XML 流程
62   - history-level: full # full:保存历史数据的最高级别,可保存全部流程相关细节,包括流程流转各节点参数
  62 + history-level: audit # full:保存历史数据的最高级别,可保存全部流程相关细节,包括流程流转各节点参数
63 63  
64 64 # MyBatis Plus 的配置项
65 65 mybatis-plus:
... ...