|
@@ -1,31 +1,5 @@
|
|
package com.qmth.teachcloud.mark.service.impl;
|
|
package com.qmth.teachcloud.mark.service.impl;
|
|
|
|
|
|
-import java.awt.*;
|
|
|
|
-import java.awt.color.ColorSpace;
|
|
|
|
-import java.awt.image.BufferedImage;
|
|
|
|
-import java.awt.image.ColorConvertOp;
|
|
|
|
-import java.io.*;
|
|
|
|
-import java.math.BigDecimal;
|
|
|
|
-import java.net.URLEncoder;
|
|
|
|
-import java.nio.charset.StandardCharsets;
|
|
|
|
-import java.util.*;
|
|
|
|
-import java.util.List;
|
|
|
|
-import java.util.stream.Collectors;
|
|
|
|
-
|
|
|
|
-import javax.annotation.Resource;
|
|
|
|
-import javax.imageio.ImageIO;
|
|
|
|
-import javax.servlet.ServletOutputStream;
|
|
|
|
-import javax.servlet.http.HttpServletResponse;
|
|
|
|
-import javax.validation.constraints.NotNull;
|
|
|
|
-
|
|
|
|
-import org.apache.commons.collections4.CollectionUtils;
|
|
|
|
-import org.apache.commons.io.FilenameUtils;
|
|
|
|
-import org.apache.commons.lang3.StringUtils;
|
|
|
|
-import org.springframework.beans.factory.annotation.Autowired;
|
|
|
|
-import org.springframework.stereotype.Service;
|
|
|
|
-import org.springframework.transaction.annotation.Transactional;
|
|
|
|
-import org.springframework.util.FileCopyUtils;
|
|
|
|
-
|
|
|
|
import com.alibaba.fastjson.JSON;
|
|
import com.alibaba.fastjson.JSON;
|
|
import com.alibaba.fastjson.JSONObject;
|
|
import com.alibaba.fastjson.JSONObject;
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
@@ -48,17 +22,13 @@ import com.qmth.boot.tools.io.ZipWriter;
|
|
import com.qmth.teachcloud.common.bean.dto.DataPermissionRule;
|
|
import com.qmth.teachcloud.common.bean.dto.DataPermissionRule;
|
|
import com.qmth.teachcloud.common.bean.vo.FilePathVo;
|
|
import com.qmth.teachcloud.common.bean.vo.FilePathVo;
|
|
import com.qmth.teachcloud.common.contant.SystemConstant;
|
|
import com.qmth.teachcloud.common.contant.SystemConstant;
|
|
-import com.qmth.teachcloud.common.entity.BasicExam;
|
|
|
|
-import com.qmth.teachcloud.common.entity.MarkQuestion;
|
|
|
|
-import com.qmth.teachcloud.common.entity.SysUser;
|
|
|
|
|
|
+import com.qmth.teachcloud.common.entity.*;
|
|
import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
|
|
import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
|
|
import com.qmth.teachcloud.common.enums.PageSizeEnum;
|
|
import com.qmth.teachcloud.common.enums.PageSizeEnum;
|
|
import com.qmth.teachcloud.common.enums.ScanStatus;
|
|
import com.qmth.teachcloud.common.enums.ScanStatus;
|
|
import com.qmth.teachcloud.common.enums.mark.MarkPaperStatus;
|
|
import com.qmth.teachcloud.common.enums.mark.MarkPaperStatus;
|
|
import com.qmth.teachcloud.common.enums.mark.SubjectiveStatus;
|
|
import com.qmth.teachcloud.common.enums.mark.SubjectiveStatus;
|
|
-import com.qmth.teachcloud.common.service.BasicRoleDataPermissionService;
|
|
|
|
-import com.qmth.teachcloud.common.service.FileUploadService;
|
|
|
|
-import com.qmth.teachcloud.common.service.TeachcloudCommonService;
|
|
|
|
|
|
+import com.qmth.teachcloud.common.service.*;
|
|
import com.qmth.teachcloud.common.util.*;
|
|
import com.qmth.teachcloud.common.util.*;
|
|
import com.qmth.teachcloud.mark.bean.UpdateTimeVo;
|
|
import com.qmth.teachcloud.mark.bean.UpdateTimeVo;
|
|
import com.qmth.teachcloud.mark.bean.archivescore.*;
|
|
import com.qmth.teachcloud.mark.bean.archivescore.*;
|
|
@@ -87,6 +57,30 @@ import com.qmth.teachcloud.mark.service.*;
|
|
import com.qmth.teachcloud.mark.utils.BatchGetDataUtil;
|
|
import com.qmth.teachcloud.mark.utils.BatchGetDataUtil;
|
|
import com.qmth.teachcloud.mark.utils.Calculator;
|
|
import com.qmth.teachcloud.mark.utils.Calculator;
|
|
import com.qmth.teachcloud.mark.utils.ScoreCalculateUtil;
|
|
import com.qmth.teachcloud.mark.utils.ScoreCalculateUtil;
|
|
|
|
+import org.apache.commons.collections4.CollectionUtils;
|
|
|
|
+import org.apache.commons.io.FilenameUtils;
|
|
|
|
+import org.apache.commons.lang3.StringUtils;
|
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
|
+import org.springframework.transaction.annotation.Transactional;
|
|
|
|
+import org.springframework.util.FileCopyUtils;
|
|
|
|
+
|
|
|
|
+import javax.annotation.Resource;
|
|
|
|
+import javax.imageio.ImageIO;
|
|
|
|
+import javax.servlet.ServletOutputStream;
|
|
|
|
+import javax.servlet.http.HttpServletResponse;
|
|
|
|
+import javax.validation.constraints.NotNull;
|
|
|
|
+import java.awt.*;
|
|
|
|
+import java.awt.color.ColorSpace;
|
|
|
|
+import java.awt.image.BufferedImage;
|
|
|
|
+import java.awt.image.ColorConvertOp;
|
|
|
|
+import java.io.*;
|
|
|
|
+import java.math.BigDecimal;
|
|
|
|
+import java.net.URLEncoder;
|
|
|
|
+import java.nio.charset.StandardCharsets;
|
|
|
|
+import java.util.List;
|
|
|
|
+import java.util.*;
|
|
|
|
+import java.util.stream.Collectors;
|
|
|
|
|
|
/**
|
|
/**
|
|
* <p>
|
|
* <p>
|
|
@@ -99,21 +93,20 @@ import com.qmth.teachcloud.mark.utils.ScoreCalculateUtil;
|
|
@Service
|
|
@Service
|
|
public class MarkStudentServiceImpl extends ServiceImpl<MarkStudentMapper, MarkStudent> implements MarkStudentService {
|
|
public class MarkStudentServiceImpl extends ServiceImpl<MarkStudentMapper, MarkStudent> implements MarkStudentService {
|
|
|
|
|
|
|
|
+ @Resource
|
|
|
|
+ private BasicCourseService basicCourseService;
|
|
|
|
+ @Resource
|
|
|
|
+ private BasicClazzService basicClazzService;
|
|
@Autowired
|
|
@Autowired
|
|
private MarkPaperService markPaperService;
|
|
private MarkPaperService markPaperService;
|
|
-
|
|
|
|
@Resource
|
|
@Resource
|
|
private MarkPaperPackageService markPaperPackageService;
|
|
private MarkPaperPackageService markPaperPackageService;
|
|
-
|
|
|
|
@Autowired
|
|
@Autowired
|
|
private ScanPackageService scanPackageService;
|
|
private ScanPackageService scanPackageService;
|
|
-
|
|
|
|
@Autowired
|
|
@Autowired
|
|
private ScanPaperService scanPaperService;
|
|
private ScanPaperService scanPaperService;
|
|
-
|
|
|
|
@Autowired
|
|
@Autowired
|
|
private ScanPaperPageService scanPaperPageService;
|
|
private ScanPaperPageService scanPaperPageService;
|
|
-
|
|
|
|
@Autowired
|
|
@Autowired
|
|
private ScanOmrTaskService scanOmrTaskService;
|
|
private ScanOmrTaskService scanOmrTaskService;
|
|
|
|
|
|
@@ -435,8 +428,7 @@ public class MarkStudentServiceImpl extends ServiceImpl<MarkStudentMapper, MarkS
|
|
}
|
|
}
|
|
|
|
|
|
@Override
|
|
@Override
|
|
- public MarkStudent findByExamIdAndCoursePaperIdAndStudentCode(Long examId, String coursePaperId,
|
|
|
|
- String studentCode) {
|
|
|
|
|
|
+ public MarkStudent findByExamIdAndCoursePaperIdAndStudentCode(Long examId, String coursePaperId, String studentCode) {
|
|
QueryWrapper<MarkStudent> wrapper = new QueryWrapper<>();
|
|
QueryWrapper<MarkStudent> wrapper = new QueryWrapper<>();
|
|
LambdaQueryWrapper<MarkStudent> lw = wrapper.lambda();
|
|
LambdaQueryWrapper<MarkStudent> lw = wrapper.lambda();
|
|
lw.eq(MarkStudent::getExamId, examId);
|
|
lw.eq(MarkStudent::getExamId, examId);
|
|
@@ -445,6 +437,20 @@ public class MarkStudentServiceImpl extends ServiceImpl<MarkStudentMapper, MarkS
|
|
return baseMapper.selectOne(wrapper);
|
|
return baseMapper.selectOne(wrapper);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ @Override
|
|
|
|
+ public MarkStudent findByExamIdAndPaperNumberAndStudentCode(Long examId, String paperNumber, String studentCode) {
|
|
|
|
+ QueryWrapper<MarkStudent> wrapper = new QueryWrapper<>();
|
|
|
|
+ LambdaQueryWrapper<MarkStudent> lw = wrapper.lambda();
|
|
|
|
+ lw.eq(MarkStudent::getExamId, examId);
|
|
|
|
+ lw.eq(MarkStudent::getPaperNumber, paperNumber);
|
|
|
|
+ if (StringUtils.isNotBlank(studentCode)) {
|
|
|
|
+ lw.eq(MarkStudent::getStudentCode, studentCode);
|
|
|
|
+ } else {
|
|
|
|
+ lw.last("limit 1");
|
|
|
|
+ }
|
|
|
|
+ return baseMapper.selectOne(wrapper);
|
|
|
|
+ }
|
|
|
|
+
|
|
@Override
|
|
@Override
|
|
public StudentObjectiveDetailDto getObjectiveInspectedTask(Long studentId) {
|
|
public StudentObjectiveDetailDto getObjectiveInspectedTask(Long studentId) {
|
|
MarkStudent markStudent = this.getById(studentId);
|
|
MarkStudent markStudent = this.getById(studentId);
|
|
@@ -1404,34 +1410,34 @@ public class MarkStudentServiceImpl extends ServiceImpl<MarkStudentMapper, MarkS
|
|
@Override
|
|
@Override
|
|
public void trackExport(Long examId, String coursePaperId, HttpServletResponse response) {
|
|
public void trackExport(Long examId, String coursePaperId, HttpServletResponse response) {
|
|
{
|
|
{
|
|
- List<MarkStudent> list = this.listByExamIdAndCoursePaperId(examId,coursePaperId);
|
|
|
|
|
|
+ List<MarkStudent> list = this.listByExamIdAndCoursePaperId(examId, coursePaperId);
|
|
if (CollectionUtils.isNotEmpty(list)) {
|
|
if (CollectionUtils.isNotEmpty(list)) {
|
|
try {
|
|
try {
|
|
- response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode("轨迹图.zip","UTF-8"));
|
|
|
|
|
|
+ response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode("轨迹图.zip", "UTF-8"));
|
|
ZipWriter writer = ZipWriter.create(response.getOutputStream());
|
|
ZipWriter writer = ZipWriter.create(response.getOutputStream());
|
|
ByteArrayOutputStream os = new ByteArrayOutputStream();
|
|
ByteArrayOutputStream os = new ByteArrayOutputStream();
|
|
- for (MarkStudent s:list) {
|
|
|
|
- if(!s.getUpload()){
|
|
|
|
|
|
+ for (MarkStudent s : list) {
|
|
|
|
+ if (!s.getUpload()) {
|
|
continue;
|
|
continue;
|
|
}
|
|
}
|
|
List<FilePathVo> vos = JSON.parseArray(s.getSheetPath(), FilePathVo.class);
|
|
List<FilePathVo> vos = JSON.parseArray(s.getSheetPath(), FilePathVo.class);
|
|
List<MarkTrack> trackList = markTrackService.listByStudentId(s.getId());
|
|
List<MarkTrack> trackList = markTrackService.listByStudentId(s.getId());
|
|
- Document document = new Document(new Rectangle(PageSize.A3.getHeight(),PageSize.A3.getWidth()));
|
|
|
|
|
|
+ Document document = new Document(new Rectangle(PageSize.A3.getHeight(), PageSize.A3.getWidth()));
|
|
// 本地保存目录
|
|
// 本地保存目录
|
|
File tempFile = SystemConstant.getFileTempParentDirVar(SystemConstant.TEMP_PREFIX);
|
|
File tempFile = SystemConstant.getFileTempParentDirVar(SystemConstant.TEMP_PREFIX);
|
|
- File file =new File(tempFile.getPath()+File.separator + s.getStudentCode()+".pdf");
|
|
|
|
- PdfWriter pdfWriter = PdfWriter.getInstance(document,new FileOutputStream(file));
|
|
|
|
|
|
+ File file = new File(tempFile.getPath() + File.separator + s.getStudentCode() + ".pdf");
|
|
|
|
+ PdfWriter pdfWriter = PdfWriter.getInstance(document, new FileOutputStream(file));
|
|
document.open();
|
|
document.open();
|
|
for (int i = 0; i < vos.size(); i++) {
|
|
for (int i = 0; i < vos.size(); i++) {
|
|
FilePathVo vo = vos.get(i);
|
|
FilePathVo vo = vos.get(i);
|
|
- File sheet = fileUploadService.downloadFile(JSON.toJSONString(vo),vo.getPath());
|
|
|
|
- File track = new File(tempFile.getPath()+File.separator + s.getStudentCode()+"-"+(i+1)+".jpg");
|
|
|
|
- int offsetIndex = i+1;
|
|
|
|
- List<MarkTrack> tracks = trackList.stream().filter(t->t.getOffsetIndex().equals(offsetIndex)).collect(Collectors.toList());
|
|
|
|
- this.createTrack(sheet,track,tracks);
|
|
|
|
|
|
+ File sheet = fileUploadService.downloadFile(JSON.toJSONString(vo), vo.getPath());
|
|
|
|
+ File track = new File(tempFile.getPath() + File.separator + s.getStudentCode() + "-" + (i + 1) + ".jpg");
|
|
|
|
+ int offsetIndex = i + 1;
|
|
|
|
+ List<MarkTrack> tracks = trackList.stream().filter(t -> t.getOffsetIndex().equals(offsetIndex)).collect(Collectors.toList());
|
|
|
|
+ this.createTrack(sheet, track, tracks);
|
|
Image image = Image.getInstance(track.getPath());
|
|
Image image = Image.getInstance(track.getPath());
|
|
- image.scaleAbsolute(PageSize.A3.getHeight()-100,PageSize.A3.getWidth()-100);
|
|
|
|
- if(i!=0){
|
|
|
|
|
|
+ image.scaleAbsolute(PageSize.A3.getHeight() - 100, PageSize.A3.getWidth() - 100);
|
|
|
|
+ if (i != 0) {
|
|
document.newPage();
|
|
document.newPage();
|
|
}
|
|
}
|
|
document.add(image);
|
|
document.add(image);
|
|
@@ -1440,10 +1446,10 @@ public class MarkStudentServiceImpl extends ServiceImpl<MarkStudentMapper, MarkS
|
|
}
|
|
}
|
|
document.close();
|
|
document.close();
|
|
pdfWriter.close();
|
|
pdfWriter.close();
|
|
- writer.write(file,s.getStudentCode()+".pdf");
|
|
|
|
|
|
+ writer.write(file, s.getStudentCode() + ".pdf");
|
|
}
|
|
}
|
|
writer.close();
|
|
writer.close();
|
|
- }catch (Exception e){
|
|
|
|
|
|
+ } catch (Exception e) {
|
|
e.printStackTrace();
|
|
e.printStackTrace();
|
|
throw new ParameterException("文件下载失败", e);
|
|
throw new ParameterException("文件下载失败", e);
|
|
}
|
|
}
|
|
@@ -1451,7 +1457,7 @@ public class MarkStudentServiceImpl extends ServiceImpl<MarkStudentMapper, MarkS
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- private void createTrack(File sheet, File track, List<MarkTrack> trackList)throws IOException {
|
|
|
|
|
|
+ private void createTrack(File sheet, File track, List<MarkTrack> trackList) throws IOException {
|
|
{
|
|
{
|
|
FileOutputStream output = null;
|
|
FileOutputStream output = null;
|
|
try {
|
|
try {
|
|
@@ -1487,30 +1493,71 @@ public class MarkStudentServiceImpl extends ServiceImpl<MarkStudentMapper, MarkS
|
|
|
|
|
|
@Override
|
|
@Override
|
|
public void sheetExport(Long examId, String coursePaperId, HttpServletResponse response) {
|
|
public void sheetExport(Long examId, String coursePaperId, HttpServletResponse response) {
|
|
- List<MarkStudent> list = this.listByExamIdAndCoursePaperId(examId,coursePaperId);
|
|
|
|
|
|
+ List<MarkStudent> list = this.listByExamIdAndCoursePaperId(examId, coursePaperId);
|
|
if (CollectionUtils.isNotEmpty(list)) {
|
|
if (CollectionUtils.isNotEmpty(list)) {
|
|
try {
|
|
try {
|
|
- response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode("原图.zip","UTF-8"));
|
|
|
|
|
|
+ response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode("原图.zip", "UTF-8"));
|
|
ZipWriter writer = ZipWriter.create(response.getOutputStream());
|
|
ZipWriter writer = ZipWriter.create(response.getOutputStream());
|
|
ByteArrayOutputStream os = new ByteArrayOutputStream();
|
|
ByteArrayOutputStream os = new ByteArrayOutputStream();
|
|
- for (MarkStudent s:list) {
|
|
|
|
- if(!s.getUpload()){
|
|
|
|
|
|
+ for (MarkStudent s : list) {
|
|
|
|
+ if (!s.getUpload()) {
|
|
continue;
|
|
continue;
|
|
}
|
|
}
|
|
List<FilePathVo> vos = JSON.parseArray(s.getSheetPath(), FilePathVo.class);
|
|
List<FilePathVo> vos = JSON.parseArray(s.getSheetPath(), FilePathVo.class);
|
|
for (int i = 0; i < vos.size(); i++) {
|
|
for (int i = 0; i < vos.size(); i++) {
|
|
FilePathVo vo = vos.get(i);
|
|
FilePathVo vo = vos.get(i);
|
|
- File file = fileUploadService.downloadFile(JSON.toJSONString(vo),vo.getPath());
|
|
|
|
|
|
+ File file = fileUploadService.downloadFile(JSON.toJSONString(vo), vo.getPath());
|
|
String format = FilenameUtils.getExtension(file.getName());
|
|
String format = FilenameUtils.getExtension(file.getName());
|
|
- writer.write(file, s.getStudentCode()+"-"+(i+1)+"."+format);
|
|
|
|
|
|
+ writer.write(file, s.getStudentCode() + "-" + (i + 1) + "." + format);
|
|
file.delete();
|
|
file.delete();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
writer.close();
|
|
writer.close();
|
|
- }catch (Exception e){
|
|
|
|
|
|
+ } catch (Exception e) {
|
|
e.printStackTrace();
|
|
e.printStackTrace();
|
|
throw new ParameterException("文件下载失败", e);
|
|
throw new ParameterException("文件下载失败", e);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public void updateByBasicExamStudent(BasicExamStudent basicExamStudent, Set<String> secretNumberSet) {
|
|
|
|
+ MarkStudent markStudent = this.findByExamIdAndPaperNumberAndStudentCode(basicExamStudent.getExamId(), basicExamStudent.getPaperNumber(), basicExamStudent.getStudentCode());
|
|
|
|
+ BasicCourse basicCourse = basicCourseService.getByCode(basicExamStudent.getCourseCode());
|
|
|
|
+ BasicClazz basicClazz = basicClazzService.getById(basicExamStudent.getClazzId());
|
|
|
|
+ if (markStudent == null) {
|
|
|
|
+ String coursePaperId = null;
|
|
|
|
+ MarkStudent markStudentPaperNumberLimit1 = this.findByExamIdAndPaperNumberAndStudentCode(basicExamStudent.getExamId(), basicExamStudent.getPaperNumber(), null);
|
|
|
|
+ if (markStudentPaperNumberLimit1 == null) {
|
|
|
|
+ coursePaperId = String.valueOf(System.currentTimeMillis());
|
|
|
|
+ } else {
|
|
|
|
+ coursePaperId = markStudentPaperNumberLimit1.getCoursePaperId();
|
|
|
|
+ }
|
|
|
|
+ markStudent = new MarkStudent(basicExamStudent.getId(), basicExamStudent.getExamId(), basicExamStudent.getCourseCode(), basicCourse.getName(), basicExamStudent.getPaperNumber(), coursePaperId, "A", basicExamStudent.getStudentCode(), basicExamStudent.getStudentName(), "", basicExamStudent.getExamPlace(), basicExamStudent.getExamRoom(), basicExamStudent.getCollege(), basicExamStudent.getMajor(), basicClazz.getClazzName(), basicExamStudent.getExamStartTime(), basicExamStudent.getExamEndTime(), basicExamStudent.getCreateId());
|
|
|
|
+ if (markStudent.getSecretNumber() == null) {
|
|
|
|
+ markStudent.randomSecretNumber();
|
|
|
|
+ while (secretNumberSet.contains(markStudent.getSecretNumber())
|
|
|
|
+ || this.countByExamIdAndSecretNumber(markStudent.getExamId(), markStudent.getSecretNumber()) > 0) {
|
|
|
|
+ markStudent.randomSecretNumber();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ markStudent.setStudentName(basicExamStudent.getStudentName());
|
|
|
|
+ markStudent.setCollege(basicExamStudent.getCollege());
|
|
|
|
+ markStudent.setMajorName(basicExamStudent.getMajor());
|
|
|
|
+ markStudent.setClassName(basicClazz.getClazzName());
|
|
|
|
+ markStudent.setExamPlace(basicExamStudent.getExamPlace());
|
|
|
|
+ markStudent.setExamRoom(basicExamStudent.getExamRoom());
|
|
|
|
+ }
|
|
|
|
+ this.saveOrUpdate(markStudent);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public void deleteByExamIdAndPaperNumberAndStudentCode(Long examId, String paperNumber, String studentCode) {
|
|
|
|
+ UpdateWrapper<MarkStudent> updateWrapper = new UpdateWrapper<>();
|
|
|
|
+ updateWrapper.lambda().eq(MarkStudent::getExamId, examId)
|
|
|
|
+ .eq(MarkStudent::getPaperNumber, paperNumber)
|
|
|
|
+ .eq(MarkStudent::getStudentCode, studentCode);
|
|
|
|
+ this.remove(updateWrapper);
|
|
|
|
+ }
|
|
}
|
|
}
|