|  | @@ -1,461 +1,479 @@
 | 
	
		
			
				|  |  | -import { Ref, defineComponent, onMounted, reactive, ref } from 'vue';
 | 
	
		
			
				|  |  | -import styles from '../index.module.less';
 | 
	
		
			
				|  |  | -import {
 | 
	
		
			
				|  |  | -  NButton,
 | 
	
		
			
				|  |  | -  NDataTable,
 | 
	
		
			
				|  |  | -  NForm,
 | 
	
		
			
				|  |  | -  NFormItem,
 | 
	
		
			
				|  |  | -  NNumberAnimation,
 | 
	
		
			
				|  |  | -  NSpace
 | 
	
		
			
				|  |  | -} from 'naive-ui';
 | 
	
		
			
				|  |  | -import numeral from 'numeral';
 | 
	
		
			
				|  |  | -import { useECharts } from '@/hooks/web/useECharts';
 | 
	
		
			
				|  |  | -import Pagination from '/src/components/pagination';
 | 
	
		
			
				|  |  | -import { getTrainingStat } from '../api';
 | 
	
		
			
				|  |  | -import { getTrainingStatList } from '@/views/classList/api';
 | 
	
		
			
				|  |  | -import {
 | 
	
		
			
				|  |  | -  getNowDateAndMonday,
 | 
	
		
			
				|  |  | -  getNowDateAndSunday,
 | 
	
		
			
				|  |  | -  getTimes,
 | 
	
		
			
				|  |  | -  getMinutes,
 | 
	
		
			
				|  |  | -  getSecend,
 | 
	
		
			
				|  |  | -  getHours,
 | 
	
		
			
				|  |  | -  getLastMinutes,
 | 
	
		
			
				|  |  | -  formateSeconds,
 | 
	
		
			
				|  |  | -  getChatMinutes
 | 
	
		
			
				|  |  | -} from '/src/utils/dateFormat';
 | 
	
		
			
				|  |  | -import CDatePicker from '/src/components/CDatePicker';
 | 
	
		
			
				|  |  | -import TheEmpty from '/src/components/TheEmpty';
 | 
	
		
			
				|  |  | -import { initCache, setCache } from '/src/hooks/use-async';
 | 
	
		
			
				|  |  | -import { useRoute } from 'vue-router';
 | 
	
		
			
				|  |  | -export default defineComponent({
 | 
	
		
			
				|  |  | -  name: 'student-practiceData',
 | 
	
		
			
				|  |  | -  props: {
 | 
	
		
			
				|  |  | -    studentId: {
 | 
	
		
			
				|  |  | -      type: String,
 | 
	
		
			
				|  |  | -      default: ''
 | 
	
		
			
				|  |  | -    },
 | 
	
		
			
				|  |  | -    classGroupId: {
 | 
	
		
			
				|  |  | -      type: String,
 | 
	
		
			
				|  |  | -      default: ''
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -  },
 | 
	
		
			
				|  |  | -  setup(props) {
 | 
	
		
			
				|  |  | -    const route = useRoute()
 | 
	
		
			
				|  |  | -    const chartRef = ref<HTMLDivElement | null>(null);
 | 
	
		
			
				|  |  | -    const { setOptions } = useECharts(chartRef as Ref<HTMLDivElement>);
 | 
	
		
			
				|  |  | -    const practiceFlag = ref(true);
 | 
	
		
			
				|  |  | -    const payForm = reactive({
 | 
	
		
			
				|  |  | -      height: '360px',
 | 
	
		
			
				|  |  | -      width: '100%',
 | 
	
		
			
				|  |  | -      practiceDurationAvg: 0,
 | 
	
		
			
				|  |  | -      practiceDays: 0,
 | 
	
		
			
				|  |  | -      practiceDurationTotal: 0,
 | 
	
		
			
				|  |  | -      dateList: [],
 | 
	
		
			
				|  |  | -      timeList: []
 | 
	
		
			
				|  |  | -    });
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    const state = reactive({
 | 
	
		
			
				|  |  | -      loading: false,
 | 
	
		
			
				|  |  | -      dayFlag: true,
 | 
	
		
			
				|  |  | -      pagination: {
 | 
	
		
			
				|  |  | -        page: 1,
 | 
	
		
			
				|  |  | -        rows: 10,
 | 
	
		
			
				|  |  | -        pageTotal: 4
 | 
	
		
			
				|  |  | -      },
 | 
	
		
			
				|  |  | -      tableList: [] as any,
 | 
	
		
			
				|  |  | -      goCourseVisiable: false
 | 
	
		
			
				|  |  | -    });
 | 
	
		
			
				|  |  | -    const timer = ref<[number, number]>([
 | 
	
		
			
				|  |  | -      getNowDateAndMonday(new Date().getTime()),
 | 
	
		
			
				|  |  | -      getNowDateAndSunday(new Date().getTime())
 | 
	
		
			
				|  |  | -    ]);
 | 
	
		
			
				|  |  | -    const columns = () => {
 | 
	
		
			
				|  |  | -      return [
 | 
	
		
			
				|  |  | -        {
 | 
	
		
			
				|  |  | -          title: '日期',
 | 
	
		
			
				|  |  | -          key: 'date'
 | 
	
		
			
				|  |  | -        },
 | 
	
		
			
				|  |  | -        {
 | 
	
		
			
				|  |  | -          title: '学练时长',
 | 
	
		
			
				|  |  | -          key: 'practiceDuration',
 | 
	
		
			
				|  |  | -          render(row: any) {
 | 
	
		
			
				|  |  | -            return (
 | 
	
		
			
				|  |  | -              <>
 | 
	
		
			
				|  |  | -                {' '}
 | 
	
		
			
				|  |  | -                <>
 | 
	
		
			
				|  |  | -                  {row.practiceDuration
 | 
	
		
			
				|  |  | -                    ? formateSeconds(row.practiceDuration, 1)
 | 
	
		
			
				|  |  | -                    : 0 + '分钟'}
 | 
	
		
			
				|  |  | -                </>
 | 
	
		
			
				|  |  | -              </>
 | 
	
		
			
				|  |  | -            );
 | 
	
		
			
				|  |  | -          }
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -      ];
 | 
	
		
			
				|  |  | -    };
 | 
	
		
			
				|  |  | -    const getList = async () => {
 | 
	
		
			
				|  |  | -      try {
 | 
	
		
			
				|  |  | -        const res = await getTrainingStatList({
 | 
	
		
			
				|  |  | -          page: 1,
 | 
	
		
			
				|  |  | -          rows: 999,
 | 
	
		
			
				|  |  | -          dayFlag: state.dayFlag,
 | 
	
		
			
				|  |  | -          studentId: props.studentId,
 | 
	
		
			
				|  |  | -          classGroupId: props.classGroupId,
 | 
	
		
			
				|  |  | -          ...getTimes(timer.value, ['startTime', 'endTime'], 'YYYY-MM-DD')
 | 
	
		
			
				|  |  | -        });
 | 
	
		
			
				|  |  | -        state.tableList = res.data.rows;
 | 
	
		
			
				|  |  | -      } catch (e) {
 | 
	
		
			
				|  |  | -        console.log(e);
 | 
	
		
			
				|  |  | -      }
 | 
	
		
			
				|  |  | -    };
 | 
	
		
			
				|  |  | -    const setChart = () => {
 | 
	
		
			
				|  |  | -      setOptions({
 | 
	
		
			
				|  |  | -        tooltip: {
 | 
	
		
			
				|  |  | -          trigger: 'axis',
 | 
	
		
			
				|  |  | -          axisPointer: {
 | 
	
		
			
				|  |  | -            type: 'shadow'
 | 
	
		
			
				|  |  | -          }
 | 
	
		
			
				|  |  | -        },
 | 
	
		
			
				|  |  | -        legend: {
 | 
	
		
			
				|  |  | -          show: false,
 | 
	
		
			
				|  |  | -          selected: {
 | 
	
		
			
				|  |  | -            //在这里设置默认展示就ok了
 | 
	
		
			
				|  |  | -            '学练时长(分钟)': practiceFlag.value
 | 
	
		
			
				|  |  | -          }
 | 
	
		
			
				|  |  | -        },
 | 
	
		
			
				|  |  | -        xAxis: {
 | 
	
		
			
				|  |  | -          type: 'category',
 | 
	
		
			
				|  |  | -          boundaryGap: true,
 | 
	
		
			
				|  |  | -          axisLabel: {
 | 
	
		
			
				|  |  | -            show: true
 | 
	
		
			
				|  |  | -            // interval: 0
 | 
	
		
			
				|  |  | -          },
 | 
	
		
			
				|  |  | -          data: payForm.dateList
 | 
	
		
			
				|  |  | -        },
 | 
	
		
			
				|  |  | -        yAxis: [
 | 
	
		
			
				|  |  | -          {
 | 
	
		
			
				|  |  | -            type: 'value',
 | 
	
		
			
				|  |  | -            axisLabel: {
 | 
	
		
			
				|  |  | -              formatter: (value: any) => {
 | 
	
		
			
				|  |  | -                return (value) + 'min';
 | 
	
		
			
				|  |  | -              }
 | 
	
		
			
				|  |  | -            },
 | 
	
		
			
				|  |  | -            axisTick: {
 | 
	
		
			
				|  |  | -              show: false
 | 
	
		
			
				|  |  | -            },
 | 
	
		
			
				|  |  | -            splitArea: {
 | 
	
		
			
				|  |  | -              show: false,
 | 
	
		
			
				|  |  | -              areaStyle: {
 | 
	
		
			
				|  |  | -                color: ['rgba(255,255,255,0.2)']
 | 
	
		
			
				|  |  | -              }
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -          }
 | 
	
		
			
				|  |  | -        ],
 | 
	
		
			
				|  |  | -        grid: {
 | 
	
		
			
				|  |  | -          left: '1%',
 | 
	
		
			
				|  |  | -          right: '1%',
 | 
	
		
			
				|  |  | -          top: '2%',
 | 
	
		
			
				|  |  | -          bottom: 0,
 | 
	
		
			
				|  |  | -          containLabel: true
 | 
	
		
			
				|  |  | -        },
 | 
	
		
			
				|  |  | -        series: [
 | 
	
		
			
				|  |  | -          {
 | 
	
		
			
				|  |  | -            // smooth: true,
 | 
	
		
			
				|  |  | -            data: payForm.timeList,
 | 
	
		
			
				|  |  | -            type: 'bar',
 | 
	
		
			
				|  |  | -            barWidth: '48px',
 | 
	
		
			
				|  |  | -            stack: 'total',
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -            itemStyle: {
 | 
	
		
			
				|  |  | -              normal: {
 | 
	
		
			
				|  |  | -                //这里设置柱形图圆角 [左上角,右上角,右下角,左下角]
 | 
	
		
			
				|  |  | -                barBorderRadius: [8, 8, 0, 0],
 | 
	
		
			
				|  |  | -                color: '#D5E9FF'
 | 
	
		
			
				|  |  | -              },
 | 
	
		
			
				|  |  | -              emphasis: {
 | 
	
		
			
				|  |  | -                focus: 'series',
 | 
	
		
			
				|  |  | -                color: '#3583FA' //hover时改变柱子颜色
 | 
	
		
			
				|  |  | -                // borderWidth: 4,
 | 
	
		
			
				|  |  | -                // borderColor: 'rgba(213, 233, 255,.4)',
 | 
	
		
			
				|  |  | -                // borderType: 'solid'
 | 
	
		
			
				|  |  | -              }
 | 
	
		
			
				|  |  | -            } as any
 | 
	
		
			
				|  |  | -          }
 | 
	
		
			
				|  |  | -        ],
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        formatter: (item: any) => {
 | 
	
		
			
				|  |  | -          if (Array.isArray(item)) {
 | 
	
		
			
				|  |  | -            return [
 | 
	
		
			
				|  |  | -              item[0].axisValueLabel,
 | 
	
		
			
				|  |  | -              ...item.map((d: any) => {
 | 
	
		
			
				|  |  | -                let str = formateSeconds(d.value[2], 1)
 | 
	
		
			
				|  |  | -                return `<br/>${d.marker}<span style="margin-top:10px;margin-left:5px;font-size: 13px;font-weight: 500;
 | 
	
		
			
				|  |  | -                  color: #131415;font-weight: 600;
 | 
	
		
			
				|  |  | -                  margin-top:12px
 | 
	
		
			
				|  |  | -                  line-height: 18px;">学练时长: ${str} </span>`;
 | 
	
		
			
				|  |  | -              })
 | 
	
		
			
				|  |  | -            ].join('');
 | 
	
		
			
				|  |  | -          } else {
 | 
	
		
			
				|  |  | -            return item;
 | 
	
		
			
				|  |  | -          }
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -        // dataZoom: [
 | 
	
		
			
				|  |  | -        //   {
 | 
	
		
			
				|  |  | -        //     type: 'slider',
 | 
	
		
			
				|  |  | -        //     start: 5,
 | 
	
		
			
				|  |  | -        //     end: 100,
 | 
	
		
			
				|  |  | -        //     filterMode: 'empty'
 | 
	
		
			
				|  |  | -        //   }
 | 
	
		
			
				|  |  | -        // ]
 | 
	
		
			
				|  |  | -      });
 | 
	
		
			
				|  |  | -    };
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    const getChartDetail = async () => {
 | 
	
		
			
				|  |  | -      try {
 | 
	
		
			
				|  |  | -        const res = await getTrainingStat({
 | 
	
		
			
				|  |  | -          studentId: props.studentId,
 | 
	
		
			
				|  |  | -          dayFlag: state.dayFlag,
 | 
	
		
			
				|  |  | -          classGroupId: props.classGroupId,
 | 
	
		
			
				|  |  | -          ...getTimes(timer.value, ['startTime', 'endTime'], 'YYYY-MM-DD')
 | 
	
		
			
				|  |  | -        });
 | 
	
		
			
				|  |  | -        payForm.practiceDays = res.data.practiceDays;
 | 
	
		
			
				|  |  | -        payForm.practiceDurationAvg = res.data.practiceDurationAvg;
 | 
	
		
			
				|  |  | -        payForm.practiceDurationTotal = res.data.practiceDurationTotal;
 | 
	
		
			
				|  |  | -        payForm.dateList = res.data.trainingStatDetailList.map((item: any) => {
 | 
	
		
			
				|  |  | -          return item.date;
 | 
	
		
			
				|  |  | -        });
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        payForm.timeList = res.data.trainingStatDetailList.map((item: any, index: number) => {
 | 
	
		
			
				|  |  | -          return [index, getChatMinutes(item.practiceDuration), item.practiceDuration];
 | 
	
		
			
				|  |  | -        });
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        setChart();
 | 
	
		
			
				|  |  | -      } catch (e) {
 | 
	
		
			
				|  |  | -        console.log(e);
 | 
	
		
			
				|  |  | -      }
 | 
	
		
			
				|  |  | -    };
 | 
	
		
			
				|  |  | -    const search = () => {
 | 
	
		
			
				|  |  | -      state.pagination.page = 1;
 | 
	
		
			
				|  |  | -      getChartDetail();
 | 
	
		
			
				|  |  | -      getList();
 | 
	
		
			
				|  |  | -      setCache({
 | 
	
		
			
				|  |  | -        current: { timer: timer.value },
 | 
	
		
			
				|  |  | -        saveKey: 'classStudentRecordPracticeData'
 | 
	
		
			
				|  |  | -      });
 | 
	
		
			
				|  |  | -    };
 | 
	
		
			
				|  |  | -    const onReset = () => {
 | 
	
		
			
				|  |  | -      if(route.query.times) {
 | 
	
		
			
				|  |  | -        timer.value = JSON.parse(route.query.times as any)
 | 
	
		
			
				|  |  | -      } else {
 | 
	
		
			
				|  |  | -        timer.value = [
 | 
	
		
			
				|  |  | -          getNowDateAndMonday(new Date().getTime()),
 | 
	
		
			
				|  |  | -          getNowDateAndSunday(new Date().getTime())
 | 
	
		
			
				|  |  | -        ];
 | 
	
		
			
				|  |  | -      }
 | 
	
		
			
				|  |  | -      
 | 
	
		
			
				|  |  | -      search();
 | 
	
		
			
				|  |  | -      getList();
 | 
	
		
			
				|  |  | -      setCache({
 | 
	
		
			
				|  |  | -        current: { timer: timer.value },
 | 
	
		
			
				|  |  | -        saveKey: 'classStudentRecordPracticeData'
 | 
	
		
			
				|  |  | -      });
 | 
	
		
			
				|  |  | -    };
 | 
	
		
			
				|  |  | -    initCache({
 | 
	
		
			
				|  |  | -      current: { timer: timer.value },
 | 
	
		
			
				|  |  | -      saveKey: 'classStudentRecordPracticeData',
 | 
	
		
			
				|  |  | -      callBack: (active: any) => {
 | 
	
		
			
				|  |  | -        timer.value = active.timer;
 | 
	
		
			
				|  |  | -      }
 | 
	
		
			
				|  |  | -    });
 | 
	
		
			
				|  |  | -    onMounted(() => {
 | 
	
		
			
				|  |  | -      if(route.query.times) {
 | 
	
		
			
				|  |  | -        timer.value = JSON.parse(route.query.times as any)
 | 
	
		
			
				|  |  | -      }
 | 
	
		
			
				|  |  | -      getChartDetail();
 | 
	
		
			
				|  |  | -      getList();
 | 
	
		
			
				|  |  | -    });
 | 
	
		
			
				|  |  | -    return () => (
 | 
	
		
			
				|  |  | -      <>
 | 
	
		
			
				|  |  | -        <NSpace justify="space-between">
 | 
	
		
			
				|  |  | -          <NForm label-placement="left" inline>
 | 
	
		
			
				|  |  | -            <NFormItem>
 | 
	
		
			
				|  |  | -              <CDatePicker
 | 
	
		
			
				|  |  | -                v-model:value={timer.value}
 | 
	
		
			
				|  |  | -                separator={'至'}
 | 
	
		
			
				|  |  | -                type="daterange"
 | 
	
		
			
				|  |  | -                timerValue={timer.value}></CDatePicker>
 | 
	
		
			
				|  |  | -            </NFormItem>
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -            <NFormItem>
 | 
	
		
			
				|  |  | -              <NSpace justify="end">
 | 
	
		
			
				|  |  | -                <NButton type="primary" class="searchBtn" onClick={search}>
 | 
	
		
			
				|  |  | -                  搜索
 | 
	
		
			
				|  |  | -                </NButton>
 | 
	
		
			
				|  |  | -                <NButton type="primary" ghost class="resetBtn" onClick={onReset}>
 | 
	
		
			
				|  |  | -                  重置
 | 
	
		
			
				|  |  | -                </NButton>
 | 
	
		
			
				|  |  | -              </NSpace>
 | 
	
		
			
				|  |  | -            </NFormItem>
 | 
	
		
			
				|  |  | -          </NForm>
 | 
	
		
			
				|  |  | -          <NSpace>
 | 
	
		
			
				|  |  | -            <NButton type="primary" class={state.dayFlag ? "searchDate" : "searchDateDefault"} onClick={() =>{
 | 
	
		
			
				|  |  | -              state.dayFlag = true;
 | 
	
		
			
				|  |  | -              search()
 | 
	
		
			
				|  |  | -            }}>按天</NButton>
 | 
	
		
			
				|  |  | -            <NButton type="primary" class={state.dayFlag ? "searchDateDefault" : "searchDate"} onClick={() =>{
 | 
	
		
			
				|  |  | -              state.dayFlag = false;
 | 
	
		
			
				|  |  | -              search()
 | 
	
		
			
				|  |  | -            }}>按月</NButton>
 | 
	
		
			
				|  |  | -          </NSpace>
 | 
	
		
			
				|  |  | -        </NSpace>
 | 
	
		
			
				|  |  | -        <div class={[styles.homeTrainData, styles.homeTrainDataPractice]}>
 | 
	
		
			
				|  |  | -          <div class={styles.TrainDataTop}>
 | 
	
		
			
				|  |  | -            <div class={styles.TrainDataTopLeft}>
 | 
	
		
			
				|  |  | -              <div class={styles.TrainDataItem}>
 | 
	
		
			
				|  |  | -                <p class={styles.TrainDataItemTitle}>
 | 
	
		
			
				|  |  | -                {getHours(payForm.practiceDurationTotal) > 0 ? (
 | 
	
		
			
				|  |  | -                    <div>
 | 
	
		
			
				|  |  | -                      <span>
 | 
	
		
			
				|  |  | -                        <NNumberAnimation
 | 
	
		
			
				|  |  | -                          from={0}
 | 
	
		
			
				|  |  | -                          to={getHours(
 | 
	
		
			
				|  |  | -                            payForm.practiceDurationTotal
 | 
	
		
			
				|  |  | -                          )}></NNumberAnimation>
 | 
	
		
			
				|  |  | -                      </span>
 | 
	
		
			
				|  |  | -                      <i style={{ width: '4px', display: 'inline-block' }}></i>
 | 
	
		
			
				|  |  | -                      时
 | 
	
		
			
				|  |  | -                      <i style={{ width: '4px', display: 'inline-block' }}></i>
 | 
	
		
			
				|  |  | -                    </div>
 | 
	
		
			
				|  |  | -                  ) : null}
 | 
	
		
			
				|  |  | -                  {getHours(payForm.practiceDurationAvg) > 0 || getLastMinutes(payForm.practiceDurationTotal) > 0 ? (
 | 
	
		
			
				|  |  | -                    <div>
 | 
	
		
			
				|  |  | -                      <span>
 | 
	
		
			
				|  |  | -                        <NNumberAnimation
 | 
	
		
			
				|  |  | -                          from={0}
 | 
	
		
			
				|  |  | -                          to={getLastMinutes(
 | 
	
		
			
				|  |  | -                            payForm.practiceDurationTotal
 | 
	
		
			
				|  |  | -                          )}></NNumberAnimation>
 | 
	
		
			
				|  |  | -                      </span>
 | 
	
		
			
				|  |  | -                      <i style={{ width: '4px', display: 'inline-block' }}></i>
 | 
	
		
			
				|  |  | -                      分
 | 
	
		
			
				|  |  | -                      <i style={{ width: '4px', display: 'inline-block' }}></i>
 | 
	
		
			
				|  |  | -                    </div>
 | 
	
		
			
				|  |  | -                  ) : null}
 | 
	
		
			
				|  |  | -                  <div>
 | 
	
		
			
				|  |  | -                    <span>
 | 
	
		
			
				|  |  | -                      <NNumberAnimation
 | 
	
		
			
				|  |  | -                        from={0}
 | 
	
		
			
				|  |  | -                        to={getSecend(
 | 
	
		
			
				|  |  | -                          payForm.practiceDurationTotal
 | 
	
		
			
				|  |  | -                        )}></NNumberAnimation>
 | 
	
		
			
				|  |  | -                    </span>
 | 
	
		
			
				|  |  | -                    <i style={{ width: '4px', display: 'inline-block' }}></i>秒
 | 
	
		
			
				|  |  | -                  </div>
 | 
	
		
			
				|  |  | -                </p>
 | 
	
		
			
				|  |  | -                <p class={styles.TrainDataItemsubTitle}>累计练习时长</p>
 | 
	
		
			
				|  |  | -              </div>
 | 
	
		
			
				|  |  | -              <div class={styles.TrainDataItem}>
 | 
	
		
			
				|  |  | -                <p class={styles.TrainDataItemTitle}>
 | 
	
		
			
				|  |  | -                {getHours(payForm.practiceDurationAvg) > 0 ? (
 | 
	
		
			
				|  |  | -                    <div>
 | 
	
		
			
				|  |  | -                      <span>
 | 
	
		
			
				|  |  | -                        <NNumberAnimation
 | 
	
		
			
				|  |  | -                          from={0}
 | 
	
		
			
				|  |  | -                          to={getHours(
 | 
	
		
			
				|  |  | -                            payForm.practiceDurationAvg
 | 
	
		
			
				|  |  | -                          )}></NNumberAnimation>
 | 
	
		
			
				|  |  | -                      </span>
 | 
	
		
			
				|  |  | -                      <i style={{ width: '4px', display: 'inline-block' }}></i>
 | 
	
		
			
				|  |  | -                      时
 | 
	
		
			
				|  |  | -                      <i style={{ width: '4px', display: 'inline-block' }}></i>
 | 
	
		
			
				|  |  | -                    </div>
 | 
	
		
			
				|  |  | -                  ) : null}
 | 
	
		
			
				|  |  | -                  {getHours(payForm.practiceDurationAvg) > 0 || getLastMinutes(payForm.practiceDurationAvg) > 0 ? (
 | 
	
		
			
				|  |  | -                    <div>
 | 
	
		
			
				|  |  | -                      <span>
 | 
	
		
			
				|  |  | -                        <NNumberAnimation
 | 
	
		
			
				|  |  | -                          from={0}
 | 
	
		
			
				|  |  | -                          to={getLastMinutes(
 | 
	
		
			
				|  |  | -                            payForm.practiceDurationAvg
 | 
	
		
			
				|  |  | -                          )}></NNumberAnimation>
 | 
	
		
			
				|  |  | -                      </span>
 | 
	
		
			
				|  |  | -                      <i style={{ width: '4px', display: 'inline-block' }}></i>
 | 
	
		
			
				|  |  | -                      分
 | 
	
		
			
				|  |  | -                      <i style={{ width: '4px', display: 'inline-block' }}></i>
 | 
	
		
			
				|  |  | -                    </div>
 | 
	
		
			
				|  |  | -                  ) : null}
 | 
	
		
			
				|  |  | -                  <div>
 | 
	
		
			
				|  |  | -                    <span>
 | 
	
		
			
				|  |  | -                      <NNumberAnimation
 | 
	
		
			
				|  |  | -                        from={0}
 | 
	
		
			
				|  |  | -                        to={getSecend(
 | 
	
		
			
				|  |  | -                          payForm.practiceDurationAvg
 | 
	
		
			
				|  |  | -                        )}></NNumberAnimation>
 | 
	
		
			
				|  |  | -                    </span>
 | 
	
		
			
				|  |  | -                    <i style={{ width: '4px', display: 'inline-block' }}></i>秒
 | 
	
		
			
				|  |  | -                  </div>
 | 
	
		
			
				|  |  | -                </p>
 | 
	
		
			
				|  |  | -                <p class={styles.TrainDataItemsubTitle}>平均每天练习时长</p>
 | 
	
		
			
				|  |  | -              </div>
 | 
	
		
			
				|  |  | -              <div class={styles.TrainDataItem}>
 | 
	
		
			
				|  |  | -                <p class={styles.TrainDataItemTitle}>
 | 
	
		
			
				|  |  | -                  <div>
 | 
	
		
			
				|  |  | -                    <span>
 | 
	
		
			
				|  |  | -                      <NNumberAnimation
 | 
	
		
			
				|  |  | -                        from={0}
 | 
	
		
			
				|  |  | -                        to={payForm.practiceDays}></NNumberAnimation>
 | 
	
		
			
				|  |  | -                    </span>
 | 
	
		
			
				|  |  | -                    <i style={{ width: '4px', display: 'inline-block' }}></i>天
 | 
	
		
			
				|  |  | -                  </div>
 | 
	
		
			
				|  |  | -                </p>
 | 
	
		
			
				|  |  | -                <p class={styles.TrainDataItemsubTitle}>练习天数</p>
 | 
	
		
			
				|  |  | -              </div>
 | 
	
		
			
				|  |  | -            </div>
 | 
	
		
			
				|  |  | -            <div class={styles.TrainDataTopRight}>
 | 
	
		
			
				|  |  | -              <div
 | 
	
		
			
				|  |  | -                // onClick={() => {
 | 
	
		
			
				|  |  | -                //   practiceFlag.value = !practiceFlag.value;
 | 
	
		
			
				|  |  | -                //   setChart();
 | 
	
		
			
				|  |  | -                // }}
 | 
	
		
			
				|  |  | -                class={[
 | 
	
		
			
				|  |  | -                  styles.DataTopRightItem,
 | 
	
		
			
				|  |  | -                  practiceFlag.value ? '' : styles.DataTopRightItemDis
 | 
	
		
			
				|  |  | -                ]}>
 | 
	
		
			
				|  |  | -                <div
 | 
	
		
			
				|  |  | -                  class={[
 | 
	
		
			
				|  |  | -                    styles.DataTopRightDot,
 | 
	
		
			
				|  |  | -                    styles.DataTopRightDotBlue
 | 
	
		
			
				|  |  | -                  ]}></div>
 | 
	
		
			
				|  |  | -                <p>学练时长(分钟)</p>
 | 
	
		
			
				|  |  | -              </div>
 | 
	
		
			
				|  |  | -            </div>
 | 
	
		
			
				|  |  | -          </div>
 | 
	
		
			
				|  |  | -          <div class={styles.chatrs}>
 | 
	
		
			
				|  |  | -            <div
 | 
	
		
			
				|  |  | -              ref={chartRef}
 | 
	
		
			
				|  |  | -              style={{ height: payForm.height, width: payForm.width }}></div>
 | 
	
		
			
				|  |  | -          </div>
 | 
	
		
			
				|  |  | -          <div class={[styles.tableWrap, styles.tableWrapEcharts]}>
 | 
	
		
			
				|  |  | -            <NDataTable
 | 
	
		
			
				|  |  | -              v-slots={{
 | 
	
		
			
				|  |  | -                empty: () => <TheEmpty></TheEmpty>
 | 
	
		
			
				|  |  | -              }}
 | 
	
		
			
				|  |  | -              class={styles.classTable}
 | 
	
		
			
				|  |  | -              loading={state.loading}
 | 
	
		
			
				|  |  | -              columns={columns()}
 | 
	
		
			
				|  |  | -              data={state.tableList}></NDataTable>
 | 
	
		
			
				|  |  | -            {/* <Pagination
 | 
	
		
			
				|  |  | -              v-model:page={state.pagination.page}
 | 
	
		
			
				|  |  | -              v-model:pageSize={state.pagination.rows}
 | 
	
		
			
				|  |  | -              v-model:pageTotal={state.pagination.pageTotal}
 | 
	
		
			
				|  |  | -              onList={getList}
 | 
	
		
			
				|  |  | -              sync
 | 
	
		
			
				|  |  | -              saveKey="orchestraRegistration-key"
 | 
	
		
			
				|  |  | -            /> */}
 | 
	
		
			
				|  |  | -          </div>
 | 
	
		
			
				|  |  | -        </div>
 | 
	
		
			
				|  |  | -      </>
 | 
	
		
			
				|  |  | -    );
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -});
 | 
	
		
			
				|  |  | +import { Ref, defineComponent, onMounted, reactive, ref } from 'vue';
 | 
	
		
			
				|  |  | +import styles from '../index.module.less';
 | 
	
		
			
				|  |  | +import {
 | 
	
		
			
				|  |  | +  NButton,
 | 
	
		
			
				|  |  | +  NDataTable,
 | 
	
		
			
				|  |  | +  NForm,
 | 
	
		
			
				|  |  | +  NFormItem,
 | 
	
		
			
				|  |  | +  NNumberAnimation,
 | 
	
		
			
				|  |  | +  NSpace
 | 
	
		
			
				|  |  | +} from 'naive-ui';
 | 
	
		
			
				|  |  | +import numeral from 'numeral';
 | 
	
		
			
				|  |  | +import { useECharts } from '@/hooks/web/useECharts';
 | 
	
		
			
				|  |  | +import Pagination from '/src/components/pagination';
 | 
	
		
			
				|  |  | +import { getTrainingStat } from '../api';
 | 
	
		
			
				|  |  | +import { getTrainingStatList } from '@/views/classList/api';
 | 
	
		
			
				|  |  | +import {
 | 
	
		
			
				|  |  | +  getNowDateAndMonday,
 | 
	
		
			
				|  |  | +  getNowDateAndSunday,
 | 
	
		
			
				|  |  | +  getTimes,
 | 
	
		
			
				|  |  | +  getMinutes,
 | 
	
		
			
				|  |  | +  getSecend,
 | 
	
		
			
				|  |  | +  getHours,
 | 
	
		
			
				|  |  | +  getLastMinutes,
 | 
	
		
			
				|  |  | +  formateSeconds,
 | 
	
		
			
				|  |  | +  getChatMinutes
 | 
	
		
			
				|  |  | +} from '/src/utils/dateFormat';
 | 
	
		
			
				|  |  | +import CDatePicker from '/src/components/CDatePicker';
 | 
	
		
			
				|  |  | +import TheEmpty from '/src/components/TheEmpty';
 | 
	
		
			
				|  |  | +import { initCache, setCache } from '/src/hooks/use-async';
 | 
	
		
			
				|  |  | +import { useRoute } from 'vue-router';
 | 
	
		
			
				|  |  | +export default defineComponent({
 | 
	
		
			
				|  |  | +  name: 'student-practiceData',
 | 
	
		
			
				|  |  | +  props: {
 | 
	
		
			
				|  |  | +    studentId: {
 | 
	
		
			
				|  |  | +      type: String,
 | 
	
		
			
				|  |  | +      default: ''
 | 
	
		
			
				|  |  | +    },
 | 
	
		
			
				|  |  | +    classGroupId: {
 | 
	
		
			
				|  |  | +      type: String,
 | 
	
		
			
				|  |  | +      default: ''
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  },
 | 
	
		
			
				|  |  | +  setup(props) {
 | 
	
		
			
				|  |  | +    const route = useRoute()
 | 
	
		
			
				|  |  | +    const chartRef = ref<HTMLDivElement | null>(null);
 | 
	
		
			
				|  |  | +    const { setOptions } = useECharts(chartRef as Ref<HTMLDivElement>);
 | 
	
		
			
				|  |  | +    const practiceFlag = ref(true);
 | 
	
		
			
				|  |  | +    const payForm = reactive({
 | 
	
		
			
				|  |  | +      height: '360px',
 | 
	
		
			
				|  |  | +      width: '100%',
 | 
	
		
			
				|  |  | +      practiceDurationAvg: 0,
 | 
	
		
			
				|  |  | +      practiceDays: 0,
 | 
	
		
			
				|  |  | +      practiceDurationTotal: 0,
 | 
	
		
			
				|  |  | +      dateList: [],
 | 
	
		
			
				|  |  | +      timeList: []
 | 
	
		
			
				|  |  | +    });
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    const state = reactive({
 | 
	
		
			
				|  |  | +      loading: false,
 | 
	
		
			
				|  |  | +      dayFlag: true,
 | 
	
		
			
				|  |  | +      pagination: {
 | 
	
		
			
				|  |  | +        page: 1,
 | 
	
		
			
				|  |  | +        rows: 10,
 | 
	
		
			
				|  |  | +        pageTotal: 4
 | 
	
		
			
				|  |  | +      },
 | 
	
		
			
				|  |  | +      tableList: [] as any,
 | 
	
		
			
				|  |  | +      goCourseVisiable: false
 | 
	
		
			
				|  |  | +    });
 | 
	
		
			
				|  |  | +    const timer = ref<[number, number]>([
 | 
	
		
			
				|  |  | +      getNowDateAndMonday(new Date().getTime()),
 | 
	
		
			
				|  |  | +      getNowDateAndSunday(new Date().getTime())
 | 
	
		
			
				|  |  | +    ]);
 | 
	
		
			
				|  |  | +    const columns = () => {
 | 
	
		
			
				|  |  | +      return [
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +          title: '日期',
 | 
	
		
			
				|  |  | +          key: 'date'
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +          title: '学练时长',
 | 
	
		
			
				|  |  | +          key: 'practiceDuration',
 | 
	
		
			
				|  |  | +          render(row: any) {
 | 
	
		
			
				|  |  | +            return (
 | 
	
		
			
				|  |  | +              <>
 | 
	
		
			
				|  |  | +                {' '}
 | 
	
		
			
				|  |  | +                <>
 | 
	
		
			
				|  |  | +                  {row.practiceDuration
 | 
	
		
			
				|  |  | +                    ? formateSeconds(row.practiceDuration, 1)
 | 
	
		
			
				|  |  | +                    : 0 + '分钟'}
 | 
	
		
			
				|  |  | +                </>
 | 
	
		
			
				|  |  | +              </>
 | 
	
		
			
				|  |  | +            );
 | 
	
		
			
				|  |  | +          }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +      ];
 | 
	
		
			
				|  |  | +    };
 | 
	
		
			
				|  |  | +    const getList = async () => {
 | 
	
		
			
				|  |  | +      try {
 | 
	
		
			
				|  |  | +        const res = await getTrainingStatList({
 | 
	
		
			
				|  |  | +          page: 1,
 | 
	
		
			
				|  |  | +          rows: 999,
 | 
	
		
			
				|  |  | +          dayFlag: state.dayFlag,
 | 
	
		
			
				|  |  | +          studentId: props.studentId,
 | 
	
		
			
				|  |  | +          classGroupId: props.classGroupId,
 | 
	
		
			
				|  |  | +          ...getTimes(timer.value, ['startTime', 'endTime'], 'YYYY-MM-DD')
 | 
	
		
			
				|  |  | +        });
 | 
	
		
			
				|  |  | +        state.tableList = res.data.rows;
 | 
	
		
			
				|  |  | +      } catch (e) {
 | 
	
		
			
				|  |  | +        console.log(e);
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    };
 | 
	
		
			
				|  |  | +    const setChart = () => {
 | 
	
		
			
				|  |  | +      setOptions({
 | 
	
		
			
				|  |  | +        tooltip: {
 | 
	
		
			
				|  |  | +          trigger: 'axis',
 | 
	
		
			
				|  |  | +          axisPointer: {
 | 
	
		
			
				|  |  | +            type: 'shadow'
 | 
	
		
			
				|  |  | +          }
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  | +        legend: {
 | 
	
		
			
				|  |  | +          show: false,
 | 
	
		
			
				|  |  | +          selected: {
 | 
	
		
			
				|  |  | +            //在这里设置默认展示就ok了
 | 
	
		
			
				|  |  | +            '学练时长(分钟)': practiceFlag.value
 | 
	
		
			
				|  |  | +          }
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  | +        xAxis: {
 | 
	
		
			
				|  |  | +          type: 'category',
 | 
	
		
			
				|  |  | +          boundaryGap: true,
 | 
	
		
			
				|  |  | +          axisLabel: {
 | 
	
		
			
				|  |  | +            show: true
 | 
	
		
			
				|  |  | +            // interval: 0
 | 
	
		
			
				|  |  | +          },
 | 
	
		
			
				|  |  | +          data: payForm.dateList
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  | +        yAxis: [
 | 
	
		
			
				|  |  | +          {
 | 
	
		
			
				|  |  | +            type: 'value',
 | 
	
		
			
				|  |  | +            axisLabel: {
 | 
	
		
			
				|  |  | +              formatter: (value: any) => {
 | 
	
		
			
				|  |  | +                return (value) + 'min';
 | 
	
		
			
				|  |  | +              }
 | 
	
		
			
				|  |  | +            },
 | 
	
		
			
				|  |  | +            axisTick: {
 | 
	
		
			
				|  |  | +              show: false
 | 
	
		
			
				|  |  | +            },
 | 
	
		
			
				|  |  | +            splitArea: {
 | 
	
		
			
				|  |  | +              show: false,
 | 
	
		
			
				|  |  | +              areaStyle: {
 | 
	
		
			
				|  |  | +                color: ['rgba(255,255,255,0.2)']
 | 
	
		
			
				|  |  | +              }
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +          }
 | 
	
		
			
				|  |  | +        ],
 | 
	
		
			
				|  |  | +        grid: {
 | 
	
		
			
				|  |  | +          left: '1%',
 | 
	
		
			
				|  |  | +          right: '1%',
 | 
	
		
			
				|  |  | +          top: '2%',
 | 
	
		
			
				|  |  | +          bottom: 0,
 | 
	
		
			
				|  |  | +          containLabel: true
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  | +        series: [
 | 
	
		
			
				|  |  | +          {
 | 
	
		
			
				|  |  | +            // smooth: true,
 | 
	
		
			
				|  |  | +            data: payForm.timeList,
 | 
	
		
			
				|  |  | +            type: 'line',
 | 
	
		
			
				|  |  | +            // name: '达标人数',
 | 
	
		
			
				|  |  | +            symbolSize: 10,
 | 
	
		
			
				|  |  | +            symbol: 'circle',
 | 
	
		
			
				|  |  | +            smooth: true,
 | 
	
		
			
				|  |  | +            itemStyle: {
 | 
	
		
			
				|  |  | +              color: '#198CFE',
 | 
	
		
			
				|  |  | +              borderColor: '#fff',
 | 
	
		
			
				|  |  | +              borderWidth: 3
 | 
	
		
			
				|  |  | +            },
 | 
	
		
			
				|  |  | +            lineStyle: {
 | 
	
		
			
				|  |  | +              width: 2 //设置线条粗细
 | 
	
		
			
				|  |  | +            },
 | 
	
		
			
				|  |  | +            areaStyle: {
 | 
	
		
			
				|  |  | +              color: {
 | 
	
		
			
				|  |  | +                type: 'linear',
 | 
	
		
			
				|  |  | +                x: 0,
 | 
	
		
			
				|  |  | +                y: 0,
 | 
	
		
			
				|  |  | +                x2: 0,
 | 
	
		
			
				|  |  | +                y2: 1,
 | 
	
		
			
				|  |  | +                colorStops: [
 | 
	
		
			
				|  |  | +                  {
 | 
	
		
			
				|  |  | +                    offset: 0,
 | 
	
		
			
				|  |  | +                    color: 'rgba(212, 231, 255, 1)'
 | 
	
		
			
				|  |  | +                    // 0% 处的颜色
 | 
	
		
			
				|  |  | +                  },
 | 
	
		
			
				|  |  | +                  {
 | 
	
		
			
				|  |  | +                    offset: 1,
 | 
	
		
			
				|  |  | +                    color: 'rgba(221, 235, 254, 0)' // 100% 处的颜色
 | 
	
		
			
				|  |  | +                  }
 | 
	
		
			
				|  |  | +                ]
 | 
	
		
			
				|  |  | +              }
 | 
	
		
			
				|  |  | +            },
 | 
	
		
			
				|  |  | +            emphasis: {
 | 
	
		
			
				|  |  | +              disabled: true
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +          }
 | 
	
		
			
				|  |  | +        ],
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        formatter: (item: any) => {
 | 
	
		
			
				|  |  | +          if (Array.isArray(item)) {
 | 
	
		
			
				|  |  | +            return [
 | 
	
		
			
				|  |  | +              item[0].axisValueLabel,
 | 
	
		
			
				|  |  | +              ...item.map((d: any) => {
 | 
	
		
			
				|  |  | +                let str = formateSeconds(d.value[2], 1)
 | 
	
		
			
				|  |  | +                return `<br/>${d.marker}<span style="margin-top:10px;margin-left:5px;font-size: 13px;font-weight: 500;
 | 
	
		
			
				|  |  | +                  color: #131415;font-weight: 600;
 | 
	
		
			
				|  |  | +                  margin-top:12px
 | 
	
		
			
				|  |  | +                  line-height: 18px;">学练时长: ${str} </span>`;
 | 
	
		
			
				|  |  | +              })
 | 
	
		
			
				|  |  | +            ].join('');
 | 
	
		
			
				|  |  | +          } else {
 | 
	
		
			
				|  |  | +            return item;
 | 
	
		
			
				|  |  | +          }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        // dataZoom: [
 | 
	
		
			
				|  |  | +        //   {
 | 
	
		
			
				|  |  | +        //     type: 'slider',
 | 
	
		
			
				|  |  | +        //     start: 5,
 | 
	
		
			
				|  |  | +        //     end: 100,
 | 
	
		
			
				|  |  | +        //     filterMode: 'empty'
 | 
	
		
			
				|  |  | +        //   }
 | 
	
		
			
				|  |  | +        // ]
 | 
	
		
			
				|  |  | +      });
 | 
	
		
			
				|  |  | +    };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    const getChartDetail = async () => {
 | 
	
		
			
				|  |  | +      try {
 | 
	
		
			
				|  |  | +        const res = await getTrainingStat({
 | 
	
		
			
				|  |  | +          studentId: props.studentId,
 | 
	
		
			
				|  |  | +          dayFlag: state.dayFlag,
 | 
	
		
			
				|  |  | +          classGroupId: props.classGroupId,
 | 
	
		
			
				|  |  | +          ...getTimes(timer.value, ['startTime', 'endTime'], 'YYYY-MM-DD')
 | 
	
		
			
				|  |  | +        });
 | 
	
		
			
				|  |  | +        payForm.practiceDays = res.data.practiceDays;
 | 
	
		
			
				|  |  | +        payForm.practiceDurationAvg = res.data.practiceDurationAvg;
 | 
	
		
			
				|  |  | +        payForm.practiceDurationTotal = res.data.practiceDurationTotal;
 | 
	
		
			
				|  |  | +        payForm.dateList = res.data.trainingStatDetailList.map((item: any) => {
 | 
	
		
			
				|  |  | +          return item.date;
 | 
	
		
			
				|  |  | +        });
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        payForm.timeList = res.data.trainingStatDetailList.map((item: any, index: number) => {
 | 
	
		
			
				|  |  | +          return [index, getChatMinutes(item.practiceDuration), item.practiceDuration];
 | 
	
		
			
				|  |  | +        });
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        setChart();
 | 
	
		
			
				|  |  | +      } catch (e) {
 | 
	
		
			
				|  |  | +        console.log(e);
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    };
 | 
	
		
			
				|  |  | +    const search = () => {
 | 
	
		
			
				|  |  | +      state.pagination.page = 1;
 | 
	
		
			
				|  |  | +      getChartDetail();
 | 
	
		
			
				|  |  | +      getList();
 | 
	
		
			
				|  |  | +      setCache({
 | 
	
		
			
				|  |  | +        current: { timer: timer.value },
 | 
	
		
			
				|  |  | +        saveKey: 'classStudentRecordPracticeData'
 | 
	
		
			
				|  |  | +      });
 | 
	
		
			
				|  |  | +    };
 | 
	
		
			
				|  |  | +    const onReset = () => {
 | 
	
		
			
				|  |  | +      if(route.query.times) {
 | 
	
		
			
				|  |  | +        timer.value = JSON.parse(route.query.times as any)
 | 
	
		
			
				|  |  | +      } else {
 | 
	
		
			
				|  |  | +        timer.value = [
 | 
	
		
			
				|  |  | +          getNowDateAndMonday(new Date().getTime()),
 | 
	
		
			
				|  |  | +          getNowDateAndSunday(new Date().getTime())
 | 
	
		
			
				|  |  | +        ];
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      search();
 | 
	
		
			
				|  |  | +      getList();
 | 
	
		
			
				|  |  | +      setCache({
 | 
	
		
			
				|  |  | +        current: { timer: timer.value },
 | 
	
		
			
				|  |  | +        saveKey: 'classStudentRecordPracticeData'
 | 
	
		
			
				|  |  | +      });
 | 
	
		
			
				|  |  | +    };
 | 
	
		
			
				|  |  | +    initCache({
 | 
	
		
			
				|  |  | +      current: { timer: timer.value },
 | 
	
		
			
				|  |  | +      saveKey: 'classStudentRecordPracticeData',
 | 
	
		
			
				|  |  | +      callBack: (active: any) => {
 | 
	
		
			
				|  |  | +        timer.value = active.timer;
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    });
 | 
	
		
			
				|  |  | +    onMounted(() => {
 | 
	
		
			
				|  |  | +      if(route.query.times) {
 | 
	
		
			
				|  |  | +        timer.value = JSON.parse(route.query.times as any)
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +      getChartDetail();
 | 
	
		
			
				|  |  | +      getList();
 | 
	
		
			
				|  |  | +    });
 | 
	
		
			
				|  |  | +    return () => (
 | 
	
		
			
				|  |  | +      <>
 | 
	
		
			
				|  |  | +        <NSpace justify="space-between">
 | 
	
		
			
				|  |  | +          <NForm label-placement="left" inline>
 | 
	
		
			
				|  |  | +            <NFormItem>
 | 
	
		
			
				|  |  | +              <CDatePicker
 | 
	
		
			
				|  |  | +                v-model:value={timer.value}
 | 
	
		
			
				|  |  | +                separator={'至'}
 | 
	
		
			
				|  |  | +                type="daterange"
 | 
	
		
			
				|  |  | +                timerValue={timer.value}></CDatePicker>
 | 
	
		
			
				|  |  | +            </NFormItem>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            <NFormItem>
 | 
	
		
			
				|  |  | +              <NSpace justify="end">
 | 
	
		
			
				|  |  | +                <NButton type="primary" class="searchBtn" onClick={search}>
 | 
	
		
			
				|  |  | +                  搜索
 | 
	
		
			
				|  |  | +                </NButton>
 | 
	
		
			
				|  |  | +                <NButton type="primary" ghost class="resetBtn" onClick={onReset}>
 | 
	
		
			
				|  |  | +                  重置
 | 
	
		
			
				|  |  | +                </NButton>
 | 
	
		
			
				|  |  | +              </NSpace>
 | 
	
		
			
				|  |  | +            </NFormItem>
 | 
	
		
			
				|  |  | +          </NForm>
 | 
	
		
			
				|  |  | +          <NSpace>
 | 
	
		
			
				|  |  | +            <NButton type="primary" class={state.dayFlag ? "searchDate" : "searchDateDefault"} onClick={() =>{
 | 
	
		
			
				|  |  | +              state.dayFlag = true;
 | 
	
		
			
				|  |  | +              search()
 | 
	
		
			
				|  |  | +            }}>按天</NButton>
 | 
	
		
			
				|  |  | +            <NButton type="primary" class={state.dayFlag ? "searchDateDefault" : "searchDate"} onClick={() =>{
 | 
	
		
			
				|  |  | +              state.dayFlag = false;
 | 
	
		
			
				|  |  | +              search()
 | 
	
		
			
				|  |  | +            }}>按月</NButton>
 | 
	
		
			
				|  |  | +          </NSpace>
 | 
	
		
			
				|  |  | +        </NSpace>
 | 
	
		
			
				|  |  | +        <div class={[styles.homeTrainData, styles.homeTrainDataPractice]}>
 | 
	
		
			
				|  |  | +          <div class={styles.TrainDataTop}>
 | 
	
		
			
				|  |  | +            <div class={styles.TrainDataTopLeft}>
 | 
	
		
			
				|  |  | +              <div class={styles.TrainDataItem}>
 | 
	
		
			
				|  |  | +                <p class={styles.TrainDataItemTitle}>
 | 
	
		
			
				|  |  | +                {getHours(payForm.practiceDurationTotal) > 0 ? (
 | 
	
		
			
				|  |  | +                    <div>
 | 
	
		
			
				|  |  | +                      <span>
 | 
	
		
			
				|  |  | +                        <NNumberAnimation
 | 
	
		
			
				|  |  | +                          from={0}
 | 
	
		
			
				|  |  | +                          to={getHours(
 | 
	
		
			
				|  |  | +                            payForm.practiceDurationTotal
 | 
	
		
			
				|  |  | +                          )}></NNumberAnimation>
 | 
	
		
			
				|  |  | +                      </span>
 | 
	
		
			
				|  |  | +                      <i style={{ width: '4px', display: 'inline-block' }}></i>
 | 
	
		
			
				|  |  | +                      时
 | 
	
		
			
				|  |  | +                      <i style={{ width: '4px', display: 'inline-block' }}></i>
 | 
	
		
			
				|  |  | +                    </div>
 | 
	
		
			
				|  |  | +                  ) : null}
 | 
	
		
			
				|  |  | +                  {getHours(payForm.practiceDurationAvg) > 0 || getLastMinutes(payForm.practiceDurationTotal) > 0 ? (
 | 
	
		
			
				|  |  | +                    <div>
 | 
	
		
			
				|  |  | +                      <span>
 | 
	
		
			
				|  |  | +                        <NNumberAnimation
 | 
	
		
			
				|  |  | +                          from={0}
 | 
	
		
			
				|  |  | +                          to={getLastMinutes(
 | 
	
		
			
				|  |  | +                            payForm.practiceDurationTotal
 | 
	
		
			
				|  |  | +                          )}></NNumberAnimation>
 | 
	
		
			
				|  |  | +                      </span>
 | 
	
		
			
				|  |  | +                      <i style={{ width: '4px', display: 'inline-block' }}></i>
 | 
	
		
			
				|  |  | +                      分
 | 
	
		
			
				|  |  | +                      <i style={{ width: '4px', display: 'inline-block' }}></i>
 | 
	
		
			
				|  |  | +                    </div>
 | 
	
		
			
				|  |  | +                  ) : null}
 | 
	
		
			
				|  |  | +                  <div>
 | 
	
		
			
				|  |  | +                    <span>
 | 
	
		
			
				|  |  | +                      <NNumberAnimation
 | 
	
		
			
				|  |  | +                        from={0}
 | 
	
		
			
				|  |  | +                        to={getSecend(
 | 
	
		
			
				|  |  | +                          payForm.practiceDurationTotal
 | 
	
		
			
				|  |  | +                        )}></NNumberAnimation>
 | 
	
		
			
				|  |  | +                    </span>
 | 
	
		
			
				|  |  | +                    <i style={{ width: '4px', display: 'inline-block' }}></i>秒
 | 
	
		
			
				|  |  | +                  </div>
 | 
	
		
			
				|  |  | +                </p>
 | 
	
		
			
				|  |  | +                <p class={styles.TrainDataItemsubTitle}>累计练习时长</p>
 | 
	
		
			
				|  |  | +              </div>
 | 
	
		
			
				|  |  | +              <div class={styles.TrainDataItem}>
 | 
	
		
			
				|  |  | +                <p class={styles.TrainDataItemTitle}>
 | 
	
		
			
				|  |  | +                {getHours(payForm.practiceDurationAvg) > 0 ? (
 | 
	
		
			
				|  |  | +                    <div>
 | 
	
		
			
				|  |  | +                      <span>
 | 
	
		
			
				|  |  | +                        <NNumberAnimation
 | 
	
		
			
				|  |  | +                          from={0}
 | 
	
		
			
				|  |  | +                          to={getHours(
 | 
	
		
			
				|  |  | +                            payForm.practiceDurationAvg
 | 
	
		
			
				|  |  | +                          )}></NNumberAnimation>
 | 
	
		
			
				|  |  | +                      </span>
 | 
	
		
			
				|  |  | +                      <i style={{ width: '4px', display: 'inline-block' }}></i>
 | 
	
		
			
				|  |  | +                      时
 | 
	
		
			
				|  |  | +                      <i style={{ width: '4px', display: 'inline-block' }}></i>
 | 
	
		
			
				|  |  | +                    </div>
 | 
	
		
			
				|  |  | +                  ) : null}
 | 
	
		
			
				|  |  | +                  {getHours(payForm.practiceDurationAvg) > 0 || getLastMinutes(payForm.practiceDurationAvg) > 0 ? (
 | 
	
		
			
				|  |  | +                    <div>
 | 
	
		
			
				|  |  | +                      <span>
 | 
	
		
			
				|  |  | +                        <NNumberAnimation
 | 
	
		
			
				|  |  | +                          from={0}
 | 
	
		
			
				|  |  | +                          to={getLastMinutes(
 | 
	
		
			
				|  |  | +                            payForm.practiceDurationAvg
 | 
	
		
			
				|  |  | +                          )}></NNumberAnimation>
 | 
	
		
			
				|  |  | +                      </span>
 | 
	
		
			
				|  |  | +                      <i style={{ width: '4px', display: 'inline-block' }}></i>
 | 
	
		
			
				|  |  | +                      分
 | 
	
		
			
				|  |  | +                      <i style={{ width: '4px', display: 'inline-block' }}></i>
 | 
	
		
			
				|  |  | +                    </div>
 | 
	
		
			
				|  |  | +                  ) : null}
 | 
	
		
			
				|  |  | +                  <div>
 | 
	
		
			
				|  |  | +                    <span>
 | 
	
		
			
				|  |  | +                      <NNumberAnimation
 | 
	
		
			
				|  |  | +                        from={0}
 | 
	
		
			
				|  |  | +                        to={getSecend(
 | 
	
		
			
				|  |  | +                          payForm.practiceDurationAvg
 | 
	
		
			
				|  |  | +                        )}></NNumberAnimation>
 | 
	
		
			
				|  |  | +                    </span>
 | 
	
		
			
				|  |  | +                    <i style={{ width: '4px', display: 'inline-block' }}></i>秒
 | 
	
		
			
				|  |  | +                  </div>
 | 
	
		
			
				|  |  | +                </p>
 | 
	
		
			
				|  |  | +                <p class={styles.TrainDataItemsubTitle}>平均每天练习时长</p>
 | 
	
		
			
				|  |  | +              </div>
 | 
	
		
			
				|  |  | +              <div class={styles.TrainDataItem}>
 | 
	
		
			
				|  |  | +                <p class={styles.TrainDataItemTitle}>
 | 
	
		
			
				|  |  | +                  <div>
 | 
	
		
			
				|  |  | +                    <span>
 | 
	
		
			
				|  |  | +                      <NNumberAnimation
 | 
	
		
			
				|  |  | +                        from={0}
 | 
	
		
			
				|  |  | +                        to={payForm.practiceDays}></NNumberAnimation>
 | 
	
		
			
				|  |  | +                    </span>
 | 
	
		
			
				|  |  | +                    <i style={{ width: '4px', display: 'inline-block' }}></i>天
 | 
	
		
			
				|  |  | +                  </div>
 | 
	
		
			
				|  |  | +                </p>
 | 
	
		
			
				|  |  | +                <p class={styles.TrainDataItemsubTitle}>练习天数</p>
 | 
	
		
			
				|  |  | +              </div>
 | 
	
		
			
				|  |  | +            </div>
 | 
	
		
			
				|  |  | +            <div class={styles.TrainDataTopRight}>
 | 
	
		
			
				|  |  | +              <div
 | 
	
		
			
				|  |  | +                // onClick={() => {
 | 
	
		
			
				|  |  | +                //   practiceFlag.value = !practiceFlag.value;
 | 
	
		
			
				|  |  | +                //   setChart();
 | 
	
		
			
				|  |  | +                // }}
 | 
	
		
			
				|  |  | +                class={[
 | 
	
		
			
				|  |  | +                  styles.DataTopRightItem,
 | 
	
		
			
				|  |  | +                  practiceFlag.value ? '' : styles.DataTopRightItemDis
 | 
	
		
			
				|  |  | +                ]}>
 | 
	
		
			
				|  |  | +                <div
 | 
	
		
			
				|  |  | +                  class={[
 | 
	
		
			
				|  |  | +                    styles.DataTopRightDot,
 | 
	
		
			
				|  |  | +                    styles.DataTopRightDotBlue
 | 
	
		
			
				|  |  | +                  ]}></div>
 | 
	
		
			
				|  |  | +                <p>学练时长(分钟)</p>
 | 
	
		
			
				|  |  | +              </div>
 | 
	
		
			
				|  |  | +            </div>
 | 
	
		
			
				|  |  | +          </div>
 | 
	
		
			
				|  |  | +          <div class={styles.chatrs}>
 | 
	
		
			
				|  |  | +            <div
 | 
	
		
			
				|  |  | +              ref={chartRef}
 | 
	
		
			
				|  |  | +              style={{ height: payForm.height, width: payForm.width }}></div>
 | 
	
		
			
				|  |  | +          </div>
 | 
	
		
			
				|  |  | +          <div class={[styles.tableWrap, styles.tableWrapEcharts]}>
 | 
	
		
			
				|  |  | +            <NDataTable
 | 
	
		
			
				|  |  | +              v-slots={{
 | 
	
		
			
				|  |  | +                empty: () => <TheEmpty></TheEmpty>
 | 
	
		
			
				|  |  | +              }}
 | 
	
		
			
				|  |  | +              class={styles.classTable}
 | 
	
		
			
				|  |  | +              loading={state.loading}
 | 
	
		
			
				|  |  | +              columns={columns()}
 | 
	
		
			
				|  |  | +              data={state.tableList}></NDataTable>
 | 
	
		
			
				|  |  | +            {/* <Pagination
 | 
	
		
			
				|  |  | +              v-model:page={state.pagination.page}
 | 
	
		
			
				|  |  | +              v-model:pageSize={state.pagination.rows}
 | 
	
		
			
				|  |  | +              v-model:pageTotal={state.pagination.pageTotal}
 | 
	
		
			
				|  |  | +              onList={getList}
 | 
	
		
			
				|  |  | +              sync
 | 
	
		
			
				|  |  | +              saveKey="orchestraRegistration-key"
 | 
	
		
			
				|  |  | +            /> */}
 | 
	
		
			
				|  |  | +          </div>
 | 
	
		
			
				|  |  | +        </div>
 | 
	
		
			
				|  |  | +      </>
 | 
	
		
			
				|  |  | +    );
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +});
 |