Merge branch 'dev' into 'test'
修复BUG712,组织物料信息查询范围调整 See merge request jygk/dsc-base!25
This commit is contained in:
@@ -46,4 +46,7 @@ public class DepartmentMaterialPageReqDTO extends PageParam {
|
|||||||
@Schema(description = "创建时间")
|
@Schema(description = "创建时间")
|
||||||
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
|
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
|
||||||
private LocalDateTime[] createTime;
|
private LocalDateTime[] createTime;
|
||||||
|
|
||||||
|
@Schema(description = "是否是公司")
|
||||||
|
private Boolean isCompany;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,9 +1,12 @@
|
|||||||
package com.zt.plat.module.base.api.departmentmaterial.dto;
|
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 io.swagger.v3.oas.annotations.media.Schema;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 组织架构物料 Response DTO
|
* 组织架构物料 Response DTO
|
||||||
@@ -58,4 +61,13 @@ public class DepartmentMaterialRespDTO {
|
|||||||
|
|
||||||
@Schema(description = "状态编码")
|
@Schema(description = "状态编码")
|
||||||
private String status;
|
private String status;
|
||||||
|
|
||||||
|
@JsonIgnore
|
||||||
|
@Schema(description = "物料基础字段 + 属性编码->原值的动态键值,基础字段优先,序列化时直接展开为顶层字段")
|
||||||
|
private Map<String, Object> flatAttributes;
|
||||||
|
|
||||||
|
@JsonAnyGetter
|
||||||
|
public Map<String, Object> getFlatAttributes() {
|
||||||
|
return flatAttributes;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -45,4 +45,9 @@ public class DepartmentMaterialPageReqVO extends PageParam {
|
|||||||
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
|
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
|
||||||
private LocalDateTime[] createTime;
|
private LocalDateTime[] createTime;
|
||||||
|
|
||||||
|
@Schema(description = "是否是公司")
|
||||||
|
private Boolean isCompany;
|
||||||
|
|
||||||
|
@Schema(description = "部门ID集合(内部使用)")
|
||||||
|
private List<Long> deptIds;
|
||||||
}
|
}
|
||||||
@@ -1,5 +1,7 @@
|
|||||||
package com.zt.plat.module.base.controller.admin.departmentmaterial.vo;
|
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 io.swagger.v3.oas.annotations.media.Schema;
|
||||||
import lombok.*;
|
import lombok.*;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
@@ -77,4 +79,13 @@ public class DepartmentMaterialRespVO {
|
|||||||
// base_material_status 系统字典取值
|
// base_material_status 系统字典取值
|
||||||
private String status;
|
private String status;
|
||||||
|
|
||||||
|
@JsonIgnore
|
||||||
|
@Schema(description = "物料基础字段 + 属性编码->原值的动态键值,基础字段优先,序列化时直接展开为顶层字段")
|
||||||
|
private Map<String, Object> flatAttributes;
|
||||||
|
|
||||||
|
@JsonAnyGetter
|
||||||
|
public Map<String, Object> getFlatAttributes() {
|
||||||
|
return flatAttributes;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -23,6 +23,7 @@ public interface DepartmentMaterialMapper extends BaseMapperX<DepartmentMaterial
|
|||||||
.inIfPresent(DepartmentMaterialDO::getInfomationId, reqVO.getInfomationIds())
|
.inIfPresent(DepartmentMaterialDO::getInfomationId, reqVO.getInfomationIds())
|
||||||
.eqIfPresent(DepartmentMaterialDO::getClassesId, reqVO.getClassesId())
|
.eqIfPresent(DepartmentMaterialDO::getClassesId, reqVO.getClassesId())
|
||||||
.eqIfPresent(DepartmentMaterialDO::getDeptId, reqVO.getDeptId())
|
.eqIfPresent(DepartmentMaterialDO::getDeptId, reqVO.getDeptId())
|
||||||
|
.inIfPresent(DepartmentMaterialDO::getDeptId, reqVO.getDeptIds())
|
||||||
.eqIfPresent(DepartmentMaterialDO::getDictionaryDataValue, reqVO.getDictionaryDataValue())
|
.eqIfPresent(DepartmentMaterialDO::getDictionaryDataValue, reqVO.getDictionaryDataValue())
|
||||||
.eqIfPresent(DepartmentMaterialDO::getStatus, reqVO.getStatus())
|
.eqIfPresent(DepartmentMaterialDO::getStatus, reqVO.getStatus())
|
||||||
.eqIfPresent(DepartmentMaterialDO::getRemark, reqVO.getRemark())
|
.eqIfPresent(DepartmentMaterialDO::getRemark, reqVO.getRemark())
|
||||||
|
|||||||
@@ -2,6 +2,10 @@ package com.zt.plat.module.base.service.departmentmaterial;
|
|||||||
|
|
||||||
import cn.hutool.core.collection.CollUtil;
|
import cn.hutool.core.collection.CollUtil;
|
||||||
import cn.hutool.core.util.StrUtil;
|
import cn.hutool.core.util.StrUtil;
|
||||||
|
import com.zt.plat.module.base.dal.dao.materialhasproperties.MaterialHasPropertiesMapper;
|
||||||
|
import com.zt.plat.module.base.dal.dao.materialproperties.MaterialPropertiesMapper;
|
||||||
|
import com.zt.plat.module.base.dal.dataobject.materialhasproperties.MaterialHasPropertiesDO;
|
||||||
|
import com.zt.plat.module.base.dal.dataobject.materialproperties.MaterialPropertiesDO;
|
||||||
import jakarta.annotation.Resource;
|
import jakarta.annotation.Resource;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.validation.annotation.Validated;
|
import org.springframework.validation.annotation.Validated;
|
||||||
@@ -50,6 +54,12 @@ public class DepartmentMaterialServiceImpl implements DepartmentMaterialService
|
|||||||
@Resource
|
@Resource
|
||||||
private BusinessDictionaryDataMapper businessDictionaryDataMapper;
|
private BusinessDictionaryDataMapper businessDictionaryDataMapper;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private MaterialHasPropertiesMapper materialHasPropertiesMapper;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private MaterialPropertiesMapper materialPropertiesMapper;
|
||||||
|
|
||||||
@Resource
|
@Resource
|
||||||
private DeptApi deptApi;
|
private DeptApi deptApi;
|
||||||
|
|
||||||
@@ -106,7 +116,7 @@ public class DepartmentMaterialServiceImpl implements DepartmentMaterialService
|
|||||||
if (data == null) {
|
if (data == null) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
return CollUtil.getFirst(decorateDepartmentMaterials(Collections.singletonList(data)));
|
return CollUtil.getFirst(buildPropertyAggregates(decorateDepartmentMaterials(Collections.singletonList(data))));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -134,6 +144,15 @@ public class DepartmentMaterialServiceImpl implements DepartmentMaterialService
|
|||||||
pageReqVO.setInfomationIds(matchedInfoIds);
|
pageReqVO.setInfomationIds(matchedInfoIds);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 判断部门是否是公司,非公司的部门需要显示所属公司下的所有物料信息
|
||||||
|
if(pageReqVO.getIsCompany() != null && !pageReqVO.getIsCompany()) {
|
||||||
|
List<DeptRespDTO> deptList = (deptApi.upFindCompanyNode(pageReqVO.getDeptId())).getData();
|
||||||
|
if (!CollUtil.isEmpty(deptList)) {
|
||||||
|
pageReqVO.setDeptIds(deptList.stream().map(DeptRespDTO::getId).toList()); // 设置部门查询范围
|
||||||
|
pageReqVO.setDeptId(null); // 置空部门编号
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
PageResult<DepartmentMaterialDO> pageResult = departmentMaterialMapper.selectPage(pageReqVO);
|
PageResult<DepartmentMaterialDO> pageResult = departmentMaterialMapper.selectPage(pageReqVO);
|
||||||
// 重置,避免后续使用该入参出现意外的 in 条件
|
// 重置,避免后续使用该入参出现意外的 in 条件
|
||||||
pageReqVO.setInfomationIds(null);
|
pageReqVO.setInfomationIds(null);
|
||||||
@@ -283,4 +302,75 @@ public class DepartmentMaterialServiceImpl implements DepartmentMaterialService
|
|||||||
return path;
|
return path;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private List<DepartmentMaterialRespVO> buildPropertyAggregates(List<DepartmentMaterialRespVO> list) {
|
||||||
|
if (CollUtil.isEmpty(list)) {
|
||||||
|
return Collections.emptyList();
|
||||||
|
}
|
||||||
|
|
||||||
|
List<MaterialHasPropertiesDO> hasPropertiesList = materialHasPropertiesMapper.selectList(
|
||||||
|
new LambdaQueryWrapperX<MaterialHasPropertiesDO>().in(MaterialHasPropertiesDO::getInfomationId,
|
||||||
|
list.stream().map(DepartmentMaterialRespVO::getInfomationId).toList()));
|
||||||
|
if (CollUtil.isEmpty(hasPropertiesList)) {
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
Set<Long> propertiesIds = hasPropertiesList.stream()
|
||||||
|
.map(MaterialHasPropertiesDO::getPropertiesId)
|
||||||
|
.filter(Objects::nonNull)
|
||||||
|
.collect(Collectors.toSet());
|
||||||
|
Map<Long, MaterialPropertiesDO> propertiesMap = propertiesIds.isEmpty()
|
||||||
|
? Collections.emptyMap()
|
||||||
|
: materialPropertiesMapper.selectBatchIds(propertiesIds).stream()
|
||||||
|
.filter(Objects::nonNull)
|
||||||
|
.collect(Collectors.toMap(MaterialPropertiesDO::getId, Function.identity()));
|
||||||
|
|
||||||
|
Map<Long, List<MaterialHasPropertiesDO>> infoPropsMap = hasPropertiesList.stream()
|
||||||
|
.collect(Collectors.groupingBy(MaterialHasPropertiesDO::getInfomationId));
|
||||||
|
|
||||||
|
Map<Long, MaterialPropertiesAggregate> result = new HashMap<>();
|
||||||
|
for (Map.Entry<Long, List<MaterialHasPropertiesDO>> entry : infoPropsMap.entrySet()) {
|
||||||
|
Long infoId = entry.getKey();
|
||||||
|
List<MaterialHasPropertiesDO> 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<String, Object> 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<String, Object> 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<String, Object> attributes) {
|
||||||
|
public Map<String, Object> getAttributes() {
|
||||||
|
return attributes;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user