unit-student-list.tsx 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. import {
  2. ActionSheet,
  3. Button,
  4. Cell,
  5. CellGroup,
  6. Radio,
  7. CheckboxGroup,
  8. Icon,
  9. Image,
  10. List,
  11. RadioGroup,
  12. Tag
  13. } from 'vant'
  14. import { defineComponent, onMounted, reactive } from 'vue'
  15. import styles from './unit-student.module.less'
  16. import iconEdit from '../../images/icon-edit.png'
  17. import iconMessage from '@common/images/icon-muit-message.png'
  18. import iconTeacher from '@common/images/icon_teacher.png'
  19. import { postMessage } from '@/helpers/native-message'
  20. import { useRoute, useRouter } from 'vue-router'
  21. import OEmpty from '@/components/o-empty'
  22. import OFullRefresh from '@/components/o-full-refresh'
  23. import dayjs from 'dayjs'
  24. import request from '@/helpers/request'
  25. import { unitTestStatus } from '@/constant'
  26. export default defineComponent({
  27. name: 'unit-student-list',
  28. props: {
  29. type: {
  30. type: Number,
  31. default: 1
  32. }
  33. },
  34. setup(props) {
  35. const router = useRouter()
  36. const route = useRoute()
  37. const searchList = reactive({
  38. classGroupUnitExaminationId: route.query.id,
  39. status: '',
  40. page: 1
  41. })
  42. const form = reactive({
  43. list: [],
  44. listState: {
  45. dataShow: true, // 判断是否有数据
  46. loading: false,
  47. finished: false,
  48. refreshing: false,
  49. height: 0 // 页面头部高度,为了处理下拉刷新用的
  50. },
  51. oldValue: ''
  52. })
  53. const gotoMsg = () => {
  54. postMessage({
  55. api: 'joinChatGroup',
  56. content: {
  57. type: 'multi', // single 单人 multi 多人
  58. id: props.item?.imGroupId
  59. }
  60. })
  61. }
  62. onMounted(() => {
  63. getList()
  64. })
  65. const getList = async () => {
  66. try {
  67. const res = await request.post('/api-teacher/studentUnitExamination/studentDetail', {
  68. data: {
  69. ...searchList
  70. },
  71. requestType: 'form'
  72. })
  73. form.listState.loading = false
  74. form.listState.refreshing = false
  75. const result = res.data || {}
  76. // 处理重复请求数据
  77. if (form.list.length > 0 && result.current === 1) {
  78. return
  79. }
  80. form.list = form.list = result[1] || []
  81. // form.listState.finished = result.current >= result.pages
  82. // searchList.page = result.current + 1
  83. form.listState.dataShow = form.list.length > 0
  84. form.listState.finished = true
  85. } catch {
  86. form.listState.dataShow = false
  87. form.listState.finished = true
  88. // form.listState.refreshing = false
  89. }
  90. }
  91. const onSearch = () => {
  92. searchList.page = 1
  93. form.list = []
  94. form.listState.dataShow = true // 判断是否有数据
  95. form.listState.loading = false
  96. form.listState.finished = false
  97. getList()
  98. }
  99. const chisoStudent = (val) => {
  100. getList()
  101. }
  102. const checkRadio = (val) => {
  103. if (val == form.oldValue) {
  104. searchList.status = ''
  105. form.oldValue = ''
  106. } else {
  107. form.oldValue = val
  108. }
  109. }
  110. return () => (
  111. <div class={styles.unitList}>
  112. <RadioGroup
  113. checked-color="#FF8057"
  114. v-model={searchList.status}
  115. direction="horizontal"
  116. onChange={chisoStudent}
  117. >
  118. <Tag
  119. size="large"
  120. type="primary"
  121. color={searchList.status !== 'A_PASS' ? '#EAEAEA' : '#FF8057'}
  122. textColor={searchList.status !== 'A_PASS' ? '#AAA' : '#FFF'}
  123. class={styles.radioSection}
  124. >
  125. <Radio
  126. class={styles.radioItem}
  127. name={'A_PASS'}
  128. onClick={() => checkRadio('A_PASS')}
  129. ></Radio>
  130. {unitTestStatus['A_PASS']}
  131. </Tag>
  132. <Tag
  133. size="large"
  134. type="primary"
  135. color={searchList.status !== 'B_NO_PASS' ? '#EAEAEA' : '#FF8057'}
  136. textColor={searchList.status !== 'B_NO_PASS' ? '#AAA' : '#FFF'}
  137. class={styles.radioSection}
  138. >
  139. <Radio
  140. class={styles.radioItem}
  141. name={'B_NO_PASS'}
  142. onClick={() => checkRadio('B_NO_PASS')}
  143. ></Radio>{' '}
  144. {unitTestStatus['B_NO_PASS']}
  145. </Tag>
  146. <Tag
  147. size="large"
  148. type="primary"
  149. color={searchList.status !== 'C_ING' ? '#EAEAEA' : '#FF8057'}
  150. textColor={searchList.status !== 'C_ING' ? '#AAA' : '#FFF'}
  151. class={styles.radioSection}
  152. >
  153. <Radio
  154. class={styles.radioItem}
  155. name={'C_ING'}
  156. onClick={() => checkRadio('C_ING')}
  157. ></Radio>{' '}
  158. {unitTestStatus['C_ING']}
  159. </Tag>
  160. <Tag
  161. size="large"
  162. type="primary"
  163. color={searchList.status !== 'D_NO_SUBMIT' ? '#EAEAEA' : '#FF8057'}
  164. textColor={searchList.status !== 'D_NO_SUBMIT' ? '#AAA' : '#FFF'}
  165. class={styles.radioSection}
  166. >
  167. <Radio
  168. class={styles.radioItem}
  169. name={'D_NO_SUBMIT'}
  170. onClick={() => checkRadio('D_NO_SUBMIT')}
  171. ></Radio>
  172. {unitTestStatus['D_NO_SUBMIT']}
  173. </Tag>
  174. </RadioGroup>
  175. {form.listState.dataShow ? (
  176. <OFullRefresh
  177. v-model:modelValue={form.listState.refreshing}
  178. onRefresh={onSearch}
  179. style={{
  180. minHeight: `calc(100vh - ${form.listState.height}px)`
  181. }}
  182. >
  183. <List
  184. v-model:loading={form.listState.loading}
  185. finished={form.listState.finished}
  186. finishedText=" "
  187. class={[styles.liveList]}
  188. immediateCheck={false}
  189. >
  190. {form.list.map((item: any) => (
  191. <Cell center class={styles.manageCell}>
  192. {{
  193. icon: () => (
  194. <Image class={styles.img} src={item.avatar ? item.avatar : iconTeacher} />
  195. ),
  196. title: () => (
  197. <div class={styles.content}>
  198. <div class={styles.TagWrap}>
  199. {' '}
  200. <p class={[styles.name, 'van-ellipsis']}>
  201. {item.studentName ? item.studentName : '--'}
  202. </p>
  203. <div class={[styles.studentTag]}>{unitTestStatus[item.status]}</div>
  204. </div>
  205. <p class={styles.phone}>{item.submitTime}</p>
  206. </div>
  207. )
  208. // value: () => (
  209. // <span class={[styles.status, item.status === 'LOCKED' ? styles.frozen : '']}>
  210. // {manageTeacherType[item.status]}
  211. // </span>
  212. // )
  213. }}
  214. </Cell>
  215. ))}
  216. </List>
  217. </OFullRefresh>
  218. ) : (
  219. <OEmpty btnStatus={false} tips="暂无学员" />
  220. )}
  221. </div>
  222. )
  223. }
  224. })