Files
gongxue-base/apps/server/scripts/generate-student-import-xlsx.ts

107 lines
3.3 KiB
TypeScript

/// <reference types="node" />
import * as ExcelJS from 'exceljs';
import {
STUDENT_IMPORT_COLUMNS,
createStudentImportTemplateWorkbook,
} from '../src/students/student-import';
const count = Number(process.argv[2] || 1000);
const output = process.argv[3] || `student-import-${count}.xlsx`;
function getWorksheetOrThrow(workbook: ExcelJS.Workbook, name: string) {
const sheet = workbook.getWorksheet(name);
if (!sheet) throw new Error(`Worksheet not found: ${name}`);
return sheet;
}
async function main() {
if (!Number.isInteger(count) || count <= 0) {
throw new Error('Count must be a positive integer');
}
const workbook = createStudentImportTemplateWorkbook();
const students = getWorksheetOrThrow(workbook, '学生基础+档案+录取');
const enrollments = getWorksheetOrThrow(workbook, '报读班型');
const examScores = getWorksheetOrThrow(workbook, '考试成绩');
const learningRecords = getWorksheetOrThrow(workbook, '课堂回访');
for (let i = 1; i <= count; i++) {
const serial = String(i).padStart(4, '0');
const phone = `138${String(i).padStart(8, '0')}`;
students.addRow({
phone,
name: `导入学生${serial}`,
studentNo: `GX${serial}`,
gender: i % 2 === 0 ? '女' : '男',
idNumber: `110101200601${String((i % 28) + 1).padStart(2, '0')}${String(i % 1000).padStart(3, '0')}X`,
ethnicity: '汉族',
emergencyContact: `联系人${serial}`,
emergencyPhone: `139${String(i).padStart(8, '0')}`,
organization: '',
supervisor: '',
targetCollege: `目标院校${(i % 20) + 1}`,
targetMajor: `目标专业${(i % 10) + 1}`,
collegeSchool: `大专院校${(i % 12) + 1}`,
collegeMajor: `大专专业${(i % 8) + 1}`,
subjectDirection: ['物化生', '物化地', '史政地'][i % 3],
grade: '高三',
profileDate: '2024-09-01',
notes: '',
cultureFinalScore: 500 + (i % 151),
professionalFinalScore: 300 + (i % 101),
admissionStatus: 'pending',
admittedCollege: '',
admittedMajor: '',
});
enrollments.addRow({
phone,
name: `导入学生${serial}`,
courseCategory: i % 2 === 0 ? 'culture' : 'professional',
classType: i % 3 === 0 ? 'small_group' : 'one_on_one',
className: `导入测试班${(i % 10) + 1}`,
headTeacher: '',
subjectTeacher: '',
startDate: '2024-09-01',
endDate: '2025-06-01',
status: 'active',
});
examScores.addRow({
phone,
name: `导入学生${serial}`,
examType: 'monthly',
examName: '导入测试月考',
subject: '语文',
score: 80 + (i % 41),
classAvg: 90,
rank: (i % 50) + 1,
examDate: '2024-10-15',
enrollmentName: `导入测试班${(i % 10) + 1}`,
});
learningRecords.addRow({
phone,
name: `导入学生${serial}`,
recordDate: '2024-10-20',
recordType: 'study_feedback',
content: `导入测试回访${serial}`,
followUpMethod: 'phone',
nextStep: '',
});
}
for (const sheet of workbook.worksheets) {
sheet.views = [{ state: 'frozen', ySplit: 1 }];
}
await workbook.xlsx.writeFile(output);
console.log(`Generated ${count} students with ${STUDENT_IMPORT_COLUMNS.length} main columns: ${output}`);
}
main().catch((error) => {
console.error(error);
process.exitCode = 1;
});