Explorar el Código

阿里云签名

xiatian hace 5 años
padre
commit
f7b1e7af82

+ 152 - 14
examcloud-core-oe-student-api-provider/src/main/java/cn/com/qmth/examcloud/core/oe/student/api/controller/ExamControlController.java

@@ -1,20 +1,63 @@
 package cn.com.qmth.examcloud.core.oe.student.api.controller;
 
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+import javax.validation.Valid;
+
+import org.apache.commons.lang.math.RandomUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.mysql.cj.util.StringUtils;
+
 import cn.com.qmth.examcloud.api.commons.security.bean.User;
 import cn.com.qmth.examcloud.commons.exception.StatusException;
 import cn.com.qmth.examcloud.commons.util.Util;
 import cn.com.qmth.examcloud.core.oe.student.base.utils.Check;
-import cn.com.qmth.examcloud.core.oe.student.bean.*;
+import cn.com.qmth.examcloud.core.oe.student.bean.AliyunSignatureInfo;
+import cn.com.qmth.examcloud.core.oe.student.bean.BatchGetUpyunSignDomain;
+import cn.com.qmth.examcloud.core.oe.student.bean.BatchGetUpyunSignDomainQuery;
+import cn.com.qmth.examcloud.core.oe.student.bean.CheckExamInProgressInfo;
+import cn.com.qmth.examcloud.core.oe.student.bean.CheckQrCodeInfo;
+import cn.com.qmth.examcloud.core.oe.student.bean.EndExamInfo;
+import cn.com.qmth.examcloud.core.oe.student.bean.ExamProcessResultInfo;
+import cn.com.qmth.examcloud.core.oe.student.bean.GetAliyunSignDomain;
+import cn.com.qmth.examcloud.core.oe.student.bean.GetQrCodeReq;
+import cn.com.qmth.examcloud.core.oe.student.bean.GetUploadedFileAcknowledgeStatusReq;
+import cn.com.qmth.examcloud.core.oe.student.bean.GetUpyunSignDomain;
+import cn.com.qmth.examcloud.core.oe.student.bean.GetUpyunSignDomainQuery;
+import cn.com.qmth.examcloud.core.oe.student.bean.GetYunSignDomain;
+import cn.com.qmth.examcloud.core.oe.student.bean.GetYunSignDomainQuery;
+import cn.com.qmth.examcloud.core.oe.student.bean.GetYunSignatureReq;
+import cn.com.qmth.examcloud.core.oe.student.bean.SaveUploadedFileAcknowledgeStatusReq;
+import cn.com.qmth.examcloud.core.oe.student.bean.SaveUploadedFileReq;
+import cn.com.qmth.examcloud.core.oe.student.bean.StartExamInfo;
+import cn.com.qmth.examcloud.core.oe.student.bean.UpyunSignatureInfo;
+import cn.com.qmth.examcloud.core.oe.student.bean.YunSignatureInfo;
 import cn.com.qmth.examcloud.core.oe.student.service.ExamControlService;
 import cn.com.qmth.examcloud.core.oe.student.service.ExamFileAnswerService;
+import cn.com.qmth.examcloud.core.oe.student.service.ExamRecordDataService;
 import cn.com.qmth.examcloud.core.oe.student.service.ExamingSessionService;
 import cn.com.qmth.examcloud.support.Constants;
 import cn.com.qmth.examcloud.support.enums.FileAnswerAcknowledgeStatus;
 import cn.com.qmth.examcloud.support.enums.HandInExamType;
 import cn.com.qmth.examcloud.support.examing.ExamFileAnswer;
+import cn.com.qmth.examcloud.support.examing.ExamRecordData;
 import cn.com.qmth.examcloud.support.examing.ExamingSession;
 import cn.com.qmth.examcloud.support.redis.RedisKeyHelper;
 import cn.com.qmth.examcloud.web.bootstrap.PropertyHolder;
+import cn.com.qmth.examcloud.web.filestorage.FileStoragePathEnvInfo;
+import cn.com.qmth.examcloud.web.filestorage.FileStorageType;
+import cn.com.qmth.examcloud.web.filestorage.FileStorageUtil;
+import cn.com.qmth.examcloud.web.filestorage.YunHttpRequest;
 import cn.com.qmth.examcloud.web.helpers.SequenceLockHelper;
 import cn.com.qmth.examcloud.web.redis.RedisClient;
 import cn.com.qmth.examcloud.web.support.ControllerSupport;
@@ -22,22 +65,19 @@ import cn.com.qmth.examcloud.web.support.Naked;
 import cn.com.qmth.examcloud.web.upyun.UpYunHttpRequest;
 import cn.com.qmth.examcloud.web.upyun.UpyunPathEnvironmentInfo;
 import cn.com.qmth.examcloud.web.upyun.UpyunService;
-import com.mysql.cj.util.StringUtils;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.*;
-
-import javax.validation.Valid;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.TimeUnit;
 
 @Api(tags = "在线考试控制")
 @RestController
 @RequestMapping("${app.api.oe.student}/examControl")
 public class ExamControlController extends ControllerSupport {
+    private static final String SEPARATOR = "/";
 
+    private static final String UNDERLINE = "_";
+
+    // 小程序答案上传目录
+    private static final String OE_ANSWER_FILE_PATH = "oe-answer-file";
     @Autowired
     private ExamControlService examControlService;
     @Autowired
@@ -48,7 +88,9 @@ public class ExamControlController extends ControllerSupport {
     private UpyunService upyunService;
     @Autowired
     private RedisClient redisClient;
-
+    @Autowired
+    private ExamRecordDataService examRecordDataService;
+    
     /**
      * 开始考试
      */
@@ -148,9 +190,58 @@ public class ExamControlController extends ControllerSupport {
      */
     @ApiOperation(value = "获取又拍云文件上传签名(微信小程序调用)")
     @PostMapping("/upyunSignature")
-    public UpyunSignatureInfo getUpyunSignature(@ModelAttribute @Valid GetUpyunSignatureReq req) {
+    public UpyunSignatureInfo getUpyunSignature(@ModelAttribute @Valid GetYunSignatureReq req) {
         return examControlService.getUpyunSignature(req);
     }
+    /**
+     * 获取云存储上传签名(微信小程序调用)
+     */
+    @ApiOperation(value = "获取文件上传签名(微信小程序调用)")
+    @PostMapping("/yunSignature")
+    public YunSignatureInfo getYunSignature(@ModelAttribute @Valid GetYunSignatureReq req) {
+        
+        if(FileStorageUtil.getFileStorageType()==null) {
+    		throw new StatusException("5001", "未配置当前云存储类型");
+    	}
+        if(FileStorageType.UPYUN.name().equals(FileStorageUtil.getFileStorageType())) {
+        	return examControlService.getUpyunSignature(req);
+        }
+        if(FileStorageType.ALIYUN.name().equals(FileStorageUtil.getFileStorageType())) {
+        	String fileSuffix = req.getFileSuffix();
+            if (StringUtils.isNullOrEmpty(fileSuffix)) {
+                throw new StatusException("5002", "文件后缀名不允许为空");
+            }
+            
+            ExamRecordData examRecordData = examRecordDataService.getExamRecordDataCache(req.getExamRecordDataId());
+            fileSuffix = fileSuffix.indexOf(".") == -1 ? "." + fileSuffix : fileSuffix;
+            
+            StringBuffer filePath = new StringBuffer();
+
+            filePath.append(OE_ANSWER_FILE_PATH).append(SEPARATOR)
+                    .append(examRecordData.getExamStudentId()).append(SEPARATOR).append(req.getExamRecordDataId())
+                    .append(SEPARATOR).append(req.getOrder()).append(SEPARATOR)
+                    .append(examRecordData.getExamStudentId()).append(UNDERLINE).append(req.getExamRecordDataId())
+                    .append(UNDERLINE).append(req.getOrder()).append(UNDERLINE).append(System.currentTimeMillis())
+                    .append(RandomUtils.nextInt(8999) + 1000);
+
+            if (!StringUtils.isNullOrEmpty(req.getExt())) {
+                filePath.append(UNDERLINE).append(req.getExt());
+            }
+            filePath.append(".").append(req.getFileSuffix());
+
+            AliyunSignatureInfo result = new AliyunSignatureInfo();
+            String signIdentifier = String.valueOf(System.currentTimeMillis());
+            FileStoragePathEnvInfo env = new FileStoragePathEnvInfo();
+            env.setRelativePath(filePath.toString());
+            YunHttpRequest aliYunHttpRequest = FileStorageUtil.getSignature(FileStorageType.ALIYUN,Constants.MINI_PROGRAM_ANWSER_SITEID, env, req.getFileMd5());
+            result.setAccessUrl(aliYunHttpRequest.getAccessUrl());
+            result.setFormUrl(aliYunHttpRequest.getFormUrl());
+            result.setFormParams(aliYunHttpRequest.getFormParams());
+            result.setSignIdentifier(signIdentifier);
+            return result;
+        }
+        throw new StatusException("5002", "未配置正确云存储类型");
+    }
 
     /**
      * 校验二维码(微信小程序调用)
@@ -230,10 +321,16 @@ public class ExamControlController extends ControllerSupport {
         examFileAnswerService.saveFileAnswer(acknowledgeId, fileAnswer);
     }
 
+    //原接口,不作改动
     @ApiOperation(value = "获取抓拍照片的又拍云签名")
     @GetMapping("/getCapturePhotoUpYunSign")
-    public GetUpyunSignDomain getCapturePhotoUpYunSign(GetUpyunSignDomainQuery query) {
-        String fileSuffix = query.getFileSuffix();
+    public GetUpyunSignDomain getCapturePhotoUpYunSign(GetYunSignDomainQuery query) {
+        return getUpYunSign(query);
+    }
+    
+    //又拍云签名
+    private GetUpyunSignDomain getUpYunSign(GetYunSignDomainQuery query) {
+    	String fileSuffix = query.getFileSuffix();
         if (StringUtils.isNullOrEmpty(fileSuffix)) {
             throw new StatusException("200001", "文件后缀名不允许为空");
         }
@@ -257,12 +354,53 @@ public class ExamControlController extends ControllerSupport {
         result.setSignIdentifier(signIdentifier);
         return result;
     }
+    
+    @ApiOperation(value = "获取抓拍照片的云存储签名")
+    @GetMapping("/getCapturePhotoYunSign")
+    public GetYunSignDomain getCapturePhotoYunSign(GetYunSignDomainQuery query) {
+    	if(FileStorageUtil.getFileStorageType()==null) {
+    		throw new StatusException("3001", "未配置当前云存储类型");
+    	}
+        if(FileStorageType.UPYUN.name().equals(FileStorageUtil.getFileStorageType())) {
+        	return getUpYunSign(query);
+        }
+        if(FileStorageType.ALIYUN.name().equals(FileStorageUtil.getFileStorageType())) {
+        	return getAliYunSign(query);
+        }
+        throw new StatusException("3002", "未配置正确云存储类型");
+    }
+
+    //阿里云签名
+    private GetAliyunSignDomain getAliYunSign(GetYunSignDomainQuery query) {
+    	String fileSuffix = query.getFileSuffix();
+        if (StringUtils.isNullOrEmpty(fileSuffix)) {
+            throw new StatusException("4001", "文件后缀名不允许为空");
+        }
+        fileSuffix = fileSuffix.indexOf(".") == -1 ? "." + fileSuffix : fileSuffix;
+
+        GetAliyunSignDomain result = new GetAliyunSignDomain();
+        User accessUser = this.getAccessUser();
+        String signIdentifier = String.valueOf(System.currentTimeMillis());
+        String aliyunSignRedisKey = Constants.EXAM_CAPTURE_PHOTO_UPYUN_SIGN_PREFIX
+                + accessUser.getUserId() + "_" + signIdentifier;
+        FileStoragePathEnvInfo env = new FileStoragePathEnvInfo();
+        env.setRootOrgId(accessUser.getRootOrgId().toString());
+        env.setUserId(accessUser.getUserId().toString());
+        env.setFileSuffix(fileSuffix);
+        YunHttpRequest aliYunHttpRequest = FileStorageUtil.getSignature(FileStorageType.ALIYUN,Constants.CAPTURE_PHOTO_UPYUN_SITEID, env, query.getFileMd5());
+        redisClient.set(aliyunSignRedisKey, aliYunHttpRequest, 60);
+        result.setAccessUrl(aliYunHttpRequest.getAccessUrl());
+        result.setFormUrl(aliYunHttpRequest.getFormUrl());
+        result.setFormParams(aliYunHttpRequest.getFormParams());
+        result.setSignIdentifier(signIdentifier);
+        return result;
+    }
 
     @ApiOperation(value = "批量获取抓拍照片的又拍云签名")
     @PostMapping("/batchGetCapturePhotoUpYunSign")
     public BatchGetUpyunSignDomain batchGetCapturePhotoUpYunSign(@RequestBody BatchGetUpyunSignDomainQuery batchQuery) {
         if (batchQuery.getQueryList() == null || batchQuery.getQueryList().isEmpty()) {
-            throw new StatusException("200001", "查询条件不允许为空");
+            throw new StatusException("300001", "查询条件不允许为空");
         }
 
         List<GetUpyunSignDomain> signDomainList = new ArrayList<>();

+ 65 - 0
examcloud-core-oe-student-service/src/main/java/cn/com/qmth/examcloud/core/oe/student/bean/AliyunSignatureInfo.java

@@ -0,0 +1,65 @@
+package cn.com.qmth.examcloud.core.oe.student.bean;
+
+import java.util.Map;
+
+import cn.com.qmth.examcloud.web.filestorage.FileStorageType;
+import io.swagger.annotations.ApiModelProperty;
+
+public class AliyunSignatureInfo extends YunSignatureInfo {
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 2365956212905035110L;
+	
+	@ApiModelProperty("阿里云读取文件地址")
+	private String accessUrl;
+
+	@ApiModelProperty("阿里云签名唯一标识")
+	private String signIdentifier;
+
+	@ApiModelProperty("阿里云上传form请求地址 POST")
+	private String formUrl;
+
+	@ApiModelProperty("form表单参数(上传文件的参数名为'file')")
+	private Map<String, String> formParams;
+	
+	
+
+	public AliyunSignatureInfo() {
+		super();
+		super.setFsType(FileStorageType.ALIYUN);
+	}
+
+	public String getAccessUrl() {
+		return accessUrl;
+	}
+
+	public void setAccessUrl(String accessUrl) {
+		this.accessUrl = accessUrl;
+	}
+
+	public String getSignIdentifier() {
+		return signIdentifier;
+	}
+
+	public void setSignIdentifier(String signIdentifier) {
+		this.signIdentifier = signIdentifier;
+	}
+
+	public String getFormUrl() {
+		return formUrl;
+	}
+
+	public void setFormUrl(String formUrl) {
+		this.formUrl = formUrl;
+	}
+
+	public Map<String, String> getFormParams() {
+		return formParams;
+	}
+
+	public void setFormParams(Map<String, String> formParams) {
+		this.formParams = formParams;
+	}
+}

+ 69 - 0
examcloud-core-oe-student-service/src/main/java/cn/com/qmth/examcloud/core/oe/student/bean/GetAliyunSignDomain.java

@@ -0,0 +1,69 @@
+package cn.com.qmth.examcloud.core.oe.student.bean;
+
+import java.util.Map;
+
+import cn.com.qmth.examcloud.web.filestorage.FileStorageType;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @Description 获取阿里云签名实体
+ */
+public class GetAliyunSignDomain extends GetYunSignDomain {
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = -6317148733119502392L;
+
+	@ApiModelProperty("阿里云读取文件地址")
+	private String accessUrl;
+
+	@ApiModelProperty("阿里云签名唯一标识")
+	private String signIdentifier;
+
+	@ApiModelProperty("阿里云上传form请求地址 POST")
+	private String formUrl;
+
+	@ApiModelProperty("form表单参数(上传文件的参数名为'file')")
+	private Map<String, String> formParams;
+	
+	
+
+	public GetAliyunSignDomain() {
+		super();
+		super.setFsType(FileStorageType.ALIYUN);
+	}
+
+	public String getAccessUrl() {
+		return accessUrl;
+	}
+
+	public void setAccessUrl(String accessUrl) {
+		this.accessUrl = accessUrl;
+	}
+
+	public String getSignIdentifier() {
+		return signIdentifier;
+	}
+
+	public void setSignIdentifier(String signIdentifier) {
+		this.signIdentifier = signIdentifier;
+	}
+
+	public String getFormUrl() {
+		return formUrl;
+	}
+
+	public void setFormUrl(String formUrl) {
+		this.formUrl = formUrl;
+	}
+
+	public Map<String, String> getFormParams() {
+		return formParams;
+	}
+
+	public void setFormParams(Map<String, String> formParams) {
+		this.formParams = formParams;
+	}
+
+}

+ 11 - 4
examcloud-core-oe-student-service/src/main/java/cn/com/qmth/examcloud/core/oe/student/bean/GetUpyunSignDomain.java

@@ -1,17 +1,17 @@
 package cn.com.qmth.examcloud.core.oe.student.bean;
 
-import cn.com.qmth.examcloud.api.commons.exchange.JsonSerializable;
-import io.swagger.annotations.ApiModelProperty;
-
 import java.util.Map;
 
+import cn.com.qmth.examcloud.web.filestorage.FileStorageType;
+import io.swagger.annotations.ApiModelProperty;
+
 /**
  * @Description 获取又拍云签名实体
  * @Author lideyin
  * @Date 2019/7/29 13:51
  * @Version 1.0
  */
-public class GetUpyunSignDomain implements JsonSerializable {
+public class GetUpyunSignDomain extends GetYunSignDomain {
 	private static final long serialVersionUID = -7428336128716146142L;
 
 	@ApiModelProperty("又拍云读取文件地址")
@@ -25,6 +25,13 @@ public class GetUpyunSignDomain implements JsonSerializable {
 
 	@ApiModelProperty("form表单参数(上传文件的参数名为'file')")
 	private Map<String, String> formParams;
+	
+	
+
+	public GetUpyunSignDomain() {
+		super();
+		super.setFsType(FileStorageType.UPYUN);
+	}
 
 	public String getAccessUrl() {
 		return accessUrl;

+ 30 - 0
examcloud-core-oe-student-service/src/main/java/cn/com/qmth/examcloud/core/oe/student/bean/GetYunSignDomain.java

@@ -0,0 +1,30 @@
+package cn.com.qmth.examcloud.core.oe.student.bean;
+
+import cn.com.qmth.examcloud.api.commons.exchange.JsonSerializable;
+import cn.com.qmth.examcloud.web.filestorage.FileStorageType;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @Description 获取云存储签名实体
+ * @Version 1.0
+ */
+public class GetYunSignDomain implements JsonSerializable {
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 5956527846413583514L;
+
+	@ApiModelProperty("云存储类型")
+	private FileStorageType fsType;
+
+	public FileStorageType getFsType() {
+		return fsType;
+	}
+
+	public void setFsType(FileStorageType fsType) {
+		this.fsType = fsType;
+	}
+
+
+}

+ 35 - 0
examcloud-core-oe-student-service/src/main/java/cn/com/qmth/examcloud/core/oe/student/bean/GetYunSignDomainQuery.java

@@ -0,0 +1,35 @@
+package cn.com.qmth.examcloud.core.oe.student.bean;
+
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+
+/**
+ * @Description 获取云存储签名查询实体
+ */
+public class GetYunSignDomainQuery implements Serializable {
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 245797819495925975L;
+	@ApiModelProperty("文件后缀名,示例:jpg")
+	private String fileSuffix;
+	@ApiModelProperty("文件md5加密值")
+	private String fileMd5;
+
+	public String getFileSuffix() {
+		return fileSuffix;
+	}
+
+	public void setFileSuffix(String fileSuffix) {
+		this.fileSuffix = fileSuffix;
+	}
+
+	public String getFileMd5() {
+		return fileMd5;
+	}
+
+	public void setFileMd5(String fileMd5) {
+		this.fileMd5 = fileMd5;
+	}
+}

+ 69 - 0
examcloud-core-oe-student-service/src/main/java/cn/com/qmth/examcloud/core/oe/student/bean/GetYunSignatureReq.java

@@ -0,0 +1,69 @@
+package cn.com.qmth.examcloud.core.oe.student.bean;
+
+import cn.com.qmth.examcloud.api.commons.exchange.JsonSerializable;
+import io.swagger.annotations.ApiModelProperty;
+
+import javax.validation.constraints.NotNull;
+
+public class GetYunSignatureReq implements JsonSerializable {
+
+    /**
+	 * 
+	 */
+	private static final long serialVersionUID = 4677351126981131069L;
+	@NotNull(message = "考试记录DataID不能为空")
+    @ApiModelProperty(required = true, value = "考试记录DataID")
+    private Long examRecordDataId;
+    @NotNull(message = "题号不能为空")
+    @ApiModelProperty(required = true, value = "考试试题号")
+    private Integer order;
+    @NotNull(message = "文件MD5不能为空")
+    @ApiModelProperty(required = true, value = "文件MD5")
+    private String fileMd5;
+    @NotNull(message = "文件后缀不能为空")
+    @ApiModelProperty(required = true, value = "文件后缀")
+    private String fileSuffix;
+    @ApiModelProperty(value = "文件名自定义参数")
+    private String ext;
+
+    public Long getExamRecordDataId() {
+        return examRecordDataId;
+    }
+
+    public void setExamRecordDataId(Long examRecordDataId) {
+        this.examRecordDataId = examRecordDataId;
+    }
+
+    public Integer getOrder() {
+        return order;
+    }
+
+    public void setOrder(Integer order) {
+        this.order = order;
+    }
+
+    public String getFileMd5() {
+        return fileMd5;
+    }
+
+    public void setFileMd5(String fileMd5) {
+        this.fileMd5 = fileMd5;
+    }
+
+    public String getFileSuffix() {
+        return fileSuffix;
+    }
+
+    public void setFileSuffix(String fileSuffix) {
+        this.fileSuffix = fileSuffix;
+    }
+
+    public String getExt() {
+        return ext;
+    }
+
+    public void setExt(String ext) {
+        this.ext = ext;
+    }
+
+}

+ 9 - 2
examcloud-core-oe-student-service/src/main/java/cn/com/qmth/examcloud/core/oe/student/bean/UpyunSignatureInfo.java

@@ -1,9 +1,9 @@
 package cn.com.qmth.examcloud.core.oe.student.bean;
 
-import cn.com.qmth.examcloud.api.commons.exchange.JsonSerializable;
+import cn.com.qmth.examcloud.web.filestorage.FileStorageType;
 import io.swagger.annotations.ApiModelProperty;
 
-public class UpyunSignatureInfo implements JsonSerializable {
+public class UpyunSignatureInfo extends YunSignatureInfo {
 
 	/**
 	 * 
@@ -19,6 +19,13 @@ public class UpyunSignatureInfo implements JsonSerializable {
 	private String filePath;
 	@ApiModelProperty(value = "取又拍云文件时的域名")
 	private String upyunFileDomain;
+	
+	public UpyunSignatureInfo() {
+		super();
+		super.setFsType(FileStorageType.UPYUN);
+	}
+
+	
 	public String getSignature() {
 		return signature;
 	}

+ 25 - 0
examcloud-core-oe-student-service/src/main/java/cn/com/qmth/examcloud/core/oe/student/bean/YunSignatureInfo.java

@@ -0,0 +1,25 @@
+package cn.com.qmth.examcloud.core.oe.student.bean;
+
+import cn.com.qmth.examcloud.api.commons.exchange.JsonSerializable;
+import cn.com.qmth.examcloud.web.filestorage.FileStorageType;
+import io.swagger.annotations.ApiModelProperty;
+
+public class YunSignatureInfo implements JsonSerializable {
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 6721564120024116705L;
+	@ApiModelProperty("云存储类型")
+	private FileStorageType fsType;
+
+	public FileStorageType getFsType() {
+		return fsType;
+	}
+
+	public void setFsType(FileStorageType fsType) {
+		this.fsType = fsType;
+	}
+
+	
+}

+ 1 - 1
examcloud-core-oe-student-service/src/main/java/cn/com/qmth/examcloud/core/oe/student/service/ExamControlService.java

@@ -75,7 +75,7 @@ public interface ExamControlService {
     void sendScanQrCodeToWebSocket(String clientId, Long examRecordDataId, Integer order,
                                    Long userId, Long rootOrgId) throws Exception;
 
-    UpyunSignatureInfo getUpyunSignature(GetUpyunSignatureReq req);
+    UpyunSignatureInfo getUpyunSignature(GetYunSignatureReq req);
 
     /**
      * 获取二维码

+ 73 - 23
examcloud-core-oe-student-service/src/main/java/cn/com/qmth/examcloud/core/oe/student/service/impl/ExamControlServiceImpl.java

@@ -1,12 +1,47 @@
 package cn.com.qmth.examcloud.core.oe.student.service.impl;
 
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Random;
+import java.util.Set;
+import java.util.TimeZone;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
+
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang.math.RandomUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.time.DateUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.google.common.base.Splitter;
+
 import cn.com.qmth.examcloud.api.commons.enums.ExamSpecialSettingsType;
 import cn.com.qmth.examcloud.api.commons.enums.ExamType;
 import cn.com.qmth.examcloud.api.commons.security.bean.User;
 import cn.com.qmth.examcloud.api.commons.security.bean.UserType;
 import cn.com.qmth.examcloud.commons.exception.StatusException;
+import cn.com.qmth.examcloud.commons.util.ByteUtil;
+import cn.com.qmth.examcloud.commons.util.JsonUtil;
+import cn.com.qmth.examcloud.commons.util.SHA256;
+import cn.com.qmth.examcloud.commons.util.StringUtil;
 import cn.com.qmth.examcloud.commons.util.UUID;
-import cn.com.qmth.examcloud.commons.util.*;
+import cn.com.qmth.examcloud.commons.util.UrlUtil;
+import cn.com.qmth.examcloud.commons.util.Util;
 import cn.com.qmth.examcloud.core.oe.admin.api.ExamRecordCloudService;
 import cn.com.qmth.examcloud.core.oe.admin.api.SyncExamDataCloudService;
 import cn.com.qmth.examcloud.core.oe.admin.api.bean.ExamQuestionBean;
@@ -25,8 +60,22 @@ import cn.com.qmth.examcloud.core.oe.student.api.response.GetExamRecordPaperStru
 import cn.com.qmth.examcloud.core.oe.student.api.response.GetExamRecordQuestionsResp;
 import cn.com.qmth.examcloud.core.oe.student.base.utils.CommonUtil;
 import cn.com.qmth.examcloud.core.oe.student.base.utils.QuestionTypeUtil;
-import cn.com.qmth.examcloud.core.oe.student.bean.*;
-import cn.com.qmth.examcloud.core.oe.student.service.*;
+import cn.com.qmth.examcloud.core.oe.student.bean.CheckExamInProgressInfo;
+import cn.com.qmth.examcloud.core.oe.student.bean.CheckQrCodeInfo;
+import cn.com.qmth.examcloud.core.oe.student.bean.EndExamInfo;
+import cn.com.qmth.examcloud.core.oe.student.bean.GetQrCodeReq;
+import cn.com.qmth.examcloud.core.oe.student.bean.GetYunSignatureReq;
+import cn.com.qmth.examcloud.core.oe.student.bean.StartExamInfo;
+import cn.com.qmth.examcloud.core.oe.student.bean.UploadedFileAnswerInfo;
+import cn.com.qmth.examcloud.core.oe.student.bean.UpyunSignatureInfo;
+import cn.com.qmth.examcloud.core.oe.student.service.ExamBossService;
+import cn.com.qmth.examcloud.core.oe.student.service.ExamControlService;
+import cn.com.qmth.examcloud.core.oe.student.service.ExamFaceLivenessVerifyService;
+import cn.com.qmth.examcloud.core.oe.student.service.ExamRecordDataService;
+import cn.com.qmth.examcloud.core.oe.student.service.ExamRecordPaperStructService;
+import cn.com.qmth.examcloud.core.oe.student.service.ExamRecordQuestionsService;
+import cn.com.qmth.examcloud.core.oe.student.service.ExamingSessionService;
+import cn.com.qmth.examcloud.core.oe.student.service.FaceBiopsyService;
 import cn.com.qmth.examcloud.core.oe.task.api.ExamCaptureCloudService;
 import cn.com.qmth.examcloud.core.oe.task.api.request.SaveExamCaptureSyncCompareResultReq;
 import cn.com.qmth.examcloud.core.oe.task.api.request.UpdateExamCaptureQueuePriorityReq;
@@ -42,12 +91,30 @@ import cn.com.qmth.examcloud.reports.commons.bean.OnlineExamStudentReport;
 import cn.com.qmth.examcloud.reports.commons.util.ReportsUtil;
 import cn.com.qmth.examcloud.support.Constants;
 import cn.com.qmth.examcloud.support.cache.CacheHelper;
-import cn.com.qmth.examcloud.support.cache.bean.*;
+import cn.com.qmth.examcloud.support.cache.bean.CourseCacheBean;
+import cn.com.qmth.examcloud.support.cache.bean.ExamOrgSettingsCacheBean;
+import cn.com.qmth.examcloud.support.cache.bean.ExamPropertyCacheBean;
+import cn.com.qmth.examcloud.support.cache.bean.ExamSettingsCacheBean;
+import cn.com.qmth.examcloud.support.cache.bean.ExamStudentCacheBean;
+import cn.com.qmth.examcloud.support.cache.bean.ExamStudentSettingsCacheBean;
+import cn.com.qmth.examcloud.support.cache.bean.ExtractConfigCacheBean;
+import cn.com.qmth.examcloud.support.cache.bean.ExtractConfigDetailCacheBean;
+import cn.com.qmth.examcloud.support.cache.bean.ExtractConfigPaperCacheBean;
+import cn.com.qmth.examcloud.support.cache.bean.StudentCacheBean;
+import cn.com.qmth.examcloud.support.cache.bean.SysPropertyCacheBean;
 import cn.com.qmth.examcloud.support.enums.ExamProperties;
 import cn.com.qmth.examcloud.support.enums.ExamRecordStatus;
 import cn.com.qmth.examcloud.support.enums.FaceBiopsyScheme;
 import cn.com.qmth.examcloud.support.enums.HandInExamType;
-import cn.com.qmth.examcloud.support.examing.*;
+import cn.com.qmth.examcloud.support.examing.ExamBoss;
+import cn.com.qmth.examcloud.support.examing.ExamQuestion;
+import cn.com.qmth.examcloud.support.examing.ExamRecordData;
+import cn.com.qmth.examcloud.support.examing.ExamRecordPaperStruct;
+import cn.com.qmth.examcloud.support.examing.ExamRecordQuestions;
+import cn.com.qmth.examcloud.support.examing.ExamingActivityTime;
+import cn.com.qmth.examcloud.support.examing.ExamingHeartbeat;
+import cn.com.qmth.examcloud.support.examing.ExamingSession;
+import cn.com.qmth.examcloud.support.examing.ExamingStatus;
 import cn.com.qmth.examcloud.support.helper.ExamCacheTransferHelper;
 import cn.com.qmth.examcloud.support.helper.FaceBiopsyHelper;
 import cn.com.qmth.examcloud.support.redis.RedisKeyHelper;
@@ -61,26 +128,9 @@ import cn.com.qmth.examcloud.ws.api.enums.WebSocketEventType;
 import cn.com.qmth.examcloud.ws.api.request.SendFileAnswerMessageReq;
 import cn.com.qmth.examcloud.ws.api.request.SendScanQrCodeMessageReq;
 import cn.com.qmth.examcloud.ws.api.request.SendTextReq;
-import com.google.common.base.Splitter;
 import main.java.com.upyun.Base64Coder;
 import main.java.com.upyun.UpException;
 import main.java.com.upyun.UpYunUtils;
-import org.apache.commons.collections.CollectionUtils;
-import org.apache.commons.lang.math.RandomUtils;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.commons.lang3.time.DateUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
-import java.io.UnsupportedEncodingException;
-import java.net.URLEncoder;
-import java.text.SimpleDateFormat;
-import java.util.*;
-import java.util.concurrent.TimeUnit;
-import java.util.stream.Collectors;
 
 /**
  * @author chenken
@@ -705,7 +755,7 @@ public class ExamControlServiceImpl implements ExamControlService {
     }
 
     @Override
-    public UpyunSignatureInfo getUpyunSignature(GetUpyunSignatureReq req) {
+    public UpyunSignatureInfo getUpyunSignature(GetYunSignatureReq req) {
         UpyunSignatureInfo u = new UpyunSignatureInfo();
         try {
             ExamRecordData examRecordData = examRecordDataService.getExamRecordDataCache(req.getExamRecordDataId());