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