diff --git a/.idea/compiler.xml b/.idea/compiler.xml
index 21f512b4..097422c2 100644
--- a/.idea/compiler.xml
+++ b/.idea/compiler.xml
@@ -24,10 +24,10 @@
-
-
-
-
+
+
+
+
diff --git a/common/src/main/java/com/sdm/common/utils/DictTagHelper.java b/common/src/main/java/com/sdm/common/utils/DictTagHelper.java
index 6834d80f..cf06b020 100644
--- a/common/src/main/java/com/sdm/common/utils/DictTagHelper.java
+++ b/common/src/main/java/com/sdm/common/utils/DictTagHelper.java
@@ -25,9 +25,28 @@ public class DictTagHelper {
@Resource
private ISysConfigFeignClient sysConfigFeignClient;
+
+
+ /**
+ * 从对象中提取字典标签并查询,同时将结果缓存到对象的dictTagIdsCache字段
+ *
+ * @param obj 包含dictTags和dictTagIdsCache字段的对象
+ * @return Map>
+ */
+ public Map> queryAndCacheDictTagIds(Object obj) {
+ Map> result = queryDictTagIds(obj);
+
+ // 将结果缓存到对象的dictTagIdsCache字段
+ if (!result.isEmpty()) {
+ setDictTagIdsCache(obj, result);
+ }
+
+ return result;
+ }
+
/**
* 从对象中提取字典标签并查询对应的字典ID
- *
+ *
* @param obj 包含dictTags字段的对象
* @return Map>,查询失败或无数据返回空Map
*/
@@ -52,22 +71,6 @@ public class DictTagHelper {
return queryDictIds(tagReqList);
}
- /**
- * 从对象中提取字典标签并查询,同时将结果缓存到对象的dictTagIdsCache字段
- *
- * @param obj 包含dictTags和dictTagIdsCache字段的对象
- * @return Map>
- */
- public Map> queryAndCacheDictTagIds(Object obj) {
- Map> result = queryDictTagIds(obj);
-
- // 将结果缓存到对象的dictTagIdsCache字段
- if (!result.isEmpty()) {
- setDictTagIdsCache(obj, result);
- }
-
- return result;
- }
/**
* 从对象获取dictTags字段值
diff --git a/data/src/main/java/com/sdm/data/service/impl/FileDictTagQueryServiceImpl.java b/data/src/main/java/com/sdm/data/service/impl/FileDictTagQueryServiceImpl.java
index b9a63558..abda5185 100644
--- a/data/src/main/java/com/sdm/data/service/impl/FileDictTagQueryServiceImpl.java
+++ b/data/src/main/java/com/sdm/data/service/impl/FileDictTagQueryServiceImpl.java
@@ -32,6 +32,75 @@ public class FileDictTagQueryServiceImpl implements IFileDictTagQueryService {
private final IFileTagRelService fileTagRelService;
private final ISysConfigFeignClient sysConfigFeignClient;
+
+
+ @Override
+ public void fillFileTagsForRespList(List respList, Function idGetter) {
+ if (CollectionUtils.isEmpty(respList)) {
+ return;
+ }
+
+ // 收集文件ID
+ List fileIds = respList.stream()
+ .map(idGetter)
+ .filter(Objects::nonNull)
+ .distinct()
+ .toList();
+ if (CollectionUtils.isEmpty(fileIds)) {
+ return;
+ }
+
+ // 查询聚合标签
+ Map fileIdToTagsMap = queryByFileIds(fileIds);
+ if (MapUtils.isEmpty(fileIdToTagsMap)) {
+ return;
+ }
+
+ // 通过反射,将标签字段填充到 Resp 对象中(基于 FileDictTagEnum 的配置)
+ for (T resp : respList) {
+ Long fileId = idGetter.apply(resp);
+ if (fileId == null) {
+ continue;
+ }
+ FileDictTagsAggDTO tags = fileIdToTagsMap.get(fileId);
+ if (tags == null) {
+ continue;
+ }
+ for (FileDictTagEnum tagEnum : FileDictTagEnum.values()) {
+ String dictValues = getDictValuesByEnum(tags, tagEnum);
+ String dictNames = getDictNamesByEnum(tags, tagEnum);
+ if (dictValues == null && dictNames == null) {
+ continue;
+ }
+ String dictClass = tagEnum.getDictClass();
+ String dictClassFieldName = tagEnum.getDictClassFieldName();
+ String dictValueFieldName = tagEnum.getDictValueFieldName();
+ String dictNameFieldName = tagEnum.getDictNameFieldName();
+ try {
+ // setXxxDictClass
+ String classSetterName = "set" + Character.toUpperCase(dictClassFieldName.charAt(0)) + dictClassFieldName.substring(1);
+ resp.getClass().getMethod(classSetterName, String.class)
+ .invoke(resp, dictClass);
+ // setXxxDictValue
+ if (dictValues != null) {
+ String valueSetterName = "set" + Character.toUpperCase(dictValueFieldName.charAt(0)) + dictValueFieldName.substring(1);
+ 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) {
+ log.warn("填充文件标签信息失败, fileId: {}, respClass: {}, dictClass: {}, error: {}",
+ fileId, resp.getClass().getName(), dictClass, e.getMessage());
+ }
+ }
+ }
+ }
+
private Map queryByFileIds(List fileIds) {
if (CollectionUtils.isEmpty(fileIds)) {
return Collections.emptyMap();
@@ -149,73 +218,6 @@ public class FileDictTagQueryServiceImpl implements IFileDictTagQueryService {
return result;
}
- @Override
- public void fillFileTagsForRespList(List respList, Function idGetter) {
- if (CollectionUtils.isEmpty(respList)) {
- return;
- }
-
- // 收集文件ID
- List fileIds = respList.stream()
- .map(idGetter)
- .filter(Objects::nonNull)
- .distinct()
- .toList();
- if (CollectionUtils.isEmpty(fileIds)) {
- return;
- }
-
- // 查询聚合标签
- Map fileIdToTagsMap = queryByFileIds(fileIds);
- if (MapUtils.isEmpty(fileIdToTagsMap)) {
- return;
- }
-
- // 通过反射,将标签字段填充到 Resp 对象中(基于 FileDictTagEnum 的配置)
- for (T resp : respList) {
- Long fileId = idGetter.apply(resp);
- if (fileId == null) {
- continue;
- }
- FileDictTagsAggDTO tags = fileIdToTagsMap.get(fileId);
- if (tags == null) {
- continue;
- }
- for (FileDictTagEnum tagEnum : FileDictTagEnum.values()) {
- String dictValues = getDictValuesByEnum(tags, tagEnum);
- String dictNames = getDictNamesByEnum(tags, tagEnum);
- if (dictValues == null && dictNames == null) {
- continue;
- }
- String dictClass = tagEnum.getDictClass();
- String dictClassFieldName = tagEnum.getDictClassFieldName();
- String dictValueFieldName = tagEnum.getDictValueFieldName();
- String dictNameFieldName = tagEnum.getDictNameFieldName();
- try {
- // setXxxDictClass
- String classSetterName = "set" + Character.toUpperCase(dictClassFieldName.charAt(0)) + dictClassFieldName.substring(1);
- resp.getClass().getMethod(classSetterName, String.class)
- .invoke(resp, dictClass);
- // setXxxDictValue
- if (dictValues != null) {
- String valueSetterName = "set" + Character.toUpperCase(dictValueFieldName.charAt(0)) + dictValueFieldName.substring(1);
- 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) {
- log.warn("填充文件标签信息失败, fileId: {}, respClass: {}, dictClass: {}, error: {}",
- fileId, resp.getClass().getName(), dictClass, e.getMessage());
- }
- }
- }
- }
-
/**
* 根据枚举类型,从聚合结果中取出对应的字典值
*/
diff --git a/data/src/main/java/com/sdm/data/service/impl/MinioFileIDataFileServiceImpl.java b/data/src/main/java/com/sdm/data/service/impl/MinioFileIDataFileServiceImpl.java
index d498095b..5f65c93f 100644
--- a/data/src/main/java/com/sdm/data/service/impl/MinioFileIDataFileServiceImpl.java
+++ b/data/src/main/java/com/sdm/data/service/impl/MinioFileIDataFileServiceImpl.java
@@ -2443,6 +2443,27 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService {
}
}
+ // 如果未传递新的字典标签,则从原有文件获取并填充
+ if (CollectionUtils.isEmpty(req.getDictTags())) {
+ fileDictTagQueryService.fillFileTagsForRespList(List.of(req), UpdateFileReq::getId);
+
+ // 如果成功填充了标签值,则设置 dictTags 列表,以便 dictTagHelper 能够识别
+ List dictTags = buildDictTagsFromEnum(req);
+
+ if (!dictTags.isEmpty()) {
+ req.setDictTags(dictTags);
+ // 强制刷新缓存,确保后续逻辑能获取到ID
+ // 保存标签缓存到 tempFileMetadataInfo(如果有)
+ if (CollectionUtils.isNotEmpty(req.getDictTags())) {
+ Map> dictIdMap = req.getDictTagIdsCache();
+ if (dictIdMap == null || dictIdMap.isEmpty()) {
+ dictIdMap = dictTagHelper.queryAndCacheDictTagIds(req);
+ }
+ req.setDictTagIdsCache(dictIdMap);
+ }
+ }
+ }
+
FileMetadataInfo fileMetadataInfo = fileMetadataInfoService.lambdaQuery().eq(FileMetadataInfo::getId, req.getId()).one();
if (fileMetadataInfo == null) {
return SdmResponse.failed("文件不存在");
@@ -2480,7 +2501,7 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService {
tempFileMetadataInfo.setDictTagIdsCache(dictIdMap);
}
-
+
fileMetadataInfo.setTempMetadata(JSONObject.toJSONString(tempFileMetadataInfo));
fileMetadataInfo.setUpdateTime(LocalDateTime.now());
fileMetadataInfo.setUpdaterId(ThreadLocalContext.getUserId());
@@ -2581,6 +2602,9 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService {
FileMetadataInfo newFileInfo = createFileMetadata(newFileMinioObjectKey, req.getFileName(),
req.getProjectId(), req.getAnalysisDirectionId(), req.getRemarks(), oldFileMetadataInfo.getParentId(), req.getFile().getSize()
);
+ newFileInfo.setRemarks(oldFileMetadataInfo.getRemarks());
+ newFileInfo.setProjectId(oldFileMetadataInfo.getProjectId());
+ newFileInfo.setAnalysisDirectionName(oldFileMetadataInfo.getAnalysisDirectionName());
newFileInfo.setFileGroupId(fileGroupId);
newFileInfo.setVersionNo(versionNo + 1);
@@ -2690,6 +2714,35 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService {
}
}
+ private List buildDictTagsFromEnum(UpdateFileReq req) {
+ List dictTags = new ArrayList<>();
+ for (FileDictTagEnum tagEnum : FileDictTagEnum.values()) {
+ String classFieldName = tagEnum.getDictClassFieldName();
+ String valueFieldName = tagEnum.getDictValueFieldName();
+
+ String classValue = getFieldValue(req, classFieldName);
+ String valueValue = getFieldValue(req, valueFieldName);
+
+ if (StringUtils.hasText(classValue) && StringUtils.hasText(valueValue)) {
+ dictTags.add(classFieldName);
+ dictTags.add(valueFieldName);
+ }
+ }
+ return dictTags;
+ }
+
+ private String getFieldValue(Object obj, String fieldName) {
+ try {
+ Field field = obj.getClass().getDeclaredField(fieldName);
+ field.setAccessible(true);
+ Object value = field.get(obj);
+ return value != null ? value.toString() : null;
+ } catch (Exception e) {
+ log.warn("Failed to get field value for {}", fieldName);
+ return null;
+ }
+ }
+
@Override
@Transactional(rollbackFor = Exception.class)
public SdmResponse uploadAvatar(MultipartFile avatar) {
@@ -3535,6 +3588,9 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService {
fileSimulationMappingService.lambdaUpdate()
.in(FileSimulationMapping::getFileId, failBusinessIds)
.remove();
+
+ // 6. 删除文件标签关系表
+ fileTagRelService.lambdaUpdate().in(FileTagRel::getFileId, failBusinessIds).remove();
return true;
} catch (Exception e) {
CoreLogger.error("handleFailFiles error:{}", e.getMessage());
@@ -4712,7 +4768,7 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService {
metadata.setUpdateTime(LocalDateTime.now());
fileMetadataInfoService.updateById(metadata);
- // 6. 如果是文件,更新 Storage fullPath
+ // 6. 如果是文件,更新 fileStorage
if (Objects.equals(metadata.getDataType(), DataTypeEnum.FILE.getValue())) {
fileStorageService.lambdaUpdate()
.eq(FileStorage::getFileId, metadata.getId())