diff --git a/.gitignore b/.gitignore index 42b4f65a..516318e0 100644 --- a/.gitignore +++ b/.gitignore @@ -48,3 +48,4 @@ nbdist/ !*/build/*.xml *.pid +doc/ diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/excel/ExportsExcelSenderUtil.java b/servers/boe-server-all/src/main/java/com/xboe/module/excel/ExportsExcelSenderUtil.java index a03e1c74..aadeec49 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/excel/ExportsExcelSenderUtil.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/excel/ExportsExcelSenderUtil.java @@ -1,31 +1,21 @@ package com.xboe.module.excel; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.apache.poi.hssf.usermodel.*; +import org.apache.poi.ss.usermodel.BorderStyle; +import org.apache.poi.ss.usermodel.HorizontalAlignment; +import org.apache.poi.ss.usermodel.VerticalAlignment; +import org.springframework.stereotype.Component; + import java.io.IOException; import java.io.OutputStream; import java.lang.reflect.Field; import java.text.SimpleDateFormat; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; -import java.util.Collection; -import java.util.Date; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.apache.poi.hssf.usermodel.HSSFCell; -import org.apache.poi.hssf.usermodel.HSSFCellStyle; -import org.apache.poi.hssf.usermodel.HSSFFont; -import org.apache.poi.hssf.usermodel.HSSFRow; -import org.apache.poi.hssf.usermodel.HSSFSheet; -import org.apache.poi.hssf.usermodel.HSSFWorkbook; -import org.apache.poi.ss.usermodel.BorderStyle; -import org.apache.poi.ss.usermodel.HorizontalAlignment; -import org.apache.poi.ss.usermodel.VerticalAlignment; -import org.springframework.stereotype.Component; +import java.util.*; /** * 导出excel工具类 @@ -34,148 +24,6 @@ import org.springframework.stereotype.Component; @Component public class ExportsExcelSenderUtil { -// @Resource -// ITeacherService teacherService; -// @Resource -// ICourseService courseService; -// -// -// private HSSFWorkbook workbook; -// -// /** -// * 教师导出 -// * */ -// public void teacherExports(Integer pageIndex, Integer pageSize, Teacher entity, OrderCondition order){ -//// 创建excel对象 -// try { -// workbook = new HSSFWorkbook(); -//// 创建工作表 参数 表名 -// HSSFSheet sheet = workbook.createSheet("教师信息"); -//// 创建标题行 -// HSSFRow row = sheet.createRow(0); -// String[] title = {"姓名","部门", "创建时间", "修改时间", "授课时长", "在职状态"}; -//// 单元格对象 标题行 -// HSSFCell cell = null; -// CellStyle cellStyle = this.cellStyle(workbook); -// for (int i = 0; i < title.length; i++) { -// cell = row.createCell(i); -// cell.setCellValue(title[i]); -// cell.setCellStyle(cellStyle); -// sheet.setColumnWidth(i,20*256); -// } -//// 数据行 -// PageList pageList = teacherService.query(pageIndex, pageSize, entity, order); -// List list = pageList.getList(); -// for (int i = 0; i < list.size(); i++) { -//// 遍历一次创建一行 -// HSSFRow row1 = sheet.createRow(i + 1); -//// 给行内单元格放对应数据 -// row1.createCell(0).setCellValue(list.get(i).getName()); -// row1.createCell(1).setCellValue(list.get(i).getDepartId()); -// row1.createCell(2).setCellValue(String.valueOf(list.get(i).getSysCreateTime())); -// row1.createCell(3).setCellValue(String.valueOf(list.get(i).getSysUpdateTime())); -// row1.createCell(4).setCellValue(list.get(i).getTeaching()); -// if(list.get(i).getWaitStatus().equals("0")){ -// row1.createCell(5).setCellValue("成功"); -// }else{ -// row1.createCell(5).setCellValue("失败"); -// } -// -// } -// String configValue = SysConstant.getConfigValue(BaseConstant.CONFIG_UPLOAD_FILES_TEMPPATH); -// File file = new File(configValue + "/teacher.xls"); -// FileOutputStream fileOutputStream = new FileOutputStream(file); -// workbook.write(fileOutputStream); -// workbook.close(); -// } catch (Exception e) { -// e.printStackTrace(); -// } -// } -// /** -// * 课程导出 -// * */ -// public void courseExports(Pagination pager, CourseQueryDto dto){ -// try { -// workbook = new HSSFWorkbook(); -//// 创建工作表 参数 表名 -// HSSFSheet sheet = workbook.createSheet("课程信息"); -//// 创建标题行 -// HSSFRow row = sheet.createRow(0); -// String[] title = {"序号","名称", "内容分类", "资源归属", "授课方式", "状态","是否发布"}; -//// 单元格对象 标题行 -// HSSFCell cell = null; -// CellStyle cellStyle = this.cellStyle(workbook); -// for (int i = 0; i < title.length; i++) { -// cell = row.createCell(i); -// cell.setCellValue(title[i]); -// cell.setCellStyle(cellStyle); -// sheet.setColumnWidth(i,20*256); -// } -//// 数据行 -// PageList page = courseService.findPage(pager.getPageIndex(), pager.getPageSize(), dto); -// List list = page.getList(); -// for (int i = 0; i < list.size(); i++) { -//// 遍历一次创建一行 -// HSSFRow row1 = sheet.createRow(i + 1); -//// 给行内单元格放对应数据 -// row1.createCell(0).setCellValue(i+1); -// row1.createCell(1).setCellValue(list.get(i).getName()); -// row1.createCell(2).setCellValue(list.get(i).getSysType1()+"/"+list.get(i).getSysType2()+"/"+list.get(i).getSysType3()); -// row1.createCell(3).setCellValue(list.get(i).getResOwner1()+"/"+list.get(i).getResOwner2()+"/"+list.get(i).getResOwner3()); -// if(list.get(i).getType()==20){ -// row1.createCell(4).setCellValue("在线课(录播)"); -// } -// if(list.get(i).getType()==10){ -// row1.createCell(4).setCellValue("微课"); -// } -// if(list.get(i).getStatus()==1){ -// row1.createCell(5).setCellValue("未提交"); -// } -// if(list.get(i).getStatus()==2){ -// row1.createCell(5).setCellValue("已提交"); -// } -// if(list.get(i).getStatus()==3){ -// row1.createCell(5).setCellValue("审核未通过"); -// } -// if(list.get(i).getStatus()==5){ -// row1.createCell(5).setCellValue("审核完成"); -// } -// if(list.get(i).getPublished()){ -// row1.createCell(6).setCellValue("已发布"); -// }else{ -// row1.createCell(6).setCellValue("未发布"); -// } -// -// } -// String configValue = SysConstant.getConfigValue(BaseConstant.CONFIG_UPLOAD_FILES_TEMPPATH); -// File file = new File(configValue + "/course.xls"); -// FileOutputStream fileOutputStream = new FileOutputStream(file); -// workbook.write(fileOutputStream); -// workbook.close(); -// } catch (Exception e) { -// e.printStackTrace(); -// } -// -// } -// -// /** -// * 标题行样式 -// * */ -// private CellStyle cellStyle(HSSFWorkbook workbook){ -// -//// 构建字体 -// HSSFFont font = workbook.createFont(); -//// 加粗 -// font.setBold(true); -//// 字号 -// font.setFontHeightInPoints((short)10); -//// 创建样式对象 -// CellStyle cellStyle = workbook.createCellStyle(); -// cellStyle.setFont(font); -//// 设置文字居中 -// cellStyle.setAlignment(HorizontalAlignment.CENTER); -// return cellStyle; -// } /** * 判断是否为空 * @param obj @@ -323,10 +171,106 @@ public class ExportsExcelSenderUtil { } + /** + * 导出动态列Excel + * + * @param kvMap 自定义标题属性,key:标题 value:属性 + * @param dataList 数据列表,每个元素是一个Map,key为属性名,value为值 + * @param out 输出流 + * @param dateFormat 日期格式 默认为yyyy-MM-dd HH:mm:ss + */ + public static void exportDynamic(LinkedHashMap kvMap, List> dataList, OutputStream out, String dateFormat) { + HSSFWorkbook wb = null; + try { + dateFormat = !ExportsExcelSenderUtil.isEmpty(dateFormat) ? dateFormat : "yyyy-MM-dd HH:mm:ss"; + wb = new HSSFWorkbook(); + // 表头样式 + HSSFCellStyle titleStyle = wb.createCellStyle(); + titleStyle.setBorderTop(BorderStyle.THIN); + titleStyle.setBorderLeft(BorderStyle.THIN); + titleStyle.setBorderBottom(BorderStyle.THIN); + titleStyle.setBorderRight(BorderStyle.THIN); + titleStyle.setVerticalAlignment(VerticalAlignment.CENTER); + titleStyle.setAlignment(HorizontalAlignment.CENTER); + titleStyle.setWrapText(true); + // 设置字体样式 + HSSFFont titleFont = wb.createFont(); + titleFont.setBold(true); + titleFont.setFontHeightInPoints((short) 15); + titleStyle.setFont(titleFont); + // 内容样式 + HSSFCellStyle contentStyle = wb.createCellStyle(); + contentStyle.setBorderTop(BorderStyle.THIN); + contentStyle.setBorderLeft(BorderStyle.THIN); + contentStyle.setBorderBottom(BorderStyle.THIN); + contentStyle.setBorderRight(BorderStyle.THIN); + contentStyle.setVerticalAlignment(VerticalAlignment.CENTER); + contentStyle.setAlignment(HorizontalAlignment.CENTER); + contentStyle.setWrapText(true); + // 创建工作表 + HSSFSheet sheet = wb.createSheet(); + HSSFRow headerRow = sheet.createRow(0); + headerRow.setHeightInPoints(33); + // 设置表头 + Set headerKeys = kvMap.keySet(); + int columnIndex = 0; + for (String header : headerKeys) { + sheet.setColumnWidth(columnIndex, 60 * 80); + HSSFCell headerCell = headerRow.createCell(columnIndex); + headerCell.setCellValue(header); + headerCell.setCellStyle(titleStyle); + columnIndex++; + } + + // 填充数据 + for (int i = 0; i < dataList.size(); i++) { + Map rowData = dataList.get(i); + HSSFRow row = sheet.createRow(i + 1); + row.setHeightInPoints(33); + + columnIndex = 0; + for (String header : headerKeys) { + HSSFCell cell = row.createCell(columnIndex); + String propertyName = kvMap.get(header); // 获取属性名 + + Object cellValue = rowData.get(propertyName); + if (cellValue instanceof LocalDateTime) { + LocalDateTime date = (LocalDateTime) cellValue; + cellValue = DateTimeFormatter.ofPattern(dateFormat).format(date); + } else if (cellValue instanceof Date) { + Date date = (Date) cellValue; + cellValue = new SimpleDateFormat(dateFormat).format(date); + } + + String valueStr = !ExportsExcelSenderUtil.isEmpty(cellValue) ? cellValue.toString() : ""; + cell.setCellValue(valueStr); + cell.setCellStyle(contentStyle); + columnIndex++; + } + } + + try { + wb.write(out); + wb.close(); + } catch (IOException e) { + // 日志记录 + } + } catch (Exception e) { + try { + if (wb != null) { + wb.write(out); + wb.close(); + } + } catch (IOException e1) { + // 日志记录 + } + throw e; + } + } } diff --git a/servers/boe-server-all/src/main/java/com/xboe/school/study/api/StudyCourseApi.java b/servers/boe-server-all/src/main/java/com/xboe/school/study/api/StudyCourseApi.java index 33429e75..e78e35c6 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/school/study/api/StudyCourseApi.java +++ b/servers/boe-server-all/src/main/java/com/xboe/school/study/api/StudyCourseApi.java @@ -1,5 +1,46 @@ package com.xboe.school.study.api; +import cn.hutool.core.collection.CollectionUtil; +import com.boe.feign.api.infrastructure.entity.CommonSearchVo; +import com.boe.feign.api.infrastructure.entity.Dict; +import com.xboe.api.ThirdApi; +import com.xboe.common.OrderCondition; +import com.xboe.common.PageList; +import com.xboe.common.Pagination; +import com.xboe.common.utils.StringUtil; +import com.xboe.constants.CacheName; +import com.xboe.core.CurrentUser; +import com.xboe.core.JsonResponse; +import com.xboe.core.api.ApiBaseController; +import com.xboe.module.course.entity.*; +import com.xboe.module.course.service.ICourseContentService; +import com.xboe.module.course.service.ICourseSectionService; +import com.xboe.module.course.service.ICourseService; +import com.xboe.module.course.service.ICourseTagService; +import com.xboe.module.course.vo.TeacherVo; +import com.xboe.module.excel.ExportsExcelSenderUtil; +import com.xboe.module.teacher.entity.Teacher; +import com.xboe.module.teacher.service.ITeacherService; +import com.xboe.module.usergroup.service.IUserGroupService; +import com.xboe.school.study.dto.*; +import com.xboe.school.study.entity.*; +import com.xboe.school.study.service.IStudyCourseService; +import com.xboe.school.study.service.IStudyExamService; +import com.xboe.school.study.service.IStudyService; +import com.xboe.school.study.service.IStudySignupService; +import com.xboe.school.vo.StudyTimeVo; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.persistence.EntityManager; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.OutputStream; import java.math.BigDecimal; import java.math.RoundingMode; import java.time.LocalDateTime; @@ -8,61 +49,6 @@ import java.util.concurrent.TimeUnit; import java.util.function.Function; import java.util.stream.Collectors; -import cn.hutool.core.collection.CollectionUtil; -import com.alibaba.nacos.shaded.com.google.common.util.concurrent.RateLimiter; -import com.boe.feign.api.infrastructure.entity.CommonSearchVo; -import com.boe.feign.api.infrastructure.entity.Dict; -import com.xboe.api.ThirdApi; -import com.xboe.constants.CacheName; -import com.xboe.module.course.entity.*; -import com.xboe.module.course.service.ICourseTagService; -import com.xboe.module.course.vo.TeacherVo; -import com.xboe.module.usergroup.service.IUserGroupService; -import com.xboe.school.study.dao.StudyCourseDao; -import com.xboe.school.vo.StudyTimeVo; -import org.apache.commons.lang3.ArrayUtils; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.BeanUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.redis.core.StringRedisTemplate; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.RestController; - -import com.xboe.common.OrderCondition; -import com.xboe.common.PageList; -import com.xboe.common.Pagination; -import com.xboe.common.utils.StringUtil; -import com.xboe.core.CurrentUser; -import com.xboe.core.JsonResponse; -import com.xboe.core.api.ApiBaseController; -import com.xboe.module.course.service.ICourseContentService; -import com.xboe.module.course.service.ICourseSectionService; -import com.xboe.module.course.service.ICourseService; -import com.xboe.module.teacher.entity.Teacher; -import com.xboe.module.teacher.service.ITeacherService; -import com.xboe.school.study.dto.CourseStudyItem; -import com.xboe.school.study.dto.CourseStudyQuery; -import com.xboe.school.study.dto.StudyContentDto; -import com.xboe.school.study.dto.StudyCourseNameDto; -import com.xboe.school.study.dto.StudyCourseQuery; -import com.xboe.school.study.dto.StudyCourseSimple; -import com.xboe.school.study.entity.StudyCourse; -import com.xboe.school.study.entity.StudyCourseItem; -import com.xboe.school.study.entity.StudySignup; -import com.xboe.school.study.entity.StudyTime; -import com.xboe.school.study.service.IStudyCourseService; -import com.xboe.school.study.service.IStudyService; -import com.xboe.school.study.service.IStudySignupService; - -import lombok.extern.slf4j.Slf4j; - -import javax.annotation.Resource; -import javax.servlet.http.HttpServletRequest; - /** * 课程学习的内容 */ @@ -80,6 +66,9 @@ public class StudyCourseApi extends ApiBaseController{ @Autowired ICourseService courseService; + @Autowired + IStudyExamService studyExamService; + @Resource private ThirdApi thirdApi; @@ -103,6 +92,12 @@ public class StudyCourseApi extends ApiBaseController{ @Resource private ICourseTagService courseTagService; + /** + * 用于避免JPA查询后修改entity实体字段,自动更新到数据库 + */ + @Autowired + private EntityManager entityManager; + /** * 用于查询课程的学习记录 * @param pager @@ -132,23 +127,145 @@ public class StudyCourseApi extends ApiBaseController{ return error("查询失败",e.getMessage()); } } - + /** * 导出课程学习记录 - * @return + * 数据维度:(单门课程、多个学生) + * 25.11.20新增 + * + * @param courseId 课程id */ @RequestMapping(value="/export",method = {RequestMethod.GET,RequestMethod.POST}) - public JsonResponse export(String courseId,Integer type){ - if(type==null) { - return badRequest("未指定导出类型"); - } - //type 1表导出汇总,2表导出详细 + public void export(String courseId, HttpServletResponse response) { + // 定义输出流 + OutputStream outputStream = null; try { - - return success(true); - }catch(Exception e) { - log.error("导出课程学习记录错误",e.getMessage()); - return error("导出课程学习记录失败",e.getMessage()); + outputStream = response.getOutputStream(); + LinkedHashMap exportMap = new LinkedHashMap<>(); + // 1.拼接固定表头(在线课名称,姓名,工号,部门,学习开始时间,学习结束时间,学习时长(分),学习状态,学习进度) + exportMap.put("在线课名称", "在线课名称"); + exportMap.put("姓名", "姓名"); + exportMap.put("工号", "工号"); + exportMap.put("部门", "部门"); + exportMap.put("学习开始时间", "学习开始时间"); + exportMap.put("学习结束时间", "学习结束时间"); + exportMap.put("学习时长(分)", "学习时长(分)"); + exportMap.put("学习状态", "学习状态"); + exportMap.put("学习进度", "学习进度"); + // 2.查询课程的所有考试答卷信息,拼接动态表头(XXX考试成绩) + // 注意:这里的考试信息每个学生每门课程只有一条,实际数据可能多次考试,因此根据考试配置中的(最高分/最新数据)获取对应列表数据即可(本次新增接口) + List studyExams = studyExamService.getByCourseId(courseId); + // courseExam和studyExam表都有testName字段,查看现有逻辑后,选择studyExam表的testName字段作为考试名称 + // 因为需求没提,因此查询按默认id排序 + // 判断非空则拼接表头 + // 用于处理考试名称重复的情况 + if (studyExams != null && !studyExams.isEmpty()) { + // 使用testId作为唯一标识符来区分不同的考试实例 + Map uniqueExams = new HashMap<>(); + for (StudyExam studyExam : studyExams) { + // 因为后续要赋值,这里先让实体脱离持久化上下文,避免赋值后自动更新到数据库 + entityManager.detach(studyExam); + String testId = studyExam.getTestId(); + String examName = studyExam.getTestName(); + // 如果还没有这个testId的记录,则添加 + if (!uniqueExams.containsKey(testId)) { + // 处理空考试名称 + if (examName == null || examName.trim().isEmpty()) { + examName = "空"; + studyExam.setTestName(examName); + } + uniqueExams.put(testId, studyExam); + } + } + // 对唯一考试进行命名处理,解决同名问题 + Map testNameCountMap = new HashMap<>(); + for (StudyExam studyExam : uniqueExams.values()) { + String examName = studyExam.getTestName(); + // 处理重复名称 + if (testNameCountMap.containsKey(examName)) { + // 如果已经存在该名称,则计数+1,并添加后缀 + Integer count = testNameCountMap.get(examName); + count++; + testNameCountMap.put(examName, count); + examName = examName + count; + // 赋值给原始对象 + studyExam.setTestName(examName); + } else { + // 第一次出现该名称 + testNameCountMap.put(examName, 1); + } + exportMap.put(examName + "考试成绩", examName); + } + } + // 3.查询课程学习记录信息并拼接导出信息 + StudyCourse studyCourse = new StudyCourse(); + studyCourse.setCourseId(courseId); + List studyCourses = service.findList(studyCourse, null, null); + // 将课程学习记录与考试信息拼接为map + List> dataList = studyCourses.stream().map(studyCourse1 -> { + Map map = new HashMap<>(); + // 拼接课程学习记录信息 + map.put("在线课名称", studyCourse1.getCourseName()); + map.put("姓名", studyCourse1.getAname()); + map.put("工号", studyCourse1.getAid()); + // 部门信息需要额外获取,暂时留空 + map.put("部门", ""); + // 这个开始时间已经弃置了,不过先用再说(有值) + map.put("学习开始时间", studyCourse1.getStartTime()); + // 结束时间为空的,说明还没学习结束(有值) + map.put("学习结束时间", studyCourse1.getFinishTime()); + // 学习时长需要计算,暂时留空 + map.put("学习时长(分)", ""); + // 学习状态需要转换 + String statusText = ""; + if (studyCourse1.getStatus() != null) { + switch (studyCourse1.getStatus()) { + case StudyCourse.STATUS_NOSTUDY: + statusText = "未开始学习"; + break; + case StudyCourse.STATUS_STUDYING: + statusText = "学习中"; + break; + case StudyCourse.STATUS_ABORTED: + statusText = "已终止"; + break; + case StudyCourse.STATUS_FINISH: + statusText = "学习完成"; + break; + default: + statusText = ""; + } + } + map.put("学习状态", statusText); + // 学习进度 + map.put("学习进度", studyCourse1.getProgress() != null ? studyCourse1.getProgress() + "%" : ""); + // 按考试顺序拼接考试信息 + if (studyExams != null && !studyExams.isEmpty()) { + // 获取当前学生该课程的所有考试成绩 TODO 这里需要确认 + List studentExams = studyExamService.getByStudyIdAndContentId(studyCourse1.getId(), null); + // 修改为使用testId作为键而不是testName + Map examMap = studentExams.stream().collect(Collectors.toMap(StudyExam::getTestId, Function.identity(), (e1, e2) -> e1)); + // 按顺序添加考试成绩,使用testId匹配 + for (StudyExam studyExam : studyExams) { + String testId = studyExam.getTestId(); + String examName = studyExam.getTestName(); + if (examMap.containsKey(testId)) { + map.put(examName, examMap.get(testId).getScore()); + } else { + // 当前学生未进行的考试,填入空值 + map.put(examName, ""); + } + } + } + return map; + }).collect(Collectors.toList()); + // 4.拼接消息类型和响应头信息 + response.setContentType("application/octet-stream"); + response.setHeader("Content-disposition", "attachment;filename=StudyCourseRecord.xlsx"); + // 5.调用动态列excel导出接口 + ExportsExcelSenderUtil.exportDynamic(exportMap, dataList, outputStream, "yyyy-MM-dd HH:mm:ss"); + } catch (Exception e) { + log.error("导出课程学习记录错误:{}", e.getMessage()); } } diff --git a/servers/boe-server-all/src/main/java/com/xboe/school/study/service/IStudyCourseService.java b/servers/boe-server-all/src/main/java/com/xboe/school/study/service/IStudyCourseService.java index 48aa73be..2c2d621f 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/school/study/service/IStudyCourseService.java +++ b/servers/boe-server-all/src/main/java/com/xboe/school/study/service/IStudyCourseService.java @@ -1,7 +1,5 @@ package com.xboe.school.study.service; -import java.util.List; - import com.xboe.common.OrderCondition; import com.xboe.common.PageList; import com.xboe.school.study.dto.CourseStudyItem; @@ -12,6 +10,8 @@ import com.xboe.school.study.entity.StudyCourse; import com.xboe.school.study.entity.StudyCourseItem; import com.xboe.school.study.entity.StudySignup; +import java.util.List; + public interface IStudyCourseService { /** @@ -45,6 +45,17 @@ public interface IStudyCourseService { */ PageList findByES(int pageIndex,int pageSize) throws Exception; + /** + * 列表查询课程学习记录,用户的课程学习记录 + * 25.11.20新增 + * + * @param sc 课程学习表查询字段 + * @param oc 排序字段 + * @param isFinish 是否已完成 + * @return 学习记录信息集合 + */ + List findList(StudyCourse sc, OrderCondition oc, Boolean isFinish); + /** * 分页查询课程学习记录,用户的课程学习记录 * @param pageIndex diff --git a/servers/boe-server-all/src/main/java/com/xboe/school/study/service/impl/StudyCourseServiceImpl.java b/servers/boe-server-all/src/main/java/com/xboe/school/study/service/impl/StudyCourseServiceImpl.java index 663dea31..d6bb3f6d 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/school/study/service/impl/StudyCourseServiceImpl.java +++ b/servers/boe-server-all/src/main/java/com/xboe/school/study/service/impl/StudyCourseServiceImpl.java @@ -1,18 +1,5 @@ package com.xboe.school.study.service.impl; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; -import java.util.ArrayList; -import java.util.List; -import java.util.stream.Collectors; - -import javax.transaction.Transactional; - -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - import com.xboe.common.OrderCondition; import com.xboe.common.PageList; import com.xboe.core.orm.FieldFilters; @@ -24,14 +11,7 @@ import com.xboe.module.course.dao.CourseContentDao; import com.xboe.module.course.dao.CourseDao; import com.xboe.module.course.entity.Course; import com.xboe.module.course.service.ICourseStudySearch; -import com.xboe.school.study.dao.StudyAssessDao; -import com.xboe.school.study.dao.StudyCourseDao; -import com.xboe.school.study.dao.StudyCourseItemDao; -import com.xboe.school.study.dao.StudyExamDao; -import com.xboe.school.study.dao.StudyHomeWorkDao; -import com.xboe.school.study.dao.StudyScoreDao; -import com.xboe.school.study.dao.StudySignupDao; -import com.xboe.school.study.dao.StudyTimeDao; +import com.xboe.school.study.dao.*; import com.xboe.school.study.dto.CourseStudyItem; import com.xboe.school.study.dto.StudyCourseNameDto; import com.xboe.school.study.dto.StudyCourseQuery; @@ -41,8 +21,17 @@ import com.xboe.school.study.entity.StudyCourseItem; import com.xboe.school.study.entity.StudySignup; import com.xboe.school.study.service.IStudyCourseService; import com.xboe.school.study.service.IStudySignupService; - import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.transaction.Transactional; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.List; @Slf4j @Service @@ -674,6 +663,46 @@ public class StudyCourseServiceImpl implements IStudyCourseService{ return rs; } + @Override + public List findList(StudyCourse sc, OrderCondition oc, Boolean isFinish) { + QueryBuilder query = QueryBuilder.from(StudyCourse.class); + if (oc == null) { + oc = OrderCondition.desc("id"); + } + query.addOrder(oc); + if (sc != null) { + if (StringUtils.isNotBlank(sc.getCourseName())) { + query.addFilter(FieldFilters.like("courseName", sc.getCourseName())); + } + if (StringUtils.isNotBlank(sc.getAname())) { + query.addFilter(FieldFilters.like("aname", sc.getAname())); + } + if (sc.getStatus() != null) { + query.addFilter(FieldFilters.eq("status", sc.getStatus())); + } + if (sc.getCourseType() != null) { + query.addFilter(FieldFilters.eq("courseType", sc.getCourseType())); + } + if (StringUtils.isNotBlank(sc.getCourseId())) { + query.addFilter(FieldFilters.eq("courseId", sc.getCourseId())); + } + if (sc.getStartTime() != null) { + query.addFilter(FieldFilters.eq("startTime", sc.getStartTime())); + } + if (StringUtils.isNotBlank(sc.getAid())) { + query.addFilter(FieldFilters.eq("aid", sc.getAid())); + } + } + if (isFinish != null) { + if (isFinish) { + query.addFilter(FieldFilters.eq("status", 9)); + } else { + query.addFilter(FieldFilters.lt("status", 9)); + } + } + return studyCourseDao.findList(query.builder()); + } + @Override public List findByCourseAndUsers(String courseId, List aids) throws Exception {