♻️ [工作流] 代办任务列表查询修改查询用户ID列表和去掉查询任务参数

(cherry picked from commit 84e0116e9bce2725dcd20274c4faf1872f7c86fe)
This commit is contained in:
冷冷 committed 2024-08-16 15:19:32 +08:00
1 parent a616bcc2de
commit 51a20ad898
4 files changed
+486 -494

No files matched your search

@@ -1,6 +1,5 @@
package com.pig4cloud.pigx.flow.engine.controller; package com.pig4cloud.pigx.flow.engine.controller;
import cn.hutool.core.codec.Base64;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DatePattern; import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
@@ -9,7 +8,6 @@ import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.RandomUtil; import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import com.pig4cloud.pigx.common.core.util.R; import com.pig4cloud.pigx.common.core.util.R;
@@ -20,7 +18,6 @@ import com.pig4cloud.pigx.flow.task.utils.NodeUtil;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.SneakyThrows; import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.flowable.bpmn.BpmnAutoLayout;
import org.flowable.bpmn.converter.BpmnXMLConverter; import org.flowable.bpmn.converter.BpmnXMLConverter;
import org.flowable.bpmn.model.BpmnModel; import org.flowable.bpmn.model.BpmnModel;
import org.flowable.common.engine.impl.identity.Authentication; import org.flowable.common.engine.impl.identity.Authentication;
@@ -30,14 +27,14 @@ import org.flowable.engine.RuntimeService;
import org.flowable.engine.TaskService; import org.flowable.engine.TaskService;
import org.flowable.engine.history.HistoricActivityInstance; import org.flowable.engine.history.HistoricActivityInstance;
import org.flowable.engine.history.HistoricActivityInstanceQuery; import org.flowable.engine.history.HistoricActivityInstanceQuery;
import org.flowable.engine.history.HistoricProcessInstance;
import org.flowable.engine.runtime.Execution; import org.flowable.engine.runtime.Execution;
import org.flowable.engine.runtime.ProcessInstance; import org.flowable.engine.runtime.ProcessInstance;
import org.flowable.image.impl.DefaultProcessDiagramGenerator;
import org.flowable.task.api.TaskQuery; import org.flowable.task.api.TaskQuery;
import org.springframework.web.bind.annotation.*; 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 java.io.InputStream;
import java.time.ZoneId; import java.time.ZoneId;
import java.time.ZonedDateTime; import java.time.ZonedDateTime;
import java.util.*; import java.util.*;
@@ -52,247 +49,242 @@ import java.util.stream.Collectors;
@RequestMapping("/flow") @RequestMapping("/flow")
public class EngineFlowController { public class EngineFlowController {
private final TaskService taskService; private final TaskService taskService;
private final HistoryService historyService; private final HistoryService historyService;
private final RepositoryService repositoryService; private final RepositoryService repositoryService;
private final RuntimeService runtimeService; private final RuntimeService runtimeService;
private final ObjectMapper objectMapper; private final ObjectMapper objectMapper;
/** /**
* 创建流程定义 * 创建流程定义
* @param map 创建参数 *
* @return 流程定义ID * @param map 创建参数
*/ * @return 流程定义ID
@PostMapping("create") */
@SneakyThrows @PostMapping("create")
public R create(@RequestBody Map<String, Object> map) { @SneakyThrows
public R create(@RequestBody Map<String, Object> map) {
Long userId = MapUtil.getLong(map, "userId"); Long userId = MapUtil.getLong(map, "userId");
Process process = MapUtil.get(map, "process", Process.class); Process process = MapUtil.get(map, "process", Process.class);
String flowId = "P" + DateUtil.format(new Date(), DatePattern.PURE_DATETIME_MS_PATTERN) String flowId = "P" + DateUtil.format(new Date(), DatePattern.PURE_DATETIME_MS_PATTERN)
+ RandomUtil.randomString(5).toUpperCase(); + RandomUtil.randomString(5).toUpperCase();
log.info("flowId={}", flowId); log.info("flowId={}", flowId);
BpmnModel bpmnModel = ModelUtil.buildBpmnModel(objectMapper.readValue(process.getProcess(), Node.class), BpmnModel bpmnModel = ModelUtil.buildBpmnModel(objectMapper.readValue(process.getProcess(), Node.class),
process.getName(), flowId); process.getName(), flowId);
{ {
byte[] bpmnBytess = new BpmnXMLConverter().convertToXML(bpmnModel); byte[] bpmnBytess = new BpmnXMLConverter().convertToXML(bpmnModel);
String filename = "/tmp/flowable-deployment/" + flowId + ".bpmn20.xml"; String filename = "/tmp/flowable-deployment/" + flowId + ".bpmn20.xml";
log.debug("部署时的模型文件:{}", filename); log.debug("部署时的模型文件:{}", filename);
FileUtil.writeBytes(bpmnBytess, filename); FileUtil.writeBytes(bpmnBytess, filename);
} }
repositoryService.createDeployment().addBpmnModel(StrUtil.format("{}.bpmn20.xml", "pig"), bpmnModel).deploy(); repositoryService.createDeployment().addBpmnModel(StrUtil.format("{}.bpmn20.xml", "pig"), bpmnModel).deploy();
return R.ok(flowId); return R.ok(flowId);
} }
/** /**
* 启动流程实例 * 启动流程实例
* @param processInstanceParamDto 启动参数 *
* @return 流程实例ID * @param processInstanceParamDto 启动参数
*/ * @return 流程实例ID
@PostMapping("/start") */
public R start(@RequestBody ProcessInstanceParamDto processInstanceParamDto) { @PostMapping("/start")
Authentication.setAuthenticatedUserId(processInstanceParamDto.getStartUserId()); public R start(@RequestBody ProcessInstanceParamDto processInstanceParamDto) {
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processInstanceParamDto.getFlowId(), Authentication.setAuthenticatedUserId(processInstanceParamDto.getStartUserId());
processInstanceParamDto.getParamMap()); ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processInstanceParamDto.getFlowId(),
processInstanceParamDto.getParamMap());
String processInstanceId = processInstance.getProcessInstanceId(); String processInstanceId = processInstance.getProcessInstanceId();
return R.ok(processInstanceId); return R.ok(processInstanceId);
} }
/** /**
* 审批任务 * 审批任务
* @param taskId 任务ID *
* @param approved 是否通过 * @param taskId 任务ID
*/ * @param approved 是否通过
@PostMapping("/approve") */
public void approve(String taskId, boolean approved) { @PostMapping("/approve")
Map<String, Object> variables = new HashMap<>(); public void approve(String taskId, boolean approved) {
variables.put("approved", approved); Map<String, Object> variables = new HashMap<>();
variables.put("ko", 10); variables.put("approved", approved);
variables.put("assigneeListSub", CollUtil.newArrayList("aa", "bb")); variables.put("ko", 10);
taskService.complete(taskId, variables); variables.put("assigneeListSub", CollUtil.newArrayList("aa", "bb"));
taskService.complete(taskId, variables);
} }
/** /**
* 停止流程实例 * 停止流程实例
* @param taskParamDto 参数 *
* @return 操作结果 * @param taskParamDto 参数
*/ * @return 操作结果
@PostMapping("stopProcessInstance") */
public R stopProcessInstance(@RequestBody TaskParamDto taskParamDto) { @PostMapping("stopProcessInstance")
List<String> processInstanceIdList = taskParamDto.getProcessInstanceIdList(); public R stopProcessInstance(@RequestBody TaskParamDto taskParamDto) {
processInstanceIdList.forEach(processInstanceId -> { List<String> processInstanceIdList = taskParamDto.getProcessInstanceIdList();
// 查询流程实例 processInstanceIdList.forEach(processInstanceId -> {
ProcessInstance processInstance = runtimeService.createProcessInstanceQuery() // 查询流程实例
.processInstanceId(processInstanceId) ProcessInstance processInstance = runtimeService.createProcessInstanceQuery()
.singleResult(); .processInstanceId(processInstanceId)
if (Optional.ofNullable(processInstance).isPresent()) { .singleResult();
// 查询执行实例 if (Optional.ofNullable(processInstance).isPresent()) {
List<String> executionIds = runtimeService.createExecutionQuery() // 查询执行实例
.parentId(processInstanceId) List<String> executionIds = runtimeService.createExecutionQuery()
.list() .parentId(processInstanceId)
.stream() .list()
.map(Execution::getId) .stream()
.collect(Collectors.toList()); .map(Execution::getId)
// 更改活动状态为结束 .collect(Collectors.toList());
runtimeService.createChangeActivityStateBuilder() // 更改活动状态为结束
.moveExecutionsToSingleActivityId(executionIds, "end") runtimeService.createChangeActivityStateBuilder()
.changeState(); .moveExecutionsToSingleActivityId(executionIds, "end")
} .changeState();
}); }
return R.ok(); });
} return R.ok();
}
/** /**
* 查询用户已办任务 * 查询用户已办任务
* @param taskQueryParamDto 查询参数 *
* @return 分页任务信息 * @param taskQueryParamDto 查询参数
*/ * @return 分页任务信息
@PostMapping("/queryCompletedTask") */
public R queryCompletedTask(@RequestBody TaskQueryParamDto taskQueryParamDto) { @PostMapping("/queryCompletedTask")
HistoricActivityInstanceQuery historicActivityInstanceQuery = historyService public R queryCompletedTask(@RequestBody TaskQueryParamDto taskQueryParamDto) {
.createHistoricActivityInstanceQuery(); HistoricActivityInstanceQuery historicActivityInstanceQuery = historyService
HistoricActivityInstanceQuery activityInstanceQuery = historicActivityInstanceQuery .createHistoricActivityInstanceQuery();
.taskAssignee(taskQueryParamDto.getAssign()) HistoricActivityInstanceQuery activityInstanceQuery = historicActivityInstanceQuery
.finished() .taskAssignee(taskQueryParamDto.getAssign())
.orderByHistoricActivityInstanceEndTime() .finished()
.desc(); .orderByHistoricActivityInstanceEndTime()
.desc();
if (ArrayUtil.isNotEmpty(taskQueryParamDto.getTaskTime())) { if (ArrayUtil.isNotEmpty(taskQueryParamDto.getTaskTime())) {
ZoneId zoneId = ZoneId.systemDefault(); ZoneId zoneId = ZoneId.systemDefault();
ZonedDateTime zonedBeforeDateTime = taskQueryParamDto.getTaskTime()[0].atZone(zoneId); ZonedDateTime zonedBeforeDateTime = taskQueryParamDto.getTaskTime()[0].atZone(zoneId);
ZonedDateTime zonedAfterDateTime = taskQueryParamDto.getTaskTime()[1].atZone(zoneId); ZonedDateTime zonedAfterDateTime = taskQueryParamDto.getTaskTime()[1].atZone(zoneId);
Date beforeDate = Date.from(zonedBeforeDateTime.toInstant()); Date beforeDate = Date.from(zonedBeforeDateTime.toInstant());
Date afterDate = Date.from(zonedAfterDateTime.toInstant()); Date afterDate = Date.from(zonedAfterDateTime.toInstant());
activityInstanceQuery.finishedBefore(afterDate).finishedAfter(beforeDate); activityInstanceQuery.finishedBefore(afterDate).finishedAfter(beforeDate);
} }
List<HistoricActivityInstance> list = activityInstanceQuery.listPage( List<HistoricActivityInstance> list = activityInstanceQuery
(taskQueryParamDto.getCurrent() - 1) * taskQueryParamDto.getSize(), .listPage((taskQueryParamDto.getCurrent() - 1) * taskQueryParamDto.getSize(), taskQueryParamDto.getSize());
taskQueryParamDto.getSize());
long count = activityInstanceQuery.count(); long count = activityInstanceQuery.count();
List<TaskDto> taskDtoList = new ArrayList<>(); List<TaskDto> taskDtoList = new ArrayList<>();
for (HistoricActivityInstance historicActivityInstance : list) { for (HistoricActivityInstance historicActivityInstance : list) {
String activityId = historicActivityInstance.getActivityId(); String activityId = historicActivityInstance.getActivityId();
String activityName = historicActivityInstance.getActivityName(); String activityName = historicActivityInstance.getActivityName();
String executionId = historicActivityInstance.getExecutionId(); String executionId = historicActivityInstance.getExecutionId();
String taskId = historicActivityInstance.getTaskId(); String taskId = historicActivityInstance.getTaskId();
Date startTime = historicActivityInstance.getStartTime(); Date startTime = historicActivityInstance.getStartTime();
Date endTime = historicActivityInstance.getEndTime(); Date endTime = historicActivityInstance.getEndTime();
Long durationInMillis = historicActivityInstance.getDurationInMillis(); Long durationInMillis = historicActivityInstance.getDurationInMillis();
String processInstanceId = historicActivityInstance.getProcessInstanceId(); String processInstanceId = historicActivityInstance.getProcessInstanceId();
String processDefinitionId = historicActivityInstance.getProcessDefinitionId(); String processDefinitionId = historicActivityInstance.getProcessDefinitionId();
// 流程id // 流程id
String flowId = NodeUtil.getFlowId(processDefinitionId); String flowId = NodeUtil.getFlowId(processDefinitionId);
TaskDto taskDto = new TaskDto(); TaskDto taskDto = new TaskDto();
taskDto.setFlowId(flowId); taskDto.setFlowId(flowId);
taskDto.setTaskCreateTime(startTime); taskDto.setTaskCreateTime(startTime);
taskDto.setTaskEndTime(endTime); taskDto.setTaskEndTime(endTime);
taskDto.setNodeId(activityId); taskDto.setNodeId(activityId);
taskDto.setExecutionId(executionId); taskDto.setExecutionId(executionId);
taskDto.setProcessInstanceId(processInstanceId); taskDto.setProcessInstanceId(processInstanceId);
taskDto.setDurationInMillis(durationInMillis); taskDto.setDurationInMillis(durationInMillis);
taskDto.setTaskId(taskId); taskDto.setTaskId(taskId);
taskDto.setAssign(historicActivityInstance.getAssignee()); taskDto.setAssign(historicActivityInstance.getAssignee());
taskDto.setTaskName(activityName); taskDto.setTaskName(activityName);
taskDtoList.add(taskDto); taskDtoList.add(taskDto);
} }
Page<TaskDto> pageResultDto = new Page<>(); Page<TaskDto> pageResultDto = new Page<>();
pageResultDto.setTotal(count); pageResultDto.setTotal(count);
pageResultDto.setRecords(taskDtoList); pageResultDto.setRecords(taskDtoList);
return R.ok(pageResultDto); return R.ok(pageResultDto);
} }
/** /**
* 查询用户待办任务 * 查询用户待办任务
* @param taskQueryParamDto 查询参数 *
* @return 分页任务信息 * @param taskQueryParamDto 查询参数
*/ * @return 分页任务信息
@PostMapping("/queryAssignTask") */
public R queryAssignTask(@RequestBody TaskQueryParamDto taskQueryParamDto) { @PostMapping("/queryAssignTask")
public R queryAssignTask(@RequestBody TaskQueryParamDto taskQueryParamDto) {
String assign = taskQueryParamDto.getAssign(); String assign = taskQueryParamDto.getAssign();
List<TaskDto> taskDtoList = new ArrayList<>(); List<TaskDto> taskDtoList = new ArrayList<>();
int pageIndex = taskQueryParamDto.getCurrent() - 1; int pageIndex = taskQueryParamDto.getCurrent() - 1;
int pageSize = taskQueryParamDto.getSize(); int pageSize = taskQueryParamDto.getSize();
Page<TaskDto> pageResultDto = new Page<>(); Page<TaskDto> pageResultDto = new Page<>();
TaskQuery taskQuery = taskService.createTaskQuery().taskAssignee(assign).orderByTaskCreateTime().desc(); TaskQuery taskQuery = taskService.createTaskQuery().taskAssignee(assign).orderByTaskCreateTime().desc();
if (StrUtil.isNotBlank(taskQueryParamDto.getProcessName())) { if (StrUtil.isNotBlank(taskQueryParamDto.getProcessName())) {
List<ProcessInstance> processInstanceList = runtimeService.createProcessInstanceQuery() List<ProcessInstance> processInstanceList = runtimeService.createProcessInstanceQuery()
.processInstanceNameLikeIgnoreCase(taskQueryParamDto.getProcessName()) .processInstanceNameLikeIgnoreCase(taskQueryParamDto.getProcessName())
.list(); .list();
if (CollUtil.isNotEmpty(processInstanceList)) { if (CollUtil.isNotEmpty(processInstanceList)) {
taskQuery.processInstanceIdIn(processInstanceList.stream() taskQuery.processInstanceIdIn(processInstanceList.stream()
.map(ProcessInstance::getProcessDefinitionId) .map(ProcessInstance::getProcessDefinitionId)
.collect(Collectors.toList())); .collect(Collectors.toList()));
} }
} }
if (ArrayUtil.isNotEmpty(taskQueryParamDto.getTaskTime())) { if (ArrayUtil.isNotEmpty(taskQueryParamDto.getTaskTime())) {
ZoneId zoneId = ZoneId.systemDefault(); ZoneId zoneId = ZoneId.systemDefault();
ZonedDateTime zonedBeforeDateTime = taskQueryParamDto.getTaskTime()[0].atZone(zoneId); ZonedDateTime zonedBeforeDateTime = taskQueryParamDto.getTaskTime()[0].atZone(zoneId);
ZonedDateTime zonedAfterDateTime = taskQueryParamDto.getTaskTime()[1].atZone(zoneId); ZonedDateTime zonedAfterDateTime = taskQueryParamDto.getTaskTime()[1].atZone(zoneId);
Date beforeDate = Date.from(zonedBeforeDateTime.toInstant()); Date beforeDate = Date.from(zonedBeforeDateTime.toInstant());
Date afterDate = Date.from(zonedAfterDateTime.toInstant()); Date afterDate = Date.from(zonedAfterDateTime.toInstant());
taskQuery.taskCreatedBefore(afterDate).taskCreatedAfter(beforeDate); taskQuery.taskCreatedBefore(afterDate).taskCreatedAfter(beforeDate);
} }
taskQuery.listPage(pageIndex * pageSize, pageSize).forEach(task -> { taskQuery.listPage(pageIndex * pageSize, pageSize).forEach(task -> {
String taskId = task.getId(); String taskId = task.getId();
String processInstanceId = task.getProcessInstanceId(); String processInstanceId = task.getProcessInstanceId();
log.debug("(taskId) " + task.getName() + " processInstanceId={} executrionId={}", processInstanceId, log.debug("(taskId) {} processInstanceId={} executrionId={}", task.getName(), processInstanceId, task.getExecutionId());
task.getExecutionId());
Map<String, Object> taskServiceVariables = taskService.getVariables(taskId); String taskDefinitionKey = task.getTaskDefinitionKey();
Map<String, Object> runtimeServiceVariables = runtimeService.getVariables(processInstanceId); String processDefinitionId = task.getProcessDefinitionId();
Map<String, Object> variables = runtimeService.getVariables(task.getExecutionId()); String flowId = NodeUtil.getFlowId(processDefinitionId);
log.debug("任务变量:{}", JSONUtil.toJsonStr(taskServiceVariables));
log.debug("流程节点:{}", JSONUtil.toJsonStr(runtimeServiceVariables));
log.debug("执行节点变量:{}", JSONUtil.toJsonStr(variables));
String taskDefinitionKey = task.getTaskDefinitionKey(); TaskDto taskDto = new TaskDto();
String processDefinitionId = task.getProcessDefinitionId(); taskDto.setFlowId(flowId);
String flowId = NodeUtil.getFlowId(processDefinitionId); taskDto.setTaskCreateTime(task.getCreateTime());
taskDto.setNodeId(taskDefinitionKey);
taskDto.setProcessInstanceId(processInstanceId);
taskDto.setTaskId(taskId);
taskDto.setAssign(task.getAssignee());
taskDto.setTaskName(task.getName());
taskDtoList.add(taskDto);
});
TaskDto taskDto = new TaskDto(); long count = taskQuery.count();
taskDto.setFlowId(flowId);
taskDto.setTaskCreateTime(task.getCreateTime());
taskDto.setNodeId(taskDefinitionKey);
taskDto.setParamMap(taskServiceVariables);
taskDto.setProcessInstanceId(processInstanceId);
taskDto.setTaskId(taskId);
taskDto.setAssign(task.getAssignee());
taskDto.setTaskName(task.getName());
taskDtoList.add(taskDto); log.debug("当前有 {} 个任务:", count);
});
long count = taskQuery.count(); pageResultDto.setTotal(count);
pageResultDto.setRecords(taskDtoList);
log.debug("当前有" + count + " 个任务:"); return R.ok(pageResultDto);
}
pageResultDto.setTotal(count);
pageResultDto.setRecords(taskDtoList);
return R.ok(pageResultDto);
}
} }
@@ -45,51 +45,52 @@ import java.util.stream.Collectors;
@RequiredArgsConstructor @RequiredArgsConstructor
public class ProcessInstanceServiceImpl implements IProcessInstanceService { public class ProcessInstanceServiceImpl implements IProcessInstanceService {
private final RemoteFlowEngineService flowEngineService; private final RemoteFlowEngineService flowEngineService;
private final RemoteUserService userService; private final RemoteUserService userService;
private final IProcessInstanceRecordService processInstanceRecordService; private final IProcessInstanceRecordService processInstanceRecordService;
private final IProcessCopyService processCopyService; private final IProcessCopyService processCopyService;
private final IProcessService processService; private final IProcessService processService;
private final IProcessNodeRecordService processNodeRecordService; private final IProcessNodeRecordService processNodeRecordService;
private final IProcessNodeRecordAssignUserService processNodeRecordAssignUserService; private final IProcessNodeRecordAssignUserService processNodeRecordAssignUserService;
private final ObjectMapper objectMapper; private final ObjectMapper objectMapper;
/** /**
* 启动流程 * 启动流程
* @param processInstanceParamDto *
* @return * @param processInstanceParamDto
*/ * @return
@Override */
public R startProcessInstance(ProcessInstanceParamDto processInstanceParamDto) { @Override
public R startProcessInstance(ProcessInstanceParamDto processInstanceParamDto) {
PigxUser user = SecurityUtils.getUser(); PigxUser user = SecurityUtils.getUser();
processInstanceParamDto.setStartUserId(String.valueOf(user.getId())); processInstanceParamDto.setStartUserId(String.valueOf(user.getId()));
Map<String, Object> paramMap = processInstanceParamDto.getParamMap(); Map<String, Object> paramMap = processInstanceParamDto.getParamMap();
Dict rootUser = Dict.create() Dict rootUser = Dict.create()
.set("id", user.getId()) .set("id", user.getId())
.set("name", user.getUsername()) .set("name", user.getUsername())
.set("type", NodeUserTypeEnum.USER.getKey()); .set("type", NodeUserTypeEnum.USER.getKey());
paramMap.put("root", CollUtil.newArrayList(rootUser)); paramMap.put("root", CollUtil.newArrayList(rootUser));
return flowEngineService.startProcess(processInstanceParamDto); return flowEngineService.startProcess(processInstanceParamDto);
} }
/** /**
* 查询当前登录用户的待办任务 * 查询当前登录用户的待办任务
* @param pageVO *
* @param taskDto * @param taskQueryParamDto 查询参数
* @return * @return R
*/ */
@Override @Override
public R queryMineTask(TaskQueryParamDto taskQueryParamDto) { public R queryMineTask(TaskQueryParamDto taskQueryParamDto) {
taskQueryParamDto.setAssign(SecurityUtils.getUser().getId().toString()); taskQueryParamDto.setAssign(SecurityUtils.getUser().getId().toString());
R<Page<TaskDto>> r = flowEngineService.queryAssignTask(taskQueryParamDto); R<Page<TaskDto>> r = flowEngineService.queryAssignTask(taskQueryParamDto);
if (CollUtil.isEmpty(r.getData().getRecords())) { if (CollUtil.isEmpty(r.getData().getRecords())) {
@@ -108,10 +109,9 @@ public class ProcessInstanceServiceImpl implements IProcessInstanceService {
.list(); .list();
// 发起人 // 发起人
List<SysUser> startUserList = processInstanceRecordList.stream() // 发起人
.map(ProcessInstanceRecord::getUserId) List<Long> collect = processInstanceRecordList.stream().map(ProcessInstanceRecord::getUserId).collect(Collectors.toList());
.map(userId -> userService.getUserById(userId).getData()) List<SysUser> startUserList = userService.getUserById(collect).getData();
.toList();
Page<TaskDto> pageResultDto = r.getData(); Page<TaskDto> pageResultDto = r.getData();
List<TaskDto> taskDtoList = new ArrayList<>(); List<TaskDto> taskDtoList = new ArrayList<>();
@@ -141,304 +141,304 @@ public class ProcessInstanceServiceImpl implements IProcessInstanceService {
pageResultDto.setRecords(taskDtoList); pageResultDto.setRecords(taskDtoList);
return R.ok(pageResultDto); return R.ok(pageResultDto);
} }
/** /**
* 查询已办任务 * 查询已办任务
* @param taskQueryParamDto *
* @return * @param taskQueryParamDto 查询参数
*/ * @return R
@Override */
public R queryMineEndTask(TaskQueryParamDto taskQueryParamDto) { @Override
taskQueryParamDto.setAssign(SecurityUtils.getUser().getId().toString()); public R queryMineEndTask(TaskQueryParamDto taskQueryParamDto) {
R<Page<TaskDto>> r = flowEngineService.queryCompletedTask(taskQueryParamDto); taskQueryParamDto.setAssign(SecurityUtils.getUser().getId().toString());
R<Page<TaskDto>> r = flowEngineService.queryCompletedTask(taskQueryParamDto);
Page<TaskDto> pageResultDto = r.getData(); Page<TaskDto> pageResultDto = r.getData();
List<TaskDto> records = pageResultDto.getRecords(); List<TaskDto> records = pageResultDto.getRecords();
if (CollUtil.isEmpty(records)) { if (CollUtil.isEmpty(records)) {
return R.ok(pageResultDto); return R.ok(pageResultDto);
} }
Set<String> processInstanceIdSet = records.stream() Set<String> processInstanceIdSet = records.stream()
.map(TaskDto::getProcessInstanceId) .map(TaskDto::getProcessInstanceId)
.collect(Collectors.toSet()); .collect(Collectors.toSet());
// 流程实例记录 // 流程实例记录
List<ProcessInstanceRecord> processInstanceRecordList = processInstanceRecordService.lambdaQuery() List<ProcessInstanceRecord> processInstanceRecordList = processInstanceRecordService.lambdaQuery()
.in(ProcessInstanceRecord::getProcessInstanceId, processInstanceIdSet) .in(ProcessInstanceRecord::getProcessInstanceId, processInstanceIdSet)
.list(); .list();
// 发起人 // 发起人
List<SysUser> startUserList = processInstanceRecordList.stream() List<Long> collect = processInstanceRecordList.stream().map(ProcessInstanceRecord::getUserId).collect(Collectors.toList());
.map(ProcessInstanceRecord::getUserId) List<SysUser> startUserList = userService.getUserById(collect).getData();
.map(userId -> userService.getUserById(userId).getData())
.toList();
List<TaskDto> taskDtoList = new ArrayList<>(); List<TaskDto> taskDtoList = new ArrayList<>();
for (TaskDto record : records) { for (TaskDto record : records) {
ProcessInstanceRecord processInstanceRecord = processInstanceRecordList.stream() ProcessInstanceRecord processInstanceRecord = processInstanceRecordList.stream()
.filter(w -> StrUtil.equals(w.getProcessInstanceId(), record.getProcessInstanceId())) .filter(w -> StrUtil.equals(w.getProcessInstanceId(), record.getProcessInstanceId()))
.findAny() .findAny()
.orElse(null); .orElse(null);
if (processInstanceRecord != null) { if (processInstanceRecord != null) {
record.setProcessName(processInstanceRecord.getName()); record.setProcessName(processInstanceRecord.getName());
SysUser startUser = startUserList.stream() SysUser startUser = startUserList.stream()
.filter(w -> w.getUserId().longValue() == processInstanceRecord.getUserId()) .filter(w -> w.getUserId().longValue() == processInstanceRecord.getUserId())
.findAny() .findAny()
.orElse(null); .orElse(null);
record.setRootUserId(processInstanceRecord.getUserId()); record.setRootUserId(processInstanceRecord.getUserId());
record.setGroupName(processInstanceRecord.getGroupName()); record.setGroupName(processInstanceRecord.getGroupName());
record.setRootUserName(startUser.getName()); record.setRootUserName(startUser.getName());
record.setRootUserAvatarUrl(startUser.getAvatar()); record.setRootUserAvatarUrl(startUser.getAvatar());
record.setTaskId(record.getTaskId()); record.setTaskId(record.getTaskId());
record.setStartTime(processInstanceRecord.getCreateTime()); record.setStartTime(processInstanceRecord.getCreateTime());
taskDtoList.add(record); taskDtoList.add(record);
} }
} }
pageResultDto.setRecords(taskDtoList); pageResultDto.setRecords(taskDtoList);
return R.ok(pageResultDto); return R.ok(pageResultDto);
} }
/** /**
* 流程结束 * 流程结束
* @param processsInstanceId *
* @return * @param processsInstanceId
*/ * @return
@Override */
public R end(String processsInstanceId) { @Override
processInstanceRecordService.lambdaUpdate() public R end(String processsInstanceId) {
.set(ProcessInstanceRecord::getEndTime, new Date()) processInstanceRecordService.lambdaUpdate()
.set(ProcessInstanceRecord::getStatus, NodeStatusEnum.YJS.getCode()) .set(ProcessInstanceRecord::getEndTime, new Date())
.eq(ProcessInstanceRecord::getProcessInstanceId, processsInstanceId) .set(ProcessInstanceRecord::getStatus, NodeStatusEnum.YJS.getCode())
.update(new ProcessInstanceRecord()); .eq(ProcessInstanceRecord::getProcessInstanceId, processsInstanceId)
return R.ok(); .update(new ProcessInstanceRecord());
} return R.ok();
}
/** /**
* 查询我发起的 * 查询我发起的
* @param pageDto *
* @return * @param taskQueryParamDto 查询条件
*/ * @return
@Override */
public R queryMineStarted(TaskQueryParamDto taskQueryParamDto) { @Override
public R queryMineStarted(TaskQueryParamDto taskQueryParamDto) {
long userId = SecurityUtils.getUser().getId(); long userId = SecurityUtils.getUser().getId();
Page<ProcessInstanceRecord> instanceRecordPage = processInstanceRecordService.lambdaQuery() Page<ProcessInstanceRecord> instanceRecordPage = processInstanceRecordService.lambdaQuery()
.eq(ProcessInstanceRecord::getUserId, userId) .eq(ProcessInstanceRecord::getUserId, userId)
.eq(ProcessInstanceRecord::getStatus, taskQueryParamDto.getStatus()) .eq(ProcessInstanceRecord::getStatus, taskQueryParamDto.getStatus())
.between(ArrayUtil.isNotEmpty(taskQueryParamDto.getTaskTime()), ProcessInstanceRecord::getCreateTime, .between(ArrayUtil.isNotEmpty(taskQueryParamDto.getTaskTime()), ProcessInstanceRecord::getCreateTime,
ArrayUtil.isNotEmpty(taskQueryParamDto.getTaskTime()) ? taskQueryParamDto.getTaskTime()[0] : null, ArrayUtil.isNotEmpty(taskQueryParamDto.getTaskTime()) ? taskQueryParamDto.getTaskTime()[0] : null,
ArrayUtil.isNotEmpty(taskQueryParamDto.getTaskTime()) ? taskQueryParamDto.getTaskTime()[1] : null) ArrayUtil.isNotEmpty(taskQueryParamDto.getTaskTime()) ? taskQueryParamDto.getTaskTime()[1] : null)
.orderByDesc(ProcessInstanceRecord::getCreateTime) .orderByDesc(ProcessInstanceRecord::getCreateTime)
.page(new Page<>(taskQueryParamDto.getCurrent(), taskQueryParamDto.getSize())); .page(new Page<>(taskQueryParamDto.getCurrent(), taskQueryParamDto.getSize()));
return R.ok(instanceRecordPage); return R.ok(instanceRecordPage);
} }
/** /**
* 查询抄送给我的 * 查询抄送给我的
* @param pageDto *
* @return * @param taskQueryParamDto 查询参数
*/ * @return
@Override */
public R queryMineCC(TaskQueryParamDto taskQueryParamDto) { @Override
public R queryMineCC(TaskQueryParamDto taskQueryParamDto) {
long userId = SecurityUtils.getUser().getId(); long userId = SecurityUtils.getUser().getId();
Page<ProcessCopy> page = processCopyService.lambdaQuery() Page<ProcessCopy> page = processCopyService.lambdaQuery()
.eq(ProcessCopy::getUserId, userId) .eq(ProcessCopy::getUserId, userId)
.between(ArrayUtil.isNotEmpty(taskQueryParamDto.getTaskTime()), ProcessCopy::getCreateTime, .between(ArrayUtil.isNotEmpty(taskQueryParamDto.getTaskTime()), ProcessCopy::getCreateTime,
ArrayUtil.isNotEmpty(taskQueryParamDto.getTaskTime()) ? taskQueryParamDto.getTaskTime()[0] : null, ArrayUtil.isNotEmpty(taskQueryParamDto.getTaskTime()) ? taskQueryParamDto.getTaskTime()[0] : null,
ArrayUtil.isNotEmpty(taskQueryParamDto.getTaskTime()) ? taskQueryParamDto.getTaskTime()[1] : null) ArrayUtil.isNotEmpty(taskQueryParamDto.getTaskTime()) ? taskQueryParamDto.getTaskTime()[1] : null)
.orderByDesc(ProcessCopy::getNodeTime) .orderByDesc(ProcessCopy::getNodeTime)
.page(new Page<>(taskQueryParamDto.getCurrent(), taskQueryParamDto.getSize())); .page(new Page<>(taskQueryParamDto.getCurrent(), taskQueryParamDto.getSize()));
List<ProcessCopy> records = page.getRecords(); List<ProcessCopy> records = page.getRecords();
List<ProcessCopyVo> processCopyVoList = BeanUtil.copyToList(records, ProcessCopyVo.class); List<ProcessCopyVo> processCopyVoList = BeanUtil.copyToList(records, ProcessCopyVo.class);
if (CollUtil.isNotEmpty(records)) { if (CollUtil.isNotEmpty(records)) {
// 发起人 // 发起人
List<SysUser> startUserList = records.stream() List<Long> userIdList = records.stream().map(ProcessCopy::getStartUserId).collect(Collectors.toList());
.map(ProcessCopy::getStartUserId) List<SysUser> startUserList = userService.getUserById(userIdList).getData();
.map(id -> userService.getUserById(id).getData())
.toList();
for (ProcessCopyVo record : processCopyVoList) { for (ProcessCopyVo record : processCopyVoList) {
SysUser startUser = startUserList.stream() SysUser startUser = startUserList.stream()
.filter(w -> w.getUserId().longValue() == record.getStartUserId()) .filter(w -> w.getUserId().longValue() == record.getStartUserId())
.findAny() .findAny()
.orElse(null); .orElse(null);
record.setStartUserName(startUser.getUsername()); record.setStartUserName(startUser.getUsername());
} }
} }
Page p = BeanUtil.copyProperties(page, Page.class); Page p = BeanUtil.copyProperties(page, Page.class);
p.setRecords(processCopyVoList); p.setRecords(processCopyVoList);
return R.ok(p); return R.ok(p);
} }
/** /**
* 格式化流程显示 * 格式化流程显示
* @param nodeFormatParamVo *
* @return * @param nodeFormatParamVo
*/ * @return
@SneakyThrows */
@Override @SneakyThrows
public R formatStartNodeShow(NodeFormatParamVo nodeFormatParamVo) { @Override
String flowId = nodeFormatParamVo.getFlowId(); public R formatStartNodeShow(NodeFormatParamVo nodeFormatParamVo) {
String processInstanceId = nodeFormatParamVo.getProcessInstanceId(); String flowId = nodeFormatParamVo.getFlowId();
if (StrUtil.isAllBlank(flowId, processInstanceId)) { String processInstanceId = nodeFormatParamVo.getProcessInstanceId();
return R.ok(new ArrayList<>()); if (StrUtil.isAllBlank(flowId, processInstanceId)) {
} return R.ok(new ArrayList<>());
}
if (StrUtil.isBlankIfStr(flowId) && StrUtil.isNotBlank(processInstanceId)) { if (StrUtil.isBlankIfStr(flowId) && StrUtil.isNotBlank(processInstanceId)) {
ProcessInstanceRecord processInstanceRecord = processInstanceRecordService.lambdaQuery() ProcessInstanceRecord processInstanceRecord = processInstanceRecordService.lambdaQuery()
.eq(ProcessInstanceRecord::getProcessInstanceId, processInstanceId) .eq(ProcessInstanceRecord::getProcessInstanceId, processInstanceId)
.one(); .one();
flowId = processInstanceRecord.getFlowId(); flowId = processInstanceRecord.getFlowId();
} }
Map<String, Object> paramMap = nodeFormatParamVo.getParamMap(); Map<String, Object> paramMap = nodeFormatParamVo.getParamMap();
if (StrUtil.isNotBlank(nodeFormatParamVo.getTaskId())) { if (StrUtil.isNotBlank(nodeFormatParamVo.getTaskId())) {
VariableQueryParamDto variableQueryParamDto = new VariableQueryParamDto(); VariableQueryParamDto variableQueryParamDto = new VariableQueryParamDto();
variableQueryParamDto.setTaskId(nodeFormatParamVo.getTaskId()); variableQueryParamDto.setTaskId(nodeFormatParamVo.getTaskId());
R<Map<String, Object>> r = flowEngineService.queryTaskVariables(variableQueryParamDto); R<Map<String, Object>> r = flowEngineService.queryTaskVariables(variableQueryParamDto);
if (!r.isOk()) { if (!r.isOk()) {
ProcessNodeRecordAssignUser processNodeRecordAssignUser = processNodeRecordAssignUserService ProcessNodeRecordAssignUser processNodeRecordAssignUser = processNodeRecordAssignUserService
.lambdaQuery() .lambdaQuery()
.eq(ProcessNodeRecordAssignUser::getTaskId, nodeFormatParamVo.getTaskId()) .eq(ProcessNodeRecordAssignUser::getTaskId, nodeFormatParamVo.getTaskId())
.eq(ProcessNodeRecordAssignUser::getStatus, NodeStatusEnum.YJS.getCode()) .eq(ProcessNodeRecordAssignUser::getStatus, NodeStatusEnum.YJS.getCode())
.last("limit 1") .last("limit 1")
.orderByDesc(ProcessNodeRecordAssignUser::getEndTime) .orderByDesc(ProcessNodeRecordAssignUser::getEndTime)
.one(); .one();
String data = processNodeRecordAssignUser.getData(); String data = processNodeRecordAssignUser.getData();
Map<String, Object> variableMap = objectMapper.readValue(data, new TypeReference<>() { Map<String, Object> variableMap = objectMapper.readValue(data, new TypeReference<>() {
}); });
variableMap.putAll(paramMap); variableMap.putAll(paramMap);
paramMap.putAll(variableMap); paramMap.putAll(variableMap);
} } else {
else { Map<String, Object> variableMap = r.getData();
Map<String, Object> variableMap = r.getData(); variableMap.putAll(paramMap);
variableMap.putAll(paramMap); paramMap.putAll(variableMap);
paramMap.putAll(variableMap); }
}
} }
Set<String> completeNodeSet = new HashSet<>(); Set<String> completeNodeSet = new HashSet<>();
if (StrUtil.isNotBlank(processInstanceId)) { if (StrUtil.isNotBlank(processInstanceId)) {
List<ProcessNodeRecord> processNodeRecordList = processNodeRecordService.lambdaQuery() List<ProcessNodeRecord> processNodeRecordList = processNodeRecordService.lambdaQuery()
.eq(ProcessNodeRecord::getProcessInstanceId, processInstanceId) .eq(ProcessNodeRecord::getProcessInstanceId, processInstanceId)
.eq(ProcessNodeRecord::getStatus, NodeStatusEnum.YJS.getCode()) .eq(ProcessNodeRecord::getStatus, NodeStatusEnum.YJS.getCode())
.list(); .list();
Set<String> collect = processNodeRecordList.stream() Set<String> collect = processNodeRecordList.stream()
.map(ProcessNodeRecord::getNodeId) .map(ProcessNodeRecord::getNodeId)
.collect(Collectors.toSet()); .collect(Collectors.toSet());
completeNodeSet.addAll(collect); completeNodeSet.addAll(collect);
} }
Process oaForms = processService.getByFlowId(flowId); Process oaForms = processService.getByFlowId(flowId);
String process = oaForms.getProcess(); String process = oaForms.getProcess();
Node nodeDto = objectMapper.readValue(process, new TypeReference<>() { Node nodeDto = objectMapper.readValue(process, new TypeReference<>() {
}); });
List<NodeVo> processNodeShowDtos = NodeFormatUtil.formatProcessNodeShow(nodeDto, completeNodeSet, List<NodeVo> processNodeShowDtos = NodeFormatUtil.formatProcessNodeShow(nodeDto, completeNodeSet,
new HashSet<>(), processInstanceId, paramMap); new HashSet<>(), processInstanceId, paramMap);
return R.ok(processNodeShowDtos); return R.ok(processNodeShowDtos);
} }
/** /**
* 流程详情 * 流程详情
* @param processInstanceId *
* @return * @param processInstanceId
*/ * @return
@SneakyThrows */
@Override @SneakyThrows
public R detail(String processInstanceId) { @Override
ProcessInstanceRecord processInstanceRecord = processInstanceRecordService.lambdaQuery() public R detail(String processInstanceId) {
.eq(ProcessInstanceRecord::getProcessInstanceId, processInstanceId) ProcessInstanceRecord processInstanceRecord = processInstanceRecordService.lambdaQuery()
.one(); .eq(ProcessInstanceRecord::getProcessInstanceId, processInstanceId)
.one();
Process oaForms = processService.getByFlowId(processInstanceRecord.getFlowId()); Process oaForms = processService.getByFlowId(processInstanceRecord.getFlowId());
if (oaForms == null) { if (oaForms == null) {
return R.failed("流程不存在"); return R.failed("流程不存在");
} }
// 发起人变量数据 // 发起人变量数据
String formData = processInstanceRecord.getFormData(); String formData = processInstanceRecord.getFormData();
Map<String, Object> variableMap = objectMapper.readValue(formData, new TypeReference<>() { Map<String, Object> variableMap = objectMapper.readValue(formData, new TypeReference<>() {
}); });
// 发起人表单权限 // 发起人表单权限
String process = oaForms.getProcess(); String process = oaForms.getProcess();
Node nodeDto = objectMapper.readValue(process, Node.class); Node nodeDto = objectMapper.readValue(process, Node.class);
Map<String, String> formPerms1 = nodeDto.getFormPerms(); Map<String, String> formPerms1 = nodeDto.getFormPerms();
List<FormItemVO> jsonObjectList = objectMapper.readValue(oaForms.getFormItems(), new TypeReference<>() { List<FormItemVO> jsonObjectList = objectMapper.readValue(oaForms.getFormItems(), new TypeReference<>() {
}); });
for (FormItemVO formItemVO : jsonObjectList) { for (FormItemVO formItemVO : jsonObjectList) {
String id = formItemVO.getId(); String id = formItemVO.getId();
String perm = formPerms1.get(id); String perm = formPerms1.get(id);
formItemVO.setPerm(StrUtil.isBlankIfStr(perm) ? ProcessInstanceConstant.FormPermClass.READ formItemVO.setPerm(StrUtil.isBlankIfStr(perm) ? ProcessInstanceConstant.FormPermClass.READ
: (StrUtil.equals(perm, ProcessInstanceConstant.FormPermClass.HIDE) ? perm : (StrUtil.equals(perm, ProcessInstanceConstant.FormPermClass.HIDE) ? perm
: ProcessInstanceConstant.FormPermClass.READ)); : ProcessInstanceConstant.FormPermClass.READ));
if (formItemVO.getType().equals(FormTypeEnum.LAYOUT.getType())) { if (formItemVO.getType().equals(FormTypeEnum.LAYOUT.getType())) {
// 明细 // 明细
List<Map<String, Object>> subParamList = MapUtil.get(variableMap, id, List<Map<String, Object>> subParamList = MapUtil.get(variableMap, id,
new cn.hutool.core.lang.TypeReference<>() { new cn.hutool.core.lang.TypeReference<>() {
}); });
Object value = formItemVO.getProps().getValue(); Object value = formItemVO.getProps().getValue();
List<List<FormItemVO>> l = new ArrayList<>(); List<List<FormItemVO>> l = new ArrayList<>();
for (Map<String, Object> map : subParamList) { for (Map<String, Object> map : subParamList) {
List<FormItemVO> subItemList = Convert.toList(FormItemVO.class, value); List<FormItemVO> subItemList = Convert.toList(FormItemVO.class, value);
for (FormItemVO itemVO : subItemList) { for (FormItemVO itemVO : subItemList) {
itemVO.getProps().setValue(map.get(itemVO.getId())); itemVO.getProps().setValue(map.get(itemVO.getId()));
String permSub = formPerms1.get(itemVO.getId()); String permSub = formPerms1.get(itemVO.getId());
itemVO.setPerm(StrUtil.isBlankIfStr(permSub) ? ProcessInstanceConstant.FormPermClass.READ itemVO.setPerm(StrUtil.isBlankIfStr(permSub) ? ProcessInstanceConstant.FormPermClass.READ
: (StrUtil.equals(permSub, ProcessInstanceConstant.FormPermClass.HIDE) ? permSub : (StrUtil.equals(permSub, ProcessInstanceConstant.FormPermClass.HIDE) ? permSub
: ProcessInstanceConstant.FormPermClass.READ)); : ProcessInstanceConstant.FormPermClass.READ));
} }
l.add(subItemList); l.add(subItemList);
} }
formItemVO.getProps().setValue(l); formItemVO.getProps().setValue(l);
} } else {
else { formItemVO.getProps().setValue(variableMap.get(id));
formItemVO.getProps().setValue(variableMap.get(id));
} }
} }
Dict set = Dict.create() Dict set = Dict.create()
.set("processInstanceId", processInstanceId) .set("processInstanceId", processInstanceId)
.set("process", oaForms.getProcess()) .set("process", oaForms.getProcess())
.set("formItems", jsonObjectList); .set("formItems", jsonObjectList);
return R.ok(set); return R.ok(set);
} }
} }
@@ -163,7 +163,7 @@ public class RemoteServiceImpl implements IRemoteService {
*/ */
@Override @Override
public R<Map<String, Object>> queryUserAllInfo(long userId) { public R<Map<String, Object>> queryUserAllInfo(long userId) {
SysUser sysUser = userService.getUserById(userId).getData(); SysUser sysUser = userService.getUserById(CollUtil.newArrayList(userId)).getData().get(0);
return R.ok(BeanUtil.beanToMap(sysUser)); return R.ok(BeanUtil.beanToMap(sysUser));
} }
@@ -257,7 +257,7 @@ public class NodeFormatUtil {
} }
RemoteUserService userService = SpringUtil.getBean(RemoteUserService.class); RemoteUserService userService = SpringUtil.getBean(RemoteUserService.class);
SysUser user = userService.getUserById(userId).getData(); SysUser user = userService.getUserById(CollUtil.newArrayList(userId)).getData().get(0);
if (user == null) { if (user == null) {
return null; return null;
} }