Commit 5437775172bacfa97459e9b8158a17384a396b3a
1 parent
7c62b1a2
增加 BpmProcessInstanceResultEvent 实现,实现自定义的流程实例的状态的监听
Showing
15 changed files
with
224 additions
and
64 deletions
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/oa/vo/BpmOALeaveCreateReqVO.java
| 1 | package cn.iocoder.yudao.adminserver.modules.bpm.controller.oa.vo; | 1 | package cn.iocoder.yudao.adminserver.modules.bpm.controller.oa.vo; |
| 2 | 2 | ||
| 3 | -import lombok.*; | ||
| 4 | -import io.swagger.annotations.*; | ||
| 5 | -import org.springframework.format.annotation.DateTimeFormat; | 3 | +import io.swagger.annotations.ApiModel; |
| 4 | +import lombok.Data; | ||
| 5 | +import lombok.EqualsAndHashCode; | ||
| 6 | +import lombok.ToString; | ||
| 6 | 7 | ||
| 7 | -import javax.validation.constraints.NotNull; | ||
| 8 | -import java.util.Date; | ||
| 9 | -import java.util.Map; | ||
| 10 | - | ||
| 11 | -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; | 8 | +import javax.validation.constraints.AssertTrue; |
| 12 | 9 | ||
| 13 | @ApiModel("请假申请创建 Request VO") | 10 | @ApiModel("请假申请创建 Request VO") |
| 14 | @Data | 11 | @Data |
| 15 | @EqualsAndHashCode(callSuper = true) | 12 | @EqualsAndHashCode(callSuper = true) |
| 16 | @ToString(callSuper = true) | 13 | @ToString(callSuper = true) |
| 17 | public class BpmOALeaveCreateReqVO extends BpmOALeaveBaseVO { | 14 | public class BpmOALeaveCreateReqVO extends BpmOALeaveBaseVO { |
| 15 | + | ||
| 16 | + @AssertTrue(message = "结束时间,需要在开始时间之后") | ||
| 17 | + public boolean isEndTimeValid() { | ||
| 18 | + return !getEndTime().before(getStartTime()); | ||
| 19 | + } | ||
| 20 | + | ||
| 18 | } | 21 | } |
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/convert/task/BpmProcessInstanceConvert.java
| @@ -5,6 +5,7 @@ import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.instance.BpmP | @@ -5,6 +5,7 @@ import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.instance.BpmP | ||
| 5 | import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.task.BpmTaskRespVO; | 5 | import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.task.BpmTaskRespVO; |
| 6 | import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO; | 6 | import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.definition.BpmProcessDefinitionExtDO; |
| 7 | import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.task.BpmProcessInstanceExtDO; | 7 | import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.task.BpmProcessInstanceExtDO; |
| 8 | +import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.event.BpmProcessInstanceResultEvent; | ||
| 8 | import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysDeptDO; | 9 | import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysDeptDO; |
| 9 | import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; | 10 | import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO; |
| 10 | import cn.iocoder.yudao.framework.common.pojo.PageResult; | 11 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| @@ -98,4 +99,22 @@ public interface BpmProcessInstanceConvert { | @@ -98,4 +99,22 @@ public interface BpmProcessInstanceConvert { | ||
| 98 | void copyTo(BpmProcessDefinitionExtDO from, @MappingTarget BpmProcessInstanceRespVO.ProcessDefinition to); | 99 | void copyTo(BpmProcessDefinitionExtDO from, @MappingTarget BpmProcessInstanceRespVO.ProcessDefinition to); |
| 99 | BpmProcessInstanceRespVO.User convert2(SysUserDO bean); | 100 | BpmProcessInstanceRespVO.User convert2(SysUserDO bean); |
| 100 | 101 | ||
| 102 | + default BpmProcessInstanceResultEvent convert(Object source, ProcessInstance instance, Integer result) { | ||
| 103 | + BpmProcessInstanceResultEvent event = new BpmProcessInstanceResultEvent(source); | ||
| 104 | + event.setId(instance.getId()); | ||
| 105 | + event.setProcessDefinitionKey(instance.getProcessDefinitionKey()); | ||
| 106 | + event.setBusinessKey(instance.getBusinessKey()); | ||
| 107 | + event.setResult(result); | ||
| 108 | + return event; | ||
| 109 | + } | ||
| 110 | + | ||
| 111 | + default BpmProcessInstanceResultEvent convert(Object source, HistoricProcessInstance instance, Integer result) { | ||
| 112 | + BpmProcessInstanceResultEvent event = new BpmProcessInstanceResultEvent(source); | ||
| 113 | + event.setId(instance.getId()); | ||
| 114 | + event.setProcessDefinitionKey(instance.getProcessDefinitionKey()); | ||
| 115 | + event.setBusinessKey(instance.getBusinessKey()); | ||
| 116 | + event.setResult(result); | ||
| 117 | + return event; | ||
| 118 | + } | ||
| 119 | + | ||
| 101 | } | 120 | } |
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/task/BpmProcessInstanceDeleteReasonEnum.java
| @@ -13,7 +13,8 @@ import lombok.Getter; | @@ -13,7 +13,8 @@ import lombok.Getter; | ||
| 13 | @AllArgsConstructor | 13 | @AllArgsConstructor |
| 14 | public enum BpmProcessInstanceDeleteReasonEnum { | 14 | public enum BpmProcessInstanceDeleteReasonEnum { |
| 15 | 15 | ||
| 16 | - REJECT_TASK("不通过任务,原因:{}"); // 修改文案时,需要注意 isRejectReason 方法 | 16 | + REJECT_TASK("不通过任务,原因:{}"), // 修改文案时,需要注意 isRejectReason 方法 |
| 17 | + CANCEL_TASK("主动取消任务,原因:{}"); | ||
| 17 | 18 | ||
| 18 | private final String reason; | 19 | private final String reason; |
| 19 | 20 |
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/config/BpmActivitiConfiguration.java
| @@ -2,6 +2,7 @@ package cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.config; | @@ -2,6 +2,7 @@ package cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.config; | ||
| 2 | 2 | ||
| 3 | import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.behavior.BpmActivityBehaviorFactory; | 3 | import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.behavior.BpmActivityBehaviorFactory; |
| 4 | import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.behavior.script.BpmTaskAssignScript; | 4 | import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.behavior.script.BpmTaskAssignScript; |
| 5 | +import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.event.BpmProcessInstanceResultEventPublisher; | ||
| 5 | import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.identity.EmptyUserGroupManager; | 6 | import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.identity.EmptyUserGroupManager; |
| 6 | import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.listener.BpmTackActivitiEventListener; | 7 | import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.listener.BpmTackActivitiEventListener; |
| 7 | import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmTaskAssignRuleService; | 8 | import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmTaskAssignRuleService; |
| @@ -11,6 +12,7 @@ import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysPermiss | @@ -11,6 +12,7 @@ import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysPermiss | ||
| 11 | import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService; | 12 | import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService; |
| 12 | import org.activiti.api.runtime.shared.identity.UserGroupManager; | 13 | import org.activiti.api.runtime.shared.identity.UserGroupManager; |
| 13 | import org.activiti.spring.boot.ProcessEngineConfigurationConfigurer; | 14 | import org.activiti.spring.boot.ProcessEngineConfigurationConfigurer; |
| 15 | +import org.springframework.context.ApplicationEventPublisher; | ||
| 14 | import org.springframework.context.annotation.Bean; | 16 | import org.springframework.context.annotation.Bean; |
| 15 | import org.springframework.context.annotation.Configuration; | 17 | import org.springframework.context.annotation.Configuration; |
| 16 | 18 | ||
| @@ -71,4 +73,9 @@ public class BpmActivitiConfiguration { | @@ -71,4 +73,9 @@ public class BpmActivitiConfiguration { | ||
| 71 | return bpmActivityBehaviorFactory; | 73 | return bpmActivityBehaviorFactory; |
| 72 | } | 74 | } |
| 73 | 75 | ||
| 76 | + @Bean | ||
| 77 | + public BpmProcessInstanceResultEventPublisher processInstanceResultEventPublisher(ApplicationEventPublisher publisher) { | ||
| 78 | + return new BpmProcessInstanceResultEventPublisher(publisher); | ||
| 79 | + } | ||
| 80 | + | ||
| 74 | } | 81 | } |
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/event/BpmProcessInstanceResultEvent.java
0 → 100644
| 1 | +package cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.event; | ||
| 2 | + | ||
| 3 | +import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.task.BpmProcessInstanceExtDO; | ||
| 4 | +import lombok.Data; | ||
| 5 | +import org.springframework.context.ApplicationEvent; | ||
| 6 | + | ||
| 7 | +import javax.validation.constraints.NotNull; | ||
| 8 | + | ||
| 9 | +/** | ||
| 10 | + * 流程实例的结果发生变化的 Event | ||
| 11 | + * 定位:由于额外增加了 {@link BpmProcessInstanceExtDO#getResult()} 结果,所以增加该事件 | ||
| 12 | + * | ||
| 13 | + * @author 芋道源码 | ||
| 14 | + */ | ||
| 15 | +@SuppressWarnings("ALL") | ||
| 16 | +@Data | ||
| 17 | +public class BpmProcessInstanceResultEvent extends ApplicationEvent { | ||
| 18 | + | ||
| 19 | + /** | ||
| 20 | + * 流程实例的编号 | ||
| 21 | + */ | ||
| 22 | + @NotNull(message = "流程实例的编号不能为空") | ||
| 23 | + private String id; | ||
| 24 | + /** | ||
| 25 | + * 流程实例的 key | ||
| 26 | + */ | ||
| 27 | + @NotNull(message = "流程实例的 key 不能为空") | ||
| 28 | + private String processDefinitionKey; | ||
| 29 | + /** | ||
| 30 | + * 流程实例的结果 | ||
| 31 | + */ | ||
| 32 | + @NotNull(message = "流程实例的结果不能为空") | ||
| 33 | + private Integer result; | ||
| 34 | + /** | ||
| 35 | + * 流程实例对应的业务标识 | ||
| 36 | + * 例如说,请假 | ||
| 37 | + */ | ||
| 38 | + private String businessKey; | ||
| 39 | + | ||
| 40 | + public BpmProcessInstanceResultEvent(Object source) { | ||
| 41 | + super(source); | ||
| 42 | + } | ||
| 43 | + | ||
| 44 | +} |
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/event/BpmProcessInstanceResultEventListener.java
0 → 100644
| 1 | +package cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.event; | ||
| 2 | + | ||
| 3 | +import cn.hutool.core.util.StrUtil; | ||
| 4 | +import org.springframework.context.ApplicationListener; | ||
| 5 | + | ||
| 6 | +/** | ||
| 7 | + * {@link BpmProcessInstanceResultEvent} 的监听器 | ||
| 8 | + * | ||
| 9 | + * @author 芋道源码 | ||
| 10 | + */ | ||
| 11 | +public abstract class BpmProcessInstanceResultEventListener | ||
| 12 | + implements ApplicationListener<BpmProcessInstanceResultEvent> { | ||
| 13 | + | ||
| 14 | + @Override | ||
| 15 | + public final void onApplicationEvent(BpmProcessInstanceResultEvent event) { | ||
| 16 | + if (!StrUtil.equals(event.getProcessDefinitionKey(), getProcessDefinitionKey())) { | ||
| 17 | + return; | ||
| 18 | + } | ||
| 19 | + onEvent(event); | ||
| 20 | + } | ||
| 21 | + | ||
| 22 | + /** | ||
| 23 | + * @return 返回监听的流程定义 Key | ||
| 24 | + */ | ||
| 25 | + protected abstract String getProcessDefinitionKey(); | ||
| 26 | + | ||
| 27 | + /** | ||
| 28 | + * 处理事件 | ||
| 29 | + * | ||
| 30 | + * @param event 事件 | ||
| 31 | + */ | ||
| 32 | + protected abstract void onEvent(BpmProcessInstanceResultEvent event); | ||
| 33 | + | ||
| 34 | +} |
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/event/BpmProcessInstanceResultEventPublisher.java
0 → 100644
| 1 | +package cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.event; | ||
| 2 | + | ||
| 3 | +import lombok.AllArgsConstructor; | ||
| 4 | +import org.springframework.context.ApplicationEventPublisher; | ||
| 5 | +import org.springframework.validation.annotation.Validated; | ||
| 6 | + | ||
| 7 | +import javax.validation.Valid; | ||
| 8 | + | ||
| 9 | +/** | ||
| 10 | + * {@link BpmProcessInstanceResultEvent} 的生产者 | ||
| 11 | + * | ||
| 12 | + * @author 芋道源码 | ||
| 13 | + */ | ||
| 14 | +@AllArgsConstructor | ||
| 15 | +@Validated | ||
| 16 | +public class BpmProcessInstanceResultEventPublisher { | ||
| 17 | + | ||
| 18 | + private final ApplicationEventPublisher publisher; | ||
| 19 | + | ||
| 20 | + public void sendProcessInstanceResultEvent(@Valid BpmProcessInstanceResultEvent event) { | ||
| 21 | + publisher.publishEvent(event); | ||
| 22 | + } | ||
| 23 | + | ||
| 24 | +} |
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/event/package-info.java
0 → 100644
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/definition/dto/BpmProcessDefinitionCreateReqDTO.java
| @@ -2,10 +2,7 @@ package cn.iocoder.yudao.adminserver.modules.bpm.service.definition.dto; | @@ -2,10 +2,7 @@ package cn.iocoder.yudao.adminserver.modules.bpm.service.definition.dto; | ||
| 2 | 2 | ||
| 3 | import cn.hutool.core.collection.CollUtil; | 3 | import cn.hutool.core.collection.CollUtil; |
| 4 | import cn.hutool.core.util.StrUtil; | 4 | import cn.hutool.core.util.StrUtil; |
| 5 | -import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.definition.BpmFormDO; | ||
| 6 | import cn.iocoder.yudao.adminserver.modules.bpm.enums.definition.BpmModelFormTypeEnum; | 5 | import cn.iocoder.yudao.adminserver.modules.bpm.enums.definition.BpmModelFormTypeEnum; |
| 7 | -import com.baomidou.mybatisplus.annotation.TableField; | ||
| 8 | -import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; | ||
| 9 | import lombok.Data; | 6 | import lombok.Data; |
| 10 | 7 | ||
| 11 | import javax.validation.constraints.AssertTrue; | 8 | import javax.validation.constraints.AssertTrue; |
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/oa/BpmOALeaveService.java
| @@ -25,6 +25,14 @@ public interface BpmOALeaveService { | @@ -25,6 +25,14 @@ public interface BpmOALeaveService { | ||
| 25 | Long createLeave(Long userId, @Valid BpmOALeaveCreateReqVO createReqVO); | 25 | Long createLeave(Long userId, @Valid BpmOALeaveCreateReqVO createReqVO); |
| 26 | 26 | ||
| 27 | /** | 27 | /** |
| 28 | + * 更新请假申请的状态 | ||
| 29 | + * | ||
| 30 | + * @param id 编号 | ||
| 31 | + * @param result 结果 | ||
| 32 | + */ | ||
| 33 | + void updateLeaveResult(Long id, Integer result); | ||
| 34 | + | ||
| 35 | + /** | ||
| 28 | * 删除请假申请 | 36 | * 删除请假申请 |
| 29 | * | 37 | * |
| 30 | * @param id 编号 | 38 | * @param id 编号 |
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/oa/LeaveApplyEndProcessor.java deleted
| 1 | -package cn.iocoder.yudao.adminserver.modules.bpm.service.oa; | ||
| 2 | - | ||
| 3 | -import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.leave.OALeaveDO; | ||
| 4 | -import cn.iocoder.yudao.adminserver.modules.bpm.dal.mysql.oa.BpmOALeaveMapper; | ||
| 5 | -import cn.iocoder.yudao.adminserver.modules.bpm.enums.task.BpmProcessInstanceResultEnum; | ||
| 6 | -import org.activiti.engine.delegate.DelegateExecution; | ||
| 7 | -import org.activiti.engine.delegate.ExecutionListener; | ||
| 8 | -import org.springframework.stereotype.Component; | ||
| 9 | -import org.springframework.transaction.annotation.Transactional; | ||
| 10 | - | ||
| 11 | -import javax.annotation.Resource; | ||
| 12 | -import java.util.Objects; | ||
| 13 | - | ||
| 14 | - | ||
| 15 | -/** | ||
| 16 | - * 请假流程结束流程监听处理服务, 根据请假申请审批通过,还是未通过, 更新请假表单 | ||
| 17 | - */ | ||
| 18 | -@Component | ||
| 19 | -public class LeaveApplyEndProcessor implements ExecutionListener { | ||
| 20 | - | ||
| 21 | - @Resource | ||
| 22 | - private BpmOALeaveMapper leaveMapper; | ||
| 23 | - | ||
| 24 | - @Override | ||
| 25 | - @Transactional(rollbackFor = Exception.class) | ||
| 26 | - public void notify(DelegateExecution delegateExecution) { | ||
| 27 | - final String businessKey = delegateExecution.getProcessInstanceBusinessKey(); | ||
| 28 | - final Object approved = delegateExecution.getVariable("approved"); | ||
| 29 | - OALeaveDO updateDo = new OALeaveDO(); | ||
| 30 | - updateDo.setId(Long.valueOf(businessKey)); | ||
| 31 | - if (Objects.equals(approved, true)) { | ||
| 32 | - updateDo.setResult(BpmProcessInstanceResultEnum.APPROVE.getResult()); | ||
| 33 | - } else { | ||
| 34 | - updateDo.setResult(BpmProcessInstanceResultEnum.REJECT.getResult()); | ||
| 35 | - } | ||
| 36 | - | ||
| 37 | - leaveMapper.updateById(updateDo); | ||
| 38 | - } | ||
| 39 | - | ||
| 40 | -} |
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/oa/impl/OALeaveServiceImpl.java
| @@ -34,7 +34,7 @@ public class OALeaveServiceImpl implements BpmOALeaveService { | @@ -34,7 +34,7 @@ public class OALeaveServiceImpl implements BpmOALeaveService { | ||
| 34 | /** | 34 | /** |
| 35 | * OA 请假对应的流程定义 KEY | 35 | * OA 请假对应的流程定义 KEY |
| 36 | */ | 36 | */ |
| 37 | - private static final String PROCESS_KEY = "oa_leave"; | 37 | + public static final String PROCESS_KEY = "oa_leave"; |
| 38 | 38 | ||
| 39 | @Resource | 39 | @Resource |
| 40 | private BpmOALeaveMapper leaveMapper; | 40 | private BpmOALeaveMapper leaveMapper; |
| @@ -45,14 +45,8 @@ public class OALeaveServiceImpl implements BpmOALeaveService { | @@ -45,14 +45,8 @@ public class OALeaveServiceImpl implements BpmOALeaveService { | ||
| 45 | @Override | 45 | @Override |
| 46 | @Transactional(rollbackFor = Exception.class) | 46 | @Transactional(rollbackFor = Exception.class) |
| 47 | public Long createLeave(Long userId, BpmOALeaveCreateReqVO createReqVO) { | 47 | public Long createLeave(Long userId, BpmOALeaveCreateReqVO createReqVO) { |
| 48 | - // TODO 芋道源码 | ||
| 49 | - // 校验是否超过请假天数的上限; | ||
| 50 | - long day = DateUtil.betweenDay(createReqVO.getStartTime(), createReqVO.getEndTime(), false); | ||
| 51 | - if (day <= 0) { | ||
| 52 | - throw ServiceExceptionUtil.exception(OA_DAY_LEAVE_ERROR); | ||
| 53 | - } | ||
| 54 | - | ||
| 55 | // 插入 OA 请假单 | 48 | // 插入 OA 请假单 |
| 49 | + long day = DateUtil.betweenDay(createReqVO.getStartTime(), createReqVO.getEndTime(), false); | ||
| 56 | OALeaveDO leave = OALeaveConvert.INSTANCE.convert(createReqVO).setUserId(userId).setDay(day) | 50 | OALeaveDO leave = OALeaveConvert.INSTANCE.convert(createReqVO).setUserId(userId).setDay(day) |
| 57 | .setResult(BpmProcessInstanceResultEnum.PROCESS.getResult()); | 51 | .setResult(BpmProcessInstanceResultEnum.PROCESS.getResult()); |
| 58 | leaveMapper.insert(leave); | 52 | leaveMapper.insert(leave); |
| @@ -70,6 +64,11 @@ public class OALeaveServiceImpl implements BpmOALeaveService { | @@ -70,6 +64,11 @@ public class OALeaveServiceImpl implements BpmOALeaveService { | ||
| 70 | } | 64 | } |
| 71 | 65 | ||
| 72 | @Override | 66 | @Override |
| 67 | + public void updateLeaveResult(Long id, Integer result) { | ||
| 68 | + leaveMapper.updateById(new OALeaveDO().setId(id).setResult(result)); | ||
| 69 | + } | ||
| 70 | + | ||
| 71 | + @Override | ||
| 73 | public void cancelLeave(Long id) { | 72 | public void cancelLeave(Long id) { |
| 74 | // TODO 需要重新实现 | 73 | // TODO 需要重新实现 |
| 75 | // 校验存在 | 74 | // 校验存在 |
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/oa/listener/BpmOALeaveResultListener.java
0 → 100644
| 1 | +package cn.iocoder.yudao.adminserver.modules.bpm.service.oa.listener; | ||
| 2 | + | ||
| 3 | +import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.event.BpmProcessInstanceResultEvent; | ||
| 4 | +import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.event.BpmProcessInstanceResultEventListener; | ||
| 5 | +import cn.iocoder.yudao.adminserver.modules.bpm.service.oa.BpmOALeaveService; | ||
| 6 | +import cn.iocoder.yudao.adminserver.modules.bpm.service.oa.impl.OALeaveServiceImpl; | ||
| 7 | +import org.springframework.stereotype.Component; | ||
| 8 | + | ||
| 9 | +import javax.annotation.Resource; | ||
| 10 | + | ||
| 11 | +/** | ||
| 12 | + * OA 请假单的结果的监听器实现类 | ||
| 13 | + * | ||
| 14 | + * @author 芋道源码 | ||
| 15 | + */ | ||
| 16 | +@Component | ||
| 17 | +public class BpmOALeaveResultListener extends BpmProcessInstanceResultEventListener { | ||
| 18 | + | ||
| 19 | + @Resource | ||
| 20 | + private BpmOALeaveService leaveService; | ||
| 21 | + | ||
| 22 | + @Override | ||
| 23 | + protected String getProcessDefinitionKey() { | ||
| 24 | + return OALeaveServiceImpl.PROCESS_KEY; | ||
| 25 | + } | ||
| 26 | + | ||
| 27 | + @Override | ||
| 28 | + protected void onEvent(BpmProcessInstanceResultEvent event) { | ||
| 29 | + leaveService.updateLeaveResult(Long.parseLong(event.getBusinessKey()), event.getResult()); | ||
| 30 | + } | ||
| 31 | + | ||
| 32 | +} |
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/BpmProcessInstanceService.java
| @@ -152,7 +152,6 @@ public interface BpmProcessInstanceService { | @@ -152,7 +152,6 @@ public interface BpmProcessInstanceService { | ||
| 152 | * 更新 ProcessInstance 拓展记录为完成 | 152 | * 更新 ProcessInstance 拓展记录为完成 |
| 153 | * | 153 | * |
| 154 | * @param instance 流程任务 | 154 | * @param instance 流程任务 |
| 155 | - * @param reason 原因 | ||
| 156 | */ | 155 | */ |
| 157 | void updateProcessInstanceExtComplete(org.activiti.api.process.model.ProcessInstance instance); | 156 | void updateProcessInstanceExtComplete(org.activiti.api.process.model.ProcessInstance instance); |
| 158 | 157 |
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/impl/BpmProcessInstanceServiceImpl.java
| @@ -12,6 +12,9 @@ import cn.iocoder.yudao.adminserver.modules.bpm.dal.mysql.task.BpmProcessInstanc | @@ -12,6 +12,9 @@ import cn.iocoder.yudao.adminserver.modules.bpm.dal.mysql.task.BpmProcessInstanc | ||
| 12 | import cn.iocoder.yudao.adminserver.modules.bpm.enums.task.BpmProcessInstanceDeleteReasonEnum; | 12 | import cn.iocoder.yudao.adminserver.modules.bpm.enums.task.BpmProcessInstanceDeleteReasonEnum; |
| 13 | import cn.iocoder.yudao.adminserver.modules.bpm.enums.task.BpmProcessInstanceResultEnum; | 13 | import cn.iocoder.yudao.adminserver.modules.bpm.enums.task.BpmProcessInstanceResultEnum; |
| 14 | import cn.iocoder.yudao.adminserver.modules.bpm.enums.task.BpmProcessInstanceStatusEnum; | 14 | import cn.iocoder.yudao.adminserver.modules.bpm.enums.task.BpmProcessInstanceStatusEnum; |
| 15 | +import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.event.BpmProcessInstanceResultEvent; | ||
| 16 | +import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.event.BpmProcessInstanceResultEventListener; | ||
| 17 | +import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.event.BpmProcessInstanceResultEventPublisher; | ||
| 15 | import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmProcessDefinitionService; | 18 | import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmProcessDefinitionService; |
| 16 | import cn.iocoder.yudao.adminserver.modules.bpm.service.message.BpmMessageService; | 19 | import cn.iocoder.yudao.adminserver.modules.bpm.service.message.BpmMessageService; |
| 17 | import cn.iocoder.yudao.adminserver.modules.bpm.service.task.BpmProcessInstanceService; | 20 | import cn.iocoder.yudao.adminserver.modules.bpm.service.task.BpmProcessInstanceService; |
| @@ -77,6 +80,9 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService | @@ -77,6 +80,9 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService | ||
| 77 | private BpmMessageService messageService; | 80 | private BpmMessageService messageService; |
| 78 | 81 | ||
| 79 | @Resource | 82 | @Resource |
| 83 | + private BpmProcessInstanceResultEventPublisher processInstanceResultEventPublisher; | ||
| 84 | + | ||
| 85 | + @Resource | ||
| 80 | private BpmProcessInstanceExtMapper processInstanceExtMapper; | 86 | private BpmProcessInstanceExtMapper processInstanceExtMapper; |
| 81 | 87 | ||
| 82 | @Override | 88 | @Override |
| @@ -141,7 +147,8 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService | @@ -141,7 +147,8 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService | ||
| 141 | } | 147 | } |
| 142 | 148 | ||
| 143 | // 通过删除流程实例,实现流程实例的取消 | 149 | // 通过删除流程实例,实现流程实例的取消 |
| 144 | - runtimeService.deleteProcessInstance(cancelReqVO.getId(), cancelReqVO.getReason()); | 150 | + runtimeService.deleteProcessInstance(cancelReqVO.getId(), |
| 151 | + BpmProcessInstanceDeleteReasonEnum.CANCEL_TASK.format(cancelReqVO.getReason())); | ||
| 145 | } | 152 | } |
| 146 | 153 | ||
| 147 | @Override | 154 | @Override |
| @@ -247,16 +254,26 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService | @@ -247,16 +254,26 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService | ||
| 247 | return; | 254 | return; |
| 248 | } | 255 | } |
| 249 | 256 | ||
| 257 | + // 需要主动查询,因为 instance 只有 id 属性 | ||
| 258 | + ProcessInstance processInstance = getProcessInstance(instance.getId()); | ||
| 250 | // 更新拓展表 | 259 | // 更新拓展表 |
| 251 | BpmProcessInstanceExtDO instanceExtDO = BpmProcessInstanceConvert.INSTANCE.convert(instance) | 260 | BpmProcessInstanceExtDO instanceExtDO = BpmProcessInstanceConvert.INSTANCE.convert(instance) |
| 252 | .setEndTime(new Date()) // 由于 ProcessInstance 里没有办法拿到 endTime,所以这里设置 | 261 | .setEndTime(new Date()) // 由于 ProcessInstance 里没有办法拿到 endTime,所以这里设置 |
| 253 | .setStatus(BpmProcessInstanceStatusEnum.FINISH.getStatus()) | 262 | .setStatus(BpmProcessInstanceStatusEnum.FINISH.getStatus()) |
| 254 | .setResult(BpmProcessInstanceResultEnum.CANCEL.getResult()); | 263 | .setResult(BpmProcessInstanceResultEnum.CANCEL.getResult()); |
| 255 | processInstanceExtMapper.updateByProcessInstanceId(instanceExtDO); | 264 | processInstanceExtMapper.updateByProcessInstanceId(instanceExtDO); |
| 265 | + | ||
| 266 | + // 发送流程实例的状态事件 | ||
| 267 | + processInstanceResultEventPublisher.sendProcessInstanceResultEvent( | ||
| 268 | + BpmProcessInstanceConvert.INSTANCE.convert(this, processInstance, instanceExtDO.getResult())); | ||
| 256 | } | 269 | } |
| 257 | 270 | ||
| 258 | @Override | 271 | @Override |
| 259 | public void updateProcessInstanceExtComplete(org.activiti.api.process.model.ProcessInstance instance) { | 272 | public void updateProcessInstanceExtComplete(org.activiti.api.process.model.ProcessInstance instance) { |
| 273 | + // 需要主动查询,因为 instance 只有 id 属性 | ||
| 274 | + // 另外,此时如果去查询 ProcessInstance 的话,字段是不全的,所以去查询了 HistoricProcessInstance | ||
| 275 | + HistoricProcessInstance processInstance = getHistoricProcessInstance(instance.getId()); | ||
| 276 | + // 更新拓展表 | ||
| 260 | BpmProcessInstanceExtDO instanceExtDO = BpmProcessInstanceConvert.INSTANCE.convert(instance) | 277 | BpmProcessInstanceExtDO instanceExtDO = BpmProcessInstanceConvert.INSTANCE.convert(instance) |
| 261 | .setEndTime(new Date()) // 由于 ProcessInstance 里没有办法拿到 endTime,所以这里设置 | 278 | .setEndTime(new Date()) // 由于 ProcessInstance 里没有办法拿到 endTime,所以这里设置 |
| 262 | .setStatus(BpmProcessInstanceStatusEnum.FINISH.getStatus()) | 279 | .setStatus(BpmProcessInstanceStatusEnum.FINISH.getStatus()) |
| @@ -265,10 +282,15 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService | @@ -265,10 +282,15 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService | ||
| 265 | 282 | ||
| 266 | // 发送流程被通过的消息 | 283 | // 发送流程被通过的消息 |
| 267 | messageService.sendMessageWhenProcessInstanceApprove(BpmMessageConvert.INSTANCE.convert(instance)); | 284 | messageService.sendMessageWhenProcessInstanceApprove(BpmMessageConvert.INSTANCE.convert(instance)); |
| 285 | + | ||
| 286 | + // 发送流程实例的状态事件 | ||
| 287 | + processInstanceResultEventPublisher.sendProcessInstanceResultEvent( | ||
| 288 | + BpmProcessInstanceConvert.INSTANCE.convert(this, processInstance, instanceExtDO.getResult())); | ||
| 268 | } | 289 | } |
| 269 | 290 | ||
| 270 | @Transactional(rollbackFor = Exception.class) | 291 | @Transactional(rollbackFor = Exception.class) |
| 271 | public void updateProcessInstanceExtReject(String id, String comment) { | 292 | public void updateProcessInstanceExtReject(String id, String comment) { |
| 293 | + // 需要主动查询,因为 instance 只有 id 属性 | ||
| 272 | ProcessInstance processInstance = getProcessInstance(id); | 294 | ProcessInstance processInstance = getProcessInstance(id); |
| 273 | // 删除流程实例,以实现驳回任务时,取消整个审批流程 | 295 | // 删除流程实例,以实现驳回任务时,取消整个审批流程 |
| 274 | deleteProcessInstance(id, StrUtil.format(BpmProcessInstanceDeleteReasonEnum.REJECT_TASK.format(comment))); | 296 | deleteProcessInstance(id, StrUtil.format(BpmProcessInstanceDeleteReasonEnum.REJECT_TASK.format(comment))); |
| @@ -276,12 +298,17 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService | @@ -276,12 +298,17 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService | ||
| 276 | // 更新 status + result | 298 | // 更新 status + result |
| 277 | // 注意,不能和上面的逻辑更换位置。因为 deleteProcessInstance 会触发流程的取消,进而调用 updateProcessInstanceExtCancel 方法, | 299 | // 注意,不能和上面的逻辑更换位置。因为 deleteProcessInstance 会触发流程的取消,进而调用 updateProcessInstanceExtCancel 方法, |
| 278 | // 设置 result 为 BpmProcessInstanceStatusEnum.CANCEL,显然和 result 不一定是一致的 | 300 | // 设置 result 为 BpmProcessInstanceStatusEnum.CANCEL,显然和 result 不一定是一致的 |
| 279 | - processInstanceExtMapper.updateByProcessInstanceId(new BpmProcessInstanceExtDO().setProcessInstanceId(id) | 301 | + BpmProcessInstanceExtDO instanceExtDO = new BpmProcessInstanceExtDO().setProcessInstanceId(id) |
| 280 | .setStatus(BpmProcessInstanceStatusEnum.FINISH.getStatus()) | 302 | .setStatus(BpmProcessInstanceStatusEnum.FINISH.getStatus()) |
| 281 | - .setResult(BpmProcessInstanceResultEnum.REJECT.getResult())); | 303 | + .setResult(BpmProcessInstanceResultEnum.REJECT.getResult()); |
| 304 | + processInstanceExtMapper.updateByProcessInstanceId(instanceExtDO); | ||
| 282 | 305 | ||
| 283 | // 发送流程被不通过的消息 | 306 | // 发送流程被不通过的消息 |
| 284 | messageService.sendMessageWhenProcessInstanceReject(BpmMessageConvert.INSTANCE.convert(processInstance, comment)); | 307 | messageService.sendMessageWhenProcessInstanceReject(BpmMessageConvert.INSTANCE.convert(processInstance, comment)); |
| 308 | + | ||
| 309 | + // 发送流程实例的状态事件 | ||
| 310 | + processInstanceResultEventPublisher.sendProcessInstanceResultEvent( | ||
| 311 | + BpmProcessInstanceConvert.INSTANCE.convert(this, processInstance, instanceExtDO.getResult())); | ||
| 285 | } | 312 | } |
| 286 | 313 | ||
| 287 | } | 314 | } |