| | |
| | | <template> |
| | | <div class="calenBox"> |
| | | <el-calendar ref="calendar" v-model="leftValue" @change="handleMonthChange(date)"> |
| | | <el-calendar ref="calendar" v-model="leftValue"> |
| | | <template #date-cell="{ data }"> |
| | | <div> |
| | | <div :class="data.isSelected ? 'is-selected' : ''"> |
| | | <div class="date-number">{{ data.day.slice(8, 10) }}</div> |
| | | <div class="events"> |
| | | <div |
| | |
| | | :key="index" |
| | | class="event-item" |
| | | :class="event.type" |
| | | @click="jumpcalendar(event, data.day)" |
| | | > |
| | | <span></span> |
| | | {{ event.content }} |
| | | <img :src="getEventIcon(event.type)" alt="" /> |
| | | {{ event.name }}<span>{{ event.value }}</span> |
| | | </div> |
| | | </div> |
| | | </div> |
| | |
| | | <script setup> |
| | | import dayjs from 'dayjs'; |
| | | import { jobEventBar, getCalen } from '@/api/home/index'; |
| | | // 日历事件数据 |
| | | // 格式: 'YYYY-MM-DD': [...events] |
| | | const events = ref({ |
| | | '2025-05-01': [ |
| | | { type: 'work-order', content: '工单26' }, |
| | | { type: 'task', content: '任务26' }, |
| | | ], |
| | | '2025-05-04': [ |
| | | { type: 'task', content: '任务26' }, |
| | | { type: 'work-order', content: '工单26' }, |
| | | ], |
| | | }); |
| | | import { useRouter } from 'vue-router'; |
| | | import ev1 from '@/assets/images/workbench/ev1.png'; |
| | | import ev2 from '@/assets/images/workbench/ev2.png'; |
| | | import { ElMessage } from 'element-plus' |
| | | const router = useRouter(); |
| | | const events = ref({}); |
| | | const params = ref({ |
| | | end_date: undefined, |
| | | start_date: undefined, |
| | | }); |
| | | |
| | | const eventIcons = ref({ |
| | | 'work-order': ev1, |
| | | task: ev2, |
| | | }); |
| | | const getEventIcon = type => { |
| | | return eventIcons.value[type] || eventIcons.value.default; |
| | | }; |
| | | function getCurrentMonthRange() { |
| | | return { |
| | | start_date: dayjs().startOf('month').format('YYYY-MM-DD HH:mm:ss'), |
| | |
| | | watch( |
| | | () => leftValue.value, |
| | | (newV, oldV) => { |
| | | if (newV && dayjs(newV).isSame(dayjs(), 'day')) { |
| | | console.log('点击了今天'); |
| | | } |
| | | |
| | | if (newV && oldV) { |
| | | const newDate = dayjs(newV); |
| | | const oldDate = dayjs(oldV); |
| | | |
| | | if (newDate.isBefore(oldDate, 'month')) { |
| | | console.log('点击了上个月'); |
| | | } else if (newDate.isAfter(oldDate, 'month')) { |
| | | console.log('点击了下个月'); |
| | | } |
| | | params.value = { |
| | | start_date: newDate.startOf('month').format('YYYY-MM-DD HH:mm:ss'), |
| | | end_date: newDate.endOf('month').format('YYYY-MM-DD HH:mm:ss'), |
| | | }; |
| | | getJobEventBar(); |
| | | } |
| | | }, |
| | | { deep: true } |
| | | { deep: true, immediate: true } |
| | | ); |
| | | const handleMonthChange = date => { |
| | | console.log('date', date); |
| | | |
| | | // 获取当前视图月份的第一天 |
| | | const firstDay = new Date(date.getFullYear(), date.getMonth(), 1); |
| | | |
| | | // 获取当前视图月份的最后一天 |
| | | const lastDay = new Date(date.getFullYear(), date.getMonth() + 1, 0); |
| | | |
| | | // 格式化为YYYY-MM-DD格式(可选) |
| | | const formatDate = d => d.toISOString().slice(0, 10); |
| | | |
| | | console.log('首日:', formatDate(firstDay)); |
| | | console.log('末日:', formatDate(lastDay)); |
| | | }; |
| | | // 获取日期数字 |
| | | const getDate = date => { |
| | | return date.getDate(); |
| | | }; |
| | | // 获取对应日期的事件 |
| | | const getEvents = dateString => { |
| | | // console.log('000',dateString); |
| | | |
| | | return events.value[dateString] || []; |
| | | }; |
| | | const monthRange = getCurrentMonthRange(); |
| | | params.value = monthRange; |
| | | const getJobEventBar = () => { |
| | | const monthRange = getCurrentMonthRange(); |
| | | params.value = monthRange; |
| | | console.log(monthRange); |
| | | getCalen(params.value).then(res => { |
| | | if (res.data.code !== 0) return; |
| | | // events.value = res.data.data |
| | | console.log('日历', res.data.data); |
| | | events.value = res.data.data; |
| | | }); |
| | | }; |
| | | const jumpcalendar = (event, day) => { |
| | | if (event.name === '工单') { |
| | | router.push({ |
| | | path: '/tickets/ticket', |
| | | query: { |
| | | day: day, |
| | | }, |
| | | }); |
| | | }else{ |
| | | ElMessage.warning('加急开发中...') |
| | | } |
| | | }; |
| | | onMounted(() => { |
| | | getJobEventBar(); |
| | | }); |
| | | </script> |
| | | <style lang="scss"> |
| | | .calenBox { |
| | | |
| | | .el-calendar-table td.is-selected { |
| | | background-color: #f0f7ff; |
| | | border: 2px solid #409eff; |
| | | border-radius: 4px; |
| | | } |
| | | .el-calendar-table td.is-selected .date-number { |
| | | font-weight: bold; |
| | | color: #409eff; |
| | | } |
| | | |
| | | .el-calendar-table td.is-selected .events { |
| | | // padding: 2px; |
| | | } |
| | | } |
| | | </style> |
| | | <style lang="scss" scoped> |
| | | .calenBox { |
| | | margin-top: 10px; |
| | |
| | | overflow: hidden; |
| | | .event-item { |
| | | font-size: 12px; |
| | | padding: 2px; |
| | | margin: 2px 0; |
| | | // padding: 2px; |
| | | |
| | | border-radius: 3px; |
| | | white-space: nowrap; |
| | | overflow: hidden; |
| | | text-overflow: ellipsis; |
| | | // overflow: hidden; |
| | | // text-overflow: ellipsis; |
| | | |
| | | &.work-order { |
| | | // background: #ecf5ff; |
| | | color: #409eff; |
| | | font-weight: 400; |
| | | font-size: 12px; |
| | | color: #7b7b7b; |
| | | span { |
| | | display: inline-block; |
| | | width: 7px; |
| | | height: 7px; |
| | | background: #1c5cff; |
| | | border-radius: 50%; |
| | | margin-right: 2px; |
| | | font-weight: 600; |
| | | font-size: 14px; |
| | | color: #1c5cff; |
| | | margin-left: 2px; |
| | | } |
| | | } |
| | | |
| | | &.task { |
| | | // background: #f0f9eb; |
| | | color: #67c23a; |
| | | font-weight: 400; |
| | | font-size: 12px; |
| | | color: #7b7b7b; |
| | | span { |
| | | display: inline-block; |
| | | width: 7px; |
| | | height: 7px; |
| | | background: #029d36; |
| | | border-radius: 50%; |
| | | margin-right: 2px; |
| | | font-weight: 600; |
| | | font-size: 14px; |
| | | color: #029d36; |
| | | margin-left: 2px; |
| | | } |
| | | } |
| | | } |