TrainingDetails.tsx 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. import {
  2. NButton,
  3. NSpace,
  4. useMessage,
  5. NForm,
  6. NFormItem,
  7. NSelect,
  8. NImage,
  9. NScrollbar
  10. } from 'naive-ui';
  11. import { defineComponent, onMounted, reactive, ref } from 'vue';
  12. import { getTrainingStudentDetail } from '../api';
  13. import styles from '../index.module.less';
  14. import TrainType from '@/views/attend-class/model/train-type';
  15. import defultHeade from '@/components/layout/images/teacherIcon.png';
  16. import noSub from '../images/nosub.png';
  17. import qualified from '../images/qualified.png';
  18. import unqualified from '../images/unqualified.png';
  19. import { evaluateDifficult } from '/src/utils/contants';
  20. import dayjs from 'dayjs';
  21. export default defineComponent({
  22. props: {
  23. activeRow: {
  24. type: Object,
  25. default: () => ({ studentLessonTrainingId: '' })
  26. },
  27. total: {
  28. type: Number,
  29. default: 0
  30. },
  31. current: {
  32. type: Number,
  33. default: 0
  34. }
  35. },
  36. name: 'TrainingDetails',
  37. emits: ['close', 'next', 'pre'],
  38. setup(props, { emit, expose }) {
  39. const data = reactive({
  40. uploading: false
  41. });
  42. const studnetInfo = ref({
  43. studentName: '',
  44. submitTime: '',
  45. trainingStatus: '',
  46. studentAvatar: '',
  47. studentLessonTrainingDetails: [] as any
  48. } as any);
  49. const message = useMessage();
  50. const foemsRef = ref();
  51. const typeFormat = (trainingType: string, configJson: any) => {
  52. let tList: string[] = [];
  53. if (trainingType === 'EVALUATION') {
  54. tList = [
  55. `${evaluateDifficult[configJson.evaluateDifficult]}`,
  56. configJson.practiceChapterBegin || configJson.practiceChapterEnd
  57. ? `${configJson.practiceChapterBegin}-${configJson.practiceChapterEnd}小节`
  58. : '全部小节',
  59. // `速度${configJson.evaluateSpeed}`,
  60. `${configJson.trainingTimes}分合格`
  61. ];
  62. console.log('configJson.evaluateDifficult--', tList);
  63. } else {
  64. tList = [
  65. `${configJson.practiceChapterBegin}-${configJson.practiceChapterEnd}小节`,
  66. `速度${configJson.practiceSpeed}`,
  67. `${configJson.trainingTimes}分钟`
  68. ];
  69. console.log('configJson.evaluateDifficult', tList);
  70. }
  71. return tList;
  72. };
  73. const getTrainingDetail = async (id: any) => {
  74. try {
  75. const res = await getTrainingStudentDetail({
  76. studentLessonTrainingId: id
  77. });
  78. const arr = res.data.studentLessonTrainingDetails.map((item: any) => {
  79. const tList = typeFormat(
  80. item.trainingType,
  81. JSON.parse(item.trainingContent)
  82. );
  83. return {
  84. ...item,
  85. coverImg: item.titleImg,
  86. allTimes: JSON.parse(item.trainingContent).trainingTimes,
  87. typeList: tList || []
  88. };
  89. });
  90. studnetInfo.value = {
  91. ...res.data,
  92. studentLessonTrainingDetails: arr
  93. };
  94. } catch (e) {
  95. console.log(e);
  96. }
  97. };
  98. expose({ getTrainingDetail });
  99. onMounted(() => {
  100. getTrainingDetail(props.activeRow.studentLessonTrainingId);
  101. });
  102. return () => (
  103. <div class={[styles.trainingDetails]}>
  104. <div class={styles.studentList}>
  105. <div class={styles.studentHeaderWrap}>
  106. <div class={styles.studentHeader}>
  107. <div class={styles.studentHeaderBorder}>
  108. <NImage
  109. class={styles.studentHeaderImg}
  110. src={
  111. studnetInfo.value.studentAvatar
  112. ? studnetInfo.value.studentAvatar
  113. : defultHeade
  114. }
  115. previewDisabled></NImage>
  116. </div>
  117. </div>
  118. <div class={styles.workafterInfo}>
  119. <h4>
  120. {studnetInfo.value.studentName}{' '}
  121. <div class={styles.workafterInfoDot}>学生</div>
  122. </h4>
  123. <p>
  124. 提交时间:
  125. {studnetInfo.value.submitTime
  126. ? dayjs(new Date(studnetInfo.value.submitTime)).format(
  127. 'YYYY-MM-DD'
  128. )
  129. : '--'}
  130. </p>
  131. </div>
  132. </div>
  133. {studnetInfo.value.trainingStatus == 'UNSUBMITTED' ? (
  134. <NImage
  135. previewDisabled
  136. class={styles.workStatus}
  137. src={noSub}></NImage>
  138. ) : null}
  139. {studnetInfo.value.trainingStatus == 'SUBMITTED' ? (
  140. <NImage
  141. previewDisabled
  142. class={styles.workStatus}
  143. src={unqualified}></NImage>
  144. ) : null}
  145. {studnetInfo.value.trainingStatus == 'TARGET' ? (
  146. <NImage
  147. previewDisabled
  148. class={styles.workStatus}
  149. src={qualified}></NImage>
  150. ) : null}
  151. </div>
  152. <NScrollbar style="max-height:400px" trigger="none">
  153. <div class={styles.workList}>
  154. {studnetInfo.value.studentLessonTrainingDetails.map((item: any) => (
  155. <TrainType
  156. style={{ marginBottom: '20px' }}
  157. isDisabled={true}
  158. isDelete={false}
  159. item={item}></TrainType>
  160. ))}
  161. </div>
  162. </NScrollbar>
  163. <NSpace
  164. class={[styles.btnGroups, styles.nextWrap]}
  165. justify="space-between">
  166. <div class={styles.allTotal}>
  167. {props.current}/{props.total}名学生
  168. </div>
  169. <div>
  170. <NSpace>
  171. <NButton
  172. disabled={props.current <= 1}
  173. round
  174. type="primary"
  175. onClick={() => {
  176. emit('pre');
  177. }}>
  178. 上一名
  179. </NButton>
  180. <NButton
  181. disabled={props.current >= props.total}
  182. round
  183. type="primary"
  184. onClick={() => {
  185. emit('next');
  186. }}>
  187. 下一名
  188. </NButton>
  189. </NSpace>
  190. </div>
  191. </NSpace>
  192. </div>
  193. );
  194. }
  195. });