afterWorkDetail.tsx 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322
  1. import { defineComponent, onMounted, reactive, ref } from 'vue';
  2. import styles from '../index.module.less';
  3. import {
  4. NButton,
  5. NDataTable,
  6. NForm,
  7. NFormItem,
  8. NImage,
  9. NModal,
  10. NSelect,
  11. NSpace
  12. } from 'naive-ui';
  13. import SearchInput from '@/components/searchInput';
  14. import CSelect from '@/components/CSelect';
  15. import Pagination from '@/components/pagination';
  16. import { getWorkDetail, getTrainingStudentList } from '../api';
  17. import add from './images/add.png';
  18. import { useRoute } from 'vue-router';
  19. import CBreadcrumb from '/src/components/CBreadcrumb';
  20. import CDatePicker from '/src/components/CDatePicker';
  21. import defultHeade from '@/components/layout/images/teacherIcon.png';
  22. import {
  23. getNowDateAndMonday,
  24. getNowDateAndSunday,
  25. getTimes
  26. } from '/src/utils/dateFormat';
  27. import { trainingStatusArray } from '@/utils/searchArray';
  28. import TrainingDetails from '../modals/TrainingDetails';
  29. import dayjs from 'dayjs';
  30. import { lookup } from 'dns';
  31. import TheEmpty from '/src/components/TheEmpty';
  32. export default defineComponent({
  33. name: 'student-studentList',
  34. setup(props, { emit }) {
  35. const state = reactive({
  36. searchForm: { keyword: '', trainingStatus: '' as any },
  37. loading: false,
  38. pagination: {
  39. page: 1,
  40. rows: 10,
  41. pageTotal: 4
  42. },
  43. tableList: [] as any,
  44. workInfo: {
  45. createTime: '',
  46. expireDate: '',
  47. teacherAvatar: '',
  48. teacherName: ''
  49. },
  50. detailVisiable: false,
  51. activeRow: null as any,
  52. index: 0
  53. });
  54. const timer = ref<[number, number]>([
  55. getNowDateAndMonday(new Date().getTime()),
  56. getNowDateAndSunday(new Date().getTime())
  57. ]);
  58. const TrainingDetailsRef = ref();
  59. const route = useRoute();
  60. const routerList = ref([
  61. { name: '班级管理', path: '/classList' },
  62. { name: route.query.name, path: '/classDetail' },
  63. { name: route.query.teacherName, path: '/afterWorkDetail' }
  64. ] as any);
  65. const search = () => {
  66. state.pagination.page = 1;
  67. getList();
  68. console.log('search', state);
  69. };
  70. const onReset = () => {
  71. state.searchForm = { keyword: '', trainingStatus: '' as any };
  72. timer.value = [
  73. getNowDateAndMonday(new Date().getTime()),
  74. getNowDateAndSunday(new Date().getTime())
  75. ];
  76. search();
  77. };
  78. const getList = async () => {
  79. state.loading = true;
  80. try {
  81. console.log(route.query, 'route.query');
  82. const res = await getTrainingStudentList({
  83. classGroupId: route.query.classGroupId || '',
  84. trainingId: route.query.trainingId,
  85. ...state.searchForm,
  86. ...state.pagination
  87. // ...getTimes(timer.value, ['startTime', 'endTime'], 'YYYY-MM-DD')
  88. });
  89. state.tableList = res.data.rows;
  90. state.pagination.pageTotal = res.data.total;
  91. state.loading = false;
  92. } catch (e) {
  93. state.loading = false;
  94. console.log(e);
  95. }
  96. };
  97. const getWorkInfo = async () => {
  98. try {
  99. const res = await getWorkDetail({ trainingId: route.query.trainingId });
  100. state.workInfo = { ...res.data };
  101. } catch (e) {
  102. console.log(e);
  103. }
  104. };
  105. const lookDetail = (row: any, index: number) => {
  106. console.log(index, 'index');
  107. state.index = index + 1;
  108. state.activeRow = row;
  109. state.detailVisiable = true;
  110. };
  111. onMounted(() => {
  112. getWorkInfo();
  113. getList();
  114. });
  115. const columns = () => {
  116. return [
  117. {
  118. title: '学生姓名',
  119. key: 'studentName'
  120. },
  121. {
  122. title: '最后提交时间',
  123. key: 'submitTime',
  124. render(row: any) {
  125. return row.submitTime
  126. ? dayjs(row.submitTime).format('YYYY-MM-DD')
  127. : '--';
  128. }
  129. },
  130. {
  131. title: '作业状态',
  132. key: 'sex',
  133. render(row: any) {
  134. return (
  135. <div>
  136. {row.trainingStatus == 'UNSUBMITTED' ? (
  137. <p class={styles.nosub}>未提交</p>
  138. ) : null}
  139. {row.trainingStatus == 'SUBMITTED' ? (
  140. <p class={styles.ison}>不合格</p>
  141. ) : null}
  142. {row.trainingStatus == 'TARGET' ? (
  143. <p class={styles.isok}>合格</p>
  144. ) : null}
  145. </div>
  146. );
  147. }
  148. },
  149. {
  150. title: '操作',
  151. key: 'id',
  152. render(row: any, index: number) {
  153. return (
  154. <NButton
  155. text
  156. type="primary"
  157. onClick={() => {
  158. lookDetail(row, index);
  159. }}>
  160. 详情
  161. </NButton>
  162. );
  163. }
  164. }
  165. ];
  166. };
  167. const goToNext = () => {
  168. ++state.index;
  169. state.activeRow = state.tableList[state.index - 1];
  170. TrainingDetailsRef.value.getTrainingDetail(
  171. state.activeRow.studentLessonTrainingId
  172. );
  173. };
  174. const gotoPre = () => {
  175. --state.index;
  176. state.activeRow = state.tableList[state.index - 1];
  177. TrainingDetailsRef.value.getTrainingDetail(
  178. state.activeRow.studentLessonTrainingId
  179. );
  180. };
  181. return () => (
  182. <div>
  183. <CBreadcrumb list={routerList.value}></CBreadcrumb>
  184. <div class={styles.listWrap}>
  185. <div class={styles.teacherList}>
  186. <div class={styles.teacherHeader}>
  187. <div class={styles.teacherHeaderBorder}>
  188. <NImage
  189. class={styles.teacherHeaderImg}
  190. src={
  191. state.workInfo.teacherAvatar
  192. ? state.workInfo.teacherAvatar
  193. : defultHeade
  194. }
  195. previewDisabled></NImage>
  196. </div>
  197. </div>
  198. <div class={styles.workafterInfo}>
  199. <h4>{state.workInfo.teacherName}</h4>
  200. <p>
  201. 布置时间:
  202. {state.workInfo.createTime
  203. ? dayjs(state.workInfo.createTime).format('YYYY-MM-DD')
  204. : '--'}{' '}
  205. |{' '}
  206. <span>
  207. 截止时间:
  208. {state.workInfo.expireDate
  209. ? dayjs(state.workInfo.expireDate).format('YYYY-MM-DD')
  210. : '--'}
  211. </span>
  212. </p>
  213. </div>
  214. </div>
  215. <div class={styles.searchList}>
  216. <NForm label-placement="left" inline>
  217. <NFormItem>
  218. <SearchInput
  219. {...{ placeholder: '请输入学生姓名' }}
  220. class={styles.searchInput}
  221. searchWord={state.searchForm.keyword}
  222. onChangeValue={(val: string) =>
  223. (state.searchForm.keyword = val)
  224. }></SearchInput>
  225. </NFormItem>
  226. <NFormItem>
  227. <CSelect
  228. {...({
  229. options: [
  230. {
  231. label: '全部状态',
  232. value: ''
  233. },
  234. ...trainingStatusArray
  235. ],
  236. placeholder: '作业状态',
  237. clearable: true,
  238. inline: true
  239. } as any)}
  240. v-model:value={state.searchForm.trainingStatus}></CSelect>
  241. </NFormItem>
  242. {/* <NFormItem>
  243. <CDatePicker
  244. v-model:value={timer.value}
  245. separator={'至'}
  246. type="daterange"
  247. timerValue={timer.value}></CDatePicker>
  248. </NFormItem> */}
  249. <NFormItem>
  250. <NSpace justify="end">
  251. <NButton type="primary" class="searchBtn" onClick={search}>
  252. 搜索
  253. </NButton>
  254. <NButton
  255. type="primary"
  256. ghost
  257. class="resetBtn"
  258. onClick={onReset}>
  259. 重置
  260. </NButton>
  261. </NSpace>
  262. </NFormItem>
  263. </NForm>
  264. </div>
  265. {/* <NButton
  266. class={styles.addBtn}
  267. type="primary"
  268. v-slots={{
  269. icon: () => (
  270. <>
  271. <NImage class={styles.addBtnIcon} src={add}></NImage>
  272. </>
  273. )
  274. }}>
  275. 新增学生
  276. </NButton> */}
  277. <div class={styles.tableWrap}>
  278. <NDataTable
  279. v-slots={{
  280. empty: () => <TheEmpty></TheEmpty>
  281. }}
  282. class={styles.classTable}
  283. loading={state.loading}
  284. columns={columns()}
  285. data={state.tableList}></NDataTable>
  286. <Pagination
  287. v-model:page={state.pagination.page}
  288. v-model:pageSize={state.pagination.rows}
  289. v-model:pageTotal={state.pagination.pageTotal}
  290. onList={getList}
  291. sync
  292. />
  293. </div>
  294. </div>
  295. <NModal
  296. v-model:show={state.detailVisiable}
  297. preset="card"
  298. class={['modalTitle background', styles.wordDetailModel]}
  299. title={'作业详情'}>
  300. <TrainingDetails
  301. onNext={() => goToNext()}
  302. onPre={() => gotoPre()}
  303. ref={TrainingDetailsRef}
  304. onClose={() => (state.detailVisiable = false)}
  305. total={state.tableList.length}
  306. current={state.index}
  307. activeRow={state.activeRow}></TrainingDetails>
  308. </NModal>
  309. </div>
  310. );
  311. }
  312. });