import { defineComponent, onMounted, reactive, ref, nextTick } from 'vue'; import styles from './index.module.less'; import { Cell, CellGroup, Col, List, Picker, Popup, Row, Tab, Tabs, DatePicker, Button, DropdownMenu, DropdownItem, Popover } from 'vant'; import MSticky from '@/components/m-sticky'; import personIcon from './images/personIcon.png'; import homeIcon from './images/homeIcon.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 iconQrcode from './images/icon-qrcode.png'; import qrcodeBg from './images/qrcode-bg.png'; import qrbg from './images/qr-bg.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'; import deepClone from '@/helpers/deep-clone'; import { number } from 'echarts'; export default defineComponent({ name: 'tenant-apply-data', setup() { const route = useRoute(); 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, schoolNum: 0, classNum: 0, registerMemberShipNum: 0 } as any, perponStatus: false, sortKey: 'CLASS' as 'CLASS' | 'MEMBER', sortId: 'desc', sortName: '报名人数降序', sortType: 'desc', sortList: [ { value: 'desc', text: '报名人数降序' }, { value: 'asc', text: '报名人数升序' }, { value: 'mdesc', text: '会员人数降序' }, { value: 'masc', text: '会员人数升序' } ] as any, page: 1, rows: 20, isClick: false, showDropdown: false, qrcodeStatus: false, url: '1', // 二维码 urlItem: {} as any, provinceList: [] as any, // 省 cityList: [] as any, // 市 areaList: [] as any, // 区 // 确认之后 searchConfirmObj: { type: 'province' as 'province' | 'city' | 'area' | '', label: '全部地区', value: null as any, list: [] as any }, // 弹窗 searchObj: { type: 'province' as 'province' | 'city' | 'area' | '', label: '全部地区', value: null as any, list: [] as any } }); 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 params: any = { tenantId: forms.id, page: forms.page, rows: forms.rows, year: forms.yearName, keyword: forms.keyword, sort: forms.sortId, sortKey: forms.sortKey }; if (forms.searchConfirmObj.type === 'province') { params.provinceCode = forms.searchConfirmObj.value; } else if (forms.searchConfirmObj.type === 'city') { params.cityCode = forms.searchConfirmObj.value; } else if (forms.searchConfirmObj.type === 'area') { params.regionCode = forms.searchConfirmObj.value; } const res = await request.post( '/edu-app/open/school/schoolRegisterPage', { data: params } ); 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 downImg = () => { if (imgs.saveLoading) { return; } imgs.saveLoading = true; // 判断是否已经生成图片 // if (imgs.image) { // saveImg(); // } else { const container: any = document.getElementById(`preview-container`); // console.log('1212121', container); html2canvas(container, { allowTaint: true, useCORS: true, backgroundColor: null }) .then(async canvas => { const url = canvas.toDataURL('image/png'); imgs.image = url; // saveImg(); forms.qrcodeStatus = true; imgs.saveLoading = false; }) .catch(() => { // console.log(e, 'e'); imgs.saveLoading = false; // console.log('222'); }); // } }; const saveImg = async () => { // showLoadingToast({ message: '图片生成中...', forbidClick: true }); setTimeout(() => { imgs.saveLoading = false; }, 100); const link = document.createElement('a'); link.setAttribute('download', forms.urlItem.schoolName + '统计' + '.png'); // 添加时间戳,防止浏览器缓存图 link.href = imgs.image; link.click(); }; // 计算会员占比 const formatMemberRate = (studentNum: any, memberNum: any) => { if (studentNum <= 0 || memberNum <= 0) { return 0; } // console.log(studentNum, memberNum); return Math.round((memberNum / studentNum) * 1000) / 10; }; const dropdownItemRef = ref(); const getAreas = async () => { try { const { data } = await request.get( '/edu-app/open/sysArea/queryProvince?tenantId=' + forms.id ); forms.provinceList = data || []; } catch { // } }; const formatParentAreaId = (id: any, list: any, ids = [] as any) => { for (const item of list) { if (item.code == id) { return [...ids, id]; } if (item.areas && item.areas.length > 0) { const cIds: any = formatParentAreaId(id, item.areas, [ ...ids, item.code ]); if (cIds.includes(id)) { return cIds; } } } return ids; }; /** 切换状态 */ const onChangeArea = (type: 'province' | 'city' | 'area', item: any) => { forms.searchObj.type = type; forms.searchObj.value = item.code; forms.searchObj.label = item.name; forms.searchObj.list = formatParentAreaId(item.code, forms.provinceList); if (type === 'province') { forms.cityList = item.areas || []; forms.areaList = []; } else if (type === 'city') { forms.areaList = item.areas || []; } else if (type === 'area') { // } }; const formatAreaDefaultData = (index: number, ids: number[], item: any) => { const type: any = ['province', 'city', 'area']; if (ids.length <= 0) return; item.forEach((item: any) => { if (item.code === ids[index]) { onChangeArea(type[index], item); if (ids[index]) { formatAreaDefaultData(index + 1, ids, item.areas || []); } } }); }; onMounted(async () => { if (route.query.name) { document.title = route.query.name + '报名统计'; } else { document.title = '学生报名统计'; } // await getSchoolList(); getAreas(); await getStat(); await getList(); }); const getStat = async () => { try { const params: any = { tenantId: forms.id, year: forms.yearName }; if (forms.searchConfirmObj.type === 'province') { params.provinceCode = forms.searchConfirmObj.value; } else if (forms.searchConfirmObj.type === 'city') { params.cityCode = forms.searchConfirmObj.value; } else if (forms.searchConfirmObj.type === 'area') { params.regionCode = forms.searchConfirmObj.value; } const { data } = await request.post( '/edu-app/open/school/schoolRegisterStat', { data: params } ); forms.statObj = data; } catch { // } }; return () => (
学校名称
*/}{item.schoolName}
{numeral(item.registerNum || 0).format('0,0')}
报名人数
{numeral(item.classNum || 0).format( '0,0' )}
班级数量
{numeral(item.registerMemberShipNum || 0).format( '0,0' )} {/* {item.registerMemberShipNum || 0} */}
数字化人数
{numeral( formatMemberRate( item.registerNum || 0, item.registerMemberShipNum || 0 ) ).format('0.0')} %
数字化普及率
统计二维码
长按保存二维码