mirror of
https://codeup.aliyun.com/67762337eccfc218f6110e0e/per-boe/java-servers.git
synced 2025-12-09 02:46:50 +08:00
feat: 资源学习情况导出-作业信息导出接口补全附件和zip导出
This commit is contained in:
@@ -12,6 +12,7 @@ import com.xboe.constants.CacheName;
|
|||||||
import com.xboe.core.CurrentUser;
|
import com.xboe.core.CurrentUser;
|
||||||
import com.xboe.core.JsonResponse;
|
import com.xboe.core.JsonResponse;
|
||||||
import com.xboe.core.api.ApiBaseController;
|
import com.xboe.core.api.ApiBaseController;
|
||||||
|
import com.xboe.core.upload.XFileUploader;
|
||||||
import com.xboe.data.outside.IOutSideDataService;
|
import com.xboe.data.outside.IOutSideDataService;
|
||||||
import com.xboe.module.course.entity.*;
|
import com.xboe.module.course.entity.*;
|
||||||
import com.xboe.module.course.service.ICourseContentService;
|
import com.xboe.module.course.service.ICourseContentService;
|
||||||
@@ -42,8 +43,7 @@ import javax.annotation.Resource;
|
|||||||
import javax.persistence.EntityManager;
|
import javax.persistence.EntityManager;
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
import javax.servlet.http.HttpServletResponse;
|
import javax.servlet.http.HttpServletResponse;
|
||||||
import java.io.IOException;
|
import java.io.*;
|
||||||
import java.io.OutputStream;
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.math.RoundingMode;
|
import java.math.RoundingMode;
|
||||||
import java.net.URLEncoder;
|
import java.net.URLEncoder;
|
||||||
@@ -52,6 +52,8 @@ import java.util.*;
|
|||||||
import java.util.concurrent.TimeUnit;
|
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 java.util.zip.ZipEntry;
|
||||||
|
import java.util.zip.ZipOutputStream;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 课程学习的内容
|
* 课程学习的内容
|
||||||
@@ -111,6 +113,9 @@ public class StudyCourseApi extends ApiBaseController{
|
|||||||
@Resource
|
@Resource
|
||||||
private IOrganizationService organizationService;
|
private IOrganizationService organizationService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private XFileUploader fileUploader;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 用于避免JPA查询后修改entity实体字段,自动更新到数据库
|
* 用于避免JPA查询后修改entity实体字段,自动更新到数据库
|
||||||
*/
|
*/
|
||||||
@@ -1407,7 +1412,10 @@ public class StudyCourseApi extends ApiBaseController{
|
|||||||
}
|
}
|
||||||
OutputStream outputStream = null;
|
OutputStream outputStream = null;
|
||||||
try {
|
try {
|
||||||
outputStream = response.getOutputStream();
|
// 创建临时文件用于存储Excel
|
||||||
|
File tempExcelFile = File.createTempFile("HomeWorkRecord", ".xlsx");
|
||||||
|
String tempExcelPath = tempExcelFile.getAbsolutePath();
|
||||||
|
|
||||||
LinkedHashMap<String, String> exportMap = new LinkedHashMap<>();
|
LinkedHashMap<String, String> exportMap = new LinkedHashMap<>();
|
||||||
// 1.拼接固定表头(课程名称、资源名称、姓名、工号、部门、作业状态、作业成绩、完成时间)
|
// 1.拼接固定表头(课程名称、资源名称、姓名、工号、部门、作业状态、作业成绩、完成时间)
|
||||||
exportMap.put("课程名称", "课程名称");
|
exportMap.put("课程名称", "课程名称");
|
||||||
@@ -1418,6 +1426,7 @@ public class StudyCourseApi extends ApiBaseController{
|
|||||||
exportMap.put("作业状态", "作业状态");
|
exportMap.put("作业状态", "作业状态");
|
||||||
exportMap.put("作业成绩", "作业成绩");
|
exportMap.put("作业成绩", "作业成绩");
|
||||||
exportMap.put("完成时间", "完成时间");
|
exportMap.put("完成时间", "完成时间");
|
||||||
|
// 2.整理导出数据
|
||||||
// 查询课程名称
|
// 查询课程名称
|
||||||
StudyCourse studyCourse = new StudyCourse();
|
StudyCourse studyCourse = new StudyCourse();
|
||||||
studyCourse.setCourseId(courseId);
|
studyCourse.setCourseId(courseId);
|
||||||
@@ -1439,7 +1448,6 @@ public class StudyCourseApi extends ApiBaseController{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 查询特定作业信息
|
// 查询特定作业信息
|
||||||
List<StudyHomeWork> studyHomeWorks = studyHomeWorkService.getByCourseIdAndContentId(courseId, contentId);
|
List<StudyHomeWork> studyHomeWorks = studyHomeWorkService.getByCourseIdAndContentId(courseId, contentId);
|
||||||
// 通过studyHomeWorks中的人员id集合(去重),调用用户中心接口获取人员信息,填充部门字段
|
// 通过studyHomeWorks中的人员id集合(去重),调用用户中心接口获取人员信息,填充部门字段
|
||||||
@@ -1471,7 +1479,7 @@ public class StudyCourseApi extends ApiBaseController{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// 将作业信息与用户信息拼接为map
|
// 3.将作业信息与用户信息拼接为map
|
||||||
String finalContentName = contentName;
|
String finalContentName = contentName;
|
||||||
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<String, Object> map = new HashMap<>();
|
||||||
@@ -1500,11 +1508,86 @@ public class StudyCourseApi extends ApiBaseController{
|
|||||||
map.put("完成时间", hw.getEndTime());
|
map.put("完成时间", hw.getEndTime());
|
||||||
return map;
|
return map;
|
||||||
}).collect(Collectors.toList());
|
}).collect(Collectors.toList());
|
||||||
// 设置响应头信息
|
// 先将Excel数据写入临时文件
|
||||||
response.setContentType("application/octet-stream");
|
try (FileOutputStream excelOutputStream = new FileOutputStream(tempExcelFile)) {
|
||||||
response.setHeader("Content-disposition", "attachment;filename=HomeWorkRecord.xlsx");
|
ExportsExcelSenderUtil.exportDynamic(exportMap, dataList, excelOutputStream, "yyyy-MM-dd HH:mm:ss");
|
||||||
// 调用动态列excel导出接口
|
}
|
||||||
ExportsExcelSenderUtil.exportDynamic(exportMap, dataList, outputStream, "yyyy-MM-dd HH:mm:ss");
|
// 4.整理作业的附件信息备用
|
||||||
|
// 获取附件信息集合
|
||||||
|
Map<String, String> homeworkFiles = new HashMap<>();
|
||||||
|
String savePath = fileUploader.getSavePath();
|
||||||
|
for (StudyHomeWork studyHomeWork : studyHomeWorks) {
|
||||||
|
String filePath = studyHomeWork.getFilePath();
|
||||||
|
if (StringUtils.isNotBlank(filePath)) {
|
||||||
|
String fullPath = savePath + filePath;
|
||||||
|
log.info("【资源学习情况导出-作业信息】下载附件路径:{}", fullPath);
|
||||||
|
File file = new File(fullPath);
|
||||||
|
if (file.exists()) {
|
||||||
|
// 使用文件名作为zip中的条目名
|
||||||
|
String fileName = file.getName();
|
||||||
|
// 避免文件名冲突,如果已存在则添加序号
|
||||||
|
String zipEntryName = fileName;
|
||||||
|
int counter = 1;
|
||||||
|
while (homeworkFiles.containsKey(zipEntryName)) {
|
||||||
|
int dotIndex = fileName.lastIndexOf('.');
|
||||||
|
if (dotIndex > 0) {
|
||||||
|
zipEntryName = fileName.substring(0, dotIndex) + "_" + counter + fileName.substring(dotIndex);
|
||||||
|
} else {
|
||||||
|
zipEntryName = fileName + "_" + counter;
|
||||||
|
}
|
||||||
|
counter++;
|
||||||
|
}
|
||||||
|
homeworkFiles.put(zipEntryName, fullPath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 5.设置响应头信息为zip文件
|
||||||
|
response.setContentType("application/zip");
|
||||||
|
response.setHeader("Content-disposition", "attachment;filename=HomeWorkRecord.zip");
|
||||||
|
outputStream = response.getOutputStream();
|
||||||
|
// 6.把输出的附件和导出的excel文件拼接为一个zip导出
|
||||||
|
try (ZipOutputStream zos = new ZipOutputStream(outputStream)) {
|
||||||
|
// 添加Excel文件到zip
|
||||||
|
byte[] buffer = new byte[1024];
|
||||||
|
// 添加Excel文件
|
||||||
|
File excelFile = new File(tempExcelPath);
|
||||||
|
if (excelFile.exists()) {
|
||||||
|
FileInputStream fis = new FileInputStream(excelFile);
|
||||||
|
ZipEntry zipEntry = new ZipEntry("HomeWorkRecord.xlsx");
|
||||||
|
zos.putNextEntry(zipEntry);
|
||||||
|
int length;
|
||||||
|
while ((length = fis.read(buffer)) > 0) {
|
||||||
|
zos.write(buffer, 0, length);
|
||||||
|
}
|
||||||
|
zos.closeEntry();
|
||||||
|
fis.close();
|
||||||
|
}
|
||||||
|
// 添加作业附件文件
|
||||||
|
// 25.11.27标记:和技术沟通后,按业务此处调用频率不会过高,因此暂不采用多线程下载方案
|
||||||
|
// 为了防止命名冲突,附件放在zip的/附件目录下
|
||||||
|
// zip规范要求使用 正斜杠/作为路径分隔符,不要用File.separator(在windows上是\,会导致zip解压异常)
|
||||||
|
String zipFilePath = "附件/";
|
||||||
|
for (Map.Entry<String, String> entry : homeworkFiles.entrySet()) {
|
||||||
|
String zipEntryName = zipFilePath + entry.getKey();
|
||||||
|
String filePath = entry.getValue();
|
||||||
|
File file = new File(filePath);
|
||||||
|
if (file.exists()) {
|
||||||
|
FileInputStream fis = new FileInputStream(file);
|
||||||
|
ZipEntry zipEntry = new ZipEntry(zipEntryName);
|
||||||
|
zos.putNextEntry(zipEntry);
|
||||||
|
int len;
|
||||||
|
while ((len = fis.read(buffer)) > 0) {
|
||||||
|
zos.write(buffer, 0, len);
|
||||||
|
}
|
||||||
|
zos.closeEntry();
|
||||||
|
fis.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 删除临时Excel文件
|
||||||
|
if (tempExcelFile.exists()) {
|
||||||
|
tempExcelFile.delete();
|
||||||
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
log.error("【资源学习情况导出-作业信息】导出资源学习情况错误:{}", e.getMessage());
|
log.error("【资源学习情况导出-作业信息】导出资源学习情况错误:{}", e.getMessage());
|
||||||
} finally {
|
} finally {
|
||||||
|
|||||||
Reference in New Issue
Block a user