diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestLeaveController.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestLeaveController.java index 6ef6b4c4f..9dbe6ebb7 100644 --- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestLeaveController.java +++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/TestLeaveController.java @@ -101,6 +101,6 @@ public class TestLeaveController extends BaseController { @DeleteMapping("/{ids}") public R remove(@NotEmpty(message = "主键不能为空") @PathVariable Long[] ids) { - return toAjax(testLeaveService.deleteWithValidByIds(List.of(ids), true)); + return toAjax(testLeaveService.deleteWithValidByIds(List.of(ids))); } } diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/bo/TestLeaveBo.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/bo/TestLeaveBo.java index 3142b74a0..b0e40f8ce 100644 --- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/bo/TestLeaveBo.java +++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/bo/TestLeaveBo.java @@ -41,7 +41,6 @@ public class TestLeaveBo extends BaseEntity { /** * 备注 */ - @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class }) private String remark; diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/ITestLeaveService.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/ITestLeaveService.java index 07227947b..c9993fc25 100644 --- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/ITestLeaveService.java +++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/ITestLeaveService.java @@ -45,5 +45,5 @@ public interface ITestLeaveService { /** * 校验并批量删除请假信息 */ - Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + Boolean deleteWithValidByIds(Collection ids); } diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/TestLeaveServiceImpl.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/TestLeaveServiceImpl.java index cb5c303f0..e69a83001 100644 --- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/TestLeaveServiceImpl.java +++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/TestLeaveServiceImpl.java @@ -10,6 +10,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import lombok.RequiredArgsConstructor; +import org.dromara.workflow.service.IActProcessInstanceService; import org.dromara.workflow.utils.WorkflowUtils; import org.springframework.stereotype.Service; import org.dromara.demo.domain.bo.TestLeaveBo; @@ -33,6 +34,7 @@ import java.util.Collection; public class TestLeaveServiceImpl implements ITestLeaveService { private final TestLeaveMapper baseMapper; + private final IActProcessInstanceService iActProcessInstanceService; /** * 查询请假 @@ -51,9 +53,9 @@ public class TestLeaveServiceImpl implements ITestLeaveService { Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); TableDataInfo build = TableDataInfo.build(result); List rows = build.getRows(); - if(CollUtil.isNotEmpty(rows)){ + if (CollUtil.isNotEmpty(rows)) { List ids = StreamUtils.toList(rows, e -> String.valueOf(e.getId())); - WorkflowUtils.setProcessInstanceListVo(rows,ids,"id"); + WorkflowUtils.setProcessInstanceListVo(rows, ids, "id"); } return build; } @@ -110,10 +112,9 @@ public class TestLeaveServiceImpl implements ITestLeaveService { * 批量删除请假 */ @Override - public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { - if (isValid) { - //TODO 做一些业务上的校验,判断是否需要校验 - } + public Boolean deleteWithValidByIds(Collection ids) { + List idList = StreamUtils.toList(ids, String::valueOf); + iActProcessInstanceService.deleteRuntimeProcessAndHisInstByBusinessKeys(idList); return baseMapper.deleteBatchIds(ids) > 0; } } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActProcessInstanceController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActProcessInstanceController.java index 495101a37..415ea3801 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActProcessInstanceController.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActProcessInstanceController.java @@ -17,6 +17,7 @@ import org.dromara.workflow.service.IActProcessInstanceService; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import java.util.Arrays; import java.util.Map; /** @@ -92,7 +93,7 @@ public class ActProcessInstanceController extends BaseController { @Log(title = "流程实例管理", businessType = BusinessType.DELETE) @DeleteMapping("/deleteRuntimeProcessAndHisInst/{processInstanceIds}") public R deleteRuntimeProcessAndHisInst(@NotNull(message = "流程实例id不能为空") @PathVariable String[] processInstanceIds) { - return toAjax(iActProcessInstanceService.deleteRuntimeProcessAndHisInst(processInstanceIds)); + return toAjax(iActProcessInstanceService.deleteRuntimeProcessAndHisInst(Arrays.asList(processInstanceIds))); } /** @@ -103,7 +104,7 @@ public class ActProcessInstanceController extends BaseController { @Log(title = "流程实例管理", businessType = BusinessType.DELETE) @DeleteMapping("/deleteFinishProcessAndHisInst/{processInstanceIds}") public R deleteFinishProcessAndHisInst(@NotNull(message = "流程实例id不能为空") @PathVariable String[] processInstanceIds) { - return toAjax(iActProcessInstanceService.deleteFinishProcessAndHisInst(processInstanceIds)); + return toAjax(iActProcessInstanceService.deleteFinishProcessAndHisInst(Arrays.asList(processInstanceIds))); } /** diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActProcessInstanceService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActProcessInstanceService.java index 2f122b6ad..6c2cb8967 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActProcessInstanceService.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActProcessInstanceService.java @@ -6,6 +6,7 @@ import org.dromara.workflow.domain.bo.ProcessInstanceBo; import org.dromara.workflow.domain.bo.ProcessInvalidBo; import org.dromara.workflow.domain.vo.ProcessInstanceVo; +import java.util.List; import java.util.Map; /** @@ -60,7 +61,15 @@ public interface IActProcessInstanceService { * @param processInstanceIds 流程实例id * @return 结果 */ - boolean deleteRuntimeProcessAndHisInst(String[] processInstanceIds); + boolean deleteRuntimeProcessAndHisInst(List processInstanceIds); + + /** + * 按照业务id删除 运行中的实例 删除程实例,删除历史记录,删除业务与流程关联信息 + * + * @param businessKeys 业务id + * @return 结果 + */ + boolean deleteRuntimeProcessAndHisInstByBusinessKeys(List businessKeys); /** * 已完成的实例 删除程实例,删除历史记录,删除业务与流程关联信息 @@ -68,7 +77,7 @@ public interface IActProcessInstanceService { * @param processInstanceIds 流程实例id * @return 结果 */ - boolean deleteFinishProcessAndHisInst(String[] processInstanceIds); + boolean deleteFinishProcessAndHisInst(List processInstanceIds); /** * 撤销流程申请 diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java index 637c2b502..b603b2710 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java @@ -6,6 +6,7 @@ import cn.hutool.core.util.ObjectUtil; import jakarta.servlet.ServletOutputStream; import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.IOUtils; import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.utils.StreamUtils; @@ -16,6 +17,7 @@ import org.dromara.common.tenant.helper.TenantHelper; import org.dromara.workflow.common.constant.FlowConstant; import org.dromara.workflow.common.enums.BusinessStatusEnum; import org.dromara.workflow.common.enums.TaskStatusEnum; +import org.dromara.workflow.domain.ActHiProcinst; import org.dromara.workflow.domain.bo.ProcessInstanceBo; import org.dromara.workflow.domain.bo.ProcessInvalidBo; import org.dromara.workflow.domain.vo.ActHistoryInfoVo; @@ -23,6 +25,7 @@ import org.dromara.workflow.domain.vo.GraphicInfoVo; import org.dromara.workflow.domain.vo.ProcessInstanceVo; import org.dromara.workflow.domain.vo.TaskVo; import org.dromara.workflow.flowable.CustomDefaultProcessDiagramGenerator; +import org.dromara.workflow.service.IActHiProcinstService; import org.dromara.workflow.service.IActProcessInstanceService; import org.flowable.bpmn.model.*; import org.flowable.engine.HistoryService; @@ -54,7 +57,7 @@ import java.util.stream.Collectors; * * @author may */ - +@Slf4j @RequiredArgsConstructor @Service public class ActProcessInstanceServiceImpl implements IActProcessInstanceService { @@ -63,6 +66,7 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService private final RuntimeService runtimeService; private final HistoryService historyService; private final TaskService taskService; + private final IActHiProcinstService iActHiProcinstService; @Value("${flowable.activity-font-name}") private String activityFontName; @@ -388,21 +392,57 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService */ @Override @Transactional(rollbackFor = Exception.class) - public boolean deleteRuntimeProcessAndHisInst(String[] processInstanceIds) { + public boolean deleteRuntimeProcessAndHisInst(List processInstanceIds) { try { //1.删除运行中流程实例 - List list = taskService.createTaskQuery().processInstanceIdIn(Arrays.asList(processInstanceIds)) + List list = taskService.createTaskQuery().processInstanceIdIn(processInstanceIds) .taskTenantId(TenantHelper.getTenantId()).list(); List subTasks = StreamUtils.filter(list, e -> StringUtils.isNotBlank(e.getParentTaskId())); if (CollUtil.isNotEmpty(subTasks)) { subTasks.forEach(e -> taskService.deleteTask(e.getId())); } - runtimeService.bulkDeleteProcessInstances(Arrays.asList(processInstanceIds), LoginHelper.getUserId() + "删除了当前流程申请"); + runtimeService.bulkDeleteProcessInstances(processInstanceIds, LoginHelper.getUserId() + "删除了当前流程申请"); //2.删除历史记录 List historicProcessInstanceList = historyService.createHistoricProcessInstanceQuery() - .processInstanceTenantId(TenantHelper.getTenantId()).processInstanceIds(new HashSet<>(Arrays.asList(processInstanceIds))).list(); + .processInstanceTenantId(TenantHelper.getTenantId()).processInstanceIds(new HashSet<>(processInstanceIds)).list(); if (ObjectUtil.isNotEmpty(historicProcessInstanceList)) { - historyService.bulkDeleteHistoricProcessInstances(Arrays.asList(processInstanceIds)); + historyService.bulkDeleteHistoricProcessInstances(processInstanceIds); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + throw new ServiceException(e.getMessage()); + } + } + + /** + * 按照业务id删除 运行中的实例 删除程实例,删除历史记录,删除业务与流程关联信息 + * + * @param businessKeys 业务id + */ + @Override + @Transactional(rollbackFor = Exception.class) + public boolean deleteRuntimeProcessAndHisInstByBusinessKeys(List businessKeys) { + try { + //1.删除运行中流程实例 + List actHiProcinsts = iActHiProcinstService.selectByBusinessKeyIn(businessKeys); + if (CollUtil.isEmpty(actHiProcinsts)) { + log.warn("当前业务为查询到流程实例!"); + return false; + } + List processInstanceIds = StreamUtils.toList(actHiProcinsts, ActHiProcinst::getId); + List list = taskService.createTaskQuery().processInstanceIdIn(processInstanceIds) + .taskTenantId(TenantHelper.getTenantId()).list(); + List subTasks = StreamUtils.filter(list, e -> StringUtils.isNotBlank(e.getParentTaskId())); + if (CollUtil.isNotEmpty(subTasks)) { + subTasks.forEach(e -> taskService.deleteTask(e.getId())); + } + runtimeService.bulkDeleteProcessInstances(processInstanceIds, LoginHelper.getUserId() + "删除了当前流程申请"); + //2.删除历史记录 + List historicProcessInstanceList = historyService.createHistoricProcessInstanceQuery() + .processInstanceTenantId(TenantHelper.getTenantId()).processInstanceIds(new HashSet<>(processInstanceIds)).list(); + if (ObjectUtil.isNotEmpty(historicProcessInstanceList)) { + historyService.bulkDeleteHistoricProcessInstances(processInstanceIds); } return true; } catch (Exception e) { @@ -417,9 +457,9 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService * @param processInstanceIds 流程实例id */ @Override - public boolean deleteFinishProcessAndHisInst(String[] processInstanceIds) { + public boolean deleteFinishProcessAndHisInst(List processInstanceIds) { try { - historyService.bulkDeleteHistoricProcessInstances(Arrays.asList(processInstanceIds)); + historyService.bulkDeleteHistoricProcessInstances(processInstanceIds); return true; } catch (Exception e) { e.printStackTrace(); @@ -502,7 +542,7 @@ public class ActProcessInstanceServiceImpl implements IActProcessInstanceService ProcessInstanceVo processInstanceVo = BeanUtil.toBean(processInstance, ProcessInstanceVo.class); processInstanceVo.setBusinessStatusName(BusinessStatusEnum.getEumByStatus(processInstance.getBusinessStatus())); if (CollUtil.isNotEmpty(taskVoList)) { - List collect = taskVoList.stream().filter(e -> e.getProcessInstanceId().equals(processInstance.getId())).collect(Collectors.toList()); + List collect = StreamUtils.filter(taskVoList, e -> e.getProcessInstanceId().equals(processInstance.getId())); processInstanceVo.setTaskVoList(CollUtil.isNotEmpty(collect) ? collect : Collections.emptyList()); } list.add(processInstanceVo);