1.忽略项目参考文档内容
2.修改excel导出工具类,支持导出动态列excel
3.补全导出课程学习记录接口初版(还缺少部分字段)
4.添加列表查询课程学习记录方法
This commit is contained in:
miaowenbo
2025-11-20 20:30:52 +08:00
parent d1b04dfba7
commit cf87dfbb8c
5 changed files with 354 additions and 252 deletions

1
.gitignore vendored
View File

@@ -48,3 +48,4 @@ nbdist/
!*/build/*.xml !*/build/*.xml
*.pid *.pid
doc/

View File

@@ -1,31 +1,21 @@
package com.xboe.module.excel; 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.IOException;
import java.io.OutputStream; import java.io.OutputStream;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.util.Collection; import java.util.*;
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;
/** /**
* 导出excel工具类 * 导出excel工具类
@@ -34,148 +24,6 @@ import org.springframework.stereotype.Component;
@Component @Component
public class ExportsExcelSenderUtil { 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<Teacher> pageList = teacherService.query(pageIndex, pageSize, entity, order);
// List<Teacher> 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<Course> page = courseService.findPage(pager.getPageIndex(), pager.getPageSize(), dto);
// List<Course> 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 * @param obj
@@ -323,10 +171,106 @@ public class ExportsExcelSenderUtil {
} }
/**
* 导出动态列Excel
*
* @param kvMap 自定义标题属性,key:标题 value:属性
* @param dataList 数据列表每个元素是一个Mapkey为属性名value为值
* @param out 输出流
* @param dateFormat 日期格式 默认为yyyy-MM-dd HH:mm:ss
*/
public static void exportDynamic(LinkedHashMap<String, String> kvMap, List<Map<String, Object>> 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<String> 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<String, Object> 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;
}
}
} }

View File

@@ -1,5 +1,46 @@
package com.xboe.school.study.api; 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.BigDecimal;
import java.math.RoundingMode; import java.math.RoundingMode;
import java.time.LocalDateTime; import java.time.LocalDateTime;
@@ -8,61 +49,6 @@ import java.util.concurrent.TimeUnit;
import java.util.function.Function; import java.util.function.Function;
import java.util.stream.Collectors; 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 @Autowired
ICourseService courseService; ICourseService courseService;
@Autowired
IStudyExamService studyExamService;
@Resource @Resource
private ThirdApi thirdApi; private ThirdApi thirdApi;
@@ -103,6 +92,12 @@ public class StudyCourseApi extends ApiBaseController{
@Resource @Resource
private ICourseTagService courseTagService; private ICourseTagService courseTagService;
/**
* 用于避免JPA查询后修改entity实体字段自动更新到数据库
*/
@Autowired
private EntityManager entityManager;
/** /**
* 用于查询课程的学习记录 * 用于查询课程的学习记录
* @param pager * @param pager
@@ -132,23 +127,145 @@ public class StudyCourseApi extends ApiBaseController{
return error("查询失败",e.getMessage()); return error("查询失败",e.getMessage());
} }
} }
/** /**
* 导出课程学习记录 * 导出课程学习记录
* @return * 数据维度:(单门课程、多个学生)
* 25.11.20新增
*
* @param courseId 课程id
*/ */
@RequestMapping(value="/export",method = {RequestMethod.GET,RequestMethod.POST}) @RequestMapping(value="/export",method = {RequestMethod.GET,RequestMethod.POST})
public JsonResponse<Boolean> export(String courseId,Integer type){ public void export(String courseId, HttpServletResponse response) {
if(type==null) { // 定义输出流
return badRequest("未指定导出类型"); OutputStream outputStream = null;
}
//type 1表导出汇总2表导出详细
try { try {
outputStream = response.getOutputStream();
return success(true); LinkedHashMap<String, String> exportMap = new LinkedHashMap<>();
}catch(Exception e) { // 1.拼接固定表头(在线课名称,姓名,工号,部门,学习开始时间,学习结束时间,学习时长(分),学习状态,学习进度)
log.error("导出课程学习记录错误",e.getMessage()); exportMap.put("在线课名称", "在线课名称");
return error("导出课程学习记录失败",e.getMessage()); exportMap.put("姓名", "姓名");
exportMap.put("工号", "工号");
exportMap.put("部门", "部门");
exportMap.put("学习开始时间", "学习开始时间");
exportMap.put("学习结束时间", "学习结束时间");
exportMap.put("学习时长(分)", "学习时长(分)");
exportMap.put("学习状态", "学习状态");
exportMap.put("学习进度", "学习进度");
// 2.查询课程的所有考试答卷信息拼接动态表头XXX考试成绩
// 注意:这里的考试信息每个学生每门课程只有一条,实际数据可能多次考试,因此根据考试配置中的(最高分/最新数据)获取对应列表数据即可(本次新增接口)
List<StudyExam> studyExams = studyExamService.getByCourseId(courseId);
// courseExam和studyExam表都有testName字段查看现有逻辑后选择studyExam表的testName字段作为考试名称
// 因为需求没提因此查询按默认id排序
// 判断非空则拼接表头
// 用于处理考试名称重复的情况
if (studyExams != null && !studyExams.isEmpty()) {
// 使用testId作为唯一标识符来区分不同的考试实例
Map<String, StudyExam> 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<String, Integer> 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<StudyCourse> studyCourses = service.findList(studyCourse, null, null);
// 将课程学习记录与考试信息拼接为map
List<Map<String, Object>> dataList = studyCourses.stream().map(studyCourse1 -> {
Map<String, Object> 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<StudyExam> studentExams = studyExamService.getByStudyIdAndContentId(studyCourse1.getId(), null);
// 修改为使用testId作为键而不是testName
Map<String, StudyExam> 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());
} }
} }

View File

@@ -1,7 +1,5 @@
package com.xboe.school.study.service; package com.xboe.school.study.service;
import java.util.List;
import com.xboe.common.OrderCondition; import com.xboe.common.OrderCondition;
import com.xboe.common.PageList; import com.xboe.common.PageList;
import com.xboe.school.study.dto.CourseStudyItem; 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.StudyCourseItem;
import com.xboe.school.study.entity.StudySignup; import com.xboe.school.study.entity.StudySignup;
import java.util.List;
public interface IStudyCourseService { public interface IStudyCourseService {
/** /**
@@ -45,6 +45,17 @@ public interface IStudyCourseService {
*/ */
PageList<StudyCourse> findByES(int pageIndex,int pageSize) throws Exception; PageList<StudyCourse> findByES(int pageIndex,int pageSize) throws Exception;
/**
* 列表查询课程学习记录,用户的课程学习记录
* 25.11.20新增
*
* @param sc 课程学习表查询字段
* @param oc 排序字段
* @param isFinish 是否已完成
* @return 学习记录信息集合
*/
List<StudyCourse> findList(StudyCourse sc, OrderCondition oc, Boolean isFinish);
/** /**
* 分页查询课程学习记录,用户的课程学习记录 * 分页查询课程学习记录,用户的课程学习记录
* @param pageIndex * @param pageIndex

View File

@@ -1,18 +1,5 @@
package com.xboe.school.study.service.impl; 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.OrderCondition;
import com.xboe.common.PageList; import com.xboe.common.PageList;
import com.xboe.core.orm.FieldFilters; 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.dao.CourseDao;
import com.xboe.module.course.entity.Course; import com.xboe.module.course.entity.Course;
import com.xboe.module.course.service.ICourseStudySearch; import com.xboe.module.course.service.ICourseStudySearch;
import com.xboe.school.study.dao.StudyAssessDao; import com.xboe.school.study.dao.*;
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.dto.CourseStudyItem; import com.xboe.school.study.dto.CourseStudyItem;
import com.xboe.school.study.dto.StudyCourseNameDto; import com.xboe.school.study.dto.StudyCourseNameDto;
import com.xboe.school.study.dto.StudyCourseQuery; 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.entity.StudySignup;
import com.xboe.school.study.service.IStudyCourseService; import com.xboe.school.study.service.IStudyCourseService;
import com.xboe.school.study.service.IStudySignupService; import com.xboe.school.study.service.IStudySignupService;
import lombok.extern.slf4j.Slf4j; 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 @Slf4j
@Service @Service
@@ -674,6 +663,46 @@ public class StudyCourseServiceImpl implements IStudyCourseService{
return rs; return rs;
} }
@Override
public List<StudyCourse> 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 @Override
public List<CourseStudyItem> findByCourseAndUsers(String courseId, List<String> aids) throws Exception { public List<CourseStudyItem> findByCourseAndUsers(String courseId, List<String> aids) throws Exception {