Browse Source

卡格式保存

xiatian 2 năm trước cách đây
mục cha
commit
c3a66b58fc

+ 4 - 0
shell/13-卡格式导入.bat

@@ -0,0 +1,4 @@
+
+call java -server -Xms512m -Xmx512m -jar cet-tools.jar --scan.tool.stop=true --scan.tool.taskType=EXAM_IMPORT
+
+pause

+ 13 - 0
src/main/java/cn/com/qmth/scancloud/tools/config/SysProperty.java

@@ -23,6 +23,9 @@ public class SysProperty {
 
     // 设置考试ID,默认为空
     public static Long EXAM_ID;
+    
+    //科目代码
+    public static String SUBJECT_CODE;
 
     // 自定义导入模板的列分隔符,为空时采用默认分隔符"|",特殊字符请用双引号括起来!
     public static String TEMPLATE_SEPARATOR;
@@ -47,6 +50,7 @@ public class SysProperty {
     public static String COURSE_IMPORT;
     public static String STUDENT_IMPORT;
     public static String ABSENT_IMPORT;
+    public static String CARD_IMPORT;
 
     @Value("${scan.server.url}")
     public void scanServerUrl(String scanServerUrl) {
@@ -77,6 +81,11 @@ public class SysProperty {
     public void examId(Long examId) {
         EXAM_ID = examId;
     }
+    
+    @Value("${scan.tool.subject-code}")
+    public void subjectCode(String subjectCode) {
+        SUBJECT_CODE = subjectCode;
+    }
 
     @Value("${scan.tool.template.separator:,}")
     public void templateSeparator(String templateSeparator) {
@@ -126,6 +135,10 @@ public class SysProperty {
     public void absentImport(String absentImport) {
         ABSENT_IMPORT = absentImport;
     }
+    @Value("${scan.tool.card-import}")
+    public void cardImport(String cardImport) {
+        CARD_IMPORT = cardImport;
+    }
     @Value("${scan.tool.batch.size:5000}")
     public void batchSize(Integer batchSize) {
         BATCH_SIZE = batchSize;

+ 3 - 0
src/main/java/cn/com/qmth/scancloud/tools/enums/TaskType.java

@@ -1,6 +1,7 @@
 package cn.com.qmth.scancloud.tools.enums;
 
 import cn.com.qmth.scancloud.tools.service.impl.AbsentImportTask;
+import cn.com.qmth.scancloud.tools.service.impl.CardImportTask;
 import cn.com.qmth.scancloud.tools.service.impl.CourseImportTask;
 import cn.com.qmth.scancloud.tools.service.impl.ExamImportTask;
 import cn.com.qmth.scancloud.tools.service.impl.ExamStudentCleanTask;
@@ -32,6 +33,8 @@ public enum TaskType {
     ABSENT_IMPORT("缺考导入", AbsentImportTask.class),
     
     STRUCT_IMPORT("试卷结构导入", StructImportTask.class),
+    
+    CARD_IMPORT("卡格式导入", CardImportTask.class),
     ;
 
     private String title;

+ 67 - 0
src/main/java/cn/com/qmth/scancloud/tools/model/ImportCardDomain.java

@@ -0,0 +1,67 @@
+package cn.com.qmth.scancloud.tools.model;
+
+public class ImportCardDomain {
+
+    private Long examId;
+
+    private String subjectCode;
+
+    private Integer paperCount;
+
+    private Boolean singlePage;
+
+    private String md5;
+
+    
+    public Long getExamId() {
+        return examId;
+    }
+
+    
+    public void setExamId(Long examId) {
+        this.examId = examId;
+    }
+
+    
+    public String getSubjectCode() {
+        return subjectCode;
+    }
+
+    
+    public void setSubjectCode(String subjectCode) {
+        this.subjectCode = subjectCode;
+    }
+
+    
+    public Integer getPaperCount() {
+        return paperCount;
+    }
+
+    
+    public void setPaperCount(Integer paperCount) {
+        this.paperCount = paperCount;
+    }
+
+    
+    public Boolean getSinglePage() {
+        return singlePage;
+    }
+
+    
+    public void setSinglePage(Boolean singlePage) {
+        this.singlePage = singlePage;
+    }
+
+    
+    public String getMd5() {
+        return md5;
+    }
+
+    
+    public void setMd5(String md5) {
+        this.md5 = md5;
+    }
+    
+    
+}
+

+ 12 - 0
src/main/java/cn/com/qmth/scancloud/tools/model/ScanConstants.java

@@ -0,0 +1,12 @@
+package cn.com.qmth.scancloud.tools.model;
+
+import java.nio.charset.Charset;
+
+public interface ScanConstants {
+	
+    public static final String CHARSET_NAME = "UTF-8";
+
+    public static final Charset CHARSET = Charset.forName(CHARSET_NAME);
+    
+    public static final String MD5 = "MD5";
+}

+ 62 - 0
src/main/java/cn/com/qmth/scancloud/tools/service/impl/CardImportTask.java

@@ -0,0 +1,62 @@
+package cn.com.qmth.scancloud.tools.service.impl;
+
+import java.io.File;
+import java.util.Map;
+
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+
+import com.google.common.collect.Maps;
+
+import cn.com.qmth.scancloud.tools.config.SysProperty;
+import cn.com.qmth.scancloud.tools.enums.TaskType;
+import cn.com.qmth.scancloud.tools.service.AbstractTask;
+import cn.com.qmth.scancloud.tools.service.CommonService;
+import cn.com.qmth.scancloud.tools.utils.HttpHelper;
+import cn.com.qmth.scancloud.tools.utils.MD5Util;
+import cn.com.qmth.scancloud.tools.utils.StatusException;
+
+/**
+ * 卡格式导入
+ */
+@Service
+public class CardImportTask extends AbstractTask {
+
+    private static final Logger log = LoggerFactory.getLogger(CardImportTask.class);
+
+    @Override
+    protected String getTaskName() {
+        return TaskType.CARD_IMPORT.getTitle();
+    }
+
+    @Override
+    protected void execute() {
+        Long examId = SysProperty.EXAM_ID;
+        if (examId == null) {
+            throw new StatusException("【scan.tool.exam-id】未配置!");
+        }
+        String subjectCode = SysProperty.SUBJECT_CODE;
+        if (StringUtils.isBlank(subjectCode)) {
+            throw new StatusException("【scan.tool.subject-code】未配置!");
+        }
+        if (CommonService.findExam(examId) == null) {
+            throw new StatusException("当前考试不存在!examId = " + examId);
+        }
+        
+        if (CommonService.findCourse(examId, subjectCode) == null) {
+            throw new StatusException("当前科目不存在!subjectCode = "+subjectCode);
+        }
+        File file = new File(SysProperty.DATA_DIR + "/" + SysProperty.CARD_IMPORT);
+        String url = SysProperty.SCAN_SERVER_URL + "/api/tool/import/card/save";
+        Map<String, String> params = Maps.newHashMap();
+        params.put("examId", examId.toString());
+        params.put("subjectCode", subjectCode);
+        params.put("paperCount","2");
+        params.put("singlePage", "false");
+        params.put("md5", MD5Util.md5Hex(file));
+        String ret=HttpHelper.post(url, params,file);
+        log.info("处理完毕,卡格式编号:"+ret);
+    }
+}

+ 40 - 5
src/main/java/cn/com/qmth/scancloud/tools/utils/HttpHelper.java

@@ -1,6 +1,11 @@
 package cn.com.qmth.scancloud.tools.utils;
 
 import okhttp3.*;
+
+import java.io.File;
+import java.util.Map;
+import java.util.Map.Entry;
+
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -16,13 +21,43 @@ public class HttpHelper {
         }
 
         RequestBody requestBody = FormBody.create(json != null ? json : "", MediaType.parse(CONTENT_TYPE));
-        Request request = new Request.Builder()
-                .post(requestBody)
-                .url(url)
-                .build();
+        Request request = new Request.Builder().post(requestBody).url(url).build();
+
+        try (Response response = HttpClientBuilder.getClient().newCall(request).execute();
+                ResponseBody body = response.body();) {
+            String bodyStr = body.string();
+            if (response.isSuccessful()) {
+                return bodyStr;
+            }
+
+            log.error("[POST] {}, response code = {}, body = {}", url, response.code(), bodyStr);
+        } catch (Exception e) {
+            log.error("[POST] {}, error = {}", url, e.getMessage(), e);
+        }
+
+        throw new StatusException("接口调用失败!");
+    }
+
+    @SuppressWarnings("deprecation")
+    public static String post(String url, Map<String, String> params, File file) {
+
+        okhttp3.MultipartBody.Builder multipartBodyBuilder = new MultipartBody.Builder()
+                .setType(MultipartBody.ALTERNATIVE);
+
+        if (null != params) {
+            for (Entry<String, String> entry : params.entrySet()) {
+                multipartBodyBuilder.addFormDataPart(entry.getKey(), entry.getValue());
+            }
+        }
+
+        MediaType type = MediaType.parse("application/octet-stream");
+        RequestBody fileBody = RequestBody.create(type, file);
+        multipartBodyBuilder.addFormDataPart("file", file.getName(), fileBody);
+
+        Request request =  new Request.Builder().url(url).post(multipartBodyBuilder.build()).build();
 
         try (Response response = HttpClientBuilder.getClient().newCall(request).execute();
-             ResponseBody body = response.body();) {
+                ResponseBody body = response.body();) {
             String bodyStr = body.string();
             if (response.isSuccessful()) {
                 return bodyStr;

+ 89 - 0
src/main/java/cn/com/qmth/scancloud/tools/utils/MD5Util.java

@@ -0,0 +1,89 @@
+package cn.com.qmth.scancloud.tools.utils;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.util.Optional;
+import java.util.StringJoiner;
+
+import org.apache.commons.codec.digest.DigestUtils;
+
+import cn.com.qmth.scancloud.tools.model.ScanConstants;
+
+/**
+ * @Description: MD5加密工具类
+ */
+public class MD5Util {
+
+    /**
+     * MD5加密
+     *
+     * @param text
+     * @return
+     * @throws Exception
+     */
+    public static String encoder(String text) throws NoSuchAlgorithmException {
+        text = Optional.of(text).get();
+        MessageDigest digest = MessageDigest.getInstance(ScanConstants.MD5);
+        digest.update(text.getBytes(ScanConstants.CHARSET));
+        byte s[] = digest.digest();
+        StringJoiner result = new StringJoiner("");
+        for (int i = 0; i < s.length; i++) {
+            result.add(Integer.toHexString((0x000000FF & s[i]) | 0xFFFFFF00).substring(6));
+        }
+        return result.toString();
+    }
+
+    /**
+     * MD5校验
+     *
+     * @param text
+     * @param md5
+     * @return
+     * @throws Exception
+     */
+    public static boolean verify(String text, String md5) throws NoSuchAlgorithmException {
+        text = Optional.of(text).get();
+        md5 = Optional.of(md5).get();
+        //根据传入的密钥进行验证
+        String md5Text = encoder(text);
+        if (md5Text.equalsIgnoreCase(md5)) {
+            return true;
+        }
+        return false;
+    }
+    
+	public static String md5Hex(File file) {
+		FileInputStream in = null;
+		try {
+			in = new FileInputStream(file);
+			return DigestUtils.md5Hex(in);
+		} catch (Exception e) {
+			throw new RuntimeException(e);
+		} finally {
+			if(in!=null)
+				try {
+					in.close();
+				} catch (IOException e) {
+				}
+		}
+	}
+	
+	public static String md5Hex(InputStream in) {
+		try {
+			return DigestUtils.md5Hex(in);
+		} catch (Exception e) {
+			throw new RuntimeException(e);
+		} finally {
+			if(in!=null)
+				try {
+					in.close();
+				} catch (IOException e) {
+				}
+		}
+	}
+}
+

+ 4 - 3
src/main/resources/application.properties

@@ -6,7 +6,7 @@ logging.level.org.springframework=error
 logging.level.cn.com.qmth.scancloud=info
 logging.pattern.console=%d{yyyy-MM-dd HH:mm:ss.SSS} | %clr(%-5level) | %msg%n
 logging.file.name=logs/debug.log
-scan.tool.task-type=OBJECTIVE_QUESTION_EXPORT
+scan.tool.task-type=CARD_IMPORT
 scan.tool.thread.size=8
 scan.tool.batch.size=5000
 scan.tool.template.separator=,
@@ -16,8 +16,8 @@ scan.tool.template.separator=,
 scan.server.url=http://localhost:9099
 scan.tool.schoolId=
 scan.tool.schoolName=
-scan.tool.exam-id=2
-scan.tool.subject-code=
+scan.tool.exam-id=116
+scan.tool.subject-code=101001
 scan.tool.year=22
 scan.tool.year.half=1
 #file path
@@ -29,4 +29,5 @@ scan.tool.course-import=course-import.txt
 scan.tool.student-import=student-import.txt
 scan.tool.absent-import=absent-import.txt
 scan.tool.struct-import=struct-import.xlsx
+scan.tool.card-import=card.json
 #############params config###############