Selaa lähdekoodia

测试bug修复-0831

xiaof 4 vuotta sitten
vanhempi
commit
05bad02aea

+ 20 - 0
sql/美术阅卷表结构修改-202006.sql

@@ -70,3 +70,23 @@ INSERT INTO `mark_user` (`id`,`enabled`,`last_login_time`,`login_name`,`name`,`p
 
 ALTER TABLE `paper`
 ADD COLUMN `is_rejected_by_leader` BIT(1) NULL DEFAULT b'0' COMMENT '是否科组长打回' AFTER `is_one_click`;
+
+
+CREATE TABLE `attachment` (
+  `id` bigint(64) NOT NULL AUTO_INCREMENT,
+  `work_id` bigint(20) DEFAULT NULL,
+  `subject` varchar(10) DEFAULT NULL,
+  `exam_number` varchar(20) DEFAULT NULL,
+  `file_path_local` varchar(512) NOT NULL,
+  `file_name` varchar(128) NOT NULL,
+  `file_type` varchar(8) DEFAULT NULL,
+  `file_ext` varchar(16) DEFAULT NULL,
+  `bucket` varchar(64) NOT NULL,
+  `object_key` varchar(128) NOT NULL,
+  `oss_name` varchar(500) NOT NULL,
+  `oss_status` varchar(20) NOT NULL,
+  `oss_fail_msg` varchar(500) DEFAULT NULL COMMENT '上传oss失败原因',
+  `delete_status` varchar(20) DEFAULT NULL,
+  `time` datetime NOT NULL,
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE=InnoDB AUTO_INCREMENT=206 DEFAULT CHARSET=utf8;

+ 34 - 28
stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/service/DataUploadService.java

@@ -4,6 +4,7 @@ import cn.com.qmth.stmms.ms.admin.dto.StudentDTO;
 import cn.com.qmth.stmms.ms.admin.dto.StudentRelateDTO;
 import cn.com.qmth.stmms.ms.commons.config.ImageCompressionConfig;
 import cn.com.qmth.stmms.ms.commons.config.ImageConfig;
+import cn.com.qmth.stmms.ms.commons.config.ImageServerConfig;
 import cn.com.qmth.stmms.ms.commons.config.SystemConfig;
 import cn.com.qmth.stmms.ms.commons.constant.SystemConstant;
 import cn.com.qmth.stmms.ms.commons.utils.MD5Util;
@@ -71,6 +72,9 @@ public class DataUploadService {
     @Autowired
     RandomUtil randomUtil;
 
+    @Autowired
+    ImageServerConfig imageServerConfig;
+
     /**
      * 上传考生试卷数据
      *
@@ -496,37 +500,39 @@ public class DataUploadService {
             paper.setBatchNo(1l);
         }
 
-        String sheetPath = null;
-        String slicePath = null;
-        String fileName = student.getExamNumber();
-        //0:随机码 1:考号
-        if(ParamCache.paramMap.get(student.getWorkId()).getNameRule() == 1){
+        if(!imageServerConfig.isAliyunOss()) {
+            String sheetPath = null;
+            String slicePath = null;
+            String fileName = student.getExamNumber();
+            //0:随机码 1:考号
+            if (ParamCache.paramMap.get(student.getWorkId()).getNameRule() == 1) {
 //            fileName = DigestUtils.md5Hex(subject.name() + fileName);
-            fileName = MD5Util.getImageRuleMd5(student.getWorkId(), subject.ordinal(), student.getAreaCode(), student.getExamNumber(), student.getId());
-        }
-        //图片是否加密
-        Integer imageEnc = Optional.ofNullable(ParamCache.paramMap.get(student.getWorkId()).getImageEncrypt()).orElse(0);
-        if (imageEnc == 1) {
-            String imageMd5 = MD5Util.getImageRuleMd5(student.getWorkId(), subject.ordinal(), student.getAreaCode(), student.getExamNumber(), student.getId());
-            sheetPath = systemConfig.getSheetDir() + File.separator + student.getWorkId() + File.separator + subject
-                    + File.separator + student.getAreaCode() + File.separator + imageMd5 + ".jpg";
-            slicePath = systemConfig.getImageDir() + File.separator + student.getWorkId() + File.separator + subject
-                    + File.separator + student.getAreaCode() + File.separator + imageMd5 + ".jpg";
-        } else {
-            sheetPath = systemConfig.getSheetDir() + File.separator + student.getWorkId() + File.separator + subject
-                    + File.separator + student.getAreaCode() + File.separator + fileName + ".jpg";
-            slicePath = systemConfig.getImageDir() + File.separator + student.getWorkId() + File.separator + subject
-                    + File.separator + student.getAreaCode() + File.separator + fileName + ".jpg";
+                fileName = MD5Util.getImageRuleMd5(student.getWorkId(), subject.ordinal(), student.getAreaCode(), student.getExamNumber(), student.getId());
+            }
+            //图片是否加密
+            Integer imageEnc = Optional.ofNullable(ParamCache.paramMap.get(student.getWorkId()).getImageEncrypt()).orElse(0);
+            if (imageEnc == 1) {
+                String imageMd5 = MD5Util.getImageRuleMd5(student.getWorkId(), subject.ordinal(), student.getAreaCode(), student.getExamNumber(), student.getId());
+                sheetPath = systemConfig.getSheetDir() + File.separator + student.getWorkId() + File.separator + subject
+                        + File.separator + student.getAreaCode() + File.separator + imageMd5 + ".jpg";
+                slicePath = systemConfig.getImageDir() + File.separator + student.getWorkId() + File.separator + subject
+                        + File.separator + student.getAreaCode() + File.separator + imageMd5 + ".jpg";
+            } else {
+                sheetPath = systemConfig.getSheetDir() + File.separator + student.getWorkId() + File.separator + subject
+                        + File.separator + student.getAreaCode() + File.separator + fileName + ".jpg";
+                slicePath = systemConfig.getImageDir() + File.separator + student.getWorkId() + File.separator + subject
+                        + File.separator + student.getAreaCode() + File.separator + fileName + ".jpg";
+            }
+            FileInputStream sheetIn = new FileInputStream(sheetPath);
+            FileInputStream slicein = new FileInputStream(slicePath);
+            String sheetMD5 = DigestUtils.md5Hex(sheetIn);
+            String sliceMD5 = DigestUtils.md5Hex(slicein);
+            paper.setSheetMD5(sheetMD5);
+            paper.setSliceMD5(sliceMD5);
+            sheetIn.close();
+            slicein.close();
         }
-        FileInputStream sheetIn = new FileInputStream(sheetPath);
-        FileInputStream slicein = new FileInputStream(slicePath);
-        String sheetMD5 = DigestUtils.md5Hex(sheetIn);
-        String sliceMD5 = DigestUtils.md5Hex(slicein);
-        paper.setSheetMD5(sheetMD5);
-        paper.setSliceMD5(sliceMD5);
         paperRepo.save(paper);
-        sheetIn.close();
-        slicein.close();
         synchronized (this) {
             String uploadStatus = student.getUploadStatus();
             String replace = subject.toString() + ":1";

+ 92 - 38
stmms-ms-collect/src/main/java/cn/com/qmth/stmms/ms/collect/api/CollectApi.java

@@ -5,10 +5,8 @@ import cn.com.qmth.stmms.ms.admin.service.DataUploadService;
 import cn.com.qmth.stmms.ms.collect.dto.CollectStuDTO;
 import cn.com.qmth.stmms.ms.collect.dto.CollectSubjectDTO;
 import cn.com.qmth.stmms.ms.collect.dto.LoginDTO;
-import cn.com.qmth.stmms.ms.commons.config.AliYunOssConfig;
-import cn.com.qmth.stmms.ms.commons.config.ImageCompressionConfig;
-import cn.com.qmth.stmms.ms.commons.config.ImageConfig;
-import cn.com.qmth.stmms.ms.commons.config.SystemConfig;
+import cn.com.qmth.stmms.ms.collect.util.OssUploadUtil;
+import cn.com.qmth.stmms.ms.commons.config.*;
 import cn.com.qmth.stmms.ms.commons.constant.SystemConstant;
 import cn.com.qmth.stmms.ms.commons.utils.CommandUtil;
 import cn.com.qmth.stmms.ms.commons.utils.FileUtil;
@@ -59,6 +57,8 @@ import java.util.stream.Collectors;
 public class CollectApi {
     private static final org.slf4j.Logger LOGGER = LoggerFactory.getLogger(CollectApi.class);
 
+    private static final String SHEET = "SHEET", THUMB = "THUMB", IMAGE = "IMAGE";
+
     @Autowired
     private LoginConfig loginConfig;
 
@@ -104,6 +104,12 @@ public class CollectApi {
     @Autowired
     JdbcTemplate jdbcTemplate;
 
+    @Autowired
+    OssUploadUtil ossUploadUtil;
+
+    @Autowired
+    ImageServerConfig imageServerConfig;
+
     @RequestMapping("user/login")
     public LoginDTO login(@RequestParam String loginname, @RequestParam String password) throws Exception {
         LoginDTO loginDTO = null;
@@ -184,7 +190,7 @@ public class CollectApi {
     public CollectStuDTO getStudent(@PathVariable String examNumber) {
         Work activeWork = workRepo.findByActiveTrue();
         Student student = studentRepo.findByWorkIdAndRelateExamNumberAndTest(activeWork.getId(), examNumber, String.valueOf(TrialEnum.DEFAULT.ordinal()));
-        if(student == null){
+        if (student == null) {
             throw new RuntimeException("无该考生,请处理");
         }
         CollectStuDTO collectStuDTO = new CollectStuDTO();
@@ -241,9 +247,9 @@ public class CollectApi {
             dataUploadService.savePaper(student, subject, dto.isManual(), dto.getLevel());
         }
         //已知档位,更新阶段
-        if(Objects.nonNull(dto.getLevel()) && dto.getLevel() != ""){
+        if (Objects.nonNull(dto.getLevel()) && dto.getLevel() != "") {
             MarkSubject markSubject = markSubjectRepo.findOne(activeWork.getId() + "-" + subject.name());
-            if(markSubject.getStage().name().equals(MarkStage.INIT.name())){
+            if (markSubject.getStage().name().equals(MarkStage.INIT.name())) {
                 markSubject.setStage(MarkStage.LEVEL);
                 markSubjectRepo.saveAndFlush(markSubject);
             }
@@ -316,6 +322,7 @@ public class CollectApi {
             if (!md5.equalsIgnoreCase(sheetMD5)) {
                 throw new Exception("图片md5值不一致");
             }
+//            ossUploadUtil.ossUpload(student, subject, sheetFile, SHEET, systemConfig.getSheetDir(), sheetMD5);
         } catch (Exception e) {
             e.printStackTrace();
         } finally {
@@ -409,6 +416,8 @@ public class CollectApi {
             //缩略图删除
 //            thumbFileTemp.delete();
             SystemConstant.writeStream(inputStream1, outputStream1);
+
+//            String thumbMD5 = DigestUtils.md5Hex(inputStream1);
             long end = System.currentTimeMillis();
             LOGGER.info("生成原图和缩略图耗时:{}", (end - start) / 1000 + "s");
 
@@ -422,6 +431,12 @@ public class CollectApi {
             if (!md5.equalsIgnoreCase(sliceMD5)) {
                 throw new Exception("图片md5值不一致");
             }
+            /*if(imageFile.exists()){
+                ossUploadUtil.ossUpload(student, subject, imageFile ,IMAGE, systemConfig.getImageDir(),sliceMD5);
+            }
+            if(thumbFile.exists()){
+                ossUploadUtil.ossUpload(student, subject, thumbFile, THUMB, systemConfig.getThumbDir(), thumbMD5);
+            }*/
         } catch (Exception e) {
             e.printStackTrace();
         } finally {
@@ -456,32 +471,58 @@ public class CollectApi {
             Student student = studentRepo.findOne(studentId);
             Subject subject = Subject.values()[subjectId];
             String path = null;
-            switch (imageType) {
-                case 1:
-                    //裁切原图
-                    path = systemConfig.getImageDir() + File.separator + workId + File.separator + subject
-                            + File.separator + student.getAreaCode();
-                    break;
-                case 2:
-                    //缩略图
-                    path = systemConfig.getThumbDir() + File.separator + workId + File.separator + subject
-                            + File.separator + student.getAreaCode();
-                    break;
-                case 3:
-                    //原图
-                    path = systemConfig.getSheetDir() + File.separator + workId + File.separator + subject
-                            + File.separator + student.getAreaCode();
-                    break;
-                default:
-                    //分数水印图
-                    path = systemConfig.getWatermark() + File.separator + workId + File.separator + subject
-                            + File.separator + student.getAreaCode();
-                    break;
+            if (imageServerConfig.isAliyunOss()) {
+                String dir;
+                switch (imageType) {
+                    case 1:
+                        //裁切原图
+                        dir = systemConfig.getImageDir();
+                        break;
+                    case 2:
+                        //缩略图
+                        dir = systemConfig.getThumbDir();
+                        break;
+                    case 3:
+                        //原图
+                        dir = systemConfig.getSheetDir();
+                        break;
+                    default:
+                        //分数水印图
+                        dir = "";
+                        break;
+                }
+                StringJoiner ossSavePath = new StringJoiner("/").add(imageServerConfig.getDir()).add(dir.replace("\\", "/")).add(String.valueOf(student.getWorkId())).add(subject.name()).add(student.getAreaCode());
+                String md5 = MD5Util.getImageRuleMd5(workId, subject.ordinal(), student.getAreaCode(), student.getExamNumber(), student.getId());
+                String ossFilePath = ossSavePath.toString().concat("/").concat(md5).concat(".jpg");
+                inputStream = ossUploadUtil.ossDownload(ossFilePath);
+            } else {
+                switch (imageType) {
+                    case 1:
+                        //裁切原图
+                        path = systemConfig.getImageDir() + File.separator + workId + File.separator + subject
+                                + File.separator + student.getAreaCode();
+                        break;
+                    case 2:
+                        //缩略图
+                        path = systemConfig.getThumbDir() + File.separator + workId + File.separator + subject
+                                + File.separator + student.getAreaCode();
+                        break;
+                    case 3:
+                        //原图
+                        path = systemConfig.getSheetDir() + File.separator + workId + File.separator + subject
+                                + File.separator + student.getAreaCode();
+                        break;
+                    default:
+                        //分数水印图
+                        path = systemConfig.getWatermark() + File.separator + workId + File.separator + subject
+                                + File.separator + student.getAreaCode();
+                        break;
+                }
+                String md5 = MD5Util.getImageRuleMd5(workId, subject.ordinal(), student.getAreaCode(), student.getExamNumber(), student.getId());
+                File file = new File(path + File.separator + md5 + ".jpg");
+                //读取指定路径下面的文件
+                inputStream = new FileInputStream(file);
             }
-            String md5 = MD5Util.getImageRuleMd5(workId, subject.ordinal(), student.getAreaCode(), student.getExamNumber(), student.getId());
-            File file = new File(path + File.separator + md5 + ".jpg");
-            //读取指定路径下面的文件
-            inputStream = new FileInputStream(file);
             outputStream = new BufferedOutputStream(response.getOutputStream());
             SystemConstant.writeStream(inputStream, outputStream);
             long end = System.currentTimeMillis();
@@ -582,7 +623,11 @@ public class CollectApi {
         }
         BufferedImage bufferedImage = ImageCompression.compress(outImageFile, compressionConfig);
         String thumbFileName = thumbDir + File.separator + fileName + ".jpg";
-        ImageIO.write(bufferedImage, "jpg", new File(thumbFileName));
+        File outThumbFile = new File(thumbFileName);
+        ImageIO.write(bufferedImage, "jpg", outThumbFile);
+        FileInputStream thumbIn = new FileInputStream(outThumbFile);
+        String thumbMD5 = DigestUtils.md5Hex(thumbIn);
+        thumbIn.close();
 
         String md5 = request.getHeader("md5");
         if (Objects.isNull(md5)) {
@@ -594,6 +639,14 @@ public class CollectApi {
             throw new Exception("图片md5值不一致");
         }
         in.close();
+
+        if (outImageFile.exists()) {
+            ossUploadUtil.ossUpload(student, subject, outImageFile, IMAGE, systemConfig.getImageDir(), sliceMD5);
+        }
+
+        if (outThumbFile.exists()) {
+            ossUploadUtil.ossUpload(student, subject, outThumbFile, THUMB, systemConfig.getThumbDir(), thumbMD5);
+        }
 //        ImageCompression.imageThumbnail(outFile,new File(thumbFileName),compressionConfig);
     }
 
@@ -658,6 +711,7 @@ public class CollectApi {
             throw new Exception("图片md5值不一致");
         }
         in.close();
+        ossUploadUtil.ossUpload(student, subject, outFile, SHEET, systemConfig.getSheetDir(), sheetMD5);
     }
 
     @RequestMapping(value = "subject/collect-config", method = RequestMethod.POST)
@@ -829,11 +883,11 @@ public class CollectApi {
                     expSj.add("watermark");
                 }
                 //分数
-                if(startScore != null && endScore != null){
+                if (startScore != null && endScore != null) {
                     expSj.add(startScore + "-" + endScore);
-                } else if(startScore != null && endScore == null){
+                } else if (startScore != null && endScore == null) {
                     expSj.add(startScore.toString());
-                }else if(startScore == null && endScore != null){
+                } else if (startScore == null && endScore != null) {
                     expSj.add(endScore.toString());
                 }
                 File out = new File(expSj.toString());
@@ -941,10 +995,10 @@ public class CollectApi {
                     fileName = MD5Util.getImageRuleMd5(workId, subject1.ordinal(), areaCode, examNumber, studentId);
                 }
                 String path;
-                if(Objects.equals("1", imageType)){
+                if (Objects.equals("1", imageType)) {
                     path = systemConfig.getImageDir() + File.separator + workId + File.separator + subject1
                             + File.separator + areaCode;
-                } else if (Objects.equals("2", imageType)){
+                } else if (Objects.equals("2", imageType)) {
                     path = systemConfig.getImageDir() + File.separator + workId + File.separator + subject1
                             + File.separator + areaCode;
                 } else {

+ 165 - 0
stmms-ms-collect/src/main/java/cn/com/qmth/stmms/ms/collect/util/OssUploadUtil.java

@@ -0,0 +1,165 @@
+package cn.com.qmth.stmms.ms.collect.util;
+
+import cn.com.qmth.stmms.ms.commons.config.AliYunOssConfig;
+import cn.com.qmth.stmms.ms.commons.config.ImageServerConfig;
+import cn.com.qmth.stmms.ms.commons.config.SystemConfig;
+import cn.com.qmth.stmms.ms.commons.utils.MD5Util;
+import cn.com.qmth.stmms.ms.core.cache.ParamCache;
+import cn.com.qmth.stmms.ms.core.domain.Attachment;
+import cn.com.qmth.stmms.ms.core.domain.Student;
+import cn.com.qmth.stmms.ms.core.repository.AttachmentRepo;
+import cn.com.qmth.stmms.ms.core.vo.Subject;
+import com.aliyun.oss.OSS;
+import com.aliyun.oss.OSSClientBuilder;
+import com.aliyun.oss.model.OSSObject;
+import com.aliyun.oss.model.PutObjectRequest;
+import com.aliyun.oss.model.PutObjectResult;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.io.File;
+import java.io.InputStream;
+import java.util.Date;
+import java.util.Objects;
+import java.util.StringJoiner;
+
+/**
+ *
+ */
+@Component
+public class OssUploadUtil {
+
+    private static final String SUCCESS = "SUCCESS", FAIL = "FAIL";
+
+    private static final org.slf4j.Logger LOGGER = LoggerFactory.getLogger(OssUploadUtil.class);
+
+    @Resource
+    AliYunOssConfig aliYunOssConfig;
+
+    @Autowired
+    ImageServerConfig imageServerConfig;
+
+    @Autowired
+    SystemConfig systemConfig;
+
+    @Autowired
+    private AttachmentRepo attachmentRepo;
+
+    /**
+     * 上传oss并校验md5,成功删除本地文件
+     *
+     * @param student
+     * @param subject
+     * @param file
+     * @param type    图片类型
+     * @param dir     不同类型对应的存储目录
+     */
+    public void ossUpload(Student student, Subject subject, File file, String type, String dir, String md5) {
+        if (!imageServerConfig.isAliyunOss()) {
+            return;
+        }
+        Attachment att = null;
+        try {
+            //是否存在
+            att = attachmentRepo.findByWorkIdAndSubjectAndFileTypeAndExamNumber(student.getWorkId(), subject.name(), type, student.getExamNumber());
+            if (att == null) {
+                att = new Attachment();
+            }
+            att.setWorkId(student.getWorkId());
+            att.setSubject(subject.name());
+            att.setExamNumber(student.getExamNumber());
+            att.setFilePathLocal(file.getPath());
+            att.setFileName(file.getName());
+            att.setFileType(type);
+            String ext = getExtension(file.getName());
+            att.setFileExt(ext);
+            att.setTime(new Date());
+            String fileName = student.getExamNumber();
+            //0:随机码 1:考号
+            if (ParamCache.paramMap.get(student.getWorkId()).getNameRule() == 1) {
+                fileName = MD5Util.getImageRuleMd5(student.getWorkId(), subject.ordinal(), student.getAreaCode(), student.getExamNumber(), student.getId());
+            }
+            StringJoiner ossSavePath = new StringJoiner("/").add(imageServerConfig.getDir()).add(dir.replace("\\", "/")).add(String.valueOf(student.getWorkId())).add(subject.name()).add(student.getAreaCode());
+            String saveFileName = fileName + ".jpg";
+            String saveFile = ossSavePath.toString().concat("/").concat(saveFileName);
+
+            att.setObjectKey(saveFile);
+            att.setOssName(saveFileName);
+
+            //默认给FAIL,如果成功更新状态
+            att.setOssStatus(FAIL);
+            att.setDeleteStatus(FAIL);
+
+            String endpoint = aliYunOssConfig.getEndpoint();
+            String accessKeyId = aliYunOssConfig.getAccessKeyId();
+            String accessKeySecret = aliYunOssConfig.getAccessKeySecret();
+            String bucketName = aliYunOssConfig.getBucket();
+            att.setBucket(bucketName);
+            OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
+            PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, saveFile, file);
+            PutObjectResult por = ossClient.putObject(putObjectRequest);
+            if (Objects.nonNull(por.getRequestId()) && por.getResponse() == null) {
+                if (Objects.nonNull(por.getETag()) && por.getETag().equalsIgnoreCase(md5)) {
+                    att.setOssStatus(SUCCESS);
+                    //成功后,清除失败信息
+                    att.setOssFailMsg(null);
+                    boolean del = file.delete();
+                    att.setDeleteStatus(del ? SUCCESS : FAIL);
+                }
+            }
+        } catch (Exception e) {
+            if (att != null) {
+                att.setOssFailMsg(e.getMessage());
+            }
+        }
+
+        if (att != null) {
+            attachmentRepo.save(att);
+        }
+    }
+
+    public InputStream ossDownload(String objectName) {
+        String endpoint = aliYunOssConfig.getEndpoint();
+        String accessKeyId = aliYunOssConfig.getAccessKeyId();
+        String accessKeySecret = aliYunOssConfig.getAccessKeySecret();
+        String bucketName = aliYunOssConfig.getBucket();
+
+        // 创建OSSClient实例。
+        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
+
+        // ossObject包含文件所在的存储空间名称、文件名称、文件元信息以及一个输入流。
+        OSSObject ossObject = ossClient.getObject(bucketName, objectName);
+        InputStream inputStream = ossObject.getObjectContent();
+        String requestId = ossObject.getRequestId();
+
+        // 读取文件内容。
+        /*System.out.println("Object content:");
+        BufferedReader reader = new BufferedReader(new InputStreamReader(ossObject.getObjectContent()));
+        while (true) {
+            String line = reader.readLine();
+            if (line == null) break;
+
+            System.out.println("\n" + line);
+        }
+// 数据读取完成后,获取的流必须关闭,否则会造成连接泄漏,导致请求无连接可用,程序无法正常工作。
+        reader.close();*/
+
+// 关闭OSSClient。
+        ossClient.shutdown();
+        return inputStream;
+    }
+
+    /**
+     * 获取文件的后缀
+     */
+    protected String getExtension(String fileName) {
+        int k = fileName.lastIndexOf(".");
+        String ext = "";
+        if (k > 0) {
+            ext = fileName.substring(k + 1);
+        }
+        return ext;
+    }
+}

+ 30 - 0
stmms-ms-collect/src/main/java/cn/com/qmth/stmms/ms/collect/util/RotateTask.java

@@ -156,6 +156,36 @@ public class RotateTask implements Runnable {
                         ossUtil.ossUpload(imageSj.toString(), new FileInputStream(imageFile));
                         thumbFile.delete();
                         imageFile.delete();
+                    } else if (!imageConfig.isCustomSubject() && imageServerConfig.isAliyunOss()) {
+                        String fileName = paper.getExamNumber();
+                        Student student = studentRepo.findByWorkIdAndExamNumberAndTest(paper.getWorkId(), paper.getExamNumber(), "0");
+                        if (ParamCache.paramMap.get(paper.getWorkId()).getNameRule() == 1) {
+                            fileName = MD5Util.getImageRuleMd5(paper.getWorkId(), paper.getSubject().ordinal(), student.getAreaCode(), paper.getExamNumber(), student.getId());
+                        }
+
+                        //阿里云oss图片旋转
+                        StringJoiner thumbSj = new StringJoiner("/").add(imageServerConfig.getDir()).add(systemConfig.getThumbDir().replace("\\", "/")).add(String.valueOf(student.getWorkId())).add(paper.getSubject().name()).add(student.getAreaCode()).add(fileName + ".jpg");
+                        StringJoiner thumbNewSj = new StringJoiner("/").add(imageServerConfig.getDir()).add(systemConfig.getThumbDir().replace("\\", "/")).add(String.valueOf(student.getWorkId())).add(paper.getSubject().name()).add(student.getAreaCode()).add(fileName + "_" + start + ".jpg");
+                        StringJoiner imageSj = new StringJoiner("/").add(imageServerConfig.getDir()).add(systemConfig.getImageDir().replace("\\", "/")).add(String.valueOf(student.getWorkId())).add(paper.getSubject().name()).add(student.getAreaCode()).add(fileName + ".jpg");
+                        StringJoiner imageNewSj = new StringJoiner("/").add(imageServerConfig.getDir()).add(systemConfig.getImageDir().replace("\\", "/")).add(String.valueOf(student.getWorkId())).add(paper.getSubject().name()).add(student.getAreaCode()).add(fileName + "_" + start + ".jpg");
+
+                        thumbPath = systemConfig.getThumbDir() + File.separator + paper.getWorkId() + File.separator + paper.getSubject().toString()
+                                + File.separator + paper.getAreaCode() + File.separator + fileName + ".jpg";
+                        imagePath = systemConfig.getImageDir() + File.separator + paper.getWorkId() + File.separator + paper.getSubject().toString()
+                                + File.separator + paper.getAreaCode() + File.separator + fileName + ".jpg";
+                        File thumbFile = ossUtil.ossDownload(thumbSj.toString(), thumbPath);
+                        File imageFile = ossUtil.ossDownload(imageSj.toString(), imagePath);
+                        ImageCompression.rotate(thumbFile, new File(thumbPath), degree);
+                        ImageCompression.rotate(imageFile, new File(imagePath), degree);
+                        FileInputStream in = new FileInputStream(new File(imagePath));
+                        sliceMD5 = DigestUtils.md5Hex(in);
+                        in.close();
+                        ossUtil.ossCopy(thumbSj.toString(), thumbNewSj.toString());
+                        ossUtil.ossCopy(imageSj.toString(), imageNewSj.toString());
+                        ossUtil.ossUpload(thumbSj.toString(), new FileInputStream(thumbFile));
+                        ossUtil.ossUpload(imageSj.toString(), new FileInputStream(imageFile));
+                        thumbFile.delete();
+                        imageFile.delete();
                     } else {
                         String fileName = paper.getExamNumber();
                         if (ParamCache.paramMap.get(paper.getWorkId()).getNameRule() == 1) {

+ 5 - 2
stmms-ms-commons/src/main/java/cn/com/qmth/stmms/ms/commons/config/ImageServerConfig.java

@@ -60,7 +60,7 @@ public class ImageServerConfig {
 
     public String getImageServer() {
         if (aliyunOss) {
-            return aliYunOssConfig.getUrl() + File.separator + this.getDir();
+            return aliYunOssConfig.getUrl() + File.separator + this.getDir() + File.separator+ "upload";
         } else {
             return "http://" + this.getIp() + ":" + this.getPort() + File.separator + "upload";
         }
@@ -68,8 +68,11 @@ public class ImageServerConfig {
 
 
     public String getBaseServer() {
+        //如果是图片加密,也需要调用接口处理图片。
+        //所以是否上传到阿里云,调用接口相同,然后去接口处理阿里云和本地文件逻辑
         if (aliyunOss) {
-            return aliYunOssConfig.getUrl() + File.separator + this.getDir();
+//            return aliYunOssConfig.getUrl() + File.separator + this.getDir();
+            return "http://" + this.getIp() + ":" + this.getPort();
         } else {
             return "http://" + this.getIp() + ":" + this.getPort();
         }

+ 176 - 0
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/Attachment.java

@@ -0,0 +1,176 @@
+package cn.com.qmth.stmms.ms.core.domain;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import java.io.Serializable;
+import java.util.Date;
+
+@Entity
+@Table(name = "attachment")
+public class Attachment implements Serializable {
+
+    private static final long serialVersionUID = -9101181754593471979L;
+
+    @Id
+    @GeneratedValue
+    private Long id;
+
+    private Long workId;
+
+    private String subject;
+
+    private String examNumber;
+
+    /**
+     * 本地文件存储路径
+     */
+    private String filePathLocal;
+
+    private String fileName;
+
+    /**
+     * 类型(sheet:原图, thumbs:缩略图,images:裁剪图)
+     */
+    private String fileType;
+
+    private String fileExt;
+
+    private Date time;
+
+    private String bucket;
+
+    private String objectKey;
+
+    private String ossName;
+
+    private String ossStatus;
+
+    private String ossFailMsg;
+
+    /**
+     * 本地文件是否删除成功
+     */
+    private String deleteStatus;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Long getWorkId() {
+        return workId;
+    }
+
+    public void setWorkId(Long workId) {
+        this.workId = workId;
+    }
+
+    public String getSubject() {
+        return subject;
+    }
+
+    public void setSubject(String subject) {
+        this.subject = subject;
+    }
+
+    public String getExamNumber() {
+        return examNumber;
+    }
+
+    public void setExamNumber(String examNumber) {
+        this.examNumber = examNumber;
+    }
+
+    public String getFilePathLocal() {
+        return filePathLocal;
+    }
+
+    public void setFilePathLocal(String filePathLocal) {
+        this.filePathLocal = filePathLocal;
+    }
+
+    public String getFileName() {
+        return fileName;
+    }
+
+    public void setFileName(String fileName) {
+        this.fileName = fileName;
+    }
+
+    public String getFileType() {
+        return fileType;
+    }
+
+    public void setFileType(String fileType) {
+        this.fileType = fileType;
+    }
+
+    public String getFileExt() {
+        return fileExt;
+    }
+
+    public void setFileExt(String fileExt) {
+        this.fileExt = fileExt;
+    }
+
+    public Date getTime() {
+        return time;
+    }
+
+    public void setTime(Date time) {
+        this.time = time;
+    }
+
+    public String getBucket() {
+        return bucket;
+    }
+
+    public void setBucket(String bucket) {
+        this.bucket = bucket;
+    }
+
+    public String getObjectKey() {
+        return objectKey;
+    }
+
+    public void setObjectKey(String objectKey) {
+        this.objectKey = objectKey;
+    }
+
+    public String getOssName() {
+        return ossName;
+    }
+
+    public void setOssName(String ossName) {
+        this.ossName = ossName;
+    }
+
+    public String getOssStatus() {
+        return ossStatus;
+    }
+
+    public void setOssStatus(String ossStatus) {
+        this.ossStatus = ossStatus;
+    }
+
+    public String getOssFailMsg() {
+        return ossFailMsg;
+    }
+
+    public void setOssFailMsg(String ossFailMsg) {
+        this.ossFailMsg = ossFailMsg;
+    }
+
+    public String getDeleteStatus() {
+        return deleteStatus;
+    }
+
+    public void setDeleteStatus(String deleteStatus) {
+        this.deleteStatus = deleteStatus;
+    }
+}

+ 11 - 0
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/repository/AttachmentRepo.java

@@ -0,0 +1,11 @@
+package cn.com.qmth.stmms.ms.core.repository;
+
+import cn.com.qmth.stmms.ms.core.domain.Attachment;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface AttachmentRepo extends JpaRepository<Attachment, Long>, JpaSpecificationExecutor {
+    Attachment findByWorkIdAndSubjectAndFileTypeAndExamNumber(Long workId, String name, String type, String examNumber);
+}