修复登录报错提示内容错误,增加节假日同步功能

This commit is contained in:
qwq
2026-06-04 15:53:23 +08:00
parent 4a8f530921
commit cd63391f89
84 changed files with 874 additions and 31 deletions
+60 -14
View File
@@ -265,14 +265,14 @@
</div>
<!-- Inline Calendar -->
<el-calendar v-model="adminCalendarDate">
<el-calendar v-model="adminCalendarDate" :key="adminCalendarKey">
<template #date-cell="{ data }">
<div class="day-cell-content" @click="handleAdminSelectDate(data.day)">
<div class="day-header">
<span class="day-num">{{ data.day.split('-')[2] }}</span>
<span v-if="isWeekend(data.day)" class="weekend-tag"></span>
<span v-if="data.type === 'current-month' && isRestDay(data.day)" class="weekend-tag"></span>
</div>
<div class="day-body">
<div class="day-body" v-if="data.type === 'current-month'">
<div v-if="getAdminDayHours(data.day) >= 8" class="status-badge filled">
{{ getAdminDayHours(data.day) }}h
</div>
@@ -731,6 +731,7 @@ const adminSelectedDate = ref(new Date().toLocaleDateString('sv-SE', { timeZone:
const calendarRawRecords = ref([])
const gridData = ref([])
const adminRecordsMap = ref({})
const adminCalendarKey = ref(0)
const selectedDeveloperName = computed(() => {
const found = rdUsers.value.find(u => u.id === calendarFilter.user_id)
@@ -756,6 +757,19 @@ const getGridCellHours = (row, day) => {
return hours > 0 ? hours : ''
}
const holidaysMap = ref({})
const loadedHolidayYear = ref(null)
async function loadHolidays(year) {
try {
const res = await adminApi.getHolidays(year)
holidaysMap.value = res.data || {}
adminCalendarKey.value++
} catch (e) {
console.error('Failed to load holidays:', e)
}
}
const getGridCellClass = (row, day) => {
const dStr = `${calendarFilter.month}-${String(day).padStart(2, '0')}`
const hours = row.dates[dStr]?.hours || 0
@@ -764,7 +778,7 @@ const getGridCellClass = (row, day) => {
} else if (hours > 0) {
return 'cell-partial'
} else {
if (dStr < todayStr.value && !isWeekend(dStr)) {
if (dStr < todayStr.value && !isRestDay(dStr)) {
return 'cell-unfilled'
}
return 'cell-neutral'
@@ -777,7 +791,7 @@ const getGridCellTitle = (row, day) => {
if (hours > 0) {
return `${row.user_name}${dStr} 已填报 ${hours}h`
} else {
if (dStr < todayStr.value && !isWeekend(dStr)) {
if (dStr < todayStr.value && !isRestDay(dStr)) {
return `${row.user_name}${dStr} 漏填报`
}
return `${row.user_name}${dStr} 无需填报/未到期`
@@ -789,9 +803,17 @@ const getDayOfWeek = (dayStr) => {
return d.getDay()
}
const isWeekend = (dayStr) => {
const isWorkday = (dayStr) => {
const mmDd = dayStr.substring(5)
if (holidaysMap.value && holidaysMap.value[mmDd]) {
return !holidaysMap.value[mmDd].holiday
}
const day = getDayOfWeek(dayStr)
return day === 0 || day === 6
return day !== 0 && day !== 6
}
const isRestDay = (dayStr) => {
return !isWorkday(dayStr)
}
const getAdminDayHours = (dayStr) => {
@@ -800,7 +822,7 @@ const getAdminDayHours = (dayStr) => {
const isAdminPastUnfilled = (dayStr) => {
if (dayStr >= todayStr.value) return false
if (isWeekend(dayStr)) return false
if (isRestDay(dayStr)) return false
return getAdminDayHours(dayStr) === 0
}
@@ -811,11 +833,19 @@ const adminSelectedDateRecords = computed(() => {
async function loadCalendarData() {
calendarLoading.value = true
try {
const [year, month] = calendarFilter.month.split('-')
const [yearStr, monthStr] = calendarFilter.month.split('-')
const year = parseInt(yearStr)
const month = parseInt(monthStr)
const daysCount = new Date(year, month, 0).getDate()
const start_date = `${calendarFilter.month}-01`
const end_date = `${calendarFilter.month}-${String(daysCount).padStart(2, '0')}`
// Fetch holidays if year changes
if (loadedHolidayYear.value !== year) {
loadedHolidayYear.value = year
await loadHolidays(year)
}
const res = await adminApi.getRdStats({ start_date, end_date })
calendarRawRecords.value = res.data || []
buildGridData()
@@ -856,10 +886,12 @@ function buildGridData() {
userMap[uid].total_hours += r.hours
})
gridData.value = Object.values(userMap).map(u => {
u.total_hours = Math.round(u.total_hours * 10) / 10
return u
})
gridData.value = Object.values(userMap)
.map(u => {
u.total_hours = Math.round(u.total_hours * 10) / 10
return u
})
.filter(u => u.total_hours > 0)
}
function handleCalendarFilterChange() {
@@ -889,6 +921,7 @@ function loadIndividualCalendarData() {
}
})
adminRecordsMap.value = map
adminCalendarKey.value++
const [cy, cm] = calendarFilter.month.split('-').map(Number)
const currentCalDate = adminCalendarDate.value
@@ -926,6 +959,19 @@ watch(adminCalendarDate, (newDate) => {
}
})
watch(rdUsers, () => {
buildGridData()
})
watch(calendarViewMode, (newMode) => {
if (newMode === 'individual') {
if (!calendarFilter.user_id && rdUsers.value.length) {
calendarFilter.user_id = rdUsers.value[0].id
}
loadIndividualCalendarData()
}
})
const individualStats = computed(() => {
const [year, month] = calendarFilter.month.split('-').map(Number)
const daysCount = new Date(year, month, 0).getDate()
@@ -945,7 +991,7 @@ const individualStats = computed(() => {
} else if (hours > 0) {
partialDays++
} else {
if (dStr < todayStr.value && !isWeekend(dStr)) {
if (dStr < todayStr.value && !isRestDay(dStr)) {
unfilledDays++
}
}