fix:封装标签查询

This commit is contained in:
2026-02-04 17:09:44 +08:00
parent 6bfe3a196d
commit e0c52e0507
4 changed files with 88 additions and 17 deletions

View File

@@ -8,8 +8,8 @@ import lombok.Getter;
* 固定配置文件元数据响应中需要填充的字典标签字段映射关系 * 固定配置文件元数据响应中需要填充的字典标签字段映射关系
* *
* 映射关系: * 映射关系:
* - disciplineTypeDictClass/disciplineDictValue → DISCIPLINE_TYPE * - disciplineTypeDictClass/disciplineDictValue/disciplineDictName → DISCIPLINE_TYPE
* - fileTypeDictClass/fileTypeDictValue → ALL_FILE_TYPE * - fileTypeDictClass/fileTypeDictValue/fileTypeDictName → ALL_FILE_TYPE
*/ */
@Getter @Getter
@AllArgsConstructor @AllArgsConstructor
@@ -20,14 +20,14 @@ public enum FileDictTagEnum {
* 字段: disciplineTypeDictClass, disciplineDictValue * 字段: disciplineTypeDictClass, disciplineDictValue
* dictClass: DISCIPLINE_TYPE * dictClass: DISCIPLINE_TYPE
*/ */
DISCIPLINE_TYPE("DISCIPLINE_TYPE", "disciplineTypeDictClass", "disciplineDictValue"), DISCIPLINE_TYPE("DISCIPLINE_TYPE", "disciplineTypeDictClass", "disciplineDictValue", "disciplineDictName"),
/** /**
* 文件类型标签 * 文件类型标签
* 字段: fileTypeDictClass, fileTypeDictValue * 字段: fileTypeDictClass, fileTypeDictValue
* dictClass: ALL_FILE_TYPE * dictClass: ALL_FILE_TYPE
*/ */
FILE_TYPE("ALL_FILE_TYPE", "fileTypeDictClass", "fileTypeDictValue"); FILE_TYPE("ALL_FILE_TYPE", "fileTypeDictClass", "fileTypeDictValue", "fileTypeDictName");
/** /**
* 字典分类(对应数据库中的 dictClass * 字典分类(对应数据库中的 dictClass
@@ -43,6 +43,11 @@ public enum FileDictTagEnum {
* dictValue 字段名(完整字段名,如 disciplineDictValue * dictValue 字段名(完整字段名,如 disciplineDictValue
*/ */
private final String dictValueFieldName; private final String dictValueFieldName;
/**
* dictName 字段名(完整字段名,如 disciplineDictName
*/
private final String dictNameFieldName;
/** /**
* 根据 dictClass 获取对应的枚举 * 根据 dictClass 获取对应的枚举

View File

@@ -64,11 +64,17 @@ public class BaseResp {
@Schema(description = "文件类型字典值") @Schema(description = "文件类型字典值")
private String fileTypeDictValue; private String fileTypeDictValue;
@Schema(description = "文件类型字典名称")
private String fileTypeDictName;
@Schema(description = "学科类型字典类") @Schema(description = "学科类型字典类")
private String disciplineTypeDictClass; private String disciplineTypeDictClass;
@Schema(description = "学科类型字典值") @Schema(description = "学科类型字典值")
private String disciplineDictValue; private String disciplineDictValue;
@Schema(description = "学科类型字典名称")
private String disciplineDictName;
// ---------------------------------------------------------------- // ----------------------------------------------------------------
} }

View File

@@ -22,10 +22,16 @@ public class FileDictTagsAggDTO implements Serializable {
@Schema(description = "文件类型字典值(逗号分隔)") @Schema(description = "文件类型字典值(逗号分隔)")
private String fileTypeDictValue; private String fileTypeDictValue;
@Schema(description = "文件类型字典名称(逗号分隔)")
private String fileTypeDictName;
@Schema(description = "学科类型字典类") @Schema(description = "学科类型字典类")
private String disciplineTypeDictClass; private String disciplineTypeDictClass;
@Schema(description = "学科类型字典值(逗号分隔)") @Schema(description = "学科类型字典值(逗号分隔)")
private String disciplineDictValue; private String disciplineDictValue;
@Schema(description = "学科类型字典名称(逗号分隔)")
private String disciplineDictName;
} }

View File

@@ -81,8 +81,8 @@ public class FileDictTagQueryServiceImpl implements IFileDictTagQueryService {
(v1, v2) -> v1 (v1, v2) -> v1
)); ));
// 3) fileId -> (dictClass -> Set<dictValue>) // 3) fileId -> (dictClass -> 聚合数据:Set<dictValue> + Set<dictName>)
Map<Long, Map<String, LinkedHashSet<String>>> agg = new HashMap<>(); Map<Long, Map<String, DictAggData>> agg = new HashMap<>();
for (FileTagRel rel : fileTagRels) { for (FileTagRel rel : fileTagRels) {
if (rel == null || rel.getFileId() == null || rel.getTagId() == null) { if (rel == null || rel.getFileId() == null || rel.getTagId() == null) {
continue; continue;
@@ -94,9 +94,13 @@ public class FileDictTagQueryServiceImpl implements IFileDictTagQueryService {
if (!FileDictTagEnum.isConfigured(dict.dictClass)) { if (!FileDictTagEnum.isConfigured(dict.dictClass)) {
continue; continue;
} }
agg.computeIfAbsent(rel.getFileId(), k -> new HashMap<>()) DictAggData data = agg
.computeIfAbsent(dict.dictClass, k -> new LinkedHashSet<>()) .computeIfAbsent(rel.getFileId(), k -> new HashMap<>())
.add(dict.dictValue); .computeIfAbsent(dict.dictClass, k -> new DictAggData());
data.getDictValues().add(dict.dictValue);
if (dict.dictName != null) {
data.getDictNames().add(dict.dictName);
}
} }
if (agg.isEmpty()) { if (agg.isEmpty()) {
@@ -105,9 +109,9 @@ public class FileDictTagQueryServiceImpl implements IFileDictTagQueryService {
// 4) 转为 DTO目前只输出枚举配置的两类字段 // 4) 转为 DTO目前只输出枚举配置的两类字段
Map<Long, FileDictTagsAggDTO> result = new HashMap<>(); Map<Long, FileDictTagsAggDTO> result = new HashMap<>();
for (Map.Entry<Long, Map<String, LinkedHashSet<String>>> e : agg.entrySet()) { for (Map.Entry<Long, Map<String, DictAggData>> e : agg.entrySet()) {
Long fileId = e.getKey(); Long fileId = e.getKey();
Map<String, LinkedHashSet<String>> classMap = e.getValue(); Map<String, DictAggData> classMap = e.getValue();
if (classMap == null || classMap.isEmpty()) { if (classMap == null || classMap.isEmpty()) {
continue; continue;
} }
@@ -115,9 +119,16 @@ public class FileDictTagQueryServiceImpl implements IFileDictTagQueryService {
FileDictTagsAggDTO dto = new FileDictTagsAggDTO(); FileDictTagsAggDTO dto = new FileDictTagsAggDTO();
dto.setFileId(fileId); dto.setFileId(fileId);
for (Map.Entry<String, LinkedHashSet<String>> classEntry : classMap.entrySet()) { for (Map.Entry<String, DictAggData> classEntry : classMap.entrySet()) {
String dictClass = classEntry.getKey(); String dictClass = classEntry.getKey();
String dictValues = String.join(",", classEntry.getValue()); DictAggData data = classEntry.getValue();
if (data == null || data.getDictValues().isEmpty()) {
continue;
}
String dictValues = String.join(",", data.getDictValues());
String dictNames = data.getDictNames().isEmpty()
? null
: String.join(",", data.getDictNames());
FileDictTagEnum tagEnum = FileDictTagEnum.getByDictClass(dictClass); FileDictTagEnum tagEnum = FileDictTagEnum.getByDictClass(dictClass);
if (tagEnum == null) { if (tagEnum == null) {
continue; continue;
@@ -125,9 +136,11 @@ public class FileDictTagQueryServiceImpl implements IFileDictTagQueryService {
if (tagEnum == FileDictTagEnum.FILE_TYPE) { if (tagEnum == FileDictTagEnum.FILE_TYPE) {
dto.setFileTypeDictClass(tagEnum.getDictClass()); dto.setFileTypeDictClass(tagEnum.getDictClass());
dto.setFileTypeDictValue(dictValues); dto.setFileTypeDictValue(dictValues);
dto.setFileTypeDictName(dictNames);
} else if (tagEnum == FileDictTagEnum.DISCIPLINE_TYPE) { } else if (tagEnum == FileDictTagEnum.DISCIPLINE_TYPE) {
dto.setDisciplineTypeDictClass(tagEnum.getDictClass()); dto.setDisciplineTypeDictClass(tagEnum.getDictClass());
dto.setDisciplineDictValue(dictValues); dto.setDisciplineDictValue(dictValues);
dto.setDisciplineDictName(dictNames);
} }
} }
result.put(fileId, dto); result.put(fileId, dto);
@@ -170,21 +183,31 @@ public class FileDictTagQueryServiceImpl implements IFileDictTagQueryService {
} }
for (FileDictTagEnum tagEnum : FileDictTagEnum.values()) { for (FileDictTagEnum tagEnum : FileDictTagEnum.values()) {
String dictValues = getDictValuesByEnum(tags, tagEnum); String dictValues = getDictValuesByEnum(tags, tagEnum);
if (dictValues == null) { String dictNames = getDictNamesByEnum(tags, tagEnum);
if (dictValues == null && dictNames == null) {
continue; continue;
} }
String dictClass = tagEnum.getDictClass(); String dictClass = tagEnum.getDictClass();
String dictClassFieldName = tagEnum.getDictClassFieldName(); String dictClassFieldName = tagEnum.getDictClassFieldName();
String dictValueFieldName = tagEnum.getDictValueFieldName(); String dictValueFieldName = tagEnum.getDictValueFieldName();
String dictNameFieldName = tagEnum.getDictNameFieldName();
try { try {
// setXxxDictClass // setXxxDictClass
String classSetterName = "set" + Character.toUpperCase(dictClassFieldName.charAt(0)) + dictClassFieldName.substring(1); String classSetterName = "set" + Character.toUpperCase(dictClassFieldName.charAt(0)) + dictClassFieldName.substring(1);
resp.getClass().getMethod(classSetterName, String.class) resp.getClass().getMethod(classSetterName, String.class)
.invoke(resp, dictClass); .invoke(resp, dictClass);
// setXxxDictValue // setXxxDictValue
String valueSetterName = "set" + Character.toUpperCase(dictValueFieldName.charAt(0)) + dictValueFieldName.substring(1); if (dictValues != null) {
resp.getClass().getMethod(valueSetterName, String.class) String valueSetterName = "set" + Character.toUpperCase(dictValueFieldName.charAt(0)) + dictValueFieldName.substring(1);
.invoke(resp, dictValues); resp.getClass().getMethod(valueSetterName, String.class)
.invoke(resp, dictValues);
}
// setXxxDictName如果存在
if (dictNames != null) {
String nameSetterName = "set" + Character.toUpperCase(dictNameFieldName.charAt(0)) + dictNameFieldName.substring(1);
resp.getClass().getMethod(nameSetterName, String.class)
.invoke(resp, dictNames);
}
} catch (Exception e) { } catch (Exception e) {
log.warn("填充文件标签信息失败, fileId: {}, respClass: {}, dictClass: {}, error: {}", log.warn("填充文件标签信息失败, fileId: {}, respClass: {}, dictClass: {}, error: {}",
fileId, resp.getClass().getName(), dictClass, e.getMessage()); fileId, resp.getClass().getName(), dictClass, e.getMessage());
@@ -207,4 +230,35 @@ public class FileDictTagQueryServiceImpl implements IFileDictTagQueryService {
} }
return null; return null;
} }
/**
* 根据枚举类型,从聚合结果中取出对应的字典名称
*/
private String getDictNamesByEnum(FileDictTagsAggDTO tags, FileDictTagEnum tagEnum) {
if (tags == null || tagEnum == null) {
return null;
}
if (tagEnum == FileDictTagEnum.FILE_TYPE) {
return tags.getFileTypeDictName();
} else if (tagEnum == FileDictTagEnum.DISCIPLINE_TYPE) {
return tags.getDisciplineDictName();
}
return null;
}
/**
* 内部聚合数据结构:同时持有 dictValue 和 dictName 的去重集合
*/
private static class DictAggData {
private final LinkedHashSet<String> dictValues = new LinkedHashSet<>();
private final LinkedHashSet<String> dictNames = new LinkedHashSet<>();
public LinkedHashSet<String> getDictValues() {
return dictValues;
}
public LinkedHashSet<String> getDictNames() {
return dictNames;
}
}
} }