diff --git a/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/institution/EvalProcessControlExecutor.java b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/institution/EvalProcessControlExecutor.java index aa27e06..632f9dd 100644 --- a/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/institution/EvalProcessControlExecutor.java +++ b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/institution/EvalProcessControlExecutor.java @@ -502,15 +502,21 @@ public class EvalProcessControlExecutor implements EvalProcessControlApi { */ private void upsertArchivedProjectDocs(Long projectId, EvalProjectEntity project) { List files = listProjectFiles(projectId).getData(); - List archivedItems = CollectionUtils.isEmpty(files) - ? new ArrayList<>() - : files.stream().map(f -> { - EvalProjectDocMaterialItemCO item = new EvalProjectDocMaterialItemCO(); - item.setMaterialName(f.getMaterialName()); - item.setProjectDocUrl(f.getProjectDocUrl()); - item.setMaterialType(MaterialCategory.ARCHIVED.getVal()); - return item; - }).collect(Collectors.toList()); + // 将每个文件 projectDocUrl 中的 JSON 数组扁平化:数组内每个文件对象拆分为独立的资料条目 + List archivedItems = new ArrayList<>(); + if (!CollectionUtils.isEmpty(files)) { + for (EvalProjectFileCO f : files) { + List urlObjects = parseFileUrlObjects(f.getProjectDocUrl()); + for (JSONObject obj : urlObjects) { + EvalProjectDocMaterialItemCO item = new EvalProjectDocMaterialItemCO(); + String name = obj.getStr("name"); + item.setMaterialName(StringUtils.hasText(name) ? name : f.getMaterialName()); + item.setProjectDocUrl(obj.getStr("url")); + item.setMaterialType(MaterialCategory.ARCHIVED.getVal()); + archivedItems.add(item); + } + } + } EvalProjectDocDO docDO = evalProjectDocMapper.selectOne(new LambdaQueryWrapper() .select(EvalProjectDocDO::getId, EvalProjectDocDO::getProjectDocUrl) @@ -547,6 +553,27 @@ public class EvalProcessControlExecutor implements EvalProcessControlApi { } } + /** + * 将文件 projectDocUrl(JSON 数组字符串,如 [{"url":"...","name":"..."}])解析为对象列表。 + * 非数组、解析失败或为空时返回空列表。 + */ + private List parseFileUrlObjects(String projectDocUrl) { + List result = new ArrayList<>(); + if (!StringUtils.hasText(projectDocUrl)) { + return result; + } + try { + JSONArray array = JSONUtil.parseArray(projectDocUrl); + for (Object obj : array) { + if (obj instanceof JSONObject) { + result.add((JSONObject) obj); + } + } + } catch (Exception ignored) { + } + return result; + } + /** * 验证项目所有签字任务是否已完成(taskStatusCode=2 已签)。 * 无签字任务或存在未完成/未作废的任务均视为未完成。