Merge remote-tracking branch 'origin/master'

This commit is contained in:
zjf committed 2025-02-27 12:08:52 +08:00
commit 0bb5f749e4
12 files changed
+258 -130

No files matched your search

@@ -8,7 +8,9 @@ import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.bsd.pjcloud.common.security.util.SecurityUtils;
import com.bsd.pjcloud.flow.task.entity.Process;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.bsd.pjcloud.common.core.util.R;
@@ -30,11 +32,9 @@ import org.flowable.engine.history.HistoricActivityInstance;
import org.flowable.engine.history.HistoricActivityInstanceQuery;
import org.flowable.engine.runtime.Execution;
import org.flowable.engine.runtime.ProcessInstance;
import org.flowable.task.api.Task;
import org.flowable.task.api.TaskQuery;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import java.time.ZoneId;
import java.time.ZonedDateTime;
@@ -250,6 +250,14 @@ public class EngineFlowController {
}
}
if (CollUtil.isNotEmpty(taskQueryParamDto.getProcessInstanceIds()) && StrUtil.isEmpty(taskQueryParamDto.getProcessName())) {
taskQuery.processInstanceIdIn(taskQueryParamDto.getProcessInstanceIds());
}
if (Objects.nonNull(taskQueryParamDto.getIsActive()) && taskQueryParamDto.getIsActive()) {
taskQuery.active();
}
if (ArrayUtil.isNotEmpty(taskQueryParamDto.getTaskTime())) {
ZoneId zoneId = ZoneId.systemDefault();
ZonedDateTime zonedBeforeDateTime = taskQueryParamDto.getTaskTime()[0].atZone(zoneId);
@@ -289,4 +297,30 @@ public class EngineFlowController {
return R.ok(pageResultDto);
}
@GetMapping("/queryAssignTaskOne")
public R<TaskDto> queryAssignTaskOne(@RequestParam String processInstanceId) {
String assign = SecurityUtils.getUser().getId().toString();
TaskQuery taskQuery = taskService.createTaskQuery().taskAssignee(assign).orderByTaskCreateTime().processInstanceId(processInstanceId).active().desc();
long count = taskQuery.count();
if (count != 1) {
log.debug("queryAssignTaskOne查询错误,count!=1,processInstanceId:{}", processInstanceId);
return null;
}
Task task = taskQuery.singleResult();
String taskId = task.getId();
log.debug("queryAssignTaskOne查询错误(taskId) {} processInstanceId={} executrionId={}", task.getName(), processInstanceId, task.getExecutionId());
String taskDefinitionKey = task.getTaskDefinitionKey();
String processDefinitionId = task.getProcessDefinitionId();
String flowId = NodeUtil.getFlowId(processDefinitionId);
TaskDto taskDto = new TaskDto();
taskDto.setFlowId(flowId);
taskDto.setTaskCreateTime(task.getCreateTime());
taskDto.setNodeId(taskDefinitionKey);
taskDto.setProcessInstanceId(processInstanceId);
taskDto.setTaskId(taskId);
taskDto.setAssign(task.getAssignee());
taskDto.setTaskName(task.getName());
return R.ok(taskDto);
}
}
@@ -20,110 +20,133 @@ import java.util.Map;
@FeignClient(contextId = "remoteFlowEngineService", value = ServiceNameConstants.FLOW_ENGINE_SERVER)
public interface RemoteFlowEngineService {
/**
* 查询任务变量
* @param variableQueryParamDto 变量查询参数
* @return 任务变量结果
*/
@PostMapping("/task/queryTaskVariables")
R<Map<String, Object>> queryTaskVariables(@RequestBody VariableQueryParamDto variableQueryParamDto);
/**
* 查询任务变量
*
* @param variableQueryParamDto 变量查询参数
* @return 任务变量结果
*/
@PostMapping("/task/queryTaskVariables")
R<Map<String, Object>> queryTaskVariables(@RequestBody VariableQueryParamDto variableQueryParamDto);
/**
* 查询简单数据
* @param userId 用户ID
* @return 索引页统计数据
*/
@GetMapping("/process-instance/querySimpleData")
R<IndexPageStatistics> querySimpleData(@RequestParam("userId") Long userId);
/**
* 查询简单数据
*
* @param userId 用户ID
* @return 索引页统计数据
*/
@GetMapping("/process-instance/querySimpleData")
R<IndexPageStatistics> querySimpleData(@RequestParam("userId") Long userId);
/**
* 创建流程
* @param map 流程JSON对象
* @return 创建流程结果
*/
@PostMapping("/flow/create")
R<String> createFlow(@RequestBody Map<String, Object> map);
/**
* 创建流程
*
* @param map 流程JSON对象
* @return 创建流程结果
*/
@PostMapping("/flow/create")
R<String> createFlow(@RequestBody Map<String, Object> map);
/**
* 启动流程实例
* @param processInstanceParamDto 流程实例参数
* @return 启动流程结果
*/
@NoToken
@PostMapping("/flow/start")
R<String> startProcess(@RequestBody ProcessInstanceParamDto processInstanceParamDto);
/**
* 启动流程实例
*
* @param processInstanceParamDto 流程实例参数
* @return 启动流程结果
*/
@NoToken
@PostMapping("/flow/start")
R<String> startProcess(@RequestBody ProcessInstanceParamDto processInstanceParamDto);
/**
* 查询待办任务
* @param paramDto 任务查询参数
* @return 待办任务列表
*/
@PostMapping("/flow/queryAssignTask")
R<Page<TaskDto>> queryAssignTask(@RequestBody TaskQueryParamDto paramDto);
/**
* 查询待办任务
*
* @param paramDto 任务查询参数
* @return 待办任务列表
*/
@PostMapping("/flow/queryAssignTask")
R<Page<TaskDto>> queryAssignTask(@RequestBody TaskQueryParamDto paramDto);
/**
* 查询已完成任务
* @param paramDto 任务查询参数
* @return 已完成任务列表
*/
@PostMapping("/flow/queryCompletedTask")
R<Page<TaskDto>> queryCompletedTask(@RequestBody TaskQueryParamDto paramDto);
/**
* 根据processInstanceId和当前登录用户id查询待办任务
*
* @param processInstanceId
* @return
*/
@GetMapping("/flow/queryAssignTaskOne")
R<TaskDto> queryAssignTaskOne(@RequestParam String processInstanceId);
/**
* 完成任务
* @param taskParamDto 任务参数
* @return 完成任务结果
*/
@PostMapping("/task/complete")
R<String> completeTask(@RequestBody TaskParamDto taskParamDto);
/**
* 设置任务负责人
* @param taskParamDto 任务参数
* @return 设置负责人结果
*/
@PostMapping("/task/transferTask")
R<String> transferTask(@RequestBody TaskParamDto taskParamDto);
/**
* 查询已完成任务
*
* @param paramDto 任务查询参数
* @return 已完成任务列表
*/
@PostMapping("/flow/queryCompletedTask")
R<Page<TaskDto>> queryCompletedTask(@RequestBody TaskQueryParamDto paramDto);
/**
* 停止流程实例
* @param taskParamDto 任务参数
* @return 停止流程实例结果
*/
@PostMapping("/flow/stopProcessInstance")
R<String> stopProcessInstance(@RequestBody TaskParamDto taskParamDto);
/**
* 完成任务
*
* @param taskParamDto 任务参数
* @return 完成任务结果
*/
@PostMapping("/task/complete")
R<String> completeTask(@RequestBody TaskParamDto taskParamDto);
/**
* 解决任务
* @param taskParamDto 任务参数
* @return 解决任务结果
*/
@PostMapping("/task/resolveTask")
R<String> resolveTask(@RequestBody TaskParamDto taskParamDto);
/**
* 设置任务负责人
*
* @param taskParamDto 任务参数
* @return 设置负责人结果
*/
@PostMapping("/task/transferTask")
R<String> transferTask(@RequestBody TaskParamDto taskParamDto);
/**
* 退回任务
* @param taskParamDto 任务参数
* @return 退回任务结果
*/
@PostMapping("/task/back")
R<String> back(@RequestBody TaskParamDto taskParamDto);
/**
* 停止流程实例
*
* @param taskParamDto 任务参数
* @return 停止流程实例结果
*/
@PostMapping("/flow/stopProcessInstance")
R<String> stopProcessInstance(@RequestBody TaskParamDto taskParamDto);
/**
* 委派任务
* @param taskParamDto 任务参数
* @return 委派任务结果
*/
@PostMapping("/task/delegateTask")
R<String> delegateTask(@RequestBody TaskParamDto taskParamDto);
/**
* 解决任务
*
* @param taskParamDto 任务参数
* @return 解决任务结果
*/
@PostMapping("/task/resolveTask")
R<String> resolveTask(@RequestBody TaskParamDto taskParamDto);
/**
* 查询任务
* @param taskId 任务ID
* @param userId 用户ID
* @return 任务查询结果
*/
@GetMapping("/task/engine/queryTask")
R<TaskResultDto> queryTask(@RequestParam("taskId") String taskId, @RequestParam("userId") Long userId);
/**
* 退回任务
*
* @param taskParamDto 任务参数
* @return 退回任务结果
*/
@PostMapping("/task/back")
R<String> back(@RequestBody TaskParamDto taskParamDto);
/**
* 委派任务
*
* @param taskParamDto 任务参数
* @return 委派任务结果
*/
@PostMapping("/task/delegateTask")
R<String> delegateTask(@RequestBody TaskParamDto taskParamDto);
/**
* 查询任务
*
* @param taskId 任务ID
* @param userId 用户ID
* @return 任务查询结果
*/
@GetMapping("/task/engine/queryTask")
R<TaskResultDto> queryTask(@RequestParam("taskId") String taskId, @RequestParam("userId") Long userId);
}
@@ -3,6 +3,7 @@ package com.bsd.pjcloud.flow.task.dto;
import lombok.Data;
import java.time.LocalDateTime;
import java.util.List;
/**
* 用户任务查询参数
@@ -40,4 +41,14 @@ public class TaskQueryParamDto {
*/
private Integer status;
/**
* 流程实例ids
*/
private List<String> processInstanceIds;
/**
* 是否只查询激活状态的任务
*/
private Boolean isActive = false;
}
@@ -55,6 +55,12 @@ public class ProcessInstanceController {
return processInstanceService.queryMineTask(queryParamDto);
}
@SneakyThrows
@GetMapping("/queryAssignTaskOne")
public R queryAssignTaskOne(@RequestParam String processInstanceId) {
return processInstanceService.queryAssignTaskOne(processInstanceId);
}
/**
* 查询当前登录用户已办任务
* @param taskQueryParamDto
@@ -66,4 +66,5 @@ public interface IProcessInstanceService {
*/
R detail(String processInstanceId);
R queryAssignTaskOne(String processInstanceId);
}
@@ -443,4 +443,8 @@ public class ProcessInstanceServiceImpl implements IProcessInstanceService {
return R.ok(set);
}
@Override
public R queryAssignTaskOne(String processInstanceId) {
return flowEngineService.queryAssignTaskOne(processInstanceId);
}
}
@@ -12,4 +12,8 @@ public class WalletRechargeApplyDto extends WalletRechargeApplyEntity {
private List<Long> walletTypeIds;
/**
* 审批相关
*/
private Boolean isFindCheckUser = false;
}
@@ -58,5 +58,4 @@ public class WalletDataUtil {
v.setWalletActiveBindStatus(vo.getActiveBindStatus());
return v;
}
}
@@ -33,4 +33,9 @@ public class WalletRechargeApplyVo extends WalletRechargeApplyEntity implements
*/
private String deptName;
/**
* 审批相关
*/
private Boolean isCheckUser = false;
}
@@ -57,7 +57,7 @@ public class WalletRechargeApplyController {
@Operation(summary = "提交申请", description = "提交申请")
@SysLog("提交申请")
@GetMapping("/apply")
@PreAuthorize("@pms.hasPermission('wallet_walletRechargeApply_apply')")
@PreAuthorize("@pms.hasPermission('wallet_walletRechargeApply_apply')")
public R apply(@RequestParam Long id) {
walletRechargeApplyService.apply(id);
return R.ok(true);
@@ -84,6 +84,7 @@ public class WalletRechargeApplyController {
@GetMapping("/page-join")
@PreAuthorize("@pms.hasPermission('wallet_walletRechargeApply_view')")
public R getWalletRechargeApplyPage(@ParameterObject Page page, @ParameterObject WalletRechargeApplyDto dto) {
dto.setIsFindCheckUser(true);
return R.ok(walletRechargeApplyService.scopePageList(page, dto));
}
@@ -23,9 +23,11 @@ import com.bsd.pjcloud.common.core.util.R;
import com.bsd.pjcloud.common.excel.vo.ErrorMessage;
import com.bsd.pjcloud.common.security.service.PjcloudUser;
import com.bsd.pjcloud.common.security.util.SecurityUtils;
import com.bsd.pjcloud.flow.task.api.feign.RemoteFlowEngineService;
import com.bsd.pjcloud.flow.task.constant.NodeStatusEnum;
import com.bsd.pjcloud.flow.task.constant.TaskCheckStatusEnum;
import com.bsd.pjcloud.flow.task.dto.ProcessNodeRecordAssignUserParamDto;
import com.bsd.pjcloud.flow.task.dto.TaskDto;
import com.bsd.pjcloud.wallet.api.constant.WalletBizEnum;
import com.bsd.pjcloud.wallet.api.constant.WalletBizRechargeEnum;
import com.bsd.pjcloud.wallet.api.constant.WalletTypeEnum;
@@ -86,6 +88,7 @@ public class WalletRechargeApplyServiceImpl extends ServiceImpl<WalletRechargeAp
private final RemoteUserService userService;
private final RemoteDeptService deptService;
private final RemoteFlowEngineService flowEngineService;
private final FlowUtil flowUtil;
@@ -159,34 +162,7 @@ public class WalletRechargeApplyServiceImpl extends ServiceImpl<WalletRechargeAp
@Override
public Page<WalletRechargeApplyVo> scopePageList(Page page, WalletRechargeApplyDto dto) {
Page<WalletRechargeApplyVo> list = baseMapper.scopePageList(page, dto);
if (ObjectUtil.isNotEmpty(list.getRecords())) {
// 用户
List<Long> userIds = list.getRecords().stream().map(WalletRechargeApplyVo::getUserId).distinct().toList();
if (ObjectUtil.isNotEmpty(userIds)) {
R<List<SysUser>> userList = userService.getUserById(new ArrayList<>(userIds));
if (ObjectUtil.isNotEmpty(userList.getData())) {
DataUtil.convertUserList(list.getRecords(), CollectionUtils.convertMap(userList.getData(), SysUser::getUserId));
}
}
// 部门
List<Long> deptIds = list.getRecords().stream().map(WalletRechargeApplyVo::getDeptId).distinct().toList();
if (ObjectUtil.isNotEmpty(deptIds)) {
R<Map<Long, SysDept>> deptList = deptService.getDeptByDeptIds(deptIds);
if (ObjectUtil.isNotEmpty(deptList.getData())) {
DataUtil.convertDeptList(list.getRecords(), deptList.getData());
}
}
// 饭卡类型
List<Long> walletTypeIds = list.getRecords().stream().map(WalletRechargeApplyVo::getWalletTypeId).distinct().toList();
if (ObjectUtil.isNotEmpty(walletTypeIds)) {
WalletTypeDto walletTypeDto = new WalletTypeDto();
walletTypeDto.setWalletTypeIds(walletTypeIds);
List<WalletTypeEntity> walletTypeList = walletTypeMapper.list(walletTypeDto);
if (ObjectUtil.isNotEmpty(walletTypeList)) {
WalletDataUtil.convertWalletTypeList(list.getRecords(), CollectionUtils.convertMap(walletTypeList, WalletTypeEntity::getId));
}
}
}
disposeList(list.getRecords(), dto);
return list;
}
@@ -392,6 +368,54 @@ public class WalletRechargeApplyServiceImpl extends ServiceImpl<WalletRechargeAp
return result;
}
private void disposeList(List<WalletRechargeApplyVo> list, WalletRechargeApplyDto dto) {
if (ObjectUtil.isNotEmpty(list)) {
// 用户
List<Long> userIds = list.stream().map(WalletRechargeApplyVo::getUserId).distinct().toList();
if (ObjectUtil.isNotEmpty(userIds)) {
R<List<SysUser>> userList = userService.getUserById(new ArrayList<>(userIds));
if (ObjectUtil.isNotEmpty(userList.getData())) {
DataUtil.convertUserList(list, CollectionUtils.convertMap(userList.getData(), SysUser::getUserId));
}
}
// 部门
List<Long> deptIds = list.stream().map(WalletRechargeApplyVo::getDeptId).distinct().toList();
if (ObjectUtil.isNotEmpty(deptIds)) {
R<Map<Long, SysDept>> deptList = deptService.getDeptByDeptIds(deptIds);
if (ObjectUtil.isNotEmpty(deptList.getData())) {
DataUtil.convertDeptList(list, deptList.getData());
}
}
// 饭卡类型
List<Long> walletTypeIds = list.stream().map(WalletRechargeApplyVo::getWalletTypeId).distinct().toList();
if (ObjectUtil.isNotEmpty(walletTypeIds)) {
WalletTypeDto walletTypeDto = new WalletTypeDto();
walletTypeDto.setWalletTypeIds(walletTypeIds);
List<WalletTypeEntity> walletTypeList = walletTypeMapper.list(walletTypeDto);
if (ObjectUtil.isNotEmpty(walletTypeList)) {
WalletDataUtil.convertWalletTypeList(list, CollectionUtils.convertMap(walletTypeList, WalletTypeEntity::getId));
}
}
// 审批流程
if (dto.getIsFindCheckUser()) {
List<String> processInstanceIds = list.stream().map(WalletRechargeApplyVo::getProcessId).filter(ObjectUtil::isNotEmpty).distinct().toList();
if (ObjectUtil.isNotEmpty(processInstanceIds)) {
List<TaskDto> taskList = flowUtil.queryProcessInstanceList(SecurityUtils.getUser().getId().toString(), processInstanceIds);
if (ObjectUtil.isNotEmpty(taskList)) {
Map<String, TaskDto> taskMap = CollectionUtils.convertMap(taskList, TaskDto::getProcessInstanceId);
CollectionUtils.convertList(list, v -> {
TaskDto task = taskMap.get(v.getProcessId());
if (ObjectUtil.isNotEmpty(task)) {
v.setIsCheckUser(true);
}
return v;
});
}
}
}
}
}
private boolean isCheckData(Long walletId) {
Long count = baseMapper.selectCount(new LambdaQueryWrapper<WalletRechargeApplyEntity>()
.eq(WalletRechargeApplyEntity::getUserId, walletId)
@@ -6,13 +6,17 @@ import cn.hutool.core.lang.Dict;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.bsd.pjcloud.admin.api.entity.SysUser;
import com.bsd.pjcloud.common.core.util.R;
import com.bsd.pjcloud.common.data.resolver.ParamResolver;
import com.bsd.pjcloud.flow.task.api.feign.RemoteFlowApiFlowService;
import com.bsd.pjcloud.flow.task.api.feign.RemoteFlowEngineService;
import com.bsd.pjcloud.flow.task.constant.NodeUserTypeEnum;
import com.bsd.pjcloud.flow.task.dto.ProcessInstanceParamDto;
import com.bsd.pjcloud.flow.task.dto.ProcessNodeRecordAssignUserParamDto;
import com.bsd.pjcloud.flow.task.dto.TaskDto;
import com.bsd.pjcloud.flow.task.dto.TaskQueryParamDto;
import com.bsd.pjcloud.flow.task.entity.Process;
import com.bsd.pjcloud.flow.task.vo.ProcessVO;
import com.fasterxml.jackson.databind.ObjectMapper;
@@ -21,9 +25,7 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.validation.annotation.Validated;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
import java.util.*;
@Validated
@Slf4j
@@ -34,6 +36,7 @@ public class FlowUtil {
static private final String TAG = "钱包审批流工具类";
private final RemoteFlowApiFlowService flowApiFlowService;
private final RemoteFlowEngineService flowEngineService;
private final ObjectMapper objectMapper;
@@ -78,6 +81,19 @@ public class FlowUtil {
return paramMap;
}
public List<TaskDto> queryProcessInstanceList(String userId, List<String> processInstanceIds) {
List<TaskDto> result = new ArrayList<>();
TaskQueryParamDto taskQueryParamDto = new TaskQueryParamDto();
taskQueryParamDto.setAssign(userId);
taskQueryParamDto.setProcessInstanceIds(processInstanceIds);
taskQueryParamDto.setIsActive(true);
taskQueryParamDto.setCurrent(1);
taskQueryParamDto.setSize(processInstanceIds.size() + 10);
Page<TaskDto> taskList = flowEngineService.queryAssignTask(taskQueryParamDto).getData();
if (ObjectUtil.isEmpty(taskList) || ObjectUtil.isEmpty(taskList.getRecords())) return result;
return taskList.getRecords();
}
// 检查回调是否正确
public Boolean checkCallback(ProcessNodeRecordAssignUserParamDto dto) {
if (!ObjectUtil.isAllNotEmpty(dto, dto.getFlowId())) return false;