Commit 2630ad8eaacbf2d86f969682507c470a1128d334
1 parent
2017b031
完成流程实例的取消
Showing
12 changed files
with
115 additions
and
18 deletions
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/BpmProcessInstanceController.http
| ... | ... | @@ -12,6 +12,17 @@ Authorization: Bearer {{token}} |
| 12 | 12 | } |
| 13 | 13 | } |
| 14 | 14 | |
| 15 | +### 请求 /bpm/process-instance/cancel 接口 => 成功 | |
| 16 | +DELETE {{baseUrl}}/bpm/process-instance/cancel | |
| 17 | +Content-Type: application/json | |
| 18 | +tenant-id: 1 | |
| 19 | +Authorization: Bearer {{token}} | |
| 20 | + | |
| 21 | +{ | |
| 22 | + "id": "b9220387-7088-11ec-bcae-a2380e71991a", | |
| 23 | + "reason": "我就取消" | |
| 24 | +} | |
| 25 | + | |
| 15 | 26 | ### 请求 /bpm/process-instance/my-page 接口 => 成功 |
| 16 | 27 | GET {{baseUrl}}/bpm/process-instance/my-page |
| 17 | 28 | tenant-id: 1 | ... | ... |
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/BpmProcessInstanceController.java
| 1 | 1 | package cn.iocoder.yudao.adminserver.modules.bpm.controller.task; |
| 2 | 2 | |
| 3 | +import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.instance.BpmProcessInstanceCancelReqVO; | |
| 3 | 4 | import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.instance.BpmProcessInstanceCreateReqVO; |
| 4 | 5 | import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.instance.BpmProcessInstanceMyPageReqVO; |
| 5 | 6 | import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.instance.BpmProcessInstancePageItemRespVO; |
| ... | ... | @@ -34,6 +35,13 @@ public class BpmProcessInstanceController { |
| 34 | 35 | return success(processInstanceService.createProcessInstance(getLoginUserId(), createReqVO)); |
| 35 | 36 | } |
| 36 | 37 | |
| 38 | + @DeleteMapping("/cancel") | |
| 39 | + @ApiOperation(value = "取消流程实例", notes = "撤回发起的流程") | |
| 40 | + public CommonResult<Boolean> cancelProcessInstance(@Valid @RequestBody BpmProcessInstanceCancelReqVO cancelReqVO) { | |
| 41 | + processInstanceService.cancelProcessInstance(getLoginUserId(), cancelReqVO); | |
| 42 | + return success(true); | |
| 43 | + } | |
| 44 | + | |
| 37 | 45 | @GetMapping("/my-page") |
| 38 | 46 | @ApiOperation(value = "获得我的实例分页列表", notes = "在【我的流程】菜单中,进行调用") |
| 39 | 47 | public CommonResult<PageResult<BpmProcessInstancePageItemRespVO>> getMyProcessInstancePage( | ... | ... |
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/controller/task/vo/instance/BpmProcessInstanceCancelReqVO.java
0 → 100644
| 1 | +package cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.instance; | |
| 2 | + | |
| 3 | +import io.swagger.annotations.ApiModel; | |
| 4 | +import io.swagger.annotations.ApiModelProperty; | |
| 5 | +import lombok.Data; | |
| 6 | + | |
| 7 | +import javax.validation.constraints.NotEmpty; | |
| 8 | +import javax.validation.constraints.NotNull; | |
| 9 | +import java.util.Map; | |
| 10 | + | |
| 11 | +@ApiModel("流程实例的取消 Request VO") | |
| 12 | +@Data | |
| 13 | +public class BpmProcessInstanceCancelReqVO { | |
| 14 | + | |
| 15 | + @ApiModelProperty(value = "流程实例的编号", required = true, example = "1024") | |
| 16 | + @NotEmpty(message = "流程实例的编号不能为空") | |
| 17 | + private String id; | |
| 18 | + | |
| 19 | + @ApiModelProperty(value = "取消原因", required = true, example = "不请假了!") | |
| 20 | + @NotEmpty(message = "取消原因不能为空") | |
| 21 | + private String reason; | |
| 22 | + | |
| 23 | +} | ... | ... |
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/dal/mysql/task/BpmProcessInstanceExtMapper.java
| ... | ... | @@ -5,6 +5,7 @@ import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.task.BpmProcessIn |
| 5 | 5 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 6 | 6 | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; |
| 7 | 7 | import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; |
| 8 | +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; | |
| 8 | 9 | import org.apache.ibatis.annotations.Mapper; |
| 9 | 10 | |
| 10 | 11 | @Mapper |
| ... | ... | @@ -22,4 +23,8 @@ public interface BpmProcessInstanceExtMapper extends BaseMapperX<BpmProcessInsta |
| 22 | 23 | .orderByDesc("id")); |
| 23 | 24 | } |
| 24 | 25 | |
| 26 | + default void updateByProcessInstanceId(String processInstanceId, BpmProcessInstanceExtDO updateObj) { | |
| 27 | + update(updateObj, new QueryWrapper<BpmProcessInstanceExtDO>().eq("process_instance_id", processInstanceId)); | |
| 28 | + } | |
| 29 | + | |
| 25 | 30 | } | ... | ... |
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/BpmErrorCodeConstants.java
| ... | ... | @@ -10,7 +10,6 @@ import cn.iocoder.yudao.framework.common.exception.ErrorCode; |
| 10 | 10 | public interface BpmErrorCodeConstants { |
| 11 | 11 | |
| 12 | 12 | // ========== 通用流程处理 模块 1-009-000-000 ========== |
| 13 | - ErrorCode PROCESS_INSTANCE_NOT_EXISTS = new ErrorCode(1009000001, "流程实例不存在"); | |
| 14 | 13 | ErrorCode HIGHLIGHT_IMG_ERROR = new ErrorCode(1009000002, "获取高亮流程图异常"); |
| 15 | 14 | |
| 16 | 15 | // ========== OA 流程模块 1-009-001-000 ========== |
| ... | ... | @@ -34,7 +33,7 @@ public interface BpmErrorCodeConstants { |
| 34 | 33 | ErrorCode PROCESS_DEFINITION_IS_SUSPENDED = new ErrorCode(1009003002, "流程定义处于挂起状态"); |
| 35 | 34 | |
| 36 | 35 | // ========== 流程实例 1-009-004-000 ========== |
| 37 | - | |
| 36 | + ErrorCode PROCESS_INSTANCE_CANCEL_FAIL_NOT_EXISTS = new ErrorCode(1009004000, "流程取消失败,流程不处于运行中"); | |
| 38 | 37 | |
| 39 | 38 | // ========== 动态表单模块 1-009-010-000 ========== |
| 40 | 39 | ErrorCode FORM_NOT_EXISTS = new ErrorCode(1009010000, "动态表单不存在"); | ... | ... |
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/enums/task/BpmProcessInstanceResultEnum.java
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/BpmProcessInstanceService.java
| 1 | 1 | package cn.iocoder.yudao.adminserver.modules.bpm.service.task; |
| 2 | 2 | |
| 3 | +import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.instance.BpmProcessInstanceCancelReqVO; | |
| 3 | 4 | import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.instance.BpmProcessInstanceCreateReqVO; |
| 4 | 5 | import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.instance.BpmProcessInstanceMyPageReqVO; |
| 5 | 6 | import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.instance.BpmProcessInstancePageItemRespVO; |
| ... | ... | @@ -29,6 +30,14 @@ public interface BpmProcessInstanceService { |
| 29 | 30 | String createProcessInstance(Long userId, @Valid BpmProcessInstanceCreateReqVO createReqVO); |
| 30 | 31 | |
| 31 | 32 | /** |
| 33 | + * 取消流程实例 | |
| 34 | + * | |
| 35 | + * @param userId 用户编号 | |
| 36 | + * @param cancelReqVO 取消信息 | |
| 37 | + */ | |
| 38 | + void cancelProcessInstance(Long userId, @Valid BpmProcessInstanceCancelReqVO cancelReqVO); | |
| 39 | + | |
| 40 | + /** | |
| 32 | 41 | * 获得流程实例的分页 |
| 33 | 42 | * |
| 34 | 43 | * @param userId 用户编号 | ... | ... |
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/impl/BpmProcessInstanceServiceImpl.java
| ... | ... | @@ -2,6 +2,7 @@ package cn.iocoder.yudao.adminserver.modules.bpm.service.task.impl; |
| 2 | 2 | |
| 3 | 3 | import cn.hutool.core.collection.CollUtil; |
| 4 | 4 | import cn.hutool.core.lang.Assert; |
| 5 | +import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.instance.BpmProcessInstanceCancelReqVO; | |
| 5 | 6 | import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.instance.BpmProcessInstanceCreateReqVO; |
| 6 | 7 | import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.instance.BpmProcessInstanceMyPageReqVO; |
| 7 | 8 | import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.instance.BpmProcessInstancePageItemRespVO; |
| ... | ... | @@ -37,8 +38,7 @@ import java.util.Map; |
| 37 | 38 | import java.util.Set; |
| 38 | 39 | import java.util.function.Consumer; |
| 39 | 40 | |
| 40 | -import static cn.iocoder.yudao.adminserver.modules.bpm.enums.BpmErrorCodeConstants.PROCESS_DEFINITION_IS_SUSPENDED; | |
| 41 | -import static cn.iocoder.yudao.adminserver.modules.bpm.enums.BpmErrorCodeConstants.PROCESS_DEFINITION_NOT_EXISTS; | |
| 41 | +import static cn.iocoder.yudao.adminserver.modules.bpm.enums.BpmErrorCodeConstants.*; | |
| 42 | 42 | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| 43 | 43 | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; |
| 44 | 44 | |
| ... | ... | @@ -128,6 +128,23 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService |
| 128 | 128 | } |
| 129 | 129 | |
| 130 | 130 | @Override |
| 131 | + @Transactional(rollbackFor = Exception.class) | |
| 132 | + public void cancelProcessInstance(Long userId, BpmProcessInstanceCancelReqVO cancelReqVO) { | |
| 133 | + // 校验流程实例存在 | |
| 134 | + ProcessInstance instance = getProcessInstance(cancelReqVO.getId()); | |
| 135 | + if (instance == null) { | |
| 136 | + throw exception(PROCESS_INSTANCE_CANCEL_FAIL_NOT_EXISTS); | |
| 137 | + } | |
| 138 | + | |
| 139 | + // 通过删除流程实例,实现流程实例的取消 | |
| 140 | + runtimeService.deleteProcessInstance(cancelReqVO.getId(), cancelReqVO.getReason()); | |
| 141 | + // 更新流程实例的拓展表为取消状态 | |
| 142 | + processInstanceExtMapper.updateByProcessInstanceId(cancelReqVO.getId(), | |
| 143 | + new BpmProcessInstanceExtDO().setStatus(BpmProcessInstanceStatusEnum.FINISH.getStatus()) | |
| 144 | + .setResult(BpmProcessInstanceResultEnum.CANCEL.getResult())); | |
| 145 | + } | |
| 146 | + | |
| 147 | + @Override | |
| 131 | 148 | public PageResult<BpmProcessInstancePageItemRespVO> getMyProcessInstancePage(Long userId, |
| 132 | 149 | BpmProcessInstanceMyPageReqVO pageReqVO) { |
| 133 | 150 | // 通过 BpmProcessInstanceExtDO 表,先查询到对应的分页 | ... | ... |
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/impl/BpmTaskServiceImpl.java
| ... | ... | @@ -42,7 +42,6 @@ import java.io.InputStream; |
| 42 | 42 | import java.util.*; |
| 43 | 43 | |
| 44 | 44 | import static cn.iocoder.yudao.adminserver.modules.bpm.enums.BpmErrorCodeConstants.HIGHLIGHT_IMG_ERROR; |
| 45 | -import static cn.iocoder.yudao.adminserver.modules.bpm.enums.BpmErrorCodeConstants.PROCESS_INSTANCE_NOT_EXISTS; | |
| 46 | 45 | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| 47 | 46 | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; |
| 48 | 47 | |
| ... | ... | @@ -228,7 +227,8 @@ public class BpmTaskServiceImpl implements BpmTaskService { |
| 228 | 227 | HistoricProcessInstance hpi = historyService.createHistoricProcessInstanceQuery().processInstanceId(processInstanceId).singleResult(); |
| 229 | 228 | // 如果不存在实例。 说明数据异常 |
| 230 | 229 | if (hpi == null) { |
| 231 | - throw exception(PROCESS_INSTANCE_NOT_EXISTS); | |
| 230 | +// throw exception(PROCESS_INSTANCE_NOT_EXISTS); | |
| 231 | + throw new RuntimeException("不存在"); | |
| 232 | 232 | } |
| 233 | 233 | // 如果有结束时间 返回model的流程图 |
| 234 | 234 | if (!ObjectUtils.isEmpty(hpi.getEndTime())) { | ... | ... |
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/listener/BpmProcessInstanceEventListener.java
| ... | ... | @@ -25,17 +25,13 @@ public class BpmProcessInstanceEventListener implements ActivitiEventListener { |
| 25 | 25 | |
| 26 | 26 | @Override |
| 27 | 27 | public void onEvent(ActivitiEvent event) { |
| 28 | - // 不处理 ActivitiEventType.PROCESS_STARTED 事件。原因:事件发布时,流程实例还没进行入库,就已经发布了 ActivitiEvent 事件 | |
| 28 | + // 不处理 ActivitiEventType.PROCESS_STARTED 事件。原因:事件发布时,流程实例还没进行入库,就已经发布了 ActivitiEvent 事件 | |
| 29 | + // 不处理 ActivitiEventType.PROCESS_CANCELLED 事件。原因:直接在 BpmTaskService#cancelProcessInstance 更新记录 | |
| 29 | 30 | |
| 30 | 31 | // 正常完成 |
| 31 | 32 | if (event.getType() == ActivitiEventType.PROCESS_COMPLETED |
| 32 | 33 | || event.getType() == ActivitiEventType.PROCESS_COMPLETED_WITH_ERROR_END_EVENT) { |
| 33 | - return; | |
| 34 | - } | |
| 35 | - // 取消 | |
| 36 | - if (event.getType() == ActivitiEventType.PROCESS_CANCELLED) { | |
| 37 | - // TODO | |
| 38 | - System.out.println(); | |
| 34 | + // TODO 芋艿:更新 | |
| 39 | 35 | } |
| 40 | 36 | } |
| 41 | 37 | ... | ... |
yudao-admin-ui/src/api/bpm/processInstance.js
| ... | ... | @@ -7,3 +7,14 @@ export function getMyProcessInstancePage(query) { |
| 7 | 7 | params: query |
| 8 | 8 | }) |
| 9 | 9 | } |
| 10 | + | |
| 11 | +export function cancelProcessInstance(id, reason) { | |
| 12 | + return request({ | |
| 13 | + url: '/bpm/process-instance/cancel', | |
| 14 | + method: 'DELETE', | |
| 15 | + data: { | |
| 16 | + id, | |
| 17 | + reason | |
| 18 | + } | |
| 19 | + }) | |
| 20 | +} | ... | ... |
yudao-admin-ui/src/views/bpm/processInstance/index.vue
| ... | ... | @@ -103,8 +103,9 @@ |
| 103 | 103 | </el-table-column> |
| 104 | 104 | <el-table-column label="操作" align="center" class-name="small-padding fixed-width"> |
| 105 | 105 | <template slot-scope="scope"> |
| 106 | -<!-- <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"--> | |
| 107 | -<!-- v-hasPermi="['bpm:process-instance-ext:update']">修改</el-button>--> | |
| 106 | + <!-- TODO 芋艿:权限 --> | |
| 107 | + <el-button type="text" size="small" icon="el-icon-delete" v-if="scope.row.result === 1" | |
| 108 | + @click="handleCancel(scope.row)">取消</el-button> | |
| 108 | 109 | </template> |
| 109 | 110 | </el-table-column> |
| 110 | 111 | </el-table> |
| ... | ... | @@ -162,8 +163,9 @@ import { |
| 162 | 163 | deleteProcessInstanceExt, |
| 163 | 164 | getProcessInstanceExt, |
| 164 | 165 | getProcessInstanceExtPage, |
| 165 | - exportProcessInstanceExtExcel | |
| 166 | + exportProcessInstanceExtExcel, cancelProcessInstance | |
| 166 | 167 | } from "@/api/bpm/processInstance"; |
| 168 | +import {deleteErrorCode} from "@/api/system/errorCode"; | |
| 167 | 169 | |
| 168 | 170 | export default { |
| 169 | 171 | name: "ProcessInstanceExt", |
| ... | ... | @@ -283,7 +285,23 @@ export default { |
| 283 | 285 | this.getList(); |
| 284 | 286 | }); |
| 285 | 287 | }); |
| 286 | - } | |
| 288 | + }, | |
| 289 | + /** 取消按钮操作 */ | |
| 290 | + handleCancel(row) { | |
| 291 | + const id = row.id; | |
| 292 | + this.$prompt('请输出取消原因?', "取消流程", { | |
| 293 | + type: 'warning', | |
| 294 | + confirmButtonText: "确定", | |
| 295 | + cancelButtonText: "取消", | |
| 296 | + inputPattern: /^[\s\S]*.*[^\s][\s\S]*$/, // 判断非空,且非空格 | |
| 297 | + inputErrorMessage: "取消原因不能为空", | |
| 298 | + }).then(({ value }) => { | |
| 299 | + return cancelProcessInstance(id, value); | |
| 300 | + }).then(() => { | |
| 301 | + this.getList(); | |
| 302 | + this.msgSuccess("取消成功"); | |
| 303 | + }) | |
| 304 | + }, | |
| 287 | 305 | } |
| 288 | 306 | }; |
| 289 | 307 | </script> | ... | ... |