classRecord.tsx 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. import { defineComponent, onMounted, reactive } from 'vue';
  2. import { NAvatar, NButton, NForm, NFormItem, NSpace, NTag } from 'naive-ui';
  3. import Pagination from '@/components/pagination';
  4. import { courseSchedulePage } from '../api';
  5. import { useRoute } from 'vue-router';
  6. import CDatePicker from '/src/components/CDatePicker';
  7. import styles from './classRecord.module.less';
  8. import teacherIcon from '@components/layout/images/teacherIcon.png';
  9. import dayjs from 'dayjs';
  10. import { getTimes } from '/src/utils';
  11. import TheEmpty from '/src/components/TheEmpty';
  12. import CSelect from '/src/components/CSelect';
  13. import { api_teacherPage } from '../../setting/api';
  14. import { useUserStore } from '/src/store/modules/users';
  15. import { initCache, setCache } from '/src/hooks/use-async';
  16. export default defineComponent({
  17. name: 'class-record',
  18. setup() {
  19. const user = useUserStore();
  20. const route = useRoute();
  21. const formatDefaultTime = () => {
  22. const gradeYear: any = route.query.gradeYear;
  23. if (gradeYear) {
  24. const yearStr = `${gradeYear}-9-1`;
  25. const yearStrEnd = `${Number(gradeYear) + 1}-8-31`;
  26. return [dayjs(yearStr).valueOf(), dayjs(yearStrEnd).valueOf()];
  27. } else {
  28. const nowTime = dayjs().format('YYYY-MM-DD');
  29. return [
  30. dayjs(nowTime).subtract(1, 'month').valueOf(),
  31. dayjs(nowTime).valueOf()
  32. ];
  33. }
  34. };
  35. const state = reactive({
  36. searchForm: {
  37. teacherId: '',
  38. createTimer: formatDefaultTime() as any
  39. },
  40. teacherList: [],
  41. loading: false,
  42. pagination: {
  43. page: 1,
  44. rows: 12,
  45. pageTotal: 0
  46. },
  47. tableList: [] as any
  48. });
  49. const search = () => {
  50. state.pagination.page = 1;
  51. getList();
  52. setCache({
  53. current: state.searchForm,
  54. saveKey: 'classDetailRecord'
  55. });
  56. };
  57. const onReset = () => {
  58. state.searchForm = {
  59. teacherId: '',
  60. createTimer: formatDefaultTime() as any
  61. };
  62. search();
  63. setCache({
  64. current: state.searchForm,
  65. saveKey: 'classDetailRecord'
  66. });
  67. };
  68. initCache({
  69. current: state.searchForm,
  70. saveKey: 'classDetailRecord',
  71. callBack: (active: any) => {
  72. state.searchForm = active;
  73. }
  74. });
  75. const getList = async () => {
  76. state.loading = true;
  77. try {
  78. const { data } = await courseSchedulePage({
  79. classGroupId: route.query.id,
  80. teacherId: state.searchForm.teacherId,
  81. ...getTimes(
  82. state.searchForm.createTimer,
  83. ['startTime', 'endTime'],
  84. 'YYYY-MM-DD'
  85. ),
  86. ...state.pagination
  87. });
  88. const rows = data.rows || [];
  89. rows.forEach((row: any) => {
  90. row.lessonCourseware = row.lessonCoursewareJson
  91. ? JSON.parse(row.lessonCoursewareJson)
  92. : {};
  93. });
  94. state.tableList = rows;
  95. state.pagination.pageTotal = data.total;
  96. state.loading = false;
  97. } catch (e) {
  98. state.loading = false;
  99. }
  100. };
  101. const getTeachers = async () => {
  102. try {
  103. const { data } = await api_teacherPage({
  104. schoolId: user.info.schoolInfos?.[0]?.id,
  105. page: 1,
  106. rows: 1000
  107. });
  108. const tempList = data.rows || [];
  109. const tempT = [] as any;
  110. tempList.forEach((item: any) => {
  111. tempT.push({
  112. label: item.nickname,
  113. value: item.id
  114. });
  115. });
  116. state.teacherList = tempT;
  117. } catch {
  118. //
  119. }
  120. };
  121. onMounted(() => {
  122. getTeachers();
  123. getList();
  124. });
  125. return () => (
  126. <div>
  127. <div class={styles.searchList}>
  128. <NForm label-placement="left" inline>
  129. <NFormItem>
  130. <CSelect
  131. {...({
  132. options: [
  133. {
  134. label: '全部老师',
  135. value: ''
  136. },
  137. ...state.teacherList
  138. ],
  139. placeholder: '全部老师',
  140. clearable: true,
  141. inline: true
  142. } as any)}
  143. v-model:value={state.searchForm.teacherId}></CSelect>
  144. </NFormItem>
  145. <NFormItem>
  146. <CDatePicker
  147. v-model:value={state.searchForm.createTimer}
  148. timerValue={state.searchForm.createTimer}
  149. separator={'至'}
  150. type="daterange"></CDatePicker>
  151. </NFormItem>
  152. <NFormItem>
  153. <NSpace justify="end">
  154. <NButton type="primary" class="searchBtn" onClick={search}>
  155. 搜索
  156. </NButton>
  157. <NButton
  158. type="primary"
  159. ghost
  160. class="resetBtn"
  161. onClick={onReset}>
  162. 重置
  163. </NButton>
  164. </NSpace>
  165. </NFormItem>
  166. </NForm>
  167. </div>
  168. <div class={styles.tableWrap}>
  169. <NSpace class={styles.tableSpace}>
  170. {state.tableList.map((item: any) => (
  171. <div class={styles.tableContainer}>
  172. <div class={styles.header}>
  173. <div class={styles.time}>
  174. {dayjs(item.startTime).format('YYYY-MM-DD HH:mm')}
  175. </div>
  176. {route.query.name && (
  177. <NTag type="primary" class={styles.ntag} strong>
  178. {route.query.name}
  179. </NTag>
  180. )}
  181. </div>
  182. <div class={styles.content}>
  183. <NAvatar
  184. class={styles.navatar}
  185. round
  186. src={item.teacherAvatar || teacherIcon}
  187. />
  188. <div class={styles.userInfo}>
  189. <h2>{item.teacherName}</h2>
  190. <p>
  191. {item.subjectName && (
  192. <span class={styles.subjectName}>
  193. {item.subjectName}
  194. </span>
  195. )}
  196. {item.lessonCourseware.lessonCoursewareName} |{' '}
  197. {item.lessonCourseware.lessonCoursewareDetailName}|{' '}
  198. {
  199. item.lessonCourseware
  200. .lessonCoursewareKnowledgeDetailName
  201. }
  202. | {item.useChapterLessonCoursewareName}
  203. </p>
  204. </div>
  205. </div>
  206. </div>
  207. ))}
  208. </NSpace>
  209. {state.tableList.length > 0 && (
  210. <Pagination
  211. v-model:page={state.pagination.page}
  212. v-model:pageSize={state.pagination.rows}
  213. v-model:pageTotal={state.pagination.pageTotal}
  214. onList={getList}
  215. pageSizes={[12, 24, 36, 48]}
  216. sync
  217. saveKey="classRecord-key"
  218. />
  219. )}
  220. {state.tableList.length <= 0 && <TheEmpty class={styles.nowEmpty} />}
  221. </div>
  222. </div>
  223. );
  224. }
  225. });