TrainingDetails.tsx 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283
  1. import {
  2. NButton,
  3. NSpace,
  4. useMessage,
  5. NImage,
  6. NScrollbar,
  7. NSpin,
  8. NModal,
  9. NTooltip
  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. import CommentWork from '../../studentList/modals/comment-work';
  22. import WorkItem from '../work-item';
  23. import { modalClickMask } from '/src/state';
  24. export default defineComponent({
  25. props: {
  26. activeRow: {
  27. type: Object,
  28. default: () => ({ studentLessonTrainingId: '' })
  29. },
  30. total: {
  31. type: Number,
  32. default: 0
  33. },
  34. current: {
  35. type: Number,
  36. default: 0
  37. }
  38. },
  39. name: 'TrainingDetails',
  40. emits: ['close', 'next', 'pre'],
  41. setup(props, { emit, expose }) {
  42. const loading = ref(false);
  43. const studnetInfo = ref({
  44. studentName: '',
  45. submitTime: '',
  46. trainingStatus: '',
  47. studentAvatar: '',
  48. studentLessonTrainingDetails: [] as any
  49. } as any);
  50. const showModalMask = ref(false);
  51. // const message = useMessage();
  52. // const foemsRef = ref();
  53. const typeFormat = (trainingType: string, configJson: any) => {
  54. let tList: string[] = [];
  55. if (trainingType === 'EVALUATION') {
  56. tList = [
  57. `${evaluateDifficult[configJson.evaluateDifficult]}`,
  58. `${configJson.practiceChapterBegin || 0}-${configJson.practiceChapterEnd || 0}小节`,
  59. `速度${configJson.evaluateSpeed || 0}`,
  60. `${configJson.trainingTimes}分达标`
  61. ];
  62. // console.log('configJson.evaluateDifficult--', tList);
  63. } else {
  64. tList = [
  65. `${configJson.practiceChapterBegin}-${configJson.practiceChapterEnd}小节`,
  66. `速度${configJson.practiceSpeed || 0}`,
  67. `${configJson.trainingTimes}分钟`
  68. ];
  69. // console.log('configJson.evaluateDifficult', tList);
  70. }
  71. return tList;
  72. };
  73. const getTrainingDetail = async (id: any) => {
  74. loading.value = true;
  75. try {
  76. const res = await getTrainingStudentDetail({
  77. studentLessonTrainingId: id
  78. });
  79. const arr = res.data.studentLessonTrainingDetails.map((item: any) => {
  80. const tList = typeFormat(
  81. item.trainingType,
  82. JSON.parse(item.trainingContent)
  83. );
  84. return {
  85. ...item,
  86. coverImg: item.titleImg,
  87. fileList: (item.fileJsonList && item.fileJsonList[0]) || {},
  88. allTimes: JSON.parse(item.trainingContent).trainingTimes,
  89. typeList: tList || []
  90. };
  91. });
  92. studnetInfo.value = {
  93. ...res.data,
  94. studentLessonTrainingDetails: arr
  95. };
  96. } catch (e) {
  97. console.log(e);
  98. }
  99. loading.value = false;
  100. };
  101. expose({ getTrainingDetail });
  102. onMounted(() => {
  103. getTrainingDetail(props.activeRow.studentLessonTrainingId);
  104. });
  105. return () => (
  106. <div class={[styles.trainingDetails]}>
  107. <NSpin show={loading.value}>
  108. <div class={styles.studentList}>
  109. <div class={styles.studentHeaderWrap}>
  110. <div class={styles.studentHeader}>
  111. <div class={styles.studentHeaderBorder}>
  112. <NImage
  113. class={styles.studentHeaderImg}
  114. src={
  115. studnetInfo.value.studentAvatar
  116. ? studnetInfo.value.studentAvatar
  117. : defultHeade
  118. }
  119. previewDisabled></NImage>
  120. </div>
  121. </div>
  122. <div class={styles.workafterInfo}>
  123. <h4>
  124. {studnetInfo.value.studentName}{' '}
  125. <div class={styles.workafterInfoDot}>学生</div>
  126. </h4>
  127. <p>
  128. 提交时间:
  129. {studnetInfo.value.submitTime
  130. ? dayjs(new Date(studnetInfo.value.submitTime)).format(
  131. 'YYYY-MM-DD'
  132. )
  133. : '--'}
  134. </p>
  135. </div>
  136. {studnetInfo.value.trainingStatus == 'UNSUBMITTED' ? (
  137. <NImage
  138. previewDisabled
  139. class={styles.workStatus}
  140. src={noSub}></NImage>
  141. ) : null}
  142. {studnetInfo.value.trainingStatus == 'SUBMITTED' ? (
  143. <NImage
  144. previewDisabled
  145. class={styles.workStatus}
  146. src={unqualified}></NImage>
  147. ) : null}
  148. {studnetInfo.value.trainingStatus == 'TARGET' ? (
  149. <NImage
  150. previewDisabled
  151. class={styles.workStatus}
  152. src={qualified}></NImage>
  153. ) : null}
  154. </div>
  155. {studnetInfo.value.expireFlag ? (
  156. <NButton
  157. onClick={() => (showModalMask.value = true)}
  158. class={styles.commentBtnGroup}>
  159. <div class={styles.text}>
  160. <i></i>
  161. {studnetInfo.value.comment ? '修改点评' : '点评作业'}
  162. </div>
  163. </NButton>
  164. ) : (
  165. <NTooltip showArrow={false}>
  166. {{
  167. trigger: () => (
  168. <NButton
  169. disabled
  170. onClick={() => (showModalMask.value = true)}
  171. class={styles.commentBtnGroup}>
  172. <div class={styles.text}>
  173. <i></i>
  174. {studnetInfo.value.comment ? '修改点评' : '点评作业'}
  175. </div>
  176. </NButton>
  177. ),
  178. default: '作业截止后可点评作业'
  179. }}
  180. </NTooltip>
  181. )}
  182. </div>
  183. {(studnetInfo.value.fileExpireDay || 0 > 0) && (
  184. <div class={styles.expireDateTip}>
  185. <i class={styles.expireDateIcon}></i>
  186. <span>
  187. 作业截止{studnetInfo.value.fileExpireDay || 0}
  188. 天后,学生上传的文件将过期,请及时查看
  189. </span>
  190. </div>
  191. )}
  192. <NScrollbar style="max-height:400px;" trigger="none">
  193. <div class={styles.workList}>
  194. {studnetInfo.value.studentLessonTrainingDetails.map(
  195. (item: any) => (
  196. <WorkItem
  197. item={{
  198. ...item,
  199. studentName: studnetInfo.value.studentName
  200. }}
  201. />
  202. )
  203. )}
  204. </div>
  205. {studnetInfo.value.comment && (
  206. <div class={styles.commentSection}>
  207. <h3>
  208. <i class={styles.iconComment}></i>
  209. <i class={styles.myText}></i>
  210. </h3>
  211. <div class={styles.commentContent}>
  212. {studnetInfo.value.comment}
  213. </div>
  214. </div>
  215. )}
  216. </NScrollbar>
  217. <NSpace
  218. class={[styles.btnGroups, styles.nextWrap]}
  219. justify="space-between">
  220. <div class={styles.allTotal}>
  221. {props.current}/{props.total}名学生
  222. </div>
  223. <div>
  224. <NSpace>
  225. <NButton
  226. disabled={props.current <= 1}
  227. round
  228. type="primary"
  229. onClick={() => {
  230. emit('pre');
  231. }}>
  232. 上一名
  233. </NButton>
  234. <NButton
  235. disabled={props.current >= props.total}
  236. round
  237. type="primary"
  238. onClick={() => {
  239. emit('next');
  240. }}>
  241. 下一名
  242. </NButton>
  243. </NSpace>
  244. </div>
  245. </NSpace>
  246. </NSpin>
  247. <NModal
  248. maskClosable={modalClickMask}
  249. v-model:show={showModalMask.value}>
  250. <CommentWork
  251. comment={studnetInfo.value.comment}
  252. workInfo={{
  253. isLook: studnetInfo.value.comment ? true : false,
  254. studentAvatar: studnetInfo.value.studentAvatar,
  255. studentName: studnetInfo.value.studentName,
  256. submitTime: studnetInfo.value.submitTime,
  257. studentLessonTrainingId: studnetInfo.value.studentLessonTrainingId
  258. }}
  259. onClose={() => (showModalMask.value = false)}
  260. onConfrim={() => {
  261. getTrainingDetail(props.activeRow.studentLessonTrainingId);
  262. showModalMask.value = false;
  263. }}
  264. />
  265. </NModal>
  266. </div>
  267. );
  268. }
  269. });