======= 测试管理系统 H5 · 冷启动文件 ======= > 版本: 2.3 | 更新: 2026-09-16 | 用途: 测试管理系统(研发任务 H5 模块)的冷启动/重建/排障手册 > 入口: https://rd.huiflytech.com/test/ | 数据库: ~/docs/test/test.db | 服务: rd-h5.service (:13544) > > **v2.3 更新(2026-09-16 晚)**: > ① ★ **电路测试分类拆分** —— 原「电路测试」31 项拆为 **功能性能(28) / 环境可靠性(高低温) / 机械应力(振动·跌落)**;两组各有独立「其他测试」:**电路组=三防漆性能测试**(内部名 `其他测试2`)、**结构组=扭力测试** > ② 分类导航**二级选择通用化**(原硬编码仅"结构测试"生效)→ 点「电路测试」显示 4 个子模块;`CAT_LABEL` 让内部名 `其他测试2` 显示为「其他测试」 > ③ **历史会话迁移**:`category 电路测试 → 功能性能`(#6/#7);`/api/test/sessions` 查询「功能性能」兼容旧「电路测试」 > ④ `CIRCUIT_CATS` + `isCircuitCat()` 统一「电路类」判定(基础信息字段/报告按钮/整机报告配对) > > **v2.2 更新(2026-09-15 ~ 09-16)**: > ① **设备编码扫码记录** —— 所有测试项通用 + 测试员开放;jsQR 本地内嵌(`/test/jsqr.js`);折叠列表(序号/编码/时间/删除);`items.t_codes` 三链路保存 > ② **连续耐久循环测试**(施肥机)—— 按天记录;**温度矩阵:行=测试时间(可增删)× 列=电机/减速器/泵头**;当日**天气/气温/机油**;自动当日时长 + 总运行时长;报告三格式支持 > ③ **施肥机类型**(原"阀体类型")4 种:软管泵集成 / 液体肥 / 固液两用 / 多通道;报告标题/字段/文件名按设备类型区分 > ④ **气密功能放宽**(不限阀体类型,项名含"气密"即可)+ 气密数据**默认折叠** + 阀体类型新增**直通阀**(14 种) > ⑤ **设备文档列表加「← 返回设备类型」按钮**(backDev) > ⑥ **报告按钮统一命名** Web报告/Word报告/PDF报告;Web 批量表表头**改黑字** > ⑦ **报告生成时间可自定义**(`sessions.report_time`,编辑页可填,留空用当前时间) > ⑧ **不合格数量/率 0 也显示**(原空白) > ⑨ 修复 8 个 bug:测试员保存结构化数据丢失(swtime)|耐久项记录数据不可用(分支漏判 + durOf 函数名冲突)|耐久第2天保存失败(basePayload 抛错被空 catch 吞)|任务负责人被判只读(全名 vs 简称)|生成日报 500|气密记录方式单选框缺失|测试总数口径 ====== 0. 教程与文档 ====== - 测试员快速使用教程(以 #15 为例,含 PDF):~/docs/测试管理系统-测试员快速使用教程.md/.pdf;Wiki 页 测试管理系统h5:测试员快速使用教程 ====== 1. 系统概述 ====== 测试管理系统用于研发样机/阀门的**整机与电路测试全流程管理**:按设备类型(智慧阀门/施肥机/土壤墒情/气象站/蝶阀/LoRa网关)建立测试文档,预置模板测试项(电路 32 项/阀体 21 项),逐项记录测试数据与照片,输出报告。 **★ 铁律**:测试模块开发/修改绝不动任务(rd_h5)与库房(rd_store)功能;独立蓝图/独立库/独立页面。 ====== 2. 部署架构 ====== - 统一服务 rd-h5.service(:13544,Flask 多蓝图:rd_h5 + rd_store + test_api);Caddy 反代 rd.huiflytech.com→:13544;/test/ 路由在 test_api.py - ⚠️ **服务 venv = /home/ubuntu/projects/ctwing-2/venv**(非 huifei venv!python-docx 等须装在此 venv) - Word 导出:python-docx(横向排版含照片);PDF 导出:docx→libreoffice(soffice --headless) - 底部导航 5 tab(任务/库房/测试/评审会/我的)在 rd_h5.html 内嵌 tabbar ====== 3. 数据文件 ====== - `~/docs/test/test.db`(SQLite) - **sessions**:id/device_type/category/series/fw_ver/hw_ver/tester(负责人)/test_time/zc_no(物料编码)/supplier/batch_no/valve_type/sample_photo(样品照片;分隔)/remark(备注)/status/created - **items**:id/session_id/item_name/t_condition/t_method/t_tool/t_steps/t_result(通过/未通过)/t_data(测试数据)/t_followup(检查调整复测/设计变更)/t_ecr(变更详情)/t_photo/t_person/t_time/t_qty(测试数量)/t_struct(气密结构化 JSON) - `~/docs/test/templates.json`:设备类型 6 + 分类 + 电路 32 项/阀体 21 项模板 - `~/docs/test/attachments/`:照片/附件 - `~/docs/test/report_seq.json`:报告流水号计数(日期+3位当日增序) ====== 3.1 数据结构速查(items.t_struct 各形态) ====== | 测试项类型 | 触发 | t_struct 结构 | |---|---|---| | 气密(全量) | 项名含"气密" | `{"mode":"full","step1":{"opens":[],"press":[],"time":"","cells":{}},"step2":{...},"meta":{parts:{}}}` | | 气密(批量) | 记录方式=批量记录 | `{"mode":"batch","batch":{"per_batch":"160","total_batches":"4","step1":{cells:{}},"step2":{...}},"meta":{...}}`;cells 键 = `开度\|压力` → `{批次: {渗漏(台)/滴漏/重漏/流淌: 值}}` | | 开关阀时间 | 项名含"开关阀" | `{"swtime":{"cfg":{"open_max","close_max"},"step1":{"rows":[{t,note}]},"step2":{"rows":[]}}}` | | 扭力 | 项名含"扭力" | `{"torque":{"cfg":{...},"step1":{"rows":[]},"step2":{"rows":[]}}}` | | 连续耐久循环 | 项名含"耐久" | `{"mode":"durability","tempInterval":"30","daily":[{"date","s","e","weather","airTemp","oil","times":["08:30"],"cells":{"电机\|08:30":"45.2"},"temps":[] }]}`(`temps` 为旧结构,`durMigrate` 自动迁移;`durFixOrphan` 并入空键)| **sessions 关键列**:`device_type / category / valve_type(施肥机时为施肥机类型) / supplier / batch_no / zc_no / tester / test_time / status / remark / sample_photo / archived / report_time(报告生成时间,可空)` **items 关键列**:`item_name / t_qty / t_struct / t_codes(扫码记录 JSON) / t_recs(时段) / t_photo / t_note / t_logs(操作记录) / status / t_result` ====== 4. 核心功能 ====== ===== 4.1 设备类型与分类 ===== 设备 6 类;智慧阀门含 电路测试/阀体测试 两分类(其余设备默认单类) ===== 4.2 测试项交互(历次定稿) ===== - 测试项以 **图标+名称列表**显示(图标按内容自动映射:功耗🔋温度🌡️扭力🔧气密💨防水💧…);点击进入单项详情页(所有测试信息+保存+返回+单项报告) - 每测试项字段:测试名称/测试数量/测试条件/测试方法/测试工具/测试步骤/测试数据/测试结果(☑通过☐未通过→处理方式:检查调整复测/设计变更(必填详情))/测试照片(拍照+图库双入口)/测试人员(文字输入)/测试时间 - 报告导出:空 测试人员/时间 → 横线 "______________"(打印手填) - 新建会话先弹**测试项选择器**(勾选需要的测试项,默认全选;可全选/全不选) - 基本信息:物料编码(🎲 随机 WL-日期-6位 / 手动)、备注栏、样品照片;阀体类型 **14 种**固定下拉(三通L/T型旋塞阀、三通L/T/D型球阀、**直通阀(2026-09-15 新增)**、双球阀、五通球阀、三通L陶瓷阀、五通单/双开陶瓷阀、双头/三头/四头阀) - 会话列表:标题=供应商·阀体类型;下方显示 测试总数/测试系统/测试结果(后端 sessions API 聚合 agg_total/agg_system/agg_result) ===== 4.3 气密性测试结构化(**2026-09-15 放宽:任何阀体,测试项名含"气密"即可** —— 原限制为 阀体类型 ∈ 三通L型旋塞阀/三通L型球阀/三通L陶瓷阀) ===== - **触发条件**:测试项名含"气密"(`isQtyStruct()`,不再判断阀体类型);标题"💧 气密性测试数据" - **默认折叠**(2026-09-15):气密数据区用 `
` 折叠(管理员"💧 气密性测试数据(点击展开)"、测试员"💧 气密性测试数据表(点击展开填写)"),点击展开后功能不变 - **记录方式二选一**: - **全量记录**:两步法(第1步堵B口看A口/第2步堵A口看B口),每步 开度 0-100%×6 多选 × 压力 0.5-4bar×4 多选 × 时间 10分-8小时×8 单选 → 数据表 行=开度×压力、列=台1..N(>10台分行每10台一区块);每格下拉 正常(默认)/渗漏/滴漏/重漏/流淌 - **批量记录**:每批数量+总批数 → 两步同样开度/压力/时间配置 → **每个开度/压力点一张表**:9 指标行(测试总数/合格数量/合格率/不合格数量/微渗/渗水/微漏/漏水/测试总时长)× 批数列(>5批分行每5批一区块),每格手动输入 - **公共信息 meta**:测试系统(智慧阀门批量测试系统/研发阀体模拟测试台下拉)、测试目的(预填:通过系统性的气密性测试,识别并评估阀杆位置、左右出水口位置及压力传感器位置是否存在漏水隐患)、检验部位 4 项 checkbox(阀门左侧出口/右侧出口/阀杆位置/压力传感器位置) - **参考标准**(详情页可折叠 + 报告固定输出):漏水等级定义 5 级表(无泄漏/渗漏渗水/滴漏/重漏/流淌 + 表现特征/说明)+ 合格判定规则 3 条((1)无渗漏及以上→合格 (2)渗漏或滴漏→复测确认,复测仍同→不合格 (3)重漏或流淌→直接不合格) - **t_struct JSON**:{mode: full|batch, meta:{system,purpose,parts{部位:true}}, step1/step2:{opens[],press[],time,cells{"开度|压力":{台号或批号:{指标:值}}}}, batch:{per_batch,total_batches,...}} - 详情页数据表显示数据(统计口径,默认正常);**Word/PDF 报告表格空白**(打印手填)——全量台表报告空白;批量报告显示录入值 ===== 4.4 报告(2026-09-08 定稿) ===== - 4 级:单项报告 / 电路测试报告 / 阀体测试报告 / 整机测试报告(full=同机电路+阀体合并) - 三格式:网页版(API 默认 text/html)+ **Word ?fmt=docx + PDF ?fmt=pdf** - 内容全字段:基本信息(阀体类型/供应商/批号/物料编码/负责人/测试时间/备注/样品照片)+ 测试项全字段(含测试数量)+ 气密附加(系统/目的/部位/等级表/规则/数据表) - 格式美化:蓝色主题信息卡 + 深蓝表头白字 + 斑马纹 + 圆角照片 + 页脚(时间+公司) - **文件名/首行标题**:`智慧阀门阀体(阀体类型)测试报告(日期+3位当日流水号,如 20260908001).docx/pdf`;docx 第一行内容=文件名 - 空字段横线(打印手填);流水号存 report_seq.json ====== 4.5 手机号+验证码注册用户(测试员,2026-09-08) ====== - 注册登录:手机号+短信验证码(阿里云短信:AK/Secret/SIGN=慧飞数字科技秦皇岛/TEMPLATE=SMS_338340195 存 ~/.hermes/.env;SDK 装服务 venv ctwing-2;同一号码**每分钟限1条**;失败兜底钉钉群 webhook;验证码存 ~/docs/test/sms_codes.json 5 分钟有效) - 用户表:~/docs/test/wx_users.json {手机号: {created}};登录态 localStorage wx_user(受限身份)或 rd_user(钉钉,不受限) - 权限:手机号注册用户=测试员 → **仅可保存 测试数据(t_data)/测试人员(t_person)/测试时间(t_time)**;前端详情页仅显示这 3 项;禁新建/删除(403) - ⚠️ **数据保护警示(2026-09-08 事故)**:wx 保存若走全量替换会把 items 其他字段(t_struct/条件/方法)覆盖为空——曾致 #15 气密数据清空(已从 git 备份恢复)。修复方案待上线:后端 wx 分支改逐项合并 UPDATE(不删行不整表替换)+ t_struct 空值不覆盖;恢复命令 `git show <提交>:docs/test/test.db` 取备份库手动导数据 - 前端:页头身份条(未登录→手机号注册弹层;钉钉 rd_user 显示 👤 名;wx 显示 📱138**** 受限);initAuth/wxReg/smsSend/wxLogin ====== 4.6 测试项与批量记录(2026-09-08~09 定稿) ====== - 测试项字段:状态(status:⏳未开始/🔄进行中/✅已完成 默认未开始)、条件=温度+湿度两输入(合成"温度X℃,湿度Y%"存 t_condition)、数量、方法/工具/步骤、结果勾选+处理方式、照片(**JSON [{u,d}] 描述+可分别删除**,兼容旧 ; 分隔)、人员、时间 - 测试项可删除(列表 🗑,全权限用户;保存信息后生效);**测试数据文本框已去掉**(t_data 保留历史) - 批量记录 v3/v4(2026-09-09):输入 总台数+每批台数 → **自动分批 ceil**(不足一批按实际,850/160→6批末批50);批次行号=阿拉伯数字;**列=批次|测试总数(自动=该批实际台数)|不合格数量(自动=四漏相加)|不合格率(自动)|微渗|渗水|微漏|漏水(7列,测试总时长列已删)**;合格数量列已删;**微渗/渗水/微漏/漏水默认显示0,不合格数量/不合格率按默认0自动算并显示**;前端 setBatchCell 后自动重算行;Web 报告显示自动值,Word/PDF 空白打印 - 批量数据模型:t_struct.batch{per_batch,total_qty,total_batches(自动),step1/2{opens,press,time,cells{ck:{批:{指标:值}}}}} - 文档级状态=测试项 status 汇总:全未开始→未开始/任一进行中→进行中/全已完成→已完成(后端 sessions 列表 agg_status,不再用手工会话状态) - 阀体测试文档隐藏整机报告按钮(整机从电路侧生成);"保存会话"改名"保存信息" - ⚠️ 报告导出 _report_fname/_next_seq 位于 _batch_html 与 _export_test_docx 之间——整函数替换该区间会误删定义 → Word 500;恢复命令参考 git 历史(多次踩坑) ====== 4.7 测试员权限(手机号注册,v7 定稿 2026-09-09) ====== - 可编辑:气密表格数据(t_struct cells)/测试状态(status)/测试人员/测试时间/**测试照片(v7 新增:上传+描述+删除)** - 只读:基本信息/条件/方法/步骤/结果/配置/新建/删除/保存信息按钮 - 后端 tester-update:逐项合并 UPDATE items SET t_person,t_time,t_struct,status,t_photo WHERE session_id+item_name(不删行不整表不碰 sessions) - 详情页:状态下拉+人员/时间+📷照片+(气密项 wxStructTable 表格,配置只读);wx 保存=saveItem 直 POST 单行落库 - 姓名设置:GET /api/test/wx/info、POST /api/test/wx/name(存 wx_users.json {mobile:{name}});页头点击身份条→菜单(设置姓名/退出) - 历史:v4 曾去掉 t_data 权限;v6 加回照片;**用户多次微调,改前 git 留痕** ====== 4.8 权限体系与归档(2026-09-09) ====== - 角色:admin(武燕青/accounts.json)|user 普通(钉钉登录默认,不能删除测试文档,其他权限都有)|tester(手机号注册,仅 表格数据/状态/人员/时间/照片)|guest 游客(查看为主,不可删/归档) - 判定:/api/test/me?user=;后端 `_role()`;写接口校验(DELETE/归档 admin only;归档文档非 admin POST 403) - 测试员保存=tester-update 逐项合并 UPDATE(t_person/t_time/t_struct/status/t_photo,不删行不碰 sessions);saveItem 直落库;"保存信息"对测试员无效 - 用户管理:点标题"🧪 测试管理系统"→ 菜单(第1级:👥用户管理[仅admin]/📖用户手册[全员,读测试员教程 md 实时渲染])→ 第2级用户列表(/api/test/users admin 全量,其他仅本人) - 归档:sessions.archived;文档按钮"📦 归档"(admin);归档后非 admin 全只读(lockEdit+openItem 只读视图+后端 403);列表"📦 已归档(N)"灰底折叠分组(localStorage archFold) - 手机号测试员详情(openItem IS_WX):状态下拉+人员/时间+📷照片+气密表格(wxStructTable,配置只读);wx 身份条设置姓名/退出 - 事故教训:**权限验证误用真实#15 空保存清数据(从 git 7161fc7 恢复)**——以后对真实文档验证一律临时会话;git DB 快照=救命备份(改动后及时 commit) ====== 4.9 报告体系(2026-09-09 定稿) ====== - Web(_render_report):主表数据列=文本摘要(测试目的首行);气密明细块(📋标题+等级定义表+判定规则+批量/全量数据表)整宽显示在主表下方(after_blocks) - Word/PDF:**v2 竖版全新设计**(_docx_v2/_export_test_docx_v2/_export_test_pdf_v2):A4 竖版、标题装饰线、蓝色信息卡(两字段一行)、主表蓝表头白字+斑马纹 7 列(方法与工具/步骤合并列;气密项数据列="详见气密性测试明细");明细块:📋标题→检验部位(☑/☐ 复选框置顶)→漏水等级定义表→合格判定规则**表格化**(序号/判定情形/判定结果)→批量数据表(批次×7指标,自动列绿底)/全量台表(台号×结果竖版);旧横向 _test_doc/_export_test_docx 保留可回退 - 文件名流水号 _report_fname/_next_seq(在 _batch_html 与 _export_test_docx 间,整函数替换会误删→Word 500 坑) - docx v2 要点:helper _shade/_par_bottom_border/_cell_text 需各自内 import(Pt/send_file/subprocess 局部导入坑) ====== 4.10 测试项字段定稿(2026-09-09) ====== - t_purpose:**所有测试项名称下测试目的**(items 列,报告数据列首行显示);气密 meta 区"测试目的/测试系统"已去掉(meta 保留 system/parts 历史数据不展示;检验部位 parts 在 docx ☑显示) - 状态 status(未开始/进行中/已完成)+ 文档级汇总 agg_status;条件=温度/湿度合成;照片 JSON [{u,d}];t_data 文本框已去掉(历史保留) ====== 4.11 批量记录每批独立台数与配置(2026-09-09 晚定稿) ====== - 交互:总批数(≤100)→ 自动展开"第1批~第N批"台数输入(默认 160、每批 ≤160 校验、超限红字拒绝)→ 总台数 = Σ各批自动显示(总批数后实时更新);生成表格每行"测试总数(自动)"= 该批自己台数,不合格率按该批算 - 存储:batch.total_batches + batch.each_qty {1:x,...}(per_batch 160 兜底)+ total_qty=Σ;报告 Web/Word/PDF 与测试员表按 each_qty - 步标题 = "第1步:堵住A口,调节A口开度,调节水压 / 第2步:堵住B口,调节B口开度,调节水压(共N批·总数X台)" - 压力选项 PRESS 加 3bar(0.5/1/2/3/4);**新选项不影响已存文档**(配置保存于 struct,需管理员重配或 DB 补) - ★勾选实时同步(bSync):开度/压力/时间 checkbox/radio 变更立即写内存——否则重生成/重开/保存还原旧配置(用户实测踩坑 2 次) - 旧数据兼容:#15 多次修复(3bar 补/去0.5/只留100% opens=['100%']);tester-update t_struct 合并写(配置保持库值仅合并 cells,防测试员旧页面覆盖配置——168958f) - 批量改版历程:总台数/每批自动分批(ceil+末批实际)→手动"批数+每批台数"→"批数+逐批独立台数(each_qty)"(最终版) ====== 4.12 测试备注与验证码(2026-09-09 晚) ====== - t_note:每个测试项"测试结果"下一行输入框(现场情况/测试内容),**测试员可编辑**(tester-update 白名单加 t_note);报告 Web 数据列+Word/PDF 结果列显示;归档只读视图显示 - 验证码:**只走阿里云短信直发手机**(去掉钉钉群 webhook 兜底);失败明确报错"请1分钟后再试"(阿里云分钟级流控同号 1 条);sms_codes.json 存 5 分钟码(可查询/告知用户) ====== 4.13 测试项字段与操作记录(2026-09-09 晚定稿) ====== - **测试时段多行**(items.t_recs JSON [{n,s,e}]):测试人员/开始时间/结束时间一行一组,[+增加一行] 可加多组、每行 ✕ 删;单行紧凑布局(姓名 60px + 时间 calc 均分);旧 t_person/t_time_s/t_time_e 兼容为首行 - **测试备注** t_note(结果下一行;测试员可编辑) - **操作记录**(items.t_logs JSON [{t,u,d}],测试项详情最底部显示,**测试员不显示但照常采集**;上限 300 条): - 记录内容具体化:修改 diff(如"修改:点 100%/1bar 第2批 渗漏 由 0 改为 2")、新增/删除记录行(带组合)、记录行组合修改(1-E1 → 2-E3)、状态变更、备注更新、上传照片、保存 - **保存去重**:fpOf 指纹比对,无改动重复点保存不新增记录;打开详情初始化指纹 - 采集即时刷新(logAdd 后 refreshLogView;refreshLogView try 保护) - **样品拍摄对测试员可用**:lockEdit 豁免 data-allow-wx;上传即落库 /api/test/sample/(归档非 admin 拒) - 批量表指标改名:微渗/渗水/微漏/漏水 → **渗漏/滴漏/重漏/流淌**(全库数据键迁移);等级表加 **等级编号 E0-E4** 列,"渗漏/渗水"→"渗漏";检验部位 5 项(左侧出口/右侧出口/阀杆位置/压力灌胶/压力密封圈) - 批量表**行列互换**:行=7 指标(测试总数/不合格数量/不合格率 自动绿底 + 渗漏/滴漏/重漏/流淌 手填),列=第1批..第N批 - 批量表**自定义行**(所有用户):[➕增加行] 首格=位置▾(1-5)+等级▾(E1-E4) 组合(无连字符、格宽紧凑),✕ 删除;原表固定行列不增减;数据存 cells 键 "C:位置-等级" - 批量输入:总批数(≤100)+ 逐批台数(默认 160、≤160);总台数=Σ 自动显示;步标题"共N批·总数X台" - 两步描述:第1步 堵住A口,调节A口开度,调节水压 | 第2步 堵住B口,调节B口开度,调节水压 - 抽气/压力选项 PRESS 加 3bar;**bSync 勾选即时写内存**(防旧配置还原);tester-update 的 t_struct 合并写入(保留库配置仅并 cells) - 故障排查经验:字符串替换脚本 assert 中断会导致"部分未落盘"(本轮多处踩坑:partsChk/logAdd/df 描述)→ 改后必须 curl ?v=N 抽