RealExamCollectionService.java 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458
  1. package com.ruoyi.sim.service.impl;
  2. import java.util.Collections;
  3. import java.util.List;
  4. import cn.ele6.catalyzer.ruoyi.vue.custom.Ele6RYBaseService;
  5. import cn.ele6.catalyzer.ruoyi.vue.enhance.TableDataInfo;
  6. import com.ruoyi.common.core.domain.AjaxResult;
  7. import com.ruoyi.common.utils.DateUtils;
  8. import com.ruoyi.sim.domain.vo.RealExamCollectionVo;
  9. import org.apache.commons.lang3.StringUtils;
  10. import org.springframework.beans.BeanUtils;
  11. import org.springframework.beans.factory.annotation.Autowired;
  12. import org.springframework.context.annotation.Lazy;
  13. import org.springframework.stereotype.Service;
  14. import com.ruoyi.sim.mapper.RealExamCollectionMapper;
  15. import com.ruoyi.sim.domain.RealExamCollection;
  16. import org.springframework.transaction.annotation.Transactional;
  17. import org.springframework.web.bind.annotation.RequestBody;
  18. /**
  19. * 考试集合Service业务层处理
  20. *
  21. * @author tom
  22. * @date 2024-12-17
  23. */
  24. @Service
  25. public class RealExamCollectionService extends Ele6RYBaseService {
  26. @Autowired
  27. private RealExamCollectionMapper realExamCollectionMapper;
  28. /**
  29. * todo:依赖循环的问题。
  30. */
  31. @Autowired
  32. @Lazy
  33. private CommSendService commSendService;
  34. @Autowired
  35. private SocketService socketService;
  36. /**
  37. * 查询考试集合
  38. *
  39. * @param examCollectionId 考试集合主键
  40. * @return 考试集合
  41. */
  42. public RealExamCollection selectRealExamCollectionByExamCollectionId(Long examCollectionId) {
  43. return realExamCollectionMapper.selectRealExamCollectionByExamCollectionId(examCollectionId);
  44. }
  45. /**
  46. * 查询考试集合列表
  47. *
  48. * @param realExamCollection 考试集合
  49. * @return 考试集合
  50. */
  51. public List<RealExamCollection> selectRealExamCollectionList(RealExamCollection realExamCollection) {
  52. return realExamCollectionMapper.selectRealExamCollectionList(realExamCollection);
  53. }
  54. /**
  55. * 新增考试集合
  56. *
  57. * @param realExamCollection 考试集合
  58. * @return 结果
  59. */
  60. public int insertRealExamCollection(RealExamCollection realExamCollection) {
  61. realExamCollection.setCreateTime(DateUtils.getNowDate());
  62. return realExamCollectionMapper.insertRealExamCollection(realExamCollection);
  63. }
  64. /**
  65. * 修改考试集合
  66. *
  67. * @param realExamCollection 考试集合
  68. * @return 结果
  69. */
  70. public int updateRealExamCollection(RealExamCollection realExamCollection) {
  71. realExamCollection.setUpdateTime(DateUtils.getNowDate());
  72. return realExamCollectionMapper.updateRealExamCollection(realExamCollection);
  73. }
  74. /**
  75. * 批量删除考试集合
  76. *
  77. * @param examCollectionIds 需要删除的考试集合主键
  78. * @return 结果
  79. */
  80. public int deleteRealExamCollectionByExamCollectionIds(Long[] examCollectionIds) {
  81. return realExamCollectionMapper.deleteRealExamCollectionByExamCollectionIds(examCollectionIds);
  82. }
  83. /**
  84. * 删除考试集合信息
  85. *
  86. * @param examCollectionId 考试集合主键
  87. * @return 结果
  88. */
  89. public int deleteRealExamCollectionByExamCollectionId(Long examCollectionId) {
  90. return realExamCollectionMapper.deleteRealExamCollectionByExamCollectionId(examCollectionId);
  91. }
  92. // -------------------------------- tom add --------------------------------
  93. /**
  94. * [教师][分页]查询考试集合列表
  95. *
  96. * @param q
  97. * @return
  98. */
  99. public TableDataInfo listExamByTeacher(RealExamCollection q) {
  100. startPage();
  101. q.setExamCollectionType(RealExamCollection.Type.EXAM);
  102. List<RealExamCollectionVo> list = Collections.emptyList();
  103. realExamCollectionMapper.selectRealExamCollectionList(q)
  104. .forEach((RealExamCollection s) -> {
  105. RealExamCollectionVo t = new RealExamCollectionVo();
  106. BeanUtils.copyProperties(s, t);
  107. list.add(t);
  108. });
  109. return getDataTable(list);
  110. }
  111. /**
  112. * [教师][分页]查询练习集合列表
  113. *
  114. * @param p
  115. * @return
  116. */
  117. public TableDataInfo listExerciseByTeacher(RealExamCollection p) {
  118. startPage();
  119. p.setExamCollectionType(RealExamCollection.Type.EXERCISE);
  120. List<RealExamCollectionVo> list = Collections.emptyList();
  121. realExamCollectionMapper.selectRealExamCollectionList(p).forEach((RealExamCollection s) -> {
  122. RealExamCollectionVo t = new RealExamCollectionVo();
  123. BeanUtils.copyProperties(s, t);
  124. list.add(t);
  125. });
  126. return getDataTable(list);
  127. }
  128. /**
  129. * [教师]获取考试集合详细信息
  130. */
  131. public AjaxResult getExamInfoByTeacher(Long id) {
  132. RealExamCollection f = realExamCollectionMapper.
  133. selectRealExamCollectionByExamCollectionId(id);
  134. return AjaxResult.success(f);
  135. }
  136. /**
  137. * [教师]获取练习集合详细信息
  138. */
  139. public AjaxResult getExerciseInfoByTeacher(Long id) {
  140. RealExamCollection f = realExamCollectionMapper.
  141. selectRealExamCollectionByExamCollectionId(id);
  142. return AjaxResult.success(f);
  143. }
  144. /**
  145. * [教师]新增考试集合
  146. *
  147. * @param vo
  148. * @return
  149. */
  150. public AjaxResult addExam(@RequestBody RealExamCollectionVo vo) {
  151. // check
  152. // 日期检查
  153. if (StringUtils.isBlank(vo.getExamCollectionName())) {
  154. }
  155. //
  156. RealExamCollection p = new RealExamCollection();
  157. BeanUtils.copyProperties(vo, p);
  158. p.setExamCollectionType(RealExamCollection.Type.EXAM);
  159. insertRealExamCollection(p);
  160. return AjaxResult.success();
  161. }
  162. /**
  163. * [教师]新增练习集合
  164. *
  165. * @param vo
  166. * @return
  167. */
  168. public AjaxResult addExercise(@RequestBody RealExamCollectionVo vo) {
  169. // check
  170. //
  171. RealExamCollection p = new RealExamCollection();
  172. BeanUtils.copyProperties(vo, p);
  173. p.setExamCollectionType(RealExamCollection.Type.EXERCISE);
  174. insertRealExamCollection(p);
  175. return AjaxResult.success();
  176. }
  177. /**
  178. * [学院]新增自主练习集合
  179. * todo:界面入口
  180. *
  181. * @param vo
  182. * @return
  183. */
  184. public AjaxResult addSelfExercise(@RequestBody RealExamCollectionVo vo) {
  185. // check
  186. // do.
  187. RealExamCollection p = new RealExamCollection();
  188. BeanUtils.copyProperties(vo, p);
  189. p.setExamCollectionType(RealExamCollection.Type.SELF_EXERCISE);
  190. insertRealExamCollection(p);
  191. return AjaxResult.success();
  192. }
  193. /**
  194. * [教师]修改考试集合
  195. *
  196. * @param vo
  197. * @return
  198. */
  199. public AjaxResult editExam(@RequestBody RealExamCollectionVo vo) {
  200. // check
  201. //
  202. RealExamCollection p = new RealExamCollection();
  203. BeanUtils.copyProperties(vo, p);
  204. p.setExamCollectionType(RealExamCollection.Type.EXAM);
  205. updateRealExamCollection(p);
  206. // todo:更新关联
  207. return AjaxResult.success();
  208. }
  209. /**
  210. * [教师]修改练习集合
  211. *
  212. * @param vo
  213. * @return
  214. */
  215. public AjaxResult editExercise(@RequestBody RealExamCollectionVo vo) {
  216. // check
  217. // do.
  218. RealExamCollection p = new RealExamCollection();
  219. BeanUtils.copyProperties(vo, p);
  220. p.setExamCollectionType(RealExamCollection.Type.EXERCISE);
  221. updateRealExamCollection(p);
  222. // todo:更新关联
  223. return AjaxResult.success();
  224. }
  225. /**
  226. * [教师]删除多个考试集合
  227. *
  228. * @param ids
  229. * @return
  230. */
  231. public AjaxResult deleteExams(Long[] ids) {
  232. // check
  233. // do.
  234. deleteRealExamCollectionByExamCollectionIds(ids);
  235. // todo:更新关联
  236. return AjaxResult.success();
  237. }
  238. /**
  239. * [教师]删除多个练习集合
  240. *
  241. * @param ids
  242. * @return
  243. */
  244. public AjaxResult deleteExercises(Long[] ids) {
  245. // check
  246. // do.
  247. deleteRealExamCollectionByExamCollectionIds(ids);
  248. // todo:更新关联
  249. return AjaxResult.success();
  250. }
  251. /**
  252. * [教师]打开考试/练习集合
  253. *
  254. * @param examCollectionId
  255. * @return
  256. */
  257. @Transactional
  258. public AjaxResult open(final Long examCollectionId, final String examCollectionType) {
  259. l.debug("open examCollectionId= {}", examCollectionId);
  260. // check 1:检查id有效。
  261. RealExamCollection rec = selectRealExamCollectionByExamCollectionId(examCollectionId);
  262. if (rec == null) {
  263. return AjaxResult.error("考试集合不存在!");
  264. }
  265. l.debug("rec = {}", rec);
  266. // check 2:检查考试集合类型对应。
  267. // {
  268. // final String dbType = rec.getExamCollectionType();
  269. // if (!StringUtils.equals(dbType, examCollectionType)) {
  270. // return AjaxResult.error("考试集合类型不对应!");
  271. // }
  272. // }
  273. // check 3:唯一open检查。
  274. // if (existOpened()) {
  275. // return AjaxResult.error("已经有打开的考试或者练习!");
  276. // }
  277. // check datetime todo:时间到了
  278. // do.
  279. // Step 1:强制停掉所有的自主练习
  280. {
  281. // closeAllType(RealExamCollection.Type.SELF_EXERCISE);
  282. }
  283. // Step 2:强制停掉所有的练习
  284. {
  285. // closeAllType(RealExamCollection.Type.EXERCISE);
  286. }
  287. // Step 3:强制停掉 除本考试外的 所有考试
  288. {
  289. // closeAllExamExcludeId(rec.getExamCollectionId());
  290. }
  291. // Step 4:尝试打开所有Socket,提前准备,允许有打开失败的
  292. // SocketOldService实现。
  293. // AjaxResult ar1 = socketOldService.openSocket();
  294. //
  295. AjaxResult ar1 = socketService.tryOpenAll();
  296. if (ar1.isError()) {
  297. return ar1;
  298. }
  299. //
  300. // 更新相关数据
  301. // Step :修改考试集合状态。
  302. {
  303. rec.setExamCollectionState(RealExamCollection.State.OPENED);
  304. updateRealExamCollection(rec);
  305. }
  306. return AjaxResult.success("开启成功!");
  307. }
  308. public List<RealExamCollection> listAllByType(String examCollectionType) {
  309. RealExamCollection q = new RealExamCollection();
  310. q.setExamCollectionType(examCollectionType);
  311. return selectRealExamCollectionList(q);
  312. }
  313. /**
  314. * 是否有一个open的任何类型的集合。
  315. *
  316. * @return
  317. */
  318. public boolean existAtLeastOneOpened() {
  319. return (selectRealExamCollectionOpened() != null);
  320. }
  321. public RealExamCollection selectRealExamCollectionOpened() {
  322. RealExamCollection q = new RealExamCollection();
  323. q.setExamCollectionState(RealExamCollection.State.OPENED);
  324. List<RealExamCollection> list = selectRealExamCollectionList(q);
  325. if (list != null && !list.isEmpty()) {
  326. return list.get(0);
  327. }
  328. return null;
  329. }
  330. /**
  331. * [教师]关闭考试/练习集合
  332. *
  333. * @param examCollectionId
  334. * @return
  335. */
  336. public AjaxResult close(final Long examCollectionId) {
  337. // check
  338. // todo:是否还有正在进行的考试
  339. RealExamCollection f = selectRealExamCollectionByExamCollectionId(examCollectionId);
  340. // 修改考试集合状态。
  341. {
  342. f.setExamCollectionState(RealExamCollection.State.CLOSED);
  343. updateRealExamCollection(f);
  344. }
  345. // 关闭socket
  346. // 修改为socket常开,直接返回成功结果。
  347. // return commSendService.closeSocket();
  348. return AjaxResult.success("关闭连接成功!");
  349. }
  350. public AjaxResult closeAll() {
  351. // SocketOldService实现
  352. // return socketOldService.closeSocket();
  353. return AjaxResult.success();
  354. }
  355. private void closeAllType(final String type) {
  356. RealExamCollection q = new RealExamCollection();
  357. q.setExamCollectionType(type);
  358. selectRealExamCollectionList(q)
  359. .forEach((RealExamCollection ec) -> {
  360. ec.setExamCollectionState(RealExamCollection.State.CLOSED);
  361. updateRealExamCollection(ec);
  362. });
  363. }
  364. private void closeAllExamExcludeId(final Long excludeRecId) {
  365. List<RealExamCollection> list = listAllByType(RealExamCollection.Type.EXAM);
  366. for (RealExamCollection ec : list) {
  367. if (ec.getExamCollectionId().equals(excludeRecId)) {
  368. // 跳过本考试。
  369. continue;
  370. }
  371. ec.setExamCollectionState(RealExamCollection.State.CLOSED);
  372. updateRealExamCollection(ec);
  373. }
  374. }
  375. /**
  376. * @return 可以为null。
  377. */
  378. public RealExamCollection getCurrentExamCollection() {
  379. RealExamCollection q = new RealExamCollection();
  380. q.setExamCollectionState(RealExamCollection.State.OPENED);
  381. List<RealExamCollection> list = selectRealExamCollectionList(q);
  382. if (list == null || list.isEmpty()) {
  383. return null;
  384. }
  385. return list.get(0);
  386. }
  387. public AjaxResult resetAllSuperMan() {
  388. // Step:关闭所有Socket连接
  389. // Step:ping路由器,返回在线情况。
  390. // Step:ping教员端主机,返回在线情况。
  391. // Step:ping所有学员端主机,返回在线情况列表。
  392. // Step:ping所有RS485,返回在线情况列表。
  393. // Step:建立所有模拟器Socket,返回情况列表。
  394. // Step:有Socket的前提下,尝试查询所有模拟器连接情况,得到连接的模拟器 型号、序列号信息
  395. // Step:所有连接的模拟器,清除每一个模拟器的各个故障
  396. // Step:所有连接的模拟器,读取每一个模拟器的各个故障,是否处于考试准备ok状态
  397. return null;
  398. }
  399. }