| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272 |
- import { defineComponent, onMounted, reactive, ref } from 'vue';
- import styles from './index.module.less';
- import MSticky from '@/components/m-sticky';
- import MHeader from '@/components/m-header';
- import MSearch from '@/components/m-search';
- import SkeletonModal from './skeleton-modal';
- import { Cell, CellGroup, DropdownItem, DropdownMenu, Image, List } from 'vant';
- import { useRouter } from 'vue-router';
- import MFullRefresh from '@/components/m-full-refresh';
- import request from '@/helpers/request';
- import iconTeacher from '@/common/images/icon-student-default.png';
- import MEmpty from '@/components/m-empty';
- import { coursesType } from '@/helpers/constant';
- import DropDownModal from './drop-down-modal';
- import dayjs from 'dayjs';
- import DropDownMoreModal from './drop-down-more-modal';
- export default defineComponent({
- name: 'student-leave-record',
- setup() {
- const dropDownItemRef = ref();
- const dropDownItemRef1 = ref();
- const router = useRouter();
- const forms = reactive({
- listState: {
- loading: true,
- dataShow: true,
- finished: false,
- refreshing: false
- },
- isClick: false,
- params: {
- createTime: [dayjs().format('YYYY'), dayjs().format('MM')],
- musicGroupIds: '',
- classGroupType: '',
- courseScheduleType: '',
- search: '',
- page: 1,
- rows: 20
- },
- orchestraColumns: [] as any,
- list: []
- });
- const onDropDownClose = (item: any) => {
- item.value && item.value.toggle();
- };
- const getList = async () => {
- try {
- if (forms.isClick) return;
- forms.isClick = true;
- const { createTime, ...res } = forms.params;
- const startTime = createTime.join('-') + '-01';
- const endTime = dayjs(startTime).endOf('month').format('YYYY-MM-DD');
- const { data } = await request.post(
- '/api-web/schoolStudentHomework/queryStudentLeave',
- {
- data: {
- ...res,
- startTime,
- endTime
- }
- }
- );
- const result = data || {};
- // 判断是否有数据
- if (forms.listState.refreshing) {
- forms.list = result.rows || [];
- } else {
- forms.list = forms.list.concat(result.rows || []);
- }
- forms.listState.finished = result.pageNo >= result.totalPage;
- forms.params.page = result.pageNo + 1;
- } catch {
- // forms.listState.finished = true;
- } finally {
- forms.listState.dataShow = forms.list.length > 0;
- forms.listState.refreshing = false;
- forms.listState.loading = false;
- forms.isClick = false;
- }
- };
- const formatTime = (time: string) => {
- if (!time) {
- return '';
- }
- return time.substring(0, 5);
- };
- const onRefresh = () => {
- forms.params.page = 1;
- getList();
- };
- // 乐团列表
- const musicGroupPage = async () => {
- try {
- const { data } = await request.get(
- '/api-web/cooperationOrgan/musicGroupPage'
- );
- (data || []).forEach((item: any) => {
- forms.orchestraColumns.push({
- text: item.name,
- value: item.id
- });
- });
- } catch {
- //
- }
- };
- onMounted(() => {
- musicGroupPage();
- getList();
- });
- return () => (
- <div class={styles.studentLeaveRecord}>
- <MSticky position="top">
- <MHeader />
- <MSearch
- placeholder="请输入学员姓名/手机号"
- onSearch={(val: string) => {
- forms.params.search = val;
- forms.listState.dataShow = true;
- forms.listState.refreshing = true;
- forms.list = [];
- onRefresh();
- }}
- />
- <DropdownMenu>
- <DropdownItem
- ref={dropDownItemRef}
- title={forms.params.createTime.join('-')}>
- <DropDownModal
- selectValues={forms.params.createTime}
- open={dropDownItemRef.value.state.showPopup}
- onDropDownClose={() => onDropDownClose(dropDownItemRef)}
- onDropDownConfirm={(values: any) => {
- forms.params.createTime = values;
- onDropDownClose(dropDownItemRef);
- forms.listState.dataShow = true;
- forms.listState.refreshing = true;
- forms.list = [];
- onRefresh();
- }}
- />
- </DropdownItem>
- <DropdownItem ref={dropDownItemRef1} title={'筛选'}>
- <DropDownMoreModal
- selectValues={{
- musicGroupIds: forms.params.musicGroupIds,
- classGroupType: forms.params.classGroupType,
- courseScheduleType: forms.params.courseScheduleType
- }}
- columns={forms.orchestraColumns}
- open={dropDownItemRef1.value.state.showPopup}
- onDropDownClose={() => onDropDownClose(dropDownItemRef1)}
- onDropDownConfirm={(values: any) => {
- forms.params.musicGroupIds = values.musicGroupIds;
- forms.params.classGroupType = values.classGroupType;
- forms.params.courseScheduleType = values.courseScheduleType;
- onDropDownClose(dropDownItemRef1);
- forms.listState.refreshing = true;
- forms.listState.dataShow = true;
- forms.list = [];
- onRefresh();
- }}
- />
- </DropdownItem>
- </DropdownMenu>
- </MSticky>
- <SkeletonModal v-model:show={forms.listState.loading}>
- <MFullRefresh
- v-model:modelValue={forms.listState.refreshing}
- onRefresh={() => onRefresh()}
- style={{
- minHeight: `calc(100vh - var(--header-height))`
- }}>
- <List
- finished={forms.listState.finished}
- finishedText=" "
- style={{ overflow: 'hidden' }}
- onLoad={getList}
- immediateCheck={false}>
- <div class={styles.cellGroup}>
- {forms.listState.dataShow ? (
- forms.list.map((item: any) => (
- <CellGroup class={styles.cellGroupIn}>
- <Cell center clickable={false} class={styles.cell}>
- {{
- icon: () => (
- <Image
- src={item.avatar || iconTeacher}
- fit="cover"
- class={styles.iconTeacher}
- />
- ),
- title: () => (
- <div class={styles.username}>
- <p class={styles.name}>
- {coursesType[item.courseScheduleType]}·
- {item.classGroupName}
- </p>
- <p class={styles.class}>
- <span class={styles.userName}>
- {item.username}
- </span>
- {item.phone && <span>{item.phone}</span>}
- </p>
- </div>
- )
- }}
- </Cell>
- <Cell
- center
- clickable={false}
- class={styles.cell}
- titleClass={styles.cellInfo}>
- {{
- title: () => (
- <div class={styles.info}>
- <div class={[styles.times, styles.time1]}>
- <span class={styles.title}>课程时间</span>
- <span>
- {item.classDate}{' '}
- {formatTime(item.endClassTime)}-
- {formatTime(item.startClassTime)}
- </span>
- </div>
- <div class={[styles.times]}>
- <span class={styles.title}>提交时间</span>
- <span>{item.leaveTime}</span>
- </div>
- {item.remark && (
- <div class={styles.remark}>
- <div class={styles.remarkTitle}>请假事由</div>
- <p>{item.remark}</p>
- </div>
- )}
- </div>
- )
- }}
- </Cell>
- </CellGroup>
- ))
- ) : (
- <MEmpty
- style={{
- minHeight: `calc(100vh - var(--header-height))`
- }}
- description="暂无学员请假统计"
- />
- )}
- </div>
- </List>
- </MFullRefresh>
- </SkeletonModal>
- </div>
- );
- }
- });
|