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 cfbbc75c..eb039d17 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 @@ -4,7 +4,7 @@ import cn.hutool.core.collection.ListUtil; import cn.hutool.core.lang.Opt; import cn.hutool.http.HttpRequest; import cn.hutool.json.JSONUtil; -import com.alibaba.nacos.shaded.com.google.gson.Gson; +import com.alibaba.nacos.shaded.com.google.gson.*; import com.xboe.api.vo.*; import com.xboe.module.course.vo.StudyCourseVo; import com.xboe.module.course.vo.TeacherInfoVo; @@ -15,9 +15,11 @@ import com.xboe.module.exam.entity.ExamTest; import com.xboe.school.study.entity.StudyCourse; import com.xboe.system.user.dao.UserDao; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; +import java.time.LocalDateTime; import java.util.*; import java.util.concurrent.ForkJoinPool; import java.util.stream.Collectors; @@ -70,9 +72,9 @@ public class ThirdApi { @Value("${coursesuilt.checkBanding}") private String checkBanding; + @Value("${coursesuilt.syncExamScoreToCourseSuite}") + private String syncExamScoreToCourseSuite; - @Value("${manageApi.getExamSycn}") - private String getExamSync; //获取例外人员的id public List getUserId(){ String responseBody = Optional.ofNullable(HttpRequest.get(infarasApiUrl+"?pid=136&type=1").execute() //prod 316 @@ -225,17 +227,7 @@ public class ThirdApi { Opt.ofBlankAble(resp).map(t -> JSONUtil.toBean(t, DynamicBean.class).success()); } - public List getExamList(String aid, String testId, String token) { - AloneExam aloneExam = new AloneExam(); - aloneExam.setAid(aid); - aloneExam.setTestId(testId); -// String resp = Optional.ofNullable( -// ).orElseThrow(() -> new RuntimeException("token校验失败")); - String token1 = HttpRequest.post(getExamSync).body(JSONUtil.toJsonStr(aloneExam)).header("token", token).execute() - .body(); - GetExamSyncResult getExamSyncResult = JSONUtil.toBean(token1, GetExamSyncResult.class); - return getExamSyncResult.getResult(); - } + public static void main(String[] args) { String token = "eyJ0eXBlIjoidG9rZW4iLCJhbGciOiJIUzI1NiJ9.eyJjb21wYW55Q29kZSI6IkMwMDEiLCJ1SWQiOiI5NjUzNDIwMjc0OTc2MDcxNjgiLCJjb21wYW55SWQiOiIxMDQxNjczOTc3Mzc5OTQ2NDk2IiwibG9naW5JZCI6IjE2ODg0NDg5MjIwNzY0OTE3NzgiLCJpc3MiOiJodHRwOi8vdS5ib2UuY29tIiwiR2l2ZW5OYW1lIjoiYm9ldSIsImV4cCI6MTY5MTM5OTc2NzU1OCwidXNlck5hbWUiOiLmnY7njonlhrAiLCJ1c2VySWQiOiI2QjA0OUZBRi1DMzE0LTdDQ0YtMEQyOC0wRDIzRjRDNDI1MzEifQ==.8b52dcf4d48a790ed258b9ca2b279bb269f5301722095382fbd352705b51c893"; String resp = Optional.ofNullable(HttpRequest.post("https://u-pre.boe.com/statApi/xboe/m/stat/userdynamic/list").body(JSONUtil.toJsonStr(UserdynamicParam.builder(). @@ -277,4 +269,22 @@ public class ThirdApi { return checkExamBandingBean.getData().toString(); } + + public void syncExamScoreToCourseSuite(AloneExam aloneExam,String token) { + Gson gson = new GsonBuilder() + .registerTypeAdapter(LocalDateTime.class, new LocalDateTimeSerializer()) + .create(); + + String json = gson.toJson(aloneExam); + String resp = HttpRequest.post(syncExamScoreToCourseSuite) + .body(json) + .header("token", token) + .execute() + .body(); + + if (StringUtils.isBlank(resp)){ + return; + } + JSONUtil.toBean(resp, SyncExamScoreBean.class).success(); + } } diff --git a/servers/boe-server-all/src/main/java/com/xboe/api/vo/LocalDateTimeSerializer.java b/servers/boe-server-all/src/main/java/com/xboe/api/vo/LocalDateTimeSerializer.java new file mode 100644 index 00000000..5f9fe399 --- /dev/null +++ b/servers/boe-server-all/src/main/java/com/xboe/api/vo/LocalDateTimeSerializer.java @@ -0,0 +1,19 @@ +package com.xboe.api.vo; + +import com.alibaba.nacos.shaded.com.google.gson.JsonElement; +import com.alibaba.nacos.shaded.com.google.gson.JsonPrimitive; +import com.alibaba.nacos.shaded.com.google.gson.JsonSerializationContext; +import com.alibaba.nacos.shaded.com.google.gson.JsonSerializer; + +import java.lang.reflect.Type; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +public class LocalDateTimeSerializer implements JsonSerializer { + private final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + + @Override + public JsonElement serialize(LocalDateTime src, Type typeOfSrc, JsonSerializationContext context) { + return new JsonPrimitive(formatter.format(src)); + } +} \ No newline at end of file diff --git a/servers/boe-server-all/src/main/java/com/xboe/api/vo/SyncExamScoreBean.java b/servers/boe-server-all/src/main/java/com/xboe/api/vo/SyncExamScoreBean.java new file mode 100644 index 00000000..3389dd04 --- /dev/null +++ b/servers/boe-server-all/src/main/java/com/xboe/api/vo/SyncExamScoreBean.java @@ -0,0 +1,31 @@ +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; + +@Data +@Slf4j +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class SyncExamScoreBean { + + private boolean show; + private String version; + private int code; + private String msg; + private Object data; + private boolean success; + + public SyncExamScoreBean success() { + if (this.code!=200) { + log.error("同步考试到boe库失败----{}", JSONUtil.toJsonPrettyStr(this)); + return null; + } + return this; + } +} 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 55916e18..0681d6a5 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 @@ -515,7 +515,7 @@ public class AloneExamApi extends ApiBaseController { */ @PostMapping("/submit") public JsonResponse> saveAnswer(HttpServletRequest request,AloneExamAnswer answer,Integer scoreType) { - + if(StringUtils.isBlank(answer.getAnswerJson())) { return badRequest("提交失败,无答卷内容"); } @@ -528,16 +528,11 @@ public class AloneExamApi extends ApiBaseController { if(answer.getScore()==null) { return badRequest("考试分数错误"); } - String token = request.getHeader("Xboe-Access-Token"); - if (StringUtils.isEmpty(token)) { - token = request.getHeader("token"); - } //前台注意计算总分,在后台这里就先不计算了 try { Map map=new HashMap(); CurrentUser cuser = getCurrent(); answer.setAid(cuser.getAccountId()); - answer.setAid(cuser.getAccountId()); answer.setName(cuser.getName()); if(StringUtils.isBlank(answer.getId())) { if(answer.getTotalScore()==null || answer.getTotalScore()==0) { @@ -552,7 +547,7 @@ public class AloneExamApi extends ApiBaseController { //Float realScore=this.calculateScore(answer); //转化成百分数 //answer.setScore(this.calculateScore(detail)); - service.submit(answer,scoreType,token); + service.submit(answer,scoreType,request); return success(map); } catch (Exception e) { log.error("提交答卷错误", e); diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/exam/entity/AloneExam.java b/servers/boe-server-all/src/main/java/com/xboe/module/exam/entity/AloneExam.java index 2f2a5c6a..33909cc7 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/exam/entity/AloneExam.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/exam/entity/AloneExam.java @@ -65,6 +65,7 @@ public class AloneExam extends IdBaseEntity { private String ucode; /**关联类型*/ + /**关联类型 新增关联类型14,代表成长路径图*/ @Column(name = "ref_type", length = 30) private String refType; 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 f7010146..d0acf6e7 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,6 +1,5 @@ package com.xboe.module.exam.service; -import java.util.HashMap; import java.util.List; import java.util.Map; @@ -95,9 +94,11 @@ public interface IAloneExamService { /** * 提交考试 + * * @param aea + * @param request */ - void submit(AloneExamAnswer aea,Integer scoreType,String token); + void submit(AloneExamAnswer aea, Integer scoreType, HttpServletRequest request); /** * 更新答案 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 20c9915b..57db3694 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 @@ -2,6 +2,7 @@ package com.xboe.module.exam.service.impl; import java.time.LocalDateTime; import java.util.*; +import java.util.concurrent.CompletableFuture; import java.util.stream.Collectors; import javax.annotation.Resource; @@ -11,6 +12,8 @@ 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.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -36,6 +39,7 @@ import org.springframework.transaction.support.DefaultTransactionDefinition; @Service public class AloneExamServiceImpl implements IAloneExamService{ + private static final Logger log = LoggerFactory.getLogger(AloneExamServiceImpl.class); @Resource AloneExamAnswerDao dao; @@ -48,7 +52,7 @@ public class AloneExamServiceImpl implements IAloneExamService{ @Autowired private ThirdApi thirdApi; - + @Override @Transactional public void save(AloneExamAnswer aea){ @@ -65,8 +69,7 @@ public class AloneExamServiceImpl implements IAloneExamService{ @Override @Transactional - public void submit(AloneExamAnswer aea,Integer scoreType,String token){ - + public void submit(AloneExamAnswer aea, Integer scoreType, HttpServletRequest request){ //dao.update(aea); aea.setStatus(AloneExamAnswer.STATUS_FINISH); LocalDateTime now=LocalDateTime.now(); @@ -113,8 +116,30 @@ public class AloneExamServiceImpl implements IAloneExamService{ // //这种情况汶是不存在的 // } } + syncExamScoreToCourseSuite(aea, request); + } + + private void syncExamScoreToCourseSuite(AloneExamAnswer aea, HttpServletRequest request) { + String token = request.getHeader("Xboe-Access-Token"); + if (StringUtils.isEmpty(token)) { + token = request.getHeader("token"); + } + + String finalToken = token; + CompletableFuture.supplyAsync(() -> { + AloneExam aloneExam = aeDao.findOne(FieldFilters.eq("aid", aea.getAid()), FieldFilters.eq("testId", aea.getTestId())); + if (aloneExam.getRefType().equals("14")){ + int i = 1 / 0; // 这行将引发异常 + thirdApi.syncExamScoreToCourseSuite(aloneExam, finalToken); + } + return "完成结果"; + }).exceptionally(ex -> { + log.error("异步操作中发生错误: " + ex.getMessage(), ex); + return "发生错误"; + }).thenAccept(result -> { + log.info("同步考试成绩到课程项目完成:" + result); + }); - thirdApi.getExamList(aea.getAid() ,aea.getTestId(), token); } @Override diff --git a/servers/boe-server-all/src/main/resources/application.properties b/servers/boe-server-all/src/main/resources/application.properties index 2ed5eed9..2a1b1e61 100644 --- a/servers/boe-server-all/src/main/resources/application.properties +++ b/servers/boe-server-all/src/main/resources/application.properties @@ -77,4 +77,5 @@ manageApi.getExamSycn=${boe.domain}/manageApi/stu/grow/getExamSync userBasic.getTeacherIds=${boe.domain}/userbasic/user/getTeacherInfo userBasic.getUserIdByWorkNum=${boe.domain}/userbasic/user/getUserIdByWorkNum coursesuilt.getStudyStatus=${boe.domain}/manageApi/stu/project/completeStatus -coursesuilt.checkBanding=${boe.domain}/manageApi/stu/task/exam/checkBanding \ No newline at end of file +coursesuilt.checkBanding=${boe.domain}/manageApi/stu/task/exam/checkBanding +coursesuilt.syncExamScoreToCourseSuite=${boe.domain}/manageApi/stu/task/exam/syncExamScoreToCourseSuite \ No newline at end of file