mirror of
https://codeup.aliyun.com/67762337eccfc218f6110e0e/per-boe/java-servers.git
synced 2025-12-06 09:26:48 +08:00
feat:
1.忽略项目参考文档内容 2.修改excel导出工具类,支持导出动态列excel 3.补全导出课程学习记录接口初版(还缺少部分字段) 4.添加列表查询课程学习记录方法
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -48,3 +48,4 @@ nbdist/
|
||||
!*/build/*.xml
|
||||
|
||||
*.pid
|
||||
doc/
|
||||
|
||||
@@ -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<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
|
||||
@@ -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<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;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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
|
||||
@@ -135,20 +130,142 @@ public class StudyCourseApi extends ApiBaseController{
|
||||
|
||||
/**
|
||||
* 导出课程学习记录
|
||||
* @return
|
||||
* 数据维度:(单门课程、多个学生)
|
||||
* 25.11.20新增
|
||||
*
|
||||
* @param courseId 课程id
|
||||
*/
|
||||
@RequestMapping(value="/export",method = {RequestMethod.GET,RequestMethod.POST})
|
||||
public JsonResponse<Boolean> 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);
|
||||
outputStream = response.getOutputStream();
|
||||
LinkedHashMap<String, String> 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<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());
|
||||
return error("导出课程学习记录失败",e.getMessage());
|
||||
log.error("导出课程学习记录错误:{}", e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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<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
|
||||
|
||||
@@ -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<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
|
||||
public List<CourseStudyItem> findByCourseAndUsers(String courseId, List<String> aids) throws Exception {
|
||||
|
||||
|
||||
Reference in New Issue
Block a user