Files
teach_sys_Demo/convertCalendarData.js

174 lines
5.8 KiB
JavaScript
Raw Permalink Normal View History

import fs from 'fs';
// 读取CSV文件
const csvContent = fs.readFileSync('日历课程表.csv', 'utf-8');
const lines = csvContent.split('\n');
// 解析CSV数据
const calendarEvents = [];
let eventId = 1;
// 获取当前日期
const today = new Date();
const currentYear = today.getFullYear();
const currentMonth = today.getMonth() + 1;
const currentDay = today.getDate();
// 颜色映射
const unitColors = {
'岗位体系认知': '#3b82f6',
'产业认知课': '#10b981',
'旅游产业全景与文旅基础知识': '#f59e0b',
'文旅服务:形象、沟通与体验的融合艺术': '#ef4444',
'文旅活动企划与实施': '#8b5cf6',
'设计能力提升': '#06b6d4',
'AIGC人工智能生成内容': '#ec4899',
'全栈新媒体运营赋能文旅营销': '#14b8a6',
'活动策划基础': '#f97316',
'智慧文旅应用': '#6366f1'
};
// 课程状态映射
const getEventStatus = (statusStr, dateStr) => {
const [year, month, day] = dateStr.split('/').map(Number);
const eventDate = new Date(year, month - 1, day);
const today = new Date();
today.setHours(0, 0, 0, 0);
eventDate.setHours(0, 0, 0, 0);
if (statusStr === '已结束') return 'completed';
if (statusStr === '未开始') {
// 检查是否是近期7天内
const daysDiff = Math.floor((eventDate - today) / (1000 * 60 * 60 * 24));
if (daysDiff >= 0 && daysDiff <= 7) return 'upcoming';
return 'future';
}
return 'pending';
};
// 处理每一行数据(跳过标题行)
for (let i = 1; i < lines.length; i++) {
const line = lines[i].trim();
if (!line) continue;
const parts = line.split(',');
if (parts.length < 10) continue;
const date = parts[0];
const weekday = parts[1];
const courseStatus = parts[2];
const courseName = parts[3];
const publicCourse = parts[4];
const time = parts[5];
const teacher = parts[6];
const unit = parts[7];
const status = parts[8];
const className = parts[9];
// 只处理有课的数据
if (courseStatus === '有课' && courseName) {
const [year, month, day] = date.split('/').map(Number);
const timeRange = time.split('~');
// 修复时间格式,去除中文冒号
const startTime = (timeRange[0] || '20:00').replace('', ':');
const endTime = (timeRange[1] || '21:00').replace('', ':');
// 截断过长的课程名称
const truncatedTitle = courseName.length > 12 ? courseName.substring(0, 11) + '...' : courseName;
const event = {
id: eventId++,
title: truncatedTitle,
fullTitle: courseName, // 保留完整标题
teacher: teacher,
unit: unit,
startTime: `${year}-${String(month).padStart(2, '0')}-${String(day).padStart(2, '0')} ${startTime}`,
endTime: `${year}-${String(month).padStart(2, '0')}-${String(day).padStart(2, '0')} ${endTime}`,
type: 'course',
color: unitColors[unit] || '#6b7280',
textColor: '#1d2129', // 添加文字颜色
description: `${unit} - ${teacher}老师`,
status: getEventStatus(status, date),
weekday: weekday
};
calendarEvents.push(event);
}
// 处理公开课
if (publicCourse && publicCourse !== '') {
const [year, month, day] = date.split('/').map(Number);
const timeRange = time.split('~');
const startTime = (timeRange[0] || '20:00').replace('', ':');
const endTime = (timeRange[1] || '21:00').replace('', ':');
// 截断过长的公开课名称
const truncatedTitle = publicCourse.length > 12 ? publicCourse.substring(0, 11) + '...' : publicCourse;
const publicEvent = {
id: eventId++,
title: truncatedTitle,
fullTitle: publicCourse,
teacher: '公开课讲师',
unit: '公开课',
startTime: `${year}-${String(month).padStart(2, '0')}-${String(day).padStart(2, '0')} ${startTime}`,
endTime: `${year}-${String(month).padStart(2, '0')}-${String(day).padStart(2, '0')} ${endTime}`,
type: 'public',
color: '#9333ea',
textColor: '#1d2129',
description: '职业技能公开课',
status: 'upcoming',
weekday: weekday
};
calendarEvents.push(publicEvent);
}
}
// 生成allTasks数据用于Dashboard的任务列表
const allTasks = calendarEvents
.filter(event => {
const eventDate = new Date(event.startTime.split(' ')[0]);
const today = new Date();
const daysDiff = Math.floor((eventDate - today) / (1000 * 60 * 60 * 24));
return daysDiff >= -30 && daysDiff <= 30; // 只保留前后30天的任务
})
.map((event, index) => {
const [date, time] = event.startTime.split(' ');
const typeMap = {
'course': 'HOMEWORK',
'public': 'OTHER',
'lab': 'PROJECT',
'meeting': 'INTERVIEW'
};
return {
id: index + 1,
title: `完成${event.title}课程学习`,
date: date,
time: time,
type: typeMap[event.type] || 'HOMEWORK',
courseName: event.title,
status: event.status === 'completed' ? 'COMPLETED' :
event.status === 'upcoming' ? 'PENDING' : 'PENDING',
teacherName: event.teacher,
teacherAvatar: "https://p1-arco.byteimg.com/tos-cn-i-uwbnlip3yd/3ee5f13fb09879ecb5185e440cef6eb9.png~tplv-uwbnlip3yd-webp.webp",
duration: "1小时"
};
});
// 输出结果
console.log('// 日历事件数据从CSV生成');
console.log('calendarEvents:', JSON.stringify(calendarEvents, null, 2));
console.log('\n// 任务列表数据(从日历事件生成)');
console.log('allTasks:', JSON.stringify(allTasks.slice(0, 20), null, 2)); // 只显示前20个任务
// 写入到文件
const output = {
calendarEvents,
allTasks
};
fs.writeFileSync('calendarData.json', JSON.stringify(output, null, 2));
console.log('\n数据已保存到 calendarData.json');
console.log(`总共生成了 ${calendarEvents.length} 个日历事件和 ${allTasks.length} 个任务`);