- 交接摘要补 §一·三十五~§一·三十八:角色与授权、需求收敛(4 角色 / 10 菜单 / 取消二期)、 PC 端重搭后的 UI 修复与卡片式基线、品牌改名与新标识 - PRD 与功能逻辑卷只改标题行与产品代号线;**文件名不动** —— verify-docs.py 按路径读, 全库还有 20+ 处按文件名引用,改名会连带炸脚本 - 原型 index / admin-web / teacher-app / student-app 的品牌区改「深学在线」, admin-web 的 .mark(10 处)换成内嵌的新标 data URI,保持原型"单文件自包含"的约定 - 根 AGENTS.md 与 frontend-pc 的规范同步:接线检查补第 ⑨ 项(SVG 资产是不是合法 XML —— SVG 注释里出现连续两个减号就 not well-formed,图标裂开而控制台一句话都不报)、 「最容易写错的约定」6 -> 7 条(新增品牌标) - deploy/docker-compose.yml 只改头注释里的项目名(compose 的 name 与七牛对象前缀都没动)
88 KiB
深学在线 · 功能逻辑 PRD
产品代号:深学在线 版本:V2.0(2026-10 需求收敛:4 角色 / 不设二期 / 门禁失败只留「重新填写」) 日期:2026-09-24 文档定位:只描述"系统怎么运转",不含数据库设计、接口定义、代码结构 配套文档:《数据信息填报系统PRD》(主 PRD,含库表与接口)—— 主 PRD 回答"做什么",本文回答"怎么运转" 读者:产品经理、研发、测试、UI 设计
变更记录
| 版本 | 日期 | 变更内容 |
|---|---|---|
| V2.0 | 2026-10 | 需求收敛:① 角色由 6 个减为 4 个(平台运营 / 学校管理员 / 班主任 / 学生;删「副班主任」「审核员」);② §2.2 社会收集、§3.12 历史数据整理器、专项职业能力相关段落 整节作废;③ §3.1 门禁失败只留「重新填写」——原「申请加入名单」(FR-509)通道整体撤销,名单外的人由老师手工加人,系统内不展示任何联系方式;④ 不再有任何二期功能设计(OCR 与材料识别改为「缓做,等供应商」)。跨文档数字:接口 119 / 错误码 54 / 权限码 28 / 原型 29 屏。 |
| V1.0 | 2026-09-24 | 初稿:角色/流转/12 个功能逻辑/规则速查/20 个边界场景/文案规范 |
| V1.1 | 2026-09-24 | 压缩逻辑按实测重写:用 28 张真实 A4 扫描件实测,300dpi/q85 下 28/28 达标(平均 806KB),无需牺牲清晰度。① §3.7.1 新增实测结论;② §3.7.3 由"逐级降质逼近"改为"一次编码到位 + 兜底路径";③ §3.7.4 抽检机制标注为"实测不触发";④ §4 速查表、§7 未决事项同步更新 |
| V1.2 | 2026-09-24 | 修正材料来源通道:取消"直接拍照"(实测 4 类材料无一来自现场拍照,均为截图/扫描件/照相馆电子版)。① §3.5 改为"微信聊天记录 / 手机相册 / 聊天文件"三通道,拍照默认关闭;② 新增"必须保留原始文件名"设计逻辑(聊天记录可拿到原始名,相册拿不到);③ 新增来源引导文案与 4 个相关异常分支;④ §4 速查表、§5 场景表(+4 条)、§6 文案、§7 未决事项同步更新 |
| V1.3 | 2026-09-24 | 新增"名单门禁"(D6):① §2.1/§2.2 流程图改为"扫码 → 姓名+身份证核验 → 填报",社会收集也必须先导名单(废除"自由填报");② §2.4 由三条铁律扩为四条,新增"没有名单就没有填报";③ §3.1 整节重写为门禁逻辑(判定优先级、命中后绑定、统一失败提示、限流防枚举、名单不下发);④ §3.3 名单逻辑补充"姓名/身份证列为必填、缺列阻断发布";⑤ §4 速查、§5 场景(14/15 改写,+4 条)、§6 文案(+5 组门禁文案)、§7 未决事项(+4 项)同步更新 |
| V1.4 | 2026-09-24 | 新增材料识别设计(方案 B:规则为主 + VLM 兜底):① §3.5 升级为「材料上传与材料识别」,新增 3.5-B 材料识别整节(四路信号、文件名/形态/关键词/印章四类规则、置信度分级、VLM 三种触发条件、冲突裁决表、成本预估、三条不可违背原则、六个集成点);② §4 速查新增"材料识别"块;③ §5 场景 +4 条(29–32);④ §6 文案 +3 组;⑤ §7 未决事项 +3 项 |
| V1.5 | 2026-09-24 | 材料识别规则实测校正(用 112 个真实文件 + 32 个 OCR 抽样验证): ① 证伪初版形态规则——初版写"身份证宽高比 ≈1.585",实测为 0.732–1.016,与一寸照片 0.714 高度重叠,形态层根本无法区分;② 架构改为四层递进:文件名 → 形态(只分流派,不定型)→ OCR 强词计分 → VLM;③ 证伪"命中即判定"——实测关键词大量交叉命中(工作证明含"学籍/学校"、学籍表含"居民身份证"),改为只用强词 + 加权计分取最高;④ 新增一寸照片"零文字"判据(实测 8/8 无文字);⑤ VLM 触发率由 15% 重估为 2%~10%(初版偏高的原因是形态规则写错产生假冲突);⑥ 新增 §3.5-B 开头的实测验证结果表 + OCR 耗时表 + 局限性说明;⑦ §4 速查、§7 未决事项同步更新 |
| V1.6 | 2026-09-28 | 按官方《考生线下报名信息导入模板》校准表单填写逻辑:① §3.4 重写——新增**「评价计划」三级级联**(职业→工种→等级受计划约束,从源头防错,源自官方规则 04/05/06);② 新增补考科目数量约束(三/四/五级最多 1 科、一/二级最多 2 科、专项职业能力无补考);③ 新增专项职业能力整体降级(无工种/无等级/无补考);④ 明确 "无"是合法业务值而非空值(工作单位、报考工种);⑤ 补格式校验(入学时间 YYYY-MM-DD、工作年限阿拉伯数字、下拉严格受限);⑥ §4 速查新增"表单填写"块;⑦ 异常分支 +3 条 |
| V1.7 | 2026-09-28 | 新增「评价计划导入」完整逻辑(确认下发文件模式 = A):① §3.2 拆为 3.2-A 评价计划导入 + 3.2-B 任务创建向导;② 定义导入七步流程(上传 → 自动解析 → 人工确认列映射 → 导入体检 → 差异对比 → 确认写入 → 留痕);③ 明确列映射必须人工确认但可保存复用、原始文件必须留档、差异对比中移除项须关联已有考生告警;④ 7 条异常分支(扫描版PDF、合并单元格、增量 vs 全量、机构临时增补…);⑤ §4 速查新增"评价计划"块;⑥ §7 未决事项 +3 项(需索取真实计划清单样本) |
| V1.8 | 2026-09-28 | 实测校正:不存在"计划清单"文件,报考范围来自名单: ① §3.2-A 由"评价计划导入(七步流程)"整体重写为「报考范围聚合」——名单导入后自动聚合"职业×工种×等级"集合 + 一致性体检 + 管理员确认; ② 新增追加名单告警机制(超出已确认范围的报考项需管理员确认——范围失控的主要入口); ③ §3.4 新增 ⚠️ 最关键的第 1 条「字段三类规则」:🔒锁定(姓名/身份证号/报考三项,空则阻断发布)/✏️预填可改(其余,标注"老师已填请核对")/📄材料(学生唯一重活)——依据是实测名单 21 项已填 18 项,学生端几乎不用打字; ④ §3.4 步骤重新编号为 13 步,异常分支措辞校正("计划已过期"→"报考范围已关闭"); ⑤ §4 速查新增"报考范围""字段三类规则"两块,删除"评价计划"块; ⑥ §7 关闭 21/22/23,新增 24(预填字段能否由学生修改) |
| V1.9 | 2026-09-28 | 同步数据库决策(PG / Vastbase)与字段落库方式:① §3.4「字段三类规则」补存储说明——18 个业务字段在名单表与填报单表中为正式列(非 JSON),"按工种统计""按学历筛选"可直接走索引,仅机构额外追加字段进 extras_json;② 本文档其余部分不受影响(功能逻辑卷不承载库表设计,DDL 见主 PRD §7.3) |
目录
0. 文档说明与关键决策
0.1 本文包含 / 不包含
| 包含 | 不包含 |
|---|---|
| 角色能做什么、不能做什么 | 数据库表结构 |
| 每个功能的触发条件与处理步骤 | 接口定义与字段 |
| 判断规则、优先级、兜底策略 | 代码结构、类设计、框架选型 |
| 状态流转与谁能改变状态 | 部署、性能参数 |
| 用户看到什么、看到哪句话 | 测试用例(另见主 PRD §12) |
0.2 已决策事项(本文据此撰写)
| 编号 | 决策 | 影响章节 |
|---|---|---|
| D1 | 扫描件(工作证明/申报表等 A4 材料)强制压缩到 1M,不做体积放宽、不设例外。 当"≤1M"与"清晰度"冲突时,体积优先,牺牲清晰度;被牺牲的文件必须标记出来供人工抽检 | §3.7 |
| D2 | 学籍表等屏幕截图类材料保持原始像素与 PNG 格式,不缩放、不转 JPG | §3.7 |
| D3 | 校验位(身份证)用于裁决证件号争议,而非仅做格式校验 | §3.6、§3.8 |
| D4 | 一寸照片统一规格化为 295×413 px(25×35mm @300dpi) | §3.7 |
| D5 | 材料来源只提供"选择已有文件":微信聊天记录 / 手机相册 / 手机文件;不提供"直接拍照"(默认关闭,材料级可配)。理由:实测 4 类材料无一来自现场拍照 | §3.5 |
| D6 | 填报必须先过名单门禁:学校收集与社会收集都必须先导入名单,填报人进入前必须填写「姓名 + 身份证号」与名单匹配,匹配不到只提示、不放行(取消原"自助认领"与"自由填报") | §3.1、§3.3 |
1. 角色与端
| 角色 | 主用端 | 可以做什么 | 不可以做什么 |
|---|---|---|---|
| 平台运营 | PC | 开通/停用租户、查看全局用量、内容风控 | 查看任何考生的材料内容 |
| 学校管理员 | PC(主)+ 手机(次) | 建任务、配规则、导名册、终审、导出上报 | 修改已归档任务的配置 |
| 班主任 | PC + 手机 | 催报、初审、批量通过、代传材料 | 终审、导出、查看其他班级 |
| — | 已删除(2026-10 需求收敛):内置角色由 6 个减为 4 个(平台运营 / 学校管理员 / 班主任 / 学生) | — | |
| 填报人(学生) | 微信小程序 | 填报、上传、修改、撤回(未审核前) | 查看他人材料、修改已终审内容 |
| — | 不做(2026-10 取消社会收集) | — |
端能力差异(功能逻辑层面)
| 能力 | 小程序 | PC |
|---|---|---|
| 填报 | ✅ 主入口 | ❌ |
| 材料来源选择 | ✅ 从微信聊天记录选(可拿原始文件名)/ 从相册选 / 从手机文件选;不提供拍照 | ✅ 仅本地上传(拖拽或文件选择) |
| 初审 / 批量通过 | ✅ | ✅ |
| 表单设计与规则配置 | ❌(屏幕太小且易误操作) | ✅ 唯一入口 |
| 名册导入 | ❌ | ✅ |
| 汇总导出 | ❌ | ✅ |
| 查看大图 / 对比原图与压缩图 | ✅ 支持 | ✅ 支持 |
2. 全局业务流转
2.1 学校收集(主流程)
【前置】学校管理员建任务
↓ 导入名单(Excel)+ 选定班级 + 配置表单与材料规则
↓ 发布任务 → 生成填报二维码
填报人扫码 → 微信授权
↓ 【门禁】填写「姓名 + 身份证号」→ 与名单匹配
↓ 匹配成功 → 绑定名单项 → 回填只读信息 → 进入填报
↓ 匹配失败 → 统一提示页(只有「重新填写」+ 提示联系老师),不给填报
填报人逐项填写表单 → 逐项上传材料
↓ 每次上传后立即:命名规范化 → 压缩 → 校验 → (必要时)OCR
↓ 填报人看到"文件名已规范 / 体积已压缩 / 有无问题"的即时反馈
填报人提交
↓ 系统做提交前总校验(有无缺失、有无红色阻断项)
↓ 通过则进入【待初审】
班主任初审(手机或 PC)
↓ 一键批量通过全部绿色项
↓ 红黄项逐个处理:通过 或 驳回(选原因)
↓ 驳回 → 填报人收到通知 → 修改 → 重新提交(回到【待初审】)
管理员终审
↓ 全部通过后进入【已通过】
管理员导出
↓ 系统按目录规范打包(含分卷、汇总 Excel)
↓ 下载上报至认定机构
🔒 门禁不变式:没有名单,就不能填报。 名单是唯一的准入依据,不存在"自由填报"。
2.2 社会收集(差异流程)—— 不做(2026-10 取消)
⚠️ 本节作废:社会收集(
collectMode=2)不再设计,传入直接返回40044。 原设计的差异点(跳过班主任初审、直达管理员终审)记录在此仅供追溯。 名单导入与身份核验两项与学校收集完全一致,这条不变。
2.3 状态机
填报单状态
| 状态 | 含义 | 谁能改变 | 可回到哪些状态 |
|---|---|---|---|
| 草稿 | 已开始填但未提交 | 填报人 | → 待初审/待终审(提交) |
| 待初审 | 已提交,等班主任 | 班主任、系统(跳过初审时) | → 待终审(通过)/→ 已驳回(驳回) |
| 待终审 | 初审通过,等管理员 | 管理员 | → 已通过(通过)/→ 已驳回(驳回) |
| 已驳回 | 被打回,等填报人修改 | 填报人 | → 待初审/待终审(重新提交) |
| 已通过 | 终审通过 | 管理员(解锁) | → 已归档 |
| 已归档 | 任务结束后锁定 | — | 不可逆 |
🔒 业务不变量:终审通过后默认不可修改。如需更正,必须管理员主动"解锁",且解锁动作计入审计。
任务状态
| 状态 | 含义 | 转入条件 | 转出条件 |
|---|---|---|---|
| 草稿 | 配置中,填报人不可见 | 新建 | 管理员点"发布" |
| 收集中 | 可填报 | 发布 | 到期自动截止 / 手动截止 |
| 暂停 | 临时停止接收 | 管理员操作 | 管理员恢复 |
| 已截止 | 不再接收新提交(已提交的仍可审核) | 到期或手动 | 归档 |
| 已归档 | 只读 | 管理员操作 | 不可逆 |
材料项状态
| 状态 | 含义 |
|---|---|
| 未上传 | 该材料尚未提交 |
| 已上传待处理 | 文件已到,正在规范化/压缩/校验 |
| 已受理 | 处理完成,无阻断问题 |
| 有警告 | 处理完成,存在黄项(可提交但需注意) |
| 有阻断 | 处理完成,存在红项(不可提交) |
| 已驳回 | 审核认为本项不合格,需重传 |
| 已通过 | 审核确认合格 |
2.4 四条铁律
- 没有名单,就没有填报——两种收集模式都必须先导入名单,填报人必须通过「姓名 + 身份证号」核验才能进入填报页,核验不通过只提示、不放行。
- 一个人在一个任务下只有一份填报单——不允许同一人重复建单,只允许在原有单上修改。
- 没有规范文件名、没有压到 1M 内的文件,不得进入汇总包——导出时若发现不合格文件,导出直接报错并列出清单,不允许"带着问题打包"。
- 终审通过是"进入上报范围"的唯一门槛——初审通过不算,材料上传完成也不算。
3. 功能逻辑详述
每个功能按「触发 → 处理 → 输出 → 异常」四段描述。
3.1 身份识别与名单匹配(进入填报的门禁)
⚠️ 本版强化:学生填报与外部(社会)填报都必须先导入名单,填报人必须先通过「姓名 + 身份证号」匹配名单,匹配成功才进入填报页。匹配不到就不给填,只做提示。
触发:填报人扫码或点击链接进入任务。
处理步骤
扫码进入
↓ ① 微信授权(静默取 openid)
↓ ② 解析任务:二维码带的任务标识 → 无效则提示"链接无效"
↓ ③ 检查任务状态:未开始 / 已暂停 / 已截止 / 已归档 → 分别提示,不进入
↓ ④ 【门禁页】填写两项:
· 姓名
· 身份证号(数字键盘、自动分段、末位 X 自动大写、支持粘贴)
本地先做格式 + 校验位校验 → 不合格当场提示,不发请求
↓ ⑤ 提交匹配(在服务端完成)
↓ ⑥ 命中 → 绑定 → 进入填报页
未命中 → 失败提示页(只有「重新填写」+ 提示联系老师)
匹配判定顺序
| 优先级 | 判定条件 | 结果 |
|---|---|---|
| 1 | 身份证号 + 姓名 完全一致 | ✅ 直接命中 |
| 2 | 身份证号命中,但姓名不一致 | 尝试形近字 / 同音字纠错(复用 §3.6 能力)→ 命中则请用户确认"你是不是 XXX?" |
| 3 | 身份证号命中,姓名纠错后仍不一致 | 🔴 失败(不提示姓名错误,统一提示) |
| 4 | 身份证号未命中 | 🔴 失败 |
| 5 | 命中多条(同一人在两个班) | 列出可选班级,由本人选择 |
命中后的处理
- 该名单项锁定绑定到当前用户(openid),防止他人冒用;
- 若该名单项已被其他人绑定 → 提示"该信息已被登记,如有疑问请联系老师";
- 姓名、身份证号回填并置为只读(避免用户改动后又对不上名单);
- 班级、专业、学号等名单中已有的信息一并回填;
- 进入填报页。
匹配失败提示(统一文案)
"没有找到你的信息。 请核对姓名和身份证号是否与老师提供的名单一致。 如确认已报名,请联系老师把你加入名单。"
只提供一个系统内动作:重新填写;另加一句纯文案提示"请联系老师把你加入名单" (原「申请加入名单」自助通道已于 2026-10 撤销)——系统内不展示任何联系方式
🔒 安全要求(重要,必须实现)
| 要求 | 说明 |
|---|---|
| 限流 | 同一 openid 每小时最多 10 次匹配;同一 IP 每分钟最多 20 次;超出则锁定并提示"操作过于频繁,请稍后再试" |
| 失败原因不区分 | 无论"身份证号不在名单"还是"姓名不匹配",提示文案完全一致。否则可被用来探测某个身份证号是否在名单中 |
| 名单不下发 | 名单只在服务端参与匹配,绝不下发到前端 |
| 不记录明文匹配日志 | 失败尝试只记 openid、时间、结果,不记明文姓名与身份证号 |
| 传输加密 | 姓名与身份证号走加密传输 |
异常分支
| 情况 | 处理 |
|---|---|
| 姓名对、身份证号错(或反之) | 统一失败提示,不透露是哪一项错 |
| 身份证号对、姓名有错别字(如"扬晨"↔"杨晨") | 形近字纠错命中 → "你是不是 杨晨?" → 用户确认后通过 |
| 一人在两个班的名单中 | 两条都列出,让本人选择班级;结果通知管理员核对 |
| 该名单项已被他人绑定 | 提示"该信息已被登记,如有疑问请联系老师" |
| 任务已截止但确需补交 | 提示已截止;管理员可延长截止或点名放行 |
| 同一微信帮多人填(哥哥帮弟弟) | 允许,但切换填报人需重新走核验,且记录操作留痕 |
| 名单外的人确实要报名 | 本版按需求实现为"不给填、只提示",需老师去后台把人加进名单(见下方待决策事项) |
✅ 已决策(2026-10,需求收敛):名单外的人由老师在任务里手工加人,不做自助通道。 曾经的"学生自助申请 + 管理员逐条审批"(FR-509)已整体撤销(模块、表、接口、页面、错误码一并删除)。 门禁失败页只保留「重新填写」+ 一句"请联系老师把你加入名单",系统内不展示联系方式。 这样守住的仍是同一条铁律:没有名单,就不能填报 —— 加人的动作留在老师手里。
3.2 报考范围聚合与任务创建
3.2-A 报考范围聚合(⚠️ 按实际情况校正)
纠正:上一版假设"认定机构会下发一份计划清单文件",该假设不成立。 经真实名单实测确认:「报考职业 / 报考工种 / 报考等级」这三列,在导入名单时就已经由老师填好了(28/28,均为「车工 / 数控车工 / 四级中级工」)。 ⇒ 报考范围从名单聚合而来,不需要任何外部文件。
触发:名单导入完成后自动执行。
处理步骤
名单导入
↓
① 【聚合】扫描全部名单行的「报考职业 / 报考工种 / 报考等级」
↓ 生成"职业 × 工种 × 等级"的取值集合
↓
② 【一致性体检】输出报告:
· 是否有人的三项为空(红色必填,不该为空)
· 同一职业下是否出现互相矛盾的工种
· 等级是否与该工种的常规设置相符
· 是否与参考字典拼写不符(如"数控车床工" vs "数控车工")
· 本次共涉及几组"职业/工种/等级"
↓
③ 【管理员确认 / 修正】
↓ 写入 collect_task.plan_scope_json
↓
④ 学生端只读展示 + 导出时原样写回 Excel 的 G/H/I 列
追加名单时的约束(关键防线)
| 情况 | 处理 |
|---|---|
| 追加的人报考项在已确认范围内 | ✅ 直接接受 |
| 追加的人报考项超出范围 | ⚠️ 告警:"新增了范围外的报考项:车工 / 普通车工 / 三级",需管理员确认后才接受,并同步更新范围 |
💡 中途补录最容易绕过审核,是报考范围失控的主要入口,必须设这道闸。
异常分支
| 情况 | 处理 |
|---|---|
| 名单里有人三项为空 | 🔴 阻断发布:"名单中有 N 人未填写报考职业/工种/等级" |
| 整批出现多组不同的报考项 | 正常(一个任务可覆盖多个工种),但需管理员确认无误 |
| 老师发现填错想改 | 管理员可直接修改名单行(留痕),范围自动重新聚合 |
| 名单里出现参考字典没有的职业/工种 | 仅提示"可能拼写有误",不阻断(最终以机构要求为准) |
不做(2026-10 取消;传 certType=3 返回 40044) |
关键设计
| # | 设计点 | 理由 |
|---|---|---|
| 1 | 范围是"聚合结果",不是"约束来源" | 老师已经确定好了,系统只做体检与展示,不越权更正 |
| 2 | 一致性体检比范围校验更有价值 | 单看一行都合法,但"38 人报数控车工、2 人报车工"很可能是填错——这类问题只有聚合后才能发现 |
| 3 | 追加名单必须告警 | 见上表 |
| 4 | 参考字典只提示、不阻断 | 机构可能有非常规的职业名称,系统不该比机构更权威 |
输出:collect_task.plan_scope_json(本期报考范围)+ 一致性体检报告。
3.2-B 任务创建向导
触发:管理员在工作台点"新建收集任务"。
七步逻辑
| 步骤 | 输入 | 校验 | 输出 |
|---|---|---|---|
| ① 基本信息 | 任务名、收集模式(学校/社会)、批次号、专业、工种、等级、起止时间 | 必填;结束时间必须晚于开始时间;批次号在租户内唯一 | 任务骨架 |
| ② 覆盖班级 | 勾选本次收集涉及哪些班级 | 学校模式至少选 1 个班;社会模式可选报名点 | 应填人范围 |
| ③ 名单 | 上传 Excel 或手动添加(两种模式均必填) | 必须含「姓名」「身份证号」列;人数 > 0 | 准入名单 |
| ④ 表单 | 选模板或自定义字段 | 至少 1 个字段;必填字段不得全部为空 | 填报字段集 |
| ⑤ 材料 | 材料清单、命名模板、体积上限、压缩档位 | 至少 1 项材料;命名模板必须含"姓名""证件号""材料名" | 材料规则集 |
| ⑥ 审核流 | 是否启用班主任层、驳回次数上限、超时小时数 | 学校模式默认启用;社会模式默认关闭 | 审核规则 |
| ⑦ 预览发布 | — | 试跑至少 1 条样本文件名,确认命名结果正确 | 二维码 / 链接 |
关键逻辑点
- 第 ⑦ 步必须有"命名规则试跑":管理员粘贴几条学生可能的原始文件名,系统立即演示会被改成什么,确认无误才能发布。这是防止"规则配错导致全员改名错误"的唯一闸门。
- 每一步都可保存为草稿,中途退出不丢失。
- 已发布的任务修改配置时:表单与材料规则的新改动只对新提交生效,已提交的数据不受影响(避免数据错乱)。
- 任务支持"克隆":复制配置与名册,不复制任何已上传的文件。
3.3 名单逻辑
🔒 铁律:两种收集模式(学校 / 社会)都必须先导入名单,名单是唯一的准入依据。 初稿曾允许"社会收集可不导名单、自由填报",本版已废除。
触发:管理员在上传名单步骤选择 Excel 文件。
处理步骤
- 定位表头:不假设第 1 行是表头。系统从前 10 行中自动寻找包含"姓名""身份证"等关键词的行作为表头(真实模板第 1–5 行是说明文字,第 6 行才是表头)。
- 字段映射:自动匹配标准字段(姓名、身份证号、手机号、学号、班级、专业等),无法自动识别的列由管理员手动指定或忽略。「姓名」与「身份证号」为必填列(缺任一列则无法用于门禁核验,必须补齐后才能发布任务)。
- 逐行体检(导入前),生成《导入体检报告》:
- 身份证号格式与校验位是否通过
- 姓名是否为空、是否有重复
- 同一证件号是否重复出现
- 手机号格式
- 按体检结果决定:有致命问题(如证件号重复、校验位失败)→ 提示管理员确认后仍可导入,但问题行被标记。
- 建立名单:证件号通过哈希去重存储,界面展示时脱敏(如
3601**********1234)。 - 发布前校验:任务发布前必须确认名单人数 > 0 且姓名/身份证号列完整,否则不允许发布。
输出:名单列表 + 体检报告(可下载)。
异常分支
| 情况 | 处理 |
|---|---|
| 找不到表头行 | 提示"未识别到表头,请检查 Excel",并允许手动指定行号 |
| 缺少「姓名」或「身份证号」列 | 🔴 阻断发布:"名单必须包含姓名和身份证号才能开启填报核验" |
| 模板被学生自行修改过(多列、少列、换表头) | 以字段映射向导兜底,不强行报错 |
| 名单里有人实际不报名 | 管理员可"移出应填名单",状态记为已移除,不计入完成率 |
| 名单导入后发现漏人 | 支持追加导入,按证件号去重合并;追加后新人即可立即填报 |
| 名单项始终无人认领 | 不影响任务完成率统计口径(完成率 = 已提交 / 名单有效人数) |
名册变更留痕:任何姓名/证件号的修改都必须记录"谁在何时把 X 改成 Y",并在审核界面可见。
3.4 表单填写逻辑
触发:填报人通过名单门禁后进入填报页。
表单来源:任务所属评价计划 + 任务表单配置。默认套用官方《考生线下报名信息导入模板》的 21 字段(详见主 PRD §5.4.1)。
处理步骤
-
字段三类规则(⚠️ 最关键:决定了学生端要填多少字)
实测老师交上来的名单里,21 个字段已填满 18 个。因此学生端的字段按三类呈现:
类别 字段 学生端行为 🔒 锁定 姓名、身份证号、报考职业、报考工种、报考等级 只读不可改。名单为空 → 阻断任务发布(这三项必须由老师确定)。学生要改只能找老师 ✏️ 预填可改 学历、是否在校生、在读学校、所学专业、入学时间、工作单位、联系电话、是否补考、补考科目、本职业工作年限、已获证书相关 名单有值 → 预填并标注"老师已填,请核对",学生可直接修改(留痕);名单为空 → 学生必填 📄 材料 一寸照片、身份证、学籍表、工作证明等 学生上传(学生唯一的重活) 💡 实测数据说明为什么"锁定"是必要的:整班 28 人的报考三项完全一致(车工/数控车工/四级中级工)——这是老师根据机构要求统一定的。让学生去选只会制造错误。 💡 实测数据也说明为什么其余字段该允许改:联系电话有 28 个不同值、入学时间可能记错——允许学生自己改正比回退给老师更高效。
📦 存储说明:这 18 个业务字段(除姓名/身份证号外)在名单表和填报单表里都是正式列(不是 JSON),因此"按工种统计报名人数""按学历筛选"这类查询可直接走索引。只有机构额外追加的字段才进
extras_json。详见主 PRD §7.3。 -
报考范围的一致性体检(在学生填报之前完成) 系统从名单聚合出本期范围时,会做一次体检:
- 同一职业下出现互相矛盾的工种 → 提示老师确认
- 等级与该工种常规设置不符 → 提示
- 与参考字典拼写不符("数控车床工" vs "数控车工")→ 提示
- 有人三项为空 → 🔴 阻断发布
单看一行都合法,但"38 人报数控车工、2 人报车工"很可能是填错——这类问题只有聚合后才能发现。
-
选择范围先收窄(⚠️ 源自官方规则 04/05/06) 「报考职业 / 报考工种 / 报考等级」三项不是自由选择,而是限定在本期报考范围内:
本期范围 → 只列出范围内的职业 ↓ 选中职业 只列出该职业范围内的工种(该职业无工种 → 只能填"无") ↓ 选中工种 只列出该工种范围内的等级⇒ 从源头杜绝填错,而不是提交后报错。
注:实测官方 Excel 模板里「报考职业」「报考工种」根本没有下拉(21 列中 13 列自由填写)——这正是本系统相对模板的核心增量。
-
条件显示(级联):官方模板用绿色标题标识级联列,共两组:
触发字段 值 级联行为 是否补考 是 按等级放开补考科目(见第 5 条) 是否补考 否 补考理论 / 实操 / 综合 全部隐藏且不校验 是否在校生 是 在读学校 / 所学专业 / 入学时间 三项显示且必填 是否在校生 否 上述三项隐藏且不校验 隐藏的字段不参与必填校验,也不出现在导出结果中。
-
补考科目数量约束(官方规则 07,最容易做错)
认定类型 / 等级 最多可选科目数 可选项 专项职业能力0不做(2026-10 取消) 三 / 四 / 五级 1 补考理论、补考实操 中选一个 一 / 二级 2 补考理论、补考实操、补考综合 中最多选两个 ⇒ 达到上限后,其余科目选项置灰不可选(而不是事后报错)。
-
专项职业能力的整体降级:不做(2026-10 取消二期;certType=3直接40044)。原设计是:该类型下工种、等级、补考三项全部隐藏,官方规则 05/06/07 整体跳过。 -
下拉严格受限:官方规定"若手动输入则只能填写下拉选项中包含的值"。 ⇒ 移动端一律用选择器;PC 端允许输入但做严格值匹配,不在选项内的值直接拒绝。
-
"无"是合法值,不是空值(⚠️ 实现陷阱)
- 工作单位没有 → 填"无"
- 报考工种该职业没有 → 填"无"
- ⇒ 必填校验时 "无"算已填;做单位统计、去重时不能把"无"当成真实单位名。
-
格式校验
- 联系电话:11 位数字
- 入学时间:必须 YYYY-MM-DD
- 本职业工作年限:只能阿拉伯数字(0、1、2…)
-
实时校验:每个字段失焦即校验,立即反馈,不等到提交时集中报错。
-
草稿自动保存:每 10 秒或字段变更后保存;断网时暂存本地,恢复网络后补传。
-
跨任务记忆:同一人第二次填报自动带出上次信息(仅本租户内)。
-
提交前总校验:汇总所有问题,分三类呈现
- 🔴 阻断项:必须处理才能提交
- 🟡 警告项:可勾选"我已确认"后继续
- 🟢 通过项
输出:提交成功 → 进入待初审/待终审;或显示阻断清单。
异常分支
| 情况 | 处理 |
|---|---|
| 填报中途退出 | 草稿保留,重新进入时提示"继续上次填写" |
| 提交时网络中断 | 提示"提交未成功,已保存草稿",不做"假成功" |
| 同一账号在两台设备同时填 | 以最后保存的版本为准,并提示"你的内容在另一台设备上被修改过" |
| 提交后又想改 | 未进入审核前可"撤回";已进入审核需联系老师驳回 |
| 报考范围已关闭(认定机构批次结束) | 提示"本批次已结束",不允许新建填报单;已提交的不受影响 |
| 学生发现自己的报考职业/工种/等级不对 | 提示"该三项由老师统一确定,请联系老师修改",不允许自行输入 |
| 不做(2026-10 取消该认定类型) |
3.5 材料上传与材料识别逻辑
3.5-A 上传流程
⚠️ 重要修正(V1.2):不提供"直接拍照"入口。 复核 4 类材料的真实来源后发现,没有一类是"现场拍照"产生的:
材料 真实来源 实测证据 学籍表 教务系统屏幕截图 28 张均为约 1025×590 的 16:9 截图 工作证明 扫描仪扫描件(多在打印店完成) 28 张均为 1208–1352 dpi 的 A4 扫描图 一寸照片 照相馆拍摄后的电子版 27/28 张尺寸完全一致(984×1378) 身份证 既有扫描件或翻拍件 尺寸跨度 558×745 ~ 2216×2796,来源不一 现场拍照只会引入模糊、畸变、反光、阴影问题,反而制造返工。填报入口必须是"选择已有文件"。
触发:填报人在某个材料项上点击"选择材料"。
四种来源通道(按实际使用频率排序)
| # | 通道 | 适用材料 | 说明 |
|---|---|---|---|
| 1 | 从微信聊天记录选择 | 全部(主力通道) | 学生从照相馆、打印店、老师、家人处收到的文件,通常就躺在聊天记录里 |
| 2 | 从手机相册选择 | 学籍表截图、已有的翻拍件 | 手机截图会自动存入相册 |
| 3 | 从聊天记录 / 手机文件选择 | 扫描件 PDF、Word 版申报表 | 需要选中"文件"类型而非"图片"类型 |
| 4 | 默认关闭 | 材料级可配置开启(例如某批次允许现场补拍身份证),但默认不提供 |
两条关键设计逻辑
① 必须保留原始文件名(极其重要)
- 从聊天记录选择文件时,微信会返回该文件的原始名称(例如
张三-360121200010101234-工作证明.jpg); - 从相册选择图片时,拿不到文件名(通常是
IMG_0001.jpg)。
⇒ 系统必须优先使用前者。文件名本身就是最有价值的信息——命名规范化引擎(§3.6)能直接从文件名中读出姓名、证件号、材料类型,准确率远高于从无名截图里靠 OCR 猜。
⇒ 产品层要提示用户:"优先从聊天记录里选,因为文件名里带着你的信息,系统能自动帮你填。"
② 支持一次多选 身份证正反面、多页材料允许一次选多张,减少重复操作。
③ 来源引导(每个材料项都要给)
| 材料 | 引导文案 |
|---|---|
| 一寸照片 | "照相馆给过你电子版吗?在微信聊天记录里搜一下" |
| 工作证明 | "打印店扫描后会发给你,从聊天记录里选" |
| 学籍表 | "教务系统截图后,从手机相册里选" |
| 身份证 | "拍过的照片或者扫描件都可以,从聊天记录或相册里选" |
处理步骤(一次上传的完整生命周期)
点击"选择材料"
↓ 弹出来源选择:微信聊天记录 / 手机相册 / 手机文件
↓ 选中文件(可多选)
↓ 【客户端】只做三件事:
↓ ① 记录原始文件名(若来源支持)
↓ ② 方向校正
↓ ③ 尺寸限幅(长边 ≤2400px)
↓ 不做有损质量压缩(原因见 §3.7.6 二次有损防护)
↓ 上传到存储(显示进度;支持断点续传)
↓ 【服务端】形态识别 → 选定压缩档位
↓ 命名规范化(§3.6)
↓ 压缩到目标体积(§3.7)
↓ 格式转换(如需)
↓ 校验(§3.8)
↓ 必要时 OCR 识别并回填
↓ 返回处理结果
填报人看到结果卡片:
┌─────────────────────────────────────────┐
│ 原名:曾伊豪-361029200907295110身份证.jpg.jpg │
│ 已规范为:曾伊豪-...-身份证.jpg │
│ 体积:17.1MB → 512KB ✅ │
│ 校验:通过 ✅ │
└─────────────────────────────────────────┘
输出:材料项状态变为"已受理/有警告/有阻断",并附上处理前后对比。
异常分支
| 情况 | 处理 |
|---|---|
| 上传中断 | 断点续传;已传部分不重复上传 |
| 格式不在白名单 | 提示支持的格式,并说明"建议用 JPG" |
| 从聊天记录选文件时超出微信单文件体积限制 | 提示改为"从相册选那张图片",并说明聊天中收到的图片可选择非原图版本(体积更小)。各通道的实际体积上限需在开发期实测确认 |
| 聊天记录里找不到该文件(过期/被清理) | 提示替代方案:请对方重新发送 / 从手机文件里找 / 联系老师代传 |
从相册选的图片没有文件名(IMG_0001.jpg) |
无法从文件名提取信息 → 走 OCR 识别回填,并在界面提示"这张图没有名字信息,请确认归属" |
| 文件来自"文件传输助手" | 正常处理,文件名可保留 |
| 选中的是压缩过度的聊天图片(微信默认会压缩图片) | 检测分辨率是否偏低,若低于建议值则提示"这张图可能被压缩过,建议让对方发原图" |
| 文件过大(>50MB) | 提示"文件过大,请让对方重新发送一份清晰的扫描件" |
| 处理超时 | 转后台异步处理,页面显示"处理中",完成后推送通知 |
| 处理失败 | 保留原图,标记失败原因,允许一键重试;不丢弃用户已上传的内容 |
| 上传了错误的材料(如把身份证传到照片项) | 依靠 OCR 内容比对提示"这张看起来不是身份证",并允许一键移动到正确材料项 |
| 重复上传同一材料 | 保留历史版本,默认取最新;旧版本可回溯 |
3.5-B 材料识别(这是什么材料)
决策(方案 B):规则为主 + 视觉大模型兜底。 先用零成本规则判断,只在"规则判不准"或"与用户声明冲突"时才调用视觉大模型。
📊 实测验证结果(2026-09-24,用 112 个真实文件 + 32 个 OCR 抽样)
| 层 | 方法 | 实测结果 | 成本 |
|---|---|---|---|
| 第 1 层 文件名 | 别名表匹配 | 112/112 = 100% | 0 |
| 第 2 层 形态 | 粗分流派 | 111/112 = 99.1% 能正确分流派,但流派内无法定型 | 0 |
| 第 3 层 内容 OCR | 强词计分 + 零文字判据 | 32/32 = 100%(4 类材料各 8 个) | OCR(本来就要做) |
| 第 4 层 VLM | 兜底 | 触发率 2%~10%(重估) | 按次 |
OCR 耗时实测(CPU,图片降采样至 2000px)
| 材料 | 耗时 | 文字量 |
|---|---|---|
| 一寸照片 | 0.1–0.3s | 0 字 |
| 身份证 | 0.9–1.6s | 107–138 字 |
| 学籍表 | 1.0–1.4s | 265–269 字 |
| 工作证明 | 3.5–4.9s | 702–755 字 |
本次验证发现并修正的两处设计错误
| # | 初版设计(错) | 实测真相 | 修正后 |
|---|---|---|---|
| 1 | 身份证宽高比 ≈ 1.585,可按形态直接判定 | 实际 0.732–1.016,与一寸照片 0.714 高度重叠 | 形态层降级为"只分流派" |
| 2 | OCR 关键词"命中任一即判定" | 关键词大量交叉命中(工作证明里含"学籍/学校",学籍表里含"居民身份证") | 改为只用强词 + 加权计分取最高 |
⚠️ 本次验证的局限性(必须在开发期补测)
- 文件名 100% 是"有偏测试"——这 112 个文件是老师已经规范命名过的;真实收集中学生传来的文件名更乱,准确率必然更低;
- OCR 抽样仅 32/112,未覆盖全部文件;
- 未覆盖的困难场景:模糊件、翻拍反光、非标准材料(学信网备案表、其它佐证材料在本数据集中不存在);
- 上述结果不能直接当作线上准确率承诺,只用于验证架构方向。
要解决什么问题
| # | 场景 | 问题 |
|---|---|---|
| 1 | 填报上传 | 用户在"身份证"槽位传了学籍表 → 需要发现并提示 |
| 已取消(2026-10,整理器模块删除) | ||
| 3 | 审核辅助 | 班主任想快速确认"这堆材料里有没有传错的" |
| 4 | 缺失检测兜底 | 例如"其它佐证材料"传了 3 张,需要区分它们分属什么 |
四路信号
| 信号 | 内容 | 可靠性 | 成本 |
|---|---|---|---|
| S1 槽位 | 用户在哪个材料项上传的(用户声明) | 高,但用户可能传错 | 0 |
| S2 文件名 | 原始文件名里的材料名(如 ...-工作证明.jpg) |
最可靠(前提是聊天记录来源) | 0 |
| S3 形态 | 宽高比、像素量、DPI、是否有大面积红色(印章) | 中(拍歪、裁图后会失效) | 极低(只读头部) |
| S4 内容 | OCR 文字关键词、版面特征 | 高 | OCR 已在做,无额外成本 |
🔑 一个必须记住的前提:不是所有材料都有文字。 一寸照片完全没有文字,只能靠形态(5:7 比例、纯色背景、人脸居中)判断。因此不能因为"没识别出关键词"就判定材料错了。
规则层判定(必跑,零成本)
① 文件名规则(最强信号)
- 用材料别名表(§3.6)做最长匹配
- 命中 → 直接定为该材料,置信度 0.95
🔧 三层递进架构(实测校正后的最终设计)
⚠️ 本文档初版把形态层写成"直接判定材料类型",实测证明是错的。 正确架构如下:
第 1 层 文件名 → 能定死就定死(准确率实测 100%,零成本)
↓ 判不出
第 2 层 形态 → 【只分流派,不材料定型】
↓ 流派内还有多个候选
第 3 层 内容(OCR) → 在流派内定死(准确率实测 100%)
↓ 仍判不出
第 4 层 VLM → 兜底(实测触发率仅 2%~10%)
第 1 层:文件名规则(最强信号)
- 用材料别名表(§3.6)做最长匹配
- 命中 → 直接定为该材料,置信度 0.95
- ⚠️ 前提是来源为微信聊天记录(可保留原始文件名);相册来源拿不到文件名
第 2 层:形态规则 —— 只分流派(关键修正)
| 形态流派 | 判定特征(实测标定) | 该流派内的候选材料 | 定型靠什么 |
|---|---|---|---|
| A4 扫描件流 | 像素量 > 2000 万(实测 1.44~1.81 亿) | 工作证明 / 申报表 / 备案表 | 内容层 |
| 宽屏截图流 | 宽高比 1.60~1.90(实测 1.689~1.758) | 学籍表 / 学信网备案表截图 | 内容层 |
| 竖版小照片流 | 宽高比 0.60~1.05,像素 < 2000 万(实测 0.714~1.016) | 一寸照片 / 身份证翻拍 ← 混合! | 内容层 |
| 未判定 | 其他 | — | VLM |
❌ 本文档初版写的"身份证 宽高比 ≈1.585(85.6:54)"是错的。 实测:真实身份证件是竖版/近方拍摄,宽高比 0.732~1.016,与一寸照片的 0.714 高度重叠,像素量也重叠(416K
6196K vs 1356K3378K)。 ⇒ 形态层根本无法区分「一寸照片」和「身份证」,必须交给内容层。这是本次验证最重要的结论。
第 3 层:内容规则(OCR 关键词加权计分)
❌ 本文档初版写的"命中任一关键词即判定"是错的。 实测发现关键词大量交叉命中:工作证明里同时出现"学籍/学校/入学/专业/姓名",学籍表里也出现"居民身份证",身份证里也出现"学校/姓名"。 ⇒ 必须只用高唯一性强词 + 加权计分取最高,通用词(姓名/学校/专业/出生/单位/本人)全部剔除。
| 材料 | 强特征词(权重 ×3) | 实测得分 |
|---|---|---|
| 身份证 | 公民身份号码 / 签发机关 / 有效期限 / 居民身份证 | 9~12 |
| 学籍表 | 学籍 / 学籍号 / 学籍状态 / 学籍证明 | 6(另有身份证噪声 3) |
| 工作证明·申报表 | 职业技能等级认定 / 个人申报表 / 申报表 / 兹证明 / 技能等级 | 12(另有学籍表噪声 3) |
| 一寸照片 | ——(零文字,见下) | 9 |
🔑 一寸照片的"零文字"判据 实测 8/8 张一寸照片 OCR 文字量为 0(真实证件照没有任何文字)。 ⇒ 规则:整图文字量 < 5 字 → 判定为一寸照片(结合竖版小照片流派)。 这是整个识别体系里最干净的信号,比任何关键词都可靠。
判定规则
对每个候选材料算分:分数 = 3 × (命中的强词数)
若整图文字量 < 5 字 → 一寸照片得 9 分
取最高分者为识别结果;全部为 0 分 → 交 VLM
📌 强词表必须可配置(每个租户/机构材料名与措辞不同),并提供"从历史文件自动学习候选强词"的辅助功能。 📌 学信网备案表、其它佐证材料等当前数据集未覆盖,需在新批次数据上补充标定。
④ 印章检测(辅助信号) 扫描件上大面积红色像素区域 → 提示"疑似盖章文件"。仅作辅助,不能单独定论。
判定与置信度
置信度 ≥ 0.90 → 直接采信识别结果
置信度 0.70–0.90 → 采信但标记,界面提示用户确认
置信度 < 0.70 → 不判断,以用户槽位为准(不打扰用户)
VLM 兜底触发条件(成本控制的核心)
只有以下三种情况才调用视觉大模型:
| # | 触发条件 | 理由 |
|---|---|---|
| 1 | 规则层置信度落在 0.4–0.7(疑似但不确定) | 值得花钱确认 |
| 2 | 规则识别结果与槽位冲突 | 这是最需要判断的场景(防传错) |
| 3 | 散图分拣且规则层无法判定 | 没有槽位可参考,只能靠内容 |
不触发 VLM 的情况(占绝大多数,零成本通过)
- 规则层置信度 ≥ 0.9(文件名清楚 / 关键词明确)→ 直接定
- 槽位与识别结果一致 → 无需二次确认
- 规则层置信度 < 0.4 且无冲突 → 不值得花钱,直接放行
- 一寸照片等纯形态材料 → 靠形态规则即可(比例特征极其稳定)
成本预估(已按实测重估)
| 方案 | 调用量(按 48 万文件/学期) | 相对成本 |
|---|---|---|
| 全部走 VLM | 48 万次 | 100% |
| 本方案(规则为主 + 兜底) | 约 1~4.8 万次 | 约 2%~10% |
| 只用规则 | 0 次 | 0%(但模糊件判不出) |
实测触发率(按"聊天记录来源占比"推算)
| 聊天记录来源占比 | VLM 触发率 | 48 万文件的调用量 |
|---|---|---|
| 90% | 2.0% | 约 1.0 万次 |
| 80% | 4.0% | 约 1.9 万次 |
| 70% | 6.0% | 约 2.9 万次 |
| 50% | 10.0% | 约 4.8 万次 |
✅ 勘误:本文档初版预估"触发率约 15%",实测重估为 2%~10%。 初版之所以偏高,是因为形态规则写错(把身份证误判为一寸照片)产生了大量假冲突,从而错误触发 VLM。 修正形态规则后,冲突大幅减少,成本也随之下降 60%~85%。
⚠️ 上表的"相册来源中 20% 需 VLM"为保守假设,需在开发期用真实数据实测标定。
冲突裁决表(核心规则)
| 用户槽位(声明) | 识别结果 | 置信度 | 系统动作 | 用户看到 |
|---|---|---|---|---|
| A | A | 任意 | ✅ 通过 | 无感 |
| A | B | ≥ 0.9 | 🟡 提示 + 一键移动 | "这张看起来是学籍表,不是身份证。要移过去吗?" |
| A | B | 0.7–0.9 | 🟡 软提示,不强制 | "这张不太像身份证,请确认一下" |
| A | B | < 0.7 | 放行 | 无感 |
| A | 无法识别 | — | 放行 | 无感 |
| 无槽位(散图) | A | ≥ 0.9 | ✅ 自动归入 | — |
| 无槽位 | A | 0.7–0.9 | 建议归入,可改 | "建议归到「学籍表」" |
| 无槽位 | 无法识别 | — | 进入「待人工归属」 | 拖拽归位界面 |
🔒 三条不可违背的原则
- 只提示,不自动改位置(散图除外) 识别必然有误判。自动改位置比传错更危险——它会把用户原本放对的文件挪走。唯一的例外是散图分拣:那里本来就没有位置,自动归入是无害的。
- 识别结果不覆盖用户的声明 即使用户把身份证传到了"学籍表"槽位,系统也只是提示;最终位置由用户决定。
- 识别不出 ≠ 材料错 新材料类型、无文字的图片、模糊件都可能识别失败。识别失败一律放行,不得阻断提交。
集成点
| 场景 | 时机 | 动作 |
|---|---|---|
| 填报上传 | 每次上传后(异步) | 冲突时提示 + 一键移动 |
| 提交前总校验 | 提交时 | 汇总"疑似传错"清单,按 🟡 警告呈现 |
| — | 已取消(2026-10) | |
| — | 已取消(2026-10) | |
| 审核辅助 | 班主任查看时 | 材料卡片上显示"系统判定:身份证 92%" |
| 规则优化 | 定期 | 用人工纠正确认的结果反哺关键词表 |
异常与降级
| 情况 | 处理 |
|---|---|
| OCR 服务不可用 | 降级为仅文件名 + 形态判定,不阻断 |
| VLM 超时(>5s)或失败 | 放弃识别,以用户槽位为准,放行 |
| 图片无法解码 | 交压缩模块报错处理 |
| 遇到系统中不存在的新材料类型 | 不判断,放行 |
| 同一文件被识别为多个材料且置信度接近 | 归入"待确认",提示用户选择 |
性能要求
- 识别为异步执行,不阻塞上传与提交;
- 规则层(含关键词匹配)单文件 ≤300ms;
- VLM 兜底 5s 超时,超时即放弃。
3.6 命名规范化逻辑
目标:无论填报人交上来什么名字,系统都输出 姓名-证件号-材料名.后缀。
处理步骤
| 步骤 | 做什么 | 关键判断 |
|---|---|---|
| 1 | 剥离扩展名 | 循环剥离,直到没有已知扩展名为止(解决 .jpg.jpg) |
| 2 | 提取证件号 | 从文件名中找出最长的 15–18 位号码片段 |
| 3 | 证件号归一化 | 补齐位数、末位 x 统一为大写;位数不足或校验不通过时启动裁决(见下) |
| 4 | 材料名识别 | 用材料别名表做最长匹配("在职证明""工作证明扫描件"→ 统一为"工作证明") |
| 5 | 姓名识别 | 取剩余的中文串;与名册比对,做形近字/同音字纠错 |
| 6 | 组装 | 按模板拼接,清理非法字符,重名自动加序号 |
| 7 | 标记 | 标注本次是"全自动""已修复""待确认"还是"需人工" |
证件号争议裁决表(核心规则)
| 文件名中的号 | 名册中的号 | 判定结论 | 系统动作 |
|---|---|---|---|
| 校验通过 | 校验通过 | 两个都是真实有效号码 → 疑似两人材料 | 🔴 不自动改,必须人工确认(串档) |
| 校验不通过 | 校验通过 | 文件名写错了 | ✅ 自动按名册改正 |
| 校验通过 | 校验不通过 | 名册可能录错 | 🟡 提示管理员核对名册 |
| 位数不足 / 无法校验 | 校验通过 | 文件名残缺 | ✅ 按名册补齐 + 🟡 标黄供确认 |
| 名册中查无此人 | — | 非本任务人员 | 转"待认领"队列 |
这条规则的价值:把"证件号到底谁对"从人的判断变为算法的判断。实测 5 个人工疑点中,3 个可自动处理,只有 1 个必须人工。
姓名纠错规则
| 情况 | 判定 | 动作 |
|---|---|---|
| 与名册姓名不一致,但只差 1 个字且拼音相同(如"扬晨"↔"杨晨") | 高置信 | 自动改为名册姓名 |
| 与名册姓名不一致,差 1 个字但拼音不同 | 中置信 | 🟡 标黄,由填报人或班主任确认 |
| 与名册姓名完全不一致(如 3 个字都不同) | 低置信 | 🔴 标红,转人工 |
材料名别名表(可维护)
| 规范名 | 接受的别名 |
|---|---|
| 一寸照片 | 1寸照片、一寸电子照片、证件照、照片、免冠照 |
| 身份证 | 身份证正反面、身份证扫描件、身份证正面、身份证反面 |
| 学籍表 | 学籍证明、在读证明、学籍卡 |
| 工作证明 | 在职证明、工作证明扫描件、个人申报表、申报表、单位证明 |
| 学信网备案表 | 学信网学历备案表、学历证书电子注册备案表、备案表 |
| 其它佐证材料 | 毕业证书、社保个人权益单、职称证明、技能等级证书、佐证 |
异常分支
| 情况 | 处理 |
|---|---|
文件名完全无法解析(如 IMG_20260924_0932.jpg) |
保留原名 + 标红"需人工";同时提供"手动指定归属"入口 |
| 同一人同一材料出现多个版本 | 版本号递增,默认取最新;旧版本保留可回溯 |
| 规范后与他人重名 | 追加序号(如 ...身份证(2).jpg),并提示 |
| 材料名与内容不符(如"工作证明"里其实是申报表) | 以规则的规范名为准(机构要求如此),不擅自改名 |
3.7 压缩逻辑(扫描件强制 1M)
3.7.1 核心决策
D1:所有材料,包括 A4 扫描件,一律强制输出 ≤ 1M。不设例外、不提供体积放宽选项。
由此确定约束的优先级:
| 约束 | 性质 | 冲突时的取舍 |
|---|---|---|
| 输出体积 ≤ 1M | 硬约束 | 不可协商 |
| 分辨率与清晰度(DPI / 质量) | 软约束 | 冲突时牺牲清晰度,但必须标记 |
| 原始文件保留 | 保障措施 | 始终保留 30 天,用于复核与重出 |
✅ 重大实测结论(2026-09-24,用 28 张真实扫描件完整实测)
"体积 ≤1M" 与 "清晰度" 根本不冲突。 按 A4 等比缩放至标准扫描分辨率 300dpi(2480×3508)、质量 85 编码:
输出参数 平均体积 最大体积 达标情况 300dpi / q90 958 KB 964 KB ✅ 28/28(余量仅 6%,不推荐) 300dpi / q85 806 KB 831 KB ✅ 28/28 ← 默认参数 300dpi / q80 718 KB 740 KB ✅ 28/28 300dpi / q75 653 KB 673 KB ✅ 28/28 400dpi / q80 1070 KB 1078 KB ❌ 全部超标 结论:
- 输出的是标准 300dpi 扫描件,清晰度零损失,认定机构没有正当理由拒收。
- 整班 444MB → 22MB,压缩率 95%;单张处理约 2 秒。
- 下文 3.7.3 的"逐级降质"路径作为兜底保留,但预计 100% 不会触发。
- §3.7.4 的"清晰度牺牲标记 + 人工抽检"机制实测中不会产生任何待抽检文件,作为极端情况的安全网保留。
📌 参数可随实际情况调整:若某些批次扫描件内容更复杂(如满页手写、彩色底纹),系统会自动进入兜底路径,无需人工干预。
3.7.2 材料形态识别与档位
系统先识别材料属于哪种物理形态,再套用对应策略(不能对所有图片用同一把尺子):
| 档位 | 形态 | 典型材料 | 尺寸策略 | 输出格式 |
|---|---|---|---|---|
| P1 证件照 | 标准证件照(比例 5:7) | 一寸照片 | 固定 295×413 px | JPG |
| P2 证件翻拍 | 手机翻拍(有透视变形) | 身份证、备案表 | 长边控制在 1400–2400 px | JPG |
| P3 扫描件 | A4 纸张扫描件(超高像素) | 工作证明、申报表 | 按 A4 等比缩放,用 DPI 控制 | JPG |
| P4 截图 | 屏幕截图(比例接近 16:9) | 学籍表 | 保持原始像素,不缩放 | PNG |
| P5 文档 | PDF / Word | 各类文档 | 页面重采样 |
形态自动判定依据:像素总量、宽高比、格式、压缩特征。判定置信度低时,回退到管理员为该材料指定的档位。
3.7.3 压缩执行顺序(关键逻辑)
压缩有两个可调旋钮:采样率(尺寸) 和 编码质量。二者的使用顺序按形态区分:
| 形态 | 顺序 | 原因 |
|---|---|---|
| 文字类(P3 扫描件 / P4 截图) | 先降采样,后降质量 | 文字与印章是"高对比边缘"。质量降低会在笔画边缘产生锯齿状噪点(JPEG 伪影),直接破坏可读性;而等比重采样是可控的平滑,对文字更友好 |
| 照片类(P1 证件照 / P2 翻拍) | 先降质量,后降采样 | 人脸细节对重采样敏感(一缩放就"糊脸"),对轻度质量下降反而不敏感 |
P3 扫描件的完整压缩路径(一次编码到位)
1. 形态确认为 A4 扫描件
2. 判断是否需要先做安全降采样(像素过大时先降到安全区,见 3.7.5)
3. 方向校正 + 色彩统一 + 剥离隐私信息(GPS、设备型号)
4. 用默认参数直接编码一次:
A4 等比缩放至 300dpi(2480×3508),JPEG 质量 85
5. 测量输出体积:
≤ 1M → 直接输出,结束 ← 实测本批 28/28 走这条
> 1M → 进入兜底路径(第 6 步)
6. 兜底路径(预计极少触发;参数按形态区分顺序):
300dpi/q80 → 300dpi/q75 → 300dpi/q70
→ 240dpi/q80 → 200dpi/q80 → 180dpi/q75 → 150dpi/q70
→ 120dpi/q65 → 继续降采样直至达标
7. 写回清晰度等级(见 3.7.4)
实测参考值(A4 扫描件,JPEG 编码)
| 输出 DPI | 质量 | 平均体积 | 结论 |
|---|---|---|---|
| 300 | 90 | 958 KB | ✅ 达标但余量小,不采用 |
| 300 | 85 | 806 KB | ✅ 默认参数 |
| 300 | 80 | 718 KB | ✅ 备选 |
| 300 | 75 | 653 KB | ✅ 备选 |
| 400 | 80 | 1070 KB | ❌ 超标,不可用 |
| 500 | 80 | 1452 KB | ❌ 超标,不可用 |
📌 与初始推算的差异:本文曾推算"要压进 1M,A4 扫描件只能取 150–170dpi",该推算错误。 原因是文档扫描件以白底为主、内容稀疏,压缩率远高于照片(照片的 1M 上限确实需要大幅降质,文档不需要)。
3.7.4 清晰度标记与人工抽检
这是"强制 1M"的必要配套机制——既然存在有损的可能,就必须让人知道哪些文件损了。
✅ 实测说明:在 28 张真实扫描件上,默认参数(300dpi/q85)全部直接达标,因此不产生任何 🟡 或 🔴 文件。本机制作为极端情况(满页手写、彩色底纹、内容极复杂)的安全网保留,不会给班主任增加日常负担。
系统为每个文件打一个清晰度等级:
| 等级 | 判定条件 | 系统动作 |
|---|---|---|
| 🟢 优 | DPI ≥ 200 且质量 ≥ 75 | 直接通过 |
| 🟢 良 | DPI 150–200 | 通过 |
| 🟡 可 | DPI 120–150 | 通过 + 进入抽检清单 |
| 🔴 强制压缩 | DPI < 120,或触达质量地板 | 通过 + 必须人工确认 + 界面醒目标记 |
抽检机制
- 每个任务生成一份《压缩质量抽检清单》,列出所有 🟡 与 🔴 文件。
- 班主任/管理员在审核界面可一键只看这些文件。
- 抽检认为不可接受的,可驳回要求重传(并提示"请用手机拍摄而非扫描仪扫描")。
- 抽检结论回写到文件记录,用于后续参数优化。
3.7.5 超大图的保护逻辑
真实数据中存在 1.6 亿像素的扫描件(约 1272dpi A4)。这类图片如果不做保护,会直接拖垮服务器。
保护规则
- 处理前先只读取图片的头部信息取得宽高,不解码像素。
- 像素数超过 5000 万 → 先做一次流式降采样到安全区,再进入正常流程。
- 单个文件处理超过 20 秒 → 中断并转入后台队列,页面显示"处理中"。
- 单文件像素上限 2 亿、体积上限 50MB,超出直接拒绝并提示。
- 内存与并发:图片处理占用的内存远大于 CPU,因此并发数按内存反推设定,不能按 CPU 核数设定。
3.7.6 二次有损防护
问题:如果客户端先压一次、服务端再压一次,图片会被"有损压缩两遍",清晰度损失远大于一次到位。
规则
- 客户端只做无损操作:方向校正 + 尺寸限幅,不做有损质量压缩。
- 最终编码由服务端一次性完成,参数只在服务端确定。
- 服务端检测到"该图已被明显有损压缩过"(如体积远小于同尺寸的合理值)时,不再压缩,只做格式与命名处理,并标记"疑似过度压缩"。
3.7.7 其他材料的压缩逻辑
| 材料 | 处理 |
|---|---|
| 一寸照片(P1) | 先降质量(85→80→76→72),触底后按比例缩尺寸;最终统一输出 295×413 px |
| 身份证(P2) | 长边压到 2400px 以内但不得低于 1400px;低于 1400px 的原始图不压缩,标记"分辨率不足" |
| 学籍表(P4) | 保持原始像素,输出 PNG,仅做无损优化;不缩放、不转 JPG(转 JPG 会让文字边缘发虚) |
| 图片本身已 <1M | 仅做命名规范化与格式确认,不重新压缩(避免无谓降质) |
| 图片体积过小且分辨率过低 | 标记"疑似过度压缩",提示重传(体积小不等于合格) |
3.7.8 失败与异常
| 情况 | 处理 |
|---|---|
| 压缩后仍 >1M 且已触达下限 | 继续降采样直至达标(强制路径),标记为强制压缩 |
| 图片损坏 / 无法解码 | 保留原图,提示"文件无法识别,请重新上传" |
| 输出体积异常小(如 30KB) | 标记"疑似过度压缩",进入抽检 |
| 处理超时 | 转后台异步,不阻塞用户 |
| 用户重传同一材料 | 以新版本重新走完整流程,旧版本保留 |
3.8 校验逻辑
校验的三层呈现:🔴 阻断(不可提交)/🟡 警告(可提交但需确认)/🟢 通过。
| 编号 | 规则 | 触发时机 | 级别 | 反馈给谁 | 系统动作 |
|---|---|---|---|---|---|
| V1 | 身份证号格式与校验位 | 输入时 / 上传后 | 🔴 | 填报人 | 高亮错误位置,要求核对原件 |
| V2 | 证件号与名册一致 | 输入时 / 上传后 | 🔴 | 填报人 | 展示名册值,按裁决表处理 |
| V3 | 姓名与名册一致 | 输入时 | 🟡 | 填报人 | 给出形近字建议 |
| V4 | 同一人跨材料证件号一致 | 每次上传后 | 🔴 | 填报人 | 标出是哪两份材料冲突 |
| V5 | 材料完整性(必传项) | 提交时 | 🔴 | 填报人 | 列出缺失清单,附上传入口 |
| V6 | 文件格式白名单 | 上传时 | ��”´ | 填报人 | 自动转换或提示重传 |
| V7 | 文件体积上限 | 上传时 | 🔴 | 填报人 | 自动压缩;压不动才提示 |
| V8 | 图片可读性(分辨率过低 / 全黑 / 全白 / 严重模糊) | 上传时 | 🟡 | 填报人 | 提示重新提供(重扫描 / 索取原图) |
| V9 | 重复文件(同一文件被多次上传) | 上传时 | 🟡 | 填报人 | 提示"与 XX 的材料重复" |
| V10 | 身份证有效期是否过期 | OCR 后 | 🟡 | 填报人 | 提示 |
| V11 | 名册内证件号重复 | 名册导入时 | 🔴 | 管理员 | 指出具体行号 |
| V12 | 材料内容与类型不符(如"身份证"位传了风景照) | OCR 后 | 🟡 | 填报人 | 提示疑似传错,提供"移到正确材料项"入口 |
校验的展示原则
- 一次性列出全部问题,不做"改一个报一个"的循环;
- 每个问题必须包含三要素:哪里错、错成什么、怎么改;
- 阻断项必须给出直达修复的入口(点击跳转到对应字段/材料)。
3.9 审核逻辑
触发:填报人提交后进入待审队列。
班主任初审逻辑
- 打开待审列表:默认按"异常优先"排序,红黄项排前面。
- 列表呈现:每行一个学生,含头像、姓名、班级、各材料缩略图、状态色点。
- 一键批量通过:只对"全部材料均为 🟢 且无待确认项"的学生生效;任何有红黄项的自动跳过,不允许被批量带过。
- 逐项审核:查看大图、可对比原图与处理后的图、查看校验问题清单。
- 处理动作:
- 通过 → 进入待终审
- 驳回 → 必须选择原因(提供常用原因快选),可补充文字
- 审核超时:超过设定时长未处理,系统每小时提醒一次,并升级通知管理员。
管理员终审逻辑
- 只能看到"初审通过"的填报单。
- "全部通过"按钮仅在整批零红黄项时可用(防止管理员大而化之地放行)。
- 终审通过后默认锁定,不再允许学生修改。
驳回逻辑
- 驳回必须带原因,原因是结构化选项 + 可选文字补充。
- 学生收到通知后修改,重新提交,回到初审(不是回到终审,除非该单此前已在终审环节被驳回)。
- 驳回次数累计,达到上限(默认 3 次)自动提醒管理员介入。
- 驳回记录全部留痕,审核时间轴对学生可见(让学生知道进度)。
审核行为的边界
| 情况 | 规则 |
|---|---|
| 班主任帮学生代传材料 | 允许,但记录操作人;审核界面标注"由 X 老师代传" |
| 班主任批量通过后发现有错 | 支持在进入终审前撤回单个学生的通过结论 |
| 审核人变更(换班主任) | 支持转交,历史审核记录保留原审核人 |
| 同一份单被两个人同时审 | 以后提交的动作为准,前面的人收到"该单已被 XX 处理"提示 |
3.10 汇总导出逻辑
触发:管理员点击"导出"。
处理步骤
- 前置检查:扫描导出范围内所有文件,若存在"命名未规范 / 体积超 1M / 存在红项未处理"的文件,直接报错并列出清单,不允许打包。(对应 §2.4 铁律 2)
- 范围确定:默认只导出"已通过终审"的记录;可选按班级、按人员筛选。
- 目录结构生成(默认规范,可配置):
{批次号}-{任务名}/
├── 24中技数控1班/
│ ├── 一寸照片/ 张三-360121200010101234-一寸照片.jpg
│ ├── 身份证/ 张三-360121200010101234-身份证.jpg
│ ├── 学籍表/ 张三-360121200010101234-学籍表.jpg
│ └── 工作证明/ 张三-360121200010101234-工作证明.jpg
├── 24中技数控2班/
└── 考生线下报名信息导入模板(汇总).xlsx
- 汇总 Excel:合并所有填报字段,一行一人,并附完成情况。
- 分卷压缩:超过设定单包体积(如 50MB)时自动分卷,便于上传与传输。
- 异步执行:导出在后台进行,页面显示进度,完成后通知。
- 有效期:导出包默认保留 7 天,过期自动清理(避免长期堆积大文件)。
输出:可下载的压缩包(分卷)与汇总 Excel。
异常分支
| 情况 | 处理 |
|---|---|
| 有文件未通过终审 | 报错并列出名单,提供"仅导出已通过者"的选项 |
| 有文件命名不规范 | 报错并列出,提供"立即修复"入口(一键重新规范化) |
| 导出过程中有人提交新数据 | 以导出任务创建时刻的快照为准,不动态变化 |
| 导出包过大 | 自动分卷;或提示"建议按班级分批导出" |
3.11 通知与催报逻辑
通知渠道优先级:微信订阅消息(首选)→ 服务号模板消息 → 短信(兜底,计费)。
触发点与内容
| 触发点 | 发给谁 | 内容要点 |
|---|---|---|
| 任务发布 | 全体应填人 | 任务名、截止时间、填报入口 |
| 临期提醒 | 尚未提交者 | 剩余天数、未完成项 |
| 提交成功 | 填报人 | 已提交、进入审核 |
| 审核驳回 | 填报人 | 驳回原因、修改入口 |
| 审核通过 | 填报人 | 已通过 |
| 待审提醒 | 班主任 | 有多少人待审、超时人数 |
| 超时升级 | 管理员 | 哪个班主任有单超时未处理 |
| 导出完成 | 管理员 | 下载入口与有效期 |
催报规则
- 自动催报:截至日前 7 天、3 天、1 天、当日各一次,只催未提交者,不打扰已完成的人。
- 手动催报:班主任/管理员可随时对指定人员或"全部未提交者"发起。
- 频次保护:同一人同一天最多收到 2 条催报(防止打扰引发反感)。
- 夜间免打扰:22:00–08:00 不发送。
订阅消息额度管理(重要) 微信的一次性订阅消息需用户逐次授权,发几次就消耗几次,额度很容易耗尽。
对策:
- 填报人首次进入时一次性请求多条订阅授权,并引导其勾选"总是保持以上选择";
- 系统记录每个人剩余的授权额度,额度不足时自动降级到服务号或短信;
- 产品层减少催报次数、提升一次填完率(减少返工即减少通知)。
3.12 历史数据整理器逻辑 —— 已取消(2026-10 需求收敛)
⚠️ 整节作废:历史整理器(含"散图分拣"与《材料体检报告》)连模块、表、接口、权限码、 PC 页面与原型屏一并删除,不再排期。
它当年复用的是同一套规则(形态识别 → 命名规范化 → 压缩 → 校验),这条"规则引擎只有一套"的 设计结论仍然成立,只是不再有"处理历史乱文件夹"这个入口。
4. 一页纸规则速查
材料来源
- ❌ 不提供"直接拍照"——所有材料都是已有文件(截图、扫描件、照相馆电子版)
- 三个入口:① 微信聊天记录(主力)→ ② 手机相册 → ③ 聊天/手机文件
- 优先引导用户从聊天记录选:那里能拿到原始文件名,系统可直接读出姓名+证件号+材料名
- 相册来的图没有文件名(
IMG_0001.jpg)→ 只能靠 OCR,须让用户确认归属
报考范围(从名单聚合,不是外部文件)
- ❌ 不存在"认定机构下发的计划清单文件"——实测确认名单里已填好报考三项(28/28)
- 范围 = 名单中「职业 × 工种 × 等级」的聚合结果,存
collect_task.plan_scope_json - 一致性体检比范围校验更有价值:单看一行都合法,但"38 人报数控车工、2 人报车工"只有聚合后才能发现
- 追加名单必须告警:超出已确认范围的报考项需管理员确认——这是范围失控的主要入口
- 参考字典只提示拼写、不阻断(机构可能有非常规职业名)
字段三类规则(决定学生填多少字)
- 🔒 锁定:姓名、身份证号、报考职业/工种/等级 → 只读,名单为空则阻断发布
- ✏️ 预填可改:其余字段 → 名单有值则预填标"老师已填,请核对"并可改;空则学生必填
- 📄 材料:学生上传 —— 这是学生唯一的重活
- 实测老师名单已填满 21 项中的 18 项 ⇒ 学生端几乎不用打字
表单填写(官方模板 21 字段)
- 报考职业/工种/等级必须在"本期报考范围"内 —— 从源头防错
- ⚠️ 官方 Excel 模板里「报考职业」「报考工种」根本没有下拉(21 列中 13 列自由填写)→ 这正是我们相对模板的核心增量
- 补考科目数:三/四/五级最多 1 科;一/二级最多 2 科;专项职业能力没有补考
- 是否在校生=是 → 在读学校/所学专业/入学时间三项必填,入学时间 YYYY-MM-DD
- "无"是合法业务值,不是空值(工作单位、报考工种都可能填"无")
- 专项职业能力:无工种、无等级、无补考,三项整体跳过
- 官方要求:手动输入时只能填下拉选项里有的值
准入(门禁)
- 两种模式都必须先导名单,没有名单不能填报
- 进入填报前必须填写「姓名 + 身份证号」匹配名单,不通过只提示、不放行
- 匹配失败不区分原因(防止探测身份证号),只给「重新填写」一个出口 + 提示联系老师加人
- 匹配接口必须限流(同 openid 每小时 ≤10 次)
- 姓名形近字/同音字可纠错,但必须让用户确认后才通过
命名
- 目标:
姓名-证件号-材料名.后缀 - 证件号争议:名册优先,但"两个号码都合法"时必须人工
- 姓名纠错:差 1 字且拼音相同 → 自动;否则标黄/标红
- 无法解析 → 保原名 + 标红,绝不乱猜
材料识别(这是什么材料)
- 四层递进:① 文件名(能定就定)→ ② 形态(只分流派,不定型)→ ③ OCR 强词计分(在流派内定死)→ ④ VLM 兜底
- 形态层不能区分「一寸照片」和「身份证」——二者宽高比高度重叠(0.714 vs 0.732–1.016),必须靠内容层
- 一寸照片永远是零文字 → "文字量 < 5 字"是最干净的判据
- 关键词必须只用强词 + 加权计分,通用词(姓名/学校/专业/出生)全是噪声
- 只提示、不自动改位置(散图分拣除外)——自动挪位置比传错更危险
- 识别不出 ≠ 材料错,识别失败一律放行
- 实测:文件名层 100%、形态分流 99.1%、内容层 100%;VLM 触发率仅 2%~10%
压缩(强制 1M)
- 体积 ≤1M 是硬约束,扫描件无例外
- 默认参数:A4 等比缩至 300dpi(2480×3508)+ 质量 85 ← 实测 28/28 达标,平均 806KB,清晰度零损失
- 一次编码到位;只有超限才进兜底路径(先降采样、后降质量)
- 兜底触发下限(<120dpi)→ 标记"强制压缩",必须人工确认(实测不会触发)
- 客户端的活:只做方向校正 + 尺寸限幅;最终编码只在服务端做一次
校验
- 三层:🔴阻断 / 🟡警告 / 🟢通过
- 一次列全,每条必须含"哪里错 + 错成什么 + 怎么改"
审核
- 批量通过只带绿色项,红黄项一律不放过
- 驳回必须选原因;驳回后回到初审
- 终审通过即锁定
导出
- 有不合格文件直接拒绝打包(铁律 2)
- 只导出终审通过的;目录结构可配置;默认 7 天清理
通知
- 只催未提交者;同日同人 ≤2 条;夜间免打扰
- 订阅消息额度有限,必须管理剩余额度
5. 异常与边界场景
用真实数据中的 28 人 / 112 个文件作为场景库。
| # | 场景 | 输入的实际情况 | 系统判定 | 输出给用户 | 是否需人工 |
|---|---|---|---|---|---|
| 1 | 学生把照片传给了别人 | 陈子文的一寸照片用的是另一个人的证件号 | 两个号码校验位都通过 → 不是打字错误,是两个人 | 🔴"这张照片上的证件号和你其他材料不一致,请检查是否传错" | ✅ 必须 |
| 2 | 学生证件号填错 | 于豪身份证文件名末 6 位倒置 | 文件名号码校验失败、名册通过 → 文件名错 | ✅ 自动按名册改正,提示"已自动纠正" | ❌ 自动 |
| 3 | 学生姓名写了错别字 | 扬晨(应为杨晨),证件号正确 | 差 1 字 + 拼音相同 → 高置信 | ✅ 自动改为"杨晨" | ❌ 自动 |
| 4 | 文件名多了一个后缀 | 工作证明、身份证共 56 份 .jpg.jpg |
循环剥离扩展名 | ✅ 自动修复 | ❌ 自动 |
| 5 | 文件名少了个横杠 | 曾伊豪、徐程宇的身份证文件 | 识别到证件号前后无分隔符 | ✅ 自动补上 | ❌ 自动 |
| 6 | 证件号少了一位 | 曹文锋一寸照片仅 17 位 | 位数不足无法校验 → 名册兜底 | 🟡"已按老师名单补齐,请确认是否正确" | 🟡 确认 |
| 7 | 学生传了扫描仪扫的 16MB A4 | 10517×15445、1272dpi | P3 扫描件档 → A4@300dpi/q85 | ✅"17.1MB → 810KB,清晰度无损" | ❌ 自动 |
| 8 | 学生传的证件照只有 558×745 | 杨晨身份证 0.08MB | 长边低于 1400px → 分辨率不足 | 🟡"这张图有点小,可能看不清。可以让对方发一张原图,或从聊天记录里选那份带文件名的" | 🟡 确认 |
| 9 | 学籍表是系统截图 | 1025×590、PNG | P4 截图档 → 不缩放、保持 PNG | ✅ 不处理,仅规范命名 | ❌ 自动 |
| 10 | 学生填到一半退出了 | 网络中断、切后台 | 草稿已本地暂存 | 重新进入提示"继续上次填写" | ❌ |
| 11 | 学生提交后又改了主意 | 已提交待审 | 未进入审核前允许撤回 | "已撤回,可继续修改" | ❌ |
| 12 | 学生重复提交同一份材料 | 传了两次身份证 | 版本号递增 | 保留最新,旧版本可回溯 | ❌ |
| 13 | 学生把身份证传到了照片项 | 材料名与内容不符 | OCR 识别出不是证件照 | 🟡"这张看起来不是一寸照片,是否移动到身份证?" | 🟡 |
| 14 | 名单里没有这个人 | 转班生/插班生/名单漏录 | 门禁匹配失败 | 🔴"没有找到你的信息。请核对姓名和身份证号是否与老师提供的名单一致" | ✅ 老师把此人加进名单 |
| 15 | 同一人在两个班的名单里 | 转班未清理旧名单 | 命中两条 | 列出两个班级让本人选择,结果通知管理员核对 | 🟡 |
| 16 | 班主任批量通过后发现错了 | 有人红项被漏看 | 批量通过只带绿项,理论上不该发生 | 支持在终审前撤回;审计留痕 | 🟡 |
| 17 | 任务截止了但学生要补交 | 学生忘交 | 任务已截止 | 提示"已截止";管理员可延长截止或点名放行 | 🟡 |
| 18 | 班主任离职/换人 | 账号停用 | 待办无人处理 | 支持转交;超时自动升级通知管理员 | 🟡 |
| 19 | 导出时有人材料不全 | 3 人未完成 | 前置检查不通过 | 🔴 报错并列出名单,提供"仅导出已通过者" | 🟡 |
| — | 已取消(2026-10:整理器模块删除) | — | |||
| 21 | 学生从聊天记录选了照相馆发来的照片 | 文件带原始名 张三-...-一寸照片.jpg |
文件名可读 → 直接提取姓名/证件号/材料名 | ✅ 一次通过;文案"已按文件名自动识别" | ❌ 自动 |
| 22 | 学生从相册选了截图 | 文件名为 IMG_4821.PNG,1025×590 |
无文件名信息 → 走 OCR + 人工确认归属 | 🟡"这张图没有名字信息,已识别为学籍表,请确认" | 🟡 确认 |
| 23 | 学生从聊天记录收到的是被微信压缩过的图 | 分辨率明显偏低 | 低于建议值 | 🟡"这张图可能被压缩过,建议让对方发原图" | 🟡 确认 |
| 24 | 聊天记录里的文件已过期/被清理 | 选不到该文件 | 通道不可用 | 提示"请让对方重新发送,或从手机文件里找,也可请老师代传" | ❌ |
| 25 | 学生姓名打成"扬晨"(名单是"杨晨") | 形近字 | 身份证号命中 + 姓名纠错命中 | 🟡"你是不是 杨晨?" → 确认后通过 | 🟡 确认 |
| 26 | 有人反复试别人的身份证号 | 尝试枚举名单 | 触发限流 | 🔒 锁定并提示"操作过于频繁,请稍后再试";记录 openid | ❌ 系统自动拦截 |
| 27 | 同一个名单项被两个人绑定 | 冒用 / 代填冲突 | 已被绑定 | 🔴"该信息已被登记,如有疑问请联系老师" | 🟡 |
| 28 | 老师忘了导入名单就想发布任务 | 操作遗漏 | 发布前校验不通过 | 🔴"请先导入名单,名单必须包含姓名和身份证号" | ❌ 阻断发布 |
| 29 | 学生把学籍表传到了"身份证"槽位 | 槽位与内容冲突 | 规则层识别出关键词"学籍",置信度 0.93 | 🟡"这张看起来是学籍表,不是身份证。要移过去吗?"[一键移动] | 🟡 用户确认 |
| — | 已取消(2026-10) | — | |||
| 31 | 学生传了一张纯色背景的图 | 一寸照片(无文字) | 形态规则:5:7 比例 + 背景纯净 → 置信度 0.88 | 🟡"请确认这张是一寸照片" | 🟡 确认 |
| 32 | 学生把正确材料放在正确位置,但因图糊识别失败 | 槽位与内容无法比对 | 置信度 <0.4 → 不判断 | ✅ 直接放行(不因识别失败而打扰用户) | ❌ 系统静默放行 |
6. 用户可见文案规范
6.1 三条原则
- 不用术语——不说"证件号校验位不通过",说"身份证号和老师名单上的不一样"。
- 指出位置——必须告诉用户是哪一份材料、哪一个字段有问题。
- 给出动作——每条错误都要有"接下来做什么",并提供直达入口。
6.2 文案对照表
| 场景 | ❌ 不要这样写 | ✅ 应该这样写 |
|---|---|---|
| 证件号不符 | 身份证号校验失败 | 身份证号第 16 位和老师名单上的不一样,请核对身份证原件(名单上是 3601...6619) |
| 疑似串档 | 跨材料一致性校验未通过 | 这张"一寸照片"上的身份证号是 3601...4232,和你其他材料不一致,请确认是否传错文件 |
| 分辨率不足 | 图片分辨率低于阈值 | 这张照片有点小,放大后可能看不清,建议重新拍一张 |
| 压缩受限 | 压缩比未达标 | 这张图内容太复杂,压到最小还是超过 1M,建议用手机拍一张更清晰的 |
| 缺材料 | 必填项校验失败 | 还差 1 项:学籍表。点击去上传 → |
| 公章不清 | 图像质量评分不足 | 照片有点模糊,公章可能看不清,建议找打印店重新扫描一份 |
| 任务已截止 | 任务状态异常 | 本次填报已在 9 月 20 日截止。如需补交,请联系你的班主任 |
| 姓名不符 | 姓名匹配度低 | 老师名单上的名字是"杨晨",你写的是"扬晨",是同一个字吗? |
| 材料从哪来 | — | "这份材料一般在微信聊天记录里:照相馆/打印店发给你之后,从这里选,系统能自动帮你填好信息" |
| 相册图片无名字 | 无法解析文件名 | "这张图没有名字信息,系统已识别为学籍表。请确认是不是这一份" |
| 聊天图片被压缩过 | 图片分辨率偏低 | "这张图好像被微信压缩过,有点糊。可以让对方发一张原图,或者点开图片后选『原图』再保存" |
| 门禁:匹配失败 | 未找到该身份证号 / 姓名不匹配 | "**没有找到你的信息。**请核对姓名和身份证号是否与老师提供的名单一致。如确认已报名,请联系老师把你加入名单" |
| 门禁:姓名疑似写错 | 身份证对、姓名形近 | "你是不是 杨晨?(老师名单上写的是这个名字)" |
| 门禁:已被绑定 | 名单项已绑他人 | "该信息已被登记,如有疑问请联系老师" |
| 门禁:限流 | 尝试过于频繁 | "操作过于频繁,请稍后再试" |
| 门禁:格式错误 | 身份证位数/校验位不对 | "身份证号看起来不太对(应该是 18 位),请再核对一下" |
| 材料传错位置(高置信) | 槽位与识别冲突,置信度 ≥0.9 | "这张看起来是学籍表,不是身份证。要移过去吗?" [移动] / [不用,就放这里] |
| 材料存疑(中置信) | 置信度 0.7–0.9 | "这张不太像身份证,请确认一下" |
| 识别失败(静默) | 置信度 <0.7 或无冲突 | ——(不提示,直接放行,避免制造噪音) |
6.3 好消息也要说
处理成功的反馈同样重要——让用户看见系统替他做了什么:
- "文件名已自动规范化:
...110身份证.jpg.jpg→...110-身份证.jpg" - "体积已压缩:17.1MB → 900KB(省了 95%)"
- "全部 4 项材料已齐全,可以去提交了"
这类反馈是让家长/学生愿意继续用下去的关键——他们能直观看到"这个系统真的帮我干活了"。
7. 未决事项
| # | 事项 | 影响 | 需谁确认 |
|---|---|---|---|
| 1 | 取得认定机构对"300dpi 扫描件"的书面认可(D1 已定强制 1M,实测 300dpi 下 28/28 达标且清晰度零损失,此项已无技术争议,仅走确认流程) | 中 | 认定机构 |
| 2 | — | ✅ 已闭环 | |
| 3 | — | ✅ 已闭环 | |
| 4 | 分辨率不足的判定阈值(建议长边 1400px)需认定机构确认 | 中 | 认定机构 |
| 5 | 截图类材料保持 PNG 是否会被拒收 | 中 | 认定机构 |
| 6 | 抽检机制由谁执行、抽检比例 | 低(实测不产生待抽检文件) | 客户 |
| 7 | 驳回次数上限默认 3 次是否合适 | 低 | 客户 |
| 8 | 导出包默认保留 7 天是否够用 | 低 | 客户 |
| 9 | 各来源通道的实际体积上限需实测(微信聊天记录选文件、相册、文件选择三条通道各自能传多大的文件),并据此设计超限提示与降级路径 | 中 | 研发 |
| 10 | 微信相册/相机权限的隐私声明需在小程序后台同步更新(当前声明需覆盖"从相册选择") | 中 | 研发 + 法务 |
| — | 已关闭 | ||
| 12 | 门禁限流阈值(同 openid 每小时 10 次)是否合适,需按实际人数与使用习惯标定 | 中 | 研发 |
| — | 已关闭 | ||
| 14 | 门禁核验是否还要加手机号验证码(防止他人拿到姓名+身份证号后代填) | 中 | 客户 |
| 15 | 材料识别的 VLM 选型与单价(用于成本核算与供应商比价);触发率 15% 为预估值,需用真实数据实测标定 | 中 | 研发 + 商务 |
| 16 | 关键词表由谁维护(平台预置 + 租户自维护);是否需要"从历史文件自动学习关键词"功能 | 中 | 产品 |
| 17 | 一寸照片的纯形态判定阈值(宽高比容差、背景纯净度)需用真实样本标定 | 中 | 研发 |
| 18 | 强特征词表需在更多批次数据上补充标定——学信网备案表、其它佐证材料在本数据集中不存在,其强词尚未定义 | 高 | 产品 + 研发 |
| 19 | 需要补充测试困难场景:模糊件、翻拍反光、非标准材料,当前 112 个样本未覆盖 | 高 | 研发 |
| 20 | — | 产品 | |
| — | ✅ 已闭环 | ||
| — | ✅ 已闭环 | ||
| 低 | 产品 | ||
| 24 | 是否允许学生修改"老师预填"的字段? 本版设计为"可改并留痕"(依据:电话有 28 个不同值、入学时间可能记错)。若机构要求严格一致,需改为"只读 + 申请修改" | 中 | 客户 |
文档结束