refactor: simplify product copy

Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
This commit is contained in:
lofyer
2026-08-25 11:37:59 +08:00
co-authored by factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
parent 248078113c
commit b9fbd4c6af
22 changed files with 364 additions and 362 deletions
+25 -25
View File
@@ -1,6 +1,6 @@
# 产教融智企业版前端
产教融智面向职业院校构建“产业信号、专业诊断、校企协同、改进任务、正式报告”一体化工作闭环。本目录是企业版产品前端基线,所有核心场景均可深入点击并形成可追踪的业务结果。
产教融智供职业院校查看岗位变化、分析专业差距、安排企业合作、跟进改进任务并出具正式报告。本目录保存企业版产品前端样例。
## 运行
@@ -12,7 +12,7 @@ python3 -m http.server 8080
然后访问 <http://localhost:8080>。
## 核心产品能力
## 主要功能
- 校级供需决策总览、周期切换、专业搜索和七步产品导览
- “企业需求 → 学校接收/分析快照 → 专业建议决策 → 任务/项目 → 执行证据 → 企业评价 → 校级验收 → 报告审批发布 → 数据使用反馈 → 成效复核”11 节点可交互业务流程图
@@ -22,26 +22,26 @@ python3 -m http.server 8080
- 技术接收同时强校验租户、包号、版本、交付记录数和完整 64 位 SHA-256;任一不一致只写失败审计,不推进回执或分析快照
- 交付包记录数与分析样本量分开保存:样板包回执为 `2,846,320` 条,生成的校园分析快照为 `128,642` 条
- 专业技能供需、岗位流向、薪资对标、课程技能映射与专业对比
- 企业需求响应、潜力伙伴对接、协同项目里程碑和验收证据
- 企业需求响应、潜力伙伴对接、合作项目里程碑和验收证据
- 改进任务筛选、搜索、创建、阶段进展和报告建议转任务
- 数据源初次导入、增量更新、质量处置、版本管理、授权与审计
- 厂商基础数据包、校级数据、企业数据分类及授权状态筛选
- 覆盖 6 个数据源和 42 份报告的“数据 → 指标/分析主题 → 报告”双向依赖图谱,支持只看缺口
- 报告缺失字段、当前完整率、影响范围、业务索取人、技术接口人和要求完成日期一体化追踪
- 每份报告列出缺失字段、当前完整率、影响范围、业务索取人、技术接口人和要求完成日期
- 校级管理者、校级技术管理员、学院负责人、专业负责人、就业老师、企业导师、厂商超级管理员七种差异化工作台
- 厂商平台级数据包导入、学校租户、账号权限、备份恢复和审计管理
- 校级、学院、专业、产业专题与数据质量报告中心
- 在线报告正文:封面、摘要、发现、供需分析、数据证据、指标口径和行动建议
- 报告内置 ECharts / ECharts-GL 可视化:仪表盘、三基准柱状图、雷达图、趋势面积图、热力图、环图、象限气泡图和立体证据矩阵
- 学校事实画像:在校生、毕业生、专业、教师、课程、合作企业、就业与实习指标均附证据编号、来源、更新时间、责任部门和计算口径
- 结论证据链:学校值、区域均值、同类院校均值、排名、样本量、数据权属、置信度和已知限制
- 学校现状数据:在校生、毕业生、专业、教师、课程、合作企业、就业与实习指标均注明编号、来源、更新时间、责任部门和计算口径
- 结论依据:学校值、区域均值、同类院校均值、排名、样本量、数据权属、可靠程度和已知限制
- 报告类型、周期、关键词筛选、目录跳转、建议转任务、打印与离线 HTML 下载
- 本期分析生成与供需会材料包生成
- 供需会展示大屏及桌面端、平板、移动端自适应
## 数据资产分类
- **互联网基础数据包**:由平台厂商合规归集、治理并按服务期导入,属于付费订阅数据。
- **互联网基础数据包**:由平台厂商按授权收集、检查并按服务期导入,属于付费订阅数据。
- **校级数据**:来自学校实习、就业、教务等业务系统,数据权属归学校。
- **企业数据**:由合作企业确认提交,按照合作协议限定使用范围。
@@ -57,15 +57,15 @@ python3 -m http.server 8080
- 桌面端显示完整流程拓扑,移动端转换为带连接线的纵向节点流程,并用三张可点击关系卡保留整改、退回与下一周期回流;
- “进入下一周期”会归档上一周期报告,创建带 `previousVersionId` 的新需求、快照和回执版本,并清空新周期尚未产生的下游实体。
流程图只负责展示并调用现有状态机,不维护第二套演示状态。因此原有租户、SHA、记录数、证据冻结、独立审批和角色授权规则继续生效。
流程图只展示并调用现有状态机,不另存一套演示状态。原有租户、SHA、记录数、报告生成后禁止追加证据、独立审批和角色授权规则继续生效。
## 数据与报告依赖图谱
“数据资产”页提供两种追溯方向:
“数据资产”页提供两种查询方式:
- **从报告看数据**:选择任一校级、学院、专业、产业专题或数据质量报告,查看必需数据、可选增强数据、分析主题、当前完备度和缺口。
- **从数据看报告**:选择任一数据源,查看可形成的分析主题、支撑的报告类型和具体报告数量。
- **只看缺口**:仅保留存在质量或字段问题的依赖关系,快速定位不能稳定支撑报告的数据。
- **从数据看报告**:选择任一数据源,查看可做的分析、使用该数据的报告类型和具体报告数量。
- **只看缺口**:仅保留存在质量或字段问题的依赖关系,查看哪些数据暂时不能用于报告。
当前样板将 42 份报告映射到 6 个数据源,并以版本化依赖模板区分必需与可选关系。每个缺口展示:
@@ -76,25 +76,25 @@ python3 -m http.server 8080
- 要求完成日期和受影响报告数;
- 可直接进入现有质量处置抽屉的操作入口。
依赖元数据用于跨部门补数协同,可以在数据运维角色下查看;报告正文仍按现有角色与数据范围授权,查看依赖关系不自动获得报告阅读权限。静态样板中的依赖、完整率和责任状态均为演示数据,正式系统应将 `ReportDataDependency`、`AnalysisTopic` 和 `DataRequest` 作为租户隔离、版本化、可审计的后端实体。
依赖信息供不同部门补数据时查看;报告正文仍按角色和数据范围授权,查看依赖关系不会自动获得报告阅读权限。静态样板中的依赖、完整率和责任状态均为演示数据,正式系统应按租户和版本保存 `ReportDataDependency`、`AnalysisTopic` 和 `DataRequest`,并记录修改人和时间。
## 角色视角
- **校级管理者**:全校决策总览、专业对比、校企协同、改进任务、数据资产与报告。
- **校级管理者**:全校决策总览、专业对比、校企合作、改进任务、数据资产与报告。
- **校级技术管理员**:学校数据源、初次导入、更新任务、字段契约、质量问题、版本、授权与审计。
- **学院负责人**:本院专业洞察、校企协同、改进任务与学院报告。
- **专业负责人**:专业建议决策、关联任务与项目推进、执行证据和下一周期复核。
- **学院负责人**:本院专业分析、校企合作、改进任务与学院报告。
- **专业负责人**:专业建议决策、关联任务与项目进度、执行证据和下一周期复核。
- **就业老师**:就业侧数据使用确认和下一周期反馈;不能审批校级业务报告。
- **企业导师**:企业人才需求、共建项目、学生参与和协同任务。
- **企业导师**:企业人才需求、共建项目、学生参与和合作任务。
- **厂商超级管理员**:平台数据包、学校租户、账号权限、备份恢复、服务监控与审计。
关键职责分离:
- 技术接收成功后当前企业需求版本锁定;后续变更必须创建新版本并重新接收;
- 当前报告一经生成,支撑该版本的任务证据冻结;新增证据必须进入下一周期或重开新版本;
- 技术接收完成后不能修改当前企业需求;后续变更必须创建新版本并重新接收;
- 报告生成后不能再给当前任务追加证据;新增证据必须进入下一周期或新版本;
- 阶段进度必须达到 100%,企业导师才能提交通过或整改评价;
- 企业评价为“需整改”时,校级验收继续阻断,补充证据并重新评价后才可进入验收;
- 就业侧最新反馈为“需补充”时,成效复核继续阻断;改为“可用”后才可复核,周期关闭后不再接受追加反馈;
- 企业评价为“需整改”时不能进入校级验收,补充证据并重新评价后才可继续;
- 就业侧最新反馈为“需补充”时不能进入成效复核;改为“可用”后才可继续,周期关闭后不再接受追加反馈;
- 报告提交人不能批准或退回自己的提交,非校级管理者不显示报告审批与发布动作;
- 报告正式发布前,就业老师不能登记使用反馈,下载和打印均明确标识非正式版。
@@ -105,15 +105,15 @@ python3 -m http.server 8080
- 厂商超级管理员在“平台运营中心 → 数据包管理”完成基础数据包导入、Schema 与质量校验、租户授权和版本发布。
- 校级技术管理员登录后默认进入“学校数据运维中心”,管理学校自有数据和企业授权数据。
- 每个数据源的“资产详情”包含业务截止日期、入库日期、下次更新、更新内容、主键、必填字段、格式、Schema、质量阈值、责任人与审计事件。
- “数据与报告双向依赖图谱”同时回答“这份报告还需要什么数据”和“这项数据可以形成哪些报告”,并把缺口直接分派到业务索取人与技术接口人。
- “接收与使用反馈”展示租户、包号、版本、完整 SHA、交付包记录数、独立分析快照、支撑报告/项目/任务、业务可用确认和下一周期反馈。
- “数据与报告双向依赖图谱”同时回答“这份报告还需要什么数据”和“哪些报告使用这项数据”,并把缺口直接分派到业务索取人与技术接口人。
- “接收与使用反馈”展示租户、包号、版本、完整 SHA、交付包记录数、独立分析快照、关联报告/项目/任务、业务可用确认和下一周期反馈。
- 更新采用“暂存 → 校验 → 审批 → 发布”流程。失败数据进入隔离区,不覆盖当前稳定版本。
详细角色权限、数据契约、初次导入要求、更新机制和未来后端实体设计见 [`../docs/enterprise-product-baseline.md`](../docs/enterprise-product-baseline.md)。
详细角色权限、数据契约、初次导入要求、更新方式和未来后端实体设计见 [`../docs/enterprise-product-baseline.md`](../docs/enterprise-product-baseline.md)。
## 报告与离线运行
报告中心内置42份独立报告,包括32份专业人才需求报告、5份学院报告,以及校级、产业专题和数据质量报告。在线阅读支持章节目录、八类交互图表、学校事实证据、来源台账和行动建议;下载功能生成可独立归档、打开和打印的完整 HTML 报告。
报告中心内置42份独立报告,包括32份专业人才需求报告、5份学院报告,以及校级、产业专题和数据质量报告。在线阅读支持章节目录、八类交互图表、学校数据、来源台账和任务建议;下载功能生成可独立保存、打开和打印的完整 HTML 报告。
在线图表使用 `vendor/` 中本地化的 ECharts 5.6 与 ECharts-GL 2.0,无需 CDN。浏览器不支持图表运行时时自动显示静态 SVG 降级视图;下载报告直接内嵌全部图形和样式,不依赖外部脚本或网络。Apache-2.0、NOTICE 和 BSD-3-Clause 文件随库保存在 `vendor/`。
@@ -123,7 +123,7 @@ python3 -m http.server 8080
- 为避免静态原型长期演示导致浏览器存储无界增长,审计、证据、反馈、自定义集合和实体历史采用明确保留上限;正式系统应改用服务端分页、归档和不可变审计存储。
- 共享样板标识为租户 `TENANT-HZVTC`、厂商包 `EDU-PKG-20260823-01`、版本 `V2026.08.23`、学校回执 `RCT-HZVTC-20260823-01`。这些标识只用于本静态原型的业务链对照,不表示厂商端和校园端页面实时同步。
- 当前前端不向外部服务发送请求,可直接在隔离网络运行。
- 仓库内数据用于本地产品验收,不包含任何真实学校、学生或企业敏感信息。
- 仓库内数据用于本地产品验收,不包含任何实际学校、学生或企业的敏感信息。
- `localStorage` 只用于原型演示,不是正式数据库、鉴权或审计设施。正式接入必须由后端 API 执行租户隔离、身份认证、逐对象授权、并发控制、不可抵赖审计、文件安全存储、字段脱敏、授权台账和备份恢复;前端按钮隐藏或禁用不能作为权限控制。
- JavaScript 语法检查:`node --check app.js && node --check report-visuals.js`
- 推荐桌面验收视口为 `1440 × 900`,移动验收视口为 `390 × 844`。
+122 -122
View File
@@ -29,7 +29,7 @@ const professionData = {
priority: "高优先级",
title: "强化“云原生与容器化”实训模块",
description:
"建议在综合实训中增加 Docker、Kubernetes 和 CI/CD 流水线,采用企业真实部署任务组织教学。",
"建议在综合实训中增加 Docker、Kubernetes 和 CI/CD 流水线,并把企业部署任务用于课堂练习。",
evidence: "2,864条岗位样本中,相关技能出现率由42%升至78%,当前课程覆盖仅32%",
},
{
@@ -76,15 +76,15 @@ const professionData = {
priority: "高优先级",
title: "新增工业视觉综合实训项目",
description:
"联合装备企业建设缺陷检测场景,覆盖相机标定、图像处理、产线集成和质量评价。",
"与装备企业共同设计缺陷检测任务,练习相机标定、图像处理、产线集成和质量评价。",
evidence: "机器视觉岗位近90天增长38%,课程覆盖度仅38%,技能缺口44个百分点",
},
{
priority: "中优先级",
title: "引入设备数字孪生教学案例",
description:
"将现有PLC和生产线实训映射到数字孪生模型,形成设备数据采集与仿真任务。",
evidence: "73%的龙头制造企业将数字孪生列为智能工厂建设能力",
"把现有 PLC 和生产线实训对应到数字孪生模型,并安排设备数据采集与仿真任务。",
evidence: "73%的龙头制造企业已把数字孪生列入智能工厂相关岗位要求",
},
],
companies: [
@@ -123,7 +123,7 @@ const professionData = {
priority: "高优先级",
title: "重构跨境电商平台运营课程",
description:
"增加真实店铺、选品定价、海外投放和合规履约任务,引入企业运营数据进行过程评价。",
"增加企业店铺运营、选品定价、海外投放和合规履约任务,并用企业运营数据评价学习过程。",
evidence: "跨境运营岗位增长34%,当前课程技能覆盖43%,企业反馈实操能力不足",
},
{
@@ -182,7 +182,7 @@ const trendSets = {
const projects = [
{ type: "course", tone: "green", title: "云原生应用开发课程共建", meta: "信息工程学院 × 数梦工场", progress: 72, partners: ["李", "王", "企"] },
{ type: "lab", tone: "amber", title: "工业视觉缺陷检测实训", meta: "智能制造学院 × 大华股份", progress: 48, partners: ["陈", "赵", "企"] },
{ type: "practice", tone: "blue", title: "跨境电商真实店铺运营", meta: "商贸旅游学院 × 连连数字", progress: 86, partners: ["徐", "周", "企"] },
{ type: "practice", tone: "blue", title: "跨境电商店铺运营", meta: "商贸旅游学院 × 连连数字", progress: 86, partners: ["徐", "周", "企"] },
{ type: "course", tone: "green", title: "数字文旅内容生产工作坊", meta: "艺术设计学院 × 宋城集团", progress: 35, partners: ["许", "孙", "企"] },
];
@@ -200,7 +200,7 @@ const enterpriseDemands = [
company: "遥望科技",
industry: "数字商贸",
title: "直播电商运营实战项目",
description: "提供真实品牌运营任务,需要课程团队共同设计过程评价标准。",
description: "提供品牌运营任务,需要课程团队共同设计过程评价标准。",
due: "本周五截止",
},
{
@@ -215,7 +215,7 @@ const enterpriseDemands = [
const partners = [
{ logo: "吉利", name: "吉利汽车", industry: "汽车制造 · 龙头企业", reason: "近一年发布高匹配岗位186个,与机电专业技能重合度高。", tags: ["智能产线", "企业导师"], match: 95 },
{ logo: "数梦", name: "数梦工场", industry: "数据智能 · 专精特新", reason: "已确认参与云原生课程共建,并提供真实项目案例。", tags: ["云平台", "课程共建"], match: 94 },
{ logo: "数梦", name: "数梦工场", industry: "数据智能 · 专精特新", reason: "已确认参与云原生课程共建,并提供项目案例。", tags: ["云平台", "课程共建"], match: 94 },
{ logo: "遥望", name: "遥望科技", industry: "直播电商 · 上市企业", reason: "内容运营和直播投放需求稳定,愿意提供实训项目。", tags: ["直播电商", "项目实训"], match: 93 },
{ logo: "大华", name: "大华股份", industry: "智能物联 · 龙头企业", reason: "工业视觉岗位增长显著,与学校智能制造方向互补。", tags: ["机器视觉", "实训基地"], match: 92 },
];
@@ -399,7 +399,7 @@ const sources = [
categoryLabel: "企业数据",
commercial: "合作授权",
provider: "126家合作企业",
rights: "限定合作场景使用",
rights: "只限约定合作用途",
coverage: "岗位与技能需求",
frequency: "按需更新",
status: "授权有效",
@@ -953,7 +953,7 @@ const closedLoopActionCatalog = {
description: "项目自动绑定 demandId、recommendationId 与 taskId。",
roles: ["专业负责人"],
fields: [
["title", "项目名称", "text", "边缘计算测试真实项目进课堂"],
["title", "项目名称", "text", "边缘计算测试项目进课堂"],
["profession", "牵头专业", "text", "软件技术"],
["owner", "项目负责人", "text", "李雯"],
],
@@ -981,7 +981,7 @@ const closedLoopActionCatalog = {
roles: ["企业导师"],
fields: [
["result", "评价结论", "select", "通过|需整改"],
["comment", "评价意见", "textarea", "任务覆盖真实设备测试流程,验收量规清晰,同意进入校级验收。"],
["comment", "评价意见", "textarea", "任务覆盖企业设备测试流程,验收量规清晰,同意进入校级验收。"],
],
},
acceptance: {
@@ -999,7 +999,7 @@ const closedLoopActionCatalog = {
title: "生成业务报告草稿",
queueLabel: "生成业务报告草稿",
nodeKey: "report",
description: "报告关联需求、快照、任务和全部证据,生成后进入真实审批流。",
description: "报告关联需求、快照、任务和全部证据,生成后进入校内审批流程。",
roles: ["专业负责人", "学院负责人", "校级管理者"],
fields: [["title", "报告名称", "text", "边缘计算测试人才共育成效报告"]],
},
@@ -1065,14 +1065,14 @@ function closedLoopActionState(action) {
const checks = {
demand: [
e.snapshot.status === "待接收" && !e.task && !e.report,
e.snapshot.status !== "待接收" ? "技术接收后需求版本已锁定;后续变更必须创建新版本并重新接收。" : "已有下游任务或报告,当前需求版本不可原地修改。",
e.snapshot.status !== "待接收" ? "技术接收完成后不能修改当前需求;如需变更,请创建新版本并重新接收。" : "已有下游任务或报告,当前需求版本不能直接修改。",
],
receive: [e.demand.status === "已提交" && e.snapshot.status !== "已验收", e.snapshot.status === "已验收" ? "技术接收与快照验收已完成。" : "需先由企业提交完整需求。"],
decision: [e.snapshot.status === "已验收" && e.recommendation.status !== "已采纳", e.recommendation.status === "已采纳" ? "建议已采纳并创建关联任务。" : "需先完成数据接收并生成已验收快照。"],
project: [Boolean(e.task && !e.project), e.project ? "关联项目已创建。" : "需先采纳建议并自动创建任务。"],
evidence: [
Boolean(e.task && e.project && ["进行中", "需整改", "已退回"].includes(e.task.status) && !e.report),
e.report ? "报告版本已生成,当前任务证据已冻结;新增证据必须进入下一周期或重开新版本。" : e.task?.status === "已完成" ? "任务已完成校级验收,不能继续追加当前版本证据。" : "需先创建处于执行或整改状态的关联任务和项目。",
e.report ? "报告已生成,当前任务不能再追加证据;新增证据请放到下一周期或新版本。" : e.task?.status === "已完成" ? "任务已完成校级验收,不能继续追加当前版本证据。" : "需先创建处于执行或整改状态的关联任务和项目。",
],
evaluation: [
e.evidences.length > 0 &&
@@ -1102,7 +1102,7 @@ function closedLoopActionState(action) {
feedback: [e.report?.status === "已发布" && !e.review, e.review ? "本周期已完成成效复核,不能继续追加使用反馈。" : "需先正式发布报告。"],
review: [
e.usageFeedback.at(-1)?.usable === "可用" && !e.review,
e.review ? "本周期成效复核已完成。" : e.usageFeedback.length ? "最新业务使用反馈仍为需补充,确认可用后才能复核。" : "需先形成就业侧数据使用反馈。",
e.review ? "本周期成效复核已完成。" : e.usageFeedback.length ? "最新业务使用反馈仍为需补充,确认可用后才能复核。" : "需先由就业老师登记使用反馈。",
],
};
const [enabled, reason] = checks[action] || [false, "动作不可用。"];
@@ -1229,9 +1229,9 @@ function closedLoopNodeDefinitions() {
id: e.demand.id,
status: e.demand.status,
owner: "企业导师",
description: "企业提交真实岗位、技能、人数与授权信息,形成后续分析和共育项目的业务起点。",
description: "企业提交岗位、技能、人数与授权信息,学校据此开展分析并安排共育项目。",
input: "岗位、技能、计划人数、授权编号",
output: "可追踪的企业需求版本",
output: "带编号的企业需求版本",
complete: e.demand.status === "已提交",
risk: false,
relations: [e.demand.enterpriseId, e.demand.previousVersionId, e.recommendation.demandId],
@@ -1269,7 +1269,7 @@ function closedLoopNodeDefinitions() {
id: e.recommendation.id,
status: e.recommendation.status,
owner: "专业负责人",
description: "专业负责人基于快照和企业需求采纳、暂缓或驳回建议,采纳后自动创建任务。",
description: "专业负责人查看数据快照和企业需求后采纳、暂缓或驳回建议,采纳后自动创建任务。",
input: "分析结论、企业需求、课程差距",
output: "带理由的专业决策",
complete: e.recommendation.status === "已采纳",
@@ -1291,7 +1291,7 @@ function closedLoopNodeDefinitions() {
owner: e.task?.owner || "专业负责人",
description: "采纳专业建议后自动生成改进任务,保存负责人、期限、进度和验收历史。",
input: "已采纳建议与任务负责人",
output: "可执行、可验收的改进任务",
output: "有负责人、期限和验收要求的任务",
reached: e.recommendation.status === "已采纳",
complete: Boolean(e.task),
risk: ["需整改", "已退回"].includes(e.task?.status),
@@ -1400,7 +1400,7 @@ function closedLoopNodeDefinitions() {
status: e.report?.status || "未生成",
owner: "编制人 / 独立审批人",
description: "报告关联需求、快照、任务和证据,依次经过草稿、提交、独立审批和正式发布。",
input: "验收通过的任务与冻结证据",
input: "验收通过的任务与报告生成时登记的证据(不可追加)",
output: "可归档的正式报告版本",
complete: e.report?.status === "已发布",
risk: e.report?.status === "已退回",
@@ -1645,7 +1645,7 @@ function renderClosedLoopNodeDetail(node) {
</div>`
: `
<div class="loop-node-action readonly">
<span><strong>当前角色只读</strong><small>该节点由${safeText(node.owner)}负责,切换对应角色后可办理已解锁动作。</small></span>
<span><strong>当前角色只读</strong><small>该节点由${safeText(node.owner)}负责;切换到对应角色后,可办理满足前置条件的动作。</small></span>
</div>`;
document.getElementById("loopNodeDetail").innerHTML = `
<div class="loop-node-hero ${detailState}">
@@ -1691,7 +1691,7 @@ function renderClosedLoopAction(action, nodes) {
<button data-loop-action="${action}" data-loop-action-node="${node.key}" ${availability.enabled ? "" : "disabled"}>
<i>${String(node.index + 1).padStart(2, "0")}</i>
<span><small>${node.title}</small><strong>${closedLoopActionCatalog[action].queueLabel}</strong><em>${availability.reason}</em></span>
<b>${availability.enabled ? "办理" : "未解锁"}</b>
<b>${availability.enabled ? "办理" : "条件未满足"}</b>
</button>`;
}
@@ -2164,9 +2164,9 @@ const reports = [
{ label: "现代服务类", value: 69 },
],
actions: [
{ priority: "P0", title: "推动11个专业完成高优技能缺口响应", detail: "由教务处牵头,4月底前形成课程调整或实训项目方案。" },
{ priority: "P0", title: "推动11个专业处理高优技能缺口", detail: "由教务处牵头,4月底前提交课程调整或实训项目方案。" },
{ priority: "P1", title: "建设工业视觉与云原生两类校企共享实训", detail: "优先对接大华、数梦工场等已表达合作意向的企业。" },
{ priority: "P1", title: "建立企业需求季度确认机制", detail: "区分互联网招聘信号与合作企业正式确认需求,提升决策可信度。" },
{ priority: "P1", title: "每季度请企业确认一次需求", detail: "把互联网招聘信息与合作企业确认的需求分开,避免混用。" },
],
},
{
@@ -2195,7 +2195,7 @@ const reports = [
],
findings: [
{ title: "Java/Spring能力供需匹配良好", detail: "市场需求强度92%,课程覆盖86%,可继续保持项目化教学。", value: "差值6" },
{ title: "Docker/K8s形成明显技能缺口", detail: "市场需求81%,课程覆盖仅32%,缺口达到49个百分点。", value: "-49" },
{ title: "Docker/K8s技能缺口明显", detail: "市场需求81%,课程覆盖仅32%,相差49个百分点。", value: "-49" },
{ title: "AI辅助开发进入企业基础要求", detail: "69%的重点岗位提出相关要求,当前课程覆盖仅28%。", value: "-41" },
],
bars: [
@@ -2208,7 +2208,7 @@ const reports = [
actions: [
{ priority: "P0", title: "强化云原生与容器化实训模块", detail: "在综合实训中覆盖Docker、Kubernetes、CI/CD和可观测性。" },
{ priority: "P1", title: "将AI辅助开发纳入软件工程实践", detail: "增加代码生成、测试辅助、安全审查和人工复核规范。" },
{ priority: "P1", title: "联合企业建设真实交付项目", detail: "引入数梦工场、海康威视的工程任务和企业导师评价。" },
{ priority: "P1", title: "联合企业建设交付项目", detail: "引入数梦工场、海康威视的工程任务和企业导师评价。" },
],
},
{
@@ -2227,7 +2227,7 @@ const reports = [
author: "信息工程学院",
roles: ["校级管理者", "学院负责人"],
summary:
"学院6个专业平均匹配度80.4分,软件技术、物联网应用技术表现较好。当前需要跨专业统筹云平台、数据工程和AI应用三类共享能力建设。",
"学院6个专业平均匹配度80.4分,软件技术、物联网应用技术表现较好。云平台、数据工程和 AI 应用课程可由多个专业共用。",
metrics: [
{ label: "学院匹配度", value: "80.4", note: "较上期 +5.1" },
{ label: "覆盖专业", value: "6", note: "2个高匹配专业" },
@@ -2235,8 +2235,8 @@ const reports = [
{ label: "合作企业", value: "38", note: "本学期新增6家" },
],
findings: [
{ title: "共享技术底座课程重复建设", detail: "数据库、Linux和软件工程内容在多个专业重复,可建设学院共享模块。", value: "6专业" },
{ title: "云平台能力成为共同短板", detail: "云部署、容器和运维能力在5个专业中均出现覆盖不足。", value: "5专业" },
{ title: "基础技术课程重复开设", detail: "数据库、Linux 和软件工程内容在多个专业重复,可由学院统一开设共用模块。", value: "6专业" },
{ title: "5个专业都缺云平台课程内容", detail: "云部署、容器和运维内容在5个专业中均覆盖不足。", value: "5专业" },
{ title: "企业项目集中度偏高", detail: "前5家企业承担了61%的项目,需要扩展中型技术企业伙伴。", value: "61%" },
],
bars: [
@@ -2247,8 +2247,8 @@ const reports = [
{ label: "计算机网络", value: 75 },
],
actions: [
{ priority: "P0", title: "建立学院共享工程实践课程群", detail: "统一云平台、数据库、DevOps基础能力,按专业配置差异化项目。" },
{ priority: "P1", title: "扩展8家中型技术企业合作", detail: "降低项目来源集中度,为不同专业提供多样化真实任务。" },
{ priority: "P0", title: "开设学院共用工程实践课程", detail: "云平台、数据库和 DevOps 基础内容由学院共用,各专业再安排不同项目。" },
{ priority: "P1", title: "扩展8家中型技术企业合作", detail: "减少项目对少数企业的依赖,为不同专业提供更多企业任务。" },
{ priority: "P1", title: "建立跨专业学生项目团队", detail: "围绕智能物联场景组织软件、数据和网络方向联合实训。" },
],
},
@@ -2268,7 +2268,7 @@ const reports = [
author: "产教融合中心",
roles: ["校级管理者"],
summary:
"杭州区域人才需求持续向智能制造、云计算、跨境电商和数字内容方向集中。全校识别23项重点技能缺口,其中8项需要在本学期形成明确响应。",
"杭州区域人才需求持续向智能制造、云计算、跨境电商和数字内容方向集中。全校有23项重点技能缺口,其中8项需要在本学期安排课程或项目调整。",
metrics: [
{ label: "重点缺口", value: "23", note: "8项高优" },
{ label: "关联专业", value: "11", note: "覆盖5个学院" },
@@ -2330,7 +2330,7 @@ const reports = [
{ label: "现代服务类", value: 88 },
],
actions: [
{ priority: "P1", title: "将真实项目成果纳入就业推荐材料", detail: "强化学生技能证据,提升企业对岗位胜任力的判断效率。" },
{ priority: "P1", title: "将企业项目成果纳入就业推荐材料", detail: "用学生作品和企业评价说明其岗位能力。" },
{ priority: "P1", title: "建立分专业薪资预期指导", detail: "使用分位数而非平均数,为学生提供地域和岗位差异说明。" },
{ priority: "P2", title: "持续核验企业薪资数据完整性", detail: "对缺失和区间过宽的薪资记录降低统计权重。" },
],
@@ -2372,7 +2372,7 @@ const reports = [
],
actions: [
{ priority: "P0", title: "补齐就业薪资缺失记录", detail: "由就业处在本期正式材料发布前完成字段确认。" },
{ priority: "P1", title: "审核218个新增岗位名称", detail: "优先处理需求量前50的岗位,并沉淀别名规则。" },
{ priority: "P1", title: "审核218个新增岗位名称", detail: "先处理需求量前50的岗位,并把确认后的别名加入规则表。" },
{ priority: "P2", title: "增加数据包服务期自动提醒", detail: "基础数据包到期前30天通知厂商和学校管理员。" },
],
},
@@ -2450,7 +2450,7 @@ const reports = [
{ label: "AI内容生产", value: 75 },
],
actions: [
{ priority: "P0", title: "重构跨境电商平台运营课程", detail: "增加真实店铺、海外投放和合规履约任务。" },
{ priority: "P0", title: "重构跨境电商平台运营课程", detail: "增加企业店铺运营、海外投放和合规履约任务。" },
{ priority: "P1", title: "增加AI营销内容生产工作流", detail: "纳入AI文案、图片、视频辅助生产与人工审核。" },
],
},
@@ -2487,7 +2487,7 @@ const reports = [
{ label: "文化创意类", value: 68 },
],
actions: [
{ priority: "P0", title: "建立周期性分析机制", detail: "从年度人工报告转向季度数据快照和任务跟踪。" },
{ priority: "P0", title: "每季度更新一次分析", detail: "用季度数据快照和任务进展替代一年一次的人工报告。" },
{ priority: "P1", title: "完善岗位分类与技能词典", detail: "提高跨数据源岗位匹配和趋势比较的稳定性。" },
],
},
@@ -2505,7 +2505,7 @@ const professionReportCatalog = [
["新能源汽车技术", "智能制造学院", 83.1, "三电检测与智能诊断"],
["汽车检测与维修技术", "智能制造学院", 74.9, "新能源汽车售后与诊断"],
["跨境电子商务", "商贸旅游学院", 81.2, "海外投放与合规履约"],
["国际商务", "商贸旅游学院", 73.6, "数字贸易与供应链协同"],
["国际商务", "商贸旅游学院", 73.6, "数字贸易与供应链协作"],
["市场营销", "商贸旅游学院", 72.8, "数据营销与用户增长"],
["现代物流管理", "商贸旅游学院", 78.1, "智慧物流与仓配优化"],
["酒店管理与数字化运营", "商贸旅游学院", 71.5, "收益管理与数字化服务"],
@@ -2545,7 +2545,7 @@ professionReportCatalog.forEach(([name, college, score, focus], index) => {
updated: `2026-03-${String(18 - (index % 8)).padStart(2, "0")}`,
author: college,
roles: ["校级管理者"],
summary: `${name}专业供需匹配度${score}分。当前培养基础总体稳定,${focus}是下一阶段专业建设和校企协同的重点方向。`,
summary: `${name}专业供需匹配度${score}分。当前课程基础总体稳定,下一阶段应优先补充${focus}相关课程和企业项目。`,
metrics: [
{ label: "专业匹配度", value: String(score), note: score >= 80 ? "高匹配" : score >= 74 ? "保持关注" : "需要改进" },
{ label: "对口岗位", value: demand.toLocaleString("zh-CN"), note: "近90天有效样本" },
@@ -2554,8 +2554,8 @@ professionReportCatalog.forEach(([name, college, score, focus], index) => {
],
findings: [
{ title: `${focus}需求持续增长`, detail: `重点企业正在将相关能力纳入岗位要求,近90天需求信号保持上升。`, value: `+${16 + (index % 23)}%` },
{ title: "课程实践与企业任务仍有差距", detail: "现有课程具备基础知识覆盖,但真实场景、工具链和交付评价需要加强。", value: `-${gap}` },
{ title: "校企合作具备扩展条件", detail: `已识别${companyCount}家高匹配企业,可围绕项目实训和企业导师形成合作。`, value: `${companyCount}家` },
{ title: "课程实践与企业任务仍有差距", detail: "现有课程已覆盖基础知识,但企业场景、工具链和交付评价练习仍然不足。", value: `-${gap}` },
{ title: "可以联系更多合作企业", detail: `已有${companyCount}家企业与该专业较匹配,可讨论项目实训和企业导师安排。`, value: `${companyCount}家` },
],
bars: [
{ label: "专业基础能力", value: Math.min(95, coverage + 8) },
@@ -2565,9 +2565,9 @@ professionReportCatalog.forEach(([name, college, score, focus], index) => {
{ label: "企业项目交付", value: Math.max(50, coverage - 12) },
],
actions: [
{ priority: "P0", title: `强化${focus}教学模块`, detail: "引入企业真实任务,明确工具链、过程产物和验收标准。" },
{ priority: "P0", title: `强化${focus}教学模块`, detail: "引入企业任务,明确使用的工具、过程产物和验收标准。" },
{ priority: "P1", title: "邀请企业导师参与课程评审", detail: `优先对接已识别的${companyCount}家潜力企业,核验岗位技能与课程映射。` },
{ priority: "P1", title: "建立学生能力证据档案", detail: "将项目作品、企业评价和技能达成情况纳入就业推荐材料。" },
{ priority: "P1", title: "整理学生项目材料", detail: "把项目作品、企业评价和技能考核结果放入就业推荐材料。" },
],
});
});
@@ -2593,7 +2593,7 @@ professionReportCatalog.forEach(([name, college, score, focus], index) => {
updated: `2026-03-${18 - index}`,
author: name,
roles: ["校级管理者"],
summary: `${name}整体供需表现保持稳定,${focus}是跨专业共享能力建设的主要方向。`,
summary: `${name}整体供需表现稳定。多个专业都需要${focus}相关课程,可由学院统一开设部分内容。`,
metrics: [
{ label: "学院匹配度", value: String(76.8 + index * 1.3), note: "较上期持续提升" },
{ label: "覆盖专业", value: scope.replace("个专业", ""), note: "全部纳入分析" },
@@ -2601,9 +2601,9 @@ professionReportCatalog.forEach(([name, college, score, focus], index) => {
{ label: "合作企业", value: String(26 + index * 7), note: "持续扩展" },
],
findings: [
{ title: `${focus}形成共同需求`, detail: "多个专业出现相近技能缺口,适合建设学院共享课程或实训平台。", value: "高关联" },
{ title: `多个专业都需要${focus}`, detail: "多个专业的技能缺口相近,适合共用学院课程或实训环境。", value: "高关联" },
{ title: "企业项目分布仍需优化", detail: "建议降低头部企业集中度,引入更多中型和专精特新企业。", value: "待改善" },
{ title: "建议执行进入跟踪阶段", detail: "重点事项已明确负责人和周期,可纳入学院改进任务闭环。", value: "可执行" },
{ title: "建议可以开始执行", detail: "重点事项已有负责人和期限,可加入学院任务清单继续跟进。", value: "可执行" },
],
bars: [
{ label: "专业匹配", value: 80 + index },
@@ -2612,9 +2612,9 @@ professionReportCatalog.forEach(([name, college, score, focus], index) => {
{ label: "项目实践", value: 70 + index * 2 },
],
actions: [
{ priority: "P0", title: `建设${focus}共享模块`, detail: "明确学院统一底座和各专业差异化应用场景。" },
{ priority: "P1", title: "形成企业合作伙伴分层清单", detail: "区分课程共建、项目实训、实习就业和企业导师资源。" },
{ priority: "P1", title: "按月跟踪专业改进任务", detail: "对逾期、未响应和缺少证据的任务进行校院协同督办。" },
{ priority: "P0", title: `建设${focus}共享模块`, detail: "列出学院共用内容,以及各专业需要单独设置的练习。" },
{ priority: "P1", title: "按合作类型整理企业名单", detail: "分别列出可参与课程共建、项目实训、实习就业和企业导师工作的企业。" },
{ priority: "P1", title: "按月检查专业改进任务", detail: "校级和学院共同跟进逾期、未响应或缺少材料的任务。" },
],
});
});
@@ -2634,7 +2634,7 @@ const reportDataProfiles = {
},
college: {
label: "学院专业建设分析",
topics: ["专业结构对比", "共享能力分析", "培养成效验证", "企业协同机会"],
topics: ["专业结构对比", "共用课程分析", "培养结果检查", "企业合作机会"],
dependencies: [
{ sourceId: "regional-jobs", requirement: "required", purpose: "学院相关岗位与技能趋势" },
{ sourceId: "salary-company", requirement: "optional", purpose: "专业群薪资和企业结构参考" },
@@ -2646,14 +2646,14 @@ const reportDataProfiles = {
},
profession: {
label: "专业人才需求分析",
topics: ["岗位技能需求", "课程能力映射", "学生达成验证", "企业需求复核"],
topics: ["岗位技能需求", "课程技能对应", "学生学习结果", "企业需求复核"],
dependencies: [
{ sourceId: "regional-jobs", requirement: "required", purpose: "对口岗位、技能频次与需求变化" },
{ sourceId: "salary-company", requirement: "optional", purpose: "区域同岗位薪资竞争力" },
{ sourceId: "internship", requirement: "optional", purpose: "学生实践岗位与企业评价" },
{ sourceId: "employment", requirement: "optional", purpose: "毕业去向和岗位匹配验证" },
{ sourceId: "curriculum", requirement: "required", purpose: "课程标准、学时与技能覆盖" },
{ sourceId: "enterprise-demand", requirement: "required", purpose: "真实企业需求与合作意向确认" },
{ sourceId: "enterprise-demand", requirement: "required", purpose: "企业确认的人才需求与合作意向" },
],
},
industry: {
@@ -2716,7 +2716,7 @@ const dataGapCatalog = [
levelLabel: "需补数",
title: "就业薪资与缺失原因未完整提供",
drawerTitle: "就业系统薪资字段缺失",
drawerLevel: "阻断发布",
drawerLevel: "当前不能发布",
amount: "86 条记录 · 当前字段完整率 91.2%",
affected: "86 条记录 · 电子商务专业 41 条、现代服务类专业 45 条",
fields: ["employment_salary", "salary_period", "missing_reason"],
@@ -2856,7 +2856,7 @@ function applyRole(role, options = {}) {
document.getElementById("dataPageTitle").textContent = isDataAdministrator ? "学校数据运维中心" : "数据资产与质量";
document.getElementById("dataPageDescription").textContent = isDataAdministrator
? "管理学校数据源、初次导入、增量更新、字段契约、质量问题、版本与审计。"
: "区分厂商基础数据包、学校自有数据与企业授权数据,所有分析结论均可追溯。";
: "区分厂商基础数据包、学校自有数据与企业授权数据,每项分析结论都注明数据来源。";
document.getElementById("syncAllButtonText").textContent = isDataAdministrator ? "新建更新任务" : "同步全部数据";
document.getElementById("schoolNav").hidden = isPlatformRole;
@@ -2888,8 +2888,8 @@ function applyRole(role, options = {}) {
};
if (role === "企业导师") {
collaborationHeading.textContent = "企业协同工作台";
collaborationDescription.textContent = "提交真实岗位与技能需求,参与课程共建并评价学生项目成果。";
collaborationHeading.textContent = "企业合作工作台";
collaborationDescription.textContent = "提交岗位与技能需求,参与课程共建并评价学生项目成果。";
demandButton.innerHTML = `${svgIcon("file")}提交企业需求`;
projectButton.innerHTML = `${svgIcon("course")}发起共建项目`;
renderCollaborationStats([
@@ -2899,24 +2899,24 @@ function applyRole(role, options = {}) {
{ label: "参与学生", value: "86", unit: "人", note: "企业评价 4.7 / 5" },
]);
} else if (role === "学院负责人" || role === "专业负责人") {
collaborationHeading.textContent = "学院校企协同";
collaborationHeading.textContent = "学院校企合作";
collaborationDescription.textContent = "围绕本院专业对接企业需求,推进课程共建、实训与企业导师协作。";
demandButton.innerHTML = `${svgIcon("file")}邀请企业调研`;
projectButton.innerHTML = `${svgIcon("course")}新建协同项目`;
projectButton.innerHTML = `${svgIcon("course")}新建合作项目`;
renderCollaborationStats([
{ label: "本院合作企业", value: "38", unit: "家", note: "本学期新增 6 家" },
{ label: "本院协同项目", value: "8", unit: "个", note: "3 个进行中" },
{ label: "本院合作项目", value: "8", unit: "个", note: "3 个进行中" },
{ label: "企业导师", value: "21", unit: "人", note: "覆盖 6 个专业" },
{ label: "学生参与", value: "386", unit: "人次", note: "满意度 94%" },
]);
} else {
collaborationHeading.textContent = "校企协同中心";
collaborationDescription.textContent = "把产业需求转化为可执行的课程、项目与人才共育计划。";
collaborationHeading.textContent = "校企合作";
collaborationDescription.textContent = "根据企业需求安排课程共建、合作项目和人才培养计划。";
demandButton.innerHTML = `${svgIcon("file")}发起需求调研`;
projectButton.innerHTML = `${svgIcon("course")}新建协同项目`;
projectButton.innerHTML = `${svgIcon("course")}新建合作项目`;
renderCollaborationStats([
{ label: "在库合作企业", value: "126", unit: "家", note: "本学期新增 18 家" },
{ label: "本学期协同项目", value: "24", unit: "个", note: "8 个进行中" },
{ label: "本学期合作项目", value: "24", unit: "个", note: "8 个进行中" },
{ label: "企业导师", value: "68", unit: "人", note: "覆盖 17 个专业" },
{ label: "学生参与", value: "1,284", unit: "人次", note: "满意度 92%" },
]);
@@ -3238,7 +3238,7 @@ function renderProfessionJobsView(data) {
</div>
</article>
</div>
${professionEvidenceNote("证据 PRO-JOB-301", `岗位流向基于区域招聘基础包去重岗位、学校近三届就业去向及合作企业确认记录。互联网岗位反映需求信号,不等于实际录用人数。`)}
${professionEvidenceNote("证据 PRO-JOB-301", `岗位流向使用区域招聘基础包中的去重岗位、学校近三届就业去向及合作企业确认记录计算。互联网岗位反映需求信号,不等于实际录用人数。`)}
`;
}
@@ -3280,7 +3280,7 @@ function renderProfessionSalaryView(data) {
<article class="panel profession-detail-panel">
<div class="panel-header"><div><span class="panel-kicker">影响因素</span><h2>技能证据与起薪</h2></div></div>
<div class="salary-factor-list">
<span><b>+14%</b><strong>企业真实项目经历</strong></span>
<span><b>+14%</b><strong>企业项目经历</strong></span>
<span><b>+9%</b><strong>高质量作品集</strong></span>
<span><b>+7%</b><strong>企业导师评价</strong></span>
</div>
@@ -3567,7 +3567,7 @@ function renderLineageTopicNode(topic, index) {
<div class="lineage-topic-node">
<span>${String(index + 1).padStart(2, "0")}</span>
<strong>${topic}</strong>
<small>统一口径计算 · 保留证据定位</small>
<small>按同一统计口径计算 · 可查看数据来源</small>
</div>
`;
}
@@ -3641,7 +3641,7 @@ function renderReportLineageCanvas(report) {
return `
<div class="lineage-stage-grid report-direction">
${renderLineageStage("数据资产", `${visibleDependencies.length} / ${profile.dependencies.length} 项`, "sources", sourceNodes)}
${lineageConnector("形成指标")}
${lineageConnector("计算指标")}
${renderLineageStage("指标 / 分析主题", `${profile.topics.length} 类`, "topics", topicNodes)}
${lineageConnector("生成报告")}
${renderLineageStage("目标报告", "1 份", "reports", renderLineageReportNode(report, readableIds))}
@@ -3667,10 +3667,10 @@ function renderSourceLineageCanvas(source) {
return `
<div class="lineage-stage-grid source-direction">
${renderLineageStage("选中数据", "1 项", "sources", renderLineageSourceNode(source, null, true))}
${lineageConnector("支撑分析")}
${renderLineageStage("可形成的分析", `${topics.length} 类`, "topics", topics.map(renderLineageTopicNode).join(""))}
${lineageConnector("支撑报告")}
${renderLineageStage("可形成的报告", `${visibleReports.length} 份`, "reports", reportNodes)}
${lineageConnector("用于分析")}
${renderLineageStage("可做的分析", `${topics.length} 类`, "topics", topics.map(renderLineageTopicNode).join(""))}
${lineageConnector("用于报告")}
${renderLineageStage("使用该数据的报告", `${visibleReports.length} 份`, "reports", reportNodes)}
</div>
`;
}
@@ -3698,7 +3698,7 @@ function renderLineageSummary(report, source) {
const gaps = gapsForSource(source.id);
summary.innerHTML = [
lineageSummaryCard("当前数据", source.categoryLabel, source.version),
lineageSummaryCard("支撑报告", `${sourceReports.length} 份`, `${reportsGroupedByType(sourceReports).size} 类报告`),
lineageSummaryCard("使用该数据的报告", `${sourceReports.length} 份`, `${reportsGroupedByType(sourceReports).size} 类报告`),
lineageSummaryCard("当前质量", source.quality, `${source.records} 条有效记录`),
lineageSummaryCard("数据缺口", `${gaps.length} 项`, gaps.length ? "已定位责任人与时限" : "当前无数据缺口", gaps.length ? "warning" : "ready"),
].join("");
@@ -3761,7 +3761,7 @@ function renderDataReportLineage() {
button.setAttribute("aria-pressed", String(selected));
});
document.getElementById("dataLineageSelectorLabel").textContent = mode === "report" ? "选择报告" : "选择数据";
selector.setAttribute("aria-label", mode === "report" ? "选择要追溯的报告" : "选择要反查的数据");
selector.setAttribute("aria-label", mode === "report" ? "选择报告查看所需数据" : "选择数据查看使用它的报告");
selector.innerHTML =
mode === "report"
? reports
@@ -3841,7 +3841,7 @@ function renderDataOpsOverview(source) {
<article class="data-ops-highlight">
<span>本次更新内容</span>
<strong>${source.changeSummary}</strong>
<p>更新采用暂存校验机制,未通过质量门槛的数据进入隔离区,不会覆盖当前已发布版本。</p>
<p>更新数据先放入暂存区检查;不满足最低质量要求的数据进入隔离区,不会覆盖当前已发布版本。</p>
</article>
<div class="data-ops-two-column">
<article class="data-ops-card">
@@ -3880,7 +3880,7 @@ function renderDataOpsRequirements(source) {
<div class="data-requirement-steps">
<span><b>01</b><strong>准备文件或连接</strong><small>支持标准模板导入,也可按更新频率配置 API、数据库视图或 SFTP。</small></span>
<span><b>02</b><strong>字段映射与样本预检</strong><small>确认主键、必填字段、代码字典和敏感字段处理规则。</small></span>
<span><b>03</b><strong>暂存与质量校验</strong><small>先写入暂存区,阻断性错误不覆盖生产版本。</small></span>
<span><b>03</b><strong>暂存与质量校验</strong><small>先写入暂存区,发现严重错误时不更新生产版本。</small></span>
<span><b>04</b><strong>审批发布与留痕</strong><small>数据管理员确认质量和授权后,生成不可变版本并进入分析。</small></span>
</div>
</article>
@@ -3893,7 +3893,7 @@ function renderDataOpsRequirements(source) {
<table class="data-ops-table">
<thead><tr><th>校验项</th><th>门槛</th><th>失败处理</th></tr></thead>
<tbody>
<tr><td>主键唯一性</td><td>100%</td><td>整批阻断,下载冲突明细</td></tr>
<tr><td>主键唯一性</td><td>100%</td><td>整批不发布,可下载冲突明细</td></tr>
<tr><td>必填完整性</td><td>≥ 95%</td><td>进入隔离区,修复后重试</td></tr>
<tr><td>代码与日期合法性</td><td>≥ 98%</td><td>错误记录不进入分析</td></tr>
<tr><td>综合质量</td><td>${source.threshold}</td><td>低于阈值不得发布</td></tr>
@@ -3925,7 +3925,7 @@ function renderDataOpsHistory(source) {
</div>
<article class="data-ops-card">
<h3>失败处理策略</h3>
<p>网络失败从检查点自动重试 3 次;数据错误进入隔离区;主键冲突、授权缺失和 Schema 不兼容将整批阻断。历史已发布版本不原地覆盖。</p>
<p>网络失败从检查点自动重试 3 次;数据错误进入隔离区;出现主键冲突、授权缺失或 Schema 不兼容时,整批数据不发布。历史已发布版本不直接覆盖。</p>
</article>
`;
}
@@ -3966,7 +3966,7 @@ function renderDataOpsUsage() {
<div><span>SHA校验<strong>${safeText(e.receipt.receivedSha256 || e.receipt.expectedSha256)}</strong></span><span>交付包记录数<strong>${e.receipt.receivedRecords.toLocaleString("zh-CN")} / ${e.receipt.expectedRecords.toLocaleString("zh-CN")}</strong></span><span>分析快照<strong>${e.snapshot.id} · ${e.snapshot.checkedRecords.toLocaleString("zh-CN")}条</strong></span></div>
</div>
<article class="data-ops-card">
<h3>业务支撑关系</h3>
<h3>业务使用情况</h3>
<div class="data-impact-grid">
<span>报告<strong>${e.report?.id || "待生成"}</strong></span>
<span>项目<strong>${e.project?.id || "待创建"}</strong></span>
@@ -4069,7 +4069,7 @@ function updateDataOpsDrawer() {
if (dataOpsState.context === "batch") {
document.getElementById("dataOpsKicker").textContent = "DATA UPDATE CENTER";
document.getElementById("dataOpsTitle").textContent = "数据更新任务中心";
document.getElementById("dataOpsDescription").textContent = "先确认业务截止日期、变更内容和质量门槛,再创建可追踪的更新任务。";
document.getElementById("dataOpsDescription").textContent = "先确认业务截止日期、变更内容和最低质量要求,再创建带编号的更新任务。";
content.innerHTML = `
<div class="batch-update-summary">${dataOpsStat("待更新", "2 个来源", "1个自动调度 · 1个人工导入")}${dataOpsStat("运行正常", "4 个来源", "最近24小时无失败")}${dataOpsStat("隔离记录", "86 条", "未进入生产版本")}</div>
<article class="data-ops-card">
@@ -4106,7 +4106,7 @@ function updateDataOpsDrawer() {
if (dataOpsState.context === "authorization") {
document.getElementById("dataOpsKicker").textContent = "DATA AUTHORIZATION";
document.getElementById("dataOpsTitle").textContent = "数据权属与授权中心";
document.getElementById("dataOpsDescription").textContent = "统一管理用途、可见范围、服务期限、撤权和审计要求。";
document.getElementById("dataOpsDescription").textContent = "设置数据用途、可见范围、服务期限、撤权方式和操作记录要求。";
content.innerHTML = renderAuthorizationOverview();
footer.innerHTML = `<button class="button secondary" data-data-ops-close>关闭</button><button class="button primary" data-data-ops-result="授权台账已导出并写入审计日志">导出授权台账</button>`;
return;
@@ -4195,7 +4195,7 @@ function openWorkspaceDetail(kind, value = "") {
description: `${task.profession} · 来源:${task.source}`,
content: `
<div class="workspace-metric-grid">${workspaceMetric("负责人", task.owner, "主责")}${workspaceMetric("截止日期", task.due, task.statusText)}${workspaceMetric("当前进度", `${task.progress}%`, "自动汇总")}</div>
<article class="workspace-detail-card"><h3>任务目标</h3><p>将分析建议转化为课程、项目或校企协同调整,并以正式方案、企业确认和学生达成证据作为验收依据。</p></article>
<article class="workspace-detail-card"><h3>任务目标</h3><p>根据分析建议调整课程、项目或企业合作安排,并用正式方案、企业确认和学生考核结果验收。</p></article>
<article class="workspace-detail-card"><h3>进展记录</h3><div class="workspace-log-list">${loopTask ? loopTask.progressLogs.map((item) => `<span><strong>${safeText(item.detail)}</strong><small>${safeText(item.operator)} · ${safeText(item.at)} · 进度 ${item.progress}%</small></span>`).join("") : `<span><strong>完成现状与差距复核</strong><small>李雯 · 2026-03-18 16:20</small></span><span><strong>企业导师已确认技能清单</strong><small>陈凯 · 2026-03-20 10:42</small></span><span><strong>课程调整方案进入教研室评审</strong><small>系统 · 今天 08:30</small></span>`}</div></article>
<article class="workspace-detail-card"><h3>验收要求</h3><div class="workspace-evidence-list"><span>课程或项目方案<strong>${loopTask && closedLoopState.entities.evidences.length ? "已提交" : "必需"}</strong></span><span>企业确认回执<strong>${closedLoopState.entities.evaluation ? closedLoopState.entities.evaluation.result : "必需"}</strong></span><span>校级验收<strong>${loopTask?.status || "待执行"}</strong></span></div>${loopTask ? `<button class="button primary loop-inline-action" data-loop-action="evidence">提交阶段进展与证据</button>` : ""}</article>`,
primary: loopTask ? "关闭详情" : "提交阶段进展",
@@ -4223,7 +4223,7 @@ function openWorkspaceDetail(kind, value = "") {
description: `${partner.industry} · 综合匹配度 ${partner.match}%`,
content: `
<article class="workspace-detail-card"><h3>推荐依据</h3><p>${partner.reason}</p><div class="workspace-tag-row">${partner.tags.map((tag) => `<span>${tag}</span>`).join("")}</div></article>
<article class="workspace-detail-card"><h3>对接安排</h3><div class="workspace-form-grid"><label><span>校内负责人</span><input value="产教融合中心 · 王健"></label><label><span>建议时间</span><input type="date" value="2026-04-15"></label><label class="full"><span>沟通议题</span><textarea rows="4">岗位技能确认、课程共建、真实项目进课堂、企业导师与学生实习安排。</textarea></label></div></article>`,
<article class="workspace-detail-card"><h3>对接安排</h3><div class="workspace-form-grid"><label><span>校内负责人</span><input value="产教融合中心 · 王健"></label><label><span>建议时间</span><input type="date" value="2026-04-15"></label><label class="full"><span>沟通议题</span><textarea rows="4">岗位技能确认、课程共建、企业项目进课堂、企业导师与学生实习安排。</textarea></label></div></article>`,
primary: "创建对接事项",
};
},
@@ -4238,14 +4238,14 @@ function openWorkspaceDetail(kind, value = "") {
kicker: "ORGANIZATION SCOPE",
title: "组织与数据范围",
description: "根据账号角色切换组织,数据权限同步变化。",
content: `<div class="organization-list"><button class="active"><span class="tenant-logo">杭</span><span><strong>杭州科技职业技术学院</strong><small>校级管理者 · 全校32个专业</small></span><em>当前</em></button><button><span class="tenant-logo blue">信</span><span><strong>信息工程学院</strong><small>学院负责人 · 6个专业</small></span><em>可进入</em></button><button><span class="tenant-logo amber">企</span><span><strong>海康威视协同空间</strong><small>企业导师 · 3个共建项目</small></span><em>可进入</em></button></div><article class="workspace-detail-card"><h3>权限说明</h3><p>组织切换只改变业务范围,不改变底层租户隔离。平台运营人员无法默认查看学校明文业务数据。</p></article>`,
content: `<div class="organization-list"><button class="active"><span class="tenant-logo">杭</span><span><strong>杭州科技职业技术学院</strong><small>校级管理者 · 全校32个专业</small></span><em>当前</em></button><button><span class="tenant-logo blue">信</span><span><strong>信息工程学院</strong><small>学院负责人 · 6个专业</small></span><em>可进入</em></button><button><span class="tenant-logo amber">企</span><span><strong>海康威视合作空间</strong><small>企业导师 · 3个共建项目</small></span><em>可进入</em></button></div><article class="workspace-detail-card"><h3>权限说明</h3><p>切换组织只改变可查看的业务范围,不改变租户隔离。平台运营人员默认不能查看学校明细数据。</p></article>`,
primary: "确认当前范围",
}),
templates: () => ({
kicker: "REPORT TEMPLATE LIBRARY",
title: "报告模板库",
description: "按不同决策场景统一报告结构、证据和审批流程。",
content: `<div class="template-library"><article><span>校级报告</span><strong>全校产教供需分析总报告</strong><small>学校事实、区域基准、专业结构、行动清单</small><em>42页 · 已启用</em></article><article><span>学院报告</span><strong>学院专业建设分析报告</strong><small>专业对比、共享能力、企业合作与任务跟踪</small><em>36页 · 已启用</em></article><article><span>专业报告</span><strong>专业人才需求分析报告</strong><small>岗位、技能、薪资、课程映射和企业推荐</small><em>24—30页 · 已启用</em></article><article><span>数据质量</span><strong>数据资产质量与口径报告</strong><small>来源、权属、版本、质量规则、限制和审计</small><em>19页 · 已启用</em></article></div>`,
description: "按报告用途设置章节、数据说明和审批步骤。",
content: `<div class="template-library"><article><span>校级报告</span><strong>全校产教供需分析总报告</strong><small>学校数据、区域基准、专业结构、任务清单</small><em>42页 · 已启用</em></article><article><span>学院报告</span><strong>学院专业建设分析报告</strong><small>专业对比、共用课程、企业合作与任务跟踪</small><em>36页 · 已启用</em></article><article><span>专业报告</span><strong>专业人才需求分析报告</strong><small>岗位、技能、薪资、课程对应和企业推荐</small><em>24—30页 · 已启用</em></article><article><span>数据质量</span><strong>数据资产质量与口径报告</strong><small>来源、权属、版本、质量规则、限制和审计</small><em>19页 · 已启用</em></article></div>`,
primary: "新建模板版本",
}),
compare: () => ({
@@ -4323,7 +4323,7 @@ function renderSources(filter = "all") {
<span>数据提供方<strong>${source.provider}</strong></span>
<span>权属与授权<strong>${source.rights}</strong></span>
<span>覆盖范围<strong>${source.coverage}</strong></span>
<span>更新机制<strong>${source.frequency}</strong></span>
<span>更新频率<strong>${source.frequency}</strong></span>
</div>
<div class="source-card-meta">
<span>有效记录<strong>${source.records}</strong></span>
@@ -4473,14 +4473,14 @@ function renderReportCenter() {
const roleReports = reportsForCurrentRole();
const role = document.getElementById("roleSelect")?.value || "校级管理者";
const descriptions = {
校级管理者: "统一管理校级、学院、专业、产业与数据质量报告,支持在线阅读和版本追溯。",
学院负责人: "查看本院、所属专业及相关数据质量报告,将分析结论转化为专业建设行动。",
校级管理者: "查看和管理校级、学院、专业、产业与数据质量报告,并保留各版本。",
学院负责人: "查看本院、所属专业及相关数据质量报告,并根据分析结论安排专业建设任务。",
专业负责人: "查看本专业报告、提交业务流程报告审核并追踪审批历史;校级批准与发布由校级管理者执行。",
就业老师: "查看校级与数据质量报告,登记就业侧使用反馈;不能审批校级业务报告。",
校级技术管理员: "查看数据质量、版本、口径和授权报告,确保进入分析的每个数据版本均可追溯。",
校级技术管理员: "查看数据质量、版本、口径和授权报告,并检查每个分析版本的数据来源和处理记录。",
};
document.getElementById("reportCenterDescription").textContent =
descriptions[role] || "统一管理分析报告,支持在线阅读和版本追溯。";
descriptions[role] || "查看和管理分析报告,并保留各版本。";
document.getElementById("reportTotalCount").textContent = roleReports.length;
document.getElementById("reportNewCount").textContent = roleReports.filter((item) => item.periodKey === "current").length;
document.getElementById("reportReviewCount").textContent = roleReports.filter((item) => item.status === "待审核").length;
@@ -4516,8 +4516,8 @@ function renderReportDocument(report, options = {}) {
<div class="report-cover-main">
<span>${report.typeLabel} · ${report.period}</span>
<h1>${report.title}</h1>
<p>${report.scope}。报告基于统一数据快照生成,结论均保留来源、样本量与统计口径。</p>
<mark class="report-standard-stamp">STANDARD REPORT · 数据、口径与结论全链路可追溯</mark>
<p>${report.scope}。报告使用同一数据快照生成,每项结论都注明来源、样本量和统计口径。</p>
<mark class="report-standard-stamp">STANDARD REPORT · 可查看数据来源、统计口径和结论依据</mark>
</div>
<div class="report-cover-foot">
<span>编制单位<strong>${report.author}</strong></span>
@@ -4546,16 +4546,16 @@ function renderReportDocument(report, options = {}) {
${window.ReportVisuals.renderExecutiveCharts(report, { interactive })}
<div class="report-interpretation">
<span>综合解读</span>
<p>本期${evidence.scoreLabel}为<strong>${evidence.score.toFixed(1)}分</strong>,高于区域可比均值<strong>${(evidence.score - evidence.benchmark.regional).toFixed(1)}分</strong>,高于同类院校均值<strong>${(evidence.score - evidence.benchmark.peer).toFixed(1)}分</strong>。该判断建立在${evidence.benchmark.sampleText}及统一数据快照之上;所有低样本指标已降权,不将互联网招聘数量直接解释为人才缺口人数。</p>
<p>本期${evidence.scoreLabel}为<strong>${evidence.score.toFixed(1)}分</strong>,高于区域可比均值<strong>${(evidence.score - evidence.benchmark.regional).toFixed(1)}分</strong>,高于同类院校均值<strong>${(evidence.score - evidence.benchmark.peer).toFixed(1)}分</strong>。计算使用${evidence.benchmark.sampleText}和同一数据快照;低样本指标已降低权重,互联网招聘数量不直接当作人才缺口人数。</p>
</div>
</section>
<section class="report-section" id="report-section-profile">
${reportSectionHeading(2, "INSTITUTION PROFILE", report.type === "profession" ? "专业与学校事实画像" : report.type === "college" ? "学院与学校事实画像" : "学校现状与事实画像")}
${reportSectionHeading(2, "INSTITUTION PROFILE", report.type === "profession" ? "专业与学校现状" : report.type === "college" ? "学院与学校现状" : "学校现状")}
${window.ReportVisuals.renderProfileEvidence(report, { interactive })}
<div class="report-interpretation">
<span>学校现状判断</span>
<p>学校现状以学籍、教务、人事、实习就业和校企合作台账为事实底座。当前全校专业、课程和企业合作规模能够支撑常规人才培养,但真实项目实训、企业导师评价与课程技能映射仍需进一步覆盖。每项现状指标均可展开查看来源系统、更新时间、责任部门和计算口径。</p>
<p>学校现状数据来自学籍、教务、人事、实习就业和校企合作台账。当前全校专业、课程和企业合作规模能够满足常规人才培养需要,但企业项目实训、企业导师评价和课程技能对应关系仍不完整。每项指标都可查看来源系统、更新时间、责任部门和计算口径。</p>
</div>
</section>
@@ -4580,7 +4580,7 @@ function renderReportDocument(report, options = {}) {
</div>
<div class="report-finding-validation">
<strong>结论交叉验证规则</strong>
<span>外部需求趋势</span><i>+</i><span>校内培养事实</span><i>+</i><span>企业确认信号</span><i>→</i><span>业务负责人复核</span>
<span>外部岗位变化</span><i>+</i><span>校内培养数据</span><i>+</i><span>企业确认需求</span><i>→</i><span>业务负责人复核</span>
</div>
</section>
@@ -4616,12 +4616,12 @@ function renderReportDocument(report, options = {}) {
</div>
<div class="report-interpretation">
<span>结构性结论</span>
<p>高需求但课程覆盖不足的能力位于象限图左上区域,应优先进入专业建设清单;高需求且覆盖充分的能力应转向学生达成和企业评价验证。趋势图显示培养响应仍滞后于外部需求,建议以真实项目和企业验收缩短响应周期,而不是简单增加课程名称。</p>
<p>高需求但课程覆盖不足的能力位于象限图左上区域,应优先加入专业建设清单;高需求且覆盖充分的能力需要检查学生掌握情况和企业评价。趋势图显示课程调整仍慢于岗位需求变化,建议增加企业项目和企业验收,不要只增加课程名称。</p>
</div>
</section>
<section class="report-section" id="report-section-evidence">
${reportSectionHeading(5, "DATA EVIDENCE", "证据链、样本与数据来源")}
${reportSectionHeading(5, "DATA EVIDENCE", "样本与数据来源")}
${window.ReportVisuals.renderEvidenceLedger(report)}
</section>
@@ -4630,8 +4630,8 @@ function renderReportDocument(report, options = {}) {
<div class="report-method-steps">
<article><span>01</span><strong>数据采集</strong><p>采集近90天岗位、校内主数据、课程标准、实习就业回执和合作企业确认记录,保留权属与授权标签。</p></article>
<article><span>02</span><strong>清洗归一</strong><p>按岗位ID、企业、发布时间去重;专业依据教育部专业代码归一;技能使用版本化词典映射。</p></article>
<article><span>03</span><strong>基准构建</strong><p>仅纳入同层次、同区域且有效样本达到100条的院校;同类院校按专业结构、规模和产业方向匹配。</p></article>
<article><span>04</span><strong>交叉验证</strong><p>外部需求、校内事实与企业确认至少两类证据方向一致才形成中高置信结论,AI文本须人工审核。</p></article>
<article><span>03</span><strong>选择对比样本</strong><p>只纳入同层次、同区域且有效样本达到100条的院校;同类院校按专业结构、规模和产业方向选择。</p></article>
<article><span>04</span><strong>相互核对</strong><p>外部岗位、校内数据和企业确认中至少两类结果一致,才列为较可靠结论;AI草拟文字必须人工审核。</p></article>
</div>
<div class="report-table-wrap">
<table class="report-table">
@@ -4647,7 +4647,7 @@ function renderReportDocument(report, options = {}) {
</table>
</div>
<div class="report-method-note">
本报告用于专业建设和校企协同决策参考。AI负责结构化归纳和文本草拟,不修改原始数据,不隐藏相反证据。业务负责人需结合政策、办学定位和资源约束审核,不直接替代招生、专业撤并或课程调整的正式决策程序。
本报告用于讨论专业建设和校企合作。AI只整理数据和草拟文字,不修改原始数据,也不删除相反结果。业务负责人仍需结合政策、办学定位和资源情况审核;报告不能替代招生、专业撤并或课程调整的正式决策程序。
</div>
</section>
@@ -4673,7 +4673,7 @@ function renderReportDocument(report, options = {}) {
<div class="report-action-cycle">
<span><strong>责任确认</strong><small>5个工作日内</small></span>
<i></i>
<span><strong>方案与资源</strong><small>形成可验收产物</small></span>
<span><strong>方案与资源</strong><small>提交可按验收要求检查的成果</small></span>
<i></i>
<span><strong>阶段复核</strong><small>按月更新证据</small></span>
<i></i>
@@ -4720,7 +4720,7 @@ function openReportReader(reportId) {
["profile", "学校现状"],
["findings", "关键发现"],
["analysis", "供需结构"],
["evidence", "证据链"],
["evidence", "数据来源"],
["method", "指标口径"],
["actions", "行动建议"],
];
@@ -4975,10 +4975,10 @@ function setupWorkspaceDetails() {
}
const productTourSteps = [
{ view: "dashboard", selector: ".quality-strip", title: "可信数据底座", description: "先确认数据来源、更新状态和质量门槛,所有分析只引用已验收版本。" },
{ view: "dashboard", selector: ".ai-panel", title: "发现关键变化", description: "AI将岗位、技能和专业变化归纳为可解释的决策简报,并保留证据定位。" },
{ view: "dashboard", selector: ".quality-strip", title: "先核对数据", description: "先看数据来自哪里、何时更新、是否通过检查;分析只使用已验收版本。" },
{ view: "dashboard", selector: ".ai-panel", title: "查看关键变化", description: "系统整理岗位、技能和专业变化,每条结论都可打开查看数据来源。" },
{ view: "profession", selector: ".profile-banner", title: "定位专业差距", description: "从岗位、技能、薪资和课程映射判断专业优势与结构性缺口。" },
{ view: "collaboration", selector: ".collab-stats", title: "连接企业协同", description: "把企业需求转化为课程共建、真实项目、企业导师和实习就业合作。" },
{ view: "collaboration", selector: ".collab-stats", title: "安排企业合作", description: "把企业需求写入课程共建、企业项目、企业导师和实习就业计划。" },
{ view: "actions", selector: ".action-overview", title: "跟踪改进成效", description: "每项建议都有负责人、截止日期、进展证据和下一周期效果复核。" },
{ view: "data", selector: ".source-summary-grid", title: "管理数据资产", description: "厂商、学校和企业三类数据分权维护,支持初次导入、增量更新、版本和审计。" },
{ view: "reports", selector: ".featured-report-grid", title: "完成正式交付", description: "在线报告、材料包和展示大屏使用同一数据快照,适用于决策、汇报与报送。" },
@@ -5268,7 +5268,7 @@ function setupReportCenterInteractions() {
const task = {
id: `TSK-REPORT-${Date.now()}`,
title,
source: `报告建议 · ${report?.version || "当前版本"} · 证据链已关联`,
source: `报告建议 · ${report?.version || "当前版本"} · 已关联数据来源`,
profession: report?.type === "profession" ? report.scope.split("·").pop().trim() : "全校专业",
owner: "待确认",
due: "2026-04-30",
@@ -5357,7 +5357,7 @@ const platformActionTemplates = {
<label><span>预计记录数</span><input value="92.6 万条" readonly></label>
<label><span>数据版本</span><input value="V2026.04"></label>
<label><span>Schema 版本</span><input value="JOB-PACK 3.3"></label>
<label class="full"><span>本次更新内容</span><textarea rows="3">新增约 8.4 万条岗位,更新 1.2 万条岗位状态;补充具身智能、AI应用工程和工业软件分类,失效记录保留版本追溯。</textarea></label>
<label class="full"><span>本次更新内容</span><textarea rows="3">新增约 8.4 万条岗位,更新 1.2 万条岗位状态;补充具身智能、AI应用工程和工业软件分类,并保留失效记录的旧版本。</textarea></label>
<fieldset>
<legend>导入要求与发布门槛</legend>
<div class="platform-contract-summary">
@@ -5458,7 +5458,7 @@ const platformActionTemplates = {
permission: {
kicker: "ROLE PERMISSION",
title: "角色与权限模板",
description: "统一配置学校、学院、企业和平台运营角色权限。",
description: "分别设置学校、学院、企业和平台运营人员的权限。",
confirm: "进入配置",
content: `<div class="platform-detail-card"><strong>7 套权限模板</strong><small>采用租户隔离、角色权限和数据范围三层控制,最近修改已通过审计复核。</small></div>`,
},
@@ -5472,7 +5472,7 @@ const platformActionTemplates = {
audit: {
kicker: "AUDIT LOG",
title: "平台审计日志",
description: "追溯数据导入、权限变更、租户操作和系统任务。",
description: "查看数据导入、权限变更、租户操作和系统任务记录。",
confirm: "查看完整日志",
content: `<div class="platform-detail-card"><strong>今日记录 286 条关键操作</strong><small>数据操作68条,权限操作12条,系统任务201条,安全事件5条,全部保留操作者和时间戳。</small></div>`,
},
@@ -5553,7 +5553,7 @@ function setupAnalysis() {
"读取本期分析快照…",
"归一并匹配产业岗位…",
"计算专业技能覆盖差距…",
"生成可解释决策洞察…",
"整理分析结果和建议…",
];
openModal(modal);
progress.style.width = "0";
@@ -5635,7 +5635,7 @@ function configureFormModal(type) {
task: {
kicker: "ACTION FORM",
title: "创建改进任务",
description: "将分析洞察转化为可追踪、可验证的行动。",
description: "把分析结果写成有负责人、截止日期和验收要求的任务。",
label: "任务名称",
value: "强化云原生与容器化实训内容",
scopeLabel: "关联专业",
@@ -5651,16 +5651,16 @@ function configureFormModal(type) {
},
project: {
kicker: "COLLABORATION PROJECT",
title: "新建协同项目",
title: "新建合作项目",
description: "连接专业团队与企业伙伴,共同推进人才培养项目。",
label: "项目名称",
value: "企业真实项目进课堂",
value: "企业项目进课堂",
scopeLabel: "牵头专业",
scopeOptions: ["软件技术", "机电一体化技术", "电子商务"],
priorityLabel: "项目类型",
priorityOptions: ["企业项目进课堂", "课程共建", "实训基地", "企业导师"],
goalLabel: "共建目标与验收方式",
goal: "围绕企业真实任务共同设计教学项目、过程评价和成果验收,保留企业任务书与导师评价证据。",
goal: "围绕企业任务共同设计教学项目、过程评价和成果验收,并保存企业任务书与导师评价。",
ownerLabel: "校内负责人",
owner: "王健 · 产教融合中心",
dueLabel: "计划启动时间",
@@ -5688,15 +5688,15 @@ function configureFormModal(type) {
configs.demand = {
kicker: "ENTERPRISE DEMAND",
title: "提交企业人才需求",
description: "提交真实岗位、技能与共育需求,供学校专业团队确认响应。",
description: "提交岗位、技能与共育需求,供学校专业团队确认是否承接。",
label: "需求名称",
value: "边缘计算软件测试人才共育需求",
scopeLabel: "关联专业",
scopeOptions: ["软件技术", "物联网应用技术", "计算机网络技术"],
priorityLabel: "合作方式",
priorityOptions: ["人才共育", "真实项目", "课程共建", "实习就业"],
priorityOptions: ["人才共育", "企业项目", "课程共建", "实习就业"],
goalLabel: "企业需求说明",
goal: "提交真实岗位、技能、计划人数和合作方式,并由企业联系人确认数据授权用途与有效期。",
goal: "填写岗位、技能、计划人数和合作方式,并由企业联系人确认数据用途与有效期。",
ownerLabel: "企业联系人",
owner: "陈凯 · 企业人才发展部",
dueLabel: "期望响应时间",
@@ -5707,15 +5707,15 @@ function configureFormModal(type) {
configs.project = {
kicker: "CO-CREATION PROJECT",
title: "发起校企共建项目",
description: "邀请学校共同设计企业真实项目、课程内容和评价标准。",
description: "邀请学校共同设计企业项目、课程内容和评价标准。",
label: "项目名称",
value: "智能物联边缘计算综合实训",
scopeLabel: "面向专业",
scopeOptions: ["物联网应用技术", "软件技术", "计算机网络技术"],
priorityLabel: "项目类型",
priorityOptions: ["企业真实项目", "课程共建", "企业导师", "实训基地"],
priorityOptions: ["企业项目", "课程共建", "企业导师", "实训基地"],
goalLabel: "企业任务与验收要求",
goal: "基于边缘计算测试场景设计实训任务,由企业导师参与中期评审,并依据测试报告、代码质量和协作过程验收。",
goal: "按边缘计算测试场景设计实训任务,由企业导师参加中期评审,并检查测试报告、代码质量和协作过程。",
ownerLabel: "企业负责人",
owner: "陈凯 · 企业人才发展部",
dueLabel: "建议启动时间",
@@ -5816,7 +5816,7 @@ function setupForms() {
closeModal(document.getElementById("formModal"));
const messages = {
task: "改进任务已创建,并通知专业负责人",
project: "协同项目草案已创建,可继续邀请企业伙伴",
project: "合作项目草案已创建,可继续邀请企业伙伴",
demand: "企业需求调研已创建,共有126家在库企业可发送",
};
showToast(messages[type] || "内容已保存");
@@ -6007,7 +6007,7 @@ function init() {
addClosedLoopAudit(
"LEGACY_NEXT_CYCLE_MIGRATED",
closedLoopState.entities.demand.id,
`旧版复核 ${legacyReview.id || "RVW-旧记录"} 已转换为真实的新周期实体。`,
`旧版复核 ${legacyReview.id || "RVW-旧记录"} 已转换为可继续办理的新周期记录。`,
"流程状态迁移器",
"系统",
);
+41 -41
View File
@@ -5,9 +5,9 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta
name="description"
content="产教融智,面向职业院校的供需分析、校企协同、数据治理与改进闭环平台"
content="产教融智,面向职业院校的供需分析、校企合作、数据检查与改进任务平台"
/>
<title>产教融智 · 供需分析与协同平台</title>
<title>产教融智 · 供需分析与校企合作</title>
<link rel="icon" href="./favicon.svg" type="image/svg+xml" />
<link rel="stylesheet" href="./styles.css" />
<link rel="stylesheet" href="./enterprise.css" />
@@ -58,14 +58,14 @@
<svg viewBox="0 0 24 24" aria-hidden="true">
<path d="M3 11h18M5 7l7-4 7 4M5 11v7m4-7v7m6-7v7m4-7v7M3 21h18" />
</svg>
<span>专业洞察</span>
<span>专业分析</span>
<span class="nav-count">32</span>
</button>
<button class="nav-item" data-view="collaboration" data-menu-key="collaboration">
<svg viewBox="0 0 24 24" aria-hidden="true">
<path d="M8 12h8m-4-4v8M4 7h3l2-3h6l2 3h3v13H4V7Z" />
</svg>
<span>校企协同</span>
<span>校企合作</span>
</button>
<button class="nav-item" data-view="actions" data-menu-key="actions">
<svg viewBox="0 0 24 24" aria-hidden="true">
@@ -224,7 +224,7 @@
<div>
<div class="eyebrow"><span></span> CAMPUS WORKFLOW</div>
<h1>企业需求到成效复核流程</h1>
<p>点击流程节点查看实体、责任人与输入输出;当前角色可在已解锁节点直接推进业务。</p>
<p>点击节点查看责任人、输入、输出和关联记录;当前角色可办理已满足前置条件的事项。</p>
</div>
<button class="button secondary" id="resetClosedLoop">
<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M20 11a8 8 0 1 0-2.34 5.66M20 4v7h-7" /></svg>
@@ -289,7 +289,7 @@
<div>
<div class="eyebrow"><span></span> SCHOOL OVERVIEW</div>
<h1>产教供需决策总览</h1>
<p>把产业需求信号转化为专业建设任务,并用报告与改进证据形成决策闭环。</p>
<p>根据产业岗位变化建立专业建设任务,并通过报告、过程证据和后续复核检查结果。</p>
</div>
<div class="heading-actions">
<button class="button secondary" data-report-generate="package">
@@ -361,7 +361,7 @@
</article>
<article class="metric-card">
<div class="metric-top">
<span class="metric-label">协同改进完成率</span>
<span class="metric-label">改进任务完成率</span>
<span class="metric-tag blue">本学期</span>
</div>
<div class="metric-value"><strong id="metricActions">68</strong><small>%</small></div>
@@ -455,7 +455,7 @@
</div>
<div class="ai-source">
<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M12 22a10 10 0 1 0 0-20 10 10 0 0 0 0 20ZM12 8v5m0 3h.01" /></svg>
结论综合基础数据包、校级数据与企业确认数据,所有引用均可追溯
结论使用基础数据包、校级数据与企业确认数据,每条引用都注明来源
</div>
</article>
</div>
@@ -517,11 +517,11 @@
</div>
</section>
<!-- 专业洞察 -->
<section class="view" id="view-profession" data-title="专业洞察">
<!-- 专业分析 -->
<section class="view" id="view-profession" data-title="专业分析">
<div class="page-heading profession-heading">
<div>
<div class="eyebrow"><span></span> PROGRAM INSIGHT</div>
<div class="eyebrow"><span></span> PROGRAM ANALYSIS</div>
<div class="heading-inline">
<h1 id="professionTitle">软件技术</h1>
<label class="profession-select">
@@ -641,13 +641,13 @@
<div class="profession-tab-view" id="professionDetailView" hidden></div>
</section>
<!-- 校企协同 -->
<section class="view" id="view-collaboration" data-title="校企协同">
<!-- 校企合作 -->
<section class="view" id="view-collaboration" data-title="校企合作">
<div class="page-heading heading-with-actions">
<div>
<div class="eyebrow"><span></span> COLLABORATION HUB</div>
<h1 id="collaborationHeading">校企协同中心</h1>
<p id="collaborationDescription">把产业需求转化为可执行的课程、项目与人才共育计划。</p>
<h1 id="collaborationHeading">校企合作</h1>
<p id="collaborationDescription">根据企业需求安排课程共建、合作项目和人才培养计划。</p>
</div>
<div class="heading-actions">
<button class="button secondary" id="enterpriseDemandButton">
@@ -656,14 +656,14 @@
</button>
<button class="button primary" id="newProjectButton">
<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M12 5v14M5 12h14" /></svg>
新建协同项目
新建合作项目
</button>
</div>
</div>
<div class="collab-stats">
<div><span>在库合作企业</span><strong>126</strong><small>家</small><em>↑ 18</em></div>
<div><span>本学期协同项目</span><strong>24</strong><small>个</small><em>8 个进行中</em></div>
<div><span>本学期合作项目</span><strong>24</strong><small>个</small><em>8 个进行中</em></div>
<div><span>企业导师</span><strong>68</strong><small>人</small><em>覆盖 17 个专业</em></div>
<div><span>学生参与</span><strong>1,284</strong><small>人次</small><em>满意度 92%</em></div>
</div>
@@ -672,7 +672,7 @@
<article class="panel pipeline-panel">
<div class="panel-header">
<div>
<span class="panel-kicker">协同进度</span>
<span class="panel-kicker">项目进度</span>
<h2>本学期重点项目</h2>
</div>
<div class="segmented">
@@ -713,8 +713,8 @@
<div class="page-heading heading-with-actions">
<div>
<div class="eyebrow"><span></span> ACTION TRACKER</div>
<h1>改进任务闭环</h1>
<p>从数据洞察到责任落实,持续追踪专业建设行动与实际成效。</p>
<h1>改进任务进展</h1>
<p>查看每项专业建设任务的负责人、进度和实际效果。</p>
</div>
<button class="button primary" id="newTaskButton">
<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M12 5v14M5 12h14" /></svg>
@@ -779,7 +779,7 @@
<div>
<div class="eyebrow"><span></span> DATA FOUNDATION</div>
<h1 id="dataPageTitle">数据资产与质量</h1>
<p id="dataPageDescription">区分厂商基础数据包、学校自有数据与企业授权数据,所有分析结论均可追溯。</p>
<p id="dataPageDescription">区分厂商基础数据包、学校自有数据与企业授权数据,每项分析结论都注明数据来源。</p>
</div>
<button class="button primary" id="syncAllButton">
<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M20 11a8 8 0 1 0-2.34 5.66M20 4v7h-7" /></svg>
@@ -824,7 +824,7 @@
<strong>互联网基础数据包</strong>
<em class="commercial-pill paid">付费订阅</em>
</span>
<small>由平台厂商合规归集、治理并按服务周期导入</small>
<small>由平台厂商按授权收集、检查,并按服务周期导入</small>
<span class="source-summary-metrics">
<span><strong>2</strong> 个数据源</span>
<span><strong>77,520</strong> 条记录</span>
@@ -895,7 +895,7 @@
<div>
<span class="panel-kicker">DATA → ANALYSIS → REPORT</span>
<h2>数据与报告双向依赖图谱</h2>
<p>从报告反查必需数据,也可从数据查看能形成的报告;缺口直接定位业务索取人和技术接口人。</p>
<p>选择报告可查看所需数据;选择数据源可查看使用它的报告。缺口会列出业务索取人和技术接口人。</p>
</div>
<span class="lineage-snapshot-badge"><i></i>分析快照 V2026.03</span>
</div>
@@ -907,7 +907,7 @@
</div>
<label class="lineage-selector">
<span id="dataLineageSelectorLabel">选择报告</span>
<select id="dataLineageSelector" aria-label="选择要追溯的报告"></select>
<select id="dataLineageSelector" aria-label="选择报告查看所需数据"></select>
</label>
<label class="lineage-gap-toggle">
<input type="checkbox" id="dataLineageGapToggle">
@@ -965,7 +965,7 @@
<article class="panel lineage-panel">
<div class="panel-header">
<div>
<span class="panel-kicker">处理链路</span>
<span class="panel-kicker">处理步骤</span>
<h2>本期数据加工血缘</h2>
</div>
<span class="version-badge">分析版本 V2026.03</span>
@@ -1009,7 +1009,7 @@
<div>
<div class="eyebrow"><span></span> REPORT CENTER</div>
<h1>分析报告中心</h1>
<p id="reportCenterDescription">统一管理校级、学院、专业、产业与数据质量报告,支持在线阅读和版本追溯。</p>
<p id="reportCenterDescription">查看和管理校级、学院、专业、产业与数据质量报告,并保留各版本。</p>
</div>
<div class="heading-actions">
<button class="button secondary" id="reportTemplateButton">
@@ -1306,17 +1306,17 @@
<div class="product-tour-hero">
<span>PRODUCT WALKTHROUGH</span>
<h2 id="productTourTitle">5分钟看懂产教融智</h2>
<p>不是再做一套数据看板,而是把“产业信号、专业诊断、校企协同、改进任务、正式报告”串成可追踪的工作闭环。</p>
<p>这里不只是数据看板。岗位变化、专业分析、企业合作、改进任务和正式报告都在同一套流程中办理。</p>
</div>
<div class="tour-value-grid">
<article><i>01</i><strong>看得清</strong><span>多源数据统一口径,定位专业、岗位与技能差距。</span></article>
<article><i>02</i><strong>落得下</strong><span>分析建议直接转为责任明确、可验收的改进任务。</span></article>
<article><i>03</i><strong>讲得明</strong><span>学校事实、区域基准、样本和来源形成完整证据链。</span></article>
<article><i>01</i><strong>看得清</strong><span>先对齐各来源的字段和统计口径,再查看专业、岗位与技能差距。</span></article>
<article><i>02</i><strong>能执行</strong><span>分析建议转成有负责人和验收要求的改进任务。</span></article>
<article><i>03</i><strong>讲得明</strong><span>每项结论都列出学校数据、区域基准、样本量和来源。</span></article>
</div>
<div class="tour-route">
<span><b>1</b>数据可信</span><i></i>
<span><b>1</b>先核对数据</span><i></i>
<span><b>2</b>发现差距</span><i></i>
<span><b>3</b>协同改进</span><i></i>
<span><b>3</b>任务跟进</span><i></i>
<span><b>4</b>报告交付</span>
</div>
<div class="product-tour-actions">
@@ -1335,7 +1335,7 @@
<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M6 6l12 12M18 6 6 18" /></svg>
</button>
</div>
<strong id="tourStepTitle">可信数据底座</strong>
<strong id="tourStepTitle">先核对数据</strong>
<p id="tourStepDescription">区分厂商基础数据包、学校自有数据和企业授权数据,让每个结论都能回溯。</p>
<div class="tour-coach-actions">
<button id="tourPrevious">上一步</button>
@@ -1392,14 +1392,14 @@
<article class="showcase-panel showcase-focus">
<div class="showcase-panel-head"><span>本期决策重点</span><strong>ACTION FOCUS</strong></div>
<div class="showcase-focus-list">
<span><b>P0</b><strong>11个专业响应高优技能缺口</strong><small>4月底前形成课程或实训调整方案</small></span>
<span><b>P0</b><strong>11个专业响应高优技能缺口</strong><small>4月底前提交课程或实训调整方案</small></span>
<span><b>P1</b><strong>建设工业视觉与云原生共享实训</strong><small>已识别 7 家高匹配合作企业</small></span>
<span><b>P1</b><strong>建立企业需求季度确认机制</strong><small>互联网信号与企业确认分开验证</small></span>
<span><b>P1</b><strong>每季度请企业确认一次需求</strong><small>互联网招聘信息与企业确认分开检查</small></span>
</div>
</article>
</section>
<footer class="showcase-footer">
<span>数据快照 SNP-2026-03-22-0830 · 质量评分 92.6 · 全链路可追溯</span>
<span>数据快照 SNP-2026-03-22-0830 · 质量评分 92.6 · 可查看来源与处理记录</span>
<strong>从产业信号到专业改进,让每项决策都有证据</strong>
</footer>
</main>
@@ -1413,7 +1413,7 @@
</button>
<div class="modal-kicker" id="formModalKicker">ACTION FORM</div>
<h2 id="formModalTitle">创建改进任务</h2>
<p id="formModalDescription">将分析洞察转化为可追踪的行动。</p>
<p id="formModalDescription">把分析结果写成有负责人和截止日期的任务。</p>
<form id="actionForm">
<label>
<span id="formNameLabel">任务名称</span>
@@ -1537,14 +1537,14 @@
</div>
</div>
<!-- 闭环动作表单 -->
<!-- 业务流程表单 -->
<div class="modal-backdrop" id="closedLoopModal" aria-hidden="true">
<div class="modal loop-modal" role="dialog" aria-modal="true" aria-labelledby="closedLoopModalTitle">
<button class="modal-close" data-close-modal aria-label="关闭">
<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M6 6l12 12M18 6 6 18" /></svg>
</button>
<div class="modal-kicker" id="closedLoopModalKicker">CLOSED LOOP ACTION</div>
<h2 id="closedLoopModalTitle">闭环动作</h2>
<div class="modal-kicker" id="closedLoopModalKicker">WORKFLOW ACTION</div>
<h2 id="closedLoopModalTitle">办理流程节点</h2>
<p id="closedLoopModalDescription">提交后将写入本地样板状态和审计事件。</p>
<form id="closedLoopForm">
<div class="loop-modal-fields" id="closedLoopFields"></div>
@@ -1589,7 +1589,7 @@
<p id="analysisStatus">读取本期分析快照…</p>
<div class="analysis-progress"><i id="analysisProgress"></i></div>
<div class="analysis-steps">
<span class="active">数据校验</span><span>岗位匹配</span><span>技能分析</span><span>生成洞察</span>
<span class="active">数据校验</span><span>岗位匹配</span><span>技能分析</span><span>生成建议</span>
</div>
</div>
</div>
Binary file not shown.

Before

Width:  |  Height:  |  Size: 290 KiB

After

Width:  |  Height:  |  Size: 290 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 330 KiB

After

Width:  |  Height:  |  Size: 329 KiB

+19 -19
View File
@@ -216,7 +216,7 @@
},
{
code: `${prefix}-PRJ-006`,
label: "真实项目实训",
label: "企业项目实训",
value: String(isCollege ? 18 + (seed % 8) : 6 + (seed % 6)),
unit: "项",
note: "均有企业任务书或验收记录",
@@ -359,9 +359,9 @@
source: "126家合作企业需求确认",
sample: "8,350 条",
updated: "2026-03-21",
owner: "合作企业(场景授权)",
owner: "合作企业(按协议用途)",
confidence: "高",
limitation: "仅用于约定的专业建设和协同分析",
limitation: "仅用于协议约定的专业建设分析",
},
],
evidenceCodes: {
@@ -526,10 +526,10 @@
)
.join("")}
<circle cx="438" cy="18" r="5" fill="${palette.green}"/><text x="449" y="22" font-size="12" fill="${palette.muted}">产业需求</text>
<circle cx="530" cy="18" r="5" fill="${palette.amber}"/><text x="541" y="22" font-size="12" fill="${palette.muted}">培养响应</text>
<circle cx="530" cy="18" r="5" fill="${palette.amber}"/><text x="541" y="22" font-size="12" fill="${palette.muted}">课程调整</text>
`,
285,
"产业需求与学校培养响应趋势",
"产业需求与学校课程调整趋势",
);
}
@@ -685,7 +685,7 @@
.join("")}
`,
300,
"供需能力矩阵立体图",
"岗位需求与课程覆盖对照图",
);
}
@@ -720,7 +720,7 @@
"overall",
"1-1",
`${evidence.scoreLabel}与区域排名`,
`本期得分基于快照 ${evidence.snapshot.id} 的 ${evidence.snapshot.records} 条有效记录计算;区域排名采用 ${evidence.benchmark.sampleText}。`,
`本期得分使用快照 ${evidence.snapshot.id} 中的 ${evidence.snapshot.records} 条有效记录计算;区域排名采用 ${evidence.benchmark.sampleText}。`,
gaugeSvg(evidence),
options,
)}
@@ -742,9 +742,9 @@
return `
<div class="report-profile-banner">
<div>
<span class="report-profile-kicker">INSTITUTION FACTS · 学校事实底座</span>
<span class="report-profile-kicker">INSTITUTION FACTS · 学校现状数据</span>
<h3>${evidence.profile.name}</h3>
<p>学校现状指标只使用校方自有业务数据;产业需求使用厂商订阅数据,企业确认使用合作授权数据。三类证据分开标识,不以招聘信号替代校内事实。</p>
<p>学校现状指标只使用校方业务数据;产业需求使用厂商订阅数据,企业确认使用合作授权数据。三类数据分开标识,不用互联网招聘信息替代学校业务数据。</p>
</div>
<div class="report-profile-attributes">
${evidence.profile.attributes.map(([label, value]) => `<span>${label}<strong>${value}</strong></span>`).join("")}
@@ -779,7 +779,7 @@
"composition",
"2-1",
"学校合作企业产业结构",
"企业须同时具备有效协议和近12个月业务记录;126家合作企业均可追溯至协议、需求、课程、项目、实习或就业证据。",
"企业须同时具备有效协议和近12个月业务记录;126家合作企业都能找到对应的协议、需求、课程、项目、实习或就业记录。",
donutSvg(evidence),
options,
)}
@@ -804,8 +804,8 @@
report,
"trend",
"4-1",
"产业需求与培养响应趋势",
"需求序列按月度新增岗位、企业确认和薪资变化综合计算;培养响应按课程覆盖、实训项目和学生达成证据计算,二者均以2025年二季度为可比基期。",
"产业需求与课程调整趋势",
"需求序列按每月新增岗位、企业确认和薪资变化计算;课程调整序列按课程覆盖、实训项目和学生考核结果计算,二者均以2025年二季度为对比起点。",
trendSvg(evidence),
options,
)}
@@ -814,7 +814,7 @@
"matrix",
"4-2",
"技能供需证据热力矩阵",
"每个单元格均可回溯到岗位样本、课程标准、学生项目达成及企业确认四类证据;低于60分视为需要业务复核。",
"每个单元格都列出对应的岗位样本、课程标准、学生项目结果和企业确认记录;低于60分时需要业务负责人复核。",
heatmapSvg(evidence),
options,
)}
@@ -831,7 +831,7 @@
report,
"threeD",
"4-4",
"供需能力立体证据矩阵",
"岗位需求与课程覆盖数据表",
"立体柱高同时呈现岗位需求、课程覆盖、学生达成和企业确认四个观察面。在线版支持拖拽旋转,下载版保留固定等距视图。",
isometricSvg(evidence),
{ ...options, wide: false },
@@ -844,15 +844,15 @@
const evidence = buildEvidence(report);
return `
<div class="report-evidence-summary">
<span><small>统一快照</small><strong>${evidence.snapshot.id}</strong></span>
<span><small>本报告快照</small><strong>${evidence.snapshot.id}</strong></span>
<span><small>有效记录</small><strong>${evidence.snapshot.records}</strong></span>
<span><small>质量评分</small><strong>${evidence.snapshot.quality}</strong></span>
<span><small>技能映射覆盖</small><strong>${evidence.snapshot.coverage}</strong></span>
</div>
<div class="report-proof-chain">
<span><i>01</i><strong>原始事实</strong><small>保留来源、权属、时间戳</small></span>
<span><i>01</i><strong>原始记录</strong><small>保留来源、权属、时间戳</small></span>
<b></b>
<span><i>02</i><strong>规则治理</strong><small>去重、归一、异常降权</small></span>
<span><i>02</i><strong>数据处理</strong><small>去重、统一名称、降低异常数据权重</small></span>
<b></b>
<span><i>03</i><strong>指标计算</strong><small>样本阈值与基准校验</small></span>
<b></b>
@@ -882,7 +882,7 @@
</div>
<div class="report-evidence-notice">
<strong>证据使用边界</strong>
<p>校内学生、课程、教师、实习和就业事实以学校业务系统为准;互联网岗位仅用于判断外部需求趋势;企业数据只在协议授权范围内用于需求确认。任何单一来源都不直接触发专业撤并或招生调整。</p>
<p>校内学生、课程、教师、实习和就业数据以学校业务系统为准;互联网岗位只用于判断外部需求变化;企业数据只在协议授权范围内用于确认需求。任何单一来源都不能直接决定专业撤并或招生调整。</p>
</div>
`;
}
@@ -1063,7 +1063,7 @@
},
},
{
name: "培养响应",
name: "课程调整",
type: "line",
smooth: true,
symbolSize: 7,