mirror of
https://gitee.com/hhyykk/ipms-sjy.git
synced 2025-07-24 07:55:06 +08:00
暂时去除回退功能,边界处理不够正确
This commit is contained in:
@ -75,13 +75,4 @@ public class BpmTaskController {
|
||||
return success(true);
|
||||
}
|
||||
|
||||
@PutMapping("/back")
|
||||
@ApiOperation(value = "回退")
|
||||
// @PreAuthorize("@ss.hasPermission('bpm:task:back')")
|
||||
public CommonResult<Boolean> backTask(@Valid @RequestBody BpmTaskBackReqVO reqVO) {
|
||||
//先硬编码到 回退到第一个审批节点
|
||||
// String destinationTaskDefKey = "task01";
|
||||
return taskService.backTask(reqVO);
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -1,45 +0,0 @@
|
||||
package cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task;
|
||||
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
import javax.validation.constraints.NotEmpty;
|
||||
import javax.validation.constraints.NotNull;
|
||||
|
||||
/**
|
||||
* @author kemengkai
|
||||
* @create 2022-05-07 08:05 TODO ke:vo 类,使用 swagger 注解即可
|
||||
*/
|
||||
@Data
|
||||
@AllArgsConstructor
|
||||
@NoArgsConstructor
|
||||
public class BpmTaskBackReqVO {
|
||||
|
||||
// TODO ke:userId 应该使用后端的,不能前端传递,不然就越权了
|
||||
@ApiModelProperty(value = "用户id", required = true, example = "1")
|
||||
@NotEmpty(message = "用户id不能为空")
|
||||
private String userId;
|
||||
|
||||
// TODO ke:procInstId、taskId、oldTaskDefKey 三个,是不是只要传递一个 taskId?字段不要存在推导关系
|
||||
@ApiModelProperty(value = "流程编号id", required = true, example = "730da750-cc4f-11ec-b58e-1e429355e4a0")
|
||||
@NotEmpty(message = "流程编号id不能为空")
|
||||
private String procInstId;
|
||||
|
||||
@ApiModelProperty(value = "当前任务id", required = true, example = "730da750-cc4f-11ec-b58e-1e429355e4a0")
|
||||
@NotEmpty(message = "当前任务id不能为空")
|
||||
private String taskId;
|
||||
|
||||
@ApiModelProperty(value = "当前流程任务id", required = true, example = "Activity_1jlembv")
|
||||
@NotNull(message = "当前流程任务id不能为空")
|
||||
private String oldTaskDefKey;
|
||||
|
||||
@ApiModelProperty(value = "准备回退的流程任务id", required = true, example = "task01")
|
||||
@NotNull(message = "准备回退流程任务id不能为空")
|
||||
private String newTaskDefKey;
|
||||
|
||||
@ApiModelProperty(value = "审批结果", required = true, example = "任务驳回")
|
||||
@NotNull(message = "审批结果")
|
||||
private String reason;
|
||||
}
|
@ -4,7 +4,6 @@ import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
|
||||
import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmTaskExtDO;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
@ -24,28 +23,4 @@ public interface BpmTaskExtMapper extends BaseMapperX<BpmTaskExtDO> {
|
||||
return selectOne(BpmTaskExtDO::getTaskId, taskId);
|
||||
}
|
||||
|
||||
default List<BpmTaskExtDO> selectListByProcessInstanceId(String processInstanceId) {
|
||||
return selectList(BpmTaskExtDO::getProcessInstanceId, processInstanceId);
|
||||
}
|
||||
|
||||
// TODO @ke:可以使用类上上面的 default 方法实现。然后,方法的命名上,要保持和 db 一样。因为 mapper 是数据层,不关注业务。例如说,这里,其实复用 updateByTaskId 方法即可
|
||||
/**
|
||||
* 任务驳回
|
||||
*
|
||||
* @param taskId 任务列表
|
||||
* @param reason 驳回理由
|
||||
*
|
||||
* @return 返回驳回结果,是否成功
|
||||
*/
|
||||
Boolean backByTaskId(@Param("taskId") String taskId, @Param("reason") String reason);
|
||||
|
||||
// TODO @ke:tong上哈
|
||||
/**
|
||||
* 逻辑删除任务
|
||||
*
|
||||
* @param taskIdList 任务id列表
|
||||
*
|
||||
* @return 返回是否成功
|
||||
*/
|
||||
Boolean delByTaskIds(@Param("taskIdList") List<String> taskIdList);
|
||||
}
|
||||
|
@ -5,7 +5,6 @@ import org.flowable.engine.delegate.DelegateExecution;
|
||||
|
||||
import java.util.Set;
|
||||
|
||||
// TODO @芋艿:迁移到 bpm 的 core 下
|
||||
/**
|
||||
* Bpm 任务分配的自定义 Script 脚本
|
||||
* 使用场景:
|
||||
|
File diff suppressed because one or more lines are too long
@ -84,13 +84,6 @@ public interface BpmTaskService {
|
||||
*/
|
||||
void rejectTask(Long userId, @Valid BpmTaskRejectReqVO reqVO);
|
||||
|
||||
/**
|
||||
* 回退任务
|
||||
*
|
||||
* @param reqVO 回退任务信息
|
||||
*/
|
||||
CommonResult<Boolean> backTask(BpmTaskBackReqVO reqVO);
|
||||
|
||||
/**
|
||||
* 将流程任务分配给指定用户
|
||||
*
|
||||
|
@ -2,15 +2,12 @@ package cn.iocoder.yudao.module.bpm.service.task;
|
||||
|
||||
import cn.hutool.core.collection.CollUtil;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import cn.iocoder.yudao.framework.common.util.number.NumberUtils;
|
||||
import cn.iocoder.yudao.framework.common.util.object.PageUtils;
|
||||
import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore;
|
||||
import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.*;
|
||||
import cn.iocoder.yudao.module.bpm.convert.task.BpmTaskConvert;
|
||||
import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmTaskAssignRuleDO;
|
||||
import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmActivityDO;
|
||||
import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmTaskExtDO;
|
||||
import cn.iocoder.yudao.module.bpm.dal.mysql.definition.BpmTaskAssignRuleMapper;
|
||||
import cn.iocoder.yudao.module.bpm.dal.mysql.task.BpmActivityMapper;
|
||||
@ -24,7 +21,6 @@ import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
|
||||
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.flowable.engine.HistoryService;
|
||||
import org.flowable.engine.RuntimeService;
|
||||
import org.flowable.engine.TaskService;
|
||||
import org.flowable.engine.history.HistoricProcessInstance;
|
||||
import org.flowable.engine.runtime.ProcessInstance;
|
||||
@ -40,7 +36,6 @@ import org.springframework.transaction.support.TransactionSynchronizationManager
|
||||
import javax.annotation.Resource;
|
||||
import javax.validation.Valid;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
||||
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
|
||||
@ -60,8 +55,6 @@ public class BpmTaskServiceImpl implements BpmTaskService {
|
||||
@Resource
|
||||
private TaskService taskService;
|
||||
@Resource
|
||||
private RuntimeService runtimeService;
|
||||
@Resource
|
||||
private HistoryService historyService;
|
||||
|
||||
@Resource
|
||||
@ -226,44 +219,6 @@ public class BpmTaskServiceImpl implements BpmTaskService {
|
||||
.setReason(reqVO.getReason()));
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
@TenantIgnore
|
||||
public CommonResult<Boolean> backTask(BpmTaskBackReqVO reqVO) {
|
||||
Long userId = Long.valueOf(reqVO.getUserId());
|
||||
// 校验任务存在
|
||||
Task task = checkTask(userId, reqVO.getTaskId());
|
||||
ArrayList<String> oldTaskDefKeyList = CollUtil.newArrayList(reqVO.getOldTaskDefKey());
|
||||
|
||||
// List<HistoricActivityInstance> hisActInstList =
|
||||
// historyService.createHistoricActivityInstanceQuery().processInstanceId(reqVO.getProcInstId()).list();
|
||||
// TODO @ke:使用 historyService.createHistoricActivityInstanceQuery().processInstanceId(reqVO.getProcInstId()).list() 读取,会存在啥问题呀?
|
||||
List<BpmActivityDO> bpmActivityDOList = bpmActivityMapper.listAllByProcInstIdAndDelete(reqVO.getProcInstId());
|
||||
// List<BpmActivityDO> bpmActivityDOList = BpmTaskConvert.INSTANCE.copyList(hisActInstList, BpmActivityDO.class);
|
||||
// bpmActivityDOList.forEach(bpmActivityDO -> log.info("bpmActivityDO = " + bpmActivityDO));
|
||||
// TODO @ke:如果 开始->a->b->c->d->结束,从 d 驳回到 b 的话,这样会不会导致 a 也被删除呀?http://blog.wya1.com/article/636697030/details/7296 可以看看这篇文章哈。
|
||||
List<String> taskIdList = bpmActivityDOList.stream().filter(
|
||||
bpmActivityDO -> bpmActivityDO.getActivityId().equals(reqVO.getOldTaskDefKey())
|
||||
&& !bpmActivityDO.getTaskId().equals(reqVO.getTaskId())).map(BpmActivityDO::getTaskId)
|
||||
.collect(Collectors.toList());
|
||||
|
||||
// 使用flowable更改任务节点
|
||||
runtimeService.createChangeActivityStateBuilder().processInstanceId(reqVO.getProcInstId())
|
||||
.moveActivityIdsToSingleActivityId(oldTaskDefKeyList, reqVO.getNewTaskDefKey()).changeState();
|
||||
|
||||
// 逻辑删除hiActInst表任务
|
||||
Boolean delHiActInstResult = bpmActivityMapper.delHiActInstByTaskId(taskIdList);
|
||||
// 逻辑删除hiTaskInst表任务
|
||||
Boolean delHiTaskInstResult = bpmActivityMapper.delHiTaskInstByTaskId(taskIdList);
|
||||
// 更新任务拓展表
|
||||
Boolean backResult = taskExtMapper.backByTaskId(reqVO.getTaskId(), reqVO.getReason());
|
||||
Boolean delTaskResult = taskExtMapper.delByTaskIds(taskIdList);
|
||||
if (!delHiActInstResult && !delHiTaskInstResult && !backResult && !delTaskResult) {
|
||||
throw new RuntimeException("任务驳回失败!!!");
|
||||
}
|
||||
return CommonResult.success(true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateTaskAssignee(Long userId, BpmTaskUpdateAssigneeReqVO reqVO) {
|
||||
// 校验任务存在
|
||||
|
@ -1,44 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="cn.iocoder.yudao.module.bpm.dal.mysql.task.BpmActivityMapper">
|
||||
|
||||
<update id="delHiActInstByTaskId">
|
||||
UPDATE act_hi_actinst
|
||||
SET delete_reason_ = 'delete task' WHERE task_id_ IN
|
||||
<foreach collection="taskIdList" item="item" open="(" separator="," close=")">
|
||||
#{item}
|
||||
</foreach>
|
||||
</update>
|
||||
<delete id="delHiTaskInstByTaskId">
|
||||
UPDATE act_hi_taskinst
|
||||
SET delete_reason_ = 'delete task' WHERE id_ IN
|
||||
<foreach collection="taskIdList" item="item" open="(" separator="," close=")">
|
||||
#{item}
|
||||
</foreach>
|
||||
</delete>
|
||||
|
||||
<select id="listAllByProcInstIdAndDelete"
|
||||
resultType="cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmActivityDO">
|
||||
SELECT id_ AS `id`,
|
||||
rev_ AS `rev`,
|
||||
proc_def_id_ AS `proc_def_id`,
|
||||
proc_inst_id_ AS `process_instance_id`,
|
||||
execution_id_ AS `execution_id`,
|
||||
act_id_ AS `activity_id`,
|
||||
task_id_ AS `task_id`,
|
||||
call_proc_inst_id_ AS `call_proc_inst_id`,
|
||||
act_name_ AS `activity_name`,
|
||||
act_type_ AS `activity_type`,
|
||||
assignee_ AS `assignee`,
|
||||
start_time_ AS `start_time`,
|
||||
end_time_ AS `end_time`,
|
||||
transaction_order_ AS `transaction_order`,
|
||||
duration_ AS `duration`,
|
||||
delete_reason_ AS `delete_reason`,
|
||||
tenant_id_ AS `tenant_id`
|
||||
FROM act_hi_actinst aha
|
||||
WHERE aha.proc_inst_id_ = #{procInstId}
|
||||
AND aha.act_type_ != 'sequenceFlow'
|
||||
LIMIT 500;
|
||||
</select>
|
||||
</mapper>
|
@ -1,21 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="cn.iocoder.yudao.module.bpm.dal.mysql.task.BpmTaskExtMapper">
|
||||
|
||||
<update id="backByTaskId">
|
||||
UPDATE bpm_task_ext
|
||||
SET result=2,
|
||||
`reason`=#{reason}
|
||||
WHERE task_id = #{taskId}
|
||||
</update>
|
||||
<update id="delByTaskIds">
|
||||
UPDATE bpm_task_ext
|
||||
SET result=1,
|
||||
`deleted`= true
|
||||
WHERE `task_id` IN
|
||||
<foreach collection="taskIdList" item="item" open="(" separator="," close=")">
|
||||
#{item}
|
||||
</foreach>
|
||||
</update>
|
||||
|
||||
</mapper>
|
Reference in New Issue
Block a user