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,14 +5,13 @@ import lombok.Data;
5 import org.springframework.context.ApplicationEvent; 5 import org.springframework.context.ApplicationEvent;
6 6
7 /** 7 /**
8 - * 流程实例的结果发生变化的 Event  
9 - * 定位:由于额外增加了 {@link BpmProcessInstanceExtDO#getResult()} 结果,所以增加该事件 8 + * 流程实例的状态(结果)发生变化的 Event
10 * 9 *
11 * @author 芋道源码 10 * @author 芋道源码
12 */ 11 */
13 @SuppressWarnings("ALL") 12 @SuppressWarnings("ALL")
14 @Data 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,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 private String businessKey; 35 private String businessKey;
37 36
38 - public BpmProcessInstanceResultEvent(Object source) { 37 + public BpmProcessInstanceStatusEvent(Object source) {
39 super(source); 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,15 +4,15 @@ import cn.hutool.core.util.StrUtil;
4 import org.springframework.context.ApplicationListener; 4 import org.springframework.context.ApplicationListener;
5 5
6 /** 6 /**
7 - * {@link BpmProcessInstanceResultEvent} 的监听器 7 + * {@link BpmProcessInstanceStatusEvent} 的监听器
8 * 8 *
9 * @author 芋道源码 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 @Override 14 @Override
15 - public final void onApplicationEvent(BpmProcessInstanceResultEvent event) { 15 + public final void onApplicationEvent(BpmProcessInstanceStatusEvent event) {
16 if (!StrUtil.equals(event.getProcessDefinitionKey(), getProcessDefinitionKey())) { 16 if (!StrUtil.equals(event.getProcessDefinitionKey(), getProcessDefinitionKey())) {
17 return; 17 return;
18 } 18 }
@@ -29,6 +29,6 @@ public abstract class BpmProcessInstanceResultEventListener @@ -29,6 +29,6 @@ public abstract class BpmProcessInstanceResultEventListener
29 * 29 *
30 * @param event 事件 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 package cn.iocoder.yudao.module.bpm.controller.admin.definition; 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 import cn.iocoder.yudao.framework.common.pojo.CommonResult; 3 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
8 import cn.iocoder.yudao.framework.common.pojo.PageResult; 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 import io.swagger.v3.oas.annotations.Operation; 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 import org.springframework.security.access.prepost.PreAuthorize; 16 import org.springframework.security.access.prepost.PreAuthorize;
13 import org.springframework.validation.annotation.Validated; 17 import org.springframework.validation.annotation.Validated;
14 import org.springframework.web.bind.annotation.*; 18 import org.springframework.web.bind.annotation.*;
15 19
16 -import jakarta.annotation.Resource;  
17 -import jakarta.validation.Valid;  
18 import java.util.List; 20 import java.util.List;
19 21
20 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; 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 @Tag(name = "管理后台 - 动态表单") 25 @Tag(name = "管理后台 - 动态表单")
23 @RestController 26 @RestController
@@ -31,14 +34,14 @@ public class BpmFormController { @@ -31,14 +34,14 @@ public class BpmFormController {
31 @PostMapping("/create") 34 @PostMapping("/create")
32 @Operation(summary = "创建动态表单") 35 @Operation(summary = "创建动态表单")
33 @PreAuthorize("@ss.hasPermission('bpm:form:create')") 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 return success(formService.createForm(createReqVO)); 38 return success(formService.createForm(createReqVO));
36 } 39 }
37 40
38 @PutMapping("/update") 41 @PutMapping("/update")
39 @Operation(summary = "更新动态表单") 42 @Operation(summary = "更新动态表单")
40 @PreAuthorize("@ss.hasPermission('bpm:form:update')") 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 formService.updateForm(updateReqVO); 45 formService.updateForm(updateReqVO);
43 return success(true); 46 return success(true);
44 } 47 }
@@ -58,14 +61,15 @@ public class BpmFormController { @@ -58,14 +61,15 @@ public class BpmFormController {
58 @PreAuthorize("@ss.hasPermission('bpm:form:query')") 61 @PreAuthorize("@ss.hasPermission('bpm:form:query')")
59 public CommonResult<BpmFormRespVO> getForm(@RequestParam("id") Long id) { 62 public CommonResult<BpmFormRespVO> getForm(@RequestParam("id") Long id) {
60 BpmFormDO form = formService.getForm(id); 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 @Operation(summary = "获得动态表单的精简列表", description = "用于表单下拉框") 68 @Operation(summary = "获得动态表单的精简列表", description = "用于表单下拉框")
66 - public CommonResult<List<BpmFormSimpleRespVO>> getSimpleForms() { 69 + public CommonResult<List<BpmFormRespVO>> getFormSimpleList() {
67 List<BpmFormDO> list = formService.getFormList(); 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 @GetMapping("/page") 75 @GetMapping("/page")
@@ -73,7 +77,7 @@ public class BpmFormController { @@ -73,7 +77,7 @@ public class BpmFormController {
73 @PreAuthorize("@ss.hasPermission('bpm:form:query')") 77 @PreAuthorize("@ss.hasPermission('bpm:form:query')")
74 public CommonResult<PageResult<BpmFormRespVO>> getFormPage(@Valid BpmFormPageReqVO pageVO) { 78 public CommonResult<PageResult<BpmFormRespVO>> getFormPage(@Valid BpmFormPageReqVO pageVO) {
75 PageResult<BpmFormDO> pageResult = formService.getFormPage(pageVO); 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 package cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.form; 1 package cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.form;
  2 +
2 import io.swagger.v3.oas.annotations.media.Schema; 3 import io.swagger.v3.oas.annotations.media.Schema;
  4 +import jakarta.validation.constraints.NotNull;
3 import lombok.Data; 5 import lombok.Data;
4 -import lombok.EqualsAndHashCode;  
5 -import lombok.ToString;  
6 6
7 -import jakarta.validation.constraints.NotNull;  
8 import java.time.LocalDateTime; 7 import java.time.LocalDateTime;
9 import java.util.List; 8 import java.util.List;
10 9
11 @Schema(description = "管理后台 - 动态表单 Response VO") 10 @Schema(description = "管理后台 - 动态表单 Response VO")
12 @Data 11 @Data
13 -@EqualsAndHashCode(callSuper = true)  
14 -@ToString(callSuper = true)  
15 -public class BpmFormRespVO extends BpmFormBaseVO { 12 +public class BpmFormRespVO {
16 13
17 @Schema(description = "表单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") 14 @Schema(description = "表单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
18 private Long id; 15 private Long id;
19 16
  17 + @Schema(description = "表单名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋道")
  18 + @NotNull(message = "表单名称不能为空")
  19 + private String name;
  20 +
20 @Schema(description = "表单的配置-JSON 字符串", requiredMode = Schema.RequiredMode.REQUIRED) 21 @Schema(description = "表单的配置-JSON 字符串", requiredMode = Schema.RequiredMode.REQUIRED)
21 @NotNull(message = "表单的配置不能为空") 22 @NotNull(message = "表单的配置不能为空")
22 private String conf; 23 private String conf;
@@ -25,6 +26,13 @@ public class BpmFormRespVO extends BpmFormBaseVO { @@ -25,6 +26,13 @@ public class BpmFormRespVO extends BpmFormBaseVO {
25 @NotNull(message = "表单项的数组不能为空") 26 @NotNull(message = "表单项的数组不能为空")
26 private List<String> fields; 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 @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) 36 @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
29 private LocalDateTime createTime; 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,11 +5,16 @@ import lombok.*;
5 import jakarta.validation.constraints.NotNull; 5 import jakarta.validation.constraints.NotNull;
6 import java.util.List; 6 import java.util.List;
7 7
8 -@Schema(description = "管理后台 - 动态表单创建 Request VO") 8 +@Schema(description = "管理后台 - 动态表单创建/更新 Request VO")
9 @Data 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 @Schema(description = "表单的配置-JSON 字符串", requiredMode = Schema.RequiredMode.REQUIRED) 19 @Schema(description = "表单的配置-JSON 字符串", requiredMode = Schema.RequiredMode.REQUIRED)
15 @NotNull(message = "表单的配置不能为空") 20 @NotNull(message = "表单的配置不能为空")
@@ -19,4 +24,11 @@ public class BpmFormCreateReqVO extends BpmFormBaseVO { @@ -19,4 +24,11 @@ public class BpmFormCreateReqVO extends BpmFormBaseVO {
19 @NotNull(message = "表单项的数组不能为空") 24 @NotNull(message = "表单项的数组不能为空")
20 private List<String> fields; 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,7 +50,10 @@ public class BpmProcessDefinitionRespVO {
50 @Schema(description = "中断状态-参见 SuspensionState 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") 50 @Schema(description = "中断状态-参见 SuspensionState 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
51 private Integer suspensionState; 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 package cn.iocoder.yudao.module.bpm.controller.admin.oa; 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 import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.BpmOALeaveCreateReqVO; 6 import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.BpmOALeaveCreateReqVO;
4 import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.BpmOALeavePageReqVO; 7 import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.BpmOALeavePageReqVO;
5 import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.BpmOALeaveRespVO; 8 import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.BpmOALeaveRespVO;
6 -import cn.iocoder.yudao.module.bpm.convert.oa.BpmOALeaveConvert;  
7 import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOALeaveDO; 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 import cn.iocoder.yudao.module.bpm.service.oa.BpmOALeaveService; 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 import io.swagger.v3.oas.annotations.Operation; 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 import org.springframework.security.access.prepost.PreAuthorize; 16 import org.springframework.security.access.prepost.PreAuthorize;
15 import org.springframework.validation.annotation.Validated; 17 import org.springframework.validation.annotation.Validated;
16 import org.springframework.web.bind.annotation.*; 18 import org.springframework.web.bind.annotation.*;
17 19
18 -import jakarta.annotation.Resource;  
19 -import jakarta.validation.Valid;  
20 -  
21 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; 20 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
22 import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; 21 import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
23 22
@@ -49,7 +48,7 @@ public class BpmOALeaveController { @@ -49,7 +48,7 @@ public class BpmOALeaveController {
49 @Parameter(name = "id", description = "编号", required = true, example = "1024") 48 @Parameter(name = "id", description = "编号", required = true, example = "1024")
50 public CommonResult<BpmOALeaveRespVO> getLeave(@RequestParam("id") Long id) { 49 public CommonResult<BpmOALeaveRespVO> getLeave(@RequestParam("id") Long id) {
51 BpmOALeaveDO leave = leaveService.getLeave(id); 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 @GetMapping("/page") 54 @GetMapping("/page")
@@ -57,7 +56,7 @@ public class BpmOALeaveController { @@ -57,7 +56,7 @@ public class BpmOALeaveController {
57 @Operation(summary = "获得请假申请分页") 56 @Operation(summary = "获得请假申请分页")
58 public CommonResult<PageResult<BpmOALeaveRespVO>> getLeavePage(@Valid BpmOALeavePageReqVO pageVO) { 57 public CommonResult<PageResult<BpmOALeaveRespVO>> getLeavePage(@Valid BpmOALeavePageReqVO pageVO) {
59 PageResult<BpmOALeaveDO> pageResult = leaveService.getLeavePage(getLoginUserId(), pageVO); 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 package cn.iocoder.yudao.module.bpm.controller.admin.oa.vo; 1 package cn.iocoder.yudao.module.bpm.controller.admin.oa.vo;
  2 +
2 import io.swagger.v3.oas.annotations.media.Schema; 3 import io.swagger.v3.oas.annotations.media.Schema;
  4 +import jakarta.validation.constraints.AssertTrue;
  5 +import jakarta.validation.constraints.NotNull;
3 import lombok.Data; 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 @Schema(description = "管理后台 - 请假申请创建 Request VO") 13 @Schema(description = "管理后台 - 请假申请创建 Request VO")
10 @Data 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 @AssertTrue(message = "结束时间,需要在开始时间之后") 33 @AssertTrue(message = "结束时间,需要在开始时间之后")
16 public boolean isEndTimeValid() { 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 package cn.iocoder.yudao.module.bpm.controller.admin.oa.vo; 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 import cn.iocoder.yudao.framework.common.pojo.PageParam; 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 import org.springframework.format.annotation.DateTimeFormat; 8 import org.springframework.format.annotation.DateTimeFormat;
7 9
  10 +import java.time.LocalDateTime;
  11 +
8 import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; 12 import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
9 13
10 @Schema(description = "管理后台 - 请假申请分页 Request VO") 14 @Schema(description = "管理后台 - 请假申请分页 Request VO")
@@ -13,13 +17,13 @@ import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_ @@ -13,13 +17,13 @@ import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_
13 @ToString(callSuper = true) 17 @ToString(callSuper = true)
14 public class BpmOALeavePageReqVO extends PageParam { 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 private Integer type; 24 private Integer type;
21 25
22 - @Schema(description = "原因-模糊匹配", example = "阅读芋道源码") 26 + @Schema(description = "原因,模糊匹配", example = "阅读芋道源码")
23 private String reason; 27 private String reason;
24 28
25 @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) 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 package cn.iocoder.yudao.module.bpm.controller.admin.oa.vo; 1 package cn.iocoder.yudao.module.bpm.controller.admin.oa.vo;
2 2
3 import io.swagger.v3.oas.annotations.media.Schema; 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 import java.time.LocalDateTime; 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 @Schema(description = "管理后台 - 请假申请 Response VO") 8 @Schema(description = "管理后台 - 请假申请 Response VO")
13 @Data 9 @Data
14 -@EqualsAndHashCode(callSuper = true)  
15 -@ToString(callSuper = true)  
16 -public class BpmOALeaveRespVO extends BpmOALeaveBaseVO { 10 +public class BpmOALeaveRespVO {
17 11
18 @Schema(description = "请假表单主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") 12 @Schema(description = "请假表单主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
19 private Long id; 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 @Schema(description = "申请时间", requiredMode = Schema.RequiredMode.REQUIRED) 21 @Schema(description = "申请时间", requiredMode = Schema.RequiredMode.REQUIRED)
25 - @NotNull(message = "申请时间不能为空")  
26 - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)  
27 private LocalDateTime createTime; 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 private String processInstanceId; 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,13 +3,19 @@ package cn.iocoder.yudao.module.bpm.controller.admin.task;
3 import cn.hutool.core.collection.CollUtil; 3 import cn.hutool.core.collection.CollUtil;
4 import cn.iocoder.yudao.framework.common.pojo.CommonResult; 4 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
5 import cn.iocoder.yudao.framework.common.pojo.PageResult; 5 import cn.iocoder.yudao.framework.common.pojo.PageResult;
  6 +import cn.iocoder.yudao.framework.common.util.number.NumberUtils;
6 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.*; 7 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.*;
7 import cn.iocoder.yudao.module.bpm.convert.task.BpmProcessInstanceConvert; 8 import cn.iocoder.yudao.module.bpm.convert.task.BpmProcessInstanceConvert;
8 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmCategoryDO; 9 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmCategoryDO;
  10 +import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionInfoDO;
9 import cn.iocoder.yudao.module.bpm.service.definition.BpmCategoryService; 11 import cn.iocoder.yudao.module.bpm.service.definition.BpmCategoryService;
10 import cn.iocoder.yudao.module.bpm.service.definition.BpmProcessDefinitionService; 12 import cn.iocoder.yudao.module.bpm.service.definition.BpmProcessDefinitionService;
11 import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService; 13 import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService;
12 import cn.iocoder.yudao.module.bpm.service.task.BpmTaskService; 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 import io.swagger.v3.oas.annotations.Operation; 19 import io.swagger.v3.oas.annotations.Operation;
14 import io.swagger.v3.oas.annotations.Parameter; 20 import io.swagger.v3.oas.annotations.Parameter;
15 import io.swagger.v3.oas.annotations.tags.Tag; 21 import io.swagger.v3.oas.annotations.tags.Tag;
@@ -45,10 +51,15 @@ public class BpmProcessInstanceController { @@ -45,10 +51,15 @@ public class BpmProcessInstanceController {
45 @Resource 51 @Resource
46 private BpmCategoryService categoryService; 52 private BpmCategoryService categoryService;
47 53
  54 + @Resource
  55 + private AdminUserApi adminUserApi;
  56 + @Resource
  57 + private DeptApi deptApi;
  58 +
48 @GetMapping("/my-page") 59 @GetMapping("/my-page")
49 @Operation(summary = "获得我的实例分页列表", description = "在【我的流程】菜单中,进行调用") 60 @Operation(summary = "获得我的实例分页列表", description = "在【我的流程】菜单中,进行调用")
50 @PreAuthorize("@ss.hasPermission('bpm:process-instance:query')") 61 @PreAuthorize("@ss.hasPermission('bpm:process-instance:query')")
51 - public CommonResult<PageResult<BpmProcessInstancePageItemRespVO>> getMyProcessInstancePage( 62 + public CommonResult<PageResult<BpmProcessInstanceRespVO>> getMyProcessInstancePage(
52 @Valid BpmProcessInstanceMyPageReqVO pageReqVO) { 63 @Valid BpmProcessInstanceMyPageReqVO pageReqVO) {
53 PageResult<HistoricProcessInstance> pageResult = processInstanceService.getMyProcessInstancePage(getLoginUserId(), pageReqVO); 64 PageResult<HistoricProcessInstance> pageResult = processInstanceService.getMyProcessInstancePage(getLoginUserId(), pageReqVO);
54 if (CollUtil.isEmpty(pageResult.getList())) { 65 if (CollUtil.isEmpty(pageResult.getList())) {
@@ -62,7 +73,8 @@ public class BpmProcessInstanceController { @@ -62,7 +73,8 @@ public class BpmProcessInstanceController {
62 convertSet(pageResult.getList(), HistoricProcessInstance::getProcessDefinitionId)); 73 convertSet(pageResult.getList(), HistoricProcessInstance::getProcessDefinitionId));
63 Map<String, BpmCategoryDO> categoryMap = categoryService.getCategoryMap( 74 Map<String, BpmCategoryDO> categoryMap = categoryService.getCategoryMap(
64 convertSet(processDefinitionMap.values(), ProcessDefinition::getCategory)); 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 @PostMapping("/create") 80 @PostMapping("/create")
@@ -77,7 +89,24 @@ public class BpmProcessInstanceController { @@ -77,7 +89,24 @@ public class BpmProcessInstanceController {
77 @Parameter(name = "id", description = "流程实例的编号", required = true) 89 @Parameter(name = "id", description = "流程实例的编号", required = true)
78 @PreAuthorize("@ss.hasPermission('bpm:process-instance:query')") 90 @PreAuthorize("@ss.hasPermission('bpm:process-instance:query')")
79 public CommonResult<BpmProcessInstanceRespVO> getProcessInstance(@RequestParam("id") String id) { 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 @DeleteMapping("/cancel") 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,7 +19,7 @@ public class BpmActivityRespVO {
19 @Schema(description = "流程活动的结束时间", requiredMode = Schema.RequiredMode.REQUIRED) 19 @Schema(description = "流程活动的结束时间", requiredMode = Schema.RequiredMode.REQUIRED)
20 private LocalDateTime endTime; 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 package cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance; 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 import io.swagger.v3.oas.annotations.media.Schema; 4 import io.swagger.v3.oas.annotations.media.Schema;
4 import lombok.Data; 5 import lombok.Data;
5 6
@@ -19,12 +20,14 @@ public class BpmProcessInstanceRespVO { @@ -19,12 +20,14 @@ public class BpmProcessInstanceRespVO {
19 20
20 @Schema(description = "流程分类", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") 21 @Schema(description = "流程分类", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
21 private String category; 22 private String category;
  23 + @Schema(description = "流程分类名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "请假")
  24 + private String categoryName;
22 25
23 @Schema(description = "流程实例的状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") 26 @Schema(description = "流程实例的状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
24 private Integer status; // 参见 BpmProcessInstanceStatusEnum 枚举 27 private Integer status; // 参见 BpmProcessInstanceStatusEnum 枚举
25 28
26 @Schema(description = "提交时间", requiredMode = Schema.RequiredMode.REQUIRED) 29 @Schema(description = "提交时间", requiredMode = Schema.RequiredMode.REQUIRED)
27 - private LocalDateTime createTime; 30 + private LocalDateTime startTime;
28 31
29 @Schema(description = "结束时间", requiredMode = Schema.RequiredMode.REQUIRED) 32 @Schema(description = "结束时间", requiredMode = Schema.RequiredMode.REQUIRED)
30 private LocalDateTime endTime; 33 private LocalDateTime endTime;
@@ -40,10 +43,17 @@ public class BpmProcessInstanceRespVO { @@ -40,10 +43,17 @@ public class BpmProcessInstanceRespVO {
40 */ 43 */
41 private User startUser; 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 @Schema(description = "用户信息") 58 @Schema(description = "用户信息")
49 @Data 59 @Data
@@ -61,30 +71,15 @@ public class BpmProcessInstanceRespVO { @@ -61,30 +71,15 @@ public class BpmProcessInstanceRespVO {
61 71
62 } 72 }
63 73
64 - @Schema(description = "流程定义信息") 74 + @Schema(description = "流程任务")
65 @Data 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 private String id; 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,9 +42,6 @@ public class BpmTaskRespVO {
42 */ 42 */
43 private BpmProcessInstanceRespVO.User assigneeUser; 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 @Schema(description = "任务定义的标识", requiredMode = Schema.RequiredMode.REQUIRED, example = "Activity_one") 45 @Schema(description = "任务定义的标识", requiredMode = Schema.RequiredMode.REQUIRED, example = "Activity_one")
49 private String taskDefinitionKey; 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,12 +4,12 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 import cn.iocoder.yudao.framework.common.util.collection.MapUtils; 4 import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
5 import cn.iocoder.yudao.framework.common.util.number.NumberUtils; 5 import cn.iocoder.yudao.framework.common.util.number.NumberUtils;
6 import cn.iocoder.yudao.framework.common.util.object.BeanUtils; 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 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceRespVO; 8 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceRespVO;
10 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmCategoryDO; 9 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmCategoryDO;
11 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionInfoDO; 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 import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenProcessInstanceApproveReqDTO; 13 import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenProcessInstanceApproveReqDTO;
14 import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenProcessInstanceRejectReqDTO; 14 import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenProcessInstanceRejectReqDTO;
15 import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO; 15 import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
@@ -18,6 +18,7 @@ import org.flowable.engine.history.HistoricProcessInstance; @@ -18,6 +18,7 @@ import org.flowable.engine.history.HistoricProcessInstance;
18 import org.flowable.engine.repository.ProcessDefinition; 18 import org.flowable.engine.repository.ProcessDefinition;
19 import org.flowable.engine.runtime.ProcessInstance; 19 import org.flowable.engine.runtime.ProcessInstance;
20 import org.flowable.task.api.Task; 20 import org.flowable.task.api.Task;
  21 +import org.mapstruct.Mapper;
21 import org.mapstruct.Mapping; 22 import org.mapstruct.Mapping;
22 import org.mapstruct.MappingTarget; 23 import org.mapstruct.MappingTarget;
23 import org.mapstruct.factory.Mappers; 24 import org.mapstruct.factory.Mappers;
@@ -30,39 +31,43 @@ import java.util.Map; @@ -30,39 +31,43 @@ import java.util.Map;
30 * 31 *
31 * @author 芋道源码 32 * @author 芋道源码
32 */ 33 */
  34 +@Mapper
33 public interface BpmProcessInstanceConvert { 35 public interface BpmProcessInstanceConvert {
34 36
35 BpmProcessInstanceConvert INSTANCE = Mappers.getMapper(BpmProcessInstanceConvert.class); 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 for (int i = 0; i < pageResult.getList().size(); i++) { 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 respVO.setStatus(FlowableUtils.getProcessInstanceStatus(pageResult.getList().get(i))); 46 respVO.setStatus(FlowableUtils.getProcessInstanceStatus(pageResult.getList().get(i)));
45 MapUtils.findAndThen(processDefinitionMap, respVO.getProcessDefinitionId(), 47 MapUtils.findAndThen(processDefinitionMap, respVO.getProcessDefinitionId(),
46 processDefinition -> respVO.setCategory(processDefinition.getCategory())); 48 processDefinition -> respVO.setCategory(processDefinition.getCategory()));
47 MapUtils.findAndThen(categoryMap, respVO.getCategory(), category -> respVO.setCategoryName(category.getName())); 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 return vpPageResult; 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 respVO.setStatus(FlowableUtils.getProcessInstanceStatus(processInstance)); 62 respVO.setStatus(FlowableUtils.getProcessInstanceStatus(processInstance));
58 respVO.setFormVariables(FlowableUtils.filterProcessInstanceFormVariable(processInstance.getProcessVariables())); 63 respVO.setFormVariables(FlowableUtils.filterProcessInstanceFormVariable(processInstance.getProcessVariables()));
59 // definition 64 // definition
60 - respVO.setProcessDefinition(convert2(processDefinition)); 65 + respVO.setProcessDefinition(BeanUtils.toBean(processDefinition, BpmProcessDefinitionRespVO.class));
61 copyTo(processDefinitionExt, respVO.getProcessDefinition()); 66 copyTo(processDefinitionExt, respVO.getProcessDefinition());
62 respVO.getProcessDefinition().setBpmnXml(bpmnXml); 67 respVO.getProcessDefinition().setBpmnXml(bpmnXml);
63 // user 68 // user
64 if (startUser != null) { 69 if (startUser != null) {
65 - respVO.setStartUser(convert2(startUser)); 70 + respVO.setStartUser(BeanUtils.toBean(startUser, BpmProcessInstanceRespVO.User.class));
66 if (dept != null) { 71 if (dept != null) {
67 respVO.getStartUser().setDeptName(dept.getName()); 72 respVO.getStartUser().setDeptName(dept.getName());
68 } 73 }
@@ -70,42 +75,27 @@ public interface BpmProcessInstanceConvert { @@ -70,42 +75,27 @@ public interface BpmProcessInstanceConvert {
70 return respVO; 75 return respVO;
71 } 76 }
72 77
73 - BpmProcessInstanceRespVO convert2(HistoricProcessInstance bean);  
74 -  
75 - BpmProcessInstanceRespVO.ProcessDefinition convert2(ProcessDefinition bean);  
76 -  
77 @Mapping(source = "from.id", target = "to.id", ignore = true) 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 .setStartUserId(NumberUtils.parseLong(instance.getStartUserId())) 93 .setStartUserId(NumberUtils.parseLong(instance.getStartUserId()))
104 .setProcessInstanceId(instance.getId()) 94 .setProcessInstanceId(instance.getId())
105 .setProcessInstanceName(instance.getName()); 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 return new BpmMessageSendWhenProcessInstanceRejectReqDTO() 99 return new BpmMessageSendWhenProcessInstanceRejectReqDTO()
110 .setProcessInstanceName(instance.getName()) 100 .setProcessInstanceName(instance.getName())
111 .setProcessInstanceId(instance.getId()) 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,10 +6,10 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
6 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; 6 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
7 import cn.iocoder.yudao.framework.common.util.number.NumberUtils; 7 import cn.iocoder.yudao.framework.common.util.number.NumberUtils;
8 import cn.iocoder.yudao.framework.common.util.object.BeanUtils; 8 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
9 -import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.FlowableUtils;  
10 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceRespVO; 9 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceRespVO;
11 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskRespVO; 10 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskRespVO;
12 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO; 11 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO;
  12 +import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.FlowableUtils;
13 import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenTaskCreatedReqDTO; 13 import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenTaskCreatedReqDTO;
14 import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO; 14 import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
15 import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; 15 import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
@@ -18,6 +18,7 @@ import org.flowable.engine.runtime.ProcessInstance; @@ -18,6 +18,7 @@ import org.flowable.engine.runtime.ProcessInstance;
18 import org.flowable.task.api.Task; 18 import org.flowable.task.api.Task;
19 import org.flowable.task.api.history.HistoricTaskInstance; 19 import org.flowable.task.api.history.HistoricTaskInstance;
20 import org.flowable.task.service.impl.persistence.entity.TaskEntityImpl; 20 import org.flowable.task.service.impl.persistence.entity.TaskEntityImpl;
  21 +import org.mapstruct.Mapper;
21 import org.mapstruct.factory.Mappers; 22 import org.mapstruct.factory.Mappers;
22 23
23 import java.util.Date; 24 import java.util.Date;
@@ -32,6 +33,7 @@ import static cn.iocoder.yudao.framework.common.util.collection.MapUtils.findAnd @@ -32,6 +33,7 @@ import static cn.iocoder.yudao.framework.common.util.collection.MapUtils.findAnd
32 * 33 *
33 * @author 芋道源码 34 * @author 芋道源码
34 */ 35 */
  36 +@Mapper
35 public interface BpmTaskConvert { 37 public interface BpmTaskConvert {
36 38
37 BpmTaskConvert INSTANCE = Mappers.getMapper(BpmTaskConvert.class); 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,12 +57,12 @@ public class BpmOALeaveDO extends BaseDO {
57 */ 57 */
58 private Long day; 58 private Long day;
59 /** 59 /**
60 - * 请假的结果 60 + * 审批结果
61 * 61 *
62 * 枚举 {@link BpmTaskStatustEnum} 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,7 +19,7 @@ public interface BpmOALeaveMapper extends BaseMapperX&lt;BpmOALeaveDO&gt; {
19 default PageResult<BpmOALeaveDO> selectPage(Long userId, BpmOALeavePageReqVO reqVO) { 19 default PageResult<BpmOALeaveDO> selectPage(Long userId, BpmOALeavePageReqVO reqVO) {
20 return selectPage(reqVO, new LambdaQueryWrapperX<BpmOALeaveDO>() 20 return selectPage(reqVO, new LambdaQueryWrapperX<BpmOALeaveDO>()
21 .eqIfPresent(BpmOALeaveDO::getUserId, userId) 21 .eqIfPresent(BpmOALeaveDO::getUserId, userId)
22 - .eqIfPresent(BpmOALeaveDO::getResult, reqVO.getResult()) 22 + .eqIfPresent(BpmOALeaveDO::getStatus, reqVO.getStatus())
23 .eqIfPresent(BpmOALeaveDO::getType, reqVO.getType()) 23 .eqIfPresent(BpmOALeaveDO::getType, reqVO.getType())
24 .likeIfPresent(BpmOALeaveDO::getReason, reqVO.getReason()) 24 .likeIfPresent(BpmOALeaveDO::getReason, reqVO.getReason())
25 .betweenIfPresent(BpmOALeaveDO::getCreateTime, reqVO.getCreateTime()) 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 package cn.iocoder.yudao.module.bpm.framework.flowable.core.event; 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 import lombok.AllArgsConstructor; 4 import lombok.AllArgsConstructor;
5 import org.springframework.context.ApplicationEventPublisher; 5 import org.springframework.context.ApplicationEventPublisher;
6 import org.springframework.validation.annotation.Validated; 6 import org.springframework.validation.annotation.Validated;
@@ -8,7 +8,7 @@ import org.springframework.validation.annotation.Validated; @@ -8,7 +8,7 @@ import org.springframework.validation.annotation.Validated;
8 import jakarta.validation.Valid; 8 import jakarta.validation.Valid;
9 9
10 /** 10 /**
11 - * {@link BpmProcessInstanceResultEvent} 的生产者 11 + * {@link BpmProcessInstanceStatusEvent} 的生产者
12 * 12 *
13 * @author 芋道源码 13 * @author 芋道源码
14 */ 14 */
@@ -18,7 +18,7 @@ public class BpmProcessInstanceResultEventPublisher { @@ -18,7 +18,7 @@ public class BpmProcessInstanceResultEventPublisher {
18 18
19 private final ApplicationEventPublisher publisher; 19 private final ApplicationEventPublisher publisher;
20 20
21 - public void sendProcessInstanceResultEvent(@Valid BpmProcessInstanceResultEvent event) { 21 + public void sendProcessInstanceResultEvent(@Valid BpmProcessInstanceStatusEvent event) {
22 publisher.publishEvent(event); 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,9 +2,8 @@ package cn.iocoder.yudao.module.bpm.service.definition;
2 2
3 import cn.iocoder.yudao.framework.common.pojo.PageResult; 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; 4 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
5 -import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.form.BpmFormCreateReqVO;  
6 import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.form.BpmFormPageReqVO; 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 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO; 7 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO;
9 import jakarta.validation.Valid; 8 import jakarta.validation.Valid;
10 9
@@ -26,14 +25,14 @@ public interface BpmFormService { @@ -26,14 +25,14 @@ public interface BpmFormService {
26 * @param createReqVO 创建信息 25 * @param createReqVO 创建信息
27 * @return 编号 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 * @param updateReqVO 更新信息 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,10 +4,9 @@ import cn.hutool.core.collection.CollUtil;
4 import cn.hutool.core.lang.Assert; 4 import cn.hutool.core.lang.Assert;
5 import cn.iocoder.yudao.framework.common.pojo.PageResult; 5 import cn.iocoder.yudao.framework.common.pojo.PageResult;
6 import cn.iocoder.yudao.framework.common.util.json.JsonUtils; 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 import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.form.BpmFormPageReqVO; 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 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO; 10 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO;
12 import cn.iocoder.yudao.module.bpm.dal.mysql.definition.BpmFormMapper; 11 import cn.iocoder.yudao.module.bpm.dal.mysql.definition.BpmFormMapper;
13 import cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants; 12 import cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants;
@@ -33,22 +32,22 @@ public class BpmFormServiceImpl implements BpmFormService { @@ -33,22 +32,22 @@ public class BpmFormServiceImpl implements BpmFormService {
33 private BpmFormMapper formMapper; 32 private BpmFormMapper formMapper;
34 33
35 @Override 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 formMapper.insert(form); 39 formMapper.insert(form);
41 // 返回 40 // 返回
42 return form.getId(); 41 return form.getId();
43 } 42 }
44 43
45 @Override 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 formMapper.updateById(updateObj); 51 formMapper.updateById(updateObj);
53 } 52 }
54 53
@@ -94,7 +93,7 @@ public class BpmFormServiceImpl implements BpmFormService { @@ -94,7 +93,7 @@ public class BpmFormServiceImpl implements BpmFormService {
94 * 93 *
95 * @param fields field 数组 94 * @param fields field 数组
96 */ 95 */
97 - private void checkFields(List<String> fields) { 96 + private void vadateFields(List<String> fields) {
98 if (true) { // TODO 芋艿:兼容 Vue3 工作流:因为采用了新的表单设计器,所以暂时不校验 97 if (true) { // TODO 芋艿:兼容 Vue3 工作流:因为采用了新的表单设计器,所以暂时不校验
99 return; 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,7 +87,7 @@ public class BpmModelServiceImpl implements BpmModelService {
87 @Override 87 @Override
88 @Transactional(rollbackFor = Exception.class) 88 @Transactional(rollbackFor = Exception.class)
89 public String createModel(@Valid BpmModelCreateReqVO createReqVO, String bpmnXml) { 89 public String createModel(@Valid BpmModelCreateReqVO createReqVO, String bpmnXml) {
90 - if (!ValidationUtils.isXmlNCName(createReqVO.getName())) { 90 + if (!ValidationUtils.isXmlNCName(createReqVO.getKey())) {
91 throw exception(MODEL_KEY_VALID); 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,9 +29,9 @@ public interface BpmOALeaveService {
29 * 更新请假申请的状态 29 * 更新请假申请的状态
30 * 30 *
31 * @param id 编号 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,19 +2,19 @@ package cn.iocoder.yudao.module.bpm.service.oa;
2 2
3 import cn.hutool.core.date.LocalDateTimeUtil; 3 import cn.hutool.core.date.LocalDateTimeUtil;
4 import cn.iocoder.yudao.framework.common.pojo.PageResult; 4 import cn.iocoder.yudao.framework.common.pojo.PageResult;
  5 +import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
5 import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi; 6 import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi;
6 import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO; 7 import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO;
7 import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.BpmOALeaveCreateReqVO; 8 import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.BpmOALeaveCreateReqVO;
8 import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.BpmOALeavePageReqVO; 9 import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.BpmOALeavePageReqVO;
9 -import cn.iocoder.yudao.module.bpm.convert.oa.BpmOALeaveConvert;  
10 import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOALeaveDO; 10 import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOALeaveDO;
11 import cn.iocoder.yudao.module.bpm.dal.mysql.oa.BpmOALeaveMapper; 11 import cn.iocoder.yudao.module.bpm.dal.mysql.oa.BpmOALeaveMapper;
12 import cn.iocoder.yudao.module.bpm.enums.task.BpmTaskStatustEnum; 12 import cn.iocoder.yudao.module.bpm.enums.task.BpmTaskStatustEnum;
  13 +import jakarta.annotation.Resource;
13 import org.springframework.stereotype.Service; 14 import org.springframework.stereotype.Service;
14 import org.springframework.transaction.annotation.Transactional; 15 import org.springframework.transaction.annotation.Transactional;
15 import org.springframework.validation.annotation.Validated; 16 import org.springframework.validation.annotation.Validated;
16 17
17 -import jakarta.annotation.Resource;  
18 import java.util.HashMap; 18 import java.util.HashMap;
19 import java.util.Map; 19 import java.util.Map;
20 20
@@ -47,8 +47,8 @@ public class BpmOALeaveServiceImpl implements BpmOALeaveService { @@ -47,8 +47,8 @@ public class BpmOALeaveServiceImpl implements BpmOALeaveService {
47 public Long createLeave(Long userId, BpmOALeaveCreateReqVO createReqVO) { 47 public Long createLeave(Long userId, BpmOALeaveCreateReqVO createReqVO) {
48 // 插入 OA 请假单 48 // 插入 OA 请假单
49 long day = LocalDateTimeUtil.between(createReqVO.getStartTime(), createReqVO.getEndTime()).toDays(); 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 leaveMapper.insert(leave); 52 leaveMapper.insert(leave);
53 53
54 // 发起 BPM 流程 54 // 发起 BPM 流程
@@ -64,9 +64,9 @@ public class BpmOALeaveServiceImpl implements BpmOALeaveService { @@ -64,9 +64,9 @@ public class BpmOALeaveServiceImpl implements BpmOALeaveService {
64 } 64 }
65 65
66 @Override 66 @Override
67 - public void updateLeaveResult(Long id, Integer result) { 67 + public void updateLeaveStatus(Long id, Integer status) {
68 validateLeaveExists(id); 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 private void validateLeaveExists(Long id) { 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 package cn.iocoder.yudao.module.bpm.service.oa.listener; 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 import cn.iocoder.yudao.module.bpm.service.oa.BpmOALeaveService; 5 import cn.iocoder.yudao.module.bpm.service.oa.BpmOALeaveService;
6 import cn.iocoder.yudao.module.bpm.service.oa.BpmOALeaveServiceImpl; 6 import cn.iocoder.yudao.module.bpm.service.oa.BpmOALeaveServiceImpl;
7 import org.springframework.stereotype.Component; 7 import org.springframework.stereotype.Component;
@@ -14,7 +14,7 @@ import jakarta.annotation.Resource; @@ -14,7 +14,7 @@ import jakarta.annotation.Resource;
14 * @author 芋道源码 14 * @author 芋道源码
15 */ 15 */
16 @Component 16 @Component
17 -public class BpmOALeaveResultListener extends BpmProcessInstanceResultEventListener { 17 +public class BpmOALeaveStatusListener extends BpmProcessInstanceStatusEventListener {
18 18
19 @Resource 19 @Resource
20 private BpmOALeaveService leaveService; 20 private BpmOALeaveService leaveService;
@@ -25,8 +25,8 @@ public class BpmOALeaveResultListener extends BpmProcessInstanceResultEventListe @@ -25,8 +25,8 @@ public class BpmOALeaveResultListener extends BpmProcessInstanceResultEventListe
25 } 25 }
26 26
27 @Override 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,7 +5,6 @@ import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO;
5 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceCancelReqVO; 5 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceCancelReqVO;
6 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceCreateReqVO; 6 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceCreateReqVO;
7 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceMyPageReqVO; 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 import jakarta.validation.Valid; 8 import jakarta.validation.Valid;
10 import org.flowable.engine.delegate.event.FlowableCancelledEvent; 9 import org.flowable.engine.delegate.event.FlowableCancelledEvent;
11 import org.flowable.engine.history.HistoricProcessInstance; 10 import org.flowable.engine.history.HistoricProcessInstance;
@@ -116,14 +115,6 @@ public interface BpmProcessInstanceService { @@ -116,14 +115,6 @@ public interface BpmProcessInstanceService {
116 String createProcessInstance(Long userId, @Valid BpmProcessInstanceCreateReqDTO createReqDTO); 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 * @param userId 用户编号 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 \ No newline at end of file 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 \ No newline at end of file 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,8 +187,12 @@ public class BpmTaskServiceImpl implements BpmTaskService {
187 BpmCommentTypeEnum.APPROVE.formatComment(reqVO.getReason())); 187 BpmCommentTypeEnum.APPROVE.formatComment(reqVO.getReason()));
188 // 3.3 调用 BPM complete 去完成任务 188 // 3.3 调用 BPM complete 去完成任务
189 // 其中,variables 是存储动态表单到 local 任务级别。过滤一下,避免 ProcessInstance 系统级的变量被占用 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 handleParentTaskIfSign(task.getParentTaskId()); 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 \ No newline at end of file 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,7 +4,7 @@ import cn.hutool.core.util.RandomUtil;
4 import cn.iocoder.yudao.framework.common.pojo.PageResult; 4 import cn.iocoder.yudao.framework.common.pojo.PageResult;
5 import cn.iocoder.yudao.framework.common.util.json.JsonUtils; 5 import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
6 import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; 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 import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.form.BpmFormPageReqVO; 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; 9 import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.form.BpmFormUpdateReqVO;
10 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO; 10 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO;
@@ -43,7 +43,7 @@ public class BpmFormServiceTest extends BaseDbUnitTest { @@ -43,7 +43,7 @@ public class BpmFormServiceTest extends BaseDbUnitTest {
43 @Test 43 @Test
44 public void testCreateForm_success() { 44 public void testCreateForm_success() {
45 // 准备参数 45 // 准备参数
46 - BpmFormCreateReqVO reqVO = randomPojo(BpmFormCreateReqVO.class, o -> { 46 + BpmFormSaveReqVO reqVO = randomPojo(BpmFormSaveReqVO.class, o -> {
47 o.setConf("{}"); 47 o.setConf("{}");
48 o.setFields(randomFields()); 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 +7,6 @@ import cn.iocoder.yudao.framework.test.core.util.AssertUtils;
7 import cn.iocoder.yudao.framework.test.core.util.RandomUtils; 7 import cn.iocoder.yudao.framework.test.core.util.RandomUtils;
8 import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.group.BpmUserGroupSaveReqVO; 8 import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.group.BpmUserGroupSaveReqVO;
9 import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.group.BpmUserGroupPageReqVO; 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 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmUserGroupDO; 10 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmUserGroupDO;
12 import cn.iocoder.yudao.module.bpm.dal.mysql.definition.BpmUserGroupMapper; 11 import cn.iocoder.yudao.module.bpm.dal.mysql.definition.BpmUserGroupMapper;
13 import org.junit.jupiter.api.Assertions; 12 import org.junit.jupiter.api.Assertions;
@@ -56,7 +55,7 @@ public class BpmUserGroupServiceTest extends BaseDbUnitTest { @@ -56,7 +55,7 @@ public class BpmUserGroupServiceTest extends BaseDbUnitTest {
56 BpmUserGroupDO dbUserGroup = RandomUtils.randomPojo(BpmUserGroupDO.class); 55 BpmUserGroupDO dbUserGroup = RandomUtils.randomPojo(BpmUserGroupDO.class);
57 userGroupMapper.insert(dbUserGroup);// @Sql: 先插入出一条存在的数据 56 userGroupMapper.insert(dbUserGroup);// @Sql: 先插入出一条存在的数据
58 // 准备参数 57 // 准备参数
59 - BpmUserGroupUpdateReqVO reqVO = RandomUtils.randomPojo(BpmUserGroupUpdateReqVO.class, o -> { 58 + BpmUserGroupSaveReqVO reqVO = RandomUtils.randomPojo(BpmUserGroupSaveReqVO.class, o -> {
60 o.setId(dbUserGroup.getId()); // 设置更新的 ID 59 o.setId(dbUserGroup.getId()); // 设置更新的 ID
61 }); 60 });
62 61
@@ -70,7 +69,7 @@ public class BpmUserGroupServiceTest extends BaseDbUnitTest { @@ -70,7 +69,7 @@ public class BpmUserGroupServiceTest extends BaseDbUnitTest {
70 @Test 69 @Test
71 public void testUpdateUserGroup_notExists() { 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 AssertUtils.assertServiceException(() -> userGroupService.updateUserGroup(reqVO), USER_GROUP_NOT_EXISTS); 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,7 +3,7 @@ CREATE TABLE IF NOT EXISTS &quot;bpm_user_group&quot; (
3 "name" varchar(63) NOT NULL, 3 "name" varchar(63) NOT NULL,
4 "description" varchar(255) NOT NULL, 4 "description" varchar(255) NOT NULL,
5 "status" tinyint NOT NULL, 5 "status" tinyint NOT NULL,
6 - "member_user_ids" varchar(255) NOT NULL, 6 + "user_ids" varchar(255) NOT NULL,
7 "creator" varchar(64) DEFAULT '', 7 "creator" varchar(64) DEFAULT '',
8 "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 8 "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
9 "updater" varchar(64) DEFAULT '', 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 package cn.iocoder.yudao.module.crm.service.contract.listener; 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 import cn.iocoder.yudao.module.crm.service.contract.CrmContractService; 5 import cn.iocoder.yudao.module.crm.service.contract.CrmContractService;
6 import cn.iocoder.yudao.module.crm.service.contract.CrmContractServiceImpl; 6 import cn.iocoder.yudao.module.crm.service.contract.CrmContractServiceImpl;
7 import jakarta.annotation.Resource; 7 import jakarta.annotation.Resource;
@@ -13,7 +13,7 @@ import org.springframework.stereotype.Component; @@ -13,7 +13,7 @@ import org.springframework.stereotype.Component;
13 * @author HUIHUI 13 * @author HUIHUI
14 */ 14 */
15 @Component 15 @Component
16 -public class CrmContractResultListener extends BpmProcessInstanceResultEventListener { 16 +public class CrmContractStatusListener extends BpmProcessInstanceStatusEventListener {
17 17
18 @Resource 18 @Resource
19 private CrmContractService contractService; 19 private CrmContractService contractService;
@@ -24,8 +24,8 @@ public class CrmContractResultListener extends BpmProcessInstanceResultEventList @@ -24,8 +24,8 @@ public class CrmContractResultListener extends BpmProcessInstanceResultEventList
24 } 24 }
25 25
26 @Override 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 package cn.iocoder.yudao.module.crm.service.receivable.listener; 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 import cn.iocoder.yudao.module.crm.service.receivable.CrmReceivableService; 5 import cn.iocoder.yudao.module.crm.service.receivable.CrmReceivableService;
6 import cn.iocoder.yudao.module.crm.service.receivable.CrmReceivableServiceImpl; 6 import cn.iocoder.yudao.module.crm.service.receivable.CrmReceivableServiceImpl;
7 import jakarta.annotation.Resource; 7 import jakarta.annotation.Resource;
@@ -13,7 +13,7 @@ import org.springframework.stereotype.Component; @@ -13,7 +13,7 @@ import org.springframework.stereotype.Component;
13 * @author HUIHUI 13 * @author HUIHUI
14 */ 14 */
15 @Component 15 @Component
16 -public class CrmReceivableResultListener extends BpmProcessInstanceResultEventListener { 16 +public class CrmReceivableStatusListener extends BpmProcessInstanceStatusEventListener {
17 17
18 @Resource 18 @Resource
19 private CrmReceivableService receivableService; 19 private CrmReceivableService receivableService;
@@ -24,8 +24,8 @@ public class CrmReceivableResultListener extends BpmProcessInstanceResultEventLi @@ -24,8 +24,8 @@ public class CrmReceivableResultListener extends BpmProcessInstanceResultEventLi
24 } 24 }
25 25
26 @Override 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,7 +59,7 @@ flowable:
59 database-schema-update: true # 设置为 false,可通过 https://github.com/flowable/flowable-sql 初始化 59 database-schema-update: true # 设置为 false,可通过 https://github.com/flowable/flowable-sql 初始化
60 db-history-used: true # flowable6 默认 true 生成信息表,无需手动设置 60 db-history-used: true # flowable6 默认 true 生成信息表,无需手动设置
61 check-process-definitions: false # 设置为 false,禁用 /resources/processes 自动部署 BPMN XML 流程 61 check-process-definitions: false # 设置为 false,禁用 /resources/processes 自动部署 BPMN XML 流程
62 - history-level: full # full:保存历史数据的最高级别,可保存全部流程相关细节,包括流程流转各节点参数 62 + history-level: audit # full:保存历史数据的最高级别,可保存全部流程相关细节,包括流程流转各节点参数
63 63
64 # MyBatis Plus 的配置项 64 # MyBatis Plus 的配置项
65 mybatis-plus: 65 mybatis-plus: