diff --git a/src/main/java/io/v/nutz/zhgh/qsv/service/impl/QsvSurveyServiceImpl.java b/src/main/java/io/v/nutz/zhgh/qsv/service/impl/QsvSurveyServiceImpl.java index 5ec9e60..c4ca13b 100644 --- a/src/main/java/io/v/nutz/zhgh/qsv/service/impl/QsvSurveyServiceImpl.java +++ b/src/main/java/io/v/nutz/zhgh/qsv/service/impl/QsvSurveyServiceImpl.java @@ -239,29 +239,9 @@ public class QsvSurveyServiceImpl extends BaseServiceImpl i // 构建Excel导出实体 List excelExportEntities = buildExcelExportEntities(subjects); // 构建答题记录列表 - List list = answerRecords.stream().map(record -> { - NutMap map = NutMap.NEW() - .addv("id", record.getString("id")) - .addv("loginName", record.getString("loginName")) - .addv("userName", record.getString("userName")) - .addv("unitName", record.getString("unitName")) - .addv("unionName", record.getString("unionName")); - JSONObject extJson = record.getAs("extJson", JSONObject.class); - extJson.forEach((k, v) -> { - JSONObject jsonVal = (JSONObject) v; - - String type = subjectMap.get(k).getType(); - if (type.equals("text")) { - map.addv(k, jsonVal.getStr("text")); - } else if (type.equals("radio") || type.equals("checkbox")) { - JSONArray optionIds = jsonVal.getJSONArray("optionIds"); - String selectOptionTexts = options.stream().filter(option -> optionIds.contains(option.getId())) - .map(QsvOption::getText).collect(Collectors.joining(";")); - map.addv(k, selectOptionTexts); - } - }); - return map; - }).toList(); + List list = answerRecords.stream() + .map(record -> buildAnswerRecordMap(record, subjectMap, options)) + .toList(); pagination.setList(list); @@ -312,28 +292,60 @@ public class QsvSurveyServiceImpl extends BaseServiceImpl i } private List buildAnswerRecords(List answerRecords, Map subjectMap, List options) { - return answerRecords.stream().map(record -> { - NutMap map = NutMap.NEW() - .addv("id", record.getId()) - .addv("loginName", record.getLoginName()) - .addv("userName", record.getUserName()) - .addv("unitName", record.getUnitName()) - .addv("unionName", record.getUnionName()); - JSONObject extJson = record.getExtJson(); - extJson.forEach((k, v) -> { - JSONObject jsonVal = (JSONObject) v; + return answerRecords.stream() + .map(record -> buildAnswerRecordMap(record, subjectMap, options)) + .collect(Collectors.toList()); + } - String type = subjectMap.get(k).getType(); - if (type.equals("text")) { - map.addv(k, jsonVal.getStr("text")); - } else if (type.equals("radio") || type.equals("checkbox")) { - JSONArray optionIds = jsonVal.getJSONArray("optionIds"); - String selectOptionTexts = options.stream().filter(option -> optionIds.contains(option.getId())) - .map(QsvOption::getText).collect(Collectors.joining(";")); - map.addv(k, selectOptionTexts); + private NutMap buildAnswerRecordMap(NutMap record, Map subjectMap, List options) { + NutMap map = NutMap.NEW() + .addv("id", record.getString("id")) + .addv("loginName", record.getString("loginName")) + .addv("userName", record.getString("userName")) + .addv("unitName", record.getString("unitName")) + .addv("unionName", record.getString("unionName")); + fillSubjectAnswers(map, record.getAs("extJson", JSONObject.class), subjectMap, options); + return map; + } + + private NutMap buildAnswerRecordMap(QsvUserAnswerRecord record, Map subjectMap, List options) { + NutMap map = NutMap.NEW() + .addv("id", record.getId()) + .addv("loginName", record.getLoginName()) + .addv("userName", record.getUserName()) + .addv("unitName", record.getUnitName()) + .addv("unionName", record.getUnionName()); + fillSubjectAnswers(map, record.getExtJson(), subjectMap, options); + return map; + } + + private void fillSubjectAnswers(NutMap map, JSONObject extJson, Map subjectMap, List options) { + if (extJson == null) { + return; + } + extJson.forEach((k, v) -> { + QsvSubject subject = subjectMap.get(k); + JSONObject jsonVal = extJson.get(k, JSONObject.class); + // 兼容历史答卷中保留了已删除题目或异常答案结构的情况,避免导出时中断。 + if (subject == null || jsonVal == null) { + return; + } + + String type = subject.getType(); + if ("text".equals(type)) { + map.addv(k, jsonVal.getStr("text")); + } else if ("radio".equals(type) || "checkbox".equals(type)) { + JSONArray optionIds = jsonVal.getJSONArray("optionIds"); + if (optionIds == null) { + map.addv(k, ""); + return; } - }); - return map; - }).collect(Collectors.toList()); + String selectOptionTexts = options.stream() + .filter(option -> optionIds.contains(option.getId())) + .map(QsvOption::getText) + .collect(Collectors.joining(";")); + map.addv(k, selectOptionTexts); + } + }); } }