From b597920d55a7b0189036ccce8b68b36517230d01 Mon Sep 17 00:00:00 2001 From: yangchaojin <549193112@qq.com> Date: Tue, 20 Jan 2026 09:23:25 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8DBUG712=EF=BC=8C=E7=BB=84?= =?UTF-8?q?=E7=BB=87=E7=89=A9=E6=96=99=E4=BF=A1=E6=81=AF=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E8=8C=83=E5=9B=B4=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/DepartmentMaterialPageReqDTO.java | 3 + .../dto/DepartmentMaterialRespDTO.java | 12 +++ .../vo/DepartmentMaterialPageReqVO.java | 5 + .../vo/DepartmentMaterialRespVO.java | 11 +++ .../DepartmentMaterialMapper.java | 1 + .../DepartmentMaterialServiceImpl.java | 92 ++++++++++++++++++- 6 files changed, 123 insertions(+), 1 deletion(-) diff --git a/zt-module-base/zt-module-base-api/src/main/java/com/zt/plat/module/base/api/departmentmaterial/dto/DepartmentMaterialPageReqDTO.java b/zt-module-base/zt-module-base-api/src/main/java/com/zt/plat/module/base/api/departmentmaterial/dto/DepartmentMaterialPageReqDTO.java index 4573034f..1301bff0 100644 --- a/zt-module-base/zt-module-base-api/src/main/java/com/zt/plat/module/base/api/departmentmaterial/dto/DepartmentMaterialPageReqDTO.java +++ b/zt-module-base/zt-module-base-api/src/main/java/com/zt/plat/module/base/api/departmentmaterial/dto/DepartmentMaterialPageReqDTO.java @@ -46,4 +46,7 @@ public class DepartmentMaterialPageReqDTO extends PageParam { @Schema(description = "创建时间") @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) private LocalDateTime[] createTime; + + @Schema(description = "是否是公司") + private Boolean isCompany; } diff --git a/zt-module-base/zt-module-base-api/src/main/java/com/zt/plat/module/base/api/departmentmaterial/dto/DepartmentMaterialRespDTO.java b/zt-module-base/zt-module-base-api/src/main/java/com/zt/plat/module/base/api/departmentmaterial/dto/DepartmentMaterialRespDTO.java index a7255024..3afddce4 100644 --- a/zt-module-base/zt-module-base-api/src/main/java/com/zt/plat/module/base/api/departmentmaterial/dto/DepartmentMaterialRespDTO.java +++ b/zt-module-base/zt-module-base-api/src/main/java/com/zt/plat/module/base/api/departmentmaterial/dto/DepartmentMaterialRespDTO.java @@ -1,9 +1,12 @@ package com.zt.plat.module.base.api.departmentmaterial.dto; +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonIgnore; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import java.time.LocalDateTime; +import java.util.Map; /** * 组织架构物料 Response DTO @@ -58,4 +61,13 @@ public class DepartmentMaterialRespDTO { @Schema(description = "状态编码") private String status; + + @JsonIgnore + @Schema(description = "物料基础字段 + 属性编码->原值的动态键值,基础字段优先,序列化时直接展开为顶层字段") + private Map flatAttributes; + + @JsonAnyGetter + public Map getFlatAttributes() { + return flatAttributes; + } } diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/departmentmaterial/vo/DepartmentMaterialPageReqVO.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/departmentmaterial/vo/DepartmentMaterialPageReqVO.java index 4e4dd872..fec0b936 100644 --- a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/departmentmaterial/vo/DepartmentMaterialPageReqVO.java +++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/departmentmaterial/vo/DepartmentMaterialPageReqVO.java @@ -45,4 +45,9 @@ public class DepartmentMaterialPageReqVO extends PageParam { @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) private LocalDateTime[] createTime; + @Schema(description = "是否是公司") + private Boolean isCompany; + + @Schema(description = "部门ID集合(内部使用)") + private List deptIds; } \ No newline at end of file diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/departmentmaterial/vo/DepartmentMaterialRespVO.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/departmentmaterial/vo/DepartmentMaterialRespVO.java index 802bcfa1..62f809ab 100644 --- a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/departmentmaterial/vo/DepartmentMaterialRespVO.java +++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/departmentmaterial/vo/DepartmentMaterialRespVO.java @@ -1,5 +1,7 @@ package com.zt.plat.module.base.controller.admin.departmentmaterial.vo; +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonIgnore; import io.swagger.v3.oas.annotations.media.Schema; import lombok.*; import java.util.*; @@ -77,4 +79,13 @@ public class DepartmentMaterialRespVO { // base_material_status 系统字典取值 private String status; + @JsonIgnore + @Schema(description = "物料基础字段 + 属性编码->原值的动态键值,基础字段优先,序列化时直接展开为顶层字段") + private Map flatAttributes; + + @JsonAnyGetter + public Map getFlatAttributes() { + return flatAttributes; + } + } \ No newline at end of file diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dao/departmentmaterial/DepartmentMaterialMapper.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dao/departmentmaterial/DepartmentMaterialMapper.java index 9539a990..848aa797 100644 --- a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dao/departmentmaterial/DepartmentMaterialMapper.java +++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dao/departmentmaterial/DepartmentMaterialMapper.java @@ -23,6 +23,7 @@ public interface DepartmentMaterialMapper extends BaseMapperX deptList = (deptApi.upFindCompanyNode(pageReqVO.getDeptId())).getData(); + if (!CollUtil.isEmpty(deptList)) { + pageReqVO.setDeptIds(deptList.stream().map(DeptRespDTO::getId).toList()); // 设置部门查询范围 + pageReqVO.setDeptId(null); // 置空部门编号 + } + } + PageResult pageResult = departmentMaterialMapper.selectPage(pageReqVO); // 重置,避免后续使用该入参出现意外的 in 条件 pageReqVO.setInfomationIds(null); @@ -283,4 +302,75 @@ public class DepartmentMaterialServiceImpl implements DepartmentMaterialService return path; } + + private List buildPropertyAggregates(List list) { + if (CollUtil.isEmpty(list)) { + return Collections.emptyList(); + } + + List hasPropertiesList = materialHasPropertiesMapper.selectList( + new LambdaQueryWrapperX().in(MaterialHasPropertiesDO::getInfomationId, + list.stream().map(DepartmentMaterialRespVO::getInfomationId).toList())); + if (CollUtil.isEmpty(hasPropertiesList)) { + return list; + } + + Set propertiesIds = hasPropertiesList.stream() + .map(MaterialHasPropertiesDO::getPropertiesId) + .filter(Objects::nonNull) + .collect(Collectors.toSet()); + Map propertiesMap = propertiesIds.isEmpty() + ? Collections.emptyMap() + : materialPropertiesMapper.selectBatchIds(propertiesIds).stream() + .filter(Objects::nonNull) + .collect(Collectors.toMap(MaterialPropertiesDO::getId, Function.identity())); + + Map> infoPropsMap = hasPropertiesList.stream() + .collect(Collectors.groupingBy(MaterialHasPropertiesDO::getInfomationId)); + + Map result = new HashMap<>(); + for (Map.Entry> entry : infoPropsMap.entrySet()) { + Long infoId = entry.getKey(); + List props = entry.getValue(); + // 按 sort 升序,保持 deterministic,重复 code 时保留首条 + props.sort(Comparator.comparing((MaterialHasPropertiesDO o) -> o.getSort() == null ? Long.MAX_VALUE : o.getSort()) + .thenComparing(MaterialHasPropertiesDO::getPropertiesId, Comparator.nullsLast(Long::compareTo)) + .thenComparing(MaterialHasPropertiesDO::getId, Comparator.nullsLast(Long::compareTo))); + + Map flatMap = new LinkedHashMap<>(); + for (MaterialHasPropertiesDO item : props) { + MaterialPropertiesDO property = propertiesMap.get(item.getPropertiesId()); + String code = property != null ? property.getCode() : null; + if (StrUtil.isBlank(code)) { + continue; + } + if (flatMap.containsKey(code)) { + continue; + } + flatMap.put(code, item.getValue()); + } + + result.put(infoId, new MaterialPropertiesAggregate(flatMap)); + } + + return list.stream().peek(item -> { + Map flatMap = new LinkedHashMap<>(); + MaterialPropertiesAggregate aggregate = result.get(item.getInfomationId()); + if (aggregate != null && CollUtil.isNotEmpty(aggregate.getAttributes())) { + aggregate.getAttributes().forEach((k, v) -> { + // 基础字段优先,存在同名则跳过属性值 + if (!flatMap.containsKey(k)) { + flatMap.put(k, v); + } + }); + item.setFlatAttributes(flatMap); + } + }).collect(Collectors.toList()); + } + + private record MaterialPropertiesAggregate(Map attributes) { + public Map getAttributes() { + return attributes; + } + } } \ No newline at end of file