diff --git a/app/Console/Commands/CheckBirthday.php b/app/Console/Commands/CheckBirthday.php index 26a6839..a87d5c8 100755 --- a/app/Console/Commands/CheckBirthday.php +++ b/app/Console/Commands/CheckBirthday.php @@ -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])); } diff --git a/app/Services/TestData/CourseContentEvaluationTestDataGenerator.php b/app/Services/TestData/CourseContentEvaluationTestDataGenerator.php index ac613c8..d911d0f 100644 --- a/app/Services/TestData/CourseContentEvaluationTestDataGenerator.php +++ b/app/Services/TestData/CourseContentEvaluationTestDataGenerator.php @@ -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() ]);