diff --git a/servers/boe-server-all/src/main/java/com/xboe/api/ThirdApi.java b/servers/boe-server-all/src/main/java/com/xboe/api/ThirdApi.java index 272d2560..2291e71c 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/api/ThirdApi.java +++ b/servers/boe-server-all/src/main/java/com/xboe/api/ThirdApi.java @@ -17,10 +17,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.data.domain.Page; import org.springframework.stereotype.Service; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Optional; +import java.util.*; import java.util.concurrent.ForkJoinPool; import java.util.stream.Collectors; import java.util.stream.IntStream; @@ -62,6 +59,10 @@ public class ThirdApi { @Value("${coursesuilt.getStudyStatus}") private String getStudyStatus; + + @Value("${userBasic.getUserIdByWorkNum}") + private String getUserIdByWorkNum; + //获取例外人员的id public List getUserId(){ String responseBody = Optional.ofNullable(HttpRequest.get(infarasApiUrl+"?pid=316&type=1").execute() //prod 316 @@ -217,8 +218,23 @@ public class ThirdApi { List list = a.getResult().getList(); System.out.println(" list = " +list.size()); System.out.println(" list = " +list); + } - + public HashMap getUserIdByWorkNum(String token, List workNumList) { + // 将workNum列表转换为逗号分隔的字符串 + String workNumsStr = workNumList.stream() + .collect(Collectors.joining(",")); + // 构建请求URL + String url = getUserIdByWorkNum+"?workNumList=" + workNumsStr; + String respStr = Optional.ofNullable( + HttpRequest.get(url) + .header("token", token) + .execute().body() + ).orElseThrow(() -> new RuntimeException("Token校验失败")); + // 解析JSON字符串为HashMap + GetUserIdByWorkNumResult getUserIdByWorkNumResult = JSONUtil.parseObj(respStr).toBean(GetUserIdByWorkNumResult.class); + HashMap result = getUserIdByWorkNumResult.getResult(); + return result; } } diff --git a/servers/boe-server-all/src/main/java/com/xboe/api/vo/GetUserIdByWorkNumResult.java b/servers/boe-server-all/src/main/java/com/xboe/api/vo/GetUserIdByWorkNumResult.java new file mode 100644 index 00000000..f8038f4e --- /dev/null +++ b/servers/boe-server-all/src/main/java/com/xboe/api/vo/GetUserIdByWorkNumResult.java @@ -0,0 +1,40 @@ +package com.xboe.api.vo; + +import cn.hutool.json.JSONUtil; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +import java.util.Date; +import java.util.HashMap; + +/** + * Auto-generated: 2022-12-10 14:3:18 + * + * @author bejson.com (i@bejson.com) + * @website http://www.bejson.com/java2pojo/ + */ +@Data +@Slf4j +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class GetUserIdByWorkNumResult { + + private String error; + private String message; + private String permissions; + private HashMap result; + private int status; + private Date timestamp; + + public GetUserIdByWorkNumResult success() { + if (this.status != 200) { + log.error("获取用户ID列表失败----{}", JSONUtil.toJsonPrettyStr(this)); + return null; + } + return this; + } +} \ No newline at end of file diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/exam/api/AloneExamApi.java b/servers/boe-server-all/src/main/java/com/xboe/module/exam/api/AloneExamApi.java index 5f81455e..9e046329 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/exam/api/AloneExamApi.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/exam/api/AloneExamApi.java @@ -1,5 +1,6 @@ package com.xboe.module.exam.api; +import java.io.IOException; import java.io.OutputStream; import java.time.LocalDateTime; import java.util.ArrayList; @@ -14,15 +15,12 @@ import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import com.xboe.module.exam.dto.SaveExamScoreDto; +import com.xboe.module.exam.entity.*; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.dao.DuplicateKeyException; -import org.springframework.web.bind.annotation.GetMapping; -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.RequestMethod; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; @@ -41,9 +39,6 @@ import com.xboe.core.cache.IXaskCache; import com.xboe.core.cache.XaskCacheProvider; import com.xboe.core.exception.XaskException; import com.xboe.module.exam.dto.AloneExamExportDto; -import com.xboe.module.exam.entity.AloneExam; -import com.xboe.module.exam.entity.AloneExamAnswer; -import com.xboe.module.exam.entity.ExamTest; import com.xboe.module.exam.service.IAloneExamService; import com.xboe.module.exam.service.IExamPaperService; import com.xboe.module.exam.service.IExamTestService; @@ -707,4 +702,18 @@ public class AloneExamApi extends ApiBaseController { } } + + + /** + * + * @param request + * @param saveExamScoreDtoList + * @return + * @throws IOException + */ + @PostMapping("/examScoreBatchAdd") + public JsonResponse examScoreBatchAdd(HttpServletRequest request, @RequestBody List saveExamScoreDtoList){ + return success(service.examScoreBatchAdd(request, saveExamScoreDtoList)); + } + } diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/exam/dto/SaveExamScoreDto.java b/servers/boe-server-all/src/main/java/com/xboe/module/exam/dto/SaveExamScoreDto.java new file mode 100644 index 00000000..0c9fceb3 --- /dev/null +++ b/servers/boe-server-all/src/main/java/com/xboe/module/exam/dto/SaveExamScoreDto.java @@ -0,0 +1,122 @@ +package com.xboe.module.exam.dto; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import javax.persistence.Column; +import java.time.LocalDateTime; + +/** + * 单独的考虑答卷信息 + */ +@Data +public class SaveExamScoreDto { + /** + * 用户姓名 + */ + private String userId; + + + /** + * 用户姓名 + */ + private String userName; + + /** + * 考试id + */ + private String testId; + + /** + * 考试名称 + */ + private String testName; + +// /** +// * 考试时长 分钟 +// */ +// private Integer testDuration; + + /** + * 试题排列 1试题乱序,2选项乱序,3全部乱序 + */ + private Integer arrange; + +// /** +// * 及格线 +// */ +// private Integer passLine; + + /** + * 账户的代码,用于区别于同姓名的用户 + */ + private String workNum; + + + /** + * 独立考试任务的id + */ + private String aloneId; + + /** + * 试卷总分 + */ + @Column(name = "total_score") + private Float totalScore; + + +// /** +// * 答卷内容 +// */ +// @Column(name = "answer_json", columnDefinition = "mediumtext") +// private String answerJson; + + // todo by yyk 2024-05-17 14:10:32 确定分数 + /** + * 用户的实际得分 + */ + private Float realScore; + + /** + * 用时秒 + */ + private Integer useSecond; + + + /** + * 最终成绩,如果是百分制,用户的实际得分会换算为百分制 + */ + private Float score; + + /** + * 开始时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss") + private LocalDateTime startTime; + + /** + * 结束时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss") + private LocalDateTime endTime; + + + /** + * 完成状态 + */ + private Integer status; + + /** + * 考试次数 + */ + private Integer times; + + + /** + * 记录最后的操作时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss") + private LocalDateTime lastTime; + + +} diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/exam/service/IAloneExamService.java b/servers/boe-server-all/src/main/java/com/xboe/module/exam/service/IAloneExamService.java index 0d37f7d5..1446a05b 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/exam/service/IAloneExamService.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/exam/service/IAloneExamService.java @@ -1,15 +1,18 @@ package com.xboe.module.exam.service; +import java.util.HashMap; import java.util.List; import java.util.Map; import com.xboe.common.OrderCondition; import com.xboe.common.PageList; +import com.xboe.module.exam.dto.SaveExamScoreDto; import com.xboe.module.exam.dto.TestUserDto; import com.xboe.module.exam.dto.TestUserQuery; import com.xboe.module.exam.entity.AloneExam; import com.xboe.module.exam.entity.AloneExamAnswer; import com.xboe.module.exam.vo.AloneExamQuery; +import javax.servlet.http.HttpServletRequest; /** * 独立考试的处理。此信息无删除操作,更新也只是更新answerJson字段 @@ -156,5 +159,7 @@ public interface IAloneExamService { * @throws Exception */ PageList findTestUserAnswers(TestUserQuery params) throws Exception; - + + HashMap examScoreBatchAdd(HttpServletRequest request, List saveExamScoreDtoList); + } diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/exam/service/impl/AloneExamServiceImpl.java b/servers/boe-server-all/src/main/java/com/xboe/module/exam/service/impl/AloneExamServiceImpl.java index 263f836f..845ec53a 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/exam/service/impl/AloneExamServiceImpl.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/exam/service/impl/AloneExamServiceImpl.java @@ -1,15 +1,21 @@ package com.xboe.module.exam.service.impl; import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; +import java.util.stream.Collectors; import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import com.xboe.api.ThirdApi; +import com.xboe.module.exam.dao.ExamTestDao; +import com.xboe.module.exam.dto.*; import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.PlatformTransactionManager; +import org.springframework.transaction.TransactionStatus; import org.springframework.transaction.annotation.Transactional; import com.xboe.common.OrderCondition; @@ -20,14 +26,12 @@ import com.xboe.core.orm.QueryBuilder; import com.xboe.core.orm.UpdateBuilder; import com.xboe.module.exam.dao.AloneExamAnswerDao; import com.xboe.module.exam.dao.AloneExamDao; -import com.xboe.module.exam.dto.TestUserAnswerDto; -import com.xboe.module.exam.dto.TestUserDto; -import com.xboe.module.exam.dto.TestUserQuery; import com.xboe.module.exam.entity.AloneExam; import com.xboe.module.exam.entity.AloneExamAnswer; import com.xboe.module.exam.entity.ExamTest; import com.xboe.module.exam.service.IAloneExamService; import com.xboe.module.exam.vo.AloneExamQuery; +import org.springframework.transaction.support.DefaultTransactionDefinition; @Service public class AloneExamServiceImpl implements IAloneExamService{ @@ -37,6 +41,13 @@ public class AloneExamServiceImpl implements IAloneExamService{ @Resource AloneExamDao aeDao; + + @Autowired + private ExamTestDao examTestDao; + + @Autowired + private ThirdApi thirdApi; + @Override @Transactional @@ -427,4 +438,74 @@ public class AloneExamServiceImpl implements IAloneExamService{ rs.setPageSize(params.getPageSize()); return rs; } + + + @Autowired + private PlatformTransactionManager transactionManager; + + + @Override + public HashMap examScoreBatchAdd(HttpServletRequest request, List saveExamScoreDtoList) { + HashMap saveErrorMsgMap = new HashMap<>(); + List workNumList = saveExamScoreDtoList.stream().map(SaveExamScoreDto::getWorkNum).collect(Collectors.toList()); + + String token = request.getHeader("Xboe-Access-Token"); + if (StringUtils.isEmpty(token)) { + token = request.getHeader("token"); + } + HashMap userIdAndWorkNumMap = thirdApi.getUserIdByWorkNum(token, workNumList); + + saveExamScoreDtoList.forEach(examScoreDto -> { + TransactionStatus status = null; // 事务状态 + + try { + // 获取事务定义 + DefaultTransactionDefinition def = new DefaultTransactionDefinition(); + // 设置事务隔离级别 + def.setIsolationLevel(DefaultTransactionDefinition.ISOLATION_READ_COMMITTED); + // 设置事务传播行为 + def.setPropagationBehavior(DefaultTransactionDefinition.PROPAGATION_REQUIRED); + // 获取事务状态 + status = transactionManager.getTransaction(def); + + AloneExamAnswer aloneExamAnswer = new AloneExamAnswer(); + BeanUtils.copyProperties(examScoreDto, aloneExamAnswer); + + String userId = userIdAndWorkNumMap.get(examScoreDto.getWorkNum()); + aloneExamAnswer.setAid(userId); + aloneExamAnswer.setName(examScoreDto.getUserName()); + + ExamTest examTest = examTestDao.get(examScoreDto.getTestId()); + aloneExamAnswer.setPassLine(examTest.getPassLine()); + aloneExamAnswer.setArrange(examTest.getArrange()); + aloneExamAnswer.setTestDuration(examTest.getTestDuration()); + + // 获取考试任务ID + String aloneExamId = (String) aeDao.findField("id", + FieldFilters.eq("aid", userId), + FieldFilters.eq("testId", examScoreDto.getTestId()) + ); + aloneExamAnswer.setAloneId(aloneExamId); + + dao.save(aloneExamAnswer); + + // 最后一次的分数为准 + aeDao.update(UpdateBuilder.from(AloneExam.class) + .addUpdateField("status", examScoreDto.getStatus()) + .addUpdateField("score", examScoreDto.getScore()) + .addFilter(FieldFilters.eq("aid", userId)) + .addFilter(FieldFilters.eq("testId", examScoreDto.getTestId())) + .builder()); + // 提交事务 + transactionManager.commit(status); + } catch (Exception e) { + // 如果发生异常,回滚事务 + if (status != null && !status.isCompleted()) { + transactionManager.rollback(status); + } + saveErrorMsgMap.put(examScoreDto.getWorkNum(), e.getMessage()); + } + }); + return saveErrorMsgMap; + } } diff --git a/servers/boe-server-all/src/main/resources/application.properties b/servers/boe-server-all/src/main/resources/application.properties index 7f8192bc..e6c8cca7 100644 --- a/servers/boe-server-all/src/main/resources/application.properties +++ b/servers/boe-server-all/src/main/resources/application.properties @@ -73,4 +73,5 @@ infrasApi.dict=${boe.domain}/infrasApi/dict/list manageApi.stu.offcourse=${boe.domain}/manageApi/stu/offcourse/getOffCourseId #获取离职教师id userBasic.getTeacherIds=${boe.domain}/userbasic/user/getTeacherInfo +userBasic.getUserIdByWorkNum=${boe.domain}/userbasic/user/getUserIdByWorkNum coursesuilt.getStudyStatus=${boe.domain}/manageApi/stu/project/completeStatus \ No newline at end of file