teacher.tsx 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. import { Cell, Icon, Image, Skeleton, SkeletonParagraph } from 'vant';
  2. import { defineComponent, onMounted, reactive } from 'vue';
  3. import styles from './component.module.less';
  4. import iconTeacher from '@/common/images/icon-teacher-default.png';
  5. import iconSuccess from '@/common/images/icon-check-active.png';
  6. import iconWarn from '@/common/images/icon-warn.png';
  7. import { useRoute, useRouter } from 'vue-router';
  8. import dayjs from 'dayjs';
  9. import request from '@/helpers/request';
  10. export default defineComponent({
  11. name: 'teacher-list',
  12. setup() {
  13. const route = useRoute();
  14. const router = useRouter();
  15. const forms = reactive({
  16. courseId: route.query.courseId,
  17. teacherId: route.query.teacherId,
  18. detail: {} as any,
  19. loading: true
  20. });
  21. // schoolTeacherAttendance/getCourseTeacherAttendance
  22. const onAddressGps = (item: any) => {
  23. //
  24. router.push({
  25. path: '/amap-gps',
  26. query: {
  27. sLngLat: item.schoolLongitudeLatitude, // 教学点
  28. inLngLat: item.signInLongitudeLatitude, // 签到
  29. outLngLat: item.signOutLongitudeLatitude // 签退
  30. }
  31. });
  32. };
  33. const getList = async () => {
  34. try {
  35. const { data } = await request.get(
  36. '/api-web/schoolTeacherAttendance/getCourseTeacherAttendance',
  37. {
  38. params: {
  39. courseId: forms.courseId,
  40. teacherId: forms.teacherId
  41. }
  42. }
  43. );
  44. forms.detail = data || {};
  45. } catch {
  46. //
  47. } finally {
  48. forms.loading = false;
  49. }
  50. };
  51. onMounted(() => {
  52. getList();
  53. });
  54. return () => (
  55. <div class={styles['teacher-list']}>
  56. <Skeleton loading={forms.loading}>
  57. {{
  58. template: () => (
  59. <div class={styles.skeletonGroup}>
  60. <SkeletonParagraph
  61. class={styles.skeletonItem}
  62. rowWidth={'50%'}
  63. />
  64. <SkeletonParagraph
  65. class={styles.skeletonItem}
  66. rowWidth={'50%'}
  67. />
  68. <SkeletonParagraph
  69. class={styles.skeletonItem}
  70. rowWidth={'50%'}
  71. />
  72. <SkeletonParagraph
  73. class={styles.skeletonItem}
  74. rowWidth={'50%'}
  75. />
  76. </div>
  77. ),
  78. default: () => (
  79. <Cell center>
  80. <div class={styles.detailGroup}>
  81. <div class={styles.detailItem}>
  82. <div class={styles.detailStatus}>
  83. <span
  84. class={[
  85. styles.statusName,
  86. forms.detail.signInStatus ? '' : styles.error
  87. ]}>
  88. {forms.detail.signInStatus ? '正常' : '异常'}
  89. </span>
  90. <img
  91. src={forms.detail.signInStatus ? iconSuccess : iconWarn}
  92. class={styles.img}
  93. />
  94. </div>
  95. <div class={styles.sign}>
  96. <span class={styles.signTime}>
  97. 签到时间{' '}
  98. {forms.detail.signInTime
  99. ? dayjs(forms.detail.signInTime).format('HH:mm:ss')
  100. : '--'}
  101. </span>
  102. </div>
  103. </div>
  104. {forms.detail.teachMode === 'OFFLINE' ? (
  105. <div class={styles.detailItem}>
  106. <div class={styles.detailStatus}>
  107. <span
  108. class={[
  109. styles.statusName,
  110. forms.detail.signInAddressStatus ? '' : styles.error
  111. ]}>
  112. {forms.detail.signInAddressStatus ? '正常' : '异常'}
  113. </span>
  114. <img
  115. src={
  116. forms.detail.signInAddressStatus
  117. ? iconSuccess
  118. : iconWarn
  119. }
  120. class={styles.img}
  121. />
  122. </div>
  123. <div class={styles.sign}>
  124. <span class={styles.signTime}>签到地点</span>
  125. <span
  126. class={styles.locate}
  127. onClick={() => onAddressGps(forms.detail)}>
  128. 查看定位
  129. <Icon name="arrow" class={styles.iconArrow} />
  130. </span>
  131. </div>
  132. </div>
  133. ) : (
  134. ''
  135. )}
  136. <div class={styles.detailItem}>
  137. <div class={styles.detailStatus}>
  138. <span
  139. class={[
  140. styles.statusName,
  141. forms.detail.signOutStatus ? '' : styles.error
  142. ]}>
  143. {forms.detail.signOutStatus ? '正常' : '异常'}
  144. </span>
  145. <img
  146. src={
  147. forms.detail.signOutStatus ? iconSuccess : iconWarn
  148. }
  149. class={styles.img}
  150. />
  151. </div>
  152. <div class={styles.sign}>
  153. <span class={styles.signTime}>
  154. 签退时间{' '}
  155. {forms.detail.signOutTime
  156. ? dayjs(forms.detail.signOutTime).format('HH:mm:ss')
  157. : '--'}
  158. </span>
  159. </div>
  160. </div>
  161. {forms.detail.teachMode === 'OFFLINE' ? (
  162. <div class={styles.detailItem}>
  163. <div class={styles.detailStatus}>
  164. <span
  165. class={[
  166. styles.statusName,
  167. forms.detail.signOutAddressStatus
  168. ? ''
  169. : styles.error
  170. ]}>
  171. {forms.detail.signOutAddressStatus ? '正常' : '异常'}
  172. </span>
  173. <img
  174. src={
  175. forms.detail.signOutAddressStatus
  176. ? iconSuccess
  177. : iconWarn
  178. }
  179. class={styles.img}
  180. />
  181. </div>
  182. <div class={styles.sign}>
  183. <span class={styles.signTime}>签到地点</span>
  184. <span
  185. class={styles.locate}
  186. onClick={() => onAddressGps(forms.detail)}>
  187. 查看定位
  188. <Icon name="arrow" class={styles.iconArrow} />
  189. </span>
  190. </div>
  191. </div>
  192. ) : (
  193. ''
  194. )}
  195. </div>
  196. </Cell>
  197. )
  198. }}
  199. </Skeleton>
  200. </div>
  201. );
  202. }
  203. });