master
cody 2 months ago
parent 60e2821bb4
commit 4e11516ce2

@ -44,7 +44,8 @@ class CheckBirthday extends Command
*/
public function handle()
{
$users = User::where('is_schoolmate', 1)->where('birthday', date('Y-m-d'))->get();
$day = date('Y-m');
$users = User::where('is_schoolmate', 1)->where('birthday', 'like', '%' . $day . '%')->get();
foreach ($users as $user) {
Notification::send($user, new BirthdayNotify(['user_id' => $user->id]));
}

@ -60,33 +60,34 @@ class CourseContentEvaluationTestDataGenerator
}
// 3) 生成评价问卷主数据
for ($i = 0; $i < $evaluationCount; $i++) {
$courseContent = $allCourseContents->random();
$selectedCourseContents = $allCourseContents->random(min($evaluationCount, $allCourseContents->count()));
foreach ($selectedCourseContents as $courseContent) {
$course = $courses->where('id', $courseContent->course_id)->first();
if (!$course) {
// 如果找不到课程,跳过这个课程内容
continue;
}
$evaluation = $this->createEvaluation($courseContent, $course, $faker);
// 4) 为每个问卷生成问题字段
$askCount = $faker->numberBetween(5, 15);
$asks = $this->createEvaluationAsks($evaluation, $courseContent, $course, $askCount, $faker);
$asks = $this->createEvaluationAsks($evaluation, $courseContent, $course, 0, $faker);
// 5) 生成用户提交的表单数据
$formCount = $faker->numberBetween(10, min(40, $allUsers->count()));
$submittedUsers = $allUsers->random($formCount);
foreach ($submittedUsers as $user) {
$this->createEvaluationForm($evaluation, $user, $asks, $faker);
}
$log(sprintf('评价问卷#%d "%s" 已生成:%d个问题字段%d份用户提交',
$log(sprintf(
'评价问卷#%d "%s" 已生成:%d个问题字段%d份用户提交',
$evaluation->id,
$evaluation->title,
$askCount,
count($asks),
$formCount
));
}
@ -104,11 +105,11 @@ class CourseContentEvaluationTestDataGenerator
$evaluation->title = $this->generateEvaluationTitle($course, $courseContent, $faker);
$evaluation->desc = $this->generateEvaluationDesc($faker);
$evaluation->type_id = $faker->numberBetween(1, 5); // 问卷类型ID
// 时间设置:开始时间在课程内容时间前后,截止时间在开始时间之后
$startTime = $faker->dateTimeBetween('-30 days', '+7 days');
$endTime = $faker->dateTimeBetween($startTime, $startTime->format('Y-m-d H:i:s') . ' +30 days');
$evaluation->start_time = $startTime->format('Y-m-d H:i:s');
$evaluation->end_time = $endTime->format('Y-m-d H:i:s');
$evaluation->status = $faker->randomElement([0, 1]); // 0未发布, 1已发布
@ -124,10 +125,95 @@ class CourseContentEvaluationTestDataGenerator
{
$asks = [];
$fieldTemplates = $this->getEvaluationFieldTemplates();
for ($i = 0; $i < $count; $i++) {
$template = $faker->randomElement($fieldTemplates);
// 为每个课程内容生成4个评价维度的问题课程必要性、理论丰富程度、实践指导意义、讲授能力
$evaluationDimensions = [
'课程必要性',
'理论丰富程度',
'实践指导意义',
'讲授能力'
];
$sort = 1;
// 添加课程内容标题作为分组
$ask = new CourseContentEvaluationAsk();
$ask->admin_id = $faker->numberBetween(1, 10);
$ask->department_id = $faker->numberBetween(1, 5);
$ask->course_id = $course->id;
$ask->course_content_id = $courseContent->id;
$ask->course_content_evaluation_id = $evaluation->id;
$ask->name = $courseContent->theme;
$ask->field = 'course_content_title';
$ask->edit_input = 'text';
$ask->rule = '';
$ask->sort = $sort++;
$ask->help = '课程内容标题';
$ask->select_item = null;
$ask->need_fill = false;
$ask->belong_user = false;
$ask->allow_input = false;
$ask->save();
$asks[] = $ask;
// 为每个评价维度创建问题
foreach ($evaluationDimensions as $dimension) {
$ask = new CourseContentEvaluationAsk();
$ask->admin_id = $faker->numberBetween(1, 10);
$ask->department_id = $faker->numberBetween(1, 5);
$ask->course_id = $course->id;
$ask->course_content_id = $courseContent->id;
$ask->course_content_evaluation_id = $evaluation->id;
$ask->name = $dimension;
$ask->field = strtolower(str_replace(' ', '_', $dimension));
$ask->edit_input = 'radio';
$ask->rule = 'required';
$ask->sort = $sort++;
$ask->help = "请评价该课程的{$dimension}";
$ask->select_item = ['很不满意', '不满意', '一般', '满意', '很满意'];
$ask->need_fill = true;
$ask->belong_user = false;
$ask->allow_input = false;
$ask->save();
$asks[] = $ask;
}
// 添加建议类问题
$suggestionTemplates = array_filter($fieldTemplates, function ($template) {
return $template['edit_input'] === 'textarea';
});
foreach ($suggestionTemplates as $template) {
$ask = new CourseContentEvaluationAsk();
$ask->admin_id = $faker->numberBetween(1, 10);
$ask->department_id = $faker->numberBetween(1, 5);
$ask->course_id = $course->id;
$ask->course_content_id = $courseContent->id;
$ask->course_content_evaluation_id = $evaluation->id;
$ask->name = $template['name'];
$ask->field = $template['field'];
$ask->edit_input = $template['edit_input'];
$ask->rule = $template['rule'];
$ask->sort = $sort++;
$ask->help = $template['help'];
$ask->select_item = $template['select_item'];
$ask->need_fill = $template['need_fill'];
$ask->belong_user = $template['belong_user'];
$ask->allow_input = $template['allow_input'];
$ask->save();
$asks[] = $ask;
}
// 添加姓名字段
$nameTemplate = array_filter($fieldTemplates, function ($template) {
return $template['field'] === 'student_name';
});
if (!empty($nameTemplate)) {
$template = reset($nameTemplate);
$ask = new CourseContentEvaluationAsk();
$ask->admin_id = $faker->numberBetween(1, 10);
$ask->department_id = $faker->numberBetween(1, 5);
@ -135,20 +221,20 @@ class CourseContentEvaluationTestDataGenerator
$ask->course_content_id = $courseContent->id;
$ask->course_content_evaluation_id = $evaluation->id;
$ask->name = $template['name'];
$ask->field = $template['field'] . '_' . ($i + 1);
$ask->field = $template['field'];
$ask->edit_input = $template['edit_input'];
$ask->rule = $template['rule'];
$ask->sort = $i + 1;
$ask->sort = $sort++;
$ask->help = $template['help'];
$ask->select_item = $template['select_item'];
$ask->need_fill = $template['need_fill'];
$ask->belong_user = $template['belong_user'];
$ask->allow_input = $template['allow_input'];
$ask->save();
$asks[] = $ask;
}
return $asks;
}
@ -158,11 +244,11 @@ class CourseContentEvaluationTestDataGenerator
private function createEvaluationForm(CourseContentEvaluation $evaluation, User $user, array $asks, $faker): void
{
$formData = [];
foreach ($asks as $ask) {
$formData[$ask->field] = $this->generateFieldValue($ask, $faker);
}
$form = new CourseContentEvaluationForm();
$form->course_content_evaluation_id = $evaluation->id;
$form->user_id = $user->id;
@ -178,17 +264,20 @@ class CourseContentEvaluationTestDataGenerator
private function generateEvaluationTitle(Course $course, CourseContent $courseContent, $faker): string
{
$templates = [
'《%s》课程满意度调查',
'%s 教学效果评价',
'%s 学习体验反馈',
'关于 %s 的教学质量评估',
'%s 课程内容评价问卷',
'%s 授课情况调研',
'%s 学员反馈调查'
'首期%s课程满意度调查',
'%s%s班第一次课课程满意度调查',
'%s研修班课程满意度调查',
'%s培训课程满意度调查',
'%s课程满意度调查问卷',
'%s课程评价调查',
'%s学习效果评价调查'
];
$courseName = $course->title ?? '课程';
return sprintf($faker->randomElement($templates), $courseName);
$courseName = $course->name ?? '课程';
$classNames = ['攀峰班', '精英班', '进阶班', '基础班', '高级班'];
$className = $faker->randomElement($classNames);
return sprintf($faker->randomElement($templates), $courseName, $className);
}
/**
@ -197,13 +286,13 @@ class CourseContentEvaluationTestDataGenerator
private function generateEvaluationDesc($faker): string
{
$descriptions = [
'为了提升教学质量,改进课程内容,请您根据实际学习体验,客观填写本次评价问卷。您的宝贵意见将帮助我们持续优化课程设计。',
'此次评价旨在了解您对本课程的学习感受和建议。问卷采用匿名形式,请放心填写真实想法,感谢您的配合!',
'请根据您的实际学习情况,对本次课程的各个方面进行客观评价。您的反馈对我们改进教学方法具有重要意义。',
'为持续提升课程品质,特设立本次学员满意度调查。请您花费几分钟时间,帮助我们了解课程的优点与不足。',
'感谢您参与本次课程学习!为了给后续学员提供更好的学习体验,恳请您如实填写这份评价问卷。'
'为了提升研修班教学质量,改进课程内容,请您根据实际学习体验,客观填写本次评价问卷。您的宝贵意见将帮助我们持续优化课程设计。',
'此次评价旨在了解您对本研修班课程的学习感受和建议。问卷采用匿名形式,请放心填写真实想法,感谢您的配合!',
'请根据您的实际学习情况,对本次研修班课程的各个方面进行客观评价。您的反馈对我们改进教学方法具有重要意义。',
'为持续提升研修班课程品质,特设立本次学员满意度调查。请您花费几分钟时间,帮助我们了解课程的优点与不足。',
'感谢您参与本次研修班课程学习!为了给后续学员提供更好的学习体验,恳请您如实填写这份评价问卷。'
];
return $faker->randomElement($descriptions);
}
@ -214,114 +303,92 @@ class CourseContentEvaluationTestDataGenerator
{
return [
[
'name' => '课程内容满意度',
'field' => 'content_satisfaction',
'name' => '课程必要性',
'field' => 'course_necessity',
'edit_input' => 'radio',
'rule' => 'required',
'help' => '请选择您对课程内容的满意程度',
'select_item' => ['非常满意', '满意', '一般', '不满意', '非常不满意'],
'help' => '请评价该课程的必要性',
'select_item' => ['很不满意', '不满意', '一般', '满意', '很满意'],
'need_fill' => true,
'belong_user' => false,
'allow_input' => false
],
[
'name' => '授课方式评价',
'field' => 'teaching_method',
'name' => '理论丰富程度',
'field' => 'theory_richness',
'edit_input' => 'radio',
'rule' => 'required',
'help' => '请评价老师的授课方式',
'select_item' => ['很好', '好', '一般', '较差', '很差'],
'help' => '请评价课程理论的丰富程度',
'select_item' => ['很不满意', '不满意', '一般', '满意', '很满意'],
'need_fill' => true,
'belong_user' => false,
'allow_input' => false
],
[
'name' => '课程难度评价',
'field' => 'difficulty_level',
'name' => '实践指导意义',
'field' => 'practical_guidance',
'edit_input' => 'radio',
'rule' => 'required',
'help' => '您认为课程难度如何',
'select_item' => ['太简单', '偏简单', '适中', '偏难', '太难'],
'help' => '请评价课程的实践指导意义',
'select_item' => ['很不满意', '不满意', '一般', '满意', '很满意'],
'need_fill' => true,
'belong_user' => false,
'allow_input' => false
],
[
'name' => '学习收获评价',
'field' => 'learning_gain',
'edit_input' => 'checkbox',
'rule' => '',
'help' => '您在本次学习中获得了哪些收获(可多选)',
'select_item' => ['理论知识', '实践技能', '思维方法', '行业认知', '人际交往', '其他'],
'need_fill' => false,
'belong_user' => false,
'allow_input' => true
],
[
'name' => '课程推荐度',
'field' => 'recommendation',
'name' => '讲授能力',
'field' => 'teaching_ability',
'edit_input' => 'radio',
'rule' => 'required',
'help' => '您是否愿意向他人推荐此课程',
'select_item' => ['非常愿意', '愿意', '无所谓', '不愿意', '绝对不会'],
'help' => '请评价老师的讲授能力',
'select_item' => ['很不满意', '不满意', '一般', '满意', '很满意'],
'need_fill' => true,
'belong_user' => false,
'allow_input' => false
],
[
'name' => '整体评分',
'field' => 'overall_rating',
'edit_input' => 'select',
'rule' => 'required',
'help' => '请为本次课程打分10分制',
'select_item' => ['10分', '9分', '8分', '7分', '6分', '5分', '4分', '3分', '2分', '1分'],
'need_fill' => true,
'name' => '您对本次培训的课程及老师的资料、专业性等方面有哪些建议?',
'field' => 'course_teacher_suggestions',
'edit_input' => 'textarea',
'rule' => '',
'help' => '请提出您对课程和老师的建议',
'select_item' => null,
'need_fill' => false,
'belong_user' => false,
'allow_input' => false
'allow_input' => true
],
[
'name' => '意见建议',
'field' => 'suggestions',
'name' => '您对培训专题、课程内容、授课师资及形式等方面有哪些建议?',
'field' => 'training_suggestions',
'edit_input' => 'textarea',
'rule' => '',
'help' => '请提出您的宝贵意见和建议',
'help' => '请提出您对培训各方面的建议',
'select_item' => null,
'need_fill' => false,
'belong_user' => false,
'allow_input' => true
],
[
'name' => '您的姓名',
'field' => 'student_name',
'edit_input' => 'text',
'name' => '其他建议',
'field' => 'other_suggestions',
'edit_input' => 'textarea',
'rule' => '',
'help' => '请填写您的真实姓名(可选)',
'help' => '请提出其他建议',
'select_item' => null,
'need_fill' => false,
'belong_user' => true,
'allow_input' => false
'belong_user' => false,
'allow_input' => true
],
[
'name' => '联系方式',
'field' => 'contact_info',
'name' => '如果您愿意,请留下您的姓名(选填)',
'field' => 'student_name',
'edit_input' => 'text',
'rule' => '',
'help' => '如需回访,请留下联系方式',
'help' => '这将帮助我们更好地整理反馈并与您沟通',
'select_item' => null,
'need_fill' => false,
'belong_user' => true,
'allow_input' => false
],
[
'name' => '课堂互动评价',
'field' => 'interaction_rating',
'edit_input' => 'radio',
'rule' => '',
'help' => '您对课堂互动环节的评价',
'select_item' => ['很活跃', '较活跃', '一般', '较沉闷', '很沉闷'],
'need_fill' => false,
'belong_user' => false,
'allow_input' => false
]
];
}
@ -335,33 +402,42 @@ class CourseContentEvaluationTestDataGenerator
case 'radio':
case 'select':
return $faker->randomElement($ask->select_item ?? []);
case 'checkbox':
$options = $ask->select_item ?? [];
$selected = $faker->randomElements($options, $faker->numberBetween(1, min(3, count($options))));
return implode(',', $selected);
case 'textarea':
$suggestions = [
'希望增加更多实践环节',
'课程进度可以适当放慢',
'案例分析很有帮助,建议增加',
'老师讲解很清晰,受益良多',
'课程资料很丰富,感谢分享',
'希望提供更多课后练习',
'建议增加小组讨论时间',
'整体非常满意,期待后续课程'
'希望增加更多实践环节和案例分析',
'课程进度可以适当放慢,便于消化吸收',
'案例分析很有帮助,建议增加更多实际案例',
'老师讲解很清晰,理论联系实际,受益良多',
'课程资料很丰富,感谢分享,希望提供更多参考资料',
'希望提供更多课后练习和讨论机会',
'建议增加小组讨论时间和互动环节',
'整体非常满意,期待后续课程,希望继续深入学习',
'课程内容很实用,对工作有很大帮助',
'老师专业水平很高,讲解深入浅出',
'希望增加更多行业前沿信息分享',
'课程安排合理,时间控制得当',
'建议增加更多实战演练环节',
'课程质量很高,值得推荐给同事',
'希望提供更多学习资源和交流平台'
];
return $faker->optional(0.7)->randomElement($suggestions) ?: '';
case 'text':
if ($ask->field === 'student_name') {
return $faker->optional(0.4)->name ?: '';
} elseif ($ask->field === 'course_content_title') {
return $ask->name; // 返回课程内容标题
} elseif ($ask->field === 'contact_info') {
return $faker->optional(0.3)->phoneNumber ?: '';
}
return $faker->optional(0.5)->words(3, true) ?: '';
default:
return '';
}
@ -373,18 +449,62 @@ class CourseContentEvaluationTestDataGenerator
private function createSampleCoursesAndContents($faker): void
{
$courseData = [
['title' => 'Python 程序设计基础', 'contents' => ['Python 语言概述', '数据类型与变量', '控制结构', '函数与模块', '面向对象编程']],
['title' => '数据库原理与应用', 'contents' => ['数据库基础概念', 'SQL 语言基础', '数据库设计', '事务处理', '性能优化']],
['title' => '项目管理实务', 'contents' => ['项目管理概述', '项目计划制定', '风险管理', '团队管理', '项目收尾']],
['title' => '市场营销学', 'contents' => ['市场营销概论', '消费者行为分析', '产品策略', '价格策略', '推广策略']],
['title' => 'Web 前端开发', 'contents' => ['HTML 基础', 'CSS 样式设计', 'JavaScript 编程', 'Vue.js 框架', '项目实战']]
[
'title' => '苏州市科技企业资本运作研修班',
'contents' => [
'《资本市场深化改革背景下,私募股权基金的专业化发展路径与企业家资本战略选择》——王建平老师',
'《科技创新产业现状与未来趋势(深圳创新实践案例)》——梁永生老师',
'《IPO流程与估值——沙盘演练》——郭圣宇老师',
'《IPO流程与估值——沙盘演练》——张剑波老师',
'《IPO企业常见涉税问题——专题授课》——肖鑫老师',
'《IPO企业财务管理——沙盘演练》——王晓苗老师'
]
],
[
'title' => '企业数字化转型研修班',
'contents' => [
'《数字化转型战略规划》——李明老师',
'《人工智能在企业中的应用》——张华老师',
'《大数据分析与决策支持》——王强老师',
'《云计算与云原生架构》——刘伟老师'
]
],
[
'title' => '创新创业管理研修班',
'contents' => [
'《创业机会识别与商业模式设计》——陈刚老师',
'《创业团队建设与管理》——赵敏老师',
'《融资策略与风险投资》——孙涛老师',
'《知识产权保护与运用》——周琳老师'
]
],
[
'title' => '供应链管理研修班',
'contents' => [
'《供应链战略规划》——吴斌老师',
'《采购管理与供应商关系》——郑红老师',
'《物流配送优化》——马超老师',
'《供应链风险管理》——徐静老师'
]
],
[
'title' => '人力资源管理研修班',
'contents' => [
'《人力资源战略规划》——黄磊老师',
'《招聘与人才发展》——韩雪老师',
'《绩效管理与激励机制》——杨帆老师',
'《企业文化与组织发展》——林峰老师'
]
]
];
foreach ($courseData as $data) {
$course = Course::create([
'title' => $data['title'],
'description' => $data['title'] . '课程',
'name' => $data['title'],
'content' => $data['title'] . '课程',
'status' => 1,
'course_status' => 10, // 进行中
'sign_status' => 10, // 进行中
'created_at' => now(),
'updated_at' => now()
]);
@ -392,10 +512,8 @@ class CourseContentEvaluationTestDataGenerator
foreach ($data['contents'] as $index => $contentTitle) {
CourseContent::create([
'course_id' => $course->id,
'title' => $contentTitle,
'description' => $contentTitle . '相关内容',
'sort' => $index + 1,
'status' => 1,
'theme' => $contentTitle,
'period' => '第' . ($index + 1) . '期',
'created_at' => now(),
'updated_at' => now()
]);

Loading…
Cancel
Save