index.js 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. import {
  2. examUserExamStart,
  3. examUserExamCommitmentConfirm,
  4. examUserCoursewareLearningRestart,
  5. } from '@/pages_safetyEducationExamination/api/index.js'
  6. /**
  7. * 考试入口统一处理
  8. * @param {Object} item 考试任务数据
  9. * @param {Object} callbacks { openCommitmentDialog } —— 需要显示承诺书时的回调
  10. */
  11. export async function goToExamPage(item, callbacks = {}) {
  12. if (item.conditionType == 1) {
  13. if (item.examStudy && item.courseId) {
  14. // 学习课程 — 等待后续逻辑
  15. uni.navigateTo({
  16. url: `/pages_safetyEducationExamination/views/webViewPage/courseLearning?courseId=${item.courseId}&examId=${item.examId}`,
  17. });
  18. } else {
  19. if (item.knowledgePointIds && item.knowledgePointIds.length > 0) {
  20. const ids = Array.isArray(item.knowledgePointIds)
  21. ? item.knowledgePointIds.join(',')
  22. : item.knowledgePointIds;
  23. uni.navigateTo({
  24. url: `/pages_safetyEducationExamination/views/studyHourTask/index?knowledgePointId=${ids}`,
  25. });
  26. } else {
  27. uni.navigateTo({ url: '/pages_safetyEducationExamination/views/study/index' });
  28. }
  29. }
  30. } else if (item.conditionType == 2) {
  31. // 学习课程
  32. uni.navigateTo({
  33. url: `/pages_safetyEducationExamination/views/webViewPage/courseLearning?courseId=${item.courseId}&examId=${item.examId}`,
  34. });
  35. } else if (item.conditionType == 3) {
  36. console.log('item',item)
  37. const pages = getCurrentPages();
  38. const currentPage = pages[pages.length - 1];
  39. const currentRoute = currentPage.route;
  40. if (item.mockExamId) {
  41. const examData = encodeURIComponent(JSON.stringify(item));
  42. uni.navigateTo({
  43. url: `/pages_safetyEducationExamination/views/exam/mockExamPlay?examId=${item.examId}&attemptId=${item.mockExamId}`,
  44. });
  45. // if(currentRoute == 'pages_safetyEducationExamination/views/exam/mockExamInfo' || currentRoute == 'pages_safetyEducationExamination/views/exam/onlineExamInfo'){
  46. // uni.navigateTo({
  47. // url: `/pages_safetyEducationExamination/views/exam/mockExamPlay?examId=${item.examId}&attemptId=${item.mockExamId}`,
  48. // });
  49. // }else{
  50. // uni.navigateTo({
  51. // url: `/pages_safetyEducationExamination/views/exam/mockExamInfo?examData=${examData}`,
  52. // });
  53. // }
  54. } else {
  55. try {
  56. const { data } = await examUserExamStart({ examId: item.examId, examScene: 2 });
  57. if (data.code === 200 && data.data && data.data.attemptId) {
  58. const filled = { ...item, attemptId: data.data.attemptId };
  59. const examData = encodeURIComponent(JSON.stringify(filled));
  60. uni.navigateTo({
  61. url: `/pages_safetyEducationExamination/views/exam/mockExamPlay?examId=${item.examId}&attemptId=${data.data.attemptId}`,
  62. });
  63. // if(currentRoute == 'pages_safetyEducationExamination/views/exam/mockExamInfo'){
  64. // uni.navigateTo({
  65. // url: `/pages_safetyEducationExamination/views/exam/mockExamPlay?examId=${item.examId}&attemptId=${data.data.attemptId}`,
  66. // });
  67. // }else{
  68. // uni.navigateTo({
  69. // url: `/pages_safetyEducationExamination/views/exam/mockExamInfo?examData=${examData}`,
  70. // });
  71. // }
  72. } else {
  73. uni.showToast({ title: data.message || '获取模拟试卷失败', icon: 'none' });
  74. }
  75. } catch (e) {
  76. console.error('获取模拟试卷失败', e);
  77. uni.showToast({ title: '获取模拟试卷失败', icon: 'none' });
  78. }
  79. }
  80. } else if (item.conditionType == 4) {
  81. await resolveExamEntry(item, callbacks);
  82. }
  83. }
  84. /**
  85. * 判断是否需要承诺书,并决定后续跳转
  86. * @param {Object} item 考试任务数据
  87. * @param {Object} callbacks { openCommitmentDialog(item) }
  88. */
  89. export async function resolveExamEntry(item, callbacks = {}) {
  90. if (item.commitmentEnabled == 1 && !item.commitmentConfirmed) {
  91. // 需要展示承诺书弹窗,交由调用方组件处理
  92. if (typeof callbacks.openCommitmentDialog === 'function') {
  93. callbacks.openCommitmentDialog(item);
  94. }
  95. } else {
  96. // 不需要承诺书,直接进入考试
  97. await startFormalExam(item);
  98. }
  99. }
  100. /**
  101. * 确认承诺书并进入考试(由组件点击"确认"按钮时调用)
  102. * @param {Object} preData 当前承诺书对应的考试数据
  103. * @param {Function} onClose 承诺确认成功后关闭弹窗的回调
  104. */
  105. export async function confirmCommitmentAndStart(preData, onClose) {
  106. let attemptId = preData.attemptId;
  107. if (!attemptId) {
  108. try {
  109. const { data } = await examUserExamStart({ examId: preData.examId, examScene: 1 });
  110. if (data.code === 200 && data.data && data.data.attemptId) {
  111. attemptId = data.data.attemptId;
  112. } else {
  113. uni.showToast({ title: data.message || '开始考试失败', icon: 'none' });
  114. return;
  115. }
  116. } catch (e) {
  117. console.error('开始考试失败', e);
  118. uni.showToast({ title: '开始考试失败', icon: 'none' });
  119. return;
  120. }
  121. }
  122. try {
  123. console.log('确认1')
  124. const { data } = await examUserExamCommitmentConfirm({ attemptId });
  125. console.log('确认2')
  126. if (data.code === 200) {
  127. console.log('确认3')
  128. if (typeof onClose === 'function') {
  129. onClose();
  130. } else {
  131. navigateToExamPlay(preData.examId, attemptId, preData.examKind);
  132. }
  133. } else {
  134. uni.showToast({ title: data.message || '确认失败', icon: 'none' });
  135. }
  136. } catch (e) {
  137. console.error('确认承诺书失败', e);
  138. uni.showToast({ title: '确认失败', icon: 'none' });
  139. }
  140. }
  141. /**
  142. * 发起或续考正式考试
  143. * @param {Object} item 考试任务数据(含 examId / attemptId / examKind)
  144. */
  145. export async function startFormalExam(item) {
  146. let attemptId = item.attemptId;
  147. if (!attemptId) {
  148. try {
  149. const { data } = await examUserExamStart({ examId: item.examId, examScene: 1 });
  150. if (data.code !== 200 || !data.data || !data.data.attemptId) {
  151. uni.showToast({ title: data.message || '开始考试失败', icon: 'none' });
  152. return;
  153. }
  154. attemptId = data.data.attemptId;
  155. } catch (e) {
  156. console.error('开始考试失败', e);
  157. uni.showToast({ title: '开始考试失败', icon: 'none' });
  158. return;
  159. }
  160. }
  161. navigateToExamPlay(item.examId, attemptId, item.examKind);
  162. }
  163. /**
  164. * 跳转到答题页
  165. */
  166. export function navigateToExamPlay(examId, attemptId, examKind) {
  167. uni.navigateTo({
  168. url: `/pages_safetyEducationExamination/views/exam/onlineExamPlay?examId=${encodeURIComponent(examId)}&attemptId=${encodeURIComponent(attemptId)}&examKind=${encodeURIComponent(examKind || '')}`,
  169. });
  170. }
  171. /**
  172. * 学习课件
  173. */
  174. export function goLearning(item){
  175. if(item.learnStatus == 2){
  176. uni.showModal({
  177. title: '提示',
  178. content: `该课件已学完,是否重置进度重新学习?`,
  179. success: async (res) => {
  180. if (res.confirm) {
  181. await examUserCoursewareLearningRestartFunction(item.coursewareId);
  182. }
  183. }
  184. });
  185. }else{
  186. uni.navigateTo({
  187. url: `/pages_safetyEducationExamination/views/webViewPage/coursewareLearning?coursewareId=${item.coursewareId}`,
  188. });
  189. }
  190. }
  191. /**
  192. * 查询课件是否已学过
  193. */
  194. export async function examUserCoursewareLearningRestartFunction(coursewareId ) {
  195. try {
  196. const { data } = await examUserCoursewareLearningRestart({coursewareId:coursewareId});
  197. if (data.code === 200) {
  198. uni.navigateTo({
  199. url: `/pages_safetyEducationExamination/views/webViewPage/coursewareLearning?coursewareId=${coursewareId}`,
  200. });
  201. }
  202. } catch (e) { console.error('重新开始学习课件失败', e); }
  203. }