|  | @@ -28,6 +28,9 @@
 | 
	
		
			
				|  |  |      <el-calendar v-model="calendarValue">
 | 
	
		
			
				|  |  |        <template #date-cell="{ data }">
 | 
	
		
			
				|  |  |          <div class="calendar-cell" @dblclick="handleDayDblClick(data.day)">
 | 
	
		
			
				|  |  | +          <!-- 红点标记 -->
 | 
	
		
			
				|  |  | +          <div v-if="showRedDot(data.day)" class="red-dot"></div>
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |            <div class="checkbox-status">
 | 
	
		
			
				|  |  |              <el-checkbox
 | 
	
		
			
				|  |  |                :label="formatMonthDay(data.day)"
 | 
	
	
		
			
				|  | @@ -135,7 +138,7 @@ const addHandle = () => {
 | 
	
		
			
				|  |  |        addOrUpdateHandle(undefined, undefined, selectedDates.value);
 | 
	
		
			
				|  |  |      })
 | 
	
		
			
				|  |  |      .catch(() => {
 | 
	
		
			
				|  |  | -      // 用户取消,无需处理
 | 
	
		
			
				|  |  | +      // 取消
 | 
	
		
			
				|  |  |      });
 | 
	
		
			
				|  |  |    } else {
 | 
	
		
			
				|  |  |      // 无冲突,直接新增
 | 
	
	
		
			
				|  | @@ -156,6 +159,7 @@ const addOrUpdateHandle = (id?: number, date?: string, dates?: string[]) => {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  const handleDayDblClick = (day: string) => {
 | 
	
		
			
				|  |  |    const schedule = state.dataList?.find(item => item.scheduleDate === day);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |    if (schedule && schedule.id) {
 | 
	
		
			
				|  |  |      // 已有排班记录,修改
 | 
	
		
			
				|  |  |      addOrUpdateHandle(schedule.id);
 | 
	
	
		
			
				|  | @@ -164,6 +168,39 @@ const handleDayDblClick = (day: string) => {
 | 
	
		
			
				|  |  |      addOrUpdateHandle(undefined, day);
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  };
 | 
	
		
			
				|  |  | +//红点
 | 
	
		
			
				|  |  | +const showRedDot = (date: string): boolean => {
 | 
	
		
			
				|  |  | +  const today = new Date();
 | 
	
		
			
				|  |  | +  const todayStr = today.toISOString().split("T")[0];
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  console.log("cell date:", date, "fake today:", todayStr);
 | 
	
		
			
				|  |  | +  if (date !== todayStr) return false;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  const year = today.getFullYear();
 | 
	
		
			
				|  |  | +  const month = today.getMonth(); // 0-11
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  // 本月最后一天
 | 
	
		
			
				|  |  | +  const lastDateOfMonth = new Date(year, month + 1, 0);
 | 
	
		
			
				|  |  | +  console.log(lastDateOfMonth);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  const lastDayWeekDay = lastDateOfMonth.getDay();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  // 最后一周的周一
 | 
	
		
			
				|  |  | +  const daysToMonday = lastDayWeekDay === 0 ? 6 : lastDayWeekDay - 1;
 | 
	
		
			
				|  |  | +  const lastWeekMonday = new Date(lastDateOfMonth);
 | 
	
		
			
				|  |  | +  lastWeekMonday.setDate(lastDateOfMonth.getDate() - daysToMonday);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  if (today >= lastWeekMonday && today <= lastDateOfMonth) {
 | 
	
		
			
				|  |  | +    const nextYearMonth = new Date(year, month + 1).toISOString().slice(0, 7);
 | 
	
		
			
				|  |  | +    const hasNextMonthSchedule = state.dataList?.some(
 | 
	
		
			
				|  |  | +      item => item.yearMonth === nextYearMonth
 | 
	
		
			
				|  |  | +    );
 | 
	
		
			
				|  |  | +    return !hasNextMonthSchedule;
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  return false;
 | 
	
		
			
				|  |  | +};
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  const handleDateToggle = (day: string, checked: boolean) => {
 | 
	
	
		
			
				|  | @@ -259,6 +296,7 @@ const reviewHandle = (id?: string) => {
 | 
	
		
			
				|  |  |    width: 100%;
 | 
	
		
			
				|  |  |    height: 100%;
 | 
	
		
			
				|  |  |    display: flex;
 | 
	
		
			
				|  |  | +  position: relative;
 | 
	
		
			
				|  |  |    flex-direction: column;
 | 
	
		
			
				|  |  |    align-items: center; 
 | 
	
		
			
				|  |  |    justify-content: flex-start; 
 | 
	
	
		
			
				|  | @@ -287,6 +325,15 @@ const reviewHandle = (id?: string) => {
 | 
	
		
			
				|  |  |    -webkit-user-select: none;
 | 
	
		
			
				|  |  |    -moz-user-select: none;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  | +.red-dot {
 | 
	
		
			
				|  |  | +  width: 8px;
 | 
	
		
			
				|  |  | +  height: 8px;
 | 
	
		
			
				|  |  | +  border-radius: 50%;
 | 
	
		
			
				|  |  | +  background-color: red;
 | 
	
		
			
				|  |  | +  position: absolute;
 | 
	
		
			
				|  |  | +  top: 4px;
 | 
	
		
			
				|  |  | +  right: 6px;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  ::v-deep(.el-calendar-day) {
 |