feat(Calendar): 添加未来营期显示功能并优化样式
- 新增未来3个营期的预期安排显示功能 - 为未来营期事件添加新的类型和样式 - 优化现有营期事件的样式和显示逻辑 - 修复用户名称动态获取的问题
This commit is contained in:
@@ -584,8 +584,8 @@ const returnToCurrentPeriod = async () => {
|
|||||||
try {
|
try {
|
||||||
// 调用取消切换历史营期API
|
// 调用取消切换历史营期API
|
||||||
await cancelSwitchHistoryCampPeriod({
|
await cancelSwitchHistoryCampPeriod({
|
||||||
"user_name": "潘加俊",
|
user_level: "4",
|
||||||
"user_level": "4"
|
user_name: userStore.userInfo.username
|
||||||
});
|
});
|
||||||
|
|
||||||
selectedHistoryPeriod.value = null;
|
selectedHistoryPeriod.value = null;
|
||||||
@@ -633,7 +633,7 @@ const saveCampSettings = async () => {
|
|||||||
receipt_data_time: campDays.value.toString(),
|
receipt_data_time: campDays.value.toString(),
|
||||||
rest_time: restDays.value.toString(),
|
rest_time: restDays.value.toString(),
|
||||||
user_level: "4",
|
user_level: "4",
|
||||||
user_name: params.user_name || "潘加俊"
|
user_name: params.user_name || userStore.userInfo.username
|
||||||
});
|
});
|
||||||
|
|
||||||
if (result && result.data) {
|
if (result && result.data) {
|
||||||
@@ -677,6 +677,12 @@ const getEventTypeClass = (dateStr) => {
|
|||||||
return 'event-course';
|
return 'event-course';
|
||||||
case 'rest':
|
case 'rest':
|
||||||
return 'event-rest';
|
return 'event-rest';
|
||||||
|
case 'future-data':
|
||||||
|
return 'event-future-data';
|
||||||
|
case 'future-course':
|
||||||
|
return 'event-future-course';
|
||||||
|
case 'future-rest':
|
||||||
|
return 'event-future-rest';
|
||||||
default:
|
default:
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
@@ -684,7 +690,7 @@ const getEventTypeClass = (dateStr) => {
|
|||||||
|
|
||||||
// 方法:判断是否为休息日
|
// 方法:判断是否为休息日
|
||||||
const isRestDay = (dateStr) => {
|
const isRestDay = (dateStr) => {
|
||||||
const dayEvents = events.value.filter(event => event.date === dateStr && event.isCampEvent && event.type === 'rest');
|
const dayEvents = events.value.filter(event => event.date === dateStr && event.isCampEvent && (event.type === 'rest' || event.type === 'future-rest'));
|
||||||
return dayEvents.length > 0;
|
return dayEvents.length > 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -852,7 +858,7 @@ async function CenterCampPeriodAdmin(data = {}) {
|
|||||||
|
|
||||||
// 方法:将营期时间安排映射到日历
|
// 方法:将营期时间安排映射到日历
|
||||||
const mapCampPeriodToCalendar = (campPeriod) => {
|
const mapCampPeriodToCalendar = (campPeriod) => {
|
||||||
// 清除之前的营期相关事件
|
// 清除之前的营期相关事件(包括未来营期)
|
||||||
events.value = events.value.filter(event => !event.isCampEvent);
|
events.value = events.value.filter(event => !event.isCampEvent);
|
||||||
|
|
||||||
let eventId = events.value.length + 1;
|
let eventId = events.value.length + 1;
|
||||||
@@ -917,6 +923,70 @@ const mapCampPeriodToCalendar = (campPeriod) => {
|
|||||||
isCampEvent: true,
|
isCampEvent: true,
|
||||||
type: 'rest'
|
type: 'rest'
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// 只在非历史模式下生成未来3个营期的预期安排
|
||||||
|
if (!isViewingHistory.value) {
|
||||||
|
generateFutureCampPeriods(restDate, eventId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// 生成未来营期的函数
|
||||||
|
const generateFutureCampPeriods = (currentCampEndDate, startEventId) => {
|
||||||
|
let eventId = startEventId;
|
||||||
|
let nextStartDate = new Date(currentCampEndDate);
|
||||||
|
nextStartDate.setDate(nextStartDate.getDate() + 1); // 从当前营期结束后的第二天开始
|
||||||
|
|
||||||
|
// 生成3个未来营期
|
||||||
|
for (let periodIndex = 1; periodIndex <= 3; periodIndex++) {
|
||||||
|
let currentDate = new Date(nextStartDate);
|
||||||
|
|
||||||
|
// 1. 接数据阶段(2天)
|
||||||
|
for (let day = 0; day < 2; day++) {
|
||||||
|
const dateStr = formatDateToString(currentDate);
|
||||||
|
events.value.push({
|
||||||
|
id: eventId++,
|
||||||
|
date: dateStr,
|
||||||
|
title: '接数据',
|
||||||
|
description: `预期第${periodIndex + 1}期营期数据接收阶段`,
|
||||||
|
isCampEvent: true,
|
||||||
|
type: 'future-data',
|
||||||
|
futurePeriod: periodIndex
|
||||||
|
});
|
||||||
|
currentDate.setDate(currentDate.getDate() + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2. 课程阶段(4天连续)
|
||||||
|
const courses = ['课1', '课2', '课3', '课4'];
|
||||||
|
courses.forEach((courseTitle, index) => {
|
||||||
|
const dateStr = formatDateToString(currentDate);
|
||||||
|
events.value.push({
|
||||||
|
id: eventId++,
|
||||||
|
date: dateStr,
|
||||||
|
title: courseTitle,
|
||||||
|
description: `预期第${periodIndex + 1}期营期${courseTitle}阶段`,
|
||||||
|
isCampEvent: true,
|
||||||
|
type: 'future-course',
|
||||||
|
futurePeriod: periodIndex
|
||||||
|
});
|
||||||
|
currentDate.setDate(currentDate.getDate() + 1);
|
||||||
|
});
|
||||||
|
|
||||||
|
// 3. 休息阶段(1天)
|
||||||
|
const restDateStr = formatDateToString(currentDate);
|
||||||
|
events.value.push({
|
||||||
|
id: eventId++,
|
||||||
|
date: restDateStr,
|
||||||
|
title: '休息',
|
||||||
|
description: `预期第${periodIndex + 1}期营期休息日`,
|
||||||
|
isCampEvent: true,
|
||||||
|
type: 'future-rest',
|
||||||
|
futurePeriod: periodIndex
|
||||||
|
});
|
||||||
|
|
||||||
|
// 为下一个营期设置开始日期(休息日后的第二天)
|
||||||
|
nextStartDate = new Date(currentDate);
|
||||||
|
nextStartDate.setDate(nextStartDate.getDate() + 1);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -932,7 +1002,12 @@ const parseDateRange = (dateRangeStr) => {
|
|||||||
|
|
||||||
// 方法:将历史营期数据映射到日历
|
// 方法:将历史营期数据映射到日历
|
||||||
const mapHistoryPeriodToCalendar = (historyPeriod) => {
|
const mapHistoryPeriodToCalendar = (historyPeriod) => {
|
||||||
// 清除之前的营期相关事件
|
// 清除当前营期和未来营期事件,保留其他历史营期事件
|
||||||
|
events.value = events.value.filter(event =>
|
||||||
|
!event.isCampEvent ||
|
||||||
|
(event.type && event.type.startsWith('future-'))
|
||||||
|
);
|
||||||
|
// 然后清除所有营期事件,重新加载历史营期
|
||||||
events.value = events.value.filter(event => !event.isCampEvent);
|
events.value = events.value.filter(event => !event.isCampEvent);
|
||||||
|
|
||||||
let eventId = events.value.length + 1;
|
let eventId = events.value.length + 1;
|
||||||
@@ -1015,27 +1090,107 @@ onMounted(async () => {
|
|||||||
// 如果没有获取到营期数据,添加一些测试数据以便测试结束营期功能
|
// 如果没有获取到营期数据,添加一些测试数据以便测试结束营期功能
|
||||||
if (!result || !result.data || !result.data.camp_period) {
|
if (!result || !result.data || !result.data.camp_period) {
|
||||||
// 添加一些测试营期事件
|
// 添加一些测试营期事件
|
||||||
|
const today = new Date();
|
||||||
|
let eventId = 1000;
|
||||||
|
|
||||||
|
// 接数据阶段(2天)
|
||||||
|
for (let i = 0; i < 2; i++) {
|
||||||
|
const testDate = new Date(today);
|
||||||
|
testDate.setDate(today.getDate() + i);
|
||||||
events.value.push({
|
events.value.push({
|
||||||
id: 999,
|
id: eventId++,
|
||||||
date: formatDateToString(new Date()),
|
date: formatDateToString(testDate),
|
||||||
title: '测试营期',
|
title: '接数据',
|
||||||
description: '测试营期数据',
|
description: '测试营期数据接收阶段',
|
||||||
isCampEvent: true,
|
isCampEvent: true,
|
||||||
type: 'data'
|
type: 'data'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 课程阶段(4天)
|
||||||
|
const courses = ['课1', '课2', '课3', '课4'];
|
||||||
|
courses.forEach((courseTitle, index) => {
|
||||||
|
const testDate = new Date(today);
|
||||||
|
testDate.setDate(today.getDate() + 2 + index);
|
||||||
|
events.value.push({
|
||||||
|
id: eventId++,
|
||||||
|
date: formatDateToString(testDate),
|
||||||
|
title: courseTitle,
|
||||||
|
description: `测试营期${courseTitle}阶段`,
|
||||||
|
isCampEvent: true,
|
||||||
|
type: 'course'
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// 休息日
|
||||||
|
const restDate = new Date(today);
|
||||||
|
restDate.setDate(today.getDate() + 6);
|
||||||
|
events.value.push({
|
||||||
|
id: eventId++,
|
||||||
|
date: formatDateToString(restDate),
|
||||||
|
title: '休息',
|
||||||
|
description: '测试营期休息日',
|
||||||
|
isCampEvent: true,
|
||||||
|
type: 'rest'
|
||||||
|
});
|
||||||
|
|
||||||
|
// 生成未来3个营期的预期安排
|
||||||
|
if (!isViewingHistory.value) {
|
||||||
|
generateFutureCampPeriods(restDate, eventId);
|
||||||
|
}
|
||||||
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('获取营期数据失败:', error);
|
console.error('获取营期数据失败:', error);
|
||||||
// 即使API失败,也添加测试数据
|
// 即使API失败,也添加测试数据
|
||||||
|
const today = new Date();
|
||||||
|
let eventId = 1000;
|
||||||
|
|
||||||
|
// 接数据阶段(2天)
|
||||||
|
for (let i = 0; i < 2; i++) {
|
||||||
|
const testDate = new Date(today);
|
||||||
|
testDate.setDate(today.getDate() + i);
|
||||||
events.value.push({
|
events.value.push({
|
||||||
id: 999,
|
id: eventId++,
|
||||||
date: formatDateToString(new Date()),
|
date: formatDateToString(testDate),
|
||||||
title: '测试营期',
|
title: '接数据',
|
||||||
description: '测试营期数据',
|
description: '测试营期数据接收阶段',
|
||||||
isCampEvent: true,
|
isCampEvent: true,
|
||||||
type: 'data'
|
type: 'data'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 课程阶段(4天)
|
||||||
|
const courses = ['课1', '课2', '课3', '课4'];
|
||||||
|
courses.forEach((courseTitle, index) => {
|
||||||
|
const testDate = new Date(today);
|
||||||
|
testDate.setDate(today.getDate() + 2 + index);
|
||||||
|
events.value.push({
|
||||||
|
id: eventId++,
|
||||||
|
date: formatDateToString(testDate),
|
||||||
|
title: courseTitle,
|
||||||
|
description: `测试营期${courseTitle}阶段`,
|
||||||
|
isCampEvent: true,
|
||||||
|
type: 'course'
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// 休息日
|
||||||
|
const restDate = new Date(today);
|
||||||
|
restDate.setDate(today.getDate() + 6);
|
||||||
|
events.value.push({
|
||||||
|
id: eventId++,
|
||||||
|
date: formatDateToString(restDate),
|
||||||
|
title: '休息',
|
||||||
|
description: '测试营期休息日',
|
||||||
|
isCampEvent: true,
|
||||||
|
type: 'rest'
|
||||||
|
});
|
||||||
|
|
||||||
|
// 生成未来3个营期的预期安排
|
||||||
|
if (!isViewingHistory.value) {
|
||||||
|
generateFutureCampPeriods(restDate, eventId);
|
||||||
|
}
|
||||||
|
}
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
@@ -1172,6 +1327,26 @@ onMounted(async () => {
|
|||||||
background: #ff4757 !important;
|
background: #ff4757 !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.date-cell.has-event .event-dot.event-course {
|
||||||
|
background: #fd7e14 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.date-cell.has-event .event-dot.event-rest {
|
||||||
|
background: #28a745 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.date-cell.has-event .event-dot.event-future-data {
|
||||||
|
background: #74b9ff !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.date-cell.has-event .event-dot.event-future-course {
|
||||||
|
background: #0984e3 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.date-cell.has-event .event-dot.event-future-rest {
|
||||||
|
background: #00b894 !important;
|
||||||
|
}
|
||||||
|
|
||||||
.date-tooltip {
|
.date-tooltip {
|
||||||
position: fixed;
|
position: fixed;
|
||||||
z-index: 1000;
|
z-index: 1000;
|
||||||
@@ -1454,12 +1629,12 @@ onMounted(async () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.event-dot.event-course {
|
.event-dot.event-course {
|
||||||
background: linear-gradient(135deg, #fd7e14, #e55a00);
|
background: #fd7e14;
|
||||||
box-shadow: 0 2px 4px rgba(253, 126, 20, 0.3);
|
box-shadow: 0 2px 4px rgba(253, 126, 20, 0.3);
|
||||||
}
|
}
|
||||||
|
|
||||||
.event-dot.event-rest {
|
.event-dot.event-rest {
|
||||||
background: linear-gradient(135deg, #28a745, #1e7e34);
|
background: #28a745;
|
||||||
box-shadow: 0 2px 4px rgba(40, 167, 69, 0.3);
|
box-shadow: 0 2px 4px rgba(40, 167, 69, 0.3);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1485,6 +1660,22 @@ onMounted(async () => {
|
|||||||
box-shadow: 0 2px 4px rgba(108, 117, 125, 0.3);
|
box-shadow: 0 2px 4px rgba(108, 117, 125, 0.3);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* 未来营期事件点样式 - 蓝色系区分 */
|
||||||
|
.event-dot.event-future-data {
|
||||||
|
background: #74b9ff;
|
||||||
|
box-shadow: 0 2px 4px rgba(116, 185, 255, 0.3);
|
||||||
|
}
|
||||||
|
|
||||||
|
.event-dot.event-future-course {
|
||||||
|
background: #0984e3;
|
||||||
|
box-shadow: 0 2px 4px rgba(9, 132, 227, 0.3);
|
||||||
|
}
|
||||||
|
|
||||||
|
.event-dot.event-future-rest {
|
||||||
|
background: #00b894;
|
||||||
|
box-shadow: 0 2px 4px rgba(0, 184, 148, 0.3);
|
||||||
|
}
|
||||||
|
|
||||||
/* 休息日文字样式 */
|
/* 休息日文字样式 */
|
||||||
.rest-text {
|
.rest-text {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
|
|||||||
Reference in New Issue
Block a user