package com.xboe.api; import cn.hutool.core.bean.BeanUtil; 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.fastjson.JSON; import com.boe.feign.api.courseweb.entity.ExamTestDto; import com.boe.feign.api.courseweb.entity.ProjectStudyDto; import com.boe.feign.api.courseweb.remote.ExternalRemoteClient; import com.boe.feign.api.courseweb.remote.OffCourseRemoteClient; import com.boe.feign.api.courseweb.remote.ProjectAdminRemoteClient; import com.boe.feign.api.courseweb.remote.ProjectRemoteClient; import com.boe.feign.api.courseweb.reps.ExamStudyRecordParam; import com.boe.feign.api.infrastructure.entity.CommonSearchVo; import com.boe.feign.api.infrastructure.entity.Dict; import com.boe.feign.api.infrastructure.remote.DictRemoteClient; import com.boe.feign.api.stat.remote.UserDynamicApiRemoteClient; import com.boe.feign.api.usercenter.entity.*; import com.boe.feign.api.usercenter.remote.AudienceRemoteClient; import com.boe.feign.api.usercenter.remote.UserRemoteClient; import com.boe.feign.api.usercenter.reps.AudienceMemberVo; import com.boe.feign.api.usercenter.reps.Response; import com.xboe.api.infrastructure.res.InfraResult; import com.xboe.api.vo.*; import com.xboe.module.course.dto.CourseParam; import com.xboe.module.course.dto.ScoreParam; import com.xboe.common.PageList; import com.xboe.common.Pagination; import com.xboe.core.JsonResponse; import com.xboe.module.course.vo.StudyCourseVo; import com.xboe.module.course.vo.TeacherVo; import com.xboe.module.dict.entity.DictDto; 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 javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Optional; import java.util.concurrent.ForkJoinPool; import java.util.stream.Collectors; import java.util.stream.IntStream; @Service @Slf4j public class ThirdApi { public static final ForkJoinPool REQUEST_TASK = new ForkJoinPool(100); //没有找到 @Value("${orgTree.orgChildTreeList}") private String orgChildTreeListUrl; @Autowired UserDao userDao; @Resource private ProjectAdminRemoteClient projectAdminRemoteClient; @Resource private OffCourseRemoteClient offCourseRemoteClient; @Resource private ProjectRemoteClient projectRemoteClient; @Resource ExternalRemoteClient externalRemoteClient; @Resource private DictRemoteClient dictRemoteClient; @Resource private UserRemoteClient userRemoteClient; @Resource private AudienceRemoteClient audienceRemoteClient; @Resource private UserDynamicApiRemoteClient userDynamicApiRemoteClient; @Value("${coursesuilt.updateOrSaveCourse}") private String updateOrSaveCourse; @Value("${coursesuilt.syncCourseStudent}") private String syncCourseStudent; @Value("${coursesuilt.syncOnLineScore}") private String syncOnLineScore; @Value("${coursesuilt.updateOnLineStatua}") private String updateOnLineStatua; @Value("${coursesuilt.delOnLineById}") private String delOnLineById; //获取例外人员的id public List getUserId() { CommonSearchVo searcher = new CommonSearchVo(); searcher.setPid(316L); searcher.setType(1); List dictList = dictRemoteClient.getList(searcher); String responseBody = JSON.toJSONString(InfraResult.suc(dictList)); log.info("正在获取例外人员工号 responseBody = " + responseBody); try { Optional dictResultOptional = Optional.of(responseBody) .map(t -> JSONUtil.toBean(t, DictResult.class)); if (!dictResultOptional.isPresent()) { throw new RuntimeException("解析DictResult失败:字符串格式不正确。"); } List dictDtos = dictResultOptional.get().getData(); if (dictDtos == null || dictDtos.isEmpty()) { throw new RuntimeException("DictResult中的data字段为空。"); } return dictDtos.stream().map(DictDto::getValue).collect(Collectors.toList()); } catch (Exception e) { throw new RuntimeException("解析过程发生异常:" + e.getMessage(), e); } } //获取面授课id public List getOffCourseId(String userId, String token) { log.info("正在获取面授课id"); return offCourseRemoteClient.getOffCourseId(userId); } //获取离职教师信息 public List getTeacherInfo(List teacherIds, String token) { log.info("获取离职教师信息"); com.boe.feign.api.usercenter.entity.TeacherInfoVo teacherInfoFeignVo = new com.boe.feign.api.usercenter.entity.TeacherInfoVo(); teacherInfoFeignVo.setTeacherIds(teacherIds); Response> response = userRemoteClient.getTeacherInfo(teacherInfoFeignVo); String resp = JSON.toJSONString(response); GetTeacherIdsResult getTeacherIdsResult = JSONUtil.toBean(resp, GetTeacherIdsResult.class); log.info("getTeacherIdsResult = " + getTeacherIdsResult.getResult()); return getTeacherIdsResult.getResult(); } public List getTeacherInfoByCode(List teacherCode, String token) { log.info("获取离职教师信息"); com.boe.feign.api.usercenter.entity.TeacherInfoVo teacherInfoFeignVo = new com.boe.feign.api.usercenter.entity.TeacherInfoVo(); teacherInfoFeignVo.setTeacherCode(teacherCode); Response> response = userRemoteClient.getTeacherInfo(teacherInfoFeignVo); String resp = JSON.toJSONString(response); GetTeacherIdsResult getTeacherIdsResult = JSONUtil.toBean(resp, GetTeacherIdsResult.class); log.info("getTeacherIdsResult = " + getTeacherIdsResult); return getTeacherIdsResult.getResult(); } public List getAllUserList(UserListParam userListParam, String token) { log.info("获取用户:params:{}", JSONUtil.toJsonStr(userListParam)); UserQueryDto userQueryDto = new UserQueryDto(); userQueryDto.setOrganizationId(userListParam.getOrganizationId()); userQueryDto.setPageNo(userListParam.getPageNo()); userQueryDto.setPageSize(userListParam.getPageSize()); Response> response = userRemoteClient.getOrgUserForRpc(userQueryDto); String resp = JSON.toJSONString(response); UserInfoListRootBean userInfoListRootBean1 = JSONUtil.toBean(resp, UserInfoListRootBean.class); log.info("userInfoListRootBean1 = " + userInfoListRootBean1); List list = userInfoListRootBean1.getResult().getList(); log.info("list = " + list); log.info("获取用户返回值1 {}", resp); return Opt.ofBlankAble(resp).map(t -> JSONUtil.toBean(resp, UserInfoListRootBean.class).success()) .map(UserInfoListRootBean::getResult) .map(result -> Opt.ofEmptyAble(result.getList()).peek(t -> nextPage(userListParam, token, t, result)).orElse(ListUtil.toList())) .orElse(ListUtil.toList()); } private void getAllUserList(UserListParam userListParam, String token, List userInfoLists) { log.info("获取用户2"); UserQueryDto userQueryDto = new UserQueryDto(); userQueryDto.setOrganizationId(userListParam.getOrganizationId()); userQueryDto.setPageNo(userListParam.getPageNo()); userQueryDto.setPageSize(userListParam.getPageSize()); Response> response = userRemoteClient.getOrgUserForRpc(userQueryDto); String resp = JSON.toJSONString(response); log.info("获取用户返回值2 {}", resp); Opt.ofBlankAble(resp).map(t -> JSONUtil.toBean(t, UserInfoListRootBean.class).success()).map(UserInfoListRootBean::getResult).map(UserInfoListRootBean.ResultData::getList).stream().flatMap(Collection::stream).forEach(userInfoLists::add); } private void nextPage(UserListParam userListParam, String token, List userInfoLists, UserInfoListRootBean.ResultData t) { log.info("nextPage 获取用户--" + userListParam.getPageNo()); if (t.getTotalPage() > userListParam.getPageNo()) { REQUEST_TASK.submit(() -> IntStream.range(userListParam.getPageNo(), t.getTotalPage()).parallel().forEach(i -> getAllUserList(userListParam.withPageNo(i + 1), token, userInfoLists))).join(); } } public List getOrgChildTree(String id, String token) { log.info("getOrgChildTree"); String resp = Optional.ofNullable(HttpRequest.post(orgChildTreeListUrl).header("token", token).body(JSONUtil.toJsonStr(TreeSearchVo.builder().orgId(id).build())).execute().body()).orElseThrow(() -> new RuntimeException("token校验失败")); return Opt.ofNullable(JSONUtil.toBean(resp, OrgRootBean.class).success()).map(OrgRootBean::getResult).orElse(ListUtil.empty()); } public List getAllAudienceList(AuditListParam userListParam, String token) { AudienceDto userMemberVo = new AudienceDto(); userMemberVo.setPageSize(userListParam.getPageSize()); userMemberVo.setPageNo(userListParam.getPageNo()); userMemberVo.setAudienceId(userListParam.getAudienceId()); PageList pageList = audienceRemoteClient.memberList(userMemberVo); String resp = JSON.toJSONString(pageList); return Opt.ofBlankAble(resp).map(t -> JSONUtil.toBean(resp, AuditRootBean.class).success()) .map(AuditRootBean::getResult) .map(result -> Opt.ofEmptyAble(result.getList()).peek(t -> nextPage(userListParam, t, result, token)).orElse(ListUtil.toList())) .orElse(ListUtil.toList()); } private void nextPage(AuditListParam userListParam, List t, Result result, String token) { if (result.getTotalPage() > userListParam.getPageNo()) { REQUEST_TASK.submit(() -> IntStream.range(userListParam.getPageNo(), result.getTotalPage()).parallel().forEach(i -> getAllAudienceList(userListParam.withPageNo(i + 1), t, token))).join(); } } private void getAllAudienceList(AuditListParam userListParam, List list, String token) { AudienceDto userMemberVo = new AudienceDto(); userMemberVo.setPageSize(userListParam.getPageSize()); userMemberVo.setPageNo(userListParam.getPageNo()); userMemberVo.setAudienceId(userListParam.getAudienceId()); PageList pageList = audienceRemoteClient.memberList(userMemberVo); String resp = JSON.toJSONString(pageList); Opt.ofBlankAble(resp).map(t -> JSONUtil.toBean(t, AuditRootBean.class).success()).map(AuditRootBean::getResult).map(Result::getList).stream().flatMap(Collection::stream).forEach(list::add); } public List getAllUserdynamicList(UserdynamicParam userdynamicParam, String token) { Pagination pagination = new Pagination(); pagination.setPageSize(userdynamicParam.getPageSize()); pagination.setPageIndex(userdynamicParam.getPageIndex()); com.boe.feign.api.stat.entity.UserDynamic udd = new com.boe.feign.api.stat.entity.UserDynamic(); udd.setAid(userdynamicParam.getAid() == null ? null : userdynamicParam.getAid().toString()); udd.setHidden("true".equals(userdynamicParam.getHidden())); udd.setContentType(userdynamicParam.getContentType() == null ? null : userdynamicParam.getContentType().toString()); JsonResponse> jsonResponse = userDynamicApiRemoteClient.pageList(pagination, udd, null); String resp = JSON.toJSONString(jsonResponse); log.error("=1----getAllUserdynamicList----- 开始课程信息 ---------------------------------resp = " + resp); return Opt.ofBlankAble(resp).map(t -> JSONUtil.toBean(resp, DynamicBean.class).success()) .map(DynamicBean::getResult) .map(result -> Opt.ofEmptyAble(result.getList()).peek(t -> nextPage(userdynamicParam, t, result, token)).orElse(ListUtil.toList())) .orElse(ListUtil.toList()); } private void nextPage(UserdynamicParam userdynamicParam, List t, UserDynamicResult result, String token) { log.error("=2----getAllUserdynamicList----- 开始课程信息 ---------------------------------resp = " + userdynamicParam); if (result.getTotalPages() > userdynamicParam.getPageIndex()) { REQUEST_TASK.submit(() -> IntStream.range(userdynamicParam.getPageIndex(), result.getTotalPages()).parallel().forEach(i -> getAllUserdynamicList(userdynamicParam.withPageIndex(i + 1), t, token))).join(); } } private void getAllUserdynamicList(UserdynamicParam userdynamicParam, List list, String token) { log.error("=3----getAllUserdynamicList----- 开始课程信息 ---------------------------------resp = " + userdynamicParam); AudienceDto userMemberVo = new AudienceDto(); userMemberVo.setPageSize(1000); userMemberVo.setPageNo(userdynamicParam.getPageIndex()); PageList pageList = audienceRemoteClient.memberList(userMemberVo); String resp = JSON.toJSONString(pageList); Opt.ofBlankAble(resp).map(t -> JSONUtil.toBean(t, DynamicBean.class).success()).map(DynamicBean::getResult).map(UserDynamicResult::getList).stream().flatMap(Collection::stream).forEach(list::add); } public List getStudyCourseList(String studyId, String courseId, String token) { log.info(" 1 studyId = "+ studyId + " ,courseId = " + courseId ); if ( studyId == null || courseId == null ){ log.error(" 在线课学习记录 参数不能为空 "); return new ArrayList<>(); } StudyCourseVo studyCourseVo = new StudyCourseVo(); studyCourseVo.setStudyId(studyId); studyCourseVo.setCourseId(courseId); ProjectStudyDto projectStudyDto = new ProjectStudyDto(); // BeanUtil.copyProperties(studyCourseVo, studyCourseVo); projectStudyDto.setStudyId(Long.parseLong(studyId)); projectStudyDto.setCourseId(Long.parseLong(courseId)); log.info(" 12 在线课学习记录 studyId = "+ projectStudyDto.getStudyId() + " ,courseId = " + projectStudyDto.getCourseId() ); projectRemoteClient.updateStudyStatus(projectStudyDto); return new ArrayList<>(); } public void sqlUpdate(ExamTest examTest, String token) { examTest.setSysUpdateTime(null); examTest.setSysCreateTime(null); examTest.setPublishTime(null); ExamTestDto examTestDto = new ExamTestDto(); BeanUtil.copyProperties(examTest, examTestDto); examTestDto.setShowAnswer(examTest.getShowAnswer() ? "true" : "false"); projectAdminRemoteClient.editExam(examTestDto); } 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(). aid(Long.parseLong("965342027497607168")).pageSize(1000).pageIndex(1).build())).header("XBOE-Access-Token", token).execute().body()).orElseThrow(() -> new RuntimeException("token校验失败")); System.out.println(" resp = " + resp); DynamicBean a = JSONUtil.toBean(resp, DynamicBean.class); System.out.println(" a = " + a); System.out.println(" a = " + a.getResult().getCount()); List list = a.getResult().getList(); System.out.println(" list = " + list.size()); System.out.println(" list = " + list); } /** * 获取案例浏览记录 */ public UserDynamicResult getAllUserdynamicListOfCaseRead(UserdynamicParam userdynamicParam, String token) { String s = buildFormData(userdynamicParam); Pagination pagination = new Pagination(); pagination.setPageSize(userdynamicParam.getPageSize()); pagination.setPageIndex(userdynamicParam.getPageIndex()); com.boe.feign.api.stat.entity.UserDynamic udd = new com.boe.feign.api.stat.entity.UserDynamic(); udd.setAid(userdynamicParam.getAid() == null ? null : userdynamicParam.getAid().toString()); udd.setHidden("true".equals(userdynamicParam.getHidden())); udd.setContentType(userdynamicParam.getContentType() == null ? null : userdynamicParam.getContentType().toString()); udd.setEventKey("ReadCase"); JsonResponse> jsonResponse = userDynamicApiRemoteClient.pageList(pagination, udd, udd.getAid()); String resp = JSON.toJSONString(jsonResponse); DynamicBean dynamicBean = JSONUtil.toBean(resp, DynamicBean.class); UserDynamicResult userdynamicResult = dynamicBean.getResult(); return userdynamicResult; } private String buildFormData(UserdynamicParam param) { StringBuilder builder = new StringBuilder(); try { builder.append("pageIndex=").append(URLEncoder.encode(param.getPageIndex().toString(), "UTF-8")); builder.append("&pageSize=").append(URLEncoder.encode(param.getPageSize().toString(), "UTF-8")); builder.append("&contentType=").append(URLEncoder.encode(param.getContentType().toString(), "UTF-8")); builder.append("&aid=").append(URLEncoder.encode(param.getAid().toString(), "UTF-8")); builder.append("&eventKey=").append(URLEncoder.encode("ReadCase", "UTF-8")); if (param.getHidden() != null) { builder.append("&hidden=").append(URLEncoder.encode(param.getHidden(), "UTF-8")); } } catch (UnsupportedEncodingException e) { throw new RuntimeException(e); } return builder.toString(); } /** * 虽然当前已存在接口查询用户基本信息,目前仅仅包括用户名、工号、用户ID */ public List getUserBasicInfoByUserId(List userIds, HttpServletRequest request) { String token = request.getHeader("Xboe-Access-Token"); if (StringUtils.isEmpty(token)) { token = request.getHeader("token"); } if (StringUtils.isEmpty(token)) { token = request.getHeader("x-access-token"); } UserBasicInfoDto userBasicInfoDto = new UserBasicInfoDto(); userBasicInfoDto.setUserIds(userIds); Response> response = userRemoteClient.getUserBasicInfo(userBasicInfoDto); String respStr = JSON.toJSONString(response); UserBasicInfoResult userBasicInfoResult = JSONUtil.parseObj(respStr).toBean(UserBasicInfoResult.class); List basicInfos = userBasicInfoResult.getResult(); return basicInfos; } public void updateOrSaveCourse(CourseParam param, String token){ log.info("---------------准备同步在线课到讲师管理完毕 ------- param " + param); String resp = Optional.ofNullable( HttpRequest.post(updateOrSaveCourse).body(JSONUtil.toJsonStr(param)).header("token", token).execute() .body()).orElseThrow(() -> new RuntimeException("token校验失败")); log.info("updateOrSaveCourse = " + resp); } public void syncCourseStudent(Long courseId, String token){ String resp = Optional.ofNullable( HttpRequest.post(syncCourseStudent).body(JSONUtil.toJsonStr(courseId)).header("token", token).execute() .body()).orElseThrow(() -> new RuntimeException("token校验失败")); log.info("syncCourseStudent = " + resp); } public void syncOnLineScore(ScoreParam param, String token) { String resp = Optional.ofNullable( HttpRequest.post(syncOnLineScore).body(JSONUtil.toJsonStr(param)).header("token", token).execute() .body()).orElseThrow(() -> new RuntimeException("token校验失败")); log.info("syncOnLineScore = " + resp); } public void updateOnLineStatua(CourseParam param, String token){ String resp = Optional.ofNullable( HttpRequest.post(updateOnLineStatua).body(JSONUtil.toJsonStr(param)).header("token", token).execute() .body()).orElseThrow(() -> new RuntimeException("token校验失败")); log.info("updateOrSaveCourse = " + resp); } public void syncExamStudyRecord(ExamStudyRecordParam param) { externalRemoteClient.syncExamStudyRecord(param); } public void delOnLineById(CourseParam param, String token) { log.info("---------------同步在线课删除 ------- param " + param); String resp = Optional.ofNullable( HttpRequest.post(delOnLineById).body(JSONUtil.toJsonStr(param)).header("token", token).execute() .body()).orElseThrow(() -> new RuntimeException("token校验失败")); log.info("-------delOnLineById = " + resp); } }