ElAIOController.java 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488
  1. package com.zd.exam.controller;
  2. import com.zd.model.domain.R;
  3. import com.zd.common.core.utils.FileConfigUtils;
  4. import com.zd.common.core.utils.SecurityUtils;
  5. import com.zd.common.core.utils.UrlFormatUtils;
  6. import com.zd.common.core.web.controller.BaseController;
  7. import com.zd.model.page.TableDataInfo;
  8. import com.zd.exam.domain.*;
  9. import com.zd.exam.domain.vo.ElCourseVo;
  10. import com.zd.exam.enums.ScopeType;
  11. import com.zd.exam.service.*;
  12. import com.zd.exam.service.convert.BonusPointsService;
  13. import io.swagger.annotations.Api;
  14. import io.swagger.annotations.ApiOperation;
  15. import io.swagger.annotations.ApiParam;
  16. import org.apache.commons.collections4.CollectionUtils;
  17. import org.springframework.beans.factory.annotation.Autowired;
  18. import org.springframework.web.bind.annotation.*;
  19. import javax.servlet.http.HttpServletRequest;
  20. import javax.validation.Valid;
  21. import java.io.File;
  22. import java.util.*;
  23. /**
  24. * 智能学习一体机Controller
  25. *
  26. */
  27. @RestController
  28. @RequestMapping("/api")
  29. @Api(tags = {"智能学习一体机"})
  30. public class ElAIOController extends BaseController {
  31. @Autowired
  32. private IElCategoryService elCategoryService;
  33. @Autowired
  34. private IElCourseService elCourseService;
  35. @Autowired
  36. private ElExamService elExamService;
  37. @Autowired
  38. private IElPaperService elPaperService;
  39. @Autowired
  40. private IElPaperQuService elPaperQuService;
  41. @Autowired
  42. private IElExamClassifyService elExamClassifyService;
  43. @Autowired
  44. private IElUserCertService userCertService;
  45. @Autowired
  46. private IElPractiseService elPractiseService;
  47. @Autowired
  48. private IElPractiseQuService practiseQuService;
  49. @Autowired
  50. private IElChapterLearnRecordService chapterLearnRecordService;
  51. @Autowired
  52. private FileConfigUtils fileConfigUtils;
  53. @Autowired
  54. private BonusPointsService bonusPointsService;
  55. /**-------------------------------安全学习------------------------------------*/
  56. /**
  57. * 获取学习分类树状结构
  58. * id 默认 0 查全部
  59. */
  60. @ApiOperation(value = "获取学习分类详细信息")
  61. @GetMapping(value = "/category/treeList/{id}")
  62. public R<List<ElCategory>> categoryTreeList(@PathVariable("id") Long id) {
  63. if(id == null){
  64. return R.fail("ID 不能为空!");
  65. }
  66. ElCategory elCategory = new ElCategory();
  67. elCategory.setType(2);
  68. elCategory.setParentId(id);
  69. return R.ok(elCategoryService.treeList(elCategory));
  70. }
  71. /**
  72. * 查询学习资源列表
  73. */
  74. @GetMapping("/course/list")
  75. @ApiOperation(value = "查询学习资源列表")
  76. public TableDataInfo<ElCourse> courseList(ElCourse elCourse, HttpServletRequest request) {
  77. elCourse.setStatus(1);
  78. startPage();
  79. List<ElCourse> list = elCourseService.selectElCourseListByUser(elCourse);
  80. String baseUrl = request.getServerName() ;
  81. String url;
  82. for(ElCourse course:list){
  83. /*if(baseUrl.contains("192.168")){
  84. url = fileConfigUtils.getLocalUrl()+ "/"+course.getImg();
  85. }else {
  86. url = fileConfigUtils.getRemoteUrl()+ "/"+course.getImg();
  87. }*/
  88. //通过配置加载文件域名
  89. url = fileConfigUtils.getFileDomainApp() + "/" + course.getImg();
  90. url=UrlFormatUtils.getHttpsORHttpUrl(url);
  91. course.setImg(url);
  92. }
  93. return getDataTable(list);
  94. }
  95. /**
  96. * 个人端获取学习资源详细信息
  97. */
  98. @ApiOperation(value = "个人端获取学习资源详细信息")
  99. @GetMapping(value = "/course/{id}")
  100. public R<ElCourse> getCourseInfo(@PathVariable("id") Long id, HttpServletRequest request) {
  101. ElCourse elCourse=elCourseService.selectUserCourseById(id,request);
  102. /*String baseUrl = request.getServerName() ;
  103. String img;
  104. if(baseUrl.contains("192.168")){
  105. img=fileConfigUtils.getLocalUrl()+"/"+elCourse.getImg();
  106. }else {
  107. img=fileConfigUtils.getRemoteUrl()+"/"+elCourse.getImg();
  108. }*/
  109. //通过配置加载文件域名
  110. String img = fileConfigUtils.getFileDomainApp() + "/" + elCourse.getImg();
  111. img= UrlFormatUtils.getHttpsORHttpUrl(img);
  112. elCourse.setImg(img);
  113. return R.ok(elCourse);
  114. }
  115. /**
  116. * 学习资源 开始学习接口
  117. */
  118. @ApiOperation(value = "学习资源 开始学习接口")
  119. @PostMapping(value = "/course/learn/start")
  120. public R learnStart(@Valid @RequestBody ElChapterLearnRecord learnRecord) {
  121. chapterLearnRecordService.learnStart(learnRecord);
  122. return R.ok();
  123. }
  124. /**
  125. * 学习资源 完成学习接口
  126. */
  127. @ApiOperation(value = "学习资源 完成学习接口")
  128. @PostMapping(value = "/course/learn/finish")
  129. public R<Map<String,Object>> learnFinish(@Valid @RequestBody ElChapterLearnRecord learnRecord) {
  130. return R.ok(chapterLearnRecordService.learnFinish(learnRecord));
  131. }
  132. /**
  133. * 个人学习记录接口
  134. */
  135. @ApiOperation(value = "个人学习记录接口")
  136. @PostMapping(value = "/course/learn/list")
  137. public TableDataInfo learnList(@RequestBody ElCourseVo courseVo) {
  138. courseVo.setJoinUserId(SecurityUtils.getUserId());
  139. startPage();
  140. List<ElCourseVo> list = chapterLearnRecordService.learnList(courseVo);
  141. return getDataTable(list);
  142. }
  143. /**-------------------------------安全考试------------------------------------*/
  144. /**
  145. * 安全考试 试用范围下拉框
  146. * "适用范围(1. 安全准入考试,2. 负面清单考试,3. 黑名单考试,4.模拟考试)")
  147. */
  148. @ApiOperation(value = "安全考试试用范围下拉框")
  149. @GetMapping(value = "/exam/scopeList")
  150. public R getExamScopeList() {
  151. List<Map<String, Object>> list = new ArrayList<>();
  152. Map<String, Object> map = new HashMap<>();
  153. map.put("id", null);
  154. map.put("name", "全部");
  155. list.add(map);
  156. map = new HashMap<>();
  157. map.put("id", ScopeType.SCOPE_1.getType());
  158. map.put("name", ScopeType.SCOPE_1.getDesc());
  159. list.add(map);
  160. map = new HashMap<>();
  161. map.put("id", ScopeType.SCOPE_2.getType());
  162. map.put("name", ScopeType.SCOPE_2.getDesc());
  163. list.add(map);
  164. map = new HashMap<>();
  165. map.put("id", ScopeType.SCOPE_3.getType());
  166. map.put("name", ScopeType.SCOPE_3.getDesc());
  167. list.add(map);
  168. map = new HashMap<>();
  169. map.put("id", ScopeType.SCOPE_4.getType());
  170. map.put("name", ScopeType.SCOPE_4.getDesc());
  171. list.add(map);
  172. return R.ok(list);
  173. }
  174. /**
  175. * 查询模拟列表
  176. */
  177. @ApiOperation(value = "查询模拟列表")
  178. @GetMapping(value = "/exam/onlineList")
  179. public TableDataInfo queryMyExamList(ElExam exam) {
  180. startPage();
  181. // 模拟考试列表
  182. exam.setScopeType(ScopeType.SCOPE_4.getType());
  183. List<ElExam> list = elExamService.queryMyExamList(exam);
  184. return getDataTable(list);
  185. }
  186. /**
  187. * 开始考试 校验是否需要人脸验证
  188. * @return
  189. */
  190. @ApiOperation(value = "开始考试 - 校验是否需要人脸验证")
  191. @GetMapping(value = "/exam/start/verify/{type}")
  192. public R<Map<String, Object>> examVerify(@ApiParam("type 考试适用范围") @PathVariable("type") Integer scopeType,
  193. @ApiParam("模拟考试ID,其他类型传-1") @RequestParam("examId") Long examId) {
  194. Map<String, Object> map = new HashMap<>();
  195. int preFaceVerify = 0, endFaceVerify = 0;
  196. if(Objects.equals(scopeType, ScopeType.SCOPE_4.getType())){
  197. if(examId == null || examId == -1){
  198. return R.fail("参数异常!");
  199. }
  200. ElExam exam = elExamService.queryById(examId);
  201. preFaceVerify = exam.getPreFaceVerify();
  202. endFaceVerify = exam.getEndFaceVerify();
  203. }else {
  204. Integer userStatus = bonusPointsService.getUserStatus(SecurityUtils.getUserId());
  205. if(userStatus == null){
  206. if(Objects.equals(scopeType, ScopeType.SCOPE_2.getType())){
  207. return R.fail("您当前没有违规,无需参加" + ScopeType.SCOPE_2.getDesc());
  208. }else if(Objects.equals(scopeType, ScopeType.SCOPE_3.getType())){
  209. return R.fail("您当前没有违规,无需参加" + ScopeType.SCOPE_3.getDesc());
  210. }
  211. }else if(userStatus == 1 && Objects.equals(scopeType, ScopeType.SCOPE_3.getType())){
  212. return R.fail("不能参加" + ScopeType.SCOPE_3.getDesc());
  213. }else if(userStatus == 2 && Objects.equals(scopeType, ScopeType.SCOPE_2.getType())){
  214. return R.fail("不能参加" + ScopeType.SCOPE_2.getDesc());
  215. }
  216. ElExam exam = new ElExam();
  217. exam.setScopeType(scopeType);
  218. List<ElExam> list = elExamService.queryMyExamList(exam);
  219. // 根据权限只能查询一条数据
  220. if(CollectionUtils.isEmpty(list)){
  221. return R.fail("暂无对应的考试,请联系管理员!");
  222. }
  223. // 如果同一类型考试意外出现多条,暂取第一条处理
  224. examId = list.get(0).getId();
  225. preFaceVerify = list.get(0).getPreFaceVerify();
  226. endFaceVerify = list.get(0).getEndFaceVerify();
  227. }
  228. map.put("examId", examId);
  229. map.put("preFaceVerify", preFaceVerify);
  230. map.put("endFaceVerify", endFaceVerify);
  231. return R.ok(map);
  232. }
  233. /**
  234. * 开始考试 - 包括创建考试,返回考试信息内容
  235. */
  236. @ApiOperation(value = "开始考试 - 包括创建考试,返回考试信息内容")
  237. @GetMapping(value = "/exam/start/{type}")
  238. public R<ElPaper> createPaper(@ApiParam("type 考试适用范围") @PathVariable("type") Integer scopeType,
  239. @ApiParam("模拟考试ID,其他类型传-1") @RequestParam("examId") Long examId) {
  240. if(Objects.equals(scopeType, ScopeType.SCOPE_4.getType())){
  241. if(examId == null || examId == -1){
  242. return R.fail("参数异常!");
  243. }
  244. }else {
  245. ElExam exam = new ElExam();
  246. exam.setScopeType(scopeType);
  247. List<ElExam> list = elExamService.queryMyExamList(exam);
  248. // 根据权限只能查询一条数据
  249. if(CollectionUtils.isEmpty(list)){
  250. return R.fail("暂无对应的考试,请联系管理员!");
  251. }
  252. // 如果同一类型考试意外出现多条,暂取第一条处理
  253. examId = list.get(0).getId();
  254. }
  255. // 需确认考试过程中人脸验证后端是否需要限制 - 暂定一体机进行流程控制
  256. Long paperId = elPaperService.createPaper(examId);
  257. return R.ok(elPaperService.selectElPaperById(paperId));
  258. }
  259. /**
  260. * 考试过程 查询当前考题的正确和错误数量
  261. */
  262. @ApiOperation(value = "考试过程 查询当前考题的正确和错误数量")
  263. @GetMapping(value = "/exam/paperStatistics/{id}")
  264. public R<Map<String, Object>> getPaperStatistics(@PathVariable("id") Long id) {
  265. return R.ok(elPaperService.getPaperStatistics(id));
  266. }
  267. /**
  268. * 答题过程根据 paperId 和 quId 查询问题和选项
  269. */
  270. @ApiOperation(value = "考试 查询问题和选项 - 一题一查")
  271. @PostMapping(value = "/exam/paperDetail")
  272. public R<ElPaperQu> queryQuDetail(@RequestBody ElPaperQu paperQu) {
  273. if (paperQu.getPaperId() == null || paperQu.getQuId() == null) {
  274. return R.fail("参数无效");
  275. }
  276. paperQu = elPaperQuService.queryQuDetail(paperQu);
  277. return R.ok(paperQu);
  278. }
  279. /**
  280. * 填充答案 下一题实时保存上题答案
  281. */
  282. @ApiOperation(value = "考试保存用户答案 - 一题一交")
  283. @PostMapping(value = "/exam/fillAnswer")
  284. public R fillAnswer(@RequestBody ElPaperQu paperQu) {
  285. if (paperQu.getPaperId() == null || paperQu.getQuId() == null) {
  286. return R.fail("参数异常!");
  287. }
  288. elPaperQuService.fillAnswer(paperQu);
  289. return R.ok();
  290. }
  291. /**
  292. * 交卷
  293. */
  294. @ApiOperation(value = "交卷- 完成考试")
  295. @PostMapping(value = "/exam/handPaper")
  296. public R<Map<String, Object>> handPaper(@RequestBody ElPaper elPaper,HttpServletRequest request) {
  297. // 需确认考试结束人脸验证后端是否需要限制-- 同考试开始- 暂定一体机进行流程控制
  298. return R.ok(elPaperService.handPaper(elPaper,request));
  299. }
  300. /**
  301. * 交卷查询考试结果
  302. */
  303. @ApiOperation(value = "查询考试结果")
  304. @PostMapping(value = "/exam/paperResult")
  305. public R<ElPaper> paperResult(@RequestBody ElPaper elPaper) {
  306. elPaper = elPaperService.paperResult(elPaper);
  307. return R.ok(elPaper);
  308. }
  309. /**-------------------------------成绩查询------------------------------------*/
  310. /**
  311. * 个人考试成绩列表查询
  312. */
  313. @ApiOperation(value = "个人考试成绩列表查询")
  314. @PostMapping("/paper/myList")
  315. public TableDataInfo myPaperList(@RequestBody ElPaper elPaper) {
  316. elPaper.setJoinUserId(SecurityUtils.getUserId());
  317. startPage();
  318. List<ElPaper> list = elPaperService.selectElPaperList(elPaper);
  319. return getDataTable(list);
  320. }
  321. /**
  322. * 个人考试成绩详情查询
  323. */
  324. @ApiOperation(value = "个人考试成绩详情查询")
  325. @GetMapping(value = "/paper/{id}")
  326. public R<ElPaper> getInfo(@PathVariable("id") Long id) {
  327. return R.ok(elPaperService.selectElPaperById(id));
  328. }
  329. /**-------------------------------模拟练习------------------------------------*/
  330. /**
  331. * 查询题目类型下拉框
  332. */
  333. @PostMapping("/classify/queryOption")
  334. @ApiOperation(value = "查询题目类型下拉框")
  335. public R<List<ElExamClassify>> queryClassifyOption(@RequestBody ElExamClassify elExamClassify) {
  336. List<ElExamClassify> list = elExamClassifyService.selectElExamClassifyList(elExamClassify);
  337. return R.ok(list);
  338. }
  339. /**
  340. * 选择题目类型,开始练习
  341. */
  342. @ApiOperation(value = "选择题目类型,开始练习")
  343. @GetMapping(value = "/practise/start/{ids}")
  344. public R<ElPractise> queryClassifyOption(@ApiParam("多个题目类型ID逗号分隔") @PathVariable("ids") String classifyIds) {
  345. Long practiseId = elPractiseService.createPractise(classifyIds);
  346. return R.ok(elPractiseService.selectElPractiseById(practiseId));
  347. }
  348. /**
  349. * 答题过程根据 paperId 和 quId 查询问题和选项
  350. */
  351. @ApiOperation(value = "练习 查询问题和选项 - 一题一查")
  352. @PostMapping(value = "/practise/paperDetail")
  353. public R<ElPractiseQu> queryPractiseQuDetail(@RequestBody ElPractiseQu practiseQu) {
  354. if (practiseQu.getPractiseId() == null || practiseQu.getQuId() == null) {
  355. return R.fail("参数无效");
  356. }
  357. practiseQu = practiseQuService.selectElPractiseQuDetail(practiseQu);
  358. return R.ok(practiseQu);
  359. }
  360. /**
  361. * 练习填充答案
  362. */
  363. @ApiOperation(value = "练习保存用户答案 - 一题一交")
  364. @PostMapping(value = "/practise/fillAnswer")
  365. public R fillPractiseAnswer(@RequestBody ElPractiseQu practiseQu) {
  366. if (practiseQu.getPractiseId() == null || practiseQu.getQuId() == null) {
  367. return R.fail("参数异常!");
  368. }
  369. elPractiseService.fillPractiseAnswer(practiseQu);
  370. return R.ok(practiseQu);
  371. }
  372. @ApiOperation(value = "选择题目类型,结束练习")
  373. @PostMapping(value = "/practise/handPractise")
  374. public R<Map<String, Object>> handPractise(@RequestBody ElPractise practise) {
  375. if(practise.getId() == null){
  376. return R.fail("ID不能为空!");
  377. }
  378. return R.ok(elPractiseService.handPractise(practise));
  379. }
  380. /**-------------------------------证书管理------------------------------------*/
  381. /**
  382. * 查询我的证书列表
  383. */
  384. @PostMapping("/queryMyCert")
  385. @ApiOperation(value = "查询我的证书列表")
  386. public TableDataInfo queryMyCert(@RequestBody ElUserCert userCert, HttpServletRequest request) {
  387. userCert.setJoinUserId(SecurityUtils.getUserId());
  388. startPage();
  389. List<ElUserCert> userCerts = userCertService.queryMyCert(userCert);
  390. String baseUrl = request.getServerName() ;
  391. String url;
  392. for(ElUserCert elUserCert: userCerts){
  393. /*if(baseUrl.contains("192.168")){
  394. url=fileConfigUtils.getLocalUrl()+ File.separator+elUserCert.getCertUrl();
  395. }else {
  396. url=fileConfigUtils.getRemoteUrl()+ File.separator+elUserCert.getCertUrl();
  397. }*/
  398. //通过配置加载文件域名
  399. url = fileConfigUtils.getFileDomainApp() + File.separator+elUserCert.getCertUrl();
  400. url= UrlFormatUtils.getHttpsORHttpUrl(url);
  401. elUserCert.setCertUrl(url);
  402. }
  403. return getDataTable(userCerts);
  404. }
  405. /**-------------------------------课程考核------------------------------------*/
  406. /**
  407. * 开始考核 -- 章节ID
  408. */
  409. @PostMapping("/assess/start/{id}")
  410. @ApiOperation(value = "开始考核")
  411. public R<ElPaper> startAssess(@PathVariable ("id") Long courseChapterId) {
  412. return R.ok(elPaperService.startAssess(courseChapterId));
  413. }
  414. /**
  415. * 考核提交返回结果 -- 考核ID(试卷ID)
  416. */
  417. @PostMapping("/assess/finish/{id}")
  418. @ApiOperation(value = "考核结果")
  419. public R<Map<String, Object>> finishAssess(@PathVariable ("id") Long paperId) {
  420. return R.ok(elPaperService.finishAssess(paperId));
  421. }
  422. /**
  423. * 考核列表 -- 章节ID
  424. */
  425. @PostMapping("/assess/list/{id}")
  426. @ApiOperation(value = "考核列表")
  427. public TableDataInfo assessList(@PathVariable ("id") Long courseChapterId) {
  428. startPage();
  429. return getDataTable(elPaperService.assessList(courseChapterId));
  430. }
  431. /**
  432. * 考核详情 -- 试卷ID
  433. */
  434. @PostMapping("/assess/detail/{id}")
  435. @ApiOperation(value = "考核详情")
  436. public R<ElPaper> assessDetail(@PathVariable ("id") Long paperId) {
  437. return R.ok(elPaperService.assessDetail(paperId));
  438. }
  439. }