|
@@ -1,4 +1,4 @@
|
|
|
-import { defineComponent, reactive, ref } from 'vue'
|
|
|
+import { defineComponent, reactive, ref, shallowReactive } from 'vue'
|
|
|
import styles from './index.module.less'
|
|
|
import iconArrow1 from '../images/icon-arrow1.png'
|
|
|
import iconArrow11 from '../images/icon-arrow1-1.png'
|
|
@@ -11,18 +11,240 @@ import ColHeader from '@/components/col-header'
|
|
|
import TheSticky from '@/components/the-sticky'
|
|
|
import { formatterDatePicker } from '@/helpers/utils'
|
|
|
import dayjs from 'dayjs'
|
|
|
+import request from '@/helpers/request'
|
|
|
+import { getTimeRange, TIME_TYPE } from '../home-statistics'
|
|
|
+import ColResult from '@/components/col-result'
|
|
|
+import { promisefiyPostMessage } from '@/helpers/native-message'
|
|
|
+
|
|
|
+/** 秒转分 */
|
|
|
+export const formatSecToMin = (second: number) => {
|
|
|
+ if (isNaN(second)) {
|
|
|
+ return '0'
|
|
|
+ }
|
|
|
+ const mm = (Math.floor(second / 60) + Math.floor(second % 60) / 60).toFixed(2)
|
|
|
+ return mm
|
|
|
+}
|
|
|
+
|
|
|
+/** 秒转时分秒 */
|
|
|
+export const formatSecToHMS = second => {
|
|
|
+ const hours = Math.floor(second / 3600)
|
|
|
+ .toString()
|
|
|
+ .padStart(2, '0')
|
|
|
+ const minutes = Math.floor((second % 3600) / 60)
|
|
|
+ .toString()
|
|
|
+ .padStart(2, '0')
|
|
|
+ const seconds = Math.round(second % 60)
|
|
|
+ .toString()
|
|
|
+ .padStart(2, '0')
|
|
|
+ return {
|
|
|
+ all: hours + '时' + minutes + '分' + seconds + '秒',
|
|
|
+ hours,
|
|
|
+ minutes,
|
|
|
+ seconds
|
|
|
+ }
|
|
|
+}
|
|
|
|
|
|
export default defineComponent({
|
|
|
name: 'PracticeDetail',
|
|
|
setup() {
|
|
|
const searchStatus = ref(false)
|
|
|
+ const currentType = ref<TIME_TYPE>('MONTH')
|
|
|
+
|
|
|
+ const searchObj = reactive({
|
|
|
+ tempSubjectId: '' as any,
|
|
|
+ type: 'MONTH' as TIME_TYPE
|
|
|
+ })
|
|
|
+ const timeRange = getTimeRange(currentType.value)
|
|
|
const forms = reactive({
|
|
|
+ loading: false,
|
|
|
+ dataShow: true,
|
|
|
+ subjectId: '' as any, // 选择的声部
|
|
|
+ subjectList: [] as any,
|
|
|
startTimeStatus: false,
|
|
|
endTimeMinDate: new Date(),
|
|
|
+ endTimeMaxDate: dayjs(new Date()).add(1, 'year').toDate(),
|
|
|
endTimeStatus: false,
|
|
|
- startTime: new Date(),
|
|
|
- endTime: null as any,
|
|
|
+ startTime: new Date(timeRange?.startTime || ''),
|
|
|
+ startTimeStr: timeRange?.startTime || '',
|
|
|
+ endTime: new Date(timeRange?.endTime || ''),
|
|
|
+ endTimeStr: timeRange?.endTime || ''
|
|
|
+ })
|
|
|
+
|
|
|
+ // 练习统计
|
|
|
+ const practiceSummary = shallowReactive({
|
|
|
+ averagePracticeTime: '0',
|
|
|
+ practiceCount: '0',
|
|
|
+ totalPracticeTime: '0',
|
|
|
+ totalTimes: {
|
|
|
+ hours: '00',
|
|
|
+ minutes: '00',
|
|
|
+ seconds: '00'
|
|
|
+ }
|
|
|
+ })
|
|
|
+ const obj = ref({
|
|
|
+ students: [] as any,
|
|
|
+ xAxisDataTime: [] as any,
|
|
|
+ yAxisDataTime: [] as any,
|
|
|
+ timeCount: 0,
|
|
|
+ timeStr: '',
|
|
|
+ xAxisDataCount: [] as any,
|
|
|
+ yAxisDataCount: [] as any,
|
|
|
+ countCount: 0,
|
|
|
+ countStr: ''
|
|
|
})
|
|
|
+
|
|
|
+ // const searchText = computed(() => {
|
|
|
+ // const template = {
|
|
|
+ // MONTH: '本月',
|
|
|
+ // THREE_MONTH: '近三个月',
|
|
|
+ // HALF_YEAR: '近年半',
|
|
|
+ // YEAR: '近一年'
|
|
|
+ // }
|
|
|
+ // return template[currentType.value]
|
|
|
+ // })
|
|
|
+
|
|
|
+ // 导出学生练习时长数据
|
|
|
+ const onExport = async () => {
|
|
|
+ try {
|
|
|
+ const { data } = await request.post(
|
|
|
+ '/api-teacher/home/exportStudentPractice'
|
|
|
+ )
|
|
|
+ console.log(data, 'data')
|
|
|
+
|
|
|
+ // promisefiyPostMessage({
|
|
|
+ // api: 'downloadFile',
|
|
|
+ // content: {
|
|
|
+ // downloadUrl: staffData.musicPdfUrl,
|
|
|
+ // fileName: songName
|
|
|
+ // }
|
|
|
+ // })
|
|
|
+ } catch {
|
|
|
+ //
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ const getDetail = async () => {
|
|
|
+ forms.loading = true
|
|
|
+ try {
|
|
|
+ const { data } = await request.post('/api-teacher/home/practice', {
|
|
|
+ data: {
|
|
|
+ startTime: forms.startTimeStr,
|
|
|
+ endTime: forms.endTimeStr,
|
|
|
+ subjectId: forms.subjectId
|
|
|
+ }
|
|
|
+ })
|
|
|
+ const summary = data.practiceSummary || {}
|
|
|
+ practiceSummary.averagePracticeTime = formatSecToMin(
|
|
|
+ summary.averagePracticeTime || 0
|
|
|
+ )
|
|
|
+ practiceSummary.practiceCount = summary.practiceCount || 0
|
|
|
+ practiceSummary.totalPracticeTime = summary.totalPracticeTime || 0
|
|
|
+ practiceSummary.totalTimes = formatSecToHMS(
|
|
|
+ summary.totalPracticeTime || 0
|
|
|
+ )
|
|
|
+
|
|
|
+ // 练习时长
|
|
|
+ const practiceTimes = data.practiceTimes || []
|
|
|
+ const xAxisDataTimes: string[] = []
|
|
|
+ const practiceTimeList: number[] = []
|
|
|
+ practiceTimes.forEach((item: any, index: number) => {
|
|
|
+ xAxisDataTimes.push(item.date)
|
|
|
+ practiceTimeList.push(item.practiceTime)
|
|
|
+
|
|
|
+ if (practiceTimes.length - 1 === index) {
|
|
|
+ obj.value.timeCount = item.practiceTime
|
|
|
+ obj.value.timeStr = item.date
|
|
|
+ }
|
|
|
+ })
|
|
|
+
|
|
|
+ // 练习人数
|
|
|
+ const practiceCounts = data.practiceCounts || []
|
|
|
+ const xAxisDataCounts: string[] = []
|
|
|
+ const countList: number[] = []
|
|
|
+ practiceCounts.forEach((item: any, index: number) => {
|
|
|
+ xAxisDataCounts.push(item.date)
|
|
|
+ countList.push(item.practiceTime)
|
|
|
+
|
|
|
+ if (practiceCounts.length - 1 === index) {
|
|
|
+ obj.value.countCount = item.practiceTime
|
|
|
+ obj.value.countStr = item.date
|
|
|
+ }
|
|
|
+ })
|
|
|
+
|
|
|
+ obj.value.xAxisDataTime = xAxisDataTimes
|
|
|
+ obj.value.yAxisDataTime = practiceTimeList
|
|
|
+ obj.value.xAxisDataCount = xAxisDataCounts
|
|
|
+ obj.value.yAxisDataCount = countList
|
|
|
+
|
|
|
+ // 学员练习时长
|
|
|
+ const studentPracticeSummary = data.studentPracticeSummary || []
|
|
|
+ let tempStudents: any = []
|
|
|
+ studentPracticeSummary.forEach((item: any) => {
|
|
|
+ const student = {
|
|
|
+ avatar: item.avatar,
|
|
|
+ averagePracticeTime: formatSecToHMS(item.averagePracticeTime || 0),
|
|
|
+ practiceDays: item.practiceDays || 0,
|
|
|
+ studentName: item.studentName,
|
|
|
+ subjectName: item.subjectName,
|
|
|
+ totalPracticeTime: formatSecToHMS(item.totalPracticeTime || 0)
|
|
|
+ }
|
|
|
+ tempStudents = student
|
|
|
+ })
|
|
|
+ obj.value.students = tempStudents
|
|
|
+
|
|
|
+ forms.dataShow = tempStudents.length > 0 ? true : false
|
|
|
+ } catch {
|
|
|
+ //
|
|
|
+ }
|
|
|
+ forms.loading = false
|
|
|
+ }
|
|
|
+
|
|
|
+ const getSubjectList = async () => {
|
|
|
+ const { data } = await request.get(
|
|
|
+ `api-teacher/subject/subjectSelect?type=MUSIC&clientId=TEACHER`
|
|
|
+ )
|
|
|
+ if (Array.isArray(data)) {
|
|
|
+ // 初始化乐器编号
|
|
|
+ data.forEach((item: any) => {
|
|
|
+ if (Array.isArray(item.subjects)) {
|
|
|
+ item.subjects.forEach((child: any) => {
|
|
|
+ forms.subjectList.push(child)
|
|
|
+ })
|
|
|
+ }
|
|
|
+ })
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ getSubjectList()
|
|
|
+ getDetail()
|
|
|
+
|
|
|
+ const onChangeTime = (type: TIME_TYPE) => {
|
|
|
+ if (searchObj.type === type) return
|
|
|
+ searchObj.type = type
|
|
|
+
|
|
|
+ resetTime(type)
|
|
|
+ }
|
|
|
+ // 格式化
|
|
|
+ const resetTime = (type: TIME_TYPE) => {
|
|
|
+ const timeRang = getTimeRange(type)
|
|
|
+
|
|
|
+ forms.startTime = new Date(timeRang?.startTime || '')
|
|
|
+ forms.startTimeStr = timeRang?.startTime || ''
|
|
|
+ forms.endTimeMinDate = dayjs(timeRang?.startTime || '').toDate()
|
|
|
+ forms.endTimeMaxDate = dayjs(timeRang?.startTime || '')
|
|
|
+ .add(1, 'year')
|
|
|
+ .toDate()
|
|
|
+ forms.endTime = new Date(timeRang?.endTime || '')
|
|
|
+ forms.endTimeStr = timeRang?.endTime || ''
|
|
|
+ }
|
|
|
+
|
|
|
+ // 重置
|
|
|
+ const onConfirm = () => {
|
|
|
+ // timeRange.value = getTimeRange(currentType.value)
|
|
|
+ searchStatus.value = false
|
|
|
+ forms.subjectId = searchObj.tempSubjectId
|
|
|
+ getDetail()
|
|
|
+ }
|
|
|
return () => (
|
|
|
<div class={styles.practiceDetail}>
|
|
|
<TheSticky position="top">
|
|
@@ -42,11 +264,15 @@ export default defineComponent({
|
|
|
</div>
|
|
|
|
|
|
<div class={styles.leaveTime}>
|
|
|
- <span class={styles.num}>23</span>
|
|
|
+ <span class={styles.num}>{practiceSummary.totalTimes.hours}</span>
|
|
|
<span class={styles.text}>时</span>
|
|
|
- <span class={styles.num}>36</span>
|
|
|
+ <span class={styles.num}>
|
|
|
+ {practiceSummary.totalTimes.minutes}
|
|
|
+ </span>
|
|
|
<span class={styles.text}>分</span>
|
|
|
- <span class={styles.num}>23</span>
|
|
|
+ <span class={styles.num}>
|
|
|
+ {practiceSummary.totalTimes.seconds}
|
|
|
+ </span>
|
|
|
<span class={styles.text}>秒</span>
|
|
|
</div>
|
|
|
|
|
@@ -57,7 +283,9 @@ export default defineComponent({
|
|
|
<span>练习人数</span>
|
|
|
</div>
|
|
|
<div class={styles.sBottom}>
|
|
|
- <span class={styles.num}>23</span>
|
|
|
+ <span class={styles.num}>
|
|
|
+ {practiceSummary.practiceCount}
|
|
|
+ </span>
|
|
|
<span class={styles.text}>人</span>
|
|
|
</div>
|
|
|
</div>
|
|
@@ -67,7 +295,9 @@ export default defineComponent({
|
|
|
<span>平均练习时长</span>
|
|
|
</div>
|
|
|
<div class={styles.sBottom}>
|
|
|
- <span class={styles.num}>23</span>
|
|
|
+ <span class={styles.num}>
|
|
|
+ {practiceSummary.averagePracticeTime}
|
|
|
+ </span>
|
|
|
<span class={styles.text}>分钟</span>
|
|
|
</div>
|
|
|
</div>
|
|
@@ -79,7 +309,14 @@ export default defineComponent({
|
|
|
<span>练习时长</span>
|
|
|
</div>
|
|
|
|
|
|
- <Echats />
|
|
|
+ <Echats
|
|
|
+ obj={{
|
|
|
+ xAxisData: obj.value.xAxisDataTime,
|
|
|
+ yAxisData: obj.value.yAxisDataTime,
|
|
|
+ count: obj.value.timeCount,
|
|
|
+ time: obj.value.timeStr
|
|
|
+ }}
|
|
|
+ />
|
|
|
</div>
|
|
|
|
|
|
<div class={styles.section}>
|
|
@@ -87,60 +324,89 @@ export default defineComponent({
|
|
|
<span>练习人数</span>
|
|
|
</div>
|
|
|
|
|
|
- <Echats type="NUM" />
|
|
|
+ <Echats
|
|
|
+ type="NUM"
|
|
|
+ obj={{
|
|
|
+ xAxisData: obj.value.xAxisDataCount,
|
|
|
+ yAxisData: obj.value.yAxisDataCount,
|
|
|
+ count: obj.value.countCount,
|
|
|
+ time: obj.value.countStr
|
|
|
+ }}
|
|
|
+ />
|
|
|
</div>
|
|
|
|
|
|
<div class={styles.section}>
|
|
|
<div class={styles.title}>
|
|
|
<span>学员练习时长</span>
|
|
|
- <div class={styles.download}>
|
|
|
+ <div class={styles.download} onClick={onExport}>
|
|
|
<div>导出</div>
|
|
|
<img src={iconDownload} />
|
|
|
</div>
|
|
|
</div>
|
|
|
|
|
|
<div class={styles.scroll}>
|
|
|
- <table class={styles.dataTable} style={{ width: '486px' }}>
|
|
|
- <colgroup>
|
|
|
- <col style="width: 88px;" />
|
|
|
- <col style="width: 105px;" />
|
|
|
- <col style="width: 106px;" />
|
|
|
- <col style="width: 72px;" />
|
|
|
- <col style="width: 106px;" />
|
|
|
- </colgroup>
|
|
|
- <thead>
|
|
|
- <tr>
|
|
|
- <th class={styles.tdFixedLeft}>学员</th>
|
|
|
- <th>乐器</th>
|
|
|
- <th>
|
|
|
- <div>练习时长</div>
|
|
|
- {/* <div class={styles.filters}>
|
|
|
- </div> */}
|
|
|
- </th>
|
|
|
- <th>练习天数</th>
|
|
|
- <th>平均练习时长</th>
|
|
|
- </tr>
|
|
|
- </thead>
|
|
|
- <tbody>
|
|
|
- {[1, 2, 3, 4, 5, 6, 7, 78, 89].map(() => (
|
|
|
+ {forms.dataShow ? (
|
|
|
+ <table class={styles.dataTable} style={{ width: '486px' }}>
|
|
|
+ <colgroup>
|
|
|
+ <col style="width: 88px;" />
|
|
|
+ <col style="width: 105px;" />
|
|
|
+ <col style="width: 106px;" />
|
|
|
+ <col style="width: 72px;" />
|
|
|
+ <col style="width: 106px;" />
|
|
|
+ </colgroup>
|
|
|
+ <thead>
|
|
|
<tr>
|
|
|
- <td class={styles.tdFixedLeft}>
|
|
|
- <img class={styles.userImg} />
|
|
|
- <span>王曼王曼王曼</span>
|
|
|
- </td>
|
|
|
- <td>长笛</td>
|
|
|
- <td>22小时56分24秒</td>
|
|
|
- <td>8</td>
|
|
|
- <td>22小时56分24秒</td>
|
|
|
+ <th class={styles.tdFixedLeft}>学员</th>
|
|
|
+ <th>乐器</th>
|
|
|
+ <th>
|
|
|
+ <div>练习时长</div>
|
|
|
+ {/* <div class={styles.filters}>
|
|
|
+ </div> */}
|
|
|
+ </th>
|
|
|
+ <th>练习天数</th>
|
|
|
+ <th>平均练习时长</th>
|
|
|
</tr>
|
|
|
- ))}
|
|
|
- </tbody>
|
|
|
- </table>
|
|
|
+ </thead>
|
|
|
+ <tbody>
|
|
|
+ {obj.value.students.map((item: any) => (
|
|
|
+ <tr>
|
|
|
+ <td class={styles.tdFixedLeft}>
|
|
|
+ <img class={styles.userImg} src={item.avatar} />
|
|
|
+ <span>{item.studentName}</span>
|
|
|
+ </td>
|
|
|
+ <td>{item.subjectName}</td>
|
|
|
+ <td>
|
|
|
+ {item.totalPracticeTime.hours}小时
|
|
|
+ {item.totalPracticeTime.minutes}分
|
|
|
+ {item.totalPracticeTime.seconds}秒
|
|
|
+ </td>
|
|
|
+ <td>{item.practiceDays}</td>
|
|
|
+ <td>
|
|
|
+ {item.averagePracticeTime.hours}小时
|
|
|
+ {item.averagePracticeTime.minutes}分
|
|
|
+ {item.averagePracticeTime.seconds}秒
|
|
|
+ </td>
|
|
|
+ </tr>
|
|
|
+ ))}
|
|
|
+ </tbody>
|
|
|
+ </table>
|
|
|
+ ) : (
|
|
|
+ <ColResult
|
|
|
+ classImgSize="SMALL"
|
|
|
+ btnStatus={false}
|
|
|
+ tips="暂无数据~"
|
|
|
+ />
|
|
|
+ )}
|
|
|
</div>
|
|
|
</div>
|
|
|
</div>
|
|
|
|
|
|
- <Popup v-model:show={searchStatus.value} closeable round position="bottom">
|
|
|
+ <Popup
|
|
|
+ v-model:show={searchStatus.value}
|
|
|
+ closeable
|
|
|
+ round
|
|
|
+ position="bottom"
|
|
|
+ >
|
|
|
<div class={styles.popupContainer}>
|
|
|
<div class={styles.popupTitle}>筛选</div>
|
|
|
|
|
@@ -151,16 +417,54 @@ export default defineComponent({
|
|
|
</div>
|
|
|
|
|
|
<div class={styles.timeCount}>
|
|
|
- <p class={styles.active}>本月</p>
|
|
|
- <p>近三个月</p>
|
|
|
- <p>近半年</p>
|
|
|
- <p>近一年</p>
|
|
|
+ <p
|
|
|
+ onClick={() => onChangeTime('MONTH')}
|
|
|
+ class={searchObj.type === 'MONTH' ? styles.active : ''}
|
|
|
+ >
|
|
|
+ 本月
|
|
|
+ </p>
|
|
|
+ <p
|
|
|
+ onClick={() => onChangeTime('THREE_MONTH')}
|
|
|
+ class={
|
|
|
+ searchObj.type === 'THREE_MONTH' ? styles.active : ''
|
|
|
+ }
|
|
|
+ >
|
|
|
+ 近三个月
|
|
|
+ </p>
|
|
|
+ <p
|
|
|
+ onClick={() => onChangeTime('HALF_YEAR')}
|
|
|
+ class={searchObj.type === 'HALF_YEAR' ? styles.active : ''}
|
|
|
+ >
|
|
|
+ 近半年
|
|
|
+ </p>
|
|
|
+ <p
|
|
|
+ onClick={() => onChangeTime('YEAR')}
|
|
|
+ class={searchObj.type === 'YEAR' ? styles.active : ''}
|
|
|
+ >
|
|
|
+ 近一年
|
|
|
+ </p>
|
|
|
</div>
|
|
|
|
|
|
<div class={styles.timeRang}>
|
|
|
- <p class={styles.timeInput} onClick={() => forms.startTimeStatus = true}>起始时间</p>
|
|
|
+ <p
|
|
|
+ class={[
|
|
|
+ styles.timeInput,
|
|
|
+ forms.startTimeStr && styles.hasValue
|
|
|
+ ]}
|
|
|
+ onClick={() => (forms.startTimeStatus = true)}
|
|
|
+ >
|
|
|
+ {forms.startTimeStr || '起始时间'}
|
|
|
+ </p>
|
|
|
<p class={styles.timeUnit}></p>
|
|
|
- <p class={styles.timeInput} onClick={() => forms.endTimeStatus = true}>终止时间</p>
|
|
|
+ <p
|
|
|
+ class={[
|
|
|
+ styles.timeInput,
|
|
|
+ forms.endTimeStr && styles.hasValue
|
|
|
+ ]}
|
|
|
+ onClick={() => (forms.endTimeStatus = true)}
|
|
|
+ >
|
|
|
+ {forms.endTimeStr || '终止时间'}
|
|
|
+ </p>
|
|
|
</div>
|
|
|
</div>
|
|
|
|
|
@@ -170,26 +474,44 @@ export default defineComponent({
|
|
|
</div>
|
|
|
|
|
|
<div class={[styles.timeCount, styles.timeSubject]}>
|
|
|
- <p class={styles.active}>本月</p>
|
|
|
- <p>近三个月</p>
|
|
|
- <p>近半年</p>
|
|
|
- <p>近一年近一年近一年</p>
|
|
|
- <p>近一年</p>
|
|
|
- <p>近一年近一年</p>
|
|
|
- <p>近一年</p>
|
|
|
- <p>近一年</p>
|
|
|
- <p>近一年近一年近一年</p>
|
|
|
- <p>近一年</p>
|
|
|
- <p>近一年近一年</p>
|
|
|
- <p>近一年</p>
|
|
|
- <p>近一年</p>
|
|
|
+ <p
|
|
|
+ class={searchObj.tempSubjectId === '' ? styles.active : ''}
|
|
|
+ onClick={() => (searchObj.tempSubjectId = '')}
|
|
|
+ >
|
|
|
+ 全部
|
|
|
+ </p>
|
|
|
+ {forms.subjectList.map((item: any) => (
|
|
|
+ <p
|
|
|
+ class={
|
|
|
+ searchObj.tempSubjectId === item.id ? styles.active : ''
|
|
|
+ }
|
|
|
+ onClick={() => {
|
|
|
+ searchObj.tempSubjectId = item.id
|
|
|
+ }}
|
|
|
+ >
|
|
|
+ {item.name}
|
|
|
+ </p>
|
|
|
+ ))}
|
|
|
</div>
|
|
|
</div>
|
|
|
</div>
|
|
|
|
|
|
<div class={styles.popupBottom}>
|
|
|
- <Button round block type="default">重置</Button>
|
|
|
- <Button round block type='primary'>确定</Button>
|
|
|
+ <Button
|
|
|
+ round
|
|
|
+ block
|
|
|
+ type="default"
|
|
|
+ onClick={() => {
|
|
|
+ searchObj.tempSubjectId = ''
|
|
|
+ searchObj.type = 'MONTH'
|
|
|
+ resetTime('MONTH')
|
|
|
+ }}
|
|
|
+ >
|
|
|
+ 重置
|
|
|
+ </Button>
|
|
|
+ <Button round block type="primary" onClick={onConfirm}>
|
|
|
+ 确定
|
|
|
+ </Button>
|
|
|
</div>
|
|
|
</div>
|
|
|
</Popup>
|
|
@@ -207,11 +529,15 @@ export default defineComponent({
|
|
|
formatter={formatterDatePicker}
|
|
|
onCancel={() => (forms.startTimeStatus = false)}
|
|
|
onConfirm={(val: any) => {
|
|
|
- console.log(val, 'val')
|
|
|
forms.startTime = val
|
|
|
+ forms.startTimeStr = dayjs(val).format('YYYY-MM-DD')
|
|
|
forms.startTimeStatus = false
|
|
|
forms.endTime = null as any
|
|
|
+ forms.endTimeStr = ''
|
|
|
forms.endTimeMinDate = dayjs(val || new Date()).toDate()
|
|
|
+ forms.endTimeMaxDate = dayjs(val || new Date())
|
|
|
+ .add(1, 'year')
|
|
|
+ .toDate()
|
|
|
}}
|
|
|
/>
|
|
|
</Popup>
|
|
@@ -226,11 +552,13 @@ export default defineComponent({
|
|
|
v-model={forms.endTime}
|
|
|
type="date"
|
|
|
minDate={forms.endTimeMinDate}
|
|
|
+ maxDate={forms.endTimeMaxDate}
|
|
|
formatter={formatterDatePicker}
|
|
|
onCancel={() => (forms.endTimeStatus = false)}
|
|
|
onConfirm={(val: any) => {
|
|
|
forms.endTime = val
|
|
|
forms.endTimeStatus = false
|
|
|
+ forms.endTimeStr = dayjs(val).format('YYYY-MM-DD')
|
|
|
}}
|
|
|
/>
|
|
|
</Popup>
|