From 76d1c33da48435ee5564186632eb37d9bfaf955c Mon Sep 17 00:00:00 2001 From: bob Date: Thu, 16 Feb 2023 15:57:26 +0800 Subject: [PATCH] fix(attachment) review --- .../common/constant/ProcessConstants.java | 2 + .../flowable/domain/dto/FlowTaskDto.java | 30 ++++++++-- .../flowable/domain/vo/AttachmentInfoVO.java | 31 ++++++++++ .../ruoyi/flowable/domain/vo/FlowTaskVo.java | 12 +++- .../service/impl/FlowTaskServiceImpl.java | 59 +++++++++++++++---- 5 files changed, 117 insertions(+), 17 deletions(-) create mode 100644 ruoyi-flowable/src/main/java/com/ruoyi/flowable/domain/vo/AttachmentInfoVO.java diff --git a/ruoyi-flowable/src/main/java/com/ruoyi/flowable/common/constant/ProcessConstants.java b/ruoyi-flowable/src/main/java/com/ruoyi/flowable/common/constant/ProcessConstants.java index ca064a0..3633543 100644 --- a/ruoyi-flowable/src/main/java/com/ruoyi/flowable/common/constant/ProcessConstants.java +++ b/ruoyi-flowable/src/main/java/com/ruoyi/flowable/common/constant/ProcessConstants.java @@ -79,6 +79,8 @@ public class ProcessConstants { * 用户修改的任务完成时间字段key */ public static final String USER_MODIFY_TASK_FINISH_TIME_VARIABLE_KEY = "userModifyTaskFinishTime"; +// 表单变量,附件id + public static final String ATTACHMENT_IDS_VARIABLE_KEY = "attachmentIds"; } diff --git a/ruoyi-flowable/src/main/java/com/ruoyi/flowable/domain/dto/FlowTaskDto.java b/ruoyi-flowable/src/main/java/com/ruoyi/flowable/domain/dto/FlowTaskDto.java index 1bd7d5b..79e3e18 100644 --- a/ruoyi-flowable/src/main/java/com/ruoyi/flowable/domain/dto/FlowTaskDto.java +++ b/ruoyi-flowable/src/main/java/com/ruoyi/flowable/domain/dto/FlowTaskDto.java @@ -1,16 +1,19 @@ package com.ruoyi.flowable.domain.dto; import com.fasterxml.jackson.annotation.JsonFormat; -import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.system.domain.SysProject; +import com.ruoyi.system.service.ISysProjectService; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Getter; import lombok.Setter; +import org.apache.commons.collections4.MapUtils; +import org.apache.commons.lang3.StringUtils; import java.io.Serializable; import java.util.Date; -import java.util.List; import java.util.Map; +import java.util.Objects; /** *

工作流任务

@@ -100,11 +103,28 @@ public class FlowTaskDto implements Serializable { @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date finishTime; @ApiModelProperty("任务状态") - private String status; + private String status; @ApiModelProperty("工作问题") - private String workIssue; + private String workIssue; @ApiModelProperty("项目名称") - private String projectName; + private String projectName; + + public void extractIssue(Map variables) { + if (MapUtils.isNotEmpty(variables)) { + if (variables.containsKey("issue") && StringUtils.isNotBlank(MapUtils.getString(variables, "issue"))) { + this.setWorkIssue(MapUtils.getString(variables, "issue")); + } + } + } + public void extractProjectName(Map variables, ISysProjectService sysProjectService) { + if (MapUtils.isNotEmpty(variables)) { + if (variables.containsKey("projectId") && Objects.nonNull(MapUtils.getLong(variables, "projectId"))) { + Long projectId = MapUtils.getLong(variables, "projectId"); + SysProject project = sysProjectService.selectSysProjectById(projectId); + this.setProjectName(Objects.nonNull(project) ? project.getName() : ""); + } + } + } } diff --git a/ruoyi-flowable/src/main/java/com/ruoyi/flowable/domain/vo/AttachmentInfoVO.java b/ruoyi-flowable/src/main/java/com/ruoyi/flowable/domain/vo/AttachmentInfoVO.java new file mode 100644 index 0000000..0fc63ca --- /dev/null +++ b/ruoyi-flowable/src/main/java/com/ruoyi/flowable/domain/vo/AttachmentInfoVO.java @@ -0,0 +1,31 @@ +package com.ruoyi.flowable.domain.vo; + +import cn.hutool.core.img.ImgUtil; +import lombok.Data; +import lombok.experimental.Accessors; +import org.apache.commons.lang3.StringUtils; + +@Data +@Accessors(chain = true) +public class AttachmentInfoVO { + + private String name; + private String type; + private String base64; + private Boolean isImg; + private Long id; + + public void setIsImgByContentType(String contentType) { + if (StringUtils.contains(contentType, "image")) { + this.isImg = true; + return; + } + this.isImg = false; + } + + public void setBase64ByFile(String path, String type) { + if (this.isImg) { + this.base64 = ImgUtil.toBase64(ImgUtil.read(path), type); + } + } +} diff --git a/ruoyi-flowable/src/main/java/com/ruoyi/flowable/domain/vo/FlowTaskVo.java b/ruoyi-flowable/src/main/java/com/ruoyi/flowable/domain/vo/FlowTaskVo.java index c483430..ece4432 100644 --- a/ruoyi-flowable/src/main/java/com/ruoyi/flowable/domain/vo/FlowTaskVo.java +++ b/ruoyi-flowable/src/main/java/com/ruoyi/flowable/domain/vo/FlowTaskVo.java @@ -1,9 +1,12 @@ package com.ruoyi.flowable.domain.vo; +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import java.util.Collections; import java.util.List; import java.util.Map; @@ -33,7 +36,7 @@ public class FlowTaskVo { private String targetKey; @ApiModelProperty("流程变量信息") - private Map values; + private String vars; @ApiModelProperty("审批人") private String assignee; @@ -43,4 +46,11 @@ public class FlowTaskVo { @ApiModelProperty("审批组") private List candidateGroups; + + public Map getVars() { + if (StrUtil.isEmpty(this.vars)) { + return Collections.emptyMap(); + } + return (Map )JSONUtil.toBean(this.vars, Map.class); + } } diff --git a/ruoyi-flowable/src/main/java/com/ruoyi/flowable/service/impl/FlowTaskServiceImpl.java b/ruoyi-flowable/src/main/java/com/ruoyi/flowable/service/impl/FlowTaskServiceImpl.java index a3d285f..e0e170d 100644 --- a/ruoyi-flowable/src/main/java/com/ruoyi/flowable/service/impl/FlowTaskServiceImpl.java +++ b/ruoyi-flowable/src/main/java/com/ruoyi/flowable/service/impl/FlowTaskServiceImpl.java @@ -4,6 +4,7 @@ package com.ruoyi.flowable.service.impl; import cn.hutool.core.date.DatePattern; import cn.hutool.core.date.DateUtil; import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.google.common.collect.Lists; import com.ruoyi.common.core.domain.AjaxResult; @@ -18,6 +19,7 @@ import com.ruoyi.flowable.domain.dto.FlowCommentDto; import com.ruoyi.flowable.domain.dto.FlowNextDto; import com.ruoyi.flowable.domain.dto.FlowTaskDto; import com.ruoyi.flowable.domain.dto.FlowViewerDto; +import com.ruoyi.flowable.domain.vo.AttachmentInfoVO; import com.ruoyi.flowable.domain.vo.FlowTaskVo; import com.ruoyi.flowable.domain.vo.UpdateVariablesSubmitDateVo; import com.ruoyi.flowable.factory.FlowServiceFactory; @@ -25,8 +27,8 @@ import com.ruoyi.flowable.flow.CustomProcessDiagramGenerator; import com.ruoyi.flowable.flow.FindNextNodeUtil; import com.ruoyi.flowable.flow.FlowableUtils; import com.ruoyi.flowable.service.IFlowTaskService; -import com.ruoyi.flowable.service.ISysDeployFormService; import com.ruoyi.system.domain.SysProject; +import com.ruoyi.system.service.ISysAttachmentService; import com.ruoyi.system.service.ISysProjectService; import com.ruoyi.system.service.ISysRoleService; import com.ruoyi.system.service.ISysUserService; @@ -65,6 +67,7 @@ import java.util.function.Function; import java.util.function.Predicate; import java.util.stream.Collectors; +import static com.ruoyi.flowable.common.constant.ProcessConstants.ATTACHMENT_IDS_VARIABLE_KEY; import static com.ruoyi.flowable.common.constant.ProcessConstants.USER_MODIFY_TASK_FINISH_TIME_VARIABLE_KEY; /** @@ -84,7 +87,7 @@ public class FlowTaskServiceImpl extends FlowServiceFactory implements IFlowTask @Resource - private ISysDeployFormService sysInstanceFormService; + private ISysAttachmentService sysAttachmentService; @Resource private ISysProjectService sysProjectService; @@ -102,12 +105,12 @@ public class FlowTaskServiceImpl extends FlowServiceFactory implements IFlowTask } if (DelegationState.PENDING.equals(task.getDelegationState())) { taskService.addComment(taskVo.getTaskId(), taskVo.getInstanceId(), FlowComment.DELEGATE.getType(), taskVo.getComment()); - taskService.resolveTask(taskVo.getTaskId(), taskVo.getValues()); + taskService.resolveTask(taskVo.getTaskId(), taskVo.getVars()); } else { taskService.addComment(taskVo.getTaskId(), taskVo.getInstanceId(), FlowComment.NORMAL.getType(), taskVo.getComment()); Long userId = SecurityUtils.getLoginUser().getUser().getUserId(); taskService.setAssignee(taskVo.getTaskId(), userId.toString()); - taskService.complete(taskVo.getTaskId(), taskVo.getValues()); + taskService.complete(taskVo.getTaskId(), taskVo.getVars()); } runtimeService.updateBusinessStatus(taskVo.getInstanceId(), FlowStatus.APPROVING.getValue()); return AjaxResult.success(); @@ -647,13 +650,16 @@ public class FlowTaskServiceImpl extends FlowServiceFactory implements IFlowTask // 流程发起人信息 HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery() - .processInstanceId(task.getProcessInstanceId()) + .processInstanceId(task.getProcessInstanceId()).includeProcessVariables() .singleResult(); SysUser startUser = sysUserService.selectUserById(Long.parseLong(historicProcessInstance.getStartUserId())); // SysUser startUser = sysUserService.selectUserById(Long.parseLong(task.getAssignee())); flowTask.setStartUserId(startUser.getNickName()); flowTask.setStartUserName(startUser.getNickName()); flowTask.setStartDeptName(startUser.getDept().getDeptName()); + flowTask.extractIssue(historicProcessInstance.getProcessVariables()); + flowTask.extractProjectName(historicProcessInstance.getProcessVariables(),sysProjectService); + flowList.add(flowTask); } @@ -797,10 +803,6 @@ public class FlowTaskServiceImpl extends FlowServiceFactory implements IFlowTask map.put("finished", false); } -// ProcessInstance processInstance = runtimeService.createProcessInstanceQuery() -// .processInstanceId(procInsId) -// .includeProcessVariables() -// .singleResult(); if (Objects.nonNull(processInstance)) { map.put("form", processInstance.getProcessVariables()); } else { @@ -808,15 +810,50 @@ public class FlowTaskServiceImpl extends FlowServiceFactory implements IFlowTask .processInstanceId(procInsId) .includeProcessVariables() .singleResult(); - Optional.of(historicProcessInstance) - .ifPresent(e -> map.put("form", historicProcessInstance.getProcessVariables())); + if (Objects.nonNull(historicProcessInstance)) { + map.put("form", historicProcessInstance.getProcessVariables()); + } } + map = extractAndParseAttachment(map); } return AjaxResult.success(map); } + public Map extractAndParseAttachment( Map result) { + if (MapUtils.isEmpty(result)) { + return result; + } + Map variables = ( Map)MapUtils.getMap(result, "form",new HashMap<>()); +// get AttachmentIds + if (!variables.containsKey(ATTACHMENT_IDS_VARIABLE_KEY) || StringUtils.isBlank(MapUtils.getString(variables,ATTACHMENT_IDS_VARIABLE_KEY))) { + return result; + } +// get Attachment info + List attachmentIds = StrUtil.split(MapUtils.getString(variables, ATTACHMENT_IDS_VARIABLE_KEY), ',', -1, true, Long::valueOf); + if (CollectionUtils.isEmpty(attachmentIds)) { + return result; + } + List list = attachmentIds.stream().map(e -> sysAttachmentService.selectSysAttachmentById(e)).map(e->{ + AttachmentInfoVO vo = new AttachmentInfoVO(); + vo.setIsImgByContentType(e.getContentType()); + vo.setBase64ByFile(e.getPath(),e.getType()); + vo.setId(e.getId()); + vo.setName(e.getName()); + vo.setType(e.getType()); + return vo; + }).collect(Collectors.toList()); + + Collection imgs = CollectionUtils.select(list, e -> e.getIsImg()); + Collection files = CollectionUtils.selectRejected(list, e -> e.getIsImg()); + result.put("imgs", imgs); + result.put("files", files); + return result; +// build result Attachment type 、 name、id + + } + public static Date parseFinishTime(Map userModifyTaskFinishTime ,String taskId, Date taskEndTime) { if (MapUtils.isEmpty(userModifyTaskFinishTime)) { return taskEndTime;