unit-student-list.tsx 7.0 KB

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