소스 검색

fix:主观题导入

caozixuan 1 년 전
부모
커밋
887498fc6a

+ 1 - 1
distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/execute/SyncSubjectiveStructImportService.java

@@ -43,7 +43,7 @@ public class SyncSubjectiveStructImportService extends SyncImportTaskTemplate {
             map.put("inputStream", inputStream);
             TaskLogicService taskLogicService = SpringContextHolder.getBean(TaskLogicService.class);
             // 执行导入考务数据
-            taskLogicService.executeImportObjectiveStructLogic(map);
+            taskLogicService.executeImportSubjectiveStructLogic(map);
             tbTask.setResult(TaskResultEnum.SUCCESS);
             stringJoinerSummary.add("导入主观题结构成功");
         } catch (Exception e) {

+ 153 - 131
distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/service/impl/TaskLogicServiceImpl.java

@@ -28,6 +28,7 @@ import com.qmth.teachcloud.common.bean.dto.excel.*;
 import com.qmth.teachcloud.common.bean.dto.excel.export.BasicStudentErrorExportDto;
 import com.qmth.teachcloud.common.bean.dto.excel.export.SysUserErrorExportDto;
 import com.qmth.teachcloud.common.bean.dto.mark.MarkUser;
+import com.qmth.teachcloud.common.bean.dto.mark.PictureConfig;
 import com.qmth.teachcloud.common.bean.params.ArraysParams;
 import com.qmth.teachcloud.common.bean.params.UserSaveParams;
 import com.qmth.teachcloud.common.bean.result.ExcelResult;
@@ -40,7 +41,10 @@ import com.qmth.teachcloud.common.enums.*;
 import com.qmth.teachcloud.common.service.*;
 import com.qmth.teachcloud.common.util.*;
 import com.qmth.teachcloud.common.util.excel.ExcelError;
+import com.qmth.teachcloud.mark.dto.mark.setting.MarkGroupDto;
+import com.qmth.teachcloud.mark.dto.mark.setting.MarkGroupSingleDto;
 import com.qmth.teachcloud.mark.entity.MarkPaper;
+import com.qmth.teachcloud.mark.enums.ScorePolicy;
 import com.qmth.teachcloud.mark.params.MarkQuestionParams;
 import com.qmth.teachcloud.mark.service.MarkGroupService;
 import com.qmth.teachcloud.mark.service.MarkPaperService;
@@ -2558,7 +2562,7 @@ public class TaskLogicServiceImpl implements TaskLogicService {
             }
 
             // 3.评卷员校验
-            if (Objects.isNull(markerCount) && Objects.isNull(markerCodes)){
+            if (Objects.isNull(markerCount) && Objects.isNull(markerCodes)) {
                 excelErrorList.add("[评卷员数量(系统生成)]和[绑定工号(英文逗号分隔)]不能同时为空");
             }
 
@@ -2577,154 +2581,172 @@ public class TaskLogicServiceImpl implements TaskLogicService {
             throw ExceptionResultEnum.ERROR.exception(
                     subjectiveStructDtoList.stream().map(SubjectiveStructDto::getErrorMsg).filter(SystemConstant::strNotNull).collect(Collectors.joining(System.lineSeparator())));
         } else {
-            List<String> logicErrorList = new ArrayList<>();
+            List<String> paperErrorList = new ArrayList<>();
             // 试卷编号-> 题目集合 Map
             Map<String, List<SubjectiveStructDto>> paperQuestionsMap = subjectiveStructDtoList.stream().collect(Collectors.groupingBy(SubjectiveStructDto::getPaperNumber));
             paperQuestionsMap.forEach((paperNumber, paperQuestionList) -> {
-                if (markGroupService.countByExamIdAndPaperNumber(examId,paperNumber) > 0){
-                    logicErrorList.add(String.format("[试卷编号]%s,已存在分组,请先删除该试卷的所有分组再导入试题", paperNumber));
-                }
-                // 创建评卷试题
-                List<MarkQuestion> markQuestionList = paperQuestionList.stream().flatMap(e -> {
-                    MarkQuestion markQuestion = new MarkQuestion();
-                    markQuestion.setExamId(examId);
-                    markQuestion.setPaperNumber(paperNumber);
-                    markQuestion.setPaperType(OptionsEnum.A.getCode());
-                    markQuestion.setObjective(false);
-                    markQuestion.setMainNumber(e.getMainNumber());
-                    markQuestion.setSubNumber(e.getSubNumber());
-                    markQuestion.setMainTitle(e.getMainTitle());
-                    markQuestion.setTotalScore(e.getTotalScore());
-                    markQuestion.setIntervalScore(e.getIntervalScore());
-                    return Stream.of(markQuestion);
-                }).collect(Collectors.toList());
-                MarkQuestionParams markQuestionParams = new MarkQuestionParams();
-                markQuestionParams.setQuestions(markQuestionList);
-                markQuestionParams.setExamId(examId);
-                markQuestionParams.setPaperNumber(paperNumber);
-                markQuestionService.saveQuestions(markQuestionParams);
-
-
-                // 试卷下分组集合
-                List<Integer> groupNumberList = paperQuestionList.stream()
-                        .map(SubjectiveStructDto::getGroupNumber)
-                        .distinct().sorted()
-                        .collect(Collectors.toList());
-
-                // 评卷员序号
-                AtomicInteger markerNumber = new AtomicInteger(0);
-                for (Integer groupNumber : groupNumberList) {
-                    // 分组下题目集合
-                    List<SubjectiveStructDto> groupQuestionList = paperQuestionList.stream()
-                            .filter(e -> e.getGroupNumber().equals(groupNumber))
-                            .collect(Collectors.toList());
-
-                    String paperNumberGroupNumberNotice = String.format("[试卷编号]%s,[评卷分组(只能用小写数字)]%s",paperNumber, groupNumber);
-
-                    String orgName = null;
-                    Long orgId = null;
-                    BasicCourse basicCourse = basicCourseService.getOne(new QueryWrapper<BasicCourse>().lambda().eq(BasicCourse::getSchoolId,schoolId).eq(BasicCourse::getCode,groupQuestionList.get(0).getCourseCode()));
-                    if (Objects.isNull(basicCourse)){
-                        logicErrorList.add(paperNumberGroupNumberNotice + "的[课程代码]不存在");
-                    } else {
-                        Long teachingRoomId = basicCourse.getTeachingRoomId();
-                        SysOrg sysOrg = sysOrgService.getById(teachingRoomId);
-                        if (Objects.isNull(sysOrg)) {
-                            throw ExceptionResultEnum.ERROR.exception("无法找到机构");
+                if (markGroupService.countByExamIdAndPaperNumber(examId, paperNumber) > 0) {
+                    paperErrorList.add(String.format("[试卷编号]%s,已存在分组,请先删除该试卷的所有分组再导入试题", paperNumber));
+                } else {
+                    // 优先删除该试卷的主观题
+                    markQuestionService.remove(
+                            new QueryWrapper<MarkQuestion>().lambda().eq(MarkQuestion::getExamId, examId)
+                                    .eq(MarkQuestion::getPaperNumber, paperNumber).eq(MarkQuestion::getObjective, false));
+
+                    // 试卷下分组集合
+                    List<Integer> groupNumberList = paperQuestionList.stream().map(SubjectiveStructDto::getGroupNumber)
+                            .distinct().sorted().collect(Collectors.toList());
+
+                    // 评卷员序号
+                    AtomicInteger markerNumber = new AtomicInteger(0);
+                    for (Integer groupNumber : groupNumberList) {
+                        List<String> groupErrorList = new ArrayList<>();
+                        // 分组下题目集合
+                        List<SubjectiveStructDto> groupQuestionList = paperQuestionList.stream()
+                                .filter(e -> e.getGroupNumber().equals(groupNumber)).collect(Collectors.toList());
+
+                        String paperNumberGroupNumberNotice = String.format("[试卷编号]%s,[评卷分组(只能用小写数字)]%s,的", paperNumber,
+                                groupNumber);
+
+                        String orgName = null;
+                        Long orgId = null;
+                        BasicCourse basicCourse = basicCourseService.getOne(
+                                new QueryWrapper<BasicCourse>().lambda().eq(BasicCourse::getSchoolId, schoolId)
+                                        .eq(BasicCourse::getCode, groupQuestionList.get(0).getCourseCode()));
+                        if (Objects.isNull(basicCourse)) {
+                            groupErrorList.add("[课程代码]不存在");
+                        } else {
+                            Long teachingRoomId = basicCourse.getTeachingRoomId();
+                            SysOrg sysOrg = sysOrgService.getById(teachingRoomId);
+                            if (Objects.isNull(sysOrg)) {
+                                throw ExceptionResultEnum.ERROR.exception("无法找到机构");
+                            }
+                            orgName = sysOrg.getName();
+                            orgId = sysOrg.getId();
                         }
-                        orgName = sysOrg.getName();
-                        orgId = sysOrg.getId();
-                    }
-                    Integer markerCount = null;
-                    String markerCodes = null;
-                    List<Integer> markerCountList = groupQuestionList.stream().map(SubjectiveStructDto::getMarkerCount).distinct().collect(Collectors.toList());
-                    if (CollectionUtils.isNotEmpty(markerCountList)){
-                        if (markerCountList.size() > 1){
-                            logicErrorList.add(paperNumberGroupNumberNotice + "的[评卷员数量(系统生成)]不一致");
-                        } else if (markerCountList.size() == 1){
-                            markerCount = markerCountList.get(0);
+                        Integer markerCount = null;
+                        String markerCodes = null;
+                        List<Integer> markerCountList = groupQuestionList.stream().map(SubjectiveStructDto::getMarkerCount).distinct().collect(Collectors.toList());
+                        if (CollectionUtils.isNotEmpty(markerCountList)) {
+                            if (markerCountList.size() > 1) {
+                                groupErrorList.add("[评卷员数量(系统生成)]不一致");
+                            } else if (markerCountList.size() == 1) {
+                                markerCount = markerCountList.get(0);
+                            }
                         }
-                    }
 
-
-                    List<String> markerCodesList= groupQuestionList.stream().map(SubjectiveStructDto::getMarkerCodes).distinct().collect(Collectors.toList());
-                    if (CollectionUtils.isNotEmpty(markerCodesList)){
-                        if (markerCodesList.size() > 1){
-                            logicErrorList.add(paperNumberGroupNumberNotice + "的[绑定工号(英文逗号分隔)]不一致");
-                        } else if (markerCodesList.size() == 1){
-                            markerCodes = markerCodesList.get(0);
+                        List<String> markerCodesList = groupQuestionList.stream().map(SubjectiveStructDto::getMarkerCodes).distinct().collect(Collectors.toList());
+                        if (CollectionUtils.isNotEmpty(markerCodesList)) {
+                            if (markerCodesList.size() > 1) {
+                                groupErrorList.add("[绑定工号(英文逗号分隔)]不一致");
+                            } else if (markerCodesList.size() == 1) {
+                                markerCodes = markerCodesList.get(0);
+                            }
                         }
-                    }
 
-                    // 组装评卷员信息
-                    List<MarkUser> markUsers = new ArrayList<>();
-                    if (SystemConstant.strNotNull(markerCodes)) {
-                        // 优先以绑定工号为准
-                        String[] markerCodeArray = markerCodes.split(SystemConstant.COMMA);
-                        for (String markerCode : markerCodeArray) {
-                            SysUser sysUser = sysUserService.getOne(
-                                    new QueryWrapper<SysUser>().lambda().eq(SysUser::getSchoolId, schoolId).eq(SysUser::getLoginName, markerCode).last(SystemConstant.LIMIT1));
-                            if (Objects.isNull(sysUser)) {
-                                logicErrorList.add(String.format("[试卷编号]%s,[评卷分组(只能用小写数字)]%s,[绑定工号(英文逗号分隔)]%s不存在", paperNumber, groupNumber, markerCode));
-                            } else {
-                                // 添加评卷员信息
+                        // 组装评卷员信息
+                        List<MarkUser> markUsers = new ArrayList<>();
+                        if (SystemConstant.strNotNull(markerCodes)) {
+                            // 优先以绑定工号为准
+                            String[] markerCodeArray = markerCodes.split(SystemConstant.COMMA);
+                            for (String markerCode : markerCodeArray) {
+                                SysUser sysUser = sysUserService.getOne(
+                                        new QueryWrapper<SysUser>().lambda().eq(SysUser::getSchoolId, schoolId).eq(SysUser::getLoginName, markerCode).last(SystemConstant.LIMIT1));
+                                if (Objects.isNull(sysUser)) {
+                                    groupErrorList.add(paperNumberGroupNumberNotice + String.format(
+                                            "[绑定工号(英文逗号分隔)]中的%s,在系统中不存在请先创建用户", markerCode));
+                                } else {
+                                    // 添加评卷员信息
+                                    MarkUser markUser = new MarkUser();
+                                    markUser.setUserId(sysUser.getId());
+                                    markUser.setLoginName(sysUser.getLoginName());
+                                    markUser.setName(sysUser.getRealName());
+                                    markUser.setOrgName(orgName);
+                                    markUsers.add(markUser);
+                                }
+                            }
+                        } else if (Objects.nonNull(markerCount) && markerCount > 0) {
+                            // 没有绑定工号且评卷员生成数量大于0,生成评卷员(或使用之前工号相同的评卷员)
+                            for (int i = 0; i < markerCount; i++) {
+                                int num = markerNumber.incrementAndGet();
+                                if (num > 99) {
+                                    paperErrorList.add("[试卷编号]%s的[评卷员数量(系统生成)]总有效数量不能超过99");
+                                    break;
+                                }
+                                String markerCode = paperNumber + String.format("%02d", num);
+
+                                SysUser sysUser = sysUserService.getOne(
+                                        new QueryWrapper<SysUser>().lambda().eq(SysUser::getSchoolId, schoolId).eq(SysUser::getLoginName, markerCode).last(SystemConstant.LIMIT1));
+
                                 MarkUser markUser = new MarkUser();
-                                markUser.setUserId(sysUser.getId());
-                                markUser.setLoginName(sysUser.getLoginName());
-                                markUser.setName(sysUser.getRealName());
+                                markUser.setLoginName(markerCode);
                                 markUser.setOrgName(orgName);
                                 markUsers.add(markUser);
-                            }
-                        }
-                    } else if (Objects.nonNull(markerCount) && markerCount > 0) {
-                        // 没有绑定工号且评卷员生成数量大于0,生成评卷员(或使用之前工号相同的评卷员)
-                        for (int i = 0; i < markerCount; i++) {
-                            int num = markerNumber.incrementAndGet();
-                            if (num > 99){
-                                logicErrorList.add("[试卷编号]%s的[评卷员数量(系统生成)]总有效数量不能超过99");
-                                break;
-                            }
-                            String markerCode = String.format("%02d",num);
-
-                            SysUser sysUser = sysUserService.getOne(new QueryWrapper<SysUser>().lambda()
-                                    .eq(SysUser::getSchoolId, schoolId)
-                                    .eq(SysUser::getLoginName, markerCode)
-                                    .last(SystemConstant.LIMIT1));
-
-                            MarkUser markUser = new MarkUser();
-                            markUser.setLoginName(markerCode);
-                            markUser.setOrgName(orgName);
-                            markUsers.add(markUser);
-                            if (Objects.nonNull(sysUser)){
-                                markUser.setUserId(sysUser.getId());
-                                markUser.setName(sysUser.getRealName());
-                            } else {
-                                // 创建用户
-                                UserSaveParams userSaveParams = new UserSaveParams();
-                                userSaveParams.setSchoolId(schoolId);
-                                userSaveParams.setLoginName(markerCode);
-                                userSaveParams.setRealName(markerCode);
-                                userSaveParams.setCode(markerCode);
-                                userSaveParams.setPassword(SystemConstant.DEFAULT_PASSWORD);
-                                userSaveParams.setOrgId(orgId);
-                                userSaveParams.setEnable(true);
-                                userSaveParams.setRoleIds(new Long[] { markerRole.getId() });
-                                try {
-                                    markUser.setUserId(sysUserService.saveUser(userSaveParams));
-                                    markUser.setName(markerCode);
-                                } catch (IllegalAccessException e) {
-                                    e.printStackTrace();
+                                if (Objects.nonNull(sysUser)) {
+                                    markUser.setUserId(sysUser.getId());
+                                    markUser.setName(sysUser.getRealName());
+                                } else {
+                                    // 创建用户
+                                    UserSaveParams userSaveParams = new UserSaveParams();
+                                    userSaveParams.setSchoolId(schoolId);
+                                    userSaveParams.setLoginName(markerCode);
+                                    userSaveParams.setRealName(markerCode);
+                                    userSaveParams.setCode(markerCode);
+                                    userSaveParams.setPassword(SystemConstant.DEFAULT_PASSWORD);
+                                    userSaveParams.setOrgId(orgId);
+                                    userSaveParams.setEnable(true);
+                                    userSaveParams.setRoleIds(new Long[] { markerRole.getId() });
+                                    try {
+                                        markUser.setUserId(sysUserService.saveUser(userSaveParams));
+                                        markUser.setName(markerCode);
+                                    } catch (IllegalAccessException e) {
+                                        e.printStackTrace();
+                                    }
                                 }
                             }
                         }
-
+                        if (CollectionUtils.isEmpty(groupErrorList) && CollectionUtils.isEmpty(paperErrorList)) {
+                            // 创建评卷试题
+                            List<MarkQuestion> markQuestionList = paperQuestionList.stream().filter(e -> groupNumber.equals(e.getGroupNumber())).flatMap(e -> {
+                                MarkQuestion markQuestion = new MarkQuestion();
+                                markQuestion.setExamId(examId);
+                                markQuestion.setPaperNumber(paperNumber);
+                                markQuestion.setPaperType(OptionsEnum.A.getCode());
+                                markQuestion.setObjective(false);
+                                markQuestion.setMainNumber(e.getMainNumber());
+                                markQuestion.setSubNumber(e.getSubNumber());
+                                markQuestion.setMainTitle(e.getMainTitle());
+                                markQuestion.setTotalScore(e.getTotalScore());
+                                markQuestion.setIntervalScore(e.getIntervalScore());
+                                markQuestion.setQuestionType(QuestionType.QUESTION_ANSWER.getValue());
+                                return Stream.of(markQuestion);
+                            }).collect(Collectors.toList());
+                            markQuestionService.saveBatch(markQuestionList);
+
+                            MarkGroupDto markGroupDto = new MarkGroupDto();
+                            markGroupDto.setDoubleEnable(false);
+                            markGroupDto.setGroupNumber(groupNumber);
+                            markGroupDto.setMarkers(markUsers);
+                            markGroupDto.setQuestions(markQuestionList);
+                            markGroupDto.setPictureConfigs(new ArrayList<>());
+                            MarkGroupSingleDto markGroupSingleDto = new MarkGroupSingleDto();
+                            markGroupSingleDto.setExamId(examId);
+                            markGroupSingleDto.setPaperNumber(paperNumber);
+                            markGroupSingleDto.setGroupInfo(markGroupDto);
+                            markGroupService.saveGroup(markGroupSingleDto);
+                        }
+                        if (CollectionUtils.isNotEmpty(groupErrorList)) {
+                            String groupErrorMsg = paperNumberGroupNumberNotice + String.join(",", groupErrorList);
+                            paperErrorList.add(groupErrorMsg);
+                        }
                     }
-
-
                 }
             });
+            if (CollectionUtils.isNotEmpty(paperErrorList)) {
+                throw ExceptionResultEnum.ERROR.exception(String.join(System.lineSeparator(), paperErrorList));
+            }
         }
-        return null;
+        return map;
     }
 
     /**

+ 4 - 1
distributed-print/src/main/java/com/qmth/distributed/print/api/mark/MarkSettingController.java

@@ -6,6 +6,7 @@ import com.qmth.distributed.print.business.entity.ExamTaskDetail;
 import com.qmth.distributed.print.business.service.ExamTaskDetailService;
 import com.qmth.distributed.print.business.service.PrintCommonService;
 import com.qmth.distributed.print.business.templete.execute.SyncObjectiveStructImportService;
+import com.qmth.distributed.print.business.templete.execute.SyncSubjectiveStructImportService;
 import com.qmth.teachcloud.common.annotation.OperationLogDetail;
 import com.qmth.teachcloud.common.bean.dto.mark.MarkSettingDto;
 import com.qmth.teachcloud.common.bean.vo.PaperInfoVo;
@@ -58,6 +59,8 @@ public class MarkSettingController {
     private PrintCommonService printCommonService;
     @Resource
     private SyncObjectiveStructImportService syncObjectiveStructImportService;
+    @Resource
+    private SyncSubjectiveStructImportService syncSubjectiveStructImportService;
 
     /**
      * 评卷设置数据列表
@@ -153,6 +156,6 @@ public class MarkSettingController {
             @ApiParam(value = "标答excel文件",required = true) @RequestParam MultipartFile file) throws Exception {
         Map<String, Object> map = printCommonService.saveTask(file, SystemConstant.convertIdToLong(examId), TaskTypeEnum.SUBJECTIVE_STRUCT_IMPORT);
         map.put("examId", SystemConstant.convertIdToLong(examId));
-        return syncObjectiveStructImportService.importTask(map);
+        return syncSubjectiveStructImportService.importTask(map);
     }
 }

+ 5 - 5
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkGroupServiceImpl.java

@@ -27,16 +27,16 @@ import com.qmth.teachcloud.mark.lock.LockService;
 import com.qmth.teachcloud.mark.mapper.MarkGroupMapper;
 import com.qmth.teachcloud.mark.service.*;
 import com.qmth.teachcloud.mark.utils.Calculator;
-import org.apache.commons.codec.digest.DigestUtils;
 import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.MapUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
-import java.text.DecimalFormat;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Comparator;
+import java.util.List;
 import java.util.stream.Collectors;
 
 /**
@@ -281,7 +281,7 @@ public class MarkGroupServiceImpl extends MppServiceImpl<MarkGroupMapper, MarkGr
         markGroup.setCourseName(markPaper.getCourseName());
         markGroup.setNumber(markGroupDto.getGroupNumber());
         markGroup.setPicList(CardFile.getMarkConfigAdd(markGroupDto.getPictureConfigs(), 0.015));
-        Double totalScore = questions.stream().collect(Collectors.summingDouble(MarkQuestion::getTotalScore));
+        Double totalScore = questions.stream().mapToDouble(MarkQuestion::getTotalScore).sum();
         markGroup.setTotalScore(totalScore);
         markGroup.setDoubleEnable(markGroupDto.getDoubleEnable());
         if (markGroupDto.getDoubleEnable()) {