haogh 10 ماه پیش
والد
کامیت
daba9035b0

+ 1 - 1
paper-library-business/src/main/java/com/qmth/paper/library/business/mapper/PaperLibraryMapper.java

@@ -29,7 +29,7 @@ public interface PaperLibraryMapper extends BaseMapper<PaperLibrary> {
 
     IPage<ScanStatResult> listScanStat(@Param("page") Page<ScanStatResult> page, @Param("schoolId") Long schoolId, @Param("scanDate") String scanDate, @Param("userId") Long userId);
 
-    int countScanStudentByScannerAndDate(@Param("createId") Long createId, @Param("scanDate") String scanDate);
+    int countScanStudentByScannerAndDate(@Param("schoolId") Long schoolId, @Param("createId") Long createId, @Param("scanDate") String scanDate);
 
     List<ScanStatExportResult> listScanStatExport(@Param("schoolId") Long schoolId, @Param("scanDateStr") String scanDateStr, @Param("userId") Long userId);
 

+ 52 - 52
paper-library-business/src/main/java/com/qmth/paper/library/business/service/PaperLibraryService.java

@@ -1,52 +1,52 @@
-package com.qmth.paper.library.business.service;
-
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.extension.service.IService;
-import com.qmth.paper.library.business.bean.result.PaperLibraryResult;
-import com.qmth.paper.library.business.bean.result.TaskStudentResult;
-import com.qmth.paper.library.business.bean.vo.RecognitionResultVo;
-import com.qmth.paper.library.business.entity.PaperLibrary;
-import com.qmth.paper.library.business.entity.PaperScanTask;
-import com.qmth.paper.library.common.bean.params.DownLoadPaperParams;
-import org.springframework.web.multipart.MultipartFile;
-
-import java.util.List;
-import java.util.Map;
-
-/**
- * <p>
- * 图片库 服务类
- * </p>
- */
-public interface PaperLibraryService extends IService<PaperLibrary> {
-
-    int countScanStudentCount(Long paperScanTaskId);
-
-    PaperLibraryResult listStudentPicture(Long paperScanTaskId, Long studentId);
-
-    int countScanCount(Long paperScanTaskId);
-
-    IPage<TaskStudentResult> pageStudent(Long examId, String courseCode, String studentCode, Integer pageNumber, Integer pageSize);
-
-    RecognitionResultVo recognition(PaperScanTask paperScanTask, String studentCode, MultipartFile file, Integer x, Integer y, Integer width, Integer height, Integer rotate);
-
-    List<Map> listMaxSequenceByPaperScanTaskId(Long paperScanTaskId);
-
-    void removeByPaperScanTaskId(Long paperScanTaskId);
-
-    boolean rebind(Long paperLibraryId, Long studentId);
-
-    int countByStudentId(Long studentId);
-
-    int countByPaperScanTaskId(Long paperScanTaskId);
-
-    int countScanStudentByScannerAndDate(Long createId, String scanDate);
-
-    List<String> listBatchNo(Long studentId);
-
-    boolean deletePicture(List<Long> paperLibraryIds);
-
-    boolean rotatePictureUpload(Long paperLibraryId, boolean isFront, Integer rotate);
-
-    Map<String, Object> pdfGenerate(DownLoadPaperParams params);
-}
+package com.qmth.paper.library.business.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.qmth.paper.library.business.bean.result.PaperLibraryResult;
+import com.qmth.paper.library.business.bean.result.TaskStudentResult;
+import com.qmth.paper.library.business.bean.vo.RecognitionResultVo;
+import com.qmth.paper.library.business.entity.PaperLibrary;
+import com.qmth.paper.library.business.entity.PaperScanTask;
+import com.qmth.paper.library.common.bean.params.DownLoadPaperParams;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 图片库 服务类
+ * </p>
+ */
+public interface PaperLibraryService extends IService<PaperLibrary> {
+
+    int countScanStudentCount(Long paperScanTaskId);
+
+    PaperLibraryResult listStudentPicture(Long paperScanTaskId, Long studentId);
+
+    int countScanCount(Long paperScanTaskId);
+
+    IPage<TaskStudentResult> pageStudent(Long examId, String courseCode, String studentCode, Integer pageNumber, Integer pageSize);
+
+    RecognitionResultVo recognition(PaperScanTask paperScanTask, String studentCode, MultipartFile file, Integer x, Integer y, Integer width, Integer height, Integer rotate);
+
+    List<Map> listMaxSequenceByPaperScanTaskId(Long paperScanTaskId);
+
+    void removeByPaperScanTaskId(Long paperScanTaskId);
+
+    boolean rebind(Long paperLibraryId, Long studentId);
+
+    int countByStudentId(Long studentId);
+
+    int countByPaperScanTaskId(Long paperScanTaskId);
+
+    int countScanStudentByScannerAndDate(Long schoolId, Long createId, String scanDate);
+
+    List<String> listBatchNo(Long studentId);
+
+    boolean deletePicture(List<Long> paperLibraryIds);
+
+    boolean rotatePictureUpload(Long paperLibraryId, boolean isFront, Integer rotate);
+
+    Map<String, Object> pdfGenerate(DownLoadPaperParams params);
+}

+ 469 - 469
paper-library-business/src/main/java/com/qmth/paper/library/business/service/impl/PaperLibraryServiceImpl.java

@@ -1,469 +1,469 @@
-package com.qmth.paper.library.business.service.impl;
-
-import com.alibaba.fastjson.JSON;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
-import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.qmth.boot.api.exception.ApiException;
-import com.qmth.paper.library.business.bean.result.PaperLibraryImageResult;
-import com.qmth.paper.library.business.bean.result.PaperLibraryResult;
-import com.qmth.paper.library.business.bean.result.TaskStudentResult;
-import com.qmth.paper.library.business.bean.vo.FilePathVo;
-import com.qmth.paper.library.business.bean.vo.PathSequenceVo;
-import com.qmth.paper.library.business.bean.vo.RecognitionResultVo;
-import com.qmth.paper.library.business.entity.PaperLibrary;
-import com.qmth.paper.library.business.entity.PaperScanTask;
-import com.qmth.paper.library.business.mapper.PaperLibraryMapper;
-import com.qmth.paper.library.business.service.*;
-import com.qmth.paper.library.business.templete.execute.AsyncGeneratePdfService;
-import com.qmth.paper.library.common.bean.dto.syssetting.SimpleObject;
-import com.qmth.paper.library.common.bean.params.DownLoadPaperParams;
-import com.qmth.paper.library.common.contant.SysSettingConstant;
-import com.qmth.paper.library.common.contant.SystemConstant;
-import com.qmth.paper.library.common.entity.*;
-import com.qmth.paper.library.common.enums.*;
-import com.qmth.paper.library.common.lock.LockService;
-import com.qmth.paper.library.common.lock.LockType;
-import com.qmth.paper.library.common.service.BasicSchoolService;
-import com.qmth.paper.library.common.service.BasicSemesterService;
-import com.qmth.paper.library.common.service.CommonCacheService;
-import com.qmth.paper.library.common.service.TBTaskService;
-import com.qmth.paper.library.common.util.*;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.io.FileUtils;
-import org.apache.commons.lang3.StringUtils;
-import org.json.JSONArray;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-import org.springframework.web.multipart.MultipartFile;
-
-import javax.annotation.Resource;
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Set;
-import java.util.stream.Collectors;
-
-/**
- * <p>
- * 图片库 服务实现类
- * </p>
- */
-@Service
-public class PaperLibraryServiceImpl extends ServiceImpl<PaperLibraryMapper, PaperLibrary> implements PaperLibraryService {
-
-    @Resource
-    private PaperScanTaskService paperScanTaskService;
-    @Resource
-    private BasicSchoolService basicSchoolService;
-    @Resource
-    private BasicExamService basicExamService;
-    @Resource
-    private BusinessCacheService businessCacheService;
-    @Resource
-    private BasicSemesterService basicSemesterService;
-    @Resource
-    private ExamStudentService examStudentService;
-    @Resource
-    private FileUploadService fileUploadService;
-    @Resource
-    private OcrUtil ocrUtil;
-    @Resource
-    private FileStoreUtil fileStoreUtil;
-    @Resource
-    private CommonCacheService commonCacheService;
-    @Resource
-    private LockService lockService;
-    @Resource
-    private TBTaskService tbTaskService;
-    @Resource
-    private AsyncGeneratePdfService asyncGeneratePdfService;
-
-    @Override
-    public int countScanStudentCount(Long paperScanTaskId) {
-        return this.baseMapper.countScanStudentCount(paperScanTaskId);
-    }
-
-    @Override
-    public PaperLibraryResult listStudentPicture(Long paperScanTaskId, Long studentId) {
-        PaperLibraryResult paperLibraryResult = new PaperLibraryResult();
-        ExamStudent examStudent = examStudentService.getById(studentId);
-        if (examStudent != null) {
-            paperLibraryResult.setStudentName(examStudent.getStudentName());
-            paperLibraryResult.setStudentCode(examStudent.getStudentCode());
-            paperLibraryResult.setCourseCode(examStudent.getCourseCode());
-            paperLibraryResult.setCourseName(examStudent.getCourseName());
-            paperLibraryResult.setCollegeName(examStudent.getCollegeName());
-            paperLibraryResult.setMajorName(examStudent.getMajorName());
-            paperLibraryResult.setClassName(examStudent.getClassName());
-            paperLibraryResult.setTeacher(examStudent.getTeacher());
-            paperLibraryResult.setTeachClass(examStudent.getTeachClass());
-            paperLibraryResult.setBindCount(examStudent.getBindCount());
-            paperLibraryResult.setScore(examStudent.getScore());
-        }
-
-        QueryWrapper<PaperLibrary> queryWrapper = new QueryWrapper<>();
-        queryWrapper.lambda().eq(paperScanTaskId != null, PaperLibrary::getPaperScanTaskId, paperScanTaskId)
-                .eq(PaperLibrary::getStudentId, studentId)
-                .orderByAsc(PaperLibrary::getSequence);
-        List<PaperLibrary> paperLibraryList = this.list(queryWrapper);
-
-        List<PaperLibraryImageResult> fileUrlList = new ArrayList<>();
-        for (PaperLibrary paperLibrary : paperLibraryList) {
-            if (StringUtils.isBlank(paperLibrary.getPath())) {
-                throw ExceptionResultEnum.ERROR.exception("未找到图片路径");
-            }
-            List<FilePathVo> objectList = JSON.parseArray(paperLibrary.getPath(), FilePathVo.class);
-            PaperLibraryImageResult paperLibraryImageResult = new PaperLibraryImageResult();
-            paperLibraryImageResult.setPaperLibraryId(paperLibrary.getId());
-            List<String> fileUrls = new ArrayList<>();
-            for (FilePathVo filePathVo : objectList) {
-                fileUrls.add(fileUploadService.filePreview(filePathVo));
-            }
-            paperLibraryImageResult.setFileUrls(fileUrls);
-            paperLibraryImageResult.setBatchNo(paperLibrary.getBatchNo());
-            fileUrlList.add(paperLibraryImageResult);
-        }
-        paperLibraryResult.setFileUrls(fileUrlList);
-        return paperLibraryResult;
-    }
-
-    @Override
-    public int countScanCount(Long paperScanTaskId) {
-        QueryWrapper<PaperLibrary> queryWrapper = new QueryWrapper<>();
-        queryWrapper.lambda().eq(PaperLibrary::getPaperScanTaskId, paperScanTaskId);
-        return this.count(queryWrapper);
-    }
-
-    @Override
-    public IPage<TaskStudentResult> pageStudent(Long examId, String courseCode, String studentCode, Integer pageNumber, Integer pageSize) {
-        Page<TaskStudentResult> ipage = new Page<>(pageNumber, pageSize);
-        return this.baseMapper.listByStudentCode(ipage, examId, courseCode, studentCode);
-    }
-
-    @Override
-    public RecognitionResultVo recognition(PaperScanTask paperScanTask, String studentCode, MultipartFile file, Integer x, Integer y, Integer width, Integer height, Integer rotate) {
-        RecognitionResultVo recognitionResultVo = new RecognitionResultVo(studentCode, null);
-        BasicSchool basicSchool = basicSchoolService.getById(paperScanTask.getSchoolId());
-        String courseNameCode = String.format("%s(%s)", paperScanTask.getCourseName(), paperScanTask.getCourseCode());
-        String cutRootPath = fileStoreUtil.buildPath(UploadFileEnum.CUT, true, basicSchool.getCode(), courseNameCode);
-        // 裁剪识别区图片
-        String fileName = file.getOriginalFilename();
-        String prefixFileName = fileName.substring(0, fileName.lastIndexOf("."));
-        String suffix = fileName.substring(fileName.lastIndexOf("."));
-        String nanoId = SystemConstant.getNanoId();
-        File outFile = new File(cutRootPath, "original" + File.separator + prefixFileName + "-" + nanoId + suffix);
-        if (!outFile.exists()) {
-            outFile.getParentFile().mkdirs();
-        }
-        File tempFile = SystemConstant.getFileTempDirVar(suffix);
-        try {
-            FileUtils.copyInputStreamToFile(file.getInputStream(), tempFile);
-            ImageUtil.subImg(tempFile, x, y, width, height, outFile);
-            if (outFile == null) {
-                return recognitionResultVo;
-            }
-        } catch (IOException e) {
-            throw new RuntimeException(e);
-        } finally {
-            if (tempFile.exists()) {
-                tempFile.delete();
-            }
-        }
-
-        // 旋转
-        File rotateOutFile = new File(cutRootPath, "rotate" + File.separator + prefixFileName + "-" + nanoId + suffix);
-        File rotateFile = ImageUtil.rotate(outFile, rotate, rotateOutFile);
-
-        List<String> stringList = new ArrayList<>();
-        String wordsResult = null;
-        String result = studentCode;
-        try {
-            if (StringUtils.isBlank(studentCode)) {
-                Map<String, SimpleObject> sysSetting = commonCacheService.getSysSetting(basicSchool.getId());
-                String type = sysSetting.get(SysSettingConstant.RECOGNITION_TYPE).getValue();
-                if (RecognitionTypeEnum.OCR.equals(type)) {
-                    org.json.JSONObject callHandwriting;
-                    if (rotateFile.exists()) {
-                        callHandwriting = ocrUtil.callHandwriting(rotateFile.getPath());
-                    } else {
-                        callHandwriting = ocrUtil.callHandwriting(outFile.getPath());
-                    }
-
-                    // 未联网提示
-                    if (!callHandwriting.has(SystemConstant.OCR_WORDS_RESULT)) {
-                        // ocr错误提示
-                        if (callHandwriting.has(SystemConstant.OCR_ERROR_MSG)) {
-                            throw ExceptionResultEnum.ERROR.exception(callHandwriting.getString(SystemConstant.OCR_ERROR_MSG));
-                        } else {
-                            throw ExceptionResultEnum.ERROR.exception("OCR识别异常,请检查网络是否连接或者关闭OCR识别");
-                        }
-                    }
-
-                    JSONArray jsonArray = callHandwriting.getJSONArray(SystemConstant.OCR_WORDS_RESULT);
-                    if (jsonArray.length() == 0) {
-                        throw ExceptionResultEnum.ERROR.exception("未正确识别出内容");
-                    } else {
-                        jsonArray.forEach(m -> {
-                            org.json.JSONObject object = (org.json.JSONObject) m;
-                            if (object.has(SystemConstant.OCR_WORDS)) {
-                                stringList.add(object.getString(SystemConstant.OCR_WORDS));
-                            }
-                        });
-                        wordsResult = String.join(",", stringList);
-
-                        //自动绑定,默认返回第一条
-                        result = stringList.get(0);
-                    }
-                } else if (RecognitionTypeEnum.BAR_CODE.equals(type)) {
-                    if (rotateFile.exists()) {
-                        result = BarCodeUtils.decode(rotateFile);
-                    } else {
-                        result = BarCodeUtils.decode(outFile);
-                    }
-                    wordsResult = result;
-                } else {
-                    throw ExceptionResultEnum.ERROR.exception("不支持的识别方式");
-                }
-            }
-        } catch (Exception e) {
-            wordsResult = e.getMessage();
-            throw ExceptionResultEnum.ERROR.exception("识别异常:" + e.getMessage());
-        } finally {
-            recognitionResultVo.setBindResult(result);
-            recognitionResultVo.setRecognizeResult(wordsResult);
-
-            if (rotateOutFile.exists()) {
-                rotateOutFile.delete();
-            }
-            if (rotateFile.exists()) {
-                rotateFile.delete();
-            }
-        }
-        return recognitionResultVo;
-    }
-
-    @Override
-    public List<Map> listMaxSequenceByPaperScanTaskId(Long paperScanTaskId) {
-        return this.baseMapper.listMaxSequenceByPaperScanTaskId(paperScanTaskId);
-    }
-
-    @Override
-    public void removeByPaperScanTaskId(Long paperScanTaskId) {
-        QueryWrapper<PaperLibrary> queryWrapper = new QueryWrapper<>();
-        queryWrapper.lambda().eq(PaperLibrary::getPaperScanTaskId, paperScanTaskId);
-        this.remove(queryWrapper);
-    }
-
-    @Transactional
-    @Override
-    public boolean rebind(Long paperLibraryId, Long studentId) {
-        PaperLibrary paperLibrary = this.getById(paperLibraryId);
-        if (paperLibrary == null) {
-            throw ExceptionResultEnum.ERROR.exception("图片数据不存在");
-        }
-        ExamStudent student = examStudentService.getById(studentId);
-        PaperScanTask task = paperScanTaskService.getByExamIdAndCourseCode(student.getExamId(), student.getCourseCode());
-        if (Objects.isNull(task)) {
-            throw ExceptionResultEnum.ERROR.exception("考生找不到扫描任务");
-        }
-
-        // 自己绑定自己,直接返回
-        if (paperLibrary.getStudentId() != null && paperLibrary.getStudentId().equals(studentId)) {
-            return true;
-        }
-        PathSequenceVo pathSequenceVo = null;
-        try {
-            // 将图片复制到学号目录下,并删除原图片
-            pathSequenceVo = copyImageToStudentCode(paperLibrary, studentId, UploadFileEnum.IMAGE);
-        } catch (Exception e) {
-            log.error("纠错操作复制图片失败");
-        }
-
-        // 更新绑定考生ID
-        UpdateWrapper<PaperLibrary> updateWrapper = new UpdateWrapper<>();
-        LambdaUpdateWrapper<PaperLibrary> lambda = updateWrapper.lambda();
-        lambda.set(PaperLibrary::getStudentId, studentId);
-        lambda.set(PaperLibrary::getPaperScanTaskId, task.getId());
-        if (pathSequenceVo != null) {
-            lambda.set(PaperLibrary::getPath, pathSequenceVo.getPath());
-            lambda.set(PaperLibrary::getSequence, pathSequenceVo.getSequence());
-        }
-        lambda.eq(PaperLibrary::getId, paperLibraryId);
-        this.update(updateWrapper);
-        // 更新考生绑定数量
-        if (paperLibrary.getStudentId() != null) {
-            examStudentService.updateBindCount(paperLibrary.getStudentId());
-            // 清除pdf文件记录
-            examStudentService.clearPdfFilePath(paperLibrary.getStudentId());
-        }
-        examStudentService.updateBindCount(studentId);
-        // 清除pdf文件记录
-        examStudentService.clearPdfFilePath(studentId);
-
-        //更新扫描任务扫描考生数量、扫描图片数量
-        paperScanTaskService.updateScanCount(paperLibrary.getPaperScanTaskId());
-        if(!task.getId().equals(paperLibrary.getPaperScanTaskId())) {
-            paperScanTaskService.updateScanCount(task.getId());
-        }
-        return true;
-    }
-
-    private PathSequenceVo copyImageToStudentCode(PaperLibrary paperLibrary, Long studentId, UploadFileEnum uploadFileEnum) {
-        PaperScanTask paperScanTask = paperScanTaskService.getById(paperLibrary.getPaperScanTaskId());
-        BasicSchool basicSchool = basicSchoolService.getById(paperScanTask.getSchoolId());
-        BasicExam basicExam = basicExamService.getById(paperScanTask.getExamId());
-        BasicSemester basicSemester = basicSemesterService.getById(basicExam.getSemesterId());
-        String courseNameCode = String.format("%s(%s)", paperScanTask.getCourseName(), paperScanTask.getCourseCode());
-        ExamStudent examStudent = examStudentService.getById(studentId);
-        String rootPath = fileStoreUtil.buildPath(UploadFileEnum.IMAGE, false, basicSchool.getName(), basicSemester.getName(), basicExam.getName(), courseNameCode);
-        if (StoreTypeEnum.ROOM.equals(paperScanTask.getStoreType())) {
-            rootPath = fileStoreUtil.buildPath(UploadFileEnum.IMAGE, false, basicSchool.getName(), basicSemester.getName(), basicExam.getName(), courseNameCode, examStudent.getExamRoom());
-        } else if (StoreTypeEnum.CLASS.equals(paperScanTask.getStoreType())) {
-            rootPath = fileStoreUtil.buildPath(UploadFileEnum.IMAGE, false, basicSchool.getName(), basicSemester.getName(), basicExam.getName(), courseNameCode, examStudent.getClassName());
-        } else if (StoreTypeEnum.COURSE.equals(paperScanTask.getStoreType())) {
-            rootPath = fileStoreUtil.buildPath(UploadFileEnum.IMAGE, false, basicSchool.getName(), basicSemester.getName(), basicExam.getName(), courseNameCode, examStudent.getStudentCode());
-        }
-        // 根目录
-        boolean isAllCopy = true;
-        List<FilePathVo> objects = new ArrayList<>();
-        int sequence = businessCacheService.getSequence(paperScanTask.getId(), examStudent.getStudentCode());
-        String sequenceStr = String.valueOf(sequence);
-        try {
-            int idx = 1;
-            String prefix = examStudent.getStudentCode() + "-" + sequenceStr;
-            List<FilePathVo> filePathVoList = JSON.parseArray(paperLibrary.getPath(), FilePathVo.class);
-            for (FilePathVo filePath : filePathVoList) {
-                String suffix = filePath.getPath().substring(filePath.getPath().lastIndexOf("."));
-                // 目标文件名
-                String dirName = rootPath + File.separator + prefix + "-" + idx + suffix;
-                File file = new File(dirName);
-                if (!file.exists()) {
-                    file.getParentFile().mkdirs();
-                    file.createNewFile();
-                }
-                boolean success = fileUploadService.copy(filePath.getPath(), dirName);
-                if (isAllCopy) {
-                    isAllCopy = success;
-                }
-                objects.add(new FilePathVo(dirName, uploadFileEnum, filePath.getType(), filePath.getMd5()));
-                idx++;
-            }
-            if (isAllCopy) {
-                for (FilePathVo filePathVo : filePathVoList) {
-                    fileUploadService.deleteFile(filePathVo.getPath());
-                }
-            }
-        } catch (Exception e) {
-            log.error(SystemConstant.LOG_ERROR, e);
-            if (e instanceof ApiException) {
-                ResultUtil.error((ApiException) e, e.getMessage());
-            } else {
-                ResultUtil.error(e.getMessage());
-            }
-        }
-        return isAllCopy ? new PathSequenceVo(JSON.toJSONString(objects), sequence) : null;
-    }
-
-    @Override
-    public int countByStudentId(Long studentId) {
-        QueryWrapper<PaperLibrary> queryWrapper = new QueryWrapper<>();
-        queryWrapper.lambda().eq(PaperLibrary::getStudentId, studentId);
-        return this.count(queryWrapper);
-    }
-
-    @Override
-    public int countByPaperScanTaskId(Long paperScanTaskId) {
-        QueryWrapper<PaperLibrary> queryWrapper = new QueryWrapper<>();
-        queryWrapper.lambda().eq(PaperLibrary::getPaperScanTaskId, paperScanTaskId);
-        return this.count(queryWrapper);
-    }
-
-    @Override
-    public int countScanStudentByScannerAndDate(Long createId, String scanDate) {
-        return baseMapper.countScanStudentByScannerAndDate(createId, scanDate);
-    }
-
-    @Override
-    public List<String> listBatchNo(Long studentId) {
-        List<String> list = baseMapper.listBatchNo(studentId);
-        return list.stream().filter(m -> StringUtils.isNotBlank(m)).collect(Collectors.toList());
-    }
-
-    @Transactional
-    @Override
-    public boolean deletePicture(List<Long> paperLibraryIds) {
-        List<PaperLibrary> paperLibraryList = this.listByIds(paperLibraryIds);
-        if (CollectionUtils.isEmpty(paperLibraryList)) {
-            throw ExceptionResultEnum.ERROR.exception("图片数据不存在");
-        }
-
-        // 删除后,重新统计绑定数量
-        if (this.removeByIds(paperLibraryIds)) {
-            Set<Long> studentIds = paperLibraryList.stream().filter(m->m.getStudentId() != null).map(PaperLibrary::getStudentId).collect(Collectors.toSet());
-            for (Long studentId : studentIds) {
-                examStudentService.updateBindCount(studentId);
-                // 清除pdf文件记录
-                examStudentService.clearPdfFilePath(studentId);
-            }
-        }
-        // 更新扫描任务扫描考生数、扫描图片数
-        Set<Long> paperScanTaskIds = paperLibraryList.stream().map(PaperLibrary::getPaperScanTaskId).collect(Collectors.toSet());
-        for (Long paperScanTaskId : paperScanTaskIds) {
-            paperScanTaskService.updateScanCount(paperScanTaskId);
-        }
-        return true;
-    }
-
-    @Override
-    public boolean rotatePictureUpload(Long paperLibraryId, boolean isFront, Integer rotate) {
-        File outputFile = null;
-        try {
-            lockService.waitlock(LockType.ROTATE_PICTURE, paperLibraryId, isFront);
-            PaperLibrary paperLibrary = this.getById(paperLibraryId);
-            if (paperLibrary == null) {
-                throw ExceptionResultEnum.ERROR.exception("图片数据不存在");
-            }
-            List<FilePathVo> filePathVoList = JSON.parseArray(paperLibrary.getPath(), FilePathVo.class);
-            if (CollectionUtils.isEmpty(filePathVoList) || filePathVoList.size() != 2) {
-                throw ExceptionResultEnum.ERROR.exception("图片路径数据错误");
-            }
-            // 取图片路径
-            FilePathVo filePathVo = filePathVoList.get(isFront ? 0 : 1);
-            // 旋转图片,并重新上传(文件名不变)
-            outputFile = SystemConstant.getFileTempVar(filePathVo.getPath().substring(filePathVo.getPath().lastIndexOf(SystemConstant.ORG_POINT)));
-            ImageUtil.rotate(fileUploadService.downloadInputStream(filePathVo.getPath(), filePathVo.getType()), rotate, outputFile);
-            if (outputFile.exists()) {
-                fileUploadService.uploadRotateFile(outputFile, filePathVo.getUploadType(), filePathVo.getPath());
-            }
-            return true;
-        } catch (Exception e) {
-            throw ExceptionResultEnum.ERROR.exception("旋转图片保存失败:" + e.getMessage());
-        } finally {
-            if (outputFile != null && outputFile.exists()) {
-                outputFile.delete();
-            }
-            lockService.unlock(LockType.ROTATE_PICTURE, paperLibraryId, isFront);
-        }
-    }
-
-    @Override
-    public Map<String, Object> pdfGenerate(DownLoadPaperParams params) {
-        SysUser user = (SysUser) ServletUtil.getRequestUser();
-        boolean lockFlag = lockService.trylock(LockType.STUDENT_PDF_GENERATE, user.getId());
-        if(!lockFlag) {
-            throw ExceptionResultEnum.ERROR.exception("已经在生成,在生成完成之前,不要重复生成");
-        }
-        String remark = JSON.toJSONString(params);
-        Map<String, Object> map = tbTaskService.saveTask(TaskTypeEnum.STUDENT_PDF_GENERATE, remark, (SysUser) ServletUtil.getRequestUser());
-        asyncGeneratePdfService.exportTask(map);
-        return map;
-    }
-
-}
+package com.qmth.paper.library.business.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qmth.boot.api.exception.ApiException;
+import com.qmth.paper.library.business.bean.result.PaperLibraryImageResult;
+import com.qmth.paper.library.business.bean.result.PaperLibraryResult;
+import com.qmth.paper.library.business.bean.result.TaskStudentResult;
+import com.qmth.paper.library.business.bean.vo.FilePathVo;
+import com.qmth.paper.library.business.bean.vo.PathSequenceVo;
+import com.qmth.paper.library.business.bean.vo.RecognitionResultVo;
+import com.qmth.paper.library.business.entity.PaperLibrary;
+import com.qmth.paper.library.business.entity.PaperScanTask;
+import com.qmth.paper.library.business.mapper.PaperLibraryMapper;
+import com.qmth.paper.library.business.service.*;
+import com.qmth.paper.library.business.templete.execute.AsyncGeneratePdfService;
+import com.qmth.paper.library.common.bean.dto.syssetting.SimpleObject;
+import com.qmth.paper.library.common.bean.params.DownLoadPaperParams;
+import com.qmth.paper.library.common.contant.SysSettingConstant;
+import com.qmth.paper.library.common.contant.SystemConstant;
+import com.qmth.paper.library.common.entity.*;
+import com.qmth.paper.library.common.enums.*;
+import com.qmth.paper.library.common.lock.LockService;
+import com.qmth.paper.library.common.lock.LockType;
+import com.qmth.paper.library.common.service.BasicSchoolService;
+import com.qmth.paper.library.common.service.BasicSemesterService;
+import com.qmth.paper.library.common.service.CommonCacheService;
+import com.qmth.paper.library.common.service.TBTaskService;
+import com.qmth.paper.library.common.util.*;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.json.JSONArray;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ * 图片库 服务实现类
+ * </p>
+ */
+@Service
+public class PaperLibraryServiceImpl extends ServiceImpl<PaperLibraryMapper, PaperLibrary> implements PaperLibraryService {
+
+    @Resource
+    private PaperScanTaskService paperScanTaskService;
+    @Resource
+    private BasicSchoolService basicSchoolService;
+    @Resource
+    private BasicExamService basicExamService;
+    @Resource
+    private BusinessCacheService businessCacheService;
+    @Resource
+    private BasicSemesterService basicSemesterService;
+    @Resource
+    private ExamStudentService examStudentService;
+    @Resource
+    private FileUploadService fileUploadService;
+    @Resource
+    private OcrUtil ocrUtil;
+    @Resource
+    private FileStoreUtil fileStoreUtil;
+    @Resource
+    private CommonCacheService commonCacheService;
+    @Resource
+    private LockService lockService;
+    @Resource
+    private TBTaskService tbTaskService;
+    @Resource
+    private AsyncGeneratePdfService asyncGeneratePdfService;
+
+    @Override
+    public int countScanStudentCount(Long paperScanTaskId) {
+        return this.baseMapper.countScanStudentCount(paperScanTaskId);
+    }
+
+    @Override
+    public PaperLibraryResult listStudentPicture(Long paperScanTaskId, Long studentId) {
+        PaperLibraryResult paperLibraryResult = new PaperLibraryResult();
+        ExamStudent examStudent = examStudentService.getById(studentId);
+        if (examStudent != null) {
+            paperLibraryResult.setStudentName(examStudent.getStudentName());
+            paperLibraryResult.setStudentCode(examStudent.getStudentCode());
+            paperLibraryResult.setCourseCode(examStudent.getCourseCode());
+            paperLibraryResult.setCourseName(examStudent.getCourseName());
+            paperLibraryResult.setCollegeName(examStudent.getCollegeName());
+            paperLibraryResult.setMajorName(examStudent.getMajorName());
+            paperLibraryResult.setClassName(examStudent.getClassName());
+            paperLibraryResult.setTeacher(examStudent.getTeacher());
+            paperLibraryResult.setTeachClass(examStudent.getTeachClass());
+            paperLibraryResult.setBindCount(examStudent.getBindCount());
+            paperLibraryResult.setScore(examStudent.getScore());
+        }
+
+        QueryWrapper<PaperLibrary> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().eq(paperScanTaskId != null, PaperLibrary::getPaperScanTaskId, paperScanTaskId)
+                .eq(PaperLibrary::getStudentId, studentId)
+                .orderByAsc(PaperLibrary::getSequence);
+        List<PaperLibrary> paperLibraryList = this.list(queryWrapper);
+
+        List<PaperLibraryImageResult> fileUrlList = new ArrayList<>();
+        for (PaperLibrary paperLibrary : paperLibraryList) {
+            if (StringUtils.isBlank(paperLibrary.getPath())) {
+                throw ExceptionResultEnum.ERROR.exception("未找到图片路径");
+            }
+            List<FilePathVo> objectList = JSON.parseArray(paperLibrary.getPath(), FilePathVo.class);
+            PaperLibraryImageResult paperLibraryImageResult = new PaperLibraryImageResult();
+            paperLibraryImageResult.setPaperLibraryId(paperLibrary.getId());
+            List<String> fileUrls = new ArrayList<>();
+            for (FilePathVo filePathVo : objectList) {
+                fileUrls.add(fileUploadService.filePreview(filePathVo));
+            }
+            paperLibraryImageResult.setFileUrls(fileUrls);
+            paperLibraryImageResult.setBatchNo(paperLibrary.getBatchNo());
+            fileUrlList.add(paperLibraryImageResult);
+        }
+        paperLibraryResult.setFileUrls(fileUrlList);
+        return paperLibraryResult;
+    }
+
+    @Override
+    public int countScanCount(Long paperScanTaskId) {
+        QueryWrapper<PaperLibrary> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().eq(PaperLibrary::getPaperScanTaskId, paperScanTaskId);
+        return this.count(queryWrapper);
+    }
+
+    @Override
+    public IPage<TaskStudentResult> pageStudent(Long examId, String courseCode, String studentCode, Integer pageNumber, Integer pageSize) {
+        Page<TaskStudentResult> ipage = new Page<>(pageNumber, pageSize);
+        return this.baseMapper.listByStudentCode(ipage, examId, courseCode, studentCode);
+    }
+
+    @Override
+    public RecognitionResultVo recognition(PaperScanTask paperScanTask, String studentCode, MultipartFile file, Integer x, Integer y, Integer width, Integer height, Integer rotate) {
+        RecognitionResultVo recognitionResultVo = new RecognitionResultVo(studentCode, null);
+        BasicSchool basicSchool = basicSchoolService.getById(paperScanTask.getSchoolId());
+        String courseNameCode = String.format("%s(%s)", paperScanTask.getCourseName(), paperScanTask.getCourseCode());
+        String cutRootPath = fileStoreUtil.buildPath(UploadFileEnum.CUT, true, basicSchool.getCode(), courseNameCode);
+        // 裁剪识别区图片
+        String fileName = file.getOriginalFilename();
+        String prefixFileName = fileName.substring(0, fileName.lastIndexOf("."));
+        String suffix = fileName.substring(fileName.lastIndexOf("."));
+        String nanoId = SystemConstant.getNanoId();
+        File outFile = new File(cutRootPath, "original" + File.separator + prefixFileName + "-" + nanoId + suffix);
+        if (!outFile.exists()) {
+            outFile.getParentFile().mkdirs();
+        }
+        File tempFile = SystemConstant.getFileTempDirVar(suffix);
+        try {
+            FileUtils.copyInputStreamToFile(file.getInputStream(), tempFile);
+            ImageUtil.subImg(tempFile, x, y, width, height, outFile);
+            if (outFile == null) {
+                return recognitionResultVo;
+            }
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        } finally {
+            if (tempFile.exists()) {
+                tempFile.delete();
+            }
+        }
+
+        // 旋转
+        File rotateOutFile = new File(cutRootPath, "rotate" + File.separator + prefixFileName + "-" + nanoId + suffix);
+        File rotateFile = ImageUtil.rotate(outFile, rotate, rotateOutFile);
+
+        List<String> stringList = new ArrayList<>();
+        String wordsResult = null;
+        String result = studentCode;
+        try {
+            if (StringUtils.isBlank(studentCode)) {
+                Map<String, SimpleObject> sysSetting = commonCacheService.getSysSetting(basicSchool.getId());
+                String type = sysSetting.get(SysSettingConstant.RECOGNITION_TYPE).getValue();
+                if (RecognitionTypeEnum.OCR.equals(type)) {
+                    org.json.JSONObject callHandwriting;
+                    if (rotateFile.exists()) {
+                        callHandwriting = ocrUtil.callHandwriting(rotateFile.getPath());
+                    } else {
+                        callHandwriting = ocrUtil.callHandwriting(outFile.getPath());
+                    }
+
+                    // 未联网提示
+                    if (!callHandwriting.has(SystemConstant.OCR_WORDS_RESULT)) {
+                        // ocr错误提示
+                        if (callHandwriting.has(SystemConstant.OCR_ERROR_MSG)) {
+                            throw ExceptionResultEnum.ERROR.exception(callHandwriting.getString(SystemConstant.OCR_ERROR_MSG));
+                        } else {
+                            throw ExceptionResultEnum.ERROR.exception("OCR识别异常,请检查网络是否连接或者关闭OCR识别");
+                        }
+                    }
+
+                    JSONArray jsonArray = callHandwriting.getJSONArray(SystemConstant.OCR_WORDS_RESULT);
+                    if (jsonArray.length() == 0) {
+                        throw ExceptionResultEnum.ERROR.exception("未正确识别出内容");
+                    } else {
+                        jsonArray.forEach(m -> {
+                            org.json.JSONObject object = (org.json.JSONObject) m;
+                            if (object.has(SystemConstant.OCR_WORDS)) {
+                                stringList.add(object.getString(SystemConstant.OCR_WORDS));
+                            }
+                        });
+                        wordsResult = String.join(",", stringList);
+
+                        //自动绑定,默认返回第一条
+                        result = stringList.get(0);
+                    }
+                } else if (RecognitionTypeEnum.BAR_CODE.equals(type)) {
+                    if (rotateFile.exists()) {
+                        result = BarCodeUtils.decode(rotateFile);
+                    } else {
+                        result = BarCodeUtils.decode(outFile);
+                    }
+                    wordsResult = result;
+                } else {
+                    throw ExceptionResultEnum.ERROR.exception("不支持的识别方式");
+                }
+            }
+        } catch (Exception e) {
+            wordsResult = e.getMessage();
+            throw ExceptionResultEnum.ERROR.exception("识别异常:" + e.getMessage());
+        } finally {
+            recognitionResultVo.setBindResult(result);
+            recognitionResultVo.setRecognizeResult(wordsResult);
+
+            if (rotateOutFile.exists()) {
+                rotateOutFile.delete();
+            }
+            if (rotateFile.exists()) {
+                rotateFile.delete();
+            }
+        }
+        return recognitionResultVo;
+    }
+
+    @Override
+    public List<Map> listMaxSequenceByPaperScanTaskId(Long paperScanTaskId) {
+        return this.baseMapper.listMaxSequenceByPaperScanTaskId(paperScanTaskId);
+    }
+
+    @Override
+    public void removeByPaperScanTaskId(Long paperScanTaskId) {
+        QueryWrapper<PaperLibrary> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().eq(PaperLibrary::getPaperScanTaskId, paperScanTaskId);
+        this.remove(queryWrapper);
+    }
+
+    @Transactional
+    @Override
+    public boolean rebind(Long paperLibraryId, Long studentId) {
+        PaperLibrary paperLibrary = this.getById(paperLibraryId);
+        if (paperLibrary == null) {
+            throw ExceptionResultEnum.ERROR.exception("图片数据不存在");
+        }
+        ExamStudent student = examStudentService.getById(studentId);
+        PaperScanTask task = paperScanTaskService.getByExamIdAndCourseCode(student.getExamId(), student.getCourseCode());
+        if (Objects.isNull(task)) {
+            throw ExceptionResultEnum.ERROR.exception("考生找不到扫描任务");
+        }
+
+        // 自己绑定自己,直接返回
+        if (paperLibrary.getStudentId() != null && paperLibrary.getStudentId().equals(studentId)) {
+            return true;
+        }
+        PathSequenceVo pathSequenceVo = null;
+        try {
+            // 将图片复制到学号目录下,并删除原图片
+            pathSequenceVo = copyImageToStudentCode(paperLibrary, studentId, UploadFileEnum.IMAGE);
+        } catch (Exception e) {
+            log.error("纠错操作复制图片失败");
+        }
+
+        // 更新绑定考生ID
+        UpdateWrapper<PaperLibrary> updateWrapper = new UpdateWrapper<>();
+        LambdaUpdateWrapper<PaperLibrary> lambda = updateWrapper.lambda();
+        lambda.set(PaperLibrary::getStudentId, studentId);
+        lambda.set(PaperLibrary::getPaperScanTaskId, task.getId());
+        if (pathSequenceVo != null) {
+            lambda.set(PaperLibrary::getPath, pathSequenceVo.getPath());
+            lambda.set(PaperLibrary::getSequence, pathSequenceVo.getSequence());
+        }
+        lambda.eq(PaperLibrary::getId, paperLibraryId);
+        this.update(updateWrapper);
+        // 更新考生绑定数量
+        if (paperLibrary.getStudentId() != null) {
+            examStudentService.updateBindCount(paperLibrary.getStudentId());
+            // 清除pdf文件记录
+            examStudentService.clearPdfFilePath(paperLibrary.getStudentId());
+        }
+        examStudentService.updateBindCount(studentId);
+        // 清除pdf文件记录
+        examStudentService.clearPdfFilePath(studentId);
+
+        //更新扫描任务扫描考生数量、扫描图片数量
+        paperScanTaskService.updateScanCount(paperLibrary.getPaperScanTaskId());
+        if(!task.getId().equals(paperLibrary.getPaperScanTaskId())) {
+            paperScanTaskService.updateScanCount(task.getId());
+        }
+        return true;
+    }
+
+    private PathSequenceVo copyImageToStudentCode(PaperLibrary paperLibrary, Long studentId, UploadFileEnum uploadFileEnum) {
+        PaperScanTask paperScanTask = paperScanTaskService.getById(paperLibrary.getPaperScanTaskId());
+        BasicSchool basicSchool = basicSchoolService.getById(paperScanTask.getSchoolId());
+        BasicExam basicExam = basicExamService.getById(paperScanTask.getExamId());
+        BasicSemester basicSemester = basicSemesterService.getById(basicExam.getSemesterId());
+        String courseNameCode = String.format("%s(%s)", paperScanTask.getCourseName(), paperScanTask.getCourseCode());
+        ExamStudent examStudent = examStudentService.getById(studentId);
+        String rootPath = fileStoreUtil.buildPath(UploadFileEnum.IMAGE, false, basicSchool.getName(), basicSemester.getName(), basicExam.getName(), courseNameCode);
+        if (StoreTypeEnum.ROOM.equals(paperScanTask.getStoreType())) {
+            rootPath = fileStoreUtil.buildPath(UploadFileEnum.IMAGE, false, basicSchool.getName(), basicSemester.getName(), basicExam.getName(), courseNameCode, examStudent.getExamRoom());
+        } else if (StoreTypeEnum.CLASS.equals(paperScanTask.getStoreType())) {
+            rootPath = fileStoreUtil.buildPath(UploadFileEnum.IMAGE, false, basicSchool.getName(), basicSemester.getName(), basicExam.getName(), courseNameCode, examStudent.getClassName());
+        } else if (StoreTypeEnum.COURSE.equals(paperScanTask.getStoreType())) {
+            rootPath = fileStoreUtil.buildPath(UploadFileEnum.IMAGE, false, basicSchool.getName(), basicSemester.getName(), basicExam.getName(), courseNameCode, examStudent.getStudentCode());
+        }
+        // 根目录
+        boolean isAllCopy = true;
+        List<FilePathVo> objects = new ArrayList<>();
+        int sequence = businessCacheService.getSequence(paperScanTask.getId(), examStudent.getStudentCode());
+        String sequenceStr = String.valueOf(sequence);
+        try {
+            int idx = 1;
+            String prefix = examStudent.getStudentCode() + "-" + sequenceStr;
+            List<FilePathVo> filePathVoList = JSON.parseArray(paperLibrary.getPath(), FilePathVo.class);
+            for (FilePathVo filePath : filePathVoList) {
+                String suffix = filePath.getPath().substring(filePath.getPath().lastIndexOf("."));
+                // 目标文件名
+                String dirName = rootPath + File.separator + prefix + "-" + idx + suffix;
+                File file = new File(dirName);
+                if (!file.exists()) {
+                    file.getParentFile().mkdirs();
+                    file.createNewFile();
+                }
+                boolean success = fileUploadService.copy(filePath.getPath(), dirName);
+                if (isAllCopy) {
+                    isAllCopy = success;
+                }
+                objects.add(new FilePathVo(dirName, uploadFileEnum, filePath.getType(), filePath.getMd5()));
+                idx++;
+            }
+            if (isAllCopy) {
+                for (FilePathVo filePathVo : filePathVoList) {
+                    fileUploadService.deleteFile(filePathVo.getPath());
+                }
+            }
+        } catch (Exception e) {
+            log.error(SystemConstant.LOG_ERROR, e);
+            if (e instanceof ApiException) {
+                ResultUtil.error((ApiException) e, e.getMessage());
+            } else {
+                ResultUtil.error(e.getMessage());
+            }
+        }
+        return isAllCopy ? new PathSequenceVo(JSON.toJSONString(objects), sequence) : null;
+    }
+
+    @Override
+    public int countByStudentId(Long studentId) {
+        QueryWrapper<PaperLibrary> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().eq(PaperLibrary::getStudentId, studentId);
+        return this.count(queryWrapper);
+    }
+
+    @Override
+    public int countByPaperScanTaskId(Long paperScanTaskId) {
+        QueryWrapper<PaperLibrary> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().eq(PaperLibrary::getPaperScanTaskId, paperScanTaskId);
+        return this.count(queryWrapper);
+    }
+
+    @Override
+    public int countScanStudentByScannerAndDate(Long schoolId, Long createId, String scanDate) {
+        return baseMapper.countScanStudentByScannerAndDate(schoolId, createId, scanDate);
+    }
+
+    @Override
+    public List<String> listBatchNo(Long studentId) {
+        List<String> list = baseMapper.listBatchNo(studentId);
+        return list.stream().filter(m -> StringUtils.isNotBlank(m)).collect(Collectors.toList());
+    }
+
+    @Transactional
+    @Override
+    public boolean deletePicture(List<Long> paperLibraryIds) {
+        List<PaperLibrary> paperLibraryList = this.listByIds(paperLibraryIds);
+        if (CollectionUtils.isEmpty(paperLibraryList)) {
+            throw ExceptionResultEnum.ERROR.exception("图片数据不存在");
+        }
+
+        // 删除后,重新统计绑定数量
+        if (this.removeByIds(paperLibraryIds)) {
+            Set<Long> studentIds = paperLibraryList.stream().filter(m->m.getStudentId() != null).map(PaperLibrary::getStudentId).collect(Collectors.toSet());
+            for (Long studentId : studentIds) {
+                examStudentService.updateBindCount(studentId);
+                // 清除pdf文件记录
+                examStudentService.clearPdfFilePath(studentId);
+            }
+        }
+        // 更新扫描任务扫描考生数、扫描图片数
+        Set<Long> paperScanTaskIds = paperLibraryList.stream().map(PaperLibrary::getPaperScanTaskId).collect(Collectors.toSet());
+        for (Long paperScanTaskId : paperScanTaskIds) {
+            paperScanTaskService.updateScanCount(paperScanTaskId);
+        }
+        return true;
+    }
+
+    @Override
+    public boolean rotatePictureUpload(Long paperLibraryId, boolean isFront, Integer rotate) {
+        File outputFile = null;
+        try {
+            lockService.waitlock(LockType.ROTATE_PICTURE, paperLibraryId, isFront);
+            PaperLibrary paperLibrary = this.getById(paperLibraryId);
+            if (paperLibrary == null) {
+                throw ExceptionResultEnum.ERROR.exception("图片数据不存在");
+            }
+            List<FilePathVo> filePathVoList = JSON.parseArray(paperLibrary.getPath(), FilePathVo.class);
+            if (CollectionUtils.isEmpty(filePathVoList) || filePathVoList.size() != 2) {
+                throw ExceptionResultEnum.ERROR.exception("图片路径数据错误");
+            }
+            // 取图片路径
+            FilePathVo filePathVo = filePathVoList.get(isFront ? 0 : 1);
+            // 旋转图片,并重新上传(文件名不变)
+            outputFile = SystemConstant.getFileTempVar(filePathVo.getPath().substring(filePathVo.getPath().lastIndexOf(SystemConstant.ORG_POINT)));
+            ImageUtil.rotate(fileUploadService.downloadInputStream(filePathVo.getPath(), filePathVo.getType()), rotate, outputFile);
+            if (outputFile.exists()) {
+                fileUploadService.uploadRotateFile(outputFile, filePathVo.getUploadType(), filePathVo.getPath());
+            }
+            return true;
+        } catch (Exception e) {
+            throw ExceptionResultEnum.ERROR.exception("旋转图片保存失败:" + e.getMessage());
+        } finally {
+            if (outputFile != null && outputFile.exists()) {
+                outputFile.delete();
+            }
+            lockService.unlock(LockType.ROTATE_PICTURE, paperLibraryId, isFront);
+        }
+    }
+
+    @Override
+    public Map<String, Object> pdfGenerate(DownLoadPaperParams params) {
+        SysUser user = (SysUser) ServletUtil.getRequestUser();
+        boolean lockFlag = lockService.trylock(LockType.STUDENT_PDF_GENERATE, user.getId());
+        if(!lockFlag) {
+            throw ExceptionResultEnum.ERROR.exception("已经在生成,在生成完成之前,不要重复生成");
+        }
+        String remark = JSON.toJSONString(params);
+        Map<String, Object> map = tbTaskService.saveTask(TaskTypeEnum.STUDENT_PDF_GENERATE, remark, (SysUser) ServletUtil.getRequestUser());
+        asyncGeneratePdfService.exportTask(map);
+        return map;
+    }
+
+}

+ 114 - 110
paper-library-business/src/main/java/com/qmth/paper/library/business/service/impl/PaperScanStatServiceImpl.java

@@ -1,110 +1,114 @@
-package com.qmth.paper.library.business.service.impl;
-
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.qmth.paper.library.business.bean.result.ScanStatExportResult;
-import com.qmth.paper.library.business.bean.result.ScanStatResult;
-import com.qmth.paper.library.business.entity.PaperLibrary;
-import com.qmth.paper.library.business.mapper.PaperLibraryMapper;
-import com.qmth.paper.library.business.service.PaperLibraryService;
-import com.qmth.paper.library.business.service.PaperScanStatService;
-import com.qmth.paper.library.common.contant.SystemConstant;
-import com.qmth.paper.library.common.entity.SysUser;
-import com.qmth.paper.library.common.service.SysUserService;
-import com.qmth.paper.library.common.util.ServletUtil;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.commons.lang3.time.DateFormatUtils;
-import org.apache.commons.lang3.time.DateUtils;
-import org.jetbrains.annotations.Nullable;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.stereotype.Service;
-
-import javax.annotation.Resource;
-import java.text.ParseException;
-import java.util.Date;
-import java.util.List;
-
-@Service
-public class PaperScanStatServiceImpl extends ServiceImpl<PaperLibraryMapper, PaperLibrary> implements PaperScanStatService {
-
-    private final Logger logger = LoggerFactory.getLogger(PaperScanStatServiceImpl.class);
-
-    @Resource
-    private PaperLibraryService paperLibraryService;
-
-    @Resource
-    private SysUserService sysUserService;
-
-    @Override
-    public IPage<ScanStatResult> pageScanStat(Long scanDate, String scanner, Integer pageNumber, Integer pageSize) {
-        Long schoolId = Long.valueOf(ServletUtil.getRequestHeaderSchoolId().toString());
-        //日期转换
-        String scanDateStr = null;
-        if(scanDate != null && scanDate > 0) {
-            scanDateStr = DateFormatUtils.format(scanDate, SystemConstant.SHORT_DATE_PATTERN);
-        }
-
-        //获取查询条件中的用户
-        Long userId = getUserId(scanner);
-
-        IPage<ScanStatResult> scanStatPage = baseMapper.listScanStat(new Page<>(pageNumber, pageSize), schoolId, scanDateStr, userId);
-//        for (ScanStatResult scanStatResult : scanStatPage.getRecords()) {
-//            //设置扫描学生数
-////            int studentCount = paperLibraryService.countScanStudentByScannerAndDate(scanStatResult.getCreateId(), scanStatResult.getScanDateStr());
-////            scanStatResult.setStudentCount(studentCount);
-//            scanStatResult.setScanDate(getLongDate(scanStatResult.getScanDateStr()));
-//        }
-        return scanStatPage;
-    }
-
-    @Override
-    public List<ScanStatExportResult> listScanStat(Long scanDate, String scanner) {
-        Long schoolId = Long.valueOf(ServletUtil.getRequestHeaderSchoolId().toString());
-        String scanDateStr = null;
-        if(scanDate != null && scanDate > 0) {
-            scanDateStr = DateFormatUtils.format(scanDate, SystemConstant.SHORT_DATE_PATTERN);
-        }
-
-        //获取查询条件中的用户
-        Long userId = getUserId(scanner);
-
-        List<ScanStatExportResult> scanStatList = baseMapper.listScanStatExport(schoolId, scanDateStr, userId);
-        for(ScanStatExportResult scanStatExportResult : scanStatList) {
-            //设置扫描学生数
-            int studentCount = paperLibraryService.countScanStudentByScannerAndDate(scanStatExportResult.getCreateId(), scanStatExportResult.getScanDateStr());
-            scanStatExportResult.setStudentCount(studentCount);
-        }
-
-        return scanStatList;
-    }
-
-    private @Nullable Long getUserId(String scanner) {
-        Long userId = null;
-        if (StringUtils.isNotEmpty(scanner)) {
-            LambdaQueryWrapper<SysUser> queryWrapper = new LambdaQueryWrapper<>();
-            queryWrapper.eq(SysUser::getLoginName, scanner.trim());
-            SysUser user = sysUserService.getOne(queryWrapper);
-            if (user != null) {
-                userId = user.getId();
-            } else {
-                userId = -1L;
-            }
-        }
-        return userId;
-    }
-
-    private Long getLongDate(String dateStr) {
-        Date date;
-        try {
-            date = DateUtils.parseDate(dateStr+" 00:00:00", SystemConstant.DEFAULT_DATE_PATTERN);
-        } catch (ParseException e) {
-            logger.error(String.format("[扫描统计管理]日期转换失败,dateStr:%s", dateStr), e);
-            return null;
-        }
-        return date.getTime();
-    }
-
-}
+package com.qmth.paper.library.business.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qmth.paper.library.business.bean.result.ScanStatExportResult;
+import com.qmth.paper.library.business.bean.result.ScanStatResult;
+import com.qmth.paper.library.business.entity.PaperLibrary;
+import com.qmth.paper.library.business.mapper.PaperLibraryMapper;
+import com.qmth.paper.library.business.service.PaperLibraryService;
+import com.qmth.paper.library.business.service.PaperScanStatService;
+import com.qmth.paper.library.common.contant.SystemConstant;
+import com.qmth.paper.library.common.entity.SysUser;
+import com.qmth.paper.library.common.service.SysUserService;
+import com.qmth.paper.library.common.util.ServletUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.time.DateFormatUtils;
+import org.apache.commons.lang3.time.DateUtils;
+import org.jetbrains.annotations.Nullable;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.text.ParseException;
+import java.util.Date;
+import java.util.List;
+import java.util.Objects;
+
+@Service
+public class PaperScanStatServiceImpl extends ServiceImpl<PaperLibraryMapper, PaperLibrary> implements PaperScanStatService {
+
+    private final Logger logger = LoggerFactory.getLogger(PaperScanStatServiceImpl.class);
+
+    @Resource
+    private PaperLibraryService paperLibraryService;
+
+    @Resource
+    private SysUserService sysUserService;
+
+    @Override
+    public IPage<ScanStatResult> pageScanStat(Long scanDate, String scanner, Integer pageNumber, Integer pageSize) {
+        Long schoolId = Long.valueOf(ServletUtil.getRequestHeaderSchoolId().toString());
+        //日期转换
+        String scanDateStr = null;
+        if(scanDate != null && scanDate > 0) {
+            scanDateStr = DateFormatUtils.format(scanDate, SystemConstant.SHORT_DATE_PATTERN);
+        }
+
+        //获取查询条件中的用户
+        Long userId = getUserId(scanner);
+
+        IPage<ScanStatResult> scanStatPage = baseMapper.listScanStat(new Page<>(pageNumber, pageSize), schoolId, scanDateStr, userId);
+        for (ScanStatResult scanStatResult : scanStatPage.getRecords()) {
+            //设置扫描学生数
+            int studentCount = paperLibraryService.countScanStudentByScannerAndDate(schoolId, scanStatResult.getCreateId(), scanStatResult.getScanDateStr());
+            scanStatResult.setStudentCount(studentCount);
+            SysUser user = sysUserService.getById(scanStatResult.getCreateId());
+            scanStatResult.setScanner(Objects.isNull(user) ?  null : user.getLoginName()+"(" + user.getRealName()+")");
+        }
+        return scanStatPage;
+    }
+
+    @Override
+    public List<ScanStatExportResult> listScanStat(Long scanDate, String scanner) {
+        Long schoolId = Long.valueOf(ServletUtil.getRequestHeaderSchoolId().toString());
+        String scanDateStr = null;
+        if(scanDate != null && scanDate > 0) {
+            scanDateStr = DateFormatUtils.format(scanDate, SystemConstant.SHORT_DATE_PATTERN);
+        }
+
+        //获取查询条件中的用户
+        Long userId = getUserId(scanner);
+
+        List<ScanStatExportResult> scanStatList = baseMapper.listScanStatExport(schoolId, scanDateStr, userId);
+        for(ScanStatExportResult scanStatExportResult : scanStatList) {
+            //设置扫描学生数
+            int studentCount = paperLibraryService.countScanStudentByScannerAndDate(schoolId, scanStatExportResult.getCreateId(), scanStatExportResult.getScanDateStr());
+            scanStatExportResult.setStudentCount(studentCount);
+            SysUser user = sysUserService.getById(scanStatExportResult.getCreateId());
+            scanStatExportResult.setScanner(Objects.isNull(user) ?  null : user.getLoginName()+"(" + user.getRealName()+")");
+        }
+
+        return scanStatList;
+    }
+
+    private @Nullable Long getUserId(String scanner) {
+        Long userId = null;
+        if (StringUtils.isNotEmpty(scanner)) {
+            LambdaQueryWrapper<SysUser> queryWrapper = new LambdaQueryWrapper<>();
+            queryWrapper.eq(SysUser::getLoginName, scanner.trim());
+            SysUser user = sysUserService.getOne(queryWrapper);
+            if (user != null) {
+                userId = user.getId();
+            } else {
+                userId = -1L;
+            }
+        }
+        return userId;
+    }
+
+    private Long getLongDate(String dateStr) {
+        Date date;
+        try {
+            date = DateUtils.parseDate(dateStr+" 00:00:00", SystemConstant.DEFAULT_DATE_PATTERN);
+        } catch (ParseException e) {
+            logger.error(String.format("[扫描统计管理]日期转换失败,dateStr:%s", dateStr), e);
+            return null;
+        }
+        return date.getTime();
+    }
+
+}

+ 14 - 21
paper-library-business/src/main/resources/mapper/PaperLibraryMapper.xml

@@ -69,22 +69,20 @@
 
     <select id="listScanStat" resultType="com.qmth.paper.library.business.bean.result.ScanStatResult">
         SELECT
-            concat( su.login_name, '(', su.real_name, ')' ) scanner,
             p.create_id createId,
             p.create_date scanDateStr,
-            count( 1 ) pictureCount,
-            COUNT( DISTINCT p.student_id ) studentCount
+            count( 1 ) pictureCount
         FROM
-             paper_library p left join sys_user su on p.create_id = su.id
-                where p.school_id = #{schoolId}
-                <if test="userId != null">
-                    and p.create_id=#{userId}
-                </if>
-                <if test="scanDate != null and scanDate != ''">
-                    and p.create_date=#{scanDate}
-                </if>
+            paper_library p
+        where p.school_id = #{schoolId}
+        <if test="userId != null">
+            and p.create_id=#{userId}
+        </if>
+        <if test="scanDate != null and scanDate != ''">
+            and p.create_date=#{scanDate}
+        </if>
         GROUP BY
-           p.create_id,
+            p.create_id,
             p.create_date
         ORDER BY
             p.create_date
@@ -96,29 +94,24 @@
         FROM
             paper_library pl
         WHERE
-            pl.create_id = #{createId} and pl.create_date=#{scanDate}
+            pl.school_id=#{schoolId}  and pl.create_id = #{createId} and pl.create_date=#{scanDate}
     </select>
 
     <select id="listScanStatExport" resultType="com.qmth.paper.library.business.bean.result.ScanStatExportResult">
         SELECT
-        concat( u.login_name, '(', u.real_name, ')' ) scanner,
         p.create_id createId,
         p.create_date scanDateStr,
         count( 1 ) pictureCount
         FROM
-        paper_library p,
-        sys_user u
-        WHERE
-        p.school_id = #{schoolId}
-        AND p.create_id = u.id
+        paper_library p
+        where p.school_id = #{schoolId}
         <if test="userId != null">
-            and u.id=#{userId}
+            and p.create_id=#{userId}
         </if>
         <if test="scanDate != null and scanDate != ''">
             and p.create_date=#{scanDate}
         </if>
         GROUP BY
-        u.login_name,
         p.create_id,
         p.create_date
         ORDER BY