Compare commits

...

2 Commits

Author SHA1 Message Date
furongxin
5457d15793 feat(bpm): 新增备用金报销申请功能并优化已办任务查询
- 新增通过备用金编号查询报销申请的功能
-为报销申请添加项目名称字段- 重构已办任务查询逻辑,优化查询效率和结果展示
- 新增 BpmTaskDonePageRespVO 类用于已办任务响应
2024-12-27 11:41:50 +08:00
furongxin
d5892c92d7 fix(bpm): 修复预支款单详情页面的收款账号信息获取逻辑
- 在获取预支款单详情时,增加了对 bankId 的非空检查
-仅当 imprest 对象不为空且 bankId 不为空时,才调用银行 API 获取收款账号信息
2024-12-26 09:44:38 +08:00
9 changed files with 228 additions and 109 deletions

View File

@ -52,7 +52,7 @@ public class BpmOAImprestController {
BpmOAImprestDO imprest = imprestService.getImprest(id);
BpmOAImprestRespVO respVO = BpmOAImprestConvert.INSTANCE.convert(imprest);
if (respVO != null) {
if (respVO != null && imprest.getBankId() != null) {
// 获取收款账号信息
BankRespDTO bankRespDTO = bankApi.getBank(imprest.getBankId()).getCheckedData();
if (bankRespDTO != null) {

View File

@ -11,8 +11,6 @@ import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import jodd.util.StringUtil;
import org.mapstruct.ap.internal.util.Strings;
import org.springframework.util.StringUtils;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
@ -62,13 +60,20 @@ public class BpmOAReimbursementController {
return success(respVO);
}
// @GetMapping("/page")
// @PreAuthorize("@ss.hasPermission('bpm:oa-reimbursement:query')")
// @Operation(summary = "获得请假申请分页")
// public CommonResult<PageResult<BpmOALeaveRespVO>> getLeavePage(@Valid BpmOALeavePageReqVO pageVO) {
// PageResult<BpmOALeaveDO> pageResult = leaveService.getLeavePage(getLoginUserId(), pageVO);
// return success(BpmOALeaveConvert.INSTANCE.convertPage(pageResult));
// }
@GetMapping("/getByImprest")
@Operation(summary = "获得指定备用金得报销申请")
@Parameter(name = "imprestId", description = "备用金编号", required = true, example = "1024")
public CommonResult<BpmOAReimbursementRespVO> getReimbursementByImprest(@RequestParam("imprestId") Long imprestId) {
BpmOAReimbursementDO reimbursement = service.getReimbursementByImprest(imprestId);
BpmOAReimbursementRespVO respVO = service.convert(reimbursement);
if (respVO != null && StringUtil.isNotEmpty(respVO.getProjectNo())) {
// 设置项目名称
ProjectDTO projectDTO = projectApi.getProject(respVO.getProjectNo()).getCheckedData();
respVO.setProjectName(projectDTO.getName());
}
return success(respVO);
}
@GetMapping("/getByProcessInstanceId")
@Operation(summary = "获得报销申请")

View File

@ -122,7 +122,7 @@ public class BpmTaskController {
@GetMapping("done-page")
@Operation(summary = "获取 Done 已办任务分页")
@PreAuthorize("@ss.hasPermission('bpm:task:query')")
public CommonResult<PageResult<BpmTaskDonePageItemRespVO>> getDoneTaskPage(@Valid BpmTaskDonePageReqVO pageVO) {
public CommonResult<PageResult<BpmTaskDonePageRespVO>> getDoneTaskPage(@Valid BpmTaskDonePageReqVO pageVO) {
return success(taskService.getDoneTaskPage(getLoginUserId(), pageVO));
}

View File

@ -0,0 +1,47 @@
package cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.time.LocalDateTime;
@Schema(description = "管理后台 - 流程任务的 Done 已完成的分页项 Response VO")
@Data
public class BpmTaskDonePageRespVO {
@Schema(description = "任务编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
private String id;
@Schema(description = "任务名字", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋道")
private String name;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
private LocalDateTime createTime;
@Schema(description = "结束时间", requiredMode = Schema.RequiredMode.REQUIRED)
private LocalDateTime endTime;
@Schema(description = "任务结果-参见 bpm_process_instance_result", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
private Integer result;
@Schema(description = "审批建议", requiredMode = Schema.RequiredMode.REQUIRED, example = "不请假了!")
private String reason;
@Schema(description = "流程实例编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
private String processInstanceId;
@Schema(description = "流程实例名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋道")
private String processInstanceName;
@Schema(description = "发起人的用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
private Long startUserId;
@Schema(description = "发起人的用户昵称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿")
private String startUserNickname;
@Schema(description = "流程定义的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048")
private String processDefinitionId;
@Schema(description = "被抄送人的用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "100,200")
private String ccUserIds;
}

View File

@ -3,19 +3,21 @@ package cn.iocoder.yudao.module.bpm.dal.mysql.task;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmCrmTaskPageReqVO;
import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskTodoPageReqVO;
import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskTodoPageRespVO;
import cn.iocoder.yudao.framework.mybatis.core.query.MPJLambdaWrapperX;
import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.*;
import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmProcessInstanceExtDO;
import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmTaskExtDO;
import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceResultEnum;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.mapstruct.ap.internal.util.Strings;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.Objects;
@Mapper
public interface BpmTaskExtMapper extends BaseMapperX<BpmTaskExtDO> {
@ -75,4 +77,31 @@ public interface BpmTaskExtMapper extends BaseMapperX<BpmTaskExtDO> {
.eq(pageReqVO.getIsTodo(), BpmTaskExtDO::getResult, BpmProcessInstanceResultEnum.PROCESS.getResult())
.in(!pageReqVO.getIsTodo(), BpmTaskExtDO::getResult, approveOrReject));
}
default PageResult<BpmTaskDonePageRespVO> selectDonePage(Long userId, BpmTaskDonePageReqVO pageVO, List<Long> userIds) {
MPJLambdaWrapperX<BpmTaskExtDO> queryWrapperX = new MPJLambdaWrapperX<BpmTaskExtDO>();
queryWrapperX.selectAs(BpmTaskExtDO::getTaskId, BpmTaskDonePageRespVO::getId);
queryWrapperX.selectAs(BpmTaskExtDO::getName, BpmTaskDonePageRespVO::getName);
queryWrapperX.selectAs(BpmTaskExtDO::getEndTime, BpmTaskDonePageRespVO::getEndTime);
queryWrapperX.selectAs(BpmTaskExtDO::getReason, BpmTaskDonePageRespVO::getReason);
queryWrapperX.selectAs(BpmTaskExtDO::getResult, BpmTaskDonePageRespVO::getResult);
queryWrapperX.selectAs(BpmTaskExtDO::getCreateTime, BpmTaskDonePageRespVO::getCreateTime);
queryWrapperX.selectAs(BpmTaskExtDO::getProcessInstanceId, BpmTaskDonePageRespVO::getProcessInstanceId);
queryWrapperX.selectAs(BpmProcessInstanceExtDO::getName, BpmTaskDonePageRespVO::getProcessInstanceName);
queryWrapperX.selectAs(BpmProcessInstanceExtDO::getStartUserId, BpmTaskDonePageRespVO::getStartUserId);
queryWrapperX.selectAs(BpmProcessInstanceExtDO::getProcessDefinitionId, BpmTaskDonePageRespVO::getProcessDefinitionId);
queryWrapperX.selectAs(BpmProcessInstanceExtDO::getCcids, BpmTaskDonePageRespVO::getCcUserIds);
queryWrapperX.innerJoin(BpmProcessInstanceExtDO.class, on -> on
.eq(BpmTaskExtDO::getProcessInstanceId, BpmProcessInstanceExtDO::getProcessInstanceId)
.in(Objects.nonNull(userIds), BpmProcessInstanceExtDO::getStartUserId, userIds)
.eq(Strings.isNotEmpty(pageVO.getName()), BpmProcessInstanceExtDO::getName, pageVO.getName()));
queryWrapperX.likeRight(BpmProcessInstanceExtDO::getProcessDefinitionId, "oa_");
queryWrapperX.eq(BpmTaskExtDO::getAssigneeUserId, userId);
queryWrapperX.betweenIfPresent(BpmTaskExtDO::getCreateTime, pageVO.getCreateTime());
queryWrapperX.orderByDesc(BpmTaskExtDO::getEndTime);
return selectJoinPage(pageVO, BpmTaskDonePageRespVO.class, queryWrapperX);
}
}

View File

@ -60,4 +60,10 @@ public interface BpmOAReimbursementService {
*/
BpmOAReimbursementDO getByProcessInstanceId(String processInstanceId);
/**
* 获得指定备用金得报销申请
* @param imprestId 备用金编号
* @return 报销申请
*/
BpmOAReimbursementDO getReimbursementByImprest(Long imprestId);
}

View File

@ -371,4 +371,12 @@ public class BpmOAReimbursementServiceImpl extends BpmOABaseService implements B
}
return null;
}
@Override
public BpmOAReimbursementDO getReimbursementByImprest(Long imprestId) {
return reimbursementMapper.selectOne(new LambdaQueryWrapper<BpmOAReimbursementDO>()
.eq(BpmOAReimbursementDO::getImprestId, imprestId)
.eq(BpmOAReimbursementDO::getResult, BpmProcessInstanceResultEnum.APPROVE.getResult()));
}
}

View File

@ -53,7 +53,7 @@ public interface BpmTaskService {
* @param pageReqVO 分页请求
* @return 流程任务分页
*/
PageResult<BpmTaskDonePageItemRespVO> getDoneTaskPage(Long userId, BpmTaskDonePageReqVO pageReqVO);
PageResult<BpmTaskDonePageRespVO> getDoneTaskPage(Long userId, BpmTaskDonePageReqVO pageReqVO);
/**
* 获得流程任务 Map

View File

@ -47,7 +47,6 @@ import org.flowable.task.api.Task;
import org.flowable.task.api.TaskInfo;
import org.flowable.task.api.TaskQuery;
import org.flowable.task.api.history.HistoricTaskInstance;
import org.flowable.task.api.history.HistoricTaskInstanceQuery;
import org.flowable.task.service.impl.persistence.entity.TaskEntity;
import org.flowable.task.service.impl.persistence.entity.TaskEntityImpl;
import org.springframework.context.annotation.Lazy;
@ -199,106 +198,131 @@ public class BpmTaskServiceImpl implements BpmTaskService {
}
@Override
public PageResult<BpmTaskDonePageItemRespVO> getDoneTaskPage(Long userId, BpmTaskDonePageReqVO pageVO) {
//查询bpm_task_ext扩展表 接受人是自己不是自动审批的任务, 按任务名称分组
LambdaQueryWrapperX<BpmTaskExtDO> queryWrapperX = new LambdaQueryWrapperX<>();
queryWrapperX.eq(BpmTaskExtDO::getAssigneeUserId, userId);
queryWrapperX.ne(BpmTaskExtDO::getReason, BpmConstants.AUTO_APPRAVAL);
queryWrapperX.eq(BpmTaskExtDO::getDeleted, false);
queryWrapperX.groupBy(BpmTaskExtDO::getName);
queryWrapperX.select(BpmTaskExtDO::getName);
//只能查询流程标识定义为oa开头的流程
queryWrapperX.likeIfPresent(BpmTaskExtDO::getProcessDefinitionId,"oa_");
List<BpmTaskExtDO> list = taskExtMapper.selectList(queryWrapperX);
List<String> taskNames = list.stream().map(BpmTaskExtDO::getName)
.collect(Collectors.toList());
// 查询已办任务
HistoricTaskInstanceQuery taskQuery = historyService.createHistoricTaskInstanceQuery().finished() // 已完成
.taskAssignee(String.valueOf(userId)) // 分配给自己
.processDefinitionKeyLike("oa_%")
.orderByHistoricTaskInstanceEndTime().desc(); // 审批时间倒序
if (taskNames != null && !taskNames.isEmpty()) {
/**
* 条件是 已被分配的任务的名称分组数据作为条件查询
*/
taskQuery.taskNameIn(taskNames);
} else {
/**
* taskNames是空或者没有数据表示没有任何分配给自己的任务且分自动审批的任务
* 那么就输出一个不存在的任务名称可以让数据查询不出来
*/
taskQuery.taskName("//////");
}
if (StrUtil.isNotBlank(pageVO.getName())) {
// taskQuery.taskNameLike("%" + pageVO.getName() + "%");
//流程定义的名称
taskQuery.processDefinitionName(pageVO.getName());
}
LocalDateTime[] localDateTimes = pageVO.getCreateTime();
if (localDateTimes != null) {
if (localDateTimes[0] != null) {
taskQuery.taskCreatedAfter(DateUtils.of(localDateTimes[0]));
}
if (localDateTimes[1] != null) {
taskQuery.taskCreatedBefore(DateUtils.of(localDateTimes[1]));
}
}
// 执行查询
List<HistoricTaskInstance> tasks = taskQuery.listPage(PageUtils.getStart(pageVO), pageVO.getPageSize());
if (CollUtil.isEmpty(tasks)) {
return PageResult.empty(taskQuery.count());
}
// 获得 TaskExtDO Map
List<BpmTaskExtDO> bpmTaskExtDOs =
taskExtMapper.selectListByTaskIds(convertSet(tasks, HistoricTaskInstance::getId));
Map<String, BpmTaskExtDO> bpmTaskExtDOMap = convertMap(bpmTaskExtDOs, BpmTaskExtDO::getTaskId);
// // 获得 ProcessInstance Map
// Map<String, HistoricProcessInstance> historicProcessInstanceMap =
// processInstanceService.getHistoricProcessInstanceMap(
// convertSet(tasks, HistoricTaskInstance::getProcessInstanceId));
// 获得 ProcessInstance
List<HistoricProcessInstance> historicProcessInstances = processInstanceService.getHistoricProcessInstances(
convertSet(tasks, HistoricTaskInstance::getProcessInstanceId));
public PageResult<BpmTaskDonePageRespVO> getDoneTaskPage(Long userId, BpmTaskDonePageReqVO pageVO) {
// 判断搜索条件是否选择用户
if (pageVO.getUserId() != null) {
// 筛选出 发起人是pageVO.getUserId() 的流程实例
historicProcessInstances = historicProcessInstances.stream()
.filter(instance -> instance.getStartUserId().equals(pageVO.getUserId().toString()))
.collect(Collectors.toList());
// 同步筛选掉 task记录
List<String> processInstanceIds = convertList(historicProcessInstances, HistoricProcessInstance::getId);
tasks = tasks.stream().filter(task -> processInstanceIds.contains(task.getProcessInstanceId())).collect(Collectors.toList());
}else if (pageVO.getDeptId() != null) {
List<Long> userIds = null;
if (pageVO.getDeptId() != null) {
List<AdminUserRespDTO> users = adminUserApi.getUserByDeptIdAll(pageVO.getDeptId()).getCheckedData();
List<Long> userIds = users.stream().map(AdminUserRespDTO::getId).collect(Collectors.toList());
historicProcessInstances = historicProcessInstances.stream()
.filter(instance -> userIds.contains(Long.valueOf(instance.getStartUserId())))
.collect(Collectors.toList());
// 同步筛选掉 task记录
List<String> processInstanceIds = convertList(historicProcessInstances, HistoricProcessInstance::getId);
tasks = tasks.stream().filter(task -> processInstanceIds.contains(task.getProcessInstanceId())).collect(Collectors.toList());
userIds = users.stream().map(AdminUserRespDTO::getId).collect(Collectors.toList());
}
// 获得 ProcessInstance Map
Map<String, HistoricProcessInstance> historicProcessInstanceMap = convertMap(historicProcessInstances, HistoricProcessInstance::getId);
// 获取待办任务
PageResult<BpmTaskDonePageRespVO> pageResult = taskExtMapper.selectDonePage(userId, pageVO, userIds);
if (CollUtil.isNotEmpty(pageResult.getList())) {
// 获得 User Map
Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(
convertSet(historicProcessInstanceMap.values(), instance -> Long.valueOf(instance.getStartUserId())));
// 拼接结果
return new PageResult<>(
BpmTaskConvert.INSTANCE.convertList2(tasks, bpmTaskExtDOMap, historicProcessInstanceMap, userMap),
taskQuery.count());
// 获取用户编号集合
Set<Long> startUserIds = convertSet(pageResult.getList(), BpmTaskDonePageRespVO::getStartUserId);
// 获得 User Map
Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(startUserIds);
pageResult.getList().forEach(item -> {
item.setStartUserNickname(userMap.get(item.getStartUserId()).getNickname());
});
}
return pageResult;
// //查询bpm_task_ext扩展表 接受人是自己不是自动审批的任务, 按任务名称分组
// LambdaQueryWrapperX<BpmTaskExtDO> queryWrapperX = new LambdaQueryWrapperX<>();
// queryWrapperX.eq(BpmTaskExtDO::getAssigneeUserId, userId);
// queryWrapperX.ne(BpmTaskExtDO::getReason, BpmConstants.AUTO_APPRAVAL);
// queryWrapperX.eq(BpmTaskExtDO::getDeleted, false);
// queryWrapperX.groupBy(BpmTaskExtDO::getName);
// queryWrapperX.select(BpmTaskExtDO::getName);
// //只能查询流程标识定义为oa开头的流程
// queryWrapperX.likeIfPresent(BpmTaskExtDO::getProcessDefinitionId,"oa_");
// List<BpmTaskExtDO> list = taskExtMapper.selectList(queryWrapperX);
// List<String> taskNames = list.stream().map(BpmTaskExtDO::getName)
// .collect(Collectors.toList());
//
// // 查询已办任务
// HistoricTaskInstanceQuery taskQuery = historyService.createHistoricTaskInstanceQuery().finished() // 已完成
// .taskAssignee(String.valueOf(userId)) // 分配给自己
// .processDefinitionKeyLike("oa_%")
// .orderByHistoricTaskInstanceEndTime().desc(); // 审批时间倒序
// if (taskNames != null && !taskNames.isEmpty()) {
// /**
// * 条件是 已被分配的任务的名称分组数据作为条件查询
// */
// taskQuery.taskNameIn(taskNames);
// } else {
// /**
// * taskNames是空或者没有数据表示没有任何分配给自己的任务且分自动审批的任务
// * 那么就输出一个不存在的任务名称可以让数据查询不出来
// */
// taskQuery.taskName("//////");
// }
//
// if (StrUtil.isNotBlank(pageVO.getName())) {
//// taskQuery.taskNameLike("%" + pageVO.getName() + "%");
// //流程定义的名称
// taskQuery.processDefinitionName(pageVO.getName());
// }
// LocalDateTime[] localDateTimes = pageVO.getCreateTime();
// if (localDateTimes != null) {
// if (localDateTimes[0] != null) {
// taskQuery.taskCreatedAfter(DateUtils.of(localDateTimes[0]));
// }
// if (localDateTimes[1] != null) {
// taskQuery.taskCreatedBefore(DateUtils.of(localDateTimes[1]));
// }
// }
//
// // 执行查询
// List<HistoricTaskInstance> tasks = taskQuery.listPage(PageUtils.getStart(pageVO), pageVO.getPageSize());
// if (CollUtil.isEmpty(tasks)) {
// return PageResult.empty(taskQuery.count());
// }
//
// // 获得 TaskExtDO Map
// List<BpmTaskExtDO> bpmTaskExtDOs =
// taskExtMapper.selectListByTaskIds(convertSet(tasks, HistoricTaskInstance::getId));
// Map<String, BpmTaskExtDO> bpmTaskExtDOMap = convertMap(bpmTaskExtDOs, BpmTaskExtDO::getTaskId);
//// // 获得 ProcessInstance Map
//// Map<String, HistoricProcessInstance> historicProcessInstanceMap =
//// processInstanceService.getHistoricProcessInstanceMap(
//// convertSet(tasks, HistoricTaskInstance::getProcessInstanceId));
//
// // 获得 ProcessInstance
// List<HistoricProcessInstance> historicProcessInstances = processInstanceService.getHistoricProcessInstances(
// convertSet(tasks, HistoricTaskInstance::getProcessInstanceId));
//
// // 判断搜索条件是否选择用户
// if (pageVO.getUserId() != null) {
// // 筛选出 发起人是pageVO.getUserId() 的流程实例
// historicProcessInstances = historicProcessInstances.stream()
// .filter(instance -> instance.getStartUserId().equals(pageVO.getUserId().toString()))
// .collect(Collectors.toList());
//
// // 同步筛选掉 task记录
// List<String> processInstanceIds = convertList(historicProcessInstances, HistoricProcessInstance::getId);
// tasks = tasks.stream().filter(task -> processInstanceIds.contains(task.getProcessInstanceId())).collect(Collectors.toList());
// }else if (pageVO.getDeptId() != null) {
//
// List<AdminUserRespDTO> users = adminUserApi.getUserByDeptIdAll(pageVO.getDeptId()).getCheckedData();
// List<Long> userIds = users.stream().map(AdminUserRespDTO::getId).collect(Collectors.toList());
//
// historicProcessInstances = historicProcessInstances.stream()
// .filter(instance -> userIds.contains(Long.valueOf(instance.getStartUserId())))
// .collect(Collectors.toList());
//
// // 同步筛选掉 task记录
// List<String> processInstanceIds = convertList(historicProcessInstances, HistoricProcessInstance::getId);
// tasks = tasks.stream().filter(task -> processInstanceIds.contains(task.getProcessInstanceId())).collect(Collectors.toList());
// }
//
// // 获得 ProcessInstance Map
// Map<String, HistoricProcessInstance> historicProcessInstanceMap = convertMap(historicProcessInstances, HistoricProcessInstance::getId);
//
// // 获得 User Map
// Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(
// convertSet(historicProcessInstanceMap.values(), instance -> Long.valueOf(instance.getStartUserId())));
// // 拼接结果
// return new PageResult<>(
// BpmTaskConvert.INSTANCE.convertList2(tasks, bpmTaskExtDOMap, historicProcessInstanceMap, userMap),
// taskQuery.count());
// // 获得 TaskExtDO Map
// List<BpmTaskExtDO> bpmTaskExtDOsTemp =