useStudent.ts 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. import { StudentObjectiveInfo } from "@/types";
  2. import { studentObjectiveConfirmData } from "@/api/checkPage";
  3. import { message } from "ant-design-vue";
  4. import { computed } from "vue";
  5. import { useCheckObjectiveStore } from "@/store";
  6. export default function useStudent() {
  7. const checkObjectiveStore = useCheckObjectiveStore();
  8. const currentIndex = computed(() =>
  9. checkObjectiveStore.studentIds.indexOf(checkObjectiveStore.currentStudentId)
  10. );
  11. const isFirst = computed(() => currentIndex.value === 0);
  12. const isLast = computed(
  13. () => currentIndex.value === checkObjectiveStore.studentIds.length - 1
  14. );
  15. const isMultiStudent = computed(
  16. () => checkObjectiveStore.studentIds.length > 1
  17. );
  18. const totalScore = computed(() => {
  19. if (!checkObjectiveStore.student) return 0;
  20. return checkObjectiveStore.student.objectiveScore || 0;
  21. });
  22. const curImageUrl = computed(() =>
  23. checkObjectiveStore.student
  24. ? checkObjectiveStore.student.sheetUrls[checkObjectiveStore.currentImage]
  25. ?.url
  26. : ""
  27. );
  28. const answersComputed = computed(() => {
  29. if (!checkObjectiveStore.student) return [];
  30. const { answers, titles } = checkObjectiveStore.student;
  31. let mains = answers.map((v) => ({
  32. mainTitle: "",
  33. mainNumber: v.mainNumber,
  34. subs: [v],
  35. }));
  36. const mSet = new Set();
  37. mains = mains?.filter((v) => {
  38. if (!mSet.has(v.mainNumber)) {
  39. mSet.add(v.mainNumber);
  40. v.subs = [];
  41. return true;
  42. }
  43. });
  44. mains?.forEach((v) => {
  45. v.mainTitle = titles ? titles[v.mainNumber] : "";
  46. v.subs = answers.filter((v2) => v2.mainNumber === v.mainNumber) ?? [];
  47. });
  48. return mains;
  49. });
  50. async function getNextStudent() {
  51. if (isLast.value && !isFirst.value) {
  52. void message.warning("已经是最后一份!");
  53. return;
  54. }
  55. await getStudent(checkObjectiveStore.studentIds[currentIndex.value + 1]);
  56. }
  57. async function getPreviousStudent() {
  58. if (isFirst.value) {
  59. void message.warning("已经是第一份!");
  60. return;
  61. }
  62. await getStudent(checkObjectiveStore.studentIds[currentIndex.value - 1]);
  63. }
  64. async function getStudent(studentId: string) {
  65. let dataError = false;
  66. const res = await studentObjectiveConfirmData(studentId).catch(() => {
  67. dataError = true;
  68. });
  69. if (dataError) {
  70. void message.error(res.message, 24 * 60 * 60);
  71. throw new Error("取学生信息出错: " + res.message);
  72. }
  73. checkObjectiveStore.student = res.data as StudentObjectiveInfo;
  74. checkObjectiveStore.currentStudentId = studentId;
  75. checkObjectiveStore.currentImage = 0;
  76. checkObjectiveStore.browsedImageIndexes = [0];
  77. checkObjectiveStore.answerMap = {};
  78. checkObjectiveStore.student?.answers.forEach((item) => {
  79. checkObjectiveStore.answerMap[`${item.mainNumber}_${item.subNumber}`] = {
  80. answer: item.answer,
  81. isRight: item.answer === item.standardAnswer,
  82. };
  83. });
  84. }
  85. async function updateCurStudent() {
  86. await getStudent(checkObjectiveStore.studentIds[currentIndex]);
  87. }
  88. return {
  89. currentIndex,
  90. isFirst,
  91. isLast,
  92. isMultiStudent,
  93. totalScore,
  94. curImageUrl,
  95. answersComputed,
  96. getNextStudent,
  97. getPreviousStudent,
  98. updateCurStudent,
  99. };
  100. }