|  | @@ -3,6 +3,8 @@ import {
 | 
	
		
			
				|  |  |    Button,
 | 
	
		
			
				|  |  |    Cell,
 | 
	
		
			
				|  |  |    CountDown,
 | 
	
		
			
				|  |  | +  Grid,
 | 
	
		
			
				|  |  | +  GridItem,
 | 
	
		
			
				|  |  |    Icon,
 | 
	
		
			
				|  |  |    Image,
 | 
	
		
			
				|  |  |    Popup,
 | 
	
	
		
			
				|  | @@ -10,11 +12,9 @@ import {
 | 
	
		
			
				|  |  |    SwipeItem,
 | 
	
		
			
				|  |  |    Tag
 | 
	
		
			
				|  |  |  } from 'vant'
 | 
	
		
			
				|  |  | -import { defineComponent, nextTick, onMounted, reactive, ref } from 'vue'
 | 
	
		
			
				|  |  | +import { computed, defineComponent, nextTick, onMounted, reactive, ref } from 'vue'
 | 
	
		
			
				|  |  |  import { useRoute, useRouter } from 'vue-router'
 | 
	
		
			
				|  |  |  import styles from './index.module.less'
 | 
	
		
			
				|  |  | -import iconQuestionNums from '../images/icon-question-nums.png'
 | 
	
		
			
				|  |  | -import iconCountDown from '../images/icon-count-down.png'
 | 
	
		
			
				|  |  |  import iconButtonList from '../images/icon-button-list.png'
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  import OSticky from '@/components/o-sticky'
 | 
	
	
		
			
				|  | @@ -39,33 +39,34 @@ export default defineComponent({
 | 
	
		
			
				|  |  |      const countDownRef = ref()
 | 
	
		
			
				|  |  |      const swipeRef = ref()
 | 
	
		
			
				|  |  |      const state = reactive({
 | 
	
		
			
				|  |  | +      name: route.query.id,
 | 
	
		
			
				|  |  |        visiableError: false,
 | 
	
		
			
				|  |  |        visiableAnswer: false,
 | 
	
		
			
				|  |  |        visiableResult: false,
 | 
	
		
			
				|  |  |        id: route.query.id,
 | 
	
		
			
				|  |  | -      examDetail: {} as any,
 | 
	
		
			
				|  |  |        currentIndex: 0,
 | 
	
		
			
				|  |  |        questionList: [],
 | 
	
		
			
				|  |  | +      questionResultList: [],
 | 
	
		
			
				|  |  |        time: 0,
 | 
	
		
			
				|  |  |        visiableSure: false,
 | 
	
		
			
				|  |  |        resultInfo: {} as any,
 | 
	
		
			
				|  |  |        resultStatusType: 'SUCCESS', // 'SUCCESS' | 'FAIL'
 | 
	
		
			
				|  |  |        visiableExam: false, // 考试已结束
 | 
	
		
			
				|  |  |        nextStatus: false,
 | 
	
		
			
				|  |  | -      swipeHeight: 'auto' as any
 | 
	
		
			
				|  |  | +      swipeHeight: 'auto' as any,
 | 
	
		
			
				|  |  | +      answerAnalysis: ''
 | 
	
		
			
				|  |  |      })
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      const getExamDetails = async () => {
 | 
	
		
			
				|  |  |        try {
 | 
	
		
			
				|  |  | -        const { data } = await request.post('/api-student/examinationQuestion/page', {
 | 
	
		
			
				|  |  | +        const { data } = await request.post('/api-student/examinationQuestion/randomPage', {
 | 
	
		
			
				|  |  |            data: {
 | 
	
		
			
				|  |  |              page: 1,
 | 
	
		
			
				|  |  |              row: 50,
 | 
	
		
			
				|  |  |              categoryId: state.id
 | 
	
		
			
				|  |  |            }
 | 
	
		
			
				|  |  |          })
 | 
	
		
			
				|  |  | -        const { questionJson, studentAnswerJson, ...res } = data
 | 
	
		
			
				|  |  | -        const temp = data.rows || []
 | 
	
		
			
				|  |  | +        const temp = data || []
 | 
	
		
			
				|  |  |          temp.forEach((item: any) => {
 | 
	
		
			
				|  |  |            item.showAnalysis = false // 默认不显示解析
 | 
	
		
			
				|  |  |            item.analysis = {
 | 
	
	
		
			
				|  | @@ -76,8 +77,6 @@ export default defineComponent({
 | 
	
		
			
				|  |  |            item.userAnswer = [] // 用户答题
 | 
	
		
			
				|  |  |          })
 | 
	
		
			
				|  |  |          state.questionList = temp
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        state.examDetail = { ...res } || {}
 | 
	
		
			
				|  |  |        } catch {
 | 
	
		
			
				|  |  |          //
 | 
	
		
			
				|  |  |        }
 | 
	
	
		
			
				|  | @@ -89,15 +88,15 @@ export default defineComponent({
 | 
	
		
			
				|  |  |      const onNextQuestion = async () => {
 | 
	
		
			
				|  |  |        try {
 | 
	
		
			
				|  |  |          const questionList = state.questionList || []
 | 
	
		
			
				|  |  | -        const userAnswerList: any = [] // 所有题目的答案
 | 
	
		
			
				|  |  | -        // let currentResult = false // 当前题目是否已经答题
 | 
	
		
			
				|  |  | -        questionList.forEach((question: any) => {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        let result: any = {}
 | 
	
		
			
				|  |  | +        questionList.forEach((question: any, index: number) => {
 | 
	
		
			
				|  |  |            // 格式化所有题目的答案
 | 
	
		
			
				|  |  | -          if (question.userAnswer && question.userAnswer.length > 0) {
 | 
	
		
			
				|  |  | -            userAnswerList.push({
 | 
	
		
			
				|  |  | +          if (index === state.currentIndex) {
 | 
	
		
			
				|  |  | +            result = {
 | 
	
		
			
				|  |  |                questionId: question.id,
 | 
	
		
			
				|  |  | -              details: question.userAnswer
 | 
	
		
			
				|  |  | -            })
 | 
	
		
			
				|  |  | +              details: question.userAnswer || []
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  |            }
 | 
	
		
			
				|  |  |          })
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -107,12 +106,52 @@ export default defineComponent({
 | 
	
		
			
				|  |  |            return
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        swipeRef.value?.next()
 | 
	
		
			
				|  |  | +        const { data } = await request.post(
 | 
	
		
			
				|  |  | +          '/api-school/studentUnitExamination/submitTrainingAnswer',
 | 
	
		
			
				|  |  | +          {
 | 
	
		
			
				|  |  | +            data: result
 | 
	
		
			
				|  |  | +          }
 | 
	
		
			
				|  |  | +        )
 | 
	
		
			
				|  |  | +        // 初始化是否显示解析
 | 
	
		
			
				|  |  | +        questionList.forEach((question: any, index: number) => {
 | 
	
		
			
				|  |  | +          // 格式化所有题目的答案
 | 
	
		
			
				|  |  | +          if (index === state.currentIndex) {
 | 
	
		
			
				|  |  | +            state.answerAnalysis = question.answerAnalysis
 | 
	
		
			
				|  |  | +            question.showAnalysis = true
 | 
	
		
			
				|  |  | +            question.analysis.userResult = data
 | 
	
		
			
				|  |  | +          }
 | 
	
		
			
				|  |  | +        })
 | 
	
		
			
				|  |  | +        if (data) {
 | 
	
		
			
				|  |  | +          swipeRef.value?.next()
 | 
	
		
			
				|  |  | +        } else {
 | 
	
		
			
				|  |  | +          state.visiableError = true
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  |        } catch {
 | 
	
		
			
				|  |  |          //
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +    //
 | 
	
		
			
				|  |  | +    const getAnswerResult = computed(() => {
 | 
	
		
			
				|  |  | +      const questionList = state.questionList || []
 | 
	
		
			
				|  |  | +      let passCount = 0
 | 
	
		
			
				|  |  | +      let noPassCount = 0
 | 
	
		
			
				|  |  | +      questionList.forEach((item: any) => {
 | 
	
		
			
				|  |  | +        if (item.showAnalysis) {
 | 
	
		
			
				|  |  | +          if (item.analysis.userResult) {
 | 
	
		
			
				|  |  | +            passCount += 1
 | 
	
		
			
				|  |  | +          } else {
 | 
	
		
			
				|  |  | +            noPassCount += 1
 | 
	
		
			
				|  |  | +          }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +      })
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      return {
 | 
	
		
			
				|  |  | +        passCount: passCount,
 | 
	
		
			
				|  |  | +        noPassCount: noPassCount
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    })
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      /**
 | 
	
		
			
				|  |  |       * @description 重置当前的题目高度
 | 
	
		
			
				|  |  |       */
 | 
	
	
		
			
				|  | @@ -128,6 +167,10 @@ export default defineComponent({
 | 
	
		
			
				|  |  |        })
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +    const onCloseExam = () => {
 | 
	
		
			
				|  |  | +      state.visiableSure = true
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      onMounted(() => {
 | 
	
		
			
				|  |  |        getExamDetails()
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -139,12 +182,7 @@ export default defineComponent({
 | 
	
		
			
				|  |  |            <OHeader
 | 
	
		
			
				|  |  |              v-slots={{
 | 
	
		
			
				|  |  |                right: () => (
 | 
	
		
			
				|  |  | -                <span
 | 
	
		
			
				|  |  | -                  style="color: var(--van-primary-color)"
 | 
	
		
			
				|  |  | -                  onClick={() => {
 | 
	
		
			
				|  |  | -                    // router.push('/create-message')
 | 
	
		
			
				|  |  | -                  }}
 | 
	
		
			
				|  |  | -                >
 | 
	
		
			
				|  |  | +                <span style="color: var(--van-primary-color)" onClick={onCloseExam}>
 | 
	
		
			
				|  |  |                    结束练习
 | 
	
		
			
				|  |  |                  </span>
 | 
	
		
			
				|  |  |                )
 | 
	
	
		
			
				|  | @@ -153,20 +191,16 @@ export default defineComponent({
 | 
	
		
			
				|  |  |          </OSticky>
 | 
	
		
			
				|  |  |          <Cell center class={styles.unitSection}>
 | 
	
		
			
				|  |  |            {{
 | 
	
		
			
				|  |  | -            title: () => (
 | 
	
		
			
				|  |  | -              <div class={[styles.unitTitle]}>
 | 
	
		
			
				|  |  | -                {state.examDetail.unitExaminationName}i门口看门口看看门口看看门口看看门口看看看
 | 
	
		
			
				|  |  | -              </div>
 | 
	
		
			
				|  |  | -            ),
 | 
	
		
			
				|  |  | +            title: () => <div class={[styles.unitTitle]}>{state.name}</div>,
 | 
	
		
			
				|  |  |              value: () => (
 | 
	
		
			
				|  |  |                <div class={styles.unitCount}>
 | 
	
		
			
				|  |  |                  <div class={styles.countSection}>
 | 
	
		
			
				|  |  | -                  <span class={styles.nums}>12</span>
 | 
	
		
			
				|  |  | +                  <span class={styles.nums}>{getAnswerResult.value.passCount}</span>
 | 
	
		
			
				|  |  |                    <span>答对</span>
 | 
	
		
			
				|  |  |                  </div>
 | 
	
		
			
				|  |  |                  <div class={styles.countSection}>
 | 
	
		
			
				|  |  |                    <span class={styles.nums} style={{ color: '#F44541' }}>
 | 
	
		
			
				|  |  | -                    12
 | 
	
		
			
				|  |  | +                    {getAnswerResult.value.noPassCount}
 | 
	
		
			
				|  |  |                    </span>
 | 
	
		
			
				|  |  |                    <span>答错</span>
 | 
	
		
			
				|  |  |                  </div>
 | 
	
	
		
			
				|  | @@ -181,6 +215,7 @@ export default defineComponent({
 | 
	
		
			
				|  |  |            ref={swipeRef}
 | 
	
		
			
				|  |  |            duration={300}
 | 
	
		
			
				|  |  |            touchable={false}
 | 
	
		
			
				|  |  | +          style={{ paddingBottom: '12px' }}
 | 
	
		
			
				|  |  |            lazyRender
 | 
	
		
			
				|  |  |            height={state.swipeHeight}
 | 
	
		
			
				|  |  |            onChange={(index: number) => {
 | 
	
	
		
			
				|  | @@ -189,17 +224,6 @@ export default defineComponent({
 | 
	
		
			
				|  |  |            }}
 | 
	
		
			
				|  |  |          >
 | 
	
		
			
				|  |  |            {state.questionList.map((item: any, index: number) => (
 | 
	
		
			
				|  |  | -            // item.questionTypeCode === QuestionType.PLAY && (
 | 
	
		
			
				|  |  | -            //   <SwipeItem>
 | 
	
		
			
				|  |  | -            //     <KeepLookQuestion v-model:value={item.userAnswer} data={item} index={index + 1} />
 | 
	
		
			
				|  |  | -            //     <PlayQuestion
 | 
	
		
			
				|  |  | -            //       v-model:value={item.userAnswer}
 | 
	
		
			
				|  |  | -            //       data={item}
 | 
	
		
			
				|  |  | -            //       index={index + 1}
 | 
	
		
			
				|  |  | -            //       unitId={state.id as any}
 | 
	
		
			
				|  |  | -            //     />
 | 
	
		
			
				|  |  | -            //   </SwipeItem>
 | 
	
		
			
				|  |  | -            // )
 | 
	
		
			
				|  |  |              <SwipeItem>
 | 
	
		
			
				|  |  |                <div class="swipe-item-question">
 | 
	
		
			
				|  |  |                  {item.questionTypeCode === QuestionType.RADIO && (
 | 
	
	
		
			
				|  | @@ -321,8 +345,10 @@ export default defineComponent({
 | 
	
		
			
				|  |  |          >
 | 
	
		
			
				|  |  |            <ErrorMode
 | 
	
		
			
				|  |  |              onClose={() => (state.visiableError = false)}
 | 
	
		
			
				|  |  | +            answerAnalysis={state.answerAnalysis}
 | 
	
		
			
				|  |  |              onConform={() => {
 | 
	
		
			
				|  |  |                swipeRef.value?.next()
 | 
	
		
			
				|  |  | +              state.answerAnalysis = ''
 | 
	
		
			
				|  |  |              }}
 | 
	
		
			
				|  |  |            />
 | 
	
		
			
				|  |  |          </Popup>
 | 
	
	
		
			
				|  | @@ -333,7 +359,7 @@ export default defineComponent({
 | 
	
		
			
				|  |  |            style={{ background: 'transparent', width: '96%' }}
 | 
	
		
			
				|  |  |          >
 | 
	
		
			
				|  |  |            <ResultFinish
 | 
	
		
			
				|  |  | -            // status="FAIL"
 | 
	
		
			
				|  |  | +            status="PRACTICE"
 | 
	
		
			
				|  |  |              confirmButtonText="继续练习本考点"
 | 
	
		
			
				|  |  |              cancelButtonText="下一个考点"
 | 
	
		
			
				|  |  |              onClose={() => (state.visiableResult = false)}
 | 
	
	
		
			
				|  | @@ -341,13 +367,40 @@ export default defineComponent({
 | 
	
		
			
				|  |  |                console.log('Success')
 | 
	
		
			
				|  |  |                state.visiableResult = false
 | 
	
		
			
				|  |  |              }}
 | 
	
		
			
				|  |  | +            v-slots={{
 | 
	
		
			
				|  |  | +              content: () => (
 | 
	
		
			
				|  |  | +                <div class={styles.practiceResult}>
 | 
	
		
			
				|  |  | +                  <div class={styles.practiceTitle}>本次练习正确率</div>
 | 
	
		
			
				|  |  | +                  <div class={styles.practiceRate}>80%</div>
 | 
	
		
			
				|  |  | +                  <Grid border={false} columnNum={3}>
 | 
	
		
			
				|  |  | +                    <GridItem>
 | 
	
		
			
				|  |  | +                      <p class={styles.title}>12</p>
 | 
	
		
			
				|  |  | +                      <p class={styles.name}>练习时长</p>
 | 
	
		
			
				|  |  | +                    </GridItem>
 | 
	
		
			
				|  |  | +                    <GridItem>
 | 
	
		
			
				|  |  | +                      <p class={[styles.title]}>12</p>
 | 
	
		
			
				|  |  | +                      <p class={styles.name}>答题数</p>
 | 
	
		
			
				|  |  | +                    </GridItem>
 | 
	
		
			
				|  |  | +                    <GridItem>
 | 
	
		
			
				|  |  | +                      <p class={styles.title}>12</p>
 | 
	
		
			
				|  |  | +                      <p class={styles.name}>错题数</p>
 | 
	
		
			
				|  |  | +                    </GridItem>
 | 
	
		
			
				|  |  | +                  </Grid>
 | 
	
		
			
				|  |  | +                  <div class={styles.practiceTips}>
 | 
	
		
			
				|  |  | +                    继续努力!
 | 
	
		
			
				|  |  | +                    <br />
 | 
	
		
			
				|  |  | +                    争取在测验中获得高分!
 | 
	
		
			
				|  |  | +                  </div>
 | 
	
		
			
				|  |  | +                </div>
 | 
	
		
			
				|  |  | +              )
 | 
	
		
			
				|  |  | +            }}
 | 
	
		
			
				|  |  |            />
 | 
	
		
			
				|  |  |          </Popup>
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          <ODialog
 | 
	
		
			
				|  |  |            v-model:show={state.visiableSure}
 | 
	
		
			
				|  |  | -          title="测验完成"
 | 
	
		
			
				|  |  | -          message="确认本次测验的题目都完成了吗?\n提交后不可修改哦"
 | 
	
		
			
				|  |  | +          title="练习完成"
 | 
	
		
			
				|  |  | +          message="确认本次练习的题目都完成了吗?"
 | 
	
		
			
				|  |  |            messageAlign="left"
 | 
	
		
			
				|  |  |            showCancelButton
 | 
	
		
			
				|  |  |            cancelButtonText="再等等"
 |