Bladeren bron

试卷结构上传-标答/结构预览

xiaof 3 jaren geleden
bovenliggende
commit
099d27bdce

+ 13 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/ExamPaperStructure.java

@@ -9,6 +9,8 @@ import com.qmth.teachcloud.common.base.BaseEntity;
 import io.swagger.annotations.ApiModelProperty;
 
 import java.io.Serializable;
+import java.util.List;
+import java.util.Map;
 
 /**
  * <p>
@@ -101,6 +103,9 @@ public class ExamPaperStructure extends BaseEntity implements Serializable {
      */
     private Boolean enable;
 
+    @TableField(exist = false)
+    private List<Map<String, String>> previewList;
+
     public Long getSchoolId() {
         return schoolId;
     }
@@ -220,4 +225,12 @@ public class ExamPaperStructure extends BaseEntity implements Serializable {
     public void setEnable(Boolean enable) {
         this.enable = enable;
     }
+
+    public List<Map<String, String>> getPreviewList() {
+        return previewList;
+    }
+
+    public void setPreviewList(List<Map<String, String>> previewList) {
+        this.previewList = previewList;
+    }
 }

+ 5 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/ExamPaperStructureService.java

@@ -6,6 +6,9 @@ import com.qmth.distributed.print.business.entity.ExamPaperStructure;
 import com.qmth.distributed.print.business.enums.ExamPaperStructureStatusEnum;
 import org.springframework.web.multipart.MultipartFile;
 
+import java.util.List;
+import java.util.Map;
+
 /**
  * <p>
  * 试卷结构 服务类
@@ -20,4 +23,6 @@ public interface ExamPaperStructureService extends IService<ExamPaperStructure>
     ExamPaperStructure upload(String examPaperStructure, String md5, MultipartFile[] files);
 
     void updateStatusById(Long id, ExamPaperStructureStatusEnum startSync);
+
+    List<Map> preStructure(Long id);
 }

+ 150 - 76
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/DataSyncServiceImpl.java

@@ -1,6 +1,7 @@
 package com.qmth.distributed.print.business.service.impl;
 
 import cn.hutool.core.date.DateUtil;
+import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
@@ -41,6 +42,7 @@ import java.io.*;
 import java.util.*;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
+import java.util.concurrent.atomic.AtomicInteger;
 import java.util.stream.Collectors;
 
 /**
@@ -165,89 +167,152 @@ public class DataSyncServiceImpl implements DataSyncService {
                 throw ExceptionResultEnum.ERROR.exception("没有找到标答文件");
             }
 
-            JSONObject paperAnswerJson = JSONObject.parseObject(paperAnswer);
-            if (!paperAnswerJson.containsKey("paperType") || !paperAnswerJson.containsKey("paper") || !paperAnswerJson.containsKey("answer")) {
-                throw ExceptionResultEnum.ERROR.exception("没有找到标答文件");
-            }
-            String paperType = paperAnswerJson.getString("paperType");
-            String paper = paperAnswerJson.getString("paper");
-            String answer = paperAnswerJson.getString("answer");
-            if (StringUtils.isAnyBlank(paperType, paper, answer)) {
-                throw ExceptionResultEnum.ERROR.exception("没有找到标答文件");
+            String paperTypes = examPaperStructure.getPaperType();
+            if (StringUtils.isBlank(paperTypes)) {
+                throw ExceptionResultEnum.ERROR.exception("没有找到试卷类型");
             }
 
-            // 同步试卷文件
-            File paperFile = downFileFromFss(paper, paperType, SyncFileTypeEnum.PAPER);
-            boolean syncPaperFile = stmmsUtils.syncFile(examPaperStructure.getSchoolId(), String.valueOf(examPaperStructure.getThirdRelateId()), examPaperStructure.getPaperNumber(), SyncFileTypeEnum.PAPER, paperFile);
-            if (syncPaperFile) {
+            List<String> paperTypeList = Arrays.asList(paperTypes.split(","));
+
+            AtomicInteger atomicInteger = new AtomicInteger(0);
+            // 同步试卷
+            List<JSONObject> paperAnswerJsons = JSONObject.parseArray(paperAnswer, JSONObject.class);
+            for (JSONObject paperAnswerJson : paperAnswerJsons) {
+                if (!paperAnswerJson.containsKey("paperType") || !paperAnswerJson.containsKey("paper")) {
+                    throw ExceptionResultEnum.ERROR.exception("没有找到试卷文件");
+                }
+                String paperType = paperAnswerJson.getString("paperType");
+                String paper = paperAnswerJson.getString("paper");
+                if (StringUtils.isAnyBlank(paperType, paper)) {
+                    throw ExceptionResultEnum.ERROR.exception("没有找到试卷文件");
+                }
+
+                if (!paperTypeList.contains(paperType)) {
+                    throw ExceptionResultEnum.ERROR.exception("试卷对应的类型有误");
+                }
+
+                // 同步试卷文件
+                File paperFile = downFileFromFss(paper, paperType, SyncFileTypeEnum.PAPER);
+                String syncPaperFileUrl = stmmsUtils.syncFile(examPaperStructure.getSchoolId(), String.valueOf(examPaperStructure.getThirdRelateId()), examPaperStructure.getPaperNumber() + paperType, SyncFileTypeEnum.PAPER, paperFile);
+                if (StringUtils.isNotBlank(syncPaperFileUrl)) {
+                    atomicInteger.getAndIncrement();
+                }
+                // 试卷文件保存url
+                paperAnswerJson.put("paperUrl", syncPaperFileUrl);
+            }
+            if (atomicInteger.intValue() - paperAnswerJsons.size() == 0) {
                 status = ExamPaperStructureStatusEnum.PAPER_FINISH;
+                examPaperStructure.setPaperAnswer(JSONObject.toJSONString(paperAnswerJsons));
             }
 
-            // 同步标答文件
-            File answerFile = downFileFromFss(paper, paperType, SyncFileTypeEnum.PAPER);
-            boolean syncAnswerFile = stmmsUtils.syncFile(examPaperStructure.getSchoolId(), String.valueOf(examPaperStructure.getThirdRelateId()), examPaperStructure.getPaperNumber(), SyncFileTypeEnum.ANSWER, answerFile);
-            if (syncAnswerFile) {
+            // 同步标答
+            atomicInteger.set(0);
+            for (JSONObject paperAnswerJson : paperAnswerJsons) {
+                if (!paperAnswerJson.containsKey("paperType") || !paperAnswerJson.containsKey("answer")) {
+                    throw ExceptionResultEnum.ERROR.exception("没有找到标答文件");
+                }
+                String paperType = paperAnswerJson.getString("paperType");
+                String answer = paperAnswerJson.getString("answer");
+                if (StringUtils.isAnyBlank(paperType, answer)) {
+                    throw ExceptionResultEnum.ERROR.exception("没有找到标答文件");
+                }
+
+                if (!paperTypeList.contains(paperType)) {
+                    throw ExceptionResultEnum.ERROR.exception("标答对应的试卷类型有误");
+                }
+
+                // 同步标答文件
+                File answerFile = downFileFromFss(answer, paperType, SyncFileTypeEnum.ANSWER);
+                String syncAnswerFileUrl = stmmsUtils.syncFile(examPaperStructure.getSchoolId(), String.valueOf(examPaperStructure.getThirdRelateId()), examPaperStructure.getPaperNumber() + paperType, SyncFileTypeEnum.ANSWER, answerFile);
+                if (StringUtils.isNotBlank(syncAnswerFileUrl)) {
+                    atomicInteger.getAndIncrement();
+                }
+                // 标答文件保存url
+                paperAnswerJson.put("answerUrl", syncAnswerFileUrl);
+            }
+            if (atomicInteger.intValue() - paperAnswerJsons.size() == 0) {
                 status = ExamPaperStructureStatusEnum.ANSWER_FINISH;
+                examPaperStructure.setPaperAnswer(JSONObject.toJSONString(paperAnswerJsons));
             }
+
             // 同步客观题
+            atomicInteger.set(0);
             String objectiveStructure = examPaperStructure.getObjectiveStructure();
             if (StringUtils.isBlank(objectiveStructure)) {
                 throw ExceptionResultEnum.ERROR.exception("没有找到客观题数据");
             }
-            JSONObject objectiveJson = JSONObject.parseObject(objectiveStructure);
-            if (!objectiveJson.containsKey("paperType") || !objectiveJson.containsKey("content")) {
-                throw ExceptionResultEnum.ERROR.exception("客观题文件未上传");
-            }
-            String objectivePaperType = objectiveJson.getString("paperType");
-            String objectiveContent = objectiveJson.getString("content");
-            if (StringUtils.isAnyBlank(objectivePaperType, objectiveContent)) {
-                throw ExceptionResultEnum.ERROR.exception("没有找到客观题数据");
+            List<JSONObject> objectiveJsons = JSONObject.parseArray(objectiveStructure, JSONObject.class);
+            for (JSONObject objectiveJson : objectiveJsons) {
+                if (!objectiveJson.containsKey("paperType") || !objectiveJson.containsKey("content")) {
+                    throw ExceptionResultEnum.ERROR.exception("客观题文件未上传");
+                }
+                String objectivePaperType = objectiveJson.getString("paperType");
+                String objectiveContent = objectiveJson.getString("content");
+                if (StringUtils.isAnyBlank(objectivePaperType, objectiveContent)) {
+                    throw ExceptionResultEnum.ERROR.exception("没有找到客观题数据");
+                }
+                if (!paperTypeList.contains(objectivePaperType)) {
+                    throw ExceptionResultEnum.ERROR.exception("客观题对应的试卷类型有误");
+                }
+
+                List<ExamPaperObjectiveStructureDto> objectiveStructureDtos = JSONObject.parseArray(objectiveContent, ExamPaperObjectiveStructureDto.class);
+                List<SyncStructureData> syncObjectiveStructureDatas = objectiveStructureDtos.stream().map(m -> {
+                    SyncStructureData syncStructureData = new SyncStructureData();
+                    syncStructureData.setMainNumber(m.getMainNumber());
+                    syncStructureData.setSubNumber(m.getSubNumber());
+                    syncStructureData.setMainTitle(m.getMainName());
+                    syncStructureData.setTotalScore(Double.valueOf(m.getScore()));
+                    syncStructureData.setAnswer(m.getAnswer());
+                    return syncStructureData;
+                }).collect(Collectors.toList());
+                boolean syncObjectiveStructure = stmmsUtils.syncPaperStructure(examPaperStructure.getSchoolId(), String.valueOf(examPaperStructure.getThirdRelateId()), examPaperStructure.getPaperNumber() + objectivePaperType, true, objectivePaperType, syncObjectiveStructureDatas);
+                if (syncObjectiveStructure) {
+                    atomicInteger.getAndIncrement();
+                }
             }
-            List<ExamPaperObjectiveStructureDto> objectiveStructureDtos = JSONObject.parseArray(objectiveContent, ExamPaperObjectiveStructureDto.class);
-            List<SyncStructureData> syncObjectiveStructureDatas = objectiveStructureDtos.stream().map(m -> {
-                SyncStructureData syncStructureData = new SyncStructureData();
-                syncStructureData.setMainNumber(Integer.valueOf(m.getMainNumber()));
-                syncStructureData.setSubNumber(m.getSubNumber());
-                syncStructureData.setMainTitle(m.getMainName());
-                syncStructureData.setTotalScore(Double.valueOf(m.getScore()));
-                syncStructureData.setAnswer(m.getAnswer());
-                return syncStructureData;
-            }).collect(Collectors.toList());
-            boolean syncObjectiveStructure = stmmsUtils.syncPaperStructure(examPaperStructure.getSchoolId(), String.valueOf(examPaperStructure.getThirdRelateId()), examPaperStructure.getPaperNumber() + objectivePaperType, true, objectivePaperType, syncObjectiveStructureDatas);
-            if (syncObjectiveStructure) {
+            if (atomicInteger.intValue() - paperAnswerJsons.size() == 0) {
                 status = ExamPaperStructureStatusEnum.OBJECTIVE_FINISH;
             }
+
             // 同步主观题
+            atomicInteger.set(0);
             String subjectiveStructure = examPaperStructure.getSubjectiveStructure();
             if (StringUtils.isBlank(subjectiveStructure)) {
                 throw ExceptionResultEnum.ERROR.exception("没有找到主观题数据");
             }
-            JSONObject subjectiveJson = JSONObject.parseObject(subjectiveStructure);
-            if (!subjectiveJson.containsKey("paperType") || !subjectiveJson.containsKey("content")) {
-                throw ExceptionResultEnum.ERROR.exception("主观题文件未上传");
-            }
-            String subjectivePaperType = subjectiveJson.getString("paperType");
-            String subjectiveContent = subjectiveJson.getString("content");
-            if (StringUtils.isAnyBlank(subjectivePaperType, subjectiveContent)) {
-                throw ExceptionResultEnum.ERROR.exception("没有找到主观题数据");
+            List<JSONObject> subjectiveJsons = JSONObject.parseArray(subjectiveStructure, JSONObject.class);
+            for (JSONObject subjectiveJson : subjectiveJsons) {
+                if (!subjectiveJson.containsKey("paperType") || !subjectiveJson.containsKey("content")) {
+                    throw ExceptionResultEnum.ERROR.exception("主观题文件未上传");
+                }
+                String subjectivePaperType = subjectiveJson.getString("paperType");
+                String subjectiveContent = subjectiveJson.getString("content");
+                if (StringUtils.isAnyBlank(subjectivePaperType, subjectiveContent)) {
+                    throw ExceptionResultEnum.ERROR.exception("没有找到主观题数据");
+                }
+                List<ExamPaperSubjectiveStructureDto> subjectiveStructureDtos = JSONObject.parseArray(subjectiveContent, ExamPaperSubjectiveStructureDto.class);
+                List<SyncStructureData> syncSubjectiveStructureDatas = subjectiveStructureDtos.stream().map(m -> {
+                    SyncStructureData syncStructureData = new SyncStructureData();
+                    syncStructureData.setMainNumber(m.getMainNumber());
+                    syncStructureData.setSubNumber(m.getSubNumber());
+                    syncStructureData.setMainTitle(m.getMainName());
+                    syncStructureData.setTotalScore(Double.valueOf(m.getScore()));
+                    return syncStructureData;
+                }).collect(Collectors.toList());
+                boolean syncSubjectiveStructure = stmmsUtils.syncPaperStructure(examPaperStructure.getSchoolId(), String.valueOf(examPaperStructure.getThirdRelateId()), examPaperStructure.getPaperNumber() + subjectivePaperType, true, subjectivePaperType, syncSubjectiveStructureDatas);
+                if (syncSubjectiveStructure) {
+                    atomicInteger.getAndIncrement();
+                }
             }
-            List<ExamPaperSubjectiveStructureDto> subjectiveStructureDtos = JSONObject.parseArray(subjectiveContent, ExamPaperSubjectiveStructureDto.class);
-            List<SyncStructureData> syncSubjectiveStructureDatas = subjectiveStructureDtos.stream().map(m -> {
-                SyncStructureData syncStructureData = new SyncStructureData();
-                syncStructureData.setMainNumber(Integer.valueOf(m.getMainNumber()));
-                syncStructureData.setSubNumber(m.getSubNumber());
-                syncStructureData.setMainTitle(m.getMainName());
-                syncStructureData.setTotalScore(Double.valueOf(m.getScore()));
-                return syncStructureData;
-            }).collect(Collectors.toList());
-            boolean syncSubjectiveStructure = stmmsUtils.syncPaperStructure(examPaperStructure.getSchoolId(), String.valueOf(examPaperStructure.getThirdRelateId()), examPaperStructure.getPaperNumber() + subjectivePaperType, true, subjectivePaperType, syncSubjectiveStructureDatas);
-            if (syncSubjectiveStructure) {
-                status = ExamPaperStructureStatusEnum.SUBJECTIVE_FINISH;
+            if (atomicInteger.intValue() - paperAnswerJsons.size() == 0) {
+                status = ExamPaperStructureStatusEnum.FINISH;
             }
+
         } catch (ApiException e) {
             throw ExceptionResultEnum.ERROR.exception("试卷结构同步失败:" + e.getMessage());
         } finally {
-            examPaperStructureService.updateStatusById(examPaperStructure.getId(), status);
+            examPaperStructure.setStatus(status);
+            examPaperStructureService.updateById(examPaperStructure);
         }
     }
 
@@ -384,31 +449,40 @@ public class DataSyncServiceImpl implements DataSyncService {
                 return;
             }
 
+            String paperType = examDetailCours.getPaperType();
+            if (StringUtils.isBlank(paperType)) {
+                log.info("数据异常,通过学校:{},课程代码:{},试卷编号:{}查出绑定试卷类型为空", examDetailCours.getSchoolId(), examDetailCours.getCourseCode(), examDetailCours.getPaperNumber());
+                return;
+            }
+
             SyncExamCardDto syncExamCardDto = syncExamCardDtos.get(0);
             if (StringUtils.isNotEmpty(syncExamCardDto.getContent())) {
-                //生成json文件
-                File file = null;
-                try {
-                    // 文件临时目录
-                    String filePath = getTempDir(SyncFileTypeEnum.CARD);
-                    file = createJsonFile(filePath, syncExamCardDto.getContent());
-                    if (file.exists()) {
-                        boolean uploadCard = stmmsUtils.syncFile(schoolId, String.valueOf(thirdRelateId), syncExamCardDto.getPaperNumber(), SyncFileTypeEnum.CARD, file);
-                        if (uploadCard) {
-                            UpdateWrapper<ExamCard> updateWrapper = new UpdateWrapper<>();
-                            updateWrapper.lambda().set(ExamCard::getSyncStatus, true).eq(ExamCard::getId, syncExamCardDto.getId());
-                            examCardService.update(updateWrapper);
+                for (String s : paperType.split(",")) {
+                    //生成json文件
+                    File file = null;
+                    try {
+                        // 文件临时目录
+                        String filePath = getTempDir(SyncFileTypeEnum.CARD);
+                        file = createJsonFile(filePath, syncExamCardDto.getContent());
+                        if (file.exists()) {
+                            String uploadCardUrl = stmmsUtils.syncFile(schoolId, String.valueOf(thirdRelateId), syncExamCardDto.getPaperNumber() + s, SyncFileTypeEnum.CARD, file);
+                            if (StringUtils.isNotBlank(uploadCardUrl)) {
+                                UpdateWrapper<ExamCard> updateWrapper = new UpdateWrapper<>();
+                                updateWrapper.lambda().set(ExamCard::getSyncStatus, true).eq(ExamCard::getId, syncExamCardDto.getId());
+                                examCardService.update(updateWrapper);
+                            }
+                        }
+                    } catch (Exception e) {
+                        throw ExceptionResultEnum.ERROR.exception(e.getMessage());
+                    } finally {
+                        if (file != null && file.exists()) {
+                            file.delete();
                         }
-                    }
-                } catch (Exception e) {
-                    throw ExceptionResultEnum.ERROR.exception(e.getMessage());
-                } finally {
-                    if (file != null && file.exists()) {
-                        file.delete();
                     }
                 }
             }
 
+
         }
     }
 

+ 54 - 5
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamPaperStructureServiceImpl.java

@@ -26,6 +26,8 @@ import com.qmth.teachcloud.common.entity.SysUser;
 import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
 import com.qmth.teachcloud.common.enums.UploadFileEnum;
 import com.qmth.teachcloud.common.service.BasicAttachmentService;
+import com.qmth.teachcloud.common.service.TeachcloudCommonService;
+import com.qmth.teachcloud.common.sync.StmmsUtils;
 import com.qmth.teachcloud.common.util.ExcelUtil;
 import com.qmth.teachcloud.common.util.ResultUtil;
 import com.qmth.teachcloud.common.util.ServletUtil;
@@ -65,12 +67,37 @@ public class ExamPaperStructureServiceImpl extends ServiceImpl<ExamPaperStructur
     @Resource
     BasicAttachmentService basicAttachmentService;
 
+    @Autowired
+    TeachcloudCommonService teachcloudCommonService;
+
+    @Autowired
+    StmmsUtils stmmsUtils;
+
     @Override
     public IPage<ExamPaperStructure> listByPropositionTeacherId(Integer pageNumber, Integer pageSize) {
         Long schoolId = Long.valueOf(ServletUtil.getRequestHeaderSchoolId().toString());
         SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
         Page<ExamPaperStructure> page = new Page<>(pageNumber, pageSize);
         IPage<ExamPaperStructure> examPaperStructureIPage = this.baseMapper.listByPropositionTeacherId(page, schoolId, sysUser.getId());
+        for (ExamPaperStructure record : examPaperStructureIPage.getRecords()) {
+            String paperAnswer = record.getPaperAnswer();
+            if (!StringUtils.isBlank(paperAnswer)) {
+                List<JSONObject> paperAnswerJsons = JSONObject.parseArray(paperAnswer, JSONObject.class);
+                List<Map<String, String>> mapList = new ArrayList<>();
+                for (JSONObject paperAnswerJson : paperAnswerJsons) {
+                    if (paperAnswerJson.containsKey("paperType") && paperAnswerJson.containsKey("answer")) {
+                        String paperType = paperAnswerJson.getString("paperType");
+                        String answer = paperAnswerJson.getString("answer");
+
+                        Map<String, String> stringMap = teachcloudCommonService.filePreviewByAttachmentId(Long.valueOf(answer), false);
+                        stringMap.put("paperType", paperType);
+                        mapList.add(stringMap);
+                    }
+                    record.setPreviewList(mapList);
+                }
+            }
+
+        }
         return examPaperStructureIPage;
     }
 
@@ -78,8 +105,8 @@ public class ExamPaperStructureServiceImpl extends ServiceImpl<ExamPaperStructur
     @Override
     public ExamPaperStructure upload(String examPaperStructure, String md5, MultipartFile[] files) {
 
-        ExamPaperStructure examPaperStructureTemp = JSONObject.parseObject(JSONObject.toJSONString(examPaperStructure), ExamPaperStructure.class);
-        if(Objects.isNull(examPaperStructureTemp.getId())){
+        ExamPaperStructure examPaperStructureTemp = JSONObject.parseObject(examPaperStructure, ExamPaperStructure.class);
+        if (Objects.isNull(examPaperStructureTemp.getId())) {
             // 保存
             examPaperStructureTemp.setId(SystemConstant.getDbUuid());
             this.save(examPaperStructureTemp);
@@ -169,6 +196,27 @@ public class ExamPaperStructureServiceImpl extends ServiceImpl<ExamPaperStructur
         this.update(updateWrapper);
     }
 
+    @Override
+    public List<Map> preStructure(Long id) {
+        if (Objects.isNull(id)) {
+            throw ExceptionResultEnum.ERROR.exception("参数有误");
+        }
+        ExamPaperStructure examPaperStructure = this.getById(id);
+        if (!ExamPaperStructureStatusEnum.FINISH.equals(examPaperStructure.getStatus())) {
+            throw ExceptionResultEnum.ERROR.exception("试卷结构没有同步成功");
+        }
+        String paperType = examPaperStructure.getPaperType();
+        List<Map> list = new ArrayList<>();
+        for (String str : paperType.split(",")) {
+            Map<String, Object> map = new HashMap<>();
+            map.put("paperType", str);
+            List<Map> paperStructure = stmmsUtils.queryPaperStructure(examPaperStructure.getSchoolId(), String.valueOf(examPaperStructure.getThirdRelateId()), examPaperStructure.getPaperNumber() + str, str);
+            map.put("content", paperStructure);
+            list.add(map);
+        }
+        return list;
+    }
+
 
     private Map<String, String> createExamTaskAttachmentIds(ExamPaperStructure examPaperStructure) {
         ExamTask examTask = examTaskService.getByCourseCodeAndPaperNumber(examPaperStructure.getSchoolId(), examPaperStructure.getCourseCode(), examPaperStructure.getPaperNumber());
@@ -194,7 +242,8 @@ public class ExamPaperStructureServiceImpl extends ServiceImpl<ExamPaperStructur
      * @param file
      * @return
      */
-    private List<Object> analyzPaperSubjectiveStructure(MultipartFile file) throws IOException, NoSuchFieldException {
+    private List<Object> analyzPaperSubjectiveStructure(MultipartFile file) throws
+            IOException, NoSuchFieldException {
         List<LinkedMultiValueMap<Integer, Object>> finalList = ExcelUtil.excelReader(file.getInputStream(), Lists.newArrayList(ExamPaperSubjectiveStructureDto.class), (finalExcelList, finalColumnNameList, finalExcelErrorList) -> {
             List<ExcelError> excelErrorTemp = new ArrayList<>();
             // 只允许导入一个sheet
@@ -235,7 +284,7 @@ public class ExamPaperStructureServiceImpl extends ServiceImpl<ExamPaperStructur
         List<Object> list = new ArrayList<>();
         for (LinkedMultiValueMap<Integer, Object> map : finalList) {
             for (Map.Entry<Integer, List<Object>> entry : map.entrySet()) {
-                list.add(entry.getValue());
+                list.addAll(entry.getValue());
             }
         }
         return list;
@@ -294,7 +343,7 @@ public class ExamPaperStructureServiceImpl extends ServiceImpl<ExamPaperStructur
         List<Object> list = new ArrayList<>();
         for (LinkedMultiValueMap<Integer, Object> map : finalList) {
             for (Map.Entry<Integer, List<Object>> entry : map.entrySet()) {
-                list.add(entry.getValue());
+                list.addAll(entry.getValue());
             }
         }
         return list;

+ 1 - 0
distributed-print-business/src/main/resources/mapper/ExamPaperStructureMapper.xml

@@ -14,6 +14,7 @@
             edc.course_code courseCode,
             edc.course_name courseName,
             edc.paper_type paperType,
+            'INIT' status,
             et.user_id propositionTeacherId
         FROM
             exam_print_plan epp

+ 17 - 5
distributed-print/src/main/java/com/qmth/distributed/print/api/ExamPaperStructureController.java

@@ -2,8 +2,6 @@ package com.qmth.distributed.print.api;
 
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.qmth.boot.api.annotation.Aac;
-import com.qmth.boot.api.annotation.BOOL;
 import com.qmth.boot.api.constant.ApiConstant;
 import com.qmth.distributed.print.business.entity.ExamPaperStructure;
 import com.qmth.distributed.print.business.service.DataSyncService;
@@ -23,6 +21,7 @@ import org.springframework.web.multipart.MultipartFile;
 import javax.validation.constraints.Max;
 import javax.validation.constraints.Min;
 import java.util.List;
+import java.util.Map;
 
 /**
  * <p>
@@ -59,13 +58,13 @@ public class ExamPaperStructureController {
     /**
      * 上传
      *
-     * @param md5       文件md5
-     * @param files     文件数组
+     * @param md5   文件md5
+     * @param files 文件数组
      * @return
      */
     @ApiOperation(value = "上传试卷结构、标答")
     @RequestMapping(value = "/upload", method = RequestMethod.POST)
-    public Result upload(@RequestParam("examPaperStructure") String  examPaperStructure,
+    public Result upload(@RequestParam("examPaperStructure") String examPaperStructure,
                          @RequestParam("md5") String md5,
                          @RequestParam("files") MultipartFile[] files) {
         ExamPaperStructure examPaper = examPaperStructureService.upload(examPaperStructure, md5, files);
@@ -73,5 +72,18 @@ public class ExamPaperStructureController {
         dataSyncService.uploadStructure(examPaper);
         return ResultUtil.ok(true, null);
     }
+
+    /**
+     * 试卷结构预览
+     *
+     * @param id id
+     * @return
+     */
+    @ApiOperation(value = "试卷结构预览")
+    @RequestMapping(value = "/preview_structure", method = RequestMethod.POST)
+    public Result preStructure(@RequestParam("id") Long id) {
+        List<Map> list = examPaperStructureService.preStructure(id);
+        return ResultUtil.ok(list);
+    }
 }
 

+ 2 - 0
distributed-print/src/main/resources/application-dev.properties

@@ -131,6 +131,8 @@ sync.config.examSaveUrl=/api/exam/save
 sync.config.studentSaveUrl=/api/exam/student/save
 #\u036C\uFFFD\uFFFD\uFFFD\u2FE8
 sync.config.fileUploadUrl=/api/file/{type}/upload
+# 试卷结构查询接口
+sync.config.queryPaperStructure=/api/exam/paper/query
 #\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u00BC
 sync.config.markLoginUrl=/open/mark/login
 #科组长登录

+ 3 - 3
teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/dto/SyncStructureData.java

@@ -5,7 +5,7 @@ package com.qmth.teachcloud.common.bean.dto;
  */
 public class SyncStructureData {
 
-    private Integer mainNumber;
+    private String mainNumber;
 
     private String subNumber;
 
@@ -15,11 +15,11 @@ public class SyncStructureData {
 
     private String answer;
 
-    public Integer getMainNumber() {
+    public String getMainNumber() {
         return mainNumber;
     }
 
-    public void setMainNumber(Integer mainNumber) {
+    public void setMainNumber(String mainNumber) {
         this.mainNumber = mainNumber;
     }
 

+ 10 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/domain/SyncDataDomain.java

@@ -13,6 +13,8 @@ public class SyncDataDomain {
 
     String fileUploadUrl;
 
+    String queryPaperStructure;
+
     String markLoginUrl;
 
     String markLeaderLoginUrl;
@@ -57,6 +59,14 @@ public class SyncDataDomain {
         this.fileUploadUrl = fileUploadUrl;
     }
 
+    public String getQueryPaperStructure() {
+        return queryPaperStructure;
+    }
+
+    public void setQueryPaperStructure(String queryPaperStructure) {
+        this.queryPaperStructure = queryPaperStructure;
+    }
+
     public String getMarkLoginUrl() {
         return markLoginUrl;
     }

+ 37 - 8
teachcloud-common/src/main/java/com/qmth/teachcloud/common/sync/StmmsUtils.java

@@ -140,7 +140,7 @@ public class StmmsUtils {
      * @param type        文件类型  SyncFileTypeEnum枚举
      * @param file        文件
      */
-    public boolean syncFile(Long schoolId, String examId, String subjectCode, SyncFileTypeEnum type, File file) {
+    public String syncFile(Long schoolId, String examId, String subjectCode, SyncFileTypeEnum type, File file) {
         String hostUrl = dictionaryConfig.syncDataDomain().getHostUrl();
         String fileUploadUrl = dictionaryConfig.syncDataDomain().getFileUploadUrl();
         validUrl(hostUrl, fileUploadUrl);
@@ -175,7 +175,9 @@ public class StmmsUtils {
             JSONObject jsonObject = JSONObject.parseObject(result);
             if (jsonObject.containsKey("success")) {
                 String success = jsonObject.get("success").toString();
-                return Boolean.valueOf(success);
+                if (Boolean.valueOf(success) && jsonObject.containsKey("url")) {
+                    return jsonObject.get("url").toString();
+                }
             }
         } catch (Exception e) {
             throw ExceptionResultEnum.ERROR.exception(e.getMessage());
@@ -184,7 +186,7 @@ public class StmmsUtils {
                 file.delete();
             }
         }
-        return false;
+        return "";
     }
 
     /**
@@ -215,6 +217,9 @@ public class StmmsUtils {
             String jsonData = JSONObject.toJSONString(map);
 
             String result = HttpKit.sendPost(postUrl, jsonData, getHeaders(schoolId, structureUrl));
+            if (StringUtils.isBlank(result)) {
+                return false;
+            }
             JSONObject jsonObject = JSONObject.parseObject(result);
             if (jsonObject.containsKey("updateTime")) {
                 return true;
@@ -225,6 +230,32 @@ public class StmmsUtils {
         return false;
     }
 
+    /**
+     * 试卷结构查询接口
+     * @param schoolId 学校ID
+     * @param examId 考试ID
+     * @param subjectCode 科目代码
+     * @param paperType 试卷编号
+     */
+    public List<Map> queryPaperStructure(Long schoolId, String examId, String subjectCode, String paperType) {
+        String hostUrl = dictionaryConfig.syncDataDomain().getHostUrl();
+        String queryPaperStructure = dictionaryConfig.syncDataDomain().getQueryPaperStructure();
+        validUrl(hostUrl, queryPaperStructure);
+        String postUrl = hostUrl.concat(queryPaperStructure);
+        try {
+            //参数
+            Map<String, String> map = new HashMap<>();
+            map.put("examId", validParam(examId, null, true, "考试ID"));
+            map.put("subjectCode", validParam(subjectCode, null, true, "科目代码")); // 取试卷编号
+            map.put("paperType", validParam(paperType, null, false, "试卷类型"));
+
+            String result = HttpKit.sendPost(postUrl, map, getHeaders(schoolId, queryPaperStructure));
+            return JSONObject.parseArray(JSONObject.toJSON(result).toString(), Map.class);
+        } catch (Exception e) {
+            throw ExceptionResultEnum.ERROR.exception(e.getMessage());
+        }
+    }
+
     /**
      * 评卷员登录
      */
@@ -310,10 +341,10 @@ public class StmmsUtils {
     /**
      * 校验参数值并返回(字符型)
      *
-     * @param value       参数值
+     * @param value        参数值
      * @param defaultValue 默认值
-     * @param require     是否必填(true:是,false:否)
-     * @param name        参数名称
+     * @param require      是否必填(true:是,false:否)
+     * @param name         参数名称
      */
     private String validParam(String value, String defaultValue, boolean require, String name) {
         if (require && StringUtils.isAllBlank(value, defaultValue)) {
@@ -372,7 +403,6 @@ public class StmmsUtils {
     /**
      * 考试成绩考生数量查询接口
      *
-     *
      * @param schoolId
      * @param examId
      * @param examCode
@@ -419,7 +449,6 @@ public class StmmsUtils {
     /**
      * 考试成绩考生查询接口
      *
-     *
      * @param schoolId
      * @param examId
      * @param examCode

+ 10 - 10
teachcloud-common/src/main/java/com/qmth/teachcloud/common/util/HttpKit.java

@@ -88,7 +88,7 @@ public class HttpKit {
     }
 
     /**
-     * 向指定 URL 发送POST方法的请求
+     * 向指定 URL 发送POST方法的请求(JSON数据)
      *
      * @param url      发送请求的 URL
      * @param jsonData 请求的json
@@ -96,7 +96,7 @@ public class HttpKit {
      */
     @SuppressWarnings("unused")
     public static String sendPost(String url, String jsonData, Map<String, String> requestHeader) {
-        OutputStreamWriter out = null;
+        DataOutputStream out = null;
         BufferedReader in = null;
         StringBuilder result = new StringBuilder();
         try {
@@ -108,23 +108,23 @@ public class HttpKit {
             // POST方法
             conn.setRequestMethod("POST");
             // 设置通用的请求属性
-            conn.setRequestProperty("accept", "*/*");
-            conn.setRequestProperty("connection", "Keep-Alive");
-            conn.setRequestProperty("user-agent",
-                    "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
-            conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
+//            conn.setRequestProperty("accept", "*/*");
+//            conn.setRequestProperty("connection", "Keep-Alive");
+//            conn.setRequestProperty("user-agent",
+//                    "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
+            conn.setRequestProperty("Content-Type", "application/json");
             if (requestHeader != null && requestHeader.size() > 0) {
                 for (Map.Entry<String, String> entry : requestHeader.entrySet()) {
                     conn.setRequestProperty(entry.getKey(), entry.getValue());
                 }
             }
-//            conn.setRequestProperty("Authorization", authorization);
             conn.connect();
             // 获取URLConnection对象对应的输出流
-            out = new OutputStreamWriter(conn.getOutputStream(), "UTF-8");
+            out = new DataOutputStream(conn.getOutputStream());
             // 发送请求参数
             if (StringUtils.isNotBlank(jsonData)) {
-                out.write(jsonData);
+                String json = java.net.URLEncoder.encode(jsonData, "utf-8");
+                out.writeBytes(json);
             }
             // flush输出流的缓冲
             out.flush();