| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170 | <script lang="ts" setup>  import { RadioGroup, Radio, Divider, TypographyTitle, RadioButton } from 'ant-design-vue';  import FullCalendar from '@fullcalendar/vue3';  import dayGridPlugin from '@fullcalendar/daygrid';  import { CalendarOptions } from '@fullcalendar/core';  import interactionPlugin from '@fullcalendar/interaction';  import { useMessage } from '/@/hooks/web/useMessage';  import { getQueryByTenantId, editDay } from './teachorNoteach.api';  import { useUserStore } from '/@/store/modules/user';  import { h, ref } from 'vue';  import dayjs from 'dayjs';  import { storeToRefs } from 'pinia';  const { userInfo } = storeToRefs(useUserStore());  const { createWarningModal, createMessage } = useMessage();  const isChangeDay = ref(0);  const changeDay = ref(1);  const today = new Date();  const nonTeachingDays = ref<Date[]>([]);  const fullCalendarRef = ref();  const TeachingData = ref<{ day: string; id: string; isTeaching: number; orgCode: string }[]>([]);  const calendarOptions = ref<CalendarOptions>({    plugins: [dayGridPlugin, interactionPlugin],    initialView: 'dayGridMonth',    events: [{ title: '今天', start: new Date() }],    selectable: true,    selectMirror: true,    headerToolbar: {      left: '',      right: '',    },    locale: 'zh-cn',    dayCellClassNames: (arg) => {      const { date } = arg;      const day = date.getDay();      if ((day === 0 || day === 6) && isNonTeachingDay(date)) {        return ['weekend-cell'];      }      // const isPast = date < today && !dayjs(date).isSame(dayjs(today), 'day');      if (isPast(date)) {        return ['past-day'];      }      // 判断是否为非教学日      // const isNonTeachingDay = nonTeachingDays.value.some((d) => dayjs(d).isSame(dayjs(date), 'day'));      if (isNonTeachingDay(date)) {        return ['non-teaching-day'];      }      return [];    },    select: handleClick,  });  function handleClick(selectInfo) {    const clickedDate = selectInfo.start;    // const day = dayjs(clickedDate).day();    if (isPast(clickedDate)) {      //今天之前的日期不允许点击//或者是周末也不允许点击      return;    }    createWarningModal({      title: '日期类型修改',      okText: '确认',      cancelText: '取消',      content() {        const arr = [h(Radio, { value: 0 }, () => '教学日'), h(Radio, { value: 1 }, () => '非教学日')];        return h(          RadioGroup,          {            value: isChangeDay.value,            onChange(e) {              isChangeDay.value = e.target.value;            },          },          () => arr        );      },      okCancel: true,      onOk: async () => {        const findData = TeachingData.value.find((it) => dayjs(it.day).valueOf() == dayjs(clickedDate).valueOf());        if (!findData) return createMessage.error('添加失败,请重新选择');        await editDay({ isTeaching: isChangeDay.value, id: findData.id });        getTimeDay();        fullCalendarRef.value.getApi().render();        if (isChangeDay.value == 2) {          nonTeachingDays.value.push(clickedDate);        } else {          const index = findNonTeachingDayIndex(clickedDate);          if (index > -1) {            nonTeachingDays.value.splice(index, 1);          }        }      },      onCancel: () => {},    });  }  function isNonTeachingDay(date: Date): boolean {    // 判断日期是否为非教学日    return nonTeachingDays.value.some((d) => dayjs(d).isSame(dayjs(date), 'day'));  }  function findNonTeachingDayIndex(clickedDate: Date): number {    // 找到非教学日在数组中的索引    return nonTeachingDays.value.findIndex((d) => dayjs(d).isSame(dayjs(clickedDate), 'day'));  }  function isPast(date) {    return date < today && !dayjs(date).isSame(dayjs(today), 'day');  }  function handleChangeDay() {    if (changeDay.value == 1) {      fullCalendarRef.value.getApi().today();    } else {      fullCalendarRef.value.getApi().next();    }  }  async function getTimeDay() {    const res = await getQueryByTenantId({      orgCode: userInfo.value?.orgCode,    });    TeachingData.value = res;    nonTeachingDays.value = TeachingData.value.filter((it) => it.isTeaching).map((it) => new Date(it.day));    fullCalendarRef.value.getApi().render();  }  getTimeDay();</script><template>  <div class="px-15 py-3 bg-white">    <div class="flex items-center justify-between">      <TypographyTitle :level="3"> {{ changeDay == 1 ? dayjs().format('YYYY-MM') : dayjs().add(1, 'month').format('YYYY-MM') }} </TypographyTitle>      <RadioGroup v-model:value="changeDay" @change="handleChangeDay">        <RadioButton :value="1">今天 </RadioButton>        <RadioButton :value="2">下一个月 </RadioButton>      </RadioGroup>    </div>    <Divider></Divider>    <div class="flex items-center justify-center customer">      <div class="w-70%">        <FullCalendar :options="calendarOptions" ref="fullCalendarRef"> </FullCalendar>      </div>    </div>    <div class="mt-5 w-full text-right"> 红色数字为非教学日,蓝色数字为教学日。 </div>  </div></template><style lang="less" scoped>  .customer {    :deep(.weekend-cell) {      .fc-daygrid-day-number {        color: red !important;      }    }    :deep(.past-day) {      .fc-daygrid-day-number {        color: #ccc;      }    }    :deep(.non-teaching-day) {      .fc-daygrid-day-number {        color: red !important;      }    }    :deep(.fc-col-header) {      .fc-day-sat,      .fc-day-sun {        .fc-col-header-cell-cushion {          color: red !important;        }      }    }  }</style>
 |