From e43e5f5caf3763fe3748af3f065fc3d6432de1b2 Mon Sep 17 00:00:00 2001 From: chenbowen Date: Thu, 25 Sep 2025 19:24:06 +0800 Subject: [PATCH] =?UTF-8?q?1.=20=E5=8D=87=E7=BA=A7=203.0.38=20=20=E8=A1=A5?= =?UTF-8?q?=E5=85=A8=E4=B8=9A=E5=8A=A1=E9=99=84=E4=BB=B6=E8=A1=A8=E7=BC=BA?= =?UTF-8?q?=E5=A4=B1=E7=9A=84=20api=20=20=E6=94=AF=E6=8C=81=20api=20?= =?UTF-8?q?=E8=8E=B7=E5=8F=96=E9=99=84=E4=BB=B6=E4=BA=8C=E8=BF=9B=E5=88=B6?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=20=20=E6=96=B0=E5=A2=9E=E4=B8=9A=E5=8A=A1?= =?UTF-8?q?=E9=99=84=E4=BB=B6=E8=A1=A8=E7=8A=B6=E6=80=81=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=20=20=E8=A1=A5=E5=85=A8=E9=83=A8=E5=88=86=E5=AD=98=E5=9C=A8?= =?UTF-8?q?=E5=B5=8C=E5=A5=97=E7=BB=93=E6=9E=84=E7=9A=84=20bpm=20api=20?= =?UTF-8?q?=E7=BC=BA=E5=A4=B1=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bpm/api/task/dto/BpmTaskRespDTO.java | 76 ++++++++++++++++- .../bpm/api/task/dto/UserSimpleDTO.java | 25 ++++++ .../module/bpm/api/task/BpmTaskApiImpl.java | 28 ++++--- .../bpm/convert/task/BpmTaskConvert.java | 83 +++++++++++++++++++ 4 files changed, 200 insertions(+), 12 deletions(-) create mode 100644 zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/task/dto/UserSimpleDTO.java diff --git a/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/task/dto/BpmTaskRespDTO.java b/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/task/dto/BpmTaskRespDTO.java index 1ae2e45..412c098 100644 --- a/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/task/dto/BpmTaskRespDTO.java +++ b/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/task/dto/BpmTaskRespDTO.java @@ -1,5 +1,6 @@ package com.zt.plat.module.bpm.api.task.dto; +import com.zt.plat.framework.common.core.KeyValue; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; @@ -46,14 +47,87 @@ public class BpmTaskRespDTO { @Schema(description = "表单编号", example = "1024") private Long formId; + + @Schema(description = "表单路径", example = "/form/leave") + private String formPath; + + @Schema(description = "表单名字", example = "请假表单") + private String formName; @Schema(description = "表单的配置", example = "[]") private String formConf; @Schema(description = "表单项的数组", example = "[]") - private String formFields; + private List formFields; @Schema(description = "提交的表单值", example = "{\"name\": \"芋艿\"}") private Map formVariables; + @Schema(description = "任务负责人编号", example = "2048") + private Long owner; + + @Schema(description = "负责人的用户信息") + private UserSimpleDTO ownerUser; + + @Schema(description = "任务分配人编号", example = "2048") + private Long assignee; + + @Schema(description = "审核的用户信息") + private UserSimpleDTO assigneeUser; + + @Schema(description = "父任务编号", example = "1024") + private String parentTaskId; + + @Schema(description = "子任务列表(由加签生成)") + private List children; + + @Schema(description = "所属流程实例") + private ProcessInstanceDTO processInstance; + + @Schema(description = "操作按钮设置值") + private Map buttonsSetting; + + @Schema(description = "是否需要签名", example = "false") + private Boolean signEnable; + + @Schema(description = "是否填写审批意见", example = "false") + private Boolean reasonRequire; + + @Schema(description = "节点类型", example = "10") + private Integer nodeType; + + @Data + @Schema(description = "流程实例信息") + public static class ProcessInstanceDTO { + + @Schema(description = "流程实例编号", example = "1024") + private String id; + + @Schema(description = "流程实例名称", example = "芋道") + private String name; + + @Schema(description = "提交时间") + private LocalDateTime createTime; + + @Schema(description = "流程定义的编号", example = "2048") + private String processDefinitionId; + + @Schema(description = "流程摘要", example = "[]") + private List> summary; + + @Schema(description = "发起人的用户信息") + private UserSimpleDTO startUser; + } + + @Data + @Schema(description = "操作按钮设置") + public static class OperationButtonSettingDTO { + + @Schema(description = "显示名称", example = "审批") + private String displayName; + + @Schema(description = "是否启用", example = "true") + private Boolean enable; + } + } \ No newline at end of file diff --git a/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/task/dto/UserSimpleDTO.java b/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/task/dto/UserSimpleDTO.java new file mode 100644 index 0000000..ddb00d6 --- /dev/null +++ b/zt-module-bpm-api/src/main/java/com/zt/plat/module/bpm/api/task/dto/UserSimpleDTO.java @@ -0,0 +1,25 @@ +package com.zt.plat.module.bpm.api.task.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Schema(description = "RPC 服务 - 用户精简信息 DTO") +@Data +public class UserSimpleDTO { + + @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Long id; + + @Schema(description = "用户昵称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿") + private String nickname; + + @Schema(description = "用户头像", example = "https://www.iocoder.cn/1.png") + private String avatar; + + @Schema(description = "部门编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Long deptId; + + @Schema(description = "部门名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "研发部") + private String deptName; + +} \ No newline at end of file diff --git a/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/api/task/BpmTaskApiImpl.java b/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/api/task/BpmTaskApiImpl.java index d688f4a..4d70c6a 100644 --- a/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/api/task/BpmTaskApiImpl.java +++ b/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/api/task/BpmTaskApiImpl.java @@ -75,12 +75,14 @@ public class BpmTaskApiImpl implements BpmTaskApi { Map userMap = adminUserApi.getUserMap(convertSet(processInstanceMap.values(), instance -> Long.valueOf(instance.getStartUserId()))); Map processDefinitionInfoMap = processDefinitionService.getProcessDefinitionInfoMap(convertSet(pageResult.getList(), Task::getProcessDefinitionId)); - // 使用转换器构建结果并转换为 DTO + // 使用转换器构建完整的 VO 结果,然后转换为 DTO var voPageResult = BpmTaskConvert.INSTANCE.buildTodoTaskPage(pageResult, processInstanceMap, userMap, processDefinitionInfoMap); - return success(BeanUtils.toBean(voPageResult.getList(), BpmTaskRespDTO.class)); + List result = BpmTaskConvert.INSTANCE.buildTaskRespDTOList(voPageResult.getList()); + + return success(result); } - @Override + @Override public CommonResult> getTaskDonePage(@Valid BpmTaskPageReqDTO pageReqDTO) { // 转换请求参数 BpmTaskPageReqVO pageReqVO = BeanUtils.toBean(pageReqDTO, BpmTaskPageReqVO.class); @@ -96,9 +98,11 @@ public class BpmTaskApiImpl implements BpmTaskApi { Map userMap = adminUserApi.getUserMap(convertSet(processInstanceMap.values(), instance -> Long.valueOf(instance.getStartUserId()))); Map processDefinitionInfoMap = processDefinitionService.getProcessDefinitionInfoMap(convertSet(pageResult.getList(), HistoricTaskInstance::getProcessDefinitionId)); - // 使用转换器构建结果并转换为 DTO + // 使用转换器构建完整的 VO 结果,然后转换为 DTO var voPageResult = BpmTaskConvert.INSTANCE.buildTaskPage(pageResult, processInstanceMap, userMap, null, processDefinitionInfoMap); - return success(BeanUtils.toBean(voPageResult.getList(), BpmTaskRespDTO.class)); + List result = BpmTaskConvert.INSTANCE.buildTaskRespDTOList(voPageResult.getList()); + + return success(result); } @Override @@ -121,9 +125,11 @@ public class BpmTaskApiImpl implements BpmTaskApi { Map deptMap = deptApi.getDeptMap(convertSet(userMap.values(), DeptUtil::getDeptId)); Map processDefinitionInfoMap = processDefinitionService.getProcessDefinitionInfoMap(convertSet(pageResult.getList(), HistoricTaskInstance::getProcessDefinitionId)); - // 使用转换器构建结果并转换为 DTO + // 使用转换器构建完整的 VO 结果,然后转换为 DTO var voPageResult = BpmTaskConvert.INSTANCE.buildTaskPage(pageResult, processInstanceMap, userMap, deptMap, processDefinitionInfoMap); - return success(BeanUtils.toBean(voPageResult.getList(), BpmTaskRespDTO.class)); + List result = BpmTaskConvert.INSTANCE.buildTaskRespDTOList(voPageResult.getList()); + + return success(result); } @Override @@ -152,9 +158,9 @@ public class BpmTaskApiImpl implements BpmTaskApi { } })); - // 使用转换器构建结果并转换为 DTO + // 使用转换器构建完整的 VO 结果,然后转换为 DTO var voList = BpmTaskConvert.INSTANCE.buildTaskListByProcessInstanceId(taskList, formMap, userMap, deptMap); - List result = BeanUtils.toBean(voList, BpmTaskRespDTO.class); + List result = BpmTaskConvert.INSTANCE.buildTaskRespDTOList(voList); return success(result); } @@ -187,9 +193,9 @@ public class BpmTaskApiImpl implements BpmTaskApi { Map userMap = adminUserApi.getUserMap(convertSetByFlatMap(taskList, user -> Stream.of(NumberUtils.parseLong(user.getAssignee()), NumberUtils.parseLong(user.getOwner())))); Map deptMap = deptApi.getDeptMap(convertSet(userMap.values(), DeptUtil::getDeptId)); - // 使用转换器构建结果并转换为 DTO + // 使用转换器构建完整的 VO 结果,然后转换为 DTO var voList = BpmTaskConvert.INSTANCE.buildTaskListByParentTaskId(taskList, userMap, deptMap); - List result = BeanUtils.toBean(voList, BpmTaskRespDTO.class); + List result = BpmTaskConvert.INSTANCE.buildTaskRespDTOList(voList); return success(result); } diff --git a/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/convert/task/BpmTaskConvert.java b/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/convert/task/BpmTaskConvert.java index 5926d84..ccba6d7 100644 --- a/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/convert/task/BpmTaskConvert.java +++ b/zt-module-bpm-server/src/main/java/com/zt/plat/module/bpm/convert/task/BpmTaskConvert.java @@ -8,6 +8,8 @@ import com.zt.plat.framework.common.util.collection.CollectionUtils; import com.zt.plat.framework.common.util.date.DateUtils; import com.zt.plat.framework.common.util.number.NumberUtils; import com.zt.plat.framework.common.util.object.BeanUtils; +import com.zt.plat.module.bpm.api.task.dto.BpmTaskRespDTO; +import com.zt.plat.module.bpm.api.task.dto.UserSimpleDTO; import com.zt.plat.module.bpm.controller.admin.base.user.UserSimpleBaseVO; import com.zt.plat.module.bpm.controller.admin.task.vo.task.BpmTaskRespVO; import com.zt.plat.module.bpm.dal.dataobject.definition.BpmFormDO; @@ -230,4 +232,85 @@ public interface BpmTaskConvert { childTask.setTenantId(parentTask.getTenantId()); } + /** + * 将 BpmTaskRespVO 转换为 BpmTaskRespDTO,保持完整的嵌套结构 + */ + default List buildTaskRespDTOList(List voList) { + return CollectionUtils.convertList(voList, this::buildTaskRespDTO); + } + + /** + * 将 BpmTaskRespVO 转换为 BpmTaskRespDTO,保持完整的嵌套结构 + */ + default BpmTaskRespDTO buildTaskRespDTO(BpmTaskRespVO vo) { + if (vo == null) { + return null; + } + + BpmTaskRespDTO dto = BeanUtils.toBean(vo, BpmTaskRespDTO.class); + + // 转换用户信息 + if (vo.getAssigneeUser() != null) { + dto.setAssigneeUser(convertToUserSimpleDTO(vo.getAssigneeUser())); + } + if (vo.getOwnerUser() != null) { + dto.setOwnerUser(convertToUserSimpleDTO(vo.getOwnerUser())); + } + + // 转换流程实例信息 + if (vo.getProcessInstance() != null) { + BpmTaskRespDTO.ProcessInstanceDTO processInstanceDTO = new BpmTaskRespDTO.ProcessInstanceDTO(); + processInstanceDTO.setId(vo.getProcessInstance().getId()); + processInstanceDTO.setName(vo.getProcessInstance().getName()); + processInstanceDTO.setCreateTime(vo.getProcessInstance().getCreateTime()); + processInstanceDTO.setProcessDefinitionId(vo.getProcessInstance().getProcessDefinitionId()); + processInstanceDTO.setSummary(vo.getProcessInstance().getSummary()); + + if (vo.getProcessInstance().getStartUser() != null) { + processInstanceDTO.setStartUser(convertToUserSimpleDTO(vo.getProcessInstance().getStartUser())); + } + dto.setProcessInstance(processInstanceDTO); + } + + // 转换操作按钮设置 + if (vo.getButtonsSetting() != null) { + Map buttonsSettingDTO = vo.getButtonsSetting().entrySet() + .stream() + .collect(java.util.stream.Collectors.toMap( + Map.Entry::getKey, + entry -> { + BpmTaskRespDTO.OperationButtonSettingDTO settingDTO = new BpmTaskRespDTO.OperationButtonSettingDTO(); + settingDTO.setDisplayName(entry.getValue().getDisplayName()); + settingDTO.setEnable(entry.getValue().getEnable()); + return settingDTO; + } + )); + dto.setButtonsSetting(buttonsSettingDTO); + } + + // 递归转换子任务 + if (vo.getChildren() != null) { + dto.setChildren(buildTaskRespDTOList(vo.getChildren())); + } + + return dto; + } + + /** + * 将 UserSimpleBaseVO 转换为 UserSimpleDTO,确保所有字段都被正确赋值 + */ + default UserSimpleDTO convertToUserSimpleDTO(UserSimpleBaseVO vo) { + if (vo == null) { + return null; + } + + UserSimpleDTO dto = new UserSimpleDTO(); + dto.setId(vo.getId()); + dto.setNickname(vo.getNickname()); + dto.setAvatar(vo.getAvatar()); + dto.setDeptId(vo.getDeptId()); + dto.setDeptName(vo.getDeptName()); // 确保 deptName 被正确赋值 + return dto; + } + }