refactor(ProcessInstanceServiceImpl): 优化流程实例结束逻辑

- 使用LambdaUpdateChainWrapper重构流程实例结束状态更新逻辑
- 将Optional条件判断改为更简洁的ifPresent方式
- 提高代码可读性与维护性

refactor(TaskServiceImpl): 增强流程终止功能

- 在停止流程实例后自动更新流程记录状态
- 添加YJS状态标记和结束
This commit is contained in:
PIG AI committed 2025-07-08 11:59:36 +08:00
1 parent 31cae49a17
commit 0c11c4ffa9
2 files changed
+547 -538

No files matched your search

@@ -6,6 +6,7 @@ import cn.hutool.core.lang.Dict;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
@@ -41,367 +42,366 @@ import java.util.stream.Collectors;
@RequiredArgsConstructor
public class ProcessInstanceServiceImpl implements IProcessInstanceService {
private final RemoteFlowEngineService flowEngineService;
private final RemoteUserService userService;
private final IProcessInstanceRecordService processInstanceRecordService;
private final IProcessCopyService processCopyService;
private final IProcessService processService;
private final IProcessNodeRecordService processNodeRecordService;
private final IProcessNodeRecordAssignUserService processNodeRecordAssignUserService;
private final ObjectMapper objectMapper;
/**
* 启动流程
*
* @param processInstanceParamDto
* @return
*/
@Override
public R startProcessInstance(ProcessInstanceParamDto processInstanceParamDto) {
PigxUser user = SecurityUtils.getUser();
processInstanceParamDto.setStartUserId(String.valueOf(user.getId()));
Map<String, Object> paramMap = processInstanceParamDto.getParamMap();
Dict rootUser = Dict.create()
.set("id", user.getId())
.set("name", user.getUsername())
.set("type", NodeUserTypeEnum.USER.getKey());
paramMap.put("root", CollUtil.newArrayList(rootUser));
return flowEngineService.startProcess(processInstanceParamDto);
}
/**
* 查询当前登录用户的待办任务
*
* @param taskQueryParamDto 查询参数
* @return R
*/
@Override
public R queryMineTask(TaskQueryParamDto taskQueryParamDto) {
taskQueryParamDto.setAssign(SecurityUtils.getUser().getId().toString());
R<Page<TaskDto>> r = flowEngineService.queryAssignTask(taskQueryParamDto);
if (CollUtil.isEmpty(r.getData().getRecords())) {
return r;
}
Set<String> processInstanceIdSet = r.getData()
.getRecords()
.stream()
.map(TaskDto::getProcessInstanceId)
.collect(Collectors.toSet());
// 流程实例记录
List<ProcessInstanceRecord> processInstanceRecordList = processInstanceRecordService.lambdaQuery()
.in(ProcessInstanceRecord::getProcessInstanceId, processInstanceIdSet)
.list();
// 发起人
// 发起人
List<Long> collect = processInstanceRecordList.stream().map(ProcessInstanceRecord::getUserId).toList();
List<SysUser> startUserList = userService.getUserById(collect).getData();
Page<TaskDto> pageResultDto = r.getData();
List<TaskDto> taskDtoList = new ArrayList<>();
for (TaskDto record : r.getData().getRecords()) {
ProcessInstanceRecord processInstanceRecord = processInstanceRecordList.stream()
.filter(w -> StrUtil.equals(w.getProcessInstanceId(), record.getProcessInstanceId()))
.findAny()
.orElse(null);
if (processInstanceRecord != null) {
record.setProcessName(processInstanceRecord.getName());
SysUser startUser = startUserList.stream()
.filter(w -> w.getUserId().longValue() == processInstanceRecord.getUserId())
.findAny()
.orElse(null);
record.setRootUserId(processInstanceRecord.getUserId());
record.setGroupName(processInstanceRecord.getGroupName());
record.setRootUserName(startUser.getUsername());
record.setRootUserAvatarUrl(startUser.getAvatar());
record.setStartTime(processInstanceRecord.getCreateTime());
taskDtoList.add(record);
}
}
pageResultDto.setRecords(taskDtoList);
return R.ok(pageResultDto);
}
/**
* 查询已办任务
*
* @param taskQueryParamDto 查询参数
* @return R
*/
@Override
public R queryMineEndTask(TaskQueryParamDto taskQueryParamDto) {
taskQueryParamDto.setAssign(SecurityUtils.getUser().getId().toString());
R<Page<TaskDto>> r = flowEngineService.queryCompletedTask(taskQueryParamDto);
Page<TaskDto> pageResultDto = r.getData();
List<TaskDto> records = pageResultDto.getRecords();
if (CollUtil.isEmpty(records)) {
return R.ok(pageResultDto);
}
Set<String> processInstanceIdSet = records.stream()
.map(TaskDto::getProcessInstanceId)
.collect(Collectors.toSet());
// 流程实例记录
List<ProcessInstanceRecord> processInstanceRecordList = processInstanceRecordService.lambdaQuery()
.in(ProcessInstanceRecord::getProcessInstanceId, processInstanceIdSet)
.list();
// 发起人
List<Long> collect = processInstanceRecordList.stream().map(ProcessInstanceRecord::getUserId).toList();
List<SysUser> startUserList = userService.getUserById(collect).getData();
List<TaskDto> taskDtoList = new ArrayList<>();
for (TaskDto record : records) {
ProcessInstanceRecord processInstanceRecord = processInstanceRecordList.stream()
.filter(w -> StrUtil.equals(w.getProcessInstanceId(), record.getProcessInstanceId()))
.findAny()
.orElse(null);
if (processInstanceRecord != null) {
record.setProcessName(processInstanceRecord.getName());
SysUser startUser = startUserList.stream()
.filter(w -> w.getUserId().longValue() == processInstanceRecord.getUserId())
.findAny()
.orElse(null);
record.setRootUserId(processInstanceRecord.getUserId());
record.setGroupName(processInstanceRecord.getGroupName());
record.setRootUserName(startUser.getName());
record.setRootUserAvatarUrl(startUser.getAvatar());
record.setTaskId(record.getTaskId());
record.setStartTime(processInstanceRecord.getCreateTime());
taskDtoList.add(record);
}
}
pageResultDto.setRecords(taskDtoList);
return R.ok(pageResultDto);
}
/**
* 结束流程实例
*
* @param processInstanceParamDto 流程实例参数数据传输对象
* @return 返回处理结果
*/
@Override
public R end(ProcessInstanceParamDto processInstanceParamDto) {
Optional<Object> objectOptional = processInstanceParamDto.getParamMap().keySet().stream()
.filter(key -> key.contains("approve_condition"))
.reduce((first, second) -> second)
.map(key -> MapUtil.getBool(processInstanceParamDto.getParamMap(), key, true));
processInstanceRecordService.lambdaUpdate()
.set(ProcessInstanceRecord::getEndTime, new Date())
.set(ProcessInstanceRecord::getStatus, NodeStatusEnum.YJS.getCode())
.set(objectOptional.isPresent(), ProcessInstanceRecord::getFinishReason, objectOptional.get())
.eq(ProcessInstanceRecord::getProcessInstanceId, processInstanceParamDto.getProcessInstanceId())
.update(new ProcessInstanceRecord());
return R.ok();
}
/**
* 查询我发起的
*
* @param taskQueryParamDto 查询条件
* @return
*/
@Override
public R queryMineStarted(TaskQueryParamDto taskQueryParamDto) {
long userId = SecurityUtils.getUser().getId();
Page<ProcessInstanceRecord> instanceRecordPage = processInstanceRecordService.lambdaQuery()
.eq(ProcessInstanceRecord::getUserId, userId)
.eq(ProcessInstanceRecord::getStatus, taskQueryParamDto.getStatus())
.between(ArrayUtil.isNotEmpty(taskQueryParamDto.getTaskTime()), ProcessInstanceRecord::getCreateTime,
ArrayUtil.isNotEmpty(taskQueryParamDto.getTaskTime()) ? taskQueryParamDto.getTaskTime()[0] : null,
ArrayUtil.isNotEmpty(taskQueryParamDto.getTaskTime()) ? taskQueryParamDto.getTaskTime()[1] : null)
.orderByDesc(ProcessInstanceRecord::getCreateTime)
.page(new Page<>(taskQueryParamDto.getCurrent(), taskQueryParamDto.getSize()));
return R.ok(instanceRecordPage);
}
/**
* 查询抄送给我的
*
* @param taskQueryParamDto 查询参数
* @return
*/
@Override
public R queryMineCC(TaskQueryParamDto taskQueryParamDto) {
long userId = SecurityUtils.getUser().getId();
Page<ProcessCopy> page = processCopyService.lambdaQuery()
.eq(ProcessCopy::getUserId, userId)
.between(ArrayUtil.isNotEmpty(taskQueryParamDto.getTaskTime()), ProcessCopy::getCreateTime,
ArrayUtil.isNotEmpty(taskQueryParamDto.getTaskTime()) ? taskQueryParamDto.getTaskTime()[0] : null,
ArrayUtil.isNotEmpty(taskQueryParamDto.getTaskTime()) ? taskQueryParamDto.getTaskTime()[1] : null)
.orderByDesc(ProcessCopy::getNodeTime)
.page(new Page<>(taskQueryParamDto.getCurrent(), taskQueryParamDto.getSize()));
List<ProcessCopy> records = page.getRecords();
List<ProcessCopyVo> processCopyVoList = BeanUtil.copyToList(records, ProcessCopyVo.class);
if (CollUtil.isNotEmpty(records)) {
// 发起人
List<Long> userIdList = records.stream().map(ProcessCopy::getStartUserId).toList();
List<SysUser> startUserList = userService.getUserById(userIdList).getData();
for (ProcessCopyVo record : processCopyVoList) {
SysUser startUser = startUserList.stream()
.filter(w -> w.getUserId().longValue() == record.getStartUserId())
.findAny()
.orElse(null);
record.setStartUserName(startUser.getUsername());
}
}
Page p = BeanUtil.copyProperties(page, Page.class);
p.setRecords(processCopyVoList);
return R.ok(p);
}
/**
* 格式化流程显示
*
* @param nodeFormatParamVo
* @return
*/
@SneakyThrows
@Override
public R formatStartNodeShow(NodeFormatParamVo nodeFormatParamVo) {
String flowId = nodeFormatParamVo.getFlowId();
String processInstanceId = nodeFormatParamVo.getProcessInstanceId();
if (StrUtil.isAllBlank(flowId, processInstanceId)) {
return R.ok(new ArrayList<>());
}
if (StrUtil.isBlankIfStr(flowId) && StrUtil.isNotBlank(processInstanceId)) {
ProcessInstanceRecord processInstanceRecord = processInstanceRecordService.lambdaQuery()
.eq(ProcessInstanceRecord::getProcessInstanceId, processInstanceId)
.one();
flowId = processInstanceRecord.getFlowId();
}
Map<String, Object> paramMap = nodeFormatParamVo.getParamMap();
if (StrUtil.isNotBlank(nodeFormatParamVo.getTaskId())) {
VariableQueryParamDto variableQueryParamDto = new VariableQueryParamDto();
variableQueryParamDto.setTaskId(nodeFormatParamVo.getTaskId());
R<Map<String, Object>> r = flowEngineService.queryTaskVariables(variableQueryParamDto);
if (!r.isOk()) {
ProcessNodeRecordAssignUser processNodeRecordAssignUser = processNodeRecordAssignUserService
.lambdaQuery()
.eq(ProcessNodeRecordAssignUser::getTaskId, nodeFormatParamVo.getTaskId())
.eq(ProcessNodeRecordAssignUser::getStatus, NodeStatusEnum.YJS.getCode())
.last("limit 1")
.orderByDesc(ProcessNodeRecordAssignUser::getEndTime)
.one();
String data = processNodeRecordAssignUser.getData();
Map<String, Object> variableMap = objectMapper.readValue(data, new TypeReference<>() {
});
variableMap.putAll(paramMap);
paramMap.putAll(variableMap);
} else {
Map<String, Object> variableMap = r.getData();
variableMap.putAll(paramMap);
paramMap.putAll(variableMap);
}
}
Set<String> completeNodeSet = new HashSet<>();
if (StrUtil.isNotBlank(processInstanceId)) {
List<ProcessNodeRecord> processNodeRecordList = processNodeRecordService.lambdaQuery()
.eq(ProcessNodeRecord::getProcessInstanceId, processInstanceId)
.eq(ProcessNodeRecord::getStatus, NodeStatusEnum.YJS.getCode())
.list();
Set<String> collect = processNodeRecordList.stream()
.map(ProcessNodeRecord::getNodeId)
.collect(Collectors.toSet());
completeNodeSet.addAll(collect);
}
Process oaForms = processService.getByFlowId(flowId);
String process = oaForms.getProcess();
Node nodeDto = objectMapper.readValue(process, new TypeReference<>() {
});
List<NodeVo> processNodeShowDtos = NodeFormatUtil.formatProcessNodeShow(nodeDto, completeNodeSet,
new HashSet<>(), processInstanceId, paramMap);
return R.ok(processNodeShowDtos);
}
/**
* 流程详情
*
* @param processInstanceId
* @return
*/
@SneakyThrows
@Override
public R detail(String processInstanceId) {
ProcessInstanceRecord processInstanceRecord = processInstanceRecordService.lambdaQuery()
.eq(ProcessInstanceRecord::getProcessInstanceId, processInstanceId)
.one();
Process oaForms = processService.getByFlowId(processInstanceRecord.getFlowId());
if (oaForms == null) {
return R.failed("流程不存在");
}
// 发起人变量数据
String formData = processInstanceRecord.getFormData();
String process = oaForms.getProcess();
Node nodeDto = objectMapper.readValue(process, Node.class);
Map<String, String> formPerms1 = nodeDto.getFormPerms();
Dict set = Dict.create()
.set(ProcessInstanceRecord.Fields.processInstanceId, processInstanceId)
.set(ProcessInstanceRecord.Fields.status, processInstanceRecord.getStatus())
.set("process", oaForms.getProcess())
.set("formItems", oaForms.getFormItems())
.set("formData", formData)
.set("formData", formData)
.set("formPerms", formPerms1);
return R.ok(set);
}
private final RemoteFlowEngineService flowEngineService;
private final RemoteUserService userService;
private final IProcessInstanceRecordService processInstanceRecordService;
private final IProcessCopyService processCopyService;
private final IProcessService processService;
private final IProcessNodeRecordService processNodeRecordService;
private final IProcessNodeRecordAssignUserService processNodeRecordAssignUserService;
private final ObjectMapper objectMapper;
/**
* 启动流程
* @param processInstanceParamDto
* @return
*/
@Override
public R startProcessInstance(ProcessInstanceParamDto processInstanceParamDto) {
PigxUser user = SecurityUtils.getUser();
processInstanceParamDto.setStartUserId(String.valueOf(user.getId()));
Map<String, Object> paramMap = processInstanceParamDto.getParamMap();
Dict rootUser = Dict.create()
.set("id", user.getId())
.set("name", user.getUsername())
.set("type", NodeUserTypeEnum.USER.getKey());
paramMap.put("root", CollUtil.newArrayList(rootUser));
return flowEngineService.startProcess(processInstanceParamDto);
}
/**
* 查询当前登录用户的待办任务
* @param taskQueryParamDto 查询参数
* @return R
*/
@Override
public R queryMineTask(TaskQueryParamDto taskQueryParamDto) {
taskQueryParamDto.setAssign(SecurityUtils.getUser().getId().toString());
R<Page<TaskDto>> r = flowEngineService.queryAssignTask(taskQueryParamDto);
if (CollUtil.isEmpty(r.getData().getRecords())) {
return r;
}
Set<String> processInstanceIdSet = r.getData()
.getRecords()
.stream()
.map(TaskDto::getProcessInstanceId)
.collect(Collectors.toSet());
// 流程实例记录
List<ProcessInstanceRecord> processInstanceRecordList = processInstanceRecordService.lambdaQuery()
.in(ProcessInstanceRecord::getProcessInstanceId, processInstanceIdSet)
.list();
// 发起人
// 发起人
List<Long> collect = processInstanceRecordList.stream().map(ProcessInstanceRecord::getUserId).toList();
List<SysUser> startUserList = userService.getUserById(collect).getData();
Page<TaskDto> pageResultDto = r.getData();
List<TaskDto> taskDtoList = new ArrayList<>();
for (TaskDto record : r.getData().getRecords()) {
ProcessInstanceRecord processInstanceRecord = processInstanceRecordList.stream()
.filter(w -> StrUtil.equals(w.getProcessInstanceId(), record.getProcessInstanceId()))
.findAny()
.orElse(null);
if (processInstanceRecord != null) {
record.setProcessName(processInstanceRecord.getName());
SysUser startUser = startUserList.stream()
.filter(w -> w.getUserId().longValue() == processInstanceRecord.getUserId())
.findAny()
.orElse(null);
record.setRootUserId(processInstanceRecord.getUserId());
record.setGroupName(processInstanceRecord.getGroupName());
record.setRootUserName(startUser.getUsername());
record.setRootUserAvatarUrl(startUser.getAvatar());
record.setStartTime(processInstanceRecord.getCreateTime());
taskDtoList.add(record);
}
}
pageResultDto.setRecords(taskDtoList);
return R.ok(pageResultDto);
}
/**
* 查询已办任务
* @param taskQueryParamDto 查询参数
* @return R
*/
@Override
public R queryMineEndTask(TaskQueryParamDto taskQueryParamDto) {
taskQueryParamDto.setAssign(SecurityUtils.getUser().getId().toString());
R<Page<TaskDto>> r = flowEngineService.queryCompletedTask(taskQueryParamDto);
Page<TaskDto> pageResultDto = r.getData();
List<TaskDto> records = pageResultDto.getRecords();
if (CollUtil.isEmpty(records)) {
return R.ok(pageResultDto);
}
Set<String> processInstanceIdSet = records.stream()
.map(TaskDto::getProcessInstanceId)
.collect(Collectors.toSet());
// 流程实例记录
List<ProcessInstanceRecord> processInstanceRecordList = processInstanceRecordService.lambdaQuery()
.in(ProcessInstanceRecord::getProcessInstanceId, processInstanceIdSet)
.list();
// 发起人
List<Long> collect = processInstanceRecordList.stream().map(ProcessInstanceRecord::getUserId).toList();
List<SysUser> startUserList = userService.getUserById(collect).getData();
List<TaskDto> taskDtoList = new ArrayList<>();
for (TaskDto record : records) {
ProcessInstanceRecord processInstanceRecord = processInstanceRecordList.stream()
.filter(w -> StrUtil.equals(w.getProcessInstanceId(), record.getProcessInstanceId()))
.findAny()
.orElse(null);
if (processInstanceRecord != null) {
record.setProcessName(processInstanceRecord.getName());
SysUser startUser = startUserList.stream()
.filter(w -> w.getUserId().longValue() == processInstanceRecord.getUserId())
.findAny()
.orElse(null);
record.setRootUserId(processInstanceRecord.getUserId());
record.setGroupName(processInstanceRecord.getGroupName());
record.setRootUserName(startUser.getName());
record.setRootUserAvatarUrl(startUser.getAvatar());
record.setTaskId(record.getTaskId());
record.setStartTime(processInstanceRecord.getCreateTime());
taskDtoList.add(record);
}
}
pageResultDto.setRecords(taskDtoList);
return R.ok(pageResultDto);
}
/**
* 结束流程实例
* @param processInstanceParamDto 流程实例参数数据传输对象
* @return 返回处理结果
*/
@Override
public R end(ProcessInstanceParamDto processInstanceParamDto) {
Optional<Boolean> objectOptional = processInstanceParamDto.getParamMap()
.keySet()
.stream()
.filter(key -> key.contains("approve_condition"))
.reduce((first, second) -> second)
.map(key -> MapUtil.getBool(processInstanceParamDto.getParamMap(), key, true));
LambdaUpdateChainWrapper<ProcessInstanceRecord> lambdaUpdateChainWrapper = processInstanceRecordService
.lambdaUpdate()
.set(ProcessInstanceRecord::getEndTime, new Date())
.set(ProcessInstanceRecord::getStatus, NodeStatusEnum.YJS.getCode());
objectOptional
.ifPresent(aBoolean -> lambdaUpdateChainWrapper.set(ProcessInstanceRecord::getFinishReason, aBoolean));
lambdaUpdateChainWrapper
.eq(ProcessInstanceRecord::getProcessInstanceId, processInstanceParamDto.getProcessInstanceId())
.update(new ProcessInstanceRecord());
return R.ok();
}
/**
* 查询我发起的
* @param taskQueryParamDto 查询条件
* @return
*/
@Override
public R queryMineStarted(TaskQueryParamDto taskQueryParamDto) {
long userId = SecurityUtils.getUser().getId();
Page<ProcessInstanceRecord> instanceRecordPage = processInstanceRecordService.lambdaQuery()
.eq(ProcessInstanceRecord::getUserId, userId)
.eq(ProcessInstanceRecord::getStatus, taskQueryParamDto.getStatus())
.between(ArrayUtil.isNotEmpty(taskQueryParamDto.getTaskTime()), ProcessInstanceRecord::getCreateTime,
ArrayUtil.isNotEmpty(taskQueryParamDto.getTaskTime()) ? taskQueryParamDto.getTaskTime()[0] : null,
ArrayUtil.isNotEmpty(taskQueryParamDto.getTaskTime()) ? taskQueryParamDto.getTaskTime()[1] : null)
.orderByDesc(ProcessInstanceRecord::getCreateTime)
.page(new Page<>(taskQueryParamDto.getCurrent(), taskQueryParamDto.getSize()));
return R.ok(instanceRecordPage);
}
/**
* 查询抄送给我的
* @param taskQueryParamDto 查询参数
* @return
*/
@Override
public R queryMineCC(TaskQueryParamDto taskQueryParamDto) {
long userId = SecurityUtils.getUser().getId();
Page<ProcessCopy> page = processCopyService.lambdaQuery()
.eq(ProcessCopy::getUserId, userId)
.between(ArrayUtil.isNotEmpty(taskQueryParamDto.getTaskTime()), ProcessCopy::getCreateTime,
ArrayUtil.isNotEmpty(taskQueryParamDto.getTaskTime()) ? taskQueryParamDto.getTaskTime()[0] : null,
ArrayUtil.isNotEmpty(taskQueryParamDto.getTaskTime()) ? taskQueryParamDto.getTaskTime()[1] : null)
.orderByDesc(ProcessCopy::getNodeTime)
.page(new Page<>(taskQueryParamDto.getCurrent(), taskQueryParamDto.getSize()));
List<ProcessCopy> records = page.getRecords();
List<ProcessCopyVo> processCopyVoList = BeanUtil.copyToList(records, ProcessCopyVo.class);
if (CollUtil.isNotEmpty(records)) {
// 发起人
List<Long> userIdList = records.stream().map(ProcessCopy::getStartUserId).toList();
List<SysUser> startUserList = userService.getUserById(userIdList).getData();
for (ProcessCopyVo record : processCopyVoList) {
SysUser startUser = startUserList.stream()
.filter(w -> w.getUserId().longValue() == record.getStartUserId())
.findAny()
.orElse(null);
record.setStartUserName(startUser.getUsername());
}
}
Page p = BeanUtil.copyProperties(page, Page.class);
p.setRecords(processCopyVoList);
return R.ok(p);
}
/**
* 格式化流程显示
* @param nodeFormatParamVo
* @return
*/
@SneakyThrows
@Override
public R formatStartNodeShow(NodeFormatParamVo nodeFormatParamVo) {
String flowId = nodeFormatParamVo.getFlowId();
String processInstanceId = nodeFormatParamVo.getProcessInstanceId();
if (StrUtil.isAllBlank(flowId, processInstanceId)) {
return R.ok(new ArrayList<>());
}
if (StrUtil.isBlankIfStr(flowId) && StrUtil.isNotBlank(processInstanceId)) {
ProcessInstanceRecord processInstanceRecord = processInstanceRecordService.lambdaQuery()
.eq(ProcessInstanceRecord::getProcessInstanceId, processInstanceId)
.one();
flowId = processInstanceRecord.getFlowId();
}
Map<String, Object> paramMap = nodeFormatParamVo.getParamMap();
if (StrUtil.isNotBlank(nodeFormatParamVo.getTaskId())) {
VariableQueryParamDto variableQueryParamDto = new VariableQueryParamDto();
variableQueryParamDto.setTaskId(nodeFormatParamVo.getTaskId());
R<Map<String, Object>> r = flowEngineService.queryTaskVariables(variableQueryParamDto);
if (!r.isOk()) {
ProcessNodeRecordAssignUser processNodeRecordAssignUser = processNodeRecordAssignUserService
.lambdaQuery()
.eq(ProcessNodeRecordAssignUser::getTaskId, nodeFormatParamVo.getTaskId())
.eq(ProcessNodeRecordAssignUser::getStatus, NodeStatusEnum.YJS.getCode())
.last("limit 1")
.orderByDesc(ProcessNodeRecordAssignUser::getEndTime)
.one();
String data = processNodeRecordAssignUser.getData();
Map<String, Object> variableMap = objectMapper.readValue(data, new TypeReference<>() {
});
variableMap.putAll(paramMap);
paramMap.putAll(variableMap);
}
else {
Map<String, Object> variableMap = r.getData();
variableMap.putAll(paramMap);
paramMap.putAll(variableMap);
}
}
Set<String> completeNodeSet = new HashSet<>();
if (StrUtil.isNotBlank(processInstanceId)) {
List<ProcessNodeRecord> processNodeRecordList = processNodeRecordService.lambdaQuery()
.eq(ProcessNodeRecord::getProcessInstanceId, processInstanceId)
.eq(ProcessNodeRecord::getStatus, NodeStatusEnum.YJS.getCode())
.list();
Set<String> collect = processNodeRecordList.stream()
.map(ProcessNodeRecord::getNodeId)
.collect(Collectors.toSet());
completeNodeSet.addAll(collect);
}
Process oaForms = processService.getByFlowId(flowId);
String process = oaForms.getProcess();
Node nodeDto = objectMapper.readValue(process, new TypeReference<>() {
});
List<NodeVo> processNodeShowDtos = NodeFormatUtil.formatProcessNodeShow(nodeDto, completeNodeSet,
new HashSet<>(), processInstanceId, paramMap);
return R.ok(processNodeShowDtos);
}
/**
* 流程详情
* @param processInstanceId
* @return
*/
@SneakyThrows
@Override
public R detail(String processInstanceId) {
ProcessInstanceRecord processInstanceRecord = processInstanceRecordService.lambdaQuery()
.eq(ProcessInstanceRecord::getProcessInstanceId, processInstanceId)
.one();
Process oaForms = processService.getByFlowId(processInstanceRecord.getFlowId());
if (oaForms == null) {
return R.failed("流程不存在");
}
// 发起人变量数据
String formData = processInstanceRecord.getFormData();
String process = oaForms.getProcess();
Node nodeDto = objectMapper.readValue(process, Node.class);
Map<String, String> formPerms1 = nodeDto.getFormPerms();
Dict set = Dict.create()
.set(ProcessInstanceRecord.Fields.processInstanceId, processInstanceId)
.set(ProcessInstanceRecord.Fields.status, processInstanceRecord.getStatus())
.set("process", oaForms.getProcess())
.set("formItems", oaForms.getFormItems())
.set("formData", formData)
.set("formData", formData)
.set("formPerms", formPerms1);
return R.ok(set);
}
}
@@ -24,6 +24,8 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
@@ -32,229 +34,236 @@ import java.util.Map;
@RequiredArgsConstructor
public class TaskServiceImpl implements ITaskService {
private final RemoteFlowEngineService flowEngineService;
private final RemoteFlowEngineService flowEngineService;
private final IProcessService processService;
private final IProcessService processService;
private final IProcessCopyService processCopyService;
private final IProcessCopyService processCopyService;
private final IProcessNodeDataService nodeDataService;
private final IProcessNodeDataService nodeDataService;
private final IProcessNodeRecordAssignUserService processNodeRecordAssignUserService;
private final IProcessNodeRecordAssignUserService processNodeRecordAssignUserService;
private final IProcessInstanceRecordService processInstanceRecordService;
private final IProcessInstanceRecordService processInstanceRecordService;
private final ObjectMapper objectMapper;
private final ObjectMapper objectMapper;
/**
* 查询首页数据看板
* @return
*/
@Override
public R queryTaskData() {
R<IndexPageStatistics> indexPageStatisticsR = flowEngineService
.querySimpleData(SecurityUtils.getUser().getId());
/**
* 查询首页数据看板
* @return
*/
@Override
public R queryTaskData() {
R<IndexPageStatistics> indexPageStatisticsR = flowEngineService
.querySimpleData(SecurityUtils.getUser().getId());
// 获取抄送任务
Long copyCount = processCopyService.lambdaQuery()
.eq(ProcessCopy::getUserId, SecurityUtils.getUser().getId())
.count();
indexPageStatisticsR.getData().setCopyNum(copyCount);
return indexPageStatisticsR;
}
// 获取抄送任务
Long copyCount = processCopyService.lambdaQuery()
.eq(ProcessCopy::getUserId, SecurityUtils.getUser().getId())
.count();
indexPageStatisticsR.getData().setCopyNum(copyCount);
return indexPageStatisticsR;
}
/**
* 查询任务
* @param taskId
* @param view
* @return
*/
@SneakyThrows
@Override
public R queryTask(String taskId, boolean view) {
/**
* 查询任务
* @param taskId
* @param view
* @return
*/
@SneakyThrows
@Override
public R queryTask(String taskId, boolean view) {
long userId = SecurityUtils.getUser().getId();
long userId = SecurityUtils.getUser().getId();
R<TaskResultDto> r = flowEngineService.queryTask(taskId, userId);
R<TaskResultDto> r = flowEngineService.queryTask(taskId, userId);
if (!r.isOk()) {
return R.failed(r.getMsg());
}
if (!r.isOk()) {
return R.failed(r.getMsg());
}
TaskResultDto taskResultDto = r.getData();
TaskResultDto taskResultDto = r.getData();
// 变量
Map<String, Object> paramMap = taskResultDto.getVariableAll();
// 是否是当前活动任务
Boolean currentTask = taskResultDto.getCurrentTask();
if (!currentTask) {
ProcessNodeRecordAssignUser processNodeRecordAssignUser = processNodeRecordAssignUserService.lambdaQuery()
.eq(ProcessNodeRecordAssignUser::getTaskId, taskId)
.eq(ProcessNodeRecordAssignUser::getUserId, userId)
.eq(ProcessNodeRecordAssignUser::getStatus, NodeStatusEnum.YJS.getCode())
.last("limit 1")
.orderByDesc(ProcessNodeRecordAssignUser::getEndTime)
.one();
// 变量
Map<String, Object> paramMap = taskResultDto.getVariableAll();
// 是否是当前活动任务
Boolean currentTask = taskResultDto.getCurrentTask();
if (!currentTask) {
ProcessNodeRecordAssignUser processNodeRecordAssignUser = processNodeRecordAssignUserService.lambdaQuery()
.eq(ProcessNodeRecordAssignUser::getTaskId, taskId)
.eq(ProcessNodeRecordAssignUser::getUserId, userId)
.eq(ProcessNodeRecordAssignUser::getStatus, NodeStatusEnum.YJS.getCode())
.last("limit 1")
.orderByDesc(ProcessNodeRecordAssignUser::getEndTime)
.one();
if (processNodeRecordAssignUser != null) {
String data = processNodeRecordAssignUser.getData();
if (StrUtil.isNotBlank(data)) {
Map<String, Object> collect = objectMapper.readValue(data, new TypeReference<>() {
});
paramMap.putAll(collect);
if (processNodeRecordAssignUser != null) {
String data = processNodeRecordAssignUser.getData();
if (StrUtil.isNotBlank(data)) {
Map<String, Object> collect = objectMapper.readValue(data, new TypeReference<>() {
});
paramMap.putAll(collect);
}
}
}
}
}
}
// 当前节点数据
Node node = nodeDataService.getNodeData(taskResultDto.getFlowId(), taskResultDto.getNodeId()).getData();
Map<String, String> formPerms = node.getFormPerms();
// 当前节点数据
Node node = nodeDataService.getNodeData(taskResultDto.getFlowId(), taskResultDto.getNodeId()).getData();
Map<String, String> formPerms = node.getFormPerms();
Process oaForms = processService.getByFlowId(taskResultDto.getFlowId());
if (oaForms == null) {
return R.failed("流程不存在");
}
Process oaForms = processService.getByFlowId(taskResultDto.getFlowId());
if (oaForms == null) {
return R.failed("流程不存在");
}
Dict set = Dict.create()
.set("processInstanceId", taskResultDto.getProcessInstanceId())
.set("node", taskResultDto.getTaskNode())
.set("process", oaForms.getProcess())
.set("delegateAgain", taskResultDto.getDelegate())
.set("delegationTask", StrUtil.equals(taskResultDto.getDelegationState(), "PENDING"))
.set("formItems", oaForms.getFormItems())
.set("formData", paramMap)
.set("formPerms", formPerms);
Dict set = Dict.create()
.set("processInstanceId", taskResultDto.getProcessInstanceId())
.set("node", taskResultDto.getTaskNode())
.set("process", oaForms.getProcess())
.set("delegateAgain", taskResultDto.getDelegate())
.set("delegationTask", StrUtil.equals(taskResultDto.getDelegationState(), "PENDING"))
.set("formItems", oaForms.getFormItems())
.set("formData", paramMap)
.set("formPerms", formPerms);
return R.ok(set);
}
return R.ok(set);
}
/**
* 完成任务
* @param taskParamDto
* @return
*/
@Override
public R completeTask(TaskParamDto taskParamDto) {
long userId = SecurityUtils.getUser().getId();
taskParamDto.setUserId(String.valueOf(userId));
/**
* 完成任务
* @param taskParamDto
* @return
*/
@Override
public R completeTask(TaskParamDto taskParamDto) {
long userId = SecurityUtils.getUser().getId();
taskParamDto.setUserId(String.valueOf(userId));
R r = flowEngineService.completeTask(taskParamDto);
R r = flowEngineService.completeTask(taskParamDto);
if (!r.isOk()) {
return R.failed(r.getMsg());
}
if (!r.isOk()) {
return R.failed(r.getMsg());
}
return R.ok();
}
return R.ok();
}
/**
* 前加签
* @param taskParamDto
* @return
*/
@Transactional
@Override
public R delegateTask(TaskParamDto taskParamDto) {
/**
* 前加签
* @param taskParamDto
* @return
*/
@Transactional
@Override
public R delegateTask(TaskParamDto taskParamDto) {
taskParamDto.setUserId(SecurityUtils.getUser().getId().toString());
taskParamDto.setUserId(SecurityUtils.getUser().getId().toString());
R r = flowEngineService.delegateTask(taskParamDto);
if (!r.isOk()) {
return R.failed(r.getMsg());
}
R r = flowEngineService.delegateTask(taskParamDto);
if (!r.isOk()) {
return R.failed(r.getMsg());
}
return R.ok();
}
return R.ok();
}
/**
* 加签完成任务
* @param taskParamDto
* @return
*/
@Override
public R resolveTask(TaskParamDto taskParamDto) {
R r = flowEngineService.resolveTask(taskParamDto);
if (!r.isOk()) {
return R.failed(r.getMsg());
}
/**
* 加签完成任务
* @param taskParamDto
* @return
*/
@Override
public R resolveTask(TaskParamDto taskParamDto) {
R r = flowEngineService.resolveTask(taskParamDto);
if (!r.isOk()) {
return R.failed(r.getMsg());
}
return R.ok();
}
return R.ok();
}
/**
* 设置执行人
* @param taskParamDto
* @return
*/
@Override
public R setAssignee(TaskParamDto taskParamDto) {
/**
* 设置执行人
* @param taskParamDto
* @return
*/
@Override
public R setAssignee(TaskParamDto taskParamDto) {
taskParamDto.setUserId(SecurityUtils.getUser().getId().toString());
R r = flowEngineService.transferTask(taskParamDto);
if (!r.isOk()) {
return R.failed(r.getMsg());
}
if (!r.isOk()) {
return R.failed(r.getMsg());
}
return R.ok();
}
return R.ok();
}
/**
* 结束流程
* @param taskParamDto
* @return
*/
@Override
public R stopProcessInstance(TaskParamDto taskParamDto) {
/**
* 结束流程
* @param taskParamDto
* @return
*/
@Override
public R stopProcessInstance(TaskParamDto taskParamDto) {
String processInstanceId = taskParamDto.getProcessInstanceId();
String processInstanceId = taskParamDto.getProcessInstanceId();
List<String> allStopProcessInstanceIdList = getAllStopProcessInstanceIdList(processInstanceId);
CollUtil.reverse(allStopProcessInstanceIdList);
allStopProcessInstanceIdList.add(processInstanceId);
List<String> allStopProcessInstanceIdList = getAllStopProcessInstanceIdList(processInstanceId);
CollUtil.reverse(allStopProcessInstanceIdList);
allStopProcessInstanceIdList.add(processInstanceId);
taskParamDto.setProcessInstanceIdList(allStopProcessInstanceIdList);
taskParamDto.setUserId(SecurityUtils.getUser().getId().toString());
R r = flowEngineService.stopProcessInstance(taskParamDto);
taskParamDto.setProcessInstanceIdList(allStopProcessInstanceIdList);
taskParamDto.setUserId(SecurityUtils.getUser().getId().toString());
R r = flowEngineService.stopProcessInstance(taskParamDto);
if (!r.isOk()) {
return R.failed(r.getMsg());
}
if (!r.isOk()) {
return R.failed(r.getMsg());
}
return R.ok();
}
// 停止流程实例后,更新流程实例记录状态
processInstanceRecordService.lambdaUpdate()
.set(ProcessInstanceRecord::getStatus, NodeStatusEnum.YJS.getCode())
.set(ProcessInstanceRecord::getFinishReason, "9")
.set(ProcessInstanceRecord::getEndTime, new Date())
.eq(ProcessInstanceRecord::getProcessInstanceId, processInstanceId)
.update(new ProcessInstanceRecord());
return R.ok();
}
/**
* 退回
* @param taskParamDto
* @return
*/
@Override
public R back(TaskParamDto taskParamDto) {
taskParamDto.setUserId(SecurityUtils.getUser().getId().toString());
R r = flowEngineService.back(taskParamDto);
if (!r.isOk()) {
return R.failed(r.getMsg());
}
/**
* 退回
* @param taskParamDto
* @return
*/
@Override
public R back(TaskParamDto taskParamDto) {
taskParamDto.setUserId(SecurityUtils.getUser().getId().toString());
R r = flowEngineService.back(taskParamDto);
if (!r.isOk()) {
return R.failed(r.getMsg());
}
return R.ok();
}
return R.ok();
}
private List<String> getAllStopProcessInstanceIdList(String processInstanceId) {
List<ProcessInstanceRecord> list = processInstanceRecordService.lambdaQuery()
.eq(ProcessInstanceRecord::getParentProcessInstanceId, processInstanceId)
.list();
private List<String> getAllStopProcessInstanceIdList(String processInstanceId) {
List<ProcessInstanceRecord> list = processInstanceRecordService.lambdaQuery()
.eq(ProcessInstanceRecord::getParentProcessInstanceId, processInstanceId)
.list();
List<String> collect = list.stream().map(w -> w.getProcessInstanceId()).toList();
List<String> collect = new ArrayList<>(list.stream().map(ProcessInstanceRecord::getProcessInstanceId).toList());
for (ProcessInstanceRecord processInstanceRecord : list) {
List<String> allStopProcessInstanceIdList = getAllStopProcessInstanceIdList(
processInstanceRecord.getProcessInstanceId());
for (ProcessInstanceRecord processInstanceRecord : list) {
List<String> allStopProcessInstanceIdList = getAllStopProcessInstanceIdList(
processInstanceRecord.getProcessInstanceId());
collect.addAll(allStopProcessInstanceIdList);
collect.addAll(allStopProcessInstanceIdList);
}
return collect;
}
}
return collect;
}
}