classRecord.tsx 6.6 KB

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