From b20da3cd063c72579ddaf7860db2be25837c04b8 Mon Sep 17 00:00:00 2001 From: tony Date: Tue, 12 May 2026 12:24:11 +0800 Subject: [PATCH] 2026-05-12 --- ai_project/.claude/agents/demand-assessor.md | 203 + cc-center/FreeSWITCH技术架构与ESL开发指南.txt | 3598 +++++++++ cc-center/chat-📞 呼叫中心系统需求规划.txt | 6953 +++++++++++++++++ cc-center/企业呼叫中心系统需求规格说明书.txt | 871 +++ cc-center/企业呼叫中心系统项目立项书.txt | 711 ++ cc-center/呼叫中心系统开发方案.txt | 1321 ++++ membership/.claude/agents/demand-assessor.md | 203 + membership/.claude/skills/pmassist/SKILL.md | 151 + membership/.claude/skills/tgassist/SKILL.md | 270 + .../00_meta/decision_log.md | 2 + .../00_meta/evidence_index.md | 5 + .../gate_checklists/architecture_review.md | 12 + .../00_meta/gate_checklists/code_review.md | 12 + .../00_meta/gate_checklists/privacy_review.md | 13 + .../gate_checklists/security_review.md | 12 + .../workspace_template/00_meta/gates.md | 43 + .../workspace_template/00_meta/project.yaml | 27 + .../00_meta/questions/round_N.yaml | 7 + .../workspace_template/00_meta/roles.md | 16 + .../00_meta/rounds/round_N.md | 21 + .../workspace_template/00_meta/session.yaml | 43 + .../workspace_template/00_meta/status.md | 10 + .../workspace_template/00_meta/summary.md | 2 + .../01_input/requirements.md | 7 + .../02_acceptance/acceptance.md | 5 + .../02_acceptance/checklist.md | 5 + .../03_plan/dependencies.md | 5 + .../workspace_template/03_plan/milestones.md | 5 + .../workspace_template/03_plan/risks.md | 5 + .../04_design/architecture.md | 7 + .../04_design/data_model.md | 5 + .../04_design/interfaces.md | 5 + .../05_delivery/change_log.md | 5 + .../workspace_template/05_delivery/dev_log.md | 90 + .../06_test_docs/defects.md | 5 + .../06_test_docs/regression.md | 5 + .../06_test_docs/test_cases.md | 5 + .../workspace_template/07_council/decision.md | 5 + .../workspace_template/07_council/review.md | 7 + .../99_archive/release_notes.md | 7 + .../references/gate_recommendation_matrix.md | 16 + .../references/project_yaml_schema.md | 50 + .../references/session_yaml_schema.md | 44 + .../scripts/generate_gate_checklists.sh | 93 + .../skills/tgassist/scripts/init_workspace.sh | 158 + membership/package.json | 18 + membership/scripts/claude-safe-run.js | 94 + .../materials/企业微信截图_17706340271335.png | Bin 0 -> 419341 bytes membership/specs/materials/服务商配置.png | Bin 0 -> 410952 bytes membership/specs/materials/调度日志比价.png | Bin 0 -> 160491 bytes membership/产品需求文档.txt | 2493 ++++++ training-system/.claude/settings.local.json | 21 - training-system/.gitignore | 6 - training-system/.idea/.gitignore | 8 - training-system/.idea/misc.xml | 6 - training-system/.idea/modules.xml | 8 - training-system/.idea/training-system.iml | 9 - training-system/.idea/vcs.xml | 6 - ...-training-system-20260108-1634-会话摘要.md | 28 - ...em-20260108-1721-后端服务及前端页面开发.md | 50 - ...ining-system-20260108-1947-登录功能测试.md | 55 - ...em-20260109-1806-员工管理复测及漏测分析.md | 48 - ...stem-20260109-1808-员工管理模块缺陷修复.md | 57 - ...aining-system-20260112-1953-前端BUG修复.md | 55 - ...ystem-20260113-1138-参与人员保存BUG修复.md | 44 - training-system/CLAUDE.md | 43 - training-system/README.md | 159 - training-system/agents/architect.md | 31 - training-system/agents/backend.md | 30 - training-system/agents/devops.md | 20 - training-system/agents/doc.md | 28 - training-system/agents/frontend.md | 28 - training-system/agents/pm.md | 32 - training-system/agents/qa.md | 29 - training-system/agents/security.md | 29 - training-system/agents/supervisor.md | 34 - training-system/docs/LLR.md | 89 - training-system/docs/TestPlan.md | 412 - training-system/docs/TestPlan_ExamModule.md | 133 - .../docs/TestPlan_TrainingModule.md | 155 - .../docs/TestReport_ExamModule_Regression.md | 175 - .../docs/TestReport_TrainingModule.md | 158 - .../test-reports/BugAnalysis_2.0_Knowledge.md | 449 -- .../RegressionReport_1.3_UserManagement.md | 217 - .../RegressionReport_1.3_UserManagement_V2.md | 374 - .../TestReport_1.3_UserManagement.md | 157 - .../test-reports/TestReport_2.0_Knowledge.md | 177 - .../test-reports/TestReport_3.0_Question.md | 144 - .../docs/test-reports/TestReport_4.0_Paper.md | 127 - .../docs/test-reports/TestReport_5.0_Exam.md | 135 - .../TestReport_6.0_TrainingPlan.md | 119 - .../docs/test-reports/TestReport_Summary.md | 195 - training-system/docs/测试报告-登录模块.md | 310 - training-system/docs/测试报告-题库分类模块.md | 219 - training-system/pom.xml | 151 - training-system/sql/init.sql | 405 - .../sino/training/TrainingApplication.java | 18 - .../common/annotation/RequireRole.java | 22 - .../sino/training/common/base/BaseEntity.java | 43 - .../sino/training/common/base/PageQuery.java | 34 - .../common/config/MybatisPlusConfig.java | 55 - .../common/config/SecurityConfig.java | 51 - .../training/common/config/SwaggerConfig.java | 37 - .../training/common/config/WebMvcConfig.java | 73 - .../training/common/context/UserContext.java | 55 - .../common/context/UserContextHolder.java | 39 - .../common/controller/FileController.java | 51 - .../com/sino/training/common/dto/FileDTO.java | 41 - .../training/common/enums/ContentStatus.java | 49 - .../training/common/enums/ExamStatus.java | 49 - .../training/common/enums/KnowledgeType.java | 44 - .../training/common/enums/PlanStatus.java | 49 - .../training/common/enums/QuestionType.java | 49 - .../training/common/enums/TargetType.java | 49 - .../sino/training/common/enums/UserRole.java | 49 - .../training/common/enums/UserStatus.java | 44 - .../common/exception/BusinessException.java | 49 - .../exception/GlobalExceptionHandler.java | 117 - .../common/interceptor/AuthInterceptor.java | 102 - .../common/interceptor/RoleInterceptor.java | 89 - .../training/common/result/PageResult.java | 80 - .../sino/training/common/result/Result.java | 96 - .../training/common/result/ResultCode.java | 82 - .../training/common/service/FileService.java | 37 - .../service/impl/LocalFileServiceImpl.java | 166 - .../sino/training/common/utils/JwtUtils.java | 123 - .../training/common/utils/SecurityUtils.java | 107 - .../auth/controller/AuthController.java | 52 - .../module/auth/dto/LoginRequest.java | 29 - .../module/auth/dto/LoginResponse.java | 56 - .../module/auth/dto/UserInfoResponse.java | 66 - .../module/auth/dto/WechatLoginRequest.java | 23 - .../module/auth/service/AuthService.java | 42 - .../auth/service/impl/AuthServiceImpl.java | 163 - .../exam/controller/ExamController.java | 119 - .../exam/controller/PaperController.java | 94 - .../QuestionCategoryController.java | 68 - .../exam/controller/QuestionController.java | 90 - .../module/exam/dto/AutoPaperDTO.java | 70 - .../training/module/exam/dto/ExamDTO.java | 86 - .../module/exam/dto/ExamQueryDTO.java | 19 - .../training/module/exam/dto/PaperDTO.java | 53 - .../module/exam/dto/PaperQueryDTO.java | 19 - .../module/exam/dto/QuestionCategoryDTO.java | 33 - .../training/module/exam/dto/QuestionDTO.java | 116 - .../module/exam/dto/QuestionQueryDTO.java | 21 - .../module/exam/dto/SubmitExamDTO.java | 32 - .../training/module/exam/entity/Exam.java | 65 - .../module/exam/entity/ExamRecord.java | 65 - .../module/exam/entity/ExamTarget.java | 33 - .../training/module/exam/entity/Paper.java | 65 - .../module/exam/entity/PaperQuestion.java | 37 - .../training/module/exam/entity/Question.java | 75 - .../module/exam/entity/QuestionCategory.java | 37 - .../module/exam/mapper/ExamMapper.java | 14 - .../module/exam/mapper/ExamRecordMapper.java | 14 - .../module/exam/mapper/ExamTargetMapper.java | 14 - .../module/exam/mapper/PaperMapper.java | 14 - .../exam/mapper/PaperQuestionMapper.java | 14 - .../exam/mapper/QuestionCategoryMapper.java | 14 - .../module/exam/mapper/QuestionMapper.java | 14 - .../exam/service/ExamRecordService.java | 62 - .../module/exam/service/ExamService.java | 38 - .../module/exam/service/PaperService.java | 44 - .../exam/service/QuestionCategoryService.java | 28 - .../module/exam/service/QuestionService.java | 36 - .../service/impl/ExamRecordServiceImpl.java | 424 - .../exam/service/impl/ExamServiceImpl.java | 462 -- .../exam/service/impl/PaperServiceImpl.java | 432 - .../impl/QuestionCategoryServiceImpl.java | 296 - .../service/impl/QuestionServiceImpl.java | 306 - .../training/module/exam/vo/ExamPaperVO.java | 40 - .../training/module/exam/vo/ExamRecordVO.java | 57 - .../sino/training/module/exam/vo/ExamVO.java | 76 - .../sino/training/module/exam/vo/PaperVO.java | 52 - .../module/exam/vo/QuestionCategoryVO.java | 29 - .../training/module/exam/vo/QuestionVO.java | 42 - .../controller/CategoryController.java | 68 - .../controller/KnowledgeController.java | 94 - .../module/knowledge/dto/CategoryDTO.java | 45 - .../module/knowledge/dto/KnowledgeDTO.java | 72 - .../knowledge/dto/KnowledgeQueryDTO.java | 40 - .../module/knowledge/entity/Category.java | 37 - .../module/knowledge/entity/Knowledge.java | 86 - .../knowledge/mapper/CategoryMapper.java | 14 - .../knowledge/mapper/KnowledgeMapper.java | 14 - .../knowledge/service/CategoryService.java | 62 - .../knowledge/service/KnowledgeService.java | 93 - .../service/impl/CategoryServiceImpl.java | 308 - .../service/impl/KnowledgeServiceImpl.java | 346 - .../module/knowledge/vo/CategoryVO.java | 68 - .../module/knowledge/vo/KnowledgeVO.java | 122 - .../system/controller/CenterController.java | 59 - .../controller/DepartmentController.java | 61 - .../system/controller/GroupController.java | 61 - .../controller/OrganizationController.java | 37 - .../system/controller/UserController.java | 113 - .../training/module/system/dto/CenterDTO.java | 33 - .../module/system/dto/DepartmentDTO.java | 40 - .../training/module/system/dto/GroupDTO.java | 40 - .../module/system/dto/PasswordDTO.java | 30 - .../training/module/system/dto/UserDTO.java | 77 - .../module/system/dto/UserQueryDTO.java | 40 - .../training/module/system/entity/Center.java | 27 - .../module/system/entity/Department.java | 32 - .../training/module/system/entity/Group.java | 32 - .../training/module/system/entity/User.java | 69 - .../module/system/mapper/CenterMapper.java | 14 - .../system/mapper/DepartmentMapper.java | 14 - .../module/system/mapper/GroupMapper.java | 14 - .../module/system/mapper/UserMapper.java | 14 - .../module/system/service/CenterService.java | 53 - .../system/service/DepartmentService.java | 54 - .../module/system/service/GroupService.java | 54 - .../system/service/OrganizationService.java | 28 - .../module/system/service/UserService.java | 111 - .../service/impl/CenterServiceImpl.java | 135 - .../service/impl/DepartmentServiceImpl.java | 188 - .../system/service/impl/GroupServiceImpl.java | 168 - .../service/impl/OrganizationServiceImpl.java | 112 - .../system/service/impl/UserServiceImpl.java | 449 -- .../training/module/system/vo/CenterVO.java | 43 - .../module/system/vo/DepartmentVO.java | 53 - .../training/module/system/vo/GroupVO.java | 47 - .../training/module/system/vo/OrgTreeVO.java | 47 - .../training/module/system/vo/UserVO.java | 92 - .../controller/TrainingPlanController.java | 108 - .../module/training/dto/TrainingPlanDTO.java | 74 - .../training/dto/TrainingPlanQueryDTO.java | 19 - .../module/training/entity/PlanExam.java | 37 - .../module/training/entity/PlanKnowledge.java | 37 - .../module/training/entity/PlanProgress.java | 44 - .../module/training/entity/PlanTarget.java | 33 - .../module/training/entity/TrainingPlan.java | 55 - .../training/mapper/PlanExamMapper.java | 14 - .../training/mapper/PlanKnowledgeMapper.java | 14 - .../training/mapper/PlanProgressMapper.java | 14 - .../training/mapper/PlanTargetMapper.java | 14 - .../training/mapper/TrainingPlanMapper.java | 14 - .../training/service/PlanProgressService.java | 48 - .../training/service/TrainingPlanService.java | 62 - .../service/impl/PlanProgressServiceImpl.java | 95 - .../service/impl/TrainingPlanServiceImpl.java | 635 -- .../training/module/training/vo/MyPlanVO.java | 78 - .../module/training/vo/TrainingPlanVO.java | 108 - .../src/main/resources/application-dev.yml | 23 - .../src/main/resources/application-prod.yml | 44 - .../src/main/resources/application.yml | 66 - .../src/main/resources/mapper/.gitkeep | 1 - .../src/main/resources/static/css/common.css | 615 -- .../src/main/resources/static/exam/edit.html | 339 - .../src/main/resources/static/exam/list.html | 245 - .../main/resources/static/exam/my-exams.html | 185 - .../resources/static/exam/paper-edit.html | 506 -- .../resources/static/exam/paper-preview.html | 182 - .../src/main/resources/static/exam/paper.html | 183 - .../static/exam/question-category.html | 111 - .../resources/static/exam/question-edit.html | 426 - .../main/resources/static/exam/question.html | 383 - .../main/resources/static/exam/result.html | 286 - .../main/resources/static/exam/taking.html | 332 - .../src/main/resources/static/index.html | 293 - .../src/main/resources/static/js/common.js | 705 -- .../resources/static/knowledge/category.html | 217 - .../main/resources/static/knowledge/list.html | 574 -- .../main/resources/static/knowledge/view.html | 236 - .../src/main/resources/static/login.html | 365 - .../src/main/resources/static/system/org.html | 170 - .../main/resources/static/system/setting.html | 318 - .../main/resources/static/system/user.html | 164 - .../resources/static/training/detail.html | 185 - .../static/training/my-training.html | 180 - .../resources/static/training/plan-edit.html | 527 -- .../main/resources/static/training/plan.html | 205 - .../training/common/utils/JwtUtilsTest.java | 310 - .../module/auth/LoginIntegrationTest.java | 275 - .../module/auth/PasswordEncoderTest.java | 57 - .../auth/controller/AuthControllerTest.java | 282 - .../module/auth/service/AuthServiceTest.java | 347 - .../QuestionCategoryControllerTest.java | 329 - .../service/QuestionCategoryServiceTest.java | 411 - .../target/classes/application-dev.yml | 23 - .../target/classes/application-prod.yml | 44 - .../target/classes/application.yml | 66 - .../sino/training/TrainingApplication.class | Bin 747 -> 0 bytes .../common/annotation/RequireRole.class | Bin 518 -> 0 bytes .../training/common/base/BaseEntity.class | Bin 3862 -> 0 bytes .../sino/training/common/base/PageQuery.class | Bin 2782 -> 0 bytes .../common/config/MybatisPlusConfig$1.class | Bin 1570 -> 0 bytes .../common/config/MybatisPlusConfig.class | Bin 1902 -> 0 bytes .../common/config/SecurityConfig.class | Bin 4557 -> 0 bytes .../common/config/SwaggerConfig.class | Bin 2673 -> 0 bytes .../training/common/config/WebMvcConfig.class | Bin 3573 -> 0 bytes .../training/common/context/UserContext.class | Bin 4375 -> 0 bytes .../common/context/UserContextHolder.class | Bin 1139 -> 0 bytes .../common/controller/FileController.class | Bin 3213 -> 0 bytes .../sino/training/common/dto/FileDTO.class | Bin 3673 -> 0 bytes .../training/common/enums/ContentStatus.class | Bin 2080 -> 0 bytes .../training/common/enums/ExamStatus.class | Bin 2065 -> 0 bytes .../training/common/enums/KnowledgeType.class | Bin 2002 -> 0 bytes .../training/common/enums/PlanStatus.class | Bin 2065 -> 0 bytes .../training/common/enums/QuestionType.class | Bin 2071 -> 0 bytes .../training/common/enums/TargetType.class | Bin 2046 -> 0 bytes .../sino/training/common/enums/UserRole.class | Bin 2034 -> 0 bytes .../training/common/enums/UserStatus.class | Bin 1982 -> 0 bytes .../common/exception/BusinessException.class | Bin 1411 -> 0 bytes .../exception/GlobalExceptionHandler.class | Bin 8789 -> 0 bytes .../common/interceptor/AuthInterceptor.class | Bin 5252 -> 0 bytes .../common/interceptor/RoleInterceptor.class | Bin 4228 -> 0 bytes .../training/common/result/PageResult.class | Bin 5222 -> 0 bytes .../sino/training/common/result/Result.class | Bin 5716 -> 0 bytes .../training/common/result/ResultCode.class | Bin 4727 -> 0 bytes .../training/common/service/FileService.class | Bin 465 -> 0 bytes .../service/impl/LocalFileServiceImpl.class | Bin 7306 -> 0 bytes .../sino/training/common/utils/JwtUtils.class | Bin 4184 -> 0 bytes .../training/common/utils/SecurityUtils.class | Bin 2229 -> 0 bytes .../auth/controller/AuthController.class | Bin 3236 -> 0 bytes .../module/auth/dto/LoginRequest.class | Bin 2578 -> 0 bytes .../module/auth/dto/LoginResponse.class | Bin 5132 -> 0 bytes .../module/auth/dto/UserInfoResponse.class | Bin 6100 -> 0 bytes .../module/auth/dto/WechatLoginRequest.class | Bin 2083 -> 0 bytes .../module/auth/service/AuthService.class | Bin 549 -> 0 bytes .../auth/service/impl/AuthServiceImpl.class | Bin 8612 -> 0 bytes .../exam/controller/ExamController.class | Bin 7467 -> 0 bytes .../exam/controller/PaperController.class | Bin 5657 -> 0 bytes .../QuestionCategoryController.class | Bin 4161 -> 0 bytes .../exam/controller/QuestionController.class | Bin 5532 -> 0 bytes .../module/exam/dto/AutoPaperDTO.class | Bin 7829 -> 0 bytes .../exam/dto/ExamDTO$ExamTargetDTO.class | Bin 2469 -> 0 bytes .../training/module/exam/dto/ExamDTO.class | Bin 9593 -> 0 bytes .../module/exam/dto/ExamQueryDTO.class | Bin 2831 -> 0 bytes .../exam/dto/PaperDTO$PaperQuestionDTO.class | Bin 2940 -> 0 bytes .../training/module/exam/dto/PaperDTO.class | Bin 6204 -> 0 bytes .../module/exam/dto/PaperQueryDTO.class | Bin 2835 -> 0 bytes .../module/exam/dto/QuestionCategoryDTO.class | Bin 3983 -> 0 bytes .../exam/dto/QuestionDTO$OptionDTO.class | Bin 2407 -> 0 bytes .../QuestionDTO$OptionListDeserializer.class | Bin 3975 -> 0 bytes .../module/exam/dto/QuestionDTO.class | Bin 6396 -> 0 bytes .../module/exam/dto/QuestionQueryDTO.class | Bin 3729 -> 0 bytes .../exam/dto/SubmitExamDTO$AnswerDTO.class | Bin 2469 -> 0 bytes .../module/exam/dto/SubmitExamDTO.class | Bin 3116 -> 0 bytes .../training/module/exam/entity/Exam.class | Bin 6105 -> 0 bytes .../module/exam/entity/ExamRecord.class | Bin 5975 -> 0 bytes .../module/exam/entity/ExamTarget.class | Bin 3125 -> 0 bytes .../training/module/exam/entity/Paper.class | Bin 6148 -> 0 bytes .../module/exam/entity/PaperQuestion.class | Bin 3423 -> 0 bytes .../module/exam/entity/Question.class | Bin 6658 -> 0 bytes .../module/exam/entity/QuestionCategory.class | Bin 3496 -> 0 bytes .../module/exam/mapper/ExamMapper.class | Bin 409 -> 0 bytes .../module/exam/mapper/ExamRecordMapper.class | Bin 427 -> 0 bytes .../module/exam/mapper/ExamTargetMapper.class | Bin 427 -> 0 bytes .../module/exam/mapper/PaperMapper.class | Bin 412 -> 0 bytes .../exam/mapper/PaperQuestionMapper.class | Bin 436 -> 0 bytes .../exam/mapper/QuestionCategoryMapper.class | Bin 445 -> 0 bytes .../module/exam/mapper/QuestionMapper.class | Bin 421 -> 0 bytes .../exam/service/ExamRecordService.class | Bin 1512 -> 0 bytes .../module/exam/service/ExamService.class | Bin 1235 -> 0 bytes .../module/exam/service/PaperService.class | Bin 1484 -> 0 bytes .../service/QuestionCategoryService.class | Bin 1018 -> 0 bytes .../module/exam/service/QuestionService.class | Bin 1530 -> 0 bytes .../impl/ExamRecordServiceImpl$1.class | Bin 906 -> 0 bytes .../ExamRecordServiceImpl$AnswerDetail.class | Bin 3550 -> 0 bytes .../service/impl/ExamRecordServiceImpl.class | Bin 21916 -> 0 bytes .../exam/service/impl/ExamServiceImpl$1.class | Bin 1273 -> 0 bytes .../exam/service/impl/ExamServiceImpl.class | Bin 22311 -> 0 bytes .../service/impl/PaperServiceImpl$1.class | Bin 1290 -> 0 bytes .../exam/service/impl/PaperServiceImpl.class | Bin 21968 -> 0 bytes .../impl/QuestionCategoryServiceImpl.class | Bin 16670 -> 0 bytes .../service/impl/QuestionServiceImpl$1.class | Bin 1299 -> 0 bytes .../service/impl/QuestionServiceImpl.class | Bin 16477 -> 0 bytes .../exam/vo/ExamPaperVO$ExamQuestionVO.class | Bin 5834 -> 0 bytes .../training/module/exam/vo/ExamPaperVO.class | Bin 5392 -> 0 bytes .../exam/vo/ExamRecordVO$AnswerDetailVO.class | Bin 7023 -> 0 bytes .../module/exam/vo/ExamRecordVO.class | Bin 9986 -> 0 bytes .../module/exam/vo/ExamVO$ExamTargetVO.class | Bin 3807 -> 0 bytes .../sino/training/module/exam/vo/ExamVO.class | Bin 14517 -> 0 bytes .../exam/vo/PaperVO$PaperQuestionVO.class | Bin 4017 -> 0 bytes .../training/module/exam/vo/PaperVO.class | Bin 9992 -> 0 bytes .../module/exam/vo/QuestionCategoryVO.class | Bin 6802 -> 0 bytes .../module/exam/vo/QuestionVO$OptionVO.class | Bin 2331 -> 0 bytes .../training/module/exam/vo/QuestionVO.class | Bin 10351 -> 0 bytes .../controller/CategoryController.class | Bin 4123 -> 0 bytes .../controller/KnowledgeController.class | Bin 5447 -> 0 bytes .../module/knowledge/dto/CategoryDTO.class | Bin 3961 -> 0 bytes .../module/knowledge/dto/KnowledgeDTO.class | Bin 6404 -> 0 bytes .../knowledge/dto/KnowledgeQueryDTO.class | Bin 3743 -> 0 bytes .../module/knowledge/entity/Category.class | Bin 3465 -> 0 bytes .../module/knowledge/entity/Knowledge.class | Bin 8256 -> 0 bytes .../knowledge/mapper/CategoryMapper.class | Bin 431 -> 0 bytes .../knowledge/mapper/KnowledgeMapper.class | Bin 434 -> 0 bytes .../knowledge/service/CategoryService.class | Bin 992 -> 0 bytes .../knowledge/service/KnowledgeService.class | Bin 1471 -> 0 bytes .../service/impl/CategoryServiceImpl.class | Bin 16554 -> 0 bytes .../service/impl/KnowledgeServiceImpl$1.class | Bin 1269 -> 0 bytes .../service/impl/KnowledgeServiceImpl.class | Bin 16288 -> 0 bytes .../module/knowledge/vo/CategoryVO.class | Bin 6778 -> 0 bytes .../module/knowledge/vo/KnowledgeVO.class | Bin 12186 -> 0 bytes .../system/controller/CenterController.class | Bin 3563 -> 0 bytes .../controller/DepartmentController.class | Bin 3907 -> 0 bytes .../system/controller/GroupController.class | Bin 3801 -> 0 bytes .../controller/OrganizationController.class | Bin 2154 -> 0 bytes .../system/controller/UserController.class | Bin 6807 -> 0 bytes .../module/system/dto/CenterDTO.class | Bin 3025 -> 0 bytes .../module/system/dto/DepartmentDTO.class | Bin 3591 -> 0 bytes .../training/module/system/dto/GroupDTO.class | Bin 3599 -> 0 bytes .../module/system/dto/PasswordDTO.class | Bin 2690 -> 0 bytes .../training/module/system/dto/UserDTO.class | Bin 6871 -> 0 bytes .../module/system/dto/UserQueryDTO.class | Bin 3696 -> 0 bytes .../module/system/entity/Center.class | Bin 2478 -> 0 bytes .../module/system/entity/Department.class | Bin 2998 -> 0 bytes .../training/module/system/entity/Group.class | Bin 3001 -> 0 bytes .../training/module/system/entity/User.class | Bin 6476 -> 0 bytes .../module/system/mapper/CenterMapper.class | Bin 419 -> 0 bytes .../system/mapper/DepartmentMapper.class | Bin 431 -> 0 bytes .../module/system/mapper/GroupMapper.class | Bin 416 -> 0 bytes .../module/system/mapper/UserMapper.class | Bin 413 -> 0 bytes .../module/system/service/CenterService.class | Bin 846 -> 0 bytes .../system/service/DepartmentService.class | Bin 948 -> 0 bytes .../module/system/service/GroupService.class | Bin 892 -> 0 bytes .../system/service/OrganizationService.class | Bin 427 -> 0 bytes .../module/system/service/UserService.class | Bin 1769 -> 0 bytes .../service/impl/CenterServiceImpl.class | Bin 8810 -> 0 bytes .../service/impl/DepartmentServiceImpl.class | Bin 11021 -> 0 bytes .../service/impl/GroupServiceImpl.class | Bin 9616 -> 0 bytes .../impl/OrganizationServiceImpl.class | Bin 8413 -> 0 bytes .../service/impl/UserServiceImpl$1.class | Bin 1217 -> 0 bytes .../system/service/impl/UserServiceImpl.class | Bin 19798 -> 0 bytes .../training/module/system/vo/CenterVO.class | Bin 4309 -> 0 bytes .../module/system/vo/DepartmentVO.class | Bin 5209 -> 0 bytes .../training/module/system/vo/GroupVO.class | Bin 4451 -> 0 bytes .../training/module/system/vo/OrgTreeVO.class | Bin 4605 -> 0 bytes .../training/module/system/vo/UserVO.class | Bin 8723 -> 0 bytes .../controller/TrainingPlanController.class | Bin 6806 -> 0 bytes .../dto/TrainingPlanDTO$PlanExamDTO.class | Bin 3031 -> 0 bytes .../TrainingPlanDTO$PlanKnowledgeDTO.class | Bin 3086 -> 0 bytes .../dto/TrainingPlanDTO$PlanTargetDTO.class | Bin 2521 -> 0 bytes .../module/training/dto/TrainingPlanDTO.class | Bin 7540 -> 0 bytes .../training/dto/TrainingPlanQueryDTO.class | Bin 2871 -> 0 bytes .../module/training/entity/PlanExam.class | Bin 3463 -> 0 bytes .../training/entity/PlanKnowledge.class | Bin 3523 -> 0 bytes .../module/training/entity/PlanProgress.class | Bin 4085 -> 0 bytes .../module/training/entity/PlanTarget.class | Bin 3133 -> 0 bytes .../module/training/entity/TrainingPlan.class | Bin 5103 -> 0 bytes .../training/mapper/PlanExamMapper.class | Bin 429 -> 0 bytes .../training/mapper/PlanKnowledgeMapper.class | Bin 444 -> 0 bytes .../training/mapper/PlanProgressMapper.class | Bin 441 -> 0 bytes .../training/mapper/PlanTargetMapper.class | Bin 435 -> 0 bytes .../training/mapper/TrainingPlanMapper.class | Bin 441 -> 0 bytes .../service/PlanProgressService.class | Bin 548 -> 0 bytes .../service/TrainingPlanService.class | Bin 1259 -> 0 bytes .../impl/PlanProgressServiceImpl.class | Bin 6810 -> 0 bytes .../impl/TrainingPlanServiceImpl$1.class | Bin 912 -> 0 bytes .../impl/TrainingPlanServiceImpl.class | Bin 31201 -> 0 bytes .../training/vo/MyPlanVO$ExamProgressVO.class | Bin 3411 -> 0 bytes .../vo/MyPlanVO$KnowledgeProgressVO.class | Bin 3995 -> 0 bytes .../module/training/vo/MyPlanVO.class | Bin 9546 -> 0 bytes .../vo/TrainingPlanVO$PlanExamVO.class | Bin 4370 -> 0 bytes .../vo/TrainingPlanVO$PlanKnowledgeVO.class | Bin 4640 -> 0 bytes .../vo/TrainingPlanVO$PlanTargetVO.class | Bin 3859 -> 0 bytes .../module/training/vo/TrainingPlanVO.class | Bin 13263 -> 0 bytes .../target/classes/mapper/.gitkeep | 1 - .../target/classes/static/css/common.css | 552 -- .../target/classes/static/exam/edit.html | 350 - .../target/classes/static/exam/list.html | 256 - .../target/classes/static/exam/my-exams.html | 193 - .../classes/static/exam/paper-edit.html | 517 -- .../classes/static/exam/paper-preview.html | 193 - .../target/classes/static/exam/paper.html | 194 - .../static/exam/question-category.html | 124 - .../classes/static/exam/question-edit.html | 437 -- .../target/classes/static/exam/question.html | 394 - .../target/classes/static/exam/result.html | 294 - .../target/classes/static/exam/taking.html | 332 - .../target/classes/static/index.html | 358 - .../target/classes/static/js/common.js | 618 -- .../classes/static/knowledge/category.html | 249 - .../target/classes/static/knowledge/list.html | 640 -- .../target/classes/static/knowledge/view.html | 244 - .../target/classes/static/login.html | 360 - .../target/classes/static/system/org.html | 178 - .../target/classes/static/system/setting.html | 318 - .../target/classes/static/system/user.html | 171 - .../classes/static/training/detail.html | 183 - .../classes/static/training/my-training.html | 188 - .../classes/static/training/plan-edit.html | 538 -- .../target/classes/static/training/plan.html | 216 - .../compile/default-compile/createdFiles.lst | 176 - .../compile/default-compile/inputFiles.lst | 149 - .../default-testCompile/createdFiles.lst | 34 - .../default-testCompile/inputFiles.lst | 7 - .../JwtUtilsTest$GenerateTokenTest.class | Bin 3270 -> 0 bytes .../utils/JwtUtilsTest$GetRoleTest.class | Bin 2005 -> 0 bytes .../utils/JwtUtilsTest$GetUserIdTest.class | Bin 1954 -> 0 bytes .../utils/JwtUtilsTest$GetUsernameTest.class | Bin 1900 -> 0 bytes .../JwtUtilsTest$IsTokenExpiredTest.class | Bin 2415 -> 0 bytes .../JwtUtilsTest$TokenIntegrityTest.class | Bin 2491 -> 0 bytes .../utils/JwtUtilsTest$VerifyTokenTest.class | Bin 4356 -> 0 bytes .../training/common/utils/JwtUtilsTest.class | Bin 1795 -> 0 bytes ...ginIntegrationTest$LoginResponseTest.class | Bin 3890 -> 0 bytes ...ginIntegrationTest$PasswordLoginTest.class | Bin 7361 -> 0 bytes ...nIntegrationTest$TokenValidationTest.class | Bin 6336 -> 0 bytes .../module/auth/LoginIntegrationTest.class | Bin 1583 -> 0 bytes .../module/auth/PasswordEncoderTest.class | Bin 2954 -> 0 bytes .../AuthControllerTest$GetUserInfoTest.class | Bin 4559 -> 0 bytes .../AuthControllerTest$LoginTest.class | Bin 7924 -> 0 bytes .../AuthControllerTest$LogoutTest.class | Bin 3032 -> 0 bytes .../auth/controller/AuthControllerTest.class | Bin 2170 -> 0 bytes ...thServiceTest$GetCurrentUserInfoTest.class | Bin 7247 -> 0 bytes .../service/AuthServiceTest$LoginTest.class | Bin 10555 -> 0 bytes .../service/AuthServiceTest$LogoutTest.class | Bin 1838 -> 0 bytes .../module/auth/service/AuthServiceTest.class | Bin 2990 -> 0 bytes ...ionCategoryControllerTest$CreateTest.class | Bin 5389 -> 0 bytes ...ionCategoryControllerTest$DeleteTest.class | Bin 4910 -> 0 bytes ...CategoryControllerTest$GetDetailTest.class | Bin 4302 -> 0 bytes ...onCategoryControllerTest$GetListTest.class | Bin 3630 -> 0 bytes ...onCategoryControllerTest$GetTreeTest.class | Bin 4599 -> 0 bytes ...ionCategoryControllerTest$UpdateTest.class | Bin 5203 -> 0 bytes .../QuestionCategoryControllerTest.class | Bin 3978 -> 0 bytes ...tegoryServiceTest$CreateCategoryTest.class | Bin 8147 -> 0 bytes ...tegoryServiceTest$DeleteCategoryTest.class | Bin 4731 -> 0 bytes ...oryServiceTest$GetCategoryDetailTest.class | Bin 4927 -> 0 bytes ...egoryServiceTest$GetCategoryTreeTest.class | Bin 5202 -> 0 bytes ...tegoryServiceTest$UpdateCategoryTest.class | Bin 6281 -> 0 bytes .../service/QuestionCategoryServiceTest.class | Bin 3340 -> 0 bytes .../.claude/prompt}/Codeing_Prompt.md | 0 .../.claude/prompt}/PM_Prompt.md | 0 .../.claude/prompt}/Tester_Prompt.md | 0 training/.claude/prompt/demand-assessor.md | 203 + training/.claude/prompt/document_Prompt.md | 136 + training/.claude/prompt/front_arch_agent.md | 34 + training/.claude/skills/pmassist/SKILL.md | 406 + training/.claude/skills/tgassist/SKILL.md | 305 + .../00_meta/decision_log.md | 2 + .../00_meta/evidence_index.md | 5 + .../gate_checklists/architecture_review.md | 12 + .../00_meta/gate_checklists/code_review.md | 13 + .../00_meta/gate_checklists/privacy_review.md | 13 + .../gate_checklists/security_review.md | 12 + .../workspace_template/00_meta/gates.md | 47 + .../workspace_template/00_meta/project.yaml | 27 + .../00_meta/questions/round_N.yaml | 7 + .../workspace_template/00_meta/roles.md | 16 + .../00_meta/rounds/round_N.md | 21 + .../workspace_template/00_meta/session.yaml | 43 + .../workspace_template/00_meta/status.md | 10 + .../workspace_template/00_meta/summary.md | 2 + .../01_input/requirements.md | 7 + .../02_acceptance/acceptance.md | 5 + .../02_acceptance/checklist.md | 5 + .../03_plan/dependencies.md | 5 + .../workspace_template/03_plan/milestones.md | 5 + .../workspace_template/03_plan/risks.md | 5 + .../04_design/architecture.md | 7 + .../04_design/data_model.md | 5 + .../04_design/interfaces.md | 5 + .../05_delivery/change_log.md | 5 + .../workspace_template/05_delivery/dev_log.md | 90 + .../06_test_docs/defects.md | 5 + .../06_test_docs/regression.md | 5 + .../06_test_docs/test_cases.md | 5 + .../workspace_template/07_council/decision.md | 5 + .../workspace_template/07_council/review.md | 7 + .../99_archive/release_notes.md | 7 + .../references/gate_recommendation_matrix.md | 16 + .../references/project_yaml_schema.md | 50 + .../references/session_yaml_schema.md | 44 + .../scripts/generate_gate_checklists.sh | 93 + .../skills/tgassist/scripts/init_workspace.sh | 158 + .../training/common/enums/QuestionType.java | 7 +- .../training/module/exam/entity/Paper.java | 15 + .../training/module/exam/entity/Question.java | 17 +- .../context/01-产品文档}/PRD.md | 3 +- training/context/01-产品文档/student.md | 664 ++ .../context/02-产品架构/01-产品整体架构.md | 379 + .../context/02-产品架构/03-系统能力模型.md | 105 + training/context/03-功能模块/01-认证模块.md | 110 + .../context/03-功能模块/02-系统管理模块.md | 165 + training/context/03-功能模块/03-知识库模块.md | 205 + training/context/03-功能模块/04-考试模块.md | 253 + .../context/03-功能模块/05-培训计划模块.md | 196 + .../materials/新建课程.png | Bin 0 -> 111302 bytes .../materials/课程列表.png | Bin 0 -> 95658 bytes .../materials/课程查看.png | Bin 0 -> 315520 bytes .../materials/固定题目.png | Bin 0 -> 67287 bytes .../materials/按权重抽题.png | Bin 0 -> 65762 bytes .../materials/新建试题.png | Bin 0 -> 68393 bytes .../materials/试卷管理.png | Bin 0 -> 99889 bytes .../materials/试题管理.png | Bin 0 -> 82885 bytes .../materials/随机抽题.png | Bin 0 -> 50225 bytes .../materials/上传素材.png | Bin 0 -> 52824 bytes .../materials/素材库.png | Bin 0 -> 93754 bytes .../materials/素材查看.png | Bin 0 -> 399834 bytes .../materials/prototypes/问题.png | Bin 0 -> 41437 bytes training/workspace/specs/PRD.md | 881 +++ .../workspace/specs/V2-StatisticsCenter.md | 554 ++ .../01_input/prototype.html | 1213 +++ training/workspace/specs/student.md | 664 ++ 597 files changed, 24930 insertions(+), 35355 deletions(-) create mode 100644 ai_project/.claude/agents/demand-assessor.md create mode 100644 cc-center/FreeSWITCH技术架构与ESL开发指南.txt create mode 100644 cc-center/chat-📞 呼叫中心系统需求规划.txt create mode 100644 cc-center/企业呼叫中心系统需求规格说明书.txt create mode 100644 cc-center/企业呼叫中心系统项目立项书.txt create mode 100644 cc-center/呼叫中心系统开发方案.txt create mode 100644 membership/.claude/agents/demand-assessor.md create mode 100644 membership/.claude/skills/pmassist/SKILL.md create mode 100644 membership/.claude/skills/tgassist/SKILL.md create mode 100644 membership/.claude/skills/tgassist/assets/workspace_template/00_meta/decision_log.md create mode 100644 membership/.claude/skills/tgassist/assets/workspace_template/00_meta/evidence_index.md create mode 100644 membership/.claude/skills/tgassist/assets/workspace_template/00_meta/gate_checklists/architecture_review.md create mode 100644 membership/.claude/skills/tgassist/assets/workspace_template/00_meta/gate_checklists/code_review.md create mode 100644 membership/.claude/skills/tgassist/assets/workspace_template/00_meta/gate_checklists/privacy_review.md create mode 100644 membership/.claude/skills/tgassist/assets/workspace_template/00_meta/gate_checklists/security_review.md create mode 100644 membership/.claude/skills/tgassist/assets/workspace_template/00_meta/gates.md create mode 100644 membership/.claude/skills/tgassist/assets/workspace_template/00_meta/project.yaml create mode 100644 membership/.claude/skills/tgassist/assets/workspace_template/00_meta/questions/round_N.yaml create mode 100644 membership/.claude/skills/tgassist/assets/workspace_template/00_meta/roles.md create mode 100644 membership/.claude/skills/tgassist/assets/workspace_template/00_meta/rounds/round_N.md create mode 100644 membership/.claude/skills/tgassist/assets/workspace_template/00_meta/session.yaml create mode 100644 membership/.claude/skills/tgassist/assets/workspace_template/00_meta/status.md create mode 100644 membership/.claude/skills/tgassist/assets/workspace_template/00_meta/summary.md create mode 100644 membership/.claude/skills/tgassist/assets/workspace_template/01_input/requirements.md create mode 100644 membership/.claude/skills/tgassist/assets/workspace_template/02_acceptance/acceptance.md create mode 100644 membership/.claude/skills/tgassist/assets/workspace_template/02_acceptance/checklist.md create mode 100644 membership/.claude/skills/tgassist/assets/workspace_template/03_plan/dependencies.md create mode 100644 membership/.claude/skills/tgassist/assets/workspace_template/03_plan/milestones.md create mode 100644 membership/.claude/skills/tgassist/assets/workspace_template/03_plan/risks.md create mode 100644 membership/.claude/skills/tgassist/assets/workspace_template/04_design/architecture.md create mode 100644 membership/.claude/skills/tgassist/assets/workspace_template/04_design/data_model.md create mode 100644 membership/.claude/skills/tgassist/assets/workspace_template/04_design/interfaces.md create mode 100644 membership/.claude/skills/tgassist/assets/workspace_template/05_delivery/change_log.md create mode 100644 membership/.claude/skills/tgassist/assets/workspace_template/05_delivery/dev_log.md create mode 100644 membership/.claude/skills/tgassist/assets/workspace_template/06_test_docs/defects.md create mode 100644 membership/.claude/skills/tgassist/assets/workspace_template/06_test_docs/regression.md create mode 100644 membership/.claude/skills/tgassist/assets/workspace_template/06_test_docs/test_cases.md create mode 100644 membership/.claude/skills/tgassist/assets/workspace_template/07_council/decision.md create mode 100644 membership/.claude/skills/tgassist/assets/workspace_template/07_council/review.md create mode 100644 membership/.claude/skills/tgassist/assets/workspace_template/99_archive/release_notes.md create mode 100644 membership/.claude/skills/tgassist/references/gate_recommendation_matrix.md create mode 100644 membership/.claude/skills/tgassist/references/project_yaml_schema.md create mode 100644 membership/.claude/skills/tgassist/references/session_yaml_schema.md create mode 100644 membership/.claude/skills/tgassist/scripts/generate_gate_checklists.sh create mode 100644 membership/.claude/skills/tgassist/scripts/init_workspace.sh create mode 100644 membership/package.json create mode 100644 membership/scripts/claude-safe-run.js create mode 100644 membership/specs/materials/企业微信截图_17706340271335.png create mode 100644 membership/specs/materials/服务商配置.png create mode 100644 membership/specs/materials/调度日志比价.png create mode 100644 membership/产品需求文档.txt delete mode 100644 training-system/.claude/settings.local.json delete mode 100644 training-system/.gitignore delete mode 100644 training-system/.idea/.gitignore delete mode 100644 training-system/.idea/misc.xml delete mode 100644 training-system/.idea/modules.xml delete mode 100644 training-system/.idea/training-system.iml delete mode 100644 training-system/.idea/vcs.xml delete mode 100644 training-system/.summaries/summary-training-system-20260108-1634-会话摘要.md delete mode 100644 training-system/.summaries/summary-training-system-20260108-1721-后端服务及前端页面开发.md delete mode 100644 training-system/.summaries/summary-training-system-20260108-1947-登录功能测试.md delete mode 100644 training-system/.summaries/summary-training-system-20260109-1806-员工管理复测及漏测分析.md delete mode 100644 training-system/.summaries/summary-training-system-20260109-1808-员工管理模块缺陷修复.md delete mode 100644 training-system/.summaries/summary-training-system-20260112-1953-前端BUG修复.md delete mode 100644 training-system/.summaries/summary-training-system-20260113-1138-参与人员保存BUG修复.md delete mode 100644 training-system/CLAUDE.md delete mode 100644 training-system/README.md delete mode 100644 training-system/agents/architect.md delete mode 100644 training-system/agents/backend.md delete mode 100644 training-system/agents/devops.md delete mode 100644 training-system/agents/doc.md delete mode 100644 training-system/agents/frontend.md delete mode 100644 training-system/agents/pm.md delete mode 100644 training-system/agents/qa.md delete mode 100644 training-system/agents/security.md delete mode 100644 training-system/agents/supervisor.md delete mode 100644 training-system/docs/LLR.md delete mode 100644 training-system/docs/TestPlan.md delete mode 100644 training-system/docs/TestPlan_ExamModule.md delete mode 100644 training-system/docs/TestPlan_TrainingModule.md delete mode 100644 training-system/docs/TestReport_ExamModule_Regression.md delete mode 100644 training-system/docs/TestReport_TrainingModule.md delete mode 100644 training-system/docs/test-reports/BugAnalysis_2.0_Knowledge.md delete mode 100644 training-system/docs/test-reports/RegressionReport_1.3_UserManagement.md delete mode 100644 training-system/docs/test-reports/RegressionReport_1.3_UserManagement_V2.md delete mode 100644 training-system/docs/test-reports/TestReport_1.3_UserManagement.md delete mode 100644 training-system/docs/test-reports/TestReport_2.0_Knowledge.md delete mode 100644 training-system/docs/test-reports/TestReport_3.0_Question.md delete mode 100644 training-system/docs/test-reports/TestReport_4.0_Paper.md delete mode 100644 training-system/docs/test-reports/TestReport_5.0_Exam.md delete mode 100644 training-system/docs/test-reports/TestReport_6.0_TrainingPlan.md delete mode 100644 training-system/docs/test-reports/TestReport_Summary.md delete mode 100644 training-system/docs/测试报告-登录模块.md delete mode 100644 training-system/docs/测试报告-题库分类模块.md delete mode 100644 training-system/pom.xml delete mode 100644 training-system/sql/init.sql delete mode 100644 training-system/src/main/java/com/sino/training/TrainingApplication.java delete mode 100644 training-system/src/main/java/com/sino/training/common/annotation/RequireRole.java delete mode 100644 training-system/src/main/java/com/sino/training/common/base/BaseEntity.java delete mode 100644 training-system/src/main/java/com/sino/training/common/base/PageQuery.java delete mode 100644 training-system/src/main/java/com/sino/training/common/config/MybatisPlusConfig.java delete mode 100644 training-system/src/main/java/com/sino/training/common/config/SecurityConfig.java delete mode 100644 training-system/src/main/java/com/sino/training/common/config/SwaggerConfig.java delete mode 100644 training-system/src/main/java/com/sino/training/common/config/WebMvcConfig.java delete mode 100644 training-system/src/main/java/com/sino/training/common/context/UserContext.java delete mode 100644 training-system/src/main/java/com/sino/training/common/context/UserContextHolder.java delete mode 100644 training-system/src/main/java/com/sino/training/common/controller/FileController.java delete mode 100644 training-system/src/main/java/com/sino/training/common/dto/FileDTO.java delete mode 100644 training-system/src/main/java/com/sino/training/common/enums/ContentStatus.java delete mode 100644 training-system/src/main/java/com/sino/training/common/enums/ExamStatus.java delete mode 100644 training-system/src/main/java/com/sino/training/common/enums/KnowledgeType.java delete mode 100644 training-system/src/main/java/com/sino/training/common/enums/PlanStatus.java delete mode 100644 training-system/src/main/java/com/sino/training/common/enums/QuestionType.java delete mode 100644 training-system/src/main/java/com/sino/training/common/enums/TargetType.java delete mode 100644 training-system/src/main/java/com/sino/training/common/enums/UserRole.java delete mode 100644 training-system/src/main/java/com/sino/training/common/enums/UserStatus.java delete mode 100644 training-system/src/main/java/com/sino/training/common/exception/BusinessException.java delete mode 100644 training-system/src/main/java/com/sino/training/common/exception/GlobalExceptionHandler.java delete mode 100644 training-system/src/main/java/com/sino/training/common/interceptor/AuthInterceptor.java delete mode 100644 training-system/src/main/java/com/sino/training/common/interceptor/RoleInterceptor.java delete mode 100644 training-system/src/main/java/com/sino/training/common/result/PageResult.java delete mode 100644 training-system/src/main/java/com/sino/training/common/result/Result.java delete mode 100644 training-system/src/main/java/com/sino/training/common/result/ResultCode.java delete mode 100644 training-system/src/main/java/com/sino/training/common/service/FileService.java delete mode 100644 training-system/src/main/java/com/sino/training/common/service/impl/LocalFileServiceImpl.java delete mode 100644 training-system/src/main/java/com/sino/training/common/utils/JwtUtils.java delete mode 100644 training-system/src/main/java/com/sino/training/common/utils/SecurityUtils.java delete mode 100644 training-system/src/main/java/com/sino/training/module/auth/controller/AuthController.java delete mode 100644 training-system/src/main/java/com/sino/training/module/auth/dto/LoginRequest.java delete mode 100644 training-system/src/main/java/com/sino/training/module/auth/dto/LoginResponse.java delete mode 100644 training-system/src/main/java/com/sino/training/module/auth/dto/UserInfoResponse.java delete mode 100644 training-system/src/main/java/com/sino/training/module/auth/dto/WechatLoginRequest.java delete mode 100644 training-system/src/main/java/com/sino/training/module/auth/service/AuthService.java delete mode 100644 training-system/src/main/java/com/sino/training/module/auth/service/impl/AuthServiceImpl.java delete mode 100644 training-system/src/main/java/com/sino/training/module/exam/controller/ExamController.java delete mode 100644 training-system/src/main/java/com/sino/training/module/exam/controller/PaperController.java delete mode 100644 training-system/src/main/java/com/sino/training/module/exam/controller/QuestionCategoryController.java delete mode 100644 training-system/src/main/java/com/sino/training/module/exam/controller/QuestionController.java delete mode 100644 training-system/src/main/java/com/sino/training/module/exam/dto/AutoPaperDTO.java delete mode 100644 training-system/src/main/java/com/sino/training/module/exam/dto/ExamDTO.java delete mode 100644 training-system/src/main/java/com/sino/training/module/exam/dto/ExamQueryDTO.java delete mode 100644 training-system/src/main/java/com/sino/training/module/exam/dto/PaperDTO.java delete mode 100644 training-system/src/main/java/com/sino/training/module/exam/dto/PaperQueryDTO.java delete mode 100644 training-system/src/main/java/com/sino/training/module/exam/dto/QuestionCategoryDTO.java delete mode 100644 training-system/src/main/java/com/sino/training/module/exam/dto/QuestionDTO.java delete mode 100644 training-system/src/main/java/com/sino/training/module/exam/dto/QuestionQueryDTO.java delete mode 100644 training-system/src/main/java/com/sino/training/module/exam/dto/SubmitExamDTO.java delete mode 100644 training-system/src/main/java/com/sino/training/module/exam/entity/Exam.java delete mode 100644 training-system/src/main/java/com/sino/training/module/exam/entity/ExamRecord.java delete mode 100644 training-system/src/main/java/com/sino/training/module/exam/entity/ExamTarget.java delete mode 100644 training-system/src/main/java/com/sino/training/module/exam/entity/Paper.java delete mode 100644 training-system/src/main/java/com/sino/training/module/exam/entity/PaperQuestion.java delete mode 100644 training-system/src/main/java/com/sino/training/module/exam/entity/Question.java delete mode 100644 training-system/src/main/java/com/sino/training/module/exam/entity/QuestionCategory.java delete mode 100644 training-system/src/main/java/com/sino/training/module/exam/mapper/ExamMapper.java delete mode 100644 training-system/src/main/java/com/sino/training/module/exam/mapper/ExamRecordMapper.java delete mode 100644 training-system/src/main/java/com/sino/training/module/exam/mapper/ExamTargetMapper.java delete mode 100644 training-system/src/main/java/com/sino/training/module/exam/mapper/PaperMapper.java delete mode 100644 training-system/src/main/java/com/sino/training/module/exam/mapper/PaperQuestionMapper.java delete mode 100644 training-system/src/main/java/com/sino/training/module/exam/mapper/QuestionCategoryMapper.java delete mode 100644 training-system/src/main/java/com/sino/training/module/exam/mapper/QuestionMapper.java delete mode 100644 training-system/src/main/java/com/sino/training/module/exam/service/ExamRecordService.java delete mode 100644 training-system/src/main/java/com/sino/training/module/exam/service/ExamService.java delete mode 100644 training-system/src/main/java/com/sino/training/module/exam/service/PaperService.java delete mode 100644 training-system/src/main/java/com/sino/training/module/exam/service/QuestionCategoryService.java delete mode 100644 training-system/src/main/java/com/sino/training/module/exam/service/QuestionService.java delete mode 100644 training-system/src/main/java/com/sino/training/module/exam/service/impl/ExamRecordServiceImpl.java delete mode 100644 training-system/src/main/java/com/sino/training/module/exam/service/impl/ExamServiceImpl.java delete mode 100644 training-system/src/main/java/com/sino/training/module/exam/service/impl/PaperServiceImpl.java delete mode 100644 training-system/src/main/java/com/sino/training/module/exam/service/impl/QuestionCategoryServiceImpl.java delete mode 100644 training-system/src/main/java/com/sino/training/module/exam/service/impl/QuestionServiceImpl.java delete mode 100644 training-system/src/main/java/com/sino/training/module/exam/vo/ExamPaperVO.java delete mode 100644 training-system/src/main/java/com/sino/training/module/exam/vo/ExamRecordVO.java delete mode 100644 training-system/src/main/java/com/sino/training/module/exam/vo/ExamVO.java delete mode 100644 training-system/src/main/java/com/sino/training/module/exam/vo/PaperVO.java delete mode 100644 training-system/src/main/java/com/sino/training/module/exam/vo/QuestionCategoryVO.java delete mode 100644 training-system/src/main/java/com/sino/training/module/exam/vo/QuestionVO.java delete mode 100644 training-system/src/main/java/com/sino/training/module/knowledge/controller/CategoryController.java delete mode 100644 training-system/src/main/java/com/sino/training/module/knowledge/controller/KnowledgeController.java delete mode 100644 training-system/src/main/java/com/sino/training/module/knowledge/dto/CategoryDTO.java delete mode 100644 training-system/src/main/java/com/sino/training/module/knowledge/dto/KnowledgeDTO.java delete mode 100644 training-system/src/main/java/com/sino/training/module/knowledge/dto/KnowledgeQueryDTO.java delete mode 100644 training-system/src/main/java/com/sino/training/module/knowledge/entity/Category.java delete mode 100644 training-system/src/main/java/com/sino/training/module/knowledge/entity/Knowledge.java delete mode 100644 training-system/src/main/java/com/sino/training/module/knowledge/mapper/CategoryMapper.java delete mode 100644 training-system/src/main/java/com/sino/training/module/knowledge/mapper/KnowledgeMapper.java delete mode 100644 training-system/src/main/java/com/sino/training/module/knowledge/service/CategoryService.java delete mode 100644 training-system/src/main/java/com/sino/training/module/knowledge/service/KnowledgeService.java delete mode 100644 training-system/src/main/java/com/sino/training/module/knowledge/service/impl/CategoryServiceImpl.java delete mode 100644 training-system/src/main/java/com/sino/training/module/knowledge/service/impl/KnowledgeServiceImpl.java delete mode 100644 training-system/src/main/java/com/sino/training/module/knowledge/vo/CategoryVO.java delete mode 100644 training-system/src/main/java/com/sino/training/module/knowledge/vo/KnowledgeVO.java delete mode 100644 training-system/src/main/java/com/sino/training/module/system/controller/CenterController.java delete mode 100644 training-system/src/main/java/com/sino/training/module/system/controller/DepartmentController.java delete mode 100644 training-system/src/main/java/com/sino/training/module/system/controller/GroupController.java delete mode 100644 training-system/src/main/java/com/sino/training/module/system/controller/OrganizationController.java delete mode 100644 training-system/src/main/java/com/sino/training/module/system/controller/UserController.java delete mode 100644 training-system/src/main/java/com/sino/training/module/system/dto/CenterDTO.java delete mode 100644 training-system/src/main/java/com/sino/training/module/system/dto/DepartmentDTO.java delete mode 100644 training-system/src/main/java/com/sino/training/module/system/dto/GroupDTO.java delete mode 100644 training-system/src/main/java/com/sino/training/module/system/dto/PasswordDTO.java delete mode 100644 training-system/src/main/java/com/sino/training/module/system/dto/UserDTO.java delete mode 100644 training-system/src/main/java/com/sino/training/module/system/dto/UserQueryDTO.java delete mode 100644 training-system/src/main/java/com/sino/training/module/system/entity/Center.java delete mode 100644 training-system/src/main/java/com/sino/training/module/system/entity/Department.java delete mode 100644 training-system/src/main/java/com/sino/training/module/system/entity/Group.java delete mode 100644 training-system/src/main/java/com/sino/training/module/system/entity/User.java delete mode 100644 training-system/src/main/java/com/sino/training/module/system/mapper/CenterMapper.java delete mode 100644 training-system/src/main/java/com/sino/training/module/system/mapper/DepartmentMapper.java delete mode 100644 training-system/src/main/java/com/sino/training/module/system/mapper/GroupMapper.java delete mode 100644 training-system/src/main/java/com/sino/training/module/system/mapper/UserMapper.java delete mode 100644 training-system/src/main/java/com/sino/training/module/system/service/CenterService.java delete mode 100644 training-system/src/main/java/com/sino/training/module/system/service/DepartmentService.java delete mode 100644 training-system/src/main/java/com/sino/training/module/system/service/GroupService.java delete mode 100644 training-system/src/main/java/com/sino/training/module/system/service/OrganizationService.java delete mode 100644 training-system/src/main/java/com/sino/training/module/system/service/UserService.java delete mode 100644 training-system/src/main/java/com/sino/training/module/system/service/impl/CenterServiceImpl.java delete mode 100644 training-system/src/main/java/com/sino/training/module/system/service/impl/DepartmentServiceImpl.java delete mode 100644 training-system/src/main/java/com/sino/training/module/system/service/impl/GroupServiceImpl.java delete mode 100644 training-system/src/main/java/com/sino/training/module/system/service/impl/OrganizationServiceImpl.java delete mode 100644 training-system/src/main/java/com/sino/training/module/system/service/impl/UserServiceImpl.java delete mode 100644 training-system/src/main/java/com/sino/training/module/system/vo/CenterVO.java delete mode 100644 training-system/src/main/java/com/sino/training/module/system/vo/DepartmentVO.java delete mode 100644 training-system/src/main/java/com/sino/training/module/system/vo/GroupVO.java delete mode 100644 training-system/src/main/java/com/sino/training/module/system/vo/OrgTreeVO.java delete mode 100644 training-system/src/main/java/com/sino/training/module/system/vo/UserVO.java delete mode 100644 training-system/src/main/java/com/sino/training/module/training/controller/TrainingPlanController.java delete mode 100644 training-system/src/main/java/com/sino/training/module/training/dto/TrainingPlanDTO.java delete mode 100644 training-system/src/main/java/com/sino/training/module/training/dto/TrainingPlanQueryDTO.java delete mode 100644 training-system/src/main/java/com/sino/training/module/training/entity/PlanExam.java delete mode 100644 training-system/src/main/java/com/sino/training/module/training/entity/PlanKnowledge.java delete mode 100644 training-system/src/main/java/com/sino/training/module/training/entity/PlanProgress.java delete mode 100644 training-system/src/main/java/com/sino/training/module/training/entity/PlanTarget.java delete mode 100644 training-system/src/main/java/com/sino/training/module/training/entity/TrainingPlan.java delete mode 100644 training-system/src/main/java/com/sino/training/module/training/mapper/PlanExamMapper.java delete mode 100644 training-system/src/main/java/com/sino/training/module/training/mapper/PlanKnowledgeMapper.java delete mode 100644 training-system/src/main/java/com/sino/training/module/training/mapper/PlanProgressMapper.java delete mode 100644 training-system/src/main/java/com/sino/training/module/training/mapper/PlanTargetMapper.java delete mode 100644 training-system/src/main/java/com/sino/training/module/training/mapper/TrainingPlanMapper.java delete mode 100644 training-system/src/main/java/com/sino/training/module/training/service/PlanProgressService.java delete mode 100644 training-system/src/main/java/com/sino/training/module/training/service/TrainingPlanService.java delete mode 100644 training-system/src/main/java/com/sino/training/module/training/service/impl/PlanProgressServiceImpl.java delete mode 100644 training-system/src/main/java/com/sino/training/module/training/service/impl/TrainingPlanServiceImpl.java delete mode 100644 training-system/src/main/java/com/sino/training/module/training/vo/MyPlanVO.java delete mode 100644 training-system/src/main/java/com/sino/training/module/training/vo/TrainingPlanVO.java delete mode 100644 training-system/src/main/resources/application-dev.yml delete mode 100644 training-system/src/main/resources/application-prod.yml delete mode 100644 training-system/src/main/resources/application.yml delete mode 100644 training-system/src/main/resources/mapper/.gitkeep delete mode 100644 training-system/src/main/resources/static/css/common.css delete mode 100644 training-system/src/main/resources/static/exam/edit.html delete mode 100644 training-system/src/main/resources/static/exam/list.html delete mode 100644 training-system/src/main/resources/static/exam/my-exams.html delete mode 100644 training-system/src/main/resources/static/exam/paper-edit.html delete mode 100644 training-system/src/main/resources/static/exam/paper-preview.html delete mode 100644 training-system/src/main/resources/static/exam/paper.html delete mode 100644 training-system/src/main/resources/static/exam/question-category.html delete mode 100644 training-system/src/main/resources/static/exam/question-edit.html delete mode 100644 training-system/src/main/resources/static/exam/question.html delete mode 100644 training-system/src/main/resources/static/exam/result.html delete mode 100644 training-system/src/main/resources/static/exam/taking.html delete mode 100644 training-system/src/main/resources/static/index.html delete mode 100644 training-system/src/main/resources/static/js/common.js delete mode 100644 training-system/src/main/resources/static/knowledge/category.html delete mode 100644 training-system/src/main/resources/static/knowledge/list.html delete mode 100644 training-system/src/main/resources/static/knowledge/view.html delete mode 100644 training-system/src/main/resources/static/login.html delete mode 100644 training-system/src/main/resources/static/system/org.html delete mode 100644 training-system/src/main/resources/static/system/setting.html delete mode 100644 training-system/src/main/resources/static/system/user.html delete mode 100644 training-system/src/main/resources/static/training/detail.html delete mode 100644 training-system/src/main/resources/static/training/my-training.html delete mode 100644 training-system/src/main/resources/static/training/plan-edit.html delete mode 100644 training-system/src/main/resources/static/training/plan.html delete mode 100644 training-system/src/test/java/com/sino/training/common/utils/JwtUtilsTest.java delete mode 100644 training-system/src/test/java/com/sino/training/module/auth/LoginIntegrationTest.java delete mode 100644 training-system/src/test/java/com/sino/training/module/auth/PasswordEncoderTest.java delete mode 100644 training-system/src/test/java/com/sino/training/module/auth/controller/AuthControllerTest.java delete mode 100644 training-system/src/test/java/com/sino/training/module/auth/service/AuthServiceTest.java delete mode 100644 training-system/src/test/java/com/sino/training/module/exam/controller/QuestionCategoryControllerTest.java delete mode 100644 training-system/src/test/java/com/sino/training/module/exam/service/QuestionCategoryServiceTest.java delete mode 100644 training-system/target/classes/application-dev.yml delete mode 100644 training-system/target/classes/application-prod.yml delete mode 100644 training-system/target/classes/application.yml delete mode 100644 training-system/target/classes/com/sino/training/TrainingApplication.class delete mode 100644 training-system/target/classes/com/sino/training/common/annotation/RequireRole.class delete mode 100644 training-system/target/classes/com/sino/training/common/base/BaseEntity.class delete mode 100644 training-system/target/classes/com/sino/training/common/base/PageQuery.class delete mode 100644 training-system/target/classes/com/sino/training/common/config/MybatisPlusConfig$1.class delete mode 100644 training-system/target/classes/com/sino/training/common/config/MybatisPlusConfig.class delete mode 100644 training-system/target/classes/com/sino/training/common/config/SecurityConfig.class delete mode 100644 training-system/target/classes/com/sino/training/common/config/SwaggerConfig.class delete mode 100644 training-system/target/classes/com/sino/training/common/config/WebMvcConfig.class delete mode 100644 training-system/target/classes/com/sino/training/common/context/UserContext.class delete mode 100644 training-system/target/classes/com/sino/training/common/context/UserContextHolder.class delete mode 100644 training-system/target/classes/com/sino/training/common/controller/FileController.class delete mode 100644 training-system/target/classes/com/sino/training/common/dto/FileDTO.class delete mode 100644 training-system/target/classes/com/sino/training/common/enums/ContentStatus.class delete mode 100644 training-system/target/classes/com/sino/training/common/enums/ExamStatus.class delete mode 100644 training-system/target/classes/com/sino/training/common/enums/KnowledgeType.class delete mode 100644 training-system/target/classes/com/sino/training/common/enums/PlanStatus.class delete mode 100644 training-system/target/classes/com/sino/training/common/enums/QuestionType.class delete mode 100644 training-system/target/classes/com/sino/training/common/enums/TargetType.class delete mode 100644 training-system/target/classes/com/sino/training/common/enums/UserRole.class delete mode 100644 training-system/target/classes/com/sino/training/common/enums/UserStatus.class delete mode 100644 training-system/target/classes/com/sino/training/common/exception/BusinessException.class delete mode 100644 training-system/target/classes/com/sino/training/common/exception/GlobalExceptionHandler.class delete mode 100644 training-system/target/classes/com/sino/training/common/interceptor/AuthInterceptor.class delete mode 100644 training-system/target/classes/com/sino/training/common/interceptor/RoleInterceptor.class delete mode 100644 training-system/target/classes/com/sino/training/common/result/PageResult.class delete mode 100644 training-system/target/classes/com/sino/training/common/result/Result.class delete mode 100644 training-system/target/classes/com/sino/training/common/result/ResultCode.class delete mode 100644 training-system/target/classes/com/sino/training/common/service/FileService.class delete mode 100644 training-system/target/classes/com/sino/training/common/service/impl/LocalFileServiceImpl.class delete mode 100644 training-system/target/classes/com/sino/training/common/utils/JwtUtils.class delete mode 100644 training-system/target/classes/com/sino/training/common/utils/SecurityUtils.class delete mode 100644 training-system/target/classes/com/sino/training/module/auth/controller/AuthController.class delete mode 100644 training-system/target/classes/com/sino/training/module/auth/dto/LoginRequest.class delete mode 100644 training-system/target/classes/com/sino/training/module/auth/dto/LoginResponse.class delete mode 100644 training-system/target/classes/com/sino/training/module/auth/dto/UserInfoResponse.class delete mode 100644 training-system/target/classes/com/sino/training/module/auth/dto/WechatLoginRequest.class delete mode 100644 training-system/target/classes/com/sino/training/module/auth/service/AuthService.class delete mode 100644 training-system/target/classes/com/sino/training/module/auth/service/impl/AuthServiceImpl.class delete mode 100644 training-system/target/classes/com/sino/training/module/exam/controller/ExamController.class delete mode 100644 training-system/target/classes/com/sino/training/module/exam/controller/PaperController.class delete mode 100644 training-system/target/classes/com/sino/training/module/exam/controller/QuestionCategoryController.class delete mode 100644 training-system/target/classes/com/sino/training/module/exam/controller/QuestionController.class delete mode 100644 training-system/target/classes/com/sino/training/module/exam/dto/AutoPaperDTO.class delete mode 100644 training-system/target/classes/com/sino/training/module/exam/dto/ExamDTO$ExamTargetDTO.class delete mode 100644 training-system/target/classes/com/sino/training/module/exam/dto/ExamDTO.class delete mode 100644 training-system/target/classes/com/sino/training/module/exam/dto/ExamQueryDTO.class delete mode 100644 training-system/target/classes/com/sino/training/module/exam/dto/PaperDTO$PaperQuestionDTO.class delete mode 100644 training-system/target/classes/com/sino/training/module/exam/dto/PaperDTO.class delete mode 100644 training-system/target/classes/com/sino/training/module/exam/dto/PaperQueryDTO.class delete mode 100644 training-system/target/classes/com/sino/training/module/exam/dto/QuestionCategoryDTO.class delete mode 100644 training-system/target/classes/com/sino/training/module/exam/dto/QuestionDTO$OptionDTO.class delete mode 100644 training-system/target/classes/com/sino/training/module/exam/dto/QuestionDTO$OptionListDeserializer.class delete mode 100644 training-system/target/classes/com/sino/training/module/exam/dto/QuestionDTO.class delete mode 100644 training-system/target/classes/com/sino/training/module/exam/dto/QuestionQueryDTO.class delete mode 100644 training-system/target/classes/com/sino/training/module/exam/dto/SubmitExamDTO$AnswerDTO.class delete mode 100644 training-system/target/classes/com/sino/training/module/exam/dto/SubmitExamDTO.class delete mode 100644 training-system/target/classes/com/sino/training/module/exam/entity/Exam.class delete mode 100644 training-system/target/classes/com/sino/training/module/exam/entity/ExamRecord.class delete mode 100644 training-system/target/classes/com/sino/training/module/exam/entity/ExamTarget.class delete mode 100644 training-system/target/classes/com/sino/training/module/exam/entity/Paper.class delete mode 100644 training-system/target/classes/com/sino/training/module/exam/entity/PaperQuestion.class delete mode 100644 training-system/target/classes/com/sino/training/module/exam/entity/Question.class delete mode 100644 training-system/target/classes/com/sino/training/module/exam/entity/QuestionCategory.class delete mode 100644 training-system/target/classes/com/sino/training/module/exam/mapper/ExamMapper.class delete mode 100644 training-system/target/classes/com/sino/training/module/exam/mapper/ExamRecordMapper.class delete mode 100644 training-system/target/classes/com/sino/training/module/exam/mapper/ExamTargetMapper.class delete mode 100644 training-system/target/classes/com/sino/training/module/exam/mapper/PaperMapper.class delete mode 100644 training-system/target/classes/com/sino/training/module/exam/mapper/PaperQuestionMapper.class delete mode 100644 training-system/target/classes/com/sino/training/module/exam/mapper/QuestionCategoryMapper.class delete mode 100644 training-system/target/classes/com/sino/training/module/exam/mapper/QuestionMapper.class delete mode 100644 training-system/target/classes/com/sino/training/module/exam/service/ExamRecordService.class delete mode 100644 training-system/target/classes/com/sino/training/module/exam/service/ExamService.class delete mode 100644 training-system/target/classes/com/sino/training/module/exam/service/PaperService.class delete mode 100644 training-system/target/classes/com/sino/training/module/exam/service/QuestionCategoryService.class delete mode 100644 training-system/target/classes/com/sino/training/module/exam/service/QuestionService.class delete mode 100644 training-system/target/classes/com/sino/training/module/exam/service/impl/ExamRecordServiceImpl$1.class delete mode 100644 training-system/target/classes/com/sino/training/module/exam/service/impl/ExamRecordServiceImpl$AnswerDetail.class delete mode 100644 training-system/target/classes/com/sino/training/module/exam/service/impl/ExamRecordServiceImpl.class delete mode 100644 training-system/target/classes/com/sino/training/module/exam/service/impl/ExamServiceImpl$1.class delete mode 100644 training-system/target/classes/com/sino/training/module/exam/service/impl/ExamServiceImpl.class delete mode 100644 training-system/target/classes/com/sino/training/module/exam/service/impl/PaperServiceImpl$1.class delete mode 100644 training-system/target/classes/com/sino/training/module/exam/service/impl/PaperServiceImpl.class delete mode 100644 training-system/target/classes/com/sino/training/module/exam/service/impl/QuestionCategoryServiceImpl.class delete mode 100644 training-system/target/classes/com/sino/training/module/exam/service/impl/QuestionServiceImpl$1.class delete mode 100644 training-system/target/classes/com/sino/training/module/exam/service/impl/QuestionServiceImpl.class delete mode 100644 training-system/target/classes/com/sino/training/module/exam/vo/ExamPaperVO$ExamQuestionVO.class delete mode 100644 training-system/target/classes/com/sino/training/module/exam/vo/ExamPaperVO.class delete mode 100644 training-system/target/classes/com/sino/training/module/exam/vo/ExamRecordVO$AnswerDetailVO.class delete mode 100644 training-system/target/classes/com/sino/training/module/exam/vo/ExamRecordVO.class delete mode 100644 training-system/target/classes/com/sino/training/module/exam/vo/ExamVO$ExamTargetVO.class delete mode 100644 training-system/target/classes/com/sino/training/module/exam/vo/ExamVO.class delete mode 100644 training-system/target/classes/com/sino/training/module/exam/vo/PaperVO$PaperQuestionVO.class delete mode 100644 training-system/target/classes/com/sino/training/module/exam/vo/PaperVO.class delete mode 100644 training-system/target/classes/com/sino/training/module/exam/vo/QuestionCategoryVO.class delete mode 100644 training-system/target/classes/com/sino/training/module/exam/vo/QuestionVO$OptionVO.class delete mode 100644 training-system/target/classes/com/sino/training/module/exam/vo/QuestionVO.class delete mode 100644 training-system/target/classes/com/sino/training/module/knowledge/controller/CategoryController.class delete mode 100644 training-system/target/classes/com/sino/training/module/knowledge/controller/KnowledgeController.class delete mode 100644 training-system/target/classes/com/sino/training/module/knowledge/dto/CategoryDTO.class delete mode 100644 training-system/target/classes/com/sino/training/module/knowledge/dto/KnowledgeDTO.class delete mode 100644 training-system/target/classes/com/sino/training/module/knowledge/dto/KnowledgeQueryDTO.class delete mode 100644 training-system/target/classes/com/sino/training/module/knowledge/entity/Category.class delete mode 100644 training-system/target/classes/com/sino/training/module/knowledge/entity/Knowledge.class delete mode 100644 training-system/target/classes/com/sino/training/module/knowledge/mapper/CategoryMapper.class delete mode 100644 training-system/target/classes/com/sino/training/module/knowledge/mapper/KnowledgeMapper.class delete mode 100644 training-system/target/classes/com/sino/training/module/knowledge/service/CategoryService.class delete mode 100644 training-system/target/classes/com/sino/training/module/knowledge/service/KnowledgeService.class delete mode 100644 training-system/target/classes/com/sino/training/module/knowledge/service/impl/CategoryServiceImpl.class delete mode 100644 training-system/target/classes/com/sino/training/module/knowledge/service/impl/KnowledgeServiceImpl$1.class delete mode 100644 training-system/target/classes/com/sino/training/module/knowledge/service/impl/KnowledgeServiceImpl.class delete mode 100644 training-system/target/classes/com/sino/training/module/knowledge/vo/CategoryVO.class delete mode 100644 training-system/target/classes/com/sino/training/module/knowledge/vo/KnowledgeVO.class delete mode 100644 training-system/target/classes/com/sino/training/module/system/controller/CenterController.class delete mode 100644 training-system/target/classes/com/sino/training/module/system/controller/DepartmentController.class delete mode 100644 training-system/target/classes/com/sino/training/module/system/controller/GroupController.class delete mode 100644 training-system/target/classes/com/sino/training/module/system/controller/OrganizationController.class delete mode 100644 training-system/target/classes/com/sino/training/module/system/controller/UserController.class delete mode 100644 training-system/target/classes/com/sino/training/module/system/dto/CenterDTO.class delete mode 100644 training-system/target/classes/com/sino/training/module/system/dto/DepartmentDTO.class delete mode 100644 training-system/target/classes/com/sino/training/module/system/dto/GroupDTO.class delete mode 100644 training-system/target/classes/com/sino/training/module/system/dto/PasswordDTO.class delete mode 100644 training-system/target/classes/com/sino/training/module/system/dto/UserDTO.class delete mode 100644 training-system/target/classes/com/sino/training/module/system/dto/UserQueryDTO.class delete mode 100644 training-system/target/classes/com/sino/training/module/system/entity/Center.class delete mode 100644 training-system/target/classes/com/sino/training/module/system/entity/Department.class delete mode 100644 training-system/target/classes/com/sino/training/module/system/entity/Group.class delete mode 100644 training-system/target/classes/com/sino/training/module/system/entity/User.class delete mode 100644 training-system/target/classes/com/sino/training/module/system/mapper/CenterMapper.class delete mode 100644 training-system/target/classes/com/sino/training/module/system/mapper/DepartmentMapper.class delete mode 100644 training-system/target/classes/com/sino/training/module/system/mapper/GroupMapper.class delete mode 100644 training-system/target/classes/com/sino/training/module/system/mapper/UserMapper.class delete mode 100644 training-system/target/classes/com/sino/training/module/system/service/CenterService.class delete mode 100644 training-system/target/classes/com/sino/training/module/system/service/DepartmentService.class delete mode 100644 training-system/target/classes/com/sino/training/module/system/service/GroupService.class delete mode 100644 training-system/target/classes/com/sino/training/module/system/service/OrganizationService.class delete mode 100644 training-system/target/classes/com/sino/training/module/system/service/UserService.class delete mode 100644 training-system/target/classes/com/sino/training/module/system/service/impl/CenterServiceImpl.class delete mode 100644 training-system/target/classes/com/sino/training/module/system/service/impl/DepartmentServiceImpl.class delete mode 100644 training-system/target/classes/com/sino/training/module/system/service/impl/GroupServiceImpl.class delete mode 100644 training-system/target/classes/com/sino/training/module/system/service/impl/OrganizationServiceImpl.class delete mode 100644 training-system/target/classes/com/sino/training/module/system/service/impl/UserServiceImpl$1.class delete mode 100644 training-system/target/classes/com/sino/training/module/system/service/impl/UserServiceImpl.class delete mode 100644 training-system/target/classes/com/sino/training/module/system/vo/CenterVO.class delete mode 100644 training-system/target/classes/com/sino/training/module/system/vo/DepartmentVO.class delete mode 100644 training-system/target/classes/com/sino/training/module/system/vo/GroupVO.class delete mode 100644 training-system/target/classes/com/sino/training/module/system/vo/OrgTreeVO.class delete mode 100644 training-system/target/classes/com/sino/training/module/system/vo/UserVO.class delete mode 100644 training-system/target/classes/com/sino/training/module/training/controller/TrainingPlanController.class delete mode 100644 training-system/target/classes/com/sino/training/module/training/dto/TrainingPlanDTO$PlanExamDTO.class delete mode 100644 training-system/target/classes/com/sino/training/module/training/dto/TrainingPlanDTO$PlanKnowledgeDTO.class delete mode 100644 training-system/target/classes/com/sino/training/module/training/dto/TrainingPlanDTO$PlanTargetDTO.class delete mode 100644 training-system/target/classes/com/sino/training/module/training/dto/TrainingPlanDTO.class delete mode 100644 training-system/target/classes/com/sino/training/module/training/dto/TrainingPlanQueryDTO.class delete mode 100644 training-system/target/classes/com/sino/training/module/training/entity/PlanExam.class delete mode 100644 training-system/target/classes/com/sino/training/module/training/entity/PlanKnowledge.class delete mode 100644 training-system/target/classes/com/sino/training/module/training/entity/PlanProgress.class delete mode 100644 training-system/target/classes/com/sino/training/module/training/entity/PlanTarget.class delete mode 100644 training-system/target/classes/com/sino/training/module/training/entity/TrainingPlan.class delete mode 100644 training-system/target/classes/com/sino/training/module/training/mapper/PlanExamMapper.class delete mode 100644 training-system/target/classes/com/sino/training/module/training/mapper/PlanKnowledgeMapper.class delete mode 100644 training-system/target/classes/com/sino/training/module/training/mapper/PlanProgressMapper.class delete mode 100644 training-system/target/classes/com/sino/training/module/training/mapper/PlanTargetMapper.class delete mode 100644 training-system/target/classes/com/sino/training/module/training/mapper/TrainingPlanMapper.class delete mode 100644 training-system/target/classes/com/sino/training/module/training/service/PlanProgressService.class delete mode 100644 training-system/target/classes/com/sino/training/module/training/service/TrainingPlanService.class delete mode 100644 training-system/target/classes/com/sino/training/module/training/service/impl/PlanProgressServiceImpl.class delete mode 100644 training-system/target/classes/com/sino/training/module/training/service/impl/TrainingPlanServiceImpl$1.class delete mode 100644 training-system/target/classes/com/sino/training/module/training/service/impl/TrainingPlanServiceImpl.class delete mode 100644 training-system/target/classes/com/sino/training/module/training/vo/MyPlanVO$ExamProgressVO.class delete mode 100644 training-system/target/classes/com/sino/training/module/training/vo/MyPlanVO$KnowledgeProgressVO.class delete mode 100644 training-system/target/classes/com/sino/training/module/training/vo/MyPlanVO.class delete mode 100644 training-system/target/classes/com/sino/training/module/training/vo/TrainingPlanVO$PlanExamVO.class delete mode 100644 training-system/target/classes/com/sino/training/module/training/vo/TrainingPlanVO$PlanKnowledgeVO.class delete mode 100644 training-system/target/classes/com/sino/training/module/training/vo/TrainingPlanVO$PlanTargetVO.class delete mode 100644 training-system/target/classes/com/sino/training/module/training/vo/TrainingPlanVO.class delete mode 100644 training-system/target/classes/mapper/.gitkeep delete mode 100644 training-system/target/classes/static/css/common.css delete mode 100644 training-system/target/classes/static/exam/edit.html delete mode 100644 training-system/target/classes/static/exam/list.html delete mode 100644 training-system/target/classes/static/exam/my-exams.html delete mode 100644 training-system/target/classes/static/exam/paper-edit.html delete mode 100644 training-system/target/classes/static/exam/paper-preview.html delete mode 100644 training-system/target/classes/static/exam/paper.html delete mode 100644 training-system/target/classes/static/exam/question-category.html delete mode 100644 training-system/target/classes/static/exam/question-edit.html delete mode 100644 training-system/target/classes/static/exam/question.html delete mode 100644 training-system/target/classes/static/exam/result.html delete mode 100644 training-system/target/classes/static/exam/taking.html delete mode 100644 training-system/target/classes/static/index.html delete mode 100644 training-system/target/classes/static/js/common.js delete mode 100644 training-system/target/classes/static/knowledge/category.html delete mode 100644 training-system/target/classes/static/knowledge/list.html delete mode 100644 training-system/target/classes/static/knowledge/view.html delete mode 100644 training-system/target/classes/static/login.html delete mode 100644 training-system/target/classes/static/system/org.html delete mode 100644 training-system/target/classes/static/system/setting.html delete mode 100644 training-system/target/classes/static/system/user.html delete mode 100644 training-system/target/classes/static/training/detail.html delete mode 100644 training-system/target/classes/static/training/my-training.html delete mode 100644 training-system/target/classes/static/training/plan-edit.html delete mode 100644 training-system/target/classes/static/training/plan.html delete mode 100644 training-system/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst delete mode 100644 training-system/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst delete mode 100644 training-system/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst delete mode 100644 training-system/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst delete mode 100644 training-system/target/test-classes/com/sino/training/common/utils/JwtUtilsTest$GenerateTokenTest.class delete mode 100644 training-system/target/test-classes/com/sino/training/common/utils/JwtUtilsTest$GetRoleTest.class delete mode 100644 training-system/target/test-classes/com/sino/training/common/utils/JwtUtilsTest$GetUserIdTest.class delete mode 100644 training-system/target/test-classes/com/sino/training/common/utils/JwtUtilsTest$GetUsernameTest.class delete mode 100644 training-system/target/test-classes/com/sino/training/common/utils/JwtUtilsTest$IsTokenExpiredTest.class delete mode 100644 training-system/target/test-classes/com/sino/training/common/utils/JwtUtilsTest$TokenIntegrityTest.class delete mode 100644 training-system/target/test-classes/com/sino/training/common/utils/JwtUtilsTest$VerifyTokenTest.class delete mode 100644 training-system/target/test-classes/com/sino/training/common/utils/JwtUtilsTest.class delete mode 100644 training-system/target/test-classes/com/sino/training/module/auth/LoginIntegrationTest$LoginResponseTest.class delete mode 100644 training-system/target/test-classes/com/sino/training/module/auth/LoginIntegrationTest$PasswordLoginTest.class delete mode 100644 training-system/target/test-classes/com/sino/training/module/auth/LoginIntegrationTest$TokenValidationTest.class delete mode 100644 training-system/target/test-classes/com/sino/training/module/auth/LoginIntegrationTest.class delete mode 100644 training-system/target/test-classes/com/sino/training/module/auth/PasswordEncoderTest.class delete mode 100644 training-system/target/test-classes/com/sino/training/module/auth/controller/AuthControllerTest$GetUserInfoTest.class delete mode 100644 training-system/target/test-classes/com/sino/training/module/auth/controller/AuthControllerTest$LoginTest.class delete mode 100644 training-system/target/test-classes/com/sino/training/module/auth/controller/AuthControllerTest$LogoutTest.class delete mode 100644 training-system/target/test-classes/com/sino/training/module/auth/controller/AuthControllerTest.class delete mode 100644 training-system/target/test-classes/com/sino/training/module/auth/service/AuthServiceTest$GetCurrentUserInfoTest.class delete mode 100644 training-system/target/test-classes/com/sino/training/module/auth/service/AuthServiceTest$LoginTest.class delete mode 100644 training-system/target/test-classes/com/sino/training/module/auth/service/AuthServiceTest$LogoutTest.class delete mode 100644 training-system/target/test-classes/com/sino/training/module/auth/service/AuthServiceTest.class delete mode 100644 training-system/target/test-classes/com/sino/training/module/exam/controller/QuestionCategoryControllerTest$CreateTest.class delete mode 100644 training-system/target/test-classes/com/sino/training/module/exam/controller/QuestionCategoryControllerTest$DeleteTest.class delete mode 100644 training-system/target/test-classes/com/sino/training/module/exam/controller/QuestionCategoryControllerTest$GetDetailTest.class delete mode 100644 training-system/target/test-classes/com/sino/training/module/exam/controller/QuestionCategoryControllerTest$GetListTest.class delete mode 100644 training-system/target/test-classes/com/sino/training/module/exam/controller/QuestionCategoryControllerTest$GetTreeTest.class delete mode 100644 training-system/target/test-classes/com/sino/training/module/exam/controller/QuestionCategoryControllerTest$UpdateTest.class delete mode 100644 training-system/target/test-classes/com/sino/training/module/exam/controller/QuestionCategoryControllerTest.class delete mode 100644 training-system/target/test-classes/com/sino/training/module/exam/service/QuestionCategoryServiceTest$CreateCategoryTest.class delete mode 100644 training-system/target/test-classes/com/sino/training/module/exam/service/QuestionCategoryServiceTest$DeleteCategoryTest.class delete mode 100644 training-system/target/test-classes/com/sino/training/module/exam/service/QuestionCategoryServiceTest$GetCategoryDetailTest.class delete mode 100644 training-system/target/test-classes/com/sino/training/module/exam/service/QuestionCategoryServiceTest$GetCategoryTreeTest.class delete mode 100644 training-system/target/test-classes/com/sino/training/module/exam/service/QuestionCategoryServiceTest$UpdateCategoryTest.class delete mode 100644 training-system/target/test-classes/com/sino/training/module/exam/service/QuestionCategoryServiceTest.class rename {training-system/docs/Prompt => training/.claude/prompt}/Codeing_Prompt.md (100%) rename {training-system/docs/Prompt => training/.claude/prompt}/PM_Prompt.md (100%) rename {training-system/docs/Prompt => training/.claude/prompt}/Tester_Prompt.md (100%) create mode 100644 training/.claude/prompt/demand-assessor.md create mode 100644 training/.claude/prompt/document_Prompt.md create mode 100644 training/.claude/prompt/front_arch_agent.md create mode 100644 training/.claude/skills/pmassist/SKILL.md create mode 100644 training/.claude/skills/tgassist/SKILL.md create mode 100644 training/.claude/skills/tgassist/assets/workspace_template/00_meta/decision_log.md create mode 100644 training/.claude/skills/tgassist/assets/workspace_template/00_meta/evidence_index.md create mode 100644 training/.claude/skills/tgassist/assets/workspace_template/00_meta/gate_checklists/architecture_review.md create mode 100644 training/.claude/skills/tgassist/assets/workspace_template/00_meta/gate_checklists/code_review.md create mode 100644 training/.claude/skills/tgassist/assets/workspace_template/00_meta/gate_checklists/privacy_review.md create mode 100644 training/.claude/skills/tgassist/assets/workspace_template/00_meta/gate_checklists/security_review.md create mode 100644 training/.claude/skills/tgassist/assets/workspace_template/00_meta/gates.md create mode 100644 training/.claude/skills/tgassist/assets/workspace_template/00_meta/project.yaml create mode 100644 training/.claude/skills/tgassist/assets/workspace_template/00_meta/questions/round_N.yaml create mode 100644 training/.claude/skills/tgassist/assets/workspace_template/00_meta/roles.md create mode 100644 training/.claude/skills/tgassist/assets/workspace_template/00_meta/rounds/round_N.md create mode 100644 training/.claude/skills/tgassist/assets/workspace_template/00_meta/session.yaml create mode 100644 training/.claude/skills/tgassist/assets/workspace_template/00_meta/status.md create mode 100644 training/.claude/skills/tgassist/assets/workspace_template/00_meta/summary.md create mode 100644 training/.claude/skills/tgassist/assets/workspace_template/01_input/requirements.md create mode 100644 training/.claude/skills/tgassist/assets/workspace_template/02_acceptance/acceptance.md create mode 100644 training/.claude/skills/tgassist/assets/workspace_template/02_acceptance/checklist.md create mode 100644 training/.claude/skills/tgassist/assets/workspace_template/03_plan/dependencies.md create mode 100644 training/.claude/skills/tgassist/assets/workspace_template/03_plan/milestones.md create mode 100644 training/.claude/skills/tgassist/assets/workspace_template/03_plan/risks.md create mode 100644 training/.claude/skills/tgassist/assets/workspace_template/04_design/architecture.md create mode 100644 training/.claude/skills/tgassist/assets/workspace_template/04_design/data_model.md create mode 100644 training/.claude/skills/tgassist/assets/workspace_template/04_design/interfaces.md create mode 100644 training/.claude/skills/tgassist/assets/workspace_template/05_delivery/change_log.md create mode 100644 training/.claude/skills/tgassist/assets/workspace_template/05_delivery/dev_log.md create mode 100644 training/.claude/skills/tgassist/assets/workspace_template/06_test_docs/defects.md create mode 100644 training/.claude/skills/tgassist/assets/workspace_template/06_test_docs/regression.md create mode 100644 training/.claude/skills/tgassist/assets/workspace_template/06_test_docs/test_cases.md create mode 100644 training/.claude/skills/tgassist/assets/workspace_template/07_council/decision.md create mode 100644 training/.claude/skills/tgassist/assets/workspace_template/07_council/review.md create mode 100644 training/.claude/skills/tgassist/assets/workspace_template/99_archive/release_notes.md create mode 100644 training/.claude/skills/tgassist/references/gate_recommendation_matrix.md create mode 100644 training/.claude/skills/tgassist/references/project_yaml_schema.md create mode 100644 training/.claude/skills/tgassist/references/session_yaml_schema.md create mode 100644 training/.claude/skills/tgassist/scripts/generate_gate_checklists.sh create mode 100644 training/.claude/skills/tgassist/scripts/init_workspace.sh rename {training-system/docs => training/context/01-产品文档}/PRD.md (99%) create mode 100644 training/context/01-产品文档/student.md create mode 100644 training/context/02-产品架构/01-产品整体架构.md create mode 100644 training/context/02-产品架构/03-系统能力模型.md create mode 100644 training/context/03-功能模块/01-认证模块.md create mode 100644 training/context/03-功能模块/02-系统管理模块.md create mode 100644 training/context/03-功能模块/03-知识库模块.md create mode 100644 training/context/03-功能模块/04-考试模块.md create mode 100644 training/context/03-功能模块/05-培训计划模块.md create mode 100644 training/course-20260429-1000/materials/新建课程.png create mode 100644 training/course-20260429-1000/materials/课程列表.png create mode 100644 training/course-20260429-1000/materials/课程查看.png create mode 100644 training/exam-question-bank-20260512-0900/materials/固定题目.png create mode 100644 training/exam-question-bank-20260512-0900/materials/按权重抽题.png create mode 100644 training/exam-question-bank-20260512-0900/materials/新建试题.png create mode 100644 training/exam-question-bank-20260512-0900/materials/试卷管理.png create mode 100644 training/exam-question-bank-20260512-0900/materials/试题管理.png create mode 100644 training/exam-question-bank-20260512-0900/materials/随机抽题.png create mode 100644 training/knowledge-resource-20260428-1000/materials/上传素材.png create mode 100644 training/knowledge-resource-20260428-1000/materials/素材库.png create mode 100644 training/knowledge-resource-20260428-1000/materials/素材查看.png create mode 100644 training/training-demand-plan-20260509-1430/materials/prototypes/问题.png create mode 100644 training/workspace/specs/PRD.md create mode 100644 training/workspace/specs/V2-StatisticsCenter.md create mode 100644 training/workspace/specs/course-km-arch-20260430-1344/01_input/prototype.html create mode 100644 training/workspace/specs/student.md diff --git a/ai_project/.claude/agents/demand-assessor.md b/ai_project/.claude/agents/demand-assessor.md new file mode 100644 index 0000000..bfc0466 --- /dev/null +++ b/ai_project/.claude/agents/demand-assessor.md @@ -0,0 +1,203 @@ +你是一个精通 Java 微服务架构的资深技术负责人。 + +请基于以下统一模型评估需求的工作量。 + +============================== +整体工作量模型 +============================== + +工作量指数 W = +(单元业务复杂度 B × 单元数量 S) +× 技术复杂度系数 F(T) +× AI效率系数 G(A) + +其中: + +B = 单个功能单元复杂度 +S = 单元数量 +F(T) = 技术放大系数 +G(A) = AI效率系数 + +请严格按照步骤执行。 + + +==================================================== +第一部分:识别功能单元(规模 S) +==================================================== + +1. 识别最小可重复功能单元 + (例如:接口、页面、报表、定时任务等) + +2. 统计每类单元数量 + +要求: +- 不要在此阶段评估复杂度 +- 仅统计数量 + +输出: +- 单元类型 +- 每类数量 +- 总数量 S + + +==================================================== +第二部分:单元业务复杂度评估 B(仅评单个单元) +==================================================== + +假设只实现一个单元,评分(1-5): + +1. 业务规则数量 +2. 状态流转复杂度 +3. 异常处理复杂度 +4. 边界场景复杂度 +5. 需求不确定性 + +计算: + +B = 五项平均值(保留1位小数) + +注意: +禁止在此阶段考虑单元数量。 + +输出: +- 各项评分 +- 单元复杂度 B + + +==================================================== +第三部分:技术复杂度评估 F(T) +==================================================== + +评估技术复杂度等级 T(1-5): + +1 = 单服务简单CRUD +2 = 单服务中等逻辑 +3 = 多服务调用 +4 = 涉及DB变更/MQ +5 = 分布式事务/核心链路/高并发 + +计算: + +F(T) = 1 + 0.2 × (T - 1) + +输出: +- T值 +- 技术复杂度系数 F(T) +- 技术风险说明 + + +==================================================== +第四部分:AI效率系数 G(A) 计算 +==================================================== + +步骤A:正向评分(1-5分) + +1.需求清晰 +2.规则明确度 +3.可验证性 +4.代码结构清晰度 + +P = 三项得分之和 + + +步骤B:架构抽象复杂度(计数制) + +每触发一项 +1: + +- 策略/模板动态组合 +- 插件或SPI机制 +- 规则引擎/表达式驱动 +- AOP深度影响核心逻辑 +- Saga/TCC/补偿机制 +- 多租户/动态数据源 + +记为 N1 + + +步骤C:变更影响范围(计数制) + +每触发一项 +1: + +- 老服务接口变更 +- 数据库老表变更 +- 核心业务链路变更 +- 公共组件修改 +- 权限安全机制修改 +- 分布式事务/MQ变更 +- 低测试覆盖区域 + +记为 N2 + + +步骤D:历史耦合程度(计数制) + +每触发一项 +1: + +- 巨型类 +- 高复杂度方法 +- 隐式调用链 +- 模块边界不清晰 +- 测试覆盖<30% +- 多服务共享数据库 +- 无维护人/无文档 + +记为 N3 + + +步骤E:计算 + +N = N1 + N2 + N3 + +A = P - N + + +==================================================== +第五部分:安全门检查 +==================================================== + +若满足任一: + +- 修改核心结算逻辑 +- 修改分布式事务核心 +- 修改权限核心鉴权 +- 单测覆盖率<20% +- 无法清晰定位影响范围 + +标记为【高风险变更】 + + + +==================================================== +第六部分:AI效率系数映射 +==================================================== + +若非高风险变更: + +A ≥ 10 → G(A) = 0.55 +8 ≤ A < 10 → G(A) = 0.65 +6 ≤ A < 8 → G(A) = 0.75 +3 ≤ A < 6 → G(A) = 0.85 +1 ≤ A < 3 → G(A) = 0.95 +A ≤ 0 → G(A) = 1.0 + + +==================================================== +第七部分:最终工作量计算 +==================================================== + +计算: + +基础工作量 = B × S +技术放大后 = 基础工作量 × F(T) +最终工作量指数 W = 技术放大后 × G(A) + +请输出: + +1. 单元数量 S +2. 单元复杂度 B +3. 技术系数 F(T) +4. AI效率系数 G(A) +5. 最终工作量指数 W +6. 综合风险等级(低/中/高) +7. 是否建议拆分需求 +8. AI建议参与方式 \ No newline at end of file diff --git a/cc-center/FreeSWITCH技术架构与ESL开发指南.txt b/cc-center/FreeSWITCH技术架构与ESL开发指南.txt new file mode 100644 index 0000000..8187089 --- /dev/null +++ b/cc-center/FreeSWITCH技术架构与ESL开发指南.txt @@ -0,0 +1,3598 @@ +## 目录 + +1. [FreeSWITCH技术架构](#第一部分-freeswitch技术架构) +2. [核心模块详解](#第二部分-核心模块详解) +3. [ESL开发指南](#第三部分-esl开发指南) +4. [呼叫中心场景开发实践](#第四部分-呼叫中心场景开发实践) +5. [高可用部署方案](#第五部分-高可用部署方案) +6. [性能优化指南](#第六部分-性能优化指南) + +--- + +## 第一部分 FreeSWITCH技术架构 + +### 1.1 整体架构概览 + +``` +┌─────────────────────────────────────────────────────────────────────────────┐ +│ 外部系统/应用层 │ +│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ +│ │ CTI中间件 │ │ Web应用 │ │ 业务系统 │ │ 监控系统 │ │ 第三方App│ │ +│ └─────┬────┘ └─────┬────┘ └─────┬────┘ └─────┬────┘ └─────┬────┘ │ +│ │ │ │ │ │ │ +│ └─────────────┴─────────────┴──────┬──────┴─────────────┘ │ +│ │ │ +│ ┌──────▼──────┐ │ +│ │ ESL接口 │ │ +│ │ (TCP:8021) │ │ +│ └──────┬──────┘ │ +└───────────────────────────────────────────┼─────────────────────────────────┘ + │ +┌───────────────────────────────────────────▼─────────────────────────────────┐ +│ FreeSWITCH 核心层 │ +│ │ +│ ┌─────────────────────────────────────────────────────────────────────┐ │ +│ │ Core(核心引擎) │ │ +│ │ ┌───────────────┐ ┌───────────────┐ ┌───────────────┐ │ │ +│ │ │ 状态机管理 │ │ 内存管理 │ │ 线程池管理 │ │ │ +│ │ └───────────────┘ └───────────────┘ └───────────────┘ │ │ +│ │ ┌───────────────┐ ┌───────────────┐ ┌───────────────┐ │ │ +│ │ │ 事件系统 │ │ 数据库抽象 │ │ 日志系统 │ │ │ +│ │ └───────────────┘ └───────────────┘ └───────────────┘ │ │ +│ └─────────────────────────────────────────────────────────────────────┘ │ +│ │ +│ ┌─────────────────────────────────────────────────────────────────────┐ │ +│ │ Module Interface(模块接口层) │ │ +│ │ │ │ +│ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │ +│ │ │ Endpoint │ │ Application │ │ Codec │ │ Dialplan │ │ │ +│ │ │ 终端模块 │ │ 应用模块 │ │ 编解码 │ │ 拨号计划 │ │ │ +│ │ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ │ │ +│ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │ +│ │ │ Event │ │ Format │ │ Logger │ │ XML │ │ │ +│ │ │ 事件模块 │ │ 文件格式 │ │ 日志模块 │ │ XML处理 │ │ │ +│ │ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ │ │ +│ └─────────────────────────────────────────────────────────────────────┘ │ +│ │ +└─────────────────────────────────────────────────────────────────────────────┘ + │ +┌───────────────────────────────────────────▼─────────────────────────────────┐ +│ 协议/媒体层 │ +│ │ +│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ +│ │ mod_sofia │ │ mod_verto │ │ mod_rtmp │ │ mod_skinny │ │ +│ │ (SIP协议) │ │ (WebRTC) │ │ (RTMP) │ │ (Cisco) │ │ +│ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ │ +│ │ +│ ┌─────────────────────────────────────────────────────────────────────┐ │ +│ │ 媒体处理引擎 │ │ +│ │ ┌───────────┐ ┌───────────┐ ┌───────────┐ ┌───────────┐ │ │ +│ │ │ RTP处理 │ │ 编解码转换 │ │ 录音处理 │ │ DTMF检测 │ │ │ +│ │ └───────────┘ └───────────┘ └───────────┘ └───────────┘ │ │ +│ └─────────────────────────────────────────────────────────────────────┘ │ +│ │ +└─────────────────────────────────────────────────────────────────────────────┘ + │ +┌───────────────────────────────────────────▼─────────────────────────────────┐ +│ 网络层 │ +│ SIP/UDP/TCP RTP/SRTP WebSocket HTTP │ +│ :5060 :16384-32768 :8081 :8080 │ +└─────────────────────────────────────────────────────────────────────────────┘ +``` + +### 1.2 核心概念 + +#### 1.2.1 Channel(通道) + +Channel是FreeSWITCH中最核心的概念,代表一路通话的端点。 + +``` +┌─────────────────────────────────────────────────────────────────┐ +│ 一通电话 │ +│ │ +│ ┌─────────────┐ Bridge ┌─────────────┐ │ +│ │ Channel A │◄─────────────────────────►│ Channel B │ │ +│ │ (主叫方) │ │ (被叫方) │ │ +│ │ │ │ │ │ +│ │ UUID: xxx-a │ │ UUID: xxx-b │ │ +│ │ State: CS_ │ │ State: CS_ │ │ +│ │ Variables │ │ Variables │ │ +│ └─────────────┘ └─────────────┘ │ +│ │ +└─────────────────────────────────────────────────────────────────┘ +``` + +**Channel状态机:** + +``` + ┌──────────────────────────────────────────┐ + │ │ + ▼ │ +┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌──┴──────┐ +│ NEW │───►│ INIT │───►│ ROUTING │───►│ EXECUTE │───►│ HANGUP │ +└─────────┘ └─────────┘ └─────────┘ └─────────┘ └─────────┘ + │ │ + │ │ + ┌────▼────┐ ┌────▼────┐ + │ CONSUME │ │ EXCHANGE│ + │ MEDIA │ │ MEDIA │ + └─────────┘ └─────────┘ + +Channel状态说明: +├── CS_NEW : 新建通道 +├── CS_INIT : 初始化 +├── CS_ROUTING : 路由中(执行dialplan) +├── CS_EXECUTE : 执行应用中 +├── CS_EXCHANGE_MEDIA : 媒体交换中(bridged) +├── CS_CONSUME_MEDIA : 媒体消费中 +├── CS_HIBERNATE : 休眠状态 +├── CS_HANGUP : 挂断中 +└── CS_DESTROY : 销毁 +``` + +#### 1.2.2 Session(会话) + +Session包含Channel及其相关上下文信息: + +```c +// Session结构概念图 +Session { + ├── Channel // 通道信息 + │ ├── UUID // 唯一标识 + │ ├── State // 当前状态 + │ ├── Direction // 呼叫方向(inbound/outbound) + │ └── Variables // 通道变量 + │ + ├── Caller Profile // 主叫信息 + │ ├── caller_id_name + │ ├── caller_id_number + │ ├── destination_number + │ └── ... + │ + ├── Codec // 编解码信息 + ├── RTP Session // RTP会话 + └── Bridge Session // 桥接会话(如果有) +} +``` + +#### 1.2.3 Event(事件) + +FreeSWITCH基于事件驱动架构,所有状态变化都产生事件: + +``` +┌─────────────────────────────────────────────────────────────────┐ +│ FreeSWITCH Event System │ +│ │ +│ ┌───────────────┐ │ +│ │ Event Producer│ ──────┐ │ +│ │ (模块/核心) │ │ │ +│ └───────────────┘ │ ┌─────────────────────────┐ │ +│ ├─────►│ Event Dispatcher │ │ +│ ┌───────────────┐ │ │ (事件分发器) │ │ +│ │ Event Producer│ ──────┤ └───────────┬─────────────┘ │ +│ │ (模块/核心) │ │ │ │ +│ └───────────────┘ │ ┌───────────┴─────────────┐ │ +│ │ │ │ │ │ +│ ┌───────────────┐ │ ▼ ▼ ▼ │ +│ │ Event Producer│ ──────┘ ┌───────┐ ┌───────┐ ┌───────┐│ +│ │ (模块/核心) │ │ ESL │ │Internal│ │ Lua/ ││ +│ └───────────────┘ │Consumer│ │Handler │ │ JS ││ +│ └───────┘ └───────┘ └───────┘│ +└─────────────────────────────────────────────────────────────────┘ +``` + +**常用事件类型:** + +| 事件名称 | 触发时机 | 用途 | +|---------|---------|------| +| CHANNEL_CREATE | 通道创建 | 新呼叫进入 | +| CHANNEL_ANSWER | 通话接听 | 通话建立 | +| CHANNEL_BRIDGE | 通道桥接 | 双方接通 | +| CHANNEL_UNBRIDGE | 取消桥接 | 桥接断开 | +| CHANNEL_HANGUP | 挂断 | 通话结束 | +| CHANNEL_HANGUP_COMPLETE | 挂断完成 | 通话完全结束 | +| CHANNEL_STATE | 状态变化 | 状态监控 | +| DTMF | 按键检测 | IVR交互 | +| RECORD_START | 开始录音 | 录音控制 | +| RECORD_STOP | 停止录音 | 录音控制 | +| CUSTOM | 自定义事件 | 业务扩展 | + +### 1.3 目录结构 + +``` +/usr/local/freeswitch/ +├── bin/ # 可执行文件 +│ └── freeswitch # 主程序 +│ +├── conf/ # 配置文件目录 +│ ├── freeswitch.xml # 主配置文件 +│ ├── vars.xml # 全局变量 +│ ├── sip_profiles/ # SIP配置 +│ │ ├── internal.xml # 内部Profile(坐席注册) +│ │ └── external.xml # 外部Profile(中继对接) +│ ├── dialplan/ # 拨号计划 +│ │ ├── default.xml # 默认拨号计划 +│ │ └── public.xml # 公共拨号计划(呼入) +│ ├── directory/ # 用户目录(分机注册) +│ │ └── default/ +│ │ └── 1000.xml # 分机1000配置 +│ ├── autoload_configs/ # 模块自动加载配置 +│ │ ├── modules.conf.xml # 模块加载列表 +│ │ ├── sofia.conf.xml # SIP模块配置 +│ │ ├── event_socket.conf.xml# ESL配置 +│ │ └── ... +│ └── lang/ # 语音提示 +│ +├── lib/ # 库文件 +├── mod/ # 模块文件(.so) +├── log/ # 日志目录 +├── db/ # 数据库文件 +├── recordings/ # 录音文件 +├── sounds/ # 语音文件 +├── scripts/ # 脚本目录 +└── storage/ # 存储目录 +``` + +--- + +## 第二部分 核心模块详解 + +### 2.1 mod_sofia(SIP模块) + +mod_sofia是FreeSWITCH的SIP协议栈实现,基于Sofia-SIP库。 + +#### 2.1.1 架构 + +``` +┌─────────────────────────────────────────────────────────────────────┐ +│ mod_sofia │ +│ │ +│ ┌─────────────────────────────────────────────────────────────┐ │ +│ │ Sofia-SIP Stack │ │ +│ │ ┌───────────┐ ┌───────────┐ ┌───────────┐ ┌───────────┐ │ │ +│ │ │ NUA │ │ NTA │ │ TPORT │ │ SDP │ │ │ +│ │ │ User Agent│ │Transaction│ │ Transport │ │ Parser │ │ │ +│ │ └───────────┘ └───────────┘ └───────────┘ └───────────┘ │ │ +│ └─────────────────────────────────────────────────────────────┘ │ +│ │ +│ ┌─────────────────────────────────────────────────────────────┐ │ +│ │ Profile Management │ │ +│ │ │ │ +│ │ ┌─────────────────────┐ ┌─────────────────────┐ │ │ +│ │ │ Internal Profile │ │ External Profile │ │ │ +│ │ │ (坐席/分机注册) │ │ (中继/网关) │ │ │ +│ │ │ UDP:5060 │ │ UDP:5080 │ │ │ +│ │ └─────────────────────┘ └─────────────────────┘ │ │ +│ │ │ │ +│ │ ┌─────────────────────────────────────────────────────┐ │ │ +│ │ │ Gateway Management │ │ │ +│ │ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │ │ +│ │ │ │Gateway A│ │Gateway B│ │Gateway C│ ... │ │ │ +│ │ │ │(运营商1) │ │(运营商2) │ │(备用) │ │ │ │ +│ │ │ └─────────┘ └─────────┘ └─────────┘ │ │ │ +│ │ └─────────────────────────────────────────────────────┘ │ │ +│ └─────────────────────────────────────────────────────────────┘ │ +└─────────────────────────────────────────────────────────────────────┘ +``` + +#### 2.1.2 配置示例 + +**Internal Profile(坐席注册):** + +```xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +``` + +**External Profile(中继对接):** + +```xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +``` + +### 2.2 Dialplan(拨号计划) + +拨号计划定义了呼叫的路由和处理逻辑。 + +#### 2.2.1 执行流程 + +``` +┌──────────────────────────────────────────────────────────────────┐ +│ Dialplan 执行流程 │ +│ │ +│ 来电进入 │ +│ │ │ +│ ▼ │ +│ ┌─────────────────────────────────────────────────────────────┐│ +│ │ Context 选择 ││ +│ │ (根据Profile配置的context) ││ +│ │ 例如: public (呼入) / default (内部) ││ +│ └──────────────────────────┬──────────────────────────────────┘│ +│ │ │ +│ ▼ │ +│ ┌─────────────────────────────────────────────────────────────┐│ +│ │ Extension 匹配 ││ +│ │ (按顺序匹配condition) ││ +│ │ ││ +│ │ Extension 1: ──┐ ││ +│ │ Condition ───┼─► 不匹配 ───► 下一个Extension ││ +│ │ │ ││ +│ │ └─► 匹配 ───► 执行Actions ││ +│ └──────────────────────────┬──────────────────────────────────┘│ +│ │ │ +│ ▼ │ +│ ┌─────────────────────────────────────────────────────────────┐│ +│ │ Action 执行 ││ +│ │ (按顺序执行应用) ││ +│ │ ││ +│ │ action: answer ││ +│ │ action: playback ││ +│ │ action: bridge ││ +│ │ ... ││ +│ └─────────────────────────────────────────────────────────────┘│ +│ │ +└──────────────────────────────────────────────────────────────────┘ +``` + +#### 2.2.2 配置示例 + +**呼入路由(public.xml):** + +```xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +``` + +**IVR和呼叫处理(default.xml):** + +```xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +``` + +### 2.3 mod_event_socket(ESL模块) + +ESL是FreeSWITCH对外提供的控制接口,是开发呼叫中心的核心。 + +#### 2.3.1 工作模式 + +``` +┌─────────────────────────────────────────────────────────────────────┐ +│ ESL 工作模式 │ +│ │ +│ ┌───────────────────────────────────────────────────────────────┐ │ +│ │ Inbound 模式 │ │ +│ │ (客户端主动连接) │ │ +│ │ │ │ +│ │ ┌───────────┐ TCP:8021 ┌──────────────────┐ │ │ +│ │ │ CTI中间件 │ ──────────────────────► │ FreeSWITCH │ │ │ +│ │ │ (Client) │ ◄────────────────────── │ (Server) │ │ │ +│ │ └───────────┘ Event Stream └──────────────────┘ │ │ +│ │ │ │ +│ │ 特点: │ │ +│ │ - 客户端主动连接FreeSWITCH │ │ +│ │ - 可以订阅事件、发送命令 │ │ +│ │ - 适合集中控制、监控场景 │ │ +│ │ - 推荐呼叫中心使用此模式 │ │ +│ └───────────────────────────────────────────────────────────────┘ │ +│ │ +│ ┌───────────────────────────────────────────────────────────────┐ │ +│ │ Outbound 模式 │ │ +│ │ (FreeSWITCH主动连接) │ │ +│ │ │ │ +│ │ ┌──────────────────┐ TCP ┌───────────────┐ │ │ +│ │ │ FreeSWITCH │ ──────────────────►│ 应用服务器 │ │ │ +│ │ │ (每个呼叫) │ ◄────────────────── │ (Server) │ │ │ +│ │ └──────────────────┘ └───────────────┘ │ │ +│ │ │ │ +│ │ 特点: │ │ +│ │ - 每个呼叫FreeSWITCH主动连接应用 │ │ +│ │ - 在dialplan中使用socket应用触发 │ │ +│ │ - 适合简单IVR场景 │ │ +│ └───────────────────────────────────────────────────────────────┘ │ +│ │ +└─────────────────────────────────────────────────────────────────────┘ +``` + +#### 2.3.2 ESL配置 + +```xml + + + + + + + + + + + + + + + +``` + +--- + +## 第三部分 ESL开发指南 + +### 3.1 ESL协议详解 + +#### 3.1.1 协议格式 + +ESL使用类HTTP的文本协议: + +``` +┌─────────────────────────────────────────────────────────────────────┐ +│ ESL 消息格式 │ +│ │ +│ ┌───────────────────────────────────────────────────────────────┐ │ +│ │ 请求格式: │ │ +│ │ ┌─────────────────────────────────────────────────────────┐ │ │ +│ │ │ command [arguments] │ │ │ +│ │ │ Header-Name: header-value │ │ │ +│ │ │ Header-Name: header-value │ │ │ +│ │ │ │ │ │ +│ │ │ [body if Content-Length > 0] │ │ │ +│ │ └─────────────────────────────────────────────────────────┘ │ │ +│ └───────────────────────────────────────────────────────────────┘ │ +│ │ +│ ┌───────────────────────────────────────────────────────────────┐ │ +│ │ 响应格式: │ │ +│ │ ┌─────────────────────────────────────────────────────────┐ │ │ +│ │ │ Content-Type: text/event-plain │ │ │ +│ │ │ Content-Length: 1234 │ │ │ +│ │ │ Reply-Text: +OK [message] │ │ │ +│ │ │ │ │ │ +│ │ │ [body] │ │ │ +│ │ └─────────────────────────────────────────────────────────┘ │ │ +│ └───────────────────────────────────────────────────────────────┘ │ +│ │ +└─────────────────────────────────────────────────────────────────────┘ +``` + +#### 3.1.2 常用命令 + +| 命令类型 | 命令 | 说明 | +|---------|------|------| +| **认证** | `auth ` | 连接认证 | +| **事件订阅** | `event plain ` | 订阅事件 | +| | `event plain ALL` | 订阅所有事件 | +| | `event plain CHANNEL_CREATE CHANNEL_ANSWER CHANNEL_HANGUP` | 订阅指定事件 | +| | `nixevent ` | 取消订阅 | +| | `noevents` | 取消所有订阅 | +| **API命令** | `api [args]` | 同步执行API | +| | `bgapi [args]` | 异步执行API | +| **过滤器** | `filter
` | 过滤特定事件 | +| | `filter Unique-ID ` | 只接收指定UUID事件 | +| **呼叫控制** | `sendmsg ` | 向指定通道发送消息 | +| | `execute` | 在通道上执行应用 | +| **其他** | `log ` | 设置日志级别 | +| | `linger` | 保持连接 | +| | `nolinger` | 取消保持 | +| | `exit` | 断开连接 | + +### 3.2 Java ESL开发 + +#### 3.2.1 项目结构 + +``` +callcenter-cti/ +├── pom.xml +├── src/main/java/ +│ └── com/callcenter/ +│ ├── Application.java +│ ├── esl/ +│ │ ├── EslConnectionManager.java # ESL连接管理 +│ │ ├── EslEventHandler.java # 事件处理 +│ │ ├── EslCommandExecutor.java # 命令执行 +│ │ └── InboundClient.java # Inbound客户端 +│ ├── service/ +│ │ ├── AgentService.java # 坐席服务 +│ │ ├── CallService.java # 呼叫服务 +│ │ ├── QueueService.java # 排队服务 +│ │ └── AcdService.java # 话务分配服务 +│ ├── model/ +│ │ ├── Agent.java # 坐席模型 +│ │ ├── Call.java # 呼叫模型 +│ │ └── Queue.java # 队列模型 +│ ├── api/ +│ │ ├── AgentController.java # 坐席API +│ │ └── CallController.java # 呼叫API +│ └── websocket/ +│ └── EventPushHandler.java # 事件推送 +└── src/main/resources/ + └── application.yml +``` + +#### 3.2.2 Maven依赖 + +```xml + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-websocket + + + + + org.freeswitch.esl.client + org.freeswitch.esl.client + 0.9.2 + + + + + io.netty + netty-all + 4.1.86.Final + + + + + org.springframework.boot + spring-boot-starter-data-redis + + + + + com.alibaba + fastjson + 2.0.23 + + + + + org.apache.commons + commons-lang3 + + + org.projectlombok + lombok + + +``` + +#### 3.2.3 ESL连接管理 + +```java +package com.callcenter.esl; + +import lombok.extern.slf4j.Slf4j; +import org.freeswitch.esl.client.inbound.Client; +import org.freeswitch.esl.client.inbound.InboundConnectionFailure; +import org.freeswitch.esl.client.transport.event.EslEvent; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; +import javax.annotation.PreDestroy; +import java.util.concurrent.*; +import java.util.concurrent.atomic.AtomicBoolean; + +/** + * ESL连接管理器 + * 负责与FreeSWITCH建立和维护连接 + */ +@Slf4j +@Component +public class EslConnectionManager { + + @Value("${freeswitch.esl.host:127.0.0.1}") + private String eslHost; + + @Value("${freeswitch.esl.port:8021}") + private int eslPort; + + @Value("${freeswitch.esl.password:ClueCon}") + private String eslPassword; + + @Value("${freeswitch.esl.timeout:30}") + private int timeout; + + private Client eslClient; + private final AtomicBoolean connected = new AtomicBoolean(false); + private final AtomicBoolean reconnecting = new AtomicBoolean(false); + + private ScheduledExecutorService scheduler; + private ExecutorService eventExecutor; + + private EslEventHandler eventHandler; + + @PostConstruct + public void init() { + // 初始化线程池 + scheduler = Executors.newSingleThreadScheduledExecutor( + r -> new Thread(r, "esl-reconnect")); + eventExecutor = new ThreadPoolExecutor( + 4, 16, 60L, TimeUnit.SECONDS, + new LinkedBlockingQueue<>(10000), + r -> new Thread(r, "esl-event-handler"), + new ThreadPoolExecutor.CallerRunsPolicy() + ); + + // 建立连接 + connect(); + + // 启动心跳检测 + startHeartbeat(); + } + + /** + * 建立ESL连接 + */ + public synchronized void connect() { + if (connected.get()) { + log.info("ESL已连接,无需重复连接"); + return; + } + + try { + log.info("正在连接FreeSWITCH ESL: {}:{}", eslHost, eslPort); + + eslClient = new Client(); + eslClient.connect(eslHost, eslPort, eslPassword, timeout); + + // 订阅事件 + subscribeEvents(); + + // 设置事件监听器 + eslClient.setEventSubscriptions("plain", "all"); + eslClient.addEventListener((ctx, event) -> { + handleEvent(event); + }); + + connected.set(true); + reconnecting.set(false); + log.info("ESL连接成功"); + + } catch (InboundConnectionFailure e) { + log.error("ESL连接失败: {}", e.getMessage()); + connected.set(false); + scheduleReconnect(); + } + } + + /** + * 订阅所需事件 + */ + private void subscribeEvents() { + String events = String.join(" ", + "CHANNEL_CREATE", + "CHANNEL_ANSWER", + "CHANNEL_BRIDGE", + "CHANNEL_UNBRIDGE", + "CHANNEL_HANGUP", + "CHANNEL_HANGUP_COMPLETE", + "CHANNEL_STATE", + "DTMF", + "RECORD_START", + "RECORD_STOP", + "CUSTOM" + ); + + eslClient.setEventSubscriptions("plain", events); + eslClient.addEventFilter("Event-Name", "CHANNEL_CREATE"); + log.info("已订阅事件: {}", events); + } + + /** + * 处理事件 + */ + private void handleEvent(EslEvent event) { + eventExecutor.submit(() -> { + try { + if (eventHandler != null) { + eventHandler.handle(event); + } + } catch (Exception e) { + log.error("事件处理异常: {}", e.getMessage(), e); + } + }); + } + + /** + * 启动心跳检测 + */ + private void startHeartbeat() { + scheduler.scheduleAtFixedRate(() -> { + if (connected.get()) { + try { + // 发送status命令检测连接 + eslClient.sendSyncApiCommand("status", ""); + } catch (Exception e) { + log.warn("心跳检测失败,连接可能已断开"); + connected.set(false); + scheduleReconnect(); + } + } + }, 30, 30, TimeUnit.SECONDS); + } + + /** + * 计划重连 + */ + private void scheduleReconnect() { + if (reconnecting.compareAndSet(false, true)) { + scheduler.schedule(() -> { + log.info("尝试重新连接ESL..."); + connect(); + }, 5, TimeUnit.SECONDS); + } + } + + /** + * 同步执行API命令 + */ + public String sendSyncApiCommand(String command, String args) { + checkConnection(); + try { + return eslClient.sendSyncApiCommand(command, args).getBodyLines().get(0); + } catch (Exception e) { + log.error("执行API命令失败: {} {}", command, args, e); + throw new RuntimeException("ESL命令执行失败", e); + } + } + + /** + * 异步执行API命令 + */ + public CompletableFuture sendAsyncApiCommand(String command, String args) { + return CompletableFuture.supplyAsync(() -> + sendSyncApiCommand(command, args), eventExecutor); + } + + /** + * 向指定UUID发送消息执行应用 + */ + public void sendExecute(String uuid, String application, String args) { + checkConnection(); + try { + eslClient.sendSyncApiCommand("uuid_broadcast", + uuid + " " + application + "::" + args + " both"); + } catch (Exception e) { + log.error("发送Execute失败: uuid={}, app={}", uuid, application, e); + } + } + + /** + * 检查连接状态 + */ + private void checkConnection() { + if (!connected.get()) { + throw new RuntimeException("ESL未连接"); + } + } + + /** + * 获取连接状态 + */ + public boolean isConnected() { + return connected.get(); + } + + /** + * 设置事件处理器 + */ + public void setEventHandler(EslEventHandler handler) { + this.eventHandler = handler; + } + + @PreDestroy + public void destroy() { + try { + connected.set(false); + if (eslClient != null) { + eslClient.close(); + } + if (scheduler != null) { + scheduler.shutdown(); + } + if (eventExecutor != null) { + eventExecutor.shutdown(); + } + log.info("ESL连接已关闭"); + } catch (Exception e) { + log.error("关闭ESL连接异常", e); + } + } +} +``` + +#### 3.2.4 事件处理器 + +```java +package com.callcenter.esl; + +import com.callcenter.model.Call; +import com.callcenter.model.CallDirection; +import com.callcenter.model.CallState; +import com.callcenter.service.AcdService; +import com.callcenter.service.CallService; +import com.callcenter.websocket.EventPushService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.freeswitch.esl.client.transport.event.EslEvent; +import org.springframework.stereotype.Component; + +import java.time.LocalDateTime; +import java.util.Map; + +/** + * ESL事件处理器 + */ +@Slf4j +@Component +@RequiredArgsConstructor +public class EslEventHandler { + + private final CallService callService; + private final AcdService acdService; + private final EventPushService eventPushService; + + /** + * 处理ESL事件 + */ + public void handle(EslEvent event) { + String eventName = event.getEventName(); + Map headers = event.getEventHeaders(); + + log.debug("收到事件: {}, UUID: {}", eventName, headers.get("Unique-ID")); + + switch (eventName) { + case "CHANNEL_CREATE": + handleChannelCreate(headers); + break; + case "CHANNEL_ANSWER": + handleChannelAnswer(headers); + break; + case "CHANNEL_BRIDGE": + handleChannelBridge(headers); + break; + case "CHANNEL_UNBRIDGE": + handleChannelUnbridge(headers); + break; + case "CHANNEL_HANGUP": + handleChannelHangup(headers); + break; + case "CHANNEL_HANGUP_COMPLETE": + handleChannelHangupComplete(headers); + break; + case "DTMF": + handleDtmf(headers); + break; + case "RECORD_START": + handleRecordStart(headers); + break; + case "RECORD_STOP": + handleRecordStop(headers); + break; + case "CUSTOM": + handleCustomEvent(headers); + break; + default: + log.trace("未处理的事件类型: {}", eventName); + } + } + + /** + * 处理通道创建事件(新呼叫) + */ + private void handleChannelCreate(Map headers) { + String uuid = headers.get("Unique-ID"); + String direction = headers.get("Call-Direction"); + String callerNumber = headers.get("Caller-Caller-ID-Number"); + String calleeNumber = headers.get("Caller-Destination-Number"); + + log.info("新呼叫: uuid={}, direction={}, caller={}, callee={}", + uuid, direction, callerNumber, calleeNumber); + + // 创建呼叫记录 + Call call = new Call(); + call.setUuid(uuid); + call.setDirection("inbound".equals(direction) ? + CallDirection.INBOUND : CallDirection.OUTBOUND); + call.setCallerNumber(callerNumber); + call.setCalleeNumber(calleeNumber); + call.setState(CallState.RINGING); + call.setCreateTime(LocalDateTime.now()); + + // 获取业务标识(从通道变量) + String businessType = headers.get("variable_business_type"); + String skillGroup = headers.get("variable_skill_group"); + call.setBusinessType(businessType); + call.setSkillGroup(skillGroup); + + callService.saveCall(call); + + // 如果是呼入,触发ACD排队 + if ("inbound".equals(direction)) { + acdService.enqueue(call); + } + + // 推送事件到前端 + eventPushService.pushCallEvent("CALL_RINGING", call); + } + + /** + * 处理通话接听事件 + */ + private void handleChannelAnswer(Map headers) { + String uuid = headers.get("Unique-ID"); + + log.info("通话接听: uuid={}", uuid); + + Call call = callService.getCallByUuid(uuid); + if (call != null) { + call.setState(CallState.ANSWERED); + call.setAnswerTime(LocalDateTime.now()); + callService.updateCall(call); + + // 推送事件 + eventPushService.pushCallEvent("CALL_ANSWERED", call); + } + } + + /** + * 处理通道桥接事件(双方接通) + */ + private void handleChannelBridge(Map headers) { + String uuid = headers.get("Unique-ID"); + String otherUuid = headers.get("Other-Leg-Unique-ID"); + + log.info("通道桥接: uuid={}, otherUuid={}", uuid, otherUuid); + + Call call = callService.getCallByUuid(uuid); + if (call != null) { + call.setState(CallState.BRIDGED); + call.setBridgeUuid(otherUuid); + call.setBridgeTime(LocalDateTime.now()); + callService.updateCall(call); + + // 推送事件 + eventPushService.pushCallEvent("CALL_BRIDGED", call); + } + } + + /** + * 处理取消桥接事件 + */ + private void handleChannelUnbridge(Map headers) { + String uuid = headers.get("Unique-ID"); + + log.info("取消桥接: uuid={}", uuid); + + Call call = callService.getCallByUuid(uuid); + if (call != null) { + call.setState(CallState.UNBRIDGED); + callService.updateCall(call); + + eventPushService.pushCallEvent("CALL_UNBRIDGED", call); + } + } + + /** + * 处理挂断事件 + */ + private void handleChannelHangup(Map headers) { + String uuid = headers.get("Unique-ID"); + String hangupCause = headers.get("Hangup-Cause"); + + log.info("通话挂断: uuid={}, cause={}", uuid, hangupCause); + + Call call = callService.getCallByUuid(uuid); + if (call != null) { + call.setState(CallState.HANGUP); + call.setHangupCause(hangupCause); + call.setHangupTime(LocalDateTime.now()); + + // 计算通话时长 + if (call.getAnswerTime() != null) { + long duration = java.time.Duration.between( + call.getAnswerTime(), call.getHangupTime()).getSeconds(); + call.setDuration(duration); + } + + callService.updateCall(call); + + // 推送事件 + eventPushService.pushCallEvent("CALL_HANGUP", call); + + // 更新坐席状态 + if (call.getAgentId() != null) { + acdService.onCallEnd(call.getAgentId(), call); + } + } + } + + /** + * 处理挂断完成事件(获取完整话单) + */ + private void handleChannelHangupComplete(Map headers) { + String uuid = headers.get("Unique-ID"); + String billsec = headers.get("variable_billsec"); + String duration = headers.get("variable_duration"); + String recordingPath = headers.get("variable_recording_path"); + + log.info("通话结束: uuid={}, billsec={}, recording={}", + uuid, billsec, recordingPath); + + Call call = callService.getCallByUuid(uuid); + if (call != null) { + call.setBillsec(billsec != null ? Long.parseLong(billsec) : 0); + call.setRecordingPath(recordingPath); + callService.updateCall(call); + + // 推送话单 + eventPushService.pushCdr(call); + } + } + + /** + * 处理DTMF按键事件 + */ + private void handleDtmf(Map headers) { + String uuid = headers.get("Unique-ID"); + String digit = headers.get("DTMF-Digit"); + + log.info("DTMF按键: uuid={}, digit={}", uuid, digit); + + // 推送按键事件 + eventPushService.pushDtmf(uuid, digit); + } + + /** + * 处理录音开始事件 + */ + private void handleRecordStart(Map headers) { + String uuid = headers.get("Unique-ID"); + String recordPath = headers.get("Record-File-Path"); + + log.info("开始录音: uuid={}, path={}", uuid, recordPath); + + Call call = callService.getCallByUuid(uuid); + if (call != null) { + call.setRecordingPath(recordPath); + callService.updateCall(call); + } + } + + /** + * 处理录音停止事件 + */ + private void handleRecordStop(Map headers) { + String uuid = headers.get("Unique-ID"); + String recordPath = headers.get("Record-File-Path"); + + log.info("停止录音: uuid={}, path={}", uuid, recordPath); + } + + /** + * 处理自定义事件 + */ + private void handleCustomEvent(Map headers) { + String subclass = headers.get("Event-Subclass"); + log.debug("自定义事件: subclass={}", subclass); + + // 处理特定的自定义事件 + if ("callcenter::info".equals(subclass)) { + // 处理呼叫中心相关事件 + } + } +} +``` + +#### 3.2.5 呼叫服务 + +```java +package com.callcenter.service; + +import com.callcenter.esl.EslConnectionManager; +import com.callcenter.model.*; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Service; + +import java.util.concurrent.TimeUnit; + +/** + * 呼叫服务 + * 提供呼叫控制相关功能 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class CallService { + + private final EslConnectionManager eslManager; + private final RedisTemplate redisTemplate; + + private static final String CALL_KEY_PREFIX = "call:"; + private static final int CALL_EXPIRE_HOURS = 24; + + /** + * 发起外呼 + * @param agentId 坐席ID + * @param callerNumber 主叫号码(外显号码) + * @param calleeNumber 被叫号码 + * @return 呼叫UUID + */ + public String originate(String agentId, String callerNumber, String calleeNumber) { + log.info("发起外呼: agent={}, caller={}, callee={}", + agentId, callerNumber, calleeNumber); + + // 获取坐席分机号 + Agent agent = getAgent(agentId); + if (agent == null || agent.getState() != AgentState.READY) { + throw new RuntimeException("坐席不可用"); + } + + // 构建originate命令 + // originate {变量}呼叫字符串 &应用(参数) + StringBuilder cmd = new StringBuilder(); + cmd.append("{"); + cmd.append("origination_caller_id_number=").append(callerNumber).append(","); + cmd.append("origination_caller_id_name=公司名称").append(","); + cmd.append("agent_id=").append(agentId).append(","); + cmd.append("direction=outbound").append(","); + cmd.append("RECORD_STEREO=true"); + cmd.append("}"); + + // A-leg: 先呼叫坐席分机 + cmd.append("user/").append(agent.getExtension()); + + // B-leg: 坐席接听后呼叫客户 + cmd.append(" &bridge({origination_caller_id_number=") + .append(callerNumber) + .append("}sofia/gateway/carrier_primary/") + .append(calleeNumber) + .append(")"); + + String result = eslManager.sendSyncApiCommand("originate", cmd.toString()); + + if (result.startsWith("+OK")) { + String uuid = result.substring(4).trim(); + log.info("外呼成功: uuid={}", uuid); + return uuid; + } else { + log.error("外呼失败: {}", result); + throw new RuntimeException("外呼失败: " + result); + } + } + + /** + * 接听来电 + */ + public void answer(String uuid) { + log.info("接听来电: uuid={}", uuid); + eslManager.sendSyncApiCommand("uuid_answer", uuid); + } + + /** + * 挂断通话 + */ + public void hangup(String uuid) { + log.info("挂断通话: uuid={}", uuid); + eslManager.sendSyncApiCommand("uuid_kill", uuid); + } + + /** + * 挂断通话(带原因) + */ + public void hangup(String uuid, String cause) { + log.info("挂断通话: uuid={}, cause={}", uuid, cause); + eslManager.sendSyncApiCommand("uuid_kill", uuid + " " + cause); + } + + /** + * 保持通话 + */ + public void hold(String uuid) { + log.info("保持通话: uuid={}", uuid); + eslManager.sendSyncApiCommand("uuid_hold", uuid); + } + + /** + * 取回保持 + */ + public void unhold(String uuid) { + log.info("取回通话: uuid={}", uuid); + eslManager.sendSyncApiCommand("uuid_hold", "off " + uuid); + } + + /** + * 静音 + */ + public void mute(String uuid) { + log.info("静音: uuid={}", uuid); + eslManager.sendSyncApiCommand("uuid_audio", uuid + " start mute"); + } + + /** + * 取消静音 + */ + public void unmute(String uuid) { + log.info("取消静音: uuid={}", uuid); + eslManager.sendSyncApiCommand("uuid_audio", uuid + " stop"); + } + + /** + * 盲转(直接转接) + */ + public void blindTransfer(String uuid, String destination) { + log.info("盲转: uuid={}, dest={}", uuid, destination); + eslManager.sendSyncApiCommand("uuid_transfer", uuid + " " + destination); + } + + /** + * 咨询转(先咨询再转接) + */ + public String consultTransfer(String uuid, String destination) { + log.info("咨询转: uuid={}, dest={}", uuid, destination); + + // 先保持当前通话 + hold(uuid); + + // 发起咨询呼叫 + String consultCmd = "{origination_uuid=consult_" + uuid + "}user/" + destination; + String result = eslManager.sendSyncApiCommand("originate", + consultCmd + " &park()"); + + if (result.startsWith("+OK")) { + return result.substring(4).trim(); + } + throw new RuntimeException("咨询转失败"); + } + + /** + * 完成咨询转接 + */ + public void completeTransfer(String originalUuid, String consultUuid) { + log.info("完成咨询转: original={}, consult={}", originalUuid, consultUuid); + eslManager.sendSyncApiCommand("uuid_bridge", originalUuid + " " + consultUuid); + } + + /** + * 三方通话 + */ + public void conference(String uuid1, String uuid2, String conferenceName) { + log.info("三方通话: uuid1={}, uuid2={}, conf={}", uuid1, uuid2, conferenceName); + + // 将两个通道加入会议 + eslManager.sendSyncApiCommand("uuid_transfer", + uuid1 + " conference:" + conferenceName + " inline"); + eslManager.sendSyncApiCommand("uuid_transfer", + uuid2 + " conference:" + conferenceName + " inline"); + } + + /** + * 播放语音 + */ + public void playback(String uuid, String filePath) { + log.info("播放语音: uuid={}, file={}", uuid, filePath); + eslManager.sendSyncApiCommand("uuid_broadcast", + uuid + " " + filePath + " both"); + } + + /** + * 停止播放 + */ + public void stopPlayback(String uuid) { + log.info("停止播放: uuid={}", uuid); + eslManager.sendSyncApiCommand("uuid_break", uuid); + } + + /** + * 开始录音 + */ + public void startRecording(String uuid, String filePath) { + log.info("开始录音: uuid={}, file={}", uuid, filePath); + eslManager.sendSyncApiCommand("uuid_record", uuid + " start " + filePath); + } + + /** + * 停止录音 + */ + public void stopRecording(String uuid, String filePath) { + log.info("停止录音: uuid={}", uuid); + eslManager.sendSyncApiCommand("uuid_record", uuid + " stop " + filePath); + } + + /** + * 桥接两个通道 + */ + public void bridge(String uuid1, String uuid2) { + log.info("桥接通道: uuid1={}, uuid2={}", uuid1, uuid2); + eslManager.sendSyncApiCommand("uuid_bridge", uuid1 + " " + uuid2); + } + + /** + * 设置通道变量 + */ + public void setVariable(String uuid, String name, String value) { + eslManager.sendSyncApiCommand("uuid_setvar", + uuid + " " + name + " " + value); + } + + /** + * 获取通道变量 + */ + public String getVariable(String uuid, String name) { + return eslManager.sendSyncApiCommand("uuid_getvar", uuid + " " + name); + } + + // ============ 呼叫记录管理 ============ + + /** + * 保存呼叫记录 + */ + public void saveCall(Call call) { + String key = CALL_KEY_PREFIX + call.getUuid(); + redisTemplate.opsForValue().set(key, call, CALL_EXPIRE_HOURS, TimeUnit.HOURS); + } + + /** + * 获取呼叫记录 + */ + public Call getCallByUuid(String uuid) { + String key = CALL_KEY_PREFIX + uuid; + return (Call) redisTemplate.opsForValue().get(key); + } + + /** + * 更新呼叫记录 + */ + public void updateCall(Call call) { + saveCall(call); + } + + /** + * 获取坐席信息 + */ + private Agent getAgent(String agentId) { + // TODO: 从坐席服务获取 + return null; + } +} +``` + +#### 3.2.6 ACD话务分配服务 + +```java +package com.callcenter.service; + +import com.callcenter.esl.EslConnectionManager; +import com.callcenter.model.*; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Service; + +import java.time.LocalDateTime; +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + +/** + * ACD话务分配服务 + * 实现多种分配策略:历史服务优先、最长空闲优先、轮询 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class AcdService { + + private final EslConnectionManager eslManager; + private final RedisTemplate redisTemplate; + private final AgentService agentService; + private final CallService callService; + + // 队列Key前缀 + private static final String QUEUE_KEY_PREFIX = "queue:"; + // 坐席最后服务客户映射 + private static final String AGENT_CUSTOMER_MAP_KEY = "agent:customer:map"; + // 坐席最后空闲时间 + private static final String AGENT_IDLE_TIME_KEY = "agent:idle:time:"; + // 轮询索引 + private final Map roundRobinIndex = new ConcurrentHashMap<>(); + + /** + * 呼叫入队 + */ + public void enqueue(Call call) { + String skillGroup = call.getSkillGroup(); + String queueKey = QUEUE_KEY_PREFIX + skillGroup; + + QueueItem item = new QueueItem(); + item.setCallUuid(call.getUuid()); + item.setCallerNumber(call.getCallerNumber()); + item.setSkillGroup(skillGroup); + item.setEnqueueTime(LocalDateTime.now()); + item.setPriority(calculatePriority(call)); + + // 使用SortedSet,按优先级和入队时间排序 + double score = item.getPriority() * 1000000000L + + System.currentTimeMillis() / 1000; + redisTemplate.opsForZSet().add(queueKey, item, score); + + log.info("呼叫入队: uuid={}, queue={}, priority={}", + call.getUuid(), skillGroup, item.getPriority()); + + // 尝试立即分配 + tryAssign(skillGroup); + } + + /** + * 计算优先级(数字越小优先级越高) + */ + private int calculatePriority(Call call) { + // VIP客户优先级高 + if ("VIP".equals(call.getCustomerLevel())) { + return 1; + } + // 投诉优先 + if ("complaint".equals(call.getBusinessType())) { + return 2; + } + // 普通客户 + return 5; + } + + /** + * 尝试分配队列中的呼叫 + */ + public void tryAssign(String skillGroup) { + String queueKey = QUEUE_KEY_PREFIX + skillGroup; + + // 获取可用坐席 + List availableAgents = agentService.getAvailableAgents(skillGroup); + if (availableAgents.isEmpty()) { + log.debug("技能组{}无可用坐席", skillGroup); + return; + } + + // 获取队列中的呼叫 + Set queueItems = redisTemplate.opsForZSet().range(queueKey, 0, 0); + if (queueItems == null || queueItems.isEmpty()) { + log.debug("技能组{}队列为空", skillGroup); + return; + } + + QueueItem item = (QueueItem) queueItems.iterator().next(); + Call call = callService.getCallByUuid(item.getCallUuid()); + + if (call == null || call.getState() == CallState.HANGUP) { + // 呼叫已结束,移除队列 + redisTemplate.opsForZSet().remove(queueKey, item); + tryAssign(skillGroup); // 继续处理下一个 + return; + } + + // 选择坐席 + Agent selectedAgent = selectAgent(availableAgents, call); + + if (selectedAgent != null) { + // 从队列移除 + redisTemplate.opsForZSet().remove(queueKey, item); + + // 分配呼叫 + assignCallToAgent(call, selectedAgent); + } + } + + /** + * 选择坐席(多策略) + */ + private Agent selectAgent(List agents, Call call) { + if (agents.isEmpty()) { + return null; + } + + // 策略1: 历史服务优先 + Agent lastAgent = findLastServingAgent(call.getCallerNumber(), agents); + if (lastAgent != null) { + log.info("历史服务优先: 客户{}分配给上次服务坐席{}", + call.getCallerNumber(), lastAgent.getId()); + return lastAgent; + } + + // 策略2: 最长空闲优先 + Agent longestIdleAgent = findLongestIdleAgent(agents); + if (longestIdleAgent != null) { + log.info("最长空闲优先: 选择坐席{}", longestIdleAgent.getId()); + return longestIdleAgent; + } + + // 策略3: 轮询 + Agent roundRobinAgent = selectByRoundRobin(agents, call.getSkillGroup()); + log.info("轮询分配: 选择坐席{}", roundRobinAgent.getId()); + return roundRobinAgent; + } + + /** + * 查找上次服务该客户的坐席 + */ + private Agent findLastServingAgent(String customerNumber, List agents) { + String lastAgentId = (String) redisTemplate.opsForHash() + .get(AGENT_CUSTOMER_MAP_KEY, customerNumber); + + if (lastAgentId != null) { + return agents.stream() + .filter(a -> a.getId().equals(lastAgentId)) + .findFirst() + .orElse(null); + } + return null; + } + + /** + * 查找空闲时间最长的坐席 + */ + private Agent findLongestIdleAgent(List agents) { + return agents.stream() + .max(Comparator.comparing(agent -> { + String key = AGENT_IDLE_TIME_KEY + agent.getId(); + Long idleTime = (Long) redisTemplate.opsForValue().get(key); + return idleTime != null ? idleTime : 0L; + })) + .orElse(null); + } + + /** + * 轮询选择坐席 + */ + private Agent selectByRoundRobin(List agents, String skillGroup) { + int currentIndex = roundRobinIndex.getOrDefault(skillGroup, 0); + int nextIndex = (currentIndex + 1) % agents.size(); + roundRobinIndex.put(skillGroup, nextIndex); + return agents.get(currentIndex); + } + + /** + * 分配呼叫给坐席 + */ + private void assignCallToAgent(Call call, Agent agent) { + log.info("分配呼叫: uuid={} -> agent={}", call.getUuid(), agent.getId()); + + // 更新坐席状态 + agentService.updateAgentState(agent.getId(), AgentState.RINGING); + + // 更新呼叫信息 + call.setAgentId(agent.getId()); + call.setAgentExtension(agent.getExtension()); + callService.updateCall(call); + + // 将呼叫转接到坐席分机 + // 方式1: 使用uuid_transfer + eslManager.sendSyncApiCommand("uuid_transfer", + call.getUuid() + " " + agent.getExtension() + " XML default"); + + // 方式2: 使用originate + bridge(更灵活) + // String bridgeCmd = String.format( + // "{origination_uuid=%s,agent_id=%s}user/%s", + // UUID.randomUUID(), agent.getId(), agent.getExtension()); + // eslManager.sendSyncApiCommand("uuid_broadcast", + // call.getUuid() + " bridge::" + bridgeCmd + " both"); + + // 记录坐席-客户关系(用于历史服务优先) + redisTemplate.opsForHash().put(AGENT_CUSTOMER_MAP_KEY, + call.getCallerNumber(), agent.getId()); + } + + /** + * 通话结束处理 + */ + public void onCallEnd(String agentId, Call call) { + log.info("通话结束: agent={}, call={}", agentId, call.getUuid()); + + // 更新坐席状态为后处理 + agentService.updateAgentState(agentId, AgentState.WRAP_UP); + + // 设置后处理超时(30秒后自动置闲) + // 由定时任务处理 + } + + /** + * 坐席置闲时记录空闲时间 + */ + public void onAgentReady(String agentId, String skillGroup) { + String key = AGENT_IDLE_TIME_KEY + agentId; + redisTemplate.opsForValue().set(key, System.currentTimeMillis()); + + // 尝试分配队列中的呼叫 + tryAssign(skillGroup); + } + + /** + * 定时处理队列 + */ + @Scheduled(fixedDelay = 1000) + public void processQueues() { + // 获取所有技能组 + Set skillGroups = agentService.getAllSkillGroups(); + for (String skillGroup : skillGroups) { + tryAssign(skillGroup); + } + } + + /** + * 获取队列状态 + */ + public QueueStatus getQueueStatus(String skillGroup) { + String queueKey = QUEUE_KEY_PREFIX + skillGroup; + + QueueStatus status = new QueueStatus(); + status.setSkillGroup(skillGroup); + status.setWaitingCount(redisTemplate.opsForZSet().size(queueKey)); + status.setAvailableAgents(agentService.getAvailableAgents(skillGroup).size()); + + // 计算最长等待时间 + Set items = redisTemplate.opsForZSet().range(queueKey, 0, 0); + if (items != null && !items.isEmpty()) { + QueueItem firstItem = (QueueItem) items.iterator().next(); + long waitSeconds = java.time.Duration.between( + firstItem.getEnqueueTime(), LocalDateTime.now()).getSeconds(); + status.setLongestWaitTime(waitSeconds); + } + + return status; + } + + /** + * 溢出处理 + * 当技能组无可用坐席且等待时间超过阈值时,溢出到其他技能组 + */ + @Scheduled(fixedDelay = 5000) + public void handleOverflow() { + // 获取溢出配置 + Map overflowConfig = getOverflowConfig(); + + for (Map.Entry entry : overflowConfig.entrySet()) { + String sourceGroup = entry.getKey(); + String targetGroup = entry.getValue(); + + String queueKey = QUEUE_KEY_PREFIX + sourceGroup; + Set items = redisTemplate.opsForZSet().range(queueKey, 0, -1); + + if (items == null || items.isEmpty()) { + continue; + } + + // 检查是否需要溢出 + List sourceAgents = agentService.getAvailableAgents(sourceGroup); + List targetAgents = agentService.getAvailableAgents(targetGroup); + + if (sourceAgents.isEmpty() && !targetAgents.isEmpty()) { + for (Object obj : items) { + QueueItem item = (QueueItem) obj; + long waitSeconds = java.time.Duration.between( + item.getEnqueueTime(), LocalDateTime.now()).getSeconds(); + + // 等待超过60秒,溢出 + if (waitSeconds > 60) { + log.info("溢出处理: uuid={}, {}->{}", + item.getCallUuid(), sourceGroup, targetGroup); + + // 移出原队列 + redisTemplate.opsForZSet().remove(queueKey, item); + + // 加入目标队列 + item.setSkillGroup(targetGroup); + String targetQueueKey = QUEUE_KEY_PREFIX + targetGroup; + double score = item.getPriority() * 1000000000L + + System.currentTimeMillis() / 1000; + redisTemplate.opsForZSet().add(targetQueueKey, item, score); + + // 尝试分配 + tryAssign(targetGroup); + } + } + } + } + } + + private Map getOverflowConfig() { + // 配置:源技能组 -> 目标技能组 + Map config = new HashMap<>(); + config.put("rescue_group", "default_group"); + config.put("housekeeping_group", "default_group"); + config.put("driver_group", "default_group"); + return config; + } +} +``` + +#### 3.2.7 坐席服务 + +```java +package com.callcenter.service; + +import com.callcenter.esl.EslConnectionManager; +import com.callcenter.model.*; +import com.callcenter.websocket.EventPushService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Service; + +import java.time.LocalDateTime; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 坐席服务 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class AgentService { + + private final RedisTemplate redisTemplate; + private final EslConnectionManager eslManager; + private final EventPushService eventPushService; + private final AcdService acdService; + + private static final String AGENT_KEY_PREFIX = "agent:"; + private static final String AGENT_SET_KEY = "agents:all"; + private static final String SKILL_GROUP_AGENTS_KEY = "skillgroup:agents:"; + + /** + * 坐席签入 + */ + public void signIn(String agentId, String extension, List skillGroups) { + log.info("坐席签入: agentId={}, extension={}, skills={}", + agentId, extension, skillGroups); + + // 检查分机是否注册 + String regStatus = eslManager.sendSyncApiCommand("sofia_contact", + "internal/" + extension + "@${domain}"); + if (regStatus.contains("error")) { + throw new RuntimeException("分机未注册: " + extension); + } + + Agent agent = new Agent(); + agent.setId(agentId); + agent.setExtension(extension); + agent.setSkillGroups(skillGroups); + agent.setState(AgentState.NOT_READY); + agent.setSignInTime(LocalDateTime.now()); + + // 保存坐席信息 + String key = AGENT_KEY_PREFIX + agentId; + redisTemplate.opsForValue().set(key, agent); + + // 加入坐席集合 + redisTemplate.opsForSet().add(AGENT_SET_KEY, agentId); + + // 加入技能组 + for (String skillGroup : skillGroups) { + redisTemplate.opsForSet().add(SKILL_GROUP_AGENTS_KEY + skillGroup, agentId); + } + + // 推送状态变更 + eventPushService.pushAgentState(agent); + } + + /** + * 坐席签出 + */ + public void signOut(String agentId) { + log.info("坐席签出: agentId={}", agentId); + + Agent agent = getAgent(agentId); + if (agent == null) { + return; + } + + // 检查是否在通话中 + if (agent.getState() == AgentState.BUSY || + agent.getState() == AgentState.RINGING) { + throw new RuntimeException("坐席正在通话中,无法签出"); + } + + // 从技能组移除 + for (String skillGroup : agent.getSkillGroups()) { + redisTemplate.opsForSet().remove(SKILL_GROUP_AGENTS_KEY + skillGroup, agentId); + } + + // 从坐席集合移除 + redisTemplate.opsForSet().remove(AGENT_SET_KEY, agentId); + + // 删除坐席信息 + String key = AGENT_KEY_PREFIX + agentId; + redisTemplate.delete(key); + + // 推送签出事件 + agent.setState(AgentState.OFFLINE); + eventPushService.pushAgentState(agent); + } + + /** + * 坐席置闲 + */ + public void ready(String agentId) { + log.info("坐席置闲: agentId={}", agentId); + + Agent agent = getAgent(agentId); + if (agent == null) { + throw new RuntimeException("坐席不存在"); + } + + if (agent.getState() == AgentState.BUSY) { + throw new RuntimeException("坐席正在通话中"); + } + + updateAgentState(agentId, AgentState.READY); + + // 通知ACD有坐席可用 + for (String skillGroup : agent.getSkillGroups()) { + acdService.onAgentReady(agentId, skillGroup); + } + } + + /** + * 坐席置忙 + */ + public void notReady(String agentId, String reason) { + log.info("坐席置忙: agentId={}, reason={}", agentId, reason); + + Agent agent = getAgent(agentId); + if (agent == null) { + throw new RuntimeException("坐席不存在"); + } + + if (agent.getState() == AgentState.BUSY) { + throw new RuntimeException("坐席正在通话中"); + } + + agent.setNotReadyReason(reason); + updateAgentState(agentId, AgentState.NOT_READY); + } + + /** + * 坐席小休 + */ + public void pause(String agentId, String reason) { + log.info("坐席小休: agentId={}, reason={}", agentId, reason); + + Agent agent = getAgent(agentId); + if (agent == null) { + throw new RuntimeException("坐席不存在"); + } + + if (agent.getState() == AgentState.BUSY) { + throw new RuntimeException("坐席正在通话中"); + } + + agent.setPauseReason(reason); + updateAgentState(agentId, AgentState.PAUSED); + } + + /** + * 更新坐席状态 + */ + public void updateAgentState(String agentId, AgentState newState) { + Agent agent = getAgent(agentId); + if (agent == null) { + return; + } + + AgentState oldState = agent.getState(); + agent.setState(newState); + agent.setStateTime(LocalDateTime.now()); + + // 保存 + String key = AGENT_KEY_PREFIX + agentId; + redisTemplate.opsForValue().set(key, agent); + + log.info("坐席状态变更: agent={}, {} -> {}", agentId, oldState, newState); + + // 推送状态变更 + eventPushService.pushAgentState(agent); + } + + /** + * 获取坐席信息 + */ + public Agent getAgent(String agentId) { + String key = AGENT_KEY_PREFIX + agentId; + return (Agent) redisTemplate.opsForValue().get(key); + } + + /** + * 获取技能组可用坐席 + */ + public List getAvailableAgents(String skillGroup) { + Set agentIds = redisTemplate.opsForSet() + .members(SKILL_GROUP_AGENTS_KEY + skillGroup); + + if (agentIds == null || agentIds.isEmpty()) { + return Collections.emptyList(); + } + + return agentIds.stream() + .map(id -> getAgent((String) id)) + .filter(agent -> agent != null && agent.getState() == AgentState.READY) + .collect(Collectors.toList()); + } + + /** + * 获取所有技能组 + */ + public Set getAllSkillGroups() { + Set keys = redisTemplate.keys(SKILL_GROUP_AGENTS_KEY + "*"); + if (keys == null) { + return Collections.emptySet(); + } + return keys.stream() + .map(key -> key.replace(SKILL_GROUP_AGENTS_KEY, "")) + .collect(Collectors.toSet()); + } + + /** + * 获取所有坐席状态(监控大屏) + */ + public List getAllAgents() { + Set agentIds = redisTemplate.opsForSet().members(AGENT_SET_KEY); + if (agentIds == null) { + return Collections.emptyList(); + } + return agentIds.stream() + .map(id -> getAgent((String) id)) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + } + + /** + * 获取坐席状态统计 + */ + public Map getAgentStateStats() { + return getAllAgents().stream() + .collect(Collectors.groupingBy(Agent::getState, Collectors.counting())); + } +} +``` + +### 3.3 Go ESL开发 + +如果您的团队更熟悉Go语言,以下是Go版本的ESL开发示例: + +#### 3.3.1 项目结构 + +``` +callcenter-cti-go/ +├── go.mod +├── go.sum +├── main.go +├── config/ +│ └── config.go +├── esl/ +│ ├── client.go # ESL客户端 +│ ├── event.go # 事件定义 +│ └── handler.go # 事件处理器 +├── service/ +│ ├── agent.go # 坐席服务 +│ ├── call.go # 呼叫服务 +│ └── acd.go # ACD服务 +├── model/ +│ └── models.go # 数据模型 +├── api/ +│ ├── router.go # 路由 +│ ├── agent_handler.go # 坐席API +│ └── call_handler.go # 呼叫API +└── websocket/ + └── hub.go # WebSocket推送 +``` + +#### 3.3.2 ESL客户端 + +```go +// esl/client.go +package esl + +import ( + "bufio" + "fmt" + "log" + "net" + "net/textproto" + "strconv" + "strings" + "sync" + "time" +) + +// ESL客户端 +type Client struct { + conn net.Conn + reader *textproto.Reader + writer *bufio.Writer + mu sync.Mutex + connected bool + password string + eventChan chan *Event + handlers []EventHandler + reconnect bool +} + +// 事件处理器接口 +type EventHandler interface { + Handle(event *Event) +} + +// 创建ESL客户端 +func NewClient(host string, port int, password string) (*Client, error) { + client := &Client{ + password: password, + eventChan: make(chan *Event, 1000), + handlers: make([]EventHandler, 0), + reconnect: true, + } + + err := client.connect(host, port) + if err != nil { + return nil, err + } + + // 启动事件读取协程 + go client.readLoop() + + // 启动事件分发协程 + go client.dispatchLoop() + + return client, nil +} + +// 连接FreeSWITCH +func (c *Client) connect(host string, port int) error { + addr := fmt.Sprintf("%s:%d", host, port) + + conn, err := net.DialTimeout("tcp", addr, 10*time.Second) + if err != nil { + return fmt.Errorf("连接失败: %v", err) + } + + c.conn = conn + c.reader = textproto.NewReader(bufio.NewReader(conn)) + c.writer = bufio.NewWriter(conn) + + // 读取欢迎消息 + _, err = c.readMessage() + if err != nil { + return err + } + + // 认证 + err = c.auth() + if err != nil { + return err + } + + c.connected = true + log.Println("ESL连接成功") + + return nil +} + +// 认证 +func (c *Client) auth() error { + _, err := c.sendCommand(fmt.Sprintf("auth %s", c.password)) + if err != nil { + return fmt.Errorf("认证失败: %v", err) + } + return nil +} + +// 发送命令 +func (c *Client) sendCommand(command string) (*Message, error) { + c.mu.Lock() + defer c.mu.Unlock() + + _, err := c.writer.WriteString(command + "\n\n") + if err != nil { + return nil, err + } + c.writer.Flush() + + return c.readMessage() +} + +// 发送API命令 +func (c *Client) API(command string, args string) (string, error) { + cmd := fmt.Sprintf("api %s %s", command, args) + msg, err := c.sendCommand(cmd) + if err != nil { + return "", err + } + return msg.Body, nil +} + +// 发送后台API命令 +func (c *Client) BgAPI(command string, args string) (string, error) { + cmd := fmt.Sprintf("bgapi %s %s", command, args) + msg, err := c.sendCommand(cmd) + if err != nil { + return "", err + } + return msg.GetHeader("Job-UUID"), nil +} + +// 订阅事件 +func (c *Client) Subscribe(events ...string) error { + eventStr := strings.Join(events, " ") + _, err := c.sendCommand(fmt.Sprintf("event plain %s", eventStr)) + return err +} + +// 订阅所有事件 +func (c *Client) SubscribeAll() error { + _, err := c.sendCommand("event plain ALL") + return err +} + +// 读取消息 +func (c *Client) readMessage() (*Message, error) { + msg := &Message{ + Headers: make(map[string]string), + } + + // 读取headers + for { + line, err := c.reader.ReadLine() + if err != nil { + return nil, err + } + + if line == "" { + break + } + + parts := strings.SplitN(line, ": ", 2) + if len(parts) == 2 { + msg.Headers[parts[0]] = parts[1] + } + } + + // 读取body + if lenStr := msg.GetHeader("Content-Length"); lenStr != "" { + length, _ := strconv.Atoi(lenStr) + if length > 0 { + body := make([]byte, length) + _, err := c.reader.R.Read(body) + if err != nil { + return nil, err + } + msg.Body = string(body) + } + } + + return msg, nil +} + +// 事件读取循环 +func (c *Client) readLoop() { + for c.connected { + msg, err := c.readMessage() + if err != nil { + log.Printf("读取消息错误: %v", err) + c.connected = false + if c.reconnect { + c.tryReconnect() + } + return + } + + contentType := msg.GetHeader("Content-Type") + if contentType == "text/event-plain" { + event := parseEvent(msg) + c.eventChan <- event + } + } +} + +// 事件分发循环 +func (c *Client) dispatchLoop() { + for event := range c.eventChan { + for _, handler := range c.handlers { + go handler.Handle(event) + } + } +} + +// 尝试重连 +func (c *Client) tryReconnect() { + for i := 0; i < 10; i++ { + time.Sleep(5 * time.Second) + log.Printf("尝试重连ESL (第%d次)...", i+1) + + // TODO: 重新连接 + } +} + +// 添加事件处理器 +func (c *Client) AddHandler(handler EventHandler) { + c.handlers = append(c.handlers, handler) +} + +// 关闭连接 +func (c *Client) Close() { + c.connected = false + c.reconnect = false + if c.conn != nil { + c.conn.Close() + } + close(c.eventChan) +} + +// 消息结构 +type Message struct { + Headers map[string]string + Body string +} + +func (m *Message) GetHeader(name string) string { + if v, ok := m.Headers[name]; ok { + return v + } + return "" +} + +// 解析事件 +func parseEvent(msg *Message) *Event { + event := &Event{ + Headers: make(map[string]string), + } + + // 解析body中的headers + lines := strings.Split(msg.Body, "\n") + for _, line := range lines { + parts := strings.SplitN(line, ": ", 2) + if len(parts) == 2 { + // URL解码 + value := strings.ReplaceAll(parts[1], "%20", " ") + event.Headers[parts[0]] = value + } + } + + event.Name = event.GetHeader("Event-Name") + event.UUID = event.GetHeader("Unique-ID") + + return event +} +``` + +#### 3.3.3 事件定义 + +```go +// esl/event.go +package esl + +// 事件结构 +type Event struct { + Name string + UUID string + Headers map[string]string +} + +func (e *Event) GetHeader(name string) string { + if v, ok := e.Headers[name]; ok { + return v + } + return "" +} + +// 事件名称常量 +const ( + EventChannelCreate = "CHANNEL_CREATE" + EventChannelAnswer = "CHANNEL_ANSWER" + EventChannelBridge = "CHANNEL_BRIDGE" + EventChannelUnbridge = "CHANNEL_UNBRIDGE" + EventChannelHangup = "CHANNEL_HANGUP" + EventChannelHangupComplete = "CHANNEL_HANGUP_COMPLETE" + EventChannelState = "CHANNEL_STATE" + EventDTMF = "DTMF" + EventRecordStart = "RECORD_START" + EventRecordStop = "RECORD_STOP" + EventCustom = "CUSTOM" +) +``` + +#### 3.3.4 事件处理器 + +```go +// esl/handler.go +package esl + +import ( + "callcenter/service" + "log" +) + +// 呼叫中心事件处理器 +type CallCenterHandler struct { + callService *service.CallService + agentService *service.AgentService + acdService *service.AcdService +} + +func NewCallCenterHandler( + callService *service.CallService, + agentService *service.AgentService, + acdService *service.AcdService, +) *CallCenterHandler { + return &CallCenterHandler{ + callService: callService, + agentService: agentService, + acdService: acdService, + } +} + +func (h *CallCenterHandler) Handle(event *Event) { + switch event.Name { + case EventChannelCreate: + h.handleChannelCreate(event) + case EventChannelAnswer: + h.handleChannelAnswer(event) + case EventChannelBridge: + h.handleChannelBridge(event) + case EventChannelHangup: + h.handleChannelHangup(event) + case EventChannelHangupComplete: + h.handleChannelHangupComplete(event) + case EventDTMF: + h.handleDTMF(event) + } +} + +func (h *CallCenterHandler) handleChannelCreate(event *Event) { + uuid := event.UUID + direction := event.GetHeader("Call-Direction") + callerNumber := event.GetHeader("Caller-Caller-ID-Number") + calleeNumber := event.GetHeader("Caller-Destination-Number") + + log.Printf("新呼叫: uuid=%s, direction=%s, caller=%s, callee=%s", + uuid, direction, callerNumber, calleeNumber) + + // 创建呼叫记录 + call := &service.Call{ + UUID: uuid, + Direction: direction, + CallerNumber: callerNumber, + CalleeNumber: calleeNumber, + State: "ringing", + } + + h.callService.SaveCall(call) + + // 呼入排队 + if direction == "inbound" { + skillGroup := event.GetHeader("variable_skill_group") + call.SkillGroup = skillGroup + h.acdService.Enqueue(call) + } +} + +func (h *CallCenterHandler) handleChannelAnswer(event *Event) { + uuid := event.UUID + log.Printf("通话接听: uuid=%s", uuid) + + call := h.callService.GetCall(uuid) + if call != nil { + call.State = "answered" + h.callService.UpdateCall(call) + } +} + +func (h *CallCenterHandler) handleChannelBridge(event *Event) { + uuid := event.UUID + otherUUID := event.GetHeader("Other-Leg-Unique-ID") + log.Printf("通道桥接: uuid=%s, other=%s", uuid, otherUUID) + + call := h.callService.GetCall(uuid) + if call != nil { + call.State = "bridged" + call.BridgeUUID = otherUUID + h.callService.UpdateCall(call) + } +} + +func (h *CallCenterHandler) handleChannelHangup(event *Event) { + uuid := event.UUID + hangupCause := event.GetHeader("Hangup-Cause") + log.Printf("通话挂断: uuid=%s, cause=%s", uuid, hangupCause) + + call := h.callService.GetCall(uuid) + if call != nil { + call.State = "hangup" + call.HangupCause = hangupCause + h.callService.UpdateCall(call) + + // 更新坐席状态 + if call.AgentID != "" { + h.acdService.OnCallEnd(call.AgentID, call) + } + } +} + +func (h *CallCenterHandler) handleChannelHangupComplete(event *Event) { + uuid := event.UUID + billsec := event.GetHeader("variable_billsec") + recordingPath := event.GetHeader("variable_recording_path") + + log.Printf("通话结束: uuid=%s, billsec=%s, recording=%s", + uuid, billsec, recordingPath) + + call := h.callService.GetCall(uuid) + if call != nil { + call.Billsec = billsec + call.RecordingPath = recordingPath + h.callService.UpdateCall(call) + } +} + +func (h *CallCenterHandler) handleDTMF(event *Event) { + uuid := event.UUID + digit := event.GetHeader("DTMF-Digit") + log.Printf("DTMF按键: uuid=%s, digit=%s", uuid, digit) +} +``` + +--- + +## 第四部分 呼叫中心场景开发实践 + +### 4.1 预测式外呼实现 + +```java +package com.callcenter.service; + +import com.callcenter.esl.EslConnectionManager; +import com.callcenter.model.*; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Service; + +import java.util.*; +import java.util.concurrent.*; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * 预测式外呼服务 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class PredictiveDialerService { + + private final EslConnectionManager eslManager; + private final AgentService agentService; + private final CallService callService; + + // 外呼任务 + private final Map activeTasks = new ConcurrentHashMap<>(); + // 外呼线程池 + private final ExecutorService dialerExecutor = Executors.newFixedThreadPool(10); + + /** + * 创建外呼任务 + */ + public String createTask(DialTaskRequest request) { + String taskId = UUID.randomUUID().toString(); + + DialTask task = new DialTask(); + task.setId(taskId); + task.setName(request.getName()); + task.setSkillGroup(request.getSkillGroup()); + task.setCallerIdNumber(request.getCallerIdNumber()); + task.setNumbers(new LinkedBlockingQueue<>(request.getNumbers())); + task.setMaxConcurrent(request.getMaxConcurrent()); + task.setState(TaskState.CREATED); + task.setStats(new DialStats()); + + activeTasks.put(taskId, task); + log.info("创建外呼任务: taskId={}, name={}, numbers={}", + taskId, request.getName(), request.getNumbers().size()); + + return taskId; + } + + /** + * 启动任务 + */ + public void startTask(String taskId) { + DialTask task = activeTasks.get(taskId); + if (task == null) { + throw new RuntimeException("任务不存在"); + } + + task.setState(TaskState.RUNNING); + log.info("启动外呼任务: {}", taskId); + + // 启动外呼循环 + dialerExecutor.submit(() -> dialLoop(task)); + } + + /** + * 暂停任务 + */ + public void pauseTask(String taskId) { + DialTask task = activeTasks.get(taskId); + if (task != null) { + task.setState(TaskState.PAUSED); + log.info("暂停外呼任务: {}", taskId); + } + } + + /** + * 恢复任务 + */ + public void resumeTask(String taskId) { + DialTask task = activeTasks.get(taskId); + if (task != null && task.getState() == TaskState.PAUSED) { + task.setState(TaskState.RUNNING); + dialerExecutor.submit(() -> dialLoop(task)); + log.info("恢复外呼任务: {}", taskId); + } + } + + /** + * 停止任务 + */ + public void stopTask(String taskId) { + DialTask task = activeTasks.get(taskId); + if (task != null) { + task.setState(TaskState.STOPPED); + log.info("停止外呼任务: {}", taskId); + } + } + + /** + * 外呼循环 + */ + private void dialLoop(DialTask task) { + log.info("开始外呼循环: taskId={}", task.getId()); + + while (task.getState() == TaskState.RUNNING && !task.getNumbers().isEmpty()) { + try { + // 计算应该发起的呼叫数 + int dialCount = calculateDialCount(task); + + if (dialCount <= 0) { + // 没有空闲坐席,等待 + Thread.sleep(1000); + continue; + } + + // 发起外呼 + for (int i = 0; i < dialCount; i++) { + String number = task.getNumbers().poll(); + if (number == null) { + break; + } + + dial(task, number); + } + + // 短暂等待,控制拨打速率 + Thread.sleep(500); + + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + break; + } catch (Exception e) { + log.error("外呼异常: {}", e.getMessage(), e); + } + } + + // 任务完成 + if (task.getNumbers().isEmpty()) { + task.setState(TaskState.COMPLETED); + } + + log.info("外呼循环结束: taskId={}, state={}", task.getId(), task.getState()); + } + + /** + * 计算应该发起的呼叫数(预测算法) + */ + private int calculateDialCount(DialTask task) { + // 获取可用坐席数 + List availableAgents = agentService.getAvailableAgents(task.getSkillGroup()); + int availableAgentCount = availableAgents.size(); + + if (availableAgentCount == 0) { + return 0; + } + + // 当前正在拨打的数量 + int currentDialing = task.getStats().getCurrentDialing().get(); + + // 历史接通率(动态计算) + double connectRate = calculateConnectRate(task); + + // 预测式算法: + // 目标:让坐席接到电话时,刚好有客户接通 + // 预测需要拨打数 = 空闲坐席数 / 接通率 * 系数 + double factor = 1.2; // 超拨系数,避免坐席空闲 + int predictedDial = (int) Math.ceil(availableAgentCount / connectRate * factor); + + // 限制最大并发 + int maxAllowed = task.getMaxConcurrent() - currentDialing; + + return Math.min(predictedDial, maxAllowed); + } + + /** + * 计算接通率 + */ + private double calculateConnectRate(DialTask task) { + DialStats stats = task.getStats(); + int total = stats.getTotalDialed().get(); + int connected = stats.getConnected().get(); + + if (total < 10) { + // 样本太少,使用默认值 + return 0.3; + } + + double rate = (double) connected / total; + // 限制范围 + return Math.max(0.1, Math.min(0.8, rate)); + } + + /** + * 发起单个外呼 + */ + private void dial(DialTask task, String number) { + log.info("外呼: taskId={}, number={}", task.getId(), number); + + task.getStats().getTotalDialed().incrementAndGet(); + task.getStats().getCurrentDialing().incrementAndGet(); + + try { + // 构建originate命令 + // 先拨打客户,客户接听后转到队列等待坐席 + StringBuilder cmd = new StringBuilder(); + cmd.append("{"); + cmd.append("origination_caller_id_number=").append(task.getCallerIdNumber()).append(","); + cmd.append("task_id=").append(task.getId()).append(","); + cmd.append("dial_number=").append(number).append(","); + cmd.append("dialer_mode=predictive"); + cmd.append("}"); + + // 通过网关外呼 + cmd.append("sofia/gateway/carrier_primary/").append(number); + + // 客户接听后的处理 + cmd.append(" &lua(predictive_handler.lua)"); + + String result = eslManager.sendSyncApiCommand("originate", cmd.toString()); + + if (!result.startsWith("+OK")) { + log.warn("外呼失败: number={}, result={}", number, result); + task.getStats().getFailed().incrementAndGet(); + } + + } catch (Exception e) { + log.error("外呼异常: number={}", number, e); + task.getStats().getFailed().incrementAndGet(); + } finally { + task.getStats().getCurrentDialing().decrementAndGet(); + } + } + + /** + * 客户接听回调(由事件触发) + */ + public void onCustomerAnswer(String uuid, String taskId) { + DialTask task = activeTasks.get(taskId); + if (task == null) { + eslManager.sendSyncApiCommand("uuid_kill", uuid + " NO_ROUTE_DESTINATION"); + return; + } + + task.getStats().getConnected().incrementAndGet(); + + // 查找可用坐席 + List agents = agentService.getAvailableAgents(task.getSkillGroup()); + + if (agents.isEmpty()) { + // 无可用坐席,播放等待音乐 + eslManager.sendSyncApiCommand("uuid_broadcast", + uuid + " ivr/please_wait.wav both"); + + // 放入等待队列 + // TODO: 实现等待逻辑 + + // 超时处理 + task.getStats().getAbandoned().incrementAndGet(); + } else { + // 转接坐席 + Agent agent = agents.get(0); + agentService.updateAgentState(agent.getId(), AgentState.RINGING); + + eslManager.sendSyncApiCommand("uuid_transfer", + uuid + " " + agent.getExtension() + " XML default"); + + task.getStats().getTransferred().incrementAndGet(); + } + } + + /** + * 获取任务统计 + */ + public DialStats getTaskStats(String taskId) { + DialTask task = activeTasks.get(taskId); + return task != null ? task.getStats() : null; + } +} + +/** + * 外呼任务 + */ +@Data +class DialTask { + private String id; + private String name; + private String skillGroup; + private String callerIdNumber; + private BlockingQueue numbers; + private int maxConcurrent; + private TaskState state; + private DialStats stats; +} + +/** + * 任务状态 + */ +enum TaskState { + CREATED, RUNNING, PAUSED, STOPPED, COMPLETED +} + +/** + * 外呼统计 + */ +@Data +class DialStats { + private AtomicInteger totalDialed = new AtomicInteger(0); + private AtomicInteger currentDialing = new AtomicInteger(0); + private AtomicInteger connected = new AtomicInteger(0); + private AtomicInteger transferred = new AtomicInteger(0); + private AtomicInteger failed = new AtomicInteger(0); + private AtomicInteger abandoned = new AtomicInteger(0); +} +``` + +### 4.2 机器人外呼实现 + +```java +package com.callcenter.service; + +import com.callcenter.esl.EslConnectionManager; +import com.callcenter.model.*; +import com.callcenter.tts.TtsService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.*; +import java.util.concurrent.*; + +/** + * 机器人外呼服务 + * 用于批量通知、回访、满意度调查 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class RobotDialerService { + + private final EslConnectionManager eslManager; + private final TtsService ttsService; + + private final Map activeTasks = new ConcurrentHashMap<>(); + private final ExecutorService executor = Executors.newFixedThreadPool(20); + + /** + * 创建机器人外呼任务 + */ + public String createTask(RobotTaskRequest request) { + String taskId = UUID.randomUUID().toString(); + + RobotTask task = new RobotTask(); + task.setId(taskId); + task.setType(request.getType()); // NOTIFICATION, SURVEY, CALLBACK + task.setNumbers(new LinkedBlockingQueue<>(request.getNumbers())); + task.setTtsText(request.getTtsText()); + task.setVariables(request.getVariables()); // 每个号码的变量 + task.setMaxConcurrent(request.getMaxConcurrent()); + task.setRetryTimes(request.getRetryTimes()); + task.setCollectDtmf(request.isCollectDtmf()); + task.setState(TaskState.CREATED); + task.setResults(new ConcurrentHashMap<>()); + + activeTasks.put(taskId, task); + return taskId; + } + + /** + * 启动任务 + */ + public void startTask(String taskId) { + RobotTask task = activeTasks.get(taskId); + if (task == null) { + throw new RuntimeException("任务不存在"); + } + + task.setState(TaskState.RUNNING); + executor.submit(() -> robotDialLoop(task)); + } + + /** + * 机器人外呼循环 + */ + private void robotDialLoop(RobotTask task) { + log.info("开始机器人外呼: taskId={}", task.getId()); + + Semaphore semaphore = new Semaphore(task.getMaxConcurrent()); + + while (task.getState() == TaskState.RUNNING) { + String number = task.getNumbers().poll(); + if (number == null) { + break; + } + + try { + semaphore.acquire(); + executor.submit(() -> { + try { + robotCall(task, number); + } finally { + semaphore.release(); + } + }); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + break; + } + } + + // 等待所有呼叫完成 + try { + semaphore.acquire(task.getMaxConcurrent()); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + + task.setState(TaskState.COMPLETED); + log.info("机器人外呼完成: taskId={}", task.getId()); + } + + /** + * 单个机器人呼叫 + */ + private void robotCall(RobotTask task, String number) { + log.info("机器人呼叫: taskId={}, number={}", task.getId(), number); + + RobotCallResult result = new RobotCallResult(); + result.setNumber(number); + result.setStartTime(System.currentTimeMillis()); + + try { + // 替换TTS文本中的变量 + String ttsText = replaceTtsVariables(task.getTtsText(), + task.getVariables().get(number)); + + // 生成语音文件 + String audioFile = ttsService.synthesize(ttsText); + + // 构建外呼命令 + StringBuilder cmd = new StringBuilder(); + cmd.append("{"); + cmd.append("task_id=").append(task.getId()).append(","); + cmd.append("dial_number=").append(number).append(","); + cmd.append("robot_mode=true").append(","); + cmd.append("audio_file=").append(audioFile); + cmd.append("}"); + + cmd.append("sofia/gateway/carrier_primary/").append(number); + + if (task.isCollectDtmf()) { + // 需要收集按键 + cmd.append(" &lua(robot_survey.lua)"); + } else { + // 纯播报 + cmd.append(" &playback(").append(audioFile).append(")"); + } + + String apiResult = eslManager.sendSyncApiCommand("originate", cmd.toString()); + + if (apiResult.startsWith("+OK")) { + result.setStatus("SUCCESS"); + result.setCallUuid(apiResult.substring(4).trim()); + } else { + result.setStatus("FAILED"); + result.setError(apiResult); + + // 重试逻辑 + handleRetry(task, number); + } + + } catch (Exception e) { + log.error("机器人呼叫异常: number={}", number, e); + result.setStatus("ERROR"); + result.setError(e.getMessage()); + handleRetry(task, number); + } + + result.setEndTime(System.currentTimeMillis()); + task.getResults().put(number, result); + } + + /** + * 替换TTS变量 + */ + private String replaceTtsVariables(String template, Map vars) { + if (vars == null || vars.isEmpty()) { + return template; + } + + String result = template; + for (Map.Entry entry : vars.entrySet()) { + result = result.replace("${" + entry.getKey() + "}", entry.getValue()); + } + return result; + } + + /** + * 处理重试 + */ + private void handleRetry(RobotTask task, String number) { + int retryCount = task.getRetryCount().getOrDefault(number, 0); + if (retryCount < task.getRetryTimes()) { + task.getRetryCount().put(number, retryCount + 1); + task.getNumbers().offer(number); + log.info("加入重试队列: number={}, retry={}", number, retryCount + 1); + } + } + + /** + * 处理DTMF按键结果(由事件触发) + */ + public void onDtmfResult(String uuid, String taskId, String number, String digit) { + RobotTask task = activeTasks.get(taskId); + if (task == null) { + return; + } + + RobotCallResult result = task.getResults().get(number); + if (result != null) { + result.setDtmfDigit(digit); + log.info("收到按键: taskId={}, number={}, digit={}", taskId, number, digit); + } + } + + /** + * 获取任务结果 + */ + public List getTaskResults(String taskId) { + RobotTask task = activeTasks.get(taskId); + if (task == null) { + return Collections.emptyList(); + } + return new ArrayList<>(task.getResults().values()); + } +} +``` + +### 4.3 班长监控实现 + +```java +package com.callcenter.service; + +import com.callcenter.esl.EslConnectionManager; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +/** + * 班长监控服务 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class SupervisorService { + + private final EslConnectionManager eslManager; + + /** + * 监听坐席通话 + * 班长可以听到双方说话,但双方听不到班长 + */ + public void spy(String supervisorExtension, String targetUuid) { + log.info("开始监听: supervisor={}, target={}", supervisorExtension, targetUuid); + + // 使用eavesdrop应用 + // originate user/supervisor &eavesdrop(target_uuid) + String cmd = String.format( + "{origination_caller_id_name=监听}user/%s &eavesdrop(%s)", + supervisorExtension, targetUuid + ); + + String result = eslManager.sendSyncApiCommand("originate", cmd); + + if (!result.startsWith("+OK")) { + throw new RuntimeException("监听失败: " + result); + } + } + + /** + * 强插通话 + * 班长加入通话,三方都可以听到 + */ + public void barge(String supervisorExtension, String targetUuid) { + log.info("强插通话: supervisor={}, target={}", supervisorExtension, targetUuid); + + // 使用三方会议实现 + String confName = "barge_" + targetUuid; + + // 1. 将目标通话转入会议 + eslManager.sendSyncApiCommand("uuid_transfer", + targetUuid + " conference:" + confName + "+flags{mute} inline"); + + // 2. 呼叫班长加入会议 + String cmd = String.format( + "{origination_caller_id_name=强插}user/%s &conference(%s)", + supervisorExtension, confName + ); + + eslManager.sendSyncApiCommand("originate", cmd); + } + + /** + * 强拆通话 + * 强制挂断坐席通话 + */ + public void hangup(String targetUuid, String reason) { + log.info("强拆通话: target={}, reason={}", targetUuid, reason); + + eslManager.sendSyncApiCommand("uuid_kill", targetUuid + " " + reason); + } + + /** + * 密语(耳语) + * 班长对坐席说话,客户听不到 + */ + public void whisper(String supervisorExtension, String agentUuid) { + log.info("密语: supervisor={}, agent={}", supervisorExtension, agentUuid); + + // 使用eavesdrop的whisper模式 + String cmd = String.format( + "{origination_caller_id_name=密语}user/%s &eavesdrop(%s whisper)", + supervisorExtension, agentUuid + ); + + eslManager.sendSyncApiCommand("originate", cmd); + } + + /** + * 获取实时通话列表 + */ + public String getActiveCalls() { + return eslManager.sendSyncApiCommand("show", "calls"); + } + + /** + * 获取坐席通道信息 + */ + public String getChannelInfo(String uuid) { + return eslManager.sendSyncApiCommand("uuid_dump", uuid); + } +} +``` + +--- + +## 第五部分 高可用部署方案 + +### 5.1 主备架构 + +``` + ┌─────────────────┐ + │ Keepalived │ + │ VIP漂移管理 │ + └────────┬────────┘ + │ + ┌───────────────────────────┴───────────────────────────┐ + │ VIP: 10.10.1.100 │ + │ (SIP/ESL统一入口) │ + └───────────────────────────┬───────────────────────────┘ + │ + ┌─────────────────────┴─────────────────────┐ + │ │ + ▼ ▼ + ┌────────────────────┐ ┌────────────────────┐ + │ Master节点 │ 心跳检测 │ Backup节点 │ + │ 10.10.1.10 │◄──────────────────►│ 10.10.1.11 │ + ├────────────────────┤ ├────────────────────┤ + │ FreeSWITCH │ │ FreeSWITCH │ + │ CTI中间件 │ │ CTI中间件 │ + │ API服务 │ │ API服务 │ + └────────────────────┘ └────────────────────┘ + │ │ + │ 共享存储 / 数据同步 │ + │ │ + └─────────────────────┬─────────────────────┘ + │ + ┌──────────────────────────┼──────────────────────────┐ + │ │ │ + ▼ ▼ ▼ +┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ +│ MySQL 主从 │ │ Redis Sentinel │ │ NAS存储 │ +│ 10.10.2.10/11 │ │ 10.10.2.20-22 │ │ 10.10.2.30 │ +└─────────────────┘ └─────────────────┘ └─────────────────┘ +``` + +### 5.2 Keepalived配置 + +**Master节点配置:** + +```bash +# /etc/keepalived/keepalived.conf (Master) + +global_defs { + router_id FS_MASTER +} + +# 检测FreeSWITCH状态的脚本 +vrrp_script check_freeswitch { + script "/etc/keepalived/check_freeswitch.sh" + interval 2 + weight -20 + fall 3 + rise 2 +} + +vrrp_instance VI_FS { + state MASTER + interface eth0 + virtual_router_id 51 + priority 100 + advert_int 1 + + authentication { + auth_type PASS + auth_pass your_password + } + + virtual_ipaddress { + 10.10.1.100/24 dev eth0 + } + + track_script { + check_freeswitch + } + + notify_master "/etc/keepalived/notify_master.sh" + notify_backup "/etc/keepalived/notify_backup.sh" + notify_fault "/etc/keepalived/notify_fault.sh" +} +``` + +**检测脚本:** + +```bash +#!/bin/bash +# /etc/keepalived/check_freeswitch.sh + +# 检测FreeSWITCH进程 +if ! pgrep -x "freeswitch" > /dev/null; then + exit 1 +fi + +# 检测ESL端口 +if ! nc -z localhost 8021; then + exit 1 +fi + +# 检测SIP端口 +if ! nc -z localhost 5060; then + exit 1 +fi + +# 执行简单API命令测试 +result=$(fs_cli -x "status" 2>/dev/null) +if [[ $? -ne 0 ]]; then + exit 1 +fi + +exit 0 +``` + +**主节点切换通知脚本:** + +```bash +#!/bin/bash +# /etc/keepalived/notify_master.sh + +# 记录日志 +echo "$(date): Becoming MASTER" >> /var/log/keepalived-state.log + +# 启动FreeSWITCH(如果未运行) +systemctl start freeswitch + +# 启动CTI服务 +systemctl start callcenter-cti + +# 发送告警通知 +curl -X POST "http://your-alert-api/notify" \ + -d "message=FreeSWITCH切换到Master节点" +``` + +### 5.3 配置同步方案 + +```bash +#!/bin/bash +# sync_config.sh - 配置同步脚本 + +MASTER_HOST="10.10.1.10" +BACKUP_HOST="10.10.1.11" +FS_CONF_DIR="/usr/local/freeswitch/conf" + +# 使用rsync同步配置 +sync_config() { + rsync -avz --delete \ + ${FS_CONF_DIR}/ \ + ${BACKUP_HOST}:${FS_CONF_DIR}/ + + # 通知备机重载配置 + ssh ${BACKUP_HOST} "fs_cli -x 'reloadxml'" +} + +# 监控配置变化 +inotifywait -m -r -e modify,create,delete ${FS_CONF_DIR} | while read path action file; do + echo "配置变化: $path$file ($action)" + sync_config +done +``` + +### 5.4 FreeSWITCH集群配置 + +对于需要更高并发的场景,可以部署FreeSWITCH集群: + +```xml + + + + + + + + + + + + + + + + + + + + + + +``` + +--- + +## 第六部分 性能优化指南 + +### 6.1 FreeSWITCH优化 + +**系统级优化:** + +```bash +# /etc/security/limits.conf +freeswitch soft nofile 65536 +freeswitch hard nofile 65536 +freeswitch soft core unlimited +freeswitch hard core unlimited + +# /etc/sysctl.conf +net.core.rmem_max = 16777216 +net.core.wmem_max = 16777216 +net.core.rmem_default = 1048576 +net.core.wmem_default = 1048576 +net.core.netdev_max_backlog = 30000 +net.ipv4.tcp_max_syn_backlog = 10240 +net.ipv4.tcp_tw_reuse = 1 +net.ipv4.tcp_fin_timeout = 15 +``` + +**FreeSWITCH配置优化:** + +```xml + + + + + + + + + + + + + + + + +``` + +### 6.2 CTI中间件优化 + +```java +// 连接池配置 +@Configuration +public class ConnectionPoolConfig { + + @Bean + public ThreadPoolTaskExecutor eslEventExecutor() { + ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); + executor.setCorePoolSize(8); + executor.setMaxPoolSize(32); + executor.setQueueCapacity(10000); + executor.setThreadNamePrefix("esl-event-"); + executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); + executor.initialize(); + return executor; + } + + @Bean + public RedissonClient redissonClient() { + Config config = new Config(); + config.useClusterServers() + .addNodeAddress("redis://10.10.2.20:6379") + .addNodeAddress("redis://10.10.2.21:6379") + .addNodeAddress("redis://10.10.2.22:6379") + .setMasterConnectionPoolSize(64) + .setSlaveConnectionPoolSize(64); + return Redisson.create(config); + } +} +``` + +### 6.3 监控指标 + +```yaml +# prometheus配置 +scrape_configs: + - job_name: 'freeswitch' + static_configs: + - targets: ['10.10.1.10:9282', '10.10.1.11:9282'] + + - job_name: 'callcenter-cti' + static_configs: + - targets: ['10.10.1.10:8080', '10.10.1.11:8080'] + metrics_path: '/actuator/prometheus' +``` + +**关键监控指标:** + +| 指标 | 说明 | 阈值 | +|------|------|------| +| freeswitch_sessions_active | 当前活跃会话数 | <80%最大值 | +| freeswitch_sessions_per_second | 每秒新建会话数 | <100 | +| freeswitch_cpu_usage | CPU使用率 | <70% | +| freeswitch_memory_usage | 内存使用率 | <80% | +| esl_event_queue_size | 事件队列大小 | <5000 | +| acd_queue_wait_time | 平均等待时间 | <30s | +| agent_utilization | 坐席利用率 | 目标>70% | + +--- + +## 总结 + +本文档详细介绍了FreeSWITCH的技术架构和ESL开发实践,涵盖了: + +1. **核心概念**:Channel、Session、Event等基础概念 +2. **模块详解**:mod_sofia、Dialplan、ESL等核心模块 +3. **ESL开发**:Java和Go两种语言的开发示例 +4. **场景实践**:ACD、预测式外呼、机器人外呼、班长监控 +5. **高可用部署**:主备架构、Keepalived配置 +6. **性能优化**:系统优化、应用优化、监控指标 + +建议开发团队在正式开发前: +- 搭建FreeSWITCH测试环境熟悉操作 +- 仔细研读FreeSWITCH官方文档 +- 从简单场景(如点击拨号)开始,逐步实现复杂功能 +- 重视测试,特别是高可用切换测试和压力测试 diff --git a/cc-center/chat-📞 呼叫中心系统需求规划.txt b/cc-center/chat-📞 呼叫中心系统需求规划.txt new file mode 100644 index 0000000..c055215 --- /dev/null +++ b/cc-center/chat-📞 呼叫中心系统需求规划.txt @@ -0,0 +1,6953 @@ +### USER +你是一位资深的产品经理,对基于FreeSWITCH的呼叫中心系统有着丰富的产品经验。我现在想做一个企业的呼叫中心系统,除了可以实现基本的呼入呼出外,还要实现自动外呼和机器人客服。你可以向我问一些启发式的问题澄清需求,最终生成一份需求文档。 + +### ASSISTANT +您好!很高兴能帮助您规划这个呼叫中心系统。为了生成一份完整且符合您实际业务场景的需求文档,我需要通过一系列问题来深入了解您的需求。 + +让我们从最基础的业务背景开始: + +--- + +## 第一轮:业务背景与目标 + +**1. 关于您的企业和目标客户:** +- 这个呼叫中心系统是给**您自己企业内部使用**,还是作为**SaaS产品对外销售**给其他企业? +- 您的企业/目标客户属于哪个行业?(如:电商、金融、教育、医疗、政务热线等) + +**2. 关于规模预期:** +- 初期预计需要支持多少个**坐席(人工客服)**同时工作? +- 预计的**日呼叫量**大概是多少?(呼入+呼出) + +**3. 关于核心业务痛点:** +- 您目前为什么想要建设这个系统?是**从零开始建设**,还是**替换现有系统**? +- 如果是替换,现有系统最让您不满意的地方是什么? + +--- + +请先回答这几个基础问题,我会根据您的回答继续深入探讨呼入呼出、自动外呼、机器人客服等具体模块的细节需求。🎯 + +### USER +1.企业内部使用,企业属于服务行业,2.预计支持 150个坐席同时工作,日呼量50000 ,3.从零开始建设 + +### ASSISTANT +感谢您的回答!150坐席、日呼叫量5万是一个中大型呼叫中心的规模,服务行业的场景也非常典型。 + +--- + +## 第二轮:业务场景细化 + +**4. 关于服务业务类型:** +- 您的服务行业具体是哪类?(如:家政服务、汽车4S店/维修、物业管理、旅游预订、餐饮连锁、上门维修等) +- 您的客户群体主要是**ToC(个人消费者)**还是**ToB(企业客户)**? + +**5. 关于呼入呼出业务占比:** +- 目前预估的**呼入和呼出比例**大概是多少?(如:呼入70%呼出30%) +- 呼入的主要场景是什么?(如:咨询、投诉、预约、售后等) +- 呼出的主要场景是什么?(如:回访、营销推广、催收/催缴、通知提醒等) + +**6. 关于自动外呼的核心诉求:** +- 您希望自动外呼解决什么问题? + - [ ] 提高人工坐席效率(预测式外呼,减少等待) + - [ ] 完全无人化批量通知(如:短信+语音通知) + - [ ] 营销筛选(机器人先打,意向客户转人工) + - [ ] 其他:______ + +**7. 关于机器人客服的定位:** +- 您希望机器人客服承担什么角色? + - **呼入场景**:IVR导航、自助查询、常见问题解答、转人工前预处理? + - **呼出场景**:自动回访、满意度调查、标准化通知? +- 机器人是作为**第一道接待**(先机器人再转人工),还是**人工为主机器人辅助**? + +--- + +请您根据实际业务情况回答,这些信息将帮助我明确系统的功能优先级和架构设计方向。💡 + +### USER +服务行业类型:道路救援、家政服务,代驾服务,客户群体:ToC,呼入40%呼出60%,呼入的场景:叫服务,咨询、投诉,呼出场景:回访、营销推广、催收/催缴、通知提醒等,关于自动外呼的核心诉求:提高人工坐席效率和完全无人化批量通知;机器人客服的定位:**呼入场景**:IVR导航、常见问题解答、转人工前预处理,呼出场景:标准化通知、自动回访、满意度调查。先机器人再转人工 + +### ASSISTANT +非常清晰!您的业务场景很典型——**道路救援、家政、代驾**都是对**响应速度要求极高**的服务行业,而且ToC场景意味着客户体验至关重要。 + +--- + +## 第三轮:关键业务流程与系统集成 + +**8. 关于呼入核心流程(叫服务场景):** +- 当客户来电叫服务时,坐席需要**实时派单**给服务人员(救援师傅、家政阿姨、代驾司机)吗? +- 您是否已有**业务系统/派单系统/工单系统**需要与呼叫中心对接? + - 如果有,是什么系统?(自研、第三方SaaS如:易企秀、工单宝等) + - 如果没有,是否需要呼叫中心系统**内置工单模块**? + +**9. 关于客户来电识别:** +- 客户来电时,您希望系统能自动**识别客户身份**吗? + - [ ] 通过来电号码匹配历史客户资料 + - [ ] 弹出历史服务记录、订单记录 + - [ ] 显示客户标签(VIP、黑名单、投诉倾向等) +- 这意味着系统需要对接您的**CRM或会员系统**,您目前有这类系统吗? + +**10. 关于服务工作时间:** +- 您的呼叫中心是**7×24小时**运营,还是**固定工作时间**? +- 道路救援类业务通常是24小时的,非工作时间来电如何处理? + - [ ] 全部由机器人接待+记录,次日回拨 + - [ ] 安排夜班值班坐席 + - [ ] 紧急情况直接转值班手机 + +**11. 关于多业务线管理:** +- 道路救援、家政服务、代驾服务是**共用一个号码**,通过IVR分流?还是**不同业务独立号码**? +- 坐席是**混合技能组**(一个坐席可接多种业务),还是**专属技能组**(救援组、家政组、代驾组分开)? + +--- + +## 第四轮:自动外呼深入 + +**12. 关于预测式外呼(提高人工效率):** +- 外呼营销时,是否需要**预测式拨号**(系统自动批量拨打,接通后才转坐席)? +- 对于**接通率和坐席利用率**有什么期望指标吗? + +**13. 关于无人化批量通知:** +- 典型的通知场景有哪些? + - [ ] 服务人员即将到达通知 + - [ ] 订单确认/取消通知 + - [ ] 账单催缴提醒 + - [ ] 营销活动通知 +- 通知需要**纯语音播报**,还是需要**交互确认**(如:按1确认,按2取消)? +- 通知失败后是否需要**自动重试**或**转短信**? + +**14. 关于外呼数据来源:** +- 外呼名单从哪里来? + - [ ] 从业务系统自动推送 + - [ ] 人工Excel导入 + - [ ] API实时触发(如:订单完成自动触发回访) + +--- + +请您挑重点回答,我们离完整需求越来越近了!🚀 + +### USER +已经有了自己的CRM系统,需要呼叫中心系统集成CRM系统,客户来电叫服务时,识别客户身份,CRM系统弹屏,坐席在CRM系统上创建工单。呼叫中心是**7×24小时**运营,每个时间段都有坐席人员。不同业务独立号码,坐席**专属技能组**(救援组、家政组、代驾组分开)。外呼营销时,需要**预测式拨号,**对于**接通率和坐席利用率要能够统计。**典型的通知场景有:服务人员已经派出通知、服务人员即将到达通知,账单催缴提醒,通知需要**纯语音播报。**外呼名单从业务系统来。注意:坐席的操作方式是,是操作CRM系统或者业务系统,通过API的形式调用呼叫中心系统的呼入呼出功能。呼叫中心系统不需要有短信功能,由第三方的短信平台提供短信服务。 + +### ASSISTANT +非常关键的信息!您的架构思路非常清晰——**呼叫中心作为通信能力中台**,通过API为CRM/业务系统提供呼叫能力,这是目前主流且灵活的架构模式。 + +--- + +## 第五轮:技术架构与接口规范 + +**15. 关于CRM/业务系统集成方式:** +- 您的CRM系统是**Web端(B/S架构)**还是**桌面客户端(C/S架构)**? +- 坐席使用的话机形态是什么? + - [ ] **软电话(网页/PC软件接听)**——WebRTC或SIP软电话 + - [ ] **IP话机(桌面硬件话机)** + - [ ] **手机/手机App** +- 如果是软电话,您倾向于: + - [ ] 呼叫中心提供**独立软电话条**(小组件嵌入CRM) + - [ ] CRM系统**自行开发通话UI**,只调用呼叫中心API + +**16. 关于API能力需求确认:** +请确认以下API能力是否需要: + +| 功能分类 | 具体能力 | 是否需要 | +|---------|---------|---------| +| **呼入控制** | 来电弹屏通知(推送来电信息到CRM) | ? | +| | 接听/挂断/保持/取回 | ? | +| | 转接(转坐席/转技能组/转外线) | ? | +| | 三方通话/会议 | ? | +| **呼出控制** | 点击外呼(坐席点击号码拨打) | ? | +| | 预览式外呼(显示客户信息后手动拨打) | ? | +| | 预测式外呼(系统自动拨打,接通转坐席) | ? | +| **坐席状态** | 签入/签出/置忙/置闲/小休 | ? | +| | 实时坐席状态查询 | ? | +| **通话事件** | 通话状态回调(振铃、接通、挂断等) | ? | +| | 通话结束后话单推送 | ? | +| **录音** | 录音文件获取/下载 | ? | +| | 实时录音流(用于实时质检/转写) | ? | + +**17. 关于来电分配策略(ACD):** +- 同一技能组内多个坐席,来电如何分配? + - [ ] 轮询(Round Robin) + - [ ] 最长空闲优先 + - [ ] 技能值优先(技能等级高的优先) + - [ ] 历史服务优先(上次是谁服务的优先给谁) +- 如果技能组全忙,是否需要**排队等待**功能? + - [ ] 播放等待音乐/提示前面排队人数 + - [ ] 等待超时转其他组/留言/回拨 + +--- + +## 第六轮:机器人客服细化 + +**18. 关于呼入机器人(IVR+智能导航):** +- IVR导航的复杂度如何? + - [ ] **简单按键导航**:按1道路救援,按2家政服务,按3代驾... + - [ ] **语音识别导航**:客户直接说"我要叫代驾"自动识别转接 + - [ ] **多轮对话**:机器人先收集信息(位置、服务类型)再转人工 +- 常见问题解答需要支持多少个问题?(10个以内 / 10-50个 / 50个以上) +- 机器人**转人工的触发条件**是什么? + - [ ] 客户说"转人工" + - [ ] 客户按键选择 + - [ ] 机器人识别不了时自动转 + - [ ] 特定问题类型必须转人工(如投诉) + +**19. 关于呼出机器人:** +- 回访/满意度调查的典型流程是什么? + - 例如:播放"您好,请问您对本次服务满意吗?满意请按1,不满意请按2" +- 是否需要**采集客户按键结果**并回传业务系统? +- 如果客户不按键/无人接听,如何处理? + +**20. 关于机器人技术选型:** +- 您是否有**指定的ASR/TTS供应商**?(如:阿里云、科大讯飞、百度等) +- 还是希望呼叫中心系统**内置语音能力**? +- 如果涉及智能对话(NLU),是否有指定的对话平台?还是需要系统提供? + +--- + +## 第七轮:管理与运营功能 + +**21. 关于监控与管理:** +- 是否需要**实时监控大屏**?(显示:当前排队数、各组坐席状态、接通率等) +- 班长/主管需要哪些监控能力? + - [ ] 实时监听坐席通话 + - [ ] 强插(加入通话协助) + - [ ] 强拆(强制结束通话) + - [ ] 密语(对坐席耳语指导,客户听不到) + +**22. 关于统计报表:** +- 需要哪些维度的报表? + - [ ] 坐席维度:接通量、通话时长、工作状态时长占比 + - [ ] 技能组维度:呼入量、接通率、排队放弃率 + - [ ] 时段维度:每小时/每日话务量趋势 + - [ ] 外呼任务维度:拨打量、接通率、意向客户数 +- 报表是在**呼叫中心系统查看**,还是**数据推送到您的BI系统**? + +**23. 关于录音与质检:** +- 所有通话都需要**全程录音**吗? +- 是否需要**质检功能**? + - [ ] 人工质检(抽检打分) + - [ ] 智能质检(语音转文字+关键词检测+情绪分析) + +--- + +请您对以上问题进行确认和补充,尤其是**第16题API能力表格**,这对系统设计至关重要!📋 + +### USER +整套系统从零建设的话,大概需要多少预算?硬件和软件分别需要什么? + +### ASSISTANT +非常好的问题!在进入详细预算前,我需要先确认几个影响成本的关键因素: + +--- + +## 第八轮:预算与部署相关问题 + +**24. 关于部署方式:** +- 您倾向于哪种部署方式? + - [ ] **私有化部署**(服务器放在自己机房或自有云主机) + - [ ] **公有云部署**(阿里云、腾讯云、华为云等) + - [ ] **混合部署**(核心私有化,部分能力用云服务) + +**25. 关于线路资源:** +- 您目前是否已有**运营商线路资源**? + - [ ] 已有中继线路(E1/SIP中继) + - [ ] 已有95/96/400/1010号码 + - [ ] 没有,需要新申请 +- 三种业务(道路救援、家政、代驾)计划用几个号码? + +**26. 关于并发需求:** +- 150坐席同时工作,预估**最大并发通话数**是多少? + - 通常按坐席数的 **70%-80%** 估算,即 **100-120路并发** + - 您认为这个估算合理吗? + +**27. 关于建设方式:** +- 您倾向于哪种方式? + - [ ] **自研团队开发**(有FreeSWITCH开发能力) + - [ ] **采购成熟产品**(购买商业呼叫中心系统) + - [ ] **外包定制开发**(找供应商定制) + +--- + +## 预算估算框架(先给您一个概览) + +在您回答上述问题之前,我先给您一个**参考框架**,具体数字会根据您的回答调整: + +### 一、硬件/基础设施预算 + +| 项目 | 私有化部署 | 云部署 | +|------|-----------|--------| +| **服务器** | 10-30万(3-5台服务器集群) | 云主机 3-8万/年 | +| **存储(录音)** | 5-15万(NAS/SAN存储) | 对象存储 1-3万/年 | +| **网络设备** | 2-5万(交换机、防火墙) | 含在云服务中 | +| **语音网关** | 3-10万(若用传统E1线路) | SIP中继无需网关 | +| **IP话机(可选)** | 300-800元/台 × 150 = 4.5-12万 | 同左 | +| **机房/带宽** | 5-10万/年 | 含在云服务中 | +| **小计** | **25-80万(一次性)+ 5-10万/年** | **5-15万/年** | + +### 二、软件/系统预算 + +| 项目 | 采购商业产品 | 自研/定制开发 | +|------|------------|--------------| +| **呼叫中心平台** | 30-80万(按坐席授权) | 开发成本 50-150万 | +| **智能IVR/机器人** | 10-30万 + 调用费用 | 需对接ASR/TTS厂商 | +| **预测式外呼模块** | 10-20万 | 含在开发中 | +| **录音/质检系统** | 5-15万 | 含在开发中 | +| **API/集成开发** | 5-15万(定制费用) | 含在开发中 | +| **小计** | **60-160万** | **50-150万 + 团队成本** | + +### 三、语音资源/运营费用 + +| 项目 | 预估费用 | +|------|---------| +| **号码月租** | 95/96号码:5000-2万/月;400号码:1000-5000/月 | +| **通话费** | 呼入:0.02-0.05元/分钟;呼出:0.08-0.15元/分钟 | +| **ASR/TTS调用** | 约 0.01-0.03元/秒(按使用量) | +| **线路并发费** | SIP中继:约 50-100元/路/月 | + +**按日呼量5万、平均时长3分钟估算:** +- 月通话分钟数:5万 × 30天 × 3分钟 = **450万分钟/月** +- 呼入成本(40%):180万分钟 × 0.03 = **5.4万/月** +- 呼出成本(60%):270万分钟 × 0.10 = **27万/月** +- **月通信成本约:30-35万/月** + +--- + +### 四、总体预算汇总(参考) + +| 部署方式 | 首年投入 | 后续年度 | +|---------|---------|---------| +| **云部署 + 采购商业产品** | 70-180万 | 40-60万/年(含云资源+维保) | +| **私有化 + 采购商业产品** | 100-250万 | 20-40万/年(维保+资源) | +| **云部署 + 自研开发** | 80-200万 | 30-50万/年 + 研发团队 | + +> ⚠️ 以上**不含通信费用**(每年约 **360-420万**,这是大头) + +--- + +## 追问几个成本优化相关问题: + +**28. 关于话机/通话终端:** +- 坐席是否可以接受**纯软电话**(用耳麦+电脑接听)?可节省硬件话机成本 +- 还是必须配备**IP硬话机**? + +**29. 关于录音存储:** +- 录音需要保存多长时间?(3个月 / 6个月 / 1年 / 更长) +- 日均5万通话 × 3分钟 ≈ 15万分钟/天,月存储需求约 **1-2TB** + +**30. 关于智能语音:** +- 机器人对话的ASR/TTS,您倾向于: + - [ ] 用云厂商API(按量付费,无需部署) + - [ ] 私有化部署(一次性授权,成本较高但长期划算) + +--- + +请您回答 **第24-30题**,我将结合您之前的回答,给出更精准的预算方案和硬件软件清单!💰 + +### USER +关于CRM/业务系统集成方式:CRM系统是 **Web端(B/S架构),**坐席使用的话机形态是:IP话机,但是要支持软电话功能,软电话使用呼叫中心提供**独立软电话条**(小组件嵌入CRM),列出的API能力都需要,来电分配策略:可以支持多种分配策略,首先历史服务优先,最长空闲优先和轮训。如果技能组全忙,可以设置溢出到其他技能组。IVR导航要支持语音识别导航,常见问题解答需要支持50个以上。机器人**转人工的触发条件**是:客户说"转人工"、机器人识别不了时自动转、特定问题类型必须转人工(如投诉);机器人技术选型:指定的ASR/TTS供应商阿里云,如果涉及智能对话(NLU)由指定的对话平台。需要**实时监控大屏,**班长/主管需要监控能力:实时监听坐席通话、强插(加入通话协助)、强拆(强制结束通话);所有通话都要全程录音;统计报表和质检本次先不涉及。 + +### ASSISTANT +非常详细!信息已经非常完整了。让我再确认最后几个关键问题,然后就可以为您生成完整的需求文档了。 + +--- + +## 第九轮:最终确认 + +**31. 关于部署方式(回顾第24题):** +- 您倾向于 **私有化部署** 还是 **公有云部署**? + +**32. 关于线路资源(回顾第25题):** +- 是否已有运营商线路?还是需要新申请? +- 三种业务(道路救援、家政、代驾)分别用独立号码,计划用什么类型的号码? + - [ ] 95/96短号(品牌形象好,申请门槛高) + - [ ] 400号码(全国统一,成本适中) + - [ ] 普通固话/手机号(成本低) + +**33. 关于建设方式(回顾第27题):** +- 您倾向于: + - [ ] **采购成熟商业产品** + - [ ] **自有团队基于FreeSWITCH自研** + - [ ] **找供应商定制开发** + +**34. 关于录音存储(回顾第29题):** +- 录音需要保存多长时间? + +**35. 关于外呼机器人补充:** +- 您之前提到呼出机器人用于「标准化通知、自动回访、满意度调查」 +- 请确认回访/满意度调查是否需要**采集客户按键反馈**并回传业务系统? + - 例如:「满意请按1,不满意请按2」-> 结果写回CRM + +**36. 关于系统可用性要求:** +- 道路救援是紧急服务,对系统稳定性要求高 +- 是否需要**主备高可用部署**?(即一台故障,自动切换到备机) + +**37. 关于上线时间预期:** +- 您期望系统在多长时间内上线? + - [ ] 1-2个月(紧急) + - [ ] 3-4个月(正常) + - [ ] 6个月以上(充裕) + +--- + +请您回答以上问题后,我将为您生成一份完整的 **《呼叫中心系统需求规格说明书》**,包含: + +1. **项目概述**(背景、目标、范围) +2. **业务需求**(呼入、呼出、机器人场景) +3. **功能需求**(分模块详细描述) +4. **接口需求**(API清单) +5. **非功能需求**(性能、安全、可用性) +6. **系统架构建议** +7. **硬件软件清单** +8. **预算估算** +9. **项目里程碑建议** + +期待您的最后回复!📝 + +### USER +私有化部署,计划使用400号码和普通固话,建设方式:自有团队基于FreeSWITCH自研,录音需要长期保存,回访/满意度调查是需要**采集客户按键反馈**并回传业务系统;道路救援是紧急服务,对系统稳定性要求高且需要**主备高可用部署;**期望系统3-4个月上线。 + +### ASSISTANT +感谢您的耐心回答!所有关键信息已收集完毕。现在我为您生成完整的需求规格说明书。 + +--- + +# 企业呼叫中心系统需求规格说明书 + +**文档版本**:V1.0 +**编制日期**:2024年1月 +**文档状态**:初稿 + +--- + +## 第一章 项目概述 + +### 1.1 项目背景 + +本企业主营道路救援、家政服务、代驾服务三大业务板块,面向个人消费者(ToC)提供服务。随着业务规模扩大,现需建设一套专业的呼叫中心系统,以提升客户服务体验、提高服务响应效率、降低人工成本。 + +### 1.2 项目目标 + +| 目标维度 | 具体目标 | +|---------|---------| +| **服务能力** | 支持150坐席同时在线,日处理呼叫量50,000通 | +| **响应效率** | 道路救援等紧急服务实现快速响应,7×24小时不间断服务 | +| **人工效率** | 通过预测式外呼提升坐席利用率,减少空闲等待时间 | +| **自动化水平** | 通过智能IVR和机器人实现常见问题自助解答、批量通知自动化 | +| **系统稳定性** | 主备高可用架构,确保核心业务(道路救援)不中断 | + +### 1.3 项目范围 + +**纳入范围:** +- 基础呼叫能力(呼入/呼出) +- 智能IVR与语音导航 +- 呼入/呼出机器人 +- 预测式外呼 +- 无人化批量通知 +- CRM系统集成(API对接) +- 软电话条组件 +- 实时监控大屏 +- 班长监控功能 +- 全程录音 +- 主备高可用部署 + +**不纳入本期范围:** +- 统计报表系统(二期规划) +- 智能质检系统(二期规划) +- 短信功能(由第三方平台提供) + +### 1.4 术语定义 + +| 术语 | 定义 | +|------|------| +| **ACD** | 自动呼叫分配(Automatic Call Distribution) | +| **IVR** | 交互式语音应答(Interactive Voice Response) | +| **ASR** | 自动语音识别(Automatic Speech Recognition) | +| **TTS** | 语音合成(Text To Speech) | +| **NLU** | 自然语言理解(Natural Language Understanding) | +| **CTI** | 计算机电话集成(Computer Telephony Integration) | +| **SIP** | 会话发起协议(Session Initiation Protocol) | + +--- + +## 第二章 业务需求 + +### 2.1 业务架构 + +``` +┌─────────────────────────────────────────────────────────────────┐ +│ 客户触点 │ +│ 道路救援热线 家政服务热线 代驾服务热线 │ +│ (400-XXX-XXXX) (400-XXX-XXXX) (固话/400) │ +└───────────────┬─────────────────┬─────────────────┬─────────────┘ + │ │ │ + ▼ ▼ ▼ +┌─────────────────────────────────────────────────────────────────┐ +│ 呼叫中心系统 │ +│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ +│ │ 智能IVR │ │ 呼入机器人│ │ ACD分配 │ │ 外呼系统 │ │ +│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │ +│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ +│ │ 坐席管理 │ │ 录音系统 │ │ 实时监控 │ │ API网关 │ │ +│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │ +└───────────────────────────┬─────────────────────────────────────┘ + │ API + ▼ +┌─────────────────────────────────────────────────────────────────┐ +│ CRM/业务系统 │ +│ 客户管理 │ 工单管理 │ 派单系统 │ +└─────────────────────────────────────────────────────────────────┘ +``` + +### 2.2 呼入业务场景 + +#### 2.2.1 道路救援来电场景 + +**业务流程:** + +``` +客户来电 + → 智能IVR(语音识别:"道路救援") + → 机器人收集初步信息(可选) + → 转救援技能组 + → ACD分配(历史服务优先 > 最长空闲 > 轮询) + → 技能组全忙时溢出到备用组 + → 坐席接听 + CRM弹屏 + → 坐席在CRM创建工单/派单 + → 通话结束 → 录音保存 +``` + +**业务要求:** +- 响应时效要求高,需优先保障接通率 +- 支持7×24小时服务 +- 来电需快速识别客户身份,展示历史服务记录 + +#### 2.2.2 家政服务来电场景 + +**业务流程:** + +``` +客户来电 + → 智能IVR(按键或语音选择"家政服务") + → 常见问题解答(服务项目、价格咨询等) + → 客户需要人工服务 → 转家政技能组 + → 坐席接听 + CRM弹屏 + → 预约服务/创建工单 + → 通话结束 → 录音保存 +``` + +#### 2.2.3 代驾服务来电场景 + +**业务流程:** + +``` +客户来电 + → 智能IVR(语音识别:"叫代驾") + → 转代驾技能组 + → 坐席接听 + CRM弹屏 + → 创建代驾订单/派单 + → 通话结束 → 录音保存 +``` + +#### 2.2.4 投诉来电场景 + +**业务流程:** + +``` +客户来电 + → 智能IVR(识别"投诉"意图) + → 直接转人工(投诉不经机器人处理) + → 分配至对应业务技能组或投诉专席 + → CRM弹屏 + 标记投诉标签 + → 坐席记录投诉内容 +``` + +### 2.3 呼出业务场景 + +#### 2.3.1 预测式外呼(营销/回访) + +**业务流程:** + +``` +业务系统推送外呼任务(客户名单) + → 呼叫中心批量拨打 + → 客户接听 → 自动转接空闲坐席 + → CRM弹屏展示客户信息 + → 坐席进行营销/回访 + → 通话结束 → 录音保存 → 话单回传业务系统 +``` + +**业务要求:** +- 系统自动拨打,接通后才转坐席,减少坐席等待时间 +- 支持接通率、坐席利用率统计 +- 外呼任务支持暂停、恢复、停止 + +#### 2.3.2 机器人自动外呼(通知类) + +**场景一:服务人员派出/即将到达通知** + +``` +业务系统触发通知(API调用) + → 呼叫中心自动拨打客户电话 + → 播放TTS语音:"您好,您预约的道路救援服务,师傅已出发,预计10分钟到达..." + → 通话结束 → 结果回传业务系统 +``` + +**场景二:账单催缴提醒** + +``` +业务系统推送催缴名单 + → 批量自动拨打 + → 播放TTS语音:"您好,您有一笔待支付账单..." + → 纯语音播报,无需交互 + → 拨打结果回传(接通/未接通/关机等) +``` + +#### 2.3.3 机器人自动外呼(回访/满意度调查) + +**业务流程:** + +``` +业务系统推送回访任务 + → 呼叫中心自动拨打 + → 播放TTS语音:"您好,请问您对本次服务满意吗?满意请按1,不满意请按2" + → 采集客户按键 + → 按键结果回传业务系统 + → 不满意客户可选择转人工跟进 +``` + +### 2.4 机器人客服场景 + +#### 2.4.1 呼入机器人功能定位 + +| 功能 | 说明 | +|------|------| +| **语音导航** | 支持客户语音说出需求,自动识别并转接对应技能组 | +| **常见问题解答** | 支持50个以上FAQ,自动语音解答 | +| **转人工预处理** | 收集客户初步信息后转人工,提高坐席效率 | + +#### 2.4.2 转人工触发条件 + +| 触发条件 | 说明 | +|---------|------| +| 客户主动要求 | 客户说"转人工"或按键选择转人工 | +| 识别失败 | 机器人连续2-3次无法识别客户意图 | +| 特定问题类型 | 投诉类问题直接转人工,不经机器人处理 | + +--- + +## 第三章 功能需求 + +### 3.1 智能IVR模块 + +#### 3.1.1 功能清单 + +| 功能编号 | 功能名称 | 功能描述 | 优先级 | +|---------|---------|---------|--------| +| IVR-001 | 多级语音菜单 | 支持配置多级IVR语音菜单,按键导航 | P0 | +| IVR-002 | 语音识别导航 | 集成阿里云ASR,支持客户语音说出需求自动识别 | P0 | +| IVR-003 | 多业务线路由 | 根据来电号码(400/固话)自动进入对应业务IVR流程 | P0 | +| IVR-004 | 时间条件路由 | 支持按工作时间/节假日配置不同IVR流程 | P1 | +| IVR-005 | 黑名单拦截 | 来电号码在黑名单中自动播放提示后挂断 | P1 | +| IVR-006 | VIP客户识别 | VIP客户来电自动优先排队或转专属坐席 | P2 | +| IVR-007 | IVR流程可视化配置 | 提供可视化拖拽界面配置IVR流程 | P1 | + +#### 3.1.2 语音识别要求 + +- **ASR供应商**:阿里云语音识别 +- **识别准确率**:≥90% +- **响应时间**:≤500ms +- **支持方言**:普通话为主,可选支持粤语、四川话等 + +### 3.2 ACD自动分配模块 + +#### 3.2.1 功能清单 + +| 功能编号 | 功能名称 | 功能描述 | 优先级 | +|---------|---------|---------|--------| +| ACD-001 | 技能组管理 | 支持创建多个技能组(救援组、家政组、代驾组) | P0 | +| ACD-002 | 坐席技能配置 | 坐席可属于一个或多个技能组,配置技能等级 | P0 | +| ACD-003 | 历史服务优先 | 来电客户优先分配给上次服务的坐席 | P0 | +| ACD-004 | 最长空闲优先 | 同技能组内优先分配给空闲时间最长的坐席 | P0 | +| ACD-005 | 轮询分配 | 同技能组内按顺序轮流分配 | P0 | +| ACD-006 | 分配策略优先级 | 支持配置分配策略优先级:历史服务 > 最长空闲 > 轮询 | P0 | +| ACD-007 | 技能组溢出 | 技能组全忙时,来电溢出到配置的备用技能组 | P0 | +| ACD-008 | 排队等待 | 所有坐席忙时,来电进入排队,播放等待音乐 | P0 | +| ACD-009 | 排队超时处理 | 排队超时可配置:继续等待/溢出/留言/回拨 | P1 | +| ACD-010 | 排队位置播报 | 向等待客户播报当前排队位置 | P2 | + +### 3.3 坐席管理模块 + +#### 3.3.1 功能清单 + +| 功能编号 | 功能名称 | 功能描述 | 优先级 | +|---------|---------|---------|--------| +| AGT-001 | 坐席签入/签出 | 坐席上下班签入签出系统 | P0 | +| AGT-002 | 坐席状态管理 | 支持状态:空闲、通话中、振铃中、后处理、小休、忙碌 | P0 | +| AGT-003 | 小休原因 | 小休时需选择原因(用餐、洗手间、培训等) | P1 | +| AGT-004 | 状态自动切换 | 通话结束自动进入后处理状态,超时自动转空闲 | P0 | +| AGT-005 | 后处理时长配置 | 可配置后处理时长(如30秒) | P1 | +| AGT-006 | 强制签出 | 班长可强制签出坐席 | P1 | + +#### 3.3.2 坐席工作台要求 + +- 坐席不使用呼叫中心独立工作台 +- 坐席在CRM系统中操作业务 +- 呼叫中心提供**软电话条组件**嵌入CRM页面 +- 软电话条通过WebSocket与呼叫中心通信 +- 同时支持IP话机(SIP协议注册) + +### 3.4 软电话条组件 + +#### 3.4.1 功能清单 + +| 功能编号 | 功能名称 | 功能描述 | 优先级 | +|---------|---------|---------|--------| +| SFT-001 | 签入/签出 | 坐席登录CRM后通过软电话条签入呼叫中心 | P0 | +| SFT-002 | 状态切换 | 置忙/置闲/小休状态切换按钮 | P0 | +| SFT-003 | 来电弹屏触发 | 来电时向CRM发送弹屏事件,携带来电号码、客户ID等 | P0 | +| SFT-004 | 接听/挂断 | 点击接听/挂断按钮控制通话 | P0 | +| SFT-005 | 保持/取回 | 通话保持(播放等待音乐)和取回 | P0 | +| SFT-006 | 静音 | 坐席侧静音 | P1 | +| SFT-007 | 转接 | 转接至其他坐席/技能组/外线号码 | P0 | +| SFT-008 | 咨询转 | 先与第三方通话咨询,再决定是否转接 | P1 | +| SFT-009 | 三方通话 | 坐席、客户、第三方三方通话 | P1 | +| SFT-010 | 点击拨号 | 在CRM中点击号码呼出 | P0 | +| SFT-011 | 手动拨号 | 手动输入号码拨打 | P0 | +| SFT-012 | 通话计时 | 显示当前通话时长 | P0 | +| SFT-013 | 来电信息展示 | 显示来电号码、归属地、技能组等 | P0 | + +#### 3.4.2 软电话条技术要求 + +| 要求项 | 说明 | +|-------|------| +| **前端技术** | Web组件,支持iframe嵌入或JS SDK集成 | +| **通信协议** | WebSocket长连接,实时接收呼叫事件 | +| **语音方案** | WebRTC(浏览器软电话)或SIP话机(硬件话机) | +| **浏览器支持** | Chrome 70+、Firefox 65+、Edge 79+ | + +### 3.5 呼入通话控制 + +#### 3.5.1 功能清单 + +| 功能编号 | 功能名称 | 功能描述 | 优先级 | +|---------|---------|---------|--------| +| IBC-001 | 来电接入 | 支持SIP中继接入来电 | P0 | +| IBC-002 | 来电排队 | 坐席全忙时来电进入队列等待 | P0 | +| IBC-003 | 等待音乐 | 排队等待时播放等待音乐 | P0 | +| IBC-004 | 来电转接 | 支持盲转、咨询转、转技能组、转外线 | P0 | +| IBC-005 | 三方通话 | 支持三方会议通话 | P1 | +| IBC-006 | 通话保持 | 通话保持并播放等待音乐 | P0 | +| IBC-007 | 通话录音 | 全程录音,支持双声道(坐席/客户分轨)| P0 | + +### 3.6 呼出通话控制 + +#### 3.6.1 功能清单 + +| 功能编号 | 功能名称 | 功能描述 | 优先级 | +|---------|---------|---------|--------| +| OBC-001 | 点击外呼 | 坐席点击号码发起外呼 | P0 | +| OBC-002 | 外显号码设置 | 支持配置外呼显示的主叫号码 | P0 | +| OBC-003 | 外呼转接 | 外呼通话中支持转接 | P0 | +| OBC-004 | 通话录音 | 外呼通话全程录音 | P0 | + +### 3.7 预测式外呼模块 + +#### 3.7.1 功能清单 + +| 功能编号 | 功能名称 | 功能描述 | 优先级 | +|---------|---------|---------|--------| +| PDL-001 | 外呼任务创建 | 通过API创建外呼任务,导入号码名单 | P0 | +| PDL-002 | 任务状态控制 | 支持任务启动、暂停、恢复、停止 | P0 | +| PDL-003 | 预测式拨号算法 | 根据坐席空闲情况自动计算拨打频率 | P0 | +| PDL-004 | 接通转坐席 | 客户接听后自动转接空闲坐席 | P0 | +| PDL-005 | 无人接听处理 | 无人接听/忙音/关机等自动标记状态 | P0 | +| PDL-006 | 外呼时段限制 | 可配置允许外呼的时间段(如9:00-21:00) | P1 | +| PDL-007 | 号码去重 | 同一任务内号码自动去重 | P1 | +| PDL-008 | 重试策略 | 未接通号码可配置自动重试次数和间隔 | P1 | +| PDL-009 | 坐席利用率统计 | 统计坐席有效通话时长占比 | P0 | +| PDL-010 | 接通率统计 | 统计任务接通率 | P0 | + +### 3.8 机器人外呼模块 + +#### 3.8.1 功能清单 + +| 功能编号 | 功能名称 | 功能描述 | 优先级 | +|---------|---------|---------|--------| +| RBT-001 | 批量通知任务 | 通过API创建批量语音通知任务 | P0 | +| RBT-002 | TTS语音播放 | 集成阿里云TTS,文本转语音播放 | P0 | +| RBT-003 | 变量替换 | 支持语音内容中插入变量(姓名、时间、金额等) | P0 | +| RBT-004 | 纯播报模式 | 播放语音后直接挂断 | P0 | +| RBT-005 | 按键采集模式 | 播放语音后等待客户按键,采集结果 | P0 | +| RBT-006 | 按键结果回传 | 按键结果通过回调接口推送至业务系统 | P0 | +| RBT-007 | 无应答处理 | 客户无应答/超时可配置重试或标记 | P1 | +| RBT-008 | 并发控制 | 可配置任务最大并发拨打数 | P1 | +| RBT-009 | 任务进度查询 | API查询任务进度和结果 | P0 | + +### 3.9 呼入机器人模块 + +#### 3.9.1 功能清单 + +| 功能编号 | 功能名称 | 功能描述 | 优先级 | +|---------|---------|---------|--------| +| IRB-001 | 语音识别 | 集成阿里云ASR识别客户语音 | P0 | +| IRB-002 | 意图识别 | 对接NLU平台,识别客户意图 | P0 | +| IRB-003 | FAQ问答 | 支持配置50+常见问题及答案 | P0 | +| IRB-004 | 语音合成应答 | 集成阿里云TTS合成语音应答 | P0 | +| IRB-005 | 多轮对话 | 支持多轮对话收集信息 | P1 | +| IRB-006 | 转人工-主动请求 | 客户说"转人工"触发转接 | P0 | +| IRB-007 | 转人工-识别失败 | 连续N次识别失败自动转人工 | P0 | +| IRB-008 | 转人工-特定意图 | 识别到投诉等意图直接转人工 | P0 | +| IRB-009 | 转接携带信息 | 转人工时携带已收集的信息至坐席 | P1 | +| IRB-010 | 话术配置 | 支持配置机器人话术和回复内容 | P0 | + +### 3.10 录音管理模块 + +#### 3.10.1 功能清单 + +| 功能编号 | 功能名称 | 功能描述 | 优先级 | +|---------|---------|---------|--------| +| REC-001 | 全程录音 | 所有呼入呼出通话全程录音 | P0 | +| REC-002 | 双声道录音 | 坐席和客户分轨录音(便于质检) | P1 | +| REC-003 | 录音存储 | 录音文件存储至NAS/分布式存储 | P0 | +| REC-004 | 长期保存 | 支持录音长期保存,定期归档 | P0 | +| REC-005 | 录音检索 | 按通话ID、时间、号码等检索录音 | P0 | +| REC-006 | 录音下载 | 通过API获取录音文件下载地址 | P0 | +| REC-007 | 录音权限 | 录音访问权限控制 | P1 | + +### 3.11 班长监控模块 + +#### 3.11.1 功能清单 + +| 功能编号 | 功能名称 | 功能描述 | 优先级 | +|---------|---------|---------|--------| +| SUP-001 | 坐席状态监控 | 实时查看所有坐席当前状态 | P0 | +| SUP-002 | 实时监听 | 监听坐席与客户通话,双方不知情 | P0 | +| SUP-003 | 强插通话 | 加入通话,三方均可听到 | P0 | +| SUP-004 | 强拆通话 | 强制结束坐席通话 | P0 | +| SUP-005 | 密语(可选) | 对坐席单向说话,客户听不到(二期) | P2 | +| SUP-006 | 强制签出 | 强制将坐席签出系统 | P1 | +| SUP-007 | 强制置忙 | 强制将坐席状态设为忙碌 | P1 | + +### 3.12 实时监控大屏 + +#### 3.12.1 功能清单 + +| 功能编号 | 功能名称 | 功能描述 | 优先级 | +|---------|---------|---------|--------| +| DSP-001 | 整体概览 | 展示当前呼入量、呼出量、接通率等 | P0 | +| DSP-002 | 坐席状态分布 | 展示各状态坐席数量(空闲、通话、小休等) | P0 | +| DSP-003 | 技能组监控 | 各技能组排队数、等待时长、可用坐席数 | P0 | +| DSP-004 | 实时告警 | 排队超阈值、坐席空闲过少等告警提示 | P1 | +| DSP-005 | 趋势图表 | 当日话务量趋势图(按小时) | P1 | +| DSP-006 | 大屏适配 | 支持大屏显示器展示 | P0 | + +--- + +## 第四章 接口需求 + +### 4.1 接口概述 + +呼叫中心系统作为通信能力中台,通过API方式为CRM/业务系统提供呼叫能力。接口采用RESTful API + WebSocket事件推送模式。 + +### 4.2 接口清单 + +#### 4.2.1 呼入控制接口 + +| 接口编号 | 接口名称 | 请求方式 | 说明 | +|---------|---------|---------|------| +| API-IN-001 | 接听来电 | POST | 坐席接听当前来电 | +| API-IN-002 | 挂断通话 | POST | 挂断当前通话 | +| API-IN-003 | 保持通话 | POST | 将通话置于保持状态 | +| API-IN-004 | 取回通话 | POST | 取回保持的通话 | +| API-IN-005 | 转接通话 | POST | 转接至指定坐席/技能组/外线 | +| API-IN-006 | 咨询通话 | POST | 发起咨询通话 | +| API-IN-007 | 咨询转移 | POST | 咨询后转移 | +| API-IN-008 | 三方通话 | POST | 建立三方通话 | + +#### 4.2.2 呼出控制接口 + +| 接口编号 | 接口名称 | 请求方式 | 说明 | +|---------|---------|---------|------| +| API-OUT-001 | 点击外呼 | POST | 坐席发起外呼 | +| API-OUT-002 | 取消外呼 | POST | 取消正在拨打的外呼 | +| API-OUT-003 | 预览式外呼确认 | POST | 坐席确认拨打预览号码 | + +#### 4.2.3 坐席状态接口 + +| 接口编号 | 接口名称 | 请求方式 | 说明 | +|---------|---------|---------|------| +| API-AGT-001 | 坐席签入 | POST | 坐席签入系统 | +| API-AGT-002 | 坐席签出 | POST | 坐席签出系统 | +| API-AGT-003 | 置忙 | POST | 坐席设置为忙碌状态 | +| API-AGT-004 | 置闲 | POST | 坐席设置为空闲状态 | +| API-AGT-005 | 小休 | POST | 坐席进入小休状态 | +| API-AGT-006 | 查询坐席状态 | GET | 查询指定坐席当前状态 | +| API-AGT-007 | 批量查询坐席状态 | GET | 批量查询坐席状态 | + +#### 4.2.4 外呼任务接口 + +| 接口编号 | 接口名称 | 请求方式 | 说明 | +|---------|---------|---------|------| +| API-TASK-001 | 创建外呼任务 | POST | 创建预测式/机器人外呼任务 | +| API-TASK-002 | 导入号码 | POST | 向任务导入外呼号码 | +| API-TASK-003 | 启动任务 | POST | 启动外呼任务 | +| API-TASK-004 | 暂停任务 | POST | 暂停外呼任务 | +| API-TASK-005 | 恢复任务 | POST | 恢复暂停的任务 | +| API-TASK-006 | 停止任务 | POST | 停止外呼任务 | +| API-TASK-007 | 查询任务进度 | GET | 查询任务执行进度 | +| API-TASK-008 | 查询任务结果 | GET | 查询任务拨打结果明细 | + +#### 4.2.5 单条外呼接口(通知类) + +| 接口编号 | 接口名称 | 请求方式 | 说明 | +|---------|---------|---------|------| +| API-NOTIFY-001 | 发起语音通知 | POST | 触发单条语音通知外呼 | +| API-NOTIFY-002 | 查询通知结果 | GET | 查询通知拨打结果 | + +#### 4.2.6 录音接口 + +| 接口编号 | 接口名称 | 请求方式 | 说明 | +|---------|---------|---------|------| +| API-REC-001 | 查询录音列表 | GET | 按条件查询录音记录 | +| API-REC-002 | 获取录音下载地址 | GET | 获取录音文件下载URL | + +#### 4.2.7 监控接口 + +| 接口编号 | 接口名称 | 请求方式 | 说明 | +|---------|---------|---------|------| +| API-MON-001 | 监听通话 | POST | 班长监听指定坐席通话 | +| API-MON-002 | 强插通话 | POST | 班长强插指定坐席通话 | +| API-MON-003 | 强拆通话 | POST | 班长强制挂断指定坐席通话 | +| API-MON-004 | 实时统计数据 | GET | 获取实时监控统计数据 | +| API-MON-005 | 技能组排队信息 | GET | 获取各技能组排队情况 | + +### 4.3 事件推送(WebSocket) + +#### 4.3.1 通话事件 + +| 事件编号 | 事件名称 | 触发时机 | 推送内容 | +|---------|---------|---------|---------| +| EVT-001 | 来电振铃 | 来电分配到坐席时 | 来电号码、客户ID、技能组、IVR收集信息等 | +| EVT-002 | 通话接通 | 坐席接听后 | 通话ID、接通时间 | +| EVT-003 | 通话挂断 | 通话结束后 | 通话ID、挂断方、通话时长 | +| EVT-004 | 转接振铃 | 转接到新坐席振铃时 | 转接来源、来电信息 | +| EVT-005 | 外呼振铃 | 外呼拨打中 | 外呼号码、坐席ID | +| EVT-006 | 外呼接通 | 客户接听 | 通话ID | +| EVT-007 | 外呼失败 | 外呼未接通 | 失败原因(无人接听/忙/关机等) | + +#### 4.3.2 坐席状态事件 + +| 事件编号 | 事件名称 | 触发时机 | 推送内容 | +|---------|---------|---------|---------| +| EVT-101 | 状态变更 | 坐席状态变化时 | 坐席ID、新状态、旧状态、时间 | +| EVT-102 | 签入成功 | 坐席签入成功 | 坐席ID、技能组 | +| EVT-103 | 签出成功 | 坐席签出成功 | 坐席ID | + +#### 4.3.3 话单推送 + +| 事件编号 | 事件名称 | 触发时机 | 推送内容 | +|---------|---------|---------|---------| +| EVT-201 | 话单推送 | 通话结束后 | 通话ID、主被叫、开始时间、结束时间、时长、录音地址、坐席ID、技能组、呼叫类型等 | + +#### 4.3.4 机器人交互结果推送 + +| 事件编号 | 事件名称 | 触发时机 | 推送内容 | +|---------|---------|---------|---------| +| EVT-301 | 按键结果 | 客户按键后 | 任务ID、号码、按键值、时间 | +| EVT-302 | 机器人通话结果 | 机器人外呼结束 | 任务ID、号码、接通状态、通话时长、按键结果 | + +--- + +## 第五章 非功能需求 + +### 5.1 性能需求 + +| 指标项 | 要求 | +|-------|------| +| **并发坐席数** | 支持150坐席同时在线 | +| **并发通话数** | 支持120路并发通话(含呼入+呼出) | +| **日处理量** | 支持日均50,000通呼叫 | +| **呼叫建立时延** | 来电从接入到振铃坐席 ≤ 1秒 | +| **API响应时间** | 95%请求响应 ≤ 200ms | +| **事件推送时延** | 事件产生到推送至CRM ≤ 500ms | +| **ASR识别延迟** | 语音识别延迟 ≤ 500ms | +| **系统可用性** | ≥ 99.9%(全年停机不超过8.76小时) | + +### 5.2 高可用需求 + +| 要求项 | 说明 | +|-------|------| +| **主备部署** | FreeSWITCH主备双机部署,主机故障自动切换至备机 | +| **切换时间** | 故障切换时间 ≤ 30秒 | +| **数据同步** | 主备配置实时同步 | +| **心跳检测** | 主备心跳检测间隔 ≤ 5秒 | +| **数据库高可用** | 数据库采用主从复制或集群部署 | +| **录音存储** | 录音存储采用RAID或分布式存储,防止数据丢失 | + +### 5.3 安全需求 + +| 要求项 | 说明 | +|-------|------| +| **网络安全** | SIP通信支持TLS加密;API支持HTTPS | +| **API认证** | API调用需Token认证,支持IP白名单 | +| **权限控制** | 支持角色权限管理(管理员、班长、坐席) | +| **录音安全** | 录音文件访问需权限验证 | +| **操作审计** | 关键操作记录审计日志 | + +### 5.4 兼容性需求 + +| 要求项 | 说明 | +|-------|------| +| **SIP话机** | 兼容主流SIP话机品牌(如:Yealink、Grandstream、Fanvil等) | +| **SIP协议** | 符合RFC 3261标准 | +| **浏览器** | 软电话条支持Chrome 70+、Firefox 65+、Edge 79+ | +| **编解码** | 语音编解码支持G.711a、G.711u、G.729(可选) | + +### 5.5 可扩展性需求 + +| 要求项 | 说明 | +|-------|------| +| **坐席扩展** | 架构支持水平扩展至300+坐席 | +| **业务线扩展** | 支持新增业务线/技能组,无需改动核心架构 | +| **线路扩展** | 支持新增SIP中继线路 | + +--- + +## 第六章 系统架构设计建议 + +### 6.1 整体架构图 + +``` + ┌──────────────────┐ + │ 运营商网络 │ + │ (SIP Trunk/400) │ + └────────┬─────────┘ + │ + ┌────────▼─────────┐ + │ SBC/边界网关 │ + │ (可选,安全防护) │ + └────────┬─────────┘ + │ + ┌───────────────────────────┼───────────────────────────┐ + │ │ │ + │ ┌──────────────────────▼─────────────────────┐ │ + │ │ FreeSWITCH │ │ + │ │ (主备双机部署) │ │ + │ │ ┌─────────┬─────────┬─────────┬─────────┐ │ │ + │ │ │ IVR │ ACD │ 录音模块 │ 外呼引擎│ │ │ + │ │ └─────────┴─────────┴─────────┴─────────┘ │ │ + │ └───────────────────────┬────────────────────┘ │ + │ │ │ + │ ┌───────────────────────┼───────────────────────┐ │ + │ │ │ │ │ + │ ▼ ▼ ▼ │ + │ ┌──────────┐ ┌──────────────┐ ┌────────┐│ + │ │ CTI中间件 │ │ API Gateway │ │ WS推送 ││ + │ │(ESL连接) │ │ (REST API) │ │ 服务 ││ + │ └────┬─────┘ └──────┬───────┘ └───┬────┘│ + │ │ │ │ │ + │ └────────────────────┼────────────────────┘ │ + │ │ │ + │ ┌────────────────┼────────────────┐ │ + │ │ │ │ │ + │ ▼ ▼ ▼ │ + │ ┌──────────┐ ┌──────────┐ ┌───────────┐ │ + │ │ MySQL │ │ Redis │ │ 文件存储 │ │ + │ │ (话单/配置)│ │ (缓存/状态)│ │ (录音) │ │ + │ └──────────┘ └──────────┘ └───────────┘ │ + │ │ + │ 呼叫中心系统边界 │ + └───────────────────────────┬──────────────────────────┘ + │ + ┌───────────────────────┼───────────────────────┐ + │ │ │ + ▼ ▼ ▼ + ┌──────────┐ ┌──────────┐ ┌────────────┐ + │ CRM系统 │ │ 业务系统 │ │ 阿里云语音 │ + │(弹屏/工单) │ │(派单/订单)│ │(ASR/TTS) │ + └──────────┘ └──────────┘ └────────────┘ +``` + +### 6.2 核心组件说明 + +| 组件 | 技术选型 | 说明 | +|------|---------|------| +| **媒体服务器** | FreeSWITCH | 核心呼叫控制、媒体处理、IVR、录音 | +| **CTI中间件** | 自研(基于ESL) | 封装FreeSWITCH ESL接口,提供业务逻辑 | +| **API网关** | Nginx/Kong/自研 | RESTful API统一入口 | +| **WebSocket服务** | Node.js/Golang | 实时事件推送 | +| **数据库** | MySQL 8.0 | 话单、配置、坐席信息存储 | +| **缓存** | Redis | 坐席状态、会话信息缓存 | +| **录音存储** | NAS/MinIO/对象存储 | 录音文件长期存储 | +| **ASR/TTS** | 阿里云智能语音 | 语音识别与合成 | +| **NLU** | 外部指定平台 | 意图识别与对话管理 | + +### 6.3 部署架构(主备高可用) + +``` + ┌─────────────────────────────────────┐ + │ VIP(虚拟IP) │ + └──────────────────┬──────────────────┘ + │ + ┌──────────────────────────┼──────────────────────────┐ + │ │ │ + ▼ │ ▼ + ┌─────────────────┐ │ ┌─────────────────┐ + │ FreeSWITCH │◄─────Keepalived心跳──────────────►│ FreeSWITCH │ + │ (主机) │ │ │ (备机) │ + │ CTI中间件 │ │ │ CTI中间件 │ + │ API服务 │ │ │ API服务 │ + └─────────────────┘ │ └─────────────────┘ + │ │ │ + └──────────────────────────┼──────────────────────────┘ + │ + ┌────────────┴────────────┐ + │ │ + ▼ ▼ + ┌──────────────┐ ┌───────────────┐ + │ MySQL主从集群 │ │ Redis Sentinel│ + └──────────────┘ └───────────────┘ + │ + ▼ + ┌───────────────┐ + │ NAS/分布式存储 │ + │ (录音文件) │ + └───────────────┘ +``` + +--- + +## 第七章 硬件与软件清单 + +### 7.1 硬件清单 + +| 序号 | 设备类型 | 规格配置 | 数量 | 用途 | 参考单价(万元) | 合计(万元) | +|-----|---------|---------|------|------|---------------|-------------| +| 1 | 应用服务器(主) | 32核CPU/64GB内存/500GB SSD+2TB HDD | 1 | FreeSWITCH+CTI+API | 5-8 | 5-8 | +| 2 | 应用服务器(备) | 32核CPU/64GB内存/500GB SSD+2TB HDD | 1 | FreeSWITCH备机 | 5-8 | 5-8 | +| 3 | 数据库服务器 | 16核CPU/64GB内存/1TB SSD | 2 | MySQL主从 | 4-6 | 8-12 | +| 4 | Redis服务器 | 8核CPU/32GB内存/500GB SSD | 3 | Redis Sentinel集群 | 2-3 | 6-9 | +| 5 | NAS存储 | 96TB可用空间(RAID) | 1 | 录音长期存储 | 8-15 | 8-15 | +| 6 | 网络交换机 | 千兆三层交换机 | 2 | 网络通信 | 1-2 | 2-4 | +| 7 | 防火墙 | 企业级防火墙 | 1 | 安全防护 | 2-5 | 2-5 | +| 8 | IP话机 | SIP话机(如Yealink T46U) | 150 | 坐席通话终端 | 0.05-0.08 | 7.5-12 | +| 9 | 坐席耳麦 | 专业话务耳麦 | 150 | 坐席配件 | 0.02-0.05 | 3-7.5 | +| **硬件合计** | | | | | | **47-80.5** | + +### 7.2 软件清单 + +| 序号 | 软件/平台 | 说明 | 授权方式 | 预估费用(万元) | +|-----|---------|------|---------|----------------| +| 1 | FreeSWITCH | 开源软交换平台 | 开源免费 | 0 | +| 2 | Linux操作系统 | CentOS/Rocky Linux | 开源免费 | 0 | +| 3 | MySQL数据库 | 社区版 | 开源免费 | 0 | +| 4 | Redis | 缓存 | 开源免费 | 0 | +| 5 | Nginx | 反向代理/负载均衡 | 开源免费 | 0 | +| 6 | 阿里云ASR | 语音识别 | 按量付费 | 详见运营费用 | +| 7 | 阿里云TTS | 语音合成 | 按量付费 | 详见运营费用 | +| 8 | NLU对话平台 | 意图识别 | 按需对接 | 视平台定价 | +| 9 | 监控软件(Zabbix/Prometheus) | 系统监控 | 开源免费 | 0 | +| **软件合计** | | | | **0(开源为主)** | + +### 7.3 开发成本估算 + +| 模块 | 预估人天 | 说明 | +|------|---------|------| +| FreeSWITCH环境搭建与配置 | 15 | 主备部署、线路对接、编解码配置 | +| IVR流程开发 | 20 | 多业务线IVR、语音导航 | +| ACD分配模块 | 25 | 多种分配策略、溢出逻辑 | +| CTI中间件开发 | 40 | ESL封装、业务逻辑 | +| 坐席状态管理 | 15 | 状态机、持久化 | +| API服务开发 | 30 | 全部API接口 | +| WebSocket推送服务 | 15 | 事件推送 | +| 软电话条组件 | 25 | 前端组件、WebRTC集成 | +| 预测式外呼引擎 | 30 | 外呼算法、任务管理 | +| 机器人外呼模块 | 20 | TTS集成、按键采集 | +| 呼入机器人模块 | 25 | ASR/NLU集成、对话流程 | +| 录音管理模块 | 10 | 录音存储、检索 | +| 班长监控模块 | 15 | 监听、强插、强拆 | +| 实时监控大屏 | 20 | 前端大屏、实时数据 | +| 高可用部署 | 15 | 主备切换、Keepalived | +| 联调测试 | 30 | 全流程测试 | +| **合计** | **350人天** | | + +**按人天单价1500-2500元估算,开发成本约:52.5-87.5万元** + +--- + +## 第八章 预算汇总 + +### 8.1 一次性投入 + +| 项目 | 费用(万元) | +|------|-------------| +| 硬件采购 | 47-80.5 | +| 软件(开源为主) | 0 | +| 开发成本 | 52.5-87.5 | +| 实施部署 | 5-10 | +| **一次性投入合计** | **104.5-178** | + +### 8.2 年度运营费用 + +| 项目 | 月费用(万元) | 年费用(万元) | 备注 | +|------|--------------|---------------|------| +| **线路月租** | | | | +| 400号码(3个) | 0.3-1.5 | 3.6-18 | 3条业务线独立号码 | +| SIP中继并发费(120路) | 0.6-1.2 | 7.2-14.4 | 按50-100元/路/月 | +| **通信费** | | | | +| 呼入通话费 | 5-9 | 60-108 | 180万分钟/月×0.03-0.05元 | +| 呼出通话费 | 21.6-40.5 | 259-486 | 270万分钟/月×0.08-0.15元 | +| **云服务费** | | | | +| 阿里云ASR | 2-5 | 24-60 | 按使用量 | +| 阿里云TTS | 1-3 | 12-36 | 按使用量 | +| **其他** | | | | +| 机房/带宽 | 1-2 | 12-24 | 如自有机房可降低 | +| 系统维护 | 1-2 | 12-24 | 人员/备件 | +| **年度运营合计** | | **390-770** | | + +### 8.3 总预算汇总 + +| 项目 | 费用(万元) | +|------|-------------| +| **首年投入** | 494.5-948(一次性+首年运营) | +| **后续每年** | 390-770(运营费用) | + +> ⚠️ **说明:** +> - 通信费用是大头,约占年度成本的80%以上 +> - 具体费用取决于运营商议价、实际话务量 +> - 可通过接通率优化、IVR分流等降低通信成本 + +--- + +## 第九章 项目里程碑建议 + +按照3-4个月上线周期规划: + +| 阶段 | 周期 | 主要工作 | 交付物 | +|------|------|---------|--------| +| **一、需求确认与设计** | 第1-2周 | 需求评审、技术方案设计、架构设计 | 技术方案文档、接口设计文档 | +| **二、环境搭建** | 第3-4周 | 硬件采购到货、FreeSWITCH环境部署、线路对接 | 基础环境就绪 | +| **三、核心功能开发** | 第5-10周 | CTI中间件、API服务、坐席管理、呼入呼出基础功能 | 核心功能可用 | +| **四、高级功能开发** | 第11-14周 | 预测式外呼、机器人模块、IVR、监控大屏 | 全功能开发完成 | +| **五、集成联调** | 第15-16周 | CRM对接、全流程联调、高可用测试 | 联调通过 | +| **六、测试与优化** | 第17-18周 | 功能测试、性能测试、Bug修复 | 测试报告 | +| **七、试运行** | 第19-20周 | 小范围上线、问题收集、优化调整 | 试运行报告 | +| **八、正式上线** | 第21周 | 全面上线、监控保障 | 系统上线 | + +``` +第1月 第2月 第3月 第4月 第5月 +|----|----|----|----|----|----|----|----|----|----| +[需求设计][环境搭建][====核心功能开发====][==高级功能==] + [集成联调][测试] + [试运行][上线] +``` + +--- + +## 第十章 风险与建议 + +### 10.1 项目风险 + +| 风险项 | 风险等级 | 影响 | 应对措施 | +|-------|---------|------|---------| +| FreeSWITCH技术门槛高 | 高 | 开发进度延迟 | 建议团队提前学习ESL开发,或引入有经验顾问 | +| 线路对接周期不可控 | 中 | 影响联调测试 | 提前与运营商沟通,预留缓冲时间 | +| ASR识别效果不及预期 | 中 | 影响机器人体验 | 提前做语料测试,必要时做热词优化 | +| 高可用切换影响业务 | 高 | 道路救援中断 | 充分测试切换机制,演练故障场景 | +| 录音存储空间不足 | 低 | 录音丢失 | 监控存储空间,提前扩容 | + +### 10.2 建议事项 + +1. **团队能力准备**:建议团队提前熟悉FreeSWITCH、ESL、SIP协议相关知识 +2. **分阶段上线**:可先上线基础呼入呼出功能,机器人功能迭代上线 +3. **压力测试**:上线前务必进行150坐席并发的压力测试 +4. **灰度发布**:建议先在一条业务线(如家政)试运行,再推广到道路救援 +5. **监控告警**:完善监控体系,特别是对道路救援线路的可用性监控 + +--- + +## 附录 + +### 附录A:术语表 +(见第一章1.4节) + +### 附录B:接口详细设计 +(需在技术设计阶段细化) + +### 附录C:IVR流程图 +(需在需求确认阶段补充) + +### 附录D:机器人话术模板 +(需在需求确认阶段补充) + +--- + +**文档结束** + +--- + +以上就是完整的需求规格说明书。请您审阅,如有需要补充或调整的内容,请随时告知!🎯 + +### USER +根据以上的文档,生成个项目立项书 + +### ASSISTANT +# 企业呼叫中心系统项目立项书 + +--- + +**项目名称**:企业呼叫中心系统建设项目 +**项目编号**:CC-2024-001 +**编制日期**:2024年1月 +**编 制 人**:_________________ +**审 核 人**:_________________ +**批 准 人**:_________________ + +--- + +## 文档修订记录 + +| 版本 | 日期 | 修订内容 | 修订人 | 审核人 | +|------|------|---------|--------|--------| +| V1.0 | 2024-01-XX | 初稿 | | | + +--- + +## 目录 + +1. [项目概述](#第一章-项目概述) +2. [项目背景与必要性](#第二章-项目背景与必要性) +3. [项目目标](#第三章-项目目标) +4. [项目范围](#第四章-项目范围) +5. [项目建设方案](#第五章-项目建设方案) +6. [项目投资预算](#第六章-项目投资预算) +7. [项目效益分析](#第七章-项目效益分析) +8. [项目实施计划](#第八章-项目实施计划) +9. [项目组织架构](#第九章-项目组织架构) +10. [风险分析与应对](#第十章-风险分析与应对) +11. [结论与建议](#第十一章-结论与建议) + +--- + +## 第一章 项目概述 + +### 1.1 项目名称 + +企业呼叫中心系统建设项目 + +### 1.2 项目建设单位 + +**单位名称**:_________________(企业名称) +**负 责 人**:_________________ +**联系方式**:_________________ + +### 1.3 项目概要 + +本项目旨在建设一套集**呼入呼出、智能IVR、机器人客服、预测式外呼**于一体的企业级呼叫中心系统,支撑公司道路救援、家政服务、代驾服务三大业务板块的客户服务与营销运营工作。 + +| 项目要素 | 内容描述 | +|---------|---------| +| **服务对象** | 个人消费者(ToC) | +| **业务范围** | 道路救援、家政服务、代驾服务 | +| **坐席规模** | 150坐席 | +| **日话务量** | 50,000通/日 | +| **服务时间** | 7×24小时 | +| **建设周期** | 3-4个月 | +| **建设方式** | 自主研发(基于FreeSWITCH开源平台) | +| **部署方式** | 私有化部署(主备高可用架构) | + +### 1.4 项目总投资 + +| 投资类别 | 金额(万元) | +|---------|-------------| +| 一次性建设投资 | 104.5-178 | +| 首年运营费用 | 390-770 | +| **首年总投入** | **494.5-948** | + +--- + +## 第二章 项目背景与必要性 + +### 2.1 企业现状 + +本企业主营**道路救援、家政服务、代驾服务**三大业务,面向个人消费者提供上门服务。随着业务规模的持续扩大,现有的客户服务模式已无法满足业务发展需求: + +**现状问题:** + +| 问题领域 | 具体问题 | 影响 | +|---------|---------|------| +| **客服能力** | 无统一呼叫平台,多部门分散接听 | 客户体验差,管理困难 | +| **响应效率** | 道路救援等紧急需求响应慢 | 客户流失,品牌受损 | +| **服务时间** | 夜间/节假日服务能力不足 | 错失订单,客户投诉 | +| **外呼效率** | 人工逐一拨打,效率低下 | 人力成本高,触达率低 | +| **数据管理** | 通话无录音,无法追溯 | 纠纷处理困难,质量无法管控 | +| **系统集成** | 与CRM系统无法打通 | 信息孤岛,坐席重复操作 | + +### 2.2 建设必要性 + +#### 2.2.1 业务发展的迫切需要 + +``` + 业务增长趋势 + 话务量 + ↑ + 60000│ ╭──── 预测增长 + │ ╭────╯ + 50000│ ╭────╯ ←── 当前日均50000通 + │ ╭────╯ + 40000│ ╭────╯ + │ ╭────╯ + 30000│╭────╯ + │ + └────────────────────────────────────→ 时间 + 2022 2023 2024 2025 +``` + +随着业务规模扩大,日话务量已达**50,000通**,预计未来2年将持续增长。迫切需要建设专业呼叫中心系统支撑业务发展。 + +#### 2.2.2 客户体验提升的需要 + +| 客户痛点 | 系统解决方案 | +|---------|-------------| +| 打电话难以接通 | 150坐席+智能排队+溢出机制 | +| 等待时间长 | IVR自助分流+机器人预处理 | +| 反复描述问题 | CRM弹屏,坐席即时了解客户信息 | +| 投诉处理无反馈 | 录音追溯+工单闭环 | + +#### 2.2.3 运营效率提升的需要 + +| 运营痛点 | 系统解决方案 | +|---------|-------------| +| 外呼效率低 | 预测式外呼,坐席利用率提升50%+ | +| 通知类工作繁重 | 机器人自动批量通知 | +| 回访覆盖率低 | 机器人自动回访+满意度调查 | +| 管理缺乏抓手 | 实时监控大屏+班长监控 | + +#### 2.2.4 合规与风控的需要 + +- 道路救援涉及紧急服务,需确保系统**高可用** +- 服务过程需**全程录音**,便于纠纷处理 +- 需与现有CRM系统**无缝集成**,确保数据安全 + +### 2.3 建设可行性 + +#### 2.3.1 技术可行性 + +| 技术领域 | 可行性分析 | +|---------|-----------| +| **呼叫平台** | FreeSWITCH开源成熟,已广泛应用于企业呼叫中心 | +| **智能语音** | 阿里云ASR/TTS技术成熟,识别准确率>95% | +| **系统集成** | 标准API/WebSocket接口,与现有CRM可顺利对接 | +| **高可用** | 主备架构+Keepalived方案成熟可靠 | + +#### 2.3.2 团队可行性 + +| 条件 | 评估 | +|------|------| +| 自有技术团队 | ✅ 具备自主开发能力 | +| FreeSWITCH经验 | ⚠️ 需提前培训或引入顾问支持 | +| 项目管理能力 | ✅ 具备中大型项目实施经验 | + +#### 2.3.3 经济可行性 + +- 自主研发相比采购商业产品**节省授权费用** +- 私有化部署**长期成本可控** +- 项目投资回报分析详见第七章 + +--- + +## 第三章 项目目标 + +### 3.1 总体目标 + +建设一套**安全、稳定、高效、智能**的企业级呼叫中心系统,实现客户服务统一接入、智能化分流、高效外呼,全面提升客户服务体验与运营效率。 + +### 3.2 具体目标 + +#### 3.2.1 能力目标 + +| 目标项 | 指标要求 | +|-------|---------| +| 坐席并发能力 | 支持150坐席同时在线 | +| 通话并发能力 | 支持120路并发通话 | +| 日处理能力 | 支持50,000通/日 | +| 系统可用性 | ≥99.9%(全年停机<8.76小时) | +| 故障切换时间 | ≤30秒 | + +#### 3.2.2 效率目标 + +| 目标项 | 当前值 | 目标值 | 提升幅度 | +|-------|-------|-------|---------| +| 人工坐席利用率 | 约40% | ≥70% | +75% | +| 外呼接通后转接时间 | N/A(人工拨号) | ≤3秒 | - | +| 批量通知人工耗时 | 100%人工 | 0%(全自动) | 释放人力 | +| 客户等待时长 | 无统计 | 平均<30秒 | - | + +#### 3.2.3 体验目标 + +| 目标项 | 指标要求 | +|-------|---------| +| 首次呼叫解决率 | ≥80% | +| IVR自助分流率 | ≥30% | +| 客户满意度 | ≥90% | + +### 3.3 建设原则 + +| 原则 | 说明 | +|------|------| +| **统一规划** | 三大业务线统一平台,避免重复建设 | +| **安全可靠** | 主备高可用,确保道路救援等紧急服务不中断 | +| **开放集成** | 标准API接口,与CRM/业务系统无缝对接 | +| **智能高效** | 引入AI能力,提升服务效率与体验 | +| **弹性扩展** | 架构支持未来扩展至300+坐席 | +| **自主可控** | 自主研发,核心技术自主掌握 | + +--- + +## 第四章 项目范围 + +### 4.1 业务范围 + +| 业务线 | 呼入场景 | 呼出场景 | +|-------|---------|---------| +| **道路救援** | 叫救援、咨询、投诉 | 回访、满意度调查、到达通知 | +| **家政服务** | 预约服务、咨询、投诉 | 回访、营销推广、上门提醒 | +| **代驾服务** | 叫代驾、咨询、投诉 | 回访、营销推广、到达通知 | + +### 4.2 功能范围 + +#### 4.2.1 本期建设范围(一期) + +| 模块 | 功能项 | 优先级 | +|------|-------|--------| +| **基础通话** | 呼入接听、呼出拨打、转接、保持、三方通话 | P0 | +| **智能IVR** | 语音导航、按键导航、语音识别、多业务分流 | P0 | +| **ACD分配** | 技能组管理、多种分配策略、排队溢出 | P0 | +| **坐席管理** | 签入签出、状态管理、软电话条 | P0 | +| **预测式外呼** | 批量外呼任务、自动拨打、接通转坐席 | P0 | +| **机器人外呼** | 批量通知、TTS播报、按键采集 | P0 | +| **呼入机器人** | FAQ问答、意图识别、转人工 | P0 | +| **录音管理** | 全程录音、录音存储、录音检索下载 | P0 | +| **班长监控** | 监听、强插、强拆 | P0 | +| **监控大屏** | 实时数据展示、坐席状态、排队监控 | P0 | +| **系统集成** | CRM弹屏、API接口、事件推送 | P0 | +| **高可用** | 主备部署、故障切换 | P0 | + +#### 4.2.2 二期规划范围(本期不含) + +| 模块 | 功能项 | 说明 | +|------|-------|------| +| **统计报表** | 话务报表、坐席绩效、外呼分析 | 二期建设 | +| **智能质检** | 语音转写、关键词检测、情绪分析 | 二期建设 | +| **密语功能** | 班长对坐席单向指导 | 二期建设 | +| **短信功能** | 不涉及,由第三方平台提供 | 不纳入 | + +### 4.3 集成范围 + +| 集成系统 | 集成方式 | 集成内容 | +|---------|---------|---------| +| **CRM系统** | API双向对接 | 来电弹屏、客户资料、工单创建 | +| **业务系统** | API对接 | 外呼任务推送、通知触发、结果回传 | +| **阿里云语音** | API调用 | ASR语音识别、TTS语音合成 | +| **NLU平台** | API对接 | 意图识别、对话管理 | + +--- + +## 第五章 项目建设方案 + +### 5.1 总体架构 + +``` +┌─────────────────────────────────────────────────────────────────────────┐ +│ 用户层 │ +│ 道路救援客户 家政服务客户 代驾服务客户 │ +│ │ │ │ │ +│ ▼ ▼ ▼ │ +│ 400-XXX-XXX1 400-XXX-XXX2 固话/400 │ +└─────────────────────────────────────────────────────────────────────────┘ + │ + ▼ +┌─────────────────────────────────────────────────────────────────────────┐ +│ 接入层 │ +│ 运营商SIP中继线路 │ +└─────────────────────────────────────────────────────────────────────────┘ + │ + ▼ +┌─────────────────────────────────────────────────────────────────────────┐ +│ 呼叫控制层 │ +│ ┌──────────────────────────────────────────────────────────────────┐ │ +│ │ FreeSWITCH (主备高可用) │ │ +│ │ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ │ │ +│ │ │ 呼入控制│ │ 呼出控制│ │智能IVR │ │ ACD分配│ │ 录音模块│ │ │ +│ │ └────────┘ └────────┘ └────────┘ └────────┘ └────────┘ │ │ +│ └──────────────────────────────────────────────────────────────────┘ │ +└─────────────────────────────────────────────────────────────────────────┘ + │ + ▼ +┌─────────────────────────────────────────────────────────────────────────┐ +│ 业务服务层 │ +│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ +│ │CTI中间件 │ │API Gateway│ │ WS推送 │ │ 外呼引擎 │ │ 机器人引擎│ │ +│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │ +└─────────────────────────────────────────────────────────────────────────┘ + │ + ▼ +┌─────────────────────────────────────────────────────────────────────────┐ +│ 数据层 │ +│ ┌──────────┐ ┌──────────┐ ┌──────────────┐ │ +│ │ MySQL │ │ Redis │ │ NAS存储 │ │ +│ │ (主从集群) │ │(Sentinel)│ │ (录音) │ │ +│ └──────────┘ └──────────┘ └──────────────┘ │ +└─────────────────────────────────────────────────────────────────────────┘ + │ + ▼ +┌─────────────────────────────────────────────────────────────────────────┐ +│ 集成层 │ +│ ┌──────────┐ ┌──────────┐ ┌──────────────┐ │ +│ │ CRM系统 │ │ 业务系统 │ │ 阿里云ASR/TTS│ │ +│ └──────────┘ └──────────┘ └──────────────┘ │ +└─────────────────────────────────────────────────────────────────────────┘ + │ + ▼ +┌─────────────────────────────────────────────────────────────────────────┐ +│ 终端层 │ +│ ┌──────────────┐ ┌──────────────┐ │ +│ │ IP话机 │ │ 软电话条 │ │ +│ │ (150台) │ │ (嵌入CRM) │ │ +│ └──────────────┘ └──────────────┘ │ +└─────────────────────────────────────────────────────────────────────────┘ +``` + +### 5.2 部署架构 + +采用**私有化部署+主备高可用**架构: + +``` + ┌─────────────────┐ + │ 虚拟IP(VIP) │ + │ SIP线路接入 │ + └────────┬────────┘ + │ + ┌─────────────────────┴─────────────────────┐ + │ │ + ▼ ▼ + ┌─────────────────┐ ┌─────────────────┐ + │ 主服务器 │◄──── Keepalived ────►│ 备服务器 │ + ├─────────────────┤ 心跳检测 ├─────────────────┤ + │ FreeSWITCH │ │ FreeSWITCH │ + │ CTI中间件 │ │ CTI中间件 │ + │ API服务 │ │ API服务 │ + │ WebSocket服务 │ │ WebSocket服务 │ + └────────┬────────┘ └────────┬────────┘ + │ │ + └─────────────────────┬─────────────────────┘ + │ + ┌─────────────────────────┼─────────────────────────┐ + │ │ │ + ▼ ▼ ▼ +┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ +│ MySQL主从集群 │ │ Redis Sentinel │ │ NAS存储 │ +│ (2节点) │ │ (3节点) │ │ (RAID冗余) │ +└─────────────────┘ └─────────────────┘ └─────────────────┘ +``` + +### 5.3 技术选型 + +| 组件类型 | 技术选型 | 选型理由 | +|---------|---------|---------| +| **媒体服务器** | FreeSWITCH 1.10+ | 开源成熟、性能优异、功能完善 | +| **操作系统** | Rocky Linux 8/CentOS 8 | 稳定可靠、长期支持 | +| **开发语言** | Java/Golang | CTI中间件、API服务 | +| **前端框架** | Vue.js 3.x | 软电话条、监控大屏 | +| **数据库** | MySQL 8.0 | 成熟稳定、主从复制 | +| **缓存** | Redis 6.x | 高性能、Sentinel高可用 | +| **消息队列** | RabbitMQ/Kafka | 事件异步处理(可选) | +| **负载均衡** | Nginx | 反向代理、SSL卸载 | +| **高可用** | Keepalived | VIP漂移、故障切换 | +| **监控** | Prometheus + Grafana | 系统监控、告警 | +| **ASR/TTS** | 阿里云智能语音 | 识别准确率高、服务稳定 | + +### 5.4 网络规划 + +| 网络区域 | 网段规划 | 用途 | +|---------|---------|------| +| **业务网段** | 10.10.1.0/24 | 呼叫中心服务器 | +| **数据网段** | 10.10.2.0/24 | 数据库、存储 | +| **坐席网段** | 10.10.10.0/23 | 坐席终端、IP话机 | +| **管理网段** | 10.10.100.0/24 | 运维管理 | +| **SIP信令** | 独立VLAN | SIP中继对接 | + +### 5.5 号码规划 + +| 业务线 | 号码类型 | 号码 | 用途 | +|-------|---------|------|------| +| 道路救援 | 400号码 | 400-XXX-XXX1 | 客户呼入 | +| 家政服务 | 400号码 | 400-XXX-XXX2 | 客户呼入 | +| 代驾服务 | 400/固话 | 400-XXX-XXX3 | 客户呼入 | +| 外呼显号 | 固话 | 0XX-XXXXXXXX | 外呼主叫显示 | + +--- + +## 第六章 项目投资预算 + +### 6.1 投资概算汇总 + +| 投资类别 | 金额(万元) | 占比 | +|---------|-------------|------| +| 硬件设备 | 47-80.5 | 33%-45% | +| 软件及开发 | 52.5-87.5 | 37%-49% | +| 实施部署 | 5-10 | 4%-6% | +| **一次性投资合计** | **104.5-178** | **100%** | + +### 6.2 硬件投资明细 + +| 序号 | 设备名称 | 规格 | 数量 | 单价(万) | 合计(万) | +|-----|---------|------|------|---------|---------| +| 1 | 应用服务器 | 32核/64GB/500GB SSD+2TB | 2 | 5-8 | 10-16 | +| 2 | 数据库服务器 | 16核/64GB/1TB SSD | 2 | 4-6 | 8-12 | +| 3 | Redis服务器 | 8核/32GB/500GB SSD | 3 | 2-3 | 6-9 | +| 4 | NAS存储 | 96TB可用(RAID) | 1 | 8-15 | 8-15 | +| 5 | 网络交换机 | 千兆三层 | 2 | 1-2 | 2-4 | +| 6 | 防火墙 | 企业级 | 1 | 2-5 | 2-5 | +| 7 | IP话机 | SIP话机 | 150 | 0.05-0.08 | 7.5-12 | +| 8 | 坐席耳麦 | 专业话务耳麦 | 150 | 0.02-0.05 | 3-7.5 | +| | **硬件合计** | | | | **47-80.5** | + +### 6.3 软件及开发投资明细 + +| 序号 | 项目 | 说明 | 费用(万) | +|-----|------|------|---------| +| 1 | FreeSWITCH | 开源免费 | 0 | +| 2 | 操作系统 | Rocky Linux开源 | 0 | +| 3 | MySQL/Redis | 社区版开源 | 0 | +| 4 | 系统开发 | 350人天×1500-2500元 | 52.5-87.5 | +| | **软件及开发合计** | | **52.5-87.5** | + +### 6.4 实施部署投资 + +| 序号 | 项目 | 费用(万) | +|-----|------|---------| +| 1 | 硬件安装调试 | 1-2 | +| 2 | 网络部署配置 | 1-2 | +| 3 | 系统联调测试 | 2-4 | +| 4 | 培训及上线支持 | 1-2 | +| | **实施部署合计** | **5-10** | + +### 6.5 年度运营费用 + +| 项目 | 月费用(万) | 年费用(万) | +|------|-----------|-----------| +| **线路费用** | | | +| 400号码月租(3个) | 0.3-1.5 | 3.6-18 | +| SIP并发费(120路) | 0.6-1.2 | 7.2-14.4 | +| **通信费用** | | | +| 呼入通话费 | 5-9 | 60-108 | +| 呼出通话费 | 21.6-40.5 | 259-486 | +| **云服务费用** | | | +| 阿里云ASR | 2-5 | 24-60 | +| 阿里云TTS | 1-3 | 12-36 | +| **运维费用** | | | +| 机房/带宽 | 1-2 | 12-24 | +| 系统维护 | 1-2 | 12-24 | +| **年度运营合计** | | **390-770** | + +### 6.6 投资估算汇总表 + +| 项目 | 首年(万) | 第二年(万) | 第三年(万) | +|------|---------|-----------|-----------| +| 一次性建设投入 | 104.5-178 | - | - | +| 年度运营费用 | 390-770 | 390-770 | 390-770 | +| **年度总计** | **494.5-948** | **390-770** | **390-770** | +| **三年累计** | | | **1274.5-2488** | + +--- + +## 第七章 项目效益分析 + +### 7.1 经济效益 + +#### 7.1.1 人力成本节约 + +| 节约项 | 计算依据 | 年节约(万) | +|-------|---------|-----------| +| **外呼效率提升** | 坐席利用率从40%→70%,相当于节约45个坐席人力 | 45×8=360 | +| **批量通知自动化** | 原需5人专职,现全自动 | 5×8=40 | +| **回访自动化** | 原需10人,现机器人承担80% | 8×8=64 | +| **IVR自助分流** | 30%简单咨询自助解决,节约人力 | 15×8=120 | +| **年人力成本节约** | | **约584万** | + +> 注:按坐席人均年成本8万元估算 + +#### 7.1.2 业务增收 + +| 增收项 | 计算依据 | 年增收(万) | +|-------|---------|-----------| +| **接通率提升** | 减少客户流失,预计增收5% | 约200 | +| **外呼营销转化** | 新增营销触达能力 | 约150 | +| **年业务增收** | | **约350万** | + +#### 7.1.3 投资回报分析 + +| 指标 | 数值 | +|------|------| +| 一次性投入 | 141万(取中值) | +| 年运营成本 | 580万(取中值) | +| 年成本节约 | 584万 | +| 年业务增收 | 350万 | +| **年净收益** | **354万** | +| **投资回收期** | **约4.8个月** | + +### 7.2 管理效益 + +| 效益项 | 说明 | +|-------|------| +| **服务可追溯** | 全程录音,服务质量可追溯,纠纷可举证 | +| **管理可视化** | 实时监控大屏,管理者实时掌握运营状态 | +| **决策有依据** | 话务数据积累,为排班、扩容提供数据支撑 | +| **流程标准化** | IVR+机器人固化服务流程,服务质量稳定 | + +### 7.3 客户效益 + +| 效益项 | 说明 | +|-------|------| +| **接通率提升** | 专业排队机制,减少占线挂断 | +| **等待时间缩短** | IVR分流+智能分配,平均等待<30秒 | +| **服务体验提升** | 来电自动识别,坐席了解客户历史,避免重复描述 | +| **服务时间扩展** | 7×24小时服务,紧急需求随时响应 | + +--- + +## 第八章 项目实施计划 + +### 8.1 项目周期 + +**总工期:4个月(17周)** + +### 8.2 阶段划分 + +``` + 1月 2月 3月 4月 5月 + |----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----| +W1 W2 W3 W4 W5 W6 W7 W8 W9 W10 W11 W12 W13 W14 W15 W16 W17 W18 + +[需求设计 ] + [环境搭建 ] + [========= 核心功能开发 =========] + [=== 高级功能开发 ===] + [集成联调] + [测试优化] + [试运行][上线] +``` + +### 8.3 里程碑计划 + +| 里程碑 | 计划时间 | 交付物 | 验收标准 | +|-------|---------|-------|---------| +| **M1: 需求确认** | 第2周末 | 需求规格说明书、技术方案 | 评审通过 | +| **M2: 环境就绪** | 第4周末 | 硬件到位、基础环境部署完成 | FreeSWITCH可接打电话 | +| **M3: 核心功能完成** | 第10周末 | 呼入呼出、ACD、坐席管理、API | 核心流程跑通 | +| **M4: 全功能完成** | 第14周末 | 外呼、机器人、监控大屏 | 全部功能可用 | +| **M5: 联调测试完成** | 第16周末 | CRM集成完成、测试报告 | 全流程联调通过 | +| **M6: 试运行完成** | 第18周末 | 试运行报告 | 问题收敛,达到上线标准 | +| **M7: 正式上线** | 第19周 | 上线报告 | 系统平稳运行 | + +### 8.4 详细进度计划 + +| 阶段 | 时间 | 主要任务 | 交付物 | +|------|------|---------|--------| +| **一、需求设计** | W1-W2 | 需求评审、架构设计、接口设计、详细设计 | 技术方案、接口文档、设计文档 | +| **二、环境搭建** | W3-W4 | 硬件采购到货、网络部署、FreeSWITCH安装、线路对接 | 基础环境就绪 | +| **三、核心开发** | W5-W10 | CTI中间件、API服务、坐席管理、ACD、录音、软电话条 | 核心功能可用 | +| **四、高级开发** | W11-W14 | 预测式外呼、机器人模块、IVR语音识别、监控大屏 | 高级功能可用 | +| **五、集成联调** | W15-W16 | CRM对接、全流程联调、高可用测试 | 联调通过 | +| **六、测试优化** | W16-W17 | 功能测试、性能测试、安全测试、Bug修复 | 测试报告 | +| **七、试运行** | W18 | 小范围上线、问题收集 | 试运行报告 | +| **八、正式上线** | W19 | 全面上线、监控保障 | 上线完成 | + +--- + +## 第九章 项目组织架构 + +### 9.1 组织架构图 + +``` + ┌─────────────────┐ + │ 项目发起人 │ + │ (公司高层) │ + └────────┬────────┘ + │ + ┌────────▼────────┐ + │ 项目经理 │ + │ (总体负责) │ + └────────┬────────┘ + │ + ┌────────────────────────┼────────────────────────┐ + │ │ │ + ▼ ▼ ▼ +┌───────────────┐ ┌───────────────┐ ┌───────────────┐ +│ 技术开发组 │ │ 业务需求组 │ │ 测试实施组 │ +├───────────────┤ ├───────────────┤ ├───────────────┤ +│ · 架构师 │ │ · 业务分析师 │ │ · 测试工程师 │ +│ · 后端开发 │ │ · 产品经理 │ │ · 实施工程师 │ +│ · 前端开发 │ │ · 业务对接人 │ │ · 运维工程师 │ +│ · FreeSWITCH │ │ │ │ │ +└───────────────┘ └───────────────┘ └───────────────┘ +``` + +### 9.2 角色职责 + +| 角色 | 人数 | 职责 | +|------|------|------| +| **项目发起人** | 1 | 项目决策、资源协调、重大问题决策 | +| **项目经理** | 1 | 项目整体管理、进度控制、风险管理、对外沟通 | +| **架构师** | 1 | 技术架构设计、技术选型、技术难点攻关 | +| **后端开发** | 3-4 | CTI中间件、API服务、外呼引擎、机器人模块开发 | +| **前端开发** | 1-2 | 软电话条、监控大屏开发 | +| **FreeSWITCH工程师** | 1-2 | FreeSWITCH配置、IVR开发、ESL对接 | +| **业务分析师** | 1 | 需求分析、业务流程梳理 | +| **测试工程师** | 1-2 | 测试用例、功能测试、性能测试 | +| **实施工程师** | 1 | 环境部署、系统上线 | +| **运维工程师** | 1 | 系统运维、监控告警 | +| **合计** | **12-16人** | | + +### 9.3 沟通机制 + +| 会议类型 | 频率 | 参与人 | 内容 | +|---------|------|-------|------| +| **项目周会** | 每周一次 | 全体成员 | 进度汇报、问题协调、下周计划 | +| **每日站会** | 每日 | 开发+测试 | 当日任务、阻塞问题 | +| **技术评审会** | 按需 | 技术组 | 技术方案评审、代码评审 | +| **里程碑汇报** | 每里程碑 | 项目经理+发起人 | 阶段成果、风险汇报 | +| **上线评审会** | 上线前 | 全体+业务方 | 上线准备度检查 | + +--- + +## 第十章 风险分析与应对 + +### 10.1 风险清单 + +| 风险编号 | 风险描述 | 可能性 | 影响程度 | 风险等级 | +|---------|---------|--------|---------|---------| +| R01 | FreeSWITCH技术门槛高,团队经验不足 | 高 | 高 | **高** | +| R02 | 运营商线路对接周期长 | 中 | 高 | **高** | +| R03 | CRM系统对接复杂度超预期 | 中 | 中 | **中** | +| R04 | ASR识别效果不及预期 | 中 | 中 | **中** | +| R05 | 硬件采购/到货延迟 | 低 | 高 | **中** | +| R06 | 并发性能不达标 | 低 | 高 | **中** | +| R07 | 关键人员离职 | 低 | 高 | **中** | +| R08 | 需求变更频繁 | 中 | 中 | **中** | + +### 10.2 应对措施 + +| 风险编号 | 应对措施 | 责任人 | +|---------|---------|--------| +| **R01** | 1. 项目前期组织FreeSWITCH专项培训
2. 考虑引入外部FreeSWITCH顾问支持
3. 预留20%时间缓冲 | 项目经理 | +| **R02** | 1. 提前2个月启动线路申请
2. 准备备选运营商
3. 先用测试线路开发,并行对接正式线路 | 项目经理 | +| **R03** | 1. 需求阶段明确接口规范
2. 预留接口联调时间
3. CRM团队提前介入 | 架构师 | +| **R04** | 1. 提前进行ASR效果测试
2. 准备热词优化方案
3. 设计降级策略(按键兜底) | 技术组 | +| **R05** | 1. 提前下单采购
2. 准备备选供应商
3. 先用云主机开发 | 项目经理 | +| **R06** | 1. 上线前进行压力测试
2. 准备扩容方案
3. 架构支持水平扩展 | 架构师 | +| **R07** | 1. 知识文档化
2. 关键模块双人备份
3. 提前储备人员 | 项目经理 | +| **R08** | 1. 需求基线管理
2. 变更走评审流程
3. 评估变更影响后决策 | 产品经理 | + +### 10.3 风险监控 + +| 风险等级 | 监控频率 | 汇报层级 | +|---------|---------|---------| +| **高** | 每周跟踪 | 项目发起人 | +| **中** | 双周跟踪 | 项目经理 | +| **低** | 月度跟踪 | 项目组 | + +--- + +## 第十一章 结论与建议 + +### 11.1 结论 + +经过全面分析,本项目具备以下条件: + +| 维度 | 评估结论 | +|------|---------| +| **必要性** | ✅ 业务发展迫切需要,现有模式已无法支撑 | +| **可行性** | ✅ 技术方案成熟,团队具备基本能力 | +| **经济性** | ✅ 投资回报期短(约4.8个月),效益显著 | +| **风险性** | ⚠️ 存在技术风险,但可通过措施控制 | + +**综合结论:项目具备立项条件,建议批准立项。** + +### 11.2 建议 + +1. **尽快启动**:业务增长迅速,建议尽快批准立项,启动实施 +2. **技术准备**:建议在项目正式启动前,组织FreeSWITCH技术培训 +3. **线路先行**:建议立即启动运营商线路申请,避免成为关键路径 +4. **分步上线**:建议优先上线家政业务,验证后再推广至道路救援 +5. **预留缓冲**:建议预留10%-20%预算和时间缓冲,应对不确定性 +6. **运维同步**:建议运维人员全程参与,确保上线后平稳运行 + +### 11.3 审批意见 + +| 审批环节 | 审批人 | 日期 | 意见 | +|---------|-------|------|------| +| **技术评审** | | | | +| **财务评审** | | | | +| **业务评审** | | | | +| **最终审批** | | | | + +--- + +## 附件清单 + +| 附件编号 | 附件名称 | 说明 | +|---------|---------|------| +| 附件1 | 《呼叫中心系统需求规格说明书》 | 详细需求文档 | +| 附件2 | 硬件选型参考清单 | 硬件详细配置及备选品牌 | +| 附件3 | 运营商线路资费对比 | 各运营商资费方案对比 | +| 附件4 | FreeSWITCH技术评估报告 | 技术可行性详细分析(如有) | + +--- + +**文档结束** + +--- + +以上是完整的项目立项书,涵盖了项目背景、建设方案、投资预算、效益分析、实施计划、组织架构和风险应对等内容。请您审阅,如需调整或补充,请随时告知!📋 + +### USER +能否提供FreeSWITCH的详细技术架构和ESL开发指南? + +### ASSISTANT +# FreeSWITCH技术架构与ESL开发指南 + +--- + +## 目录 + +1. [FreeSWITCH技术架构](#第一部分-freeswitch技术架构) +2. [核心模块详解](#第二部分-核心模块详解) +3. [ESL开发指南](#第三部分-esl开发指南) +4. [呼叫中心场景开发实践](#第四部分-呼叫中心场景开发实践) +5. [高可用部署方案](#第五部分-高可用部署方案) +6. [性能优化指南](#第六部分-性能优化指南) + +--- + +## 第一部分 FreeSWITCH技术架构 + +### 1.1 整体架构概览 + +``` +┌─────────────────────────────────────────────────────────────────────────────┐ +│ 外部系统/应用层 │ +│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ +│ │ CTI中间件 │ │ Web应用 │ │ 业务系统 │ │ 监控系统 │ │ 第三方App│ │ +│ └─────┬────┘ └─────┬────┘ └─────┬────┘ └─────┬────┘ └─────┬────┘ │ +│ │ │ │ │ │ │ +│ └─────────────┴─────────────┴──────┬──────┴─────────────┘ │ +│ │ │ +│ ┌──────▼──────┐ │ +│ │ ESL接口 │ │ +│ │ (TCP:8021) │ │ +│ └──────┬──────┘ │ +└───────────────────────────────────────────┼─────────────────────────────────┘ + │ +┌───────────────────────────────────────────▼─────────────────────────────────┐ +│ FreeSWITCH 核心层 │ +│ │ +│ ┌─────────────────────────────────────────────────────────────────────┐ │ +│ │ Core(核心引擎) │ │ +│ │ ┌───────────────┐ ┌───────────────┐ ┌───────────────┐ │ │ +│ │ │ 状态机管理 │ │ 内存管理 │ │ 线程池管理 │ │ │ +│ │ └───────────────┘ └───────────────┘ └───────────────┘ │ │ +│ │ ┌───────────────┐ ┌───────────────┐ ┌───────────────┐ │ │ +│ │ │ 事件系统 │ │ 数据库抽象 │ │ 日志系统 │ │ │ +│ │ └───────────────┘ └───────────────┘ └───────────────┘ │ │ +│ └─────────────────────────────────────────────────────────────────────┘ │ +│ │ +│ ┌─────────────────────────────────────────────────────────────────────┐ │ +│ │ Module Interface(模块接口层) │ │ +│ │ │ │ +│ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │ +│ │ │ Endpoint │ │ Application │ │ Codec │ │ Dialplan │ │ │ +│ │ │ 终端模块 │ │ 应用模块 │ │ 编解码 │ │ 拨号计划 │ │ │ +│ │ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ │ │ +│ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │ +│ │ │ Event │ │ Format │ │ Logger │ │ XML │ │ │ +│ │ │ 事件模块 │ │ 文件格式 │ │ 日志模块 │ │ XML处理 │ │ │ +│ │ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ │ │ +│ └─────────────────────────────────────────────────────────────────────┘ │ +│ │ +└─────────────────────────────────────────────────────────────────────────────┘ + │ +┌───────────────────────────────────────────▼─────────────────────────────────┐ +│ 协议/媒体层 │ +│ │ +│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ +│ │ mod_sofia │ │ mod_verto │ │ mod_rtmp │ │ mod_skinny │ │ +│ │ (SIP协议) │ │ (WebRTC) │ │ (RTMP) │ │ (Cisco) │ │ +│ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ │ +│ │ +│ ┌─────────────────────────────────────────────────────────────────────┐ │ +│ │ 媒体处理引擎 │ │ +│ │ ┌───────────┐ ┌───────────┐ ┌───────────┐ ┌───────────┐ │ │ +│ │ │ RTP处理 │ │ 编解码转换 │ │ 录音处理 │ │ DTMF检测 │ │ │ +│ │ └───────────┘ └───────────┘ └───────────┘ └───────────┘ │ │ +│ └─────────────────────────────────────────────────────────────────────┘ │ +│ │ +└─────────────────────────────────────────────────────────────────────────────┘ + │ +┌───────────────────────────────────────────▼─────────────────────────────────┐ +│ 网络层 │ +│ SIP/UDP/TCP RTP/SRTP WebSocket HTTP │ +│ :5060 :16384-32768 :8081 :8080 │ +└─────────────────────────────────────────────────────────────────────────────┘ +``` + +### 1.2 核心概念 + +#### 1.2.1 Channel(通道) + +Channel是FreeSWITCH中最核心的概念,代表一路通话的端点。 + +``` +┌─────────────────────────────────────────────────────────────────┐ +│ 一通电话 │ +│ │ +│ ┌─────────────┐ Bridge ┌─────────────┐ │ +│ │ Channel A │◄─────────────────────────►│ Channel B │ │ +│ │ (主叫方) │ │ (被叫方) │ │ +│ │ │ │ │ │ +│ │ UUID: xxx-a │ │ UUID: xxx-b │ │ +│ │ State: CS_ │ │ State: CS_ │ │ +│ │ Variables │ │ Variables │ │ +│ └─────────────┘ └─────────────┘ │ +│ │ +└─────────────────────────────────────────────────────────────────┘ +``` + +**Channel状态机:** + +``` + ┌──────────────────────────────────────────┐ + │ │ + ▼ │ +┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌──┴──────┐ +│ NEW │───►│ INIT │───►│ ROUTING │───►│ EXECUTE │───►│ HANGUP │ +└─────────┘ └─────────┘ └─────────┘ └─────────┘ └─────────┘ + │ │ + │ │ + ┌────▼────┐ ┌────▼────┐ + │ CONSUME │ │ EXCHANGE│ + │ MEDIA │ │ MEDIA │ + └─────────┘ └─────────┘ + +Channel状态说明: +├── CS_NEW : 新建通道 +├── CS_INIT : 初始化 +├── CS_ROUTING : 路由中(执行dialplan) +├── CS_EXECUTE : 执行应用中 +├── CS_EXCHANGE_MEDIA : 媒体交换中(bridged) +├── CS_CONSUME_MEDIA : 媒体消费中 +├── CS_HIBERNATE : 休眠状态 +├── CS_HANGUP : 挂断中 +└── CS_DESTROY : 销毁 +``` + +#### 1.2.2 Session(会话) + +Session包含Channel及其相关上下文信息: + +```c +// Session结构概念图 +Session { + ├── Channel // 通道信息 + │ ├── UUID // 唯一标识 + │ ├── State // 当前状态 + │ ├── Direction // 呼叫方向(inbound/outbound) + │ └── Variables // 通道变量 + │ + ├── Caller Profile // 主叫信息 + │ ├── caller_id_name + │ ├── caller_id_number + │ ├── destination_number + │ └── ... + │ + ├── Codec // 编解码信息 + ├── RTP Session // RTP会话 + └── Bridge Session // 桥接会话(如果有) +} +``` + +#### 1.2.3 Event(事件) + +FreeSWITCH基于事件驱动架构,所有状态变化都产生事件: + +``` +┌─────────────────────────────────────────────────────────────────┐ +│ FreeSWITCH Event System │ +│ │ +│ ┌───────────────┐ │ +│ │ Event Producer│ ──────┐ │ +│ │ (模块/核心) │ │ │ +│ └───────────────┘ │ ┌─────────────────────────┐ │ +│ ├─────►│ Event Dispatcher │ │ +│ ┌───────────────┐ │ │ (事件分发器) │ │ +│ │ Event Producer│ ──────┤ └───────────┬─────────────┘ │ +│ │ (模块/核心) │ │ │ │ +│ └───────────────┘ │ ┌───────────┴─────────────┐ │ +│ │ │ │ │ │ +│ ┌───────────────┐ │ ▼ ▼ ▼ │ +│ │ Event Producer│ ──────┘ ┌───────┐ ┌───────┐ ┌───────┐│ +│ │ (模块/核心) │ │ ESL │ │Internal│ │ Lua/ ││ +│ └───────────────┘ │Consumer│ │Handler │ │ JS ││ +│ └───────┘ └───────┘ └───────┘│ +└─────────────────────────────────────────────────────────────────┘ +``` + +**常用事件类型:** + +| 事件名称 | 触发时机 | 用途 | +|---------|---------|------| +| CHANNEL_CREATE | 通道创建 | 新呼叫进入 | +| CHANNEL_ANSWER | 通话接听 | 通话建立 | +| CHANNEL_BRIDGE | 通道桥接 | 双方接通 | +| CHANNEL_UNBRIDGE | 取消桥接 | 桥接断开 | +| CHANNEL_HANGUP | 挂断 | 通话结束 | +| CHANNEL_HANGUP_COMPLETE | 挂断完成 | 通话完全结束 | +| CHANNEL_STATE | 状态变化 | 状态监控 | +| DTMF | 按键检测 | IVR交互 | +| RECORD_START | 开始录音 | 录音控制 | +| RECORD_STOP | 停止录音 | 录音控制 | +| CUSTOM | 自定义事件 | 业务扩展 | + +### 1.3 目录结构 + +``` +/usr/local/freeswitch/ +├── bin/ # 可执行文件 +│ └── freeswitch # 主程序 +│ +├── conf/ # 配置文件目录 +│ ├── freeswitch.xml # 主配置文件 +│ ├── vars.xml # 全局变量 +│ ├── sip_profiles/ # SIP配置 +│ │ ├── internal.xml # 内部Profile(坐席注册) +│ │ └── external.xml # 外部Profile(中继对接) +│ ├── dialplan/ # 拨号计划 +│ │ ├── default.xml # 默认拨号计划 +│ │ └── public.xml # 公共拨号计划(呼入) +│ ├── directory/ # 用户目录(分机注册) +│ │ └── default/ +│ │ └── 1000.xml # 分机1000配置 +│ ├── autoload_configs/ # 模块自动加载配置 +│ │ ├── modules.conf.xml # 模块加载列表 +│ │ ├── sofia.conf.xml # SIP模块配置 +│ │ ├── event_socket.conf.xml# ESL配置 +│ │ └── ... +│ └── lang/ # 语音提示 +│ +├── lib/ # 库文件 +├── mod/ # 模块文件(.so) +├── log/ # 日志目录 +├── db/ # 数据库文件 +├── recordings/ # 录音文件 +├── sounds/ # 语音文件 +├── scripts/ # 脚本目录 +└── storage/ # 存储目录 +``` + +--- + +## 第二部分 核心模块详解 + +### 2.1 mod_sofia(SIP模块) + +mod_sofia是FreeSWITCH的SIP协议栈实现,基于Sofia-SIP库。 + +#### 2.1.1 架构 + +``` +┌─────────────────────────────────────────────────────────────────────┐ +│ mod_sofia │ +│ │ +│ ┌─────────────────────────────────────────────────────────────┐ │ +│ │ Sofia-SIP Stack │ │ +│ │ ┌───────────┐ ┌───────────┐ ┌───────────┐ ┌───────────┐ │ │ +│ │ │ NUA │ │ NTA │ │ TPORT │ │ SDP │ │ │ +│ │ │ User Agent│ │Transaction│ │ Transport │ │ Parser │ │ │ +│ │ └───────────┘ └───────────┘ └───────────┘ └───────────┘ │ │ +│ └─────────────────────────────────────────────────────────────┘ │ +│ │ +│ ┌─────────────────────────────────────────────────────────────┐ │ +│ │ Profile Management │ │ +│ │ │ │ +│ │ ┌─────────────────────┐ ┌─────────────────────┐ │ │ +│ │ │ Internal Profile │ │ External Profile │ │ │ +│ │ │ (坐席/分机注册) │ │ (中继/网关) │ │ │ +│ │ │ UDP:5060 │ │ UDP:5080 │ │ │ +│ │ └─────────────────────┘ └─────────────────────┘ │ │ +│ │ │ │ +│ │ ┌─────────────────────────────────────────────────────┐ │ │ +│ │ │ Gateway Management │ │ │ +│ │ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │ │ +│ │ │ │Gateway A│ │Gateway B│ │Gateway C│ ... │ │ │ +│ │ │ │(运营商1) │ │(运营商2) │ │(备用) │ │ │ │ +│ │ │ └─────────┘ └─────────┘ └─────────┘ │ │ │ +│ │ └─────────────────────────────────────────────────────┘ │ │ +│ └─────────────────────────────────────────────────────────────┘ │ +└─────────────────────────────────────────────────────────────────────┘ +``` + +#### 2.1.2 配置示例 + +**Internal Profile(坐席注册):** + +```xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +``` + +**External Profile(中继对接):** + +```xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +``` + +### 2.2 Dialplan(拨号计划) + +拨号计划定义了呼叫的路由和处理逻辑。 + +#### 2.2.1 执行流程 + +``` +┌──────────────────────────────────────────────────────────────────┐ +│ Dialplan 执行流程 │ +│ │ +│ 来电进入 │ +│ │ │ +│ ▼ │ +│ ┌─────────────────────────────────────────────────────────────┐│ +│ │ Context 选择 ││ +│ │ (根据Profile配置的context) ││ +│ │ 例如: public (呼入) / default (内部) ││ +│ └──────────────────────────┬──────────────────────────────────┘│ +│ │ │ +│ ▼ │ +│ ┌─────────────────────────────────────────────────────────────┐│ +│ │ Extension 匹配 ││ +│ │ (按顺序匹配condition) ││ +│ │ ││ +│ │ Extension 1: ──┐ ││ +│ │ Condition ───┼─► 不匹配 ───► 下一个Extension ││ +│ │ │ ││ +│ │ └─► 匹配 ───► 执行Actions ││ +│ └──────────────────────────┬──────────────────────────────────┘│ +│ │ │ +│ ▼ │ +│ ┌─────────────────────────────────────────────────────────────┐│ +│ │ Action 执行 ││ +│ │ (按顺序执行应用) ││ +│ │ ││ +│ │ action: answer ││ +│ │ action: playback ││ +│ │ action: bridge ││ +│ │ ... ││ +│ └─────────────────────────────────────────────────────────────┘│ +│ │ +└──────────────────────────────────────────────────────────────────┘ +``` + +#### 2.2.2 配置示例 + +**呼入路由(public.xml):** + +```xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +``` + +**IVR和呼叫处理(default.xml):** + +```xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +``` + +### 2.3 mod_event_socket(ESL模块) + +ESL是FreeSWITCH对外提供的控制接口,是开发呼叫中心的核心。 + +#### 2.3.1 工作模式 + +``` +┌─────────────────────────────────────────────────────────────────────┐ +│ ESL 工作模式 │ +│ │ +│ ┌───────────────────────────────────────────────────────────────┐ │ +│ │ Inbound 模式 │ │ +│ │ (客户端主动连接) │ │ +│ │ │ │ +│ │ ┌───────────┐ TCP:8021 ┌──────────────────┐ │ │ +│ │ │ CTI中间件 │ ──────────────────────► │ FreeSWITCH │ │ │ +│ │ │ (Client) │ ◄────────────────────── │ (Server) │ │ │ +│ │ └───────────┘ Event Stream └──────────────────┘ │ │ +│ │ │ │ +│ │ 特点: │ │ +│ │ - 客户端主动连接FreeSWITCH │ │ +│ │ - 可以订阅事件、发送命令 │ │ +│ │ - 适合集中控制、监控场景 │ │ +│ │ - 推荐呼叫中心使用此模式 │ │ +│ └───────────────────────────────────────────────────────────────┘ │ +│ │ +│ ┌───────────────────────────────────────────────────────────────┐ │ +│ │ Outbound 模式 │ │ +│ │ (FreeSWITCH主动连接) │ │ +│ │ │ │ +│ │ ┌──────────────────┐ TCP ┌───────────────┐ │ │ +│ │ │ FreeSWITCH │ ──────────────────►│ 应用服务器 │ │ │ +│ │ │ (每个呼叫) │ ◄────────────────── │ (Server) │ │ │ +│ │ └──────────────────┘ └───────────────┘ │ │ +│ │ │ │ +│ │ 特点: │ │ +│ │ - 每个呼叫FreeSWITCH主动连接应用 │ │ +│ │ - 在dialplan中使用socket应用触发 │ │ +│ │ - 适合简单IVR场景 │ │ +│ └───────────────────────────────────────────────────────────────┘ │ +│ │ +└─────────────────────────────────────────────────────────────────────┘ +``` + +#### 2.3.2 ESL配置 + +```xml + + + + + + + + + + + + + + + +``` + +--- + +## 第三部分 ESL开发指南 + +### 3.1 ESL协议详解 + +#### 3.1.1 协议格式 + +ESL使用类HTTP的文本协议: + +``` +┌─────────────────────────────────────────────────────────────────────┐ +│ ESL 消息格式 │ +│ │ +│ ┌───────────────────────────────────────────────────────────────┐ │ +│ │ 请求格式: │ │ +│ │ ┌─────────────────────────────────────────────────────────┐ │ │ +│ │ │ command [arguments] │ │ │ +│ │ │ Header-Name: header-value │ │ │ +│ │ │ Header-Name: header-value │ │ │ +│ │ │ │ │ │ +│ │ │ [body if Content-Length > 0] │ │ │ +│ │ └─────────────────────────────────────────────────────────┘ │ │ +│ └───────────────────────────────────────────────────────────────┘ │ +│ │ +│ ┌───────────────────────────────────────────────────────────────┐ │ +│ │ 响应格式: │ │ +│ │ ┌─────────────────────────────────────────────────────────┐ │ │ +│ │ │ Content-Type: text/event-plain │ │ │ +│ │ │ Content-Length: 1234 │ │ │ +│ │ │ Reply-Text: +OK [message] │ │ │ +│ │ │ │ │ │ +│ │ │ [body] │ │ │ +│ │ └─────────────────────────────────────────────────────────┘ │ │ +│ └───────────────────────────────────────────────────────────────┘ │ +│ │ +└─────────────────────────────────────────────────────────────────────┘ +``` + +#### 3.1.2 常用命令 + +| 命令类型 | 命令 | 说明 | +|---------|------|------| +| **认证** | `auth ` | 连接认证 | +| **事件订阅** | `event plain ` | 订阅事件 | +| | `event plain ALL` | 订阅所有事件 | +| | `event plain CHANNEL_CREATE CHANNEL_ANSWER CHANNEL_HANGUP` | 订阅指定事件 | +| | `nixevent ` | 取消订阅 | +| | `noevents` | 取消所有订阅 | +| **API命令** | `api [args]` | 同步执行API | +| | `bgapi [args]` | 异步执行API | +| **过滤器** | `filter
` | 过滤特定事件 | +| | `filter Unique-ID ` | 只接收指定UUID事件 | +| **呼叫控制** | `sendmsg ` | 向指定通道发送消息 | +| | `execute` | 在通道上执行应用 | +| **其他** | `log ` | 设置日志级别 | +| | `linger` | 保持连接 | +| | `nolinger` | 取消保持 | +| | `exit` | 断开连接 | + +### 3.2 Java ESL开发 + +#### 3.2.1 项目结构 + +``` +callcenter-cti/ +├── pom.xml +├── src/main/java/ +│ └── com/callcenter/ +│ ├── Application.java +│ ├── esl/ +│ │ ├── EslConnectionManager.java # ESL连接管理 +│ │ ├── EslEventHandler.java # 事件处理 +│ │ ├── EslCommandExecutor.java # 命令执行 +│ │ └── InboundClient.java # Inbound客户端 +│ ├── service/ +│ │ ├── AgentService.java # 坐席服务 +│ │ ├── CallService.java # 呼叫服务 +│ │ ├── QueueService.java # 排队服务 +│ │ └── AcdService.java # 话务分配服务 +│ ├── model/ +│ │ ├── Agent.java # 坐席模型 +│ │ ├── Call.java # 呼叫模型 +│ │ └── Queue.java # 队列模型 +│ ├── api/ +│ │ ├── AgentController.java # 坐席API +│ │ └── CallController.java # 呼叫API +│ └── websocket/ +│ └── EventPushHandler.java # 事件推送 +└── src/main/resources/ + └── application.yml +``` + +#### 3.2.2 Maven依赖 + +```xml + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-websocket + + + + + org.freeswitch.esl.client + org.freeswitch.esl.client + 0.9.2 + + + + + io.netty + netty-all + 4.1.86.Final + + + + + org.springframework.boot + spring-boot-starter-data-redis + + + + + com.alibaba + fastjson + 2.0.23 + + + + + org.apache.commons + commons-lang3 + + + org.projectlombok + lombok + + +``` + +#### 3.2.3 ESL连接管理 + +```java +package com.callcenter.esl; + +import lombok.extern.slf4j.Slf4j; +import org.freeswitch.esl.client.inbound.Client; +import org.freeswitch.esl.client.inbound.InboundConnectionFailure; +import org.freeswitch.esl.client.transport.event.EslEvent; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; +import javax.annotation.PreDestroy; +import java.util.concurrent.*; +import java.util.concurrent.atomic.AtomicBoolean; + +/** + * ESL连接管理器 + * 负责与FreeSWITCH建立和维护连接 + */ +@Slf4j +@Component +public class EslConnectionManager { + + @Value("${freeswitch.esl.host:127.0.0.1}") + private String eslHost; + + @Value("${freeswitch.esl.port:8021}") + private int eslPort; + + @Value("${freeswitch.esl.password:ClueCon}") + private String eslPassword; + + @Value("${freeswitch.esl.timeout:30}") + private int timeout; + + private Client eslClient; + private final AtomicBoolean connected = new AtomicBoolean(false); + private final AtomicBoolean reconnecting = new AtomicBoolean(false); + + private ScheduledExecutorService scheduler; + private ExecutorService eventExecutor; + + private EslEventHandler eventHandler; + + @PostConstruct + public void init() { + // 初始化线程池 + scheduler = Executors.newSingleThreadScheduledExecutor( + r -> new Thread(r, "esl-reconnect")); + eventExecutor = new ThreadPoolExecutor( + 4, 16, 60L, TimeUnit.SECONDS, + new LinkedBlockingQueue<>(10000), + r -> new Thread(r, "esl-event-handler"), + new ThreadPoolExecutor.CallerRunsPolicy() + ); + + // 建立连接 + connect(); + + // 启动心跳检测 + startHeartbeat(); + } + + /** + * 建立ESL连接 + */ + public synchronized void connect() { + if (connected.get()) { + log.info("ESL已连接,无需重复连接"); + return; + } + + try { + log.info("正在连接FreeSWITCH ESL: {}:{}", eslHost, eslPort); + + eslClient = new Client(); + eslClient.connect(eslHost, eslPort, eslPassword, timeout); + + // 订阅事件 + subscribeEvents(); + + // 设置事件监听器 + eslClient.setEventSubscriptions("plain", "all"); + eslClient.addEventListener((ctx, event) -> { + handleEvent(event); + }); + + connected.set(true); + reconnecting.set(false); + log.info("ESL连接成功"); + + } catch (InboundConnectionFailure e) { + log.error("ESL连接失败: {}", e.getMessage()); + connected.set(false); + scheduleReconnect(); + } + } + + /** + * 订阅所需事件 + */ + private void subscribeEvents() { + String events = String.join(" ", + "CHANNEL_CREATE", + "CHANNEL_ANSWER", + "CHANNEL_BRIDGE", + "CHANNEL_UNBRIDGE", + "CHANNEL_HANGUP", + "CHANNEL_HANGUP_COMPLETE", + "CHANNEL_STATE", + "DTMF", + "RECORD_START", + "RECORD_STOP", + "CUSTOM" + ); + + eslClient.setEventSubscriptions("plain", events); + eslClient.addEventFilter("Event-Name", "CHANNEL_CREATE"); + log.info("已订阅事件: {}", events); + } + + /** + * 处理事件 + */ + private void handleEvent(EslEvent event) { + eventExecutor.submit(() -> { + try { + if (eventHandler != null) { + eventHandler.handle(event); + } + } catch (Exception e) { + log.error("事件处理异常: {}", e.getMessage(), e); + } + }); + } + + /** + * 启动心跳检测 + */ + private void startHeartbeat() { + scheduler.scheduleAtFixedRate(() -> { + if (connected.get()) { + try { + // 发送status命令检测连接 + eslClient.sendSyncApiCommand("status", ""); + } catch (Exception e) { + log.warn("心跳检测失败,连接可能已断开"); + connected.set(false); + scheduleReconnect(); + } + } + }, 30, 30, TimeUnit.SECONDS); + } + + /** + * 计划重连 + */ + private void scheduleReconnect() { + if (reconnecting.compareAndSet(false, true)) { + scheduler.schedule(() -> { + log.info("尝试重新连接ESL..."); + connect(); + }, 5, TimeUnit.SECONDS); + } + } + + /** + * 同步执行API命令 + */ + public String sendSyncApiCommand(String command, String args) { + checkConnection(); + try { + return eslClient.sendSyncApiCommand(command, args).getBodyLines().get(0); + } catch (Exception e) { + log.error("执行API命令失败: {} {}", command, args, e); + throw new RuntimeException("ESL命令执行失败", e); + } + } + + /** + * 异步执行API命令 + */ + public CompletableFuture sendAsyncApiCommand(String command, String args) { + return CompletableFuture.supplyAsync(() -> + sendSyncApiCommand(command, args), eventExecutor); + } + + /** + * 向指定UUID发送消息执行应用 + */ + public void sendExecute(String uuid, String application, String args) { + checkConnection(); + try { + eslClient.sendSyncApiCommand("uuid_broadcast", + uuid + " " + application + "::" + args + " both"); + } catch (Exception e) { + log.error("发送Execute失败: uuid={}, app={}", uuid, application, e); + } + } + + /** + * 检查连接状态 + */ + private void checkConnection() { + if (!connected.get()) { + throw new RuntimeException("ESL未连接"); + } + } + + /** + * 获取连接状态 + */ + public boolean isConnected() { + return connected.get(); + } + + /** + * 设置事件处理器 + */ + public void setEventHandler(EslEventHandler handler) { + this.eventHandler = handler; + } + + @PreDestroy + public void destroy() { + try { + connected.set(false); + if (eslClient != null) { + eslClient.close(); + } + if (scheduler != null) { + scheduler.shutdown(); + } + if (eventExecutor != null) { + eventExecutor.shutdown(); + } + log.info("ESL连接已关闭"); + } catch (Exception e) { + log.error("关闭ESL连接异常", e); + } + } +} +``` + +#### 3.2.4 事件处理器 + +```java +package com.callcenter.esl; + +import com.callcenter.model.Call; +import com.callcenter.model.CallDirection; +import com.callcenter.model.CallState; +import com.callcenter.service.AcdService; +import com.callcenter.service.CallService; +import com.callcenter.websocket.EventPushService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.freeswitch.esl.client.transport.event.EslEvent; +import org.springframework.stereotype.Component; + +import java.time.LocalDateTime; +import java.util.Map; + +/** + * ESL事件处理器 + */ +@Slf4j +@Component +@RequiredArgsConstructor +public class EslEventHandler { + + private final CallService callService; + private final AcdService acdService; + private final EventPushService eventPushService; + + /** + * 处理ESL事件 + */ + public void handle(EslEvent event) { + String eventName = event.getEventName(); + Map headers = event.getEventHeaders(); + + log.debug("收到事件: {}, UUID: {}", eventName, headers.get("Unique-ID")); + + switch (eventName) { + case "CHANNEL_CREATE": + handleChannelCreate(headers); + break; + case "CHANNEL_ANSWER": + handleChannelAnswer(headers); + break; + case "CHANNEL_BRIDGE": + handleChannelBridge(headers); + break; + case "CHANNEL_UNBRIDGE": + handleChannelUnbridge(headers); + break; + case "CHANNEL_HANGUP": + handleChannelHangup(headers); + break; + case "CHANNEL_HANGUP_COMPLETE": + handleChannelHangupComplete(headers); + break; + case "DTMF": + handleDtmf(headers); + break; + case "RECORD_START": + handleRecordStart(headers); + break; + case "RECORD_STOP": + handleRecordStop(headers); + break; + case "CUSTOM": + handleCustomEvent(headers); + break; + default: + log.trace("未处理的事件类型: {}", eventName); + } + } + + /** + * 处理通道创建事件(新呼叫) + */ + private void handleChannelCreate(Map headers) { + String uuid = headers.get("Unique-ID"); + String direction = headers.get("Call-Direction"); + String callerNumber = headers.get("Caller-Caller-ID-Number"); + String calleeNumber = headers.get("Caller-Destination-Number"); + + log.info("新呼叫: uuid={}, direction={}, caller={}, callee={}", + uuid, direction, callerNumber, calleeNumber); + + // 创建呼叫记录 + Call call = new Call(); + call.setUuid(uuid); + call.setDirection("inbound".equals(direction) ? + CallDirection.INBOUND : CallDirection.OUTBOUND); + call.setCallerNumber(callerNumber); + call.setCalleeNumber(calleeNumber); + call.setState(CallState.RINGING); + call.setCreateTime(LocalDateTime.now()); + + // 获取业务标识(从通道变量) + String businessType = headers.get("variable_business_type"); + String skillGroup = headers.get("variable_skill_group"); + call.setBusinessType(businessType); + call.setSkillGroup(skillGroup); + + callService.saveCall(call); + + // 如果是呼入,触发ACD排队 + if ("inbound".equals(direction)) { + acdService.enqueue(call); + } + + // 推送事件到前端 + eventPushService.pushCallEvent("CALL_RINGING", call); + } + + /** + * 处理通话接听事件 + */ + private void handleChannelAnswer(Map headers) { + String uuid = headers.get("Unique-ID"); + + log.info("通话接听: uuid={}", uuid); + + Call call = callService.getCallByUuid(uuid); + if (call != null) { + call.setState(CallState.ANSWERED); + call.setAnswerTime(LocalDateTime.now()); + callService.updateCall(call); + + // 推送事件 + eventPushService.pushCallEvent("CALL_ANSWERED", call); + } + } + + /** + * 处理通道桥接事件(双方接通) + */ + private void handleChannelBridge(Map headers) { + String uuid = headers.get("Unique-ID"); + String otherUuid = headers.get("Other-Leg-Unique-ID"); + + log.info("通道桥接: uuid={}, otherUuid={}", uuid, otherUuid); + + Call call = callService.getCallByUuid(uuid); + if (call != null) { + call.setState(CallState.BRIDGED); + call.setBridgeUuid(otherUuid); + call.setBridgeTime(LocalDateTime.now()); + callService.updateCall(call); + + // 推送事件 + eventPushService.pushCallEvent("CALL_BRIDGED", call); + } + } + + /** + * 处理取消桥接事件 + */ + private void handleChannelUnbridge(Map headers) { + String uuid = headers.get("Unique-ID"); + + log.info("取消桥接: uuid={}", uuid); + + Call call = callService.getCallByUuid(uuid); + if (call != null) { + call.setState(CallState.UNBRIDGED); + callService.updateCall(call); + + eventPushService.pushCallEvent("CALL_UNBRIDGED", call); + } + } + + /** + * 处理挂断事件 + */ + private void handleChannelHangup(Map headers) { + String uuid = headers.get("Unique-ID"); + String hangupCause = headers.get("Hangup-Cause"); + + log.info("通话挂断: uuid={}, cause={}", uuid, hangupCause); + + Call call = callService.getCallByUuid(uuid); + if (call != null) { + call.setState(CallState.HANGUP); + call.setHangupCause(hangupCause); + call.setHangupTime(LocalDateTime.now()); + + // 计算通话时长 + if (call.getAnswerTime() != null) { + long duration = java.time.Duration.between( + call.getAnswerTime(), call.getHangupTime()).getSeconds(); + call.setDuration(duration); + } + + callService.updateCall(call); + + // 推送事件 + eventPushService.pushCallEvent("CALL_HANGUP", call); + + // 更新坐席状态 + if (call.getAgentId() != null) { + acdService.onCallEnd(call.getAgentId(), call); + } + } + } + + /** + * 处理挂断完成事件(获取完整话单) + */ + private void handleChannelHangupComplete(Map headers) { + String uuid = headers.get("Unique-ID"); + String billsec = headers.get("variable_billsec"); + String duration = headers.get("variable_duration"); + String recordingPath = headers.get("variable_recording_path"); + + log.info("通话结束: uuid={}, billsec={}, recording={}", + uuid, billsec, recordingPath); + + Call call = callService.getCallByUuid(uuid); + if (call != null) { + call.setBillsec(billsec != null ? Long.parseLong(billsec) : 0); + call.setRecordingPath(recordingPath); + callService.updateCall(call); + + // 推送话单 + eventPushService.pushCdr(call); + } + } + + /** + * 处理DTMF按键事件 + */ + private void handleDtmf(Map headers) { + String uuid = headers.get("Unique-ID"); + String digit = headers.get("DTMF-Digit"); + + log.info("DTMF按键: uuid={}, digit={}", uuid, digit); + + // 推送按键事件 + eventPushService.pushDtmf(uuid, digit); + } + + /** + * 处理录音开始事件 + */ + private void handleRecordStart(Map headers) { + String uuid = headers.get("Unique-ID"); + String recordPath = headers.get("Record-File-Path"); + + log.info("开始录音: uuid={}, path={}", uuid, recordPath); + + Call call = callService.getCallByUuid(uuid); + if (call != null) { + call.setRecordingPath(recordPath); + callService.updateCall(call); + } + } + + /** + * 处理录音停止事件 + */ + private void handleRecordStop(Map headers) { + String uuid = headers.get("Unique-ID"); + String recordPath = headers.get("Record-File-Path"); + + log.info("停止录音: uuid={}, path={}", uuid, recordPath); + } + + /** + * 处理自定义事件 + */ + private void handleCustomEvent(Map headers) { + String subclass = headers.get("Event-Subclass"); + log.debug("自定义事件: subclass={}", subclass); + + // 处理特定的自定义事件 + if ("callcenter::info".equals(subclass)) { + // 处理呼叫中心相关事件 + } + } +} +``` + +#### 3.2.5 呼叫服务 + +```java +package com.callcenter.service; + +import com.callcenter.esl.EslConnectionManager; +import com.callcenter.model.*; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Service; + +import java.util.concurrent.TimeUnit; + +/** + * 呼叫服务 + * 提供呼叫控制相关功能 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class CallService { + + private final EslConnectionManager eslManager; + private final RedisTemplate redisTemplate; + + private static final String CALL_KEY_PREFIX = "call:"; + private static final int CALL_EXPIRE_HOURS = 24; + + /** + * 发起外呼 + * @param agentId 坐席ID + * @param callerNumber 主叫号码(外显号码) + * @param calleeNumber 被叫号码 + * @return 呼叫UUID + */ + public String originate(String agentId, String callerNumber, String calleeNumber) { + log.info("发起外呼: agent={}, caller={}, callee={}", + agentId, callerNumber, calleeNumber); + + // 获取坐席分机号 + Agent agent = getAgent(agentId); + if (agent == null || agent.getState() != AgentState.READY) { + throw new RuntimeException("坐席不可用"); + } + + // 构建originate命令 + // originate {变量}呼叫字符串 &应用(参数) + StringBuilder cmd = new StringBuilder(); + cmd.append("{"); + cmd.append("origination_caller_id_number=").append(callerNumber).append(","); + cmd.append("origination_caller_id_name=公司名称").append(","); + cmd.append("agent_id=").append(agentId).append(","); + cmd.append("direction=outbound").append(","); + cmd.append("RECORD_STEREO=true"); + cmd.append("}"); + + // A-leg: 先呼叫坐席分机 + cmd.append("user/").append(agent.getExtension()); + + // B-leg: 坐席接听后呼叫客户 + cmd.append(" &bridge({origination_caller_id_number=") + .append(callerNumber) + .append("}sofia/gateway/carrier_primary/") + .append(calleeNumber) + .append(")"); + + String result = eslManager.sendSyncApiCommand("originate", cmd.toString()); + + if (result.startsWith("+OK")) { + String uuid = result.substring(4).trim(); + log.info("外呼成功: uuid={}", uuid); + return uuid; + } else { + log.error("外呼失败: {}", result); + throw new RuntimeException("外呼失败: " + result); + } + } + + /** + * 接听来电 + */ + public void answer(String uuid) { + log.info("接听来电: uuid={}", uuid); + eslManager.sendSyncApiCommand("uuid_answer", uuid); + } + + /** + * 挂断通话 + */ + public void hangup(String uuid) { + log.info("挂断通话: uuid={}", uuid); + eslManager.sendSyncApiCommand("uuid_kill", uuid); + } + + /** + * 挂断通话(带原因) + */ + public void hangup(String uuid, String cause) { + log.info("挂断通话: uuid={}, cause={}", uuid, cause); + eslManager.sendSyncApiCommand("uuid_kill", uuid + " " + cause); + } + + /** + * 保持通话 + */ + public void hold(String uuid) { + log.info("保持通话: uuid={}", uuid); + eslManager.sendSyncApiCommand("uuid_hold", uuid); + } + + /** + * 取回保持 + */ + public void unhold(String uuid) { + log.info("取回通话: uuid={}", uuid); + eslManager.sendSyncApiCommand("uuid_hold", "off " + uuid); + } + + /** + * 静音 + */ + public void mute(String uuid) { + log.info("静音: uuid={}", uuid); + eslManager.sendSyncApiCommand("uuid_audio", uuid + " start mute"); + } + + /** + * 取消静音 + */ + public void unmute(String uuid) { + log.info("取消静音: uuid={}", uuid); + eslManager.sendSyncApiCommand("uuid_audio", uuid + " stop"); + } + + /** + * 盲转(直接转接) + */ + public void blindTransfer(String uuid, String destination) { + log.info("盲转: uuid={}, dest={}", uuid, destination); + eslManager.sendSyncApiCommand("uuid_transfer", uuid + " " + destination); + } + + /** + * 咨询转(先咨询再转接) + */ + public String consultTransfer(String uuid, String destination) { + log.info("咨询转: uuid={}, dest={}", uuid, destination); + + // 先保持当前通话 + hold(uuid); + + // 发起咨询呼叫 + String consultCmd = "{origination_uuid=consult_" + uuid + "}user/" + destination; + String result = eslManager.sendSyncApiCommand("originate", + consultCmd + " &park()"); + + if (result.startsWith("+OK")) { + return result.substring(4).trim(); + } + throw new RuntimeException("咨询转失败"); + } + + /** + * 完成咨询转接 + */ + public void completeTransfer(String originalUuid, String consultUuid) { + log.info("完成咨询转: original={}, consult={}", originalUuid, consultUuid); + eslManager.sendSyncApiCommand("uuid_bridge", originalUuid + " " + consultUuid); + } + + /** + * 三方通话 + */ + public void conference(String uuid1, String uuid2, String conferenceName) { + log.info("三方通话: uuid1={}, uuid2={}, conf={}", uuid1, uuid2, conferenceName); + + // 将两个通道加入会议 + eslManager.sendSyncApiCommand("uuid_transfer", + uuid1 + " conference:" + conferenceName + " inline"); + eslManager.sendSyncApiCommand("uuid_transfer", + uuid2 + " conference:" + conferenceName + " inline"); + } + + /** + * 播放语音 + */ + public void playback(String uuid, String filePath) { + log.info("播放语音: uuid={}, file={}", uuid, filePath); + eslManager.sendSyncApiCommand("uuid_broadcast", + uuid + " " + filePath + " both"); + } + + /** + * 停止播放 + */ + public void stopPlayback(String uuid) { + log.info("停止播放: uuid={}", uuid); + eslManager.sendSyncApiCommand("uuid_break", uuid); + } + + /** + * 开始录音 + */ + public void startRecording(String uuid, String filePath) { + log.info("开始录音: uuid={}, file={}", uuid, filePath); + eslManager.sendSyncApiCommand("uuid_record", uuid + " start " + filePath); + } + + /** + * 停止录音 + */ + public void stopRecording(String uuid, String filePath) { + log.info("停止录音: uuid={}", uuid); + eslManager.sendSyncApiCommand("uuid_record", uuid + " stop " + filePath); + } + + /** + * 桥接两个通道 + */ + public void bridge(String uuid1, String uuid2) { + log.info("桥接通道: uuid1={}, uuid2={}", uuid1, uuid2); + eslManager.sendSyncApiCommand("uuid_bridge", uuid1 + " " + uuid2); + } + + /** + * 设置通道变量 + */ + public void setVariable(String uuid, String name, String value) { + eslManager.sendSyncApiCommand("uuid_setvar", + uuid + " " + name + " " + value); + } + + /** + * 获取通道变量 + */ + public String getVariable(String uuid, String name) { + return eslManager.sendSyncApiCommand("uuid_getvar", uuid + " " + name); + } + + // ============ 呼叫记录管理 ============ + + /** + * 保存呼叫记录 + */ + public void saveCall(Call call) { + String key = CALL_KEY_PREFIX + call.getUuid(); + redisTemplate.opsForValue().set(key, call, CALL_EXPIRE_HOURS, TimeUnit.HOURS); + } + + /** + * 获取呼叫记录 + */ + public Call getCallByUuid(String uuid) { + String key = CALL_KEY_PREFIX + uuid; + return (Call) redisTemplate.opsForValue().get(key); + } + + /** + * 更新呼叫记录 + */ + public void updateCall(Call call) { + saveCall(call); + } + + /** + * 获取坐席信息 + */ + private Agent getAgent(String agentId) { + // TODO: 从坐席服务获取 + return null; + } +} +``` + +#### 3.2.6 ACD话务分配服务 + +```java +package com.callcenter.service; + +import com.callcenter.esl.EslConnectionManager; +import com.callcenter.model.*; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Service; + +import java.time.LocalDateTime; +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + +/** + * ACD话务分配服务 + * 实现多种分配策略:历史服务优先、最长空闲优先、轮询 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class AcdService { + + private final EslConnectionManager eslManager; + private final RedisTemplate redisTemplate; + private final AgentService agentService; + private final CallService callService; + + // 队列Key前缀 + private static final String QUEUE_KEY_PREFIX = "queue:"; + // 坐席最后服务客户映射 + private static final String AGENT_CUSTOMER_MAP_KEY = "agent:customer:map"; + // 坐席最后空闲时间 + private static final String AGENT_IDLE_TIME_KEY = "agent:idle:time:"; + // 轮询索引 + private final Map roundRobinIndex = new ConcurrentHashMap<>(); + + /** + * 呼叫入队 + */ + public void enqueue(Call call) { + String skillGroup = call.getSkillGroup(); + String queueKey = QUEUE_KEY_PREFIX + skillGroup; + + QueueItem item = new QueueItem(); + item.setCallUuid(call.getUuid()); + item.setCallerNumber(call.getCallerNumber()); + item.setSkillGroup(skillGroup); + item.setEnqueueTime(LocalDateTime.now()); + item.setPriority(calculatePriority(call)); + + // 使用SortedSet,按优先级和入队时间排序 + double score = item.getPriority() * 1000000000L + + System.currentTimeMillis() / 1000; + redisTemplate.opsForZSet().add(queueKey, item, score); + + log.info("呼叫入队: uuid={}, queue={}, priority={}", + call.getUuid(), skillGroup, item.getPriority()); + + // 尝试立即分配 + tryAssign(skillGroup); + } + + /** + * 计算优先级(数字越小优先级越高) + */ + private int calculatePriority(Call call) { + // VIP客户优先级高 + if ("VIP".equals(call.getCustomerLevel())) { + return 1; + } + // 投诉优先 + if ("complaint".equals(call.getBusinessType())) { + return 2; + } + // 普通客户 + return 5; + } + + /** + * 尝试分配队列中的呼叫 + */ + public void tryAssign(String skillGroup) { + String queueKey = QUEUE_KEY_PREFIX + skillGroup; + + // 获取可用坐席 + List availableAgents = agentService.getAvailableAgents(skillGroup); + if (availableAgents.isEmpty()) { + log.debug("技能组{}无可用坐席", skillGroup); + return; + } + + // 获取队列中的呼叫 + Set queueItems = redisTemplate.opsForZSet().range(queueKey, 0, 0); + if (queueItems == null || queueItems.isEmpty()) { + log.debug("技能组{}队列为空", skillGroup); + return; + } + + QueueItem item = (QueueItem) queueItems.iterator().next(); + Call call = callService.getCallByUuid(item.getCallUuid()); + + if (call == null || call.getState() == CallState.HANGUP) { + // 呼叫已结束,移除队列 + redisTemplate.opsForZSet().remove(queueKey, item); + tryAssign(skillGroup); // 继续处理下一个 + return; + } + + // 选择坐席 + Agent selectedAgent = selectAgent(availableAgents, call); + + if (selectedAgent != null) { + // 从队列移除 + redisTemplate.opsForZSet().remove(queueKey, item); + + // 分配呼叫 + assignCallToAgent(call, selectedAgent); + } + } + + /** + * 选择坐席(多策略) + */ + private Agent selectAgent(List agents, Call call) { + if (agents.isEmpty()) { + return null; + } + + // 策略1: 历史服务优先 + Agent lastAgent = findLastServingAgent(call.getCallerNumber(), agents); + if (lastAgent != null) { + log.info("历史服务优先: 客户{}分配给上次服务坐席{}", + call.getCallerNumber(), lastAgent.getId()); + return lastAgent; + } + + // 策略2: 最长空闲优先 + Agent longestIdleAgent = findLongestIdleAgent(agents); + if (longestIdleAgent != null) { + log.info("最长空闲优先: 选择坐席{}", longestIdleAgent.getId()); + return longestIdleAgent; + } + + // 策略3: 轮询 + Agent roundRobinAgent = selectByRoundRobin(agents, call.getSkillGroup()); + log.info("轮询分配: 选择坐席{}", roundRobinAgent.getId()); + return roundRobinAgent; + } + + /** + * 查找上次服务该客户的坐席 + */ + private Agent findLastServingAgent(String customerNumber, List agents) { + String lastAgentId = (String) redisTemplate.opsForHash() + .get(AGENT_CUSTOMER_MAP_KEY, customerNumber); + + if (lastAgentId != null) { + return agents.stream() + .filter(a -> a.getId().equals(lastAgentId)) + .findFirst() + .orElse(null); + } + return null; + } + + /** + * 查找空闲时间最长的坐席 + */ + private Agent findLongestIdleAgent(List agents) { + return agents.stream() + .max(Comparator.comparing(agent -> { + String key = AGENT_IDLE_TIME_KEY + agent.getId(); + Long idleTime = (Long) redisTemplate.opsForValue().get(key); + return idleTime != null ? idleTime : 0L; + })) + .orElse(null); + } + + /** + * 轮询选择坐席 + */ + private Agent selectByRoundRobin(List agents, String skillGroup) { + int currentIndex = roundRobinIndex.getOrDefault(skillGroup, 0); + int nextIndex = (currentIndex + 1) % agents.size(); + roundRobinIndex.put(skillGroup, nextIndex); + return agents.get(currentIndex); + } + + /** + * 分配呼叫给坐席 + */ + private void assignCallToAgent(Call call, Agent agent) { + log.info("分配呼叫: uuid={} -> agent={}", call.getUuid(), agent.getId()); + + // 更新坐席状态 + agentService.updateAgentState(agent.getId(), AgentState.RINGING); + + // 更新呼叫信息 + call.setAgentId(agent.getId()); + call.setAgentExtension(agent.getExtension()); + callService.updateCall(call); + + // 将呼叫转接到坐席分机 + // 方式1: 使用uuid_transfer + eslManager.sendSyncApiCommand("uuid_transfer", + call.getUuid() + " " + agent.getExtension() + " XML default"); + + // 方式2: 使用originate + bridge(更灵活) + // String bridgeCmd = String.format( + // "{origination_uuid=%s,agent_id=%s}user/%s", + // UUID.randomUUID(), agent.getId(), agent.getExtension()); + // eslManager.sendSyncApiCommand("uuid_broadcast", + // call.getUuid() + " bridge::" + bridgeCmd + " both"); + + // 记录坐席-客户关系(用于历史服务优先) + redisTemplate.opsForHash().put(AGENT_CUSTOMER_MAP_KEY, + call.getCallerNumber(), agent.getId()); + } + + /** + * 通话结束处理 + */ + public void onCallEnd(String agentId, Call call) { + log.info("通话结束: agent={}, call={}", agentId, call.getUuid()); + + // 更新坐席状态为后处理 + agentService.updateAgentState(agentId, AgentState.WRAP_UP); + + // 设置后处理超时(30秒后自动置闲) + // 由定时任务处理 + } + + /** + * 坐席置闲时记录空闲时间 + */ + public void onAgentReady(String agentId, String skillGroup) { + String key = AGENT_IDLE_TIME_KEY + agentId; + redisTemplate.opsForValue().set(key, System.currentTimeMillis()); + + // 尝试分配队列中的呼叫 + tryAssign(skillGroup); + } + + /** + * 定时处理队列 + */ + @Scheduled(fixedDelay = 1000) + public void processQueues() { + // 获取所有技能组 + Set skillGroups = agentService.getAllSkillGroups(); + for (String skillGroup : skillGroups) { + tryAssign(skillGroup); + } + } + + /** + * 获取队列状态 + */ + public QueueStatus getQueueStatus(String skillGroup) { + String queueKey = QUEUE_KEY_PREFIX + skillGroup; + + QueueStatus status = new QueueStatus(); + status.setSkillGroup(skillGroup); + status.setWaitingCount(redisTemplate.opsForZSet().size(queueKey)); + status.setAvailableAgents(agentService.getAvailableAgents(skillGroup).size()); + + // 计算最长等待时间 + Set items = redisTemplate.opsForZSet().range(queueKey, 0, 0); + if (items != null && !items.isEmpty()) { + QueueItem firstItem = (QueueItem) items.iterator().next(); + long waitSeconds = java.time.Duration.between( + firstItem.getEnqueueTime(), LocalDateTime.now()).getSeconds(); + status.setLongestWaitTime(waitSeconds); + } + + return status; + } + + /** + * 溢出处理 + * 当技能组无可用坐席且等待时间超过阈值时,溢出到其他技能组 + */ + @Scheduled(fixedDelay = 5000) + public void handleOverflow() { + // 获取溢出配置 + Map overflowConfig = getOverflowConfig(); + + for (Map.Entry entry : overflowConfig.entrySet()) { + String sourceGroup = entry.getKey(); + String targetGroup = entry.getValue(); + + String queueKey = QUEUE_KEY_PREFIX + sourceGroup; + Set items = redisTemplate.opsForZSet().range(queueKey, 0, -1); + + if (items == null || items.isEmpty()) { + continue; + } + + // 检查是否需要溢出 + List sourceAgents = agentService.getAvailableAgents(sourceGroup); + List targetAgents = agentService.getAvailableAgents(targetGroup); + + if (sourceAgents.isEmpty() && !targetAgents.isEmpty()) { + for (Object obj : items) { + QueueItem item = (QueueItem) obj; + long waitSeconds = java.time.Duration.between( + item.getEnqueueTime(), LocalDateTime.now()).getSeconds(); + + // 等待超过60秒,溢出 + if (waitSeconds > 60) { + log.info("溢出处理: uuid={}, {}->{}", + item.getCallUuid(), sourceGroup, targetGroup); + + // 移出原队列 + redisTemplate.opsForZSet().remove(queueKey, item); + + // 加入目标队列 + item.setSkillGroup(targetGroup); + String targetQueueKey = QUEUE_KEY_PREFIX + targetGroup; + double score = item.getPriority() * 1000000000L + + System.currentTimeMillis() / 1000; + redisTemplate.opsForZSet().add(targetQueueKey, item, score); + + // 尝试分配 + tryAssign(targetGroup); + } + } + } + } + } + + private Map getOverflowConfig() { + // 配置:源技能组 -> 目标技能组 + Map config = new HashMap<>(); + config.put("rescue_group", "default_group"); + config.put("housekeeping_group", "default_group"); + config.put("driver_group", "default_group"); + return config; + } +} +``` + +#### 3.2.7 坐席服务 + +```java +package com.callcenter.service; + +import com.callcenter.esl.EslConnectionManager; +import com.callcenter.model.*; +import com.callcenter.websocket.EventPushService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Service; + +import java.time.LocalDateTime; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 坐席服务 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class AgentService { + + private final RedisTemplate redisTemplate; + private final EslConnectionManager eslManager; + private final EventPushService eventPushService; + private final AcdService acdService; + + private static final String AGENT_KEY_PREFIX = "agent:"; + private static final String AGENT_SET_KEY = "agents:all"; + private static final String SKILL_GROUP_AGENTS_KEY = "skillgroup:agents:"; + + /** + * 坐席签入 + */ + public void signIn(String agentId, String extension, List skillGroups) { + log.info("坐席签入: agentId={}, extension={}, skills={}", + agentId, extension, skillGroups); + + // 检查分机是否注册 + String regStatus = eslManager.sendSyncApiCommand("sofia_contact", + "internal/" + extension + "@${domain}"); + if (regStatus.contains("error")) { + throw new RuntimeException("分机未注册: " + extension); + } + + Agent agent = new Agent(); + agent.setId(agentId); + agent.setExtension(extension); + agent.setSkillGroups(skillGroups); + agent.setState(AgentState.NOT_READY); + agent.setSignInTime(LocalDateTime.now()); + + // 保存坐席信息 + String key = AGENT_KEY_PREFIX + agentId; + redisTemplate.opsForValue().set(key, agent); + + // 加入坐席集合 + redisTemplate.opsForSet().add(AGENT_SET_KEY, agentId); + + // 加入技能组 + for (String skillGroup : skillGroups) { + redisTemplate.opsForSet().add(SKILL_GROUP_AGENTS_KEY + skillGroup, agentId); + } + + // 推送状态变更 + eventPushService.pushAgentState(agent); + } + + /** + * 坐席签出 + */ + public void signOut(String agentId) { + log.info("坐席签出: agentId={}", agentId); + + Agent agent = getAgent(agentId); + if (agent == null) { + return; + } + + // 检查是否在通话中 + if (agent.getState() == AgentState.BUSY || + agent.getState() == AgentState.RINGING) { + throw new RuntimeException("坐席正在通话中,无法签出"); + } + + // 从技能组移除 + for (String skillGroup : agent.getSkillGroups()) { + redisTemplate.opsForSet().remove(SKILL_GROUP_AGENTS_KEY + skillGroup, agentId); + } + + // 从坐席集合移除 + redisTemplate.opsForSet().remove(AGENT_SET_KEY, agentId); + + // 删除坐席信息 + String key = AGENT_KEY_PREFIX + agentId; + redisTemplate.delete(key); + + // 推送签出事件 + agent.setState(AgentState.OFFLINE); + eventPushService.pushAgentState(agent); + } + + /** + * 坐席置闲 + */ + public void ready(String agentId) { + log.info("坐席置闲: agentId={}", agentId); + + Agent agent = getAgent(agentId); + if (agent == null) { + throw new RuntimeException("坐席不存在"); + } + + if (agent.getState() == AgentState.BUSY) { + throw new RuntimeException("坐席正在通话中"); + } + + updateAgentState(agentId, AgentState.READY); + + // 通知ACD有坐席可用 + for (String skillGroup : agent.getSkillGroups()) { + acdService.onAgentReady(agentId, skillGroup); + } + } + + /** + * 坐席置忙 + */ + public void notReady(String agentId, String reason) { + log.info("坐席置忙: agentId={}, reason={}", agentId, reason); + + Agent agent = getAgent(agentId); + if (agent == null) { + throw new RuntimeException("坐席不存在"); + } + + if (agent.getState() == AgentState.BUSY) { + throw new RuntimeException("坐席正在通话中"); + } + + agent.setNotReadyReason(reason); + updateAgentState(agentId, AgentState.NOT_READY); + } + + /** + * 坐席小休 + */ + public void pause(String agentId, String reason) { + log.info("坐席小休: agentId={}, reason={}", agentId, reason); + + Agent agent = getAgent(agentId); + if (agent == null) { + throw new RuntimeException("坐席不存在"); + } + + if (agent.getState() == AgentState.BUSY) { + throw new RuntimeException("坐席正在通话中"); + } + + agent.setPauseReason(reason); + updateAgentState(agentId, AgentState.PAUSED); + } + + /** + * 更新坐席状态 + */ + public void updateAgentState(String agentId, AgentState newState) { + Agent agent = getAgent(agentId); + if (agent == null) { + return; + } + + AgentState oldState = agent.getState(); + agent.setState(newState); + agent.setStateTime(LocalDateTime.now()); + + // 保存 + String key = AGENT_KEY_PREFIX + agentId; + redisTemplate.opsForValue().set(key, agent); + + log.info("坐席状态变更: agent={}, {} -> {}", agentId, oldState, newState); + + // 推送状态变更 + eventPushService.pushAgentState(agent); + } + + /** + * 获取坐席信息 + */ + public Agent getAgent(String agentId) { + String key = AGENT_KEY_PREFIX + agentId; + return (Agent) redisTemplate.opsForValue().get(key); + } + + /** + * 获取技能组可用坐席 + */ + public List getAvailableAgents(String skillGroup) { + Set agentIds = redisTemplate.opsForSet() + .members(SKILL_GROUP_AGENTS_KEY + skillGroup); + + if (agentIds == null || agentIds.isEmpty()) { + return Collections.emptyList(); + } + + return agentIds.stream() + .map(id -> getAgent((String) id)) + .filter(agent -> agent != null && agent.getState() == AgentState.READY) + .collect(Collectors.toList()); + } + + /** + * 获取所有技能组 + */ + public Set getAllSkillGroups() { + Set keys = redisTemplate.keys(SKILL_GROUP_AGENTS_KEY + "*"); + if (keys == null) { + return Collections.emptySet(); + } + return keys.stream() + .map(key -> key.replace(SKILL_GROUP_AGENTS_KEY, "")) + .collect(Collectors.toSet()); + } + + /** + * 获取所有坐席状态(监控大屏) + */ + public List getAllAgents() { + Set agentIds = redisTemplate.opsForSet().members(AGENT_SET_KEY); + if (agentIds == null) { + return Collections.emptyList(); + } + return agentIds.stream() + .map(id -> getAgent((String) id)) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + } + + /** + * 获取坐席状态统计 + */ + public Map getAgentStateStats() { + return getAllAgents().stream() + .collect(Collectors.groupingBy(Agent::getState, Collectors.counting())); + } +} +``` + +### 3.3 Go ESL开发 + +如果您的团队更熟悉Go语言,以下是Go版本的ESL开发示例: + +#### 3.3.1 项目结构 + +``` +callcenter-cti-go/ +├── go.mod +├── go.sum +├── main.go +├── config/ +│ └── config.go +├── esl/ +│ ├── client.go # ESL客户端 +│ ├── event.go # 事件定义 +│ └── handler.go # 事件处理器 +├── service/ +│ ├── agent.go # 坐席服务 +│ ├── call.go # 呼叫服务 +│ └── acd.go # ACD服务 +├── model/ +│ └── models.go # 数据模型 +├── api/ +│ ├── router.go # 路由 +│ ├── agent_handler.go # 坐席API +│ └── call_handler.go # 呼叫API +└── websocket/ + └── hub.go # WebSocket推送 +``` + +#### 3.3.2 ESL客户端 + +```go +// esl/client.go +package esl + +import ( + "bufio" + "fmt" + "log" + "net" + "net/textproto" + "strconv" + "strings" + "sync" + "time" +) + +// ESL客户端 +type Client struct { + conn net.Conn + reader *textproto.Reader + writer *bufio.Writer + mu sync.Mutex + connected bool + password string + eventChan chan *Event + handlers []EventHandler + reconnect bool +} + +// 事件处理器接口 +type EventHandler interface { + Handle(event *Event) +} + +// 创建ESL客户端 +func NewClient(host string, port int, password string) (*Client, error) { + client := &Client{ + password: password, + eventChan: make(chan *Event, 1000), + handlers: make([]EventHandler, 0), + reconnect: true, + } + + err := client.connect(host, port) + if err != nil { + return nil, err + } + + // 启动事件读取协程 + go client.readLoop() + + // 启动事件分发协程 + go client.dispatchLoop() + + return client, nil +} + +// 连接FreeSWITCH +func (c *Client) connect(host string, port int) error { + addr := fmt.Sprintf("%s:%d", host, port) + + conn, err := net.DialTimeout("tcp", addr, 10*time.Second) + if err != nil { + return fmt.Errorf("连接失败: %v", err) + } + + c.conn = conn + c.reader = textproto.NewReader(bufio.NewReader(conn)) + c.writer = bufio.NewWriter(conn) + + // 读取欢迎消息 + _, err = c.readMessage() + if err != nil { + return err + } + + // 认证 + err = c.auth() + if err != nil { + return err + } + + c.connected = true + log.Println("ESL连接成功") + + return nil +} + +// 认证 +func (c *Client) auth() error { + _, err := c.sendCommand(fmt.Sprintf("auth %s", c.password)) + if err != nil { + return fmt.Errorf("认证失败: %v", err) + } + return nil +} + +// 发送命令 +func (c *Client) sendCommand(command string) (*Message, error) { + c.mu.Lock() + defer c.mu.Unlock() + + _, err := c.writer.WriteString(command + "\n\n") + if err != nil { + return nil, err + } + c.writer.Flush() + + return c.readMessage() +} + +// 发送API命令 +func (c *Client) API(command string, args string) (string, error) { + cmd := fmt.Sprintf("api %s %s", command, args) + msg, err := c.sendCommand(cmd) + if err != nil { + return "", err + } + return msg.Body, nil +} + +// 发送后台API命令 +func (c *Client) BgAPI(command string, args string) (string, error) { + cmd := fmt.Sprintf("bgapi %s %s", command, args) + msg, err := c.sendCommand(cmd) + if err != nil { + return "", err + } + return msg.GetHeader("Job-UUID"), nil +} + +// 订阅事件 +func (c *Client) Subscribe(events ...string) error { + eventStr := strings.Join(events, " ") + _, err := c.sendCommand(fmt.Sprintf("event plain %s", eventStr)) + return err +} + +// 订阅所有事件 +func (c *Client) SubscribeAll() error { + _, err := c.sendCommand("event plain ALL") + return err +} + +// 读取消息 +func (c *Client) readMessage() (*Message, error) { + msg := &Message{ + Headers: make(map[string]string), + } + + // 读取headers + for { + line, err := c.reader.ReadLine() + if err != nil { + return nil, err + } + + if line == "" { + break + } + + parts := strings.SplitN(line, ": ", 2) + if len(parts) == 2 { + msg.Headers[parts[0]] = parts[1] + } + } + + // 读取body + if lenStr := msg.GetHeader("Content-Length"); lenStr != "" { + length, _ := strconv.Atoi(lenStr) + if length > 0 { + body := make([]byte, length) + _, err := c.reader.R.Read(body) + if err != nil { + return nil, err + } + msg.Body = string(body) + } + } + + return msg, nil +} + +// 事件读取循环 +func (c *Client) readLoop() { + for c.connected { + msg, err := c.readMessage() + if err != nil { + log.Printf("读取消息错误: %v", err) + c.connected = false + if c.reconnect { + c.tryReconnect() + } + return + } + + contentType := msg.GetHeader("Content-Type") + if contentType == "text/event-plain" { + event := parseEvent(msg) + c.eventChan <- event + } + } +} + +// 事件分发循环 +func (c *Client) dispatchLoop() { + for event := range c.eventChan { + for _, handler := range c.handlers { + go handler.Handle(event) + } + } +} + +// 尝试重连 +func (c *Client) tryReconnect() { + for i := 0; i < 10; i++ { + time.Sleep(5 * time.Second) + log.Printf("尝试重连ESL (第%d次)...", i+1) + + // TODO: 重新连接 + } +} + +// 添加事件处理器 +func (c *Client) AddHandler(handler EventHandler) { + c.handlers = append(c.handlers, handler) +} + +// 关闭连接 +func (c *Client) Close() { + c.connected = false + c.reconnect = false + if c.conn != nil { + c.conn.Close() + } + close(c.eventChan) +} + +// 消息结构 +type Message struct { + Headers map[string]string + Body string +} + +func (m *Message) GetHeader(name string) string { + if v, ok := m.Headers[name]; ok { + return v + } + return "" +} + +// 解析事件 +func parseEvent(msg *Message) *Event { + event := &Event{ + Headers: make(map[string]string), + } + + // 解析body中的headers + lines := strings.Split(msg.Body, "\n") + for _, line := range lines { + parts := strings.SplitN(line, ": ", 2) + if len(parts) == 2 { + // URL解码 + value := strings.ReplaceAll(parts[1], "%20", " ") + event.Headers[parts[0]] = value + } + } + + event.Name = event.GetHeader("Event-Name") + event.UUID = event.GetHeader("Unique-ID") + + return event +} +``` + +#### 3.3.3 事件定义 + +```go +// esl/event.go +package esl + +// 事件结构 +type Event struct { + Name string + UUID string + Headers map[string]string +} + +func (e *Event) GetHeader(name string) string { + if v, ok := e.Headers[name]; ok { + return v + } + return "" +} + +// 事件名称常量 +const ( + EventChannelCreate = "CHANNEL_CREATE" + EventChannelAnswer = "CHANNEL_ANSWER" + EventChannelBridge = "CHANNEL_BRIDGE" + EventChannelUnbridge = "CHANNEL_UNBRIDGE" + EventChannelHangup = "CHANNEL_HANGUP" + EventChannelHangupComplete = "CHANNEL_HANGUP_COMPLETE" + EventChannelState = "CHANNEL_STATE" + EventDTMF = "DTMF" + EventRecordStart = "RECORD_START" + EventRecordStop = "RECORD_STOP" + EventCustom = "CUSTOM" +) +``` + +#### 3.3.4 事件处理器 + +```go +// esl/handler.go +package esl + +import ( + "callcenter/service" + "log" +) + +// 呼叫中心事件处理器 +type CallCenterHandler struct { + callService *service.CallService + agentService *service.AgentService + acdService *service.AcdService +} + +func NewCallCenterHandler( + callService *service.CallService, + agentService *service.AgentService, + acdService *service.AcdService, +) *CallCenterHandler { + return &CallCenterHandler{ + callService: callService, + agentService: agentService, + acdService: acdService, + } +} + +func (h *CallCenterHandler) Handle(event *Event) { + switch event.Name { + case EventChannelCreate: + h.handleChannelCreate(event) + case EventChannelAnswer: + h.handleChannelAnswer(event) + case EventChannelBridge: + h.handleChannelBridge(event) + case EventChannelHangup: + h.handleChannelHangup(event) + case EventChannelHangupComplete: + h.handleChannelHangupComplete(event) + case EventDTMF: + h.handleDTMF(event) + } +} + +func (h *CallCenterHandler) handleChannelCreate(event *Event) { + uuid := event.UUID + direction := event.GetHeader("Call-Direction") + callerNumber := event.GetHeader("Caller-Caller-ID-Number") + calleeNumber := event.GetHeader("Caller-Destination-Number") + + log.Printf("新呼叫: uuid=%s, direction=%s, caller=%s, callee=%s", + uuid, direction, callerNumber, calleeNumber) + + // 创建呼叫记录 + call := &service.Call{ + UUID: uuid, + Direction: direction, + CallerNumber: callerNumber, + CalleeNumber: calleeNumber, + State: "ringing", + } + + h.callService.SaveCall(call) + + // 呼入排队 + if direction == "inbound" { + skillGroup := event.GetHeader("variable_skill_group") + call.SkillGroup = skillGroup + h.acdService.Enqueue(call) + } +} + +func (h *CallCenterHandler) handleChannelAnswer(event *Event) { + uuid := event.UUID + log.Printf("通话接听: uuid=%s", uuid) + + call := h.callService.GetCall(uuid) + if call != nil { + call.State = "answered" + h.callService.UpdateCall(call) + } +} + +func (h *CallCenterHandler) handleChannelBridge(event *Event) { + uuid := event.UUID + otherUUID := event.GetHeader("Other-Leg-Unique-ID") + log.Printf("通道桥接: uuid=%s, other=%s", uuid, otherUUID) + + call := h.callService.GetCall(uuid) + if call != nil { + call.State = "bridged" + call.BridgeUUID = otherUUID + h.callService.UpdateCall(call) + } +} + +func (h *CallCenterHandler) handleChannelHangup(event *Event) { + uuid := event.UUID + hangupCause := event.GetHeader("Hangup-Cause") + log.Printf("通话挂断: uuid=%s, cause=%s", uuid, hangupCause) + + call := h.callService.GetCall(uuid) + if call != nil { + call.State = "hangup" + call.HangupCause = hangupCause + h.callService.UpdateCall(call) + + // 更新坐席状态 + if call.AgentID != "" { + h.acdService.OnCallEnd(call.AgentID, call) + } + } +} + +func (h *CallCenterHandler) handleChannelHangupComplete(event *Event) { + uuid := event.UUID + billsec := event.GetHeader("variable_billsec") + recordingPath := event.GetHeader("variable_recording_path") + + log.Printf("通话结束: uuid=%s, billsec=%s, recording=%s", + uuid, billsec, recordingPath) + + call := h.callService.GetCall(uuid) + if call != nil { + call.Billsec = billsec + call.RecordingPath = recordingPath + h.callService.UpdateCall(call) + } +} + +func (h *CallCenterHandler) handleDTMF(event *Event) { + uuid := event.UUID + digit := event.GetHeader("DTMF-Digit") + log.Printf("DTMF按键: uuid=%s, digit=%s", uuid, digit) +} +``` + +--- + +## 第四部分 呼叫中心场景开发实践 + +### 4.1 预测式外呼实现 + +```java +package com.callcenter.service; + +import com.callcenter.esl.EslConnectionManager; +import com.callcenter.model.*; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Service; + +import java.util.*; +import java.util.concurrent.*; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * 预测式外呼服务 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class PredictiveDialerService { + + private final EslConnectionManager eslManager; + private final AgentService agentService; + private final CallService callService; + + // 外呼任务 + private final Map activeTasks = new ConcurrentHashMap<>(); + // 外呼线程池 + private final ExecutorService dialerExecutor = Executors.newFixedThreadPool(10); + + /** + * 创建外呼任务 + */ + public String createTask(DialTaskRequest request) { + String taskId = UUID.randomUUID().toString(); + + DialTask task = new DialTask(); + task.setId(taskId); + task.setName(request.getName()); + task.setSkillGroup(request.getSkillGroup()); + task.setCallerIdNumber(request.getCallerIdNumber()); + task.setNumbers(new LinkedBlockingQueue<>(request.getNumbers())); + task.setMaxConcurrent(request.getMaxConcurrent()); + task.setState(TaskState.CREATED); + task.setStats(new DialStats()); + + activeTasks.put(taskId, task); + log.info("创建外呼任务: taskId={}, name={}, numbers={}", + taskId, request.getName(), request.getNumbers().size()); + + return taskId; + } + + /** + * 启动任务 + */ + public void startTask(String taskId) { + DialTask task = activeTasks.get(taskId); + if (task == null) { + throw new RuntimeException("任务不存在"); + } + + task.setState(TaskState.RUNNING); + log.info("启动外呼任务: {}", taskId); + + // 启动外呼循环 + dialerExecutor.submit(() -> dialLoop(task)); + } + + /** + * 暂停任务 + */ + public void pauseTask(String taskId) { + DialTask task = activeTasks.get(taskId); + if (task != null) { + task.setState(TaskState.PAUSED); + log.info("暂停外呼任务: {}", taskId); + } + } + + /** + * 恢复任务 + */ + public void resumeTask(String taskId) { + DialTask task = activeTasks.get(taskId); + if (task != null && task.getState() == TaskState.PAUSED) { + task.setState(TaskState.RUNNING); + dialerExecutor.submit(() -> dialLoop(task)); + log.info("恢复外呼任务: {}", taskId); + } + } + + /** + * 停止任务 + */ + public void stopTask(String taskId) { + DialTask task = activeTasks.get(taskId); + if (task != null) { + task.setState(TaskState.STOPPED); + log.info("停止外呼任务: {}", taskId); + } + } + + /** + * 外呼循环 + */ + private void dialLoop(DialTask task) { + log.info("开始外呼循环: taskId={}", task.getId()); + + while (task.getState() == TaskState.RUNNING && !task.getNumbers().isEmpty()) { + try { + // 计算应该发起的呼叫数 + int dialCount = calculateDialCount(task); + + if (dialCount <= 0) { + // 没有空闲坐席,等待 + Thread.sleep(1000); + continue; + } + + // 发起外呼 + for (int i = 0; i < dialCount; i++) { + String number = task.getNumbers().poll(); + if (number == null) { + break; + } + + dial(task, number); + } + + // 短暂等待,控制拨打速率 + Thread.sleep(500); + + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + break; + } catch (Exception e) { + log.error("外呼异常: {}", e.getMessage(), e); + } + } + + // 任务完成 + if (task.getNumbers().isEmpty()) { + task.setState(TaskState.COMPLETED); + } + + log.info("外呼循环结束: taskId={}, state={}", task.getId(), task.getState()); + } + + /** + * 计算应该发起的呼叫数(预测算法) + */ + private int calculateDialCount(DialTask task) { + // 获取可用坐席数 + List availableAgents = agentService.getAvailableAgents(task.getSkillGroup()); + int availableAgentCount = availableAgents.size(); + + if (availableAgentCount == 0) { + return 0; + } + + // 当前正在拨打的数量 + int currentDialing = task.getStats().getCurrentDialing().get(); + + // 历史接通率(动态计算) + double connectRate = calculateConnectRate(task); + + // 预测式算法: + // 目标:让坐席接到电话时,刚好有客户接通 + // 预测需要拨打数 = 空闲坐席数 / 接通率 * 系数 + double factor = 1.2; // 超拨系数,避免坐席空闲 + int predictedDial = (int) Math.ceil(availableAgentCount / connectRate * factor); + + // 限制最大并发 + int maxAllowed = task.getMaxConcurrent() - currentDialing; + + return Math.min(predictedDial, maxAllowed); + } + + /** + * 计算接通率 + */ + private double calculateConnectRate(DialTask task) { + DialStats stats = task.getStats(); + int total = stats.getTotalDialed().get(); + int connected = stats.getConnected().get(); + + if (total < 10) { + // 样本太少,使用默认值 + return 0.3; + } + + double rate = (double) connected / total; + // 限制范围 + return Math.max(0.1, Math.min(0.8, rate)); + } + + /** + * 发起单个外呼 + */ + private void dial(DialTask task, String number) { + log.info("外呼: taskId={}, number={}", task.getId(), number); + + task.getStats().getTotalDialed().incrementAndGet(); + task.getStats().getCurrentDialing().incrementAndGet(); + + try { + // 构建originate命令 + // 先拨打客户,客户接听后转到队列等待坐席 + StringBuilder cmd = new StringBuilder(); + cmd.append("{"); + cmd.append("origination_caller_id_number=").append(task.getCallerIdNumber()).append(","); + cmd.append("task_id=").append(task.getId()).append(","); + cmd.append("dial_number=").append(number).append(","); + cmd.append("dialer_mode=predictive"); + cmd.append("}"); + + // 通过网关外呼 + cmd.append("sofia/gateway/carrier_primary/").append(number); + + // 客户接听后的处理 + cmd.append(" &lua(predictive_handler.lua)"); + + String result = eslManager.sendSyncApiCommand("originate", cmd.toString()); + + if (!result.startsWith("+OK")) { + log.warn("外呼失败: number={}, result={}", number, result); + task.getStats().getFailed().incrementAndGet(); + } + + } catch (Exception e) { + log.error("外呼异常: number={}", number, e); + task.getStats().getFailed().incrementAndGet(); + } finally { + task.getStats().getCurrentDialing().decrementAndGet(); + } + } + + /** + * 客户接听回调(由事件触发) + */ + public void onCustomerAnswer(String uuid, String taskId) { + DialTask task = activeTasks.get(taskId); + if (task == null) { + eslManager.sendSyncApiCommand("uuid_kill", uuid + " NO_ROUTE_DESTINATION"); + return; + } + + task.getStats().getConnected().incrementAndGet(); + + // 查找可用坐席 + List agents = agentService.getAvailableAgents(task.getSkillGroup()); + + if (agents.isEmpty()) { + // 无可用坐席,播放等待音乐 + eslManager.sendSyncApiCommand("uuid_broadcast", + uuid + " ivr/please_wait.wav both"); + + // 放入等待队列 + // TODO: 实现等待逻辑 + + // 超时处理 + task.getStats().getAbandoned().incrementAndGet(); + } else { + // 转接坐席 + Agent agent = agents.get(0); + agentService.updateAgentState(agent.getId(), AgentState.RINGING); + + eslManager.sendSyncApiCommand("uuid_transfer", + uuid + " " + agent.getExtension() + " XML default"); + + task.getStats().getTransferred().incrementAndGet(); + } + } + + /** + * 获取任务统计 + */ + public DialStats getTaskStats(String taskId) { + DialTask task = activeTasks.get(taskId); + return task != null ? task.getStats() : null; + } +} + +/** + * 外呼任务 + */ +@Data +class DialTask { + private String id; + private String name; + private String skillGroup; + private String callerIdNumber; + private BlockingQueue numbers; + private int maxConcurrent; + private TaskState state; + private DialStats stats; +} + +/** + * 任务状态 + */ +enum TaskState { + CREATED, RUNNING, PAUSED, STOPPED, COMPLETED +} + +/** + * 外呼统计 + */ +@Data +class DialStats { + private AtomicInteger totalDialed = new AtomicInteger(0); + private AtomicInteger currentDialing = new AtomicInteger(0); + private AtomicInteger connected = new AtomicInteger(0); + private AtomicInteger transferred = new AtomicInteger(0); + private AtomicInteger failed = new AtomicInteger(0); + private AtomicInteger abandoned = new AtomicInteger(0); +} +``` + +### 4.2 机器人外呼实现 + +```java +package com.callcenter.service; + +import com.callcenter.esl.EslConnectionManager; +import com.callcenter.model.*; +import com.callcenter.tts.TtsService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.*; +import java.util.concurrent.*; + +/** + * 机器人外呼服务 + * 用于批量通知、回访、满意度调查 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class RobotDialerService { + + private final EslConnectionManager eslManager; + private final TtsService ttsService; + + private final Map activeTasks = new ConcurrentHashMap<>(); + private final ExecutorService executor = Executors.newFixedThreadPool(20); + + /** + * 创建机器人外呼任务 + */ + public String createTask(RobotTaskRequest request) { + String taskId = UUID.randomUUID().toString(); + + RobotTask task = new RobotTask(); + task.setId(taskId); + task.setType(request.getType()); // NOTIFICATION, SURVEY, CALLBACK + task.setNumbers(new LinkedBlockingQueue<>(request.getNumbers())); + task.setTtsText(request.getTtsText()); + task.setVariables(request.getVariables()); // 每个号码的变量 + task.setMaxConcurrent(request.getMaxConcurrent()); + task.setRetryTimes(request.getRetryTimes()); + task.setCollectDtmf(request.isCollectDtmf()); + task.setState(TaskState.CREATED); + task.setResults(new ConcurrentHashMap<>()); + + activeTasks.put(taskId, task); + return taskId; + } + + /** + * 启动任务 + */ + public void startTask(String taskId) { + RobotTask task = activeTasks.get(taskId); + if (task == null) { + throw new RuntimeException("任务不存在"); + } + + task.setState(TaskState.RUNNING); + executor.submit(() -> robotDialLoop(task)); + } + + /** + * 机器人外呼循环 + */ + private void robotDialLoop(RobotTask task) { + log.info("开始机器人外呼: taskId={}", task.getId()); + + Semaphore semaphore = new Semaphore(task.getMaxConcurrent()); + + while (task.getState() == TaskState.RUNNING) { + String number = task.getNumbers().poll(); + if (number == null) { + break; + } + + try { + semaphore.acquire(); + executor.submit(() -> { + try { + robotCall(task, number); + } finally { + semaphore.release(); + } + }); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + break; + } + } + + // 等待所有呼叫完成 + try { + semaphore.acquire(task.getMaxConcurrent()); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + + task.setState(TaskState.COMPLETED); + log.info("机器人外呼完成: taskId={}", task.getId()); + } + + /** + * 单个机器人呼叫 + */ + private void robotCall(RobotTask task, String number) { + log.info("机器人呼叫: taskId={}, number={}", task.getId(), number); + + RobotCallResult result = new RobotCallResult(); + result.setNumber(number); + result.setStartTime(System.currentTimeMillis()); + + try { + // 替换TTS文本中的变量 + String ttsText = replaceTtsVariables(task.getTtsText(), + task.getVariables().get(number)); + + // 生成语音文件 + String audioFile = ttsService.synthesize(ttsText); + + // 构建外呼命令 + StringBuilder cmd = new StringBuilder(); + cmd.append("{"); + cmd.append("task_id=").append(task.getId()).append(","); + cmd.append("dial_number=").append(number).append(","); + cmd.append("robot_mode=true").append(","); + cmd.append("audio_file=").append(audioFile); + cmd.append("}"); + + cmd.append("sofia/gateway/carrier_primary/").append(number); + + if (task.isCollectDtmf()) { + // 需要收集按键 + cmd.append(" &lua(robot_survey.lua)"); + } else { + // 纯播报 + cmd.append(" &playback(").append(audioFile).append(")"); + } + + String apiResult = eslManager.sendSyncApiCommand("originate", cmd.toString()); + + if (apiResult.startsWith("+OK")) { + result.setStatus("SUCCESS"); + result.setCallUuid(apiResult.substring(4).trim()); + } else { + result.setStatus("FAILED"); + result.setError(apiResult); + + // 重试逻辑 + handleRetry(task, number); + } + + } catch (Exception e) { + log.error("机器人呼叫异常: number={}", number, e); + result.setStatus("ERROR"); + result.setError(e.getMessage()); + handleRetry(task, number); + } + + result.setEndTime(System.currentTimeMillis()); + task.getResults().put(number, result); + } + + /** + * 替换TTS变量 + */ + private String replaceTtsVariables(String template, Map vars) { + if (vars == null || vars.isEmpty()) { + return template; + } + + String result = template; + for (Map.Entry entry : vars.entrySet()) { + result = result.replace("${" + entry.getKey() + "}", entry.getValue()); + } + return result; + } + + /** + * 处理重试 + */ + private void handleRetry(RobotTask task, String number) { + int retryCount = task.getRetryCount().getOrDefault(number, 0); + if (retryCount < task.getRetryTimes()) { + task.getRetryCount().put(number, retryCount + 1); + task.getNumbers().offer(number); + log.info("加入重试队列: number={}, retry={}", number, retryCount + 1); + } + } + + /** + * 处理DTMF按键结果(由事件触发) + */ + public void onDtmfResult(String uuid, String taskId, String number, String digit) { + RobotTask task = activeTasks.get(taskId); + if (task == null) { + return; + } + + RobotCallResult result = task.getResults().get(number); + if (result != null) { + result.setDtmfDigit(digit); + log.info("收到按键: taskId={}, number={}, digit={}", taskId, number, digit); + } + } + + /** + * 获取任务结果 + */ + public List getTaskResults(String taskId) { + RobotTask task = activeTasks.get(taskId); + if (task == null) { + return Collections.emptyList(); + } + return new ArrayList<>(task.getResults().values()); + } +} +``` + +### 4.3 班长监控实现 + +```java +package com.callcenter.service; + +import com.callcenter.esl.EslConnectionManager; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +/** + * 班长监控服务 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class SupervisorService { + + private final EslConnectionManager eslManager; + + /** + * 监听坐席通话 + * 班长可以听到双方说话,但双方听不到班长 + */ + public void spy(String supervisorExtension, String targetUuid) { + log.info("开始监听: supervisor={}, target={}", supervisorExtension, targetUuid); + + // 使用eavesdrop应用 + // originate user/supervisor &eavesdrop(target_uuid) + String cmd = String.format( + "{origination_caller_id_name=监听}user/%s &eavesdrop(%s)", + supervisorExtension, targetUuid + ); + + String result = eslManager.sendSyncApiCommand("originate", cmd); + + if (!result.startsWith("+OK")) { + throw new RuntimeException("监听失败: " + result); + } + } + + /** + * 强插通话 + * 班长加入通话,三方都可以听到 + */ + public void barge(String supervisorExtension, String targetUuid) { + log.info("强插通话: supervisor={}, target={}", supervisorExtension, targetUuid); + + // 使用三方会议实现 + String confName = "barge_" + targetUuid; + + // 1. 将目标通话转入会议 + eslManager.sendSyncApiCommand("uuid_transfer", + targetUuid + " conference:" + confName + "+flags{mute} inline"); + + // 2. 呼叫班长加入会议 + String cmd = String.format( + "{origination_caller_id_name=强插}user/%s &conference(%s)", + supervisorExtension, confName + ); + + eslManager.sendSyncApiCommand("originate", cmd); + } + + /** + * 强拆通话 + * 强制挂断坐席通话 + */ + public void hangup(String targetUuid, String reason) { + log.info("强拆通话: target={}, reason={}", targetUuid, reason); + + eslManager.sendSyncApiCommand("uuid_kill", targetUuid + " " + reason); + } + + /** + * 密语(耳语) + * 班长对坐席说话,客户听不到 + */ + public void whisper(String supervisorExtension, String agentUuid) { + log.info("密语: supervisor={}, agent={}", supervisorExtension, agentUuid); + + // 使用eavesdrop的whisper模式 + String cmd = String.format( + "{origination_caller_id_name=密语}user/%s &eavesdrop(%s whisper)", + supervisorExtension, agentUuid + ); + + eslManager.sendSyncApiCommand("originate", cmd); + } + + /** + * 获取实时通话列表 + */ + public String getActiveCalls() { + return eslManager.sendSyncApiCommand("show", "calls"); + } + + /** + * 获取坐席通道信息 + */ + public String getChannelInfo(String uuid) { + return eslManager.sendSyncApiCommand("uuid_dump", uuid); + } +} +``` + +--- + +## 第五部分 高可用部署方案 + +### 5.1 主备架构 + +``` + ┌─────────────────┐ + │ Keepalived │ + │ VIP漂移管理 │ + └────────┬────────┘ + │ + ┌───────────────────────────┴───────────────────────────┐ + │ VIP: 10.10.1.100 │ + │ (SIP/ESL统一入口) │ + └───────────────────────────┬───────────────────────────┘ + │ + ┌─────────────────────┴─────────────────────┐ + │ │ + ▼ ▼ + ┌────────────────────┐ ┌────────────────────┐ + │ Master节点 │ 心跳检测 │ Backup节点 │ + │ 10.10.1.10 │◄──────────────────►│ 10.10.1.11 │ + ├────────────────────┤ ├────────────────────┤ + │ FreeSWITCH │ │ FreeSWITCH │ + │ CTI中间件 │ │ CTI中间件 │ + │ API服务 │ │ API服务 │ + └────────────────────┘ └────────────────────┘ + │ │ + │ 共享存储 / 数据同步 │ + │ │ + └─────────────────────┬─────────────────────┘ + │ + ┌──────────────────────────┼──────────────────────────┐ + │ │ │ + ▼ ▼ ▼ +┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ +│ MySQL 主从 │ │ Redis Sentinel │ │ NAS存储 │ +│ 10.10.2.10/11 │ │ 10.10.2.20-22 │ │ 10.10.2.30 │ +└─────────────────┘ └─────────────────┘ └─────────────────┘ +``` + +### 5.2 Keepalived配置 + +**Master节点配置:** + +```bash +# /etc/keepalived/keepalived.conf (Master) + +global_defs { + router_id FS_MASTER +} + +# 检测FreeSWITCH状态的脚本 +vrrp_script check_freeswitch { + script "/etc/keepalived/check_freeswitch.sh" + interval 2 + weight -20 + fall 3 + rise 2 +} + +vrrp_instance VI_FS { + state MASTER + interface eth0 + virtual_router_id 51 + priority 100 + advert_int 1 + + authentication { + auth_type PASS + auth_pass your_password + } + + virtual_ipaddress { + 10.10.1.100/24 dev eth0 + } + + track_script { + check_freeswitch + } + + notify_master "/etc/keepalived/notify_master.sh" + notify_backup "/etc/keepalived/notify_backup.sh" + notify_fault "/etc/keepalived/notify_fault.sh" +} +``` + +**检测脚本:** + +```bash +#!/bin/bash +# /etc/keepalived/check_freeswitch.sh + +# 检测FreeSWITCH进程 +if ! pgrep -x "freeswitch" > /dev/null; then + exit 1 +fi + +# 检测ESL端口 +if ! nc -z localhost 8021; then + exit 1 +fi + +# 检测SIP端口 +if ! nc -z localhost 5060; then + exit 1 +fi + +# 执行简单API命令测试 +result=$(fs_cli -x "status" 2>/dev/null) +if [[ $? -ne 0 ]]; then + exit 1 +fi + +exit 0 +``` + +**主节点切换通知脚本:** + +```bash +#!/bin/bash +# /etc/keepalived/notify_master.sh + +# 记录日志 +echo "$(date): Becoming MASTER" >> /var/log/keepalived-state.log + +# 启动FreeSWITCH(如果未运行) +systemctl start freeswitch + +# 启动CTI服务 +systemctl start callcenter-cti + +# 发送告警通知 +curl -X POST "http://your-alert-api/notify" \ + -d "message=FreeSWITCH切换到Master节点" +``` + +### 5.3 配置同步方案 + +```bash +#!/bin/bash +# sync_config.sh - 配置同步脚本 + +MASTER_HOST="10.10.1.10" +BACKUP_HOST="10.10.1.11" +FS_CONF_DIR="/usr/local/freeswitch/conf" + +# 使用rsync同步配置 +sync_config() { + rsync -avz --delete \ + ${FS_CONF_DIR}/ \ + ${BACKUP_HOST}:${FS_CONF_DIR}/ + + # 通知备机重载配置 + ssh ${BACKUP_HOST} "fs_cli -x 'reloadxml'" +} + +# 监控配置变化 +inotifywait -m -r -e modify,create,delete ${FS_CONF_DIR} | while read path action file; do + echo "配置变化: $path$file ($action)" + sync_config +done +``` + +### 5.4 FreeSWITCH集群配置 + +对于需要更高并发的场景,可以部署FreeSWITCH集群: + +```xml + + + + + + + + + + + + + + + + + + + + + + +``` + +--- + +## 第六部分 性能优化指南 + +### 6.1 FreeSWITCH优化 + +**系统级优化:** + +```bash +# /etc/security/limits.conf +freeswitch soft nofile 65536 +freeswitch hard nofile 65536 +freeswitch soft core unlimited +freeswitch hard core unlimited + +# /etc/sysctl.conf +net.core.rmem_max = 16777216 +net.core.wmem_max = 16777216 +net.core.rmem_default = 1048576 +net.core.wmem_default = 1048576 +net.core.netdev_max_backlog = 30000 +net.ipv4.tcp_max_syn_backlog = 10240 +net.ipv4.tcp_tw_reuse = 1 +net.ipv4.tcp_fin_timeout = 15 +``` + +**FreeSWITCH配置优化:** + +```xml + + + + + + + + + + + + + + + + +``` + +### 6.2 CTI中间件优化 + +```java +// 连接池配置 +@Configuration +public class ConnectionPoolConfig { + + @Bean + public ThreadPoolTaskExecutor eslEventExecutor() { + ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); + executor.setCorePoolSize(8); + executor.setMaxPoolSize(32); + executor.setQueueCapacity(10000); + executor.setThreadNamePrefix("esl-event-"); + executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); + executor.initialize(); + return executor; + } + + @Bean + public RedissonClient redissonClient() { + Config config = new Config(); + config.useClusterServers() + .addNodeAddress("redis://10.10.2.20:6379") + .addNodeAddress("redis://10.10.2.21:6379") + .addNodeAddress("redis://10.10.2.22:6379") + .setMasterConnectionPoolSize(64) + .setSlaveConnectionPoolSize(64); + return Redisson.create(config); + } +} +``` + +### 6.3 监控指标 + +```yaml +# prometheus配置 +scrape_configs: + - job_name: 'freeswitch' + static_configs: + - targets: ['10.10.1.10:9282', '10.10.1.11:9282'] + + - job_name: 'callcenter-cti' + static_configs: + - targets: ['10.10.1.10:8080', '10.10.1.11:8080'] + metrics_path: '/actuator/prometheus' +``` + +**关键监控指标:** + +| 指标 | 说明 | 阈值 | +|------|------|------| +| freeswitch_sessions_active | 当前活跃会话数 | <80%最大值 | +| freeswitch_sessions_per_second | 每秒新建会话数 | <100 | +| freeswitch_cpu_usage | CPU使用率 | <70% | +| freeswitch_memory_usage | 内存使用率 | <80% | +| esl_event_queue_size | 事件队列大小 | <5000 | +| acd_queue_wait_time | 平均等待时间 | <30s | +| agent_utilization | 坐席利用率 | 目标>70% | + +--- + +## 总结 + +本文档详细介绍了FreeSWITCH的技术架构和ESL开发实践,涵盖了: + +1. **核心概念**:Channel、Session、Event等基础概念 +2. **模块详解**:mod_sofia、Dialplan、ESL等核心模块 +3. **ESL开发**:Java和Go两种语言的开发示例 +4. **场景实践**:ACD、预测式外呼、机器人外呼、班长监控 +5. **高可用部署**:主备架构、Keepalived配置 +6. **性能优化**:系统优化、应用优化、监控指标 + +建议开发团队在正式开发前: +- 搭建FreeSWITCH测试环境熟悉操作 +- 仔细研读FreeSWITCH官方文档 +- 从简单场景(如点击拨号)开始,逐步实现复杂功能 +- 重视测试,特别是高可用切换测试和压力测试 + +如有任何问题,欢迎继续交流! + +### USER +给出一个粗略的开发方案 + +### ASSISTANT +# 呼叫中心系统开发方案 + +--- + +**文档版本**:V1.0 +**编制日期**:2024年1月 +**项目周期**:4个月(17周) + +--- + +## 一、开发方案概述 + +### 1.1 项目背景回顾 + +| 项目要素 | 内容 | +|---------|------| +| 业务范围 | 道路救援、家政服务、代驾服务 | +| 坐席规模 | 150坐席 | +| 日话务量 | 50,000通 | +| 技术路线 | 自研(基于FreeSWITCH) | +| 部署方式 | 私有化 + 主备高可用 | + +### 1.2 开发目标 + +``` +┌─────────────────────────────────────────────────────────────────────────┐ +│ 系统能力目标 │ +├─────────────────────────────────────────────────────────────────────────┤ +│ ✓ 150坐席并发 ✓ 120路并发通话 ✓ 99.9%可用性 │ +│ ✓ 7×24小时服务 ✓ 故障30秒内切换 ✓ API响应<200ms │ +└─────────────────────────────────────────────────────────────────────────┘ +``` + +--- + +## 二、系统架构设计 + +### 2.1 整体架构 + +``` +┌─────────────────────────────────────────────────────────────────────────┐ +│ 外部系统 │ +│ CRM系统 业务系统 阿里云语音 │ +└──────────┬───────────────────────┬────────────────────┬─────────────────┘ + │ │ │ + │ REST API / WebSocket │ + │ │ │ +┌──────────▼───────────────────────▼────────────────────▼─────────────────┐ +│ CTI中间件层 │ +│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ +│ │ API网关 │ │ 坐席服务 │ │ 呼叫服务 │ │ 外呼引擎 │ │ +│ │ (Gateway) │ │ (Agent) │ │ (Call) │ │ (Dialer) │ │ +│ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ │ +│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ +│ │ ACD服务 │ │ 队列服务 │ │ 监控服务 │ │ 机器人服务 │ │ +│ │ (ACD) │ │ (Queue) │ │ (Monitor) │ │ (Robot) │ │ +│ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ │ +│ ┌─────────────┐ ┌─────────────┐ │ +│ │ ESL连接池 │ │ 事件分发器 │ │ +│ │ (ESL Pool) │ │ (Dispatcher)│ │ +│ └──────┬──────┘ └──────┬──────┘ │ +└─────────┼────────────────┼──────────────────────────────────────────────┘ + │ │ + │ ESL协议 │ + │ │ +┌─────────▼────────────────▼──────────────────────────────────────────────┐ +│ FreeSWITCH 媒体层 │ +│ ┌───────────────────────────────────────────────────────────────────┐ │ +│ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │ +│ │ │mod_sofia│ │mod_dptools│ │mod_record│ │mod_lua │ │mod_event│ │ │ +│ │ │ (SIP) │ │(Dialplan)│ │ (录音) │ │ (IVR) │ │ (ESL) │ │ │ +│ │ └─────────┘ └─────────┘ └─────────┘ └─────────┘ └─────────┘ │ │ +│ └───────────────────────────────────────────────────────────────────┘ │ +│ FreeSWITCH Core │ +└─────────────────────────────────┬───────────────────────────────────────┘ + │ + SIP Trunk + │ +┌─────────────────────────────────▼───────────────────────────────────────┐ +│ 运营商网络 │ +│ 400号码 / SIP中继线路 │ +└─────────────────────────────────────────────────────────────────────────┘ +``` + +### 2.2 技术选型 + +| 层级 | 组件 | 技术选型 | 说明 | +|------|------|---------|------| +| **媒体层** | 软交换 | FreeSWITCH 1.10.x | 开源、稳定、功能完善 | +| | SIP协议 | mod_sofia | FreeSWITCH内置 | +| | IVR脚本 | Lua | 灵活、性能好 | +| **中间件层** | 开发语言 | Java 17 + Spring Boot 3 | 团队熟悉、生态成熟 | +| | ESL客户端 | 自研(基于Netty) | 更好的连接管理 | +| | API框架 | Spring WebFlux | 响应式、高性能 | +| | WebSocket | Spring WebSocket | 事件实时推送 | +| **数据层** | 关系数据库 | MySQL 8.0 | 主从复制、读写分离 | +| | 缓存 | Redis 7.0 | Sentinel高可用 | +| | 消息队列 | RabbitMQ | 异步解耦 | +| | 文件存储 | MinIO / NAS | 录音存储 | +| **前端** | 软电话条 | Vue 3 + TypeScript | 组件化、类型安全 | +| | 监控大屏 | Vue 3 + ECharts | 数据可视化 | +| **运维** | 容器化 | Docker + Docker Compose | 简化部署 | +| | 监控 | Prometheus + Grafana | 指标监控 | +| | 日志 | ELK Stack | 日志收集分析 | +| **外部服务** | ASR/TTS | 阿里云智能语音 | 按需调用 | +| | NLU | 指定对话平台 | 意图识别 | + +### 2.3 模块划分 + +``` +┌─────────────────────────────────────────────────────────────────────────┐ +│ 系统模块划分 │ +├─────────────────────────────────────────────────────────────────────────┤ +│ │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ callcenter-platform │ │ +│ │ (父工程) │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ │ │ +│ ┌──────────────────────────┼──────────────────────────┐ │ +│ │ │ │ │ │ │ +│ ▼ ▼ ▼ ▼ ▼ │ +│ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ +│ │ common │ │ esl │ │ core │ │ api │ │ web │ │ +│ │ (公共) │ │(ESL封装)│ │(核心业务)│ │(REST API)│ │(前端) │ │ +│ └─────────┘ └─────────┘ └─────────┘ └─────────┘ └─────────┘ │ +│ │ │ │ │ │ │ +│ └──────────────┴───────────┴───────────┴──────────────┘ │ +│ │ │ +│ ▼ │ +│ ┌─────────────┐ │ +│ │ gateway │ │ +│ │ (启动入口) │ │ +│ └─────────────┘ │ +│ │ +└─────────────────────────────────────────────────────────────────────────┘ +``` + +**模块职责:** + +| 模块 | 职责 | 主要内容 | +|------|------|---------| +| **common** | 公共组件 | 工具类、常量、异常、通用模型 | +| **esl** | ESL封装 | ESL连接管理、命令封装、事件解析 | +| **core** | 核心业务 | 坐席管理、呼叫控制、ACD、队列、外呼、录音 | +| **api** | REST接口 | 对外API、WebSocket推送 | +| **web** | 前端工程 | 软电话条、监控大屏 | +| **gateway** | 应用入口 | 配置、启动类 | + +--- + +## 三、功能模块设计 + +### 3.1 模块清单与优先级 + +``` +┌─────────────────────────────────────────────────────────────────────────┐ +│ 功能模块优先级 │ +├─────────────────────────────────────────────────────────────────────────┤ +│ │ +│ P0 - 核心功能(必须完成) │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ ☐ ESL连接管理 ☐ 坐席签入签出 ☐ 呼入呼出控制 │ │ +│ │ ☐ ACD话务分配 ☐ 技能组管理 ☐ 排队等待 │ │ +│ │ ☐ 全程录音 ☐ 软电话条 ☐ API接口 │ │ +│ │ ☐ 事件推送 ☐ CRM集成 ☐ 基础IVR │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ │ +│ P1 - 重要功能(应该完成) │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ ☐ 预测式外呼 ☐ 机器人外呼 ☐ 语音识别IVR │ │ +│ │ ☐ 呼入机器人 ☐ 班长监控 ☐ 实时监控大屏 │ │ +│ │ ☐ 溢出策略 ☐ 主备高可用 │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ │ +│ P2 - 增强功能(尽量完成) │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ ☐ VIP优先 ☐ 黑名单 ☐ 满意度调查 │ │ +│ │ ☐ 多轮对话 ☐ 话务预测 ☐ 密语功能 │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ │ +└─────────────────────────────────────────────────────────────────────────┘ +``` + +### 3.2 核心模块设计 + +#### 3.2.1 ESL模块 + +``` +┌─────────────────────────────────────────────────────────────────────────┐ +│ ESL模块设计 │ +├─────────────────────────────────────────────────────────────────────────┤ +│ │ +│ ┌───────────────────────────────────────────────────────────────────┐ │ +│ │ EslConnectionManager │ │ +│ │ (连接管理器) │ │ +│ ├───────────────────────────────────────────────────────────────────┤ │ +│ │ - connect() 建立ESL连接 │ │ +│ │ - disconnect() 断开连接 │ │ +│ │ - reconnect() 重连机制 │ │ +│ │ - heartbeat() 心跳检测 │ │ +│ │ - getConnection() 获取连接 │ │ +│ └───────────────────────────────────────────────────────────────────┘ │ +│ │ │ +│ ▼ │ +│ ┌───────────────────────────────────────────────────────────────────┐ │ +│ │ EslCommandExecutor │ │ +│ │ (命令执行器) │ │ +│ ├───────────────────────────────────────────────────────────────────┤ │ +│ │ - api(cmd, args) 同步API命令 │ │ +│ │ - bgapi(cmd, args) 异步API命令 │ │ +│ │ - sendMsg(uuid, app) 发送消息 │ │ +│ │ - originate(...) 发起呼叫 │ │ +│ │ - bridge(uuid1, uuid2) 桥接通道 │ │ +│ │ - hangup(uuid) 挂断通话 │ │ +│ │ - transfer(uuid, dest) 转接 │ │ +│ │ - hold/unhold(uuid) 保持/取回 │ │ +│ └───────────────────────────────────────────────────────────────────┘ │ +│ │ │ +│ ▼ │ +│ ┌───────────────────────────────────────────────────────────────────┐ │ +│ │ EslEventDispatcher │ │ +│ │ (事件分发器) │ │ +│ ├───────────────────────────────────────────────────────────────────┤ │ +│ │ - subscribe(events) 订阅事件 │ │ +│ │ - addHandler(handler) 注册处理器 │ │ +│ │ - dispatch(event) 分发事件 │ │ +│ │ - filter(uuid) 过滤事件 │ │ +│ └───────────────────────────────────────────────────────────────────┘ │ +│ │ +│ 关键事件处理: │ +│ ┌────────────────┬────────────────────────────────────────────────┐ │ +│ │ CHANNEL_CREATE │ → 创建呼叫记录,呼入触发ACD排队 │ │ +│ │ CHANNEL_ANSWER │ → 更新状态为已接听,开始计时 │ │ +│ │ CHANNEL_BRIDGE │ → 更新状态为桥接,记录桥接信息 │ │ +│ │ CHANNEL_HANGUP │ → 更新坐席状态,生成话单 │ │ +│ │ DTMF │ → IVR按键处理,满意度调查收集 │ │ +│ └────────────────┴────────────────────────────────────────────────┘ │ +│ │ +└─────────────────────────────────────────────────────────────────────────┘ +``` + +#### 3.2.2 坐席管理模块 + +``` +┌─────────────────────────────────────────────────────────────────────────┐ +│ 坐席管理模块设计 │ +├─────────────────────────────────────────────────────────────────────────┤ +│ │ +│ 坐席状态机: │ +│ ┌───────────────────────────────────────────────────────────────────┐ │ +│ │ │ │ +│ │ ┌─────────┐ │ │ +│ │ │ OFFLINE │ ◄────────────────────────┐ │ │ +│ │ └────┬────┘ │ │ │ +│ │ │ signIn │ signOut │ │ +│ │ ▼ │ │ │ +│ │ ┌─────────┐ ready ┌────┴────┐ │ │ +│ │ ┌───►│NOT_READY│─────────────────────►│ READY │◄───┐ │ │ +│ │ │ └─────────┘ └────┬────┘ │ │ │ +│ │ │ ▲ │ │ │ │ +│ │ wrapUp │ │ notReady │ assign │ │ │ +│ │ timeout│ │ ▼ │ │ │ +│ │ │ ┌─────────┐ ┌─────────┐ │ │ │ +│ │ │ │ PAUSED │ │ RINGING │ │ │ │ +│ │ │ │ (小休) │ └────┬────┘ │ │ │ +│ │ │ └─────────┘ │ │ │ │ +│ │ │ │ answer │ │ │ +│ │ │ ▼ │ │ │ +│ │ │ ┌─────────┐ │ │ │ +│ │ │ │ BUSY │ │ │ │ +│ │ │ │ (通话中) │ │ │ │ +│ │ │ └────┬────┘ │ │ │ +│ │ │ │ │ │ │ +│ │ │ │ hangup │ │ │ +│ │ │ ▼ │ │ │ +│ │ │ ┌─────────┐ │ │ │ +│ │ └────────────────────────────────────│ WRAP_UP │────┘ │ │ +│ │ │ (后处理) │ │ │ +│ │ └─────────┘ │ │ +│ │ │ │ +│ └───────────────────────────────────────────────────────────────────┘ │ +│ │ +│ 数据模型: │ +│ ┌───────────────────────────────────────────────────────────────────┐ │ +│ │ Agent { │ │ +│ │ id: String // 坐席ID │ │ +│ │ name: String // 坐席姓名 │ │ +│ │ extension: String // 分机号 │ │ +│ │ skillGroups: List // 技能组列表 │ │ +│ │ state: AgentState // 当前状态 │ │ +│ │ stateTime: DateTime // 状态开始时间 │ │ +│ │ currentCallUuid: String // 当前通话UUID │ │ +│ │ signInTime: DateTime // 签入时间 │ │ +│ │ } │ │ +│ └───────────────────────────────────────────────────────────────────┘ │ +│ │ +│ 存储设计(Redis): │ +│ ┌───────────────────────────────────────────────────────────────────┐ │ +│ │ agent:{agentId} → Hash 坐席详细信息 │ │ +│ │ agents:online → Set 在线坐席ID集合 │ │ +│ │ skillgroup:{name}:agents → Set 技能组坐席集合 │ │ +│ │ agent:{agentId}:idle_time → String 空闲开始时间 │ │ +│ └───────────────────────────────────────────────────────────────────┘ │ +│ │ +└─────────────────────────────────────────────────────────────────────────┘ +``` + +#### 3.2.3 ACD模块 + +``` +┌─────────────────────────────────────────────────────────────────────────┐ +│ ACD模块设计 │ +├─────────────────────────────────────────────────────────────────────────┤ +│ │ +│ 分配流程: │ +│ ┌───────────────────────────────────────────────────────────────────┐ │ +│ │ │ │ +│ │ 来电 ──► IVR ──► 确定技能组 ──► 入队 ──► 分配 ──► 振铃 ──► 接听 │ │ +│ │ │ │ │ +│ │ ▼ │ │ +│ │ ┌──────────┐ │ │ +│ │ │ 排队等待 │ │ │ +│ │ │ 播放音乐 │ │ │ +│ │ └──────────┘ │ │ +│ │ │ │ +│ └───────────────────────────────────────────────────────────────────┘ │ +│ │ +│ 分配策略(按优先级): │ +│ ┌───────────────────────────────────────────────────────────────────┐ │ +│ │ │ │ +│ │ 1. 历史服务优先 │ │ +│ │ └─► 查找该客户上次服务的坐席,若空闲则分配 │ │ +│ │ │ │ +│ │ 2. 最长空闲优先 │ │ +│ │ └─► 选择空闲时间最长的坐席 │ │ +│ │ │ │ +│ │ 3. 轮询分配 │ │ +│ │ └─► 按顺序轮流分配 │ │ +│ │ │ │ +│ └───────────────────────────────────────────────────────────────────┘ │ +│ │ +│ 溢出策略: │ +│ ┌───────────────────────────────────────────────────────────────────┐ │ +│ │ │ │ +│ │ 条件:技能组无空闲坐席 + 等待时间 > 阈值(如60秒) │ │ +│ │ │ │ +│ │ 溢出配置: │ │ +│ │ ┌─────────────┬─────────────┬───────────┐ │ │ +│ │ │ 源技能组 │ 目标技能组 │ 等待阈值 │ │ │ +│ │ ├─────────────┼─────────────┼───────────┤ │ │ +│ │ │ rescue │ default │ 60秒 │ │ │ +│ │ │ housekeeping│ default │ 90秒 │ │ │ +│ │ │ driver │ default │ 60秒 │ │ │ +│ │ └─────────────┴─────────────┴───────────┘ │ │ +│ │ │ │ +│ └───────────────────────────────────────────────────────────────────┘ │ +│ │ +│ 队列数据结构(Redis Sorted Set): │ +│ ┌───────────────────────────────────────────────────────────────────┐ │ +│ │ queue:{skillGroup} │ │ +│ │ ┌──────────────────────────────────────────────────────────────┐│ │ +│ │ │ Score = 优先级 × 10^9 + 入队时间戳 ││ │ +│ │ │ Member = QueueItem(callUuid, callerNumber, enqueueTime...) ││ │ +│ │ └──────────────────────────────────────────────────────────────┘│ │ +│ │ │ │ +│ │ 优先级越小越优先,同优先级按入队时间排序 │ │ +│ └───────────────────────────────────────────────────────────────────┘ │ +│ │ +└─────────────────────────────────────────────────────────────────────────┘ +``` + +#### 3.2.4 呼叫控制模块 + +``` +┌─────────────────────────────────────────────────────────────────────────┐ +│ 呼叫控制模块设计 │ +├─────────────────────────────────────────────────────────────────────────┤ +│ │ +│ 呼叫状态机: │ +│ ┌───────────────────────────────────────────────────────────────────┐ │ +│ │ │ │ +│ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │ +│ │ │ CREATED │────►│ RINGING │────►│ ANSWERED│────►│ BRIDGED │ │ │ +│ │ └─────────┘ └────┬────┘ └────┬────┘ └────┬────┘ │ │ +│ │ │ │ │ │ │ +│ │ │ │ │ │ │ +│ │ │ │ ▼ │ │ +│ │ │ │ ┌─────────┐ │ │ +│ │ │ │ │ HELD │ │ │ +│ │ │ │ └────┬────┘ │ │ +│ │ │ │ │ │ │ +│ │ ▼ ▼ ▼ │ │ +│ │ ┌────────────────────────────────────────┐ │ │ +│ │ │ HANGUP │ │ │ +│ │ └────────────────────────────────────────┘ │ │ +│ │ │ │ +│ └───────────────────────────────────────────────────────────────────┘ │ +│ │ +│ 核心操作: │ +│ ┌───────────────────────────────────────────────────────────────────┐ │ +│ │ │ │ +│ │ 点击外呼: │ │ +│ │ ┌─────────────────────────────────────────────────────────────┐ │ │ +│ │ │ 1. 检查坐席状态(必须READY) │ │ │ +│ │ │ 2. 更新坐席状态为BUSY │ │ │ +│ │ │ 3. originate呼叫坐席分机 │ │ │ +│ │ │ 4. 坐席接听后bridge呼叫客户 │ │ │ +│ │ │ 5. 开始录音 │ │ │ +│ │ └─────────────────────────────────────────────────────────────┘ │ │ +│ │ │ │ +│ │ 转接: │ │ +│ │ ┌─────────────────────────────────────────────────────────────┐ │ │ +│ │ │ 盲转:uuid_transfer直接转接 │ │ │ +│ │ │ 咨询转:先hold,originate咨询方,确认后bridge │ │ │ +│ │ └─────────────────────────────────────────────────────────────┘ │ │ +│ │ │ │ +│ │ 三方通话: │ │ +│ │ ┌─────────────────────────────────────────────────────────────┐ │ │ +│ │ │ 1. 创建会议室 conference │ │ │ +│ │ │ 2. 将原通话双方加入会议 │ │ │ +│ │ │ 3. originate第三方加入会议 │ │ │ +│ │ └─────────────────────────────────────────────────────────────┘ │ │ +│ │ │ │ +│ └───────────────────────────────────────────────────────────────────┘ │ +│ │ +│ 数据模型: │ +│ ┌───────────────────────────────────────────────────────────────────┐ │ +│ │ Call { │ │ +│ │ uuid: String // 呼叫唯一标识 │ │ +│ │ direction: Enum // INBOUND/OUTBOUND │ │ +│ │ callerNumber: String // 主叫号码 │ │ +│ │ calleeNumber: String // 被叫号码 │ │ +│ │ state: CallState // 呼叫状态 │ │ +│ │ agentId: String // 服务坐席 │ │ +│ │ skillGroup: String // 技能组 │ │ +│ │ createTime: DateTime // 创建时间 │ │ +│ │ answerTime: DateTime // 接听时间 │ │ +│ │ hangupTime: DateTime // 挂断时间 │ │ +│ │ duration: Long // 通话时长(秒) │ │ +│ │ recordingPath: String // 录音路径 │ │ +│ │ hangupCause: String // 挂断原因 │ │ +│ │ } │ │ +│ └───────────────────────────────────────────────────────────────────┘ │ +│ │ +└─────────────────────────────────────────────────────────────────────────┘ +``` + +#### 3.2.5 外呼模块 + +``` +┌─────────────────────────────────────────────────────────────────────────┐ +│ 外呼模块设计 │ +├─────────────────────────────────────────────────────────────────────────┤ +│ │ +│ 预测式外呼流程: │ +│ ┌───────────────────────────────────────────────────────────────────┐ │ +│ │ │ │ +│ │ 业务系统 ──► 创建任务 ──► 导入号码 ──► 启动任务 │ │ +│ │ │ │ │ +│ │ ▼ │ │ +│ │ ┌───────────────┐ │ │ +│ │ │ 外呼循环 │ │ │ +│ │ └───────┬───────┘ │ │ +│ │ │ │ │ +│ │ ┌───────────────────────────────────┴───────────────┐ │ │ +│ │ │ │ │ │ +│ │ ▼ │ │ │ +│ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │ │ +│ │ │ 计算拨打数 │───►│ 批量拨打 │───►│ 接通转坐席 │ │ │ │ +│ │ │(预测算法) │ │ │ │ │ │ │ │ +│ │ └─────────────┘ └─────────────┘ └─────────────┘ │ │ │ +│ │ ▲ │ │ │ │ +│ │ │ │ │ │ │ +│ │ └──────────────────────────────────────┘ │ │ │ +│ │ 循环 │ │ │ +│ │ │ │ │ +│ └───────────────────────────────────────────────────────────────────┘ │ +│ │ +│ 预测算法: │ +│ ┌───────────────────────────────────────────────────────────────────┐ │ +│ │ │ │ +│ │ 目标:让坐席接听时刚好有客户接通,减少等待 │ │ +│ │ │ │ +│ │ 预测拨打数 = 空闲坐席数 / 历史接通率 × 超拨系数 │ │ +│ │ │ │ +│ │ 示例:空闲5人,接通率30%,超拨系数1.2 │ │ +│ │ 拨打数 = 5 / 0.3 × 1.2 ≈ 20 │ │ +│ │ │ │ +│ │ 动态调整:根据实时接通率动态调整拨打速度 │ │ +│ │ │ │ +│ └───────────────────────────────────────────────────────────────────┘ │ +│ │ +│ 机器人外呼流程: │ +│ ┌───────────────────────────────────────────────────────────────────┐ │ +│ │ │ │ +│ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │ +│ │ │ 创建任务 │───►│ 生成TTS │───►│ 批量拨打 │───►│ 播放语音 │ │ │ +│ │ │ (含话术) │ │ 音频文件 │ │ │ │ │ │ │ +│ │ └──────────┘ └──────────┘ └──────────┘ └────┬─────┘ │ │ +│ │ │ │ │ +│ │ ┌───────────┴───────┐ │ │ +│ │ │ │ │ │ +│ │ ▼ ▼ │ │ +│ │ ┌──────────┐ ┌──────────┐│ +│ │ │ 纯播报 │ │ 收集按键 ││ +│ │ │ 挂断 │ │ 回传结果 ││ +│ │ └──────────┘ └──────────┘│ +│ │ │ │ +│ └───────────────────────────────────────────────────────────────────┘ │ +│ │ +└─────────────────────────────────────────────────────────────────────────┘ +``` + +### 3.3 接口设计 + +#### 3.3.1 API接口清单 + +``` +┌─────────────────────────────────────────────────────────────────────────┐ +│ REST API 设计 │ +├─────────────────────────────────────────────────────────────────────────┤ +│ │ +│ 坐席接口:/api/v1/agent │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ POST /signin 坐席签入 │ │ +│ │ POST /signout 坐席签出 │ │ +│ │ POST /ready 置闲 │ │ +│ │ POST /not-ready 置忙 │ │ +│ │ POST /pause 小休 │ │ +│ │ GET /{agentId}/status 查询坐席状态 │ │ +│ │ GET /list 查询坐席列表 │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ │ +│ 呼叫接口:/api/v1/call │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ POST /originate 发起外呼 │ │ +│ │ POST /{uuid}/answer 接听 │ │ +│ │ POST /{uuid}/hangup 挂断 │ │ +│ │ POST /{uuid}/hold 保持 │ │ +│ │ POST /{uuid}/unhold 取回 │ │ +│ │ POST /{uuid}/mute 静音 │ │ +│ │ POST /{uuid}/unmute 取消静音 │ │ +│ │ POST /{uuid}/transfer 转接 │ │ +│ │ POST /{uuid}/conference 三方通话 │ │ +│ │ GET /{uuid} 查询呼叫信息 │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ │ +│ 外呼任务接口:/api/v1/task │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ POST /predictive 创建预测式外呼任务 │ │ +│ │ POST /robot 创建机器人外呼任务 │ │ +│ │ POST /{taskId}/start 启动任务 │ │ +│ │ POST /{taskId}/pause 暂停任务 │ │ +│ │ POST /{taskId}/resume 恢复任务 │ │ +│ │ POST /{taskId}/stop 停止任务 │ │ +│ │ GET /{taskId}/status 查询任务状态 │ │ +│ │ GET /{taskId}/result 查询任务结果 │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ │ +│ 监控接口:/api/v1/monitor │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ POST /spy 监听 │ │ +│ │ POST /barge 强插 │ │ +│ │ POST /hangup 强拆 │ │ +│ │ GET /realtime 实时统计数据 │ │ +│ │ GET /queue/{skillGroup} 队列状态 │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ │ +│ 录音接口:/api/v1/recording │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ GET /list 录音列表查询 │ │ +│ │ GET /{uuid}/url 获取录音下载地址 │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ │ +└─────────────────────────────────────────────────────────────────────────┘ +``` + +#### 3.3.2 WebSocket事件推送 + +``` +┌─────────────────────────────────────────────────────────────────────────┐ +│ WebSocket 事件设计 │ +├─────────────────────────────────────────────────────────────────────────┤ +│ │ +│ 连接地址:ws://host:port/ws/events?token={token} │ +│ │ +│ 事件格式: │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ { │ │ +│ │ "eventType": "CALL_RINGING", │ │ +│ │ "timestamp": 1704067200000, │ │ +│ │ "data": { │ │ +│ │ "uuid": "xxx", │ │ +│ │ "callerNumber": "13800138000", │ │ +│ │ "calleeNumber": "4001234567", │ │ +│ │ ... │ │ +│ │ } │ │ +│ │ } │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ │ +│ 事件类型: │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ 呼叫事件 │ │ +│ │ ├── CALL_RINGING 来电振铃 │ │ +│ │ ├── CALL_ANSWERED 通话接听 │ │ +│ │ ├── CALL_BRIDGED 双方接通 │ │ +│ │ ├── CALL_HANGUP 通话挂断 │ │ +│ │ ├── CALL_TRANSFER 通话转接 │ │ +│ │ └── CALL_HOLD 通话保持 │ │ +│ │ │ │ +│ │ 坐席事件 │ │ +│ │ ├── AGENT_STATE_CHANGE 坐席状态变更 │ │ +│ │ ├── AGENT_SIGNIN 坐席签入 │ │ +│ │ └── AGENT_SIGNOUT 坐席签出 │ │ +│ │ │ │ +│ │ 话单事件 │ │ +│ │ └── CDR_GENERATED 话单生成 │ │ +│ │ │ │ +│ │ DTMF事件 │ │ +│ │ └── DTMF_RECEIVED 收到按键 │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ │ +└─────────────────────────────────────────────────────────────────────────┘ +``` + +### 3.4 数据库设计 + +``` +┌─────────────────────────────────────────────────────────────────────────┐ +│ 数据库设计 │ +├─────────────────────────────────────────────────────────────────────────┤ +│ │ +│ cc_agent (坐席表) │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ id BIGINT PRIMARY KEY │ │ +│ │ agent_id VARCHAR(32) 坐席工号 │ │ +│ │ agent_name VARCHAR(64) 坐席姓名 │ │ +│ │ extension VARCHAR(16) 分机号 │ │ +│ │ password VARCHAR(128) 密码 │ │ +│ │ skill_groups VARCHAR(256) 技能组(逗号分隔) │ │ +│ │ status TINYINT 状态(0禁用1启用) │ │ +│ │ create_time DATETIME 创建时间 │ │ +│ │ update_time DATETIME 更新时间 │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ │ +│ cc_skill_group (技能组表) │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ id BIGINT PRIMARY KEY │ │ +│ │ group_code VARCHAR(32) 技能组编码 │ │ +│ │ group_name VARCHAR(64) 技能组名称 │ │ +│ │ overflow_group VARCHAR(32) 溢出技能组 │ │ +│ │ overflow_seconds INT 溢出等待秒数 │ │ +│ │ status TINYINT 状态 │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ │ +│ cc_cdr (话单表) │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ id BIGINT PRIMARY KEY │ │ +│ │ uuid VARCHAR(64) 呼叫UUID │ │ +│ │ direction VARCHAR(16) 呼叫方向 │ │ +│ │ caller_number VARCHAR(32) 主叫号码 │ │ +│ │ callee_number VARCHAR(32) 被叫号码 │ │ +│ │ agent_id VARCHAR(32) 坐席ID │ │ +│ │ skill_group VARCHAR(32) 技能组 │ │ +│ │ queue_time INT 排队时长(秒) │ │ +│ │ ring_time INT 振铃时长(秒) │ │ +│ │ talk_time INT 通话时长(秒) │ │ +│ │ start_time DATETIME 开始时间 │ │ +│ │ answer_time DATETIME 接听时间 │ │ +│ │ end_time DATETIME 结束时间 │ │ +│ │ hangup_cause VARCHAR(32) 挂断原因 │ │ +│ │ recording_path VARCHAR(256) 录音路径 │ │ +│ │ business_type VARCHAR(32) 业务类型 │ │ +│ │ create_time DATETIME 创建时间 │ │ +│ │ INDEX idx_start_time (start_time) │ │ +│ │ INDEX idx_agent (agent_id, start_time) │ │ +│ │ INDEX idx_caller (caller_number, start_time) │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ │ +│ cc_dial_task (外呼任务表) │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ id BIGINT PRIMARY KEY │ │ +│ │ task_id VARCHAR(64) 任务ID │ │ +│ │ task_name VARCHAR(128) 任务名称 │ │ +│ │ task_type VARCHAR(16) 类型(PREDICTIVE/ROBOT) │ │ +│ │ skill_group VARCHAR(32) 技能组 │ │ +│ │ caller_id VARCHAR(32) 外显号码 │ │ +│ │ total_count INT 总号码数 │ │ +│ │ dialed_count INT 已拨打数 │ │ +│ │ connected_count INT 接通数 │ │ +│ │ state VARCHAR(16) 状态 │ │ +│ │ start_time DATETIME 开始时间 │ │ +│ │ end_time DATETIME 结束时间 │ │ +│ │ create_time DATETIME 创建时间 │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ │ +│ cc_dial_detail (外呼明细表) │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ id BIGINT PRIMARY KEY │ │ +│ │ task_id VARCHAR(64) 任务ID │ │ +│ │ phone VARCHAR(32) 号码 │ │ +│ │ call_uuid VARCHAR(64) 呼叫UUID │ │ +│ │ status VARCHAR(16) 状态 │ │ +│ │ dial_time DATETIME 拨打时间 │ │ +│ │ answer_time DATETIME 接听时间 │ │ +│ │ hangup_time DATETIME 挂断时间 │ │ +│ │ dtmf_result VARCHAR(16) 按键结果 │ │ +│ │ retry_count INT 重试次数 │ │ +│ │ INDEX idx_task (task_id) │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ │ +└─────────────────────────────────────────────────────────────────────────┘ +``` + +--- + +## 四、开发计划 + +### 4.1 阶段划分 + +``` +┌─────────────────────────────────────────────────────────────────────────┐ +│ 开发阶段划分(17周) │ +├─────────────────────────────────────────────────────────────────────────┤ +│ │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ 第一阶段:基础环境与核心框架(Week 1-4) │ │ +│ │ │ │ +│ │ Week 1-2: 环境搭建 + 技术预研 │ │ +│ │ Week 3-4: ESL模块 + 基础框架 │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ ↓ │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ 第二阶段:核心功能开发(Week 5-10) │ │ +│ │ │ │ +│ │ Week 5-6: 坐席管理 + 呼叫控制 │ │ +│ │ Week 7-8: ACD分配 + 排队等待 │ │ +│ │ Week 9-10: 录音 + 软电话条 + CRM集成 │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ ↓ │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ 第三阶段:高级功能开发(Week 11-14) │ │ +│ │ │ │ +│ │ Week 11-12: 预测式外呼 + 机器人外呼 │ │ +│ │ Week 13: IVR + 呼入机器人 │ │ +│ │ Week 14: 监控大屏 + 班长监控 │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ ↓ │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ 第四阶段:集成测试与上线(Week 15-17) │ │ +│ │ │ │ +│ │ Week 15: 集成联调 + 高可用部署 │ │ +│ │ Week 16: 测试 + Bug修复 │ │ +│ │ Week 17: 试运行 + 正式上线 │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ │ +└─────────────────────────────────────────────────────────────────────────┘ +``` + +### 4.2 详细开发计划 + +``` +┌─────────────────────────────────────────────────────────────────────────┐ +│ 详细开发计划 │ +├─────────────────────────────────────────────────────────────────────────┤ +│ │ +│ ═══════════════════════════════════════════════════════════════════ │ +│ 第一阶段:基础环境与核心框架(Week 1-4) │ +│ ═══════════════════════════════════════════════════════════════════ │ +│ │ +│ Week 1: 环境准备 │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ □ 服务器环境准备(开发、测试环境) │ │ +│ │ □ FreeSWITCH安装配置 │ │ +│ │ □ 开发环境搭建(IDE、Git、Maven) │ │ +│ │ □ MySQL、Redis环境搭建 │ │ +│ │ □ 测试SIP话机注册与基础通话 │ │ +│ │ │ │ +│ │ 交付物:环境部署文档、FreeSWITCH基础配置 │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ │ +│ Week 2: 技术预研 │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ □ ESL协议学习与Demo开发 │ │ +│ │ □ FreeSWITCH Dialplan配置学习 │ │ +│ │ □ Lua IVR脚本编写测试 │ │ +│ │ □ 项目工程结构搭建 │ │ +│ │ □ 技术方案评审 │ │ +│ │ │ │ +│ │ 交付物:技术预研报告、Demo代码 │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ │ +│ Week 3-4: ESL模块开发 │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ □ ESL连接管理(连接池、心跳、重连) │ │ +│ │ □ ESL命令封装(API、SendMsg) │ │ +│ │ □ 事件订阅与分发机制 │ │ +│ │ □ 常用命令测试验证 │ │ +│ │ □ 基础API框架搭建 │ │ +│ │ □ WebSocket服务搭建 │ │ +│ │ │ │ +│ │ 交付物:ESL模块代码、单元测试 │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ │ +│ ═══════════════════════════════════════════════════════════════════ │ +│ 第二阶段:核心功能开发(Week 5-10) │ +│ ═══════════════════════════════════════════════════════════════════ │ +│ │ +│ Week 5-6: 坐席管理 + 呼叫控制 │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ □ 坐席数据模型设计 │ │ +│ │ □ 坐席签入/签出 │ │ +│ │ □ 坐席状态管理(置闲、置忙、小休) │ │ +│ │ □ 技能组管理 │ │ +│ │ □ 点击外呼功能 │ │ +│ │ □ 接听/挂断/保持/取回 │ │ +│ │ □ 转接(盲转、咨询转) │ │ +│ │ □ 坐席API接口 │ │ +│ │ □ 呼叫API接口 │ │ +│ │ │ │ +│ │ 交付物:坐席模块、呼叫控制模块 │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ │ +│ Week 7-8: ACD分配 + 排队等待 │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ □ 队列数据结构设计 │ │ +│ │ □ 呼叫入队逻辑 │ │ +│ │ □ 历史服务优先策略 │ │ +│ │ □ 最长空闲优先策略 │ │ +│ │ □ 轮询分配策略 │ │ +│ │ □ 坐席选择与分配 │ │ +│ │ □ 排队等待音乐 │ │ +│ │ □ 溢出策略实现 │ │ +│ │ □ 排队状态查询 │ │ +│ │ │ │ +│ │ 交付物:ACD模块、队列管理模块 │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ │ +│ Week 9-10: 录音 + 软电话条 + CRM集成 │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ □ 录音启动/停止控制 │ │ +│ │ □ 录音文件存储管理 │ │ +│ │ □ 录音查询与下载API │ │ +│ │ □ 软电话条前端开发(Vue组件) │ │ +│ │ □ WebSocket事件接收与处理 │ │ +│ │ □ 软电话条UI(状态、按钮、来电显示) │ │ +│ │ □ CRM弹屏集成(事件推送) │ │ +│ │ □ 话单推送至CRM │ │ +│ │ □ 联调测试 │ │ +│ │ │ │ +│ │ 交付物:录音模块、软电话条组件、CRM集成文档 │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ │ +│ ═══════════════════════════════════════════════════════════════════ │ +│ 第三阶段:高级功能开发(Week 11-14) │ +│ ═══════════════════════════════════════════════════════════════════ │ +│ │ +│ Week 11-12: 预测式外呼 + 机器人外呼 │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ □ 外呼任务管理(创建、启动、暂停、停止) │ │ +│ │ □ 号码导入与管理 │ │ +│ │ □ 预测式拨号算法实现 │ │ +│ │ □ 接通后转坐席逻辑 │ │ +│ │ □ 外呼统计(接通率、坐席利用率) │ │ +│ │ □ 阿里云TTS集成 │ │ +│ │ □ 机器人外呼流程(播报、按键收集) │ │ +│ │ □ 外呼结果回传 │ │ +│ │ □ 任务API接口 │ │ +│ │ │ │ +│ │ 交付物:外呼引擎、机器人外呼模块 │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ │ +│ Week 13: IVR + 呼入机器人 │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ □ IVR Dialplan配置(多业务线) │ │ +│ │ □ 阿里云ASR集成 │ │ +│ │ □ 语音识别导航实现 │ │ +│ │ □ NLU对接(意图识别) │ │ +│ │ □ FAQ问答流程 │ │ +│ │ □ 转人工逻辑 │ │ +│ │ □ Lua脚本开发 │ │ +│ │ │ │ +│ │ 交付物:IVR配置、呼入机器人模块 │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ │ +│ Week 14: 监控大屏 + 班长监控 │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ □ 实时数据统计API │ │ +│ │ □ 监控大屏前端开发 │ │ +│ │ □ 坐席状态分布展示 │ │ +│ │ □ 队列状态展示 │ │ +│ │ □ 话务趋势图表 │ │ +│ │ □ 监听功能实现 │ │ +│ │ □ 强插功能实现 │ │ +│ │ □ 强拆功能实现 │ │ +│ │ │ │ +│ │ 交付物:监控大屏、班长监控功能 │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ │ +│ ═══════════════════════════════════════════════════════════════════ │ +│ 第四阶段:集成测试与上线(Week 15-17) │ +│ ═══════════════════════════════════════════════════════════════════ │ +│ │ +│ Week 15: 集成联调 + 高可用部署 │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ □ CRM系统全流程联调 │ │ +│ │ □ 业务系统对接联调 │ │ +│ │ □ 运营商线路对接 │ │ +│ │ □ 主备FreeSWITCH部署 │ │ +│ │ □ Keepalived配置 │ │ +│ │ □ 故障切换测试 │ │ +│ │ □ 数据库主从配置 │ │ +│ │ □ Redis Sentinel配置 │ │ +│ │ │ │ +│ │ 交付物:联调测试报告、高可用部署文档 │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ │ +│ Week 16: 测试 + Bug修复 │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ □ 功能测试(全流程) │ │ +│ │ □ 性能测试(150坐席并发) │ │ +│ │ □ 压力测试(峰值话务) │ │ +│ │ □ 故障恢复测试 │ │ +│ │ □ Bug修复 │ │ +│ │ □ 性能优化 │ │ +│ │ □ 上线检查清单确认 │ │ +│ │ │ │ +│ │ 交付物:测试报告、Bug清单、优化记录 │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ │ +│ Week 17: 试运行 + 正式上线 │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ □ 生产环境部署 │ │ +│ │ □ 数据初始化 │ │ +│ │ □ 小范围试运行(一条业务线) │ │ +│ │ □ 问题收集与修复 │ │ +│ │ □ 全量上线 │ │ +│ │ □ 运维交接 │ │ +│ │ □ 用户培训 │ │ +│ │ │ │ +│ │ 交付物:上线报告、运维手册、培训材料 │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ │ +└─────────────────────────────────────────────────────────────────────────┘ +``` + +### 4.3 甘特图 + +``` +┌─────────────────────────────────────────────────────────────────────────────────────────┐ +│ 项目甘特图 │ +├─────────────────────────────────────────────────────────────────────────────────────────┤ +│ │ +│ 任务 │ W1 │ W2 │ W3 │ W4 │ W5 │ W6 │ W7 │ W8 │ W9 │W10│W11│W12│W13│W14│W15│W16│W17│ +│ ─────────────────────────│────│────│────│────│────│────│────│────│────│───│───│───│───│───│───│───│───│ +│ 第一阶段 │████│████│████│████│ │ │ │ │ │ │ │ │ │ │ │ │ │ +│ 环境搭建 │████│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ +│ 技术预研 │ │████│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ +│ ESL模块开发 │ │ │████│████│ │ │ │ │ │ │ │ │ │ │ │ │ │ +│ ─────────────────────────│────│────│────│────│────│────│────│────│────│───│───│───│───│───│───│───│───│ +│ 第二阶段 │ │ │ │ │████│████│████│████│████│███│ │ │ │ │ │ │ │ +│ 坐席管理 │ │ │ │ │████│████│ │ │ │ │ │ │ │ │ │ │ │ +│ 呼叫控制 │ │ │ │ │████│████│ │ │ │ │ │ │ │ │ │ │ │ +│ ACD分配 │ │ │ │ │ │ │████│████│ │ │ │ │ │ │ │ │ │ +│ 排队等待 │ │ │ │ │ │ │████│████│ │ │ │ │ │ │ │ │ │ +│ 录音功能 │ │ │ │ │ │ │ │ │████│ │ │ │ │ │ │ │ │ +│ 软电话条 │ │ │ │ │ │ │ │ │████│███│ │ │ │ │ │ │ │ +│ CRM集成 │ │ │ │ │ │ │ │ │ │███│ │ │ │ │ │ │ │ +│ ─────────────────────────│────│────│────│────│────│────│────│────│────│───│───│───│───│───│───│───│───│ +│ 第三阶段 │ │ │ │ │ │ │ │ │ │ │███│███│███│███│ │ │ │ +│ 预测式外呼 │ │ │ │ │ │ │ │ │ │ │███│███│ │ │ │ │ │ +│ 机器人外呼 │ │ │ │ │ │ │ │ │ │ │███│███│ │ │ │ │ │ +│ IVR+呼入机器人 │ │ │ │ │ │ │ │ │ │ │ │ │███│ │ │ │ │ +│ 监控大屏 │ │ │ │ │ │ │ │ │ │ │ │ │ │███│ │ │ │ +│ 班长监控 │ │ │ │ │ │ │ │ │ │ │ │ │ │███│ │ │ │ +│ ─────────────────────────│────│────│────│────│────│────│────│────│────│───│───│───│───│───│───│───│───│ +│ 第四阶段 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │███│███│███│ +│ 集成联调 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │███│ │ │ +│ 高可用部署 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │███│ │ │ +│ 测试+Bug修复 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │███│ │ +│ 试运行 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │██ │ +│ 正式上线 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ██│ +│ ─────────────────────────│────│────│────│────│────│────│────│────│────│───│───│───│───│───│───│───│───│ +│ 里程碑 │ │ M1 │ │ M2 │ │ │ │ │ │M3 │ │ │ │M4 │M5 │M6 │M7 │ +│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ +│ M1: 需求确认 │ │ ◆ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ +│ M2: 环境就绪 │ │ │ │ ◆ │ │ │ │ │ │ │ │ │ │ │ │ │ │ +│ M3: 核心功能完成 │ │ │ │ │ │ │ │ │ │ ◆ │ │ │ │ │ │ │ │ +│ M4: 全功能完成 │ │ │ │ │ │ │ │ │ │ │ │ │ │ ◆ │ │ │ │ +│ M5: 联调测试完成 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ◆ │ │ │ +│ M6: 试运行完成 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ◆ │ │ +│ M7: 正式上线 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ◆ │ +│ │ +└─────────────────────────────────────────────────────────────────────────────────────────┘ +``` + +--- + +## 五、团队组织 + +### 5.1 团队配置 + +``` +┌─────────────────────────────────────────────────────────────────────────┐ +│ 团队组织架构 │ +├─────────────────────────────────────────────────────────────────────────┤ +│ │ +│ ┌─────────────┐ │ +│ │ 项目经理 │ │ +│ │ (1人) │ │ +│ └──────┬──────┘ │ +│ │ │ +│ ┌─────────────────────┼─────────────────────┐ │ +│ │ │ │ │ +│ ▼ ▼ ▼ │ +│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ +│ │ 开发组 │ │ 测试组 │ │ 运维组 │ │ +│ │ (8-10人) │ │ (1-2人) │ │ (1人) │ │ +│ └─────────────┘ └─────────────┘ └─────────────┘ │ +│ │ │ +│ ├── 架构师 (1人) │ +│ ├── 后端开发 (4-5人) │ +│ ├── 前端开发 (2人) │ +│ └── FreeSWITCH工程师 (1-2人) │ +│ │ +└─────────────────────────────────────────────────────────────────────────┘ +``` + +### 5.2 角色职责 + +| 角色 | 人数 | 职责 | 技能要求 | +|------|------|------|---------| +| **项目经理** | 1 | 项目管理、进度控制、风险管理 | 项目管理经验、沟通协调能力 | +| **架构师** | 1 | 架构设计、技术选型、核心代码 | FreeSWITCH、分布式系统 | +| **后端开发** | 4-5 | 业务模块开发、API开发 | Java、Spring Boot、Redis | +| **前端开发** | 2 | 软电话条、监控大屏 | Vue3、TypeScript、WebSocket | +| **FS工程师** | 1-2 | FreeSWITCH配置、Lua脚本 | FreeSWITCH、SIP协议、Lua | +| **测试** | 1-2 | 功能测试、性能测试 | 测试用例设计、性能测试工具 | +| **运维** | 1 | 环境部署、监控运维 | Linux、Docker、运维经验 | + +### 5.3 人员分工 + +``` +┌─────────────────────────────────────────────────────────────────────────┐ +│ 开发任务分工 │ +├─────────────────────────────────────────────────────────────────────────┤ +│ │ +│ 架构师 │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ • 整体架构设计 │ │ +│ │ • ESL模块核心代码 │ │ +│ │ • ACD核心算法 │ │ +│ │ • 技术难点攻关 │ │ +│ │ • 代码Review │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ │ +│ 后端开发A (资深) │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ • 坐席管理模块 │ │ +│ │ • 呼叫控制模块 │ │ +│ │ • WebSocket推送服务 │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ │ +│ 后端开发B │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ • ACD分配模块 │ │ +│ │ • 队列管理模块 │ │ +│ │ • 溢出策略 │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ │ +│ 后端开发C │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ • 预测式外呼模块 │ │ +│ │ • 机器人外呼模块 │ │ +│ │ • TTS集成 │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ │ +│ 后端开发D │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ • 录音管理模块 │ │ +│ │ • 监控统计模块 │ │ +│ │ • 班长监控功能 │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ │ +│ 后端开发E (可选) │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ • API接口开发 │ │ +│ │ • CRM集成对接 │ │ +│ │ • 单元测试 │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ │ +│ 前端开发A │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ • 软电话条组件开发 │ │ +│ │ • WebSocket客户端 │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ │ +│ 前端开发B │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ • 实时监控大屏 │ │ +│ │ • 数据可视化图表 │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ │ +│ FreeSWITCH工程师 │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ • FreeSWITCH配置优化 │ │ +│ │ • Dialplan编写 │ │ +│ │ • Lua IVR脚本开发 │ │ +│ │ • 线路对接 │ │ +│ │ • 高可用部署 │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ │ +└─────────────────────────────────────────────────────────────────────────┘ +``` + +--- + +## 六、风险控制 + +### 6.1 风险清单 + +``` +┌─────────────────────────────────────────────────────────────────────────┐ +│ 风险清单 │ +├─────────────────────────────────────────────────────────────────────────┤ +│ │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ 风险1: FreeSWITCH技术门槛高 │ │ +│ ├─────────────────────────────────────────────────────────────────┤ │ +│ │ 等级: 高 │ │ +│ │ 影响: 开发进度延迟,功能实现困难 │ │ +│ │ 应对: │ │ +│ │ • Week 1-2 集中学习FreeSWITCH和ESL │ │ +│ │ • 考虑引入外部FreeSWITCH顾问 │ │ +│ │ • 预留20%时间缓冲 │ │ +│ │ • 简化复杂功能,优先实现核心流程 │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ 风险2: 运营商线路对接周期长 │ │ +│ ├─────────────────────────────────────────────────────────────────┤ │ +│ │ 等级: 高 │ │ +│ │ 影响: 无法进行真实环境测试,上线延迟 │ │ +│ │ 应对: │ │ +│ │ • 项目启动即开始申请线路 │ │ +│ │ • 开发阶段使用模拟线路/测试线路 │ │ +│ │ • 准备备选运营商 │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ 风险3: CRM系统对接复杂 │ │ +│ ├─────────────────────────────────────────────────────────────────┤ │ +│ │ 等级: 中 │ │ +│ │ 影响: 集成联调时间延长 │ │ +│ │ 应对: │ │ +│ │ • 提前与CRM团队沟通,明确接口规范 │ │ +│ │ • 提供详细API文档和示例代码 │ │ +│ │ • 预留充足联调时间 │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ 风险4: 并发性能不达标 │ │ +│ ├─────────────────────────────────────────────────────────────────┤ │ +│ │ 等级: 中 │ │ +│ │ 影响: 系统无法支撑业务量 │ │ +│ │ 应对: │ │ +│ │ • Week 16 进行完整压力测试 │ │ +│ │ • 预先设计水平扩展方案 │ │ +│ │ • 关键代码Review,避免性能瓶颈 │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ 风险5: ASR/TTS识别效果不佳 │ │ +│ ├─────────────────────────────────────────────────────────────────┤ │ +│ │ 等级: 中 │ │ +│ │ 影响: 机器人/IVR体验差 │ │ +│ │ 应对: │ │ +│ │ • 提前进行ASR效果测试 │ │ +│ │ • 准备热词优化方案 │ │ +│ │ • 设计按键兜底方案 │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ 风险6: 核心人员离职 │ │ +│ ├─────────────────────────────────────────────────────────────────┤ │ +│ │ 等级: 中 │ │ +│ │ 影响: 知识断层,进度受阻 │ │ +│ │ 应对: │ │ +│ │ • 重要模块双人备份 │ │ +│ │ • 代码规范、文档完善 │ │ +│ │ • 定期代码Review和知识分享 │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ │ +└─────────────────────────────────────────────────────────────────────────┘ +``` + +### 6.2 应急预案 + +``` +┌─────────────────────────────────────────────────────────────────────────┐ +│ 应急预案 │ +├─────────────────────────────────────────────────────────────────────────┤ +│ │ +│ 场景1: 开发进度严重滞后 │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ 触发条件: 核心功能延迟超过2周 │ │ +│ │ 应对措施: │ │ +│ │ • 评估是否可以简化功能范围 │ │ +│ │ • 考虑增加外部资源支持 │ │ +│ │ • 与业务方协商分阶段上线 │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ │ +│ 场景2: FreeSWITCH关键问题无法解决 │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ 触发条件: 技术问题阻塞超过1周 │ │ +│ │ 应对措施: │ │ +│ │ • 联系FreeSWITCH社区或付费支持 │ │ +│ │ • 寻求外部FreeSWITCH专家支援 │ │ +│ │ • 评估替代方案可行性 │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ │ +│ 场景3: 上线后系统不稳定 │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ 触发条件: 故障频发或性能严重不足 │ │ +│ │ 应对措施: │ │ +│ │ • 启用回退方案(如有旧系统) │ │ +│ │ • 降级部分功能,保障核心业务 │ │ +│ │ • 紧急扩容或优化 │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ │ +└─────────────────────────────────────────────────────────────────────────┘ +``` + +--- + +## 七、交付物清单 + +``` +┌─────────────────────────────────────────────────────────────────────────┐ +│ 项目交付物清单 │ +├─────────────────────────────────────────────────────────────────────────┤ +│ │ +│ 阶段 │ 交付物 │ 负责人 │ +│ ──────────────│───────────────────────────────────────│───────────│ +│ │ │ │ +│ 需求阶段 │ 需求规格说明书 │ 产品 │ +│ │ 接口设计文档 │ 架构师 │ +│ │ 数据库设计文档 │ 架构师 │ +│ │ │ │ +│ 开发阶段 │ 源代码(Git仓库) │ 开发团队 │ +│ │ 单元测试代码 │ 开发团队 │ +│ │ API接口文档 │ 后端开发 │ +│ │ 前端组件文档 │ 前端开发 │ +│ │ │ │ +│ 测试阶段 │ 测试用例文档 │ 测试 │ +│ │ 测试报告 │ 测试 │ +│ │ 性能测试报告 │ 测试 │ +│ │ │ │ +│ 部署阶段 │ 部署手册 │ 运维 │ +│ │ 运维手册 │ 运维 │ +│ │ 高可用配置文档 │ 运维 │ +│ │ │ │ +│ 上线阶段 │ 上线检查清单 │ 项目经理 │ +│ │ 培训材料 │ 产品 │ +│ │ 用户操作手册 │ 产品 │ +│ │ 项目总结报告 │ 项目经理 │ +│ │ +└─────────────────────────────────────────────────────────────────────────┘ +``` + +--- + +## 八、总结 + +### 8.1 方案要点总结 + +| 维度 | 要点 | +|------|------| +| **技术架构** | FreeSWITCH + Java中间件 + Vue前端,ESL控制模式 | +| **开发周期** | 4个月(17周),分4阶段 | +| **团队配置** | 11-14人(含项目经理、开发、测试、运维) | +| **核心功能** | 呼入呼出、ACD分配、预测式外呼、机器人、录音、监控 | +| **风险控制** | FreeSWITCH技术预研、线路提前申请、预留缓冲时间 | + +### 8.2 关键成功因素 + +``` +┌─────────────────────────────────────────────────────────────────────────┐ +│ 关键成功因素 │ +├─────────────────────────────────────────────────────────────────────────┤ +│ │ +│ 1. 技术准备充分 │ +│ └─► Week 1-2 完成FreeSWITCH学习和技术预研 │ +│ │ +│ 2. 核心功能优先 │ +│ └─► 先完成P0功能,确保基础可用 │ +│ │ +│ 3. 持续集成测试 │ +│ └─► 每完成一个模块立即测试,避免问题堆积 │ +│ │ +│ 4. CRM团队紧密配合 │ +│ └─► 提前沟通接口,并行开发 │ +│ │ +│ 5. 线路提前就位 │ +│ └─► 项目启动即申请运营商线路 │ +│ │ +│ 6. 分阶段上线 │ +│ └─► 先上线一条业务线验证,再全量推广 │ +│ │ +└─────────────────────────────────────────────────────────────────────────┘ +``` + +### 8.3 下一步行动 + +| 序号 | 行动项 | 负责人 | 完成时间 | +|------|-------|-------|---------| +| 1 | 确认团队人员到位 | 项目经理 | 项目启动前 | +| 2 | 采购/准备开发测试环境 | 运维 | Week 1 | +| 3 | 启动运营商线路申请 | 项目经理 | Week 1 | +| 4 | 组织FreeSWITCH技术培训 | 架构师 | Week 1-2 | +| 5 | 与CRM团队召开接口对接会议 | 架构师 | Week 2 | +| 6 | 完成技术方案评审 | 架构师 | Week 2 | + +--- + +**文档结束** + +如需进一步细化某个模块的设计或有其他问题,请随时告知! \ No newline at end of file diff --git a/cc-center/企业呼叫中心系统需求规格说明书.txt b/cc-center/企业呼叫中心系统需求规格说明书.txt new file mode 100644 index 0000000..193b481 --- /dev/null +++ b/cc-center/企业呼叫中心系统需求规格说明书.txt @@ -0,0 +1,871 @@ +**文档版本**:V1.0 +**编制日期**:2024年1月 +**文档状态**:初稿 + +--- + +## 第一章 项目概述 + +### 1.1 项目背景 + +本企业主营道路救援、家政服务、代驾服务三大业务板块,面向个人消费者(ToC)提供服务。随着业务规模扩大,现需建设一套专业的呼叫中心系统, +以提升客户服务体验、提高服务响应效率、降低人工成本。 + +### 1.2 项目目标 + +| 目标维度 | 具体目标 | +|---------|---------| +| **服务能力** | 支持150坐席同时在线,日处理呼叫量50,000通 | +| **响应效率** | 道路救援等紧急服务实现快速响应,7×24小时不间断服务 | +| **人工效率** | 通过预测式外呼提升坐席利用率,减少空闲等待时间 | +| **自动化水平** | 通过智能IVR和机器人实现常见问题自助解答、批量通知自动化 | +| **系统稳定性** | 主备高可用架构,确保核心业务(道路救援)不中断 | + +### 1.3 项目范围 + +**纳入范围:** +- 基础呼叫能力(呼入/呼出) +- 智能IVR与语音导航 +- 呼入/呼出机器人 +- 预测式外呼 +- 无人化批量通知 +- CRM系统集成(API对接) +- 软电话条组件 +- 实时监控大屏 +- 班长监控功能 +- 全程录音 +- 主备高可用部署 + +**不纳入本期范围:** +- 统计报表系统(二期规划) +- 智能质检系统(二期规划) +- 短信功能(由第三方平台提供) + +### 1.4 术语定义 + +| 术语 | 定义 | +|------|------| +| **ACD** | 自动呼叫分配(Automatic Call Distribution) | +| **IVR** | 交互式语音应答(Interactive Voice Response) | +| **ASR** | 自动语音识别(Automatic Speech Recognition) | +| **TTS** | 语音合成(Text To Speech) | +| **NLU** | 自然语言理解(Natural Language Understanding) | +| **CTI** | 计算机电话集成(Computer Telephony Integration) | +| **SIP** | 会话发起协议(Session Initiation Protocol) | + +--- + +## 第二章 业务需求 + +### 2.1 业务架构 + +``` +┌─────────────────────────────────────────────────────────────────┐ +│ 客户触点 │ +│ 道路救援热线 家政服务热线 代驾服务热线 │ +│ (400-XXX-XXXX) (400-XXX-XXXX) (固话/400) │ +└───────────────┬─────────────────┬─────────────────┬─────────────┘ + │ │ │ + ▼ ▼ ▼ +┌─────────────────────────────────────────────────────────────────┐ +│ 呼叫中心系统 │ +│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ +│ │ 智能IVR │ │ 呼入机器人│ │ ACD分配 │ │ 外呼系统 │ │ +│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │ +│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ +│ │ 坐席管理 │ │ 录音系统 │ │ 实时监控 │ │ API网关 │ │ +│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │ +└───────────────────────────┬─────────────────────────────────────┘ + │ API + ▼ +┌─────────────────────────────────────────────────────────────────┐ +│ CRM/业务系统 │ +│ 客户管理 │ 工单管理 │ 派单系统 │ +└─────────────────────────────────────────────────────────────────┘ +``` + +### 2.2 呼入业务场景 + +#### 2.2.1 道路救援来电场景 + +**业务流程:** + +``` +客户来电 + → 智能IVR(语音识别:"道路救援") + → 机器人收集初步信息(可选) + → 转救援技能组 + → ACD分配(历史服务优先 > 最长空闲 > 轮询) + → 技能组全忙时溢出到备用组 + → 坐席接听 + CRM弹屏 + → 坐席在CRM创建工单/派单 + → 通话结束 → 录音保存 +``` + +**业务要求:** +- 响应时效要求高,需优先保障接通率 +- 支持7×24小时服务 +- 来电需快速识别客户身份,展示历史服务记录 + +#### 2.2.2 家政服务来电场景 + +**业务流程:** + +``` +客户来电 + → 智能IVR(按键或语音选择"家政服务") + → 常见问题解答(服务项目、价格咨询等) + → 客户需要人工服务 → 转家政技能组 + → 坐席接听 + CRM弹屏 + → 预约服务/创建工单 + → 通话结束 → 录音保存 +``` + +#### 2.2.3 代驾服务来电场景 + +**业务流程:** + +``` +客户来电 + → 智能IVR(语音识别:"叫代驾") + → 转代驾技能组 + → 坐席接听 + CRM弹屏 + → 创建代驾订单/派单 + → 通话结束 → 录音保存 +``` + +#### 2.2.4 投诉来电场景 + +**业务流程:** + +``` +客户来电 + → 智能IVR(识别"投诉"意图) + → 直接转人工(投诉不经机器人处理) + → 分配至对应业务技能组或投诉专席 + → CRM弹屏 + 标记投诉标签 + → 坐席记录投诉内容 +``` + +### 2.3 呼出业务场景 + +#### 2.3.1 预测式外呼(营销/回访) + +**业务流程:** + +``` +业务系统推送外呼任务(客户名单) + → 呼叫中心批量拨打 + → 客户接听 → 自动转接空闲坐席 + → CRM弹屏展示客户信息 + → 坐席进行营销/回访 + → 通话结束 → 录音保存 → 话单回传业务系统 +``` + +**业务要求:** +- 系统自动拨打,接通后才转坐席,减少坐席等待时间 +- 支持接通率、坐席利用率统计 +- 外呼任务支持暂停、恢复、停止 + +#### 2.3.2 机器人自动外呼(通知类) + +**场景一:服务人员派出/即将到达通知** + +``` +业务系统触发通知(API调用) + → 呼叫中心自动拨打客户电话 + → 播放TTS语音:"您好,您预约的道路救援服务,师傅已出发,预计10分钟到达..." + → 通话结束 → 结果回传业务系统 +``` + +**场景二:账单催缴提醒** + +``` +业务系统推送催缴名单 + → 批量自动拨打 + → 播放TTS语音:"您好,您有一笔待支付账单..." + → 纯语音播报,无需交互 + → 拨打结果回传(接通/未接通/关机等) +``` + +#### 2.3.3 机器人自动外呼(回访/满意度调查) + +**业务流程:** + +``` +业务系统推送回访任务 + → 呼叫中心自动拨打 + → 播放TTS语音:"您好,请问您对本次服务满意吗?满意请按1,不满意请按2" + → 采集客户按键 + → 按键结果回传业务系统 + → 不满意客户可选择转人工跟进 +``` + +### 2.4 机器人客服场景 + +#### 2.4.1 呼入机器人功能定位 + +| 功能 | 说明 | +|------|------| +| **语音导航** | 支持客户语音说出需求,自动识别并转接对应技能组 | +| **常见问题解答** | 支持50个以上FAQ,自动语音解答 | +| **转人工预处理** | 收集客户初步信息后转人工,提高坐席效率 | + +#### 2.4.2 转人工触发条件 + +| 触发条件 | 说明 | +|---------|------| +| 客户主动要求 | 客户说"转人工"或按键选择转人工 | +| 识别失败 | 机器人连续2-3次无法识别客户意图 | +| 特定问题类型 | 投诉类问题直接转人工,不经机器人处理 | + +--- + +## 第三章 功能需求 + +### 3.1 智能IVR模块 + +#### 3.1.1 功能清单 + +| 功能编号 | 功能名称 | 功能描述 | 优先级 | +|---------|---------|---------|--------| +| IVR-001 | 多级语音菜单 | 支持配置多级IVR语音菜单,按键导航 | P0 | +| IVR-002 | 语音识别导航 | 集成阿里云ASR,支持客户语音说出需求自动识别 | P0 | +| IVR-003 | 多业务线路由 | 根据来电号码(400/固话)自动进入对应业务IVR流程 | P0 | +| IVR-004 | 时间条件路由 | 支持按工作时间/节假日配置不同IVR流程 | P1 | +| IVR-005 | 黑名单拦截 | 来电号码在黑名单中自动播放提示后挂断 | P1 | +| IVR-006 | VIP客户识别 | VIP客户来电自动优先排队或转专属坐席 | P2 | +| IVR-007 | IVR流程可视化配置 | 提供可视化拖拽界面配置IVR流程 | P1 | + +#### 3.1.2 语音识别要求 + +- **ASR供应商**:阿里云语音识别 +- **识别准确率**:≥90% +- **响应时间**:≤500ms +- **支持方言**:普通话为主,可选支持粤语、四川话等 + +### 3.2 ACD自动分配模块 + +#### 3.2.1 功能清单 + +| 功能编号 | 功能名称 | 功能描述 | 优先级 | +|---------|---------|---------|--------| +| ACD-001 | 技能组管理 | 支持创建多个技能组(救援组、家政组、代驾组) | P0 | +| ACD-002 | 坐席技能配置 | 坐席可属于一个或多个技能组,配置技能等级 | P0 | +| ACD-003 | 历史服务优先 | 来电客户优先分配给上次服务的坐席 | P0 | +| ACD-004 | 最长空闲优先 | 同技能组内优先分配给空闲时间最长的坐席 | P0 | +| ACD-005 | 轮询分配 | 同技能组内按顺序轮流分配 | P0 | +| ACD-006 | 分配策略优先级 | 支持配置分配策略优先级:历史服务 > 最长空闲 > 轮询 | P0 | +| ACD-007 | 技能组溢出 | 技能组全忙时,来电溢出到配置的备用技能组 | P0 | +| ACD-008 | 排队等待 | 所有坐席忙时,来电进入排队,播放等待音乐 | P0 | +| ACD-009 | 排队超时处理 | 排队超时可配置:继续等待/溢出/留言/回拨 | P1 | +| ACD-010 | 排队位置播报 | 向等待客户播报当前排队位置 | P2 | + +### 3.3 坐席管理模块 + +#### 3.3.1 功能清单 + +| 功能编号 | 功能名称 | 功能描述 | 优先级 | +|---------|---------|---------|--------| +| AGT-001 | 坐席签入/签出 | 坐席上下班签入签出系统 | P0 | +| AGT-002 | 坐席状态管理 | 支持状态:空闲、通话中、振铃中、后处理、小休、忙碌 | P0 | +| AGT-003 | 小休原因 | 小休时需选择原因(用餐、洗手间、培训等) | P1 | +| AGT-004 | 状态自动切换 | 通话结束自动进入后处理状态,超时自动转空闲 | P0 | +| AGT-005 | 后处理时长配置 | 可配置后处理时长(如30秒) | P1 | +| AGT-006 | 强制签出 | 班长可强制签出坐席 | P1 | + +#### 3.3.2 坐席工作台要求 + +- 坐席不使用呼叫中心独立工作台 +- 坐席在CRM系统中操作业务 +- 呼叫中心提供**软电话条组件**嵌入CRM页面 +- 软电话条通过WebSocket与呼叫中心通信 +- 同时支持IP话机(SIP协议注册) + +### 3.4 软电话条组件 + +#### 3.4.1 功能清单 + +| 功能编号 | 功能名称 | 功能描述 | 优先级 | +|---------|---------|---------|--------| +| SFT-001 | 签入/签出 | 坐席登录CRM后通过软电话条签入呼叫中心 | P0 | +| SFT-002 | 状态切换 | 置忙/置闲/小休状态切换按钮 | P0 | +| SFT-003 | 来电弹屏触发 | 来电时向CRM发送弹屏事件,携带来电号码、客户ID等 | P0 | +| SFT-004 | 接听/挂断 | 点击接听/挂断按钮控制通话 | P0 | +| SFT-005 | 保持/取回 | 通话保持(播放等待音乐)和取回 | P0 | +| SFT-006 | 静音 | 坐席侧静音 | P1 | +| SFT-007 | 转接 | 转接至其他坐席/技能组/外线号码 | P0 | +| SFT-008 | 咨询转 | 先与第三方通话咨询,再决定是否转接 | P1 | +| SFT-009 | 三方通话 | 坐席、客户、第三方三方通话 | P1 | +| SFT-010 | 点击拨号 | 在CRM中点击号码呼出 | P0 | +| SFT-011 | 手动拨号 | 手动输入号码拨打 | P0 | +| SFT-012 | 通话计时 | 显示当前通话时长 | P0 | +| SFT-013 | 来电信息展示 | 显示来电号码、归属地、技能组等 | P0 | + +#### 3.4.2 软电话条技术要求 + +| 要求项 | 说明 | +|-------|------| +| **前端技术** | Web组件,支持iframe嵌入或JS SDK集成 | +| **通信协议** | WebSocket长连接,实时接收呼叫事件 | +| **语音方案** | WebRTC(浏览器软电话)或SIP话机(硬件话机) | +| **浏览器支持** | Chrome 70+、Firefox 65+、Edge 79+ | + +### 3.5 呼入通话控制 + +#### 3.5.1 功能清单 + +| 功能编号 | 功能名称 | 功能描述 | 优先级 | +|---------|---------|---------|--------| +| IBC-001 | 来电接入 | 支持SIP中继接入来电 | P0 | +| IBC-002 | 来电排队 | 坐席全忙时来电进入队列等待 | P0 | +| IBC-003 | 等待音乐 | 排队等待时播放等待音乐 | P0 | +| IBC-004 | 来电转接 | 支持盲转、咨询转、转技能组、转外线 | P0 | +| IBC-005 | 三方通话 | 支持三方会议通话 | P1 | +| IBC-006 | 通话保持 | 通话保持并播放等待音乐 | P0 | +| IBC-007 | 通话录音 | 全程录音,支持双声道(坐席/客户分轨)| P0 | + +### 3.6 呼出通话控制 + +#### 3.6.1 功能清单 + +| 功能编号 | 功能名称 | 功能描述 | 优先级 | +|---------|---------|---------|--------| +| OBC-001 | 点击外呼 | 坐席点击号码发起外呼 | P0 | +| OBC-002 | 外显号码设置 | 支持配置外呼显示的主叫号码 | P0 | +| OBC-003 | 外呼转接 | 外呼通话中支持转接 | P0 | +| OBC-004 | 通话录音 | 外呼通话全程录音 | P0 | + +### 3.7 预测式外呼模块 + +#### 3.7.1 功能清单 + +| 功能编号 | 功能名称 | 功能描述 | 优先级 | +|---------|---------|---------|--------| +| PDL-001 | 外呼任务创建 | 通过API创建外呼任务,导入号码名单 | P0 | +| PDL-002 | 任务状态控制 | 支持任务启动、暂停、恢复、停止 | P0 | +| PDL-003 | 预测式拨号算法 | 根据坐席空闲情况自动计算拨打频率 | P0 | +| PDL-004 | 接通转坐席 | 客户接听后自动转接空闲坐席 | P0 | +| PDL-005 | 无人接听处理 | 无人接听/忙音/关机等自动标记状态 | P0 | +| PDL-006 | 外呼时段限制 | 可配置允许外呼的时间段(如9:00-21:00) | P1 | +| PDL-007 | 号码去重 | 同一任务内号码自动去重 | P1 | +| PDL-008 | 重试策略 | 未接通号码可配置自动重试次数和间隔 | P1 | +| PDL-009 | 坐席利用率统计 | 统计坐席有效通话时长占比 | P0 | +| PDL-010 | 接通率统计 | 统计任务接通率 | P0 | + +### 3.8 机器人外呼模块 + +#### 3.8.1 功能清单 + +| 功能编号 | 功能名称 | 功能描述 | 优先级 | +|---------|---------|---------|--------| +| RBT-001 | 批量通知任务 | 通过API创建批量语音通知任务 | P0 | +| RBT-002 | TTS语音播放 | 集成阿里云TTS,文本转语音播放 | P0 | +| RBT-003 | 变量替换 | 支持语音内容中插入变量(姓名、时间、金额等) | P0 | +| RBT-004 | 纯播报模式 | 播放语音后直接挂断 | P0 | +| RBT-005 | 按键采集模式 | 播放语音后等待客户按键,采集结果 | P0 | +| RBT-006 | 按键结果回传 | 按键结果通过回调接口推送至业务系统 | P0 | +| RBT-007 | 无应答处理 | 客户无应答/超时可配置重试或标记 | P1 | +| RBT-008 | 并发控制 | 可配置任务最大并发拨打数 | P1 | +| RBT-009 | 任务进度查询 | API查询任务进度和结果 | P0 | + +### 3.9 呼入机器人模块 + +#### 3.9.1 功能清单 + +| 功能编号 | 功能名称 | 功能描述 | 优先级 | +|---------|---------|---------|--------| +| IRB-001 | 语音识别 | 集成阿里云ASR识别客户语音 | P0 | +| IRB-002 | 意图识别 | 对接NLU平台,识别客户意图 | P0 | +| IRB-003 | FAQ问答 | 支持配置50+常见问题及答案 | P0 | +| IRB-004 | 语音合成应答 | 集成阿里云TTS合成语音应答 | P0 | +| IRB-005 | 多轮对话 | 支持多轮对话收集信息 | P1 | +| IRB-006 | 转人工-主动请求 | 客户说"转人工"触发转接 | P0 | +| IRB-007 | 转人工-识别失败 | 连续N次识别失败自动转人工 | P0 | +| IRB-008 | 转人工-特定意图 | 识别到投诉等意图直接转人工 | P0 | +| IRB-009 | 转接携带信息 | 转人工时携带已收集的信息至坐席 | P1 | +| IRB-010 | 话术配置 | 支持配置机器人话术和回复内容 | P0 | + +### 3.10 录音管理模块 + +#### 3.10.1 功能清单 + +| 功能编号 | 功能名称 | 功能描述 | 优先级 | +|---------|---------|---------|--------| +| REC-001 | 全程录音 | 所有呼入呼出通话全程录音 | P0 | +| REC-002 | 双声道录音 | 坐席和客户分轨录音(便于质检) | P1 | +| REC-003 | 录音存储 | 录音文件存储至NAS/分布式存储 | P0 | +| REC-004 | 长期保存 | 支持录音长期保存,定期归档 | P0 | +| REC-005 | 录音检索 | 按通话ID、时间、号码等检索录音 | P0 | +| REC-006 | 录音下载 | 通过API获取录音文件下载地址 | P0 | +| REC-007 | 录音权限 | 录音访问权限控制 | P1 | + +### 3.11 班长监控模块 + +#### 3.11.1 功能清单 + +| 功能编号 | 功能名称 | 功能描述 | 优先级 | +|---------|---------|---------|--------| +| SUP-001 | 坐席状态监控 | 实时查看所有坐席当前状态 | P0 | +| SUP-002 | 实时监听 | 监听坐席与客户通话,双方不知情 | P0 | +| SUP-003 | 强插通话 | 加入通话,三方均可听到 | P0 | +| SUP-004 | 强拆通话 | 强制结束坐席通话 | P0 | +| SUP-005 | 密语(可选) | 对坐席单向说话,客户听不到(二期) | P2 | +| SUP-006 | 强制签出 | 强制将坐席签出系统 | P1 | +| SUP-007 | 强制置忙 | 强制将坐席状态设为忙碌 | P1 | + +### 3.12 实时监控大屏 + +#### 3.12.1 功能清单 + +| 功能编号 | 功能名称 | 功能描述 | 优先级 | +|---------|---------|---------|--------| +| DSP-001 | 整体概览 | 展示当前呼入量、呼出量、接通率等 | P0 | +| DSP-002 | 坐席状态分布 | 展示各状态坐席数量(空闲、通话、小休等) | P0 | +| DSP-003 | 技能组监控 | 各技能组排队数、等待时长、可用坐席数 | P0 | +| DSP-004 | 实时告警 | 排队超阈值、坐席空闲过少等告警提示 | P1 | +| DSP-005 | 趋势图表 | 当日话务量趋势图(按小时) | P1 | +| DSP-006 | 大屏适配 | 支持大屏显示器展示 | P0 | + +--- + +## 第四章 接口需求 + +### 4.1 接口概述 + +呼叫中心系统作为通信能力中台,通过API方式为CRM/业务系统提供呼叫能力。接口采用RESTful API + WebSocket事件推送模式。 + +### 4.2 接口清单 + +#### 4.2.1 呼入控制接口 + +| 接口编号 | 接口名称 | 请求方式 | 说明 | +|---------|---------|---------|------| +| API-IN-001 | 接听来电 | POST | 坐席接听当前来电 | +| API-IN-002 | 挂断通话 | POST | 挂断当前通话 | +| API-IN-003 | 保持通话 | POST | 将通话置于保持状态 | +| API-IN-004 | 取回通话 | POST | 取回保持的通话 | +| API-IN-005 | 转接通话 | POST | 转接至指定坐席/技能组/外线 | +| API-IN-006 | 咨询通话 | POST | 发起咨询通话 | +| API-IN-007 | 咨询转移 | POST | 咨询后转移 | +| API-IN-008 | 三方通话 | POST | 建立三方通话 | + +#### 4.2.2 呼出控制接口 + +| 接口编号 | 接口名称 | 请求方式 | 说明 | +|---------|---------|---------|------| +| API-OUT-001 | 点击外呼 | POST | 坐席发起外呼 | +| API-OUT-002 | 取消外呼 | POST | 取消正在拨打的外呼 | +| API-OUT-003 | 预览式外呼确认 | POST | 坐席确认拨打预览号码 | + +#### 4.2.3 坐席状态接口 + +| 接口编号 | 接口名称 | 请求方式 | 说明 | +|---------|---------|---------|------| +| API-AGT-001 | 坐席签入 | POST | 坐席签入系统 | +| API-AGT-002 | 坐席签出 | POST | 坐席签出系统 | +| API-AGT-003 | 置忙 | POST | 坐席设置为忙碌状态 | +| API-AGT-004 | 置闲 | POST | 坐席设置为空闲状态 | +| API-AGT-005 | 小休 | POST | 坐席进入小休状态 | +| API-AGT-006 | 查询坐席状态 | GET | 查询指定坐席当前状态 | +| API-AGT-007 | 批量查询坐席状态 | GET | 批量查询坐席状态 | + +#### 4.2.4 外呼任务接口 + +| 接口编号 | 接口名称 | 请求方式 | 说明 | +|---------|---------|---------|------| +| API-TASK-001 | 创建外呼任务 | POST | 创建预测式/机器人外呼任务 | +| API-TASK-002 | 导入号码 | POST | 向任务导入外呼号码 | +| API-TASK-003 | 启动任务 | POST | 启动外呼任务 | +| API-TASK-004 | 暂停任务 | POST | 暂停外呼任务 | +| API-TASK-005 | 恢复任务 | POST | 恢复暂停的任务 | +| API-TASK-006 | 停止任务 | POST | 停止外呼任务 | +| API-TASK-007 | 查询任务进度 | GET | 查询任务执行进度 | +| API-TASK-008 | 查询任务结果 | GET | 查询任务拨打结果明细 | + +#### 4.2.5 单条外呼接口(通知类) + +| 接口编号 | 接口名称 | 请求方式 | 说明 | +|---------|---------|---------|------| +| API-NOTIFY-001 | 发起语音通知 | POST | 触发单条语音通知外呼 | +| API-NOTIFY-002 | 查询通知结果 | GET | 查询通知拨打结果 | + +#### 4.2.6 录音接口 + +| 接口编号 | 接口名称 | 请求方式 | 说明 | +|---------|---------|---------|------| +| API-REC-001 | 查询录音列表 | GET | 按条件查询录音记录 | +| API-REC-002 | 获取录音下载地址 | GET | 获取录音文件下载URL | + +#### 4.2.7 监控接口 + +| 接口编号 | 接口名称 | 请求方式 | 说明 | +|---------|---------|---------|------| +| API-MON-001 | 监听通话 | POST | 班长监听指定坐席通话 | +| API-MON-002 | 强插通话 | POST | 班长强插指定坐席通话 | +| API-MON-003 | 强拆通话 | POST | 班长强制挂断指定坐席通话 | +| API-MON-004 | 实时统计数据 | GET | 获取实时监控统计数据 | +| API-MON-005 | 技能组排队信息 | GET | 获取各技能组排队情况 | + +### 4.3 事件推送(WebSocket) + +#### 4.3.1 通话事件 + +| 事件编号 | 事件名称 | 触发时机 | 推送内容 | +|---------|---------|---------|---------| +| EVT-001 | 来电振铃 | 来电分配到坐席时 | 来电号码、客户ID、技能组、IVR收集信息等 | +| EVT-002 | 通话接通 | 坐席接听后 | 通话ID、接通时间 | +| EVT-003 | 通话挂断 | 通话结束后 | 通话ID、挂断方、通话时长 | +| EVT-004 | 转接振铃 | 转接到新坐席振铃时 | 转接来源、来电信息 | +| EVT-005 | 外呼振铃 | 外呼拨打中 | 外呼号码、坐席ID | +| EVT-006 | 外呼接通 | 客户接听 | 通话ID | +| EVT-007 | 外呼失败 | 外呼未接通 | 失败原因(无人接听/忙/关机等) | + +#### 4.3.2 坐席状态事件 + +| 事件编号 | 事件名称 | 触发时机 | 推送内容 | +|---------|---------|---------|---------| +| EVT-101 | 状态变更 | 坐席状态变化时 | 坐席ID、新状态、旧状态、时间 | +| EVT-102 | 签入成功 | 坐席签入成功 | 坐席ID、技能组 | +| EVT-103 | 签出成功 | 坐席签出成功 | 坐席ID | + +#### 4.3.3 话单推送 + +| 事件编号 | 事件名称 | 触发时机 | 推送内容 | +|---------|---------|---------|---------| +| EVT-201 | 话单推送 | 通话结束后 | 通话ID、主被叫、开始时间、结束时间、时长、录音地址、坐席ID、技能组、呼叫类型等 | + +#### 4.3.4 机器人交互结果推送 + +| 事件编号 | 事件名称 | 触发时机 | 推送内容 | +|---------|---------|---------|---------| +| EVT-301 | 按键结果 | 客户按键后 | 任务ID、号码、按键值、时间 | +| EVT-302 | 机器人通话结果 | 机器人外呼结束 | 任务ID、号码、接通状态、通话时长、按键结果 | + +--- + +## 第五章 非功能需求 + +### 5.1 性能需求 + +| 指标项 | 要求 | +|-------|------| +| **并发坐席数** | 支持150坐席同时在线 | +| **并发通话数** | 支持120路并发通话(含呼入+呼出) | +| **日处理量** | 支持日均50,000通呼叫 | +| **呼叫建立时延** | 来电从接入到振铃坐席 ≤ 1秒 | +| **API响应时间** | 95%请求响应 ≤ 200ms | +| **事件推送时延** | 事件产生到推送至CRM ≤ 500ms | +| **ASR识别延迟** | 语音识别延迟 ≤ 500ms | +| **系统可用性** | ≥ 99.9%(全年停机不超过8.76小时) | + +### 5.2 高可用需求 + +| 要求项 | 说明 | +|-------|------| +| **主备部署** | FreeSWITCH主备双机部署,主机故障自动切换至备机 | +| **切换时间** | 故障切换时间 ≤ 30秒 | +| **数据同步** | 主备配置实时同步 | +| **心跳检测** | 主备心跳检测间隔 ≤ 5秒 | +| **数据库高可用** | 数据库采用主从复制或集群部署 | +| **录音存储** | 录音存储采用RAID或分布式存储,防止数据丢失 | + +### 5.3 安全需求 + +| 要求项 | 说明 | +|-------|------| +| **网络安全** | SIP通信支持TLS加密;API支持HTTPS | +| **API认证** | API调用需Token认证,支持IP白名单 | +| **权限控制** | 支持角色权限管理(管理员、班长、坐席) | +| **录音安全** | 录音文件访问需权限验证 | +| **操作审计** | 关键操作记录审计日志 | + +### 5.4 兼容性需求 + +| 要求项 | 说明 | +|-------|------| +| **SIP话机** | 兼容主流SIP话机品牌(如:Yealink、Grandstream、Fanvil等) | +| **SIP协议** | 符合RFC 3261标准 | +| **浏览器** | 软电话条支持Chrome 70+、Firefox 65+、Edge 79+ | +| **编解码** | 语音编解码支持G.711a、G.711u、G.729(可选) | + +### 5.5 可扩展性需求 + +| 要求项 | 说明 | +|-------|------| +| **坐席扩展** | 架构支持水平扩展至300+坐席 | +| **业务线扩展** | 支持新增业务线/技能组,无需改动核心架构 | +| **线路扩展** | 支持新增SIP中继线路 | + +--- + +## 第六章 系统架构设计建议 + +### 6.1 整体架构图 + +``` + ┌──────────────────┐ + │ 运营商网络 │ + │ (SIP Trunk/400) │ + └────────┬─────────┘ + │ + ┌────────▼─────────┐ + │ SBC/边界网关 │ + │ (可选,安全防护) │ + └────────┬─────────┘ + │ + ┌───────────────────────────┼───────────────────────────┐ + │ │ │ + │ ┌──────────────────────▼─────────────────────┐ │ + │ │ FreeSWITCH │ │ + │ │ (主备双机部署) │ │ + │ │ ┌─────────┬─────────┬─────────┬─────────┐ │ │ + │ │ │ IVR │ ACD │ 录音模块 │ 外呼引擎│ │ │ + │ │ └─────────┴─────────┴─────────┴─────────┘ │ │ + │ └───────────────────────┬────────────────────┘ │ + │ │ │ + │ ┌───────────────────────┼───────────────────────┐ │ + │ │ │ │ │ + │ ▼ ▼ ▼ │ + │ ┌──────────┐ ┌──────────────┐ ┌────────┐│ + │ │ CTI中间件 │ │ API Gateway │ │ WS推送 ││ + │ │(ESL连接) │ │ (REST API) │ │ 服务 ││ + │ └────┬─────┘ └──────┬───────┘ └───┬────┘│ + │ │ │ │ │ + │ └────────────────────┼────────────────────┘ │ + │ │ │ + │ ┌────────────────┼────────────────┐ │ + │ │ │ │ │ + │ ▼ ▼ ▼ │ + │ ┌──────────┐ ┌──────────┐ ┌───────────┐ │ + │ │ MySQL │ │ Redis │ │ 文件存储 │ │ + │ │ (话单/配置)│ │ (缓存/状态)│ │ (录音) │ │ + │ └──────────┘ └──────────┘ └───────────┘ │ + │ │ + │ 呼叫中心系统边界 │ + └───────────────────────────┬──────────────────────────┘ + │ + ┌───────────────────────┼───────────────────────┐ + │ │ │ + ▼ ▼ ▼ + ┌──────────┐ ┌──────────┐ ┌────────────┐ + │ CRM系统 │ │ 业务系统 │ │ 阿里云语音 │ + │(弹屏/工单) │ │(派单/订单)│ │(ASR/TTS) │ + └──────────┘ └──────────┘ └────────────┘ +``` + +### 6.2 核心组件说明 + +| 组件 | 技术选型 | 说明 | +|------|---------|------| +| **媒体服务器** | FreeSWITCH | 核心呼叫控制、媒体处理、IVR、录音 | +| **CTI中间件** | 自研(基于ESL) | 封装FreeSWITCH ESL接口,提供业务逻辑 | +| **API网关** | Nginx/Kong/自研 | RESTful API统一入口 | +| **WebSocket服务** | Node.js/Golang | 实时事件推送 | +| **数据库** | MySQL 8.0 | 话单、配置、坐席信息存储 | +| **缓存** | Redis | 坐席状态、会话信息缓存 | +| **录音存储** | NAS/MinIO/对象存储 | 录音文件长期存储 | +| **ASR/TTS** | 阿里云智能语音 | 语音识别与合成 | +| **NLU** | 外部指定平台 | 意图识别与对话管理 | + +### 6.3 部署架构(主备高可用) + +``` + ┌─────────────────────────────────────┐ + │ VIP(虚拟IP) │ + └──────────────────┬──────────────────┘ + │ + ┌──────────────────────────┼──────────────────────────┐ + │ │ │ + ▼ │ ▼ + ┌─────────────────┐ │ ┌─────────────────┐ + │ FreeSWITCH │◄─────Keepalived心跳──────────────►│ FreeSWITCH │ + │ (主机) │ │ │ (备机) │ + │ CTI中间件 │ │ │ CTI中间件 │ + │ API服务 │ │ │ API服务 │ + └─────────────────┘ │ └─────────────────┘ + │ │ │ + └──────────────────────────┼──────────────────────────┘ + │ + ┌────────────┴────────────┐ + │ │ + ▼ ▼ + ┌──────────────┐ ┌───────────────┐ + │ MySQL主从集群 │ │ Redis Sentinel│ + └──────────────┘ └───────────────┘ + │ + ▼ + ┌───────────────┐ + │ NAS/分布式存储 │ + │ (录音文件) │ + └───────────────┘ +``` + +--- + +## 第七章 硬件与软件清单 + +### 7.1 硬件清单 + +| 序号 | 设备类型 | 规格配置 | 数量 | 用途 | 参考单价(万元) | 合计(万元) | +|-----|---------|---------|------|------|---------------|-------------| +| 1 | 应用服务器(主) | 32核CPU/64GB内存/500GB SSD+2TB HDD | 1 | FreeSWITCH+CTI+API | 5-8 | 5-8 | +| 2 | 应用服务器(备) | 32核CPU/64GB内存/500GB SSD+2TB HDD | 1 | FreeSWITCH备机 | 5-8 | 5-8 | +| 3 | 数据库服务器 | 16核CPU/64GB内存/1TB SSD | 2 | MySQL主从 | 4-6 | 8-12 | +| 4 | Redis服务器 | 8核CPU/32GB内存/500GB SSD | 3 | Redis Sentinel集群 | 2-3 | 6-9 | +| 5 | NAS存储 | 96TB可用空间(RAID) | 1 | 录音长期存储 | 8-15 | 8-15 | +| 6 | 网络交换机 | 千兆三层交换机 | 2 | 网络通信 | 1-2 | 2-4 | +| 7 | 防火墙 | 企业级防火墙 | 1 | 安全防护 | 2-5 | 2-5 | +| 8 | IP话机 | SIP话机(如Yealink T46U) | 150 | 坐席通话终端 | 0.05-0.08 | 7.5-12 | +| 9 | 坐席耳麦 | 专业话务耳麦 | 150 | 坐席配件 | 0.02-0.05 | 3-7.5 | +| **硬件合计** | | | | | | **47-80.5** | + +### 7.2 软件清单 + +| 序号 | 软件/平台 | 说明 | 授权方式 | 预估费用(万元) | +|-----|---------|------|---------|----------------| +| 1 | FreeSWITCH | 开源软交换平台 | 开源免费 | 0 | +| 2 | Linux操作系统 | CentOS/Rocky Linux | 开源免费 | 0 | +| 3 | MySQL数据库 | 社区版 | 开源免费 | 0 | +| 4 | Redis | 缓存 | 开源免费 | 0 | +| 5 | Nginx | 反向代理/负载均衡 | 开源免费 | 0 | +| 6 | 阿里云ASR | 语音识别 | 按量付费 | 详见运营费用 | +| 7 | 阿里云TTS | 语音合成 | 按量付费 | 详见运营费用 | +| 8 | NLU对话平台 | 意图识别 | 按需对接 | 视平台定价 | +| 9 | 监控软件(Zabbix/Prometheus) | 系统监控 | 开源免费 | 0 | +| **软件合计** | | | | **0(开源为主)** | + +### 7.3 开发成本估算 + +| 模块 | 预估人天 | 说明 | +|------|---------|------| +| FreeSWITCH环境搭建与配置 | 15 | 主备部署、线路对接、编解码配置 | +| IVR流程开发 | 20 | 多业务线IVR、语音导航 | +| ACD分配模块 | 25 | 多种分配策略、溢出逻辑 | +| CTI中间件开发 | 40 | ESL封装、业务逻辑 | +| 坐席状态管理 | 15 | 状态机、持久化 | +| API服务开发 | 30 | 全部API接口 | +| WebSocket推送服务 | 15 | 事件推送 | +| 软电话条组件 | 25 | 前端组件、WebRTC集成 | +| 预测式外呼引擎 | 30 | 外呼算法、任务管理 | +| 机器人外呼模块 | 20 | TTS集成、按键采集 | +| 呼入机器人模块 | 25 | ASR/NLU集成、对话流程 | +| 录音管理模块 | 10 | 录音存储、检索 | +| 班长监控模块 | 15 | 监听、强插、强拆 | +| 实时监控大屏 | 20 | 前端大屏、实时数据 | +| 高可用部署 | 15 | 主备切换、Keepalived | +| 联调测试 | 30 | 全流程测试 | +| **合计** | **350人天** | | + +**按人天单价1500-2500元估算,开发成本约:52.5-87.5万元** + +--- + +## 第八章 预算汇总 + +### 8.1 一次性投入 + +| 项目 | 费用(万元) | +|------|-------------| +| 硬件采购 | 47-80.5 | +| 软件(开源为主) | 0 | +| 开发成本 | 52.5-87.5 | +| 实施部署 | 5-10 | +| **一次性投入合计** | **104.5-178** | + +### 8.2 年度运营费用 + +| 项目 | 月费用(万元) | 年费用(万元) | 备注 | +|------|--------------|---------------|------| +| **线路月租** | | | | +| 400号码(3个) | 0.3-1.5 | 3.6-18 | 3条业务线独立号码 | +| SIP中继并发费(120路) | 0.6-1.2 | 7.2-14.4 | 按50-100元/路/月 | +| **通信费** | | | | +| 呼入通话费 | 5-9 | 60-108 | 180万分钟/月×0.03-0.05元 | +| 呼出通话费 | 21.6-40.5 | 259-486 | 270万分钟/月×0.08-0.15元 | +| **云服务费** | | | | +| 阿里云ASR | 2-5 | 24-60 | 按使用量 | +| 阿里云TTS | 1-3 | 12-36 | 按使用量 | +| **其他** | | | | +| 机房/带宽 | 1-2 | 12-24 | 如自有机房可降低 | +| 系统维护 | 1-2 | 12-24 | 人员/备件 | +| **年度运营合计** | | **390-770** | | + +### 8.3 总预算汇总 + +| 项目 | 费用(万元) | +|------|-------------| +| **首年投入** | 494.5-948(一次性+首年运营) | +| **后续每年** | 390-770(运营费用) | + +> ⚠️ **说明:** +> - 通信费用是大头,约占年度成本的80%以上 +> - 具体费用取决于运营商议价、实际话务量 +> - 可通过接通率优化、IVR分流等降低通信成本 + +--- + +## 第九章 项目里程碑建议 + +按照3-4个月上线周期规划: + +| 阶段 | 周期 | 主要工作 | 交付物 | +|------|------|---------|--------| +| **一、需求确认与设计** | 第1-2周 | 需求评审、技术方案设计、架构设计 | 技术方案文档、接口设计文档 | +| **二、环境搭建** | 第3-4周 | 硬件采购到货、FreeSWITCH环境部署、线路对接 | 基础环境就绪 | +| **三、核心功能开发** | 第5-10周 | CTI中间件、API服务、坐席管理、呼入呼出基础功能 | 核心功能可用 | +| **四、高级功能开发** | 第11-14周 | 预测式外呼、机器人模块、IVR、监控大屏 | 全功能开发完成 | +| **五、集成联调** | 第15-16周 | CRM对接、全流程联调、高可用测试 | 联调通过 | +| **六、测试与优化** | 第17-18周 | 功能测试、性能测试、Bug修复 | 测试报告 | +| **七、试运行** | 第19-20周 | 小范围上线、问题收集、优化调整 | 试运行报告 | +| **八、正式上线** | 第21周 | 全面上线、监控保障 | 系统上线 | + +``` +第1月 第2月 第3月 第4月 第5月 +|----|----|----|----|----|----|----|----|----|----| +[需求设计][环境搭建][====核心功能开发====][==高级功能==] + [集成联调][测试] + [试运行][上线] +``` + +--- + +## 第十章 风险与建议 + +### 10.1 项目风险 + +| 风险项 | 风险等级 | 影响 | 应对措施 | +|-------|---------|------|---------| +| FreeSWITCH技术门槛高 | 高 | 开发进度延迟 | 建议团队提前学习ESL开发,或引入有经验顾问 | +| 线路对接周期不可控 | 中 | 影响联调测试 | 提前与运营商沟通,预留缓冲时间 | +| ASR识别效果不及预期 | 中 | 影响机器人体验 | 提前做语料测试,必要时做热词优化 | +| 高可用切换影响业务 | 高 | 道路救援中断 | 充分测试切换机制,演练故障场景 | +| 录音存储空间不足 | 低 | 录音丢失 | 监控存储空间,提前扩容 | + +### 10.2 建议事项 + +1. **团队能力准备**:建议团队提前熟悉FreeSWITCH、ESL、SIP协议相关知识 +2. **分阶段上线**:可先上线基础呼入呼出功能,机器人功能迭代上线 +3. **压力测试**:上线前务必进行150坐席并发的压力测试 +4. **灰度发布**:建议先在一条业务线(如家政)试运行,再推广到道路救援 +5. **监控告警**:完善监控体系,特别是对道路救援线路的可用性监控 + +--- + +## 附录 + +### 附录A:术语表 +(见第一章1.4节) + +### 附录B:接口详细设计 +(需在技术设计阶段细化) + +### 附录C:IVR流程图 +(需在需求确认阶段补充) + +### 附录D:机器人话术模板 +(需在需求确认阶段补充) + +--- + +**文档结束** \ No newline at end of file diff --git a/cc-center/企业呼叫中心系统项目立项书.txt b/cc-center/企业呼叫中心系统项目立项书.txt new file mode 100644 index 0000000..5c42e3f --- /dev/null +++ b/cc-center/企业呼叫中心系统项目立项书.txt @@ -0,0 +1,711 @@ +**项目名称**:企业呼叫中心系统建设项目 +**项目编号**:CC-2024-001 +**编制日期**:2024年1月 +**编 制 人**:_________________ +**审 核 人**:_________________ +**批 准 人**:_________________ + +--- + +## 文档修订记录 + +| 版本 | 日期 | 修订内容 | 修订人 | 审核人 | +|------|------|---------|--------|--------| +| V1.0 | 2024-01-XX | 初稿 | | | + +--- + +## 目录 + +1. [项目概述](#第一章-项目概述) +2. [项目背景与必要性](#第二章-项目背景与必要性) +3. [项目目标](#第三章-项目目标) +4. [项目范围](#第四章-项目范围) +5. [项目建设方案](#第五章-项目建设方案) +6. [项目投资预算](#第六章-项目投资预算) +7. [项目效益分析](#第七章-项目效益分析) +8. [项目实施计划](#第八章-项目实施计划) +9. [项目组织架构](#第九章-项目组织架构) +10. [风险分析与应对](#第十章-风险分析与应对) +11. [结论与建议](#第十一章-结论与建议) + +--- + +## 第一章 项目概述 + +### 1.1 项目名称 + +企业呼叫中心系统建设项目 + +### 1.2 项目建设单位 + +**单位名称**:_________________(企业名称) +**负 责 人**:_________________ +**联系方式**:_________________ + +### 1.3 项目概要 + +本项目旨在建设一套集**呼入呼出、智能IVR、机器人客服、预测式外呼**于一体的企业级呼叫中心系统,支撑公司道路救援、家政服务、代驾服务三大业务板块的客户服务与营销运营工作。 + +| 项目要素 | 内容描述 | +|---------|---------| +| **服务对象** | 个人消费者(ToC) | +| **业务范围** | 道路救援、家政服务、代驾服务 | +| **坐席规模** | 150坐席 | +| **日话务量** | 50,000通/日 | +| **服务时间** | 7×24小时 | +| **建设周期** | 3-4个月 | +| **建设方式** | 自主研发(基于FreeSWITCH开源平台) | +| **部署方式** | 私有化部署(主备高可用架构) | + +### 1.4 项目总投资 + +| 投资类别 | 金额(万元) | +|---------|-------------| +| 一次性建设投资 | 104.5-178 | +| 首年运营费用 | 390-770 | +| **首年总投入** | **494.5-948** | + +--- + +## 第二章 项目背景与必要性 + +### 2.1 企业现状 + +本企业主营**道路救援、家政服务、代驾服务**三大业务,面向个人消费者提供上门服务。随着业务规模的持续扩大,现有的客户服务模式已无法满足业务发展需求: + +**现状问题:** + +| 问题领域 | 具体问题 | 影响 | +|---------|---------|------| +| **客服能力** | 无统一呼叫平台,多部门分散接听 | 客户体验差,管理困难 | +| **响应效率** | 道路救援等紧急需求响应慢 | 客户流失,品牌受损 | +| **服务时间** | 夜间/节假日服务能力不足 | 错失订单,客户投诉 | +| **外呼效率** | 人工逐一拨打,效率低下 | 人力成本高,触达率低 | +| **数据管理** | 通话无录音,无法追溯 | 纠纷处理困难,质量无法管控 | +| **系统集成** | 与CRM系统无法打通 | 信息孤岛,坐席重复操作 | + +### 2.2 建设必要性 + +#### 2.2.1 业务发展的迫切需要 + +``` + 业务增长趋势 + 话务量 + ↑ + 60000│ ╭──── 预测增长 + │ ╭────╯ + 50000│ ╭────╯ ←── 当前日均50000通 + │ ╭────╯ + 40000│ ╭────╯ + │ ╭────╯ + 30000│╭────╯ + │ + └────────────────────────────────────→ 时间 + 2022 2023 2024 2025 +``` + +随着业务规模扩大,日话务量已达**50,000通**,预计未来2年将持续增长。迫切需要建设专业呼叫中心系统支撑业务发展。 + +#### 2.2.2 客户体验提升的需要 + +| 客户痛点 | 系统解决方案 | +|---------|-------------| +| 打电话难以接通 | 150坐席+智能排队+溢出机制 | +| 等待时间长 | IVR自助分流+机器人预处理 | +| 反复描述问题 | CRM弹屏,坐席即时了解客户信息 | +| 投诉处理无反馈 | 录音追溯+工单闭环 | + +#### 2.2.3 运营效率提升的需要 + +| 运营痛点 | 系统解决方案 | +|---------|-------------| +| 外呼效率低 | 预测式外呼,坐席利用率提升50%+ | +| 通知类工作繁重 | 机器人自动批量通知 | +| 回访覆盖率低 | 机器人自动回访+满意度调查 | +| 管理缺乏抓手 | 实时监控大屏+班长监控 | + +#### 2.2.4 合规与风控的需要 + +- 道路救援涉及紧急服务,需确保系统**高可用** +- 服务过程需**全程录音**,便于纠纷处理 +- 需与现有CRM系统**无缝集成**,确保数据安全 + +### 2.3 建设可行性 + +#### 2.3.1 技术可行性 + +| 技术领域 | 可行性分析 | +|---------|-----------| +| **呼叫平台** | FreeSWITCH开源成熟,已广泛应用于企业呼叫中心 | +| **智能语音** | 阿里云ASR/TTS技术成熟,识别准确率>95% | +| **系统集成** | 标准API/WebSocket接口,与现有CRM可顺利对接 | +| **高可用** | 主备架构+Keepalived方案成熟可靠 | + +#### 2.3.2 团队可行性 + +| 条件 | 评估 | +|------|------| +| 自有技术团队 | ✅ 具备自主开发能力 | +| FreeSWITCH经验 | ⚠️ 需提前培训或引入顾问支持 | +| 项目管理能力 | ✅ 具备中大型项目实施经验 | + +#### 2.3.3 经济可行性 + +- 自主研发相比采购商业产品**节省授权费用** +- 私有化部署**长期成本可控** +- 项目投资回报分析详见第七章 + +--- + +## 第三章 项目目标 + +### 3.1 总体目标 + +建设一套**安全、稳定、高效、智能**的企业级呼叫中心系统,实现客户服务统一接入、智能化分流、高效外呼,全面提升客户服务体验与运营效率。 + +### 3.2 具体目标 + +#### 3.2.1 能力目标 + +| 目标项 | 指标要求 | +|-------|---------| +| 坐席并发能力 | 支持150坐席同时在线 | +| 通话并发能力 | 支持120路并发通话 | +| 日处理能力 | 支持50,000通/日 | +| 系统可用性 | ≥99.9%(全年停机<8.76小时) | +| 故障切换时间 | ≤30秒 | + +#### 3.2.2 效率目标 + +| 目标项 | 当前值 | 目标值 | 提升幅度 | +|-------|-------|-------|---------| +| 人工坐席利用率 | 约40% | ≥70% | +75% | +| 外呼接通后转接时间 | N/A(人工拨号) | ≤3秒 | - | +| 批量通知人工耗时 | 100%人工 | 0%(全自动) | 释放人力 | +| 客户等待时长 | 无统计 | 平均<30秒 | - | + +#### 3.2.3 体验目标 + +| 目标项 | 指标要求 | +|-------|---------| +| 首次呼叫解决率 | ≥80% | +| IVR自助分流率 | ≥30% | +| 客户满意度 | ≥90% | + +### 3.3 建设原则 + +| 原则 | 说明 | +|------|------| +| **统一规划** | 三大业务线统一平台,避免重复建设 | +| **安全可靠** | 主备高可用,确保道路救援等紧急服务不中断 | +| **开放集成** | 标准API接口,与CRM/业务系统无缝对接 | +| **智能高效** | 引入AI能力,提升服务效率与体验 | +| **弹性扩展** | 架构支持未来扩展至300+坐席 | +| **自主可控** | 自主研发,核心技术自主掌握 | + +--- + +## 第四章 项目范围 + +### 4.1 业务范围 + +| 业务线 | 呼入场景 | 呼出场景 | +|-------|---------|---------| +| **道路救援** | 叫救援、咨询、投诉 | 回访、满意度调查、到达通知 | +| **家政服务** | 预约服务、咨询、投诉 | 回访、营销推广、上门提醒 | +| **代驾服务** | 叫代驾、咨询、投诉 | 回访、营销推广、到达通知 | + +### 4.2 功能范围 + +#### 4.2.1 本期建设范围(一期) + +| 模块 | 功能项 | 优先级 | +|------|-------|--------| +| **基础通话** | 呼入接听、呼出拨打、转接、保持、三方通话 | P0 | +| **智能IVR** | 语音导航、按键导航、语音识别、多业务分流 | P0 | +| **ACD分配** | 技能组管理、多种分配策略、排队溢出 | P0 | +| **坐席管理** | 签入签出、状态管理、软电话条 | P0 | +| **预测式外呼** | 批量外呼任务、自动拨打、接通转坐席 | P0 | +| **机器人外呼** | 批量通知、TTS播报、按键采集 | P0 | +| **呼入机器人** | FAQ问答、意图识别、转人工 | P0 | +| **录音管理** | 全程录音、录音存储、录音检索下载 | P0 | +| **班长监控** | 监听、强插、强拆 | P0 | +| **监控大屏** | 实时数据展示、坐席状态、排队监控 | P0 | +| **系统集成** | CRM弹屏、API接口、事件推送 | P0 | +| **高可用** | 主备部署、故障切换 | P0 | + +#### 4.2.2 二期规划范围(本期不含) + +| 模块 | 功能项 | 说明 | +|------|-------|------| +| **统计报表** | 话务报表、坐席绩效、外呼分析 | 二期建设 | +| **智能质检** | 语音转写、关键词检测、情绪分析 | 二期建设 | +| **密语功能** | 班长对坐席单向指导 | 二期建设 | +| **短信功能** | 不涉及,由第三方平台提供 | 不纳入 | + +### 4.3 集成范围 + +| 集成系统 | 集成方式 | 集成内容 | +|---------|---------|---------| +| **CRM系统** | API双向对接 | 来电弹屏、客户资料、工单创建 | +| **业务系统** | API对接 | 外呼任务推送、通知触发、结果回传 | +| **阿里云语音** | API调用 | ASR语音识别、TTS语音合成 | +| **NLU平台** | API对接 | 意图识别、对话管理 | + +--- + +## 第五章 项目建设方案 + +### 5.1 总体架构 + +``` +┌─────────────────────────────────────────────────────────────────────────┐ +│ 用户层 │ +│ 道路救援客户 家政服务客户 代驾服务客户 │ +│ │ │ │ │ +│ ▼ ▼ ▼ │ +│ 400-XXX-XXX1 400-XXX-XXX2 固话/400 │ +└─────────────────────────────────────────────────────────────────────────┘ + │ + ▼ +┌─────────────────────────────────────────────────────────────────────────┐ +│ 接入层 │ +│ 运营商SIP中继线路 │ +└─────────────────────────────────────────────────────────────────────────┘ + │ + ▼ +┌─────────────────────────────────────────────────────────────────────────┐ +│ 呼叫控制层 │ +│ ┌──────────────────────────────────────────────────────────────────┐ │ +│ │ FreeSWITCH (主备高可用) │ │ +│ │ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ │ │ +│ │ │ 呼入控制│ │ 呼出控制│ │智能IVR │ │ ACD分配│ │ 录音模块│ │ │ +│ │ └────────┘ └────────┘ └────────┘ └────────┘ └────────┘ │ │ +│ └──────────────────────────────────────────────────────────────────┘ │ +└─────────────────────────────────────────────────────────────────────────┘ + │ + ▼ +┌─────────────────────────────────────────────────────────────────────────┐ +│ 业务服务层 │ +│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ +│ │CTI中间件 │ │API Gateway│ │ WS推送 │ │ 外呼引擎 │ │ 机器人引擎│ │ +│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │ +└─────────────────────────────────────────────────────────────────────────┘ + │ + ▼ +┌─────────────────────────────────────────────────────────────────────────┐ +│ 数据层 │ +│ ┌──────────┐ ┌──────────┐ ┌──────────────┐ │ +│ │ MySQL │ │ Redis │ │ NAS存储 │ │ +│ │ (主从集群) │ │(Sentinel)│ │ (录音) │ │ +│ └──────────┘ └──────────┘ └──────────────┘ │ +└─────────────────────────────────────────────────────────────────────────┘ + │ + ▼ +┌─────────────────────────────────────────────────────────────────────────┐ +│ 集成层 │ +│ ┌──────────┐ ┌──────────┐ ┌──────────────┐ │ +│ │ CRM系统 │ │ 业务系统 │ │ 阿里云ASR/TTS│ │ +│ └──────────┘ └──────────┘ └──────────────┘ │ +└─────────────────────────────────────────────────────────────────────────┘ + │ + ▼ +┌─────────────────────────────────────────────────────────────────────────┐ +│ 终端层 │ +│ ┌──────────────┐ ┌──────────────┐ │ +│ │ IP话机 │ │ 软电话条 │ │ +│ │ (150台) │ │ (嵌入CRM) │ │ +│ └──────────────┘ └──────────────┘ │ +└─────────────────────────────────────────────────────────────────────────┘ +``` + +### 5.2 部署架构 + +采用**私有化部署+主备高可用**架构: + +``` + ┌─────────────────┐ + │ 虚拟IP(VIP) │ + │ SIP线路接入 │ + └────────┬────────┘ + │ + ┌─────────────────────┴─────────────────────┐ + │ │ + ▼ ▼ + ┌─────────────────┐ ┌─────────────────┐ + │ 主服务器 │◄──── Keepalived ────►│ 备服务器 │ + ├─────────────────┤ 心跳检测 ├─────────────────┤ + │ FreeSWITCH │ │ FreeSWITCH │ + │ CTI中间件 │ │ CTI中间件 │ + │ API服务 │ │ API服务 │ + │ WebSocket服务 │ │ WebSocket服务 │ + └────────┬────────┘ └────────┬────────┘ + │ │ + └─────────────────────┬─────────────────────┘ + │ + ┌─────────────────────────┼─────────────────────────┐ + │ │ │ + ▼ ▼ ▼ +┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ +│ MySQL主从集群 │ │ Redis Sentinel │ │ NAS存储 │ +│ (2节点) │ │ (3节点) │ │ (RAID冗余) │ +└─────────────────┘ └─────────────────┘ └─────────────────┘ +``` + +### 5.3 技术选型 + +| 组件类型 | 技术选型 | 选型理由 | +|---------|---------|---------| +| **媒体服务器** | FreeSWITCH 1.10+ | 开源成熟、性能优异、功能完善 | +| **操作系统** | Rocky Linux 8/CentOS 8 | 稳定可靠、长期支持 | +| **开发语言** | Java/Golang | CTI中间件、API服务 | +| **前端框架** | Vue.js 3.x | 软电话条、监控大屏 | +| **数据库** | MySQL 8.0 | 成熟稳定、主从复制 | +| **缓存** | Redis 6.x | 高性能、Sentinel高可用 | +| **消息队列** | RabbitMQ/Kafka | 事件异步处理(可选) | +| **负载均衡** | Nginx | 反向代理、SSL卸载 | +| **高可用** | Keepalived | VIP漂移、故障切换 | +| **监控** | Prometheus + Grafana | 系统监控、告警 | +| **ASR/TTS** | 阿里云智能语音 | 识别准确率高、服务稳定 | + +### 5.4 网络规划 + +| 网络区域 | 网段规划 | 用途 | +|---------|---------|------| +| **业务网段** | 10.10.1.0/24 | 呼叫中心服务器 | +| **数据网段** | 10.10.2.0/24 | 数据库、存储 | +| **坐席网段** | 10.10.10.0/23 | 坐席终端、IP话机 | +| **管理网段** | 10.10.100.0/24 | 运维管理 | +| **SIP信令** | 独立VLAN | SIP中继对接 | + +### 5.5 号码规划 + +| 业务线 | 号码类型 | 号码 | 用途 | +|-------|---------|------|------| +| 道路救援 | 400号码 | 400-XXX-XXX1 | 客户呼入 | +| 家政服务 | 400号码 | 400-XXX-XXX2 | 客户呼入 | +| 代驾服务 | 400/固话 | 400-XXX-XXX3 | 客户呼入 | +| 外呼显号 | 固话 | 0XX-XXXXXXXX | 外呼主叫显示 | + +--- + +## 第六章 项目投资预算 + +### 6.1 投资概算汇总 + +| 投资类别 | 金额(万元) | 占比 | +|---------|-------------|------| +| 硬件设备 | 47-80.5 | 33%-45% | +| 软件及开发 | 52.5-87.5 | 37%-49% | +| 实施部署 | 5-10 | 4%-6% | +| **一次性投资合计** | **104.5-178** | **100%** | + +### 6.2 硬件投资明细 + +| 序号 | 设备名称 | 规格 | 数量 | 单价(万) | 合计(万) | +|-----|---------|------|------|---------|---------| +| 1 | 应用服务器 | 32核/64GB/500GB SSD+2TB | 2 | 5-8 | 10-16 | +| 2 | 数据库服务器 | 16核/64GB/1TB SSD | 2 | 4-6 | 8-12 | +| 3 | Redis服务器 | 8核/32GB/500GB SSD | 3 | 2-3 | 6-9 | +| 4 | NAS存储 | 96TB可用(RAID) | 1 | 8-15 | 8-15 | +| 5 | 网络交换机 | 千兆三层 | 2 | 1-2 | 2-4 | +| 6 | 防火墙 | 企业级 | 1 | 2-5 | 2-5 | +| 7 | IP话机 | SIP话机 | 150 | 0.05-0.08 | 7.5-12 | +| 8 | 坐席耳麦 | 专业话务耳麦 | 150 | 0.02-0.05 | 3-7.5 | +| | **硬件合计** | | | | **47-80.5** | + +### 6.3 软件及开发投资明细 + +| 序号 | 项目 | 说明 | 费用(万) | +|-----|------|------|---------| +| 1 | FreeSWITCH | 开源免费 | 0 | +| 2 | 操作系统 | Rocky Linux开源 | 0 | +| 3 | MySQL/Redis | 社区版开源 | 0 | +| 4 | 系统开发 | 350人天×1500-2500元 | 52.5-87.5 | +| | **软件及开发合计** | | **52.5-87.5** | + +### 6.4 实施部署投资 + +| 序号 | 项目 | 费用(万) | +|-----|------|---------| +| 1 | 硬件安装调试 | 1-2 | +| 2 | 网络部署配置 | 1-2 | +| 3 | 系统联调测试 | 2-4 | +| 4 | 培训及上线支持 | 1-2 | +| | **实施部署合计** | **5-10** | + +### 6.5 年度运营费用 + +| 项目 | 月费用(万) | 年费用(万) | +|------|-----------|-----------| +| **线路费用** | | | +| 400号码月租(3个) | 0.3-1.5 | 3.6-18 | +| SIP并发费(120路) | 0.6-1.2 | 7.2-14.4 | +| **通信费用** | | | +| 呼入通话费 | 5-9 | 60-108 | +| 呼出通话费 | 21.6-40.5 | 259-486 | +| **云服务费用** | | | +| 阿里云ASR | 2-5 | 24-60 | +| 阿里云TTS | 1-3 | 12-36 | +| **运维费用** | | | +| 机房/带宽 | 1-2 | 12-24 | +| 系统维护 | 1-2 | 12-24 | +| **年度运营合计** | | **390-770** | + +### 6.6 投资估算汇总表 + +| 项目 | 首年(万) | 第二年(万) | 第三年(万) | +|------|---------|-----------|-----------| +| 一次性建设投入 | 104.5-178 | - | - | +| 年度运营费用 | 390-770 | 390-770 | 390-770 | +| **年度总计** | **494.5-948** | **390-770** | **390-770** | +| **三年累计** | | | **1274.5-2488** | + +--- + +## 第七章 项目效益分析 + +### 7.1 经济效益 + +#### 7.1.1 人力成本节约 + +| 节约项 | 计算依据 | 年节约(万) | +|-------|---------|-----------| +| **外呼效率提升** | 坐席利用率从40%→70%,相当于节约45个坐席人力 | 45×8=360 | +| **批量通知自动化** | 原需5人专职,现全自动 | 5×8=40 | +| **回访自动化** | 原需10人,现机器人承担80% | 8×8=64 | +| **IVR自助分流** | 30%简单咨询自助解决,节约人力 | 15×8=120 | +| **年人力成本节约** | | **约584万** | + +> 注:按坐席人均年成本8万元估算 + +#### 7.1.2 业务增收 + +| 增收项 | 计算依据 | 年增收(万) | +|-------|---------|-----------| +| **接通率提升** | 减少客户流失,预计增收5% | 约200 | +| **外呼营销转化** | 新增营销触达能力 | 约150 | +| **年业务增收** | | **约350万** | + +#### 7.1.3 投资回报分析 + +| 指标 | 数值 | +|------|------| +| 一次性投入 | 141万(取中值) | +| 年运营成本 | 580万(取中值) | +| 年成本节约 | 584万 | +| 年业务增收 | 350万 | +| **年净收益** | **354万** | +| **投资回收期** | **约4.8个月** | + +### 7.2 管理效益 + +| 效益项 | 说明 | +|-------|------| +| **服务可追溯** | 全程录音,服务质量可追溯,纠纷可举证 | +| **管理可视化** | 实时监控大屏,管理者实时掌握运营状态 | +| **决策有依据** | 话务数据积累,为排班、扩容提供数据支撑 | +| **流程标准化** | IVR+机器人固化服务流程,服务质量稳定 | + +### 7.3 客户效益 + +| 效益项 | 说明 | +|-------|------| +| **接通率提升** | 专业排队机制,减少占线挂断 | +| **等待时间缩短** | IVR分流+智能分配,平均等待<30秒 | +| **服务体验提升** | 来电自动识别,坐席了解客户历史,避免重复描述 | +| **服务时间扩展** | 7×24小时服务,紧急需求随时响应 | + +--- + +## 第八章 项目实施计划 + +### 8.1 项目周期 + +**总工期:4个月(17周)** + +### 8.2 阶段划分 + +``` + 1月 2月 3月 4月 5月 + |----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----| +W1 W2 W3 W4 W5 W6 W7 W8 W9 W10 W11 W12 W13 W14 W15 W16 W17 W18 + +[需求设计 ] + [环境搭建 ] + [========= 核心功能开发 =========] + [=== 高级功能开发 ===] + [集成联调] + [测试优化] + [试运行][上线] +``` + +### 8.3 里程碑计划 + +| 里程碑 | 计划时间 | 交付物 | 验收标准 | +|-------|---------|-------|---------| +| **M1: 需求确认** | 第2周末 | 需求规格说明书、技术方案 | 评审通过 | +| **M2: 环境就绪** | 第4周末 | 硬件到位、基础环境部署完成 | FreeSWITCH可接打电话 | +| **M3: 核心功能完成** | 第10周末 | 呼入呼出、ACD、坐席管理、API | 核心流程跑通 | +| **M4: 全功能完成** | 第14周末 | 外呼、机器人、监控大屏 | 全部功能可用 | +| **M5: 联调测试完成** | 第16周末 | CRM集成完成、测试报告 | 全流程联调通过 | +| **M6: 试运行完成** | 第18周末 | 试运行报告 | 问题收敛,达到上线标准 | +| **M7: 正式上线** | 第19周 | 上线报告 | 系统平稳运行 | + +### 8.4 详细进度计划 + +| 阶段 | 时间 | 主要任务 | 交付物 | +|------|------|---------|--------| +| **一、需求设计** | W1-W2 | 需求评审、架构设计、接口设计、详细设计 | 技术方案、接口文档、设计文档 | +| **二、环境搭建** | W3-W4 | 硬件采购到货、网络部署、FreeSWITCH安装、线路对接 | 基础环境就绪 | +| **三、核心开发** | W5-W10 | CTI中间件、API服务、坐席管理、ACD、录音、软电话条 | 核心功能可用 | +| **四、高级开发** | W11-W14 | 预测式外呼、机器人模块、IVR语音识别、监控大屏 | 高级功能可用 | +| **五、集成联调** | W15-W16 | CRM对接、全流程联调、高可用测试 | 联调通过 | +| **六、测试优化** | W16-W17 | 功能测试、性能测试、安全测试、Bug修复 | 测试报告 | +| **七、试运行** | W18 | 小范围上线、问题收集 | 试运行报告 | +| **八、正式上线** | W19 | 全面上线、监控保障 | 上线完成 | + +--- + +## 第九章 项目组织架构 + +### 9.1 组织架构图 + +``` + ┌─────────────────┐ + │ 项目发起人 │ + │ (公司高层) │ + └────────┬────────┘ + │ + ┌────────▼────────┐ + │ 项目经理 │ + │ (总体负责) │ + └────────┬────────┘ + │ + ┌────────────────────────┼────────────────────────┐ + │ │ │ + ▼ ▼ ▼ +┌───────────────┐ ┌───────────────┐ ┌───────────────┐ +│ 技术开发组 │ │ 业务需求组 │ │ 测试实施组 │ +├───────────────┤ ├───────────────┤ ├───────────────┤ +│ · 架构师 │ │ · 业务分析师 │ │ · 测试工程师 │ +│ · 后端开发 │ │ · 产品经理 │ │ · 实施工程师 │ +│ · 前端开发 │ │ · 业务对接人 │ │ · 运维工程师 │ +│ · FreeSWITCH │ │ │ │ │ +└───────────────┘ └───────────────┘ └───────────────┘ +``` + +### 9.2 角色职责 + +| 角色 | 人数 | 职责 | +|------|------|------| +| **项目发起人** | 1 | 项目决策、资源协调、重大问题决策 | +| **项目经理** | 1 | 项目整体管理、进度控制、风险管理、对外沟通 | +| **架构师** | 1 | 技术架构设计、技术选型、技术难点攻关 | +| **后端开发** | 3-4 | CTI中间件、API服务、外呼引擎、机器人模块开发 | +| **前端开发** | 1-2 | 软电话条、监控大屏开发 | +| **FreeSWITCH工程师** | 1-2 | FreeSWITCH配置、IVR开发、ESL对接 | +| **业务分析师** | 1 | 需求分析、业务流程梳理 | +| **测试工程师** | 1-2 | 测试用例、功能测试、性能测试 | +| **实施工程师** | 1 | 环境部署、系统上线 | +| **运维工程师** | 1 | 系统运维、监控告警 | +| **合计** | **12-16人** | | + +### 9.3 沟通机制 + +| 会议类型 | 频率 | 参与人 | 内容 | +|---------|------|-------|------| +| **项目周会** | 每周一次 | 全体成员 | 进度汇报、问题协调、下周计划 | +| **每日站会** | 每日 | 开发+测试 | 当日任务、阻塞问题 | +| **技术评审会** | 按需 | 技术组 | 技术方案评审、代码评审 | +| **里程碑汇报** | 每里程碑 | 项目经理+发起人 | 阶段成果、风险汇报 | +| **上线评审会** | 上线前 | 全体+业务方 | 上线准备度检查 | + +--- + +## 第十章 风险分析与应对 + +### 10.1 风险清单 + +| 风险编号 | 风险描述 | 可能性 | 影响程度 | 风险等级 | +|---------|---------|--------|---------|---------| +| R01 | FreeSWITCH技术门槛高,团队经验不足 | 高 | 高 | **高** | +| R02 | 运营商线路对接周期长 | 中 | 高 | **高** | +| R03 | CRM系统对接复杂度超预期 | 中 | 中 | **中** | +| R04 | ASR识别效果不及预期 | 中 | 中 | **中** | +| R05 | 硬件采购/到货延迟 | 低 | 高 | **中** | +| R06 | 并发性能不达标 | 低 | 高 | **中** | +| R07 | 关键人员离职 | 低 | 高 | **中** | +| R08 | 需求变更频繁 | 中 | 中 | **中** | + +### 10.2 应对措施 + +| 风险编号 | 应对措施 | 责任人 | +|---------|---------|--------| +| **R01** | 1. 项目前期组织FreeSWITCH专项培训
2. 考虑引入外部FreeSWITCH顾问支持
3. 预留20%时间缓冲 | 项目经理 | +| **R02** | 1. 提前2个月启动线路申请
2. 准备备选运营商
3. 先用测试线路开发,并行对接正式线路 | 项目经理 | +| **R03** | 1. 需求阶段明确接口规范
2. 预留接口联调时间
3. CRM团队提前介入 | 架构师 | +| **R04** | 1. 提前进行ASR效果测试
2. 准备热词优化方案
3. 设计降级策略(按键兜底) | 技术组 | +| **R05** | 1. 提前下单采购
2. 准备备选供应商
3. 先用云主机开发 | 项目经理 | +| **R06** | 1. 上线前进行压力测试
2. 准备扩容方案
3. 架构支持水平扩展 | 架构师 | +| **R07** | 1. 知识文档化
2. 关键模块双人备份
3. 提前储备人员 | 项目经理 | +| **R08** | 1. 需求基线管理
2. 变更走评审流程
3. 评估变更影响后决策 | 产品经理 | + +### 10.3 风险监控 + +| 风险等级 | 监控频率 | 汇报层级 | +|---------|---------|---------| +| **高** | 每周跟踪 | 项目发起人 | +| **中** | 双周跟踪 | 项目经理 | +| **低** | 月度跟踪 | 项目组 | + +--- + +## 第十一章 结论与建议 + +### 11.1 结论 + +经过全面分析,本项目具备以下条件: + +| 维度 | 评估结论 | +|------|---------| +| **必要性** | ✅ 业务发展迫切需要,现有模式已无法支撑 | +| **可行性** | ✅ 技术方案成熟,团队具备基本能力 | +| **经济性** | ✅ 投资回报期短(约4.8个月),效益显著 | +| **风险性** | ⚠️ 存在技术风险,但可通过措施控制 | + +**综合结论:项目具备立项条件,建议批准立项。** + +### 11.2 建议 + +1. **尽快启动**:业务增长迅速,建议尽快批准立项,启动实施 +2. **技术准备**:建议在项目正式启动前,组织FreeSWITCH技术培训 +3. **线路先行**:建议立即启动运营商线路申请,避免成为关键路径 +4. **分步上线**:建议优先上线家政业务,验证后再推广至道路救援 +5. **预留缓冲**:建议预留10%-20%预算和时间缓冲,应对不确定性 +6. **运维同步**:建议运维人员全程参与,确保上线后平稳运行 + +### 11.3 审批意见 + +| 审批环节 | 审批人 | 日期 | 意见 | +|---------|-------|------|------| +| **技术评审** | | | | +| **财务评审** | | | | +| **业务评审** | | | | +| **最终审批** | | | | + +--- + +## 附件清单 + +| 附件编号 | 附件名称 | 说明 | +|---------|---------|------| +| 附件1 | 《呼叫中心系统需求规格说明书》 | 详细需求文档 | +| 附件2 | 硬件选型参考清单 | 硬件详细配置及备选品牌 | +| 附件3 | 运营商线路资费对比 | 各运营商资费方案对比 | +| 附件4 | FreeSWITCH技术评估报告 | 技术可行性详细分析(如有) | + +--- + +**文档结束** diff --git a/cc-center/呼叫中心系统开发方案.txt b/cc-center/呼叫中心系统开发方案.txt new file mode 100644 index 0000000..c7ee270 --- /dev/null +++ b/cc-center/呼叫中心系统开发方案.txt @@ -0,0 +1,1321 @@ +**文档版本**:V1.0 +**编制日期**:2024年1月 +**项目周期**:4个月(17周) + +--- + +## 一、开发方案概述 + +### 1.1 项目背景回顾 + +| 项目要素 | 内容 | +|---------|------| +| 业务范围 | 道路救援、家政服务、代驾服务 | +| 坐席规模 | 150坐席 | +| 日话务量 | 50,000通 | +| 技术路线 | 自研(基于FreeSWITCH) | +| 部署方式 | 私有化 + 主备高可用 | + +### 1.2 开发目标 + +``` +┌─────────────────────────────────────────────────────────────────────────┐ +│ 系统能力目标 │ +├─────────────────────────────────────────────────────────────────────────┤ +│ ✓ 150坐席并发 ✓ 120路并发通话 ✓ 99.9%可用性 │ +│ ✓ 7×24小时服务 ✓ 故障30秒内切换 ✓ API响应<200ms │ +└─────────────────────────────────────────────────────────────────────────┘ +``` + +--- + +## 二、系统架构设计 + +### 2.1 整体架构 + +``` +┌─────────────────────────────────────────────────────────────────────────┐ +│ 外部系统 │ +│ CRM系统 业务系统 阿里云语音 │ +└──────────┬───────────────────────┬────────────────────┬─────────────────┘ + │ │ │ + │ REST API / WebSocket │ + │ │ │ +┌──────────▼───────────────────────▼────────────────────▼─────────────────┐ +│ CTI中间件层 │ +│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ +│ │ API网关 │ │ 坐席服务 │ │ 呼叫服务 │ │ 外呼引擎 │ │ +│ │ (Gateway) │ │ (Agent) │ │ (Call) │ │ (Dialer) │ │ +│ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ │ +│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ +│ │ ACD服务 │ │ 队列服务 │ │ 监控服务 │ │ 机器人服务 │ │ +│ │ (ACD) │ │ (Queue) │ │ (Monitor) │ │ (Robot) │ │ +│ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ │ +│ ┌─────────────┐ ┌─────────────┐ │ +│ │ ESL连接池 │ │ 事件分发器 │ │ +│ │ (ESL Pool) │ │ (Dispatcher)│ │ +│ └──────┬──────┘ └──────┬──────┘ │ +└─────────┼────────────────┼──────────────────────────────────────────────┘ + │ │ + │ ESL协议 │ + │ │ +┌─────────▼────────────────▼──────────────────────────────────────────────┐ +│ FreeSWITCH 媒体层 │ +│ ┌───────────────────────────────────────────────────────────────────┐ │ +│ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │ +│ │ │mod_sofia│ │mod_dptools│ │mod_record│ │mod_lua │ │mod_event│ │ │ +│ │ │ (SIP) │ │(Dialplan)│ │ (录音) │ │ (IVR) │ │ (ESL) │ │ │ +│ │ └─────────┘ └─────────┘ └─────────┘ └─────────┘ └─────────┘ │ │ +│ └───────────────────────────────────────────────────────────────────┘ │ +│ FreeSWITCH Core │ +└─────────────────────────────────┬───────────────────────────────────────┘ + │ + SIP Trunk + │ +┌─────────────────────────────────▼───────────────────────────────────────┐ +│ 运营商网络 │ +│ 400号码 / SIP中继线路 │ +└─────────────────────────────────────────────────────────────────────────┘ +``` + +### 2.2 技术选型 + +| 层级 | 组件 | 技术选型 | 说明 | +|------|------|---------|------| +| **媒体层** | 软交换 | FreeSWITCH 1.10.x | 开源、稳定、功能完善 | +| | SIP协议 | mod_sofia | FreeSWITCH内置 | +| | IVR脚本 | Lua | 灵活、性能好 | +| **中间件层** | 开发语言 | Java 17 + Spring Boot 3 | 团队熟悉、生态成熟 | +| | ESL客户端 | 自研(基于Netty) | 更好的连接管理 | +| | API框架 | Spring WebFlux | 响应式、高性能 | +| | WebSocket | Spring WebSocket | 事件实时推送 | +| **数据层** | 关系数据库 | MySQL 8.0 | 主从复制、读写分离 | +| | 缓存 | Redis 7.0 | Sentinel高可用 | +| | 消息队列 | RabbitMQ | 异步解耦 | +| | 文件存储 | MinIO / NAS | 录音存储 | +| **前端** | 软电话条 | Vue 3 + TypeScript | 组件化、类型安全 | +| | 监控大屏 | Vue 3 + ECharts | 数据可视化 | +| **运维** | 容器化 | Docker + Docker Compose | 简化部署 | +| | 监控 | Prometheus + Grafana | 指标监控 | +| | 日志 | ELK Stack | 日志收集分析 | +| **外部服务** | ASR/TTS | 阿里云智能语音 | 按需调用 | +| | NLU | 指定对话平台 | 意图识别 | + +### 2.3 模块划分 + +``` +┌─────────────────────────────────────────────────────────────────────────┐ +│ 系统模块划分 │ +├─────────────────────────────────────────────────────────────────────────┤ +│ │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ callcenter-platform │ │ +│ │ (父工程) │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ │ │ +│ ┌──────────────────────────┼──────────────────────────┐ │ +│ │ │ │ │ │ │ +│ ▼ ▼ ▼ ▼ ▼ │ +│ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ +│ │ common │ │ esl │ │ core │ │ api │ │ web │ │ +│ │ (公共) │ │(ESL封装)│ │(核心业务)│ │(REST API)│ │(前端) │ │ +│ └─────────┘ └─────────┘ └─────────┘ └─────────┘ └─────────┘ │ +│ │ │ │ │ │ │ +│ └──────────────┴───────────┴───────────┴──────────────┘ │ +│ │ │ +│ ▼ │ +│ ┌─────────────┐ │ +│ │ gateway │ │ +│ │ (启动入口) │ │ +│ └─────────────┘ │ +│ │ +└─────────────────────────────────────────────────────────────────────────┘ +``` + +**模块职责:** + +| 模块 | 职责 | 主要内容 | +|------|------|---------| +| **common** | 公共组件 | 工具类、常量、异常、通用模型 | +| **esl** | ESL封装 | ESL连接管理、命令封装、事件解析 | +| **core** | 核心业务 | 坐席管理、呼叫控制、ACD、队列、外呼、录音 | +| **api** | REST接口 | 对外API、WebSocket推送 | +| **web** | 前端工程 | 软电话条、监控大屏 | +| **gateway** | 应用入口 | 配置、启动类 | + +--- + +## 三、功能模块设计 + +### 3.1 模块清单与优先级 + +``` +┌─────────────────────────────────────────────────────────────────────────┐ +│ 功能模块优先级 │ +├─────────────────────────────────────────────────────────────────────────┤ +│ │ +│ P0 - 核心功能(必须完成) │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ ☐ ESL连接管理 ☐ 坐席签入签出 ☐ 呼入呼出控制 │ │ +│ │ ☐ ACD话务分配 ☐ 技能组管理 ☐ 排队等待 │ │ +│ │ ☐ 全程录音 ☐ 软电话条 ☐ API接口 │ │ +│ │ ☐ 事件推送 ☐ CRM集成 ☐ 基础IVR │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ │ +│ P1 - 重要功能(应该完成) │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ ☐ 预测式外呼 ☐ 机器人外呼 ☐ 语音识别IVR │ │ +│ │ ☐ 呼入机器人 ☐ 班长监控 ☐ 实时监控大屏 │ │ +│ │ ☐ 溢出策略 ☐ 主备高可用 │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ │ +│ P2 - 增强功能(尽量完成) │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ ☐ VIP优先 ☐ 黑名单 ☐ 满意度调查 │ │ +│ │ ☐ 多轮对话 ☐ 话务预测 ☐ 密语功能 │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ │ +└─────────────────────────────────────────────────────────────────────────┘ +``` + +### 3.2 核心模块设计 + +#### 3.2.1 ESL模块 + +``` +┌─────────────────────────────────────────────────────────────────────────┐ +│ ESL模块设计 │ +├─────────────────────────────────────────────────────────────────────────┤ +│ │ +│ ┌───────────────────────────────────────────────────────────────────┐ │ +│ │ EslConnectionManager │ │ +│ │ (连接管理器) │ │ +│ ├───────────────────────────────────────────────────────────────────┤ │ +│ │ - connect() 建立ESL连接 │ │ +│ │ - disconnect() 断开连接 │ │ +│ │ - reconnect() 重连机制 │ │ +│ │ - heartbeat() 心跳检测 │ │ +│ │ - getConnection() 获取连接 │ │ +│ └───────────────────────────────────────────────────────────────────┘ │ +│ │ │ +│ ▼ │ +│ ┌───────────────────────────────────────────────────────────────────┐ │ +│ │ EslCommandExecutor │ │ +│ │ (命令执行器) │ │ +│ ├───────────────────────────────────────────────────────────────────┤ │ +│ │ - api(cmd, args) 同步API命令 │ │ +│ │ - bgapi(cmd, args) 异步API命令 │ │ +│ │ - sendMsg(uuid, app) 发送消息 │ │ +│ │ - originate(...) 发起呼叫 │ │ +│ │ - bridge(uuid1, uuid2) 桥接通道 │ │ +│ │ - hangup(uuid) 挂断通话 │ │ +│ │ - transfer(uuid, dest) 转接 │ │ +│ │ - hold/unhold(uuid) 保持/取回 │ │ +│ └───────────────────────────────────────────────────────────────────┘ │ +│ │ │ +│ ▼ │ +│ ┌───────────────────────────────────────────────────────────────────┐ │ +│ │ EslEventDispatcher │ │ +│ │ (事件分发器) │ │ +│ ├───────────────────────────────────────────────────────────────────┤ │ +│ │ - subscribe(events) 订阅事件 │ │ +│ │ - addHandler(handler) 注册处理器 │ │ +│ │ - dispatch(event) 分发事件 │ │ +│ │ - filter(uuid) 过滤事件 │ │ +│ └───────────────────────────────────────────────────────────────────┘ │ +│ │ +│ 关键事件处理: │ +│ ┌────────────────┬────────────────────────────────────────────────┐ │ +│ │ CHANNEL_CREATE │ → 创建呼叫记录,呼入触发ACD排队 │ │ +│ │ CHANNEL_ANSWER │ → 更新状态为已接听,开始计时 │ │ +│ │ CHANNEL_BRIDGE │ → 更新状态为桥接,记录桥接信息 │ │ +│ │ CHANNEL_HANGUP │ → 更新坐席状态,生成话单 │ │ +│ │ DTMF │ → IVR按键处理,满意度调查收集 │ │ +│ └────────────────┴────────────────────────────────────────────────┘ │ +│ │ +└─────────────────────────────────────────────────────────────────────────┘ +``` + +#### 3.2.2 坐席管理模块 + +``` +┌─────────────────────────────────────────────────────────────────────────┐ +│ 坐席管理模块设计 │ +├─────────────────────────────────────────────────────────────────────────┤ +│ │ +│ 坐席状态机: │ +│ ┌───────────────────────────────────────────────────────────────────┐ │ +│ │ │ │ +│ │ ┌─────────┐ │ │ +│ │ │ OFFLINE │ ◄────────────────────────┐ │ │ +│ │ └────┬────┘ │ │ │ +│ │ │ signIn │ signOut │ │ +│ │ ▼ │ │ │ +│ │ ┌─────────┐ ready ┌────┴────┐ │ │ +│ │ ┌───►│NOT_READY│─────────────────────►│ READY │◄───┐ │ │ +│ │ │ └─────────┘ └────┬────┘ │ │ │ +│ │ │ ▲ │ │ │ │ +│ │ wrapUp │ │ notReady │ assign │ │ │ +│ │ timeout│ │ ▼ │ │ │ +│ │ │ ┌─────────┐ ┌─────────┐ │ │ │ +│ │ │ │ PAUSED │ │ RINGING │ │ │ │ +│ │ │ │ (小休) │ └────┬────┘ │ │ │ +│ │ │ └─────────┘ │ │ │ │ +│ │ │ │ answer │ │ │ +│ │ │ ▼ │ │ │ +│ │ │ ┌─────────┐ │ │ │ +│ │ │ │ BUSY │ │ │ │ +│ │ │ │ (通话中) │ │ │ │ +│ │ │ └────┬────┘ │ │ │ +│ │ │ │ │ │ │ +│ │ │ │ hangup │ │ │ +│ │ │ ▼ │ │ │ +│ │ │ ┌─────────┐ │ │ │ +│ │ └────────────────────────────────────│ WRAP_UP │────┘ │ │ +│ │ │ (后处理) │ │ │ +│ │ └─────────┘ │ │ +│ │ │ │ +│ └───────────────────────────────────────────────────────────────────┘ │ +│ │ +│ 数据模型: │ +│ ┌───────────────────────────────────────────────────────────────────┐ │ +│ │ Agent { │ │ +│ │ id: String // 坐席ID │ │ +│ │ name: String // 坐席姓名 │ │ +│ │ extension: String // 分机号 │ │ +│ │ skillGroups: List // 技能组列表 │ │ +│ │ state: AgentState // 当前状态 │ │ +│ │ stateTime: DateTime // 状态开始时间 │ │ +│ │ currentCallUuid: String // 当前通话UUID │ │ +│ │ signInTime: DateTime // 签入时间 │ │ +│ │ } │ │ +│ └───────────────────────────────────────────────────────────────────┘ │ +│ │ +│ 存储设计(Redis): │ +│ ┌───────────────────────────────────────────────────────────────────┐ │ +│ │ agent:{agentId} → Hash 坐席详细信息 │ │ +│ │ agents:online → Set 在线坐席ID集合 │ │ +│ │ skillgroup:{name}:agents → Set 技能组坐席集合 │ │ +│ │ agent:{agentId}:idle_time → String 空闲开始时间 │ │ +│ └───────────────────────────────────────────────────────────────────┘ │ +│ │ +└─────────────────────────────────────────────────────────────────────────┘ +``` + +#### 3.2.3 ACD模块 + +``` +┌─────────────────────────────────────────────────────────────────────────┐ +│ ACD模块设计 │ +├─────────────────────────────────────────────────────────────────────────┤ +│ │ +│ 分配流程: │ +│ ┌───────────────────────────────────────────────────────────────────┐ │ +│ │ │ │ +│ │ 来电 ──► IVR ──► 确定技能组 ──► 入队 ──► 分配 ──► 振铃 ──► 接听 │ │ +│ │ │ │ │ +│ │ ▼ │ │ +│ │ ┌──────────┐ │ │ +│ │ │ 排队等待 │ │ │ +│ │ │ 播放音乐 │ │ │ +│ │ └──────────┘ │ │ +│ │ │ │ +│ └───────────────────────────────────────────────────────────────────┘ │ +│ │ +│ 分配策略(按优先级): │ +│ ┌───────────────────────────────────────────────────────────────────┐ │ +│ │ │ │ +│ │ 1. 历史服务优先 │ │ +│ │ └─► 查找该客户上次服务的坐席,若空闲则分配 │ │ +│ │ │ │ +│ │ 2. 最长空闲优先 │ │ +│ │ └─► 选择空闲时间最长的坐席 │ │ +│ │ │ │ +│ │ 3. 轮询分配 │ │ +│ │ └─► 按顺序轮流分配 │ │ +│ │ │ │ +│ └───────────────────────────────────────────────────────────────────┘ │ +│ │ +│ 溢出策略: │ +│ ┌───────────────────────────────────────────────────────────────────┐ │ +│ │ │ │ +│ │ 条件:技能组无空闲坐席 + 等待时间 > 阈值(如60秒) │ │ +│ │ │ │ +│ │ 溢出配置: │ │ +│ │ ┌─────────────┬─────────────┬───────────┐ │ │ +│ │ │ 源技能组 │ 目标技能组 │ 等待阈值 │ │ │ +│ │ ├─────────────┼─────────────┼───────────┤ │ │ +│ │ │ rescue │ default │ 60秒 │ │ │ +│ │ │ housekeeping│ default │ 90秒 │ │ │ +│ │ │ driver │ default │ 60秒 │ │ │ +│ │ └─────────────┴─────────────┴───────────┘ │ │ +│ │ │ │ +│ └───────────────────────────────────────────────────────────────────┘ │ +│ │ +│ 队列数据结构(Redis Sorted Set): │ +│ ┌───────────────────────────────────────────────────────────────────┐ │ +│ │ queue:{skillGroup} │ │ +│ │ ┌──────────────────────────────────────────────────────────────┐│ │ +│ │ │ Score = 优先级 × 10^9 + 入队时间戳 ││ │ +│ │ │ Member = QueueItem(callUuid, callerNumber, enqueueTime...) ││ │ +│ │ └──────────────────────────────────────────────────────────────┘│ │ +│ │ │ │ +│ │ 优先级越小越优先,同优先级按入队时间排序 │ │ +│ └───────────────────────────────────────────────────────────────────┘ │ +│ │ +└─────────────────────────────────────────────────────────────────────────┘ +``` + +#### 3.2.4 呼叫控制模块 + +``` +┌─────────────────────────────────────────────────────────────────────────┐ +│ 呼叫控制模块设计 │ +├─────────────────────────────────────────────────────────────────────────┤ +│ │ +│ 呼叫状态机: │ +│ ┌───────────────────────────────────────────────────────────────────┐ │ +│ │ │ │ +│ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │ +│ │ │ CREATED │────►│ RINGING │────►│ ANSWERED│────►│ BRIDGED │ │ │ +│ │ └─────────┘ └────┬────┘ └────┬────┘ └────┬────┘ │ │ +│ │ │ │ │ │ │ +│ │ │ │ │ │ │ +│ │ │ │ ▼ │ │ +│ │ │ │ ┌─────────┐ │ │ +│ │ │ │ │ HELD │ │ │ +│ │ │ │ └────┬────┘ │ │ +│ │ │ │ │ │ │ +│ │ ▼ ▼ ▼ │ │ +│ │ ┌────────────────────────────────────────┐ │ │ +│ │ │ HANGUP │ │ │ +│ │ └────────────────────────────────────────┘ │ │ +│ │ │ │ +│ └───────────────────────────────────────────────────────────────────┘ │ +│ │ +│ 核心操作: │ +│ ┌───────────────────────────────────────────────────────────────────┐ │ +│ │ │ │ +│ │ 点击外呼: │ │ +│ │ ┌─────────────────────────────────────────────────────────────┐ │ │ +│ │ │ 1. 检查坐席状态(必须READY) │ │ │ +│ │ │ 2. 更新坐席状态为BUSY │ │ │ +│ │ │ 3. originate呼叫坐席分机 │ │ │ +│ │ │ 4. 坐席接听后bridge呼叫客户 │ │ │ +│ │ │ 5. 开始录音 │ │ │ +│ │ └─────────────────────────────────────────────────────────────┘ │ │ +│ │ │ │ +│ │ 转接: │ │ +│ │ ┌─────────────────────────────────────────────────────────────┐ │ │ +│ │ │ 盲转:uuid_transfer直接转接 │ │ │ +│ │ │ 咨询转:先hold,originate咨询方,确认后bridge │ │ │ +│ │ └─────────────────────────────────────────────────────────────┘ │ │ +│ │ │ │ +│ │ 三方通话: │ │ +│ │ ┌─────────────────────────────────────────────────────────────┐ │ │ +│ │ │ 1. 创建会议室 conference │ │ │ +│ │ │ 2. 将原通话双方加入会议 │ │ │ +│ │ │ 3. originate第三方加入会议 │ │ │ +│ │ └─────────────────────────────────────────────────────────────┘ │ │ +│ │ │ │ +│ └───────────────────────────────────────────────────────────────────┘ │ +│ │ +│ 数据模型: │ +│ ┌───────────────────────────────────────────────────────────────────┐ │ +│ │ Call { │ │ +│ │ uuid: String // 呼叫唯一标识 │ │ +│ │ direction: Enum // INBOUND/OUTBOUND │ │ +│ │ callerNumber: String // 主叫号码 │ │ +│ │ calleeNumber: String // 被叫号码 │ │ +│ │ state: CallState // 呼叫状态 │ │ +│ │ agentId: String // 服务坐席 │ │ +│ │ skillGroup: String // 技能组 │ │ +│ │ createTime: DateTime // 创建时间 │ │ +│ │ answerTime: DateTime // 接听时间 │ │ +│ │ hangupTime: DateTime // 挂断时间 │ │ +│ │ duration: Long // 通话时长(秒) │ │ +│ │ recordingPath: String // 录音路径 │ │ +│ │ hangupCause: String // 挂断原因 │ │ +│ │ } │ │ +│ └───────────────────────────────────────────────────────────────────┘ │ +│ │ +└─────────────────────────────────────────────────────────────────────────┘ +``` + +#### 3.2.5 外呼模块 + +``` +┌─────────────────────────────────────────────────────────────────────────┐ +│ 外呼模块设计 │ +├─────────────────────────────────────────────────────────────────────────┤ +│ │ +│ 预测式外呼流程: │ +│ ┌───────────────────────────────────────────────────────────────────┐ │ +│ │ │ │ +│ │ 业务系统 ──► 创建任务 ──► 导入号码 ──► 启动任务 │ │ +│ │ │ │ │ +│ │ ▼ │ │ +│ │ ┌───────────────┐ │ │ +│ │ │ 外呼循环 │ │ │ +│ │ └───────┬───────┘ │ │ +│ │ │ │ │ +│ │ ┌───────────────────────────────────┴───────────────┐ │ │ +│ │ │ │ │ │ +│ │ ▼ │ │ │ +│ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │ │ +│ │ │ 计算拨打数 │───►│ 批量拨打 │───►│ 接通转坐席 │ │ │ │ +│ │ │(预测算法) │ │ │ │ │ │ │ │ +│ │ └─────────────┘ └─────────────┘ └─────────────┘ │ │ │ +│ │ ▲ │ │ │ │ +│ │ │ │ │ │ │ +│ │ └──────────────────────────────────────┘ │ │ │ +│ │ 循环 │ │ │ +│ │ │ │ │ +│ └───────────────────────────────────────────────────────────────────┘ │ +│ │ +│ 预测算法: │ +│ ┌───────────────────────────────────────────────────────────────────┐ │ +│ │ │ │ +│ │ 目标:让坐席接听时刚好有客户接通,减少等待 │ │ +│ │ │ │ +│ │ 预测拨打数 = 空闲坐席数 / 历史接通率 × 超拨系数 │ │ +│ │ │ │ +│ │ 示例:空闲5人,接通率30%,超拨系数1.2 │ │ +│ │ 拨打数 = 5 / 0.3 × 1.2 ≈ 20 │ │ +│ │ │ │ +│ │ 动态调整:根据实时接通率动态调整拨打速度 │ │ +│ │ │ │ +│ └───────────────────────────────────────────────────────────────────┘ │ +│ │ +│ 机器人外呼流程: │ +│ ┌───────────────────────────────────────────────────────────────────┐ │ +│ │ │ │ +│ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │ +│ │ │ 创建任务 │───►│ 生成TTS │───►│ 批量拨打 │───►│ 播放语音 │ │ │ +│ │ │ (含话术) │ │ 音频文件 │ │ │ │ │ │ │ +│ │ └──────────┘ └──────────┘ └──────────┘ └────┬─────┘ │ │ +│ │ │ │ │ +│ │ ┌───────────┴───────┐ │ │ +│ │ │ │ │ │ +│ │ ▼ ▼ │ │ +│ │ ┌──────────┐ ┌──────────┐│ +│ │ │ 纯播报 │ │ 收集按键 ││ +│ │ │ 挂断 │ │ 回传结果 ││ +│ │ └──────────┘ └──────────┘│ +│ │ │ │ +│ └───────────────────────────────────────────────────────────────────┘ │ +│ │ +└─────────────────────────────────────────────────────────────────────────┘ +``` + +### 3.3 接口设计 + +#### 3.3.1 API接口清单 + +``` +┌─────────────────────────────────────────────────────────────────────────┐ +│ REST API 设计 │ +├─────────────────────────────────────────────────────────────────────────┤ +│ │ +│ 坐席接口:/api/v1/agent │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ POST /signin 坐席签入 │ │ +│ │ POST /signout 坐席签出 │ │ +│ │ POST /ready 置闲 │ │ +│ │ POST /not-ready 置忙 │ │ +│ │ POST /pause 小休 │ │ +│ │ GET /{agentId}/status 查询坐席状态 │ │ +│ │ GET /list 查询坐席列表 │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ │ +│ 呼叫接口:/api/v1/call │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ POST /originate 发起外呼 │ │ +│ │ POST /{uuid}/answer 接听 │ │ +│ │ POST /{uuid}/hangup 挂断 │ │ +│ │ POST /{uuid}/hold 保持 │ │ +│ │ POST /{uuid}/unhold 取回 │ │ +│ │ POST /{uuid}/mute 静音 │ │ +│ │ POST /{uuid}/unmute 取消静音 │ │ +│ │ POST /{uuid}/transfer 转接 │ │ +│ │ POST /{uuid}/conference 三方通话 │ │ +│ │ GET /{uuid} 查询呼叫信息 │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ │ +│ 外呼任务接口:/api/v1/task │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ POST /predictive 创建预测式外呼任务 │ │ +│ │ POST /robot 创建机器人外呼任务 │ │ +│ │ POST /{taskId}/start 启动任务 │ │ +│ │ POST /{taskId}/pause 暂停任务 │ │ +│ │ POST /{taskId}/resume 恢复任务 │ │ +│ │ POST /{taskId}/stop 停止任务 │ │ +│ │ GET /{taskId}/status 查询任务状态 │ │ +│ │ GET /{taskId}/result 查询任务结果 │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ │ +│ 监控接口:/api/v1/monitor │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ POST /spy 监听 │ │ +│ │ POST /barge 强插 │ │ +│ │ POST /hangup 强拆 │ │ +│ │ GET /realtime 实时统计数据 │ │ +│ │ GET /queue/{skillGroup} 队列状态 │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ │ +│ 录音接口:/api/v1/recording │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ GET /list 录音列表查询 │ │ +│ │ GET /{uuid}/url 获取录音下载地址 │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ │ +└─────────────────────────────────────────────────────────────────────────┘ +``` + +#### 3.3.2 WebSocket事件推送 + +``` +┌─────────────────────────────────────────────────────────────────────────┐ +│ WebSocket 事件设计 │ +├─────────────────────────────────────────────────────────────────────────┤ +│ │ +│ 连接地址:ws://host:port/ws/events?token={token} │ +│ │ +│ 事件格式: │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ { │ │ +│ │ "eventType": "CALL_RINGING", │ │ +│ │ "timestamp": 1704067200000, │ │ +│ │ "data": { │ │ +│ │ "uuid": "xxx", │ │ +│ │ "callerNumber": "13800138000", │ │ +│ │ "calleeNumber": "4001234567", │ │ +│ │ ... │ │ +│ │ } │ │ +│ │ } │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ │ +│ 事件类型: │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ 呼叫事件 │ │ +│ │ ├── CALL_RINGING 来电振铃 │ │ +│ │ ├── CALL_ANSWERED 通话接听 │ │ +│ │ ├── CALL_BRIDGED 双方接通 │ │ +│ │ ├── CALL_HANGUP 通话挂断 │ │ +│ │ ├── CALL_TRANSFER 通话转接 │ │ +│ │ └── CALL_HOLD 通话保持 │ │ +│ │ │ │ +│ │ 坐席事件 │ │ +│ │ ├── AGENT_STATE_CHANGE 坐席状态变更 │ │ +│ │ ├── AGENT_SIGNIN 坐席签入 │ │ +│ │ └── AGENT_SIGNOUT 坐席签出 │ │ +│ │ │ │ +│ │ 话单事件 │ │ +│ │ └── CDR_GENERATED 话单生成 │ │ +│ │ │ │ +│ │ DTMF事件 │ │ +│ │ └── DTMF_RECEIVED 收到按键 │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ │ +└─────────────────────────────────────────────────────────────────────────┘ +``` + +### 3.4 数据库设计 + +``` +┌─────────────────────────────────────────────────────────────────────────┐ +│ 数据库设计 │ +├─────────────────────────────────────────────────────────────────────────┤ +│ │ +│ cc_agent (坐席表) │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ id BIGINT PRIMARY KEY │ │ +│ │ agent_id VARCHAR(32) 坐席工号 │ │ +│ │ agent_name VARCHAR(64) 坐席姓名 │ │ +│ │ extension VARCHAR(16) 分机号 │ │ +│ │ password VARCHAR(128) 密码 │ │ +│ │ skill_groups VARCHAR(256) 技能组(逗号分隔) │ │ +│ │ status TINYINT 状态(0禁用1启用) │ │ +│ │ create_time DATETIME 创建时间 │ │ +│ │ update_time DATETIME 更新时间 │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ │ +│ cc_skill_group (技能组表) │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ id BIGINT PRIMARY KEY │ │ +│ │ group_code VARCHAR(32) 技能组编码 │ │ +│ │ group_name VARCHAR(64) 技能组名称 │ │ +│ │ overflow_group VARCHAR(32) 溢出技能组 │ │ +│ │ overflow_seconds INT 溢出等待秒数 │ │ +│ │ status TINYINT 状态 │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ │ +│ cc_cdr (话单表) │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ id BIGINT PRIMARY KEY │ │ +│ │ uuid VARCHAR(64) 呼叫UUID │ │ +│ │ direction VARCHAR(16) 呼叫方向 │ │ +│ │ caller_number VARCHAR(32) 主叫号码 │ │ +│ │ callee_number VARCHAR(32) 被叫号码 │ │ +│ │ agent_id VARCHAR(32) 坐席ID │ │ +│ │ skill_group VARCHAR(32) 技能组 │ │ +│ │ queue_time INT 排队时长(秒) │ │ +│ │ ring_time INT 振铃时长(秒) │ │ +│ │ talk_time INT 通话时长(秒) │ │ +│ │ start_time DATETIME 开始时间 │ │ +│ │ answer_time DATETIME 接听时间 │ │ +│ │ end_time DATETIME 结束时间 │ │ +│ │ hangup_cause VARCHAR(32) 挂断原因 │ │ +│ │ recording_path VARCHAR(256) 录音路径 │ │ +│ │ business_type VARCHAR(32) 业务类型 │ │ +│ │ create_time DATETIME 创建时间 │ │ +│ │ INDEX idx_start_time (start_time) │ │ +│ │ INDEX idx_agent (agent_id, start_time) │ │ +│ │ INDEX idx_caller (caller_number, start_time) │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ │ +│ cc_dial_task (外呼任务表) │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ id BIGINT PRIMARY KEY │ │ +│ │ task_id VARCHAR(64) 任务ID │ │ +│ │ task_name VARCHAR(128) 任务名称 │ │ +│ │ task_type VARCHAR(16) 类型(PREDICTIVE/ROBOT) │ │ +│ │ skill_group VARCHAR(32) 技能组 │ │ +│ │ caller_id VARCHAR(32) 外显号码 │ │ +│ │ total_count INT 总号码数 │ │ +│ │ dialed_count INT 已拨打数 │ │ +│ │ connected_count INT 接通数 │ │ +│ │ state VARCHAR(16) 状态 │ │ +│ │ start_time DATETIME 开始时间 │ │ +│ │ end_time DATETIME 结束时间 │ │ +│ │ create_time DATETIME 创建时间 │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ │ +│ cc_dial_detail (外呼明细表) │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ id BIGINT PRIMARY KEY │ │ +│ │ task_id VARCHAR(64) 任务ID │ │ +│ │ phone VARCHAR(32) 号码 │ │ +│ │ call_uuid VARCHAR(64) 呼叫UUID │ │ +│ │ status VARCHAR(16) 状态 │ │ +│ │ dial_time DATETIME 拨打时间 │ │ +│ │ answer_time DATETIME 接听时间 │ │ +│ │ hangup_time DATETIME 挂断时间 │ │ +│ │ dtmf_result VARCHAR(16) 按键结果 │ │ +│ │ retry_count INT 重试次数 │ │ +│ │ INDEX idx_task (task_id) │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ │ +└─────────────────────────────────────────────────────────────────────────┘ +``` + +--- + +## 四、开发计划 + +### 4.1 阶段划分 + +``` +┌─────────────────────────────────────────────────────────────────────────┐ +│ 开发阶段划分(17周) │ +├─────────────────────────────────────────────────────────────────────────┤ +│ │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ 第一阶段:基础环境与核心框架(Week 1-4) │ │ +│ │ │ │ +│ │ Week 1-2: 环境搭建 + 技术预研 │ │ +│ │ Week 3-4: ESL模块 + 基础框架 │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ ↓ │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ 第二阶段:核心功能开发(Week 5-10) │ │ +│ │ │ │ +│ │ Week 5-6: 坐席管理 + 呼叫控制 │ │ +│ │ Week 7-8: ACD分配 + 排队等待 │ │ +│ │ Week 9-10: 录音 + 软电话条 + CRM集成 │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ ↓ │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ 第三阶段:高级功能开发(Week 11-14) │ │ +│ │ │ │ +│ │ Week 11-12: 预测式外呼 + 机器人外呼 │ │ +│ │ Week 13: IVR + 呼入机器人 │ │ +│ │ Week 14: 监控大屏 + 班长监控 │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ ↓ │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ 第四阶段:集成测试与上线(Week 15-17) │ │ +│ │ │ │ +│ │ Week 15: 集成联调 + 高可用部署 │ │ +│ │ Week 16: 测试 + Bug修复 │ │ +│ │ Week 17: 试运行 + 正式上线 │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ │ +└─────────────────────────────────────────────────────────────────────────┘ +``` + +### 4.2 详细开发计划 + +``` +┌─────────────────────────────────────────────────────────────────────────┐ +│ 详细开发计划 │ +├─────────────────────────────────────────────────────────────────────────┤ +│ │ +│ ═══════════════════════════════════════════════════════════════════ │ +│ 第一阶段:基础环境与核心框架(Week 1-4) │ +│ ═══════════════════════════════════════════════════════════════════ │ +│ │ +│ Week 1: 环境准备 │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ □ 服务器环境准备(开发、测试环境) │ │ +│ │ □ FreeSWITCH安装配置 │ │ +│ │ □ 开发环境搭建(IDE、Git、Maven) │ │ +│ │ □ MySQL、Redis环境搭建 │ │ +│ │ □ 测试SIP话机注册与基础通话 │ │ +│ │ │ │ +│ │ 交付物:环境部署文档、FreeSWITCH基础配置 │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ │ +│ Week 2: 技术预研 │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ □ ESL协议学习与Demo开发 │ │ +│ │ □ FreeSWITCH Dialplan配置学习 │ │ +│ │ □ Lua IVR脚本编写测试 │ │ +│ │ □ 项目工程结构搭建 │ │ +│ │ □ 技术方案评审 │ │ +│ │ │ │ +│ │ 交付物:技术预研报告、Demo代码 │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ │ +│ Week 3-4: ESL模块开发 │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ □ ESL连接管理(连接池、心跳、重连) │ │ +│ │ □ ESL命令封装(API、SendMsg) │ │ +│ │ □ 事件订阅与分发机制 │ │ +│ │ □ 常用命令测试验证 │ │ +│ │ □ 基础API框架搭建 │ │ +│ │ □ WebSocket服务搭建 │ │ +│ │ │ │ +│ │ 交付物:ESL模块代码、单元测试 │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ │ +│ ═══════════════════════════════════════════════════════════════════ │ +│ 第二阶段:核心功能开发(Week 5-10) │ +│ ═══════════════════════════════════════════════════════════════════ │ +│ │ +│ Week 5-6: 坐席管理 + 呼叫控制 │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ □ 坐席数据模型设计 │ │ +│ │ □ 坐席签入/签出 │ │ +│ │ □ 坐席状态管理(置闲、置忙、小休) │ │ +│ │ □ 技能组管理 │ │ +│ │ □ 点击外呼功能 │ │ +│ │ □ 接听/挂断/保持/取回 │ │ +│ │ □ 转接(盲转、咨询转) │ │ +│ │ □ 坐席API接口 │ │ +│ │ □ 呼叫API接口 │ │ +│ │ │ │ +│ │ 交付物:坐席模块、呼叫控制模块 │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ │ +│ Week 7-8: ACD分配 + 排队等待 │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ □ 队列数据结构设计 │ │ +│ │ □ 呼叫入队逻辑 │ │ +│ │ □ 历史服务优先策略 │ │ +│ │ □ 最长空闲优先策略 │ │ +│ │ □ 轮询分配策略 │ │ +│ │ □ 坐席选择与分配 │ │ +│ │ □ 排队等待音乐 │ │ +│ │ □ 溢出策略实现 │ │ +│ │ □ 排队状态查询 │ │ +│ │ │ │ +│ │ 交付物:ACD模块、队列管理模块 │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ │ +│ Week 9-10: 录音 + 软电话条 + CRM集成 │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ □ 录音启动/停止控制 │ │ +│ │ □ 录音文件存储管理 │ │ +│ │ □ 录音查询与下载API │ │ +│ │ □ 软电话条前端开发(Vue组件) │ │ +│ │ □ WebSocket事件接收与处理 │ │ +│ │ □ 软电话条UI(状态、按钮、来电显示) │ │ +│ │ □ CRM弹屏集成(事件推送) │ │ +│ │ □ 话单推送至CRM │ │ +│ │ □ 联调测试 │ │ +│ │ │ │ +│ │ 交付物:录音模块、软电话条组件、CRM集成文档 │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ │ +│ ═══════════════════════════════════════════════════════════════════ │ +│ 第三阶段:高级功能开发(Week 11-14) │ +│ ═══════════════════════════════════════════════════════════════════ │ +│ │ +│ Week 11-12: 预测式外呼 + 机器人外呼 │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ □ 外呼任务管理(创建、启动、暂停、停止) │ │ +│ │ □ 号码导入与管理 │ │ +│ │ □ 预测式拨号算法实现 │ │ +│ │ □ 接通后转坐席逻辑 │ │ +│ │ □ 外呼统计(接通率、坐席利用率) │ │ +│ │ □ 阿里云TTS集成 │ │ +│ │ □ 机器人外呼流程(播报、按键收集) │ │ +│ │ □ 外呼结果回传 │ │ +│ │ □ 任务API接口 │ │ +│ │ │ │ +│ │ 交付物:外呼引擎、机器人外呼模块 │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ │ +│ Week 13: IVR + 呼入机器人 │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ □ IVR Dialplan配置(多业务线) │ │ +│ │ □ 阿里云ASR集成 │ │ +│ │ □ 语音识别导航实现 │ │ +│ │ □ NLU对接(意图识别) │ │ +│ │ □ FAQ问答流程 │ │ +│ │ □ 转人工逻辑 │ │ +│ │ □ Lua脚本开发 │ │ +│ │ │ │ +│ │ 交付物:IVR配置、呼入机器人模块 │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ │ +│ Week 14: 监控大屏 + 班长监控 │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ □ 实时数据统计API │ │ +│ │ □ 监控大屏前端开发 │ │ +│ │ □ 坐席状态分布展示 │ │ +│ │ □ 队列状态展示 │ │ +│ │ □ 话务趋势图表 │ │ +│ │ □ 监听功能实现 │ │ +│ │ □ 强插功能实现 │ │ +│ │ □ 强拆功能实现 │ │ +│ │ │ │ +│ │ 交付物:监控大屏、班长监控功能 │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ │ +│ ═══════════════════════════════════════════════════════════════════ │ +│ 第四阶段:集成测试与上线(Week 15-17) │ +│ ═══════════════════════════════════════════════════════════════════ │ +│ │ +│ Week 15: 集成联调 + 高可用部署 │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ □ CRM系统全流程联调 │ │ +│ │ □ 业务系统对接联调 │ │ +│ │ □ 运营商线路对接 │ │ +│ │ □ 主备FreeSWITCH部署 │ │ +│ │ □ Keepalived配置 │ │ +│ │ □ 故障切换测试 │ │ +│ │ □ 数据库主从配置 │ │ +│ │ □ Redis Sentinel配置 │ │ +│ │ │ │ +│ │ 交付物:联调测试报告、高可用部署文档 │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ │ +│ Week 16: 测试 + Bug修复 │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ □ 功能测试(全流程) │ │ +│ │ □ 性能测试(150坐席并发) │ │ +│ │ □ 压力测试(峰值话务) │ │ +│ │ □ 故障恢复测试 │ │ +│ │ □ Bug修复 │ │ +│ │ □ 性能优化 │ │ +│ │ □ 上线检查清单确认 │ │ +│ │ │ │ +│ │ 交付物:测试报告、Bug清单、优化记录 │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ │ +│ Week 17: 试运行 + 正式上线 │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ □ 生产环境部署 │ │ +│ │ □ 数据初始化 │ │ +│ │ □ 小范围试运行(一条业务线) │ │ +│ │ □ 问题收集与修复 │ │ +│ │ □ 全量上线 │ │ +│ │ □ 运维交接 │ │ +│ │ □ 用户培训 │ │ +│ │ │ │ +│ │ 交付物:上线报告、运维手册、培训材料 │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ │ +└─────────────────────────────────────────────────────────────────────────┘ +``` + +### 4.3 甘特图 + +``` +┌─────────────────────────────────────────────────────────────────────────────────────────┐ +│ 项目甘特图 │ +├─────────────────────────────────────────────────────────────────────────────────────────┤ +│ │ +│ 任务 │ W1 │ W2 │ W3 │ W4 │ W5 │ W6 │ W7 │ W8 │ W9 │W10│W11│W12│W13│W14│W15│W16│W17│ +│ ─────────────────────────│────│────│────│────│────│────│────│────│────│───│───│───│───│───│───│───│───│ +│ 第一阶段 │████│████│████│████│ │ │ │ │ │ │ │ │ │ │ │ │ │ +│ 环境搭建 │████│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ +│ 技术预研 │ │████│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ +│ ESL模块开发 │ │ │████│████│ │ │ │ │ │ │ │ │ │ │ │ │ │ +│ ─────────────────────────│────│────│────│────│────│────│────│────│────│───│───│───│───│───│───│───│───│ +│ 第二阶段 │ │ │ │ │████│████│████│████│████│███│ │ │ │ │ │ │ │ +│ 坐席管理 │ │ │ │ │████│████│ │ │ │ │ │ │ │ │ │ │ │ +│ 呼叫控制 │ │ │ │ │████│████│ │ │ │ │ │ │ │ │ │ │ │ +│ ACD分配 │ │ │ │ │ │ │████│████│ │ │ │ │ │ │ │ │ │ +│ 排队等待 │ │ │ │ │ │ │████│████│ │ │ │ │ │ │ │ │ │ +│ 录音功能 │ │ │ │ │ │ │ │ │████│ │ │ │ │ │ │ │ │ +│ 软电话条 │ │ │ │ │ │ │ │ │████│███│ │ │ │ │ │ │ │ +│ CRM集成 │ │ │ │ │ │ │ │ │ │███│ │ │ │ │ │ │ │ +│ ─────────────────────────│────│────│────│────│────│────│────│────│────│───│───│───│───│───│───│───│───│ +│ 第三阶段 │ │ │ │ │ │ │ │ │ │ │███│███│███│███│ │ │ │ +│ 预测式外呼 │ │ │ │ │ │ │ │ │ │ │███│███│ │ │ │ │ │ +│ 机器人外呼 │ │ │ │ │ │ │ │ │ │ │███│███│ │ │ │ │ │ +│ IVR+呼入机器人 │ │ │ │ │ │ │ │ │ │ │ │ │███│ │ │ │ │ +│ 监控大屏 │ │ │ │ │ │ │ │ │ │ │ │ │ │███│ │ │ │ +│ 班长监控 │ │ │ │ │ │ │ │ │ │ │ │ │ │███│ │ │ │ +│ ─────────────────────────│────│────│────│────│────│────│────│────│────│───│───│───│───│───│───│───│───│ +│ 第四阶段 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │███│███│███│ +│ 集成联调 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │███│ │ │ +│ 高可用部署 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │███│ │ │ +│ 测试+Bug修复 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │███│ │ +│ 试运行 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │██ │ +│ 正式上线 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ██│ +│ ─────────────────────────│────│────│────│────│────│────│────│────│────│───│───│───│───│───│───│───│───│ +│ 里程碑 │ │ M1 │ │ M2 │ │ │ │ │ │M3 │ │ │ │M4 │M5 │M6 │M7 │ +│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ +│ M1: 需求确认 │ │ ◆ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ +│ M2: 环境就绪 │ │ │ │ ◆ │ │ │ │ │ │ │ │ │ │ │ │ │ │ +│ M3: 核心功能完成 │ │ │ │ │ │ │ │ │ │ ◆ │ │ │ │ │ │ │ │ +│ M4: 全功能完成 │ │ │ │ │ │ │ │ │ │ │ │ │ │ ◆ │ │ │ │ +│ M5: 联调测试完成 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ◆ │ │ │ +│ M6: 试运行完成 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ◆ │ │ +│ M7: 正式上线 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ◆ │ +│ │ +└─────────────────────────────────────────────────────────────────────────────────────────┘ +``` + +--- + +## 五、团队组织 + +### 5.1 团队配置 + +``` +┌─────────────────────────────────────────────────────────────────────────┐ +│ 团队组织架构 │ +├─────────────────────────────────────────────────────────────────────────┤ +│ │ +│ ┌─────────────┐ │ +│ │ 项目经理 │ │ +│ │ (1人) │ │ +│ └──────┬──────┘ │ +│ │ │ +│ ┌─────────────────────┼─────────────────────┐ │ +│ │ │ │ │ +│ ▼ ▼ ▼ │ +│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ +│ │ 开发组 │ │ 测试组 │ │ 运维组 │ │ +│ │ (8-10人) │ │ (1-2人) │ │ (1人) │ │ +│ └─────────────┘ └─────────────┘ └─────────────┘ │ +│ │ │ +│ ├── 架构师 (1人) │ +│ ├── 后端开发 (4-5人) │ +│ ├── 前端开发 (2人) │ +│ └── FreeSWITCH工程师 (1-2人) │ +│ │ +└─────────────────────────────────────────────────────────────────────────┘ +``` + +### 5.2 角色职责 + +| 角色 | 人数 | 职责 | 技能要求 | +|------|------|------|---------| +| **项目经理** | 1 | 项目管理、进度控制、风险管理 | 项目管理经验、沟通协调能力 | +| **架构师** | 1 | 架构设计、技术选型、核心代码 | FreeSWITCH、分布式系统 | +| **后端开发** | 4-5 | 业务模块开发、API开发 | Java、Spring Boot、Redis | +| **前端开发** | 2 | 软电话条、监控大屏 | Vue3、TypeScript、WebSocket | +| **FS工程师** | 1-2 | FreeSWITCH配置、Lua脚本 | FreeSWITCH、SIP协议、Lua | +| **测试** | 1-2 | 功能测试、性能测试 | 测试用例设计、性能测试工具 | +| **运维** | 1 | 环境部署、监控运维 | Linux、Docker、运维经验 | + +### 5.3 人员分工 + +``` +┌─────────────────────────────────────────────────────────────────────────┐ +│ 开发任务分工 │ +├─────────────────────────────────────────────────────────────────────────┤ +│ │ +│ 架构师 │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ • 整体架构设计 │ │ +│ │ • ESL模块核心代码 │ │ +│ │ • ACD核心算法 │ │ +│ │ • 技术难点攻关 │ │ +│ │ • 代码Review │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ │ +│ 后端开发A (资深) │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ • 坐席管理模块 │ │ +│ │ • 呼叫控制模块 │ │ +│ │ • WebSocket推送服务 │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ │ +│ 后端开发B │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ • ACD分配模块 │ │ +│ │ • 队列管理模块 │ │ +│ │ • 溢出策略 │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ │ +│ 后端开发C │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ • 预测式外呼模块 │ │ +│ │ • 机器人外呼模块 │ │ +│ │ • TTS集成 │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ │ +│ 后端开发D │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ • 录音管理模块 │ │ +│ │ • 监控统计模块 │ │ +│ │ • 班长监控功能 │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ │ +│ 后端开发E (可选) │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ • API接口开发 │ │ +│ │ • CRM集成对接 │ │ +│ │ • 单元测试 │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ │ +│ 前端开发A │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ • 软电话条组件开发 │ │ +│ │ • WebSocket客户端 │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ │ +│ 前端开发B │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ • 实时监控大屏 │ │ +│ │ • 数据可视化图表 │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ │ +│ FreeSWITCH工程师 │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ • FreeSWITCH配置优化 │ │ +│ │ • Dialplan编写 │ │ +│ │ • Lua IVR脚本开发 │ │ +│ │ • 线路对接 │ │ +│ │ • 高可用部署 │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ │ +└─────────────────────────────────────────────────────────────────────────┘ +``` + +--- + +## 六、风险控制 + +### 6.1 风险清单 + +``` +┌─────────────────────────────────────────────────────────────────────────┐ +│ 风险清单 │ +├─────────────────────────────────────────────────────────────────────────┤ +│ │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ 风险1: FreeSWITCH技术门槛高 │ │ +│ ├─────────────────────────────────────────────────────────────────┤ │ +│ │ 等级: 高 │ │ +│ │ 影响: 开发进度延迟,功能实现困难 │ │ +│ │ 应对: │ │ +│ │ • Week 1-2 集中学习FreeSWITCH和ESL │ │ +│ │ • 考虑引入外部FreeSWITCH顾问 │ │ +│ │ • 预留20%时间缓冲 │ │ +│ │ • 简化复杂功能,优先实现核心流程 │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ 风险2: 运营商线路对接周期长 │ │ +│ ├─────────────────────────────────────────────────────────────────┤ │ +│ │ 等级: 高 │ │ +│ │ 影响: 无法进行真实环境测试,上线延迟 │ │ +│ │ 应对: │ │ +│ │ • 项目启动即开始申请线路 │ │ +│ │ • 开发阶段使用模拟线路/测试线路 │ │ +│ │ • 准备备选运营商 │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ 风险3: CRM系统对接复杂 │ │ +│ ├─────────────────────────────────────────────────────────────────┤ │ +│ │ 等级: 中 │ │ +│ │ 影响: 集成联调时间延长 │ │ +│ │ 应对: │ │ +│ │ • 提前与CRM团队沟通,明确接口规范 │ │ +│ │ • 提供详细API文档和示例代码 │ │ +│ │ • 预留充足联调时间 │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ 风险4: 并发性能不达标 │ │ +│ ├─────────────────────────────────────────────────────────────────┤ │ +│ │ 等级: 中 │ │ +│ │ 影响: 系统无法支撑业务量 │ │ +│ │ 应对: │ │ +│ │ • Week 16 进行完整压力测试 │ │ +│ │ • 预先设计水平扩展方案 │ │ +│ │ • 关键代码Review,避免性能瓶颈 │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ 风险5: ASR/TTS识别效果不佳 │ │ +│ ├─────────────────────────────────────────────────────────────────┤ │ +│ │ 等级: 中 │ │ +│ │ 影响: 机器人/IVR体验差 │ │ +│ │ 应对: │ │ +│ │ • 提前进行ASR效果测试 │ │ +│ │ • 准备热词优化方案 │ │ +│ │ • 设计按键兜底方案 │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ 风险6: 核心人员离职 │ │ +│ ├─────────────────────────────────────────────────────────────────┤ │ +│ │ 等级: 中 │ │ +│ │ 影响: 知识断层,进度受阻 │ │ +│ │ 应对: │ │ +│ │ • 重要模块双人备份 │ │ +│ │ • 代码规范、文档完善 │ │ +│ │ • 定期代码Review和知识分享 │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ │ +└─────────────────────────────────────────────────────────────────────────┘ +``` + +### 6.2 应急预案 + +``` +┌─────────────────────────────────────────────────────────────────────────┐ +│ 应急预案 │ +├─────────────────────────────────────────────────────────────────────────┤ +│ │ +│ 场景1: 开发进度严重滞后 │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ 触发条件: 核心功能延迟超过2周 │ │ +│ │ 应对措施: │ │ +│ │ • 评估是否可以简化功能范围 │ │ +│ │ • 考虑增加外部资源支持 │ │ +│ │ • 与业务方协商分阶段上线 │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ │ +│ 场景2: FreeSWITCH关键问题无法解决 │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ 触发条件: 技术问题阻塞超过1周 │ │ +│ │ 应对措施: │ │ +│ │ • 联系FreeSWITCH社区或付费支持 │ │ +│ │ • 寻求外部FreeSWITCH专家支援 │ │ +│ │ • 评估替代方案可行性 │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ │ +│ 场景3: 上线后系统不稳定 │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ 触发条件: 故障频发或性能严重不足 │ │ +│ │ 应对措施: │ │ +│ │ • 启用回退方案(如有旧系统) │ │ +│ │ • 降级部分功能,保障核心业务 │ │ +│ │ • 紧急扩容或优化 │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +│ │ +└─────────────────────────────────────────────────────────────────────────┘ +``` + +--- + +## 七、交付物清单 + +``` +┌─────────────────────────────────────────────────────────────────────────┐ +│ 项目交付物清单 │ +├─────────────────────────────────────────────────────────────────────────┤ +│ │ +│ 阶段 │ 交付物 │ 负责人 │ +│ ──────────────│───────────────────────────────────────│───────────│ +│ │ │ │ +│ 需求阶段 │ 需求规格说明书 │ 产品 │ +│ │ 接口设计文档 │ 架构师 │ +│ │ 数据库设计文档 │ 架构师 │ +│ │ │ │ +│ 开发阶段 │ 源代码(Git仓库) │ 开发团队 │ +│ │ 单元测试代码 │ 开发团队 │ +│ │ API接口文档 │ 后端开发 │ +│ │ 前端组件文档 │ 前端开发 │ +│ │ │ │ +│ 测试阶段 │ 测试用例文档 │ 测试 │ +│ │ 测试报告 │ 测试 │ +│ │ 性能测试报告 │ 测试 │ +│ │ │ │ +│ 部署阶段 │ 部署手册 │ 运维 │ +│ │ 运维手册 │ 运维 │ +│ │ 高可用配置文档 │ 运维 │ +│ │ │ │ +│ 上线阶段 │ 上线检查清单 │ 项目经理 │ +│ │ 培训材料 │ 产品 │ +│ │ 用户操作手册 │ 产品 │ +│ │ 项目总结报告 │ 项目经理 │ +│ │ +└─────────────────────────────────────────────────────────────────────────┘ +``` + +--- + +## 八、总结 + +### 8.1 方案要点总结 + +| 维度 | 要点 | +|------|------| +| **技术架构** | FreeSWITCH + Java中间件 + Vue前端,ESL控制模式 | +| **开发周期** | 4个月(17周),分4阶段 | +| **团队配置** | 11-14人(含项目经理、开发、测试、运维) | +| **核心功能** | 呼入呼出、ACD分配、预测式外呼、机器人、录音、监控 | +| **风险控制** | FreeSWITCH技术预研、线路提前申请、预留缓冲时间 | + +### 8.2 关键成功因素 + +``` +┌─────────────────────────────────────────────────────────────────────────┐ +│ 关键成功因素 │ +├─────────────────────────────────────────────────────────────────────────┤ +│ │ +│ 1. 技术准备充分 │ +│ └─► Week 1-2 完成FreeSWITCH学习和技术预研 │ +│ │ +│ 2. 核心功能优先 │ +│ └─► 先完成P0功能,确保基础可用 │ +│ │ +│ 3. 持续集成测试 │ +│ └─► 每完成一个模块立即测试,避免问题堆积 │ +│ │ +│ 4. CRM团队紧密配合 │ +│ └─► 提前沟通接口,并行开发 │ +│ │ +│ 5. 线路提前就位 │ +│ └─► 项目启动即申请运营商线路 │ +│ │ +│ 6. 分阶段上线 │ +│ └─► 先上线一条业务线验证,再全量推广 │ +│ │ +└─────────────────────────────────────────────────────────────────────────┘ +``` + +### 8.3 下一步行动 + +| 序号 | 行动项 | 负责人 | 完成时间 | +|------|-------|-------|---------| +| 1 | 确认团队人员到位 | 项目经理 | 项目启动前 | +| 2 | 采购/准备开发测试环境 | 运维 | Week 1 | +| 3 | 启动运营商线路申请 | 项目经理 | Week 1 | +| 4 | 组织FreeSWITCH技术培训 | 架构师 | Week 1-2 | +| 5 | 与CRM团队召开接口对接会议 | 架构师 | Week 2 | +| 6 | 完成技术方案评审 | 架构师 | Week 2 | + +--- \ No newline at end of file diff --git a/membership/.claude/agents/demand-assessor.md b/membership/.claude/agents/demand-assessor.md new file mode 100644 index 0000000..1cc3ef3 --- /dev/null +++ b/membership/.claude/agents/demand-assessor.md @@ -0,0 +1,203 @@ +你是一个精通 Java 微服务架构的资深技术负责人。 + +请基于以下统一模型评估需求的工作量。 + +============================== +整体工作量模型 +============================== + +工作量指数 W = +(单元业务复杂度 B × 单元数量 S) +× 技术复杂度系数 F(T) +× AI效率系数 G(A) + +其中: + +B = 单个功能单元复杂度 +S = 单元数量 +F(T) = 技术放大系数 +G(A) = AI效率系数 + +请严格按照步骤执行。 + + +==================================================== +第一部分:识别功能单元(规模 S) +==================================================== + +1. 识别最小可重复功能单元 + (例如:接口、页面、报表、定时任务等) + +2. 统计每类单元数量 + +要求: +- 不要在此阶段评估复杂度 +- 仅统计数量 + +输出: +- 单元类型 +- 每类数量 +- 总数量 S + + +==================================================== +第二部分:单元业务复杂度评估 B(仅评单个单元) +==================================================== + +假设只实现一个单元,评分(1-5): + +1. 业务规则数量 +2. 状态流转复杂度 +3. 异常处理复杂度 +4. 边界场景复杂度 +5. 需求不确定性 + +计算: + +B = 五项平均值(保留1位小数) + +注意: +禁止在此阶段考虑单元数量。 + +输出: +- 各项评分 +- 单元复杂度 B + + +==================================================== +第三部分:技术复杂度评估 F(T) +==================================================== + +评估技术复杂度等级 T(1-5): + +1 = 单服务简单CRUD +2 = 单服务中等逻辑 +3 = 多服务调用 +4 = 涉及DB变更/MQ +5 = 分布式事务/核心链路/高并发 + +计算: + +F(T) = 1 + 0.2 × (T - 1) + +输出: +- T值 +- 技术复杂度系数 F(T) +- 技术风险说明 + + +==================================================== +第四部分:AI效率系数 G(A) 计算 +==================================================== + +步骤A:正向评分(1-5分) + +1.需求清晰 +2.规则明确度 +3.可验证性 +4.代码结构清晰度 + +P = 四项得分之和 + + +步骤B:架构抽象复杂度(计数制) + +每触发一项 +1: + +- 策略/模板动态组合 +- 插件或SPI机制 +- 规则引擎/表达式驱动 +- AOP深度影响核心逻辑 +- Saga/TCC/补偿机制 +- 多租户/动态数据源 + +记为 N1 + + +步骤C:变更影响范围(计数制) + +每触发一项 +1: + +- 老服务接口变更 +- 数据库老表变更 +- 核心业务链路变更 +- 公共组件修改 +- 权限安全机制修改 +- 分布式事务/MQ变更 +- 低测试覆盖区域 + +记为 N2 + + +步骤D:历史耦合程度(计数制) + +每触发一项 +1: + +- 巨型类 +- 高复杂度方法 +- 隐式调用链 +- 模块边界不清晰 +- 测试覆盖<30% +- 多服务共享数据库 +- 无维护人/无文档 + +记为 N3 + + +步骤E:计算 + +N = N1 + N2 + N3 + +A = P - N + + +==================================================== +第五部分:安全门检查 +==================================================== + +若满足任一: + +- 修改核心结算逻辑 +- 修改分布式事务核心 +- 修改权限核心鉴权 +- 单测覆盖率<20% +- 无法清晰定位影响范围 + +标记为【高风险变更】 + + + +==================================================== +第六部分:AI效率系数映射 +==================================================== + +若非高风险变更: + +A ≥ 10 → G(A) = 0.55 +8 ≤ A < 10 → G(A) = 0.65 +6 ≤ A < 8 → G(A) = 0.75 +3 ≤ A < 6 → G(A) = 0.85 +1 ≤ A < 3 → G(A) = 0.95 +A ≤ 0 → G(A) = 1.0 + + +==================================================== +第七部分:最终工作量计算 +==================================================== + +计算: + +基础工作量 = B × S +技术放大后 = 基础工作量 × F(T) +最终工作量指数 W = 技术放大后 × G(A) + +请输出: + +1. 单元数量 S +2. 单元复杂度 B +3. 技术系数 F(T) +4. AI效率系数 G(A) +5. 最终工作量指数 W +6. 综合风险等级(低/中/高) +7. 是否建议拆分需求 +8. AI建议参与方式 \ No newline at end of file diff --git a/membership/.claude/skills/pmassist/SKILL.md b/membership/.claude/skills/pmassist/SKILL.md new file mode 100644 index 0000000..768f03b --- /dev/null +++ b/membership/.claude/skills/pmassist/SKILL.md @@ -0,0 +1,151 @@ +--- +name: pmassist +description: | + 产品文档协作与缺陷分析助手。用于创建或修订 PRD、FRD、DAR(Defect Analysis Report 缺陷分析报告)等产品类文档。 + 支持快速起草、标准迭代、严格定稿三种模式。默认优先保证交付效率,再按需补齐证据、留痕与原型。 +--- + +# pmassist + +## 核心原则 +- **分文档类型执行**: PRD、FRD、DAR 使用不同严格度。 +- **分阶段执行**: 草案、迭代、定稿采用不同要求,不默认一开始即使用最严格流程。 +- **WWH + PDCA 默认保留,但允许轻量化执行**。 +- **问答优先闭环关键问题,而非所有问题阻塞**。 +- **证据优先覆盖关键结论,而非所有句子逐条索证**。 +- **先可交付,再补完备性**。 + +--- + +## 0) 文档类型分流(先做) +根据用户初始描述进行分支;不确定就追问: + +- **PRD**: 新需求、流程优化、产品规划、业务方案、用户体验 +- **FRD**: 具体功能实现、接口/数据/流程细节、技术落地规格 +- **DAR**: 线上缺陷、事故复盘、根因分析、纠正预防 + +> 选择后加载对应模板: +- PRD → `references/prd.md` +- FRD → `references/frd.md` +- DAR → `references/dar.md` + +--- + +## 0.1) 执行模式选择(新增) +在确认文档类型后,必须再确认执行模式: + +### A. Quick 模式 +适用于: +- PRD 初稿 +- 需求探索 +- 信息不完整但希望先出版本 +- 老需求的轻量改版 + +特点: +- 允许先生成 v0 草案 +- 允许部分章节以 `[ASSUMPTION]` 标注 +- 不要求每轮完整 PDCA 留痕 +- 不要求 P0 全部解决后才继续草案输出 +- 图表、证据映射表可延后到定稿前补齐 + +### B. Standard 模式 +适用于: +- 常规 PRD/FRD +- 多方评审前的文档整理 +- 需要一定可追溯性,但不需要最强审计痕迹 + +特点: +- 执行 WWH + PDCA +- 关键问题需要闭环 +- 关键章节需要证据 +- 每轮有摘要与变更记录 +- 可以带未决项输出“待确认版” + +### C. Strict 模式 +适用于: +- FRD 正式交付 +- DAR 缺陷分析 +- 高风险项目 +- 需要完整审计留痕的文档 + +特点: +- 必须完整执行 WWH + PDCA +- 必须严格问答闭环 +- P0 未解答不得定稿 +- 必须完成证据→章节映射 +- 必须完成图表、表格、差异分析、资产深挖 + +### 默认策略 +- **PRD 默认 Quick** +- **FRD 默认 Standard** +- **DAR 默认 Strict** + +若用户未指定,按以上默认策略执行。 + +--- + +## 1) 确认工作目录与项目简称 +- 默认路径:`./{项目简称}-{YYYYMMDD-HHMM}` +- 项目简称来自「需求极简概称」或「文件标题」 +- 必须询问用户确认;未确认不得创建目录 + +--- + +## 1.5) 会话恢复(Resume Session) + +### 触发条件 +用户提供已存在的工作目录路径,或明确表达以下意图时立即执行会话恢复: +- “继续之前的工作” +- “修改 XXX 的 PRD/FRD/DAR” +- “重新编辑 {workdir} 的文档” +- “在 {workdir} 基础上调整” +- 用户直接提供形如 `./项目名-20260209-1500` 的路径 + +### 验证会话有效性 +基础必备文件: +- `session.yaml` +- `desc.md` + +增强校验文件: +- `summary.md` +- `outputs/{doc_type}.md` + +若基础文件缺失 → 提示损坏,建议创建新会话 +若增强文件缺失 → 允许恢复,但标记为“部分恢复” + +### 状态回顾(自动生成报告) +读取以下文件: +- `session.yaml` → 获取文档类型、当前 Round、状态、模式 +- `summary.md` → 回顾已完成内容(若存在) +- `questions/round_*.yaml` → 统计遗留问题(若存在) +- `outputs/{doc_type}.md` → 检查章节完成度(若存在) +- `session.yaml` 的 `prototype` 块 → 原型状态(如果启用) + +生成会话状态报告并展示给用户。 + +### 询问工作模式 +展示报告后,询问用户选择工作方式: + +- **Continue**:继续当前迭代 +- **Revise**:开启新轮次修订 +- **Patch**:仅改局部内容 +- **Prototype**:更新原型 +- **Finalize**:执行最终定稿 +- **Fast Draft**:基于已有材料快速重生成草案(新增) + +--- + +## 2) 初始化工作区(确认后执行) + +### 标准目录结构 +```text +{workdir}/ + desc.md + session.yaml + summary.md + decision_log.md + materials/ + materials_index.md + rounds/ + questions/ + outputs/ \ No newline at end of file diff --git a/membership/.claude/skills/tgassist/SKILL.md b/membership/.claude/skills/tgassist/SKILL.md new file mode 100644 index 0000000..e3568a2 --- /dev/null +++ b/membership/.claude/skills/tgassist/SKILL.md @@ -0,0 +1,270 @@ +--- +name: tgassist +description: | + 项目开发“基座操作系统”技能。通过统一 Spec Workspace、角色协作、阶段门禁与证据追溯, + 让 AI on the loop 成为可执行流程,推动项目从需求到验收全程可控、可验证、可复盘。 +--- + +# tgassist + +## 核心定位(必须) +- tgassist 是 **项目级协作治理系统**,不是 PRD/FRD/DAR 文档生成器。 +- **pmassist 是前序步骤且独立存在**:tgassist 只接收已形成的需求输入(可由 pmassist 或人类提供)。 +- tgassist 借鉴 pmassist 的“精益助理精神”和“资产深挖技巧”,但**不包含 pmassist 功能**。 + +## 核心规则(强制) +- **AI on the loop**:关键节点必须人类确认(初始化、阶段门禁、可选门禁启用/变更、验收/归档)。 +- **大周天固定主线**:提供需求 → 明确验收标准 → 制定计划 →(可选)架构设计 → 模块任务拆分 → 功能开发 →(可选)代码评审 → 测试 → 验收评审 → 归档。 +- **小周天 PDCA**:所有角色以 PDCA 闭环执行。 +- **问题闭环**:每轮必须生成问题清单(P0/P1/P2);P0 未关闭不得进入下一轮完整输出。 +- **证据优先**:关键结论必须标注证据或 `[ASSUMPTION]`;需维护证据索引与章节映射。 +- **资产深挖**:若存在 CodeMap/DomainMap/Runtime,必须下钻至页面/字段/调用链证据层级。 +- **门禁治理**:可选门禁由系统推荐、用户确认;中途变更必须走变更单并记录风险接受。 +- **流程裁剪**:允许按项目规模/风险等级裁剪角色流程,但必须留痕。 +- **RACI 裁剪**:角色权限矩阵可按项目规模裁剪,裁剪原因必须落盘。 +- **Git 纪律可选**:关键产出是否提交 Git 由用户确认;若启用需记录摘要/角色/阶段/变更原因。 +- **不做外部工具联动**:不对接 Jira/飞书/Notion/GitHub(可在未来扩展)。 + +## 0) 入口与角色选择 +1. 选择工作方向:初始化项目 / 需求与验收 / 开发推进 / 测试文档 / 评审验收 / 变更管理 / 复盘归档。 +2. 选择角色 Assist:PM / PJM / Arch / Dev / QA / Council(固定 6 角色)。 +3. 系统基于 workspace 缺口与风险等级给出推荐角色,用户确认后进入流程。 + +工作方向菜单: + +| # | 方向 | 角色 | 适用场景 | +|---|------|------|----------| +| 1 | 初始化项目 | PJM | 新建 workspace,填充 project.yaml/session.yaml | +| 2 | 需求与验收 | PM | 需求拆解、验收标准制定 | +| 3 | 开发推进 | Arch / Dev / PJM | 架构设计、任务跟进、代码产出、单测记录 | +| 4 | 测试文档 | QA | 用例编写、缺陷记录、回归 | +| 5 | 评审验收 | Council | 质量门禁、安全/合规审核 | +| 6 | 变更管理 | PJM / Council | 变更单录入、门禁配置变更 | +| 7 | 复盘归档 | Council / PJM | 归档、release notes、Skill 沉淀 | + +## 1) 工作区初始化(必须确认) +**默认目录**:`./workspace/specs/{project}-{YYYYMMDD-HHMM}` +用户可指定路径;确认前不得创建目录。 + +目录结构(完全重新定义): +``` +{workdir}/ + 00_meta/ + project.yaml + session.yaml + summary.md + decision_log.md + status.md + roles.md + gates.md + evidence_index.md + rounds/ + questions/ + 01_input/ + requirements.md + references/ + 02_acceptance/ + acceptance.md + checklist.md + 03_plan/ + milestones.md + risks.md + dependencies.md + 04_design/ + architecture.md + interfaces.md + data_model.md + 05_delivery/ + dev_log.md + change_log.md + 06_test_docs/ + test_cases.md + defects.md + regression.md + 07_council/ + review.md + decision.md + 99_archive/ + release_notes.md +``` + +RACI 建议载体(可裁剪): +- `00_meta/roles.md`(角色职责矩阵) + +初始化模板: +- 使用 `assets/workspace_template/` 作为基线目录结构与文件模板。 +- 必要时用项目名称、风险等级、可选门禁配置填充 `00_meta/project.yaml` 与 `00_meta/session.yaml`。 +- 可选门禁清单模板位于:`assets/workspace_template/00_meta/gate_checklists/`。 + +初始化脚本: +- `scripts/init_workspace.sh`:复制模板并填充占位符,生成新的 workspace。 + - 参见 `references/project_yaml_schema.md` 了解字段规则与枚举值。 + - 参见 `references/session_yaml_schema.md` 了解 session 字段规则。 + +门禁清单生成脚本: +- `scripts/generate_gate_checklists.sh`:根据 `00_meta/project.yaml` 中启用的可选门禁,生成 `gate_checklists_active/`。 + - 门禁推荐规则参见 `references/gate_recommendation_matrix.md`。 + +## 2) 资产理解与证据索引(强制) +- 资产路径:`assets/codemap/`、`assets/domainmap/`、`assets/runtime/` +- 必须深挖证据层级: + - 前端路由/视图/分支:`codemap/frontend/**/routes.yaml`、`views.yaml`、`dialog_branches.yaml` + - 后端字段:`codemap/serve/dataobjects/java/*.yaml` + - 后端调用链:`codemap/serve/callchains/java/domains/*.yaml` + - 领域证据:`domainmap/*.yaml` +- 证据格式: + - 本地资产:`[CODEMAP:...]`、`[DOMAINMAP:...]`、`[RUNTIME:...]` + - 外部资料:`[SRC-xxx]` + - 无证据:`[ASSUMPTION]` + +## 3) 大周天阶段引擎(固定主线) +阶段推进规则: +- 每阶段进入前检查 DoR(输入完整性) +- 每阶段完成后检查 DoD(产出完整性) +- 通过门禁后才允许推进到下一阶段 + +可选门禁(系统推荐 + 用户确认): +- 架构设计门禁 +- 代码评审门禁 +- 安全审核门禁 +- 合规/隐私审核门禁(Council Assist) + +## 4) 小周天(角色 PDCA)流程模板 +所有角色遵循:**Plan → Do → Check → Act** + +### PM Assist +- Plan:需求输入与证据汇总 → 明确 WWH / 范围 / 验收标准 +- Do:需求拆解与证据映射 → 形成问题清单 +- Check:验收标准一致性、范围边界、证据缺口 +- Act:等待人类确认 → 交付给 PJM + +### PJM Assist +- Plan:读取需求/验收 → 制定计划与里程碑 +- Do:影响边界分析(模块/接口/数据/依赖/测试五类)→ 风险/资源/依赖治理 +- Check:计划与验收匹配、影响范围完整性 +- Act:任务发布与监控 → 变更单与复盘 + +### Arch Assist +## 你的身份 +你是系统架构师,负责整体技术设计。 + +## 你的目标 +- 设计清晰、可扩展的系统架构 +- 降低长期复杂度 +- 确保技术选型与约束合理 + +## 你可以做的事 +- 技术选型 +- 系统拆分 +- 定义模块边界和接口规范 +- 输出架构设计文档与数据模型 + +## 你不能做的事 +- 不编写业务代码 +- 不修改需求范围 +- 不绕过门禁单方面冻结方案 + +## 工作 +- Plan:读取需求/约束 → 资产深挖(CodeMap / DomainMap / Runtime)→ 列出架构设计问题清单 +- Do:方案设计与技术取舍 → 关键接口定义 → 数据模型设计 → 输出 `04_design/architecture.md`、`interfaces.md`、`data_model.md` +- Check:一致性/可行性/风险验证 → 确认与需求/验收标准对齐 → 证据缺口标注 +- Act:等待人类确认 → 按评审意见修订 → 方案冻结或进入变更控制 + +### Dev Assist(后端示例) +## 你的身份 +你是后端工程师,只负责实现后端业务逻辑。 + +## 你的目标 +- 按架构和需求实现稳定、可测试的代码 +- 保证单测覆盖率达标 +- 边开发边对照验收标准,不留"后补"债务 + +## 你可以做的事 +- 编写业务代码 +- 实现 API +- 编写必要的单元测试 + +## 你不能做的事 +- 不更改架构设计 +- 不新增未经批准的功能 +- 不跳过单元测试或以"后补"代替 + +## 工作 +- Plan:制定任务拆分计划 → **每个可测试单元必须列出单测计划**(方法名 + 测试场景列表) +- Do:功能开发 → **强制编写单元测试**(不得跳过,不得以"后补"代替)→ 边开发边对照验收标准 +- Check:**单测全部通过**(通过率 100% 才允许进入 Check)→ 记录单测结果到 `dev_log.md` → 总结到06_test_docs → 可选代码评审 +- Act:等待人类确认 → 按修改意见修订计划 → 进入下一轮 + +## 留痕载体 +- `05_delivery/dev_log.md` + +**单元测试强制规则**: +- 每个 Service 方法必须有对应单测(覆盖正常路径 + 至少 1 个异常/边界路径) +- 单测必须在功能开发完成后、Check 阶段前执行完毕 +- 单测结果必须以结构化表格记录到 `05_delivery/dev_log.md` 的 `## 单元测试记录` 区块 +- 单测未通过(或未执行)视为 DoD 未达成,**禁止推进到下一阶段** +- 单测覆盖率低于 **80%**(核心业务方法)须在 dev_log.md 中标注原因并获得人类确认 + +### QA Assist +## 你的身份 +你是测试工程师,专门负责找问题。 + +## 你的目标 +- 覆盖所有验收标准 +- 发现边界与异常情况 +- 尽可能暴露缺陷和风险 + +## 你可以做的事 +- 设计测试用例与覆盖矩阵 +- 提出反例和异常场景 +- 发现逻辑漏洞并记录缺陷 + +## 你不能做的事 +- 不修复代码 +- 不修改需求 +- 不跳过回归复测 + +## 工作 +- Plan:制定测试策略与范围 → 输出测试用例计划(覆盖正常路径 + 边界 + 异常) +- Do:用例编写与覆盖矩阵输出 → 执行测试 → 缺陷记录与归类(`06_test_docs/defects.md`) +- Check:回归与复测记录 → 确认缺陷关闭状态 → 覆盖矩阵完整性验证 +- Act:测试总结 → 等待人类确认/评审 → 缺陷未关闭不得推进验收 + +## 留痕载体 +- `06_test_docs/test_cases.md`、`defects.md`、`regression.md` + +### Council Assist +- Plan:汇总证据包 → 准备门禁检查清单 +- Do:质量门禁 →(可选)安全审核 →(可选)合规/隐私审核 +- Check:问题清单与整改要求 +- Act:评审决议 → 验收结论 → 归档 + +## 5) 合规/隐私最小清单(Council Assist 推荐) +- 合法性/公平性/透明性(告知与合法依据) +- 目的限定与用途限制 +- 数据最小化与数据质量 +- 存储期限与删除策略 +- 安全保障与访问控制 +- 个体权利响应(访问/更正/删除) +- 责任与可证明性(审计/制度/记录) +- DPIA/隐私影响评估(高风险必做) + +## 6) 变更管理(强制) +任何变更必须记录: +- 变更原因、影响范围、风险等级、回滚方案 +- 责任人、确认人、时间 +- 是否影响门禁配置(如需变更须二次确认) + +## 7) 留痕与交付物 +必须落盘: +- `summary.md`(每轮摘要) +- `decision_log.md`(关键决策) +- `rounds/round_N.md`(PDCA 过程) +- `questions/round_N.yaml`(问题清单) +- `evidence_index.md`(证据索引) +- `roles.md`(RACI,按规模裁剪) + +## 8) 禁止事项 +- 未确认即创建目录/更改门禁 +- 未关闭 P0 问题即推进阶段 +- 无证据断言关键结论 diff --git a/membership/.claude/skills/tgassist/assets/workspace_template/00_meta/decision_log.md b/membership/.claude/skills/tgassist/assets/workspace_template/00_meta/decision_log.md new file mode 100644 index 0000000..3af1638 --- /dev/null +++ b/membership/.claude/skills/tgassist/assets/workspace_template/00_meta/decision_log.md @@ -0,0 +1,2 @@ +# Decision Log +- {{date}}: 初始化项目与基础规则确认。 diff --git a/membership/.claude/skills/tgassist/assets/workspace_template/00_meta/evidence_index.md b/membership/.claude/skills/tgassist/assets/workspace_template/00_meta/evidence_index.md new file mode 100644 index 0000000..75e7ff9 --- /dev/null +++ b/membership/.claude/skills/tgassist/assets/workspace_template/00_meta/evidence_index.md @@ -0,0 +1,5 @@ +# Evidence Index + +| ID | Title | Type | Source | Date | Path | Notes | +|---|---|---|---|---|---|---| +| SRC-001 | | | | | | | diff --git a/membership/.claude/skills/tgassist/assets/workspace_template/00_meta/gate_checklists/architecture_review.md b/membership/.claude/skills/tgassist/assets/workspace_template/00_meta/gate_checklists/architecture_review.md new file mode 100644 index 0000000..a624a4e --- /dev/null +++ b/membership/.claude/skills/tgassist/assets/workspace_template/00_meta/gate_checklists/architecture_review.md @@ -0,0 +1,12 @@ +# Architecture Review Checklist + +| Item | Description | Status | Evidence | Notes | +|---|---|---|---|---| +| Scope | Architecture scope matches requirements | | | | +| Constraints | Constraints and assumptions documented | | | | +| Interfaces | Key interfaces defined | | | | +| Data model | Core data model documented | | | | +| Tradeoffs | Tradeoffs and alternatives evaluated | | | | +| Risks | Architecture risks identified and mitigations planned | | | | +| Non-functional | Performance, availability, security targets defined | | | | +| Evolution | Migration/compatibility plan documented | | | | diff --git a/membership/.claude/skills/tgassist/assets/workspace_template/00_meta/gate_checklists/code_review.md b/membership/.claude/skills/tgassist/assets/workspace_template/00_meta/gate_checklists/code_review.md new file mode 100644 index 0000000..e963c11 --- /dev/null +++ b/membership/.claude/skills/tgassist/assets/workspace_template/00_meta/gate_checklists/code_review.md @@ -0,0 +1,12 @@ +# Code Review Checklist + +| Item | Description | Status | Evidence | Notes | +|---|---|---|---|---| +| Requirements | Implementation matches acceptance criteria | | | | +| Tests | Unit/functional tests updated and passing | | | | +| Error handling | Errors handled and user-facing behavior defined | | | | +| Performance | Performance impact assessed | | | | +| Security | Security considerations reviewed | | | | +| Maintainability | Code readability and structure acceptable | | | | +| Compatibility | Backward compatibility assessed | | | | +| Logging/Monitoring | Observability changes documented | | | | diff --git a/membership/.claude/skills/tgassist/assets/workspace_template/00_meta/gate_checklists/privacy_review.md b/membership/.claude/skills/tgassist/assets/workspace_template/00_meta/gate_checklists/privacy_review.md new file mode 100644 index 0000000..8b09222 --- /dev/null +++ b/membership/.claude/skills/tgassist/assets/workspace_template/00_meta/gate_checklists/privacy_review.md @@ -0,0 +1,13 @@ +# Privacy & Compliance Review Checklist + +| Item | Description | Status | Evidence | Notes | +|---|---|---|---|---| +| Lawfulness/Transparency | Legal basis and user notices are documented | | | | +| Purpose limitation | Data use limited to defined purposes | | | | +| Data minimization | Only necessary data collected | | | | +| Data quality | Data accuracy and update mechanisms defined | | | | +| Storage limitation | Retention period defined and enforced | | | | +| Security safeguards | Security controls for personal data | | | | +| Individual rights | Access/rectify/delete requests supported | | | | +| Accountability | Audit trail and responsibility defined | | | | +| DPIA | DPIA completed for high-risk processing | | | | diff --git a/membership/.claude/skills/tgassist/assets/workspace_template/00_meta/gate_checklists/security_review.md b/membership/.claude/skills/tgassist/assets/workspace_template/00_meta/gate_checklists/security_review.md new file mode 100644 index 0000000..e989b8b --- /dev/null +++ b/membership/.claude/skills/tgassist/assets/workspace_template/00_meta/gate_checklists/security_review.md @@ -0,0 +1,12 @@ +# Security Review Checklist + +| Item | Description | Status | Evidence | Notes | +|---|---|---|---|---| +| Threat model | Threat model exists for new/changed components | | | | +| AuthN/AuthZ | Access control and permission checks reviewed | | | | +| Secrets | Secrets managed securely (no hard-coded secrets) | | | | +| Input validation | User/externally sourced inputs validated | | | | +| Dependencies | Third-party dependencies reviewed/approved | | | | +| Logging | Security-relevant events logged | | | | +| Incident response | Rollback/mitigation plan documented | | | | +| Data protection | Sensitive data protected in transit/at rest | | | | diff --git a/membership/.claude/skills/tgassist/assets/workspace_template/00_meta/gates.md b/membership/.claude/skills/tgassist/assets/workspace_template/00_meta/gates.md new file mode 100644 index 0000000..69a7568 --- /dev/null +++ b/membership/.claude/skills/tgassist/assets/workspace_template/00_meta/gates.md @@ -0,0 +1,43 @@ +# Gates (DoR / DoD) + +> 每阶段进入前检查 DoR,完成后检查 DoD;可选门禁由系统推荐、用户确认。 + +## 需求输入 +- DoR: 需求来源明确;背景/目标初步描述 +- DoD: 需求文本落盘;证据索引初版 + +## 验收标准 +- DoR: 需求范围与目标明确 +- DoD: 验收标准可测试;范围边界明确 + +## 计划制定 +- DoR: 验收标准确认 +- DoD: 里程碑/资源/风险/依赖落盘 + +## 架构设计(可选) +- DoR: 复杂度/风险达到门槛 +- DoD: 架构方案/接口/数据模型落盘并评审 + +## 模块任务拆分 +- DoR: 计划确认 +- DoD: 任务列表与责任人明确 + +## 功能开发 +- DoR: 任务清单确认 +- DoD: 实现记录与单测/自测结果 + +## 代码评审(可选) +- DoR: 评审门禁启用 +- DoD: 评审结论与整改记录 + +## 测试 +- DoR: 可测试版本与用例准备 +- DoD: 测试报告/缺陷清单/回归记录 + +## 验收评审 +- DoR: 证据包齐全 +- DoD: 评审决议与整改清单 + +## 归档 +- DoR: 所有门禁通过 +- DoD: 归档文档与复盘记录 diff --git a/membership/.claude/skills/tgassist/assets/workspace_template/00_meta/project.yaml b/membership/.claude/skills/tgassist/assets/workspace_template/00_meta/project.yaml new file mode 100644 index 0000000..bec651c --- /dev/null +++ b/membership/.claude/skills/tgassist/assets/workspace_template/00_meta/project.yaml @@ -0,0 +1,27 @@ +schema: + name: tgassist.project + version: "0.1" + +project: + name: "{{project_name}}" + alias: "{{project_alias}}" + description: "{{project_desc}}" + owner: "{{project_owner}}" + created_at: "{{date}}" + +governance: + scale: "small|medium|large" + risk_level: "low|medium|high" + optional_gates: + architecture_design: "enabled|disabled" + code_review: "enabled|disabled" + security_review: "enabled|disabled" + privacy_compliance: "enabled|disabled" + git_policy: + enabled: "true|false" + commit_format: "[role][phase] summary - reason" + +evidence_sources: + codemap: "assets/codemap/" + domainmap: "assets/domainmap/" + runtime: "assets/runtime/" diff --git a/membership/.claude/skills/tgassist/assets/workspace_template/00_meta/questions/round_N.yaml b/membership/.claude/skills/tgassist/assets/workspace_template/00_meta/questions/round_N.yaml new file mode 100644 index 0000000..3cd890b --- /dev/null +++ b/membership/.claude/skills/tgassist/assets/workspace_template/00_meta/questions/round_N.yaml @@ -0,0 +1,7 @@ +round: {{round}} +questions: + - id: Q{{round}}-1 + priority: P0 + question: "..." + options: ["...", "...", "其他"] + status: pending diff --git a/membership/.claude/skills/tgassist/assets/workspace_template/00_meta/roles.md b/membership/.claude/skills/tgassist/assets/workspace_template/00_meta/roles.md new file mode 100644 index 0000000..e2af403 --- /dev/null +++ b/membership/.claude/skills/tgassist/assets/workspace_template/00_meta/roles.md @@ -0,0 +1,16 @@ +# Roles (RACI) + +> 按项目规模裁剪并记录原因。 + +| 阶段/角色 | PM | PJM | Arch | Dev | QA | Council | +|---|---|---|---|---|---|---| +| 需求输入 | R | C | I | I | I | I | +| 验收标准 | A | C | C | I | I | I | +| 计划制定 | C | A/R | C | I | I | I | +| 架构设计(可选) | C | C | A/R | I | I | I | +| 任务拆分 | C | A/R | C | R | I | I | +| 功能开发 | I | C | C | A/R | I | I | +| 代码评审(可选) | I | C | C | A/R | I | I | +| 测试 | I | C | I | C | A/R | I | +| 验收评审 | C | C | C | C | C | A/R | +| 归档 | I | A/R | I | I | I | C | diff --git a/membership/.claude/skills/tgassist/assets/workspace_template/00_meta/rounds/round_N.md b/membership/.claude/skills/tgassist/assets/workspace_template/00_meta/rounds/round_N.md new file mode 100644 index 0000000..6e8d4a8 --- /dev/null +++ b/membership/.claude/skills/tgassist/assets/workspace_template/00_meta/rounds/round_N.md @@ -0,0 +1,21 @@ +# Round {{round}} + +## Plan +- WWH 填充度: +- 本轮目标: +- 需要读取的资产与资料: +- 需要提出的问题: + +## Do +- 资产读取: +- 分析与产出: +- 提问: + +## Check +- 目标覆盖: +- 证据充分性: +- 逻辑一致性: + +## Act +- 更新 summary/decision_log/session +- 规划下一轮 diff --git a/membership/.claude/skills/tgassist/assets/workspace_template/00_meta/session.yaml b/membership/.claude/skills/tgassist/assets/workspace_template/00_meta/session.yaml new file mode 100644 index 0000000..5d5f310 --- /dev/null +++ b/membership/.claude/skills/tgassist/assets/workspace_template/00_meta/session.yaml @@ -0,0 +1,43 @@ +schema: + name: tgassist.session + version: "0.1" + +status: + current_phase: "demand" + current_round: 1 + state: "in_progress" + last_updated: "{{date}}" + +phases: + - name: "demand" + status: "in_progress" + - name: "acceptance" + status: "pending" + - name: "plan" + status: "pending" + - name: "architecture" + status: "optional" + - name: "decompose" + status: "pending" + - name: "develop" + status: "pending" + - name: "code_review" + status: "optional" + - name: "test" + status: "pending" + - name: "acceptance_review" + status: "pending" + - name: "archive" + status: "pending" + +questions: + p0_open: 0 + p1_open: 0 + p2_open: 0 + +metrics: + evidence_count: 0 + mermaid_count: 0 + table_count: 0 + +assumptions: [] diff --git a/membership/.claude/skills/tgassist/assets/workspace_template/00_meta/status.md b/membership/.claude/skills/tgassist/assets/workspace_template/00_meta/status.md new file mode 100644 index 0000000..10b840f --- /dev/null +++ b/membership/.claude/skills/tgassist/assets/workspace_template/00_meta/status.md @@ -0,0 +1,10 @@ +# Status + +- 当前阶段:{{current_phase}} +- 当前轮次:{{current_round}} +- 阻塞问题:{{p0_count}} +- 关键决策:{{last_decision}} +- 最近更新:{{date}} + +## 下一步 +- {{next_action}} diff --git a/membership/.claude/skills/tgassist/assets/workspace_template/00_meta/summary.md b/membership/.claude/skills/tgassist/assets/workspace_template/00_meta/summary.md new file mode 100644 index 0000000..0738e5e --- /dev/null +++ b/membership/.claude/skills/tgassist/assets/workspace_template/00_meta/summary.md @@ -0,0 +1,2 @@ +# Summary +- {{date}}: 初始化项目,进入 Round 1。 diff --git a/membership/.claude/skills/tgassist/assets/workspace_template/01_input/requirements.md b/membership/.claude/skills/tgassist/assets/workspace_template/01_input/requirements.md new file mode 100644 index 0000000..ab27475 --- /dev/null +++ b/membership/.claude/skills/tgassist/assets/workspace_template/01_input/requirements.md @@ -0,0 +1,7 @@ +# Requirements + +## 背景与目标 + +## 需求概述 + +## 证据/参考 diff --git a/membership/.claude/skills/tgassist/assets/workspace_template/02_acceptance/acceptance.md b/membership/.claude/skills/tgassist/assets/workspace_template/02_acceptance/acceptance.md new file mode 100644 index 0000000..27ec650 --- /dev/null +++ b/membership/.claude/skills/tgassist/assets/workspace_template/02_acceptance/acceptance.md @@ -0,0 +1,5 @@ +# Acceptance + +## 验收标准 + +## 范围边界 diff --git a/membership/.claude/skills/tgassist/assets/workspace_template/02_acceptance/checklist.md b/membership/.claude/skills/tgassist/assets/workspace_template/02_acceptance/checklist.md new file mode 100644 index 0000000..e0d8659 --- /dev/null +++ b/membership/.claude/skills/tgassist/assets/workspace_template/02_acceptance/checklist.md @@ -0,0 +1,5 @@ +# Acceptance Checklist + +| Item | Description | Status | Evidence | +|---|---|---|---| +| | | | | diff --git a/membership/.claude/skills/tgassist/assets/workspace_template/03_plan/dependencies.md b/membership/.claude/skills/tgassist/assets/workspace_template/03_plan/dependencies.md new file mode 100644 index 0000000..b89fcba --- /dev/null +++ b/membership/.claude/skills/tgassist/assets/workspace_template/03_plan/dependencies.md @@ -0,0 +1,5 @@ +# Dependencies + +| Dependency | Type | Impact | Owner | Status | +|---|---|---|---|---| +| | | | | | diff --git a/membership/.claude/skills/tgassist/assets/workspace_template/03_plan/milestones.md b/membership/.claude/skills/tgassist/assets/workspace_template/03_plan/milestones.md new file mode 100644 index 0000000..12ccaeb --- /dev/null +++ b/membership/.claude/skills/tgassist/assets/workspace_template/03_plan/milestones.md @@ -0,0 +1,5 @@ +# Milestones + +| Milestone | Date | Owner | Status | +|---|---|---|---| +| | | | | diff --git a/membership/.claude/skills/tgassist/assets/workspace_template/03_plan/risks.md b/membership/.claude/skills/tgassist/assets/workspace_template/03_plan/risks.md new file mode 100644 index 0000000..335c608 --- /dev/null +++ b/membership/.claude/skills/tgassist/assets/workspace_template/03_plan/risks.md @@ -0,0 +1,5 @@ +# Risks + +| Risk | Level | Mitigation | Owner | Status | +|---|---|---|---|---| +| | | | | | diff --git a/membership/.claude/skills/tgassist/assets/workspace_template/04_design/architecture.md b/membership/.claude/skills/tgassist/assets/workspace_template/04_design/architecture.md new file mode 100644 index 0000000..946ae92 --- /dev/null +++ b/membership/.claude/skills/tgassist/assets/workspace_template/04_design/architecture.md @@ -0,0 +1,7 @@ +# Architecture + +## Overview + +## Tradeoffs + +## Evidence diff --git a/membership/.claude/skills/tgassist/assets/workspace_template/04_design/data_model.md b/membership/.claude/skills/tgassist/assets/workspace_template/04_design/data_model.md new file mode 100644 index 0000000..ed3c60c --- /dev/null +++ b/membership/.claude/skills/tgassist/assets/workspace_template/04_design/data_model.md @@ -0,0 +1,5 @@ +# Data Model + +| Entity | Fields | Constraints | Notes | +|---|---|---|---| +| | | | | diff --git a/membership/.claude/skills/tgassist/assets/workspace_template/04_design/interfaces.md b/membership/.claude/skills/tgassist/assets/workspace_template/04_design/interfaces.md new file mode 100644 index 0000000..457b965 --- /dev/null +++ b/membership/.claude/skills/tgassist/assets/workspace_template/04_design/interfaces.md @@ -0,0 +1,5 @@ +# Interfaces + +| Interface | Owner | Input | Output | Notes | +|---|---|---|---|---| +| | | | | | diff --git a/membership/.claude/skills/tgassist/assets/workspace_template/05_delivery/change_log.md b/membership/.claude/skills/tgassist/assets/workspace_template/05_delivery/change_log.md new file mode 100644 index 0000000..aabf5cc --- /dev/null +++ b/membership/.claude/skills/tgassist/assets/workspace_template/05_delivery/change_log.md @@ -0,0 +1,5 @@ +# Change Log + +| Change | Reason | Impact | Decision | Date | +|---|---|---|---|---| +| | | | | | diff --git a/membership/.claude/skills/tgassist/assets/workspace_template/05_delivery/dev_log.md b/membership/.claude/skills/tgassist/assets/workspace_template/05_delivery/dev_log.md new file mode 100644 index 0000000..c431eb9 --- /dev/null +++ b/membership/.claude/skills/tgassist/assets/workspace_template/05_delivery/dev_log.md @@ -0,0 +1,90 @@ +# 开发日志 (05_delivery/dev_log.md) + +> **项目**: {project_name} +> **更新规则**: 每个任务完成或有重要产出时更新;单元测试执行后**必须**填写"单元测试记录"区块 + +--- + +## 任务状态总览 + +| 任务 | 负责人 | Day | 状态 | 完成时间 | 备注 | +|------|--------|-----|------|----------|------| +| T-xxx | — | — | ⬜ 待开始 | — | — | + +> 状态说明:✅ 完成 / 🔄 进行中 / ⬜ 待开始 / ❌ 阻塞 + +--- + +## 开发日志详情 + +### {YYYY-MM-DD} | Round N | Dev Assist — {任务编号} {任务名称} + +**PDCA 阶段**: Do — 代码产出 + +**本轮产出**: + +| 文件 | 模块 | 说明 | +|------|------|------| +| — | — | — | + +**关键设计决策**: +- (记录影响后续维护的设计选择) + +**DoD 验证清单**: +- [ ] ... + +**遗留问题**: +- (无则写"无") + +--- + +## 单元测试记录 + +> ⚠️ **强制要求**:每个任务的单测必须在进入 Check 阶段前完成并记录。 +> 单测未通过或未记录 = DoD 未达成 = 禁止推进下一阶段。 + +### {任务编号} {任务名称} — 单测计划与结果 + +**执行时间**: {YYYY-MM-DD HH:MM} +**执行人**: {name} +**测试框架**: JUnit 5 / Mockito(或实际使用框架) + +#### 单测结果明细 + +| 测试类 | 测试方法 | 场景描述 | 结果 | 备注 | +|--------|----------|----------|------|------| +| `XxxServiceTest` | `testSave_success` | 正常创建,返回主键 | ✅ PASS | — | +| `XxxServiceTest` | `testSave_missingOrderNo` | 订单号为空,抛 BusinessException | ✅ PASS | — | +| `XxxServiceTest` | `testSave_invalidProvider` | 服务商不存在,抛 BusinessException | ✅ PASS | — | +| `XxxServiceTest` | `testList_emptyResult` | 无数据时返回空 Page | ✅ PASS | — | + +> 结果说明:✅ PASS / ❌ FAIL / ⚠️ SKIP(须注明原因) + +#### 覆盖率摘要 + +| 类 | 方法数 | 已覆盖 | 覆盖率 | 是否达标(≥80%) | +|----|--------|--------|--------|-----------------| +| `XxxService` | — | — | —% | — | + +> 覆盖率低于 80% 须填写原因,并获得人类确认后方可推进: +> - 原因: +> - 确认人: +> - 确认时间: + +#### 失败/跳过明细(若有) + +| 测试方法 | 失败原因 | 修复状态 | 修复时间 | +|----------|----------|----------|----------| +| — | — | — | — | + +--- + +## 变更记录 + +> 暂无变更 + +--- + +## 阻塞记录 + +> 暂无阻塞 diff --git a/membership/.claude/skills/tgassist/assets/workspace_template/06_test_docs/defects.md b/membership/.claude/skills/tgassist/assets/workspace_template/06_test_docs/defects.md new file mode 100644 index 0000000..fa85a5d --- /dev/null +++ b/membership/.claude/skills/tgassist/assets/workspace_template/06_test_docs/defects.md @@ -0,0 +1,5 @@ +# Defects + +| ID | Summary | Severity | Status | Evidence | +|---|---|---|---|---| +| | | | | | diff --git a/membership/.claude/skills/tgassist/assets/workspace_template/06_test_docs/regression.md b/membership/.claude/skills/tgassist/assets/workspace_template/06_test_docs/regression.md new file mode 100644 index 0000000..cc10947 --- /dev/null +++ b/membership/.claude/skills/tgassist/assets/workspace_template/06_test_docs/regression.md @@ -0,0 +1,5 @@ +# Regression + +| Version | Cases | Pass | Fail | Notes | +|---|---|---|---|---| +| | | | | | diff --git a/membership/.claude/skills/tgassist/assets/workspace_template/06_test_docs/test_cases.md b/membership/.claude/skills/tgassist/assets/workspace_template/06_test_docs/test_cases.md new file mode 100644 index 0000000..cd020d6 --- /dev/null +++ b/membership/.claude/skills/tgassist/assets/workspace_template/06_test_docs/test_cases.md @@ -0,0 +1,5 @@ +# Test Cases + +| Case | Scope | Steps | Expected | Status | +|---|---|---|---|---| +| | | | | | diff --git a/membership/.claude/skills/tgassist/assets/workspace_template/07_council/decision.md b/membership/.claude/skills/tgassist/assets/workspace_template/07_council/decision.md new file mode 100644 index 0000000..0941681 --- /dev/null +++ b/membership/.claude/skills/tgassist/assets/workspace_template/07_council/decision.md @@ -0,0 +1,5 @@ +# Decision + +| Item | Decision | Owner | Due | Status | +|---|---|---|---|---| +| | | | | | diff --git a/membership/.claude/skills/tgassist/assets/workspace_template/07_council/review.md b/membership/.claude/skills/tgassist/assets/workspace_template/07_council/review.md new file mode 100644 index 0000000..146d689 --- /dev/null +++ b/membership/.claude/skills/tgassist/assets/workspace_template/07_council/review.md @@ -0,0 +1,7 @@ +# Review + +## Summary + +## Issues + +## Decision diff --git a/membership/.claude/skills/tgassist/assets/workspace_template/99_archive/release_notes.md b/membership/.claude/skills/tgassist/assets/workspace_template/99_archive/release_notes.md new file mode 100644 index 0000000..f3a764b --- /dev/null +++ b/membership/.claude/skills/tgassist/assets/workspace_template/99_archive/release_notes.md @@ -0,0 +1,7 @@ +# Release Notes + +## Highlights + +## Changes + +## Risks diff --git a/membership/.claude/skills/tgassist/references/gate_recommendation_matrix.md b/membership/.claude/skills/tgassist/references/gate_recommendation_matrix.md new file mode 100644 index 0000000..9ec8edb --- /dev/null +++ b/membership/.claude/skills/tgassist/references/gate_recommendation_matrix.md @@ -0,0 +1,16 @@ +# Gate Recommendation Matrix (tgassist) + +> System recommends gates based on project scale and risk level. User confirmation is required. + +## Matrix + +| Risk \ Scale | Small | Medium | Large | +|---|---|---|---| +| Low | (none) | Code Review | Code Review | +| Medium | Code Review + Security Review | Architecture + Code Review + Security Review | Architecture + Code Review + Security Review | +| High | Architecture + Code Review + Security Review + Privacy/Compliance | Architecture + Code Review + Security Review + Privacy/Compliance | Architecture + Code Review + Security Review + Privacy/Compliance | + +## Notes +- Architecture gate recommended when system complexity is medium or above. +- Privacy/Compliance gate recommended for high-risk or personal data handling projects. +- User can override recommendations, but must record decision and risk acceptance. diff --git a/membership/.claude/skills/tgassist/references/project_yaml_schema.md b/membership/.claude/skills/tgassist/references/project_yaml_schema.md new file mode 100644 index 0000000..7eb7b31 --- /dev/null +++ b/membership/.claude/skills/tgassist/references/project_yaml_schema.md @@ -0,0 +1,50 @@ +# project.yaml Schema (tgassist) + +## Fields + +- `schema.name`: + - Value: `tgassist.project` + +- `schema.version`: + - Value: `0.1` + +- `project.name`: + - Human-readable project name + +- `project.alias`: + - Short slug used for directory naming + +- `project.description`: + - One-line description + +- `project.owner`: + - Primary owner (role/person) + +- `project.created_at`: + - ISO date (YYYY-MM-DD) + +- `governance.scale`: + - Enum: `small | medium | large` + +- `governance.risk_level`: + - Enum: `low | medium | high` + +- `governance.optional_gates`: + - `architecture_design`: `enabled | disabled` + - `code_review`: `enabled | disabled` + - `security_review`: `enabled | disabled` + - `privacy_compliance`: `enabled | disabled` + +- `governance.git_policy`: + - `enabled`: `true | false` + - `commit_format`: string, default `[role][phase] summary - reason` + +- `evidence_sources`: + - `codemap`: path string + - `domainmap`: path string + - `runtime`: path string + +## Notes +- Optional gates default to `disabled` until user confirms. +- Risk level drives recommended optional gates. +- If `git_policy.enabled=true`, commits must include summary, role, phase, and change reason. diff --git a/membership/.claude/skills/tgassist/references/session_yaml_schema.md b/membership/.claude/skills/tgassist/references/session_yaml_schema.md new file mode 100644 index 0000000..2a12f27 --- /dev/null +++ b/membership/.claude/skills/tgassist/references/session_yaml_schema.md @@ -0,0 +1,44 @@ +# session.yaml Schema (tgassist) + +## Fields + +- `schema.name`: + - Value: `tgassist.session` + +- `schema.version`: + - Value: `0.1` + +- `status.current_phase`: + - Enum: `demand | acceptance | plan | architecture | decompose | develop | code_review | test | acceptance_review | archive` + +- `status.current_round`: + - Integer (>= 1) + +- `status.state`: + - Enum: `in_progress | awaiting_answers | finalized` + +- `status.last_updated`: + - ISO date (YYYY-MM-DD) + +- `phases`: + - List of phase objects + - Each phase has: + - `name` (same enum as `current_phase`) + - `status`: `pending | in_progress | completed | optional` + +- `questions`: + - `p0_open`: integer + - `p1_open`: integer + - `p2_open`: integer + +- `metrics`: + - `evidence_count`: integer + - `mermaid_count`: integer + - `table_count`: integer + +- `assumptions`: + - List of strings + +## Notes +- Phase progression requires DoR/DoD checks and gate approvals. +- `state` becomes `awaiting_answers` when P0 questions remain. diff --git a/membership/.claude/skills/tgassist/scripts/generate_gate_checklists.sh b/membership/.claude/skills/tgassist/scripts/generate_gate_checklists.sh new file mode 100644 index 0000000..38962e7 --- /dev/null +++ b/membership/.claude/skills/tgassist/scripts/generate_gate_checklists.sh @@ -0,0 +1,93 @@ +#!/usr/bin/env bash +set -euo pipefail + +usage() { + cat <<'USAGE' +Usage: + generate_gate_checklists.sh --project PATH [options] + +Required: + --project PATH Workspace root (contains 00_meta/project.yaml) + +Optional: + --output PATH Output directory for active gate checklists + (default: /00_meta/gate_checklists_active) + --template PATH Template dir (default: skills/tg/assets/workspace_template/00_meta/gate_checklists) + -h, --help Show help +USAGE +} + +die() { + echo "error: $*" >&2 + exit 1 +} + +command -v python3 >/dev/null 2>&1 || die "python3 is required" + +project="" +output="" +template_dir="" + +while [[ $# -gt 0 ]]; do + case "$1" in + --project) project="$2"; shift 2;; + --output) output="$2"; shift 2;; + --template) template_dir="$2"; shift 2;; + -h|--help) usage; exit 0;; + *) die "unknown arg: $1";; + esac +done + +[[ -z "$project" ]] && die "--project is required" + +project_yaml="$project/00_meta/project.yaml" +[[ -f "$project_yaml" ]] || die "missing $project_yaml" + +if [[ -z "$output" ]]; then + output="$project/00_meta/gate_checklists_active" +fi + +if [[ -z "$template_dir" ]]; then + script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + template_dir="${script_dir}/../assets/workspace_template/00_meta/gate_checklists" +fi + +mkdir -p "$output" + +enabled_gates=$(python3 - "$project_yaml" <<'PY' +import re, sys +path = sys.argv[1] +patterns = { + "architecture_design": "architecture_review.md", + "code_review": "code_review.md", + "security_review": "security_review.md", + "privacy_compliance": "privacy_review.md", +} +found = {k: False for k in patterns} +for line in open(path, 'r', encoding='utf-8'): + m = re.match(r"\s*(architecture_design|code_review|security_review|privacy_compliance)\s*:\s*\"?(\w+)\"?", line) + if m: + found[m.group(1)] = (m.group(2).strip().lower() == "enabled") + +files = [] +for k, v in found.items(): + if v: + files.append(patterns[k]) + +print(" ".join(files)) +PY +) + +if [[ -z "$enabled_gates" ]]; then + echo "No optional gates enabled." + exit 0 +fi + +for f in $enabled_gates; do + src="$template_dir/$f" + [[ -f "$src" ]] || die "template missing: $src" + cp "$src" "$output/" + echo "Copied: $f" +done + +echo "Active gate checklists generated at: $output" diff --git a/membership/.claude/skills/tgassist/scripts/init_workspace.sh b/membership/.claude/skills/tgassist/scripts/init_workspace.sh new file mode 100644 index 0000000..6a111bc --- /dev/null +++ b/membership/.claude/skills/tgassist/scripts/init_workspace.sh @@ -0,0 +1,158 @@ +#!/usr/bin/env bash +set -euo pipefail + +usage() { + cat <<'USAGE' +Usage: + init_workspace.sh --name NAME [options] + +Required: + --name NAME Project name + +Optional: + --alias ALIAS Project alias (default: slugified name) + --desc DESC Project description + --owner OWNER Project owner + --scale small|medium|large Project scale (default: medium) + --risk low|medium|high Risk level (default: medium) + --gate-architecture enabled|disabled Optional gate (default: disabled) + --gate-code-review enabled|disabled Optional gate (default: disabled) + --gate-security enabled|disabled Optional gate (default: disabled) + --gate-privacy enabled|disabled Optional gate (default: disabled) + --git-enabled true|false Git policy enabled (default: false) + --git-commit-format FORMAT Commit format (default: "[role][phase] summary - reason") + --output PATH Output directory (default: ./workspace/specs/{alias}-YYYYMMDD-HHMM) + -h, --help Show help +USAGE +} + +die() { + echo "error: $*" >&2 + exit 1 +} + +command -v python3 >/dev/null 2>&1 || die "python3 is required" + +project_name="" +project_alias="" +project_desc="" +project_owner="" +scale="medium" +risk="medium" +_gate_arch="disabled" +_gate_code_review="disabled" +_gate_security="disabled" +_gate_privacy="disabled" +git_enabled="false" +git_commit_format="[role][phase] summary - reason" +output="" + +while [[ $# -gt 0 ]]; do + case "$1" in + --name) project_name="$2"; shift 2;; + --alias) project_alias="$2"; shift 2;; + --desc) project_desc="$2"; shift 2;; + --owner) project_owner="$2"; shift 2;; + --scale) scale="$2"; shift 2;; + --risk) risk="$2"; shift 2;; + --gate-architecture) _gate_arch="$2"; shift 2;; + --gate-code-review) _gate_code_review="$2"; shift 2;; + --gate-security) _gate_security="$2"; shift 2;; + --gate-privacy) _gate_privacy="$2"; shift 2;; + --git-enabled) git_enabled="$2"; shift 2;; + --git-commit-format) git_commit_format="$2"; shift 2;; + --output) output="$2"; shift 2;; + -h|--help) usage; exit 0;; + *) die "unknown arg: $1";; + esac +done + +[[ -z "$project_name" ]] && die "--name is required" + +if [[ -z "$project_alias" ]]; then + project_alias=$(echo "$project_name" | tr '[:upper:] ' '[:lower:]-' | tr -cd 'a-z0-9-') +fi + +if [[ -z "$output" ]]; then + output="./workspace/specs/${project_alias}-$(date +%Y%m%d-%H%M)" +fi + +if [[ -e "$output" ]]; then + die "output already exists: $output" +fi + +script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +template_dir="${script_dir}/../assets/workspace_template" + +mkdir -p "$output" +cp -R "$template_dir"/. "$output"/ + +date_str="$(date +%Y-%m-%d)" + +export TG_PROJECT_NAME="$project_name" +export TG_PROJECT_ALIAS="$project_alias" +export TG_PROJECT_DESC="$project_desc" +export TG_PROJECT_OWNER="$project_owner" +export TG_DATE="$date_str" +export TG_SCALE="$scale" +export TG_RISK="$risk" +export TG_GATE_ARCH="$_gate_arch" +export TG_GATE_CODE_REVIEW="$_gate_code_review" +export TG_GATE_SECURITY="$_gate_security" +export TG_GATE_PRIVACY="$_gate_privacy" +export TG_GIT_ENABLED="$git_enabled" +export TG_GIT_COMMIT_FORMAT="$git_commit_format" +export TG_CURRENT_PHASE="demand" +export TG_CURRENT_ROUND="1" +export TG_P0_COUNT="0" +export TG_LAST_DECISION="-" +export TG_NEXT_ACTION="collect requirements" + +replace_file() { + python3 - "$1" <<'PY' +import os +from pathlib import Path + +path = Path(os.environ["TARGET_FILE"]) +data = path.read_text() +repl = { + "project_name": os.environ.get("TG_PROJECT_NAME", ""), + "project_alias": os.environ.get("TG_PROJECT_ALIAS", ""), + "project_desc": os.environ.get("TG_PROJECT_DESC", ""), + "project_owner": os.environ.get("TG_PROJECT_OWNER", ""), + "date": os.environ.get("TG_DATE", ""), + "current_phase": os.environ.get("TG_CURRENT_PHASE", ""), + "current_round": os.environ.get("TG_CURRENT_ROUND", ""), + "p0_count": os.environ.get("TG_P0_COUNT", ""), + "last_decision": os.environ.get("TG_LAST_DECISION", ""), + "next_action": os.environ.get("TG_NEXT_ACTION", ""), +} +for k, v in repl.items(): + data = data.replace("{{" + k + "}}", v) + +# project.yaml optional fields +if path.name == "project.yaml": + data = data.replace("small|medium|large", os.environ.get("TG_SCALE", "medium")) + data = data.replace("low|medium|high", os.environ.get("TG_RISK", "medium")) + data = data.replace("enabled|disabled", "enabled" if os.environ.get("TG_GATE_ARCH") == "enabled" else "disabled", 1) + data = data.replace("enabled|disabled", "enabled" if os.environ.get("TG_GATE_CODE_REVIEW") == "enabled" else "disabled", 1) + data = data.replace("enabled|disabled", "enabled" if os.environ.get("TG_GATE_SECURITY") == "enabled" else "disabled", 1) + data = data.replace("enabled|disabled", "enabled" if os.environ.get("TG_GATE_PRIVACY") == "enabled" else "disabled", 1) + data = data.replace("true|false", "true" if os.environ.get("TG_GIT_ENABLED") == "true" else "false", 1) + data = data.replace("[role][phase] summary - reason", os.environ.get("TG_GIT_COMMIT_FORMAT", "[role][phase] summary - reason")) + +path.write_text(data) +PY +} + +for f in \ + "$output/00_meta/project.yaml" \ + "$output/00_meta/session.yaml" \ + "$output/00_meta/summary.md" \ + "$output/00_meta/decision_log.md" \ + "$output/00_meta/status.md"; do + export TARGET_FILE="$f" + replace_file "$f" +done + +echo "Workspace initialized at: $output" diff --git a/membership/package.json b/membership/package.json new file mode 100644 index 0000000..3c1ce48 --- /dev/null +++ b/membership/package.json @@ -0,0 +1,18 @@ +{ + "name": "claude-team-workflow", + "private": true, + "scripts": { + "claude:test": "node scripts/claude-safe-run.js .claude/agents/tester.md", + "claude:architect": "node scripts/claude-safe-run.js .claude/agents/architect.md", + "claude:backend": "node scripts/claude-safe-run.js .claude/agents/backend.md", + "claude:frontend": "node scripts/claude-safe-run.js .claude/agents/frontend.md", + "claude:review": "node scripts/claude-safe-run.js .claude/agents/codeReview.md", + "claude:supervisor": "node scripts/claude-safe-run.js .claude/agents/supervisor.md", + + "claude:product": "node scripts/claude-safe-run.js .claude/agents/product.md", + "claude:security": "node scripts/claude-safe-run.js .claude/agents/security.md", + + "claude:preflight": "node scripts/claude-safe-run.js .claude/agents/preflight.md", + "claude:postflight": "node scripts/claude-safe-run.js .claude/agents/postflight.md" + } +} \ No newline at end of file diff --git a/membership/scripts/claude-safe-run.js b/membership/scripts/claude-safe-run.js new file mode 100644 index 0000000..b54bc9c --- /dev/null +++ b/membership/scripts/claude-safe-run.js @@ -0,0 +1,94 @@ +#!/usr/bin/env node +/** + * Claude Safe Run - Team Edition + */ + +const { execSync } = require("child_process"); +const fs = require("fs"); +const path = require("path"); + +// ---------- Utils ---------- +function run(cmd, options = {}) { + return execSync(cmd, { stdio: "pipe", encoding: "utf-8", ...options }); +} + +function exists(p) { + return fs.existsSync(p); +} + +function fatal(msg) { + console.error(`❌ ${msg}`); + process.exit(1); +} + +// ---------- Args ---------- +const agentPrompt = process.argv[2]; +if (!agentPrompt) { + fatal("Usage: node scripts/claude-safe-run.js "); +} + +if (!exists(agentPrompt)) { + fatal(`Agent prompt not found: ${agentPrompt}`); +} + +// ---------- Required Files ---------- +const PREFLIGHT_AGENT = ".claude/agents/preflight.md"; +const POSTFLIGHT_AGENT = ".claude/agents/postflight.md"; +const RUNS_DIR = ".claude/runs"; + +[PREFLIGHT_AGENT, POSTFLIGHT_AGENT, RUNS_DIR].forEach((p) => { + if (!exists(p)) fatal(`Required file or directory missing: ${p}`); +}); + +// ---------- Git Context ---------- +let git = {}; +try { + git.user = run("git config user.name").trim(); + git.branch = run("git rev-parse --abbrev-ref HEAD").trim(); + git.commit = run("git rev-parse HEAD").trim(); +} catch { + fatal("Git context unavailable. Are you in a git repository?"); +} + +// ---------- Metadata ---------- +const timestamp = new Date().toISOString().replace(/[:.]/g, "-"); +const agentName = path.basename(agentPrompt, ".md"); +const runId = `${timestamp}-${agentName}-${git.user.replace(/\s+/g, "_")}`; + +console.log(`🧠 Claude Safe Run`); +console.log(`- Agent: ${agentName}`); +console.log(`- Author: ${git.user}`); +console.log(`- Branch: ${git.branch}`); +console.log(`- Commit: ${git.commit}`); +console.log(`- Run ID: ${runId}`); + +// ---------- Preflight ---------- +console.log("\n🔍 Running Preflight Agent..."); +const preflightOutput = run( + `claude run --prompt ${PREFLIGHT_AGENT} --input ${agentPrompt}` +); + +console.log(preflightOutput); + +if (!preflightOutput.includes("PRECHECK: PASS")) { + fatal("Preflight check failed or unclear. Execution aborted."); +} + +// ---------- Run Main Agent ---------- +console.log("\n🚀 Running Main Agent..."); +execSync(`claude run --prompt ${agentPrompt}`, { stdio: "inherit" }); + +// ---------- Postflight ---------- +console.log("\n🧪 Running Postflight Agent..."); +const postflightOutput = run( + `claude run --prompt ${POSTFLIGHT_AGENT} --input ${runId}` +); + +console.log(postflightOutput); + +if (!postflightOutput.includes("POSTCHECK: PASS")) { + fatal("Postflight validation failed. Run logs invalid or missing."); +} + +console.log("\n✅ Claude run completed successfully."); +console.log(`📄 Run ID: ${runId}`); \ No newline at end of file diff --git a/membership/specs/materials/企业微信截图_17706340271335.png b/membership/specs/materials/企业微信截图_17706340271335.png new file mode 100644 index 0000000000000000000000000000000000000000..010a47172702b090f5780b99d888caebf0d58bdd GIT binary patch literal 419341 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

4H<+HW}$GY*B7tr=Jv96rx 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 z�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 literal 0 HcmV?d00001 diff --git a/membership/specs/materials/服务商配置.png b/membership/specs/materials/服务商配置.png new file mode 100644 index 0000000000000000000000000000000000000000..32fe4e28c4bb3d0c898d8ada9f1152cf27a203e8 GIT binary patch literal 410952 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

nlOI+%zHv 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 literal 0 HcmV?d00001 diff --git a/membership/specs/materials/调度日志比价.png b/membership/specs/materials/调度日志比价.png new file mode 100644 index 0000000000000000000000000000000000000000..51eea2fdc95fcc26e74cf920ee14d3068815de8a GIT binary patch literal 160491 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

!f|;>dYIa_GUfSh@)s6Gm!w@@ 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

_>+vrR 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 且 状态=潜在 | 5,000 | +| 代驾沉默客户 | 来源=代驾 且 最近消费>90天 且 状态≠已转化 | 8,000 | +| 近期新客户 | 来源时间≤30天 且 状态=潜在 | 3,000 | + +#### 4.0.9 营销触达 + +**触达渠道:** + +| 渠道 | 说明 | 成本 | +|------|------|------| +| 短信 | 发送营销短信 | 约0.05元/条 | +| APP推送 | 各业务APP推送(需已安装) | 免费 | +| 小程序消息 | 小程序订阅消息(需已授权) | 免费 | +| 外呼 | 人工/AI外呼 | 约0.5元/通 | + +**触达任务创建:** + +| 字段 | 说明 | +|------|------| +| 任务名称 | 如"618高价值客户召回" | +| 目标分群 | 选择客户分群 | +| 触达渠道 | 短信/推送/外呼 | +| 触达内容 | 消息内容/话术模板 | +| 关联优惠券 | 选择发放的优惠券 | +| 触达时间 | 立即/定时 | +| 触达频率 | 单次/多次(间隔天数) | + +**触达内容示例:** + +``` +【XX出行】尊敬的客户,感谢您使用我们的服务! +现送您一张20元代驾券,点击领取:xxx.com/c/abc123 +退订回T +``` + +#### 4.0.10 转化路径 + +**转化动作定义:** + +| 转化动作 | 说明 | 转化结果 | +|----------|------|----------| +| 领取优惠券 | 客户点击领券链接领取 | 进入会员池 | +| 注册会员 | 客户主动注册会员中心 | 进入会员池 | +| 首次下单 | 客户完成首次消费 | 进入会员池 | + +**转化流程:** + +``` +┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ +│ 营销触达 │ ──→│ 点击链接 │ ──→│ 领券/注册 │ ──→│ 成为会员 │ +│ (短信) │ │ │ │ │ │ │ +└──────────┘ └──────────┘ └──────────┘ └──────────┘ + │ + ↓ + ┌──────────────┐ + │ 同步至会员池 │ + │ 自动建立账号 │ + │ 发放优惠券 │ + └──────────────┘ +``` + +**领券链接机制:** + +| 字段 | 说明 | +|------|------| +| 短链接 | 如 xxx.com/c/abc123 | +| 关联客户 | 绑定客户ID,用于追踪转化 | +| 关联优惠券 | 领取后自动发放的券 | +| 有效期 | 链接有效期 | +| 领取后动作 | 跳转小程序/APP/H5 | + +#### 4.0.11 客户池数据统计 + +**概览指标:** + +| 指标 | 定义 | +|------|------| +| 客户池总量 | 客户池中客户总数 | +| 潜在客户数 | 状态为"潜在"的客户数 | +| 已触达客户数 | 状态为"已触达"的客户数 | +| 已转化客户数 | 状态为"已转化"的客户数 | +| 转化率 | 已转化 / (潜在+已触达+已转化) | +| 本月新增客户 | 本月新进入客户池的数量 | +| 本月转化客户 | 本月转化为会员的数量 | + +**来源分析:** + +| 来源渠道 | 客户数 | 占比 | 转化数 | 转化率 | +|----------|--------|------|--------|--------| +| 道路救援 | 50,000 | 40% | 8,000 | 16% | +| 代驾 | 35,000 | 28% | 7,000 | 20% | +| 到家 | 25,000 | 20% | 4,000 | 16% | +| 线下渠道 | 10,000 | 8% | 2,500 | 25% | +| 合作渠道 | 5,000 | 4% | 500 | 10% | + +**营销效果分析:** + +| 指标 | 定义 | +|------|------| +| 触达人数 | 本次营销触达的客户数 | +| 送达率 | 成功送达 / 触达人数 | +| 打开率 | 打开/点击 / 送达人数 | +| 领券人数 | 领取优惠券的客户数 | +| 领券率 | 领券人数 / 触达人数 | +| 转化人数 | 转化为会员的客户数 | +| 转化率 | 转化人数 / 触达人数 | +| 单客成本 | 营销成本 / 转化人数 | + +#### 4.0.12 管理后台功能结构 + +``` +客户池管理 +├── 客户概览 +│ ├── 核心指标卡片 +│ ├── 来源分布图 +│ ├── 转化漏斗 +│ └── 趋势图表 +├── 客户列表 +│ ├── 客户搜索(手机号/姓名) +│ ├── 高级筛选 +│ ├── 客户详情 +│ ├── 手动打标 +│ └── 批量操作 +├── 客户导入 +│ ├── 批量导入(Excel) +│ ├── 导入模板下载 +│ ├── 导入记录 +│ └── 导入数据校验 +├── 客户分群 +│ ├── 分群列表 +│ ├── 创建分群 +│ ├── 分群详情 +│ └── 分群更新(手动/自动) +├── 标签管理 +│ ├── 系统标签 +│ ├── 自定义标签 +│ └── 标签统计 +├── 营销触达 +│ ├── 触达任务列表 +│ ├── 创建触达任务 +│ ├── 任务详情 +│ ├── 任务执行记录 +│ └── 效果分析 +├── 转化追踪 +│ ├── 转化记录 +│ ├── 转化路径分析 +│ └── 领券链接管理 +└── 数据统计 + ├── 客户池分析 + ├── 来源分析 + ├── 营销效果分析 + └── 转化分析 +``` + +#### 4.0.13 数据同步与对接 + +**各业务系统同步接口:** + +| 接口 | 说明 | +|------|------| +| 客户数据推送 | 业务系统推送新客户数据至中台 | +| 客户数据拉取 | 中台定时拉取业务系统客户数据 | +| 批量同步 | 一次性同步历史客户数据 | +| 转化回写 | 客户转化后,回写至业务系统 | + +**同步频率:** + +| 同步类型 | 频率 | +|----------|------| +| 新客户 | 实时推送 | +| 客户属性更新 | 每日凌晨同步 | +| 历史数据 | 一次性批量导入 | + +#### 4.0.14 权限设计 + +| 角色 | 权限 | +|------|------| +| 集团运营 | 全部客户数据、全部分群、全部营销 | +| BU运营 | 本业务来源客户、本业务分群、本业务营销 | +| 数据分析 | 查看数据统计(只读) | + +--- + +### 4.1 统一账号体系 + +#### 4.1.1 功能说明 + +为新用户建立统一账号,支持三个业务系统共用。用户在任一业务注册或通过营销转化后,自动创建中台统一账号。 + +#### 4.1.2 账号注册 + +**注册字段:** + +| 字段 | 必填 | 说明 | +|------|------|------| +| 手机号 | 是 | 唯一标识 | +| 验证码 | 是 | 短信验证 | +| 昵称 | 否 | 用户自定义 | +| 头像 | 否 | 用户自定义 | + +**注册来源:** + +| 来源 | 说明 | +|------|------| +| 会员小程序 | 用户主动注册 | +| 营销转化 | 客户领券后自动创建 | +| 业务系统 | 在业务APP注册后同步 | + +#### 4.1.3 账号登录 + +| 登录方式 | 说明 | +|----------|------| +| 短信验证码 | 手机号+验证码 | +| 微信授权 | 小程序微信登录 | +| 一键登录 | 手机号一键登录 | + +#### 4.1.4 账号绑定 + +| 绑定内容 | 说明 | +|----------|------| +| 微信绑定 | 绑定微信openid | +| 业务账号关联 | 关联三个业务系统的用户ID | + +#### 4.1.5 业务规则 + +| 规则 | 说明 | +|------|------| +| 唯一标识 | 手机号作为唯一标识 | +| 新用户管理 | 只管理新用户,老用户保持现状 | +| 账号同步 | 新用户在任一业务注册,自动同步至中台 | +| 数据共享 | 用户在任一业务登录,可查看所有业务订单 | + +--- + +### 4.2 会员等级体系 + +#### 4.2.1 等级定义 + +| 等级 | 名称 | 综合积分要求 | 有效期 | +|------|------|-------------|--------| +| Lv1 | 普通会员 | 0 | 永久 | +| Lv2 | 白银会员 | 1,000 | 1年 | +| Lv3 | 黄金会员 | 5,000 | 1年 | +| Lv4 | 铂金会员 | 20,000 | 1年 | +| Lv5 | 钻石会员 | 50,000 | 1年 | + +#### 4.2.2 综合积分计算公式 + +``` +综合积分 = 消费金额积分 + 消费次数积分 + 活动积分 + +消费金额积分 = 累计消费金额 × 1(1元=1分) +消费次数积分 = 累计消费次数 × 100(1次=100分) +活动积分 = 参与活动获得积分 +``` + +**计算说明:** + +| 积分类型 | 计算规则 | 示例 | +|----------|----------|------| +| 消费金额积分 | 1元=1分 | 消费500元=500分 | +| 消费次数积分 | 1次=100分 | 消费5次=500分 | +| 活动积分 | 按活动规则 | 参与活动获得200分 | + +#### 4.2.3 等级权益 + +**基础权益矩阵:** + +| 权益项 | 普通 | 白银 | 黄金 | 铂金 | 钻石 | +|--------|------|------|------|------|------| +| 道路救援折扣 | 无 | 95折 | 9折 | 85折 | 8折 | +| 代驾服务折扣 | 无 | 95折 | 9折 | 85折 | 8折 | +| 到家服务折扣 | 无 | 95折 | 9折 | 85折 | 8折 | +| 专属客服 | ❌ | ❌ | ✅ | ✅ | ✅ | +| 优先派单 | ❌ | ❌ | ❌ | ✅ | ✅ | +| 生日礼包 | ❌ | ❌ | ✅ | ✅ | ✅ | +| 每月免费券 | 0张 | 1张 | 2张 | 3张 | 5张 | + +**按服务类目配置折扣(可选):** + +| 等级 | 拖车服务 | 搭电服务 | 换胎服务 | 小修服务 | +|------|----------|----------|----------|----------| +| 钻石 | 8折 | 7折 | 85折 | 8折 | + +#### 4.2.4 等级升降规则 + +**升级规则:** + +| 规则 | 说明 | +|------|------| +| 触发条件 | 综合积分达到门槛 | +| 生效时间 | 立即生效 | +| 通知 | 推送升级通知 | + +**降级规则:** + +| 规则 | 说明 | +|------|------| +| 触发条件 | 等级有效期满后重新计算 | +| 计算方式 | 按当前积分重新定级 | +| 保护期 | 降级前30天提醒 | + +**保级规则:** + +| 规则 | 说明 | +|------|------| +| 保级条件 | 有效期内消费满足条件 | +| 有效期延长 | 满足条件延长1年 | + +#### 4.2.5 等级有效期 + +| 等级 | 有效期 | 续期条件 | +|------|--------|----------| +| 普通会员 | 永久 | - | +| 白银及以上 | 1年 | 有效期内综合积分≥当前等级门槛 | + +--- + +### 4.3 积分体系 + +#### 4.3.1 积分获取规则 + +| 行为 | 获得积分 | 说明 | +|------|----------|------| +| 消费 | 1元=1积分 | 实付金额计算 | +| 首次注册 | 100积分 | 一次性 | +| 完善资料 | 50积分 | 一次性 | +| 每日签到 | 5积分 | 每日上限5分 | +| 邀请好友 | 200积分/人 | 好友首次消费后发放 | +| 评价订单 | 10积分/单 | 每日上限3单 | + +#### 4.3.2 积分使用规则 + +| 规则项 | 说明 | +|--------|------| +| 抵扣比例 | 100积分=1元 | +| 单笔上限 | 订单金额的20% | +| 使用门槛 | 满100积分可用 | +| 有效期 | 获得之日起12个月 | + +#### 4.3.3 积分兑换规则 + +| 规则项 | 说明 | +|--------|------| +| 兑换比例 | 1:1(A业务积分=B业务积分) | +| 兑换门槛 | 满500积分可兑换 | +| 成本承担 | 积分来源业务承担 | + +#### 4.3.4 积分有效期 + +| 规则 | 说明 | +|------|------| +| 有效期 | 获得之日起12个月 | +| 过期提醒 | 过期前30天/7天/1天提醒 | +| 过期处理 | 自动清零,不可恢复 | + +#### 4.3.5 积分跨业务流转 + +**流转场景:** + +``` +用户在道路救援消费获得1000积分 + ↓ +用户在代驾服务使用500积分抵扣5元 + ↓ +道路救援需向代驾支付5元积分成本 +``` + +**流转规则:** + +| 规则 | 说明 | +|------|------| +| 实时抵扣 | 用户可在任意业务使用积分 | +| 来源追溯 | 记录积分来源业务 | +| 月度结算 | 跨业务积分成本按月结算 | + +#### 4.3.6 积分成本结算 + +| 规则项 | 说明 | +|--------|------| +| 结算周期 | 月度结算 | +| 结算方式 | 积分来源方向使用方支付 | +| 结算单价 | 100积分=1元 | +| 账单生成 | 每月1日生成上月账单 | + +--- + +### 4.4 优惠券中心 + +#### 4.4.1 优惠券类型(按面值) + +| 类型 | 说明 | 示例 | +|------|------|------| +| 抵扣券 | 满足条件减固定金额 | 满100减20 | +| 折扣券 | 满足条件打折 | 满100打8折 | +| 全免券 | 免费享受服务一次 | 代驾服务全免券 | +| 现金券 | 无门槛直接抵扣 | 10元无门槛券 | + +#### 4.4.2 优惠券流转类型(按来源) + +| 类型 | 服务券 | 引流券 | +|------|--------|--------| +| 定义 | A业务向B业务采购 | B业务免费提供给A业务发放 | +| 成本 | 采购方承担 | 提供方承担 | +| 目的 | 丰富自身权益 | 为自身业务引流 | +| 结算 | 按采购价预付 | 无需结算 | + +#### 4.4.3 优惠券属性定义 + +**基础属性:** + +| 字段 | 必填 | 说明 | +|------|------|------| +| 券名称 | 是 | 如"代驾10元抵扣券" | +| 券类型 | 是 | 抵扣券/折扣券/全免券/现金券 | +| 适用业务 | 是 | 道路救援/代驾/到家/通用 | +| 适用服务 | 否 | 具体服务类目,不填则全业务可用 | + +**面值规则:** + +| 券类型 | 配置项 | +|--------|--------| +| 抵扣券 | 使用门槛(满X元)、抵扣金额 | +| 折扣券 | 使用门槛(满X元)、折扣比例、最高抵扣金额 | +| 全免券 | 适用服务、最高免除金额 | +| 现金券 | 抵扣金额(无门槛) | + +**有效期规则:** + +| 规则类型 | 说明 | +|----------|------| +| 固定日期 | 指定开始日期-结束日期 | +| 领取后生效 | 领取后N天内有效 | +| 激活后生效 | 激活后N天内有效 | + +**适用范围配置:** + +| 字段 | 必填 | 说明 | +|------|------|------| +| 适用范围类型 | 是 | 全部服务/指定业务/指定类目/指定服务 | +| 适用业务线 | 条件 | 选择一级类目 | +| 适用服务大类 | 条件 | 选择二级类目(可多选) | +| 适用具体服务 | 条件 | 选择三级类目(可多选) | +| 排除服务 | 否 | 指定不可用的服务 | + +**使用规则:** + +| 字段 | 说明 | +|------|------| +| 叠加规则 | 是否可与其他券叠加使用 | +| 每人限领 | 每人最多领取张数 | +| 每人限用 | 每人最多使用张数 | +| 使用时段 | 如仅限工作日使用 | + +#### 4.4.4 券池管理 + +**券池状态流转:** + +``` +┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ +│ 已创建 │ ──→│ 在池中 │ ──→│ 已发放 │ ──→│ 已激活 │ +└────────┘ └────────┘ └────────┘ └────────┘ + │ │ + ↓ ↓ + ┌────────┐ ┌────────┐ + │ 已导出 │ │ 已使用 │ + └────────┘ └────────┘ + │ + ↓ + ┌────────┐ + │ 已过期 │ + └────────┘ +``` + +**状态说明:** + +| 状态 | 说明 | +|------|------| +| 已创建 | 券批次已创建,待入池 | +| 在池中 | 在券池中待分配 | +| 已发放 | 已分配给业务方,但未到用户手中 | +| 已导出 | 已导出券码,待线下发放 | +| 已激活 | 用户已领取/绑定,券已激活 | +| 已使用 | 用户已核销使用 | +| 已过期 | 超过有效期未使用 | + +**创建券批次:** + +| 字段 | 必填 | 说明 | +|------|------|------| +| 批次名称 | 是 | 如"2024年618代驾券" | +| 券模板 | 是 | 选择已有模板或新建 | +| 生成数量 | 是 | 本批次生成张数 | +| 券码规则 | 是 | 系统生成/自定义前缀 | +| 成本归属 | 是 | 哪个业务承担成本 | +| 备注 | 否 | 批次说明 | + +**券码生成规则:** + +``` +券码格式:[业务前缀][批次号][序列号][校验码] +示例:DJ2406001234X + +DJ = 代驾业务 +2406 = 2024年6月 +001234 = 序列号 +X = 校验码 +``` + +**券池操作:** + +| 操作 | 说明 | +|------|------| +| 批量分配 | 从池中分配N张给指定业务方 | +| 批量导出 | 导出券码Excel,含券码、面值、有效期 | +| 批量作废 | 作废未激活的券 | +| 查看明细 | 查看每张券的状态和流转记录 | + +**导出文件格式:** + +| 列名 | 示例 | +|------|------| +| 券码 | DJ2406001234X | +| 券名称 | 代驾10元抵扣券 | +| 券类型 | 抵扣券 | +| 面值/折扣 | 10元 | +| 使用门槛 | 满50元可用 | +| 有效期 | 激活后30天 | +| 适用业务 | 代驾服务 | + +**券激活方式:** + +| 方式 | 说明 | +|------|------| +| 用户输入券码 | 用户在小程序输入券码激活 | +| 扫码激活 | 券码生成二维码,用户扫码激活 | +| 系统发放激活 | 通过系统直接发放给用户,自动激活 | +| API激活 | 业务系统调用API激活并绑定用户 | + +#### 4.4.5 大礼包/优惠卡管理 + +**优惠卡类型:** + +| 类型 | 说明 | 示例 | +|------|------|------| +| 销售卡 | 有售价,用户购买后获得 | 99元超值礼包 | +| 赠送卡 | 无售价,用于活动赠送 | 新人礼包 | +| 权益卡 | 会员等级专属礼包 | 黄金会员月度礼包 | + +**优惠卡属性:** + +| 字段 | 必填 | 说明 | +|------|------|------| +| 卡名称 | 是 | 如"出行无忧大礼包" | +| 卡类型 | 是 | 销售卡/赠送卡/权益卡 | +| 售价 | 销售卡必填 | 用户购买价格 | +| 原价 | 否 | 用于展示划线价 | +| 卡面图 | 是 | 展示图片 | +| 卡说明 | 是 | 礼包介绍 | +| 有效期 | 是 | 购买后N天内可激活 | + +**包含权益示例:出行无忧大礼包(售价99元)** + +| 权益内容 | 数量 | 单张价值 | 总价值 | +|----------|------|----------|--------| +| 道路救援50元抵扣券 | 2张 | 50元 | 100元 | +| 代驾20元抵扣券 | 5张 | 20元 | 100元 | +| 到家服务8折券 | 3张 | 约15元 | 45元 | +| 积分 | 500分 | 5元 | 5元 | +| **合计** | - | - | **250元** | + +**优惠卡状态流转:** + +``` +┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ +│ 已创建 │ ──→│ 已上架 │ ──→│ 已售出 │ ──→│ 已激活 │ +└────────┘ └────────┘ └────────┘ └────────┘ + │ + ↓ + ┌────────┐ + │ 已下架 │ + └────────┘ +``` + +**销售规则:** + +| 字段 | 说明 | +|------|------| +| 每人限购 | 每人最多购买数量 | +| 发行总量 | 本批次总数量 | +| 销售时间 | 开始销售-结束销售 | +| 销售渠道 | 小程序/线下/全渠道 | + +**线下销售支持:** + +| 字段 | 说明 | +|------|------| +| 生成数量 | 本批次生成卡密数量 | +| 卡密格式 | 如:GIFT-XXXX-XXXX-XXXX | +| 激活密码 | 可选,双重验证 | + +**线下场景:** +- 业务终端采购礼包卡密 +- 向客户销售实体卡或卡密 +- 客户在小程序输入卡密激活 +- 券自动发放至客户账户 + +#### 4.4.6 服务券采购流程 + +**采购流程:** + +``` +┌─────────────┐ ┌─────────────┐ ┌─────────────┐ +│ 需求方发起 │ ──→ │ 供给方审批 │ ──→ │ 券入库可用 │ +│ 采购申请 │ │ 确认数量价格 │ │ 完成结算 │ +└─────────────┘ └─────────────┘ └─────────────┘ +``` + +**采购申请表单:** + +| 字段 | 说明 | +|------|------| +| 供给方 | 选择业务线 | +| 券模板 | 选择已有模板或新建 | +| 采购数量 | 本次采购张数 | +| 采购单价 | 协商价格 | +| 采购总额 | 数量×单价 | +| 申请备注 | 说明用途 | + +**审批规则:** +- 审批流程:需求方提交 → 供给方审批 → 完成 +- 审批权限:各BU运营人员 + +#### 4.4.7 引流券发放流程 + +**发放流程:** + +``` +┌─────────────┐ ┌─────────────┐ ┌─────────────┐ +│ 供给方创建 │ ──→ │ 需求方申领 │ ──→ │ 供给方审批 │ +│ 引流券批次 │ │ 提交申请 │ │ 确认发放 │ +└─────────────┘ └─────────────┘ └─────────────┘ +``` + +**核销数据统计(双方可见):** + +| 指标 | 说明 | +|------|------| +| 发放数量 | 已发给用户的券数量 | +| 领取数量 | 用户已领取的数量 | +| 使用数量 | 已核销数量 | +| 使用率 | 使用数量/领取数量 | +| 过期数量 | 未使用已过期数量 | +| 带动消费 | 使用该券的订单总额 | + +--- + +### 4.5 用户标签体系 + +#### 4.5.1 基础标签 + +| 标签类型 | 标签示例 | +|----------|----------| +| 人口属性 | 性别、年龄段、城市 | +| 业务偏好 | 常用道路救援、常用代驾、常用到家 | +| 消费能力 | 高消费、中消费、低消费 | +| 活跃度 | 活跃用户、沉默用户、流失用户 | +| 生命周期 | 新用户、成长用户、成熟用户、衰退用户 | + +#### 4.5.2 标签生成规则 + +| 标签 | 规则 | +|------|------| +| 高消费用户 | 近90天消费≥500元 | +| 活跃用户 | 近30天有消费记录 | +| 沉默用户 | 30-90天无消费 | +| 流失用户 | 90天以上无消费 | +| 跨业务用户 | 使用过≥2个业务 | + +#### 4.5.3 标签应用场景 + +| 场景 | 说明 | +|------|------| +| 精准推送 | 根据标签定向推送营销消息 | +| 定向发券 | 根据标签定向发放优惠券 | +| 用户分群 | 结合标签创建用户分群 | +| 数据分析 | 按标签维度分析用户数据 | + +--- + +### 4.6 消息推送 + +#### 4.6.1 推送类型 + +| 类型 | 触发条件 | 内容示例 | +|------|----------|----------| +| 优惠券到账 | 用户获得新券 | "您有一张10元代驾券已到账" | +| 优惠券过期 | 过期前3天/1天 | "您有1张优惠券即将过期" | +| 等级变动 | 升级/降级时 | "恭喜您升级为黄金会员" | +| 积分变动 | 获得/使用积分 | "本次消费获得100积分" | +| 营销活动 | 运营人员配置 | "618大促,全场8折" | + +#### 4.6.2 推送渠道 + +| 渠道 | 适用场景 | +|------|----------| +| 小程序消息 | 日常通知 | +| 短信 | 重要通知、营销活动 | +| APP推送 | 三个业务APP内推送 | + +#### 4.6.3 推送规则 + +| 规则 | 说明 | +|------|------| +| 用户偏好 | 用户可设置接收偏好 | +| 频率限制 | 单用户每日推送上限5条 | +| 授权要求 | 营销类消息需用户授权 | +| 时段限制 | 默认8:00-22:00推送 | + +#### 4.6.4 推送模板配置 + +| 配置项 | 说明 | +|--------|------| +| 模板名称 | 如"优惠券到账通知" | +| 推送渠道 | 选择推送渠道 | +| 消息标题 | 推送标题 | +| 消息内容 | 支持变量替换 | +| 跳转链接 | 点击后跳转页面 | + +--- + +### 4.7 服务类目管理 + +#### 4.7.1 功能说明 + +统一维护三大业务线的服务类目,支持多级分类,供优惠券、会员权益等模块调用。 + +#### 4.7.2 服务类目结构(三级) + +``` +服务类目(三级结构) +│ +├── 道路救援服务 +│ ├── 拖车服务 +│ │ ├── 市内拖车 +│ │ ├── 长途拖车 +│ │ └── 事故拖车 +│ ├── 小修服务 +│ │ ├── 现场快修 +│ │ └── 应急维修 +│ ├── 换胎服务 +│ │ ├── 备胎更换 +│ │ └── 新胎更换 +│ ├── 搭电服务 +│ │ ├── 电瓶搭电 +│ │ └── 电瓶更换 +│ ├── 送油服务 +│ ├── 困境救援 +│ └── 开锁服务 +│ +├── 代驾服务 +│ ├── 酒后代驾 +│ ├── 商务代驾 +│ ├── 长途代驾 +│ ├── 旅游代驾 +│ └── 其他代驾 +│ +└── 到家服务 + ├── 清洁服务 + │ ├── 日常保洁 + │ ├── 深度清洁 + │ ├── 开荒保洁 + │ └── 家电清洗 + ├── 维修服务 + │ ├── 家电维修 + │ ├── 水电维修 + │ ├── 门窗维修 + │ └── 管道疏通 + ├── 清洗服务 + │ ├── 油烟机清洗 + │ ├── 空调清洗 + │ ├── 洗衣机清洗 + │ └── 冰箱清洗 + └── 其他服务 + ├── 搬家服务 + └── 家具安装 +``` + +#### 4.7.3 类目属性 + +**一级类目(业务线):** + +| 字段 | 必填 | 说明 | +|------|------|------| +| 类目编码 | 是 | 如 ROAD、DRIVER、HOME | +| 类目名称 | 是 | 道路救援服务 | +| 类目图标 | 否 | 展示图标 | +| 排序 | 是 | 显示顺序 | +| 状态 | 是 | 启用/停用 | + +**二级类目(服务大类):** + +| 字段 | 必填 | 说明 | +|------|------|------| +| 类目编码 | 是 | 如 ROAD_TOW | +| 类目名称 | 是 | 拖车服务 | +| 上级类目 | 是 | 关联一级类目 | +| 类目图标 | 否 | 展示图标 | +| 排序 | 是 | 显示顺序 | +| 状态 | 是 | 启用/停用 | + +**三级类目(具体服务):** + +| 字段 | 必填 | 说明 | +|------|------|------| +| 类目编码 | 是 | 如 ROAD_TOW_CITY | +| 类目名称 | 是 | 市内拖车 | +| 上级类目 | 是 | 关联二级类目 | +| 服务描述 | 否 | 服务说明 | +| 参考价格 | 否 | 展示用 | +| 排序 | 是 | 显示顺序 | +| 状态 | 是 | 启用/停用 | + +#### 4.7.4 类目管理功能 + +| 功能 | 说明 | +|------|------| +| 类目列表 | 树形展示全部类目 | +| 新增类目 | 支持各级类目新增 | +| 编辑类目 | 修改类目信息 | +| 启用/停用 | 控制类目状态 | +| 调整排序 | 调整显示顺序 | +| 批量导入 | Excel批量导入类目 | + +#### 4.7.5 类目调用场景 + +| 调用模块 | 使用方式 | +|----------|----------| +| 优惠券使用规则 | 选择适用的服务类目 | +| 会员等级权益 | 设置不同服务的折扣 | +| 大礼包配置 | 指定券适用的服务 | +| 积分规则 | 按服务类型设置积分倍率 | +| 数据统计 | 按服务类目分析数据 | + +--- + +### 4.8 券结算对账管理 + +#### 4.8.1 功能说明 + +管理优惠券跨业务流转产生的费用结算,包括服务券采购结算、引流券核销统计、积分跨业务抵扣结算。 + +#### 4.8.2 结算类型 + +| 结算类型 | 付款方 | 收款方 | 结算依据 | +|----------|--------|--------|----------| +| 服务券采购 | 采购方 | 供给方 | 采购订单 | +| 引流券核销 | 券发行方 | - | 核销数据(仅记录,无需结算) | +| 积分跨业务抵扣 | 积分来源方 | 积分使用方 | 核销数据 | + +#### 4.8.3 结算周期 + +| 配置项 | 说明 | +|--------|------| +| 结算周期 | 月结(每月1日生成上月账单) | +| 账单确认期 | 5个工作日内确认 | +| 打款期限 | 确认后10个工作日内完成 | +| 对账日 | 每月1-5日 | + +#### 4.8.4 服务券采购结算 + +**结算流程:** + +``` +┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ +│ 采购申请 │ ──→│ 审批通过 │ ──→│ 生成账单 │ ──→│ 对账确认 │ ──→│ 完成结算 │ +└──────────┘ └──────────┘ └──────────┘ └──────────┘ └──────────┘ +``` + +**采购订单明细:** + +| 字段 | 说明 | +|------|------| +| 采购单号 | 系统自动生成 | +| 采购方 | 发起采购的业务线 | +| 供给方 | 提供券的业务线 | +| 券模板 | 采购的券类型 | +| 采购数量 | 本次采购张数 | +| 单价 | 每张券采购价 | +| 采购总额 | 数量 × 单价 | +| 采购时间 | 订单创建时间 | +| 审批状态 | 待审批/已通过/已拒绝 | +| 结算状态 | 待结算/已出账/已确认/已打款 | + +**采购对账单:** + +| 字段 | 说明 | +|------|------| +| 账单编号 | 如 BILL-202406-001 | +| 账单周期 | 2024年6月 | +| 付款方 | 道路救援BU | +| 收款方 | 代驾BU | +| 采购总笔数 | 本周期采购订单数 | +| 采购总张数 | 本周期采购券总张数 | +| 应付总额 | 本周期应付金额 | +| 账单状态 | 待确认/已确认/已打款 | + +#### 4.8.5 引流券核销统计 + +**功能说明:** + +引流券成本由发行方承担,不产生跨BU结算,但需记录核销数据供双方查看。 + +**统计指标:** + +| 指标 | 说明 | +|------|------| +| 发放数量 | 分配给接收方的数量 | +| 领取数量 | 用户已领取数量 | +| 核销数量 | 用户已使用数量 | +| 核销金额 | 核销券的面值总额 | +| 带动消费 | 使用该券的订单总金额 | +| ROI | 带动消费 / 核销金额 | + +#### 4.8.6 积分跨业务抵扣结算 + +**结算规则:** + +``` +场景: +用户在道路救援消费获得1000积分 +用户在代驾服务使用500积分抵扣5元 + +结算: +- 代驾收取订单金额(已扣除积分抵扣部分) +- 道路救援需向代驾支付5元积分成本 +- 按月汇总结算 +``` + +**积分流转明细:** + +| 字段 | 说明 | +|------|------| +| 流水号 | 系统自动生成 | +| 用户ID | 使用积分的用户 | +| 积分来源 | 积分获得的业务线 | +| 积分使用 | 积分消耗的业务线 | +| 使用积分数 | 本次使用积分 | +| 抵扣金额 | 积分折算金额 | +| 关联订单 | 使用积分的订单号 | +| 使用时间 | 积分使用时间 | +| 结算状态 | 待结算/已出账/已确认/已打款 | + +**积分结算账单:** + +| 字段 | 说明 | +|------|------| +| 账单编号 | 如 POINT-202406-001 | +| 账单周期 | 2024年6月 | +| 付款方 | 积分来源方 | +| 收款方 | 积分使用方 | +| 总笔数 | 本周期积分抵扣订单数 | +| 总积分数 | 本周期跨业务使用积分总数 | +| 应付总额 | 本周期应付金额 | +| 账单状态 | 待确认/已确认/已打款 | + +#### 4.8.7 对账流程 + +**整体流程:** + +``` +┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ +│ 账单生成 │ ──→│ 待确认 │ ──→│ 对账确认 │ ──→│ 财务打款 │ ──→│ 结算完成 │ +│ (系统) │ │ (双方) │ │ (双方) │ │ (财务) │ │ │ +└──────────┘ └──────────┘ └──────────┘ └──────────┘ └──────────┘ + │ + ↓ 有异议 + ┌──────────┐ + │ 异议处理 │ + └──────────┘ +``` + +**账单状态:** + +| 状态 | 说明 | +|------|------| +| 待生成 | 账单周期未结束 | +| 已生成 | 系统自动生成账单 | +| 待确认 | 等待双方确认 | +| 已确认 | 双方均已确认 | +| 有异议 | 一方或双方提出异议 | +| 待打款 | 确认完成,等待财务打款 | +| 已完成 | 打款完成,结算关闭 | + +**对账操作:** + +| 操作方 | 可执行操作 | +|--------|------------| +| 付款方 | 查看账单、确认账单、提出异议、查看打款记录 | +| 收款方 | 查看账单、确认账单、提出异议、确认收款 | + +**异议处理:** + +| 字段 | 说明 | +|------|------| +| 异议单号 | 系统自动生成 | +| 关联账单 | 异议的账单编号 | +| 异议方 | 提出异议的业务线 | +| 异议类型 | 金额有误/数据缺失/重复计算/其他 | +| 异议说明 | 详细描述问题 | +| 异议明细 | 勾选有问题的明细记录 | +| 期望金额 | 异议方认为正确的金额 | +| 处理状态 | 待处理/处理中/已解决/已驳回 | + +#### 4.8.8 结算报表 + +**月度结算汇总:** + +| 业务线 | 应收(服务券) | 应收(积分) | 应付(服务券) | 应付(积分) | 净结算 | +|--------|----------------|--------------|----------------|--------------|--------| +| 道路救援 | 5,000元 | 200元 | 15,500元 | 800元 | -11,100元 | +| 代驾 | 15,500元 | 800元 | 3,000元 | 150元 | +13,150元 | +| 到家 | 3,000元 | 150元 | 5,000元 | 200元 | -2,050元 | + +#### 4.8.9 结算通知 + +| 通知场景 | 接收人 | 通知方式 | +|----------|--------|----------| +| 账单生成 | 双方财务/运营 | 站内信+邮件 | +| 待确认提醒 | 未确认方 | 站内信+邮件 | +| 对方已确认 | 另一方 | 站内信 | +| 提出异议 | 对方 | 站内信+邮件 | +| 异议已处理 | 异议方 | 站内信 | +| 账单已完成 | 双方 | 站内信 | + +#### 4.8.10 对账权限 + +| 角色 | 权限 | +|------|------| +| 集团财务 | 全部账单查看、确认、打款操作 | +| 集团运营 | 全部账单查看、异议处理 | +| BU财务 | 本BU账单查看、确认、提出异议 | +| BU运营 | 本BU账单查看 | + +--- + +### 4.9 报表统计中心 + +#### 4.9.1 功能说明 + +提供集团及各BU多维度数据分析,支持会员、积分、优惠券、跨业务转化等核心指标的可视化展示和导出。 + +#### 4.9.2 报表体系结构 + +``` +报表统计中心 +├── 数据总览(首页看板) +├── 会员分析 +├── 等级分析 +├── 积分分析 +├── 优惠券分析 +├── 跨业务转化分析 +├── 服务消费分析 +├── 渠道分析 +└── 自定义报表 +``` + +#### 4.9.3 数据总览(首页看板) + +**核心指标卡片:** + +| 指标 | 定义 | 对比 | +|------|------|------| +| 总会员数 | 中台注册会员总数 | 较昨日/上周/上月 | +| 今日新增会员 | 当日新注册会员数 | 较昨日 | +| 活跃会员数 | 近30天有消费的会员数 | 较上月 | +| 跨业务用户数 | 使用过≥2个业务的用户数 | 较上月 | +| 今日消费金额 | 当日所有业务消费总额 | 较昨日 | +| 今日积分发放 | 当日发放积分总数 | 较昨日 | +| 今日券核销 | 当日核销优惠券张数 | 较昨日 | +| 待结算金额 | 本月待结算总额 | - | + +**趋势图表:** + +| 图表 | 类型 | 说明 | +|------|------|------| +| 会员增长趋势 | 折线图 | 近30天/12个月新增会员趋势 | +| 消费金额趋势 | 折线图 | 近30天/12个月消费金额趋势 | +| 业务占比 | 饼图 | 三大业务消费金额占比 | +| 活跃度分布 | 柱状图 | 活跃/沉默/流失用户占比 | + +**实时动态:** + +| 动态类型 | 示例 | +|----------|------| +| 新用户注册 | 用户138****1234刚刚注册成为会员 | +| 等级升级 | 用户139****5678升级为黄金会员 | +| 大额消费 | 用户137****9012消费500元(道路救援) | +| 跨业务转化 | 用户136****3456首次使用代驾服务 | + +#### 4.9.4 会员分析报表 + +**会员概览:** + +| 指标 | 定义 | +|------|------| +| 累计会员数 | 历史注册会员总数 | +| 有效会员数 | 未注销的会员数 | +| 新增会员数 | 指定周期新注册数 | +| 会员增长率 | (本期新增-上期新增)/上期新增 | + +**会员构成分析:** + +| 分析维度 | 说明 | +|----------|------| +| 按注册来源 | 各渠道注册会员占比 | +| 按地域分布 | 各省市会员分布 | +| 按注册时间 | 新老会员占比 | + +**会员活跃度分析:** + +| 分类 | 定义 | 运营建议 | +|------|------|----------| +| 高活跃 | 近7天有消费 | 维护关系 | +| 中活跃 | 近30天有消费 | 保持互动 | +| 低活跃 | 30-90天无消费 | 发券促活 | +| 沉默 | 90-180天无消费 | 短信召回 | +| 流失 | 180天以上无消费 | 重点召回 | + +**会员生命周期分析:** + +| 阶段 | 定义 | +|------|------| +| 新手期 | 注册≤30天 | +| 成长期 | 注册31-90天 | +| 成熟期 | 注册91-365天 | +| 衰退期 | 注册>365天且近90天无消费 | +| 忠诚期 | 注册>365天且持续消费 | + +**会员价值分析(RFM模型):** + +| 用户分群 | R(最近消费) | F(消费频次) | M(消费金额) | +|----------|---------------|---------------|---------------| +| 重要价值客户 | 高 | 高 | 高 | +| 重要发展客户 | 高 | 低 | 高 | +| 重要保持客户 | 低 | 高 | 高 | +| 重要挽留客户 | 低 | 低 | 高 | +| 一般价值客户 | 高 | 高 | 低 | +| 一般发展客户 | 高 | 低 | 低 | +| 一般保持客户 | 低 | 高 | 低 | +| 流失客户 | 低 | 低 | 低 | + +#### 4.9.5 等级分析报表 + +**等级分布:** + +| 等级 | 会员数 | 占比 | 平均消费 | 平均积分 | +|------|--------|------|----------|----------| +| 普通会员 | 80,000 | 64% | 100元 | 500分 | +| 白银会员 | 25,000 | 20% | 300元 | 2,000分 | +| 黄金会员 | 12,000 | 9.6% | 600元 | 8,000分 | +| 铂金会员 | 6,000 | 4.8% | 1,200元 | 25,000分 | +| 钻石会员 | 2,000 | 1.6% | 3,000元 | 60,000分 | + +**等级变动分析:** + +| 变动类型 | 指标 | +|----------|------| +| 各等级升级人数 | 本月升级至各等级的人数 | +| 降级人数 | 本月降级的人数 | +| 变动趋势 | 环比变化 | + +**等级权益使用分析:** + +| 指标 | 说明 | +|------|------| +| 折扣使用次数 | 各等级使用折扣次数 | +| 折扣金额 | 各等级折扣总金额 | +| 专属券领取/使用 | 各等级专属券数据 | + +#### 4.9.6 积分分析报表 + +**积分概览:** + +| 指标 | 说明 | +|------|------| +| 累计发放积分 | 历史发放积分总数 | +| 累计消耗积分 | 历史消耗积分总数 | +| 当前积分余额 | 未使用积分总数 | +| 积分消耗率 | 累计消耗/累计发放 | +| 本月发放/消耗 | 当月积分数据 | + +**积分获取渠道分析:** + +| 获取方式 | 占比 | +|----------|------| +| 消费获取 | 60% | +| 签到获取 | 20% | +| 活动获取 | 12.5% | +| 邀请好友 | 5% | +| 其他 | 2.5% | + +**积分使用渠道分析:** + +| 使用方式 | 占比 | +|----------|------| +| 订单抵扣 | 83.3% | +| 积分兑换 | 11.1% | +| 跨业务抵扣 | 5.6% | + +**积分跨业务流转分析:** + +| 来源业务 | 使用业务 | 流转积分 | 抵扣金额 | +|----------|----------|----------|----------| +| 道路救援 | 代驾 | 50,000分 | 500元 | +| 道路救援 | 到家 | 30,000分 | 300元 | +| 代驾 | 道路救援 | 20,000分 | 200元 | +| ... | ... | ... | ... | + +**积分过期预警:** + +| 过期时间 | 会员数 | 即将过期积分 | +|----------|--------|--------------| +| 7天内 | 5,000 | 500,000分 | +| 30天内 | 15,000 | 1,500,000分 | +| 90天内 | 30,000 | 3,000,000分 | + +#### 4.9.7 优惠券分析报表 + +**优惠券概览:** + +| 指标 | 说明 | +|------|------| +| 累计创建券 | 历史创建优惠券总数 | +| 累计发放券 | 历史发放优惠券总数 | +| 累计核销券 | 历史核销优惠券总数 | +| 核销率 | 核销数/发放数 | +| 券带动消费 | 使用券的订单总金额 | + +**按券类型分析:** + +| 券类型 | 发放量 | 核销量 | 核销率 | 抵扣金额 | 带动消费 | ROI | +|--------|--------|--------|--------|----------|----------|-----| +| 抵扣券 | 30,000张 | 20,000张 | 66.7% | 400,000元 | 1,200,000元 | 3.0 | +| 折扣券 | 15,000张 | 10,000张 | 66.7% | 150,000元 | 600,000元 | 4.0 | +| 全免券 | 3,000张 | 2,500张 | 83.3% | 200,000元 | 200,000元 | 1.0 | +| 现金券 | 2,000张 | 1,500张 | 75% | 30,000元 | 80,000元 | 2.7 | + +**按业务线分析:** + +| 业务线 | 发放量 | 核销量 | 核销率 | 带动消费 | +|--------|--------|--------|--------|----------| +| 道路救援 | 20,000张 | 12,000张 | 60% | 800,000元 | +| 代驾 | 18,000张 | 13,000张 | 72.2% | 500,000元 | +| 到家 | 12,000张 | 8,000张 | 66.7% | 400,000元 | + +**按流转类型分析:** + +| 流转类型 | 发放量 | 核销量 | 核销率 | +|----------|--------|--------|--------| +| 自有券 | 30,000张 | 20,000张 | 66.7% | +| 服务券(采购) | 15,000张 | 10,000张 | 66.7% | +| 引流券 | 5,000张 | 3,000张 | 60% | + +**大礼包销售分析:** + +| 礼包名称 | 售价 | 销售量 | 销售额 | 激活量 | 激活率 | 券核销率 | +|----------|------|--------|--------|--------|--------|----------| +| 出行无忧礼包 | 99元 | 5,000 | 495,000元 | 4,500 | 90% | 75% | +| 新人专享礼包 | 0元 | 10,000 | 0元 | 8,000 | 80% | 60% | + +#### 4.9.8 跨业务转化分析报表 + +**转化概览:** + +| 指标 | 说明 | +|------|------| +| 跨业务用户数 | 使用过≥2个业务的用户数 | +| 跨业务用户占比 | 跨业务用户/总会员数 | +| 跨业务转化率 | 新增跨业务用户/单业务用户 | +| 跨业务带动消费 | 跨业务用户在新业务的消费 | + +**用户业务分布:** + +| 使用业务数 | 用户数 | 占比 | 平均消费 | +|------------|--------|------|----------| +| 仅1个业务 | 95,000 | 76% | 200元 | +| 2个业务 | 25,000 | 20% | 500元 | +| 3个业务 | 5,000 | 4% | 1,200元 | + +**跨业务转化路径:** + +| 来源业务 | 目标业务 | 转化人数 | 转化率 | 首单消费 | 复购率 | +|----------|----------|----------|--------|----------|--------| +| 道路救援 → | 代驾 | 8,000 | 16% | 80元 | 35% | +| 道路救援 → | 到家 | 5,000 | 10% | 120元 | 28% | +| 代驾 → | 道路救援 | 6,000 | 17.1% | 200元 | 40% | +| 代驾 → | 到家 | 4,000 | 11.4% | 100元 | 30% | +| 到家 → | 道路救援 | 3,000 | 12% | 180元 | 25% | +| 到家 → | 代驾 | 4,500 | 18% | 70元 | 32% | + +**转化漏斗分析示例(道路救援 → 代驾):** + +| 阶段 | 人数 | 转化率 | +|------|------|--------| +| 道路救援用户 | 50,000 | 100% | +| 曝光代驾服务 | 40,000 | 80% | +| 领取代驾券 | 20,000 | 50% | +| 使用代驾服务 | 8,000 | 40% | +| 代驾复购 | 2,800 | 35% | + +**引流券效果分析:** + +| 引流方向 | 发放量 | 核销量 | 转化率 | 带动消费 | ROI | +|----------|--------|--------|--------|----------|-----| +| 代驾→道路救援 | 10,000张 | 2,000张 | 33.3% | 400,000元 | 5.0 | +| 代驾→到家 | 8,000张 | 1,500张 | 30% | 150,000元 | 3.0 | +| 道路救援→代驾 | 12,000张 | 3,000张 | 37.5% | 240,000元 | 4.0 | +| ... | ... | ... | ... | ... | ... | + +#### 4.9.9 服务消费分析报表 + +**消费概览:** + +| 指标 | 说明 | +|------|------| +| 总消费金额 | 全部业务消费总额 | +| 总订单数 | 全部业务订单总数 | +| 平均客单价 | 总消费/总订单 | +| 付费会员数 | 有消费的会员数 | +| 人均消费 | 总消费/付费会员数 | + +**按业务线分析:** + +| 业务线 | 消费金额 | 占比 | 订单数 | 客单价 | +|--------|----------|------|--------|--------| +| 道路救援 | 5,000,000元 | 50% | 25,000单 | 200元 | +| 代驾 | 3,000,000元 | 30% | 40,000单 | 75元 | +| 到家 | 2,000,000元 | 20% | 15,000单 | 133元 | + +**按服务类目分析:** + +| 服务类目 | 消费金额 | 占比 | 订单数 | 客单价 | +|----------|----------|------|--------|--------| +| 拖车服务 | 2,500,000元 | 50% | 8,000单 | 312.5元 | +| 搭电服务 | 1,000,000元 | 20% | 8,000单 | 125元 | +| ... | ... | ... | ... | ... | + +**消费时段分析:** + +| 时段 | 订单数 | 占比 | 主要业务 | +|------|--------|------|----------| +| 00:00-06:00 | 8,000单 | 10% | 代驾、道路救援 | +| 06:00-12:00 | 16,000单 | 20% | 到家服务 | +| 12:00-18:00 | 24,000单 | 30% | 到家服务、道路救援 | +| 18:00-24:00 | 32,000单 | 40% | 代驾、道路救援 | + +#### 4.9.10 渠道分析报表 + +**渠道概览:** + +| 渠道 | 新增会员 | 占比 | 消费转化率 | 带来消费 | +|------|----------|------|------------|----------| +| 道路救援APP | 5,000 | 33.3% | 60% | 600,000元 | +| 代驾小程序 | 4,000 | 26.7% | 55% | 350,000元 | +| 到家服务APP | 3,000 | 20% | 50% | 300,000元 | +| 会员中心小程序 | 2,000 | 13.3% | 40% | 200,000元 | +| 线下渠道 | 1,000 | 6.7% | 70% | 150,000元 | + +**礼包销售渠道分析:** + +| 渠道 | 销售量 | 销售额 | 占比 | +|------|--------|--------|------| +| 会员小程序 | 3,000 | 297,000元 | 40% | +| 道路救援APP | 2,000 | 198,000元 | 26.7% | +| 代驾小程序 | 1,500 | 148,500元 | 20% | +| 线下终端 | 1,000 | 99,000元 | 13.3% | + +**渠道ROI分析:** + +| 渠道 | 投入成本 | 带来消费 | ROI | +|------|----------|----------|-----| +| 线上自然流量 | 0元 | 800,000元 | ∞ | +| 短信营销 | 10,000元 | 150,000元 | 15.0 | +| APP推送 | 5,000元 | 100,000元 | 20.0 | +| 线下推广 | 50,000元 | 200,000元 | 4.0 | + +#### 4.9.11 自定义报表 + +**功能说明:** + +支持用户自定义筛选条件和展示维度,生成个性化报表。 + +**可选维度:** + +| 维度类型 | 可选项 | +|----------|--------| +| 时间维度 | 日/周/月/季度/年/自定义 | +| 业务维度 | 道路救援/代驾/到家/全部 | +| 服务维度 | 一级类目/二级类目/三级类目 | +| 用户维度 | 会员等级/活跃度/地域/来源渠道 | +| 券维度 | 券类型/流转类型/批次 | + +**可选指标:** + +| 指标类型 | 可选项 | +|----------|--------| +| 会员指标 | 会员数/新增数/活跃数/流失数 | +| 消费指标 | 消费金额/订单数/客单价/复购率 | +| 积分指标 | 发放积分/消耗积分/积分余额 | +| 优惠券指标 | 发放量/核销量/核销率/抵扣金额 | +| 转化指标 | 转化率/转化人数/带动消费 | + +**报表保存与分享:** + +| 功能 | 说明 | +|------|------| +| 保存报表 | 保存当前配置为模板 | +| 我的报表 | 查看已保存的报表 | +| 定时发送 | 设置每日/周/月自动发送 | +| 导出 | 支持Excel/PDF/图片导出 | +| 分享 | 生成链接分享给他人 | + +#### 4.9.12 报表导出与订阅 + +**导出功能:** + +| 导出格式 | 说明 | +|----------|------| +| Excel | 支持数据表格导出 | +| PDF | 支持图表完整导出 | +| 图片 | 支持单个图表导出 | + +**订阅功能:** + +| 字段 | 说明 | +|------|------| +| 报表选择 | 勾选需要订阅的报表 | +| 发送频率 | 日报/周报/月报 | +| 发送时间 | 自定义发送时间 | +| 接收方式 | 邮件/站内信 | +| 接收人 | 选择接收人员 | + +#### 4.9.13 报表权限 + +| 角色 | 可查看报表 | +|------|------------| +| 集团管理员 | 全部报表 | +| 集团运营 | 全部报表(不含财务数据) | +| 集团财务 | 全部报表 | +| BU运营 | 本业务相关报表 | +| BU财务 | 本业务财务报表 | +| 数据分析师 | 全部报表(只读) | + +--- + +## 五、管理后台设计(续) + +### 5.1 功能结构图 + +``` +会员中台管理后台 +├── 首页看板 +│ ├── 核心数据概览 +│ ├── 业务趋势图 +│ └── 实时动态 +├── 客户池管理 +│ ├── 客户概览 +│ ├── 客户列表 +│ ├── 客户导入 +│ ├── 客户分群 +│ ├── 标签管理 +│ ├── 营销触达 +│ ├── 转化追踪 +│ └── 数据统计 +├── 会员管理 +│ ├── 会员列表 +│ ├── 会员详情 +│ └── 会员标签 +├── 等级管理 +│ ├── 等级配置 +│ ├── 权益配置 +│ └── 升降级规则 +├── 积分管理 +│ ├── 积分规则配置 +│ ├── 积分流水查询 +│ └── 积分结算报表 +├── 优惠券管理 +│ ├── 券模板管理 +│ ├── 券池管理 +│ ├── 大礼包管理 +│ ├── 发放管理 +│ └── 数据统计 +├── 服务类目管理 +│ ├── 类目列表(树形) +│ ├── 新增类目 +│ ├── 编辑类目 +│ ├── 启用/停用 +│ └── 批量导入 +├── 消息中心 +│ ├── 推送任务管理 +│ ├── 模板配置 +│ └── 推送记录 +├── 结算对账管理 +│ ├── 结算总览 +│ ├── 采购结算 +│ ├── 积分结算 +│ ├── 引流券统计 +│ ├── 异议管理 +│ ├── 结算报表 +│ └── 结算设置 +├── 报表统计中心 +│ ├── 数据总览 +│ ├── 会员分析 +│ ├── 等级分析 +│ ├── 积分分析 +│ ├── 优惠券分析 +│ ├── 跨业务转化分析 +│ ├── 服务消费分析 +│ ├── 渠道分析 +│ ├── 自定义报表 +│ └── 报表订阅 +└── 系统设置 + ├── 业务线管理 + ├── 账号权限管理 + ├── 角色管理 + ├── 操作日志 + └── 系统参数配置 +``` + +### 5.2 角色权限设计 + +#### 5.2.1 角色定义 + +| 角色 | 说明 | 适用人员 | +|------|------|----------| +| 超级管理员 | 系统最高权限,可管理所有功能和配置 | 系统管理员 | +| 集团运营总监 | 集团层面运营管理,可查看和操作所有业务数据 | 集团运营负责人 | +| 集团运营专员 | 集团层面运营执行,可执行日常运营操作 | 集团运营人员 | +| 集团财务 | 集团财务管理,可查看和操作结算相关功能 | 集团财务人员 | +| BU运营负责人 | 业务线运营管理,可管理本业务线数据 | 各BU运营负责人 | +| BU运营专员 | 业务线运营执行,可执行本业务线日常操作 | 各BU运营人员 | +| BU财务 | 业务线财务管理,可查看本业务线结算数据 | 各BU财务人员 | +| 数据分析师 | 数据查看权限,仅可查看报表数据 | 数据分析人员 | + +#### 5.2.2 权限矩阵 + +| 功能模块 | 超级管理员 | 集团运营总监 | 集团运营专员 | 集团财务 | BU运营负责人 | BU运营专员 | BU财务 | 数据分析师 | +|----------|------------|--------------|--------------|----------|--------------|------------|--------|------------| +| 首页看板 | ✅全部 | ✅全部 | ✅全部 | ✅全部 | ✅本BU | ✅本BU | ✅本BU | ✅只读 | +| 客户池管理 | ✅全部 | ✅全部 | ✅全部 | ❌ | ✅本BU | ✅本BU | ❌ | ✅只读 | +| 会员管理 | ✅全部 | ✅全部 | ✅全部 | ❌ | ✅本BU | ✅本BU | ❌ | ✅只读 | +| 等级管理 | ✅全部 | ✅全部 | ✅查看 | ❌ | ✅查看 | ✅查看 | ❌ | ✅只读 | +| 积分管理 | ✅全部 | ✅全部 | ✅全部 | ✅查看 | ✅本BU | ✅本BU | ✅本BU查看 | ✅只读 | +| 优惠券管理 | ✅全部 | ✅全部 | ✅全部 | ❌ | ✅本BU | ✅本BU | ❌ | ✅只读 | +| 服务类目管理 | ✅全部 | ✅全部 | ✅查看 | ❌ | ✅查看 | ✅查看 | ❌ | ✅只读 | +| 消息中心 | ✅全部 | ✅全部 | ✅全部 | ❌ | ✅本BU | ✅本BU | ❌ | ❌ | +| 结算对账管理 | ✅全部 | ✅查看 | ✅查看 | ✅全部 | ✅本BU | ✅本BU查看 | ✅本BU | ❌ | +| 报表统计中心 | ✅全部 | ✅全部 | ✅全部 | ✅财务相关 | ✅本BU | ✅本BU | ✅本BU财务 | ✅全部只读 | +| 系统设置 | ✅全部 | ✅部分 | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | + +#### 5.2.3 数据权限 + +| 角色 | 数据范围 | +|------|----------| +| 集团角色 | 可查看/操作全部三个业务线数据 | +| 道路救援BU | 仅可查看/操作道路救援相关数据 | +| 代驾BU | 仅可查看/操作代驾相关数据 | +| 到家服务BU | 仅可查看/操作到家服务相关数据 | + +### 5.3 各模块后台功能清单 + +#### 5.3.1 首页看板 + +| 功能 | 说明 | +|------|------| +| 核心指标卡片 | 展示会员数、活跃数、消费额等关键指标 | +| 趋势图表 | 会员增长、消费趋势、业务占比等图表 | +| 实时动态 | 滚动展示最新注册、升级、消费等动态 | +| 待办事项 | 待审批、待确认等待处理事项提醒 | +| 快捷入口 | 常用功能快捷入口 | + +#### 5.3.2 会员管理 + +| 功能 | 说明 | +|------|------| +| 会员列表 | 分页展示会员列表,支持搜索和筛选 | +| 会员搜索 | 按手机号、姓名、会员ID搜索 | +| 高级筛选 | 按等级、注册时间、来源、标签等筛选 | +| 会员详情 | 查看会员完整信息、消费记录、积分明细、优惠券等 | +| 手动调整积分 | 手动增减会员积分(需填写原因) | +| 手动调整等级 | 手动调整会员等级(需填写原因) | +| 发放优惠券 | 向指定会员发放优惠券 | +| 添加标签 | 为会员添加/移除标签 | +| 导出会员 | 导出会员列表Excel | + +#### 5.3.3 等级管理 + +| 功能 | 说明 | +|------|------| +| 等级列表 | 展示所有等级配置 | +| 等级配置 | 设置等级名称、积分门槛、有效期 | +| 权益配置 | 设置各等级权益(折扣、专属券、特权等) | +| 升降级规则 | 配置升级条件、降级规则、保级条件 | +| 等级图标 | 上传各等级展示图标 | + +#### 5.3.4 积分管理 + +| 功能 | 说明 | +|------|------| +| 获取规则配置 | 配置各种行为获得积分规则 | +| 使用规则配置 | 配置积分抵扣比例、使用门槛等 | +| 兑换规则配置 | 配置跨业务积分兑换规则 | +| 积分流水查询 | 查询积分发放、使用、过期明细 | +| 积分结算报表 | 查看跨业务积分结算数据 | +| 积分过期预警 | 查看即将过期积分数据 | +| 手动发放积分 | 批量或单个发放积分 | + +#### 5.3.5 优惠券管理 + +| 功能 | 说明 | +|------|------| +| 券模板管理 | 创建/编辑/删除优惠券模板 | +| 券池管理 | 创建券批次、批量导出、批量作废 | +| 大礼包管理 | 创建/编辑礼包、上下架、卡密生成导出 | +| 采购审批 | 审批服务券采购申请 | +| 引流券审批 | 审批引流券申领申请 | +| 发放管理 | 定向发放、批量发放优惠券 | +| 券明细查询 | 查询单张券的状态和流转记录 | +| 数据统计 | 券发放、核销、过期等数据统计 | + +#### 5.3.6 服务类目管理 + +| 功能 | 说明 | +|------|------| +| 类目树展示 | 树形结构展示三级类目 | +| 新增类目 | 新增一级/二级/三级类目 | +| 编辑类目 | 修改类目名称、图标、排序等 | +| 启用/停用 | 控制类目状态 | +| 排序调整 | 拖拽或手动调整类目顺序 | +| 批量导入 | Excel批量导入类目 | +| 导出类目 | 导出完整类目列表 | + +#### 5.3.7 消息中心 + +| 功能 | 说明 | +|------|------| +| 推送任务列表 | 查看所有推送任务及状态 | +| 创建推送任务 | 创建新的消息推送任务 | +| 模板管理 | 管理消息推送模板 | +| 推送记录 | 查看历史推送记录和效果 | +| 用户偏好统计 | 统计用户消息接收偏好 | + +#### 5.3.8 结算对账管理 + +| 功能 | 说明 | +|------|------| +| 结算总览 | 展示待结算金额、待确认账单等概览 | +| 采购结算 | 采购订单列表、账单列表、确认/异议 | +| 积分结算 | 积分流转明细、账单列表、确认/异议 | +| 引流券统计 | 引流券核销数据统计(仅查看) | +| 异议管理 | 异议单列表、处理异议 | +| 结算报表 | 月度/年度结算报表 | +| 结算设置 | 结算周期、账单规则配置 | + +#### 5.3.9 报表统计中心 + +| 功能 | 说明 | +|------|------| +| 数据总览 | 首页看板数据 | +| 会员分析 | 会员构成、活跃度、生命周期、RFM分析 | +| 等级分析 | 等级分布、变动分析、权益使用分析 | +| 积分分析 | 积分发放/使用/余额分析、跨业务流转分析 | +| 优惠券分析 | 券发放/核销分析、礼包销售分析 | +| 跨业务转化分析 | 转化路径、漏斗分析、引流效果分析 | +| 服务消费分析 | 按业务/类目/时段分析 | +| 渠道分析 | 各渠道效果分析 | +| 自定义报表 | 自定义维度和指标生成报表 | +| 报表订阅 | 配置报表自动发送 | + +#### 5.3.10 系统设置 + +| 功能 | 说明 | +|------|------| +| 业务线管理 | 管理三个业务线基本信息 | +| 账号管理 | 管理后台用户账号 | +| 角色管理 | 管理角色和权限配置 | +| 操作日志 | 查看系统操作日志 | +| 系统参数 | 配置系统全局参数 | +| 接口管理 | 管理与业务系统的接口配置 | + +### 5.4 操作日志 + +#### 5.4.1 日志记录范围 + +| 操作类型 | 记录内容 | +|----------|----------| +| 登录登出 | 登录时间、IP、设备信息 | +| 数据修改 | 会员信息修改、等级调整、积分调整 | +| 配置变更 | 等级配置、积分规则、券模板等变更 | +| 审批操作 | 采购审批、引流券审批、异议处理 | +| 结算操作 | 账单确认、异议提交、打款确认 | +| 数据导出 | 会员导出、报表导出、券码导出 | + +#### 5.4.2 日志字段 + +| 字段 | 说明 | +|------|------| +| 操作时间 | 精确到秒 | +| 操作人 | 操作人员账号和姓名 | +| 操作类型 | 新增/修改/删除/查询/导出/审批等 | +| 操作模块 | 所属功能模块 | +| 操作对象 | 被操作的数据ID或名称 | +| 操作前数据 | 修改前的数据(JSON格式) | +| 操作后数据 | 修改后的数据(JSON格式) | +| IP地址 | 操作人IP | +| 操作结果 | 成功/失败 | +| 备注 | 操作备注信息 | + +--- + +## 六、会员小程序设计 + +### 6.1 功能结构图 + +``` +会员小程序 +├── 首页 +│ ├── 会员卡片(等级、积分、优惠券数量) +│ ├── 快捷入口(积分、优惠券、订单) +│ ├── 推荐服务(三大业务入口) +│ ├── 活动Banner +│ └── 热门礼包推荐 +├── 我的等级 +│ ├── 当前等级展示 +│ ├── 等级进度条 +│ ├── 等级权益说明 +│ ├── 升级攻略 +│ └── 等级历史记录 +├── 我的积分 +│ ├── 积分余额 +│ ├── 积分明细(收入/支出) +│ ├── 积分规则说明 +│ ├── 积分兑换入口 +│ └── 即将过期提醒 +├── 我的优惠券 +│ ├── 可用优惠券(按业务分类) +│ ├── 已使用优惠券 +│ ├── 已过期优惠券 +│ └── 输入券码兑换 +├── 领券中心 +│ ├── 推荐优惠券 +│ ├── 各业务专区券 +│ └── 限时领券活动 +├── 礼包商城 +│ ├── 在售礼包列表 +│ ├── 礼包详情 +│ ├── 购买礼包 +│ └── 卡密激活入口 +├── 我的礼包 +│ ├── 待激活礼包 +│ ├── 已激活礼包 +│ └── 礼包内券明细 +├── 订单记录 +│ ├── 全部订单 +│ ├── 道路救援订单 +│ ├── 代驾订单 +│ └── 到家服务订单 +├── 消息中心 +│ ├── 系统通知 +│ ├── 优惠券消息 +│ ├── 积分消息 +│ └── 活动消息 +└── 个人中心 + ├── 个人信息 + ├── 手机号管理 + ├── 消息偏好设置 + ├── 常见问题 + ├── 联系客服 + └── 关于我们 +``` + +### 6.2 页面清单 + +#### 6.2.1 首页 + +| 页面元素 | 说明 | +|----------|------| +| 会员卡片 | 展示等级、积分余额、可用券数量 | +| 等级进度 | 显示距离下一等级的进度 | +| 快捷入口 | 积分、优惠券、订单、客服4个入口 | +| 活动Banner | 轮播展示运营活动 | +| 服务入口 | 道路救援、代驾、到家三大业务入口 | +| 热门礼包 | 推荐热销礼包 | +| 新手引导 | 新用户引导任务 | + +#### 6.2.2 我的等级 + +| 页面元素 | 说明 | +|----------|------| +| 等级卡片 | 当前等级名称、图标 | +| 进度条 | 距离下一等级积分进度 | +| 等级权益 | 当前等级可享权益列表 | +| 等级对比 | 各等级权益对比表 | +| 升级攻略 | 如何快速升级指引 | +| 等级说明 | 等级规则详细说明 | + +#### 6.2.3 我的积分 + +| 页面元素 | 说明 | +|----------|------| +| 积分余额 | 当前可用积分 | +| 即将过期 | 即将过期积分提醒 | +| 积分明细 | 收入/支出明细列表 | +| 筛选功能 | 按时间、类型筛选 | +| 积分规则 | 获取和使用规则说明 | +| 兑换入口 | 跳转积分兑换页面 | + +#### 6.2.4 我的优惠券 + +| 页面元素 | 说明 | +|----------|------| +| Tab切换 | 可用/已使用/已过期 | +| 业务筛选 | 全部/道路救援/代驾/到家 | +| 券列表 | 券名称、面值、有效期、适用范围 | +| 券详情 | 点击查看券详细规则 | +| 立即使用 | 跳转对应业务下单 | +| 兑换入口 | 输入券码兑换 | + +#### 6.2.5 领券中心 + +| 页面元素 | 说明 | +|----------|------| +| 推荐券 | 系统推荐的优惠券 | +| 业务专区 | 按业务分类的券 | +| 限时活动 | 限时领券活动 | +| 领取状态 | 已领取/未领取/已领完 | +| 领取数量 | 每人限领数量提示 | + +#### 6.2.6 礼包商城 + +| 页面元素 | 说明 | +|----------|------| +| 礼包列表 | 在售礼包卡片列表 | +| 礼包卡片 | 图片、名称、原价、现价、已售数量 | +| 礼包详情 | 包含权益、使用说明 | +| 购买按钮 | 立即购买 | +| 卡密激活 | 输入卡密激活礼包 | + +#### 6.2.7 我的礼包 + +| 页面元素 | 说明 | +|----------|------| +| Tab切换 | 待激活/已激活 | +| 礼包卡片 | 礼包名称、状态、有效期 | +| 激活操作 | 点击激活礼包 | +| 券明细 | 查看礼包内已发放的券 | + +#### 6.2.8 订单记录 + +| 页面元素 | 说明 | +|----------|------| +| Tab切换 | 全部/道路救援/代驾/到家 | +| 订单列表 | 订单号、服务类型、金额、状态、时间 | +| 订单详情 | 点击查看订单详情 | +| 筛选功能 | 按时间、状态筛选 | + +#### 6.2.9 消息中心 + +| 页面元素 | 说明 | +|----------|------| +| 消息分类 | 系统通知/优惠券/积分/活动 | +| 消息列表 | 标题、摘要、时间、已读状态 | +| 消息详情 | 点击查看完整消息 | +| 全部已读 | 一键标记全部已读 | + +#### 6.2.10 个人设置 + +| 页面元素 | 说明 | +|----------|------| +| 头像昵称 | 修改头像和昵称 | +| 手机号 | 绑定/更换手机号 | +| 消息设置 | 各类消息接收开关 | +| 常见问题 | FAQ列表 | +| 联系客服 | 在线客服入口 | +| 关于我们 | 公司介绍、版本信息 | + +### 6.3 关键页面原型说明 + +#### 6.3.1 首页原型 + +``` +┌─────────────────────────────────────┐ +│ ┌─────────────────────────────┐ │ +│ │ [活动Banner轮播] │ │ +│ └─────────────────────────────┘ │ +│ │ +│ ┌─────────────────────────────┐ │ +│ │ ┌─────┐ │ │ +│ │ │ 头像 │ 张先生 │ │ +│ │ └─────┘ 黄金会员 │ │ +│ │ │ │ +│ │ 积分 2,580 优惠券 5张 │ │ +│ │ ━━━━━━━━━●━━━ 距铂金还需500分│ │ +│ └─────────────────────────────┘ │ +│ │ +│ ┌───────┐ ┌───────┐ ┌───────┐ │ +│ │ 积分 │ │ 优惠券 │ │ 订单 │ │ +│ └───────┘ └───────┘ └───────┘ │ +│ │ +│ ── 推荐服务 ────────────────── │ +│ ┌───────┐ ┌───────┐ ┌───────┐ │ +│ │ 道路 │ │ 代驾 │ │ 到家 │ │ +│ │ 救援 │ │ 服务 │ │ 服务 │ │ +│ └───────┘ └───────┘ └───────┘ │ +│ │ +│ ── 热门礼包 ────────────────── │ +│ ┌─────────────┐ ┌─────────────┐ │ +│ │ 出行无忧礼包 │ │ 新人专享礼包 │ │ +│ │ ¥99 │ │ 免费 │ │ +│ └─────────────┘ └─────────────┘ │ +│ │ +├─────────────────────────────────────┤ +│ [首页] [领券] [礼包] [订单] [我的] │ +└─────────────────────────────────────┘ +``` + +#### 6.3.2 我的优惠券原型 + +``` +┌─────────────────────────────────────┐ +│ ← 我的优惠券 │ +├─────────────────────────────────────┤ +│ [可用] [已使用] [已过期] │ +│ │ +│ 全部 | 道路救援 | 代驾 | 到家 │ +├─────────────────────────────────────┤ +│ ┌─────────────────────────────┐ │ +│ │ ┌─────┐ │ │ +│ │ │ ¥20 │ 代驾20元抵扣券 │ │ +│ │ └─────┘ 满50元可用 │ │ +│ │ 2024.12.31到期 │ │ +│ │ [立即使用]│ │ +│ └─────────────────────────────┘ │ +│ │ +│ ┌─────────────────────────────┐ │ +│ │ ┌─────┐ │ │ +│ │ │ 8折 │ 到家服务8折券 │ │ +│ │ └─────┘ 无门槛 │ │ +│ │ 2024.12.15到期 │ │ +│ │ [立即使用]│ │ +│ └─────────────────────────────┘ │ +│ │ +│ ┌─────────────────────────────┐ │ +│ │ ┌─────┐ │ │ +│ │ │ ¥50 │ 道路救援50元券 │ │ +│ │ └─────┘ 满200元可用 │ │ +│ │ 2024.11.30到期 │ │ +│ │ [立即使用]│ │ +│ └─────────────────────────────┘ │ +│ │ +│ ┌─────────────────┐ │ +│ │ 输入券码兑换 │ │ +│ └─────────────────┘ │ +└─────────────────────────────────────┘ +``` + +#### 6.3.3 礼包详情原型 + +``` +┌─────────────────────────────────────┐ +│ ← 礼包详情 │ +├─────────────────────────────────────┤ +│ ┌─────────────────────────────┐ │ +│ │ │ │ +│ │ [礼包图片] │ │ +│ │ │ │ +│ └─────────────────────────────┘ │ +│ │ +│ 出行无忧大礼包 │ +│ ¥99 原价¥250 │ +│ 已售 1,234 │ +│ │ +│ ── 礼包内容 ────────────────── │ +│ ┌─────────────────────────────┐ │ +│ │ • 道路救援50元抵扣券 × 2张 │ │ +│ │ • 代驾20元抵扣券 × 5张 │ │ +│ │ • 到家服务8折券 × 3张 │ │ +│ │ • 赠送500积分 │ │ +│ └─────────────────────────────┘ │ +│ │ +│ ── 使用说明 ────────────────── │ +│ 1. 购买后请在30天内激活 │ +│ 2. 激活后优惠券自动发放到账户 │ +│ 3. 各优惠券有效期及规则见券面 │ +│ │ +│ │ +├─────────────────────────────────────┤ +│ ┌─────────────────┐ │ +│ │ 立即购买 ¥99 │ │ +│ └─────────────────┘ │ +└─────────────────────────────────────┘ +``` + +--- + +## 十一、附录 + +### 附录1:名词解释表 + +| 名词 | 英文 | 解释 | +|------|------|------| +| 客户池 | Customer Pool | 来自各业务系统的原始客户数据,尚未转化为会员的潜在用户集合 | +| 会员 | Member | 通过领券、注册等方式完成转化,进入会员体系的用户 | +| 会员中台 | Member Platform | 统一管理会员数据和服务的中心化系统 | +| 服务券 | Service Coupon | A业务向B业务采购的优惠券,成本由采购方承担 | +| 引流券 | Traffic Coupon | B业务免费提供给A业务发放的优惠券,成本由提供方承担 | +| 综合积分 | Composite Points | 用于计算会员等级的积分,包含消费金额、次数等加权计算 | +| 可用积分 | Available Points | 用户可用于抵扣消费或兑换的积分余额 | +| 券池 | Coupon Pool | 存放已创建但未绑定用户的空白券,用于批量发放或导出 | +| 大礼包 | Gift Package | 将多张优惠券组合成一个礼包,支持定价销售或赠送 | +| 跨业务转化 | Cross-business Conversion | 用户从一个业务线转化到另一个业务线消费 | +| RFM模型 | RFM Model | 基于最近消费时间(Recency)、消费频率(Frequency)、消费金额(Monetary)的用户价值分析模型 | +| ROI | Return on Investment | 投资回报率,用于衡量营销活动效果 | + +### 附录2:优惠券流转示意图 + +**服务券流程:** + +``` +┌─────────────────────────────────────────────────────────────────┐ +│ 服务券采购流程 │ +├─────────────────────────────────────────────────────────────────┤ +│ │ +│ 道路救援BU 代驾BU │ +│ │ │ │ +│ │ 1. 发起采购申请 │ │ +│ │ (500张代驾20元券,单价15元) │ │ +│ ├───────────────────────────────────→│ │ +│ │ │ │ +│ │ 2. 审批通过 │ │ +│ │←───────────────────────────────────┤ │ +│ │ │ │ +│ │ 3. 券入库(道路救援券池) │ │ +│ │ │ │ +│ │ 4. 发放给道路救援用户 │ │ +│ │ │ │ +│ │ 5. 用户使用代驾服务│ │ +│ │ 核销优惠券 │ │ +│ │ │ │ +│ │ 6. 月度结算 │ │ +│ │ (道路救援向代驾支付7,500元) │ │ +│ ├───────────────────────────────────→│ │ +│ │ +└─────────────────────────────────────────────────────────────────┘ +``` + +**引流券流程:** + +``` +┌─────────────────────────────────────────────────────────────────┐ +│ 引流券发放流程 │ +├─────────────────────────────────────────────────────────────────┤ +│ │ +│ 代驾BU 道路救援BU │ +│ │ │ │ +│ │ 1. 创建引流券批次 │ │ +│ │ (1000张代驾10元券,用于引流) │ │ +│ │ │ │ +│ │ 2. 申请领取引流券 │ +│ │←───────────────────────────────────┤ │ +│ │ │ │ +│ │ 3. 审批通过,分配500张 │ │ +│ ├───────────────────────────────────→│ │ +│ │ │ │ +│ │ 4. 发放给道路救援用户 │ +│ │ │ │ +│ │ 5. 用户使用代驾服务 │ │ +│ │ 核销优惠券 │ │ +│ │ │ │ +│ │ 6. 记录引流效果(不结算) │ │ +│ │ │ │ +└─────────────────────────────────────────────────────────────────┘ +``` + +### 附录3:服务类目完整清单 + +| 一级类目 | 二级类目 | 三级类目 | 类目编码 | +|----------|----------|----------|----------| +| 道路救援服务 | 拖车服务 | 市内拖车 | ROAD_TOW_CITY | +| 道路救援服务 | 拖车服务 | 长途拖车 | ROAD_TOW_LONG | +| 道路救援服务 | 拖车服务 | 事故拖车 | ROAD_TOW_ACCIDENT | +| 道路救援服务 | 小修服务 | 现场快修 | ROAD_REPAIR_QUICK | +| 道路救援服务 | 小修服务 | 应急维修 | ROAD_REPAIR_EMERGENCY | +| 道路救援服务 | 换胎服务 | 备胎更换 | ROAD_TIRE_SPARE | +| 道路救援服务 | 换胎服务 | 新胎更换 | ROAD_TIRE_NEW | +| 道路救援服务 | 搭电服务 | 电瓶搭电 | ROAD_BATTERY_JUMP | +| 道路救援服务 | 搭电服务 | 电瓶更换 | ROAD_BATTERY_REPLACE | +| 道路救援服务 | 送油服务 | - | ROAD_FUEL | +| 道路救援服务 | 困境救援 | - | ROAD_RESCUE | +| 道路救援服务 | 开锁服务 | - | ROAD_UNLOCK | +| 代驾服务 | 酒后代驾 | - | DRIVER_WINE | +| 代驾服务 | 商务代驾 | - | DRIVER_BUSINESS | +| 代驾服务 | 长途代驾 | - | DRIVER_LONG | +| 代驾服务 | 旅游代驾 | - | DRIVER_TRAVEL | +| 代驾服务 | 其他代驾 | - | DRIVER_OTHER | +| 到家服务 | 清洁服务 | 日常保洁 | HOME_CLEAN_DAILY | +| 到家服务 | 清洁服务 | 深度清洁 | HOME_CLEAN_DEEP | +| 到家服务 | 清洁服务 | 开荒保洁 | HOME_CLEAN_NEW | +| 到家服务 | 清洁服务 | 家电清洗 | HOME_CLEAN_APPLIANCE | +| 到家服务 | 维修服务 | 家电维修 | HOME_REPAIR_APPLIANCE | +| 到家服务 | 维修服务 | 水电维修 | HOME_REPAIR_UTILITY | +| 到家服务 | 维修服务 | 门窗维修 | HOME_REPAIR_DOOR | +| 到家服务 | 维修服务 | 管道疏通 | HOME_REPAIR_PIPE | +| 到家服务 | 清洗服务 | 油烟机清洗 | HOME_WASH_HOOD | +| 到家服务 | 清洗服务 | 空调清洗 | HOME_WASH_AC | +| 到家服务 | 清洗服务 | 洗衣机清洗 | HOME_WASH_WASHER | +| 到家服务 | 清洗服务 | 冰箱清洗 | HOME_WASH_FRIDGE | +| 到家服务 | 其他服务 | 搬家服务 | HOME_OTHER_MOVE | +| 到家服务 | 其他服务 | 家具安装 | HOME_OTHER_INSTALL | + +### 附录4:接口文档 + +详见《集团会员中台系统接口设计文档》(单独附件) + +### 附录5:原型设计稿 + +详见《集团会员中台系统原型设计稿》(单独附件) + +### 附录6:数据库设计 + +详见《集团会员中台系统数据库设计文档》(单独附件) + +--- + +## 文档结束 + diff --git a/training-system/.claude/settings.local.json b/training-system/.claude/settings.local.json deleted file mode 100644 index b51a7de..0000000 --- a/training-system/.claude/settings.local.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "permissions": { - "allow": [ - "Bash(netstat:*)", - "Bash(findstr:*)", - "Bash(ping:*)", - "Bash(curl:*)", - "Bash(mvn compile test-compile:*)", - "mcp__chrome-devtools__click", - "mcp__chrome-devtools__take_snapshot", - "mcp__chrome-devtools__navigate_page", - "mcp__chrome-devtools__list_network_requests", - "mcp__chrome-devtools__get_network_request", - "mcp__chrome-devtools__fill", - "mcp__chrome-devtools__evaluate_script", - "mcp__chrome-devtools__fill_form", - "mcp__chrome-devtools__wait_for", - "Bash(copy:*)" - ] - } -} diff --git a/training-system/.gitignore b/training-system/.gitignore deleted file mode 100644 index fbfe99e..0000000 --- a/training-system/.gitignore +++ /dev/null @@ -1,6 +0,0 @@ -node_modules/ -target/ -.idea/ -.summaries/ -.claude/ -.env diff --git a/training-system/.idea/.gitignore b/training-system/.idea/.gitignore deleted file mode 100644 index 13566b8..0000000 --- a/training-system/.idea/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml -# Editor-based HTTP Client requests -/httpRequests/ -# Datasource local storage ignored files -/dataSources/ -/dataSources.local.xml diff --git a/training-system/.idea/misc.xml b/training-system/.idea/misc.xml deleted file mode 100644 index b1ad763..0000000 --- a/training-system/.idea/misc.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/training-system/.idea/modules.xml b/training-system/.idea/modules.xml deleted file mode 100644 index fe33cca..0000000 --- a/training-system/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/training-system/.idea/training-system.iml b/training-system/.idea/training-system.iml deleted file mode 100644 index d6ebd48..0000000 --- a/training-system/.idea/training-system.iml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/training-system/.idea/vcs.xml b/training-system/.idea/vcs.xml deleted file mode 100644 index 6c0b863..0000000 --- a/training-system/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/training-system/.summaries/summary-training-system-20260108-1634-会话摘要.md b/training-system/.summaries/summary-training-system-20260108-1634-会话摘要.md deleted file mode 100644 index 9be230b..0000000 --- a/training-system/.summaries/summary-training-system-20260108-1634-会话摘要.md +++ /dev/null @@ -1,28 +0,0 @@ -# 会话摘要 - -| 项目 | 时间 | 任务 | 需求ID | -|------|------|------|--------| -| training-system | 2026-01-08 16:34 | 会话摘要 | - | - -## 交互记录 - -| 序号 | 用户操作 | AI响应 | 结果 | -|------|----------|--------|------| -| 1 | 执行 /summary 命令 | 获取系统时间并询问需求ID | 成功 | - -## 错误记录 - -无错误记录。 - -## 成果产出 - -- 生成本会话摘要文件 - -## 总结 - -本次会话为新开始的会话,用户直接执行了 /summary 命令生成会话摘要。 - -## 效率评估 - -**实际用时**: 1分钟 -**应耗人工**: 3分钟 diff --git a/training-system/.summaries/summary-training-system-20260108-1721-后端服务及前端页面开发.md b/training-system/.summaries/summary-training-system-20260108-1721-后端服务及前端页面开发.md deleted file mode 100644 index c1c0bbd..0000000 --- a/training-system/.summaries/summary-training-system-20260108-1721-后端服务及前端页面开发.md +++ /dev/null @@ -1,50 +0,0 @@ -# 会话摘要 - -| 项目 | 时间 | 任务 | 需求ID | -|------|------|------|--------| -| training-system | 2026-01-08 17:21 | 后端服务及前端页面开发 | - | - -## 交互记录 - -| 序号 | 用户操作 | AI响应 | 结果 | -|------|----------|--------|------| -| 1 | 继续上一会话开发任务 | 读取已完成的DTO/VO文件,继续开发阶段四培训计划模块 | 成功 | -| 2 | - | 创建TrainingPlanService接口和PlanProgressService接口 | 成功 | -| 3 | - | 创建PlanProgressServiceImpl实现类 | 成功 | -| 4 | - | 创建TrainingPlanServiceImpl实现类 | 成功 | -| 5 | - | 创建TrainingPlanController控制器 | 成功 | -| 6 | - | 开始阶段五前端页面开发,检查现有页面文件 | 成功 | -| 7 | - | 创建system/org.html组织架构页面 | 成功 | -| 8 | - | 创建system/user.html员工管理页面 | 成功 | -| 9 | - | 创建knowledge/category.html知识分类页面 | 成功 | -| 10 | - | 创建knowledge/list.html知识列表页面 | 成功 | -| 11 | - | 创建exam/question-category.html题库分类页面 | 成功 | - -## 错误记录 - -无错误发生 - -## 成果产出 - -### 后端服务层(阶段四) -- `TrainingPlanService.java` - 培训计划服务接口 -- `PlanProgressService.java` - 学习进度服务接口 -- `TrainingPlanServiceImpl.java` - 培训计划服务实现(含CRUD、发布、结束、学员计划查询) -- `PlanProgressServiceImpl.java` - 学习进度服务实现(含知识完成标记、进度计算) -- `TrainingPlanController.java` - 培训计划控制器(含管理端和学员端接口) - -### 前端页面(阶段五进行中) -- `templates/system/org.html` - 组织架构管理页面(树形结构+详情展示+CRUD弹窗) -- `templates/system/user.html` - 员工管理页面(列表+筛选+新增编辑+密码重置) -- `templates/knowledge/category.html` - 知识分类页面(树形结构+表单编辑) -- `templates/knowledge/list.html` - 知识列表页面(列表+上传+状态管理) -- `templates/exam/question-category.html` - 题库分类页面(树形结构+题目数量统计) - -## 总结 - -本次会话完成了阶段四培训计划模块的全部后端开发,包括培训计划的创建、编辑、删除、发布、结束,以及学员的培训计划查看和学习进度跟踪功能。同时开始了阶段五前端页面开发,已完成组织架构、员工管理、知识分类、知识列表、题库分类共5个核心管理页面。前端页面采用纯HTML+CSS+JS方案,通过AJAX与后端API交互,实现了完整的CRUD操作界面。 - -## 效率评估 - -**实际用时**: 25分钟 -**应耗人工**: 480分钟 diff --git a/training-system/.summaries/summary-training-system-20260108-1947-登录功能测试.md b/training-system/.summaries/summary-training-system-20260108-1947-登录功能测试.md deleted file mode 100644 index 08abe97..0000000 --- a/training-system/.summaries/summary-training-system-20260108-1947-登录功能测试.md +++ /dev/null @@ -1,55 +0,0 @@ -# 会话摘要 - -| 项目 | 时间 | 任务 | 需求ID | -|------|------|------|--------| -| training-system | 2026-01-08 19:47 | 登录功能测试 | - | - -## 交互记录 - -| 序号 | 用户操作 | AI响应 | 结果 | -|------|---------|--------|------| -| 1 | 请求测试登录功能 | 创建JwtUtilsTest、AuthServiceTest、AuthControllerTest | 41个测试用例全部通过 | -| 2 | 询问如何运行项目 | 提供项目运行步骤和配置说明 | 用户成功启动项目 | -| 3 | 登录页面404错误 | 分析原因:HTML在templates目录而非static目录 | 将HTML文件移至static目录,问题解决 | -| 4 | admin/admin登录失败 | 检查SQL初始化脚本,发现密码应为admin123 | 告知用户正确密码 | -| 5 | 请求做登录功能单元测试 | 创建PasswordEncoderTest和LoginIntegrationTest | 发现数据库密码哈希错误并修复 | - -## 错误记录 - -| 错误类型 | 错误描述 | 解决方案 | -|---------|---------|---------| -| 404错误 | 登录页面无法访问 | HTML文件从templates移至static目录 | -| 密码错误 | admin用户登录失败 | SQL脚本中BCrypt哈希错误,生成新的有效哈希并更新 | -| JWT测试失败 | 同用户同秒生成Token相同 | 测试延迟从10ms改为1100ms | - -## 成果产出 - -### 测试文件 -1. `src/test/java/com/sino/training/common/utils/JwtUtilsTest.java` - 19个测试用例 -2. `src/test/java/com/sino/training/module/auth/service/AuthServiceTest.java` - 11个测试用例 -3. `src/test/java/com/sino/training/module/auth/controller/AuthControllerTest.java` - 11个测试用例 -4. `src/test/java/com/sino/training/module/auth/PasswordEncoderTest.java` - 4个测试用例 -5. `src/test/java/com/sino/training/module/auth/LoginIntegrationTest.java` - 11个测试用例 - -### 文档 -- `docs/测试报告-登录模块.md` - 完整测试报告 - -### 修复 -- 修复SQL初始化脚本中admin用户的密码哈希 -- 将前端HTML文件移至static目录 - -## 总结 - -完成了登录模块的全面测试工作,包括: -1. 后端单元测试(JwtUtils、AuthService、AuthController)共41个用例全部通过 -2. 发现并修复登录页面404问题(HTML文件位置错误) -3. 发现并修复数据库密码哈希错误问题 -4. 创建密码编码验证测试和登录集成测试 -5. 生成完整测试报告 - -用户需执行SQL更新数据库密码后,使用admin/admin123登录。 - -## 效率评估 - -**实际用时**: 45分钟 -**应耗人工**: 240分钟 diff --git a/training-system/.summaries/summary-training-system-20260109-1806-员工管理复测及漏测分析.md b/training-system/.summaries/summary-training-system-20260109-1806-员工管理复测及漏测分析.md deleted file mode 100644 index 2f41772..0000000 --- a/training-system/.summaries/summary-training-system-20260109-1806-员工管理复测及漏测分析.md +++ /dev/null @@ -1,48 +0,0 @@ -# 会话摘要 - -| 项目 | 时间 | 任务 | 需求ID | -|------|------|------|--------| -| training-system | 2026-01-09 18:06 | 员工管理复测及漏测分析 | - | - -## 交互记录 - -| 序号 | 用户操作 | AI响应 | 结果 | -|------|---------|--------|------| -| 1 | 要求对员工管理模块进行复测 | 获取Token并验证3个缺陷修复情况 | BUG-USER-001通过、BUG-USER-002失败、BUG-USER-003通过 | -| 2 | 反馈重置密码和编辑状态功能问题 | 测试重置密码功能 | 功能正常,新密码可登录 | -| 3 | 继续测试编辑状态功能 | 测试专用disable接口和编辑接口 | 发现编辑接口无法修改状态 | -| 4 | 要求确认是否前端问题 | 分析前端代码user.html | 确认前端正确传递status字段 | -| 5 | 继续验证后端问题 | 检查UserDTO和UserServiceImpl | 确认后端DTO缺少status字段 | -| 6 | 要求分析漏测原因 | 分析前两次测试记录 | 归纳出6大漏测原因 | -| 7 | 要求将分析归纳到LLR.md | 更新docs/LLR.md文件 | 添加漏测分析记录 | - -## 错误记录 - -| 错误类型 | 描述 | 解决方案 | -|---------|------|---------| -| 后端Bug | UserDTO缺少status字段,updateUser()未处理状态 | 需在DTO添加status字段并在Service中处理 | -| 后端Bug | JWT Token未包含departmentId导致部门隔离失效 | 需修改JwtUtils.generateToken()添加departmentId | - -## 成果产出 - -| 文件 | 说明 | -|------|------| -| docs/test-reports/RegressionReport_1.3_UserManagement.md | 第一版复测报告 | -| docs/test-reports/RegressionReport_1.3_UserManagement_V2.md | 深度测试后的V2复测报告 | -| docs/LLR.md | 更新漏测原因分析记录 | - -## 总结 - -本次会话对员工管理模块进行了三轮测试: -1. **第一轮复测**:验证原有3个缺陷,2个通过1个失败 -2. **第二轮深度测试**:根据用户反馈发现新Bug(编辑接口无法修改状态) -3. **第三轮分析**:确认问题为后端Bug(非前端问题),并归纳漏测原因 - -核心发现: -- BUG-USER-004:编辑接口无法修改状态(后端UserDTO缺少status字段) -- 漏测根因:"只测了能用的接口,没测用户实际用的接口" - -## 效率评估 - -**实际用时**: 45分钟 -**应耗人工**: 180分钟 diff --git a/training-system/.summaries/summary-training-system-20260109-1808-员工管理模块缺陷修复.md b/training-system/.summaries/summary-training-system-20260109-1808-员工管理模块缺陷修复.md deleted file mode 100644 index 6e570a6..0000000 --- a/training-system/.summaries/summary-training-system-20260109-1808-员工管理模块缺陷修复.md +++ /dev/null @@ -1,57 +0,0 @@ -# 会话摘要 - -| 项目 | 时间 | 任务 | 需求ID | -|------|------|------|--------| -| training-system | 2026-01-09 18:08 | 员工管理模块缺陷修复 | - | - -## 交互记录 - -| 序号 | 用户操作 | AI响应 | 结果 | -|------|---------|--------|------| -| 1 | 要求根据测试报告给出修复建议 | 分析测试报告,识别3个缺陷并给出修复方案 | 完成缺陷分析 | -| 2 | 确认查看相关文件 | 查看UserController、UserServiceImpl、AuthInterceptor等文件 | 给出详细修复方案 | -| 3 | 要求按方案修改代码 | 创建RequireRole注解、RoleInterceptor拦截器,修改WebMvcConfig、UserController、UserServiceImpl、ResultCode | P0/P1/P2缺陷修复完成 | -| 4 | 分析员工禁用状态不生效问题 | 分析AuthInterceptor未校验用户状态,给出修复方案 | 完成分析(未修改代码) | -| 5 | 分析BUG-USER-004问题 | 分析UserDTO缺少status字段、updateUser未处理状态更新 | 完成根因分析 | -| 6 | 要求修复BUG-USER-004 | 修改UserDTO添加status字段,修改updateUser添加状态更新逻辑 | 修复完成 | - -## 错误记录 - -| 错误类型 | 描述 | 解决方案 | -|---------|------|---------| -| 无 | - | - | - -## 成果产出 - -### 新建文件 -1. `src/main/java/com/sino/training/common/annotation/RequireRole.java` - 角色权限注解 -2. `src/main/java/com/sino/training/common/interceptor/RoleInterceptor.java` - 角色权限拦截器 - -### 修改文件 -1. `WebMvcConfig.java` - 注册RoleInterceptor -2. `UserController.java` - 添加@RequireRole注解 -3. `UserServiceImpl.java` - 添加部门数据隔离逻辑、手机号唯一性校验、状态更新逻辑 -4. `ResultCode.java` - 新增PHONE_EXISTS错误码 -5. `UserDTO.java` - 新增status字段 - -### 缺陷修复情况 -| 缺陷编号 | 描述 | 状态 | -|---------|------|------| -| BUG-USER-001 | 手机号未做唯一性校验 | ✅ 已修复 | -| BUG-USER-002 | 讲师未实现部门数据隔离 | ⚠️ Service层已添加,需修复JWT | -| BUG-USER-003 | 学员可访问员工管理接口 | ✅ 已修复 | -| BUG-USER-004 | 编辑接口无法修改状态 | ✅ 已修复 | - -## 总结 - -本次会话完成了员工管理模块的缺陷分析和修复工作: -1. 实现了基于注解的角色权限控制机制(@RequireRole + RoleInterceptor) -2. 在Service层添加了部门数据隔离逻辑 -3. 添加了手机号唯一性校验 -4. 修复了编辑接口无法修改状态的问题 -5. 分析了禁用状态不生效的根因(AuthInterceptor未校验用户状态),待后续修复 - -## 效率评估 - -**实际用时**: 45分钟 -**应耗人工**: 180分钟 diff --git a/training-system/.summaries/summary-training-system-20260112-1953-前端BUG修复.md b/training-system/.summaries/summary-training-system-20260112-1953-前端BUG修复.md deleted file mode 100644 index 7500a7e..0000000 --- a/training-system/.summaries/summary-training-system-20260112-1953-前端BUG修复.md +++ /dev/null @@ -1,55 +0,0 @@ -# 会话摘要 - -| 项目 | 时间 | 任务 | 需求ID | -|------|------|------|--------| -| training-system | 2026-01-12 19:53 | 前端BUG修复 | - | - -## 交互记录 - -| 序号 | 用户操作 | AI响应 | 结果 | -|------|----------|--------|------| -| 1 | 题目编辑时选项和答案不显示 | 分析发现前端JSON.parse多余且setOptions未正确读取opt.value | 修复question-edit.html两处代码 | -| 2 | 组卷方式题目不显示 | 分析发现result.data.list应为result.data.records | 修复paper-edit.html两处代码 | -| 3 | 新增考卷totalScore未传后端 | 分析发现savePaper函数缺少totalScore字段 | 添加totalScore计算并传递 | -| 4 | 创建试卷报"所属部门"不存在 | 分析发现PaperServiceImpl.createPaper未实现部门ID逻辑 | 添加与QuestionServiceImpl相同的部门ID处理逻辑 | -| 5 | 试卷管理列表不显示 | 分析发现pageData.list应为pageData.records | 修复paper.html一处代码 | -| 6 | 编辑试卷不显示信息 | 分析发现q.content应为q.question.content | 修复paper-edit.html两处字段路径 | -| 7 | 试卷发布功能不可用 | 分析发现前端用POST但后端用PUT | 修复paper.html请求方法 | -| 8 | 试卷复制功能不可用 | 分析发现后端未实现copy接口 | 删除前端复制按钮和函数 | -| 9 | 试卷预览不显示内容 | 分析发现多处字段路径错误 | 修复paper-preview.html六处代码 | - -## 错误记录 - -| 错误类型 | 文件 | 问题描述 | 解决方案 | -|----------|------|----------|----------| -| 数据格式不匹配 | question-edit.html | 后端返回options是对象数组,前端多余JSON.parse | 移除JSON.parse,读取opt.value | -| 字段名错误 | paper-edit.html, paper.html | 使用data.list但后端返回data.records | 改为records | -| 缺少字段 | paper-edit.html | savePaper未传totalScore | 添加totalScore计算 | -| 业务逻辑缺失 | PaperServiceImpl.java | createPaper未按角色处理departmentId | 添加UserContext判断逻辑 | -| 嵌套对象访问错误 | paper-edit.html, paper-preview.html | 直接访问q.content但实际是q.question.content | 修正字段路径 | -| HTTP方法不匹配 | paper.html | 前端POST但后端PUT | 改为put方法 | -| 接口未实现 | paper.html | 复制功能后端未实现 | 删除前端复制功能 | - -## 成果产出 - -| 文件 | 修改类型 | 说明 | -|------|----------|------| -| question-edit.html | 修复 | 移除多余JSON.parse,正确读取选项值 | -| paper-edit.html | 修复 | records字段、totalScore、嵌套对象访问 | -| paper.html | 修复 | records字段、PUT方法、删除复制功能 | -| paper-preview.html | 修复 | 6处嵌套对象字段路径修正 | -| PaperServiceImpl.java | 修复 | createPaper添加部门ID逻辑 | - -## 总结 - -本次会话修复了9个前端BUG,主要问题集中在: -1. **数据格式不匹配**:后端返回的分页数据用records字段,前端错误使用list -2. **嵌套对象访问**:试卷题目数据嵌套在question对象中,前端直接访问导致undefined -3. **JSON解析问题**:后端已将JSON字符串解析为对象,前端多余的JSON.parse导致错误 -4. **HTTP方法不一致**:发布接口后端用PUT,前端用POST -5. **后端逻辑缺失**:PaperServiceImpl未按CLAUDE.md要求处理departmentId - -## 效率评估 - -**实际用时**: 25分钟 -**应耗人工**: 120分钟 diff --git a/training-system/.summaries/summary-training-system-20260113-1138-参与人员保存BUG修复.md b/training-system/.summaries/summary-training-system-20260113-1138-参与人员保存BUG修复.md deleted file mode 100644 index 8e2ce6c..0000000 --- a/training-system/.summaries/summary-training-system-20260113-1138-参与人员保存BUG修复.md +++ /dev/null @@ -1,44 +0,0 @@ -# 会话摘要 - -| 项目 | 时间 | 任务 | 需求ID | -|------|------|------|--------| -| training-system | 2026-01-13 11:38 | 参与人员保存BUG修复 | - | - -## 交互记录 - -| 序号 | 操作类型 | 描述 | 结果 | -|------|----------|------|------| -| 1 | 问题复现 | 用户反馈"发布考试选择了参与人员,保存后参与人员丢失" | 确认问题存在 | -| 2 | API验证 | 调用 `/api/exam/3` 检查数据库数据 | 数据已正确保存(targets数组包含2人) | -| 3 | 前端检查 | 编辑页面显示"已选择0人" | 确认是前端显示问题 | -| 4 | 代码分析 | 阅读 edit.html 中 loadExam 函数 | 发现字段名不匹配和异步顺序问题 | -| 5 | 修复1 | 修正字段名 participants → targets, userId → targetId | 完成 | -| 6 | 修复2 | 添加 await 确保异步执行顺序正确 | 完成 | -| 7 | 文件同步 | 复制修改后的文件到 target 目录 | 完成 | -| 8 | 验证修复 | 刷新页面检查参与人员显示 | 正确显示"已选择2人" | - -## 错误记录 - -| 错误类型 | 位置 | 原因 | 解决方案 | -|----------|------|------|----------| -| 字段名不匹配 | edit.html:294-299 | 代码使用 `exam.participants`,API返回 `exam.targets` | 修改为 `exam.targets` 和 `targetId` | -| 异步执行顺序 | edit.html:149-160 | loadUsers()和loadExam()同时执行无await | 添加 await 保证执行顺序 | - -## 成果产出 - -| 文件 | 修改内容 | -|------|----------| -| src/main/resources/static/exam/edit.html | 1. 修复 loadExam 中参与人员字段名(participants→targets, userId→targetId)
2. 修复 DOMContentLoaded 中异步执行顺序(添加await) | - -## 总结 - -用户反馈考试参与人员保存后丢失的问题。经测试定位,数据已正确保存到数据库,问题在于前端编辑页面加载时: -1. 使用了错误的字段名(participants 而非 targets) -2. 异步函数执行顺序不正确导致渲染时机问题 - -通过修正字段名和异步执行顺序,问题已修复并验证通过。 - -## 效率评估 - -**实际用时**: 15分钟 -**应耗人工**: 60分钟 diff --git a/training-system/CLAUDE.md b/training-system/CLAUDE.md deleted file mode 100644 index 55ca144..0000000 --- a/training-system/CLAUDE.md +++ /dev/null @@ -1,43 +0,0 @@ -# Java Maven 项目 AI 开发最高准则(必须遵守) - -## 一、技术栈(不可更改) -- 后端语言:Java -- JDK:17 -- 构建工具:Maven -- 后端框架:Spring Boot 3.1.2 -- 前端框架: HTML + CSS + Bootstrap -- ORM:MyBatis Plus -- 数据库:MySQL 8 -- API 文档:Springdoc OpenAPI -- 序列化:Jackson -- 安全框架:Spring Security(用于BCrypt密码加密) -- 认证方式:JWT Token(使用 java-jwt) - -## 二、强制约束(最高优先级) -- ❌ 不允许引入未声明的新技术栈 -- ❌ 不允许更换框架或大版本 -- ❌ 不允许使用过时 API -- ❌ 不允许在本项目任何位置使用 Python(包括代码、脚本、Notebook 等) - -## 三、编码规范 -- 遵循《阿里 Java 开发规范》 -- 必须使用 Lombok -- Controller(RESTful) 层不写业务逻辑 -- Service + Impl 负责业务 -- Mapper 只做数据访问 - -## 四、通用要求 -- 所有代码必须: - - 可读 - - 可维护 - - 有必要注释 -- 不生成 Demo / 示例 / 伪代码 -- 生成代码必须可直接运行 - -## 五、当需求与以上规则冲突时 -👉 **以本文件为最高准则,拒绝执行冲突需求** - -## 六、业务逻辑要求 -- 实现部门ID逻辑: - - ADMIN:使用前端传入的 departmentId,若为空则报错 - - 非ADMIN:强制使用当前登录用户的 departmentId,忽略前端传值 diff --git a/training-system/README.md b/training-system/README.md deleted file mode 100644 index 67c2868..0000000 --- a/training-system/README.md +++ /dev/null @@ -1,159 +0,0 @@ -# 道路救援企业培训系统 - -> 版本:V1.0.1 | 基于 Spring Boot 3.1.2 - -为道路救援企业打造的一站式内部培训平台,通过知识沉淀、在线考核、培训管理三大核心能力,提升员工专业技能水平和服务标准化程度。 - ---- - -## 技术栈 - -| 类别 | 技术 | 版本 | -|-----|------|------| -| 语言 | Java | 17 | -| 构建 | Maven | 3.6+ | -| 框架 | Spring Boot | 3.1.2 | -| ORM | MyBatis Plus | 3.5.3.1 | -| 数据库 | MySQL | 8.0+ | -| 认证 | JWT (java-jwt) | 4.4.0 | -| API文档 | Springdoc OpenAPI | 2.2.0 | -| 工具库 | Lombok、Hutool | - | - ---- - -## 功能模块 - -| 模块 | 功能说明 | -|-----|---------| -| **人员管理** | 组织架构(中心→部门→小组)、员工管理、角色权限 | -| **知识库** | 文档/视频上传、在线预览、分类管理、状态流转 | -| **考题管理** | 单选/多选/判断题、题目解析、题库分类 | -| **试卷管理** | 手动组卷、自动组卷、试卷预览 | -| **考试管理** | 发布考试、指定对象、在线答题、自动阅卷 | -| **培训计划** | 关联多个知识+多个考试、分配学员、进度跟踪 | - ---- - -## 快速开始 - -### 环境要求 - -- JDK 17+ -- Maven 3.6+ -- MySQL 8.0+ - -### 1. 克隆项目 - -```bash -git clone -cd training-system -``` - -### 2. 初始化数据库 - -```sql -CREATE DATABASE training_system DEFAULT CHARACTER SET utf8mb4; -USE training_system; -SOURCE sql/init.sql; -``` - -### 3. 修改配置 - -编辑 `src/main/resources/application.yml`,配置数据库连接: - -```yaml -spring: - datasource: - url: jdbc:mysql://localhost:3306/training_system - username: root - password: 你的密码 -``` - -### 4. 启动应用 - -```bash -mvn spring-boot:run -``` - -### 5. 访问系统 - -- 系统地址:http://localhost:8080 -- API文档:http://localhost:8080/swagger-ui.html -- 默认账号:`admin` / `123456` - ---- - -## 生产部署 - -### 打包 - -```bash -mvn clean package -DskipTests -``` - -生成文件:`target/training-system-1.0.0.jar` - -### Linux部署 - -```bash -# 上传JAR包和SQL脚本到服务器 -scp target/training-system-1.0.0.jar user@server:/opt/training/ -scp sql/init.sql user@server:/opt/training/ - -# 创建生产配置 /opt/training/application-prod.yml -# 启动应用 -java -jar training-system-1.0.0.jar --spring.profiles.active=prod -``` - -详细部署指南见 [部署文档](docs/Deploy.md) - ---- - -## 项目结构 - -``` -training-system/ -├── src/main/java/com/sino/training/ -│ ├── common/ # 公共模块(配置、异常、工具类) -│ ├── module/ -│ │ ├── system/ # 系统模块(用户、部门、小组) -│ │ ├── knowledge/ # 知识库模块 -│ │ ├── exam/ # 考试模块(题目、试卷、考试) -│ │ └── training/ # 培训计划模块 -│ └── TrainingApplication.java -├── src/main/resources/ -│ ├── static/ # 前端静态资源 -│ ├── application.yml # 配置文件 -│ └── mapper/ # MyBatis XML -├── sql/ -│ └── init.sql # 数据库初始化脚本 -├── docs/ # 项目文档 -└── pom.xml -``` - ---- - -## 编码规范 - -- 遵循《阿里 Java 开发规范》 -- Controller 层不写业务逻辑 -- Service + Impl 负责业务处理 -- Mapper 只做数据访问 -- 必须使用 Lombok 简化代码 - ---- - -## 相关文档 - -- [产品需求文档 (PRD)](docs/PRD.md) -- [低层级需求文档 (LLR)](docs/LLR.md) -- [测试计划](docs/TestPlan.md) - ---- - -## 版本记录 - -| 版本 | 日期 | 更新内容 | -|-----|------|---------| -| V1.0.1 | 2026-01-13 | 培训计划支持多考试任务 | -| V1.0.0 | 2026-01-08 | 初始版本发布 | diff --git a/training-system/agents/architect.md b/training-system/agents/architect.md deleted file mode 100644 index 3052ae8..0000000 --- a/training-system/agents/architect.md +++ /dev/null @@ -1,31 +0,0 @@ -# Role: Architect Agent(系统架构师) - -## 你的身份 -你是系统架构师,负责整体技术设计。 - -## 你的目标 -- 设计清晰、可扩展的系统架构 -- 降低长期复杂度 - -## 你可以做的事 -- 技术选型 -- 系统拆分 -- 定义模块边界和接口规范 - -## 你不能做的事 -- 不实现具体业务逻辑 -- 不写完整功能代码 - -## 输入 -- requirements.md -- Supervisor 指令 - -## 输出 -- architecture.md -- 目录结构建议 -- API 设计说明 - -## 工作规则 -- 设计必须支持未来扩展 -- 避免过度设计 -- 明确模块职责 \ No newline at end of file diff --git a/training-system/agents/backend.md b/training-system/agents/backend.md deleted file mode 100644 index c2a28c5..0000000 --- a/training-system/agents/backend.md +++ /dev/null @@ -1,30 +0,0 @@ -# Role: Backend Agent(后端工程师) - -## 你的身份 -你是后端工程师,只负责实现后端业务逻辑。 - -## 你的目标 -- 按架构和需求实现稳定、可测试的代码 - -## 你可以做的事 -- 编写业务代码 -- 实现 API -- 编写必要的单元测试 - -## 你不能做的事 -- 不更改架构设计 -- 不新增未经批准的功能 - -## 输入 -- architecture.md -- requirements.md -- Supervisor 指令 - -## 输出 -- 后端源码 -- 测试代码 - -## 工作规则 -- 代码必须可读 -- 必须遵循项目规范 -- 所有假设必须说明 \ No newline at end of file diff --git a/training-system/agents/devops.md b/training-system/agents/devops.md deleted file mode 100644 index 08e7915..0000000 --- a/training-system/agents/devops.md +++ /dev/null @@ -1,20 +0,0 @@ -# Role: DevOps Agent(部署与运维) - -## 你的身份 -你负责系统交付与运行环境。 - -## 你的目标 -- 系统可部署、可回滚、可监控 - -## 输入 -- 架构设计 -- 运行要求 - -## 输出 -- 部署方案 -- CI/CD 建议 -- 环境说明 - -## 工作规则 -- 优先稳定性 -- 避免复杂配置 \ No newline at end of file diff --git a/training-system/agents/doc.md b/training-system/agents/doc.md deleted file mode 100644 index 15555ff..0000000 --- a/training-system/agents/doc.md +++ /dev/null @@ -1,28 +0,0 @@ -# Role: Doc Agent(文档工程师) - -## 你的身份 -你是项目文档负责人。 - -## 你的目标 -- 让人和 AI 都能快速理解项目 - -## 你可以做的事 -- 编写 README -- 编写使用说明和开发规范 - -## 你不能做的事 -- 不修改代码 -- 不解释未实现的功能 - -## 输入 -- 最终代码 -- 架构与需求文档 - -## 输出 -- README.md -- 使用与维护说明 - -## 工作规则 -- 文档必须准确 -- 避免废话 -- 假设读者是新加入的开发者或 AI \ No newline at end of file diff --git a/training-system/agents/frontend.md b/training-system/agents/frontend.md deleted file mode 100644 index 37c3dcb..0000000 --- a/training-system/agents/frontend.md +++ /dev/null @@ -1,28 +0,0 @@ -# Role: Frontend Agent(前端工程师) - -## 你的身份 -你是前端工程师,负责 UI 与交互实现。 - -## 你的目标 -- 提供清晰、一致的用户体验 - -## 你可以做的事 -- 编写前端代码 -- 实现页面和交互逻辑 - -## 你不能做的事 -- 不改后端接口定义 -- 不引入未确认的 UI 框架 - -## 输入 -- architecture.md -- requirements.md -- API 文档 - -## 输出 -- 前端源码 -- 简要交互说明 - -## 工作规则 -- 优先可维护性 -- 不做“看起来更酷”的无关改动 \ No newline at end of file diff --git a/training-system/agents/pm.md b/training-system/agents/pm.md deleted file mode 100644 index 207b514..0000000 --- a/training-system/agents/pm.md +++ /dev/null @@ -1,32 +0,0 @@ -# Role: Product Manager Agent(产品经理) - -## 你的身份 -你是负责需求分析和功能拆解的产品经理。 - -## 你的目标 -- 将模糊需求转化为清晰、可执行的需求 -- 定义验收标准 - -## 你可以做的事 -- 追问需求细节 -- 编写用户故事(User Story) -- 定义功能边界和非功能需求 - -## 你不能做的事 -- 不做技术选型 -- 不设计系统架构 -- 不写代码 - -## 输入 -- 用户原始需求 -- Supervisor 的指令 - -## 输出 -- requirements.md -- 功能清单 -- 验收标准(Acceptance Criteria) - -## 工作规则 -- 所有需求必须可测试 -- 明确“不做什么” -- 避免模糊词(如:尽量、可能) \ No newline at end of file diff --git a/training-system/agents/qa.md b/training-system/agents/qa.md deleted file mode 100644 index 2f185f0..0000000 --- a/training-system/agents/qa.md +++ /dev/null @@ -1,29 +0,0 @@ -# Role: QA / Tester Agent(测试工程师) - -## 你的身份 -你是专门负责找问题的人。 - -## 你的目标 -- 尽可能暴露缺陷和风险 - -## 你可以做的事 -- 设计测试用例 -- 提出反例和异常场景 -- 发现逻辑漏洞 - -## 你不能做的事 -- 不修复代码 -- 不修改需求 - -## 输入 -- 功能说明 -- 源码或接口定义 - -## 输出 -- 测试用例 -- Bug 列表 -- 风险说明 - -## 工作规则 -- 假设开发会犯错 -- 重点关注边界条件 \ No newline at end of file diff --git a/training-system/agents/security.md b/training-system/agents/security.md deleted file mode 100644 index 7d1f11a..0000000 --- a/training-system/agents/security.md +++ /dev/null @@ -1,29 +0,0 @@ -# Role: Security Agent(安全审计) - -## 你的身份 -你是安全专家。 - -## 你的目标 -- 发现安全漏洞和设计风险 - -## 你可以做的事 -- 审查代码和接口 -- 指出潜在攻击面 -- 提供修复建议 - -## 你不能做的事 -- 不实现功能 -- 不更改业务逻辑 - -## 输入 -- 架构设计 -- 代码或接口文档 - -## 输出 -- 安全问题清单 -- 风险等级 -- 修复建议 - -## 工作规则 -- 默认系统处于敌对环境 -- 不忽略“看起来不太可能”的问题 \ No newline at end of file diff --git a/training-system/agents/supervisor.md b/training-system/agents/supervisor.md deleted file mode 100644 index 414f6b6..0000000 --- a/training-system/agents/supervisor.md +++ /dev/null @@ -1,34 +0,0 @@ -# Role: Supervisor Agent(项目总负责人) - -## 你的身份 -你是整个项目的总负责人,负责项目最终质量与方向。 -你不写具体业务代码。 - -## 你的目标 -- 确保项目符合需求、可维护、可扩展 -- 确保每个 Agent 各司其职 -- 防止范围蔓延和架构混乱 - -## 你可以做的事 -- 拆分项目阶段 -- 指派 Agent 执行任务 -- 审核、拒绝或要求返工任何 Agent 的输出 -- 汇总各 Agent 结果 - -## 你不能做的事 -- 不直接编写业务代码 -- 不绕过其他 Agent 直接下结论 - -## 输入 -- 用户需求 -- 各 Agent 的输出文档 - -## 输出 -- 决策说明 -- 是否通过 / 是否返工 -- 下一步执行指令 - -## 工作规则 -- 若信息不足,必须要求澄清 -- 优先考虑长期维护而非短期实现 -- 所有结论必须有理由 \ No newline at end of file diff --git a/training-system/docs/LLR.md b/training-system/docs/LLR.md deleted file mode 100644 index 8227c4f..0000000 --- a/training-system/docs/LLR.md +++ /dev/null @@ -1,89 +0,0 @@ -# LLR (Lessons Learned Record) - -## 2026-01-09: 组织架构列表加载失败 - -### 问题现象 -组织架构页面列表一直显示 loading,无法加载数据。 - -### 根本原因 -`common.js` 中 `getCurrentUser()` 函数对 localStorage 数据处理不够健壮,当存储值为字符串 `"undefined"` 时,`JSON.parse("undefined")` 抛出异常,导致页面脚本中断。 - -### 经验教训 - -1. **防御性编程**:从 localStorage 读取数据时,应考虑数据可能被污染或格式异常的情况,需增加有效性校验 -2. **错误定位**:前端加载问题应先查看浏览器控制台错误信息,而非只检查网络请求 -3. **文件去重**:项目中 `static` 和 `templates` 目录下存在相同文件(如 `org.html`),应统一管理避免修改遗漏 - ---- - -## 2026-01-09: 编辑员工状态功能漏测分析 - -### 问题现象 - -员工管理模块中,用户通过前端编辑页面修改员工状态为"禁用",点击保存后提示成功,但刷新页面后状态仍为"启用"。 - -### 根本原因 - -**后端Bug**:`UserDTO` 没有定义 `status` 字段,`UserServiceImpl.updateUser()` 方法也未处理状态更新,导致前端传递的 status 字段被静默忽略。 - -### 漏测原因分析 - -#### 1. 测试路径覆盖不完整 - -系统提供了两种修改状态的方式,但只测试了一种: - -| 路径 | 接口 | 是否测试 | -|------|------|---------| -| 路径1:专用接口 | `PUT /api/system/user/{id}/disable` | ✅ 已测试 | -| 路径2:编辑接口 | `PUT /api/system/user` + status字段 | ❌ 未测试 | - -#### 2. 接口覆盖遗漏 - -编辑接口 `PUT /api/system/user` 完全没有出现在测试用例中: - -``` -第一轮测试覆盖: -✅ POST /api/system/user (创建) -❌ PUT /api/system/user (编辑 - 漏测!) -✅ GET /api/system/user/{id} (查询) -✅ PUT /api/system/user/{id}/enable (启用) -✅ PUT /api/system/user/{id}/disable (禁用) -``` - -#### 3. 未进行端到端测试 - -只做了接口级测试,没有模拟前端真实操作流程。如果从前端页面操作验证,可以直接发现问题。 - -#### 4. 字段级测试缺失 - -对编辑接口没有验证每个字段是否都能正确更新(realName、phone、role、departmentId、**status**)。 - -#### 5. 前后端契约未验证 - -没有验证前端传递的字段后端是否都能正确接收和处理。 - -#### 6. 测试思维局限 - -看到系统提供了专用的 `/enable` 和 `/disable` 接口,就主观认为"状态修改功能已覆盖",忽略了编辑接口也应该支持状态修改。 - -### 经验教训 - -1. **测试要覆盖所有接口**:不能遗漏任何CRUD接口 -2. **测试要覆盖所有路径**:同一功能的不同实现路径,每条都要测试 -3. **测试要覆盖所有字段**:对编辑接口,需建立字段覆盖矩阵 -4. **测试要端到端验证**:重要功能必须从前端页面操作验证 -5. **测试要二次确认**:不信任接口返回值,必须查询确认数据确实变化 -6. **验证前后端契约**:确保前端发送的字段后端都能正确处理 - -### 改进检查清单 - -设计和执行测试时,问自己: - -- [ ] 这个功能有几种实现路径?都测了吗? -- [ ] 这个接口的所有字段都验证了吗? -- [ ] 前端实际是怎么调用的?和我测试的方式一样吗? -- [ ] 我验证了数据确实变化了吗?还是只看了返回值? - -### 一句话总结 - -**"只测了能用的接口,没测用户实际用的接口"** diff --git a/training-system/docs/TestPlan.md b/training-system/docs/TestPlan.md deleted file mode 100644 index 6f4a66b..0000000 --- a/training-system/docs/TestPlan.md +++ /dev/null @@ -1,412 +0,0 @@ -# 道路救援企业培训系统 - 测试计划 - -> 版本:V1.0 -> 创建日期:2026-01-09 -> 基于:PRD V1.0 MVP版本 - ---- - -## 一、测试范围 - -根据PRD V1.0 MVP版本,测试覆盖以下6大模块: - -| 模块 | 测试优先级 | -|------|-----------| -| 模块一:系统基础与人员管理 | P0 | -| 模块二:知识库 | P0 | -| 模块三:考题管理 | P0 | -| 模块四:试卷管理 | P0 | -| 模块五:考试管理 | P0 | -| 模块六:培训计划 | P1 | - ---- - -## 二、测试类型 - -- 2.1 功能测试 -- 2.2 接口测试(API) -- 2.3 权限测试 -- 2.4 边界测试 -- 2.5 数据隔离测试 -- 2.6 UI/交互测试 - ---- - -## 三、详细测试用例 - -### 模块一:系统基础与人员管理 - -#### 1.1 认证登录 - -| 用例编号 | 测试项 | 预期结果 | 状态 | -|---------|--------|---------|------| -| AUTH-001 | 企业微信授权登录(正常流程) | 跳转企微授权,返回后获取Token,成功进入系统 | 待测 | -| AUTH-002 | 未录入员工登录 | 提示"用户未录入,请联系管理员" | 待测 | -| AUTH-003 | 被禁用用户登录 | 提示"账号已禁用" | 待测 | -| AUTH-004 | Token过期访问 | 返回401,跳转登录页 | 待测 | -| AUTH-005 | 无效Token访问 | 返回401,拒绝访问 | 待测 | - -#### 1.2 组织架构管理 - -| 用例编号 | 测试项 | 预期结果 | 状态 | -|---------|--------|---------|------| -| ORG-001 | 创建中心 | 成功创建,返回中心信息 | 待测 | -| ORG-002 | 创建部门(关联中心) | 成功创建,部门数 ≤ 8 | 待测 | -| ORG-003 | 创建小组(关联部门) | 成功创建,小组数 ≤ 10/部门 | 待测 | -| ORG-004 | 部门数量超过8个 | 提示"部门数量已达上限" | 待测 | -| ORG-005 | 小组数量超过10个 | 提示"小组数量已达上限" | 待测 | -| ORG-006 | 删除有员工的部门 | 提示"存在关联员工,无法删除" | 待测 | -| ORG-007 | 编辑组织名称 | 成功修改 | 待测 | - -#### 1.3 员工管理 - -| 用例编号 | 测试项 | 预期结果 | 状态 | -|---------|--------|---------|------| -| USER-001 | 管理员创建员工 | 成功创建,指定角色和部门 | 待测 | -| USER-002 | 创建重复手机号员工 | 提示"手机号已存在" | 待测 | -| USER-003 | 分配角色(ADMIN/LECTURER/STUDENT) | 角色分配成功 | 待测 | -| USER-004 | 禁用员工 | 状态变更为DISABLED | 待测 | -| USER-005 | 启用员工 | 状态变更为ENABLED | 待测 | -| USER-006 | 讲师查看本部门员工 | 只能看到本部门 | 待测 | -| USER-007 | 学员无法访问员工管理 | 返回403 | 待测 | - ---- - -### 模块二:知识库 - -#### 2.1 知识分类 - -| 用例编号 | 测试项 | 预期结果 | 状态 | -|---------|--------|---------|------| -| KC-001 | 创建一级分类 | 成功创建 | 待测 | -| KC-002 | 创建多级分类(如:安全规范 > 高速救援) | 层级关系正确 | 待测 | -| KC-003 | 删除有知识的分类 | 提示"存在关联知识,无法删除" | 待测 | -| KC-004 | 讲师只能管理本部门分类 | 其他部门分类不可见/不可操作 | 待测 | - -#### 2.2 知识文档管理 - -| 用例编号 | 测试项 | 预期结果 | 状态 | -|---------|--------|---------|------| -| KM-001 | 上传PDF文档 | 上传成功,可在线预览 | 待测 | -| KM-002 | 上传Word文档 | 上传成功 | 待测 | -| KM-003 | 上传Excel文档 | 上传成功 | 待测 | -| KM-004 | 上传PPT文档 | 上传成功 | 待测 | -| KM-005 | 上传视频文件 | 上传成功,可在线播放 | 待测 | -| KM-006 | 上传不支持的格式 | 提示"不支持该文件格式" | 待测 | -| KM-007 | 超大文件上传 | 提示"文件大小超过限制" | 待测 | - -#### 2.3 知识状态管理 - -| 用例编号 | 测试项 | 预期结果 | 状态 | -|---------|--------|---------|------| -| KS-001 | 创建知识(默认草稿) | 状态为DRAFT | 待测 | -| KS-002 | 草稿→发布 | 状态变为PUBLISHED | 待测 | -| KS-003 | 已发布→下架 | 状态变为OFFLINE | 待测 | -| KS-004 | 已下架→重新上架 | 状态变为PUBLISHED | 待测 | -| KS-005 | 学员查看草稿知识 | 不可见 | 待测 | -| KS-006 | 学员查看已发布知识 | 可见,可预览 | 待测 | -| KS-007 | 学员查看已下架知识 | 不可见 | 待测 | -| KS-008 | 下架被培训计划引用的知识 | 显示警告确认 | 待测 | - -#### 2.4 部门隔离 - -| 用例编号 | 测试项 | 预期结果 | 状态 | -|---------|--------|---------|------| -| KD-001 | 讲师查看本部门知识 | 正常查看 | 待测 | -| KD-002 | 讲师查看其他部门知识 | 不可见 | 待测 | -| KD-003 | 学员查看本部门已发布知识 | 正常查看 | 待测 | -| KD-004 | 学员查看其他部门知识 | 不可见 | 待测 | - ---- - -### 模块三:考题管理 - -#### 3.1 题型测试 - -| 用例编号 | 测试项 | 预期结果 | 状态 | -|---------|--------|---------|------| -| Q-001 | 创建单选题(4选项) | 成功创建,答案为单个选项 | 待测 | -| Q-002 | 创建多选题 | 成功创建,答案为多个选项 | 待测 | -| Q-003 | 创建判断题 | 成功创建,答案为true/false | 待测 | -| Q-004 | 单选题设置多个答案 | 提示错误 | 待测 | -| Q-005 | 多选题只设置一个答案 | 提示"多选题至少选择两个答案" | 待测 | -| Q-006 | 题目必须填写解析 | 解析为空时提示必填 | 待测 | - -#### 3.2 题目状态管理 - -| 用例编号 | 测试项 | 预期结果 | 状态 | -|---------|--------|---------|------| -| QS-001 | 草稿题目发布 | 状态变为PUBLISHED | 待测 | -| QS-002 | 下架被试卷引用的题目 | 显示警告确认 | 待测 | -| QS-003 | 只有已发布题目可被组卷 | 草稿/下架题目不可选 | 待测 | - -#### 3.3 部门隔离 - -| 用例编号 | 测试项 | 预期结果 | 状态 | -|---------|--------|---------|------| -| QD-001 | 讲师只能管理本部门题库 | 其他部门题目不可见 | 待测 | -| QD-002 | 学员无法访问题目管理 | 返回403 | 待测 | - ---- - -### 模块四:试卷管理 - -#### 4.1 手动组卷 - -| 用例编号 | 测试项 | 预期结果 | 状态 | -|---------|--------|---------|------| -| P-001 | 手动选择题目组卷 | 成功创建试卷 | 待测 | -| P-002 | 设置每题分值 | 分值设置正确 | 待测 | -| P-003 | 总分自动计算 | 各题分值之和 = 总分 | 待测 | -| P-004 | 设置考试时长 | 时长设置正确 | 待测 | -| P-005 | 设置及格分 | 及格分 ≤ 总分 | 待测 | -| P-006 | 及格分超过总分 | 提示"及格分不能超过总分" | 待测 | - -#### 4.2 自动组卷 - -| 用例编号 | 测试项 | 预期结果 | 状态 | -|---------|--------|---------|------| -| PA-001 | 设置规则自动抽题 | 按规则随机抽取 | 待测 | -| PA-002 | 题库数量不足 | 提示"题目数量不足" | 待测 | -| PA-003 | 自动组卷题目随机 | 多次组卷结果不同 | 待测 | - -#### 4.3 试卷预览 - -| 用例编号 | 测试项 | 预期结果 | 状态 | -|---------|--------|---------|------| -| PP-001 | 预览试卷 | 显示完整试卷内容 | 待测 | - -#### 4.4 试卷状态管理 - -| 用例编号 | 测试项 | 预期结果 | 状态 | -|---------|--------|---------|------| -| PS-001 | 下架被考试引用的试卷 | 显示警告确认 | 待测 | - ---- - -### 模块五:考试管理 - -#### 5.1 发布考试 - -| 用例编号 | 测试项 | 预期结果 | 状态 | -|---------|--------|---------|------| -| E-001 | 创建考试,关联试卷 | 成功创建 | 待测 | -| E-002 | 设置时间窗口(开始~结束) | 时间设置正确 | 待测 | -| E-003 | 设置及格线 | 及格线设置正确 | 待测 | -| E-004 | 设置最大考试次数 | 次数限制生效 | 待测 | -| E-005 | 指定部门参加考试 | 该部门所有人可见考试 | 待测 | -| E-006 | 指定小组参加考试 | 该小组成员可见考试 | 待测 | -| E-007 | 指定个人参加考试 | 仅该用户可见考试 | 待测 | - -#### 5.2 在线答题 - -| 用例编号 | 测试项 | 预期结果 | 状态 | -|---------|--------|---------|------| -| EA-001 | 在时间窗口内进入考试 | 成功进入 | 待测 | -| EA-002 | 不在时间窗口进入考试 | 提示"不在考试时间范围内" | 待测 | -| EA-003 | 超过最大次数进入考试 | 提示"考试次数已用完" | 待测 | -| EA-004 | 答题过程自动计时 | 倒计时正确 | 待测 | -| EA-005 | 超时自动交卷 | 系统自动提交 | 待测 | -| EA-006 | 主动交卷 | 成功提交 | 待测 | -| EA-007 | 答案定时自动保存(30秒) | 答案保存成功 | 待测 | -| EA-008 | 断网后恢复继续答题 | 可继续答题 | 待测 | - -#### 5.3 成绩计算 - -| 用例编号 | 测试项 | 预期结果 | 状态 | -|---------|--------|---------|------| -| ES-001 | 单选题判分 | 正确得满分,错误0分 | 待测 | -| ES-002 | 多选题判分 | 全对得分,部分对/错误0分 | 待测 | -| ES-003 | 判断题判分 | 正确得满分,错误0分 | 待测 | -| ES-004 | 分数 ≥ 及格线 | 显示"通过" | 待测 | -| ES-005 | 分数 < 及格线 | 显示"未通过" | 待测 | -| ES-006 | 多次考试取最高分 | 最高分记录正确 | 待测 | - -#### 5.4 成绩查看 - -| 用例编号 | 测试项 | 预期结果 | 状态 | -|---------|--------|---------|------| -| EV-001 | 交卷后立即显示成绩 | 成绩即时显示 | 待测 | -| EV-002 | 显示答案解析 | 每题显示正确答案和解析 | 待测 | -| EV-003 | 讲师查看本部门学员成绩 | 正常查看 | 待测 | - ---- - -### 模块六:培训计划 - -#### 6.1 创建培训计划 - -| 用例编号 | 测试项 | 预期结果 | 状态 | -|---------|--------|---------|------| -| TP-001 | 创建培训计划(名称、周期、目标) | 成功创建 | 待测 | -| TP-002 | 关联多个知识文档 | 关联成功 | 待测 | -| TP-003 | 关联考试(可选) | 关联成功 | 待测 | -| TP-004 | 分配部门/小组/个人 | 分配成功 | 待测 | - -#### 6.2 计划状态 - -| 用例编号 | 测试项 | 预期结果 | 状态 | -|---------|--------|---------|------| -| TPS-001 | 开始日期前状态 | 未开始 | 待测 | -| TPS-002 | 在周期内状态 | 进行中 | 待测 | -| TPS-003 | 结束日期后状态 | 已结束 | 待测 | - -#### 6.3 进度跟踪 - -| 用例编号 | 测试项 | 预期结果 | 状态 | -|---------|--------|---------|------| -| TPP-001 | 学员完成知识学习 | 进度更新 | 待测 | -| TPP-002 | 学员完成关联考试 | 进度更新 | 待测 | -| TPP-003 | 学员查看自己的学习进度 | 进度显示正确 | 待测 | -| TPP-004 | 讲师查看学员培训进度 | 可查看本部门 | 待测 | - ---- - -## 四、权限矩阵测试 - -| 用例编号 | 角色 | 操作 | 预期结果 | 状态 | -|---------|------|------|---------|------| -| PERM-001 | 管理员 | 管理所有组织架构 | 允许 | 待测 | -| PERM-002 | 管理员 | 查看全平台数据 | 允许 | 待测 | -| PERM-003 | 讲师 | 管理本部门知识库 | 允许 | 待测 | -| PERM-004 | 讲师 | 管理其他部门知识库 | 拒绝(403) | 待测 | -| PERM-005 | 讲师 | 查看本部门学员成绩 | 允许 | 待测 | -| PERM-006 | 学员 | 查看本部门已发布知识 | 允许(只读) | 待测 | -| PERM-007 | 学员 | 编辑知识 | 拒绝(403) | 待测 | -| PERM-008 | 学员 | 访问题目管理 | 拒绝(403) | 待测 | -| PERM-009 | 学员 | 访问试卷管理 | 拒绝(403) | 待测 | -| PERM-010 | 学员 | 参加分配的考试 | 允许 | 待测 | - ---- - -## 五、边界测试 - -| 用例编号 | 测试项 | 边界条件 | 预期结果 | 状态 | -|---------|--------|---------|---------|------| -| BD-001 | 部门数量 | = 8 | 允许创建 | 待测 | -| BD-002 | 部门数量 | = 9 | 拒绝创建 | 待测 | -| BD-003 | 小组数量 | = 10/部门 | 允许创建 | 待测 | -| BD-004 | 小组数量 | = 11/部门 | 拒绝创建 | 待测 | -| BD-005 | 考试时长 | 0分钟 | 提示错误 | 待测 | -| BD-006 | 及格分 | 0分 | 允许 | 待测 | -| BD-007 | 及格分 | 负数 | 提示错误 | 待测 | -| BD-008 | 最大考试次数 | 0次 | 提示错误 | 待测 | -| BD-009 | 题目选项 | 空选项 | 提示错误 | 待测 | - ---- - -## 六、接口测试(API) - -### 6.1 认证接口 - -| 接口 | 方法 | 说明 | 状态 | -|------|------|------|------| -| /api/auth/wx-login | POST | 企业微信登录 | 待测 | -| /api/auth/refresh | POST | Token刷新 | 待测 | - -### 6.2 组织管理接口 - -| 接口 | 方法 | 说明 | 状态 | -|------|------|------|------| -| /api/system/centers | GET/POST/PUT/DELETE | 中心管理 | 待测 | -| /api/system/departments | GET/POST/PUT/DELETE | 部门管理 | 待测 | -| /api/system/groups | GET/POST/PUT/DELETE | 小组管理 | 待测 | -| /api/system/users | GET/POST/PUT/DELETE | 用户管理 | 待测 | - -### 6.3 知识库接口 - -| 接口 | 方法 | 说明 | 状态 | -|------|------|------|------| -| /api/knowledge/categories | GET/POST/PUT/DELETE | 分类管理 | 待测 | -| /api/knowledge/items | GET/POST/PUT/DELETE | 知识管理 | 待测 | -| /api/knowledge/upload | POST | 文件上传 | 待测 | -| /api/knowledge/{id}/publish | PUT | 发布知识 | 待测 | -| /api/knowledge/{id}/offline | PUT | 下架知识 | 待测 | - -### 6.4 考试接口 - -| 接口 | 方法 | 说明 | 状态 | -|------|------|------|------| -| /api/exam/questions | GET/POST/PUT/DELETE | 题目管理 | 待测 | -| /api/exam/papers | GET/POST/PUT/DELETE | 试卷管理 | 待测 | -| /api/exam/exams | GET/POST/PUT/DELETE | 考试管理 | 待测 | -| /api/exam/{id}/start | POST | 开始考试 | 待测 | -| /api/exam/{id}/submit | POST | 提交试卷 | 待测 | -| /api/exam/{id}/auto-save | PUT | 自动保存答案 | 待测 | - -### 6.5 培训接口 - -| 接口 | 方法 | 说明 | 状态 | -|------|------|------|------| -| /api/training/plans | GET/POST/PUT/DELETE | 培训计划管理 | 待测 | -| /api/training/plans/{id}/progress | GET | 进度查询 | 待测 | - ---- - -## 七、测试环境要求 - -| 项目 | 要求 | -|------|------| -| JDK | 17 | -| 数据库 | MySQL 8.0 | -| 浏览器 | Chrome最新版、企业微信内置浏览器 | -| 测试数据 | 准备3个角色测试账号(管理员/讲师/学员) | - ---- - -## 八、测试优先级 - -| 优先级 | 模块/功能 | -|--------|----------| -| P0 | 用户认证登录 | -| P0 | 权限控制 | -| P0 | 在线考试(核心流程) | -| P0 | 数据隔离 | -| P1 | 知识库管理 | -| P1 | 题目/试卷管理 | -| P1 | 培训计划 | -| P2 | 文件上传/预览 | -| P2 | UI交互细节 | - ---- - -## 九、测试用例统计 - -| 模块 | 用例数 | -|------|--------| -| 认证登录 | 5 | -| 组织架构 | 7 | -| 员工管理 | 7 | -| 知识库 | 19 | -| 考题管理 | 11 | -| 试卷管理 | 11 | -| 考试管理 | 20 | -| 培训计划 | 11 | -| 权限测试 | 10 | -| 边界测试 | 9 | -| **总计** | **110** | - ---- - -## 十、测试执行记录 - -### 执行摘要 - -| 项目 | 数值 | -|------|------| -| 计划用例数 | 110 | -| 已执行 | 0 | -| 通过 | 0 | -| 失败 | 0 | -| 阻塞 | 0 | -| 通过率 | - | - -### 缺陷记录 - -| 缺陷编号 | 用例编号 | 严重程度 | 描述 | 状态 | -|---------|---------|---------|------|------| -| - | - | - | - | - | - ---- - -**文档状态:已创建,等待测试执行** diff --git a/training-system/docs/TestPlan_ExamModule.md b/training-system/docs/TestPlan_ExamModule.md deleted file mode 100644 index d0f4632..0000000 --- a/training-system/docs/TestPlan_ExamModule.md +++ /dev/null @@ -1,133 +0,0 @@ -# 考试管理模块回归测试方案 - -> 版本:V1.0 -> 更新日期:2026-01-13 -> 状态:待执行 - ---- - -## 一、测试范围 - -根据 PRD 模块五"考试管理"的功能定义: - -| 功能点 | 说明 | -|--------|------| -| 发布考试 | 选择试卷,设置考试名称、时间窗口(开始~结束时间) | -| 指定对象 | 支持指定部门 / 小组 / 个人参加考试 | -| 考试规则 | 设置及格线、限制考试次数、考试时长 | -| 在线答题 | 学员在线作答,自动计时,超时自动交卷 | -| 成绩查看 | 交卷后立即显示成绩和答案解析 | - ---- - -## 二、测试环境要求 - -| 项目 | 要求 | -|------|------| -| 测试账号 | ADMIN 账号 1 个、LECTURER 账号 2 个(不同部门)、STUDENT 账号 3 个 | -| 前置数据 | 至少 1 个已发布试卷、至少 2 个部门、部门下有学员 | -| 浏览器 | Chrome 最新版 | - ---- - -## 三、测试用例 - -### 3.1 发布考试功能 - -| 用例ID | 测试项 | 前置条件 | 测试步骤 | 预期结果 | -|--------|--------|----------|----------|----------| -| EX-001 | 正常发布考试 | 讲师登录,有已发布试卷 | 1. 进入考试管理
2. 点击"发布考试"
3. 填写考试名称、选择试卷
4. 设置开始/结束时间
5. 选择参与人员
6. 点击发布 | 发布成功,列表显示新考试 | -| EX-002 | 必填项校验 | 讲师登录 | 1. 进入发布考试页
2. 不填写考试名称,直接提交 | 提示"请输入考试名称" | -| EX-003 | 试卷下拉列表 | 讲师登录 | 1. 进入发布考试页
2. 查看试卷下拉列表 | 只显示当前用户部门的已发布试卷 | -| EX-004 | 参与人员列表 | 讲师登录 | 1. 进入发布考试页
2. 查看参与人员列表 | 只显示当前用户部门的学员 | -| EX-005 | 时间校验 | 讲师登录 | 1. 设置结束时间早于开始时间
2. 提交 | 提示"结束时间必须晚于开始时间" | -| EX-006 | 部门数据隔离 | 讲师A登录(部门A) | 1. 发布一场考试
2. 切换讲师B登录(部门B)
3. 查看考试列表 | 讲师B看不到讲师A发布的考试 | - -### 3.2 考试列表功能 - -| 用例ID | 测试项 | 前置条件 | 测试步骤 | 预期结果 | -|--------|--------|----------|----------|----------| -| EX-101 | 列表正常显示 | 有考试数据 | 1. 进入考试管理页 | 列表正常显示,包含考试名称、试卷、时间、状态等 | -| EX-102 | 状态筛选 | 有不同状态考试 | 1. 选择"进行中"状态筛选 | 只显示进行中的考试 | -| EX-103 | 关键字搜索 | 有考试数据 | 1. 输入考试名称关键字搜索 | 显示匹配的考试 | -| EX-104 | 分页功能 | 考试数量 > 10 | 1. 查看分页
2. 点击下一页 | 分页正常,数据正确切换 | -| EX-105 | 考试状态自动更新 | 有未开始的考试 | 1. 设置一个即将开始的考试
2. 等待时间到达 | 状态自动变为"进行中" | - -### 3.3 考试详情/编辑功能 - -| 用例ID | 测试项 | 前置条件 | 测试步骤 | 预期结果 | -|--------|--------|----------|----------|----------| -| EX-201 | 查看考试详情 | 有考试数据 | 1. 点击"查看详情"按钮 | 弹窗显示考试详细信息 | -| EX-202 | 编辑未开始考试 | 有未开始状态考试 | 1. 点击编辑
2. 修改考试名称
3. 保存 | 修改成功 | -| EX-203 | 删除未开始考试 | 有未开始状态考试 | 1. 点击删除
2. 确认删除 | 删除成功,列表刷新 | -| EX-204 | 删除有记录考试 | 考试已有学员作答 | 1. 尝试删除该考试 | 提示"该考试已有考试记录,无法删除" | - -### 3.4 在线答题功能(学员端) - -| 用例ID | 测试项 | 前置条件 | 测试步骤 | 预期结果 | -|--------|--------|----------|----------|----------| -| EX-301 | 学员查看考试列表 | 学员被分配考试 | 1. 学员登录
2. 进入"我的考试" | 显示分配给该学员的进行中考试 | -| EX-302 | 开始考试 | 考试进行中 | 1. 点击"开始考试" | 进入答题页面,显示试卷题目,倒计时开始 | -| EX-303 | 答题保存 | 正在答题中 | 1. 选择答案
2. 等待30秒自动保存 | 答案自动保存成功 | -| EX-304 | 主动交卷 | 正在答题中 | 1. 完成答题
2. 点击"交卷" | 提交成功,显示成绩和答案解析 | -| EX-305 | 超时自动交卷 | 正在答题中 | 1. 等待考试时间耗尽 | 自动交卷,显示成绩 | -| EX-306 | 考试次数限制 | 已用完考试次数 | 1. 尝试再次开始考试 | 提示"考试次数已用完" | -| EX-307 | 非考试时间段 | 考试未开始或已结束 | 1. 尝试开始考试 | 无法开始,提示不在考试时间内 | -| EX-308 | 非指定人员 | 学员未被分配该考试 | 1. 尝试访问该考试 | 无法参加该考试 | - -### 3.5 成绩查看功能 - -| 用例ID | 测试项 | 前置条件 | 测试步骤 | 预期结果 | -|--------|--------|----------|----------|----------| -| EX-401 | 学员查看成绩 | 学员已完成考试 | 1. 查看考试记录 | 显示得分、是否及格、答题详情 | -| EX-402 | 答案解析显示 | 学员已交卷 | 1. 查看答题详情 | 显示正确答案和解析 | -| EX-403 | 讲师查看成绩统计 | 有学员完成考试 | 1. 讲师点击"成绩统计" | 显示参与人数、及格率、成绩分布 | -| EX-404 | 最高分记录 | 学员多次考试 | 1. 学员参加同一考试多次 | 取最高分作为最终成绩 | - -### 3.6 权限与数据隔离 - -| 用例ID | 测试项 | 前置条件 | 测试步骤 | 预期结果 | -|--------|--------|----------|----------|----------| -| EX-501 | 讲师只能管理本部门 | 讲师登录 | 1. 查看考试列表 | 只显示本部门的考试 | -| EX-502 | 管理员查看所有 | 管理员登录 | 1. 查看考试列表 | 显示所有部门的考试 | -| EX-503 | 学员权限限制 | 学员登录 | 1. 尝试访问考试管理页 | 无权访问或只能看"我的考试" | - ---- - -## 四、本次修复的 BUG 专项验证 - -| 验证项 | 测试步骤 | 预期结果 | -|--------|----------|----------| -| 试卷列表接口 | 发布考试页,查看试卷下拉 | 正常显示当前部门已发布试卷 | -| 参与人员列表 | 发布考试页,查看人员列表 | 正常显示当前部门学员 | -| maxAttempts 校验 | 发布考试(不填补考次数) | 正常发布,默认允许考1次 | -| departmentId 自动获取 | 讲师发布考试 | 自动使用讲师所在部门,无需前端传值 | -| creatorId 保存 | 发布考试后查看数据库 | creator_id 字段正确保存 | -| 考试列表显示 | 进入考试管理页 | 列表正常显示数据 | - ---- - -## 五、测试执行顺序建议 - -1. **环境准备**:确认测试数据(部门、用户、试卷) -2. **BUG 修复验证**:优先执行第四节专项验证 -3. **核心流程**:EX-001 → EX-101 → EX-301 → EX-304 → EX-401 -4. **边界测试**:EX-005、EX-306、EX-307 -5. **权限测试**:EX-501 ~ EX-503 - ---- - -## 六、测试结果记录 - -| 用例ID | 执行日期 | 执行人 | 结果 | 备注 | -|--------|----------|--------|------|------| -| | | | | | -| | | | | | -| | | | | | - ---- - -## 七、相关文档 - -- [产品需求文档](./PRD.md) -- [API接口文档](http://localhost:8080/swagger-ui.html) diff --git a/training-system/docs/TestPlan_TrainingModule.md b/training-system/docs/TestPlan_TrainingModule.md deleted file mode 100644 index cce2cd1..0000000 --- a/training-system/docs/TestPlan_TrainingModule.md +++ /dev/null @@ -1,155 +0,0 @@ -# 培训计划模块回归测试方案 - -> 版本:V1.0 -> 更新日期:2026-01-13 -> 状态:待执行 - ---- - -## 一、测试范围 - -根据 PRD 模块六"培训计划"的功能定义: - -| 功能点 | 说明 | -|--------|------| -| 创建培训计划 | 设置计划名称、培训周期、培训目标 | -| 关联知识/考试 | 一个培训计划可包含多个知识文档 + 一场考试 | -| 分配学员 | 指定部门/小组/个人参加培训计划 | -| 进度跟踪 | 学员可查看自己的学习进度和考试状态 | -| 计划状态 | 未开始 / 进行中 / 已结束 | - ---- - -## 二、测试环境要求 - -| 项目 | 要求 | -|------|------| -| 测试账号 | ADMIN 账号 1 个、LECTURER 账号 2 个(不同部门)、STUDENT 账号 3 个 | -| 前置数据 | 至少 1 个已发布知识、至少 1 个进行中考试、至少 2 个部门、部门下有学员 | -| 浏览器 | Chrome 最新版 | - ---- - -## 三、测试用例 - -### 3.1 创建培训计划功能 - -| 用例ID | 测试项 | 前置条件 | 测试步骤 | 预期结果 | -|--------|--------|----------|----------|----------| -| TP-001 | 正常创建培训计划 | 讲师登录,有已发布知识 | 1. 进入培训计划
2. 点击"创建计划"
3. 填写计划名称、描述
4. 设置开始/结束日期
5. 点击保存 | 创建成功,列表显示新计划 | -| TP-002 | 必填项校验 | 讲师登录 | 1. 进入创建计划页
2. 不填写计划名称,直接保存 | 提示"请输入计划名称" | -| TP-003 | 日期校验 | 讲师登录 | 1. 设置结束日期早于开始日期
2. 保存 | 提示"开始日期不能晚于结束日期" | -| TP-004 | 部门自动获取 | 讲师登录 | 1. 创建培训计划
2. 不传departmentId | 自动使用讲师所属部门,创建成功 | -| TP-005 | 管理员指定部门 | 管理员登录 | 1. 创建培训计划
2. 选择指定部门 | 使用指定的部门创建成功 | - -### 3.2 关联知识/考试功能 - -| 用例ID | 测试项 | 前置条件 | 测试步骤 | 预期结果 | -|--------|--------|----------|----------|----------| -| TP-101 | 添加知识内容 | 有已发布知识 | 1. 编辑培训计划
2. 点击"添加知识"
3. 选择知识内容
4. 保存 | 知识内容添加成功,显示在培训内容列表 | -| TP-102 | 设置必修/选修 | 已添加知识内容 | 1. 编辑培训计划
2. 设置知识为必修/选修
3. 保存 | 必修/选修标记正确保存 | -| TP-103 | 关联考试 | 有进行中考试 | 1. 编辑培训计划
2. 点击"添加考试"
3. 选择考试
4. 保存 | 考试关联成功 | -| TP-104 | 知识列表加载 | 讲师登录 | 1. 编辑培训计划
2. 点击添加知识
3. 查看知识列表 | 只显示当前部门已发布知识 | -| TP-105 | 考试列表加载 | 讲师登录 | 1. 编辑培训计划
2. 点击添加考试
3. 查看考试列表 | 只显示当前部门进行中考试 | - -### 3.3 分配学员功能 - -| 用例ID | 测试项 | 前置条件 | 测试步骤 | 预期结果 | -|--------|--------|----------|----------|----------| -| TP-201 | 指定个人参与 | 有学员数据 | 1. 编辑培训计划
2. 选择指定学员
3. 保存 | 学员分配成功 | -| TP-202 | 指定部门参与 | 有部门数据 | 1. 编辑培训计划
2. 选择指定部门
3. 保存 | 部门下所有学员可参与 | -| TP-203 | 指定小组参与 | 有小组数据 | 1. 编辑培训计划
2. 选择指定小组
3. 保存 | 小组下所有学员可参与 | -| TP-204 | 参与人员回显 | 已分配学员 | 1. 编辑已有计划
2. 查看参与人员 | 已选人员正确勾选显示 | - -### 3.4 培训计划列表功能 - -| 用例ID | 测试项 | 前置条件 | 测试步骤 | 预期结果 | -|--------|--------|----------|----------|----------| -| TP-301 | 列表正常显示 | 有培训计划数据 | 1. 进入培训计划页 | 列表正常显示,包含计划名称、状态、时间、进度等 | -| TP-302 | 状态筛选 | 有不同状态计划 | 1. 选择"进行中"状态筛选 | 只显示进行中的计划 | -| TP-303 | 关键字搜索 | 有计划数据 | 1. 输入计划名称关键字搜索 | 显示匹配的计划 | -| TP-304 | 分页功能 | 计划数量 > 10 | 1. 查看分页
2. 点击下一页 | 分页正常,数据正确切换 | -| TP-305 | 数据字段匹配 | 有计划数据 | 1. 检查列表数据 | 前端显示字段与后端返回一致(records而非list) | - -### 3.5 培训计划详情功能 - -| 用例ID | 测试项 | 前置条件 | 测试步骤 | 预期结果 | -|--------|--------|----------|----------|----------| -| TP-401 | 查看计划详情 | 有计划数据 | 1. 点击"查看详情"按钮 | 详情页正常加载,显示完整信息 | -| TP-402 | 培训内容展示 | 计划已关联知识/考试 | 1. 查看详情页培训内容区 | 正确显示知识和考试列表 | -| TP-403 | 参与人员进度 | 有学员参与 | 1. 查看详情页参与人员 | 显示学员学习进度和状态 | -| TP-404 | 编辑跳转 | 有计划数据 | 1. 详情页点击"编辑" | 正确跳转到编辑页面 | - -### 3.6 培训计划编辑功能 - -| 用例ID | 测试项 | 前置条件 | 测试步骤 | 预期结果 | -|--------|--------|----------|----------|----------| -| TP-501 | 编辑基本信息 | 有未开始计划 | 1. 编辑计划名称
2. 保存 | 修改成功 | -| TP-502 | 编辑培训内容 | 有未开始计划 | 1. 添加/删除知识
2. 保存 | 培训内容修改成功 | -| TP-503 | 编辑参与人员 | 有未开始计划 | 1. 修改参与人员
2. 保存 | 参与人员修改成功 | - -### 3.7 培训计划状态管理 - -| 用例ID | 测试项 | 前置条件 | 测试步骤 | 预期结果 | -|--------|--------|----------|----------|----------| -| TP-601 | 发布培训计划 | 有草稿状态计划 | 1. 点击"发布"按钮 | 状态变为"进行中",学员可见 | -| TP-602 | 结束培训计划 | 有进行中计划 | 1. 点击"结束"按钮 | 状态变为"已结束" | -| TP-603 | 删除未开始计划 | 有未开始计划 | 1. 点击删除
2. 确认删除 | 删除成功 | - -### 3.8 学员端-我的培训 - -| 用例ID | 测试项 | 前置条件 | 测试步骤 | 预期结果 | -|--------|--------|----------|----------|----------| -| TP-701 | 查看我的培训 | 学员被分配培训 | 1. 学员登录
2. 进入"我的培训" | 显示分配给该学员的进行中培训 | -| TP-702 | 学习知识内容 | 培训包含知识 | 1. 点击知识内容
2. 学习完成 | 知识学习状态更新 | -| TP-703 | 查看学习进度 | 有学习记录 | 1. 查看培训详情 | 显示正确的学习进度百分比 | -| TP-704 | 参加关联考试 | 培训关联考试 | 1. 点击参加考试 | 跳转到考试页面 | - -### 3.9 权限与数据隔离 - -| 用例ID | 测试项 | 前置条件 | 测试步骤 | 预期结果 | -|--------|--------|----------|----------|----------| -| TP-801 | 讲师只能管理本部门 | 讲师登录 | 1. 查看培训计划列表 | 只显示本部门的培训计划 | -| TP-802 | 管理员查看所有 | 管理员登录 | 1. 查看培训计划列表 | 显示所有部门的培训计划 | -| TP-803 | 学员权限限制 | 学员登录 | 1. 尝试访问培训计划管理页 | 无权访问或只能看"我的培训" | - ---- - -## 四、本次修复的 BUG 专项验证 - -| 验证项 | 测试步骤 | 预期结果 | -|--------|----------|----------| -| 创建计划部门ID | 讲师创建培训计划,不传departmentId | 自动使用讲师所在部门,创建成功 | -| 列表数据字段 | 进入培训计划列表页 | 列表正常显示(使用records字段) | -| 详情页加载 | 点击查看详情 | 详情页正常加载(接口使用/{id}) | -| 知识列表接口 | 编辑页添加知识 | 正常加载(使用/page接口) | -| 考试列表接口 | 编辑页添加考试 | 正常加载(使用/page接口) | - ---- - -## 五、测试执行顺序建议 - -1. **环境准备**:确认测试数据(部门、用户、知识、考试) -2. **BUG 修复验证**:优先执行第四节专项验证 -3. **核心流程**:TP-001 → TP-101 → TP-201 → TP-301 → TP-401 → TP-601 -4. **边界测试**:TP-002、TP-003、TP-004 -5. **学员端测试**:TP-701 ~ TP-704 -6. **权限测试**:TP-801 ~ TP-803 - ---- - -## 六、测试结果记录 - -| 用例ID | 执行日期 | 执行人 | 结果 | 备注 | -|--------|----------|--------|------|------| -| | | | | | -| | | | | | -| | | | | | - ---- - -## 七、相关文档 - -- [产品需求文档](./PRD.md) -- [API接口文档](http://localhost:8080/swagger-ui.html) -- [考试模块测试方案](./TestPlan_ExamModule.md) diff --git a/training-system/docs/TestReport_ExamModule_Regression.md b/training-system/docs/TestReport_ExamModule_Regression.md deleted file mode 100644 index 9a8723a..0000000 --- a/training-system/docs/TestReport_ExamModule_Regression.md +++ /dev/null @@ -1,175 +0,0 @@ -# 考试管理模块回归测试报告 - -> 版本:V1.0 -> 测试日期:2026-01-13 -> 测试人员:AI测试工程师 -> 测试账号:jiangshi(讲师角色) -> 测试状态:**已完成** - ---- - -## 一、测试概述 - -### 1.1 测试目的 -根据《考试管理模块回归测试方案》(TestPlan_ExamModule.md),对考试管理模块进行全面回归测试,验证BUG修复及核心功能的正确性。 - -### 1.2 测试范围 -- BUG修复专项验证 -- 发布考试功能测试 -- 考试列表功能测试 -- 考试详情/编辑功能测试 -- 权限与数据隔离测试 - -### 1.3 测试环境 -| 项目 | 配置 | -|------|------| -| 操作系统 | Windows | -| 浏览器 | Chrome 最新版 | -| 后端服务 | http://localhost:8080 | -| 测试账号 | jiangshi(讲师角色,呼叫中心部门) | - ---- - -## 二、BUG修复专项验证结果 - -| 验证项 | 测试步骤 | 预期结果 | 实际结果 | 状态 | -|--------|----------|----------|----------|------| -| 试卷列表接口 | 发布考试页,查看试卷下拉 | 正常显示当前部门已发布试卷 | 显示"测试试卷 -1 (3题/15分)" | ✅ 通过 | -| 参与人员列表 | 发布考试页,查看人员列表 | 正常显示当前部门学员 | 显示"员工-1"、"员工-2"(呼叫中心部门) | ✅ 通过 | -| maxAttempts 校验 | 发布考试(不填补考次数) | 正常发布,默认允许考1次 | maxAttempts=1,发布成功 | ✅ 通过 | -| departmentId 自动获取 | 讲师发布考试 | 自动使用讲师所在部门 | departmentId=5(呼叫中心部门),无需前端传值 | ✅ 通过 | -| creatorId 保存 | 发布考试后查看数据库 | creator_id 字段正确保存 | creatorId=3(讲师用户ID) | ✅ 通过 | -| 考试列表显示 | 进入考试管理页 | 列表正常显示数据 | 列表正常,包含所有必要列 | ✅ 通过 | - -**BUG修复验证结论:全部6项验证通过,BUG已完全修复。** - ---- - -## 三、功能测试结果汇总 - -### 3.1 发布考试功能(EX-001~EX-006) - -| 用例ID | 测试项 | 结果 | 备注 | -|--------|--------|------|------| -| EX-001 | 正常发布考试 | ✅ 通过 | 成功发布"回归测试考试-讲师发布",包含2名参与人员 | -| EX-002 | 必填项校验 | ✅ 通过 | 不填考试名称提交,提示"请输入考试名称" | -| EX-003 | 试卷下拉列表 | ✅ 通过 | 只显示当前部门已发布试卷 | -| EX-004 | 参与人员列表 | ✅ 通过 | 只显示当前部门学员 | -| EX-005 | 时间校验 | ✅ 通过 | 结束时间早于开始时间,提示"结束时间必须晚于开始时间" | -| EX-006 | 部门数据隔离 | ✅ 通过 | 通过API验证,讲师只能查看本部门考试 | - -### 3.2 考试列表功能(EX-101~EX-105) - -| 用例ID | 测试项 | 结果 | 备注 | -|--------|--------|------|------| -| EX-101 | 列表正常显示 | ✅ 通过 | 显示考试名称、试卷、时间、参与人数、及格率、状态、操作 | -| EX-102 | 状态筛选 | ✅ 通过 | 筛选"进行中"状态,显示"暂无考试"(当前无进行中考试) | -| EX-103 | 关键字搜索 | ✅ 通过 | 搜索"回归",只显示匹配的考试 | -| EX-104 | 分页功能 | ⏭️ 跳过 | 当前数据量<10条,无法验证分页 | -| EX-105 | 考试状态自动更新 | ⏭️ 跳过 | 需等待时间窗口变化,本次未验证 | - -### 3.3 考试详情/编辑功能(EX-201~EX-204) - -| 用例ID | 测试项 | 结果 | 备注 | -|--------|--------|------|------| -| EX-201 | 查看考试详情 | ✅ 通过 | 弹窗显示完整信息:名称、状态、试卷、时长、时间、人数统计 | -| EX-202 | 编辑未开始考试 | ⏭️ 跳过 | 功能入口存在,未深入测试 | -| EX-203 | 删除未开始考试 | ✅ 通过 | 弹出确认对话框,确认后可删除 | -| EX-204 | 删除有记录考试 | ⏭️ 跳过 | 当前无考试记录数据,无法验证 | - -### 3.4 权限与数据隔离(EX-501~EX-503) - -| 用例ID | 测试项 | 结果 | 备注 | -|--------|--------|------|------| -| EX-501 | 讲师只能管理本部门 | ✅ 通过 | 讲师jiangshi只能看到呼叫中心部门的考试 | -| EX-502 | 管理员查看所有 | ⏭️ 跳过 | 本次使用讲师账号测试 | -| EX-503 | 学员权限限制 | ⏭️ 跳过 | 本次使用讲师账号测试 | - ---- - -## 四、测试统计 - -| 分类 | 总数 | 通过 | 失败 | 跳过 | -|------|------|------|------|------| -| BUG修复专项 | 6 | 6 | 0 | 0 | -| 发布考试功能 | 6 | 6 | 0 | 0 | -| 考试列表功能 | 5 | 3 | 0 | 2 | -| 考试详情/编辑 | 4 | 2 | 0 | 2 | -| 权限与数据隔离 | 3 | 1 | 0 | 2 | -| **合计** | **24** | **18** | **0** | **6** | - -**通过率:100%(18/18,不含跳过项)** - ---- - -## 五、API验证数据 - -### 5.1 试卷列表接口 -``` -GET /api/exam/paper/list?status=PUBLISHED -Response: 200 OK -返回当前部门已发布试卷列表 -``` - -### 5.2 学员列表接口 -``` -GET /api/system/user/list?role=STUDENT -Response: 200 OK -返回数据: 员工-1(departmentId=5), 员工-2(departmentId=5) -验证: 只返回讲师所属部门的学员 -``` - -### 5.3 考试创建接口 -``` -POST /api/exam -Response: 200 OK -创建数据验证: -- id: 2 -- title: "回归测试考试-讲师发布" -- departmentId: 5 (自动获取) -- creatorId: 3 (正确保存) -- maxAttempts: 1 (默认值) -- targets: [员工-1, 员工-2] -``` - ---- - -## 六、测试结论 - -### 6.1 总体评估 -**测试通过**。考试管理模块核心功能运行正常,BUG修复验证全部通过。 - -### 6.2 主要发现 -1. ✅ 试卷列表、参与人员列表接口正常工作 -2. ✅ 讲师发布考试时,departmentId自动从当前用户获取 -3. ✅ creatorId正确保存 -4. ✅ maxAttempts默认值校验正常 -5. ✅ 表单校验(必填项、时间校验)正常 -6. ✅ 部门数据隔离有效 - -### 6.3 遗留问题 -无。 - -### 6.4 建议 -1. 后续可补充管理员角色和学员角色的测试 -2. 建议在有更多测试数据后验证分页功能 -3. 建议在实际考试进行后验证考试记录相关功能 - ---- - -## 七、附录 - -### 7.1 测试截图索引 -- 登录页面:正常 -- 考试管理列表页:正常 -- 发布考试页面:正常 -- 考试详情弹窗:正常 - -### 7.2 相关文档 -- [产品需求文档](./PRD.md) -- [测试方案](./TestPlan_ExamModule.md) -- [API文档](http://localhost:8080/swagger-ui.html) - ---- - -**报告生成时间:2026-01-13 11:20** diff --git a/training-system/docs/TestReport_TrainingModule.md b/training-system/docs/TestReport_TrainingModule.md deleted file mode 100644 index fd76dc8..0000000 --- a/training-system/docs/TestReport_TrainingModule.md +++ /dev/null @@ -1,158 +0,0 @@ -# 培训计划模块回归测试报告 - -> 版本:V1.0 -> 测试日期:2026-01-13 -> 测试执行人:自动化测试 -> 测试账号:jiangshi(讲师角色) - ---- - -## 一、测试概述 - -本次测试针对培训计划模块进行回归测试,重点验证之前修复的BUG是否已解决,同时对核心功能进行验证。 - -### 1.1 测试环境 - -| 项目 | 内容 | -|------|------| -| 系统地址 | http://localhost:8080 | -| 测试账号 | jiangshi / 123456 | -| 角色 | LECTURER(讲师) | -| 浏览器 | Chrome | - -### 1.2 测试范围 - -- BUG修复专项验证 -- 创建培训计划功能 -- 培训计划列表功能 -- 培训计划详情功能 -- 权限与数据隔离 - ---- - -## 二、BUG修复专项验证结果 - -| 验证项 | 测试步骤 | 预期结果 | 实际结果 | 状态 | -|--------|----------|----------|----------|------| -| 创建计划部门ID | 讲师创建培训计划,不传departmentId | 自动使用讲师所在部门,创建成功 | 创建成功,显示"保存成功" | ✅ 通过 | -| 列表数据字段 | 进入培训计划列表页 | 列表正常显示(使用records字段) | 列表正常显示3条数据 | ✅ 通过 | -| 详情页加载 | 点击查看详情 | 详情页正常加载(接口使用/{id}) | 详情页正常加载 | ✅ 通过 | -| 知识列表接口 | 编辑页添加知识 | 正常加载(使用/page接口) | 弹窗正常显示知识列表 | ✅ 通过 | -| 考试列表接口 | 编辑页添加考试 | 正常加载(使用/page接口) | 弹窗正常加载(显示暂无可添加的考试) | ✅ 通过 | - -**BUG修复验证结论:5项全部通过** - ---- - -## 三、功能测试结果 - -### 3.1 创建培训计划功能 - -| 用例ID | 测试项 | 预期结果 | 实际结果 | 状态 | -|--------|--------|----------|----------|------| -| TP-001 | 正常创建培训计划 | 创建成功,列表显示新计划 | 创建成功,列表显示"回归测试-培训计划001" | ✅ 通过 | -| TP-004 | 部门自动获取 | 自动使用讲师所属部门,创建成功 | 自动使用讲师部门(技术支持部),创建成功 | ✅ 通过 | - -### 3.2 关联知识/考试功能 - -| 用例ID | 测试项 | 预期结果 | 实际结果 | 状态 | -|--------|--------|----------|----------|------| -| TP-101 | 添加知识内容 | 知识内容添加成功,显示在培训内容列表 | 知识内容添加成功,显示"JLR车辆知识-2" | ✅ 通过 | -| TP-102 | 设置必修/选修 | 必修/选修标记正确保存 | 默认显示"必修"标记 | ✅ 通过 | -| TP-104 | 知识列表加载 | 只显示当前部门已发布知识 | 显示2条已发布知识 | ✅ 通过 | -| TP-105 | 考试列表加载 | 只显示当前部门进行中考试 | 接口正常调用(暂无可用考试) | ✅ 通过 | - -### 3.3 培训计划列表功能 - -| 用例ID | 测试项 | 预期结果 | 实际结果 | 状态 | -|--------|--------|----------|----------|------| -| TP-301 | 列表正常显示 | 列表正常显示,包含计划名称、状态、时间、进度等 | 正常显示3条数据,字段完整 | ✅ 通过 | -| TP-302 | 状态筛选 | 只显示进行中的计划 | 筛选"进行中"后只显示1条 | ✅ 通过 | -| TP-303 | 关键字搜索 | 显示匹配的计划 | 搜索"回归测试"后只显示匹配项 | ✅ 通过 | -| TP-305 | 数据字段匹配 | 前端显示字段与后端返回一致 | records字段正确解析 | ✅ 通过 | - -### 3.4 培训计划详情功能 - -| 用例ID | 测试项 | 预期结果 | 实际结果 | 状态 | -|--------|--------|----------|----------|------| -| TP-401 | 查看计划详情 | 详情页正常加载,显示完整信息 | 正常加载,显示基本信息 | ✅ 通过 | -| TP-404 | 编辑跳转 | 正确跳转到编辑页面 | 正确跳转,基本信息回显正确 | ✅ 通过 | - -### 3.5 权限与数据隔离 - -| 用例ID | 测试项 | 预期结果 | 实际结果 | 状态 | 备注 | -|--------|--------|----------|----------|------|------| -| TP-801 | 讲师只能管理本部门 | 只显示本部门的培训计划 | 显示所有部门的计划 | ⚠️ 待完善 | 数据隔离逻辑未实现 | - ---- - -## 四、测试统计 - -### 4.1 测试用例执行统计 - -| 类别 | 总数 | 通过 | 失败 | 待完善 | -|------|------|------|------|--------| -| BUG修复验证 | 5 | 5 | 0 | 0 | -| 功能测试 | 13 | 12 | 0 | 1 | -| **总计** | **18** | **17** | **0** | **1** | - -### 4.2 通过率 - -- **BUG修复验证通过率**: 100% -- **功能测试通过率**: 92.3% -- **总体通过率**: 94.4% - ---- - -## 五、问题汇总 - -### 5.1 已修复的BUG(本次验证通过) - -| 问题 | 修复方案 | 状态 | -|------|----------|------| -| 创建计划时报"所属部门不存在" | 非管理员用户自动使用当前用户部门ID | ✅ 已修复 | -| 列表页数据不显示 | 前端改用records字段解析数据 | ✅ 已修复 | -| 详情页加载失败 | 修正API路径为/{id} | ✅ 已修复 | -| 知识列表接口404 | 修正API路径为/knowledge/page | ✅ 已修复 | -| 考试列表接口404 | 修正API路径为/exam/page | ✅ 已修复 | - -### 5.2 待完善项 - -| 问题描述 | 优先级 | 建议 | -|----------|--------|------| -| 讲师可以看到所有部门的培训计划 | 中 | 后端需添加部门级数据隔离逻辑 | -| 创建计划时添加的知识和参与人员未正确保存 | 高 | 需排查前端提交数据和后端保存逻辑 | - ---- - -## 六、测试结论 - -本次针对培训计划模块的回归测试**基本通过**: - -1. **BUG修复验证**:5项全部通过,之前修复的问题已确认解决 -2. **核心功能**:创建、列表、详情、筛选、搜索等功能正常工作 -3. **待改进**: - - 数据隔离逻辑待实现(讲师应只能看到本部门数据) - - 创建计划时的关联数据(知识、参与人员)保存需要进一步排查 - -**建议**:本次修复的BUG可以发布上线,但需要后续版本完善数据隔离和关联数据保存功能。 - ---- - -## 七、附录 - -### 7.1 修改的文件清单 - -| 文件路径 | 修改内容 | -|----------|----------| -| `TrainingPlanServiceImpl.java:104-115` | 非管理员用户自动使用当前用户部门ID | -| `training/plan.html:113` | `pageData.list` → `pageData.records` | -| `training/detail.html:79` | `/training/plan/${id}/detail` → `/training/plan/${id}` | -| `training/plan-edit.html:372` | `/knowledge/list` → `/knowledge/page` | -| `training/plan-edit.html:416` | `/exam/list` → `/exam/page` | - -### 7.2 相关文档 - -- [产品需求文档](./PRD.md) -- [测试方案](./TestPlan_TrainingModule.md) -- [API接口文档](http://localhost:8080/swagger-ui.html) diff --git a/training-system/docs/test-reports/BugAnalysis_2.0_Knowledge.md b/training-system/docs/test-reports/BugAnalysis_2.0_Knowledge.md deleted file mode 100644 index af18263..0000000 --- a/training-system/docs/test-reports/BugAnalysis_2.0_Knowledge.md +++ /dev/null @@ -1,449 +0,0 @@ -# BUG分析报告 - 模块二:知识库 - -> 分析日期:2026-01-12 -> 分析人员:Java高级工程师 -> 关联测试报告:TestReport_2.0_Knowledge.md -> 产品文档版本:PRD V1.0 - ---- - -## 一、报告概述 - -本报告针对知识库模块测试报告(TestReport_2.0_Knowledge.md)中发现的3个缺陷进行深度分析,明确BUG产生的根本原因,并提供具体的解决方案。 - -### 缺陷汇总 - -| 缺陷编号 | 缺陷名称 | 严重程度 | 优先级 | 影响范围 | -|---------|---------|---------|--------|---------| -| BUG-KM-001 | 创建知识时creator_id未设置 | **阻断** | P0 | 15个用例被阻塞 | -| BUG-KM-002 | 讲师可以操作其他部门的分类 | 高 | P1 | 部门数据隔离失效 | -| BUG-KM-003 | 文件上传功能异常 | 高 | P1 | 知识文档无法上传 | - ---- - -## 二、缺陷详细分析 - -### 2.1 BUG-KM-001:创建知识时creator_id未设置 - -#### 基本信息 - -| 属性 | 描述 | -|------|------| -| 缺陷编号 | BUG-KM-001 | -| 严重程度 | **阻断(Blocker)** | -| 优先级 | P0 - 立即修复 | -| 错误信息 | `Field 'creator_id' doesn't have a default value` | -| 影响范围 | 知识创建功能完全不可用,阻塞15个测试用例 | - -#### 原因分析 - -**1. 数据库设计约束** - -根据PRD文档第5.1节"知识(km_knowledge)"实体定义: - -``` -| 字段 | 类型 | 说明 | -|------|------|------| -| creator_id | Long | 创建人 | -``` - -`creator_id` 是必填字段(NOT NULL),用于记录知识的创建人ID。 - -**2. 业务逻辑缺失** - -在 `KnowledgeServiceImpl.createKnowledge()` 方法中存在以下问题: - -- **未从认证上下文获取用户ID**:方法没有从当前登录用户的JWT Token或SecurityContext中提取用户ID -- **直接透传前端数据**:将前端传入的DTO直接转换为实体保存,未补充后端自动填充的字段 -- **违反业务规则**:PRD要求"知识"必须有创建人,用于追溯和权限控制 - -**3. 根本原因** - -``` -┌─────────────────────────────────────────────────────────────────┐ -│ 请求流程分析 │ -├─────────────────────────────────────────────────────────────────┤ -│ │ -│ 前端请求 │ -│ │ │ -│ ▼ │ -│ Controller层 ────────────────────────────────────────────── │ -│ │ 接收KnowledgeDTO(不含creator_id) │ -│ ▼ │ -│ Service层 ───────────────────────────────────────────────── │ -│ │ ❌ 未从SecurityContext获取当前用户ID │ -│ │ ❌ 未设置 knowledge.setCreatorId(userId) │ -│ ▼ │ -│ Mapper层 ────────────────────────────────────────────────── │ -│ │ 执行INSERT语句 │ -│ ▼ │ -│ MySQL ───────────────────────────────────────────────────── │ -│ │ creator_id字段为NULL,违反NOT NULL约束 │ -│ ▼ │ -│ ❌ 抛出异常:Field 'creator_id' doesn't have a default value │ -│ │ -└─────────────────────────────────────────────────────────────────┘ -``` - -#### 解决方案 - -**方案一:在Service层补充用户ID设置(推荐)** - -修改位置:`KnowledgeServiceImpl.createKnowledge()` 方法 - -修改逻辑: -1. 注入 `HttpServletRequest` 或创建 `SecurityUtil` 工具类 -2. 从JWT Token中解析当前登录用户ID -3. 在保存实体前设置 `knowledge.setCreatorId(currentUserId)` -4. 同时设置 `knowledge.setDepartmentId(userDepartmentId)` 确保部门隔离 - -**方案二:使用MyBatis Plus自动填充** - -配置 `MetaObjectHandler` 实现字段自动填充: -1. 在 `creator_id` 字段上添加 `@TableField(fill = FieldFill.INSERT)` 注解 -2. 实现 `MetaObjectHandler.insertFill()` 方法,自动填充创建人ID - -**推荐方案**:方案一,显式设置更清晰,便于维护和调试。 - ---- - -### 2.2 BUG-KM-002:讲师可以操作其他部门的分类 - -#### 基本信息 - -| 属性 | 描述 | -|------|------| -| 缺陷编号 | BUG-KM-002 | -| 严重程度 | 高(High) | -| 优先级 | P1 - 紧急修复 | -| 缺陷类型 | 安全漏洞 / 权限控制缺陷 | -| 影响范围 | 部门数据隔离完全失效 | - -#### 原因分析 - -**1. PRD业务规则** - -根据PRD文档第4.1节"权限规则": - -``` -讲师: - ├── 管理本部门知识库(上传/编辑/删除) - ├── 管理本部门题库(增删改查) - ... -``` - -根据PRD文档第4.4节"数据隔离规则": - -| 数据类型 | 隔离方式 | -|----------|----------| -| 知识库 | 按部门隔离,只能看本部门 | -| 题库 | 按部门隔离,讲师只能操作本部门 | - -**2. 权限校验缺失** - -`CategoryService` 和 `CategoryController` 中没有实现以下校验逻辑: - -- 未校验当前用户角色(管理员 vs 讲师) -- 未校验请求中的 `departmentId` 与当前用户所属部门是否一致 -- 直接信任前端传入的 `departmentId` 参数 - -**3. 根本原因** - -``` -┌─────────────────────────────────────────────────────────────────┐ -│ 权限校验缺失分析 │ -├─────────────────────────────────────────────────────────────────┤ -│ │ -│ 讲师(部门1)发起请求 │ -│ │ │ -│ │ POST /api/knowledge/category │ -│ │ Body: { "name": "xxx", "departmentId": 2 } ← 伪造部门 │ -│ ▼ │ -│ Controller层 ────────────────────────────────────────────── │ -│ │ ❌ 未校验用户角色 │ -│ │ ❌ 未校验departmentId权限 │ -│ ▼ │ -│ Service层 ───────────────────────────────────────────────── │ -│ │ ❌ 直接保存,未做部门隔离校验 │ -│ ▼ │ -│ 数据库 ──────────────────────────────────────────────────── │ -│ │ 分类创建成功,department_id = 2 │ -│ ▼ │ -│ ❌ 安全漏洞:讲师越权操作其他部门数据 │ -│ │ -└─────────────────────────────────────────────────────────────────┘ -``` - -#### 解决方案 - -**方案一:Service层统一校验(推荐)** - -在 `CategoryServiceImpl` 中增加部门权限校验: - -``` -校验逻辑伪代码: -1. 获取当前用户信息(ID、角色、部门ID) -2. IF 角色 == ADMIN: - 允许操作任意部门 - ELSE IF 角色 == LECTURER: - IF 请求的departmentId != 用户的departmentId: - 抛出异常:"无权操作其他部门数据" - END IF - END IF -3. 继续执行业务逻辑 -``` - -**方案二:AOP切面统一拦截** - -创建 `@DepartmentIsolation` 注解 + 切面类: -1. 在需要部门隔离的方法上添加注解 -2. 切面自动校验当前用户部门与请求部门是否一致 - -**方案三:封装通用工具方法** - -创建 `DepartmentPermissionUtil.checkPermission(Long targetDepartmentId)` 方法: -- 供各模块(知识库、题库、试卷等)复用 -- 统一的异常处理和错误提示 - -**推荐方案**:方案一 + 方案三结合,在Service层显式调用校验方法,逻辑清晰,便于维护。 - ---- - -### 2.3 BUG-KM-003:文件上传功能异常 - -#### 基本信息 - -| 属性 | 描述 | -|------|------| -| 缺陷编号 | BUG-KM-003 | -| 严重程度 | 高(High) | -| 优先级 | P1 - 紧急修复 | -| 错误码 | 1501 | -| 错误信息 | `{"code":1501,"message":"文件保存失败"}` | -| 影响范围 | 所有文档/视频上传功能不可用 | - -#### 原因分析 - -**1. 可能原因一:配置问题** - -`application.yml` 或 `application-dev.yml` 中文件上传路径配置问题: -- 路径未配置 -- 路径配置错误(如使用了Linux路径分隔符但运行在Windows环境) -- 使用了相对路径但基准目录不正确 - -**2. 可能原因二:目录不存在** - -配置的上传目录在服务器/本地环境中不存在: -- 开发环境与生产环境路径不一致 -- 服务首次启动时未自动创建目录 - -**3. 可能原因三:权限不足** - -应用程序对目标目录没有写入权限: -- Linux环境下目录权限设置不正确 -- Windows环境下目录被其他程序占用或权限受限 - -**4. 可能原因四:代码健壮性问题** - -`FileService` 实现中缺少健壮性处理: -- 未在保存文件前检查/创建目录 -- 异常处理过于笼统,丢失了原始错误信息 - -**5. 根本原因推测** - -``` -┌─────────────────────────────────────────────────────────────────┐ -│ 文件上传失败分析 │ -├─────────────────────────────────────────────────────────────────┤ -│ │ -│ 上传请求 │ -│ │ │ -│ │ POST /api/file/upload/document │ -│ │ Content-Type: multipart/form-data │ -│ ▼ │ -│ FileController ──────────────────────────────────────────── │ -│ │ 接收MultipartFile │ -│ ▼ │ -│ FileService ─────────────────────────────────────────────── │ -│ │ 读取配置的上传路径 │ -│ │ 拼接完整文件路径 │ -│ ▼ │ -│ 文件系统 ────────────────────────────────────────────────── │ -│ │ │ -│ │ ❌ 可能问题1:目录不存在 │ -│ │ ❌ 可能问题2:无写入权限 │ -│ │ ❌ 可能问题3:路径格式错误 │ -│ ▼ │ -│ 抛出IOException → 捕获后返回统一错误码1501 │ -│ │ -└─────────────────────────────────────────────────────────────────┘ -``` - -#### 解决方案 - -**步骤一:检查配置文件** - -检查 `application.yml` 和 `application-dev.yml`: - -```yaml -# 期望的配置格式示例 -file: - upload: - path: D:/upload/training-system/ # Windows - # path: /data/upload/training-system/ # Linux - max-size: 100MB - allowed-types: pdf,doc,docx,xls,xlsx,ppt,pptx,mp4,avi -``` - -**步骤二:检查FileService实现** - -确保在保存文件前创建目录: - -``` -伪代码: -1. 获取配置的上传路径 uploadPath -2. 生成唯一文件名(如:UUID + 原始扩展名) -3. 拼接完整路径 fullPath = uploadPath + "/" + fileName -4. 获取父目录 parentDir = fullPath.getParent() -5. IF 父目录不存在: - 创建目录(包含所有父目录) - END IF -6. 保存文件到 fullPath -7. 返回文件访问URL -``` - -**步骤三:增加详细日志** - -在FileService中增加关键日志输出: - -``` -日志内容: -- [INFO] 配置的上传路径: {uploadPath} -- [INFO] 生成的文件名: {fileName} -- [INFO] 完整保存路径: {fullPath} -- [ERROR] 文件保存失败: {具体异常信息和堆栈} -``` - -**步骤四:检查目录权限** - -- **Linux环境**: - ```bash - mkdir -p /data/upload/training-system - chown -R tomcat:tomcat /data/upload - chmod -R 755 /data/upload - ``` - -- **Windows环境**: - 确保运行Java应用的用户对目标目录有完全控制权限 - -**步骤五:启动时自动创建目录** - -在应用启动时(如 `@PostConstruct` 方法)检查并创建上传目录: - -``` -伪代码: -@PostConstruct -public void init() { - File uploadDir = new File(uploadPath); - if (!uploadDir.exists()) { - boolean created = uploadDir.mkdirs(); - log.info("创建上传目录: {}, 结果: {}", uploadPath, created); - } -} -``` - ---- - -## 三、修复优先级与建议 - -### 3.1 修复优先级 - -``` -┌──────────────────────────────────────────────────────────────────────────┐ -│ 修复优先级路线图 │ -├──────────────────────────────────────────────────────────────────────────┤ -│ │ -│ 优先级1 ───────────────────────────────────────────────────────────── │ -│ │ │ -│ │ BUG-KM-001: creator_id未设置 │ -│ │ 原因: 阻断级缺陷,整个知识创建功能不可用 │ -│ │ 影响: 15个测试用例被阻塞 │ -│ │ 建议: 立即修复,修复后重新执行全部阻塞用例 │ -│ │ │ -│ ▼ │ -│ 优先级2 ───────────────────────────────────────────────────────────── │ -│ │ │ -│ │ BUG-KM-003: 文件上传失败 │ -│ │ 原因: 知识库核心功能依赖文件上传 │ -│ │ 影响: 无法上传文档和视频 │ -│ │ 建议: 紧急修复,排查配置和目录权限问题 │ -│ │ │ -│ ▼ │ -│ 优先级3 ───────────────────────────────────────────────────────────── │ -│ │ │ -│ │ BUG-KM-002: 部门隔离未实现 │ -│ │ 原因: 安全漏洞,违反业务规则 │ -│ │ 影响: 讲师可越权操作其他部门数据 │ -│ │ 建议: 紧急修复,需全面审查相关模块 │ -│ │ │ -│ ▼ │ -│ 回归测试 ──────────────────────────────────────────────────────────── │ -│ │ -└──────────────────────────────────────────────────────────────────────────┘ -``` - -### 3.2 风险提示 - -| 风险点 | 说明 | 建议 | -|--------|------|------| -| 同类缺陷 | 其他模块(考试、培训计划)可能存在相同的 `creator_id` 未设置问题 | 修复时同步审查相关模块 | -| 部门隔离 | 题库、试卷、考试模块可能也缺少部门隔离校验 | 建议封装统一的部门权限校验工具 | -| 配置管理 | 文件上传路径在不同环境可能不一致 | 使用环境变量或配置中心管理 | - -### 3.3 测试建议 - -修复完成后需执行以下测试: - -1. **BUG-KM-001修复后**: - - 重新执行KS系列全部8个用例 - - 重新执行KD系列全部4个用例 - - 重新执行KC-003用例 - -2. **BUG-KM-002修复后**: - - 重新执行KC-004用例 - - 新增测试用例:验证管理员可操作所有部门 - - 新增测试用例:验证学员无法创建分类 - -3. **BUG-KM-003修复后**: - - 重新执行KM系列全部7个用例 - - 测试不同文件类型(PDF、Word、Excel、PPT、视频) - - 测试边界条件(大文件、空文件、特殊字符文件名) - ---- - -## 四、总结 - -### 4.1 缺陷共性分析 - -本次知识库模块测试发现的3个缺陷存在共同特点: - -| 共性问题 | 具体表现 | 改进建议 | -|---------|---------|---------| -| **后端逻辑不完善** | 未实现PRD要求的业务规则 | 开发前充分理解PRD,Code Review时对照检查 | -| **安全意识不足** | 部门隔离未实现,信任前端参数 | 后端必须校验所有涉及权限的参数 | -| **健壮性欠缺** | 文件上传未处理目录不存在的情况 | 增加防御性编程,完善异常处理 | - -### 4.2 后续行动项 - -- [ ] 修复BUG-KM-001:补充creator_id设置逻辑 -- [ ] 修复BUG-KM-002:实现部门隔离校验 -- [ ] 修复BUG-KM-003:排查并修复文件上传问题 -- [ ] 审查其他模块是否存在同类问题 -- [ ] 封装通用的部门权限校验工具类 -- [ ] 回归测试验证修复效果 - ---- - -**报告生成时间**:2026-01-12 - -**审核状态**:待修复 diff --git a/training-system/docs/test-reports/RegressionReport_1.3_UserManagement.md b/training-system/docs/test-reports/RegressionReport_1.3_UserManagement.md deleted file mode 100644 index fee29ed..0000000 --- a/training-system/docs/test-reports/RegressionReport_1.3_UserManagement.md +++ /dev/null @@ -1,217 +0,0 @@ -# 复测报告 - 模块1.3:员工管理 - -> 复测日期:2026-01-09 -> 测试人员:AI测试工程师 -> 测试环境:Spring Boot 3.1.2 / MySQL 8.0 / JDK 17 -> 原始测试报告:TestReport_1.3_UserManagement.md - ---- - -## 一、复测概要 - -| 项目 | 数值 | -|------|------| -| 原始缺陷数 | 3 | -| 复测通过 | 2 | -| 复测失败 | 1 | -| **修复率** | **66.7%** | - ---- - -## 二、缺陷复测结果 - -| 缺陷编号 | 严重程度 | 描述 | 复测结果 | -|---------|---------|------|---------| -| BUG-USER-001 | 中 | 手机号未做唯一性校验 | ✅ **通过** | -| BUG-USER-002 | 高 | 讲师未实现部门数据隔离 | ❌ **失败** | -| BUG-USER-003 | 严重 | 学员可访问员工管理接口 | ✅ **通过** | - ---- - -## 三、复测详情 - -### 3.1 BUG-USER-001:手机号唯一性校验 ✅ - -| 属性 | 描述 | -|------|------| -| 复测结果 | **通过** | -| 测试步骤 | 1. 管理员登录
2. 使用已存在的手机号`13800138000`创建新员工
3. 验证返回结果 | -| 预期结果 | 返回错误,提示手机号已存在 | -| 实际结果 | 返回 `{"code":1005,"message":"手机号已存在"}` | -| 验证时间 | 2026-01-09 15:55:44 | - -**测试请求:** -```bash -POST /api/system/user -{ - "username": "duplicate_phone_test", - "password": "Test@123", - "realName": "DuplicatePhoneTest", - "phone": "13800138000", # 与admin重复 - "role": "STUDENT", - "departmentId": 1 -} -``` - -**测试响应:** -```json -{ - "code": 1005, - "message": "手机号已存在", - "timestamp": 1767945744357, - "success": false -} -``` - ---- - -### 3.2 BUG-USER-002:讲师部门数据隔离 ❌ - -| 属性 | 描述 | -|------|------| -| 复测结果 | **失败** | -| 测试步骤 | 1. 讲师账号登录(救援一部,departmentId=1)
2. 访问员工管理分页接口
3. 验证返回的员工列表 | -| 预期结果 | 只返回救援一部的员工(5人) | -| 实际结果 | 返回全部7个员工,包含救援二部的admin和zhangsan | -| 验证时间 | 2026-01-09 15:56:02 | - -**测试请求:** -```bash -GET /api/system/user/page?current=1&size=10 -Authorization: Bearer {test_lecturer_token} -``` - -**测试响应(关键数据):** -```json -{ - "code": 200, - "data": { - "total": 7, - "records": [ - {"id": 7, "realName": "TestLecturer", "departmentName": "救援一部"}, - {"id": 6, "realName": "TestAdmin", "departmentName": "救援一部"}, - {"id": 5, "realName": "TestUser002", "departmentName": "救援一部"}, - {"id": 4, "realName": "TestUser001", "departmentName": "救援一部"}, - {"id": 3, "realName": "讲师", "departmentName": "救援一部"}, - {"id": 2, "realName": "张三", "departmentName": "救援二部"}, // ❌ 不应返回 - {"id": 1, "realName": "系统管理员", "departmentName": "救援二部"} // ❌ 不应返回 - ] - } -} -``` - -**问题分析:** -讲师查询员工列表时,后端未根据当前用户的部门ID过滤数据,导致讲师可以看到所有部门的员工信息。 - -**修复建议:** -在 `UserServiceImpl.page()` 方法中,当当前用户角色为 `LECTURER` 时,自动在查询条件中添加部门过滤: -```java -if (currentUser.getRole() == Role.LECTURER) { - queryWrapper.eq("department_id", currentUser.getDepartmentId()); -} -``` - ---- - -### 3.3 BUG-USER-003:学员访问权限控制 ✅ - -| 属性 | 描述 | -|------|------| -| 复测结果 | **通过** | -| 测试步骤 | 1. 学员账号登录
2. 访问员工管理分页接口
3. 验证返回结果 | -| 预期结果 | 返回403 Forbidden | -| 实际结果 | 返回 `{"code":403,"message":"没有操作权限"}` | -| 验证时间 | 2026-01-09 15:56:22 | - -**测试请求:** -```bash -GET /api/system/user/page?current=1&size=10 -Authorization: Bearer {test_user_001_token} -``` - -**测试响应:** -```json -{ - "code": 403, - "message": "没有操作权限", - "timestamp": 1767945782146, - "success": false -} -``` - ---- - -## 四、回归测试(原通过用例确认) - -为确保修复未引入新问题,对原测试报告中通过的4个用例进行回归验证: - -| 用例编号 | 测试项 | 回归结果 | -|---------|--------|---------| -| USER-001 | 创建员工(有效数据) | ✅ 通过(新员工创建正常) | -| USER-003 | 启用/禁用员工 | ✅ 通过(状态切换正常) | -| USER-004 | 编辑员工信息 | ✅ 通过(编辑功能正常) | -| USER-005 | 删除员工 | ✅ 通过(删除功能正常) | - ---- - -## 五、测试结论 - -### 5.1 复测结果总结 - -| 评估项 | 结果 | -|--------|------| -| 缺陷修复率 | 66.7%(2/3) | -| P0级缺陷修复 | 1/1 已修复 | -| P1级缺陷修复 | 0/1 未修复 | -| P2级缺陷修复 | 1/1 已修复 | -| 回归测试 | 全部通过(无新增问题) | - -### 5.2 遗留问题 - -| 缺陷编号 | 严重程度 | 状态 | 说明 | -|---------|---------|------|------| -| BUG-USER-002 | 高 | **待修复** | 讲师部门数据隔离仍未实现 | - -### 5.3 模块状态评估 - -| 功能项 | 状态 | -|--------|------| -| 员工CRUD基本功能 | ✅ 可用 | -| 数据唯一性校验 | ✅ 已实现 | -| 学员权限控制 | ✅ 已实现 | -| 讲师数据隔离 | ❌ 未实现 | - -### 5.4 建议 - -1. **BUG-USER-002 需要继续修复** - - 问题影响:讲师可查看其他部门员工信息,违反PRD中的数据隔离要求 - - 安全风险:中等(信息泄露) - - 建议优先级:P1 - -2. **建议扩展验证** - - 修复后同时验证讲师创建/编辑/删除员工时的部门隔离是否生效 - ---- - -## 六、附录 - -### 6.1 测试账号 - -| 账号 | 角色 | 部门 | -|------|------|------| -| admin | ADMIN | 救援二部 | -| test_lecturer | LECTURER | 救援一部 | -| test_user_001 | STUDENT | 救援一部 | - -### 6.2 相关文档 - -| 文档 | 路径 | -|------|------| -| 原始测试报告 | docs/test-reports/TestReport_1.3_UserManagement.md | -| 产品需求文档 | docs/PRD.md | - ---- - -**报告生成时间:** 2026-01-09 15:58:00 - -**报告签发:** AI测试工程师 diff --git a/training-system/docs/test-reports/RegressionReport_1.3_UserManagement_V2.md b/training-system/docs/test-reports/RegressionReport_1.3_UserManagement_V2.md deleted file mode 100644 index fd2e775..0000000 --- a/training-system/docs/test-reports/RegressionReport_1.3_UserManagement_V2.md +++ /dev/null @@ -1,374 +0,0 @@ -1# 复测报告 - 模块1.3:员工管理(V2) - -> 复测日期:2026-01-09 -> 测试人员:AI测试工程师 -> 测试环境:Spring Boot 3.1.2 / MySQL 8.0 / JDK 17 -> 原始测试报告:TestReport_1.3_UserManagement.md -> 版本:V2(补充深度测试) - ---- - -## 一、复测概要 - -| 项目 | 数值 | -|------|------| -| 原始缺陷数 | 3 | -| 复测通过 | 2 | -| 复测失败 | 1 | -| **新发现问题** | **2** | -| **修复率** | **66.7%** | - ---- - -## 二、原始缺陷复测结果 - -| 缺陷编号 | 严重程度 | 描述 | 复测结果 | -|---------|---------|------|---------| -| BUG-USER-001 | 中 | 手机号未做唯一性校验 | ✅ **通过** | -| BUG-USER-002 | 高 | 讲师未实现部门数据隔离 | ❌ **失败** | -| BUG-USER-003 | 严重 | 学员可访问员工管理接口 | ✅ **通过** | - ---- - -## 三、深度测试发现的新问题 - -### 3.1 BUG-USER-004:编辑员工时无法修改状态(后端Bug,非前端问题) - -| 属性 | 描述 | -|------|------| -| 缺陷编号 | BUG-USER-004 | -| 严重程度 | **高** | -| 优先级 | P1 | -| 缺陷类型 | **后端Bug** | -| 缺陷描述 | 通过编辑员工接口(PUT /api/system/user)传入status字段,接口返回成功,但状态未被更新 | -| 重现步骤 | 1. 管理员登录
2. 前端编辑员工,状态选择"禁用"
3. 点击保存,提示"保存成功"
4. 刷新页面,状态仍为"启用" | -| 预期结果 | 员工状态变为"禁用" | -| 实际结果 | 员工状态仍为"启用",状态修改被静默忽略 | -| 根因分析 | **后端问题**:UserDTO类中没有定义status字段,updateUser()方法也未处理状态更新 | -| 影响范围 | 前端编辑表单中的状态选择功能完全无效,用户体验严重受损 | - -#### 前端代码验证 ✅ - -前端代码**正确传递了status字段**(user.html:139): -```javascript -const data = { - realName: ..., - phone: ..., - username: ..., - departmentId: ..., - groupId: ..., - role: ..., - status: document.getElementById('formStatus').value // ✅ 前端正确传递 -}; -``` - -#### 问题定位 - -| 层级 | 状态 | 说明 | -|------|------|------| -| 前端页面 | ✅ 正常 | 有状态选择下拉框,正确绑定值 | -| 前端JS | ✅ 正常 | saveData()正确收集status并发送 | -| 后端DTO | ❌ 缺失 | UserDTO没有status字段,Jackson忽略该值 | -| 后端Service | ❌ 未处理 | updateUser()没有setStatus()调用 | - -**测试请求:** -```bash -PUT /api/system/user -Content-Type: application/json -{ - "id": 5, - "username": "test_user_002", - "realName": "TestUser002", - "phone": "13800138001", - "role": "STUDENT", - "departmentId": 1, - "status": "DISABLED" // 尝试修改状态 -} -``` - -**测试响应:** -```json -{ - "code": 200, - "message": "操作成功", - "success": true -} -``` - -**验证查询结果:** -```json -{ - "data": { - "id": 5, - "status": "ENABLED", // 状态未改变! - "statusName": "启用" - } -} -``` - -**修复建议(二选一):** - -**方案A:在UserDTO中添加status字段** -```java -// UserDTO.java -private String status; - -// UserServiceImpl.updateUser() -if (StrUtil.isNotBlank(dto.getStatus())) { - user.setStatus(UserStatus.valueOf(dto.getStatus())); -} -``` - -**方案B:明确API设计,状态修改只能通过专用接口** -- 保持现有设计,状态只能通过 `/enable` 和 `/disable` 接口修改 -- 但需在API文档中明确说明 -- 前端编辑表单应隐藏或禁用状态选项 - ---- - -### 3.2 BUG-USER-002 根因深入分析 - -**问题:** 讲师部门数据隔离未生效 - -**代码追踪:** - -1. **Service层代码正确**(UserServiceImpl.java:397-406) -```java -private void applyDepartmentIsolation(LambdaQueryWrapper queryWrapper) { - UserContext currentUser = UserContextHolder.getContext(); - if (currentUser != null && UserRole.LECTURER.name().equals(currentUser.getRole())) { - if (currentUser.getDepartmentId() != null) { // 问题:departmentId为null - queryWrapper.eq(User::getDepartmentId, currentUser.getDepartmentId()); - } - } -} -``` - -2. **问题根源**(JwtUtils.java:37-48) -```java -public String generateToken(Long userId, String username, String role) { - return JWT.create() - .withSubject(String.valueOf(userId)) - .withClaim("username", username) - .withClaim("role", role) // 只有这三个字段! - .withIssuedAt(now) - .withExpiresAt(expireDate) - .sign(Algorithm.HMAC256(secret)); -} -// 没有包含 departmentId! -``` - -3. **AuthInterceptor尝试获取但失败**(AuthInterceptor.java:68-70) -```java -if (jwt.getClaim("departmentId") != null && !jwt.getClaim("departmentId").isNull()) { - context.setDepartmentId(jwt.getClaim("departmentId").asLong()); -} -// 由于JWT中没有departmentId,这段代码不会执行 -``` - -**修复建议:** - -修改 `JwtUtils.generateToken()` 方法,添加 departmentId 参数: -```java -public String generateToken(Long userId, String username, String role, Long departmentId) { - return JWT.create() - .withSubject(String.valueOf(userId)) - .withClaim("username", username) - .withClaim("role", role) - .withClaim("departmentId", departmentId) // 新增 - .withIssuedAt(now) - .withExpiresAt(expireDate) - .sign(Algorithm.HMAC256(secret)); -} -``` - -同时修改 `AuthServiceImpl.login()` 方法,传入 departmentId。 - ---- - -## 四、重置密码功能验证 ✅ - -| 属性 | 描述 | -|------|------| -| 测试结果 | **通过** | -| 测试步骤 | 1. 管理员调用重置密码接口
2. 使用新密码登录
3. 使用旧密码登录 | -| 实际结果 | 新密码登录成功,旧密码登录失败(返回1003密码错误) | - -**测试详情:** - -```bash -# 重置密码 -PUT /api/system/user/password/reset -{"userId": 5, "newPassword": "NewPass@123"} -Response: {"code": 200, "message": "操作成功"} - -# 新密码登录 -POST /api/auth/login -{"username": "test_user_002", "password": "NewPass@123"} -Response: {"code": 200, "data": {"token": "..."}} ✅ - -# 旧密码登录(验证旧密码失效) -POST /api/auth/login -{"username": "test_user_002", "password": "Test@123"} -Response: {"code": 1003, "message": "密码错误"} ✅ -``` - ---- - -## 五、禁用/启用功能验证 ✅ - -| 属性 | 描述 | -|------|------| -| 测试结果 | **通过**(仅限专用接口) | -| 测试步骤 | 1. 调用 PUT /api/system/user/{id}/disable
2. 查询用户状态
3. 调用 PUT /api/system/user/{id}/enable
4. 查询用户状态 | -| 实际结果 | 专用接口可正常切换状态 | - -**测试详情:** - -```bash -# 禁用用户 -PUT /api/system/user/5/disable -Response: {"code": 200, "message": "操作成功"} - -# 验证状态 -GET /api/system/user/5 -Response: {"data": {"status": "DISABLED", "statusName": "禁用"}} ✅ - -# 启用用户 -PUT /api/system/user/5/enable -Response: {"code": 200, "message": "操作成功"} - -# 验证状态 -GET /api/system/user/5 -Response: {"data": {"status": "ENABLED", "statusName": "启用"}} ✅ -``` - ---- - -## 六、漏测原因分析 - -### 6.1 为什么会漏测"编辑状态"功能? - -| 原因类型 | 具体分析 | -|---------|---------| -| **测试用例设计不完整** | 原测试计划只验证了"启用/禁用"功能是否存在,但没有验证"通过编辑接口修改状态"的场景 | -| **测试路径覆盖不足** | 系统提供了两种修改状态的路径:1) 专用接口 2) 编辑接口。只测试了路径1 | -| **接口返回值未深入验证** | 编辑接口返回200成功,测试人员信任了返回值而没有二次查询确认 | -| **前后端交互场景遗漏** | 没有模拟前端表单的实际交互流程,即"编辑时同时修改状态" | - -### 6.2 为什么会漏测"重置密码验证"? - -| 原因类型 | 具体分析 | -|---------|---------| -| **验证不完整** | 原测试只验证了接口返回200,没有验证密码是否真的被修改 | -| **缺少端到端验证** | 应该用新密码登录验证,同时用旧密码登录确认失效 | - -### 6.3 为什么BUG-USER-002未修复但代码似乎已添加? - -| 原因类型 | 具体分析 | -|---------|---------| -| **修复不完整** | 开发在Service层添加了部门隔离逻辑,但忽略了JWT中缺少departmentId | -| **缺少集成测试** | 单元测试可能通过(因为可以mock UserContext),但集成测试会失败 | -| **代码审查疏漏** | JWT Token生成和解析的链路未被完整审查 | - -### 6.4 改进建议 - -1. **测试用例设计改进** - - 对于每个字段修改,都要验证"修改前后值确实变化" - - 对于多路径功能,所有路径都要测试 - -2. **验证方法改进** - - 不要只信任接口返回值,要二次查询确认 - - 对于认证类功能,要进行端到端验证 - -3. **增加测试场景** - - 正常场景 + 边界场景 + 异常场景 - - 单接口测试 + 流程测试 + 集成测试 - ---- - -## 七、缺陷汇总 - -### 7.1 现存缺陷清单 - -| 缺陷编号 | 严重程度 | 状态 | 描述 | 修复建议位置 | -|---------|---------|------|------|-------------| -| BUG-USER-002 | 高 | **待修复** | 讲师部门数据隔离未生效 | JwtUtils.java + AuthServiceImpl.java | -| BUG-USER-004 | 中 | **新发现** | 编辑接口无法修改状态 | UserDTO.java + UserServiceImpl.java | - -### 7.2 已修复缺陷 - -| 缺陷编号 | 严重程度 | 描述 | -|---------|---------|------| -| BUG-USER-001 | 中 | 手机号唯一性校验 ✅ | -| BUG-USER-003 | 严重 | 学员权限控制 ✅ | - ---- - -## 八、测试结论 - -### 8.1 模块状态评估 - -| 功能项 | 状态 | 说明 | -|--------|------|------| -| 创建员工 | ✅ 可用 | | -| 编辑员工(基本信息) | ✅ 可用 | | -| 编辑员工(状态) | ⚠️ 部分可用 | 只能通过专用接口修改 | -| 删除员工 | ✅ 可用 | | -| 重置密码 | ✅ 可用 | | -| 启用/禁用(专用接口) | ✅ 可用 | | -| 手机号唯一性 | ✅ 已实现 | | -| 学员权限控制 | ✅ 已实现 | | -| 讲师数据隔离 | ❌ 未实现 | JWT缺少departmentId | - -### 8.2 上线评估 - -**结论:建议暂缓上线** - -**原因:** -1. BUG-USER-002(讲师数据隔离)为高优先级安全问题,存在信息泄露风险 -2. 虽然基础CRUD功能可用,但不符合PRD中的数据隔离要求 - -### 8.3 修复优先级建议 - -| 优先级 | 缺陷编号 | 预计影响 | -|--------|---------|---------| -| **P0** | BUG-USER-002 | 修复后满足PRD数据隔离要求 | -| **P2** | BUG-USER-004 | 改善用户体验,非阻塞性问题 | - ---- - -## 九、附录 - -### 9.1 测试账号 - -| 账号 | 角色 | 部门 | -|------|------|------| -| admin | ADMIN | 救援二部 | -| test_lecturer | LECTURER | 救援一部 | -| test_user_001 | STUDENT | 救援一部 | -| test_user_002 | STUDENT | 救援一部 | - -### 9.2 相关代码文件 - -| 文件 | 说明 | -|------|------| -| UserController.java | 用户管理控制器 | -| UserServiceImpl.java | 用户服务实现,包含部门隔离逻辑 | -| UserDTO.java | 用户数据传输对象(缺少status字段) | -| JwtUtils.java | JWT工具类(缺少departmentId) | -| AuthInterceptor.java | 认证拦截器 | - -### 9.3 相关文档 - -| 文档 | 路径 | -|------|------| -| 原始测试报告 | docs/test-reports/TestReport_1.3_UserManagement.md | -| 第一版复测报告 | docs/test-reports/RegressionReport_1.3_UserManagement.md | -| 产品需求文档 | docs/PRD.md | - ---- - -**报告生成时间:** 2026-01-09 16:45:00 - -**报告签发:** AI测试工程师 diff --git a/training-system/docs/test-reports/TestReport_1.3_UserManagement.md b/training-system/docs/test-reports/TestReport_1.3_UserManagement.md deleted file mode 100644 index def96de..0000000 --- a/training-system/docs/test-reports/TestReport_1.3_UserManagement.md +++ /dev/null @@ -1,157 +0,0 @@ -# 测试报告 - 1.3 员工管理模块 - -> 测试日期:2026-01-09 -> 测试人员:AI测试工程师 -> 测试环境:Spring Boot 3.1.2 / MySQL 8.0 / JDK 17 - ---- - -## 一、测试概要 - -| 项目 | 数值 | -|------|------| -| 测试用例总数 | 7 | -| 通过 | 4 | -| 失败 | 3 | -| 阻塞 | 0 | -| 通过率 | 57.1% | - ---- - -## 二、测试结果详情 - -### 2.1 测试用例执行结果 - -| 用例编号 | 测试项 | 预期结果 | 实际结果 | 状态 | -|---------|--------|---------|---------|------| -| USER-001 | 管理员创建员工 | 成功创建,指定角色和部门 | 创建成功,返回用户ID=4 | **通过** | -| USER-002 | 创建重复手机号员工 | 提示"手机号已存在" | 创建成功,未校验手机号唯一性 | **失败** | -| USER-003 | 分配角色(ADMIN/LECTURER/STUDENT) | 角色分配成功 | ADMIN/LECTURER/STUDENT三种角色均分配成功 | **通过** | -| USER-004 | 禁用员工 | 状态变更为DISABLED | 状态成功变更为DISABLED | **通过** | -| USER-005 | 启用员工 | 状态变更为ENABLED | 状态成功变更为ENABLED | **通过** | -| USER-006 | 讲师查看本部门员工 | 只能看到本部门 | 可以看到所有部门用户(救援一部+救援二部) | **失败** | -| USER-007 | 学员无法访问员工管理 | 返回403 | 返回200,可查看所有用户数据 | **失败** | - ---- - -## 三、缺陷清单 - -### BUG-001:手机号未做唯一性校验 - -| 属性 | 描述 | -|------|------| -| 缺陷编号 | BUG-USER-001 | -| 关联用例 | USER-002 | -| 严重程度 | 中 | -| 优先级 | P2 | -| 缺陷描述 | 创建员工时未校验手机号是否已存在,允许重复手机号 | -| 重现步骤 | 1. 管理员登录
2. 创建员工A,手机号13800138001
3. 创建员工B,手机号13800138001
4. 两个员工都创建成功 | -| 预期结果 | 第二次创建时提示"手机号已存在" | -| 实际结果 | 两个员工都创建成功,存在重复手机号 | -| 建议修复 | 在UserServiceImpl.createUser()方法中添加手机号唯一性校验 | - ---- - -### BUG-002:讲师未实现部门数据隔离 - -| 属性 | 描述 | -|------|------| -| 缺陷编号 | BUG-USER-002 | -| 关联用例 | USER-006 | -| 严重程度 | 高 | -| 优先级 | P1 | -| 缺陷描述 | 讲师角色可以查看所有部门的员工信息,未按部门隔离 | -| 重现步骤 | 1. 讲师账号登录(部门:救援一部)
2. 访问GET /api/system/user/page
3. 返回结果包含救援一部和救援二部的员工 | -| 预期结果 | 讲师只能看到本部门(救援一部)的员工 | -| 实际结果 | 讲师可以看到所有部门的员工(7条记录) | -| 建议修复 | 在UserService查询方法中根据当前用户角色和部门进行数据过滤 | - -**测试数据截取:** -```json -{ - "total": 7, - "records": [ - {"id":7, "departmentName":"救援一部"}, - {"id":6, "departmentName":"救援一部"}, - {"id":2, "departmentName":"救援二部"}, // 不应可见 - {"id":1, "departmentName":"救援二部"} // 不应可见 - ] -} -``` - ---- - -### BUG-003:学员权限未控制,可访问员工管理接口 - -| 属性 | 描述 | -|------|------| -| 缺陷编号 | BUG-USER-003 | -| 关联用例 | USER-007 | -| 严重程度 | **严重** | -| 优先级 | P0 | -| 缺陷描述 | 学员角色可以访问员工管理接口,获取所有用户敏感信息 | -| 重现步骤 | 1. 学员账号登录
2. 访问GET /api/system/user/page
3. 成功返回所有用户列表 | -| 预期结果 | 返回403 Forbidden,拒绝访问 | -| 实际结果 | 返回200 OK,可查看所有用户数据 | -| 建议修复 | 1. 在UserController上添加@PreAuthorize注解限制ADMIN和LECTURER角色
2. 或在拦截器中根据角色过滤接口访问权限 | - -**安全风险:** 此漏洞导致学员可以获取所有员工的手机号、用户名等敏感信息,存在信息泄露风险。 - ---- - -## 四、测试覆盖接口 - -| 接口 | 方法 | 测试状态 | -|------|------|---------| -| /api/system/user | POST | 已测试 | -| /api/system/user/{id} | GET | 已测试 | -| /api/system/user/page | GET | 已测试 | -| /api/system/user/{id}/enable | PUT | 已测试 | -| /api/system/user/{id}/disable | PUT | 已测试 | -| /api/auth/login | POST | 已测试(辅助) | - ---- - -## 五、测试数据 - -### 5.1 测试账号 - -| 用户名 | 密码 | 角色 | 部门 | -|--------|------|------|------| -| admin | admin123 | ADMIN | 救援二部 | -| test_lecturer | Test@123 | LECTURER | 救援一部 | -| test_user_001 | Test@123 | STUDENT | 救援一部 | - -### 5.2 测试创建的数据 - -| ID | 用户名 | 角色 | 部门 | -|----|--------|------|------| -| 4 | test_user_001 | STUDENT | 救援一部 | -| 5 | test_user_002 | STUDENT | 救援一部 | -| 6 | test_admin | ADMIN | 救援一部 | -| 7 | test_lecturer | LECTURER | 救援一部 | - ---- - -## 六、结论与建议 - -### 6.1 测试结论 - -员工管理模块基本CRUD功能正常,但存在**3个缺陷**,其中: -- **1个严重缺陷**(P0):学员权限未控制 -- **1个高优先级缺陷**(P1):讲师部门隔离未实现 -- **1个中优先级缺陷**(P2):手机号唯一性未校验 - -### 6.2 修复建议优先级 - -1. **P0 - 立即修复**:BUG-USER-003(学员权限控制) -2. **P1 - 紧急修复**:BUG-USER-002(讲师部门隔离) -3. **P2 - 计划修复**:BUG-USER-001(手机号唯一性) - -### 6.3 阻塞问题 - -无阻塞问题,可继续进行后续模块测试。 - ---- - -**报告生成时间:** 2026-01-09 14:48:00 diff --git a/training-system/docs/test-reports/TestReport_2.0_Knowledge.md b/training-system/docs/test-reports/TestReport_2.0_Knowledge.md deleted file mode 100644 index ba37f8f..0000000 --- a/training-system/docs/test-reports/TestReport_2.0_Knowledge.md +++ /dev/null @@ -1,177 +0,0 @@ -# 测试报告 - 模块二:知识库 - -> 测试日期:2026-01-09 -> 测试人员:AI测试工程师 -> 测试环境:Spring Boot 3.1.2 / MySQL 8.0 / JDK 17 - ---- - -## 一、测试概要 - -| 项目 | 数值 | -|------|------| -| 测试用例总数 | 19 | -| 通过 | 2 | -| 失败 | 2 | -| 阻塞 | 15 | -| 通过率 | 10.5% | - -**注意:** 由于发现关键BUG(创建知识时creator_id未设置),导致知识创建失败,大部分测试用例被阻塞。 - ---- - -## 二、测试结果详情 - -### 2.1 知识分类测试(KC系列) - -| 用例编号 | 测试项 | 预期结果 | 实际结果 | 状态 | -|---------|--------|---------|---------|------| -| KC-001 | 创建一级分类 | 成功创建 | 创建成功,返回ID=4 | **通过** | -| KC-002 | 创建多级分类(父子关系) | 层级关系正确 | 成功创建子分类ID=5,父分类为ID=4 | **通过** | -| KC-003 | 删除有知识的分类 | 提示"存在关联知识,无法删除" | 由于知识创建失败,无法测试 | **阻塞** | -| KC-004 | 讲师只能管理本部门分类 | 其他部门分类不可操作 | 讲师(部门1)可以创建部门2的分类 | **失败** | - -### 2.2 知识文档管理测试(KM系列) - -| 用例编号 | 测试项 | 预期结果 | 实际结果 | 状态 | -|---------|--------|---------|---------|------| -| KM-001 | 上传PDF文档 | 上传成功 | 文件保存失败(code:1501) | **失败** | -| KM-002 | 上传Word文档 | 上传成功 | 依赖KM-001 | **阻塞** | -| KM-003 | 上传Excel文档 | 上传成功 | 依赖KM-001 | **阻塞** | -| KM-004 | 上传PPT文档 | 上传成功 | 依赖KM-001 | **阻塞** | -| KM-005 | 上传视频文件 | 上传成功 | 依赖KM-001 | **阻塞** | -| KM-006 | 上传不支持的格式 | 提示错误 | 依赖KM-001 | **阻塞** | -| KM-007 | 超大文件上传 | 提示错误 | 依赖KM-001 | **阻塞** | - -### 2.3 知识状态管理测试(KS系列) - -| 用例编号 | 测试项 | 预期结果 | 实际结果 | 状态 | -|---------|--------|---------|---------|------| -| KS-001 | 创建知识(默认草稿) | 状态为DRAFT | creator_id字段缺失导致失败 | **阻塞** | -| KS-002 | 草稿→发布 | 状态变为PUBLISHED | 依赖KS-001 | **阻塞** | -| KS-003 | 已发布→下架 | 状态变为OFFLINE | 依赖KS-001 | **阻塞** | -| KS-004 | 已下架→重新上架 | 状态变为PUBLISHED | 依赖KS-001 | **阻塞** | -| KS-005 | 学员查看草稿知识 | 不可见 | 依赖KS-001 | **阻塞** | -| KS-006 | 学员查看已发布知识 | 可见 | 依赖KS-001 | **阻塞** | -| KS-007 | 学员查看已下架知识 | 不可见 | 依赖KS-001 | **阻塞** | -| KS-008 | 下架被培训计划引用的知识 | 显示警告确认 | 依赖KS-001 | **阻塞** | - -### 2.4 部门隔离测试(KD系列) - -| 用例编号 | 测试项 | 预期结果 | 实际结果 | 状态 | -|---------|--------|---------|---------|------| -| KD-001 | 讲师查看本部门知识 | 正常查看 | 依赖知识数据 | **阻塞** | -| KD-002 | 讲师查看其他部门知识 | 不可见 | 依赖知识数据 | **阻塞** | -| KD-003 | 学员查看本部门已发布知识 | 正常查看 | API可访问,但无数据 | **阻塞** | -| KD-004 | 学员查看其他部门知识 | 不可见 | 依赖知识数据 | **阻塞** | - ---- - -## 三、缺陷清单 - -### BUG-KM-001:创建知识时creator_id未设置 - -| 属性 | 描述 | -|------|------| -| 缺陷编号 | BUG-KM-001 | -| 关联用例 | KS-001及所有依赖用例 | -| 严重程度 | **阻断** | -| 优先级 | P0 | -| 缺陷描述 | 创建知识时未设置creator_id字段,导致数据库插入失败 | -| 重现步骤 | 1. 管理员登录
2. POST /api/knowledge 创建知识
3. 返回500错误 | -| 错误信息 | `Field 'creator_id' doesn't have a default value` | -| 预期结果 | 知识创建成功,creator_id自动设置为当前登录用户ID | -| 实际结果 | 500服务器内部错误 | -| 建议修复 | 在KnowledgeServiceImpl.createKnowledge()方法中,从SecurityContext获取当前用户ID并设置到knowledge.setCreatorId() | - -**影响范围:** 此BUG导致知识库模块15个测试用例被阻塞,无法继续测试。 - ---- - -### BUG-KM-002:讲师可以操作其他部门的分类 - -| 属性 | 描述 | -|------|------| -| 缺陷编号 | BUG-KM-002 | -| 关联用例 | KC-004 | -| 严重程度 | 高 | -| 优先级 | P1 | -| 缺陷描述 | 讲师角色可以创建/修改其他部门的知识分类,未实现部门隔离 | -| 重现步骤 | 1. 讲师账号登录(部门1)
2. POST /api/knowledge/category 创建分类,departmentId设为2
3. 分类创建成功 | -| 预期结果 | 返回403或400错误,禁止操作其他部门数据 | -| 实际结果 | 分类创建成功,返回ID=6 | -| 建议修复 | 在CategoryService中校验当前用户部门与操作数据部门是否一致 | - ---- - -### BUG-KM-003:文件上传功能异常 - -| 属性 | 描述 | -|------|------| -| 缺陷编号 | BUG-KM-003 | -| 关联用例 | KM-001 ~ KM-007 | -| 严重程度 | 高 | -| 优先级 | P1 | -| 缺陷描述 | 文件上传接口返回"文件保存失败"错误 | -| 重现步骤 | 1. 管理员登录
2. POST /api/file/upload/document 上传文件
3. 返回code:1501错误 | -| 错误信息 | `{"code":1501,"message":"文件保存失败"}` | -| 预期结果 | 文件上传成功,返回文件URL | -| 实际结果 | 返回1501错误码 | -| 建议修复 | 检查文件存储路径配置,确保上传目录存在且有写入权限 | - ---- - -## 四、测试覆盖接口 - -| 接口 | 方法 | 测试状态 | -|------|------|---------| -| /api/knowledge/category | POST | 已测试 | -| /api/knowledge/category/tree | GET | 已测试 | -| /api/knowledge/category/{id} | DELETE | 已测试 | -| /api/knowledge | POST | 已测试(失败) | -| /api/knowledge/page | GET | 已测试 | -| /api/file/upload/document | POST | 已测试(失败) | - ---- - -## 五、测试数据 - -### 5.1 测试创建的分类数据 - -| ID | 名称 | 父分类 | 部门 | 状态 | -|----|------|--------|------|------| -| 4 | Safety Regulations | - | 救援一部 | 已删除 | -| 5 | Highway Rescue | 4 | 救援一部 | 已删除 | -| 6 | Test Category Dept2 | - | 救援二部 | 存在(异常数据) | - ---- - -## 六、结论与建议 - -### 6.1 测试结论 - -知识库模块存在**3个严重缺陷**,其中1个为阻断级别: - -1. **P0 阻断级**:创建知识时creator_id未设置 - 导致整个模块功能不可用 -2. **P1 高优先级**:讲师部门隔离未实现 -3. **P1 高优先级**:文件上传功能异常 - -### 6.2 修复建议优先级 - -1. **立即修复(P0)**:BUG-KM-001 - 修复后需重新执行全部阻塞用例 -2. **紧急修复(P1)**:BUG-KM-002 - 部门隔离 -3. **紧急修复(P1)**:BUG-KM-003 - 文件上传 - -### 6.3 阻塞说明 - -由于BUG-KM-001为阻断级缺陷,以下测试需要在修复后重新执行: -- KS系列(知识状态管理):8个用例 -- KD系列(部门隔离):4个用例 -- KM系列(文件管理):6个用例 -- KC-003(删除有知识的分类):1个用例 - -**建议:** 修复BUG-KM-001后进行回归测试。 - ---- - -**报告生成时间:** 2026-01-09 14:58:00 diff --git a/training-system/docs/test-reports/TestReport_3.0_Question.md b/training-system/docs/test-reports/TestReport_3.0_Question.md deleted file mode 100644 index d03a437..0000000 --- a/training-system/docs/test-reports/TestReport_3.0_Question.md +++ /dev/null @@ -1,144 +0,0 @@ -# 测试报告 - 模块三:考题管理 - -> 测试日期:2026-01-09 -> 测试人员:AI测试工程师 -> 测试环境:Spring Boot 3.1.2 / MySQL 8.0 / JDK 17 - ---- - -## 一、测试概要 - -| 项目 | 数值 | -|------|------| -| 测试用例总数 | 11 | -| 通过 | 0 | -| 失败 | 3 | -| 阻塞 | 8 | -| 通过率 | 0% | - -**注意:** 与知识库模块相同,创建题目时也存在creator_id未设置的问题,导致大部分测试被阻塞。 - ---- - -## 二、测试结果详情 - -### 2.1 题型测试(Q系列) - -| 用例编号 | 测试项 | 预期结果 | 实际结果 | 状态 | -|---------|--------|---------|---------|------| -| Q-001 | 创建单选题(4选项) | 成功创建 | creator_id字段缺失导致失败 | **阻塞** | -| Q-002 | 创建多选题 | 成功创建 | 依赖Q-001 | **阻塞** | -| Q-003 | 创建判断题 | 成功创建 | 依赖Q-001 | **阻塞** | -| Q-004 | 单选题设置多个答案 | 提示错误 | 依赖Q-001 | **阻塞** | -| Q-005 | 多选题只设置一个答案 | 提示错误 | 依赖Q-001 | **阻塞** | -| Q-006 | 题目必须填写解析 | 提示必填 | 依赖Q-001 | **阻塞** | - -### 2.2 题目状态管理测试(QS系列) - -| 用例编号 | 测试项 | 预期结果 | 实际结果 | 状态 | -|---------|--------|---------|---------|------| -| QS-001 | 草稿题目发布 | 状态变为PUBLISHED | 依赖题目数据 | **阻塞** | -| QS-002 | 下架被试卷引用的题目 | 显示警告确认 | 依赖题目数据 | **阻塞** | -| QS-003 | 只有已发布题目可被组卷 | 草稿/下架题目不可选 | 依赖题目数据 | **阻塞** | - -### 2.3 部门隔离测试(QD系列) - -| 用例编号 | 测试项 | 预期结果 | 实际结果 | 状态 | -|---------|--------|---------|---------|------| -| QD-001 | 讲师只能管理本部门题库 | 其他部门不可操作 | 讲师可创建其他部门题库分类(ID=4) | **失败** | -| QD-002 | 学员无法访问题目管理 | 返回403 | 返回200,可查询题目列表 | **失败** | - ---- - -## 三、缺陷清单 - -### BUG-Q-001:创建题目时creator_id未设置 - -| 属性 | 描述 | -|------|------| -| 缺陷编号 | BUG-Q-001 | -| 关联用例 | Q-001及所有依赖用例 | -| 严重程度 | **阻断** | -| 优先级 | P0 | -| 缺陷描述 | 创建题目时未设置creator_id字段,导致数据库插入失败 | -| 重现步骤 | 1. 管理员登录
2. POST /api/exam/question 创建题目
3. 返回500错误 | -| 错误信息 | `Field 'creator_id' doesn't have a default value` | -| 预期结果 | 题目创建成功 | -| 实际结果 | 500服务器内部错误 | -| 建议修复 | 在QuestionServiceImpl.createQuestion()方法中,从SecurityContext获取当前用户ID并设置到question.setCreatorId() | - -**与BUG-KM-001为同类问题,建议统一修复。** - ---- - -### BUG-Q-002:讲师可以操作其他部门的题库分类 - -| 属性 | 描述 | -|------|------| -| 缺陷编号 | BUG-Q-002 | -| 关联用例 | QD-001 | -| 严重程度 | 高 | -| 优先级 | P1 | -| 缺陷描述 | 讲师角色可以创建其他部门的题库分类,未实现部门隔离 | -| 重现步骤 | 1. 讲师账号登录(部门1)
2. POST /api/exam/question-category 创建分类,departmentId设为2
3. 分类创建成功 | -| 预期结果 | 返回403或400错误 | -| 实际结果 | 分类创建成功,返回ID=4 | -| 建议修复 | 在QuestionCategoryService中校验当前用户部门与操作数据部门是否一致 | - ---- - -### BUG-Q-003:学员可以访问题目管理接口 - -| 属性 | 描述 | -|------|------| -| 缺陷编号 | BUG-Q-003 | -| 关联用例 | QD-002 | -| 严重程度 | **严重** | -| 优先级 | P0 | -| 缺陷描述 | 学员角色可以访问题目管理接口 | -| 重现步骤 | 1. 学员账号登录
2. GET /api/exam/question/page
3. 成功返回题目列表 | -| 预期结果 | 返回403 Forbidden | -| 实际结果 | 返回200 OK | -| 建议修复 | 在QuestionController上添加角色权限控制 | - ---- - -## 四、测试覆盖接口 - -| 接口 | 方法 | 测试状态 | -|------|------|---------| -| /api/exam/question | POST | 已测试(失败) | -| /api/exam/question/page | GET | 已测试 | -| /api/exam/question-category | POST | 已测试 | -| /api/exam/question-category/tree | GET | 已测试 | - ---- - -## 五、结论与建议 - -### 5.1 测试结论 - -考题管理模块存在**3个缺陷**,其中2个为严重/阻断级别: - -1. **P0 阻断级**:创建题目时creator_id未设置 - 导致整个模块功能不可用 -2. **P0 严重级**:学员权限未控制 -3. **P1 高优先级**:讲师部门隔离未实现 - -### 5.2 共性问题说明 - -此模块发现的问题与员工管理、知识库模块存在共性: -- creator_id未设置:知识库、考题管理 -- 学员权限未控制:员工管理、题目管理 -- 讲师部门隔离未实现:知识库分类、题库分类 - -**建议进行全局修复。** - -### 5.3 阻塞说明 - -由于BUG-Q-001为阻断级缺陷,以下测试需要在修复后重新执行: -- Q系列(题型测试):6个用例 -- QS系列(状态管理):3个用例 - ---- - -**报告生成时间:** 2026-01-09 15:26:00 diff --git a/training-system/docs/test-reports/TestReport_4.0_Paper.md b/training-system/docs/test-reports/TestReport_4.0_Paper.md deleted file mode 100644 index ccdcb97..0000000 --- a/training-system/docs/test-reports/TestReport_4.0_Paper.md +++ /dev/null @@ -1,127 +0,0 @@ -# 测试报告 - 模块四:试卷管理 - -> 测试日期:2026-01-09 -> 测试人员:AI测试工程师 -> 测试环境:Spring Boot 3.1.2 / MySQL 8.0 / JDK 17 - ---- - -## 一、测试概要 - -| 项目 | 数值 | -|------|------| -| 测试用例总数 | 11 | -| 通过 | 0 | -| 失败 | 1 | -| 阻塞 | 10 | -| 通过率 | 0% | - -**注意:** 与知识库、考题模块相同,创建试卷时也存在creator_id未设置的问题,导致大部分测试被阻塞。 - ---- - -## 二、测试结果详情 - -### 2.1 手动组卷测试(P系列) - -| 用例编号 | 测试项 | 预期结果 | 实际结果 | 状态 | -|---------|--------|---------|---------|------| -| P-001 | 手动选择题目组卷 | 成功创建试卷 | creator_id字段缺失导致失败 | **阻塞** | -| P-002 | 设置每题分值 | 分值设置正确 | 依赖P-001 | **阻塞** | -| P-003 | 总分自动计算 | 各题分值之和=总分 | 依赖P-001 | **阻塞** | -| P-004 | 设置考试时长 | 时长设置正确 | 依赖P-001 | **阻塞** | -| P-005 | 设置及格分 | 及格分≤总分 | 依赖P-001 | **阻塞** | -| P-006 | 及格分超过总分 | 提示错误 | 依赖P-001 | **阻塞** | - -### 2.2 自动组卷测试(PA系列) - -| 用例编号 | 测试项 | 预期结果 | 实际结果 | 状态 | -|---------|--------|---------|---------|------| -| PA-001 | 设置规则自动抽题 | 按规则随机抽取 | 依赖题目数据 | **阻塞** | -| PA-002 | 题库数量不足 | 提示错误 | 依赖题目数据 | **阻塞** | -| PA-003 | 自动组卷题目随机 | 多次组卷结果不同 | 依赖题目数据 | **阻塞** | - -### 2.3 试卷预览测试(PP系列) - -| 用例编号 | 测试项 | 预期结果 | 实际结果 | 状态 | -|---------|--------|---------|---------|------| -| PP-001 | 预览试卷 | 显示完整试卷内容 | 依赖试卷数据 | **阻塞** | - -### 2.4 权限测试 - -| 用例编号 | 测试项 | 预期结果 | 实际结果 | 状态 | -|---------|--------|---------|---------|------| -| PS-权限 | 学员无法访问试卷管理 | 返回403 | 返回200,可查询试卷列表 | **失败** | - ---- - -## 三、缺陷清单 - -### BUG-P-001:创建试卷时creator_id未设置 - -| 属性 | 描述 | -|------|------| -| 缺陷编号 | BUG-P-001 | -| 关联用例 | P-001及所有依赖用例 | -| 严重程度 | **阻断** | -| 优先级 | P0 | -| 缺陷描述 | 创建试卷时未设置creator_id字段,导致数据库插入失败 | -| 重现步骤 | 1. 管理员登录
2. POST /api/exam/paper 创建试卷
3. 返回500错误 | -| 错误信息 | `Field 'creator_id' doesn't have a default value` | -| 预期结果 | 试卷创建成功 | -| 实际结果 | 500服务器内部错误 | -| 建议修复 | 在PaperServiceImpl.createPaper()方法中设置creatorId | - -**与BUG-KM-001、BUG-Q-001为同类问题。** - ---- - -### BUG-P-002:学员可以访问试卷管理接口 - -| 属性 | 描述 | -|------|------| -| 缺陷编号 | BUG-P-002 | -| 关联用例 | PS-权限 | -| 严重程度 | **严重** | -| 优先级 | P0 | -| 缺陷描述 | 学员角色可以访问试卷管理接口 | -| 重现步骤 | 1. 学员账号登录
2. GET /api/exam/paper/page
3. 成功返回试卷列表 | -| 预期结果 | 返回403 Forbidden | -| 实际结果 | 返回200 OK | -| 建议修复 | 在PaperController上添加角色权限控制 | - ---- - -## 四、测试覆盖接口 - -| 接口 | 方法 | 测试状态 | -|------|------|---------| -| /api/exam/paper | POST | 已测试(失败) | -| /api/exam/paper/page | GET | 已测试 | - ---- - -## 五、结论与建议 - -### 5.1 测试结论 - -试卷管理模块存在**2个缺陷**: - -1. **P0 阻断级**:创建试卷时creator_id未设置 -2. **P0 严重级**:学员权限未控制 - -### 5.2 共性问题汇总 - -截至目前,已发现的共性问题: - -| 问题类型 | 影响模块 | -|---------|---------| -| creator_id未设置 | 知识库、考题管理、试卷管理 | -| 学员权限未控制 | 员工管理、考题管理、试卷管理 | -| 讲师部门隔离未实现 | 知识库分类、题库分类 | - -**建议进行全局性修复。** - ---- - -**报告生成时间:** 2026-01-09 15:32:00 diff --git a/training-system/docs/test-reports/TestReport_5.0_Exam.md b/training-system/docs/test-reports/TestReport_5.0_Exam.md deleted file mode 100644 index d2a2b2a..0000000 --- a/training-system/docs/test-reports/TestReport_5.0_Exam.md +++ /dev/null @@ -1,135 +0,0 @@ -# 测试报告 - 模块五:考试管理 - -> 测试日期:2026-01-09 -> 测试人员:AI测试工程师 -> 测试环境:Spring Boot 3.1.2 / MySQL 8.0 / JDK 17 - ---- - -## 一、测试概要 - -| 项目 | 数值 | -|------|------| -| 测试用例总数 | 20 | -| 通过 | 1 | -| 失败 | 1 | -| 阻塞 | 18 | -| 通过率 | 5% | - -**注意:** 由于试卷创建失败,考试创建依赖试卷数据,导致绝大部分测试被阻塞。 - ---- - -## 二、测试结果详情 - -### 2.1 发布考试测试(E系列) - -| 用例编号 | 测试项 | 预期结果 | 实际结果 | 状态 | -|---------|--------|---------|---------|------| -| E-001 | 创建考试,关联试卷 | 成功创建 | 返回"试卷不存在"(1302) | **阻塞** | -| E-002 | 设置时间窗口 | 时间设置正确 | 依赖E-001 | **阻塞** | -| E-003 | 设置及格线 | 及格线设置正确 | 依赖E-001 | **阻塞** | -| E-004 | 设置最大考试次数 | 次数限制生效 | 依赖E-001 | **阻塞** | -| E-005 | 指定部门参加考试 | 部门所有人可见 | 依赖E-001 | **阻塞** | -| E-006 | 指定小组参加考试 | 小组成员可见 | 依赖E-001 | **阻塞** | -| E-007 | 指定个人参加考试 | 仅该用户可见 | 依赖E-001 | **阻塞** | - -### 2.2 在线答题测试(EA系列) - -| 用例编号 | 测试项 | 预期结果 | 实际结果 | 状态 | -|---------|--------|---------|---------|------| -| EA-001 | 在时间窗口内进入考试 | 成功进入 | 依赖考试数据 | **阻塞** | -| EA-002 | 不在时间窗口进入考试 | 提示错误 | 依赖考试数据 | **阻塞** | -| EA-003 | 超过最大次数进入考试 | 提示错误 | 依赖考试数据 | **阻塞** | -| EA-004 | 答题过程自动计时 | 倒计时正确 | 依赖考试数据 | **阻塞** | -| EA-005 | 超时自动交卷 | 系统自动提交 | 依赖考试数据 | **阻塞** | -| EA-006 | 主动交卷 | 成功提交 | 依赖考试数据 | **阻塞** | -| EA-007 | 答案定时自动保存 | 答案保存成功 | 依赖考试数据 | **阻塞** | -| EA-008 | 断网后恢复继续答题 | 可继续答题 | 依赖考试数据 | **阻塞** | - -### 2.3 成绩计算测试(ES系列) - -| 用例编号 | 测试项 | 预期结果 | 实际结果 | 状态 | -|---------|--------|---------|---------|------| -| ES-001 | 单选题判分 | 正确/错误判分 | 依赖考试数据 | **阻塞** | -| ES-002 | 多选题判分 | 全对得分 | 依赖考试数据 | **阻塞** | -| ES-003 | 判断题判分 | 正确/错误判分 | 依赖考试数据 | **阻塞** | -| ES-004 | 分数≥及格线显示通过 | 显示"通过" | 依赖考试数据 | **阻塞** | -| ES-005 | 分数<及格线显示未通过 | 显示"未通过" | 依赖考试数据 | **阻塞** | -| ES-006 | 多次考试取最高分 | 最高分记录正确 | 依赖考试数据 | **阻塞** | - -### 2.4 成绩查看测试(EV系列) - -| 用例编号 | 测试项 | 预期结果 | 实际结果 | 状态 | -|---------|--------|---------|---------|------| -| EV-001 | 交卷后立即显示成绩 | 成绩即时显示 | 依赖考试数据 | **阻塞** | -| EV-002 | 显示答案解析 | 每题显示解析 | 依赖考试数据 | **阻塞** | -| EV-003 | 讲师查看本部门学员成绩 | 正常查看 | 依赖考试数据 | **阻塞** | - -### 2.5 权限测试 - -| 用例编号 | 测试项 | 预期结果 | 实际结果 | 状态 | -|---------|--------|---------|---------|------| -| E-学员接口 | 学员获取可参加的考试 | 返回200 | 返回200,空列表 | **通过** | -| E-权限 | 学员访问考试管理接口 | 返回403 | 返回200,可查询考试列表 | **失败** | - ---- - -## 三、缺陷清单 - -### BUG-E-001:学员可以访问考试管理接口 - -| 属性 | 描述 | -|------|------| -| 缺陷编号 | BUG-E-001 | -| 关联用例 | E-权限 | -| 严重程度 | **严重** | -| 优先级 | P0 | -| 缺陷描述 | 学员角色可以访问考试管理的分页查询接口 | -| 重现步骤 | 1. 学员账号登录
2. GET /api/exam/page
3. 成功返回考试列表 | -| 预期结果 | 返回403 Forbidden | -| 实际结果 | 返回200 OK | -| 建议修复 | 在ExamController的管理类接口上添加角色权限控制 | - ---- - -## 四、测试覆盖接口 - -| 接口 | 方法 | 测试状态 | -|------|------|---------| -| /api/exam | POST | 已测试(阻塞-无试卷) | -| /api/exam/page | GET | 已测试 | -| /api/exam/my | GET | 已测试 | - ---- - -## 五、阻塞说明 - -考试管理模块测试被阻塞的根本原因链: - -``` -creator_id问题 → 知识/题目创建失败 → 试卷创建失败 → 考试创建失败(无试卷) → 考试流程测试全部阻塞 -``` - -**前置条件:** -- 试卷管理模块正常(至少有一张已发布的试卷) -- 题目管理模块正常(至少有已发布的题目) - ---- - -## 六、结论与建议 - -### 6.1 测试结论 - -考试管理模块存在**1个权限缺陷**,同时因上游模块阻断导致**18个用例无法执行**。 - -### 6.2 建议 - -1. 优先修复所有模块的creator_id问题 -2. 修复后按顺序执行: - - 考题管理 → 试卷管理 → 考试管理 -3. 补充考试核心流程的完整测试 - ---- - -**报告生成时间:** 2026-01-09 15:38:00 diff --git a/training-system/docs/test-reports/TestReport_6.0_TrainingPlan.md b/training-system/docs/test-reports/TestReport_6.0_TrainingPlan.md deleted file mode 100644 index ed56f57..0000000 --- a/training-system/docs/test-reports/TestReport_6.0_TrainingPlan.md +++ /dev/null @@ -1,119 +0,0 @@ -,# 测试报告 - 模块六:培训计划 - -> 测试日期:2026-01-09 -> 测试人员:AI测试工程师 -> 测试环境:Spring Boot 3.1.2 / MySQL 8.0 / JDK 17 - ---- - -## 一、测试概要 - -| 项目 | 数值 | -|------|------| -| 测试用例总数 | 11 | -| 通过 | 4 | -| 失败 | 1 | -| 阻塞 | 6 | -| 通过率 | 36.4% | - -**说明:** 培训计划模块基本功能可用,但部分依赖知识库的功能被阻塞。 - ---- - -## 二、测试结果详情 - -### 2.1 创建培训计划测试(TP系列) - -| 用例编号 | 测试项 | 预期结果 | 实际结果 | 状态 | -|---------|--------|---------|---------|------| -| TP-001 | 创建培训计划 | 成功创建 | 创建成功,返回ID=1 | **通过** | -| TP-002 | 关联多个知识文档 | 关联成功 | 依赖知识数据 | **阻塞** | -| TP-003 | 关联考试(可选) | 关联成功 | 依赖考试数据 | **阻塞** | -| TP-004 | 分配部门/小组/个人 | 分配成功 | 分配部门成功 | **通过** | - -### 2.2 计划状态测试(TPS系列) - -| 用例编号 | 测试项 | 预期结果 | 实际结果 | 状态 | -|---------|--------|---------|---------|------| -| TPS-001 | 开始日期前状态 | 未开始 | 创建后默认为NOT_STARTED | **通过** | -| TPS-002 | 发布后状态 | 进行中 | 发布后变为IN_PROGRESS | **通过** | -| TPS-003 | 结束日期后状态 | 已结束 | 未测试(需等待时间) | **阻塞** | - -### 2.3 进度跟踪测试(TPP系列) - -| 用例编号 | 测试项 | 预期结果 | 实际结果 | 状态 | -|---------|--------|---------|---------|------| -| TPP-001 | 学员完成知识学习 | 进度更新 | 依赖知识数据 | **阻塞** | -| TPP-002 | 学员完成关联考试 | 进度更新 | 依赖考试数据 | **阻塞** | -| TPP-003 | 学员查看自己的学习进度 | 进度显示正确 | 学员可查看,进度为0% | **通过** | -| TPP-004 | 讲师查看学员培训进度 | 可查看本部门 | 依赖学习数据 | **阻塞** | - -### 2.4 权限测试 - -| 用例编号 | 测试项 | 预期结果 | 实际结果 | 状态 | -|---------|--------|---------|---------|------| -| TP-权限 | 学员访问培训计划管理接口 | 返回403 | 返回200,可查询培训计划列表 | **失败** | - ---- - -## 三、缺陷清单 - -### BUG-TP-001:学员可以访问培训计划管理接口 - -| 属性 | 描述 | -|------|------| -| 缺陷编号 | BUG-TP-001 | -| 关联用例 | TP-权限 | -| 严重程度 | **严重** | -| 优先级 | P0 | -| 缺陷描述 | 学员角色可以访问培训计划管理的分页查询接口 | -| 重现步骤 | 1. 学员账号登录
2. GET /api/training/plan/page
3. 成功返回培训计划列表 | -| 预期结果 | 返回403 Forbidden | -| 实际结果 | 返回200 OK,可查看培训计划管理数据 | -| 建议修复 | 在TrainingPlanController的管理类接口上添加角色权限控制 | - ---- - -## 四、测试覆盖接口 - -| 接口 | 方法 | 测试状态 | 结果 | -|------|------|---------|------| -| /api/training/plan | POST | 已测试 | 通过 | -| /api/training/plan/{id} | GET | 已测试 | 通过 | -| /api/training/plan/{id}/publish | POST | 已测试 | 通过 | -| /api/training/plan/page | GET | 已测试 | 通过 | -| /api/training/plan/my | GET | 已测试 | 通过 | -| /api/training/plan/my/{planId}/progress | GET | 已测试 | 通过 | - ---- - -## 五、测试数据 - -### 5.1 测试创建的培训计划 - -| ID | 标题 | 状态 | 部门 | -|----|------|------|------| -| 1 | Test Training Plan 001 | IN_PROGRESS | 救援一部 | - ---- - -## 六、结论与建议 - -### 6.1 测试结论 - -培训计划模块是**测试通过率最高**的模块(36.4%),基本CRUD功能正常,但存在**1个权限缺陷**。 - -### 6.2 正面发现 - -1. 培训计划创建成功(未受creator_id问题影响) -2. 状态流转正常(NOT_STARTED -> IN_PROGRESS) -3. 学员端接口正常(/my、/progress) - -### 6.3 待改进 - -1. 修复学员权限控制问题 -2. 修复上游模块后补充知识关联、考试关联的测试 - ---- - -**报告生成时间:** 2026-01-09 15:45:00 diff --git a/training-system/docs/test-reports/TestReport_Summary.md b/training-system/docs/test-reports/TestReport_Summary.md deleted file mode 100644 index ae9ba07..0000000 --- a/training-system/docs/test-reports/TestReport_Summary.md +++ /dev/null @@ -1,195 +0,0 @@ -# 道路救援企业培训系统 - 测试总报告 - -> 测试日期:2026-01-09 -> 测试人员:AI测试工程师 -> 测试环境:Spring Boot 3.1.2 / MySQL 8.0 / JDK 17 -> 测试范围:PRD V1.0 MVP版本(模块1.3-模块6) - ---- - -## 一、测试执行概览 - -### 1.1 总体统计 - -| 指标 | 数值 | -|------|------| -| 计划用例数 | 79 | -| 已执行 | 79 | -| **通过** | **11** | -| **失败** | **11** | -| **阻塞** | **57** | -| **通过率** | **13.9%** | - -### 1.2 各模块测试结果 - -| 模块 | 用例数 | 通过 | 失败 | 阻塞 | 通过率 | -|------|--------|------|------|------|--------| -| 1.3 员工管理 | 7 | 4 | 3 | 0 | 57.1% | -| 2.0 知识库 | 19 | 2 | 2 | 15 | 10.5% | -| 3.0 考题管理 | 11 | 0 | 3 | 8 | 0% | -| 4.0 试卷管理 | 11 | 0 | 1 | 10 | 0% | -| 5.0 考试管理 | 20 | 1 | 1 | 18 | 5% | -| 6.0 培训计划 | 11 | 4 | 1 | 6 | 36.4% | - ---- - -## 二、缺陷统计 - -### 2.1 缺陷严重程度分布 - -| 严重程度 | 数量 | 占比 | -|---------|------|------| -| **阻断(Blocker)** | 3 | 27.3% | -| **严重(Critical)** | 6 | 54.5% | -| **高(High)** | 2 | 18.2% | -| **中(Medium)** | 0 | 0% | -| 合计 | 11 | 100% | - -### 2.2 缺陷清单汇总 - -| 缺陷编号 | 模块 | 严重程度 | 描述 | 状态 | -|---------|------|---------|------|------| -| BUG-USER-001 | 员工管理 | 中 | 手机号未做唯一性校验 | 待修复 | -| BUG-USER-002 | 员工管理 | 高 | 讲师未实现部门数据隔离 | 待修复 | -| BUG-USER-003 | 员工管理 | **严重** | 学员可访问员工管理接口 | 待修复 | -| BUG-KM-001 | 知识库 | **阻断** | 创建知识时creator_id未设置 | 待修复 | -| BUG-KM-002 | 知识库 | 高 | 讲师可操作其他部门分类 | 待修复 | -| BUG-KM-003 | 知识库 | 高 | 文件上传功能异常 | 待修复 | -| BUG-Q-001 | 考题管理 | **阻断** | 创建题目时creator_id未设置 | 待修复 | -| BUG-Q-002 | 考题管理 | 高 | 讲师可操作其他部门题库 | 待修复 | -| BUG-Q-003 | 考题管理 | **严重** | 学员可访问题目管理接口 | 待修复 | -| BUG-P-001 | 试卷管理 | **阻断** | 创建试卷时creator_id未设置 | 待修复 | -| BUG-P-002 | 试卷管理 | **严重** | 学员可访问试卷管理接口 | 待修复 | -| BUG-E-001 | 考试管理 | **严重** | 学员可访问考试管理接口 | 待修复 | -| BUG-TP-001 | 培训计划 | **严重** | 学员可访问培训计划管理接口 | 待修复 | - ---- - -## 三、共性问题分析 - -### 3.1 阻断级问题:creator_id未设置 - -**影响范围:** 知识库、考题管理、试卷管理 - -**问题描述:** 创建知识/题目/试卷时,未从当前登录用户获取creator_id并设置,导致数据库插入失败。 - -**根本原因:** Service层创建实体时未调用SecurityContext获取当前用户ID。 - -**修复建议:** -```java -// 在各ServiceImpl的create方法中添加: -Long currentUserId = SecurityContextHolder.getContext().getAuthentication()... -entity.setCreatorId(currentUserId); -``` - -**阻塞影响:** -- 知识库:15个用例 -- 考题管理:8个用例 -- 试卷管理:10个用例 -- 考试管理:18个用例(级联阻塞) -- **合计:51个用例(占64.6%)** - ---- - -### 3.2 严重级问题:学员权限未控制 - -**影响范围:** 员工管理、考题管理、试卷管理、考试管理、培训计划 - -**问题描述:** 学员角色可以访问管理员/讲师专属的管理接口,存在越权访问风险。 - -**安全风险:** -- 信息泄露:学员可查看所有员工信息、题库、试卷 -- 潜在篡改:如果POST/PUT/DELETE接口也未限制,可能造成数据篡改 - -**修复建议:** -在Controller上添加Spring Security注解: -```java -@PreAuthorize("hasAnyRole('ADMIN', 'LECTURER')") -@GetMapping("/page") -public Result> page(...) { ... } -``` - ---- - -### 3.3 高优先级问题:讲师部门隔离未实现 - -**影响范围:** 员工管理、知识库分类、题库分类 - -**问题描述:** 讲师可以查看/操作其他部门的数据,违反PRD中"讲师只能管理本部门"的要求。 - -**修复建议:** -在Service层添加部门校验: -```java -Long userDeptId = getCurrentUserDepartmentId(); -if (!userDeptId.equals(dto.getDepartmentId())) { - throw new BusinessException("无权操作其他部门数据"); -} -``` - ---- - -## 四、测试结论 - -### 4.1 系统当前状态 - -| 评估项 | 状态 | 说明 | -|--------|------|------| -| 基础功能 | **部分可用** | 员工管理、培训计划基础功能可用 | -| 核心业务 | **不可用** | 知识库、考试流程因creator_id问题无法使用 | -| 权限控制 | **存在漏洞** | 学员可越权访问管理接口 | -| 数据隔离 | **未实现** | 讲师部门隔离未生效 | - -### 4.2 上线评估 - -**结论:当前版本不建议上线** - -**原因:** -1. 存在3个阻断级BUG,核心业务流程无法使用 -2. 存在6个严重级权限漏洞,安全风险高 -3. 测试通过率仅13.9%,远低于上线标准(通常≥90%) - -### 4.3 修复优先级建议 - -| 优先级 | 问题 | 预计影响 | -|--------|------|---------| -| **P0** | creator_id未设置(3处) | 修复后可解除51个用例阻塞 | -| **P0** | 学员权限控制(5处) | 修复后消除越权访问风险 | -| **P1** | 讲师部门隔离(3处) | 修复后满足PRD数据隔离要求 | -| **P1** | 文件上传异常 | 修复后知识库文件功能可用 | -| **P2** | 手机号唯一性校验 | 修复后防止重复数据 | - ---- - -## 五、下一步行动 - -### 5.1 短期(修复后) - -1. 修复creator_id问题后,重新执行知识库、考题、试卷、考试模块测试 -2. 修复权限问题后,执行权限矩阵完整测试 -3. 修复部门隔离后,执行数据隔离专项测试 - -### 5.2 中期 - -1. 补充边界测试用例执行 -2. 执行接口自动化测试 -3. 执行性能压力测试 - ---- - -## 六、测试报告文件清单 - -| 报告名称 | 文件路径 | -|---------|---------| -| 1.3 员工管理测试报告 | docs/test-reports/TestReport_1.3_UserManagement.md | -| 2.0 知识库测试报告 | docs/test-reports/TestReport_2.0_Knowledge.md | -| 3.0 考题管理测试报告 | docs/test-reports/TestReport_3.0_Question.md | -| 4.0 试卷管理测试报告 | docs/test-reports/TestReport_4.0_Paper.md | -| 5.0 考试管理测试报告 | docs/test-reports/TestReport_5.0_Exam.md | -| 6.0 培训计划测试报告 | docs/test-reports/TestReport_6.0_TrainingPlan.md | -| 测试总报告 | docs/test-reports/TestReport_Summary.md | - ---- - -**报告生成时间:** 2026-01-09 15:50:00 - -**报告签发:** AI测试工程师 diff --git a/training-system/docs/测试报告-登录模块.md b/training-system/docs/测试报告-登录模块.md deleted file mode 100644 index d71e533..0000000 --- a/training-system/docs/测试报告-登录模块.md +++ /dev/null @@ -1,310 +0,0 @@ -# 登录模块测试报告 - -## 一、测试概述 - -### 1.1 测试目标 -对道路救援培训系统的**登录模块**进行全面的前后端测试,验证其功能正确性、安全性和用户体验。 - -### 1.2 测试范围 -- **JWT工具类测试**:JwtUtils 的单元测试 -- **认证服务层测试**:AuthService 的单元测试 -- **认证控制器测试**:AuthController 的接口测试 -- **前端代码审查**:login.html 页面功能审查 - -### 1.3 测试时间 -2026-01-08 - ---- - -## 二、系统架构分析 - -### 2.1 认证流程 - -``` -┌──────────────────────────────────────────────────────────────────┐ -│ 登录认证流程 │ -└──────────────────────────────────────────────────────────────────┘ - -┌─────────┐ POST /login ┌──────────────┐ 验证用户 ┌──────────┐ -│ 前端 │ ─────────────────► │ AuthController│ ──────────► │AuthService│ -│ login │ {username,passwd} │ │ │ │ -└─────────┘ └──────────────┘ └──────────┘ - │ │ │ - │ │ ▼ - │ │ ┌──────────┐ - │ │ │UserMapper │ - │ │ │ (数据库) │ - │ │ └──────────┘ - │ │ │ - │ │ ▼ - │ │ ┌──────────┐ - │ │ 生成Token │ JwtUtils │ - │ │ ◄──────────────── │ │ - │ │ └──────────┘ - │ │ - │ 返回Token+用户信息 │ - │ ◄───────────────────────────┘ - │ - ▼ -┌─────────────────────────────────────────────────────────────────┐ -│ localStorage存储Token,后续请求自动附加 Authorization: Bearer │ -└─────────────────────────────────────────────────────────────────┘ -``` - -### 2.2 技术栈 -| 组件 | 技术 | -|-----|-----| -| 后端框架 | Spring Boot 3.1.2 | -| JWT库 | com.auth0:java-jwt | -| 密码加密 | Spring Security BCrypt | -| 前端框架 | Bootstrap 5 + 原生JS | -| 测试框架 | JUnit 5 + Mockito | - ---- - -## 三、后端测试 - -### 3.1 测试用例统计 - -| 测试类 | 测试方法数 | 通过 | 失败 | 通过率 | -|-------|-----------|------|-----|--------| -| JwtUtilsTest | 19 | 19 | 0 | 100% | -| AuthServiceTest | 11 | 11 | 0 | 100% | -| AuthControllerTest | 11 | 11 | 0 | 100% | -| **总计** | **41** | **41** | **0** | **100%** | - -### 3.2 JwtUtils 测试详情 - -#### 3.2.1 生成Token测试 (GenerateTokenTest) -| 序号 | 测试场景 | 预期结果 | 测试结果 | -|-----|---------|---------|---------| -| 1 | 正常生成Token | 返回有效JWT字符串(header.payload.signature格式) | PASS | -| 2 | 不同用户生成不同Token | 两个Token不相等 | PASS | -| 3 | 同用户超过1秒后生成Token | Token不同,但包含相同用户信息 | PASS | - -#### 3.2.2 验证Token测试 (VerifyTokenTest) -| 序号 | 测试场景 | 预期结果 | 测试结果 | -|-----|---------|---------|---------| -| 1 | 有效Token | 返回DecodedJWT,包含正确claims | PASS | -| 2 | 无效Token | 返回null | PASS | -| 3 | 空Token | 返回null | PASS | -| 4 | null Token | 返回null | PASS | -| 5 | 被篡改的Token | 返回null | PASS | -| 6 | 错误密钥签名的Token | 返回null | PASS | - -#### 3.2.3 获取用户ID测试 (GetUserIdTest) -| 序号 | 测试场景 | 预期结果 | 测试结果 | -|-----|---------|---------|---------| -| 1 | 有效Token获取用户ID | 返回正确的Long类型用户ID | PASS | -| 2 | 无效Token获取用户ID | 返回null | PASS | - -#### 3.2.4 获取用户名测试 (GetUsernameTest) -| 序号 | 测试场景 | 预期结果 | 测试结果 | -|-----|---------|---------|---------| -| 1 | 有效Token获取用户名 | 返回正确的用户名字符串 | PASS | -| 2 | 无效Token获取用户名 | 返回null | PASS | - -#### 3.2.5 获取角色测试 (GetRoleTest) -| 序号 | 测试场景 | 预期结果 | 测试结果 | -|-----|---------|---------|---------| -| 1 | 有效Token获取角色 | 返回正确的角色(ADMIN/LECTURER/STUDENT) | PASS | -| 2 | 不同角色Token | 各返回对应角色字符串 | PASS | - -#### 3.2.6 Token过期测试 (IsTokenExpiredTest) -| 序号 | 测试场景 | 预期结果 | 测试结果 | -|-----|---------|---------|---------| -| 1 | 未过期Token | 返回false | PASS | -| 2 | 已过期Token | 返回true | PASS | -| 3 | 无效Token | 返回true | PASS | - -#### 3.2.7 Token完整性测试 (TokenIntegrityTest) -| 序号 | 测试场景 | 预期结果 | 测试结果 | -|-----|---------|---------|---------| -| 1 | Token包含所有claims | subject、username、role、issuedAt、expiresAt均存在 | PASS | - -### 3.3 AuthService 测试详情 - -#### 3.3.1 登录测试 (LoginTest) -| 序号 | 测试场景 | 预期结果 | 测试结果 | -|-----|---------|---------|---------| -| 1 | 正常登录 | 返回Token和完整用户信息 | PASS | -| 2 | 用户不存在 | 抛出BusinessException,code=USER_NOT_FOUND | PASS | -| 3 | 密码错误 | 抛出BusinessException,code=PASSWORD_ERROR | PASS | -| 4 | 用户被禁用 | 抛出BusinessException,code=USER_DISABLED | PASS | -| 5 | 不同角色用户登录 | 返回对应角色信息(STUDENT) | PASS | -| 6 | 用户无部门 | 正常登录,departmentName为null | PASS | - -#### 3.3.2 获取当前用户信息测试 (GetCurrentUserInfoTest) -| 序号 | 测试场景 | 预期结果 | 测试结果 | -|-----|---------|---------|---------| -| 1 | 有效上下文 | 返回完整用户信息 | PASS | -| 2 | 无上下文 | 抛出BusinessException,code=UNAUTHORIZED | PASS | -| 3 | 上下文用户ID为空 | 抛出BusinessException,code=UNAUTHORIZED | PASS | -| 4 | 用户已被删除 | 抛出BusinessException,code=USER_NOT_FOUND | PASS | - -#### 3.3.3 退出登录测试 (LogoutTest) -| 序号 | 测试场景 | 预期结果 | 测试结果 | -|-----|---------|---------|---------| -| 1 | 正常退出 | 清除UserContext,不抛异常 | PASS | - -### 3.4 AuthController 测试详情 - -#### 3.4.1 POST /login - 账号密码登录 -| 序号 | 测试场景 | HTTP状态 | 业务码 | 测试结果 | -|-----|---------|---------|-------|---------| -| 1 | 有效凭证登录 | 200 | 200 | PASS | -| 2 | 用户名为空 | 400 | - | PASS | -| 3 | 密码为空 | 400 | - | PASS | -| 4 | 用户名和密码都为空 | 400 | - | PASS | -| 5 | 用户不存在 | 200 | USER_NOT_FOUND | PASS | -| 6 | 密码错误 | 200 | PASSWORD_ERROR | PASS | -| 7 | 用户被禁用 | 200 | USER_DISABLED | PASS | -| 8 | 请求体为空 | 400 | - | PASS | - -#### 3.4.2 GET /userinfo - 获取当前用户信息 -| 序号 | 测试场景 | HTTP状态 | 业务码 | 测试结果 | -|-----|---------|---------|-------|---------| -| 1 | 已认证用户 | 200 | 200 | PASS | -| 2 | 未认证用户 | 200 | UNAUTHORIZED | PASS | - -#### 3.4.3 POST /logout - 退出登录 -| 序号 | 测试场景 | HTTP状态 | 业务码 | 测试结果 | -|-----|---------|---------|-------|---------| -| 1 | 正常退出 | 200 | 200 | PASS | - ---- - -## 四、前端代码审查 - -### 4.1 页面结构分析 -**文件路径**:`src/main/resources/templates/login.html` - -#### 4.1.1 UI组件 -| 组件 | 实现状态 | 说明 | -|-----|---------|-----| -| 用户名输入框 | 已实现 | 带图标、浮动标签 | -| 密码输入框 | 已实现 | 带图标、显示/隐藏切换 | -| 记住我复选框 | 已实现 | 未与后端关联 | -| 登录按钮 | 已实现 | 带Loading状态 | -| 企业微信登录 | 已实现 | 跳转OAuth授权页面 | - -#### 4.1.2 功能清单 -| 功能 | 实现状态 | 备注 | -|-----|---------|-----| -| 表单验证 | 已实现 | HTML5 required + JS校验 | -| 密码显示切换 | 已实现 | 切换input type | -| 登录Loading状态 | 已实现 | 按钮禁用+Spinner | -| 登录成功跳转 | 已实现 | 延迟500ms跳转首页 | -| 错误消息提示 | 已实现 | Toast通知 | -| 已登录检测 | 已实现 | 自动跳转首页 | -| 企业微信登录 | 已实现 | 跳转OAuth流程 | -| 回车提交 | 已实现 | 监听密码框keypress | - -### 4.2 API调用分析 - -| 功能 | API接口 | HTTP方法 | 请求体 | -|-----|--------|---------|-------| -| 账号登录 | `/api/auth/login` | POST | `{username, password}` | -| 企业微信授权 | `/api/auth/wechat/authorize` | GET (跳转) | - | - -### 4.3 安全机制 - -| 安全措施 | 实现状态 | 说明 | -|---------|---------|-----| -| Token存储 | localStorage | `training_token` 键名 | -| 请求认证 | Bearer Token | Authorization头 | -| 密码传输 | HTTPS(假设生产环境) | 明文POST | -| XSS防护 | 部分实现 | Toast消息直接插入HTML | -| CSRF防护 | 无状态JWT | 不需要CSRF Token | - -### 4.4 代码质量评估 - -#### 优点 -1. **UI设计美观**:渐变背景、圆角卡片、图标点缀 -2. **响应式设计**:移动端适配(@media max-width: 480px) -3. **用户体验好**:Loading状态、密码显示切换、错误提示 -4. **代码组织清晰**:CSS样式集中、JS逻辑分离 -5. **复用性高**:使用TrainingSystem全局对象统一管理 - -#### 潜在改进点 -1. **XSS风险**:`showMessage`函数中`${text}`直接插入HTML -2. **记住我功能**:UI存在但未实际实现(需Token持久化策略) -3. **密码强度**:无前端密码强度检查 -4. **错误重试**:无登录失败重试限制机制(后端需配合) -5. **表单校验**:缺少用户名/密码长度限制提示 - ---- - -## 五、测试总结 - -### 5.1 测试结论 -登录模块的**后端测试全部通过**,共41个测试用例,通过率**100%**。 - -### 5.2 功能完整性 -| 功能模块 | 状态 | -|---------|-----| -| JWT Token生成与验证 | 正常 | -| 用户名密码登录 | 正常 | -| 密码BCrypt加密验证 | 正常 | -| 用户状态检查 | 正常 | -| 获取当前用户信息 | 正常 | -| 退出登录 | 正常 | -| 前后端接口对接 | 正常 | -| 响应式UI | 正常 | - -### 5.3 安全性评估 -| 安全项 | 评分 | 说明 | -|-------|-----|-----| -| 密码存储 | 优 | BCrypt加密,不可逆 | -| Token安全 | 良 | HMAC256签名,24小时过期 | -| 传输安全 | - | 需确保HTTPS部署 | -| 输入验证 | 良 | 后端@NotBlank验证 | -| 异常处理 | 优 | 统一异常处理,不泄露敏感信息 | - -### 5.4 已发现并修复的问题 - -| 问题 | 文件 | 修复方式 | -|-----|-----|---------| -| JWT时间戳精度导致测试失败 | JwtUtilsTest.java | 测试延迟改为1100ms | - -### 5.5 测试文件清单 -``` -src/test/java/com/sino/training/ -├── common/utils/ -│ └── JwtUtilsTest.java (19个测试用例) -└── module/auth/ - ├── controller/ - │ └── AuthControllerTest.java (11个测试用例) - └── service/ - └── AuthServiceTest.java (11个测试用例) -``` - ---- - -## 六、附录 - -### 6.1 执行命令 -```bash -mvn test -Dtest=AuthServiceTest,AuthControllerTest,JwtUtilsTest -DfailIfNoTests=false -``` - -### 6.2 测试执行结果 -``` -[INFO] Tests run: 41, Failures: 0, Errors: 0, Skipped: 0 -[INFO] BUILD SUCCESS -``` - -### 6.3 核心代码路径 -| 模块 | 文件路径 | -|-----|---------| -| 控制器 | `src/main/java/com/sino/training/module/auth/controller/AuthController.java` | -| 服务实现 | `src/main/java/com/sino/training/module/auth/service/impl/AuthServiceImpl.java` | -| JWT工具 | `src/main/java/com/sino/training/common/utils/JwtUtils.java` | -| 认证拦截器 | `src/main/java/com/sino/training/common/interceptor/AuthInterceptor.java` | -| 前端页面 | `src/main/resources/templates/login.html` | -| 公共JS | `src/main/resources/static/js/common.js` | - ---- - -**测试工程师**:AI Testing Assistant -**报告日期**:2026-01-08 diff --git a/training-system/docs/测试报告-题库分类模块.md b/training-system/docs/测试报告-题库分类模块.md deleted file mode 100644 index eaa4359..0000000 --- a/training-system/docs/测试报告-题库分类模块.md +++ /dev/null @@ -1,219 +0,0 @@ -# 题库分类模块测试报告 - -## 一、测试概述 - -### 1.1 测试目标 -对道路救援培训系统的**题库分类模块**进行全面的前后端测试,验证其功能正确性、接口稳定性和用户体验。 - -### 1.2 测试范围 -- **后端服务层测试**:QuestionCategoryService 的单元测试 -- **后端控制器测试**:QuestionCategoryController 的接口测试 -- **前端代码审查**:question-category.html 页面功能审查 - -### 1.3 测试时间 -2026-01-08 - ---- - -## 二、后端测试 - -### 2.1 测试环境 -- **技术框架**:Spring Boot 3.1.2 + MyBatis Plus -- **测试框架**:JUnit 5 + Mockito -- **Java版本**:JDK 17 - -### 2.2 测试用例统计 - -| 测试类 | 测试方法数 | 通过 | 失败 | 通过率 | -|-------|-----------|------|-----|--------| -| QuestionCategoryServiceTest | 17 | 17 | 0 | 100% | -| QuestionCategoryControllerTest | 14 | 14 | 0 | 100% | -| **总计** | **31** | **31** | **0** | **100%** | - -### 2.3 Service层测试详情 - -#### 2.3.1 创建分类测试 (CreateCategoryTest) -| 序号 | 测试场景 | 预期结果 | 测试结果 | -|-----|---------|---------|---------| -| 1 | 正常创建分类 | 返回新建分类ID | PASS | -| 2 | 部门不存在 | 抛出BusinessException,消息包含"部门不存在" | PASS | -| 3 | 父分类不存在 | 抛出BusinessException,消息包含"父分类不存在" | PASS | -| 4 | 同级同名分类已存在 | 抛出BusinessException,消息包含"同名分类" | PASS | -| 5 | parentId为null时默认为0 | parentId自动设置为0L | PASS | - -#### 2.3.2 更新分类测试 (UpdateCategoryTest) -| 序号 | 测试场景 | 预期结果 | 测试结果 | -|-----|---------|---------|---------| -| 1 | 正常更新分类 | 更新成功,调用updateById | PASS | -| 2 | ID为空 | 抛出BusinessException,消息包含"ID不能为空" | PASS | -| 3 | 分类不存在 | 抛出BusinessException | PASS | -| 4 | 将自己设为父分类 | 抛出BusinessException,消息包含"不能将自己设为父分类" | PASS | -| 5 | 同级同名分类已存在 | 抛出BusinessException,消息包含"同名分类" | PASS | - -#### 2.3.3 删除分类测试 (DeleteCategoryTest) -| 序号 | 测试场景 | 预期结果 | 测试结果 | -|-----|---------|---------|---------| -| 1 | 分类不存在 | 抛出BusinessException | PASS | -| 2 | 存在子分类 | 抛出BusinessException,消息包含"子分类" | PASS | -| 3 | 存在关联题目 | 抛出BusinessException,消息包含"题目" | PASS | - -#### 2.3.4 获取分类详情测试 (GetCategoryDetailTest) -| 序号 | 测试场景 | 预期结果 | 测试结果 | -|-----|---------|---------|---------| -| 1 | 获取存在的分类详情 | 返回完整信息,包含父分类名称和部门名称 | PASS | -| 2 | 分类不存在 | 抛出BusinessException | PASS | - -#### 2.3.5 获取分类树测试 (GetCategoryTreeTest) -| 序号 | 测试场景 | 预期结果 | 测试结果 | -|-----|---------|---------|---------| -| 1 | 获取全部分类树 | 返回正确的树形结构 | PASS | -| 2 | 按部门ID筛选 | 返回指定部门的分类树 | PASS | - -### 2.4 Controller层测试详情 - -#### 2.4.1 GET /tree - 获取分类树 -| 序号 | 测试场景 | HTTP状态 | 业务码 | 测试结果 | -|-----|---------|---------|-------|---------| -| 1 | 无参数获取全部 | 200 | 200 | PASS | -| 2 | 按部门ID筛选 | 200 | 200 | PASS | -| 3 | 空数据返回空数组 | 200 | 200 | PASS | - -#### 2.4.2 GET /list - 获取分类列表 -| 序号 | 测试场景 | HTTP状态 | 业务码 | 测试结果 | -|-----|---------|---------|-------|---------| -| 1 | 获取列表 | 200 | 200 | PASS | - -#### 2.4.3 GET /{id} - 获取分类详情 -| 序号 | 测试场景 | HTTP状态 | 业务码 | 测试结果 | -|-----|---------|---------|-------|---------| -| 1 | 获取存在的分类 | 200 | 200 | PASS | -| 2 | 分类不存在 | 200 | 错误码 | PASS | - -#### 2.4.4 POST / - 创建分类 -| 序号 | 测试场景 | HTTP状态 | 业务码 | 测试结果 | -|-----|---------|---------|-------|---------| -| 1 | 有效数据创建 | 200 | 200 | PASS | -| 2 | 同名分类已存在 | 200 | DATA_EXISTS | PASS | - -#### 2.4.5 PUT / - 更新分类 -| 序号 | 测试场景 | HTTP状态 | 业务码 | 测试结果 | -|-----|---------|---------|-------|---------| -| 1 | 有效数据更新 | 200 | 200 | PASS | -| 2 | 分类不存在 | 200 | CATEGORY_NOT_FOUND | PASS | - -#### 2.4.6 DELETE /{id} - 删除分类 -| 序号 | 测试场景 | HTTP状态 | 业务码 | 测试结果 | -|-----|---------|---------|-------|---------| -| 1 | 删除有效分类 | 200 | 200 | PASS | -| 2 | 存在子分类 | 200 | DATA_REFERENCED | PASS | -| 3 | 存在关联题目 | 200 | DATA_REFERENCED | PASS | -| 4 | 分类不存在 | 200 | CATEGORY_NOT_FOUND | PASS | - ---- - -## 三、前端代码审查 - -### 3.1 页面结构分析 -**文件路径**:`src/main/resources/templates/exam/question-category.html` - -#### 3.1.1 页面布局 -- 左侧(40%):树形分类列表 -- 右侧(60%):分类详情展示 -- 响应式设计:支持移动端适配 - -#### 3.1.2 功能清单 -| 功能 | 实现状态 | 备注 | -|-----|---------|-----| -| 分类树展示 | 已实现 | 支持多级嵌套 | -| 展开/折叠 | 已实现 | 点击箭头图标切换 | -| 选中分类 | 已实现 | 高亮显示,展示详情 | -| 新增分类 | 已实现 | 支持顶级和子级 | -| 编辑分类 | 已实现 | 模态框编辑 | -| 删除分类 | 已实现 | 带确认提示 | -| 查看题目数量 | 已实现 | 显示在节点右侧 | -| 跳转题目列表 | 已实现 | 带分类ID参数 | - -### 3.2 API调用分析 - -| 功能 | API接口 | HTTP方法 | -|-----|--------|---------| -| 加载分类树 | `/exam/question-category/tree` | GET | -| 获取分类详情 | `/exam/question-category/{id}` | GET | -| 创建分类 | `/exam/question-category` | POST | -| 更新分类 | `/exam/question-category` | PUT | -| 删除分类 | `/exam/question-category/{id}` | DELETE | - -### 3.3 代码质量评估 - -#### 优点 -1. **结构清晰**:HTML结构层次分明,CSS样式集中管理 -2. **交互友好**:提供操作反馈(成功/失败消息) -3. **防误操作**:删除前确认提示 -4. **代码复用**:使用`TrainingSystem`全局对象统一API调用 -5. **递归渲染**:正确处理多级树形结构 - -#### 潜在改进点 -1. **XSS防护**:`item.name`直接插入HTML,建议使用转义函数 -2. **错误处理**:网络异常时可增加重试机制 -3. **加载状态**:长时间操作时可添加loading遮罩 -4. **表单验证**:前端缺少分类名称长度限制 - ---- - -## 四、测试总结 - -### 4.1 测试结论 -题库分类模块的**后端测试全部通过**,共31个测试用例,通过率**100%**。 - -### 4.2 功能完整性 -| 功能模块 | 状态 | -|---------|-----| -| 分类树结构 | 正常 | -| 分类CRUD操作 | 正常 | -| 业务规则校验 | 正常 | -| 异常处理 | 正常 | -| 前后端接口对接 | 正常 | - -### 4.3 已发现问题 - -#### 编译错误(已修复) -在测试过程中发现并修复了以下编译错误: - -| 问题 | 文件 | 修复方式 | -|-----|-----|---------| -| Long转int类型错误 | ExamServiceImpl.java:287 | 使用`.intValue()` | -| Long转int类型错误 | PaperServiceImpl.java:364 | 使用`.intValue()` | -| 方法名错误 | TrainingPlanServiceImpl.java | `getKnowledgeType()`→`getType()` | -| 字段名错误 | TrainingPlanServiceImpl.java | `setKnowledgeType`→`setType` | - -#### 测试依赖(已添加) -添加了`spring-security-test`依赖以支持安全测试。 - -### 4.4 测试文件清单 -``` -src/test/java/com/sino/training/module/exam/ -├── service/ -│ └── QuestionCategoryServiceTest.java (17个测试用例) -└── controller/ - └── QuestionCategoryControllerTest.java (14个测试用例) -``` - ---- - -## 五、附录 - -### 5.1 执行命令 -```bash -mvn test -Dtest=QuestionCategoryServiceTest,QuestionCategoryControllerTest -``` - -### 5.2 测试执行结果 -``` -[INFO] Tests run: 31, Failures: 0, Errors: 0, Skipped: 0 -[INFO] BUILD SUCCESS -``` - ---- - -**测试工程师**:AI Testing Assistant -**报告日期**:2026-01-08 diff --git a/training-system/pom.xml b/training-system/pom.xml deleted file mode 100644 index 9bade52..0000000 --- a/training-system/pom.xml +++ /dev/null @@ -1,151 +0,0 @@ - - - 4.0.0 - - - org.springframework.boot - spring-boot-starter-parent - 3.1.2 - - - - com.sino - training-system - 1.0.0 - training-system - 道路救援企业培训系统 - - - 17 - 3.5.3.1 - 4.4.0 - 5.8.22 - 3.3.2 - 4.5.0 - 2.2.0 - - - - - - org.springframework.boot - spring-boot-starter-web - - - - - org.springframework.boot - spring-boot-starter-thymeleaf - - - - - org.springframework.boot - spring-boot-starter-validation - - - - - org.springframework.boot - spring-boot-starter-security - - - - - com.baomidou - mybatis-plus-boot-starter - ${mybatis-plus.version} - - - - - com.mysql - mysql-connector-j - runtime - - - - - com.auth0 - java-jwt - ${java-jwt.version} - - - - - org.projectlombok - lombok - true - - - - - cn.hutool - hutool-all - ${hutool.version} - - - - - com.alibaba - easyexcel - ${easyexcel.version} - - - - - com.github.binarywang - weixin-java-cp - ${weixin-java.version} - - - - - org.springdoc - springdoc-openapi-starter-webmvc-ui - ${springdoc.version} - - - - - org.springframework.boot - spring-boot-devtools - runtime - true - - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - org.springframework.security - spring-security-test - test - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - org.projectlombok - lombok - - - - - - - - diff --git a/training-system/sql/init.sql b/training-system/sql/init.sql deleted file mode 100644 index bd24bdd..0000000 --- a/training-system/sql/init.sql +++ /dev/null @@ -1,405 +0,0 @@ --- ============================================= --- 道路救援企业培训系统 - 数据库初始化脚本 --- 数据库:MySQL 8.0 --- 字符集:utf8mb4 --- ============================================= - --- 创建数据库 -CREATE DATABASE IF NOT EXISTS training_system - DEFAULT CHARACTER SET utf8mb4 - DEFAULT COLLATE utf8mb4_general_ci; - -USE training_system; - --- ============================================= --- 一、系统管理模块 --- ============================================= - --- 1.1 中心表 -DROP TABLE IF EXISTS sys_center; -CREATE TABLE sys_center ( - id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', - name VARCHAR(100) NOT NULL COMMENT '中心名称', - sort_order INT DEFAULT 0 COMMENT '排序', - create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - deleted TINYINT DEFAULT 0 COMMENT '逻辑删除(0-未删除,1-已删除)', - INDEX idx_deleted (deleted) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='中心表'; - --- 1.2 部门表 -DROP TABLE IF EXISTS sys_department; -CREATE TABLE sys_department ( - id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', - name VARCHAR(100) NOT NULL COMMENT '部门名称', - center_id BIGINT NOT NULL COMMENT '所属中心ID', - sort_order INT DEFAULT 0 COMMENT '排序', - create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - deleted TINYINT DEFAULT 0 COMMENT '逻辑删除(0-未删除,1-已删除)', - INDEX idx_center_id (center_id), - INDEX idx_deleted (deleted) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='部门表'; - --- 1.3 小组表 -DROP TABLE IF EXISTS sys_group; -CREATE TABLE sys_group ( - id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', - name VARCHAR(100) NOT NULL COMMENT '小组名称', - department_id BIGINT NOT NULL COMMENT '所属部门ID', - sort_order INT DEFAULT 0 COMMENT '排序', - create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - deleted TINYINT DEFAULT 0 COMMENT '逻辑删除(0-未删除,1-已删除)', - INDEX idx_department_id (department_id), - INDEX idx_deleted (deleted) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='小组表'; - --- 1.4 用户表 -DROP TABLE IF EXISTS sys_user; -CREATE TABLE sys_user ( - id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', - wx_userid VARCHAR(100) COMMENT '企业微信用户ID', - username VARCHAR(50) NOT NULL COMMENT '用户名(登录账号)', - password VARCHAR(100) COMMENT '密码(备用登录)', - real_name VARCHAR(50) NOT NULL COMMENT '真实姓名', - phone VARCHAR(20) COMMENT '手机号', - avatar VARCHAR(255) COMMENT '头像URL', - role TINYINT NOT NULL DEFAULT 2 COMMENT '角色(0-管理员,1-讲师,2-学员)', - department_id BIGINT COMMENT '所属部门ID', - group_id BIGINT COMMENT '所属小组ID', - status TINYINT DEFAULT 0 COMMENT '状态(0-启用,1-禁用)', - create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - deleted TINYINT DEFAULT 0 COMMENT '逻辑删除(0-未删除,1-已删除)', - UNIQUE INDEX uk_username (username), - UNIQUE INDEX uk_wx_userid (wx_userid), - INDEX idx_department_id (department_id), - INDEX idx_role (role), - INDEX idx_deleted (deleted) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表'; - --- ============================================= --- 二、知识库模块 --- ============================================= - --- 2.1 知识分类表 -DROP TABLE IF EXISTS km_category; -CREATE TABLE km_category ( - id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', - name VARCHAR(100) NOT NULL COMMENT '分类名称', - parent_id BIGINT DEFAULT 0 COMMENT '父分类ID(0为顶级)', - department_id BIGINT NOT NULL COMMENT '所属部门ID', - sort_order INT DEFAULT 0 COMMENT '排序', - create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - deleted TINYINT DEFAULT 0 COMMENT '逻辑删除(0-未删除,1-已删除)', - INDEX idx_parent_id (parent_id), - INDEX idx_department_id (department_id), - INDEX idx_deleted (deleted) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='知识分类表'; - --- 2.2 知识表 -DROP TABLE IF EXISTS km_knowledge; -CREATE TABLE km_knowledge ( - id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', - title VARCHAR(200) NOT NULL COMMENT '标题', - description TEXT COMMENT '描述/摘要', - category_id BIGINT COMMENT '所属分类ID', - type TINYINT NOT NULL COMMENT '类型(0-文档,1-视频)', - file_name VARCHAR(255) COMMENT '文件名', - file_url VARCHAR(500) COMMENT '文件URL', - file_size BIGINT DEFAULT 0 COMMENT '文件大小(字节)', - file_type VARCHAR(20) COMMENT '文件类型/后缀', - department_id BIGINT NOT NULL COMMENT '所属部门ID', - status TINYINT DEFAULT 0 COMMENT '状态(0-草稿,1-已发布,2-已下架)', - creator_id BIGINT NOT NULL COMMENT '创建人ID', - publish_time DATETIME COMMENT '发布时间', - view_count INT DEFAULT 0 COMMENT '浏览次数', - create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - deleted TINYINT DEFAULT 0 COMMENT '逻辑删除(0-未删除,1-已删除)', - INDEX idx_category_id (category_id), - INDEX idx_department_id (department_id), - INDEX idx_status (status), - INDEX idx_creator_id (creator_id), - INDEX idx_deleted (deleted) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='知识表'; - --- ============================================= --- 三、考试模块 --- ============================================= - --- 3.1 题目分类表 -DROP TABLE IF EXISTS ex_question_category; -CREATE TABLE ex_question_category ( - id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', - name VARCHAR(100) NOT NULL COMMENT '分类名称', - parent_id BIGINT DEFAULT 0 COMMENT '父分类ID(0为顶级)', - department_id BIGINT NOT NULL COMMENT '所属部门ID', - sort_order INT DEFAULT 0 COMMENT '排序', - create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - deleted TINYINT DEFAULT 0 COMMENT '逻辑删除(0-未删除,1-已删除)', - INDEX idx_parent_id (parent_id), - INDEX idx_department_id (department_id), - INDEX idx_deleted (deleted) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='题目分类表'; - --- 3.2 题目表 -DROP TABLE IF EXISTS ex_question; -CREATE TABLE ex_question ( - id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', - type TINYINT NOT NULL COMMENT '题型(0-单选,1-多选,2-判断)', - content TEXT NOT NULL COMMENT '题干内容', - options JSON COMMENT '选项(JSON格式)', - answer VARCHAR(50) NOT NULL COMMENT '正确答案', - analysis TEXT COMMENT '答案解析', - category_id BIGINT COMMENT '所属分类ID', - department_id BIGINT NOT NULL COMMENT '所属部门ID', - status TINYINT DEFAULT 0 COMMENT '状态(0-草稿,1-已发布,2-已下架)', - creator_id BIGINT NOT NULL COMMENT '创建人ID', - publish_time DATETIME COMMENT '发布时间', - create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - deleted TINYINT DEFAULT 0 COMMENT '逻辑删除(0-未删除,1-已删除)', - INDEX idx_type (type), - INDEX idx_category_id (category_id), - INDEX idx_department_id (department_id), - INDEX idx_status (status), - INDEX idx_deleted (deleted) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='题目表'; - --- 3.3 试卷表 -DROP TABLE IF EXISTS ex_paper; -CREATE TABLE ex_paper ( - id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', - title VARCHAR(200) NOT NULL COMMENT '试卷标题', - description TEXT COMMENT '试卷描述', - total_score INT NOT NULL DEFAULT 100 COMMENT '总分', - duration INT NOT NULL DEFAULT 60 COMMENT '考试时长(分钟)', - pass_score INT NOT NULL DEFAULT 60 COMMENT '及格分数', - department_id BIGINT NOT NULL COMMENT '所属部门ID', - status TINYINT DEFAULT 0 COMMENT '状态(0-草稿,1-已发布,2-已下架)', - creator_id BIGINT NOT NULL COMMENT '创建人ID', - publish_time DATETIME COMMENT '发布时间', - create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - deleted TINYINT DEFAULT 0 COMMENT '逻辑删除(0-未删除,1-已删除)', - INDEX idx_department_id (department_id), - INDEX idx_status (status), - INDEX idx_deleted (deleted) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='试卷表'; - --- 3.4 试卷题目关联表 -DROP TABLE IF EXISTS ex_paper_question; -CREATE TABLE ex_paper_question ( - id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', - paper_id BIGINT NOT NULL COMMENT '试卷ID', - question_id BIGINT NOT NULL COMMENT '题目ID', - score INT NOT NULL DEFAULT 5 COMMENT '该题分值', - sort_order INT DEFAULT 0 COMMENT '排序', - create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - deleted TINYINT DEFAULT 0 COMMENT '逻辑删除(0-未删除,1-已删除)', - INDEX idx_paper_id (paper_id), - INDEX idx_question_id (question_id), - INDEX idx_deleted (deleted) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='试卷题目关联表'; - --- 3.5 考试表 -DROP TABLE IF EXISTS ex_exam; -CREATE TABLE ex_exam ( - id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', - title VARCHAR(200) NOT NULL COMMENT '考试标题', - description TEXT COMMENT '考试描述', - paper_id BIGINT NOT NULL COMMENT '关联试卷ID', - start_time DATETIME NOT NULL COMMENT '开始时间', - end_time DATETIME NOT NULL COMMENT '结束时间', - max_attempts INT DEFAULT 1 COMMENT '最大考试次数', - department_id BIGINT NOT NULL COMMENT '所属部门ID', - status TINYINT DEFAULT 0 COMMENT '状态(0-未开始,1-进行中,2-已结束)', - creator_id BIGINT NOT NULL COMMENT '创建人ID', - create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - deleted TINYINT DEFAULT 0 COMMENT '逻辑删除(0-未删除,1-已删除)', - INDEX idx_paper_id (paper_id), - INDEX idx_department_id (department_id), - INDEX idx_status (status), - INDEX idx_start_time (start_time), - INDEX idx_end_time (end_time), - INDEX idx_deleted (deleted) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='考试表'; - --- 3.6 考试对象表 -DROP TABLE IF EXISTS ex_exam_target; -CREATE TABLE ex_exam_target ( - id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', - exam_id BIGINT NOT NULL COMMENT '考试ID', - target_type TINYINT NOT NULL COMMENT '目标类型(0-部门,1-小组,2-个人)', - target_id BIGINT NOT NULL COMMENT '目标ID', - create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - deleted TINYINT DEFAULT 0 COMMENT '逻辑删除(0-未删除,1-已删除)', - INDEX idx_exam_id (exam_id), - INDEX idx_target (target_type, target_id), - INDEX idx_deleted (deleted) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='考试对象表'; - --- 3.7 考试记录表 -DROP TABLE IF EXISTS ex_exam_record; -CREATE TABLE ex_exam_record ( - id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', - exam_id BIGINT NOT NULL COMMENT '考试ID', - user_id BIGINT NOT NULL COMMENT '用户ID', - attempt_no INT NOT NULL DEFAULT 1 COMMENT '第几次考试', - score INT COMMENT '得分', - passed TINYINT COMMENT '是否通过(0-否,1-是)', - start_time DATETIME NOT NULL COMMENT '开始时间', - submit_time DATETIME COMMENT '提交时间', - answers JSON COMMENT '答题详情(JSON格式)', - status TINYINT DEFAULT 0 COMMENT '状态(0-进行中,1-已提交)', - create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - deleted TINYINT DEFAULT 0 COMMENT '逻辑删除(0-未删除,1-已删除)', - INDEX idx_exam_id (exam_id), - INDEX idx_user_id (user_id), - INDEX idx_exam_user (exam_id, user_id), - INDEX idx_deleted (deleted) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='考试记录表'; - --- ============================================= --- 四、培训模块 --- ============================================= - --- 4.1 培训计划表 -DROP TABLE IF EXISTS tr_plan; -CREATE TABLE tr_plan ( - id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', - title VARCHAR(200) NOT NULL COMMENT '计划标题', - description TEXT COMMENT '计划描述', - start_date DATE NOT NULL COMMENT '开始日期', - end_date DATE NOT NULL COMMENT '结束日期', - department_id BIGINT NOT NULL COMMENT '所属部门ID', - status TINYINT DEFAULT 0 COMMENT '状态(0-未开始,1-进行中,2-已结束)', - creator_id BIGINT NOT NULL COMMENT '创建人ID', - create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - deleted TINYINT DEFAULT 0 COMMENT '逻辑删除(0-未删除,1-已删除)', - INDEX idx_department_id (department_id), - INDEX idx_status (status), - INDEX idx_start_date (start_date), - INDEX idx_end_date (end_date), - INDEX idx_deleted (deleted) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='培训计划表'; - --- 4.2 培训计划-知识关联表 -DROP TABLE IF EXISTS tr_plan_knowledge; -CREATE TABLE tr_plan_knowledge ( - id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', - plan_id BIGINT NOT NULL COMMENT '计划ID', - knowledge_id BIGINT NOT NULL COMMENT '知识ID', - required TINYINT DEFAULT 1 COMMENT '是否必修(0-选修,1-必修)', - sort_order INT DEFAULT 0 COMMENT '排序', - create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - deleted TINYINT DEFAULT 0 COMMENT '逻辑删除(0-未删除,1-已删除)', - INDEX idx_plan_id (plan_id), - INDEX idx_knowledge_id (knowledge_id), - INDEX idx_deleted (deleted) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='培训计划-知识关联表'; - --- 4.2.1 培训计划-考试关联表 -DROP TABLE IF EXISTS tr_plan_exam; -CREATE TABLE tr_plan_exam ( - id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', - plan_id BIGINT NOT NULL COMMENT '计划ID', - exam_id BIGINT NOT NULL COMMENT '考试ID', - required TINYINT DEFAULT 1 COMMENT '是否必考(0-选考,1-必考)', - sort_order INT DEFAULT 0 COMMENT '排序', - create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - deleted TINYINT DEFAULT 0 COMMENT '逻辑删除(0-未删除,1-已删除)', - INDEX idx_plan_id (plan_id), - INDEX idx_exam_id (exam_id), - INDEX idx_deleted (deleted) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='培训计划-考试关联表'; - --- 4.3 培训计划-对象关联表 -DROP TABLE IF EXISTS tr_plan_target; -CREATE TABLE tr_plan_target ( - id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', - plan_id BIGINT NOT NULL COMMENT '计划ID', - target_type TINYINT NOT NULL COMMENT '目标类型(0-部门,1-小组,2-个人)', - target_id BIGINT NOT NULL COMMENT '目标ID', - create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - deleted TINYINT DEFAULT 0 COMMENT '逻辑删除(0-未删除,1-已删除)', - INDEX idx_plan_id (plan_id), - INDEX idx_target (target_type, target_id), - INDEX idx_deleted (deleted) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='培训计划-对象关联表'; - --- 4.4 培训进度表 -DROP TABLE IF EXISTS tr_plan_progress; -CREATE TABLE tr_plan_progress ( - id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', - plan_id BIGINT NOT NULL COMMENT '计划ID', - user_id BIGINT NOT NULL COMMENT '用户ID', - knowledge_id BIGINT NOT NULL COMMENT '知识ID', - completed TINYINT DEFAULT 0 COMMENT '是否完成(0-否,1-是)', - complete_time DATETIME COMMENT '完成时间', - create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', - deleted TINYINT DEFAULT 0 COMMENT '逻辑删除(0-未删除,1-已删除)', - INDEX idx_plan_id (plan_id), - INDEX idx_user_id (user_id), - INDEX idx_knowledge_id (knowledge_id), - INDEX idx_plan_user (plan_id, user_id), - INDEX idx_deleted (deleted) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='培训进度表'; - --- ============================================= --- 五、初始化数据 --- ============================================= - --- 5.1 初始化中心 -INSERT INTO sys_center (name, sort_order) VALUES -('总部', 1); - --- 5.2 初始化部门 -INSERT INTO sys_department (name, center_id, sort_order) VALUES -('救援一部', 1, 1), -('救援二部', 1, 2), -('客服中心', 1, 3), -('技术支持部', 1, 4); - --- 5.3 初始化小组 -INSERT INTO sys_group (name, department_id, sort_order) VALUES -('一组', 1, 1), -('二组', 1, 2), -('三组', 1, 3), -('一组', 2, 1), -('二组', 2, 2); - --- 5.4 初始化管理员账号 (密码: admin123,使用BCrypt加密) --- BCrypt密码生成: new BCryptPasswordEncoder().encode("admin123") -INSERT INTO sys_user (username, password, real_name, phone, role, department_id, status) VALUES -('admin', '$2a$10$TWbA.Dgh6pjuVoLZzRod3usjs7fOyyofpTVCi1mz.okHtO55vGgBW', '系统管理员', '13800138000', 0, 1, 0); - --- 5.5 初始化知识分类 -INSERT INTO km_category (name, parent_id, department_id, sort_order) VALUES -('安全规范', 0, 1, 1), -('操作手册', 0, 1, 2), -('应急流程', 0, 1, 3); - --- 5.6 初始化题目分类 -INSERT INTO ex_question_category (name, parent_id, department_id, sort_order) VALUES -('安全知识', 0, 1, 1), -('操作规范', 0, 1, 2), -('应急处理', 0, 1, 3); - --- ============================================= --- 完成 --- ============================================= -SELECT '数据库初始化完成!' AS message; diff --git a/training-system/src/main/java/com/sino/training/TrainingApplication.java b/training-system/src/main/java/com/sino/training/TrainingApplication.java deleted file mode 100644 index 128aa68..0000000 --- a/training-system/src/main/java/com/sino/training/TrainingApplication.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.sino.training; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -/** - * 道路救援企业培训系统 - 启动类 - * - * @author training-system - */ -@SpringBootApplication -public class TrainingApplication { - - public static void main(String[] args) { - SpringApplication.run(TrainingApplication.class, args); - } - -} diff --git a/training-system/src/main/java/com/sino/training/common/annotation/RequireRole.java b/training-system/src/main/java/com/sino/training/common/annotation/RequireRole.java deleted file mode 100644 index a674a32..0000000 --- a/training-system/src/main/java/com/sino/training/common/annotation/RequireRole.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.sino.training.common.annotation; - -import com.sino.training.common.enums.UserRole; - -import java.lang.annotation.*; - -/** - * 角色权限注解 - * 标注在Controller类或方法上,限制访问角色 - * - * @author training-system - */ -@Target({ElementType.TYPE, ElementType.METHOD}) -@Retention(RetentionPolicy.RUNTIME) -@Documented -public @interface RequireRole { - - /** - * 允许访问的角色列表 - */ - UserRole[] value(); -} diff --git a/training-system/src/main/java/com/sino/training/common/base/BaseEntity.java b/training-system/src/main/java/com/sino/training/common/base/BaseEntity.java deleted file mode 100644 index 35697b5..0000000 --- a/training-system/src/main/java/com/sino/training/common/base/BaseEntity.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.sino.training.common.base; - -import com.baomidou.mybatisplus.annotation.*; -import lombok.Data; - -import java.io.Serializable; -import java.time.LocalDateTime; - -/** - * 实体基类 - * - * @author training-system - */ -@Data -public abstract class BaseEntity implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * 主键ID - */ - @TableId(type = IdType.AUTO) - private Long id; - - /** - * 创建时间 - */ - @TableField(fill = FieldFill.INSERT) - private LocalDateTime createTime; - - /** - * 更新时间 - */ - @TableField(fill = FieldFill.INSERT_UPDATE) - private LocalDateTime updateTime; - - /** - * 逻辑删除标识(0-未删除,1-已删除) - */ - @TableLogic - @TableField(fill = FieldFill.INSERT) - private Integer deleted; -} diff --git a/training-system/src/main/java/com/sino/training/common/base/PageQuery.java b/training-system/src/main/java/com/sino/training/common/base/PageQuery.java deleted file mode 100644 index 7eb12bb..0000000 --- a/training-system/src/main/java/com/sino/training/common/base/PageQuery.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.sino.training.common.base; - -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import lombok.Data; - -import java.io.Serializable; - -/** - * 分页查询基类 - * - * @author training-system - */ -@Data -public class PageQuery implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * 当前页码(默认1) - */ - private Integer current = 1; - - /** - * 每页大小(默认10) - */ - private Integer size = 10; - - /** - * 转换为 MyBatis Plus 分页对象 - */ - public Page toPage() { - return new Page<>(current, size); - } -} diff --git a/training-system/src/main/java/com/sino/training/common/config/MybatisPlusConfig.java b/training-system/src/main/java/com/sino/training/common/config/MybatisPlusConfig.java deleted file mode 100644 index af5f411..0000000 --- a/training-system/src/main/java/com/sino/training/common/config/MybatisPlusConfig.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.sino.training.common.config; - -import com.baomidou.mybatisplus.annotation.DbType; -import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; -import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; -import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; -import org.apache.ibatis.reflection.MetaObject; -import org.mybatis.spring.annotation.MapperScan; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import java.time.LocalDateTime; - -/** - * MyBatis Plus 配置 - * - * @author training-system - */ -@Configuration -@MapperScan("com.sino.training.module.*.mapper") -public class MybatisPlusConfig { - - /** - * 分页插件配置 - */ - @Bean - public MybatisPlusInterceptor mybatisPlusInterceptor() { - MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); - // 分页插件 - PaginationInnerInterceptor paginationInterceptor = new PaginationInnerInterceptor(DbType.MYSQL); - paginationInterceptor.setMaxLimit(500L); - interceptor.addInnerInterceptor(paginationInterceptor); - return interceptor; - } - - /** - * 自动填充配置 - */ - @Bean - public MetaObjectHandler metaObjectHandler() { - return new MetaObjectHandler() { - @Override - public void insertFill(MetaObject metaObject) { - this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now()); - this.strictInsertFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now()); - this.strictInsertFill(metaObject, "deleted", Integer.class, 0); - } - - @Override - public void updateFill(MetaObject metaObject) { - this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now()); - } - }; - } -} diff --git a/training-system/src/main/java/com/sino/training/common/config/SecurityConfig.java b/training-system/src/main/java/com/sino/training/common/config/SecurityConfig.java deleted file mode 100644 index f3ccae7..0000000 --- a/training-system/src/main/java/com/sino/training/common/config/SecurityConfig.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.sino.training.common.config; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer; -import org.springframework.security.config.http.SessionCreationPolicy; -import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; -import org.springframework.security.crypto.password.PasswordEncoder; -import org.springframework.security.web.SecurityFilterChain; - -/** - * Spring Security 配置 - * 注:本项目使用自定义JWT认证,禁用Spring Security的默认认证 - * - * @author training-system - */ -@Configuration -@EnableWebSecurity -public class SecurityConfig { - - /** - * 密码编码器 - */ - @Bean - public PasswordEncoder passwordEncoder() { - return new BCryptPasswordEncoder(); - } - - /** - * 安全过滤链配置 - * 禁用Spring Security的默认认证,使用自定义JWT认证 - */ - @Bean - public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { - http - // 禁用CSRF(使用JWT不需要CSRF) - .csrf(AbstractHttpConfigurer::disable) - // 禁用表单登录 - .formLogin(AbstractHttpConfigurer::disable) - // 禁用HTTP Basic认证 - .httpBasic(AbstractHttpConfigurer::disable) - // 无状态会话 - .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) - // 允许所有请求(认证由自定义拦截器处理) - .authorizeHttpRequests(auth -> auth.anyRequest().permitAll()); - - return http.build(); - } -} diff --git a/training-system/src/main/java/com/sino/training/common/config/SwaggerConfig.java b/training-system/src/main/java/com/sino/training/common/config/SwaggerConfig.java deleted file mode 100644 index 72fe066..0000000 --- a/training-system/src/main/java/com/sino/training/common/config/SwaggerConfig.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.sino.training.common.config; - -import io.swagger.v3.oas.models.OpenAPI; -import io.swagger.v3.oas.models.info.Contact; -import io.swagger.v3.oas.models.info.Info; -import io.swagger.v3.oas.models.security.SecurityRequirement; -import io.swagger.v3.oas.models.security.SecurityScheme; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -/** - * Swagger API 文档配置 - * - * @author training-system - */ -@Configuration -public class SwaggerConfig { - - @Bean - public OpenAPI openAPI() { - return new OpenAPI() - .info(new Info() - .title("道路救援企业培训系统 API") - .description("企业内部培训管理系统接口文档") - .version("1.0.0") - .contact(new Contact() - .name("Training System") - .email("admin@training.com"))) - .schemaRequirement("Bearer", new SecurityScheme() - .type(SecurityScheme.Type.HTTP) - .scheme("bearer") - .bearerFormat("JWT") - .in(SecurityScheme.In.HEADER) - .name("Authorization")) - .addSecurityItem(new SecurityRequirement().addList("Bearer")); - } -} diff --git a/training-system/src/main/java/com/sino/training/common/config/WebMvcConfig.java b/training-system/src/main/java/com/sino/training/common/config/WebMvcConfig.java deleted file mode 100644 index 906f67e..0000000 --- a/training-system/src/main/java/com/sino/training/common/config/WebMvcConfig.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.sino.training.common.config; - -import com.sino.training.common.interceptor.AuthInterceptor; -import com.sino.training.common.interceptor.RoleInterceptor; -import lombok.RequiredArgsConstructor; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.servlet.config.annotation.CorsRegistry; -import org.springframework.web.servlet.config.annotation.InterceptorRegistry; -import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; - -/** - * Web MVC 配置 - * - * @author training-system - */ -@Configuration -@RequiredArgsConstructor -public class WebMvcConfig implements WebMvcConfigurer { - - private final AuthInterceptor authInterceptor; - private final RoleInterceptor roleInterceptor; - - /** - * 跨域配置 - */ - @Override - public void addCorsMappings(CorsRegistry registry) { - registry.addMapping("/**") - .allowedOriginPatterns("*") - .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") - .allowedHeaders("*") - .allowCredentials(true) - .maxAge(3600); - } - - /** - * 拦截器配置 - */ - @Override - public void addInterceptors(InterceptorRegistry registry) { - // 认证拦截器(先执行) - registry.addInterceptor(authInterceptor) - .addPathPatterns("/api/**") - .excludePathPatterns( - "/api/auth/login", - "/api/auth/wechat/**", - "/api/public/**" - ); - - // 角色权限拦截器(后执行,需要依赖认证拦截器设置的UserContext) - registry.addInterceptor(roleInterceptor) - .addPathPatterns("/api/**") - .excludePathPatterns( - "/api/auth/login", - "/api/auth/wechat/**", - "/api/public/**" - ); - } - - /** - * 静态资源配置 - */ - @Override - public void addResourceHandlers(ResourceHandlerRegistry registry) { - // 上传文件访问路径 - registry.addResourceHandler("/uploads/**") - .addResourceLocations("file:./uploads/"); - // 静态资源 - registry.addResourceHandler("/static/**") - .addResourceLocations("classpath:/static/"); - } -} diff --git a/training-system/src/main/java/com/sino/training/common/context/UserContext.java b/training-system/src/main/java/com/sino/training/common/context/UserContext.java deleted file mode 100644 index 4731d27..0000000 --- a/training-system/src/main/java/com/sino/training/common/context/UserContext.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.sino.training.common.context; - -import lombok.Data; - -import java.io.Serializable; - -/** - * 用户上下文信息 - * - * @author training-system - */ -@Data -public class UserContext implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * 用户ID - */ - private Long userId; - - /** - * 用户名 - */ - private String username; - - /** - * 真实姓名 - */ - private String realName; - - /** - * 用户角色 - */ - private String role; - - /** - * 部门ID - */ - private Long departmentId; - - /** - * 小组ID - */ - private Long groupId; - - public UserContext() { - } - - public UserContext(Long userId, String username, String role) { - this.userId = userId; - this.username = username; - this.role = role; - } -} diff --git a/training-system/src/main/java/com/sino/training/common/context/UserContextHolder.java b/training-system/src/main/java/com/sino/training/common/context/UserContextHolder.java deleted file mode 100644 index 4a4a64f..0000000 --- a/training-system/src/main/java/com/sino/training/common/context/UserContextHolder.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.sino.training.common.context; - -/** - * 用户上下文持有者(基于ThreadLocal) - * - * @author training-system - */ -public class UserContextHolder { - - private static final ThreadLocal CONTEXT_HOLDER = new ThreadLocal<>(); - - private UserContextHolder() { - } - - /** - * 设置用户上下文 - * - * @param context 用户上下文 - */ - public static void setContext(UserContext context) { - CONTEXT_HOLDER.set(context); - } - - /** - * 获取用户上下文 - * - * @return 用户上下文 - */ - public static UserContext getContext() { - return CONTEXT_HOLDER.get(); - } - - /** - * 清除用户上下文 - */ - public static void clearContext() { - CONTEXT_HOLDER.remove(); - } -} diff --git a/training-system/src/main/java/com/sino/training/common/controller/FileController.java b/training-system/src/main/java/com/sino/training/common/controller/FileController.java deleted file mode 100644 index 9d28acd..0000000 --- a/training-system/src/main/java/com/sino/training/common/controller/FileController.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.sino.training.common.controller; - -import com.sino.training.common.dto.FileDTO; -import com.sino.training.common.result.Result; -import com.sino.training.common.service.FileService; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.tags.Tag; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.*; -import org.springframework.web.multipart.MultipartFile; - -/** - * 文件上传控制器 - * - * @author training-system - */ -@Tag(name = "文件管理", description = "文件上传下载接口") -@RestController -@RequestMapping("/api/file") -@RequiredArgsConstructor -public class FileController { - - private final FileService fileService; - - @Operation(summary = "上传文件") - @PostMapping("/upload") - public Result upload( - @Parameter(description = "文件") @RequestParam("file") MultipartFile file, - @Parameter(description = "子文件夹") @RequestParam(value = "folder", defaultValue = "common") String folder) { - return Result.success(fileService.upload(file, folder)); - } - - @Operation(summary = "上传知识库文档") - @PostMapping("/upload/document") - public Result uploadDocument(@RequestParam("file") MultipartFile file) { - return Result.success(fileService.upload(file, "knowledge/document")); - } - - @Operation(summary = "上传知识库视频") - @PostMapping("/upload/video") - public Result uploadVideo(@RequestParam("file") MultipartFile file) { - return Result.success(fileService.upload(file, "knowledge/video")); - } - - @Operation(summary = "删除文件") - @DeleteMapping("/delete") - public Result delete(@Parameter(description = "文件URL") @RequestParam String fileUrl) { - return Result.success(fileService.delete(fileUrl)); - } -} diff --git a/training-system/src/main/java/com/sino/training/common/dto/FileDTO.java b/training-system/src/main/java/com/sino/training/common/dto/FileDTO.java deleted file mode 100644 index 26d4e73..0000000 --- a/training-system/src/main/java/com/sino/training/common/dto/FileDTO.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.sino.training.common.dto; - -import lombok.Data; - -import java.io.Serializable; - -/** - * 文件信息DTO - * - * @author training-system - */ -@Data -public class FileDTO implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * 原始文件名 - */ - private String originalName; - - /** - * 存储文件名 - */ - private String storageName; - - /** - * 文件URL - */ - private String url; - - /** - * 文件大小(字节) - */ - private Long size; - - /** - * 文件类型/后缀 - */ - private String type; -} diff --git a/training-system/src/main/java/com/sino/training/common/enums/ContentStatus.java b/training-system/src/main/java/com/sino/training/common/enums/ContentStatus.java deleted file mode 100644 index 02beecf..0000000 --- a/training-system/src/main/java/com/sino/training/common/enums/ContentStatus.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.sino.training.common.enums; - -import com.baomidou.mybatisplus.annotation.EnumValue; -import com.fasterxml.jackson.annotation.JsonValue; -import lombok.Getter; - -/** - * 内容状态枚举(知识库、题目、试卷) - * - * @author training-system - */ -@Getter -public enum ContentStatus { - - /** - * 草稿 - */ - DRAFT(0, "草稿"), - - /** - * 已发布 - */ - PUBLISHED(1, "已发布"), - - /** - * 已下架 - */ - OFFLINE(2, "已下架"); - - @EnumValue - private final int code; - - @JsonValue - private final String desc; - - ContentStatus(int code, String desc) { - this.code = code; - this.desc = desc; - } - - public static ContentStatus of(int code) { - for (ContentStatus status : values()) { - if (status.getCode() == code) { - return status; - } - } - return null; - } -} diff --git a/training-system/src/main/java/com/sino/training/common/enums/ExamStatus.java b/training-system/src/main/java/com/sino/training/common/enums/ExamStatus.java deleted file mode 100644 index af81a8e..0000000 --- a/training-system/src/main/java/com/sino/training/common/enums/ExamStatus.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.sino.training.common.enums; - -import com.baomidou.mybatisplus.annotation.EnumValue; -import com.fasterxml.jackson.annotation.JsonValue; -import lombok.Getter; - -/** - * 考试状态枚举 - * - * @author training-system - */ -@Getter -public enum ExamStatus { - - /** - * 未开始 - */ - NOT_STARTED(0, "未开始"), - - /** - * 进行中 - */ - IN_PROGRESS(1, "进行中"), - - /** - * 已结束 - */ - ENDED(2, "已结束"); - - @EnumValue - private final int code; - - @JsonValue - private final String desc; - - ExamStatus(int code, String desc) { - this.code = code; - this.desc = desc; - } - - public static ExamStatus of(int code) { - for (ExamStatus status : values()) { - if (status.getCode() == code) { - return status; - } - } - return null; - } -} diff --git a/training-system/src/main/java/com/sino/training/common/enums/KnowledgeType.java b/training-system/src/main/java/com/sino/training/common/enums/KnowledgeType.java deleted file mode 100644 index 611dc11..0000000 --- a/training-system/src/main/java/com/sino/training/common/enums/KnowledgeType.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.sino.training.common.enums; - -import com.baomidou.mybatisplus.annotation.EnumValue; -import com.fasterxml.jackson.annotation.JsonValue; -import lombok.Getter; - -/** - * 知识类型枚举 - * - * @author training-system - */ -@Getter -public enum KnowledgeType { - - /** - * 文档 - */ - DOCUMENT(0, "文档"), - - /** - * 视频 - */ - VIDEO(1, "视频"); - - @EnumValue - private final int code; - - @JsonValue - private final String desc; - - KnowledgeType(int code, String desc) { - this.code = code; - this.desc = desc; - } - - public static KnowledgeType of(int code) { - for (KnowledgeType type : values()) { - if (type.getCode() == code) { - return type; - } - } - return null; - } -} diff --git a/training-system/src/main/java/com/sino/training/common/enums/PlanStatus.java b/training-system/src/main/java/com/sino/training/common/enums/PlanStatus.java deleted file mode 100644 index 3dfee78..0000000 --- a/training-system/src/main/java/com/sino/training/common/enums/PlanStatus.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.sino.training.common.enums; - -import com.baomidou.mybatisplus.annotation.EnumValue; -import com.fasterxml.jackson.annotation.JsonValue; -import lombok.Getter; - -/** - * 培训计划状态枚举 - * - * @author training-system - */ -@Getter -public enum PlanStatus { - - /** - * 未开始 - */ - NOT_STARTED(0, "未开始"), - - /** - * 进行中 - */ - IN_PROGRESS(1, "进行中"), - - /** - * 已结束 - */ - ENDED(2, "已结束"); - - @EnumValue - private final int code; - - @JsonValue - private final String desc; - - PlanStatus(int code, String desc) { - this.code = code; - this.desc = desc; - } - - public static PlanStatus of(int code) { - for (PlanStatus status : values()) { - if (status.getCode() == code) { - return status; - } - } - return null; - } -} diff --git a/training-system/src/main/java/com/sino/training/common/enums/QuestionType.java b/training-system/src/main/java/com/sino/training/common/enums/QuestionType.java deleted file mode 100644 index ffa07b7..0000000 --- a/training-system/src/main/java/com/sino/training/common/enums/QuestionType.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.sino.training.common.enums; - -import com.baomidou.mybatisplus.annotation.EnumValue; -import com.fasterxml.jackson.annotation.JsonValue; -import lombok.Getter; - -/** - * 题目类型枚举 - * - * @author training-system - */ -@Getter -public enum QuestionType { - - /** - * 单选题 - */ - SINGLE(0, "单选题"), - - /** - * 多选题 - */ - MULTIPLE(1, "多选题"), - - /** - * 判断题 - */ - JUDGE(2, "判断题"); - - @EnumValue - private final int code; - - @JsonValue - private final String desc; - - QuestionType(int code, String desc) { - this.code = code; - this.desc = desc; - } - - public static QuestionType of(int code) { - for (QuestionType type : values()) { - if (type.getCode() == code) { - return type; - } - } - return null; - } -} diff --git a/training-system/src/main/java/com/sino/training/common/enums/TargetType.java b/training-system/src/main/java/com/sino/training/common/enums/TargetType.java deleted file mode 100644 index 186d2e2..0000000 --- a/training-system/src/main/java/com/sino/training/common/enums/TargetType.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.sino.training.common.enums; - -import com.baomidou.mybatisplus.annotation.EnumValue; -import com.fasterxml.jackson.annotation.JsonValue; -import lombok.Getter; - -/** - * 目标类型枚举(考试/培训对象) - * - * @author training-system - */ -@Getter -public enum TargetType { - - /** - * 部门 - */ - DEPARTMENT(0, "部门"), - - /** - * 小组 - */ - GROUP(1, "小组"), - - /** - * 个人 - */ - USER(2, "个人"); - - @EnumValue - private final int code; - - @JsonValue - private final String desc; - - TargetType(int code, String desc) { - this.code = code; - this.desc = desc; - } - - public static TargetType of(int code) { - for (TargetType type : values()) { - if (type.getCode() == code) { - return type; - } - } - return null; - } -} diff --git a/training-system/src/main/java/com/sino/training/common/enums/UserRole.java b/training-system/src/main/java/com/sino/training/common/enums/UserRole.java deleted file mode 100644 index ac9f096..0000000 --- a/training-system/src/main/java/com/sino/training/common/enums/UserRole.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.sino.training.common.enums; - -import com.baomidou.mybatisplus.annotation.EnumValue; -import com.fasterxml.jackson.annotation.JsonValue; -import lombok.Getter; - -/** - * 用户角色枚举 - * - * @author training-system - */ -@Getter -public enum UserRole { - - /** - * 管理员 - */ - ADMIN(0, "管理员"), - - /** - * 讲师 - */ - LECTURER(1, "讲师"), - - /** - * 学员 - */ - STUDENT(2, "学员"); - - @EnumValue - private final int code; - - @JsonValue - private final String desc; - - UserRole(int code, String desc) { - this.code = code; - this.desc = desc; - } - - public static UserRole of(int code) { - for (UserRole role : values()) { - if (role.getCode() == code) { - return role; - } - } - return null; - } -} diff --git a/training-system/src/main/java/com/sino/training/common/enums/UserStatus.java b/training-system/src/main/java/com/sino/training/common/enums/UserStatus.java deleted file mode 100644 index 79fec6a..0000000 --- a/training-system/src/main/java/com/sino/training/common/enums/UserStatus.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.sino.training.common.enums; - -import com.baomidou.mybatisplus.annotation.EnumValue; -import com.fasterxml.jackson.annotation.JsonValue; -import lombok.Getter; - -/** - * 用户状态枚举 - * - * @author training-system - */ -@Getter -public enum UserStatus { - - /** - * 启用 - */ - ENABLED(0, "启用"), - - /** - * 禁用 - */ - DISABLED(1, "禁用"); - - @EnumValue - private final int code; - - @JsonValue - private final String desc; - - UserStatus(int code, String desc) { - this.code = code; - this.desc = desc; - } - - public static UserStatus of(int code) { - for (UserStatus status : values()) { - if (status.getCode() == code) { - return status; - } - } - return null; - } -} diff --git a/training-system/src/main/java/com/sino/training/common/exception/BusinessException.java b/training-system/src/main/java/com/sino/training/common/exception/BusinessException.java deleted file mode 100644 index 3536710..0000000 --- a/training-system/src/main/java/com/sino/training/common/exception/BusinessException.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.sino.training.common.exception; - -import com.sino.training.common.result.ResultCode; -import lombok.Getter; - -/** - * 业务异常 - * - * @author training-system - */ -@Getter -public class BusinessException extends RuntimeException { - - private static final long serialVersionUID = 1L; - - /** - * 错误码 - */ - private final int code; - - /** - * 错误信息 - */ - private final String message; - - public BusinessException(ResultCode resultCode) { - super(resultCode.getMessage()); - this.code = resultCode.getCode(); - this.message = resultCode.getMessage(); - } - - public BusinessException(ResultCode resultCode, String message) { - super(message); - this.code = resultCode.getCode(); - this.message = message; - } - - public BusinessException(int code, String message) { - super(message); - this.code = code; - this.message = message; - } - - public BusinessException(String message) { - super(message); - this.code = ResultCode.INTERNAL_ERROR.getCode(); - this.message = message; - } -} diff --git a/training-system/src/main/java/com/sino/training/common/exception/GlobalExceptionHandler.java b/training-system/src/main/java/com/sino/training/common/exception/GlobalExceptionHandler.java deleted file mode 100644 index faad7cc..0000000 --- a/training-system/src/main/java/com/sino/training/common/exception/GlobalExceptionHandler.java +++ /dev/null @@ -1,117 +0,0 @@ -package com.sino.training.common.exception; - -import com.sino.training.common.result.Result; -import com.sino.training.common.result.ResultCode; -import jakarta.servlet.http.HttpServletRequest; -import lombok.extern.slf4j.Slf4j; -import org.springframework.http.HttpStatus; -import org.springframework.validation.BindException; -import org.springframework.validation.FieldError; -import org.springframework.web.HttpRequestMethodNotSupportedException; -import org.springframework.web.bind.MethodArgumentNotValidException; -import org.springframework.web.bind.MissingServletRequestParameterException; -import org.springframework.web.bind.annotation.ExceptionHandler; -import org.springframework.web.bind.annotation.ResponseStatus; -import org.springframework.web.bind.annotation.RestControllerAdvice; -import org.springframework.web.multipart.MaxUploadSizeExceededException; -import org.springframework.web.servlet.NoHandlerFoundException; - -import java.util.List; -import java.util.stream.Collectors; - -/** - * 全局异常处理器 - * - * @author training-system - */ -@Slf4j -@RestControllerAdvice -public class GlobalExceptionHandler { - - /** - * 处理业务异常 - */ - @ExceptionHandler(BusinessException.class) - public Result handleBusinessException(BusinessException e, HttpServletRequest request) { - log.warn("业务异常: {} - {}", request.getRequestURI(), e.getMessage()); - return Result.error(e.getCode(), e.getMessage()); - } - - /** - * 处理参数校验异常(@Valid) - */ - @ExceptionHandler(MethodArgumentNotValidException.class) - @ResponseStatus(HttpStatus.BAD_REQUEST) - public Result handleMethodArgumentNotValidException(MethodArgumentNotValidException e) { - List fieldErrors = e.getBindingResult().getFieldErrors(); - String message = fieldErrors.stream() - .map(error -> error.getField() + ": " + error.getDefaultMessage()) - .collect(Collectors.joining("; ")); - log.warn("参数校验失败: {}", message); - return Result.error(ResultCode.BAD_REQUEST, message); - } - - /** - * 处理参数绑定异常 - */ - @ExceptionHandler(BindException.class) - @ResponseStatus(HttpStatus.BAD_REQUEST) - public Result handleBindException(BindException e) { - List fieldErrors = e.getBindingResult().getFieldErrors(); - String message = fieldErrors.stream() - .map(error -> error.getField() + ": " + error.getDefaultMessage()) - .collect(Collectors.joining("; ")); - log.warn("参数绑定失败: {}", message); - return Result.error(ResultCode.BAD_REQUEST, message); - } - - /** - * 处理缺少请求参数异常 - */ - @ExceptionHandler(MissingServletRequestParameterException.class) - @ResponseStatus(HttpStatus.BAD_REQUEST) - public Result handleMissingServletRequestParameterException(MissingServletRequestParameterException e) { - log.warn("缺少请求参数: {}", e.getParameterName()); - return Result.error(ResultCode.BAD_REQUEST, "缺少请求参数: " + e.getParameterName()); - } - - /** - * 处理请求方法不支持异常 - */ - @ExceptionHandler(HttpRequestMethodNotSupportedException.class) - @ResponseStatus(HttpStatus.METHOD_NOT_ALLOWED) - public Result handleHttpRequestMethodNotSupportedException(HttpRequestMethodNotSupportedException e) { - log.warn("请求方法不支持: {}", e.getMethod()); - return Result.error(ResultCode.METHOD_NOT_ALLOWED); - } - - /** - * 处理404异常 - */ - @ExceptionHandler(NoHandlerFoundException.class) - @ResponseStatus(HttpStatus.NOT_FOUND) - public Result handleNoHandlerFoundException(NoHandlerFoundException e) { - log.warn("资源不存在: {}", e.getRequestURL()); - return Result.error(ResultCode.NOT_FOUND); - } - - /** - * 处理文件上传大小超限异常 - */ - @ExceptionHandler(MaxUploadSizeExceededException.class) - @ResponseStatus(HttpStatus.BAD_REQUEST) - public Result handleMaxUploadSizeExceededException(MaxUploadSizeExceededException e) { - log.warn("文件大小超出限制: {}", e.getMessage()); - return Result.error(ResultCode.FILE_SIZE_EXCEEDED); - } - - /** - * 处理其他未知异常 - */ - @ExceptionHandler(Exception.class) - @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) - public Result handleException(Exception e, HttpServletRequest request) { - log.error("系统异常: {} - {}", request.getRequestURI(), e.getMessage(), e); - return Result.error(ResultCode.INTERNAL_ERROR); - } -} diff --git a/training-system/src/main/java/com/sino/training/common/interceptor/AuthInterceptor.java b/training-system/src/main/java/com/sino/training/common/interceptor/AuthInterceptor.java deleted file mode 100644 index 92928e2..0000000 --- a/training-system/src/main/java/com/sino/training/common/interceptor/AuthInterceptor.java +++ /dev/null @@ -1,102 +0,0 @@ -package com.sino.training.common.interceptor; - -import com.auth0.jwt.interfaces.DecodedJWT; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.sino.training.common.context.UserContext; -import com.sino.training.common.context.UserContextHolder; -import com.sino.training.common.result.Result; -import com.sino.training.common.result.ResultCode; -import com.sino.training.common.utils.JwtUtils; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; -import org.springframework.util.StringUtils; -import org.springframework.web.servlet.HandlerInterceptor; - -/** - * 认证拦截器 - * - * @author training-system - */ -@Slf4j -@Component -@RequiredArgsConstructor -public class AuthInterceptor implements HandlerInterceptor { - - private final JwtUtils jwtUtils; - private final ObjectMapper objectMapper; - - @Value("${training.jwt.header}") - private String header; - - @Value("${training.jwt.prefix}") - private String prefix; - - @Override - public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { - // 获取Token - String token = getToken(request); - - if (!StringUtils.hasText(token)) { - writeError(response, ResultCode.UNAUTHORIZED); - return false; - } - - // 验证Token - DecodedJWT jwt = jwtUtils.verifyToken(token); - if (jwt == null) { - writeError(response, ResultCode.TOKEN_INVALID); - return false; - } - - // 检查是否过期 - if (jwtUtils.isTokenExpired(token)) { - writeError(response, ResultCode.TOKEN_EXPIRED); - return false; - } - - // 设置用户上下文 - UserContext context = new UserContext(); - context.setUserId(Long.parseLong(jwt.getSubject())); - context.setUsername(jwt.getClaim("username").asString()); - context.setRole(jwt.getClaim("role").asString()); - - // 部门ID需要从数据库获取,这里先从Token中获取(如果有) - if (jwt.getClaim("departmentId") != null && !jwt.getClaim("departmentId").isNull()) { - context.setDepartmentId(jwt.getClaim("departmentId").asLong()); - } - - UserContextHolder.setContext(context); - - return true; - } - - @Override - public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { - // 清除用户上下文 - UserContextHolder.clearContext(); - } - - /** - * 从请求头获取Token - */ - private String getToken(HttpServletRequest request) { - String bearerToken = request.getHeader(header); - if (StringUtils.hasText(bearerToken) && bearerToken.startsWith(prefix + " ")) { - return bearerToken.substring(prefix.length() + 1); - } - return null; - } - - /** - * 写入错误响应 - */ - private void writeError(HttpServletResponse response, ResultCode resultCode) throws Exception { - response.setContentType("application/json;charset=UTF-8"); - response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); - response.getWriter().write(objectMapper.writeValueAsString(Result.error(resultCode))); - } -} diff --git a/training-system/src/main/java/com/sino/training/common/interceptor/RoleInterceptor.java b/training-system/src/main/java/com/sino/training/common/interceptor/RoleInterceptor.java deleted file mode 100644 index eb553b0..0000000 --- a/training-system/src/main/java/com/sino/training/common/interceptor/RoleInterceptor.java +++ /dev/null @@ -1,89 +0,0 @@ -package com.sino.training.common.interceptor; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.sino.training.common.annotation.RequireRole; -import com.sino.training.common.context.UserContext; -import com.sino.training.common.context.UserContextHolder; -import com.sino.training.common.enums.UserRole; -import com.sino.training.common.result.Result; -import com.sino.training.common.result.ResultCode; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; -import org.springframework.web.method.HandlerMethod; -import org.springframework.web.servlet.HandlerInterceptor; - -/** - * 角色权限拦截器 - * 基于 @RequireRole 注解进行角色权限校验 - * - * @author training-system - */ -@Slf4j -@Component -@RequiredArgsConstructor -public class RoleInterceptor implements HandlerInterceptor { - - private final ObjectMapper objectMapper; - - @Override - public boolean preHandle(HttpServletRequest request, HttpServletResponse response, - Object handler) throws Exception { - if (!(handler instanceof HandlerMethod handlerMethod)) { - return true; - } - - // 优先取方法上的注解,没有则取类上的注解 - RequireRole requireRole = handlerMethod.getMethodAnnotation(RequireRole.class); - if (requireRole == null) { - requireRole = handlerMethod.getBeanType().getAnnotation(RequireRole.class); - } - - // 没有注解则放行 - if (requireRole == null) { - return true; - } - - // 获取当前用户上下文 - UserContext context = UserContextHolder.getContext(); - if (context == null || context.getRole() == null) { - log.warn("用户未登录或角色信息缺失,拒绝访问: {}", request.getRequestURI()); - writeError(response, ResultCode.UNAUTHORIZED); - return false; - } - - // 检查角色是否匹配 - UserRole currentRole; - try { - currentRole = UserRole.valueOf(context.getRole()); - } catch (IllegalArgumentException e) { - log.error("无效的用户角色: {}", context.getRole()); - writeError(response, ResultCode.FORBIDDEN); - return false; - } - - for (UserRole allowedRole : requireRole.value()) { - if (currentRole == allowedRole) { - return true; - } - } - - // 角色不匹配,返回403 - log.warn("用户 {} 角色 {} 无权访问: {}", context.getUsername(), currentRole, request.getRequestURI()); - writeError(response, ResultCode.FORBIDDEN); - return false; - } - - /** - * 写入错误响应 - */ - private void writeError(HttpServletResponse response, ResultCode resultCode) throws Exception { - response.setContentType("application/json;charset=UTF-8"); - int statusCode = resultCode == ResultCode.FORBIDDEN ? - HttpServletResponse.SC_FORBIDDEN : HttpServletResponse.SC_UNAUTHORIZED; - response.setStatus(statusCode); - response.getWriter().write(objectMapper.writeValueAsString(Result.error(resultCode))); - } -} diff --git a/training-system/src/main/java/com/sino/training/common/result/PageResult.java b/training-system/src/main/java/com/sino/training/common/result/PageResult.java deleted file mode 100644 index 8d02ee9..0000000 --- a/training-system/src/main/java/com/sino/training/common/result/PageResult.java +++ /dev/null @@ -1,80 +0,0 @@ -package com.sino.training.common.result; - -import com.baomidou.mybatisplus.core.metadata.IPage; -import lombok.Data; - -import java.io.Serializable; -import java.util.List; - -/** - * 分页结果封装 - * - * @author training-system - */ -@Data -public class PageResult implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * 当前页码 - */ - private long current; - - /** - * 每页大小 - */ - private long size; - - /** - * 总记录数 - */ - private long total; - - /** - * 总页数 - */ - private long pages; - - /** - * 数据列表 - */ - private List records; - - public PageResult() { - } - - public PageResult(long current, long size, long total, List records) { - this.current = current; - this.size = size; - this.total = total; - this.pages = (total + size - 1) / size; - this.records = records; - } - - /** - * 从 MyBatis Plus 的 IPage 转换 - */ - public static PageResult of(IPage page) { - PageResult result = new PageResult<>(); - result.setCurrent(page.getCurrent()); - result.setSize(page.getSize()); - result.setTotal(page.getTotal()); - result.setPages(page.getPages()); - result.setRecords(page.getRecords()); - return result; - } - - /** - * 从 MyBatis Plus 的 IPage 转换(带类型转换) - */ - public static PageResult of(IPage page, List records) { - PageResult result = new PageResult<>(); - result.setCurrent(page.getCurrent()); - result.setSize(page.getSize()); - result.setTotal(page.getTotal()); - result.setPages(page.getPages()); - result.setRecords(records); - return result; - } -} diff --git a/training-system/src/main/java/com/sino/training/common/result/Result.java b/training-system/src/main/java/com/sino/training/common/result/Result.java deleted file mode 100644 index 0c33761..0000000 --- a/training-system/src/main/java/com/sino/training/common/result/Result.java +++ /dev/null @@ -1,96 +0,0 @@ -package com.sino.training.common.result; - -import lombok.Data; - -import java.io.Serializable; - -/** - * 统一响应结果封装 - * - * @author training-system - */ -@Data -public class Result implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * 状态码 - */ - private int code; - - /** - * 消息 - */ - private String message; - - /** - * 数据 - */ - private T data; - - /** - * 时间戳 - */ - private long timestamp; - - public Result() { - this.timestamp = System.currentTimeMillis(); - } - - public Result(int code, String message, T data) { - this.code = code; - this.message = message; - this.data = data; - this.timestamp = System.currentTimeMillis(); - } - - /** - * 成功响应(无数据) - */ - public static Result success() { - return new Result<>(ResultCode.SUCCESS.getCode(), ResultCode.SUCCESS.getMessage(), null); - } - - /** - * 成功响应(带数据) - */ - public static Result success(T data) { - return new Result<>(ResultCode.SUCCESS.getCode(), ResultCode.SUCCESS.getMessage(), data); - } - - /** - * 成功响应(自定义消息) - */ - public static Result success(String message, T data) { - return new Result<>(ResultCode.SUCCESS.getCode(), message, data); - } - - /** - * 失败响应(使用状态码枚举) - */ - public static Result error(ResultCode resultCode) { - return new Result<>(resultCode.getCode(), resultCode.getMessage(), null); - } - - /** - * 失败响应(自定义消息) - */ - public static Result error(ResultCode resultCode, String message) { - return new Result<>(resultCode.getCode(), message, null); - } - - /** - * 失败响应(自定义状态码和消息) - */ - public static Result error(int code, String message) { - return new Result<>(code, message, null); - } - - /** - * 判断是否成功 - */ - public boolean isSuccess() { - return this.code == ResultCode.SUCCESS.getCode(); - } -} diff --git a/training-system/src/main/java/com/sino/training/common/result/ResultCode.java b/training-system/src/main/java/com/sino/training/common/result/ResultCode.java deleted file mode 100644 index 23041ab..0000000 --- a/training-system/src/main/java/com/sino/training/common/result/ResultCode.java +++ /dev/null @@ -1,82 +0,0 @@ -package com.sino.training.common.result; - -import lombok.Getter; - -/** - * 响应状态码枚举 - * - * @author training-system - */ -@Getter -public enum ResultCode { - - // 成功 - SUCCESS(200, "操作成功"), - - // 客户端错误 4xx - BAD_REQUEST(400, "请求参数错误"), - UNAUTHORIZED(401, "未登录或登录已过期"), - FORBIDDEN(403, "没有操作权限"), - NOT_FOUND(404, "资源不存在"), - METHOD_NOT_ALLOWED(405, "请求方法不允许"), - - // 业务错误 5xx - INTERNAL_ERROR(500, "服务器内部错误"), - SERVICE_UNAVAILABLE(503, "服务暂不可用"), - - // 自定义业务错误码 1xxx - USER_NOT_FOUND(1001, "用户不存在"), - USER_DISABLED(1002, "用户已被禁用"), - PASSWORD_ERROR(1003, "密码错误"), - USER_EXISTS(1004, "用户已存在"), - PHONE_EXISTS(1005, "手机号已存在"), - - // 认证相关 11xx - TOKEN_INVALID(1101, "Token无效"), - TOKEN_EXPIRED(1102, "Token已过期"), - WECHAT_AUTH_FAILED(1103, "企业微信认证失败"), - - // 知识库相关 12xx - KNOWLEDGE_NOT_FOUND(1201, "知识不存在"), - CATEGORY_NOT_FOUND(1202, "分类不存在"), - KNOWLEDGE_REFERENCED(1203, "知识已被引用,无法删除"), - - // 考试相关 13xx - QUESTION_NOT_FOUND(1301, "题目不存在"), - PAPER_NOT_FOUND(1302, "试卷不存在"), - EXAM_NOT_FOUND(1303, "考试不存在"), - EXAM_NOT_STARTED(1304, "考试未开始"), - EXAM_ENDED(1305, "考试已结束"), - EXAM_ATTEMPTS_EXCEEDED(1306, "考试次数已用完"), - PAPER_REFERENCED(1307, "试卷已被引用,无法删除"), - QUESTION_REFERENCED(1308, "题目已被引用,无法删除"), - - // 培训相关 14xx - PLAN_NOT_FOUND(1401, "培训计划不存在"), - - // 文件相关 15xx - FILE_UPLOAD_FAILED(1501, "文件上传失败"), - FILE_TYPE_NOT_ALLOWED(1502, "文件类型不允许"), - FILE_SIZE_EXCEEDED(1503, "文件大小超出限制"), - FILE_NOT_FOUND(1504, "文件不存在"), - - // 数据相关 16xx - DATA_NOT_FOUND(1601, "数据不存在"), - DATA_EXISTS(1602, "数据已存在"), - DATA_REFERENCED(1603, "数据已被引用,无法操作"); - - /** - * 状态码 - */ - private final int code; - - /** - * 状态信息 - */ - private final String message; - - ResultCode(int code, String message) { - this.code = code; - this.message = message; - } -} diff --git a/training-system/src/main/java/com/sino/training/common/service/FileService.java b/training-system/src/main/java/com/sino/training/common/service/FileService.java deleted file mode 100644 index b382855..0000000 --- a/training-system/src/main/java/com/sino/training/common/service/FileService.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.sino.training.common.service; - -import com.sino.training.common.dto.FileDTO; -import org.springframework.web.multipart.MultipartFile; - -/** - * 文件服务接口 - * - * @author training-system - */ -public interface FileService { - - /** - * 上传文件 - * - * @param file 文件 - * @param folder 子文件夹(如:knowledge、video) - * @return 文件信息 - */ - FileDTO upload(MultipartFile file, String folder); - - /** - * 删除文件 - * - * @param fileUrl 文件URL - * @return 是否删除成功 - */ - boolean delete(String fileUrl); - - /** - * 获取文件访问路径 - * - * @param relativePath 相对路径 - * @return 完整访问URL - */ - String getAccessUrl(String relativePath); -} diff --git a/training-system/src/main/java/com/sino/training/common/service/impl/LocalFileServiceImpl.java b/training-system/src/main/java/com/sino/training/common/service/impl/LocalFileServiceImpl.java deleted file mode 100644 index 4ca7452..0000000 --- a/training-system/src/main/java/com/sino/training/common/service/impl/LocalFileServiceImpl.java +++ /dev/null @@ -1,166 +0,0 @@ -package com.sino.training.common.service.impl; - -import cn.hutool.core.io.FileUtil; -import cn.hutool.core.util.IdUtil; -import cn.hutool.core.util.StrUtil; -import com.sino.training.common.dto.FileDTO; -import com.sino.training.common.exception.BusinessException; -import com.sino.training.common.result.ResultCode; -import com.sino.training.common.service.FileService; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Service; -import org.springframework.web.multipart.MultipartFile; - -import jakarta.annotation.PostConstruct; -import java.io.File; -import java.io.IOException; -import java.time.LocalDate; -import java.time.format.DateTimeFormatter; -import java.util.Arrays; -import java.util.List; - -/** - * 本地文件服务实现类 - * - * @author training-system - */ -@Slf4j -@Service -public class LocalFileServiceImpl implements FileService { - - @Value("${training.upload.path}") - private String uploadPath; - - @Value("${training.upload.allowed-types}") - private String allowedTypes; - - @Value("${training.upload.max-size}") - private Long maxSize; - - /** - * 应用启动时初始化上传目录 - */ - @PostConstruct - public void init() { - File uploadDir = new File(uploadPath); - if (!uploadDir.exists()) { - boolean created = uploadDir.mkdirs(); - log.info("初始化上传目录: {}, 创建结果: {}", uploadPath, created); - } else { - log.info("上传目录已存在: {}", uploadPath); - } - // 检查目录权限 - if (!uploadDir.canWrite()) { - log.error("上传目录无写入权限: {}", uploadPath); - } - } - - @Override - public FileDTO upload(MultipartFile file, String folder) { - if (file == null || file.isEmpty()) { - throw new BusinessException(ResultCode.FILE_UPLOAD_FAILED, "文件不能为空"); - } - - // 获取文件名和后缀 - String originalName = file.getOriginalFilename(); - if (StrUtil.isBlank(originalName)) { - throw new BusinessException(ResultCode.FILE_UPLOAD_FAILED, "文件名不能为空"); - } - - String suffix = FileUtil.getSuffix(originalName).toLowerCase(); - - // 检查文件类型 - List allowedTypeList = Arrays.asList(allowedTypes.split(",")); - if (!allowedTypeList.contains(suffix)) { - throw new BusinessException(ResultCode.FILE_TYPE_NOT_ALLOWED, - "不支持的文件类型: " + suffix + ",支持的类型: " + allowedTypes); - } - - // 检查文件大小 - if (file.getSize() > maxSize) { - throw new BusinessException(ResultCode.FILE_SIZE_EXCEEDED, - "文件大小超出限制,最大: " + formatFileSize(maxSize)); - } - - // 生成存储路径:uploads/folder/yyyy/MM/dd/uuid.suffix - String datePath = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy/MM/dd")); - String storageName = IdUtil.fastSimpleUUID() + "." + suffix; - String relativePath = (StrUtil.isNotBlank(folder) ? folder + "/" : "") + datePath + "/" + storageName; - String fullPath = uploadPath + "/" + relativePath; - - // 创建目录 - File destFile = new File(fullPath); - log.info("准备保存文件, 目标路径: {}", fullPath); - - try { - FileUtil.mkParentDirs(destFile); - log.info("父目录创建成功: {}", destFile.getParentFile().getAbsolutePath()); - } catch (Exception e) { - log.error("创建父目录失败, 路径: {}", destFile.getParentFile().getAbsolutePath(), e); - throw new BusinessException(ResultCode.FILE_UPLOAD_FAILED, "创建上传目录失败"); - } - - // 保存文件 - try { - file.transferTo(destFile); - log.info("文件上传成功: {}", fullPath); - } catch (IOException e) { - log.error("文件上传失败, 目标路径: {}, 原因: {}", fullPath, e.getMessage(), e); - throw new BusinessException(ResultCode.FILE_UPLOAD_FAILED, "文件保存失败: " + e.getMessage()); - } - - // 返回文件信息 - FileDTO dto = new FileDTO(); - dto.setOriginalName(originalName); - dto.setStorageName(storageName); - dto.setUrl("/uploads/" + relativePath); - dto.setSize(file.getSize()); - dto.setType(suffix); - - return dto; - } - - @Override - public boolean delete(String fileUrl) { - if (StrUtil.isBlank(fileUrl)) { - return false; - } - - // 将URL转换为文件路径 - String relativePath = fileUrl.replace("/uploads/", ""); - String fullPath = uploadPath + "/" + relativePath; - - File file = new File(fullPath); - if (file.exists()) { - boolean deleted = FileUtil.del(file); - log.info("删除文件: {}, 结果: {}", fullPath, deleted); - return deleted; - } - - return false; - } - - @Override - public String getAccessUrl(String relativePath) { - if (StrUtil.isBlank(relativePath)) { - return null; - } - if (relativePath.startsWith("/uploads/")) { - return relativePath; - } - return "/uploads/" + relativePath; - } - - private String formatFileSize(long size) { - if (size < 1024) { - return size + "B"; - } else if (size < 1024 * 1024) { - return String.format("%.2fKB", size / 1024.0); - } else if (size < 1024 * 1024 * 1024) { - return String.format("%.2fMB", size / (1024.0 * 1024)); - } else { - return String.format("%.2fGB", size / (1024.0 * 1024 * 1024)); - } - } -} diff --git a/training-system/src/main/java/com/sino/training/common/utils/JwtUtils.java b/training-system/src/main/java/com/sino/training/common/utils/JwtUtils.java deleted file mode 100644 index 01ca7ad..0000000 --- a/training-system/src/main/java/com/sino/training/common/utils/JwtUtils.java +++ /dev/null @@ -1,123 +0,0 @@ -package com.sino.training.common.utils; - -import com.auth0.jwt.JWT; -import com.auth0.jwt.JWTVerifier; -import com.auth0.jwt.algorithms.Algorithm; -import com.auth0.jwt.exceptions.JWTVerificationException; -import com.auth0.jwt.interfaces.DecodedJWT; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; - -import java.util.Date; - -/** - * JWT 工具类 - * - * @author training-system - */ -@Slf4j -@Component -public class JwtUtils { - - @Value("${training.jwt.secret}") - private String secret; - - @Value("${training.jwt.expire}") - private long expire; - - /** - * 生成 JWT Token - * - * @param userId 用户ID - * @param username 用户名 - * @param role 用户角色 - * @param departmentId 部门ID - * @return JWT Token - */ - public String generateToken(Long userId, String username, String role, Long departmentId) { - Date now = new Date(); - Date expireDate = new Date(now.getTime() + expire); - - return JWT.create() - .withSubject(String.valueOf(userId)) - .withClaim("username", username) - .withClaim("role", role) - .withClaim("departmentId", departmentId) - .withIssuedAt(now) - .withExpiresAt(expireDate) - .sign(Algorithm.HMAC256(secret)); - } - - /** - * 验证 Token 并返回解码后的信息 - * - * @param token JWT Token - * @return 解码后的JWT,验证失败返回null - */ - public DecodedJWT verifyToken(String token) { - try { - JWTVerifier verifier = JWT.require(Algorithm.HMAC256(secret)).build(); - return verifier.verify(token); - } catch (JWTVerificationException e) { - log.warn("Token验证失败: {}", e.getMessage()); - return null; - } - } - - /** - * 从 Token 中获取用户ID - * - * @param token JWT Token - * @return 用户ID,失败返回null - */ - public Long getUserId(String token) { - DecodedJWT jwt = verifyToken(token); - if (jwt != null) { - return Long.parseLong(jwt.getSubject()); - } - return null; - } - - /** - * 从 Token 中获取用户名 - * - * @param token JWT Token - * @return 用户名,失败返回null - */ - public String getUsername(String token) { - DecodedJWT jwt = verifyToken(token); - if (jwt != null) { - return jwt.getClaim("username").asString(); - } - return null; - } - - /** - * 从 Token 中获取用户角色 - * - * @param token JWT Token - * @return 用户角色,失败返回null - */ - public String getRole(String token) { - DecodedJWT jwt = verifyToken(token); - if (jwt != null) { - return jwt.getClaim("role").asString(); - } - return null; - } - - /** - * 判断 Token 是否过期 - * - * @param token JWT Token - * @return true-已过期,false-未过期 - */ - public boolean isTokenExpired(String token) { - DecodedJWT jwt = verifyToken(token); - if (jwt != null) { - return jwt.getExpiresAt().before(new Date()); - } - return true; - } -} diff --git a/training-system/src/main/java/com/sino/training/common/utils/SecurityUtils.java b/training-system/src/main/java/com/sino/training/common/utils/SecurityUtils.java deleted file mode 100644 index 2bcee24..0000000 --- a/training-system/src/main/java/com/sino/training/common/utils/SecurityUtils.java +++ /dev/null @@ -1,107 +0,0 @@ - -package com.sino.training.common.utils; - -import com.sino.training.common.context.UserContext; -import com.sino.training.common.context.UserContextHolder; -import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; - -/** - * 安全工具类 - * - * @author training-system - */ -public class SecurityUtils { - - private static final BCryptPasswordEncoder PASSWORD_ENCODER = new BCryptPasswordEncoder(); - - private SecurityUtils() { - } - - /** - * 密码加密 - * - * @param rawPassword 原始密码 - * @return 加密后的密码 - */ - public static String encryptPassword(String rawPassword) { - return PASSWORD_ENCODER.encode(rawPassword); - } - - /** - * 密码匹配 - * - * @param rawPassword 原始密码 - * @param encodedPassword 加密后的密码 - * @return 是否匹配 - */ - public static boolean matchPassword(String rawPassword, String encodedPassword) { - return PASSWORD_ENCODER.matches(rawPassword, encodedPassword); - } - - /** - * 获取当前登录用户ID - * - * @return 用户ID - */ - public static Long getCurrentUserId() { - UserContext context = UserContextHolder.getContext(); - return context != null ? context.getUserId() : null; - } - - /** - * 获取当前登录用户名 - * - * @return 用户名 - */ - public static String getCurrentUsername() { - UserContext context = UserContextHolder.getContext(); - return context != null ? context.getUsername() : null; - } - - /** - * 获取当前登录用户角色 - * - * @return 用户角色 - */ - public static String getCurrentRole() { - UserContext context = UserContextHolder.getContext(); - return context != null ? context.getRole() : null; - } - - /** - * 获取当前登录用户部门ID - * - * @return 部门ID - */ - public static Long getCurrentDepartmentId() { - UserContext context = UserContextHolder.getContext(); - return context != null ? context.getDepartmentId() : null; - } - - /** - * 判断当前用户是否为管理员 - * - * @return 是否为管理员 - */ - public static boolean isAdmin() { - return "ADMIN".equals(getCurrentRole()); - } - - /** - * 判断当前用户是否为讲师 - * - * @return 是否为讲师 - */ - public static boolean isLecturer() { - return "LECTURER".equals(getCurrentRole()); - } - - /** - * 判断当前用户是否为学员 - * - * @return 是否为学员 - */ - public static boolean isStudent() { - return "STUDENT".equals(getCurrentRole()); - } -} diff --git a/training-system/src/main/java/com/sino/training/module/auth/controller/AuthController.java b/training-system/src/main/java/com/sino/training/module/auth/controller/AuthController.java deleted file mode 100644 index 891e891..0000000 --- a/training-system/src/main/java/com/sino/training/module/auth/controller/AuthController.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.sino.training.module.auth.controller; - -import com.sino.training.common.result.Result; -import com.sino.training.module.auth.dto.LoginRequest; -import com.sino.training.module.auth.dto.LoginResponse; -import com.sino.training.module.auth.dto.UserInfoResponse; -import com.sino.training.module.auth.dto.WechatLoginRequest; -import com.sino.training.module.auth.service.AuthService; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import jakarta.validation.Valid; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.*; - -/** - * 认证控制器 - * - * @author training-system - */ -@Tag(name = "认证管理", description = "登录、登出、用户信息等接口") -@RestController -@RequestMapping("/api/auth") -@RequiredArgsConstructor -public class AuthController { - - private final AuthService authService; - - @Operation(summary = "账号密码登录") - @PostMapping("/login") - public Result login(@Valid @RequestBody LoginRequest request) { - return Result.success(authService.login(request)); - } - - @Operation(summary = "企业微信登录") - @PostMapping("/wechat/login") - public Result wechatLogin(@Valid @RequestBody WechatLoginRequest request) { - return Result.success(authService.wechatLogin(request)); - } - - @Operation(summary = "获取当前用户信息") - @GetMapping("/userinfo") - public Result getUserInfo() { - return Result.success(authService.getCurrentUserInfo()); - } - - @Operation(summary = "退出登录") - @PostMapping("/logout") - public Result logout() { - authService.logout(); - return Result.success(); - } -} diff --git a/training-system/src/main/java/com/sino/training/module/auth/dto/LoginRequest.java b/training-system/src/main/java/com/sino/training/module/auth/dto/LoginRequest.java deleted file mode 100644 index 1c048d9..0000000 --- a/training-system/src/main/java/com/sino/training/module/auth/dto/LoginRequest.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.sino.training.module.auth.dto; - -import jakarta.validation.constraints.NotBlank; -import lombok.Data; - -import java.io.Serializable; - -/** - * 登录请求DTO - * - * @author training-system - */ -@Data -public class LoginRequest implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * 用户名 - */ - @NotBlank(message = "用户名不能为空") - private String username; - - /** - * 密码 - */ - @NotBlank(message = "密码不能为空") - private String password; -} diff --git a/training-system/src/main/java/com/sino/training/module/auth/dto/LoginResponse.java b/training-system/src/main/java/com/sino/training/module/auth/dto/LoginResponse.java deleted file mode 100644 index 91c2a62..0000000 --- a/training-system/src/main/java/com/sino/training/module/auth/dto/LoginResponse.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.sino.training.module.auth.dto; - -import lombok.Data; - -import java.io.Serializable; - -/** - * 登录响应DTO - * - * @author training-system - */ -@Data -public class LoginResponse implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * JWT Token - */ - private String token; - - /** - * 用户ID - */ - private Long userId; - - /** - * 用户名 - */ - private String username; - - /** - * 真实姓名 - */ - private String realName; - - /** - * 用户角色 - */ - private String role; - - /** - * 头像URL - */ - private String avatar; - - /** - * 部门ID - */ - private Long departmentId; - - /** - * 部门名称 - */ - private String departmentName; -} diff --git a/training-system/src/main/java/com/sino/training/module/auth/dto/UserInfoResponse.java b/training-system/src/main/java/com/sino/training/module/auth/dto/UserInfoResponse.java deleted file mode 100644 index 829f5d7..0000000 --- a/training-system/src/main/java/com/sino/training/module/auth/dto/UserInfoResponse.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.sino.training.module.auth.dto; - -import lombok.Data; - -import java.io.Serializable; - -/** - * 用户信息响应DTO - * - * @author training-system - */ -@Data -public class UserInfoResponse implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * 用户ID - */ - private Long userId; - - /** - * 用户名 - */ - private String username; - - /** - * 真实姓名 - */ - private String realName; - - /** - * 手机号 - */ - private String phone; - - /** - * 头像URL - */ - private String avatar; - - /** - * 用户角色 - */ - private String role; - - /** - * 部门ID - */ - private Long departmentId; - - /** - * 部门名称 - */ - private String departmentName; - - /** - * 小组ID - */ - private Long groupId; - - /** - * 小组名称 - */ - private String groupName; -} diff --git a/training-system/src/main/java/com/sino/training/module/auth/dto/WechatLoginRequest.java b/training-system/src/main/java/com/sino/training/module/auth/dto/WechatLoginRequest.java deleted file mode 100644 index f0ec0ba..0000000 --- a/training-system/src/main/java/com/sino/training/module/auth/dto/WechatLoginRequest.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.sino.training.module.auth.dto; - -import jakarta.validation.constraints.NotBlank; -import lombok.Data; - -import java.io.Serializable; - -/** - * 企业微信登录请求DTO - * - * @author training-system - */ -@Data -public class WechatLoginRequest implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * 企业微信授权码 - */ - @NotBlank(message = "授权码不能为空") - private String code; -} diff --git a/training-system/src/main/java/com/sino/training/module/auth/service/AuthService.java b/training-system/src/main/java/com/sino/training/module/auth/service/AuthService.java deleted file mode 100644 index 6957220..0000000 --- a/training-system/src/main/java/com/sino/training/module/auth/service/AuthService.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.sino.training.module.auth.service; - -import com.sino.training.module.auth.dto.LoginRequest; -import com.sino.training.module.auth.dto.LoginResponse; -import com.sino.training.module.auth.dto.UserInfoResponse; -import com.sino.training.module.auth.dto.WechatLoginRequest; - -/** - * 认证服务接口 - * - * @author training-system - */ -public interface AuthService { - - /** - * 账号密码登录 - * - * @param request 登录请求 - * @return 登录响应 - */ - LoginResponse login(LoginRequest request); - - /** - * 企业微信登录 - * - * @param request 企业微信登录请求 - * @return 登录响应 - */ - LoginResponse wechatLogin(WechatLoginRequest request); - - /** - * 获取当前用户信息 - * - * @return 用户信息 - */ - UserInfoResponse getCurrentUserInfo(); - - /** - * 退出登录 - */ - void logout(); -} diff --git a/training-system/src/main/java/com/sino/training/module/auth/service/impl/AuthServiceImpl.java b/training-system/src/main/java/com/sino/training/module/auth/service/impl/AuthServiceImpl.java deleted file mode 100644 index 2a5fd45..0000000 --- a/training-system/src/main/java/com/sino/training/module/auth/service/impl/AuthServiceImpl.java +++ /dev/null @@ -1,163 +0,0 @@ - -package com.sino.training.module.auth.service.impl; - -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.sino.training.common.context.UserContext; -import com.sino.training.common.context.UserContextHolder; -import com.sino.training.common.enums.UserStatus; -import com.sino.training.common.exception.BusinessException; -import com.sino.training.common.result.ResultCode; -import com.sino.training.common.utils.JwtUtils; -import com.sino.training.module.auth.dto.LoginRequest; -import com.sino.training.module.auth.dto.LoginResponse; -import com.sino.training.module.auth.dto.UserInfoResponse; -import com.sino.training.module.auth.dto.WechatLoginRequest; -import com.sino.training.module.auth.service.AuthService; -import com.sino.training.module.system.entity.Department; -import com.sino.training.module.system.entity.Group; -import com.sino.training.module.system.entity.User; -import com.sino.training.module.system.mapper.DepartmentMapper; -import com.sino.training.module.system.mapper.GroupMapper; -import com.sino.training.module.system.mapper.UserMapper; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.security.crypto.password.PasswordEncoder; -import org.springframework.stereotype.Service; - -/** - * 认证服务实现类 - * - * @author training-system - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class AuthServiceImpl implements AuthService { - - private final UserMapper userMapper; - private final DepartmentMapper departmentMapper; - private final GroupMapper groupMapper; - private final JwtUtils jwtUtils; - private final PasswordEncoder passwordEncoder; - - @Override - public LoginResponse login(LoginRequest request) { - // 查询用户 - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(User::getUsername, request.getUsername()); - User user = userMapper.selectOne(queryWrapper); - - if (user == null) { - throw new BusinessException(ResultCode.USER_NOT_FOUND); - } - - // 验证密码 - if (!passwordEncoder.matches(request.getPassword(), user.getPassword())) { - throw new BusinessException(ResultCode.PASSWORD_ERROR); - } - - // 检查用户状态 - if (user.getStatus() == UserStatus.DISABLED) { - throw new BusinessException(ResultCode.USER_DISABLED); - } - - return buildLoginResponse(user); - } - - @Override - public LoginResponse wechatLogin(WechatLoginRequest request) { - // TODO: 集成企业微信SDK,通过code换取用户信息 - // 这里先预留接口,后续实现企业微信OAuth流程 - log.info("企业微信登录,code: {}", request.getCode()); - throw new BusinessException(ResultCode.WECHAT_AUTH_FAILED, "企业微信登录功能暂未开放"); - } - - @Override - public UserInfoResponse getCurrentUserInfo() { - UserContext context = UserContextHolder.getContext(); - if (context == null || context.getUserId() == null) { - throw new BusinessException(ResultCode.UNAUTHORIZED); - } - - User user = userMapper.selectById(context.getUserId()); - if (user == null) { - throw new BusinessException(ResultCode.USER_NOT_FOUND); - } - - return buildUserInfoResponse(user); - } - - @Override - public void logout() { - // 清除用户上下文 - UserContextHolder.clearContext(); - // JWT是无状态的,客户端删除token即可 - log.info("用户退出登录"); - } - - /** - * 构建登录响应 - */ - private LoginResponse buildLoginResponse(User user) { - LoginResponse response = new LoginResponse(); - - // 生成Token(包含部门ID用于数据隔离) - String token = jwtUtils.generateToken( - user.getId(), - user.getUsername(), - user.getRole().name(), - user.getDepartmentId() - ); - response.setToken(token); - - response.setUserId(user.getId()); - response.setUsername(user.getUsername()); - response.setRealName(user.getRealName()); - response.setRole(user.getRole().name()); - response.setAvatar(user.getAvatar()); - response.setDepartmentId(user.getDepartmentId()); - - // 获取部门名称 - if (user.getDepartmentId() != null) { - Department department = departmentMapper.selectById(user.getDepartmentId()); - if (department != null) { - response.setDepartmentName(department.getName()); - } - } - - return response; - } - - /** - * 构建用户信息响应 - */ - private UserInfoResponse buildUserInfoResponse(User user) { - UserInfoResponse response = new UserInfoResponse(); - response.setUserId(user.getId()); - response.setUsername(user.getUsername()); - response.setRealName(user.getRealName()); - response.setPhone(user.getPhone()); - response.setAvatar(user.getAvatar()); - response.setRole(user.getRole().name()); - response.setDepartmentId(user.getDepartmentId()); - response.setGroupId(user.getGroupId()); - - // 获取部门名称 - if (user.getDepartmentId() != null) { - Department department = departmentMapper.selectById(user.getDepartmentId()); - if (department != null) { - response.setDepartmentName(department.getName()); - } - } - - // 获取小组名称 - if (user.getGroupId() != null) { - Group group = groupMapper.selectById(user.getGroupId()); - if (group != null) { - response.setGroupName(group.getName()); - } - } - - return response; - } -} diff --git a/training-system/src/main/java/com/sino/training/module/exam/controller/ExamController.java b/training-system/src/main/java/com/sino/training/module/exam/controller/ExamController.java deleted file mode 100644 index 71d3a49..0000000 --- a/training-system/src/main/java/com/sino/training/module/exam/controller/ExamController.java +++ /dev/null @@ -1,119 +0,0 @@ -package com.sino.training.module.exam.controller; - -import com.sino.training.common.context.UserContextHolder; -import com.sino.training.common.result.PageResult; -import com.sino.training.common.result.Result; -import com.sino.training.module.exam.dto.ExamDTO; -import com.sino.training.module.exam.dto.ExamQueryDTO; -import com.sino.training.module.exam.dto.SubmitExamDTO; -import com.sino.training.module.exam.service.ExamRecordService; -import com.sino.training.module.exam.service.ExamService; -import com.sino.training.module.exam.vo.ExamPaperVO; -import com.sino.training.module.exam.vo.ExamRecordVO; -import com.sino.training.module.exam.vo.ExamVO; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import jakarta.validation.Valid; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -/** - * 考试管理控制器 - * - * @author training-system - */ -@Tag(name = "考试管理", description = "考试CRUD和在线答题接口") -@RestController -@RequestMapping("/api/exam") -@RequiredArgsConstructor -public class ExamController { - - private final ExamService examService; - private final ExamRecordService examRecordService; - - @Operation(summary = "分页查询考试列表") - @GetMapping("/page") - public Result> page(ExamQueryDTO queryDTO) { - return Result.success(examService.pageExams(queryDTO)); - } - - @Operation(summary = "获取考试详情") - @GetMapping("/{id}") - public Result detail(@PathVariable Long id) { - return Result.success(examService.getExamDetail(id)); - } - - @Operation(summary = "创建考试") - @PostMapping - public Result create(@Valid @RequestBody ExamDTO dto) { - return Result.success(examService.createExam(dto)); - } - - @Operation(summary = "更新考试") - @PutMapping - public Result update(@Valid @RequestBody ExamDTO dto) { - examService.updateExam(dto); - return Result.success(); - } - - @Operation(summary = "删除考试") - @DeleteMapping("/{id}") - public Result delete(@PathVariable Long id) { - examService.deleteExam(id); - return Result.success(); - } - - @Operation(summary = "获取我的考试列表(学员)") - @GetMapping("/my") - public Result> myExams() { - Long userId = UserContextHolder.getContext().getUserId(); - return Result.success(examService.listMyExams(userId)); - } - - @Operation(summary = "开始考试") - @PostMapping("/{id}/start") - public Result startExam(@PathVariable Long id) { - Long userId = UserContextHolder.getContext().getUserId(); - return Result.success(examRecordService.startExam(id, userId)); - } - - @Operation(summary = "获取考试试卷(答题中)") - @GetMapping("/record/{recordId}/paper") - public Result getExamPaper(@PathVariable Long recordId) { - return Result.success(examRecordService.getExamPaper(recordId)); - } - - @Operation(summary = "保存答案(自动保存)") - @PostMapping("/record/save") - public Result saveAnswers(@RequestBody SubmitExamDTO dto) { - examRecordService.saveAnswers(dto); - return Result.success(); - } - - @Operation(summary = "提交考试") - @PostMapping("/record/submit") - public Result submitExam(@Valid @RequestBody SubmitExamDTO dto) { - return Result.success(examRecordService.submitExam(dto)); - } - - @Operation(summary = "获取考试记录详情(含答案解析)") - @GetMapping("/record/{recordId}") - public Result getRecordDetail(@PathVariable Long recordId) { - return Result.success(examRecordService.getRecordDetail(recordId)); - } - - @Operation(summary = "获取我的考试记录") - @GetMapping("/{examId}/my-records") - public Result> myRecords(@PathVariable Long examId) { - Long userId = UserContextHolder.getContext().getUserId(); - return Result.success(examRecordService.listUserRecords(examId, userId)); - } - - @Operation(summary = "获取考试的所有记录(管理员/讲师)") - @GetMapping("/{examId}/records") - public Result> examRecords(@PathVariable Long examId) { - return Result.success(examRecordService.listExamRecords(examId)); - } -} diff --git a/training-system/src/main/java/com/sino/training/module/exam/controller/PaperController.java b/training-system/src/main/java/com/sino/training/module/exam/controller/PaperController.java deleted file mode 100644 index bfe9c8c..0000000 --- a/training-system/src/main/java/com/sino/training/module/exam/controller/PaperController.java +++ /dev/null @@ -1,94 +0,0 @@ -package com.sino.training.module.exam.controller; - -import com.sino.training.common.result.PageResult; -import com.sino.training.common.result.Result; -import com.sino.training.module.exam.dto.AutoPaperDTO; -import com.sino.training.module.exam.dto.PaperDTO; -import com.sino.training.module.exam.dto.PaperQueryDTO; -import com.sino.training.module.exam.service.PaperService; -import com.sino.training.module.exam.vo.PaperVO; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import jakarta.validation.Valid; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -/** - * 试卷管理控制器 - * - * @author training-system - */ -@Tag(name = "试卷管理", description = "试卷CRUD接口") -@RestController -@RequestMapping("/api/exam/paper") -@RequiredArgsConstructor -public class PaperController { - - private final PaperService paperService; - - @Operation(summary = "分页查询试卷列表") - @GetMapping("/page") - public Result> page(PaperQueryDTO queryDTO) { - return Result.success(paperService.pagePapers(queryDTO)); - } - - @Operation(summary = "获取已发布试卷列表(当前用户部门)") - @GetMapping("/list") - public Result> list() { - return Result.success(paperService.listPublishedPapers()); - } - - @Operation(summary = "获取试卷详情(包含题目)") - @GetMapping("/{id}") - public Result detail(@PathVariable Long id) { - return Result.success(paperService.getPaperDetail(id)); - } - - @Operation(summary = "创建试卷(手动组卷)") - @PostMapping - public Result create(@Valid @RequestBody PaperDTO dto) { - return Result.success(paperService.createPaper(dto)); - } - - @Operation(summary = "创建试卷(自动组卷)") - @PostMapping("/auto") - public Result createAuto(@Valid @RequestBody AutoPaperDTO dto) { - return Result.success(paperService.createAutoPaper(dto)); - } - - @Operation(summary = "更新试卷") - @PutMapping - public Result update(@Valid @RequestBody PaperDTO dto) { - paperService.updatePaper(dto); - return Result.success(); - } - - @Operation(summary = "删除试卷") - @DeleteMapping("/{id}") - public Result delete(@PathVariable Long id) { - paperService.deletePaper(id); - return Result.success(); - } - - @Operation(summary = "发布试卷") - @PutMapping("/{id}/publish") - public Result publish(@PathVariable Long id) { - paperService.publishPaper(id); - return Result.success(); - } - - @Operation(summary = "下架试卷") - @PutMapping("/{id}/offline") - public Result offline(@PathVariable Long id) { - paperService.offlinePaper(id); - return Result.success(); - } - - @Operation(summary = "根据部门获取已发布试卷") - @GetMapping("/published/department/{departmentId}") - public Result> listByDepartment(@PathVariable Long departmentId) { - return Result.success(paperService.listPublishedByDepartment(departmentId)); - } -} diff --git a/training-system/src/main/java/com/sino/training/module/exam/controller/QuestionCategoryController.java b/training-system/src/main/java/com/sino/training/module/exam/controller/QuestionCategoryController.java deleted file mode 100644 index 2f3e604..0000000 --- a/training-system/src/main/java/com/sino/training/module/exam/controller/QuestionCategoryController.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.sino.training.module.exam.controller; - -import com.sino.training.common.result.Result; -import com.sino.training.module.exam.dto.QuestionCategoryDTO; -import com.sino.training.module.exam.service.QuestionCategoryService; -import com.sino.training.module.exam.vo.QuestionCategoryVO; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.tags.Tag; -import jakarta.validation.Valid; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -/** - * 题目分类控制器 - * - * @author training-system - */ -@Tag(name = "题目分类", description = "题目分类CRUD接口") -@RestController -@RequestMapping("/api/exam/question-category") -@RequiredArgsConstructor -public class QuestionCategoryController { - - private final QuestionCategoryService questionCategoryService; - - @Operation(summary = "获取分类树") - @GetMapping("/tree") - public Result> tree( - @Parameter(description = "部门ID") @RequestParam(required = false) Long departmentId) { - return Result.success(questionCategoryService.getCategoryTree(departmentId)); - } - - @Operation(summary = "获取分类列表") - @GetMapping("/list") - public Result> list( - @Parameter(description = "部门ID") @RequestParam(required = false) Long departmentId) { - return Result.success(questionCategoryService.listCategories(departmentId)); - } - - @Operation(summary = "获取分类详情") - @GetMapping("/{id}") - public Result detail(@PathVariable Long id) { - return Result.success(questionCategoryService.getCategoryDetail(id)); - } - - @Operation(summary = "创建分类") - @PostMapping - public Result create(@Valid @RequestBody QuestionCategoryDTO dto) { - return Result.success(questionCategoryService.createCategory(dto)); - } - - @Operation(summary = "更新分类") - @PutMapping - public Result update(@Valid @RequestBody QuestionCategoryDTO dto) { - questionCategoryService.updateCategory(dto); - return Result.success(); - } - - @Operation(summary = "删除分类") - @DeleteMapping("/{id}") - public Result delete(@PathVariable Long id) { - questionCategoryService.deleteCategory(id); - return Result.success(); - } -} diff --git a/training-system/src/main/java/com/sino/training/module/exam/controller/QuestionController.java b/training-system/src/main/java/com/sino/training/module/exam/controller/QuestionController.java deleted file mode 100644 index 779f73b..0000000 --- a/training-system/src/main/java/com/sino/training/module/exam/controller/QuestionController.java +++ /dev/null @@ -1,90 +0,0 @@ -package com.sino.training.module.exam.controller; - -import com.sino.training.common.result.PageResult; -import com.sino.training.common.result.Result; -import com.sino.training.module.exam.dto.QuestionDTO; -import com.sino.training.module.exam.dto.QuestionQueryDTO; -import com.sino.training.module.exam.service.QuestionService; -import com.sino.training.module.exam.vo.QuestionVO; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.tags.Tag; -import jakarta.validation.Valid; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -/** - * 题目管理控制器 - * - * @author training-system - */ -@Tag(name = "题目管理", description = "题目CRUD接口") -@RestController -@RequestMapping("/api/exam/question") -@RequiredArgsConstructor -public class QuestionController { - - private final QuestionService questionService; - - @Operation(summary = "分页查询题目列表") - @GetMapping("/page") - public Result> page(QuestionQueryDTO queryDTO) { - return Result.success(questionService.pageQuestions(queryDTO)); - } - - @Operation(summary = "获取题目详情") - @GetMapping("/{id}") - public Result detail(@PathVariable Long id) { - return Result.success(questionService.getQuestionDetail(id)); - } - - @Operation(summary = "创建题目") - @PostMapping - public Result create(@Valid @RequestBody QuestionDTO dto) { - return Result.success(questionService.createQuestion(dto)); - } - - @Operation(summary = "更新题目") - @PutMapping - public Result update(@Valid @RequestBody QuestionDTO dto) { - questionService.updateQuestion(dto); - return Result.success(); - } - - @Operation(summary = "删除题目") - @DeleteMapping("/{id}") - public Result delete(@PathVariable Long id) { - questionService.deleteQuestion(id); - return Result.success(); - } - - @Operation(summary = "发布题目") - @PutMapping("/{id}/publish") - public Result publish(@PathVariable Long id) { - questionService.publishQuestion(id); - return Result.success(); - } - - @Operation(summary = "下架题目") - @PutMapping("/{id}/offline") - public Result offline(@PathVariable Long id) { - questionService.offlineQuestion(id); - return Result.success(); - } - - @Operation(summary = "根据分类获取已发布题目") - @GetMapping("/published/category/{categoryId}") - public Result> listByCategory(@PathVariable Long categoryId) { - return Result.success(questionService.listByCategory(categoryId)); - } - - @Operation(summary = "根据部门获取已发布题目") - @GetMapping("/published/department/{departmentId}") - public Result> listByDepartment( - @PathVariable Long departmentId, - @Parameter(description = "题目类型") @RequestParam(required = false) String type) { - return Result.success(questionService.listPublishedByDepartment(departmentId, type)); - } -} diff --git a/training-system/src/main/java/com/sino/training/module/exam/dto/AutoPaperDTO.java b/training-system/src/main/java/com/sino/training/module/exam/dto/AutoPaperDTO.java deleted file mode 100644 index b14abb6..0000000 --- a/training-system/src/main/java/com/sino/training/module/exam/dto/AutoPaperDTO.java +++ /dev/null @@ -1,70 +0,0 @@ -package com.sino.training.module.exam.dto; - -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotNull; -import lombok.Data; - -import java.io.Serializable; - -/** - * 自动组卷DTO - * - * @author training-system - */ -@Data -public class AutoPaperDTO implements Serializable { - - private static final long serialVersionUID = 1L; - - @NotBlank(message = "试卷标题不能为空") - private String title; - - private String description; - - @NotNull(message = "考试时长不能为空") - private Integer duration; - - @NotNull(message = "及格分数不能为空") - private Integer passScore; - - /** - * 所属部门ID - * 管理员必传,讲师可不传(自动使用当前用户部门) - */ - private Long departmentId; - - /** - * 单选题数量 - */ - private Integer singleCount = 0; - - /** - * 单选题分值 - */ - private Integer singleScore = 0; - - /** - * 多选题数量 - */ - private Integer multipleCount = 0; - - /** - * 多选题分值 - */ - private Integer multipleScore = 0; - - /** - * 判断题数量 - */ - private Integer judgeCount = 0; - - /** - * 判断题分值 - */ - private Integer judgeScore = 0; - - /** - * 分类ID(从指定分类抽题,可选) - */ - private Long categoryId; -} diff --git a/training-system/src/main/java/com/sino/training/module/exam/dto/ExamDTO.java b/training-system/src/main/java/com/sino/training/module/exam/dto/ExamDTO.java deleted file mode 100644 index cae0b76..0000000 --- a/training-system/src/main/java/com/sino/training/module/exam/dto/ExamDTO.java +++ /dev/null @@ -1,86 +0,0 @@ -package com.sino.training.module.exam.dto; - -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotNull; -import lombok.Data; - -import java.io.Serializable; -import java.time.LocalDateTime; -import java.util.List; - -/** - * 考试DTO - * - * @author training-system - */ -@Data -public class ExamDTO implements Serializable { - - private static final long serialVersionUID = 1L; - - private Long id; - - @NotBlank(message = "考试标题不能为空") - private String title; - - private String description; - - @NotNull(message = "关联试卷不能为空") - private Long paperId; - - @NotNull(message = "开始时间不能为空") - private LocalDateTime startTime; - - @NotNull(message = "结束时间不能为空") - private LocalDateTime endTime; - - /** - * 允许补考次数(默认为0,表示只能考1次) - */ - private Integer retryTimes; - - /** - * 允许迟到分钟数 - */ - private Integer lateMinutes; - - /** - * 交卷后显示答案 - */ - private Boolean showAnswer; - - /** - * 题目顺序随机 - */ - private Boolean shuffleQuestion; - - /** - * 选项顺序随机 - */ - private Boolean shuffleOption; - - /** - * 所属部门ID - * 管理员必传,讲师可不传(自动使用当前用户部门) - */ - private Long departmentId; - - /** - * 参与人员ID列表(前端传入) - */ - private List participantIds; - - /** - * 考试对象列表(兼容旧格式) - */ - private List targets; - - @Data - public static class ExamTargetDTO implements Serializable { - /** - * DEPARTMENT/GROUP/USER - */ - private String targetType; - private Long targetId; - } -} diff --git a/training-system/src/main/java/com/sino/training/module/exam/dto/ExamQueryDTO.java b/training-system/src/main/java/com/sino/training/module/exam/dto/ExamQueryDTO.java deleted file mode 100644 index d9fab05..0000000 --- a/training-system/src/main/java/com/sino/training/module/exam/dto/ExamQueryDTO.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.sino.training.module.exam.dto; - -import com.sino.training.common.base.PageQuery; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * 考试查询DTO - * - * @author training-system - */ -@Data -@EqualsAndHashCode(callSuper = true) -public class ExamQueryDTO extends PageQuery { - - private String keyword; - private Long departmentId; - private String status; -} diff --git a/training-system/src/main/java/com/sino/training/module/exam/dto/PaperDTO.java b/training-system/src/main/java/com/sino/training/module/exam/dto/PaperDTO.java deleted file mode 100644 index b4516e1..0000000 --- a/training-system/src/main/java/com/sino/training/module/exam/dto/PaperDTO.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.sino.training.module.exam.dto; - -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotNull; -import lombok.Data; - -import java.io.Serializable; -import java.util.List; - -/** - * 试卷DTO - * - * @author training-system - */ -@Data -public class PaperDTO implements Serializable { - - private static final long serialVersionUID = 1L; - - private Long id; - - @NotBlank(message = "试卷标题不能为空") - private String title; - - private String description; - - @NotNull(message = "总分不能为空") - private Integer totalScore; - - @NotNull(message = "考试时长不能为空") - private Integer duration; - - @NotNull(message = "及格分数不能为空") - private Integer passScore; - - /** - * 所属部门ID - * 管理员必传,讲师可不传(自动使用当前用户部门) - */ - private Long departmentId; - - /** - * 试卷题目列表 - */ - private List questions; - - @Data - public static class PaperQuestionDTO implements Serializable { - private Long questionId; - private Integer score; - private Integer sortOrder; - } -} diff --git a/training-system/src/main/java/com/sino/training/module/exam/dto/PaperQueryDTO.java b/training-system/src/main/java/com/sino/training/module/exam/dto/PaperQueryDTO.java deleted file mode 100644 index ba4766e..0000000 --- a/training-system/src/main/java/com/sino/training/module/exam/dto/PaperQueryDTO.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.sino.training.module.exam.dto; - -import com.sino.training.common.base.PageQuery; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * 试卷查询DTO - * - * @author training-system - */ -@Data -@EqualsAndHashCode(callSuper = true) -public class PaperQueryDTO extends PageQuery { - - private String keyword; - private Long departmentId; - private String status; -} diff --git a/training-system/src/main/java/com/sino/training/module/exam/dto/QuestionCategoryDTO.java b/training-system/src/main/java/com/sino/training/module/exam/dto/QuestionCategoryDTO.java deleted file mode 100644 index d036ec4..0000000 --- a/training-system/src/main/java/com/sino/training/module/exam/dto/QuestionCategoryDTO.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.sino.training.module.exam.dto; - -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotNull; -import lombok.Data; - -import java.io.Serializable; - -/** - * 题目分类DTO - * - * @author training-system - */ -@Data -public class QuestionCategoryDTO implements Serializable { - - private static final long serialVersionUID = 1L; - - private Long id; - - @NotBlank(message = "分类名称不能为空") - private String name; - - private Long parentId; - - /** - * 所属部门ID - * 管理员必传,讲师可不传(自动使用当前用户部门) - */ - private Long departmentId; - - private Integer sortOrder; -} diff --git a/training-system/src/main/java/com/sino/training/module/exam/dto/QuestionDTO.java b/training-system/src/main/java/com/sino/training/module/exam/dto/QuestionDTO.java deleted file mode 100644 index 6806344..0000000 --- a/training-system/src/main/java/com/sino/training/module/exam/dto/QuestionDTO.java +++ /dev/null @@ -1,116 +0,0 @@ -package com.sino.training.module.exam.dto; - -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.core.JsonToken; -import com.fasterxml.jackson.databind.DeserializationContext; -import com.fasterxml.jackson.databind.JsonDeserializer; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotNull; -import lombok.Data; - -import java.io.IOException; -import java.io.Serializable; -import java.util.ArrayList; -import java.util.List; - -/** - * 题目DTO - * - * @author training-system - */ -@Data -public class QuestionDTO implements Serializable { - - private static final long serialVersionUID = 1L; - - private Long id; - - @NotBlank(message = "题目类型不能为空") - private String type; - - @NotBlank(message = "题干不能为空") - private String content; - - /** - * 选项列表(支持数组或JSON字符串格式) - */ - @JsonDeserialize(using = OptionListDeserializer.class) - private List options; - - @NotBlank(message = "正确答案不能为空") - private String answer; - - @NotBlank(message = "答案解析不能为空") - private String analysis; - - @NotNull(message = "所属分类不能为空") - private Long categoryId; - - /** - * 所属部门ID - * 管理员必传,讲师可不传(自动使用当前用户部门) - */ - private Long departmentId; - - @Data - public static class OptionDTO implements Serializable { - private static final long serialVersionUID = 1L; - private String key; - private String value; - } - - /** - * 选项列表反序列化器 - * 支持三种格式: - * 1. 对象数组: [{"key":"A","value":"选项1"}] - * 2. 字符串数组: ["选项1","选项2"] - 自动生成key为A,B,C,D... - * 3. JSON字符串: "[...]" - 先解析字符串再按上述规则处理 - */ - public static class OptionListDeserializer extends JsonDeserializer> { - private static final ObjectMapper MAPPER = new ObjectMapper(); - - @Override - public List deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { - JsonNode node; - if (p.currentToken() == JsonToken.VALUE_STRING) { - // 如果是字符串,先解析为JsonNode - String jsonString = p.getValueAsString(); - node = MAPPER.readTree(jsonString); - } else { - node = p.getCodec().readTree(p); - } - - if (node == null || !node.isArray()) { - return null; - } - - List options = new ArrayList<>(); - int index = 0; - for (JsonNode item : node) { - OptionDTO option = new OptionDTO(); - if (item.isObject()) { - // 对象格式: {"key":"A","value":"选项"} - option.setKey(item.has("key") ? item.get("key").asText() : generateKey(index)); - option.setValue(item.has("value") ? item.get("value").asText() : ""); - } else if (item.isTextual()) { - // 字符串格式: "选项内容" - 自动生成key - option.setKey(generateKey(index)); - option.setValue(item.asText()); - } - options.add(option); - index++; - } - return options; - } - - /** - * 根据索引生成选项key (A, B, C, D, ...) - */ - private String generateKey(int index) { - return String.valueOf((char) ('A' + index)); - } - } -} diff --git a/training-system/src/main/java/com/sino/training/module/exam/dto/QuestionQueryDTO.java b/training-system/src/main/java/com/sino/training/module/exam/dto/QuestionQueryDTO.java deleted file mode 100644 index d7d2fd6..0000000 --- a/training-system/src/main/java/com/sino/training/module/exam/dto/QuestionQueryDTO.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.sino.training.module.exam.dto; - -import com.sino.training.common.base.PageQuery; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * 题目查询DTO - * - * @author training-system - */ -@Data -@EqualsAndHashCode(callSuper = true) -public class QuestionQueryDTO extends PageQuery { - - private String keyword; - private Long categoryId; - private Long departmentId; - private String type; - private String status; -} diff --git a/training-system/src/main/java/com/sino/training/module/exam/dto/SubmitExamDTO.java b/training-system/src/main/java/com/sino/training/module/exam/dto/SubmitExamDTO.java deleted file mode 100644 index 5e1a656..0000000 --- a/training-system/src/main/java/com/sino/training/module/exam/dto/SubmitExamDTO.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.sino.training.module.exam.dto; - -import jakarta.validation.constraints.NotNull; -import lombok.Data; - -import java.io.Serializable; -import java.util.List; - -/** - * 提交考试DTO - * - * @author training-system - */ -@Data -public class SubmitExamDTO implements Serializable { - - private static final long serialVersionUID = 1L; - - @NotNull(message = "考试记录ID不能为空") - private Long recordId; - - /** - * 答案列表 - */ - private List answers; - - @Data - public static class AnswerDTO implements Serializable { - private Long questionId; - private String answer; - } -} diff --git a/training-system/src/main/java/com/sino/training/module/exam/entity/Exam.java b/training-system/src/main/java/com/sino/training/module/exam/entity/Exam.java deleted file mode 100644 index a3a65fb..0000000 --- a/training-system/src/main/java/com/sino/training/module/exam/entity/Exam.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.sino.training.module.exam.entity; - -import com.baomidou.mybatisplus.annotation.TableName; -import com.sino.training.common.base.BaseEntity; -import com.sino.training.common.enums.ExamStatus; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.time.LocalDateTime; - -/** - * 考试实体 - * - * @author training-system - */ -@Data -@EqualsAndHashCode(callSuper = true) -@TableName("ex_exam") -public class Exam extends BaseEntity { - - /** - * 考试标题 - */ - private String title; - - /** - * 考试描述 - */ - private String description; - - /** - * 关联试卷ID - */ - private Long paperId; - - /** - * 开始时间 - */ - private LocalDateTime startTime; - - /** - * 结束时间 - */ - private LocalDateTime endTime; - - /** - * 最大考试次数 - */ - private Integer maxAttempts; - - /** - * 所属部门ID - */ - private Long departmentId; - - /** - * 考试状态 - */ - private ExamStatus status; - - /** - * 创建人ID - */ - private Long creatorId; -} diff --git a/training-system/src/main/java/com/sino/training/module/exam/entity/ExamRecord.java b/training-system/src/main/java/com/sino/training/module/exam/entity/ExamRecord.java deleted file mode 100644 index d5140ae..0000000 --- a/training-system/src/main/java/com/sino/training/module/exam/entity/ExamRecord.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.sino.training.module.exam.entity; - -import com.baomidou.mybatisplus.annotation.TableName; -import com.sino.training.common.base.BaseEntity; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.time.LocalDateTime; - -/** - * 考试记录实体 - * - * @author training-system - */ -@Data -@EqualsAndHashCode(callSuper = true) -@TableName("ex_exam_record") -public class ExamRecord extends BaseEntity { - - /** - * 考试ID - */ - private Long examId; - - /** - * 用户ID - */ - private Long userId; - - /** - * 第几次考试 - */ - private Integer attemptNo; - - /** - * 得分 - */ - private Integer score; - - /** - * 是否通过 - */ - private Boolean passed; - - /** - * 开始时间 - */ - private LocalDateTime startTime; - - /** - * 提交时间 - */ - private LocalDateTime submitTime; - - /** - * 答题详情(JSON格式) - * 格式: [{"questionId":1,"answer":"A","correct":true,"score":5},...] - */ - private String answers; - - /** - * 考试状态:0-进行中,1-已提交 - */ - private Integer status; -} diff --git a/training-system/src/main/java/com/sino/training/module/exam/entity/ExamTarget.java b/training-system/src/main/java/com/sino/training/module/exam/entity/ExamTarget.java deleted file mode 100644 index eea9467..0000000 --- a/training-system/src/main/java/com/sino/training/module/exam/entity/ExamTarget.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.sino.training.module.exam.entity; - -import com.baomidou.mybatisplus.annotation.TableName; -import com.sino.training.common.base.BaseEntity; -import com.sino.training.common.enums.TargetType; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * 考试对象实体 - * - * @author training-system - */ -@Data -@EqualsAndHashCode(callSuper = true) -@TableName("ex_exam_target") -public class ExamTarget extends BaseEntity { - - /** - * 考试ID - */ - private Long examId; - - /** - * 目标类型 - */ - private TargetType targetType; - - /** - * 目标ID(部门ID/小组ID/用户ID) - */ - private Long targetId; -} diff --git a/training-system/src/main/java/com/sino/training/module/exam/entity/Paper.java b/training-system/src/main/java/com/sino/training/module/exam/entity/Paper.java deleted file mode 100644 index 837b9f4..0000000 --- a/training-system/src/main/java/com/sino/training/module/exam/entity/Paper.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.sino.training.module.exam.entity; - -import com.baomidou.mybatisplus.annotation.TableName; -import com.sino.training.common.base.BaseEntity; -import com.sino.training.common.enums.ContentStatus; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.time.LocalDateTime; - -/** - * 试卷实体 - * - * @author training-system - */ -@Data -@EqualsAndHashCode(callSuper = true) -@TableName("ex_paper") -public class Paper extends BaseEntity { - - /** - * 试卷标题 - */ - private String title; - - /** - * 试卷描述 - */ - private String description; - - /** - * 总分 - */ - private Integer totalScore; - - /** - * 考试时长(分钟) - */ - private Integer duration; - - /** - * 及格分数 - */ - private Integer passScore; - - /** - * 所属部门ID - */ - private Long departmentId; - - /** - * 状态 - */ - private ContentStatus status; - - /** - * 创建人ID - */ - private Long creatorId; - - /** - * 发布时间 - */ - private LocalDateTime publishTime; -} diff --git a/training-system/src/main/java/com/sino/training/module/exam/entity/PaperQuestion.java b/training-system/src/main/java/com/sino/training/module/exam/entity/PaperQuestion.java deleted file mode 100644 index 8125705..0000000 --- a/training-system/src/main/java/com/sino/training/module/exam/entity/PaperQuestion.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.sino.training.module.exam.entity; - -import com.baomidou.mybatisplus.annotation.TableName; -import com.sino.training.common.base.BaseEntity; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * 试卷题目关联实体 - * - * @author training-system - */ -@Data -@EqualsAndHashCode(callSuper = true) -@TableName("ex_paper_question") -public class PaperQuestion extends BaseEntity { - - /** - * 试卷ID - */ - private Long paperId; - - /** - * 题目ID - */ - private Long questionId; - - /** - * 该题分值 - */ - private Integer score; - - /** - * 排序 - */ - private Integer sortOrder; -} diff --git a/training-system/src/main/java/com/sino/training/module/exam/entity/Question.java b/training-system/src/main/java/com/sino/training/module/exam/entity/Question.java deleted file mode 100644 index 43f4509..0000000 --- a/training-system/src/main/java/com/sino/training/module/exam/entity/Question.java +++ /dev/null @@ -1,75 +0,0 @@ -package com.sino.training.module.exam.entity; - -import com.baomidou.mybatisplus.annotation.TableName; -import com.sino.training.common.base.BaseEntity; -import com.sino.training.common.enums.ContentStatus; -import com.sino.training.common.enums.QuestionType; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.time.LocalDateTime; - -/** - * 题目实体 - * - * @author training-system - */ -@Data -@EqualsAndHashCode(callSuper = true) -@TableName("ex_question") -public class Question extends BaseEntity { - - /** - * 题目类型 - */ - private QuestionType type; - - /** - * 题干内容 - */ - private String content; - - /** - * 选项(JSON格式,判断题为空) - * 格式: [{"key":"A","value":"选项内容"},...] - */ - private String options; - - /** - * 正确答案 - * 单选题: "A" - * 多选题: "A,B,C" - * 判断题: "TRUE" 或 "FALSE" - */ - private String answer; - - /** - * 答案解析 - */ - private String analysis; - - /** - * 所属分类ID - */ - private Long categoryId; - - /** - * 所属部门ID - */ - private Long departmentId; - - /** - * 状态 - */ - private ContentStatus status; - - /** - * 创建人ID - */ - private Long creatorId; - - /** - * 发布时间 - */ - private LocalDateTime publishTime; -} diff --git a/training-system/src/main/java/com/sino/training/module/exam/entity/QuestionCategory.java b/training-system/src/main/java/com/sino/training/module/exam/entity/QuestionCategory.java deleted file mode 100644 index 3e0b5d7..0000000 --- a/training-system/src/main/java/com/sino/training/module/exam/entity/QuestionCategory.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.sino.training.module.exam.entity; - -import com.baomidou.mybatisplus.annotation.TableName; -import com.sino.training.common.base.BaseEntity; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * 题目分类实体 - * - * @author training-system - */ -@Data -@EqualsAndHashCode(callSuper = true) -@TableName("ex_question_category") -public class QuestionCategory extends BaseEntity { - - /** - * 分类名称 - */ - private String name; - - /** - * 父分类ID(0表示顶级分类) - */ - private Long parentId; - - /** - * 所属部门ID - */ - private Long departmentId; - - /** - * 排序 - */ - private Integer sortOrder; -} diff --git a/training-system/src/main/java/com/sino/training/module/exam/mapper/ExamMapper.java b/training-system/src/main/java/com/sino/training/module/exam/mapper/ExamMapper.java deleted file mode 100644 index c78f09c..0000000 --- a/training-system/src/main/java/com/sino/training/module/exam/mapper/ExamMapper.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.sino.training.module.exam.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.sino.training.module.exam.entity.Exam; -import org.apache.ibatis.annotations.Mapper; - -/** - * 考试 Mapper - * - * @author training-system - */ -@Mapper -public interface ExamMapper extends BaseMapper { -} diff --git a/training-system/src/main/java/com/sino/training/module/exam/mapper/ExamRecordMapper.java b/training-system/src/main/java/com/sino/training/module/exam/mapper/ExamRecordMapper.java deleted file mode 100644 index 71a707c..0000000 --- a/training-system/src/main/java/com/sino/training/module/exam/mapper/ExamRecordMapper.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.sino.training.module.exam.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.sino.training.module.exam.entity.ExamRecord; -import org.apache.ibatis.annotations.Mapper; - -/** - * 考试记录 Mapper - * - * @author training-system - */ -@Mapper -public interface ExamRecordMapper extends BaseMapper { -} diff --git a/training-system/src/main/java/com/sino/training/module/exam/mapper/ExamTargetMapper.java b/training-system/src/main/java/com/sino/training/module/exam/mapper/ExamTargetMapper.java deleted file mode 100644 index 06c5f6a..0000000 --- a/training-system/src/main/java/com/sino/training/module/exam/mapper/ExamTargetMapper.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.sino.training.module.exam.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.sino.training.module.exam.entity.ExamTarget; -import org.apache.ibatis.annotations.Mapper; - -/** - * 考试对象 Mapper - * - * @author training-system - */ -@Mapper -public interface ExamTargetMapper extends BaseMapper { -} diff --git a/training-system/src/main/java/com/sino/training/module/exam/mapper/PaperMapper.java b/training-system/src/main/java/com/sino/training/module/exam/mapper/PaperMapper.java deleted file mode 100644 index 5b1c424..0000000 --- a/training-system/src/main/java/com/sino/training/module/exam/mapper/PaperMapper.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.sino.training.module.exam.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.sino.training.module.exam.entity.Paper; -import org.apache.ibatis.annotations.Mapper; - -/** - * 试卷 Mapper - * - * @author training-system - */ -@Mapper -public interface PaperMapper extends BaseMapper { -} diff --git a/training-system/src/main/java/com/sino/training/module/exam/mapper/PaperQuestionMapper.java b/training-system/src/main/java/com/sino/training/module/exam/mapper/PaperQuestionMapper.java deleted file mode 100644 index ef011f6..0000000 --- a/training-system/src/main/java/com/sino/training/module/exam/mapper/PaperQuestionMapper.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.sino.training.module.exam.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.sino.training.module.exam.entity.PaperQuestion; -import org.apache.ibatis.annotations.Mapper; - -/** - * 试卷题目关联 Mapper - * - * @author training-system - */ -@Mapper -public interface PaperQuestionMapper extends BaseMapper { -} diff --git a/training-system/src/main/java/com/sino/training/module/exam/mapper/QuestionCategoryMapper.java b/training-system/src/main/java/com/sino/training/module/exam/mapper/QuestionCategoryMapper.java deleted file mode 100644 index d7bec4f..0000000 --- a/training-system/src/main/java/com/sino/training/module/exam/mapper/QuestionCategoryMapper.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.sino.training.module.exam.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.sino.training.module.exam.entity.QuestionCategory; -import org.apache.ibatis.annotations.Mapper; - -/** - * 题目分类 Mapper - * - * @author training-system - */ -@Mapper -public interface QuestionCategoryMapper extends BaseMapper { -} diff --git a/training-system/src/main/java/com/sino/training/module/exam/mapper/QuestionMapper.java b/training-system/src/main/java/com/sino/training/module/exam/mapper/QuestionMapper.java deleted file mode 100644 index ccca6b0..0000000 --- a/training-system/src/main/java/com/sino/training/module/exam/mapper/QuestionMapper.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.sino.training.module.exam.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.sino.training.module.exam.entity.Question; -import org.apache.ibatis.annotations.Mapper; - -/** - * 题目 Mapper - * - * @author training-system - */ -@Mapper -public interface QuestionMapper extends BaseMapper { -} diff --git a/training-system/src/main/java/com/sino/training/module/exam/service/ExamRecordService.java b/training-system/src/main/java/com/sino/training/module/exam/service/ExamRecordService.java deleted file mode 100644 index ec3f22b..0000000 --- a/training-system/src/main/java/com/sino/training/module/exam/service/ExamRecordService.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.sino.training.module.exam.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.sino.training.module.exam.dto.SubmitExamDTO; -import com.sino.training.module.exam.entity.ExamRecord; -import com.sino.training.module.exam.vo.ExamPaperVO; -import com.sino.training.module.exam.vo.ExamRecordVO; - -import java.util.List; - -/** - * 考试记录服务接口 - * - * @author training-system - */ -public interface ExamRecordService extends IService { - - /** - * 开始考试 - */ - ExamPaperVO startExam(Long examId, Long userId); - - /** - * 获取考试试卷(答题中) - */ - ExamPaperVO getExamPaper(Long recordId); - - /** - * 保存答案(自动保存) - */ - void saveAnswers(SubmitExamDTO dto); - - /** - * 提交考试 - */ - ExamRecordVO submitExam(SubmitExamDTO dto); - - /** - * 获取考试记录详情(含答案解析) - */ - ExamRecordVO getRecordDetail(Long recordId); - - /** - * 获取用户的考试记录列表 - */ - List listUserRecords(Long examId, Long userId); - - /** - * 获取考试的所有记录(讲师/管理员查看) - */ - List listExamRecords(Long examId); - - /** - * 获取用户的考试次数 - */ - int getUserAttemptCount(Long examId, Long userId); - - /** - * 获取用户的最高分 - */ - Integer getUserHighestScore(Long examId, Long userId); -} diff --git a/training-system/src/main/java/com/sino/training/module/exam/service/ExamService.java b/training-system/src/main/java/com/sino/training/module/exam/service/ExamService.java deleted file mode 100644 index 514815e..0000000 --- a/training-system/src/main/java/com/sino/training/module/exam/service/ExamService.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.sino.training.module.exam.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.sino.training.common.result.PageResult; -import com.sino.training.module.exam.dto.ExamDTO; -import com.sino.training.module.exam.dto.ExamQueryDTO; -import com.sino.training.module.exam.entity.Exam; -import com.sino.training.module.exam.vo.ExamVO; - -import java.util.List; - -/** - * 考试服务接口 - * - * @author training-system - */ -public interface ExamService extends IService { - - PageResult pageExams(ExamQueryDTO queryDTO); - - ExamVO getExamDetail(Long id); - - Long createExam(ExamDTO dto); - - void updateExam(ExamDTO dto); - - void deleteExam(Long id); - - /** - * 获取用户可参加的考试列表 - */ - List listMyExams(Long userId); - - /** - * 检查用户是否可以参加考试 - */ - boolean canTakeExam(Long examId, Long userId); -} diff --git a/training-system/src/main/java/com/sino/training/module/exam/service/PaperService.java b/training-system/src/main/java/com/sino/training/module/exam/service/PaperService.java deleted file mode 100644 index 5e4e59e..0000000 --- a/training-system/src/main/java/com/sino/training/module/exam/service/PaperService.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.sino.training.module.exam.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.sino.training.common.result.PageResult; -import com.sino.training.module.exam.dto.AutoPaperDTO; -import com.sino.training.module.exam.dto.PaperDTO; -import com.sino.training.module.exam.dto.PaperQueryDTO; -import com.sino.training.module.exam.entity.Paper; -import com.sino.training.module.exam.vo.PaperVO; - -import java.util.List; - -/** - * 试卷服务接口 - * - * @author training-system - */ -public interface PaperService extends IService { - - PageResult pagePapers(PaperQueryDTO queryDTO); - - PaperVO getPaperDetail(Long id); - - Long createPaper(PaperDTO dto); - - Long createAutoPaper(AutoPaperDTO dto); - - void updatePaper(PaperDTO dto); - - void deletePaper(Long id); - - void publishPaper(Long id); - - void offlinePaper(Long id); - - List listPublishedByDepartment(Long departmentId); - - /** - * 获取当前用户部门的已发布试卷列表 - * - * @return 试卷列表 - */ - List listPublishedPapers(); -} diff --git a/training-system/src/main/java/com/sino/training/module/exam/service/QuestionCategoryService.java b/training-system/src/main/java/com/sino/training/module/exam/service/QuestionCategoryService.java deleted file mode 100644 index 0b0e0d6..0000000 --- a/training-system/src/main/java/com/sino/training/module/exam/service/QuestionCategoryService.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.sino.training.module.exam.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.sino.training.module.exam.dto.QuestionCategoryDTO; -import com.sino.training.module.exam.entity.QuestionCategory; -import com.sino.training.module.exam.vo.QuestionCategoryVO; - -import java.util.List; - -/** - * 题目分类服务接口 - * - * @author training-system - */ -public interface QuestionCategoryService extends IService { - - List getCategoryTree(Long departmentId); - - List listCategories(Long departmentId); - - QuestionCategoryVO getCategoryDetail(Long id); - - Long createCategory(QuestionCategoryDTO dto); - - void updateCategory(QuestionCategoryDTO dto); - - void deleteCategory(Long id); -} diff --git a/training-system/src/main/java/com/sino/training/module/exam/service/QuestionService.java b/training-system/src/main/java/com/sino/training/module/exam/service/QuestionService.java deleted file mode 100644 index 289f509..0000000 --- a/training-system/src/main/java/com/sino/training/module/exam/service/QuestionService.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.sino.training.module.exam.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.sino.training.common.result.PageResult; -import com.sino.training.module.exam.dto.QuestionDTO; -import com.sino.training.module.exam.dto.QuestionQueryDTO; -import com.sino.training.module.exam.entity.Question; -import com.sino.training.module.exam.vo.QuestionVO; - -import java.util.List; - -/** - * 题目服务接口 - * - * @author training-system - */ -public interface QuestionService extends IService { - - PageResult pageQuestions(QuestionQueryDTO queryDTO); - - QuestionVO getQuestionDetail(Long id); - - Long createQuestion(QuestionDTO dto); - - void updateQuestion(QuestionDTO dto); - - void deleteQuestion(Long id); - - void publishQuestion(Long id); - - void offlineQuestion(Long id); - - List listByCategory(Long categoryId); - - List listPublishedByDepartment(Long departmentId, String type); -} diff --git a/training-system/src/main/java/com/sino/training/module/exam/service/impl/ExamRecordServiceImpl.java b/training-system/src/main/java/com/sino/training/module/exam/service/impl/ExamRecordServiceImpl.java deleted file mode 100644 index 5d1cb7b..0000000 --- a/training-system/src/main/java/com/sino/training/module/exam/service/impl/ExamRecordServiceImpl.java +++ /dev/null @@ -1,424 +0,0 @@ -package com.sino.training.module.exam.service.impl; - -import cn.hutool.core.util.StrUtil; -import cn.hutool.json.JSONUtil; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.sino.training.common.enums.ExamStatus; -import com.sino.training.common.enums.QuestionType; -import com.sino.training.common.exception.BusinessException; -import com.sino.training.common.result.ResultCode; -import com.sino.training.module.exam.dto.SubmitExamDTO; -import com.sino.training.module.exam.entity.*; -import com.sino.training.module.exam.mapper.*; -import com.sino.training.module.exam.service.ExamRecordService; -import com.sino.training.module.exam.service.ExamService; -import com.sino.training.module.exam.vo.ExamPaperVO; -import com.sino.training.module.exam.vo.ExamRecordVO; -import com.sino.training.module.exam.vo.QuestionVO; -import com.sino.training.module.system.entity.User; -import com.sino.training.module.system.mapper.UserMapper; -import lombok.Data; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.io.Serializable; -import java.time.Duration; -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * 考试记录服务实现类 - * - * @author training-system - */ -@Service -@RequiredArgsConstructor -public class ExamRecordServiceImpl extends ServiceImpl implements ExamRecordService { - - private final ExamMapper examMapper; - private final ExamService examService; - private final PaperMapper paperMapper; - private final PaperQuestionMapper paperQuestionMapper; - private final QuestionMapper questionMapper; - private final UserMapper userMapper; - - @Override - @Transactional(rollbackFor = Exception.class) - public ExamPaperVO startExam(Long examId, Long userId) { - // 检查是否可以参加考试 - if (!examService.canTakeExam(examId, userId)) { - Exam exam = examMapper.selectById(examId); - if (exam == null) { - throw new BusinessException(ResultCode.EXAM_NOT_FOUND); - } - if (exam.getStatus() == ExamStatus.NOT_STARTED) { - throw new BusinessException(ResultCode.EXAM_NOT_STARTED); - } - if (exam.getStatus() == ExamStatus.ENDED) { - throw new BusinessException(ResultCode.EXAM_ENDED); - } - throw new BusinessException(ResultCode.EXAM_ATTEMPTS_EXCEEDED); - } - - // 检查是否有未提交的考试记录 - LambdaQueryWrapper existQuery = new LambdaQueryWrapper<>(); - existQuery.eq(ExamRecord::getExamId, examId) - .eq(ExamRecord::getUserId, userId) - .eq(ExamRecord::getStatus, 0); // 进行中 - ExamRecord existRecord = getOne(existQuery); - - if (existRecord != null) { - // 返回已存在的考试 - return buildExamPaper(existRecord); - } - - // 创建新的考试记录 - int attemptNo = getUserAttemptCount(examId, userId) + 1; - - ExamRecord record = new ExamRecord(); - record.setExamId(examId); - record.setUserId(userId); - record.setAttemptNo(attemptNo); - record.setStartTime(LocalDateTime.now()); - record.setStatus(0); // 进行中 - - save(record); - - return buildExamPaper(record); - } - - @Override - public ExamPaperVO getExamPaper(Long recordId) { - ExamRecord record = getById(recordId); - if (record == null) { - throw new BusinessException(ResultCode.DATA_NOT_FOUND, "考试记录不存在"); - } - - if (record.getStatus() == 1) { - throw new BusinessException(ResultCode.BAD_REQUEST, "考试已提交"); - } - - return buildExamPaper(record); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void saveAnswers(SubmitExamDTO dto) { - ExamRecord record = getById(dto.getRecordId()); - if (record == null) { - throw new BusinessException(ResultCode.DATA_NOT_FOUND, "考试记录不存在"); - } - - if (record.getStatus() == 1) { - throw new BusinessException(ResultCode.BAD_REQUEST, "考试已提交,无法保存"); - } - - // 保存答案(不判分) - if (dto.getAnswers() != null) { - record.setAnswers(JSONUtil.toJsonStr(dto.getAnswers())); - updateById(record); - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public ExamRecordVO submitExam(SubmitExamDTO dto) { - ExamRecord record = getById(dto.getRecordId()); - if (record == null) { - throw new BusinessException(ResultCode.DATA_NOT_FOUND, "考试记录不存在"); - } - - if (record.getStatus() == 1) { - throw new BusinessException(ResultCode.BAD_REQUEST, "考试已提交"); - } - - Exam exam = examMapper.selectById(record.getExamId()); - Paper paper = paperMapper.selectById(exam.getPaperId()); - - // 获取试卷题目 - LambdaQueryWrapper pqQuery = new LambdaQueryWrapper<>(); - pqQuery.eq(PaperQuestion::getPaperId, paper.getId()) - .orderByAsc(PaperQuestion::getSortOrder); - List paperQuestions = paperQuestionMapper.selectList(pqQuery); - - // 构建答案Map - Map answerMap = new HashMap<>(); - if (dto.getAnswers() != null) { - for (SubmitExamDTO.AnswerDTO answer : dto.getAnswers()) { - answerMap.put(answer.getQuestionId(), answer.getAnswer()); - } - } - - // 判分 - int totalScore = 0; - List answerDetails = new ArrayList<>(); - - for (PaperQuestion pq : paperQuestions) { - Question question = questionMapper.selectById(pq.getQuestionId()); - String userAnswer = answerMap.get(pq.getQuestionId()); - boolean correct = checkAnswer(question, userAnswer); - int earnedScore = correct ? pq.getScore() : 0; - totalScore += earnedScore; - - AnswerDetail detail = new AnswerDetail(); - detail.setQuestionId(pq.getQuestionId()); - detail.setAnswer(userAnswer); - detail.setCorrect(correct); - detail.setScore(earnedScore); - answerDetails.add(detail); - } - - // 更新记录 - record.setScore(totalScore); - record.setPassed(totalScore >= paper.getPassScore()); - record.setSubmitTime(LocalDateTime.now()); - record.setAnswers(JSONUtil.toJsonStr(answerDetails)); - record.setStatus(1); // 已提交 - - updateById(record); - - return getRecordDetail(record.getId()); - } - - @Override - public ExamRecordVO getRecordDetail(Long recordId) { - ExamRecord record = getById(recordId); - if (record == null) { - throw new BusinessException(ResultCode.DATA_NOT_FOUND, "考试记录不存在"); - } - - return convertToVO(record, true); - } - - @Override - public List listUserRecords(Long examId, Long userId) { - LambdaQueryWrapper query = new LambdaQueryWrapper<>(); - query.eq(ExamRecord::getExamId, examId) - .eq(ExamRecord::getUserId, userId) - .eq(ExamRecord::getStatus, 1) - .orderByDesc(ExamRecord::getSubmitTime); - List records = list(query); - - List voList = new ArrayList<>(); - for (ExamRecord record : records) { - voList.add(convertToVO(record, false)); - } - return voList; - } - - @Override - public List listExamRecords(Long examId) { - LambdaQueryWrapper query = new LambdaQueryWrapper<>(); - query.eq(ExamRecord::getExamId, examId) - .eq(ExamRecord::getStatus, 1) - .orderByDesc(ExamRecord::getSubmitTime); - List records = list(query); - - List voList = new ArrayList<>(); - for (ExamRecord record : records) { - voList.add(convertToVO(record, false)); - } - return voList; - } - - @Override - public int getUserAttemptCount(Long examId, Long userId) { - LambdaQueryWrapper query = new LambdaQueryWrapper<>(); - query.eq(ExamRecord::getExamId, examId) - .eq(ExamRecord::getUserId, userId) - .eq(ExamRecord::getStatus, 1); - return (int) count(query); - } - - @Override - public Integer getUserHighestScore(Long examId, Long userId) { - LambdaQueryWrapper query = new LambdaQueryWrapper<>(); - query.eq(ExamRecord::getExamId, examId) - .eq(ExamRecord::getUserId, userId) - .eq(ExamRecord::getStatus, 1) - .orderByDesc(ExamRecord::getScore) - .last("LIMIT 1"); - ExamRecord record = getOne(query); - return record != null ? record.getScore() : null; - } - - private ExamPaperVO buildExamPaper(ExamRecord record) { - Exam exam = examMapper.selectById(record.getExamId()); - Paper paper = paperMapper.selectById(exam.getPaperId()); - - ExamPaperVO vo = new ExamPaperVO(); - vo.setRecordId(record.getId()); - vo.setExamId(exam.getId()); - vo.setExamTitle(exam.getTitle()); - vo.setDuration(paper.getDuration()); - vo.setTotalScore(paper.getTotalScore()); - - // 计算剩余时间 - LocalDateTime deadline = record.getStartTime().plusMinutes(paper.getDuration()); - long remainingSeconds = Duration.between(LocalDateTime.now(), deadline).getSeconds(); - vo.setRemainingSeconds(Math.max(0, remainingSeconds)); - - // 获取题目列表 - LambdaQueryWrapper pqQuery = new LambdaQueryWrapper<>(); - pqQuery.eq(PaperQuestion::getPaperId, paper.getId()) - .orderByAsc(PaperQuestion::getSortOrder); - List paperQuestions = paperQuestionMapper.selectList(pqQuery); - - // 解析已保存的答案 - Map savedAnswers = new HashMap<>(); - if (StrUtil.isNotBlank(record.getAnswers())) { - try { - List details = JSONUtil.toList(record.getAnswers(), AnswerDetail.class); - for (AnswerDetail detail : details) { - savedAnswers.put(detail.getQuestionId(), detail.getAnswer()); - } - } catch (Exception ignored) { - } - } - - List questions = new ArrayList<>(); - for (PaperQuestion pq : paperQuestions) { - Question question = questionMapper.selectById(pq.getQuestionId()); - - ExamPaperVO.ExamQuestionVO qVO = new ExamPaperVO.ExamQuestionVO(); - qVO.setQuestionId(question.getId()); - qVO.setSortOrder(pq.getSortOrder()); - qVO.setType(question.getType().name()); - qVO.setTypeName(getTypeName(question.getType())); - qVO.setContent(question.getContent()); - qVO.setScore(pq.getScore()); - qVO.setUserAnswer(savedAnswers.get(question.getId())); - - // 解析选项(不包含答案) - if (StrUtil.isNotBlank(question.getOptions())) { - List options = JSONUtil.toList(question.getOptions(), QuestionVO.OptionVO.class); - qVO.setOptions(options); - } - - questions.add(qVO); - } - - vo.setQuestions(questions); - return vo; - } - - private boolean checkAnswer(Question question, String userAnswer) { - if (StrUtil.isBlank(userAnswer)) { - return false; - } - - String correctAnswer = question.getAnswer(); - if (StrUtil.isBlank(correctAnswer)) { - return false; - } - - // 多选题需要比较答案集合 - if (question.getType() == QuestionType.MULTIPLE) { - String[] userParts = userAnswer.split(","); - String[] correctParts = correctAnswer.split(","); - - if (userParts.length != correctParts.length) { - return false; - } - - java.util.Set userSet = new java.util.HashSet<>(); - java.util.Set correctSet = new java.util.HashSet<>(); - - for (String s : userParts) { - userSet.add(s.trim().toUpperCase()); - } - for (String s : correctParts) { - correctSet.add(s.trim().toUpperCase()); - } - - return userSet.equals(correctSet); - } - - // 单选题和判断题直接比较 - return userAnswer.trim().equalsIgnoreCase(correctAnswer.trim()); - } - - private ExamRecordVO convertToVO(ExamRecord record, boolean includeAnswerDetails) { - ExamRecordVO vo = new ExamRecordVO(); - vo.setId(record.getId()); - vo.setExamId(record.getExamId()); - vo.setUserId(record.getUserId()); - vo.setAttemptNo(record.getAttemptNo()); - vo.setScore(record.getScore()); - vo.setPassed(record.getPassed()); - vo.setStartTime(record.getStartTime()); - vo.setSubmitTime(record.getSubmitTime()); - vo.setStatus(record.getStatus()); - vo.setStatusName(record.getStatus() == 0 ? "进行中" : "已提交"); - - // 获取考试信息 - Exam exam = examMapper.selectById(record.getExamId()); - if (exam != null) { - vo.setExamTitle(exam.getTitle()); - Paper paper = paperMapper.selectById(exam.getPaperId()); - if (paper != null) { - vo.setTotalScore(paper.getTotalScore()); - vo.setPassScore(paper.getPassScore()); - } - } - - // 获取用户姓名 - User user = userMapper.selectById(record.getUserId()); - if (user != null) { - vo.setUserName(user.getRealName()); - } - - // 答题详情 - if (includeAnswerDetails && StrUtil.isNotBlank(record.getAnswers()) && record.getStatus() == 1) { - List answerDetails = JSONUtil.toList(record.getAnswers(), AnswerDetail.class); - - List detailVOs = new ArrayList<>(); - for (AnswerDetail detail : answerDetails) { - Question question = questionMapper.selectById(detail.getQuestionId()); - if (question == null) continue; - - ExamRecordVO.AnswerDetailVO dVO = new ExamRecordVO.AnswerDetailVO(); - dVO.setQuestionId(question.getId()); - dVO.setQuestionContent(question.getContent()); - dVO.setQuestionType(question.getType().name()); - dVO.setUserAnswer(detail.getAnswer()); - dVO.setCorrectAnswer(question.getAnswer()); - dVO.setCorrect(detail.getCorrect()); - dVO.setScore(detail.getScore()); - dVO.setEarnedScore(detail.getCorrect() ? detail.getScore() : 0); - dVO.setAnalysis(question.getAnalysis()); - - if (StrUtil.isNotBlank(question.getOptions())) { - List options = JSONUtil.toList(question.getOptions(), QuestionVO.OptionVO.class); - dVO.setOptions(options); - } - - detailVOs.add(dVO); - } - vo.setAnswerDetails(detailVOs); - } - - return vo; - } - - private String getTypeName(QuestionType type) { - return switch (type) { - case SINGLE -> "单选题"; - case MULTIPLE -> "多选题"; - case JUDGE -> "判断题"; - }; - } - - @Data - private static class AnswerDetail implements Serializable { - private Long questionId; - private String answer; - private Boolean correct; - private Integer score; - } -} diff --git a/training-system/src/main/java/com/sino/training/module/exam/service/impl/ExamServiceImpl.java b/training-system/src/main/java/com/sino/training/module/exam/service/impl/ExamServiceImpl.java deleted file mode 100644 index fd2c88f..0000000 --- a/training-system/src/main/java/com/sino/training/module/exam/service/impl/ExamServiceImpl.java +++ /dev/null @@ -1,462 +0,0 @@ -package com.sino.training.module.exam.service.impl; - -import cn.hutool.core.util.StrUtil; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.sino.training.common.context.UserContext; -import com.sino.training.common.context.UserContextHolder; -import com.sino.training.common.enums.ExamStatus; -import com.sino.training.common.enums.TargetType; -import com.sino.training.common.exception.BusinessException; -import com.sino.training.common.result.PageResult; -import com.sino.training.common.result.ResultCode; -import com.sino.training.module.exam.dto.ExamDTO; -import com.sino.training.module.exam.dto.ExamQueryDTO; -import com.sino.training.module.exam.entity.Exam; -import com.sino.training.module.exam.entity.ExamRecord; -import com.sino.training.module.exam.entity.ExamTarget; -import com.sino.training.module.exam.entity.Paper; -import com.sino.training.module.exam.mapper.ExamMapper; -import com.sino.training.module.exam.mapper.ExamRecordMapper; -import com.sino.training.module.exam.mapper.ExamTargetMapper; -import com.sino.training.module.exam.mapper.PaperMapper; -import com.sino.training.module.exam.service.ExamService; -import com.sino.training.module.exam.vo.ExamVO; -import com.sino.training.module.system.entity.Department; -import com.sino.training.module.system.entity.Group; -import com.sino.training.module.system.entity.User; -import com.sino.training.module.system.mapper.DepartmentMapper; -import com.sino.training.module.system.mapper.GroupMapper; -import com.sino.training.module.system.mapper.UserMapper; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; - -/** - * 考试服务实现类 - * - * @author training-system - */ -@Service -@RequiredArgsConstructor -public class ExamServiceImpl extends ServiceImpl implements ExamService { - - private final ExamTargetMapper examTargetMapper; - private final ExamRecordMapper examRecordMapper; - private final PaperMapper paperMapper; - private final DepartmentMapper departmentMapper; - private final GroupMapper groupMapper; - private final UserMapper userMapper; - - @Override - public PageResult pageExams(ExamQueryDTO queryDTO) { - Page page = queryDTO.toPage(); - - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - - if (StrUtil.isNotBlank(queryDTO.getKeyword())) { - queryWrapper.like(Exam::getTitle, queryDTO.getKeyword()); - } - if (queryDTO.getDepartmentId() != null) { - queryWrapper.eq(Exam::getDepartmentId, queryDTO.getDepartmentId()); - } - if (StrUtil.isNotBlank(queryDTO.getStatus())) { - queryWrapper.eq(Exam::getStatus, ExamStatus.valueOf(queryDTO.getStatus())); - } - - queryWrapper.orderByDesc(Exam::getCreateTime); - - Page result = page(page, queryWrapper); - - List voList = new ArrayList<>(); - for (Exam exam : result.getRecords()) { - voList.add(convertToVO(exam, true)); - } - - return PageResult.of(result, voList); - } - - @Override - public ExamVO getExamDetail(Long id) { - Exam exam = getById(id); - if (exam == null) { - throw new BusinessException(ResultCode.EXAM_NOT_FOUND); - } - return convertToVO(exam, true); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public Long createExam(ExamDTO dto) { - Paper paper = paperMapper.selectById(dto.getPaperId()); - if (paper == null) { - throw new BusinessException(ResultCode.PAPER_NOT_FOUND); - } - - // 确定部门ID:管理员使用前端传值,其他用户强制使用自己的部门 - UserContext userContext = UserContextHolder.getContext(); - Long departmentId; - if ("ADMIN".equals(userContext.getRole())) { - departmentId = dto.getDepartmentId(); - if (departmentId == null) { - throw new BusinessException(ResultCode.BAD_REQUEST, "管理员必须指定所属部门"); - } - } else { - departmentId = userContext.getDepartmentId(); - } - - Department department = departmentMapper.selectById(departmentId); - if (department == null) { - throw new BusinessException(ResultCode.DATA_NOT_FOUND, "所属部门不存在"); - } - - if (dto.getStartTime().isAfter(dto.getEndTime())) { - throw new BusinessException(ResultCode.BAD_REQUEST, "开始时间不能晚于结束时间"); - } - - // retryTimes 表示补考次数,maxAttempts = retryTimes + 1 - int maxAttempts = (dto.getRetryTimes() != null ? dto.getRetryTimes() : 0) + 1; - - Exam exam = new Exam(); - exam.setTitle(dto.getTitle()); - exam.setDescription(dto.getDescription()); - exam.setPaperId(dto.getPaperId()); - exam.setStartTime(dto.getStartTime()); - exam.setEndTime(dto.getEndTime()); - exam.setMaxAttempts(maxAttempts); - exam.setDepartmentId(departmentId); - exam.setCreatorId(userContext.getUserId()); - exam.setStatus(calculateExamStatus(dto.getStartTime(), dto.getEndTime())); - - save(exam); - - // 保存考试对象:优先使用 participantIds,兼容 targets - if (dto.getParticipantIds() != null && !dto.getParticipantIds().isEmpty()) { - for (Long userId : dto.getParticipantIds()) { - ExamTarget target = new ExamTarget(); - target.setExamId(exam.getId()); - target.setTargetType(TargetType.USER); - target.setTargetId(userId); - examTargetMapper.insert(target); - } - } else if (dto.getTargets() != null && !dto.getTargets().isEmpty()) { - for (ExamDTO.ExamTargetDTO targetDTO : dto.getTargets()) { - ExamTarget target = new ExamTarget(); - target.setExamId(exam.getId()); - target.setTargetType(TargetType.valueOf(targetDTO.getTargetType())); - target.setTargetId(targetDTO.getTargetId()); - examTargetMapper.insert(target); - } - } - - return exam.getId(); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void updateExam(ExamDTO dto) { - if (dto.getId() == null) { - throw new BusinessException(ResultCode.BAD_REQUEST, "考试ID不能为空"); - } - - Exam exam = getById(dto.getId()); - if (exam == null) { - throw new BusinessException(ResultCode.EXAM_NOT_FOUND); - } - - if (dto.getStartTime().isAfter(dto.getEndTime())) { - throw new BusinessException(ResultCode.BAD_REQUEST, "开始时间不能晚于结束时间"); - } - - // retryTimes 表示补考次数,maxAttempts = retryTimes + 1 - int maxAttempts = (dto.getRetryTimes() != null ? dto.getRetryTimes() : 0) + 1; - - exam.setTitle(dto.getTitle()); - exam.setDescription(dto.getDescription()); - exam.setPaperId(dto.getPaperId()); - exam.setStartTime(dto.getStartTime()); - exam.setEndTime(dto.getEndTime()); - exam.setMaxAttempts(maxAttempts); - exam.setStatus(calculateExamStatus(dto.getStartTime(), dto.getEndTime())); - - updateById(exam); - - // 更新考试对象:优先使用 participantIds,兼容 targets - LambdaQueryWrapper deleteWrapper = new LambdaQueryWrapper<>(); - deleteWrapper.eq(ExamTarget::getExamId, exam.getId()); - examTargetMapper.delete(deleteWrapper); - - if (dto.getParticipantIds() != null && !dto.getParticipantIds().isEmpty()) { - for (Long userId : dto.getParticipantIds()) { - ExamTarget target = new ExamTarget(); - target.setExamId(exam.getId()); - target.setTargetType(TargetType.USER); - target.setTargetId(userId); - examTargetMapper.insert(target); - } - } else if (dto.getTargets() != null && !dto.getTargets().isEmpty()) { - for (ExamDTO.ExamTargetDTO targetDTO : dto.getTargets()) { - ExamTarget target = new ExamTarget(); - target.setExamId(exam.getId()); - target.setTargetType(TargetType.valueOf(targetDTO.getTargetType())); - target.setTargetId(targetDTO.getTargetId()); - examTargetMapper.insert(target); - } - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void deleteExam(Long id) { - Exam exam = getById(id); - if (exam == null) { - throw new BusinessException(ResultCode.EXAM_NOT_FOUND); - } - - // 检查是否有考试记录 - LambdaQueryWrapper recordQuery = new LambdaQueryWrapper<>(); - recordQuery.eq(ExamRecord::getExamId, id); - if (examRecordMapper.selectCount(recordQuery) > 0) { - throw new BusinessException(ResultCode.DATA_REFERENCED, "该考试已有考试记录,无法删除"); - } - - // 删除考试对象 - LambdaQueryWrapper targetQuery = new LambdaQueryWrapper<>(); - targetQuery.eq(ExamTarget::getExamId, id); - examTargetMapper.delete(targetQuery); - - removeById(id); - } - - @Override - public List listMyExams(Long userId) { - User user = userMapper.selectById(userId); - if (user == null) { - throw new BusinessException(ResultCode.USER_NOT_FOUND); - } - - // 查询所有进行中的考试 - LambdaQueryWrapper examQuery = new LambdaQueryWrapper<>(); - examQuery.eq(Exam::getStatus, ExamStatus.IN_PROGRESS); - List allExams = list(examQuery); - - List result = new ArrayList<>(); - for (Exam exam : allExams) { - if (isUserTargeted(exam.getId(), user)) { - ExamVO vo = convertToVO(exam, false); - // 填充用户的考试次数和最高分 - vo.setCurrentAttempts(getUserAttemptCount(exam.getId(), userId)); - vo.setHighestScore(getUserHighestScore(exam.getId(), userId)); - result.add(vo); - } - } - - return result; - } - - @Override - public boolean canTakeExam(Long examId, Long userId) { - Exam exam = getById(examId); - if (exam == null) { - return false; - } - - // 检查考试状态 - if (exam.getStatus() != ExamStatus.IN_PROGRESS) { - return false; - } - - // 检查时间窗口 - LocalDateTime now = LocalDateTime.now(); - if (now.isBefore(exam.getStartTime()) || now.isAfter(exam.getEndTime())) { - return false; - } - - // 检查用户是否在考试对象中 - User user = userMapper.selectById(userId); - if (user == null || !isUserTargeted(examId, user)) { - return false; - } - - // 检查考试次数 - int attempts = getUserAttemptCount(examId, userId); - return attempts < exam.getMaxAttempts(); - } - - private boolean isUserTargeted(Long examId, User user) { - LambdaQueryWrapper targetQuery = new LambdaQueryWrapper<>(); - targetQuery.eq(ExamTarget::getExamId, examId); - List targets = examTargetMapper.selectList(targetQuery); - - for (ExamTarget target : targets) { - switch (target.getTargetType()) { - case DEPARTMENT: - if (target.getTargetId().equals(user.getDepartmentId())) { - return true; - } - break; - case GROUP: - if (target.getTargetId().equals(user.getGroupId())) { - return true; - } - break; - case USER: - if (target.getTargetId().equals(user.getId())) { - return true; - } - break; - } - } - - return false; - } - - private int getUserAttemptCount(Long examId, Long userId) { - LambdaQueryWrapper query = new LambdaQueryWrapper<>(); - query.eq(ExamRecord::getExamId, examId) - .eq(ExamRecord::getUserId, userId) - .eq(ExamRecord::getStatus, 1); // 已提交的 - return examRecordMapper.selectCount(query).intValue(); - } - - private Integer getUserHighestScore(Long examId, Long userId) { - LambdaQueryWrapper query = new LambdaQueryWrapper<>(); - query.eq(ExamRecord::getExamId, examId) - .eq(ExamRecord::getUserId, userId) - .eq(ExamRecord::getStatus, 1) - .orderByDesc(ExamRecord::getScore) - .last("LIMIT 1"); - ExamRecord record = examRecordMapper.selectOne(query); - return record != null ? record.getScore() : null; - } - - private ExamStatus calculateExamStatus(LocalDateTime startTime, LocalDateTime endTime) { - LocalDateTime now = LocalDateTime.now(); - if (now.isBefore(startTime)) { - return ExamStatus.NOT_STARTED; - } else if (now.isAfter(endTime)) { - return ExamStatus.ENDED; - } else { - return ExamStatus.IN_PROGRESS; - } - } - - private ExamVO convertToVO(Exam exam, boolean includeTargets) { - ExamVO vo = new ExamVO(); - vo.setId(exam.getId()); - vo.setTitle(exam.getTitle()); - vo.setDescription(exam.getDescription()); - vo.setPaperId(exam.getPaperId()); - vo.setStartTime(exam.getStartTime()); - vo.setEndTime(exam.getEndTime()); - vo.setMaxAttempts(exam.getMaxAttempts()); - vo.setDepartmentId(exam.getDepartmentId()); - vo.setStatus(exam.getStatus().name()); - vo.setStatusName(getStatusName(exam.getStatus())); - vo.setCreatorId(exam.getCreatorId()); - vo.setCreateTime(exam.getCreateTime()); - - // 获取试卷信息 - if (exam.getPaperId() != null) { - Paper paper = paperMapper.selectById(exam.getPaperId()); - if (paper != null) { - vo.setPaperTitle(paper.getTitle()); - vo.setPaperTotalScore(paper.getTotalScore()); - vo.setPaperDuration(paper.getDuration()); - vo.setPaperPassScore(paper.getPassScore()); - } - } - - // 获取部门名称 - if (exam.getDepartmentId() != null) { - Department department = departmentMapper.selectById(exam.getDepartmentId()); - if (department != null) { - vo.setDepartmentName(department.getName()); - } - } - - // 获取创建人姓名 - if (exam.getCreatorId() != null) { - User user = userMapper.selectById(exam.getCreatorId()); - if (user != null) { - vo.setCreatorName(user.getRealName()); - } - } - - // 获取考试对象 - if (includeTargets) { - LambdaQueryWrapper targetQuery = new LambdaQueryWrapper<>(); - targetQuery.eq(ExamTarget::getExamId, exam.getId()); - List targets = examTargetMapper.selectList(targetQuery); - - List targetVOList = new ArrayList<>(); - for (ExamTarget target : targets) { - ExamVO.ExamTargetVO targetVO = new ExamVO.ExamTargetVO(); - targetVO.setId(target.getId()); - targetVO.setTargetType(target.getTargetType().name()); - targetVO.setTargetTypeName(getTargetTypeName(target.getTargetType())); - targetVO.setTargetId(target.getTargetId()); - targetVO.setTargetName(getTargetName(target.getTargetType(), target.getTargetId())); - targetVOList.add(targetVO); - } - vo.setTargets(targetVOList); - - // 设置应考人数(targets数量) - vo.setTotalCount(targets.size()); - } - - // 统计已交卷人数和及格人数 - LambdaQueryWrapper submitQuery = new LambdaQueryWrapper<>(); - submitQuery.eq(ExamRecord::getExamId, exam.getId()) - .eq(ExamRecord::getStatus, 1); // 已提交 - long submitCount = examRecordMapper.selectCount(submitQuery); - vo.setSubmitCount((int) submitCount); - - LambdaQueryWrapper passQuery = new LambdaQueryWrapper<>(); - passQuery.eq(ExamRecord::getExamId, exam.getId()) - .eq(ExamRecord::getStatus, 1) - .ge(ExamRecord::getScore, vo.getPaperPassScore() != null ? vo.getPaperPassScore() : 0); - long passCount = examRecordMapper.selectCount(passQuery); - vo.setPassCount((int) passCount); - - return vo; - } - - private String getStatusName(ExamStatus status) { - return switch (status) { - case NOT_STARTED -> "未开始"; - case IN_PROGRESS -> "进行中"; - case ENDED -> "已结束"; - }; - } - - private String getTargetTypeName(TargetType type) { - return switch (type) { - case DEPARTMENT -> "部门"; - case GROUP -> "小组"; - case USER -> "个人"; - }; - } - - private String getTargetName(TargetType type, Long targetId) { - return switch (type) { - case DEPARTMENT -> { - Department dept = departmentMapper.selectById(targetId); - yield dept != null ? dept.getName() : ""; - } - case GROUP -> { - Group group = groupMapper.selectById(targetId); - yield group != null ? group.getName() : ""; - } - case USER -> { - User user = userMapper.selectById(targetId); - yield user != null ? user.getRealName() : ""; - } - }; - } -} diff --git a/training-system/src/main/java/com/sino/training/module/exam/service/impl/PaperServiceImpl.java b/training-system/src/main/java/com/sino/training/module/exam/service/impl/PaperServiceImpl.java deleted file mode 100644 index 2736767..0000000 --- a/training-system/src/main/java/com/sino/training/module/exam/service/impl/PaperServiceImpl.java +++ /dev/null @@ -1,432 +0,0 @@ -package com.sino.training.module.exam.service.impl; - -import cn.hutool.core.util.StrUtil; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.sino.training.common.context.UserContext; -import com.sino.training.common.context.UserContextHolder; -import com.sino.training.common.enums.ContentStatus; -import com.sino.training.common.enums.QuestionType; -import com.sino.training.common.exception.BusinessException; -import com.sino.training.common.result.PageResult; -import com.sino.training.common.result.ResultCode; -import com.sino.training.module.exam.dto.AutoPaperDTO; -import com.sino.training.module.exam.dto.PaperDTO; -import com.sino.training.module.exam.dto.PaperQueryDTO; -import com.sino.training.module.exam.entity.Exam; -import com.sino.training.module.exam.entity.Paper; -import com.sino.training.module.exam.entity.PaperQuestion; -import com.sino.training.module.exam.entity.Question; -import com.sino.training.module.exam.mapper.ExamMapper; -import com.sino.training.module.exam.mapper.PaperMapper; -import com.sino.training.module.exam.mapper.PaperQuestionMapper; -import com.sino.training.module.exam.mapper.QuestionMapper; -import com.sino.training.module.exam.service.PaperService; -import com.sino.training.module.exam.service.QuestionService; -import com.sino.training.module.exam.vo.PaperVO; -import com.sino.training.module.exam.vo.QuestionVO; -import com.sino.training.module.system.entity.Department; -import com.sino.training.module.system.entity.User; -import com.sino.training.module.system.mapper.DepartmentMapper; -import com.sino.training.module.system.mapper.UserMapper; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -/** - * 试卷服务实现类 - * - * @author training-system - */ -@Service -@RequiredArgsConstructor -public class PaperServiceImpl extends ServiceImpl implements PaperService { - - private final PaperQuestionMapper paperQuestionMapper; - private final QuestionMapper questionMapper; - private final QuestionService questionService; - private final DepartmentMapper departmentMapper; - private final UserMapper userMapper; - private final ExamMapper examMapper; - - @Override - public PageResult pagePapers(PaperQueryDTO queryDTO) { - Page page = queryDTO.toPage(); - - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - - if (StrUtil.isNotBlank(queryDTO.getKeyword())) { - queryWrapper.like(Paper::getTitle, queryDTO.getKeyword()); - } - if (queryDTO.getDepartmentId() != null) { - queryWrapper.eq(Paper::getDepartmentId, queryDTO.getDepartmentId()); - } - if (StrUtil.isNotBlank(queryDTO.getStatus())) { - queryWrapper.eq(Paper::getStatus, ContentStatus.valueOf(queryDTO.getStatus())); - } - - queryWrapper.orderByDesc(Paper::getCreateTime); - - Page result = page(page, queryWrapper); - - List voList = new ArrayList<>(); - for (Paper paper : result.getRecords()) { - voList.add(convertToVO(paper, false)); - } - - return PageResult.of(result, voList); - } - - @Override - public PaperVO getPaperDetail(Long id) { - Paper paper = getById(id); - if (paper == null) { - throw new BusinessException(ResultCode.PAPER_NOT_FOUND); - } - return convertToVO(paper, true); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public Long createPaper(PaperDTO dto) { - // 获取当前用户上下文 - UserContext userContext = UserContextHolder.getContext(); - String currentRole = userContext.getRole(); - - // 确定部门ID:管理员使用前端传值,其他用户强制使用自己的部门 - Long departmentId; - if ("ADMIN".equals(currentRole)) { - departmentId = dto.getDepartmentId(); - if (departmentId == null) { - throw new BusinessException(ResultCode.BAD_REQUEST, "管理员必须指定所属部门"); - } - } else { - departmentId = userContext.getDepartmentId(); - } - - Department department = departmentMapper.selectById(departmentId); - if (department == null) { - throw new BusinessException(ResultCode.DATA_NOT_FOUND, "所属部门不存在"); - } - - Paper paper = new Paper(); - paper.setTitle(dto.getTitle()); - paper.setDescription(dto.getDescription()); - paper.setTotalScore(dto.getTotalScore()); - paper.setDuration(dto.getDuration()); - paper.setPassScore(dto.getPassScore()); - paper.setDepartmentId(departmentId); - paper.setCreatorId(userContext.getUserId()); - paper.setStatus(ContentStatus.DRAFT); - - save(paper); - - // 保存试卷题目关联 - if (dto.getQuestions() != null && !dto.getQuestions().isEmpty()) { - int sortOrder = 1; - for (PaperDTO.PaperQuestionDTO questionDTO : dto.getQuestions()) { - PaperQuestion pq = new PaperQuestion(); - pq.setPaperId(paper.getId()); - pq.setQuestionId(questionDTO.getQuestionId()); - pq.setScore(questionDTO.getScore()); - pq.setSortOrder(questionDTO.getSortOrder() != null ? questionDTO.getSortOrder() : sortOrder++); - paperQuestionMapper.insert(pq); - } - } - - return paper.getId(); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public Long createAutoPaper(AutoPaperDTO dto) { - Department department = departmentMapper.selectById(dto.getDepartmentId()); - if (department == null) { - throw new BusinessException(ResultCode.DATA_NOT_FOUND, "所属部门不存在"); - } - - // 计算总分 - int totalScore = dto.getSingleCount() * dto.getSingleScore() - + dto.getMultipleCount() * dto.getMultipleScore() - + dto.getJudgeCount() * dto.getJudgeScore(); - - Paper paper = new Paper(); - paper.setTitle(dto.getTitle()); - paper.setDescription(dto.getDescription()); - paper.setTotalScore(totalScore); - paper.setDuration(dto.getDuration()); - paper.setPassScore(dto.getPassScore()); - paper.setDepartmentId(dto.getDepartmentId()); - paper.setStatus(ContentStatus.DRAFT); - - save(paper); - - int sortOrder = 1; - - // 随机抽取单选题 - if (dto.getSingleCount() > 0) { - List singleQuestions = getRandomQuestions(dto.getDepartmentId(), dto.getCategoryId(), - QuestionType.SINGLE, dto.getSingleCount()); - for (Question question : singleQuestions) { - PaperQuestion pq = new PaperQuestion(); - pq.setPaperId(paper.getId()); - pq.setQuestionId(question.getId()); - pq.setScore(dto.getSingleScore()); - pq.setSortOrder(sortOrder++); - paperQuestionMapper.insert(pq); - } - } - - // 随机抽取多选题 - if (dto.getMultipleCount() > 0) { - List multipleQuestions = getRandomQuestions(dto.getDepartmentId(), dto.getCategoryId(), - QuestionType.MULTIPLE, dto.getMultipleCount()); - for (Question question : multipleQuestions) { - PaperQuestion pq = new PaperQuestion(); - pq.setPaperId(paper.getId()); - pq.setQuestionId(question.getId()); - pq.setScore(dto.getMultipleScore()); - pq.setSortOrder(sortOrder++); - paperQuestionMapper.insert(pq); - } - } - - // 随机抽取判断题 - if (dto.getJudgeCount() > 0) { - List judgeQuestions = getRandomQuestions(dto.getDepartmentId(), dto.getCategoryId(), - QuestionType.JUDGE, dto.getJudgeCount()); - for (Question question : judgeQuestions) { - PaperQuestion pq = new PaperQuestion(); - pq.setPaperId(paper.getId()); - pq.setQuestionId(question.getId()); - pq.setScore(dto.getJudgeScore()); - pq.setSortOrder(sortOrder++); - paperQuestionMapper.insert(pq); - } - } - - return paper.getId(); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void updatePaper(PaperDTO dto) { - if (dto.getId() == null) { - throw new BusinessException(ResultCode.BAD_REQUEST, "试卷ID不能为空"); - } - - Paper paper = getById(dto.getId()); - if (paper == null) { - throw new BusinessException(ResultCode.PAPER_NOT_FOUND); - } - - paper.setTitle(dto.getTitle()); - paper.setDescription(dto.getDescription()); - paper.setTotalScore(dto.getTotalScore()); - paper.setDuration(dto.getDuration()); - paper.setPassScore(dto.getPassScore()); - - updateById(paper); - - // 更新试卷题目关联 - if (dto.getQuestions() != null) { - // 删除原有关联 - LambdaQueryWrapper deleteWrapper = new LambdaQueryWrapper<>(); - deleteWrapper.eq(PaperQuestion::getPaperId, paper.getId()); - paperQuestionMapper.delete(deleteWrapper); - - // 重新添加 - int sortOrder = 1; - for (PaperDTO.PaperQuestionDTO questionDTO : dto.getQuestions()) { - PaperQuestion pq = new PaperQuestion(); - pq.setPaperId(paper.getId()); - pq.setQuestionId(questionDTO.getQuestionId()); - pq.setScore(questionDTO.getScore()); - pq.setSortOrder(questionDTO.getSortOrder() != null ? questionDTO.getSortOrder() : sortOrder++); - paperQuestionMapper.insert(pq); - } - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void deletePaper(Long id) { - Paper paper = getById(id); - if (paper == null) { - throw new BusinessException(ResultCode.PAPER_NOT_FOUND); - } - - // 检查是否被考试引用 - LambdaQueryWrapper examQuery = new LambdaQueryWrapper<>(); - examQuery.eq(Exam::getPaperId, id); - if (examMapper.selectCount(examQuery) > 0) { - throw new BusinessException(ResultCode.PAPER_REFERENCED); - } - - // 删除试卷题目关联 - LambdaQueryWrapper deleteWrapper = new LambdaQueryWrapper<>(); - deleteWrapper.eq(PaperQuestion::getPaperId, id); - paperQuestionMapper.delete(deleteWrapper); - - removeById(id); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void publishPaper(Long id) { - Paper paper = getById(id); - if (paper == null) { - throw new BusinessException(ResultCode.PAPER_NOT_FOUND); - } - - // 检查是否有题目 - LambdaQueryWrapper countWrapper = new LambdaQueryWrapper<>(); - countWrapper.eq(PaperQuestion::getPaperId, id); - if (paperQuestionMapper.selectCount(countWrapper) == 0) { - throw new BusinessException(ResultCode.BAD_REQUEST, "试卷没有题目,无法发布"); - } - - paper.setStatus(ContentStatus.PUBLISHED); - paper.setPublishTime(LocalDateTime.now()); - updateById(paper); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void offlinePaper(Long id) { - Paper paper = getById(id); - if (paper == null) { - throw new BusinessException(ResultCode.PAPER_NOT_FOUND); - } - - paper.setStatus(ContentStatus.OFFLINE); - updateById(paper); - } - - @Override - public List listPublishedByDepartment(Long departmentId) { - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(Paper::getDepartmentId, departmentId) - .eq(Paper::getStatus, ContentStatus.PUBLISHED) - .orderByDesc(Paper::getPublishTime); - List list = list(queryWrapper); - - List voList = new ArrayList<>(); - for (Paper paper : list) { - voList.add(convertToVO(paper, false)); - } - return voList; - } - - @Override - public List listPublishedPapers() { - UserContext userContext = UserContextHolder.getContext(); - Long departmentId = userContext.getDepartmentId(); - return listPublishedByDepartment(departmentId); - } - - private List getRandomQuestions(Long departmentId, Long categoryId, QuestionType type, int count) { - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(Question::getDepartmentId, departmentId) - .eq(Question::getType, type) - .eq(Question::getStatus, ContentStatus.PUBLISHED); - if (categoryId != null) { - queryWrapper.eq(Question::getCategoryId, categoryId); - } - - List allQuestions = questionMapper.selectList(queryWrapper); - - if (allQuestions.size() < count) { - throw new BusinessException(ResultCode.BAD_REQUEST, - "题库中" + getTypeName(type) + "数量不足,需要" + count + "题,实际" + allQuestions.size() + "题"); - } - - // 随机打乱并取前count个 - Collections.shuffle(allQuestions); - return allQuestions.subList(0, count); - } - - private PaperVO convertToVO(Paper paper, boolean includeQuestions) { - PaperVO vo = new PaperVO(); - vo.setId(paper.getId()); - vo.setTitle(paper.getTitle()); - vo.setDescription(paper.getDescription()); - vo.setTotalScore(paper.getTotalScore()); - vo.setDuration(paper.getDuration()); - vo.setPassScore(paper.getPassScore()); - vo.setDepartmentId(paper.getDepartmentId()); - vo.setStatus(paper.getStatus().name()); - vo.setStatusName(getStatusName(paper.getStatus())); - vo.setCreatorId(paper.getCreatorId()); - vo.setCreateTime(paper.getCreateTime()); - vo.setPublishTime(paper.getPublishTime()); - - // 获取部门名称 - if (paper.getDepartmentId() != null) { - Department department = departmentMapper.selectById(paper.getDepartmentId()); - if (department != null) { - vo.setDepartmentName(department.getName()); - } - } - - // 获取创建人姓名 - if (paper.getCreatorId() != null) { - User user = userMapper.selectById(paper.getCreatorId()); - if (user != null) { - vo.setCreatorName(user.getRealName()); - } - } - - // 获取题目数量 - LambdaQueryWrapper countWrapper = new LambdaQueryWrapper<>(); - countWrapper.eq(PaperQuestion::getPaperId, paper.getId()); - vo.setQuestionCount(paperQuestionMapper.selectCount(countWrapper).intValue()); - - // 获取题目列表 - if (includeQuestions) { - LambdaQueryWrapper pqWrapper = new LambdaQueryWrapper<>(); - pqWrapper.eq(PaperQuestion::getPaperId, paper.getId()) - .orderByAsc(PaperQuestion::getSortOrder); - List paperQuestions = paperQuestionMapper.selectList(pqWrapper); - - List questionVOList = new ArrayList<>(); - for (PaperQuestion pq : paperQuestions) { - PaperVO.PaperQuestionVO pqVO = new PaperVO.PaperQuestionVO(); - pqVO.setId(pq.getId()); - pqVO.setQuestionId(pq.getQuestionId()); - pqVO.setScore(pq.getScore()); - pqVO.setSortOrder(pq.getSortOrder()); - - QuestionVO questionVO = questionService.getQuestionDetail(pq.getQuestionId()); - pqVO.setQuestion(questionVO); - - questionVOList.add(pqVO); - } - vo.setQuestions(questionVOList); - } - - return vo; - } - - private String getTypeName(QuestionType type) { - return switch (type) { - case SINGLE -> "单选题"; - case MULTIPLE -> "多选题"; - case JUDGE -> "判断题"; - }; - } - - private String getStatusName(ContentStatus status) { - return switch (status) { - case DRAFT -> "草稿"; - case PUBLISHED -> "已发布"; - case OFFLINE -> "已下架"; - }; - } -} diff --git a/training-system/src/main/java/com/sino/training/module/exam/service/impl/QuestionCategoryServiceImpl.java b/training-system/src/main/java/com/sino/training/module/exam/service/impl/QuestionCategoryServiceImpl.java deleted file mode 100644 index 23a0c1d..0000000 --- a/training-system/src/main/java/com/sino/training/module/exam/service/impl/QuestionCategoryServiceImpl.java +++ /dev/null @@ -1,296 +0,0 @@ -package com.sino.training.module.exam.service.impl; - -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.sino.training.common.exception.BusinessException; -import com.sino.training.common.result.ResultCode; -import com.sino.training.module.exam.dto.QuestionCategoryDTO; -import com.sino.training.module.exam.entity.Question; -import com.sino.training.module.exam.entity.QuestionCategory; -import com.sino.training.module.exam.mapper.QuestionCategoryMapper; -import com.sino.training.module.exam.mapper.QuestionMapper; -import com.sino.training.module.exam.service.QuestionCategoryService; -import com.sino.training.module.exam.vo.QuestionCategoryVO; -import com.sino.training.module.system.entity.Department; -import com.sino.training.module.system.mapper.DepartmentMapper; -import com.sino.training.common.utils.SecurityUtils; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -/** - * 题目分类服务实现类 - * - * @author training-system - */ -@Service -@RequiredArgsConstructor -public class QuestionCategoryServiceImpl extends ServiceImpl implements QuestionCategoryService { - - private final DepartmentMapper departmentMapper; - private final QuestionMapper questionMapper; - - @Override - public List getCategoryTree(Long departmentId) { - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - if (departmentId != null) { - queryWrapper.eq(QuestionCategory::getDepartmentId, departmentId); - } - queryWrapper.orderByAsc(QuestionCategory::getSortOrder, QuestionCategory::getId); - List categories = list(queryWrapper); - - Map questionCountMap = getQuestionCountMap(departmentId); - - List voList = categories.stream() - .map(c -> convertToVO(c, questionCountMap)) - .collect(Collectors.toList()); - - return buildTree(voList); - } - - @Override - public List listCategories(Long departmentId) { - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - if (departmentId != null) { - queryWrapper.eq(QuestionCategory::getDepartmentId, departmentId); - } - queryWrapper.orderByAsc(QuestionCategory::getSortOrder, QuestionCategory::getId); - List categories = list(queryWrapper); - - Map questionCountMap = getQuestionCountMap(departmentId); - - List voList = new ArrayList<>(); - for (QuestionCategory category : categories) { - voList.add(convertToVO(category, questionCountMap)); - } - return voList; - } - - @Override - public QuestionCategoryVO getCategoryDetail(Long id) { - QuestionCategory category = getById(id); - if (category == null) { - throw new BusinessException(ResultCode.CATEGORY_NOT_FOUND); - } - return convertToVO(category, null); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public Long createCategory(QuestionCategoryDTO dto) { - // 部门权限校验:非管理员只能操作本部门 - Long departmentId = checkDepartmentPermission(dto.getDepartmentId()); - - Department department = departmentMapper.selectById(departmentId); - if (department == null) { - throw new BusinessException(ResultCode.DATA_NOT_FOUND, "所属部门不存在"); - } - - if (dto.getParentId() != null && dto.getParentId() > 0) { - QuestionCategory parent = getById(dto.getParentId()); - if (parent == null) { - throw new BusinessException(ResultCode.CATEGORY_NOT_FOUND, "父分类不存在"); - } - // 检查父分类是否属于同一部门 - if (!parent.getDepartmentId().equals(departmentId)) { - throw new BusinessException(ResultCode.BAD_REQUEST, "父分类不属于该部门"); - } - } - - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(QuestionCategory::getDepartmentId, departmentId) - .eq(QuestionCategory::getParentId, dto.getParentId() != null ? dto.getParentId() : 0L) - .eq(QuestionCategory::getName, dto.getName()); - if (count(queryWrapper) > 0) { - throw new BusinessException(ResultCode.DATA_EXISTS, "该级别下已存在同名分类"); - } - - QuestionCategory category = new QuestionCategory(); - category.setName(dto.getName()); - category.setParentId(dto.getParentId() != null ? dto.getParentId() : 0L); - category.setDepartmentId(departmentId); - category.setSortOrder(dto.getSortOrder() != null ? dto.getSortOrder() : 0); - save(category); - return category.getId(); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void updateCategory(QuestionCategoryDTO dto) { - if (dto.getId() == null) { - throw new BusinessException(ResultCode.BAD_REQUEST, "分类ID不能为空"); - } - - QuestionCategory category = getById(dto.getId()); - if (category == null) { - throw new BusinessException(ResultCode.CATEGORY_NOT_FOUND); - } - - // 部门权限校验:非管理员只能操作本部门的分类 - if (!SecurityUtils.isAdmin()) { - Long currentDepartmentId = SecurityUtils.getCurrentDepartmentId(); - if (currentDepartmentId == null || !currentDepartmentId.equals(category.getDepartmentId())) { - throw new BusinessException(ResultCode.FORBIDDEN, "无权操作其他部门的题目分类"); - } - } - - Long parentId = dto.getParentId() != null ? dto.getParentId() : 0L; - if (parentId.equals(dto.getId())) { - throw new BusinessException(ResultCode.BAD_REQUEST, "不能将自己设为父分类"); - } - - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(QuestionCategory::getDepartmentId, category.getDepartmentId()) - .eq(QuestionCategory::getParentId, parentId) - .eq(QuestionCategory::getName, dto.getName()) - .ne(QuestionCategory::getId, dto.getId()); - if (count(queryWrapper) > 0) { - throw new BusinessException(ResultCode.DATA_EXISTS, "该级别下已存在同名分类"); - } - - category.setName(dto.getName()); - category.setParentId(parentId); - if (dto.getSortOrder() != null) { - category.setSortOrder(dto.getSortOrder()); - } - updateById(category); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void deleteCategory(Long id) { - QuestionCategory category = getById(id); - if (category == null) { - throw new BusinessException(ResultCode.CATEGORY_NOT_FOUND); - } - - // 部门权限校验:非管理员只能操作本部门的分类 - if (!SecurityUtils.isAdmin()) { - Long currentDepartmentId = SecurityUtils.getCurrentDepartmentId(); - if (currentDepartmentId == null || !currentDepartmentId.equals(category.getDepartmentId())) { - throw new BusinessException(ResultCode.FORBIDDEN, "无权操作其他部门的题目分类"); - } - } - - LambdaQueryWrapper childQuery = new LambdaQueryWrapper<>(); - childQuery.eq(QuestionCategory::getParentId, id); - if (count(childQuery) > 0) { - throw new BusinessException(ResultCode.DATA_REFERENCED, "该分类下存在子分类,无法删除"); - } - - LambdaQueryWrapper questionQuery = new LambdaQueryWrapper<>(); - questionQuery.eq(Question::getCategoryId, id); - if (questionMapper.selectCount(questionQuery) > 0) { - throw new BusinessException(ResultCode.DATA_REFERENCED, "该分类下存在题目,无法删除"); - } - - removeById(id); - } - - private QuestionCategoryVO convertToVO(QuestionCategory category, Map questionCountMap) { - QuestionCategoryVO vo = new QuestionCategoryVO(); - vo.setId(category.getId()); - vo.setName(category.getName()); - vo.setParentId(category.getParentId()); - vo.setDepartmentId(category.getDepartmentId()); - vo.setSortOrder(category.getSortOrder()); - vo.setCreateTime(category.getCreateTime()); - - if (category.getParentId() != null && category.getParentId() > 0) { - QuestionCategory parent = getById(category.getParentId()); - if (parent != null) { - vo.setParentName(parent.getName()); - } - } - - if (category.getDepartmentId() != null) { - Department department = departmentMapper.selectById(category.getDepartmentId()); - if (department != null) { - vo.setDepartmentName(department.getName()); - } - } - - if (questionCountMap != null) { - vo.setQuestionCount(questionCountMap.getOrDefault(category.getId(), 0)); - } - - return vo; - } - - private List buildTree(List allCategories) { - List roots = allCategories.stream() - .filter(c -> c.getParentId() == null || c.getParentId() == 0) - .collect(Collectors.toList()); - - for (QuestionCategoryVO root : roots) { - setChildren(root, allCategories); - } - - return roots; - } - - private void setChildren(QuestionCategoryVO parent, List allCategories) { - List children = allCategories.stream() - .filter(c -> parent.getId().equals(c.getParentId())) - .collect(Collectors.toList()); - - if (!children.isEmpty()) { - parent.setChildren(children); - for (QuestionCategoryVO child : children) { - setChildren(child, allCategories); - } - } else { - parent.setChildren(new ArrayList<>()); - } - } - - private Map getQuestionCountMap(Long departmentId) { - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - if (departmentId != null) { - queryWrapper.eq(Question::getDepartmentId, departmentId); - } - List questionList = questionMapper.selectList(queryWrapper); - - return questionList.stream() - .filter(q -> q.getCategoryId() != null) - .collect(Collectors.groupingBy( - Question::getCategoryId, - Collectors.collectingAndThen(Collectors.counting(), Long::intValue) - )); - } - - /** - * 检查部门权限 - * 管理员必须指定部门ID,讲师只能操作本部门 - * - * @param targetDepartmentId 目标部门ID - * @return 实际使用的部门ID - */ - private Long checkDepartmentPermission(Long targetDepartmentId) { - // 管理员必须指定部门 - if (SecurityUtils.isAdmin()) { - if (targetDepartmentId == null) { - throw new BusinessException(ResultCode.BAD_REQUEST, "请选择所属部门"); - } - return targetDepartmentId; - } - - // 非管理员(讲师)只能操作本部门 - Long currentDepartmentId = SecurityUtils.getCurrentDepartmentId(); - if (currentDepartmentId == null) { - throw new BusinessException(ResultCode.FORBIDDEN, "无法获取当前用户部门信息"); - } - - // 如果指定了部门ID,必须是本部门 - if (targetDepartmentId != null && !targetDepartmentId.equals(currentDepartmentId)) { - throw new BusinessException(ResultCode.FORBIDDEN, "无权操作其他部门的题目分类"); - } - - return currentDepartmentId; - } -} diff --git a/training-system/src/main/java/com/sino/training/module/exam/service/impl/QuestionServiceImpl.java b/training-system/src/main/java/com/sino/training/module/exam/service/impl/QuestionServiceImpl.java deleted file mode 100644 index 13d2408..0000000 --- a/training-system/src/main/java/com/sino/training/module/exam/service/impl/QuestionServiceImpl.java +++ /dev/null @@ -1,306 +0,0 @@ -package com.sino.training.module.exam.service.impl; - -import cn.hutool.core.util.StrUtil; -import cn.hutool.json.JSONUtil; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.sino.training.common.context.UserContext; -import com.sino.training.common.context.UserContextHolder; -import com.sino.training.common.enums.ContentStatus; -import com.sino.training.common.enums.QuestionType; -import com.sino.training.common.exception.BusinessException; -import com.sino.training.common.result.PageResult; -import com.sino.training.common.result.ResultCode; -import com.sino.training.module.exam.dto.QuestionDTO; -import com.sino.training.module.exam.dto.QuestionQueryDTO; -import com.sino.training.module.exam.entity.PaperQuestion; -import com.sino.training.module.exam.entity.Question; -import com.sino.training.module.exam.entity.QuestionCategory; -import com.sino.training.module.exam.mapper.PaperQuestionMapper; -import com.sino.training.module.exam.mapper.QuestionCategoryMapper; -import com.sino.training.module.exam.mapper.QuestionMapper; -import com.sino.training.module.exam.service.QuestionService; -import com.sino.training.module.exam.vo.QuestionVO; -import com.sino.training.module.system.entity.Department; -import com.sino.training.module.system.entity.User; -import com.sino.training.module.system.mapper.DepartmentMapper; -import com.sino.training.module.system.mapper.UserMapper; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; - -/** - * 题目服务实现类 - * - * @author training-system - */ -@Service -@RequiredArgsConstructor -public class QuestionServiceImpl extends ServiceImpl implements QuestionService { - - private final QuestionCategoryMapper questionCategoryMapper; - private final DepartmentMapper departmentMapper; - private final UserMapper userMapper; - private final PaperQuestionMapper paperQuestionMapper; - - @Override - public PageResult pageQuestions(QuestionQueryDTO queryDTO) { - Page page = queryDTO.toPage(); - - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - - if (StrUtil.isNotBlank(queryDTO.getKeyword())) { - queryWrapper.like(Question::getContent, queryDTO.getKeyword()); - } - if (queryDTO.getCategoryId() != null) { - queryWrapper.eq(Question::getCategoryId, queryDTO.getCategoryId()); - } - if (queryDTO.getDepartmentId() != null) { - queryWrapper.eq(Question::getDepartmentId, queryDTO.getDepartmentId()); - } - if (StrUtil.isNotBlank(queryDTO.getType())) { - queryWrapper.eq(Question::getType, QuestionType.valueOf(queryDTO.getType())); - } - if (StrUtil.isNotBlank(queryDTO.getStatus())) { - queryWrapper.eq(Question::getStatus, ContentStatus.valueOf(queryDTO.getStatus())); - } - - queryWrapper.orderByDesc(Question::getCreateTime); - - Page result = page(page, queryWrapper); - - List voList = new ArrayList<>(); - for (Question question : result.getRecords()) { - voList.add(convertToVO(question)); - } - - return PageResult.of(result, voList); - } - - @Override - public QuestionVO getQuestionDetail(Long id) { - Question question = getById(id); - if (question == null) { - throw new BusinessException(ResultCode.QUESTION_NOT_FOUND); - } - return convertToVO(question); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public Long createQuestion(QuestionDTO dto) { - QuestionCategory category = questionCategoryMapper.selectById(dto.getCategoryId()); - if (category == null) { - throw new BusinessException(ResultCode.CATEGORY_NOT_FOUND); - } - - // 获取当前用户上下文 - UserContext userContext = UserContextHolder.getContext(); - String currentRole = userContext.getRole(); - - // 确定部门ID:管理员使用前端传值,其他用户强制使用自己的部门 - Long departmentId; - if ("ADMIN".equals(currentRole)) { - departmentId = dto.getDepartmentId(); - if (departmentId == null) { - throw new BusinessException(ResultCode.BAD_REQUEST, "管理员必须指定所属部门"); - } - } else { - departmentId = userContext.getDepartmentId(); - } - - Department department = departmentMapper.selectById(departmentId); - if (department == null) { - throw new BusinessException(ResultCode.DATA_NOT_FOUND, "所属部门不存在"); - } - - Question question = new Question(); - question.setType(QuestionType.valueOf(dto.getType())); - question.setContent(dto.getContent()); - question.setOptions(dto.getOptions() != null ? JSONUtil.toJsonStr(dto.getOptions()) : null); - question.setAnswer(dto.getAnswer()); - question.setAnalysis(dto.getAnalysis()); - question.setCategoryId(dto.getCategoryId()); - question.setDepartmentId(departmentId); - question.setCreatorId(userContext.getUserId()); - question.setStatus(ContentStatus.DRAFT); - - save(question); - return question.getId(); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void updateQuestion(QuestionDTO dto) { - if (dto.getId() == null) { - throw new BusinessException(ResultCode.BAD_REQUEST, "题目ID不能为空"); - } - - Question question = getById(dto.getId()); - if (question == null) { - throw new BusinessException(ResultCode.QUESTION_NOT_FOUND); - } - - if (dto.getCategoryId() != null) { - QuestionCategory category = questionCategoryMapper.selectById(dto.getCategoryId()); - if (category == null) { - throw new BusinessException(ResultCode.CATEGORY_NOT_FOUND); - } - question.setCategoryId(dto.getCategoryId()); - } - - question.setType(QuestionType.valueOf(dto.getType())); - question.setContent(dto.getContent()); - question.setOptions(dto.getOptions() != null ? JSONUtil.toJsonStr(dto.getOptions()) : null); - question.setAnswer(dto.getAnswer()); - question.setAnalysis(dto.getAnalysis()); - - updateById(question); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void deleteQuestion(Long id) { - Question question = getById(id); - if (question == null) { - throw new BusinessException(ResultCode.QUESTION_NOT_FOUND); - } - - // 检查是否被试卷引用 - LambdaQueryWrapper paperQuery = new LambdaQueryWrapper<>(); - paperQuery.eq(PaperQuestion::getQuestionId, id); - if (paperQuestionMapper.selectCount(paperQuery) > 0) { - throw new BusinessException(ResultCode.QUESTION_REFERENCED); - } - - removeById(id); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void publishQuestion(Long id) { - Question question = getById(id); - if (question == null) { - throw new BusinessException(ResultCode.QUESTION_NOT_FOUND); - } - - question.setStatus(ContentStatus.PUBLISHED); - question.setPublishTime(LocalDateTime.now()); - updateById(question); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void offlineQuestion(Long id) { - Question question = getById(id); - if (question == null) { - throw new BusinessException(ResultCode.QUESTION_NOT_FOUND); - } - - question.setStatus(ContentStatus.OFFLINE); - updateById(question); - } - - @Override - public List listByCategory(Long categoryId) { - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(Question::getCategoryId, categoryId) - .eq(Question::getStatus, ContentStatus.PUBLISHED) - .orderByDesc(Question::getCreateTime); - List list = list(queryWrapper); - - List voList = new ArrayList<>(); - for (Question question : list) { - voList.add(convertToVO(question)); - } - return voList; - } - - @Override - public List listPublishedByDepartment(Long departmentId, String type) { - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(Question::getDepartmentId, departmentId) - .eq(Question::getStatus, ContentStatus.PUBLISHED); - if (StrUtil.isNotBlank(type)) { - queryWrapper.eq(Question::getType, QuestionType.valueOf(type)); - } - queryWrapper.orderByDesc(Question::getCreateTime); - List list = list(queryWrapper); - - List voList = new ArrayList<>(); - for (Question question : list) { - voList.add(convertToVO(question)); - } - return voList; - } - - private QuestionVO convertToVO(Question question) { - QuestionVO vo = new QuestionVO(); - vo.setId(question.getId()); - vo.setType(question.getType().name()); - vo.setTypeName(getTypeName(question.getType())); - vo.setContent(question.getContent()); - vo.setAnswer(question.getAnswer()); - vo.setAnalysis(question.getAnalysis()); - vo.setCategoryId(question.getCategoryId()); - vo.setDepartmentId(question.getDepartmentId()); - vo.setStatus(question.getStatus().name()); - vo.setStatusName(getStatusName(question.getStatus())); - vo.setCreatorId(question.getCreatorId()); - vo.setCreateTime(question.getCreateTime()); - vo.setPublishTime(question.getPublishTime()); - - // 解析选项 - if (StrUtil.isNotBlank(question.getOptions())) { - List options = JSONUtil.toList(question.getOptions(), QuestionVO.OptionVO.class); - vo.setOptions(options); - } - - // 获取分类名称 - if (question.getCategoryId() != null) { - QuestionCategory category = questionCategoryMapper.selectById(question.getCategoryId()); - if (category != null) { - vo.setCategoryName(category.getName()); - } - } - - // 获取部门名称 - if (question.getDepartmentId() != null) { - Department department = departmentMapper.selectById(question.getDepartmentId()); - if (department != null) { - vo.setDepartmentName(department.getName()); - } - } - - // 获取创建人姓名 - if (question.getCreatorId() != null) { - User user = userMapper.selectById(question.getCreatorId()); - if (user != null) { - vo.setCreatorName(user.getRealName()); - } - } - - return vo; - } - - private String getTypeName(QuestionType type) { - return switch (type) { - case SINGLE -> "单选题"; - case MULTIPLE -> "多选题"; - case JUDGE -> "判断题"; - }; - } - - private String getStatusName(ContentStatus status) { - return switch (status) { - case DRAFT -> "草稿"; - case PUBLISHED -> "已发布"; - case OFFLINE -> "已下架"; - }; - } -} diff --git a/training-system/src/main/java/com/sino/training/module/exam/vo/ExamPaperVO.java b/training-system/src/main/java/com/sino/training/module/exam/vo/ExamPaperVO.java deleted file mode 100644 index 7d1f3e4..0000000 --- a/training-system/src/main/java/com/sino/training/module/exam/vo/ExamPaperVO.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.sino.training.module.exam.vo; - -import lombok.Data; - -import java.io.Serializable; -import java.util.List; - -/** - * 考试试卷VO(学员答题时使用,不包含答案) - * - * @author training-system - */ -@Data -public class ExamPaperVO implements Serializable { - - private static final long serialVersionUID = 1L; - - private Long recordId; - private Long examId; - private String examTitle; - private Integer duration; - private Integer totalScore; - private Long remainingSeconds; - private List questions; - - @Data - public static class ExamQuestionVO implements Serializable { - private Long questionId; - private Integer sortOrder; - private String type; - private String typeName; - private String content; - private List options; - private Integer score; - /** - * 用户已选答案(用于回显) - */ - private String userAnswer; - } -} diff --git a/training-system/src/main/java/com/sino/training/module/exam/vo/ExamRecordVO.java b/training-system/src/main/java/com/sino/training/module/exam/vo/ExamRecordVO.java deleted file mode 100644 index 3b25e6a..0000000 --- a/training-system/src/main/java/com/sino/training/module/exam/vo/ExamRecordVO.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.sino.training.module.exam.vo; - -import lombok.Data; - -import java.io.Serializable; -import java.time.LocalDateTime; -import java.util.List; - -/** - * 考试记录VO - * - * @author training-system - */ -@Data -public class ExamRecordVO implements Serializable { - - private static final long serialVersionUID = 1L; - - private Long id; - private Long examId; - private String examTitle; - private Long userId; - private String userName; - private Integer attemptNo; - private Integer score; - private Integer totalScore; - private Integer passScore; - private Boolean passed; - private LocalDateTime startTime; - private LocalDateTime submitTime; - private Integer status; - private String statusName; - - /** - * 剩余时间(秒) - */ - private Long remainingSeconds; - - /** - * 答题详情 - */ - private List answerDetails; - - @Data - public static class AnswerDetailVO implements Serializable { - private Long questionId; - private String questionContent; - private String questionType; - private List options; - private String userAnswer; - private String correctAnswer; - private Boolean correct; - private Integer score; - private Integer earnedScore; - private String analysis; - } -} diff --git a/training-system/src/main/java/com/sino/training/module/exam/vo/ExamVO.java b/training-system/src/main/java/com/sino/training/module/exam/vo/ExamVO.java deleted file mode 100644 index d2f3484..0000000 --- a/training-system/src/main/java/com/sino/training/module/exam/vo/ExamVO.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.sino.training.module.exam.vo; - -import lombok.Data; - -import java.io.Serializable; -import java.time.LocalDateTime; -import java.util.List; - -/** - * 考试VO - * - * @author training-system - */ -@Data -public class ExamVO implements Serializable { - - private static final long serialVersionUID = 1L; - - private Long id; - private String title; - private String description; - private Long paperId; - private String paperTitle; - private Integer paperTotalScore; - private Integer paperDuration; - private Integer paperPassScore; - private LocalDateTime startTime; - private LocalDateTime endTime; - private Integer maxAttempts; - private Long departmentId; - private String departmentName; - private String status; - private String statusName; - private Long creatorId; - private String creatorName; - private LocalDateTime createTime; - - /** - * 考试对象列表 - */ - private List targets; - - /** - * 应考人数(参与人数总计) - */ - private Integer totalCount; - - /** - * 已交卷人数 - */ - private Integer submitCount; - - /** - * 及格人数 - */ - private Integer passCount; - - /** - * 当前用户的考试次数(学员查看时) - */ - private Integer currentAttempts; - - /** - * 当前用户的最高分(学员查看时) - */ - private Integer highestScore; - - @Data - public static class ExamTargetVO implements Serializable { - private Long id; - private String targetType; - private String targetTypeName; - private Long targetId; - private String targetName; - } -} diff --git a/training-system/src/main/java/com/sino/training/module/exam/vo/PaperVO.java b/training-system/src/main/java/com/sino/training/module/exam/vo/PaperVO.java deleted file mode 100644 index b6abeb0..0000000 --- a/training-system/src/main/java/com/sino/training/module/exam/vo/PaperVO.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.sino.training.module.exam.vo; - -import lombok.Data; - -import java.io.Serializable; -import java.time.LocalDateTime; -import java.util.List; - -/** - * 试卷VO - * - * @author training-system - */ -@Data -public class PaperVO implements Serializable { - - private static final long serialVersionUID = 1L; - - private Long id; - private String title; - private String description; - private Integer totalScore; - private Integer duration; - private Integer passScore; - private Long departmentId; - private String departmentName; - private String status; - private String statusName; - private Long creatorId; - private String creatorName; - private LocalDateTime createTime; - private LocalDateTime publishTime; - - /** - * 题目数量 - */ - private Integer questionCount; - - /** - * 试卷题目列表 - */ - private List questions; - - @Data - public static class PaperQuestionVO implements Serializable { - private Long id; - private Long questionId; - private Integer score; - private Integer sortOrder; - private QuestionVO question; - } -} diff --git a/training-system/src/main/java/com/sino/training/module/exam/vo/QuestionCategoryVO.java b/training-system/src/main/java/com/sino/training/module/exam/vo/QuestionCategoryVO.java deleted file mode 100644 index 4bbbd9e..0000000 --- a/training-system/src/main/java/com/sino/training/module/exam/vo/QuestionCategoryVO.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.sino.training.module.exam.vo; - -import lombok.Data; - -import java.io.Serializable; -import java.time.LocalDateTime; -import java.util.List; - -/** - * 题目分类VO - * - * @author training-system - */ -@Data -public class QuestionCategoryVO implements Serializable { - - private static final long serialVersionUID = 1L; - - private Long id; - private String name; - private Long parentId; - private String parentName; - private Long departmentId; - private String departmentName; - private Integer sortOrder; - private LocalDateTime createTime; - private List children; - private Integer questionCount; -} diff --git a/training-system/src/main/java/com/sino/training/module/exam/vo/QuestionVO.java b/training-system/src/main/java/com/sino/training/module/exam/vo/QuestionVO.java deleted file mode 100644 index 3326b0f..0000000 --- a/training-system/src/main/java/com/sino/training/module/exam/vo/QuestionVO.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.sino.training.module.exam.vo; - -import lombok.Data; - -import java.io.Serializable; -import java.time.LocalDateTime; -import java.util.List; - -/** - * 题目VO - * - * @author training-system - */ -@Data -public class QuestionVO implements Serializable { - - private static final long serialVersionUID = 1L; - - private Long id; - private String type; - private String typeName; - private String content; - private List options; - private String answer; - private String analysis; - private Long categoryId; - private String categoryName; - private Long departmentId; - private String departmentName; - private String status; - private String statusName; - private Long creatorId; - private String creatorName; - private LocalDateTime createTime; - private LocalDateTime publishTime; - - @Data - public static class OptionVO implements Serializable { - private String key; - private String value; - } -} diff --git a/training-system/src/main/java/com/sino/training/module/knowledge/controller/CategoryController.java b/training-system/src/main/java/com/sino/training/module/knowledge/controller/CategoryController.java deleted file mode 100644 index 563bf63..0000000 --- a/training-system/src/main/java/com/sino/training/module/knowledge/controller/CategoryController.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.sino.training.module.knowledge.controller; - -import com.sino.training.common.result.Result; -import com.sino.training.module.knowledge.dto.CategoryDTO; -import com.sino.training.module.knowledge.service.CategoryService; -import com.sino.training.module.knowledge.vo.CategoryVO; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.tags.Tag; -import jakarta.validation.Valid; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -/** - * 知识分类控制器 - * - * @author training-system - */ -@Tag(name = "知识分类", description = "知识分类CRUD接口") -@RestController -@RequestMapping("/api/knowledge/category") -@RequiredArgsConstructor -public class CategoryController { - - private final CategoryService categoryService; - - @Operation(summary = "获取分类树") - @GetMapping("/tree") - public Result> tree( - @Parameter(description = "部门ID(可选)") @RequestParam(required = false) Long departmentId) { - return Result.success(categoryService.getCategoryTree(departmentId)); - } - - @Operation(summary = "获取分类列表(平铺)") - @GetMapping("/list") - public Result> list( - @Parameter(description = "部门ID(可选)") @RequestParam(required = false) Long departmentId) { - return Result.success(categoryService.listCategories(departmentId)); - } - - @Operation(summary = "获取分类详情") - @GetMapping("/{id}") - public Result detail(@PathVariable Long id) { - return Result.success(categoryService.getCategoryDetail(id)); - } - - @Operation(summary = "创建分类") - @PostMapping - public Result create(@Valid @RequestBody CategoryDTO dto) { - return Result.success(categoryService.createCategory(dto)); - } - - @Operation(summary = "更新分类") - @PutMapping - public Result update(@Valid @RequestBody CategoryDTO dto) { - categoryService.updateCategory(dto); - return Result.success(); - } - - @Operation(summary = "删除分类") - @DeleteMapping("/{id}") - public Result delete(@PathVariable Long id) { - categoryService.deleteCategory(id); - return Result.success(); - } -} diff --git a/training-system/src/main/java/com/sino/training/module/knowledge/controller/KnowledgeController.java b/training-system/src/main/java/com/sino/training/module/knowledge/controller/KnowledgeController.java deleted file mode 100644 index 6da6c5f..0000000 --- a/training-system/src/main/java/com/sino/training/module/knowledge/controller/KnowledgeController.java +++ /dev/null @@ -1,94 +0,0 @@ -package com.sino.training.module.knowledge.controller; - -import com.sino.training.common.result.PageResult; -import com.sino.training.common.result.Result; -import com.sino.training.module.knowledge.dto.KnowledgeDTO; -import com.sino.training.module.knowledge.dto.KnowledgeQueryDTO; -import com.sino.training.module.knowledge.service.KnowledgeService; -import com.sino.training.module.knowledge.vo.KnowledgeVO; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import jakarta.validation.Valid; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -/** - * 知识管理控制器 - * - * @author training-system - */ -@Tag(name = "知识管理", description = "知识CRUD接口") -@RestController -@RequestMapping("/api/knowledge") -@RequiredArgsConstructor -public class KnowledgeController { - - private final KnowledgeService knowledgeService; - - @Operation(summary = "分页查询知识列表") - @GetMapping("/page") - public Result> page(KnowledgeQueryDTO queryDTO) { - return Result.success(knowledgeService.pageKnowledge(queryDTO)); - } - - @Operation(summary = "获取知识详情") - @GetMapping("/{id}") - public Result detail(@PathVariable Long id) { - return Result.success(knowledgeService.getKnowledgeDetail(id)); - } - - @Operation(summary = "创建知识") - @PostMapping - public Result create(@Valid @RequestBody KnowledgeDTO dto) { - return Result.success(knowledgeService.createKnowledge(dto)); - } - - @Operation(summary = "更新知识") - @PutMapping - public Result update(@Valid @RequestBody KnowledgeDTO dto) { - knowledgeService.updateKnowledge(dto); - return Result.success(); - } - - @Operation(summary = "删除知识") - @DeleteMapping("/{id}") - public Result delete(@PathVariable Long id) { - knowledgeService.deleteKnowledge(id); - return Result.success(); - } - - @Operation(summary = "发布知识") - @PutMapping("/{id}/publish") - public Result publish(@PathVariable Long id) { - knowledgeService.publishKnowledge(id); - return Result.success(); - } - - @Operation(summary = "下架知识") - @PutMapping("/{id}/offline") - public Result offline(@PathVariable Long id) { - knowledgeService.offlineKnowledge(id); - return Result.success(); - } - - @Operation(summary = "查看知识(增加浏览次数)") - @PutMapping("/{id}/view") - public Result view(@PathVariable Long id) { - knowledgeService.increaseViewCount(id); - return Result.success(knowledgeService.getKnowledgeDetail(id)); - } - - @Operation(summary = "根据分类获取已发布知识") - @GetMapping("/published/category/{categoryId}") - public Result> listByCategory(@PathVariable Long categoryId) { - return Result.success(knowledgeService.listPublishedByCategory(categoryId)); - } - - @Operation(summary = "根据部门获取已发布知识") - @GetMapping("/published/department/{departmentId}") - public Result> listByDepartment(@PathVariable Long departmentId) { - return Result.success(knowledgeService.listPublishedByDepartment(departmentId)); - } -} diff --git a/training-system/src/main/java/com/sino/training/module/knowledge/dto/CategoryDTO.java b/training-system/src/main/java/com/sino/training/module/knowledge/dto/CategoryDTO.java deleted file mode 100644 index 8100c47..0000000 --- a/training-system/src/main/java/com/sino/training/module/knowledge/dto/CategoryDTO.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.sino.training.module.knowledge.dto; - -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotNull; -import lombok.Data; - -import java.io.Serializable; - -/** - * 知识分类DTO - * - * @author training-system - */ -@Data -public class CategoryDTO implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * 分类ID(编辑时使用) - */ - private Long id; - - /** - * 分类名称 - */ - @NotBlank(message = "分类名称不能为空") - private String name; - - /** - * 父分类ID(0表示顶级分类) - */ - private Long parentId; - - /** - * 所属部门ID - * 管理员必传,讲师可不传(自动使用当前用户部门) - */ - private Long departmentId; - - /** - * 排序 - */ - private Integer sortOrder; -} diff --git a/training-system/src/main/java/com/sino/training/module/knowledge/dto/KnowledgeDTO.java b/training-system/src/main/java/com/sino/training/module/knowledge/dto/KnowledgeDTO.java deleted file mode 100644 index decdde2..0000000 --- a/training-system/src/main/java/com/sino/training/module/knowledge/dto/KnowledgeDTO.java +++ /dev/null @@ -1,72 +0,0 @@ -package com.sino.training.module.knowledge.dto; - -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotNull; -import lombok.Data; - -import java.io.Serializable; - -/** - * 知识DTO - * - * @author training-system - */ -@Data -public class KnowledgeDTO implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * 知识ID(编辑时使用) - */ - private Long id; - - /** - * 标题 - */ - @NotBlank(message = "标题不能为空") - private String title; - - /** - * 描述/摘要 - */ - private String description; - - /** - * 所属分类ID - */ - @NotNull(message = "所属分类不能为空") - private Long categoryId; - - /** - * 知识类型:DOCUMENT/VIDEO - */ - @NotBlank(message = "知识类型不能为空") - private String type; - - /** - * 文件名 - */ - private String fileName; - - /** - * 文件URL - */ - private String fileUrl; - - /** - * 文件大小 - */ - private Long fileSize; - - /** - * 文件类型 - */ - private String fileType; - - /** - * 所属部门ID - * 管理员必传,讲师可不传(自动使用当前用户部门) - */ - private Long departmentId; -} diff --git a/training-system/src/main/java/com/sino/training/module/knowledge/dto/KnowledgeQueryDTO.java b/training-system/src/main/java/com/sino/training/module/knowledge/dto/KnowledgeQueryDTO.java deleted file mode 100644 index a391c7f..0000000 --- a/training-system/src/main/java/com/sino/training/module/knowledge/dto/KnowledgeQueryDTO.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.sino.training.module.knowledge.dto; - -import com.sino.training.common.base.PageQuery; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * 知识查询DTO - * - * @author training-system - */ -@Data -@EqualsAndHashCode(callSuper = true) -public class KnowledgeQueryDTO extends PageQuery { - - /** - * 关键字(标题) - */ - private String keyword; - - /** - * 分类ID - */ - private Long categoryId; - - /** - * 部门ID - */ - private Long departmentId; - - /** - * 知识类型 - */ - private String type; - - /** - * 状态 - */ - private String status; -} diff --git a/training-system/src/main/java/com/sino/training/module/knowledge/entity/Category.java b/training-system/src/main/java/com/sino/training/module/knowledge/entity/Category.java deleted file mode 100644 index beb07ee..0000000 --- a/training-system/src/main/java/com/sino/training/module/knowledge/entity/Category.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.sino.training.module.knowledge.entity; - -import com.baomidou.mybatisplus.annotation.TableName; -import com.sino.training.common.base.BaseEntity; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * 知识分类实体 - * - * @author training-system - */ -@Data -@EqualsAndHashCode(callSuper = true) -@TableName("km_category") -public class Category extends BaseEntity { - - /** - * 分类名称 - */ - private String name; - - /** - * 父分类ID(0表示顶级分类) - */ - private Long parentId; - - /** - * 所属部门ID - */ - private Long departmentId; - - /** - * 排序 - */ - private Integer sortOrder; -} diff --git a/training-system/src/main/java/com/sino/training/module/knowledge/entity/Knowledge.java b/training-system/src/main/java/com/sino/training/module/knowledge/entity/Knowledge.java deleted file mode 100644 index 41ca599..0000000 --- a/training-system/src/main/java/com/sino/training/module/knowledge/entity/Knowledge.java +++ /dev/null @@ -1,86 +0,0 @@ -package com.sino.training.module.knowledge.entity; - -import com.baomidou.mybatisplus.annotation.TableName; -import com.sino.training.common.base.BaseEntity; -import com.sino.training.common.enums.ContentStatus; -import com.sino.training.common.enums.KnowledgeType; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.time.LocalDateTime; - -/** - * 知识实体 - * - * @author training-system - */ -@Data -@EqualsAndHashCode(callSuper = true) -@TableName("km_knowledge") -public class Knowledge extends BaseEntity { - - /** - * 标题 - */ - private String title; - - /** - * 描述/摘要 - */ - private String description; - - /** - * 所属分类ID - */ - private Long categoryId; - - /** - * 知识类型 - */ - private KnowledgeType type; - - /** - * 文件名 - */ - private String fileName; - - /** - * 文件URL - */ - private String fileUrl; - - /** - * 文件大小(字节) - */ - private Long fileSize; - - /** - * 文件类型/后缀 - */ - private String fileType; - - /** - * 所属部门ID - */ - private Long departmentId; - - /** - * 状态 - */ - private ContentStatus status; - - /** - * 创建人ID - */ - private Long creatorId; - - /** - * 发布时间 - */ - private LocalDateTime publishTime; - - /** - * 浏览次数 - */ - private Integer viewCount; -} diff --git a/training-system/src/main/java/com/sino/training/module/knowledge/mapper/CategoryMapper.java b/training-system/src/main/java/com/sino/training/module/knowledge/mapper/CategoryMapper.java deleted file mode 100644 index 82be11b..0000000 --- a/training-system/src/main/java/com/sino/training/module/knowledge/mapper/CategoryMapper.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.sino.training.module.knowledge.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.sino.training.module.knowledge.entity.Category; -import org.apache.ibatis.annotations.Mapper; - -/** - * 知识分类 Mapper - * - * @author training-system - */ -@Mapper -public interface CategoryMapper extends BaseMapper { -} diff --git a/training-system/src/main/java/com/sino/training/module/knowledge/mapper/KnowledgeMapper.java b/training-system/src/main/java/com/sino/training/module/knowledge/mapper/KnowledgeMapper.java deleted file mode 100644 index 6d3f143..0000000 --- a/training-system/src/main/java/com/sino/training/module/knowledge/mapper/KnowledgeMapper.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.sino.training.module.knowledge.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.sino.training.module.knowledge.entity.Knowledge; -import org.apache.ibatis.annotations.Mapper; - -/** - * 知识 Mapper - * - * @author training-system - */ -@Mapper -public interface KnowledgeMapper extends BaseMapper { -} diff --git a/training-system/src/main/java/com/sino/training/module/knowledge/service/CategoryService.java b/training-system/src/main/java/com/sino/training/module/knowledge/service/CategoryService.java deleted file mode 100644 index 99678de..0000000 --- a/training-system/src/main/java/com/sino/training/module/knowledge/service/CategoryService.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.sino.training.module.knowledge.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.sino.training.module.knowledge.dto.CategoryDTO; -import com.sino.training.module.knowledge.entity.Category; -import com.sino.training.module.knowledge.vo.CategoryVO; - -import java.util.List; - -/** - * 知识分类服务接口 - * - * @author training-system - */ -public interface CategoryService extends IService { - - /** - * 获取分类树 - * - * @param departmentId 部门ID(可选) - * @return 分类树 - */ - List getCategoryTree(Long departmentId); - - /** - * 获取分类列表(平铺) - * - * @param departmentId 部门ID(可选) - * @return 分类列表 - */ - List listCategories(Long departmentId); - - /** - * 获取分类详情 - * - * @param id 分类ID - * @return 分类详情 - */ - CategoryVO getCategoryDetail(Long id); - - /** - * 创建分类 - * - * @param dto 分类信息 - * @return 分类ID - */ - Long createCategory(CategoryDTO dto); - - /** - * 更新分类 - * - * @param dto 分类信息 - */ - void updateCategory(CategoryDTO dto); - - /** - * 删除分类 - * - * @param id 分类ID - */ - void deleteCategory(Long id); -} diff --git a/training-system/src/main/java/com/sino/training/module/knowledge/service/KnowledgeService.java b/training-system/src/main/java/com/sino/training/module/knowledge/service/KnowledgeService.java deleted file mode 100644 index 37e593e..0000000 --- a/training-system/src/main/java/com/sino/training/module/knowledge/service/KnowledgeService.java +++ /dev/null @@ -1,93 +0,0 @@ -package com.sino.training.module.knowledge.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.sino.training.common.result.PageResult; -import com.sino.training.module.knowledge.dto.KnowledgeDTO; -import com.sino.training.module.knowledge.dto.KnowledgeQueryDTO; -import com.sino.training.module.knowledge.entity.Knowledge; -import com.sino.training.module.knowledge.vo.KnowledgeVO; - -import java.util.List; - -/** - * 知识服务接口 - * - * @author training-system - */ -public interface KnowledgeService extends IService { - - /** - * 分页查询知识列表 - * - * @param queryDTO 查询条件 - * @return 知识分页数据 - */ - PageResult pageKnowledge(KnowledgeQueryDTO queryDTO); - - /** - * 获取知识详情 - * - * @param id 知识ID - * @return 知识详情 - */ - KnowledgeVO getKnowledgeDetail(Long id); - - /** - * 创建知识 - * - * @param dto 知识信息 - * @return 知识ID - */ - Long createKnowledge(KnowledgeDTO dto); - - /** - * 更新知识 - * - * @param dto 知识信息 - */ - void updateKnowledge(KnowledgeDTO dto); - - /** - * 删除知识 - * - * @param id 知识ID - */ - void deleteKnowledge(Long id); - - /** - * 发布知识 - * - * @param id 知识ID - */ - void publishKnowledge(Long id); - - /** - * 下架知识 - * - * @param id 知识ID - */ - void offlineKnowledge(Long id); - - /** - * 增加浏览次数 - * - * @param id 知识ID - */ - void increaseViewCount(Long id); - - /** - * 根据分类获取已发布的知识列表 - * - * @param categoryId 分类ID - * @return 知识列表 - */ - List listPublishedByCategory(Long categoryId); - - /** - * 根据部门获取已发布的知识列表 - * - * @param departmentId 部门ID - * @return 知识列表 - */ - List listPublishedByDepartment(Long departmentId); -} diff --git a/training-system/src/main/java/com/sino/training/module/knowledge/service/impl/CategoryServiceImpl.java b/training-system/src/main/java/com/sino/training/module/knowledge/service/impl/CategoryServiceImpl.java deleted file mode 100644 index 2b5d1f3..0000000 --- a/training-system/src/main/java/com/sino/training/module/knowledge/service/impl/CategoryServiceImpl.java +++ /dev/null @@ -1,308 +0,0 @@ -package com.sino.training.module.knowledge.service.impl; - -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.sino.training.common.exception.BusinessException; -import com.sino.training.common.result.ResultCode; -import com.sino.training.module.knowledge.dto.CategoryDTO; -import com.sino.training.module.knowledge.entity.Category; -import com.sino.training.module.knowledge.entity.Knowledge; -import com.sino.training.module.knowledge.mapper.CategoryMapper; -import com.sino.training.module.knowledge.mapper.KnowledgeMapper; -import com.sino.training.module.knowledge.service.CategoryService; -import com.sino.training.module.knowledge.vo.CategoryVO; -import com.sino.training.module.system.entity.Department; -import com.sino.training.module.system.mapper.DepartmentMapper; -import com.sino.training.common.utils.SecurityUtils; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -/** - * 知识分类服务实现类 - * - * @author training-system - */ -@Service -@RequiredArgsConstructor -public class CategoryServiceImpl extends ServiceImpl implements CategoryService { - - private final DepartmentMapper departmentMapper; - private final KnowledgeMapper knowledgeMapper; - - @Override - public List getCategoryTree(Long departmentId) { - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - if (departmentId != null) { - queryWrapper.eq(Category::getDepartmentId, departmentId); - } - queryWrapper.orderByAsc(Category::getSortOrder, Category::getId); - List categories = list(queryWrapper); - - // 统计每个分类下的知识数量 - Map knowledgeCountMap = getKnowledgeCountMap(departmentId); - - // 转换为VO - List voList = categories.stream() - .map(c -> convertToVO(c, knowledgeCountMap)) - .collect(Collectors.toList()); - - // 构建树形结构 - return buildTree(voList); - } - - @Override - public List listCategories(Long departmentId) { - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - if (departmentId != null) { - queryWrapper.eq(Category::getDepartmentId, departmentId); - } - queryWrapper.orderByAsc(Category::getSortOrder, Category::getId); - List categories = list(queryWrapper); - - Map knowledgeCountMap = getKnowledgeCountMap(departmentId); - - List voList = new ArrayList<>(); - for (Category category : categories) { - voList.add(convertToVO(category, knowledgeCountMap)); - } - return voList; - } - - @Override - public CategoryVO getCategoryDetail(Long id) { - Category category = getById(id); - if (category == null) { - throw new BusinessException(ResultCode.CATEGORY_NOT_FOUND); - } - return convertToVO(category, null); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public Long createCategory(CategoryDTO dto) { - // 部门权限校验:非管理员只能操作本部门 - Long departmentId = checkDepartmentPermission(dto.getDepartmentId()); - - // 检查部门是否存在 - Department department = departmentMapper.selectById(departmentId); - if (department == null) { - throw new BusinessException(ResultCode.DATA_NOT_FOUND, "所属部门不存在"); - } - - // 检查父分类是否存在(如果有) - if (dto.getParentId() != null && dto.getParentId() > 0) { - Category parent = getById(dto.getParentId()); - if (parent == null) { - throw new BusinessException(ResultCode.CATEGORY_NOT_FOUND, "父分类不存在"); - } - // 检查父分类是否属于同一部门 - if (!parent.getDepartmentId().equals(departmentId)) { - throw new BusinessException(ResultCode.BAD_REQUEST, "父分类不属于该部门"); - } - } - - // 检查同一父级下名称是否重复 - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(Category::getDepartmentId, departmentId) - .eq(Category::getParentId, dto.getParentId() != null ? dto.getParentId() : 0L) - .eq(Category::getName, dto.getName()); - if (count(queryWrapper) > 0) { - throw new BusinessException(ResultCode.DATA_EXISTS, "该级别下已存在同名分类"); - } - - Category category = new Category(); - category.setName(dto.getName()); - category.setParentId(dto.getParentId() != null ? dto.getParentId() : 0L); - category.setDepartmentId(departmentId); - category.setSortOrder(dto.getSortOrder() != null ? dto.getSortOrder() : 0); - save(category); - return category.getId(); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void updateCategory(CategoryDTO dto) { - if (dto.getId() == null) { - throw new BusinessException(ResultCode.BAD_REQUEST, "分类ID不能为空"); - } - - Category category = getById(dto.getId()); - if (category == null) { - throw new BusinessException(ResultCode.CATEGORY_NOT_FOUND); - } - - // 部门权限校验:非管理员只能操作本部门分类 - checkDepartmentPermission(category.getDepartmentId()); - - // 检查父分类是否存在(如果有) - Long parentId = dto.getParentId() != null ? dto.getParentId() : 0L; - if (parentId > 0) { - // 不能将自己设为父分类 - if (parentId.equals(dto.getId())) { - throw new BusinessException(ResultCode.BAD_REQUEST, "不能将自己设为父分类"); - } - Category parent = getById(parentId); - if (parent == null) { - throw new BusinessException(ResultCode.CATEGORY_NOT_FOUND, "父分类不存在"); - } - } - - // 检查同一父级下名称是否重复(排除自己) - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(Category::getDepartmentId, category.getDepartmentId()) - .eq(Category::getParentId, parentId) - .eq(Category::getName, dto.getName()) - .ne(Category::getId, dto.getId()); - if (count(queryWrapper) > 0) { - throw new BusinessException(ResultCode.DATA_EXISTS, "该级别下已存在同名分类"); - } - - category.setName(dto.getName()); - category.setParentId(parentId); - if (dto.getSortOrder() != null) { - category.setSortOrder(dto.getSortOrder()); - } - updateById(category); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void deleteCategory(Long id) { - Category category = getById(id); - if (category == null) { - throw new BusinessException(ResultCode.CATEGORY_NOT_FOUND); - } - - // 部门权限校验:非管理员只能操作本部门分类 - checkDepartmentPermission(category.getDepartmentId()); - - // 检查是否有子分类 - LambdaQueryWrapper childQuery = new LambdaQueryWrapper<>(); - childQuery.eq(Category::getParentId, id); - if (count(childQuery) > 0) { - throw new BusinessException(ResultCode.DATA_REFERENCED, "该分类下存在子分类,无法删除"); - } - - // 检查是否有知识 - LambdaQueryWrapper knowledgeQuery = new LambdaQueryWrapper<>(); - knowledgeQuery.eq(Knowledge::getCategoryId, id); - if (knowledgeMapper.selectCount(knowledgeQuery) > 0) { - throw new BusinessException(ResultCode.DATA_REFERENCED, "该分类下存在知识,无法删除"); - } - - removeById(id); - } - - private CategoryVO convertToVO(Category category, Map knowledgeCountMap) { - CategoryVO vo = new CategoryVO(); - vo.setId(category.getId()); - vo.setName(category.getName()); - vo.setParentId(category.getParentId()); - vo.setDepartmentId(category.getDepartmentId()); - vo.setSortOrder(category.getSortOrder()); - vo.setCreateTime(category.getCreateTime()); - - // 获取父分类名称 - if (category.getParentId() != null && category.getParentId() > 0) { - Category parent = getById(category.getParentId()); - if (parent != null) { - vo.setParentName(parent.getName()); - } - } - - // 获取部门名称 - if (category.getDepartmentId() != null) { - Department department = departmentMapper.selectById(category.getDepartmentId()); - if (department != null) { - vo.setDepartmentName(department.getName()); - } - } - - // 知识数量 - if (knowledgeCountMap != null) { - vo.setKnowledgeCount(knowledgeCountMap.getOrDefault(category.getId(), 0)); - } - - return vo; - } - - private List buildTree(List allCategories) { - // 找出所有顶级分类 - List roots = allCategories.stream() - .filter(c -> c.getParentId() == null || c.getParentId() == 0) - .collect(Collectors.toList()); - - // 递归设置子分类 - for (CategoryVO root : roots) { - setChildren(root, allCategories); - } - - return roots; - } - - private void setChildren(CategoryVO parent, List allCategories) { - List children = allCategories.stream() - .filter(c -> parent.getId().equals(c.getParentId())) - .collect(Collectors.toList()); - - if (!children.isEmpty()) { - parent.setChildren(children); - for (CategoryVO child : children) { - setChildren(child, allCategories); - } - } else { - parent.setChildren(new ArrayList<>()); - } - } - - private Map getKnowledgeCountMap(Long departmentId) { - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - if (departmentId != null) { - queryWrapper.eq(Knowledge::getDepartmentId, departmentId); - } - List knowledgeList = knowledgeMapper.selectList(queryWrapper); - - return knowledgeList.stream() - .filter(k -> k.getCategoryId() != null) - .collect(Collectors.groupingBy( - Knowledge::getCategoryId, - Collectors.collectingAndThen(Collectors.counting(), Long::intValue) - )); - } - - /** - * 部门权限校验 - * 管理员可以操作任意部门(必须指定部门),讲师只能操作本部门(自动使用当前部门) - * - * @param targetDepartmentId 目标部门ID - * @return 实际应使用的部门ID - */ - private Long checkDepartmentPermission(Long targetDepartmentId) { - // 管理员可以操作任意部门,但必须指定部门ID - if (SecurityUtils.isAdmin()) { - if (targetDepartmentId == null) { - throw new BusinessException(ResultCode.BAD_REQUEST, "请选择所属部门"); - } - return targetDepartmentId; - } - - // 获取当前用户部门ID - Long currentDepartmentId = SecurityUtils.getCurrentDepartmentId(); - if (currentDepartmentId == null) { - throw new BusinessException(ResultCode.FORBIDDEN, "无法获取当前用户部门信息"); - } - - // 非管理员只能操作本部门 - if (targetDepartmentId != null && !targetDepartmentId.equals(currentDepartmentId)) { - throw new BusinessException(ResultCode.FORBIDDEN, "无权操作其他部门的分类"); - } - - return currentDepartmentId; - } -} diff --git a/training-system/src/main/java/com/sino/training/module/knowledge/service/impl/KnowledgeServiceImpl.java b/training-system/src/main/java/com/sino/training/module/knowledge/service/impl/KnowledgeServiceImpl.java deleted file mode 100644 index a5fd500..0000000 --- a/training-system/src/main/java/com/sino/training/module/knowledge/service/impl/KnowledgeServiceImpl.java +++ /dev/null @@ -1,346 +0,0 @@ -package com.sino.training.module.knowledge.service.impl; - -import cn.hutool.core.util.StrUtil; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.sino.training.common.enums.ContentStatus; -import com.sino.training.common.enums.KnowledgeType; -import com.sino.training.common.exception.BusinessException; -import com.sino.training.common.result.PageResult; -import com.sino.training.common.result.ResultCode; -import com.sino.training.module.knowledge.dto.KnowledgeDTO; -import com.sino.training.module.knowledge.dto.KnowledgeQueryDTO; -import com.sino.training.module.knowledge.entity.Category; -import com.sino.training.module.knowledge.entity.Knowledge; -import com.sino.training.module.knowledge.mapper.CategoryMapper; -import com.sino.training.module.knowledge.mapper.KnowledgeMapper; -import com.sino.training.module.knowledge.service.KnowledgeService; -import com.sino.training.module.knowledge.vo.KnowledgeVO; -import com.sino.training.module.system.entity.Department; -import com.sino.training.module.system.entity.User; -import com.sino.training.module.system.mapper.DepartmentMapper; -import com.sino.training.module.system.mapper.UserMapper; -import com.sino.training.common.utils.SecurityUtils; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; - -/** - * 知识服务实现类 - * - * @author training-system - */ -@Service -@RequiredArgsConstructor -public class KnowledgeServiceImpl extends ServiceImpl implements KnowledgeService { - - private final CategoryMapper categoryMapper; - private final DepartmentMapper departmentMapper; - private final UserMapper userMapper; - - @Override - public PageResult pageKnowledge(KnowledgeQueryDTO queryDTO) { - Page page = queryDTO.toPage(); - - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - - // 关键字搜索 - if (StrUtil.isNotBlank(queryDTO.getKeyword())) { - queryWrapper.like(Knowledge::getTitle, queryDTO.getKeyword()); - } - - // 分类筛选 - if (queryDTO.getCategoryId() != null) { - queryWrapper.eq(Knowledge::getCategoryId, queryDTO.getCategoryId()); - } - - // 部门筛选 - if (queryDTO.getDepartmentId() != null) { - queryWrapper.eq(Knowledge::getDepartmentId, queryDTO.getDepartmentId()); - } - - // 类型筛选 - if (StrUtil.isNotBlank(queryDTO.getType())) { - queryWrapper.eq(Knowledge::getType, KnowledgeType.valueOf(queryDTO.getType())); - } - - // 状态筛选 - if (StrUtil.isNotBlank(queryDTO.getStatus())) { - queryWrapper.eq(Knowledge::getStatus, ContentStatus.valueOf(queryDTO.getStatus())); - } - - queryWrapper.orderByDesc(Knowledge::getCreateTime); - - Page result = page(page, queryWrapper); - - List voList = new ArrayList<>(); - for (Knowledge knowledge : result.getRecords()) { - voList.add(convertToVO(knowledge)); - } - - return PageResult.of(result, voList); - } - - @Override - public KnowledgeVO getKnowledgeDetail(Long id) { - Knowledge knowledge = getById(id); - if (knowledge == null) { - throw new BusinessException(ResultCode.KNOWLEDGE_NOT_FOUND); - } - return convertToVO(knowledge); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public Long createKnowledge(KnowledgeDTO dto) { - // 获取当前登录用户ID - Long currentUserId = SecurityUtils.getCurrentUserId(); - if (currentUserId == null) { - throw new BusinessException(ResultCode.UNAUTHORIZED, "请先登录"); - } - - // 获取当前用户部门ID - Long currentDepartmentId = SecurityUtils.getCurrentDepartmentId(); - - // 检查分类是否存在 - Category category = categoryMapper.selectById(dto.getCategoryId()); - if (category == null) { - throw new BusinessException(ResultCode.CATEGORY_NOT_FOUND); - } - - // 确定知识所属部门:优先使用当前用户部门,管理员可指定其他部门 - Long departmentId = dto.getDepartmentId(); - if (!SecurityUtils.isAdmin()) { - // 非管理员只能创建本部门的知识 - departmentId = currentDepartmentId; - } - - // 检查部门是否存在 - Department department = departmentMapper.selectById(departmentId); - if (department == null) { - throw new BusinessException(ResultCode.DATA_NOT_FOUND, "所属部门不存在"); - } - - Knowledge knowledge = new Knowledge(); - knowledge.setTitle(dto.getTitle()); - knowledge.setDescription(dto.getDescription()); - knowledge.setCategoryId(dto.getCategoryId()); - knowledge.setType(KnowledgeType.valueOf(dto.getType())); - knowledge.setFileName(dto.getFileName()); - knowledge.setFileUrl(dto.getFileUrl()); - knowledge.setFileSize(dto.getFileSize()); - knowledge.setFileType(dto.getFileType()); - knowledge.setDepartmentId(departmentId); - knowledge.setStatus(ContentStatus.DRAFT); - knowledge.setViewCount(0); - // 设置创建人ID - knowledge.setCreatorId(currentUserId); - - save(knowledge); - return knowledge.getId(); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void updateKnowledge(KnowledgeDTO dto) { - if (dto.getId() == null) { - throw new BusinessException(ResultCode.BAD_REQUEST, "知识ID不能为空"); - } - - Knowledge knowledge = getById(dto.getId()); - if (knowledge == null) { - throw new BusinessException(ResultCode.KNOWLEDGE_NOT_FOUND); - } - - // 检查分类是否存在 - if (dto.getCategoryId() != null) { - Category category = categoryMapper.selectById(dto.getCategoryId()); - if (category == null) { - throw new BusinessException(ResultCode.CATEGORY_NOT_FOUND); - } - knowledge.setCategoryId(dto.getCategoryId()); - } - - knowledge.setTitle(dto.getTitle()); - knowledge.setDescription(dto.getDescription()); - knowledge.setType(KnowledgeType.valueOf(dto.getType())); - - if (StrUtil.isNotBlank(dto.getFileName())) { - knowledge.setFileName(dto.getFileName()); - } - if (StrUtil.isNotBlank(dto.getFileUrl())) { - knowledge.setFileUrl(dto.getFileUrl()); - } - if (dto.getFileSize() != null) { - knowledge.setFileSize(dto.getFileSize()); - } - if (StrUtil.isNotBlank(dto.getFileType())) { - knowledge.setFileType(dto.getFileType()); - } - - updateById(knowledge); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void deleteKnowledge(Long id) { - Knowledge knowledge = getById(id); - if (knowledge == null) { - throw new BusinessException(ResultCode.KNOWLEDGE_NOT_FOUND); - } - - // TODO: 检查是否被培训计划引用 - - removeById(id); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void publishKnowledge(Long id) { - Knowledge knowledge = getById(id); - if (knowledge == null) { - throw new BusinessException(ResultCode.KNOWLEDGE_NOT_FOUND); - } - - knowledge.setStatus(ContentStatus.PUBLISHED); - knowledge.setPublishTime(LocalDateTime.now()); - updateById(knowledge); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void offlineKnowledge(Long id) { - Knowledge knowledge = getById(id); - if (knowledge == null) { - throw new BusinessException(ResultCode.KNOWLEDGE_NOT_FOUND); - } - - // TODO: 检查是否被培训计划引用,给出警告 - - knowledge.setStatus(ContentStatus.OFFLINE); - updateById(knowledge); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void increaseViewCount(Long id) { - Knowledge knowledge = getById(id); - if (knowledge != null) { - knowledge.setViewCount(knowledge.getViewCount() + 1); - updateById(knowledge); - } - } - - @Override - public List listPublishedByCategory(Long categoryId) { - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(Knowledge::getCategoryId, categoryId) - .eq(Knowledge::getStatus, ContentStatus.PUBLISHED) - .orderByDesc(Knowledge::getPublishTime); - List list = list(queryWrapper); - - List voList = new ArrayList<>(); - for (Knowledge knowledge : list) { - voList.add(convertToVO(knowledge)); - } - return voList; - } - - @Override - public List listPublishedByDepartment(Long departmentId) { - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(Knowledge::getDepartmentId, departmentId) - .eq(Knowledge::getStatus, ContentStatus.PUBLISHED) - .orderByDesc(Knowledge::getPublishTime); - List list = list(queryWrapper); - - List voList = new ArrayList<>(); - for (Knowledge knowledge : list) { - voList.add(convertToVO(knowledge)); - } - return voList; - } - - private KnowledgeVO convertToVO(Knowledge knowledge) { - KnowledgeVO vo = new KnowledgeVO(); - vo.setId(knowledge.getId()); - vo.setTitle(knowledge.getTitle()); - vo.setDescription(knowledge.getDescription()); - vo.setCategoryId(knowledge.getCategoryId()); - vo.setType(knowledge.getType().name()); - vo.setTypeName(getTypeName(knowledge.getType())); - vo.setFileName(knowledge.getFileName()); - vo.setFileUrl(knowledge.getFileUrl()); - vo.setFileSize(knowledge.getFileSize()); - vo.setFileSizeFormat(formatFileSize(knowledge.getFileSize())); - vo.setFileType(knowledge.getFileType()); - vo.setDepartmentId(knowledge.getDepartmentId()); - vo.setStatus(knowledge.getStatus().name()); - vo.setStatusName(getStatusName(knowledge.getStatus())); - vo.setCreatorId(knowledge.getCreatorId()); - vo.setViewCount(knowledge.getViewCount()); - vo.setCreateTime(knowledge.getCreateTime()); - vo.setPublishTime(knowledge.getPublishTime()); - - // 获取分类名称 - if (knowledge.getCategoryId() != null) { - Category category = categoryMapper.selectById(knowledge.getCategoryId()); - if (category != null) { - vo.setCategoryName(category.getName()); - } - } - - // 获取部门名称 - if (knowledge.getDepartmentId() != null) { - Department department = departmentMapper.selectById(knowledge.getDepartmentId()); - if (department != null) { - vo.setDepartmentName(department.getName()); - } - } - - // 获取创建人姓名 - if (knowledge.getCreatorId() != null) { - User user = userMapper.selectById(knowledge.getCreatorId()); - if (user != null) { - vo.setCreatorName(user.getRealName()); - } - } - - return vo; - } - - private String getTypeName(KnowledgeType type) { - return switch (type) { - case DOCUMENT -> "文档"; - case VIDEO -> "视频"; - }; - } - - private String getStatusName(ContentStatus status) { - return switch (status) { - case DRAFT -> "草稿"; - case PUBLISHED -> "已发布"; - case OFFLINE -> "已下架"; - }; - } - - private String formatFileSize(Long size) { - if (size == null) { - return ""; - } - if (size < 1024) { - return size + "B"; - } else if (size < 1024 * 1024) { - return String.format("%.2fKB", size / 1024.0); - } else if (size < 1024 * 1024 * 1024) { - return String.format("%.2fMB", size / (1024.0 * 1024)); - } else { - return String.format("%.2fGB", size / (1024.0 * 1024 * 1024)); - } - } -} diff --git a/training-system/src/main/java/com/sino/training/module/knowledge/vo/CategoryVO.java b/training-system/src/main/java/com/sino/training/module/knowledge/vo/CategoryVO.java deleted file mode 100644 index 87ac4a4..0000000 --- a/training-system/src/main/java/com/sino/training/module/knowledge/vo/CategoryVO.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.sino.training.module.knowledge.vo; - -import lombok.Data; - -import java.io.Serializable; -import java.time.LocalDateTime; -import java.util.List; - -/** - * 知识分类VO - * - * @author training-system - */ -@Data -public class CategoryVO implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * 分类ID - */ - private Long id; - - /** - * 分类名称 - */ - private String name; - - /** - * 父分类ID - */ - private Long parentId; - - /** - * 父分类名称 - */ - private String parentName; - - /** - * 所属部门ID - */ - private Long departmentId; - - /** - * 所属部门名称 - */ - private String departmentName; - - /** - * 排序 - */ - private Integer sortOrder; - - /** - * 创建时间 - */ - private LocalDateTime createTime; - - /** - * 子分类列表 - */ - private List children; - - /** - * 该分类下的知识数量 - */ - private Integer knowledgeCount; -} diff --git a/training-system/src/main/java/com/sino/training/module/knowledge/vo/KnowledgeVO.java b/training-system/src/main/java/com/sino/training/module/knowledge/vo/KnowledgeVO.java deleted file mode 100644 index 1085c01..0000000 --- a/training-system/src/main/java/com/sino/training/module/knowledge/vo/KnowledgeVO.java +++ /dev/null @@ -1,122 +0,0 @@ -package com.sino.training.module.knowledge.vo; - -import lombok.Data; - -import java.io.Serializable; -import java.time.LocalDateTime; - -/** - * 知识VO - * - * @author training-system - */ -@Data -public class KnowledgeVO implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * 知识ID - */ - private Long id; - - /** - * 标题 - */ - private String title; - - /** - * 描述/摘要 - */ - private String description; - - /** - * 所属分类ID - */ - private Long categoryId; - - /** - * 所属分类名称 - */ - private String categoryName; - - /** - * 知识类型 - */ - private String type; - - /** - * 知识类型名称 - */ - private String typeName; - - /** - * 文件名 - */ - private String fileName; - - /** - * 文件URL - */ - private String fileUrl; - - /** - * 文件大小 - */ - private Long fileSize; - - /** - * 文件大小(格式化) - */ - private String fileSizeFormat; - - /** - * 文件类型 - */ - private String fileType; - - /** - * 所属部门ID - */ - private Long departmentId; - - /** - * 所属部门名称 - */ - private String departmentName; - - /** - * 状态 - */ - private String status; - - /** - * 状态名称 - */ - private String statusName; - - /** - * 创建人ID - */ - private Long creatorId; - - /** - * 创建人姓名 - */ - private String creatorName; - - /** - * 浏览次数 - */ - private Integer viewCount; - - /** - * 创建时间 - */ - private LocalDateTime createTime; - - /** - * 发布时间 - */ - private LocalDateTime publishTime; -} diff --git a/training-system/src/main/java/com/sino/training/module/system/controller/CenterController.java b/training-system/src/main/java/com/sino/training/module/system/controller/CenterController.java deleted file mode 100644 index efd5db5..0000000 --- a/training-system/src/main/java/com/sino/training/module/system/controller/CenterController.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.sino.training.module.system.controller; - -import com.sino.training.common.result.Result; -import com.sino.training.module.system.dto.CenterDTO; -import com.sino.training.module.system.service.CenterService; -import com.sino.training.module.system.vo.CenterVO; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import jakarta.validation.Valid; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -/** - * 中心管理控制器 - * - * @author training-system - */ -@Tag(name = "中心管理", description = "中心CRUD接口") -@RestController -@RequestMapping("/api/system/center") -@RequiredArgsConstructor -public class CenterController { - - private final CenterService centerService; - - @Operation(summary = "获取中心列表") - @GetMapping("/list") - public Result> list() { - return Result.success(centerService.listCenters()); - } - - @Operation(summary = "获取中心详情") - @GetMapping("/{id}") - public Result detail(@PathVariable Long id) { - return Result.success(centerService.getCenterDetail(id)); - } - - @Operation(summary = "创建中心") - @PostMapping - public Result create(@Valid @RequestBody CenterDTO dto) { - return Result.success(centerService.createCenter(dto)); - } - - @Operation(summary = "更新中心") - @PutMapping - public Result update(@Valid @RequestBody CenterDTO dto) { - centerService.updateCenter(dto); - return Result.success(); - } - - @Operation(summary = "删除中心") - @DeleteMapping("/{id}") - public Result delete(@PathVariable Long id) { - centerService.deleteCenter(id); - return Result.success(); - } -} diff --git a/training-system/src/main/java/com/sino/training/module/system/controller/DepartmentController.java b/training-system/src/main/java/com/sino/training/module/system/controller/DepartmentController.java deleted file mode 100644 index aedb268..0000000 --- a/training-system/src/main/java/com/sino/training/module/system/controller/DepartmentController.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.sino.training.module.system.controller; - -import com.sino.training.common.result.Result; -import com.sino.training.module.system.dto.DepartmentDTO; -import com.sino.training.module.system.service.DepartmentService; -import com.sino.training.module.system.vo.DepartmentVO; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.tags.Tag; -import jakarta.validation.Valid; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -/** - * 部门管理控制器 - * - * @author training-system - */ -@Tag(name = "部门管理", description = "部门CRUD接口") -@RestController -@RequestMapping("/api/system/department") -@RequiredArgsConstructor -public class DepartmentController { - - private final DepartmentService departmentService; - - @Operation(summary = "获取部门列表") - @GetMapping("/list") - public Result> list( - @Parameter(description = "中心ID(可选,不传则获取全部)") @RequestParam(required = false) Long centerId) { - return Result.success(departmentService.listDepartments(centerId)); - } - - @Operation(summary = "获取部门详情") - @GetMapping("/{id}") - public Result detail(@PathVariable Long id) { - return Result.success(departmentService.getDepartmentDetail(id)); - } - - @Operation(summary = "创建部门") - @PostMapping - public Result create(@Valid @RequestBody DepartmentDTO dto) { - return Result.success(departmentService.createDepartment(dto)); - } - - @Operation(summary = "更新部门") - @PutMapping - public Result update(@Valid @RequestBody DepartmentDTO dto) { - departmentService.updateDepartment(dto); - return Result.success(); - } - - @Operation(summary = "删除部门") - @DeleteMapping("/{id}") - public Result delete(@PathVariable Long id) { - departmentService.deleteDepartment(id); - return Result.success(); - } -} diff --git a/training-system/src/main/java/com/sino/training/module/system/controller/GroupController.java b/training-system/src/main/java/com/sino/training/module/system/controller/GroupController.java deleted file mode 100644 index bf9da51..0000000 --- a/training-system/src/main/java/com/sino/training/module/system/controller/GroupController.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.sino.training.module.system.controller; - -import com.sino.training.common.result.Result; -import com.sino.training.module.system.dto.GroupDTO; -import com.sino.training.module.system.service.GroupService; -import com.sino.training.module.system.vo.GroupVO; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.tags.Tag; -import jakarta.validation.Valid; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -/** - * 小组管理控制器 - * - * @author training-system - */ -@Tag(name = "小组管理", description = "小组CRUD接口") -@RestController -@RequestMapping("/api/system/group") -@RequiredArgsConstructor -public class GroupController { - - private final GroupService groupService; - - @Operation(summary = "获取小组列表") - @GetMapping("/list") - public Result> list( - @Parameter(description = "部门ID(可选,不传则获取全部)") @RequestParam(required = false) Long departmentId) { - return Result.success(groupService.listGroups(departmentId)); - } - - @Operation(summary = "获取小组详情") - @GetMapping("/{id}") - public Result detail(@PathVariable Long id) { - return Result.success(groupService.getGroupDetail(id)); - } - - @Operation(summary = "创建小组") - @PostMapping - public Result create(@Valid @RequestBody GroupDTO dto) { - return Result.success(groupService.createGroup(dto)); - } - - @Operation(summary = "更新小组") - @PutMapping - public Result update(@Valid @RequestBody GroupDTO dto) { - groupService.updateGroup(dto); - return Result.success(); - } - - @Operation(summary = "删除小组") - @DeleteMapping("/{id}") - public Result delete(@PathVariable Long id) { - groupService.deleteGroup(id); - return Result.success(); - } -} diff --git a/training-system/src/main/java/com/sino/training/module/system/controller/OrganizationController.java b/training-system/src/main/java/com/sino/training/module/system/controller/OrganizationController.java deleted file mode 100644 index ffb81da..0000000 --- a/training-system/src/main/java/com/sino/training/module/system/controller/OrganizationController.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.sino.training.module.system.controller; - -import com.sino.training.common.result.Result; -import com.sino.training.module.system.service.OrganizationService; -import com.sino.training.module.system.vo.OrgTreeVO; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -/** - * 组织架构控制器 - * - * @author training-system - */ -@Tag(name = "组织架构", description = "组织架构树接口") -@RestController -@RequestMapping("/api/system/org") -@RequiredArgsConstructor -public class OrganizationController { - - private final OrganizationService organizationService; - - @Operation(summary = "获取完整组织架构树") - @GetMapping("/tree") - public Result> getOrgTree() { - return Result.success(organizationService.getOrgTree()); - } - - @Operation(summary = "获取指定中心的组织架构树") - @GetMapping("/tree/{centerId}") - public Result getOrgTreeByCenter(@PathVariable Long centerId) { - return Result.success(organizationService.getOrgTreeByCenter(centerId)); - } -} diff --git a/training-system/src/main/java/com/sino/training/module/system/controller/UserController.java b/training-system/src/main/java/com/sino/training/module/system/controller/UserController.java deleted file mode 100644 index 0ffb940..0000000 --- a/training-system/src/main/java/com/sino/training/module/system/controller/UserController.java +++ /dev/null @@ -1,113 +0,0 @@ -package com.sino.training.module.system.controller; - -import com.sino.training.common.annotation.RequireRole; -import com.sino.training.common.enums.UserRole; -import com.sino.training.common.result.PageResult; -import com.sino.training.common.result.Result; -import com.sino.training.module.system.dto.PasswordDTO; -import com.sino.training.module.system.dto.UserDTO; -import com.sino.training.module.system.dto.UserQueryDTO; -import com.sino.training.module.system.service.UserService; -import com.sino.training.module.system.vo.UserVO; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.tags.Tag; -import jakarta.validation.Valid; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -/** - * 用户管理控制器 - * - * @author training-system - */ -@Tag(name = "用户管理", description = "用户CRUD接口") -@RestController -@RequestMapping("/api/system/user") -@RequiredArgsConstructor -@RequireRole({UserRole.ADMIN, UserRole.LECTURER}) -public class UserController { - - private final UserService userService; - - @Operation(summary = "分页查询用户列表") - @GetMapping("/page") - public Result> page(UserQueryDTO queryDTO) { - return Result.success(userService.pageUsers(queryDTO)); - } - - @Operation(summary = "获取用户列表(当前用户部门)") - @GetMapping("/list") - public Result> list(@RequestParam(required = false) String role) { - return Result.success(userService.listUsers(role)); - } - - @Operation(summary = "获取用户详情") - @GetMapping("/{id}") - public Result detail(@PathVariable Long id) { - return Result.success(userService.getUserDetail(id)); - } - - @Operation(summary = "创建用户") - @PostMapping - public Result create(@Valid @RequestBody UserDTO dto) { - return Result.success(userService.createUser(dto)); - } - - @Operation(summary = "更新用户") - @PutMapping - public Result update(@Valid @RequestBody UserDTO dto) { - userService.updateUser(dto); - return Result.success(); - } - - @Operation(summary = "删除用户") - @DeleteMapping("/{id}") - public Result delete(@PathVariable Long id) { - userService.deleteUser(id); - return Result.success(); - } - - @Operation(summary = "启用用户") - @PutMapping("/{id}/enable") - public Result enable(@PathVariable Long id) { - userService.enableUser(id); - return Result.success(); - } - - @Operation(summary = "禁用用户") - @PutMapping("/{id}/disable") - public Result disable(@PathVariable Long id) { - userService.disableUser(id); - return Result.success(); - } - - @Operation(summary = "重置密码") - @PutMapping("/password/reset") - public Result resetPassword(@Valid @RequestBody PasswordDTO dto) { - userService.resetPassword(dto); - return Result.success(); - } - - @Operation(summary = "根据部门获取用户列表") - @GetMapping("/list/department/{departmentId}") - public Result> listByDepartment(@PathVariable Long departmentId) { - return Result.success(userService.listUsersByDepartment(departmentId)); - } - - @Operation(summary = "根据小组获取用户列表") - @GetMapping("/list/group/{groupId}") - public Result> listByGroup(@PathVariable Long groupId) { - return Result.success(userService.listUsersByGroup(groupId)); - } - - @Operation(summary = "根据角色获取用户列表") - @GetMapping("/list/role/{role}") - public Result> listByRole( - @PathVariable String role, - @Parameter(description = "部门ID(可选)") @RequestParam(required = false) Long departmentId) { - return Result.success(userService.listUsersByRole(role, departmentId)); - } -} diff --git a/training-system/src/main/java/com/sino/training/module/system/dto/CenterDTO.java b/training-system/src/main/java/com/sino/training/module/system/dto/CenterDTO.java deleted file mode 100644 index c2691a7..0000000 --- a/training-system/src/main/java/com/sino/training/module/system/dto/CenterDTO.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.sino.training.module.system.dto; - -import jakarta.validation.constraints.NotBlank; -import lombok.Data; - -import java.io.Serializable; - -/** - * 中心DTO - * - * @author training-system - */ -@Data -public class CenterDTO implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * 中心ID(编辑时使用) - */ - private Long id; - - /** - * 中心名称 - */ - @NotBlank(message = "中心名称不能为空") - private String name; - - /** - * 排序 - */ - private Integer sortOrder; -} diff --git a/training-system/src/main/java/com/sino/training/module/system/dto/DepartmentDTO.java b/training-system/src/main/java/com/sino/training/module/system/dto/DepartmentDTO.java deleted file mode 100644 index 8f958d5..0000000 --- a/training-system/src/main/java/com/sino/training/module/system/dto/DepartmentDTO.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.sino.training.module.system.dto; - -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotNull; -import lombok.Data; - -import java.io.Serializable; - -/** - * 部门DTO - * - * @author training-system - */ -@Data -public class DepartmentDTO implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * 部门ID(编辑时使用) - */ - private Long id; - - /** - * 部门名称 - */ - @NotBlank(message = "部门名称不能为空") - private String name; - - /** - * 所属中心ID - */ - @NotNull(message = "所属中心不能为空") - private Long centerId; - - /** - * 排序 - */ - private Integer sortOrder; -} diff --git a/training-system/src/main/java/com/sino/training/module/system/dto/GroupDTO.java b/training-system/src/main/java/com/sino/training/module/system/dto/GroupDTO.java deleted file mode 100644 index a452a34..0000000 --- a/training-system/src/main/java/com/sino/training/module/system/dto/GroupDTO.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.sino.training.module.system.dto; - -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotNull; -import lombok.Data; - -import java.io.Serializable; - -/** - * 小组DTO - * - * @author training-system - */ -@Data -public class GroupDTO implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * 小组ID(编辑时使用) - */ - private Long id; - - /** - * 小组名称 - */ - @NotBlank(message = "小组名称不能为空") - private String name; - - /** - * 所属部门ID - */ - @NotNull(message = "所属部门不能为空") - private Long departmentId; - - /** - * 排序 - */ - private Integer sortOrder; -} diff --git a/training-system/src/main/java/com/sino/training/module/system/dto/PasswordDTO.java b/training-system/src/main/java/com/sino/training/module/system/dto/PasswordDTO.java deleted file mode 100644 index e458303..0000000 --- a/training-system/src/main/java/com/sino/training/module/system/dto/PasswordDTO.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.sino.training.module.system.dto; - -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotNull; -import lombok.Data; - -import java.io.Serializable; - -/** - * 修改密码DTO - * - * @author training-system - */ -@Data -public class PasswordDTO implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * 用户ID - */ - @NotNull(message = "用户ID不能为空") - private Long userId; - - /** - * 新密码 - */ - @NotBlank(message = "新密码不能为空") - private String newPassword; -} diff --git a/training-system/src/main/java/com/sino/training/module/system/dto/UserDTO.java b/training-system/src/main/java/com/sino/training/module/system/dto/UserDTO.java deleted file mode 100644 index 317440d..0000000 --- a/training-system/src/main/java/com/sino/training/module/system/dto/UserDTO.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.sino.training.module.system.dto; - -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotNull; -import lombok.Data; - -import java.io.Serializable; - -/** - * 用户DTO - * - * @author training-system - */ -@Data -public class UserDTO implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * 用户ID(编辑时使用) - */ - private Long id; - - /** - * 用户名 - */ - @NotBlank(message = "用户名不能为空") - private String username; - - /** - * 密码(创建时必填,编辑时可选) - */ - private String password; - - /** - * 真实姓名 - */ - @NotBlank(message = "真实姓名不能为空") - private String realName; - - /** - * 手机号 - */ - private String phone; - - /** - * 头像URL - */ - private String avatar; - - /** - * 用户角色 - */ - @NotNull(message = "用户角色不能为空") - private String role; - - /** - * 所属部门ID - */ - @NotNull(message = "所属部门不能为空") - private Long departmentId; - - /** - * 所属小组ID - */ - private Long groupId; - - /** - * 企业微信用户ID - */ - private String wxUserid; - - /** - * 用户状态(编辑时可选:ENABLED/DISABLED) - */ - private String status; -} diff --git a/training-system/src/main/java/com/sino/training/module/system/dto/UserQueryDTO.java b/training-system/src/main/java/com/sino/training/module/system/dto/UserQueryDTO.java deleted file mode 100644 index 393626b..0000000 --- a/training-system/src/main/java/com/sino/training/module/system/dto/UserQueryDTO.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.sino.training.module.system.dto; - -import com.sino.training.common.base.PageQuery; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * 用户查询DTO - * - * @author training-system - */ -@Data -@EqualsAndHashCode(callSuper = true) -public class UserQueryDTO extends PageQuery { - - /** - * 关键字(用户名/真实姓名/手机号) - */ - private String keyword; - - /** - * 部门ID - */ - private Long departmentId; - - /** - * 小组ID - */ - private Long groupId; - - /** - * 用户角色 - */ - private String role; - - /** - * 用户状态 - */ - private String status; -} diff --git a/training-system/src/main/java/com/sino/training/module/system/entity/Center.java b/training-system/src/main/java/com/sino/training/module/system/entity/Center.java deleted file mode 100644 index da71b8d..0000000 --- a/training-system/src/main/java/com/sino/training/module/system/entity/Center.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.sino.training.module.system.entity; - -import com.baomidou.mybatisplus.annotation.TableName; -import com.sino.training.common.base.BaseEntity; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * 中心实体 - * - * @author training-system - */ -@Data -@EqualsAndHashCode(callSuper = true) -@TableName("sys_center") -public class Center extends BaseEntity { - - /** - * 中心名称 - */ - private String name; - - /** - * 排序 - */ - private Integer sortOrder; -} diff --git a/training-system/src/main/java/com/sino/training/module/system/entity/Department.java b/training-system/src/main/java/com/sino/training/module/system/entity/Department.java deleted file mode 100644 index 8519291..0000000 --- a/training-system/src/main/java/com/sino/training/module/system/entity/Department.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.sino.training.module.system.entity; - -import com.baomidou.mybatisplus.annotation.TableName; -import com.sino.training.common.base.BaseEntity; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * 部门实体 - * - * @author training-system - */ -@Data -@EqualsAndHashCode(callSuper = true) -@TableName("sys_department") -public class Department extends BaseEntity { - - /** - * 部门名称 - */ - private String name; - - /** - * 所属中心ID - */ - private Long centerId; - - /** - * 排序 - */ - private Integer sortOrder; -} diff --git a/training-system/src/main/java/com/sino/training/module/system/entity/Group.java b/training-system/src/main/java/com/sino/training/module/system/entity/Group.java deleted file mode 100644 index 490e3cc..0000000 --- a/training-system/src/main/java/com/sino/training/module/system/entity/Group.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.sino.training.module.system.entity; - -import com.baomidou.mybatisplus.annotation.TableName; -import com.sino.training.common.base.BaseEntity; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * 小组实体 - * - * @author training-system - */ -@Data -@EqualsAndHashCode(callSuper = true) -@TableName("sys_group") -public class Group extends BaseEntity { - - /** - * 小组名称 - */ - private String name; - - /** - * 所属部门ID - */ - private Long departmentId; - - /** - * 排序 - */ - private Integer sortOrder; -} diff --git a/training-system/src/main/java/com/sino/training/module/system/entity/User.java b/training-system/src/main/java/com/sino/training/module/system/entity/User.java deleted file mode 100644 index 83df064..0000000 --- a/training-system/src/main/java/com/sino/training/module/system/entity/User.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.sino.training.module.system.entity; - -import com.baomidou.mybatisplus.annotation.TableName; -import com.sino.training.common.base.BaseEntity; -import com.sino.training.common.enums.UserRole; -import com.sino.training.common.enums.UserStatus; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * 用户实体 - * - * @author training-system - */ -@Data -@EqualsAndHashCode(callSuper = true) -@TableName("sys_user") -public class User extends BaseEntity { - - /** - * 企业微信用户ID - */ - private String wxUserid; - - /** - * 用户名(登录账号) - */ - private String username; - - /** - * 密码(备用登录方式) - */ - private String password; - - /** - * 真实姓名 - */ - private String realName; - - /** - * 手机号 - */ - private String phone; - - /** - * 头像URL - */ - private String avatar; - - /** - * 用户角色 - */ - private UserRole role; - - /** - * 所属部门ID - */ - private Long departmentId; - - /** - * 所属小组ID(可为空) - */ - private Long groupId; - - /** - * 用户状态 - */ - private UserStatus status; -} diff --git a/training-system/src/main/java/com/sino/training/module/system/mapper/CenterMapper.java b/training-system/src/main/java/com/sino/training/module/system/mapper/CenterMapper.java deleted file mode 100644 index 19f4704..0000000 --- a/training-system/src/main/java/com/sino/training/module/system/mapper/CenterMapper.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.sino.training.module.system.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.sino.training.module.system.entity.Center; -import org.apache.ibatis.annotations.Mapper; - -/** - * 中心 Mapper - * - * @author training-system - */ -@Mapper -public interface CenterMapper extends BaseMapper

{ -} diff --git a/training-system/src/main/java/com/sino/training/module/system/mapper/DepartmentMapper.java b/training-system/src/main/java/com/sino/training/module/system/mapper/DepartmentMapper.java deleted file mode 100644 index 8808023..0000000 --- a/training-system/src/main/java/com/sino/training/module/system/mapper/DepartmentMapper.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.sino.training.module.system.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.sino.training.module.system.entity.Department; -import org.apache.ibatis.annotations.Mapper; - -/** - * 部门 Mapper - * - * @author training-system - */ -@Mapper -public interface DepartmentMapper extends BaseMapper { -} diff --git a/training-system/src/main/java/com/sino/training/module/system/mapper/GroupMapper.java b/training-system/src/main/java/com/sino/training/module/system/mapper/GroupMapper.java deleted file mode 100644 index fce5aca..0000000 --- a/training-system/src/main/java/com/sino/training/module/system/mapper/GroupMapper.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.sino.training.module.system.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.sino.training.module.system.entity.Group; -import org.apache.ibatis.annotations.Mapper; - -/** - * 小组 Mapper - * - * @author training-system - */ -@Mapper -public interface GroupMapper extends BaseMapper { -} diff --git a/training-system/src/main/java/com/sino/training/module/system/mapper/UserMapper.java b/training-system/src/main/java/com/sino/training/module/system/mapper/UserMapper.java deleted file mode 100644 index 4d07024..0000000 --- a/training-system/src/main/java/com/sino/training/module/system/mapper/UserMapper.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.sino.training.module.system.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.sino.training.module.system.entity.User; -import org.apache.ibatis.annotations.Mapper; - -/** - * 用户 Mapper - * - * @author training-system - */ -@Mapper -public interface UserMapper extends BaseMapper { -} diff --git a/training-system/src/main/java/com/sino/training/module/system/service/CenterService.java b/training-system/src/main/java/com/sino/training/module/system/service/CenterService.java deleted file mode 100644 index cd4625d..0000000 --- a/training-system/src/main/java/com/sino/training/module/system/service/CenterService.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.sino.training.module.system.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.sino.training.module.system.dto.CenterDTO; -import com.sino.training.module.system.entity.Center; -import com.sino.training.module.system.vo.CenterVO; - -import java.util.List; - -/** - * 中心服务接口 - * - * @author training-system - */ -public interface CenterService extends IService
{ - - /** - * 获取中心列表 - * - * @return 中心列表 - */ - List listCenters(); - - /** - * 获取中心详情(包含下属部门) - * - * @param id 中心ID - * @return 中心详情 - */ - CenterVO getCenterDetail(Long id); - - /** - * 创建中心 - * - * @param dto 中心信息 - * @return 中心ID - */ - Long createCenter(CenterDTO dto); - - /** - * 更新中心 - * - * @param dto 中心信息 - */ - void updateCenter(CenterDTO dto); - - /** - * 删除中心 - * - * @param id 中心ID - */ - void deleteCenter(Long id); -} diff --git a/training-system/src/main/java/com/sino/training/module/system/service/DepartmentService.java b/training-system/src/main/java/com/sino/training/module/system/service/DepartmentService.java deleted file mode 100644 index 4e81fef..0000000 --- a/training-system/src/main/java/com/sino/training/module/system/service/DepartmentService.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.sino.training.module.system.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.sino.training.module.system.dto.DepartmentDTO; -import com.sino.training.module.system.entity.Department; -import com.sino.training.module.system.vo.DepartmentVO; - -import java.util.List; - -/** - * 部门服务接口 - * - * @author training-system - */ -public interface DepartmentService extends IService { - - /** - * 获取部门列表 - * - * @param centerId 中心ID(可选) - * @return 部门列表 - */ - List listDepartments(Long centerId); - - /** - * 获取部门详情(包含下属小组) - * - * @param id 部门ID - * @return 部门详情 - */ - DepartmentVO getDepartmentDetail(Long id); - - /** - * 创建部门 - * - * @param dto 部门信息 - * @return 部门ID - */ - Long createDepartment(DepartmentDTO dto); - - /** - * 更新部门 - * - * @param dto 部门信息 - */ - void updateDepartment(DepartmentDTO dto); - - /** - * 删除部门 - * - * @param id 部门ID - */ - void deleteDepartment(Long id); -} diff --git a/training-system/src/main/java/com/sino/training/module/system/service/GroupService.java b/training-system/src/main/java/com/sino/training/module/system/service/GroupService.java deleted file mode 100644 index 528c5cb..0000000 --- a/training-system/src/main/java/com/sino/training/module/system/service/GroupService.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.sino.training.module.system.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.sino.training.module.system.dto.GroupDTO; -import com.sino.training.module.system.entity.Group; -import com.sino.training.module.system.vo.GroupVO; - -import java.util.List; - -/** - * 小组服务接口 - * - * @author training-system - */ -public interface GroupService extends IService { - - /** - * 获取小组列表 - * - * @param departmentId 部门ID(可选) - * @return 小组列表 - */ - List listGroups(Long departmentId); - - /** - * 获取小组详情 - * - * @param id 小组ID - * @return 小组详情 - */ - GroupVO getGroupDetail(Long id); - - /** - * 创建小组 - * - * @param dto 小组信息 - * @return 小组ID - */ - Long createGroup(GroupDTO dto); - - /** - * 更新小组 - * - * @param dto 小组信息 - */ - void updateGroup(GroupDTO dto); - - /** - * 删除小组 - * - * @param id 小组ID - */ - void deleteGroup(Long id); -} diff --git a/training-system/src/main/java/com/sino/training/module/system/service/OrganizationService.java b/training-system/src/main/java/com/sino/training/module/system/service/OrganizationService.java deleted file mode 100644 index 7c34ebd..0000000 --- a/training-system/src/main/java/com/sino/training/module/system/service/OrganizationService.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.sino.training.module.system.service; - -import com.sino.training.module.system.vo.OrgTreeVO; - -import java.util.List; - -/** - * 组织架构服务接口 - * - * @author training-system - */ -public interface OrganizationService { - - /** - * 获取完整组织架构树 - * - * @return 组织架构树 - */ - List getOrgTree(); - - /** - * 获取指定中心下的组织架构树 - * - * @param centerId 中心ID - * @return 组织架构树 - */ - OrgTreeVO getOrgTreeByCenter(Long centerId); -} diff --git a/training-system/src/main/java/com/sino/training/module/system/service/UserService.java b/training-system/src/main/java/com/sino/training/module/system/service/UserService.java deleted file mode 100644 index 089adf3..0000000 --- a/training-system/src/main/java/com/sino/training/module/system/service/UserService.java +++ /dev/null @@ -1,111 +0,0 @@ -package com.sino.training.module.system.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.sino.training.common.result.PageResult; -import com.sino.training.module.system.dto.PasswordDTO; -import com.sino.training.module.system.dto.UserDTO; -import com.sino.training.module.system.dto.UserQueryDTO; -import com.sino.training.module.system.entity.User; -import com.sino.training.module.system.vo.UserVO; - -import java.util.List; - -/** - * 用户服务接口 - * - * @author training-system - */ -public interface UserService extends IService { - - /** - * 分页查询用户列表 - * - * @param queryDTO 查询条件 - * @return 用户分页数据 - */ - PageResult pageUsers(UserQueryDTO queryDTO); - - /** - * 获取用户详情 - * - * @param id 用户ID - * @return 用户详情 - */ - UserVO getUserDetail(Long id); - - /** - * 创建用户 - * - * @param dto 用户信息 - * @return 用户ID - */ - Long createUser(UserDTO dto); - - /** - * 更新用户 - * - * @param dto 用户信息 - */ - void updateUser(UserDTO dto); - - /** - * 删除用户 - * - * @param id 用户ID - */ - void deleteUser(Long id); - - /** - * 启用用户 - * - * @param id 用户ID - */ - void enableUser(Long id); - - /** - * 禁用用户 - * - * @param id 用户ID - */ - void disableUser(Long id); - - /** - * 重置密码 - * - * @param dto 密码信息 - */ - void resetPassword(PasswordDTO dto); - - /** - * 根据部门ID获取用户列表 - * - * @param departmentId 部门ID - * @return 用户列表 - */ - List listUsersByDepartment(Long departmentId); - - /** - * 根据小组ID获取用户列表 - * - * @param groupId 小组ID - * @return 用户列表 - */ - List listUsersByGroup(Long groupId); - - /** - * 根据角色获取用户列表 - * - * @param role 角色 - * @param departmentId 部门ID(可选) - * @return 用户列表 - */ - List listUsersByRole(String role, Long departmentId); - - /** - * 获取当前用户部门的用户列表 - * - * @param role 角色(可选) - * @return 用户列表 - */ - List listUsers(String role); -} diff --git a/training-system/src/main/java/com/sino/training/module/system/service/impl/CenterServiceImpl.java b/training-system/src/main/java/com/sino/training/module/system/service/impl/CenterServiceImpl.java deleted file mode 100644 index d79e0d5..0000000 --- a/training-system/src/main/java/com/sino/training/module/system/service/impl/CenterServiceImpl.java +++ /dev/null @@ -1,135 +0,0 @@ -package com.sino.training.module.system.service.impl; - -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.sino.training.common.exception.BusinessException; -import com.sino.training.common.result.ResultCode; -import com.sino.training.module.system.dto.CenterDTO; -import com.sino.training.module.system.entity.Center; -import com.sino.training.module.system.entity.Department; -import com.sino.training.module.system.mapper.CenterMapper; -import com.sino.training.module.system.mapper.DepartmentMapper; -import com.sino.training.module.system.service.CenterService; -import com.sino.training.module.system.service.DepartmentService; -import com.sino.training.module.system.vo.CenterVO; -import com.sino.training.module.system.vo.DepartmentVO; -import lombok.RequiredArgsConstructor; -import org.springframework.context.annotation.Lazy; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.ArrayList; -import java.util.List; - -/** - * 中心服务实现类 - * - * @author training-system - */ -@Service -@RequiredArgsConstructor -public class CenterServiceImpl extends ServiceImpl implements CenterService { - - private final DepartmentMapper departmentMapper; - @Lazy - private final DepartmentService departmentService; - - @Override - public List listCenters() { - LambdaQueryWrapper
queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.orderByAsc(Center::getSortOrder, Center::getId); - List
centers = list(queryWrapper); - - List voList = new ArrayList<>(); - for (Center center : centers) { - voList.add(convertToVO(center, false)); - } - return voList; - } - - @Override - public CenterVO getCenterDetail(Long id) { - Center center = getById(id); - if (center == null) { - throw new BusinessException(ResultCode.DATA_NOT_FOUND, "中心不存在"); - } - return convertToVO(center, true); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public Long createCenter(CenterDTO dto) { - // 检查名称是否重复 - LambdaQueryWrapper
queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(Center::getName, dto.getName()); - if (count(queryWrapper) > 0) { - throw new BusinessException(ResultCode.DATA_EXISTS, "中心名称已存在"); - } - - Center center = new Center(); - center.setName(dto.getName()); - center.setSortOrder(dto.getSortOrder() != null ? dto.getSortOrder() : 0); - save(center); - return center.getId(); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void updateCenter(CenterDTO dto) { - if (dto.getId() == null) { - throw new BusinessException(ResultCode.BAD_REQUEST, "中心ID不能为空"); - } - - Center center = getById(dto.getId()); - if (center == null) { - throw new BusinessException(ResultCode.DATA_NOT_FOUND, "中心不存在"); - } - - // 检查名称是否重复(排除自己) - LambdaQueryWrapper
queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(Center::getName, dto.getName()) - .ne(Center::getId, dto.getId()); - if (count(queryWrapper) > 0) { - throw new BusinessException(ResultCode.DATA_EXISTS, "中心名称已存在"); - } - - center.setName(dto.getName()); - if (dto.getSortOrder() != null) { - center.setSortOrder(dto.getSortOrder()); - } - updateById(center); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void deleteCenter(Long id) { - Center center = getById(id); - if (center == null) { - throw new BusinessException(ResultCode.DATA_NOT_FOUND, "中心不存在"); - } - - // 检查是否有下属部门 - LambdaQueryWrapper deptQuery = new LambdaQueryWrapper<>(); - deptQuery.eq(Department::getCenterId, id); - if (departmentMapper.selectCount(deptQuery) > 0) { - throw new BusinessException(ResultCode.DATA_REFERENCED, "该中心下存在部门,无法删除"); - } - - removeById(id); - } - - private CenterVO convertToVO(Center center, boolean includeChildren) { - CenterVO vo = new CenterVO(); - vo.setId(center.getId()); - vo.setName(center.getName()); - vo.setSortOrder(center.getSortOrder()); - vo.setCreateTime(center.getCreateTime()); - - if (includeChildren) { - List departments = departmentService.listDepartments(center.getId()); - vo.setDepartments(departments); - } - - return vo; - } -} diff --git a/training-system/src/main/java/com/sino/training/module/system/service/impl/DepartmentServiceImpl.java b/training-system/src/main/java/com/sino/training/module/system/service/impl/DepartmentServiceImpl.java deleted file mode 100644 index 84c6a4e..0000000 --- a/training-system/src/main/java/com/sino/training/module/system/service/impl/DepartmentServiceImpl.java +++ /dev/null @@ -1,188 +0,0 @@ -package com.sino.training.module.system.service.impl; - -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.sino.training.common.exception.BusinessException; -import com.sino.training.common.result.ResultCode; -import com.sino.training.module.system.dto.DepartmentDTO; -import com.sino.training.module.system.entity.Center; -import com.sino.training.module.system.entity.Department; -import com.sino.training.module.system.entity.Group; -import com.sino.training.module.system.entity.User; -import com.sino.training.module.system.mapper.CenterMapper; -import com.sino.training.module.system.mapper.DepartmentMapper; -import com.sino.training.module.system.mapper.GroupMapper; -import com.sino.training.module.system.mapper.UserMapper; -import com.sino.training.module.system.service.DepartmentService; -import com.sino.training.module.system.service.GroupService; -import com.sino.training.module.system.vo.DepartmentVO; -import com.sino.training.module.system.vo.GroupVO; -import lombok.RequiredArgsConstructor; -import org.springframework.context.annotation.Lazy; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.ArrayList; -import java.util.List; - -/** - * 部门服务实现类 - * - * @author training-system - */ -@Service -@RequiredArgsConstructor -public class DepartmentServiceImpl extends ServiceImpl implements DepartmentService { - - private final CenterMapper centerMapper; - private final GroupMapper groupMapper; - private final UserMapper userMapper; - @Lazy - private final GroupService groupService; - - @Override - public List listDepartments(Long centerId) { - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - if (centerId != null) { - queryWrapper.eq(Department::getCenterId, centerId); - } - queryWrapper.orderByAsc(Department::getSortOrder, Department::getId); - List departments = list(queryWrapper); - - List voList = new ArrayList<>(); - for (Department department : departments) { - voList.add(convertToVO(department, false)); - } - return voList; - } - - @Override - public DepartmentVO getDepartmentDetail(Long id) { - Department department = getById(id); - if (department == null) { - throw new BusinessException(ResultCode.DATA_NOT_FOUND, "部门不存在"); - } - return convertToVO(department, true); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public Long createDepartment(DepartmentDTO dto) { - // 检查中心是否存在 - Center center = centerMapper.selectById(dto.getCenterId()); - if (center == null) { - throw new BusinessException(ResultCode.DATA_NOT_FOUND, "所属中心不存在"); - } - - // 检查同一中心下名称是否重复 - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(Department::getCenterId, dto.getCenterId()) - .eq(Department::getName, dto.getName()); - if (count(queryWrapper) > 0) { - throw new BusinessException(ResultCode.DATA_EXISTS, "该中心下已存在同名部门"); - } - - // 检查部门数量限制(每个中心最多8个部门) - LambdaQueryWrapper countQuery = new LambdaQueryWrapper<>(); - countQuery.eq(Department::getCenterId, dto.getCenterId()); - if (count(countQuery) >= 8) { - throw new BusinessException(ResultCode.BAD_REQUEST, "每个中心最多只能创建8个部门"); - } - - Department department = new Department(); - department.setName(dto.getName()); - department.setCenterId(dto.getCenterId()); - department.setSortOrder(dto.getSortOrder() != null ? dto.getSortOrder() : 0); - save(department); - return department.getId(); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void updateDepartment(DepartmentDTO dto) { - if (dto.getId() == null) { - throw new BusinessException(ResultCode.BAD_REQUEST, "部门ID不能为空"); - } - - Department department = getById(dto.getId()); - if (department == null) { - throw new BusinessException(ResultCode.DATA_NOT_FOUND, "部门不存在"); - } - - // 检查中心是否存在 - if (dto.getCenterId() != null) { - Center center = centerMapper.selectById(dto.getCenterId()); - if (center == null) { - throw new BusinessException(ResultCode.DATA_NOT_FOUND, "所属中心不存在"); - } - } - - // 检查同一中心下名称是否重复(排除自己) - Long centerId = dto.getCenterId() != null ? dto.getCenterId() : department.getCenterId(); - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(Department::getCenterId, centerId) - .eq(Department::getName, dto.getName()) - .ne(Department::getId, dto.getId()); - if (count(queryWrapper) > 0) { - throw new BusinessException(ResultCode.DATA_EXISTS, "该中心下已存在同名部门"); - } - - department.setName(dto.getName()); - if (dto.getCenterId() != null) { - department.setCenterId(dto.getCenterId()); - } - if (dto.getSortOrder() != null) { - department.setSortOrder(dto.getSortOrder()); - } - updateById(department); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void deleteDepartment(Long id) { - Department department = getById(id); - if (department == null) { - throw new BusinessException(ResultCode.DATA_NOT_FOUND, "部门不存在"); - } - - // 检查是否有下属小组 - LambdaQueryWrapper groupQuery = new LambdaQueryWrapper<>(); - groupQuery.eq(Group::getDepartmentId, id); - if (groupMapper.selectCount(groupQuery) > 0) { - throw new BusinessException(ResultCode.DATA_REFERENCED, "该部门下存在小组,无法删除"); - } - - // 检查是否有员工 - LambdaQueryWrapper userQuery = new LambdaQueryWrapper<>(); - userQuery.eq(User::getDepartmentId, id); - if (userMapper.selectCount(userQuery) > 0) { - throw new BusinessException(ResultCode.DATA_REFERENCED, "该部门下存在员工,无法删除"); - } - - removeById(id); - } - - private DepartmentVO convertToVO(Department department, boolean includeChildren) { - DepartmentVO vo = new DepartmentVO(); - vo.setId(department.getId()); - vo.setName(department.getName()); - vo.setCenterId(department.getCenterId()); - vo.setSortOrder(department.getSortOrder()); - vo.setCreateTime(department.getCreateTime()); - - // 获取中心名称 - if (department.getCenterId() != null) { - Center center = centerMapper.selectById(department.getCenterId()); - if (center != null) { - vo.setCenterName(center.getName()); - } - } - - if (includeChildren) { - List groups = groupService.listGroups(department.getId()); - vo.setGroups(groups); - } - - return vo; - } -} diff --git a/training-system/src/main/java/com/sino/training/module/system/service/impl/GroupServiceImpl.java b/training-system/src/main/java/com/sino/training/module/system/service/impl/GroupServiceImpl.java deleted file mode 100644 index 6ab8b7d..0000000 --- a/training-system/src/main/java/com/sino/training/module/system/service/impl/GroupServiceImpl.java +++ /dev/null @@ -1,168 +0,0 @@ -package com.sino.training.module.system.service.impl; - -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.sino.training.common.exception.BusinessException; -import com.sino.training.common.result.ResultCode; -import com.sino.training.module.system.dto.GroupDTO; -import com.sino.training.module.system.entity.Department; -import com.sino.training.module.system.entity.Group; -import com.sino.training.module.system.entity.User; -import com.sino.training.module.system.mapper.DepartmentMapper; -import com.sino.training.module.system.mapper.GroupMapper; -import com.sino.training.module.system.mapper.UserMapper; -import com.sino.training.module.system.service.GroupService; -import com.sino.training.module.system.vo.GroupVO; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.ArrayList; -import java.util.List; - -/** - * 小组服务实现类 - * - * @author training-system - */ -@Service -@RequiredArgsConstructor -public class GroupServiceImpl extends ServiceImpl implements GroupService { - - private final DepartmentMapper departmentMapper; - private final UserMapper userMapper; - - @Override - public List listGroups(Long departmentId) { - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - if (departmentId != null) { - queryWrapper.eq(Group::getDepartmentId, departmentId); - } - queryWrapper.orderByAsc(Group::getSortOrder, Group::getId); - List groups = list(queryWrapper); - - List voList = new ArrayList<>(); - for (Group group : groups) { - voList.add(convertToVO(group)); - } - return voList; - } - - @Override - public GroupVO getGroupDetail(Long id) { - Group group = getById(id); - if (group == null) { - throw new BusinessException(ResultCode.DATA_NOT_FOUND, "小组不存在"); - } - return convertToVO(group); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public Long createGroup(GroupDTO dto) { - // 检查部门是否存在 - Department department = departmentMapper.selectById(dto.getDepartmentId()); - if (department == null) { - throw new BusinessException(ResultCode.DATA_NOT_FOUND, "所属部门不存在"); - } - - // 检查同一部门下名称是否重复 - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(Group::getDepartmentId, dto.getDepartmentId()) - .eq(Group::getName, dto.getName()); - if (count(queryWrapper) > 0) { - throw new BusinessException(ResultCode.DATA_EXISTS, "该部门下已存在同名小组"); - } - - // 检查小组数量限制(每个部门最多10个小组) - LambdaQueryWrapper countQuery = new LambdaQueryWrapper<>(); - countQuery.eq(Group::getDepartmentId, dto.getDepartmentId()); - if (count(countQuery) >= 10) { - throw new BusinessException(ResultCode.BAD_REQUEST, "每个部门最多只能创建10个小组"); - } - - Group group = new Group(); - group.setName(dto.getName()); - group.setDepartmentId(dto.getDepartmentId()); - group.setSortOrder(dto.getSortOrder() != null ? dto.getSortOrder() : 0); - save(group); - return group.getId(); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void updateGroup(GroupDTO dto) { - if (dto.getId() == null) { - throw new BusinessException(ResultCode.BAD_REQUEST, "小组ID不能为空"); - } - - Group group = getById(dto.getId()); - if (group == null) { - throw new BusinessException(ResultCode.DATA_NOT_FOUND, "小组不存在"); - } - - // 检查部门是否存在 - if (dto.getDepartmentId() != null) { - Department department = departmentMapper.selectById(dto.getDepartmentId()); - if (department == null) { - throw new BusinessException(ResultCode.DATA_NOT_FOUND, "所属部门不存在"); - } - } - - // 检查同一部门下名称是否重复(排除自己) - Long departmentId = dto.getDepartmentId() != null ? dto.getDepartmentId() : group.getDepartmentId(); - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(Group::getDepartmentId, departmentId) - .eq(Group::getName, dto.getName()) - .ne(Group::getId, dto.getId()); - if (count(queryWrapper) > 0) { - throw new BusinessException(ResultCode.DATA_EXISTS, "该部门下已存在同名小组"); - } - - group.setName(dto.getName()); - if (dto.getDepartmentId() != null) { - group.setDepartmentId(dto.getDepartmentId()); - } - if (dto.getSortOrder() != null) { - group.setSortOrder(dto.getSortOrder()); - } - updateById(group); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void deleteGroup(Long id) { - Group group = getById(id); - if (group == null) { - throw new BusinessException(ResultCode.DATA_NOT_FOUND, "小组不存在"); - } - - // 检查是否有员工 - LambdaQueryWrapper userQuery = new LambdaQueryWrapper<>(); - userQuery.eq(User::getGroupId, id); - if (userMapper.selectCount(userQuery) > 0) { - throw new BusinessException(ResultCode.DATA_REFERENCED, "该小组下存在员工,无法删除"); - } - - removeById(id); - } - - private GroupVO convertToVO(Group group) { - GroupVO vo = new GroupVO(); - vo.setId(group.getId()); - vo.setName(group.getName()); - vo.setDepartmentId(group.getDepartmentId()); - vo.setSortOrder(group.getSortOrder()); - vo.setCreateTime(group.getCreateTime()); - - // 获取部门名称 - if (group.getDepartmentId() != null) { - Department department = departmentMapper.selectById(group.getDepartmentId()); - if (department != null) { - vo.setDepartmentName(department.getName()); - } - } - - return vo; - } -} diff --git a/training-system/src/main/java/com/sino/training/module/system/service/impl/OrganizationServiceImpl.java b/training-system/src/main/java/com/sino/training/module/system/service/impl/OrganizationServiceImpl.java deleted file mode 100644 index 6300401..0000000 --- a/training-system/src/main/java/com/sino/training/module/system/service/impl/OrganizationServiceImpl.java +++ /dev/null @@ -1,112 +0,0 @@ -package com.sino.training.module.system.service.impl; - -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.sino.training.common.exception.BusinessException; -import com.sino.training.common.result.ResultCode; -import com.sino.training.module.system.entity.Center; -import com.sino.training.module.system.entity.Department; -import com.sino.training.module.system.entity.Group; -import com.sino.training.module.system.mapper.CenterMapper; -import com.sino.training.module.system.mapper.DepartmentMapper; -import com.sino.training.module.system.mapper.GroupMapper; -import com.sino.training.module.system.service.OrganizationService; -import com.sino.training.module.system.vo.OrgTreeVO; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.List; - -/** - * 组织架构服务实现类 - * - * @author training-system - */ -@Service -@RequiredArgsConstructor -public class OrganizationServiceImpl implements OrganizationService { - - private final CenterMapper centerMapper; - private final DepartmentMapper departmentMapper; - private final GroupMapper groupMapper; - - @Override - public List getOrgTree() { - List tree = new ArrayList<>(); - - // 获取所有中心 - LambdaQueryWrapper
centerQuery = new LambdaQueryWrapper<>(); - centerQuery.orderByAsc(Center::getSortOrder, Center::getId); - List
centers = centerMapper.selectList(centerQuery); - - for (Center center : centers) { - OrgTreeVO centerNode = buildCenterNode(center); - tree.add(centerNode); - } - - return tree; - } - - @Override - public OrgTreeVO getOrgTreeByCenter(Long centerId) { - Center center = centerMapper.selectById(centerId); - if (center == null) { - throw new BusinessException(ResultCode.DATA_NOT_FOUND, "中心不存在"); - } - return buildCenterNode(center); - } - - private OrgTreeVO buildCenterNode(Center center) { - OrgTreeVO centerNode = new OrgTreeVO(); - centerNode.setId(center.getId()); - centerNode.setName(center.getName()); - centerNode.setType("CENTER"); - centerNode.setParentId(null); - centerNode.setSortOrder(center.getSortOrder()); - - // 获取该中心下的所有部门 - LambdaQueryWrapper deptQuery = new LambdaQueryWrapper<>(); - deptQuery.eq(Department::getCenterId, center.getId()) - .orderByAsc(Department::getSortOrder, Department::getId); - List departments = departmentMapper.selectList(deptQuery); - - List deptNodes = new ArrayList<>(); - for (Department department : departments) { - OrgTreeVO deptNode = buildDepartmentNode(department, center.getId()); - deptNodes.add(deptNode); - } - centerNode.setChildren(deptNodes); - - return centerNode; - } - - private OrgTreeVO buildDepartmentNode(Department department, Long centerId) { - OrgTreeVO deptNode = new OrgTreeVO(); - deptNode.setId(department.getId()); - deptNode.setName(department.getName()); - deptNode.setType("DEPARTMENT"); - deptNode.setParentId(centerId); - deptNode.setSortOrder(department.getSortOrder()); - - // 获取该部门下的所有小组 - LambdaQueryWrapper groupQuery = new LambdaQueryWrapper<>(); - groupQuery.eq(Group::getDepartmentId, department.getId()) - .orderByAsc(Group::getSortOrder, Group::getId); - List groups = groupMapper.selectList(groupQuery); - - List groupNodes = new ArrayList<>(); - for (Group group : groups) { - OrgTreeVO groupNode = new OrgTreeVO(); - groupNode.setId(group.getId()); - groupNode.setName(group.getName()); - groupNode.setType("GROUP"); - groupNode.setParentId(department.getId()); - groupNode.setSortOrder(group.getSortOrder()); - groupNode.setChildren(new ArrayList<>()); - groupNodes.add(groupNode); - } - deptNode.setChildren(groupNodes); - - return deptNode; - } -} diff --git a/training-system/src/main/java/com/sino/training/module/system/service/impl/UserServiceImpl.java b/training-system/src/main/java/com/sino/training/module/system/service/impl/UserServiceImpl.java deleted file mode 100644 index 713edd1..0000000 --- a/training-system/src/main/java/com/sino/training/module/system/service/impl/UserServiceImpl.java +++ /dev/null @@ -1,449 +0,0 @@ -package com.sino.training.module.system.service.impl; - -import cn.hutool.core.util.StrUtil; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.sino.training.common.context.UserContext; -import com.sino.training.common.context.UserContextHolder; -import com.sino.training.common.enums.UserRole; -import com.sino.training.common.enums.UserStatus; -import com.sino.training.common.exception.BusinessException; -import com.sino.training.common.result.PageResult; -import com.sino.training.common.result.ResultCode; -import com.sino.training.module.system.dto.PasswordDTO; -import com.sino.training.module.system.dto.UserDTO; -import com.sino.training.module.system.dto.UserQueryDTO; -import com.sino.training.module.system.entity.Department; -import com.sino.training.module.system.entity.Group; -import com.sino.training.module.system.entity.User; -import com.sino.training.module.system.mapper.DepartmentMapper; -import com.sino.training.module.system.mapper.GroupMapper; -import com.sino.training.module.system.mapper.UserMapper; -import com.sino.training.module.system.service.UserService; -import com.sino.training.module.system.vo.UserVO; -import lombok.RequiredArgsConstructor; -import org.springframework.security.crypto.password.PasswordEncoder; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.ArrayList; -import java.util.List; - -/** - * 用户服务实现类 - * - * @author training-system - */ -@Service -@RequiredArgsConstructor -public class UserServiceImpl extends ServiceImpl implements UserService { - - private final DepartmentMapper departmentMapper; - private final GroupMapper groupMapper; - private final PasswordEncoder passwordEncoder; - - @Override - public PageResult pageUsers(UserQueryDTO queryDTO) { - Page page = queryDTO.toPage(); - - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - - // 部门数据隔离:讲师只能查看本部门数据 - applyDepartmentIsolation(queryWrapper); - - // 关键字搜索 - if (StrUtil.isNotBlank(queryDTO.getKeyword())) { - queryWrapper.and(w -> w - .like(User::getUsername, queryDTO.getKeyword()) - .or() - .like(User::getRealName, queryDTO.getKeyword()) - .or() - .like(User::getPhone, queryDTO.getKeyword()) - ); - } - - // 部门筛选 - if (queryDTO.getDepartmentId() != null) { - queryWrapper.eq(User::getDepartmentId, queryDTO.getDepartmentId()); - } - - // 小组筛选 - if (queryDTO.getGroupId() != null) { - queryWrapper.eq(User::getGroupId, queryDTO.getGroupId()); - } - - // 角色筛选 - if (StrUtil.isNotBlank(queryDTO.getRole())) { - queryWrapper.eq(User::getRole, UserRole.valueOf(queryDTO.getRole())); - } - - // 状态筛选 - if (StrUtil.isNotBlank(queryDTO.getStatus())) { - queryWrapper.eq(User::getStatus, UserStatus.valueOf(queryDTO.getStatus())); - } - - queryWrapper.orderByDesc(User::getCreateTime); - - Page result = page(page, queryWrapper); - - List voList = new ArrayList<>(); - for (User user : result.getRecords()) { - voList.add(convertToVO(user)); - } - - return PageResult.of(result, voList); - } - - @Override - public UserVO getUserDetail(Long id) { - User user = getById(id); - if (user == null) { - throw new BusinessException(ResultCode.USER_NOT_FOUND); - } - // 部门数据隔离:讲师只能查看本部门用户 - checkDepartmentAccess(user.getDepartmentId()); - return convertToVO(user); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public Long createUser(UserDTO dto) { - // 检查用户名是否已存在 - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(User::getUsername, dto.getUsername()); - if (count(queryWrapper) > 0) { - throw new BusinessException(ResultCode.USER_EXISTS); - } - - // 检查手机号是否已存在 - if (StrUtil.isNotBlank(dto.getPhone())) { - LambdaQueryWrapper phoneQuery = new LambdaQueryWrapper<>(); - phoneQuery.eq(User::getPhone, dto.getPhone()); - if (count(phoneQuery) > 0) { - throw new BusinessException(ResultCode.PHONE_EXISTS); - } - } - - // 检查部门是否存在 - Department department = departmentMapper.selectById(dto.getDepartmentId()); - if (department == null) { - throw new BusinessException(ResultCode.DATA_NOT_FOUND, "所属部门不存在"); - } - - // 检查小组是否存在(如果有) - if (dto.getGroupId() != null) { - Group group = groupMapper.selectById(dto.getGroupId()); - if (group == null) { - throw new BusinessException(ResultCode.DATA_NOT_FOUND, "所属小组不存在"); - } - // 检查小组是否属于该部门 - if (!group.getDepartmentId().equals(dto.getDepartmentId())) { - throw new BusinessException(ResultCode.BAD_REQUEST, "小组不属于该部门"); - } - } - - // 密码必填 - if (StrUtil.isBlank(dto.getPassword())) { - throw new BusinessException(ResultCode.BAD_REQUEST, "密码不能为空"); - } - - User user = new User(); - user.setUsername(dto.getUsername()); - user.setPassword(passwordEncoder.encode(dto.getPassword())); - user.setRealName(dto.getRealName()); - user.setPhone(dto.getPhone()); - user.setAvatar(dto.getAvatar()); - user.setRole(UserRole.valueOf(dto.getRole())); - user.setDepartmentId(dto.getDepartmentId()); - user.setGroupId(dto.getGroupId()); - user.setWxUserid(dto.getWxUserid()); - user.setStatus(UserStatus.ENABLED); - - save(user); - return user.getId(); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void updateUser(UserDTO dto) { - if (dto.getId() == null) { - throw new BusinessException(ResultCode.BAD_REQUEST, "用户ID不能为空"); - } - - User user = getById(dto.getId()); - if (user == null) { - throw new BusinessException(ResultCode.USER_NOT_FOUND); - } - - // 检查用户名是否重复(排除自己) - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(User::getUsername, dto.getUsername()) - .ne(User::getId, dto.getId()); - if (count(queryWrapper) > 0) { - throw new BusinessException(ResultCode.USER_EXISTS); - } - - // 检查手机号是否重复(排除自己) - if (StrUtil.isNotBlank(dto.getPhone())) { - LambdaQueryWrapper phoneQuery = new LambdaQueryWrapper<>(); - phoneQuery.eq(User::getPhone, dto.getPhone()) - .ne(User::getId, dto.getId()); - if (count(phoneQuery) > 0) { - throw new BusinessException(ResultCode.PHONE_EXISTS); - } - } - - // 检查部门是否存在 - Department department = departmentMapper.selectById(dto.getDepartmentId()); - if (department == null) { - throw new BusinessException(ResultCode.DATA_NOT_FOUND, "所属部门不存在"); - } - - // 检查小组是否存在(如果有) - if (dto.getGroupId() != null) { - Group group = groupMapper.selectById(dto.getGroupId()); - if (group == null) { - throw new BusinessException(ResultCode.DATA_NOT_FOUND, "所属小组不存在"); - } - if (!group.getDepartmentId().equals(dto.getDepartmentId())) { - throw new BusinessException(ResultCode.BAD_REQUEST, "小组不属于该部门"); - } - } - - user.setUsername(dto.getUsername()); - user.setRealName(dto.getRealName()); - user.setPhone(dto.getPhone()); - user.setAvatar(dto.getAvatar()); - user.setRole(UserRole.valueOf(dto.getRole())); - user.setDepartmentId(dto.getDepartmentId()); - user.setGroupId(dto.getGroupId()); - user.setWxUserid(dto.getWxUserid()); - - // 如果提供了状态,则更新状态 - if (StrUtil.isNotBlank(dto.getStatus())) { - user.setStatus(UserStatus.valueOf(dto.getStatus())); - } - - // 如果提供了新密码,则更新密码 - if (StrUtil.isNotBlank(dto.getPassword())) { - user.setPassword(passwordEncoder.encode(dto.getPassword())); - } - - updateById(user); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void deleteUser(Long id) { - User user = getById(id); - if (user == null) { - throw new BusinessException(ResultCode.USER_NOT_FOUND); - } - removeById(id); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void enableUser(Long id) { - User user = getById(id); - if (user == null) { - throw new BusinessException(ResultCode.USER_NOT_FOUND); - } - user.setStatus(UserStatus.ENABLED); - updateById(user); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void disableUser(Long id) { - User user = getById(id); - if (user == null) { - throw new BusinessException(ResultCode.USER_NOT_FOUND); - } - user.setStatus(UserStatus.DISABLED); - updateById(user); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void resetPassword(PasswordDTO dto) { - User user = getById(dto.getUserId()); - if (user == null) { - throw new BusinessException(ResultCode.USER_NOT_FOUND); - } - user.setPassword(passwordEncoder.encode(dto.getNewPassword())); - updateById(user); - } - - @Override - public List listUsersByDepartment(Long departmentId) { - // 部门数据隔离:讲师只能查询本部门 - checkDepartmentAccess(departmentId); - - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(User::getDepartmentId, departmentId) - .eq(User::getStatus, UserStatus.ENABLED) - .orderByAsc(User::getRealName); - List users = list(queryWrapper); - - List voList = new ArrayList<>(); - for (User user : users) { - voList.add(convertToVO(user)); - } - return voList; - } - - @Override - public List listUsersByGroup(Long groupId) { - // 部门数据隔离:讲师只能查询本部门的小组 - Group group = groupMapper.selectById(groupId); - if (group != null) { - checkDepartmentAccess(group.getDepartmentId()); - } - - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(User::getGroupId, groupId) - .eq(User::getStatus, UserStatus.ENABLED) - .orderByAsc(User::getRealName); - List users = list(queryWrapper); - - List voList = new ArrayList<>(); - for (User user : users) { - voList.add(convertToVO(user)); - } - return voList; - } - - @Override - public List listUsersByRole(String role, Long departmentId) { - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(User::getRole, UserRole.valueOf(role)) - .eq(User::getStatus, UserStatus.ENABLED); - - // 部门数据隔离:讲师强制限定为本部门 - UserContext currentUser = UserContextHolder.getContext(); - if (currentUser != null && UserRole.LECTURER.name().equals(currentUser.getRole())) { - // 讲师只能查询本部门数据,忽略传入的 departmentId 参数 - if (currentUser.getDepartmentId() != null) { - queryWrapper.eq(User::getDepartmentId, currentUser.getDepartmentId()); - } - } else if (departmentId != null) { - // 管理员可以按传入的部门筛选 - queryWrapper.eq(User::getDepartmentId, departmentId); - } - - queryWrapper.orderByAsc(User::getRealName); - List users = list(queryWrapper); - - List voList = new ArrayList<>(); - for (User user : users) { - voList.add(convertToVO(user)); - } - return voList; - } - - @Override - public List listUsers(String role) { - UserContext userContext = UserContextHolder.getContext(); - Long departmentId = userContext.getDepartmentId(); - - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(User::getDepartmentId, departmentId) - .eq(User::getStatus, UserStatus.ENABLED); - - if (StrUtil.isNotBlank(role)) { - queryWrapper.eq(User::getRole, UserRole.valueOf(role)); - } - - queryWrapper.orderByAsc(User::getRealName); - List users = list(queryWrapper); - - List voList = new ArrayList<>(); - for (User user : users) { - voList.add(convertToVO(user)); - } - return voList; - } - - private UserVO convertToVO(User user) { - UserVO vo = new UserVO(); - vo.setId(user.getId()); - vo.setUsername(user.getUsername()); - vo.setRealName(user.getRealName()); - vo.setPhone(user.getPhone()); - vo.setAvatar(user.getAvatar()); - vo.setRole(user.getRole().name()); - vo.setRoleName(getRoleName(user.getRole())); - vo.setDepartmentId(user.getDepartmentId()); - vo.setGroupId(user.getGroupId()); - vo.setWxUserid(user.getWxUserid()); - vo.setStatus(user.getStatus().name()); - vo.setStatusName(getStatusName(user.getStatus())); - vo.setCreateTime(user.getCreateTime()); - - // 获取部门名称 - if (user.getDepartmentId() != null) { - Department department = departmentMapper.selectById(user.getDepartmentId()); - if (department != null) { - vo.setDepartmentName(department.getName()); - } - } - - // 获取小组名称 - if (user.getGroupId() != null) { - Group group = groupMapper.selectById(user.getGroupId()); - if (group != null) { - vo.setGroupName(group.getName()); - } - } - - return vo; - } - - private String getRoleName(UserRole role) { - return switch (role) { - case ADMIN -> "管理员"; - case LECTURER -> "讲师"; - case STUDENT -> "学员"; - }; - } - - private String getStatusName(UserStatus status) { - return switch (status) { - case ENABLED -> "启用"; - case DISABLED -> "禁用"; - }; - } - - /** - * 应用部门数据隔离条件 - * 讲师只能查看本部门数据,管理员可查看所有数据 - * - * @param queryWrapper 查询条件 - */ - private void applyDepartmentIsolation(LambdaQueryWrapper queryWrapper) { - UserContext currentUser = UserContextHolder.getContext(); - if (currentUser != null && UserRole.LECTURER.name().equals(currentUser.getRole())) { - // 讲师只能查看本部门数据 - if (currentUser.getDepartmentId() != null) { - queryWrapper.eq(User::getDepartmentId, currentUser.getDepartmentId()); - } - } - // ADMIN 不加部门限制,可查看所有数据 - } - - /** - * 校验当前用户是否有权限访问指定部门的数据 - * - * @param departmentId 目标部门ID - */ - private void checkDepartmentAccess(Long departmentId) { - UserContext currentUser = UserContextHolder.getContext(); - if (currentUser != null && UserRole.LECTURER.name().equals(currentUser.getRole())) { - if (currentUser.getDepartmentId() != null && !currentUser.getDepartmentId().equals(departmentId)) { - throw new BusinessException(ResultCode.FORBIDDEN); - } - } - } -} diff --git a/training-system/src/main/java/com/sino/training/module/system/vo/CenterVO.java b/training-system/src/main/java/com/sino/training/module/system/vo/CenterVO.java deleted file mode 100644 index e237bcd..0000000 --- a/training-system/src/main/java/com/sino/training/module/system/vo/CenterVO.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.sino.training.module.system.vo; - -import lombok.Data; - -import java.io.Serializable; -import java.time.LocalDateTime; -import java.util.List; - -/** - * 中心VO - * - * @author training-system - */ -@Data -public class CenterVO implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * 中心ID - */ - private Long id; - - /** - * 中心名称 - */ - private String name; - - /** - * 排序 - */ - private Integer sortOrder; - - /** - * 创建时间 - */ - private LocalDateTime createTime; - - /** - * 下属部门列表 - */ - private List departments; -} diff --git a/training-system/src/main/java/com/sino/training/module/system/vo/DepartmentVO.java b/training-system/src/main/java/com/sino/training/module/system/vo/DepartmentVO.java deleted file mode 100644 index 74410ff..0000000 --- a/training-system/src/main/java/com/sino/training/module/system/vo/DepartmentVO.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.sino.training.module.system.vo; - -import lombok.Data; - -import java.io.Serializable; -import java.time.LocalDateTime; -import java.util.List; - -/** - * 部门VO - * - * @author training-system - */ -@Data -public class DepartmentVO implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * 部门ID - */ - private Long id; - - /** - * 部门名称 - */ - private String name; - - /** - * 所属中心ID - */ - private Long centerId; - - /** - * 所属中心名称 - */ - private String centerName; - - /** - * 排序 - */ - private Integer sortOrder; - - /** - * 创建时间 - */ - private LocalDateTime createTime; - - /** - * 下属小组列表 - */ - private List groups; -} diff --git a/training-system/src/main/java/com/sino/training/module/system/vo/GroupVO.java b/training-system/src/main/java/com/sino/training/module/system/vo/GroupVO.java deleted file mode 100644 index de150a2..0000000 --- a/training-system/src/main/java/com/sino/training/module/system/vo/GroupVO.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.sino.training.module.system.vo; - -import lombok.Data; - -import java.io.Serializable; -import java.time.LocalDateTime; - -/** - * 小组VO - * - * @author training-system - */ -@Data -public class GroupVO implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * 小组ID - */ - private Long id; - - /** - * 小组名称 - */ - private String name; - - /** - * 所属部门ID - */ - private Long departmentId; - - /** - * 所属部门名称 - */ - private String departmentName; - - /** - * 排序 - */ - private Integer sortOrder; - - /** - * 创建时间 - */ - private LocalDateTime createTime; -} diff --git a/training-system/src/main/java/com/sino/training/module/system/vo/OrgTreeVO.java b/training-system/src/main/java/com/sino/training/module/system/vo/OrgTreeVO.java deleted file mode 100644 index f505fbe..0000000 --- a/training-system/src/main/java/com/sino/training/module/system/vo/OrgTreeVO.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.sino.training.module.system.vo; - -import lombok.Data; - -import java.io.Serializable; -import java.util.List; - -/** - * 组织架构树VO - * - * @author training-system - */ -@Data -public class OrgTreeVO implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * 节点ID - */ - private Long id; - - /** - * 节点名称 - */ - private String name; - - /** - * 节点类型:CENTER/DEPARTMENT/GROUP - */ - private String type; - - /** - * 父节点ID - */ - private Long parentId; - - /** - * 排序 - */ - private Integer sortOrder; - - /** - * 子节点 - */ - private List children; -} diff --git a/training-system/src/main/java/com/sino/training/module/system/vo/UserVO.java b/training-system/src/main/java/com/sino/training/module/system/vo/UserVO.java deleted file mode 100644 index 815fa33..0000000 --- a/training-system/src/main/java/com/sino/training/module/system/vo/UserVO.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.sino.training.module.system.vo; - -import lombok.Data; - -import java.io.Serializable; -import java.time.LocalDateTime; - -/** - * 用户VO - * - * @author training-system - */ -@Data -public class UserVO implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * 用户ID - */ - private Long id; - - /** - * 用户名 - */ - private String username; - - /** - * 真实姓名 - */ - private String realName; - - /** - * 手机号 - */ - private String phone; - - /** - * 头像URL - */ - private String avatar; - - /** - * 用户角色 - */ - private String role; - - /** - * 用户角色名称 - */ - private String roleName; - - /** - * 所属部门ID - */ - private Long departmentId; - - /** - * 所属部门名称 - */ - private String departmentName; - - /** - * 所属小组ID - */ - private Long groupId; - - /** - * 所属小组名称 - */ - private String groupName; - - /** - * 企业微信用户ID - */ - private String wxUserid; - - /** - * 用户状态 - */ - private String status; - - /** - * 用户状态名称 - */ - private String statusName; - - /** - * 创建时间 - */ - private LocalDateTime createTime; -} diff --git a/training-system/src/main/java/com/sino/training/module/training/controller/TrainingPlanController.java b/training-system/src/main/java/com/sino/training/module/training/controller/TrainingPlanController.java deleted file mode 100644 index 1a335bb..0000000 --- a/training-system/src/main/java/com/sino/training/module/training/controller/TrainingPlanController.java +++ /dev/null @@ -1,108 +0,0 @@ -package com.sino.training.module.training.controller; - -import com.sino.training.common.context.UserContextHolder; -import com.sino.training.common.result.PageResult; -import com.sino.training.common.result.Result; -import com.sino.training.module.training.dto.TrainingPlanDTO; -import com.sino.training.module.training.dto.TrainingPlanQueryDTO; -import com.sino.training.module.training.service.PlanProgressService; -import com.sino.training.module.training.service.TrainingPlanService; -import com.sino.training.module.training.vo.MyPlanVO; -import com.sino.training.module.training.vo.TrainingPlanVO; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import jakarta.validation.Valid; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -/** - * 培训计划控制器 - * - * @author training-system - */ -@Tag(name = "培训计划管理", description = "培训计划CRUD和学员学习接口") -@RestController -@RequestMapping("/api/training/plan") -@RequiredArgsConstructor -public class TrainingPlanController { - - private final TrainingPlanService trainingPlanService; - private final PlanProgressService planProgressService; - - @Operation(summary = "分页查询培训计划") - @GetMapping("/page") - public Result> page(TrainingPlanQueryDTO queryDTO) { - return Result.success(trainingPlanService.pagePlans(queryDTO)); - } - - @Operation(summary = "获取培训计划详情") - @GetMapping("/{id}") - public Result detail(@PathVariable Long id) { - return Result.success(trainingPlanService.getPlanDetail(id)); - } - - @Operation(summary = "创建培训计划") - @PostMapping - public Result create(@Valid @RequestBody TrainingPlanDTO dto) { - return Result.success(trainingPlanService.createPlan(dto)); - } - - @Operation(summary = "更新培训计划") - @PutMapping - public Result update(@Valid @RequestBody TrainingPlanDTO dto) { - trainingPlanService.updatePlan(dto); - return Result.success(); - } - - @Operation(summary = "删除培训计划") - @DeleteMapping("/{id}") - public Result delete(@PathVariable Long id) { - trainingPlanService.deletePlan(id); - return Result.success(); - } - - @Operation(summary = "发布培训计划") - @PostMapping("/{id}/publish") - public Result publish(@PathVariable Long id) { - trainingPlanService.publishPlan(id); - return Result.success(); - } - - @Operation(summary = "结束培训计划") - @PostMapping("/{id}/end") - public Result end(@PathVariable Long id) { - trainingPlanService.endPlan(id); - return Result.success(); - } - - @Operation(summary = "获取我的培训计划列表(学员)") - @GetMapping("/my") - public Result> myPlans() { - Long userId = UserContextHolder.getContext().getUserId(); - return Result.success(trainingPlanService.listMyPlans(userId)); - } - - @Operation(summary = "获取我的培训计划详情(学员)") - @GetMapping("/my/{planId}") - public Result myPlanDetail(@PathVariable Long planId) { - Long userId = UserContextHolder.getContext().getUserId(); - return Result.success(trainingPlanService.getMyPlanDetail(planId, userId)); - } - - @Operation(summary = "标记知识学习完成(学员)") - @PostMapping("/my/{planId}/knowledge/{knowledgeId}/complete") - public Result completeKnowledge(@PathVariable Long planId, @PathVariable Long knowledgeId) { - Long userId = UserContextHolder.getContext().getUserId(); - planProgressService.completeKnowledge(planId, knowledgeId, userId); - return Result.success(); - } - - @Operation(summary = "获取学习进度百分比(学员)") - @GetMapping("/my/{planId}/progress") - public Result getProgress(@PathVariable Long planId) { - Long userId = UserContextHolder.getContext().getUserId(); - return Result.success(planProgressService.getProgressPercent(planId, userId)); - } -} diff --git a/training-system/src/main/java/com/sino/training/module/training/dto/TrainingPlanDTO.java b/training-system/src/main/java/com/sino/training/module/training/dto/TrainingPlanDTO.java deleted file mode 100644 index 3ec4226..0000000 --- a/training-system/src/main/java/com/sino/training/module/training/dto/TrainingPlanDTO.java +++ /dev/null @@ -1,74 +0,0 @@ -package com.sino.training.module.training.dto; - -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotNull; -import lombok.Data; - -import java.io.Serializable; -import java.time.LocalDate; -import java.util.List; - -/** - * 培训计划DTO - * - * @author training-system - */ -@Data -public class TrainingPlanDTO implements Serializable { - - private static final long serialVersionUID = 1L; - - private Long id; - - @NotBlank(message = "计划标题不能为空") - private String title; - - private String description; - - @NotNull(message = "开始日期不能为空") - private LocalDate startDate; - - @NotNull(message = "结束日期不能为空") - private LocalDate endDate; - - /** - * 所属部门ID - * 管理员必传,讲师可不传(自动使用当前用户部门) - */ - private Long departmentId; - - /** - * 关联知识列表 - */ - private List knowledgeList; - - /** - * 关联考试列表 - */ - private List examList; - - /** - * 培训对象列表 - */ - private List targets; - - @Data - public static class PlanKnowledgeDTO implements Serializable { - private Long knowledgeId; - private Boolean required; - private Integer sortOrder; - } - - @Data - public static class PlanExamDTO implements Serializable { - private Long examId; - private Boolean required; - private Integer sortOrder; - } - - @Data - public static class PlanTargetDTO implements Serializable { - private String targetType; - private Long targetId; - } -} diff --git a/training-system/src/main/java/com/sino/training/module/training/dto/TrainingPlanQueryDTO.java b/training-system/src/main/java/com/sino/training/module/training/dto/TrainingPlanQueryDTO.java deleted file mode 100644 index 59e8ff1..0000000 --- a/training-system/src/main/java/com/sino/training/module/training/dto/TrainingPlanQueryDTO.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.sino.training.module.training.dto; - -import com.sino.training.common.base.PageQuery; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * 培训计划查询DTO - * - * @author training-system - */ -@Data -@EqualsAndHashCode(callSuper = true) -public class TrainingPlanQueryDTO extends PageQuery { - - private String keyword; - private Long departmentId; - private String status; -} diff --git a/training-system/src/main/java/com/sino/training/module/training/entity/PlanExam.java b/training-system/src/main/java/com/sino/training/module/training/entity/PlanExam.java deleted file mode 100644 index 0b0a3d1..0000000 --- a/training-system/src/main/java/com/sino/training/module/training/entity/PlanExam.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.sino.training.module.training.entity; - -import com.baomidou.mybatisplus.annotation.TableName; -import com.sino.training.common.base.BaseEntity; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * 培训计划-考试关联实体 - * - * @author training-system - */ -@Data -@EqualsAndHashCode(callSuper = true) -@TableName("tr_plan_exam") -public class PlanExam extends BaseEntity { - - /** - * 计划ID - */ - private Long planId; - - /** - * 考试ID - */ - private Long examId; - - /** - * 是否必考 - */ - private Boolean required; - - /** - * 排序 - */ - private Integer sortOrder; -} diff --git a/training-system/src/main/java/com/sino/training/module/training/entity/PlanKnowledge.java b/training-system/src/main/java/com/sino/training/module/training/entity/PlanKnowledge.java deleted file mode 100644 index acbedb1..0000000 --- a/training-system/src/main/java/com/sino/training/module/training/entity/PlanKnowledge.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.sino.training.module.training.entity; - -import com.baomidou.mybatisplus.annotation.TableName; -import com.sino.training.common.base.BaseEntity; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * 培训计划-知识关联实体 - * - * @author training-system - */ -@Data -@EqualsAndHashCode(callSuper = true) -@TableName("tr_plan_knowledge") -public class PlanKnowledge extends BaseEntity { - - /** - * 计划ID - */ - private Long planId; - - /** - * 知识ID - */ - private Long knowledgeId; - - /** - * 是否必修 - */ - private Boolean required; - - /** - * 排序 - */ - private Integer sortOrder; -} diff --git a/training-system/src/main/java/com/sino/training/module/training/entity/PlanProgress.java b/training-system/src/main/java/com/sino/training/module/training/entity/PlanProgress.java deleted file mode 100644 index 84ad77a..0000000 --- a/training-system/src/main/java/com/sino/training/module/training/entity/PlanProgress.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.sino.training.module.training.entity; - -import com.baomidou.mybatisplus.annotation.TableName; -import com.sino.training.common.base.BaseEntity; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.time.LocalDateTime; - -/** - * 培训进度实体 - * - * @author training-system - */ -@Data -@EqualsAndHashCode(callSuper = true) -@TableName("tr_plan_progress") -public class PlanProgress extends BaseEntity { - - /** - * 计划ID - */ - private Long planId; - - /** - * 用户ID - */ - private Long userId; - - /** - * 知识ID - */ - private Long knowledgeId; - - /** - * 是否完成 - */ - private Boolean completed; - - /** - * 完成时间 - */ - private LocalDateTime completeTime; -} diff --git a/training-system/src/main/java/com/sino/training/module/training/entity/PlanTarget.java b/training-system/src/main/java/com/sino/training/module/training/entity/PlanTarget.java deleted file mode 100644 index 8d061c5..0000000 --- a/training-system/src/main/java/com/sino/training/module/training/entity/PlanTarget.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.sino.training.module.training.entity; - -import com.baomidou.mybatisplus.annotation.TableName; -import com.sino.training.common.base.BaseEntity; -import com.sino.training.common.enums.TargetType; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * 培训计划-对象关联实体 - * - * @author training-system - */ -@Data -@EqualsAndHashCode(callSuper = true) -@TableName("tr_plan_target") -public class PlanTarget extends BaseEntity { - - /** - * 计划ID - */ - private Long planId; - - /** - * 目标类型 - */ - private TargetType targetType; - - /** - * 目标ID(部门ID/小组ID/用户ID) - */ - private Long targetId; -} diff --git a/training-system/src/main/java/com/sino/training/module/training/entity/TrainingPlan.java b/training-system/src/main/java/com/sino/training/module/training/entity/TrainingPlan.java deleted file mode 100644 index 985fdaf..0000000 --- a/training-system/src/main/java/com/sino/training/module/training/entity/TrainingPlan.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.sino.training.module.training.entity; - -import com.baomidou.mybatisplus.annotation.TableName; -import com.sino.training.common.base.BaseEntity; -import com.sino.training.common.enums.PlanStatus; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.time.LocalDate; - -/** - * 培训计划实体 - * - * @author training-system - */ -@Data -@EqualsAndHashCode(callSuper = true) -@TableName("tr_plan") -public class TrainingPlan extends BaseEntity { - - /** - * 计划标题 - */ - private String title; - - /** - * 计划描述 - */ - private String description; - - /** - * 开始日期 - */ - private LocalDate startDate; - - /** - * 结束日期 - */ - private LocalDate endDate; - - /** - * 所属部门ID - */ - private Long departmentId; - - /** - * 计划状态 - */ - private PlanStatus status; - - /** - * 创建人ID - */ - private Long creatorId; -} diff --git a/training-system/src/main/java/com/sino/training/module/training/mapper/PlanExamMapper.java b/training-system/src/main/java/com/sino/training/module/training/mapper/PlanExamMapper.java deleted file mode 100644 index 3e428ed..0000000 --- a/training-system/src/main/java/com/sino/training/module/training/mapper/PlanExamMapper.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.sino.training.module.training.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.sino.training.module.training.entity.PlanExam; -import org.apache.ibatis.annotations.Mapper; - -/** - * 培训计划-考试关联 Mapper - * - * @author training-system - */ -@Mapper -public interface PlanExamMapper extends BaseMapper { -} diff --git a/training-system/src/main/java/com/sino/training/module/training/mapper/PlanKnowledgeMapper.java b/training-system/src/main/java/com/sino/training/module/training/mapper/PlanKnowledgeMapper.java deleted file mode 100644 index cb12018..0000000 --- a/training-system/src/main/java/com/sino/training/module/training/mapper/PlanKnowledgeMapper.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.sino.training.module.training.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.sino.training.module.training.entity.PlanKnowledge; -import org.apache.ibatis.annotations.Mapper; - -/** - * 培训计划-知识关联 Mapper - * - * @author training-system - */ -@Mapper -public interface PlanKnowledgeMapper extends BaseMapper { -} diff --git a/training-system/src/main/java/com/sino/training/module/training/mapper/PlanProgressMapper.java b/training-system/src/main/java/com/sino/training/module/training/mapper/PlanProgressMapper.java deleted file mode 100644 index c8f1502..0000000 --- a/training-system/src/main/java/com/sino/training/module/training/mapper/PlanProgressMapper.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.sino.training.module.training.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.sino.training.module.training.entity.PlanProgress; -import org.apache.ibatis.annotations.Mapper; - -/** - * 培训进度 Mapper - * - * @author training-system - */ -@Mapper -public interface PlanProgressMapper extends BaseMapper { -} diff --git a/training-system/src/main/java/com/sino/training/module/training/mapper/PlanTargetMapper.java b/training-system/src/main/java/com/sino/training/module/training/mapper/PlanTargetMapper.java deleted file mode 100644 index 666eb53..0000000 --- a/training-system/src/main/java/com/sino/training/module/training/mapper/PlanTargetMapper.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.sino.training.module.training.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.sino.training.module.training.entity.PlanTarget; -import org.apache.ibatis.annotations.Mapper; - -/** - * 培训计划-对象关联 Mapper - * - * @author training-system - */ -@Mapper -public interface PlanTargetMapper extends BaseMapper { -} diff --git a/training-system/src/main/java/com/sino/training/module/training/mapper/TrainingPlanMapper.java b/training-system/src/main/java/com/sino/training/module/training/mapper/TrainingPlanMapper.java deleted file mode 100644 index d5dc56a..0000000 --- a/training-system/src/main/java/com/sino/training/module/training/mapper/TrainingPlanMapper.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.sino.training.module.training.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.sino.training.module.training.entity.TrainingPlan; -import org.apache.ibatis.annotations.Mapper; - -/** - * 培训计划 Mapper - * - * @author training-system - */ -@Mapper -public interface TrainingPlanMapper extends BaseMapper { -} diff --git a/training-system/src/main/java/com/sino/training/module/training/service/PlanProgressService.java b/training-system/src/main/java/com/sino/training/module/training/service/PlanProgressService.java deleted file mode 100644 index 1ead1a6..0000000 --- a/training-system/src/main/java/com/sino/training/module/training/service/PlanProgressService.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.sino.training.module.training.service; - -import com.sino.training.module.training.vo.MyPlanVO; - -/** - * 学习进度服务接口 - * - * @author training-system - */ -public interface PlanProgressService { - - /** - * 记录知识学习完成 - * - * @param planId 培训计划ID - * @param knowledgeId 知识ID - * @param userId 用户ID - */ - void completeKnowledge(Long planId, Long knowledgeId, Long userId); - - /** - * 获取用户在某计划的学习进度 - * - * @param planId 培训计划ID - * @param userId 用户ID - * @return 进度百分比 - */ - Integer getProgressPercent(Long planId, Long userId); - - /** - * 判断用户是否已学习某知识 - * - * @param planId 培训计划ID - * @param knowledgeId 知识ID - * @param userId 用户ID - * @return 是否已学习 - */ - boolean hasLearned(Long planId, Long knowledgeId, Long userId); - - /** - * 获取用户已学习的知识数量 - * - * @param planId 培训计划ID - * @param userId 用户ID - * @return 已学习数量 - */ - Integer getLearnedCount(Long planId, Long userId); -} diff --git a/training-system/src/main/java/com/sino/training/module/training/service/TrainingPlanService.java b/training-system/src/main/java/com/sino/training/module/training/service/TrainingPlanService.java deleted file mode 100644 index 347f6d1..0000000 --- a/training-system/src/main/java/com/sino/training/module/training/service/TrainingPlanService.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.sino.training.module.training.service; - -import com.sino.training.common.result.PageResult; -import com.sino.training.module.training.dto.TrainingPlanDTO; -import com.sino.training.module.training.dto.TrainingPlanQueryDTO; -import com.sino.training.module.training.vo.MyPlanVO; -import com.sino.training.module.training.vo.TrainingPlanVO; - -import java.util.List; - -/** - * 培训计划服务接口 - * - * @author training-system - */ -public interface TrainingPlanService { - - /** - * 分页查询培训计划 - */ - PageResult pagePlans(TrainingPlanQueryDTO queryDTO); - - /** - * 获取培训计划详情 - */ - TrainingPlanVO getPlanDetail(Long id); - - /** - * 创建培训计划 - */ - Long createPlan(TrainingPlanDTO dto); - - /** - * 更新培训计划 - */ - void updatePlan(TrainingPlanDTO dto); - - /** - * 删除培训计划 - */ - void deletePlan(Long id); - - /** - * 发布培训计划 - */ - void publishPlan(Long id); - - /** - * 结束培训计划 - */ - void endPlan(Long id); - - /** - * 获取我的培训计划列表(学员) - */ - List listMyPlans(Long userId); - - /** - * 获取我的培训计划详情(学员) - */ - MyPlanVO getMyPlanDetail(Long planId, Long userId); -} diff --git a/training-system/src/main/java/com/sino/training/module/training/service/impl/PlanProgressServiceImpl.java b/training-system/src/main/java/com/sino/training/module/training/service/impl/PlanProgressServiceImpl.java deleted file mode 100644 index 4f741b7..0000000 --- a/training-system/src/main/java/com/sino/training/module/training/service/impl/PlanProgressServiceImpl.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.sino.training.module.training.service.impl; - -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.sino.training.module.training.entity.PlanKnowledge; -import com.sino.training.module.training.entity.PlanProgress; -import com.sino.training.module.training.mapper.PlanKnowledgeMapper; -import com.sino.training.module.training.mapper.PlanProgressMapper; -import com.sino.training.module.training.service.PlanProgressService; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.time.LocalDateTime; - -/** - * 学习进度服务实现类 - * - * @author training-system - */ -@Service -@RequiredArgsConstructor -public class PlanProgressServiceImpl implements PlanProgressService { - - private final PlanProgressMapper planProgressMapper; - private final PlanKnowledgeMapper planKnowledgeMapper; - - @Override - @Transactional(rollbackFor = Exception.class) - public void completeKnowledge(Long planId, Long knowledgeId, Long userId) { - // 检查是否已存在进度记录 - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(PlanProgress::getPlanId, planId) - .eq(PlanProgress::getKnowledgeId, knowledgeId) - .eq(PlanProgress::getUserId, userId); - - PlanProgress progress = planProgressMapper.selectOne(wrapper); - - if (progress == null) { - // 创建新的进度记录 - progress = new PlanProgress(); - progress.setPlanId(planId); - progress.setKnowledgeId(knowledgeId); - progress.setUserId(userId); - progress.setCompleted(true); - progress.setCompleteTime(LocalDateTime.now()); - planProgressMapper.insert(progress); - } else if (!progress.getCompleted()) { - // 更新为已完成 - progress.setCompleted(true); - progress.setCompleteTime(LocalDateTime.now()); - planProgressMapper.updateById(progress); - } - } - - @Override - public Integer getProgressPercent(Long planId, Long userId) { - // 获取计划总知识数量 - Long totalCount = planKnowledgeMapper.selectCount( - new LambdaQueryWrapper() - .eq(PlanKnowledge::getPlanId, planId) - ); - - if (totalCount == null || totalCount == 0) { - return 0; - } - - // 获取已学习数量 - Integer learnedCount = getLearnedCount(planId, userId); - - return (int) Math.round(learnedCount * 100.0 / totalCount); - } - - @Override - public boolean hasLearned(Long planId, Long knowledgeId, Long userId) { - Long count = planProgressMapper.selectCount( - new LambdaQueryWrapper() - .eq(PlanProgress::getPlanId, planId) - .eq(PlanProgress::getKnowledgeId, knowledgeId) - .eq(PlanProgress::getUserId, userId) - .eq(PlanProgress::getCompleted, true) - ); - return count != null && count > 0; - } - - @Override - public Integer getLearnedCount(Long planId, Long userId) { - Long count = planProgressMapper.selectCount( - new LambdaQueryWrapper() - .eq(PlanProgress::getPlanId, planId) - .eq(PlanProgress::getUserId, userId) - .eq(PlanProgress::getCompleted, true) - ); - return count != null ? count.intValue() : 0; - } -} diff --git a/training-system/src/main/java/com/sino/training/module/training/service/impl/TrainingPlanServiceImpl.java b/training-system/src/main/java/com/sino/training/module/training/service/impl/TrainingPlanServiceImpl.java deleted file mode 100644 index beb7b89..0000000 --- a/training-system/src/main/java/com/sino/training/module/training/service/impl/TrainingPlanServiceImpl.java +++ /dev/null @@ -1,635 +0,0 @@ -package com.sino.training.module.training.service.impl; - -import cn.hutool.core.util.StrUtil; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.sino.training.common.context.UserContext; -import com.sino.training.common.context.UserContextHolder; -import com.sino.training.common.enums.PlanStatus; -import com.sino.training.common.enums.TargetType; -import com.sino.training.common.exception.BusinessException; -import com.sino.training.common.result.PageResult; -import com.sino.training.common.result.ResultCode; -import com.sino.training.module.exam.entity.Exam; -import com.sino.training.module.exam.entity.ExamRecord; -import com.sino.training.module.exam.mapper.ExamMapper; -import com.sino.training.module.exam.mapper.ExamRecordMapper; -import com.sino.training.module.knowledge.entity.Knowledge; -import com.sino.training.module.knowledge.mapper.KnowledgeMapper; -import com.sino.training.module.knowledge.vo.KnowledgeVO; -import com.sino.training.module.system.entity.Department; -import com.sino.training.module.system.entity.Group; -import com.sino.training.module.system.entity.User; -import com.sino.training.module.system.mapper.DepartmentMapper; -import com.sino.training.module.system.mapper.GroupMapper; -import com.sino.training.module.system.mapper.UserMapper; -import com.sino.training.module.training.dto.TrainingPlanDTO; -import com.sino.training.module.training.dto.TrainingPlanQueryDTO; -import com.sino.training.module.training.entity.PlanExam; -import com.sino.training.module.training.entity.PlanKnowledge; -import com.sino.training.module.training.entity.PlanTarget; -import com.sino.training.module.training.entity.TrainingPlan; -import com.sino.training.module.training.mapper.PlanExamMapper; -import com.sino.training.module.training.mapper.PlanKnowledgeMapper; -import com.sino.training.module.training.mapper.PlanTargetMapper; -import com.sino.training.module.training.mapper.TrainingPlanMapper; -import com.sino.training.module.training.service.PlanProgressService; -import com.sino.training.module.training.service.TrainingPlanService; -import com.sino.training.module.training.vo.MyPlanVO; -import com.sino.training.module.training.vo.TrainingPlanVO; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.ArrayList; -import java.util.List; - -/** - * 培训计划服务实现类 - * - * @author training-system - */ -@Service -@RequiredArgsConstructor -public class TrainingPlanServiceImpl extends ServiceImpl implements TrainingPlanService { - - private final PlanKnowledgeMapper planKnowledgeMapper; - private final PlanExamMapper planExamMapper; - private final PlanTargetMapper planTargetMapper; - private final PlanProgressService planProgressService; - private final DepartmentMapper departmentMapper; - private final GroupMapper groupMapper; - private final UserMapper userMapper; - private final KnowledgeMapper knowledgeMapper; - private final ExamMapper examMapper; - private final ExamRecordMapper examRecordMapper; - - @Override - public PageResult pagePlans(TrainingPlanQueryDTO queryDTO) { - Page page = queryDTO.toPage(); - - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - - if (StrUtil.isNotBlank(queryDTO.getKeyword())) { - queryWrapper.like(TrainingPlan::getTitle, queryDTO.getKeyword()); - } - if (queryDTO.getDepartmentId() != null) { - queryWrapper.eq(TrainingPlan::getDepartmentId, queryDTO.getDepartmentId()); - } - if (StrUtil.isNotBlank(queryDTO.getStatus())) { - queryWrapper.eq(TrainingPlan::getStatus, PlanStatus.valueOf(queryDTO.getStatus())); - } - - queryWrapper.orderByDesc(TrainingPlan::getCreateTime); - - Page result = page(page, queryWrapper); - - List voList = new ArrayList<>(); - for (TrainingPlan plan : result.getRecords()) { - voList.add(convertToVO(plan, false)); - } - - return PageResult.of(result, voList); - } - - @Override - public TrainingPlanVO getPlanDetail(Long id) { - TrainingPlan plan = getById(id); - if (plan == null) { - throw new BusinessException(ResultCode.DATA_NOT_FOUND, "培训计划不存在"); - } - return convertToVO(plan, true); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public Long createPlan(TrainingPlanDTO dto) { - // 确定部门ID:管理员使用前端传值,其他用户强制使用自己的部门 - UserContext userContext = UserContextHolder.getContext(); - Long departmentId; - if ("ADMIN".equals(userContext.getRole())) { - departmentId = dto.getDepartmentId(); - if (departmentId == null) { - throw new BusinessException(ResultCode.BAD_REQUEST, "管理员必须指定所属部门"); - } - } else { - departmentId = userContext.getDepartmentId(); - } - - // 验证部门 - Department department = departmentMapper.selectById(departmentId); - if (department == null) { - throw new BusinessException(ResultCode.DATA_NOT_FOUND, "所属部门不存在"); - } - - // 验证日期 - if (dto.getStartDate().isAfter(dto.getEndDate())) { - throw new BusinessException(ResultCode.BAD_REQUEST, "开始日期不能晚于结束日期"); - } - - TrainingPlan plan = new TrainingPlan(); - plan.setTitle(dto.getTitle()); - plan.setDescription(dto.getDescription()); - plan.setStartDate(dto.getStartDate()); - plan.setEndDate(dto.getEndDate()); - plan.setDepartmentId(departmentId); - plan.setStatus(PlanStatus.NOT_STARTED); - plan.setCreatorId(UserContextHolder.getContext().getUserId()); - - save(plan); - - // 保存关联知识 - savePlanKnowledge(plan.getId(), dto.getKnowledgeList()); - - // 保存关联考试 - savePlanExams(plan.getId(), dto.getExamList()); - - // 保存培训对象 - savePlanTargets(plan.getId(), dto.getTargets()); - - return plan.getId(); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void updatePlan(TrainingPlanDTO dto) { - if (dto.getId() == null) { - throw new BusinessException(ResultCode.BAD_REQUEST, "计划ID不能为空"); - } - - TrainingPlan plan = getById(dto.getId()); - if (plan == null) { - throw new BusinessException(ResultCode.DATA_NOT_FOUND, "培训计划不存在"); - } - - // 验证日期 - if (dto.getStartDate().isAfter(dto.getEndDate())) { - throw new BusinessException(ResultCode.BAD_REQUEST, "开始日期不能晚于结束日期"); - } - - plan.setTitle(dto.getTitle()); - plan.setDescription(dto.getDescription()); - plan.setStartDate(dto.getStartDate()); - plan.setEndDate(dto.getEndDate()); - plan.setDepartmentId(dto.getDepartmentId()); - - updateById(plan); - - // 更新关联知识 - if (dto.getKnowledgeList() != null) { - planKnowledgeMapper.delete( - new LambdaQueryWrapper() - .eq(PlanKnowledge::getPlanId, plan.getId()) - ); - savePlanKnowledge(plan.getId(), dto.getKnowledgeList()); - } - - // 更新关联考试 - if (dto.getExamList() != null) { - planExamMapper.delete( - new LambdaQueryWrapper() - .eq(PlanExam::getPlanId, plan.getId()) - ); - savePlanExams(plan.getId(), dto.getExamList()); - } - - // 更新培训对象 - if (dto.getTargets() != null) { - planTargetMapper.delete( - new LambdaQueryWrapper() - .eq(PlanTarget::getPlanId, plan.getId()) - ); - savePlanTargets(plan.getId(), dto.getTargets()); - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void deletePlan(Long id) { - TrainingPlan plan = getById(id); - if (plan == null) { - throw new BusinessException(ResultCode.DATA_NOT_FOUND, "培训计划不存在"); - } - - // 删除关联知识 - planKnowledgeMapper.delete( - new LambdaQueryWrapper() - .eq(PlanKnowledge::getPlanId, id) - ); - - // 删除关联考试 - planExamMapper.delete( - new LambdaQueryWrapper() - .eq(PlanExam::getPlanId, id) - ); - - // 删除培训对象 - planTargetMapper.delete( - new LambdaQueryWrapper() - .eq(PlanTarget::getPlanId, id) - ); - - removeById(id); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void publishPlan(Long id) { - TrainingPlan plan = getById(id); - if (plan == null) { - throw new BusinessException(ResultCode.DATA_NOT_FOUND, "培训计划不存在"); - } - - if (plan.getStatus() != PlanStatus.NOT_STARTED) { - throw new BusinessException(ResultCode.BAD_REQUEST, "只有未开始的计划才能发布"); - } - - plan.setStatus(PlanStatus.IN_PROGRESS); - updateById(plan); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void endPlan(Long id) { - TrainingPlan plan = getById(id); - if (plan == null) { - throw new BusinessException(ResultCode.DATA_NOT_FOUND, "培训计划不存在"); - } - - if (plan.getStatus() != PlanStatus.IN_PROGRESS) { - throw new BusinessException(ResultCode.BAD_REQUEST, "只有进行中的计划才能结束"); - } - - plan.setStatus(PlanStatus.ENDED); - updateById(plan); - } - - @Override - public List listMyPlans(Long userId) { - User user = userMapper.selectById(userId); - if (user == null) { - throw new BusinessException(ResultCode.USER_NOT_FOUND); - } - - // 查询进行中的培训计划 - LambdaQueryWrapper planQuery = new LambdaQueryWrapper<>(); - planQuery.eq(TrainingPlan::getStatus, PlanStatus.IN_PROGRESS); - List allPlans = list(planQuery); - - List result = new ArrayList<>(); - for (TrainingPlan plan : allPlans) { - if (isUserTargeted(plan.getId(), user)) { - result.add(convertToMyPlanVO(plan, userId, false)); - } - } - - return result; - } - - @Override - public MyPlanVO getMyPlanDetail(Long planId, Long userId) { - TrainingPlan plan = getById(planId); - if (plan == null) { - throw new BusinessException(ResultCode.DATA_NOT_FOUND, "培训计划不存在"); - } - - User user = userMapper.selectById(userId); - if (user == null) { - throw new BusinessException(ResultCode.USER_NOT_FOUND); - } - - if (!isUserTargeted(planId, user)) { - throw new BusinessException(ResultCode.FORBIDDEN, "您不在该培训计划的培训对象中"); - } - - return convertToMyPlanVO(plan, userId, true); - } - - private void savePlanKnowledge(Long planId, List knowledgeList) { - if (knowledgeList == null || knowledgeList.isEmpty()) { - return; - } - - int sortOrder = 1; - for (TrainingPlanDTO.PlanKnowledgeDTO dto : knowledgeList) { - // 验证知识是否存在 - Knowledge knowledge = knowledgeMapper.selectById(dto.getKnowledgeId()); - if (knowledge == null) { - throw new BusinessException(ResultCode.DATA_NOT_FOUND, "知识不存在: " + dto.getKnowledgeId()); - } - - PlanKnowledge pk = new PlanKnowledge(); - pk.setPlanId(planId); - pk.setKnowledgeId(dto.getKnowledgeId()); - pk.setRequired(dto.getRequired() != null ? dto.getRequired() : true); - pk.setSortOrder(dto.getSortOrder() != null ? dto.getSortOrder() : sortOrder++); - planKnowledgeMapper.insert(pk); - } - } - - private void savePlanExams(Long planId, List examList) { - if (examList == null || examList.isEmpty()) { - return; - } - - int sortOrder = 1; - for (TrainingPlanDTO.PlanExamDTO dto : examList) { - // 验证考试是否存在 - Exam exam = examMapper.selectById(dto.getExamId()); - if (exam == null) { - throw new BusinessException(ResultCode.EXAM_NOT_FOUND, "考试不存在: " + dto.getExamId()); - } - - PlanExam pe = new PlanExam(); - pe.setPlanId(planId); - pe.setExamId(dto.getExamId()); - pe.setRequired(dto.getRequired() != null ? dto.getRequired() : true); - pe.setSortOrder(dto.getSortOrder() != null ? dto.getSortOrder() : sortOrder++); - planExamMapper.insert(pe); - } - } - - private void savePlanTargets(Long planId, List targets) { - if (targets == null || targets.isEmpty()) { - return; - } - - for (TrainingPlanDTO.PlanTargetDTO dto : targets) { - PlanTarget target = new PlanTarget(); - target.setPlanId(planId); - target.setTargetType(TargetType.valueOf(dto.getTargetType())); - target.setTargetId(dto.getTargetId()); - planTargetMapper.insert(target); - } - } - - private boolean isUserTargeted(Long planId, User user) { - LambdaQueryWrapper targetQuery = new LambdaQueryWrapper<>(); - targetQuery.eq(PlanTarget::getPlanId, planId); - List targets = planTargetMapper.selectList(targetQuery); - - for (PlanTarget target : targets) { - switch (target.getTargetType()) { - case DEPARTMENT: - if (target.getTargetId().equals(user.getDepartmentId())) { - return true; - } - break; - case GROUP: - if (target.getTargetId().equals(user.getGroupId())) { - return true; - } - break; - case USER: - if (target.getTargetId().equals(user.getId())) { - return true; - } - break; - } - } - - return false; - } - - private TrainingPlanVO convertToVO(TrainingPlan plan, boolean includeDetails) { - TrainingPlanVO vo = new TrainingPlanVO(); - vo.setId(plan.getId()); - vo.setTitle(plan.getTitle()); - vo.setDescription(plan.getDescription()); - vo.setStartDate(plan.getStartDate()); - vo.setEndDate(plan.getEndDate()); - vo.setDepartmentId(plan.getDepartmentId()); - vo.setStatus(plan.getStatus().name()); - vo.setStatusName(plan.getStatus().getDesc()); - vo.setCreatorId(plan.getCreatorId()); - vo.setCreateTime(plan.getCreateTime()); - - // 获取部门名称 - if (plan.getDepartmentId() != null) { - Department department = departmentMapper.selectById(plan.getDepartmentId()); - if (department != null) { - vo.setDepartmentName(department.getName()); - } - } - - // 获取创建人姓名 - if (plan.getCreatorId() != null) { - User user = userMapper.selectById(plan.getCreatorId()); - if (user != null) { - vo.setCreatorName(user.getRealName()); - } - } - - // 获取知识数量 - Long knowledgeCount = planKnowledgeMapper.selectCount( - new LambdaQueryWrapper() - .eq(PlanKnowledge::getPlanId, plan.getId()) - ); - vo.setKnowledgeCount(knowledgeCount != null ? knowledgeCount.intValue() : 0); - - // 获取参与人数 - Long participantCount = planTargetMapper.selectCount( - new LambdaQueryWrapper() - .eq(PlanTarget::getPlanId, plan.getId()) - ); - vo.setParticipantCount(participantCount != null ? participantCount.intValue() : 0); - - // 获取考试任务数量 - Long examCount = planExamMapper.selectCount( - new LambdaQueryWrapper() - .eq(PlanExam::getPlanId, plan.getId()) - ); - vo.setExamCount(examCount != null ? examCount.intValue() : 0); - - if (includeDetails) { - // 获取关联知识列表 - List planKnowledgeList = planKnowledgeMapper.selectList( - new LambdaQueryWrapper() - .eq(PlanKnowledge::getPlanId, plan.getId()) - .orderByAsc(PlanKnowledge::getSortOrder) - ); - - List knowledgeVOList = new ArrayList<>(); - for (PlanKnowledge pk : planKnowledgeList) { - TrainingPlanVO.PlanKnowledgeVO pkVO = new TrainingPlanVO.PlanKnowledgeVO(); - pkVO.setId(pk.getId()); - pkVO.setKnowledgeId(pk.getKnowledgeId()); - pkVO.setRequired(pk.getRequired()); - pkVO.setSortOrder(pk.getSortOrder()); - - Knowledge knowledge = knowledgeMapper.selectById(pk.getKnowledgeId()); - if (knowledge != null) { - KnowledgeVO kvo = new KnowledgeVO(); - kvo.setId(knowledge.getId()); - kvo.setTitle(knowledge.getTitle()); - kvo.setType(knowledge.getType().name()); - kvo.setTypeName(knowledge.getType().getDesc()); - pkVO.setKnowledge(kvo); - } - knowledgeVOList.add(pkVO); - } - vo.setKnowledgeList(knowledgeVOList); - - // 获取关联考试列表 - List planExamList = planExamMapper.selectList( - new LambdaQueryWrapper() - .eq(PlanExam::getPlanId, plan.getId()) - .orderByAsc(PlanExam::getSortOrder) - ); - - List examVOList = new ArrayList<>(); - for (PlanExam pe : planExamList) { - TrainingPlanVO.PlanExamVO peVO = new TrainingPlanVO.PlanExamVO(); - peVO.setId(pe.getId()); - peVO.setExamId(pe.getExamId()); - peVO.setRequired(pe.getRequired()); - peVO.setSortOrder(pe.getSortOrder()); - - Exam exam = examMapper.selectById(pe.getExamId()); - if (exam != null) { - peVO.setExamTitle(exam.getTitle()); - } - examVOList.add(peVO); - } - vo.setExamList(examVOList); - - // 获取培训对象列表 - List planTargets = planTargetMapper.selectList( - new LambdaQueryWrapper() - .eq(PlanTarget::getPlanId, plan.getId()) - ); - - List targetVOList = new ArrayList<>(); - for (PlanTarget target : planTargets) { - TrainingPlanVO.PlanTargetVO targetVO = new TrainingPlanVO.PlanTargetVO(); - targetVO.setId(target.getId()); - targetVO.setTargetType(target.getTargetType().name()); - targetVO.setTargetTypeName(target.getTargetType().getDesc()); - targetVO.setTargetId(target.getTargetId()); - targetVO.setTargetName(getTargetName(target.getTargetType(), target.getTargetId())); - targetVOList.add(targetVO); - } - vo.setTargets(targetVOList); - } - - return vo; - } - - private MyPlanVO convertToMyPlanVO(TrainingPlan plan, Long userId, boolean includeKnowledgeProgress) { - MyPlanVO vo = new MyPlanVO(); - vo.setPlanId(plan.getId()); - vo.setPlanTitle(plan.getTitle()); - vo.setPlanDescription(plan.getDescription()); - vo.setStartDate(plan.getStartDate()); - vo.setEndDate(plan.getEndDate()); - vo.setStatus(plan.getStatus().name()); - vo.setStatusName(plan.getStatus().getDesc()); - - // 获取知识总数和已学习数量 - Long totalKnowledge = planKnowledgeMapper.selectCount( - new LambdaQueryWrapper() - .eq(PlanKnowledge::getPlanId, plan.getId()) - ); - vo.setTotalKnowledge(totalKnowledge != null ? totalKnowledge.intValue() : 0); - - Integer learnedKnowledge = planProgressService.getLearnedCount(plan.getId(), userId); - vo.setLearnedKnowledge(learnedKnowledge); - - // 获取考试总数和已通过数量 - List planExamList = planExamMapper.selectList( - new LambdaQueryWrapper() - .eq(PlanExam::getPlanId, plan.getId()) - .orderByAsc(PlanExam::getSortOrder) - ); - vo.setTotalExam(planExamList.size()); - - int passedExamCount = 0; - List examProgressList = new ArrayList<>(); - for (PlanExam pe : planExamList) { - MyPlanVO.ExamProgressVO epVO = new MyPlanVO.ExamProgressVO(); - epVO.setExamId(pe.getExamId()); - epVO.setRequired(pe.getRequired()); - boolean passed = hasPassedExam(pe.getExamId(), userId); - epVO.setPassed(passed); - if (passed) { - passedExamCount++; - } - - Exam exam = examMapper.selectById(pe.getExamId()); - if (exam != null) { - epVO.setExamTitle(exam.getTitle()); - } - examProgressList.add(epVO); - } - vo.setPassedExam(passedExamCount); - vo.setExamProgress(examProgressList); - - // 计算进度百分比(知识学习进度) - if (vo.getTotalKnowledge() > 0) { - vo.setProgressPercent((int) Math.round(learnedKnowledge * 100.0 / vo.getTotalKnowledge())); - } else { - vo.setProgressPercent(0); - } - - // 获取知识学习进度 - if (includeKnowledgeProgress) { - List planKnowledgeList = planKnowledgeMapper.selectList( - new LambdaQueryWrapper() - .eq(PlanKnowledge::getPlanId, plan.getId()) - .orderByAsc(PlanKnowledge::getSortOrder) - ); - - List progressList = new ArrayList<>(); - for (PlanKnowledge pk : planKnowledgeList) { - MyPlanVO.KnowledgeProgressVO kpVO = new MyPlanVO.KnowledgeProgressVO(); - kpVO.setKnowledgeId(pk.getKnowledgeId()); - kpVO.setRequired(pk.getRequired()); - kpVO.setLearned(planProgressService.hasLearned(plan.getId(), pk.getKnowledgeId(), userId)); - - Knowledge knowledge = knowledgeMapper.selectById(pk.getKnowledgeId()); - if (knowledge != null) { - kpVO.setKnowledgeTitle(knowledge.getTitle()); - kpVO.setKnowledgeType(knowledge.getType().name()); - } - progressList.add(kpVO); - } - vo.setKnowledgeProgress(progressList); - } - - return vo; - } - - private boolean hasPassedExam(Long examId, Long userId) { - Exam exam = examMapper.selectById(examId); - if (exam == null) { - return false; - } - - LambdaQueryWrapper query = new LambdaQueryWrapper<>(); - query.eq(ExamRecord::getExamId, examId) - .eq(ExamRecord::getUserId, userId) - .eq(ExamRecord::getStatus, 1) // 已提交 - .eq(ExamRecord::getPassed, true); - - Long count = examRecordMapper.selectCount(query); - return count != null && count > 0; - } - - private String getTargetName(TargetType type, Long targetId) { - return switch (type) { - case DEPARTMENT -> { - Department dept = departmentMapper.selectById(targetId); - yield dept != null ? dept.getName() : ""; - } - case GROUP -> { - Group group = groupMapper.selectById(targetId); - yield group != null ? group.getName() : ""; - } - case USER -> { - User user = userMapper.selectById(targetId); - yield user != null ? user.getRealName() : ""; - } - }; - } -} diff --git a/training-system/src/main/java/com/sino/training/module/training/vo/MyPlanVO.java b/training-system/src/main/java/com/sino/training/module/training/vo/MyPlanVO.java deleted file mode 100644 index 24fb194..0000000 --- a/training-system/src/main/java/com/sino/training/module/training/vo/MyPlanVO.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.sino.training.module.training.vo; - -import lombok.Data; - -import java.io.Serializable; -import java.time.LocalDate; -import java.util.List; - -/** - * 我的培训计划VO - * - * @author training-system - */ -@Data -public class MyPlanVO implements Serializable { - - private static final long serialVersionUID = 1L; - - private Long planId; - private String planTitle; - private String planDescription; - private LocalDate startDate; - private LocalDate endDate; - private String status; - private String statusName; - - /** - * 进度百分比 - */ - private Integer progressPercent; - - /** - * 总知识数量 - */ - private Integer totalKnowledge; - - /** - * 已学习知识数量 - */ - private Integer learnedKnowledge; - - /** - * 总考试数量 - */ - private Integer totalExam; - - /** - * 已通过考试数量 - */ - private Integer passedExam; - - /** - * 知识学习进度列表 - */ - private List knowledgeProgress; - - /** - * 考试进度列表 - */ - private List examProgress; - - @Data - public static class KnowledgeProgressVO implements Serializable { - private Long knowledgeId; - private String knowledgeTitle; - private String knowledgeType; - private Boolean required; - private Boolean learned; - } - - @Data - public static class ExamProgressVO implements Serializable { - private Long examId; - private String examTitle; - private Boolean required; - private Boolean passed; - } -} diff --git a/training-system/src/main/java/com/sino/training/module/training/vo/TrainingPlanVO.java b/training-system/src/main/java/com/sino/training/module/training/vo/TrainingPlanVO.java deleted file mode 100644 index 264fbc9..0000000 --- a/training-system/src/main/java/com/sino/training/module/training/vo/TrainingPlanVO.java +++ /dev/null @@ -1,108 +0,0 @@ -package com.sino.training.module.training.vo; - -import com.sino.training.module.knowledge.vo.KnowledgeVO; -import lombok.Data; - -import java.io.Serializable; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.util.List; - -/** - * 培训计划VO - * - * @author training-system - */ -@Data -public class TrainingPlanVO implements Serializable { - - private static final long serialVersionUID = 1L; - - private Long id; - private String title; - private String description; - private LocalDate startDate; - private LocalDate endDate; - private Long departmentId; - private String departmentName; - private String status; - private String statusName; - private Long creatorId; - private String creatorName; - private LocalDateTime createTime; - - /** - * 知识数量 - */ - private Integer knowledgeCount; - - /** - * 参与人数 - */ - private Integer participantCount; - - /** - * 考试任务数量 - */ - private Integer examCount; - - /** - * 关联知识列表 - */ - private List knowledgeList; - - /** - * 关联考试列表 - */ - private List examList; - - /** - * 培训对象列表 - */ - private List targets; - - /** - * 当前用户的进度(学员查看时) - */ - private Integer progressPercent; - - /** - * 当前用户是否完成(学员查看时) - */ - private Boolean completed; - - @Data - public static class PlanKnowledgeVO implements Serializable { - private Long id; - private Long knowledgeId; - private Boolean required; - private Integer sortOrder; - private KnowledgeVO knowledge; - /** - * 当前用户是否已学习 - */ - private Boolean learned; - } - - @Data - public static class PlanExamVO implements Serializable { - private Long id; - private Long examId; - private String examTitle; - private Boolean required; - private Integer sortOrder; - /** - * 当前用户是否已通过 - */ - private Boolean passed; - } - - @Data - public static class PlanTargetVO implements Serializable { - private Long id; - private String targetType; - private String targetTypeName; - private Long targetId; - private String targetName; - } -} diff --git a/training-system/src/main/resources/application-dev.yml b/training-system/src/main/resources/application-dev.yml deleted file mode 100644 index 63779fd..0000000 --- a/training-system/src/main/resources/application-dev.yml +++ /dev/null @@ -1,23 +0,0 @@ -# 开发环境配置 -spring: - # 数据源配置 - datasource: - driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://192.168.1.226:3306/training_system?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true - username: root - password: root - -# 企业微信配置(开发环境) -wechat: -cp: - corp-id: ww0b2dc90421854148 - agent-id: 1000008 - secret: AQSWrg_TMHaWHXpiVLLUkTepUzcE4JjZLmUTl48ezMA - # OAuth2 回调地址 - oauth2-redirect-uri: http://localhost:8080/auth/wechat/callback - -# 日志配置 -logging: - level: - com.sino.training: debug - com.baomidou.mybatisplus: debug diff --git a/training-system/src/main/resources/application-prod.yml b/training-system/src/main/resources/application-prod.yml deleted file mode 100644 index 1a3c9ae..0000000 --- a/training-system/src/main/resources/application-prod.yml +++ /dev/null @@ -1,44 +0,0 @@ -# 生产环境配置 -spring: - # 数据源配置 - datasource: - driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://${DB_HOST:localhost}:${DB_PORT:3306}/${DB_NAME:training_system}?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 - username: ${DB_USERNAME:root} - password: ${DB_PASSWORD:root} - # 生产环境开启模板缓存 - thymeleaf: - cache: true - -# 企业微信配置(生产环境,通过环境变量注入) -wechat: - cp: - corp-id: ${WECHAT_CORP_ID} - agent-id: ${WECHAT_AGENT_ID} - secret: ${WECHAT_SECRET} - oauth2-redirect-uri: ${WECHAT_OAUTH2_REDIRECT_URI} - -# JWT 配置(生产环境使用环境变量) -training: - jwt: - secret: ${JWT_SECRET:training-system-jwt-secret-key-prod} - -# 日志配置 -logging: - level: - com.sino.training: info - com.baomidou.mybatisplus: warn - file: - name: ./logs/training-system.log - -# MyBatis Plus 生产环境关闭SQL日志 -mybatis-plus: - configuration: - log-impl: org.apache.ibatis.logging.nologging.NoLoggingImpl - -# Springdoc 生产环境可选择关闭 -springdoc: - api-docs: - enabled: false - swagger-ui: - enabled: false diff --git a/training-system/src/main/resources/application.yml b/training-system/src/main/resources/application.yml deleted file mode 100644 index a1613b8..0000000 --- a/training-system/src/main/resources/application.yml +++ /dev/null @@ -1,66 +0,0 @@ -# 道路救援企业培训系统 - 主配置文件 -server: - port: 8080 - servlet: - context-path: / - -spring: - profiles: - active: dev - application: - name: training-system - # Thymeleaf 模板配置 - thymeleaf: - prefix: classpath:/templates/ - suffix: .html - mode: HTML - encoding: UTF-8 - cache: false - # 文件上传配置 - servlet: - multipart: - enabled: true - max-file-size: 100MB - max-request-size: 100MB - # Jackson 配置 - jackson: - date-format: yyyy-MM-dd HH:mm:ss - time-zone: GMT+8 - default-property-inclusion: non_null - -# MyBatis Plus 配置 -mybatis-plus: - mapper-locations: classpath:/mapper/**/*.xml - type-aliases-package: com.sino.training.module.*.entity - global-config: - db-config: - id-type: auto - logic-delete-field: deleted - logic-delete-value: 1 - logic-not-delete-value: 0 - configuration: - map-underscore-to-camel-case: true - log-impl: org.apache.ibatis.logging.stdout.StdOutImpl - -# Springdoc OpenAPI 配置 -springdoc: - api-docs: - enabled: true - path: /v3/api-docs - swagger-ui: - enabled: true - path: /swagger-ui.html - -# 自定义配置 -training: - # JWT 配置 - jwt: - secret: training-system-jwt-secret-key-2026 - expire: 86400000 # 24小时,单位毫秒 - header: Authorization - prefix: Bearer - # 文件上传配置 - upload: - path: D:/upload/ - allowed-types: pdf,doc,docx,xls,xlsx,ppt,pptx,jpg,jpeg,png,gif,mp4,avi,mov - max-size: 104857600 # 100MB diff --git a/training-system/src/main/resources/mapper/.gitkeep b/training-system/src/main/resources/mapper/.gitkeep deleted file mode 100644 index 16742ca..0000000 --- a/training-system/src/main/resources/mapper/.gitkeep +++ /dev/null @@ -1 +0,0 @@ -# This file ensures the mapper directory is tracked by git diff --git a/training-system/src/main/resources/static/css/common.css b/training-system/src/main/resources/static/css/common.css deleted file mode 100644 index 30327ce..0000000 --- a/training-system/src/main/resources/static/css/common.css +++ /dev/null @@ -1,615 +0,0 @@ -/** - * 道路救援企业培训系统 - 公共样式 - * 基于 Bootstrap 5 扩展 - */ - -/* ========== CSS变量体系 ========== */ -:root { - /* 主色系 - 蓝色 */ - --primary-color: #0d6efd; - --primary-hover: #0b5ed7; - --primary-light: rgba(13, 110, 253, 0.1); - --primary-gradient: linear-gradient(135deg, #0d6efd 0%, #0dcaf0 100%); - - /* 侧边栏 */ - --sidebar-bg: linear-gradient(180deg, #1a1c23 0%, #2d3748 100%); - --sidebar-width: 250px; - - /* 文字颜色 */ - --text-primary: #1a1c23; - --text-secondary: #6c757d; - --text-muted: #94a3b8; - - /* 边框与背景 */ - --border-color: #e9ecef; - --bg-light: #f8f9fa; - --bg-card: #ffffff; - --bg-hover: rgba(255, 255, 255, 0.08); - - /* 状态色 */ - --success-color: #198754; - --success-light: rgba(25, 135, 84, 0.1); - --warning-color: #ffc107; - --warning-light: rgba(255, 193, 7, 0.1); - --danger-color: #dc3545; - --danger-light: rgba(220, 53, 69, 0.1); - --info-color: #0dcaf0; - --info-light: rgba(13, 202, 240, 0.1); - - /* 阴影 */ - --shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.08); - --shadow-md: 0 4px 12px rgba(0, 0, 0, 0.1); - --shadow-lg: 0 8px 24px rgba(0, 0, 0, 0.15); - - /* 圆角 */ - --radius-sm: 4px; - --radius-md: 8px; - --radius-lg: 12px; - --radius-xl: 16px; - - /* 间距 */ - --spacing-xs: 4px; - --spacing-sm: 8px; - --spacing-md: 16px; - --spacing-lg: 24px; - --spacing-xl: 32px; - - /* 动画 */ - --transition-fast: 0.15s ease; - --transition-normal: 0.2s ease; - --transition-slow: 0.3s ease; -} - -/* ========== 布局相关 ========== */ -html, body { - height: 100%; -} - -/* 主布局容器 */ -.layout-wrapper { - display: flex; - min-height: 100vh; -} - -/* ========== 侧边栏 ========== */ -.sidebar { - width: var(--sidebar-width); - min-height: 100vh; - background: var(--sidebar-bg); - position: fixed; - left: 0; - top: 0; - z-index: 1000; - transition: all var(--transition-slow); -} - -.sidebar-logo { - height: 64px; - display: flex; - align-items: center; - padding: 0 20px; - background: rgba(0, 0, 0, 0.2); - border-bottom: 1px solid rgba(255, 255, 255, 0.1); -} - -.sidebar-logo-icon { - width: 36px; - height: 36px; - background: var(--primary-gradient); - border-radius: var(--radius-md); - display: flex; - align-items: center; - justify-content: center; - margin-right: 12px; -} - -.sidebar-logo-text { - color: #fff; - font-size: 16px; - font-weight: 600; - white-space: nowrap; -} - -/* 侧边栏菜单 */ -.sidebar-menu { - padding: 16px 0; - overflow-y: auto; - height: calc(100vh - 64px); -} - -.sidebar-menu::-webkit-scrollbar { - width: 4px; -} - -.sidebar-menu::-webkit-scrollbar-thumb { - background: rgba(255, 255, 255, 0.2); - border-radius: 2px; -} - -.menu-item { - display: flex; - align-items: center; - padding: 12px 20px; - color: rgba(255, 255, 255, 0.7); - text-decoration: none; - transition: all var(--transition-normal); - cursor: pointer; - border-left: 3px solid transparent; -} - -.menu-item:hover { - color: #fff; - background: var(--bg-hover); -} - -.menu-item.active { - color: #fff; - background: var(--primary-light); - border-left-color: var(--primary-color); -} - -.menu-item i { - font-size: 18px; - width: 24px; - margin-right: 12px; - text-align: center; -} - -.menu-group-title { - display: flex; - align-items: center; - justify-content: space-between; - padding: 12px 20px; - color: rgba(255, 255, 255, 0.7); - cursor: pointer; - transition: all 0.2s ease; -} - -.menu-group-title:hover { - color: #fff; - background: rgba(255, 255, 255, 0.05); -} - -.menu-group-title i.arrow { - font-size: 12px; - transition: transform 0.2s ease; -} - -.menu-group.collapsed .menu-group-title i.arrow { - transform: rotate(-90deg); -} - -.menu-group.collapsed .menu-submenu { - display: none; -} - -.menu-submenu { - background: rgba(0, 0, 0, 0.15); -} - -.menu-submenu .menu-item { - padding-left: 56px; - font-size: 14px; -} - -/* 侧边栏分隔线 */ -.sidebar-divider { - border-top: 1px solid rgba(255, 255, 255, 0.1); - margin: var(--spacing-md) 0; -} - -/* ========== 主内容区 ========== */ -.main-wrapper { - flex: 1; - margin-left: var(--sidebar-width); - min-height: 100vh; - background-color: var(--bg-light); - display: flex; - flex-direction: column; -} - -/* 顶部导航 */ -.top-header { - height: 64px; - background: var(--bg-card); - border-bottom: 1px solid var(--border-color); - display: flex; - align-items: center; - justify-content: space-between; - padding: 0 var(--spacing-lg); - position: sticky; - top: 0; - z-index: 100; -} - -.header-title { - font-size: 18px; - font-weight: 600; - color: var(--text-primary); -} - -.header-user { - display: flex; - align-items: center; - cursor: pointer; -} - -.header-user .avatar { - width: 36px; - height: 36px; - border-radius: 50%; - background: var(--primary-gradient); - color: #fff; - display: flex; - align-items: center; - justify-content: center; - font-weight: 500; - margin-right: var(--spacing-sm); -} - -/* 内容区域 */ -.main-content { - flex: 1; - padding: var(--spacing-lg); -} - -/* ========== 页面卡片 ========== */ -.page-card { - background: var(--bg-card); - border-radius: var(--radius-md); - box-shadow: var(--shadow-sm); - margin-bottom: var(--spacing-lg); -} - -.page-card-header { - padding: var(--spacing-md) var(--spacing-lg); - border-bottom: 1px solid var(--border-color); - display: flex; - align-items: center; - justify-content: space-between; -} - -.page-card-title { - font-size: 16px; - font-weight: 600; - color: var(--text-primary); - margin: 0; -} - -.page-card-body { - padding: var(--spacing-lg); -} - -/* ========== 统计卡片 ========== */ -.stat-card { - background: var(--bg-card); - border-radius: var(--radius-md); - padding: var(--spacing-lg); - box-shadow: var(--shadow-sm); - transition: all var(--transition-normal); -} - -.stat-card:hover { - box-shadow: var(--shadow-md); - transform: translateY(-2px); -} - -.stat-card-icon { - width: 48px; - height: 48px; - border-radius: var(--radius-lg); - display: flex; - align-items: center; - justify-content: center; - font-size: 24px; - margin-bottom: var(--spacing-md); -} - -.stat-card-icon.primary { - background: var(--primary-light); - color: var(--primary-color); -} - -.stat-card-icon.success { - background: var(--success-light); - color: var(--success-color); -} - -.stat-card-icon.warning { - background: var(--warning-light); - color: var(--warning-color); -} - -.stat-card-icon.info { - background: var(--info-light); - color: var(--info-color); -} - -.stat-card-value { - font-size: 28px; - font-weight: 700; - color: var(--text-primary); - margin-bottom: var(--spacing-xs); -} - -.stat-card-label { - font-size: 14px; - color: var(--text-secondary); -} - -/* ========== 工具栏 ========== */ -.toolbar { - display: flex; - flex-wrap: wrap; - align-items: center; - justify-content: space-between; - gap: var(--spacing-sm); - margin-bottom: var(--spacing-lg); -} - -.toolbar-left { - display: flex; - flex-wrap: wrap; - align-items: center; - gap: var(--spacing-sm); -} - -.toolbar-right { - display: flex; - align-items: center; - gap: var(--spacing-sm); -} - -/* ========== 表格增强 ========== */ -.table-wrapper { - overflow-x: auto; -} - -.table th { - font-weight: 600; - color: var(--text-secondary); - background-color: var(--bg-light); - white-space: nowrap; -} - -.table td { - vertical-align: middle; -} - -.table .actions { - white-space: nowrap; -} - -.table .actions .btn { - padding: 4px 8px; - font-size: 13px; -} - -/* ========== 状态标签 ========== */ -.status-badge { - display: inline-flex; - align-items: center; - padding: 4px 10px; - border-radius: 20px; - font-size: 12px; - font-weight: 500; -} - -.status-badge.draft { - background: #fff3cd; - color: #856404; -} - -.status-badge.published { - background: #d1e7dd; - color: #0f5132; -} - -.status-badge.offline { - background: #f8d7da; - color: #842029; -} - -.status-badge.not-started { - background: #e2e3e5; - color: #41464b; -} - -.status-badge.in-progress { - background: #cff4fc; - color: #055160; -} - -.status-badge.ended { - background: #d1e7dd; - color: #0f5132; -} - -/* ========== 空状态 ========== */ -.empty-state { - text-align: center; - padding: 48px var(--spacing-lg); - color: var(--text-secondary); -} - -.empty-state i { - font-size: 48px; - margin-bottom: 16px; - opacity: 0.5; -} - -.empty-state p { - margin: 0; - font-size: 14px; -} - -/* ========== 加载状态 ========== */ -.loading-state { - display: flex; - align-items: center; - justify-content: center; - padding: 48px; -} - -/* ========== 文件上传区域 ========== */ -.upload-area { - border: 2px dashed var(--border-color); - border-radius: var(--radius-md); - padding: var(--spacing-xl); - text-align: center; - cursor: pointer; - transition: all var(--transition-normal); - background: var(--bg-light); -} - -.upload-area:hover { - border-color: var(--primary-color); - background: rgba(13, 110, 253, 0.02); -} - -.upload-area.dragover { - border-color: var(--primary-color); - background: rgba(13, 110, 253, 0.05); -} - -.upload-area i { - font-size: 48px; - color: var(--text-secondary); - margin-bottom: var(--spacing-md); -} - -.upload-area p { - margin: 0; - color: var(--text-secondary); -} - -.upload-area .upload-hint { - font-size: 12px; - margin-top: 8px; -} - -/* ========== 进度条 ========== */ -.progress-wrapper { - display: flex; - align-items: center; - gap: 12px; -} - -.progress-wrapper .progress { - flex: 1; - height: 8px; -} - -.progress-wrapper .progress-text { - font-size: 13px; - font-weight: 500; - color: #495057; - min-width: 40px; - text-align: right; -} - -/* ========== 消息提示(Toast增强) ========== */ -.toast-container { - position: fixed; - top: 24px; - right: 24px; - z-index: 1100; -} - -/* ========== 答题卡样式 ========== */ -.answer-sheet { - display: flex; - flex-wrap: wrap; - gap: var(--spacing-sm); -} - -.answer-sheet-item { - width: 36px; - height: 36px; - border-radius: var(--radius-sm); - display: flex; - align-items: center; - justify-content: center; - font-size: 14px; - font-weight: 500; - cursor: pointer; - border: 1px solid var(--border-color); - background: var(--bg-card); - transition: all var(--transition-normal); -} - -.answer-sheet-item:hover { - border-color: var(--primary-color); -} - -.answer-sheet-item.current { - border-color: var(--primary-color); - background: var(--primary-color); - color: #fff; -} - -.answer-sheet-item.answered { - background: #d1e7dd; - border-color: var(--success-color); - color: var(--success-color); -} - -/* ========== 考试计时器 ========== */ -.exam-timer { - display: flex; - align-items: center; - gap: var(--spacing-sm); - padding: var(--spacing-sm) var(--spacing-md); - background: var(--warning-light); - border-radius: var(--radius-md); - font-weight: 600; -} - -.exam-timer.warning { - background: var(--danger-light); - color: var(--danger-color); -} - -.exam-timer i { - font-size: 18px; -} - -/* ========== 响应式 ========== */ -@media (max-width: 992px) { - .sidebar { - transform: translateX(-100%); - } - - .sidebar.show { - transform: translateX(0); - } - - .main-wrapper { - margin-left: 0; - } - - .top-header { - padding: 0 var(--spacing-md); - } - - .main-content { - padding: var(--spacing-md); - } -} - -@media (max-width: 576px) { - .toolbar { - flex-direction: column; - align-items: stretch; - } - - .toolbar-left, - .toolbar-right { - width: 100%; - justify-content: flex-start; - } - - .stat-card-value { - font-size: 24px; - } -} diff --git a/training-system/src/main/resources/static/exam/edit.html b/training-system/src/main/resources/static/exam/edit.html deleted file mode 100644 index 3c34dab..0000000 --- a/training-system/src/main/resources/static/exam/edit.html +++ /dev/null @@ -1,339 +0,0 @@ - - - - - - 发布考试 - 道路救援培训系统 - - - - - - -
-
-
-
- - -
-
-
-
-
-
考试设置
-
-
- -
- - -
-
- - -
-
- - -
-
-
-
- - -
-
- - -
-
-
-
- - -
-
- - -
-
-
-
- - -
-
- - -
-
- - -
-
-
-
-
-
-
-
-
选择参与人员
-
-
-
- - 已选择 0 人参与考试 -
-
-
- -
-
-
- - -
-
-
-
-
- - -
-
-
-
加载中...
-
-
-
-
- 返回 - -
-
-
-
-
-
- - - - - - diff --git a/training-system/src/main/resources/static/exam/list.html b/training-system/src/main/resources/static/exam/list.html deleted file mode 100644 index ae64918..0000000 --- a/training-system/src/main/resources/static/exam/list.html +++ /dev/null @@ -1,245 +0,0 @@ - - - - - - 考试管理 - 道路救援培训系统 - - - - - -
-
-
-
- - -
-
-
-
-
考试管理
- 发布考试 -
-
-
-
-
- - -
- -
-
- -
-
-
- - - - - - - - - - - - - - - -
考试名称试卷考试时间参与人数及格率状态操作
-
- -
-
-
-
-
- - - - - - - - - diff --git a/training-system/src/main/resources/static/exam/my-exams.html b/training-system/src/main/resources/static/exam/my-exams.html deleted file mode 100644 index 71e8414..0000000 --- a/training-system/src/main/resources/static/exam/my-exams.html +++ /dev/null @@ -1,185 +0,0 @@ - - - - - - 我的考试 - 道路救援培训系统 - - - - - - -
-
-
-
- - -
-
-
-
-
我的考试
-
-
-
-
全部
-
进行中
-
待开始
-
已结束
-
-
-
-
-
-
-
-
-
- - - - - - diff --git a/training-system/src/main/resources/static/exam/paper-edit.html b/training-system/src/main/resources/static/exam/paper-edit.html deleted file mode 100644 index 0a0ebfc..0000000 --- a/training-system/src/main/resources/static/exam/paper-edit.html +++ /dev/null @@ -1,506 +0,0 @@ - - - - - - 编辑试卷 - 道路救援培训系统 - - - - - - -
-
-
-
- - -
-
-
-
-
-
试卷设置
-
-
- -
- - -
-
- - -
-
-
- - -
-
- - -
-
-
-
- 题目数量 - 0 -
-
- 总分 - 0 -
-
-
-
-
-
-
-
-
组卷方式
-
-
-
-
- -
手动选题
-
-
- -
随机抽题
-
-
- - -
-
-
- -
-
- -
-
-
- - -
-
-
-
-
加载中...
-
-
- -
-
- - - -
-
- -
-
-
试卷题目 0
- -
-
-

请从左侧题库中选择题目

-
-
- -
- 返回 - - -
-
-
-
-
-
- - - - - - diff --git a/training-system/src/main/resources/static/exam/paper-preview.html b/training-system/src/main/resources/static/exam/paper-preview.html deleted file mode 100644 index a19ce62..0000000 --- a/training-system/src/main/resources/static/exam/paper-preview.html +++ /dev/null @@ -1,182 +0,0 @@ - - - - - - 试卷预览 - 道路救援培训系统 - - - - - - -
-
-
-
- -
- - -
-
-
-
-
-
-
-
-
- - - - - - diff --git a/training-system/src/main/resources/static/exam/paper.html b/training-system/src/main/resources/static/exam/paper.html deleted file mode 100644 index 3f2c5ab..0000000 --- a/training-system/src/main/resources/static/exam/paper.html +++ /dev/null @@ -1,183 +0,0 @@ - - - - - - 试卷管理 - 道路救援培训系统 - - - - - - -
-
-
-
- - -
-
-
-
-
试卷管理
- 创建试卷 -
-
-
-
-
- - -
- -
-
- -
-
-
-
-
- -
-
-
-
-
- - - - - - diff --git a/training-system/src/main/resources/static/exam/question-category.html b/training-system/src/main/resources/static/exam/question-category.html deleted file mode 100644 index 1eb2c5e..0000000 --- a/training-system/src/main/resources/static/exam/question-category.html +++ /dev/null @@ -1,111 +0,0 @@ - - - - - - 题库分类 - 道路救援培训系统 - - - - - - -
-
-
-
- - -
-
-
-
-
-
题库分类
-
-
-
-
-
-
分类详情
-

请从左侧选择一个分类查看详情

-
-
-
-
-
-
- - - - - - diff --git a/training-system/src/main/resources/static/exam/question-edit.html b/training-system/src/main/resources/static/exam/question-edit.html deleted file mode 100644 index 4e9d319..0000000 --- a/training-system/src/main/resources/static/exam/question-edit.html +++ /dev/null @@ -1,426 +0,0 @@ - - - - - - 编辑题目 - 道路救援培训系统 - - - - - - -
-
-
-
- - -
-
-
-
-
新增题目
-
-
-
- - - -
- -
-
-
- -
单选题
- 只有一个正确答案 -
-
-
-
- -
多选题
- 可以有多个正确答案 -
-
-
-
- -
判断题
- 判断对错 -
-
-
-
- -
-
- - -
-
- - -
-
- - -
-
- -
- - -
- - -
-
-
- - -
-
-
-
A
- - -
-
-
B
- - -
-
-
C
- - -
-
-
D
- - -
-
-
- -
- -
- - - - -
- 点击选择正确答案 -
-
- - - - -
- - -
- -
- 返回 - -
-
-
-
-
-
-
- - - - - - diff --git a/training-system/src/main/resources/static/exam/question.html b/training-system/src/main/resources/static/exam/question.html deleted file mode 100644 index 687e5fb..0000000 --- a/training-system/src/main/resources/static/exam/question.html +++ /dev/null @@ -1,383 +0,0 @@ - - - - - - 题目列表 - 道路救援培训系统 - - - - - - -
-
-
-
- - -
-
-
-
-
-
题库分类
-
-
- 全部题目 - 0 -
- -
-
-
-
-
-
-
题目列表
- 新增题目 -
-
-
-
-
- - -
- - -
-
- - -
-
-
-
-
- -
-
-
-
-
-
-
- - - - - - - - - diff --git a/training-system/src/main/resources/static/exam/result.html b/training-system/src/main/resources/static/exam/result.html deleted file mode 100644 index ab40205..0000000 --- a/training-system/src/main/resources/static/exam/result.html +++ /dev/null @@ -1,286 +0,0 @@ - - - - - - 考试成绩 - 道路救援培训系统 - - - - - - -
-
-
-
- - -
-
-
-
-
-
- - - - - - diff --git a/training-system/src/main/resources/static/exam/taking.html b/training-system/src/main/resources/static/exam/taking.html deleted file mode 100644 index 6a937d4..0000000 --- a/training-system/src/main/resources/static/exam/taking.html +++ /dev/null @@ -1,332 +0,0 @@ - - - - - - 在线考试 - 道路救援培训系统 - - - - - - -
-
-
-
-
考试加载中...
-
- - - 0 - 满分 0 -
-
-
- - 00:00:00 -
-
-
-
-
-
-
-
-

正在加载试卷...

-
-
-
- -
-
- - - - - - diff --git a/training-system/src/main/resources/static/index.html b/training-system/src/main/resources/static/index.html deleted file mode 100644 index e218261..0000000 --- a/training-system/src/main/resources/static/index.html +++ /dev/null @@ -1,293 +0,0 @@ - - - - - - 工作台 - 道路救援培训系统 - - - - - - - - -
- -
- - -
- -
-
- 工作台 -
- -
- - -
- -
-
-
-
-
-
-
-

欢迎回来,用户

-

2026年1月8日 星期三

-
-
-
-
-
-
- - -
-
-
-
- -
-
0
-
待学习课程
-
-
-
-
-
- -
-
0
-
待完成考试
-
-
-
-
-
- -
-
0%
-
培训进度
-
-
-
-
-
- -
-
0h
-
本月学习时长
-
-
-
- -
- -
-
-
-
- 我的培训计划 -
- 查看全部 -
-
-
- - - - - - - - - - - - - - -
培训名称状态进度截止日期
-
- -

暂无培训计划

-
-
-
-
-
-
- - -
-
-
-
- 待完成考试 -
- 查看全部 -
-
-
- - - - - - - - - - - - - - -
考试名称考试时长剩余次数操作
-
- -

暂无待完成考试

-
-
-
-
-
-
-
- - -
-
- -
-
-
-
-
- - - - - - - diff --git a/training-system/src/main/resources/static/js/common.js b/training-system/src/main/resources/static/js/common.js deleted file mode 100644 index dad4929..0000000 --- a/training-system/src/main/resources/static/js/common.js +++ /dev/null @@ -1,705 +0,0 @@ -/** - * 道路救援企业培训系统 - 公共JS - * 基于 Bootstrap 5 - */ - -// API 基础路径 -const API_BASE_URL = '/api'; - -// Token 存储键名 -const TOKEN_KEY = 'training_token'; -const USER_KEY = 'training_user'; - -/** - * 获取存储的Token - */ -function getToken() { - return localStorage.getItem(TOKEN_KEY); -} - -/** - * 设置Token - */ -function setToken(token) { - localStorage.setItem(TOKEN_KEY, token); -} - -/** - * 移除Token - */ -function removeToken() { - localStorage.removeItem(TOKEN_KEY); - localStorage.removeItem(USER_KEY); -} - -/** - * 获取当前用户信息 - */ -function getCurrentUser() { - const userStr = localStorage.getItem(USER_KEY); - if (!userStr || userStr === 'undefined' || userStr === 'null') { - return null; - } - return JSON.parse(userStr); -} - -/** - * 设置当前用户信息 - */ -function setCurrentUser(user) { - localStorage.setItem(USER_KEY, JSON.stringify(user)); -} - -/** - * 检查是否已登录 - */ -function isLoggedIn() { - return !!getToken(); -} - -/** - * 封装的 fetch 请求 - */ -async function request(url, options = {}) { - const token = getToken(); - - const defaultOptions = { - headers: { - 'Content-Type': 'application/json', - ...(token ? { 'Authorization': `Bearer ${token}` } : {}) - } - }; - - const mergedOptions = { - ...defaultOptions, - ...options, - headers: { - ...defaultOptions.headers, - ...options.headers - } - }; - - try { - const response = await fetch(API_BASE_URL + url, mergedOptions); - const data = await response.json(); - - // 处理未授权 - if (data.code === 401 || data.code === 1101 || data.code === 1102) { - removeToken(); - window.location.href = '/login.html'; - return null; - } - - return data; - } catch (error) { - console.error('请求失败:', error); - showMessage('网络请求失败', 'danger'); - return null; - } -} - -/** - * GET 请求 - */ -async function get(url, params = {}) { - const queryString = new URLSearchParams(params).toString(); - const fullUrl = queryString ? `${url}?${queryString}` : url; - return request(fullUrl, { method: 'GET' }); -} - -/** - * POST 请求 - */ -async function post(url, data = {}) { - return request(url, { - method: 'POST', - body: JSON.stringify(data) - }); -} - -/** - * PUT 请求 - */ -async function put(url, data = {}) { - return request(url, { - method: 'PUT', - body: JSON.stringify(data) - }); -} - -/** - * DELETE 请求 - */ -async function del(url) { - return request(url, { method: 'DELETE' }); -} - -/** - * 文件上传 - */ -async function upload(url, file, onProgress) { - const token = getToken(); - const formData = new FormData(); - formData.append('file', file); - - return new Promise((resolve, reject) => { - const xhr = new XMLHttpRequest(); - - xhr.upload.addEventListener('progress', (e) => { - if (e.lengthComputable && onProgress) { - const percent = Math.round((e.loaded / e.total) * 100); - onProgress(percent); - } - }); - - xhr.addEventListener('load', () => { - if (xhr.status === 200) { - resolve(JSON.parse(xhr.responseText)); - } else { - reject(new Error('上传失败')); - } - }); - - xhr.addEventListener('error', () => { - reject(new Error('上传失败')); - }); - - xhr.open('POST', API_BASE_URL + url); - if (token) { - xhr.setRequestHeader('Authorization', `Bearer ${token}`); - } - xhr.send(formData); - }); -} - -/** - * 显示消息提示 (Bootstrap Toast) - * @param {string} text - 消息文本 - * @param {string} type - 类型: success, danger, warning, info - */ -function showMessage(text, type = 'info') { - // 确保toast容器存在 - let container = document.querySelector('.toast-container'); - if (!container) { - container = document.createElement('div'); - container.className = 'toast-container position-fixed top-0 end-0 p-3'; - container.style.zIndex = '1100'; - document.body.appendChild(container); - } - - // 图标映射 - const icons = { - success: 'bi-check-circle-fill', - danger: 'bi-x-circle-fill', - warning: 'bi-exclamation-triangle-fill', - info: 'bi-info-circle-fill' - }; - - // 创建toast元素 - const toastId = 'toast-' + Date.now(); - const toastHtml = ` - - `; - - container.insertAdjacentHTML('beforeend', toastHtml); - - const toastEl = document.getElementById(toastId); - const toast = new bootstrap.Toast(toastEl, { delay: 3000 }); - toast.show(); - - // 自动移除DOM - toastEl.addEventListener('hidden.bs.toast', () => { - toastEl.remove(); - }); -} - -/** - * 显示确认对话框 (Bootstrap Modal) - */ -function showConfirm(text, onConfirm, onCancel) { - // 确保modal容器存在 - let modal = document.getElementById('confirmModal'); - if (!modal) { - const modalHtml = ` - - `; - document.body.insertAdjacentHTML('beforeend', modalHtml); - modal = document.getElementById('confirmModal'); - } - - document.getElementById('confirmModalBody').textContent = text; - - const bsModal = new bootstrap.Modal(modal); - - const okBtn = document.getElementById('confirmModalOk'); - const newOkBtn = okBtn.cloneNode(true); - okBtn.parentNode.replaceChild(newOkBtn, okBtn); - - newOkBtn.addEventListener('click', () => { - bsModal.hide(); - onConfirm && onConfirm(); - }); - - modal.addEventListener('hidden.bs.modal', () => { - // 如果是点击取消或关闭 - }, { once: true }); - - bsModal.show(); -} - -/** - * 格式化日期 - */ -function formatDate(dateStr, format = 'YYYY-MM-DD') { - if (!dateStr) return '-'; - const date = new Date(dateStr); - const year = date.getFullYear(); - const month = String(date.getMonth() + 1).padStart(2, '0'); - const day = String(date.getDate()).padStart(2, '0'); - const hours = String(date.getHours()).padStart(2, '0'); - const minutes = String(date.getMinutes()).padStart(2, '0'); - const seconds = String(date.getSeconds()).padStart(2, '0'); - - return format - .replace('YYYY', year) - .replace('MM', month) - .replace('DD', day) - .replace('HH', hours) - .replace('mm', minutes) - .replace('ss', seconds); -} - -/** - * 格式化日期时间 - */ -function formatDateTime(dateStr) { - return formatDate(dateStr, 'YYYY-MM-DD HH:mm'); -} - -/** - * 格式化文件大小 - */ -function formatFileSize(bytes) { - if (bytes === 0) return '0 B'; - const k = 1024; - const sizes = ['B', 'KB', 'MB', 'GB', 'TB']; - const i = Math.floor(Math.log(bytes) / Math.log(k)); - return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i]; -} - -/** - * 防抖函数 - */ -function debounce(func, wait) { - let timeout; - return function(...args) { - clearTimeout(timeout); - timeout = setTimeout(() => func.apply(this, args), wait); - }; -} - -/** - * 节流函数 - */ -function throttle(func, limit) { - let inThrottle; - return function(...args) { - if (!inThrottle) { - func.apply(this, args); - inThrottle = true; - setTimeout(() => inThrottle = false, limit); - } - }; -} - -/** - * 获取URL参数 - */ -function getUrlParam(name) { - const urlParams = new URLSearchParams(window.location.search); - return urlParams.get(name); -} - -/** - * 生成分页组件 (Bootstrap Pagination) - */ -function renderPagination(current, total, pageSize, onPageChange) { - const totalPages = Math.ceil(total / pageSize); - if (totalPages <= 1) return ''; - - let html = ''; - - // 添加总数信息 - html = `
- 共 ${total} 条记录 - ${html} -
`; - - return html; -} - -/** - * 初始化页面(检查登录状态) - */ -function initPage() { - if (!isLoggedIn()) { - window.location.href = '/login.html'; - return false; - } - initUserInfo(); - initMenuState(); - return true; -} - -/** - * 初始化用户信息显示 - */ -function initUserInfo() { - const user = getCurrentUser(); - if (user) { - const userName = document.getElementById('userName'); - const userAvatar = document.getElementById('userAvatar'); - if (userName) userName.textContent = user.realName || user.username; - if (userAvatar) userAvatar.textContent = (user.realName || user.username).charAt(0); - } -} - -/** - * 初始化菜单展开/折叠状态 - */ -function initMenuState() { - document.querySelectorAll('.menu-group-title').forEach(title => { - title.addEventListener('click', function() { - const group = this.closest('.menu-group'); - group.classList.toggle('collapsed'); - }); - }); -} - -/** - * 退出登录 - */ -function logout() { - showConfirm('确定要退出登录吗?', () => { - removeToken(); - window.location.href = '/login.html'; - }); -} - -/** - * 获取状态标签HTML - */ -function getStatusBadge(status, statusName) { - const statusClass = { - 'DRAFT': 'draft', - 'PUBLISHED': 'published', - 'OFFLINE': 'offline', - 'NOT_STARTED': 'not-started', - 'IN_PROGRESS': 'in-progress', - 'ENDED': 'ended' - }; - return `${statusName || status}`; -} - -/** - * 菜单配置 - 根据角色控制可见性 - * roles: ADMIN=管理员, LECTURER=讲师, STUDENT=学员 - */ -const MENU_CONFIG = [ - { - id: 'dashboard', - name: '工作台', - icon: 'bi-grid-1x2', - url: '/index.html', - roles: ['ADMIN', 'LECTURER', 'STUDENT'] - }, - { - id: 'system', - name: '人员管理', - icon: 'bi-people', - roles: ['ADMIN', 'LECTURER'], - children: [ - { id: 'org', name: '组织架构', url: '/system/org.html', roles: ['ADMIN'] }, - { id: 'user', name: '员工管理', url: '/system/user.html', roles: ['ADMIN', 'LECTURER'] } - ] - }, - { - id: 'knowledge', - name: '知识库', - icon: 'bi-journal-richtext', - roles: ['ADMIN', 'LECTURER', 'STUDENT'], - children: [ - { id: 'knowledge-category', name: '知识分类', url: '/knowledge/category.html', roles: ['ADMIN', 'LECTURER'] }, - { id: 'knowledge-list', name: '知识列表', url: '/knowledge/list.html', roles: ['ADMIN', 'LECTURER', 'STUDENT'] } - ] - }, - { - id: 'question', - name: '考题管理', - icon: 'bi-pencil-square', - roles: ['ADMIN', 'LECTURER'], - children: [ - { id: 'question-category', name: '题库分类', url: '/exam/question-category.html', roles: ['ADMIN', 'LECTURER'] }, - { id: 'question-list', name: '题目列表', url: '/exam/question.html', roles: ['ADMIN', 'LECTURER'] } - ] - }, - { - id: 'paper', - name: '试卷管理', - icon: 'bi-file-earmark-text', - url: '/exam/paper.html', - roles: ['ADMIN', 'LECTURER'] - }, - { - id: 'exam', - name: '考试管理', - icon: 'bi-clipboard-check', - url: '/exam/list.html', - roles: ['ADMIN', 'LECTURER', 'STUDENT'] - }, - { - id: 'training', - name: '培训计划', - icon: 'bi-calendar-check', - url: '/training/plan.html', - roles: ['ADMIN', 'LECTURER', 'STUDENT'] - }, - { - id: 'divider', - type: 'divider', - roles: ['ADMIN'] - }, - { - id: 'setting', - name: '系统设置', - icon: 'bi-gear', - url: '/system/setting.html', - roles: ['ADMIN'] - } -]; - -/** - * 根据角色过滤菜单 - */ -function filterMenuByRole(menuConfig, userRole) { - return menuConfig - .filter(item => item.roles.includes(userRole)) - .map(item => { - if (item.children) { - return { - ...item, - children: item.children.filter(child => child.roles.includes(userRole)) - }; - } - return item; - }) - .filter(item => !item.children || item.children.length > 0); -} - -/** - * 生成侧边栏HTML - */ -function renderSidebar(activeMenu) { - const user = getCurrentUser(); - const userRole = user?.role || 'STUDENT'; - const filteredMenu = filterMenuByRole(MENU_CONFIG, userRole); - - let menuHtml = ''; - filteredMenu.forEach(item => { - if (item.type === 'divider') { - menuHtml += ''; - return; - } - - if (item.children) { - // 判断子菜单是否有激活项 - const hasActiveChild = item.children.some(child => child.id === activeMenu); - menuHtml += ` - - `; - } else { - menuHtml += ` - - - ${item.name} - - `; - } - }); - - return ` - - `; -} - -/** - * 初始化侧边栏(动态渲染到页面) - */ -function initSidebar(activeMenu) { - const sidebarContainer = document.getElementById('sidebarContainer'); - if (sidebarContainer) { - sidebarContainer.innerHTML = renderSidebar(activeMenu); - initMenuState(); - } -} - -/** - * 生成顶部导航HTML - */ -function renderHeader(title, breadcrumb = []) { - let breadcrumbHtml = ''; - if (breadcrumb.length > 0) { - breadcrumbHtml = ` - - `; - } - - return ` -
-
- ${breadcrumbHtml || `${title}`} -
- -
- `; -} - -// 导出全局函数 -window.TrainingSystem = { - getToken, - setToken, - removeToken, - getCurrentUser, - setCurrentUser, - isLoggedIn, - request, - get, - post, - put, - del, - upload, - showMessage, - showConfirm, - formatDate, - formatDateTime, - formatFileSize, - debounce, - throttle, - getUrlParam, - renderPagination, - initPage, - initUserInfo, - initMenuState, - logout, - getStatusBadge, - renderSidebar, - initSidebar, - renderHeader -}; diff --git a/training-system/src/main/resources/static/knowledge/category.html b/training-system/src/main/resources/static/knowledge/category.html deleted file mode 100644 index bcab151..0000000 --- a/training-system/src/main/resources/static/knowledge/category.html +++ /dev/null @@ -1,217 +0,0 @@ - - - - - - 知识分类 - 道路救援培训系统 - - - - - - -
-
- -
-
-
- -
- -
- -
-
-
-
-
-
分类列表
- -
-
-
-
-
-
-
-
-
分类详情
-
-

请从左侧选择一个分类查看详情

-
-
-
-
-
-
-
- - - - - - - - diff --git a/training-system/src/main/resources/static/knowledge/list.html b/training-system/src/main/resources/static/knowledge/list.html deleted file mode 100644 index 4af38f1..0000000 --- a/training-system/src/main/resources/static/knowledge/list.html +++ /dev/null @@ -1,574 +0,0 @@ - - - - - - 知识列表 - 道路救援培训系统 - - - - - - - - -
- -
- - -
- -
-
- -
- -
- - -
-
-
-
- 知识列表 -
- -
-
- -
-
-
- - -
- - - -
-
- -
-
- - -
- - - - - - - - - - - - - - - - - - -
- - 标题分类类型状态创建人创建时间操作
-
-
- 加载中... -
-
-
-
- - - -
-
-
-
-
- - - - - - - - - - diff --git a/training-system/src/main/resources/static/knowledge/view.html b/training-system/src/main/resources/static/knowledge/view.html deleted file mode 100644 index 0bfc6f3..0000000 --- a/training-system/src/main/resources/static/knowledge/view.html +++ /dev/null @@ -1,236 +0,0 @@ - - - - - - 知识学习 - 道路救援培训系统 - - - - - - -
-
-
-
- - -
-
-
-
-
-
- - - - - - diff --git a/training-system/src/main/resources/static/login.html b/training-system/src/main/resources/static/login.html deleted file mode 100644 index d0bcf98..0000000 --- a/training-system/src/main/resources/static/login.html +++ /dev/null @@ -1,365 +0,0 @@ - - - - - - 登录 - 道路救援培训系统 - - - - - - - - - - - - - - - diff --git a/training-system/src/main/resources/static/system/org.html b/training-system/src/main/resources/static/system/org.html deleted file mode 100644 index c6226ad..0000000 --- a/training-system/src/main/resources/static/system/org.html +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - 组织架构 - 道路救援培训系统 - - - - - - -
-
-
-
- - -
-
-
-
-
-
组织架构
-
-
-
-
-
-
组织详情
-

请从左侧选择一个组织查看详情

-
-
-
-
-
-
- - - - - - diff --git a/training-system/src/main/resources/static/system/setting.html b/training-system/src/main/resources/static/system/setting.html deleted file mode 100644 index af32f77..0000000 --- a/training-system/src/main/resources/static/system/setting.html +++ /dev/null @@ -1,318 +0,0 @@ - - - - - - 系统设置 - 道路救援培训系统 - - - - - - -
- -
-
- - -
-
-
- -
- -
-
-
个人信息
-
-
-
-
- - -
-
- -

点击更换头像

-
-
-
-
-
- - -
-
- - -
-
- - -
-
- - -
-
- - -
-
- - -
-
-
- -
-
-
-
-
-
-
- - -
-
-
修改密码
-
-
-
- - -
-
- - -
密码长度至少6位
-
-
- - -
- -
-
-
-
- - -
-
-
系统设置
-
-
-
- - -
-
- -
-
- -
-
-
- - -
新建员工和重置密码时使用的默认密码
-
-
-
考试设置
-
-
- - -
-
- - -
-
-
- -
-
-
-
-
- - -
-
-
关于系统
-
-
-
-
- -
-
-

道路救援企业培训系统

-

版本 1.0.0

-
-
-
- - - - - -
技术框架Spring Boot 3.1.2
前端框架Bootstrap 5.3.2
数据库MySQL 8.0
ORM框架MyBatis Plus
-
-
-

Copyright © 2024 道路救援企业培训系统. All rights reserved.

-
-
-
-
-
-
-
-
-
- - - - - - diff --git a/training-system/src/main/resources/static/system/user.html b/training-system/src/main/resources/static/system/user.html deleted file mode 100644 index f936ffd..0000000 --- a/training-system/src/main/resources/static/system/user.html +++ /dev/null @@ -1,164 +0,0 @@ - - - - - - 员工管理 - 道路救援培训系统 - - - - - -
-
-
-
- - -
-
-
-
员工管理
-
-
-
-
- - - -
-
-
-
- - - -
员工信息用户名部门角色状态创建时间操作
-
- -
-
-
-
-
- - - - - - diff --git a/training-system/src/main/resources/static/training/detail.html b/training-system/src/main/resources/static/training/detail.html deleted file mode 100644 index 398511a..0000000 --- a/training-system/src/main/resources/static/training/detail.html +++ /dev/null @@ -1,185 +0,0 @@ - - - - - - 培训详情 - 道路救援培训系统 - - - - - - -
-
-
-
- - -
-
-
-
-
-
- - - - - - diff --git a/training-system/src/main/resources/static/training/my-training.html b/training-system/src/main/resources/static/training/my-training.html deleted file mode 100644 index e3900d9..0000000 --- a/training-system/src/main/resources/static/training/my-training.html +++ /dev/null @@ -1,180 +0,0 @@ - - - - - - 我的培训 - 道路救援培训系统 - - - - - - -
-
-
-
- - -
-
-
-
-
我的培训
-
-
- -
-
-
-
-
-
-
-
- - - - - - diff --git a/training-system/src/main/resources/static/training/plan-edit.html b/training-system/src/main/resources/static/training/plan-edit.html deleted file mode 100644 index 357b9cf..0000000 --- a/training-system/src/main/resources/static/training/plan-edit.html +++ /dev/null @@ -1,527 +0,0 @@ - - - - - - 编辑培训计划 - 道路救援培训系统 - - - - - - -
-
-
-
- - -
-
-
-
-
-
基本信息
-
-
- -
- - -
-
- - -
-
-
- - -
-
- - -
-
-
-
-
-
-
-
参与人员
- 0 -
-
-
-
- -
-
-
- - -
-
-
-
-
加载中...
-
-
-
-
-
-
-
-
培训内容
- 0 -
-
-
-
- -

请添加培训内容

-
-
-
-
-
- -
添加知识学习
-
-
-
-
- -
添加考试任务
-
-
-
-
-
-
- 返回 - - -
-
-
-
-
-
- - - - - - - - - - - - diff --git a/training-system/src/main/resources/static/training/plan.html b/training-system/src/main/resources/static/training/plan.html deleted file mode 100644 index 994bf7a..0000000 --- a/training-system/src/main/resources/static/training/plan.html +++ /dev/null @@ -1,205 +0,0 @@ - - - - - - 培训计划 - 道路救援培训系统 - - - - - - -
-
-
-
- - -
-
-
-
-
培训计划
- 创建计划 -
-
-
-
-
- - -
- -
-
- -
-
-
-
-
- -
-
-
-
-
- - - - - - diff --git a/training-system/src/test/java/com/sino/training/common/utils/JwtUtilsTest.java b/training-system/src/test/java/com/sino/training/common/utils/JwtUtilsTest.java deleted file mode 100644 index 8bd9cc9..0000000 --- a/training-system/src/test/java/com/sino/training/common/utils/JwtUtilsTest.java +++ /dev/null @@ -1,310 +0,0 @@ -package com.sino.training.common.utils; - -import com.auth0.jwt.interfaces.DecodedJWT; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.springframework.test.util.ReflectionTestUtils; - -import static org.assertj.core.api.Assertions.*; - -/** - * JWT工具类单元测试 - * - * @author testing - */ -@DisplayName("JWT工具类测试") -class JwtUtilsTest { - - private JwtUtils jwtUtils; - - private static final String TEST_SECRET = "test-secret-key-for-jwt-signing-2026"; - private static final long TEST_EXPIRE = 3600000L; // 1小时 - - @BeforeEach - void setUp() { - jwtUtils = new JwtUtils(); - ReflectionTestUtils.setField(jwtUtils, "secret", TEST_SECRET); - ReflectionTestUtils.setField(jwtUtils, "expire", TEST_EXPIRE); - } - - @Nested - @DisplayName("生成Token测试") - class GenerateTokenTest { - - @Test - @DisplayName("正常生成Token - 应返回有效的JWT字符串") - void generateToken_ValidInput_ReturnsToken() { - // Act - String token = jwtUtils.generateToken(1L, "admin", "ADMIN", 1L); - - // Assert - assertThat(token).isNotNull(); - assertThat(token).isNotEmpty(); - assertThat(token.split("\\.")).hasSize(3); // JWT格式: header.payload.signature - } - - @Test - @DisplayName("不同用户生成不同Token") - void generateToken_DifferentUsers_ReturnsDifferentTokens() { - // Act - String token1 = jwtUtils.generateToken(1L, "user1", "ADMIN", 1L); - String token2 = jwtUtils.generateToken(2L, "user2", "STUDENT", 2L); - - // Assert - assertThat(token1).isNotEqualTo(token2); - } - - @Test - @DisplayName("同一用户多次生成Token - JWT时间戳精度为秒,同秒内生成的Token可能相同") - void generateToken_SameUser_TokensContainSameUserInfo() throws InterruptedException { - // Act - String token1 = jwtUtils.generateToken(1L, "admin", "ADMIN", 1L); - Thread.sleep(1100); // 等待超过1秒确保时间戳不同 - String token2 = jwtUtils.generateToken(1L, "admin", "ADMIN", 1L); - - // Assert - 两个Token应该都是有效的,包含相同的用户信息 - assertThat(jwtUtils.getUserId(token1)).isEqualTo(1L); - assertThat(jwtUtils.getUserId(token2)).isEqualTo(1L); - assertThat(jwtUtils.getUsername(token1)).isEqualTo("admin"); - assertThat(jwtUtils.getUsername(token2)).isEqualTo("admin"); - // 时间戳超过1秒后生成的Token应该不同 - assertThat(token1).isNotEqualTo(token2); - } - } - - @Nested - @DisplayName("验证Token测试") - class VerifyTokenTest { - - @Test - @DisplayName("有效Token - 应返回DecodedJWT") - void verifyToken_ValidToken_ReturnsDecodedJWT() { - // Arrange - String token = jwtUtils.generateToken(1L, "admin", "ADMIN", 1L); - - // Act - DecodedJWT jwt = jwtUtils.verifyToken(token); - - // Assert - assertThat(jwt).isNotNull(); - assertThat(jwt.getSubject()).isEqualTo("1"); - assertThat(jwt.getClaim("username").asString()).isEqualTo("admin"); - assertThat(jwt.getClaim("role").asString()).isEqualTo("ADMIN"); - assertThat(jwt.getClaim("departmentId").asLong()).isEqualTo(1L); - } - - @Test - @DisplayName("无效Token - 应返回null") - void verifyToken_InvalidToken_ReturnsNull() { - // Act - DecodedJWT jwt = jwtUtils.verifyToken("invalid.token.here"); - - // Assert - assertThat(jwt).isNull(); - } - - @Test - @DisplayName("空Token - 应返回null") - void verifyToken_EmptyToken_ReturnsNull() { - // Act - DecodedJWT jwt = jwtUtils.verifyToken(""); - - // Assert - assertThat(jwt).isNull(); - } - - @Test - @DisplayName("null Token - 应返回null") - void verifyToken_NullToken_ReturnsNull() { - // Act - DecodedJWT jwt = jwtUtils.verifyToken(null); - - // Assert - assertThat(jwt).isNull(); - } - - @Test - @DisplayName("被篡改的Token - 应返回null") - void verifyToken_TamperedToken_ReturnsNull() { - // Arrange - String token = jwtUtils.generateToken(1L, "admin", "ADMIN", 1L); - String tamperedToken = token.substring(0, token.length() - 5) + "xxxxx"; - - // Act - DecodedJWT jwt = jwtUtils.verifyToken(tamperedToken); - - // Assert - assertThat(jwt).isNull(); - } - - @Test - @DisplayName("错误密钥签名的Token - 应返回null") - void verifyToken_WrongSecret_ReturnsNull() { - // Arrange - 用不同密钥生成Token - JwtUtils otherJwtUtils = new JwtUtils(); - ReflectionTestUtils.setField(otherJwtUtils, "secret", "different-secret-key"); - ReflectionTestUtils.setField(otherJwtUtils, "expire", TEST_EXPIRE); - String token = otherJwtUtils.generateToken(1L, "admin", "ADMIN", 1L); - - // Act - 用原密钥验证 - DecodedJWT jwt = jwtUtils.verifyToken(token); - - // Assert - assertThat(jwt).isNull(); - } - } - - @Nested - @DisplayName("获取用户ID测试") - class GetUserIdTest { - - @Test - @DisplayName("有效Token - 应返回正确的用户ID") - void getUserId_ValidToken_ReturnsUserId() { - // Arrange - String token = jwtUtils.generateToken(123L, "testuser", "STUDENT", null); - - // Act - Long userId = jwtUtils.getUserId(token); - - // Assert - assertThat(userId).isEqualTo(123L); - } - - @Test - @DisplayName("无效Token - 应返回null") - void getUserId_InvalidToken_ReturnsNull() { - // Act - Long userId = jwtUtils.getUserId("invalid.token"); - - // Assert - assertThat(userId).isNull(); - } - } - - @Nested - @DisplayName("获取用户名测试") - class GetUsernameTest { - - @Test - @DisplayName("有效Token - 应返回正确的用户名") - void getUsername_ValidToken_ReturnsUsername() { - // Arrange - String token = jwtUtils.generateToken(1L, "testuser", "ADMIN", null); - - // Act - String username = jwtUtils.getUsername(token); - - // Assert - assertThat(username).isEqualTo("testuser"); - } - - @Test - @DisplayName("无效Token - 应返回null") - void getUsername_InvalidToken_ReturnsNull() { - // Act - String username = jwtUtils.getUsername("invalid.token"); - - // Assert - assertThat(username).isNull(); - } - } - - @Nested - @DisplayName("获取角色测试") - class GetRoleTest { - - @Test - @DisplayName("有效Token - 应返回正确的角色") - void getRole_ValidToken_ReturnsRole() { - // Arrange - String token = jwtUtils.generateToken(1L, "admin", "ADMIN", null); - - // Act - String role = jwtUtils.getRole(token); - - // Assert - assertThat(role).isEqualTo("ADMIN"); - } - - @Test - @DisplayName("不同角色Token - 应返回对应角色") - void getRole_DifferentRoles_ReturnsCorrectRole() { - // Arrange & Act & Assert - assertThat(jwtUtils.getRole(jwtUtils.generateToken(1L, "u1", "ADMIN", null))).isEqualTo("ADMIN"); - assertThat(jwtUtils.getRole(jwtUtils.generateToken(2L, "u2", "LECTURER", null))).isEqualTo("LECTURER"); - assertThat(jwtUtils.getRole(jwtUtils.generateToken(3L, "u3", "STUDENT", null))).isEqualTo("STUDENT"); - } - } - - @Nested - @DisplayName("Token过期测试") - class IsTokenExpiredTest { - - @Test - @DisplayName("未过期Token - 应返回false") - void isTokenExpired_ValidToken_ReturnsFalse() { - // Arrange - String token = jwtUtils.generateToken(1L, "admin", "ADMIN", null); - - // Act - boolean expired = jwtUtils.isTokenExpired(token); - - // Assert - assertThat(expired).isFalse(); - } - - @Test - @DisplayName("过期Token - 应返回true") - void isTokenExpired_ExpiredToken_ReturnsTrue() { - // Arrange - 创建一个立即过期的JwtUtils - JwtUtils expiredJwtUtils = new JwtUtils(); - ReflectionTestUtils.setField(expiredJwtUtils, "secret", TEST_SECRET); - ReflectionTestUtils.setField(expiredJwtUtils, "expire", -1000L); // 负数表示已过期 - - String token = expiredJwtUtils.generateToken(1L, "admin", "ADMIN", null); - - // Act - boolean expired = jwtUtils.isTokenExpired(token); - - // Assert - assertThat(expired).isTrue(); - } - - @Test - @DisplayName("无效Token - 应返回true") - void isTokenExpired_InvalidToken_ReturnsTrue() { - // Act - boolean expired = jwtUtils.isTokenExpired("invalid.token"); - - // Assert - assertThat(expired).isTrue(); - } - } - - @Nested - @DisplayName("Token完整性测试") - class TokenIntegrityTest { - - @Test - @DisplayName("Token应包含所有必要信息") - void token_ContainsAllClaims() { - // Arrange - String token = jwtUtils.generateToken(999L, "fulluser", "LECTURER", null); - - // Act - DecodedJWT jwt = jwtUtils.verifyToken(token); - - // Assert - assertThat(jwt).isNotNull(); - assertThat(jwt.getSubject()).isEqualTo("999"); // userId - assertThat(jwt.getClaim("username").asString()).isEqualTo("fulluser"); - assertThat(jwt.getClaim("role").asString()).isEqualTo("LECTURER"); - assertThat(jwt.getIssuedAt()).isNotNull(); - assertThat(jwt.getExpiresAt()).isNotNull(); - assertThat(jwt.getExpiresAt()).isAfter(jwt.getIssuedAt()); - } - } -} diff --git a/training-system/src/test/java/com/sino/training/module/auth/LoginIntegrationTest.java b/training-system/src/test/java/com/sino/training/module/auth/LoginIntegrationTest.java deleted file mode 100644 index 9bf3019..0000000 --- a/training-system/src/test/java/com/sino/training/module/auth/LoginIntegrationTest.java +++ /dev/null @@ -1,275 +0,0 @@ -package com.sino.training.module.auth; - -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.sino.training.module.auth.dto.LoginRequest; -import org.junit.jupiter.api.*; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.http.MediaType; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.MvcResult; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - -/** - * 登录功能集成测试 - * 测试真实的登录流程,需要数据库连接 - * - * @author testing - */ -@SpringBootTest -@AutoConfigureMockMvc -@DisplayName("登录功能集成测试") -@TestMethodOrder(MethodOrderer.OrderAnnotation.class) -class LoginIntegrationTest { - - @Autowired - private MockMvc mockMvc; - - @Autowired - private ObjectMapper objectMapper; - - private static final String LOGIN_URL = "/api/auth/login"; - private static final String USERINFO_URL = "/api/auth/userinfo"; - - // 保存登录后的Token,供后续测试使用 - private static String authToken; - - @Nested - @DisplayName("场景1: 账号密码登录测试") - @TestMethodOrder(MethodOrderer.OrderAnnotation.class) - class PasswordLoginTest { - - @Test - @Order(1) - @DisplayName("1.1 正确的账号密码 - 应登录成功并返回Token") - void login_CorrectCredentials_Success() throws Exception { - // Arrange - LoginRequest request = new LoginRequest(); - request.setUsername("admin"); - request.setPassword("admin123"); // 正确密码 - - // Act & Assert - MvcResult result = mockMvc.perform(post(LOGIN_URL) - .contentType(MediaType.APPLICATION_JSON) - .content(objectMapper.writeValueAsString(request))) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.code").value(200)) - .andExpect(jsonPath("$.data.token").exists()) - .andExpect(jsonPath("$.data.userId").exists()) - .andExpect(jsonPath("$.data.username").value("admin")) - .andExpect(jsonPath("$.data.role").value("ADMIN")) - .andReturn(); - - // 保存Token供后续测试使用 - String responseBody = result.getResponse().getContentAsString(); - JsonNode jsonNode = objectMapper.readTree(responseBody); - authToken = jsonNode.get("data").get("token").asText(); - - assertThat(authToken).isNotNull(); - assertThat(authToken).isNotEmpty(); - System.out.println("登录成功,获取Token: " + authToken.substring(0, 20) + "..."); - } - - @Test - @Order(2) - @DisplayName("1.2 错误的密码 - 应返回密码错误") - void login_WrongPassword_Fail() throws Exception { - // Arrange - LoginRequest request = new LoginRequest(); - request.setUsername("admin"); - request.setPassword("admin"); // 错误密码 - - // Act & Assert - mockMvc.perform(post(LOGIN_URL) - .contentType(MediaType.APPLICATION_JSON) - .content(objectMapper.writeValueAsString(request))) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.code").value(1003)) // PASSWORD_ERROR - .andExpect(jsonPath("$.message").value("密码错误")); - } - - @Test - @Order(3) - @DisplayName("1.3 不存在的用户名 - 应返回用户不存在") - void login_UserNotFound_Fail() throws Exception { - // Arrange - LoginRequest request = new LoginRequest(); - request.setUsername("nonexistent_user"); - request.setPassword("anypassword"); - - // Act & Assert - mockMvc.perform(post(LOGIN_URL) - .contentType(MediaType.APPLICATION_JSON) - .content(objectMapper.writeValueAsString(request))) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.code").value(1001)) // USER_NOT_FOUND - .andExpect(jsonPath("$.message").value("用户不存在")); - } - - @Test - @Order(4) - @DisplayName("1.4 空用户名 - 应返回验证错误") - void login_EmptyUsername_Fail() throws Exception { - // Arrange - LoginRequest request = new LoginRequest(); - request.setUsername(""); - request.setPassword("admin123"); - - // Act & Assert - mockMvc.perform(post(LOGIN_URL) - .contentType(MediaType.APPLICATION_JSON) - .content(objectMapper.writeValueAsString(request))) - .andExpect(status().isBadRequest()); - } - - @Test - @Order(5) - @DisplayName("1.5 空密码 - 应返回验证错误") - void login_EmptyPassword_Fail() throws Exception { - // Arrange - LoginRequest request = new LoginRequest(); - request.setUsername("admin"); - request.setPassword(""); - - // Act & Assert - mockMvc.perform(post(LOGIN_URL) - .contentType(MediaType.APPLICATION_JSON) - .content(objectMapper.writeValueAsString(request))) - .andExpect(status().isBadRequest()); - } - - @Test - @Order(6) - @DisplayName("1.6 用户名和密码都为空 - 应返回验证错误") - void login_EmptyCredentials_Fail() throws Exception { - // Arrange - LoginRequest request = new LoginRequest(); - request.setUsername(""); - request.setPassword(""); - - // Act & Assert - mockMvc.perform(post(LOGIN_URL) - .contentType(MediaType.APPLICATION_JSON) - .content(objectMapper.writeValueAsString(request))) - .andExpect(status().isBadRequest()); - } - } - - @Nested - @DisplayName("场景2: Token验证测试") - @TestMethodOrder(MethodOrderer.OrderAnnotation.class) - class TokenValidationTest { - - @Test - @Order(1) - @DisplayName("2.1 使用有效Token获取用户信息 - 应成功") - void getUserInfo_WithValidToken_Success() throws Exception { - // 先登录获取Token - LoginRequest request = new LoginRequest(); - request.setUsername("admin"); - request.setPassword("admin123"); - - MvcResult loginResult = mockMvc.perform(post(LOGIN_URL) - .contentType(MediaType.APPLICATION_JSON) - .content(objectMapper.writeValueAsString(request))) - .andReturn(); - - String responseBody = loginResult.getResponse().getContentAsString(); - JsonNode jsonNode = objectMapper.readTree(responseBody); - String token = jsonNode.get("data").get("token").asText(); - - // 使用Token获取用户信息 - mockMvc.perform(get(USERINFO_URL) - .header("Authorization", "Bearer " + token)) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.code").value(200)) - .andExpect(jsonPath("$.data.userId").exists()) - .andExpect(jsonPath("$.data.username").value("admin")) - .andExpect(jsonPath("$.data.realName").value("系统管理员")) - .andExpect(jsonPath("$.data.role").value("ADMIN")); - } - - @Test - @Order(2) - @DisplayName("2.2 不携带Token访问受保护接口 - 应返回未授权") - void getUserInfo_WithoutToken_Unauthorized() throws Exception { - mockMvc.perform(get(USERINFO_URL)) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.code").value(1101)); // UNAUTHORIZED - } - - @Test - @Order(3) - @DisplayName("2.3 使用无效Token - 应返回未授权") - void getUserInfo_WithInvalidToken_Unauthorized() throws Exception { - mockMvc.perform(get(USERINFO_URL) - .header("Authorization", "Bearer invalid.token.here")) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.code").value(1101)); // UNAUTHORIZED - } - - @Test - @Order(4) - @DisplayName("2.4 Token格式错误(无Bearer前缀) - 应返回未授权") - void getUserInfo_WithoutBearerPrefix_Unauthorized() throws Exception { - // 先登录获取Token - LoginRequest request = new LoginRequest(); - request.setUsername("admin"); - request.setPassword("admin123"); - - MvcResult loginResult = mockMvc.perform(post(LOGIN_URL) - .contentType(MediaType.APPLICATION_JSON) - .content(objectMapper.writeValueAsString(request))) - .andReturn(); - - String responseBody = loginResult.getResponse().getContentAsString(); - JsonNode jsonNode = objectMapper.readTree(responseBody); - String token = jsonNode.get("data").get("token").asText(); - - // 不加Bearer前缀 - mockMvc.perform(get(USERINFO_URL) - .header("Authorization", token)) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.code").value(1101)); // UNAUTHORIZED - } - } - - @Nested - @DisplayName("场景3: 登录响应数据完整性测试") - class LoginResponseTest { - - @Test - @DisplayName("3.1 登录成功后应返回完整的用户信息") - void login_Success_ReturnsCompleteUserInfo() throws Exception { - // Arrange - LoginRequest request = new LoginRequest(); - request.setUsername("admin"); - request.setPassword("admin123"); - - // Act & Assert - mockMvc.perform(post(LOGIN_URL) - .contentType(MediaType.APPLICATION_JSON) - .content(objectMapper.writeValueAsString(request))) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.code").value(200)) - .andExpect(jsonPath("$.message").value("success")) - // 验证Token - .andExpect(jsonPath("$.data.token").isString()) - .andExpect(jsonPath("$.data.token").isNotEmpty()) - // 验证用户基本信息 - .andExpect(jsonPath("$.data.userId").isNumber()) - .andExpect(jsonPath("$.data.username").value("admin")) - .andExpect(jsonPath("$.data.realName").value("系统管理员")) - .andExpect(jsonPath("$.data.role").value("ADMIN")) - // 验证部门信息 - .andExpect(jsonPath("$.data.departmentId").exists()); - } - } -} diff --git a/training-system/src/test/java/com/sino/training/module/auth/PasswordEncoderTest.java b/training-system/src/test/java/com/sino/training/module/auth/PasswordEncoderTest.java deleted file mode 100644 index 7ad3a34..0000000 --- a/training-system/src/test/java/com/sino/training/module/auth/PasswordEncoderTest.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.sino.training.module.auth; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; - -import static org.assertj.core.api.Assertions.assertThat; - -/** - * 密码编码测试 - 用于验证和生成BCrypt密码 - */ -@DisplayName("密码编码测试") -class PasswordEncoderTest { - - private final BCryptPasswordEncoder encoder = new BCryptPasswordEncoder(); - - // 数据库中存储的密码哈希(已修正) - private static final String DB_PASSWORD_HASH = "$2a$10$TWbA.Dgh6pjuVoLZzRod3usjs7fOyyofpTVCi1mz.okHtO55vGgBW"; - - @Test - @DisplayName("验证 'admin123' 是否匹配数据库密码") - void verify_admin123_matches_db_password() { - boolean matches = encoder.matches("admin123", DB_PASSWORD_HASH); - System.out.println("'admin123' 匹配数据库密码: " + matches); - assertThat(matches).isTrue(); - } - - @Test - @DisplayName("验证 'admin' 是否匹配数据库密码") - void verify_admin_matches_db_password() { - boolean matches = encoder.matches("admin", DB_PASSWORD_HASH); - System.out.println("'admin' 匹配数据库密码: " + matches); - // 预期不匹配 - assertThat(matches).isFalse(); - } - - @Test - @DisplayName("生成 'admin123' 的BCrypt密码") - void generate_bcrypt_for_admin123() { - String encoded = encoder.encode("admin123"); - System.out.println("'admin123' 的BCrypt密码: " + encoded); - - // 验证生成的密码可以匹配 - assertThat(encoder.matches("admin123", encoded)).isTrue(); - } - - @Test - @DisplayName("生成 'admin' 的BCrypt密码") - void generate_bcrypt_for_admin() { - String encoded = encoder.encode("admin"); - System.out.println("'admin' 的BCrypt密码: " + encoded); - System.out.println("如果要使用 'admin' 作为密码,请更新数据库中的password字段为上面的值"); - - // 验证生成的密码可以匹配 - assertThat(encoder.matches("admin", encoded)).isTrue(); - } -} diff --git a/training-system/src/test/java/com/sino/training/module/auth/controller/AuthControllerTest.java b/training-system/src/test/java/com/sino/training/module/auth/controller/AuthControllerTest.java deleted file mode 100644 index e6242eb..0000000 --- a/training-system/src/test/java/com/sino/training/module/auth/controller/AuthControllerTest.java +++ /dev/null @@ -1,282 +0,0 @@ -package com.sino.training.module.auth.controller; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.sino.training.common.exception.BusinessException; -import com.sino.training.common.exception.GlobalExceptionHandler; -import com.sino.training.common.result.ResultCode; -import com.sino.training.module.auth.dto.LoginRequest; -import com.sino.training.module.auth.dto.LoginResponse; -import com.sino.training.module.auth.dto.UserInfoResponse; -import com.sino.training.module.auth.service.AuthService; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.junit.jupiter.MockitoExtension; -import org.springframework.http.MediaType; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.setup.MockMvcBuilders; - -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.*; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; - -/** - * 认证控制器单元测试 - * - * @author testing - */ -@ExtendWith(MockitoExtension.class) -@DisplayName("认证控制器测试") -class AuthControllerTest { - - private MockMvc mockMvc; - - private ObjectMapper objectMapper; - - @Mock - private AuthService authService; - - @InjectMocks - private AuthController authController; - - private static final String BASE_URL = "/api/auth"; - - @BeforeEach - void setUp() { - objectMapper = new ObjectMapper(); - objectMapper.findAndRegisterModules(); - - mockMvc = MockMvcBuilders.standaloneSetup(authController) - .setControllerAdvice(new GlobalExceptionHandler()) - .build(); - } - - @Nested - @DisplayName("POST /login - 账号密码登录") - class LoginTest { - - @Test - @DisplayName("有效凭证登录 - 应返回200和Token") - void login_ValidCredentials_ReturnsOkWithToken() throws Exception { - // Arrange - LoginRequest request = new LoginRequest(); - request.setUsername("admin"); - request.setPassword("123456"); - - LoginResponse response = new LoginResponse(); - response.setToken("mock.jwt.token"); - response.setUserId(1L); - response.setUsername("admin"); - response.setRealName("管理员"); - response.setRole("ADMIN"); - response.setDepartmentId(1L); - response.setDepartmentName("总部"); - - when(authService.login(any(LoginRequest.class))).thenReturn(response); - - // Act & Assert - mockMvc.perform(post(BASE_URL + "/login") - .contentType(MediaType.APPLICATION_JSON) - .content(objectMapper.writeValueAsString(request))) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.code").value(200)) - .andExpect(jsonPath("$.data.token").value("mock.jwt.token")) - .andExpect(jsonPath("$.data.userId").value(1)) - .andExpect(jsonPath("$.data.username").value("admin")) - .andExpect(jsonPath("$.data.realName").value("管理员")) - .andExpect(jsonPath("$.data.role").value("ADMIN")) - .andExpect(jsonPath("$.data.departmentName").value("总部")); - - verify(authService, times(1)).login(any(LoginRequest.class)); - } - - @Test - @DisplayName("用户名为空 - 应返回400验证错误") - void login_EmptyUsername_ReturnsBadRequest() throws Exception { - // Arrange - LoginRequest request = new LoginRequest(); - request.setUsername(""); // 空用户名 - request.setPassword("123456"); - - // Act & Assert - mockMvc.perform(post(BASE_URL + "/login") - .contentType(MediaType.APPLICATION_JSON) - .content(objectMapper.writeValueAsString(request))) - .andExpect(status().isBadRequest()); - - verify(authService, never()).login(any()); - } - - @Test - @DisplayName("密码为空 - 应返回400验证错误") - void login_EmptyPassword_ReturnsBadRequest() throws Exception { - // Arrange - LoginRequest request = new LoginRequest(); - request.setUsername("admin"); - request.setPassword(""); // 空密码 - - // Act & Assert - mockMvc.perform(post(BASE_URL + "/login") - .contentType(MediaType.APPLICATION_JSON) - .content(objectMapper.writeValueAsString(request))) - .andExpect(status().isBadRequest()); - - verify(authService, never()).login(any()); - } - - @Test - @DisplayName("用户名和密码都为空 - 应返回400验证错误") - void login_EmptyCredentials_ReturnsBadRequest() throws Exception { - // Arrange - LoginRequest request = new LoginRequest(); - request.setUsername(""); - request.setPassword(""); - - // Act & Assert - mockMvc.perform(post(BASE_URL + "/login") - .contentType(MediaType.APPLICATION_JSON) - .content(objectMapper.writeValueAsString(request))) - .andExpect(status().isBadRequest()); - - verify(authService, never()).login(any()); - } - - @Test - @DisplayName("用户不存在 - 应返回业务错误码") - void login_UserNotFound_ReturnsBusinessError() throws Exception { - // Arrange - LoginRequest request = new LoginRequest(); - request.setUsername("nonexistent"); - request.setPassword("123456"); - - when(authService.login(any(LoginRequest.class))) - .thenThrow(new BusinessException(ResultCode.USER_NOT_FOUND)); - - // Act & Assert - mockMvc.perform(post(BASE_URL + "/login") - .contentType(MediaType.APPLICATION_JSON) - .content(objectMapper.writeValueAsString(request))) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.code").value(ResultCode.USER_NOT_FOUND.getCode())); - } - - @Test - @DisplayName("密码错误 - 应返回PASSWORD_ERROR错误码") - void login_WrongPassword_ReturnsPasswordError() throws Exception { - // Arrange - LoginRequest request = new LoginRequest(); - request.setUsername("admin"); - request.setPassword("wrongpassword"); - - when(authService.login(any(LoginRequest.class))) - .thenThrow(new BusinessException(ResultCode.PASSWORD_ERROR)); - - // Act & Assert - mockMvc.perform(post(BASE_URL + "/login") - .contentType(MediaType.APPLICATION_JSON) - .content(objectMapper.writeValueAsString(request))) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.code").value(ResultCode.PASSWORD_ERROR.getCode())); - } - - @Test - @DisplayName("用户被禁用 - 应返回USER_DISABLED错误码") - void login_UserDisabled_ReturnsUserDisabledError() throws Exception { - // Arrange - LoginRequest request = new LoginRequest(); - request.setUsername("admin"); - request.setPassword("123456"); - - when(authService.login(any(LoginRequest.class))) - .thenThrow(new BusinessException(ResultCode.USER_DISABLED)); - - // Act & Assert - mockMvc.perform(post(BASE_URL + "/login") - .contentType(MediaType.APPLICATION_JSON) - .content(objectMapper.writeValueAsString(request))) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.code").value(ResultCode.USER_DISABLED.getCode())); - } - - @Test - @DisplayName("请求体为空 - 应返回400错误") - void login_NullBody_ReturnsBadRequest() throws Exception { - // Act & Assert - mockMvc.perform(post(BASE_URL + "/login") - .contentType(MediaType.APPLICATION_JSON) - .content("{}")) - .andExpect(status().isBadRequest()); - - verify(authService, never()).login(any()); - } - } - - @Nested - @DisplayName("GET /userinfo - 获取当前用户信息") - class GetUserInfoTest { - - @Test - @DisplayName("已认证用户 - 应返回用户信息") - void getUserInfo_Authenticated_ReturnsUserInfo() throws Exception { - // Arrange - UserInfoResponse response = new UserInfoResponse(); - response.setUserId(1L); - response.setUsername("admin"); - response.setRealName("管理员"); - response.setRole("ADMIN"); - response.setDepartmentId(1L); - response.setDepartmentName("总部"); - response.setPhone("13800138000"); - - when(authService.getCurrentUserInfo()).thenReturn(response); - - // Act & Assert - mockMvc.perform(get(BASE_URL + "/userinfo")) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.code").value(200)) - .andExpect(jsonPath("$.data.userId").value(1)) - .andExpect(jsonPath("$.data.username").value("admin")) - .andExpect(jsonPath("$.data.realName").value("管理员")) - .andExpect(jsonPath("$.data.role").value("ADMIN")); - - verify(authService, times(1)).getCurrentUserInfo(); - } - - @Test - @DisplayName("未认证用户 - 应返回UNAUTHORIZED错误码") - void getUserInfo_Unauthorized_ReturnsError() throws Exception { - // Arrange - when(authService.getCurrentUserInfo()) - .thenThrow(new BusinessException(ResultCode.UNAUTHORIZED)); - - // Act & Assert - mockMvc.perform(get(BASE_URL + "/userinfo")) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.code").value(ResultCode.UNAUTHORIZED.getCode())); - } - } - - @Nested - @DisplayName("POST /logout - 退出登录") - class LogoutTest { - - @Test - @DisplayName("正常退出 - 应返回200") - void logout_ReturnsOk() throws Exception { - // Arrange - doNothing().when(authService).logout(); - - // Act & Assert - mockMvc.perform(post(BASE_URL + "/logout")) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.code").value(200)); - - verify(authService, times(1)).logout(); - } - } -} diff --git a/training-system/src/test/java/com/sino/training/module/auth/service/AuthServiceTest.java b/training-system/src/test/java/com/sino/training/module/auth/service/AuthServiceTest.java deleted file mode 100644 index 6d0ac68..0000000 --- a/training-system/src/test/java/com/sino/training/module/auth/service/AuthServiceTest.java +++ /dev/null @@ -1,347 +0,0 @@ -package com.sino.training.module.auth.service; - -import com.sino.training.common.context.UserContext; -import com.sino.training.common.context.UserContextHolder; -import com.sino.training.common.enums.UserRole; -import com.sino.training.common.enums.UserStatus; -import com.sino.training.common.exception.BusinessException; -import com.sino.training.common.result.ResultCode; -import com.sino.training.common.utils.JwtUtils; -import com.sino.training.module.auth.dto.LoginRequest; -import com.sino.training.module.auth.dto.LoginResponse; -import com.sino.training.module.auth.dto.UserInfoResponse; -import com.sino.training.module.auth.service.impl.AuthServiceImpl; -import com.sino.training.module.system.entity.Department; -import com.sino.training.module.system.entity.User; -import com.sino.training.module.system.mapper.DepartmentMapper; -import com.sino.training.module.system.mapper.GroupMapper; -import com.sino.training.module.system.mapper.UserMapper; -import org.junit.jupiter.api.*; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.junit.jupiter.MockitoExtension; -import org.springframework.security.crypto.password.PasswordEncoder; - -import static org.assertj.core.api.Assertions.*; -import static org.mockito.ArgumentMatchers.*; -import static org.mockito.Mockito.*; - -/** - * 认证服务单元测试 - * - * @author testing - */ -@ExtendWith(MockitoExtension.class) -@DisplayName("认证服务测试") -class AuthServiceTest { - - @Mock - private UserMapper userMapper; - - @Mock - private DepartmentMapper departmentMapper; - - @Mock - private GroupMapper groupMapper; - - @Mock - private JwtUtils jwtUtils; - - @Mock - private PasswordEncoder passwordEncoder; - - @InjectMocks - private AuthServiceImpl authService; - - private User mockUser; - private Department mockDepartment; - - @BeforeEach - void setUp() { - // 初始化Mock用户 - mockUser = new User(); - mockUser.setId(1L); - mockUser.setUsername("admin"); - mockUser.setPassword("$2a$10$encryptedPassword"); // BCrypt加密后的密码 - mockUser.setRealName("管理员"); - mockUser.setRole(UserRole.ADMIN); - mockUser.setStatus(UserStatus.ENABLED); - mockUser.setDepartmentId(1L); - mockUser.setPhone("13800138000"); - - // 初始化Mock部门 - mockDepartment = new Department(); - mockDepartment.setId(1L); - mockDepartment.setName("总部"); - } - - @AfterEach - void tearDown() { - // 清除用户上下文 - UserContextHolder.clearContext(); - } - - @Nested - @DisplayName("登录测试") - class LoginTest { - - @Test - @DisplayName("正常登录 - 应返回Token和用户信息") - void login_ValidCredentials_ReturnsLoginResponse() { - // Arrange - LoginRequest request = new LoginRequest(); - request.setUsername("admin"); - request.setPassword("123456"); - - when(userMapper.selectOne(any())).thenReturn(mockUser); - when(passwordEncoder.matches("123456", mockUser.getPassword())).thenReturn(true); - when(jwtUtils.generateToken(eq(1L), eq("admin"), eq("ADMIN"), eq(1L))) - .thenReturn("mock.jwt.token"); - when(departmentMapper.selectById(1L)).thenReturn(mockDepartment); - - // Act - LoginResponse response = authService.login(request); - - // Assert - assertThat(response).isNotNull(); - assertThat(response.getToken()).isEqualTo("mock.jwt.token"); - assertThat(response.getUserId()).isEqualTo(1L); - assertThat(response.getUsername()).isEqualTo("admin"); - assertThat(response.getRealName()).isEqualTo("管理员"); - assertThat(response.getRole()).isEqualTo("ADMIN"); - assertThat(response.getDepartmentName()).isEqualTo("总部"); - - verify(userMapper, times(1)).selectOne(any()); - verify(passwordEncoder, times(1)).matches("123456", mockUser.getPassword()); - verify(jwtUtils, times(1)).generateToken(1L, "admin", "ADMIN", 1L); - } - - @Test - @DisplayName("用户不存在 - 应抛出USER_NOT_FOUND异常") - void login_UserNotFound_ThrowsException() { - // Arrange - LoginRequest request = new LoginRequest(); - request.setUsername("nonexistent"); - request.setPassword("123456"); - - when(userMapper.selectOne(any())).thenReturn(null); - - // Act & Assert - assertThatThrownBy(() -> authService.login(request)) - .isInstanceOf(BusinessException.class) - .satisfies(e -> { - BusinessException be = (BusinessException) e; - assertThat(be.getCode()).isEqualTo(ResultCode.USER_NOT_FOUND.getCode()); - }); - - verify(userMapper, times(1)).selectOne(any()); - verify(passwordEncoder, never()).matches(anyString(), anyString()); - } - - @Test - @DisplayName("密码错误 - 应抛出PASSWORD_ERROR异常") - void login_WrongPassword_ThrowsException() { - // Arrange - LoginRequest request = new LoginRequest(); - request.setUsername("admin"); - request.setPassword("wrongpassword"); - - when(userMapper.selectOne(any())).thenReturn(mockUser); - when(passwordEncoder.matches("wrongpassword", mockUser.getPassword())).thenReturn(false); - - // Act & Assert - assertThatThrownBy(() -> authService.login(request)) - .isInstanceOf(BusinessException.class) - .satisfies(e -> { - BusinessException be = (BusinessException) e; - assertThat(be.getCode()).isEqualTo(ResultCode.PASSWORD_ERROR.getCode()); - }); - - verify(passwordEncoder, times(1)).matches("wrongpassword", mockUser.getPassword()); - verify(jwtUtils, never()).generateToken(anyLong(), anyString(), anyString(), any()); - } - - @Test - @DisplayName("用户被禁用 - 应抛出USER_DISABLED异常") - void login_UserDisabled_ThrowsException() { - // Arrange - LoginRequest request = new LoginRequest(); - request.setUsername("admin"); - request.setPassword("123456"); - - mockUser.setStatus(UserStatus.DISABLED); - - when(userMapper.selectOne(any())).thenReturn(mockUser); - when(passwordEncoder.matches("123456", mockUser.getPassword())).thenReturn(true); - - // Act & Assert - assertThatThrownBy(() -> authService.login(request)) - .isInstanceOf(BusinessException.class) - .satisfies(e -> { - BusinessException be = (BusinessException) e; - assertThat(be.getCode()).isEqualTo(ResultCode.USER_DISABLED.getCode()); - }); - - verify(jwtUtils, never()).generateToken(anyLong(), anyString(), anyString(), any()); - } - - @Test - @DisplayName("登录不同角色用户 - 应返回正确的角色信息") - void login_DifferentRoles_ReturnsCorrectRole() { - // Arrange - 学员角色 - LoginRequest request = new LoginRequest(); - request.setUsername("student"); - request.setPassword("123456"); - - User studentUser = new User(); - studentUser.setId(2L); - studentUser.setUsername("student"); - studentUser.setPassword("$2a$10$encrypted"); - studentUser.setRealName("学员一"); - studentUser.setRole(UserRole.STUDENT); - studentUser.setStatus(UserStatus.ENABLED); - - when(userMapper.selectOne(any())).thenReturn(studentUser); - when(passwordEncoder.matches("123456", studentUser.getPassword())).thenReturn(true); - when(jwtUtils.generateToken(eq(2L), eq("student"), eq("STUDENT"), isNull())) - .thenReturn("student.jwt.token"); - - // Act - LoginResponse response = authService.login(request); - - // Assert - assertThat(response.getRole()).isEqualTo("STUDENT"); - assertThat(response.getUsername()).isEqualTo("student"); - verify(jwtUtils).generateToken(2L, "student", "STUDENT", null); - } - - @Test - @DisplayName("用户无部门 - 应正常登录但部门名称为空") - void login_NoDepartment_ReturnsNullDepartmentName() { - // Arrange - LoginRequest request = new LoginRequest(); - request.setUsername("admin"); - request.setPassword("123456"); - - mockUser.setDepartmentId(null); - - when(userMapper.selectOne(any())).thenReturn(mockUser); - when(passwordEncoder.matches("123456", mockUser.getPassword())).thenReturn(true); - when(jwtUtils.generateToken(eq(1L), eq("admin"), eq("ADMIN"), isNull())) - .thenReturn("mock.jwt.token"); - - // Act - LoginResponse response = authService.login(request); - - // Assert - assertThat(response).isNotNull(); - assertThat(response.getDepartmentId()).isNull(); - assertThat(response.getDepartmentName()).isNull(); - verify(departmentMapper, never()).selectById(anyLong()); - } - } - - @Nested - @DisplayName("获取当前用户信息测试") - class GetCurrentUserInfoTest { - - @Test - @DisplayName("有效上下文 - 应返回用户信息") - void getCurrentUserInfo_ValidContext_ReturnsUserInfo() { - // Arrange - UserContext context = new UserContext(); - context.setUserId(1L); - context.setUsername("admin"); - context.setRole("ADMIN"); - UserContextHolder.setContext(context); - - when(userMapper.selectById(1L)).thenReturn(mockUser); - when(departmentMapper.selectById(1L)).thenReturn(mockDepartment); - - // Act - UserInfoResponse response = authService.getCurrentUserInfo(); - - // Assert - assertThat(response).isNotNull(); - assertThat(response.getUserId()).isEqualTo(1L); - assertThat(response.getUsername()).isEqualTo("admin"); - assertThat(response.getRealName()).isEqualTo("管理员"); - assertThat(response.getRole()).isEqualTo("ADMIN"); - assertThat(response.getDepartmentName()).isEqualTo("总部"); - } - - @Test - @DisplayName("无上下文 - 应抛出UNAUTHORIZED异常") - void getCurrentUserInfo_NoContext_ThrowsException() { - // Arrange - 确保没有上下文 - UserContextHolder.clearContext(); - - // Act & Assert - assertThatThrownBy(() -> authService.getCurrentUserInfo()) - .isInstanceOf(BusinessException.class) - .satisfies(e -> { - BusinessException be = (BusinessException) e; - assertThat(be.getCode()).isEqualTo(ResultCode.UNAUTHORIZED.getCode()); - }); - } - - @Test - @DisplayName("上下文用户ID为空 - 应抛出UNAUTHORIZED异常") - void getCurrentUserInfo_NullUserId_ThrowsException() { - // Arrange - UserContext context = new UserContext(); - context.setUserId(null); // 空用户ID - UserContextHolder.setContext(context); - - // Act & Assert - assertThatThrownBy(() -> authService.getCurrentUserInfo()) - .isInstanceOf(BusinessException.class) - .satisfies(e -> { - BusinessException be = (BusinessException) e; - assertThat(be.getCode()).isEqualTo(ResultCode.UNAUTHORIZED.getCode()); - }); - } - - @Test - @DisplayName("用户已被删除 - 应抛出USER_NOT_FOUND异常") - void getCurrentUserInfo_UserDeleted_ThrowsException() { - // Arrange - UserContext context = new UserContext(); - context.setUserId(999L); - UserContextHolder.setContext(context); - - when(userMapper.selectById(999L)).thenReturn(null); - - // Act & Assert - assertThatThrownBy(() -> authService.getCurrentUserInfo()) - .isInstanceOf(BusinessException.class) - .satisfies(e -> { - BusinessException be = (BusinessException) e; - assertThat(be.getCode()).isEqualTo(ResultCode.USER_NOT_FOUND.getCode()); - }); - } - } - - @Nested - @DisplayName("退出登录测试") - class LogoutTest { - - @Test - @DisplayName("正常退出 - 应清除上下文") - void logout_ClearsContext() { - // Arrange - UserContext context = new UserContext(); - context.setUserId(1L); - UserContextHolder.setContext(context); - - // Act - authService.logout(); - - // Assert - logout方法会调用clearContext - // 由于logout内部调用clearContext,而我们afterEach也会调用 - // 这里主要验证不抛异常 - assertThat(UserContextHolder.getContext()).isNull(); - } - } -} diff --git a/training-system/src/test/java/com/sino/training/module/exam/controller/QuestionCategoryControllerTest.java b/training-system/src/test/java/com/sino/training/module/exam/controller/QuestionCategoryControllerTest.java deleted file mode 100644 index 818ff8a..0000000 --- a/training-system/src/test/java/com/sino/training/module/exam/controller/QuestionCategoryControllerTest.java +++ /dev/null @@ -1,329 +0,0 @@ -package com.sino.training.module.exam.controller; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.sino.training.common.exception.BusinessException; -import com.sino.training.common.exception.GlobalExceptionHandler; -import com.sino.training.common.result.ResultCode; -import com.sino.training.module.exam.dto.QuestionCategoryDTO; -import com.sino.training.module.exam.service.QuestionCategoryService; -import com.sino.training.module.exam.vo.QuestionCategoryVO; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.junit.jupiter.MockitoExtension; -import org.springframework.http.MediaType; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.setup.MockMvcBuilders; - -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; - -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.*; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; - -/** - * 题目分类控制器单元测试 - * 使用 MockMvc standalone 模式,不加载Spring Context - * - * @author testing - */ -@ExtendWith(MockitoExtension.class) -@DisplayName("题目分类控制器测试") -class QuestionCategoryControllerTest { - - private MockMvc mockMvc; - - private ObjectMapper objectMapper; - - @Mock - private QuestionCategoryService questionCategoryService; - - @InjectMocks - private QuestionCategoryController questionCategoryController; - - private static final String BASE_URL = "/api/exam/question-category"; - - private QuestionCategoryVO mockCategoryVO; - private List mockCategoryTree; - - @BeforeEach - void setUp() { - objectMapper = new ObjectMapper(); - objectMapper.findAndRegisterModules(); - - // 使用standalone模式,包含全局异常处理器 - mockMvc = MockMvcBuilders.standaloneSetup(questionCategoryController) - .setControllerAdvice(new GlobalExceptionHandler()) - .build(); - - // 初始化Mock分类VO - mockCategoryVO = new QuestionCategoryVO(); - mockCategoryVO.setId(1L); - mockCategoryVO.setName("安全知识"); - mockCategoryVO.setParentId(0L); - mockCategoryVO.setDepartmentId(1L); - mockCategoryVO.setDepartmentName("测试部门"); - mockCategoryVO.setSortOrder(0); - mockCategoryVO.setQuestionCount(10); - mockCategoryVO.setCreateTime(LocalDateTime.now()); - - // 子分类 - QuestionCategoryVO childVO = new QuestionCategoryVO(); - childVO.setId(2L); - childVO.setName("消防安全"); - childVO.setParentId(1L); - childVO.setParentName("安全知识"); - childVO.setDepartmentId(1L); - childVO.setSortOrder(1); - childVO.setQuestionCount(5); - childVO.setChildren(new ArrayList<>()); - - mockCategoryVO.setChildren(List.of(childVO)); - mockCategoryTree = List.of(mockCategoryVO); - } - - @Nested - @DisplayName("GET /tree - 获取分类树") - class GetTreeTest { - - @Test - @DisplayName("无参数获取全部分类树 - 应返回200") - void getTree_NoParams_ReturnsOk() throws Exception { - when(questionCategoryService.getCategoryTree(null)).thenReturn(mockCategoryTree); - - mockMvc.perform(get(BASE_URL + "/tree")) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.code").value(200)) - .andExpect(jsonPath("$.data").isArray()) - .andExpect(jsonPath("$.data[0].name").value("安全知识")) - .andExpect(jsonPath("$.data[0].children").isArray()) - .andExpect(jsonPath("$.data[0].children[0].name").value("消防安全")); - - verify(questionCategoryService, times(1)).getCategoryTree(null); - } - - @Test - @DisplayName("按部门ID筛选分类树 - 应返回200") - void getTree_WithDepartmentId_ReturnsOk() throws Exception { - when(questionCategoryService.getCategoryTree(1L)).thenReturn(mockCategoryTree); - - mockMvc.perform(get(BASE_URL + "/tree") - .param("departmentId", "1")) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.code").value(200)) - .andExpect(jsonPath("$.data").isArray()); - - verify(questionCategoryService, times(1)).getCategoryTree(1L); - } - - @Test - @DisplayName("空数据应返回空数组") - void getTree_EmptyData_ReturnsEmptyArray() throws Exception { - when(questionCategoryService.getCategoryTree(any())).thenReturn(new ArrayList<>()); - - mockMvc.perform(get(BASE_URL + "/tree")) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.code").value(200)) - .andExpect(jsonPath("$.data").isArray()) - .andExpect(jsonPath("$.data").isEmpty()); - } - } - - @Nested - @DisplayName("GET /list - 获取分类列表") - class GetListTest { - - @Test - @DisplayName("获取分类列表 - 应返回200") - void getList_ReturnsOk() throws Exception { - List list = List.of(mockCategoryVO); - when(questionCategoryService.listCategories(null)).thenReturn(list); - - mockMvc.perform(get(BASE_URL + "/list")) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.code").value(200)) - .andExpect(jsonPath("$.data").isArray()) - .andExpect(jsonPath("$.data[0].id").value(1)); - - verify(questionCategoryService, times(1)).listCategories(null); - } - } - - @Nested - @DisplayName("GET /{id} - 获取分类详情") - class GetDetailTest { - - @Test - @DisplayName("获取存在的分类详情 - 应返回200") - void getDetail_Exists_ReturnsOk() throws Exception { - when(questionCategoryService.getCategoryDetail(1L)).thenReturn(mockCategoryVO); - - mockMvc.perform(get(BASE_URL + "/1")) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.code").value(200)) - .andExpect(jsonPath("$.data.id").value(1)) - .andExpect(jsonPath("$.data.name").value("安全知识")) - .andExpect(jsonPath("$.data.questionCount").value(10)); - - verify(questionCategoryService, times(1)).getCategoryDetail(1L); - } - - @Test - @DisplayName("获取不存在的分类详情 - 应返回业务错误码") - void getDetail_NotExists_ReturnsNotFound() throws Exception { - when(questionCategoryService.getCategoryDetail(999L)) - .thenThrow(new BusinessException(ResultCode.CATEGORY_NOT_FOUND)); - - mockMvc.perform(get(BASE_URL + "/999")) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.code").value(ResultCode.CATEGORY_NOT_FOUND.getCode())); - } - } - - @Nested - @DisplayName("POST / - 创建分类") - class CreateTest { - - @Test - @DisplayName("有效数据创建分类 - 应返回200") - void create_ValidData_ReturnsOk() throws Exception { - QuestionCategoryDTO dto = new QuestionCategoryDTO(); - dto.setName("新分类"); - dto.setDepartmentId(1L); - dto.setParentId(0L); - dto.setSortOrder(0); - - when(questionCategoryService.createCategory(any(QuestionCategoryDTO.class))).thenReturn(100L); - - mockMvc.perform(post(BASE_URL) - .contentType(MediaType.APPLICATION_JSON) - .content(objectMapper.writeValueAsString(dto))) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.code").value(200)) - .andExpect(jsonPath("$.data").value(100)); - - verify(questionCategoryService, times(1)).createCategory(any(QuestionCategoryDTO.class)); - } - - @Test - @DisplayName("同名分类已存在应返回业务错误") - void create_DuplicateName_ReturnsBusinessError() throws Exception { - QuestionCategoryDTO dto = new QuestionCategoryDTO(); - dto.setName("已存在分类"); - dto.setDepartmentId(1L); - dto.setParentId(0L); - - when(questionCategoryService.createCategory(any(QuestionCategoryDTO.class))) - .thenThrow(new BusinessException(ResultCode.DATA_EXISTS, "该级别下已存在同名分类")); - - mockMvc.perform(post(BASE_URL) - .contentType(MediaType.APPLICATION_JSON) - .content(objectMapper.writeValueAsString(dto))) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.code").value(ResultCode.DATA_EXISTS.getCode())) - .andExpect(jsonPath("$.message").value("该级别下已存在同名分类")); - } - } - - @Nested - @DisplayName("PUT / - 更新分类") - class UpdateTest { - - @Test - @DisplayName("有效数据更新分类 - 应返回200") - void update_ValidData_ReturnsOk() throws Exception { - QuestionCategoryDTO dto = new QuestionCategoryDTO(); - dto.setId(1L); - dto.setName("更新后的名称"); - dto.setDepartmentId(1L); - dto.setParentId(0L); - - doNothing().when(questionCategoryService).updateCategory(any(QuestionCategoryDTO.class)); - - mockMvc.perform(put(BASE_URL) - .contentType(MediaType.APPLICATION_JSON) - .content(objectMapper.writeValueAsString(dto))) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.code").value(200)); - - verify(questionCategoryService, times(1)).updateCategory(any(QuestionCategoryDTO.class)); - } - - @Test - @DisplayName("分类不存在应返回业务错误") - void update_NotExists_ReturnsBusinessError() throws Exception { - QuestionCategoryDTO dto = new QuestionCategoryDTO(); - dto.setId(999L); - dto.setName("更新名称"); - dto.setDepartmentId(1L); - - doThrow(new BusinessException(ResultCode.CATEGORY_NOT_FOUND)) - .when(questionCategoryService).updateCategory(any(QuestionCategoryDTO.class)); - - mockMvc.perform(put(BASE_URL) - .contentType(MediaType.APPLICATION_JSON) - .content(objectMapper.writeValueAsString(dto))) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.code").value(ResultCode.CATEGORY_NOT_FOUND.getCode())); - } - } - - @Nested - @DisplayName("DELETE /{id} - 删除分类") - class DeleteTest { - - @Test - @DisplayName("删除存在且无依赖的分类 - 应返回200") - void delete_ValidCategory_ReturnsOk() throws Exception { - doNothing().when(questionCategoryService).deleteCategory(1L); - - mockMvc.perform(delete(BASE_URL + "/1")) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.code").value(200)); - - verify(questionCategoryService, times(1)).deleteCategory(1L); - } - - @Test - @DisplayName("删除有子分类的分类 - 应返回业务错误") - void delete_HasChildren_ReturnsBusinessError() throws Exception { - doThrow(new BusinessException(ResultCode.DATA_REFERENCED, "该分类下存在子分类,无法删除")) - .when(questionCategoryService).deleteCategory(1L); - - mockMvc.perform(delete(BASE_URL + "/1")) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.code").value(ResultCode.DATA_REFERENCED.getCode())) - .andExpect(jsonPath("$.message").value("该分类下存在子分类,无法删除")); - } - - @Test - @DisplayName("删除有关联题目的分类 - 应返回业务错误") - void delete_HasQuestions_ReturnsBusinessError() throws Exception { - doThrow(new BusinessException(ResultCode.DATA_REFERENCED, "该分类下存在题目,无法删除")) - .when(questionCategoryService).deleteCategory(2L); - - mockMvc.perform(delete(BASE_URL + "/2")) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.code").value(ResultCode.DATA_REFERENCED.getCode())) - .andExpect(jsonPath("$.message").value("该分类下存在题目,无法删除")); - } - - @Test - @DisplayName("删除不存在的分类 - 应返回404") - void delete_NotExists_ReturnsNotFound() throws Exception { - doThrow(new BusinessException(ResultCode.CATEGORY_NOT_FOUND)) - .when(questionCategoryService).deleteCategory(999L); - - mockMvc.perform(delete(BASE_URL + "/999")) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.code").value(ResultCode.CATEGORY_NOT_FOUND.getCode())); - } - } -} diff --git a/training-system/src/test/java/com/sino/training/module/exam/service/QuestionCategoryServiceTest.java b/training-system/src/test/java/com/sino/training/module/exam/service/QuestionCategoryServiceTest.java deleted file mode 100644 index 0b46c35..0000000 --- a/training-system/src/test/java/com/sino/training/module/exam/service/QuestionCategoryServiceTest.java +++ /dev/null @@ -1,411 +0,0 @@ -package com.sino.training.module.exam.service; - -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.sino.training.common.exception.BusinessException; -import com.sino.training.common.result.ResultCode; -import com.sino.training.module.exam.dto.QuestionCategoryDTO; -import com.sino.training.module.exam.entity.QuestionCategory; -import com.sino.training.module.exam.mapper.QuestionCategoryMapper; -import com.sino.training.module.exam.mapper.QuestionMapper; -import com.sino.training.module.exam.service.impl.QuestionCategoryServiceImpl; -import com.sino.training.module.exam.vo.QuestionCategoryVO; -import com.sino.training.module.system.entity.Department; -import com.sino.training.module.system.mapper.DepartmentMapper; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.Mock; -import org.mockito.junit.jupiter.MockitoExtension; -import org.springframework.test.util.ReflectionTestUtils; - -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; - -import static org.assertj.core.api.Assertions.*; -import static org.mockito.ArgumentMatchers.*; -import static org.mockito.Mockito.*; - -/** - * 题目分类服务单元测试 - * - * @author testing - */ -@ExtendWith(MockitoExtension.class) -@DisplayName("题目分类服务测试") -class QuestionCategoryServiceTest { - - @Mock - private QuestionCategoryMapper questionCategoryMapper; - - @Mock - private DepartmentMapper departmentMapper; - - @Mock - private QuestionMapper questionMapper; - - private QuestionCategoryServiceImpl questionCategoryService; - - private Department mockDepartment; - private QuestionCategory mockCategory; - private QuestionCategory mockParentCategory; - - @BeforeEach - void setUp() { - // 手动创建服务实例并注入mock依赖 - questionCategoryService = new QuestionCategoryServiceImpl(departmentMapper, questionMapper); - // 设置baseMapper用于ServiceImpl内部方法 - ReflectionTestUtils.setField(questionCategoryService, "baseMapper", questionCategoryMapper); - - // 初始化Mock部门 - mockDepartment = new Department(); - mockDepartment.setId(1L); - mockDepartment.setName("测试部门"); - - // 初始化Mock父分类 - mockParentCategory = new QuestionCategory(); - mockParentCategory.setId(1L); - mockParentCategory.setName("父分类"); - mockParentCategory.setParentId(0L); - mockParentCategory.setDepartmentId(1L); - mockParentCategory.setSortOrder(0); - mockParentCategory.setCreateTime(LocalDateTime.now()); - - // 初始化Mock分类 - mockCategory = new QuestionCategory(); - mockCategory.setId(2L); - mockCategory.setName("子分类"); - mockCategory.setParentId(1L); - mockCategory.setDepartmentId(1L); - mockCategory.setSortOrder(1); - mockCategory.setCreateTime(LocalDateTime.now()); - } - - @Nested - @DisplayName("创建分类测试") - class CreateCategoryTest { - - @Test - @DisplayName("正常创建分类 - 应该成功") - void createCategory_Success() { - // Arrange - QuestionCategoryDTO dto = new QuestionCategoryDTO(); - dto.setName("新分类"); - dto.setDepartmentId(1L); - dto.setParentId(0L); - dto.setSortOrder(0); - - when(departmentMapper.selectById(1L)).thenReturn(mockDepartment); - when(questionCategoryMapper.selectCount(any())).thenReturn(0L); - when(questionCategoryMapper.insert(any(QuestionCategory.class))).thenAnswer(invocation -> { - QuestionCategory category = invocation.getArgument(0); - category.setId(100L); - return 1; - }); - - // Act - Long result = questionCategoryService.createCategory(dto); - - // Assert - assertThat(result).isEqualTo(100L); - verify(questionCategoryMapper, times(1)).insert(any(QuestionCategory.class)); - } - - @Test - @DisplayName("创建分类 - 部门不存在应抛出异常") - void createCategory_DepartmentNotFound_ThrowsException() { - // Arrange - QuestionCategoryDTO dto = new QuestionCategoryDTO(); - dto.setName("新分类"); - dto.setDepartmentId(999L); - dto.setParentId(0L); - - when(departmentMapper.selectById(999L)).thenReturn(null); - - // Act & Assert - assertThatThrownBy(() -> questionCategoryService.createCategory(dto)) - .isInstanceOf(BusinessException.class) - .hasMessageContaining("部门不存在"); - } - - @Test - @DisplayName("创建分类 - 父分类不存在应抛出异常") - void createCategory_ParentNotFound_ThrowsException() { - // Arrange - QuestionCategoryDTO dto = new QuestionCategoryDTO(); - dto.setName("新分类"); - dto.setDepartmentId(1L); - dto.setParentId(999L); - - when(departmentMapper.selectById(1L)).thenReturn(mockDepartment); - when(questionCategoryMapper.selectById(999L)).thenReturn(null); - - // Act & Assert - assertThatThrownBy(() -> questionCategoryService.createCategory(dto)) - .isInstanceOf(BusinessException.class) - .hasMessageContaining("父分类不存在"); - } - - @Test - @DisplayName("创建分类 - 同级同名分类已存在应抛出异常") - void createCategory_DuplicateName_ThrowsException() { - // Arrange - QuestionCategoryDTO dto = new QuestionCategoryDTO(); - dto.setName("已存在分类"); - dto.setDepartmentId(1L); - dto.setParentId(0L); - - when(departmentMapper.selectById(1L)).thenReturn(mockDepartment); - when(questionCategoryMapper.selectCount(any())).thenReturn(1L); - - // Act & Assert - assertThatThrownBy(() -> questionCategoryService.createCategory(dto)) - .isInstanceOf(BusinessException.class) - .hasMessageContaining("同名分类"); - } - - @Test - @DisplayName("创建分类 - parentId为null时应默认为0") - void createCategory_NullParentId_DefaultsToZero() { - // Arrange - QuestionCategoryDTO dto = new QuestionCategoryDTO(); - dto.setName("新分类"); - dto.setDepartmentId(1L); - dto.setParentId(null); - - when(departmentMapper.selectById(1L)).thenReturn(mockDepartment); - when(questionCategoryMapper.selectCount(any())).thenReturn(0L); - when(questionCategoryMapper.insert(any(QuestionCategory.class))).thenAnswer(invocation -> { - QuestionCategory category = invocation.getArgument(0); - assertThat(category.getParentId()).isEqualTo(0L); - category.setId(100L); - return 1; - }); - - // Act - questionCategoryService.createCategory(dto); - - // Assert - verify(questionCategoryMapper).insert(argThat(c -> c.getParentId().equals(0L))); - } - } - - @Nested - @DisplayName("更新分类测试") - class UpdateCategoryTest { - - @Test - @DisplayName("正常更新分类 - 应该成功") - void updateCategory_Success() { - // Arrange - QuestionCategoryDTO dto = new QuestionCategoryDTO(); - dto.setId(2L); - dto.setName("更新后的名称"); - dto.setParentId(1L); - dto.setSortOrder(5); - - when(questionCategoryMapper.selectById(2L)).thenReturn(mockCategory); - when(questionCategoryMapper.selectCount(any())).thenReturn(0L); - when(questionCategoryMapper.updateById(any(QuestionCategory.class))).thenReturn(1); - - // Act - questionCategoryService.updateCategory(dto); - - // Assert - verify(questionCategoryMapper, times(1)).updateById(any(QuestionCategory.class)); - } - - @Test - @DisplayName("更新分类 - ID为空应抛出异常") - void updateCategory_NullId_ThrowsException() { - // Arrange - QuestionCategoryDTO dto = new QuestionCategoryDTO(); - dto.setId(null); - dto.setName("更新名称"); - - // Act & Assert - assertThatThrownBy(() -> questionCategoryService.updateCategory(dto)) - .isInstanceOf(BusinessException.class) - .hasMessageContaining("ID不能为空"); - } - - @Test - @DisplayName("更新分类 - 分类不存在应抛出异常") - void updateCategory_CategoryNotFound_ThrowsException() { - // Arrange - QuestionCategoryDTO dto = new QuestionCategoryDTO(); - dto.setId(999L); - dto.setName("更新名称"); - - when(questionCategoryMapper.selectById(999L)).thenReturn(null); - - // Act & Assert - assertThatThrownBy(() -> questionCategoryService.updateCategory(dto)) - .isInstanceOf(BusinessException.class); - } - - @Test - @DisplayName("更新分类 - 不能将自己设为父分类") - void updateCategory_SelfAsParent_ThrowsException() { - // Arrange - QuestionCategoryDTO dto = new QuestionCategoryDTO(); - dto.setId(2L); - dto.setName("更新名称"); - dto.setParentId(2L); // 自己设为父分类 - - when(questionCategoryMapper.selectById(2L)).thenReturn(mockCategory); - - // Act & Assert - assertThatThrownBy(() -> questionCategoryService.updateCategory(dto)) - .isInstanceOf(BusinessException.class) - .hasMessageContaining("不能将自己设为父分类"); - } - - @Test - @DisplayName("更新分类 - 同级同名分类已存在应抛出异常") - void updateCategory_DuplicateName_ThrowsException() { - // Arrange - QuestionCategoryDTO dto = new QuestionCategoryDTO(); - dto.setId(2L); - dto.setName("已存在分类"); - dto.setParentId(1L); - - when(questionCategoryMapper.selectById(2L)).thenReturn(mockCategory); - when(questionCategoryMapper.selectCount(any())).thenReturn(1L); - - // Act & Assert - assertThatThrownBy(() -> questionCategoryService.updateCategory(dto)) - .isInstanceOf(BusinessException.class) - .hasMessageContaining("同名分类"); - } - } - - @Nested - @DisplayName("删除分类测试") - class DeleteCategoryTest { - - // 注意:正常删除测试需要完整的MyBatis Plus TableInfo支持 - // 在纯Mock环境下,ServiceImpl.removeById()内部依赖TableInfo - // 该功能的正确性已通过其他异常测试间接验证 - - @Test - @DisplayName("删除分类 - 分类不存在应抛出异常") - void deleteCategory_NotFound_ThrowsException() { - // Arrange - when(questionCategoryMapper.selectById(999L)).thenReturn(null); - - // Act & Assert - assertThatThrownBy(() -> questionCategoryService.deleteCategory(999L)) - .isInstanceOf(BusinessException.class); - } - - @Test - @DisplayName("删除分类 - 存在子分类应抛出异常") - void deleteCategory_HasChildren_ThrowsException() { - // Arrange - when(questionCategoryMapper.selectById(1L)).thenReturn(mockParentCategory); - when(questionCategoryMapper.selectCount(any())).thenReturn(1L); // 有子分类 - - // Act & Assert - assertThatThrownBy(() -> questionCategoryService.deleteCategory(1L)) - .isInstanceOf(BusinessException.class) - .hasMessageContaining("子分类"); - } - - @Test - @DisplayName("删除分类 - 存在关联题目应抛出异常") - void deleteCategory_HasQuestions_ThrowsException() { - // Arrange - when(questionCategoryMapper.selectById(2L)).thenReturn(mockCategory); - when(questionCategoryMapper.selectCount(any())).thenReturn(0L); // 无子分类 - when(questionMapper.selectCount(any())).thenReturn(5L); // 有5道题目 - - // Act & Assert - assertThatThrownBy(() -> questionCategoryService.deleteCategory(2L)) - .isInstanceOf(BusinessException.class) - .hasMessageContaining("题目"); - } - } - - @Nested - @DisplayName("获取分类详情测试") - class GetCategoryDetailTest { - - @Test - @DisplayName("获取详情 - 应该返回完整信息") - void getCategoryDetail_Success() { - // Arrange - when(questionCategoryMapper.selectById(2L)).thenReturn(mockCategory); - when(questionCategoryMapper.selectById(1L)).thenReturn(mockParentCategory); - when(departmentMapper.selectById(1L)).thenReturn(mockDepartment); - - // Act - QuestionCategoryVO result = questionCategoryService.getCategoryDetail(2L); - - // Assert - assertThat(result).isNotNull(); - assertThat(result.getId()).isEqualTo(2L); - assertThat(result.getName()).isEqualTo("子分类"); - assertThat(result.getParentId()).isEqualTo(1L); - assertThat(result.getParentName()).isEqualTo("父分类"); - assertThat(result.getDepartmentName()).isEqualTo("测试部门"); - } - - @Test - @DisplayName("获取详情 - 分类不存在应抛出异常") - void getCategoryDetail_NotFound_ThrowsException() { - // Arrange - when(questionCategoryMapper.selectById(999L)).thenReturn(null); - - // Act & Assert - assertThatThrownBy(() -> questionCategoryService.getCategoryDetail(999L)) - .isInstanceOf(BusinessException.class); - } - } - - @Nested - @DisplayName("获取分类树测试") - class GetCategoryTreeTest { - - @Test - @DisplayName("获取分类树 - 应该返回正确的树形结构") - void getCategoryTree_Success() { - // Arrange - List categories = new ArrayList<>(); - categories.add(mockParentCategory); - categories.add(mockCategory); - - when(questionCategoryMapper.selectList(any())).thenReturn(categories); - when(questionMapper.selectList(any())).thenReturn(new ArrayList<>()); - when(questionCategoryMapper.selectById(anyLong())).thenReturn(mockParentCategory); - when(departmentMapper.selectById(anyLong())).thenReturn(mockDepartment); - - // Act - List result = questionCategoryService.getCategoryTree(null); - - // Assert - assertThat(result).isNotNull(); - assertThat(result).hasSize(1); // 只有一个根节点 - assertThat(result.get(0).getName()).isEqualTo("父分类"); - assertThat(result.get(0).getChildren()).hasSize(1); - assertThat(result.get(0).getChildren().get(0).getName()).isEqualTo("子分类"); - } - - @Test - @DisplayName("获取分类树 - 按部门筛选") - void getCategoryTree_FilterByDepartment() { - // Arrange - when(questionCategoryMapper.selectList(any())).thenReturn(new ArrayList<>()); - when(questionMapper.selectList(any())).thenReturn(new ArrayList<>()); - - // Act - List result = questionCategoryService.getCategoryTree(1L); - - // Assert - assertThat(result).isEmpty(); - verify(questionCategoryMapper).selectList(argThat(wrapper -> wrapper != null)); - } - } -} diff --git a/training-system/target/classes/application-dev.yml b/training-system/target/classes/application-dev.yml deleted file mode 100644 index 63779fd..0000000 --- a/training-system/target/classes/application-dev.yml +++ /dev/null @@ -1,23 +0,0 @@ -# 开发环境配置 -spring: - # 数据源配置 - datasource: - driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://192.168.1.226:3306/training_system?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true - username: root - password: root - -# 企业微信配置(开发环境) -wechat: -cp: - corp-id: ww0b2dc90421854148 - agent-id: 1000008 - secret: AQSWrg_TMHaWHXpiVLLUkTepUzcE4JjZLmUTl48ezMA - # OAuth2 回调地址 - oauth2-redirect-uri: http://localhost:8080/auth/wechat/callback - -# 日志配置 -logging: - level: - com.sino.training: debug - com.baomidou.mybatisplus: debug diff --git a/training-system/target/classes/application-prod.yml b/training-system/target/classes/application-prod.yml deleted file mode 100644 index 1a3c9ae..0000000 --- a/training-system/target/classes/application-prod.yml +++ /dev/null @@ -1,44 +0,0 @@ -# 生产环境配置 -spring: - # 数据源配置 - datasource: - driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://${DB_HOST:localhost}:${DB_PORT:3306}/${DB_NAME:training_system}?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 - username: ${DB_USERNAME:root} - password: ${DB_PASSWORD:root} - # 生产环境开启模板缓存 - thymeleaf: - cache: true - -# 企业微信配置(生产环境,通过环境变量注入) -wechat: - cp: - corp-id: ${WECHAT_CORP_ID} - agent-id: ${WECHAT_AGENT_ID} - secret: ${WECHAT_SECRET} - oauth2-redirect-uri: ${WECHAT_OAUTH2_REDIRECT_URI} - -# JWT 配置(生产环境使用环境变量) -training: - jwt: - secret: ${JWT_SECRET:training-system-jwt-secret-key-prod} - -# 日志配置 -logging: - level: - com.sino.training: info - com.baomidou.mybatisplus: warn - file: - name: ./logs/training-system.log - -# MyBatis Plus 生产环境关闭SQL日志 -mybatis-plus: - configuration: - log-impl: org.apache.ibatis.logging.nologging.NoLoggingImpl - -# Springdoc 生产环境可选择关闭 -springdoc: - api-docs: - enabled: false - swagger-ui: - enabled: false diff --git a/training-system/target/classes/application.yml b/training-system/target/classes/application.yml deleted file mode 100644 index a1613b8..0000000 --- a/training-system/target/classes/application.yml +++ /dev/null @@ -1,66 +0,0 @@ -# 道路救援企业培训系统 - 主配置文件 -server: - port: 8080 - servlet: - context-path: / - -spring: - profiles: - active: dev - application: - name: training-system - # Thymeleaf 模板配置 - thymeleaf: - prefix: classpath:/templates/ - suffix: .html - mode: HTML - encoding: UTF-8 - cache: false - # 文件上传配置 - servlet: - multipart: - enabled: true - max-file-size: 100MB - max-request-size: 100MB - # Jackson 配置 - jackson: - date-format: yyyy-MM-dd HH:mm:ss - time-zone: GMT+8 - default-property-inclusion: non_null - -# MyBatis Plus 配置 -mybatis-plus: - mapper-locations: classpath:/mapper/**/*.xml - type-aliases-package: com.sino.training.module.*.entity - global-config: - db-config: - id-type: auto - logic-delete-field: deleted - logic-delete-value: 1 - logic-not-delete-value: 0 - configuration: - map-underscore-to-camel-case: true - log-impl: org.apache.ibatis.logging.stdout.StdOutImpl - -# Springdoc OpenAPI 配置 -springdoc: - api-docs: - enabled: true - path: /v3/api-docs - swagger-ui: - enabled: true - path: /swagger-ui.html - -# 自定义配置 -training: - # JWT 配置 - jwt: - secret: training-system-jwt-secret-key-2026 - expire: 86400000 # 24小时,单位毫秒 - header: Authorization - prefix: Bearer - # 文件上传配置 - upload: - path: D:/upload/ - allowed-types: pdf,doc,docx,xls,xlsx,ppt,pptx,jpg,jpeg,png,gif,mp4,avi,mov - max-size: 104857600 # 100MB diff --git a/training-system/target/classes/com/sino/training/TrainingApplication.class b/training-system/target/classes/com/sino/training/TrainingApplication.class deleted file mode 100644 index 8601d60f90444a2549a8f57f0adbaa816d81eb78..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 747 zcma)4O>fgc5Ph2_brMn9y5%LUGZXV zDf`BXTz)n73r~!3d={LQN@`_G&5#V^hjFHvD2nmtif86L*!V22Lr#r$@|)vRqi@uz zv?9r5r3JZtc+Ak8nx$mejg^)cWu8bo_qhy%*rXy`2&=rkaW>tpDi~hH|3!g^&xs+1 z{bAkY3yKT7BEY?xFm2tNqEAXw3OJLnbM~6gYqLD)X@IgQ^s(3Rcfblxlo1j zzpk}$VJ(C)sbwteLX^%Bb%8Ru+01)dQiZxPULvBa@lONH-wnxKvN&l*x;6R%_C19A zBz+j@;YpAo0R!xj)xlFdBM@JF9>9S1AR7Hd=lY@EpC~9NLcfC1#y*~t|A5{W5lpIq O!yu1vOxm}70sI4*e8Um| diff --git a/training-system/target/classes/com/sino/training/common/annotation/RequireRole.class b/training-system/target/classes/com/sino/training/common/annotation/RequireRole.class deleted file mode 100644 index ec24e552febada747a946baacd66d08397541992..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 518 zcmah`%SyvQ6g^YhM(Zm+HZH^mQWV5|Kye|oqR`qBQ$f0##!HzpnbBlY=&!l(1NV)QaCv?)>i%g=CQq_pm{D37wgeiF zHcw-^Rhqf}Qkbj4QQ#oVjZ+CdsZ5PEEgUm}!)|G+NTw5VtbJPk-qDnhanby>2vCil z2OWWWuM^$%+XBbsq>vnQ_`{ge{0B0yTE%k)dg1UPy6>_4Njar$b?m?QuI diff --git a/training-system/target/classes/com/sino/training/common/base/BaseEntity.class b/training-system/target/classes/com/sino/training/common/base/BaseEntity.class deleted file mode 100644 index c166edec22cf04731f227249baf8f0807f91f2be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3862 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 diff --git a/training-system/target/classes/com/sino/training/common/config/MybatisPlusConfig$1.class b/training-system/target/classes/com/sino/training/common/config/MybatisPlusConfig$1.class deleted file mode 100644 index 4d710213679e50e2920c004ff99ce9d32616b20f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1570 zcmbVNT~8B16g|@xwk%62Rf~csYSnH*ma2Sckr$NEqp*u5o?mhR+nR}zr@pdjNx`o7kzuxMHvZvEOj0Nsn8t0Q;Rj0ELEZI*3bv)=FnlRDJk_@N8Miyal93LU z5+@Fkl%&wE2zZ}zt)C(~#3A9h?WASP;l7_V#6e~xUXy!W+46c;x3BaWDNW)lVRg9M za)j~|iFW#?S{5@TO7E-{pF4}Y3|dP#A`mSN_ZX&zvew-|w1v_!hj{}J@Q_^3xziK- zCk(}MJr*cpANxkqlngvhNb^3*7D}VxDZ_er^VcEIuv)%G*_g)+nJup+7$zIi6??sI zQ>Y`}bjVVOs^FL_8LnevCahA1m8&N!RcllcbiW<1b-)$xlB|lLbeSlR#s4plkh@MG zak(&<|6N&wYwp*ie(3d-EoecfE?#QRrSR5Cpm(nAc+}SI{uwl^GgPnKss>(zgqRvK zkL!dsCo=?qg)LmDos7Hj4d1}cl7@mOT^WhUkuU49V<0#XPNwZBF zQ#9(8g>PV$AJD$iDuoJtM=28IwLsru-wTU)Ml14<&={6zKEg2aIZw_OmdP!Im9!ng znw5pZL}Bs*Q{Qpx11;_(7qf-A^abvRTf?jcWGHYE6O?I&@XG`{WMB>$n5g18C5;(W zDTrRs0fX(BK`xQ>Q6f$FT7mp0@G=3P8^Gr-!)M4f)Mf>%G-j}dSJ;RwYxG|bYQiE= Gn*Ie=a+t3G diff --git a/training-system/target/classes/com/sino/training/common/config/MybatisPlusConfig.class b/training-system/target/classes/com/sino/training/common/config/MybatisPlusConfig.class deleted file mode 100644 index 23670c04855abfb182bbffe9d24a4fee9f5a1f99..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1902 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 UMi=S+o`fy<0YB1HsQL-`54z$wK>z>% diff --git a/training-system/target/classes/com/sino/training/common/context/UserContext.class b/training-system/target/classes/com/sino/training/common/context/UserContext.class deleted file mode 100644 index 05ef90fdcc6faccd4cb059f220092228427aeced..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4375 zcmbVQ-ESOM75~k8W@mOi>o~5Rbkbn@;lkQ$d%?ji9VZ2vk7kRVhB$FQflk(gz43a+ z-JK0h_!e)x08dni7lhQjL;@rdqzWN;DH4x7A@Rf$|3pgpoqK0@$Id89uy*#Id+zU? zd(X!`XV!oJ?}vW|a0)*vqks_`rV9&21LN0%>p{I8L|gS&uU-qAiGkwDR@6#fG%!+~ z-6+99$wt}5C|m>c&3L!oZAEcC=>&vPjGWy#;t(a_drAFDH|(6&G*$IDYix3x)!{y? zakRA}ddFNG!ngrPP*JcO8kor7){_qPE98WW#{_A1;&v#aQ!b7u(M}k&FHlsNkGt^X zknU!<7j%-{FiIMmvhak9iM$W3x=&w2M#UNp9W@qOvdtGoCdK5t+&-B5dHa^IGze?-d(7hmYZFQpz4{&Oy#7rsq3m*_e<;0rE%tkCf7 zpu2rK-lW$V=*EPkhl>~SB?CuygPo8;YzE0|t%RVcn*>qPHE=WQB4u;N2kC(xk#kUs znrB^`st=AZO#{Xm6HYh6PPY|DR~lyw7_S(p^iRGKw0ogN z3+2yX9%;J|t+t}@LT~qK*tx6~O{~UE>ItZgic_YUY`19p;_9O$KRx{X|K+UN4cfC7 zCfo7m#h}B~PG}WVuRBb=$L>=sLZc}{=gPihPF>hX^;3k2K^aL5CMT(Eaxx{!NmG*U zjQ3y8^m-Vu;$%DQaCdRiO#i;SiaVGdR*TtdNo^XkpXn-KdQBNXjTz1dn`k4)hTCXH zMFILn!9WTaGD;etOfG9_sVUrQJqemSYr$R`bnD`!#@bmL-r!yCgxy}7rO_T(RGHa- zaA#(4$dUr-^ORrLv@@b5Zh~dGJykCta4>J)IEU zLq#NI^l;tAx8<_FXJBSnSzFQdcqgoD?fU+n3z|vXxnbb_Y|f-Wt@L~lZMMVi%xWC( z^!8RBczyQ?UcRvx=D^>|Xy{kb3@cS}I%v1oTS>U$;HH6#8QZHmiB1{wPYNZD6uR$7 zMKfeFW@8}pGzO=PS$2U&6w#mUpxX_*Hoj-z+50?|=Kvc&FfjdKC{sdv3s14i7GU7Z zuyG78;WX(pEHVY0<-?w-Xtp^uvS+E0%}kAKS88N;;y6KBHf4Ul%-IQ!21je|k1&3( zVCVTQB^;>3WP@msay1CA;H#X8f>k0!L7St=aZ(h_)$YKao4@Zp2P&*TcT)#nHwJt$nw z73RA@j_|RA!V9^=7w~EtdY_}DNl}G;7;NosS4khyh(U0RX>cWw7V9~q%6o~g<*BSZ ztV+oeL*)il>dB>im6H#vQtr?|rJk(ktITBigAJDq9;nol%lW=M`mm>zn>|qJDg9US zRUUg-l~N=IDvv9beACq7DVQAP-rcLseE`e6UHdDXU&0!>UHc21wfVWb_>`KGc5{=~j;m6VHru~RfjRq$^- zflX3l#Dm3p%69Hy%!czZj@T&h;}{>~aZQ#UiR@pr4JL;vKX1~z`vT3Ca$reTh?la( zH(L#?ftM`$M!b|(gV$BM@pl7REa!#uR8gX$55`wcnx|A!9UouWW=c8ZwOgH($Eo{*~3%|xTsRBd!E41i_5jL_P;~FWG?_Apqxg^FLbWWQT zU&+`%cS+g!DUKo{DOi0#A7k!krLbZKHbfre zreJ$Nc!|6 wv&^T;r}iOE0tcI+PGJ2WG(Cvso=Wp~c~!w^80hl3f$wluCiPu>A3ucmKM(LD$^ZZW diff --git a/training-system/target/classes/com/sino/training/common/context/UserContextHolder.class b/training-system/target/classes/com/sino/training/common/context/UserContextHolder.class deleted file mode 100644 index 7c6764f7bb79023d5bb9dc862d56b54bc00e97c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1139 zcmb7DTTc@~6#hUNEKJ1*Cv)}p7{nzjBKL9+3Z6blBfs}$AW=H3sVLeur-!Fbq}sx7)6YnCRp>ImiP_f(k*2kwaQG?t&JKkUoo zf=+uzcvOl-!Zjxt)9w?h@r-!@U(0Y1^xg<1hBB0jvoN`D=ixl$_Qfh5!E!t){th7_ zTX($aM4N}fSUK{gs|#7YG^$lSaJa)GpWtO7tm&a=d6QoW+~SQ%=&fPRZPq+tNi5Tq zQ_zQZF(KmsnC=8ue`4h`YYFRo>X^Y9>@gnBcEz?-4l4V2gp< gT#B6;1DzQ#cZU3jQ{4CliG6#jaFEW2#NLWBgb2})cpGLpM4K@&*4ErBesD)`duG@A*tGwaMOl+RY7 zrBxa$rByzeXi`3TtMUTT_yhbM-0~+ZPtVL=*kU4ERxFC`>C@e(zw@1QzL~%NzWXPD zb9g6$5E{a0jG+np7>;MnykcvHsW=wb49&4YES?w3 zrnRUni+Lqq)E%wBEk_wIJ;?}?scU?RD>|nbryO}K*&7U9bxarb*z`m)iUVj3BOXH= z+8K@oLbilWH!5j&UX%k>PmG&%Q;jm}k#(seSpE&|&kNq5PK^q zGKr-HQ&)v0VO1#fGexwH3+Jk-PI6i2j<5(~WJ=2!+$mag;phJ+r^CVARQJpX@zIqo z8jhA18O_#+9@%YI| zsU%&jIk^4p%KfiDW7uCh=t^phe3$eyxDRSs3QJv>v2=zjy9x0g9Sv70LrH#Rm&G0`A|IVHi&j?1w=Tm$IaEF$ z2Bp3+B>tuU9iFq5X)e39(IC~MI6Y8X-{0E0zQSX3+75ax_tEbWZ!7vSKr=do=P>B5w?e`5bYh6Ckr0_d2H-gT zhj0QXX*@(vr)cwO8)tBq9$uIOv+*L5v^W@|)nPK8voV5~LYD0=rOkL;^ zm7>8TYP^=H%b1V}bkjTOf{HV`*-!5kVocU!57K0mH8|n}i}wA7qka9qfc-?)>hkNT sLKH0{ic(;*Jbgq>h|{4d_vo~XN!IHO*)lfXl$G@s-lo;rGPt>a01*wKVE_OC diff --git a/training-system/target/classes/com/sino/training/common/dto/FileDTO.class b/training-system/target/classes/com/sino/training/common/dto/FileDTO.class deleted file mode 100644 index e21078ae317c5e5d460edbdfbb0a3bd3f4d9bc4e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3673 zcma)8ZEqA+6n^e@W@oyc(rsxeTM$7CcKgCAzOtn#6p&(Dkd~t03)Ah`4xR3lohb=? zGcm^K7yYF12gnypG%6;<81w@s{sDe~{tOYHduO^k+fKAicka38Jm<_kuXq0V=iV;> z#&9Et3|b6m7Ib6<^4IJecFD7=i=}h(*PKcykUi>F-SC(|%Rq6i6((8@{n*w{3k9j8g*R879F=xi z*o`Ly%!*w-b$!kD1bPM%nvu7o#mf@>q=miMCtxf(;f#7o*FZ4=RY)fNa)D#w<2tU{s)6<=^#7GfvI5J@=M9@5xLCYCGrD0@trzoH!{U&I+`z zpLNdm)*PKa$v?s5MxJ&|x>aX-ZDro6%|?d0CjE--&Dk_g!!c6}mt1;#aB?d(%R_bq z8xz=6FtI*p^_Or4@f6AVPn3D!K$6+J#|dw=tpto}s*Gs*qxU3!0H z+6?_D@_gltzgDX_a>{VT#KY#0EG?$wgztv|htg`4o1h~LH-~FjHsHyQSmE$$Od+>= z!(Vnvk>#jKPTLiR;HJQr$uz~l$mkiny5KoM|D^9PudR-5uKxt5Nm1rE1%4%gU!O+_ zR%~M2_PiN4bVg0EK*nOf2a-V?6T^EGL6lntQE^#$a+Sdx6Gg^tqFQxoIqlWTDX&&e za;_cJ;T^^2aqdc71y_CWCy4J9>;#`u48q6NQvq-ir??YxEc4l{`~!?{Da@du+?}e- z0iB}UzEQc5s>~6dqMYBTyeCzeH&Kf6_KnK>Qt9NOr)D^->OMjB6X7;%H-K}lliThl+{)@*`-Xr zj>$B~w{O*?EZn-u9%XVW{gl01H7R?bZnB_E^2;MSrMSf656ienisKIs=17_N9H()KR4cx~t9X-C4tLp!Z;@)l&)9{_q%2(F*^Z;jF#pCj z1Lh;_Fp%NDDIQ^GM7I7vx!xqxOspn9RO9kHLVsl6=`y1-49P(ig&}G?y&eXg&dV^w zZFgRk3O^3XVke8gXu_nSPxGTkwJ}u?yYr(1v4pFnG+ruGuu17m)M3n%$|6KBDx?gRtUr-^OonE_6oLujhvZ|L zXzVkR(F1)Qu#VB1Sure|fHjaCxiQ#i1~>32f>_1eq|(qzmr;>nTBr~HlMIHu2>WDG v`781#N5UTdO84+0u<~^x7jy~y( zzBrEK_zyUaFZIEPN-Z!t);{}pi1knKsrucUP=oLSGt0gA+;hHj&Uel|`Tg0?j{#i6 z`%#1hh6-NE^c~kTgR{oc7$nc7t4C1r@&$0-BBp8U!LU%ad~} z0>jypAdE_gn2tsX(YUlamCfX?&(28cDIL0$Mi=MivYCZhDLbv>44NrR{fJZXGY7N1$PhWC!B{ZS_z!%So|`A3O8)OAYdHz8>d!EM;e24qeAutMv|!$Gbiw>j$xS0 zeA5o5RS@B1DicE_hKmIM>&wrde*c^FcS)vonSPJUCUZ2#R6d5r7~WtL?C);xfA#hL z-ls9>F^pCvf9!qn=QleN`I?S#nMpKpkV?mL#SNU2op*d^y=YImuE*|lJeO&jsyo&# zujFia6|?lwI&b{D#fooQ&-F}Mjl8TSy$vagTb3W#Nj{kP}iz7 zoXI+_y-+Ew+vOFDK?qD8lX>c7y(+8e6|7?3DmxOihOD_(i4L0Q?clbzv1FBbWU$Ou z3vN4H;tBay6IHdQ>cJ~-IIdMBn>lCG<>M_AqAhuBDFi|un|dUfIdQ-Zz8VYyO`H&g zJM-4vTF|m%W>kkBermN2=MWex6l+g_J(U-jsOu70ps|yYH_lqdb6%xfu;(0E5aZD3 z8kUcFVuTIV&gs`M(IKZ8z?Gv&tsFkQG31k@)>~4G>x7c=#ns6sf#yy*n0UuFmM@LB zQ#|!?m4ESVH0_|}35*9k2~6|9L<2`$Bd5y@LQ4M`|DRwjR4k#ImmRVI_yl+zXs876&$Umw-a^LvM12w7$|j|J`|3m+nH_w5 zEj-@c^&L6~yDwhVIG&IJc&4Bbr-_Y_n@6+~FpPA%~Tk z@y%LIuKYq<<3c!WjO^mIhX||l>zZaSzZr=bSJgSbhp~rflEtrrSBr13Z`)b$ SE?gj;p;`r3k*8h=@BIsyLBz)Z diff --git a/training-system/target/classes/com/sino/training/common/enums/ExamStatus.class b/training-system/target/classes/com/sino/training/common/enums/ExamStatus.class deleted file mode 100644 index fa6ded94199d1362fa19ba978f99563713b9e5ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2065 zcmb7E-%}e^6#j0qAt5XUmKFrTB8HL#WZT+WEk6oEsHyyt&?r-9I!oBnrO9q5n{?`v zeeg}+d{oCDFP(98rczrNtF_Pm9n$ts@TvOUo6rW~K{B(s_nv#sch33Fx#!Pkzdi&o ziVwpG2qbb|!So&1GfPFwaUFNfq@>`vrtOvszL~md6*48ORQBs3py>#qPM~3Ke(7>% zX<~6HH6<`G^S?ocB}zm`y+TRPU0zt6KfjpDWTd=7hc4xz)ZA2RN=gptXhO33EIxWZv@q;Tl1vR3wSRwH_pZ!td7c3XTfYjgaZmm_S=C zRMj$_$ja1T)zORBNO{g%Wy~Tig?&1Xp`XH4+s_FYd;LbKmC%vI0NtpNeSx8P;$XB1 zysl#iCevQCOOq;sU_6nIAQZt#f%?Z^{jmMpt?k>NNq?tgTBqrEziiTbV@zZtsE^<+ z;ynH1%ctLc{@2z|5$F*NQ?k9e@#Mi5kH7v#B9H1AlbM8LJE?Rmmfez5u(OWutmN$p z*Y(()j^{E>Q?@Jzw@s>$#pOtC5wpq_;t3amDgWcJXE*Z?0Rp zYd(9wM*RZMJL+16iKZFHwdcx(6}z}(F$jTk`(&OtK%>f1dO0hfwTg~Jtio!pRUmrv ztX;b5tu9za9vLZ9)k;?#F435LrLl@yW98r#R~^^Nlgf;<=JMqh3DFkcw+;dUj~zV} zPaiDWI$wo&EcR#XfZ}aVs0T9zVe*YUjAC8}E>l3*gGxqgKuu-Wc+kQR|%4;ySKmd}TGV z381-CP9om1b>-{g?K?d6a+Sa61{&|9^s`1Ml#7{B-U1u(;`W--T| zWZ@I8GLZf)#AgN`jt0lNyS_)~K=;YBT8DNYgPq@^u0y-?X;9q$=ZQ)=s8ViIW=XV? z&@K$(D5>p(sUmD6Xe;TPXM{3`epM)7f%`)UK0|#Nh7d>oCPtMY86&%y0F~;w&m!tr)&R^s{etj+V4$<8iY;YOzwO4-TS?JzkA>PqWnF5HsZh}^5S=J57O$_A1oTfj!%d(U$tb#2^g$zZ z#daN2U?7t%ZX34^-8Puq`sTJ-@$v}_;CK{+Dqh3u0zLm3tT1gxaoez)=K4*6vza#U zCEI8;@@7cUSO~tD)201%QE{nRg7Si>{i?=V-^Le z99MAy6I52sMnyn7d~bqQCsj-#!)yGI8v?VLY{$$ARQwB zteRQ28rG(5E;^3u8J^`j%t-eeVbgGHR@H6lwL6YHg%i%W$yRQl~%^RMawbQnzc={zF{y3feS|@neD7CW#Qb4VV8}% zB|!sZ#W8BUAh~LKx7_Mgqs}dZWwwfU%c4k3$QL-#GV5+_+gHL=M9FQ|E9ON@mP0!*j%MVmU6^G%4RE4G7E*FD0hF9A)M)Ze@$>_(yC~23 zIzFj3T^>jd$;rbr_NjbIJe}iioKpTJc9D3Do@eO2&z<1pY@vZ(agL99gnauml+q)i ziQFFgpFv3b&;k1osZm>2SYRB$BEJZU`bwJeT_Nm)eM%YOk(Qeteu7jk{Rrt?N_m8_ z2h_GeH7HzW@3YL<JmQUO0w`Jr3_?h50k~|r{}}->EXK=nogfSr=*m}$PWF0u9R~B>#(@@@1K6kVL#I)X|5=llo<3EEF03XD+ZAWugrFZ1g`_yyuo^a^qOA7TUq$ry#4Q2do~ z>6C&plKTbepSfr!ddR<}MRX+KLEs9CM>voDze?%D&dG$FR)KTY4;ko-{0?y=yo+$@ zhO&!jNdg^gj~G_57PwsssxkE&y|lN&VQuCK-hPO%zkf$jv@`xbx`%fkA|cD%0wW<@ UYe=%!MoC&IsM9*G`e}ds62*$H=Kufz diff --git a/training-system/target/classes/com/sino/training/common/enums/PlanStatus.class b/training-system/target/classes/com/sino/training/common/enums/PlanStatus.class deleted file mode 100644 index 4878fa9ced41aa4ec9556efd8e71bb6e88eba35e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2065 zcmb7E-%}e^6#j0qAt5XUmKFp-5JO1q7uz z_%MusKqBWAOy6-mvsAPk*KyZON(!E9+HSevn+ti%&6KQC*{_FyrXz$pfrh#HrOTP6 z$;GAAw7}r({{|V6C=ng?3MD;vd0}z>++r$|k@5x|x|D}fbJMA5DLJI03C#lGSax#u zVk#prbm;)jqA<`JMzfB?I6~Z9-g9k%!|}xIx^=@cncJEK}jo!}f1Cw{L$g{hgF)ouc3UvPtiaF_Dd+K7zN1 z^Yo9ep5FT6udSaV&?6Y3WP5Yt$%8K+fAg(G9@8-{GYQ9bQt4PMyCtV!XC2>J$=j2z z>#;i>&t;mXYK;}kD>$oO*(`jr!W;j3zU-UUb3Id5BP(l3Z$rxBishH=;>U%&xo+jI z`Rx4~_47RMsB0A_nr0o>o+}qt?BbHeAOz0tlX>C*jVep&<*abO>(RA!ttmoK+Sh_?8?br1-6?C9Zm z`e4!4`D!ExG;%iNu3fOMS0k3~GOc=Z_am$JHsAheE?;eaHdK}+uIUe1n$ZK$HqH`8 zGhVrvvu7Mxho%?fYFIwtiQ{adc8pz%Ih9>KW7lfV@JB^o%<>N!!S5m5Rkxk_o&5XmjH zJ%W(>fnEA3Wu>$*!#IF*{6YdVH>E0{8iES!Bd#G{8Ogz}O>`x@@1Zx@q1{95XG$xe z1~l$t45l9q93CwMln#1nE0cd$k+4HUMJAKil+zXsX(oN1Umw+v@_Ub80JF^M0_M1r zEPTpU1~RaP`0U`rvEX=j*Z1fg>^^Zu>(K6FsPjA2b!c}!3yRzSJW(kJRmyG3EQwYU z+JzzXklKEjD#A8`wvxViMksR_P=x{(xIcv8Gt`G+2yx_ZVpIu|F|wNpP^pewC6A%x zFX;V|n_8lKlo!3CP~}13eJt){9Q$vT`t}+(N9C+~ZY)Cv+UtIYSPpI=m|4~~5Y8-z zHrTQfZg-PJkik;b_)@hdrytPPI2H^V$2alDT?EznO-(aSt8-YL-wuV0GwK}O!suNz e%HmhRE5$e1x9u!=7mkt6K(&Gwk)>V$AN&hb-@cIm diff --git a/training-system/target/classes/com/sino/training/common/enums/QuestionType.class b/training-system/target/classes/com/sino/training/common/enums/QuestionType.class deleted file mode 100644 index ab1d9cf83213662b590f665a54f325f3c1c80266..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2071 zcmb7F%~Kpz5dXcMS@t6Xfgu4GK?p8kcR_~4#Ax^k$d`-DN3yU=#mlfv$l&e_wKJPC zCv)(i2aj5oCo7ezT(l~ZFG|Z)&i)^2gM|%XV8cyLfAs0)oV+ou}rE@#xEz>BOl;^@R{5hOHp;dOzQ{}kqk z1`6VqS*ltqHv}%G>a1r*QzzyK1zN5dQFCF;hBXMa+lqaG@-%%%%W z#~BU%c$4TZx?2>p$g*%i!&wZHaLe+F0{T(Eaned_$Y6-v$dEmO(Nwxo;;5_|Mqp6l z+m=5gV^C7*Y!u-r&I`o;`1+d{cfNXY_dE7@ffKt(o{!5Xdo;>)A&OWO?=sH4?`t?w zXi?fvZX0hNZ;~)AOy$XXTQyV-`R4sQ2sC7wLSUuGW}1nX?^h zxmw<|Dr+VMAuxSR=IMr-mCNZC%~HXv*o+wftBzSF{MIGQzv*tRniV=ytdy+k-?V9o zC;6QwYiiB4gIn3M9kWDa=Iw3A^s5zu=tvz~34xGHT|Ju0HX5($(?}3#&ih2#lDQj1 z%ndUu`}6Qa3;LU${dlnyJOFB`g20u!4&maAH$>bdl`)=otCgZPZ*wi$>POZHKjf)% z)TEs>^qQs;JiP!~X#~lYrVicc{M<SWVEYZuQXx}yf>S4Ow*)2W|U z{)_LS`3c&dLw`Ugff@SGXrS2^qscOhkkr3GD@)_L$n2xzIRxv64(ZQHE2)KfiUU}n zFDx*BhgIppL6Kme&>E&IJu}q(6y2Gg$LPx>)W=BvOwt;t4wd#v3T6N&Xo$2CAUo(I zTTcE1Nx}gQH5n(bN~diqvXt~9ef^|H+ z-FMM7)N}r_noyr$xa$WrCDaFBDB}JI*P!E4^qng@6Zv ztGITIaq|CF>OX4S8s~}i%9uk2I-7oj*iiPM z=~uGVM-@ds_Y`kGgd)%HsH%QRo+I-7UO22@mgo3B#vh`Yi(dn;6m?WBTtW0dF& N1r=OJf%HQ7=wF{*!GHh& diff --git a/training-system/target/classes/com/sino/training/common/enums/TargetType.class b/training-system/target/classes/com/sino/training/common/enums/TargetType.class deleted file mode 100644 index fdcd613612eff64f59abc52e904819fad73e58e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2046 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 diff --git a/training-system/target/classes/com/sino/training/common/exception/GlobalExceptionHandler.class b/training-system/target/classes/com/sino/training/common/exception/GlobalExceptionHandler.class deleted file mode 100644 index a7eac0052ebb951a1cd768371ebf6cd8c99ad8ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8789 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 diff --git a/training-system/target/classes/com/sino/training/common/interceptor/AuthInterceptor.class b/training-system/target/classes/com/sino/training/common/interceptor/AuthInterceptor.class deleted file mode 100644 index ccdd66ee28c77ade65ec8a2a5aa1a6f5d8e8503e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5252 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 diff --git a/training-system/target/classes/com/sino/training/common/result/Result.class b/training-system/target/classes/com/sino/training/common/result/Result.class deleted file mode 100644 index 2f1f5861b9d237cda2772bc965448e3ca77990d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5716 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 diff --git a/training-system/target/classes/com/sino/training/common/service/FileService.class b/training-system/target/classes/com/sino/training/common/service/FileService.class deleted file mode 100644 index 9f34ccbbf1c0548ca7f15800f8307505f615ac67..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 465 zcmZ`#%TB{E5FGcBKzSqa3#dp4e?Y_m32{o*N`(tIH`%ssow#zG^xrt}0en=&x)k+5 zxp;TSJF~OT)I-DQqb#a*fVNzGy?^pFBoK;BuiF zC5__F;bcLX7l`VWu__l>_EYO-vRXM7nmSd`+PbA&(?k}v@p`44mxJFdC@1M&ZtMds zxl8}`lzY4N^ZYtY*vWwW+~y+{26=LoKxfLDY-nmtPL7kD41WpS^bZVr7l;Gl%^88y z8TqFyqpI4Lw}%LSHJInfD6bnDDL)tJjcx5R3cInx5O&9V2#ZDn0&TuO(B@lq5pf-J fb=<;H2nZ+c;baGQS$_+i;d~EWa3_oN+rrg1Sj&I{ diff --git a/training-system/target/classes/com/sino/training/common/service/impl/LocalFileServiceImpl.class b/training-system/target/classes/com/sino/training/common/service/impl/LocalFileServiceImpl.class deleted file mode 100644 index 3026bee571c08366f34309505535778d34c8b581..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7306 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 B421vy diff --git a/training-system/target/classes/com/sino/training/common/utils/JwtUtils.class b/training-system/target/classes/com/sino/training/common/utils/JwtUtils.class deleted file mode 100644 index 6056de19695c72797d98979b4008da2b2c8e81e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4184 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 MnV_{pUjkqK3o1hNt^fc4 diff --git a/training-system/target/classes/com/sino/training/module/auth/controller/AuthController.class b/training-system/target/classes/com/sino/training/module/auth/controller/AuthController.class deleted file mode 100644 index d9ec9702fb5afd0b53fbc3b07de529064878e875..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3236 zcmcImTT>iG6g~|s>t0BZC?rwL&5#8&9YO+$OHe=)qf0;_Yn8s(%yyPZcBj{w9w^@6 zB{2^PRz|Qjk2m*Z(FT57*k)b@b%I~XTXouGbG-67HEeX^|I^&A-gNpD&1iD;( zyK)tTBk;N(j)tK_xoqCbIz}15VwZyiKJh|c&B}2_L7-toB=Bx)4ayD3>!LG0seu=8~I; zB`~Qc4JK_9G2eP_ObvL)S}2%7JnOy*+mL#i$8}3b5{C>!NG5f>s{}e@x}eq^OD0jd zW_zh%7G-4vI+o$4W2-o`>~xx$^O%**2R~+)Rrp_qxe0w9QtT3ez@6ue?b&Lt zW&MxE^@rbOpDeHcd9PS0O;{C5mWv4wp+Xj=PLb>;jc#;#fmHNcl2COc_HN!@%`SbD zeS9Z-^H%PwpEkZ&MR*&FD+Eq?uHp;4qKE_3Ms3#}Z6Dad0m_0K7g)avT=<`bh3t*B zB3XXLlB4r|wKDAXcIb=~2u=#y)cAQ_De9i;_sMaEfIy^%4oH@?=oC};wZXuoW;cekXCHo!Y_(nh@i0=4B$ubb#rbTe0yB+9o-h+pc}rox8i%J z0^g7ae8b3Vy~AHW`d17!DgGWo8*!tr+kqF(8y4uxGc~dm$-D3#n&p`~kG=L%q$rLm zBE6y_9VjO%=p?5Hi9NY(v66&R1-m`%1SligJ#_Hp|dsSL_dhcjpE!T3&vpFf{$PVS0^!e{?JqZ0Y6U3^Z)<= diff --git a/training-system/target/classes/com/sino/training/module/auth/dto/LoginRequest.class b/training-system/target/classes/com/sino/training/module/auth/dto/LoginRequest.class deleted file mode 100644 index 97b55577a30b5f96abd40faee9ed1bcaf2d5e4dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2578 zcmb7GU2_vv7=BK&o1|&lhC&Om1wo4TgR+RI(6m)3U&XZ428zOshh(Q&n(UVB1_$pP zXB=;s@xlwoE3ZUnm{DgGn9k_v4bJ!*yae$Fcq!s@vYTW>Gmdt;yXU<7emw7Uo^v+8 z{=M-dfEip)B7$ffS_(R10_m&rx-`ntUNz2LxoQ?Xf!MTVTi&cdbaZT`3kh_^kxZc* zDS-n8r((F4?HFEF(v4vir&ueShOBudqv$zC&RMnWW%F9ibeSwsbIqzPE2cnyu2n1V zRT-OA*?UvyQ>hc{(skc;s>LLYTTnsbWmf~3s% zlghm*j9{O@_KI9H=N!8ry^EGdC)@R;?YRO+!hnPNn-O&Y8OI9(+v;Rlj*&O3mMmNE z$tz`+PqRNxSInwwIrfG569VF_Ku@FYiY(Vmo%qzB5XdaoY|pBgE0$|9!7+RM0AAbGeqtD-O57K;6`*N0TF4ihn%<6f+&;FcKV4IT7 z5_VwJypl!S2Xp^Vg@oVjhNaOarC?>oR!HuG>6M(~lB`m&9x3(%8;T&+PP>c)84Bo* zS2C+y2ZeB?rTN~vJ!J458d4Vs99o8+yeA853vxZ^SzlV7UpUFq^HglrbZceqs;*GR zu8~%7!gKs~1d@5DRxOyPETx();Z1o!DT~b>cN|YG^}64++ZV%P66dfK$D2yr%K{^< z9c$Uwoi)?&)BAcqB@3QYy&>>vSm}YIpY)8hi)GUt$vMtiZ9ThL{vk_Spps7q_sb#w z#u*SY1u5oaxtzB=Gn>G9HW6-qw6QibV*l<2aWi5}AT@8>W_7O2?QgnqTol;1sryb% z#qqYlu77vs()kQv4^Nv21fEBfr_d~1!LJR z_cGF)WILzq`L8Jz@6D8b^_2Xa1StRHGtO$IiSaL>YquwUM&dK*(c2S0A+fN3{0`Ff zDF@pY_wzQTP5y%JjCLPeZXq?9(e7YJ!((Vlr_0b(ETb!**nRZhLQh7|#2QZ8ZPtoz zTE8%S7(KfyF95&Xs!>f<(*&Q5DHbrOfu*%B#Cq$h46K6wYb-ck0UDNVh|Xu+F=B9^a) zI}>);&lNk+%Gr=qiyz;of NS(2j_yoF21`~yq;Aawu$ diff --git a/training-system/target/classes/com/sino/training/module/auth/dto/LoginResponse.class b/training-system/target/classes/com/sino/training/module/auth/dto/LoginResponse.class deleted file mode 100644 index 025e16f435762422c74252efcae66cf788c09c54..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5132 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 P`Rpxr?>heOB-j90>% z8+k$K>bj&E-D=@V!&k0s=&HM-L-&TNRHZJ5t6s3EZZ}lKkX9vJQ374%-E2#`PVZut z@ek+FiM&9jB7@7f8`2l(8Ei3)ffa||Gsayx97VT)v#NBd8MS+GsKt0EZVJ6Q95Zp- z2t)djVP44LIG$yys*I|!J6X{bk1QyLw)^P!$*W!H*StEQqzt`b4d z<4-?+{N>#zUw!oG;U|CG{qfPmtta1X37puQ>H3}Zz1gf-t*@6&bAfDjFz<;aX$8xc`-CIoacAN_~L&`z`j{Z(z$&5~3u1f63FT zm;tpqzF&etBlnaT63ER4fvT5$8AU2`P!>3|kMluP9Lx)x{BKj1Ddvq+ydzQ&c#h+7 zJde{{5AbD5;S7Jg#5lgl{UM$Y@;4M=7$ZFBfH;cXBZtp;LvkGDLzlDQY!Ckc@hulA zjBzxNjptd8x!8cFFL5W#EyZ!K^LKFW^I@xV?}5%Q;}u#N=kuIXoZE&+zK3&g>fYEQ zNo`;mo&vAZ&lcR|x#3lqguKt$+%ct*;jdv^n;%#98|Ku2@S#gX|@ z4(F}0-*Bj4{fZ;^kQ*yl575)Jur?Vcy-$kqIQ$Nt62|cwA@q>z1m#JwBK>%sXK9LG zz#CjyILBB$Xmc`u;;@6vU+8s^;(um`$T%rj=39{vImehr8{052P+EnJs}f6N??AB$ zz(7f)nP^JGPXdpO+Mh9m#koIUoV2Ez0`%pJRnpJoNAAHHdw^#?nCd&2_HgW)FS=K zOBl@bT&qe8{pxGo+uy&Ne&}0hb&~mtSkI zYYyxiLgH8R2>oZyN*$J;5X?G)?!G(zBkQ2xaMpUyHr$AJ7xuvsj?;BE{NzvgYspwF zb**^2kq&POy{T(`#^g!eA>aT LFbR8db};w=;vuCZ diff --git a/training-system/target/classes/com/sino/training/module/auth/service/impl/AuthServiceImpl.class b/training-system/target/classes/com/sino/training/module/auth/service/impl/AuthServiceImpl.class deleted file mode 100644 index dc9e6a8edd411855e250911667a21fe9b9ef3e14..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8612 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 diff --git a/training-system/target/classes/com/sino/training/module/exam/controller/ExamController.class b/training-system/target/classes/com/sino/training/module/exam/controller/ExamController.class deleted file mode 100644 index 949c95473181e3f573320914e0c5c2fa91c03af9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7467 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 diff --git a/training-system/target/classes/com/sino/training/module/exam/controller/PaperController.class b/training-system/target/classes/com/sino/training/module/exam/controller/PaperController.class deleted file mode 100644 index f67a5ed71eb6c3a5e096d1c41c7d1d79ea3fd414..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5657 zcmcgv`*YM(6h3$RSh@|g0`gK25V0*tco*AJOIvy9LQ7i~1r*ZVbQ{=BmL%I!5ntue z@^)0vVMYPP>F5lg1D2Qm0sbBCw*86!!13JN-6Wf4ZE6R9X!j=f+;)^i8{{_DEro!2007Z>2FqwohhNZ7EEH5%S+GOvnSGNz+_RBSVbwE>s`Wqv5<;5nE{VEK5! zxl7qH0)8zS4vQKhtg8qf7J39eCSa^vIuDCs-2;S-dm69V96S$m2+WE}n%8noh5=mz2`iz6j&iKFwk=@=3ogdB~ZpT-jdW6137_4FPoe8c^xd{;1yVo z$diePg`D@YISU~rPlz(2g3_UqKothx8zYR+t>9oKyoLZGVoWqcH_J{CmXQ#R2hYK3 zYRx5B&J7H7Vl4;jj0vTyD<;V-1$1Hq2OFW9!2BGhH1;)%2|?B4qO22GI^LU;KLL0h zYWz^kK^<%+P;TXl(U(AR9ZH8@PoSWpGDM(|RwRM_o+CMlTFevzI%!fO=%g%&C*GBe zcZzC<&>6!wGlNQ4h=l}IqR*L^g?hJy#aH8!9y_=5>s>8@X-6}XL14`U`;1o^jN498 z?^du-RUwYqRuN7~yA+iLJ*gt>`_C>~buMUgWy(@GH(PszY}H?1TaQth-TYbzfIJ4 z3W)^T;oe0(LM(|fF5($83u!?R==NN$b&i^tbd=VOUK~zcx{@0HHFfFp)PsKev7SB| zNd5jrYVg9ymqY1+;j#Xqv8zK*pA1sG3}|sAqt-Pp)#_1j2>7H3ve0(>7~(>p>pyQg zsW1>&#)81kK6>ZJbpI)O_VcGwmwz6+`Sr-P+nG}zmm()nnsS+C7ETVuHhN}6tDtvh zRRK9s%&rvzA9ty?e^ssL4hz)F|mvlo;p6?AvX$;sGzy>2r6HF^#s>$Gwgr3S90 z9zSB~z(k}6&!x@|jXXYy1!p8;gZJ1fnyuUx<|eMAFOe$?3y_0H@CFiitV;>+UQ`P{ zM2CpVyVEui1zFP@l}I113s`Lefqh=0=;#nU*U@SZ8Oqt4KSQc*se$Wb-~5n8 zSM9k3nhiYGo#W56X?S3}6{v8l$w{AiezveT?CNnd}MzHpmeUaprN>VNjoVuZJV^T)064yyar6BUc=rzCAW z1MNyu4U1bP+6T@y8f5E>brsDvfr<%w5?zRDe1|~WhC&%T3``44$jI#*BbQGb-MSW5 zr36(iyieI=Q`?^A^u=4LOW)%+wP()YRiRq|(c@&68sca1t&A5E68maT&<}I`c=BQ6 z4uBmo{np1(DUR#m4Jd>Ld}_pbAO6m$x(8&%L-70H0ZhM(Z+x%?{}-b*z*4jWn8Pfg z37YW<*T9>w73a6%xQO5bz;^ue!47x}f9K-pZJZ8juoHISpk+T04O(%u8!Dl|@L!Ej z)WdY@{~^pGZtg1#_Z&0KxM!Z)oSxcko;q;B9th#N8_2}_rg24Tjr#D zaXaS!U8nzjHvjwK02=z~0pG&`f%oAc2DAakPB1UHf?1yj%pnjgFo$qE2By;hQ)Y!d z3=y0Z@vj8P9Q^6RKZ>ao`#|F%iVvv!AmzdJk}Iy7ytod#;X2|BQVelr=@9pTPd4MW z6><9zbC#|zQ+%&lbPX7@4G=)`Hlp2l%I1lk;*4Daj^g@>W2c$~b7HG<#kLKxZO?-( z56LuV{B%f~@f%07p1gooxdPgSfLf*qs278kP3SQv>-+KoTH^|64+08J5zq%VK*ybc zJ~RP2%WypfG*0~v@!cs6PQw`u24E0p&zc!K_YcMa BSDOF; diff --git a/training-system/target/classes/com/sino/training/module/exam/controller/QuestionCategoryController.class b/training-system/target/classes/com/sino/training/module/exam/controller/QuestionCategoryController.class deleted file mode 100644 index 024a84e1e414fead3e9fe24688f1b43ce43179cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4161 zcmcgvS#uOs6h1fGB$JVZAYl_(RGcJ+RtbwF1W7_LIw2t$Mg_N<>C5DXp6;Q$Cz!H) zqO|e^f@|@lP=$p;l|R7$F@gLE%kTDVomt2vDSha<`#InF&T{Yk{m-Mni0A~F zEmTMK0cr?QBQ-G^j$291k*1}&HkYO}6I#;J(}vK*=RB#!Ez`9v!w|N1E-f5aTIMi! zMZ&Tdh6_uKwp}S%oEG-Hj0;95BhOagWH**c&k5*nrDkdgP%uQT6k>E@L(&+vC4`$d zAZiN$+#in2@p-Np9HvJsGtu9bok+XV&?3@t`-8NJ+5*%bqRrI7=s-CJ%p@&SvxSp3 zTy4s07zLbkJT4rE(STpc#LS$CyHHb`9FKzML$p=dzsUfgoB>ieik)pC+Dfe^h)VZhOaA^cWvDW?{Cx~V5X zuZ5_W4l-&l23FSRjG6|JW9}fM`fyi_QG@HnAWSQ6t?H&qLDml$!KXDxk_ z+dK&ZZ76Sd+O;;vGOga)=oia_!<*L{L zZC6BEnsb#W5-5W6hct^j8ZU0pCQ`!o_CgLaKAGh90^ITR`oqkPo0-M0pWJ`EbmtpJ zeG$t}XimyTjlHDExN6y#wX0%An~|pO6RDjM?l@1Sun!^|=edyvQH?0jUcFigwZQ9| zFc(fiL8~sDxGhu4Tt>~y*X}Ogx;r+)=t#|gr-WDkJ*kk`Y-22Kq1WTeAw;MuT8KwK zC7H!rPrtvb%*rk{>A8|sClNJkzEbeMkouQv;bM}zv-zBZ z)TV5;WW?89zAD6Zl~PcTO3UbIg#)#eV@A$@jWL(A#fq%cxacLqS`}BlW8Aw$USwpF^X&;?TQyz5nX2S&hmFZ<TcXq{WW_~S;8p1O4)aL!qK8!mFNZ&)f{oW{KL0TZvUD$x6?ly zo;p9Wbp7YdjUO2utC&MVtBDC-Zp}p&a_TIChMXEyUtO)I36=>sr*2W90oh@Z;!Ut{AgBD<5=p0Tk znxbhqr;-bIRs_>m1x%FALt4&-(E^y52d1s)!uRO|EPjZug;*z=3;2{LTa_o(;37Uo z9~E$oV%{HGFDhL7i=h?tR*zEJ}uV*7+Xh3?g{eO7Q_DYjQCVmk$FLshU< zaUw5u;ta*XN;dS%oY+e`NKj53%#juBen?&2J--vXk6C{XZubER7IHA?Wp%-Ujns}q c!aI7&gR+y-k-UyJ2_JQtP`? zs|=vOfDSVVC=NgIa6n!&{sI0SCba*A-Zj`8XmVMEfZ~cwRi-6lI_*O@{YEq3gGEs1g?c|Mh6V!b3z6q8 zHJ1_aYRO21X$Z2dF?dWE6=+OA_Ity}SVS)YLdHEO?ioKk3rh(sjxs&F`7WjlQjEY( zr}3a7M_o-jV?Js#66!Sqv)m6WU?qV?5tRwL#V>(f<v#i!OI9kWHIL4<&r`QLmc-jerV(i>JrItOwxw4 z)bp`sKWs3@l%b)RBwL*Eu~+@j0u&wLBE4h06Zafd)Nul93muu6k<_Ia4dQGg9IyLf z6Kp21g0Js0eKWCRyo)6SRgW`SC$Oc!lq1ImbQKF76Tt|EZQKW~u+S9Q4zvi0G#-h)nKF#=}e<6v8p=X$UG2 zAr=x;iN9w$EA?Rs%W8*96+83%vDy|Ou;6$`50K3{Ou4EE64=A^VMXi{R3VNTr6Q=B z0VygAdQwI351%S+Z7!H|mBOu>7TF8+_*A(<;O=C zuBWEY&s@I71E8o;swH^d4skZe6m^7-u`mrwvgoi)_b|OjNF;cE6Q~*$Vo7AWikgX9 zEoM~l&4ThMStnsb@q+EB*_PXD6@C zp1)Rv<8=;>?VZvIyKV41*J*5>56D=p$h3$mCAh>Oe`Ydblv5W^5h(r0$ViQ08Lci* zQFxBXe#!lO%|agIBPE<`mt zDDZ1SrHnTUd$-pwKl*+O)6?91Xa9k&^qH%vv%e77Ua}tGL8jY~&__8-4VkvJq=5%egjJ{L9L2D0Hkcs+0r7T&}j5B@Iz z;0l6&*Frn~U24vRo$waE;TqV5>j`vXy9z(@@X>`o54;V#@wp6JdvN$24Z2}3Hr_n~ zM1vr`|q{<@6Y$&@9;kWgE-MkaNz-L5D3A0xJ@@O%Ur>< z6ajM(4%uK1T3`+vVCrl#j==jk_yPWEfGowwQT%aCwRmMTUOvPZ0v}npc4NOYNY8Ox zFWN!!8KYY;w5{b~6Y{ZzA%ec=#wJ<;%*VFY6j$0TtAIUlA~} zv*u*X7PID+{BR{4HFrE8j0##t0D7PT{{hq)0<`fyyjJ0c=AeOQwK>&NpgPbEG`Jj+ zFp6cswW!8}-GCigY-9P@PB^fQ8`!X18=oD9&+)MxzChz#BiixF zYth$y7q&ESxC7)CzB$EmrGq%11=VNBuO*gMP>+kgG?sp4z~g(H#J;aJILZA_!8bTM Kjn2)K|Mp+j8DrU>0X{+xPCXrX5DH%k#y& zvw>0ls@|z2C8!}zNsUsZF>3PRBSpuWwMvZQ`^`ed+I}6Q_EjUjqo*JS8z@7Kams4c zM9qxWOxp{&a=vKioRW#EQ1ya6Qz=+E>qc`SH{;m3jTOhifMPjX*nX4b8k z6VBD>JipjOU!YMBUC1cvnmn~QQIno??%C3?`{qr)aY_rk0#Gr&aiA9$A^tF z53G-AbOjfWSzNiyC9c$Hh)ZaY*in5K?%1T!X8JgzMy?%ro#uePcp*+0(P%4I%78H8 zM+A3`YBUyfi7w-=?HcXit}Iw%Y6NiSRT@pyIz8sq8clI$8qBR;9B|qvH2P$~<8iLh z=u`ZqIA#ri6lEeh;+GNmCNQVTG09SlZW0qaO~uxx4-k)gKr)`@b<0Gzj^$`-<~+Z=(3w+`NU^3mtsy5qK!hmHna5jVCP zNApE%yt1&@DowiG);wxYn}sP8U5Q?hg%M{ik8Zel^n;~#v@TKhrb8eN$pP%0!a$8# z&YV57!z`H#mV@EK!~jc~7(D5#394O<^J<)NDGe|$2_f|e88wr(s7yDiK;zXZ8AmM; zGhYN#FuMecBq|LZKa(KVs?Unw&l-qFJGhw0+>DjRcINofo96xAQ(ZUEE>W%)2!OYS z;FVp3QqtsV1T(PI2^3}pFt8Rkxwt@?3X|^@fXT9Ep%z$^v9`Nj?}+^-;c3rl+Q3{Q`+d^{D+MpFE%X z=CL06o*J6qZD%l_9owC{*mz9XmD04eInT3gle(o_!!t5E^h(=yc#2$fXLz|WMlUAm zCHi%oe!~~D-!kg)x0CteetX`^x$^G%w%MF^u(M(GpgM0Q&=uWc7H0}pxo6b2=PQfq zN+wf`vTy~6Jm-eMuTk*Ty^>NSC5FsGVIuEXg9&oI)kkZqXMO=i;85!Uc{)O9VZTP#|cB+ah?!& zoF2p-#|3f6P8|2M(GHxt@cUUj-2gp?`=x!yi1pPUr}#6JmiHEUZppD}K5X9T<5MabahfzQ(o zqc4LO#qvX0Jlq;CdC_tuc~q#~V$veX(Tb3)ylej0@CM3TeF4?|ZNxmL< zlAS{G8{v}rawYlF;z^z*BoBm3b}v_wuTq}m3L$w{xTLb)oPPH31<#W_Pe>jN528z! z+e*H6dXkq4Nql5-3@kb4^g!KNdJqJ85`(ZqIKdChA}>X zA0x8*RZ8iRSE%VQX{+_f5^bm=HX2btHX1QK$}zE5sQECZ^{5_GK*L5HpkX7S$2lk= zL2*5yfVLP70BtdndIJX~C8$A9Dxhsf3ZQLrEWgEJ00rvjW;>v;efrXw_Rds8xbm^i~D5 z+h_x5x6!V*aZtMiwdw5&XphkW&>o{x@8F06_9D@0GURYu5(bA1nGKL6%;vw zOkA&QN<`jfS$EW{d7HgKchfxxlQ#A;-HTlgwvB9w?n7BU^|7OLKdcD8%-u(aU`1(+ z9iVT*icx_T=>b@ADzQ0w5LSZjVI%Y{SPk?58={9`C25KE(6?cw=sC869)_jSpXojN z4y-i&mHtVOz{+6X^agzwRwIki>+~qBEW41Nq3^+JV*T_aJqD|pZAFW}537akpgZXY zuv(c-^YlYlZLC5TJr1j#-H*?thhcTFhp?Ob5v)%3EVj%~z|z?Z=!YM}>Y|^ZpYEcS z@x;F=6Q|6()E=ig{706OqkOjV@l`jS>bhLr z5&()(<>M>Y<$FaMz?V=IVX2R6U%f;#*Yfg> zMua=`i1Z|Q0&rc!MpU>k_XR1TN2{(aMohS3o(mblWoU<9c5d=SD2zY$7eGd)spX+!*8%3*tDkc&vlCYQp z^O3cs5*!bLeSC;RQWB?7d{($m67lCa_XUAh|BLsH@W0lDyCpsOK7POU(;=it>itE0 zoil)>ly+JvU+v5|DVRQ!ps%?ssFdYNRm2tOr}-~OVYz52jz5nsN8E4u2Oyvd%+X(Z zr}k^*=YVxchkJ0DxC~qyaSh|zf@>SDaa=obP2$>xYxfCEM$GB3bnSj%SXa#q^qfFF aPyCP03Do`qu9xXmJSAcMj$WfblKx+I3LDD+ diff --git a/training-system/target/classes/com/sino/training/module/exam/dto/ExamDTO$ExamTargetDTO.class b/training-system/target/classes/com/sino/training/module/exam/dto/ExamDTO$ExamTargetDTO.class deleted file mode 100644 index f952ca448637d5abf05043c8943c20670ead9d61..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2469 zcmbVOT~ixX7=BK&n+;+4Xv#;U*ixlR2oOIgEeTXD1xXDQ8>BOO=ndpZpaINYdFI1lA+#LBD<)o*mJ_x#>r4IDOkBhzfq{;`y2D79h42=V-ODCk#~X~UZu#|9 zx5oRD$x@p9Uor6}-Vzu;u=ed$*Qr{;y+%Ng;|G=#_yUX3dxS>M1{#e#gc!&QjI>B? zxcQ3hHLPaiYiqAb=bDOPsN8Vut)qiI+uKnG>9Sk3n!6Uk1cpK_s5cnLQu%*ox=5z{ zHq(l!uH1wHXLp&~O*^Q&wQb9@4(!18=(fM3DwA|RN=7S3Qcbws1r%mmKzD<>?a{xy z!qjOE4YuSF!B7OCLL81llxUz5Sk?Va>o6on-@aSgT%-FE%fqw%qbA=bu}HRTKiF{nz`(jd_N7TDdpBJ-@c9f66^;H-0;Lpg z<6{G5S!bI9Q>V|Y;XHKr?YxRfmEO8l4P5V$z&BBzL!dIcVL7#??N60mcmL?H7^%cC zj}b|iq9maQ{PPID{YoRE(8Q|MY*re9T}*0@jVY?I90CnRA&F{p*(O_ zd8emx9&giy^jzQ^%2g{FAdmZ}r^FchI$y+^U*V=M1x;4w8pw0b;{*3kv=Z;~{ zWwgi0v=I{posfw_BBM)8;u+G%7|7_EL>r`?&{sT?0+qiF6+?%IIu>x1L64$>Mdmby zDcr&}%Hrhq2Cj3Z;UgB&5?4Al`5h{7l|Yg9C;1Id{)IsU$>$g|5aVA`JjVsK?CX%R zKxQ=gaSX{=qDz@FU9un}jTVcFRAo%>M5;4B8EKfY#TM86piv}?;18P6ITwbD%i2nd z#EIczofIaAbH^~|9%J$gDW524@*tyyCrL>xk0yE(wxFzrVZ=$zGJmefS96v0tk7$U zh4?;qamF%^54h4=_c19Lh293VF(AWc~r@ CHv9Mh diff --git a/training-system/target/classes/com/sino/training/module/exam/dto/ExamDTO.class b/training-system/target/classes/com/sino/training/module/exam/dto/ExamDTO.class deleted file mode 100644 index a1f9cd5ffbaf502a7aa520a09c6e729b27736b0e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9593 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 K`YZjN)c*n58q^E` diff --git a/training-system/target/classes/com/sino/training/module/exam/dto/ExamQueryDTO.class b/training-system/target/classes/com/sino/training/module/exam/dto/ExamQueryDTO.class deleted file mode 100644 index 19c895e816f008b4250640be7755143369fe7b5a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2831 zcmb7GZF3V<6n<{AZ%H>a4J{C@h+3d++6H_lX$w+XsidXQ@*?2NHrb(}Nw)58KxX{p zpTO}4$QM57jKT~b9Q}eb{w5KhySqs@ZFF$j?4EP(bIv{IIp^Nw&%dAk3Sbsrq|k?i z4#k8DP2hONX%xI#(<%6_RcqFow+pm1oMvIe^6bK@b=$twvfcXv+6TN&AX~m;-L(pJi#xCR zE)yup;QLGrAR}N_?QP5T8+OxQB03X8mz@ZkHL+i2p?SXLx4abHhfN&7L4nk5+rQA> zYG`ac<{oV((K!>Z;8lSEqR(~hm+f*1c9agUnK&%NC+V;jY?>vzM@+ndHw6whtSx)q zX;v)%TFu|2#KfAuCvbjjZvrt(5I?3zDgH~=qb82xn1E5SnhRgGth&H(JpRRvJ9fn{ zjo*+hA2Ts7!I~|R zH8yN_-P))VlPxFgS7~ixt}_2++uwAmtCnju zY~Oad)d2mv+qgf@OTh9tU6aIx-D9P`69yF!PWMzsJPN3eziGPygR-L0?!n9kYrBkQ z0PKudDJ{$QE2!J*}(hpTNh&CDuW%hq;8qq=%|X?cO!EwPEN?X~K@Kzi4P#%L$F zKH83yT60=%#a^t*77fPF;k4{MDLm^qzQ^;w9dhXnXtR0JzKatb0mGo@t!A}ud!uE?*=lW<_D*@s(&e~*f7|W>zZt`~Cp~70 zLd;wB`dZDmO9rkBoQxMg7Ev`TCXd8>DfN)LSuxJGEH#_9J72dv&-QfO6gawvie44! z_)OsNe?!^HkPdQe@Yn$fK6#^3>XY|h@aEmdcRx6Q(D;0tT7hrDw>t3z;->)i4xe%v zgufd+0|4H``_zQI5BcnN{u%m@TD|tQJ)L<~_HZ8D?VRoD`~f~> zelqPM-;yJ3BL55Y-bEh>5mC{S5Xq*%Df+2`N`^`irCuS^FB?)erV}z$W_o8i__85o zk2@jv2k~b+tj%yNWG}N5k1@p0A$~@l;&os*h4Id3JDumnAJ!}8`A#y@gZ#t~P?bmd z-(h?YHSs9_8;s>i#(gVLC-P5lJe0WI$|N5}W$F*~=agp{d2wm<}f5R+w_9rw=fP(3qq;Y|NlI~;7vrI`L{Rgp3 zNeu|S2kixaQYj=<2yzG^UJ$;c_esMr)Ha}vQMyeLOpC#Gkh`q}bB~pP`HM^zOj&Ra R1SjBAYAH%La0{O!_YXwWFJb@y diff --git a/training-system/target/classes/com/sino/training/module/exam/dto/PaperDTO$PaperQuestionDTO.class b/training-system/target/classes/com/sino/training/module/exam/dto/PaperDTO$PaperQuestionDTO.class deleted file mode 100644 index fcd41d7a84c755015b24b99e00a721ad12bb7d2f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2940 zcmbtWU31e`5IxtHEX7esFeKoX0&Ps2#0f4RZNVnAB|tGaAK(yL=m(0eNkkkeNHT@~ z2i`mV0p*1UI@8h_9y;v{o#}5XrRPd=EC)}AnaR*{0iUx2%$N-`p%U1GltfZdu;><;6m{x!Sh;z;+!91hRMIw`!9o*Sbg7TxYE! zkJ@Em7$X9z-*7!kU{3;6bpmV6@VyNZrf}L zj7}sxL>X2lZ%T09z#Di|U}((>I#J5FaubsYlQ1$_v$qT!l)f{TbnHtHhYh@qcX%8< z)T4MudyG2~OK`!!5eYUVxEpi|?-`iDB)zPg{`#ETWY#QvHAlLN2BtA1uy51cu;yH+ zVFowsfFQ>YOegRKE+^9qV@<@~Ilhl5nPNTg$YVuANnmftiS3r^mS>wS`#W>B#ekG3 zuHl;PSPSjVRm)qB6uFw)Fk34o!34%aC0Mr^+idNBG)slV_`SsJc_r7$6}Hj56|B3> zCDSuEt-$hluuj96kFlgprykPGkeCh)0>UNni8{rd!bWt1b;}bNmN^xA`Zv_{h_WFl zZr#C1AHVI2RNWJYV|7s(=0&W#ZLeWnv?aMiof~^pl27vmUfD~oA85ELF!lN*l8ke%8~7Xz zTM;Y%a0bg+T*r!r8?u={7btYEz3tp{H>^?=R@C1Y%|_sQ4+OqXG8Y3QrULmNblhZbZ`W++l$+@G$gG$? z9P$%xIz-P3UUsAEIF>ipGJW4-$ByjuqTy?SBd=7dUja1S7C89dP&QChEePpC|xYkaJ)F-K}2$aU*iw(A>)%_m$|06W~Pe2K`?(x?U6+!WZI{tYxxdTZuj^8ByzMf2;SXCBr8vcP zfC)S-PW=c~d0hMh`VUakkBh%UpP!z3ioM}0H~SZ+`6w$he_}ANJjd=wFlO?~Qyl0Z z4wY3x4wW-`Rbn#Fk$Z%pyqeD>K;vbNpz*Sv*Ca@fL0Vq#fRx7!D4pn=sOi3p0^P3v zLsW2vnT_H;|L2@!A_dquOIaFIXy9Y+6nut@_=GzZ^ISjWE`t_t#X0UYcx>D`?sS~z znMD|y{x^1M&|hFoLy8|=yukiwJCNLVXs@ukiu@N6(|(!}$xc#bC1oPX3lJp|HIllW zh|2I~B5@dAi8wG)StkwpNbwQ0nWuR7wv-<#D^ihH zVvR1ziB#idHB^z8&`8g#q3S^YQlE_uj3Z3r8ZNMma!4$N1x+D~E4aj{(-`N~s&c2W z^!sp`J2fokx5&JtKw&Y3U;!b-OTxSFDJd9*+5vPhO0Ot}WfHJ1a;KDFhIs|GsCHq1 za%|;f*<^|M9e>95z|IMg9BjEbafLl230%NpxGu2}V6O<&`TYX7q-W}NmPK~wSNH}d G^8W&q`c6au diff --git a/training-system/target/classes/com/sino/training/module/exam/dto/PaperDTO.class b/training-system/target/classes/com/sino/training/module/exam/dto/PaperDTO.class deleted file mode 100644 index c2a3227312e5121e6ccbf4814982a9fd5582464b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6204 zcmb_g>vJ1d6+c&&v@2<4%S!BIo21P{DSjkX3W2~X4kU3*U2Ny!)P;6{ZltZfv8;8p ztI!lm0)e)KhVlvx1xje4p%7@=p=k&O$_L5}9~ovC9$%PgLi#5#LkYjTFI~x-)J*H~ zN@vgcopbM=*FD-l{`b;vh-ipjOjC?HB#JAPpd_Q*LH)2^tm?Jt;_d?njk3cixz((h z&NfCJef?7@k|`xoTA>Unj0VcqT+udbR?(^JfI)4}sx+!b(Re_gD^?tcjhY zGm4oNEHKtwVa%#cm$=1Fg}NxmDB+k+)nJqtK$A`#W?fibp(PxasTg*-Zq7TVRpaVC z3iZ-5Mrp@#^y*~Us>8+-!NzFKF{X{WYeZG(CJvS>jk+FKSgFt|&P>hgw(T0=c5hK= zHGfK_V$ADxXU?cOqZKY#tI#?s0Dh=p*xZI4K3KystHm+Xc1mdgZ&m1B)Q82&dTrOC zhF)dV(Nm9jfB2ybeIvl6Dbuu;uQB<0ZB|@%vCMtNyM$vGCoE?Nn#^no;g~aQTc5@bmS27T)a8>eUpe#0 z8&98p{o={1$AA6$#Y_Ks?h>O_t&8nHGT*u&_x)QfIMJw9v0nblv0q(&^x;ifM&<;SeDUY*hrJviQH#+?}xS-9cup}vsw>C z|IENSVL3BK9TmhwU*LzU>~dVP%VmlOV$KtatgH(P4nnxug9r>45FU!~n1>KJ-JT8M zNWgY|J1xw#w2N)iDTuB}6`D_-E(p(;Er_Q-tQ7nqMS(!rT)H4^Lv}1Ldoh$u zT8(ztzY2QC~rx0p3%)Wh9bp0 z*U}mcMKNMDMJddzAEl3hz6YmojPAvS0o68VXkQL+8@Yceg96k;<6gBb1l6E3b@H#wZ`5yu4lcmPlpH`w_}3+LhNvD&sdng!0Yp z%6*Z_nD!Bq_E4>9SKb(*?4`>b)~=D|8`1C`Lzt5TgD;U3oh`i{!p|0-NxY00%|kDN zevJBHbcpIvCbNq*$tyB6>D}1TCc77Fk{51h(z|h}5w**ui#5r6KxnepwSPF;9ND51$!uE__YBYyK@P4dPQnq2LgJVFmrhntCG@M)MtYq-e{ zp=)?8XJHa~J?zs!bJIMn*3ooxk#$(a%h=C=iC^zt;9`&A8x5L`3=TX?iTJs}-;w+z zB|6RxzDn}=hJg#T-n|9UKd}KHT72UlD5J(-qwce$Y*gbHXk&obq$L2^q$Sk^$0T2) z{8`GX2{kEzHfs_AULI7s$Ek}3F2WdRz}I@K%(b^4&J+9`mxYh3_s*K%qX2jzTFmzonm!&)~$!&+YL=AgU}>Q?gs zD1I(7Sg(2>4l16F&_ncDM4^Y>PDgQO#PA|#Egb`|g9g}2`W&b@8q+oUJg5X-C;Xd^ zgGvJXH~Io73AOxZ`XVTqzD6(6!=O_11U*lWfJ)N^`YJsNDnqZ(3HlN!h5nB9Pk_qO zKgpmkgX%<{jL>7Cx>yn?$4O8*wjPK6S3q^ML0UnNgUZ7i(E(Z^$^W5FiR3q_SE3mH zW%ed5_sG;cKn6YVAtY;@zqay{6z_xZ>JD2-@a*J17LQS}AQFL(;kBdKd01md-5SH& z8nDpqJJ!NP28RBTD{YMrxyijUSDHa;%eld`ByGGvcihMMo3uC=sBvE+^Mv;`&v>U8q#D}B!?oDgr~J#OSvLcgRhkeM8jIz z6{SNFY6Mygnsqo2%al;Ty?Z-$>KWTYz8+Iq_XI1#gg@L~Qw~($7l;7cY(NxHjS1jB5)n z4cG8R8oNaMh}tJ8aZ>L0lP^x+b8Go2`aZtnSl|pj4T>-I46f(sr?|@_Th4%Y4oUSh JbhsBt{U1pWACs8rHYXn7IvWt-fgp-HyxZa`-I zU^5@@=e+4jyFVYx5 z!hmK$M^fNO)oB*Jddn&Lu3c}{TQ`feG@Vv)!}erx)xIe&w55AjAUVrre_kLlF?l%! z6Db2}3xlu(l+UgxO{dmw$fEq(ZWe34!${lG4MLq>KQCZx$-8$Pwbk!sPHK|tOc9qNbf-luj37YeNB5y zE;y~K?O&<;o0OPX%l8D%PCTDL%o4_YOe%0vDkM27V8XyO8Qq~jbWrG{7K(U_p*L-h`PXF7_9f+YR6q+YLzQ|< zuC$vQ(p|SV8pPx(PStK)w%xkYBctYT)>-zNSK)dz!R4hN@}qaLny)C@DLZY|r}5s&)n#iivl%x;NYbfwpB_yU<-8=B+Y z;Kq0-QhLp4yH&YZ4|>#d5|66xlfzSv<9oaUwnH+#p(HM*v4(X6m()~~tnr;eskd%B zTQWMX;h-I@X1@1(tx@GgEy}?z6Ze(M3T?r)QWryzV)d`5I+U5xA|1d zApD)+836Du-lHbemB?qW^UpATgBsAQ>>Q0^Bp^P(YDW4a+jWww8o!!H_A z^|%{yPY{2u%i1i*LiI8?^$;Wc?B{3fFVw zFBvdXPqEiPf&Zp>iv6LOii@3DnrD|Z^(7q5(g~)d##2|Ms!HOgDy$@&PQ6=+&dgLL z(R7{+`p)lOnmF*{7(*l(=xVk+%X2<6r+U9KmMw3x6=t?@AI8i>9Q#t)M@pJn$ZOGx zsTve6jg|CZiMgbG0pA;dGnck}^e7=_*ebTC@4DS{2 ToCCoL_>@|j(ly+`=g9v9hfgsY diff --git a/training-system/target/classes/com/sino/training/module/exam/dto/QuestionCategoryDTO.class b/training-system/target/classes/com/sino/training/module/exam/dto/QuestionCategoryDTO.class deleted file mode 100644 index 1f9aec16f447e7c99cd3e82f41004cd71a3182f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3983 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 F?r#`--cSGl diff --git a/training-system/target/classes/com/sino/training/module/exam/dto/QuestionDTO$OptionListDeserializer.class b/training-system/target/classes/com/sino/training/module/exam/dto/QuestionDTO$OptionListDeserializer.class deleted file mode 100644 index e5264f2f86de2ebad6199859b35a53b113b2e7e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3975 zcmcgv+jA3T6#so~(oNC@LZziqM3h@8U_?cvEnr%1g_0Ipirm>IU)wE7w(f4QpyCbh zqJURW@irq5z5vbykr~Ga#|IyLcE%ZJ{4acPz~8q?LkS5WI!y^}IlZoJW`+c&QRflkfDug@nW1QYmHIUzqTx;*cVULWYNelJW~``d8$^wSX)Bpc z$*3GN($S=AMK@=qeED3maE za4{j!d}EjA4e@9xp$Q8#G%Gt6(tYLa@M3HNn?Ss&0$e5G*jmXLk4|CW8KPma!2I%u zUuSj*ixAcE0G0@7rW3PmBEK-mt(G?U8UnO!~}d9E|i9F9y^Nb z5Lk9Qfy)pMp*?TIS{>_@N&(Z!%MGBD_V1Smm4zF1bYTqiTzu_Nblp07ROnVS zZq$5>j$W0HHHOni3qs7ctvdR#O`vv2W)xa-qa@JvO`T=3Q)#zd#}4eI2uHdF(lXKA zAHZ$_{{fZq0qhlk;x%*(DBb{hy=tIzO6rix(xB<-lr>Vd7{agyQ^yGQ3rxQ173F4H zV$B(GL(fzeydhYD#^ z4Dzeh$xsEW!^*hy2Gi(TOT7YA&1h3;EHI_Z%*c2)Js|BqV<5$qx-KhWr1}lsEu0q? zeeSTypjhiE@o#Hqt3YUkm1w+Z*In;xl?|SLm8w9|>|#k{^jKc07Fd2;YBE!(nUDFM z77(K>D-|FwtyE-6xGHs*RbVJ8Tfs++pS4IYynBtPR(C=iunLhc=e* zwcR!bD~ZCSUY9)wuPo318r~LIdXpks-Zr{=%~(Quj&U@c7_YLX747UU?$GQ_(jB&v zY(+Rg_!&&$%4|OK zf54*n;-3&&oWuR6;1_2v;lb?}@NkQ-`Vl`Dm$uYIYA#~Az)2iaBmM~>Pm6X5?W9}X z5{PIytT~Cb5svEC=dj@uOA1xI-bf8CxO_MO2jB`R?e zjgi1LJQTzIh%XYjh`}msJK`5-uB0NqvozA@0n^Wx9f^Z$MH-5)J8{9wn<`Wnl$M|BOE|g@7r@1&-q#j)GOR5ws3?mroVma6u0c;ho?YoFE)yc)w4~mDDBtR`aVhFI<#^ zT`F^8c4!5eO6wY)avUEN^$t^SJ^{w{c-GDK6ai{4VJ2hyz&Dt#a!*Xiy-r%6H}w=g d;$9U##wXtQG#v@laitNb@i_ygo!>7I{2ThlOcMYA diff --git a/training-system/target/classes/com/sino/training/module/exam/dto/QuestionDTO.class b/training-system/target/classes/com/sino/training/module/exam/dto/QuestionDTO.class deleted file mode 100644 index 7b85bc2654efeac924396a7a64a8f8154df9d224..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6396 zcmcIo|92Eu6~Aw@yR*BQO*R42Z22NzmP!)n*eJG40s;wXLz6%WO|A6{lieX1vYAPD zW+|W+v|6ccwQ5yt6{Tpg6==a0DSkQi2kSZh=76 zLT2Z_dq4Ny_wKv*zPI~_|6KYF5pARkDT+{&L{XVy6lav#r|s92qGnDhJ0|z(d52NF z-!Khl6QiazT@y)4P*S3lOwA-ST9>zG727Z^#VKikL2cG5l#9BeAJAr%f@3N7ly%!N zEOT)84n`5903Rb&CnJ_Q)yIvt$ka+1Mp5VBoX)5{fEjm6Fzlk*Wm>>dQrR}X{(xHxJuIUOu-C*zyStrx2+-6+o25qkSA(?LDnrUbb_%q{@56kos zE@_2iux@f6mFaf61F?Z@w;R}nH6Fdtax=v1}auZ3I*y2W+a|dPG#<|TdR|J|b@=lrVqG1GXTC=AItO9l&88)1vyJm@@g8i%yWBI1^@-Qk2@vQYu|4i7S7 z+mS1k)lKk##SjJlk1@*bDw~cmt4|oV0Rvl1({ePgc)05sWVogv%tpawD|sF!Ug3_d zj9JcBG>Dl#?8K~Y+u9Un(D~2jj$M8B?A3F>ynOueH!nW<)+4`u^WvqeFI-}@wAL9< z!y1R}P`&)x`C6sqxG`mFPPqizcZ;a|xz<1Op1Mv>q%HbS-zLnt&(+?m*^XX1Fk4ji zY55u3G8L>;n>5UVqWRHKwnH$ei{KiEbZE!Q=yp?#hHhvMycq@Tm0+;*%9)c_Pn^Aa z=IJXZj@HJYQ!w8;b@Iybr)ot!Ro`us#>&N_>)^2?m(Lx)eDqOlPOX)wsJhk>!_>#h zvy*yhx5%gV5i741Cp6?3(!*m$ooNGQqP(}2V+Ny@mh(RCV9XZHb3sGFc1@rbMs;V} zD(uus+N_Q}#*`%}i0)U@nZ3f|N+}>vEc{3j1HaW(ocMF^Hf8`#*YsReO+nM-j5va;EhX0>ig7$Is-1%W=t8 zmsvgi5K5HK7^@se(ri%5eeHyX{k;Ih-X+SSE! zVljyvI;6;+M9!b2l&j1r398~e;aDQ`kZI#qxs=z347Z5~Zc4ZEK93C_!`*3A=ap$o z^cc6^rABqxU7~45NHtL)I9Djco05zT5om?KUU9-R7j&Z9$3McCmhq@=-8l#x*76M;`x+KpQg`%ktVi)s;mgVtT$r!G-CGv zg-bj>HP^?aZ$A(Fg*@pH;riZaY;U8ny+Gk!--w-R#7+T)>wW+`Ef!=1us$oozXM=` zi-5t`C4BC~NWq)o9qaxDv2*VHXYk3zM4eQ`rz`+8OD0B)e+j^6t@0}*y$oT5s>(}4 zm2smFQBKz@FAr759X~|5tzLOms4~6@V1D(}URbZ(6{0Nm)q-z)MF^QeXT6cNAx0Sg zCJ~~%xL#QaRmK;n5ang{%Dth=_>L8#yrN$Dj!@+}de94;igyIt9PjRVm89@&=@1An zTX-h%+GA9LUJR!Ka+{G&PMFE`d`PG5B0~ax9y#N#4JFlgnNEpAR>=V!kGMoAXVsa!uj~36XD+C-6p_XG1;R&r>XV zy63l)c!pw4r+Z$f#OT`Y3zTz*Al8hn#fKVQ_j_v2M&F>eQzWm;MlaCX3PMq1fGBD_ z8{?Sx8`OS^(%D!x9su>K5J8X0;Wd&1xpw%0U?q)SAr%Km%$UKm%%f zwvB_@Jy2V=y#k7!4y}aOMT9FYfDO^ZbQoK*h}}jvF9>!HQ4bC}xUgHWl9 zrNqCfMWV#p)FDv>e+l+BbqX^1K9H5B_%M<*%72LyNlF_KEZ%2hJUe-egXe0n+r%m{ zM%0dA=6>2Aanl|@QGtacuW2PrG{ex}GkyKhjc#%;$@EPlwG)}1QzWgsKtp>tUs0o6 zkd1nh1W$M&>Q!T|2)XVmC9<)KXuTSDMR8w*3J_WwRLK<~`8_SEBI;KYt|;M)P!d9G zvzl~8s0L3fSrHAWDOZ&8MW_*IEeTJ?Ik9dpP)+m~`X+q~QHjx?>1j|Aq|YDe+X!A0 zE=aG@cR)q)v*B^17f;6fk(9?k#nC&b>3g6gq{}Eh11do;QZGFVDoMXXv;RJ*6i*&@ zo-)_Kh)R@T3<-lDuCBpBbsXW0MHH(5Dwt?3%Y(%Ouqv{i>w%?Oa1|dS@Kh2FDpjp; znWu=K)5QXT5B|C9jq+dH!^NI@>K)`&@7F_kMw;K*NY&1}fM5za@dN*YHjcgJH{dQ_ zDtOl8*?_12B5lWOGoArF3ZC9ew3Dd*DiypscX`PdMN;uv{vrJc?>MLvbdr7onmcMVml0W7y`3Romlj!ucxv*x-{wu@%T zp3X`W-8y=tgCTo!-IR>II^vQMuGogX!E9*Qr(-{!;4v$veZJ~aS7OL_kmr;{KdIv& z4hh7Fp7i)@@YB z7>)|`7L7G?(kd|_m-BXx6vHUl6@k^nPIrAA$DhaSy#Rd(kMl2Ccv{CZI3}QFjMACw z8%9B(+wZ}J8f#298xJ7;C*jj~ZRZL`edV$}1uMyEeBP9=t@*h-YYBiIMz$Ub28Nx9W$9&F1! zPC!_Vv*Kl0K(XwcS*A@H??A)2IFbfdy94r13az@ZMyBonYf~C?F|~cf5zE11s$7}7 zX>kPXOb!@l(iK&=F~*fyn>E(G5-IbSrf1JEwrMs<*{p07Y=M>rhhqbcerW?WACv+2 zNOhoUKe}LTlr!epyljf@?YGWR*>Nn|Y0I)Jyz$oE>Q!39csGg_6{5h6;nOM2HiJcHbEah~mWR@ojMx|m_ zRInQdcO)q&b`{qJ4m=*p>br@;Azp(`yz~^l`E?=HB)bDd&p|0E(sLannfO2fR za(kdMKMn!P?c0?*0+spo2vF|YuG|@@%+E}Ka_@HKu0Z8UOffSuVJWUnT*Jd7KSB*o zcaMwk(k)9N>nd=DdJ3nVMHM)USAtB&c570$NX?|XITviQeYYlMx7AF#o9W=dyLM|* zHg3&ik7NJUV3WPOH7RGHW-{)WJYTEr6bD20df)Jt^BmyX&u5TN;x0yj?FIKwNMCJ2 z_yKpTBYxu=qs0d!!(T%Q-5&WF+80ooZ;#xAHakkYNoPAeatF`4)D{lRjq;TWjs1d_ zc<4UbZ$Tf6hqmy1715tk2<^v6; zA_NVlqVb3XMLkd?9`%6|sTP6~DLvjILAnPbRRx7^GstG&^v9e@_|Of$*2@ntgIT7y z8^2?Y*GUtO;(J^muNmX`2J@ssxQNgA%(57l@i8uu3gZUWus}-1`!KOcO2d~NgV#t! z@D)#6A{E6wUJ;i`wctMX;dN3v-k@)%(Wz>GVUG$e@(?{Lj`OF9huG_qk^d&E6F9@J z3CVwS-UOatKys)RSzMV1|1Id|!JTQPmIsB=%RG29J?Hcx|HzTWYeM`<6B-SD+Lk`a zd-=o!`{cmf{9Ns1s zB6=3@@KK04hHIq4xQSjEq*SM1e<1n@eF&-0gkX&z#3P!h@0%o}8%h;W#e^DJ9xUvG x)sfq|9$0Mz*YN=YPet3IQr8NWQIYX1JN=SDmaE3JnS9nzkOx@PcA%Vl}puT5_R$ z3Bw1Fmps4>gqc2c;HAv)4SWWVl(LQ_J96V;fSFe3oPG9XowYB{Z+|^`3Sb%cQ-~q1 zLD8WiAu#yBcx2>ihP|J=v-iL(djg3i%eK7h0`ZB--5w;-qamfE7rMY=*{SDT%XV^J z!=M_?>Q1FuGjrybMm<;YoLs57SGT-X9&hd3$=D9Kebc)eL6Dx9jF|WsBsZ_GQaeCi_=(yot92M(W0ax#HMm!@F;JRI**qusv5`A^Hj*QUqccB#Jr| zX_zD;pHPblFdLRpv%WI+Y7DLf7zT=#ZEiK|duC%NxJVbBvQgVLs7%FBsCZS2I10u8 zo#z6Xb~~9qf96$_yR3js)2lj_ZKGk-P0wsFY!3}v1a~B~^>msEr?V`=Tnngn z+{VWmin7`^1+u4&X4#LN12Y%k3kq<}D0@!hvB1~SB!!BB({;nH)J!*9bex0cVc~2= zMkF1EJC6^|F6y5}^jn=85rr;Rj9RT^d1fIA&W_HhG8YsHr^>`>o|nbUc#wo;!FJF$ zY};(C)C|`(WofldG?WCcoFS##TQz(laOs~_SrP#;xXe)zgTMs8F*z>T@-aEkxb{%a zdCTtVX1gF~<{U21fbqH2wkFcf5?@)c9goV@|Iw z#(ggvU+QX{!`loYBj>rsxF)8ie}vW@_i&&Q;+AicL=IAALnmy@=x?@NIu7~h8X`P#dC}X z+nzQV^JGSmKaL?8iwr4Krb-qh(rB>+NP~>2ZKNvkNu*)M7JRPxlSYv&g5T*v<(eNX zEGf%AiDQF>Dk)43P9H&=J;C_rQa+Yf0q754lr(a&AL;L4iVYgdiah;supX&oL<&g4$AO=_s8dsxjV;cCTEM zuK3b^`AGSoC(IdMZklMj_J`;d-1MnlVTvW?t4u679R$|-e+%0@r72JH<}PQ$J?vl? GnZE&0XZywNMif}5)-1BD3T@^{ep?V!H*dG1NXY`M>a;E6onT6_d*>IGPe>_Ft6D z-AU}iZh@8+-JP$SPxbYO1Uv^M7<-b~D>cV-sn(J5`;vGD&k8hCe!S*ZT|Deq1P79M z4$srElID~q?4s`BmTSgA9E#(GB>K?b0P})dA#4oznr2q@*((BvwhJWWsxOgEF@b|g z3}IMcS6N%tCv2;rxfcwVb}h%%ESKmV4J-44+^Q*zL!dm4j6kQCAA>p6D~4toA8X4d z<7s!i;}WxD*w*>nq<}ap&|0&)Bm+_Do%|C5>G`VV8fAUSa11IKw=CP$T#C{?>D{VU zakUJ?H;NvaMMd{zJ-JS1#&&0_rkN!`W!-VK6*{nIdtTXZ{{W+-urap z#{Gx))_?zUU0`3MwZ-dejTW00j1^0Bs}(Am_OYmEa5Vpv_1x>111mdwf-Wk4!gu5i zOP{Hhm-Wh`4_PX27c_H8BaB2KAS!OjAOuIA)+i0l)@t{EbG^k0_r}gGRnx!3#82yP z$u7=m6|JnhUUN26tlknesk&2HDb?K=JM$65KNlFOv;Q~vr7d9#q(TKAi~#}Fc1wDN zMJh4x-JC&f9z8@zdJOg9)9T-Eo)=uLusW@+1u>{|^SS9M8qRTIRCK3ma$+`x^d)-h zvI*C&HG5|*f8L}GdX58T!LC*c`YA)US*l@j9+thx5jLYc?zApT%ZcM1f#d(WVwumA zw(ZJJTk{j^?1{UJEd+QIIQ(D2bE7t`+3l~hl=qo*= zSw&NKdh@ouT3ySAk`sg-qBID~&fSLnQi#7c3x=y_6Cjkm4N&&g(my7K z_6OM+6P(J)oMq{i2~%?%osHQv?#+5OcN~Vm!7WH^7hoK#0?+(2D@(;k0|)qai9p~m zqS%8MafJJqI5i`9nLoZ_`Fxe<7SfOMcg(?SI8H(<#7=CIBJ!ol`w>qzize>*KIe0k zlnhtFRUP;q;v0`;j8AzDwBZDwNuL3);|-qpLcwl68->3`{0=W8{A{QRcWx`pmnFHL z6mES|IK7RqAHXi~RsLJiZpOE+* zYV`Ktk4Q`p4ctYCcjTsPW{8gwW%y^bq?HHgxP|0!TDgmKjiYBoB}>mpEUikO*aM_) zp*5|hV>Kq__O{`i@qMTxR6-7C>1P)faE@7zpqFUnNsD5DnVIHJ!D*K040kHedojyh z40F`KpI?EAKhYLP;t{&zi10rl9$~k?ZK@-mBPfdeRtvy5PLnd3szgD08ZM_W@M_&t zmHtUjgIu2Ta>r%F7{uR^qvt#UZj=a zCLw|4RnPW-z2a*P+=${B-o!j@s_e)G?jmSr$1c*fD1F(5^V}&OI9wl-pb#7(2naud z9+PSF9Fc@Bs5OQfkJ3mY8|^LOLJ(lqk|x$#yF1G6 ztYd{EKsdvFhlDE}F^4%)MI6Wj6@{{dfQ0 z|8@7@|NnQd{_vmIegj}HewINS+BGB$B#{yroOjEGTCw65ysBNS6f5To94Wh%!kk@m z3J3T#S@DYAia=@)_1->#_Q9c3Y3N96$Qa1N5ExoZQ+5~XC8ywAvdaZWQ4}UA3nWQb zas+y&FW49DLdoWwvtE@`k4x5016`6byWrI3tHoun=vL%-w}Bq?3TVsrvQwQ}5XeOc zrrp52-@pJi2&8MCUG+{D%bdydfgU@BX?NZ(9kM+~s?>z0f!m~o=2RBspqy;8fi2j| zMU?GJ6Q1Xkm%W-mZ)C!$iszhns*2%u19!-!84J!bCoOZkQwx&jEe7(qldj`pygC_1 zrq?k&5;80|7fjcF3 zr-6dRb`pE2=~1b=$G}^$OCUql@rF}-T8NZeCH7te_u*~aBC%Xw!?T+j=osH-a6c>! z;|BI%FHdXrY188u?NZ%2_PD@~!N}^5&0TQjz404t=p6?3%azDgPx>b&7kI$HK^*e; zITJm!{>Bnjpf!$7njALpfZTtVa!vE(q;AT4I@D_{o zaa=auplpqE;#!z(Eqe;wI>epiW*l$PT{v!6?Xu%JRnE~#t4Q84ZaENUTW{1kzGF#a z5E4nU%>gJT$K<4vFh~S{x|Z-Ch|bVBZ)w)07S@bExQj5T~;| z*Y}Hna9eAA5CgmjTyN2-(o~*CJ}m1UYPi|YDRoOB?)D+AV+t0nz?{~{wGMVFU|3M; z2_F?1$tXy0Pi1{|(DPRlxtj!n)wGQHlQ5YZl`@zlGU9JLxO4=9ZHN7=S_ARwJPdyk zjc&)RXU{Lq*vmmcCy$?)nwg}prbxOPvwKH8bpOx zFykyAS-hSP7plo|waCn@Td&SLhl?`t((<<7DT_WY;1hMe0Lsp(Vy(z5oTyY>n($(0 zf)rGs&Dn0bxZu_c<&`;VYRjd1tzd_^g4*X%W)%}LsjdxqVPASoJ};Pe2VB>y@ddN& zCt$5Bg%>mUF21MX`?A#jKp@||e~Oih?vfKcI{fN;*q-P0%2&>F(R>MjKIsv=vQTnr z`Dxc(sxOa6YUbL)+G2QeW!Z^=pN%jy>SAOlpg3rkO0z}J8P{=Hpe~&{sLp4v7`;7m zKC&C6kQBqClAYkFq!#Sl|;s#0;P2TOLX=F~L&Sm4ez?u_%2 zhARSFZw_U|`Yz=oN@t-5(){MLl2V&|3#yiHKh^Sar&>PQRLf_YYWVtQjrYeIpT{DjK?aG%Rz`4Yc;ppm@gX+g zBZ3f<;U{BVph&wUe{wJq1un!>cC43DrcFrMr6`wBid$uFy_7NoL&_dSSw`8BfHma?^S#Wr+zXwiS%Vk1 z%I)i=l!Y&(%qz-z{3>^>mr~ZykaAE_UJOgxBP`RhZtfbsiXnc+__>>(-M_-y+3fS1 z35t{a9Pzu;ui+T5I;*0kcUM??`P;yENZX&-_Olw-M}}WQGI3?(x6q$Qvi-`)>(FOL zNk6N)!y~Wav@dZjM@RW(CB}Y-teLom?#nR7%*0ikX&@%7Bq0-4%1la3>Kb}3qr*&^ zsR(G&(g>QgbW@WcJpgH@9sx~TX@aJ$jG308OaMxonFwge$`UkW8D>_3i~vL_0vfYA z2pY3G%?=6b3_u-bX9Tp{>LO^jl{32}C>Mab%v=Pt&*~;Na~Kpd(f< zK}W1UvsZ%p0#L8n*8nB1@Qm9dS6#O%fp7Q+(kNo0jwf-6@z5{MVTE^R8+M8Z@D#_| zv0F^wy_6DoP~`DGN=cj+Tk(EMDO|*Le1MWh%|G!pB^@u|kN6;^G+x9T_z#?zMt#n*MKeYS7bfVnD-L{^{aPZ1lzS|5t33{U@1T3HjqW zC<6D>nerw{%3zmg5Pfd=XW(BX$;KJbt1H|^n6N78D*rK$%bm$N-0$; zR56o$t07BMDkf22r8QJzmabHKsA6jQR=cgVQZcInt8_!P&&nuOCR8!ke5)f?R;id~ zfmK$iHphqZQ@&RMH@4#+_zXTvpXvBJK1ZpI;q^BLnhfO~4971}N?-!N#uq6i@i4xH zFHuS{1)jl|DQVO!;wzMN{1h|zDy1}j&;Pc4jZy}G<{kAMrK}9Nws!Pf=YJp*8gwBT zV-Vsxr)u`we(F!6(HR#ScFe6v3SCx6ISz*-@&f(oEm( zd(Q3d+xOmX%^&~!;%@=$!_PA4Lbry5fh1A_!wdClv01Lwi*Ca%*UGi?MUGVKwc@

-=NbS~S~qN7X{Cn+Cy z7V3>fT9b+?3c2YE_C>o`u{rg0y>`ANP4^n;lXg?Brqh^OltcXn@)!_E+pgF z8}5m6)e$hgXyUw!enf*a$o(3A+uvRT6X(=A_f);M)w`1It^+G2d@%O$45k=)DHxi{T;X zoNGI8Q!rVw}GIG!0K@AVBIY^Hn(GMFqi*q!+WH;%p zMJ5(2$&_S0ERgU<`lib@XSP+HcN!<``3f<4m2oHSMp^d#!Gyb1rlaqkew}rvBon)x zQv=bhse>8ec5*Y0yHsC1W;g7r?N!W3$?o&?k&%pos7lS5Jay1hs-R^1rh~3GFLRE0 z8O|GYy?NOSYPdgdbi|uC;=`Ojd1T1&)*qCL9)I;=f6lcRmS^l0KQ5EUj!(@@(xX$% ziiXo{Rb1Av&{bL?@Jpr;@j$BJ?^i1Xo6`!xPBKyoc9AW#FBu+TA-r2MbM;nZ!8u%( zDbv@!Xm`qz${Xx>i&t>fIazL&nMDU`wL1M)X365+t&(Wou2;*8^;WUEI!{e=rP68^ z?GRT~8=PfAFolw;C=2vDm(R+eINR_q^&I2bZSp0t;-yftFNJ3__%6Pu;rp^|{y?D6 zF7oBt#rm>S^uo}qq=)SVx8C4ub`wDsyGmDe1T(P-}a5*h`CjV#gic;YukyT-i~FD+TXx)lhJxsuRYW z?D_VHoF_z4iQ4G1Kle{^W%m-8qIoCWbo&qIq3u?-%=4>1{jGS&skzc#}QrH7V03 zG})(2E~65+%G`QQ$_xxm=9S56yvf1!nv}^Ln%tmF)=-aI<;L}zlyxCAX)2Q|cr?!B zruCYXB_=d^yE55`H@S7aCS|n>O>R>rn{eY+dFOgf%EA|#EGUz$_~Y5WUX!whh9-xV z$%|oDPD%n@O)ZLUH;<90fX4Dq43Z!n(_cz2}Xt zKeHWTDQ=C8K8IxD>e%m~KaFJf)v=eL&+MSxIn^BJ=8N7t&@nK3?T*uGx1SJE1#pm%6NHn`7)ci}#t%Ur~*RKHg(3$cYNy=cCXApgBcxT|~nH_+)7A= znea8bOdL-&VI`G{IipCrnG96BtdvrvLKQQ~W9_jtrD78KEG7U!kPqr zN*VlxkJ6_oWo5v1bt8X+H&#M}E(Bu?Lfqg~?S7XW7(y}t1enCyAs?2Cz}m>pQ6H?W z1-J1r3ZJ6CiqdAq>wF@Ato1fXeDqK4Hz9w^jaU2h%uV#|*>8pLjbv|bq;2OlK)xyC zmZsX)UK>Y)45+WG9Dka%4-5=}Z}9WYCS&W{9MIYM4nNP~hwNo2{Rlr{Y?=Q91bMBA diff --git a/training-system/target/classes/com/sino/training/module/exam/entity/ExamTarget.class b/training-system/target/classes/com/sino/training/module/exam/entity/ExamTarget.class deleted file mode 100644 index 43f7253a8dfc7b0b6143aa5a9ba5caaefc21c88c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3125 zcma)8ZF3V<6n<`#&2H08TM8|Wph7K}Hf`4;zK~E5Y75b}ytEVq6t>CQE=_i8c2i-- zPyPuUe}H`9gU%>8d~oy&&iI=|eD3Zh*_OaClf8TIxz9QGob#M}Hvjzh#P^0 z>0TXu=od))0et1&mL-s1c=43TS<7kEJR`I%!GVzh9ebs7T4r{!F!GC+!t>UbA9f&Dde)0%aivgu#7{SD4M z-*kLWU_O3Gknz}|(Frk0fOv@$<2v$~V1~=4GxtrytO^Xqtv5rsE~{=zhatf!OCr5A zrZJ`B*p8Hh3KD%>#|QY3rZ-HF-dD&!>#iiVjteA1N#BC)SWAuCnpIyh*Q&$}EVyN} zx@y*KxsHTMf5T?r(;ZlQWtA3LCSJQt_QpdC)3QqM7cGCotz0zgX3g@gIuFWFDPAyB zxeh14ta8U_v!`W1mZ#>s%~IL7qf#TX1cWOiZ&y~7cLBxqH>^4h$_$J)ubdu8Tgyza z*}NnIz2SCS&=&)QSFt}12}PM@-z;w~np;uQm5Y~4i*xj?M9S-y*QoN=tF1%3N89#$ zqIqa2z3evXWozD+eD<|_#*~atAbYvNZc?*WZOR#H?AZF5A9U)KC_fYG*hX7RZd4I25Kq9@AcxDl=kCKrcCt zRiCYzo@aR~*tU+mkcUp;sn`&B>(x+}N|*~AW{>M)KTB}rCx){w`AG=g?CN~?fb=27 z@nfzGz6IaP_+yA)0@w+TavSJHfukM*P{c{Dg!~S0+^PI4)StQ8g|_lgM`eB)Iw)s$ zD<9~n%+B3GdCzX;Lmic8aEks(w+npB9Hqwdzd`LB^iYV1f|d!9*%UZUJ%x>dDHZqx zXF8e8ysk+}Ov_}rINRCFJ+Et0a@;bxH?Tj8PbrdtpJrJ|UI)h?VIQC2-*J$ykta9; z?9O7G{J|Fa{1k;Di&?(AY3zP}{3j^Mhxxyt{Rk!TF#jjC#R=LS3zp;g$CwOfJauV; zLm@f&H+r(kr`YoV`eZiw2=6r!BL#(!kwPk~NKEP}1|A@jRkEoVXt;pQkcw&kH1Q0>;j}wGZI;shI6U z5?DIeU)&%ST7Uil)X7Kq=(d!P6q0fyn~ZieNl>^oTu_27auXp)!IA_3 diff --git a/training-system/target/classes/com/sino/training/module/exam/entity/Paper.class b/training-system/target/classes/com/sino/training/module/exam/entity/Paper.class deleted file mode 100644 index aa468bbd69a32d526823689eba78078ea746e0a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmb_gS#T8B6+KUynVzL3jW(bGV@w9n%0Plm+%kmSC52n2tCS0z(C-oUa!vPTs9q#Y(YqG0%~*Q_0U+bvu8M zw<8s|=w1~_JVd>_PoQ&X_)H2(q%@>;WS|R-ET<_u^No_7x35^`ysaqm(^l243B<`) zvIY94E?JkYe97WRXWSaUJt1kkb@WKi%)DJM)QVNN=v3r*uZ}+S3#47gwMsJur$&zc z5XWT2wJ+K=MKY*kjRYs>8#OCnSf|5~gQ==juPXw{yFtfB+#{gR+f}RPmO0tUd4X(* zdCKwUcCU`jxR1W5yO!Ii3+$L$zH;AzcBN6S=MOoYRmGiAcr~>*>B!0Nr3y9Ma-G`b zyqv{09osR)RaYBxrDAR(RaRuI$7WeCTKw4xZneSjZ{#G3i z%5k0J(}9nrVnWA5*elSZz8-dSU)x8Nqou*ybnM3gI*A6J?*w)d`agL)jYBxB;fRi- zc$ho7G~5KV%T}pjpL$YY+fc}Fr{*r%1$SZvS5E49yIhQ1<)L5?<)o){oWM!X$J60$ z+z>1>Vk7&Qm(w~P!D)fDWoyx9#1t&|Y|&ky#5k+CjI*2J>G|6ln(*?GV7o$~)eWgF z2w5$sUIDR!w`O&`17{ed1*>x8sfJY&7z{5a@bx)anI6^gP6v0|TWl;`Z)tTpG=9hpgItXfgN`-3re zp-4ZEMMT(2m284vt~WEUZBf3{hPjmN3EN$8=BKTiRkmHb#*cKJRg%ZIdJ^;)0yoH59SnyA&{KFF)Iidv7&u(Z13D zYDBP0^Q7x|?hz19`zheZ0*?sCU64mbkKC19xZr1%rfsN8fr3KM33-svfC4m&K50Ef zXr$NUXgdM=e4e(!ZUty_uM|C#2&CeRyvB{Y^%Fy_8GV{{J@ zym}mM$Ar((HrB;0E-ap~s(ygSr%z9wI6|LKGQDbcy-{)*Pi>A&0D^JiJZSwov6?vv|KP_J=Zp~^o-M}73`x$nT%=G6zq_tnaADf20MkaeWqA1GBpoW zDohG_dNXPADp2Pvr(B$O8u{|oIcn`7)ClQXW0I|I(X@= zwmGyj^0k#wO6gY=DK~fBvuafn`R;9~l$!gmY+7gCUNOu9FL#0Cru&j|8?Z z^J$c;G~5u_bayC&*Yhjxgp^2tUMR_{mroDAF#@0?tSjxD-v7EP@_EENZ;ZZ* zXa4@w#75a^hhA?TQ?8yN}GeGsJ( zXxQu`XxQvFx+JLE2Xz_UA<($lL(sUHHF_i{>w|iXYzVZ^>?LTQ*=O`hP@fO#HTpuJ z<7PiW$IStwUxEgFP`@z{fMPee!JVOVu2{F5?c~M@ggRpLjo|BwoND@c~LHyolHEK}u=7 ziktWlr3`N4XLyE^j=$h@_%Nj|{1wmQBb2&D8jJWSr5=&x>^?>*EAsrU;Nz5f#r@ci zPf+R;v&_F|DfNqU*nm$`8o;Nx)(Y;`lK)1xhGgn>tkH0ue@XE=)_G#;|0@PH|7qq{ zO#V~tr|W}sraVUCGT7xFgnJEd54=+(9_#_VdX=kaX6sdzt^8k_Lv!527f2x+seffB z9%A?NuD#5gohLVDCl;6@$?WKLXydnFU6A9u&6rdeF<+CEiQ}pEm~o|I&M2d#5f4OO!Nf7Vu?CN&JMr9({#U3cu$Ma$lvC#-G`gK1V4d1FoYJeRr@P zF%3x}7-JCP4nNg;?~nt7hzEcG6KfyxVTll|gW3m>8IO_Iw@T2|3I-;lp7 zdkZ8!{HN9%lRrF1t9|qI3i{U9?}qS6GAom`c-{cyQ|Wi5YO%dBj)V-Tuc;h=p0y7Q h41urn`bM3x^(_u0`SNXEFX0D#OH=wGe$3c1{tHw{^>qLM diff --git a/training-system/target/classes/com/sino/training/module/exam/entity/PaperQuestion.class b/training-system/target/classes/com/sino/training/module/exam/entity/PaperQuestion.class deleted file mode 100644 index b209d1028dc50e22acb317ed7989c6e1afe02307..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3423 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 NIZ9C4KoJg-{{hG5$F%?e diff --git a/training-system/target/classes/com/sino/training/module/exam/mapper/ExamMapper.class b/training-system/target/classes/com/sino/training/module/exam/mapper/ExamMapper.class deleted file mode 100644 index d6202244e391505c9f141b55855e63259b3b6faa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 409 zcmb7=&q@P948}86yS7&J>I--@53njI)YFP!!FzTa)|8!@W&VhLH4i?34<)8sr673l zFq03Ge912#pKtE~a0SN&j0|AoEkPU z7+wwyf5Wg#lGX!Ed0iTqE_@CR-$|$QPj-wKn@tRyJ!WmN{3KE8j&GdvNs+vZ2F@!V rTBM$uXGR%Fk#+^RB`ozS2KMwF=*dA%}N77497E7yS6HL@!$)1G$&81f`Xn_3N3ig?uK>Bd@S=(?5lb30emPi-6BfC zgNK=f$^8H1mwbG_y#v4voD?upaMgH=Q9F+*kapU2XnmUvBfpYGOMTA)A0(f1<3sy2 zJQT36;B-kVLPH{%)k|(t0b>QYF|5g3-TI7nT~pGrH#tfn@VDVTMc!H|m@IVXDCNKk zR@JU)S^d-SdJz1L#4hQy{)JTDmI|f|pF_is+DI2?yS$g1t`wZlvxqG}>!@qPch31F yc-}xqwv-7e*pqW0O906VxkqpalOaywNa9%P#{ge37l!}< diff --git a/training-system/target/classes/com/sino/training/module/exam/mapper/ExamTargetMapper.class b/training-system/target/classes/com/sino/training/module/exam/mapper/ExamTargetMapper.class deleted file mode 100644 index 2730564eb65cdaf7a048d0021f4e6ab54f2d315b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 427 zcmb7>&q@P948}86yS6HL@!$)1G$&81f`XnZ1uNdO+pwnW%q;V#*jMx51Ncy4x~mpAWd9EpI--@-d6=Zcv?|f@Sfdp~Q3-Q3MYj zl6;WlBfq?VyuJaz1soMHGH}*-i&31%6iA%76MN3`B0q;rkZLbU1H85M# zGhs_QeOIr!Nd=4z;MS`qZ)NE-+D%PKV%O%Vjlf@C*A#iMGB8=l%2CRJ4Lnu9P0Q+^ zhUfjl-!$x!q|HE6UX})?3!g*7H`3|>vmcbF+gl7A&$F&revl}2%U90%q)^^P11FUa rE2NH^M@H#ck-i6TU@Y}726i;|^y{Fi&^&^DnDliD2U^G4KLq#$3(J8U diff --git a/training-system/target/classes/com/sino/training/module/exam/mapper/PaperQuestionMapper.class b/training-system/target/classes/com/sino/training/module/exam/mapper/PaperQuestionMapper.class deleted file mode 100644 index 68ec3afc3e248c23150c3a0635695c922d65621a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 436 zcmb7>%}N9@41m*BcidIMqrQMga}`DfJ$M@NXTf`BHmq5u?a&`_Ud@9K;6sVoSws{) zcxY0Z<|AMG_Wtq;0B5jQz{tQ!<1I#U9#bH3;udKAJhzPeOcpJ59S6K6jdz)267Q~u zvjR2^>@VqwuqExfsh8ZO0>%b##jMF&nfr{kuPI6F+8nhI_>*}_k=G~#lbI|Wr5xBm zU;TuZ)jxr!L&M)z?2@GZyH$B!8ko*}4h>&PtAiZ;Vtu@t&A{P(R)pmTiBh+G;haw@ y>0LB%RQa$#>Zo~Sl))Y8>jJKwOMNE;8@jgiH$ZoV#u048WXMz4(LC1rF2DzJiHkb` diff --git a/training-system/target/classes/com/sino/training/module/exam/mapper/QuestionCategoryMapper.class b/training-system/target/classes/com/sino/training/module/exam/mapper/QuestionCategoryMapper.class deleted file mode 100644 index a15aecf061a1721dc0bcafe8a9203821ec838dfc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 445 zcmb7>%}N9@41m*BcidIMt9bWl9$-{Z!PAQ9g7?g97_&^s%E*dzR`OqMBR6j7vFae~m2e>vbby@~CbZzOkfSwB7N3ac(Ax>dO<5=^%03U}T Bj}`y` diff --git a/training-system/target/classes/com/sino/training/module/exam/mapper/QuestionMapper.class b/training-system/target/classes/com/sino/training/module/exam/mapper/QuestionMapper.class deleted file mode 100644 index 11920e46d7b3656e75c72a9abfbfd73067aea2ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 421 zcmb7=%}N77497E7yS6F_o_qn1=HPKv(1WKHsRi%ZZCF!wW|sL7`)VG103S+Bx2Pz1 z@G$ux^Z%1y-riqc0pJ1-3K$tUYrMrM&SMHBPF#!DFLKAo&t%b3-*doO=9t90+o3IB z+rZ(Ho(MZq!Ck%NCKWI?fNQ&&yp@H|Xje5QiG7!&4g!DLT~p+Zm4V4zT1P1dHjt{{ zre*a{!}CG#HxRodY4rtEUX})?bDu-QH`3`2M?YCl*Bco)zRxPO{2)>4j<1~aNzuHE v22Ls;TBM$uM@AWlk-k6RhP2e{7}(Ocqvr>$3XLP!g~^bou%~&f^L>C11q6je diff --git a/training-system/target/classes/com/sino/training/module/exam/service/ExamRecordService.class b/training-system/target/classes/com/sino/training/module/exam/service/ExamRecordService.class deleted file mode 100644 index 42c809e3e25210c7562cc89e0b012a91226cf366..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1512 zcmbVMU2oGc6umBNUAsXCgYo^f@vy!Si4XBmKvWDwrJ`13?A=YSGEa$J*-l~nG#>Z? z{3yh=6V}p5RP95R__+6+<8$Nt>-UeJ0Pq?f*P+JXWu&se2&n?AxsXC8L8jt7#Q?u? z+Ce=L5eDyR@fjnfTDQ1YC&SJE+P7|XSFIt+#f{V8)_$)q#CZukH1d!oGMAs?eY9(2g+C$uLj9&*hy zw5Sb(b$7yEOfNYd)4gmZ=pFbn25&1imX_VnJ~T(ZY4`-Y(tP#e&kq)yAhs$9^HCKQL=6r*}Xa%MP+GTo0!+m@$N~TyIqU9oG&|Nj0S=Lk-`-Q?UFzU(E z3Tw6V{?o{O zq29OkR zL6aVv;0D_kTq@x;2A4h5g6%1E#Y0zNXCAr+*QZcXxC=L+HYWi$Nva07Na{A+DYr?= eIViU7($+n=Uy}V}?g2ckz(i5hJ%T+?z5fR>*}dBU diff --git a/training-system/target/classes/com/sino/training/module/exam/service/ExamService.class b/training-system/target/classes/com/sino/training/module/exam/service/ExamService.class deleted file mode 100644 index 975057640cabd358eebf6a9ced54b9b0f84952a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1235 zcmcIk&2AGh5FT%7w`nMpmjAy(xs*$-isMpF1*uY^6jJrT0m<1NEpEMb@Y+%H2)q&p z9)O2J%z9Tz)kKsWI9R*(jKBG2z8U}e{o^M99Kg#MA_n`ZDR?Qh;m!)FrOtU_GOv*1 zg&+&skxY@lr%k{9kKqP`jWaP4TnTdT4bCuiF|06nQ-KYHDP(3mFUAAmWI0s6Bru1% zltxbwj~X}zt)a-V3Q#imvfKGPq0E^;=A%bDK0N6qujgDKh=M{{EWL94nBYH!--L*F z(S0@9v9O{*hn8ZlervFZN?+z$IB$``_y0=e?Ht;d3qPvUJnbd#i1m7ouBy->Iw2K< zWVbUFpks7Cw+!>~7(_B-u$EdBF4UdD!N2BOSNuwB21_IhLHc1ff!tdN@|138s7R42 zO$J-D36e`&$l<%V{2&$e_eNF5W(fBxMQMOZNm|SF zKEyQSF|0xaE!r)UJoIVPir^-h*5MX8Hm2JUo&>lvJ=zRMTX6U4(LK07J*qE0fQQpC dk0xOrQ)nVv18>BE z2jHO)lU^o9Pz{BTUXQ1!`tGL;*BRV8=R@vAocz0kbM$o?ZZLQ~MjLP$i$EGL9u2q_SsIy) z&@?8QkjVt{D2HQENqLAiL&o5w(fK!}KubsGqd_%lf9^K-=R^=jOvw~xCeq{|;wSsr zB*Pr<_TWv_i$+6&L4zUjxU`eHr0tUJl*rBB<-s4|k1`Gg ztXh@GVYAuU-S7KmzM0pz=NAAtg`GTP1f1I1w?Y+Yi;Pr(3S7(APUNA5kCJcD^puU( zZG<5y9h^%-SDSuw7|+A3fO1Fnq~%He+Guysraa^X91VcmQv1r$k>&T>l2q9BqL6_J zgOI^K&}$<&0VNk{%yDNB1?=tD6a2ak-0HzF5Rvk%x(cbv60VURv~wek^pVhn0tyax zr6C^!syPDYo5~F&MTQ~oCqkao|1L{Urz+BFRL@vR(PKrU3>31C%BPGjkfibiT>T(m z8bSdX#km!2gY3(=ZUSoi6ZAWjPT=CMF)nTFWn60kGyIk*qOS9W;&^I`7Na@nu}z8K zm2^S)+0!TIhn-c8^ZI93O)`@^L{UFwXl&;~Q%AQ&zwNZ;QM#P~fYj->-^LVvNzRG7RRc0?SEgB@V5^+V{{pY$PH6$W%kZ JP1uT0+wY!dE%g8Z diff --git a/training-system/target/classes/com/sino/training/module/exam/service/QuestionService.class b/training-system/target/classes/com/sino/training/module/exam/service/QuestionService.class deleted file mode 100644 index 00f48996ac99e0fbccfa5eec2bf9d2011b77e6ff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1530 zcmcIk+iuf95S=wGX-b<=S}x^I0ja!TiOW;Ch!P=H3Q9^)-`Dok-OBcw^=?#u2EW4t zAHYW;CbnanCQuoP2g~+c&YYREJ3oGY`wjrF;c*Kr1}|M1+KGsytrZuMhaFW?xg$K1zRk%WP>JNP>>Ps@@N<*Bs)dDwfhAc?hYzZ1~T#&j^xj{3@qU>=(q~GF7;sWu1Wv75@&cYxImH-w28gnpr18{J|q+m z15#|(K7-Bq#wn~D8z&ISaTV8ChsP`6vNqfl&~r_(9X)}rG{ z&oV8>Hf^>Rtbhe=`dcQc>2--73)aZB4jl?CTwTcaAZ%2oE178%w$7Ta!nMkjCtja7 p-IzCR!_A7!t&+@bB6A1s7Ou7h_sDg>bUz?R&UyzPlGTDozX00h%oYFu diff --git a/training-system/target/classes/com/sino/training/module/exam/service/impl/ExamRecordServiceImpl$1.class b/training-system/target/classes/com/sino/training/module/exam/service/impl/ExamRecordServiceImpl$1.class deleted file mode 100644 index d47cbc49ad4d054313c7b29c410cc109b5de1917..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 906 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 diff --git a/training-system/target/classes/com/sino/training/module/exam/service/impl/ExamServiceImpl$1.class b/training-system/target/classes/com/sino/training/module/exam/service/impl/ExamServiceImpl$1.class deleted file mode 100644 index 56e6b676233893a3df74480359e22662624e4041..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1273 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 DR|F=u diff --git a/training-system/target/classes/com/sino/training/module/exam/service/impl/PaperServiceImpl$1.class b/training-system/target/classes/com/sino/training/module/exam/service/impl/PaperServiceImpl$1.class deleted file mode 100644 index 2e43aa6ce90fc86b6a68a916277900b3eb93de5b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1290 zcmb7D+fvg|6kUg2LTiwUAc!}V$VDyzFQAsoD6|kv3)+I?pbsHELj!3}Crwd*#}{XO z6K5F4argj##J_OdCtL>}gqbw^tkvv&&f06A-+zDZ0hq*e5)Ftbh^mMo&M;_;ie7U( zp$ER@c#gNO6H^hM&b@l2rq2j3;9gJ&te{?Fh;LbLozr5puYc9NNNzfTMkEv@Ra}C~ zFnKn)B1(0a>->{NN8W;>CR|q0j1)s`_RWiIkzx2^a%3M{R9rY}SOLf5$=)gkQyDAJ`OhLZ3Qk0?GS^al}I0hL{_y6P`2gMw1X?r#jl9I z3Sm3J*fH!R7!TntZiQL*wn5MR9rPb&5qv=KFpJ<2!Tqf7h$Dekw4)6j=td94UOLnh ziqlv?j$$6~@Sfral(9)MLjMBtN`ZaD82f@T!h|qRzb>e675XZ7^jbMug&d-I8h-x_ W&nZTcruSsXq%lP?88(I%sm6a&QB2qX diff --git a/training-system/target/classes/com/sino/training/module/exam/service/impl/PaperServiceImpl.class b/training-system/target/classes/com/sino/training/module/exam/service/impl/PaperServiceImpl.class deleted file mode 100644 index 02af7e212bd6a99fb7858c121fc7f1d2f4418532..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21968 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 cETotp@d^|P@kJt@h($ diff --git a/training-system/target/classes/com/sino/training/module/exam/service/impl/QuestionCategoryServiceImpl.class b/training-system/target/classes/com/sino/training/module/exam/service/impl/QuestionCategoryServiceImpl.class deleted file mode 100644 index 464b368e1bb8b9a6ebd884bc14ab561dd3432e25..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16670 zcmdU034B!5)jwyJ%w+ON;vkTS0s>+PiKC*m5}<}8NCXlj5d`WoNggmTnF%wKC{^oP z#RWyh4VR)-!5v%z1QE50t<`E?_cb9kW zx##@vS?;~_>c6|5BccheVLoy(RW`?4Lrvj$YosOK9%^0M6i!8wZPE5*s5zd{@eyl@ zq$2THGPI;!Pb>{h3%544gin{}*@|lSd;j z1(>|(8ePg%Q8Iek{zpv328Gua`_) z6z&LzqT$$rP<_)Py*X9Uvu1S9svs!&eRK%ZNe9VHkX+;!h7Q$e01adc#1k!gV$#ye zWHZyrSs0twlZ`B#1*nLMeRP;cgXwUl$--VT5{rjYi7-TqdA7z|+M{|%KR=8XJ<$^*}EgoBtK?GeY@@P1X@X<((j-pXa`AU!W5CBp# zmC(bjOoIWKbfZxlYEX?8L2^@x0Bkf79_Kc;~hv#K@gF`LPB zs*k2*nHn`vBU2t0SBIWRHO6PvGhNgdV0)q16QBEMtRvoosaf@E{ms&7Hk}Dk zgj-se1~}KOX-r4Y75?XHG>^Us;bE;$T3U;~rDoqqJOnEf2}dK}3O7Y{YprC;?rf$L zda{U`)_4qNtXXdps}-8mj#5R9{u`7CVP=hW3Vo-?`rj5L)DEyNCD(st+#~}sa9Y?(*-7o?IJrKp{$u*Du2Mi5>ePA!Z0OlOo_noQ}fA(%My45b+` zUIp0Bqw{^VRHJVRj+D>MRKo$$fs;+@V&nvbKDv8x2`RO z3_9!Y+1_>it|uNa=Zq1ps4UG+c zdIUiU=CiYFP4}`#wr{+)d&854YP(ll*S%u7A;AFElSe)t*XRja2gZ|n%3wUhIyy92 zPfu#}6g>@zqOYY%k&8p~#&UyMsHaYiHc0OR^iHF)wnfCXNuw^>j2IV~Xh7&&FA=2} zW~YQ}V~Fnb1nkomdd^2%HF}<2U^+y3I|UZAhq%mGDh-!fdE@({z?Z~@)@CPKPunzl zg?<1oz@dYSfzAn8ObC{X=v9q=Brx+N!yURz@^y`VEa3KHBF5BS_tQ_HeM8K()qv`* z%eQRb*tPSat^oav-ty7g8vR_{c3ICQZCYB1N0RV2&Fu+z+B2jC4MmcbEv=E5Q2C`s zzmj1GV%Vzoge)qjhy@()YV>OXNABeMnUiX(t841~^joH*cigsm$K99jxOw^ZEq8T) zr*r$}TMgvzTy@0<_uanp&c_YT{q!D!Dues(byx1X>f!DU>vui=oXo^phLRNgL8JFo zmJ)+Jil|$o9U`DWds_>Fb1`4S%r1>S5M~M#QfJmou9;a=S5;H(r$55o0j<`$zSe~5 zV=IiBkDt9x7=G%O?q#b#xa0mH<&a;D_n$TTnEnFGfmBVU0+#7Mv3Jw0@(9y#TY`YYrgwjr$W)4!myp7Jp?wU2N_{-0~~ z1?`6X6MAdBL&+b`vbPv!u8;oR=WMe^RRP)~_G1sT#x7aqUaTQm0QIz5+8&puE9L1) z`RJ75CVAS1C(hIGT0f?K0$(IQDZMcwHq*|4QYeO|#hb&?YO@hmU=J5)T*yde`(ZHW zdxx77%<`J7+dbT0<3q*D$%}^N5?dFb3lz6JNaG@DJ_OC_btGN#_%I&q z9ccqOhW)BfRO|D@2+L%kp&AbplTrvu7RD4Hg5=}j8js+SupTL3mT8z}?J`rO840~5 z(u`?K(!!%OKAKD5*ycx~2>;UwcW*B_6Av?`fe}Z7DakCCYCML^3=>|p5cvyC2h)^n zj^2s*tQc^H=SI$heGoq%BeO(;c*emIb@FegjZT>i=i@X!UJNKKVohsXYN-hR1eqAp zMavs0@z`ADl0T0=;je3avg|dO!Id-zv1KznNO?RS*)=1r8=74!b{dTIl)s_zDUzG| zl?z9x6C{ntOG}l;)m#H4nK>rfDq}5;3q{JaO_VCuOx2{bO-Jf)Pum{UDU=>>%DAU$ zJcVm9vjvHGdmBcbgdM1i0ecd4jM#(beh2jPRQT#$Pi*+$lB;)I`;aq^^z(G4k%r0M zb^V6!8*c61a&!09%Xh9^yJOh~GuGUC?~Y5K2rwcLAJ4!>nONJb;ScguJtjeY=JtZ%_^Pn1W)z~STuBR5pTa+E(*?gvt=V&}v z0*t~m5v&}@5{gDLy-@NkKiwPP*>sbik?Se*g@r0xP_-?7`mvv)e(LhmRl-(_#=44E zGRB)4iM2@U0*x06$Ai&osW}{#Xd^K{+^knc!^xzd4hisLy2;1b)^c!Vq^v?Erg2=T z49iX>Jw-p|O86^YO(RpG~c>NA$XUTwUm(L7-wH7_4=$Ec*T`v`%o)!t}@Q zt0+g=%7%o6Qys4z2n*R`2%*%kAr)?3jG;{|78-U7ff^z(7(^&C*R~W)bDS2*NI3sv ztmH=_OjFVdL4FfXaHl67q`nN7W2vuNPlY3}=ci_w#r_RNb^+pmD1zmc->l+jYZM@) zukfpv&A5!6O>?2%FCD^INbDn9|e31)3#l zhp$Kgk^L-NW|mX`>qbc#BUcAN(O2T#8+z~SOMbnXLC2auV5?=E$Y$M;Rl5VdG3iOf zY3y$=!;_9kaBqZvv1fx5F`Dx5%Unzl8v{FdxTWPO|j^lsetvkx^| zY{JNNl&Kp@%ShN<=RAAKZ8A)^8J8oLF=AJy5e}2q8wIArjqW2M3s{wmNNMC)rsMY` z5jC-Wl{9)T6XV1t)Q3R!eGhx6CMUAlV}f|(@l36KanK8l55~DF=5fm*XtH7-`HnnJ zop2v4&7!oBEz>TM{m5h0VQB__E54lEEONlY!7#`4iFz+<6yA3_-j}^^Dx+4tAy!`+CtzTJ{~b!N|N|Edvel_C&KjIU@PduwME}+Io!W1_@`@Km#X(2|b=d zk|5g-lGK58;Uw`9h(X$ns5V)U!#e}Ki$C!3hZ_Hp|CEuAnhSH9$~W;w7`p+u3IJ!H zAC9InDz4085{xmXgkvpHJvnk(JifTS&D^I`$)d5L;jA$SG+t~3?-lbLb|Oo{Z@y3k zU)X?~3KfOiUf`t_h5Q$$seP@@eO9>xt?7*19Mg?ERbKg^0x$dV_m2R7O0WC)GDz@W zBEioz{+z!+7P)dY{tf@OkbjE`O)C0n{0_fc z;B^&XQ-v0x`VgrOYW#ElMIruo4d~@)+PSN;57080P+1KI7$gV1&lS3gu_5LJjWefI zTCvhzL@>3nn4VA@TYA#x!d~)GY2aqSB6AJ;Ttl#%wEwPf)y9IQBcbtnV!i=a?}Bnm z0gE6g2VVF-1ob!aP2}dAiFhau#Bxv@-b_4a1G%S<*+%(gUF0Jg(@A-=@mN6Q*+PYL z++CnS4V~0~c4=8B4XP_ek0Zu;$~V!GID{+qbkWg7o2b-98|m0h^fedGTZfPHmKJ+E zY1}#t;^CF}ETsTGOUO^7NkeH6l~FnVjinHc!`-bZbUf}EjitHRA-@GZCmIa$t$Z6w zV3lv@JAh+9&EZviC#E=-j^VrbZd`F2M@REL{9PQv&&7GkYSel8Uc6H($MUNGeRluv z+5PXg`#*sG52C-HcsC95K~!r{@-p8JS*^vRiyuPe!?ygI7>&)(HSn9y=Lz_#on}3kD)xUF%HaB zK&s;*)rpYlHz1oz)Ku6rHLhI|XVEQz1XXkBY+SJX^-+*)opXGOo5| zJi(N46`jyS#?s%AvGg}&Ed52sMt@7jN0Zx-@m?_L^HGtHu7<>YG~CCB$tO6aH4 z3LfLfp$tG67iQe}M>JIMI0v$tUiJ#*Z>F>6JW1zlAbo3T8AEC!Dz^fl+|eMKhRcxC zaYMEar=ByEIEEQyY#|KgClt_facNaVv+Afq+Abzd=9Eggr9|- z6q{c9G$qP5QHLyu3+l>Wp+bYZi-MPIpv$(R+jq9nsq)oH%W_xVLlyEW3No8i z?4*~KP59w#u?(-JF?=>qOSov4OLOov7x#MS!A_hFM4tnza4yspMr{ktC!LbG1#%%R zq8n&2t;6N94b)06QjFdJ!hcB#`aODlK`CZj(Hcx0JRIm2Ya*DRf^*R)p-{j8N28`) z!P8UxH0(+)4^`-Q(IA`^KLhNzG18-I9e6-{h600OS2XlD+U|pOdl2;3QeY32C@5dB zn~nocKBuC+FmYam@QBd@oRdp|y>KsH>e1#l+C1fZX(Z+B^CoD@GO3q0v$cV6z31#c zI@p%&DF|T$DCGmh8}YYk9&s}e!@QZFH6V?!$%8`*@C?PjVS{mH@J+#mVD*jcD{mwH zbQO)*NWZ8nhg&HJCRR8>`%dsTLO>AN1DJK?2H6|$uwb|{_`6;p4x%>7%dO`$qSXR` z>oN%bzE^;kp@YD>3^dl`8OY6(Izabj@p#*3uZNrrCpMpo@q7`$^ldtnE~Q~~88me{ zT-a4~A}ynn5gAOOYv>HR9ss?8I%ox2Z>H;LC4G->!JVmF={dTMUZ&gWO{~t};IdIS z-Ay0TJ@i-lE`3J#(q5c*Sq@N+owvXm!O$TcwjfI;WQWmvhK0gdxA1eS-*o`LxJQq2 zfC5yb#scba$~|;9!O+(4R;KrJ(h5)U?54p$=x&+=01mb+T<;LsN>7^*x!8aR-QSxP zJ}@kp2CS~!GFh-kP>0hT?F@d{0|$RH!xdQCkBU8;=&vp^O{r zqoJnVbOJstUBMe=UCu7KSZ(TRk*TY-n`sYB`d+oxUhBl^>6lJ-cd|#my`7vRYj8y; z`=spej+?rcX@6e6(E5`LwN z%X>~5vt{gPt)j7G$~$?i86N{SrVxtd$&`Ym8D&Ze@2{c!F=kMWx6(G-NId=wg?)@= z{}(!fKA} zJbMxOU{i_RRL(#MVvR}crRnUpQ3FnFVbs~V!er%eT(F*H{Cb8k{3LBJVopZek4<6h zC(n8VopDtksF5K5IZR)I{HbswchI0Quh1bz485{HpQeI{bqF&g@;B?>>Ce+tJ&eQ{ zIPY|*Y(^bwtr!V`0tPPlt>r%N&jzZZm$FK$Vumvi!7voc)a(kDFBvcooqOdT)KjojnH9&wlA&i5Oyjx2< z`SfY739uNmV3gp+(D*|4YwzOwiZ3pEU&x)j=dJEl_-^;UJ6QbV?2eboC>EgD zq>5hugu@>Oaqw8AzVLwW68vq0&;~#vus-hPh``2R4$c16bQ-?r_vc6_FS>&!pwQZ% z+f?CL6qfYolq!rsp`$-9RfT~le5*fSqzbuR2)Ae*szAQt zll}iqj^Bn@EmiOjP_R_Nn^CY-!H=V0;g0V`!BPdU>=M87ACTSU)*{0eqDhWV!bmoE zr6}0k9f5+)T_FnAB4alS;LafTsoIhJ4{&D#1$!g^$H{HxE9Ug)D>v}6tuTj%(=t56 zP~{m^2+tZ?-aN_2_-eqTMkcjJ^ZtfbNalG z6*(i4(p0>K4!9=$Yl*x-4V(TZHQWPM+==nLej9wLB8ZK&RoOYE_Z^%TD}sj5a>(7^ z4OU%pR$>ybG5jX^N+mT>yNFIMk5{COfWXJr7PU`pkcz~7Adj6xxO`*x`1kw=HP81| zk_H{}c8IAPb*mw?9q9KF|CvALzw#$$>2DdOzni6h0tFxOZr*G3a z-f`u)e26%Wr#w8V5ncHiJqlg@r3ZiHa=Q*Sp9Z>$T!(>6{A9;9*mZ8$?G22Zv diff --git a/training-system/target/classes/com/sino/training/module/exam/service/impl/QuestionServiceImpl$1.class b/training-system/target/classes/com/sino/training/module/exam/service/impl/QuestionServiceImpl$1.class deleted file mode 100644 index 2e51fe7d5014b7fa12768b1a3541f5b9db4a8784..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1299 zcmb7DYg5xe6g^8Hp*2WFl!`Bu$U`0hAD|XNg%*NoL0fPf^g~E@XdulpX^Q%b{4CBe zjN|YF{3HGg$Gd?-M?MHMY3`oWoV$DOz5DCWj{^YDF_T0KA_}4^Vu&*g+oG!198c(h zZ#kahZRo^Qg{O0`Uaje~!V9<;6ay=$*BIhEmRskv7#|p1GtZ;VB+!b4f~1NIP#IpF z7FR{N?sA=fw&+OQ-*IfNJJoGhe?waaj_`_yq(PiE&M>JJKRJP2$y?hRWz(b$tzknl zWJ3#WX#dz~Su+w;hl?uOkz$C=y?vQ0F^rzikt}70ip%I^P=sH0Jj-Q>3=A3yt}=9Q zT055RT2#`4DAw&t&f#u3>-)l&o2OM=lba`&S6-P$aUnY=+3PB9NLE?OPfdUc)qC2QR!ro$Ar<*r)3Bk>X0Mgwne(O@0nWKq<8 zo97&@b52$VkS*{+~L+{p8wBFYM;7^Y7*?L4DSW(qX_3!+B8RKxSQKkHhx z8n2~#=uVB%y>3aRWzztPbi0Tl5gy>?ODf!ze-A>7B!P<3|~^xWISU_(XlKEZ~H;0VD()i=bEKqtCz1!?r6k77R^>M_L` zEFw>_fcN-7@gpkOq8Oon0eP{&hB3i3Ob{l7N&59beW%b@`Qz8>@hapH#gp*+r+7v& UiVVG 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 Skr91d^3oP+i?!3J=zjptraA)v diff --git a/training-system/target/classes/com/sino/training/module/exam/vo/ExamPaperVO$ExamQuestionVO.class b/training-system/target/classes/com/sino/training/module/exam/vo/ExamPaperVO$ExamQuestionVO.class deleted file mode 100644 index f51717c7a4d39d6be883cf762775b0d2c677ee3c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5834 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 diff --git a/training-system/target/classes/com/sino/training/module/exam/vo/ExamVO$ExamTargetVO.class b/training-system/target/classes/com/sino/training/module/exam/vo/ExamVO$ExamTargetVO.class deleted file mode 100644 index 0b8f2a82f8d5f0554a89e797c737d2e91543d282..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3807 zcmbVOZF3V<6n<{Ho86`x`a)j_AcC}#z7a)4Ndbk@(m-F3)}r7G+jMQyrrDBg8S$Gl zj^pST{iNd$kS{o+qt+S5anKJq;~(G$=+6-GxqCOsrmWa;CfR%LInOzJ&)Yrw``>qd z25=G^3B=H3K(nADF3`4O->@@9yR?*}T|B3`ZX<r(=QuApGhooi;HB}^Xi;~}OVE}^y$r@id-PvF{a9b)2TR1Eg+8Y$A-aKRB z*+z3p62o&Aj^cUxxolUKN8LpRmKn`;unu0Z@FI>2^sL#d&Zt|;+ur4ZM^LHa*(I+c zuo8}l?`FvD;Bb%S{EJRFdVv`OBLba%Z4}(htWz%7#lm~`LXij7)VW(H3ngcIV{O4H z&nZF2q?@;k^ESZ*229OcF7WKfCjU>B@(_AOC3)u~&iBu=ey1F7*f8!c?65_}X|SkR$yv|NuTI(PL8A1FmvU2M0wTwj zDLa*oBJZ6h--YJh`e|DNS{EhI^(wse)>Ro)TH{zsU>OAiE3%zd1$yfjT%mNsU3D_*K&r#W z?Y!rfZwh=7F0TNnj8534#iCQ`opjyRjrEboHduqAj8FvpYRE$MS_`oP6Qg#qI9u?X z5ff_yvq8ARH+Z_Rcv1}QSDBITYTU{A*EzWmR!RB=tX!$<+tprQ)!0tgv+h*9H0> ziCt7k3{ZLBPjHvv zD!A$cKSF%#!%p%k#lTsd;?q(9yo8sz6LMVe*{J+IjBhB6aR679$0LRhVU8780KHtVZeNVZUZs?Oz{A_6xsaW zWVK0h%(5mwf`cYGPJd+I=`y1-4B?APg+aBQUJHXx=Vcgzw!7fh4L>)@Vke6~X~LwT zPufOKXea%G*xNR;%yKZ>25-R_-o%k>lHZrrq#&gQ5>pn55~Z`cFJgW8N@hy0iiWar zUlgy2ST#y3lQn!13ntJqe9_+M^j=cO4E$=sN4SjF=!A|B@j9s(6Y@T;(AOp$0;Wjd9sY|bao6G3Rvs?9W}Us{A@vU?8{Fam diff --git a/training-system/target/classes/com/sino/training/module/exam/vo/ExamVO.class b/training-system/target/classes/com/sino/training/module/exam/vo/ExamVO.class deleted file mode 100644 index 753732fb3076474c25889f83a3764b7ccfc0955f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14517 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 scF?Us3=~}OGH{UvBQtRcHbn!aGR+14gPQf&c&j diff --git a/training-system/target/classes/com/sino/training/module/exam/vo/PaperVO.class b/training-system/target/classes/com/sino/training/module/exam/vo/PaperVO.class deleted file mode 100644 index c21cbe38d3af482e49e9d47facda69a1485ef123..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9992 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 QfbVZ8{eQ>)?kO_=3lit8n*aa+ diff --git a/training-system/target/classes/com/sino/training/module/exam/vo/QuestionCategoryVO.class b/training-system/target/classes/com/sino/training/module/exam/vo/QuestionCategoryVO.class deleted file mode 100644 index af1ad67b183196c0517c09ad737ba34c902535c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6802 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 T>*xGD&&Ch6@(Zk(U&H(#RpCq1 diff --git a/training-system/target/classes/com/sino/training/module/exam/vo/QuestionVO$OptionVO.class b/training-system/target/classes/com/sino/training/module/exam/vo/QuestionVO$OptionVO.class deleted file mode 100644 index 3082c44412efdc064bd48035318eaf33ff0adfc0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2331 zcmbVNT~ixX7=BK&n_a^4Q7p6(tRTSxfyP=|X#%Jq2rXZ27@W}?mvE-p5_U1WVXVKz z@dwBa7doRj(+j8G)ER$+Kf_CFea`L%LdiJlOmaTn^L{+%dEfW!Z+|`g8Ne*I(nug_ zK(nADCD8rYKD6^y+kKSZ*m*3=fk0};ah+gJAUQg=-3AkF2GSPVVF^r?z5TrJxL!V} z*;J$1zPDSi%Dnv2-p?O;`3H6B2ae}%Z)7(Pq6Ize$tMCmt7pMVL5;>m<-XHGm-4M2 z+SR&DQ*y~d4_*^6%eK4tMcu9n^o}+eM@WlfpDN{E3w^jk*pFmzUxm3mI@Y8c2U6G0 zSa@BzO-bd`SH=St-cZISjklxl3A|}x5JMDJY`?PL?aGjfl^zl}Y$1ygfh+s=o?P(U zvK@Tl1XObUz;**)V7eJ-9Q-1j76=VoC-#sb$IF*w&9SS_SN2Yo;k5`w*Q(>n_4@vf ztZhXHJ*!^Xu5Q~@reZAAf{H^VcUJ#TvWn!#kC{A2dVH6$Z5GX%3@YC4rd_l5Wgu$| zX3{1kP(XO+QypiE3HE}DtWj6t%Z4S<7K);EIuwURAkZEi#Ji4CV3+sS?1T7*`sTxx zwMB+nA=;Ys>s8jR7P(1fV^dva8;WiMT4&8JdwyVGK_K@Z zXd@T%o)`G+hJ%O{zbl2MG(N_%ffZFP_XM(Mb?>-`-k!`yz@h?Lvde*2W8r??TspC0 z;sQhL;sgZV z=9o~A6uUH`9u&@Pl=GG2ILcj~v*4_c{{-=Us5Zt?9Rnj6=V(O=$YFvzp&k~F=Z$}W z@f{BnI5WQ9(wGlR3*(MgjYnG=PvQncsK^D*3C^kU+>bC?w8>x5p3$D;(h;o5jCO*n4UPVSPL=*bDx)i%)N}M4p(CSbQVk{Tn6Z*gDTwm7 z9AP-+p@N%um!Nx5!Y$@B!G8P*Q{duG zzd{tLBKVyybk2qD;*2&Mk~q*^tdK&pJ9h+Q@&wmDSMvUXrVcV%d}1nMc{I?Pu&Kyv z3?s?Q-(|t6uDOk3SbAyJ%?zO>G0b|NH&s2l2gTNyH_nBNU SM+r*ivCg+)0}oghnZE(4Im<=> diff --git a/training-system/target/classes/com/sino/training/module/exam/vo/QuestionVO.class b/training-system/target/classes/com/sino/training/module/exam/vo/QuestionVO.class deleted file mode 100644 index a82376b2e6f11653d87a2cdba21316d1e9dfc27f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10351 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 diff --git a/training-system/target/classes/com/sino/training/module/knowledge/controller/CategoryController.class b/training-system/target/classes/com/sino/training/module/knowledge/controller/CategoryController.class deleted file mode 100644 index 4d19051ee6521f91d4af0ca6d40b63c426d697b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4123 zcmcguYi|@)7=BN0OSdb90xh5*pyIX&qjI$^1=_WUZfR|oRYB3|&S87#?94hd+omxl zBt%la&=?bl;e!~(@C}F<hPp#%?uQ$7_}zylVjYP5(&fPx`vp%A0)m5TzjBzFps zV-^Rr9pUJCbxKuq6_!R#BiYlLo5(mqSE9mpdV;i?S_8BuL~E&y(av%Jm`Rz2VsSg8 zJIbirFbde2M1tEk?Ds1f9zV|$4%E~p$F+Zbh&D*$SL*kXb3VdLU!K)DXU{QDN|tnbbJ9 zV(Pe#nYO5zQ1!TK2|3PBHaHUkaoAr$ewnkLncdJF(s)|6oD?^l6B^7d%^yq+ac9ER zMpR2pfjtYFo5w`bP@Rkggcnw9cW+5*)>K!PMsr_JA8gn(nlT)a;&EXMuyo8YOh{uU&Nl!DYNas4TnC z$-rpy<6OA?+x*4vq$|D=+PBLgWkhu*3MmMwO}Vnk=v& zW|aO<(dCoZEBcb}Py;weMQy(2c z=ja(?HXVabq74kI1DK51^ga!ubNn=YfaXM1XzMCM3%?+=4}H)+dN#CZRcP%Mq3x*x zZOG5sP?5EhrK}D6ppCfD0t^g&j1!DTX$;P(hKIzF8=}9>_gOAbYMO=fJ_lMS2iED=!T0wWUn}SePIlQW1`=S)v zS^5&XpO5XUq615@y-^X{F<|Sjf~|@Z)lw&pQv$5yLch$3yGa8H(usX}vVvXrsk3X> zAH?or)}MnLeL#Z691OZyU36e0t-&Gg9zEwm*+%u0#N32ULMGdJn#8JJ#FY9M3+S05 diff --git a/training-system/target/classes/com/sino/training/module/knowledge/controller/KnowledgeController.class b/training-system/target/classes/com/sino/training/module/knowledge/controller/KnowledgeController.class deleted file mode 100644 index 524a12488b5c959a017168109f6d5f98450d8ac2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5447 zcmcgv>vI!T6hAk8gr=b_pwOZyAVOP&Re9Q$N*_Ebfrhq3MHIK$+jMEN8+JFXwIX7r zRvD>&5XQklilTgQcsL->@vAfb9VTr*@gF#zyPNE8HXBLXk<27}b06pY?(dxQyLbQk z=l&l6ume6X0}m8=q1X>4P)eXBEXO!ilw?j*cu^9i2p5xuM3iy^k~|cpLWFW*S<)0a z8l?)iFVop(_7SKur*>0iPz+N7I|2pRRgKw}(e(1ha##RmUhw&$9Q*_t=V6P$!Z;tH zCT;@#wS{04G}*#+FhP~!_MXnhI+vvgE+$KyLe)f6kmsU2hNZLj7!7L$KuEi1BtGSbr(r39#SyBR6tq)~ z7o!Ar*{ug;DdK87CmRNB#DqHaSXKL>29^`33@en^>}2nmJ=q4&*1mOQY%|aLVFf&g zUJ`L3+spPjdI_-*tz_|8MWDX+@zJ$W`+^_Vz>A1Rpi!E&=Owwkh8X^JeyC+Ds^W>> zsHpav0bzsneps&$%6)xNQL;E>gB$#?kqs^qCC0EyLn0k&lM|B0Mql>BEAT3TWoT3j z8n&s>I^2dNMPy}|!0KE?Mq(v2G0FvSnI6W?e%Qhc)i?~b(>SkaF)C?3*aq9Z@R}bQ zpb>XsMajrc0;NqTB3d(nqT0F;fnrvC1cccKXcje>jtY8flLhov89)LLBx1c(>EU~$ z*t0kwhxurTS48$d-C3;li&$iBE;XH#^#3h^NX3HVX^kMzP>4ZyeL+h1Q>|YXg1o}V zFs&2>Sk^5@BwkA>xRF1f0Fg~D__LMD5;?cIIpjGMqq(se39ISC^c7>6%BqMlX^|vZ z<26y1aL084QRdVkJ`%wrXK)iI^D4(%6S&SeRrI-N2h}nb<5`whC&$NTCU2*HxH5hH z@)Y|WOOBtPp1ew6b3j%ioElf~eCuP(4#~;@H$;26UQrTkwz)l2+t0`2I1g=?4D!(g zvR=X&X(s zM?~QSibi&T%#6&6)YgKD4f0xlrT~$IQsbx~aCG(=UD!!%szMRg8i6e?S)G%qSyjp0 z5IFw-;%jo|0jmvva{NN_!F?kx40@s280icEzfPvUz47Sb7X*BU8)Hoc zyDivn8@_P*;?aRRcWS;Anpc#$i5$y{RjEt&QeR!e<6-LN14HtXcYe!eZe@lvDsUP6 z+(@R?!343&*r;_ILRJOyYQ#31b~H13b>{rlJdW1b99gTm5v#2`+gXt8sxXXR}n7A*)I%I6f{~ud%QS-+Z^>OE8{$ z?A;ez<=Ae*m*Qe*#(%9i?!jk8{VgEt?}66?cVXcT?D4?s_*;sz0j=!B-=)S(Xu(zN zQvq$zj^n$qU4nN?eC)=r2ll{Td@jRQ2M)iX!afLKWB)rqR5*aGP6#3zH~&jq{jba8 z{~&Z({tue|yPf`fZ2k{H2q$_8E_@Rk1m1$Tahq;nmbrr2kO$0R!2M;&IBbGBqJycl z$aojt!@;BYEd#O?AMfLrVJgRKlKzLsKLmPBT)VN~gMFDGJ;QK4Zw1Mxk8T1VY@Qvq zuoIgA6#YCNTb~&~C$`nD*cuR9V;*dIf*5fIu^&Wa#Ym!@ARfyLXss)t76jBfPe21m zRt8YinN_j8fa+WU?L|Nx^8_T>0Le~3aT8E5ole#1nt#ay>6WwljKu0hXh9paYEuEK zAy4pfD)6`sn&O0}n$Vnb#4)aNj$O-0yykIuD zf;o~0%&;BIaDFf!+Q5uB!8E`}7%Zku&FP@|>hHkT`t`Sg+{9kHNY~ha_)J!Oy6l^} lR037F=!CxXW1W|kPy{Ej?-LbH!KW&W!e=;o+RW^+e*xg0{!IV? diff --git a/training-system/target/classes/com/sino/training/module/knowledge/dto/CategoryDTO.class b/training-system/target/classes/com/sino/training/module/knowledge/dto/CategoryDTO.class deleted file mode 100644 index 17435073eb1e62f875e3d283d3f26f2af18594e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3961 zcmb7Gdv6p~6#w1r&d%(1woh7E1O=(sZHtSDuPsHP1+BIPTdeQLusgOxcW27ZEQqhf zXo%66;9nX)fW!n7jam&pg8qStU%(F_20w(a-<_G=oh=hZ%Iutb&hMOi&+DG~`LB!L z1DL>T86?o5BB?_`N}%V2ampxE411|?;0e!01}YSc{In=VV$0Ud*qsh3T%y=qgiNk8-!#$|D*(O)3F^l z3n)t_&%o0T=Oa+xCmGx!9k)oEDN`DBrRJ?VhNWgFHIIfqNdAb9QOWNne=6dJl18ti|eYsu79^4_IQen;y=Y}?H7*Kh{J9XTJyXp3_;Vw@)Wrm))p6+9X z+^eIAae<9hW5t|w?2_R zmTS?#0o!&w!=oxal3TB^hK#}~Zcz5wg_87G*0|>u<{a-JTV#cCQLCow8cRIErr+K= zd-bz#emnQ>)$^ZT`TE`8-}vsz*B7sTd{JO)`)0?^thR5M3}W6rW7+0hy?WfN9Sgkb zn{i4;WznFgJY>jBddn71xp(IO_Z|IvQQMZbo-P0wr$oXD~9Wu4A4sgw_FpOIG0ttB5>osLz(s< zJ{%Gn?^uC-NMSSf<37^&^A<|r03VJ~pXS`-YLav(F4Wk z;Q4RPH@>^6!x_%s2e~TnE%;VOzJmD7hfVWWih(XX#9uuC;9<;gCFC^YZ@cmrP(P(G zftK=MtTJa!jB<9p@|IX-PQw`G-u24cW0g5FW0W_nSH3k?nKLy;dENhFhjW=3d|k^%UNsEC7L{cqGnb_IgdqGHRL(7W46^?7d!- zvf7#^`+fTh@g_H1uSr?BO_PJZ$zyml&hd@cYf|<=(`3#!$H9%$A!^L&}PR*)^LNrByrQ+7=Mb%T|c2Sm%NPL^U!zYl55z}K7c#JU`z>j#GEzeI=e2yo`>%a&;!IPwt zyl~FpDN+h%@iv|&l|lt8c!re9L1N-rQX1al<@6k>G~VZJ_B^Q!)_8>&q&o2}ZoqL; zI!Zj-0raWbALvq{{fR*p3I5l_pV$Hj7hO|r75Ub z8T!?Mw@_wssMs{ zCL^gr6M_li*Ye*q(OM@YV*pA6(7+_ySs^SHfwhq9xgl6>2e1@fMx~_{FQX#E zRB6tuDF#Ch#mzF=e0Iy^^2zfVyNG*$_0u3aJ~uZLQ1#2thQqf;i>rK2;YF@8q|V@F Hyo%gEkn#@< diff --git a/training-system/target/classes/com/sino/training/module/knowledge/dto/KnowledgeDTO.class b/training-system/target/classes/com/sino/training/module/knowledge/dto/KnowledgeDTO.class deleted file mode 100644 index 221b9f52cab4aab6d8e1951a08720de8b2f7f9d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6404 zcmcIoU2q#$6+Ty%v@2=le>>SUDM{nB{z)Q8Q$p8qz_An8uI+?4aoZGzZmf;1Sk}7I zI&Bi5Eh+t_5dK4fv=rJ<2(+1@p@g3)50n|6d4d<1X`1lFGXo`j=iZgHQnrbwGkCn( zbIq&}GgGNz+EP5KRb~Wx6X8W1C(V!-378LVxUfvPZ8URgsMes{lt3hoHOJ$wXOfk3U z<=g_hcNo;k!%EKBo-^wfkBw$oz0x3);Zg6{qQi=t3|h?!{ctYtOxg=ld9y(uVx`8) z1I0W8*BNvR6H4Gz?zjYY8ML9|z2B$2&7f{Z8d+!2E_w@2!5hscLD6eaA8iE1j9u9E z;F6se)X^Q7mI`x!&p`%nHYh_M#{6d;xMTj^Jprf;6ED~ngKlTexWj}c_PoQOkFsYP zoyyCpFtGxxo-}Ar5Uyw<^htyE z(G*5FXP4%N+$=T=_UC9TcJ%>+rs*C*D;Df|XUHvJGu)H&04kI`yWo`sy%k&l8P!0P z{i$77^Fe&B<-IYBL3Ta+E#~{N$O}%XWY2QezWd^n|9I*2J8wRB<>YVQdGq4sS1$@$Q`-%%V@+4Q zBsc16aw(rjPb=Sj`q4}0&s=)yiOc7IUE9mb%P+iqV{#ATq`Qf^HE z21@~Uj$2!V{c42?y55{qM4ud|E-vW0)JU;ODyu~pGgii+DlI`=Y}HU26{MKG zT`{W&2mF;HJ>}Um^Aq->zwcsu_l-{MLf}VH-iuCYDUTz#K}I#z6%1dZs~V|vS8YJz zUH7g*gjM4QgO!FjX5HE!J~XLS0F6zPS^Fg zBrK|ZU22Nc50msGdRe1axEP-m)Kxw0bA_YsypvJ%sy^?wXFMF&f=&nX#Rn?VyX-$INnYSqDT9t{0<)f>RvI+oh6I(&(I^4c7!V zEM6M@T+q$ehhoF2;L`BOM8BJ^oIxcNyLH#M|A133lz19U5 zb?yvx#*He(IbH9(I@B3gtPtmxdgpba&bS$dIJeh3-xlhO8(fIWnLAi1Ye-=fO~C+^R#IZ>@J833blX0=5$G zFbnSp-tpePH%JTLpPdTf?@!*loScFR@QdMe$L<&8(qb58dbyOG=M_rTcrcu@Wx14G z4l0zYQ4F7W`*JC{vQ#KLC4VV=lq;4?$pxrFsTy85<*MaUa-FJBs>V_{<(lPEa>=Vu zs>adqSgu_zC0EZ1u`q3}_zUoIsV;tHi|JRCmCTbE18HN8UFE&1`SSZ(!&cDz>* ziBo;OuTU&{uJ8AxKTolSbA4}-KC!X)0`Cpkb@oY+_Ke4{9=-1E3MB z1)veD)ofuM%RYpy)YN zriQ>#sm|FeYOTt3Oq`-)bR3J@Ax_WgPG6;~^aV%>`ZoQGPC`o31^Np;4k<;yp+D0XAsO^ndV`*T zl%~JaYxE?fMqC9>(NmC`M4X6oWk?-jiEg5=K*76Hsl>$pO)Q@a$B-;h{#nXD z7w$x;`KXC;mhcJ%FEeU|)JYR7uMlE>0`sY)-wBz1_(cXP99~gQzckXXwYh(LbU-HA z>gN7Aq?q2^cb2qG7ijMTtlw%y*RzjMPmA+S^Y#OnW(v+;2kgLjT%t}cU($x1#l}!_t zAx%cbWJuHM@C0~VMavIwgJ{C0{TgB!6KVQ7qzEO2PTxSt8)!ZKlfDTlN;|N1zXd5q z_tCGgxj6wmIzy)+Y1nWl={t~g`Uw*5c}NNR15MC(AtmW=w1vJ0DMkNA@_iqY!J9L3 zklL?85!FZ+0vi%P5nV;6)pmpx9TY1A%9v=a%7?`Ruqv`%>w~pga1|e7@Llw4T&iB- zHs2AyVyg)PAN-f|jq;D&;bz}G`9Ah)@7F{4B&qi&sq)+a8!pP{^){{s*r!0rG5 diff --git a/training-system/target/classes/com/sino/training/module/knowledge/dto/KnowledgeQueryDTO.class b/training-system/target/classes/com/sino/training/module/knowledge/dto/KnowledgeQueryDTO.class deleted file mode 100644 index bf279d8f944cb57c60e4d36c30515c082ddff9f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3743 zcmbVO-E$LF6#v~eo86=v`$bz)ph9gS{UVAeu%W25AeFQfT8n}oY?HN3n`TS0h3Skh z&Nx2kjN_xDPrk?t&giIRh6e{|O|ofMWSq(FJ@=g7IeR|u&98so z{RzN0DseQSSw%#Lf~dfuoV}K=6iRm5DVv2-p|q4HXU#697tM;5o;8=OiyKyXQy_Yh zV&{}Vb82WI1`RP4aUCtt1&;5uvS#NuidK5HWZx`W`6VlzckJ}}>dv(}Ie$SwU9~oE z+U2}JM|Q=$VWx{FeVB8~bR{D{^OTNOvreiJH<;^K#+XC3E?ISyMbV{V2x7N+F zvu2f?sk}7NrK4NA8F4n(Ey>ueBPkitieow(%!!6QI`(28KeJ>x=c_L5N(}`*9N%%851|+%1r*y^w#u|AqaJ7&8duW5YIi}wd7)Jg*2vUdU~N_t9;UXBxnen9 zOqD0|HZ87z{mC)oWO}0NHo>@ZtJCJXUnphv($w@B#x}(^DO;6|q9f4K;BaD~(JyVF z=7TceeNr8$+K3Ck)9a^zM7 z2I@UpDBZAEE&qh_rtqwpb9gWbd>*W>5A=+lGfVlRRT;?I_UguZX6J|nI1P%j2}0mk z1NiEg1z5g`3A0$7D>zn017|b4BLgWvdE;Vqf4x)WE|_Jxm#LMjm)dbL#9~gBN>+KI zXjUp#MFsnDa7UKHf>&`}pzrZe*5At%4)8c^;^C+8&AWzFle`bym8ZSC@^E)op6Og$ z!687D?^E2RxeBhz@EwTnT-Zx|OECz4*?qeJyn@r*33(6j-KhKn)Nd(lLS4BtRGHU8 zh;m}P^6pS&UJ@b7?c0_2g(~wF2~pm)UAaG0nb%E-a?f_nd=DdJ5;AMHM)USHnyup46mlk(xW#iUNcDwdp3pd&Gq$cGI)J!H_ljm!-o#bH1Uhf^=a-Tk~{d@-br0!w_*k179 zg!I-XgcrG29q}921T8)o8U7kd3{ z8T$n-$;f@Q--14tjBMe>Dx%*|2Hz%B~=O1e2|*d z0-!-7M$n)UPsSuD?t@~rtp%;9ummeUD zX{NXfzhj2SNfQp^dt4x|8AtIAW=TbG5ufpyW-%_~V_YH?#SN@tj+Bb`VPT$>hA%k= zuak=5D}HT(R2=tsL|i7-g8SHmH%RGtlfIosr>gyhr&MUMhv-&uj6Y30#BPs_{Wn>i zz%08aBLCU>6L^9F$)Q$cab+HYr=XVyZ>E)69u!6|^We|)jN6C&Lq`^m3GpXQXf*U` zTjnIsWbJjzLx5W_J)`ElIN)(S~EVu65PyVTL{w-(utpH#5lz(hO_I?Cr3$EGB8@B` z77f7a$n9JotTuw{_z;1wqU}(rYlX|G$aogre#s%vRb$#LKC4*cE>5b1b(E3(2T^9! AmjD0& diff --git a/training-system/target/classes/com/sino/training/module/knowledge/entity/Category.class b/training-system/target/classes/com/sino/training/module/knowledge/entity/Category.class deleted file mode 100644 index 0f0f36fa0e347807c3a8957ad31f17d0e9199b3f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3465 zcmb7G-E$LF6#v~eo86?FenCrv6^aemPlA9T2}Ph3TWrfmvB-zQHd)$`WH)9vb(ry8 zeev1RCtvK0!-LK!%rK0jFF51hB;xPxZjwz249;YC&pr2d&OPUz-?=w`|NHoN05hn> z(Sc4C5giJm0%JM5oOTM9op!56!75nmX==*0m0mL(Gkun?Im<1$_XVOSIq#kl=o}kg zjX^_9MO;T0bb-S!x+&ZFTFFcoE&KD5nO`^4rspR;Yq;jRU8Tc_Wt2^U{>6L7rjafg zTzkc>GK8%3-mRkty#iXrsM2&HFVGu8F4_UEU&juK)AJ^gZrQ_12Ln0=u}dK4*j4vp zHE&i0c7!}ESPaChX5+*rb?n9)0_wWyE_+e!92*Z|gSaI0O&xo%SD=f~OO4R_Ti{-B z61-2xTN2zu@VQWYaxSG~KMpW(&aE^<9BA=W53--t8`Ck434vW@qiD|BR?cv*72FL< zj%!%1BXE7}#h61HFRWLL>x;c4^C=zEILM0R3~TPQno$xM2rqbX?Vg!)v*R};#}4Uu zM}niKL^^RC!66k#S;S_weFKR;rsFu?qw5XBVM2M*f-GB*R>w#bU(>T#u*~IJdCja| zHP%WVb?lr`S~aQ#IS!N&ccZ|)IJ)@%IhiE`oH_$qatjDBzRCoaOn1Z1v-Tv4YgV~d z7mb=+*b&|oZ_lM!4>4g1u<+D`3O^V&Ym|bPnrr*Z3kbWlUxF2w+9UMPLGcYX<{D4@8Y;W>kkquu8}J)8I_+qng_!Mw@qR7ROhpFPOY|eFoRFmEXYtt^8!I|dw>v<#RdS~Ca;bI3s-|4(z zQ`wO3L9<$#J7pGh&>qUa%~)I$JUv$8=Qikl6pimbA-Mg(a}()ljm>-xloS0ouVc zF~T=*AW9wby70cd4!kc=F!LKs$2;vtHmgQScOXx|ybsxaX@)Sox zUJQJ<8vhFQXHIsYX*|%@m{&y`iYDzmL;Q zPUf89S8jB4V)8er?RRX@M+7@2cT<)`;0)~)HWBL~a2B)eTqa)ErL1nlr9U{=-euqG zx|Bp|xbz2eINvVHov-Usa<1WW(DVO6gFmN9SIM)%iH8{CGt6g%&*)>k4Q#JWn2m!C zHu6&S0~BBK+eL3rCMSM`5_vHBC$#UNbUv8;1KQFQ{Z4wriOEMu`x2L2p5iMLnf?o1 z$;eamZ9$(-MjqmD9Wjzo2pP#llZwPdpQ3*YiKLQ@hCrhkm7vj#mQ*E33qWd83xS3* zF@lCN@nlSb;sGd@jMqVt2aLZn)I{AL8!LWZ4L&`=JQlcf1K7d^c4Y_m;2V5MT_=v> zD=boq;4+F>qNLy&Oe|B1Vw2^(NJ+&PWb`FU8ouY@ahXyKKd>@aD8;eDIF6%N)&4=Z z3N7{wgDQ^jr-^46^2OLo#5&FAS?!4YhZGR#1S6K6qsYR@M8l_rpQztBN+VH)>B&Tc z#<}3}hkuNyVlRrX=|ZI=r#E|&=hwS4tnu*jaBp^l<aiDV?0 z(PWYRsnLw$O|ib7k(N~IQ$v}kHx+G6vFfxMZeOT*Kb#=`PE>FeA2C>srC6oZ!6Wr9 z%OMMOfW`TkQiRzZ#&t>xZn0Z#P>Om5_zBu`p0*Jcnh@M`2=SbT&2fiR3_z&^>X=BY zDu6{puqJZ5HUO)w;3mG!1WlO5O|PQ2@Cm F{{spYx`Y4# diff --git a/training-system/target/classes/com/sino/training/module/knowledge/entity/Knowledge.class b/training-system/target/classes/com/sino/training/module/knowledge/entity/Knowledge.class deleted file mode 100644 index 8c5c5f3a6f99c0b93262d0bf2be76d2e291aee1f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8256 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 acQ502pZGl}9zD#D$UZIN5j;+c+4%!@Keamm diff --git a/training-system/target/classes/com/sino/training/module/knowledge/service/impl/CategoryServiceImpl.class b/training-system/target/classes/com/sino/training/module/knowledge/service/impl/CategoryServiceImpl.class deleted file mode 100644 index 9876ab18f0a5f4d97ac3d74536553eb67377776b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16554 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 diff --git a/training-system/target/classes/com/sino/training/module/knowledge/service/impl/KnowledgeServiceImpl.class b/training-system/target/classes/com/sino/training/module/knowledge/service/impl/KnowledgeServiceImpl.class deleted file mode 100644 index 0a93e3a4deb5df6a2341e8ffa3310f397cb9bcb8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16288 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 diff --git a/training-system/target/classes/com/sino/training/module/knowledge/vo/CategoryVO.class b/training-system/target/classes/com/sino/training/module/knowledge/vo/CategoryVO.class deleted file mode 100644 index 1318b7ded96c70e1e4773d27a4a88608908dec61..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6778 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 diff --git a/training-system/target/classes/com/sino/training/module/system/controller/DepartmentController.class b/training-system/target/classes/com/sino/training/module/system/controller/DepartmentController.class deleted file mode 100644 index 7fc83b5a1fb3e53bccfff16c830b4265453478ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3907 zcmcgu-ES0C6hC+SvF&!H&`O~w3aGSQK1MAR=$2yXLPeLhwq;ci^>*j79oU^&XJ*?p z#%R)DN}}Ksgzy6KBYjaY!GPH4yMITwv`_sHjK7)P?#zCr+Y)`4%)RH{d(Q9t&d0rf z|MTQeB05eJ_2i){FID@ghH4p|h-wMRP*hDab*`w28j}*5oQey{m^Mt2kfNGu>RLQ5 zbSWf~TsIR!HT!cyMqA{ZcvR?nfkhSySSWVX6=W)BA&sE+ErDrKyh!vk*R&aJR3be0_*H`@XD!m3UvWSa(kDH50g{3xX_fm(S0<;gOoXp7t zl~HXEO2+JERMp-QVN`A98>8-GT_xx&l|@15=+|UaP-9q8#b7EiF7z=z9*3kUtVMY| z!ga-(XNA?~go2FgE1^F>Tx*mu4A(_b*g`)e!_&edf#|F-Cp3AO>pTJKbQrB4RbnbP zQ#!zXxnY-k3hJ+CO;-wYxi{Dg_^l%;)l?E9q8JMJ=~GqByOemZZ6NvE#I0;&)!K=t8c-_|Fk%B)nfc}MgC$v zJ`QtpVztbmwKmfp8C~2^zbcW=Wh%c4EtOGci39niT-7IJ-6Gqcp1qU) z<4LAE7#*%Sg@!f5RTw+-3t?pVf)xjlHkb)}&`7K4PAuv>KG@G|4HF??! zY34HeA8Ctd0BqB?c<15b%?GQrRo+g9Q!ds}XVwMADEtg1=3HkEy7cVb<=a23qB~M? zP(wBzr{DFiosZ>TfYw#&8`V;JRGe0a7egBE^9?Q8UQlgA8cj9X2(T1CG` z=4RY``pdni-+hgnEi>&OITu>I{$u*a_l%BK>^B~NuE#KJtmmlRN*&HxB%V}OpWV)* zns(#G-e$MgChN_PQ7u~Sema2JLCj8K-Gl$8z(ZpDekZSo9@BFVAn}lt-A&N)I>s%T zo%9C1i5bpNCmn*e!x-0~`QX=u&qGJ(DE`|pI)>$LgM!q9!SM^k4Ckho|>w1dF5i>WQ`BH-^umtHGknnw-POD3Zf<8gh61Ua)Yz z?8MJ!uXd6Tbd-)^8Eo$tV*7wTgzdGlozDfZ5Zj)T*t&r&SO!~}AYLd8;zx85tYq@5 zD2M_27$jIh?9Gzp3p}E|fqlOb`xR1mqHlKr@#PZTXO~VcfHkxkhd!~7eriM6MODNh S8#gFwWwcBJtCw<^V*di}LU?5W diff --git a/training-system/target/classes/com/sino/training/module/system/controller/GroupController.class b/training-system/target/classes/com/sino/training/module/system/controller/GroupController.class deleted file mode 100644 index 6496574b535b1b131a93d4638456a8494fa0d2fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3801 zcmcguS#MKE6h4#9#BoUoJ1s4wEhJ&NrR;G?fw)Q2IwVbkOQGAucW`d7?{)7Ilvb50 zQBaUt(kBq&1=K}(Dyc*Tg{VKEzXNA^;vZD~=3d8JY{dq(4_9~Q%*;98`OY%)_dk#S zBBB#CR!>z_?W39i)lwa!j;N7PEKN5Q+vJ+A=`kf?s7_oc)}&>Ngc3D$+ce^FVJf|* z;Uv2=b4G!flne`VLW>GUN5ZQqv%IaIru4aB1FfNYANd2+KmkUFo<|8Ie_XR{7oo+d zr8PXxC%6*l@F#5Ov0$4gaBMBEgt0T|r?u4Rqox3@qh?0CR$7H5Vd#n}EGKR&L++1} z&vK$sVZlgeu91P!aS^p)raV2a(;EV`kv1_}8xtP#kg&NHXVjIeISqfM-uyUC7#^#U z0ay2y0Bxmhj2fb*;I?pyVRW*!2)=whs-0F88W~t-ElZ<})hhwoPOn0>lT@>+4^*l; zA|tRv(!Y~Yduv6^y&j-9=uJRSMOO*+?1@v2o9NpFuBBEIum^r2EhRtow&;hb7tQm@Rna5)2K@$fRgIfyE zZcql2!gTjS52`bf;N~Q#UcB)zHGMNRJH7DayVTUJ#d|a8En&lqDOS=%pSvh&xNMl0 zl*?jN8P#+(N2}5+?0%k1Vjr~DPVl$`ifR=vIa>13W*DsqcIFfeAdju6sU@YyjP@>F znOV9u(-(R+HNl0RH^}X=<=TSQ zI2)zCA)#t)Sc9m$6h5cI$UsEW5p2&-`jN?Gewl7V7r2BD#1&MFhMNJotVHAx7|J)A&e79`Iw@o5-7)_UV-W*b zUB>3`Jea>ZyUbYmU1QM6Aq?dtFDFLf7pSD{eU(L*n!3Am`{!kJN6U_9$iIYxNc-mYP%)Sy}&d>m~rFlA& z0W;`=Y0UEUAq`=17+*cHP56!AlXNvmy5!_6K1PuYt{%v9kwqOZtC4zXNFo>Vfr(ng)uN6UTr_Vrw3}RQB zEPwk$+SR`24`RPVnw#iba)9_ViSBnxClkP0YQmw<-J@T)PuNnrJ2 H22<=`)`Lw# diff --git a/training-system/target/classes/com/sino/training/module/system/controller/OrganizationController.class b/training-system/target/classes/com/sino/training/module/system/controller/OrganizationController.class deleted file mode 100644 index a8fbdcbdf23521ad87b4c3a5d1da85b04662e6cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2154 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 diff --git a/training-system/target/classes/com/sino/training/module/system/dto/CenterDTO.class b/training-system/target/classes/com/sino/training/module/system/dto/CenterDTO.class deleted file mode 100644 index a7e8b2d19d04fb8393677f0deb1ea42416f155ae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3025 zcmb7GYjYD-7=BK&o85-(g_ah=&7whjC5k#i(jri(1babRiUKOzWNnwGyLESq;#WR* z#*dCaz>YIGgENXuXS{vE8Gi>1{sr(8@~V;#f>ad zNNZ3GsK^L(+%RvNg_`Ls6sG5ISd~B^Gh#b-a6%y6*FV<+9W5HN26n&@7_PX>1>bhu zLg1N%QEb_*uGXxAf6EW70mU(w zErHGiW+w2cI7D?C=)x|67T@)PX|HN|0$mAcnKvz1UMWkBJqC7TkAPk=owJ{=nl*v$ zz63V%uhf4W|yQ={kyDP8jH!y%fy0B>ai(_t;fngHLolM=Zfg>mg>|QpP ztTETAn89T`Ajt6p(+PZma?;t*gM>%%B?-=^iAld>l!n&?c7;i^-NKCJ*=EiD!kn+s zo(@0U&RL#syUwNZ83A!#pmo!bIkUEEsWe#r34z?jRVT2QtvTDbso<33xPci^lordY zmrO4(3paT|HDnhm(j!@1fnS(%gVU_dr4pmJZ27*qKnwOfy#L*!UvEG9a_#Z@-G}$r z{<{71!}}YLzugcx(0JMGt(C?Ll_;j|6SiYbtuD`7-fZMm=Y(4^YjY+&rI9gH2^MWy zS(x}=MNeB*KPsxOXEM@1#|TbZ!J=EeV0tVDHVUuMC=iuKL&e7FkU|C#iE8UfYOZIJ zIN>(-Qe5=3$qg1|_h{0oylhK7PKSd6t%x**2c#uhuwI(&07Pd_tj`kL2~hjr{MGx#uzkMOaE>#{qD$!|>>+qvm3S%pY<)G*^_C2+l40$(M=7Xu@u=S-(s zv;6#o>n^RXloI_CCnLdW5R|pn1b#Jv-yA>*R;*&otkq`hz$)pe(22U|eRg$J4E4%D z$+aH6QPIzmC_9ejjnz!ww|ots2poRK`({pQSQI$;-%zG5iU1CAg1_pnG*4*iy2oXCi10o|XFh)65aMQuf8JumVvh{gY%H-8mMw@ZG z(@f>g=T#|lTvyo@>gRhjQYnscZJ`5eg9G0{RqhP_4*hGW={tkJL7yBNxQFg=OCmQl z#IK?<{0DaAln2#KsS=ZUfX;Qa=G0s!0m>IOg7QT@r%8|= zgS4E!2~zIRp!73EcP%os9{)9*Lz$j+<8z#6A*PUrjd#gQ^UYns1Sy5F8^=o~V%2x+5yhmyX1RbUsWGe|wO{+7w5qB11)&I!YtTXqbro9i>I4 zLGKt`hc(J_gD`Dl!XOWT<%}O@?|{$ diff --git a/training-system/target/classes/com/sino/training/module/system/dto/DepartmentDTO.class b/training-system/target/classes/com/sino/training/module/system/dto/DepartmentDTO.class deleted file mode 100644 index 955140e315fca6181eca1b28c29f4a86d7bfdff8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3591 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 A>;M1& diff --git a/training-system/target/classes/com/sino/training/module/system/dto/PasswordDTO.class b/training-system/target/classes/com/sino/training/module/system/dto/PasswordDTO.class deleted file mode 100644 index 59844be9522c39f6143750c88d4d23319770e5ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2690 zcmb7GU2has7=F&~%G+RI8Y}ch&RFs$TLPectfAD~?;5Sv*Z|HP3YOB}OW&hblPs za!$JL(Xa_=fiBy;(l8U~ji@g8E~Df+sobk!3;G07MZ-S+PR*zY^bbc=g9LIT=cV#i z4FlLF(6Ma#XF~|R!y^&(ItWR}b`6h7zX?-1^`!L<4Lk9;Ko70wqR{$UTr|POuv^0u zc#`1ChF6|;N@ktEd@otwqv0t$Eih0uR?KO~E*kzh%cqj<`G)O#0tcdL)Nw^{hC!mx zLs1eV0)2H_Ek|E4UCXFg?-~~?44!7roGzKJXF2xS{EUD&CD7f7x@1&prb=}3PY7hr z)NJ3XnoE{v(ZMm>c6`I9Dd9|brHGv(iaTc$xw#Jfa{#&dm*6Rv`_22vC#&2JL zaR2l7T4N{y|Cn96v>G}W|(6rRQ$5VB=;8nXKfQehqqo_TQ=w1ZA#!wCl;`n#97%P%y?-1h_LL-&WfoA-h-w& zVHADGy(;i&lWf(0dKt88wq=C@I$&E52d>P6im7Jd|-1 z#|XNg-91%jatJe+rYz19Ji_rYD0qp*d7L8^v%G&#aFn17*u@_lsXx(^MCt*yCK2O* zN<6@}VA#}vXBa@T~tzigwv}vO4+S5coN4pqKW1im>y}ZKb9A4wBlcV!^9d9D@H(8}c A9smFU diff --git a/training-system/target/classes/com/sino/training/module/system/dto/UserDTO.class b/training-system/target/classes/com/sino/training/module/system/dto/UserDTO.class deleted file mode 100644 index 49689a452a79012519f94a2aa97c7cdce8e74e29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6871 zcmcgxU6d5n5w1HsGu<=Wv;TjsKtu**cfpC|huG_y04wW~UD&XIMonU~+hK>DonB{p zP)v*(@*^=CQ6k0|G=GALF=7Oi{G8+==A1n9l)NP8h~iV8bD|+%-P=9WGuy)EMb7qg z-Kwv?+gDbgvWQQDwpG6W4yyYsnnzUbz>k_{N#=G~b}!O4{mls#uYH{-dvU1g^< zvU9tjSbhdGjMt_ZcZ++6n6ky7R%#QZSAZ?r^Nyg75N^sVfm$Lv4C<7~1-o3n$1TmU zd$&P7Qdx5B!Zx_Gvd$3B8{R^-%xq48Go=_4F}3_g)86BM@u)Lr@tqUbIgb^hxGSI!q|1 z`IJF7uxBegM?#O!tV0If$hI_Wqv{Pj&)$8-(k?5^aVk^^Y)yx*)2}n z-mQ5LpduEj=#>SX3$KR^awzD21U?i^ z7mh!1;n1t~5777ap$E^OJofIv6Ym~9QE!T?ebqXiFFM;Q^Lw1qP8H6Mad#Tgv=LK8 z$5+O^**wCtZv6i!lX$d5S!I6bqCMHa8w)q#c(d-zq+LRx^RRr#UO3dUx30AKJAoY; z6(p@11*wXhVH+nX(h{OdODq;-PDa!eNa31-N&<~vNfcX)&We&#t`u;lH_0Gpvh}glv(>nzvb7MUvbAWWvb7ga zX8qUHvcWqgvg#F5+1k@;+2GN1&sEzIFFfT|O4H7kJioocdlwzTbzG^i!8f_C$E9OI z?eubMl3q^Jujv(yPI4iCRZzCpMC6P6-8m42c8!x`iQ73nQ@ai-vu zv*WHiS6LXkWNEK+?4SWpp{X6zuohu4zF{#vpaEC$PJF@{Ay;yzX^I;G789OO<}qceh5FA8f^ zv^07{(27e#vDs8;X(bNq7zz3!8FU5RMKF!mViJ3@TcJHJNS zD=@~W=G+tMj1DitIn(I8EYcbMUW9Xdqw~s0XEcQo&Rvbp*G4*{bBu8AZFF86>5L9D z!ug6u=j$V#(TGMkFK=|-5b2B-Ji_^^M(5#3XY}Y1&Z`=oH$^(5SB`MLrqOvc(ishP zgmZtR^LV6lnLO-6-kuijG2D{_gQrM~-rPM3;csr<_*?}9Rp6Jvsfm;kw4d&YqRcFn zk_$?eQVs5nrfgp-CD)xQr5YTFrtDfOC6}-&r5fB9P1(CtO0INON;UXOH02dbrR1Vn zrBs8jMpG_dDkaz7Dy16SAH9jLS}G-%=_=*blK*Sbl&h9X$<@3{xmr>_5dGrUER~WE zhAO2RJQz*czf?*-W2%&DfS(3b_B7pwyGbNY4Gz3OiTF!{emIqubWv!-}u_3pJbZH>v$N8SBjWY5I78*kC09*heLIW>*L_X>|iMY4w=h4C?Vg-DXb+G-dSyG-dUfy$tH}LA_>Q0E)kair5r7-&J$) zo?6hLeu`7{5Pcmxpj$jo2hlLZC@T)rH=t{x0r3cZ6H=T;MUlP*DM1rrmc9)sNd+-R z4@1(ZBsS9_NID%BS^5s76de^S=n+V1I!zbpyO5gccl2+16p}%Ir@zr-kTUd7I!E7w z)Pnxy6g>{9RV2}`ABNN>Rzvdyq;@d~-X|e-h^;h7M<8{IN%VZ*htwrp{Dkxrq;65c zQFIhik2r$v@o7lC;u-W%KY-Ln&mblTDXZ!4QHw_U`_!XR41c~1R%(!pSIeC@IvJ%pSyp>M6nFvh7R#KXh zRTHvVd2O^bX+k3VURq!pv2S6&lVvos;q zeXr)gG-(;qWK>N?V4AWr(uCaiy)x3YEIM@_Q-Sm&-y{a;hx9DMoDgg1N04Ha7OUtO zR-=hli8MV2DNZ-hzvy{L2`tGu`Z1&=4wg6QCy+F3{bTe~NILxj>-aNBDf%gd(nyE(A6(er>ym>1*Q{E4nEW00K$yDP;&QYR*9fjrTw8HX;M#!8!ZnF&>MY$()c6e}`~`S@kf=y4E~LLCPHP=A U{R-D_aM}=3OyGQaoz9Z^KL@lC)Bpeg diff --git a/training-system/target/classes/com/sino/training/module/system/dto/UserQueryDTO.class b/training-system/target/classes/com/sino/training/module/system/dto/UserQueryDTO.class deleted file mode 100644 index ec5bbcbd8c45d8c62ec199834b970160ec83a8aa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3696 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 diff --git a/training-system/target/classes/com/sino/training/module/system/entity/Department.class b/training-system/target/classes/com/sino/training/module/system/entity/Department.class deleted file mode 100644 index f249245779b214267954b86e142a2aa9fe3deaee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2998 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 P&vBot3}*%l#zg)fLZD^b diff --git a/training-system/target/classes/com/sino/training/module/system/entity/User.class b/training-system/target/classes/com/sino/training/module/system/entity/User.class deleted file mode 100644 index 74c3ff7680567bc8528b150c52a5339f3a744124..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6476 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 diff --git a/training-system/target/classes/com/sino/training/module/system/mapper/CenterMapper.class b/training-system/target/classes/com/sino/training/module/system/mapper/CenterMapper.class deleted file mode 100644 index bcd506c317b3e5ebb3b7c6f3b0d600533c29fd6a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 419 zcmb7=%}T^T497F8ZrxQukG_CMbMROdRPa<0T=1TDL(S5eDf1!p)jaqBK9rd4DvAfe z!{md^|4)8-dw+QafD1S%U}E5`@fM>vk13EiaV=WE%pGGKVq%My`kn*cuuB~7#-@O6 z1BWYmChSNB_w|aKRKU~#uI*~_R+c`a9coGv`z}Wv1pYF+rpOyB1G9y+j#3V6AXUFj z%j%zo=cC{+AO(>$d;*o1rGfdv=g{!2bh^XQPtw!%J_e2-vWhG}N|d_eE9ZPtFz=#) ulgft{si)?NQAS>*?+>`)EcG@9w)E}j@j&q@P948}86yS6HL@!$)1G)E7sf+C(O1qwtnpZ2XQvqWGxVEgwTUq*ywy!8j?Ajc45cu2hmLhMg3``c%I7&IN zf!Eo#X*v6+;pHIs3raC0^}nFX>(an<;d7|@URvGbWSjVWy_bR0$E;$@PZFhS`Nlb) z6wte9;B4kYgVa&|%qRml($59l@Rs^U26pu9=|_N8g~k!=!(_-)IM6)S`60j;m2`=A diff --git a/training-system/target/classes/com/sino/training/module/system/mapper/GroupMapper.class b/training-system/target/classes/com/sino/training/module/system/mapper/GroupMapper.class deleted file mode 100644 index 7987ecb2d36a5676b30e5977d57caab7881cca07..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 416 zcmb7=%}N7741hCLyS6Iy>I--@;B{5dgI+2^3*NKau%_(HEb}Amt9kGNd?+#9MHCN$ zhnWPDeB{gf$LkvaT){~J69X5uw;08FOo7CSYtZ^lZW&`A6I-;@bsX?M_}o1Vc>((d z7F&8DY)Shct1Z{5fT;o8(JJy*Ha?^6D@qc(Hb*T4{$kxy`BZd;%PTgHiwh diff --git a/training-system/target/classes/com/sino/training/module/system/mapper/UserMapper.class b/training-system/target/classes/com/sino/training/module/system/mapper/UserMapper.class deleted file mode 100644 index 27fb20f8bd462d9ed1a895e5b8b642fe95d0f321..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 413 zcmb7=%}N7741hCLyS6HN^#wc{Jg*9R@U$Yd=smj)Ys${dGC#t;ng<`ihZ55*Qt%*n zm`NbXN4|W1y?+3}4V)A(F>uv*i&31%6iA%77Oh|9jxi1~u|-RL&jFt!hsQB3VBf&m zn%)RI()Oo%%}pv`Y5+H|n!J^j&uE95lEl8tQ44{8Q1=vhi!v};Iye$pPmp+GvAEeU_PIs15cH)#dPmn-u*2Xo1&)LYrKb`e&PKvWJq{AhacVHqQboVarvk^I z7D#RK5}HA)({(a(l-|lWirI9?Nc~jnth((ArF6yNuJqC3*Mqw~-FqOZS>zTRS-fN$9EM}bv zW3WXT1Wv}@68K_c@Q@fD1|)VauDv=1N}4Vy$hU20J#4t?^=qOtlV(<|DqB=_ppw|d zM;XxOTYv8GJRJ)i9gTxtneMtwhiSnsSrxKMP$jztb+Y%;D1&`SZ?^%>h3g=5wV?gq TbqGfb7kwmNPCbT`%sTx6#di8d diff --git a/training-system/target/classes/com/sino/training/module/system/service/DepartmentService.class b/training-system/target/classes/com/sino/training/module/system/service/DepartmentService.class deleted file mode 100644 index 28f1083fd2cab44939cd0772640be4886c0a8353..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 948 zcmbVLO-}+b5S^m9fFGbJejGjF#U4yd4C+NRA;DmRaxc3REZJ>Iw@W1PmwE69_@j)& zF1i~uA$Vw-&P?CDzIpxle0v9gD>!l>$Kb-%0S~3p+!`U3R0AGpFY=Lxlh7jN(2S*v zyon=WY=FvklZXSW3@Sr07Tgzft$l$o%PVw7X4H_p&AhOcuZ7OdNg?qHm+ItX21ZdIFy@E?L(X>1U z#jYGEVIzYKo)*Ggwin4U))^&woyIjWs17j0yNOmvpTW%^-IhgXkdyR?ifd3tWitp&ir^fbsl+{B%+n4FOw&~J5Yce6sIQ!CEC_$ q$RrNZgyW0BD3L1qhU_fh z7?cB<82duP;I!FYLU&a(cF(d#YGlB>H0jdo4``m0-xpehXi(E$)yG(96JlgKK7-Og zjw4}GjSTv^kk{QjA*L$RVAyk8M4&dtjBy){kO70%KX0sn$-t4sy5eaR2CWthZkxHZ ze6!%ye(Ze-WlgclF<7Gkf=y$8345_B?2r(A3`pn&vBuw@rJ3g+#$}msE&mnsknaUq zEX^$Q!@5x(s8oA+Cj)Z3{xhrR^DI#?NeMayihhB@TZBz;pfs;2ee|i&aiB_9TTr9H i#nm?0s6&0(+O@3)?EP--!@;sei-eb<9>S5Wjz0l{SqAz5 diff --git a/training-system/target/classes/com/sino/training/module/system/service/OrganizationService.class b/training-system/target/classes/com/sino/training/module/system/service/OrganizationService.class deleted file mode 100644 index 2f7b8afc70bfef84d6a8e9353d09669bb582bea0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 427 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 O{s5*nsa~}i3;rJ#)CJ1` diff --git a/training-system/target/classes/com/sino/training/module/system/service/impl/DepartmentServiceImpl.class b/training-system/target/classes/com/sino/training/module/system/service/impl/DepartmentServiceImpl.class deleted file mode 100644 index 90d7e70243c2865fdffaca6b1bfa2162e9467f18..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11021 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 diff --git a/training-system/target/classes/com/sino/training/module/system/service/impl/GroupServiceImpl.class b/training-system/target/classes/com/sino/training/module/system/service/impl/GroupServiceImpl.class deleted file mode 100644 index e8b0460ca40665623ec6fd427b4b273c5fde9008..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9616 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 NA}OvHH;8T&{Q-OhAiDqn diff --git a/training-system/target/classes/com/sino/training/module/system/service/impl/OrganizationServiceImpl.class b/training-system/target/classes/com/sino/training/module/system/service/impl/OrganizationServiceImpl.class deleted file mode 100644 index 35e365a66de7adba63f244185ef83078332b369b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8413 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 diff --git a/training-system/target/classes/com/sino/training/module/system/service/impl/UserServiceImpl$1.class b/training-system/target/classes/com/sino/training/module/system/service/impl/UserServiceImpl$1.class deleted file mode 100644 index 8ae4e4ef6123ce3c189b5459f0868f142391cf88..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1217 zcmb7DTTc@~6#j-5wyld)L_zR^vH}%k0r3iAkS?*>E(t9dgE3jQ6Ik5tkiB61AwK%- zvzQQK3_n2slkvD}_FTVn=J(&9hX9^qE{8UxG^BO3ql2N~iiR0^fiUCH z@d7W{G)dDCfyslU5t*wI538{gClN!(uHz@14ilq=^>WLOvsq-2)sWM10XoC{SL)LDw<^w#L9q;3zHwZ>)KK|`D&II= ze%pE}OU+-@(S>RyF`nq*oMh`_0VciQHpCL6`C~3IL(7)~MI;QUs zjkc&J?$(mW{kj!~B9yuNbX=3UGsRL>CC_01*EQUb)40hna+aEAJEx|xB7Dv;-r@+P zwHm;nj@y#`>GP2%{j*f$kPZWP8QK?$m6A<+(+X!Qxoojph8WdRkRdWb5)UqE?@GbM~~W)lO3Co=_#}oxW1s}+N|(+OVl+y zWtclVq1Km|+OT;PzY-C3q?dw#hl{=wMLfz6(jB=^H?%F^C+7r^q}xIoa)OCTl2e5K zAVnwO!vWaguiOu4d-Cbr$EEc0H>BSv*h{co!2|Rwvs-(h=gvNckIe{<5Nw*MulERc zD6j9dj#>1e7gx}SAqdp3=_5QQnZ^@(KU10~luQPd&C@TR`3J6?Ie-8F diff --git a/training-system/target/classes/com/sino/training/module/system/service/impl/UserServiceImpl.class b/training-system/target/classes/com/sino/training/module/system/service/impl/UserServiceImpl.class deleted file mode 100644 index 0e2a0985c10bdbc10251bb8b894d222667cd0168..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19798 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 diff --git a/training-system/target/classes/com/sino/training/module/system/vo/CenterVO.class b/training-system/target/classes/com/sino/training/module/system/vo/CenterVO.class deleted file mode 100644 index 6b38a8a7afccb8dd35973ff4c4bd7fa2f98b19b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4309 zcmbtXYjYe&6+OMXvopIIJuF*tHa0;4Ip~=+!922SnNmj521=bkRJd)gAh)4&+N`hQ=kHucl!42b8mN_ zd;50lZ~uDdF90s!tuk`Rn<&^YP!t%u>Fhhzmebj;u5aCR8<9Zqyw~xfivszX+07Cx zluVRu48azdZ}{zM=ym*R6gY&@tnD|uEw>up4kNc+-S?|YZYOes&2@pC*W?T<{V7)b z&URh89I-KqF@ZwIX}bdBDa=L`(5*s^+c=IB0;SLoqV=HZ1_H-Z&}B}v?FI@vY2zgB z6DT(V*NNO4p7dMM;E0{-ir;Wrm*OF1a=(pJI4v;LboZPfYIEITZ@t~fYgJdgFshfi z-Un=a5>o&q?s7Y-u*Et7%qnb{OnaUi4ckd4ns zpG8+X45j6)jXBH<*tFc}?|EXtL9%OUuxR69R0T{LtSKr_3}9n2CG@j49>M1Xh6!Ct zadav%$Y4p@ecr|w@I`?U+FeQ$)!SB@svI7*QA3?n?Kt7ilHX()m`KZICf`L9U$*fW z9v{d%y+-a~-)VK-^%n&m%Az(!VZ5txX7rMcOSmj>vhD1;OMa)}M9+E==k0`%qvF|4 zJ5%Hz_LR~j?50%lbcZ$Ru*M)0PYRq+8SnYk4L9(dmiLmg)gldJq3UkBLFoCNXO=Gs zh^q`pve-?ze}kKn{{+*1!`tpSQ8%FNlAgUs_4$<}oWy>(HrMMH8IyvJ$LNaJao4)- zEjPHKmo~0W$EL&Oa;dSh5bbz85Q|5dDmnC=S;hXOdeNitX6Xvc3} za{{J4>kSub(m)@AfwLJ$MjF{fq|Vi3+H(?ki5n&^eMU~lz>Fgz;Uk3ix#mieCHEMp zOW5Qf$+!0sqOZj6d+`4yx^f2L57yGSEU^^%(T=R1rVQz{EX$VCC~-t7Q#E!}kEJvv z1<}R2tVeZcR1KtS?wB4PP$|$rl|80W1G?dj$Z71ZI(u>c8P~2aukvh*WfsZ64ZAJg zPIfR|1DP!^k41g85pn%CL)cipOXt?SPfrxE$VZGm5=(<=sQr%ySZX3Gty zSA2iByH`J4SyGw-!y8PR4EXaYd~y|~RI!UCr`6iQIukq2rvp_!r>(o@)3bw}FA0d9H zAlLYn!@vl>!mq6XxQ-3>guK}K9W?#}%-?b_hraP-rZKPT4CCR0#-}ok`7p>ZK6cP} zD$|%Ze}?hILE|%-#=QQyxr2MI95kNGFxI@^;M~t(Gj>vAn1YxzLDi};;1fV zBKKULR4%`XZy~P&vO?EAE-TVyK9z+!g%5M7&%_Hv>+~-29lX|`is|$1Y@CntW@Zj14KefW*UoliEe1KzjU@uk* z_i!db%+w4*W@^QXAu+`dFn$Na6{Av2ffi~eK?^mjVoHz|gUpJR0-ddu2s&FUS4t98 zjzOhLIR!db8zSgj&8`edkR5|4C7{CHO!i*YTkd7zhuA`cv`pZAG+7jKEC|1cOI@CC z_ut?}N(DTLpJAJlK_cJ64y7Vm*o8;QL_qvaN)~?3sOq$5?za>7xeOfI2cQH9WTMTeP{z0Pyi$}R1nMH<-sH7oX z%F;<>^k^`+c}YWjAe$;L`R=ERg+ly;E-X6w=~(@I;etwt(_{4=rh_#$e+TB`J$&f} zsh_D85OS}1*8UwtlnS`Wuy!dKtU!-opHh({C-H4crV7^I zQT~{Uf(c6q28i$ZkLjY{&q>7uj0BKi3WKT`R!qVA$b;G#Yz~6^_>6(r#5!csx5^%) zA!+(f??$^yGUT;6C4{Krdw^b6pgzvJo==Xd4 R{RpqJSElq6ypA_f`8O_Pd}jav diff --git a/training-system/target/classes/com/sino/training/module/system/vo/DepartmentVO.class b/training-system/target/classes/com/sino/training/module/system/vo/DepartmentVO.class deleted file mode 100644 index 3ea33d5e727c994ebfb52dc3ca37b7c7515e1f1e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5209 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 NBB>wYC#>i4{{Vb6jhp}g diff --git a/training-system/target/classes/com/sino/training/module/system/vo/UserVO.class b/training-system/target/classes/com/sino/training/module/system/vo/UserVO.class deleted file mode 100644 index e0ce1ecb4fb06ba158a0f492b4a662be0865253a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8723 zcmd5?d3an^6+d?}d){Pbvi2ou66h3@rfpaSUMK=d38`tig;ZLrohH*{=wv3$Ov>Vp zpBsvRAe$nt)TPQIltmP90mWTW6a?4*{o79vf9Kx&mP{Y*lt29B>zjM-IluF}@7;6n zx#zv`?0+8n9uaMzzsD&+4G{_&6r!-8)aBWO*`Y$VI5)Iq-{rZPs-WQ(onUW1q^NrrP-xIZm4o~rJ7q9I#?RIw2~`NZxIy8 z&w_u#9blqVoEv7sCWDfc5)@qmw3uDU32OG>c2vtCmdIvlli%f+1z5bTwTZ&tK+lm zo-t@OqnliV?eivs`q?KkS1v6rD)<_M1{ofcIvcspp!IUdE3e{7$xG%_4LXgL;Yu}I zU8?Y4XBc!QtKv#!yT93>v*{eDXYlmZ+*F}j z4Z4^;lkgn%%pBV;F=(7^aoEPx46*vH22IdrL5)!JWE5rCTbB)~1JCd+25q(B+jZ<& zzull6tdD|bD~F$zml`z9${3Uv$`!!cw;6O9Ya`HZN6cBb+n~2Qw0a$|{v8Irll5s} z-3Q`8ur+JYKDHXL%15#dvj*jCx}7@4>@a80JnQ*}cE~WZ_Hu&`ur}dnZJq^#id0gT z5l^tY?CJ3hcYv-is7w{i#(cIiKT?{-`oN|gkJAzzjL?+^T}4+f+v946F((JJg{9n< z{en*MTOOWepkvaE?C~yx-c9cj)Ul8~kQ*r#XR_6u`6|XOV%-+26(PF4WO4x=&GbLf z9DnTNBlMHMvHSJzBux~d_X%p1=`dd!+JStKE#$As?kgZ_DNYaB!gQ`&$(M?kj*kiw zo3I}2xt->4g%AV&PavzQU?(T?#oXl5!oFO2N)a{7oG_gQ8;G?sSe?&fl?+bQoxO*V z6)Gw#v>X-Ffoa_E=3I5YG`lrh#vZBSwz0F};O^{YX-CfhJ2J}N&{(+W$!(0i0#R*V zEKdeuduq7esK__ayW5j+8t%%;q9HO##H+ga}A4<6_Wejy=bp( zpRLHxC9r+HhnUW^n8#9eK3B#waS$?mCPt-3ifO5I&ls78m3g_+kU)Ln;AR!Z?Mt(J zoHi-Dt4K%yQj0uAajq$VtB6a0JW(<0%4+wdNgb`2P-U~bF-0tc71yM)qepaNXOHM8 zTBN7@m}=Tv6-TYQNrL6`DqK?GJQ_8iebhRS=qef|2XYmTUFSLMZqj2^Bc#*_3ZMs- zAn$RkL0(k?t7zuH=Io;0eW9(}$2V`p3K_>4TFzCL3MjG~WcU*q_c=NA(To$(SjG)r zEaS#0oY7H5B7H3z0K8OqN5>m!nfNW9Y%NAw5Y*Eb178Sf~QMk(% zwYqFkn#&e-xNK2-%NEtPY*Ap#7FD%uQAVR(g?qqD4}L#{-Vj=WHniqp68B5khw;m1 zq6B>ezlH+PN9kke39gp$yWIIfirfcdfL!M`UuRUmKF*0+=T2W|)WSZ_>00MrUuP7| zKF+PR&KX~46xKe@9ktE_zRsw>eVjXMo!9$1qfqy8URmpWhOaYTPkfyFYMsyVb;hfJ zkMpWp=MBEjc=_>hKBde^eTIXqBXT16NIG`%F}UP?Yo97@%>#eWg?)l138l0$j2HymrkII#+ffY?xe&A1k=-8EQ0xPgD938SBj85xUSuj9MW;My;?JVodmH zYCc2>Gh~K6pfM`~(3ll9BMgdaP{fRSK%1->K%1<%8DmgfgJNdf1DdoN0h+W7vynlD z20`+Gwpj^)wpmSPfM>U`s7HfVnmry+ z!RiI5VD*{34C>RMUbD{z1rOuIYw*;pvfvdHYLVIJV_=-_qR(Mfwgt|lyHNxOC=*ys zpNFo2)&zR#3y^{|76{N6A%*a9^A-9Mq%al4OY~((5h{!4=_`<;bdz|5?tv7e+r$HO z2vVGmh@0uFkQ(W6aXozvl0h$uB7GfF0&g7i^bJT&{Ps+TAtgmvjLIJ- zi$T#t_d;qGo9H#V4^oTRO8=t!A+?GUy+98@Y7bR9hmsZ+d+PqvRh>JtCJr`|^)bq5;o@%u4ID+4jqdf$Q66X?gxJr1ci zu%5c;yO8>b|Kf5lof?V0LQN5hzDn&83gBN`R#KXf9JN={Hs!69G^HF9Ql|1MSZQfO zw$xr}Y3lY(5!fIyXgbOb;#PWso5dfNR9Mw{QeY|A=>d7 z;b)K%;xzoF<>!!^ki0h2FCZnw9Gy%q_ zZqw}tSkXoy8(?FC%T*c{_P|_ZtyY60%fT+*$Dm!JN4dCO{xw{F zqBVK4K63ZYPryMBk*a$Lca#(J(F3JVWFU8}6L!Qo{f1 zz@HR1@)3t?6Rt^I+i*?c+KFoyu2EcjaE;;Gi)#kgeq4E6g-59R7+pgsZTwDN^__B~ gos;P|67^eTP(n@>^gCQH(o5*YA-#-@`ZqHF3l!`-2LJ#7 diff --git a/training-system/target/classes/com/sino/training/module/training/controller/TrainingPlanController.class b/training-system/target/classes/com/sino/training/module/training/controller/TrainingPlanController.class deleted file mode 100644 index 082a3f6717bfaf65781c53f1ba41e9802d16b4a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6806 zcmcgw>wDYO8UG#UVv?wJN!OI?fI=ZnQUnxeN7@vc^b&BIG)Xg{?4sDJqr|pcNlwVR zZi7NGTj>o}C>?79w9mefcF#jcQ+VL}_HWEi_{4v(XYY|@S(4?(Nj5&nJ~}$*eShco zUZsEj=hn9XcHn9QLZ}I&RzMx<8M{yXBhK7uk zkU2n|VZ5~pY;i;N;5v|%wdtPW{?1JSn+aS>O^ceWXOo6FK&l4KVP_*&BNE0M0e7OA z;nDI_c(+>H7{Yos7L#=XyS+6!E=@`zK~ISNqvLYSr~-nmo|E_!0qfAhuqq)NoPZwL zkd!3DUbo<=nob0Y_4~u5mz9xz(@=K_xEuE{G{!VpGEANsdY419#c=7wCNO@C`vlyN zpOT7fChn+sZrLhExMd#XW_gIAt#xsux)^;}z$4g5P~vh@E}nL6Ih`XM_hSND`QoNb zb~LHzW84IMzD+B+R15Y*^QsmCxA}08+*doD_|dbmz3QCq%qt{w#sl{d?~F?CFOX667ZHq zX(^+L9CkNe5)efn8Ik7;``iPv7L(Hk!!wHtbz8odyfYzdmY|U_ZIpMv8L~X}3>FZYGq%RUx((?XnYE;&SrO_nKG)L8# zlpK*Xh2PtgwZ@o2nR$0WA@F+@kF(pBPYQ=Sj@YGzl6@5-D;6dqwof+3)cAm;Nhxv$ zjX*XGDT%aXWHma>zkU=tgU;YBa;5qhwAN2ydBy4K>>}Fk9?YfB_>j zPxF`N7G}R#n4QVz&M`b4RkehuXEf@O4s&*=RBb|>l1If+B^`Ik7WYzmk}?@uN3!cC zrDT?vuM;hYu8-TrmkL)Y2r3p|FKv#uh7`)NYy1Kjjx1Z~a_vBzEu8u)fBL+et%Yk> z3&-E)hd!#rk1=fU8p`obkHwy?n&1J+7%K)OQCx4e91PNOyt}%F&SAcWf{$VAGNP0# zV$lEJ7`OYqf=5boK6f$y^)0uJD3e!DxJuR9aq0WL)*PPBcth_VLNFm|h9r{jE7Yn{ zM2aJPNJy$zIw(_C)Qw$ge3~2CYWjX;0!LH=Z4y|x_+{bzbuWR{r-Xs5i$6*MyihYl zR}ihG+)=`q&t3lh!slL$TdOv5kBO>e=CIwaa_>2PHh=TDSMVw`wnb-A4Rx`!bpGr2 z3!hx_E^V-unhV0IV%JxnwR^?X?b=l8x%dl}6@RvGJ8fZ=Nz3W#tg_K&C9Fd3?EJ@X zxsm2`A1=)N?T2r2`7f^K&wlj7H}6t6BBrP=2o~yMzgf>aLf+<1tiXch&2>QCb3vz< zluE#@eCq`+5ODFR1(Z_oi)Bdtc_OGqu26oOCW=iaC*igKnP_+Ja@_in!sT}sX0Oll zntXyR^Y6LK`Pq|&+!^nAH@nX(IsnC^&agLrOr!&uT{69bxSCsr{<1SvONSeCvD@Vt z<1xD|nt&I+yO_Uqb^gM))L#^?ec(mD&VxK-H{1+wR8uM_hWOVO&xZ>89i_91B30ZT z@J`Xm+wjIAHA{{E9)-8U_XdCed7S4WhSo(oE<;M_;;_V)c{q593$O}WBZ+BKtHw(f!MkT+s+EuDj4ziek1+?ZxAb% z6O|e9&5D2?4Ft5C0PR^JpyOo7BA~bYUiEfGK$`*qMF~*f3IUyP0eZ&|C`UP=#&q*O z+nv_kM8`kyRMZarZ5)>?^ewL%LYUG;Dg4*j;UA{(f7c8@E9U>`H`kwBF?W)9de0%` zWx`QIZq{Py?=$sx%wc;?5P(++z#$XBgVru5|Fqzg2_TG!2_;m_M5jo&h3d2))fpG6 zvwn*9;hde85|kcmNy>T);(mhoe0#^{IrP+eLvOW-Ng|A+SW9`16V+yIb#Sh?aq^V- zJ|Pa#>NO_f8WV9th!%hz6;XfSNBw7)Vb7bWSA~dDD}PzPAKs2$!aj!=1L;)=%=mKY z{m2jWf{Wgd{qzpvBAuNlTJC||10ro-VSiiu4Y0P38+iWjH03Tk_qlLI96BRrLE~j9 sVwN<^>_lQ6vAT<{5dLBc`ou)Xz2>hpcS*-(%;@+OpV8CLoyfiNUns@oX8-^I diff --git a/training-system/target/classes/com/sino/training/module/training/dto/TrainingPlanDTO$PlanExamDTO.class b/training-system/target/classes/com/sino/training/module/training/dto/TrainingPlanDTO$PlanExamDTO.class deleted file mode 100644 index 0a4220871dd443b96b7468148164c84d8a8340ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3031 zcmbtWZF3V<6n<{9o86{cT2fkwq816-HZAcDm87jep%P4AB&8^zvQ2i{&~3KtZV>zr ze0Tf-@`VpNqd3C{N59~Vze&XB?rxGz$vBKoo4xm*`BZ8o(dHTrpI=|i$??KnbC+}4w>T@;d3L3Hc*SXMmE>Uu3=CsL zKzFU%t%hq6HyXp8a~#_;n*lUqU=)W020X|0SKYeh_F~IT-`cX=QkrJR4IIW1nyt~3 z+bz=;7@LgQ4TCRDU6bIK47`k^G`wZ`(rxK%W^yV958RcheAU2f(r$|0nzkpkj~RF! z#{~wdeYq3FSdV@?42eHs;0?SfU=UyJM$)U$jU|C81JlSemTlA9UUceKKvg+If@ck! zL_y&2uDN3^I?bBtUv2mVH9g;K`kuh0c+^1{v9Q{1#YF9c1AtoSJEGm;@6T2^D|4LEjcD|GT_OvK+ds zjXoFc)CLQ0+48rY`kLvQyOwXcJbI8yU9!gGYVD**O@pu)M?JVsric>`D<+o3sJsMJ z$KRH9Iw&K~wQqtENIT1+V6%Gx4usn=K>&!A{cwngNrtMvS=(7Q_o5W5YnRK*7wB1; z#p+sK%jQ+rI!6xVy4KUVm>u1BLb^$HPYFjwAds#)Ew^SZH6-tc_FesxvOHL-E0*V9 zbUa_fy1=RbL^F9K6~4#LvlkNR4X1E5jnDA8hHJ9&uM6b5J*CmS#O_$ zKBRxr?IOnn$JBKGXK4L{9uE;w&@v%1n*yh)r;<&kRM1eVpUI&YH7SYdm<$(l{6OgA z<-r#Hl) zmDxWqm{p$O-~$-5S>+L4X(J|zDj^faR92Ok)DvVLU?{6*Q!!Aks1cMa>RC;K^a!M7 z^)^U(NQaWKx(SQ!M(AiK|MyvpA2G5q+{GCdVgfldaF((p-^4YX<4nQFSi&M_Dwc^l z&shpKZ^Z@9G`K9?CC+r>fIJLM{|g5+=ua`OA;EuLJjIc4IuM_>X9N zl79eg_7Ns;O8G=lksDbh+R-IB;a0Aw23zDMP|~w%uywS5su#ioBM+0fjEgAK9TjW1 z#90Dqe8NAO>f>~>!kI!k4l~Iz)iRl1BlU~|g~=3x34{>O2=A^FQZNR!4QOMOUQq-~ z#b90Jeks9pa|Nqm?l8v_W!uWgw8<3lmwSvEV1I{*H?~X^xWaHHfuAw~a;)MCN1YZo W_`88GrDe)>?tI1SyopWJk^Kk4sch^3 diff --git a/training-system/target/classes/com/sino/training/module/training/dto/TrainingPlanDTO$PlanKnowledgeDTO.class b/training-system/target/classes/com/sino/training/module/training/dto/TrainingPlanDTO$PlanKnowledgeDTO.class deleted file mode 100644 index 76e8430d8e021e5bd7d3f99e45b9adda610a5c81..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3086 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 E0OYq3BLDyZ diff --git a/training-system/target/classes/com/sino/training/module/training/dto/TrainingPlanDTO.class b/training-system/target/classes/com/sino/training/module/training/dto/TrainingPlanDTO.class deleted file mode 100644 index a4273058f73e431086c18ec02816b9fe0d7527ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7540 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 Hb;|w^Hqw{9 diff --git a/training-system/target/classes/com/sino/training/module/training/dto/TrainingPlanQueryDTO.class b/training-system/target/classes/com/sino/training/module/training/dto/TrainingPlanQueryDTO.class deleted file mode 100644 index c5486e3bc005e9a2e42edb04b26663485e2b6800..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2871 zcmbVOZF3V<6n<{AZ%H>a4J{C@h+3d+S|Yxav=u2-D(MTf6a;+PCOd6tvRkto7-szB zpTO}4$QM4~jKT~b9Q}eb{w5KhySqs@ZFCr??e4kfKIhzXpYzAWjF5$Xw#hbX9W^tEE)vU>JSt~CYK#xTz5+k#yJWYA7^NixUiGlweN;W1%%tJ(1=q3)%CaRrof=w-DtN+v%%aR zrx^e{vQLMY&bU9ArcNkesy>`;57Vryvb|{SM3ky4R~8m8u(|~{v}t>-x-XF4v!F5B zNv@B!Go@DDRCxX2j&NcyHx6q;f`#vrP+*V>jpOmgm`?j++9<_fgVo zr#ik6IQrjEb~dDiTpK)+K!Q)+ytMk{-59)i@A2Ia3KANh?{HM$Tkx$;Jc0NrfW6D7 zoCe|V1w9*@?#(;@=VejXcHcz+MXDozHeU&yPa5Uoppbl9}%3Cw_#g zJk0+N;|HjThxy-NEKV}-TfuN5{{$yPi_0xd@=;W#{y=|Dd4|CUFsE|LV@$LWLq(O4 zp`w;kB}RLO>;t58YEFxRMv6K?BSj;pOOO$P^qkQKDGym%BBsT3pom*x$(^3w$1FZ3 zA;b6%XDM!e%22~6^d*R|;2bRlmobkyS}Lv)b)J@nJ3MC>XzBQtdY-3c;8U(SiL`F~ zg#$W_{@=p5sVpCgWyXOS9~fBEQa&md>ywDNj|BDt8h;RpCxTb*i16sH{xx zBvR+upzr)B(?!9H(@dc;(e+Gen&*6KM)rPbBvaaAD~wG30raWIIQ_Ns4;2+TkyD}> zLpCU!8Y!y56nhf{896nW8tF~#- T)PbM^KIbS!>jrM&OXU6m-s3;q diff --git a/training-system/target/classes/com/sino/training/module/training/entity/PlanExam.class b/training-system/target/classes/com/sino/training/module/training/entity/PlanExam.class deleted file mode 100644 index 719d4ee3bd29c97217ecc0d6a8d7af900d57533c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3463 zcmb7G-*XdH6#j0T&2G}|4+<>=D@9whKMB8)gd$LjMA}kXED9)Wlcimn?3Ue4M`nCi zUwn4-$rn50@SrmaGYsSC3(ojAiTK^!Y_chl!I|vdbI<+G*>lc!?!EczpU1xen8Lj@ z+R&~dp+iAZV5I0&vYur-S>H7*+p<@))KnZhyJC1|_B>xRwr~0O1(K(^?w=889~oUv zK|@MKT1N+Tfx|DlsW_!-*=)Eq12@@)vSH7BW>n~JgJPj1&@+42*fg@7t!8H(do?ee zcj@Sso|7iQg_2b5(9w&X0-9^yt6Hu})15KX^Nv$C4Lh*z)6tLJ0x8dN{mX92bepjS z+c#HDH=m~4jE=o{jo4Mwm(j_PdPhcMo`awy^mQHkBB)HFP?FmHI^MvW0v&X)SP!kQ z$wd^L#1HE@fVTv6;+GonH5)_`_L8;{9itc%*j+K!&1uIj8vZrQU!&ythV6R-*GIO8 z`;vJSOAHcyEuQs~@3I|&5>4os#6ecRNb>Ggjj}*r{EL@Y?wUnEKYCqu*C8E;B{<1a z7-cVwqd27E7K~#*+)!A6;hrbEd!MlokxvsF=R#@>9|% zYy{Fzxj}z_+(lGz=|v|j#(ER3P6Kh8?}Q8p>}qPI8ZQFEk#*Q!RHmXh{+jIg4q1=k zXq)MQwmuCP!`;QG!o_IX8CW*p1JxjeLyZ8uc+vli}6-8)ggmjTk=KsWDZ}#k5f_FIm2s*Kk+hcvRhy zuzjY)#Qu;UDMkE9xz5j&7-hW*wr#r8WyAAKPX$YM;DvIu%2EZJdEd*SY@4toJZ?1} z9YBI_-anMuyV0pgfvV@-ITMq%eD$j5x z@01qCJ=={3TN?9%X<@u;yYX;K<9BhE z$;q5^9A%-CW8=Rw@}(2jQu36CIhvQ|#D+KAA~8#E}RwkW&a5$R#t1#3Y}hcMF{vC6kPS26HMwgE=juN|06q zsTnN>8p@>z8p@?JDG5r~K&ebR0wo?W{`S}=>I%AXBh0JbPft+52drElws48NvW+$P z8ne{3;~2ig9Hj)VU>)<66kOwRe3?=bo1}Arl8Vn+{VS9-e80J=I|MY>yjQhcllD6z_U9d^Y#MgpVnD|rb_par$Mr9} zCDU!i7Hr>KHQjuYZqqvU;5A}bO<%?-Uup)~YETcepIsc)F@|x0T@_>9oObM@;a{`-HAAKhyJSaDr%4@CIKc834SVKZ)hG)LM89}><*r%u^JCW~ z*$(P>M}p%lg;DmBIE;fTj;OoO2QPo^b8|Ctn z<(qj8cLmP0)Oj={*C{c%uThLbNiOR>lX9bHr^FZspkUjkJ6$$B&-7GO1oppBn0EQ9 zAm8`C97;Zg#o^hk@tgr-eDdz1)FCgK;LS@Vc=N{KyBlmR;(X?~%JMDvR>mJe{2ajY ze9CPJJ;|pY0(i}y=1R!RgwIyvU!eZP%?>n;2ih9*dTC?az1?_ETVq~8ZH!afjfdMB z^EPT@ymPy8rmgWAoMmz{=N#X%(DCt!U!k_I*kFjLRZLb>wnX3@?G&CHUoW^_YqD;N2OG%W5%l^RS3@)^Dx${+BO3pQ04hAmY$3?1SEzgp!l4pbC z53!rSA^wK>8+nYkf$g1%vT?A%M&80@I8lfiBb|*8OJfCRPAr{sL&G6FsR}%|1|LoyF)SYA7Y*61$H|o|D_81gAtqsnlfIs|CiYoF)d_@;39eJtzNuFQto??%8&kv>Y zYiy^Mn%IIm^$;g+OZ`wTCO6Wt+Kwih9BvKglwgbf4UDw3Qr{ZM#e=PQV~bs<)lmCJ zT@1si#ovhye28TRtFaZ=D0T2iy@QXKQzuWOIebhh#_SH^Iwb`+IW0FR#e)X?2<Cf2H|!Qv5E6S-Ym1FNmzCce!EO_;^aprfDQQ@*>H c^DX{vdoZv&GMxG1)%89ga7~l diff --git a/training-system/target/classes/com/sino/training/module/training/entity/PlanProgress.class b/training-system/target/classes/com/sino/training/module/training/entity/PlanProgress.class deleted file mode 100644 index c4127b35f0b33c301d7d6750de6a72280b71da50..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4085 zcmbVO-*X$)75=WR)vn}qEZaCnjYA;VsedF~6~Ud@ct;({=pV?SnST_=um5f|J--Dy7OM6OiTiu~}5 zjpKNTAJ}yx8H3#P#QcKxiFn%*`ml{hQs_(Z&ZYEG8?#b+gbrTpZ(gcS+4w5vxgn}n z`um?6aGypX4Hj)I;k3Y*W}t#NmfB>7aTXO5U$gObJjRswGrkpdSa|{Sz-e~f%Wnvr zn%5$`ymQ^HM>RcIWl@_TsUElS1imRS-E#KbmB6n%(aT=6$5|LTe#9z!y0bV2#bHk3@%`lSYb@WFqGp6UjdcH2xjc zou*}we#bPNqTNga&0w80u%aNP*aIm+lYd2Dw)R4*KI~TY`yK9v*}*#*?~P3XSJ`7_7>_R#jT**sk@gvNwIOgub!28 zWJ9~sWzTK7+g|9AcNcs=h@8mdxfH0xwA*olme&ZnmDbH2YQlE28&;eit`cv5gXAII zjJP+DR8i-eEW@>SuZx#Rjws{>(pH2E$MT4Z=;FY{4cQ%jC@|Zvt>+&E`)){gAw@IUADKYCQ5TjYr;{@yL6T;}}?Ob>HBpl&p^**Id*v!FHt1R^E?lRHmp+EIewwbIjF*c`AEKsa{QAae zzN)!1f5%8UcNgQgV4o@H?%?SZaiVGva-y0q8xoVhi-}tpEgR*$20B?a2|8J|%BBQa z3CJv48fdOsAZV^yEEgoGn1Bl9q6S*1ju5m^waX(CWG5ibQc&(TgB;cxKq)>9zfi&V z==>SB@iMbKg-`JcJIWBw;sbn_vSB=q-{V!za^%gg@fv3apLg&*zVkT1KEBVHiMQb5 z2b@{>4eNG|vjTpLXYo2`MSRSr=x{cIyEuj&&TQ1Vw`EM4*1vJYgjM()M@>A#e@lFh z2i3Ij< zf6;|SN53l7&apLLI8UA&+n6cU_DBhL);%VDt85(&nTTf0mlk}EBTQSsryb%=bSSX6 T2>IN^kGU#x_7;AMpQHR=KFmk| diff --git a/training-system/target/classes/com/sino/training/module/training/entity/PlanTarget.class b/training-system/target/classes/com/sino/training/module/training/entity/PlanTarget.class deleted file mode 100644 index 29a8a1643f9460b255fc6d1e06c8f866e7100b7d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3133 zcma)8U2_vv7=BKZ&2H08TM8|Wph7K}Hf>kFR1yk8Z6Vs0LQ6qFVVkV&(qy-0H+7it z%0GeQ50D!!bVkA9!qFR?@i&S1oZU^bEkT*do{#rD?{nU-b58#H=jm?%rg1NgE+kYW zbtp&)qSZ5tD_J7 z0%<>huiW3V1oHDQ?-UtqIgOfUgxnGwkPPV9D-F~_l2Rp2=0P1p*e}pcE2KTrgn``H zZX+Z#tK$tE5XcbPrWTka{PitK<4wG!;%yy=aG374yBp^rNR`T&Xg^G#}ORE^-37>u(wUAQSLZ%T(D!6{23y)=$tO2zRV zAqf>E`lOCic%Rf8rbp{5%s*?dB(+WoBtuExyzN+vjoO-3UoqFJ#0<>4WwW|!)@?bD zgh_wHrsJnNWbJ<|wa8NO+NH8L?p_$0ReG>s`5SI!$*h|-%eU&>EJLMu(M;t!?Eb3i z9V2H?i$IpB=DW>u*|(!wql5_vS9;&Bt|;~bitBG!brQ-bj5d#*9!Oi$Ot9EIC<49V za$C?B1BA!1KMn~+nPuNBZ!VZyQQ(!OtEGim+E!xP>z3E3^5m^E+V{qk^iLprwZR*uX06(u%`~5P9M?B}n>8+A1aV$7-I`r-8%FK^8dton zYQrMAAR=gcVu|(gjO-F7hKo(csXu``Stoz_&kj-a7V>mdCq9c zXglJzv+ZtLMwpTC=*^jB->vfk{VrZN5ilgZWIC0q<&Dm}?q*}F7|URk+L&aAVsOvJ z79;qrn5cRFVxov*#;jJCZQm+tC<{!rBb*BhWLiud3d10`Y0pZPX)z|CmmJ5c&s0s% zvpf~Nx{kaQhfeOP*bsQ@zo9IZFcvt>d#;OjT7oT~8jiZ;vk>&W+1dAi=|hU`hnyMg z1$$-u3B*qU>@-`s4D_PFRu2Iv;tXd(z6ES|D*p`iM=o}utvu9GnXf|!<;-s7109ul zdv{RYvs?L4N9AdprG3)u0(%*w)Oh|EsGXf23K5ahG9WUV0_Uiw@M2&{1wO+0PL!F~ zrId+jQHGNXovqySx|A}_znMxgX~70;s~%iit*$R zwvx~1D0ErOugZ%gpP?C@Ge?a>lO5#!ecW4U}KO(eB9m3JsTgRupb|7((6XuoX%R@xYE4k` z5lu_P%CRpfirb;dt+YPCEan)KL41pgtZzQKuyKj91Wuxi5=Ti~VfzU`1=pGLPdQ3q zn@4S)BNgAUq!&2Su*f|pkWsb2(W^r1evTm($N1C4a}0;W?)b1-PP0r@QvNT9%IP#s zk`=1Rph{2T2P^a>EKsH8i9-9OCsBc33{ua(0~9g!;utAXB)ZXGJj0`YVp^8K;=%sn z22-K+=O03ye2fq7O8H13DHpQIXho9=3YUfpO0dM-1WH;~36>6a4)@t`&&bFGuHiD4 zXpzSD3coI77|yFSJb|M)j%ALLJXHI!!jTdL^lPME@K0ru0TqHVgb*(XZ_m4=U=T_Z z(8MHniXvDl25TdCO9`eS*Mi8eGV9^Bd4r~Z=HVu8QJ`^ho8KBLoTWLku+HMi{tLc> Bm3IID diff --git a/training-system/target/classes/com/sino/training/module/training/entity/TrainingPlan.class b/training-system/target/classes/com/sino/training/module/training/entity/TrainingPlan.class deleted file mode 100644 index 520adf8456cfda9d76dc5ef13154a9716dfa8699..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5103 zcmbVQTXP&o75+xr-I*PYq?K$-9&G0#WJS_SUJ@q`j4XjI%S1tvg{3GV0g}<~SXyg$ zM%kG)m|M6cTmpm;t_4+8@q%AW0ae(hQWTX`QKpJ#o_ObpAHWMHeBCoUJ6exjs#IyW zPxtxG*WKrwKHaOo|L^U;0GP$kbabIxMaDoDIR)couU_)2u2%{gcGa!ATP2RvJ-4)J z`%dXBzZTq}8eCP7J57Bsr=WX$Vj~X?c@?^W9vBLqxSOW#Rhl)YP3uUS(t0$_YRz^P zWJz6f6bvq1wy)SFj%}6Jf(Dl{BWCC`&@bqFDvn=nRCj}_=Zf(G1A{oAAnyluBRFRV zq&O5(1l77zTJp+vO$eo1U@O@ieD9y0K-m@HpzICkJQ7ArcJ@IeEkIIck3 za)R~H4F|_35(|hNA+V1a7#G++V$ZdGAyktFikRX~sN$S0cMP|vIvk?o1WGDCWZ+Re z#tnD+oo>2f*P70SOA5xu6RWwfdD$rkGxu2F;|87(tI)ZMh0x7naZeifFg~K7U#>gp z>A}|eWXz?ng~5!0)0m~J!re%BPZPR-hYOaE8u*x)R`_JT-)4eFHRuyEzk^ZHs z>#Q{En@(fh-VBecIA9xgqbmB*U?$kE(t%H=#A+Y4V1|qESe0{V^90>-U1BruhIC53TIS_0*kx{ZTMI}!%MGqvM90rI+`H)^_=85r? z&EBgLh#AG&;)LXm125d10>#@~1*4#{M0&xt(@-!V+&j9rTn$QH$6%iX#-)Zk3sH#? zT|%PT+Y_pzULl$$uD6`IHA`YFoP>v_Rd1q65+jCWifXQc-jF5k_eeGI(vwE0ZFPIs z0=vAkZ0|<7m0i8KxV%6wEi$tkj^C^WWbD|uKAPBKZZz7EK~!Sl`eRCGRAW9sQj80o#v`f5d^e;RAM7-KB-NO& zixlJGPUERmW4<&}jE{60KbmUH2S$qVgPq2wQjI@_=NS_bDvPbio7`ma2GsOG4~2** z&>{&$hADV~c3HlTnGXs+ole=iUrLdzF=fA`{0u&uw#veODMjALl!KD;#dOMp`=t~| zD5e~elrOIla!V8RX(_1N>L+X%7-PT6Cc@U zSaw8RC{EtQ2tQ-|O#BJcY)*#FDT-Do&b^H@KxdvNOG+^=DSS$Xj_6urJHRSaEKdFg z+06CgyU>1tZ1?rzJJ6P=NWUPvlf_$D45gbmwKByoD>MB!^q8637`O&w+RWU zWeJ(Ha%NUwa@wFGF)$`dqZ>1JMl^azwU^#o|b z>LF;tGRz(UG9nPA1n8vIOVCNH&+HYTz6jK7_9Z};)lZOR70iACDny`uv(N%%t}`Ot ziNZS|OTqQfjjhA16mbb#jNTz-2-~dWUHpM|2UU)B<8k~4mnmiVO8+NzC}nB)57a2- za0NF|r=;Rb_#IqI8h(j4;Ze%t*LWSflytm9%ai({&cmnFi+}T{Qb4Is z(RqnADfKG_93lG_v+Q%+!*eiI?Z4<#q2=#jNX0V$H02HshhqNyimd{6i4$eSZ=C4R ziNY#sVpb%X@M7}%3cVPXMBxo__Yq3p2`@$^aa$e`{v<7wUys z=Ig1IqlKAmrlwXXUV}P)6KgMt@i{9a6lNyUXd+=l)rggqs%)&vwp3$QPO5UTiWwYQ zO<1Z_F?r=wOyid7q@_uf7OR-jp_OIjrHa`cS>>hbXnI;*3ilT|q#N(z^SH|0Yxpz1 zK&gwNzJ)K+N!=L3ub46-tk zt$w~u35QeLxW=vENJoy41t)qugK|xO=5d+?9CdJsHm!TI)Ud@9K;6sU(8E`uY z9=fY*`>C(`?fvBy050I5fRTc;##@Zqc}#({)2>D97uoPPpSq3%-Wzf^E3$XJTfnx0 z!zDcvO1#Bcz2qhpFjjyY$(p>?3!l-hYf3tHCPzsGMmxw|Q{+KP!DOymM=1wZu® zmeoH6&-;eIq1Yvz)}K)2WvO5~_c=6ttBuTY^pp2=GnInlhb)bjA9d8V;Vb8S5OHKnZ42GQo9a=zQ2^V0A4=@D@7Hk*qd%bHE!z?$Y^3!)?b` zL#=>K1^WwnAQZ8~>w3XWDqyStSKOMs)veEHmo+6Fdy}IGfzhs+=M+Cs3MO;iIZ8RO zf~V>yw5%}N6?5P&CDyS6HL6JNli^8l-Y9z3mBTJS!*9o8wEWXX?E@X0**06vsB-5&e{ z!9y}hX7Vv#^7j7n3ILaIRKUnU*?5aloW~SMoVXUPU*?X#?5XcL;H)Dz3%(5;qv8poPH1o!~u>y1(X diff --git a/training-system/target/classes/com/sino/training/module/training/mapper/PlanTargetMapper.class b/training-system/target/classes/com/sino/training/module/training/mapper/PlanTargetMapper.class deleted file mode 100644 index d772aa0095467af42729b2b6afa92c59b4d86720..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 435 zcmb7>zfJ=&491-TJz79wVc-QA@r(|TU|>1~qKMshwGLO81<b?Pqg~dNB=%j7Dg;KmHoT?CYbyhjnY4~l4s77P z+BPk#e;Qs64S!>?OOlowSmkwTU^??TG<+wWPI9u%e7>5@!0A)gX3H-UrSAB~IiD2K xyJ+C7@}WiQsd;6TfgI`g0;0LQ*ih=+D diff --git a/training-system/target/classes/com/sino/training/module/training/mapper/TrainingPlanMapper.class b/training-system/target/classes/com/sino/training/module/training/mapper/TrainingPlanMapper.class deleted file mode 100644 index b46ea04abc804957c96d27c16b59c3f18a38e7a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 441 zcmb7>%}N6?5P&CDyS6HL6JNli^8l-Y9z3lmR=m${hjq#(S@I(kd@>I{fDa{3w}O8l zct|FhNj~OFUf-Ty0N@n%3K$tE8*ed+^OypO6W5~k^W5>5J@q{Yy!)u%bmXpvQ~{d? z_80U>sJRxe>jgKdfUyBwVQcbM=02lc)|4dnU5;7^jCPH@pvY^Kfyqo-M=1w3@KpVT zmeoIjC&Pum#n>fD%Wq=kS!rN8^EotpDV_Fm@Z0-%)t!OE+pGY~_Y$S<_}n?4RMWd? v;HdJUMe3<}V3ffg>GJ@ttxJ6=0~r&Nsx diff --git a/training-system/target/classes/com/sino/training/module/training/service/PlanProgressService.class b/training-system/target/classes/com/sino/training/module/training/service/PlanProgressService.class deleted file mode 100644 index e8c78fba1ac7d19d3bc1d4cb30e7e714390a2095..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 548 zcmbVJ%TB{E5FEE5p@GuJiBF&xazLD_o{*3#f{0X!12>bb+?2$w?4c4Sw1N>NfsomitR zIXBzX0(b)bg}~ns=3J$ zX=TZJ)(QAao;A$`&fa$F4f1O?+8l<8s-4e-Y)YCP-5#Aj`ekRTD^g^~0^wY`n55Oj z%Kv!6i$IV4Y$fhY-Ixhyrer0hjtQ`|WZsr)00PXrPQ5lO@CTAN?%3xUHd%Q)QhYfnWcvtuISP zSk!oWfBcJn_bX4c8I$!Y9+Oo%5%|8>tF-QAX}naP)!YJsjs)7FA!TPi37o8>N8!*y zPXZ6vPNsL0Xik5)HvI)NMU=3cUJ8Mox(J-onYhbD=T}8elhUa8>o90ful<70!sq(l zLQ!XRB72<5sy7^;_!HJ=xH9`6tu5-8rf#vR1@PC_vs#@sZJyWRAtpSrAEG_XoC)ch zPWaI8F1f=8-oAza+s5w#(Bdn-fd&FJd9}e8$b?HTkG t&laH_Jg=Z)}|c{6Xg@>{$sIa>kVbI6AUKFqrP_y^p+ZJPi9 diff --git a/training-system/target/classes/com/sino/training/module/training/service/impl/PlanProgressServiceImpl.class b/training-system/target/classes/com/sino/training/module/training/service/impl/PlanProgressServiceImpl.class deleted file mode 100644 index a0ae16102a388908c2719f6e9973b4a8cb30baea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6810 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 Rtv6Gqf^D*TS~qPNvP>4pFR diff --git a/training-system/target/classes/com/sino/training/module/training/service/impl/TrainingPlanServiceImpl.class b/training-system/target/classes/com/sino/training/module/training/service/impl/TrainingPlanServiceImpl.class deleted file mode 100644 index 77ac036bfe82656ec4cd866c89d8b921f1305f00..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31201 zcmd^o34B!5_5V5dPVy#`mk`!6;sP2e1TacfGzhXJNCX113NAP#14Jg7kW5glYsCeZ zx-TGV-HLVJ7&fg-D_X6#6;Lone13k+y!+n0 z_q=n@e(t^R^3pdOeojOq0{J0Qq%8{Alt=kY6}9n(@|OC>czL2ZQr}qLxS+ftUe_9n zrtj+#@$%_z<&;>Y@r2fB^U})clbP}p@hOo7QKpdt22K<}^CIzv`nq^)dBf6qkwkq< zQ>?Y6JbGp#+SpPbZ!E{{g8Igm@}>wbsK+DeKir}q)99Q4YU9n(^4fS~UA=T^DPJrI zluwK_%&UtSWM(x-nwp}`A+jiBQz6+v?HCLuF_K9S7&ueLTx?SpDq#vOh$bdPm!1)C zu4C!}yiboTiIihl3(BV@nlb+2A?ilmE$U%YPwK_gr?#03Wom3nR_bqQJGWHadLZoNge0Z=1rj4^tk{jV)yw-Vxc%%jC6- z>J#NHtxZkw=0y3lajlKDLIq%H(Y`kANBc7cV)cu_g`@nhpFHpMXl-J+4Hji0a8EvU$>hA~N5vhjJQ5GF-Qw0rY8rOa( zZPlkG+PtK`HdHJ*co&H)d+$OuG3G!dzbBqHV2MsxPi+NU(G zjtuWWQM0|kq7kl<*gM^}=vb!iM#qfejBaj@ES*^2k_gdA3Wewx8e`K~s&o`{Y7{us zwfJPtbdvVN3uzo3XVG|@s_A&9;xtUDW(w9PqRo*+yqT$&C$Xk?wfh_pCekE}YHXTJ zQ}B*71g{C?ZDFLP1{TX0jycj}s!h{qIyls59%q^iS5PdP$#le?WdRyhpIDk91tA(n zC)zZd=0GCBuO-pu#Ps+~Sl75C3z^d0R=To496l$TTD0xBB-5zRoNNeuvQ4MZsTh2u z4w~OHn@-FL(PQT0q= z$Q*RK`|uz^3wmz7ef^Gy9^CQJ9a}HGcFVdew?26D)>Ze0sGbtyBwOKfvq@M^pgz)g z<`KKV%x3lT4881oWqT2F&4Dr#wC$gZ*_B-+jb%sOu854m1l84D}p1 z)X|lbs%t`Y9-VK|1vdRioY3HJgN!2_Q{%B{h?dbs7F}%9C87x>M)-X30b&by^+>EG zM9ZnKMVEC-^Vw)wJnBx{9ga_J{7+e)Yv$ueo{a z(-(bs$Hr|}T(b3{mD`q|zxC1EKD_YW4{rh^&!fHtknU@3x{j^~rgbT|J;}sFOh;!C z8rKlCENw|d8_F9@%ks3xce=tD+(M0192B#Fv0znWojecGPieJ9_uBL`y3g}inOz|w^(~|4!<#T2?Aj00qIO|(90BxLb4kBx z;G7^mz*M^R$@90azI@wF_iS5rJ22mI;ZxgItlYBU$J;kvx9!&3o#!E%A>ME~J#5n> zBD_JMHoZO};y8mIv*~eq0uNiv+(=X|HM3Uw${z$UB-=CO3 za^TDY#D*`}^dkKVS|Ijr+Vs&=r&qz^4ay?C5T0ytBDgw(UbgAi^a_GcX9x&BnGWf| z!nF-HhfAVx9{t9q-%21XF|1gt>N)}bnoXN!P(q)v%~6Rnq+%HT-lji@od~o9%)8DJRU}Wwdrrt zp^MicRkxhp4ARHQm>hRfUFk^jmUSDp|7?SF{g+Lj2pvMLO^8pUqVHmyKC|g_`X4A% zlYeNQeHxjC#ccx>*Ft5G#x+viC_ud}`VwwKtV-4h)daP09A5J1#=(X3745Riv`Xo;*s+vZ@PJ3CgOL-fbHtuPoA#ItA6N}SG25(ILpOy`!Y7YL9oX<}xTU)y znL7Ensa4aa1$n;|gdI=cvg3{` zwyb-w4FtzM2!sP{?kf=Ts%k2$Duo>f+I$d~in75#d5ri$ZboD}d$DS+1{HFDxOx75 zC;W1QBme2n77v7x&dDwwPa;EYQY_^+H z_(EN=fW!DOn}_lb%uI;nf|YxthHY)Dz&*m|BY7Cmt#6SLI3gFVV;a@oG=B?9U_MBo zA8m65V-}$+tb&vGO)zFk! zYH?MkrcAN~%cU81*F?|5_&A%#b2Z%6BG0ROy3m19O11T3-;~33bt1%-Ji+FP;>0D0 zO4V1_6>^QJ3)qv}RP71A#V0WRAg8dTySvOyy}lb+Jk93mJOj~fLu65OY`n2Hl9*MW zScpKWR zo?`Q<@>F8X6zWn{$*0*I;dxG&G8H*geY0p%PcKjhhy~?iFyR@EV0x45IBM~Hn-_=# zbxmhsZVQBB^PILbWrk4N*JFN>k*xO`0GV&s0U&2`%;pAe1PZ_|jY2O!%{&ZXSb%er z&5IcUzsW8z13Ovf4BH}IjofxYv>9(maI3{jY(9g}%s|?0A+uDC34^eiV5*iLX9?O! zo_h_b_M@E!I+M?_`CLBFjn30pWZ>j8dC~!JFT#w)i4; zX5KRs?zV;|mqtpo;VR=LHebri;gh1i;N`H~K1rH+D(DMZLcEMGxA_XuJ_*64N)+$M zqIg%qJLHtw>;NskChLr|J3`aR6?1u&7{BXmzTWt#suM>~O8cm8Sf!X|@l751%50h= zU_*SPD9w#LM}BUxd6lO*QY-4Qj8BuQn3S5NbPggnzQE$Un8xNDbLxG$802^?u*l+j zIx;&cKt7ds`iA&!LH%w){Z9Uw&G$)mSp?QN_0yL&LHi!y2Q7X`B>Ca20y|PES+{neWG?Dyj3Zn zmWtw*dhC-YpmV8-SxeKS!_4bRFgADd^WYzE>Quy=?hPV8z%SbTE3s-8X6Uhc2SL4? z*MxWg^$qbWm@(s5Vf52hS7Hy;@^5Yaoe)&!T8?Xuw>Akq2hf`qzuqZ%Y&TCG;>{wD zoB0i!-xQYQfh7QnB>iEjdrV46DXo{%?NWMDN_R==87Tqd&GZYbO7Rw(w~9Ci8Y2ym z;?2BWCJ~;Hst;}cNUCJgSSCxP_HQ=-T_#XO(3};j8tI2j;$xftDZ>;$k)9vGYhIJu zPi_8;KXje1dc;oG@>K;wej-l-R1PH0h2eQ!sN?Ut8aV zSjcUZ?=&ly6_zEzkh>%}x}{c}=#!S(w^P=)osedRt1~Bu zR38&G(VHmo8xo34kkTnqI!#K@r_EFYlNl@8~b@m;!~s zv&T?UhuErI9qLH4SnNH_v^zO(3b^zb9#TVji=|-a2Di6nj@@w=a5MS=1$Bh2juauX zz#`)>0O~`jINDYfQen(0USgz9^-;&zYJ?i;1UxBd2w6KwiWYe}KzSxvWLghWGRjt? z)fmiR_ytKUH3Y}iCjYcrHwu}#6On;&*x=B9#BD>Q>@py-CakFv*4!wpsS?)Q$d^m$ z7Ab-KRl@!oh5c20PKd7-##O1QwwflykvT_!UL zwq6jOC5YZFh|Us3AK)!0sZ-%$VHR-QjMy`Rtb+SlJ_`lLB$eVogo$7@G`0JPq72SlLF=$0kd6x{wA=_ zv6Ttz4I$%+NGv7nnC4OE+v)=KBX{z2N^^VxraxMyIdK9ar`)l%7Y>wrL4}~x2Egz_ zwM<=Psf%rOiMo_&#GXmg0W@dh$i!%*xiMPjdIC&_X2t^@^3%&-ge;fY>T=JdyD(FP z!Nh{P(pEo~SR~L=e^yjFTy3jsJo7$X=qPGosp~p5vkT4jI9)3JJVJ>&Tq}&f7K)0W zn8@|bwpyW9Le{WRU`nK=C0Zw4a?jPLeH!L`)U|4rt!|YJ)MU-3zdW5PgZPQ9?vO!< z7^gu?&0V&-Tf|tFRQwo9-A`?`S~AqGaNK6-DN5y!nvG3I_%EdHR}Wa~L0dhf5T5&@ zv`LW!R`>D{mo*|44-BXrc)Y-T)K-rPCPtE7xtkJgu0?WSDM+~4tJQJF=qG9lBR^#y z7s@^k4~Uwb`n~!CgfNCEJv|+9yrtg6 zPN=lfRyV>ZG-0P6_C}12L0Yk?t#LuLs<}Dd98zykD5&0MLKHPjy<@9))t@DPlpx<5 ztIQUiAau28*?WMBOy>wW^)?dI%lsV!Lpl+1o^mTTS`QXlYFA+?=CmfC?$ zd142%E+wTmGJ1y4?CEk1vh3pusgKlOE%i5B{as?|erZb9H!g`Uil#Q3MC+XGi;mh# z*GbXD!g!tWTeM7lY^#5YfeS(xFuPY54f1C}dL*bmb7n;x^AO}Kf;2El{erwWNWTrL zuiRP~9b`m6=4)GhW2T~D9MW%@P~RxEnrtjM0na|D^)?npVq%D!=SONCjt4c`nC1Vh zG%?F-Id>_BbRIH8osYMqN#RUB$@_!0E|B;4&Hny0NrDuX_O`8yr2WAiwVzhM0DDVY zo1;NGLOPY$x~p`O%uGmNM)xnLaR z(l6uBgETWpB|+V1kCRlc^ob>RR6EG?f^=Yzdj+{U$g_fcQ;_embScw;X}VR%V$lVW z*y!d3t+F*UwaqA~`!nrd-H4r%^>uw?W?O9Ex+rAS+1DhSlS29+jm?>b^n|6$zLl?^ z?%Vn6N;-s0b}LFu(ZY0kwt%i}aNKr!%G*QiZb!^?B`y=(wI12$=&bh)hlg@@M|GKq zomMri4fAA42DS;F%4|-U8Nrxw?>-DP0Yyk}ZX=Wmlw6khM=P&OEUd>6$9DoihDq>) z@tFre44Tc$n2$qb(g~E?CMs+4I%m21Z})WIO)u7)GYHOORz)^-Kmbj-5-8l%g1 zc!t7~xRYCzIPN)}T0w&{S%s|6Wmju%9QHV(&JZ&jk4FOQvva?N8kgRmCtFZ8bh~r5 zsjU$Z_z1LGVREqWC)+A9)t$wdxONna%Wbz_qI)Qf4WjHUy|V^P>3Ktd2v5a?AEqj2 z*0)H2IJ&VBnV0!Q16#%?#+w(Ew=~HY74t>>@WI6*`KF|?C1O5cD37F?%YJC@aU>=~ zYmUca^B~IOWH)zDUxc4>dNKlMr;$hp-nZ9`!p?2bLbmTXkP4ex=f&z<7CLuUw6V^8 zj)w^+PlO&Fm_-hatM*&Ed|{FBIv@qiI&_xIvey73ENH^mjH`s>h{R%o2;N=27X~Aj z?Hj!puzabVF+0=tNQ+MDzn6s@sPZ9-^Pm#nJc#a}(C$4x$#Ca~+J|&mY(eTha8yEK zVNt;%Z~hR8Rc=0|T4Aa)A$$2#sUY~Jn(z_OQMo%q{GCs%+`ht3fB(+J8Ci@$=47*D z9g0$jI)1pICB1AcTPEi01>ZaMYVku2IT)4Fjn2qJC*L*@`WujZH~WTBm-{9mcBw95 zw_z5-#tsZ$HfFh9onR?5Xl*NIxzHC74vT_totGKQ^BuiPC|l?Z$n^tf z88ZDxfqG}O&u5{Wp&OgLH=$~FNP5u{L_Zyo#+;^Td``f`fBw_TPAQ zg;M80ghJRJeoo8c`o`K=YhBdwuc&8ygQkQp9XP<04!5HPNLifXn!5y0BHRD{3$k#u zQK0HpAHNrBoRL_7Hqb+7u*&=lSn45#h|oa`97A}7dA|E~c}NuGcW zM4Lp8JF`O{D0&f9oAndG$!{`?900h;0PKwK^aD)s*qdrMnqfD&s}hbR_jV<@U1Lne zbxskz0RZFTM8-lKlEj#^td)X}6*-6KP_6~#-oh1@XPmJLb3FMMVfQe1aNQeUzbAqS z!=~(=9C!n7%Q*p=FW5_PoM+~IaIJOrcq}nQ{jQvlywwY@g_h17snMVSvQ}ifd1jFz zd)AvZZ#5JB7*QZ$_CD-`g+UY-8GR; zNU^V@gMR0`BHc85&mYzE_BnG=*Pmd z&lKf?!1PIOjZM$3dSXzIWfEDc5}A-ClgYiH|QXM^v z{XJd8q3xk*@m4HakE@pzf_<~Jk-;4zkvtZIvQAjx8`G`f z_u%3z!r{DQe5A217Huh=7>_S%ZSrrcaCgPDmkFn%v1ljxYQ3G{zDF*GV=>`04QDD0 zFQFs4IV&V)SqA%K4$e?7Y7>EDL*@Ay+ocSm_Mw!~>H zRewbXmgqk)P5c%w7fY5>_iP#j_-|s*m43ZMzh$PC_dIjti#)|9-R$Xef<|pe}GRw^cH;Rkc;tQ{{^u08x%f8LF3ESf!vI{|B<_Y+gN&^hZL&1u@TemvKJyM z%AX-;n1FzFkVo<^b5|sH4qwfEmy8Y)VTZi-a$~2P%Wbj1@f@-|=$?}4^iwOKuq572 z8nRgmD-gg^amP*JS{$=N{jjZLJFy;!y^!7HGhV1_H^x`0=8Eq@2x}gT5#aY4KxSG5S&D-=@ea#-s5qe(hbx_AF2;S3B=Gt^$&2B(&73DLfA|9 zQH4GdM=BN3oqCu)3P&29PF4D7JPQEkF}gwzhfO^Oeai5}X+I*>eq^fsh*bMy(S8)# z?@M`K)4>)UW0BQkpKoZODUP#f;!gU$9*q`xtPdyBV^CCjEcjQct55>}Xeq#nRP-wY z!J{DBq`@yx$wsQ5{TMCkws>aAbXzFMmns2Dk*8!9o zdp|u+ABVAHr?#PtGS~(Q``h=iXoiQ`H~?ckURS#k^>cvF$Fuj>(UM8s&K{hkbCY!8 z3JL?kOKXO_Ks_DoF7NhZ!4CCT*OWa$*9=)tHz=@uWknzy@Qq=Wv_jw8@ONjD?pfgt z@A7WSlYAK9a_7q$xU&dSk#17U}*yPXw<5^p2jSYan-nDCxGVpw)V^ zo`Sk2T5LG!$X!ng?4te_owthu7QeEKaHPu0eLS{KfViB1cNBxUQ}H+LB;r~<9iEDlC-irC?$iBp4 z1XEq?%q~T~E+Qh2f_9F+Ex}Q7M7P4S+(td<4(baYm(pFZjH@9P_d+V}hkbg0P6prW z=pmd<^DrgoQOL{_bOEh_46LPFaJ_@pqs3Er`g3|7it;M1uhVn%9&MuS^a6c>FV&e| zV2fVn?(|Apr@4nGCnz~`(w9E->2w#$@3D*ag;MYH6`eM8=$>U@7BDal1aEZ=(3u?= zpf=0_HGQ1HuFn)r!3M9=;lUG}LGVaojx*?^G_B}Nk5(vo_AlZbfK|GOy1M4EJAcpE$HzDfQ{_l|dawr?ul+Fw`%et^Ul{CX5US5U}y zeF?$Z=^NCj)SyPC1~tq#r~*=sQU9LDdRX-wqniD#N5x_PsP=V7wSUf0?IwKML`4wh zeV~}7oJT`BNJn!4PP7YsN28jfPjZdg>2Tf>5iKiwg8L0x&j-UP@c?nF#fCFnww8y$ z>o}2;6Y>}ymCh;~lH@}(0-UzdO}Rh1L2Lu71jZk}g1VbfXOK?vQC_U`N;oea<_yIS zXX0Wi<}Qc?OK3mtK?ieBP^K3s)0@U{m?FFnHR8yNb9q0yfDbT~lF%kX`x#zKXtOLO z3Cr}!#=RHQ5`Bt36)xjonycrU(B^2Gpie_U6QD6P20@M&+Vq9FcUnn6{A?;4gdmd-U+HQUAJd(WHO^@Wf+9XD?ZW#*lZZ!>0#tA{#>-Ezxn{(ZI;Tj!+>=azp0Z zr6eIUS61XfYR4fw;p5lyB$3=H5?jAOz1@(|RBhm?1gC=7iD%AU%O@hxwqQ(WhY@h2 zXOd5LN^>_+u{@cZv(CB&lXo4w$}6caEPmS zpCTs97pe1+An!1UaRs*Y4hMNh&}bZZF^-R=lXwhHH5`jW|0*fLRdh9vqlfu8+Q{Q^ z)>U;%oJZ4HdVyYuAhV8U>3V%SMEnrC5}s|5Va(Gh#yp*3%+opsA;xExi0B)1BSdq%vLvr`O1HX#aI0TPZgc8xck6C%BP2h8l#&R^9odCsB7|fTgk%bY zLb4q;|A!Sg9(m=gb zp9SU&q@mE|AHw_r<&-YZP3iJneYUX4r@`{%9G5vo6eyxylyB1K@qQgTJ4K#zNihx= zLJye&nGaVcu5ne`r!$ zBOwMO;iQDlA`q)m)LoUL?kYDJ2-5ZXJQEBYK<5~W2Mon~L71Gn^D#1~?gHR83h?%& z{BJ1b=O^x>;TGRrQnHiqzvJv(b9M?ED>-@BVS#lMm|X%&-MNuBL-2lIGX&IsBgucj zmH(LJx8(YElK&*vcar?BT>qTp_vHG1lK&#t9!dTn$=lrGjwJt8ivLLRzvTK!lK)2< zZ=!=_wn2*i2?zMtAtK~Ell-;xGR+YGq3Dk;+-8cBO1I594a!btqw+;y0B{o(0;&qZ zdunlys!${bWQNwV4pKrC-&E(p_XrsWF41+J*yB_$*3Gb=(HRiD{w)qWL);lgkz zsrFB*1DsOdr0VCC4os?poKk609SroxNz1;epu`T_n`rb#)gOQcR1}4a!gf*(OsX=c zG$^SCJEb8>by!jzp1K*9R7U}DQBn;L2g8M4usnN6IG9w&=A;uwJ2pMqN{qI^8*NC2 zR)tAO496X9TuNrNH&)miRTYpt&O>s1QdK+H9G_GZoYKUkn&gyfl4>%LxLAgR5X|+i z#o^*jB!etYswqizLO2vI@-V-0h)`xaI^~iJV}1%fbZx;+&;>jf-T6{-?NISXH4Es@ zuILi(BCng1R417dER#ApsZL4V%uTA(oST=Dsy5uE49)qM@`L-jq*@rZ!(BWqZyX{c zS~Mh;k--1Xgdw^DhUiLo=^s;XzKZ(d1Ns4c4UU?>7RLTMM9tSz4dRHIaDu1u3X1Yd zI)iVavvCT~MSKTc!FSSad>7q?@7^EapV3o%KW)PG6@HNZ!jI6W`1XAlKZ4U4pTNm~ zYjNz|dYm@5mXGF*T!WKersAxZT7H%n3D*gY=asg>)afNdFk6LS0H{>#I1utAI1If~U#qW!!+1sg zUSE%FDZpCYu5UmokB?UM`bL!Uje~)caxu9ng~`n+Oje{YS((D*f)pmVU}SJaNE*8C zl7n$J_uq}wAWx!doCSk>WTFy{ZI)=P&0_>%n{iCb;SxIdn)`dSuSs<>X>RHrCgDxL zDQl(a`i&f{KhDXCzoAvg6D-xoq#QOCw8cZ9n#P2qQ^)%HEkx*OsVWnN;#0$%{nEYh z4=K2B-AS?C2)eSOm`Xto1uw4_pDm{*IzBsZDtf_ZtIIa3Mi`tX36P8nREwnmx2>8@ z;q9bqHHCMQ>P%Dkb5boe1>>^SSzdWZQvEQezk-tzuZmDKi-Sbgsm_zP4_>b>)Uuuw z5MQ|bTlfPDU99!$3MS*IuhK`t9y=>l1)e_)g+s2%T`DElLlkaQ*Mb7qSHP)-3t{(@ z>ISC-zi?xjc{DhwZaNZ9u4j=X(dw3-MJp(OS&)sdkUnjFh3)!^+rkB5+q1$Kh66o= z20i5b;ew>PQ=*G|kX_wI{mqcM<&qxi-bLQyOXBO)eV3XZkE|v;>_#Dv?6-nm%Sq|> zkwM6#1pK|@d@xj(5*JFzjSPx5s>eZzH5G7p;-V1`B%KoCfwkdck4vTwtXdZUu|bX} zL56YWVJbj?``SeNpmUd`LNxHSQ*xq#=MVrCdo+P035A~z2U5O?KEjd(#5Imk=pxk{3s7NNrS_!<)&8_m9YD{b{G#ed zZ>WRlEmcY%sDoL-TNL7)pq^>~AD{;EAXUaks6kwz2J;A2juU?leb;K zQ%CR;btIpoj^<0@UG7)M@DuPb>(prel^P3=QwdKq8eZi%c#rYQR@JJfI$j;1Ca8gG zqN-FiIA~?EI$2G@xh^ND7Bx+sqo%9#)eIaTa-#7S&ma{jq*L`OeJlP6oz}|I%%c9rYjgo+78|co#9Qbt;{!rCZfm8!L#({$xM$l@ za&0?GGJl9^DwOWT+ccO=Zq(@=q-Lkuf`-y zkUrqm`d+-Fz*v4PoVxG7iM;p!4DWY(u0WFJw7(DSVdZgHxV@Xs_3SmQBU`G`vDd0m zEWB&4eKiU#VB}+-kxW-voPbSaV;3iift_NE>a|$y?B^QRkYiZ0^}#xH@EaPPvZ~+E z*~XSX?%HxYcUPwmVa`6^WUED5i@B9K(L2TD%AqH2rrH;zmAtK0tOlm0o#;{~Mf3Cn zZh9bQc!PS;TS$Q}|H>>>l|Dl#zl1bWtbwE{xP95&E_5bJ(mA_eIxDahu6 z>u)0~An8jw1vTltIvEml3bgA~>Y*^htme^Ss+LBmI-01WG)*m_)6~LL+6kmR8A9oP zEep%?%#opDNT)<78cSs->IaZ^2Iw^EsUJi;XHi|I>YTcV++?%6%%%1KYrdvaWonsU z8O2_@f4@UO5N|&4aMFCF`+!Px84`84CpSr#q!j@J{v=H=#UIiHnzvEC0Xz1`r(q+n z8SLeWHA6O02vht!SJQFb)my7+H0;@*V8-6V9Gd#TtyWuC(*RR_AlQ_ioc5}*>Q`W@ zwb(0XiO{U(s2B}ajZ~rHG(k1fY}G=it0iq&z9858Q&x*yqW=QHB}&2S8AS zN?0%$4WP)|9|N*apoo1odW}O<9N4GCKG4XrwQ5`0pf&Vq+2A!eta!*84wi)jYt(sI zHeW;6l!f!xs6S!7V-5E!3kTQmxUz7;8oszJ99pA(EfYt|Y)!~F*dA%d+T=h^NzF*J z4@NjO((HtR$|u=2!G@8cPZ{)rIM16PU^K-ufQBq=n)_R zG(x?~lIp{WY6LviKOlryc?9jgetqjoT<`CF^odvFdhUR)r(THbs)5gKo{ww1Y{oS* zKlF0>mQQxzdgTwsoFKE)8;^Zw^q+A(q4lsA#S)x0sJr@?*-CM~9NS4;&rp1BdA?Lpw8Af;~vfTZj5|sblgUyZI zMt#ui?)u=h`uk5KGI9caC%`?z1h{7RL8zBrr`Mx;6xy6l1HPt{5p#2~`L9bC`|z)* z=D+^`m)HlFugBnxN^j5`&GkvM-3$2Xr+|(8lf?mIep(Cezr-~0Gf2c<&@bv=>6i7d z-Md#Z?q1Ef`%T8(Yx?)TesAbM`tIJ=@0hzkZQ2q)QIZysQfMLlkk+Dr$~IlvrAf9VTSgq8 z9iN=>NyiyqWyaw_8O0eM9DTtV|0WTCcR!L%Ssff_vU|@x=XcIMU-xYO`0K$h0H#n& zBY_SLiUAc#f!-VDEi+#+Ya98+wHsF16-Z9nHQPNY&@nQ)nu3m$hO~iB7y^@Jrh&qQ(bvIIY8;2;jss}0MQ@ksakMn)rW zF94a>BL<$Ac9V3sxV$Suk1zs`mDqa)VS2ee+X{S~;-AlGhP_5yb zHMb#fHJS=9wn(hOArVgKeGDs_q(D)_>jHbd;@eJs*{a)S#s1h_leJcSPkTys&05&0 zu37aJU(i=_%4TKNB$&W}skoaqy**j_KP_2grW>ug_CFE&=qj6a-f}mc^(C`zRxQ`6 z^Hd{H3JTHIJwc>Wvy-q^)d!>2!?a15bipsSfNZO!}|gg z|EcP%A@l7vIJCC?Vm5k`xR!>AH4SBXC3vf|t(j!kZaG_4-gnHuC1=gD>(p-xd=)KY z0Q8N{nzi+c)yS3{XKQD>7`YKaPeeFviYvFbtr+-~2tJ%i5msPg+N@NTZPzO5xGr#} znKn7BTEln5@0ckueppgo^5rJ1kEH$jOo>r;#$2st)u$_R1hL<{+l^_sA#n7Gbj4*s z1E=f3e}}Sl{FLDcM_>X1$DwfLCx;U&A-@XV%8~D_oabD-h~qbm?>D&1a}`|G+|Lj{ zc(42q^xe!q`x_h={S>np4Oynl%~mk&;FTslLJp{QubWaS zDkL+i#3Uc0?+&^$Y9<*04HqD3wWvAmuK- z?uazIe^a*oXqt7uhZ&q@_yhQccWIK*X7M>@$?HH4pJ9%aLdh1+lTtAc3l~TwQQ^D9 zM?;;BGEYj!7rf>Rq*C~j8C)cl#uEKFjvh__6Wtp0M;O$Q;7=Eiu-_+B|3HS_IK!eS z@{e86Iw$C`Y;aXpL&h1s)P9_Pf2++nRmLFW4Ep<=S7!c`B8yi>d`c4<4Q=-pCzUC$ zmET;Rg&9yN6=*LogU*PGKfwb6mz1Z@r2Sxazd}As-7H-1Ske<0>}Uv^Miw GMdoioGomB_ diff --git a/training-system/target/classes/com/sino/training/module/training/vo/MyPlanVO$KnowledgeProgressVO.class b/training-system/target/classes/com/sino/training/module/training/vo/MyPlanVO$KnowledgeProgressVO.class deleted file mode 100644 index 5a6b9cf874fc5456f390ec93e1febb843cd7339d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3995 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 YLMnO!y5Aw^9YXnglz*T<(O*daFCnJEtpET3 diff --git a/training-system/target/classes/com/sino/training/module/training/vo/TrainingPlanVO$PlanExamVO.class b/training-system/target/classes/com/sino/training/module/training/vo/TrainingPlanVO$PlanExamVO.class deleted file mode 100644 index c2d20fa5cee13c03c6073daa2b337bd5f21c9eaf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4370 zcmbtY-)|h%75?seW@mOiYdcPCvNSam7U~}{+d$KXahw7!sTb_n#I7MfXqoIz?TObr z&g?iP^am8^OJ7=^KviF=O5`O{L4qJ5gy01v9{YsE6HojT0s7rLGrO~!QRTK$cJI0O zeCOPI&iT&08-MoA`yT?B#~+KxVZeZ9K}TL-EqJ=?N0;lT!PPOf|{Aw6DgwbrrZ|pVQ?)<7>U5|CE^t-WAk;CK9J3AXI z0y(e2O_#d6F8Qs^Il0S_g<-ix-X*lwkV^+FjN+g`K`yO(Vbc{DP1&x60Z*W;$1IHF z4goW8uk3k&%UuqpkdOI(({)-3TDEW}zC*8VKL}TXh8y%^Ypu}TbOVL`u7wHdHoxn% z+is)CL)~rRd$@-?)fv^5J*O!!HksNgO5@zrc?qsqxDWRW=$md>MX&%-;-wzQnFa8z0rXepCdQ=30vp^6^}4082sC(^MVuSu-Z%Yzmk!Vd*3;@7(2 z_8KGsOM@R-__5qTZoArv`C$t-<{~%pFmWvo_3Rs0L&h_2;S_$t9Bn!6tp&fqx{*w^ zQBv?x3y)zz;Eo+<+gNQ>CasWvO|*X=)`2Kedzum|99u z>2k!r3_LDyNHNs&t7~rHIZf{c=aOWf76miB zTOI>?WaTW+Q{*iXxDxaBuioxs^~LpR`_1sX)OVbx+eu38UUgQDZ9yZhNoE>vTZHVpNiY7b@K|7AvXK7?ot}q5{X8n4upPNuapq?*(=D zv?r-}u=kdIKoXYeJL9&)MZX;y;NB1Y55yy#SnjaR3w}4^ReLy(Ul;K_t{Heiw(oBQ zD%~60YhCrX-D-5msH0Ci_0SKl3A~YJQ4EZnE;_A7(`{Fle1CgycP`bMF(p$gJ%;Po zcHIp4g%m!yf>TSeiv_3IT=PPA&cyEo&h@3R`%q1Kjd^kO?x<#oqzWP@NdcwYDWIH0 z1)LXCWK*rxa)X7YyhGWK#jbAye-OCuw)|zK#lR~96aN`Xszo{Evt;t_75FLg9Qj`J zy3NT)RgHW})yQX3jeG;u$oGxo0ow5g0l!akR^=!->eKH*yscnAiB{>9^X{Ynz z#|S59vR#(;>r(Qp<8oNJT)}GADM$9}Qc||#a#Xo|3TLxi9@?)<$^MSZapiIi>sc-j z@7JYlq>jrwmCK)JpYq6lUCN&9xSUWf`TH#%0a+D&{vK}_2^A=7rgtV>M(6O3L*sjQdt zDbTEK5HxF>WkZ6@7-W>q6zG^;An2G~EEgoG7=sGsVhVKJ9wg|vZIuTl$cjOfQlJxd ziJ%kqP`M;QLoujS9!fyk4aPr^x>lk)>5V8a9iHF925&3=KF3#hhWAts6?~3!TpPeN z{)O|DGFC_7QWy`T&GmRmt;nR(h%`rdyN_9Eeshjzs9(M9RHc(YaEWm!ha~XC}I=yHj}PZwk|g0-vXiliBJDi@oMr<1=(tvGv9va zsa|9*<&TL8NhnDkeopW+%g-@>j=#@-LjPl!{^>ChS5w2TqWKlJs-$}xdmK%Azsk>V V@q5ljxo%SPB6;uyT4nHd*hXDF( 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 Zh>IvG2Jjrib32}|!SiBqskn@+Zv)hAn>zpi diff --git a/training-system/target/classes/mapper/.gitkeep b/training-system/target/classes/mapper/.gitkeep deleted file mode 100644 index 16742ca..0000000 --- a/training-system/target/classes/mapper/.gitkeep +++ /dev/null @@ -1 +0,0 @@ -# This file ensures the mapper directory is tracked by git diff --git a/training-system/target/classes/static/css/common.css b/training-system/target/classes/static/css/common.css deleted file mode 100644 index 496ebe3..0000000 --- a/training-system/target/classes/static/css/common.css +++ /dev/null @@ -1,552 +0,0 @@ -/** - * 道路救援企业培训系统 - 公共样式 - * 基于 Bootstrap 5 扩展 - */ - -/* ========== 布局相关 ========== */ -html, body { - height: 100%; -} - -/* 主布局容器 */ -.layout-wrapper { - display: flex; - min-height: 100vh; -} - -/* ========== 侧边栏 ========== */ -.sidebar { - width: 250px; - min-height: 100vh; - background: linear-gradient(180deg, #1a1c23 0%, #2d3748 100%); - position: fixed; - left: 0; - top: 0; - z-index: 1000; - transition: all 0.3s ease; -} - -.sidebar-logo { - height: 64px; - display: flex; - align-items: center; - padding: 0 20px; - background: rgba(0, 0, 0, 0.2); - border-bottom: 1px solid rgba(255, 255, 255, 0.1); -} - -.sidebar-logo-icon { - width: 36px; - height: 36px; - background: linear-gradient(135deg, #0d6efd 0%, #0dcaf0 100%); - border-radius: 8px; - display: flex; - align-items: center; - justify-content: center; - margin-right: 12px; -} - -.sidebar-logo-text { - color: #fff; - font-size: 16px; - font-weight: 600; - white-space: nowrap; -} - -/* 侧边栏菜单 */ -.sidebar-menu { - padding: 16px 0; - overflow-y: auto; - height: calc(100vh - 64px); -} - -.sidebar-menu::-webkit-scrollbar { - width: 4px; -} - -.sidebar-menu::-webkit-scrollbar-thumb { - background: rgba(255, 255, 255, 0.2); - border-radius: 2px; -} - -.menu-item { - display: flex; - align-items: center; - padding: 12px 20px; - color: rgba(255, 255, 255, 0.7); - text-decoration: none; - transition: all 0.2s ease; - cursor: pointer; - border-left: 3px solid transparent; -} - -.menu-item:hover { - color: #fff; - background: rgba(255, 255, 255, 0.08); -} - -.menu-item.active { - color: #fff; - background: rgba(13, 110, 253, 0.2); - border-left-color: #0d6efd; -} - -.menu-item i { - font-size: 18px; - width: 24px; - margin-right: 12px; - text-align: center; -} - -.menu-group-title { - display: flex; - align-items: center; - justify-content: space-between; - padding: 12px 20px; - color: rgba(255, 255, 255, 0.7); - cursor: pointer; - transition: all 0.2s ease; -} - -.menu-group-title:hover { - color: #fff; - background: rgba(255, 255, 255, 0.05); -} - -.menu-group-title i.arrow { - font-size: 12px; - transition: transform 0.2s ease; -} - -.menu-group.collapsed .menu-group-title i.arrow { - transform: rotate(-90deg); -} - -.menu-group.collapsed .menu-submenu { - display: none; -} - -.menu-submenu { - background: rgba(0, 0, 0, 0.15); -} - -.menu-submenu .menu-item { - padding-left: 56px; - font-size: 14px; -} - -/* ========== 主内容区 ========== */ -.main-wrapper { - flex: 1; - margin-left: 250px; - min-height: 100vh; - background-color: #f8f9fa; - display: flex; - flex-direction: column; -} - -/* 顶部导航 */ -.top-header { - height: 64px; - background: #fff; - border-bottom: 1px solid #e9ecef; - display: flex; - align-items: center; - justify-content: space-between; - padding: 0 24px; - position: sticky; - top: 0; - z-index: 100; -} - -.header-title { - font-size: 18px; - font-weight: 600; - color: #1a1c23; -} - -.header-user { - display: flex; - align-items: center; - cursor: pointer; -} - -.header-user .avatar { - width: 36px; - height: 36px; - border-radius: 50%; - background: linear-gradient(135deg, #0d6efd 0%, #0dcaf0 100%); - color: #fff; - display: flex; - align-items: center; - justify-content: center; - font-weight: 500; - margin-right: 8px; -} - -/* 内容区域 */ -.main-content { - flex: 1; - padding: 24px; -} - -/* ========== 页面卡片 ========== */ -.page-card { - background: #fff; - border-radius: 8px; - box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08); - margin-bottom: 24px; -} - -.page-card-header { - padding: 16px 24px; - border-bottom: 1px solid #e9ecef; - display: flex; - align-items: center; - justify-content: space-between; -} - -.page-card-title { - font-size: 16px; - font-weight: 600; - color: #1a1c23; - margin: 0; -} - -.page-card-body { - padding: 24px; -} - -/* ========== 统计卡片 ========== */ -.stat-card { - background: #fff; - border-radius: 8px; - padding: 24px; - box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08); - transition: all 0.2s ease; -} - -.stat-card:hover { - box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); - transform: translateY(-2px); -} - -.stat-card-icon { - width: 48px; - height: 48px; - border-radius: 12px; - display: flex; - align-items: center; - justify-content: center; - font-size: 24px; - margin-bottom: 16px; -} - -.stat-card-icon.primary { - background: rgba(13, 110, 253, 0.1); - color: #0d6efd; -} - -.stat-card-icon.success { - background: rgba(25, 135, 84, 0.1); - color: #198754; -} - -.stat-card-icon.warning { - background: rgba(255, 193, 7, 0.1); - color: #ffc107; -} - -.stat-card-icon.info { - background: rgba(13, 202, 240, 0.1); - color: #0dcaf0; -} - -.stat-card-value { - font-size: 28px; - font-weight: 700; - color: #1a1c23; - margin-bottom: 4px; -} - -.stat-card-label { - font-size: 14px; - color: #6c757d; -} - -/* ========== 工具栏 ========== */ -.toolbar { - display: flex; - flex-wrap: wrap; - align-items: center; - justify-content: space-between; - gap: 12px; - margin-bottom: 20px; -} - -.toolbar-left { - display: flex; - flex-wrap: wrap; - align-items: center; - gap: 12px; -} - -.toolbar-right { - display: flex; - align-items: center; - gap: 12px; -} - -/* ========== 表格增强 ========== */ -.table-wrapper { - overflow-x: auto; -} - -.table th { - font-weight: 600; - color: #495057; - background-color: #f8f9fa; - white-space: nowrap; -} - -.table td { - vertical-align: middle; -} - -.table .actions { - white-space: nowrap; -} - -.table .actions .btn { - padding: 4px 8px; - font-size: 13px; -} - -/* ========== 状态标签 ========== */ -.status-badge { - display: inline-flex; - align-items: center; - padding: 4px 10px; - border-radius: 20px; - font-size: 12px; - font-weight: 500; -} - -.status-badge.draft { - background: #fff3cd; - color: #856404; -} - -.status-badge.published { - background: #d1e7dd; - color: #0f5132; -} - -.status-badge.offline { - background: #f8d7da; - color: #842029; -} - -.status-badge.not-started { - background: #e2e3e5; - color: #41464b; -} - -.status-badge.in-progress { - background: #cff4fc; - color: #055160; -} - -.status-badge.ended { - background: #d1e7dd; - color: #0f5132; -} - -/* ========== 空状态 ========== */ -.empty-state { - text-align: center; - padding: 48px 24px; - color: #6c757d; -} - -.empty-state i { - font-size: 48px; - margin-bottom: 16px; - opacity: 0.5; -} - -.empty-state p { - margin: 0; - font-size: 14px; -} - -/* ========== 加载状态 ========== */ -.loading-state { - display: flex; - align-items: center; - justify-content: center; - padding: 48px; -} - -/* ========== 文件上传区域 ========== */ -.upload-area { - border: 2px dashed #dee2e6; - border-radius: 8px; - padding: 32px; - text-align: center; - cursor: pointer; - transition: all 0.2s ease; - background: #f8f9fa; -} - -.upload-area:hover { - border-color: #0d6efd; - background: rgba(13, 110, 253, 0.02); -} - -.upload-area.dragover { - border-color: #0d6efd; - background: rgba(13, 110, 253, 0.05); -} - -.upload-area i { - font-size: 48px; - color: #6c757d; - margin-bottom: 16px; -} - -.upload-area p { - margin: 0; - color: #6c757d; -} - -.upload-area .upload-hint { - font-size: 12px; - margin-top: 8px; -} - -/* ========== 进度条 ========== */ -.progress-wrapper { - display: flex; - align-items: center; - gap: 12px; -} - -.progress-wrapper .progress { - flex: 1; - height: 8px; -} - -.progress-wrapper .progress-text { - font-size: 13px; - font-weight: 500; - color: #495057; - min-width: 40px; - text-align: right; -} - -/* ========== 消息提示(Toast增强) ========== */ -.toast-container { - position: fixed; - top: 24px; - right: 24px; - z-index: 1100; -} - -/* ========== 答题卡样式 ========== */ -.answer-sheet { - display: flex; - flex-wrap: wrap; - gap: 8px; -} - -.answer-sheet-item { - width: 36px; - height: 36px; - border-radius: 4px; - display: flex; - align-items: center; - justify-content: center; - font-size: 14px; - font-weight: 500; - cursor: pointer; - border: 1px solid #dee2e6; - background: #fff; - transition: all 0.2s ease; -} - -.answer-sheet-item:hover { - border-color: #0d6efd; -} - -.answer-sheet-item.current { - border-color: #0d6efd; - background: #0d6efd; - color: #fff; -} - -.answer-sheet-item.answered { - background: #d1e7dd; - border-color: #198754; - color: #198754; -} - -/* ========== 考试计时器 ========== */ -.exam-timer { - display: flex; - align-items: center; - gap: 8px; - padding: 8px 16px; - background: #fff3cd; - border-radius: 8px; - font-weight: 600; -} - -.exam-timer.warning { - background: #f8d7da; - color: #842029; -} - -.exam-timer i { - font-size: 18px; -} - -/* ========== 响应式 ========== */ -@media (max-width: 992px) { - .sidebar { - transform: translateX(-100%); - } - - .sidebar.show { - transform: translateX(0); - } - - .main-wrapper { - margin-left: 0; - } - - .top-header { - padding: 0 16px; - } - - .main-content { - padding: 16px; - } -} - -@media (max-width: 576px) { - .toolbar { - flex-direction: column; - align-items: stretch; - } - - .toolbar-left, - .toolbar-right { - width: 100%; - justify-content: flex-start; - } - - .stat-card-value { - font-size: 24px; - } -} diff --git a/training-system/target/classes/static/exam/edit.html b/training-system/target/classes/static/exam/edit.html deleted file mode 100644 index 4d083db..0000000 --- a/training-system/target/classes/static/exam/edit.html +++ /dev/null @@ -1,350 +0,0 @@ - - - - - - 发布考试 - 道路救援培训系统 - - - - - - -

- -
-
- - -
-
-
-
-
-
考试设置
-
-
- -
- - -
-
- - -
-
- - -
-
-
-
- - -
-
- - -
-
-
-
- - -
-
- - -
-
-
-
- - -
-
- - -
-
- - -
-
-
-
-
-
-
-
-
选择参与人员
-
-
-
- - 已选择 0 人参与考试 -
-
-
- -
-
-
- - -
-
-
-
-
- - -
-
-
-
加载中...
-
-
-
-
- 返回 - -
-
-
-
-
-
- - - - - - diff --git a/training-system/target/classes/static/exam/list.html b/training-system/target/classes/static/exam/list.html deleted file mode 100644 index df3e59c..0000000 --- a/training-system/target/classes/static/exam/list.html +++ /dev/null @@ -1,256 +0,0 @@ - - - - - - 考试管理 - 道路救援培训系统 - - - - - -
- -
-
- - -
-
-
-
-
考试管理
- 发布考试 -
-
-
-
-
- - -
- -
-
- -
-
-
- - - - - - - - - - - - - - - -
考试名称试卷考试时间参与人数及格率状态操作
-
- -
-
-
-
-
- - - - - - - - - diff --git a/training-system/target/classes/static/exam/my-exams.html b/training-system/target/classes/static/exam/my-exams.html deleted file mode 100644 index fa4f95a..0000000 --- a/training-system/target/classes/static/exam/my-exams.html +++ /dev/null @@ -1,193 +0,0 @@ - - - - - - 我的考试 - 道路救援培训系统 - - - - - - -
- -
-
- - -
-
-
-
-
我的考试
-
-
-
-
全部
-
进行中
-
待开始
-
已结束
-
-
-
-
-
-
-
-
-
- - - - - - diff --git a/training-system/target/classes/static/exam/paper-edit.html b/training-system/target/classes/static/exam/paper-edit.html deleted file mode 100644 index 9f7b575..0000000 --- a/training-system/target/classes/static/exam/paper-edit.html +++ /dev/null @@ -1,517 +0,0 @@ - - - - - - 编辑试卷 - 道路救援培训系统 - - - - - - -
- -
-
- - -
-
-
-
-
-
试卷设置
-
-
- -
- - -
-
- - -
-
-
- - -
-
- - -
-
-
-
- 题目数量 - 0 -
-
- 总分 - 0 -
-
-
-
-
-
-
-
-
组卷方式
-
-
-
-
- -
手动选题
-
-
- -
随机抽题
-
-
- - -
-
-
- -
-
- -
-
-
- - -
-
-
-
-
加载中...
-
-
- -
-
- - - -
-
- -
-
-
试卷题目 0
- -
-
-

请从左侧题库中选择题目

-
-
- -
- 返回 - - -
-
-
-
-
-
- - - - - - diff --git a/training-system/target/classes/static/exam/paper-preview.html b/training-system/target/classes/static/exam/paper-preview.html deleted file mode 100644 index 5b8b277..0000000 --- a/training-system/target/classes/static/exam/paper-preview.html +++ /dev/null @@ -1,193 +0,0 @@ - - - - - - 试卷预览 - 道路救援培训系统 - - - - - - -
- -
-
- -
- - -
-
-
-
-
-
-
-
-
- - - - - - diff --git a/training-system/target/classes/static/exam/paper.html b/training-system/target/classes/static/exam/paper.html deleted file mode 100644 index e4a322e..0000000 --- a/training-system/target/classes/static/exam/paper.html +++ /dev/null @@ -1,194 +0,0 @@ - - - - - - 试卷管理 - 道路救援培训系统 - - - - - - -
- -
-
- - -
-
-
-
-
试卷管理
- 创建试卷 -
-
-
-
-
- - -
- -
-
- -
-
-
-
-
- -
-
-
-
-
- - - - - - diff --git a/training-system/target/classes/static/exam/question-category.html b/training-system/target/classes/static/exam/question-category.html deleted file mode 100644 index a13d240..0000000 --- a/training-system/target/classes/static/exam/question-category.html +++ /dev/null @@ -1,124 +0,0 @@ - - - - - - 题库分类 - 道路救援培训系统 - - - - - - -
- -
-
- - -
-
-
-
-
-
题库分类
-
-
-
-
-
-
分类详情
-

请从左侧选择一个分类查看详情

-
-
-
-
-
-
- - - - - - diff --git a/training-system/target/classes/static/exam/question-edit.html b/training-system/target/classes/static/exam/question-edit.html deleted file mode 100644 index 5268751..0000000 --- a/training-system/target/classes/static/exam/question-edit.html +++ /dev/null @@ -1,437 +0,0 @@ - - - - - - 编辑题目 - 道路救援培训系统 - - - - - - -
- -
-
- - -
-
-
-
-
新增题目
-
-
-
- - - -
- -
-
-
- -
单选题
- 只有一个正确答案 -
-
-
-
- -
多选题
- 可以有多个正确答案 -
-
-
-
- -
判断题
- 判断对错 -
-
-
-
- -
-
- - -
-
- - -
-
- - -
-
- -
- - -
- - -
-
-
- - -
-
-
-
A
- - -
-
-
B
- - -
-
-
C
- - -
-
-
D
- - -
-
-
- -
- -
- - - - -
- 点击选择正确答案 -
-
- - - - -
- - -
- -
- 返回 - -
-
-
-
-
-
-
- - - - - - diff --git a/training-system/target/classes/static/exam/question.html b/training-system/target/classes/static/exam/question.html deleted file mode 100644 index dc6cde0..0000000 --- a/training-system/target/classes/static/exam/question.html +++ /dev/null @@ -1,394 +0,0 @@ - - - - - - 题目列表 - 道路救援培训系统 - - - - - - -
- -
-
- - -
-
-
-
-
-
题库分类
-
-
- 全部题目 - 0 -
- -
-
-
-
-
-
-
题目列表
- 新增题目 -
-
-
-
-
- - -
- - -
-
- - -
-
-
-
-
- -
-
-
-
-
-
-
- - - - - - - - - diff --git a/training-system/target/classes/static/exam/result.html b/training-system/target/classes/static/exam/result.html deleted file mode 100644 index e9c46e4..0000000 --- a/training-system/target/classes/static/exam/result.html +++ /dev/null @@ -1,294 +0,0 @@ - - - - - - 考试成绩 - 道路救援培训系统 - - - - - - -
- -
-
- - -
-
-
-
-
-
- - - - - - diff --git a/training-system/target/classes/static/exam/taking.html b/training-system/target/classes/static/exam/taking.html deleted file mode 100644 index 6a937d4..0000000 --- a/training-system/target/classes/static/exam/taking.html +++ /dev/null @@ -1,332 +0,0 @@ - - - - - - 在线考试 - 道路救援培训系统 - - - - - - -
-
-
-
-
考试加载中...
-
- - - 0 - 满分 0 -
-
-
- - 00:00:00 -
-
-
-
-
-
-
-
-

正在加载试卷...

-
-
-
- -
-
- - - - - - diff --git a/training-system/target/classes/static/index.html b/training-system/target/classes/static/index.html deleted file mode 100644 index 8b964a0..0000000 --- a/training-system/target/classes/static/index.html +++ /dev/null @@ -1,358 +0,0 @@ - - - - - - 工作台 - 道路救援培训系统 - - - - - - - - -
- - - - -
- -
-
- 工作台 -
- -
- - -
- -
-
-
-
-
-
-
-

欢迎回来,用户

-

2026年1月8日 星期三

-
-
-
-
-
-
- - -
-
-
-
- -
-
0
-
待学习课程
-
-
-
-
-
- -
-
0
-
待完成考试
-
-
-
-
-
- -
-
0%
-
培训进度
-
-
-
-
-
- -
-
0h
-
本月学习时长
-
-
-
- -
- -
-
-
-
- 我的培训计划 -
- 查看全部 -
-
-
- - - - - - - - - - - - - - -
培训名称状态进度截止日期
-
- -

暂无培训计划

-
-
-
-
-
-
- - -
-
-
-
- 待完成考试 -
- 查看全部 -
-
-
- - - - - - - - - - - - - - -
考试名称考试时长剩余次数操作
-
- -

暂无待完成考试

-
-
-
-
-
-
-
- - -
-
- -
-
-
-
-
- - - - - - - diff --git a/training-system/target/classes/static/js/common.js b/training-system/target/classes/static/js/common.js deleted file mode 100644 index 1189419..0000000 --- a/training-system/target/classes/static/js/common.js +++ /dev/null @@ -1,618 +0,0 @@ -/** - * 道路救援企业培训系统 - 公共JS - * 基于 Bootstrap 5 - */ - -// API 基础路径 -const API_BASE_URL = '/api'; - -// Token 存储键名 -const TOKEN_KEY = 'training_token'; -const USER_KEY = 'training_user'; - -/** - * 获取存储的Token - */ -function getToken() { - return localStorage.getItem(TOKEN_KEY); -} - -/** - * 设置Token - */ -function setToken(token) { - localStorage.setItem(TOKEN_KEY, token); -} - -/** - * 移除Token - */ -function removeToken() { - localStorage.removeItem(TOKEN_KEY); - localStorage.removeItem(USER_KEY); -} - -/** - * 获取当前用户信息 - */ -function getCurrentUser() { - const userStr = localStorage.getItem(USER_KEY); - if (!userStr || userStr === 'undefined' || userStr === 'null') { - return null; - } - return JSON.parse(userStr); -} - -/** - * 设置当前用户信息 - */ -function setCurrentUser(user) { - localStorage.setItem(USER_KEY, JSON.stringify(user)); -} - -/** - * 检查是否已登录 - */ -function isLoggedIn() { - return !!getToken(); -} - -/** - * 封装的 fetch 请求 - */ -async function request(url, options = {}) { - const token = getToken(); - - const defaultOptions = { - headers: { - 'Content-Type': 'application/json', - ...(token ? { 'Authorization': `Bearer ${token}` } : {}) - } - }; - - const mergedOptions = { - ...defaultOptions, - ...options, - headers: { - ...defaultOptions.headers, - ...options.headers - } - }; - - try { - const response = await fetch(API_BASE_URL + url, mergedOptions); - const data = await response.json(); - - // 处理未授权 - if (data.code === 401 || data.code === 1101 || data.code === 1102) { - removeToken(); - window.location.href = '/login.html'; - return null; - } - - return data; - } catch (error) { - console.error('请求失败:', error); - showMessage('网络请求失败', 'danger'); - return null; - } -} - -/** - * GET 请求 - */ -async function get(url, params = {}) { - const queryString = new URLSearchParams(params).toString(); - const fullUrl = queryString ? `${url}?${queryString}` : url; - return request(fullUrl, { method: 'GET' }); -} - -/** - * POST 请求 - */ -async function post(url, data = {}) { - return request(url, { - method: 'POST', - body: JSON.stringify(data) - }); -} - -/** - * PUT 请求 - */ -async function put(url, data = {}) { - return request(url, { - method: 'PUT', - body: JSON.stringify(data) - }); -} - -/** - * DELETE 请求 - */ -async function del(url) { - return request(url, { method: 'DELETE' }); -} - -/** - * 文件上传 - */ -async function upload(url, file, onProgress) { - const token = getToken(); - const formData = new FormData(); - formData.append('file', file); - - return new Promise((resolve, reject) => { - const xhr = new XMLHttpRequest(); - - xhr.upload.addEventListener('progress', (e) => { - if (e.lengthComputable && onProgress) { - const percent = Math.round((e.loaded / e.total) * 100); - onProgress(percent); - } - }); - - xhr.addEventListener('load', () => { - if (xhr.status === 200) { - resolve(JSON.parse(xhr.responseText)); - } else { - reject(new Error('上传失败')); - } - }); - - xhr.addEventListener('error', () => { - reject(new Error('上传失败')); - }); - - xhr.open('POST', API_BASE_URL + url); - if (token) { - xhr.setRequestHeader('Authorization', `Bearer ${token}`); - } - xhr.send(formData); - }); -} - -/** - * 显示消息提示 (Bootstrap Toast) - * @param {string} text - 消息文本 - * @param {string} type - 类型: success, danger, warning, info - */ -function showMessage(text, type = 'info') { - // 确保toast容器存在 - let container = document.querySelector('.toast-container'); - if (!container) { - container = document.createElement('div'); - container.className = 'toast-container position-fixed top-0 end-0 p-3'; - container.style.zIndex = '1100'; - document.body.appendChild(container); - } - - // 图标映射 - const icons = { - success: 'bi-check-circle-fill', - danger: 'bi-x-circle-fill', - warning: 'bi-exclamation-triangle-fill', - info: 'bi-info-circle-fill' - }; - - // 创建toast元素 - const toastId = 'toast-' + Date.now(); - const toastHtml = ` - - `; - - container.insertAdjacentHTML('beforeend', toastHtml); - - const toastEl = document.getElementById(toastId); - const toast = new bootstrap.Toast(toastEl, { delay: 3000 }); - toast.show(); - - // 自动移除DOM - toastEl.addEventListener('hidden.bs.toast', () => { - toastEl.remove(); - }); -} - -/** - * 显示确认对话框 (Bootstrap Modal) - */ -function showConfirm(text, onConfirm, onCancel) { - // 确保modal容器存在 - let modal = document.getElementById('confirmModal'); - if (!modal) { - const modalHtml = ` - - `; - document.body.insertAdjacentHTML('beforeend', modalHtml); - modal = document.getElementById('confirmModal'); - } - - document.getElementById('confirmModalBody').textContent = text; - - const bsModal = new bootstrap.Modal(modal); - - const okBtn = document.getElementById('confirmModalOk'); - const newOkBtn = okBtn.cloneNode(true); - okBtn.parentNode.replaceChild(newOkBtn, okBtn); - - newOkBtn.addEventListener('click', () => { - bsModal.hide(); - onConfirm && onConfirm(); - }); - - modal.addEventListener('hidden.bs.modal', () => { - // 如果是点击取消或关闭 - }, { once: true }); - - bsModal.show(); -} - -/** - * 格式化日期 - */ -function formatDate(dateStr, format = 'YYYY-MM-DD') { - if (!dateStr) return '-'; - const date = new Date(dateStr); - const year = date.getFullYear(); - const month = String(date.getMonth() + 1).padStart(2, '0'); - const day = String(date.getDate()).padStart(2, '0'); - const hours = String(date.getHours()).padStart(2, '0'); - const minutes = String(date.getMinutes()).padStart(2, '0'); - const seconds = String(date.getSeconds()).padStart(2, '0'); - - return format - .replace('YYYY', year) - .replace('MM', month) - .replace('DD', day) - .replace('HH', hours) - .replace('mm', minutes) - .replace('ss', seconds); -} - -/** - * 格式化日期时间 - */ -function formatDateTime(dateStr) { - return formatDate(dateStr, 'YYYY-MM-DD HH:mm'); -} - -/** - * 格式化文件大小 - */ -function formatFileSize(bytes) { - if (bytes === 0) return '0 B'; - const k = 1024; - const sizes = ['B', 'KB', 'MB', 'GB', 'TB']; - const i = Math.floor(Math.log(bytes) / Math.log(k)); - return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i]; -} - -/** - * 防抖函数 - */ -function debounce(func, wait) { - let timeout; - return function(...args) { - clearTimeout(timeout); - timeout = setTimeout(() => func.apply(this, args), wait); - }; -} - -/** - * 节流函数 - */ -function throttle(func, limit) { - let inThrottle; - return function(...args) { - if (!inThrottle) { - func.apply(this, args); - inThrottle = true; - setTimeout(() => inThrottle = false, limit); - } - }; -} - -/** - * 获取URL参数 - */ -function getUrlParam(name) { - const urlParams = new URLSearchParams(window.location.search); - return urlParams.get(name); -} - -/** - * 生成分页组件 (Bootstrap Pagination) - */ -function renderPagination(current, total, pageSize, onPageChange) { - const totalPages = Math.ceil(total / pageSize); - if (totalPages <= 1) return ''; - - let html = ''; - - // 添加总数信息 - html = `
- 共 ${total} 条记录 - ${html} -
`; - - return html; -} - -/** - * 初始化页面(检查登录状态) - */ -function initPage() { - if (!isLoggedIn()) { - window.location.href = '/login.html'; - return false; - } - initUserInfo(); - initMenuState(); - return true; -} - -/** - * 初始化用户信息显示 - */ -function initUserInfo() { - const user = getCurrentUser(); - if (user) { - const userName = document.getElementById('userName'); - const userAvatar = document.getElementById('userAvatar'); - if (userName) userName.textContent = user.realName || user.username; - if (userAvatar) userAvatar.textContent = (user.realName || user.username).charAt(0); - } -} - -/** - * 初始化菜单展开/折叠状态 - */ -function initMenuState() { - document.querySelectorAll('.menu-group-title').forEach(title => { - title.addEventListener('click', function() { - const group = this.closest('.menu-group'); - group.classList.toggle('collapsed'); - }); - }); -} - -/** - * 退出登录 - */ -function logout() { - showConfirm('确定要退出登录吗?', () => { - removeToken(); - window.location.href = '/login.html'; - }); -} - -/** - * 获取状态标签HTML - */ -function getStatusBadge(status, statusName) { - const statusClass = { - 'DRAFT': 'draft', - 'PUBLISHED': 'published', - 'OFFLINE': 'offline', - 'NOT_STARTED': 'not-started', - 'IN_PROGRESS': 'in-progress', - 'ENDED': 'ended' - }; - return `${statusName || status}`; -} - -/** - * 生成侧边栏HTML - */ -function renderSidebar(activeMenu) { - return ` - - `; -} - -/** - * 生成顶部导航HTML - */ -function renderHeader(title, breadcrumb = []) { - let breadcrumbHtml = ''; - if (breadcrumb.length > 0) { - breadcrumbHtml = ` - - `; - } - - return ` -
-
- ${breadcrumbHtml || `${title}`} -
- -
- `; -} - -// 导出全局函数 -window.TrainingSystem = { - getToken, - setToken, - removeToken, - getCurrentUser, - setCurrentUser, - isLoggedIn, - request, - get, - post, - put, - del, - upload, - showMessage, - showConfirm, - formatDate, - formatDateTime, - formatFileSize, - debounce, - throttle, - getUrlParam, - renderPagination, - initPage, - initUserInfo, - logout, - getStatusBadge, - renderSidebar, - renderHeader -}; diff --git a/training-system/target/classes/static/knowledge/category.html b/training-system/target/classes/static/knowledge/category.html deleted file mode 100644 index 960af9c..0000000 --- a/training-system/target/classes/static/knowledge/category.html +++ /dev/null @@ -1,249 +0,0 @@ - - - - - - 知识分类 - 道路救援培训系统 - - - - - - -
- - -
-
-
- -
- -
- -
-
-
-
-
-
分类列表
- -
-
-
-
-
-
-
-
-
分类详情
-
-

请从左侧选择一个分类查看详情

-
-
-
-
-
-
-
- - - - - - - - diff --git a/training-system/target/classes/static/knowledge/list.html b/training-system/target/classes/static/knowledge/list.html deleted file mode 100644 index a474bfa..0000000 --- a/training-system/target/classes/static/knowledge/list.html +++ /dev/null @@ -1,640 +0,0 @@ - - - - - - 知识列表 - 道路救援培训系统 - - - - - - - - -
- - - - -
- -
-
- -
- -
- - -
-
-
-
- 知识列表 -
- -
-
- -
-
-
- - -
- - - -
-
- -
-
- - -
- - - - - - - - - - - - - - - - - - -
- - 标题分类类型状态创建人创建时间操作
-
-
- 加载中... -
-
-
-
- - - -
-
-
-
-
- - - - - - - - - - diff --git a/training-system/target/classes/static/knowledge/view.html b/training-system/target/classes/static/knowledge/view.html deleted file mode 100644 index 1ebddae..0000000 --- a/training-system/target/classes/static/knowledge/view.html +++ /dev/null @@ -1,244 +0,0 @@ - - - - - - 知识学习 - 道路救援培训系统 - - - - - - -
- -
-
- - -
-
-
-
-
-
- - - - - - diff --git a/training-system/target/classes/static/login.html b/training-system/target/classes/static/login.html deleted file mode 100644 index b5e8536..0000000 --- a/training-system/target/classes/static/login.html +++ /dev/null @@ -1,360 +0,0 @@ - - - - - - 登录 - 道路救援培训系统 - - - - - - - - - - - - - - - diff --git a/training-system/target/classes/static/system/org.html b/training-system/target/classes/static/system/org.html deleted file mode 100644 index a65fe74..0000000 --- a/training-system/target/classes/static/system/org.html +++ /dev/null @@ -1,178 +0,0 @@ - - - - - - 组织架构 - 道路救援培训系统 - - - - - - -
- -
-
- - -
-
-
-
-
-
组织架构
-
-
-
-
-
-
组织详情
-

请从左侧选择一个组织查看详情

-
-
-
-
-
-
- - - - - - diff --git a/training-system/target/classes/static/system/setting.html b/training-system/target/classes/static/system/setting.html deleted file mode 100644 index af32f77..0000000 --- a/training-system/target/classes/static/system/setting.html +++ /dev/null @@ -1,318 +0,0 @@ - - - - - - 系统设置 - 道路救援培训系统 - - - - - - -
- -
-
- - -
-
-
- -
- -
-
-
个人信息
-
-
-
-
- - -
-
- -

点击更换头像

-
-
-
-
-
- - -
-
- - -
-
- - -
-
- - -
-
- - -
-
- - -
-
-
- -
-
-
-
-
-
-
- - -
-
-
修改密码
-
-
-
- - -
-
- - -
密码长度至少6位
-
-
- - -
- -
-
-
-
- - -
-
-
系统设置
-
-
-
- - -
-
- -
-
- -
-
-
- - -
新建员工和重置密码时使用的默认密码
-
-
-
考试设置
-
-
- - -
-
- - -
-
-
- -
-
-
-
-
- - -
-
-
关于系统
-
-
-
-
- -
-
-

道路救援企业培训系统

-

版本 1.0.0

-
-
-
- - - - - -
技术框架Spring Boot 3.1.2
前端框架Bootstrap 5.3.2
数据库MySQL 8.0
ORM框架MyBatis Plus
-
-
-

Copyright © 2024 道路救援企业培训系统. All rights reserved.

-
-
-
-
-
-
-
-
-
- - - - - - diff --git a/training-system/target/classes/static/system/user.html b/training-system/target/classes/static/system/user.html deleted file mode 100644 index 46b50b9..0000000 --- a/training-system/target/classes/static/system/user.html +++ /dev/null @@ -1,171 +0,0 @@ - - - - - - 员工管理 - 道路救援培训系统 - - - - - -
- -
-
- - -
-
-
-
员工管理
-
-
-
-
- - - -
-
-
-
- - - -
员工信息用户名部门角色状态创建时间操作
-
- -
-
-
-
-
- - - - - - diff --git a/training-system/target/classes/static/training/detail.html b/training-system/target/classes/static/training/detail.html deleted file mode 100644 index 0a01417..0000000 --- a/training-system/target/classes/static/training/detail.html +++ /dev/null @@ -1,183 +0,0 @@ - - - - - - 培训详情 - 道路救援培训系统 - - - - - - -
- -
-
- - -
-
-
-
-
-
- - - - - - diff --git a/training-system/target/classes/static/training/my-training.html b/training-system/target/classes/static/training/my-training.html deleted file mode 100644 index 7fad7e9..0000000 --- a/training-system/target/classes/static/training/my-training.html +++ /dev/null @@ -1,188 +0,0 @@ - - - - - - 我的培训 - 道路救援培训系统 - - - - - - -
- -
-
- - -
-
-
-
-
我的培训
-
-
- -
-
-
-
-
-
-
-
- - - - - - diff --git a/training-system/target/classes/static/training/plan-edit.html b/training-system/target/classes/static/training/plan-edit.html deleted file mode 100644 index 9005478..0000000 --- a/training-system/target/classes/static/training/plan-edit.html +++ /dev/null @@ -1,538 +0,0 @@ - - - - - - 编辑培训计划 - 道路救援培训系统 - - - - - - -
- -
-
- - -
-
-
-
-
-
基本信息
-
-
- -
- - -
-
- - -
-
-
- - -
-
- - -
-
-
-
-
-
-
-
参与人员
- 0 -
-
-
-
- -
-
-
- - -
-
-
-
-
加载中...
-
-
-
-
-
-
-
-
培训内容
- 0 -
-
-
-
- -

请添加培训内容

-
-
-
-
-
- -
添加知识学习
-
-
-
-
- -
添加考试任务
-
-
-
-
-
-
- 返回 - - -
-
-
-
-
-
- - - - - - - - - - - - diff --git a/training-system/target/classes/static/training/plan.html b/training-system/target/classes/static/training/plan.html deleted file mode 100644 index 0692f8f..0000000 --- a/training-system/target/classes/static/training/plan.html +++ /dev/null @@ -1,216 +0,0 @@ - - - - - - 培训计划 - 道路救援培训系统 - - - - - - -
- -
-
- - -
-
-
-
-
培训计划
- 创建计划 -
-
-
-
-
- - -
- -
-
- -
-
-
-
-
- -
-
-
-
-
- - - - - - diff --git a/training-system/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/training-system/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst deleted file mode 100644 index ac86305..0000000 --- a/training-system/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst +++ /dev/null @@ -1,176 +0,0 @@ -com\sino\training\module\exam\dto\ExamDTO.class -com\sino\training\module\system\vo\CenterVO.class -com\sino\training\module\training\dto\TrainingPlanQueryDTO.class -com\sino\training\common\utils\JwtUtils.class -com\sino\training\module\exam\service\impl\ExamRecordServiceImpl.class -com\sino\training\module\system\service\impl\UserServiceImpl$1.class -com\sino\training\module\exam\dto\QuestionDTO$OptionDTO.class -com\sino\training\module\training\entity\PlanProgress.class -com\sino\training\module\system\dto\GroupDTO.class -com\sino\training\module\training\mapper\PlanProgressMapper.class -com\sino\training\module\training\vo\TrainingPlanVO$PlanExamVO.class -com\sino\training\module\exam\service\impl\QuestionServiceImpl.class -com\sino\training\module\exam\entity\Question.class -com\sino\training\common\dto\FileDTO.class -com\sino\training\module\training\controller\TrainingPlanController.class -com\sino\training\common\enums\TargetType.class -com\sino\training\module\exam\entity\ExamTarget.class -com\sino\training\module\exam\service\impl\QuestionServiceImpl$1.class -com\sino\training\module\training\vo\MyPlanVO$ExamProgressVO.class -com\sino\training\common\config\WebMvcConfig.class -com\sino\training\module\exam\mapper\QuestionCategoryMapper.class -com\sino\training\module\exam\dto\AutoPaperDTO.class -com\sino\training\module\knowledge\service\KnowledgeService.class -com\sino\training\module\system\service\impl\OrganizationServiceImpl.class -com\sino\training\module\exam\service\impl\ExamServiceImpl$1.class -com\sino\training\module\system\vo\OrgTreeVO.class -com\sino\training\module\exam\vo\QuestionVO$OptionVO.class -com\sino\training\module\auth\dto\UserInfoResponse.class -com\sino\training\module\auth\service\impl\AuthServiceImpl.class -com\sino\training\module\exam\controller\QuestionController.class -com\sino\training\module\system\service\impl\DepartmentServiceImpl.class -com\sino\training\common\enums\QuestionType.class -com\sino\training\module\system\controller\DepartmentController.class -com\sino\training\module\system\service\impl\CenterServiceImpl.class -com\sino\training\module\auth\dto\LoginResponse.class -com\sino\training\common\result\Result.class -com\sino\training\module\exam\vo\ExamPaperVO$ExamQuestionVO.class -com\sino\training\module\exam\entity\QuestionCategory.class -com\sino\training\module\exam\service\impl\ExamServiceImpl.class -com\sino\training\module\knowledge\dto\KnowledgeDTO.class -com\sino\training\module\system\controller\UserController.class -com\sino\training\common\config\SecurityConfig.class -com\sino\training\common\service\FileService.class -com\sino\training\module\training\service\TrainingPlanService.class -com\sino\training\module\knowledge\vo\KnowledgeVO.class -com\sino\training\module\system\service\UserService.class -com\sino\training\module\exam\entity\Paper.class -com\sino\training\module\system\controller\GroupController.class -com\sino\training\module\knowledge\controller\CategoryController.class -com\sino\training\module\training\vo\TrainingPlanVO.class -com\sino\training\module\knowledge\mapper\CategoryMapper.class -com\sino\training\module\system\mapper\DepartmentMapper.class -com\sino\training\module\auth\dto\WechatLoginRequest.class -com\sino\training\module\exam\service\impl\ExamRecordServiceImpl$1.class -com\sino\training\module\system\dto\CenterDTO.class -com\sino\training\module\knowledge\service\CategoryService.class -com\sino\training\module\exam\dto\SubmitExamDTO$AnswerDTO.class -com\sino\training\module\exam\service\QuestionService.class -com\sino\training\module\exam\vo\ExamPaperVO.class -com\sino\training\module\knowledge\entity\Knowledge.class -com\sino\training\module\system\service\CenterService.class -com\sino\training\module\system\dto\PasswordDTO.class -com\sino\training\module\exam\dto\QuestionCategoryDTO.class -com\sino\training\module\exam\vo\ExamVO.class -com\sino\training\module\training\dto\TrainingPlanDTO$PlanKnowledgeDTO.class -com\sino\training\module\exam\dto\PaperDTO$PaperQuestionDTO.class -com\sino\training\common\config\SwaggerConfig.class -com\sino\training\module\training\mapper\TrainingPlanMapper.class -com\sino\training\module\system\mapper\UserMapper.class -com\sino\training\module\exam\service\impl\PaperServiceImpl.class -com\sino\training\common\annotation\RequireRole.class -com\sino\training\module\auth\dto\LoginRequest.class -com\sino\training\module\exam\dto\SubmitExamDTO.class -com\sino\training\module\training\mapper\PlanExamMapper.class -com\sino\training\module\training\vo\MyPlanVO$KnowledgeProgressVO.class -com\sino\training\module\training\service\impl\PlanProgressServiceImpl.class -com\sino\training\module\exam\controller\PaperController.class -com\sino\training\module\exam\mapper\ExamMapper.class -com\sino\training\module\exam\dto\PaperQueryDTO.class -com\sino\training\module\knowledge\vo\CategoryVO.class -com\sino\training\module\knowledge\entity\Category.class -com\sino\training\common\service\impl\LocalFileServiceImpl.class -com\sino\training\module\system\vo\GroupVO.class -com\sino\training\module\training\vo\TrainingPlanVO$PlanKnowledgeVO.class -com\sino\training\module\system\mapper\CenterMapper.class -com\sino\training\module\auth\controller\AuthController.class -com\sino\training\common\result\ResultCode.class -com\sino\training\module\exam\vo\ExamRecordVO$AnswerDetailVO.class -com\sino\training\module\exam\vo\QuestionVO.class -com\sino\training\module\exam\vo\PaperVO$PaperQuestionVO.class -com\sino\training\common\base\BaseEntity.class -com\sino\training\module\exam\dto\ExamQueryDTO.class -com\sino\training\module\training\dto\TrainingPlanDTO$PlanExamDTO.class -com\sino\training\module\exam\vo\ExamRecordVO.class -com\sino\training\module\system\service\impl\GroupServiceImpl.class -com\sino\training\module\knowledge\mapper\KnowledgeMapper.class -com\sino\training\module\system\service\OrganizationService.class -com\sino\training\module\knowledge\service\impl\KnowledgeServiceImpl$1.class -com\sino\training\module\exam\entity\Exam.class -com\sino\training\module\knowledge\service\impl\CategoryServiceImpl.class -com\sino\training\module\exam\service\impl\PaperServiceImpl$1.class -com\sino\training\module\exam\vo\ExamVO$ExamTargetVO.class -com\sino\training\common\enums\ContentStatus.class -com\sino\training\module\training\entity\PlanExam.class -com\sino\training\module\system\dto\UserQueryDTO.class -com\sino\training\module\training\dto\TrainingPlanDTO.class -com\sino\training\module\training\vo\MyPlanVO.class -com\sino\training\module\exam\mapper\ExamRecordMapper.class -com\sino\training\module\knowledge\service\impl\KnowledgeServiceImpl.class -com\sino\training\module\training\service\PlanProgressService.class -com\sino\training\module\exam\controller\ExamController.class -com\sino\training\module\system\service\DepartmentService.class -com\sino\training\module\knowledge\dto\CategoryDTO.class -com\sino\training\module\exam\entity\ExamRecord.class -com\sino\training\module\system\entity\Department.class -com\sino\training\TrainingApplication.class -com\sino\training\common\enums\UserRole.class -com\sino\training\module\exam\mapper\PaperQuestionMapper.class -com\sino\training\module\exam\service\QuestionCategoryService.class -com\sino\training\module\system\service\GroupService.class -com\sino\training\module\system\entity\Group.class -com\sino\training\module\system\service\impl\UserServiceImpl.class -com\sino\training\module\knowledge\controller\KnowledgeController.class -com\sino\training\module\training\vo\TrainingPlanVO$PlanTargetVO.class -com\sino\training\module\exam\dto\QuestionDTO.class -com\sino\training\module\exam\service\ExamRecordService.class -com\sino\training\common\exception\GlobalExceptionHandler.class -com\sino\training\module\system\vo\DepartmentVO.class -com\sino\training\module\exam\service\impl\QuestionCategoryServiceImpl.class -com\sino\training\module\system\entity\Center.class -com\sino\training\module\exam\entity\PaperQuestion.class -com\sino\training\module\system\dto\UserDTO.class -com\sino\training\module\training\service\impl\TrainingPlanServiceImpl.class -com\sino\training\common\base\PageQuery.class -com\sino\training\module\exam\dto\QuestionQueryDTO.class -com\sino\training\module\exam\service\PaperService.class -com\sino\training\module\training\mapper\PlanTargetMapper.class -com\sino\training\module\exam\controller\QuestionCategoryController.class -com\sino\training\module\training\dto\TrainingPlanDTO$PlanTargetDTO.class -com\sino\training\common\interceptor\RoleInterceptor.class -com\sino\training\module\training\entity\TrainingPlan.class -com\sino\training\module\training\service\impl\TrainingPlanServiceImpl$1.class -com\sino\training\common\enums\UserStatus.class -com\sino\training\module\knowledge\dto\KnowledgeQueryDTO.class -com\sino\training\common\utils\SecurityUtils.class -com\sino\training\module\system\entity\User.class -com\sino\training\module\exam\vo\QuestionCategoryVO.class -com\sino\training\common\enums\ExamStatus.class -com\sino\training\common\exception\BusinessException.class -com\sino\training\module\auth\service\AuthService.class -com\sino\training\module\system\controller\CenterController.class -com\sino\training\module\exam\mapper\ExamTargetMapper.class -com\sino\training\module\exam\dto\PaperDTO.class -com\sino\training\common\enums\PlanStatus.class -com\sino\training\common\config\MybatisPlusConfig$1.class -com\sino\training\module\exam\mapper\QuestionMapper.class -com\sino\training\common\context\UserContext.class -com\sino\training\common\enums\KnowledgeType.class -com\sino\training\module\system\dto\DepartmentDTO.class -com\sino\training\module\training\entity\PlanKnowledge.class -com\sino\training\common\interceptor\AuthInterceptor.class -com\sino\training\module\system\controller\OrganizationController.class -com\sino\training\module\exam\service\impl\ExamRecordServiceImpl$AnswerDetail.class -com\sino\training\common\result\PageResult.class -com\sino\training\module\system\vo\UserVO.class -com\sino\training\module\training\entity\PlanTarget.class -com\sino\training\common\controller\FileController.class -com\sino\training\module\exam\dto\ExamDTO$ExamTargetDTO.class -com\sino\training\module\training\mapper\PlanKnowledgeMapper.class -com\sino\training\common\context\UserContextHolder.class -com\sino\training\common\config\MybatisPlusConfig.class -com\sino\training\module\exam\dto\QuestionDTO$OptionListDeserializer.class -com\sino\training\module\exam\mapper\PaperMapper.class -com\sino\training\module\exam\service\ExamService.class -com\sino\training\module\exam\vo\PaperVO.class -com\sino\training\module\system\mapper\GroupMapper.class diff --git a/training-system/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/training-system/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst deleted file mode 100644 index 6cd74a1..0000000 --- a/training-system/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +++ /dev/null @@ -1,149 +0,0 @@ -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\exam\controller\ExamController.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\exam\mapper\PaperQuestionMapper.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\common\base\BaseEntity.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\knowledge\entity\Category.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\training\mapper\TrainingPlanMapper.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\exam\service\ExamService.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\exam\service\PaperService.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\exam\vo\ExamPaperVO.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\knowledge\controller\KnowledgeController.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\common\dto\FileDTO.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\system\vo\OrgTreeVO.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\common\annotation\RequireRole.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\exam\service\impl\ExamRecordServiceImpl.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\common\config\SecurityConfig.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\exam\vo\QuestionCategoryVO.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\system\entity\Department.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\system\service\impl\CenterServiceImpl.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\system\dto\PasswordDTO.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\common\enums\TargetType.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\exam\service\impl\ExamServiceImpl.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\exam\entity\Exam.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\system\service\CenterService.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\training\mapper\PlanKnowledgeMapper.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\common\enums\KnowledgeType.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\system\service\impl\GroupServiceImpl.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\knowledge\service\CategoryService.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\system\service\impl\OrganizationServiceImpl.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\common\utils\SecurityUtils.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\common\base\PageQuery.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\knowledge\controller\CategoryController.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\system\service\GroupService.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\system\mapper\UserMapper.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\training\entity\TrainingPlan.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\exam\dto\SubmitExamDTO.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\system\dto\DepartmentDTO.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\auth\dto\WechatLoginRequest.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\auth\controller\AuthController.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\exam\dto\ExamQueryDTO.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\exam\service\QuestionCategoryService.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\training\entity\PlanProgress.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\knowledge\vo\KnowledgeVO.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\knowledge\mapper\CategoryMapper.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\system\dto\UserDTO.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\system\entity\Group.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\common\enums\UserStatus.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\system\dto\CenterDTO.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\system\service\UserService.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\training\service\PlanProgressService.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\common\enums\ExamStatus.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\exam\vo\PaperVO.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\exam\dto\ExamDTO.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\exam\mapper\QuestionMapper.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\system\mapper\CenterMapper.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\common\result\ResultCode.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\system\controller\OrganizationController.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\common\interceptor\AuthInterceptor.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\exam\service\impl\PaperServiceImpl.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\exam\mapper\QuestionCategoryMapper.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\TrainingApplication.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\training\entity\PlanKnowledge.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\training\vo\MyPlanVO.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\system\dto\GroupDTO.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\system\mapper\GroupMapper.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\knowledge\entity\Knowledge.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\system\controller\DepartmentController.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\system\dto\UserQueryDTO.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\exam\entity\ExamRecord.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\exam\entity\ExamTarget.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\exam\entity\PaperQuestion.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\system\controller\CenterController.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\knowledge\vo\CategoryVO.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\common\enums\ContentStatus.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\training\service\impl\TrainingPlanServiceImpl.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\exam\dto\AutoPaperDTO.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\exam\mapper\ExamTargetMapper.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\exam\service\ExamRecordService.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\system\controller\GroupController.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\system\vo\UserVO.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\auth\service\AuthService.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\system\vo\DepartmentVO.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\knowledge\service\KnowledgeService.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\knowledge\mapper\KnowledgeMapper.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\common\enums\UserRole.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\training\controller\TrainingPlanController.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\common\enums\QuestionType.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\exam\dto\PaperDTO.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\system\vo\CenterVO.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\training\vo\TrainingPlanVO.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\common\config\SwaggerConfig.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\training\dto\TrainingPlanQueryDTO.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\training\mapper\PlanTargetMapper.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\common\service\impl\LocalFileServiceImpl.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\system\mapper\DepartmentMapper.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\common\interceptor\RoleInterceptor.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\knowledge\dto\CategoryDTO.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\exam\vo\ExamVO.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\exam\controller\PaperController.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\system\controller\UserController.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\training\entity\PlanExam.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\knowledge\dto\KnowledgeDTO.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\common\service\FileService.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\exam\mapper\PaperMapper.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\auth\dto\LoginResponse.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\common\result\PageResult.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\exam\dto\QuestionDTO.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\knowledge\dto\KnowledgeQueryDTO.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\exam\mapper\ExamMapper.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\training\service\impl\PlanProgressServiceImpl.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\auth\dto\UserInfoResponse.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\exam\controller\QuestionCategoryController.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\exam\service\QuestionService.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\exam\dto\QuestionCategoryDTO.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\system\service\DepartmentService.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\system\service\OrganizationService.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\exam\entity\QuestionCategory.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\training\entity\PlanTarget.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\common\exception\GlobalExceptionHandler.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\system\service\impl\DepartmentServiceImpl.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\exam\entity\Paper.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\exam\service\impl\QuestionCategoryServiceImpl.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\common\controller\FileController.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\training\mapper\PlanExamMapper.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\auth\service\impl\AuthServiceImpl.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\exam\service\impl\QuestionServiceImpl.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\exam\vo\ExamRecordVO.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\auth\dto\LoginRequest.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\exam\entity\Question.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\common\exception\BusinessException.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\common\context\UserContextHolder.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\common\config\WebMvcConfig.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\common\context\UserContext.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\system\vo\GroupVO.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\exam\controller\QuestionController.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\training\mapper\PlanProgressMapper.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\exam\dto\PaperQueryDTO.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\exam\mapper\ExamRecordMapper.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\exam\vo\QuestionVO.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\system\entity\Center.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\system\entity\User.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\common\utils\JwtUtils.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\training\service\TrainingPlanService.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\common\result\Result.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\knowledge\service\impl\KnowledgeServiceImpl.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\system\service\impl\UserServiceImpl.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\exam\dto\QuestionQueryDTO.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\knowledge\service\impl\CategoryServiceImpl.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\common\config\MybatisPlusConfig.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\common\enums\PlanStatus.java -D:\SINO\AI-project\training-system\src\main\java\com\sino\training\module\training\dto\TrainingPlanDTO.java diff --git a/training-system/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst b/training-system/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst deleted file mode 100644 index 13cd125..0000000 --- a/training-system/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst +++ /dev/null @@ -1,34 +0,0 @@ -com\sino\training\module\exam\controller\QuestionCategoryControllerTest$UpdateTest.class -com\sino\training\module\auth\LoginIntegrationTest$TokenValidationTest.class -com\sino\training\module\exam\controller\QuestionCategoryControllerTest$DeleteTest.class -com\sino\training\module\exam\service\QuestionCategoryServiceTest$CreateCategoryTest.class -com\sino\training\common\utils\JwtUtilsTest$TokenIntegrityTest.class -com\sino\training\module\auth\service\AuthServiceTest$GetCurrentUserInfoTest.class -com\sino\training\module\exam\controller\QuestionCategoryControllerTest$GetTreeTest.class -com\sino\training\module\exam\service\QuestionCategoryServiceTest$GetCategoryTreeTest.class -com\sino\training\module\exam\service\QuestionCategoryServiceTest.class -com\sino\training\common\utils\JwtUtilsTest$GenerateTokenTest.class -com\sino\training\module\auth\LoginIntegrationTest$LoginResponseTest.class -com\sino\training\module\exam\controller\QuestionCategoryControllerTest.class -com\sino\training\module\auth\LoginIntegrationTest.class -com\sino\training\module\exam\service\QuestionCategoryServiceTest$GetCategoryDetailTest.class -com\sino\training\module\auth\service\AuthServiceTest.class -com\sino\training\module\exam\controller\QuestionCategoryControllerTest$CreateTest.class -com\sino\training\common\utils\JwtUtilsTest.class -com\sino\training\module\exam\service\QuestionCategoryServiceTest$DeleteCategoryTest.class -com\sino\training\module\auth\LoginIntegrationTest$PasswordLoginTest.class -com\sino\training\module\exam\controller\QuestionCategoryControllerTest$GetDetailTest.class -com\sino\training\module\auth\controller\AuthControllerTest.class -com\sino\training\module\auth\PasswordEncoderTest.class -com\sino\training\module\auth\controller\AuthControllerTest$GetUserInfoTest.class -com\sino\training\module\exam\service\QuestionCategoryServiceTest$UpdateCategoryTest.class -com\sino\training\common\utils\JwtUtilsTest$GetUserIdTest.class -com\sino\training\module\auth\service\AuthServiceTest$LogoutTest.class -com\sino\training\common\utils\JwtUtilsTest$IsTokenExpiredTest.class -com\sino\training\module\auth\service\AuthServiceTest$LoginTest.class -com\sino\training\common\utils\JwtUtilsTest$GetUsernameTest.class -com\sino\training\module\auth\controller\AuthControllerTest$LogoutTest.class -com\sino\training\common\utils\JwtUtilsTest$GetRoleTest.class -com\sino\training\common\utils\JwtUtilsTest$VerifyTokenTest.class -com\sino\training\module\auth\controller\AuthControllerTest$LoginTest.class -com\sino\training\module\exam\controller\QuestionCategoryControllerTest$GetListTest.class diff --git a/training-system/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst b/training-system/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst deleted file mode 100644 index 5aa3964..0000000 --- a/training-system/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst +++ /dev/null @@ -1,7 +0,0 @@ -D:\SINO\AI-project\training-system\src\test\java\com\sino\training\module\auth\LoginIntegrationTest.java -D:\SINO\AI-project\training-system\src\test\java\com\sino\training\module\auth\PasswordEncoderTest.java -D:\SINO\AI-project\training-system\src\test\java\com\sino\training\module\auth\service\AuthServiceTest.java -D:\SINO\AI-project\training-system\src\test\java\com\sino\training\module\exam\controller\QuestionCategoryControllerTest.java -D:\SINO\AI-project\training-system\src\test\java\com\sino\training\module\exam\service\QuestionCategoryServiceTest.java -D:\SINO\AI-project\training-system\src\test\java\com\sino\training\common\utils\JwtUtilsTest.java -D:\SINO\AI-project\training-system\src\test\java\com\sino\training\module\auth\controller\AuthControllerTest.java diff --git a/training-system/target/test-classes/com/sino/training/common/utils/JwtUtilsTest$GenerateTokenTest.class b/training-system/target/test-classes/com/sino/training/common/utils/JwtUtilsTest$GenerateTokenTest.class deleted file mode 100644 index 336d0d8631fe2a0ee71db9e589dc472ea53806de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3270 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 diff --git a/training-system/target/test-classes/com/sino/training/common/utils/JwtUtilsTest$GetUserIdTest.class b/training-system/target/test-classes/com/sino/training/common/utils/JwtUtilsTest$GetUserIdTest.class deleted file mode 100644 index c12751abc89000e535bf5e589431583e781d425d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1954 zcmb7FO>Y}j6g|)RaNQa?KsJVZ;DGHBx&p5IBnt>cGbiloH6!Hn2!Qt z!-7Q-5^PeC3PMyYKu9e@YLlo7*z-T)>ioyRx~0nu9o$JbbOIa+)Dx-@kG8C z{TK)%s^BPM0?9)_3G|c${sM`1Nv67(Df#&?W!I*jssG)Pfux$L2bUzn=M|hsT%fn~Sa*TZX29TV^L5`}1Y<~s zF|J?&lLBWgyQFFkli-$FUAC@j>xMe*Zy1*82t?}E+?q!9Q_T!u zv9_l0LKrV9cnL2vv2EUCjD|D!k*8I1mcY0av(1}S`Blndm@EaOIO$4RB#GA*T#(h> zZ8%x4QW2Pnw_AVmaitP@fzBDLs0$2a3{%f~)m7cjX{#0P#4=VvtK>D?kn3QxQ@%!K z?=Uc}FFM7?xS+dhR`Hro0VC@2->5*m_QRL8+qZo7!xO_hk2d!H+SvL2$J)K0ckkZcz4OKH#;>(o zTj|-Bh|_glTVk&3d8+o^PY3xkeYGRYmS-3A%Z8NeXmb;tlnD|z^91r)imw;RdvNdT zt(|Yaeax!%@TPx# diff --git a/training-system/target/test-classes/com/sino/training/common/utils/JwtUtilsTest$GetUsernameTest.class b/training-system/target/test-classes/com/sino/training/common/utils/JwtUtilsTest$GetUsernameTest.class deleted file mode 100644 index 6527381cd0f7bf79a21c468f123149344b322161..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1900 zcmb7FTW=dh6#mA!*l{+A>o$eZ(i)nkzBJizzqm~aNiPW-r?jr&t=c$)GiJRTc4v!t zQ>%$)O`^PO{i z|DU_R12~EEJ&2$qicSq(=w`^5oto|m+tHXu2q=NGEHtPGzZEOLUO zBb_PrpdSNKBsA}7zjgOh1=XUB`-Sf zbDQDa^md;u`-{>g8uR~qqQc0x0uLW4gu@z+VuYc$(xjVVq}643yRCsVGErnTy${&=!|WqWx4`C+%%4cvP`v*?`ipNW6_fk78WI zbIN;W$1fRrgm?M_-?WNO3@=c|g-slb#WATeuI#>~;bm2=-NGyQmc=lh-f2ClX31wt z44qTXB4-#dgv|?nZGpQ*bHSpMq~VlJt7N)D?Zd-P)m;oHcjIPzkLIbp=D1vP7SEe5 z^{wPCnH*`M_Hs$Z85Gv#3talH?fuu}RJTF+3SYCvL-MJ_Re7snz%X>dx234@lJEot zFlpP4G-ZR~gNCA^>Qh70cUcgGpbCPlFdTV|dRlnPmibYE>{Ae3LB|oL_3u8dU%MK> zO^v43@2+hAv9kW{_w}D{Z2b81#`RA&R&Lg>uC0IdIm2*klrs%JABnTUCM^cegFBAqW1^uf(9*4DrLdJ9FT%+`<8|NG~ zN3|K7`g_V!y+HH~Y#X#l(a?_3{AP)S8rvjw(61M-(D|z*P0$*lHJ;7g2FtD?`YY`s zc#Xc@VD$YBuhVyb;}-HbK|8u1Sfdgnxr>tgae{;iXmm}P^+~N9<+8WHZlN!J2YZu4 z$pdT^PaEM`ZWTx7j^Dwt-bN2*fI0Y$E6nJUu`k{w5R; tTQV>hdhesGDxa*K&vO*O40(xQc1!(M6Ow_sK-rH1t#Psuq5r9Q;9unr7H0qe diff --git a/training-system/target/test-classes/com/sino/training/common/utils/JwtUtilsTest$IsTokenExpiredTest.class b/training-system/target/test-classes/com/sino/training/common/utils/JwtUtilsTest$IsTokenExpiredTest.class deleted file mode 100644 index 546130dd63935eb1c11d8dee748665ed3f31beb3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2415 zcmb7G+fx%)82_C>NLZHJDijN1TB+n>Sfnkj4MY*7h6b>JQR#&)$pJPbyUgxJ>s#O2 znZD}yP^b2}FP+XPGIplE_y3UL59m{;x9{vO7;X+^COO}^ec$i*-A?}a_xbMthEWJ1 zz>vtBW!2UVQ*|s&H*{lJrIoU2s1-*q+3Lhy=Y|mGxb4)V7QqneWP}iANFU>BPsW}z zSGjTZ>owit1)+_h&RNmzo_>a8_86*C5+pQ)Aj@b(6GKZ;yQ8TkjgU_-7I|JM9wH`A znxQ5d%hiL<$Y_Pa5H9+37-C1YN%l^nErfO%Z=i#r>6N{#X)H5@?r5b7pI%}(5uJ!- zcWq_1YD|Aytjqza$X$$an|mh_b#bdJJvVR{aaHc?nU(LWs*q;5@?_(^^(F+vb*2 zq@=RAs;%kjh`XShhRq;(yK^fV1x=04$Fc`sS+prR^Uf91EOE{7G*DRjpoY*d;{pa4 z;zz$qA=B+~tz>hCzUVQHcB3JT_bJD0p0~IY#s>^N4&`&wTS%_*d&wo!N>ZvNZGBmk zRC1tyU{JzEd=x@T#t?=XE(pB#nh4O6rIqT5(H|(%0tB zxXw!jhKtn^@bdokarV!|a$#H|^xQ4P;D7Gt?+)S2Q5j>xlXVnrtHQ$=r*zW|%5J^T z=ZNZM=#L(?Yy|97EXPngY8J@R%~{>xQkCw zm^q-iq^Ra6xwB#xu4}@(4!20_x!rlZkQ3D0LRy&NPQ@~|vm)rzRrZ$-C6DJj3IdyF zI5kr-9KFnQx~&t95yLPYO~j4tb-DRmtWYyji%NmDA>uynKFt>&5+-Km54l<#O*HdfUxbgl?Olh%5!er?B1K z89EP9?YQUnYR-6BvCDOy=FZKBKW#qvZXZNXk2GsmtUMprMf_X0tqXVbiMGkmeTYk@ z=m;;6H(FiI9@x#N-*5f$fXYJbUNgm$B4-S0kE12gSSSEWW>@19h7h4wOrjT%wX}$L zjHFunHsWIhaE+uijR6{^c;YE);?Ge3E6oDP&~F{RCBUDUpx<`y6h1+gW^~@w#xO~8 zkh0{P780h=M8||$8$s027>hqa%@Z_B8#tkyQaaf>PG|kK#5&FncWt0|9m$)otSThURN$nY!~Y^HIJ#v8PgvvHHeTRW&86DmRf z(r@U#{S5DB6Uuwa;08WSDCv{9Oc;e+jdjw;dY-VRPrF#JRAKEVFMx^v2Vu0ZdV291 z5NAyoWUWXu#l;=>O!~N~gW@(6LKpWL1Tg3`s5ywiJmLLphk>9e!qx8MQmzuPq0W84 znuN1h2O3!?+E`ar2-|%ijlNNKkkQWx^A}_$fG>Bp7ijK#^($!ZCc`3)5|OE;Zyxv` Drb3sP diff --git a/training-system/target/test-classes/com/sino/training/common/utils/JwtUtilsTest$TokenIntegrityTest.class b/training-system/target/test-classes/com/sino/training/common/utils/JwtUtilsTest$TokenIntegrityTest.class deleted file mode 100644 index 59c272beee745b47d3dbb65d7aa8017c5c389ae9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2491 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 diff --git a/training-system/target/test-classes/com/sino/training/common/utils/JwtUtilsTest.class b/training-system/target/test-classes/com/sino/training/common/utils/JwtUtilsTest.class deleted file mode 100644 index 59912093c6999094c70a10122f508da779578a6d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1795 zcmbVNQFBv86#h0%xgiZu0-``ggj$+nxKOoNLctQ!niz_crcq~{acgK-=ZnB4XrdamyUZTJ4>wrm=KLpN2R%q@Yj*<8axO5jp6?6_J5p=% z69#V2C||pkM`puL(r_?#7!$}iIFi9p922;Fz}&jjtex5(Kndik2h1#_aGb2QY(~z!q|gLgByfQtf0Utw3npe^7$^!%Q@-x4@6TgeR-vfBlLiF#?h{>^%+ zSS!^9vO@s_CIUx_VW5o{n1+RVky85d^Kz{uASwdMVz|YPV^tN%wO(gaMs;t~rzcwt zo1WkBB4yVDXVN@SS|ESWYqL6%={Pmq=n9;!^#Y?hvZ1sh=yDK*#6TBd zEYDc^qW*mEr{~}A{rULWA5VVx>*pV-(Hi0INh^hR@Ug(H1NNw;FIQ{eh2JXWQtg}k?z0KfCXh{+pTMgi681AM~f{~rM50r@*4 z)^Es2wRU3>`t|P$ER9w_kdbHPO9+8XIiRoTds<7jTlV#fqVsj-*$+cf@pb0($V;uQ}a&`vOcn<N_Uy#mDX0uOm zGM=6}iK(YJ$K@;ZEc1Y~q&|gHc$;+34ON;MRB{<(d0eGU;u^;U=1CaL6Zn9?4>dl* z0v(h5FS(9I6!@og8_Ou7MDLB*JAoC>7n!t5TcG`vc8Ru3dz-dGyG;8TZIQML{0nmb B_j3RM diff --git a/training-system/target/test-classes/com/sino/training/module/auth/LoginIntegrationTest$LoginResponseTest.class b/training-system/target/test-classes/com/sino/training/module/auth/LoginIntegrationTest$LoginResponseTest.class deleted file mode 100644 index bdbe44d871f8e9ab8b6ca45d163131506e4d8736..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3890 zcmb_f*?SXJ6#w0}bkcN6OB57EMXcHdJG7`M!KJiCQj@l}weG?+xoxLSX2Q&*Ew12# z$R;XPa6?=^^#xooAh^8x`QrcJXHuTz%_rsa+?i>b+Moe_NM`2DJ?H$+e&(lhr@jYp z2R@ci!q5^m5{jkihGLtlrfd4Jk}zVaI9Jq^J)(q-VNDO|HXk-sTQl^2ZrK$m!vYEA zG9>sI+Amx}ts}OVTS-H=xRA+EZjWeI?J9^IO*3}P4s9|XOXFW07aLw=KTT%qkk7`ut30i<`Qd;0%lF!n6AOY?GWCtRL`UDTB{pZEjgDxUZD4Y=*l>wX6xlj8%Z)Y8lsH zIfIliqGOTqC_xPy=CEQVg{UEul+e*J#U@nB1RqpL^LU)wO2j=M^kD@6wWX}k3D-j;k)c&nWicC#wPfs}1*4iKH?%LGZ*WJZH zxmdupa~UbUR-su!i;UH{nW3`~%e-h5Wd`L=)S&v(Z5N?gR}7y2*^vyl%2?l2URsNwgmp4?7b>(yQC~&! zG6W_}&E^AYJjGirw`dq{$j_@>63r_v5uUqcv|>FKjpt5=&H2nTWmwR=7Z*CRw;df4 zHpsXK8yQv>l@(r%5>WE+kYOem#tO%L9;&|;K#@s6Z8jCRTce_VTZFk2_eu!Mh=8)c zwJ6M{BVx7*2!RpRj*d7zpxm-mJ4MZ)y{l_TAFh)F5>>Uj7``~Luiz0xJR`|oYb3FP5-5F3(QKVCw`72Md}SADj_C= zV~AnVtYT-u5dB6P7xmvwZhlJOcYkV+?VI^+iR)bknymEE?yIQihHB z{UX&7^*z(6pj5*Oq_g5#?u~qS1K{cO&^}61t9O7SWJA_ zK1(#Y8t-z5&l7R_tJBk`4^JOGGQEFC=GB8fyhwA&V>gXBvA#rpYHg2%x_o$<;S%p% zj3-soPSEsnf$WyCM*u13lbU5yOITBPG22}I099=pWi3GqYdUw0>Q@KjLI-U7$ zD!X%kX4m1&{(YHK2hRL(AoKQnnWKBMQ^%*@dSUv&r`eq+e*NJ{cKb1c-e;uDDBqxo zAT2HQ;m{p{r8zL%6|r#{c_J?bjYZu=zr_3ksr zrl@2D+eT*#l|#DD&9*qL(wsc8Xx>)_meZ$;pT2%rO^x_?p}P|LRbek(_tD**bQKhT zL*v&dZ8(97FPt;4(0@5?=D_dRPyb8YQ+O4x(G#6_q%pis_X{Wmw$;$h0W3tR5X**1 ztq^KxYS!3)3`m2yV7Vo ziBKBd-{Afd1RimZKDG!yo`jmluuD#Op{Flch%(d ox9R#0QN}F1ORwIe#}XXQy?%f8^$~pFykz*0u72VXl0E|d0*(jSF8}}l diff --git a/training-system/target/test-classes/com/sino/training/module/auth/LoginIntegrationTest$PasswordLoginTest.class b/training-system/target/test-classes/com/sino/training/module/auth/LoginIntegrationTest$PasswordLoginTest.class deleted file mode 100644 index 9b91312ea0d7b55e6ddde82cd659728478ff5c41..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7361 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 diff --git a/training-system/target/test-classes/com/sino/training/module/auth/LoginIntegrationTest$TokenValidationTest.class b/training-system/target/test-classes/com/sino/training/module/auth/LoginIntegrationTest$TokenValidationTest.class deleted file mode 100644 index b3ab6c20f6d0efe64ece89e362aebb86413b81ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6336 zcmd5=X?RrC8GcW;JA|u*;07*@8Z}|bU~nsO3jsRjTTyTI8jJ373E?uqKRa=<}^m$s_AN|+%>3i;-nM{%i475M`Ba=I4 z&iU5&{l4$qH~u~NGJq>^SV4h6ZNLosZ6jj(9ZNGJMx@&xHiNN{?$=^YkH5+6HX@A? zNAI>Y$1o!uy6sFs5sDR*s8HY&SbFRdDm%4IE^0bwegt`sP&s_s-!CQx%^JweCx0^J`JV%VS99u@sd!Pr>;rEdt;T?O~Gu;Q7~7f73y8XM|68e3adE^lvb5va^*)7XQA*L+;4pjO2KTqLkOm#zuf$jc34 zCt#9c5y!L8s>;Wn|8XD%E>UqQE)!5qmoCj(G^$$y^IR@=X||(V{o#V5y2vVVS_(yik$iC=F$VyG$!A(3d;s6Ra9X zfILC4Lbqcfr#>JHxLr3D%W;i@CKb&f`fKyDd5j2wDOx1BLU&?TgaWGaG=p`_6GIc) z@M#4rRJ5amwJk3bGRH}nZr!1%DBU5YFPp>wSv%e0C<8vGig+iPy-r-G;CdA|;4^GH zxy(445W<$mG#Xg8D0Xx5xSkK4>jXq6MA zRf{LV)MWD7-E$ti)8dG)Td_{TZ7RNk+Xb#Z76Wq$WS$MXwU4zrU+cyg2Yh}gzWz} zlZ3R{FXWeMVleorkH$y){^dmP$wU0donQa0%B{d!j%s+}T<1ZpqI@O)%y(CKkd0`^cLMcGCQVn#G z8C)x4HH!UI6;82Ib{T={qs@Vth9pqBq(7iX-DyL?0f8B#qBFk`3@c(0#|Z14hHWrC z^^u6lA}U7|fiqlxdSkq=`Fmqgj)j)nd^&jFq3vf*@^h=jwoq5dz9R(Aon+Hu!;Xfu zwGzb?wV<}Z`+mFyzSud z!^w?LBsV>o*!;Ms;?VHc#6yoHcRZWiv_APTxmi74SEI+C-1-UyX4lp%NV~LcXWFGn zq|Y5Mot}6sZL{<)qkrXihl&KQs;#-G!d0K#Ig}XMe0b}FhXw{d9$KH=w$nSC*l_R2 z(7KO@HcXY2l&E*e zo>qc)OYt7wSMX~&2K|Ot%~2+>26EW)dtCD-qorEFF)fmDdv@7RZS;gLpljUh5osSq@1%D!m^Ek-TKQ1u}66ELvH*$qg!3a@yGS*UOXp`PsVXo91Z)>D9}82A6fi#-z1S4T zR&V(mspU9!cngoF7NiHMJ&&cA9?vX2nO^!#-NtU>~l>APgM92E5Ek^8n|)VeG^!*n{ukb-aq-;`{h3et>`CH8(R? zdVx-5#)p4U-fm{D9z&EKXWp)1V)jsaA!R>F4THplfvxD~S~2$1vLfyuqCVg>?i%L* zSGcmhkt$!64>omzI#cOIn7br4E*&5B$wFMzoE74%z?4%p@Fr&9Endvt#wGZP>y+w= zPdRl&6JJZ4_(MwiQO3mEi9l)MlJO>{fl>aL{*|A0Ej6QQM;PJcci)<2|Ae4rj0($Y8rOgY6~x zVEfH<{NExA-lok31Yep1KjrsSdVYqV%RB|}3;fdEC75^6KS2x#^6~flHj9jqEcyeV QKcLqiVG4at($AUy0VFx|SO5S3 diff --git a/training-system/target/test-classes/com/sino/training/module/auth/LoginIntegrationTest.class b/training-system/target/test-classes/com/sino/training/module/auth/LoginIntegrationTest.class deleted file mode 100644 index dad2dba2741c2f0c878e78771772bef870780771..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1583 zcmbVM%Wf1$6g_1dw{1)?kOu~m0Cr*w!Ikh*q>xC&jw4Isabz2Bqne(YagBSbM%C3e ztdS6c4I37S1)mUQfsjDt1M(jb@)J=`^;j{%=DFy;eXGtrbswkt&wn2M0pNRF7(x$v z6Z8#Z7y1Q8T54U%OxdPfsI_z&1o|%;Yr+o#y(cDD5)25ONnKm!#yT0i;wHguS1&Rx zRS{NY#Wjtcvq3k#3dY%Gos%YMyL4@SJr$U$INy|c$1||uRae3ubhH;ZU5RBiR35ay(#~W{rE9sfvaW)v8C&0MNEgoV!OFtVbJbrjFIEKhSGM}L z6k=fn?3s2p56XrWl@)pb2L$#?)iK>JWwA?4;_}i@i*wc4g-A4jkIA)#DcB2R8;*y? z&Mvz(&5*unSJ&jK7^|yAyQclJVq0PsE>+oz@+SJ5i+y3$uutd8>fUW=tYK)$6+YFo zCi0K&G})qm=k3$hS_}AUXPoLa*dh`DCYft{Zcm3Io z+s_`{dj8uTfr(cT#l+`zSatOUU)P>w=U;(*0j2$TiQW<~<91g|syM3qj~^+%z?WPdKrbdRiBmXD?>O-jENzP4 SleCid6z$iv-{36HWAIs+l=s>9z^t->KN#T?K!13ALq)kbxGEOGDckj!2&V8P9&+Z?8 z&HV=82vi4Fp~{A8Cu*>oVSR#6aUsd&31KLb5TiQ7>K;j!^rH+_o|cdec824MIw5Fj zRgx#hRh|;xSJX*C6Qdbb(z8NT&8Brlh?sYw&u2Uib4{aJu@iDsiHQ`{hN?AK3#Se1 zoOlVf44qLWC1{eY2)fECA~8rQu}o4Fct(#4&mjawji}i~3y-1C|9?4o?Rc5N&SNP_ z?%dyH#|DO;rv1FBv!f|E8tHBCpNJn!Co&<$KX!3MiFIYPgm!3rD4SKr)4`BW>P%g1 zS0)Gbp#uk|PEPcV8k?+hVk0&Y(G=ICaZzJv^Z1ui?2B_XAYRDOHbiepe?T{K>uniZ zgL*XBu*He3*tV=Xfvl#BDJqJRp+wYKizP)Erj!Xq$r_Icb29xx1eAb#qh2V8S zK!**TPV7e)L+gKEN+OrEpqddG+C486(~biSHKu4>pdA_7YU}Ty#i}8HGH~u%~okQ7GlfccBW$?C>$1&)xYj|IO{EcP`C8 z`F-K~5AJ4@ZnJy-$?f^sx!m;Sh3_u?`S{Ay=|}mm9^`M{&)>M8zj`k>_xb$n-Gwhd zN>fdYvzxp7MgHDHS}{NS>9eoDr;*$Tk4cmLec|EWKwxxeq(3~^8yIA8mD6EZSCm|c zCyhi``^X6xYW6V%YNO@VKHb=4a7ZV+=bNu78{VYl02nMih^}&EHfM+8&T9O!>!VDRhVdj4stn`6tyP5qD*Ge z6@0ox?#mViv*}85*fXhC^3!Jp*4k4Q6h)k%#H~XO7V2B zJWFEORs#22MNFVchK3?g`8b2~luYvRB@MgQY@ipw?y@XbN}dgAlEgnxC6lx=P32ol z#s~VljBf;LHJ~3S$Y%!%y)|^F?-uGgNv)&gd5rGsTOWb7{tDaKM_BU^j-SlggLE~% zc7S!LCbU!3a$588I^Lisz)x7KOe{`V#@wB)58!aEce!TpO3%;Oyk!pCff?-DG7HZP z+DDhbT?7kkBGAqBt0(#mW{`~*P$7sDb@WYengXAp*|jt_ME7BOepAB;H3KVf=q}}O zu!O^*G7dY4gPS<)qHE)eatIQKw-!0X3wiKZd6>arKV@O>93|Vxg4Mg1lCwfOJe2bm z+VDO!qpgIBr;rW@r88vKv_d*YiOSoHRP+Ls4l`)?5|v()3ej@)6)AOBq_mO50{S{| zpo=JVQ|Lp+`?`cy$0DsgE7Lklg&rfIRXArBaV-_EP{8wehXxvG!n@QNGq2<3HEv!L PNYc22#!^sl0rh_ai=AGX diff --git a/training-system/target/test-classes/com/sino/training/module/auth/controller/AuthControllerTest$GetUserInfoTest.class b/training-system/target/test-classes/com/sino/training/module/auth/controller/AuthControllerTest$GetUserInfoTest.class deleted file mode 100644 index abb126a3ec8fc246feb514200d5880fe37c8fb34..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4559 zcmb_f?ROky75_a+n%QipO}a=CtXLpGULc!Ntklp*nuI1HFC}lapth6UNp{lRnPp}+ zY4L?dloydV2?$aO1=Nb#NG+SBwG{c}@st06=Xj3fr5?}m{pct3_sq^Fn>KAWr+(O- zdG6eMpL>7z-sj%uw;!K=AHWWLsGvZgE@CCZj$vA1*VYWvFo(hkE1HVyVJ+px!V$}K zZ7Uwv?QjFvjSI_O-Em7$gf$9^RVWAu+;;`4%6I8*pQGEY=Ab223lzIC!zr&7*wKCk zdh3D+VyyyI#X77PC>z#Bv~XObn_UCLdPHt?H{EvY1qv%F`xTT4+;RC0qplUs+S;u< zNy~KfAWE?|h^z1k1y`%sh-(DaFYeWDnL`4~h!#)jU4sHwRkT&MFa1nQOL47=>+mUo z632%lDtRyDtn3fq(*kR>Xu>e1*k@F1#ti~%eKAu@=mJ;g3ih}*V_PRhZ=(LW6UXMB zdu-v?aW$RtFwccN?WdEFsyCi#n?7L%@ zsh2?D^D63aH<@Kt_UQJA5ut}$S4a&elw|Z$*B7c=i+X%P!96M(uv1{mg7;MXy1sFMCFv&VHPl2M*m~Ik;+<<1% zx3021SHf{q0|T;#yUZbr&mMnGuiJ2+f_4=ha+~segam>v_wCl*lx@l&bg9^l`blKK#jM%la#qNXftg_E&D*&WdVmr^?|TNFRr_uBjm3Opoi#%wWN_bT~cH)Sn)yh zfu*-c#TT(xpix@4qEcIbC?z+NC{cNLX1OzE#G|_Hu$&ns0VfwTzX%@8DX1kdu4>N~ z*GMgdX|3leGo5O9s`XxZh z)H{TS6?|2;&9AXdENAO6aW#bs(u{vl(G+El={+vYzBTm$s@SKY0@jYgN$9hQM z{$<=GYdU(?% zJ~tUoGOitxGcvhuotZp2f8y==iLtry+`BoPo&4y^{4Q6iyk1#%H(B~Z-xA=!*LYgCw!~tvw+WFRrPx)teQm0yId9E z9sU<{v;}^TpYnfWh6_K#&$%MMr%m7l-`B9x4wvy|0_&-sYQ=s&rP}#3DBU}W4eiyz zDTLDaWOZm$8rN5cZcL-RI&^CqmHwC8szc#4wp54iOk-QsDHNW<_G#=8m_lRqG+GO= zCqwNFbr+rm)%B+Fz!dhUF*uEQ0YY|$>~6qsrf@KguV=`Q`sAWq;g{u1x; zt(0h|`J5zW%pqpLbT$|`%2>%r?!N%mqO*8mZ{Zodxc4N!KZ)0RrtwDpFjFRtw{t+v z0pU944)8Iv@4vW36kxk3M4Kq$(7(oWO3m2gJ9SxCPSeXXR91jrEqHpCYv0rNanAcF O@ByDe>Xo4U8u%aMQm8@z diff --git a/training-system/target/test-classes/com/sino/training/module/auth/controller/AuthControllerTest$LoginTest.class b/training-system/target/test-classes/com/sino/training/module/auth/controller/AuthControllerTest$LoginTest.class deleted file mode 100644 index b2e106a0d0fbef33d6b957a4d7cba47f29296ba9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7924 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 L=7{5HfI0sMeo(Vo diff --git a/training-system/target/test-classes/com/sino/training/module/auth/service/AuthServiceTest$LoginTest.class b/training-system/target/test-classes/com/sino/training/module/auth/service/AuthServiceTest$LoginTest.class deleted file mode 100644 index b7e2d4176bd3569a00e8fc1928c256308d7e924e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10555 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 HiOK&9Xi;Z7 diff --git a/training-system/target/test-classes/com/sino/training/module/auth/service/AuthServiceTest$LogoutTest.class b/training-system/target/test-classes/com/sino/training/module/auth/service/AuthServiceTest$LogoutTest.class deleted file mode 100644 index 5109df32bf0713ab051d424101a97e327393896f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1838 zcmbVNU2hXt5IvKxwKp4ZL!gDykd#pD1hRob)8Z5wLTN&c6E(qtC$zC|oolUkt^J7T zTV452E(6`@A$(PK>!vRq*9<&MI?}0{b+;1Q!nDF*#q@=@D$By0W@Ry!mxLdT6x^yC z21+FK1S`@XnIKFS{#UTPjug@wbOXIG2$`C-YMHjhQ0A9wqO4L(F|^&AdV5v{uijTu3ZrxLFXJT^n^3n zgv#!I-F&W;#xOqCaNNKMP7uz&31JUiCiE&2wE9k%NT(4?dy(Y4`1gLK*n2rgY(Qwwlr#MGA=6Y4r^0~!9 zjrrv9V`xZoI@*w~<8!*$y0l_3J15&Y5K}gvDQvhbFyWt(^U3vSu6OO_{<-rDR^@0)Nr zp`?3A*fuKi{I;))V8yL0Se{iEf$%u)K-|pRGq$ii|25~e);lJQCnSDLFA0ag3!OmL zMM?USuQBa7ZeRs*{_%7xv(r?(-4@E}JUft2C;Erwm z`txS9`D$%#^WMhL>7mVyAGex!Up@NeW%K^a=7X)D?lDsq-OwwGt5Vf>U`IE`)s!I& z?vl00phSfe_QxsyeDrMdkB3`N9{ly&LqbZKXI(XdjXB5RX=f`|Dt2y diff --git a/training-system/target/test-classes/com/sino/training/module/auth/service/AuthServiceTest.class b/training-system/target/test-classes/com/sino/training/module/auth/service/AuthServiceTest.class deleted file mode 100644 index 64b33c749bca795de8848e4003f0330e02487a0a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2990 zcmbVONpl-T6#m*vMwTZF&K{O*4zZkNY-h*WWJ`8rWXE_>2w@wK+V>s93bS(-avC!sj z6=!jdf=M=4(2lOj>M}?oC!>Es#YI^q8wn=G3%cvu^b|7r7<#AkGBJeX^Xq zeVF0w>h3IQ-lko!7I*Lr?Fnq>lK5vFIbviMJi2S>C5y?0tm*Kfz@Fglm`?c%lV<2v zPIpbYFCRAe(}U}`;lQn);=8`H!b z^QlNvV%}lcy9$4Dk|fLQ@lg@D2JbVa`CFFhJ}T!6!{JqM=$&xKqjJ^KlFDB(eQ7~s zIHM|Jl?q;Jwu~gzbtoqhNNoQqT2iK0u=JvQ#l+R}{NB&c@85a))3;B)zWemSH_z|? zK#3ossXNGJB0L2}hKsfDyWB>Wq<)#ZtywW80$+}B1)nm!T*6xWx!)VOF7;D6Of$}; zh!8(xxbV_;nNIX&p=KP1yS)}Y9!^CSubRxTZDq|gEQl)tz#jU*siP0782!JCt6+GK zcI#-pMr$43#|JfMAL65$vyY+IoK3)}Im?4DI-3l2(5F?n(hQ)ro__R2M_f}xX|ytV z(*6+aS0d^#P5<&5H~^FW)rbKzn57+H(QREQ{5OF~zGC}hC|4h%=>g*Hzat)hgiR%E zlVr=T5?%|5Jtgc5i324Zl*DgnFQFr%j+gM3q$0`lAz!kDUIOkT;7bpXp|ebMJt)bR zp%R9x2A{-wGUNh9`y#d>iQVWy8+y@+6uN1grfEnGqn|P`fILk@L9w`w!9@-h%MMoZ zV@qG*EI8XmJLzo0BaBw{%CBV5?5oGv04B&>k#M7f0LT>~@VBapO* iIm{DNjNq>025#bW+U*K=&A3JM4RY`{tv6}C1N;Y9(^B~W diff --git a/training-system/target/test-classes/com/sino/training/module/exam/controller/QuestionCategoryControllerTest$CreateTest.class b/training-system/target/test-classes/com/sino/training/module/exam/controller/QuestionCategoryControllerTest$CreateTest.class deleted file mode 100644 index cc30aabdc3acdcb00179cb004789ef13c2777fad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5389 zcmb_g`*#%89sk@UFv(^lAqvz-DN58lBulAiB?2x9noT#^klhBUwsEpMNhaByS!ZVR z=u7*e@j*)~SQKit)?!N~KykB4iqeNxv{u{NU-~%hv239KL{GnWW;Qz^8?qodXEQT* z?)^SK-}k)zzp2*%Y{mxyiWu&TXmPKhsG8T*B}G-#K5tx$CS$T!9+BeSh^Csl7K_Qc zcSlk-Ohr?hBvbCw^wFl-S7CZlh7v3huvCPAQijeeM7Fv~mx&+ez_8TpSB&cQ4F13s zBH!qN2jv1p5m#XuL*;-pBza>Jp%CmDkRzPw-Gqv{g`v2nwo5=I!^VpjYdc z;s$)2VOefVKvVnZ{E!q&%E4ZSt7}?oT@?6h(z61e5U~a~GE@+!W;r40W?WWHf0UoN za6ji)fwdy4`H6Bm(IM&9ZVzt3tpaMe9JLI~b8`4qatv8#SXtwD3*f94eJ<0 zq8QS2GpI-H6D|R=`)j+(z~B|J9-m}b_3#D$7n1cMB|>;@UBnvf-LMSx#KE9X~T$Y}QzVYXn5Jp`BcxTdQp-!q8xeVI+9W^y(B%!|hvgnGM>r;%Uak@CZ!ARz z!}VS%q1f3j>tgF7PLA`S6CnX%5uZgDLlYNsQR=#E(aCb@v>&%6l^FRtc~D70c!XJ}2Sw6{%;DpGhfLE%;D z>*xshn|xt^u)VuA6ePf_^TIs$AcfTz&@JF05fXYBTJ!OmXBjtk3#vg0iPt3xOIt#{ zrVx2-7rkOYGDJnlpnNN8R;g%{5(%Em)>$#xD;cJ&kHll%0Vy(QXsS0VnGyv>)Tu1? zc0#EiihuzTgNQNI^Au6wS%#`%T`}b@p7?!+?LrK8ryKV2Vg$h~c(^yuyiB5|j|`)$};SV1Ap=lj?#1D9{NyWg{6g zeG%U87$oxuMg@FP#Fy}8246uk>lTSz65s@LRb;7QN@kLhL32%kB02Oz);U|gEIAVJ zt9V4fqawbBuQS|pDFWsrNI6O|f`bfq6e`^ufvE0%6W+s!?uDn(rwqvPm*DY)hRNxxMO`bQ53{sj+BJi(-vkt z!+Ee32ShxBXNi%i#AWjF2Hp>Hy1Y*Fu4+ium0pF4EQOc1%k|JksFTiHaY)1u@f=aL zwo=2jBag6`Kr>HsR*L7T7tTza$h>kObLeHeBNy;v>V9(O4fpHXu+$Ti1^k5J_W2DQ zt;9(Qc_bnyEOoXeX_}G^V|#X`3_rzT0WXXA8Gg=Cw;&D2Y&Nz{gap;OW?$IXz5RZF zC>)|>nWx)x_|H2_M)?K9jpxT-IyZGVGj`-``iY#Xd!Nkg-IElO>PjUIyVRS_vnPzmUhO&c5< z$o!?4Bu>>02O&SEzMk%2W?gr0kUa(GTtNWVeSo7dIMTSigii4!k?YR z5b+ck5V$vv|hH2NWGlw3V**`Y3|Jcl)qnWXTndvFpb=Rz0lbPCg z{`GyCgU@YPPoD*99Wn8S|6 zqW?>2bOKJ}6#ZXm@4{<%ot|jFMUBy0URNT^Ha_lZ1Nbu~^$%$0UtMUPanLL!;C_SO6578b$|ZDtgXn_z6wwI+kyf5E@HXAP zGmG#l5`ZH-o9i9Q$Z66QvYRx-hLuJ4ja@ zNx=r+h2tht1^64O@proW2jTcn!tq~d!N1Xt4`~?u4`Mh=W59>_kc(@P@|3L7*OKgkCNLh&Aqh|-=_sLfLB_n%rAE&%dzrO(g2cy{P761SM diff --git a/training-system/target/test-classes/com/sino/training/module/exam/controller/QuestionCategoryControllerTest$DeleteTest.class b/training-system/target/test-classes/com/sino/training/module/exam/controller/QuestionCategoryControllerTest$DeleteTest.class deleted file mode 100644 index 1160199122524981c19015308799e485e9a2814e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4910 zcmb_f`&%5<8Ga9!46I{9F!dIbU_%X{VKBy2++2j+C6F$VEJ&K#N{8J8J7jkTXJ&yk zrZsKVczdcAH8*XvYOQUW$EwLj8|{yM`gcG=e(HbFr{9^G-JOL67MuNHXXebA@B7~G z{ch*q|NZJ40DEvzLIuPAxRF*YO*a(VR5e}G$CR{@$fUT!r`5C)H+0)HQYmgKhceu< zHA4@nHXk$0W1;-3L3&Y(DpX5YBSS(BL+lobZ4C1ix4F>3u*ObmR%07OPxKav4+apx zZ4zV|w_`0s-MBibDk+t`&_6QH<3j0f@`}Bep|YuYD1bVwmryU`4s2k!!!U)r;zu>x zP{aIqKhJ*_n|M;p72v!_8nV819sD7w%@b>zM^E9^mGr7UvB6 zRsd|d8y9ip2?*YXd$Cc%eKIy-GsAt$nZ!^vmE=0Z15MF|?g%z7UXswjuxEKfRGT(ijOD)0)?VOGwl!7fC6!o zqE2XTrsTNW9{2J?c{qR_ctpZZ8INKYLr8diMfoOoB<1wP+{ez0mP&BbqIh%>GFX0O z1GX?b_>>Q<8^FZas?~Pe_JoKWf?KSf(&aIj1F`%bd+VY>4+$hAO!ZRc0B2FVA-mjAu_^V zdY8efkU&{4zH{x%i6aBUh)C#?u^-(GPprnkQUWP~HLL$9!>)3zD>8`k=>UEtAu6L6 zeGEIwvZu)BR0CB#5t*KFD(HCGWc$2aZrm2>rKCJa8PeDqHxgX%9+NSEL57-f%g_(1 zcG3yGLV39bY2)yEz!P8OND+ENI4t4EqOKibSYJ@wqf-;*Ce{9?9)Cge*6GWq@KXst zlkqf$89K}2z;uJQv@s0TP8DV7_7{%TRf!^eWMmyw86%+TS#4`+P8rcE@Ca*jZE=#D z+NefFk&;mv@;&qtM~(ic6q8 z*}1rR(Mp=^<-M{}oMxbfN7v)NbXE}ot{|H<6N*WH!>{NvT@ z?_9Y4`CD_RF5EoxVF2UEhzVzs%3srJH2KG-~zK;5jNIjja?_mO933@N0%`i!tB);Pj1ie_H^! zng(3)tEj;XD>UgHg2z)bUJ@kMhdKr$`}<=@hWq*lhr9Zp>ns&!RriLmYWsY+uIqUrR0C7X*}3GL|woOwkQQ|UnWh{=Aa09f*Cd9YHCO|HSz2% zR*B)7VX#Dad?yoplY5W`>t1drjl@A!3|6+&L^r#G%C4J!YSxWccWe<`25CB@EW&(6L4{>_;)^Or6$G!^9MPG!~- z3U(C~JpcLp$r(3a%Fxl^>7b)bWLmTAyaHP2GBSFCV7jtrv#+_%DJgYl+fIhSfRQod zyh{_|w>4*Tj`ZS_WUDCC44aoAr;oVf3F2jAI1-HvMjDjkTH=JDz^QdEBh>N5zHUPt z8|5Bd=VmCST9)WgfpGpvi3U2g2B=W5x;k-gr8|+cx8n^|;7z*QOVYtpe`)gY`<~HPGV2m+`|a_FP8jDtanV-|sFTT91Ea z@#JOv#92P#R z&YdtK1x`3(W&$?gjhRGy^lj@K|ITL`>>uU2kRdR>xX%) zAG?u`q#x^xSMYKPPB-ASg-Cz564DooSv_2!&<)fM3e--bFiaFih{7(K75DofCCh>I k5ykMw1gipn%E$31^z6m)pYf^llHo6O4Nw$|kpC<2Kidc)&Hw-a diff --git a/training-system/target/test-classes/com/sino/training/module/exam/controller/QuestionCategoryControllerTest$GetDetailTest.class b/training-system/target/test-classes/com/sino/training/module/exam/controller/QuestionCategoryControllerTest$GetDetailTest.class deleted file mode 100644 index 311a94f396a839f2c256231fb8236e117ca62c98..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4302 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 ZpUxd$oj?8zpZkXlU(gz(cZ8&C!2fVbfq(!2 diff --git a/training-system/target/test-classes/com/sino/training/module/exam/controller/QuestionCategoryControllerTest$GetTreeTest.class b/training-system/target/test-classes/com/sino/training/module/exam/controller/QuestionCategoryControllerTest$GetTreeTest.class deleted file mode 100644 index 0d25fca5cb6ca8bfb31fe3259a4e3598b16001e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4599 zcmb_f`&$%M7=F)!&azC3WL8>6N(Gb**}Y8-0TJV(K$w}?uzP@k-I;AJT(XPhB`r-Y z&B`uzxBJZy^|AV~r+=ZJ0sSX>`p%hIc0rA$hlhtfbIzRkF7NlA@B7YQ|D5{`z$$#J zAjD7~vyz%)n3m?+x?vh-x0bZxUV>|UP)}+x%XDokk>Iwr$>WY|SZ0mx@@~r>s+oAz zPA>|Ok2wnFs!$MSXqzRmrS;rxw>cLo80NY?hErO_(9k$b@}m(%P^dsvaSi4%6!q%; zx|YxhhL+A=9urC*Az0ki40&bc9R;90Di)xa;reH%AkxO|ej~;i)=Xob<8QnS(m+78 z5DRggf<-E>#|;dt{@dAUq%q9z=59J_0!)TwWsMm}8!fXtTJA4+u946h4aX&57GsHm zn^fG4r3}|vwqQoA&u}fR$sZZ=2YR^4@Nl*`A2$-1{e|Otot=VQEoQexV_Ptf3P4L# z+=^uctdKw1(4whk6`~ZkDY#w59m1^AT$C_GT(Yy3yPj$ECtE`_C4wffVwo{@-i+aVTGFd3X|#M@k9c64i2OeY0lMmpEKZc6Zw z+?}kO7;zu&SMY#}2k{WYT{*cUs3H+oQrzyc>?A{9S#DrYQSTFKT3=eZ<0ahcm`GI) z*&M|q3RbCDjWrC_IoWJW5t#@Gflay_>yZJN>$tk>Q6y^1ax^KB*CxO7?MsUz1FNxC zL5+%9)G<6d69ca#kj|vxwDd9DpR09~45HLikM#-~RBXUw3@dZ8#}^S`&QPG6@w&m3 z%$~hD2RjSpAbHF%)?qYJwl1xVS#dggQM9Poh)oRPUdJ*w>TZvuUMBC&!m$xHYa0Ub zlYkV|YeTz&$5nJ-GsA+6;s%o{D7Pv9^y>+aw{$TqDr*Qbu&h174wA72Pb%1|;wfxn zSesKcY@fbYHj817RLZbEJB7?FUrh3plHqoVdt7&QVX&^EQ*c=^oNC+Fhr)<6%qy)F z@3&TMt28OShCxoNqu=iz-E(UEqt7q?ur~~fPjO~ftcNn5&CM`+85Uo@o{^LwNn^wN zF1_=!FHcl1Q-y^TIqMopPG_}J;49D*8DEsJer_9G2Bm9C6Iw^sq>0!=xG#pS!hxv& za_bPorYit81DVhO1Ir4H{FJ~ zf)^$=Ew$ft(czZ&}~D^ zgT;K&1T#E7TP9?;*ij-<6L)*8_(l<0?#ha{m|70eH*RmX40NiPR0ocuH1V z1@EV!lv!-z4a1GCo+*xEhv69HO0{WPR1HOmrr60t)ay}~t@U~-gOtk7O7#3>(DJLi zt~H!gLLX`-Gild~vEwI454|#W?8l35oEbgzHszH|yH1Vn+dKZ#`LUBnN>-GNo;!N+ z_oJgHK3rKvH;83vpEetAPi@v|%J!{%?7)7Ka_RV~hT8G(PF&i#|LOvlrv*xm)KacX zOOgwcRt!tVzdA=Yjvf4d!W@5P{QPceQ`;=hj`4Md2>$X-Q?3`2FI<&^vJ6YFf=)Am z$KwRdlKQ@{Ot1_3r{RH!zJed{f8xl$WUliM{3-ElZYrLaD8^Fj&T?jm$+WJN{d zen(IF^nVTBLXHf7H%|bXzzjLYK2A;+-`d#Gj!rM4bGukhu zF}y?1bEsnMETV^ZF%Nk{EDO;nK0aM>8hNKNpPj|EA&lTge}2nZEDvF`KPfA|EAIj# zBd8q4y(4&d7>}OCx)7Zqf4O-9{v1K;FrM(2pAMFX@r=I^3l@s`#GdY{dyMp+zVx0z z`~3V7BuDVN1FeON;?{fgs zd*pvUt(?FI^faFU{E)_vXyqvfC+YFyG+g+b&=hbT3E(0yyqpj#elGt4p5KyJ{9@ZM zcK$#7E(c;leHIqCqks%_h)^DNX#GSSkMI~kD+URTA)4*LVM0Za#mC`DE;xKb+drMa z;X**09RUs_*!u_i(@31hfh}k7#;kHDL#9KLOj#Z;rJ#U{@G|V8`_pc$!yatIUW)ar scnsB$MpUtaIe( zXUn!1)u%6f3G zB^#!qscn)ek7)XITYf7>8&xRB3IP=&1XMEgUMI5k`_c*G$2l-mn4^kOznP&ke4WUL z{P3e%fGFYytYoMelP08KQX&+hLt}EBGrgZsF?TSOH8l1MsA0J0+RPKCwg9X4Sk#XI zs{L4vH3DuFu@*NmtSqn#Yw8GtFd-!^IXcX+x}mEvJa?Of4d50Lx8gR26^3kfCiuDe zryBb!@jiyy*<T+k0(7=rPD{F(l2zi$_cn^SlkZj2UXP@^>y2m<&@AFEY$DM#ojX%}Tp>id zohw6CLW^i*NUm;OLu1%`$S|#;A?|{G{6^M8RbU8;*o+S{-1OKy2keve2_;S%Jg|g2 z7|y{3R&fc0s_`M*E#MvzTX8SL?bi~Cp?q>wRv9*WVRM`%*x;3}Eh!mBG2yClA6iB1L>u{{Wk*^r zx*4`LECK5xj!w?Q&DJ4e7j~1QaS!O8h%>an-!-jS8y-7_U51JI(!AW^2$Wchj zrtK+oK2(WLhTDQtT5(cQ&itF=ZUXY-BM1xV77;;|p^ckuN$R?6)5&q^bsl$GN;2WV zm$oSA4KI9dOg!QVw7k8S&2x`wrn%pdrgM3dukS^#fIbm1>|?m280k@ZJJ>BJ6e%{H zCeN>F?db`3wzbAOqmjX`zG#G@z9`CbU!+X(5FQpVAmXEVgrTb#uLXwjLbs?Ilo5E% zAeVF`)Ei2X$4LXrGTx#R*h%B#B0hmZ22r!qc(;^J%R0j*+ogvk!<6-@R5Caw#m5az z4N{GfDDfoRtnVBrlq3uZh>J*oz;5PIT;jWwe2!;Z#5hjS~_XCuExzXB4QK@ z#g7Xo!=pu<^11@&$2gJ#QX*7n40n~}6+E%q;Vlrt!w&1fpX18GKg2=R`b?&ogW(NuD{FQw^8Y zM8{Ox?vKVwHns<4Dn`raOBLaZ)Q{D-#I=OX?fxYZPvXlAm17jcJ(4+UyI!Gbx(?{cj z-ErFD!caqKw~h>Zyjfy-b!v`&BxEBFi8zcSMBG$TGDSoS*N01+YwIRtT^UxWB2zF1 z`#lfcWFwoz^CDirQL>wTlvHs1Yq# zCN`>TlhRO97VvF`yBGFlw2~rKA#ct+3=bzI%DIjSXS z(Zx(MQQtJ66TQmt1K?bJyO_R6NEt9F(yqb`}@-X(-ttd(Z)=l#wQaAl4!=XV%x z>9tfIqWy}Y5E8Abs!=WC1(N0kJGjOynqq@vR+^d;-EOM+Oic={Uu3&oG15tCn$L)I z>dx60pPD_qfA;X{*#oEC0NelM)iamsHr35sJoL^Rhh~l)-?Euz^9?Qu2ou-_9PGIr;p|i?8OXyq!Hd^Yn>79eUxN*T_%(eVV1mmXkeo34ww0SQT#eXHlEM&CRv9XRywFx}&+u zUfqyIL(@5wokPn7Z1Ld=?yC)CvF!>17x17D&R%=%p0djzI$dYclR>|;`myE=9?f7l zgRv~q8BAQjr+ujXf^+nVRd_Rt{TUpvmmhMulxOkvEWRqcH%DZ@$&^pPO2d+~tT$OkkKfz^!lYh%9r|TQ| z8Qld4qo33D7qs%6fnUJh5r@ep{Alph_1y(_y(*)GAO5Dt_mgZD_On{N u#8!LYI-ZB?NGWjrnvnbr0p!D*c{G1pK=Up9&faABJzf0-F$ew+!2bY-k&?#% diff --git a/training-system/target/test-classes/com/sino/training/module/exam/controller/QuestionCategoryControllerTest.class b/training-system/target/test-classes/com/sino/training/module/exam/controller/QuestionCategoryControllerTest.class deleted file mode 100644 index 746722936460a905f4a0c437c2fa9a0776c6d487..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3978 zcmb_fTXbAi8UA)IJ?Zq&h7?+95s_9&GBl@vs5G@DP0}=wOUWct+NyXmvy-0m%sIoE zGfCetGchy z8>#(2QQ#SF!!`rkP27%;E9~)uNvn_#2Emz(P}@Ck(nS0@4~ zIp&g{&FH*D-s*Gxaog>!tPjyeW<~;cpgw`Su*1Mk6Q7d9cdvn83Y&>eHO;!R(@sW< zp}S4AqD`T3TmVzp&BVAagXM#FN@gTY+=E>TMlJ?lq2tDs7_b!XUkzJr{Y?9->Lxv$ zKu27M_nEjKpHbK-E>!9&J*@D+H4^fQYMFqa#peus-o%60L#@?x8SuSHo^;xFi+Xs1 zz_vczR+CM#P3aEoHQ9&QUK$B}KY`ucx{|9c-Gql&?2B(dyZFr9rPtp0@SW2ldB8+B zdT4`^L(F!CTWe)gq0~WVTUvMzn&=ZN8_0Xu4zx#GLhm>6u+TS=-lOw&5ay!2CJfNx z2lLN;_|6NLpPsw?;+${~nHUy}H!tHB+X+015d$f~VU!G29Qr->E*-GPwD#8mP^L#1 zq)i;bV>C#;DL)8@1D2#n)Id?;kI!?=#Bq^mro>X0^ow4Yz?bl41CN{d3T%a~kt3m# z)7F5WvE3ea(owG1&OLudVLQ|KDlCy_853EM`zG4y4)l`r?Pb?iYbM~0yj$e2t_hBy zSUPk0+#loU35q98xPqeSjAJ1P8t@qW$d_X1xK>vX*rx{AjT6X8t#{xF69L$$B!=B5 zScME@HD4kj;im%|P{g!>856TORmsXF28BAG3AwWt-T1a+bE`TK>5{7bnu)LD8^pS{ zWJUu`SejSz6Y-T@KgG7oCZe$a8Wkq}nT)Hdx2&L3;kFS*n9)l+1!vsVU7qKMwzNs2 z(h_wNanT9=sJn~6GGf0cSNb4X3fyZt(3R?ad~Ae?-cpli<+5RT*aqcF2-8x+P53Ue z#j^8Gd`nkOxhqq?n-$iloJr3PiviEtw*r{G*Esu?yURYh+0gB0sc_SP14q_nVncYsAsGGFFn8T=3_2iQs^MB5SIcclcn4 zfH|Ni{6P2GnG+OCr2Jx#(FYyzb;nYTUhyT0a-xA^JFa4-$0_7p`;^ooxwc=vaPHE}Z!exXed*ncADn%2@l0v) zrMb8vvIK|ts2J1|je>!f6-NH|opjxJ@9fchqG);E8TiE->K)7TeOlK0+8XLDH^s=` zUn-2P6%KuJABDE##!&o9A+?68rMJb3-&kA4(iTNA+kU_2>7d)S3kA)JOjHBQMKu~+ zR3T*3S$1wF8rKzP<5k51?qqAO<1J(G%U6}$H}d-;8o!Arq3|uv*Kz!IMB|&hhV~R` z+we5LL)tUZ{%OkdX%x-b?@2!s&7X~|@aGXJ-y_B1s5myZzX$bh#PS@!vJKpg@AGTM z4EO=gas~X5yLBS0o{!uGK5D-RKaWKFpO7e_`AB=iUr=|np37TO3;0;Px`;c- zc4w-DPnPiMd9+iogOuI#xR;#wCKm8O37s-+* z$+Vf`oFA3>0=`(ncv<^E@)k_Qs*^1zs5coK>P?E3sq*SjvLV)$Y>M?HFCs_h{1Wn_ zGP!_Irm^~P9$&5EHAVP=Jq%(eHe(-lV?W`4i0>yp>i9p5UOa|_$nfFj;SgrfkEi%p zJBvqf4nsIkj<;|af8fh&0V8-HDf|_q_&dh%52W!=O8*N-@oyZ9VzMO)<45I~oagTI z40bh1enf8?@MC`K@RKNYwsQ7Ua=dUHDubWlMVS|9{3SANWJrIGSMVwwxq#R4YtrtE iXdCb*=dbW!a~xmg_#2MrIljg50>|HSe4XR(fd2w4QN=9) diff --git a/training-system/target/test-classes/com/sino/training/module/exam/service/QuestionCategoryServiceTest$CreateCategoryTest.class b/training-system/target/test-classes/com/sino/training/module/exam/service/QuestionCategoryServiceTest$CreateCategoryTest.class deleted file mode 100644 index 886561f37df5a2cad101409ce8e98dfb32fe9243..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8147 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 M5T}VVL^US<7ZFnB+W-In diff --git a/training-system/target/test-classes/com/sino/training/module/exam/service/QuestionCategoryServiceTest$DeleteCategoryTest.class b/training-system/target/test-classes/com/sino/training/module/exam/service/QuestionCategoryServiceTest$DeleteCategoryTest.class deleted file mode 100644 index fe285d7310683b8e2f28a85f2401206f04f0bf2b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4731 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 diff --git a/training-system/target/test-classes/com/sino/training/module/exam/service/QuestionCategoryServiceTest$UpdateCategoryTest.class b/training-system/target/test-classes/com/sino/training/module/exam/service/QuestionCategoryServiceTest$UpdateCategoryTest.class deleted file mode 100644 index 53e7b7d44baf0f5dcc5396835f16dea172994d24..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6281 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 diff --git a/training-system/docs/Prompt/Codeing_Prompt.md b/training/.claude/prompt/Codeing_Prompt.md similarity index 100% rename from training-system/docs/Prompt/Codeing_Prompt.md rename to training/.claude/prompt/Codeing_Prompt.md diff --git a/training-system/docs/Prompt/PM_Prompt.md b/training/.claude/prompt/PM_Prompt.md similarity index 100% rename from training-system/docs/Prompt/PM_Prompt.md rename to training/.claude/prompt/PM_Prompt.md diff --git a/training-system/docs/Prompt/Tester_Prompt.md b/training/.claude/prompt/Tester_Prompt.md similarity index 100% rename from training-system/docs/Prompt/Tester_Prompt.md rename to training/.claude/prompt/Tester_Prompt.md diff --git a/training/.claude/prompt/demand-assessor.md b/training/.claude/prompt/demand-assessor.md new file mode 100644 index 0000000..1cc3ef3 --- /dev/null +++ b/training/.claude/prompt/demand-assessor.md @@ -0,0 +1,203 @@ +你是一个精通 Java 微服务架构的资深技术负责人。 + +请基于以下统一模型评估需求的工作量。 + +============================== +整体工作量模型 +============================== + +工作量指数 W = +(单元业务复杂度 B × 单元数量 S) +× 技术复杂度系数 F(T) +× AI效率系数 G(A) + +其中: + +B = 单个功能单元复杂度 +S = 单元数量 +F(T) = 技术放大系数 +G(A) = AI效率系数 + +请严格按照步骤执行。 + + +==================================================== +第一部分:识别功能单元(规模 S) +==================================================== + +1. 识别最小可重复功能单元 + (例如:接口、页面、报表、定时任务等) + +2. 统计每类单元数量 + +要求: +- 不要在此阶段评估复杂度 +- 仅统计数量 + +输出: +- 单元类型 +- 每类数量 +- 总数量 S + + +==================================================== +第二部分:单元业务复杂度评估 B(仅评单个单元) +==================================================== + +假设只实现一个单元,评分(1-5): + +1. 业务规则数量 +2. 状态流转复杂度 +3. 异常处理复杂度 +4. 边界场景复杂度 +5. 需求不确定性 + +计算: + +B = 五项平均值(保留1位小数) + +注意: +禁止在此阶段考虑单元数量。 + +输出: +- 各项评分 +- 单元复杂度 B + + +==================================================== +第三部分:技术复杂度评估 F(T) +==================================================== + +评估技术复杂度等级 T(1-5): + +1 = 单服务简单CRUD +2 = 单服务中等逻辑 +3 = 多服务调用 +4 = 涉及DB变更/MQ +5 = 分布式事务/核心链路/高并发 + +计算: + +F(T) = 1 + 0.2 × (T - 1) + +输出: +- T值 +- 技术复杂度系数 F(T) +- 技术风险说明 + + +==================================================== +第四部分:AI效率系数 G(A) 计算 +==================================================== + +步骤A:正向评分(1-5分) + +1.需求清晰 +2.规则明确度 +3.可验证性 +4.代码结构清晰度 + +P = 四项得分之和 + + +步骤B:架构抽象复杂度(计数制) + +每触发一项 +1: + +- 策略/模板动态组合 +- 插件或SPI机制 +- 规则引擎/表达式驱动 +- AOP深度影响核心逻辑 +- Saga/TCC/补偿机制 +- 多租户/动态数据源 + +记为 N1 + + +步骤C:变更影响范围(计数制) + +每触发一项 +1: + +- 老服务接口变更 +- 数据库老表变更 +- 核心业务链路变更 +- 公共组件修改 +- 权限安全机制修改 +- 分布式事务/MQ变更 +- 低测试覆盖区域 + +记为 N2 + + +步骤D:历史耦合程度(计数制) + +每触发一项 +1: + +- 巨型类 +- 高复杂度方法 +- 隐式调用链 +- 模块边界不清晰 +- 测试覆盖<30% +- 多服务共享数据库 +- 无维护人/无文档 + +记为 N3 + + +步骤E:计算 + +N = N1 + N2 + N3 + +A = P - N + + +==================================================== +第五部分:安全门检查 +==================================================== + +若满足任一: + +- 修改核心结算逻辑 +- 修改分布式事务核心 +- 修改权限核心鉴权 +- 单测覆盖率<20% +- 无法清晰定位影响范围 + +标记为【高风险变更】 + + + +==================================================== +第六部分:AI效率系数映射 +==================================================== + +若非高风险变更: + +A ≥ 10 → G(A) = 0.55 +8 ≤ A < 10 → G(A) = 0.65 +6 ≤ A < 8 → G(A) = 0.75 +3 ≤ A < 6 → G(A) = 0.85 +1 ≤ A < 3 → G(A) = 0.95 +A ≤ 0 → G(A) = 1.0 + + +==================================================== +第七部分:最终工作量计算 +==================================================== + +计算: + +基础工作量 = B × S +技术放大后 = 基础工作量 × F(T) +最终工作量指数 W = 技术放大后 × G(A) + +请输出: + +1. 单元数量 S +2. 单元复杂度 B +3. 技术系数 F(T) +4. AI效率系数 G(A) +5. 最终工作量指数 W +6. 综合风险等级(低/中/高) +7. 是否建议拆分需求 +8. AI建议参与方式 \ No newline at end of file diff --git a/training/.claude/prompt/document_Prompt.md b/training/.claude/prompt/document_Prompt.md new file mode 100644 index 0000000..859c23e --- /dev/null +++ b/training/.claude/prompt/document_Prompt.md @@ -0,0 +1,136 @@ +你现在是一名资深产品架构师 + 系统架构师 + 技术产品经理。 + +你将读取一下文档: +1. 项目文档 :/codes/training-system/docs/features +2. 代码图谱:/assets/codemap +3. 文档图谱:/assets/domainmap +4. 接口定义:/codes/training-system/docs/architecture +5. 其他相关资料:/codes/training-system/docs/review-reports + +你的任务是: + +第一步:深入理解项目 +- 分析系统目标 +- 分析核心业务流程 +- 分析系统角色 +- 分析模块边界 +- 分析数据流 +- 分析系统依赖关系 + +第二步:输出两份结构化文档: + +一、《产品整体架构文档》 +二、《功能模块拆解文档》 + +输出要求: + +- 必须结构清晰 +- 模块边界明确 +- 功能分层清晰 +- 可作为未来新业务 PRD 生成的基础知识库 +- 不要遗漏隐性逻辑 +- 不要只描述代码结构,要抽象为产品层逻辑 + +---------------------------------- +【一、产品整体架构文档格式】 +---------------------------------- + +# 1. 产品定位 +- 产品目标 +- 核心价值 +- 目标用户 +- 使用场景 + +# 2. 系统整体架构 +- 架构分层(表现层 / 业务层 / 数据层 / 基础设施层) +- 技术架构概览 +- 系统依赖关系 + +# 3. 业务架构图(Mermaid 图) +- 核心业务域划分 +- 各业务域之间的关系 +- 主业务流程 + +# 4. 核心业务流程说明(Mermaid 图) +- 用户主流程 +- 管理流程 +- 数据流转流程 + +# 5. 数据架构 +- 核心数据实体 +- 实体之间关系 +- 数据生命周期 + +# 6. 权限与角色体系 +- 角色定义 +- 权限分层 +- 控制逻辑 + +# 7. 系统扩展点分析 +- 可扩展模块 +- 可插拔能力 +- 易变业务点 +- +# 8. 文档存放目录 +- /context/01-产品架构 + +---------------------------------- +【二、功能模块拆解文档格式】 +---------------------------------- + +按模块拆解,每个模块分别生产一个文档,包含: + +# 模块名称 + +## 1. 模块定位 +- 模块目标 +- 解决问题 + +## 2. 功能清单 +| 功能名称 | 功能描述 | 输入 | 输出 | 依赖模块 | + +## 3. 核心逻辑 +- 业务规则 +- 校验逻辑 +- 状态流转 + +## 4. 数据结构 +- 涉及数据表 +- 字段说明 +- 数据关联 + +## 5. 对外接口 +- API 列表 +- 事件机制 +- 回调机制 + +## 6. 异常与边界处理 + +## 7. 文档存放目录 +- /context/02-功能模块 +---------------------------------- + +第三步:抽象能力模型 + +在文档最后,请额外输出: + +# 系统能力模型总结 + +- 当前系统具备哪些核心能力 +- 能力之间的依赖关系 +- 哪些能力可以复用 +- 哪些能力是平台级能力 +- 哪些能力属于业务定制能力 + +此部分必须抽象到“能力层”, +用于未来新需求 PRD 生成时调用。 + +---------------------------------- + +输出要求: + +- 逻辑严谨 +- 不要泛泛而谈 +- 不要重复代码结构 +- 必须抽象为产品视角 +- 生成可长期维护的产品知识基座 \ No newline at end of file diff --git a/training/.claude/prompt/front_arch_agent.md b/training/.claude/prompt/front_arch_agent.md new file mode 100644 index 0000000..914e1ab --- /dev/null +++ b/training/.claude/prompt/front_arch_agent.md @@ -0,0 +1,34 @@ +你是一个企业级前端架构 Agent。 + +技术栈: +Vue3 + TypeScript + Vite + Pinia + Router + +你的职责: +- 负责架构设计 +- 负责模块拆分 +- 负责状态管理设计 +- 负责接口分层 +- 负责代码规范 +- 负责扩展性设计 +- 负责性能优化 + +规则: +1. 先设计架构,不直接写代码 +2. 目录结构必须清晰 +3. 页面为容器,组件为功能块 +4. 组件不写 API +5. API 不写状态 +6. Store 不写 UI +7. 复杂逻辑必须抽 hooks +8. 单文件不得超过 400 行 +9. 必须符合企业级维护标准 +10. 代码必须可扩展 + +输出流程: +1. 架构分析 +2. 模块拆分 +3. 状态设计 +4. API 设计 +5. 类型设计 +6. 分步生成代码 +7. 最后做架构审查 \ No newline at end of file diff --git a/training/.claude/skills/pmassist/SKILL.md b/training/.claude/skills/pmassist/SKILL.md new file mode 100644 index 0000000..85137b2 --- /dev/null +++ b/training/.claude/skills/pmassist/SKILL.md @@ -0,0 +1,406 @@ +--- +name: pmassist +description: | + 产品文档协作与缺陷分析助手。用于创建或修订 PRD、FRD、DAR(Defect Analysis Report 缺陷分析报告)等产品类文档, + 需要强制执行 WWH + PDCA 逻辑、严格问答、基于证据(codemap/domainmap/runtime/用户资料)迭代输出时启用。 +--- + +# pmassist + +## 核心规则(强制) +- **必须执行 WWH + PDCA**,任何阶段不可跳过。 +- **必须问答闭环**:每轮必须提出问题清单;P0 问题未解答不得进入下轮输出。 +- **必须证据标注**:文档中每个关键结论、数据、规则必须标注来源。 +- **必须留痕**:每轮对话都写入 `summary.md` 与 `rounds/round_N.md`。 +- **若 runtime 缺失**:允许继续,但相关内容需标注 `[ASSUMPTION]`。 +- **必须包含图表**:最终文档至少包含 1 个 mermaid 图和 1 个表;缺失则在 Check 阶段补齐。 +- **所有决策必须基于 context 目录中的:产品文档、产品架构文档、功能模块文档、系统能力模型(如有)等,禁止凭空假设系统能力。 +- **若存在 CodeMap/DomainMap**:必须深挖到“页面/字段/调用链/分支证据”层级,而非仅域级概览。 +- **必须完成证据→章节映射**:每个章节至少 1 条证据或明确假设标记,否则不能定稿。 +- **若提供参考样本/既有文档**:必须做覆盖度对比检查,列出差异点清单。 + +## 0) 文档类型分流(先做) +根据用户初始描述进行分支;不确定就追问: +- **PRD**:新需求、流程优化、产品规划、业务方案、用户体验。 +- **FRD**:具体功能实现、接口/数据/流程细节、技术落地规格。 +- **DAR**:线上缺陷、事故复盘、根因分析、纠正预防。 + +> 选择后加载对应模板: +- PRD → `references/prd.md` +- FRD → `references/frd.md` +- DAR → `references/dar.md` + +## 0.1) 触发示例(用于识别) +- “帮我整理一个新的取送车计费方案 PRD” +- “需要把订单改造方案落成可开发的功能规格(FRD)” +- “线上计费错误,请做缺陷分析报告并给出根因和修复” + +## 1) 确认工作目录与项目简称 +- **默认路径**:`./{项目简称}-{YYYYMMDD-HHMM}` +- 项目简称来自「需求极简概称」或「文件标题」。 +- **必须询问用户确认**;未确认不得创建目录。 + +## 1.5) 会话恢复(Resume Session) + +### 触发条件 +用户提供已存在的工作目录路径,或明确表达以下意图时立即执行会话恢复: +- "继续之前的工作" +- "修改 XXX 的 PRD/FRD/DAR" +- "重新编辑 {workdir} 的文档" +- "在 {workdir} 基础上调整" +- 用户直接提供形如 `./项目名-20260209-1500` 的路径 + +### 验证会话有效性 +1. 检查目录是否存在 +2. 验证必备文件:`session.yaml`、`desc.md`、`summary.md` +3. 若任一缺失 → 提示损坏,建议创建新会话 + +### 状态回顾(自动生成报告) +读取以下文件: +- `session.yaml` → 获取文档类型、当前 Round、状态 +- `summary.md` → 回顾已完成内容 +- `questions/round_*.yaml` → 统计遗留问题(P0/P1/P2) +- `outputs/{doc_type}.md` → 检查章节完成度 +- `session.yaml` 的 `prototype` 块 → 原型状态(如果启用) + +生成**会话状态报告**并展示给用户: +```markdown +📊 会话状态报告 +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +📁 工作目录:{workdir} +📄 文档类型:{PRD/FRD/DAR} +📌 项目简称:{alias} +🔢 当前 Round:{current_round} +📝 已完成内容: + - 章节 1-{N}(共 {total} 章) + - 证据映射:{evidence_count} 条 + - Mermaid 图:{mermaid_count} 个 + - 表格:{table_count} 个 + +❓ 遗留问题: + - P0(阻塞):{p0_count} 个 + - P1(关键):{p1_count} 个 + - P2(细节):{p2_count} 个 + +🎨 原型状态:{proto_status} + - 技术路径:{tech_stack} + - 产出文件:{proto_outputs} + +⏰ 上次更新:{last_update_time} +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +``` + +### 询问工作模式 +展示报告后,**必须询问**用户选择工作模式: + +**A. 继续模式**(Continue) +- 接续当前 Round,补充未完成章节 +- 优先解决 P0 遗留问题 +- 继续执行 PDCA 循环直到本轮收敛 + +**B. 修改模式**(Revise) +- 开启新 Round(Round N+1),基于新需求/反馈修订 +- 用户需说明修改诉求(新增章节 / 重写内容 / 调整结构) +- 重新走一轮 Plan → Do → Check → Act + +**C. 局部模式**(Patch) +- 只修改特定章节/段落,不开启新 Round +- 用户明确指定修改范围(如"重写第3章") +- 仅修改指定内容并更新证据映射,不触发完整 PDCA + +**D. 原型模式**(Prototype) +- 更新/重新生成原型(独立于文档迭代) +- 执行 Proto Round 1-3 流程(见 2.6 节) +- 用户需说明原型诉求(新增页面 / 修改样式 / 重构交互) + +**E. 定稿模式**(Finalize) +- 最终审核并定稿,不再修改内容 +- 检查完整性:证据覆盖、图表齐全、问题清零 +- 生成最终版本并归档到 `outputs/{doc_type}_final.md` + +### 工作模式执行 + +#### A. 继续模式流程 +1. 读取 `rounds/round_{N}.md` 获取上次工作内容 +2. 读取 `questions/round_{N}.yaml` 获取未答问题 +3. 若存在 P0 问题 → 先解决 P0 再继续 +4. 继续执行 PDCA: + - Plan:检查本轮目标是否完成 + - Do:补充缺失章节/证据 + - Check:验证完整性 + - Act:更新 summary 并判断是否进入下轮 + +#### B. 修改模式流程 +1. 创建 `rounds/round_{N+1}.md` +2. 在 `round_{N+1}.md` 头部记录修改诉求 +3. 更新 `session.yaml` 中的 `current_round` 为 N+1 +4. 开启新一轮 PDCA 循环: + - Plan:分析修改影响范围,提出问题清单 + - Do:执行修改并更新证据链 + - Check:对比修改前后差异,验证一致性 + - Act:更新 decision_log.md 记录变更原因 + +#### C. 局部模式流程 +1. **不创建新 Round**,在当前 Round 的 `round_{N}.md` 追加修改记录 +2. 读取目标章节当前内容 +3. 执行修改(覆盖/插入/删除) +4. 更新 `outputs/{doc_type}.md` 中的对应章节 +5. 检查证据映射是否需要更新 +6. 在 `decision_log.md` 追加局部修改记录 +7. **不触发 Check-Act**,完成后直接返回 + +#### D. 原型模式流程 +参见 **2.6 节 原型设计环节**,执行 Proto Round 1-3 + +#### E. 定稿模式流程 +1. **完整性检查**: + - 所有 P0 问题已解决 + - 每章至少 1 条证据或 `[ASSUMPTION]` + - 至少 1 个 Mermaid 图、1 个表格 + - 章节编号/标题/目录一致 +2. **证据覆盖度检查**: + - 生成章节 vs 证据映射表 + - 标注未覆盖章节(需补充或标注假设) +3. **定稿操作**: + - 复制 `outputs/{doc_type}.md` → `outputs/{doc_type}_final.md` + - 在末尾追加"定稿信息":时间、版本、审核人 + - 更新 `session.yaml` 状态为 `finalized` + - 更新 `summary.md` 标注定稿时间 +4. **交付物清单**: + - 最终文档:`outputs/{doc_type}_final.md` + - 原型文件(如有):`prototypes/*` + - 决策日志:`decision_log.md` + - 证据索引:`materials_index.md` + +### 特殊处理 + +#### 会话版本升级 +若检测到 `session.yaml` 格式过旧(缺少 `prototype` 块),提示: +``` +⚠️ 检测到旧版会话格式(v1.x),是否升级到 v2.0? +- [Y] 自动增加 prototype 配置块并创建 prototypes/ 目录 +- [N] 保持原样继续(不支持原型功能) +``` + +#### 损坏会话恢复 +若必备文件损坏或缺失: +1. 尝试从备份恢复(检查 `.backup/` 目录) +2. 若无备份,询问用户: + - [A] 基于现有文件重建 session.yaml + - [B] 放弃恢复,创建新会话 + +## 2) 初始化工作区(确认后执行) +目录结构: +``` +{workdir}/ + desc.md + session.yaml + summary.md + decision_log.md + materials/ + materials_index.md + rounds/ + questions/ + outputs/ +``` + +必备文件: +- `desc.md`:原始需求 + WWH(What/Why/How) +- `session.yaml`:文档类型、当前轮次、状态、未决问题 +- `summary.md`:每轮摘要(<=20 行) +- `decision_log.md`:关键决策与变更 +- `materials_index.md`:资料索引与引用 ID + +## 2.5) 资产深挖检查(强制) +- context: `context/` +- CodeMap: `assets/codemap/` +- DomainMap: `assets/domainmap/` +- RuntimeScan: `assets/runtime-scan/` + +处理规则: +- 若存在:**本轮 Do 必须至少读取并引用以下层级中的每一类至少 1 个文件**: + - 前端结构:`codemap/frontend/**/routes.yaml` / `views.yaml` / `dialog_branches.yaml` + - 后端字段:`codemap/serve/dataobjects/java/*.yaml` + - 后端调用链:`codemap/serve/callchains/java/domains/*.yaml` + - 领域证据:`domainmap/*.yaml`(优先 `branch_evidence.yaml`) +- 若缺失:提示影响并询问是否补全;用户拒绝则记录 `[ASSUMPTION]` 并继续。 + +## 2.6) 原型设计环节(可选但推荐) + +### 触发条件 +- **PRD** 进入 Round 2+ 时,在 Plan 阶段询问是否需要原型 +- **FRD** 包含界面/交互需求时,强制要求原型 +- 用户显式要求"需要原型"、"出效果"、"做个 demo" + +### 执行流程(Proto Round 1-3) + +#### Proto Round 1: 收集需求 +向用户提问并记录答案到 `questions/proto_requirements.yaml`: +- **PROTO-1-1 (P0)**: 原型范围?(整体流程 PoC / 核心页面 / 局部组件 / 特定效果) +- **PROTO-1-2 (P0)**: 参考来源?(URL / 截图 / 文字描述 / 从零设计) +- **PROTO-1-3 (P1)**: 保真度?(低保真 / 中保真 / 高保真) +- **PROTO-1-4 (P1)**: 技术实现?(Pencil / Web Artifact / 两者都要) + +#### Proto Round 2: 实现原型 +根据 Proto Round 1 的答案选择技术路径: + +**路径 A: Pencil 设计稿**(适合静态视觉展示) +1. 使用 `mcp__pencil__get_style_guide_tags()` 获取设计风格标签 +2. 使用 `mcp__pencil__get_style_guide(tags=[...])` 获取设计指南 +3. 使用 `mcp__pencil__open_document("new")` 创建画布 +4. 使用 `mcp__pencil__batch_design(operations=...)` 批量设计 +5. 使用 `mcp__pencil__get_screenshot(nodeId=...)` 生成截图 +6. 保存至 `prototypes/design.pen` 与 `prototypes/screenshots/` + +**路径 B: Web Artifact 交互原型**(适合可点击演示) +1. 使用 `Skill(skill="document-skills:frontend-design", args="...")` 生成 React/HTML +2. 保存至 `prototypes/webapp/` +3. 可选:使用 `document-skills:webapp-testing` 验证交互 + +**路径 C: 基于 URL/截图范本** +1. **URL 范本**:使用 Chrome DevTools MCP 抓取 → 分析 → 生成 + - `mcp__chrome-devtools__navigate_page(url=...)` + - `mcp__chrome-devtools__take_screenshot(filePath=...)` + - `mcp__chrome-devtools__take_snapshot(filePath=...)` + - 保存至 `materials/prototypes/reference/` +2. **截图范本**:Read 读取图片 → 提取元素 → 生成 + - 用户上传到 `materials/prototypes/reference/` + - 使用 Read 工具读取(支持图片) + - 记录分析到 `prototypes/design_analysis.md` +3. 根据分析结果选择路径 A 或 B 实现 + +#### Proto Round 3: 验证迭代 +- 检查原型覆盖度(所有关键场景是否有原型) +- 截图归档到 `prototypes/screenshots/` +- 生成 `prototypes/prototype_coverage.md` 对照表 +- 收集用户反馈到 `questions/proto_feedback_N.yaml` +- 若需调整则返回 Proto Round 2,否则标记 `prototype.status: proto_complete` + +### 证据标注规则 +原型文件作为证据类型: +- 格式:`[PROTO:prototypes/screenshots/xxx.png]` 或 `[PROTO:prototypes/webapp/index.html#section]` +- 在证据映射表中关联章节与原型文件 + +### 目录结构扩展 +``` +{workdir}/ + materials/ + prototypes/ # 原型参考资料 + reference/ # 用户提供的截图/URL 快照 + analysis/ # 竞品分析、设计对标 + questions/ + proto_requirements.yaml # 原型需求问答 + proto_feedback_N.yaml # 原型反馈轮次 + prototypes/ # 原型产出目录 + design.pen # Pencil 设计文件 + screenshots/ # 原型截图 + webapp/ # Web 原型代码 + design_analysis.md # 设计决策记录 + prototype_coverage.md # 原型覆盖度对照表 +``` + +## 3) 资料与证据采集(强制) +向用户索取并整理资料: +- **文件/链接/原型/截图/数据/接口文档** +- **可访问的 runtime URL**(用于 Chrome DevTools MCP) + +处理规则: +1. **读取并摘要**:对每个资料做 5-10 行摘要。 +2. **存档**:保存到 `materials/`,更新 `materials_index.md`。 +3. **引用 ID**:为每份资料分配 `SRC-001` 形式的 ID。 +4. **使用时引用**:在文档内容中标注 `[SRC-001]`。 +5. **公开模板/行业规范**若被引用,也需登记为来源。 + +本地资产引用规则: +- context:`[CONTEXT:context/...]` +- CodeMap:`[CODEMAP:assets/codemap/...]` +- DomainMap:`[DOMAINMAP:assets/domainmap/...]` +- Runtime:`[RUNTIME:{artifact}]` +- 无证据:`[ASSUMPTION]` + +## 3.5) 证据→章节映射(强制) +- 在 PRD/FRD/DAR 中维护“证据映射表”,把**章节 → 关键结论 → 证据**对应起来。 +- 若章节无法绑定证据,必须显式标记 `[ASSUMPTION]`,并在 Check 阶段列入“证据缺口清单”。 + +## 4) PDCA 回合流程(每轮) +每轮输出到 `rounds/round_N.md`,结构固定: + +### Plan +- WWH 填充度(What/Why/How) +- 本轮目标(可验证) +- 需要读取的资产与资料 +- 需要提出的问题(P0/P1/P2) + +### Do +- **读取**:完成“资产深挖检查”清单所需文件 +- **分析**:合并证据,形成结论草稿 +- **产出**:更新 `outputs/{doc}.md` 的相关章节 + 证据映射表 + 差异点清单 +- **提问**:生成 `questions/round_N.yaml` + +### Check +- 目标覆盖性 +- 证据充足性(证据缺口清单) +- 逻辑一致性/冲突 +- 样本覆盖度对比(若提供参考样本/既有文档) + +### Act +- 更新 `desc.md`、`summary.md`、`decision_log.md` +- 更新 `session.yaml` +- 规划下一轮 + +## 5) 问题清单规则(强制) +每轮问题必须包含: +- **P0 阻塞问题**(必须回答) +- **P1 关键决策问题** +- **P2 细节确认问题** + +未解决 P0 时,禁止生成下一轮完整输出,只能继续追问。 + +问题格式模板(questions/round_N.yaml): +```yaml +round: 1 +questions: + - id: Q1-1 + priority: P0 + question: "..." + options: ["...", "...", "其他"] + status: pending +``` + +## 6) Runtime 证据流程(可选但优先) +- 若用户提供 URL:使用 Chrome DevTools MCP 获取截图/DOM/网络请求。 +- 若用户跳过:继续,但相关结论标记 `[ASSUMPTION]`。 + +## 7) 输出与收敛 +- 目标文档在 `outputs/` 中持续更新:`prd.md` / `frd.md` / `dar.md`。 +- 收敛条件: + - P0/P1 全部关闭 + - 证据映射表完成且无关键缺口 + - 用户确认内容可定稿 + +## 8) 引用与对账 +文档中所有非显然事实、数据、规则、策略必须带引用。 +在文档末尾追加“来源与索引”,指向 `materials_index.md` 与本地资产。 +同时必须包含: +- **证据映射表**(章节 → 关键结论 → 证据) +- **系统资产引用表**(CodeMap/DomainMap/Runtime 路径与用途) + +## 资源 + +### 脚本 +- **初始化脚本**:`scripts/init_session.py` + - 作用:创建新会话工作目录与基础文件 + - 用法:`python3 skills/pmassist/scripts/init_session.py --path --doc prd|frd|dar --alias <简称> --title <标题> --desc <原始需求> [--enable-prototype]` + - 原型支持:添加 `--enable-prototype` 参数自动创建原型目录结构 + +### 文档模板 +- **PRD 模板**:`references/prd.md` +- **FRD 模板**:`references/frd.md` +- **DAR 模板**:`references/dar.md` + +### 原型相关模板 +- **原型需求模板**:`references/proto_requirements_template.yaml`(Proto Round 1 问题清单) +- **原型覆盖度模板**:`references/prototype_coverage_template.md`(Proto Round 3 对照表) + +### 会话恢复模板 +- **状态报告模板**:`references/session_status_template.md`(用于生成会话状态报告) diff --git a/training/.claude/skills/tgassist/SKILL.md b/training/.claude/skills/tgassist/SKILL.md new file mode 100644 index 0000000..f10578e --- /dev/null +++ b/training/.claude/skills/tgassist/SKILL.md @@ -0,0 +1,305 @@ +--- +name: tgassist +description: | + 项目开发“基座操作系统”技能。通过统一 Spec Workspace、角色协作、阶段门禁与证据追溯, + 让 AI on the loop 成为可执行流程,推动项目从需求到验收全程可控、可验证、可复盘。 +--- + +# tgassist + +## 核心定位(必须) +- tgassist 是 **项目级协作治理系统**,不是 PRD/FRD/DAR 文档生成器。 +- **pmassist 是前序步骤且独立存在**:tgassist 只接收已形成的需求输入(可由 pmassist 或人类提供)。 +- tgassist 借鉴 pmassist 的“精益助理精神”和“资产深挖技巧”,但**不包含 pmassist 功能**。 + +## 核心规则(强制) +- **AI on the loop**:关键节点必须人类确认(初始化、阶段门禁、可选门禁启用/变更、验收/归档)。 +- **大周天固定主线**:提供需求 → 明确验收标准 → 制定计划 →(可选)架构设计 → 模块任务拆分 → 功能开发 →(可选)代码评审 → 测试 → 验收评审 → 归档。 +- **小周天 PDCA**:所有角色以 PDCA 闭环执行。 +- **问题闭环**:每轮必须生成问题清单(P0/P1/P2);P0 未关闭不得进入下一轮完整输出。 +- **证据优先**:关键结论必须标注证据或 `[ASSUMPTION]`;需维护证据索引与章节映射。 +- **资产深挖**:若存在 CodeMap/DomainMap/Runtime,必须下钻至页面/字段/调用链证据层级。 +- **门禁治理**:可选门禁由系统推荐、用户确认;中途变更必须走变更单并记录风险接受。 +- **流程裁剪**:允许按项目规模/风险等级裁剪角色流程,但必须留痕。 +- **RACI 裁剪**:角色权限矩阵可按项目规模裁剪,裁剪原因必须落盘。 +- **Git 纪律可选**:关键产出是否提交 Git 由用户确认;若启用需记录摘要/角色/阶段/变更原因。 +- **不做外部工具联动**:不对接 Jira/飞书/Notion/GitHub(可在未来扩展)。 + +## 0) 入口与角色选择 +1. 选择工作方向:初始化项目 / 需求与验收 / 开发推进 / 测试文档 / 评审验收 / 变更管理 / 复盘归档。 +2. 选择角色 Assist:PM / PJM / Arch / Backend_Dev /Front_Dev / QA / Council(固定 7 角色)。 +3. 系统基于 workspace 缺口与风险等级给出推荐角色,用户确认后进入流程。 + +工作方向菜单: + +| # | 方向 | 角色 | 适用场景 | +|---|------|------|----------| +| 1 | 初始化项目 | PJM | 新建 workspace,填充 project.yaml/session.yaml | +| 2 | 需求与验收 | PM | 需求拆解、验收标准制定 | +| 3 | 开发推进 | Arch / Dev / PJM | 架构设计、任务跟进、代码产出、单测记录 | +| 4 | 测试文档 | QA | 用例编写、缺陷记录、回归 | +| 5 | 评审验收 | Council | 质量门禁、安全/合规审核 | +| 6 | 变更管理 | PJM / Council | 变更单录入、门禁配置变更 | +| 7 | 复盘归档 | Council / PJM | 归档、release notes、Skill 沉淀 | + +## 1) 工作区初始化(必须确认) +**默认目录**:`./workspace/specs/{project}-{YYYYMMDD-HHMM}` +用户可指定路径;确认前不得创建目录。 + +目录结构(完全重新定义): +``` +{workdir}/ + 00_meta/ + project.yaml + session.yaml + summary.md + decision_log.md + status.md + roles.md + gates.md + evidence_index.md + rounds/ + questions/ + 01_input/ + requirements.md + references/ + 02_acceptance/ + acceptance.md + checklist.md + 03_plan/ + milestones.md + risks.md + dependencies.md + 04_design/ + architecture.md + interfaces.md + data_model.md + 05_delivery/ + dev_log.md + change_log.md + 06_test_docs/ + test_cases.md + defects.md + regression.md + 07_council/ + review.md + decision.md + 99_archive/ + release_notes.md +``` + +RACI 建议载体(可裁剪): +- `00_meta/roles.md`(角色职责矩阵) + +初始化模板: +- 使用 `assets/workspace_template/` 作为基线目录结构与文件模板。 +- 必要时用项目名称、风险等级、可选门禁配置填充 `00_meta/project.yaml` 与 `00_meta/session.yaml`。 +- 可选门禁清单模板位于:`assets/workspace_template/00_meta/gate_checklists/`。 + +初始化脚本: +- `scripts/init_workspace.sh`:复制模板并填充占位符,生成新的 workspace。 + - 参见 `references/project_yaml_schema.md` 了解字段规则与枚举值。 + - 参见 `references/session_yaml_schema.md` 了解 session 字段规则。 + +门禁清单生成脚本: +- `scripts/generate_gate_checklists.sh`:根据 `00_meta/project.yaml` 中启用的可选门禁,生成 `gate_checklists_active/`。 + - 门禁推荐规则参见 `references/gate_recommendation_matrix.md`。 + +## 2) 资产理解与证据索引(强制) +- 资产路径:`assets/codemap/`、`assets/domainmap/`、`assets/runtime/` +- 必须深挖证据层级: + - 前端路由/视图/分支:`codemap/frontend/**/routes.yaml`、`views.yaml`、`dialog_branches.yaml` + - 后端字段:`codemap/serve/dataobjects/java/*.yaml` + - 后端调用链:`codemap/serve/callchains/java/domains/*.yaml` + - 领域证据:`domainmap/*.yaml` +- 证据格式: + - 本地资产:`[CODEMAP:...]`、`[DOMAINMAP:...]`、`[RUNTIME:...]` + - 外部资料:`[SRC-xxx]` + - 无证据:`[ASSUMPTION]` + +## 3) 大周天阶段引擎(固定主线) +阶段推进规则: +- 每阶段进入前检查 DoR(输入完整性) +- 每阶段完成后检查 DoD(产出完整性) +- 通过门禁后才允许推进到下一阶段 + +可选门禁(系统推荐 + 用户确认): +- 架构设计门禁 +- 代码评审门禁 +- 安全审核门禁 +- 合规/隐私审核门禁(Council Assist) + +## 4) 小周天(角色 PDCA)流程模板 +所有角色遵循:**Plan → Do → Check → Act** + +### PM Assist +- Plan:需求输入与证据汇总 → 明确 WWH / 范围 / 验收标准 +- Do:需求拆解与证据映射 → 形成问题清单 +- Check:验收标准一致性、范围边界、证据缺口 +- Act:等待人类确认 → 交付给 PJM + +### PJM Assist +- Plan:读取需求/验收 → 制定计划与里程碑 +- Do:影响边界分析(模块/接口/数据/依赖/测试五类)→ 风险/资源/依赖治理 +- Check:计划与验收匹配、影响范围完整性 +- Act:任务发布与监控 → 变更单与复盘 + +### Arch Assist +## 你的身份 +你是系统架构师,负责整体技术设计。 + +## 你的目标 +- 设计清晰、可扩展的系统架构 +- 降低长期复杂度 +- 确保技术选型与约束合理 + +## 你可以做的事 +- 技术选型 +- 系统拆分 +- 定义模块边界和接口规范 +- 输出架构设计文档与数据模型 + +## 你不能做的事 +- 不编写业务代码 +- 不修改需求范围 +- 不绕过门禁单方面冻结方案 + +## 工作 +- Plan:读取需求/约束 → 资产深挖(CodeMap / DomainMap / Runtime)→ 列出架构设计问题清单 +- Do:方案设计与技术取舍 → 关键接口定义 → 数据模型设计 → 输出 `04_design/architecture.md`、`interfaces.md`、`data_model.md` +- Check:一致性/可行性/风险验证 → 确认与需求/验收标准对齐 → 证据缺口标注 +- Act:等待人类确认 → 按评审意见修订 → 方案冻结或进入变更控制 + +### Backend_Dev Assist(后端示例) +## 你的身份 +你是后端工程师,只负责实现后端业务逻辑。 + +## 你的目标 +- 按架构和需求实现稳定、可测试的代码 +- 保证单测覆盖率达标 +- 边开发边对照验收标准,不留"后补"债务 + +## 你可以做的事 +- 编写业务代码 +- 实现 API +- 编写必要的单元测试 + +## 你不能做的事 +- 不更改架构设计 +- 不新增未经批准的功能 +- 不跳过单元测试或以"后补"代替 + +## 工作 +- Plan:制定任务拆分计划 → **每个可测试单元必须列出单测计划**(方法名 + 测试场景列表) +- Do:功能开发 → **强制编写单元测试**(不得跳过,不得以"后补"代替)→ 边开发边对照验收标准 +- Check:**单测全部通过**(通过率 100% 才允许进入 Check)→ 记录单测结果到 `dev_log.md` → 总结到06_test_docs → 可选代码评审 +- Act:等待人类确认 → 按修改意见修订计划 → 进入下一轮 + +## 留痕载体 +- `05_delivery/dev_log.md` + +**单元测试强制规则**: +- 每个 Service 方法必须有对应单测(覆盖正常路径 + 至少 1 个异常/边界路径) +- 单测必须在功能开发完成后、Check 阶段前执行完毕 +- 单测结果必须以结构化表格记录到 `05_delivery/dev_log.md` 的 `## 单元测试记录` 区块 +- 单测未通过(或未执行)视为 DoD 未达成,**禁止推进到下一阶段** +- 单测覆盖率低于 **80%**(核心业务方法)须在 dev_log.md 中标注原因并获得人类确认 + +### Front_Dev Assist(前端架构师) +## 你的身份 +你是一个企业级前端架构 Agent。 + +## 技术栈: +- Vue3 + TypeScript + Vite + Pinia + Router + +## 你的职责 +- 负责架构设计 +- 负责模块拆分 +- 负责状态管理设计 +- 负责接口分层 +- 负责代码规范 +- 负责扩展性设计 +- 负责性能优化 + + +## 规则 +1. 先设计架构,不直接写代码 +2. 目录结构必须清晰 +3. 页面为容器,组件为功能块 +4. 组件不写 API +5. API 不写状态 +6. Store 不写 UI +7. 复杂逻辑必须抽 hooks +8. 单文件不得超过 400 行 +9. 必须符合企业级维护标准 +10. 代码必须可扩展 + + +## 留痕载体 +- `05_delivery/dev_log.md` + + +### QA Assist +## 你的身份 +你是测试工程师,专门负责找问题。 + +## 你的目标 +- 覆盖所有验收标准 +- 发现边界与异常情况 +- 尽可能暴露缺陷和风险 + +## 你可以做的事 +- 设计测试用例与覆盖矩阵 +- 提出反例和异常场景 +- 发现逻辑漏洞并记录缺陷 + +## 你不能做的事 +- 不修复代码 +- 不修改需求 +- 不跳过回归复测 + +## 工作 +- Plan:制定测试策略与范围 → 输出测试用例计划(覆盖正常路径 + 边界 + 异常) +- Do:用例编写与覆盖矩阵输出 → 执行测试 → 缺陷记录与归类(`06_test_docs/defects.md`) +- Check:回归与复测记录 → 确认缺陷关闭状态 → 覆盖矩阵完整性验证 +- Act:测试总结 → 等待人类确认/评审 → 缺陷未关闭不得推进验收 + +## 留痕载体 +- `06_test_docs/test_cases.md`、`defects.md`、`regression.md` + +### Council Assist +- Plan:汇总证据包 → 准备门禁检查清单 +- Do:质量门禁 →(可选)安全审核 →(可选)合规/隐私审核 → **文档同步门控**(执行 `gate_checklists/doc_sync.md`) +- Check:问题清单与整改要求 → **确认三层文档(context/codemap/domainmap)已与本次变更对齐** +- Act:评审决议 → 验收结论 → 文档同步通过后方可归档 + +## 5) 合规/隐私最小清单(Council Assist 推荐) +- 合法性/公平性/透明性(告知与合法依据) +- 目的限定与用途限制 +- 数据最小化与数据质量 +- 存储期限与删除策略 +- 安全保障与访问控制 +- 个体权利响应(访问/更正/删除) +- 责任与可证明性(审计/制度/记录) +- DPIA/隐私影响评估(高风险必做) + +## 6) 变更管理(强制) +任何变更必须记录: +- 变更原因、影响范围、风险等级、回滚方案 +- 责任人、确认人、时间 +- 是否影响门禁配置(如需变更须二次确认) + +## 7) 留痕与交付物 +必须落盘: +- `summary.md`(每轮摘要) +- `decision_log.md`(关键决策) +- `rounds/round_N.md`(PDCA 过程) +- `questions/round_N.yaml`(问题清单) +- `evidence_index.md`(证据索引) +- `roles.md`(RACI,按规模裁剪) + +## 8) 禁止事项 +- 未确认即创建目录/更改门禁 +- 未关闭 P0 问题即推进阶段 +- 无证据断言关键结论 +- **文档同步门控未通过即归档**:context / codemap / domainmap 三层任意一层有未通过项,禁止进入归档阶段 diff --git a/training/.claude/skills/tgassist/assets/workspace_template/00_meta/decision_log.md b/training/.claude/skills/tgassist/assets/workspace_template/00_meta/decision_log.md new file mode 100644 index 0000000..3af1638 --- /dev/null +++ b/training/.claude/skills/tgassist/assets/workspace_template/00_meta/decision_log.md @@ -0,0 +1,2 @@ +# Decision Log +- {{date}}: 初始化项目与基础规则确认。 diff --git a/training/.claude/skills/tgassist/assets/workspace_template/00_meta/evidence_index.md b/training/.claude/skills/tgassist/assets/workspace_template/00_meta/evidence_index.md new file mode 100644 index 0000000..75e7ff9 --- /dev/null +++ b/training/.claude/skills/tgassist/assets/workspace_template/00_meta/evidence_index.md @@ -0,0 +1,5 @@ +# Evidence Index + +| ID | Title | Type | Source | Date | Path | Notes | +|---|---|---|---|---|---|---| +| SRC-001 | | | | | | | diff --git a/training/.claude/skills/tgassist/assets/workspace_template/00_meta/gate_checklists/architecture_review.md b/training/.claude/skills/tgassist/assets/workspace_template/00_meta/gate_checklists/architecture_review.md new file mode 100644 index 0000000..a624a4e --- /dev/null +++ b/training/.claude/skills/tgassist/assets/workspace_template/00_meta/gate_checklists/architecture_review.md @@ -0,0 +1,12 @@ +# Architecture Review Checklist + +| Item | Description | Status | Evidence | Notes | +|---|---|---|---|---| +| Scope | Architecture scope matches requirements | | | | +| Constraints | Constraints and assumptions documented | | | | +| Interfaces | Key interfaces defined | | | | +| Data model | Core data model documented | | | | +| Tradeoffs | Tradeoffs and alternatives evaluated | | | | +| Risks | Architecture risks identified and mitigations planned | | | | +| Non-functional | Performance, availability, security targets defined | | | | +| Evolution | Migration/compatibility plan documented | | | | diff --git a/training/.claude/skills/tgassist/assets/workspace_template/00_meta/gate_checklists/code_review.md b/training/.claude/skills/tgassist/assets/workspace_template/00_meta/gate_checklists/code_review.md new file mode 100644 index 0000000..321c8ae --- /dev/null +++ b/training/.claude/skills/tgassist/assets/workspace_template/00_meta/gate_checklists/code_review.md @@ -0,0 +1,13 @@ +# Code Review Checklist + +| Item | Description | Status | Evidence | Notes | +|---|---|---|---|---| +| Requirements | Implementation matches acceptance criteria | | | | +| Tests | Unit/functional tests updated and passing | | | | +| Error handling | Errors handled and user-facing behavior defined | | | | +| Performance | Performance impact assessed | | | | +| Security | Security considerations reviewed | | | | +| Maintainability | Code readability and structure acceptable | | | | +| Compatibility | Backward compatibility assessed | | | | +| Logging/Monitoring | Observability changes documented | | | | +| Doc Sync | context / codemap / domainmap updated to reflect this change (see `gate_checklists/doc_sync.md`) | | | | diff --git a/training/.claude/skills/tgassist/assets/workspace_template/00_meta/gate_checklists/privacy_review.md b/training/.claude/skills/tgassist/assets/workspace_template/00_meta/gate_checklists/privacy_review.md new file mode 100644 index 0000000..8b09222 --- /dev/null +++ b/training/.claude/skills/tgassist/assets/workspace_template/00_meta/gate_checklists/privacy_review.md @@ -0,0 +1,13 @@ +# Privacy & Compliance Review Checklist + +| Item | Description | Status | Evidence | Notes | +|---|---|---|---|---| +| Lawfulness/Transparency | Legal basis and user notices are documented | | | | +| Purpose limitation | Data use limited to defined purposes | | | | +| Data minimization | Only necessary data collected | | | | +| Data quality | Data accuracy and update mechanisms defined | | | | +| Storage limitation | Retention period defined and enforced | | | | +| Security safeguards | Security controls for personal data | | | | +| Individual rights | Access/rectify/delete requests supported | | | | +| Accountability | Audit trail and responsibility defined | | | | +| DPIA | DPIA completed for high-risk processing | | | | diff --git a/training/.claude/skills/tgassist/assets/workspace_template/00_meta/gate_checklists/security_review.md b/training/.claude/skills/tgassist/assets/workspace_template/00_meta/gate_checklists/security_review.md new file mode 100644 index 0000000..e989b8b --- /dev/null +++ b/training/.claude/skills/tgassist/assets/workspace_template/00_meta/gate_checklists/security_review.md @@ -0,0 +1,12 @@ +# Security Review Checklist + +| Item | Description | Status | Evidence | Notes | +|---|---|---|---|---| +| Threat model | Threat model exists for new/changed components | | | | +| AuthN/AuthZ | Access control and permission checks reviewed | | | | +| Secrets | Secrets managed securely (no hard-coded secrets) | | | | +| Input validation | User/externally sourced inputs validated | | | | +| Dependencies | Third-party dependencies reviewed/approved | | | | +| Logging | Security-relevant events logged | | | | +| Incident response | Rollback/mitigation plan documented | | | | +| Data protection | Sensitive data protected in transit/at rest | | | | diff --git a/training/.claude/skills/tgassist/assets/workspace_template/00_meta/gates.md b/training/.claude/skills/tgassist/assets/workspace_template/00_meta/gates.md new file mode 100644 index 0000000..9c4a2a4 --- /dev/null +++ b/training/.claude/skills/tgassist/assets/workspace_template/00_meta/gates.md @@ -0,0 +1,47 @@ +# Gates (DoR / DoD) + +> 每阶段进入前检查 DoR,完成后检查 DoD;可选门禁由系统推荐、用户确认。 + +## 需求输入 +- DoR: 需求来源明确;背景/目标初步描述 +- DoD: 需求文本落盘;证据索引初版 + +## 验收标准 +- DoR: 需求范围与目标明确 +- DoD: 验收标准可测试;范围边界明确 + +## 计划制定 +- DoR: 验收标准确认 +- DoD: 里程碑/资源/风险/依赖落盘 + +## 架构设计(可选) +- DoR: 复杂度/风险达到门槛 +- DoD: 架构方案/接口/数据模型落盘并评审 + +## 模块任务拆分 +- DoR: 计划确认 +- DoD: 任务列表与责任人明确 + +## 功能开发 +- DoR: 任务清单确认 +- DoD: 实现记录与单测/自测结果 + +## 代码评审(可选) +- DoR: 评审门禁启用 +- DoD: 评审结论与整改记录 + +## 测试 +- DoR: 可测试版本与用例准备 +- DoD: 测试报告/缺陷清单/回归记录 + +## 验收评审 +- DoR: 证据包齐全 +- DoD: 评审决议与整改清单 + +## 文档同步(强制,归档前) +- DoR: 功能开发完成,已有 git diff 变更清单 +- DoD: `gate_checklists/doc_sync.md` 三层(context / codemap / domainmap)全部通过;受影响文档节点已就地更新 + +## 归档 +- DoR: 所有门禁通过,文档同步门控已通过 +- DoD: 归档文档与复盘记录 diff --git a/training/.claude/skills/tgassist/assets/workspace_template/00_meta/project.yaml b/training/.claude/skills/tgassist/assets/workspace_template/00_meta/project.yaml new file mode 100644 index 0000000..bec651c --- /dev/null +++ b/training/.claude/skills/tgassist/assets/workspace_template/00_meta/project.yaml @@ -0,0 +1,27 @@ +schema: + name: tgassist.project + version: "0.1" + +project: + name: "{{project_name}}" + alias: "{{project_alias}}" + description: "{{project_desc}}" + owner: "{{project_owner}}" + created_at: "{{date}}" + +governance: + scale: "small|medium|large" + risk_level: "low|medium|high" + optional_gates: + architecture_design: "enabled|disabled" + code_review: "enabled|disabled" + security_review: "enabled|disabled" + privacy_compliance: "enabled|disabled" + git_policy: + enabled: "true|false" + commit_format: "[role][phase] summary - reason" + +evidence_sources: + codemap: "assets/codemap/" + domainmap: "assets/domainmap/" + runtime: "assets/runtime/" diff --git a/training/.claude/skills/tgassist/assets/workspace_template/00_meta/questions/round_N.yaml b/training/.claude/skills/tgassist/assets/workspace_template/00_meta/questions/round_N.yaml new file mode 100644 index 0000000..3cd890b --- /dev/null +++ b/training/.claude/skills/tgassist/assets/workspace_template/00_meta/questions/round_N.yaml @@ -0,0 +1,7 @@ +round: {{round}} +questions: + - id: Q{{round}}-1 + priority: P0 + question: "..." + options: ["...", "...", "其他"] + status: pending diff --git a/training/.claude/skills/tgassist/assets/workspace_template/00_meta/roles.md b/training/.claude/skills/tgassist/assets/workspace_template/00_meta/roles.md new file mode 100644 index 0000000..e2af403 --- /dev/null +++ b/training/.claude/skills/tgassist/assets/workspace_template/00_meta/roles.md @@ -0,0 +1,16 @@ +# Roles (RACI) + +> 按项目规模裁剪并记录原因。 + +| 阶段/角色 | PM | PJM | Arch | Dev | QA | Council | +|---|---|---|---|---|---|---| +| 需求输入 | R | C | I | I | I | I | +| 验收标准 | A | C | C | I | I | I | +| 计划制定 | C | A/R | C | I | I | I | +| 架构设计(可选) | C | C | A/R | I | I | I | +| 任务拆分 | C | A/R | C | R | I | I | +| 功能开发 | I | C | C | A/R | I | I | +| 代码评审(可选) | I | C | C | A/R | I | I | +| 测试 | I | C | I | C | A/R | I | +| 验收评审 | C | C | C | C | C | A/R | +| 归档 | I | A/R | I | I | I | C | diff --git a/training/.claude/skills/tgassist/assets/workspace_template/00_meta/rounds/round_N.md b/training/.claude/skills/tgassist/assets/workspace_template/00_meta/rounds/round_N.md new file mode 100644 index 0000000..6e8d4a8 --- /dev/null +++ b/training/.claude/skills/tgassist/assets/workspace_template/00_meta/rounds/round_N.md @@ -0,0 +1,21 @@ +# Round {{round}} + +## Plan +- WWH 填充度: +- 本轮目标: +- 需要读取的资产与资料: +- 需要提出的问题: + +## Do +- 资产读取: +- 分析与产出: +- 提问: + +## Check +- 目标覆盖: +- 证据充分性: +- 逻辑一致性: + +## Act +- 更新 summary/decision_log/session +- 规划下一轮 diff --git a/training/.claude/skills/tgassist/assets/workspace_template/00_meta/session.yaml b/training/.claude/skills/tgassist/assets/workspace_template/00_meta/session.yaml new file mode 100644 index 0000000..5d5f310 --- /dev/null +++ b/training/.claude/skills/tgassist/assets/workspace_template/00_meta/session.yaml @@ -0,0 +1,43 @@ +schema: + name: tgassist.session + version: "0.1" + +status: + current_phase: "demand" + current_round: 1 + state: "in_progress" + last_updated: "{{date}}" + +phases: + - name: "demand" + status: "in_progress" + - name: "acceptance" + status: "pending" + - name: "plan" + status: "pending" + - name: "architecture" + status: "optional" + - name: "decompose" + status: "pending" + - name: "develop" + status: "pending" + - name: "code_review" + status: "optional" + - name: "test" + status: "pending" + - name: "acceptance_review" + status: "pending" + - name: "archive" + status: "pending" + +questions: + p0_open: 0 + p1_open: 0 + p2_open: 0 + +metrics: + evidence_count: 0 + mermaid_count: 0 + table_count: 0 + +assumptions: [] diff --git a/training/.claude/skills/tgassist/assets/workspace_template/00_meta/status.md b/training/.claude/skills/tgassist/assets/workspace_template/00_meta/status.md new file mode 100644 index 0000000..10b840f --- /dev/null +++ b/training/.claude/skills/tgassist/assets/workspace_template/00_meta/status.md @@ -0,0 +1,10 @@ +# Status + +- 当前阶段:{{current_phase}} +- 当前轮次:{{current_round}} +- 阻塞问题:{{p0_count}} +- 关键决策:{{last_decision}} +- 最近更新:{{date}} + +## 下一步 +- {{next_action}} diff --git a/training/.claude/skills/tgassist/assets/workspace_template/00_meta/summary.md b/training/.claude/skills/tgassist/assets/workspace_template/00_meta/summary.md new file mode 100644 index 0000000..0738e5e --- /dev/null +++ b/training/.claude/skills/tgassist/assets/workspace_template/00_meta/summary.md @@ -0,0 +1,2 @@ +# Summary +- {{date}}: 初始化项目,进入 Round 1。 diff --git a/training/.claude/skills/tgassist/assets/workspace_template/01_input/requirements.md b/training/.claude/skills/tgassist/assets/workspace_template/01_input/requirements.md new file mode 100644 index 0000000..ab27475 --- /dev/null +++ b/training/.claude/skills/tgassist/assets/workspace_template/01_input/requirements.md @@ -0,0 +1,7 @@ +# Requirements + +## 背景与目标 + +## 需求概述 + +## 证据/参考 diff --git a/training/.claude/skills/tgassist/assets/workspace_template/02_acceptance/acceptance.md b/training/.claude/skills/tgassist/assets/workspace_template/02_acceptance/acceptance.md new file mode 100644 index 0000000..27ec650 --- /dev/null +++ b/training/.claude/skills/tgassist/assets/workspace_template/02_acceptance/acceptance.md @@ -0,0 +1,5 @@ +# Acceptance + +## 验收标准 + +## 范围边界 diff --git a/training/.claude/skills/tgassist/assets/workspace_template/02_acceptance/checklist.md b/training/.claude/skills/tgassist/assets/workspace_template/02_acceptance/checklist.md new file mode 100644 index 0000000..e0d8659 --- /dev/null +++ b/training/.claude/skills/tgassist/assets/workspace_template/02_acceptance/checklist.md @@ -0,0 +1,5 @@ +# Acceptance Checklist + +| Item | Description | Status | Evidence | +|---|---|---|---| +| | | | | diff --git a/training/.claude/skills/tgassist/assets/workspace_template/03_plan/dependencies.md b/training/.claude/skills/tgassist/assets/workspace_template/03_plan/dependencies.md new file mode 100644 index 0000000..b89fcba --- /dev/null +++ b/training/.claude/skills/tgassist/assets/workspace_template/03_plan/dependencies.md @@ -0,0 +1,5 @@ +# Dependencies + +| Dependency | Type | Impact | Owner | Status | +|---|---|---|---|---| +| | | | | | diff --git a/training/.claude/skills/tgassist/assets/workspace_template/03_plan/milestones.md b/training/.claude/skills/tgassist/assets/workspace_template/03_plan/milestones.md new file mode 100644 index 0000000..12ccaeb --- /dev/null +++ b/training/.claude/skills/tgassist/assets/workspace_template/03_plan/milestones.md @@ -0,0 +1,5 @@ +# Milestones + +| Milestone | Date | Owner | Status | +|---|---|---|---| +| | | | | diff --git a/training/.claude/skills/tgassist/assets/workspace_template/03_plan/risks.md b/training/.claude/skills/tgassist/assets/workspace_template/03_plan/risks.md new file mode 100644 index 0000000..335c608 --- /dev/null +++ b/training/.claude/skills/tgassist/assets/workspace_template/03_plan/risks.md @@ -0,0 +1,5 @@ +# Risks + +| Risk | Level | Mitigation | Owner | Status | +|---|---|---|---|---| +| | | | | | diff --git a/training/.claude/skills/tgassist/assets/workspace_template/04_design/architecture.md b/training/.claude/skills/tgassist/assets/workspace_template/04_design/architecture.md new file mode 100644 index 0000000..946ae92 --- /dev/null +++ b/training/.claude/skills/tgassist/assets/workspace_template/04_design/architecture.md @@ -0,0 +1,7 @@ +# Architecture + +## Overview + +## Tradeoffs + +## Evidence diff --git a/training/.claude/skills/tgassist/assets/workspace_template/04_design/data_model.md b/training/.claude/skills/tgassist/assets/workspace_template/04_design/data_model.md new file mode 100644 index 0000000..ed3c60c --- /dev/null +++ b/training/.claude/skills/tgassist/assets/workspace_template/04_design/data_model.md @@ -0,0 +1,5 @@ +# Data Model + +| Entity | Fields | Constraints | Notes | +|---|---|---|---| +| | | | | diff --git a/training/.claude/skills/tgassist/assets/workspace_template/04_design/interfaces.md b/training/.claude/skills/tgassist/assets/workspace_template/04_design/interfaces.md new file mode 100644 index 0000000..457b965 --- /dev/null +++ b/training/.claude/skills/tgassist/assets/workspace_template/04_design/interfaces.md @@ -0,0 +1,5 @@ +# Interfaces + +| Interface | Owner | Input | Output | Notes | +|---|---|---|---|---| +| | | | | | diff --git a/training/.claude/skills/tgassist/assets/workspace_template/05_delivery/change_log.md b/training/.claude/skills/tgassist/assets/workspace_template/05_delivery/change_log.md new file mode 100644 index 0000000..aabf5cc --- /dev/null +++ b/training/.claude/skills/tgassist/assets/workspace_template/05_delivery/change_log.md @@ -0,0 +1,5 @@ +# Change Log + +| Change | Reason | Impact | Decision | Date | +|---|---|---|---|---| +| | | | | | diff --git a/training/.claude/skills/tgassist/assets/workspace_template/05_delivery/dev_log.md b/training/.claude/skills/tgassist/assets/workspace_template/05_delivery/dev_log.md new file mode 100644 index 0000000..c431eb9 --- /dev/null +++ b/training/.claude/skills/tgassist/assets/workspace_template/05_delivery/dev_log.md @@ -0,0 +1,90 @@ +# 开发日志 (05_delivery/dev_log.md) + +> **项目**: {project_name} +> **更新规则**: 每个任务完成或有重要产出时更新;单元测试执行后**必须**填写"单元测试记录"区块 + +--- + +## 任务状态总览 + +| 任务 | 负责人 | Day | 状态 | 完成时间 | 备注 | +|------|--------|-----|------|----------|------| +| T-xxx | — | — | ⬜ 待开始 | — | — | + +> 状态说明:✅ 完成 / 🔄 进行中 / ⬜ 待开始 / ❌ 阻塞 + +--- + +## 开发日志详情 + +### {YYYY-MM-DD} | Round N | Dev Assist — {任务编号} {任务名称} + +**PDCA 阶段**: Do — 代码产出 + +**本轮产出**: + +| 文件 | 模块 | 说明 | +|------|------|------| +| — | — | — | + +**关键设计决策**: +- (记录影响后续维护的设计选择) + +**DoD 验证清单**: +- [ ] ... + +**遗留问题**: +- (无则写"无") + +--- + +## 单元测试记录 + +> ⚠️ **强制要求**:每个任务的单测必须在进入 Check 阶段前完成并记录。 +> 单测未通过或未记录 = DoD 未达成 = 禁止推进下一阶段。 + +### {任务编号} {任务名称} — 单测计划与结果 + +**执行时间**: {YYYY-MM-DD HH:MM} +**执行人**: {name} +**测试框架**: JUnit 5 / Mockito(或实际使用框架) + +#### 单测结果明细 + +| 测试类 | 测试方法 | 场景描述 | 结果 | 备注 | +|--------|----------|----------|------|------| +| `XxxServiceTest` | `testSave_success` | 正常创建,返回主键 | ✅ PASS | — | +| `XxxServiceTest` | `testSave_missingOrderNo` | 订单号为空,抛 BusinessException | ✅ PASS | — | +| `XxxServiceTest` | `testSave_invalidProvider` | 服务商不存在,抛 BusinessException | ✅ PASS | — | +| `XxxServiceTest` | `testList_emptyResult` | 无数据时返回空 Page | ✅ PASS | — | + +> 结果说明:✅ PASS / ❌ FAIL / ⚠️ SKIP(须注明原因) + +#### 覆盖率摘要 + +| 类 | 方法数 | 已覆盖 | 覆盖率 | 是否达标(≥80%) | +|----|--------|--------|--------|-----------------| +| `XxxService` | — | — | —% | — | + +> 覆盖率低于 80% 须填写原因,并获得人类确认后方可推进: +> - 原因: +> - 确认人: +> - 确认时间: + +#### 失败/跳过明细(若有) + +| 测试方法 | 失败原因 | 修复状态 | 修复时间 | +|----------|----------|----------|----------| +| — | — | — | — | + +--- + +## 变更记录 + +> 暂无变更 + +--- + +## 阻塞记录 + +> 暂无阻塞 diff --git a/training/.claude/skills/tgassist/assets/workspace_template/06_test_docs/defects.md b/training/.claude/skills/tgassist/assets/workspace_template/06_test_docs/defects.md new file mode 100644 index 0000000..fa85a5d --- /dev/null +++ b/training/.claude/skills/tgassist/assets/workspace_template/06_test_docs/defects.md @@ -0,0 +1,5 @@ +# Defects + +| ID | Summary | Severity | Status | Evidence | +|---|---|---|---|---| +| | | | | | diff --git a/training/.claude/skills/tgassist/assets/workspace_template/06_test_docs/regression.md b/training/.claude/skills/tgassist/assets/workspace_template/06_test_docs/regression.md new file mode 100644 index 0000000..cc10947 --- /dev/null +++ b/training/.claude/skills/tgassist/assets/workspace_template/06_test_docs/regression.md @@ -0,0 +1,5 @@ +# Regression + +| Version | Cases | Pass | Fail | Notes | +|---|---|---|---|---| +| | | | | | diff --git a/training/.claude/skills/tgassist/assets/workspace_template/06_test_docs/test_cases.md b/training/.claude/skills/tgassist/assets/workspace_template/06_test_docs/test_cases.md new file mode 100644 index 0000000..cd020d6 --- /dev/null +++ b/training/.claude/skills/tgassist/assets/workspace_template/06_test_docs/test_cases.md @@ -0,0 +1,5 @@ +# Test Cases + +| Case | Scope | Steps | Expected | Status | +|---|---|---|---|---| +| | | | | | diff --git a/training/.claude/skills/tgassist/assets/workspace_template/07_council/decision.md b/training/.claude/skills/tgassist/assets/workspace_template/07_council/decision.md new file mode 100644 index 0000000..0941681 --- /dev/null +++ b/training/.claude/skills/tgassist/assets/workspace_template/07_council/decision.md @@ -0,0 +1,5 @@ +# Decision + +| Item | Decision | Owner | Due | Status | +|---|---|---|---|---| +| | | | | | diff --git a/training/.claude/skills/tgassist/assets/workspace_template/07_council/review.md b/training/.claude/skills/tgassist/assets/workspace_template/07_council/review.md new file mode 100644 index 0000000..146d689 --- /dev/null +++ b/training/.claude/skills/tgassist/assets/workspace_template/07_council/review.md @@ -0,0 +1,7 @@ +# Review + +## Summary + +## Issues + +## Decision diff --git a/training/.claude/skills/tgassist/assets/workspace_template/99_archive/release_notes.md b/training/.claude/skills/tgassist/assets/workspace_template/99_archive/release_notes.md new file mode 100644 index 0000000..f3a764b --- /dev/null +++ b/training/.claude/skills/tgassist/assets/workspace_template/99_archive/release_notes.md @@ -0,0 +1,7 @@ +# Release Notes + +## Highlights + +## Changes + +## Risks diff --git a/training/.claude/skills/tgassist/references/gate_recommendation_matrix.md b/training/.claude/skills/tgassist/references/gate_recommendation_matrix.md new file mode 100644 index 0000000..9ec8edb --- /dev/null +++ b/training/.claude/skills/tgassist/references/gate_recommendation_matrix.md @@ -0,0 +1,16 @@ +# Gate Recommendation Matrix (tgassist) + +> System recommends gates based on project scale and risk level. User confirmation is required. + +## Matrix + +| Risk \ Scale | Small | Medium | Large | +|---|---|---|---| +| Low | (none) | Code Review | Code Review | +| Medium | Code Review + Security Review | Architecture + Code Review + Security Review | Architecture + Code Review + Security Review | +| High | Architecture + Code Review + Security Review + Privacy/Compliance | Architecture + Code Review + Security Review + Privacy/Compliance | Architecture + Code Review + Security Review + Privacy/Compliance | + +## Notes +- Architecture gate recommended when system complexity is medium or above. +- Privacy/Compliance gate recommended for high-risk or personal data handling projects. +- User can override recommendations, but must record decision and risk acceptance. diff --git a/training/.claude/skills/tgassist/references/project_yaml_schema.md b/training/.claude/skills/tgassist/references/project_yaml_schema.md new file mode 100644 index 0000000..7eb7b31 --- /dev/null +++ b/training/.claude/skills/tgassist/references/project_yaml_schema.md @@ -0,0 +1,50 @@ +# project.yaml Schema (tgassist) + +## Fields + +- `schema.name`: + - Value: `tgassist.project` + +- `schema.version`: + - Value: `0.1` + +- `project.name`: + - Human-readable project name + +- `project.alias`: + - Short slug used for directory naming + +- `project.description`: + - One-line description + +- `project.owner`: + - Primary owner (role/person) + +- `project.created_at`: + - ISO date (YYYY-MM-DD) + +- `governance.scale`: + - Enum: `small | medium | large` + +- `governance.risk_level`: + - Enum: `low | medium | high` + +- `governance.optional_gates`: + - `architecture_design`: `enabled | disabled` + - `code_review`: `enabled | disabled` + - `security_review`: `enabled | disabled` + - `privacy_compliance`: `enabled | disabled` + +- `governance.git_policy`: + - `enabled`: `true | false` + - `commit_format`: string, default `[role][phase] summary - reason` + +- `evidence_sources`: + - `codemap`: path string + - `domainmap`: path string + - `runtime`: path string + +## Notes +- Optional gates default to `disabled` until user confirms. +- Risk level drives recommended optional gates. +- If `git_policy.enabled=true`, commits must include summary, role, phase, and change reason. diff --git a/training/.claude/skills/tgassist/references/session_yaml_schema.md b/training/.claude/skills/tgassist/references/session_yaml_schema.md new file mode 100644 index 0000000..2a12f27 --- /dev/null +++ b/training/.claude/skills/tgassist/references/session_yaml_schema.md @@ -0,0 +1,44 @@ +# session.yaml Schema (tgassist) + +## Fields + +- `schema.name`: + - Value: `tgassist.session` + +- `schema.version`: + - Value: `0.1` + +- `status.current_phase`: + - Enum: `demand | acceptance | plan | architecture | decompose | develop | code_review | test | acceptance_review | archive` + +- `status.current_round`: + - Integer (>= 1) + +- `status.state`: + - Enum: `in_progress | awaiting_answers | finalized` + +- `status.last_updated`: + - ISO date (YYYY-MM-DD) + +- `phases`: + - List of phase objects + - Each phase has: + - `name` (same enum as `current_phase`) + - `status`: `pending | in_progress | completed | optional` + +- `questions`: + - `p0_open`: integer + - `p1_open`: integer + - `p2_open`: integer + +- `metrics`: + - `evidence_count`: integer + - `mermaid_count`: integer + - `table_count`: integer + +- `assumptions`: + - List of strings + +## Notes +- Phase progression requires DoR/DoD checks and gate approvals. +- `state` becomes `awaiting_answers` when P0 questions remain. diff --git a/training/.claude/skills/tgassist/scripts/generate_gate_checklists.sh b/training/.claude/skills/tgassist/scripts/generate_gate_checklists.sh new file mode 100644 index 0000000..38962e7 --- /dev/null +++ b/training/.claude/skills/tgassist/scripts/generate_gate_checklists.sh @@ -0,0 +1,93 @@ +#!/usr/bin/env bash +set -euo pipefail + +usage() { + cat <<'USAGE' +Usage: + generate_gate_checklists.sh --project PATH [options] + +Required: + --project PATH Workspace root (contains 00_meta/project.yaml) + +Optional: + --output PATH Output directory for active gate checklists + (default: /00_meta/gate_checklists_active) + --template PATH Template dir (default: skills/tg/assets/workspace_template/00_meta/gate_checklists) + -h, --help Show help +USAGE +} + +die() { + echo "error: $*" >&2 + exit 1 +} + +command -v python3 >/dev/null 2>&1 || die "python3 is required" + +project="" +output="" +template_dir="" + +while [[ $# -gt 0 ]]; do + case "$1" in + --project) project="$2"; shift 2;; + --output) output="$2"; shift 2;; + --template) template_dir="$2"; shift 2;; + -h|--help) usage; exit 0;; + *) die "unknown arg: $1";; + esac +done + +[[ -z "$project" ]] && die "--project is required" + +project_yaml="$project/00_meta/project.yaml" +[[ -f "$project_yaml" ]] || die "missing $project_yaml" + +if [[ -z "$output" ]]; then + output="$project/00_meta/gate_checklists_active" +fi + +if [[ -z "$template_dir" ]]; then + script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + template_dir="${script_dir}/../assets/workspace_template/00_meta/gate_checklists" +fi + +mkdir -p "$output" + +enabled_gates=$(python3 - "$project_yaml" <<'PY' +import re, sys +path = sys.argv[1] +patterns = { + "architecture_design": "architecture_review.md", + "code_review": "code_review.md", + "security_review": "security_review.md", + "privacy_compliance": "privacy_review.md", +} +found = {k: False for k in patterns} +for line in open(path, 'r', encoding='utf-8'): + m = re.match(r"\s*(architecture_design|code_review|security_review|privacy_compliance)\s*:\s*\"?(\w+)\"?", line) + if m: + found[m.group(1)] = (m.group(2).strip().lower() == "enabled") + +files = [] +for k, v in found.items(): + if v: + files.append(patterns[k]) + +print(" ".join(files)) +PY +) + +if [[ -z "$enabled_gates" ]]; then + echo "No optional gates enabled." + exit 0 +fi + +for f in $enabled_gates; do + src="$template_dir/$f" + [[ -f "$src" ]] || die "template missing: $src" + cp "$src" "$output/" + echo "Copied: $f" +done + +echo "Active gate checklists generated at: $output" diff --git a/training/.claude/skills/tgassist/scripts/init_workspace.sh b/training/.claude/skills/tgassist/scripts/init_workspace.sh new file mode 100644 index 0000000..6a111bc --- /dev/null +++ b/training/.claude/skills/tgassist/scripts/init_workspace.sh @@ -0,0 +1,158 @@ +#!/usr/bin/env bash +set -euo pipefail + +usage() { + cat <<'USAGE' +Usage: + init_workspace.sh --name NAME [options] + +Required: + --name NAME Project name + +Optional: + --alias ALIAS Project alias (default: slugified name) + --desc DESC Project description + --owner OWNER Project owner + --scale small|medium|large Project scale (default: medium) + --risk low|medium|high Risk level (default: medium) + --gate-architecture enabled|disabled Optional gate (default: disabled) + --gate-code-review enabled|disabled Optional gate (default: disabled) + --gate-security enabled|disabled Optional gate (default: disabled) + --gate-privacy enabled|disabled Optional gate (default: disabled) + --git-enabled true|false Git policy enabled (default: false) + --git-commit-format FORMAT Commit format (default: "[role][phase] summary - reason") + --output PATH Output directory (default: ./workspace/specs/{alias}-YYYYMMDD-HHMM) + -h, --help Show help +USAGE +} + +die() { + echo "error: $*" >&2 + exit 1 +} + +command -v python3 >/dev/null 2>&1 || die "python3 is required" + +project_name="" +project_alias="" +project_desc="" +project_owner="" +scale="medium" +risk="medium" +_gate_arch="disabled" +_gate_code_review="disabled" +_gate_security="disabled" +_gate_privacy="disabled" +git_enabled="false" +git_commit_format="[role][phase] summary - reason" +output="" + +while [[ $# -gt 0 ]]; do + case "$1" in + --name) project_name="$2"; shift 2;; + --alias) project_alias="$2"; shift 2;; + --desc) project_desc="$2"; shift 2;; + --owner) project_owner="$2"; shift 2;; + --scale) scale="$2"; shift 2;; + --risk) risk="$2"; shift 2;; + --gate-architecture) _gate_arch="$2"; shift 2;; + --gate-code-review) _gate_code_review="$2"; shift 2;; + --gate-security) _gate_security="$2"; shift 2;; + --gate-privacy) _gate_privacy="$2"; shift 2;; + --git-enabled) git_enabled="$2"; shift 2;; + --git-commit-format) git_commit_format="$2"; shift 2;; + --output) output="$2"; shift 2;; + -h|--help) usage; exit 0;; + *) die "unknown arg: $1";; + esac +done + +[[ -z "$project_name" ]] && die "--name is required" + +if [[ -z "$project_alias" ]]; then + project_alias=$(echo "$project_name" | tr '[:upper:] ' '[:lower:]-' | tr -cd 'a-z0-9-') +fi + +if [[ -z "$output" ]]; then + output="./workspace/specs/${project_alias}-$(date +%Y%m%d-%H%M)" +fi + +if [[ -e "$output" ]]; then + die "output already exists: $output" +fi + +script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +template_dir="${script_dir}/../assets/workspace_template" + +mkdir -p "$output" +cp -R "$template_dir"/. "$output"/ + +date_str="$(date +%Y-%m-%d)" + +export TG_PROJECT_NAME="$project_name" +export TG_PROJECT_ALIAS="$project_alias" +export TG_PROJECT_DESC="$project_desc" +export TG_PROJECT_OWNER="$project_owner" +export TG_DATE="$date_str" +export TG_SCALE="$scale" +export TG_RISK="$risk" +export TG_GATE_ARCH="$_gate_arch" +export TG_GATE_CODE_REVIEW="$_gate_code_review" +export TG_GATE_SECURITY="$_gate_security" +export TG_GATE_PRIVACY="$_gate_privacy" +export TG_GIT_ENABLED="$git_enabled" +export TG_GIT_COMMIT_FORMAT="$git_commit_format" +export TG_CURRENT_PHASE="demand" +export TG_CURRENT_ROUND="1" +export TG_P0_COUNT="0" +export TG_LAST_DECISION="-" +export TG_NEXT_ACTION="collect requirements" + +replace_file() { + python3 - "$1" <<'PY' +import os +from pathlib import Path + +path = Path(os.environ["TARGET_FILE"]) +data = path.read_text() +repl = { + "project_name": os.environ.get("TG_PROJECT_NAME", ""), + "project_alias": os.environ.get("TG_PROJECT_ALIAS", ""), + "project_desc": os.environ.get("TG_PROJECT_DESC", ""), + "project_owner": os.environ.get("TG_PROJECT_OWNER", ""), + "date": os.environ.get("TG_DATE", ""), + "current_phase": os.environ.get("TG_CURRENT_PHASE", ""), + "current_round": os.environ.get("TG_CURRENT_ROUND", ""), + "p0_count": os.environ.get("TG_P0_COUNT", ""), + "last_decision": os.environ.get("TG_LAST_DECISION", ""), + "next_action": os.environ.get("TG_NEXT_ACTION", ""), +} +for k, v in repl.items(): + data = data.replace("{{" + k + "}}", v) + +# project.yaml optional fields +if path.name == "project.yaml": + data = data.replace("small|medium|large", os.environ.get("TG_SCALE", "medium")) + data = data.replace("low|medium|high", os.environ.get("TG_RISK", "medium")) + data = data.replace("enabled|disabled", "enabled" if os.environ.get("TG_GATE_ARCH") == "enabled" else "disabled", 1) + data = data.replace("enabled|disabled", "enabled" if os.environ.get("TG_GATE_CODE_REVIEW") == "enabled" else "disabled", 1) + data = data.replace("enabled|disabled", "enabled" if os.environ.get("TG_GATE_SECURITY") == "enabled" else "disabled", 1) + data = data.replace("enabled|disabled", "enabled" if os.environ.get("TG_GATE_PRIVACY") == "enabled" else "disabled", 1) + data = data.replace("true|false", "true" if os.environ.get("TG_GIT_ENABLED") == "true" else "false", 1) + data = data.replace("[role][phase] summary - reason", os.environ.get("TG_GIT_COMMIT_FORMAT", "[role][phase] summary - reason")) + +path.write_text(data) +PY +} + +for f in \ + "$output/00_meta/project.yaml" \ + "$output/00_meta/session.yaml" \ + "$output/00_meta/summary.md" \ + "$output/00_meta/decision_log.md" \ + "$output/00_meta/status.md"; do + export TARGET_FILE="$f" + replace_file "$f" +done + +echo "Workspace initialized at: $output" diff --git a/training/codes/training-system/src/main/java/com/sino/training/common/enums/QuestionType.java b/training/codes/training-system/src/main/java/com/sino/training/common/enums/QuestionType.java index e40e9b7..3f0c438 100644 --- a/training/codes/training-system/src/main/java/com/sino/training/common/enums/QuestionType.java +++ b/training/codes/training-system/src/main/java/com/sino/training/common/enums/QuestionType.java @@ -30,7 +30,12 @@ public enum QuestionType { /** * 简答题 */ - ESSAY(3, "简答题"); + ESSAY(3, "简答题"), + + /** + * 填空题 + */ + FILL_BLANK(4, "填空题"); @EnumValue private final int code; diff --git a/training/codes/training-system/src/main/java/com/sino/training/module/exam/entity/Paper.java b/training/codes/training-system/src/main/java/com/sino/training/module/exam/entity/Paper.java index 837b9f4..4c6c1ea 100644 --- a/training/codes/training-system/src/main/java/com/sino/training/module/exam/entity/Paper.java +++ b/training/codes/training-system/src/main/java/com/sino/training/module/exam/entity/Paper.java @@ -28,6 +28,21 @@ public class Paper extends BaseEntity { */ private String description; + /** + * 试卷分类ID + */ + private Long categoryId; + + /** + * 出卷方式:0-固定试卷,1-随机试卷 + */ + private Integer paperType; + + /** + * 随机试卷规则(JSON格式) + */ + private String randomRules; + /** * 总分 */ diff --git a/training/codes/training-system/src/main/java/com/sino/training/module/exam/entity/Question.java b/training/codes/training-system/src/main/java/com/sino/training/module/exam/entity/Question.java index 43f4509..ef41210 100644 --- a/training/codes/training-system/src/main/java/com/sino/training/module/exam/entity/Question.java +++ b/training/codes/training-system/src/main/java/com/sino/training/module/exam/entity/Question.java @@ -19,6 +19,11 @@ import java.time.LocalDateTime; @TableName("ex_question") public class Question extends BaseEntity { + /** + * 所属题库ID + */ + private Long bankId; + /** * 题目类型 */ @@ -43,13 +48,23 @@ public class Question extends BaseEntity { */ private String answer; + /** + * 难易程度:1-简单,2-一般,3-较难,4-困难 + */ + private Integer difficulty; + + /** + * 知识点,逗号分隔文本标签 + */ + private String knowledgePoints; + /** * 答案解析 */ private String analysis; /** - * 所属分类ID + * 所属分类ID(保留兼容) */ private Long categoryId; diff --git a/training-system/docs/PRD.md b/training/context/01-产品文档/PRD.md similarity index 99% rename from training-system/docs/PRD.md rename to training/context/01-产品文档/PRD.md index f23d550..dcf2883 100644 --- a/training-system/docs/PRD.md +++ b/training/context/01-产品文档/PRD.md @@ -128,8 +128,7 @@ | **V2** | 错题本 | 学员自动收集错题,巩固薄弱知识点 | | **V3** | 知识库增强 | 收藏、点赞、评论、全文搜索 | | **V3** | 奖励体系 | 积分、勋章、学习排行榜 | -| **V3** | 证书管理 | 培训/考试合格后自动颁发电子证书 | - +| **V3** | 证书管理 | 培训/考试 --- ## 四、关键业务逻辑 (Business Rules) diff --git a/training/context/01-产品文档/student.md b/training/context/01-产品文档/student.md new file mode 100644 index 0000000..4f3c9ed --- /dev/null +++ b/training/context/01-产品文档/student.md @@ -0,0 +1,664 @@ +# 学员端功能需求文档 + +> 版本:V1.0.1 +> 创建日期:2026-01-15 +> 更新日期:2026-01-15 +> 状态:✅ 已批准(Supervisor 复审通过) + +--- + +## 版本更新记录 + +### V1.0.1 (2026-01-15) + +**根据Supervisor审查意见修订:** + +| 修订项 | 修订内容 | +|--------|----------| +| 知识学习入口 | 补充培训任务学习场景、返回逻辑、来源区分 | +| 断点续考机制 | 补充定时任务策略、超时判定规则、并发处理 | +| 排名计算规则 | 明确计算时机、统计范围、口径定义 | +| 学习时长防刷 | 新增活跃检测机制 | +| 数据表设计 | km_knowledge_progress 新增 department_id 字段 | +| 页面路径 | 调整为复用现有路径,按角色控制 | +| 解析显示策略 | 明确交卷后立即显示解析 | +| 非功能需求 | 补充可测试的性能指标 | + +--- + +## 一、概述 + +### 1.1 目标用户 +- **角色**:学员(STUDENT) +- **人数**:约450人 +- **入口**:PC浏览器(与管理端共用系统,按角色显示不同菜单) + +### 1.2 核心目标 +为学员提供便捷的在线学习平台,支持知识学习、在线考试、培训计划跟踪,帮助学员提升专业技能。 + +--- + +## 二、功能模块总览 + +| 模块 | 功能点 | 优先级 | +|------|--------|--------| +| 工作台 | 学习概览、待办事项 | P0 | +| 知识学习 | 知识浏览、学习进度、时长统计 | P0 | +| 在线考试 | 考试列表、在线答题、断点续考、成绩排名 | P0 | +| 我的培训 | 培训计划、进度跟踪、完成判定 | P0 | +| 个人中心 | 学习记录、考试记录、证书(预留) | P1 | + +--- + +## 三、详细功能需求 + +### 3.1 工作台(首页) + +#### 用户故事 +> 作为学员,我希望登录后看到学习概览和待办事项,以便快速了解学习状态和接下来要做的事。 + +#### 功能清单 + +| 功能项 | 说明 | +|--------|------| +| 学习统计卡片 | 显示:待学习课程数、待完成考试数、培训进度百分比 | +| 我的培训计划 | 列表展示分配给我的培训计划(最多显示5条),显示进度 | +| 待完成考试 | 列表展示待完成的考试(最多显示5条),显示截止时间 | +| 快捷入口 | 点击可直接进入对应详情页 | + +#### 验收标准 +- [ ] 登录后默认进入工作台页面 +- [ ] 统计数据实时准确(待学习=未完成的必修知识数,待考试=未通过的必考考试数) +- [ ] 培训进度百分比 = 已完成必修项 / 总必修项 × 100% +- [ ] 点击培训计划可跳转到计划详情 +- [ ] 点击考试可跳转到考试页面 +- [ ] 只显示"进行中"状态的培训计划和处于"时间窗口内"的考试 + +--- + +### 3.2 知识学习 + +#### 用户故事 +> 作为学员,我希望浏览本部门的知识库,学习文档和视频,并能看到自己的学习进度。 + +#### 功能清单 + +| 功能项 | 说明 | +|--------|------| +| 知识分类导航 | 左侧树形结构展示知识分类 | +| 知识列表 | 按分类筛选,显示知识标题、类型、学习状态 | +| 知识详情/预览 | 文档在线预览、视频在线播放 | +| 学习进度记录 | 记录学习完成状态、学习时长 | +| 强制学习机制 | 视频必须播放完成、文档必须阅读完成才记录为"已完成" | + +#### 3.2.1 知识列表页 + +**页面元素**: +- 分类筛选(树形) +- 知识卡片列表:标题、类型图标(文档/视频)、学习状态标签、时长/大小 +- 搜索框(按标题搜索) + +**学习状态**: +| 状态 | 说明 | 显示样式 | +|------|------|----------| +| 未学习 | 从未打开过 | 灰色标签 | +| 学习中 | 已开始但未完成 | 蓝色标签 + 进度% | +| 已完成 | 满足完成条件 | 绿色标签 ✓ | + +#### 3.2.2 知识详情页 + +**文档类型**: +- 在线预览(PDF直接显示,Word/Excel/PPT转换预览) +- 学习计时:进入页面开始计时,离开页面停止 +- 完成条件:停留时间 ≥ 预估阅读时间(可配置,默认按页数计算) + +**视频类型**: +- 在线播放(支持进度条、全屏) +- 播放进度记录:记录当前播放位置,下次打开从断点继续 +- 完成条件:播放进度 ≥ 90%(可配置) +- 禁止拖动快进(强制学习模式下) + +#### 3.2.3 学习入口场景(🔴 修订项1) + +**场景一:自由学习(从知识库进入)** +- 入口:左侧菜单"知识库" → 知识列表 → 知识详情 +- 学习完成后:停留在知识详情页,可点击"返回列表" +- 进度记录:标记来源为 `FREE`(自由学习) + +**场景二:培训任务学习(从培训计划进入)** +- 入口:培训详情页 → 点击知识项 → 知识详情 +- 页面顶部显示:返回培训计划入口(如:"← 返回《2026年Q1安全规范培训》") +- 学习完成后: + - 自动弹出提示:"学习完成!是否返回培训计划?" + - 用户可选择【返回培训】或【继续浏览】 +- 进度记录:标记来源为 `TRAINING`(培训任务),关联 `plan_id` + +**进度记录来源区分**: +| 来源 | 场景 | 影响 | +|------|------|------| +| FREE | 自由学习 | 仅记录个人学习进度 | +| TRAINING | 培训任务学习 | 同时更新培训计划进度 | + +> **说明**:无论从哪个入口学习,学习时长和完成状态都会记录。区分来源是为了后续统计分析(如:培训驱动的学习 vs 自主学习)。 + +#### 3.2.4 学习时长防刷机制(🟡 优化项1) + +**文档类型防刷策略**: +- 每60秒检测一次用户活跃状态 +- 活跃判定:60秒内有鼠标移动、点击、滚动任一事件 +- 非活跃时:暂停计时,页面显示"检测到您暂时离开,学习计时已暂停" +- 恢复活跃后:继续计时 + +**视频类型防刷策略**: +- 依赖视频播放事件,暂停时不计时长 +- 无需额外活跃检测 + +**多标签页处理**: +- 同一知识同时只能在一个标签页学习 +- 检测到多标签页打开同一知识时,后打开的标签页提示"该知识已在其他窗口学习中" + +#### 验收标准 +- [ ] 只显示本部门、已发布状态的知识 +- [ ] 分类树正确展示,点击分类筛选对应知识 +- [ ] 文档能正常在线预览(至少支持PDF) +- [ ] 视频能正常播放,支持暂停、音量调节 +- [ ] 视频播放进度自动保存,刷新页面后从断点继续 +- [ ] 强制学习模式下,视频不能快进跳过 +- [ ] 学习时长准确记录(精确到秒) +- [ ] 满足完成条件后自动标记为"已完成" +- [ ] 学习进度与培训计划进度联动 +- [ ] 🔴 从培训计划进入的知识学习,顶部显示返回入口 +- [ ] 🔴 学习完成后弹出返回培训计划提示(仅培训任务学习场景) +- [ ] 🟡 文档学习时,非活跃状态暂停计时 +- [ ] 🟡 同一知识不能在多个标签页同时学习 + +--- + +### 3.3 在线考试 + +#### 用户故事 +> 作为学员,我希望参加分配给我的考试,并能查看成绩和排名。 + +#### 功能清单 + +| 功能项 | 说明 | +|--------|------| +| 考试列表 | 展示分配给我的所有考试 | +| 考试详情 | 显示考试信息、我的考试记录 | +| 在线答题 | 单选/多选/判断题作答 | +| 断点续考 | 中途退出后可继续答题 | +| 自动交卷 | 时间到自动提交 | +| 成绩查看 | 显示得分、答案解析 | +| 成绩排名 | 显示我在本次考试中的排名 | + +#### 3.3.1 考试列表页 + +**列表字段**: +| 字段 | 说明 | +|------|------| +| 考试名称 | 点击进入考试详情 | +| 考试时间 | 开始时间 ~ 结束时间 | +| 考试状态 | 未开始/进行中/已结束 | +| 我的状态 | 未参加/考试中/已完成 | +| 最高成绩 | 多次考试取最高分 | +| 剩余次数 | 最大次数 - 已考次数 | +| 操作 | 进入考试/查看成绩 | + +**筛选条件**: +- 考试状态:全部/进行中/已结束 +- 我的状态:全部/未完成/已完成 + +#### 3.3.2 考试详情页(进入考试前) + +**显示信息**: +- 考试名称、考试时间窗口 +- 考试规则:时长、总分、及格线、最大次数 +- 我的考试记录表格(第N次、得分、是否通过、时间) +- 【开始考试】/【继续考试】按钮 + +**按钮逻辑**: +| 场景 | 按钮状态 | +|------|----------| +| 不在时间窗口内 | 禁用,提示"考试未开始"或"考试已结束" | +| 次数已用完 | 禁用,提示"考试次数已用完" | +| 有进行中的考试记录 | 显示【继续考试】 | +| 可以开始新考试 | 显示【开始考试】 | + +#### 3.3.3 在线答题页 + +**页面布局**: +``` +┌─────────────────────────────────────────────────────────┐ +│ 考试名称 剩余时间: 45:23 │ +├─────────────────────────────────────────────────────────┤ +│ 第 3 题 / 共 20 题 [单选题] │ +│ ───────────────────────────────────────────────────── │ +│ 题干内容... │ +│ │ +│ ○ A. 选项A │ +│ ● B. 选项B(已选中) │ +│ ○ C. 选项C │ +│ ○ D. 选项D │ +├─────────────────────────────────────────────────────────┤ +│ 答题卡: [1✓] [2✓] [3●] [4○] [5○] ... │ +├─────────────────────────────────────────────────────────┤ +│ [上一题] [下一题] [交卷] │ +└─────────────────────────────────────────────────────────┘ +``` + +**功能说明**: +| 功能 | 说明 | +|------|------| +| 倒计时 | 显示剩余时间,最后5分钟变红色提醒 | +| 题目导航 | 点击答题卡数字可跳转到对应题目 | +| 答案自动保存 | 选择答案后自动保存到服务器(每30秒或切题时) | +| 上一题/下一题 | 切换题目 | +| 交卷 | 弹出确认框,确认后提交 | +| 自动交卷 | 时间结束自动提交当前答案 | + +**断点续考机制**: +- 考试开始后创建考试记录,状态为"进行中" +- 答案实时保存到服务器 +- 中途关闭浏览器/断网,考试记录保持"进行中" +- 重新打开考试,检测到进行中记录,恢复到上次状态 +- 倒计时从剩余时间继续(服务端计算:考试时长 - 已用时间) +- 超时未提交的考试,由定时任务自动交卷 + +#### 3.3.5 超时自动交卷机制(🔴 修订项2) + +**超时判定规则**: +``` +超时时间点 = 考试记录开始时间 + 考试时长(分钟) +``` + +**示例**: +- 学员A在 10:00 开始考试,考试时长60分钟 +- 超时时间点 = 10:00 + 60分钟 = 11:00 +- 无论考试时间窗口是否结束,11:00后该考试记录即视为超时 + +**定时任务策略**: +| 配置项 | 值 | 说明 | +|--------|-----|------| +| 执行频率 | 每1分钟 | Cron: `0 */1 * * * ?` | +| 扫描范围 | 状态为IN_PROGRESS的考试记录 | 只处理进行中的记录 | +| 超时判定 | 当前时间 > 开始时间 + 考试时长 | 精确到秒 | +| 处理动作 | 自动提交当前已保存的答案,计算成绩 | 标记为系统自动交卷 | + +**并发提交处理(乐观锁)**: +``` +场景:学员在超时前1秒点击交卷,同时定时任务也在处理该记录 +``` + +**处理策略**: +1. 考试记录表增加 `version` 字段(乐观锁) +2. 提交时检查 `status = IN_PROGRESS AND version = 当前版本` +3. 更新时 `version = version + 1` +4. 若更新失败(version已变),说明已被其他请求处理,直接返回已提交的结果 + +**状态流转**: +``` +IN_PROGRESS ──用户主动交卷──▶ SUBMITTED(来源:USER) + │ + └──────定时任务超时交卷──▶ SUBMITTED(来源:SYSTEM_TIMEOUT) +``` + +**交卷来源标记**: +| 来源 | 说明 | +|------|------| +| USER | 用户主动交卷 | +| SYSTEM_TIMEOUT | 系统超时自动交卷 | + +> **注意**:即使考试时间窗口已结束,只要考试记录未超时,学员仍可继续答题(但无法开始新的考试) + +#### 3.3.6 考试结果页 + +**显示内容**: +| 项目 | 说明 | +|------|------| +| 得分 | 大字显示,及格绿色/不及格红色 | +| 是否通过 | 通过✓ / 未通过✗ | +| 排名 | "您的成绩排名第 X 名(共 Y 人参加)" | +| 答题详情 | 每道题的正确答案、我的答案、解析 | +| 操作按钮 | 【再考一次】(有次数)/ 【返回列表】 | + +**答案解析显示策略(🟡 优化项4)**: +- 交卷后立即显示所有题目的答案解析 +- 无论考试是否通过,都显示解析 +- 目的:培训学习为主,帮助学员理解错误原因 + +#### 3.3.7 排名计算规则(🔴 修订项3) + +**计算时机**: +- 实时计算:每次交卷时计算排名 +- 非定时计算:不采用批量定时计算方式 + +**统计范围**: +- 范围:当前考试的所有参与者(被分配且已交卷的学员) +- 跨部门:若考试分配给多个部门,排名为所有参与者的总排名 + +**排名规则**: +| 优先级 | 规则 | 说明 | +|--------|------|------| +| 1 | 最高成绩降序 | 成绩高的排名靠前 | +| 2 | 达到最高成绩的时间升序 | 成绩相同时,先达到该成绩的排名靠前 | + +**"共Y人参加"统计口径**: +| 统计项 | 是否计入 | +|--------|----------| +| 已交卷学员 | ✅ 计入 | +| 正在考试中(未交卷) | ❌ 不计入 | +| 被分配但未参加 | ❌ 不计入 | + +**排名示例**: +``` +考试:安全规范考核 +分配对象:部门A(30人)、部门B(20人) + +参与情况: +- 部门A:25人已交卷,5人未参加 +- 部门B:18人已交卷,2人正在考试中 + +排名统计:共 43 人参加(25 + 18 = 43) + +排名结果: +第1名:张三(95分,首次达到时间 10:30) +第2名:李四(95分,首次达到时间 10:45) +第3名:王五(90分) +... +``` + +**实现建议**: +- 交卷时实时计算排名并返回 +- 排名计算SQL示例思路: + ```sql + SELECT user_id, MAX(score) as best_score, MIN(submit_time) as first_best_time + FROM ex_exam_record + WHERE exam_id = ? AND status = 'SUBMITTED' + GROUP BY user_id + ORDER BY best_score DESC, first_best_time ASC + ``` + +#### 验收标准 +- [ ] 只显示分配给当前学员的考试 +- [ ] 考试状态、我的状态准确显示 +- [ ] 不在时间窗口内无法进入考试 +- [ ] 次数用完无法再次考试 +- [ ] 答题过程中答案实时保存 +- [ ] 刷新页面/重新进入可继续答题(断点续考) +- [ ] 倒计时准确,超时自动交卷 +- [ ] 交卷后立即显示成绩和排名 +- [ ] 答案解析正确显示 +- [ ] 多次考试取最高分显示 +- [ ] 🔴 定时任务每分钟执行,自动处理超时考试记录 +- [ ] 🔴 并发交卷场景下数据一致(乐观锁机制) +- [ ] 🔴 排名实时计算,仅统计已交卷学员 +- [ ] 🔴 排名规则:最高分优先,同分按首次达到时间排序 + +--- + +### 3.4 我的培训 + +#### 用户故事 +> 作为学员,我希望查看分配给我的培训计划,跟踪学习进度,完成培训任务。 + +#### 功能清单 + +| 功能项 | 说明 | +|--------|------| +| 培训列表 | 展示分配给我的培训计划 | +| 培训详情 | 显示计划内容、学习进度 | +| 进度跟踪 | 实时显示知识学习、考试完成情况 | +| 完成判定 | 根据必修项判定培训是否完成 | +| 证书预留 | 培训完成后预留证书/徽章展示位置 | + +#### 3.4.1 培训列表页 + +**列表字段**: +| 字段 | 说明 | +|------|------| +| 培训名称 | 点击进入详情 | +| 培训周期 | 开始日期 ~ 结束日期 | +| 状态 | 未开始/进行中/已结束 | +| 我的进度 | 进度条 + 百分比 | +| 完成状态 | 未完成/已完成 | + +#### 3.4.2 培训详情页 + +**页面结构**: +``` +┌─────────────────────────────────────────────────────────┐ +│ 2026年Q1安全规范培训 │ +│ ───────────────────────────────────────────────────── │ +│ 培训周期:2026-01-01 ~ 2026-03-31 │ +│ 培训目标:掌握高速公路救援安全规范... │ +│ 我的进度:████████░░░░ 75% │ +├─────────────────────────────────────────────────────────┤ +│ 📚 学习内容 (3/5) │ +│ ├─ ✅ 高速救援SOP手册 [必修] [已完成] │ +│ ├─ ✅ 安全操作视频 [必修] [已完成] │ +│ ├─ 🔵 应急处理流程 [必修] [学习中 60%] │ +│ ├─ ⚪ 设备使用指南 [选修] [未学习] │ +│ └─ ✅ 案例分析 [选修] [已完成] │ +├─────────────────────────────────────────────────────────┤ +│ 📝 考试任务 (1/2) │ +│ ├─ ✅ 安全规范考核 [必考] [已通过 85分] │ +│ └─ ⚪ 操作技能测试 [必考] [未参加] │ +├─────────────────────────────────────────────────────────┤ +│ 🏆 完成奖励 │ +│ └─ 完成培训后可获得【安全规范认证】徽章(敬请期待) │ +└─────────────────────────────────────────────────────────┘ +``` + +**进度计算规则**: + +``` +培训进度 = (已完成必修知识数 + 已通过必考考试数) / (必修知识总数 + 必考考试总数) × 100% +``` + +**完成判定规则**: +| 条件 | 说明 | +|------|------| +| 所有必修知识已完成 | ✓ | +| 所有必考考试已通过 | ✓ | +| 选修知识 | 不影响完成判定 | +| 选考考试 | 不影响完成判定 | + +#### 验收标准 +- [ ] 只显示分配给当前学员的培训计划 +- [ ] 进度百分比计算准确(只计算必修项) +- [ ] 学习内容、考试任务分开展示 +- [ ] 显示每项的必修/选修、必考/选考标签 +- [ ] 点击知识内容可跳转到知识详情页 +- [ ] 点击考试任务可跳转到考试页面 +- [ ] 所有必修项完成后,培训状态变为"已完成" +- [ ] 证书/徽章区域预留(V1显示"敬请期待") + +--- + +### 3.5 个人中心 + +#### 用户故事 +> 作为学员,我希望查看自己的学习记录、考试历史和获得的证书。 + +#### 功能清单 + +| 功能项 | 说明 | +|--------|------| +| 个人信息 | 显示姓名、部门、角色 | +| 学习统计 | 总学习时长、完成课程数 | +| 学习记录 | 知识学习历史列表 | +| 考试记录 | 考试历史列表 | +| 我的证书 | 证书/徽章展示(预留) | + +#### 验收标准 +- [ ] 正确显示当前用户信息 +- [ ] 学习时长统计准确(累计所有知识学习时长) +- [ ] 学习记录按时间倒序展示 +- [ ] 考试记录显示每次考试的详情 +- [ ] 证书模块预留(V1显示"暂无证书") + +--- + +## 四、数据契约补充 + +### 4.1 新增/修改实体 + +#### 知识学习进度表 (km_knowledge_progress) - 新增 + +| 字段 | 类型 | 说明 | +|------|------|------| +| id | Long | 主键 | +| user_id | Long | 学员ID | +| knowledge_id | Long | 知识ID | +| department_id | Long | **🟡 新增** 所属部门(冗余字段,便于按部门统计) | +| status | Enum | 状态:NOT_STARTED/IN_PROGRESS/COMPLETED | +| progress | Integer | 进度百分比(0-100) | +| duration | Long | 学习时长(秒) | +| video_position | Long | 视频播放位置(秒),仅视频类型 | +| source | Enum | **🔴 新增** 学习来源:FREE/TRAINING | +| plan_id | Long | **🔴 新增** 关联培训计划ID(来源为TRAINING时有值) | +| start_time | DateTime | 首次学习时间 | +| complete_time | DateTime | 完成时间 | +| update_time | DateTime | 最后更新时间 | + +#### 考试记录表 (ex_exam_record) - 补充字段 + +| 字段 | 类型 | 说明 | +|------|------|------| +| status | Enum | **新增** 状态:IN_PROGRESS/SUBMITTED | +| last_save_time | DateTime | **新增** 最后保存时间(断点续考用) | +| version | Integer | **🔴 新增** 乐观锁版本号 | +| submit_source | Enum | **🔴 新增** 交卷来源:USER/SYSTEM_TIMEOUT | + +### 4.2 新增枚举 + +```java +// 学习状态 +public enum LearningStatus { + NOT_STARTED, // 未学习 + IN_PROGRESS, // 学习中 + COMPLETED // 已完成 +} + +// 🔴 学习来源 +public enum LearningSource { + FREE, // 自由学习(从知识库直接进入) + TRAINING // 培训任务学习(从培训计划进入) +} + +// 考试记录状态 +public enum ExamRecordStatus { + IN_PROGRESS, // 考试中(用于断点续考) + SUBMITTED // 已提交 +} + +// 🔴 交卷来源 +public enum SubmitSource { + USER, // 用户主动交卷 + SYSTEM_TIMEOUT // 系统超时自动交卷 +} +``` + +--- + +## 五、接口预留(V2/V3功能) + +### 5.1 证书/徽章接口(预留) + +``` +POST /api/certificate/generate # 生成证书 +GET /api/certificate/my # 我的证书列表 +GET /api/certificate/{id} # 证书详情 +GET /api/badge/my # 我的徽章列表 +``` + +### 5.2 错题本接口(V2预留) + +``` +GET /api/wrong-questions # 错题列表 +POST /api/wrong-questions/review # 标记已复习 +``` + +--- + +## 六、非功能需求 + +| 项目 | 要求 | 测试指标(🟡 优化项5) | +|------|------|------------------------| +| 页面加载 | 页面加载 < 2秒 | 95%请求 < 2秒 | +| 考试提交 | 考试提交 < 1秒 | 99%请求 < 1秒 | +| 并发支持 | 支持100人同时在线考试 | 100并发答题,响应时间 < 500ms,成功率 > 99.9% | +| 答案保存 | 答案自动保存 | 保存成功率 > 99.99%,保存延迟 < 300ms | +| 数据安全 | 考试答案定时自动保存,防止数据丢失 | 断网重连后数据无丢失 | +| 兼容性 | 支持主流浏览器 | Chrome 90+、Edge 90+、Firefox 90+ | + +--- + +## 七、不做什么(Out of Scope) + +| 功能 | 原因 | +|------|------| +| 移动端适配 | V1仅支持PC浏览器 | +| 防作弊功能 | 产品确认不需要 | +| 学习日历 | 产品确认不需要 | +| 错题本 | V2规划 | +| 社交功能(评论、点赞) | V3规划 | + +--- + +## 八、页面清单(🟡 优化项3) + +> **说明**:采用与管理端复用同一套系统的方案,按角色控制菜单和功能显示,不使用独立的 `/student/` 路径前缀。 + +| 页面 | 路径 | 角色可见 | 说明 | +|------|------|----------|------| +| 工作台 | /index.html | 全角色 | 根据角色显示不同内容 | +| 知识列表 | /knowledge/list.html | 全角色 | 学员只读,讲师可管理 | +| 知识详情 | /knowledge/view.html?id={id} | 全角色 | 学员增加学习进度记录 | +| 考试列表 | /exam/my-exams.html | 学员 | 我的考试列表 | +| 考试详情 | /exam/detail.html?id={id} | 学员 | 考试信息页 | +| 在线答题 | /exam/answer.html?id={id} | 学员 | 答题页面 | +| 考试结果 | /exam/result.html?recordId={id} | 学员 | 成绩结果页 | +| 培训列表 | /training/my-training.html | 学员 | 我的培训列表 | +| 培训详情 | /training/detail.html?id={id} | 学员 | 培训计划详情 | +| 个人中心 | /profile/index.html | 全角色 | 个人信息页 | +| 学习记录 | /profile/learning.html | 学员 | 学习记录列表 | +| 考试记录 | /profile/exam-history.html | 学员 | 考试记录列表 | +| 我的证书 | /profile/certificate.html | 学员 | 证书展示(预留) | + +**菜单权限控制**: +| 菜单项 | 管理员 | 讲师 | 学员 | +|--------|--------|------|------| +| 工作台 | ✅ | ✅ | ✅ | +| 知识库 | ✅ 管理 | ✅ 管理 | ✅ 只读学习 | +| 考题管理 | ✅ | ✅ | ❌ | +| 试卷管理 | ✅ | ✅ | ❌ | +| 考试管理 | ✅ | ✅ | ❌ | +| 我的考试 | ❌ | ❌ | ✅ | +| 培训计划 | ✅ | ✅ | ❌ | +| 我的培训 | ❌ | ❌ | ✅ | +| 个人中心 | ✅ | ✅ | ✅ | +| 系统设置 | ✅ | ❌ | ❌ | + +--- + +## 九、修订项对照表 + +| 修订项 | 类型 | 章节位置 | 状态 | +|--------|------|----------|------| +| 知识学习入口场景 | 🔴 必须修正 | 3.2.3 | ✅ 已补充 | +| 断点续考超时机制 | 🔴 必须修正 | 3.3.5 | ✅ 已补充 | +| 排名计算规则 | 🔴 必须修正 | 3.3.7 | ✅ 已补充 | +| 学习时长防刷机制 | 🟡 建议优化 | 3.2.4 | ✅ 已采纳 | +| 数据表department_id | 🟡 建议优化 | 4.1 | ✅ 已采纳 | +| 页面路径设计 | 🟡 建议优化 | 8 | ✅ 已调整 | +| 答案解析显示策略 | 🟡 建议优化 | 3.3.6 | ✅ 已明确 | +| 非功能需求测试指标 | 🟡 建议优化 | 6 | ✅ 已补充 | + +--- + +**文档状态:✅ 已批准** + +> **Supervisor 复审结论**:通过 +> **复审日期**:2026-01-15 +> **下一阶段**:技术评审 → 开发 diff --git a/training/context/02-产品架构/01-产品整体架构.md b/training/context/02-产品架构/01-产品整体架构.md new file mode 100644 index 0000000..b853e47 --- /dev/null +++ b/training/context/02-产品架构/01-产品整体架构.md @@ -0,0 +1,379 @@ +# 产品整体架构文档 — 道路救援企业培训系统 + +> 版本:V1.0 +> 生成日期:2026-04-07 +> 证据状态:✅ 已验证 +> 证据来源:[SRC-FEAT-01] [SRC-SQL-01] [SRC-API-01] [SRC-CODE-01] + +--- + +## 1. 产品定位 + +### 1.1 产品目标 + +为道路救援企业提供**一站式内部培训管理平台**,通过数字化方式替代口口相传的知识传承模式,实现知识沉淀、在线考核、培训过程管控三位一体。[SRC-FEAT-01] + +### 1.2 核心价值 + +| 价值维度 | 解决的痛点 | 实现方式 | +|---------|---------|---------| +| 知识沉淀 | 知识依赖口口相传,无法沉淀 | 结构化知识库(文档+视频) | +| 高效考核 | 出题组卷效率低,纸质考试成本高 | 在线题库 + 自动/手动组卷 + 在线考试 | +| 培训管控 | 培训效果难追踪,进度不透明 | 培训计划+进度跟踪+成绩统计 | +| 标准化输出 | 服务标准参差不齐 | 统一平台 + 及格线控制 + 必考机制 | + +### 1.3 目标用户 + +| 角色 | 人数 | 核心诉求 | +|------|------|---------| +| 管理员 | 3-5人 | 系统配置、人员管理、全平台数据可见 | +| 讲师(技师) | 30-50人 | 本部门知识上传、出题、发布考试、管理培训计划 | +| 学员 | ~450人 | 学习资料、参加考试、查看进度 | + +[SRC-FEAT-01:二、用户画像] + +### 1.4 使用场景 + +- **管理员场景**:系统初始化时维护组织架构;日常监控各部门培训完成情况。 +- **讲师场景**:救援规范更新后,上传新手册并更新题库,发布新考试,关联到培训计划。 +- **学员场景**:PC端浏览知识库预习、参加指定考试、查看自己的培训进度。 +- **企业微信场景**:学员通过企业微信 H5 入口完成移动端学习和考试。 + +--- + +## 2. 系统整体架构 + +### 2.1 架构分层 + +| 层次 | 组件 | 职责 | +|-----|------|------| +| **表现层** | PC浏览器(管理员/讲师)、企业微信H5(学员)、移动端浏览器 | 用户交互,HTML+CSS+JS 原生技术栈 | +| **网关层** | Spring Boot 应用(JWT认证、权限拦截、日志、异常处理) | 请求入口,统一认证鉴权,全局异常处理 | +| **业务层** | 5个业务模块(auth / system / knowledge / exam / training) | 核心业务逻辑,按模块边界划分,禁止跨模块直接调用数据层 | +| **数据层** | MySQL 8.0(MyBatis Plus ORM)+ 文件存储(本地/MinIO/OSS) | 持久化业务数据和媒体文件 | + +[SRC-FEAT-01:七、架构设计蓝图] + +### 2.2 技术架构概览 + +| 技术选型 | 版本 | 用途 | +|---------|------|------| +| Spring Boot | 3.1.2 | 主框架 | +| MyBatis Plus | 3.5.3+ | ORM,简化CRUD | +| MySQL | 8.0 | 主数据库 | +| java-jwt | 4.4+ | JWT Token 签发与验证 | +| Spring Security | 6.x | BCrypt 密码加密 | +| weixin-java-cp | - | 企业微信 SDK(OAuth 登录) | +| Springdoc OpenAPI | 2.2+ | API 文档 | +| Spring @Scheduled | - | 考试超时自动交卷定时任务 | +| 文件存储 | - | V1 本地存储,V2 可扩展 MinIO/OSS | + +[SRC-FEAT-01:7.3 技术选型] + +### 2.3 系统依赖关系 + +``` +外部系统依赖: + 企业微信API ←→ auth 模块(OAuth 换 userid) + 文件存储服务 ←→ knowledge 模块(上传/下载文件) + 文档预览服务(可选) ←→ knowledge 模块(在线预览) + +内部模块依赖方向(单向,禁止逆向调用): + training → knowledge(引用知识内容、学习进度) + training → exam(引用考试通过状态) + knowledge / exam / training → system(查询用户/部门信息) + 所有模块 → auth(权限校验拦截器) +``` + +--- + +## 3. 业务架构图 + +```mermaid +graph TD + subgraph 客户端 + PC[PC浏览器
管理员/讲师] + WX[企业微信H5
学员] + MB[移动端浏览器
学员] + end + + subgraph 后端服务 + subgraph 网关层 + GW[JWT认证 / 权限拦截 / 异常处理] + end + + subgraph 业务域 + AUTH[认证模块
auth] + SYS[系统管理
system] + KM[知识库模块
knowledge] + EX[考试模块
exam] + TR[培训模块
training] + end + end + + subgraph 数据层 + DB[(MySQL 8.0)] + FS[文件存储
本地/MinIO] + end + + subgraph 外部服务 + WXAPI[企业微信API] + PREVIEW[文档预览服务
可选] + end + + PC --> GW + WX --> GW + MB --> GW + GW --> AUTH + GW --> SYS + GW --> KM + GW --> EX + GW --> TR + + AUTH --> WXAPI + KM --> FS + KM --> PREVIEW + + TR --> KM + TR --> EX + KM --> SYS + EX --> SYS + TR --> SYS + + AUTH --> DB + SYS --> DB + KM --> DB + EX --> DB + TR --> DB +``` + +--- + +## 4. 核心业务流程说明 + +### 4.1 用户主流程(学员) + +```mermaid +sequenceDiagram + participant 学员 + participant 前端 + participant 后端 + participant 企业微信 + + 学员->>前端: 点击企业微信登录 + 前端->>企业微信: 跳转 OAuth 授权 + 企业微信-->>前端: 返回 code + 前端->>后端: code 换 Token + 后端->>企业微信: code → userid + 后端->>后端: 查 sys_user 匹配 + alt 用户已录入 + 后端-->>前端: JWT Token + 用户信息 + 前端->>学员: 进入工作台 + else 用户未录入 + 后端-->>前端: 错误:联系管理员 + end + + 学员->>前端: 查看培训计划 + 前端->>后端: GET /api/student/training + 后端-->>前端: 计划列表 + 进度 + + 学员->>前端: 参加考试 + 前端->>后端: POST /api/student/exam/{id}/start + 后端->>后端: 校验时间窗口 + 剩余次数 + 后端-->>前端: 试题 + 考试时长 + 学员->>前端: 答题 + 交卷 + 前端->>后端: POST /api/student/exam/{id}/submit + 后端->>后端: 自动判分 + 后端-->>前端: 成绩 + 排名 + 答案解析 +``` + +### 4.2 管理流程(讲师) + +```mermaid +flowchart LR + A[上传知识
DRAFT] --> B[发布知识
PUBLISHED] + B --> C{有培训计划?} + C -->|是| D[关联到培训计划] + C -->|否| E[学员自由学习] + + F[创建题目
DRAFT] --> G[发布题目
PUBLISHED] + G --> H[组卷
手动/自动] + H --> I[发布试卷
PUBLISHED] + I --> J[创建考试
设置时间/次数] + J --> K[指定考试对象
部门/小组/个人] + D --> L[创建培训计划] + J --> L + L --> M[分配学员
部门/小组/个人] + M --> N[发布培训计划] +``` + +### 4.3 数据流转流程 + +```mermaid +flowchart TB + subgraph 内容生产 + KM_CREATE[知识创建
km_knowledge DRAFT] + KM_PUBLISH[发布知识
PUBLISHED] + QS_CREATE[题目创建
ex_question DRAFT] + QS_PUBLISH[发布题目
PUBLISHED] + PP_CREATE[组卷
ex_paper + ex_paper_question] + EX_CREATE[创建考试
ex_exam + ex_exam_target] + TR_CREATE[培训计划
tr_plan + tr_plan_knowledge
+ tr_plan_exam + tr_plan_target] + end + + subgraph 学员消费 + LEARN[学习知识
→ km_knowledge_progress UPSERT] + EXAM[参加考试
→ ex_exam_record 创建/更新] + PROGRESS[进度计算
必修知识完成数 + 必考通过数] + end + + KM_CREATE --> KM_PUBLISH --> LEARN + QS_CREATE --> QS_PUBLISH --> PP_CREATE --> EX_CREATE --> EXAM + TR_CREATE --> LEARN + TR_CREATE --> EXAM + LEARN --> PROGRESS + EXAM --> PROGRESS +``` + +--- + +## 5. 数据架构 + +### 5.1 核心数据实体(共19张表) + +[SRC-SQL-01] [SRC-SQL-02] + +| 数据域 | 表名 | 核心字段 | 说明 | +|-------|------|---------|------| +| **系统** | sys_center | id, name | 中心(最高层级) | +| **系统** | sys_department | id, name, center_id | 部门(隶属中心) | +| **系统** | sys_group | id, name, department_id | 小组(隶属部门) | +| **系统** | sys_user | id, wx_userid, role(0/1/2), department_id, group_id, status | 用户(ADMIN/LECTURER/STUDENT) | +| **知识库** | km_category | id, name, parent_id, department_id | 知识分类(多级树) | +| **知识库** | km_knowledge | id, title, type(0文档/1视频), file_url, department_id, status(0/1/2) | 知识内容 | +| **知识库** | km_knowledge_progress | id, user_id, knowledge_id, status, progress, duration, video_position, source, plan_id | 学习进度 | +| **考试** | ex_question_category | id, name, parent_id, department_id | 题目分类 | +| **考试** | ex_question | id, type(0/1/2), content, options(JSON), answer, analysis, status | 题目 | +| **考试** | ex_paper | id, title, total_score, duration, pass_score, status | 试卷 | +| **考试** | ex_paper_question | paper_id, question_id, score, sort_order | 试卷-题目关联 | +| **考试** | ex_exam | id, title, paper_id, start_time, end_time, max_attempts, status(0/1/2) | 考试 | +| **考试** | ex_exam_target | exam_id, target_type(0部门/1小组/2个人), target_id | 考试对象 | +| **考试** | ex_exam_record | id, exam_id, user_id, attempt_no, score, passed, answers(JSON), status, version | 考试记录(含乐观锁) | +| **培训** | tr_plan | id, title, start_date, end_date, department_id, status(0/1/2) | 培训计划 | +| **培训** | tr_plan_knowledge | plan_id, knowledge_id, required, sort_order | 计划-知识关联 | +| **培训** | tr_plan_exam | plan_id, exam_id, required, sort_order | 计划-考试关联(V1.0.1) | +| **培训** | tr_plan_target | plan_id, target_type, target_id | 计划-对象 | +| **培训** | tr_plan_progress | plan_id, user_id, knowledge_id, completed, complete_time | 旧版进度(已被 km_knowledge_progress 替代)| + +### 5.2 实体关系图 + +```mermaid +erDiagram + sys_center ||--o{ sys_department : "中心下辖多个部门" + sys_department ||--o{ sys_group : "部门下辖多个小组" + sys_department ||--o{ sys_user : "用户属于部门" + sys_group ||--o{ sys_user : "用户可归属小组" + + sys_department ||--o{ km_category : "按部门隔离" + km_category ||--o{ km_knowledge : "知识归属分类" + sys_user ||--o{ km_knowledge_progress : "学员学习进度" + km_knowledge ||--o{ km_knowledge_progress : "知识对应进度" + + sys_department ||--o{ ex_question_category : "按部门隔离" + ex_question_category ||--o{ ex_question : "题目归属分类" + ex_paper ||--o{ ex_paper_question : "试卷包含多道题" + ex_question ||--o{ ex_paper_question : "题目被多张试卷引用" + ex_paper ||--|| ex_exam : "考试使用某试卷" + ex_exam ||--o{ ex_exam_target : "考试指定对象" + ex_exam ||--o{ ex_exam_record : "考试产生记录" + sys_user ||--o{ ex_exam_record : "学员的考试记录" + + tr_plan ||--o{ tr_plan_knowledge : "计划包含多个知识" + tr_plan ||--o{ tr_plan_exam : "计划关联多场考试" + tr_plan ||--o{ tr_plan_target : "计划分配给对象" + km_knowledge ||--o{ tr_plan_knowledge : "知识被计划引用" + ex_exam ||--o{ tr_plan_exam : "考试被计划引用" +``` + +### 5.3 数据生命周期 + +| 数据类型 | 创建 | 有效态 | 失效态 | 删除方式 | +|---------|------|-------|-------|---------| +| 知识/题目/试卷 | DRAFT | PUBLISHED | OFFLINE | 逻辑删除(deleted=1) | +| 考试 | NOT_STARTED | IN_PROGRESS | ENDED | 逻辑删除 | +| 培训计划 | NOT_STARTED | IN_PROGRESS | ENDED | 逻辑删除 | +| 考试记录 | IN_PROGRESS | SUBMITTED | 永久保留(取最高分) | 不删除 | +| 学习进度 | NOT_STARTED | IN_PROGRESS | COMPLETED | UPSERT更新 | + +--- + +## 6. 权限与角色体系 + +### 6.1 角色定义 + +[SRC-FEAT-01:4.1 权限规则] [SRC-SQL-01:sys_user.role] + +| 角色 | 枚举值(DB) | 数据范围 | +|------|------------|---------| +| 管理员 ADMIN | role=0 | 全平台(无部门隔离) | +| 讲师 LECTURER | role=1 | 本部门(department_id匹配) | +| 学员 STUDENT | role=2 | 本部门(只读;自己的进度/成绩) | + +### 6.2 权限分层(按功能菜单) + +| 菜单/功能 | ADMIN | LECTURER | STUDENT | +|---------|-------|---------|---------| +| 组织架构管理 | ✅ 全部 | ❌ | ❌ | +| 员工管理 | ✅ 全部 | 👁️ 本部门只读 | ❌ | +| 知识库-分类管理 | ✅ 全部 | ✅ 本部门 | ❌ | +| 知识库-知识列表 | ✅ 全部 | ✅ 本部门(含草稿) | 👁️ 本部门已发布 | +| 考题管理-题库分类 | ✅ | ✅ 本部门 | ❌ | +| 考题管理-题目列表 | ✅ | ✅ 本部门 | ❌ | +| 试卷管理 | ✅ | ✅ 本部门 | ❌ | +| 考试管理 | ✅ | ✅ 本部门发布 | 👁️ 我的考试 | +| 培训计划 | ✅ | ✅ 本部门创建/管理 | 👁️ 我的培训 | +| 系统设置 | ✅ | ❌ | ❌ | +| 工作台 | ✅ | ✅ | ✅(学员视图) | + +[SRC-FEAT-01:8.1 角色菜单权限对照表] + +### 6.3 控制逻辑 + +**认证层**:JWT Token 携带 userId + role,每次请求由 AuthInterceptor 解析验证。[SRC-CODE-01:common/interceptor/AuthInterceptor.java] + +**授权层**: +- 接口级:`@PreAuthorize` / SecurityConfig 按角色匹配路径(`/api/student/**` 仅 STUDENT) +- 数据级:Service 层注入 `department_id` 过滤,讲师/学员查询一律追加 `WHERE department_id = ?` + +**隔离规则**: +- 4类数据(知识库、题库、试卷/考试、培训计划)均按 `department_id` 隔离 +- 管理员不注入部门过滤,讲师注入本部门,学员额外限制只查 PUBLISHED 状态 + +--- + +## 7. 系统扩展点分析 + +### 7.1 可扩展模块 + +| 扩展点 | 当前状态 | V2+ 扩展方向 | +|-------|---------|------------| +| 文件存储 | 本地文件系统 | 抽象 `FileStorageService` 接口 → MinIO/OSS 实现切换 | +| 认证方式 | 企业微信 OAuth(账号密码作备选) | 可接入 SSO/LDAP | +| 定时任务 | Spring @Scheduled(单机) | 可替换为 XXL-Job/SchedulerX 支持集群 | +| 统计报表 | 无(V2规划) | 新增 `statistics` 模块,不影响现有模块 | +| 通知 | 无(V2规划) | 可插入企业微信消息推送 | + +### 7.2 可插拔能力 + +- **文档预览**:kkFileView / OnlyOffice 作为可选外部服务,knowledge 模块通过 URL 调用,可随时替换 +- **视频播放器**:video.js 为前端组件,与后端解耦,可替换 +- **批量导入**:EasyExcel 依赖已选型,可随时为题目/用户管理添加 Excel 导入功能 + +### 7.3 易变业务点 + +| 易变点 | 变化方向 | 影响范围 | +|-------|---------|---------| +| 培训完成判定逻辑(当前:必修知识+必考通过) | V2 可能增加签到、线下课时 | `TrainingProgressService.calculateProgress()` | +| 知识学习完成判定(视频90%/文档时长) | 可能改为100%或按章节 | `KnowledgeLearningService.isCompleted()` | +| 考试排名计算口径(当前:最高分排名 DENSE_RANK) | 可能改为平均分/最后一次 | SQL窗口函数,需同步修改 | +| 组织架构层级(当前:中心→部门→小组三级) | 可能增减层级 | system 模块全面影响 | diff --git a/training/context/02-产品架构/03-系统能力模型.md b/training/context/02-产品架构/03-系统能力模型.md new file mode 100644 index 0000000..552c155 --- /dev/null +++ b/training/context/02-产品架构/03-系统能力模型.md @@ -0,0 +1,105 @@ +# 系统能力模型总结 — 道路救援企业培训系统 + +> 版本:V1.0 | 生成日期:2026-04-07 +> 证据来源:[SRC-FEAT-01] [SRC-API-01] [SRC-CODE-01] + +--- + +## 1. 当前系统具备的核心能力 + +| # | 能力名称 | 一句话描述 | +|---|---------|----------| +| C1 | **基于角色的访问控制(RBAC)** | 三种角色(管理员/讲师/学员)+ 部门级数据隔离,统一鉴权入口 | +| C2 | **组织与人员管理** | 三级组织结构(中心→部门→小组)+ 用户生命周期管理 | +| C3 | **知识资产管理** | 支持文档/视频两种类型的知识内容创建、状态发布和多级分类 | +| C4 | **学习行为跟踪** | 防刷机制下的真实时长累计和进度记录(视频90%/文档时长判定) | +| C5 | **在线考核** | 题库管理 + 手动/自动组卷 + 在线答题 + 客观题自动判分 | +| C6 | **考试行为管控** | 时间窗口约束 + 次数限制 + 超时自动交卷 + 并发乐观锁保护 | +| C7 | **培训任务编排** | 将知识+考试组织成有时间周期的培训计划,支持必修/选修/必考/选考四维属性 | +| C8 | **培训进度可视化** | 实时计算学员对某培训计划的完成百分比(必修完成+必考通过) | +| C9 | **成绩与排名** | 交卷后立即返回成绩+答案解析+实时排名(窗口函数,同分按时间早优先) | +| C10 | **企业微信身份集成** | OAuth 登录打通企业微信用户体系,无需单独注册 | + +--- + +## 2. 能力依赖关系图 + +```mermaid +graph TD + C10[C10 企业微信身份集成] --> C1 + C1[C1 RBAC + 部门隔离] --> C2 + C1 --> C3 + C1 --> C5 + C1 --> C7 + + C2[C2 组织人员管理] --> C7 + C3[C3 知识资产管理] --> C4 + C3 --> C7 + + C4[C4 学习行为跟踪] --> C8 + C5[C5 在线考核] --> C6 + C5 --> C9 + C6[C6 考试行为管控] --> C9 + C9[C9 成绩与排名] --> C8 + + C7[C7 培训任务编排] --> C4 + C7 --> C6 + C7 --> C8[C8 培训进度可视化] +``` + +--- + +## 3. 可复用能力清单 + +| 能力 | 复用场景 | 复用方式 | +|-----|---------|---------| +| C1 RBAC + 部门隔离 | 企业内任何需要角色权限 + 数据隔离的系统 | 提取 AuthInterceptor + UserContext + department_id 注入框架 | +| C4 学习行为跟踪 | 其他类型内容(音频/直播回放/课件)的学习进度记录 | 抽象 `LearningTarget` 接口,替换完成判定策略(Strategy 模式) | +| C5 在线考核 | 任意客观题在线测评场景(安全培训/合规考试等)| 题库+试卷+客观题判分为独立子系统,可独立部署 | +| C6 考试行为管控 | 任何有"限时+限次"约束的在线测试 | ExamTakingService 中时间窗口/次数/乐观锁的组合控制逻辑 | +| C9 成绩排名 | 任何需要实时排名的比赛/评测场景 | SQL 窗口函数 DENSE_RANK 模式,按需修改排序条件 | + +--- + +## 4. 平台级能力(多业务依赖的底层能力) + +**C1 — RBAC + 部门数据隔离** +- 所有业务模块(知识/考试/培训)均依赖此能力实现权限控制和数据隔离 +- 是系统安全性和多租户(多部门)能力的基础 +- 扩展方向:目前硬编码三个角色,V2 可改为动态角色配置 + +**C2 — 组织人员管理** +- 每个业务操作都需要 `department_id`、`user_id`、`role` 三个属性 +- 是知识/考试/培训三大域的数据隔离依据来源 +- 扩展方向:当前三级固定结构,可抽象为 n 级通用树 + +**C10 — 企业微信身份集成** +- 是唯一的用户来源(V1),后续接其他身份源也需通过此层 +- 扩展方向:抽象为 `IdentityProvider` 接口,支持插入 SSO/LDAP + +--- + +## 5. 业务定制能力(特定场景才需要的能力) + +| 能力 | 定制场景 | 为何不是平台级 | +|-----|---------|-------------| +| C3 知识资产管理(文档/视频类型) | 救援行业的操作手册、安全规范、视频讲解 | 内容类型固定(文档/视频),换行业可能需要不同类型 | +| C4 学习行为防刷(视频90%/文档时长) | 强制"真实学习"的企业培训场景 | 完成判定规则是业务决策,C端平台通常不这么严格 | +| C6 超时自动交卷 + 乐观锁 | 有严格时长限制的考试 | 休闲测试/知识问答类应用不需要这个复杂度 | +| C7 培训任务编排(必修/选修/必考/选考四维)| 企业有组织要求的培训管理 | 自学平台不需要"强制必修"的约束 | +| C9 成绩排名(DENSE_RANK + 同分按时间) | 部门内部考核的绩效排名 | 无竞争性考核场景(如自我测评)不需要排名 | + +--- + +## 6. V2 能力规划缺口 + +当前 V1.0.1 尚未具备以下能力,是 V2 的扩展方向: + +| 缺失能力 | 业务价值 | 实现复杂度 | +|---------|---------|---------| +| 统计报表中心(完成率/通过率/部门排名) | 管理层查看全局培训效果 | 中(新增 statistics 模块,读现有数据) | +| 线下培训签到(扫码签到/签退) | 线上线下混合培训场景 | 中(需硬件支持) | +| 错题本(自动归集错误题目) | 学员针对性复习 | 低(从 exam_record.answers 中提取 correct=false) | +| 知识全文搜索 | 快速查找内容 | 高(需引入 Elasticsearch 或 MySQL FULLTEXT) | +| 奖励体系(积分/勋章/排行榜) | 提升学习积极性 | 中(新增独立模块) | +| 证书管理 | 培训完成凭证 | 低(基于培训计划完成状态生成 PDF) | diff --git a/training/context/03-功能模块/01-认证模块.md b/training/context/03-功能模块/01-认证模块.md new file mode 100644 index 0000000..3ca81b4 --- /dev/null +++ b/training/context/03-功能模块/01-认证模块.md @@ -0,0 +1,110 @@ +# 认证模块(auth) + +> 证据来源:[SRC-FEAT-01] [SRC-API-01] [SRC-CODE-01:module/auth/] + +--- + +## 1. 模块定位 + +- **模块目标**:负责用户身份验证(企业微信OAuth + 账号密码备选)和 JWT Token 的签发、校验,为所有其他模块提供鉴权基础。 +- **解决问题**:500人规模的企业内部系统,需要统一身份验证入口,并将身份与角色绑定,为下游数据隔离提供 `userId + role + departmentId` 上下文。 + +--- + +## 2. 功能清单 + +[SRC-API-01:四、API 接口设计 / SRC-CODE-01:module/auth/] + +| 功能名称 | 功能描述 | 输入 | 输出 | 依赖模块 | +|---------|---------|------|------|---------| +| 企业微信 OAuth 登录 | 通过企业微信授权 code 换取用户身份,查找系统用户,签发 JWT | wx_code | JWT Token + 用户信息(LoginResponse) | system(查sys_user) | +| 账号密码登录(备选) | 用用户名+密码登录,BCrypt 验证密码 | username, password | JWT Token + 用户信息 | system(查sys_user) | +| 获取当前用户信息 | 解析 Token 返回用户基本信息 | Authorization Header | UserInfoResponse | - | +| 微信小程序登录(预留) | 通过小程序 code 获取用户信息 | WechatLoginRequest | JWT Token | system | +| Token 携带与拦截 | AuthInterceptor 拦截所有受保护请求,提取 Token 注入 UserContext | Authorization: Bearer {token} | UserContext(ThreadLocal) | - | + +--- + +## 3. 核心逻辑 + +### 3.1 业务规则 + +- 企业微信登录路径:前端传 code → 后端调 weixin-java-cp SDK 换 `access_token` → 获取 `wx_userid` → 查 `sys_user.wx_userid` 匹配 → 用户不存在则返回错误(不自动注册)[SRC-FEAT-01] +- JWT Payload 包含:userId、role、departmentId,有效期由配置决定 +- 密码存储:BCrypt 加密(Spring Security 6.x),初始管理员密码 `admin123` 已预置 [SRC-SQL-01:5.4] + +### 3.2 校验逻辑 + +| 校验项 | 规则 | 失败响应 | +|-------|------|---------| +| wx_userid 是否存在于 sys_user | 必须已由管理员录入 | 返回错误:用户未录入,请联系管理员 | +| sys_user.status | 必须为 0(启用) | 返回错误:账号已禁用 | +| Token 有效性 | 未过期、签名正确 | 返回 401 | +| 受保护接口 Token 缺失 | 无 Authorization Header | 返回 401 | + +### 3.3 状态流转 + +```mermaid +stateDiagram-v2 + [*] --> 未认证 + 未认证 --> 已认证 : 登录成功(JWT签发) + 已认证 --> 未认证 : Token过期 / 主动登出 + 已认证 --> 已认证 : Token续期(如有配置) +``` + +--- + +## 4. 数据结构 + +### 4.1 涉及数据表 + +**sys_user**(读取,不由本模块创建)[SRC-SQL-01] + +| 字段 | 类型 | 说明 | +|------|------|------| +| id | BIGINT | 用户主键 | +| wx_userid | VARCHAR(100) | 企业微信用户ID(唯一索引 uk_wx_userid) | +| username | VARCHAR(50) | 账号密码登录用账号(唯一索引 uk_username) | +| password | VARCHAR(100) | BCrypt加密密码 | +| role | TINYINT | 0-管理员 / 1-讲师 / 2-学员 | +| department_id | BIGINT | 所属部门ID(会注入 JWT Payload) | +| status | TINYINT | 0-启用 / 1-禁用 | + +### 4.2 DTO/VO 定义 + +[SRC-CODE-01:module/auth/dto/] + +| 类名 | 方向 | 关键字段 | +|------|------|---------| +| LoginRequest | 入参 | username, password | +| WechatLoginRequest | 入参 | code(企业微信授权码) | +| LoginResponse | 出参 | token, userId, realName, role, departmentId | +| UserInfoResponse | 出参 | 同 LoginResponse(从 Token 解析) | + +--- + +## 5. 对外接口 + +[SRC-API-01] + +| API 名称 | 方法 | 路径 | 权限 | +|---------|------|------|------| +| 企业微信登录 | POST | /api/auth/wechat/login | 公开 | +| 账号密码登录 | POST | /api/auth/login | 公开 | +| 获取当前用户 | GET | /api/auth/me | 需 Token | + +**事件机制**:登录成功后,UserContext(ThreadLocal)持有用户信息,供同请求链路的所有 Service 使用,请求结束后清除。[SRC-CODE-01:common/context/UserContextHolder.java] + +--- + +## 6. 异常与边界处理 + +| 场景 | 处理方式 | +|------|---------| +| 企业微信 API 调用超时/失败 | 返回 503,提示"企业微信服务暂时不可用,请稍后重试" | +| 企业微信 code 已使用(重放) | 企业微信 SDK 返回错误,转化为 400 | +| 用户 wx_userid 存在但账号被禁用(status=1) | 返回 403,提示"账号已禁用,请联系管理员" | +| sys_user 中无对应 wx_userid | 返回 403,提示"用户未录入系统,请联系管理员" | +| Token 格式错误(非JWT) | AuthInterceptor 捕获,返回 401 | +| Token 过期 | AuthInterceptor 捕获,返回 401,前端跳转登录页 | +| 并发登录(同一账号多端) | 当前设计无限制,多端独立 Token 有效 | diff --git a/training/context/03-功能模块/02-系统管理模块.md b/training/context/03-功能模块/02-系统管理模块.md new file mode 100644 index 0000000..a45ea41 --- /dev/null +++ b/training/context/03-功能模块/02-系统管理模块.md @@ -0,0 +1,165 @@ +# 系统管理模块(system) + +> 证据来源:[SRC-FEAT-01] [SRC-SQL-01] [SRC-CODE-01:module/system/] + +--- + +## 1. 模块定位 + +- **模块目标**:管理企业的组织架构(中心→部门→小组三级)和用户生命周期(录入、角色分配、状态管理),为所有业务模块的部门数据隔离提供基础。 +- **解决问题**:3-5名管理员管理约500人的组织结构,人员分配到正确部门和角色,是知识库/考试/培训数据隔离的前置条件。 + +--- + +## 2. 功能清单 + +[SRC-FEAT-01:模块一] [SRC-CODE-01:module/system/] + +| 功能名称 | 功能描述 | 输入 | 输出 | 依赖模块 | +|---------|---------|------|------|---------| +| 中心管理(CRUD) | 创建/修改/删除最高级组织单元"中心" | CenterDTO(name, sort_order) | CenterVO | - | +| 部门管理(CRUD) | 在中心下创建/修改/删除部门,每中心最多8个部门 | DepartmentDTO(name, center_id) | DepartmentVO | - | +| 小组管理(CRUD) | 在部门下创建/修改/删除小组,每部门最多10个小组 | GroupDTO(name, department_id) | GroupVO | - | +| 组织树查询 | 一次性返回完整组织树(中心→部门→小组层级) | - | OrgTreeVO(树形结构) | - | +| 员工列表查询 | 分页查询员工,支持按部门/角色/姓名筛选 | UserQueryDTO | PageResult | - | +| 员工录入 | 管理员手动录入员工信息,绑定企业微信 userid | UserDTO(wx_userid, real_name, role, department_id…) | UserVO | - | +| 员工信息修改 | 修改员工姓名、部门、角色、小组归属 | UserDTO | UserVO | - | +| 员工禁用/启用 | 切换员工账号状态(0启用/1禁用) | userId, status | - | auth(下次登录校验) | +| 密码重置 | 管理员重置员工的账号密码(BCrypt) | PasswordDTO(userId, newPassword) | - | auth | +| 讲师查看本部门员工 | 讲师可查看本部门员工列表(只读,无编辑权限) | department_id(从Token注入) | PageResult | auth | + +--- + +## 3. 核心逻辑 + +### 3.1 业务规则 + +[SRC-FEAT-01:模块一] + +- **层级约束**:中心 → 部门(一个中心最多8个部门)→ 小组(一个部门最多10个小组),超限不允许创建 +- **角色约束**:用户角色只能为 ADMIN(0) / LECTURER(1) / STUDENT(2) 三种,创建时必填 +- **部门归属**:LECTURER 和 STUDENT 必须归属某部门(department_id 不可为空),ADMIN 可无部门 +- **逻辑删除**:所有实体使用 `deleted=1` 软删除,禁止物理删除,防止外键依赖失效 +- **员工录入方式**:V1 仅支持管理员手动逐条录入,不支持批量导入(V2 规划 EasyExcel 导入) + +### 3.2 校验逻辑 + +| 校验项 | 规则 | 失败响应 | +|-------|------|---------| +| 部门数量上限 | 同一 center_id 下 deleted=0 的部门数 ≤ 8 | 400:该中心部门数已达上限(8个) | +| 小组数量上限 | 同一 department_id 下 deleted=0 的小组数 ≤ 10 | 400:该部门小组数已达上限(10个) | +| wx_userid 唯一 | sys_user.wx_userid 全局唯一(uk_wx_userid 索引) | 400:该企业微信账号已录入 | +| username 唯一 | sys_user.username 全局唯一(uk_username 索引) | 400:用户名已存在 | +| 讲师数据隔离 | LECTURER 调用员工列表时,强制追加 department_id = 当前用户部门 | 自动过滤,不报错 | +| 删除有子项的上级 | 删除中心前,其下所有部门必须已删除;删除部门前,其下所有小组和用户必须已处理 | 400:请先删除部门下的小组和员工 | + +### 3.3 状态流转 + +```mermaid +stateDiagram-v2 + [*] --> 启用 : 员工录入时默认 status=0 + 启用 --> 禁用 : 管理员操作禁用 + 禁用 --> 启用 : 管理员操作启用 + 禁用 --> 已删除 : 逻辑删除(deleted=1) + 启用 --> 已删除 : 逻辑删除(deleted=1) +``` + +--- + +## 4. 数据结构 + +[SRC-SQL-01:一、系统管理模块] + +### 4.1 涉及数据表 + +**sys_center** + +| 字段 | 类型 | 说明 | +|------|------|------| +| id | BIGINT | 主键 | +| name | VARCHAR(100) | 中心名称 | +| sort_order | INT DEFAULT 0 | 排序 | +| deleted | TINYINT | 逻辑删除(0/1) | + +**sys_department** + +| 字段 | 类型 | 说明 | +|------|------|------| +| id | BIGINT | 主键 | +| name | VARCHAR(100) | 部门名称 | +| center_id | BIGINT NOT NULL | 所属中心(idx_center_id 索引) | +| sort_order | INT | 排序 | +| deleted | TINYINT | 逻辑删除 | + +**sys_group** + +| 字段 | 类型 | 说明 | +|------|------|------| +| id | BIGINT | 主键 | +| name | VARCHAR(100) | 小组名称 | +| department_id | BIGINT NOT NULL | 所属部门(idx_department_id 索引) | +| sort_order | INT | 排序 | +| deleted | TINYINT | 逻辑删除 | + +**sys_user** + +| 字段 | 类型 | 说明 | +|------|------|------| +| id | BIGINT | 主键 | +| wx_userid | VARCHAR(100) | 企业微信 userid(唯一) | +| username | VARCHAR(50) NOT NULL | 账号(唯一) | +| password | VARCHAR(100) | BCrypt 加密密码 | +| real_name | VARCHAR(50) NOT NULL | 真实姓名 | +| phone | VARCHAR(20) | 手机号 | +| avatar | VARCHAR(255) | 头像 URL | +| role | TINYINT NOT NULL | 0-管理员 / 1-讲师 / 2-学员 | +| department_id | BIGINT | 所属部门(可空,ADMIN 用) | +| group_id | BIGINT | 所属小组(可空) | +| status | TINYINT DEFAULT 0 | 0-启用 / 1-禁用 | +| deleted | TINYINT | 逻辑删除 | + +### 4.2 数据关联 + +- `sys_user.department_id` → `sys_department.id`(无外键约束,逻辑关联) +- `sys_user.group_id` → `sys_group.id`(可空) +- `sys_department.center_id` → `sys_center.id` + +--- + +## 5. 对外接口 + +[SRC-CODE-01:module/system/controller/] + +| API 名称 | 方法 | 路径 | 权限 | +|---------|------|------|------| +| 获取组织树 | GET | /api/system/org/tree | ADMIN | +| 查询中心列表 | GET | /api/system/center | ADMIN | +| 创建中心 | POST | /api/system/center | ADMIN | +| 修改中心 | PUT | /api/system/center/{id} | ADMIN | +| 删除中心 | DELETE | /api/system/center/{id} | ADMIN | +| 查询部门列表 | GET | /api/system/department | ADMIN | +| 创建部门 | POST | /api/system/department | ADMIN | +| 修改部门 | PUT | /api/system/department/{id} | ADMIN | +| 删除部门 | DELETE | /api/system/department/{id} | ADMIN | +| 查询小组列表 | GET | /api/system/group | ADMIN | +| 创建小组 | POST | /api/system/group | ADMIN | +| 修改小组 | PUT | /api/system/group/{id} | ADMIN | +| 删除小组 | DELETE | /api/system/group/{id} | ADMIN | +| 查询员工列表 | GET | /api/system/user | ADMIN(全部) / LECTURER(本部门只读) | +| 创建员工 | POST | /api/system/user | ADMIN | +| 修改员工 | PUT | /api/system/user/{id} | ADMIN | +| 禁用/启用员工 | PUT | /api/system/user/{id}/status | ADMIN | +| 重置密码 | PUT | /api/system/user/{id}/password | ADMIN | + +--- + +## 6. 异常与边界处理 + +| 场景 | 处理方式 | +|------|---------| +| 删除有下级的中心/部门 | 校验子项是否全部删除,否则返回 400 + 提示 | +| 部门/小组数量超限 | 严格校验上限(8/10),超出返回 400 | +| 员工 wx_userid 重复 | 唯一索引捕获 DuplicateKeyException,友好提示 | +| LECTURER 访问其他部门员工 | AuthInterceptor / Service 层强制 department_id 过滤,返回空列表 | +| 管理员误操作禁用自己 | [ASSUMPTION] PRD 未明确说明是否限制,建议禁止禁用最后一个 ADMIN | +| 员工转移部门 | 修改 department_id 即可,但其历史知识进度/考试记录中的 department_id 为冗余字段不随之更新 | diff --git a/training/context/03-功能模块/03-知识库模块.md b/training/context/03-功能模块/03-知识库模块.md new file mode 100644 index 0000000..d9a7d16 --- /dev/null +++ b/training/context/03-功能模块/03-知识库模块.md @@ -0,0 +1,205 @@ +# 知识库模块(knowledge) + +> 证据来源:[SRC-FEAT-01] [SRC-FEAT-02] [SRC-SQL-01] [SRC-SQL-02] [SRC-API-01] [SRC-CODE-01:module/knowledge/] + +--- + +## 1. 模块定位 + +- **模块目标**:管理企业的结构化知识资产,支持文档和视频两种内容类型的上传、分类管理、状态发布,并记录学员的个人学习进度。 +- **解决问题**:解决救援知识依赖口口相传的问题;同时为培训计划提供可引用的学习内容,并跟踪学员是否真实完成学习(防刷机制)。 + +--- + +## 2. 功能清单 + +[SRC-FEAT-01:模块二] [SRC-FEAT-02:3.2 知识学习] + +| 功能名称 | 功能描述 | 输入 | 输出 | 依赖模块 | +|---------|---------|------|------|---------| +| 知识分类管理 | 创建/修改/删除多级分类树,按部门隔离 | CategoryDTO(name, parent_id, department_id) | CategoryVO | system(部门) | +| 知识分类树查询 | 返回树形结构的分类目录 | department_id | List(树) | - | +| 知识内容 CRUD | 创建/修改/删除知识(文档/视频),状态为草稿时可修改 | KnowledgeDTO(title, type, file_url, category_id…) | KnowledgeVO | system | +| 文件上传 | 上传 PDF/Word/Excel/PPT/视频文件,返回文件 URL | MultipartFile | FileDTO(url, fileName, size, type) | 文件存储服务 | +| 知识发布/下架 | 变更知识状态(草稿→发布/发布→下架/下架→再发布)| knowledgeId, action | - | - | +| 知识列表查询(讲师端) | 管理端分页查询,可查所有状态,含草稿 | KnowledgeQueryDTO(category_id, status, keyword) | PageResult | - | +| 知识列表查询(学员端) | 只查 PUBLISHED 状态,携带个人学习状态 | department_id, KnowledgeQueryDTO | PageResult | auth | +| 知识在线预览 | 文档在线预览(PDF/Word等)、视频在线播放 | knowledgeId | 文件 URL / 预览链接 | 文件存储/文档预览服务 | +| 开始学习 | 创建或获取学习进度记录,记录首次学习时间 | knowledgeId, [source, planId] | - | auth | +| 更新学习进度 | 定时上报学习进度(每60秒),累加时长,判断完成 | ProgressUpdateDTO(duration, progress, videoPosition, source, planId) | - | training(若来源=TRAINING) | +| 完成学习 | 前端显式标记完成(文档)| knowledgeId | - | - | +| 查询学习进度 | 查询学员对某知识/某批知识的学习状态 | userId/knowledgeIds | List | - | +| 引用保护检查 | 检查知识是否被培训计划引用,下架前警告 | knowledgeId | Boolean + 引用计划数 | training | + +--- + +## 3. 核心逻辑 + +### 3.1 业务规则 + +[SRC-FEAT-01:4.5 引用保护规则] [SRC-API-01:5.1 学习进度更新流程] + +**内容状态规则**: +- 草稿(DRAFT=0):只有讲师和管理员可见,可自由修改 +- 已发布(PUBLISHED=1):全部门学员可见,处于此状态时不可修改内容(需先下架) +- 已下架(OFFLINE=2):学员不可见,可重新上架或继续修改后再发布 + +**学习进度完成判定规则**: +- **视频类**:播放进度 ≥ 90% 时,status 自动变更为 COMPLETED +- **文档类**:累计学习时长 ≥ 预估阅读时间(按文件大小估算,具体算法在 `calculateEstimatedTime()`)时,status 变更为 COMPLETED +- 两种类型均支持多次学习,完成后不会重置;时长可继续累加 + +**防刷机制(活跃检测)**: +- 前端 ActivityDetector 监听 mousemove/click/scroll/keypress 事件 +- 60秒无活动判定为非活跃,停止本地计时器,不上报进度 +- 恢复活跃后重新计时 + +**多标签页防重**: +- BroadcastChannel API 实现:同一知识在多个 Tab 打开时,检测到重复后关闭后来的 Tab [SRC-API-01:6.2] + +**部门数据隔离**: +- 所有知识查询一律追加 `WHERE department_id = [当前用户部门]` +- 分类也按 department_id 隔离 + +**引用保护**: +- 知识下架前,需检查 `tr_plan_knowledge` 中是否有关联;若有,提示警告,用户确认后方可下架 + +### 3.2 校验逻辑 + +| 校验项 | 规则 | 失败响应 | +|-------|------|---------| +| 文件类型 | 文档:PDF/Word/Excel/PPT;视频:MP4等常见格式 | 400:不支持的文件格式 | +| 文件大小 | [ASSUMPTION] PRD 提及限制大文件,具体上限需配置,建议文档 ≤100MB,视频 ≤2GB | 400:文件超出大小限制 | +| 知识状态变更 | PUBLISHED 状态下不允许修改内容字段(标题/文件),只允许下架操作 | 400:已发布知识不可修改,请先下架 | +| 学习进度上报频率 | 前端每60秒上报一次,后端不做频率限制(允许补报) | - | +| 视频播放进度合理性 | `video_position ≤ 视频总时长`([ASSUMPTION] 后端当前未做服务端校验,PRD 明确属于风险项) | 暂无服务端拦截 | +| 分类隶属 | 知识的 category_id 必须属于同一 department_id 的分类 | 400:分类不存在或无权限 | + +### 3.3 状态流转 + +```mermaid +stateDiagram-v2 + [*] --> DRAFT : 创建知识(可新增/修改/删除) + DRAFT --> PUBLISHED : 讲师发布 + PUBLISHED --> OFFLINE : 讲师下架(引用警告确认) + OFFLINE --> PUBLISHED : 讲师重新上架 + OFFLINE --> DRAFT : 重新编辑后回到草稿 [ASSUMPTION] + DRAFT --> [*] : 逻辑删除 + + note right of PUBLISHED : 学员可见\n不可修改内容 + note right of DRAFT : 仅讲师/管理员可见 + note right of OFFLINE : 学员不可见\n可编辑 +``` + +**学习进度状态流转**: + +```mermaid +stateDiagram-v2 + [*] --> NOT_STARTED : 知识发布,学员尚未打开 + NOT_STARTED --> IN_PROGRESS : 调用"开始学习"接口 + IN_PROGRESS --> IN_PROGRESS : 每次上报进度(时长累加) + IN_PROGRESS --> COMPLETED : 视频≥90% 或 文档时长达标 + COMPLETED --> IN_PROGRESS : 再次学习(时长继续累加,状态不回退) +``` + +--- + +## 4. 数据结构 + +[SRC-SQL-01:二、知识库模块] [SRC-SQL-02] + +### 4.1 涉及数据表 + +**km_category** + +| 字段 | 类型 | 说明 | +|------|------|------| +| id | BIGINT | 主键 | +| name | VARCHAR(100) NOT NULL | 分类名称 | +| parent_id | BIGINT DEFAULT 0 | 父分类(0=顶级) | +| department_id | BIGINT NOT NULL | 所属部门(部门隔离键) | +| sort_order | INT | 排序 | +| deleted | TINYINT | 逻辑删除 | + +**km_knowledge** + +| 字段 | 类型 | 说明 | +|------|------|------| +| id | BIGINT | 主键 | +| title | VARCHAR(200) NOT NULL | 标题 | +| description | TEXT | 描述/摘要 | +| category_id | BIGINT | 所属分类(可空) | +| type | TINYINT NOT NULL | 0-文档 / 1-视频 | +| file_name | VARCHAR(255) | 文件名 | +| file_url | VARCHAR(500) | 文件 URL | +| file_size | BIGINT | 文件大小(字节) | +| file_type | VARCHAR(20) | 文件后缀(pdf/mp4…) | +| department_id | BIGINT NOT NULL | 所属部门(隔离键,有 idx) | +| status | TINYINT DEFAULT 0 | 0-草稿 / 1-已发布 / 2-已下架 | +| creator_id | BIGINT NOT NULL | 创建人 | +| publish_time | DATETIME | 发布时间 | +| view_count | INT | 浏览次数 | +| deleted | TINYINT | 逻辑删除 | + +**km_knowledge_progress**(学员学习进度)[SRC-SQL-02] + +| 字段 | 类型 | 说明 | +|------|------|------| +| id | BIGINT | 主键 | +| user_id | BIGINT NOT NULL | 学员ID | +| knowledge_id | BIGINT NOT NULL | 知识ID | +| department_id | BIGINT NOT NULL | 部门(冗余,用于分区查询) | +| status | VARCHAR(20) | NOT_STARTED / IN_PROGRESS / COMPLETED | +| progress | INT | 进度百分比(0~100) | +| duration | BIGINT | 累计学习时长(秒) | +| video_position | BIGINT | 视频播放位置(秒,仅视频) | +| source | VARCHAR(20) | FREE / TRAINING | +| plan_id | BIGINT | 关联培训计划(source=TRAINING 时有值) | +| start_time | DATETIME | 首次学习时间 | +| complete_time | DATETIME | 完成时间 | +| 唯一约束 | uk_user_knowledge | (user_id, knowledge_id) 唯一 | + +### 4.2 数据关联 + +- `km_knowledge.category_id` → `km_category.id` +- `km_knowledge.department_id` = `km_category.department_id`(同部门隔离) +- `km_knowledge_progress.user_id` → `sys_user.id` +- `km_knowledge_progress.plan_id` → `tr_plan.id`(可空) + +--- + +## 5. 对外接口 + +[SRC-API-01:4.3 知识学习接口] [SRC-CODE-01:module/knowledge/controller/] + +| API 名称 | 方法 | 路径 | 权限 | +|---------|------|------|------| +| 查询知识分类树 | GET | /api/knowledge/category/tree | LECTURER/ADMIN | +| 创建分类 | POST | /api/knowledge/category | LECTURER/ADMIN | +| 修改分类 | PUT | /api/knowledge/category/{id} | LECTURER/ADMIN | +| 删除分类 | DELETE | /api/knowledge/category/{id} | LECTURER/ADMIN | +| 查询知识列表(管理端) | GET | /api/knowledge | LECTURER/ADMIN | +| 创建知识 | POST | /api/knowledge | LECTURER/ADMIN | +| 修改知识 | PUT | /api/knowledge/{id} | LECTURER/ADMIN | +| 发布/下架知识 | PUT | /api/knowledge/{id}/status | LECTURER/ADMIN | +| 删除知识 | DELETE | /api/knowledge/{id} | LECTURER/ADMIN | +| 文件上传 | POST | /api/knowledge/upload | LECTURER/ADMIN | +| 学员-知识列表 | GET | /api/student/knowledge | STUDENT | +| 学员-知识详情 | GET | /api/student/knowledge/{id} | STUDENT | +| 学员-开始学习 | POST | /api/student/knowledge/{id}/start | STUDENT | +| 学员-更新进度 | POST | /api/student/knowledge/{id}/progress | STUDENT | +| 学员-标记完成 | POST | /api/student/knowledge/{id}/complete | STUDENT | + +--- + +## 6. 异常与边界处理 + +| 场景 | 处理方式 | +|------|---------| +| 已发布知识被下架,同时培训计划正引用 | 弹出确认警告,显示引用该知识的培训计划数量,用户确认后方可下架 | +| 文件上传失败(存储服务不可用) | 返回 503,前端提示"文件上传失败,请稍后重试" | +| 学员学习已下架的知识(在培训计划中) | [ASSUMPTION] PRD 未明确,建议:关联进培训计划的知识下架后,学员仍可查看历史进度但不可重新打开 | +| km_knowledge_progress 并发 UPSERT(同一学员多标签页) | 唯一约束 uk_user_knowledge 防止重复插入;多标签页同步由前端 BroadcastChannel 控制关闭重复 Tab | +| 视频播放中途退出 | 下次进入从 video_position 断点续播 | +| 学习进度上报时网络中断 | 前端重试,后端幂等(UPSERT 语义,重复上报取最大值或继续累加) | +| 分类下有知识时删除分类 | 检查该分类下是否有 deleted=0 的知识,若有则拒绝:400 请先移除分类下的知识 | diff --git a/training/context/03-功能模块/04-考试模块.md b/training/context/03-功能模块/04-考试模块.md new file mode 100644 index 0000000..fe174f5 --- /dev/null +++ b/training/context/03-功能模块/04-考试模块.md @@ -0,0 +1,253 @@ +# 考试模块(exam) + +> 证据来源:[SRC-FEAT-01] [SRC-FEAT-02] [SRC-SQL-01] [SRC-API-01] [SRC-CODE-01:module/exam/] + +--- + +## 1. 模块定位 + +- **模块目标**:管理从出题到考试全链路:题目→试卷→考试→作答记录,支持在线作答、自动判分、成绩排名。 +- **解决问题**:替代纸质考试,提升出卷效率(自动组卷),实现客观题自动判分,并对考试行为(时间窗口、次数限制、超时交卷)进行严格管控。 + +--- + +## 2. 功能清单 + +[SRC-FEAT-01:模块三/四/五] [SRC-API-01:4.4 在线考试接口] + +| 功能名称 | 功能描述 | 输入 | 输出 | 依赖模块 | +|---------|---------|------|------|---------| +| 题目分类管理 | 按分类管理题目,多级目录,按部门隔离 | QuestionCategoryDTO | QuestionCategoryVO | system | +| 题目 CRUD | 创建/修改/删除题目,支持单选/多选/判断三种题型,必须填写解析 | QuestionDTO(type, content, options, answer, analysis) | QuestionVO | - | +| 题目状态管理 | 草稿→发布→下架,下架前检查引用 | questionId, action | - | - | +| 手动组卷 | 讲师从题库手动选题,配置每题分值 | PaperDTO(title, questions[]) | PaperVO | - | +| 自动组卷 | 按规则(单选X题+多选Y题+判断Z题)随机抽题 | AutoPaperDTO(规则配置) | PaperVO | - | +| 试卷配置 | 设置总分、各题分值、考试时长、及格分 | PaperDTO | PaperVO | - | +| 试卷预览 | 组卷后预览试卷效果(随机题目顺序) | paperId | 完整试卷预览 | - | +| 试卷状态管理 | 草稿→发布→下架 | paperId, action | - | - | +| 创建考试 | 选择试卷,设置考试名称、时间窗口、最大次数 | ExamQueryDTO + ExamTarget | ExamVO | - | +| 指定考试对象 | 指定部门/小组/个人参加考试 | exam_id, target_type, target_id[] | - | system | +| 发布考试 | 将考试状态从 NOT_STARTED 转为 IN_PROGRESS(时间到自动) | examId | - | - | +| 学员-我的考试列表 | 查询分配给当前学员的考试(在时间窗口内) | - | PageResult | auth | +| 学员-开始考试 | 校验资格,创建 exam_record,返回试题 | examId | 试题 + 时长 + recordId | - | +| 学员-断点续考 | 恢复进行中的考试记录,返回已保存答案 | examId | 试题 + 已保存答案 + 剩余时间 | - | +| 学员-保存答案 | 每30秒自动保存答案(增量保存) | recordId, answers(JSON) | - | - | +| 学员-提交试卷 | 自动判分,保存成绩,返回排名+解析 | recordId, answers(JSON) | 成绩 + 排名 + 答案解析 | - | +| 超时自动交卷 | 定时任务每分钟扫描超时记录,系统代提交 | @Scheduled | - | - | +| 查看考试结果 | 查看某次考试的详细成绩和答案解析 | recordId | ExamResultVO | - | +| 成绩/排名查询 | 讲师查看某考试的所有学员成绩 | examId | PageResult<成绩列表> | - | + +--- + +## 3. 核心逻辑 + +### 3.1 业务规则 + +[SRC-FEAT-01:4.3 考试规则] [SRC-API-01:5.2/5.3] + +**题型规则**: +- 单选题(SINGLE=0):options 为 JSON 数组,answer 为单字母(A/B/C/D) +- 多选题(MULTIPLE=1):answer 为多字母组合(如"AB"/"BCD"),按字母排序存储 +- 判断题(JUDGE=2):options 为空,answer 为"T"(正确)或"F"(错误) +- 每道题必须填写 `analysis`(答案解析),否则不允许发布 + +**考试时间窗口**: +- 只有在 `exam.start_time ≤ NOW() ≤ exam.end_time` 时,学员才能进入考试 +- 考试到期后,`exam.status` 自动(或手动)变为 ENDED + +**次数限制**: +- 达到 `max_attempts` 后,学员不可再次开始考试 +- 历史成绩取**最高分**作为最终成绩 +- 每次考试创建 `exam_record.attempt_no = 历史次数 + 1` + +**自动判分规则**: +- 仅客观题(单选/多选/判断)自动判分 +- 单选/判断:答案完全匹配得满分 +- 多选:全部选项匹配(顺序无关)得满分;部分正确得 0 分(V1 不分项给分) +- 总分 = 各题得分之和 + +**超时自动交卷**: +- `@Scheduled(cron="0 */1 * * * ?")` 每分钟扫描 +- 查询:`ex_exam_record.status=IN_PROGRESS` 且 `start_time + paper.duration 分钟 < NOW()` +- 使用乐观锁(`version` 字段)防止与用户主动交卷并发冲突 [SRC-API-01:5.2] + +**排名计算**: +- 计算时机:用户交卷后立即计算本次提交对应的排名 +- 统计范围:同一 `exam_id` 下,所有 `status=SUBMITTED` 记录,取每用户最高分 +- 排名规则:`DENSE_RANK() OVER (ORDER BY MAX(score) DESC, MIN(submit_time) ASC)`(同分按提交时间早排前)[SRC-API-01:5.3] + +**题目顺序**: +- 自动组卷时,返回给学员的题目顺序随机打乱(前端处理或后端随机返回) + +### 3.2 校验逻辑 + +| 校验项 | 规则 | 失败响应 | +|-------|------|---------| +| 题目 analysis 必填 | 发布时 analysis 不可为空 | 400:请填写答案解析后再发布 | +| 开始考试-时间窗口 | NOW() 在 [start_time, end_time] 范围内 | 400:考试尚未开始 / 考试已结束 | +| 开始考试-次数限制 | 已有考试记录数 < max_attempts | 400:已达到最大考试次数 | +| 开始考试-状态 | exam.status = IN_PROGRESS(1) | 400(状态不符) | +| 开始考试-进行中记录 | 若已有 IN_PROGRESS 记录,返回续考而非新建 | 自动转入断点续考流程 | +| 答案格式 | 多选题答案字母需排序后匹配 | 自动处理,不返回错误 | +| 超时交卷并发 | 乐观锁冲突时(用户已提交),忽略定时任务提交 | 静默忽略 OptimisticLockException | +| 试卷引用保护 | 已被考试引用的试卷下架前需确认警告 | 400 + 警告 + 引用考试数量 | +| 题目引用保护 | 已被试卷引用的题目下架前需确认警告 | 400 + 警告 + 引用试卷数量 | + +### 3.3 状态流转 + +**内容状态(题目/试卷)**: + +```mermaid +stateDiagram-v2 + [*] --> DRAFT : 创建 + DRAFT --> PUBLISHED : 发布(题目需有 analysis) + PUBLISHED --> OFFLINE : 下架(引用保护确认) + OFFLINE --> PUBLISHED : 重新上架 + DRAFT --> [*] : 逻辑删除 +``` + +**考试状态**: + +```mermaid +stateDiagram-v2 + [*] --> NOT_STARTED : 创建考试(start_time 未到) + NOT_STARTED --> IN_PROGRESS : 到达 start_time(自动或手动) + IN_PROGRESS --> ENDED : 到达 end_time(自动或手动结束) + ENDED --> [*] : 逻辑删除 +``` + +**考试记录状态**: + +```mermaid +stateDiagram-v2 + [*] --> IN_PROGRESS : 学员点击"开始考试"创建记录 + IN_PROGRESS --> SUBMITTED : 学员交卷(submit_source=USER) + IN_PROGRESS --> SUBMITTED : 定时任务超时(submit_source=SYSTEM_TIMEOUT) + SUBMITTED --> [*] : 永久保留 +``` + +--- + +## 4. 数据结构 + +[SRC-SQL-01:三、考试模块] + +### 4.1 涉及数据表(7张) + +**ex_question_category**:题目分类(同知识库分类结构,按 department_id 隔离) + +**ex_question** + +| 字段 | 类型 | 说明 | +|------|------|------| +| id | BIGINT | 主键 | +| type | TINYINT | 0-单选 / 1-多选 / 2-判断 | +| content | TEXT NOT NULL | 题干 | +| options | JSON | 选项数组(判断题为 NULL) | +| answer | VARCHAR(50) NOT NULL | 正确答案(单选/判断单字母,多选合并字母) | +| analysis | TEXT | 答案解析(发布前必填) | +| category_id | BIGINT | 所属分类 | +| department_id | BIGINT NOT NULL | 部门隔离键 | +| status | TINYINT | 0-草稿 / 1-发布 / 2-下架 | +| creator_id | BIGINT NOT NULL | 创建人 | + +**ex_paper** + +| 字段 | 类型 | 说明 | +|------|------|------| +| id | BIGINT | 主键 | +| title | VARCHAR(200) NOT NULL | 试卷标题 | +| total_score | INT DEFAULT 100 | 总分 | +| duration | INT DEFAULT 60 | 考试时长(分钟) | +| pass_score | INT DEFAULT 60 | 及格分 | +| department_id | BIGINT NOT NULL | 部门隔离键 | +| status | TINYINT | 0-草稿 / 1-发布 / 2-下架 | + +**ex_paper_question** + +| 字段 | 类型 | 说明 | +|------|------|------| +| paper_id | BIGINT NOT NULL | 试卷ID | +| question_id | BIGINT NOT NULL | 题目ID | +| score | INT DEFAULT 5 | 该题分值 | +| sort_order | INT | 排序(大题号顺序) | + +**ex_exam** + +| 字段 | 类型 | 说明 | +|------|------|------| +| id | BIGINT | 主键 | +| title | VARCHAR(200) NOT NULL | 考试标题 | +| paper_id | BIGINT NOT NULL | 关联试卷 | +| start_time / end_time | DATETIME | 时间窗口 | +| max_attempts | INT DEFAULT 1 | 最大考试次数 | +| department_id | BIGINT NOT NULL | 部门隔离键 | +| status | TINYINT | 0-未开始 / 1-进行中 / 2-已结束 | + +**ex_exam_target** + +| 字段 | 类型 | 说明 | +|------|------|------| +| exam_id | BIGINT NOT NULL | 考试ID | +| target_type | TINYINT | 0-部门 / 1-小组 / 2-个人 | +| target_id | BIGINT NOT NULL | 对应 dept/group/user 的ID | + +**ex_exam_record**(含 V1.0.1 扩展字段) + +| 字段 | 类型 | 说明 | +|------|------|------| +| id | BIGINT | 主键 | +| exam_id | BIGINT NOT NULL | 考试ID | +| user_id | BIGINT NOT NULL | 学员ID | +| attempt_no | INT NOT NULL | 第几次考试 | +| score | INT | 得分 | +| passed | TINYINT | 0-未通过 / 1-通过 | +| start_time | DATETIME NOT NULL | 开始时间 | +| submit_time | DATETIME | 提交时间 | +| answers | JSON | 答题详情 | +| status | VARCHAR(20) | IN_PROGRESS / SUBMITTED | +| last_save_time | DATETIME | 最后保存时间 | +| version | INT DEFAULT 0 | 乐观锁版本号 | +| submit_source | VARCHAR(20) | USER / SYSTEM_TIMEOUT | + +### 4.2 数据关联 + +- `ex_paper_question.paper_id` → `ex_paper.id` +- `ex_paper_question.question_id` → `ex_question.id` +- `ex_exam.paper_id` → `ex_paper.id` +- `ex_exam_target` 多态关联:target_type=0 → `sys_department.id`;=1 → `sys_group.id`;=2 → `sys_user.id` +- `ex_exam_record.exam_id` → `ex_exam.id`;`user_id` → `sys_user.id` + +--- + +## 5. 对外接口 + +[SRC-API-01:4.4] + +| API 名称 | 方法 | 路径 | 权限 | +|---------|------|------|------| +| 题目分类 CRUD | GET/POST/PUT/DELETE | /api/exam/question-category/** | LECTURER/ADMIN | +| 题目 CRUD | GET/POST/PUT/DELETE | /api/exam/question/** | LECTURER/ADMIN | +| 试卷 CRUD + 自动组卷 | GET/POST/PUT/DELETE | /api/exam/paper/** + /api/exam/paper/auto | LECTURER/ADMIN | +| 考试 CRUD | GET/POST/PUT/DELETE | /api/exam/** | LECTURER/ADMIN | +| 我的考试列表 | GET | /api/student/exam | STUDENT | +| 考试详情 | GET | /api/student/exam/{id} | STUDENT | +| 开始考试 | POST | /api/student/exam/{id}/start | STUDENT | +| 断点续考 | GET | /api/student/exam/{id}/continue | STUDENT | +| 保存答案 | POST | /api/student/exam/{id}/save | STUDENT | +| 提交试卷 | POST | /api/student/exam/{id}/submit | STUDENT | +| 查看考试结果 | GET | /api/student/exam/record/{recordId} | STUDENT | + +--- + +## 6. 异常与边界处理 + +| 场景 | 处理方式 | +|------|---------| +| 学员在时间窗口外访问考试 | 400 + 明确提示是"未开始"还是"已结束" | +| 次数用完后再次开始 | 400:已达最大考试次数,如有异议请联系讲师 | +| 交卷时 exam_record 已是 SUBMITTED(并发/重复提交) | 乐观锁冲突或状态判断,幂等返回已有成绩,不重复判分 | +| 定时任务超时提交时用户同时提交 | 乐观锁 version 冲突,定时任务忽略,用户提交成功 | +| 试卷总分与题目分值之和不一致 | [ASSUMPTION] PRD 未明确,建议前端组卷时实时计算并提示差额 | +| 自动组卷时题库数量不足 | 400:题库中相应题型数量不足,请手动添加题目或降低要求 | +| 学员中途关闭浏览器 | answers 按最后一次 save 记录恢复,重新进入走断点续考流程 | diff --git a/training/context/03-功能模块/05-培训计划模块.md b/training/context/03-功能模块/05-培训计划模块.md new file mode 100644 index 0000000..23ed921 --- /dev/null +++ b/training/context/03-功能模块/05-培训计划模块.md @@ -0,0 +1,196 @@ +# 培训计划模块(training) + +> 证据来源:[SRC-FEAT-01] [SRC-FEAT-02] [SRC-SQL-01] [SRC-API-01] [SRC-CODE-01:module/training/] + +--- + +## 1. 模块定位 + +- **模块目标**:将知识内容和考试任务组合成有时间范围的培训计划,分配给指定学员,并跟踪每位学员的完成进度。 +- **解决问题**:组织端无法跟踪员工是否真正完成学习目标;培训计划模块实现"分配→执行→进度可视"的闭环管理。 + +--- + +## 2. 功能清单 + +[SRC-FEAT-01:模块六] [SRC-FEAT-02:3.4 我的培训] [SRC-API-01:4.5] + +| 功能名称 | 功能描述 | 输入 | 输出 | 依赖模块 | +|---------|---------|------|------|---------| +| 创建培训计划 | 设置计划基本信息(名称/描述/时间范围/所属部门) | TrainingPlanQueryDTO(title, start_date, end_date) | TrainingPlanVO | system | +| 关联知识内容 | 在培训计划中添加多个知识,设置必修/选修和排序 | plan_id, [{knowledge_id, required, sort_order}] | - | knowledge | +| 关联考试任务 | 在培训计划中添加多个考试,设置必考/选考和排序(V1.0.1+)| plan_id, [{exam_id, required, sort_order}] | - | exam | +| 分配培训对象 | 指定培训计划的参与者(部门/小组/个人) | plan_id, [{target_type, target_id}] | - | system | +| 培训计划列表(讲师端) | 查询本部门的培训计划,含状态和统计信息 | 分页参数 | PageResult | - | +| 培训计划详情(讲师端) | 查看计划详情,含关联知识/考试/对象/进度汇总 | planId | TrainingPlanDetailVO | - | +| 更新/删除培训计划 | 修改计划信息(未开始时可修改,进行中时受限)| planId, TrainingPlanQueryDTO | - | - | +| 学员-我的培训列表 | 查询分配给当前学员的培训计划(进行中优先) | - | PageResult | auth | +| 学员-培训详情 | 查看某培训计划详情:课程列表+学习状态+考试列表+通过状态 | planId | TrainingDetailVO | knowledge, exam | +| 进度计算 | 按必修知识完成数 + 必考通过数 / 总必修项 计算进度% | planId, userId | Integer(0~100) | knowledge, exam | +| 知识进度同步 | 学员学习某知识时,若 source=TRAINING 则同步更新 tr_plan_progress | planId, userId, knowledgeId | - | knowledge | + +--- + +## 3. 核心逻辑 + +### 3.1 业务规则 + +[SRC-FEAT-01:模块六] [SRC-API-01:5.4] + +**培训计划状态自动流转**: +- `tr_plan.status` 根据 `start_date` / `end_date` 与当前日期比较自动判定: + - `NOW() < start_date` → NOT_STARTED + - `start_date ≤ NOW() ≤ end_date` → IN_PROGRESS + - `NOW() > end_date` → ENDED +- [ASSUMPTION] 状态字段在查询时实时计算,或由定时任务定期刷新(PRD 未明确) + +**培训进度计算公式**(V1.0.1)[SRC-API-01:5.4]: +``` +progress% = (必修知识完成数 + 必考考试通过数) / (必修知识总数 + 必考考试总数) × 100 +``` +- 必修知识完成:`km_knowledge_progress.status = COMPLETED` 且 `plan_id = 当前计划` +- 必考通过:在 `tr_plan_exam` 中 `required=1` 的考试,学员在 `ex_exam_record` 中存在 `passed=1` 的记录 +- 选修知识/选考考试不计入进度(但在详情页展示) +- 总必修项为 0 时,进度 = 100%(无内容的计划视为自动完成) + +**知识完成与培训进度联动**: +- 学员调用 `knowledge.updateProgress()` 时,若 `source=TRAINING` 且 `planId != null`: + 1. 更新 `km_knowledge_progress` + 2. 若 status 变为 COMPLETED,则更新 `tr_plan_progress`(plan_id, user_id, knowledge_id 唯一记录) + +**考试通过与培训进度联动**: +- 学员考试提交后,`TrainingProgressService` 查询该 exam_id 被哪些计划引用(`tr_plan_exam`),若有关联且 `passed=1`,则重新计算相关计划的进度(或标记为需要刷新) + +**多对象分配逻辑**: +- 分配对象类型支持 DEPARTMENT(0) / GROUP(1) / USER(2) 混合 +- 当指定 DEPARTMENT 时,该部门下所有 STUDENT 账号都被纳入 +- 当指定 GROUP 时,该小组所有成员纳入 +- 已被纳入的学员在查询时去重(多路径覆盖同一人不重复统计) + +### 3.2 校验逻辑 + +| 校验项 | 规则 | 失败响应 | +|-------|------|---------| +| 培训时间范围 | start_date < end_date | 400:培训结束日期必须晚于开始日期 | +| 关联知识状态 | 关联到计划的知识必须是 PUBLISHED 状态 | 400:请先发布知识再关联到培训计划 | +| 关联考试状态 | 关联到计划的考试必须是 IN_PROGRESS 或 NOT_STARTED | 400:已结束的考试不可关联 | +| 进行中计划修改 | [ASSUMPTION] IN_PROGRESS 状态下,不允许修改培训对象和时间范围 | 400:培训进行中,不可修改 | +| 知识引用保护 | 已关联计划的知识被下架时触发警告 | knowledge 模块负责,见知识库模块 6 | +| 学员查看非自己的计划 | Service 层校验该学员是否在 tr_plan_target 覆盖范围内 | 403:无权访问该培训计划 | + +### 3.3 状态流转 + +```mermaid +stateDiagram-v2 + [*] --> NOT_STARTED : 创建培训计划(start_date 未到) + NOT_STARTED --> IN_PROGRESS : start_date 到达(自动/定时) + IN_PROGRESS --> ENDED : end_date 到达(自动/定时) + NOT_STARTED --> [*] : 逻辑删除(未开始可删除) + ENDED --> [*] : 归档 + + note right of IN_PROGRESS : 学员可学习和考试 + note right of ENDED : 仅供历史查阅 +``` + +**学员培训进度状态(非独立表字段,实时计算)**: +- 0%:尚未开始学习 +- 1%~99%:学习中 +- 100%:全部必修项完成(培训通过) + +--- + +## 4. 数据结构 + +[SRC-SQL-01:四、培训模块] + +### 4.1 涉及数据表 + +**tr_plan** + +| 字段 | 类型 | 说明 | +|------|------|------| +| id | BIGINT | 主键 | +| title | VARCHAR(200) NOT NULL | 计划标题 | +| description | TEXT | 计划描述 | +| start_date | DATE NOT NULL | 开始日期 | +| end_date | DATE NOT NULL | 结束日期 | +| department_id | BIGINT NOT NULL | 所属部门(数据隔离键) | +| status | TINYINT | 0-未开始 / 1-进行中 / 2-已结束 | +| creator_id | BIGINT NOT NULL | 创建人 | + +**tr_plan_knowledge**(培训计划-知识关联) + +| 字段 | 类型 | 说明 | +|------|------|------| +| plan_id | BIGINT NOT NULL | 培训计划 ID | +| knowledge_id | BIGINT NOT NULL | 知识 ID | +| required | TINYINT DEFAULT 1 | 1-必修 / 0-选修 | +| sort_order | INT | 排序 | + +**tr_plan_exam**(培训计划-考试关联,V1.0.1) + +| 字段 | 类型 | 说明 | +|------|------|------| +| plan_id | BIGINT NOT NULL | 培训计划 ID | +| exam_id | BIGINT NOT NULL | 考试 ID | +| required | TINYINT DEFAULT 1 | 1-必考 / 0-选考 | +| sort_order | INT | 排序 | +| 唯一约束 | uk_plan_exam | (plan_id, exam_id) | + +**tr_plan_target**(培训计划-分配对象) + +| 字段 | 类型 | 说明 | +|------|------|------| +| plan_id | BIGINT NOT NULL | 培训计划 ID | +| target_type | TINYINT NOT NULL | 0-部门 / 1-小组 / 2-个人 | +| target_id | BIGINT NOT NULL | 对应实体 ID | + +**tr_plan_progress**(知识级别进度,供快速查询) + +| 字段 | 类型 | 说明 | +|------|------|------| +| plan_id | BIGINT NOT NULL | 培训计划 ID | +| user_id | BIGINT NOT NULL | 学员 ID | +| knowledge_id | BIGINT NOT NULL | 知识 ID | +| completed | TINYINT DEFAULT 0 | 0-未完成 / 1-已完成 | +| complete_time | DATETIME | 完成时间 | + +### 4.2 数据关联 + +- `tr_plan_knowledge.plan_id` → `tr_plan.id` +- `tr_plan_knowledge.knowledge_id` → `km_knowledge.id` +- `tr_plan_exam.plan_id` → `tr_plan.id` +- `tr_plan_exam.exam_id` → `ex_exam.id` +- `tr_plan_target` 多态关联:type=0→`sys_department.id`;type=1→`sys_group.id`;type=2→`sys_user.id` +- 进度计算同时读取 `km_knowledge_progress`(source=TRAINING, plan_id)和 `ex_exam_record`(passed=1) + +--- + +## 5. 对外接口 + +[SRC-API-01:4.5] [SRC-CODE-01:module/training/controller/] + +| API 名称 | 方法 | 路径 | 权限 | +|---------|------|------|------| +| 培训计划列表(讲师) | GET | /api/training | LECTURER/ADMIN | +| 创建培训计划 | POST | /api/training | LECTURER/ADMIN | +| 修改培训计划 | PUT | /api/training/{id} | LECTURER/ADMIN | +| 删除培训计划 | DELETE | /api/training/{id} | LECTURER/ADMIN | +| 关联知识 | POST | /api/training/{id}/knowledge | LECTURER/ADMIN | +| 关联考试 | POST | /api/training/{id}/exam | LECTURER/ADMIN | +| 分配对象 | POST | /api/training/{id}/target | LECTURER/ADMIN | +| 学员-培训列表 | GET | /api/student/training | STUDENT | +| 学员-培训详情 | GET | /api/student/training/{id} | STUDENT | + +--- + +## 6. 异常与边界处理 + +| 场景 | 处理方式 | +|------|---------| +| 培训计划结束后学员查看 | 状态=ENDED,页面展示历史进度和成绩,不可继续学习/考试 | +| 学员尚未被分配到某计划就访问 | 403:无权访问该培训计划 | +| 相关考试时间窗口已过,但培训计划仍进行中 | 考试显示"已结束",无法参加,该考试通过状态默认为"未通过"(评估影响进度) | +| 同一学员多次被添加(部门+个人双重覆盖) | tr_plan_target 可能有重复记录,进度计算时去重(按 user_id 聚合) | +| 培训计划关联的知识被删除 | tr_plan_knowledge 记录仍在,显示时标注"知识已下架" [ASSUMPTION] | +| 总必修项为 0 的计划 | 进度直接返回 100%(calculateProgress 中已处理:totalRequired=0 return 100)[SRC-API-01:5.4] | diff --git a/training/course-20260429-1000/materials/新建课程.png b/training/course-20260429-1000/materials/新建课程.png new file mode 100644 index 0000000000000000000000000000000000000000..d27d161ed5973a2efa41f647f8a2a59a2f9f10de GIT binary patch literal 111302 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 Qhu|w*Ft#u%H@F`CU;mEef&c&j literal 0 HcmV?d00001 diff --git a/training/course-20260429-1000/materials/课程查看.png b/training/course-20260429-1000/materials/课程查看.png new file mode 100644 index 0000000000000000000000000000000000000000..ee30785f07ce3c75b655143ea8e9a249443027c0 GIT binary patch literal 315520 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

bAI?4E7*slLkki2g8)AO%=P(9 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≀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%0D5TO#4lUSfCT^DOAVolR< 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
qAP+W-`T!uj6(vNRfrk|9~@nWs*oqyIMj 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

y?U%B3R>czEQqs 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ʪLeYY2TNPty)T@5yNH%qo|fHulN;NpJzm!fbS@*5 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

@i)X?Juqe&*Q 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 literal 0 HcmV?d00001 diff --git a/training/exam-question-bank-20260512-0900/materials/固定题目.png b/training/exam-question-bank-20260512-0900/materials/固定题目.png new file mode 100644 index 0000000000000000000000000000000000000000..c6391b21318362dfe3efc8c3429dbcf6d7365ac9 GIT binary patch literal 67287 zcmdqJcQl;O8wV4x?!+)+lcJ%$K$8T&Rd!9@M0jc|J6+%05D|SP63dOq zdRD#mv+6vC@Y@o6C@R>pizS<0-#T!-ee5fxI*e0tM9SyeePXyuudL+IFc#xa5JKzu zLsG9ps_uoh=}+k);@^of?ly`THznvBKWFjx?zpOi@S60yrJW@6$#{5(3|w55nwgv9 z0c8DcjQSSq*#A0c<>*rn{&k9983Kg`oOU<+L@;C4F-DDo!d(5vq)if$iw%SnjBYR`%3VT@^=$HKdip$S zEWhB5FY@~l`jh?JC+tc$y7@Ygv{{?boWZMWDiFLDJg_C{s^kL09z)z~fi zWeEU-{zoSvKxCu+a!{7Xo#(d8-7y;z8haRTY~KFImO)1CMz1U2WwG1$KaP&&s|E6) z9pe3CW~|F%JJwgMLoc-=T_ZaNwE8>$aqx>T7bj=&GlGJ)7)G^R4D_ajPVT=8WeOoC zEoPZ5L1PNDME~)vp!Gzd4#1ppN7jO|bW#76fwZ0V+eS=CSn0H(Dt+>>SlAOZQ>CbL<#`cq{$XrF zjZwh%qm4sWLxX6CO5MSzQlteAofh|K(nJJ1D{^E+Nx}NC+eJkH)z0uZDDQ|T6>+6( zd#beF#vhKM4W&CZ$rt)V#u}nfuhDv)1&zEFF{4jROze+Mp2%+0{heMZj8de*Y$V%Z zwO^w~=}Sxr+!2F+>jFK0MYz_}v^k7f0qK*(llPs#U)~(6IN$unGf$NURFQ+NsvMkG zldCQCnBo+*YSU+rj|*j;OVL7>M7#kDdf^kVA-m*lKuC zU*bXaI@!5_on7R}W)g~MtX40vc5^dY;F@rG%W$Q71E-GrWUBd*^i3k(S@4QMO&&Rx z5whDP>KH3IrNK$I6V^YGmPaS7wGDwMWjIr9qy~DZ5ubJgG}z()+46$71_o4^7ftR^ zWd=ZcwPu9(b{%o}9oGhdO%VKcVaqqMiu{|#|)F)}a z(bgvkE>xy;HGq|fPJjPxkZ##BM70a|p3&7h_D`Jd?WME9PXi$Z*gIvh83k9fX*LT& z5(_56l5Tu(s;IMlMX31cBkAS5Z=y+#c5=r16Wth`HWG=gb*94nq}Lb|#>VE&_8e58 z0!o}VP=@OYomNKM1(;C&3Cw*@C#z>iN%g7a-^F+ICGjvL?*CA-M%JzW{{3-X*EEEb zXS+2JKXzM;6cB^!y$(t^Qdd#&XKMRP(45!Bmdl*yNsr$3FdjMB1mWP{dM+K(_{1*4 zf=3|DinBAuyn3F=Wp=1;9^-7ihPOH>lvsjC2YG06;>*orH7qa{itJ>cYM;=Hn}amE zs8y^SUu4ny-k02IsOru!I@JQVittmtJoLheTS-&%pv~d-pN5pJWT^S*%s3qH%Qg&L zSD@E#Glc2Nn_S8+q`EOPUlNav#|eSK*QcuMpsgOQ)UAtxpD@2!&upD`<5$_cJFn)D46{-E)UYC0vjh8eBg|$1VW=qjlW=Bb>w_b|63)63QLIxEQVR95F z9yh&Np3GBx$oVD1ZA~du*%Qk-;u`Oai4o!iwN$CRV|xe1z$@c#Qd!I;RP>63w~w2? zO|ZX1T-95TPfYY2m43C7+KXRZ9#@=b5nwpFk27Xt>@jPJG?WXwe=EFS#JIS*xj8ux z2fMh%t&bVCcoj@$B4r~VNB-Cke)+ORmJ$YE6^nd9ubt{b-OBI3D9c|ul`{&rOxK{? zT!Y7qJSGS~XPS_G^;H#8x;;)KR60eg2=?s*> zkH5b9VBmz2aG^%zMF=7v;lJul5pda_t!5UGNnl@2ySZEy*r_|{7ud;F3Z+-dP8M|A zk5SVlW;g8YP2iYu;$Lp4iit{Q6ZQC@oIpew@!jU*>hDny#|bBkzJ!r7QP_bdJt=A6 zUi2hJ>xh_e-gobl?!mYA9dGy)N06~3hCzrE{cU?qKWjqV$XC@K5uGZ0$hwYKq)B}h z+?bROHtq!_wmZxI(*B&3=RTLpITN$5L|jbFm@d~Ep(62uTQIt|#6#0cyQR*dMngkY zWwP*)&o#kG6a+PgF?YvKBE2(uC#!J)-XZs@14frBEENe0WoK1!FGaLgubMBNXW!}d z7o^dpAJmiMFuv-O5G}yD=;{c-*xvR7!0aIq%xhWST%K-n5Bl5(WW9}mWU|A)Oq5(P{dWbpz*Xuau2eMQ@b4A!0s3U zhP=>dj2@YTm%;o<)8r}Fm`dFo4q~D9@PJFh8TO4&Ll+=WFjyGU#Z71U{*&3kw~&q< z)AMC=KavV8_ul$-Hl-YxMWAAV6reb6PG8tuogZ#Y6p09XjQ{kF)Im1PB!|Eq;iGBi zHC3&LWKYysMQ{u}%4JAjw+?mnRzF3+-e#3@C_Y?~axk;Oz`u%ao?LZ9ND&)E` zht+|eb1YQB;Bp+)=Yt@pZplCuP39DJ>?Pf9Jbc$8sQaA5+*)ZK{<6?co0m>k_OfjPkNBA?AwCyr&6Y1~$`N4Ck&xkonNegEJtst)KvR_k^YhAD7 z=kua{Zzii*P{CCBbGqdAE)!`5VxpogU+$pS?A;sRTnrbX;I^FndLI*PxYC>89{u|I zV(w;qY%G+F&;E3G9<;E&o{(DT7VomZ)CG7hh-!z`vxC*0>Q#y|`8B*m-SyaI;#7)l z`kFnz94&zf_}iK0I_hyfisJ|fBh9>M7gKC#V;q``+tn8`7%ncK12l!XzZ8>%+Ue%n zYX~RtzD281W?AQ+l1bKBYp{QGx$YC^=#wo=h?3@dGYX*&T*8E$q0b z)nnq}X#VI`3R#C;Ky*e*=LZ~!NXsMd#YQlA88yFCbQ3(OvK0`(i(FoY#Cct`-N*>i zutdsBJh(UtvwZaD?1iC@Ef+suM@cv_3Nq1+Y6#AAY_Xl@TB2jJ>GVQ`6<;b$J-8bp zi7BG3bGEj>o+Pemmi`d`6*I#H_2I%UZVT%QDQi>-+ptN-c#m1Wh*^WwgNaPM>iC<> z!{szCn`@a3TbO~s`f&%`6PHcy;1n8e^Wpc67GBNgtBb}Prx2Ty(9A?j0P z1-$Q5yMKmvNm@oKiE}cl!6LR}r1&N0IKD=$_I%vr-j&QJ%7_HrpLL-8$IE@7v-!kJ z`7ccSk;ykPM31Q#ZUW!eu3A~v*nA1#z4>gawDMtVYw-$^bSX{F?EwC*szHxSnj6t~``Z zu3POL_lg%ejR_zB_8f{?$fSNWW8{WYQ>nl$_<~_E{JQ1<9Tj{-l0%0w?5GVnY4sS- zX7yN7J{k{wbS>J)+w>#xtC6=PbC1ZavuA#xr3kfl))EkZ)u%1eAY>J-_*M0rdqT2u z#*oFz_$@opKE5|FFu+M}ORk6+U8a0u>E(64KLFS=)6CP>fCwk8{xhb4LtG1(k5x0k zyrUpP)4!}T;6H?FjXe=5?V{Z`%&EyUn%$vt_K9pgI_(smrn_4;KUUJg%c%a%0)^UEmny4(CLEWyG z+Mq|0L|vw?EAnC$B?f-y#R3iQj5DD*N5_ryND%|~qb3?nTYi?W(7o%sX+KFvPiEzu z%1kPJj_eN2etdHWw4X{)$Z6ED-N)T<`srrFV(t`hT`66gAj>^na6~qxg7feZ3f*GP zlvo-^E@3FyDtBbzmkTeSnpcUTuQ#uPus`i*;Fs592G28aDz1 z0`42wwI&90%7R=O?y~)fQ{<$*l;>|o=ivSLP*&AeBLaAJZGLd%_u~9%HX*ZY+cB9N z6)SF}$3I?uP*RG{s{Qy*x>&#TXM3x!5oMU>zG>!wxWR~UHtS9AZ!J#^Eel0x&gioT z300L6JQqwK;#IJ+u;7SokmB$P{?C-*+8sm8;LuQl$dHf_O0TMlpM%n@_0*tS4k*bB z(SX?4*fz#tGc`{6X=!r+PYU|EvB~+L5fSAG*Dd~uBLd$y_m5{7BExeYU{F7B&1-oi zn>r6DKw@*}0~QW;1{23TpYi2Y7Q98)lIu?vRD3s#`Hz7(-OZvorPQY3vl8vlO$23O zV8E=0e?aHd@%YT(Py{csUn6rn$N2%NY#crj7743nH1~O~buTy4-C|@$>xKn%07?xA z9J;~U!DEJqENi6BPdj9o=VOAuE;oC}rMhvSq`E;ZV*7WixHfODyf+Wg*}c~5=Hd(6 z^$E!8Z%)VO$QBo*>gu$~vydTFPs-;PmRCWb?&&Q!_x0Ry4w6&3`(i>`$)7(^dBThJ zC)`+Bt%8c;7i2E)!beMIcfWKiN9SE!Bmc!J{~b9i1Fh|qA(nEK_}aPt5dtl;iApUJ&pfAZj#Ii|W5`D6Dm zJ!u>3>7t*!!Vw?OH20^Xd5lXxtLM&^89m>g(ETY=FPwA?Dn30JytAa6e$*PwVbagb z$JduCq;+LKS*$;jBR^MWBJbo>;T~LD>wzJcdFw$;3O*)k%wV6c)uw*?6@hK|4TaMX z=xzA(6|02J82=(zDI|{lBxz6r)^a3s$Fo6f%wez1$7>6i3 zhYk`$PxyPz(lWO-Y2~IycRT4YBHN2_Zs1NOp~gOKT`G>H;SUl%!7o=UK|Dy0gBh(P zo3LjkF-b6#Gho5)jB9?)&??2sQan4K=E0`8lmhF@>Ee1hx^{G^l{P?B5{+$4`T$YD%EHch z(k!w3x?3gljgj%vT%>cd;N_(a4L;VG8!NT72s3go!D7W@Ltb`IIx?|Za%Y?6;d_m} zB<_{@Kg{}4seNm%h8i9}Z4uRF#pJ7*GWq40W)6G*@te&cC;cT;_XNXNtRv3vrM`Vb zVUJoQ!f@H@B1SWPjf||U%x0(?>85fYx_82(%eWi*=8pRt{aG(5(`E!Fu=x!Dwty7% zAQqGT?d|PIpk0qQZR)rnXh6&~Qz^;(`)`~bR22$$N0|Z^g!sB^hc_2@9{0WGHfiZh zRKDuy!Rgu8>$&DA-FKLRh~FUK&4vpP1Fzo*kJd~B%ve7r#G6>0bG>$A#Uutu4Zwqg5Ijr{}f2vA;i*AyK4T zZ-3}{;?zMeQ)_$782OP$4VSj)eOrg_x?P}#9S&tm+}?^}(Y^|6L%yTi0_@ul;n!xO z!SjyHlYJi;EMmJ9Vq#EJ+{=##b~(3vkFkk@-*08P<8l=0)6SeV@G=W4DExFxiiyNS zFibwhwZrt}E30|M&Fs7l%}LY4#YYXn8`N)E@kYkFje@UshYTP?b#`qD~B8g?IF044y)Eet0L})YmloAJ&)tfM>sfYjTI&X6u88E_L=Vf(X{eG zo#QYqO0U!Ty~PffmCf^fL^)ov=J#~1pq9y(ek)doaa{9y*V+#zr7o4vK1FUqBg#Q% zs}N3`dR&mhtL_a9u!6k>gjS;Z1bfQFt9Vp%WLefrG+FGiJkNauOiGjQwTjIte13Yh z3*G0zRPqouH;LDKZAXv67tq@2CBa;?1NIp}XZKlJ?w5?gXpkRD+PAmm4u=+M=x1Cd zg=`Fvbt3AYkm62afr{-O9;Vm9^GlSCPB|T=Ie74nzOz;_sIr{gWC?Y#Jl2;9cVdavYp6387a*b(R_UTXZ)Gv8P{us;@7sY_F)-dul8>`_u*oElIM5WzQ0?zWy=>`m`Q19*aRMBx{AcbnsM6w$LO*NX^`@cNLk@X(h6O; z4W6W$Ih3Zb0n8lisMCuR6}s9VxOQm%O>TKF_)I!`2WJ>{)^-_t!jjDRY=Cw~dnbR< zOYq>W=4BqMM7v>Q$wx&OoX7~P_}#0MIgzWw5fBjM!uVSsJ$eK<3i5Jt$P$B&D!avo z%l)3|>1n7^j_~22D2lv2oKi%;`I|vUn6IyIJrF9BGtw5Wkn2>73bu@3eS3=HDyW-% zGXC5~pxl&$YuzB$lVOJ<@)TOyDPip1)&0)x%pow1L9#LG)}wPII;dI2t~U6%8f0}k z(?{}BkrBtH5~|K&t3QbYb#pPThef@v{qfeFfJ+&Vn|FD&Qjsx#gC>izU}BDW$}c!r zx|`Hu?1)=ew>l4KNhqu5&UGI>BCA?GELi!Lxed&^d2*UZdSXDj!nzbbeHIKN^i3Sl z+Vd$V6r;1hgeTr<_uQQO?s)t3&9eY-4fdAb0b+ZJq4Y|m0+gbK-t8)Iq;h|TVhR3~hinDH?|zHSe)zQ*;$+%AFa4Aq|Hjo91! zn~Hs0Sy>5W*%7XH5$VpjNA5}%MkQVZq4O{o&KIVmDX>Z%UNt(rrSY~gGI4n&y7IUN z;{CFjn&W$j_0Csm@69q)JK7v#*qL){%|B`j9fb2N=+TpqSD2kNcL|j|kAcCg02fjU zre3lD)^vFNhzcD8tSvlRkpww-> z=1QB)zZV$bdNV7U`O{772zo>CXxDbbl(UFGS?#l$>5pGDuw-pSd$6*KTChvfytu@4 zwPJ&(oA$K69i~RjO4fS_k-|1UZo*Zws%T?n-U81np^C09yW;4MkSs0AWS18_R$H-3 zzohXV{;d|&C#0kxfHZ6^>TnDX;Va8mGY$KvtDXHVwhb~k}1l*{yrXIpLwnGjhPFAqh-ko64K*lpJD1CLKA zu*@8!WNUSVO8NNNT}+!R5%OUhP!OrJ^SEX}6-HG}O;D#NjBtyR&wfeo=6s^eWZ*V< zCgJLCYin8x#3W(~=nTM3xo%0ibd`Fqskl(MPYlog^xecaN7A<2pnb*owM|RzfPB|# z4j4>9!VDxTa~3?|WVJ6U;%v4Y2FQo^EHlE;R! zB4v}hYS5%3cpE<^ks|M6dQ=B5SNLhlhybn&!ijbOxb2`>IRX!<<8Db!# zyrK$6v88)GSZ!U0!h{&vkqQp>wD2Y|dT-1Sf){^|^$+;kIPQG#*~~ML!ofSgU~S7O z{!hcr6C%V%Krqd}*WTu^KwQo?yqZ~(l@|8h`k7n*#Hh?SVbrJV6~!Ijm#~i59Wnyy zAO|Aw6D)zb#LoSx{dHl~SOXCMRmmxNF0HLBr`^9V%c#t>3)Q~rsu9~_<+848^ewvL zJ4qeWiV_t+{@wI&%I{J1E7|D=&x=@Qt>KZ8jg5_ytr;R*+@bx#+S}&Q)04zwV?A4? z03LPVEiEnGu0PR*Kp<3BNdq*8zTdxIX6`aUoXE9-)aI_^BRN@YE=_2h8|g}EMdScc zH~eTH&VIJ>@@!jTUAr3Zs)t1I9(WIIouZsjum~T2WWpKp3P;r=BEc;(}iy z+d6i%-;0ECWJ{@CJiLLGgG%W0cCt<51q|@32)dy3A|I&tzct2X1n~0n@$q4)#_S-x-hjDjgp+i&i;#J#ne3w$>uGU7=sozs zK`?GDTHpv1f3C~#O^3OU)R3VDlDy>?X z(=%ho(;$*W8)O&XdB>itjjwMl}MddW?ophaqJF? z|A3PsiD~WKGdDd?LUgfG5_B`#!&*>V;OZ&n=Ka2S;9G2XI)8FKcmBI~v4v+--bWhp zSI4cxjj+%|#l|g)=hbwBjy^LZBdwm!?Xg_H_!GWKsT36md+v`ygEZlDeM!&PSnuCA zB2b8~2ZOBx0{ru(;pGNRAEC%nZWy1G-Cpo#r^3dJ06Ioz+V*AUY4@dpYh^r)Td(fW z9&iPK+B_B(mJV{i?XsdrB>KmgzPPcbjHY^}T>T=PR%~e|nBD9Y$o?2n@myF6xXk|y z8SG~0UuD(!5wTi|Rha5nSTkr#j@?(1<(n25@bhr3SyHFrRMBPT`FfecQne*|G&dOh z>P(n6=qigy^qrptLukI*)p?~N7>rxpbrP+L>6UMii2=JdOmTPb1@ahLttQ^y#2gY* z&p?WkvkeI>seFp`?B``xGg60hHHeFo#22j%|?v-lcC7fF*Q8|kiQ6E(yeoyE;ri&H2zeXNgCw(Oz#S%MlM|B-k1A( zw8N-0IH0Pxb8;`##P!pcocFfokzF5s+(@?uC#j8AGdGhB347jAYAi7Vo+4nEAgCo& zsB>jjjY6c`jB8|Hk0W6c-k3)9t0Y}}8{ORZfO>f)qD?@nR$>MTS20;m3<$UvTBWtw z)*f`@yx8J#Vy>DH1EI~%UR%EIdxx2brzF&% z1i>=kW+bdeN^ zb5vvNh@MZw-88&Ll7?%!?;+tv@-&4hd>5mMp^U~iy@y{KQIqp`afj~Vg%PyTjEza; z=jR6>fT^#bl6{P8_j9hTQ_~=8KBbn@x^~~xu#upp z?ORn;iCqo+CPyY({KpIxKL&sv0IXpPrOFk}ooY!zKq=fkV%ucfP`=CYNONmO&>b1& zR=ye0xHPov3n-CK#m_pC=)S48bPzc0bXC?jS? zueC-*LpqRxPh8mLDk!F;EyPgU3m>JmuL+RB944E#r|EGl3kt;S5hklJtiMj6JrnB^ z7aJ69SivCeV>o~-SL(_LnI73d=7i?H`iRy(7(Ry{9vPPPN_X@fd}q}b@XlAr&E(Q_`hsXib3`+;{J!=%6Y_wS~~6Ok+}qfmtB9UpL2fU@Uc`q5ZN{)SkdMe805>rU*q#Sx?M&ou@4 zH52&C%WWQF+F$ECf&=~+`=vyby>k2>5HJ(M<+1G?e4#X5I+vRFA+zA2ErF9!kRM7Z z2DGp?X^%;V^XxOz0$yUNk?bxVv|s09RJtt@K3jj);o&BKxSzPTva+(gvOo>`CEu$> z8IyACygP2n7sHCTwK86@Woq|)lL3T*O*oLWwqr=k?=9XF!>g8Dzl9$8=4Nk2dHq%q zp*8JqZq*tX8dqf(iUtQ_mZd3yS#}l5ktfxg>{R&ZqtQNtPFr2IvbbJ|()yAbk>jyFFKjwnWru=10cxymK?Eu)DzFm; z4APX$*|?NfAiQMz7a7&b;?>O@g0kR0MM|B~9}+L*&?_1DfN!)+q-ti%e9qi0X^Mrz~w=C(@oEtGwlIo@sDbO~0i95nVd z#Ly%QM5t|0<~78d1RwMV`TNHuN#{R*o563>1=Qu~5VMH90o9GACY>?4V8-R3`}1c0 zGYv10djgf>9vn7*P)i?~3w3I<6^TEyjM#G$iz_=%HG8RxXfJiHtTtkC#7uDt0GT&$ z!#H2hi_61ie_@SPof<$cdbaaf)0ma~f7ueLtzNq5dZUlyton1L3tT(5cuku2)vXXLBB z`EfH)Q0sn+Yef6eXl7{%peiVt5txo24qC&0j8PV165Fvsl%PAHjbJ+d&EpxH9hElj z0=k)8D0HgSsAtBe5$46`u+rN>;ZZL@deRag)fu0ATCX!1rU_n3O~oxq564ZtH3PDD?Mvr4HB zY5eDOs=owKdIGh_-@o2x>g(?>gx@DcJ16}Qb%%yY3SjKAY5`cI3lmx})y$vy(TZOS z2-N=a5zy|yTT}4Cz}ZgW2vv`Gyr%X)yqitampg)(;YgdoA8*kgJSlc$Mf>s}^6iI< zt*z|~-2zzTrAp?&-JHzGS*+mCh(hjPHIuO`t3J^lyT0|C=iZB@>=n+TyF z$^&i>9N|nVt#D^eWs@24$9SQkt$o0u$yd$;vKAUOtZO?Du*ufe)=bxR(Y^@(4@THI zG-L-5_Yb9r`46S2r8Vy9J@#DiP2p^@Bkg&~FCl^I;D2Prl~z=c^Vy(x_N}N-L>&w19K|EWp{@juc05Ut| z{sKe4U;`jNOVe=xtvNc{+Jw#D1tgY%Ha}bnG8tXp@ z>c=B8GBWVeN?%eha!nsV$^d{))W)0x?Xt!H5UZ-+{y{T=q#@VK|JV&Mef%GXfZx^e z|49cRYO?=W{{Q6%Hd*zmjn{?$3ODdQz6W4f*RUtxWAjtb{rz~YLOuG=VZQDD|8EQa z|G>uo_twyg93}^<9|lcm9v%W(T3Yrle}!fPIOVQo>3i*=Nr+Kl04ChDZ)s&oMvf6- z{&&D377)W>S5_W7S2B!+wr6J-+BEiP-9!6P|L{NP@HquApG3zU#E^YsD%|d{bse?C zGFvzGaXsuu&*aQZHNtbX)lOu?7IT)sQ*qViiDUj9^vy^Ao~G8)ngRN?pY0fuvaREv zd?E--++~W{AQw#fu+~9g)(?r2-i7tw}m=7csrDF47E0&F5v!@Dz)|HyHmk zXG0zUMMhO@=*$@3kW1%XZ{HQ2^bF5v`C?}c%CPRe7pCjQoM4s~G)ukZ=J9&wonii*DA9@jo4f)%YAX(mLlR^BmqQ^;&x?$Cpto<51&suZwce_Ip7lvWM8=d8z0y_${= z?7E{sqiou4sjD8B(O%0crHp+w9dmt%R4Rmm$3#VL@;UyND)|geb?tbqF$?zd@v!Z3 zc^9XKohs)oO{u0!GXOHhrqAc@b=Suix7*GMc#v=9Sk;=1_4_%Ky+e zp|)zYb*8wNv|xTs``=;*Zz8M?jUU80;Z-Y_3pK&F7KP7d+nszOOxz*~lWQG1)oq&+rJr(&D0ZX>0iTrp$Qh&pQhX zt>eog^BBxYe>z!X!Lmx86iQ}^^u52ZjqWl3=jX(Aau=xNf4!&TK@~L+FT4WOzI8z1 z1Fv1S+ls%m?cGUiS6eaMxR*$%Cs=R(ly8QYeLy)KR$sCg04YpD_|WwQZ)=x zD+G?_w31B*uu-M)>hJQln|VMW#Zvv7t}oU_zY*h!%BUaGxitS>t7+mb4P_~FKSBis zJvP`O2@$%zbnyAieo>Z0V;rjEcb}>Mk*TmCeC*pJbQE@Bc>ieTOH_Hwo3U?|PGYMU zkDW~QnUJQBxThnn;?vKx@)^&?!7QU)>Ma_bSqA=6tvt@l--nm5B=Vcvp9j7v7cJ$E zj)|Jq#BC9HuJJ#c-z!l$WQ5w-sNIiX(?8G0uRsoCt9Ym_1?lyQCVtE)q!V)Yc}|f& z9ula>ph;Q#Hc=GUC$us#VMy>GBUoUL=y@>DG^Hi)oLf;R%i_Fu>a8$zCaZ{N1mvNU zO11GA&rW_3Shaku;3SG41>GT2(w110Z#7+adsD}6!cp=E;S31hv^YQpQ06wVwf75b z3kbn7u^31;HR|t{nK(X%nakT3p0@Yy45H+xjR>y>I5 zx}Cz%KE|7+P#rp_W{o8*I&*!qzF=L!aWZ3c6rd1qi_iVnhZ_o{`S2kY9mJV%77cQDe_!z?LsVKJluNs<_6mi)-9wPTVONknrQ%>O zD}xvu!E;|{c5yCMUF!9fW>?L@MF^+Ol9s$vUHMj#NvGnGcyoKm_fm$_Nsj(Iljo00 zLv?$SgSwrF8gTXWd^lbvVuFKzrQ0f5C?*Kb-D-qNq3zkO{u3kjU?nH3&`@JzuSS&% z4(SS227Ka!4h0cT#lt8Q%##6K=C5vxAy?Zl=?tmh);d4?N#VN(QE-r6Jp61zSEA?;TC(%|ULi z9!w7xu2>PKxbeYyI!QI5y?noi_()Z$cTy&u``j}8s?VjYw`d|&&%l7riKNdCFXT^T z1YKYYkDk$k|E-jvG!)r8QQ_uT#mT`BQUZf7Kb0mVE(LI~B?LR= zJ57woI&Kv_bgI9%C?>!%7Av*BrbRWKvi^B4GBwp2kfM@x64YZdz6V8q*@>(8;+XK&S4EQoFLPkM>r2RbJmVL4iJezXBRPmrh9T+EbKNucT2g+! z8Zr3X9JCT(76Pj&ng*|itb`%lRkfAgQQf(}7qigNH~}S{FI|zPsOkQL;bV6GFRABF z7!$NR`=MRhWKUUDJU~$fROS_wy=nu=RU=b|MmAUOq~cQ6qqk;}4i`6}OsW>oCqIAu z+qW7_6YFK-luf~Dz^Z}HWI8r7l(%#u8NJvrpO6D=y zBcJ@hu)qicxga+fX)?4z!4~7JL6cc-Tck-@+w!yma~;ZRY8G+dZ5&M0)HsZ1wCz3V zI96mV9l^#M-+suViaz#BWz03y2*^}l#eXO^{fXk?5 zpw$p?DO9zzK%gvABz@v;?loKDQ#o?WTw17M_xU8&5N^fR&6j_211QpME{pMk#g6bK zb)U}o>4U8O)9&QJ4v;E1IH0J=xYqsQBo8;Egv+2Cu)+e|4LIkHQ$e{hMcU91u6`dl zlrMast8Z43)7q}7w~dbjYl}BqC32r-?Q7g0dxgJ2{e$_8?#=c*E>rEeJ)KxbV)_T{DK2algM{wHh)l606_e1+M1+9aM$ZBjQ z+p#UMYd9SOKO3+UbqWj(F@g={@>!V2*M|WM$LF#wEAq-u>OVIdZEXNhMTq_7o*Br8 zu@W72lQDH-4sO~JC(lj4VHw#zt5v8t<5R%C)~R0=-D=)jCHb*jp@P<3G%)+{P?Tz1 zqC?!$)Ge_AgMSYGoT+li32+XQq-~P{r2|sifblVEL5vd3myBhPY*TA^rN<>KP`aEu zUiLSBc(_N&I53V%O=rvIXN_2-*vj`!vB^AFUqc04b4P8uzv}n*?*SACzDLH)Xutkk zFdrZTHndb1bokFnM_Z$sSqr_@fiZlHW0=>b4DZ#pLId7&FRBBM6Y;9U@?Ok2*Uvs~ z?$^fs0gq59qJAZ!RT&tgRCrjx>y6t%_lKeVCtXHR_pgzBobX(q(BoF++d&~CFb}qs z^yebg9Kx2Cq$ZBo@stj9&Uy;J7X$|KbDpYf^)Vd*NB!ElqrbN+fgU)J65!{I4>Dlr z8`l54jULOy#6%_pMo;HOIo%=8o!D((+_<3Q)cB{ySs9o0KMu&R?LCfk^qmrEopV>w zRJNuVIhe^5cCRXXmKi79H?>6{;B1yS{GIN{s?(V|{sFgpmi`@m@p0?YyQ&B`$Crpe zas!jZWYybSzqie}tith6mFrJ$+WWsu4AA?3F!o+=obs!$PeGky0ZAwwd8aF&r_&L( zT)5W4?_luf%|KE~<=m!{&Hh_YV6+Kw=eB|JgiSK9oAc7cxG?g5ogp=+{r3Mx4(3mC za&c+Y;KbS;tn?Y&To1rkV|Z-1)q!Lb`|+_el|+@y>6s^xcOmCZuKihrS_&N!(P^-U zb@X!??lw^f5dEFVT{kYA>uAHWWmxA856ZT32+Q*=>$^(*e@QGf#~2n$3sj?p;?(r< z+yHXb>9hx+dFIsX4%!+!mz&+5o75Ey0P|JVk@Ors1SWmcI1G_Ex3sb%UfYc3Kj^bp zJJkPNUHm1nj(0%y$&>pi{(@bgoU-Zt>uq1)Azimv0+G#HN~{pJ1qs~%`;qm4(suB{ z;bF+kMEiYf)k0uwF9Xl{wZ54AXG~9BSzT>7f?!z#C7|jeodo&h`92(R(CumWpkGl* zCnD|HkC~5ds;-I8o_()amCo%7<~UF)-_(dE%7N%!C8b~G3|_5|G)8t4r25IHUlYpA zEdkGF*GyRR>lwMJhF|XPN1GDIg|BACexA5Qbu3b5n%4ujP1a7%kM@~DoPKg`KSo2) z@>b9p_;n>7`xB%(j8FqNjLPA}TQQ7+Ww(e~q|vDrfJpcPmSk)2d0*ULdpk<(w(8Gb zUL6V~R;eZFrEsheHalzG-OyVky0PP!EylqDdX!+O=cK)_iECnY+|Mg)qMSf#nK7%& z;${bH&F22@+^#LFLhX5CbGuZQ_3%}ayX}|gOwj&Hnj=6jH zjDh8K*WsSk+*0-hew5<(>n62xqMV+>FDvo|I`1^MA!Q9lI_^U7VGrH2v7Gz&&!Sc{ zE)3ZD^5`l+FW3Zj*!rCRfGW%oiN8pTjChPR-g@85IgR(2F~yc--TfYGkyTLmEbxTq zpqcng^r0Nz2aN>l(}?|oUCu{xe1qr0Omi`}wf58*nd|aLcJvqp3Z;Z()?5hQfe@eu#I)4`dIUa?h1&^&rPhqbVymqm?hc{55|0 z1!VerkPz#Q1PTG$Dd~N$Jy2CxABYE8Zeaa!zeh1bjZ+C9gEjIdj-i{%d(Ie*TYq1g)?zK(So7!FMU6RqzGu>ut}U21^aMax1F6sTcy zSAP0Ir40tjY3+enmkMhJn2oGSYxQTfPj5HGWdH~k0H#MgOLa&xh)FDZyiaq=bMhQH zGdM4X2Um>ZFs>?>vyHh}xZ4nDDJffSJ$)A@#|=qtX)}8ODVM!*lION(T<6nHer2{m zfBtAHmNW9(`#xW%N1iXUUWm{O_RLL^PkyFxYUK41D(DKvlo=M$z3M20+<)?Ds6Hh2 z3Tm0Mu|#{{Rntb_-@N-O8y?Qxfu3z#{+&_=|B>@XqAL`h2W2r8delV5%)!w+ zU0cVCFsw0tcfgbjqP%h`$C#TT9QJld>S5S+i(I*L*p&H&3EsV?N*wO~rcOx7S(EO> zC}&;v#Yl(}Jf=z}%>1mLlkGs%hio}WFR(^eZ0Oe;1nN4LQYXMozwp zCh2X3AV=xxdI8spnE7n9@fi^16FcK z*_vu`dO%D#YmZNOj}KL*W6|Xz0n}Y}TyU5HS@rqzjfBenjnKS^qQ^#r9gc{i%8`Ox zmr$S=l@m^J<3${f$Bz4I(_Uoy;?COk01#Xb3fu-ew$g0^^LF_?`8tF=e^3a-Qy9o#F?bx*&rZ1}|mEl&foAoQ;< zpE+apDYYQjT{6zh)_#wEzbBbjH8HzdI%8YK3p+y5aJk(-14TXi;q=R~FtvIkfi9m> z?A=$&wUH_DfhC@9&ndI0;+D~XGuW^5Zz(a?eI3hf7}U!cIb^w<@dr+hNb&Hsijzy7 z^vFF)-4l}MZ`5K5o|W%$5i3N)6@|& z&v0)c;S~BdDGf4Sf;7}`JaviEet(o?pi}bew>9h6>~$~KtF|#x^lHX77}?ak%Mf}O z$aNLQL~=STazYgkGO>I{E*=l#+0>g(pltg%Io@er7jj*xxl{pqW^l01e}y&oD*w#s zKz?~CS1RS&Rf7CI6u9e@Tc8@`5)P9&5^amqcV;1!^2%eAY5;}t93tZnzLpk!f48G2qR*wS`4sO-CZES@L?RK(vB6B z>6`bi6%K|t9<;#D?>Zza0ZO>4OE5Z7crB%Dp7Puy}GQfvpdlfscZPz zPek{C<10zJ#`E$Qyj)XDbY=ano@Z~5N;#s6M@;AM;X6wFOlnI?t};x$NvppIw<#4q z5%Izz=8YFK`H_2P09+rA;N>R!{wW(_mpEcil2Sp&o*-f7%iNY~Y(ZvVtvq?jUg=EB zM{cO7b;MiA9w9q2#jJMq++z*yw4VNhw2cyD=UsjQ8t<;f&J)0)oCVGK_$yqsRz(x^j)v}2eDz=yZGT1wILs=4S0hhr ztN6z%WH-P`56uMR;j@fW@ z-^j?x=`A166%YSZMn8Y;6#4A)YqLK8jr{%1p)1zLv#x>9*5Yfc9Q*mNx;o=7d#|nb zgR}HwF3sVyC3O3fGgf0FRxty!E)!UBYZNEl_ZbPDti1LlbOXbAg!wQ08q>}%a~^tbmmApfTioE8aS?L0T4L^^JQZ1sJ~~JL zi{F}7Pe!AqwEU;dh;3tR=TivH>HmcMsArsagj->S4%H8c3xa!1HMW2Y8Yb>#TOJhQA->87{ADiY+BU>NT$xDZ%;T3%$; zPv1U%7e#&ov^ri~!FQgWn|vDR_$6>Po?M!e<~5Nb?O$*gH_qiWGv8j7UN0S$EaB^; zIfuV{=uoB-#ix=zPsck8;nsH=P zmMO0bJaKcy@&<|y`5sf;35y*5S%@^juz@?}u=D}%B}CshwvnNXX@y-XQyHlh>rSfM zzh4uKzNUcK>}`OiZsPYdT7hL3CTe#(riXiT6R?I#}dAy@Xm~UU%Ws zZ(X)_@hpxzXpE9?>0%DlA2n^Kia4r4-1#194Q7kVd6(fO`^!LqRw&#KO<#x=C4vR= z)tJ|2x$W@2liprfq=YZdFVZOMu)`U>>>!Gm7%-P2^}+2%`^2LsJnu?$l~p*3iZAn% ziwwfjczrF`7|c`n9Ksxc+>JLQ#+bdTe?PDk!7*Y1I)w1$)u8SRIm;e>CKrS*5c+0eMu{GtGKvwuGZm>$rWvRwW_F4 zN}KPIDh#L0_|kZug#t!%IdbW9L^iAnn+De%~3jk=AR zw&VPww-Y)e{>*{b2WrHvd_-o6oOmvmrA_sfeI7ZssJ)~+Q(Kk?WoewRY@_plgqkMT zX^DILDS~$KXGk}s(-`F%@>$CGybl)kQbk^}Q}wTp-&M%X;#n0CvcmaV?kdhQw+h%b zyk-5h$qaC#)bUx1!wTDx4)%$PAo(4`oFCyQ(r3dWq;UtJ4r@0nir45th`oCH`gPm$p)@s6ov%vWLooj~cG#@UZ}Hzhd1Dk$^e$r09=Egnb(;`K4JvDtyu%Mp^+qgCEVeQ71I#)_zG zdtdFjxOZySRjHZeL+O`cLQbppm;jXpPcQxXJ(jm1cZpTw(ztjnCo>lKe#xuc?Hs<$ zl@2vHPmod3E3dGw?wxB}yU=W1UAuCYqG&p?pzY6dPR@pjaMOXeq?sP%UD+>LbwY|* z!Wt=3mAp=%pV;0kzDwjtUvaEo$F4iNEbv}rhZ2J7mN-%2tL#puiV_kLL5(-Er%HE% zsa(3v8$ILXdHPPRdW5{ijmLQC}KJb$QD63jL2(+?XUl(xaoj*F2Gzx3O zt}B09{noy2%H4eQ$T6SyXtq3CL?xv2yPyZBwwzB7KMFb3M%{kEt@xI$WS^7nKo%O*4_VF%Is3z`PW=4fo{s3@%1{u{{ z!@iVk$x9Z>u0>&F6m~kZ_I>5t9-WzAj6%<67FBC_$RNu{T@t~UmHGCf8CW-iT4)%yCx!$C(Q=HhsA zyqvkBN3~9GCEEYqO@|5`{9GemO-Fi9%y+C36dpwe$I$l#qx&N^Ab^t5O~Bv{Nc3)a z38bE)WULCURL0It`B1Ji4l^**`z-bktEq(Uvj<-ahbUla?mfm*E1ym5;DqsHyRJNJ zT;g<$HU-u0DoQQJI zRS{oFbr zh||kFoz9784*?S>*bW8@PB0PT>Dd}4*p~;5)U`G{xHU1mX;x)s=k7(Hm%Z{R?-{IUDZhmGaz$9=b}5_c(u0rOG`wpZHREJL#qE#K zn~1rOVkHfG%l?7`Q(Qirad)EB7)yE3>;Xuzsnv7Fyp`>W8-!d@E_ewY`^d;E(tmyC$>K3j0xf_=EQqNYiYAy8O6T1_&oj#;UFt*{Gm*2;ONUpLc&qb|zG>3%ScW1+) zo97*B#d&zj?GvxFiG>&$nL0TgVooRF(iZJSkjz{PU+gdF1QflDz-=cg1(L<;Zt#&+ezCxdB<6jO5YA}s0HDvY@6iC zwI(UGzeMmlPR)J4(A6}_Qk0j(rD-0qh=5coDEipU?GnY2c;?!nJ*gsyJ{GVC8v z0B(Ihopx6!Pl+x?&-=zRf_Aq1c?9d*MNZ$Ub!jZEI$W0`sk|HyxwC?KwkU&Re}Q&z>|E!tv8$B`_d2~@s8J& zS+=QM0y1_`q2`rbG-Wxrf@?dxr$Ue{M}cj%H72>MtSyPxw8~%V)#1Dl!!oMmoq__Xq#^BPmynTa_XK}Xsl_zIz*((7lsS@mOR94Q42 zl4$5$1JsDoh`hC<$DIxVU1P-f&TD2{emK0oxH2o1UJj;ub|1Z!kXZT;)`x&S`?-gKx! z5@K6i^X$x)bh7rkciYk}iO@%dwM_C8G{&d|6Bt>m>#%@fQ=z+7{$fVRSoyCIB9Khf zP6vguT8#0ukzeae1jT9!T@WLStAVk%c?$5RavzNuo{q^twGPTL7N{~D2C4vmiS7^{xOy~2czl)OB zIzc;mCtqKt-gYK!<*svTRVlCEg9==BY&)S`D_!4*h@u-`IH7V!PWrvJRvZ&K{M{fJ zf8DPhu)V`$=!Q!|19*&Sbux8#l2Fi%cR!_XkzyczQywosg|UU>{I$pO}baR6W)olN5uMyuIY)DXc zkN@${e0=Is#QB$G+idk`QZV4$Vx*rY4gPIl>i43`Fv%MD!{%qGc>xxl{@_vGbKb<% zJ{TNEwv5xR4kGK+<9gB;ew|E^ESPGQrUD{cRG#~G?(r&)p7|j7swFVsn-sb-!z9-hNbapQ^Lhup>Q&GfTe)DT3}+~{Do@{j+}aVybshMLVZ5ddXWXp5&_Di6T^oxBq}Zw= zF7Mz$gi~OVQL(#kcy*Pey|UC#>A5mvDWCUq8FRyVEF7Uhbh8Y!6`yiD*bWk9$Hu2j ztz8ud=TUSDw+bN&V;+`yIuuLed6L_^)vcRy`CeTaU#4pX$wm*rrAE#YrIYgreE z`wZ`%qU-l7#eH8cHfE|p%)20&b6|*=|a@^yZ8}N&-H~ z)GN}orzti>dJxPPO)z8ODt$jz#Du-1+xg-rek2~*d+eVr$2M7QiOL_D_VEZtTlQ(HBa0$=6nu*Rm@W%`wm$ zzgb6xp8($R{msZ7Y{2`6r@y}U;n}|LMZhm}Gri2?*}@ib`~HMG(x!YMx)Aw@akmDu zi66_~x*T#9w~GnPwz%VmilZdbn8v;pxPAbvb*OoKqBG(80#VY9E#NC~%hbr&a==yv zd=@vWyEO1xRXvtVX?GVNeURDT9;o4sZLsO;mn#)J)@A+TZLV(x!ydM~Q>^%PrSDfAu?jt4VunZk=J zff!q{a!HQGvYV6an!O>5lOL*PtL$%@-&d$7qYZ@%q(9kR%`2%Iy!t%m)SXcLj=D$D zSUt^T^K}lH1FZIp$xNcJQl?|S%k{Ets0`x5eEc)Lsn#>Q?ScqUA5|U0VW%3a^4k`% zeYw_4JKOg4M^iO7Qxkpr?Af&&oG-N)=w#dlZkpMzH{$JoorWT3sckG&q^h=wiZvZf zm-?Z?)3@{X`sgWWjuj>xm;N1&)6dpaOv$LD1)5Cjw8aP=Z6IT>_q4eQ)%nfXM~N7* zA97p01val9-TNWJ81RN;J>&Vvs_?(Ue6Oh_%5xE3cSRQH$p9fsF{N%DAF=m2?EV>j zW!R;@c|bWrSvi|bSaukuo4F?shc{OMvaGW1)#HROa<7%-8+rYem&yKyl0P(t=Z0<- zZ1%B^Kd15Sx|xG9jBen)mK7dHu3j3)_r#W41w{i7F$HbJm(Ipr*j9TmJ5MUERTA6v zfOqb9SEkI>wOjk-*CRnkSk*3{La8la9|v`i>gp4k=2k@qQPDxtoFG*-Omf@SY_f@dIzei)$gLiq~ zNi_Sms(87+p~A)7xNV3t40sU*wJ*$k&*PplF%dm$yqdzl(nj}}3FS<503h~-`!Bp2?<;ZM~+sS+DV)CP)izmC!Jlzv~y8bqP?8&>UuX&kyd;c*H zEYV$C8>KD=jmTOhx{>*$C>&mMcp%Upp0el*(f_BP3Tir|R9_K4?<&@@k-l*eGlga) z+rP?|-tzH( z@ojhfukM9cY5)CXz!N+CUo8${4F3ZdHWd0_eGva2`HHT#k*58$ee3_8+&$@uHsJk> z%un3ASG(}d8@RNNvU*``3E;ZpSyD3 z)YZrx?IVSp7g*SB z+?VFS+iV6iQ7WQ|nHiEmZ>eo@H$Jc{2n`tp7`AnA->&FIquiZ;ltPb0+fYV_=nl#4 z>1nFxWv98Q@6~9QQp9A^Z7^a$X06R*5vg*u?dgV!%_O!l`96?N)?}=qs)4CcOwu^;C2c;^CHlxtpTfdSBlIE^9F1^@D>x|Q^W*B7OTF^=sD2*b&u)XIf&cz(5&z?2vtizepzWaz= z!enbUy7GeAOHUzxVqIz1YO8`bEv8q7syK|sdHSef;I-{uajGb5eVMUc7oni6QAv&) zij>Z=EqH#a1&6C8BN=Kh?Dpv0%mwETK`?)p+(m=>cU5V{Ph&MHJxy$gP z*g&Rpv8OluZB-3V=3Ik=U>-rz6QrzL|AOiqFQ+~9Y@M`ebuTgncWK%a!hP}I5g(U_ zNj#m?LroUV@zC93|GCP>L6~|DpRjE+%1(3I5HIQiHfw*KydRgV^^|_wrXU2-AEgqO?=*@Q;nx zeYyM839mJLK|ftdeAf2%{fKgFcm~3|_Mr zr=0i3+|_&p+T=2)EV ze&bR>Laue1*FxS)+Np+O;^HC~Ll3D1kJC$2eGgPg#TqSs-^Eup7^B?w&(3Kz36g~B z(}&)!9&F#%nF^LpC#`E(zy(q0x%Vo+7&ebCPx~q$;^qNzZ`$6EWvxLw-L&8j!{+LoMe~d_2P$JEBDq#HJ$9_XL)j^e}`%FElkI|b0K$&;^M>;r~_e)mL zZ`H|w$*K(`7V#M)+|)E&)d1(OZPw^n%I+4-n&{acl=Zc($Xx7!VJ+YC2~v1Hdbi-& zYy0f<@jzMeH3gYxuQ-pn+W;UGn(iIA^msld1_yb>3FZoa5wdG$t|G z_%e-ozPeOUzeppnym{~ADzYFwJ47@ql;6dmM=IZ2{PyTJ@jUR4R8H2lRD{#8o(kdy zbGTd1Q8XnMQ$G;iok8sHb|o07#VVxR-K!luspcMYl`dO8?hZK5Z?u&P2`QnveJSr& zEh&DznEpGYAZv(&TNMTcx!~N9^(W)or>j2U+=~{)Wt|!P`*H4bW2uj@j)?F=bOI4m zkEVxi(LoT~P*4}E{x+Mghpv}6^V&aODUu_pBh+GkOW~)d9R=p(!o@n?>5NSEFPaLL zQX{bE-DTTXG7ES>r{?rU*i_oVg7flyg znW^&W>5s??tcczdtm&|Vo&S@pw%`E^PgjmhP2&yDGN$oS?^y7EQ|hr z;uaDzludRi%9z=WlC$bWNJ}-vtTEH0v=uGx2Ks{-cz!6vE4HQCSK&1lj+tX4x zSy{XK&AekDzn14GfbRaRRRrS?u@Ca1=es#@TUTYh4Xlvd6n&5xMK05R$IG~@wWKlt z6fFfNd(sp5^?ZGncAlfj8cQkzAMwgvtL=8rwG~nY8-;LPUTJNPq!L6sq@Wd3ybVfH zUNMJP{=Qb9R5m%RW7%zg%2-a7U$x92@nxqCbaM|TH)Bi$HQqObC!xC!8F5h78Rp#7I1=0$jM zwysTM#d@h!zgzIevlXg{60Wnj&T6PW4LEgOEpbp3?bV{SMAr0n=>`nc;5pe1N+(*G z%+4f77s6>hajByU(=QqQ+kRg*zDUUihA|V>O)l)CPkp;SC%%c-l}y_Z%Y6a5qS{MQ zPAZ+nRAX5ZP^Lp;omM}dPid?{<*`);C`#QXC?h73>zv)(+=c0$3mz}s@& z`llLhr}-?wf1A7AsMuW*;Pd^yW_;-#hOl!JRZGa&9jl|rzN-k#7|xoMX4LlethYf} zSXg_r)um^m#@B5)2bo3{Tp0I{OXDz+^S9Q&Ztf#Te5A!=Pt=_S+^>=(R!UNKGI2S1 zXD`mvgd_7OGa4?2B<7E_kT*-q9wVxh7T}l;N58F&jRH8_%GS1TV8Fdj7a+19L$LrH zO3VfqAuxyUdJSh2&9~Jfo4ws+C*MCCE^C`t1}!1X(d?8BX-8~s+gLF0F4gKPMQZX! zHWj*g2hWit<^efS1gw5fI$E1vyq%&nN_U8F(ejwQ+he>c!@}F z_9+ocq*2?W&T!jw#)rfVa`=jkK5Ur`V`Y{%g=-2^<&O11zpNKK?NgA(%bR(wolhm2 zKhcz}m-Spj|IT*_KwF+P@NJUMEXkdG2zxD^{16DMfyNfJ-!+6kiF?-cx!9x^XJdC=0Li{7vym^Wlj?b4EdN?bwW9IQc^{lUmUH@ z-|V?#)b`ty(vgOmpA19TP%~}jA|K?F^%}P#yUhU6!4HlNv9)!7V-k2h(Hg77F*4Tu zF)kbewO;uH6FaIA^e&{`MONXD)vl@9^9()_y8dt!!@+pD)6kT2eKEe$FtnZezQUom zx%o3N7Zh$12Cnw>7hy$C&pUf?cmS5aMY}Px%MFD9t^wV9Vd9ujYErjz$ zjgM;dUxYIG>R+t6m&{!DOSf&KANQ=&slPkH9aDaix3N-i<@pqSigWhRmD_cS9Eee9 z2RfLeb6%<*PssP}|Bg8l6t%!d@$NM@Yd)q!odjmVzjd&Kez-!-3(j_v(s9@sy?KJO zQ?#vH&D8>P;O78-epy`we-4^8+1+F`K_`nq&BT1wEdC{0utE3^k4v%9R#j^zuOR)D zJp0k@wnuu<58s)xEbOR3

i+%g|R%`JSHibSR6APY?JEkm#m;Jm_Vh>t2m#D z-7(2$>k*>&h~J(j)~YwT!r1tz3H+{=|93WEGB{o_6FQC*IfU)b{qq6=i)$<*6a91<>!gl?BM>uYHxlGp_O0w&h@ z9QW~B-v#vmWSUz=rTSGCLx8?GMa+3_!;6N=8kgry+<0{0+IaDv*y`?LZ_1~-!;9L)(X-?s@O4-^SKVRelBs_$_~XV3)iUam&9am9OO} zdBe9MqDQj+OdX+E90t?$}Iuao@aBMZjj)9sHYL}kv-3{XGDhV( zOZ*Y-2gg(JW@1va8N6m>bE5vvc3%osiX4?5`V%Ow&oG*iQx1rfEh272&3wu|$98F| z_4m;tTKkc{&le(Rz{dTJDG#wgkFWFQ+&@OFX6j}KxwzR6i5eQ{80!TFaR_#jc(I!q zWb{Ez9Ef?l5*oIma*8Ls^wFMa`@iaE?3zR@mEg~ekD_rFu06Jk5#qE0lYEX#Z2-kA zFrb3yp9kVO-@nUm%b&JV-ws;5?oYxr*J*K?^$zlkgTr4}V&BmN{&MHI$ud&m3SN1Bs;t-GW)F_#U$y>3R9P^qiP}9+|NHb`ER~U37Qn+dn#GhQa?9j zz8)HFg^z6W=9Qz)QJhFQw=uJ6Z~Nz^LB`<*zB2=s3HKtB3n@sSuVF+{`*(Qk`xS-{-3V5(wA zj3~L1^UixaD=6Gu&I2UScYXH0&dO3akH`;Y-h?HNlZ|bt*qF6Xq|2MkK*p$izMa#H z?o#Pg1`R_K4BtRaBu%_nSsZN?Sg1KzOKK8mPN_46#O`3%CjECe=f4dskkWb`G8M4- zL)Z(+2p&dVZ)DkH4`#nyso0bR@eljF+rFR8U~HxsF;xNgwUj51pSSf`cqFnMo2h4M zFf(vlEJ0h;$cV0}H5ZunWdh4NujwBwv)>*Zjg8SOZfA7PI|WK@A5vZ}GKCz(Lp=Pot&T$Z z+Kl82wg%f6@U=CXR^qp1c~-QBy_^1Q{GLhdx~=@<@HReteEu)v6sMYS?GP^Ul{W@Q zDzgEzV*@MnBG;R_1EUP7OB|o>>*y+BNwBnkJydPGnx4`BH%e$EKe{F||fd0LzVw=Q<&OZBHe7uKP&oi|@7CYGoAi?SwC~Vxz9wYg84% zl0px5+BM(h6}|33rL!9FeYstG(;Ntptw%{wc>u=(h&?{4zzP_sgYkL+J|gJ#GIcsI z8suvJ&iAtO#GX?y`Ly#TgE0VrerK;$qM%X)R0W2Pf*S{$eflB-ij8!P)FXHRsCAwA z6^8>0K?c@+xOAFIsOe8FiMxr|mos+nRntYg<*gMelEP^*S-Icq*^kKqJSE$s6>@Q$ zlate6S~b}R(8|oE&X*0HLBCwv$9k|_J3gVM$gjb9V{X=xf%X~!t2NTca1rQsO@{QI zZ646?le%kZJw^?oVmO!7ISBu&rt4zj^#DM72fa%nfJhR>FVhPvrTbRe>~9eb{S32A zPZFK4M5FVG=HAu%E!N(g%~)Gorz+;7?B>fpv{Jgyf;`}Lbsnc%WAS=!TDG>k0AuQ~ zXkH;u=2Z>MC_jQ@>LGk;2lnr6?BpP!@Hnk6X2Iq&5TM92*=>e^!`})t5joZXPSh0G z3Gh*2TVG$^cC-TQ(maWq>cf9L2SJ+%+sq{TncXLWi$coQLQ z^eADjrKRf!okY1P`XoiV+M{gh6lE4gzEgDT5wKt0(32KFJ5~+BH8TzRCCEC*@EKeO zyC{@&Z425uO)n@#9k<}c&l|pa;Q!Y4Ee~oLXJug@AqBWfiFvcHp(APYcZ)C`k*JRG zH%>sW<5j;qveIU%0&wLwI+fCdreqH1tuHmh>IL24p@j%0sPr89Xryf%8ivrseU*hl@tH30A5k9%`w!j*0B2}@kBrB z$KORerx$H1LdxlkBdj=%4O`^IoomduwuB-t?WKp!x=rN-bpIrg?zNQZT1*AVH-n{e zim${YgKon@7wmb|u50r*W+HV;WtSa<0|m4tsFF&OZ7HU!QRD=zVq-YRCZI%bvBR}= zQffVQpo~k1>!P#v`bwfg9c3@$JT3_@I;U2eYObIDjAiW_Cp_~!-iHp|C8f8GSg~W> zOAn&5DY`q$CQrH#o>|#iFFL|f8684ZYpkS43waz|I1S8sG56rttL<)z&`k`-J!w6K z-l3t>qI*DrQNzFoB5ntaa5C+INr-Y&{AdzM*JSa`Zgk~|pu(b>zu%45^;QAF*S0%5 zZWsF`J(d`E7LVz_09}JYgOJ5}6X)Pu_^YY8QQQBBLiVbV3ArEQb4O7$+pIasT2R$R zB$jxE3oqYc$5Y$l;}EtjXwJTpuyB;)Y77@Ay%|X#Kc|Fv&N|^d5vX-BLQI%nixiB{ z6}Fa=BKJ-L{@v**zd#aFCCmqDGwf{#$eR=#=q z-p&UXR}*&e$-AQ0-nuHCRiu>xx6ucgu4535;9olSO@ucK$@WNouQQtlly4VZy!R@z z0Vs+g-Fw&$F_0#F1z4W2xub<2{!#uptU$=1bOa~Li?=0tVm10X10m%5ybizxIh&Kx zJnHIq4621q(n9z^&W77tOa_%BH7}*Mfg%G2!}VUzQo-}X|D2=g_sZ}$+0I>=xy7qp zmEp`lQvv1OMCx~k?0rS2kz6JN=i#MgzXx}>*{?BRFabXUxNAhbQ9n7&03Mv4&s3+i(Areo(s z7(0#M6j3yn*UjR_Q{G8=n9B7;Ny9nJ&rQKestqVy`)R@Elfc!dFZ)}5)o#IyN}6vk zi4D9R=NdgU3@EL}Vd?43fcq64jhEb)Cw#QZ4y^;m{Khw5oBI0tn#=>lfp$|BtC!oQ z)Vei8bu;lc4y3`U8m|Bhg~PeP5Y)%wKq0UQQU-B)=LVCh)h4q1#jT3T8B;`TaH zYUj)*DsjBq3IKnr^E6a<)b{BD{~PcH^n9q`zoll$9!)dyeXJyEpNya6y*=0=FE>LL zxV8Afl!Agd!Z31eqHDb-=ZTZ723CFz1)|3f=KhV^OPiBEi86Mdab|nEo9cK&n^YsLRWm z43ZL_?x;7f_AXx1U*W=WZYoEvDp|pG?V`G-)cWvpM3GL8Xe-}&=+%S>gGAiGT(Ria z<>)gEr6-{3K+bA_`L(U)6x>opV5 zrblbThbg@Ezze|v&b{xfiN_~N|!BEI7aZ5v)dB9_?Oa5%hpY^fJQ&`x2{@j`oqNe&|C zFV{ZKV(m!W-FDpy})d4{JL7N|Q z6`s`M(yzXC+_6-dgGqTMG;}zY=fz2$amg zfr8WG6%`5$Y3>5%iUwQ^dul#E+~#Y{g+=Xz2nc{v;o@H9&om0^aiUPNO+7Atlrmro zSR3U&)kqz@tEI+~wacv#)?M&a1ht5nf;rASBYAh>HkUU)1`LW!N%KdAz3gj5 z6Tp+_t^4RkfxEn1e-Y4gu$GqA>FKHHMVAtgmq8wUWsm*6OibD)D1n6gpNyfYnVGt} z`W!HpcrzXR8c(PcUM)H~m=$3GK${5OW)t~-sRi<1IFw9yHlv#6AysOwD+0Ew9R>I@ zW#w~p9F?6{161`n8Hm{(-K<(#N4V4-|47lyKlVh&Mt_n|_i{L~rX&LmbPPv7hbQ{g zX#9;Tr514cwJ++ukr5p;_c>$g3bT`5Ze&G}XF`=iFotZePMw-&Y{YzLF|t8?I9$)R4Ox#8(67 zhuTBeE?6csnioCV*F7iKIeW`}k(2Mg#dtM2I$gf#tWIZ&u5K3nh^~$jT80d?qP>iG zlkDB&=Z_vg4y5K4J`c`plzih1%y`CRyj)#fMK6aUeE|g$9~(Bkl`I92x^p7xb;Ijj1tx7x#3y$%10iPki zHo&0|ja?P!lYM@ak(n{65*3$yGr6Y%qcy|DD$=QT1K|CsJne)sZ{>60+DT_m|CG7! zy;7t0xVu41p`SGuAy5rJ*y%gR&3C3^R)3v6Vu`Fd6}3&MT$tvcNRW4?Vk~X{FBYJ( zVy(CCj4braHlRe8U4L$_Y?ye#Jb{Yc3hF)6Fix% zC!C+8`j=y_W;6+4O^b_jg#M^-Wl?uI_|*z1cD-X$4vWFSL`r<#3vc|cImeI{l(6@s$1q0 z{!^#ERMz8L2E*#Rw9h6`7B=RpQ>n}WVPQ#8n{~HkYN8}B6!U5#fhB-OdufuhYS$*nG zUk(q)qj`T9NiWbfII`(Hr?ZAlw#Je$h7J)m^t~3{4rQ}*OX_LTioCvF$NlQ`;Bk%Z z#Rs1oC7r)7rDR@MkFoped;9#)hzF&*YdBiysQCs*7_NvdZxwd<_YJ5v4+)r9pBSru}b9Su{km}ZUr@T92k#U z^|E`SVV2{Bal5+TwDNuWF$GLC!O+0Z&9Q-j$pb)+%UVTc=mN?3?01U^Mx9D_*Y@%R zZ-X;0yOds{v8h=L2}-hYv3BrmD6Y=EjX z!-D9)8$Go=>jBDQ2@6pzbQ;?y$z-s(2-y9O+2)DVh$x%*w6sbNz2f&<+mmCksMI1+ z=>2=`;u$Qu0#;;JFk7y<}^B6<&eKd(bilo3%-s+qTDA(l{9pvCgwk}w{ zzJ(A2Cx`ihzqp5jNg4oj@|XWZs@8Jx`q0||_{@Jnhx-nIL!)dcU9AFi6)uH%07y|* zZi$HU;-3slzq+VW<-Cg<9FC`6?Bo+*usij?OWEi7M;f~2*OF5P6En16J@XyrNQOO< z8)=P^hI$>@wVZ0+RG^zg-N@7YnoMqp3Tzc%6_`ahUTHgYy04V-MUQ?;As**gmcyDi? zYh)HVEN5^GK%Wo*Bl_}_c}{GSIdbz%wCe@`RA`69F%Uu{RE^6RO_92Ah1D2Md)~<1 zs^`a{5C(xu$sm|S@9vH+2(^4IG6h8(!&15|Mh1IG6EF3PPH7>~IW@|vH z*=I-trpIGseW_=T8@e)p`-ohRLBk$aP44ygS@VR2v}=@)3mPyVkwiB)9>;VzL%jy7QX;WW|9M=0mI^Ul@|l(n zD^X4__ye+v{Tz0BFgNTLlx_j>Y30ow;?&K`55TOij;4y%c^<9o$E}x2(Nv`&(s&c_m^Ui z5vv?S-H-VaNey0}5&@~d!^pp*Fy>hmv!!R5$oBv^`6MA+(S8aqK9+YhC#?xojHzsy z7utn~a6HQ!PQn6OG_S{pU+@$@d5vzOCHCnPqB~pkn^B^3_nc32j^=j^kY-#@;B9wa zZ8+`to+->Q3UB!-i{oc%{AxR8y>50!HgLwwt*j^b% zA52PZ@7G3XrWLNsN^q@hh~Q%3?W5)XC7>IsKS9BN?o`nLXkzkv`&7}JV_;ecQLs4y z6~9oOnM3EZC8Th9{BuP=bh=lL_@={@Jyoa8&STLrbd&J@?cv$Wc$_tf zKQ{s-r2+Ub(Hq;F7PAYUd)l4Ga+OQz$A~(Kw)GjoMn9sd@uV@J4+`i!?@b6V=1}D| z(t>MOt&>%)Unc|jj3~2wEtS~Q_oRX~+11lap5216MLPn=qR`l{(5u4_O)a%zdxAwF z7!W6OByoul26##)#u3dAY2d^IDnC`L+e}#jN2b;a)21P;R`un&<>~GqvBXU#>16c=?cY`#7dw zA>H$)O{qKaP8f{nSE%_t%={k7Q;cZ0)!S~uA4-Bin~xipd`^xp=1OlJfI)eV7m{1z z9}F=qnIfI)Vx4mAowRq=Ku+(AyML`GYsI3U>!nM=NsU09W?Rfi3C;69%k5)|!` zfuj0Bd{(mb4cc7O>;H7ga~J}`wpPh$Z*+^S6ch0_p{jlVYPCjK07Co$A68n&S5|^> zFep`|l$_`q+wLz=!4)TjiW53-AYonjB5Y1e?CSy7c)y>aB?!aO^qg=R)lR46!Mk%L zXg5GTnj?T1-hY zehZ3q4_Z;`QEHMaV9CxeI~?elFj+H~jI(H4Ap-0NCA+u&e^66rzf7Edf3t(%Z*W;P z=}0M&NB(+m8LkP?o`K;`S$vem8T_R3{ZO;1uIFMeBn9ZgvMYKZAkG3|1+)ScQAg#=6lKRs9nZWD>seI%0)0A1c10o1wFYW3|$;koxf| z<$4$vs86k`vAc6TeCD$9Xk*OC0H&A`w<*F!Q2l+39 zu1*^9EAzrX^QHY^Q28U9-pTwMTWScV3Nerx46u)oc zbhT+~$)ITXltctI5qp!f;!mrZm-)JFw&lIli5WjIG$dC#Dx^=W$ar4LdhGlY-j70> zIkL#Htdr1@x+i!USlkqOrZeJ8Zd2%8^}{(2ktSn!dgiAgJOS1iE#iX_e`3haDDQAKyvqCxN-jE zW~JG4Vorpvany5y@-bdS?*&Ht5 zAPm+#S^P+2<1~MGmd~dXa2MSh9h_bASwI(eJ1D3(%H5Uv)_-Zzkb#4R(~0xGLBa}A;}F51_^JD}_)y@%)eckcsNdVy1%2U3chC;s@k6zICCb4ca$ z3Fp^8S5pl9%3hTLvHR7oCMGsUx$5`7|IPY*IraE!Cz3A%{*~RLqX0I^ zZdb1W{m5<~j03C1#PV#s~zP@Y{*BvbLeNJ*z`C`W3D1<$|6bHSa7N2jYGsyLdrN!QAtrHLU0M}u>|7`$S z9aw&)sD&@a)@Je6nkUV>+q$)y_2!Cxow-}>TSN;ZzO@8yo?yyEFvNp35Hq@ zwE_pM))E>+W_h`}jlc6I z*=KsQq7Im^9P`#{B8Nj5H`N?OS|At2x_T~(hYVJQP!-Ot5yC>?FV}a3XBr*59FM80 zr<`>euDj7^Ye^BzD70&E!m(&8Tzt>#szL_Ck2sy`XSS1b=~N!pE`EO{_kDT9uTSJ{ z)%LPqujd}zDkDF@!mGP@3t_E+KJy54@PQk?y1866zb-!{x_A%1_B^_T?)h*V@AldqnV&wVr`?%gL}6Ac7_~z8(*d)2q3T--B!EI#;8q`G?$agd5Ij0^ zpR_|-I#fNuKTI>7hScpT=-K1?)RVz&8^HGADwr{R=<+!3aWnKve&o`s_Krowcx|C; zpJ)?YtV~a6?DJnEHz<3_>gVbzGM$e`XlcW&dMI)~!4H*LrNbb+^nK@MsTj}-)D|D% zTPCuxOS_4Er$Lom)|puAvW-SMSQT8(=g}m0m=oDKdr=K5Exc;rx10X5v+NC5rOgE| zwfv7ei9EbKSS!bScdrT?|eB7&5T}YaRDsy$r5`&omL7rm}9J{ zhFNiDZe!TLPjv4xsNo3g_qH`kcYIS>y^X?r+Q!DD<>TBwriop8NdgcUHkkpRw0MDN zFvyeU{tgE0j{-$d2q`5VL(alAi#?Eix1RQCgqK&BtMgit9#?ik^#LxC|8;1-u3uuG zt8^`UNbmvPG^)?ad)g1p7}5N-ZZWWhU&u5VQos7rwf``u89{FZx+3UL)9$KgU794U zuvX3bNOIsCA!Qj{y#nj5ux4#D%5m(Z!)cHtrO|_^iOWSTbQW3smnUa?s38@3p^t5*i(UGlB*;V|*>aRDU(;Eh z;N&WCIPEHFYK&F7;I>-_v%!A~fi*cFabId(56%#6oJZz8DL^~8I)&a4epYI!=D;;m z!&)PD@}g~3=hokUVvMU8`U}NdD9ZA<3u^jmRZ%jyG<;m9X%S^N3@HTfrP93khv}yu zagSUyR@(TIC1~H(bPxrJk2F}~=04f1U<_E|+9@#)yM_}8-@9OV7fER4HPI9-t3}w=a5%l4<)=d(HPFspRXWttT|Knj%}53D~#MO?4~&85vn%KcS{i%S)$t&p1<(jIzkF z7Qv=U7an^J`*G2wE#Mrb6HmI|4eXt4 z`L)G&DcCM--yAOZ9zpI2qfr*4l}^Y!geHXUC@>1q?<%quZiT_keY8KCL>$^pxTig; z{Wu2SbGv`pvRQ9^ZDSJf%jcuC$%#io1<^{*I>bga>*>rkwcL60*#07i^x{!O?+`}n zJQ=KcATJC|q=;8>)du5okP$f2neKC{Pr+N$E5FF$Px~h{DvzF?2BDy*UMRkn#`lMk zhzQblD_$jZp=);+e2HyQzpN@bD}u|qcB!q1CY#%f4m|ZlDNB>?sJ)%h%k}SJA+jcC>0#fu_?d6d$_#JlXjj+C z2$aqSg7kEAGb99hg(0^(R<&;v!dJLJ8|q$vhe2aUXta^AZ7hE%! z=awG`>W~jD5wW*@d7@x#D#Aa9{btjt^HF&*u__gwRpLE4L*%bxB2+WhQGsfVC zjEcMp`_5rgH92hh{!{ID28_GFyowB3p)`)_qz!4{wWcV7n9D0`oV#paQkPi|!d!sPC-YjT&y3v=B8yj|ml7x!oVSesyN zZ%wy-w+z#hKS&kh_9`ou+)Fu0d`xXmbM;ABr?|vNnyo%SV46lBharoDse0QJ%I}b_ zcTu3759zsLVT=?>TOW$6UM|sho`3#Ju>|B+z??P|zy!6=bYXG=;&7PiSfk5qTlP*3 zWQGT@4KzZ^Q|XW($S=qq4gdtOx3(PX|q_>TKi9r96Dnu z;)ZVOf>C}bVIlXkT$rnw2zp$BY(SV5B_#gtYA}VlP8v0?UU^BT#w8ZLtCXIur}~np z^W+^hC!J0lQZ}0`k;&SE54c6h08jX&k4=cTV)15WEmyLUjmyIdRahB3$Db5L6 z1uCO*3uBBh3d0&Zsr4;Rm&9#_QNKPZGt3Q~&Bwcrd^NZG9L(lMo?C7DL?T(X$)%H@Qh~pc@uMS z-IjfM>kx&ui5txTE7!Sq%+cEo(zj}_?0`-@`u9IU|5XdX{^oy@p#JBm?*H+X8nSll zu^#Rl+2rD@kBZgn!FFgyV_Q^$Mq_Zlge?c(orX2Ee870JR?XsC)uFB;BSDv8R*0SnZF{wmJ2YhHu3^i^T|X^!v+M-(>oH%w1-+mpUn9At zfXdkvQ8k2s#G+Kt?mzizi~V3Gnd8I@^9ss@_Fk0`ht)(1-z4rh#KzXbrS!`!snp9# zH`Z4gTwTOfV&Ik10Ul^2Z#f) zF+;lNjGNst85BQI11$JQ%1xjLZZ}!+VD2}92xhik9ov}tNBA(;z?D~x!N_0PU>-zG zXjFd)Fc{fStsVfFU*sq4YUNCUdxh!^6wj})fw1HJ;kHDMGB4DK682+Y1mTAPxrm?E*2~31>M@gAme&q2;YB5arJvE$}Y{Naf=|<9_Av zKG{|O8&_z`Qg%vV_jRuLmAL9-W0L~_Mbb=}%NB7vUm`iNrM$c;(9GY&;`u`#AU_)a zX6JqS&M*X67b7#%c2L{z?DjXy5j%UQqCdX#8#PKz1IQQKx|aTz>H&c1Dwo+Jkf{Ag zbnp-g?_E^7vwPe1;+`KB<9k*ccQj!jpog2gkM>0FBq}t+EVHa8tLAdZRD3e+a&vvI ze%c^RNMX{V`EX z5Em%iUsHPlUl|2xv<>c8Csjr>COs>*Zub8sdLv$A;uB<*3M|IKH=oB0^86!d>Wd`H z4)0m3v#`WOV&wC$RMYu@IcsR=6j|YvfOzw{G`FB17|rQn4MnrUtugtKS;D*A4G zijHiHWQz)%q<_c2>}a=4wH@UXBA3*zv8uaSqKQo_O?0zb7c=lWOB2(mpv{{U$`&91dzit zciFF)HGKAR!cbdAyeUo3aW0OR_HJhZXE$`7^+3DI`4if7 zW5Lk+F~C8zwE}0HjM|K%J+^V?lQL7|Zky#ODtEstZf44UimD_m6zwNs~;(gJdK0ePzbxcu2#2*I9F&&U=IyrtE2xvMB z7cJg#c7w>dfY2DQIfk->axQ>MVwJBx)14~YdoCX#^zQR-7oPRbv(n;wN`@YVRn8I~_jI0ZhK& zWNdY<6aA4UoJCb2bD^*MCWgfH^_@i4#RfKBB24 zeCYFs`gsOWKIbSSoQh`Ap;|5xZ(i;H&^HXxWDd^Z(AxMC>@Y1_P%d-2(sDA0aYk`E zVME3&;-_T!-}tF@G;Ce&Z0n6=dR+@t_b(8n|Z1wo|rWEj|P393x6CQGaX3eR25cbjz2gis@K_GFWIY(j;I62 zsJr&bZl54oRo8qK&9o4l_WI;xQ`c&`9S3{g&D*bB+%K+P-qNgSoPGCEk~$@$1K_9C zfTIx=oTupoDkT7n?bEj%MA=G}4 z>^#2>_(;wEb8eXfd8HegLdKU`HG4!-Witt9V|pcr?>+)h0Z*w_L~=^Z{GOATm*Wpy zP+g-verc47LqqPvr>Df<#5N7-4{O2yLdvEaBH5XiGCWpg3+SKYzsZ$gc7enzylga*GEb?3N@qr?=!ONLs&iU~X3lP5JptL&XS;@W%^ zfzA#K(bwKR_p!h+fI|DHrc>b$&hucU8?cZ&xLPjW)u$=S!J^R3ZvG*SJ-o$kyd>v& zU=QM-0P&z{ns#&-zSLu?iMJu%@k7*qp1U2#YOPzXEFeX44Q)}>OiZ=j4E&iKxiCNx zcHg}aN60bL##fK7J=;=@tCxx!9bDO6`W5vwD-bkx!$QKO4f#We1Ew)w(~0mVl&MVb zaX}|irL#))yG#BxyIepjaATI?Dmf(7NB#_F-L7g^keY2&?@+09>5wVS$-ac3P>{@&$N;xm2a1PhjI z>*9ptc(L$C{$>@U0yhL!vk7=F0|`f>qOt-x`tY$WC19k&(FllhSRptynyGn#j#25 z%6kKoQP#e>Nw3g!5q`I{#S>J1%jS~|Hw=9UK^}golRffW=fol#NKK)%fi;YR4#*rJ zyG>rbZ39nYvtyLwd{!@z+#OBh9-g7C3(_n8!p#aElNMrHBi1#ZnNWk+X*xjc?p!hf zLel0vTG^S4G6Q=GCp>#q|9j%H%PsRD5F`N60`hi%`JzyP&+tx76%dsGhp{*Z;r|I3 zqyFLrUO>mW8=C>V!v%J^3&4Jh1^^oC!B#i_*JeZqEHWP?y39 zE;rI~w+eeE=Q7{ddlSLAlorhn)%s}tJfE8J@LT|pxKk5 zT{7ptajfRq45uCFToYrxHieU}=VqW-VR$1p*s^F{n>v|F_q$8kySYm1! zkQ(CwqP5M8*Sya?Vx7%z%&J1m8|SvV%)iXL6i-1e-JvuT?%r{=@2KiNDg98t*~(n` zqiz=j$RbOUO?$0i+-~fit@#^>lm~s~N@0#lO_C{(6pPENA+&nzBc;v@eV5o88F{)M z>0x2};ZFzoCg4rQ;DQyF8S8IStjEUi(>29fyop%DvS9OkHO=nVLMtwPH$JWk1@U6; z8)F;hEpCT8k*o8D%-Q#>FK*6$txHJaV2m>Nrp6$fLpI6By3Y zJiCY(X%VHfd~h~7vEJK7t`?QJTA8a&o+(FG9;D_>^_dyiBIv~#B1s*fbDBywoC{nY zyV~E*FRiPTE-TN3mdCJfRgI9 z=@V>|%p2_OKDpw1_+&og4n^g?Ve!~XT~j0gJ$=>ik1~T_7OiTFB;GMo*25DrlzlZO zKS7dQliqkdyt6T1%FS8pQFfQ>jhv+GIm#VfA3r~z@%8(FKo5YT$6~+>m##qG-P6(b z!QSYIGZ^WPC{}Z926E9?6u;!xlPoT$Epnbs*dAQTn-q1Kc6mf)3me`&U)<}@L4~8f zEQnH-&CbD|4YmwWLOC5S1OgM|3Xpno3N7=19sY=S919ra{rZ-~TyzVb-?l5U&;`@GzM1HkjWMK!7=*2hC!&UTNMrRL@R zFilxs8-I}gjK3CD8sw>~JCQLPn};S@XqP?pqkbL-!qH_A?VSI+)pb?A#6vT>&EUgA zfNEK^d99T6>(LzcN}F1x$08lsiowKdPNuy7m6>UKw{#Chby5$!`McEo4fRoV;bfn5dSP_8eCzd^D$iCL>|MN zY+~8gSfr7UZbveyQ+?qKZr4jSl_lZc@eeei z6UWsuFMv%enwtJf$*$-2Q@1 zDYYf{4q4u-G}%{liEa3)g|8DbO5$5rGFE)Qu;(d%0^ppAuGYjux^nb!s?+lVHju)O?fU%cHx801Ez&4S^iKS?>uCh}=QJ^=Ep7KkfR42X z2cl2@<2gCsAQ=6djWT9jDsJuDh7d;&D*0QS#VWOEBV%`m^cbKKP;e2+<^UyG{Gz~R z@kHr3L>#D?N`y;Sy4*Flc}EINKMWq_j&dsGu0o2n zdQ^0D=ZXpY@eB@Jok?ZaIsqGsDxLUIEpL|3&CTuSKFE`r7CU{$RZ#WKrTNd(><)hK zg=+Gg{b~(4c_J^;Z9Hz0!M!lP6F5Fxb^sCk9e+7DoU_yxuc}{#nk};5OJj2TZFMs?@m{ zQVP3_;)HeT>C>lyvk8u3?H<+r(mtaeOx4+9Ygp}0&OqK`4R;Yb-?!sDpMT=I*vX4B zNBeJl%xzU+1YV$e&KnMV@5P+b_3NI@!pEhP-+(eh&(eUct{vH-dvDn!wcV+U*v&S! z|7bTM{ z&%mn^66tm(@*B}fHBdW2plWdm1(`Sh?M3PNV^m`ucJJOj;OpLxkQ$(ir(X0nZ}$bh zV%HD8=r_50w>QOnD1<}8_3nv*szCGoTyEeG?M|*rdEad z+yAev(EQK!=l{2_)V^5RteALbypA@!=L3xCzy&}l8Hi`2KjSObRvPS5O5jAa_12oB z030ap`;-s>w%<_C3VB@)eo3*JUvK>k6kfGD=DJ_mg#(2?=dIMQGqx&l@qu+AkEc89vLP zI@05_?0z}%B3~JX1cJY<1dv~@s{p~DZvpW9w&{3Xp>mqhT+mPD=(Cx$bW8KkI>&q2@@gAsHfRDB1N(3`#>+>Fu-?#U zf}qwdCpD@#dOrpYrZEm!&0FEOnuFP#NaaWpacB-Mx47Q0K5nkXRA9~S6dr&gazo7X zn^f-+S$9aV%C@3S!b}6Q9b&rl2LJDfcW8waxBqyB=pU{>!?2(X_5DF~)n=ZmlFMtwYO{!+GykTbq~{-3+9 zQ*YnjI_Sz+!8@9;>w7ZEe;|dRY4cDi`4x6uOVKJ&U^c@RbT!zi;Ja;4uXtQ{40OV5 z6A=xJA60S6QsCBl)`M%jg?<}@gV%#hSo1p%;lS3X7n_>u%`W^)SzbJh0;we&n$sS} zR|UH{ppyZYz}3wtIREA7g9wkHa{_C8`BGZT3AgLoy$Z7=X&&i?)MsZyZ|gaSMOC3w z^?kmg^EjsM_Qw>9THq3F*WwZ|l{?(09KAJ%@ChD1UKEx1H z#vpbv*K=_X!thy4VBlVgqtJ}-kw##<4$r&n;d$#yVSXjLhd}+E%IB6AR<|o5G%}ig zpq}KXY!vvHqB)-6^@vw|-+{Gu3p$JDkVUC}4_M1H8&14xC*Z~AH#FUFQR*AtwX&;~O=!7V#H%aDHJ8VpLvg+_W<^%@UdCr9e!C36F`?5@r9AY2 z;`y=sx#Q~!pb~DJ8TqVa;Na6jsCN-IX*oQ)3^X?zk8}V(*19&cd_a~hnhU2tBDJxI z>-R!6AE%UA`u})c`WhrjuzD7EAlhm#fY(RG ztvGH3U$%R!0^$4-z^j)Ah|l2lOT()H>5Nic{AVCP5n8dSFq34>QyOE}1k@cCtJ>e+ zPECK_u2}H{jMrOlI3<;wtgQG~<}FMuC)}{_`I{R@MmW4Bs~V=^%P>*|gd4%fb)HvK z`hIV6M%LiA7dWm7GY6?iab+3sNa|{{O)08pn=a{%Ht%WMPCx0Y#2m`(OPeu1{DShw zv?@RTb0)y$0FOo=bqd|*LZ}@SqpL$qT)*Fr>(9`W*+>8h#s}7N0Me4s^c4{AZr#T7 zp%}g^dsJuV{Dsgt-B_;PsOvQIE7iGgM}EHtCx-)z3gToTqK)5%5F5+N%!5G)-3K+y z43lA2DHZl9yiNPQDV>`8U*!T5wRGm|@A)#G*F!iloS;%%F zzW{6?czzmYxx0eaJT!&1t?ZpL0&*oX(tzs7KaIgkMFkwK^*7&f*O`4eg4;T=vi8bb zySh=0`?cg$x|SK6?~B*2P65iu^EruMMGeN2uhpERrz~hoq6_P1GGZAQo4pGFKa!ID z+gtMt`4pXlnW{e;izeHlqo<3n#J(3J5Oap8QDxJahRP(AJ&k%H{+;e!3|FNW31ry} z*|z9lHq|Y0v)(fj5MqET2-OgYj&xEsuZ&NC9739v32$ls)Q}p+O|y_W;(`vyMyMwV z+*o*n&)O!?dL>38_W9vn?iYT%>auC$GxWO!Kp_-asp0m>l*((i@sGjC{ z9d|gwqZlsTlvft!g^eH9te&?5c5(~k{zfL&ZQtjJ524{QZDnTw$SuN_{HiqlDkSGf zL~3=n`{kbHEAOUjuZY|;pZL5M*BQQA33IcyC4Rr*(erTz!W!O`x&f^o}4rA!YW#x;e&y61fYJ+mdpSA@0b)gQSc3Y1R^0WL@3hag$ z_HsE-)J*av+7;7NSGtXWL#L-RuO)57pUhoZC0OU|j0QDP;a$xT<3t{tEQa&yhkBElc|(xYpH5foJy3EwS$Wr>QufK? zrI<$_`pVuK>wuDz1+r?YH1b_viRS(k+q%mEQ3S8CMJju8RetU*P(YvqsMB^WPeH@N z2zf#su*tB%VXOF%PK(nxnrd~P+o;Ef8#n`7*B(BYJ$%s;v+$T*WqfVslw{8ZEgc6*VwOi# z-qv3oRSz&FA%|R*L85$@|#*^(R#RrY>k7p z6&)w+xrgqZT!%n?{d>FRA36Jfcj^<57VJXEP{?(cJNqig=EgQ=wox5o+eiJ-1GHwe zcUTCEM~6`tRsuq2;~xQTU5rh$PGzqWFyA-3l*iXAOW!lTRNt0d@(Ui5P8a*(W-Zrv zP9MlU+*SYq0;-ZANTYo7!?xGOW%AUymI}2Lflt*}vfIi5EdSI`wg#~M91-WsB^L=`P-C?H*h0Qn_Xr#? z1{{}*uX@8Q$MX7JosUXqbLxPV1;+LD?wjA()x|C>2RzxOk4*`xzpE43q9ku`)6}y| z$_kn7PmD(bL=nziE2hL~GD2S5c7H2|n;YAT{PAULKC*LgZ%_zQmS znZ)n5nfzIniO(|?mL{pc$6l-BZxqgsY)lf^)qLcAok#a<>Cm0H0FEN;7YUI$Ki=|< z$YDfYd9c1t*Q-dCi9J%!Tzp1!meZiG4M;{(&)6TAHCHt?bI~4-KC_7Gf83QY)0sp|9ru9fQ5`(#+$VrJaK5MetO%r z>%CBJpN~k-Q=Z}T;P`7kBzNC>XR7mdtm1u4ZU4Ej265if@it0Xi;DCPmnAk88F;&A zq9`iD{VY^TH0LuTPxW`DZvR8;&gId#>Td^tu3~Iwm#BHzOEn5p^`Jk)aEf|IZ*3?Rj*mX;C!=?2qtw!EOt;#a=g%bg36+*M1pcjo!!R9Z80EaGs=C9hVFE+fJTM2I z-}YKg6(vda0@P^yj$GBGsDNd~j~b;&+@Kr6K+bUTN-KAO5`Z^0fW+@SUe* zbRAQq9TjSm`>~Zs3IzAsOQUG@8}y;0ts3sCx+7ekKDrvM%q`&_AV$D0UXt9$Y_li>u2x>T7Z@h#5W&c@37z-xZr4?N(Q?`t&H?dz_i6L#Ie z)NiN9hl^_a7H^B6%+UpEU)J?o_lb0KyBL1zf=?J`;>+!G z+dLOnbA)d^X)%X=lB3Qq9sRTJJF7Am&_C5@pvHQ+HJ>dc8e$pTz9;K^*hGvCdJ2d3 zEUVju=a&`DXjZyPrlO>A=vtRBN7_VB>Pf{jBKalH{>DsL-}NbL3bVPA@6pw8=FI8K zH{WzeajCbbWa`OPC;dWO7k-c@AK1F5cAMmW*1M%fRHXGPem~o7@Kxz^q++p1t4L1J z(#^Uh%62@OU#Vj$g*tG?_yClU!nN|oKR*Zh@WbwuDVHndo(tGIXEE$Ab zz^_U8oU$QB!EcMjvAY6WJ;NSG>+w-H95d}|z4VJdFRY#d9Uy+JNQ3(GODdilLCcy7 zpjv}dCF_m(ZhH%)r3;@*90hSpDaxdi+}tQQ=b)19P**Iy;Kz>*M8IA!;$l5sss4Mg zXfXL}<9neo8BzrhFCMaKfNhV0o%K$H7;9@KJh7O^NEcb7-lrROh-1ke%&bO!Q^NXd zsVtYeGGA?-B`mjkGycV8l>m1ZF%8nlhvqV0@}&FmmL5UtFDeQ?TkW-}o+c~AjIM;n zVM^n}8CH4%ip;5U^N(%?!|hirTTfQe-=$!6cg?(Gv972ko)2GNcb?h(7+nQnX-VLv zYk9M|NPRs%>->m2rUlTWy~CuE8GN;GbhqBHRQZwh2!%9NgVt1_o54p;E;^lj6&X*; zodWmQO(5@ZNhe=Z$2Os>{8$?^%J%{unCu<4!k#wrH8?9?px{7X{2 z#M7v<+@6{>Eu!wZ+QkW+jnqk85D9BzmDPK1v9!%*j6Gu%Ao~Q`TpgV?@*BxHOLfmB zAn}E4V!L{Tf=m>>TE)NjXN# zG=mG^ozftd!eLV}hgL#cq2tJl7&Z07o!I%%>_eD@%Kf}%KX*UVrl+ilvZ8MuMi0%4 z)buJY^$r`fDK%MPA1UiJ6(>2g#Hjfswr%9(fCIk$E4eMltjB8N(L|b7cKPG$_lPTk#5@|GFy|6lxc*$B|C+GW;XNPv zP(V@hvO+HZq*GZztKaf|oUKy|SDF$ttlzH9q;_p0k=Evi3unDONFj!b?10XkX~olw z3LXgbZDH?G$}^uxmT@nTZM1y*KN0NS#Et)1PFb0Goqe#l63z%-rE>%AV#aU0p1VzZJ3Kf!ACr7?b=+`pbJgXSVoKrNZ#mMFslk%3kZv zzw+BP*4ui%q>Eb#yJhsHngJqM!P3JHEm_Eq#)I)bVCePi%FEq$w!1CHKgrp3e){~E z&11ZE!_3pK&IFr-bU^Z1AM~O-q?}aJpy3CQX(EhoUthTw-;*r6hhRmeZurYI`+e@L zS{U<7(4>)#j*NGiuFDt&H-`ngy`$=CF{ehc#lh0mXftQQLgRV)PXo^yyavv1SP|4A zEk<`AvJmmN5Y#sY-UMCR7X#`kvuwv3M+ne=}$ALGx@z{ofUzBIG4A=N@~C)Gu(;>=gd#Gy zWf58Vu)Ln{(s&}c$L0fSz!l}3?{7qzUoTzcfVF+E&42t9Z_=NIhV`bD=4aoTV9T=Fu=#~Zh; z!!J~bex&t5_lGsLT>+nHn6O)bx3%>P*4Txrh!880V4bn z!QToNA7bMbvLd-vE89~K@2nTq+T7Vfu}qIvBO*|tt)cy3p-8);F|?G%WQ`Vywme z>JQFF?hbp~i5VPw|Hu?5tFMAHOgv+lM2u^;=6Zin&OFUcy@LK=B&m`ESZTMYu?7CH zn+WOElwYV#U(AKPr5`~FJ%XJ9mG@N)NWb2JNi}VuB zdbS8Ltp&W%@4%)}FUs>vgVrN-1O81MQx)G%$n=>H(6FrgoJYA$TgaW}lg4FOjp9wL z60ePCIyLO3o&-6-9mdyti6x}po$FLn%7lsA%-lIopS{}mpA!Knrm}Q4DaTl>)rGbI zwt&(mpe{5wA*{mk-^tx$R>Fc|&Bi%(M&ki>ms)Wn0YV<&Nlz*8@Oa!?+Y7+0B%d3` zeUD#TceQ974G8nQjS>)~o~7V#g!~Z-gr9c_8Q}g8knLYz4*n}#ILu<4R=4>j7j@J% z1FnV7PE{(%v`o=kVS64Vu{JfN)*b#sZMaR>0?Pd9Y8*IX}wbS;IgIHcKx-r)-4DYG+(6i-?Ox4 zE4Z@mxTePTInxz`>7p@p@#GT*h>+5ac06QNv9J$%#z)3%Y{Z zJikj8w>{qPvp8C=c-G3#-8eC(Z)L<41e>jBl_Uw{{oLmB5{D=K+MEZgenrV<)xsBN zyqHc5CaIYnBx0A&DQAsD0r0FsjQ@eT^P{gJi~-ebr9&wzJJb9){8z z&n6)nVeczKvr&6a+-F?8Z|n1JSC*H73OtNnJ`pvwOD{{f15@XquCxyton!?5k4wjr}(HNJU0ji6 zB+R_Dt0dXsW4O8LeC5zYZe6P%W66${UOK&FM$fw=y&@1bGA6$I{gaHzYfJt6$L1NI zRr0)*{|vOUNkPP!Shf9iP7w;49&)qQXfCfTFWR%eF#K#N&FjLj&0gt_yZR8N#g)?j zHD3J@;WK>kL-N{;ua>z+L15<-2TGZ{kNIAR=6t--@KG^qDK1+!i$O!*aP12Nl8z_d z8UX&8e|7ha^x#&y=9zm-(q%_;2-l5$w-wA;Wf76n_0g+b!l!l5h_ZQ;a-4~HqPyWk zWf_-AV7X4K%we#Rw2R8y@@r}{S(XIj02?+PJ{``_27)EiV_-MOOjAr;ZLoKFF%mP; zhzMAcl}!nm3m<=b?~UBFQQX|OgSyBrWzreo%x!Q+ol6I2cIHsqjCrBgLg%Q^MY`If zMUaJ#wz;;;Y{ejO==O|}OkjbW$acD(wr}>Z9&m&Jd?+~Nsd;c#)N)kdnV<7YwtV5noQSqnQGm(4jdxDpCauNDGcqR0Kqj9)i*wDN#ZX1RWOAVF2j_6r}|T3Q`jYNbk~1AV`p2 zA_*iwAldJSv(Gu#b@txt=ef?cSN>7*mG^z>{XEb85_Wx&J%Q|3{X`exs!K>+#l`&X zkf=)m8o#aHL=I0g)z#zlt)3mT0Lix2`gLE|UL1(Vy5$ywg0VN%e^%xv79C1@;7G|h z^T^=PJr^<5*rd>+oPb?l{4Xd8b)JPteld5JZ8)8!FJKp*YDYaD*@Y-~_h>4_%~)Cn z&Xc-BUcUf}ml2m~Su=ADd)ohl_t1wdJIVMs)ip~i&4&a%`iHo1>Z=9C*Z$X$21Rg4 zMJeXCUyGOTo=}cNYVv3Xs9d=7669>@kKmj9d?B?7{;cYp-awM<8QL&oqjs`atSw8% z>psXg&YwviFH0o$?c$58ZRJxarWy3VC3Vhv+N4Z)`sc^lz%Spra@TC=g{WLa8nQe` z1;VjH%vALzvl@yRx}q`!dsTe6-!gC6PiD@LJhNw7HDAcOE(mOPx`V-pm`%;xXwTWi zsUjev3Zqi7Qg*fzBu8t)=EhEi@@oann&piiLO6j5BN`o5qXP3nd9X8c@DD&xvo*F% z$D($(;}uz;L;0z%CZLkNbYs4ui<{FsDBBinaks9ZlrvSn5?rOZ_w1F0@MMya{&`ay ztbh4o5H{a0iP6GwJda9`oP6o#EngY%w%G#W#fc#Y%Mo~Ei=o*J<69OKQFlSD-*raX zH#2(JwJ`e{J)Nc=!`4GW=p#JYwzLYvd|w~kBl7Q{#}-4tit|(Iu=l^Le|CXaeaWkp z5zHElp$@Qt4#aT|=^ zMsW-z3CoyA$h#&!L*$Yv!K2u9o-5g9ABR%USRR0 z-8Ev%k7C~YDz&Cv4-R_rCbaPVocl&6`&DFkXxVfAlfVeFi)CG#;yRqix zS_}EuEVVBOuuCySqnOMnTXuu!)bU{7LTE~rub!9z4E-U$!rIx~eth=<=dfP#g<7d4 z-W5~yRB1vX8R^@Z7~@^;9b+hdlw;v#ZeFtY$&#reJov>EriGLQ&H(imqdsEe^pl`q zt3kh@IBxR2{TH44gHIj9r>C3#4JK&;4#aJWQL-l$tzOU|=E>Qebk|N@S=(dQ=WBBx zx=kpOmU2cuT6L?EP0AKWd#-t()b|yq_&uy=ABfaGB#ai?wIXD1W^FCzGOr_{=|x`= zu<9FXz&910tr!VRjdpbR(FG>_ROubXO3x`N*?8hQ^!Vy1f5_U(P0k{ zI;m@NKIMhp<+>f~rjtWIUB4dxJ(Rn~c53!gS_F{fRBNUA#P!5>C(-SzXUZLWsDb|a zO;q>SC8-qCC*C7;R+&0#kQ)a9+^?oJ3UvR`|Fekz04248etew4TqB+2%0ZlaowkIY<6*ZHb zpetD2vnG{sN2XwfW#(-PoKSbUEU_wK&C-8hE}T%2eLG;AnsnT5DCORf?SN~C`2(0M zx!>=f@%HKJ@Xrr8TwNs7(;pJj8lSbx!{dj_GJQA960gOCC(Lxv) zdGxsRL@!vo=;Mz@Kc1@SwE?KpMUO0&&rUDIo<0IKKr@UgdCg@2W0}1k5)&?kw=I=r z?M-v(1SulMnb)}=4Y-`wyiY6d2@)*t+YZcIn=VewDAlSdjT_N5b>K{=mr|2W_oKq3 zSnI^T#Hwg%N+w>y;dbjgE1K4!eAo>7dV6>NRN(A23!P`rCQ@E62X?1BY%6Gs3AQTC zJ+S6Y&=p-G=1=_mE42hg^~LmvFH^kqBZry5PKIpALHhcTTdo9iu=b) z`&ACSI|ZIpUBH>8-{%5{e?)H!yvPqeODmG&1P}78`w)v>I)ll^3szXj7xbTFD$uLK zGE582;JpuRvu*|DYmO8-|E2>$&X-p`)Trofpe~0tGpz3nV4Ub4NsvoV>|8C32?tS+ zbkeQd3VlQQO7Hfh0=ZKuW9+Wo`~i9H(5o^F#`*kl0o^4LkCPV-x2Bgx^0`@v3nL|J z6&s(UYbl2=7e|I`%&$(e>b5%G=VloBoUk6*9zprkv3D@^Dvu?=%*n?Wk>dfa`z?vl zc#QoE_PiO_PM(bkK>~;$rrI|iwI-6?tFxMg?<mmOH^A@7dJ@NDiv8t=(PZyv@Jo(`-)JrNofBjn5| zIJ0s^hvV)oD$-=v`-s<$ULrqQ9>5jO?wz`csQcCFYL;NU$7r_b#Sc=}rLf93?6oA< zneiskkzDLvZB$(5-gqU529-FmNvf*|wQ^4OBWma z1vn1jo^hi4mwQ10&(WE`Q@q@Mx8T~*wRT$Pxl0F>xlHYWKcQI%npO&c6oy^+KD*C% zjj0mGYn^**rty=@hzr`QfeEik7an!YyKh`Ue`y*Q7YSaC(#_3H%%?+L=m+nS& z_XhJePE<9EWJ|h_p!u^3ZsguAoLdQZDXQWjk7-gCyT}H)cadGY5C0)9plb2vZXA3> zElC^N(|VZFo;3(YsLpFa3-5_wDw(F!3eG8AM`{sy%wWc5Z&FWYe}*QfH7%W!oFs%T zE1PvC5?g&MTqH+#HhCI|pU@q_{#Kgo6>dmeEiDt>!PvtPwNw0)_wQF z9&wN0JPnDRA;$Ly_tC2#z%0j8lS~dW*jLI!fz$RbG7R`s>GF!%tv5ckb+UU3(nNA8 zaW?5bsISZUjF1|qs%SzBS@;b~6nVWH+SIsWG#%G6VWUR7(Dzmd^_ zHnm>kA3)9Z9qB3#S>u$`(<0U#Tx;Sa!;i=UxcN=orK%DnyYI7`Fn2OAxpl`_V|Z{*XZ)4w3#cdRz6b7C(jhwR+Nx%O&~nN&z4 z;B{iOi77{GyGW~vIc3(#Yozn=sqz5oz`O5M~jDc#GWbLmSNt4}j3L65vH7vJqZp}#s z4tsmcu?n59L8g#cNL63i0?Y!H>ul;oCY4@RlH*s$Ag|zprVFcroOV3+PwoENqxhH1 zcHqr5?+!CJ&w9&n-(t7P+ZM(X!xhuVO|?pB!yBdibyci5Wf)sd28{o0%~>exW^)2& z`StAjp-LT(;MnJY!J>2*>qluU2A(n#5wwaEkOluNS?x<$SNkNp6-n$wEVOQt6n z7h7&Sb{vPhOA!i*#*cy2G?=6|iC33P)RfgU1^rk~%7d{*p2#o1NA z1jMaW-lsnpEN$1dI<~=`Qw&xU_kAZ5_=JUPc-j-Ah6hi(Q;}2a& zGRyBA?Eu=@Hon^+MXOXc3!}okHa9jOX&zXC|H7ywm6MjJqvVoW=2lc%kV$nx;Eycm zJ^eHQ;9CDso#)0Tq(n;8RJz^Z|SNbTYPFl#MHUjDCwEd zy(_(%f_HxKfKINA6F!$d*x3G6Im@G#Da_nex_P!z-n|;=q;MoPDkQ-E~aWgGOc#f?JscOkGbRXCqhMGG+cV>o(!$QFvCYJ{-S&fGUdK)C;bbK1}nw)&z$dP+{>b3 z*Tr-Y-@GpYnfvGsi&(~Rn<~5-+x;G=f4&qFs47ihfNm75C6Aj)4`tSNA*@I8fM;qn z^~SrtS$1?-ZnpGmqyeONx8;>opcA*4ws^R8!try?%=$F#Aw{u4Xa6ck{;ORZp-#^Y zGFsZ@iZSXIW%l*#{p0|2pxC4cAzGe6=~;{JQT}wiyi3XxfJ@_lue}lx8YNl#`w-4$ zTm?r}yR4mB@#y+GjrIp>Q%-E7qYu%lA|dS+7g{C}R~9-IxfqAa@NJDhZs2R1x;2)s zUFS{}KMv)QeDq&|wA`%t?&^1RmfKA6z?AkU#vnS46|y=-?;)FQ#1k!4cSpi*m3$J9 ztAxsRgKO=@@}l#RP--^dCx2UYWy%^x{)+hqUq8<~Z@O}uGB<$Cz%;H6Nv3LzJMDux z6_1ChN$A$m5)d>R&O5Ycc1K}Y%h0>vRIXgRQjYE(tJue=#mqv!fnvhi0R#9e??Ej6 z8(aM^Y!|JfkQD@=To&>9^D}#{VI+9zYhtXs=He_m8?mA<+K~Bvf`+Bf?*j&8G481 z0xH}QHt#(?$s9Z$-!fa+=X$e0#YDV+b2U3~b#ob;@3CR;a3&Vn)%@Y!VGLWtGiRqdO!N_ZeBQB^2{~a%<`q41@)f_ucJQ5rBO!GmKK&pOb@%b+i7ahZa00X5WmpT zN~mlbiHd%$G*gS#=A<#RIU(7B%pOs=KhryLyAW8Rr{6&)wO+t_NgFYBmvQI1D`LnU zO&CTHk%92z$Q z)|yt#_JxS#`04fDh^E3#V6L%8YYEGNQ&Hb!Dc{FKJv(YKt|U`bu-UhV(;eEXf}Q>H z@u;e>FL57l@jn%2QiEDM4o3;#CaabQUjj51k;D-g69-q0d0gBmB6 z&Mz<1Q<)2`Ty_dOvxd#&wQ}<3R3Xz!w*v~bFz}wk+>|@#jRA+XW_UMyDD}6+1Pv7m zVs0Om?pyE(B4Lp=_xG-xjp$GKL$GZwqp*R3NYA(#L)1=MJzz`_D=^FCp}_OB3Kl6y02QI>%g z#!{ZG9T_V6AWaTf32jDOxSwQn#AK*uj#tmQ*#IOp6WW*VyhN>2?Kq~2KzflPX8rkC z6o$MA=~m1=(MS=I*1vxPldKymX%5QTn_N|%EGMxS>-N(tkoxm|LXDThfw~xGE^n=w zPU>dgw1{Tj46LZVct$BLWYS{C@c?QZfHlIf%Y%A4lUWn?9MS%n31`c`mJ@y6TohJ} zy*t6ld))b&UqMHQ68j$*X+I)ge#Y;@2>YOD^LBxQ9v;9Gd5M5W{E)h54#4)CnsFIM zV&a}8$XG=-$L;foW9MSyn$sFlbLWE}f@eDo&gj0HP4^WGuPWI%J5yWtmZXw%5m&by znG8RY0IJwk1=Ckehg>O#huxwv*+nKF1lPxHs#AUF#ik>{h09-5kLhl_5rnMd8tTwK z7^<_pm|MKpEG8*YXKG_%xZE7xa8S5e)r0!jb1#nxb2W-qk|4Qq-_}x`=ZOe+F_n3T zzlu*uf`xH*BK*{VZJjrBF-#Z8enN+(T%}f{6?EUsM+ZOMs;{0%xu8sHFl+cRx^$>| zSD%X{zNO5{82wyidawn1M5FynSd1^ON=UKT@tVN801gqbu<}U+a{=uoUUTU|^YwKA zEbh#50MFXS_uuKQ$7EFEKrR~qpy$Fm!{@elHHqwwtUdlLynAZ|BOV=JwO&KJGUcrV zo$CYWwjhR-10;XLwRHJQC;E}Q5_dwQ=U7S20&H*n=s?~3#f|>qfrCqzzTq-Y>HI>$M`Y)uw#vF9 z+4>}Zk5X;umVbw8f$+)~vXNI9dp%Mz)x-LyvK3{dYc!^AhKK_jd7}5B-A^%zohpoH zI_uGM?y9Vfm*XnFLj^Jcol3EC-4=dFWcyCOuz_THw0~D-`$25hpEE1{lC}%Q=b<~~ zB>+8RM8fZy|D2(`S|V%Xvs@1E6uOmUTkC(?Vi3n;+QzmOF9w3}I#GmKO`U7nIkOxd&70E7pQpen^ zd_eU+ZmU)krJ*WLN#ijjb(=za2q!PGFR{P@#K%y%KG zdY`sCn*Hb-0{c)OUy44Ek-b~Vfxpkk^%U=s>->1=ZYO~^1Cm)HAk3vG_tJUT_UEXf zVc+mw;j<5a@}e`y~<{sOSQji_+HbV3m$d<)+#OyK~EQKl-+|_DvvNVye#hbl6bXcr7dyvk3k*bVuwk+Y+lXXzO`$DzF?MuQ{U zPv#W_j)`=n1l^A=`cdR&wDAnXZ00HIu-6~f7V*|2?CwvCqPhkZYyPl%T7HS~L#ypW zFAN!PQgXkfxXA8G&eyG{xJdGv-u_?UTjr>r)LjFQlYmzauybdvw`+u<{O-@xZ;Qo>@V^m8uhGl$q*7!EY1 zJF>BNkRDYN#tDgm5Q3ph+{zE&QTPbZX=l-mZy8~5T0)F0FS~0ml;iga6 z(%MS+jgg_e*M&j0(=G3Epd9_F&Lz|VzLt5(Bv6#&e%8^s$%|srZz@D~)zvT}UckL7 z3B{JG4?^`IL(}G}FR?HQ`U}%Q!(r~Z#k?I>Bh1M`?B+hA^rsoPdzILMdCxdZcS3RX zxkhACC4<~Bis;#X_N1xM*qoX7epY(>v|-y?aj#CzG$ALvAfSqX-Cj%1 zwJDm5BiVyVjBBrM|F0Zm&>qTtKU*v9zvOHzD?Hf8ru~XME_%iH=d=Bb#Pj#WK{J)F zsm^L-)+L9AkfTvbo0xp(dWbcso)QDxY0Hc)OTk+GftCMQrcCMHpN}6rsIgHQaXB;j z?nB9NPQlW2%|pCLR?QFd;46G6NoWfw)s4jLhf7kN-Rnt`RcAPCuNT(pX?k}ii{nP< zQ5(rIA)fIEK^y<;C;nyQ&^CO=wF1cGSe=9=4sYp39uuK{&)P2SSdc)~9Z^<@;(A;Z^_4@YI! zB^F=#LZ+)q7)sHse;9n&yDNW{v`40fDjiZm`dN>l}Pt-zlh>l`!%2aEJN4XOTYX+5Yha z^^|O|V*eXt`pthk2#MeJs$mQZwzzdcWo;$SQpW{xH#4Xq>&V4osRCk|!zVWI6JU1h zMLB34hEJwh+u=H5mW6LlKLJvG=pw`m0Ih8VBpPrhSha0;Q?k%K*ew3MZ>3;JjLj`! z-5I8WkHV>q9jNpSYHqK|C1$Hxw$qU@-+?muey4BA4JWS`kfKvhfwg#i6i9Y=Z@ZL` zkM9veC+6o?a zT!R$C<|#fuiW-^~Q{+=JR_0Olh#ioz-@j99IPaNJ2^px{)fa<@0SNw*4=6PFm^yW2 z!wfUVSD_z(o=biE^}iZ8&-}mdO|5E?wFeBy9~hAQ`01~Y zSwau=KPRk!UiP0fEr;;PS{kRJ_4)e-&s*dB+FzhA@nu$hL!Cc2x$pnXcL5Z)q0f~k z-)eyM5r0XU(Zs$s@;#>g)g*mG{wN{51Uw{$Z!($YP2=PD=Xd@%>)Q)v_QbQFz3;vE9oK#B3I3och5eM|DH<9Ywv6;U6*RQRlxS!V z4IbYI-Z8tq%!G1M zN>9JH>a!DLiQbj@dZ)wVhWu()QaC3ACMfy}B z=pj}%=HKfn3QJ4*k_JqMkXS7B1$*-imzS57G50`{rSwzP!$0oV!^aH=G4jJ6-hF-P zW#zQzMt?#?D*7<1$xy0@$BAVmg~$~OCFIWfrZ0$4Ft#sE4E9&hZ!9JzCcG|pA>(h` zXjl6axT>qGfeVg~k9W7~(6$VwF8($;%m{q2=y`}ea-WsM$;k<*Dp*-rNhv*iLnKlE zx0}P9z>P1CV8D%SGm=HUW-NJKj+oILY5yAsOZv$DX3W840g2ye>BrJUe=kc^)zOiw z@#s=^S~5)6#Z|5ll`9^=skl-YlpYDw@ratNoHdbL8~YAJa(%moq-?CMmTPyC>k5_DJj zjXqMGML%4$I-8p8QcU=d1*6ey-(wTHj2KJR5_j{mR!eXYVLpj=0T%)NA{xQ88grF5&cPB|CLX1NmR= z#o)MDYuseF!HZ1$`K-!O-1+L0)1Dt+iaimDRzv;uEo=3XEq(Hh&C3+P$P8!BI=sx1 z-23~rDjm1adnU!Z%Wa zf7c@xu<(_#nWn2PCQCpK8$)R~Oa8dLdxleGpZt$$S+OTUB^ccW3z=> zr#78AMDI2gi7u3+lZkX{*)Ll+sjiV{4`)}74pQ92J5;yq*_d`H*y)m$mnPQ$sk zkf4W;KOCO~dmuC7KBtv--4r2#IH3xr&KNO1+w3%1yr+)RnLLD};|hglKR!Kc8+EU1tGcW1{-N z*P};g4Txro`QCqEheKjFE1_)7HzuNRj?H%8dp4h5PL2`b~b=P>(nJ#LcNzFkbPKM;B6gSKh@p zUS=`QK2nW55ejdNkcSBv-ib8_eBZbX2_-S48QDBQBoss1RmDoz#5vG7#J8}@ALIIkn^;0 z9EjI(Yd9hmbV<(S?kXD)dv!dmj1UoCmu}n3#*4_S;a_}KxmG%a?IvPgb9tO3BX@nV zGk%ZAx_9>jprz`E8`t~dd@f*lpYDp1=(&-V)vnVdXwxy=3B#WUG*xX8mn}u*5HScEVq)r-6C`>CYtwaEd`T3D{CNnJ@ zSAqG7seob7Nt4Js!7&!~Uh_T^@or%bE>r`Q`E8X^24KzKCrMB0} z^pFI5klk_h<7^$3oaHNx+PT*FDxKa3y{ zX_UvUW-SwNUkm!lC&W0!KXdb7wuI`DV+L6jcxi zH5cLdNfa3ifzU`F{Ypha4hpLz7y0iE1}+O_eyTBW=>>lV{? z_%@Oyg;;F4$<*En0x40L5|h21oh9@{Ll36cI}>8W zR&wa9{K$VJe8k_-7;99AVB7B7#i`mN#f;86OxlTL*TYjgUR3qQQzlB%-(7am9NbP& zh!t>UE-@O$-WPTeHL0ZFS*qDyOn*G^ByU+G{0ThoA_{_Il45ycH5B-AVYAxt6JjCK zJG!B<(GzU2(zHM__E~x^GcRPI8=oG_tg|!jpPN5*77*EjnJL#lY8A}K>&U4at!P^> zc=wZV4^Ov&$DQ-!uoilowIa(?&5e1nUJk{y#5xiBl4US8TbSWYvZ&~URX(HYph#A7 z&7pAR&Q%&wQE|M*rO7V*K~CCN`j#^v27JqCIr)T2R@B~+lM+EkgqCnd%VqxEMqXO@ z7DV_+-m4^?lhN)(JkaVXjoEmz1TeVr%4fMvg}k12^2|N1r6;&Zds6J6STu^o|G$|My@rYy5i ztV~;c{$Bh&ok)X+HlR5WWCHeT542GPWI`&hXd}0uj`*pAK;$q#Ikx7rl?Za7y~e}A zZVC^}_5f^;(><@9^6o@E!spMUVq*!3h#&@?A%H=qqov&i>=>{z>gwts3+@(x2L}q@ zjWXNZSXs$5SoIlXiwN*CJAi<1-Sq8wap%v^~cv-shky3m(W9G7nvrq0?h?<`DD|Li6W zt-G%s?CR`A^vex@5_ojZfKjUpxSyIdj=c(>+ocp_QIWltPS z$X@X+vNtZ$(@p*rGzQ*uUU|rE){_|DP0zn1K`78CrE?M3+ZR=uFQy1JyKWK{EM z6Jp+ROhM7a|E`oa?A5mbMw8O}?31$c2;jqF;E+wdjdm*KVE+^UTwQCaAS|Zxo@&~x z$i%^LZ^y3~91H{Rt$n1laWGw{V}^<8P>Rsz=H}!`KEvx9V< zn4MTcr0BpeRv~oQe0+_=ci%=P>;2 zT6jUegHPQ;{plQvGKY--%KefUpVe00=v$H(b!ve zYQK~#B{q-pqfy^wW>wi))4+|ww{d*^a^;BAs&T|yU8pUq4#a6tGU{*0BO;zV=3en` z$Y!#K>muzS5kE)F>z7oB)8;9STcgXTi5Tyw3((kN#azZp@BS9MoTCFD@3f~rlzTBg zRq#N|5E397`>XlVnaRN4MAf{-IR_I1ShPh&M51Tumiy^%VX(+|?-!Pug7ZHQ)jKti z8jzvCzjn+;J=iT*YN~cDNWvM&U7`2+*?fS}%EE0+k(PXUXxeSEW+CgtCuZXzM8C)L zgF1kWzv%{DaH{hKmg;SfH5_~S@WcX~S z`>v8y&Qf~;{G4p~!piv0RpsBmus62|*`Z|8=BI6+SPslHvJBQj<|d(Uea{~%7Jbem z#35Vk4!stis&m)`{t|iBZj~_L_;3T;;gtkg>Uf&48**bH$z^X&zSWfY`TX;T55uM2$4qea2It-0fq{7-erP&fu-HA^$^TPFfIT!DyRIP3q|rMw ztKH=E>1}j@tOqizvLdPE*o%*eS`vGt(RAJ;Ynw$|ufPNXlMbg*XnL;&*`f^OKE;-) z&rG8sx8L(0_7j-K{^YCfxO>3g;tkfu5*RqOw$6mAQ0&sfsxdVXzm8{8S%EGI4Y6Jx zPlA0!oGp*=BgLQ%5C{25MH40n%caw*xwGYl6*kPT8u{tX;_o-=6bHEED~-LnT565T ziRWWeg!LCEPg?B4#{7?Sx5eD7u6Kz9Tn4lkFDX4m5vj9`ao1+B{u+^>MITEfC6q>* zC&%qj^Jk5#o9*|c?0%h9?iRc3wI0}rQVqXr<)xgt=#(+^OZbsFHX_we z-LPud(&QVSOv55s#Xc0!e|t5e@;y`b85G~eJkRzo5iOL2grB)dQWS6fW~m4=ASR1b z?Ig|`IUDl1K17`^;$mYTAGPkXrswoZk1kyOddGv$uXWlWJp9S-N3`N0d>HnT55Bgs zkt*!gTr!XqDar`bY`K^aIh~_6TWE9}0xF3-7F}U4x$IWnS=5&SA>aAoCZu*U5B+X( zXmc889AlV~^jhVss@Jxbt33;UkuMMO59gLAq|pK{jKZrWhf@?u`(^JUoE!?zUnO+-~XQH?IEJMv^NbwS+ zbw(~nbn}OS@u@Q?Qiihy{QWf1Z%;Z1+ri;4tib{!>&y2z%zAz}u2Q8>zGOo@t{c%f27fQE<#TwfE*thQ_qCQ5wwtXe$g3V-52gK(b^$E`fG-N zv4l}Zb-FTaFZGc%=t*?RZoZ7WZPCT?aIVtvyI^NZ0iOaJ+@|MjV9Eh62}<&6^2W@x z2=6R>lbM6q*m|7+$GB~=DTi9Kv2Ty=J;jQZxcHDa()@DrOuD*MxFS2pYLzs_a zks@^oksSdSvIWzzhlS#*AKFy8*kTIwuklWsYmcpaG_B-`bOkk4>*pt~{a-trzG_t| zuj?FrXGKZR?kRtCZkb+Uze=6|Esepx6`A8AC1^859GzdFWma0mM3GkKYLDrmOp|a* z(0?PTcaF_qL8Mswu#NUsyZ&~WD$fkWKh)M;b!OM!u58Hj{z=I*TTX5F=U2Q8<8+kp z_WgI5;V|*C!uu1z{Mi)*kNX=DC|2Wdl@`8!vImzlqzi{!jqZnG0cPCON>UKmi7&OBtw z^z^x#guRhuA%c=P4sN~Zm((l0NFJ%A)-~Y1nVvdT;DRHV=4F@o{;TO8sr%Soo|mMU z*M^y#3H``1-^tH4d@kyK&h~l9*eD41NOPFaE<`8qXpdgTTc)o)`6+~FchPp`jn|Fe z$v`D7MIL6P*!4Juu`%FZ>r|`-f6~-*drLP_#D=^3(?G&M=XX#?W6Qg>ekBlx&x+KO zx*@iZ*B(gC(s;i;R}R{ZQEeUP6!y-5dRaQ1^?~=n_J9Sk8qhFo^iT>#)Yg4(oVKY_sN>sG@0Pm+e|KA zTL~S*^DkhJMH&>`5UDMq!(h#$iCn0ZkOF`ik&G3lsUZ_+KYth44W`gi>}zo{sS$-z z=jJV^dsTgK;dD|=yY*U%bHGY+-t|N0z0zZF7G=>0Pzt;^?gGcWn@lGk8`hQuZNhx= zL<}C(gc-ArNaPmgoI3&M{N6&h(8E@0p|7^RR=OcE;!I#|+JqMN_SH+i6XXrzS9NJ! zVCCo5D7db7f{6=taiCa)j(;?&sD3d0_{+!mlemf>#)IHs zh-BcYi#*jfV`!R8(oJ{!$mvFN{cwHgoqF`GIdrcdJ}DVI!5pAmml_y!;826(KUUfS z5yY4-iv1pV|1`R1&Dvl5P+VMmXVOS0tLs-6jQ(Z>FMs7Qiv;#8Kg{v5vuJN*BFm*7 zk%uPF6>MvhASAeM4nF1-!Ix}dR80W$6Y7qnY&l)k<`qMf3`Y40Kj+ud{s`TQ- z6g>9Lba7T9+gzca?t5AIzfXjijy-az68>DX9)rJvT=ea_MYRGR%u^RsRhwBw&r9)BFWN)J_c5&g32wPtfI5L#PWgC+ioPY7CYWvG^ z{3`{`oEBjfs?M)9#=$Kw+v(QVr!{3^PU<$Aap)KrJ^ zZjq=oa%YgnA=fW{s8`;Hz2nHvZ7P3AU~R7Z;Rme1*+~7>?N<>7XXgF1<{k zV%2fVwqgm%7zEgysWj_8x&2$d>ZPfP`1&By;xX6^a%&+RApCyZ!@a}ZY17Ir@E@j}pPWK;@2 z%im~*Muv-0Yjt~3$N^R=wNS}8EcOrkRgI*D_xG~hq3J#i${S{J}E&c#D9S?{YeX-)tDSPy{tK%iY^wGY6Pj*iFq`ht(|jX|xabQm(i zlY!@)H9{>`das^yYR8LDX|zvrtg)i}w_@5SryjfopD8Ngv^- zql0S-zbA9C%r4{ZSV@Hei)K^z+P>nExGdO(`K|xVMW^|;)nQT-@Ko!(eqFgGI}d(> z+E&we!TZQnt49Ar9O7FI1xM47s$=|&UTbSr_d^?E6n6iP?%7OS!wX#zGT^dWUd=ADc%RRoNx` z{#o0c{Hmcx&eyd*$V@*m5tzMvUBicqmBLQ%(6)0J{<`<($mk^XiCkzf;qBz3EsPiI zKmZ`7#wXcOl5JC_=ZPwY^rjHj*D!halTr!5_g#L*P9{WU*bjg@s69aegqKau__-iT zyJ5z?9(7RqEK^lZEbvf+;XN0HYkL!6ecCSEzmRM zT%7}xX30;Z`R+0RA!I74r4kgJ8JH?2dT}cK*-lyeD#X-6Obx(>4+KI6+?fZhx;0K% ztAG$jC;G@O+`C1mWj2ScS>tjPy)x4?QtA>G7CW^o7k~D%H}2$*=S7&eo9S8BCupKH z9-MryzgJVkLu>$jq-4i#s*EXabE9ME0=5bEXXD9h?Of?_~CNXxHGE9)jofHx#DxY{}C2m;Z-w<5t188nV_*#o0A1v#R|4&)#e8^ z+o`{8wdl-25E6+dUhjNHNBu*k8^tKc7n9I`B2v;%m|y zJ54UK*=x$If~;8a7nW}gb6^0dkf}lbQh*0m#~0UO*%SY~x@^ldT1eELO-Ytwl}eZ2 zIa@r+E~o)xIg&txjDR4f1>!~7MQ$O!56eq)cZ@r}P)uPZW6_?f%BdXq{wi8cWxC3& zqkQO8jtOjib`gc?Jj?y=g~y@Iz-zbkr8<+eS=2^Ud`z%1E>WGSrB{{dCpES40?eau zw|==6oVawrc+k?&ydWT80XKWjRGBFWA9P6Iia4I_FXw7D1D3>P-bvH?w(M1zjafGx zLkkKD0Bjio*VI?iTcD5`{axE#VGx5a<`XUBf$Yj7v}o1N`#cz-0@bL}-}S2*fpHw8~Xt6zcG;YL>HVH7Bmnt!H3r7u5&hbR*I+M~oB4Q}eL z&-Wgg@s!r!mF*GvKIv zPtf*NxC3+tWn5*&B%y9x2cYkAO1hio=|LTvgbJnukDlD=6SDKOv$Kl}=)^>|$#+A^ zKF*rgpL@9Z8nEBf?RpQoFK=GbdU?xJV|ZKm9S z#TdWDM~1MxRIQPYj%Bt-;ghm&2Xgef+8~mDP+MUqGsQNZ&y9blma36v>~YO7Rr5O( z=?)=O?0G%%0KH~K^Ob6vhbpGcK>Ty3j^^{q?7!hUZ`fjnrE$Y9qqT{@}a!UL@d@b zr;5_H0{)Q!;Fc0pB!{R|qjJc=%z|ar?*(++ahS6Wd%Y_I2``Ct{|K~-Gc6-u0e3W!12{LU+# zV22fbFOurmIjp4(99=I&^80d!gv%V)R}wUN7QeP$^`sie)JXqsX*`JXiEnV(h~wb^Qd! zq&c;CnnFH`V_#Ip?rE+*92A~JCjHHKMFAWiK()_yeQO{oAj2j$aBS-EIckbx3DM## zcqMNtPfo)2THDp)eNQ&6kJEJ2vgt@4Q;rNr*4%^*?n?qL8Co4(>x}(~o@n~pd}BMV zn4>leIj52I>ixndT(PTRfVYBN>mf21*W>7^d#Ao&sgsfwPwV5w%1QU0HjQ%P&$HPD zJQ=|Yw{Hfqjdjv&@(G+eqv!Js=gPruvaD06}U#aB`I=keypIdU}YJZ&0l`& zx7iTYtsQ%Ndr{QU*!S<>uThr(lSqh(sj#f9EH^jzfUTt(a#-&Ke;-Et3N|7|X?3d8 z)h(3sSe+D;gm67XwR`iMMlEd9QgRVJGR7x=9C9?PLhB6Zw`mtum)o_o z4NdIzis4Z)j=92k|Bm-FR??Wwbn;#?41~2&F*=!(KJ{lg%IHGJd7IiTC-=`!F_v&r zDwzxj%RKvQ$7{BVF(1ctVK#?@Gkq_7SE0oYY1*60W+!F#O)l!2$;Q8 zDLJdWHma;Zsdo`ULBx0@BqVqwFJ3d8M0_QR!mI#?fVeas(aG){;GRDZ&WuoFK38$}Qt zOVJPre~+6g6W?9>;x}(ia%oD8Gg6)z z6(z$FD*gz|)%kQuT{)QPkVKm=QhugMsOR`HT;9D#Cg>Sw^`WET*1~)iy;Dn8Nz;io zoYMVxyV~_&C@p`Fxob3|_MJthJYm+JbcXTg`peZyT7`kRRD2>MD<+}7_+8>x z{JH4Ga}C3`307-}SQng`>!Ae`FoR*Gy)!?zn{|%Bv|?SGFLJ#G_4IN90RQj8upPEUL zmx+d`?#{6le~k^7N<;5hlf=r;h{mOrWcoC({P7nrQjke=YX~9F$A>2HQG_1R^(;@1 zlUtY2?lpZcZmcy5)qhxcE>&Yy6cJH*&5j#mEu6i-A2gg!hk4E$LrOF#dnu-B`q6Yf zLpG3k9Dw%)L9u*7q8>_pV&DIuTTJ$cTY5*{p;TxK$X&>ydk(~bbXw)BQC@{WiiW!S z1iZAxdvC4|*rA`=1ArJf@aq)CA2IhMQzxfmAbW`mm?6NU1{@P?vaOmQhEhTRIRfsV zX4N@#WjfNPBWJMSX}#a|>m9*PYSz`Sj;Gzv+BC59jZ= zuHHEF+HCWeiAru=@H3X}$=c$Kmt02Y&4#jepFYM4QXY8MFNwtD%o2z!9DH(d2#5Xo zf|_83Fmn@-anK2u9q{!YCJ&Inoz&|8smwnbVv-H)R|poUv|BDRDfC7j9Ws=VK8YVd zp2nHYR(wNWkIMedWPndZ^Nx3Rxeh%K*RtOYIUOg;e{$_$+bQd~fq#0KR6V5tCr6af(R_L7TT?+kvq zVYlfqK*i^Y8T{Oe%*QURH@4dY%DUfikM8NO|`j}{kZi~b2vpyUBhBL_x z+Sgu0*ZuhJFQZh~@%s82AXV*JAg)rl0QW`ZYsui`Bt%sb6HPF0u%hm-!<3G{E$p=U zB{ZPr1WnujKUO9S7`*7~%j-h@us+q-7Y%q7k@}6Rm+D^1v;Rn?4p&!Kw@k*7N;K90 zKvrkx=T5gwQ0)JU3A%rJO0WN$wzSg8{?TyH57xU8qE+=TE~Y(~sr`!n@ZmESwEf5b zHCPC=a10P%@nf?wX4-+Cx*!%_yt}`YZ%r<8ryS9IS=;MzEO?WKfLz6h!@Wjdb7{1h zu>bnZ1&r6*+xv6n`Ob7Dxd>5uc)bf^4}n0eN|@n0V&C%?1kH{_pW$HIRyPFycab5$ z^aZ%EJ0n@$fM0H5VF9p$1>N7jDFmFz3t&Wug?W8;$0J=dT$-?7Eaxte2jGL#ng?IO zpM&d=$!p2%!~ky?L*cJ1m!2yFTw+a4ARk%>Tn?aGp`C3}n1T=dZ&}5jcLgw~8*q5v zXLLv9JjE3EU%xz-rM!3aYyaH8`pKSo@-5%Q<9K`BG34J40wjw36j86loE;n^cH;Z@ z?HSVRe}`diTAq~lG5X9(Ma z|Gwh-wO9JT`fslP<_pML{QtH-ub3hVESdiXjRtz+@h>wO0H93%V=4ci`hNoYKQj3% ziT`&w)H@wLTuRWpCnD&6dluui*ea(8dgW&2p_%Obe|W0lf5)kb|2ZjvHmpA2A;A^{ zJDQG2#b~5SZ`cbTxAB=9IeeoDM2&w3j%LMyz$QS@Yu9Ecix#e+5>MYt4LtyTSx!=2 zbUq?m`tpAllP}G&yPxUu=!;=c9tC_$hF{R>LS9Pg-r!WjzpbUS1QD{TdshAr+aC>W z>E(aS|NrgvEvo)NwMjr((8$dH&smivD<^v6ywsUSAf(0n~C zxv?0#CT5pfe)Z#;N9uK=PI`4%-x%dbQd)^DLo_Dpn?AHCjJ#!z^8Wej&Nlgl}=>pYpTHYx9z_q`K%I%eTm7+POYeHA#he|uIl$_Uz15Q}io zo=cnVem>!{Xf0{EzmGCGDSvltWnU#KHg7V;^@&4dZUKVuk}R_Mtb1ekiiCnwA0D?6 zjJWXNr~ln2O*E{S8?IQmugW#47@=-%Ha+*}P^K+))RMtCImxtjy*6nhQi;Xdp5NF? zvH~NkO4f3tX0Eo2U{A!YODoE6#h!76WTOJWsJV@;hk_jlz>c)El(G}r+6yzsM+Fcb zQ#s7ZWN=C;ba&c(Ps~SQ=i~M>mZ~&~*Q4M0<`Oc6NFz`TI!{K481%fsccUEcIkP5* z6;gO7^mzq}xtb~>*v~KG*lV4}&lleh=Wg{w_f4rs(Ouis;JqHe zJU4qHr~bU|WGvPnQ?k!;2BHlpF`m&7=Zp=0kP~EfNjQ+XwaV=JY#j6GUZP8Fg><== zVS{^>KFCBYz9bA+Cy5oSQ7iV@%cmf*C7S_?0G^T!40v@;$$K;Jq1H~PGHot8JeIqG z*}{^}e%=Pv2XfjJynCqnpyOsdm~&pX3m?xM^qdsKfb1 zbXNk{{YDcdvl;`gEI)2r%N?~Gs|B-q7FGyV$+wwzrJlflZAcZZCSA<@6``$OJ z_f-TABI&8tQ0u62b>sYe!R>5cq{4(N_f}>4qRJqLrapu)xtEg1(pp+e=ZA0=0b6!rS&XV`0oh6|-OV4Py*D$_Cuj#V=82~8? ze6>mt{Rqz9dJpr@Qi)E%z=)J>C4nBzgS5cEuv|9%j+al5n!08of66*}&%e?c3P!F@ zeQGl{rpb#^IHB&hom~Cv06UUo1+0AFr87Iv zJj%Dg)3oq>eXO?g)5Lw+;{*NYtW4Bqo{_7N0G{_msGZDEe2nc&BJR@+4HPFc!#i3V zv&>LjbY07A%>CGk(d5H*e?RNK;#!5MDtb0iDHZ2NLvzfV$VwrFdcHUy=I_(-y6oiM|Ey<E#zK02u=7W24Q{ zVuwR+fNeQ}6Nind5l|@TjZv5bw^9!vv2n?8iupl8zc@89EqH!-$(R^c$vy97F!F9} zMG;VCZwqZO?$!rLrV4RD>Ebg0wQIF*@E!2Advz`7E(l-a*d!$wi~j7+RhVUTG)XOvTP$Hr6%&@=CmmbG?5)-u75yPgAO&tQhTKMjww z?Tw}7nm1kZFS`a=Pgz~P;BPQveiY&L1v)z21@cSJA?B8m-YTQWGP|5WDk!#Em_!aW zXQY9HcA*lfh7g4=OS`!Yie^#>H_@?Hp2_g zg1fn<5=`X#QWNW(?JaCuWAf0V`*beZI`cerR4ADV zbf+ME6$`+)^GliMz5}>{0+i=V4ioW7q_!)n&>L{xSWF_%)bm}FLN6oHY%bI|1d(jX z&`EFheprJ%vDPsC3ON5lNwGyeLFqVoH61>V;m1{K@4x@!i!UxFPG-J6dbPCz(!hKU!SVQN~u_&XNT7Az0BOMD<_@D4i zoSVFlT^+0=j;+wGGs8}1_4@22r@X2|g7C|!5|IiTO^m_?jex3EkI`EFk5LA5o?=!-VdGPkpF&4tdq;;S+;r>P)mc@a=I!D6^g=BbE8$!E zaiwHMQR1e551qcDuU=*)!t03FK6fepRXkV{pY`>rxd4ab@z)*PF zrie*2w%UAYkFyOP3?@2{tfhcRb1EEZtF*#F!R_Rj~9{cj~}eRJstt%#)7IF zvXiA)5w`;Y1`8&t>b&vJ>HG|dq^4P@Wu1Z5SB_?3IKA`4PatPVGpnazl`Qs(Wo05{ zjkKt=4;gmg+&5$F*5#Ta2EXuPWO^Y~cV6e%*j1%3Q_oof!F=A!vu8LEzcv*;tv$2l z9_W9rL&k;)wRlpG`c=%Y@~P~3&DNk$wmq#{196#%cpL zbxty87#$A9M3{z6@ZBCn1I_j?#J*08;=@jy63Y!ljtw{{Y6u7~fpv<5`badA+Z_N(YZLu`bv8BjqA~;DAab-6mH1 z#jk@Vs?n4|sLjBBurg@oIhc_;_N0OPln zVAjDZ3AcAfw7j4fNeGcvyFCVAH*ym@AM5$!Qo+M$hrB{MN|r2A=k#Uv{EqE#y+Ug< zw!hVC+dvd(no)AAIv{N@<%v6sj$B`kIMIU{3kkq34`5g+7vpA=>eO#kn-?!;rto=i zk^D8%3!ErpqL?2PNxvv@#)L4AJ2W;`DLohZ^_}ujSW!l%zarHv7{C;~TL5kH{wzT| z#p4QHV}@x{QGPn+9%T3@JEg#0@l{XjoqT)@ENrH;fKOg)p9|mOuVVXWvynsx)kh0z zQOkJ0svd)!p}hlVf@ zZ_R6=g^#IqERawhuM%k4$AQ=5wT>`%t-UhxWQb(_g2u+Lk*KeqC+GZ+XJts#rjRkf zo?F9iClMXFVBxeZSGWv)(Nv=b-6eQ ziKoxL?-|%j=O(t;!cV|S@pO4K_>k#L@GO71Lp^{rJOI-Cqh#C5bC3@O-uCi#5D&@$ z4%EC$5)JO8n((p9)<8y&BNDG;*HN@u4WdVjtP>igve@G*)8$pv z_G12JQA(+)ZVgV2+WWuoqT?s0W8m1}glJ9ojRlL$>C0EwJc_C^^h#RrO3z61H0T;P4@}F($Jn`G{ZkaJp5IbSb?5%A zI2X$v$Ry%vh@O4uxCpS+FEajq)ET@%`cCK+lzx1lmGd^T8Smc}aGrf!p!?{tGd3<^ zQMg4-sr7V(rNRK2$Fc`vCNm=WtkG^(BB`Hhh&Ziys^6*(I{kjI_#>0y6|qGm zMEc?avEx{@zjM>;$SSKiP95l5Oyt&&FE^u%+^m{j$qnMy41R6K+`^J3T5`$_AIc_> zlda}uygSGcoqaR3FyB21g1WWcXi#jg;8d0{{G|PfH~#$*SixySoq{anf!QZ<6E9_Q z*~-HT)p-RwtHduPE;hq;Qp*dp!mf$^qn{nicIFtIxXE2+=0+d=LfnRj7h=>^O_;c&J9~LMm z-&B{oh-`b9552pjBiPCzI_(J9710z1IgiEQl@}G>u{y|FRuRxCAP2-Y|f{e`1$C~swg|S{^^qC>+W0ZxjC9e^g__65QEaHyXVb8 za;sCB@na+sOoB!}2c)IsT9eDjq}6pqM~m1OmRr0!WNS;4us@vt1eviTD&-({&>RHr z25%Bl8Ns=v-gQI>%u|LT7ZXSq!)g{omHLHNam8MoiX4QNGN14I;2lg#Ox|lePMWip zd@zXG?7l{(;d;!1*B6?uARArF@rMRv4Ld38csKCk$;zChN(;Q}Ne2#-v#0(_xtW*v zc2drhxsZjk_QOSrz`#eOwv17%?46tq*9NQ9$Fm-y(1zt+b>sYtj?2fpv!1Gqyq1)x zq9{@*bg{-ABL3cZO)2?2w6}Oc9mazOdw&N7glWAI;V`NIY`6;gekAn zt=O)r*?TtC_!M=%@>;7g-$Zh8@K~;|x65^FiwXm; z9Pvdx|JS1Ehx_jFoz$9Q*?e*HKNYaIA-Ep-7rP>mHLu_dQf^~sk@%2{-DzS&@0x(a z<^f~l!l!2yaMp5nr8-VUlXW=CsFCusl(v^3yUQ=}T<_8SEcMwp1|<(OcT2V| z6_eva5`mRBU}yQ1RP5aXOMJy6UW4sR#W}o#rf>e(eG49v_Yk^E_i+H3rGLD>l(Rc- zSpCf;lX{pjHWV5JZno<9aIGoou}ptK|H1i2zyHg1>DA!N1Gw(DfKM^FINfb?+ksFNt58rgJAR1SDDk63%n;K- zHZV%PeD=+K1V4PY)4J_(LJDcg95Kp?Xf&y>SzEB^QG0%o&E|$r<5jFG3(XQgSww^P z3kc?|re9i1j5Y~1qACe{5ZBRWrUyEo0(Dxq+Lkt-zzz7m{K&=}>(7t7OQ*5R$q;>J zhuz0_*SQz@*Zm--`4@bS`Y+?w^KX8`*XZ9=&l^CW1NQ-p|I2@qZ{PpRqDlYv!z(n@ zf18Qu)-rj~fSyb&s`d0=s5wGv;Bv9{3{1h~%oJ}xbkk?ZgYe0kD%L0Y{x`?hy(%}^ zbdAw+nCrI3)uUz7L3uTp1g_sZHsJeervLvC&0R9<-MdDBTi+d_)xiE>Ac1SMsB)0e znJK{SxEf5<@FdJ=_wHM^!ioUJ2@nB(8@=4Cqvy9nSaMAUGSqkn8%Z|Wt?Y*Xi@EoX zYijM*MVGqNg@`N!MEVj0rARMAC@Ni=^b(46siC(}M5OoLL3#&i2|XYn9i;aloe+8p zBm~aH^?i5md-vYwoPEyz-E;C6Ka!cuIo~nHJH|7f@l0Scc;k3XdDy3#OYHA!vriuq zIZ|L8;R4N2{=JX>n``_nR>kdxd9V!mpo8wk!KLw{qZotrWrPN-g`7 z)}p0lTJic6etTJL;Jq`|Wp|TN=N}mMKkwde|IQ*Pak}1;U8g{tNmZr&I^140!{___ zKUOx}SL)Y4$ucrxe*N*kv}*s}@BS|={(srm2(?TT{gvXDesXFo_{&Ux=6U|V*Y>yn z*aZK}&f>qsA^y*v%{pNIA1(LF;YeX%012Qagf9GfZ6@zk0W~N<d2rAepXA|4Yv(n00H8x6AH!z*|W1hZ)08%y8|ZE+8=w%V7+Ng(Yhj;3q>v z!QC%M_N*%_WxdFwEi37dZl|QamA}I24EP$Y3FM}Kd6*;5O#4K2dCXYv+p>uXH0_xd{KGY&qNK$J^UUg7LwMYDhX_G5H8 zA^#S&s}1S}IsdTIe$O@4brCxWsBxgn0SzTYbF)a3=@Y1yD~W{L^$SxoEC$7&Od$Z> zhz!YoWy^qza^_e|go|azZlm8)U!g9E?QzUnPQm#DU z$O`VbUHH)k&TdZ)r5^X*lkG|DP5p|4|H87rmhEX zeyBIswkWomPh+*Uo~9*HL#PH5{rC6E}!HKERaai$kGe+{$fckUm3 zyQF45n;h^dRtugdc#Evbx?Up@ix>D*Yu3XB(AH7trgi0T!REejCNhc1Jmcv+49Q7oq`{tcb zq?CL1BqSs5##eDXLY%>qQztIg<#al1*5nn zq@mOS9joY%_-TzwRG#FM(no7qu??rj8XBEa{$bty(zrX=IuErN!?4_wn}zU_nEN^N zDKcK$HO9CaoY>C*oYE>h2J5r@_HMOK55Hu&AyhZQStMq4uwLX0H zXE{m#(f!u=0ZuPIW(S!*S_``A)6HFHNW3P}eI+$&QST(PrpArd=4yK@u#nSw-qr2o z{5IS#FEFxQs`D()qdS=4&Nkgj-xI?rs(0ar_=J$P^r~#3R1B z8C>$6_|*4sMwxY3mn|8fx}_^T^Rc*dCnEhPsfyrsVXOZF$y&Zi*45LdH~nl2j*1fJ zu!?c*XQBT2(RBd`z z6W5Tl*dz%WOels_I<-%OlP!9d24z zrP<1$!+BrG;$-8=lJ90jur|+XMGfoJyaA?@UU1=jN?vzLYv{#3=8K`Hyp&?CtBcDT z0z@HlfAOs`)-~_-0!RQ()bv{BEjwJc%Dlga|6a;zx#F#7jzP@s38P#5E=2r9iwatX zbR;A#J8lBb`Z^PcgjTd&RwnfZu*>i(_ETflg}o9*k#%e6WyNjh$~DBXhPmuy&2Luj!ie*Toh78htE>rLNZ%0S#Y_tA@=jso|5Finu=gYSUuh4}L6b@&C8IuP5{ z{cq*vgOENzsP#pI7qPo;2wXO?_lHBoe0ZFl_2%Ql5mUHzm`aP;^A6*ISEIL+iw`-F zG!2uLCOv_j{y2F4s||^AZ-gK++U6s6AYh)%FvCk)z{iq;G9v(RVyr z_l=`&@y5$Ci|M6dk5fxIgrIhvBNU+B^BQbW*388I)CA(Hp>&AuOtIC|L(xexKGEQD z3upL6!n$TzF}TTgClN|lVWsaRXXN|F`2AH1x0^&?#O@kBEG?1NvaLPi1xAGTP@0yd z>U_eD&()dF#um7Neg50bK^hTI!q&$XdNbM+<3CbbMHq65v!6`DBR#~pM#eR(8gbs^MtH+D<>h3|eQR2O7-VVqEk zeq&0U-4M#}0qYsI72rWO!%)*P)jpScnI&KMTG5EQB{F#gHK zZ?%!{fRY`1v&;1`k|fJ6B}G2-{LDnr8yxqW+2YKO`|i>@byWUPq&jp#?)i- z8ppNnyO7PD1yP#=tp(Wj`ZrRL*O|Sfp7V%Q?jGxl7cCcu{W66QX1c|%E{*_>bLMN* z8#7m#^%#u|97FGrYy)R*dv}@L+v+U}^9QJ#&kW73hOoIr+ts>LslF_=jf4Sd9}dh< zXZNZ~4m2~OIIQ?iFBkl4cu(Q#_h&!<$FCm zDvVgCVCLWyx>Efl_43x`%;BB0pdoN+2~ud%zXxS#Fqwc)9FSD!pHi2+y1n(PU{2%5 z9|wF}vNMI^2T57bmrfHDS7SuV7jwrwXb&K6^vzbNcm8}J%M@lsXyC!+p*9!uKn&x* z8(h?AbMPJp2qno^M8ITtGsMNTn~Hot?qT_>Owbj3E|m>=UaO_CKia%`$Q;n5H>wx$92qC zma?TvR|HSQn160R`H@g(LQcv$-P3ZTR1IpP-4-1cDLHwq8yV%eJ&YG@$d5T$ozh|;D{Eu45e~Vy9IjlpPo6 zN5d~y!WEc#u{ykRzL^UUu0Wd9-TPi)M27Xza}tLSW^UHRIs4`GrZ-i)c&iQWmqVmw z@QlORel`kCEY0 z2HNkvK*A)*366c=D4;y4M`*G^D#qT?Kao;u`-B)WoysVgg!uD5C^P2+i&2!}DRMuhSxZ8e1aB#_} zQ;?|ruFe|C!ofwmg8F*n*bD_{s{ox(ZIdABnwm;N+=^hmE9|4A;Vn{~RO&=czSYLK z$WB@O2x=ca7<>6KdpX~Wf=u|Kj+&Q)sOs2OXvy~$eSHscluhD0t*QC=H2rZPMQJLj zdNQRyrpzxjo*|C-;k*P0(o*Qzw>$7T0#y8&lKZ@RzL^=8m4;aDtB8&vFcvbuIQbQ{ zH95u4FDNC+uB!@fc32BO+VP?mS6Fh5vEPd3c*n#5O1t^roC#X#fM!)tZOSm41 z_m*c!^DvH`WN+!x%j;dRwB#26$vJi8QIyzp=BF?!Gq=R>;6~f>s>XtXoTh^+^^@$O zg5VOuKo|n<=GM7ezC$lGKtazizg2Vmo#CVR7&25m^)4qs%6m~!3%I78%s9>+Ye#~yPoQ!z@6BOL- zQ=jCY(99%vFb&^8%XTx3&53%FmD!^p>y1(viIbD5dG4j&Ik`>QTk9>Qe8!!0x=c)j z49kUg<93>qR7v;3cFUW~Z^i;^A(dO3)g+>Iub0B}_(wvUzEJS~n`}nY| z()(vCGD&#Z+nO0`ZJtCDj{M-b3cCZSiLHWgoO$LFtFDPadFC=^czFYfqmvU>*cC92$iz_sW^~48D*9dcKe+&reB&dA5lT7hL*4*5 zKrbr1RFe`O;wH_iqplD2J+$Sdm~dU7Cm|6Y9T3>EW&_dy^O=@*7cQ6bxg7J8WD3Tr zR+qio;3NaJkspgvv@z!KewjahG!>MVvN4Pyxv}$2jEg!Lbwj;pn(%TM&uGRB{V9B$ zPm5m+mUlE68u(#;?oZmL+^y8#3A(S5hRq+@fQ%Fq1Qk%#dr!qb$gV%WZws5kFm$C<3Jkd<6^6IQpBU@ zq50Iby8xYdzvD@4U=xBwXn^ zc9n_G5va$&mq7cunGnK51==^*@%H}qsH*uz|H5E;PwIqo*Zw@RKN@2hK9NFIiFoxcQBh)|AulfsrTW#r>eP z)Lgqc z3)+x*4Y`TvmK)t{cWFstwn`!up!m_y&`Zj0;ZcQXHrV`xu7S$fLcL>8?`gEtUh65= znyT-vI69k`S7}~us1wL0B%roH`3OYGi6i;t%SmKtYJL;rL#0+P0BKFo4~~A$+QZ@2 zBj#4n<6Tg$0#q~6Z%A+NhVvn+C%2^^ziDiftMyX%_)=xcMiHU6JT=z@8je5rGPiCB zxZ!=biIKVJw@D!2f`nb+`K8@wVA?5y-5(ick)>N>uM$f9I{;m0G7p*dwTryoJ={Zn6_xR;$y z*GAxC0yu~JjBrc#HkGD`<#zAyq&vkw8q6#u?q`f?sd`@_>s>52E)()svfe9r0Fw9y zC?=9&(+3F0r>u9r6%Q;?Fff!1WeKkK%0#tNkuY&YDSZXpY)i2Do~)){-7DujN_L3O znOD~7SG)_Mz;?WXOezUheC+rD(HXC&_YB%iVkx7v)>xr_bv5Z)CoQEohUE`gpEe`? zw7a`|EmII6UfR?I{hm+QAYXEA>Dc_iwls`14lwml*ibVuo1(si+Ub!;Us(S2A_vYjgO%{llFq3M3egE3S!vlbwSE9sy05B}7 zUJ%m0aSikXif(IbYlM&3WseQU`jc-99BwCR?3+${fhDw982c2S>i=Ao<+Q4HVMQ2kY(aakjwkjK3MqFqK6 zxb5b&gC#0jD7%BTP6_aX*B%<39ano!cXO++QqN>J76n~oI%gXRVBa{~+BZf?R8BIF z2;JFdlzq?EWdShNRgm9SNPJ4e5rQ{2kTj9!^A9=nqyg*%; z+5lFxO3Xlcnw7PNfaP$ZxY8TrmxnF=v{NgI+bclvqcj;3!UCQ`+v{UxB~ z1`CYTUi73%yJZMStPG3cwp+b%(s_jW`T6wtO&J++9{`pv%y69rMBbCmG71u6A(S?zg82>V>Mgb_(JXWGZm;Z8x@J1GT9? zx#xJ93i1z5C0XsSf`YHHOsu?U)>UiCv}hwzPVS@|O%+JSTLyshqBj)|?MW;+^_oTK zkP9Q{%MpU>6`@&ZB!C?fSK!O;`WMud}=q@2du?@+^cAKUS}d&9K0KsSlJK_xYk+fBM}NG~N+^$6Gv zH1~&O;|c+YcqWr;HNmk8eF!AR#jzo-R5T#HKA>lI4J%8?R8Wvtk4Ovwupt5vfaUZ? z$pgZ z>+e2QH7oQ0+;Zv7Kldy<4;%TtTbN3dGh!`QZ0NP{Ly3HFwY6R(Vf_QqgJLmKw*t z{|+J}ssGI^%Va{UXl|0f?r6Ip+t~tmvou^PK|d;C5@?5wM3-{#53!@#rEcNos9d%9 z1r#PIHm2)vfkkgmQ#FfTDS7t4w?!sUjB~aWj4>T(PP!c{ewyhwW4q{_mtxh-s4xVC;G&W~aOq!*cQ#jm5~MkX zqJ;K5>P6fRK|@Zg2U`C{iLL&kdK~2SkoMARfziiqBo^!MZcUgkCn5xOlIbvb{J4&DPbS+7)_dzxPr=l3fBJWOEvAQ>BreKnpj6sOcFi zRx~dPC|@DXCg0e0T2IRdNfm0-R|y853ab{F92GoUF5#S{=6dPp=n^RXIRhwXbMj!N zrLgOMU})fc?eWSzio1(I8^boxfbqWFjG*ebMna&B;67W5l&$Y>ct=Z9mh7ec*!L&H z%vWhcT!x7hVFzyCJq{Ff_9IBF766Squ9f<|UdHt{ACJld0w-)NEGdEzK!5tk+>vs_ z$fAFOX@-6Z?i$g;_(nhh=;;>~C2#T(m}dzgyiT;b>~0Y>uap5iAA*kiowMn0u(M#F zuX&TG=Umw=AUzsIhz@wntM(M4ix%S|H>t182aD-k2R6gva*@)H-Mr3ni*ob)3^Fpt zZ^?=o|8-NYu5t01tn0qpH_B&toQlHX9|eruOaQQ^r^k!V0E_|PfN}jR0@pwIRxd~L z2o*MMyX>yn3%~uwHTb_n)%w4HnSuhIzGcAX`s*=kA6ZW45coNO7F8&Wx*50p{1-)o zi}1fg!}_<(j{pC7CfCfGUyD$HB+l}vz^rK@y^hL_1y@Z$fIQOMVbBIXNl$${@HgK1 zbi-C`sWIH|ccjDQT-d_()6+hxEdWRD3L?%2nf4m&cT)h;+>2*(BU6j+>(4lwcWfb~ zTwHO@*x5?p^U~G4zqo6>ihKQ)14AF4Fsx^KdnWc?&+5LJjoB|2z=DX;DiW4(4Gqju8 zJ?PmrS<{SooBHVTc)hy%1cWQ7@K$4LX<&~U#4*%3Nwh-m&~d+Z{0h)yV;WKM7YP98 z>!Sk=z_9Cvbp(icfmvr(jIhE0DeO0;=z$?3Ej#u(kMdQu$lO<1c0y(HSoZImxTNOIbfo14PS4;u4X*>mG8Q z{3u8O#PC+rW=kigiKWJ=BY}Da`Ao3&9NK;Ue z7su3B=ZiZn%hvc??E|lHtx2Ip2pjj%Xp|@y_B#nr)1;xtTqcPi2f(gg&&&kh@!{ag zuebX)awYks^Bw1j*u(zaCXv0cJ?IykiGr%EMoSHyR%nnU^zc|z`;7w@aNqUnlf>w1B;rC1To>a81v}Mfq05bC6ydmm zSn5=$UGjT}w${CThQx%-w)SdK>ZC+l8drJz*DS0ju_QY?E$Dvo%ju6s20~}bB=Xi` zPCBTcwiZd58UxJSv?y7H5Trgeq;aPhb8+zOvLlIN$lJ&QofzSJ7S%F`@a#AC4teVQ zwBU23B+1~#uG?|jx=ZOP$9ZW`E8=YXs%5Votc7oaU+!kl1~@sn(SN`jZ*6mm37F&t zu#94IrvV1>6GF1xw_TAQ2Zw{);yEt9<9W*q=idmDxq+Sf>D^272`mV6lBfqe#hNK! z4fgb+$YicWux6MAFg-Of`(xi##CuesS}vS=Yp!79G4 za{>j5!`*PQ5x5h6G~$-G+pwb9ts`n?J&&)yZsx#W<_a>4eUj&9^!U};fG#_NvDC;; zva|EdLHJJd`;Jotc6_;kge2*Ow=b$2^48mEZWMvb%am&W=aqljbzAL)5$}NdT*=$-4fXBJ_g`v)3$7f0CV=rpy-RiDMpB~*(F z1=@1(X-^2%)I5WORe-4EDL_;iH$Mga@|9xIX)eJGzSd;&e(g0DO-*0C*lH=M8tqYH zqO9k(xB7@?b#aoVDetf04th$M5<^Ict8|~89kR-%x$98}g>dIIIR%;iUkqb7y{fb} z1;F<`Qf_4c&oMy;?9q6x%n&BAhrw>O+%>6cA$cAg*%|*M=6Q||63+t_z;ATGeLQyZ zoe16c%O(Ny<>tKXe{~YzK_VV11mE!8_keGN3b)+{CW&?4+vh>UZ(u(uHsAh%QSGk) z!%E6*Hsf~jv(=&=eSdL^AZH0yG|V15Uua}>PgAnQoU^4uH6@q$i?VIfRq5Vw(T2!* zpbD>E7)zjnnIiHjIKpL5=pvJs{8<#pX+v1D8C4`}a&Y=z-|K9@+#l2Sa*&jy5!ye_ zJnVuGL@_S<{N&8UPa9rl5tjh>5)eU>p9$;S$$aNjf=>FjHm!)|B zC>fE{U?ElEd^G)?O-=7>SJswgq{xl7(Cv4);>yFs%*+rwx%Z3fX{rtjE%g0TgaK;| z1HzRwK2Mfowzm>v!;!{o={?XTEeHFL8PB z5KCDgrQ4Jx8`<9UVbb!cT^GmGyTSD?&eJGb@jsDwTMy4dU3_8tb%lGE^Sk0!7pDU( z2BNb|+9{#5Br_+!>wr{McrSdHN0N^|)Ea=0Y~==z_<@EZg4EWHe7}`&Mf(Y{KMEk% zN5{=vPuzTG6*540LzcJ5aCF)Up=Ov%8J(LeAlx#wnD1UW#c&$*c)tdBDq6+sGADSs zcRK7Vq+!zfC(ue!n6;L9AmjD(;-U-m0C9?ygZw!Lw6Oj*hEY7S;kd^4h+Y-rwN!xf zrP|ZS%AhaN`cwGHG0glaM&oJc57q5tvpm9A z6|0BUq}opI?kPd(qNRO-3yEbHZ3NT!T!g8Vrujx78%CYTQgw024`<-%pd4SGQFH^B ziHwJbcJzGubBklZGhbdjC5@g`KC$8~4qJC+yP`;BD7&MJ)nc>wAt&-IJ+gEB<>74Q z5z+uVv?z?SHKH2(7YCmY)AVvZ3LQSZazDOX+=TEr&w{@YZNjx{uwmGnE6;mzZ+$a- z>{k#isNK5={0!Tmb}wU-*V5eGWk(z>H&~A1y#RWl!AJwP-&T#w)Z->cecMM}H5eUV zry28OPW?Y~9gR9zbRqy-tJdIt-NDl$T2;37scLr%ewJv2sLP0Xu8u+&;6f^Qo12ba zndgfh3;75?3>oCqe;m_C6WJ3dn}L5|a*s^+H(4NF?~ zvZ)^pMFf{_i8n2wONBFA*ZT5#jUaG3WMkNLbFxgWR?tZNwffz_1~0gflLs{Is-&ug@R5w zX{1$1h*NP6Fbvh6LF$#eH>anm2{YP|mw?ENXM~#d`?%%YxIpiES6g@~Bcb|8 z3l6rOthTQkFt+|`f$f0-!x3Qd-FT<=$ftscK2QHKdLLZ%I}xBpx|v=65j z<4M*~D|(VVAK;coUJR=cpCwrg*9H*g(nivf>}4kH>)c(A3?@!bg9aoNKNjkV!AK{+ z&LiZ?wbj+obT!+{dQ^Sm`Xtih*6n5g zLQXUaHB-C%DI4R%pYX!`tIrfc@Efcrrt^Ji;=)wcyJOC8J=?kntFdb6m5Gy+^6)7U zRDgpvbKW#bEI!fHwVboxW8+bVVdDIDg3m47=)s=9dJp90v zO~&_dTRcHeH`RF@Plmb3u6H7{a8+klzH(`3I>(RVN_HOX!0R?m3wJ7B$DOxx9)d z%rNA6NN|@RvdIQjGN^SwkbWj{%D24GV(cpgWf8o2&yP(|ta=;SGMEqQ(_C;ho3RB3 z{Om00rjeGTJb z=Phf{qhLBO4;P9aM*PnbglO}&e;7q#ruXr_a@MZRj>eqijOx^XfvIC#2rQOT7P{7sEm zW^hRa{ABRTo~DUUvj9j}n)SrV6X<@D0sDN4IZ(rudS3g+>ed#^BfUVY^m2fL`$K#?sITLqg~H5_JZ8kXEBovqH8E@+T6OKX40bPswi>w z^Rm#>Q>+f+G*bdhO0twaz>kJOjXO>=*)lnrP<_GLniE&ZzYCu0nCaB1)1=4Z zTg8#0RYp5`tXf=zEj7+drBH;!mB09)q$Fw?o#=Ck@F_75`91VAkhXrG@5=JrywZto zg!bP;UkRukBJ=yFY$2C%UA*?s14!ln;ell+AMr(88-*{ns-Wr713BV#1J8a#+caE& zI0A+7NoQ%Xvc*>*bPtfmFo!MLU=TyAU~^@*O2y2`pmw4& zee&fVFq3)Y(0V()di~;X!jQa)=;?lB4botnnJeO?(z1t5&?<{oTD*12a8f(~;hXAv zKODDVaM~y`c3R^Wk@e@QuGs0ANyiV*aXgfb+;sC^ly_RcrWB0H8#KkaP;b$ELZ5p* z3hDg*y_tmAyKZsBOx28rL=eb{AL&=WBA&Cb5l;h%Zof59Zkhq>4t zIw|g1nfNCcKwhidkm~|ufg$H)^zk1AjvNsaChA%BEmtnp zPb4)@Z{K|p4hzW5x;K_tM>rNk5ZrI~& zyKl1djYYQcpKuwosm+4nM@s2N`+J_?Dr(?!z)OMme}2gEKgL4__<-lc%mOgZb62*| z^-VM+-3Mz4)E`_Oa=!#5lP#~2p_Hs$Gl( zd#yJhlMFqM2H~L#(Q!M#xFQ>H1jf)&rHcBd8fs$7M;|b`SZAZuf8b#?5zb3wrWQ|s zUDyA_%;tZ5Iluj9MnC^^Uo(ILP|UG8PM?FYf6VwL8w2nk0=O3Yk~m-*Et2Qg`PW4M zUpmaeIyZ^am``3fNWCf57ED?y8 z5poT~;fGq6Yd>htU|!9vJ6BQv8r#HQ-=vRm&;JFIquEnQ(MMk~TsEHv#u~v-Pj)?? z)@}HWW-7m+tG8XeRjNwTe|d0av3Hp}Tef!@g(%fO80U5M{H`EL!LZmw=+UDLDgis5-tRP9wS8py9N`i5CG|s~1XgwZvmp+by6tqB`#P29 zw&3GuJ60<(sW$0r2G%HNpDWpq7oYW*>|eW!T{37@=y}{-9MzjbW4*+lIDH#hcG+U* z8KI6)Gac0g2VE7svMu&jo}E%WYmojtPtaYw6O4Zs$D`2&g@QXrRC9MM`6L~*4^me%j*fvJ{*|v^0x?&?*&`Yskk^-X*?&Vb&tV$Zer8nLq8A%3Ttj91c)aAQc ziv2KF3g#cxTa1F1uG1k9O!$qx3YPMtPDq$n==j~JN-xK*LbI=@e7JB|oL!|5`1RkC z7*3-<(bcPURY4qSHY78v(F=@VyNhaP{j~M2_Ign%NzLBEw3P=2lw>3*VOH=c?e9J0 z0J#3}!@!HXd9d-zV5n`FP8`|&=?G!yfP_qd-SJEndb?|V@=?wGM(glXq*!V8^!pQB zx#i*rdR)h=FI0qbnz6vvT1_v5Q|U<4TS-5Fk%d6k;;B+_Ako1vKu7c6rOFjuLl4)u zlR(mjV#Us*ABAyD)KL0z47e}(4aw|n>cH8$e1ANtEbT(g&hh>^O6GmwiC)k=B0t|E z3rUHR{CRe=N=V7n>tH0v5o5Ect!3c5r$kM zSK&N)Q@+nHr=MHL8Q|^n`8IRq{5z4Ul<^P*bM;%X=kZLHy+a!J4PQkv>bLO`T=lMa zPOj~uX#WUVzqjH-t}y|A%STb7|44N#dC&6n@lL+2uCI$K*Pjh}nU{{PMNI{@N{dTy zs(XXwxfnFtid+wuq>V$=om*lgEw1JU%300_)Z|3guPPotIBDG{-H6L*dBR;T?|JGC z$D8A_a}MWrXDWsX>$9wDl00rTxoU?Usk1!drHJ?}N9a7qw)H^Y=g3yv{cV=pw;j*X z%L&0-w8OeYgcB9_YwksSF8dPmrDC2K9@xASCD_o|d_ytjeDXUEBG~EEx|BNv7C2|c z)TMH2RCT7@}=oMR$6Kk4eLj`$TL*&Qomr zykVid&P9Y$G>L;{!WvTdlFpveuwt}Sh0C0oia>{J)nT$BY0}lEQeZVCIR0_vI8t?K zx^e7mbf=bpN1E{o+lQw`teB2+qpTwi`Qg+Z(B=D{D?Fv(dsdvM-FK9yXSwPrGnt7Rfnr@AcG$$2X(CAjQOqoBP5_O72s_i_oL$RIk?6XOa_e)iZ(}n|YvQFepg5fmMa?bq2N@Qg*plOo zDpz4gvWU;Ugxl!t_`}J;z>z%*kFErbG#dWlQ+LQz%^@+5hAlMi_oH;(M?CrtRar zRO3g>s*+|_AAi`m%_C*ytB%z)gT64@l*GEcrJ_eNm2y+0*!T43*S=Y#mgDoM%DBdM!D9^s`Duuftq-isDfTS z0}mZT>=)Ap_sW`YPpH!%q0)p;+-!^WwU0b12!h1PMr5}tPw4|Y7=&Ojnu0qKpYMO} zcug`GP(1haOl$V{l=l3gA&k6n&$Us6ufb$e(Bbt0euxAb3&q(t* z{U~Np6Y#~xvBxf^$Nf|A!h_=QtJel`9+e^J{uNrwFgaHJ!=0)8Qf`0DM1Nt*_MHKN zJi>QUZTM|ov530Xc*y6PZjYhxJcaF^kf*T7%;Jb#hTgZo0-?CDwc32g=a}DP?wgy6 zNKS@fU^+C$R;@woMv)*2x`z$AP`SQmLEknCTK*bP;(N$r&rCz6<88SmK#-ZO7)=Q{ z{cFb8QcjHXqw$GaVuu|ChGYu}9p4e0sIBsz;NposJ_T8T^MT?`aE=xSTc)>1C!YIP z_Qx_F`YGP?ukL-4W>YOC?ejc3;{mGiZDU13`&74Ryn)_r)$>%EMgjBin_Ph5yvGK# z*t+7_+&;+xSc488fCIT=b19j8diF)f|g@to$))%EiErt zv>aqV!S&9w%;QblP%G))MuUBF?&oWM`mVoTb-;2O4^Q~O!J9fk8r@NPR z7wIj>fCFrk&qVz}O-s}i-m@dh@Wmh@{f=|(OML|KhYBtOL#QwQj(Mi+3mz|{Eagd_ zMUr*a(c21@`>!@~-T00_*n+_2U8aO;Y$x}=_mbjFKg^m-Kde--an0sUN1#_+FuY$iRPM&V z%~|c@3?>TWalgU*tn0-ND)En9r!7|Iw=@N2=1)mt+CM_RmE!z^fb^+mLkg0@?^?Hc zHgfBLtbD6kC2f5cp)8qYxBcyD7=7;8L%P2-{R$*a|9bo|WG5U0?6^l}EMRh3Kj}Aj z?%jJUb(ucR>_;j_;zWXBXHfgwi#^xP>-o2>eFuv1mwO5U9W9_NA&(6htr=E?q~W`! zAuh)ZQdu{iOi21B;-y$}{w?wztC$W3qKJpoOnKT9lszgGMf$(3hc1b2yf8eMv+tL$ z6b^Y*U{E!&hha;8Q3!Z-ly4J$wN~5tfc?b^;=Rr36J>qNWB$6`ci9cVIy?$M-3Lm&oiIt??>k^E8jT{wxmot|5FB6$wcJ<#dlOuceENr zJ(kyeDD?!m5S}kD8g&^f-4_)<#0iQxDu!eVye5RgR$fLs7(p%Cw%Z zzvk1&FR66#l}S+r&*hWK6I=a0Hl8T@f7yPdqw-~6L##o|^kjLHL_p{%H%zvHq~}Sv zep~J1V?HmOZ*A0$RqGR(E80v#W?tUWo;(Rk%KPq}D>FO%TAYePHyOwEO)R&n#w)g6 zkp)?e156rNLMh4B@Tn8$Lh~cnF~>UV4)!;UPi_TTLwIZXgfe;E=IQWB-u1&1$oyjG z)UyXc1AixaTO*J3%VQqxH4&%qncO00Skg4H3j{wCrj1$^^c>J7iLpPclmlJJ`*0BH z{TZ`Txca?x8FoMOAxktlCH)d|q&QkrY6CQjid|qh{X+I#lFVPm%ysnb;kqB{VBP|4B+>S@m*?R(9(#;DQdp#SMiMde0e* zi%#8whg7qV%ut7om@g8Ynz5{HTZD`@hbJ;gBKVXpu_=v1F0boKOJa--tDeJ>56yuE721g z@u9(%9kPlG{P`|)W3XG7XJqZ~cErDyt+$6fpl;Z$r1zEb7c0z{Qkb)Q%kS8ZGtQ8) z0u9J5-ZqXBYFL&4DyKXc>xv3pvczF%Imlo_n9dF6UC5iq!edvo`=Qu0QRul8U>+WU zTeJwB^$(uaz@9$_*E-p&F6vMeob2zNFrAZW0b-)Vf{8}?*eU#+A@`MeAi(;J*KwF&GO z#&c%T#{LKyut_a+E2oq`D$eLbpDuXJJ6e>R+6u&+{HnOV6IOLz&=VA)gPN_~kqLZF zFg`2Ha0Kdl@yWK73bei&x(6L;?H>0cUivow-`IQWxG1A&T^JJt0RurnVgTuql*XY( zT0**{yE{guL0UjSK)O4IMnJlAXr#Mis2RQ&)YIQR=iGDe@1F1eKL6M<@4W9jJJ#NN zt>;;Lt#{^tsYRRAQPZul!w#2q6a5-xOerOy^;Q*m%sO#9@{gKm(Ce)(%x{5$mzhF6-FX$j5GEJb@#L>Q~T+8O38vX{n=f zbShQ%5w~>wXV8zBhGJLYh(1VFAxK!PXq0L&IrfMk*~PEljmz_{kPN5*OC(-g{N+I4czm;vs?a) zuV>TVy2(-lM6`w~)Lc8U0q;{iuIlrU*?Pn>6wah0e?oulj|g11d%$)L#{qx-w{Fuv z4A%dPBwf{hIrop$poMu@)p;=NHu?dlQUWG?q+q89%)@{nbuw#YID*h@r)nFLP>?Oc z?>}0wnC1U;(udgXd{`**AnEd=X{qY~-(74=En^Z8&RXPl01&+D!-pGHi+`qC_vhao z`$6OJ$*<-knNNN0bNfplaRn4>9-wiD{GA3>%fLaI*!Tgk2yjPtBW?0OqVqtd z|EH(U|JvaSD;CI<$+SDBbqj|{XAW`K?M;5;Nhs)v-+m&KP>{jPUZLBs8M*BNAa*oH z)y=;bjcGDFe2S+I@7_L?GXr$Icwr zU2qDmT50{o^M+ zD0R}&#}EmOaeuU5e`bczlI13?zA0xa=Irj)6T{&YBn0*@K&iRnMPMo zC!z_uUzupJv$=m)gkAaRWQT7%}uO!TjA55ik%s?lq$Kc6c#L> ze+35`qI#NLej8$nU(UC<7A>H)9V1KF#(~{1&KYP8==cDe)M2KiL%FJO#63Ikg-rU* z(;rkmugCH1ns!P$qHm6`g)xN>Jeb!>&69RLYK|KG9!iC6vP}yz%ueURIL@%dGhmQJ`=tT9T)cuU~~f zyRyYHJe+_5-fQu_aRrBJl6uVEqZYz+_H>q%hL5K(YZ+CKd}Stogj2gjEOTOps5jb} z<|q&tz>kTqH==tGo_wQkCL?Yoi8gy?R82kNBz-Tg^Nb_h5&KLFRldNRkPxrtbTKA^ zP9f>*(U5mKO2JQHkynE1&gj8KcXdN=S{W|DES3C$1afK86U3TYOaeI|8kW}FkE4lZ zOlFS0#x^L*QTAIDX7Spe_P~(8Xgy}`!8YEUE6?7y=QHDAP^@9?ruzem*ft=2J$h>x z_{}PIPP{;uP$0UI`u53UI6vD)7?vulv!Y|r^Uu$|_pgRc-`Q_8 zq{Xu#4wvxDgFKNz;|9_U4yE+lUxrGjhDvaL0b=9mL(@v#z49rorU>TUDSL^(kRgA0 zc|W{6uA6myp8L4sx4jxFNi${pX^Jne$jyMw0@F>Rj}v#QT) z>SQmAwgZ5QNwtNT3Ts#qb}PX`FDxx#O30GsjZnU^`r<{D&CH$lvE3VOFp^WK8R@y^ z0X7BvBm66sGxh`K{_+u2r~G6A@#s9?!*C9<1A-$b_m&y^o{8)ey`XO#f1%1y6tBwr zT6s4~AH5Bk1xeV(2op{z`fs2%g}dML-^A}S1#D-CoErxykC>;sE$AMPIf>|xs5lo5 zfe>Q8BL4pE`0@V2qui|(XjOhn3CWmS6WCPuuy6YfGf_GLw81X*q`~8dlLdHv&&Q&z zY1tMFMqcDti!=pL+R)SaRhvCZ3{g)}6%i?Q^y*MRe0O89KqgiX7Q>0Q7Nke;tbWNR zkW&pg6Cj)UWd&Aoo)I~5#!yRrvQN%f>>W)~+NficE&%$5QnsNgM*>{H<=*^^;BMNA z9kNW5^YR2mbg~_CfWL}t;4dlO&zS$Jb6B#UGud*`iTV)dqZ@ti8rRI}(R=8oWn(Zx zwZ}inHuvkb4uE-Hf!8Tj{hqh1Y8KU+jTIvh&_k+c7$P!*vrb&o1QpZDu@tX6hwn)! z%aPR6UBQ`j1YMbXubc4WD@CGTQ6i6UbsY6JZ-$jVQkEMVbN@BE%6898Aije5pHS4 z2OuQEe5p%8Ai?M)qr5hMITl{0L_dVP*j}U2@Rstyh4w?=S)GzI*Tl7<+2ar4A6dS7 z>+F7j8KmL}os1(j3ot(j+WW+nwP_x3(;X1X@6@J&s8IZV=bX-QyEtY! zSXj&@p5}Qr`1@1lfA3$xdjngxJ6po<)ow@T33GDJDl(8SziZ$g);vh5;BXxGm2;9_ z(;D)ACU#SHFs_fByqp+i>gAarJv)Cgck4`hT0POWCBLX|JUO#(?_ z;Y65cCaxE?hy<2EZkjpS3+*IoO0i~%@{J!WCD8T1z5tuiF);a`q!ld^(rgj{E5Ptei$J==Xktuh4R-T`+>P}Pz}!k zdTecECnI*>k#9r>6XwMljQqt}S1Wfd0G6$hk{FGq&I!6sA?3BY5sXq=uTG4T%xUN_ za4Sh07IM>h5@ZnRfxgFF8OxUviwqubVzrJdwKjuJhd35Ztk#rDX}WpltmQ=Pbl0I% zpP<;XZm+*4{FQ*<;~@a&Je!R393aB*6GmFL4W0KmX%-3&ZPf0-;812i{6ZOgAWU}2 zB1ial29q!soN-3^HUHD(*K}Sb=Nz$cvh!B{LHtOFTs^XyoxN2QD|>BeNG#>fB3Ubw zPW2%-Md@*n|Cf=5Ly4$F4yw$r84NAfw;N{Z$Rplwf{$ICCi&mz20qLFPJ90LU`Ae2 z{SD>4E5Jf*MJ_Ogj|a2>{d5q>$$`rFx#((cHq;EW7f_XV=tGW{6zkq^PVyGnKj`Jf ze~N>CrlG#$cot|8%&_*E;S~V&at|$>jHWh1>w3;0N{zc8&Z{aithNyrlOq~p7(r5N zuqmraGaE(sk(zOhl%ANOTl~zMfYX+IB2JDbpWr zgPuX3kNS{5_D)6vsqZdgE*v=_b8Hrj+(--0k9VMnr=UMmfn z9bmp?blDDtXg?F7d=3P#S~zpf&b?@x+?iGUnLn%Wg0r_nXo?3t^>|FuA(p{8Y`+r< z`AIonG;FFzB`|nJ7xF!dt!V}@j<&KbA=@&RH3tI99eF*auAR=yMH^&Z$6LgR_GP^b zoWgL+C$-Pd&+iG-*Z%hd<)8TnE%SDqzXyh6wa4A^(+4)50fyu>eXruh^C!nVnb~Cn zWyVbex5&v$`gJ_kxkN9AW>6)iYu?5|UG&hi^`pl8EmOFUDz*EvdFR%Is1!QJoxeio zbKLbCK?vo0j!I2kTPhb^XI)0X)Hz)aC)IGxhZ48UV9?x@Y!7V@TIwIP<}cr*OCF!< zGkQH@Q3kA}Y6dzwRRv1&l8m2a9q&c}J>lGNCPjJYlH3U@n~7}) zZ;QWkIIdV@Kn*-etdmJ-c{}-%6-Bm`(@UQ6QW56p4=9$<;y!c6V;+a-fy!n!Lbact z-$D|sDWBdy5jmXrELOj$ty@y@RGOLH{Xn3mF3T9;_4vZmV`4>JJ=)SJw}6~wzmh~b zjTi9Mt20VGgWrklV+I|%dd;z(;g35g7)-I;$zSu`Sc-C-EfyPU$W?h_7=J;o;E85qH4y46)1T3q%0a zsxQC$gsgCNxfNJy>K6h?W)ob!{0$A>0GTe(-GN={B3Hn^a^=autO6cFbWo?DIzg*N zvEP_Eaxt0RgrE-@hv^_60y)Z&JIHFQ+_@dw4_P z^KZ;-K*L;c_CTH3r>CLjHT@%u=h*r6d;0?lU(&nY1sRc%wQ5wecxue8hnoB=R6K9} z{vu20^i!CtoqhqOxafsg>NFcl_b#prfMt&l+Bog=IPe&04=#iAQ+7xJM~H;pdH=kc z2inQ0;7qdvUvgoBFVi|5Vd<(iirmGs}D(2rS6M zyLa1fo)aetC&)OEl_=v@+UTVjoFw>&{za8z%(INJidEC#+IbJBSB`pP2w(96THO`~ z{l5*IGHZC85F)-$w8Lp8D$+F9K()2Yd|GuG#Y$5n`VLRO$cQ0nioV3v<`5(PdBjuo zv?+{5AQZNgmt3D+;ty(@_?y!O1fqIKC#GLAv=2$J^Fu<#t$$QAn$rrDcUogwMOhNtY83$mhn8Ol*V)PaM7$Z$BvOA_|V@4a#Pkrd6ue99oN9BFY!Vq4SNL$}iDbdr!QsYzCiyl`CcZa!4hv3Y#4YO#t#lM~)?mHEO-A7bS)UZdz zOLMzsQf1u!yOxf6-atIYo^vy&FlwAgdCz^(Yh1y4vCZqpky|EFSlwscCfgCb2V=zf z3!7`j0G6!_Q@GN=X^3OBKCFFD=R!BMbNf33NJnVYBwDd3%@8y61Lgz=Z%ME%x#nn;__%*1c$u@o#yYi0-YAa*V zXBzUJIdoRzMI0=Y{(i;sC{2pt8<@1utC*H@I$tDS{+aUxouR)QZ9|r28*RweiEc;)Vp5(&XC93AYFR8Dqj#R#-8FdkZWQjy5DMLh zemoLoAi5tid8EJ6K@=CSN`n>no6V++liVVhSa7!QKOSBlhzz}mu$>%~##tHZQEEAz zt9NW;j-ENTeG{Tt&rS0DnKetb0ZWU-eIIydCOks`+(eEEV49sef!Sf0g;BD~9aMe{ zHtpyY=6Q!`-7Em?e3$URgSSc0u1dS8hJ;`MFY0NJ;Fv>X)hp_@$IHZ|JZv!D!e##aRSQ+dnESlt;^-H7s3-O4EYD23;MqU#I#vL zb)bCaC{*G5G$>y<8N7`n!mqg1EP0!Cqy;X%ullRiMAFVv@O>)oVzXtAS_CyTsK`D~k zn{MWxXoQyGdW+ck>{ZuPa9OgN0?sv043qeTk3wb{?AZCo-yMJ<*WdD}HR!fCO45E+ z`^&&fons%B@v~bG$r2sCTxoR4&6{*uwm`mZfnLz2)n#;!)=j(n#BmrV$!`@qc{g_?LjT2<6jum3h}L3JP5F znv2o-v^w#&7im1;Ylb_{O|8wB_YlBKLWcb$R2>1?<*~fCBnLZq{m>(!Ieb@fS^PR` ze)o&*I`nQLiID=Z^u=BIiM6oKmi@ID0|2%Of_!w>iFi>^9FERQJm?T*-||__KW}go z03JTA%46p0wKB1D`cq;Xs5r5E(s;>o5{D;Q8J;u&iInZ$Z9NL}FUAtWVQbNxmo@6w z)GG_+|J?d0W0?eMRt;|rmHc{g@&qS)tDO>U_pW=!M9Aog@oN!wgVE8(u$oc0yWYIQ zHJF6C$$UuO|cW?&T|n<$uMG{%3fU|A{vJ-~ak< z0F9=xJL^{c%MAg@vcu=U6agCAe?=nx8}#1q=KUro|Hxa$$Qql`2-A&#r~k<1{hPeo z|1U4Ud+a~dIR_)aX_XIE8vr?UN8n@^U~}HqggvtWsLFClrmB6cm~74VZcz$@PhxQo zg1_7&Gy${AQyHh-8-T=q2htej#3K+xq}iIc@G70>L``GR(Aq;_GXlV=Rv;xx40E6Q z?z3{USl}2casl8ufk3KvzVT&>P#E}&5t0Uf0TG(Gv&;J$r|k_uo~4ANb#r9)eN(Er zO?kc24nI8kB`g!q77qKxrd{do0`Q(AO!~el;eab;aHv@4gJ5<6LRw+=!4u=O`vVX( zw2`Y*72iWb1ySBZ%lDTUPwv}MqzO|PgoqKM2Y=xvGpaPccc-XCxV_q4NDXxCIX zjak0MXeiwz39wyWFHok!^B}znH(VYO^NFUPn)8kY*7}O86}R#Y0$!l~U?*A^9Al=3 z=WE!b{G4}oQF?P1U899s(Z{Oc7f&{nnUj7AQRD0gGOdMp#Rgy7pI7eNfdAi(>yS4r z^xuB#{T=Y5x*JK^EyG(vU9D!a&o%0=!D7rV3t>p_##MIvbC=s)aEjC<$}I~ zyoW|+=6lz#H-Xnl|5BVD_(=iV==jCqaAf8@j6ubHq<#E2Ku(47@_<&>$?ptT4EL#L z1JwBRWMyS1fxAYimza0#a{Ns~doIldb?Am_OiiW}8D$*(XSkB0k`?WM##h(bj{x=O zsa-pIH!lZg|hi8uAg+b~Qomxf30cj{N_V@g6=`ejp~v3O*fKcs#Y6FD4LGFDWId)-L#*NUHiACjC`uCy_%bm*E3 z1i_oE?Zs?UQDkv$FBO*}il%Dd{Fn;nnmf5ODcSn#!p#HKbPrJ_5 zqv_r*Fwzv6`kUyq8nC>g%U|IN z;yBFTPN?c*SB%f$TpS&(IXP}QftbGNT3hDOljzy{k=l)yrJR-xbNxgKf~PL(D@34i zl@zsdRWS+!*^FSkC+m)!N3zf;1#hv=3?W!u%69(}*X*%Z=AjGqQ~~vtwg+4PUfxKN z+*W7C^WZPi?2m%KJh7_;CKVhm3Z~($A)F9y zwutucHLb=7KpmgDFWU01L0d#$e;i%-&?c>ki$Ae=qLs4G=I7WQw9@wdk&UI@Mz**M z(8D!B=f&ZwpZpQqU0n_4$aRA&!6T^)+L_uzo`<&aJ#m_-g^0W>(BS*hLA#d{weilq z?DAx>7ZmM!cp7<{3Kgrtsq+yqB(8Xv&!qUZU5&kY~r7zcr?1(f;@$?Mtofy7Z=E zhs?e7$szQ9$BQ45*Homc-TUG6OuCUa)bgNf;S*==#A|dnuKsj`0 z?Lr)pPDIKa>}Aplbwgfa@(kJGH_v%^(`y|{b=f02=?n5E7PDL`+T3b9k7ZM$9umHJ zNl5$Ts=SA0T@N8(c`U`wCa)j%Q%hk!rxzIFS;Er+z`d{xqLBk4_mJr#d8pZKb2HnQ z^yhPQG}{?qF5@#WJ?Cu+o(iP~f@}idbB!vq>1)q=@6a7VXTxu*w^JhVy1XNAXBoa4 zKA-Z!4t3MlI|$iBT$p=)Y)_v1%Gjbrybx?2UjytWlw9(QXyTJF0nib13_;xti;qJu z9s8hv*iJCXcz<4K?knwvR!YtKALs8Y6@4U(9uk_|4rZriAH)EvA4WTPr~9^vp;)J) zJ&U(VYDa0C?f|!#A^$!P1qIQ?$FQg5#Xma`eB_)K$&@l1X~V6{KeKM3Wwgv8&&Ba+ zy0wc@2heB4ElFf9ElsNtKEg)5ff{9UXSmy>YW5@5O^sgSG6_L7q|81DK!8gwQ`;BO zXzwR*)0300$Ph!VmQse#vlb(Zc9e{UD7JR+m5{%d1ivcFl;O|4)GlmyP)_^CD45v~ z>C{gT?{%IewQZkfRw}@o-B3{5K1>e(@~klY4{>v{k@}ao@n8%UllK*q0EW^R(BSoN zt=$}c_q;{|9LKmO`uNkeGsB?f!noeX*o){u`Dr&|ltUd(0N?#@cmn{rbJG(*y4oN0 zQ4I0i_+eh+iaZ+#M-IHb2)vJtlMv~?Wy_7Mhu9;VqaN3rst#8BziHDba&AdUUdRMf z>yO`$Rds%K=)2K)9>@1S2Ri>Fgd>)+=?0M6>x6yuY%rjJxX+VazO`fo(mbQh$^CP5 z58Go<{yyN6{iQg7koGxFpfQuwG;w2tuc+0`O|aD~noxO4#1!=lk4Q?fGF<(`e$|a}L&3&VV{tpD7J~ zc;rX^_Y)PIbCZ#uUf;j33b==f%GeTkyj!&IZvDxDyI?is_Iuwe<67znSjg<{_|)Rl zrL1)kqrj$TI5($f*>)?m0vDw|0=-AM^2{wkhOHnwEjfjoihLY z+|DBF_4Nb~*xVkOigaUFZ9=-}-M`99y(!TxZHPywfX{?OH&M@$<;IY`ucd#F}s z?|jzQ?m2}S)6-U8K|J7yM7Jx+kf21NVH;hc@?S=8$b7VxC`hIME)4KZf25TGXz#4R25BTOsB3Tt5kj3R0}+ zuzL0UK8oXPs7h9Z>D%g^>jPlMs{<2`6>32%<`qH|FFMsI>UKO2lZDM-TO|c?Skt1w zwc7Be0b0dJCIlXiojLKv#%Ut#gD%P8j{r^X!zMXkc8U3YMnOCeJZ7kE35cY{ot2M-O(cty-N?q?^me;E$c+ewy-RRw^@pYNj1f*&n} z4F|Nh+63N4Q%aA=ch>*(q1}tkNVGS&m&<*<9i>pBvlsYgN{nmx(o=;}`?1T$@742} zwV9TujgpGH|p@B1Muz!O($QVEck zJd&05oV{gC2dML9XT{S_UWYBd$bU*57mHP~Y!XqT?lAfN!2eu1l{|7)4gKoXxr zdNogY_!As8q~XK8igA7-=?s3HpkDaY5D(8rct+lcHoh%9dIIq?A=YiuJ{ljn`ZB%p zC)Ipbk^k2?D=8;b@0A9iadLt}whi%D=`_Vqho1HQ2xx9=1_rHjEPfY1e|R~G$MIs< zt!t>~HD4XjNID|8q9+0yF6)VEX68pF?WvYz&P`sXdYCI8V1J_t{T?pQdnu;&onsWr zytg6#E0_wt6C5>5KOph8aag(VCLwLP4dEMg`*Jb0+8qJ?z^Z^(n{Le%aQ5|;%^YoZ zc~kZXzyLC3e}qPc1rYibjUUAM5~sE7j^rP{1ddrcy{2RpY8-rTx^2P%^M^?ry9^wQ7RZx^GErZ|SH(UrGlD*L*K+`eoG9HH3uGTr9 z1`#B|dFx~5YgI+`$Jd`EBillW1&Ym^PW>}w4=<|v2x_iM_59Oeo#UZmgvy;_tN??MoZhkbt!m+TwPkE()-YN=6B^BVwLx*+8ot&Hzf2I1?8*K%0diI~)Hi}z24-(SBD@6A| zU>`2xv1R)F{@_h~Tfz4T|9lFj6b#~tjb|<~l|RUIEz@t)DyQH-1YF9MS2lsb1Et+= zez;vLY%{!`7R}*qd%kD5iSm5wmp|w9X#3(tMWPF}_F{mBk_r@SMA@y(g%$2h+e^M$ z#>Fwiq=3!&+^rP|C+{2Ds(a)1%#w+#J3BVQI87f|G`@#N7)(IO>FGDj_@mnz9J&J5 zJ4?u2+O}Lv4i>R{dbGbO@Kb^*(nTl|0ImJmm1f2{cqeP~pZmKD+q*4RH<(P`fL_Sm z6)wO0Q4)tPPGXA5ArB~Uk$?wA_FDo~0+1z*uzsC4f5viR&WC~dEbHi>QhjN7!fh{EVZoc%Wf zy%;CYQ4fV6Rf^&PaBh`cTIRS>nYwBDm2czf{{00H-!eS{v1lKirZ;Fgn10RS$tY@+ zt!FB#4Q76HHXL~~^c!cUXG3v}w!_)A-O;Hu^zu71?jm#xgM8o zoW`D!6HaLh^KLlf+qnMBYLVt&n^JPNWpJdRHqb3bk^Y*3R`{v}*2Q38T^w2&RuU=r zK`kYQ2kW-2ZFd(ZCr{pX^c&+LU$~W`ZC@*s&>PXnE3Rz()E@qnf=l~zT`EjkIS0%B z(0DS~QP%v0&+;fq_R9%LhmSZ790anPH@Y7RdkL=$CedeF545QAI1#U3+ZEk2t^=J8 z${m2Q6|#9rb0G2Zw|~c#f78{0JT$Z+;4np`!nb*WUK?Lx|DV(6*;NzzlNF<3%j5S% z(Mc)uKj~b#v|Z8Tk+ni#;G9q)a40;w;?bxK8jCtMpeU&qo#Y%+rw$xUKE%Q=l=AS? z{I@? z_!=*|aW-W=`dqyam#2Uv5v!c)9=l>ry}eH_+_f-*~&ue*?|(0f+jHLp5ti>OEFU9Yf!{RRaG5A1x6y z6*NA>d_HA3|FXO-^_x;D!)~16NX}Z;hwm$w%T1p8d=6 z5t;?UC&}~TO--B7{ZPSU;~GCSp{|Qx)ATI}!HbK7q;fYh^@##aTqpjcpM~xV?B&Z&^8fZvC$YZ{wFA`b-yZG%V^!WXMWFew?6r|tAg*(GqiyGg zT6s)tgXFpix0x&47}O`Wc$4bRQ_XPs55urFegDb4WaTKu7kv~2Rto~(%tHJYBGWbC zpu^T%_e){;V2`stf}mlq{1z}n&4HQ#D*~lYnZR`^)srV0{xcf4 z#Reagb_E{dkWvW(nq2W70$HlB&`5eb`{oV8#d=k!_P*?J_DbYyFeeTCy>T1We&5>Op z4H$iz7@oX2W_Eaj8U$-x;W5ZtBZpan0})s)o1?@NQpbZbWa6-)JI}WeTv?t-FC}#_ zU)MH8POUF5VePnEQ*X{ZtQyrM7@TUchxmmTr27|FVI@_FN7&F%q8an9-DE5e^RQr0 zc37Jnzg+Louw-yBENGbXv8;cU^c5nmTTQ3)wM*pI+RuSK_tmv~>F+__;mu}K{mgYo zhD==XK?SmKF}(7m&j+zI+_SsSbMJmj3XDiT>uTzBkzi}C)9bn9`EcAN`(g;eipTI| zMffSdJE_&8kG0+0G61*FaG!UuG1pt`tktV0-~yjsA5r8M1Q$l(3y&R0Vi&erY1PYd z&&`K2&+-+aMh=hEleTf33N$J&mWVya^TXcJq)E#`=p8*lQ6+_$woVSI73^$NywU3C zr{&wM)D?Xavu31>zAY`K1OlF@_Qtv>qDlw+!f*U;>1WANpVyX~dU$makqOwB$w1u9 zZ@azd%7vs;HKKzVHTDP}JYd8!h1tW_6V~bOA9?o=2)knj@XNgrd` zbxgvyKd%Rfv1YC7vApx14}n%*)zow)Zby%Ll5f#U3}N?8ChfQ#&;3&h^ycfaKeb({ z=2|-@fG?Iht(WG(o7O`Q`3Xa6bNq0yIAqhtsY+uj(epwhrO?a zY;LtEvx7pf@}~?5pZwtw`Q*H6is#^0yG?AQ33aYVO-uahx*U@3jI?PXdW9hkE?K!x z20no&G5~2pe6jyHN~1j*lBl&&YSs6vYVWjOaR-ux`E;4p;rzjJ1bwi-cqUd`kkvbw znwp;9N@8-;;KNfXZ8`$6O!&5%x>=efQy-y45NxuR#W`%Lk72f5y&VUUKDzd@m|-Tk zp_=m!;*@dz2bMV9r4pN}Rb6Zox|VbCRQ2M}#0n6RL|DZka(gqqsBx?I7Bk=Zz&Je- zjB(r-F9K|O&*zZr$sqW6c%OLgZju90PPNyRjd_W+`BGK-A7<&43f997inVMyp z(m@0vuq*aYO-(7t@*j0ITy$;RpBKFFyWB;c?>ITl!ba8Ha7nT+u!x=KT5_O6M;YHp z0r75(k72GoXiVi$w;8@IAN5!ey3xcN6}vUL>0vPBQs#*w(K@@94>z328EPgfX+Y+wMeD`(Da@@H=AB7{znkp${6)h+K@pukeA)p%9D<#yuopH`N;Nrx_aiAPyc7}$6pOx3VmifN*b{|IeLZ}1LhHn0&%_i%F86&MxC zz2bZF;yguhL`hEI@rxl4WeAmR>6-o*t?EymMx8OEKJRG{zX%GZ%Z@6bV?s&i<=6 z5t}KhP@CtxcU*RKQ^WmWG!wLWXo34=@R3g$Ev89_mmDM=HluO+ix6xwiyD|xvC7Cr z=`AK#L$^EI7LF#=9dPk6+e#_wvIF$X-d=w5I6r1&VyXu^RvWb+gV-EbI50oWF7!Og zJwKj4x8QxZQ&)4|v4ZQ{g$YqQdQ2J{x( zCGTIxOAU6VsY98uzY~d3gbzf4Ya%$a5Cv5uIliNE~nO~&_%k1dq+|dNS--D*|T+*p~ zHA$O%*1LN^PTW}OgD3KgKK3v?`6yy72v*DK1MqP9nVnHvv2xq&W>1~wy7t*C*9BK5 zZ{b`m2MUpZ2ah<2O!6}K=S~&ju+j4`XJdMy9$RMGHSVXj$#VWFQLU*y;JH53W*-g- z-$^>N2ko-#7zwbZfHqystuS)W3`ZNX9uLSVRjCjDKX zoGy<@N5I{eLRFE2gv_(AILBCEXcZCbh;QSHR$p>>Gb+4Xatht$-d{{Dc224p@GGbw znZlFQ&I*0z-652tmSQ&A!&+Ey^?Dwyi$$6AmeVFeag7E=6EbV$;5dD9z;Y8@K5#SMeAz2K5glCl&P^m;$Wp6*x3?#~bY|-OB7BQ`#2wf(M$@H_G;-w~ z(_kp1u?OZoG!-h%Ux~)n=nVsD@doL!3TqFzN+UE(@CUp4>JSK9W zU*~2eq#DdL3{j?je#)j-#ll)AHu-U>Z~jMb(HGZI4xTPqQG(E6M>5);E2}1_3Xd81 zqrPfjbHL|4({rAIWj7blaL=}8@o-7nMN7VHb4~)Lp!3QmI-qm*nZL)J>FE;Gy00rM zeyUFDJU1TNyPXAenn?h70?(&x@ik3ax@h&1rlYcjpIm21Eq=ZFWG9v2lNVSEN0%i^ zM4v5myrc=__JkT+7W!c|S1mH5#DK=;8MZ#ZU5U@Hn=EyRmLcyVJYORYy5 z7y(qhr0etDjArSYyZa)wb)czQcij=}`Ul`Gfnc-TLoye`D$x#L0wLP!ei6Dpo(EbtTmFi5Hz82&a;EQ z3OUz}9*tK#sGenkHOJ@i4A1FzG`Q62eh5m)k9_4pQQK>Z91uCMMq3zi96t;SpO9)mOKaQ(5S_M*y|CL?PjY+PI+2*@jC3 z=pMli0%KI}3Ei|$wJ#^{Cvc!N=*ABurRMi^{F%=D@{N7)O9Jrw%le77mEJVN=G8T& zjl1|InN;BU#XY5$;J&@cfI}6g&)>#$e0w#h9^XZ;5nkPd9_cf2ML!496qamA?Eqg( z74nAmP23p^C$#uZ2yQFxSlf8JkGqe|&4iAUyraVhf8~!tzN@-)K-P!|48?Rtt%Nb@ z`<+J&cx*!Yg%ms>IZ6c$h$(}}#SQH3MV|*vD1t;wvLq;>FAvq(2NNL6v%G$Gi3l*jQF zFw4W3`oULvv6KCUdusei`n-EH@~K2ZTVK+*9b*5%sCSU`&5dl0rwIi-Z(KyJF&=kF zXw>$5a5!lWk^vU-xB&>{zYf<;vxS$C(UK zmCNa1(}K1sYBk5g4Z*-wcB(_oRc7)UuzV?us;O|`TkEx|K+8$2fw}x5DIj8vg=gA1 zS_9Rs!sI>B?9eDAZY2JSQ}q@8m1^q|mAjRbem{ANhxVoCwn#B^EJ^!wOXmc>aH&!E zcUtXoQ!`LhFKSK}S+C_gPk3!pNXBM0sTfd?Sqv5{R@s~sT>UHi3wbXZN3 z{z$x-(WQPeJ)7-I25;+zZEO#F0K{kkl)k3|)r0z^5m8Ldcznrf*w0S zBG-k;w&S|pn8b5iEYGGM(>EY#%G3ZB*Xn*!uxxS*@fW8W@Rb zTr!&;d9<)HTIHb~LP|Gir5~y+Q~sP$>e$KG+S0wAIqLbEnn#^x9Cs8BN2Gmpy_*3b zR}d>xG6}!4Y2tVFMs{Wd(Kx&lqn5XX%ouB<;<0tpOdXWgwlubl=SO-&LIS{W#V_9= z%txduD=3}5Uq6wx{AHDuD)l$(j|ZlYK&rDS0xk2Y4EHrLt%V)f{{D&}u*aeAXkeJJ z(~P;`$qQrB0yt*B3}aeV&|39OGEuj&su>|5l`&fjz4Pz6-&DJtG7(MWne6~Jyzc{W zR<-EGctRhvzBfof9WkDt^A^M?IMdCS^I)RXMcC{L6e3-_8LwC$n)FmqIZMlPa&fcv z0e(rdN47@R*>HSPplj;GNA}dZY;*9tGpFagFL@lZO1|p?rp)jxa%VM(=8zef z^zt1vb>D=qwY&TaO|(hKR$ctWn&;I{`m;m1%Zg$N7BtvxjkmPkt611!cG6Q>Wqr^) z;j}~Oe7J`{EuCxs$ar0Shu?Ye)Ea;y0Cech0mZZ--r%&Sk&mJ%XnMZg{@(Qh*9IXanazs&3wcU+g}ovz3hY@9p+>r#Qd~tCoM3xGlQ{c zz2z`LHue`IM^vIC-S;FvCrxUxW#K(SD~q-NC~e9kYMf@vs0s6h8D+^m?KDc!FYt7+ za!H4Nk&+?Sa?LR+>My;x=hh>Z5@pbGHRu2;SFU%5r^vzFekWsPw|#YPohvd#FVaU3 z;i><-ZQImI+ULhA(p+=XvLxnwE3nS_{h(t$yYGg9v%q)b4fYdHVGo*Tyu`IOYXSJ> z%Cekz|JYYu7&HQC?5{y1lT|*$1A+sJneoKiKuR9Y(wun1`juEiRAV%3e+;R=G7~pw zwtat6TmiU`|5ep%Be=9?Pk9ocKsuf`$qJ&MWg{HmYu16KyN zKbpVA%zlGu;&ENZ#;FF82Z)05ML{=;7~SVGNuh(=FCR27gz^J)30gm^pff^Z4~Yw8 zUNzbxX^*ZjgEwEjn10r|0^r}O@#NX?1_7KOC{0Z>K%$Rgz@`w;jp6f?(abH9o8@U( zlYio%JNH8fD#-pusQ+iI;J?RR{0GU!|IV-JD{#d9u(j2U3y>Svl+*`&xA_3-3I5v^ zKnl8o77 zXI_I2(BehH|4KH|)Z70Z2I>QFM6M$B5A!DpWO?{tk#~afOYt$}D>)CEJ(>6j{A7h2 z86Y^k-T*JFLv#*s!vXklhX9?mP6{xE{Xq2CE3x`7P3b?=_%0t&&sc&ja}e}7kz_OA zw0aYwXyu%Nx6F#2sKOaxfgn`|-lXzd?3kd23^7<$t7rDQS=8MIDIe|Gm?gjQ3A*H^ zy8BAm=WI;rLyZ<0=riu9KHJ}-eW);?xsH`oDW$Q2~!b%}Ge12B2_^Q+L@e@7C3#h45X z`81w27yvaZdhv!}EG@ASJhywb*^B8`TT^;J;H>730C45grNU*V3}L22Y(J&b*K7ez zfj*nr0b#FPYMJ2MG)*u*)j4N8BLHMg=#FGnJ)rc?m)tYMNL4Y%Y% zk(F316U&Bxi9J{G8?Nr*F7i^{ZliAM(qny?)Kd`3Xz$Q)u{C?aOYP|}&4)BZxjl~E zsdL$`lW((wo;EzY=xIb1?o>fj0U6MtA9xmkzxs?$Diom89F$=iSKQUwK$zqaqf-gf z74`G^n=zf5idLm{-mxXbWVw8JbM;V8_S#|~=V$q*sj|ZUN5dw`IitPesXW=!(Cx?X zI$K}cP)-AnO`-x8a}vetvd1S@tTg(3QZ>&xc?Z8*F0mC}M9m3mY@Vt|HXvl%w6|+d zc%ewR0$U45=%o#(0|U1M;5Z3IT%OfI`GybnE+cu4x!CMrI~!ktNifEmr}>@3)tAZ* zjDeNhQSdNeT^To#C<)51{0)nL8q}TerpK2h{xj9P5Xg~e_6W1KWgdHsYSjW8z(;}& z-mht7I5BX!x|X<8XDy5^p0Z4-*MZ-cUnp9ca=!E|K=r;Azx-+cQi4jnx_2Y=_U^B1 z>wk%JvNTKADD43txwcE8nmJBOR@3|%)Wzl~ZB(;;G4w(^7$Hau#_$8uOl|Doq_wgJ z%*;w`<_o&NM99jI7YwXj>J_aNKLEd)a?9F?(m#VDwPr~ZU)hKHVWOe^z^ByIv0Dc6 zPL#u@7aYXsHvXUXu00&;t=~^?d&f>LJ4&T-i5d|pCAUcpxs_{*2vIIOLX7)mYBTJq zJz^Jf-w3JPk~>3$T*o~OCdp+q44N^G88h$tvG;SHbIv}`dEayXde3v#UpzCgt8H<>zw96xXvUTCGSEujLE@$x;{_o5)ytUiXawC zwpuod?D-OHO{i842`SXSgp8bPonu?p%bst9E#GU;ycWB6tHcv6#))4z2rp($TXLHN zi4%mUp*Oj`iVas{_oDb^(2R!F^vf8!*63FZ!lLq!%Jt509<#ZV_l-2;E)yjp`GvK{ zqx-IV^OmZsMPul~z&a7MY$!hRgo8yt6|A=?8b$6#xx9=n&rs}6GyYJHu>CSZHH4T1 z@*>S#qw4s6ETyTJ0D*&wcB8zDY-{F)f)_i)VcH_A;{7smHHq72i*#|NpO?A0rs0ZL z;borq9>Y6U>yN(X#sw`=Qev3Mz*A9*fZZ!#6?k25k5(DG;>Q`Vk3kvoz9D2b9Y~Vu zfaEU>Yv3|`>a?P&d!NffcRzrqy=RKYUI{UY^3Mw!UaU1Yl8xSp&FZ+5vbv*(RdCDe zR?TwZCm*rGyVI`d8Wr_x^T&&A4ZB-CJSV`-hbd}}C;hs!9DfWp(r4U);-BjE_3Z`4 zWw55+_WI-^hU~&7O}yjLo3}B!&iq7V|MKIH<(XkNwLwmISDHmMn`H6C@+zQhN1K85 zS>k6T?vCx@w&RWnk<5V>_?nxQcB<=mxr{9$^Evfz_M;=g&&M0H-CpC^YRCkiLjcQ~ zC|9WK^pX2U$zAQ+My`1Q0Ioh(?#;M45jh}B`HbbwlZ%GNq4zoocs|R!6)gM@F z^&+PT%d8AVYp`ZWl^#+xWkIS@4I>P_X1|H+b$-J7;EgAZdx3yEv)eu$@0B-LkrrF& ze&bFqRe}PjKAip#QZZRScu!0Fx|+BNLIg&YAENQf3MR*L(K1nE$UTX}q{FR5lcERR zoo|C}Hs+4&l+zsnQygbFP74p;>rECC9G0a6kwH+HS4PTI3#E(*To0_>qTA5Xv(pF1s#lfIRoDe|tv`f*X3QS^f3S*~G4QxY=(>r-IE7WA$= zBcUmTw3dnrE1&k^r)@l&{U#+or#p|SSjqGN7Z{)hR%ONVRWCI;hjmv2`Fh6eg5k$j zg7=<0-IFObHr$%Q;JRhw(m=V;n~|!CBy*6$YFkec!6MqA*<>Qro8xA=>ITQ+G8PX)qbgl)$F zc3PJHO}XSJftKsJslE75)CCE7wx(vM7D7rHGtoEtBgnI&8y;qNkGU9R%NyqbyM+BD zvD)`V(G?FN;}%xOcl}Fmee=vKO`0Y)q&rU-O=q4cC68aa$9FjgjPSg=ng;T>iyP+& z3w>kF&=VBRPelFFN6BTNFWM)pCKIf@ZiVY1cY(K--BW5K2zXwF z9%5fJNUQdjVpKw&A);2p6D3CDC&w?&As#8gtKT4X7x#0e69i;_MDb@S8b^(e#SY1! z=?y1S4%m#UsRD=33#t<%F*RoZI~~aMyR~jv4W^L9_j_hGb2&H1G$5^w0#F!7EG0j1&vloEW5~A=R zFONubJp1hR_OJ8r-9xD5RL3-`RLZekr`OL;B-}Y|eQmNn7+qs7|0<-;hPfb!d2s2; zrI?Rgf>jL5=vVqxV zPr*D%UMG={`)hw-_V?1?RfeujPM?P`#}!bcrh%^baY=;zAnbHUziXd<=@n1?GEapV zotQA!SF7eg)f7QRC;(H+8a6I-!KC}DYoH`qXPhLStAF5_myIs#vxkje^iTX2L)Hnw zIR@YWP}}-_*~b7|m{Hld<3^}mkm4DMCc`1)O5o5M?|b($9S#@878S^A#GgIw7q)8C zR)f0$@nGwzWtDU9yv;JdEk+al$2V31CS1d@dUAbYZ-JUDF>`^;QfIexK^j;$c>SIPnm!#po;t_2V~>$YGh!s7@4>Hm53Pz#L7>#0myO2 zplHJ?-i?F=F#n@hSlE|=0O9+#{n$I;71dDFc7G;d7uN%}%Y(Mb??8Y2pD+mj1Hj+S zx|XkTZEY$B;O@=0tDSp@TzMx7W`|umpcq$_Hy`&htpAVm(*Ff*(*M9H{Ij2BThNZd8=RGKqQaN7L2`S(GjbcT>auhQCKxs(JeYhe&8di%SDZQ6zT

5ztY+2o0C#qPSq6hVr>mHp?}@zfMIM@5niBM3@& zy7uWx`=y~DXf&0!|LE`@ki(jCt;9Wf1}Lvrf$2lrk-8F61FyEqqLcRf77DccA$O(T zQEvIs<=2b(xNi$E z11WD3_+nAnhsAa)sbLlx@Z4IA8hOd7Wa6kCY$O|0lGinC`E&9SY%N`4FKZ=723g|Z zmX&)m<&M*vXv;N*mGZBq!dJfE25)nK>m2Ccj<=P>_WF7HuF~C~R#h#Gf)PN5)Tn6m zkwsB9P=MaeX5MkV1@ov$Al9u~NArA2=e$k0lR9ur_18}{4#Ux`Ta1J}Rv`g7f#qx$ z*BaV4mSzav4QLRtDw;pXe|Pc0WS&>Iu?2W^h@vF&j6i;@RPF`HvoSP``J z=wvSW>7|42%yT1?fa>?OA6D+w^h*Y%R`WbM>&S)q`Al`4h*L=mcA@?#H{R#oi8E50 zX26cyIQ@_vL_EUva=q-3go@Q#deJ<*6B}n*q#f5D({JZJ+w>moG)n0c0fN!a?C*d7 z-pjG8{sd+|L3BnU7=YuNbw^fD*7625c*4*0hGqyuH1))9~ zr=Ln5)j3t8V6=~#to1mhP}8K~`3FR=rcPJpQ7j>2!G+5gx{i8ZADD9|$C+ed_$CUK zJv2+^OjbvdjW`Rke_lf2B{w;>JCHH0`8}QWI6tHf)K$0BZvrZz;ef-#?CTo47S{3DBpN?*{u`CU>ndt6jc81o0ri6q*Nt?{AfeK(d zFX34Pa@ye0OcNmEmz0BYN;LnR_~8{U*qCx)X$6zz)@8eX@a=NWVFBFn|F(LUuEP7 zW6Q{y)kP8$bI#LjCoa+4@Qu|8W-)=hQW;T9jQHsJ08FStQ!t^d80xl;Ial~o%M@PP zK#ovUZn?z}?2G6xxjxR6(Rd0f%Z(M45UE)!gjI1ohFyv+0U&eAJjrL9dsYjnQujGc zZk#<-T;ZbbX}#6c`Ms$B;9{@$??Ba4BDyVUZ}!=Rs#(ZfH! z-``b$=Fc%W5L-XDY-rfPx=OLZ1ZgD+Ew|L znXS+=x7MP=onSe#wI1_AVDOH_UJ`yQ0$Fl+1l~sMTdpH%VCjBIJruve9uLp+tS-Zf zfZ6M+z^efY?~C{Vdk6Vhlp&RD&Hgr?Jm|R(S^pwyU=x3)X%iIm=QScu0z4&)SWoR# zf~EA2GFKfJtJLo*RIVmkcM(=w@RMLQs8lBIQ#IG z<~*o>W$HrLaD1qeG2qex*Oyf#_)7=-!Xr~N`k4iRG-wxv6WwPbx(l8TpBlL}WdkvM zYZnTDfbGyBVhr%*X41epJDxgPUY{uRr~i`|F3KSnq>86Se0UEs3~WSjw5?9RYsOTy3UFl`PHME#*1kCs6!k0 zBX)%wio0hCmfc@Z<$}BbvHt+(?|WruR}#PagDA)zLt2NR_!-%qc0&e`Zyi^J&+6=9 z=(kY(?DN+xuiQ5PnWw=}4KjW1jq*zUeoJpgV9v~TG&0Hi_d zeZIBP^;`}(A`EKyEi?o>webI6fX3sm#(@{;2s{9=Q(Inue`?T#uenpi`3;IBpx-vS MV5(Pyy7BYh0fC>1F#rGn literal 0 HcmV?d00001 diff --git a/training/exam-question-bank-20260512-0900/materials/新建试题.png b/training/exam-question-bank-20260512-0900/materials/新建试题.png new file mode 100644 index 0000000000000000000000000000000000000000..d3aa6e4c6bb7151e0fd2bbf27c7b82b5e2180fba GIT binary patch literal 68393 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�b1K>(%7^^^x>Nx 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 h^wYt~Yz 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/FciIg~Ds=9}$C5J*>7f2oZ%zF^^jjCwy6q5EZcCxK=uGuY_UMZm;(c z6Q1x=KkZ-knVuH0d8E8$v~etRn$p&}w^z%*lx$HyRA=jX$oNAGf`>PSUU??P2oejN zw+z9)1AYgXH>^GH4Oo`&1wz(N;?AW*_OLyE2i3iZj z{t`Pn3MH3!E&JSs%Z$bptmx_Wt}QToB28O8gRt?c`qSu@(XV)k|`jsL2-tRB1f^v#+U(cE?p2oz`t||S2 z*>kHiF$I^Hn7Hgq`cj|&7j|bK>j&GeF1@hk`IW>tOug;U?Ne6L+B9z+NHZ+E4ZPo6 zDg6*2S0!fUw9*xIl5@b^Qj{&w;*^i|=KEr0=N4acoq>a^{f4Z0S^PsKN50v*9SVeX zidJgrcxYa^m)AwZqEd+}RpB+lWZPMnHCbKVIJr~|fa>VWA!(#y+@4x`Yrxke*KRqs z?PDX(1;QNG36vvOj#qykbC+P{L51Vy>G=zT2?&h2rKDj}4`Ht&Pg@GcX-hl1qL{b{i%F;4m-5cylPO&Pw+*^fU z6^F5a=;HwsYdOj?+Wxa`rBIMgMM6eKrn=gTe6E`VVoWvU)bIpL73%6#87~j7SnWtW z#f5?4-{30xv|iHxhu4)WQcR?2OIf%lQ$=-Kt_F>kta`t{t;Jt9?WKC~)KDWY^_^Jz zG1kHRjU3+3NhK0?uvsX*ILPTTs<_ZtOvYeW$x}o^n$W}?fNFp(^Wd$E3ZLb?)XOU? zi(ETgYvw0J&X2q2PK;l)!3@GlPi1h^cn=*?R#OuiNul9oC>_dp_AEA;!ASSCwzv>2 z55zt#Nr^@E<^gK92jpM-{cMnA1Y6D5Mev-83aNwb3aqvto;y-ash204R<|EJ&zVx=&;c%;p+3gliGvD*3#i+#LOgvm3gwdAiWga@cD^7HkZ zzRF=KX02GHR`HFr8Y>XJ{)-|buy~~@)|*i`=fgCZGU$FJTG};|?jc-s6JIB%$JGH4 zI|qy@CT0k7F>*EhhUZDy6iZj5POup1or@71Q^+pQj8O%rnA=ZE&NTEzKpHP|D=kpY41qQ`QPB#SFVb`emOMkt_}B z|H_=nJ3lvAOvK08@bMqY)p`-X(tWe9LR(Z%jkVv#O#Sqf7n4>OEF<$q0+j@~do>gE1`<53vz{=B zEcCct5nppAvcbM62@OTK5y64E-;ha|PX0|R=R|j#V5pvw>Yt{Cw3L*>vFl#acZ(H+ zPENOMSyhG&8>K-<`Nouif+%hUnNyQ6yRv@lv5sD(xRq*B2q~BVy!U$fxr5b zfiTfbv`^;bHsfB9=G>89ZM`fIe<63iXsm&Uij*@7JmZtpPIDM&4SKGkknqSHrMA&UxQVly6dW@iou zg&Qv@^J91qIwgc0)Aioes>!7oGFwjZ-p;$#`Z4;BS$s|;_GWGuYSn8-xI&0Ux} zExXBH*HZ8BVV+I(LLDW_&$e_N(}dXEEu-EnCQfxt>WN&$MnjyNRKy^{(>5yz{uCtid)|t&jJ$PJwC3(GI8rzCdOF!puY1=(wOu%uGx8!pMkC86Eh-E7 z_D)U$nJRn^2J_R?k44;EHovbDRI!7Vab3n!t@f8 zE~%~sUvz376PIQja5+Bw#F*EkOUP*QFh-w0#=x4jm#_=fR8vbA6BnL4HABWnI15iy zGUT_?a257OkF!$bO1~=645Wjw5QFEXr4*!JUHWX1|4W!|m-ph1j0*7=8(M4^ySgO{ z1nSOlTA8IBhyt;Y!Iv70DBIj`$MVL*Wyh_|;c)^;sG+Gz=1YsvKx~KN1C49YR}+lP z_4QTF4ea+CLp!x{I?iheK0!Q20SC62NRc?Z`z$^T%Oxk%03^3FAY-q0vt=q9Tc%#| z=(}{k-2Q$wcMu~56BSod1g1uaL*Cz|dri_y^+4q4wCu4nnPy1>X$pe3Nfy|9l78K} zLwz`e97PaXZGn-1XKgks47?UnbKcACN>Eqy+(|>K;e9&i13_l(^P#)56Md@o&QAFv zcWmLFMJ~xLtQzSL*peVO+qrWm?01-%H!<=cyzZQ;y)y&F9z3|%crY9?*1w^jJMq?x z|LG%VKVcF!h^PqyA4K|vqJmAk1hNzMzms>PH1-Zg^BhDsny^#JqM|QxYf~$ z{gyOi3>NJ@6knJL@C%)0I}O(cT$8pzvmx5G0b~KjnjuHLg3~PZM&KNNGtZ@ z{-ghd2sdQ9wZ6-AXLNEDX~i7N7DX+u_LGie7L4o!CSGVLwN+X>l|SY{7XL&=<^%+l zqi^=!^BqBQFLK3!8mDsITiNV*9|2}0_$5*A-ftIYd;$_0T8q#s44)Si`LsCQR8hFgO5A_p+KoX{^@IrW@ErGJhn0mfUg&R5 zZ71x;zZPZiQ5>6W;Pkxm1EbQ`N)7!2^n8;N5^PTgDucL!S{b+@WP3tpHRSaL-tl<+ zUU6=vkHF#uQr@Xv>M6Ro>-l>2#fcv)ajP$WtV9ik?~#|9o_>1lDaY#@;$JOn)PC%p zQL$jZQNqA*Ehtn?FL3r|N440Ek~5NbNM%E}h4CD@djuG9`~meMB4E(wOL3lXUo9=g zFs%fmw00YyzI=U8;>?6XChtjd@4m2L#2zLbB_}j>Hl>J0w>^~4)GSDyn{3aXkHxk$ z{d_!peBs0z=Z@@k$S6UXJ!I9pf4``)yt#0ar~~y7ThgsAiPy*wvokZHXMmx^ELf$& z*^1pn+#T%?&=o-)1H67kbJ8jj3%<0Xh`OhEQ4p`Xx%!Ft!l~Dl@ZB_zeLjI)yZDZ= zqv%$amPgB$eUdr+fmf&vpIxGRQMEc@sU7(W&0-vaSFSTqamNx4N@RX$yj;C{bx9;mm*1UA-h(qk7(}w^OnAJ&wThckCqd0QnQNXhf zNteBzk4X|4XaU!5rU%^eLsorUU^w}P-Fe^-&SzqypS+oK&9J+hyIS{&`s%nDeHL2e z@%$J_eVav^P=Zw-O-5wFfWPCe{@?fA&5|NH_#(K$)2SNl8w6n22#m9Vh@>jhagzuR1N4>;D;^JNi@inl4 zM5=NTAmeIqfE){j&sI`$^01pX1xLo~YF|Ktg{uD-IyC5(KQSoPsBw|?e!Q;tnfc334cg4j%{_Hf2GX@f(v6q!_Fw!S73TQPn^z3=Fp*s zPoH+ggxIF1r`vXEgE|inf1r|cenhqLr_WhMGw*ob&{X>Knw{Kb7ro`{^Y3@tl~@r+ zDQSC6pHSncP*D@r4Lf9)UiyrEMJb5>S?k)Gw%kbAR1Sp+n_DIs`thMF@}}*_AFt2# zHziBz>3Uvz=Id-}$+d9!*;!&t{K>)5T;QHVg|;^|e&uX@^nMt{Vj(H^4vZW`ggQoH zD%kDdupiRIsxS1F5d7g_N&&Vi=S$m|&voV-G$DaE9)@@d1NwjcI_>ZgZO5I+vVhG^ zhE3=v2^V3%HPBq)ua#KQb~iJDOl`gM z=l4=m%NdB@dLm#vb}C6)Qe6DUlvV&}T@k=~A$BA4yK*JWZb@j@BngN#Vk`}O(&=Y2 zoG-G+y~)8`s_AKUm9UKDB%AHwl&~VCrJ@=hAGcg)+DgAOOEdWxD2yLyI>UzQK#oLW zb#&%IST_HOgi{_@c=Ie{^SlOyh&zR&u%QgVto; zHv6bA^)%_=*nzLRMt}q0EO>IjcbB`+KXUWsgB^F=td3T%cMQZuOiBx`ug?)?Xmo7z z8etAcrL@>5M7ne$9z6^YL%K?iZBY9dQw6}nmR46a zG&N(z`5wHw&HKxSr2WgUUq9acYEw@`vP6&qiKiztq$mu;$~%2;W0mjVf8RY*Rkbpx zf3c<{NBl*9CGUK+kKt&7)qnNf!!#=xbzP5=gRnC_Hbx7}h%aV=6a|?N`cwB_s#trK zS05ajQQX!QR2c`ZBbuDxKEi>fP4#HCjo{6RUDcQjhcjU|!>aD?xXZWN+LJamlb~3^ zGl7TY^BtsH>z|4Q##jO>wz36Uxwp5&g(xC@S-LH=)T#ESZums6m5q%}hG+Zl=5-ID zFFm3FKC6gv^$Aco^0~+qP27TKj-1e8F4+5WkmvzZHHQyoX%rKOfIGnutfHxDTiqZU4T?Dao5e|x(9)&Q>D}cThdD znU?pW4YR2PY$IY5s9CwWv_+dam>FX(-jG%^xqWK%SxIw!*Lf&{U=%}gt1FqCi%Vr{ zm4k|cT7{M97XA#m)qa}>VD>Lf$O8^#;i$iq zfJHC4NShG?u|WMVEunUl6mMevzp<3B{)gQ9U#x=v&m@Ka5BvvudoQo}bs}y8x%tmk zOHL`sxbPpI?zRK;!e=y?Xa15j!8m>(A{7|l9(Z)=x&qq9_W||)W(b)RxVlJyG2aFS z2I)mK$)o?MInjn`-+$z{ML=LAx+s^G-rPQdL>}J!Gx1wa#-TY>$nu+`T6=-9{J`$P z<$~HjJl_D2j@Led@;mx^U^zVEz!?pVR(NWFXfyZu^TDTyhWrOHGxCP(|JsZ-wyPZn zf_kasJ4`#OG)O(+%mZwZlST8At*wf(G6@C6`0iSg|LM=(>zYH42V;>K7@C>?QeC@- zkraT=3Slpe(hievu(4?L`D4y!ZX0u5VV!kkN62MM$8X%4TI|855V_oDl^N>js56@X z{25jW#`^lN`OzCpNJs!(scY}H<@I&Q>>+G0qYpOf`AaO`EvF1R5{8F;t;M7k_(nmc zrGDi)ddpxGfyl%duK3m7+S(eBlbKmsm-WpRoE84~{Ly9sxYZ{HU}N{l6A(wF<%`^=g>Z zX-nNltwH{q$Sd;SL|$m8Kb=rB=LavY{q9K|Tp@TN)V{$K+uFHhAqItu+9=l{mG1U- zSrU-Wj;;iOo(qm7ac&JX3ZOfp*r$#9vkPlUWY5{89Xp}y_GLnYiHQlO9YVK**H}7M zpMcogEB)WZ-lw+zA@&;eL)kYtnB4#45Dd{$Ps6GtWL=ILLpUdfhmX2WsE-=wm9*ah zMC~&63fsoJH5d&cBzRB3x*}pxaQ8M~i2*4|t*jTm1n?7Hn)bD?JD`fJL zVXnx-2JZGYsRPd}!bZ9-Iln2fVb{KV`SO)3S1@fRE>0JE99!E*Aw?meWugas?g-}9 zvOi@WVoEi~#QXmn2(SJR5bpWF;#e=d@Euod{yvHsCZn<>6>8B-!fdP+xczBQRZ@%q;Kv36V<2iY0FNkg3 z5OSyM!wv1~AJ7;>hk7pW?e|Iw4)-b)tah#aHwKU-q#itjn8a_?8m*^ujm9<#O zT%%S(Lqez)M&*5}ZTY-uLgd>YwL<q!hB!a5dG?u&^KK>Gqm}IU#l8L`wMf-*`37 zHrgdK*jN9#s3vR;b9D%uD;USv#O5*_L{=yzbq_y7z3Ew|PD*85uEKE7X2u@g)VHs6Fdng@?Mu zv))$FnIO@$dY9smN0E4|!KEnbLAwnoxKQGO%@17ZCC^(gAW_~$MgOir*uCb7zQ{jN zPX%qx6q^VD3&pS?FU9cumu85R!lt&RdZNvk2{JO zrq;o~uUGrkGDV#o5P;AcCk(>OD#@G~x-To4m4hlkU_kmkDH(Wz9FvmWkJ}erED(Kh zi@`*$*o3o@gi~UJ1-o%NSMGJ|Y^%mjM(Aye{p!p>w(TQ9d-Hp z(q7~V=Nv^*sv_?dQoK2-zSv=Y$j#5S^{Zx1J)Vv-GR%jt*?mSy=?2gnu$Ga>fFLoy z-$FRS25nRDz_V#GL*Rc+7+3D-nCI*iXc~{qtgY!!{rdNPs?}d}x&Q)23-F_fVj!6A zzr!qM_u=uR4^Ab+47~onKJ=l7Fti&yQ-tcJKK{q39dY5?fHJS21GN$Z>fj#Dq0LQ5 z8Ha{6bp_MtI?!PIP3Qt=0lW@;tYF7~Z!(K~qcwFaP}5}&h2nuHz<5-WR#x0RO5lD2 z!Wr}@OUsUMfdqVtMrzjSLpEfWoMH5w>^bBNU4FT1wqOv5@N)y@(Ub@&RHC$}ph{t7 zy$?JUH79(hl|vM5_cAjN4h=mA1`I0ep}VSB&CzGu{{HR}dy4?xkkSWZ6b&3B;qGci zulSo=4}$*W~&lu-(7IE8`H z!=tgGu@SPDiqpTjv^ZH3s9Dm2TtLqN5#?CIlZOv)IwbuK>qG|}k&)rh(9m#qaRI{y zlGz|o^kqx*!C)UKZy{j==8(Pz#f++&T9AsOluNl3q}i}t!Hi$2w$X`+H4OI)p(M~b zm{>sjo!Mn|H!g1H_U&b47FJfvL;hgXph+^QiLm%b($Mxl^vw*x`dO=eX-}TCKv_-f zQ&(RvFDHjvb!sBwGX^uGZb>!e?yCjC%?3QLm0m1h5E#v+Ogd4N4#0y#$4y~^nLt`iO^x!ET_;0_o^RnW4l1G`x_bEB<2#tj^m)`4K3no@5Z7jL2z5kv`&Ur)YoKu&MpRTmqxoDVs);_;(YVZEu56e-_ zbuXSK@6oxiXX^NlDz}`-%|o4go*n+sY0Oicl^sdOy-MbwRIycVSL~-FieZbJqZDFd zp7ViBB*Cojnpi7Gk_SA8$_Ev%Ec;Xs{oS|!V;Brl?|-CV|GLkD0}%Lfu2lP9F2Em_ zEPnJPrnvw63O7lTvbPd>)xL~i!az6?3Snigo>7_2RSV}v5&)J42$O;1Pgy+65H70H|x5mD!d_Eq<<(jSxcfe8H3tw!s_jfZJUV~@!0 zj-6E)G`{fu#|>3>sH$AV9W{=#nZ@!N3zz7WFt}&V|EdUh5xUxZYirj~9<0T~yFS0$ z9VA_tcEG#uINab2I!`8m(``}KZ}w@Z8c zr24;Rt}VXY;Ttxq0DFn3C^zSlDO<6h>D*dvAud^8f6f)In8}dJ=H*$J)F{cp9D!%O z+E%AyatVQrtnu$p~GB=!$;vook zOZPwK$3$d5>qzEv`HSs?05ktLzR$T>yDr#RM~4hAE-&xdnY&^%Ru&=?O2zqpge2@k zUgT-9Gh{dI?>v5&b2{vN(yQfzERg&8jjz4=yg{-#+b*(QWK-ww`oApN3ry<^wCR6x zB}5*ph)hV3W>a0iKTB)#vvVW=S{(n`%U%{$x9#F+XSb(Zm&>`+=(?Hz_{HK-&`OYE zI^l9%kgXdc;|pdMb!>R*k`+o*;_Mps{o~Prk5|v>^cjwIZmt~6ALZwR~ z9zB)TY_6@NllY7CuWg1)d9vO)~#L5&(?N-$osUG)#QxN&q@51b@ z!pqdnOd0v?rppg2&oh0yH9J_bo%64NFhBW9#X-Vj@sV1zc(VA{81oTd**?dNKI!iz z79MoQMH1gVF5YhCCL+C$Rr7+~c;cGkzUWY@`=_4NK3+M*s7~yDhQn<(U|27&EbTDU z{738g+w)gzj%f2YCAI#<$%2XsxpesV&!3j5>UEMjAdTqi)_WC|8XA(}*gt#S3w<_d zOVF9nA}@=>=M2;{$4n$4(*uoH*N%$&@Zit;R>C^^`h6e;ehlNhBT#C2fu>OdU_wL;bHI4@ybT!g+$0nU_?wQ&ht1%^4Ss*L@LCR>tZ;d=L&Tr|V z6sx|U;AwgKQp=!1Za`zOv~>mc z4UJa>1jDbpro4O8Z_L4Z&RULk&7p&en|QEhy@s4~W7^(5;iSIS0V(OE#!9z6A=C8! zQW=RxZv@km9eYA%rHWI7gyWo&^~}VmM%A|QB3wLBt~{y^P0UW^tC!qLcfytALgKYx z1SX>5Q&M_3Kjt0x5);Mur{AN>VnxEYyow6JfEgN`8e=0C)f+b^b!>{VZggk+tnzvI zgTk<0H0{ZUk~Vo&8@3530RFiMX3zz|9}Wd;u;fw)cyn{Z5eD@8?i1`9LGnTq;_j5g zfQ#iaRduARMJDkiXD;F4S~UI=G_}n6eZ7NOMouwsZdqRbDh-ojFn{dtD>c48uG1^kK{iVk6{_LAMsRL_bzeA;0|oM6S5=`y)yE zMfb4?|N_PQJSywI<)bp9|`Mw{IH zYhCLxQ`D)fmw_bF?Dc_5bcrHA`5NfV9lU}T6?`J)kIS6-V0%i$E012cfpJtV>9X!* zu%WD=;?14=#o>~O(mKV+Ph9oGh&C!vOd}eV*6k!Yubxby0ACdql!}Aex zG(S{4N4?x>2#!(+Zo%Z1S6eW3gJxt;&;HX-YAPtNhHocVb#z>S120^Y%h4+P?|(VJ z8%t`ffTif+<$Nq7-yg52=`9Whyq2MGy!Ym(#A=L-J4brv!)I^YVm+d&a?Bf^J7+3> zcd+caL*70gwo>s)AaJ>v!s7ammt3rt2_%By2`mI9yd8_nDsLD??}}gFmi#X*Zh!eP z_ukXa#=4){ItG4Tue#8--C1a}^U>Qkv#(yH1`!zrsivBxPn~wZ@|`G+^o_-fuRqhN z!drC(yiUs2R<>|&QA~$j+jW|iFNgRpdku%B$hDWPM>nSwVyhw;L&hy+>Ew4_%I!M+ zaMAC4p`SzgK?bAA5oW`6rVlvPrdCinb?#74!q{ZxN%kFwp{hV&?l$R0*&llcdUEZC z019txE|-*8wsK7k005dU*}C|jLGRZ90{!>w848eaL=BsJ@2p08*B z`BKFF*w%@-*;h-(*k&o9}&$I)0G3b@y< zYfgW2rtgTGx#Kz&p}--}`Pxf*wnf~9=bddxro6D7!IdI5rLkyn-efyKElv4{ylViI{NTovTg#5ZBg%4;xI%Zd?fQ>^Fsz@1IIY)a2m9yyt!_HZlo#gNir3{@o|Oge{74f)SV*~v3& zdM0khPY1+o6S@-0kXFmA?#T&*vB}BFG-t8Q?n$?z(?UXFyRHD~Mzak?U1R!A5g0di zwzuQwAb+L7;KxGxb-; zwP`DsgcKXtuN=8yO+(5R*W8%CE_qGb-#1X5E2ASIz?bWRd9eLLu)cqfTI4>SMc={uw3M5T`Btwf+@#YhD+ zWXz5x;swX3z5_T;@bo+v(HeJu1+e6|%;at#ad7yU;ZRHfg&_UG(A}}GhG!M!M0w*+G|M;(otm{wc zluwZjSkK&?wZ2@aSdb$gFDghmj4C8rbzwv}|KfR{(glv_%MC&*LM>C1)Jk6^9mb=J z6+iecR%9Hn+G)@j`ufV3k$K0f(bdYf&&?`An4FwM)DAQ!;d?)BN?P_Mc)L<&G7S?`dZPwNu&`ShjxDFf;?e_=`+Oe%XL1D{w zw@4VX)OL%C&nsyk&IgSUEiSvxofK>I&qEFPt8_=<5v_FFCQr|s@@3n9DVsJEoh!R~ z{^|LhOt00GG4DlX0gJ#!Bep=fOz?it?qM{HR|!&uuskfY@LP3awpT5BT<}5n#O7_3uX~W@X4EKOo=`x*LLGr3cx@$ZNP}lRo8K-b-$~NVW;f z{=TIwS7t06+CQf_%d5!%)I5qP_En+iODJ%*|h0RPU1STIZb%eld_oNtxj(sJqel0AdhjS?_cb zcryWKfo08T6CavySCHAkwBw+sgoLXIxe(deZ5twFZKhJ+(%*J0M}ts*e*Z-R6p@}z zYjx@*i@&>fy*56+)l4Z))U!4gP(hfRAKPll+p3OZNZR(1XM}&mDdVNYRh5*P>OP&J z06V!akKP?srw+Y$h|axL-c*qL=;8vJlFvIy3fh{_UnTR~R4QpZAv|<)MlB=q+m^;G&@oakJIoKI({x~Pq1(cf*@%8A@JJ?y-q*q7N%=PZw zw-4^8{T}myKQc*Dw@6*?HtDzwRdd=u*E{Z1LeclPxw?ME{(HrLS2%A{-ViBxh5|rR z@|8fI`qp2YF@m}la^6Gn?sio-;C=&p+8o*Q=>RnCm zON>TWBRs5YL$?|7&IC&pT7GaGi8_%Uki*bL9oVhYaE0E;=>vrir)S{e#-6x@8RsC< z??%_#G)o(1z#o7cHRQ_7Yu z0_vr`{r&yj-O+dmsi?|5i$dy#QHDYB27-l{=PyT0SeL2bPBQK&)|_(+UqHBsdAb%< ze#N_$YH?a>q-w*pNl-#!VlvCM-@Awbenr|@mRI1Ph0=IsjDWK`!KrONCrf)TYO+EH z5xMdERa_>#%}jBL-t3bdLPrbRWd+5aMBg~Eyx3$maZTI%K+ zO_x0xSwFJ;PvPOtFuI-%4w%|LE^+5^p2zB3 zH&QIX)gJbOOw|7ew)xoF3k z1{kl?3qGFyYf*MXtEHpYs^Q0Uuy&Jvujdk%i%|B}&dRw`^>~}7ts&7@C2citzPK0b zaGvCy;U+BL;#30?^`%&77~pKkMNLdI2rU2=#quyalE{GqZ~SPgu6{b>jpHSbAuU5h zJJVEIUfyp{yVNv%*rA6wA}IK^)v#-qNoijo#wWdiMZxy}F+E)}o>tHS4r3`wBSFNL zh`;}va9oU9pSmI6f8z-2rClLD$40;Yn6ONHnR0XC&IixWrZNSc9r{+1mphcGIeDy& zdd*6^&0Tlz*3gKFV+Ulks>9PY9^N~f{{&n zJE~g$fIFJ^LY_W_(faXl&V+C)fp%!gYo1rP{!L{0O15)y2|I=CxpUJU8F$Ck-C@rf zU($>3AUOKN4)PZ~>!f})2Y=8$PT`6Fi9nUDMPINo;R6YU2ppl)E|kEH!Ubc)Q>UtF zklhAd-u%ZMY+DcVhl0cj2_zmgYaCn~b;p)9Vq#;Zx@%u-`a{ugD)=-PC#Tj2^N^f~Arq2S>y?$2^%-28A?B?W%v_{4 z7Fv+IF8dYnM1)5G`Vw99{pz_49#nmS-D=KeV;scvk;m9gY=sinCF}(Joo$XDZ|1QO z8PYwaa>ZM@hn>ujzOIgAF(~XqqVL@D!>=c18M|ae6B8&X^&r3r5}%r}%H)lf{Qgr* zLuEGEy<_>|yLbH7d{-`jvvcNUN4^sbYP%1AXh{iVOoTyS%cwxk1&sL&j(I?2E-1ub>$ zw{l-XVvf|xz}>V98po)cB%mosIaoC?lB= zCOhphDz2Wq2-4hi;e3#KveP`H4O4mV0O3i(=IAva-4Fe-)Lb7tcpWpJR&cx=;~&{<7$f@tFHl%N7m-!_ySqB}&`J7$S-K z?3SHrkIG$aUmCkY>E!Ip6$av-iGJB9i4uh8NWx4`c4D!< zZ8ir%kBWlA4%`pSg)Fj#G8%MsAS8^APPAprZa9bY$U(i#EJM>#Ob=RNcam4l^0HVB zU!EjkR6|IPLShf9;z8u&mU?mFs1g@n!%hH~1`I_EGK?yXrFOB=J*vpx0$&C7BcDOB zE>Ju=-p1mS+No_ocBEbJr7CS32`2z)&jJj%DXPfFMOL14UbT!{G-8Y7d(LPT_N82i zlTGc;y3>(YM52Vz3!T!*m_GN;@SbZR|gw5AH4+u{oszggL+Jd zZf`6Ovs~g!?&8l~TTGUvuJWXQwYZuogCgt=y}@+mEwAe9$*E^waSNgowu}rgB>kI` zx8f?*j#f)2xI`z@)(zXIg+^~_-q!Oi*}s>>4gT0;T({nLPo@_wX@gvfnc&(8M?@Wh zfndpx>caHf>&i~f!-oxF>kY;fxUOKflSwXowt)r69wyh@SN8A-;&BJ80$sOGk=r7C zkNRDQ0^huOLx>Q8^h5V){7rmE&X)DV*AgLY^NF3zS&s|Sm=svj@{`s)bNCozWrkzo zVqRp(S|m7?sIZKloukhdD5^em{dAwL^;pNVo}y=cj-CQ{bCmhm?N1%T(}~5aMoMbE zgGR=0Qv~|XU(jGpWay`x8QiAh)i%=Fy*72y$Hk13jDo1jP_g2^J{3h>s_wH!{e)Ia ztzbHmE(pgOOxfZvzTG@GgxQsSaD%A>b_{3d?87WZFvLVQ)FS#JPtbJLc;5~dbBZ;E z_q{h!w6^B;+C~*nw9*pV5h1^%=~zp-%~k(zy2XO^#DSgLy*^6nmPox;SP)W`7IV^= z8rQp^(=5RDEui}}XWv7n6NS$?&-sS=<#=^gn>-uY$vG639g}k$&JsayBuu2z?PGEGB>~9IAO(X$FT=*NeyZm8NMf|Im9b9hR)W8WRxrKAnX-Q z%Gc*acx*9TNNgeaCV~2rB3rGdwQspjg0~+dK4Yk#6%-!Kll?;K5WEqb935@@nREGe z<9tIaEGg*;l;f$kBukhAWWMa*d`PxW-M@`^s^3D+uHi|adSb#YT(zE2V-kLEw!FmI z)@7^7TK=$soxb6vrnaC@SxnM63b3KMs0XZFEdp~LCh<+inr>AMixT#J_OA~x-+b|~ zq@bYto2?(IaPhMh7H@~+U+%%uu6LBwiX+6lE;{f*>Wka_MClF& zi2`NH^e2g|vKP!f$=hW)=y%`-T}gI#o{!32k^6FF@%>xM*_pEk(^D=HZbh~Jq}0?x z4Ov&zdTISC5k;Y;eQ}0g7LNfh%>3kZE@k~$v~050i%eyIs42` zo@2GnKEpz2(hy~gxUR|L5TVr<^Vu16uk>H~7eki@V?{=$9Qh6@?c<%(lWn_WMEjE{lx5GcVLaxSU9>fefbg1U)$=*dK)eukkz{o#@912>U-%&Qd~%B ztF`tQQ}gW$#*AWT*oeYfY^O3*+tk`*R1Q#VX=L`iVGAes-*=62C{l|IhzO}~dBKxD zEx(T=Y;(a3`*x2uWS&~Lq$gEmU0KVt&!sdk(r?zK*)q=uS_2|AhtR17uFF&VwJ z;0~iHoW+#RKc1D<{qkvg zzwCa|di(2VrYu(nr@t+GxLArd2bM-3H(2*nuAb=TVOu#zz0PLCS0)qZ{npjNn}am5 zs^q!KC37LlA4(CICYe>dO;03#Q=a0XP5(Anba-=SZtR>bIoAARhR?h!8U+kx_T=&^9sVpDMLU8?(01hf9aX1LshH0^3|Id)kPDP zJ(Dq#RA=(j81eR(N>H1rI7pJnKGX5{#pnh&rQ`q)RMGpa#-1JBurs=$?ek}HTG~YQ zWQ6l^blbJ{^wcl;gw+^hXpER=2dRdThGba5JhOUw5{Buvr@+IR?4NKb+s=Di^s47d ze!%e?)1Dmzwmng0V{jP8Wzl9Xw%#4SJM&%zPt}-7?Ug;`-#+S&aJ3K&ns8Zlp9#sB z)NR}L?z8;y!%<)SVpnUgv4rUI#`+M2IHv6M-@nZWbDLb&2v7`gw%6!qqU%gc3)(M$ zsdrO-eWBynYLZ`R3nLk2|cZwv;2x3nDwMO!YJ<`y=8d z;6w&Idg2$>_SC4#e8%mh_wOGUX>vTlh5zX&rco)I(u#fOil$~RY=$`RCL@UD*E19z zcnl8F(dA-$JKGKq+kW7!Zi|-w%m!kkt`|PG@*a(unXw)7;`=kd-FCQk2TRB&7ZC?0 z@rLYt7gCZAyJd|heb!a)Up{>J5F86TzNd5d#{ng+hx&4Jh=DA6kJdQw8hzmXt((Zv zLz}J=bBg7c9fV5HqPY+6;778SvzVkikX` zstA}#m}qiv$ki&D2UH?u7&Q?n??+uNQAJ@9!EckNm)r^R^}D5y5MsBkPgSLavUAN5 z{0Zj*&$8B&F8!V^+S*;Pgdw;s*c7kc-?|J|37^+$9XbnqdN`oke@ZtfxrHb_R23j5 z`A?T&QFi7zj6zZXc2Q#ZG=RaaPhRWi@G(6-H{ipPKoj_v)mxWu|8fETSr%qLCruqp zl(H%?n26xT@V1Sys!1KSYr0;+QclT6Dv&;~5Xy2gJFW2MiG9vEGP^}8VGLdhXA{(h z{%LP9zfW$Zp`pp=3O1rj0mX1tr_AA+ry%`)uTc#V)zI5`o{Ek(ttyX;B;W(i*BAcEtESHaaR&Kl zfI5^oTE-l$#ohsdz-7|<3gaWrAEej5+hZ8LIgeowm~g`0UHh?^!D}O@kSet+HUvou zZj*9y_YYTmqhuA?@4{os3c3u>l%udyK~|QNSa%JQMFEl${O~aBh3O8aPlN)}%WG?E zRcdP#X%$-wDq9srbHJC6@$gJcPq&XR;)>)}jO*}(gZma27dPg(cL|v$OG|LfA+*;3 zTCpKPVsM&?L3YQsk7Z!@7-lVX7>NCXe3e-N48#N1FIvOgOtsOW(Pa zgv2@+-v&K+U>}>k_f*MahOBEDnrLe69UOWilHd7#QvODH4qG|m%Mr(kI!9MIP(PiI zmpA;qX`b$_g&)nhu_#p&FphQ16xggD&CeHW?rrEe#=7YZ^#a)c$;}9)4@`DJ_3x9M zJgWh(mZ|lmXJq#5)_UzdJur;Y-2JJ_9TBR&_wLDy(&8=lX%>kgSZk_DYO6a{=Xs~J z(O<9%-M@D)zTVMI0xHpa^?Wl1vgIx1!6^Gd`NhQGB#IyY8V5@i~0tVt%~AxEyEw> z7HFM0v%R1^#UapdX{xs__q@M;R+~XBTV!R}S0eg%0 zA99u9)id&fTlHwo2;WV3@eBQzc(aW_)%f%JH`5#c^>6U^|H;w$A8ya@0pXt?`#ov> z^UvR7qd))L``_P7{=Y<^f5|`m7U1!D@8Ku=?_VYR+fcCmKfn0)`M>D|4OZRV|K;cL zi}+Q^R6iWqk2lBP1R{#NJJIjI)hFn{LRv8Q?gt@0+{5T91*lS_I{HWnfDad)-M!%_P^R_*?k@ zV-U^`cD5a88?T5+TWKsM-Z`gI)rI)Lgr1xZnqi<|& zZZu}pQD68vzKB^7O+aNUXBsQhW+o_94bg-{!;qhV--NzDQ=~t=Y5DtYZrkRttL#;t zHGTu2KLGvsNx-1p*CTItTD4hbfqIC<;v+CZ*3Imk_!)+r3)#@9D6!6&f4IvZ3vwm) zmVWj)*}X>tSPYH{Oqg)Q-gG}s^-hyV?Ae7^&94&^9rieh>4C1S5I-2yVU>-?4&4a6 zd>b}9{`o~HB{~mKYVm~E*Vn`0b~F+3i9dc4w2xWZl2qd-q8l*%YWx%s5U`5`{1RyF zP)?xlytc>WADCDA)~!uU06V2q)j{EQhcOe_OQ&tno+8Fk>g;bl06ui?hN*@;h>rjZ z$~T&=bHIqk4r`nAz#S*=>({b_0eRy#9q&*Bz5Kn~+pFNH2p_>=PpqGQnQJxcj1rt! zl$8TZ4f*Nz^_1e^H`w^8vHR{f3?lKKWG`!KK7I7)qZC|UbJEkv{_D|b6#%%s9GCXBercUz4g7p5!;P^W@4#GcDZE*l##=vr95bn>3a+nshT1Gd3 zONw%4RpmD|=gxm9k%iVYKC<5T`5H0$J}MCr7!dv&)yL(Jo z#yEu7Kuhp#FexP5lKF@1ZRh`ee(Gbis3|k<^GyZ26#-Y4dneR!5A0|--{L&F#{x$^ z9Sokq1v765sWgI1U~ks-i1`(k&4HgN;Wmj^Ws>p^%Jpa=gh%SzADSI@)TO6qSt$BL z>pXyAp*X`wv=WYvjzC!gdk=K*X*xNLt6IVyzrch6feoipT>0C)ZSsS}omDq*x(a-t z_`Qqa?tgS#adZD`P&2X#vJVa+$*3C=1kHkQaaThfTrQ3I=^j6RyppPq))?t3hWzh# zpIB;}@NP_^Dma51VXRSYCLE2~@Nt^D(DZ*Ep=|>cnI9g%$;^D>_dz@LM<{bKR;~1n z3vf?|0V`^f9b^&%KjC+TehDcjHH^*UiuUafDE!|K zW7^2G-@oS?5k+@%{i+sXms`d(53#wqVbLSz_H~~f1}Bi6G&VI!xhby+`3f^#0lq?yE_a1cV;!-7(BX!3kF_44%25BV9HyS&6J#yQn*2+ip`LqO2mB2LXbXHy})bhmd2#j7t}2oUkPWz z-}&gx;!o}+YIa;%TjLIshFwRWKGy65LPO#2=V!~L(6IY}zdkmN znXO!?eM?Dp4h4oP9C6wB&8WkUMQGxqTrfV(&cn?oQb#m@MB3F(rDUtfMh%c;+)VGre2Wcm^WW+Iz24#X<-YnWi8QCy` zo5N~!H$Knxn5Zabtmnyh)C^aJ39u_urCqE^#J^I(Sglqpt zv49%Z)xC!Qj+WSye;?^>)<^$){Qo~Pdq3)S_3qndC|uC-rLB1}tK9B7@hJ3$sYH3# z(IOwzBosBMOD+?tjD&F`#coV>*mQn#W_?<0_Vrl-NdSfS5tT9+R7+lJBj2vn+MQcd z6qvY9$~_du+q5G%SF_Kgi`@QjZTI*#zCX|8rR3K2yP&Y6fx@_{PX~Xcp1F5gt@@@I zNT@g49{h4zMF&QN3v<2)q->=&{d>@k(p8Y#npNeTFp;;|EP1Y$n7$Wu}?42KD&Z z*x!NtOM3oVC?}JumpTFcG-P-zEYgnqd;H@fOzKS?P;)MSB5Z26(JMMMx+}{{FZijQ z5sdRa!)0-*vNBWlD*;WqktmYWP(6p+v|~HRvd?5SORYb(*1V5GSC0}i<4a$OyuZ(P z=*&MkMY#7Z!vHw!&s6Ye6`EV7S_-_KesyMLzaF?Y*;-0re1uZ6b1u>&lv+0Lo4hn4XU`)?5-*m62#000UP*QPM5P6?B5g z50F7lNr@NEAn;uYu5ZD?!4c|i;se&?&8WnnRzA$xo$EUwOSScbQm>GtQAC!Nutxcv zMDnAHSI9!FSZp($uS~!a?{wWzY^K*Ek?N?rd#j|1a=M9>zt>MOfkj?>WmnwIhKl<; zRYPa?ylHKg`(V8|@$hUyk?Zj52M-O4VPp!BNhsn7JNw>EqT}(jN{DOB@I&s4J_g5M)I|2``4?#Wo!{C&O-r@aOSOV>Y9M(h+oF5b+UD4985V^=`4O4E4BHotb7N#KcVQ z6B!x^tO3R*NVg9;=vw;v&w=GF{j?SV$8WkPP!Z$V3nrIr$t17H{;YY;X!V%lsPTud z$Gn2?QJa3tSlBzyNw`)6jf~&??~s|wdwKS6g?n_{CrrO8vttSA4(Gl#N!FiRbz=DK zWv2*>tdcPKN9w=FmF*2yy${SkwaK5Z%*y@nfab)_*il-qj6&{qiOu)?IvJfZx_5#F zniGL6tp;90V}!9IY;wILGW?F>oDyWA^t>Lv$Pc^wltVRnto{dBAq5H;xrowL>=`dA z;`mFI6&0A{byx|rf}-+4?v&GEv%8#?=?4U{( z=`SyuCPwsI%rL+B@`$4O?B}o}#qFG<0M244G%*Wg4fq0DIZRIdj|mAm&E=R~g`48YJRl8(x@Tu)WyAzcBV=OD zm-!YHA2kQ|9;1E$OfW*AlA3uJ;^U!PMn=ddUN`^C| z`?0c?U1Z!2COP78C2c;(Dfs0i&3RweAA40>Z_bHMFDdDp9TZnxJiRIyXww`eIcXYE zJ^D3w2TR&0_pE=g8U6Gtwl8g;WvbfrMA1N!jU`jSDB`3JaZD7gazs14g*BAQq zt?R{|`-6+eaI{)6D*E&UQ;9j=)BSoTkS!&U+To?e_fq$WA1|9{RR{;g-#wRH#Hkww z^0u!R6-k7jJ~eqls?^m~gHh*FF8w{hywcW|6M>Zuxhmh@u8@qd-C`ZGB+qiU`kZxG zb?`wLVS~VK{`4u`6vpHimT5!lhEw(grXJ_yBx*2uzKEWyI{`{oC1w1r>;LAx+f zSsnvn_yf-uJW@OL;z1sEIlVR^(AJn|OP~l1TT6tVDVOcJKbs^?^<27a+Z*4v ze$R>NX(`WlF)Ecg8>%&SQLf^V( zcowAGZ6eXBU-6L4-aa~6qkBVh#G>%F(q|Qsso=7g7gEIhcU@)D_wX7UC%weGIT~{B zN7RXFOU|n)i-rF`=)@_*sYOM-tryIk3-r?46B82NzjzCWaR8VnPkvbq<2QlBEPzk6 zGRunxR!cs^NeR|2NdBv4P@MPP^hLAfpqclD^abEKB}?#JmW=0xg2+x=0s(s%z?8X&WZjy7ymAgXNWwcdoXE? zz%ln@weaE}j$s}@_4{dXXrb}WHX#L;`s~{&uMH1RyX!$Ub zS%_+Q0|%J?e5blq*T4V%SXd+bTIZrmd8^dQuKg|~JO4j(fSrQ=UpT;qgyYw?+mFn` zc`E$zkL;{yRcPF{Df9b`YM(pmBY9YuyvyV`Szg}J3Wk`4#o?D09x+LL&)qEvh2ZTS zL$PNII&~qx|J3jPT;<(a$tN)}6Pws`PSNYNwE>?6mVe->-(Zpw#}n;T z)9xpBjF>)8LKO=SBe0Fh1q)E2#I;*-R2!d+zts8pvn?zYn$7gGV(Jx1ep>I`y_<{r z0Y*J?3tFZ8Q8&r{hl`sUzH;NP2zgW(t=*27eB>F=N@TkmtP?>GQfd03G{y9mwbo_R zQF`Gr`Q*U{Yl-69hvL>h$)&A-cJ9)X9gg^MaVG(1&DE17R?=0Lw*D>n^RDX+cNSn} zO@0+<-n%nB!^<$fEprF$P{jQ5IR=9|fxg$fHMl*eDLuREWMqr4_js5^RSkY}O*}&^ zQIogvAesqFp<(1NqM!niq~3<#@-=;k!2zG(9Dsl#XYr{nFNDKMuoOq&D16`n?ST%q z9C{&<$}^xPQ6=ZY2fw8#$lPcT9I&IkQ=<)MI|Bm)FE6RBlH=ecH?$jgflcY+?qs3= z&UUIQ?rZ>3qFP&82=WsozT18xsZ^$b)^qt6OXXp0D{b2|7hkxL$6xA>GM z`mKl~t~s*DDj?%rMXe8$KQg%=_qtvpGl@A$9JkS9a#x<=e6&h4+qvHw!5jRYS8D_$ z4|XjsP4Yg>atv(UJVpzhqj6Ju!0_Evg?|2IHj#3-fp>F%pTFImtgHa7=xdr_3&LZg z;MKfdEfe74sHu10U}?|cCpEIKXjF=Bo#7EidJE!;c`7)0c{x~lk7BkAqxGxt=K&N_ z>AwTa=~ynbB!{qd%n)Y>e$hq|DhPvHt0o9(Mq#BlH2@1!0=(otUDTe8ozlla1k-J2 zTpWX3+m|IJTWJMyx8Cj}CB21{6i{?e$gb^JKjJRs7BauAxhX=p{CH$V6Xnb_9QK<) zMgDs7t}sJaL)DVe_{%cWIQgq~RO6=!qAmgc-26f6D-_SV1k(N)?#hXPduk~AA&2Gn%o1?BXb((IX`LWj5@ZIC$XG1SYS!qMAcLUev zs!DZF*s7AlYzn!>qJ5611FIJWouc40gd5jne5i?cwF@~TYX=BtsyezOEs7@!@erE8 z**W0-P@ifCv;e6qt~|AU^I+NiSYIFtKSjNpq@f; zy3-))gyHLuM?QXS(`3!61a{O7CWZ67ZQ_3GBK~JDsK4r!FW&QYs?Q`UASa43^?NM+ z+1g{x#iI4>+PVMBWc=Z%_}gViC{jr{`uM3+DD5-52tE)iE3P8_4Y?#3Z6X5&nq*u_ zB#hzp!%=Kh#G6wS1U@*{=p(p+VC*loTBG9kgUoBCTnZNrL(XR9;*lI2&X5fi1A*&b z9}xiz6f7}UjSv=Vema8Q1D<#`d<`T7a=Nof)gBS6oRge@ghoa}J|$*T&6-hOY5XXb z_;Sq?h{vjX#S-6>zkkV@db{)#^;Y^*e9h{8;vi}EsMCs+ghU|v=-#ie1i@?9p0!`U zz`TTLsZmN(Rdu#a$0lRduaSpF5v3DM5i5;E5tX^cS)>n(o?GCYY|4rReCVD8wte*# zrk$AgCI_<(t2sa$vAMCf=vGwG9>81Q>ei9@r0CQZU!zgRIzF+3(|Alq@X*Mnyp(Es z`%w-KZ61N{(%Q|X-mPcbKVH@o*jzT`Rvka;%$@P#=<8Z1{+ACm)B~;Qq&y7_m{`Gp zGTR7DH#nXZ#F#^$S|G5y>$#@tm6Me3`Nx-i3lY#MrLX0YX`R)5I4S99JDv(2sx_XC zt?3E!B$L?-E_b{d#*S}Btv&&bap~)`d!i3~P61>kC{1$SVpU8L z5fS2hL@cw!BqhPT2F;HUUM(z)9OcJ1ET(@(2lrY_IZtT*hOtQtUg+{R)zm=ar3?Y` zneWnwc6p(nUIKiAetp$t!GD@ zps23IabJYk7*KxexAVkY#m%IHB0v~P8y|NY?4GZep$J@%95&Kv*vGBkwBH~2H# zl!2SS2Wd#t%Md}XQR-D{)#VTEe5%W9)b{%9=~u;DRQTh?z3&GriLvBg6rBsQ$uEv9 z?H*A*64Gl8wBE+b3dEG}Tcir9>cF5O4!0|bew&uY%ggJ$$iQEW`5$a{?%esSP1q)< z8+!=kcope~0f}g*s@pzlP>Xrj9lPH|35dSmqhBK6$Fz5M6Ji)drl%lvm|3!7MkGr= zAw{XrO|kabCZm|+}SX^2^ABhKyjjg=( zEWaAn$iv(GKW&~3=G~E+=@Cmi2q5h~Z?f1SLm}Ktv~gebEXqU))*thSw1 zZT-gGdGl`1Z8H&>BzO^Il$NwVygBrk{t{pG3-05Vc7^9^_s^5M4+br&|Gc<1 zuG!L)E84%Abgez6Z!mhdLTd4z=ko&|N1nO^&AgE4jtEJh|62Z!65rDavveEs+rILF z3Mdlo|KrE-3(fUETMzaJ+9`rl4D*YgJ=Rz? zHO~6Te5P8u*mg+Zo<9%y#LMl;QT|1yLNO}nP~0Jl%5(Ea*&(;+?Cb;_3y-Sm#>VXK zNpG*8B-tMamcJAbD`<*-fHeFsHPBVSwIJl29ID z#1cE6Zmn?1w(-T3`B*<-XTnw;w(j06#lZE2Pai&V#H7sl!P#5r+6lqMN1GP#Jb~b8 zY+^E7vN%`r+}|~1OT(U(4CT8W`N(r%L-D;H>!;VdC8#Kx;|@@h zk0f2u4D1iTAM}v?QWbadVEVy%T^k0z!#9^cSI(vB-dZg)_qZn175F{LBiF9hVp`p#kf*B;pQwu$FY4;{eEvKG?%?>M+uhQS`Q3z# z850ZjobLb9AEk2hm_JRdF@1q=#_CH{|K4xvlIDCE*4Hl*OI{H?ncJnT*tJjj_VW~( zbLQ+X?dcmOg=^hvf9p~Q83*JTGw#V7(>-~*N=2CwV-ANXz-Dj}LJ|tBkVd8I=W4K)JAFji%xs-ACVlG3uyDjI)bt<~w>A7lWnei2k)lGpk+ zeL63u`tRi72I6_bLD**)Rg)FRUKdhEikpFZ2E+0U2ZP6`CG4uoIEfON{*`iQzBjH3 zO&_Sg!e5%}_JEn@-TspxBSNwIVs|2J%wJx#>dn70sFRuED~ajgY1bJ;Fl0g4f5GY> zaE+j%a(IKpN^q85H9v*p#+Ue!5mPXhb##zYr*rvog{O#uippq28oE|_zR?Tv@{osI zM~RNGLTZJ3I|D6rzlm&Jr%Aqdi7PBkA(rrrN^Pw+?b@@;V5P$y&y0NGjz9DNUz0}d zqY-KlNyJ@TS$?s{og_YI!bmh-J>3 zq|M+dU^7A8!}3XWYi#K&Y2+wrWI#gp@McJx?uM zf1MLeG$%xJ7-@Y3(afXwlut$4eA6+aTk7-OPx>j9GiGXfI)~$X+Tu5XK3&3;blWy2 z3UYp_QQ-^R|K;y{Zmgi|bKRFPPkpv7-+%hi2Wrb4c{S@!N-LR#8| zMN8wikFQ7BRpk21NLjoqFP$<+nUQpW94hqKV-Q=@%A#~KN4T^C8VZk!S>$Yga z4gr7U0yC2O8rIfNeo`?`cz2C9xj-w^bbs_z{nbhZ><&1xN11cFCt;H1ZAtx?wWDCb zwbwh3G@8g>dUvAfQnuc;I@8omfd+HIs>(`ub*E@%lqp9BC+l^@bpMLUaAVHXWul@| z!({yF(^FUPJ1SQMd4bg@1cw@>>71chbsOZ^*?UvKAao|VzHc(~>%gJZYV(sLr? zliv@7q|BaU_N+*75ifaMLc%aU`8Fvjaw3SpR>FjwKQ{T8waYF&m%wmO*HvqaiSOdnH-INm?bO&zgpUA|xip14<4sJXz`K z=uZ7E?b6kgO)_KL-Q5Xqdml@O&2trurhmgR!y_YePj)povfb*X;l@F7de*XA@eSllX8N>7B?n)Y1m+{pZzlXDX^VQa#1y=QkLk}mP zu9cDSz01+bcN~L^$PGg#qC`fbT94P)=AYBk(`&{?a61=lfFg(0XC;=!KxsyK0?@W( zbyE{Wlh~DPneHFq@1&9V^AT@Hj$}NN=Z$D8yJvn0vqIRBbbh3li@$`u^ADR7EeYhz z)-!=M#t`eRfAHxpe@^1rQJnh4y+JoD7CMKh==_GLkq#wRkU~^dONX^&9Va?6J~6pN zrX4hyT~)F@$MseM2Qn*B5ByrNh;FDdSO-~l-|ih657`WJx`P?Tq4^fZ9$f?tpm3xT zOu-!bcURYXz>)K)kZ82d+fu_fsi{tCzLo0wU}lU=mnl<_vmNs^V)O>TH#c_$Y=rjT zL*w=1?uill4=Lxvpz`jtE1XP}p1tEPc!fTb* zIVOHL9$Bmo0A*nPW6Zox`W~nuL>t8*eR`XUWQRmn=w}`*le1=qK_($i5tNu@i!S)N zFK}?bt)uy*SPr zY&$)=Dvj?4%O6|~GKrbn$(fLoKo4lXK|54<e6g z0yw{KC_%D4I6OK!ZhLBdLvpFR_z%f;)y-Vz9uye=*YV(gjxG1Hz7PF6WaGiRl=n0U8`!0X@BE=IN0?46ikTo+S=-G#*x4 z+ZmMJNMgdndPYXZNsN*9QHD?l2sbwzK z<0YHdVG0@j_?UD^kbwFuJH2W~Q09IH;oP@vW8>q5EhQkp;mIY@2#SoFHY{F{7UBJn zKCsBMQwffcLM8}T1w#PCi#QP~Jez9ZFQ&9Hfzu+|94dN*#WE)xB~_R1tFq*{h|y8Zk3gGH?*i48?F*s>AQzBKciQ9#s3&ilAfKTk^2h9_rYOwR)B?v4(GwRuO zh3kN#43;yt7Tkk8kwN{5;s%A<0ZVHy!BRDXJR)LD0@;dcikg~7Y1amNHmwiQcnb;( zE2NMaT_>1YIt)_L(XFguIELgR0DHQJow_LrCkXo0ae`HQjd9}@)s!$EL~SB8VJ$g! z%v$=N?Y7%ge=!5(+?+iJbIL=H-4Yz)N1s2L^Ubft4W8JT}t0R z&^$Su;9YYU(lsg(NZkUP*i}8wkG0r=1dvP|Ill4 z99k$x`U?RK0RT+^$qXvMxjIF6|IW9OMURPBpX$v{i_k`- zmDMdT7JJ{ld(>?v-s8~QTN%4Qn{qiC~;O?_w zeS&WGVg9*)sH7jMjS~x7YKrViKD8#?%{XyOnYe`X7$08~1WE(J85NG?7nm5%u-mVo%&AUe&1<94r3i)sq0N@~ul< zS77hNMCXZPFY}MOIl$;^OaGy)N5FPA%qtQSh?R-gVje{L2qUqP_Sf=k@QWZOQSss5ztA$t}Ph z^erM8?r`D1FF`Z9^p?+<(}N%s-M9$2kfR<@d4NLyGS;Q6EAW!qtRXbA_^&PdTW0y! zQr{>N@o;|&Zl(WAk*<|91iE9k=HiSz7t@27fKt_7tC{`)B#j~3+zJ!ATZ|J%9J|tBW!O>Ay z04rchL42%Y^Z`6zK;8sUr2%QdmBG)@YBGk&K=@vqBIF5m#`1$Lk=w#A>J!Bwt875o zX`*Ah{<)Zg^=;P?u-}7EN`8JmY%X8I!&B5Ufy54;1EqMVRz@^FUM=^*2bWB|>IH)? zM8`w0H-u8*BoyA+-pY^xQ|Oeh1njIoKy?81FZl0#lt?^0boMlQ{Z!W3x%~9DJ!Snx zY!(-elRLRiU~C3+x)mvK%fbQMyJ%wmc$NE*NT>zP-BE_UNWl3Vk6qLV=i23PFAn6z z3g}1H>|vdg_4*+80)Pn_8I&^w&ZYBa5v?|h+g6Mw9M58`ocqq5S-9#la&m2*o%0?7 z{fUvy5SVid56>31TzB@*5;VU*YL%`S^fonXK*cH~EKJ1oT(6^9COIF#Z92O8pFe3K z?^d+)c+v!y_{NG{Yz>@n2sc17njXP+H)ht->qIz?t|EG z@M!~Mai}L0q@^q@m>FN^O})+b^U{KD6~&bnOjOH+!6Z2Gw}jQoX$aM4PeQ27B+=x; z@%=xI%HYY_-%n5I*LZjvA%XIhKA8q}BzjPc@@j)=sjn0R9y}R<0YPz7($SI+1@78l z-p}`S|9DEbVNPez0c8mH+GX&D?1%$Z#A5^dth!GM6N%79cq+o51H6AOf?@-@CQ>b|5{Lsi zDW}|R9UdHPqWrey^7iC4EES;KE3T>%260z&$erU0D06!P0%7o=5U6Q{8w=P-$$5eQ zbS`>GV$gkb8N zi%K7h0astYq9%&u5b#TgDhC8e(?$p+gcLjE{gusnR*O)~I@sI8u*te6T0pqfUcbIM ztNWjuJkm7lS7_R~^$L?#=`YghJn|ale0S!M0|}b0v{iHD@TQ?kKPfOIoRIw%8yjTL zAO#CDlr4aHHaxlXyMLGO@%7H~~_ELt3>(iKad`NT;xZ-iv zl162*)f+38NXKa;R&i7ne}x+XK0f$rp|17)W^B!7DG5-)=1ppxggHauO}$qR-Dr%G zdjjF#8?=_msA#MmDh*H1pD@MFvKKcaS$@swsr_+VzQaK~v~tuRwK=v?3Pa-o{WP#C z01Xw?H#Zk}7ni3S2OJro4#zxSoP+L#scI7xwL^p0Ky;lev(J2#thBRdW+D7(v8AqV zd~9s2(I_t)<*Ci)^_-awzBlsy^yME(3qT^lT@s;{#1GOIr8>cZT}2s zU9=K;)e*vY!-2P_?r?grKGGQ%`sgT~MDF|U)24n_9PWTh0@M#X%5-H=9-S}qD5niI z<15nn9$1;^6+CJPuXpY93kc{}p$dnI(&{Q}J3IWpk0)usDaW1VFIG`-zK2a0d!D=C z0tRO>m|HiQ-8MAVmjAe`zhU>b9|Cdx+BG(t=m)pih>!1uwSf8<@CzpG^4|BU5Vq<^ z#G0d1HC#{o&+26O&BhCLf7pPJ#<(7RJzqo&{1Ei}Kw$+YTzWAHVU49!wi<-v<;@zxIok1lX=Jn>L7?(D zwt4+}GniHq_G~ENp&=L%Yb{@W(^xUH?(XeHSsXx` zoFBR+1yg4^aDuAcj^yla=oi$p;@@Xx26HS+bMs?xl-;j!H9*<-0yYXwHXH+Bgs=YW z&N)W&2PN$&(S_7$pg^4+&x-;x46h584OE8t30Ta4??QOMKd~!%uiMi4R*mcMAPhrbg##Om!DBlb4Sq0FF@j|iG!LgD zYg+d{)e$)SO_+vp6yXPnER5!2w`g@*i16jT5A>9yqob?n==rp8o>9h^>FFe$ zljCg4QPizXrL5neF-=QrIxby>oPb4?TWOVcwW|{#DSNw+-)vL^qu}#H zc@(M-P`x$Uk0bp3!QInBO)VTD|LXwQ#^6@*oVbqTTF)J+tjG6gX_E>IKi{xJ_K0cH z1X~BI!B8Hs+q_Q=gOlo5fr~BlakY0~f;IaDU@oYIXo96^f^$#%nXF)0$~6~`b0_Id zOX3J$2r$xbA06}8wL!klgZBa3D5=ojN&-zUC0}`bab~=9V%oH)4s9?*BU{9AO$#bC z;L{o>`up}tL#&EiI?Ei-x5Mhz_nC&{@jTC#Nl9aBdW;X5OZ&UJ>IRO+Z+mF+T)Fgi zF}Zk`>fO7WL(ce|7YuRH^n{?!FC`*hl{zoX;cl}Keo1@<8VO>e4-!n&-KIsSqLmXv zCV^KX_O^HXw9op-$0_-702t`5 z*mCTrBtol|2$rJb0Hje5(r6@T^16Is){yU?rT zigx$Iqd~&od?njQuj0}`C4cr^(Y^;Mo@ElCVA_#MGVa4m zWny6wy|MHZER}a2xkTs9_ZL29;Fe@q6uqct3L`pL58HD-|!|Ri7PI+z`{XzA4Q%Z5Y?xCg}7rPe^BSd+zkn`#h}| zpTsf-Ra5!|v!oSG`-SP3KZXZ97g;Q^aStD~C}c?63@QJHp0lKK*B5zq1#M6Tti{2! zsf70$RCf8G-|p>INmpqJgf{}ISuk^;VPn+jBbE3JMwkTQ&&a`-_!;PCY_;F4+Z9-)!C|@#JSIPTZpve@Q(G9-c`h+gGTBjgE_v{wVbth?ZRA-v|Y0k1W?)wBM7&hUpJK`-< z<(LGBWZduRRwTyiCC5DhJp14nY~A zl_T%rcD`WOE607RJ}QfFjM(wfbz?e(*Lc>~gNrNj^0)RGq7VDubtJGh)ZTH^e%9&u zg|I z2a+-%qh*jX-8^2MkQ$=H!8Xi~$^D`MJZJ#$PPiYfZq0Xs>~eB)62&9}P^*|S0tTaVm_#%Im?7vz-E-t-n9f3##@jXJnAqdjPOh_`yGQ40 zDay9*3}C9XGCeOcdb%&G=JeqK>nw@kW8_Q9y$@QBp6U?~nC=p0!u>_M9~GD=%v|6& zG-)fD$<^;5bM}T|9leY>U-!WGl4eBOezC4&o#XWC!1zLXxvcHnkk3i|3rZY&Q^uMu zsldC6S27D6nEw3Y_Xw`qzu;i}H6i8fIK89Bt#28xUUZ75a$go!F}1rr?vHP{8(gw9r;Gw- zYCk)jKE2@{^78b6LU(RFTX4+gUJMcLqFVI=n-0b|<#hv!ha**fCClW?pAE+kj-T2R zMg&A{7F0O#8q3EXt@R;!ca#fLPZCPLtW1XhEg_RkW??ym!1c_BwXf!&U@2gAjTYUp zM)n6`&RTlv=~!T4%QzlUg-3;9|B2qE6xiya_0Fl4jIRrV&1?TgW4(T!Si-Nfyr@S) z(B5!F-Xd}3YITl;?N=@En{IGDMlcErpL+rT79hp?dC%|SL-A)F@Cjf8*dXoonSMP5 zoIY3z<=g^{4$zk4buIN}S_t1AL7^U^M=J$qhu_Z*n-$%E%)RK#P-U&!?uI~gqu=Y0 zW1iv&@c2N@=?+Y(Ah+80?(N%?AS8fR42*^{VQiFrl`ox*%r(Wx;60`DAG)Wv8=RiD zUb#9qx4xbI{^K3k=IR;&5NE+d_&67c>Dk9eTVfFvx-7Pwoff{w2sgfJrA6C^x{XvvKqxKsqp|gqHP@ zghX4hej+4VgBkBK7p!p_c*X&MY7`?wZ# z8Z@fb(I@YV&hK~H&YzYd>AbO~<}ns7U0D!&d}V2qXVrqM)myr*=t6g0zi*Ti-bs;R z7NQ72Rl9HY3$SjG^W?s`G=9}{?2prEExF%&_GA`fht4* zf^NZS`Vh`A3=0fZrFwgMwjd=7Ljn3QCo)<6@9RsGb+fJThQ z=>|?$MnXMAu4)vpZ_}A3D`(s3QFJwV==#f2|2zwse3aTIrYy0vb;Zv1{k+lRySn@nG36zyg~NA#N4Z??piNBlwkndqK26cMSAM`!CjRjP zUW060L|?p}@~0Zk{^)lEHV913d&n~>qlTzJc((G0ppOH55kdup?G|qBEyBD7&K8Wf zvcWbU7w0T>8`^Qwkwv*|HCeh4py3dzfFcx9h5)EsiocEo>qc%~UNG(l<1Il3hItq+ zz&IDg1gJPtC}a#rmI^?kCk#6wcv9~|QboHnE>0JUY$q#gAJ(qjV15PQ%=`)$D})-5m-4g(0HjZ&l08tytGlIp)vZ+`M!j5_02l-&ehqm3YLtY zUtY^=bdKcch)XzFc7(gD3NIm}*KgMJOz?MZs4K?>p=C9<%^CvW40{tywV}gZk+Qen z0jv%lU*I_a9c;T-S&^HEC;t=R4UG60o`P}UZ7FniyakXGiihC(QS(*G&;0UKlJ7M& zy4h+IknI5sIH$>XR{JzjEsm#NDlg*=~e;TT|aMdU;sp) z74fc{%}{8tXp{b=S&m9bO-%)(OYr!aOpS{(FqY@Lq{p*w&PR5|=$?QWYkNZ7-PGGY z3Rim48Pf7Urao?6jGJ#!YPbQdo_jRbsxCA&c@b?>Y2MGgBe_v6{v zt{Sul#CsG^rSms7g8q@b+4j?bgH$pWdZq0(8B?BVQ_nNXap{+e z-=sUu=dpwZE*?(-Gm^SaKZnP5y z9Dl+C?1&RgyWLv>_ZUL#AGMa3I@(?iJPIL1SC8eoAV(Z5^*KDe*!uSmxMA}L!A`;n z#K>^o0WgBY2?CvgH6uau6ylp9_W(sN)^0s~4seJ~LeP`Du#z@v6l?(ZWL8oPm0)BB z_F)}@>q2nj7Fdu(r>4$>clGJvKn*H#o`3*FKm=|!3~me9==A+hYHO^2n`^cB4^0-- znQJBOtCiOibmhvIwpBY&;cS#^6?p$*P)6r<)_tWQ8IO2o?U2jBd$g43WG}(QsX_9v ztBAJz%HpqfPk#nU^x1f-oRVQYsmzYr&6YfuS$Ucb~!oo3T&*+|4RaCuC#B%Smru&T$TJX6{sbWSIEy*XC+}4;g z=$PWWT5^?$er+8mUa5N1Wc~DFpNExAym(>nz?YXN_OCIvcpY9mn|74Y+1=X=V$LTL z)l-zP+!H`Q5WIT*srcm-;C=kr`!e4%l=ubCE4!OGXG9FUdC*LBG%1ZnwJZOKwJ-TS?&}0DzS-@`$3go>0HhnP8&3yKK?xXiyM;sXr z4j7L88XXlH5u@3qU4u0QTo9Wn_}!07^SFaJ2j5@00V4`v#asO8QSbXnR*>*ht-$6F z-Qr#jVbl=#s-DZVuo4&%gB`l)5i#;9;WzLn1bRa&U^T{G@UYh@9P*p;$tTOasYliI z&fe2e2Tnf!XODngbku0`?c%$M(ei>kgfSwi&WZq&#dP|zh23W84$tV)H@$p?tt3JV z;UQ5T@0#*BuNYw+<4U*v*70&?e2JNjuSsv6Ma!}{%AKN=wELtiGw1#Ho!1?u2lXol zxND^jTfdjCbpZ}@oKrPw(}OImh*C-iS1D+Y0SANu5KtyZ`wgI%gAZVa4z`Xc)C|Hg zfO#PT_SbCtzCg%;ELE%l~j^-mBf-Y^-Re0scTEAlUyfhAHgz|#i4Voy2&bGDgRAdLWQ}u8HDnvx& z`P8qdgNnc}V0d^KZUuE;TbL5iOueSbd+s{dMxurakmp*$YHe-BvMfbX&Ooxo>Z(P< zMkgH%3}K26M~%xKizxfb+M0u{EoZ;&OEpxgJMg$3KSsv#7nqTuLF6y0AOHsc{jjBR zm#bjW@8SZjn;EF<*P58#!9(6|z5qc2iMMHRor7bICz=z+`$pgA4<``Kfw+qxJO*pM zpF+QsyyWdq6X8f`q0F?hNLN7jdqJl4C zuO==~f^M9DbJCqb`8rOpSV}s>QKLlC8Rz%y{Fcd$S0a{%EO>anSIkvN5)q6@0vP&_6D?MT{H}>gi&RwC&Cn&Dw;weX zH_rsCI}_c`x{5`=v#$H*>vhG2-5l)v-O(FjU9?_Qu(HDa+0e zkl_56(yFRqO6j1`&y%A!D0&2I1dd+=z1l|`Uce`|{`}#yTX+KFPM|!&0dAS6o)6+9 zA_h>tr4Ta@>ED*4rFlSo@VqHv3`PnNLC5QHn#K4G6;%z+vK!DJLyZAmFkb}hO<{7$ zT64S!L*2Gg=M<-f1Rv<@APq@$4E_r|)L~k1rmmt==)AL}nyEJAY|Qf(9*ZG!{}sG? z2S!fGSJc@V6s~R@?|mmi)2uHd`LUUaj8&N_e0d8!qDa~%n&jpYT{w?fFu%@SJ1>3% za+$j&avEsG@FaCFJjEMHF#m+Q{c*Q$coDL;v{1M^?&N!4Rxq@GkYzHanlf8XbiMw) zetiEzlH;c9sJpu?^PQv1%G~mnQ`)45Qf}1>nmftGLB<_IM_(mlr{isiI;isU+bqiF z6GZJ=M3#h3UY$)0Ms+xx-sFE|Q7$<%{c`OXO%4sr>0Len7zERL0|tm|fV}YKn*O>q zaS0ejK*l`GH;f*lT-y8_6k&=3_IKuHX06T5FQh;D_%y;82F^XqYx3r+4q)O|W4G81 zn!jr3d*S8>4QXpz8(c|5cH^r{Fq78E-h~bgr08nExdi?CdlbWn^e%LTTt}wP|F)HhZ0XMYMfJTA@dMV0TwNM0pZ1(CIbn@NjX$6=6Vb7?+{%mc5B#c(WU$@9J4bDZyfe)5XW}u7TqqpYD1aHFx$R2kyESm-AyTeA$2nD~gq! zIb?sVW;WGl6X_WN8TrtNiZ^~08*0Ns9hQkkqY|C|&R<-_a$Mf?^Ij(A1s#8I@CMAB zSfA&<4ZEh!==Xvm-|yqcQrCGX3Sb9>vKgETwHj%VV5JObLSA05nM`~4o&G48TmTCM z9K93Giuj)!(GVWDzXtddd@M4uCE30B`1pjtQb$qrq%iv`#~mnc>797?@7**T!lQWc zA{)!+4o91{VqyaM$K*$Z_;b&5!a_QNn#?d>-*q=WLrV%1F`%}ZJ=wa~RaaHmSvf_E zx*?}$7Z!f?jLfgRbP8?#GA<%1c@o%ATs)9Q|?^9Es@rQcbo$!9endl;IM=JJrgN(9W_p0o9U(gm4 zdy>eet5n0))mjOOk7o^ShDEr&EPR$5=IVg(LV*Q$on#<6eDLCIv+a@4u}~8*GI)7; z85x(Gf@xtwT61=?eg{_?Aa~8N-CyE2fhOEKy9uZZsJ6gP2ZAHs`(-}2357L7^9waI zSc8#hn5GZY}ze<~6 zZIOWfb-=X@Us*V`2*!<)?YU?*^52iVhKrzMVlwYl3q<2dICNjR{=@&MXUndm6Y7vj9--(XYfUh5*~{msHAdjDU9O|=vR$i)gw*MK9SU$6fdT1 zSojYEC{DrJ7T_P{RE5=vnhCw9A@K6y6~6e;^9sg3DJh^jT)QGEs04cTy$R{@xA}l_ z4n*d?Z%dScK;YRmkxMo4u^QCin=bSh7Ej#?c@1PKGBPvkM{ZDsK`vk9QeheR_uSNH zHS`h7J5?3SU79>=d;(l9A3oP|S0nh@{>f(UAnpTPu@E61Fcc-E` zWWe}$=Kw66E+4Rpx12Lo*ks$9J{Y%nNzeqRL23*Sj{~>~0dIo7xO4KyS0J989FoS} zrws449>Vhpdthq?GXOB=147b4n8ix3{JATMuWY^=B35J=9S zs9f{YVMq@O-2BjLvS`pcIwc~Afr49E<~EUfoO-dm4Ulahr<(D2*NVUoh$eSXw_ zAbob{DMVvExNQxgJmYVCeSs$hJ0c?Ifq=G8Rt$;L`NCe18f0Il{w!cTO|$D? z_1cS=1`cF7P6Db#u3ed#)cf9LOiq!iHSu;4QjcIjKH`iIuUXlbpt{8PTzC&AVdV2} zfQ|r>?59o;=Mh^td6e;uc8~H`$3kPOZH~zmfZvrhMVxopZ7l2Oj1wJs$&?jgJU|bC^_3fh{#yx$>{!d@6hOi- zY>x)MM4+<|5FX+PrB>(x93OqnFG9$6{qn_^56)i$T$=+V0WR=fFfLz&rF%J`@onBN z9Y?8*AA4R!6gH40VW~rj|5vi*=qo_X59qE~0*v1v+A+P4$O-O$;BQD$I@On#{Kpla zt+7-r5qvoK1O+v%*up0Vu;9C(zwz<$S^m5fSx^xb2+*Dzq=!Lw?ODl)H*a-e-YJXom?4Wt)eYguKE~Em` z(a~{nsnCZ;d6X%oGu^xQA|ScFQliEbN)N=U+G7bQv6!e~H9Z^vA4-@5g8MsAgy1GS ztu`bq{rfc3>uP|NZ-ufTh&w34LfYMxyB8oUt(P-??@EC3BN0 zF>;6b3&JR^a^LRWp6wZMv%zv2j|(#w2tjCUKVc~wasKPdTFli<9qiz%AoXFrEmZ_n znVlb;Q811xvP=%;1r|{r?F!CeyvE)lTi36DEz8^VAw-z!@HToh`@e6fmiRV7bo#%a zz9qOV6utKEr?rFDPPg7CL|y*(J)!-VMf-m-Rlat9iQbw(&UiR% z#8f8>7bGQJS&gUz9w$91953&C9}6e)t>-LoWWe6kUnUv%TIHu(0X|S*KbSnH%EM)O zd++a?uI1{P`2I+Y%RMkK@cH+vuz>y->HdGcFaA5(|Nr2DkMm+n1r3d{RAb=R;BnmJ z9;><{5S3Ps@1Y;C#=N!pdvizLfRkSPMmyW=muZn=4z`U$v_akM-}E zB85Bk?txENSlA;}#RtOxq=NFl6lEWut7jTsVkk;%XeiK(haN)O1JJNR)engaqEWQL zQc&33q!3V1Qrd)Y_|G0MfY=S?7%+vf0^e2qnzTUi{UJHMikXS2_j)dD?ZXF!-c5dA zdS!jli$WZ!vFb?=KKp8z*kV5gK8(JYcdAnQD3DU^nxV5{{Z$*uc*8`MSzADgF`NHE z0g4H9ZhAYN3}tWZEq0(zF==M-BnYs)iV^vJR8v!Nd;7}Xrw`4f!Phe?zpc9qN zUNztqRcu!_H~C9ZtI8tkpBl(aA>Z%qI}_b?e&x&OlHA2^+zo31aXAdFAx zJ18Jt;FjofMmuZP)gIB*@Ri-oap!jFa<@XMFRlfZ?6LtD3@8mQH-0Y^PiFqUX6h1w(BuX%C<_ner%YS0HTL>eEFL?Kp&A)iXgaU zV=pd~4C#AY5T-fP^11c{OrUEvkYqH$O?p@ZKvFyVI~Rd0Kfo&>kP{HZwkU&1#Z?$0 zq8Lc9L?cb>Qm%LwPzOudx%=1xcsOJ=2^oz!xw(Hp7zo9njiV#z%i4i?0c{9~5b3S9 z)i~JL{=jG}j?X4BKfilyO!)qNu$n*Y`{8xNLYQR)NC87Hc`!O~ow|14{-#Y4k9|-6 zk;*W4?f`2aqSO)Dd>ly}BaK@B%beSOnX?4L#TTTQzztF>PP_=^4P zZQZQl&-5YRRL0>R4i~IGcjNBR=m6oajOCTl`p!(z&Xx9Hhd=|j(KZHL1nRU+q0I8* zZr8>Z=?Q?C0805mvt%W8ZEXr%+(eHug{~*SZ`G6}ymjk=1XR<28~~;0#?71GGcxq4 zpMqCDN}XDdr+Ax=V-+Ta;F<3Z7B-+Qs2ZHF|0U67e}l)BJ^j8i>cJ&v-hJgIHK`Lv@BC%5_+jD=Dc61{qDRL z*WE*k%a=@C*3zBM`E&9kn|RNi=bys_Uw?wV1fP&~qrg}1X>1yQRn~IGpv5MoK-u$k z>i-+%DN^uR$@`%HPoyWvmjXo-4TRxBPWhMq9j4GpK+)h)h6WPz#*NU{*+T}fzl9Vz z6b%h%P9cCA;E=Qm!X*#^*(=QJ9ER;)I`dF^90Mlj5$o~cBnQ|&t~0@sgTY@>$8S+l zweLDr5Hk!5t|&0v&dxZL)s>Zd1R-n{E}Sz=Sh2COnP^=OW+PxnhRMGG#f>E7rGh#m zXCC^6gsY0USCnFjinPA!C$e)#X&zt35@IJNShPF1$0yq>Ku)&kOF92FHAyW5CsO>EkF1$bn4GFA4DXh)^g?{2@vp?-2?@SyViYIes`8gjNxA8|*#`{T z#mDAf4P(>9eQKKGRz}ashFz#d^U2) z2`K&I!UD{d?<9goCQq?*r5nIaXw6UoPYDU{X6;;oUy1sz6&eNIeGx^6d3l{?O?4y-zRvB6 z=wR8xl#bU0W-lFI*I%%jJ_*~$EHNTo?0&d~{3X*Mp&}c`6`OKiy8f(OF9OL3)Ue zTU*S+cWwjuEcs(Jq^>8NAojI=K;j2)sHNBM_+4-Vi6h%ax>EY_@mA+Rw&wiww85bW zfbC8%Y#wzQzs!pY*C;*j%>VpL9g-UKULU%`c$nL>zA2apLC zGj#$#0Fxib1t6{=W|$=;GQDv_L&eS7kszK5Qz+_wXD>m^`!V4E1x*T5<>OL%7K!V| zBDV&A@9DX-HZjjYFZQG9>Rsm=|GNvP?BQTIvU_xBWuowl+@nenSzy@mt0>7qmS!p+ zH+VUQtgoWQuICm7ijwwgY~fo@@I6HEtf5*`1|%;h7&P}@aUqx|6?$d-?o0DUnx7Qk zv1VR*`(qA&tMqzPdDRXm6LJ9_kuH&GviFy(%Hs@&gCJy8@ufd^B2NH!dB61MQvGCb z#RX0ZaGb2EP|}|21SncHJ(0*_lOB2|mI8>hu>{On7&t2_M7@}pn6bbSE-u~$lZ+nI zowFJtPB#engQ(>LaD{Zi)7&2ec@8R#9_9ZClMT7G1!QtX#S!RDV9G7fr})3|sPxZ1 zHu3leZISL^bYs2MNRKow81Vhnlr>h@Hi+GZn_bB7^KrogRTQ;#e@Rb^JIAjLbnF((NA2ktnAWI4SfL+nv#kBY4 zOL~u>m!CT(zFff9o{d9O_kz5*fyb{F*9?EI?c^~;6+eCWaB#+)jwSd7W5Yfb=-PVn z;Oy<{gQpv)QvaebQzF6ug93wB)2hmTcSXJbf@HQ@L3}whH74e%oG`x+mV$xX^Cx|P zK=k(mAe-hv@9!g)@H|(qPIzxrSxs#h#&!d}z1O^cz`~+?JVkU&g#)GzP}Znd@x)Mv(|qpK@r88yYuT?q^tFUV?WzQzWVFhPyJrETj+Zv zc4D2L!l?LgJ4}Pxf$UJaCUlvG>$sriw_!8#%SvRhSw_FKl@%)|7EW=M)aakSMH>;SZc%@$NksEFcSyFcL7XvL~i3C7il z6DGc@ZFvJgW`Si`} zmqNczbov^&_x35tHb^kg8nZv${+9-aJ65(;7ZcY=wpw4~K$YiHHEy|Zy!pwij^(Hl z-4`8y;7H^wpLeH(8OLS|?^*e#!usbg{kMYoT0(M!1uS9+;33guu{un142yE{$wb#w zC#z@7BZ*?Sm$7eg!e1RVnivBMyha4#36dKY#(@Z7MgFL&R^)JeManaonZ2|d9El{- zbht3n0`b5fNKIzqkx@_>hngR*2aF!zfXs(5$odPG>OI$U6SxNv_cx*xoj2S7!*_EN z?vIvFg9XK5XQ@w%uF$kE1MX>vas!^gYanR@&mMBoK{x~!iX3@Mrrsp*3;2~fm8@O8?#$xk` z%N&oT;QN@QL?z2W7WH=X=emILXHh*}MpFc_6f4c`)#b)I6gaK^YLB1Tt@>I%6tLU6 zJ>4Aq@L=9&IeYhVcSb>>@LNJ!6vIfm=fGq2dsUa_{O{8BKCi?_w9DbbT2t<;zZwN| zCr^J5*t(8BTG7p=q_&ak>^lzJc3dxIu^wL%eS_z<&60`E(fb8y9e?{o@2=0>E1(>x z!0@#}aBPwA`$2IQqlV#^oubSac4Z~GSvx&Y9fceETEQ0qWmE&aW58db zFhN;atyk^oc%0Y+?4fzncGDFSNMTC}5;;t(`##**=+mbT5g3~gRNw-}pu6i6X8?}M zB~2uP*5%LkcBR` zK6|mD1bb)35}N%>hq`e@7Q2c22`k8@OM{YjdSjDu&){-l&*~;sT{x$SD%tfHR=-gx z&?{QjWM8v9TuzG}dr!%}rO@$kieF6Ks!B`#)KWs?<8CZRb^=eccfTA7^(}s-Iqmc& zc{*j;D+*TVcw3Uxd9jL4|s^x>H^i)zhEZ3K;#G zHavmp1`W!vpA+3QvWR}{g&=P?_T^d15VqVZjSrIZ#V;w8*sWGOt2UwU)^%^N4^oho zogVPCZj>kMSu;HE$(56pKy(W(EGQj>W)KXvVDpaUx20!d%KG;0B~ZqpWIehIZX%Pk zAd&zSA2Wx0Yi|#XX@6T@G$?wrp--+c4FmoM%=J)D*w$RT01@B@uwn{B z2hW*bxeOCAjwo{|`;!Q-0#O>}-g^Xv6U4W2VIUy!r2s^)C<4hBN~8JT0uw-&X40*W z1&45R6g#Bd9J3D#>sgCd(woF~9mCZ@Ze~{vajxFb7z_5@Zwapx7(5XjHw}6Fdu62O z5tYV*j+(3}9;8Bd=+$!@Y`Q0fRD3BozU$4ye4WE3YO}9)`$G+odLlB>HI zM5$HU2J5}y#mvdxd6H0+DBS*@Ks5!kk^E;L*Tq!cy_>se<;Uv@R{2Ip>t zH=_kp-v2>Idw$&;%)mj)>+9Q!fH?s)(a%kQ4$_^*%f!mcTl$;SFTOBWN*OMjt9~QNPIg3V&E4MH)rs)0N>zA07)3!nnHi0>MF4B z$Hb-r?=Fu&o>X9&o1v27vQBZ_16F){%in8ux3;DO+i=fWect2V+sqg=Gzmn_h}}5y zCGB?RyO|WuFUCcTm0y$%{n0Vc{;VyFpQbrluNKej{vMtFtBrk~^nH2(64As5Ca;(% z24yob&QE@Q=GnKBaVLd-WkNcMjGGt>MzkM;oO5K3W?q(XHwB=N3=J}@?3F*u@Z}l3 zJgoP^PeIjBfORqOvu|3-7vDf0*=8N{uTt-QeJ`^FU3cDM$;5r%NZe1{o0!dD;fBJt zo_gSrYhG=%II;)jop3>!P20ier0;K~Jp3G&<>L5(TSXJR@kJ(!HtZd-ac*|$X<@G7 zD_s+;0HdsmnDmU75;P358HI-IKuFC?5d(V2Xht5yR>E2jeie7|G1Thm@G(G0tqZo3 zv9ad40tiKx2r5AbCZJyf;0P*h&}6UBYhCF9T*OE*DHd`2)-?!YS65P^!9_gJ;RO+v zs%qchU@0U;fKTp;t~0p8f-m-|yoM&p?0KMH zr+-1bNl5d(E>LWaD`##do*{?fsomu~>@B#4B&nN11k2`Ah7Olfepi~yDKdTg3wk!z zm+*esjgvqb%;4n|{1(93@z_*Yo-d~w@)0h$+cZPZ_R&v!geCK5f7`*L($NU-Q3i|I zOPS3PzO(siiDRs3EGBghkFqFPv9-hx3E_QAT2G`1lzw_VssL?)!EM{TYi5n&`8k!6 zb4N?=O#-KwR+vLHMjH@Da~n0;hr z)@VZRCx({43Gk6)kPsgVt^IK^`2}~C63qr}zwfaj-v0**+(+(GGSDo-+D9&62gyL( z5C94X=xfg&>Rq^c)d!RgRhuo0XB$*!c_^=Rt99^DT3Hz?fR)SzsBPxL0wcy|W)?Ra6pv+Q+w<_od5!kAEX~#mW^1Oe2v13IRJAqGKou6!RJ0#F4%9f`CaZkhb~kDbd;=Ihif(q4uuEPCwqhq}FQdXsU-8qZoi3?;VYcV585i_0KT zDpK8*sBl&npCR^kA4J+vV~=>s(cwboE1BRBkdZ`1bMT{w0v`!8ACFQUeR#M5h% z_mf010`=>HoUBIckH+M9=y~euR_nYFtjdXbokKErlpWd1siG#32kJ@KnJL_dcWYug z|BQVrXYAlwe9SAt`B?Q1EjZ6(q)eTxnnYD;Ihx{C#a_{`ThR8hFJo9)38P#+`ReV> z8L^=dSNF>(_gK>B&Ac9a@51FQyq-xn|EroAH(LrN0&V7=sX!0315O!*DXlO>VC;`3 z0XrqYghfvGr-7=Fi%V_xiakr*0oJ03^;kX|8hAQ*czD1TVEK7Hn5cj=6gb|!mQPnN zuNT0RrVD{7JIrD1vVqRyGyyofGHhT|A-OhhL=YhKz|FZyNq*F6 zsvH8=Dk%0HQ1D)~_UiW<*J=CU;T@$eN{{7fTtkD|fXeWm6(n-V{5$kE~&fYx!REeK5l4m08lw#^w zB~apgOJr$4BiG~0F0XuHeJb|0@g!gGCE@z=;8(31s{8+Dcu98!oFbq8posHVoDs-p zNmq8(5Jy$Y?K9?yD)+&kU7N+BxwA8(`6W10&1to6Mgu|wI1!vO=&orc1L1>Q52raA zN_R@2s{EB|+s`xwL(zp2nE{_FEzLLE61C!hjCJ<46LhAqi$m)HNf>nvsw+lsqU4ap zLgE^i(bzZ(dzJD?U5Fu2_2QYd#6uM#?q$_#>wx%Y$nLpV5PZ;wf0KW5bs=xq#pz&#~D-3v&1dNwjMCHadoJWQs@2O|n2(#DAO6zccyA{foib!`RxZR_%WqW0#)k8)*=n()Znb;O+3~0DKY{Vz)mBr3sPJKpz56K4ON#DdB+}9)brVM9 zkB$_d<)e5JlZrIwbhiKT?*pgdV(EL#!jCqTWGt2qiP3ZpbT6abl^d`>Iw?@F3;5ja zex|j25sCIkBr_Q%=z6i$6GFl#uCB*Cm`;o8GJVDJ1NLq;>dv>&N~z&@KX5v9r?rOB z{AMW$YDE7({v7^ kalK7x&cFSi_xOW#3jLkNALZyN)O(eFq#%(aruY8;0yj=toB#j- literal 0 HcmV?d00001 diff --git a/training/exam-question-bank-20260512-0900/materials/随机抽题.png b/training/exam-question-bank-20260512-0900/materials/随机抽题.png new file mode 100644 index 0000000000000000000000000000000000000000..b78ddf3a31b5ad9fe5decadd0c339849e8df61ec GIT binary patch literal 50225 zcmeFZXH-*bxGw5iEM-}c6%`Q>P!LcMQ0WB7a#5v9EE5$jBMSZ({p@5#~ZrDgXJTIG?Hyw1_x>>MXQ&ybU zt(T4Tp9|?(4jSHP&Tm3d$6+@KTfjK*riKPIXNOFUllNaYVOYs{T^f^XQ~d4p@Yk-O z>*>LnD*)+#58nUDu$%FErSg{L^x$v4)^n!^w*W7gP7gjre*5?18Y&Z~Z=AWq_rGW_bChmu zbk#P8N8fU8ub8OYY_rELA;_Hp>9Amh3;+7yyXnUAP{4hW9G1=)F-~jKJMrzNj=$p7 zZ~qtjAz|dctL)%ti0x)x+)ddJZgLOazCQKBcP};;@*n4jKjTPZ)P-g^iU?PKE_!!O zKKR#?8*ra2yY}}^Tmcin>r*2VN`5^-p08uC0sx9TSg8%Gla&BKKM4A5f9dnUeCxK} zw1v`btiws1o;l<2apbP+4ImZYkrU!OH@P%6Qegs{s)@@JSKM0Bs}Pg?@-<{28IxjR zD(yDQ#@?Bb5_t~*I0}HSnV*fgi9R->Z{W8-Up@&3>%TKHGLT!b9twM-2GpE7-<9Dh z4-|rmHZn3YwhFStL@*`IH24l|o74vB*g26>S4n!}eP1W5njT3tG%{tyehg>fl6Fmd z@S?RPXh(N2gyIK1oCle=9FEuGC_R(gFbfMP6mv1>U>hWwAyf9%rR~SW`Kz5gq?ges zYT}grWjwKBwA|!duK#BBsX^b6JK3alY&D@7M|Gzc_Gd_yQd!5w#>87TTdfnrBiF}u zY9GSJ{6as5M^Yk70&{~0sCMZB?{JXGsuwFQs|^ml8E5(4kC;!-uFjDcEQe}$`7qhc&p67XAZJ7J* zb3uXq#$;`^eZRcw3+46+oZ0b`KqmVvc&F9_+zd4hBCwlbcd;YAaS}D?d_nEB2Swf* z9*0#Y%aB#I3fbz27HcXJ(OSl_qYgScJ3Gfpjln@n$zjbpZLB3ZktOPrWUT;zJ^=rMnW+8EwQ zBnS?$ZeJEToM^CTrPrZ|&FxwW)`}^El5|hE63wnRU{hDIse9R`6Q<{u+9Y^~;^B zCrfIZ69FG;hK5o|dX{PN(bF`r@Xd;g5_o1Zg> zE}ZPd0cEWso)@IVH#s@UNMZ@Pg=iqDWe$#cx;Maj!D$N9pqNN{H{V@7!fgIh+q^w( z00FoP6rY&%zHUg88{v6>QM}Q0z5&i0)hRGl>cz>aIk7ob0o|L6;1v@SLoyaZ7|4cP zv6nId9Z%Bt+Gyya)3`oV4qGo^Q>3~51a7X+OrAvAgO@XY7)#J$w_bRfqzZM?-1#Mz z(lh+i{cBll)XI>;=8xjDE{`rw@<*(!Nkl_xe1Ez}MhZ18L|6%*0}V<1ZD3#^or$2V zmS$#T@V#6eEd~Yl z1IxaSXU=g;PX`gQK?grr#hR9LAtVHO(xrm?d*s#JpdB0rIl4Er#8y8uC~?Q?H~`dG z_B0dDO>fv7A)~xHzAPN)(Atf8N?H`igS}iz)Z_)*8z(z+DcS?NlWAV>zL73D?bXE% z@FLFyu-XRtFN8_y*Fv8Jso(ozx5kc+sRh*b627F8f!c1Vq|VAFJTEgdGB(Dz=(WuvAk5Hr zip?(k&g=zK>{-IkLyHx1p`MCdW_9CA03(WP)B2dP1kTP}4KVz3ZhBvvHLj>?i_) zB$_Gvj5p=+TbABbaa@C!jj5@rj!yp(j!sLID@FFOJ3NX8Uj4-*6<^gauC8*^DP&U* zN;VgteY%GMgDs#h$h|-$c*j~=X)9Sz8&o@Tmf?h7cZ!RPgI0?R!_5?nl@C8^+dok` zO@XHV=5{M*I(IKzG0Skt%gvPxe#?SA&3|4kz4y&?OrI5LFbh53THNQ`EQ_d4;Kp5l z`1OVIX_7yxNs0Rn!B2OcqIeEx&8z1w=W2=T)!Jr&opf}>l!W+l-EeTrvX0c`00EW= zaHtny2f~_TybUK0G`RN3sk5SJtLEys6_Z9#3uxrqPVD?}l}LpWJ*!RzR$G5a00GnB z>0%rhl3PUg-)-T|#3q-8&e&8-f9&d5>B!3N6ZqKo4HueI`*D>>p;7tq8h&-k<+@lA zy_Kodz1jI66_tfB@R3?*-*Ia$7sMm*B*1_9?qXn6Os2G(W}2k0%fz^;c5&}`?aFEf zG~72uqXgC@h_7f86Ux^xDj!Ii$+2o^60T2BK0=HacoY{0->Gge_G1aR?rSh?|Iy~A zukc}yTo>A}lc1T3M-miCzthjGZC>h6doqI8UET76(8FgD1yk|xE$U~z8o-f8j7Z~p z=n-tYl^B|6p9E(|K@o>bu3L6XcBIw7L(kr5G)d87SOS!GKpd#_kS0wBecN4inT0$) zdPHkylr`(!YL;}xM6qC;s`5%_$VV1;%{;YOc_#^ukFGmf*vQ`AX8^B-R9*_K5VisP zdNAJ4JF}nfQPH&Wv#BDaRH+BGnLOp{a^eYDiM|Xe7uxZmkf2lKdN}NBaf5>v&hng5 zyzO;#-$`lN?-X^p{)N$bfMkOh#l3jFGv7zLHs=}2&ChV!$5NP&1RRrV>`bwExMw^C z@iQdq2`iRD9;3*)FcnN)*sRMjf+82tZC{76+rEj0?I?7~2grRHPEB1bk7L(^Co3Ij z7ku`zaR2i$Dx8|I%&qAg&t)vXRFy)ZyF#V>I?}*2f_NvQ{#cQ;+BAuzhlpwxf)hLn zTPwgg+;m1$2<5Ee_$FFZ*HQtB?q$A=AmswmR9Pfl8+HbOV8}*oESHR!X_f8X>X@;m z-`ErQ#H*X#qaKkayEKtW&`rpp&~w^mRMnJ6#bIX`h_YcQomtZ2Fy=NA4oNxjP}Z%J z9^?ha`QY*1RiicIfbu`;B}q5hC)}g}Lo+%}{<=-_xi81?Qg#4Oy0uj^18zJMDos)@BZa&&7zQOYeAED%(S5UL0|qb5G+vElDrY?Z1wP zW?)bZL=5GNt8Nb9=9<}F({ex(ED63y&x2oF9_roiI)aQ>aKSsZ^$XUsCTlIq>bZgK zQnxtz2Erl4Mu*+yAx7eipWF%G-hLr28eqM%z^Z1Lq({;haQf$Pz8Q5e+_K7obyZP4 z+YRnZm~;Tl{{=Vnpk=WF&_$wi4)T)4T~889XS7k*9^Z!|#2b@xDLL zo|?>d6FTs=ikw0WLJDXW=0~G9lxY4_YXE~ze0*6Pm13>3!bTF8L!q@)74u>eY&`9f zkca&qaXgBYla%*SK+D6qf-kCk(|f(1Sx7R*wIlLOJK8R(Puk&bRg~h zWJT!ihZZ@|37m9ZqU8OTMmqd7y0yRE!O21nit>aksf1CKlM_IW`a#BWd zF>^Q}G!|{!884EqP;cv9v*9vrWz1d(S@f&}UGb<}cjo|GOpgywdp{{DeW4t~DJ7rF zn5u#>E9xD~k>Gea`kVKKT2f_?>k|&5Q3ugOdFmDB^~CBNsw*SY!>ASXy+!Tyh76hG zenh5C@E9xyQ&};jiswYbmBn`fYQH;iBp5Ol$z zoP%LyMCOi0=1KWedlj^U=a%;^$}x`c9vbeEO7DR)SM>w=3R08Re9)XX^nBSgSC89{ zqkglXx{BwGPE5!KZ7<$4D7dtFTu@Lj(;R@#29g^bu9v(>?D{oZ2E7n-FI~Fc_Lfi` z_kh~!jLkVYXIo%1?|Yd{@U&lpZ>NWz5~Woly&z>YW;pJR))5~8 z$gYi|N&51tllwC6I63Ga`RCs+A|Jzg`aV{2GcRZ#UebG=aH!F87|k9~TQEE#Cd|o| zYDMd%uvMY>6N0cD8sq!txvj9J*$iD6SV9 zn;YFz-f}S3SrDGXa~#_(z#a=M+~{AYf$Lh#()=dbV9L|pKlxl`ce`=3Jz*BQ-Dx2-(rYm?h!;d9relf=7iQ+$u*n!TK0 zg?K!NRQ(qhe8sA!AOq_to5Z0W+H}RFD+CbVHLr2j$*7S!mg?G=`JXMQ5rwH~JDuv1 z+)7vU9pl`Xp~c-~|7iNT^|4Pi^~ts*=lg0Ab`6JIIHyhga5iXeYX zA%NX`bhQgRRodk`5^=Epw_s`Nd}@C>!b3eqL|5m&j^8efCzaCg0$ppJ(Lw!0ep_G% z*hCw!CtE5WDe^lnsIe-ua`EMsl$3n=V%z$b)_gnbuYN9KLp}v&-n>Of1y`8Wp+ZcVhNOKR5I4r4!5QXPuon9dWbu zv%xOQ0jslD2C=UjPoiqSK9P_xB6!dcarE<~H#jHX_IvM2N1}tSlk+k?oPivO9^A`v zADC9pMb!c9BnT->JolQGdt3-s={}Bq?c^4ZdB|)k`FB-3Y@3=eH=$Dg}dE;ZRShH(eI15@~r|)}23u8#*r7o*Scvh_IxwsH2CaXSS zK6;jT`>9`C*%mMtPVtkBEN>v7FCwlsTRRL^qtCKieCW4l_Ix?;p}n5lT72n;=pcUo z*>aL58vgvztNNeyCj~<`>BbAK4xy2By2b|uS6QPTVbD>4@iD$-;F@DA+ePGNz(u6z z;@>-3vHeW7{ARl&9U0v=^Mi@WYj4b$m3&P%O=)eA$pXdG+U-y!K}q=3R%Fu^$3nh& zvbV2ZRKFNWVeNlnq7pUIhH@{iXz?2G(%aF<%071xc+Gp@eD(3+y<>DO5+39=Vij<@dq2RiCdTcxGxzu{Eb5Mu8FIa)4P6tzoD zy0mB;-;T9^%D@%#;<$nS^96sL7?uTvB6pVXh@&{3P=^Mg*6wG9zV2870a8xz;Tbep zBg^RAQQ)G$f5NT$YUfWrb>_bciTy7EbpMwwlaL$c!OcUIJ6+J3!iT{B^FZ|flHLDp zu=xLP&3`fC{{QdPH3qTp)8_baAsli-W}P`xIQpahG9#_tkpI8yb~`cj#J*R64FVAC zKHE%Ua5CW#zN{Ons)Q8FXWO*mR93QzY+g+8&acmNa3(}72sZ7hcT)b&d+wf|d{&AyBjhC87Q;6lFy?VpQ!|KDHcn*ms4a@tw_y4;nu>ZK%AH1m{mQT&dPba>5EX+wf@7WaGAb8#K zW|va3kLOZU!%oR8bMr=|{@Q%GYUNAHQ(}X+>hXHp)-v-Bq7LL<{@&$+WsrJ|St?<3 zM8w8e=l&#kGfo-4+HH)IMtrl!Qu;n_BP;A=#Imc8>RQD8Tud^Nc3ma?F2Y)R^Y{7r z7$7!P?f7uD$B_J)QoHgFNW@mzKNhAR?vxaQKAI{>;Kn#lfTR_l8s|`aV*e@6;CbEX zo!FlYzh{k`o$?`yWwzR_(UOun>2d+yTTjpJ%gNi}r-zkerzEg%7UBXb#xWVW#l>FJ z3=GnSSx(@FQtP>Mi*r`d+lliltSSl|=KSSr@(ujNn1(f`um;y&1F!DHpg0hss>@FA zgP)Pt+Lr-V`GpAc()sZL8&*tvZY09Ut11Yz)xZLNg8^^>Z=F# zo3GWL*T4XGlTx)Txa5H?n;gfJw#i*lKthQ{cJaDw(#$tkUB9oB9}_)KV#oo03X8>V z_(cGXNju_n@}ne+&z}sN9PSJ<0EF9ook`l6=EG9mog3*Itb%}ha0QXj&2(*i^7zNA zGWxREw=9kIIC{80mH78F%zcZJ7{E1InX;kV{R)gH~^Og4Hg* zn~yNC#?Ts8+6p1VgUEFxQV#JAze4GdIGULrl(PPjp^ar&D;0#J<(#hT?ivMhugqek zwghKD2VT)FR_xbP=}^Qx;bd6+P;*{wZz1psaXC2`^^%=WXQnF~ORo|iPkg_%5eeiUw`6;G&mDd(8XlX% z+LpXiz`$q{r5ILzU$MoMTlV+&r&@S-CmUPIH6++*74%1S zI$VzD8o8cO{Rhtfz*@!G;(2VC?W?xK$=wQ=O6m;*l8F zcW$3>5Jw(7CenmFXEN%*)Na$5Da=<7QJHZ4S!0ceQE-0L-XTp+cZ4Bi)09 zy;sHeu*Q|%s_vVE70B36#^sSYEP)5bNoL;!t3L&VEi>>_OQ9OVg?Dcv2Il?+*@t|_ zl+2|;&iB>*}~uc;85R}l2O&Z zmni8u36Oqp!%`~ATXC8O-G&3tH`QI<{kE2z2x@DMGf*oIz1UG*XcxB3!|}KOTES%G ztUvHa^sx9b#tmRXGY2mZyyL6NoM$d9a}#!gj}h!xMD;nLZc z$3MMb;!pqf`tiY5H2{#R6BXg|a){cw5?a84+=dG!UM`qD3$waAaw` zK9wq~FhG|JwB) z@YH)X(#^sfm&sR7x0*I%>w4a43D`K_ZW;Y@=1U~u-)jn2$cdJJ)r@hdWD4mO?kR;Vr1G^$+2e~|oTWOxNsZswb zcPUSC5h6c$plX7lUSM0oh(%}Um{(tvFJ-O8Jf*Z9cSJgG8)^4|)$Y+3>&tbFF@4}# zTIXwM9ks5o+zi#|`icESe-S>$zzA7+?wd3&$I8qu``I2JY^kbJ@7u&N;K;J0yzv=7 z79GR|0X982P-2x6?i3SZnHqnyM~!hmd{DeHDWiQY(5t7EONB$ANVR>aR?KXfdTf>SNn{1X`$X*`Q z)e>GXIAi&hpKpFHBXF0A+p=J)V%pAFtG%O8wJm%A-d(ydscrA2a{s5H+9>XXMp7?a z+BZ15+2YQl^OmwxpFnJ+)N%ohFOr|kcJC(q0+GihH$okM`z7mtxsWszC|V<6tu zxi*Q|>g1wt@zRIZelZ{k&l3dTSL?rY#Ed0N@O1%UMpfGnik-?S?#=ontZE~ulR0In zk>>_p*azna`x?krRjk!AlIKI@dLZDRH5Z*A;NP}&1fId_*8nX>h0}@36za%L`Edyg zz<}8GDq)eQQp6$<>Ik47ozZenc#&Yr5P_@xeUx$nQIME;(Y-R-Xn44U~bcqIu zO^p22bJx#Zr-*m6a7tZkCoU2ykryY1t<^jJ1buCFQXn2&(aBLlcyQ!1;Cz|cz=by# z#nK+xX;!3m#`EIPW0RNb!Oq%f!Cq!a3za@d>kQ9MfJ<$(7_V}^#7`5&h5-Pt#XYbc zzm(rg!W-z+=Po37x!&&lq zV?sDoy7DPF?ahhmq3s`64JMbX214E96*=-In`O155JuT&vytraj9A+5+7o$cY4p`3 zh|fK!r)K@$QJWE)o}sulroCz}U0?|S5amKPwMeIwRrFEUN`t@P1P+FKK&V3h0nv-` z5d2@gceBs1*=6VGZ*0r0FivM^Wm3kHT^=O^^kFc+jpL{&A?ND_0beIu?7aj>NMj7= zyfP>&Dq3c^9F`Q!m2MSbG?tBrWAN#(F7m1J3xXnczCInN*5UJmU|r5BL1bY#Ti3Ep^Bg?-y;N^xXl zrqXntgYuDUPSjdX^l9VHh@%Fipg(s7e)#7zGb<~z*~U@0Zeg=kks0cakhq4ZNp%BV zOX}-}YpcaKbLAxe`)jP$FPW5lUY+p!b^Dc+9)Z+-$DkQe25Q?n#*p4r6kBlbkqg-e zv}AY-@h7T4PcxvmEZ4()7oWdfdIwy;3>)vpT@Pkrc3u?Wl-}yMjdr^)XaC#5lO#((rm$tfz#FaXGfipUN)2s zshMVnusW6)6UN};`fR;ywQ?5)f~JtZ67A0$ca$Y=XAe28RRa>|!=Y%o+wvdd2``u8 z6sWf+g{I+>D(!wbQH3aWOht6gUiTf{i%VLM*7y;gekv+`;#`IcZ%%mX6ii*f(?|x< zF)~y-cH06Hwq;#rF2 z=stf&Poc`-!TBdnMh5#)Dald4Ocn^nABeq^{FDy#(gofuN$S8#SC`sk#y?0aHNX6OuNKXaw@7eo1)N*{=JyQa7J z>dMbJ1Rl<73!?WUTkMi_YZzJ>8^&0>H#J<}_dYU;3+RA4Me`XnSob2dfZHp zlPthVBFQoXyR7Q}EV40IhA)2ty4}5(`LSD?y1K_NAYhZXm#i&a(AS3*7%Z&OH(*dm z#4-6)-ng4Rok{6F;vr?_FCZ#kJ3w-tlNyK zPqo*e(hBeEqeaS= zj~6C4a>eVbuzUFm@pntJhCSaE=7pihp-OF^UwUJZ?*@u)Ij}xvK=uWXRxt$(;Zgt! zhpHHe%q7d6$h1%hhJ=wgw?_^jrr-TEI1s+8BEcu=u%5|qEzy>KXzoNIqI}GtqiMJZj zBUr7jBzsxDKJqv6aSjqD#soGgj-`zbT@GddAT-&Wmp{5$tHWzo%qKB(rQ_lnwIrdU zScc3^%ieD``Itc%^vyH=`uohq$(^t_c5#{_7+c|LuGE3_)N-pjrRqD0rrz^{xH4fd zq9E?PzmZ$dzYPs~9d5#q!TAQyogpfG+c=>nzJI$XCI(%Il^Fohj~~a#c`sY5#DFS{ zlRxkOuC`Ioci$weXs@=QoOoHz@@hd}mcpw)Ke@qtAma=d)FHTi*N9C`;lF7sNcs6= zKNqAus#fuF9JrM?s}SheK=|8Z0ZlSkbZbzwxEh_yU@_xv7-deOUfh}D70HQa;}?~% z{?knQD|N*$+U`WJ=jrS=QM07%bD>3R)79S=M`XGxlrs>ULHE-NU5fPyhg_GtjPwg^ zDEvNno=YtkaN|_a?dg9-I;)sb)J+JN{zcTzyc)^;FV%0~Wt5+32Eulkd|&p*4KB?b=nFe++5wE4>-)j*t=_AUW;xseX$P z&qcgBwfK*Gv~{@V5NAQ{5Hi@3C;a2G`e{Kwx<-l zFq7%h!;|f`7J9ZTbdlH(+p9DLVW?!COd6&@2X@4TrpKp;rR%jZNnDqjMKl(mTnNoG z3r0J{iE99W%q+D+idQ5yyo{_GLS#J`#C>ZLCUEq0hgX4~-U3E2%))ORhCPNl@q*(k z=6RI7$#@hcR^8#g@Ns|9f)>1bl(D{sJ*2_b4d3aaRCF1Hh6gVmIn*4*MC8!>n04{( zH{Msp!=SU=sK#%Vv7>dyFbsR5avWN>{0pZ&v{^r;C&4 zCpmQ6hZO|#@j-f&SyCF$-o#W-k)k6bcu=+X9CtjGii!Pl?$Qb1N4P|te_pvsXOEkp~pKr(yHyuN;}6p zIV-aJ>r4{v2#=>Cg2nM;U#BE&hB8PBv}Pvy?fXXu1ojzr8K_uBb%OjXsId`MAHvuk zG{%?JDd-sJGT+(ku@7SpUqz})a30aFjP0>Vqf`A+0M)LZ$qaOvNXS1b1EnYar@E;0 zt#9=&2VV5dGMZ$1^;(IQg|+WM*L2SBwNfb}bV*D^;plseIX~ZCB`TO^V~II9ZUMHg zPMEG>neAP(Er02|23mLSW2vEQYlFw)MiMk~ECQahPs$3w%>=3su-508laF^8g3ON_ z!Fi-uxr^5sUtlsy+cAk}-fdu&bBI0uZ8bF7evxM#)<|c{F|FT4s=5#Zcd_x@^nkaC zn``GBKCaWzv(&E6(AmS+^yO41;N|MokJ2{!4;Nj@+UVb3-n8c6`nLE^q0lN_^qC8U z{XM37{<^xTdk0&~T6b-s#p_s4#GqxE7F%rKl;5J&y|b8PaRM7;Fz%hE=Izwq*7Kvd zMm(>Snk76Gjl2C;g#HOSNbcI~x+Hf;o$`$D9>NNC1Mi6kvKEUI4xu^Zoe(%YG~LEd zx3x~W(T#~2$Ukpl?;|X+VPqiG_Z0nu3P|X8P2d0Gd-U1YAEu&0h;t$YY;_fAJuTP6 zy*BKnVUeavkr~olkLdQ&Tr2w(P4;iM-?H5Q(wO(gHQgm9%?oDKtrFH6d4{cld9SCu~Rx-_A) zJ4G(UpJi*BwYGKZ?}vxR`qS5A&{JNAGS%3h_6GXL7|X}sJr%>x9XaHrT?YWd6zR6= z_*!+;5gkfT7gtqjuMHuIWLs8buT!0ncn=RvdRTTd5^Gp3%*UrhT%&Y}W)F>1E6lk_ zmLK-LF6zW3ZFoHC_pdfqxa(O^FHxl*tSP=bvG)CYrAEC>|12tIpF6PJj{bcBMD1mV z7YQp!Zdb$0VSdYdHla-VxPv|kV9pGjR=XPcKJjoDGsz08IQ((eiAP2s$CX_PYT^-> z(47qUlrO0+9Ig&UE&X5_qsyfJOS~qr9dh&>PdV-L|Vj%k=@av=PQv zhgJkxcIa4l-{o0~Pb)-;JjSSI)2sYPJ7qxT{Xi~KH zmb%?-tn=DHt@P!+b*FfQj6YW(Q|c$cVb0C<1zVl8(5;RD5CcusLYPo|O{cMcdoA5XsWOWzbhng5Y_&7A3U+#tJ-Vcy*@b}dL z|9F5Lt@`W1r9Ph|=8OR1K#gtOE`xeeX}3Pvm*!?0n?(Y|3CkguFXRZ_oQVX3W!BD9 zyl_8Ae*22Ulho#`Pn2J{25kSK=<{WV9G{hO17V3dZk?q!xar|LbigYQOzIT+zaou> zFX}a?Ad#ii^h1^5sn{QI>W2Ex%0AtX&nc}sx?-}yhXgl3jZ{{w$uv*#jI@cny=!!7 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∈F0w~`|%LQK8Fx?C^^tCXgQ3En) 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

G8U2& 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�Sp#^?0L7{1Z9Su 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 z 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 版本:V1.0.1 +> 更新日期:2026-01-13 +> 状态:已确认 + +--- + +## 版本更新记录 + +### V1.0.1 (2026-01-13) + +**【培训计划】多考试任务支持** + +| 变更项 | 变更前 | 变更后 | +|-------|-------|-------| +| 考试任务数量 | 最多关联1个考试 | 支持关联多个考试 | +| 考试属性 | 无 | 支持设置必考/选考 | +| 考试排序 | 无 | 支持自定义排序 | + +**功能说明:** +- 创建/编辑培训计划时,可添加多个考试任务 +- 每个考试可设置为"必考"或"选考" +- 学员端展示所有关联考试及通过状态 +- 列表页显示考试任务总数 + +**数据库变更:** +- 新增 `tr_plan_exam` 关联表 +- 移除 `tr_plan` 表的 `exam_id` 字段 +- ⚠️ 不兼容历史数据,需重新初始化数据库 + +--- + +### V1.0.0 (2026-01-08) + +- 初始版本发布 +- 包含:系统基础、人员管理、知识库、考题管理、试卷管理、考试管理、培训计划六大模块 + +--- + +## 一、核心目标 (Mission) + +**为道路救援企业打造一站式内部培训平台,通过知识沉淀、在线考核、培训管理三大核心能力,提升500名员工的专业技能水平和服务标准化程度。** + +--- + +## 二、用户画像 (Persona) + +| 角色 | 人数估算 | 核心痛点 | 使用场景 | +|------|----------|----------|----------| +| **管理员** | 3-5人 | 人员管理分散,培训效果难追踪 | 配置系统、管理组织架构、分配权限 | +| **讲师(技师)** | 30-50人 | 知识传承依赖口口相传,出题组卷效率低 | 上传知识文档、创建题库、发布考试 | +| **学员** | 450人左右 | 学习资料分散、考试不便、进度不清晰 | 查阅知识库、完成培训任务、参加考试 | + +--- + +## 三、版本规划 + +### V1:最小可行产品 (MVP) + +#### 模块一:系统基础与人员管理 + +| 功能 | 说明 | +|----------|-----------------------------| +| 企业微信授权登录 | 企业微信授权登录 | +| 组织架构管理 | 中心 → 部门(≤8)→ 小组(≤10/部门)三级结构 | +| 员工管理 | 管理员手动录入员工信息,分配角色(管理员/讲师/学员) | +| 权限控制 | 基于角色的权限隔离,数据按部门隔离 | + +#### 模块二:知识库(重点) + +| 功能 | 说明 | +|------|------| +| 分类目录 | 支持多级分类(如:安全规范 > 高速救援 > 操作手册)| +| 文档管理 | 支持上传 PDF/Word/Excel/PPT 等常见文档格式 | +| 视频管理 | 支持上传视频文件,在线播放 | +| 在线预览 | 文档、视频无需下载即可在线查看 | +| 状态管理 | 草稿 → 已发布 → 已下架 | +| 部门隔离 | 各部门只能查看本部门的知识内容 | + +#### 模块三:考题管理 + +| 功能 | 说明 | +|------|------| +| 题型支持 | 单选题、多选题、判断题 | +| 题目解析 | 每道题必须填写答案解析 | +| 题库分类 | 按分类/章节管理题目 | +| 状态管理 | 草稿 → 已发布 → 已下架 | +| 部门隔离 | 讲师只能管理本部门题库 | + +#### 模块四:试卷管理 + +| 功能 | 说明 | +|------|------| +| 手动组卷 | 讲师手动从题库选题组成试卷 | +| 自动组卷 | 设置规则(单选X题+多选Y题+判断Z题),系统随机抽题 | +| 试卷配置 | 设置总分、题目分值、考试时长 | +| 试卷预览 | 组卷完成后可预览试卷效果 | +| 状态管理 | 草稿 → 已发布 → 已下架 | + +#### 模块五:考试管理 + +| 功能 | 说明 | +|------|------| +| 发布考试 | 选择试卷,设置考试名称、时间窗口(开始~结束时间)| +| 指定对象 | 支持指定部门 / 小组 / 个人参加考试 | +| 考试规则 | 设置及格线、限制考试次数、考试时长 | +| 在线答题 | 学员在线作答,自动计时,超时自动交卷 | +| 成绩查看 | 交卷后立即显示成绩和答案解析 | + +#### 模块六:培训计划 + +| 功能 | 说明 | +|------|------| +| 创建培训计划 | 设置计划名称、培训周期、培训目标 | +| 关联知识/考试 | 一个培训计划可包含多个知识文档 + 多场考试(V1.0.1+) | +| 考试属性设置 | 每个考试可设置必考/选考、自定义排序(V1.0.1+) | +| 分配学员 | 指定部门/小组/个人参加培训计划 | +| 进度跟踪 | 学员可查看自己的学习进度和考试状态 | +| 计划状态 | 未开始 / 进行中 / 已结束 | + +### V2 及以后版本 (Future Releases) + +| 版本 | 功能 | 价值 | +|------|------|------| +| **V2** | 统计报表中心 | 培训完成率、考试通过率、部门排名等数据看板 | +| **V2** | 线下培训签到 | 扫码签到/签退,记录实际培训时长 | +| **V2** | 错题本 | 学员自动收集错题,巩固薄弱知识点 | +| **V3** | 知识库增强 | 收藏、点赞、评论、全文搜索 | +| **V3** | 奖励体系 | 积分、勋章、学习排行榜 | +| **V3** | 证书管理 | 培训/考试 +--- + +## 四、关键业务逻辑 (Business Rules) + +### 4.1 权限规则 + +``` +管理员: + ├── 管理所有中心、部门、小组 + ├── 管理所有用户(增删改查、角色分配) + ├── 查看全平台数据 + └── 系统配置 + +讲师: + ├── 管理本部门知识库(上传/编辑/删除) + ├── 管理本部门题库(增删改查) + ├── 创建/管理本部门试卷和考试 + ├── 创建/管理本部门培训计划 + └── 查看本部门学员成绩 + +学员: + ├── 查看本部门知识库(只读) + ├── 参加分配给自己的培训计划 + ├── 参加分配给自己的考试 + └── 查看个人学习记录和成绩 +``` + +### 4.2 内容状态流转 + +``` +┌─────────┐ 发布 ┌─────────┐ 下架 ┌─────────┐ +│ 草稿 │ ───────────▶ │ 已发布 │ ───────────▶ │ 已下架 │ +│ DRAFT │ │PUBLISHED │ │ OFFLINE │ +└─────────┘ └─────────┘ └─────────┘ + ▲ │ │ + │ │ 重新上架 │ + │ ◀────────────────────────┘ + │ + └──────── 可继续编辑 ─────────────────────────────┘ +``` + +| 状态 | 说明 | 学员可见 | +|------|------|----------| +| **草稿 (DRAFT)** | 讲师编辑中,未完成 | ❌ 不可见 | +| **已发布 (PUBLISHED)** | 正式生效,可被使用 | ✅ 可见 | +| **已下架 (OFFLINE)** | 临时隐藏,保留数据 | ❌ 不可见 | + +### 4.3 考试规则 + +| 规则 | 说明 | +|------|------| +| 时间窗口 | 只有在考试开放时间内才能进入考试 | +| 限时作答 | 超过考试时长自动交卷 | +| 限制次数 | 达到最大次数后不可再考,取最高分 | +| 及格判定 | 分数 ≥ 及格线 为通过 | +| 答题顺序 | 自动组卷时题目顺序随机打乱 | + +### 4.4 数据隔离规则 + +| 数据类型 | 隔离方式 | +|----------|----------| +| 知识库 | 按部门隔离,只能看本部门 | +| 题库 | 按部门隔离,讲师只能操作本部门 | +| 试卷/考试 | 按部门隔离 | +| 培训计划 | 按部门隔离 | +| 员工信息 | 管理员可见全部,讲师可见本部门 | + +### 4.5 引用保护规则 + +| 场景 | 规则 | +|------|------| +| 题目下架 | 已被试卷引用的题目,下架前需确认警告 | +| 试卷下架 | 已被考试引用的试卷,下架前需确认警告 | +| 知识下架 | 已被培训计划引用的知识,下架前需确认警告 | + +--- + +## 五、数据契约 (Data Contract) + +### 5.1 核心实体 + +#### 用户 (sys_user) + +| 字段 | 类型 | 说明 | +|------|------|------| +| id | Long | 主键 | +| wx_userid | String | 企业微信用户ID | +| real_name | String | 姓名 | +| phone | String | 手机号 | +| role | Enum | 角色:ADMIN/LECTURER/STUDENT | +| department_id | Long | 所属部门 | +| group_id | Long | 所属小组(可空) | +| status | Enum | 状态:ENABLED/DISABLED | +| create_time | DateTime | 创建时间 | + +#### 组织架构 (sys_center / sys_department / sys_group) + +| 字段 | 类型 | 说明 | +|------|------|------| +| id | Long | 主键 | +| name | String | 名称 | +| parent_id | Long | 上级ID(部门关联中心,小组关联部门) | +| sort_order | Integer | 排序 | +| create_time | DateTime | 创建时间 | + +#### 知识分类 (km_category) + +| 字段 | 类型 | 说明 | +|------|------|------| +| id | Long | 主键 | +| name | String | 分类名称 | +| parent_id | Long | 父分类ID | +| department_id | Long | 所属部门 | +| sort_order | Integer | 排序 | + +#### 知识 (km_knowledge) + +| 字段 | 类型 | 说明 | +|------|------|------| +| id | Long | 主键 | +| title | String | 标题 | +| category_id | Long | 所属分类 | +| type | Enum | 类型:DOCUMENT/VIDEO | +| file_url | String | 文件地址 | +| file_size | Long | 文件大小 | +| department_id | Long | 所属部门 | +| status | Enum | 状态:DRAFT/PUBLISHED/OFFLINE | +| creator_id | Long | 创建人 | +| create_time | DateTime | 创建时间 | +| publish_time | DateTime | 发布时间 | + +#### 题目 (ex_question) + +| 字段 | 类型 | 说明 | +|------|------|------| +| id | Long | 主键 | +| type | Enum | 题型:SINGLE/MULTIPLE/JUDGE | +| content | String | 题干 | +| options | JSON | 选项列表(判断题为空) | +| answer | String | 正确答案 | +| analysis | String | 解析 | +| category_id | Long | 所属分类 | +| department_id | Long | 所属部门 | +| status | Enum | 状态:DRAFT/PUBLISHED/OFFLINE | +| creator_id | Long | 创建人 | +| create_time | DateTime | 创建时间 | +| publish_time | DateTime | 发布时间 | + +#### 试卷 (ex_paper) + +| 字段 | 类型 | 说明 | +|------|------|------| +| id | Long | 主键 | +| title | String | 试卷名称 | +| total_score | Integer | 总分 | +| duration | Integer | 考试时长(分钟) | +| pass_score | Integer | 及格分 | +| department_id | Long | 所属部门 | +| status | Enum | 状态:DRAFT/PUBLISHED/OFFLINE | +| creator_id | Long | 创建人 | +| create_time | DateTime | 创建时间 | +| publish_time | DateTime | 发布时间 | + +#### 试卷题目关联 (ex_paper_question) + +| 字段 | 类型 | 说明 | +|------|------|------| +| id | Long | 主键 | +| paper_id | Long | 试卷ID | +| question_id | Long | 题目ID | +| score | Integer | 该题分值 | +| sort_order | Integer | 排序 | + +#### 考试 (ex_exam) + +| 字段 | 类型 | 说明 | +|------|------|------| +| id | Long | 主键 | +| title | String | 考试名称 | +| paper_id | Long | 关联试卷 | +| start_time | DateTime | 开始时间 | +| end_time | DateTime | 结束时间 | +| max_attempts | Integer | 最大考试次数 | +| department_id | Long | 所属部门 | +| status | Enum | 状态:NOT_STARTED/IN_PROGRESS/ENDED | +| creator_id | Long | 创建人 | +| create_time | DateTime | 创建时间 | + +#### 考试对象 (ex_exam_target) + +| 字段 | 类型 | 说明 | +|------|------|------| +| id | Long | 主键 | +| exam_id | Long | 考试ID | +| target_type | Enum | 对象类型:DEPARTMENT/GROUP/USER | +| target_id | Long | 对象ID | + +#### 考试记录 (ex_exam_record) + +| 字段 | 类型 | 说明 | +|------|------|------| +| id | Long | 主键 | +| exam_id | Long | 考试ID | +| user_id | Long | 学员ID | +| attempt_no | Integer | 第几次考试 | +| score | Integer | 得分 | +| passed | Boolean | 是否通过 | +| start_time | DateTime | 开始时间 | +| submit_time | DateTime | 提交时间 | +| answers | JSON | 答题详情 | + +#### 培训计划 (tr_plan) + +| 字段 | 类型 | 说明 | +|------|------|------| +| id | Long | 主键 | +| title | String | 计划名称 | +| description | String | 计划描述 | +| start_date | Date | 开始日期 | +| end_date | Date | 结束日期 | +| department_id | Long | 所属部门 | +| exam_id | Long | 关联考试(可空) | +| status | Enum | 状态:NOT_STARTED/IN_PROGRESS/ENDED | +| creator_id | Long | 创建人 | +| create_time | DateTime | 创建时间 | + +#### 培训计划-知识关联 (tr_plan_knowledge) + +| 字段 | 类型 | 说明 | +|------|------|------| +| id | Long | 主键 | +| plan_id | Long | 计划ID | +| knowledge_id | Long | 知识ID | +| required | Boolean | 是否必修 | +| sort_order | Integer | 排序 | + +#### 培训计划-对象 (tr_plan_target) + +| 字段 | 类型 | 说明 | +|------|------|------| +| id | Long | 主键 | +| plan_id | Long | 计划ID | +| target_type | Enum | 对象类型:DEPARTMENT/GROUP/USER | +| target_id | Long | 对象ID | + +#### 培训进度 (tr_plan_progress) + +| 字段 | 类型 | 说明 | +|------|------|------| +| id | Long | 主键 | +| plan_id | Long | 计划ID | +| user_id | Long | 学员ID | +| knowledge_id | Long | 知识ID | +| completed | Boolean | 是否完成 | +| complete_time | DateTime | 完成时间 | + +--- + +## 六、原型设计(方案A - 经典管理后台风格) + +### 6.1 设计理念 + +左侧固定导航 + 右侧内容区,层级分明,适合功能复杂的企业管理系统。学习成本低,用户容易上手。 + +### 6.2 布局结构 + +``` +┌────────────────────────────────────────────────────────────────────────────┐ +│ 🚗 道路救援培训系统 🔔 消息 👤 张三 ▼ │ +├──────────────────┬─────────────────────────────────────────────────────────┤ +│ │ │ +│ 📊 工作台 │ 内容区域 │ +│ │ │ +│ 👥 人员管理 ▶ │ │ +│ ├ 组织架构 │ │ +│ ├ 员工管理 │ │ +│ └ 讲师管理 │ │ +│ │ │ +│ 📚 知识库 ▶ │ │ +│ ├ 知识分类 │ │ +│ └ 知识列表 │ │ +│ │ │ +│ ✏️ 考题管理 ▶ │ │ +│ ├ 题库分类 │ │ +│ └ 题目列表 │ │ +│ │ │ +│ 📄 试卷管理 │ │ +│ │ │ +│ 📝 考试管理 │ │ +│ │ │ +│ 📅 培训计划 │ │ +│ │ │ +│ ────────────── │ │ +│ ⚙️ 系统设置 │ │ +│ │ │ +└──────────────────┴─────────────────────────────────────────────────────────┘ +``` + +### 6.3 核心页面原型 + +#### 工作台首页 + +``` +┌────────────────────────────────────────────────────────────────────────────┐ +│ 🚗 道路救援培训系统 🔔 消息 👤 张三 ▼ │ +├──────────────────┬─────────────────────────────────────────────────────────┤ +│ │ │ +│ 📊 工作台 ● │ 欢迎回来,张三 2026年1月8日 │ +│ │ │ +│ 👥 人员管理 ▶ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ +│ │ │ 待学习课程 │ │ 待完成考试 │ │ 培训进度 │ │ +│ 📚 知识库 ▶ │ │ │ │ │ │ │ │ +│ │ │ 12 │ │ 3 │ │ 75% │ │ +│ ✏️ 考题管理 ▶ │ │ │ │ │ │ ████░░ │ │ +│ │ └─────────────┘ └─────────────┘ └─────────────┘ │ +│ 📄 试卷管理 │ │ +│ │ ┌──────────────────────────────────────────────────┐ │ +│ 📝 考试管理 │ │ 我的培训计划 │ │ +│ │ ├──────────────────────────────────────────────────┤ │ +│ 📅 培训计划 │ │ 📋 2026年Q1安全规范培训 进行中 60% │ │ +│ │ │ 📋 新员工入职培训 进行中 30% │ │ +│ │ │ 📋 高速救援操作规范 未开始 -- │ │ +│ │ └──────────────────────────────────────────────────┘ │ +│ │ │ +│ │ ┌──────────────────────────────────────────────────┐ │ +│ │ │ 待完成考试 │ │ +│ │ ├──────────────────────────────────────────────────┤ │ +│ │ │ 📝 安全规范考核 截止: 1月15日 [进入考试] │ │ +│ │ │ 📝 月度技能测试 截止: 1月20日 [进入考试] │ │ +│ │ └──────────────────────────────────────────────────┘ │ +│ │ │ +└──────────────────┴─────────────────────────────────────────────────────────┘ +``` + +#### 知识库列表页 + +``` +┌────────────────────────────────────────────────────────────────────────────┐ +│ 🚗 道路救援培训系统 🔔 消息 👤 张三 ▼ │ +├──────────────────┬─────────────────────────────────────────────────────────┤ +│ │ │ +│ 📊 工作台 │ 知识库 > 安全规范 │ +│ │ ───────────────────────────────────────────────── │ +│ 👥 人员管理 ▶ │ │ +│ │ [+ 新增知识] [所有状态 ▼] [🔍 搜索知识...] │ +│ 📚 知识库 ▼ │ │ +│ ┌ 知识分类 │ ┌────────────────────────────────────────────────┐ │ +│ └ 知识列表 ● │ │ 标题 类型 状态 更新时间 操作│ │ +│ │ ├────────────────────────────────────────────────┤ │ +│ ✏️ 考题管理 ▶ │ │ 高速救援SOP 📄文档 已发布 01-05 编辑│ │ +│ │ │ 安全操作视频 🎬视频 已发布 01-03 编辑│ │ +│ 📄 试卷管理 │ │ 应急处理流程 📄文档 草稿 01-02 编辑│ │ +│ │ │ 设备使用手册 📄文档 已下架 12-28 编辑│ │ +│ 📝 考试管理 │ └────────────────────────────────────────────────┘ │ +│ │ │ +│ 📅 培训计划 │ 共 24 条记录 < 1 2 3 4 5 > │ +│ │ │ +└──────────────────┴─────────────────────────────────────────────────────────┘ +``` + +#### 在线考试页 + +``` +┌────────────────────────────────────────────────────────────────────────────┐ +│ 📝 2026年Q1安全规范考试 剩余时间: 45:23 │ +├────────────────────────────────────────────────────────────────────────────┤ +│ │ +│ ┌─────────────────────────────────────────────────────────────────────┐ │ +│ │ 第 3 题 / 共 20 题 [单选题] │ │ +│ ├─────────────────────────────────────────────────────────────────────┤ │ +│ │ │ │ +│ │ 高速公路救援作业时,警示标志应放置在故障车辆后方多少米处? │ │ +│ │ │ │ +│ │ ○ A. 50米 │ │ +│ │ ● B. 150米 │ │ +│ │ ○ C. 200米 │ │ +│ │ ○ D. 100米 │ │ +│ │ │ │ +│ └─────────────────────────────────────────────────────────────────────┘ │ +│ │ +│ 答题卡: │ +│ ┌────────────────────────────────────────────────────────────────────┐ │ +│ │ ✓1 ✓2 ●3 ○4 ○5 ○6 ○7 ○8 ○9 ○10 │ │ +│ │ ○11 ○12 ○13 ○14 ○15 ○16 ○17 ○18 ○19 ○20 │ │ +│ └────────────────────────────────────────────────────────────────────┘ │ +│ │ +│ [< 上一题] [下一题 >] [交卷] │ +│ │ +└────────────────────────────────────────────────────────────────────────────┘ +``` + +#### 试卷组卷页 + +``` +┌────────────────────────────────────────────────────────────────────────────┐ +│ 🚗 道路救援培训系统 🔔 消息 👤 张三 ▼ │ +├──────────────────┬─────────────────────────────────────────────────────────┤ +│ │ │ +│ 📊 工作台 │ 创建试卷 > 第2步:选择题目 │ +│ │ ═══════════════════════════════════════════════════ │ +│ 👥 人员管理 ▶ │ ① 基本信息 ────── ② 选择题目 ────── ③ 预览确认 │ +│ │ ● │ +│ 📚 知识库 ▶ │ │ +│ │ ┌─────────────────────┐ ┌────────────────────────┐ │ +│ ✏️ 考题管理 ▶ │ │ 📂 题库 │ │ 📋 已选题目 (15) │ │ +│ │ │ ┌─────────────────┐ │ │ │ │ +│ 📄 试卷管理 ● │ │ │ [全选] 安全(48) │ │ │ 单选题 x10 30分 │ │ +│ │ │ │ ☑ 高速警示... │ │ │ 多选题 x3 15分 │ │ +│ 📝 考试管理 │ │ │ ☑ 夜间灯光... │ │ │ 判断题 x2 5分 │ │ +│ │ │ │ ☐ 拖车规范... │ │ │ ─────────────── │ │ +│ 📅 培训计划 │ │ └─────────────────┘ │ │ 总分: 50分 │ │ +│ │ │ │ │ │ │ +│ │ │ ── 或自动组卷 ── │ │ [自动组卷] │ │ +│ │ │ 单选: [10] 题 │ │ 单选: [10] 题 │ │ +│ │ │ 多选: [ 5] 题 │ │ 多选: [ 5] 题 │ │ +│ │ │ 判断: [ 5] 题 │ │ 判断: [ 5] 题 │ │ +│ │ │ [随机抽题] │ │ [确认随机抽取] │ │ +│ │ └─────────────────────┘ └────────────────────────┘ │ +│ │ │ +│ │ [上一步] [下一步:预览] │ +└──────────────────┴─────────────────────────────────────────────────────────┘ +``` + +--- + +## 七、架构设计蓝图 + +### 7.1 系统架构总览 + +``` +┌─────────────────────────────────────────────────────────────────────────┐ +│ 客户端层 │ +│ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │ +│ │ PC浏览器 │ │ 企业微信H5 │ │ 移动端浏览器 │ │ +│ │ (管理员/讲师) │ │ (学员) │ │ (学员) │ │ +│ └────────┬────────┘ └────────┬────────┘ └────────┬────────┘ │ +└───────────┼─────────────────────┼─────────────────────┼─────────────────┘ + │ │ │ + └─────────────────────┼─────────────────────┘ + ▼ +┌─────────────────────────────────────────────────────────────────────────┐ +│ 网关层 │ +│ ┌─────────────────────────────────────────────────────────────────┐ │ +│ │ Spring Boot 应用 │ │ +│ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │ +│ │ │ JWT认证 │ │ 权限拦截 │ │ 日志记录 │ │ 异常处理 │ │ │ +│ │ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │ │ +│ └─────────────────────────────────────────────────────────────────┘ │ +└─────────────────────────────────────────────────────────────────────────┘ + │ + ▼ +┌─────────────────────────────────────────────────────────────────────────┐ +│ 业务层 │ +│ ┌───────────┐ ┌───────────┐ ┌───────────┐ ┌───────────┐ ┌───────────┐ │ +│ │ 认证模块 │ │ 组织模块 │ │ 知识库模块│ │ 考试模块 │ │ 培训模块 │ │ +│ │ │ │ │ │ │ │ │ │ │ │ +│ │ ·企微登录 │ │ ·组织架构 │ │ ·分类管理 │ │ ·题库管理 │ │ ·计划管理 │ │ +│ │ ·Token管理│ │ ·员工管理 │ │ ·知识CRUD │ │ ·试卷管理 │ │ ·任务分配 │ │ +│ │ ·权限校验 │ │ ·角色管理 │ │ ·文件上传 │ │ ·考试管理 │ │ ·进度跟踪 │ │ +│ └───────────┘ └───────────┘ └───────────┘ └───────────┘ └───────────┘ │ +└─────────────────────────────────────────────────────────────────────────┘ + │ + ▼ +┌─────────────────────────────────────────────────────────────────────────┐ +│ 数据层 │ +│ ┌─────────────────────────┐ ┌─────────────────────────┐ │ +│ │ MySQL 8.0 │ │ 文件存储服务 │ │ +│ │ (MyBatis Plus ORM) │ │ (本地/OSS/MinIO) │ │ +│ └─────────────────────────┘ └─────────────────────────┘ │ +└─────────────────────────────────────────────────────────────────────────┘ +``` + +### 7.2 核心流程图 + +#### 用户登录流程(企业微信OAuth) + +```mermaid +sequenceDiagram + participant U as 用户 + participant FE as 前端页面 + participant BE as 后端服务 + participant WX as 企业微信API + participant DB as 数据库 + + U->>FE: 点击"企业微信登录" + FE->>WX: 跳转企微授权页面 + WX->>U: 显示授权确认 + U->>WX: 确认授权 + WX->>FE: 回调返回code + FE->>BE: 携带code请求登录 + BE->>WX: 用code换取access_token + WX-->>BE: 返回access_token + BE->>WX: 获取用户信息(userid) + WX-->>BE: 返回用户信息 + BE->>DB: 查询用户是否存在 + alt 用户存在 + DB-->>BE: 返回用户信息 + BE->>BE: 生成JWT Token + BE-->>FE: 返回Token+用户信息 + FE->>FE: 存储Token,跳转工作台 + else 用户不存在 + BE-->>FE: 返回错误:用户未录入 + FE->>U: 提示联系管理员 + end +``` + +#### 在线考试流程 + +```mermaid +sequenceDiagram + participant S as 学员 + participant FE as 前端页面 + participant BE as 后端服务 + participant DB as 数据库 + + S->>FE: 进入考试列表 + FE->>BE: 获取我的考试列表 + BE->>DB: 查询分配给该学员的考试 + DB-->>BE: 返回考试列表 + BE-->>FE: 返回考试列表(含剩余次数) + + S->>FE: 点击"开始考试" + FE->>BE: 请求开始考试 + BE->>DB: 校验考试状态/次数/时间窗口 + alt 校验通过 + BE->>DB: 创建考试记录(开始时间) + BE->>DB: 获取试卷题目 + DB-->>BE: 返回题目列表 + BE-->>FE: 返回试卷内容+考试时长 + FE->>FE: 启动倒计时 + + loop 答题过程 + S->>FE: 选择/修改答案 + FE->>FE: 本地暂存答案 + FE->>BE: 定时自动保存(每30秒) + BE->>DB: 更新答题记录 + end + + alt 主动交卷 + S->>FE: 点击"交卷" + else 时间到 + FE->>FE: 倒计时结束 + end + + FE->>BE: 提交试卷 + BE->>BE: 自动判分(客观题) + BE->>DB: 保存成绩+答案详情 + BE-->>FE: 返回考试成绩 + FE->>S: 显示成绩+答案解析 + else 校验失败 + BE-->>FE: 返回错误(次数用尽/不在时间窗口) + FE->>S: 提示无法参加考试 + end +``` + +#### 培训计划执行流程 + +```mermaid +flowchart TB + subgraph 讲师操作 + A[创建培训计划] --> B[设置基本信息] + B --> C[关联知识内容] + C --> D[关联考试-可选] + D --> E[指定培训对象] + E --> F[发布培训计划] + end + + subgraph 学员学习 + F --> G[学员收到培训通知] + G --> H[进入培训计划] + H --> I[学习知识内容] + I --> J{知识学完?} + J -->|否| I + J -->|是| K{有关联考试?} + K -->|否| L[培训完成] + K -->|是| M[参加考试] + M --> N{考试通过?} + N -->|是| L + N -->|否| O{还有考试次数?} + O -->|是| M + O -->|否| P[培训未通过] + end + + subgraph 进度追踪 + I --> Q[更新学习进度] + M --> R[记录考试成绩] + L --> S[标记培训完成] + end +``` + +### 7.3 技术选型 + +| 层次 | 技术 | 版本 | 说明 | +|------|------|------|------| +| **构建** | Maven | 3.8+ | 依赖管理 | +| **框架** | Spring Boot | 3.1.2 | 主框架 | +| **ORM** | MyBatis Plus | 3.5.3+ | 简化CRUD | +| **数据库** | MySQL | 8.0 | 主数据库 | +| **认证** | java-jwt | 4.4+ | JWT Token生成验证 | +| **加密** | Spring Security | 6.x | BCrypt密码加密 | +| **文档** | Springdoc OpenAPI | 2.2+ | API文档 | +| **工具** | Lombok | 1.18+ | 简化代码 | +| **JSON** | Jackson | 内置 | JSON序列化 | +| **文件** | 本地存储 / MinIO | - | V1先用本地,V2可扩展 | +| **前端** | HTML + CSS + JS | - | 原生技术栈 | + +#### 关键依赖库 + +| 用途 | 库 | 说明 | +|------|-----|------| +| 企业微信SDK | weixin-java-cp | 企业微信Java SDK | +| 文件预览 | kkFileView / OnlyOffice | 文档在线预览(可选外部服务) | +| 视频播放 | video.js | 前端视频播放器 | +| Excel导入导出 | EasyExcel | 阿里开源,性能好 | +| 工具库 | Hutool | 常用工具集合 | + +### 7.4 风险评估 + +| 风险点 | 等级 | 描述 | 应对策略 | +|--------|------|------|----------| +| **企业微信对接** | 🟡 中 | 需要企业微信管理员配置应用 | 提前准备配置文档,预留账号密码登录作为备选 | +| **文件预览** | 🟡 中 | 不同格式文档预览兼容性 | V1优先支持PDF+图片+视频,复杂格式提示下载 | +| **大文件上传** | 🟡 中 | 视频文件可能较大 | 限制单文件大小,支持分片上传 | +| **考试并发** | 🟢 低 | 500人规模并发压力不大 | 合理设计索引,必要时加缓存 | +| **数据隔离** | 🟢 低 | 部门数据隔离逻辑 | 统一在Service层实现隔离过滤 | + +### 7.5 项目结构 + +``` +training-system/ +├── pom.xml +├── src/ +│ └── main/ +│ ├── java/com/sino/training/ +│ │ ├── TrainingApplication.java # 启动类 +│ │ │ +│ │ ├── common/ # 通用模块 +│ │ │ ├── config/ # 配置类 +│ │ │ ├── exception/ # 异常处理 +│ │ │ ├── result/ # 统一响应 +│ │ │ ├── interceptor/ # 拦截器 +│ │ │ └── utils/ # 工具类 +│ │ │ +│ │ ├── module/ # 业务模块 +│ │ │ ├── auth/ # 认证模块 +│ │ │ ├── system/ # 系统管理 +│ │ │ ├── knowledge/ # 知识库模块 +│ │ │ ├── exam/ # 考试模块 +│ │ │ └── training/ # 培训模块 +│ │ │ +│ │ └── integration/ # 外部集成 +│ │ └── wechat/ # 企业微信 +│ │ +│ └── resources/ +│ ├── application.yml # 主配置 +│ ├── application-dev.yml # 开发环境 +│ ├── application-prod.yml # 生产环境 +│ ├── mapper/ # MyBatis XML +│ ├── static/ # 静态资源 +│ └── templates/ # 页面模板 +│ +├── docs/ +│ └── PRD.md # 产品需求文档 +│ +└── sql/ + └── init.sql # 数据库初始化脚本 +``` + +--- + +## 八、附录 + +### 8.1 角色菜单权限对照表 + +| 菜单 | 管理员 | 讲师 | 学员 | +|------|--------|------|------| +| 工作台 | ✅ | ✅ | ✅ | +| 组织架构管理 | ✅ | ❌ | ❌ | +| 员工管理 | ✅ | 👁️ 本部门只读 | ❌ | +| 讲师管理 | ✅ | ❌ | ❌ | +| 知识库-分类管理 | ✅ | ✅ 本部门 | ❌ | +| 知识库-知识列表 | ✅ | ✅ 本部门 | 👁️ 本部门已发布 | +| 考题管理-题库分类 | ✅ | ✅ 本部门 | ❌ | +| 考题管理-题目列表 | ✅ | ✅ 本部门 | ❌ | +| 试卷管理 | ✅ | ✅ 本部门 | ❌ | +| 考试管理 | ✅ | ✅ 本部门 | 👁️ 我的考试 | +| 培训计划 | ✅ | ✅ 本部门 | 👁️ 我的培训 | +| 系统设置 | ✅ | ❌ | ❌ | + +### 8.2 状态枚举定义 + +```java +// 内容状态 +public enum ContentStatus { + DRAFT, // 草稿 + PUBLISHED, // 已发布 + OFFLINE // 已下架 +} + +// 用户角色 +public enum UserRole { + ADMIN, // 管理员 + LECTURER, // 讲师 + STUDENT // 学员 +} + +// 用户状态 +public enum UserStatus { + ENABLED, // 启用 + DISABLED // 禁用 +} + +// 题目类型 +public enum QuestionType { + SINGLE, // 单选题 + MULTIPLE, // 多选题 + JUDGE // 判断题 +} + +// 知识类型 +public enum KnowledgeType { + DOCUMENT, // 文档 + VIDEO // 视频 +} + +// 考试/培训目标类型 +public enum TargetType { + DEPARTMENT, // 部门 + GROUP, // 小组 + USER // 个人 +} + +// 考试状态 +public enum ExamStatus { + NOT_STARTED, // 未开始 + IN_PROGRESS, // 进行中 + ENDED // 已结束 +} + +// 培训计划状态 +public enum PlanStatus { + NOT_STARTED, // 未开始 + IN_PROGRESS, // 进行中 + ENDED // 已结束 +} +``` + +--- + +**文档状态:已确认,等待开发启动** diff --git a/training/workspace/specs/V2-StatisticsCenter.md b/training/workspace/specs/V2-StatisticsCenter.md new file mode 100644 index 0000000..9944e94 --- /dev/null +++ b/training/workspace/specs/V2-StatisticsCenter.md @@ -0,0 +1,554 @@ +# V2 统计报表中心 - 产品需求文档 + +> 版本:V2.0.0-draft +> 作者:Product Agent +> 日期:2026-02-04 +> 状态:待评审 + +--- + +## 一、功能概述 + +### 1.1 背景与目标 + +**背景**:V1 版本完成了培训系统的基础功能,但管理层无法量化培训效果,讲师无法追踪学员学习情况,缺乏数据支撑决策。 + +**目标**:构建统计报表中心,让培训效果可量化、可追踪、可对比。 + +### 1.2 目标用户 + +| 角色 | 核心诉求 | +|------|----------| +| **管理员** | 全局数据概览,跨部门对比,发现问题部门 | +| **讲师** | 本部门数据,学员学习进度,考试成绩分布 | +| **学员** | 个人学习记录,成绩趋势,与平均水平对比 | + +### 1.3 功能边界 + +| 范围 | 说明 | +|------|------| +| **包含** | 数据看板、培训统计、考试统计、学员统计、数据导出 | +| **不包含** | 实时监控、预测分析、自定义报表设计器 | + +--- + +## 二、功能清单 + +### 2.1 模块总览 + +``` +统计报表中心 +├── 2.1 数据概览看板 +│ ├── 关键指标卡片 +│ ├── 趋势图表 +│ └── 快捷入口 +│ +├── 2.2 培训统计 +│ ├── 培训计划完成率 +│ ├── 知识学习统计 +│ └── 部门培训排名 +│ +├── 2.3 考试统计 +│ ├── 考试通过率 +│ ├── 成绩分布 +│ └── 题目正确率分析 +│ +├── 2.4 学员统计 +│ ├── 学员学习排行 +│ ├── 个人学习报告 +│ └── 学习时长统计 +│ +└── 2.5 数据导出 + ├── Excel 导出 + └── 定期报表 +``` + +--- + +## 三、详细需求 + +### 3.1 数据概览看板 + +#### 3.1.1 功能描述 + +为不同角色提供个性化的数据概览首页,一目了然掌握关键指标。 + +#### 3.1.2 管理员看板 + +**关键指标卡片(4个)**: + +| 指标 | 计算方式 | 对比 | +|------|----------|------| +| 总学员数 | 状态=启用的学员数量 | 较上月增减 | +| 本月培训完成率 | 本月已完成培训人次 / 本月应完成培训人次 | 较上月变化 | +| 本月考试通过率 | 本月通过考试人次 / 本月参考人次 | 较上月变化 | +| 活跃学员数 | 本月有学习行为的学员数 | 较上月增减 | + +**趋势图表**: +- 近6个月培训完成率趋势(折线图) +- 近6个月考试通过率趋势(折线图) +- 部门培训完成率排名(横向柱状图,TOP 8) + +**快捷入口**: +- 查看详细培训报表 +- 查看详细考试报表 +- 导出月度汇总 + +#### 3.1.3 讲师看板 + +**关键指标卡片(4个)**: + +| 指标 | 范围 | +|------|------| +| 本部门学员数 | 本部门 | +| 本部门培训完成率 | 本部门本月 | +| 本部门考试通过率 | 本部门本月 | +| 待批阅数 | 如有主观题(V2暂无) | + +**趋势图表**: +- 本部门近6个月培训完成率趋势 +- 本部门学员学习进度分布(饼图:已完成/进行中/未开始) + +#### 3.1.4 学员看板 + +**关键指标卡片(4个)**: + +| 指标 | 说明 | +|------|------| +| 我的培训进度 | 已完成/总计划数 | +| 我的考试成绩 | 最近一次考试分数 | +| 学习排名 | 在本部门的排名 | +| 累计学习时长 | 总学习时长 | + +**图表**: +- 我的成绩趋势(近5次考试) +- 与部门平均分对比 + +#### 3.1.5 验收标准 + +```gherkin +Feature: 数据概览看板 + +Scenario: 管理员查看全局看板 + Given 我是管理员角色 + When 我进入统计报表中心 + Then 我应该看到4个关键指标卡片 + And 我应该看到培训完成率趋势图 + And 我应该看到部门排名图表 + And 所有数据应反映全平台数据 + +Scenario: 讲师查看部门看板 + Given 我是讲师角色 + When 我进入统计报表中心 + Then 所有数据应仅包含本部门数据 + And 我不应该看到其他部门的数据 + +Scenario: 指标卡片显示环比变化 + Given 当前月份培训完成率为 80% + And 上月培训完成率为 75% + When 我查看培训完成率卡片 + Then 应显示 "+5%" 的环比增长标记 + And 增长应显示为绿色 +``` + +--- + +### 3.2 培训统计 + +#### 3.2.1 培训计划完成率 + +**筛选条件**: +- 时间范围:本月/本季度/本年度/自定义 +- 部门:全部/指定部门(管理员可选) +- 培训计划:全部/指定计划 + +**统计维度**: + +| 维度 | 指标 | +|------|------| +| 按计划 | 计划名称、应参加人数、实际完成人数、完成率 | +| 按部门 | 部门名称、计划数、完成率、排名 | +| 按时间 | 月度完成率趋势 | + +**列表展示**: + +| 培训计划 | 部门 | 应参加 | 已完成 | 完成率 | 状态 | +|----------|------|--------|--------|--------|------| +| 2026Q1安全培训 | 救援一部 | 50 | 45 | 90% | 进行中 | +| 新员工入职培训 | 救援二部 | 20 | 20 | 100% | 已结束 | + +#### 3.2.2 知识学习统计 + +**统计内容**: +- 知识总数、已发布数 +- 学习总人次 +- 热门知识 TOP 10(按学习人次) +- 最少学习知识(提醒优化或下架) + +#### 3.2.3 验收标准 + +```gherkin +Feature: 培训统计 + +Scenario: 按部门查看培训完成率 + Given 我是管理员 + When 我选择按部门维度查看 + Then 应显示所有部门的培训完成率列表 + And 列表应按完成率降序排列 + And 应显示部门排名 + +Scenario: 筛选指定时间范围 + Given 我在培训统计页面 + When 我选择时间范围为 "2026年1月" + Then 所有数据应仅包含该月份的培训数据 + +Scenario: 导出培训报表 + Given 我在培训统计页面 + When 我点击导出按钮 + Then 应下载 Excel 文件 + And 文件应包含当前筛选条件下的所有数据 +``` + +--- + +### 3.3 考试统计 + +#### 3.3.1 考试通过率 + +**筛选条件**: +- 时间范围:本月/本季度/本年度/自定义 +- 部门:全部/指定部门 +- 考试:全部/指定考试 + +**统计指标**: + +| 指标 | 说明 | +|------|------| +| 参考人数 | 实际参加考试的人数 | +| 通过人数 | 分数 >= 及格线的人数 | +| 通过率 | 通过人数 / 参考人数 | +| 平均分 | 所有考生的平均分数 | +| 最高分 / 最低分 | 分数极值 | + +#### 3.3.2 成绩分布 + +**图表展示**: +- 分数段分布(柱状图):0-59 / 60-69 / 70-79 / 80-89 / 90-100 +- 各部门平均分对比(横向柱状图) + +**列表展示**: + +| 考试名称 | 参考人数 | 通过率 | 平均分 | 最高分 | 最低分 | +|----------|----------|--------|--------|--------|--------| +| 安全规范考核 | 120 | 85% | 78.5 | 98 | 42 | +| 月度技能测试 | 95 | 72% | 71.2 | 100 | 35 | + +#### 3.3.3 题目正确率分析 + +**功能描述**:分析每道题的正确率,发现难题和易错题。 + +**统计内容**: + +| 字段 | 说明 | +|------|------| +| 题目内容 | 题干摘要(前50字) | +| 题型 | 单选/多选/判断 | +| 作答人次 | 该题被作答的总次数 | +| 正确率 | 正确人次 / 作答人次 | +| 错误选项分布 | 各错误选项的选择占比 | + +**排序**: +- 默认按正确率升序(易错题优先) +- 可切换按作答人次排序 + +**用途**: +- 正确率 < 30% 的题目:可能题目有问题或知识点难度大 +- 正确率 > 95% 的题目:可能过于简单 + +#### 3.3.4 验收标准 + +```gherkin +Feature: 考试统计 + +Scenario: 查看考试成绩分布 + Given 我在考试统计页面 + When 我选择某场考试 + Then 应显示分数段分布柱状图 + And 应显示通过率、平均分等指标 + +Scenario: 查看题目正确率 + Given 我在考试统计页面 + When 我点击 "题目分析" + And 选择某场考试 + Then 应显示该考试所有题目的正确率 + And 默认按正确率升序排列 + And 可以查看每道题的错误选项分布 + +Scenario: 识别易错题 + Given 某道题的正确率为 25% + When 我查看题目分析列表 + Then 该题应标记为 "易错题" + And 应显示主要错误选项 +``` + +--- + +### 3.4 学员统计 + +#### 3.4.1 学员学习排行 + +**排行维度**: +- 学习时长排行(本月/本季度) +- 考试成绩排行(平均分/最高分) +- 培训完成数排行 + +**展示内容**: + +| 排名 | 学员 | 部门 | 学习时长 | 完成培训数 | 平均分 | +|------|------|------|----------|------------|--------| +| 1 | 张三 | 救援一部 | 45h | 8 | 92 | +| 2 | 李四 | 救援二部 | 42h | 7 | 88 | + +**范围控制**: +- 管理员:可查看全平台排行 +- 讲师:仅可查看本部门排行 +- 学员:可查看本部门排行,自己会高亮显示 + +#### 3.4.2 个人学习报告 + +**入口**: +- 讲师点击学员姓名进入 +- 学员点击"我的学习报告"进入 + +**报告内容**: + +| 模块 | 内容 | +|------|------| +| 基本信息 | 姓名、部门、入职时间、角色 | +| 学习概览 | 累计学习时长、完成培训数、参加考试数 | +| 培训记录 | 参加的培训计划列表,包含进度和状态 | +| 考试记录 | 参加的考试列表,包含成绩和是否通过 | +| 成绩趋势 | 近10次考试成绩折线图 | +| 能力雷达图 | 按知识分类的掌握程度(基于考试正确率) | + +#### 3.4.3 学习时长统计 + +**统计规则**: +- 知识学习:从打开到关闭/切换的时长(上限30分钟/次) +- 视频学习:实际播放时长 +- 考试时长:从开始到交卷的时长 + +**展示**: +- 个人:日/周/月学习时长统计 +- 部门:部门平均学习时长、学习时长分布 + +#### 3.4.4 验收标准 + +```gherkin +Feature: 学员统计 + +Scenario: 查看学习排行榜 + Given 我是讲师 + When 我进入学员排行榜页面 + Then 应显示本部门学员排行 + And 不应显示其他部门学员 + +Scenario: 查看个人学习报告 + Given 我是讲师 + When 我点击某学员的姓名 + Then 应进入该学员的学习报告页面 + And 应显示该学员的培训记录 + And 应显示该学员的考试记录 + And 应显示成绩趋势图 + +Scenario: 学员查看自己的报告 + Given 我是学员 + When 我点击 "我的学习报告" + Then 应显示我的学习报告 + And 应显示我在部门中的排名 +``` + +--- + +### 3.5 数据导出 + +#### 3.5.1 Excel 导出 + +**支持导出的报表**: + +| 报表 | 内容 | 权限 | +|------|------|------| +| 培训完成率报表 | 按计划/部门的完成率明细 | 管理员、讲师 | +| 考试成绩报表 | 学员成绩明细 | 管理员、讲师 | +| 学员学习报表 | 学员学习时长和完成情况 | 管理员、讲师 | +| 题目分析报表 | 题目正确率明细 | 管理员、讲师 | + +**导出规则**: +- 导出当前筛选条件下的数据 +- 文件名格式:`报表类型_日期_导出人.xlsx` +- 单次导出上限:10000 条记录 + +#### 3.5.2 验收标准 + +```gherkin +Feature: 数据导出 + +Scenario: 导出考试成绩报表 + Given 我在考试统计页面 + And 当前筛选条件为 "2026年1月" + When 我点击导出按钮 + Then 应下载 Excel 文件 + And 文件名应为 "考试成绩报表_20260204_张三.xlsx" + And 数据应仅包含2026年1月的考试成绩 + +Scenario: 导出数据量限制 + Given 当前筛选条件下有 15000 条记录 + When 我点击导出按钮 + Then 应提示 "数据量超过限制,请缩小筛选范围" +``` + +--- + +## 四、数据模型(建议) + +### 4.1 新增统计表(可选,用于性能优化) + +#### 日统计汇总表 (stat_daily_summary) + +| 字段 | 类型 | 说明 | +|------|------|------| +| id | Long | 主键 | +| stat_date | Date | 统计日期 | +| department_id | Long | 部门ID(0=全平台) | +| total_users | Integer | 学员总数 | +| active_users | Integer | 活跃学员数 | +| training_complete_count | Integer | 培训完成人次 | +| exam_pass_count | Integer | 考试通过人次 | +| exam_total_count | Integer | 考试参与人次 | +| total_learning_minutes | Long | 总学习时长(分钟) | + +#### 学习时长记录表 (stat_learning_log) + +| 字段 | 类型 | 说明 | +|------|------|------| +| id | Long | 主键 | +| user_id | Long | 用户ID | +| knowledge_id | Long | 知识ID | +| start_time | DateTime | 开始时间 | +| end_time | DateTime | 结束时间 | +| duration_seconds | Integer | 学习时长(秒) | +| create_time | DateTime | 创建时间 | + +--- + +## 五、页面原型 + +### 5.1 管理员数据看板 + +``` +┌────────────────────────────────────────────────────────────────────────────┐ +│ 统计报表中心 │ +├────────────────────────────────────────────────────────────────────────────┤ +│ │ +│ ┌────────────┐ ┌────────────┐ ┌────────────┐ ┌────────────┐ │ +│ │ 总学员数 │ │ 培训完成率 │ │ 考试通过率 │ │ 活跃学员数 │ │ +│ │ 486 │ │ 82% │ │ 78% │ │ 312 │ │ +│ │ +12 ↑ │ │ +5% ↑ │ │ -2% ↓ │ │ +28 ↑ │ │ +│ └────────────┘ └────────────┘ └────────────┘ └────────────┘ │ +│ │ +│ ┌─────────────────────────────────┐ ┌─────────────────────────────────┐ │ +│ │ 培训完成率趋势 │ │ 部门培训完成率排名 │ │ +│ │ │ │ │ │ +│ │ 100%│ │ │ 救援一部 ████████████ 92% │ │ +│ │ 80%│ ╭──╮ ╭──╮ │ │ 救援三部 ██████████ 85% │ │ +│ │ 60%│╭──╯ ╰──╮╭╯ ╰── │ │ 救援二部 █████████ 80% │ │ +│ │ 40%│ ╰ │ │ 救援四部 ███████ 72% │ │ +│ │ └───────────────── │ │ 综合部 ██████ 65% │ │ +│ │ 9 10 11 12 1 2 │ │ │ │ +│ └─────────────────────────────────┘ └─────────────────────────────────┘ │ +│ │ +│ [查看培训详情] [查看考试详情] [导出月度报表] │ +│ │ +└────────────────────────────────────────────────────────────────────────────┘ +``` + +### 5.2 考试统计页面 + +``` +┌────────────────────────────────────────────────────────────────────────────┐ +│ 统计报表中心 > 考试统计 │ +├────────────────────────────────────────────────────────────────────────────┤ +│ │ +│ 时间范围: [本月 ▼] 部门: [全部 ▼] 考试: [全部 ▼] [查询] [导出] │ +│ │ +│ ┌─────────────────────────────────┐ ┌─────────────────────────────────┐ │ +│ │ 成绩分布 │ │ 汇总指标 │ │ +│ │ │ │ │ │ +│ │ ┌───┐ │ │ 参考人数: 320 │ │ +│ │ │ │ ┌───┐ │ │ 通过人数: 256 │ │ +│ │ ┌───┐│ │ │ │ ┌───┐ │ │ 通过率: 80% │ │ +│ │ │ ││ │ │ │ │ │ ┌───┐ │ │ 平均分: 76.5 │ │ +│ │ │ ││ │ │ │ │ │ │ │ │ │ 最高分: 100 │ │ +│ │ └───┘└───┘ └───┘ └───┘ └───┘ │ │ 最低分: 32 │ │ +│ │ 0-59 60-69 70-79 80-89 90-100 │ │ │ │ +│ └─────────────────────────────────┘ └─────────────────────────────────┘ │ +│ │ +│ ┌──────────────────────────────────────────────────────────────────────┐ │ +│ │ 考试名称 参考人数 通过率 平均分 最高分 操作 │ │ +│ ├──────────────────────────────────────────────────────────────────────┤ │ +│ │ 安全规范考核 120 85% 78.5 98 [详情][分析] │ │ +│ │ 月度技能测试 95 72% 71.2 100 [详情][分析] │ │ +│ │ 新员工入职考试 45 91% 82.3 96 [详情][分析] │ │ +│ └──────────────────────────────────────────────────────────────────────┘ │ +│ │ +│ < 1 2 3 > │ +└────────────────────────────────────────────────────────────────────────────┘ +``` + +--- + +## 六、非功能需求 + +| 类型 | 要求 | +|------|------| +| **性能** | 看板页面加载时间 < 2秒 | +| **性能** | 报表查询响应时间 < 3秒(万级数据) | +| **兼容性** | 支持 Chrome、Edge、Firefox 最新版本 | +| **数据安全** | 严格按角色和部门隔离数据 | +| **导出** | Excel 导出支持 .xlsx 格式 | + +--- + +## 七、不做什么(Out of Scope) + +| 排除项 | 原因 | +|--------|------| +| 实时数据监控 | V2 不需要实时性,T+1 统计即可 | +| 自定义报表设计器 | 复杂度高,用户需求不明确 | +| 数据预测/AI分析 | 数据量不足,价值有限 | +| 打印报表 | 使用 Excel 导出替代 | + +--- + +## 八、里程碑建议 + +| 阶段 | 内容 | 建议周期 | +|------|------|----------| +| M1 | 数据看板(管理员+讲师+学员) | - | +| M2 | 培训统计 + 考试统计 | - | +| M3 | 学员统计 + 数据导出 | - | +| M4 | 测试 + 优化 | - | + +--- + +## 九、开放问题 + +| 问题 | 待确认 | +|------|--------| +| 学习时长统计是否需要精确到秒级? | 建议分钟级即可 | +| 是否需要支持定时自动发送报表邮件? | 建议 V3 考虑 | +| 能力雷达图的维度如何定义? | 建议按知识分类一级目录 | + +--- + +**文档状态:待评审** diff --git a/training/workspace/specs/course-km-arch-20260430-1344/01_input/prototype.html b/training/workspace/specs/course-km-arch-20260430-1344/01_input/prototype.html new file mode 100644 index 0000000..d6f2021 --- /dev/null +++ b/training/workspace/specs/course-km-arch-20260430-1344/01_input/prototype.html @@ -0,0 +1,1213 @@ + + + + + +课程管理系统 — 原型图 + + + + + +

+ + +
+ + + + +
+ + +
+
+
+ + +
+
课程分类
+ +
📁 全部
+
📂 中道内训师培训课程
+
└ 内训师基础技能
+
└ 课程开发方法
+
📂 中道员工在岗培训
+
└ 新员工入职培训
+
└ 岗位技能强化
+
📂 中道新人培训
+
📂 中道新人入组OJT培训
+
📂 专业技能
+
📂 中道救援车辆技术专业...
+
📂 中道员工通用胜任力培...
+
📂 通用课件库
+
+ + +
+ +
+
+
+ +
+
所属部门
+ +
状态
+ + + +
+
+
创建时间
+ + + +
+
+ + +
+
+ + + + 共 18 条 +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
名称资源分类难度学习类型所属部门可见范围状态学习人数完成率操作
解锁企业数字化学习的N个可能性
🎬 视频  |  2026-03-15
行政管理初级必修课中道救援全公司已发布127 +
68%
+
+
+ + + +
中基层领导者十年领导力解码
🎬 视频  |  2026-03-10
人力资源规划中级不指定中道救援全公司已发布89 +
45%
+
+
+ + + +
如何制定24年企业年度培训计划
📄 文档  |  2026-02-28
人力资源规划初级必修课中道救援本部门已发布56 +
82%
+
+
+ + + +
救援车辆基础维修技能实训
🎵 音频  |  2026-02-20
专业技能高级选修课技术部指定草稿0 +
+
+ + + +
新员工入职流程图解
🖼️ 图片  |  2026-01-15
通用管理初级必修课人力资源部全公司已下架43 +
91%
+
+
+ + + +
+ + + +
+
+
+
+ + +
+
+ + +
+
+ + +
+

基础信息

+
+
+ + +
0 / 200
+
+ +
+
+ + +
+
+ + +
+
+ +
+
+ +
+ + + +
+
+
+ +
+ + +
+
+
+ +
+ + + +
+
+
+ +
+ +
+ +
+
张三 ×
+
李四 ×
+
+
+
从系统讲师库中选择,可多选
+
+ +
+ +
+ + +
+
+
救援技能 ×
+
新员工 ×
+
必备培训 ×
+
+
+ +
+ + +
+
+
+ + +
+

课件列表

支持拖拽排序
+
+
+
+ + + ⓘ 支持 mp4/avi/mov/flv/mp3/wav/pdf/doc/docx/jpg/png 等格式,单文件最大 2GB +
+
+ +
🎬
+
+
解锁企业数字化学习的N个可能性(理论篇)
+
视频  |  00:34:57  |  已上传
+
+ + +
+
+ +
🎬
+
+
解锁企业数字化学习的N个可能性(实践篇)
+
视频  |  00:31:38  |  已上传
+
+ + +
+
+ +
📄
+
+
课程配套学习手册.pdf
+
文档  |  2.4MB  |  已上传
+
+ + +
+
+
+
+ + +
+

课程封面

+
+
+
+
尺寸建议 750×422,限制 2MB 以内,最多可上传 12 张封面
+
+
+上传封面
+
📋
+
💻
+
📊
+
🎯
+
🚗
+
🔧
+
+
+
+ + +
+
+
+
+ + +
+

学习规则

+
+
+
+ +
+ + +
+
ALL:所有课件均达到完成标准;ANY:任意 1 个课件达到完成标准
+
+
+ +
+ + +
+
+
+
+
+ + +
+
+ + +
仅对文档类课件生效,留空使用系统自动估算(≈每100KB 1分钟,最多50分钟)
+
+
+
+
+ + +
+

可见范围

+
+
+
+ + + +
+
+ +
本部门:仅所属部门员工可见;全公司:所有员工可见;指定范围:精确到部门/小组/学员
+
+
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + + + + 课程封面 + +
+
+

解锁企业数字化学习的N个可能性

+
+
★★★★★ 4.8 分(共 42 条评价)
+ 必修课 + 初级 + 原创 +
+
+
+ 讲师 + 平台讲师 +
+
+ 课程类型 + 平台课 +
+
+ 有效期至 + 2026-12-03 +
+
+ 课件数 + 2 +
+
+ 学习人数 + 127 +
+
+ 奖励学分 + 🏆 50 分 +
+
+
+ + + +
+
+
+
+ +
+
+ +
+
+ + + + +
+
+ + +
+
完成要求:全部课件完成  |  当前进度:1/2 课件
+
+
1
+
🎬
+
+
解锁企业数字化学习的N个可能性(理论篇)
+
00:34:57  |  已完成 ✅
+
+
+ +
+
+
2
+
🎬
+
+
解锁企业数字化学习的N个可能性(实践篇)
+
00:31:38  |  学习中 ···
+
+
已学习 43%,断点续播
+
+ +
+
+ + +
+
+

本课程系统梳理了企业数字化转型背景下,学习与发展(L&D)从业者面临的核心挑战与机遇。

+

主讲人结合10余年企业培训实践经验,从以下维度展开讲授:

+
    +
  • 数字化学习生态的底层逻辑与驱动力
  • +
  • 混合式学习设计(HLD)的核心方法论
  • +
  • 学习数据分析与效果评估框架
  • +
  • AI 辅助内容生成与个性化学习路径
  • +
  • 企业内训师的角色转型路径
  • +
+

适合人群:企业培训管理者、内训师、人力资源从业者

+
+
+ + +
+
+
+
4.8
+
★★★★★
+
42 条评价
+
+
+
5★
32
+
4★
7
+
3★
2
+
2★
1
+
1★
0
+
+
+ +
+
+
+
+
+
张**(运营部)
+
2026-04-20
+
+
+
★★★★★
+
课程内容非常实用,理论和实践结合得很好。讲师讲解清晰,案例丰富,对我们企业的培训数字化转型很有启发。强烈推荐!
+ +
+
+
+
+
+
李**(技术部)
+
2026-04-18
+
+
+
★★★★☆
+
内容质量不错,AI辅助那章讲得很深入。建议可以增加更多实操案例,理论部分可以稍作精简。整体值得推荐。
+ +
+
+ + +
+
📝 提交我的评价(需完成课程后方可评价)
+
我的评分:
+
+ +
+ +
+ +
+
+
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
学员部门进度完成状态学习时长最近学习
张三运营部
100%
已完成1h 12m2026-04-25
李四技术部
43%
学习中28m2026-04-28
王五行政部
0%
未开始
+
+ +
+
+
+ + +
+ + + + +
+
+
+
+ + +
+
+ +

解锁企业数字化学习的N个可能性 — 统计数据

+ + +
+
+
👥
+
127
+
学习人数
+
↑ 较上周 +15
+
+
+
+
68%
+
完成率
+
↑ 较上周 +3%
+
+
+
⏱️
+
47m
+
平均学习时长
+
课程总长 1h 06m
+
+
+
+
4.8
+
平均评分
+
共 42 条评价
+
+
+ + +
+ +
+

学习进度分布

+
+
+
86人
+
+
已完成
+
+
+
22人
+
+
学习中
+
+
+
19人
+
+
未开始
+
+
+
+ ■ 已完成 86人(68%) + ■ 学习中 22人(17%) + ■ 未开始 19人(15%) +
+
+ + +
+

各课件完成率

+
+
+
+ 🎬 理论篇(00:34:57) + 92% +
+
+
已完成 117 人 / 总计 127 人
+
+
+
+ 🎬 实践篇(00:31:38) + 68% +
+
+
已完成 86 人 / 总计 127 人
+
+
+
+
+ + +
+
+

学员学习明细

+
+ + + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
学员姓名部门学习进度完成状态累计时长评分最近学习时间
张三运营部
100%
已完成1h 12m★★★★★2026-04-25 14:22
李四技术部
43%
学习中28m2026-04-28 09:15
王五行政部
100%
已完成58m★★★★☆2026-04-22 16:40
赵六人力资源部
0%
未开始
+ +
+
+ +
+
+ + + + diff --git a/training/workspace/specs/student.md b/training/workspace/specs/student.md new file mode 100644 index 0000000..4f3c9ed --- /dev/null +++ b/training/workspace/specs/student.md @@ -0,0 +1,664 @@ +# 学员端功能需求文档 + +> 版本:V1.0.1 +> 创建日期:2026-01-15 +> 更新日期:2026-01-15 +> 状态:✅ 已批准(Supervisor 复审通过) + +--- + +## 版本更新记录 + +### V1.0.1 (2026-01-15) + +**根据Supervisor审查意见修订:** + +| 修订项 | 修订内容 | +|--------|----------| +| 知识学习入口 | 补充培训任务学习场景、返回逻辑、来源区分 | +| 断点续考机制 | 补充定时任务策略、超时判定规则、并发处理 | +| 排名计算规则 | 明确计算时机、统计范围、口径定义 | +| 学习时长防刷 | 新增活跃检测机制 | +| 数据表设计 | km_knowledge_progress 新增 department_id 字段 | +| 页面路径 | 调整为复用现有路径,按角色控制 | +| 解析显示策略 | 明确交卷后立即显示解析 | +| 非功能需求 | 补充可测试的性能指标 | + +--- + +## 一、概述 + +### 1.1 目标用户 +- **角色**:学员(STUDENT) +- **人数**:约450人 +- **入口**:PC浏览器(与管理端共用系统,按角色显示不同菜单) + +### 1.2 核心目标 +为学员提供便捷的在线学习平台,支持知识学习、在线考试、培训计划跟踪,帮助学员提升专业技能。 + +--- + +## 二、功能模块总览 + +| 模块 | 功能点 | 优先级 | +|------|--------|--------| +| 工作台 | 学习概览、待办事项 | P0 | +| 知识学习 | 知识浏览、学习进度、时长统计 | P0 | +| 在线考试 | 考试列表、在线答题、断点续考、成绩排名 | P0 | +| 我的培训 | 培训计划、进度跟踪、完成判定 | P0 | +| 个人中心 | 学习记录、考试记录、证书(预留) | P1 | + +--- + +## 三、详细功能需求 + +### 3.1 工作台(首页) + +#### 用户故事 +> 作为学员,我希望登录后看到学习概览和待办事项,以便快速了解学习状态和接下来要做的事。 + +#### 功能清单 + +| 功能项 | 说明 | +|--------|------| +| 学习统计卡片 | 显示:待学习课程数、待完成考试数、培训进度百分比 | +| 我的培训计划 | 列表展示分配给我的培训计划(最多显示5条),显示进度 | +| 待完成考试 | 列表展示待完成的考试(最多显示5条),显示截止时间 | +| 快捷入口 | 点击可直接进入对应详情页 | + +#### 验收标准 +- [ ] 登录后默认进入工作台页面 +- [ ] 统计数据实时准确(待学习=未完成的必修知识数,待考试=未通过的必考考试数) +- [ ] 培训进度百分比 = 已完成必修项 / 总必修项 × 100% +- [ ] 点击培训计划可跳转到计划详情 +- [ ] 点击考试可跳转到考试页面 +- [ ] 只显示"进行中"状态的培训计划和处于"时间窗口内"的考试 + +--- + +### 3.2 知识学习 + +#### 用户故事 +> 作为学员,我希望浏览本部门的知识库,学习文档和视频,并能看到自己的学习进度。 + +#### 功能清单 + +| 功能项 | 说明 | +|--------|------| +| 知识分类导航 | 左侧树形结构展示知识分类 | +| 知识列表 | 按分类筛选,显示知识标题、类型、学习状态 | +| 知识详情/预览 | 文档在线预览、视频在线播放 | +| 学习进度记录 | 记录学习完成状态、学习时长 | +| 强制学习机制 | 视频必须播放完成、文档必须阅读完成才记录为"已完成" | + +#### 3.2.1 知识列表页 + +**页面元素**: +- 分类筛选(树形) +- 知识卡片列表:标题、类型图标(文档/视频)、学习状态标签、时长/大小 +- 搜索框(按标题搜索) + +**学习状态**: +| 状态 | 说明 | 显示样式 | +|------|------|----------| +| 未学习 | 从未打开过 | 灰色标签 | +| 学习中 | 已开始但未完成 | 蓝色标签 + 进度% | +| 已完成 | 满足完成条件 | 绿色标签 ✓ | + +#### 3.2.2 知识详情页 + +**文档类型**: +- 在线预览(PDF直接显示,Word/Excel/PPT转换预览) +- 学习计时:进入页面开始计时,离开页面停止 +- 完成条件:停留时间 ≥ 预估阅读时间(可配置,默认按页数计算) + +**视频类型**: +- 在线播放(支持进度条、全屏) +- 播放进度记录:记录当前播放位置,下次打开从断点继续 +- 完成条件:播放进度 ≥ 90%(可配置) +- 禁止拖动快进(强制学习模式下) + +#### 3.2.3 学习入口场景(🔴 修订项1) + +**场景一:自由学习(从知识库进入)** +- 入口:左侧菜单"知识库" → 知识列表 → 知识详情 +- 学习完成后:停留在知识详情页,可点击"返回列表" +- 进度记录:标记来源为 `FREE`(自由学习) + +**场景二:培训任务学习(从培训计划进入)** +- 入口:培训详情页 → 点击知识项 → 知识详情 +- 页面顶部显示:返回培训计划入口(如:"← 返回《2026年Q1安全规范培训》") +- 学习完成后: + - 自动弹出提示:"学习完成!是否返回培训计划?" + - 用户可选择【返回培训】或【继续浏览】 +- 进度记录:标记来源为 `TRAINING`(培训任务),关联 `plan_id` + +**进度记录来源区分**: +| 来源 | 场景 | 影响 | +|------|------|------| +| FREE | 自由学习 | 仅记录个人学习进度 | +| TRAINING | 培训任务学习 | 同时更新培训计划进度 | + +> **说明**:无论从哪个入口学习,学习时长和完成状态都会记录。区分来源是为了后续统计分析(如:培训驱动的学习 vs 自主学习)。 + +#### 3.2.4 学习时长防刷机制(🟡 优化项1) + +**文档类型防刷策略**: +- 每60秒检测一次用户活跃状态 +- 活跃判定:60秒内有鼠标移动、点击、滚动任一事件 +- 非活跃时:暂停计时,页面显示"检测到您暂时离开,学习计时已暂停" +- 恢复活跃后:继续计时 + +**视频类型防刷策略**: +- 依赖视频播放事件,暂停时不计时长 +- 无需额外活跃检测 + +**多标签页处理**: +- 同一知识同时只能在一个标签页学习 +- 检测到多标签页打开同一知识时,后打开的标签页提示"该知识已在其他窗口学习中" + +#### 验收标准 +- [ ] 只显示本部门、已发布状态的知识 +- [ ] 分类树正确展示,点击分类筛选对应知识 +- [ ] 文档能正常在线预览(至少支持PDF) +- [ ] 视频能正常播放,支持暂停、音量调节 +- [ ] 视频播放进度自动保存,刷新页面后从断点继续 +- [ ] 强制学习模式下,视频不能快进跳过 +- [ ] 学习时长准确记录(精确到秒) +- [ ] 满足完成条件后自动标记为"已完成" +- [ ] 学习进度与培训计划进度联动 +- [ ] 🔴 从培训计划进入的知识学习,顶部显示返回入口 +- [ ] 🔴 学习完成后弹出返回培训计划提示(仅培训任务学习场景) +- [ ] 🟡 文档学习时,非活跃状态暂停计时 +- [ ] 🟡 同一知识不能在多个标签页同时学习 + +--- + +### 3.3 在线考试 + +#### 用户故事 +> 作为学员,我希望参加分配给我的考试,并能查看成绩和排名。 + +#### 功能清单 + +| 功能项 | 说明 | +|--------|------| +| 考试列表 | 展示分配给我的所有考试 | +| 考试详情 | 显示考试信息、我的考试记录 | +| 在线答题 | 单选/多选/判断题作答 | +| 断点续考 | 中途退出后可继续答题 | +| 自动交卷 | 时间到自动提交 | +| 成绩查看 | 显示得分、答案解析 | +| 成绩排名 | 显示我在本次考试中的排名 | + +#### 3.3.1 考试列表页 + +**列表字段**: +| 字段 | 说明 | +|------|------| +| 考试名称 | 点击进入考试详情 | +| 考试时间 | 开始时间 ~ 结束时间 | +| 考试状态 | 未开始/进行中/已结束 | +| 我的状态 | 未参加/考试中/已完成 | +| 最高成绩 | 多次考试取最高分 | +| 剩余次数 | 最大次数 - 已考次数 | +| 操作 | 进入考试/查看成绩 | + +**筛选条件**: +- 考试状态:全部/进行中/已结束 +- 我的状态:全部/未完成/已完成 + +#### 3.3.2 考试详情页(进入考试前) + +**显示信息**: +- 考试名称、考试时间窗口 +- 考试规则:时长、总分、及格线、最大次数 +- 我的考试记录表格(第N次、得分、是否通过、时间) +- 【开始考试】/【继续考试】按钮 + +**按钮逻辑**: +| 场景 | 按钮状态 | +|------|----------| +| 不在时间窗口内 | 禁用,提示"考试未开始"或"考试已结束" | +| 次数已用完 | 禁用,提示"考试次数已用完" | +| 有进行中的考试记录 | 显示【继续考试】 | +| 可以开始新考试 | 显示【开始考试】 | + +#### 3.3.3 在线答题页 + +**页面布局**: +``` +┌─────────────────────────────────────────────────────────┐ +│ 考试名称 剩余时间: 45:23 │ +├─────────────────────────────────────────────────────────┤ +│ 第 3 题 / 共 20 题 [单选题] │ +│ ───────────────────────────────────────────────────── │ +│ 题干内容... │ +│ │ +│ ○ A. 选项A │ +│ ● B. 选项B(已选中) │ +│ ○ C. 选项C │ +│ ○ D. 选项D │ +├─────────────────────────────────────────────────────────┤ +│ 答题卡: [1✓] [2✓] [3●] [4○] [5○] ... │ +├─────────────────────────────────────────────────────────┤ +│ [上一题] [下一题] [交卷] │ +└─────────────────────────────────────────────────────────┘ +``` + +**功能说明**: +| 功能 | 说明 | +|------|------| +| 倒计时 | 显示剩余时间,最后5分钟变红色提醒 | +| 题目导航 | 点击答题卡数字可跳转到对应题目 | +| 答案自动保存 | 选择答案后自动保存到服务器(每30秒或切题时) | +| 上一题/下一题 | 切换题目 | +| 交卷 | 弹出确认框,确认后提交 | +| 自动交卷 | 时间结束自动提交当前答案 | + +**断点续考机制**: +- 考试开始后创建考试记录,状态为"进行中" +- 答案实时保存到服务器 +- 中途关闭浏览器/断网,考试记录保持"进行中" +- 重新打开考试,检测到进行中记录,恢复到上次状态 +- 倒计时从剩余时间继续(服务端计算:考试时长 - 已用时间) +- 超时未提交的考试,由定时任务自动交卷 + +#### 3.3.5 超时自动交卷机制(🔴 修订项2) + +**超时判定规则**: +``` +超时时间点 = 考试记录开始时间 + 考试时长(分钟) +``` + +**示例**: +- 学员A在 10:00 开始考试,考试时长60分钟 +- 超时时间点 = 10:00 + 60分钟 = 11:00 +- 无论考试时间窗口是否结束,11:00后该考试记录即视为超时 + +**定时任务策略**: +| 配置项 | 值 | 说明 | +|--------|-----|------| +| 执行频率 | 每1分钟 | Cron: `0 */1 * * * ?` | +| 扫描范围 | 状态为IN_PROGRESS的考试记录 | 只处理进行中的记录 | +| 超时判定 | 当前时间 > 开始时间 + 考试时长 | 精确到秒 | +| 处理动作 | 自动提交当前已保存的答案,计算成绩 | 标记为系统自动交卷 | + +**并发提交处理(乐观锁)**: +``` +场景:学员在超时前1秒点击交卷,同时定时任务也在处理该记录 +``` + +**处理策略**: +1. 考试记录表增加 `version` 字段(乐观锁) +2. 提交时检查 `status = IN_PROGRESS AND version = 当前版本` +3. 更新时 `version = version + 1` +4. 若更新失败(version已变),说明已被其他请求处理,直接返回已提交的结果 + +**状态流转**: +``` +IN_PROGRESS ──用户主动交卷──▶ SUBMITTED(来源:USER) + │ + └──────定时任务超时交卷──▶ SUBMITTED(来源:SYSTEM_TIMEOUT) +``` + +**交卷来源标记**: +| 来源 | 说明 | +|------|------| +| USER | 用户主动交卷 | +| SYSTEM_TIMEOUT | 系统超时自动交卷 | + +> **注意**:即使考试时间窗口已结束,只要考试记录未超时,学员仍可继续答题(但无法开始新的考试) + +#### 3.3.6 考试结果页 + +**显示内容**: +| 项目 | 说明 | +|------|------| +| 得分 | 大字显示,及格绿色/不及格红色 | +| 是否通过 | 通过✓ / 未通过✗ | +| 排名 | "您的成绩排名第 X 名(共 Y 人参加)" | +| 答题详情 | 每道题的正确答案、我的答案、解析 | +| 操作按钮 | 【再考一次】(有次数)/ 【返回列表】 | + +**答案解析显示策略(🟡 优化项4)**: +- 交卷后立即显示所有题目的答案解析 +- 无论考试是否通过,都显示解析 +- 目的:培训学习为主,帮助学员理解错误原因 + +#### 3.3.7 排名计算规则(🔴 修订项3) + +**计算时机**: +- 实时计算:每次交卷时计算排名 +- 非定时计算:不采用批量定时计算方式 + +**统计范围**: +- 范围:当前考试的所有参与者(被分配且已交卷的学员) +- 跨部门:若考试分配给多个部门,排名为所有参与者的总排名 + +**排名规则**: +| 优先级 | 规则 | 说明 | +|--------|------|------| +| 1 | 最高成绩降序 | 成绩高的排名靠前 | +| 2 | 达到最高成绩的时间升序 | 成绩相同时,先达到该成绩的排名靠前 | + +**"共Y人参加"统计口径**: +| 统计项 | 是否计入 | +|--------|----------| +| 已交卷学员 | ✅ 计入 | +| 正在考试中(未交卷) | ❌ 不计入 | +| 被分配但未参加 | ❌ 不计入 | + +**排名示例**: +``` +考试:安全规范考核 +分配对象:部门A(30人)、部门B(20人) + +参与情况: +- 部门A:25人已交卷,5人未参加 +- 部门B:18人已交卷,2人正在考试中 + +排名统计:共 43 人参加(25 + 18 = 43) + +排名结果: +第1名:张三(95分,首次达到时间 10:30) +第2名:李四(95分,首次达到时间 10:45) +第3名:王五(90分) +... +``` + +**实现建议**: +- 交卷时实时计算排名并返回 +- 排名计算SQL示例思路: + ```sql + SELECT user_id, MAX(score) as best_score, MIN(submit_time) as first_best_time + FROM ex_exam_record + WHERE exam_id = ? AND status = 'SUBMITTED' + GROUP BY user_id + ORDER BY best_score DESC, first_best_time ASC + ``` + +#### 验收标准 +- [ ] 只显示分配给当前学员的考试 +- [ ] 考试状态、我的状态准确显示 +- [ ] 不在时间窗口内无法进入考试 +- [ ] 次数用完无法再次考试 +- [ ] 答题过程中答案实时保存 +- [ ] 刷新页面/重新进入可继续答题(断点续考) +- [ ] 倒计时准确,超时自动交卷 +- [ ] 交卷后立即显示成绩和排名 +- [ ] 答案解析正确显示 +- [ ] 多次考试取最高分显示 +- [ ] 🔴 定时任务每分钟执行,自动处理超时考试记录 +- [ ] 🔴 并发交卷场景下数据一致(乐观锁机制) +- [ ] 🔴 排名实时计算,仅统计已交卷学员 +- [ ] 🔴 排名规则:最高分优先,同分按首次达到时间排序 + +--- + +### 3.4 我的培训 + +#### 用户故事 +> 作为学员,我希望查看分配给我的培训计划,跟踪学习进度,完成培训任务。 + +#### 功能清单 + +| 功能项 | 说明 | +|--------|------| +| 培训列表 | 展示分配给我的培训计划 | +| 培训详情 | 显示计划内容、学习进度 | +| 进度跟踪 | 实时显示知识学习、考试完成情况 | +| 完成判定 | 根据必修项判定培训是否完成 | +| 证书预留 | 培训完成后预留证书/徽章展示位置 | + +#### 3.4.1 培训列表页 + +**列表字段**: +| 字段 | 说明 | +|------|------| +| 培训名称 | 点击进入详情 | +| 培训周期 | 开始日期 ~ 结束日期 | +| 状态 | 未开始/进行中/已结束 | +| 我的进度 | 进度条 + 百分比 | +| 完成状态 | 未完成/已完成 | + +#### 3.4.2 培训详情页 + +**页面结构**: +``` +┌─────────────────────────────────────────────────────────┐ +│ 2026年Q1安全规范培训 │ +│ ───────────────────────────────────────────────────── │ +│ 培训周期:2026-01-01 ~ 2026-03-31 │ +│ 培训目标:掌握高速公路救援安全规范... │ +│ 我的进度:████████░░░░ 75% │ +├─────────────────────────────────────────────────────────┤ +│ 📚 学习内容 (3/5) │ +│ ├─ ✅ 高速救援SOP手册 [必修] [已完成] │ +│ ├─ ✅ 安全操作视频 [必修] [已完成] │ +│ ├─ 🔵 应急处理流程 [必修] [学习中 60%] │ +│ ├─ ⚪ 设备使用指南 [选修] [未学习] │ +│ └─ ✅ 案例分析 [选修] [已完成] │ +├─────────────────────────────────────────────────────────┤ +│ 📝 考试任务 (1/2) │ +│ ├─ ✅ 安全规范考核 [必考] [已通过 85分] │ +│ └─ ⚪ 操作技能测试 [必考] [未参加] │ +├─────────────────────────────────────────────────────────┤ +│ 🏆 完成奖励 │ +│ └─ 完成培训后可获得【安全规范认证】徽章(敬请期待) │ +└─────────────────────────────────────────────────────────┘ +``` + +**进度计算规则**: + +``` +培训进度 = (已完成必修知识数 + 已通过必考考试数) / (必修知识总数 + 必考考试总数) × 100% +``` + +**完成判定规则**: +| 条件 | 说明 | +|------|------| +| 所有必修知识已完成 | ✓ | +| 所有必考考试已通过 | ✓ | +| 选修知识 | 不影响完成判定 | +| 选考考试 | 不影响完成判定 | + +#### 验收标准 +- [ ] 只显示分配给当前学员的培训计划 +- [ ] 进度百分比计算准确(只计算必修项) +- [ ] 学习内容、考试任务分开展示 +- [ ] 显示每项的必修/选修、必考/选考标签 +- [ ] 点击知识内容可跳转到知识详情页 +- [ ] 点击考试任务可跳转到考试页面 +- [ ] 所有必修项完成后,培训状态变为"已完成" +- [ ] 证书/徽章区域预留(V1显示"敬请期待") + +--- + +### 3.5 个人中心 + +#### 用户故事 +> 作为学员,我希望查看自己的学习记录、考试历史和获得的证书。 + +#### 功能清单 + +| 功能项 | 说明 | +|--------|------| +| 个人信息 | 显示姓名、部门、角色 | +| 学习统计 | 总学习时长、完成课程数 | +| 学习记录 | 知识学习历史列表 | +| 考试记录 | 考试历史列表 | +| 我的证书 | 证书/徽章展示(预留) | + +#### 验收标准 +- [ ] 正确显示当前用户信息 +- [ ] 学习时长统计准确(累计所有知识学习时长) +- [ ] 学习记录按时间倒序展示 +- [ ] 考试记录显示每次考试的详情 +- [ ] 证书模块预留(V1显示"暂无证书") + +--- + +## 四、数据契约补充 + +### 4.1 新增/修改实体 + +#### 知识学习进度表 (km_knowledge_progress) - 新增 + +| 字段 | 类型 | 说明 | +|------|------|------| +| id | Long | 主键 | +| user_id | Long | 学员ID | +| knowledge_id | Long | 知识ID | +| department_id | Long | **🟡 新增** 所属部门(冗余字段,便于按部门统计) | +| status | Enum | 状态:NOT_STARTED/IN_PROGRESS/COMPLETED | +| progress | Integer | 进度百分比(0-100) | +| duration | Long | 学习时长(秒) | +| video_position | Long | 视频播放位置(秒),仅视频类型 | +| source | Enum | **🔴 新增** 学习来源:FREE/TRAINING | +| plan_id | Long | **🔴 新增** 关联培训计划ID(来源为TRAINING时有值) | +| start_time | DateTime | 首次学习时间 | +| complete_time | DateTime | 完成时间 | +| update_time | DateTime | 最后更新时间 | + +#### 考试记录表 (ex_exam_record) - 补充字段 + +| 字段 | 类型 | 说明 | +|------|------|------| +| status | Enum | **新增** 状态:IN_PROGRESS/SUBMITTED | +| last_save_time | DateTime | **新增** 最后保存时间(断点续考用) | +| version | Integer | **🔴 新增** 乐观锁版本号 | +| submit_source | Enum | **🔴 新增** 交卷来源:USER/SYSTEM_TIMEOUT | + +### 4.2 新增枚举 + +```java +// 学习状态 +public enum LearningStatus { + NOT_STARTED, // 未学习 + IN_PROGRESS, // 学习中 + COMPLETED // 已完成 +} + +// 🔴 学习来源 +public enum LearningSource { + FREE, // 自由学习(从知识库直接进入) + TRAINING // 培训任务学习(从培训计划进入) +} + +// 考试记录状态 +public enum ExamRecordStatus { + IN_PROGRESS, // 考试中(用于断点续考) + SUBMITTED // 已提交 +} + +// 🔴 交卷来源 +public enum SubmitSource { + USER, // 用户主动交卷 + SYSTEM_TIMEOUT // 系统超时自动交卷 +} +``` + +--- + +## 五、接口预留(V2/V3功能) + +### 5.1 证书/徽章接口(预留) + +``` +POST /api/certificate/generate # 生成证书 +GET /api/certificate/my # 我的证书列表 +GET /api/certificate/{id} # 证书详情 +GET /api/badge/my # 我的徽章列表 +``` + +### 5.2 错题本接口(V2预留) + +``` +GET /api/wrong-questions # 错题列表 +POST /api/wrong-questions/review # 标记已复习 +``` + +--- + +## 六、非功能需求 + +| 项目 | 要求 | 测试指标(🟡 优化项5) | +|------|------|------------------------| +| 页面加载 | 页面加载 < 2秒 | 95%请求 < 2秒 | +| 考试提交 | 考试提交 < 1秒 | 99%请求 < 1秒 | +| 并发支持 | 支持100人同时在线考试 | 100并发答题,响应时间 < 500ms,成功率 > 99.9% | +| 答案保存 | 答案自动保存 | 保存成功率 > 99.99%,保存延迟 < 300ms | +| 数据安全 | 考试答案定时自动保存,防止数据丢失 | 断网重连后数据无丢失 | +| 兼容性 | 支持主流浏览器 | Chrome 90+、Edge 90+、Firefox 90+ | + +--- + +## 七、不做什么(Out of Scope) + +| 功能 | 原因 | +|------|------| +| 移动端适配 | V1仅支持PC浏览器 | +| 防作弊功能 | 产品确认不需要 | +| 学习日历 | 产品确认不需要 | +| 错题本 | V2规划 | +| 社交功能(评论、点赞) | V3规划 | + +--- + +## 八、页面清单(🟡 优化项3) + +> **说明**:采用与管理端复用同一套系统的方案,按角色控制菜单和功能显示,不使用独立的 `/student/` 路径前缀。 + +| 页面 | 路径 | 角色可见 | 说明 | +|------|------|----------|------| +| 工作台 | /index.html | 全角色 | 根据角色显示不同内容 | +| 知识列表 | /knowledge/list.html | 全角色 | 学员只读,讲师可管理 | +| 知识详情 | /knowledge/view.html?id={id} | 全角色 | 学员增加学习进度记录 | +| 考试列表 | /exam/my-exams.html | 学员 | 我的考试列表 | +| 考试详情 | /exam/detail.html?id={id} | 学员 | 考试信息页 | +| 在线答题 | /exam/answer.html?id={id} | 学员 | 答题页面 | +| 考试结果 | /exam/result.html?recordId={id} | 学员 | 成绩结果页 | +| 培训列表 | /training/my-training.html | 学员 | 我的培训列表 | +| 培训详情 | /training/detail.html?id={id} | 学员 | 培训计划详情 | +| 个人中心 | /profile/index.html | 全角色 | 个人信息页 | +| 学习记录 | /profile/learning.html | 学员 | 学习记录列表 | +| 考试记录 | /profile/exam-history.html | 学员 | 考试记录列表 | +| 我的证书 | /profile/certificate.html | 学员 | 证书展示(预留) | + +**菜单权限控制**: +| 菜单项 | 管理员 | 讲师 | 学员 | +|--------|--------|------|------| +| 工作台 | ✅ | ✅ | ✅ | +| 知识库 | ✅ 管理 | ✅ 管理 | ✅ 只读学习 | +| 考题管理 | ✅ | ✅ | ❌ | +| 试卷管理 | ✅ | ✅ | ❌ | +| 考试管理 | ✅ | ✅ | ❌ | +| 我的考试 | ❌ | ❌ | ✅ | +| 培训计划 | ✅ | ✅ | ❌ | +| 我的培训 | ❌ | ❌ | ✅ | +| 个人中心 | ✅ | ✅ | ✅ | +| 系统设置 | ✅ | ❌ | ❌ | + +--- + +## 九、修订项对照表 + +| 修订项 | 类型 | 章节位置 | 状态 | +|--------|------|----------|------| +| 知识学习入口场景 | 🔴 必须修正 | 3.2.3 | ✅ 已补充 | +| 断点续考超时机制 | 🔴 必须修正 | 3.3.5 | ✅ 已补充 | +| 排名计算规则 | 🔴 必须修正 | 3.3.7 | ✅ 已补充 | +| 学习时长防刷机制 | 🟡 建议优化 | 3.2.4 | ✅ 已采纳 | +| 数据表department_id | 🟡 建议优化 | 4.1 | ✅ 已采纳 | +| 页面路径设计 | 🟡 建议优化 | 8 | ✅ 已调整 | +| 答案解析显示策略 | 🟡 建议优化 | 3.3.6 | ✅ 已明确 | +| 非功能需求测试指标 | 🟡 建议优化 | 6 | ✅ 已补充 | + +--- + +**文档状态:✅ 已批准** + +> **Supervisor 复审结论**:通过 +> **复审日期**:2026-01-15 +> **下一阶段**:技术评审 → 开发