index.tsx 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. import OHeader from '@/components/o-header'
  2. import OSticky from '@/components/o-sticky'
  3. import {
  4. Button,
  5. Cell,
  6. CellGroup,
  7. Checkbox,
  8. CheckboxGroup,
  9. Grid,
  10. GridItem,
  11. Icon,
  12. Image,
  13. List,
  14. Picker,
  15. Popup,
  16. Tag
  17. } from 'vant'
  18. import { defineComponent, onMounted, reactive } from 'vue'
  19. import styles from './index.module.less'
  20. import iconTeacher from '@common/images/icon_teacher.png'
  21. import { state as baseState } from '@/state'
  22. import request from '@/helpers/request'
  23. import OEmpty from '@/components/o-empty'
  24. export default defineComponent({
  25. name: 'practice-class',
  26. emits: ['close', 'confirm'],
  27. setup(props, { slots, attrs, emit }) {
  28. const forms = reactive({
  29. showPopover: false,
  30. orchestraId: null as any,
  31. orchestraName: null as any,
  32. orchestraList: [] as any,
  33. list: [] as any,
  34. listState: {
  35. dataShow: true, // 判断是否有数据
  36. loading: false,
  37. finished: false
  38. },
  39. params: {
  40. type: null,
  41. page: 1,
  42. rows: 20
  43. },
  44. check: [] as any,
  45. checkboxRefs: [] as any
  46. })
  47. // 获取乐团列表
  48. const getOrchestras = async () => {
  49. try {
  50. const { data } = await request.post('/api-school/orchestra/page', {
  51. data: {
  52. page: 1,
  53. rows: 100,
  54. schoolId: baseState.user.data.school.id
  55. }
  56. })
  57. const temps = data.rows || []
  58. const s = [] as any
  59. temps.forEach((item: any) => {
  60. s.push({
  61. text: item.name,
  62. value: item.id
  63. })
  64. })
  65. forms.orchestraList = [...s]
  66. // 判断是否有乐团
  67. if (s.length > 0) {
  68. forms.orchestraId = s[0].value
  69. forms.orchestraName = s[0].text
  70. }
  71. } catch {
  72. //
  73. }
  74. }
  75. // 获取班级
  76. const getList = async () => {
  77. // 查询没有设置指导老师的班级
  78. try {
  79. const { data } = await request.post('/api-school/classGroup/page', {
  80. data: {
  81. page: 1,
  82. rows: 20,
  83. schoolId: baseState.user.data.school.id,
  84. orchestraId: forms.orchestraId
  85. // orchestraType: 'DELIVERY'
  86. }
  87. })
  88. // 班级数据
  89. forms.listState.loading = false
  90. const result = data || {}
  91. // 处理重复请求数据
  92. if (forms.list.length > 0 && result.current === 1) {
  93. return
  94. }
  95. forms.list = forms.list.concat(result.rows || [])
  96. forms.listState.finished = result.current >= result.pages
  97. forms.params.page = result.current + 1
  98. forms.listState.dataShow = forms.list.length > 0
  99. } catch {
  100. forms.listState.dataShow = false
  101. forms.listState.finished = true
  102. }
  103. }
  104. const onSelect = (type: string) => {
  105. forms.checkboxRefs[type].toggle()
  106. }
  107. // 确定选择班级
  108. const onSubmit = () => {
  109. console.log(forms.check)
  110. emit('confirm', forms.check)
  111. emit('close')
  112. }
  113. onMounted(async () => {
  114. await getOrchestras()
  115. await getList()
  116. })
  117. return () => (
  118. <div class={styles.practiceClass}>
  119. <OSticky position="top">
  120. <OHeader title="选择班级" desotry={false} />
  121. <div style={{ padding: '12px 13px', background: '#f6f6f6' }}>
  122. <div class={styles.searchBand} onClick={() => (forms.showPopover = true)}>
  123. {forms.orchestraName} <Icon name={forms.showPopover ? 'arrow-up' : 'arrow-down'} />
  124. </div>
  125. </div>
  126. </OSticky>
  127. {forms.listState.dataShow ? (
  128. <List
  129. v-model:loading={forms.listState.loading}
  130. finished={forms.listState.finished}
  131. finishedText=" "
  132. class={[styles.liveList]}
  133. onLoad={getList}
  134. immediateCheck={false}
  135. >
  136. <CheckboxGroup class={[styles.gridContainer, styles.gridClass]} v-model={forms.check}>
  137. {forms.list.map((item: any) => (
  138. <CellGroup class={styles.classCellGroup} onClick={() => onSelect(item.id)}>
  139. <Cell center titleStyle={{ flex: '0 auto' }} valueClass={styles.classCheckbox}>
  140. {{
  141. icon: () => <Image src={iconTeacher} class={styles.img} />,
  142. title: () => (
  143. <div class={styles.content}>
  144. <div class={styles.teacherName}>
  145. {item.teacherName} <Tag type="primary">{item.name}</Tag>
  146. </div>
  147. <div class={styles.orchestraName}>{item.orchestraName}</div>
  148. </div>
  149. ),
  150. value: () => (
  151. <Checkbox
  152. name={item.id}
  153. ref={(el: any) => (forms.checkboxRefs[item.id] = el)}
  154. onClick={(e: any) => {
  155. e.stopPropagation()
  156. }}
  157. ></Checkbox>
  158. )
  159. }}
  160. </Cell>
  161. <Grid border={false} columnNum={3}>
  162. <GridItem>
  163. <p class={styles.title}>{item.preStudentNum}</p>
  164. <p class={styles.name}>学生人数</p>
  165. </GridItem>
  166. <GridItem>
  167. <p class={[styles.title]}>
  168. {item.courseScheduleNum - item.completeCourseScheduleNum}
  169. </p>
  170. <p class={styles.name}>剩余课时</p>
  171. </GridItem>
  172. <GridItem>
  173. <p class={styles.title}>{item.courseScheduleNum}</p>
  174. <p class={styles.name}>总课时</p>
  175. </GridItem>
  176. </Grid>
  177. </CellGroup>
  178. ))}
  179. </CheckboxGroup>
  180. </List>
  181. ) : (
  182. <OEmpty btnStatus={false} classImgSize="SMALL" tips="暂无班级" />
  183. )}
  184. <OSticky position="bottom">
  185. <div class={'btnGroup'}>
  186. <Button block round type="primary" onClick={onSubmit}>
  187. 确认
  188. </Button>
  189. </div>
  190. </OSticky>
  191. <Popup v-model:show={forms.showPopover} position="bottom" round>
  192. <Picker
  193. columns={forms.orchestraList}
  194. onCancel={() => (forms.showPopover = false)}
  195. onConfirm={(val: any) => {
  196. forms.orchestraId = val.selectedOptions[0].value
  197. forms.orchestraName = val.selectedOptions[0].text
  198. forms.showPopover = false
  199. forms.params.page = 1
  200. forms.list = []
  201. forms.listState.dataShow = true // 判断是否有数据
  202. forms.listState.loading = false
  203. forms.listState.finished = false
  204. getList()
  205. }}
  206. />
  207. </Popup>
  208. </div>
  209. )
  210. }
  211. })