fix: 【FCJDFDXTXS-199】资源学习情况的作业、考试的导出查询、拼excel数据逻辑修正

This commit is contained in:
liu.zixi
2025-12-19 10:34:12 +08:00
parent 27b0bd2749
commit fa3f625183
3 changed files with 92 additions and 21 deletions

View File

@@ -1463,7 +1463,8 @@ public class StudyCourseApi extends ApiBaseController{
// 查询特定考试信息(这里同一个学员,同一次考试可以导出多次考试信息)
List<StudyExam> studyExams = studyExamService.getByCourseIdAndContentId(courseId, contentId);
// 通过studyExams中的人员id集合(去重),调用用户中心接口获取人员信息,填充部门字段
Set<String> userIds = studyExams.stream().map(StudyExam::getStudentId).filter(Objects::nonNull).collect(Collectors.toSet());
List<StudyCourseItem> studyCourseItems = studyService.itemList(courseId, contentId, null, null);
Set<String> userIds = studyCourseItems.stream().map(StudyCourseItem::getAid).filter(Objects::nonNull).collect(Collectors.toSet());
List<UserSimpleVo> userList = new ArrayList<>();
if (!userIds.isEmpty()) {
// 调用用户中心接口
@@ -1494,17 +1495,17 @@ public class StudyCourseApi extends ApiBaseController{
}
// 将考试信息与用户信息拼接为map
String finalContentName = displayName;
List<Map<String, Object>> dataList = studyExams.stream().map(exam -> {
List<Map<String, Object>> dataList = studyCourseItems.stream().map(item -> {
Map<String, Object> map = new HashMap<>();
// 拼接基本信息
map.put("课程名称", courseName);
map.put("资源名称", finalContentName);
map.put("姓名", exam.getStudentName());
map.put("姓名", item.getAname());
// 工号和部门信息需要从用户信息中获取
String userNo = "";
String orgInfo = "";
for (UserSimpleVo user : userList) {
if (exam.getStudentId().equals(user.getAid())) {
if (item.getAid().equals(user.getAid())) {
userNo = user.getCode();
orgInfo = user.getOrgInfo();
break;
@@ -1512,17 +1513,28 @@ public class StudyCourseApi extends ApiBaseController{
}
map.put("工号", userNo);
map.put("部门", orgInfo);
// 考试状态需要转换(根据成绩和及格线判断)
String examStatus = "";
if (exam.getScore() != null && exam.getPassLine() != null) {
examStatus = exam.getScore() >= exam.getPassLine() ? "已通过" : "未通过";
// 获取考试数据
Optional<StudyExam> studyExamOpt = studyExams.stream()
.filter(exam -> StringUtils.equals(item.getAid(), exam.getStudentId()))
.findFirst();
if (studyExamOpt.isPresent()) {
StudyExam exam = studyExamOpt.get();
// 考试状态需要转换(根据成绩和及格线判断)
String examStatus = "";
if (exam.getScore() != null && exam.getPassLine() != null) {
examStatus = exam.getScore() >= exam.getPassLine() ? "已通过" : "未通过";
}
map.put("考试状态", examStatus);
// 考试成绩
// 25.12.16修改:考试成绩修改为整数
map.put("考试成绩", exam.getScore() != null ? Math.round(exam.getScore()) : null);
// 完成时间
map.put("完成时间", exam.getEndTime());
} else {
map.put("考试状态", "未通过");
map.put("考试成绩", "");
map.put("完成时间", "");
}
map.put("考试状态", examStatus);
// 考试成绩
// 25.12.16修改:考试成绩修改为整数
map.put("考试成绩", exam.getScore() != null ? Math.round(exam.getScore()) : null);
// 完成时间
map.put("完成时间", exam.getEndTime());
return map;
}).collect(Collectors.toList());
// 4.拼接消息类型和响应头信息
@@ -1610,7 +1622,8 @@ public class StudyCourseApi extends ApiBaseController{
// 查询特定作业信息
List<StudyHomeWork> studyHomeWorks = studyHomeWorkService.getByCourseIdAndContentId(courseId, contentId);
// 查询资源学习item数据联表获取作业完成状态用
List<StudyCourseItem> studyCourseItems = studyService.getList(courseId, contentId, null, null);
// List<StudyCourseItem> studyCourseItems = studyService.getList(courseId, contentId, null, null);
List<StudyCourseItem> studyCourseItems = studyService.itemList(courseId, contentId, null, null);
if (studyHomeWorks != null && !studyHomeWorks.isEmpty()) {
for (StudyHomeWork studyHomeWork : studyHomeWorks) {
// 根据studyCourseItem表的id连接studyHomework表的studyItemId获取作业完成状态
@@ -1618,7 +1631,7 @@ public class StudyCourseApi extends ApiBaseController{
}
}
// 通过studyHomeWorks中的人员id集合(去重),调用用户中心接口获取人员信息,填充部门字段
Set<String> userIds = studyHomeWorks.stream().map(StudyHomeWork::getStudentId).filter(Objects::nonNull).collect(Collectors.toSet());
Set<String> userIds = studyCourseItems.stream().map(StudyCourseItem::getAid).filter(Objects::nonNull).collect(Collectors.toSet());
List<UserSimpleVo> userList = new ArrayList<>();
if (!userIds.isEmpty()) {
// 调用用户中心接口
@@ -1649,17 +1662,43 @@ public class StudyCourseApi extends ApiBaseController{
}
// 3.将作业信息与用户信息拼接为map
String finalContentName = displayName;
List<Map<String, Object>> dataList = studyHomeWorks.stream().map(hw -> {
// List<Map<String, Object>> dataList = studyHomeWorks.stream().map(hw -> {
// Map<String, Object> map = new HashMap<>();
// // 拼接基本信息
// map.put("课程名称", courseName);
// map.put("资源名称", finalContentName);
// map.put("姓名", hw.getStudentName());
// // 工号和部门信息需要从用户信息中获取
// String userNo = "";
// String orgInfo = "";
// for (UserSimpleVo user : userList) {
// if (hw.getStudentId().equals(user.getAid())) {
// userNo = user.getCode();
// orgInfo = user.getOrgInfo();
// break;
// }
// }
// map.put("工号", userNo);
// map.put("部门", orgInfo);
// // 作业状态(如果有成绩则为已完成,否则为未完成)
// String hwStatus = (hw.getStatus() == 9) ? "已完成" : "未完成";
// map.put("完成状态", hwStatus);
// // 作业内容
// // 25.12.16确认经过生产数据确认作业内容存储在hwAnswer字段
// map.put("作业内容", hw.getHwAnswer());
// return map;
// }).collect(Collectors.toList());
List<Map<String, Object>> dataList = studyCourseItems.stream().map(item -> {
Map<String, Object> map = new HashMap<>();
// 拼接基本信息
map.put("课程名称", courseName);
map.put("资源名称", finalContentName);
map.put("姓名", hw.getStudentName());
map.put("姓名", item.getAname());
// 工号和部门信息需要从用户信息中获取
String userNo = "";
String orgInfo = "";
for (UserSimpleVo user : userList) {
if (hw.getStudentId().equals(user.getAid())) {
if (item.getAid().equals(user.getAid())) {
userNo = user.getCode();
orgInfo = user.getOrgInfo();
break;
@@ -1668,11 +1707,16 @@ public class StudyCourseApi extends ApiBaseController{
map.put("工号", userNo);
map.put("部门", orgInfo);
// 作业状态(如果有成绩则为已完成,否则为未完成)
String hwStatus = (hw.getStatus() == 9) ? "已完成" : "未完成";
String hwStatus = (item.getStatus() == 9) ? "已完成" : "未完成";
map.put("完成状态", hwStatus);
// 作业内容
// 25.12.16确认经过生产数据确认作业内容存储在hwAnswer字段
map.put("作业内容", hw.getHwAnswer());
// 从studyHomework中取
map.put("作业内容", "");
studyHomeWorks.stream()
.filter(hw -> item.getId().equals(hw.getStudyItemId()))
.findFirst()
.ifPresent(hw -> map.put("作业内容", hw.getHwAnswer()));
return map;
}).collect(Collectors.toList());
// 先将Excel数据写入临时文件

View File

@@ -114,6 +114,16 @@ public interface IStudyService {
*/
PageList<StudyCourseItem> itemPage(int pageIndex, int pageSize, String contentId, String courseId, Integer status, List<String> userIdList);
/**
* 获取资源学习情况列表
* @param contentId
* @param courseId
* @param status
* @param userIdList
* @return
*/
List<StudyCourseItem> itemList(String contentId, String courseId, Integer status, List<String> userIdList);
/**
* 为courseContents列表设置展示名称章名+节名 或 课程名+节名)
* 25.12.15新增

View File

@@ -393,6 +393,23 @@ public class StudyServiceImpl implements IStudyService{
return result;
}
@Override
public List<StudyCourseItem> itemList(String contentId, String courseId, Integer status, List<String> userIdList) {
List<StudyCourseItem> list = scItemDao.queryList(courseId, contentId, userIdList, status, false, 0, 0);
List<String> contentIds = list.stream().map(StudyCourseItem::getContentId).filter(Objects::nonNull).distinct().collect(Collectors.toList());
if (!contentIds.isEmpty()) {
List<CourseContent> contentList = courseContentService.getByIds(contentIds);
if (contentList != null) {
setContentDisplayName(contentList);
// 根据contentId将展示名称映射到item
for (StudyCourseItem studyCourseItem : list) {
studyCourseItem.setDisplayName(contentList.stream().filter(content -> content.getId().equals(studyCourseItem.getContentId())).findFirst().map(CourseContent::getDisplayName).orElse(null));
}
}
}
return list;
}
/**
* 为 CourseContent 列表设置展示名称(章名+节名 或 课程名+节名)
* 基于 25.12.15 的展示逻辑:优先使用 章名+节名,章不存在则退化为 课程名+节名