123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219 |
- import {
- PropType,
- defineComponent,
- nextTick,
- onMounted,
- ref,
- toRefs,
- watch
- } from 'vue';
- import styles from '../index.module.less';
- import icons from '../icons.json';
- import { Badge, Icon, Image, Tab, Tabs } from 'vant';
- import * as echarts from 'echarts';
- import { IStudentAttendance } from '../type';
- import { useRouter } from 'vue-router';
- import icon_4 from '../image/icon_4.png';
- import { browser } from '@/helpers/utils';
- import { postMessage } from '@/helpers/native-message';
- type EChartsOption = echarts.EChartsOption;
- const colors = [
- {
- color: new echarts.graphic.LinearGradient(0, 0, 1, 0, [
- { offset: 0, color: '#02E2DB' },
- { offset: 1, color: '#01C1B5' }
- ]),
- name: '正常',
- key: 'normalNum',
- background: 'linear-gradient(180deg, #02E2DB 0%, #01C1B5 100%)'
- },
- {
- color: new echarts.graphic.LinearGradient(0, 0, 1, 0, [
- { offset: 0, color: '#5B8FF9' },
- { offset: 1, color: '#94C2FD' }
- ]),
- name: '迟到',
- key: 'lateNum',
- background:
- 'linear-gradient(180deg, rgba(148, 194, 253, 0.85) 0%, rgba(91, 143, 249, 0.85) 100%)'
- },
- {
- color: new echarts.graphic.LinearGradient(0, 0, 1, 0, [
- { offset: 0, color: '#FBE031' },
- { offset: 1, color: '#F6BD16' }
- ]),
- name: '请假',
- key: 'leaveNum',
- background:
- 'linear-gradient(180deg, rgba(251,224,49,0.85) 0%, rgba(246,189,22,0.85) 100%)'
- },
- {
- color: new echarts.graphic.LinearGradient(0, 0, 1, 0, [
- { offset: 0, color: '#F5A181' },
- { offset: 1, color: '#E8684A' }
- ]),
- name: '旷课',
- key: 'truantNum',
- background:
- 'linear-gradient(180deg, rgba(245,161,129,0.85) 0%, rgba(232,104,74,0.85) 100%)'
- }
- ];
- export default defineComponent({
- name: 'Attendance',
- props: {
- data: {
- type: Object as PropType<IStudentAttendance>,
- default: () => ({})
- }
- },
- emits: ['change'],
- setup(props, { emit }) {
- const firstInit = ref(false);
- const echratsRef = ref();
- const router = useRouter();
- const { data } = toRefs(props);
- watch(
- () => data.value,
- () => {
- firstInit.value = true;
- nextTick(() => {
- handleInit();
- });
- }
- );
- let myChart: echarts.ECharts;
- const handleInit = () => {
- // if (!data.value.totalNum) return;
- if (myChart) {
- myChart.dispose();
- }
- myChart = echarts.init(echratsRef.value);
- const option: EChartsOption = {
- title: {
- text: `${data.value.attendanceRate}%`,
- subtext: '出勤率',
- textAlign: 'center',
- left: '48%',
- top: '34%',
- textStyle: {
- fontSize: '18px',
- fontWeight: 'bold',
- color: '#333',
- fontFamily: 'DINAlternate-Bold, DINAlternate'
- },
- subtextStyle: {
- fontSize: '12px',
- color: '#777'
- }
- },
- tooltip: {
- trigger: 'item',
- confine: true,
- borderWidth: 0,
- borderRadius: 6,
- formatter: function (item: any) {
- return `<span style="display: inline-block; vertical-align: middle;margin-right:4px;border-radius:50%;width:6px;height:6px;background:linear-gradient(${item.color.colorStops[0].color} 0%, ${item.color.colorStops[1].color} 100%);"></span>
- <span style="margin-right:10px; font-size:12px;color: #777;">${item.name}</span>
- <span style="font-size:14px;color: #333;font-weight: bold;font-family: DINAlternate-Bold, DINAlternate;">${item.value}</span>`;
- }
- },
- series: [
- {
- type: 'pie',
- radius: ['54%', '70%'],
- itemStyle: {
- borderRadius: 2,
- borderColor: '#fff',
- borderWidth: 1
- },
- label: {
- show: false
- },
- labelLine: {
- show: false
- },
- avoidLabelOverlap: false,
- data: colors.map(item => {
- return {
- name: item.name,
- value: data.value[item.key],
- itemStyle: {
- color: item.color
- }
- };
- })
- }
- ]
- };
- option && myChart.setOption(option);
- };
- const gotoStudnetManage = () => {
- if (browser().isApp) {
- const url = `${location.origin}${location.pathname}#/student-manage`;
- postMessage({
- api: 'openWebView',
- content: {
- url,
- orientation: 1,
- isHideTitle: false
- }
- });
- } else {
- router.push({
- path: '/student-manage'
- });
- }
- };
- return () => (
- <div class={styles.item}>
- <div class={styles.top}>
- <Image class={styles.iconRight} src={icons.right} />
- <span>学员出勤</span>
- <Image class={styles.iconLeft} src={icons.left} />
- </div>
- <div class={styles.tabsContainer}>
- <Tabs
- shrink
- onChange={value => {
- emit('change', value);
- }}>
- <Tab name="week" title="本周"></Tab>
- <Tab name="month" title="本月"></Tab>
- <Tab name="term" title="本学期"></Tab>
- </Tabs>
- <div class={styles.tagRight} onClick={() => gotoStudnetManage()}>
- 学员信息 <Icon name="arrow" color="rgba(216,216,216,1)" />
- </div>
- </div>
- <div
- // style={{ display: data.value.totalNum ? '' : 'none' }}
- class={styles.attendanceContainer}>
- <div class={styles.attendanceEcharts} ref={echratsRef}></div>
- <div class={styles.tags}>
- <div class={styles.unitTitle}>(单位: 人次)</div>
- {colors.map((item, index) => (
- <div class={styles.tag}>
- <div
- class={styles.rect}
- style={{ background: item.background }}
- />
- <div class={styles.des}>{item.name}</div>
- <span class={styles.tagNum}>{data.value[item.key] || 0}</span>
- </div>
- ))}
- </div>
- </div>
- {/* {!data.value.totalNum && (
- <div class={[styles.gradeContainer, styles.itemEmtry]}>
- <Image src={icon_4} />
- </div>
- )} */}
- </div>
- );
- }
- });
|