from sqlalchemy import select from .models import Course, CourseVersion, RubricVersion from .rules import RubricData from .materialized import sync_course_entities, sync_rubric_entities INDICATORS = [ {"code": "2.3", "description": "基于文献研究获得复杂自动化工程问题的解决方案及替代方案"}, {"code": "2.4", "description": "运用数理和自动化工程基础知识分析解决方案合理性"}, {"code": "4.1", "description": "调研和分析本领域复杂工程问题的解决方案"}, {"code": "4.2", "description": "选择研究路线并设计实验方案"}, {"code": "4.3", "description": "构建实验系统、安全操作实验并分析解释数据"}, {"code": "4.4", "description": "整理数据、分析结果并撰写实验报告"}, {"code": "11.1", "description": "掌握工程管理原理和经济决策方法"}, {"code": "11.2", "description": "理解自动化系统全周期成本并应用工程管理和经济决策"}, ] OBJECTIVES = [ {"code": "1", "name": "问题解决与研究能力", "indicators": ["2.3", "4.1"]}, {"code": "2", "name": "知识运用与分析能力", "indicators": ["2.4", "11.1", "11.2"]}, {"code": "3", "name": "实验设计与操作能力", "indicators": ["4.2", "4.3"]}, {"code": "4", "name": "数据处理与报告撰写能力", "indicators": ["4.4"]}, ] DIRECTIONS = [ {"name": "赛教融合", "examples": ["西门子杯中智赛", "电子设计竞赛", "挑战杯-揭榜挂帅"]}, {"name": "科教融合", "examples": ["智慧交通", "智慧电网", "智能飞行器"]}, {"name": "产教融合", "examples": ["智能驾驶", "智能制造", "具身智能"]}, ] def criterion(category, code, name, points, evidence, objective, outcomes, description=None, levels=None): high = int(points * .75 + .5) mid = int(points * .35 + .5) levels = levels or [(high, points, "证据充分,分析准确且具体"), (mid, high - 1, "基本满足要求,但证据或分析不充分"), (0, mid - 1, "核心证据缺失或内容明显不足")] return { "criterion_id": f"{category}.{code}", "category": category, "name": name, "max_score": points, "description": description or name, "required_evidence": evidence, "linked_objectives": objective, "linked_outcomes": outcomes, "score_levels": [{"min": low, "max": high_, "description": text} for low, high_, text in levels], } INITIAL_CRITERIA = [ criterion("stage1", "problem", "复杂工程问题和需求分析", 25, ["问题定义", "需求分析"], ["1"], ["2.3", "4.1"]), criterion("stage1", "literature", "文献调研和技术现状总结", 20, ["参考文献", "技术现状"], ["1"], ["2.3", "4.1"]), criterion("stage1", "solutions", "主方案和替代方案设计", 25, ["主方案", "替代方案", "方案比较"], ["1", "2"], ["2.3", "2.4"]), criterion("stage1", "feasibility", "可行性、风险和合理性论证", 15, ["工程依据", "风险分析"], ["2"], ["2.4"]), criterion("stage1", "management", "工程管理、进度和成本分析", 10, ["进度计划", "资源配置", "成本"], ["2"], ["11.1", "11.2"]), criterion("stage1", "format", "报告完整性和规范性", 5, ["标题", "章节", "参考文献"], ["4"], ["4.4"]), criterion("stage2", "architecture", "系统架构和实现思路", 20, ["系统架构", "实现思路"], ["2", "3"], ["2.4", "4.2"]), criterion("stage2", "hardware", "硬件选型及选型依据", 20, ["硬件清单", "参数", "选型依据"], ["3"], ["4.2"]), criterion("stage2", "interfaces", "系统框图、连接关系和接口设计", 20, ["系统框图", "接口", "连接关系"], ["3"], ["4.2", "4.3"]), criterion("stage2", "experiment", "实验方案、测试方法和预期指标", 20, ["实验步骤", "测试方法", "预期指标"], ["3"], ["4.2", "4.3"]), criterion("stage2", "safety", "安全风险和防护措施", 10, ["安全风险", "防护措施"], ["3"], ["4.3"]), criterion("stage2", "progress", "阶段进展及下一阶段计划", 10, ["进展", "下一阶段计划"], ["2"], ["11.1"]), criterion("stage3", "software", "软件逻辑和系统实现", 20, ["软件逻辑", "流程图"], ["3"], ["4.2", "4.3"]), criterion("stage3", "code", "核心代码和功能说明", 20, ["核心代码", "功能说明"], ["3"], ["4.3"]), criterion("stage3", "debug", "调试过程、问题分析和解决方法", 20, ["故障", "原因", "解决方法"], ["3"], ["4.3"]), criterion("stage3", "data", "实验数据和初步分析", 20, ["实验数据", "分析"], ["4"], ["4.4"]), criterion("stage3", "verification", "功能和性能指标验证", 15, ["功能测试", "性能指标"], ["3", "4"], ["4.3", "4.4"]), criterion("stage3", "plan", "下一阶段计划及报告规范性", 5, ["计划", "章节"], ["2", "4"], ["11.1", "4.4"]), criterion("final", "completion", "任务完成度", 20, ["设计任务", "实现结果", "功能验证"], ["2", "3"], ["2.4", "4.3"], levels=[(15, 20, "按时完成全部设计与实现任务,系统功能达标且完整"), (7, 14, "完成核心任务,系统功能基本达标"), (0, 6, "未完成核心任务或功能严重缺失")]), criterion("final", "report", "报告规范性", 20, ["方案论证", "设计过程", "实验数据", "结果分析"], ["4"], ["4.4"], levels=[(15, 20, "结构完整、格式规范、逻辑严谨"), (7, 14, "结构基本完整,格式较规范"), (0, 6, "结构混乱,无法清晰呈现解决方案")]), criterion("final", "presentation", "汇报答辩(仅按PPT内容评价)", 40, ["PPT逻辑", "解决方案", "成果展示"], ["2", "4"], ["2.4", "4.4"], description="只评价PPT或PPT PDF内容,不评价现场口头答辩", levels=[(30, 40, "PPT内容逻辑清晰,准确阐述方案及合理性"), (13, 29, "PPT基本阐述解决方案"), (0, 12, "PPT无法清晰表达解决方案")]), criterion("final", "analysis", "结果分析", 20, ["实验数据", "误差分析", "优化方向", "结论"], ["4"], ["4.4"], levels=[(15, 20, "数据完整,分析深入,结论有依据"), (7, 14, "数据基本完整,分析较合理"), (0, 6, "数据缺失,结论缺乏依据")]), ] INITIAL_PROMPTS = { "facts": "从证据中抽取项目事实。仅记录证据明确支持的事实;不确定字段留空。返回严格JSON。", "score": "你是自动化专业综合实践教师。仅根据提供的评分规则和带页码证据评分。不得臆测缺失内容。PPT项只评价页面内容,不评价口头答辩。返回严格JSON。", "consistency": "检查各阶段报告、最终报告和PPT中项目名称、技术路线、硬件、实验数据及成果的一致性。仅报告有证据的矛盾。返回严格JSON。", } COURSE_DOCS = ["课程导学-自动化专业综合实践.pdf", "自动化专业综合实践三融合选题课程概述.pdf", "大作业评分表-自动化专业综合实践.docx", "阶段报告1模板.doc", "阶段报告2模板.doc", "阶段报告3模板.doc"] def seed_initial(db): if db.scalar(select(Course.id).limit(1)): return rubric = RubricData(criteria=INITIAL_CRITERIA, weights={"stage1": .1, "stage2": .1, "stage3": .1, "final": .7}) course = Course(name="自动化专业综合实践", code="automation_comprehensive_practice") db.add(course) db.flush() version = CourseVersion(course_id=course.id, version=1, title="初始课程版本", objectives=OBJECTIVES, indicators=INDICATORS, directions=DIRECTIONS, prompts=INITIAL_PROMPTS, templates=COURSE_DOCS, published=True) db.add(version) db.flush() sync_course_entities(db, version) rubric_version = RubricVersion(course_version_id=version.id, version=1, criteria=[c.model_dump() for c in rubric.criteria], weights=rubric.weights, published=True) db.add(rubric_version) db.flush() sync_rubric_entities(db, rubric_version) db.commit()