123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498 |
- import { defineComponent, onMounted, reactive, ref } from 'vue';
- import styles from './index.module.less';
- import { List, Popup, DatePicker, Popover } from 'vant';
- import MSticky from '@/components/m-sticky';
- import personIcon from './images/personIcon.png';
- import homeIcon from './images/icon-class.png';
- import memberIcon from './images/memberIcon.png';
- import memberRateIcon from './images/memberRateIcon.png';
- // import sanIcon from './images/san.png';
- import iconArrow from './images/icon-arrow.png';
- import iconArrowActive from './images/icon-arrow-active.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';
- // import MQrcode from '@/components/m-qrcode';
- // import html2canvas from 'html2canvas';
- import MWxTip from '@/components/m-wx-tip';
- export default defineComponent({
- name: 'tenant-apply-data',
- setup() {
- const route = useRoute();
- const router = useRouter();
- const tabName = ref('all');
- const forms = reactive({
- keyword: '',
- id: route.query.id,
- // id: '1687275949971763202',
- yearStatus: false,
- schoolId: null,
- year: [new Date().getFullYear()] as any,
- yearName: new Date().getFullYear(),
- classList: [] as any,
- statObj: {
- registerNum: 0,
- classNum: 0,
- registerMemberShipNum: 0
- } as any,
- perponStatus: false,
- sortKey: 'MEMBER' as 'CLASS' | 'MEMBER' | 'GRADEYEAR',
- sortId: 'desc',
- sortName: '人数降序',
- sortType: 'mdesc',
- sortList: [
- // { value: 'desc', text: '报名人数降序' },
- // { value: 'asc', text: '报名人数升序' },
- { value: 'mdesc', text: '人数降序' },
- { value: 'masc', text: '人数升序' },
- // { value: 'gdesc', text: '按学年降序' },
- // { value: 'gasc', 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/schoolRegisterClassPage',
- {
- data: {
- schoolId: forms.id,
- page: forms.page,
- rows: forms.rows,
- // year: forms.yearName,
- keyword: forms.keyword,
- sort: forms.sortId,
- sortKey: forms.sortKey
- }
- }
- );
- 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();
- };
- const imgs = reactive({
- saveLoading: false,
- image: null as any,
- shareLoading: false
- });
- // 计算会员占比
- const formatMemberRate = (studentNum: any, memberNum: any) => {
- if (studentNum <= 0 || memberNum <= 0) {
- return 0;
- }
- // console.log(studentNum, memberNum);
- return Math.round((memberNum / studentNum) * 1000) / 10;
- };
- onMounted(async () => {
- if (route.query.name) {
- document.title = route.query.name + '报名统计';
- } else {
- document.title = '学生报名统计';
- }
- await getStat();
- await getList();
- });
- const getStat = async () => {
- try {
- const { data } = await request.post(
- '/edu-app/open/school/schoolRegisterStat',
- {
- data: {
- schoolId: forms.id
- // year: forms.yearName
- }
- }
- );
- forms.statObj = data;
- } catch {
- //
- }
- };
- return () => (
- <div class={[styles.tenantAllData, styles.tenantSchoolData]}>
- {/* <OHeader isBack={false} /> */}
- <MSticky position="top">
- <div class={styles.top}>
- <div class={styles.topWrap}>
- <div class={styles.topHead}>
- <img src={topDot} class={styles.topDot} 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.studentCard, styles.cardItem]}>
- <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 class={[styles.schoolCard, styles.cardItem]}>
- <div class={styles.cardNum}>
- {numeral(forms.statObj.classNum).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.memberCard, styles.cardItem]}>
- <div class={styles.cardNum}>
- {numeral(forms.statObj.registerMemberShipNum).format('0,0')}
- </div>
- <div class={styles.cardInfo}>
- <img src={memberIcon} class={styles.cardInfoImg} alt="" />
- 数字化人数
- </div>
- <div class={styles.cardLine}></div>
- </div>
- {/* <div class={[styles.memberRateCard, styles.cardItem]}>
- <div class={styles.cardNum}>
- {numeral(
- formatMemberRate(
- forms.statObj.registerNum || 0,
- forms.statObj.registerMemberShipNum || 0
- )
- ).format('0.0')}
- %
- </div>
- <div class={styles.cardInfo}>
- <img src={memberRateIcon} 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"
- placeholder="请输入班级名称"
- 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> */}
- <Popover
- v-model:show={forms.perponStatus}
- showArrow={false}
- placement="bottom-end"
- offset={[0, 12]}>
- {{
- reference: () => (
- <div
- class={[
- styles.timerWrap,
- forms.perponStatus && styles.timerWrapActive
- ]}
- // onClick={() => (forms.perponStatus = true)}
- >
- {forms.sortName}
- <img
- src={forms.perponStatus ? iconArrowActive : iconArrow}
- class={[styles.sanIcon]}
- alt=""
- />
- </div>
- ),
- default: () => (
- <div class={styles.popSearchList}>
- {forms.sortList.map((item: any, index: number) => (
- <div
- class={[
- styles.popSearchItem,
- index < forms.sortList.length - 1 &&
- 'van-hairline--bottom'
- ]}>
- <div
- class={[
- styles.popSearchItemChild,
- forms.sortType === item.value &&
- styles.popSearchItemActive
- ]}
- onClick={() => {
- const selectedOption = item;
- if (
- selectedOption.value === 'desc' ||
- selectedOption.value === 'asc'
- ) {
- forms.sortId = selectedOption.value;
- forms.sortKey = 'CLASS';
- }
- if (selectedOption.value === 'mdesc') {
- forms.sortId = 'desc';
- forms.sortKey = 'MEMBER';
- }
- if (selectedOption.value === 'masc') {
- forms.sortId = 'asc';
- forms.sortKey = 'MEMBER';
- }
- if (selectedOption.value === 'gdesc') {
- forms.sortId = 'desc';
- forms.sortKey = 'GRADEYEAR';
- }
- if (selectedOption.value === 'gasc') {
- forms.sortId = 'asc';
- forms.sortKey = 'GRADEYEAR';
- }
- forms.sortType = selectedOption.value;
- forms.sortName = selectedOption.text;
- refreshing.value = true;
- getList();
- forms.perponStatus = false;
- }}>
- {item.text}
- </div>
- </div>
- ))}
- </div>
- )
- }}
- </Popover>
- </div>
- </div>
- </MSticky>
- <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.schoolItem}>
- <div class={styles.schoolNameWrap}>
- {/* <p class={styles.title}>学校名称</p> */}
- <p class={styles.schoolName}>
- {item.classGroupName}
- {/* {item.gradeYear && <span>({item.gradeYear}学年)</span>} */}
- </p>
- </div>
- <div class={styles.schoolCountWrap}>
- {/* <div>
- <p class={styles.personNum}>
- {numeral(item.registerNum || 0).format('0,0')}
- </p>
- <p class={styles.title}>报名人数</p>
- </div> */}
- <div>
- <p class={styles.personNum}>
- {numeral(item.registerMemberShipNum || 0).format(
- '0,0'
- )}
- </p>
- <p class={styles.title}>数字化人数</p>
- </div>
- {/* <div>
- <p class={styles.personNum}>
- {numeral(
- formatMemberRate(
- item.registerNum || 0,
- item.registerMemberShipNum || 0
- )
- ).format('0.0')}
- %
- </p>
- <p class={styles.title}>数字化普及率</p>
- </div> */}
- {/* <img class={[styles.arrow]} src={arrowIcon} alt="" /> */}
- </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) => {
- const selectedOption = val.selectedOptions[0];
- if (
- selectedOption.value === 'desc' ||
- selectedOption.value === 'asc'
- ) {
- forms.sortId = selectedOption.value;
- forms.sortKey = 'CLASS';
- }
- if (selectedOption.value === 'mdesc') {
- forms.sortId = 'desc';
- forms.sortKey = 'MEMBER';
- }
- if (selectedOption.value === 'masc') {
- forms.sortId = 'asc';
- forms.sortKey = 'MEMBER';
- }
- forms.sortName = selectedOption.text;
- refreshing.value = true;
- getList();
- forms.perponStatus = false;
- }}
- />
- </Popup> */}
- <MWxTip />
- </div>
- );
- }
- });
|