|
@@ -0,0 +1,362 @@
|
|
|
+import { defineComponent, onMounted, reactive, ref } from 'vue';
|
|
|
+import styles from './index.module.less';
|
|
|
+import {
|
|
|
+ Cell,
|
|
|
+ CellGroup,
|
|
|
+ Col,
|
|
|
+ List,
|
|
|
+ Picker,
|
|
|
+ Popup,
|
|
|
+ Row,
|
|
|
+ Tab,
|
|
|
+ Tabs,
|
|
|
+ DatePicker
|
|
|
+} from 'vant';
|
|
|
+import MSticky from '@/components/m-sticky';
|
|
|
+// import icon1 from './images/icon1.png';
|
|
|
+// import icon2 from './images/icon2.png';
|
|
|
+// import icon3 from './images/icon3.png';
|
|
|
+// import icon4 from './images/icon4.png';
|
|
|
+// import iconTimer from './images/icon-timer.png';
|
|
|
+import personIcon from './images/personIcon.png';
|
|
|
+import homeIcon from './images/homeIcon.png';
|
|
|
+import sanIcon from './images/san.png';
|
|
|
+import request from '@/helpers/request';
|
|
|
+import topDot from './images/topDot.png';
|
|
|
+import { useRoute, useRouter } from 'vue-router';
|
|
|
+import { moneyFormat, numberFormat } from '@/helpers/utils';
|
|
|
+import OFullRefresh from '@/components/m-full-refresh';
|
|
|
+import OEmpty from '@/components/m-empty';
|
|
|
+import arrowIcon from './images/arrowIcon.png';
|
|
|
+import OHeader from '@/components/m-header';
|
|
|
+import OSearch from '@/components/m-search';
|
|
|
+import numeral from 'numeral';
|
|
|
+export default defineComponent({
|
|
|
+ name: 'tenant-apply-data',
|
|
|
+ setup() {
|
|
|
+ const route = useRoute();
|
|
|
+
|
|
|
+ const tabName = ref('all');
|
|
|
+ const forms = reactive({
|
|
|
+ keyword: '',
|
|
|
+ // id: route.query.id,
|
|
|
+ id: '1687275949971763202',
|
|
|
+ yearStatus: false,
|
|
|
+ schoolId: route.query.schoolId,
|
|
|
+ schoolName:route.query.schoolName,
|
|
|
+ year: [new Date().getFullYear()] as any,
|
|
|
+ yearName: new Date().getFullYear(),
|
|
|
+ classList: [] as any,
|
|
|
+ classStatus:false,
|
|
|
+ statObj: {
|
|
|
+ registerNum: 0,
|
|
|
+ schoolNum: 0
|
|
|
+ } as any,
|
|
|
+ perponStatus: false,
|
|
|
+ sortId: 'desc',
|
|
|
+ sortName: '人数降序',
|
|
|
+ sortList: [
|
|
|
+ { value: 'desc', text: '人数降序' },
|
|
|
+ { value: 'asc', text: '人数升序' }
|
|
|
+ ] as any,
|
|
|
+ page: 1,
|
|
|
+ rows: 20,
|
|
|
+ isClick: false
|
|
|
+ });
|
|
|
+
|
|
|
+ const refreshing = ref(false);
|
|
|
+ const loading = ref(true);
|
|
|
+ const finished = ref(false);
|
|
|
+ const showContact = ref(false);
|
|
|
+ const list = ref([]);
|
|
|
+
|
|
|
+ const getSchoolList = async () => {
|
|
|
+ try {
|
|
|
+ const { data } = await request.get('/edu-app/open/school/list', {
|
|
|
+ params: {
|
|
|
+ tenantId: forms.id
|
|
|
+ }
|
|
|
+ });
|
|
|
+ const temp = [
|
|
|
+ {
|
|
|
+ value: '',
|
|
|
+ text: '全部学校'
|
|
|
+ }
|
|
|
+ ];
|
|
|
+ if (Array.isArray(data)) {
|
|
|
+ data.forEach((item: any) => {
|
|
|
+ temp.push({
|
|
|
+ value: item.id,
|
|
|
+ text: item.name
|
|
|
+ });
|
|
|
+ });
|
|
|
+ forms.classList = temp;
|
|
|
+ }
|
|
|
+ } catch {
|
|
|
+ //
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ const getList = async () => {
|
|
|
+ if (forms.isClick) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ forms.isClick = true;
|
|
|
+ if (refreshing.value) {
|
|
|
+ list.value = [];
|
|
|
+ forms.page = 1;
|
|
|
+ refreshing.value = false;
|
|
|
+ }
|
|
|
+ try {
|
|
|
+ const res = await request.post(
|
|
|
+ '/edu-app/open/school/schoolRegisterUserPage',
|
|
|
+ {
|
|
|
+ data: {
|
|
|
+ tenantId: forms.id,
|
|
|
+ page: forms.page,
|
|
|
+ rows: forms.rows,
|
|
|
+ year: forms.yearName,
|
|
|
+ keyword: forms.keyword,
|
|
|
+ sort: forms.sortId,
|
|
|
+ schoolId:forms.schoolId
|
|
|
+ }
|
|
|
+ }
|
|
|
+ );
|
|
|
+
|
|
|
+ if (list.value.length > 0 && res.data.current === 1) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ list.value = list.value.concat(res.data.rows || []);
|
|
|
+ forms.page = res.data.current + 1;
|
|
|
+ showContact.value = list.value.length > 0;
|
|
|
+ loading.value = false;
|
|
|
+ finished.value = res.data.current >= res.data.pages;
|
|
|
+ } catch {
|
|
|
+ showContact.value = false;
|
|
|
+ finished.value = true;
|
|
|
+ } finally {
|
|
|
+ loading.value = false;
|
|
|
+ }
|
|
|
+ forms.isClick = false;
|
|
|
+ };
|
|
|
+ const onRefresh = () => {
|
|
|
+ finished.value = false;
|
|
|
+ // 重新加载数据
|
|
|
+ // 将 loading 设置为 true,表示处于加载状态
|
|
|
+ loading.value = true;
|
|
|
+ getList();
|
|
|
+ };
|
|
|
+
|
|
|
+ onMounted(async () => {
|
|
|
+ document.title = '学生报名统计';
|
|
|
+ // await getSchoolList();
|
|
|
+ await getStat();
|
|
|
+ await getList();
|
|
|
+ await getSchoolList()
|
|
|
+ });
|
|
|
+
|
|
|
+ const getStat = async () => {
|
|
|
+ try {
|
|
|
+ const { data } = await request.post(
|
|
|
+ '/edu-app/open/school/schoolRegisterStat',
|
|
|
+ {
|
|
|
+ data: {
|
|
|
+ tenantId: forms.id,
|
|
|
+ year: forms.yearName
|
|
|
+ }
|
|
|
+ }
|
|
|
+ );
|
|
|
+ forms.statObj = data;
|
|
|
+ } catch {
|
|
|
+ //
|
|
|
+ }
|
|
|
+ };
|
|
|
+ return () => (
|
|
|
+ <div class={styles.tenantAllData}>
|
|
|
+ <OHeader />
|
|
|
+ <div class={styles.topWrap}>
|
|
|
+ <div class={styles.topHeadSchool} onClick={()=>forms.classStatus= true}>
|
|
|
+
|
|
|
+ {forms.schoolName}
|
|
|
+ <img
|
|
|
+ src={sanIcon}
|
|
|
+ class={[styles.sanIcon, forms.classStatus ? styles.routeSan : '']}
|
|
|
+ alt=""
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ <div
|
|
|
+ class={styles.timerWrap}
|
|
|
+ onClick={() => {
|
|
|
+ forms.yearStatus = true;
|
|
|
+ }}>
|
|
|
+ {forms.yearName}年{' '}
|
|
|
+ <img
|
|
|
+ src={sanIcon}
|
|
|
+ class={[styles.sanIcon, forms.yearStatus ? styles.routeSan : '']}
|
|
|
+ alt=""
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class={styles.cardWrap}>
|
|
|
+ {/* <div class={[styles.schoolCard, styles.cardItem]}>
|
|
|
+ <div class={styles.cardNum}>
|
|
|
+ {' '}
|
|
|
+ {numeral(forms.statObj.schoolNum).format('0,0')}
|
|
|
+ </div>
|
|
|
+ <div class={styles.cardInfo}>
|
|
|
+ <img src={homeIcon} class={styles.cardInfoImg} alt="" />
|
|
|
+ 学校数量
|
|
|
+ </div>
|
|
|
+ <div class={styles.cardLine}></div>
|
|
|
+ </div> */}
|
|
|
+ <div class={[styles.studentCard, styles.cardItem,styles.detailCard]}>
|
|
|
+ <div class={styles.cardNum}>
|
|
|
+ {' '}
|
|
|
+ {numeral(forms.statObj.registerNum).format('0,0')}
|
|
|
+ </div>
|
|
|
+ <div class={styles.cardInfo}>
|
|
|
+ <img src={personIcon} class={styles.cardInfoImg} alt="" />
|
|
|
+ 报名总人数
|
|
|
+ </div>
|
|
|
+ <div class={styles.cardLine}></div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class={styles.searchWrap}>
|
|
|
+ <div class={styles.searechInfo}>
|
|
|
+ <OSearch
|
|
|
+ class={styles.allDataWrap}
|
|
|
+ shape="round"
|
|
|
+ background="#F6F8F9"
|
|
|
+ inputBackground="white"
|
|
|
+ onSearch={val => {
|
|
|
+ forms.keyword = val;
|
|
|
+ forms.page = 1;
|
|
|
+ refreshing.value = true;
|
|
|
+ getList();
|
|
|
+ }}></OSearch>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div
|
|
|
+ class={styles.timerWrap}
|
|
|
+ onClick={() => (forms.perponStatus = true)}>
|
|
|
+ {forms.sortName}{' '}
|
|
|
+ <img
|
|
|
+ src={sanIcon}
|
|
|
+ class={[
|
|
|
+ styles.sanIcon,
|
|
|
+ forms.perponStatus ? styles.routeSan : ''
|
|
|
+ ]}
|
|
|
+ alt=""
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class={styles.schoolList}>
|
|
|
+ {showContact.value ? (
|
|
|
+ <OFullRefresh
|
|
|
+ v-model:modelValue={refreshing.value}
|
|
|
+ onRefresh={onRefresh}
|
|
|
+ class={styles.refreshC}>
|
|
|
+ <List
|
|
|
+ loading-text=" "
|
|
|
+ finished={finished.value}
|
|
|
+ finished-text=" "
|
|
|
+ onLoad={getList}>
|
|
|
+ {list.value.map((item: any) => (
|
|
|
+ <div class={styles.studentItem} >
|
|
|
+ <div class={styles.studentNameWrap}>
|
|
|
+ <p class={styles.title}>{item.userName}</p>
|
|
|
+ <p class={styles.studentPhone}>{item.phone}</p>
|
|
|
+ </div>
|
|
|
+ <div class={styles.studentCountWrap}>
|
|
|
+ <div>
|
|
|
+ <p class={styles.title}>{item.createTime}</p>
|
|
|
+ {/* <p class={styles.personNum}>{item.registerNum}</p> */}
|
|
|
+ </div>
|
|
|
+
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ ))}
|
|
|
+ </List>
|
|
|
+ </OFullRefresh>
|
|
|
+ ) : null}
|
|
|
+
|
|
|
+ {!showContact.value && !loading.value && (
|
|
|
+ <OEmpty description="暂无学校信息" class={styles.emptyC} />
|
|
|
+ )}
|
|
|
+ </div>
|
|
|
+ <Popup
|
|
|
+ v-model:show={forms.yearStatus}
|
|
|
+ position="bottom"
|
|
|
+ round
|
|
|
+ class={'popupBottomSearch'}>
|
|
|
+ <DatePicker
|
|
|
+ showToolbar
|
|
|
+ v-model={forms.year}
|
|
|
+ columns-type={['year']}
|
|
|
+ onCancel={() => (forms.yearStatus = false)}
|
|
|
+ onConfirm={(val: any) => {
|
|
|
+ console.log(val);
|
|
|
+ // const selectedOption = val.selectedOptions[0];
|
|
|
+ // console.log(selectedOption, 'selectedOption');
|
|
|
+ // forms.schoolId = selectedOption.value;
|
|
|
+ // // forms.schoolName = selectedOption.text;
|
|
|
+ forms.year = [val.selectedValues[0]];
|
|
|
+ forms.yearName = val.selectedValues[0];
|
|
|
+ forms.page = 1;
|
|
|
+ refreshing.value = true;
|
|
|
+ // getStat();
|
|
|
+ getList();
|
|
|
+ forms.yearStatus = false;
|
|
|
+ }}
|
|
|
+ />
|
|
|
+ </Popup>
|
|
|
+
|
|
|
+ <Popup
|
|
|
+ v-model:show={forms.perponStatus}
|
|
|
+ position="bottom"
|
|
|
+ round
|
|
|
+ class={'popupBottomSearch'}>
|
|
|
+ <Picker
|
|
|
+ showToolbar
|
|
|
+ columns={forms.sortList}
|
|
|
+ onCancel={() => (forms.perponStatus = false)}
|
|
|
+ onConfirm={(val: any) => {
|
|
|
+ console.log(val);
|
|
|
+ const selectedOption = val.selectedOptions[0];
|
|
|
+ forms.sortId = selectedOption.value;
|
|
|
+ forms.sortName = selectedOption.text;
|
|
|
+ refreshing.value = true;
|
|
|
+ getList();
|
|
|
+ forms.perponStatus = false;
|
|
|
+ }}
|
|
|
+ />
|
|
|
+ </Popup>
|
|
|
+
|
|
|
+
|
|
|
+ <Popup
|
|
|
+ v-model:show={forms.classStatus}
|
|
|
+ position="bottom"
|
|
|
+ round
|
|
|
+ class={'popupBottomSearch'}>
|
|
|
+ <Picker
|
|
|
+ showToolbar
|
|
|
+ columns={forms.classList}
|
|
|
+ onCancel={() => (forms.classStatus = false)}
|
|
|
+ onConfirm={(val: any) => {
|
|
|
+ const selectedOption = val.selectedOptions[0];
|
|
|
+
|
|
|
+ forms.schoolId = selectedOption.value;
|
|
|
+ forms.schoolName = selectedOption.text;
|
|
|
+ // getStat();
|
|
|
+ forms.classStatus = false;
|
|
|
+ refreshing.value = true;
|
|
|
+ getList()
|
|
|
+ }}
|
|
|
+ />
|
|
|
+ </Popup>
|
|
|
+ </div>
|
|
|
+ );
|
|
|
+ }
|
|
|
+});
|