From fd2dfbdfb8bdbdfcc7e958f2d1823aed0a239703 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Thu, 11 Jun 2026 15:55:55 +0800 Subject: [PATCH] Add analysis judgment, history storage, and report/Excel export Calculation (calculator/domain): - Material types (main body / hollow / decorative) with tiered limits - Validity judgment (37 Bq/kg exemption + Ur(IRa) k=2 threshold) - Critical-value verdict via true-value interval vs limit (pass/fail/ need-more), decorative A/B/C cascade - GUM expanded uncertainty U and analytical interval P2.5/P97.5 - Single-measurement support (n=1, uA=0); fix Type-A term to include a Persistence & export (src-tauri): - SQLite history via rusqlite (save/list/get/delete, filtered list) - Excel export via rust_xlsxwriter with native Save-As dialog - Report view (A4) with print-to-PDF UI: - Tabs (calculate / history), save-to-history, report preview - Logo-matched navy + gold theme, widened layout, density polish Co-Authored-By: Claude Opus 4.8 (1M context) --- .../specs/2026-06-11-judgment-logic-design.md | 245 ++++++++++ .../2026-06-11-persistence-report-design.md | 152 ++++++ ...果分析软件开发计算逻辑(1).pdf | Bin 0 -> 249404 bytes src-tauri/Cargo.lock | 267 +++++++++- src-tauri/Cargo.toml | 4 + src-tauri/src/db.rs | 361 ++++++++++++++ src-tauri/src/excel.rs | 217 +++++++++ src-tauri/src/main.rs | 89 +++- src/calculator.rs | 171 +++++-- src/domain.rs | 135 ++++- src/lib.rs | 5 +- tests/calculator_tests.rs | 198 ++++++-- ui/public/logo.png | Bin 0 -> 2997 bytes ui/src/App.tsx | 461 +++--------------- ui/src/CalculatorPanel.tsx | 416 ++++++++++++++++ ui/src/HistoryTab.tsx | 202 ++++++++ ui/src/ReportView.tsx | 189 +++++++ ui/src/styles.css | 362 +++++++++++--- ui/src/types.ts | 195 ++++++++ 19 files changed, 3138 insertions(+), 531 deletions(-) create mode 100644 docs/superpowers/specs/2026-06-11-judgment-logic-design.md create mode 100644 docs/superpowers/specs/2026-06-11-persistence-report-design.md create mode 100644 docs/建材放射性检测结果分析软件开发计算逻辑(1).pdf create mode 100644 src-tauri/src/db.rs create mode 100644 src-tauri/src/excel.rs create mode 100644 ui/public/logo.png create mode 100644 ui/src/CalculatorPanel.tsx create mode 100644 ui/src/HistoryTab.tsx create mode 100644 ui/src/ReportView.tsx create mode 100644 ui/src/types.ts diff --git a/docs/superpowers/specs/2026-06-11-judgment-logic-design.md b/docs/superpowers/specs/2026-06-11-judgment-logic-design.md new file mode 100644 index 0000000..3451e80 --- /dev/null +++ b/docs/superpowers/specs/2026-06-11-judgment-logic-design.md @@ -0,0 +1,245 @@ +# 判定逻辑补全设计(二期) + +> 关联文档:一期设计 `2026-05-15-rust-tauri-mvp-design.md`;需求来源 `docs/建材放射性检测结果分析软件开发计算逻辑(1).pdf`。 + +## 1. 目标 + +一期已完成算法骨架(IRa/Ir、A/B 类不确定度、GUM 合成、MCM 仿真)。本期补齐 PDF 第 3、6 节缺失的**判定层与输出层**,使软件能给出最终交付给用户的"有效性 + 合格/不合格 + 材料分级"结论,而不只是中间量。 + +补齐范围: + +- 1.3 样品信息:材料类型选择与对应限值集。 +- 2.2.4–2.2.6:扩展不确定度 U、k=1/k=2 相对扩展不确定度、GUM 解析真值区间 P2.5/P97.5。 +- 3.1 有效性判定(37 Bq/kg 低活度豁免 + Ur(IRa) 阈值)。 +- 3.2 临界值判定(真值区间是否跨越极限值 → 合格/不合格/建议增加次数)。 +- 3.2.3 装饰装修材料 A/B/C 三级分类。 +- 单次测量(n=1)主流程支持。 +- 6.1 输出元信息(样品编号、计算日期)。 +- 修正合成不确定度中 A 类项缺少校准因子 `a` 的问题。 + +非目标(仍延后):SQLite 历史、Excel/PDF 报告导出。本期只在内存结构和界面上给出完整结论,导出留三期。 + +## 2. 与现状的差距映射 + +| PDF 节 | 现状 | 本期动作 | +|---|---|---| +| 1.3 材料类型 | 无,仅手填 limit | 新增 `MaterialType`,按类型派生限值 | +| 2.2.4 扩展不确定度 | 无 | `IndexResult` 增 `expanded_uncertainty` | +| 2.2.5 k=1/k=2 相对 | 仅一套(k=1) | 增 `relative_expanded_uncertainty_percent` | +| 2.2.6 GUM 真值区间 | 仅 MCM 百分位 | `IndexResult` 增 `p2_5/p97_5 = value ± U` | +| 3.1 有效性 | 仅 Ur≤20% 双指数 | 实现 37 Bq/kg 豁免,仅看 Ur(IRa) | +| 3.2 临界值判定 | 无 | 新增 `Verdict` 判定函数 | +| 3.2.3 A/B/C | 无 | 装饰材料级联分类 | +| 单次测量 | `count<2` 报错 | n=1 时 uA=0 放行 | +| 6.1 元信息 | 无 | 输入/输出增 `sample_id`、`calculation_date` | +| 合成不确定度 A 类项 | 漏 `a` 因子 | 修正为 `a·uA` | + +## 3. 领域模型变更(`domain.rs`) + +### 3.1 输入 + +```rust +pub struct SampleInput { + pub ra: NuclideMeasurements, + pub th: NuclideMeasurements, + pub k: NuclideMeasurements, + #[serde(default)] + pub material_type: MaterialType, // 新增,默认 BuildingMainBody + #[serde(default)] + pub sample_id: Option, // 新增 6.1 + #[serde(default)] + pub calculation_date: Option, // 新增 6.1,前端传 ISO 字符串 +} + +#[derive(Default)] +pub enum MaterialType { + #[default] + BuildingMainBody, // 建筑主体材料 IRa≤1.0, Ir≤1.0 + HollowBuildingMainBody, // 空心率>25%主体材料 IRa≤1.0, Ir≤1.3 + DecorativeMaterial, // 装饰装修材料 A/B/C 分级 +} +``` + +`AcceptanceLimits` 不再由前端手填,改为由 `MaterialType` 派生(保留结构体用于 MCM 比较)。装饰材料有多级限值,用一张分级表表达: + +```rust +pub struct LimitTier { pub label: &'static str, pub ira_limit: Option, pub ir_limit: Option } + +impl MaterialType { + /// 返回从严到宽的限值阶梯。主体材料/空心材料各 1 级;装饰材料 A/B/C 三级。 + pub fn tiers(&self) -> &'static [LimitTier] { /* 见下表 */ } +} +``` + +限值表(来自 PDF 3.2): + +| 材料类型 | 级别 | IRa 限 | Ir 限 | +|---|---|---|---| +| 主体材料 | 合格 | 1.0 | 1.0 | +| 空心率>25% | 合格 | 1.0 | 1.3 | +| 装饰装修 | A | 1.0 | 1.3 | +| 装饰装修 | B | 1.3 | 1.9 | +| 装饰装修 | C | — | 2.8 | + +> C 类只约束 Ir(`ira_limit = None`)。 + +### 3.2 指数结果扩展 + +```rust +pub struct IndexResult { + pub value: f64, + pub standard_uncertainty: f64, // u, 已有 + pub expanded_uncertainty: f64, // U = u·k (k=2),新增 + pub relative_uncertainty_percent: f64, // k=1,已有 + pub relative_expanded_uncertainty_percent: f64, // k=2,新增 + pub p2_5: f64, // value - U,新增(GUM 解析区间) + pub p97_5: f64, // value + U,新增 +} +``` + +指数包含因子固定 `k = 2`(PDF 2.2.4/2.2.6)。 + +### 3.3 判定结果 + +```rust +pub struct CalculationResult { + /* 既有字段 ... */ + pub analysis: AnalysisResult, // 新增 +} + +pub struct AnalysisResult { + pub total_calibrated_activity: f64, // A1·a+A2·b+A3·c + pub validity: Validity, + pub verdict: Verdict, +} + +pub enum Validity { + LowActivityExempt, // ≤37 Bq/kg,直接有效 + UncertaintyAcceptable, // >37 且 Ur(IRa)≤20% + Invalid, // >37 且 Ur(IRa)>20% +} + +pub enum Verdict { + Qualified, // 主体/空心:合格 + Unqualified, // 不合格 + DecorativeClass(DecorClass), // 装饰:A/B/C + NeedMoreMeasurements, // 真值区间跨越极限值,建议增加到 6 次 + InvalidResult, // 有效性不成立 +} + +pub enum DecorClass { A, B, C, Unqualified } +``` + +`Conclusion` 枚举保留(向后兼容),但 UI 主结论改用 `Verdict`。 + +## 4. 计算逻辑变更(`calculator.rs`) + +### 4.1 单次测量支持 + +`validate_input`:`count` 下限由 2 改为 1,且三核素次数一致。`type_a_uncertainty`:`n == 1` 时返回 `0.0`(PDF 2.2.1 uA=0),`n>=6` 走标准差法,`2<=n<6` 走极差法,`n` 其它非法值仍报错。 + +### 4.2 合成不确定度修正 + +校准比活度 `C = mean·a`,对测量值 A 的灵敏系数是 `a`: + +```rust +// 修正前: combined = sqrt(uA² + (mean·uB)²) +// 修正后: combined = sqrt((a·uA)² + (mean·uB)²) +let combined = ((factor*type_a).powi(2) + (mean*type_b_uncertainty).powi(2)).sqrt(); +``` + +n=1(uA=0)时与现状一致,可与 PDF 单次算例对齐校验。 + +### 4.3 GUM 真值区间 + +每个 `IndexResult` 计算 `U = u·2`,`p2_5 = value - U`,`p97_5 = value + U`,相对量两套(u/value 与 U/value)。 + +### 4.4 有效性判定(3.1) + +```rust +let total = ra.mean_calibrated + th.mean_calibrated + k.mean_calibrated; // A1·a+A2·b+A3·c +let validity = if total <= 37.0 { + Validity::LowActivityExempt +} else if ira.relative_expanded_uncertainty_percent <= 20.0 { + Validity::UncertaintyAcceptable +} else { + Validity::Invalid +}; +``` + +> **待确认 1**:3.1 的 `Ur(IRa)≤20%` 用 k=2 的相对扩展不确定度(与 2.2.5 命名一致)还是 k=1。本设计先取 k=2,见第 7 节。 + +### 4.5 临界值判定(3.2) + +核心是"真值区间 [P2.5,P97.5] 相对极限值 L 的位置"的三态函数: + +```rust +enum TierCheck { Pass, Fail, Straddle } // 全在限下 / 全在限上 / 跨越 + +fn check(idx: &IndexResult, limit: Option) -> TierCheck { + let Some(l) = limit else { return TierCheck::Pass }; // 无约束(如 C 类的 IRa) + if idx.p97_5 < l { TierCheck::Pass } // 区间不含 L 且值 < L + else if idx.p2_5 > l { TierCheck::Fail } // 区间不含 L 且值 > L + else { TierCheck::Straddle } // 区间含 L → 建议增加次数 +} +``` + +组合规则: + +- 若 `validity == Invalid` → `Verdict::InvalidResult`。 +- **主体/空心材料**(单级):IRa、Ir 两项 `check`。 + - 任一 `Straddle` → `NeedMoreMeasurements`。 + - 两项均 `Pass` → `Qualified`。 + - 否则(存在 `Fail`)→ `Unqualified`。 +- **装饰材料**(A→B→C 级联):自严到宽逐级判断。 + - 某级两项(C 级仅 Ir)均 `Pass` → 归该级(`DecorClass::A/B/C`)。 + - 某级存在 `Straddle` 且尚未在更严级别通过 → `NeedMoreMeasurements`。 + - 全部级别都不通过且 C 级 `Fail` → `DecorClass::Unqualified`(不可用于建材)。 + +### 4.6 与 MCM 的衔接 + +GUM 路径给出确定性 `Verdict`;当 `Verdict::NeedMoreMeasurements`(区间跨越极限值)时,MCM 的 `overall_fail_probability` 即 PDF 6.3 的"95% 置信概率下不符合概率",作为补充量化结论展示。MCM 仍每次都算(用当前限值),无需新增接口。 + +> **待确认 2**:6 次测量后若仍跨越极限值,最终合格判据用 MCM 不符合概率阈值(如 <5% 判合格)还是仅展示概率由人判断。现有代码用 `pass_probability>=0.95`,本设计沿用并在第 7 节标注。 + +## 5. 界面变更(`App.tsx`) + +- 顶部输入区:新增**材料类型**下拉(三选一)、**样品编号**输入、**计算日期**选择(默认今日)。移除手填 IRa/Ir 限值,改为根据材料类型只读展示当前限值表。 +- 结果区新增"**分析判定**"卡片: + - 有效性标签(有效/低活度豁免/无效)+ 总比活度 `A1·a+A2·b+A3·c` 与 37 对比。 + - 最终判定标签:合格 / 不合格 / A 类·B 类·C 类 / 建议增加至 6 次 / 结果无效。 + - 各指数 GUM 真值区间 `[P2.5, P97.5]`、U、相对扩展不确定度(k=1/k=2)。 +- 报告头展示样品编号与计算日期,为三期导出做准备。 + +类型定义(TS)同步扩展 `MaterialType`、`AnalysisResult`、`Verdict`、`IndexResult` 新字段。 + +## 6. 测试(`tests/calculator_tests.rs`) + +新增: + +- **单次测量对齐 PDF 算例**:A1=83.439/a=0.916 等,断言 IRa≈0.38、Ir≈0.73、u(IRa)≈0.012、U(IRa)≈0.024、P2.5≈0.36、P97.5≈0.40、Ur(IRa,k=2)≈6.3%。 +- **有效性**:total≤37 → `LowActivityExempt`;total>37 且 Ur 大 → `Invalid`。 +- **临界值三态**:构造区间全低/全高/跨越,断言 `Qualified`/`Unqualified`/`NeedMoreMeasurements`。 +- **装饰材料级联**:分别命中 A、B、C 与 Unqualified。 +- **合成不确定度修正**:多次测量下 A 类项含 `a` 因子(与手算对比)。 +- 既有 6 次测量与 MCM 测试保持通过(注意修正后数值会有小幅变化,需更新期望值)。 + +## 7. 已确认决策 + +1. **3.1 的 Ur(IRa) 取 k=2 的相对扩展不确定度**(`relative_expanded_uncertainty_percent`),与 2.2.5 命名一致。✅ 已定 +2. **6 次测量后的最终合格判据**:用 MCM 不符合概率,`overall_fail_probability < 5%`(即 `pass_probability ≥ 0.95`)自动判合格/不合格。✅ 已定 +3. **材料类型限值只读**:移除前端手填 IRa/Ir 限值,严格按材料类型派生。✅ 已定 + +仍按本设计默认处理、无需进一步确认: + +4. **计算日期来源**:由前端生成 ISO 字符串传入(本地时区可控,Rust 侧不引入 `chrono`)。 +5. **单次测量仍跑 MCM**:n=1 时 uA=0,MCM 仅传播 B 类不确定度,仍有意义,默认保留。 + +## 8. 实施顺序 + +1. `domain.rs`:`MaterialType`/限值表 + `IndexResult` 扩展 + `AnalysisResult/Verdict`。 +2. `calculator.rs`:单次测量、合成不确定度修正、GUM 区间、有效性、临界值判定。 +3. 补充/更新 Rust 测试至全绿(先对齐 PDF 单次算例)。 +4. `lib.rs` 导出新类型;`main.rs` 命令签名无需变更(结构体透传)。 +5. `App.tsx`:材料类型/样品信息输入 + 分析判定卡片。 +6. 端到端手测三类材料的合格/不合格/分级/建议增加次数路径。 diff --git a/docs/superpowers/specs/2026-06-11-persistence-report-design.md b/docs/superpowers/specs/2026-06-11-persistence-report-design.md new file mode 100644 index 0000000..dc9ba10 --- /dev/null +++ b/docs/superpowers/specs/2026-06-11-persistence-report-design.md @@ -0,0 +1,152 @@ +# 历史存储与报告导出设计(三期) + +> 关联:一期 `2026-05-15-rust-tauri-mvp-design.md`、二期 `2026-06-11-judgment-logic-design.md`。 +> 对应 PDF 第 6 节「输出」:样品编号、计算日期、最佳估计值、95% 置信区间、k=1 相对扩展不确定度、不符合概率。 + +## 1. 目标 + +一/二期已完成计算与判定。本期补齐"留痕与出报告"两块工程能力: + +- **历史存储**:每次计算的输入与结果落库,可检索、回看、复算、删除。 +- **报告导出**:将一次完整结果导出为可交付文件(PDF 检测报告 + Excel 数据表)。 + +非目标:多用户/权限、云同步、检测报告的官方排版模板(先满足内容完整、可打印)。 + +## 2. 范围 + +| 能力 | 内容 | +|---|---| +| 历史存储 | 保存/列表/详情/删除/复算一条记录 | +| Excel 导出 | 单条记录导出为 `.xlsx`(输入表 + 结果表 + 判定) | +| PDF 报告 | 单条记录导出为 A4 检测报告(中文) | +| 列表检索 | 按样品编号 / 日期范围 / 材料类型 / 判定结论过滤 | + +## 3. 数据模型与存储 + +### 3.1 选型 + +SQLite,经由 **`rusqlite`(bundled 特性)** 直接在 `src-tauri` 内访问,不引入 `tauri-plugin-sql`。理由:计算结果是结构化 JSON,存取简单;bundled 模式免去系统 SQLite 依赖,Windows 打包干净。 + +库文件位置:`tauri::api::path::app_data_dir()` 下的 `history.db`(随应用数据目录,卸载可清理)。 + +### 3.2 表结构 + +```sql +CREATE TABLE IF NOT EXISTS records ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + sample_id TEXT, -- 样品编号(可空) + material_type TEXT NOT NULL, -- MaterialType 序列化 + calc_date TEXT, -- 计算日期 YYYY-MM-DD + created_at TEXT NOT NULL, -- 入库时间 RFC3339(前端传入) + ira_value REAL NOT NULL, -- 冗余列,供列表展示/排序/过滤 + ir_value REAL NOT NULL, + validity TEXT NOT NULL, -- Validity 序列化 + verdict TEXT NOT NULL, -- Verdict 序列化(用于列表标签与过滤) + input_json TEXT NOT NULL, -- 完整 SampleInput + result_json TEXT NOT NULL -- 完整 CalculationResult +); +CREATE INDEX IF NOT EXISTS idx_records_created ON records(created_at); +CREATE INDEX IF NOT EXISTS idx_records_sample ON records(sample_id); +``` + +设计要点:完整 `input_json` / `result_json` 保证回看与复算的保真;冗余标量列只为列表查询与过滤,避免反序列化全表。 + +### 3.3 复算保真 + +复算 = 读 `input_json` → `calculate_sample` 重新计算。因 MCM 用固定种子,结果可复现,可与存档 `result_json` 比对作为一致性自检(库内核版本升级时用于回归)。 + +## 4. 后端命令(`src-tauri`) + +新增 Tauri 命令,全部返回 `Result<_, String>`: + +```rust +save_record(input: SampleInput, result: CalculationResult, created_at: String) -> i64 // 返回 id +list_records(filter: RecordFilter) -> Vec +get_record(id: i64) -> RecordDetail // 含 input + result +delete_record(id: i64) -> () +export_excel(id: i64, path: String) -> () // 写 .xlsx 到用户选定路径 +export_report(id: i64, path: String) -> () // 见第 6 节 +``` + +```rust +struct RecordFilter { + sample_id: Option, // 模糊匹配 + material_type: Option, + date_from: Option, + date_to: Option, + verdict_kind: Option, // "Qualified" / "Unqualified" / ... +} +struct RecordSummary { + id: i64, sample_id: Option, material_type: MaterialType, + calc_date: Option, created_at: String, + ira_value: f64, ir_value: f64, validity: Validity, verdict: Verdict, +} +``` + +数据库连接用 `tauri::State>` 在 `setup` 中初始化并建表。 + +新增 crate(`src-tauri/Cargo.toml`):`rusqlite { features = ["bundled"] }`、`rust_xlsxwriter`。PDF 方案见第 6 节(可能 0 依赖)。 + +## 5. Excel 导出 + +用 `rust_xlsxwriter`(纯 Rust、原生 UTF-8,无 CJK 字体问题)。生成单工作簿三段: + +1. **样品信息**:编号、日期、材料类型、有效性、最终判定。 +2. **测量与校准**:各次 Ra/Th/K 测量值;校准系数 a/U/k。 +3. **结果**:IRa/Ir 值、u、U、相对扩展不确定度(k=1/k=2)、真值区间;各核素均值/校准活度/A 类/B 类/合成;MCM 平均值/标准偏差/区间/合格概率/不符合概率。 + +路径经 `@tauri-apps/plugin-dialog` 的保存对话框选定,Rust 侧写文件。 + +## 6. PDF 报告 + +中文 PDF 字体内嵌是主要难点,给两条路线,**推荐路线 A**: + +- **路线 A(推荐)— Webview 打印**:前端用一个独立的、A4 排版的「报告视图」组件渲染完整结果,调用 `window.print()`(或 Tauri 打印 API),用户在打印对话框选「另存为 PDF」。零新依赖、零字体问题、排版用 CSS 即可,所见即所得。代价:依赖系统打印到 PDF,非完全静默导出。 +- **路线 B — Rust 生成**:`printpdf` + 内嵌中文子集字体(如 Noto Sans SC)。可完全静默、可定制页眉页脚,但需打包字体、自行处理换行与分页,工作量大。 + +建议本期落 A,把"报告视图"做成可复用组件(同一组件既用于屏幕预览也用于打印),路线 B 留作后续真正"一键静默导出"需求时再做。 + +报告内容(对应 PDF 6.1–6.3): + +- 抬头:样品编号、计算日期、材料类型、限值表。 +- 检测结果:IRa、Ir 最佳估计值;95% 真值区间 [P2.5, P97.5];k=1 / k=2 相对扩展不确定度。 +- 有效性判定(总比活度 vs 37)、最终判定(合格/不合格/A·B·C/建议增加次数)。 +- MCM:95% 置信概率下不符合概率。 +- 各核素中间量明细表。 + +## 7. 界面变更 + +- 顶部加「保存到历史」按钮(计算成功后可用);保存成功后提示。 +- 新增「历史」入口(抽屉或独立 Tab):列表(编号/日期/材料/IRa/Ir/判定)+ 过滤栏;行操作「查看 / 复算 / 导出 Excel / 导出 PDF / 删除」。 +- 「查看」打开报告视图(即打印用组件)。 +- 计算日期从已有的 DatePicker 复用,`created_at` 取前端当前时间戳。 + +## 8. 测试 + +- Rust:DB 用内存库(`:memory:`)测 save→list→get→delete 往返;过滤条件命中;`export_excel` 生成非空且能被重新打开(校验首部魔数/可解析)。 +- 复算一致性:存档 `result_json` 与重算结果逐字段相等(固定种子)。 +- 前端:报告视图快照(关键字段渲染)、历史列表过滤交互。 + +## 9. 已确认决策 + +1. **PDF 路线**:路线 A —— 前端 A4 报告视图 + `window.print()` 另存为 PDF。✅ +2. **历史入口形态**:顶部 Tab 切换(计算 / 历史两页)。✅ +3. **保存时机**:仅用户点「保存到历史」时入库,避免调参脏数据。✅ +4. **导出范围**:PDF 报告 + Excel 数据表都做(实现独立,可分批落地)。✅ + +## 9.5 实现说明(落地后补记) + +- **rusqlite 版本**:本地 Rust 为 1.93,`libsqlite3-sys 0.38` 使用了未稳定的 `cfg_select!`,编译失败。已将 `rusqlite` 固定为 `0.37`(拉取 `libsqlite3-sys 0.35`)规避。升级工具链到 ≥1.94 后可放开。 +- **Excel 落盘**:`export_excel` 写入系统下载目录(取不到则回退文档目录),返回完整路径,前端以提示展示,无需对话框插件。 +- **PDF**:前端 `ReportView` + `ReportModal`,「打印 / 导出 PDF」走 `window.print()`,打印 CSS 用 visibility 隔离 `.report-root`,仅输出报告本体(隐藏 Modal 外框与遮罩)。 +- **命令入参**:`save_record` 用 `SaveArgs` 结构体包裹 `input/result/created_at`,避免 JS↔Rust 多词参数名映射歧义。 +- **f64 存储**:完整结果以 JSON 落库;serde_json 解析可能有 ~1e-14 的末位 ULP 偏差,对指数无实际影响,测试以容差比较。 + +## 10. 实施顺序 + +1. `src-tauri`:加 `rusqlite`,`setup` 建表 + 连接 State。 +2. 实现 save/list/get/delete 命令 + Rust 往返测试。 +3. 前端历史列表 + 过滤 + 保存按钮。 +4. 报告视图组件(屏幕预览)→ 接 `window.print()` 出 PDF。 +5. `rust_xlsxwriter` 导出命令 + 保存对话框。 +6. 端到端:算→存→列表过滤→查看→导出。 diff --git a/docs/建材放射性检测结果分析软件开发计算逻辑(1).pdf b/docs/建材放射性检测结果分析软件开发计算逻辑(1).pdf new file mode 100644 index 0000000000000000000000000000000000000000..283e2cd4085585fcd6e060b95fe19c3b1495b9ef GIT binary patch literal 249404 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 |&#MxAGybviBv7v$;@ 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 VDUZY`@=|Cw#fp=!JgLtW{}0e&6a)YO literal 0 HcmV?d00001 diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 55fe52e..7a3d147 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -288,9 +288,13 @@ name = "ceramic-radioactivity-tauri" version = "0.1.0" dependencies = [ "ceramic-radioactivity", + "rusqlite", + "rust_xlsxwriter", "serde", + "serde_json", "tauri", "tauri-build", + "tauri-plugin-dialog", ] [[package]] @@ -736,6 +740,18 @@ dependencies = [ "typeid", ] +[[package]] +name = "fallible-iterator" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649" + +[[package]] +name = "fallible-streaming-iterator" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a" + [[package]] name = "fastrand" version = "2.4.1" @@ -775,6 +791,7 @@ checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" dependencies = [ "crc32fast", "miniz_oxide", + "zlib-rs", ] [[package]] @@ -1216,6 +1233,15 @@ version = "0.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" +[[package]] +name = "hashlink" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7382cf6263419f2d8df38c55d7da83da5c18aef87fc7a7fc1fb1e344edfe14c1" +dependencies = [ + "hashbrown 0.15.5", +] + [[package]] name = "heck" version = "0.4.1" @@ -1695,6 +1721,17 @@ dependencies = [ "libc", ] +[[package]] +name = "libsqlite3-sys" +version = "0.35.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "133c182a6a2c87864fe97778797e46c7e999672690dc9fa3ee8e241aa4a9c13f" +dependencies = [ + "cc", + "pkg-config", + "vcpkg", +] + [[package]] name = "litemap" version = "0.8.2" @@ -1980,6 +2017,7 @@ checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" dependencies = [ "bitflags 2.11.1", "block2", + "libc", "objc2", "objc2-core-foundation", ] @@ -2454,6 +2492,53 @@ dependencies = [ "web-sys", ] +[[package]] +name = "rfd" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a15ad77d9e70a92437d8f74c35d99b4e4691128df018833e99f90bcd36152672" +dependencies = [ + "block2", + "dispatch2", + "glib-sys", + "gobject-sys", + "gtk-sys", + "js-sys", + "log", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", + "raw-window-handle", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "windows-sys 0.60.2", +] + +[[package]] +name = "rusqlite" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "165ca6e57b20e1351573e3729b958bc62f0e48025386970b6e4d29e7a7e71f3f" +dependencies = [ + "bitflags 2.11.1", + "fallible-iterator", + "fallible-streaming-iterator", + "hashlink", + "libsqlite3-sys", + "smallvec", +] + +[[package]] +name = "rust_xlsxwriter" +version = "0.95.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f281b687352597d29efaad39701d1167d5c48aa76fb973e392bc13e9d44e7f36" +dependencies = [ + "zip", +] + [[package]] name = "rustc-hash" version = "2.1.2" @@ -2625,9 +2710,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.149" +version = "1.0.150" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" +checksum = "e8014e44b4736ed0538adeecded0fce2a272f22dc9578a7eb6b2d9993c74cfb9" dependencies = [ "itoa", "memchr", @@ -3098,6 +3183,64 @@ dependencies = [ "tauri-utils", ] +[[package]] +name = "tauri-plugin" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eefb2c18e8a605c23edb48fc56bb77381199e1a1e7f6ff0c9b970afe7b3cb8ee" +dependencies = [ + "anyhow", + "glob", + "plist", + "schemars 0.8.22", + "serde", + "serde_json", + "tauri-utils", + "walkdir", +] + +[[package]] +name = "tauri-plugin-dialog" +version = "2.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65981abb771e74e571a38196c3baa11c459379164791eba0e67abc1a5fac9884" +dependencies = [ + "log", + "raw-window-handle", + "rfd", + "serde", + "serde_json", + "tauri", + "tauri-plugin", + "tauri-plugin-fs", + "thiserror 2.0.18", + "url", +] + +[[package]] +name = "tauri-plugin-fs" +version = "2.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7ecc274121aca0c036a2b42d1cbe83d368d348f54e0bb8a735c2b1548e8f371" +dependencies = [ + "anyhow", + "dunce", + "glob", + "log", + "objc2-foundation", + "percent-encoding", + "schemars 0.8.22", + "serde", + "serde_json", + "serde_repr", + "tauri", + "tauri-plugin", + "tauri-utils", + "thiserror 2.0.18", + "toml 1.1.2+spec-1.1.0", + "url", +] + [[package]] name = "tauri-runtime" version = "2.11.1" @@ -3543,6 +3686,12 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" +[[package]] +name = "typed-path" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e28f89b80c87b8fb0cf04ab448d5dd0dd0ade2f8891bae878de66a75a28600e" + [[package]] name = "typeid" version = "1.0.3" @@ -3663,6 +3812,12 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + [[package]] name = "version-compare" version = "0.2.1" @@ -4145,6 +4300,15 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-sys" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets 0.53.5", +] + [[package]] name = "windows-sys" version = "0.61.2" @@ -4178,13 +4342,30 @@ dependencies = [ "windows_aarch64_gnullvm 0.52.6", "windows_aarch64_msvc 0.52.6", "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm", + "windows_i686_gnullvm 0.52.6", "windows_i686_msvc 0.52.6", "windows_x86_64_gnu 0.52.6", "windows_x86_64_gnullvm 0.52.6", "windows_x86_64_msvc 0.52.6", ] +[[package]] +name = "windows-targets" +version = "0.53.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" +dependencies = [ + "windows-link 0.2.1", + "windows_aarch64_gnullvm 0.53.1", + "windows_aarch64_msvc 0.53.1", + "windows_i686_gnu 0.53.1", + "windows_i686_gnullvm 0.53.1", + "windows_i686_msvc 0.53.1", + "windows_x86_64_gnu 0.53.1", + "windows_x86_64_gnullvm 0.53.1", + "windows_x86_64_msvc 0.53.1", +] + [[package]] name = "windows-threading" version = "0.1.0" @@ -4215,6 +4396,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" + [[package]] name = "windows_aarch64_msvc" version = "0.42.2" @@ -4227,6 +4414,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" + [[package]] name = "windows_i686_gnu" version = "0.42.2" @@ -4239,12 +4432,24 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" +[[package]] +name = "windows_i686_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" + [[package]] name = "windows_i686_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" + [[package]] name = "windows_i686_msvc" version = "0.42.2" @@ -4257,6 +4462,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" +[[package]] +name = "windows_i686_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" + [[package]] name = "windows_x86_64_gnu" version = "0.42.2" @@ -4269,6 +4480,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" + [[package]] name = "windows_x86_64_gnullvm" version = "0.42.2" @@ -4281,6 +4498,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" + [[package]] name = "windows_x86_64_msvc" version = "0.42.2" @@ -4293,6 +4516,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" + [[package]] name = "winnow" version = "0.5.40" @@ -4569,8 +4798,40 @@ dependencies = [ "syn 2.0.117", ] +[[package]] +name = "zip" +version = "7.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c42e33efc22a0650c311c2ef19115ce232583abbe80850bc8b66509ebef02de0" +dependencies = [ + "crc32fast", + "flate2", + "indexmap 2.14.0", + "memchr", + "typed-path", + "zopfli", +] + +[[package]] +name = "zlib-rs" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3be3d40e40a133f9c916ee3f9f4fa2d9d63435b5fbe1bfc6d9dae0aa0ada1513" + [[package]] name = "zmij" version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" + +[[package]] +name = "zopfli" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f05cd8797d63865425ff89b5c4a48804f35ba0ce8d125800027ad6017d2b5249" +dependencies = [ + "bumpalo", + "crc32fast", + "log", + "simd-adler32", +] diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 623fcb4..41abf88 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -8,5 +8,9 @@ tauri-build = { version = "2", features = [] } [dependencies] ceramic-radioactivity = { path = ".." } +rusqlite = { version = "0.37", features = ["bundled"] } +rust_xlsxwriter = "0.95.0" serde = { version = "1", features = ["derive"] } +serde_json = "1.0.150" tauri = { version = "2", features = [] } +tauri-plugin-dialog = "2.7.1" diff --git a/src-tauri/src/db.rs b/src-tauri/src/db.rs new file mode 100644 index 0000000..a591d21 --- /dev/null +++ b/src-tauri/src/db.rs @@ -0,0 +1,361 @@ +//! 历史记录的 SQLite 存储。完整 input/result 以 JSON 落库,另冗余若干标量列供列表查询与过滤。 + +use std::sync::Mutex; + +use ceramic_radioactivity::{CalculationResult, MaterialType, SampleInput, Validity, Verdict}; +use rusqlite::{Connection, ToSql}; +use serde::{Deserialize, Serialize}; + +/// 由 Tauri 托管的数据库连接。 +pub struct Db(pub Mutex); + +const CREATE_SQL: &str = " +CREATE TABLE IF NOT EXISTS records ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + sample_id TEXT, + material_type TEXT NOT NULL, + calc_date TEXT, + created_at TEXT NOT NULL, + ira_value REAL NOT NULL, + ir_value REAL NOT NULL, + validity TEXT NOT NULL, + verdict_kind TEXT NOT NULL, + verdict_json TEXT NOT NULL, + input_json TEXT NOT NULL, + result_json TEXT NOT NULL +); +CREATE INDEX IF NOT EXISTS idx_records_created ON records(created_at); +CREATE INDEX IF NOT EXISTS idx_records_sample ON records(sample_id); +"; + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct RecordFilter { + pub sample_id: Option, + pub material_type: Option, + pub date_from: Option, + pub date_to: Option, + pub verdict_kind: Option, +} + +#[derive(Debug, Clone, Serialize)] +pub struct RecordSummary { + pub id: i64, + pub sample_id: Option, + pub material_type: MaterialType, + pub calc_date: Option, + pub created_at: String, + pub ira_value: f64, + pub ir_value: f64, + pub validity: Validity, + pub verdict: Verdict, +} + +#[derive(Debug, Clone, Serialize)] +pub struct RecordDetail { + pub summary: RecordSummary, + pub input: SampleInput, + pub result: CalculationResult, +} + +/// 建表(幂等)。 +pub fn init(conn: &Connection) -> Result<(), String> { + conn.execute_batch(CREATE_SQL).map_err(|e| e.to_string()) +} + +/// 稳定的判定大类,用于列表过滤(装饰材料的 A/B/C 归为 DecorativeClass)。 +pub fn verdict_kind(verdict: &Verdict) -> &'static str { + match verdict { + Verdict::Qualified => "Qualified", + Verdict::Unqualified => "Unqualified", + Verdict::NeedMoreMeasurements => "NeedMoreMeasurements", + Verdict::InvalidResult => "InvalidResult", + Verdict::DecorativeClass(_) => "DecorativeClass", + } +} + +pub fn save( + conn: &Connection, + input: &SampleInput, + result: &CalculationResult, + created_at: &str, +) -> Result { + let material_type = to_json(&input.material_type)?; + let validity = to_json(&result.analysis.validity)?; + let verdict_json = to_json(&result.analysis.verdict)?; + let input_json = to_json(input)?; + let result_json = to_json(result)?; + + conn.execute( + "INSERT INTO records ( + sample_id, material_type, calc_date, created_at, + ira_value, ir_value, validity, verdict_kind, verdict_json, + input_json, result_json + ) VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11)", + rusqlite::params![ + input.sample_id, + material_type, + input.calculation_date, + created_at, + result.ira.value, + result.ir.value, + validity, + verdict_kind(&result.analysis.verdict), + verdict_json, + input_json, + result_json, + ], + ) + .map_err(|e| e.to_string())?; + + Ok(conn.last_insert_rowid()) +} + +/// 列表查询行(标量 + 用于反序列化的 JSON 文本)。 +struct RawSummary { + id: i64, + sample_id: Option, + material_type: String, + calc_date: Option, + created_at: String, + ira_value: f64, + ir_value: f64, + validity: String, + verdict_json: String, +} + +pub fn list(conn: &Connection, filter: &RecordFilter) -> Result, String> { + let mut sql = String::from( + "SELECT id, sample_id, material_type, calc_date, created_at, + ira_value, ir_value, validity, verdict_json + FROM records WHERE 1 = 1", + ); + let mut args: Vec> = Vec::new(); + + if let Some(sample_id) = filter.sample_id.as_ref().filter(|s| !s.is_empty()) { + sql.push_str(" AND sample_id LIKE ?"); + args.push(Box::new(format!("%{sample_id}%"))); + } + if let Some(material_type) = &filter.material_type { + sql.push_str(" AND material_type = ?"); + args.push(Box::new(to_json(material_type)?)); + } + if let Some(date_from) = filter.date_from.as_ref().filter(|s| !s.is_empty()) { + sql.push_str(" AND calc_date >= ?"); + args.push(Box::new(date_from.clone())); + } + if let Some(date_to) = filter.date_to.as_ref().filter(|s| !s.is_empty()) { + sql.push_str(" AND calc_date <= ?"); + args.push(Box::new(date_to.clone())); + } + if let Some(kind) = filter.verdict_kind.as_ref().filter(|s| !s.is_empty()) { + sql.push_str(" AND verdict_kind = ?"); + args.push(Box::new(kind.clone())); + } + sql.push_str(" ORDER BY created_at DESC, id DESC"); + + let mut stmt = conn.prepare(&sql).map_err(|e| e.to_string())?; + let params: Vec<&dyn ToSql> = args.iter().map(|b| b.as_ref()).collect(); + let raw_rows = stmt + .query_map(params.as_slice(), |row| { + Ok(RawSummary { + id: row.get(0)?, + sample_id: row.get(1)?, + material_type: row.get(2)?, + calc_date: row.get(3)?, + created_at: row.get(4)?, + ira_value: row.get(5)?, + ir_value: row.get(6)?, + validity: row.get(7)?, + verdict_json: row.get(8)?, + }) + }) + .map_err(|e| e.to_string())?; + + let mut summaries = Vec::new(); + for raw in raw_rows { + let raw = raw.map_err(|e| e.to_string())?; + summaries.push(raw_to_summary(raw)?); + } + Ok(summaries) +} + +pub fn get(conn: &Connection, id: i64) -> Result { + conn.query_row( + "SELECT id, sample_id, material_type, calc_date, created_at, + ira_value, ir_value, validity, verdict_json, input_json, result_json + FROM records WHERE id = ?1", + [id], + |row| { + Ok(( + RawSummary { + id: row.get(0)?, + sample_id: row.get(1)?, + material_type: row.get(2)?, + calc_date: row.get(3)?, + created_at: row.get(4)?, + ira_value: row.get(5)?, + ir_value: row.get(6)?, + validity: row.get(7)?, + verdict_json: row.get(8)?, + }, + row.get::<_, String>(9)?, + row.get::<_, String>(10)?, + )) + }, + ) + .map_err(|e| e.to_string()) + .and_then(|(raw, input_json, result_json)| { + Ok(RecordDetail { + summary: raw_to_summary(raw)?, + input: from_json(&input_json)?, + result: from_json(&result_json)?, + }) + }) +} + +pub fn delete(conn: &Connection, id: i64) -> Result<(), String> { + conn.execute("DELETE FROM records WHERE id = ?1", [id]) + .map_err(|e| e.to_string())?; + Ok(()) +} + +fn raw_to_summary(raw: RawSummary) -> Result { + Ok(RecordSummary { + id: raw.id, + sample_id: raw.sample_id, + material_type: from_json(&raw.material_type)?, + calc_date: raw.calc_date, + created_at: raw.created_at, + ira_value: raw.ira_value, + ir_value: raw.ir_value, + validity: from_json(&raw.validity)?, + verdict: from_json(&raw.verdict_json)?, + }) +} + +fn to_json(value: &T) -> Result { + serde_json::to_string(value).map_err(|e| e.to_string()) +} + +fn from_json Deserialize<'de>>(text: &str) -> Result { + serde_json::from_str(text).map_err(|e| e.to_string()) +} + +#[cfg(test)] +mod tests { + use super::*; + use ceramic_radioactivity::{calculate_sample, CalibrationParams, NuclideMeasurements}; + + fn cal(factor: f64, u: f64) -> CalibrationParams { + CalibrationParams { + factor, + expanded_uncertainty_percent: u, + coverage_factor: 2.0, + } + } + + fn sample() -> (SampleInput, CalculationResult) { + let input = SampleInput { + ra: NuclideMeasurements { + measured_values: vec![100.0], + calibration: cal(0.916, 6.3), + }, + th: NuclideMeasurements { + measured_values: vec![110.0], + calibration: cal(0.884, 6.9), + }, + k: NuclideMeasurements { + measured_values: vec![560.0], + calibration: cal(0.961, 6.7), + }, + material_type: MaterialType::BuildingMainBody, + sample_id: Some("S-1".into()), + calculation_date: Some("2026-06-11".into()), + }; + let result = calculate_sample(input.clone()).unwrap(); + (input, result) + } + + fn empty_filter() -> RecordFilter { + RecordFilter { + sample_id: None, + material_type: None, + date_from: None, + date_to: None, + verdict_kind: None, + } + } + + #[test] + fn save_list_get_delete_roundtrip() { + let conn = Connection::open_in_memory().unwrap(); + init(&conn).unwrap(); + let (input, result) = sample(); + + let id = save(&conn, &input, &result, "2026-06-11T10:00:00Z").unwrap(); + assert!(id > 0); + + let all = list(&conn, &empty_filter()).unwrap(); + assert_eq!(all.len(), 1); + assert_eq!(all[0].sample_id.as_deref(), Some("S-1")); + assert_eq!(all[0].verdict, result.analysis.verdict); + assert_eq!(all[0].material_type, MaterialType::BuildingMainBody); + + let detail = get(&conn, id).unwrap(); + // 离散字段精确比较;数值字段用容差(serde_json 的 f64 解析可能有末位 ULP 偏差,~1e-14,可忽略)。 + assert_eq!(detail.input.sample_id, input.sample_id); + assert_eq!(detail.input.material_type, input.material_type); + assert_eq!(detail.input.ra.measured_values, input.ra.measured_values); + assert_eq!(detail.result.measurement_count, result.measurement_count); + assert_eq!(detail.result.analysis.validity, result.analysis.validity); + assert_eq!(detail.result.analysis.verdict, result.analysis.verdict); + assert!((detail.result.ira.value - result.ira.value).abs() < 1e-9); + assert!((detail.result.ir.value - result.ir.value).abs() < 1e-9); + assert!( + (detail.result.mcm.overall_fail_probability - result.mcm.overall_fail_probability).abs() + < 1e-9 + ); + + delete(&conn, id).unwrap(); + assert!(list(&conn, &empty_filter()).unwrap().is_empty()); + } + + #[test] + fn filters_narrow_results() { + let conn = Connection::open_in_memory().unwrap(); + init(&conn).unwrap(); + let (input, result) = sample(); + save(&conn, &input, &result, "2026-06-11T10:00:00Z").unwrap(); + + let hit = list( + &conn, + &RecordFilter { + verdict_kind: Some("Qualified".into()), + sample_id: Some("S".into()), + ..empty_filter() + }, + ) + .unwrap(); + assert_eq!(hit.len(), 1); + + let miss = list( + &conn, + &RecordFilter { + verdict_kind: Some("Unqualified".into()), + ..empty_filter() + }, + ) + .unwrap(); + assert!(miss.is_empty()); + + let wrong_date = list( + &conn, + &RecordFilter { + date_from: Some("2026-07-01".into()), + ..empty_filter() + }, + ) + .unwrap(); + assert!(wrong_date.is_empty()); + } +} diff --git a/src-tauri/src/excel.rs b/src-tauri/src/excel.rs new file mode 100644 index 0000000..eb102cd --- /dev/null +++ b/src-tauri/src/excel.rs @@ -0,0 +1,217 @@ +//! 将一条历史记录导出为 .xlsx。rust_xlsxwriter 原生 UTF-8,无需处理中文字体。 + +use std::path::Path; + +use ceramic_radioactivity::{MaterialType, NuclideResult, Validity, Verdict}; +use rust_xlsxwriter::{Format, Workbook}; + +use crate::db::RecordDetail; + +/// 「另存为」对话框的默认文件名。 +pub fn default_file_name(detail: &RecordDetail) -> String { + let sample = detail + .summary + .sample_id + .as_deref() + .filter(|s| !s.is_empty()) + .unwrap_or("未编号"); + let safe: String = sample + .chars() + .map(|c| if r#"\/:*?"<>|"#.contains(c) { '_' } else { c }) + .collect(); + format!("建材放射性检测_{safe}_{}.xlsx", detail.summary.id) +} + +/// 将 xlsx 写到用户选定的路径,返回完整路径。 +pub fn write_to_path(path: &Path, detail: &RecordDetail) -> Result { + let mut workbook = Workbook::new(); + let bold = Format::new().set_bold(); + + write_summary(&mut workbook, detail, &bold)?; + write_measurements(&mut workbook, detail, &bold)?; + write_results(&mut workbook, detail, &bold)?; + + if let Some(parent) = path.parent() { + std::fs::create_dir_all(parent).map_err(|e| e.to_string())?; + } + workbook + .save(path) + .map_err(|e| e.to_string()) + .map(|_| path.to_string_lossy().into_owned()) +} + +fn write_summary( + workbook: &mut Workbook, + detail: &RecordDetail, + bold: &Format, +) -> Result<(), String> { + let sheet = workbook.add_worksheet(); + sheet.set_name("概要").map_err(|e| e.to_string())?; + let s = &detail.summary; + let rows: [(&str, String); 7] = [ + ("样品编号", s.sample_id.clone().unwrap_or_else(|| "未编号".into())), + ("计算日期", s.calc_date.clone().unwrap_or_default()), + ("入库时间", s.created_at.clone()), + ("材料类型", material_text(&s.material_type).into()), + ("测量次数", detail.result.measurement_count.to_string()), + ("有效性", validity_text(&s.validity).into()), + ("最终判定", verdict_text(&s.verdict)), + ]; + for (i, (label, value)) in rows.iter().enumerate() { + let row = i as u32; + sheet.write_with_format(row, 0, *label, bold).map_err(|e| e.to_string())?; + sheet.write(row, 1, value.as_str()).map_err(|e| e.to_string())?; + } + sheet.set_column_width(0, 14).ok(); + sheet.set_column_width(1, 28).ok(); + Ok(()) +} + +fn write_measurements( + workbook: &mut Workbook, + detail: &RecordDetail, + bold: &Format, +) -> Result<(), String> { + let sheet = workbook.add_worksheet(); + sheet.set_name("测量与校准").map_err(|e| e.to_string())?; + let input = &detail.input; + + for (col, header) in ["序号", "Ra-226", "Th-232", "K-40"].iter().enumerate() { + sheet.write_with_format(0, col as u16, *header, bold).map_err(|e| e.to_string())?; + } + let n = input.ra.measured_values.len(); + for i in 0..n { + let row = (i + 1) as u32; + sheet.write(row, 0, (i + 1) as f64).map_err(|e| e.to_string())?; + sheet.write(row, 1, input.ra.measured_values[i]).map_err(|e| e.to_string())?; + sheet.write(row, 2, input.th.measured_values[i]).map_err(|e| e.to_string())?; + sheet.write(row, 3, input.k.measured_values[i]).map_err(|e| e.to_string())?; + } + + let base = (n + 2) as u32; + sheet.write_with_format(base, 0, "校准参数", bold).map_err(|e| e.to_string())?; + for (col, header) in ["核素", "校准系数 a", "U(%)", "k"].iter().enumerate() { + sheet.write_with_format(base + 1, col as u16, *header, bold).map_err(|e| e.to_string())?; + } + let cals = [ + ("Ra", input.ra.calibration), + ("Th", input.th.calibration), + ("K", input.k.calibration), + ]; + for (i, (name, cal)) in cals.iter().enumerate() { + let row = base + 2 + i as u32; + sheet.write(row, 0, *name).map_err(|e| e.to_string())?; + sheet.write(row, 1, cal.factor).map_err(|e| e.to_string())?; + sheet.write(row, 2, cal.expanded_uncertainty_percent).map_err(|e| e.to_string())?; + sheet.write(row, 3, cal.coverage_factor).map_err(|e| e.to_string())?; + } + sheet.set_column_width(0, 10).ok(); + Ok(()) +} + +fn write_results( + workbook: &mut Workbook, + detail: &RecordDetail, + bold: &Format, +) -> Result<(), String> { + let sheet = workbook.add_worksheet(); + sheet.set_name("结果与MCM").map_err(|e| e.to_string())?; + let r = &detail.result; + + // 指数结果。 + for (col, header) in ["指数", "值", "U(k=2)", "相对(k=2)%", "P2.5", "P97.5"] + .iter() + .enumerate() + { + sheet.write_with_format(0, col as u16, *header, bold).map_err(|e| e.to_string())?; + } + let indices = [("IRa", &r.ira), ("Ir", &r.ir)]; + for (i, (name, idx)) in indices.iter().enumerate() { + let row = (i + 1) as u32; + sheet.write(row, 0, *name).map_err(|e| e.to_string())?; + sheet.write(row, 1, idx.value).map_err(|e| e.to_string())?; + sheet.write(row, 2, idx.expanded_uncertainty).map_err(|e| e.to_string())?; + sheet.write(row, 3, idx.relative_expanded_uncertainty_percent).map_err(|e| e.to_string())?; + sheet.write(row, 4, idx.p2_5).map_err(|e| e.to_string())?; + sheet.write(row, 5, idx.p97_5).map_err(|e| e.to_string())?; + } + + // 核素中间量。 + let base = 4u32; + for (col, header) in ["核素", "均值", "校准活度", "A类", "B类相对", "合成不确定度"] + .iter() + .enumerate() + { + sheet.write_with_format(base, col as u16, *header, bold).map_err(|e| e.to_string())?; + } + let nuclides: [(&str, &NuclideResult); 3] = + [("Ra-226", &r.ra), ("Th-232", &r.th), ("K-40", &r.k)]; + for (i, (name, nr)) in nuclides.iter().enumerate() { + let row = base + 1 + i as u32; + sheet.write(row, 0, *name).map_err(|e| e.to_string())?; + sheet.write(row, 1, nr.mean_measured).map_err(|e| e.to_string())?; + sheet.write(row, 2, nr.mean_calibrated).map_err(|e| e.to_string())?; + sheet.write(row, 3, nr.type_a_uncertainty).map_err(|e| e.to_string())?; + sheet.write(row, 4, nr.type_b_relative).map_err(|e| e.to_string())?; + sheet.write(row, 5, nr.combined_uncertainty).map_err(|e| e.to_string())?; + } + + // MCM。 + let mbase = base + 5; + sheet.write_with_format(mbase, 0, format!("蒙特卡洛仿真({} 次)", r.mcm.iterations), bold) + .map_err(|e| e.to_string())?; + for (col, header) in ["指数", "平均值", "标准偏差", "P2.5", "P97.5", "标准值", "合格概率"] + .iter() + .enumerate() + { + sheet.write_with_format(mbase + 1, col as u16, *header, bold).map_err(|e| e.to_string())?; + } + let mcm = [("IRa", &r.mcm.ira), ("Ir", &r.mcm.ir)]; + for (i, (name, stats)) in mcm.iter().enumerate() { + let row = mbase + 2 + i as u32; + sheet.write(row, 0, *name).map_err(|e| e.to_string())?; + sheet.write(row, 1, stats.mean).map_err(|e| e.to_string())?; + sheet.write(row, 2, stats.std_dev).map_err(|e| e.to_string())?; + sheet.write(row, 3, stats.p2_5).map_err(|e| e.to_string())?; + sheet.write(row, 4, stats.p97_5).map_err(|e| e.to_string())?; + sheet.write(row, 5, stats.standard_value).map_err(|e| e.to_string())?; + sheet.write(row, 6, stats.pass_probability).map_err(|e| e.to_string())?; + } + let frow = mbase + 4; + sheet.write_with_format(frow, 0, "综合不符合概率", bold).map_err(|e| e.to_string())?; + sheet.write(frow, 1, r.mcm.overall_fail_probability).map_err(|e| e.to_string())?; + + sheet.set_column_width(0, 12).ok(); + Ok(()) +} + +fn material_text(material: &MaterialType) -> &'static str { + match material { + MaterialType::BuildingMainBody => "建筑主体材料", + MaterialType::HollowBuildingMainBody => "空心率>25% 主体材料", + MaterialType::DecorativeMaterial => "装饰装修材料", + } +} + +fn validity_text(validity: &Validity) -> &'static str { + match validity { + Validity::LowActivityExempt => "有效(低活度豁免 ≤37 Bq/kg)", + Validity::UncertaintyAcceptable => "有效(Ur(IRa) ≤ 20%)", + Validity::Invalid => "无效(Ur(IRa) > 20%)", + } +} + +fn verdict_text(verdict: &Verdict) -> String { + match verdict { + Verdict::Qualified => "合格".into(), + Verdict::Unqualified => "不合格".into(), + Verdict::NeedMoreMeasurements => "建议增加至 6 次测量".into(), + Verdict::InvalidResult => "结果无效".into(), + Verdict::DecorativeClass(class) => match class { + ceramic_radioactivity::DecorClass::A => "装饰装修 A 类".into(), + ceramic_radioactivity::DecorClass::B => "装饰装修 B 类".into(), + ceramic_radioactivity::DecorClass::C => "装饰装修 C 类".into(), + ceramic_radioactivity::DecorClass::Unqualified => "不合格(不可用于建材)".into(), + }, + } +} diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs index aa15110..47e42aa 100644 --- a/src-tauri/src/main.rs +++ b/src-tauri/src/main.rs @@ -1,15 +1,102 @@ #![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] +mod db; +mod excel; + +use std::sync::Mutex; + use ceramic_radioactivity::{calculate_sample, CalculationResult, SampleInput}; +use db::{Db, RecordDetail, RecordFilter, RecordSummary}; +use rusqlite::Connection; +use tauri::{Manager, State}; +use tauri_plugin_dialog::DialogExt; #[tauri::command] fn calculate(input: SampleInput) -> Result { calculate_sample(input).map_err(|error| error.to_string()) } +#[derive(serde::Deserialize)] +struct SaveArgs { + input: SampleInput, + result: CalculationResult, + created_at: String, +} + +#[tauri::command] +fn save_record(db: State, args: SaveArgs) -> Result { + let conn = db.0.lock().map_err(|e| e.to_string())?; + db::save(&conn, &args.input, &args.result, &args.created_at) +} + +#[tauri::command] +fn list_records(db: State, filter: RecordFilter) -> Result, String> { + let conn = db.0.lock().map_err(|e| e.to_string())?; + db::list(&conn, &filter) +} + +#[tauri::command] +fn get_record(db: State, id: i64) -> Result { + let conn = db.0.lock().map_err(|e| e.to_string())?; + db::get(&conn, id) +} + +#[tauri::command] +fn delete_record(db: State, id: i64) -> Result<(), String> { + let conn = db.0.lock().map_err(|e| e.to_string())?; + db::delete(&conn, id) +} + +/// 弹出「另存为」对话框,用户选定路径后写出 xlsx。取消则返回 `None`。 +#[tauri::command] +fn export_excel(app: tauri::AppHandle, db: State, id: i64) -> Result, String> { + let detail = { + let conn = db.0.lock().map_err(|e| e.to_string())?; + db::get(&conn, id)? + }; + + let start_dir = app + .path() + .download_dir() + .or_else(|_| app.path().document_dir()) + .ok(); + + let mut builder = app + .dialog() + .file() + .set_title("导出 Excel") + .set_file_name(excel::default_file_name(&detail)) + .add_filter("Excel 工作簿", &["xlsx"]); + if let Some(dir) = start_dir { + builder = builder.set_directory(dir); + } + + let Some(file_path) = builder.blocking_save_file() else { + return Ok(None); // 用户取消 + }; + let path = file_path.into_path().map_err(|e| e.to_string())?; + excel::write_to_path(&path, &detail).map(Some) +} + fn main() { tauri::Builder::default() - .invoke_handler(tauri::generate_handler![calculate]) + .plugin(tauri_plugin_dialog::init()) + .setup(|app| { + let dir = app.path().app_data_dir()?; + std::fs::create_dir_all(&dir)?; + let conn = Connection::open(dir.join("history.db"))?; + db::init(&conn).map_err(|e| std::io::Error::new(std::io::ErrorKind::Other, e))?; + app.manage(Db(Mutex::new(conn))); + Ok(()) + }) + .invoke_handler(tauri::generate_handler![ + calculate, + save_record, + list_records, + get_record, + delete_record, + export_excel + ]) .run(tauri::generate_context!()) .expect("failed to run Tauri application"); } diff --git a/src/calculator.rs b/src/calculator.rs index 85578ab..488747f 100644 --- a/src/calculator.rs +++ b/src/calculator.rs @@ -1,18 +1,23 @@ use crate::domain::{ - CalculationError, CalculationResult, Conclusion, IndexResult, NuclideMeasurements, - NuclideResult, SampleInput, + AnalysisResult, CalculationError, CalculationResult, Conclusion, DecorClass, IndexResult, + MaterialType, NuclideMeasurements, NuclideResult, SampleInput, Validity, Verdict, }; use crate::mcm::run_monte_carlo; +/// 相对(扩展)不确定度可接受上限,用于 3.1 有效性判定与 legacy conclusion。 const ACCEPTANCE_LIMIT_PERCENT: f64 = 20.0; +/// 3.1 低活度豁免阈值:总比活度 ≤ 37 Bq/kg 时结果直接有效。 +const TOTAL_ACTIVITY_EXEMPT: f64 = 37.0; +/// 指数的包含因子 k(GUM 2.2.4 / 2.2.6)。 +const COVERAGE_FACTOR: f64 = 2.0; pub fn calculate_sample(input: SampleInput) -> Result { validate_input(&input)?; let n = input.ra.measured_values.len(); - let ra = calculate_nuclide("Ra", &input.ra)?; - let th = calculate_nuclide("Th", &input.th)?; - let k = calculate_nuclide("K", &input.k)?; + let ra = calculate_nuclide(&input.ra)?; + let th = calculate_nuclide(&input.th)?; + let k = calculate_nuclide(&input.k)?; let ira = calculate_ira(&ra); let ir = calculate_ir(&ra, &th, &k); @@ -26,7 +31,8 @@ pub fn calculate_sample(input: SampleInput) -> Result Result Result<(), CalculationError> { ]; for (nuclide, count) in counts { - if count < 2 { + if count < 1 { return Err(CalculationError::TooFewMeasurements { nuclide, count }); } } @@ -90,27 +97,21 @@ fn validate_nuclide( Ok(()) } -fn calculate_nuclide( - nuclide: &'static str, - measurements: &NuclideMeasurements, -) -> Result { - let n = measurements.measured_values.len(); +fn calculate_nuclide(measurements: &NuclideMeasurements) -> Result { + let factor = measurements.calibration.factor; let mean_measured = mean(&measurements.measured_values); - let mean_calibrated = mean_measured * measurements.calibration.factor; + let mean_calibrated = mean_measured * factor; let type_a_uncertainty = type_a_uncertainty(&measurements.measured_values)?; - let type_b_relative = - measurements.calibration.expanded_uncertainty_percent / 100.0 / measurements.calibration.coverage_factor; - let type_b_uncertainty = measurements.calibration.factor * type_b_relative; + let type_b_relative = measurements.calibration.expanded_uncertainty_percent + / 100.0 + / measurements.calibration.coverage_factor; + let type_b_uncertainty = factor * type_b_relative; let sensitivity_coefficient = mean_measured; - let combined_uncertainty = (type_a_uncertainty.powi(2) + // 校准比活度 C = mean·a,对测量值 A 的灵敏系数为 a,故 A 类项为 a·uA。 + let combined_uncertainty = ((factor * type_a_uncertainty).powi(2) + (sensitivity_coefficient * type_b_uncertainty).powi(2)) .sqrt(); - if n < 6 && range_coefficient(n).is_none() { - return Err(CalculationError::UnsupportedRangeMethodCount { count: n }); - } - - let _ = nuclide; Ok(NuclideResult { mean_measured, mean_calibrated, @@ -125,11 +126,7 @@ fn calculate_nuclide( fn calculate_ira(ra: &NuclideResult) -> IndexResult { let value = ra.mean_calibrated / 200.0; let standard_uncertainty = ra.combined_uncertainty / 200.0; - IndexResult { - value, - standard_uncertainty, - relative_uncertainty_percent: relative_percent(standard_uncertainty, value), - } + make_index(value, standard_uncertainty) } fn calculate_ir(ra: &NuclideResult, th: &NuclideResult, k: &NuclideResult) -> IndexResult { @@ -138,16 +135,134 @@ fn calculate_ir(ra: &NuclideResult, th: &NuclideResult, k: &NuclideResult) -> In + (th.combined_uncertainty / 260.0).powi(2) + (k.combined_uncertainty / 4200.0).powi(2)) .sqrt(); + make_index(value, standard_uncertainty) +} + +/// 由指数值与标准不确定度构造完整的 `IndexResult`(含扩展不确定度与 GUM 真值区间)。 +fn make_index(value: f64, standard_uncertainty: f64) -> IndexResult { + let expanded_uncertainty = standard_uncertainty * COVERAGE_FACTOR; IndexResult { value, standard_uncertainty, + expanded_uncertainty, relative_uncertainty_percent: relative_percent(standard_uncertainty, value), + relative_expanded_uncertainty_percent: relative_percent(expanded_uncertainty, value), + p2_5: value - expanded_uncertainty, + p97_5: value + expanded_uncertainty, } } +/// 3.1 有效性 + 3.2 临界值判定。 +fn analyze( + material: MaterialType, + ra: &NuclideResult, + th: &NuclideResult, + k: &NuclideResult, + ira: &IndexResult, + ir: &IndexResult, +) -> AnalysisResult { + let total_calibrated_activity = ra.mean_calibrated + th.mean_calibrated + k.mean_calibrated; + + // 3.1 有效性:低活度豁免,否则看 IRa 的相对扩展不确定度(k=2)。 + let validity = if total_calibrated_activity <= TOTAL_ACTIVITY_EXEMPT { + Validity::LowActivityExempt + } else if ira.relative_expanded_uncertainty_percent <= ACCEPTANCE_LIMIT_PERCENT { + Validity::UncertaintyAcceptable + } else { + Validity::Invalid + }; + + // 3.2 临界值判定。 + let verdict = if validity == Validity::Invalid { + Verdict::InvalidResult + } else { + match material { + MaterialType::DecorativeMaterial => judge_decorative(ira, ir), + single_tier => judge_single_tier(single_tier, ira, ir), + } + }; + + AnalysisResult { + total_calibrated_activity, + validity, + verdict, + } +} + +/// 单个指数真值区间相对极限值的三态。 +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +enum TierCheck { + /// 区间整体在限值之下:合格。 + Pass, + /// 区间整体在限值之上:超标。 + Fail, + /// 区间跨越限值:需增加测量次数。 + Straddle, +} + +/// 判断指数真值区间相对极限值的位置;`None` 表示该指数无约束。 +fn check_index(index: &IndexResult, limit: Option) -> TierCheck { + match limit { + None => TierCheck::Pass, + Some(limit) => { + if index.p97_5 < limit { + TierCheck::Pass + } else if index.p2_5 > limit { + TierCheck::Fail + } else { + TierCheck::Straddle + } + } + } +} + +/// 合并同一级别多个指数的判定:超标优先,其次跨越,全部合格才合格。 +fn combine(checks: &[TierCheck]) -> TierCheck { + if checks.contains(&TierCheck::Fail) { + TierCheck::Fail + } else if checks.contains(&TierCheck::Straddle) { + TierCheck::Straddle + } else { + TierCheck::Pass + } +} + +/// 主体/空心材料:单级判定。 +fn judge_single_tier(material: MaterialType, ira: &IndexResult, ir: &IndexResult) -> Verdict { + let tier = &material.tiers()[0]; + match combine(&[ + check_index(ira, tier.ira_limit), + check_index(ir, tier.ir_limit), + ]) { + TierCheck::Pass => Verdict::Qualified, + TierCheck::Straddle => Verdict::NeedMoreMeasurements, + TierCheck::Fail => Verdict::Unqualified, + } +} + +/// 装饰装修材料:A→B→C 级联分类。 +fn judge_decorative(ira: &IndexResult, ir: &IndexResult) -> Verdict { + let tiers = MaterialType::DecorativeMaterial.tiers(); + let classes = [DecorClass::A, DecorClass::B, DecorClass::C]; + for (tier, class) in tiers.iter().zip(classes) { + match combine(&[ + check_index(ira, tier.ira_limit), + check_index(ir, tier.ir_limit), + ]) { + TierCheck::Pass => return Verdict::DecorativeClass(class), + TierCheck::Straddle => return Verdict::NeedMoreMeasurements, + TierCheck::Fail => continue, + } + } + Verdict::DecorativeClass(DecorClass::Unqualified) +} + fn type_a_uncertainty(values: &[f64]) -> Result { let n = values.len(); - if n >= 6 { + if n <= 1 { + // 单次测量:A 类不确定度为 0(PDF 2.2.1)。 + Ok(0.0) + } else if n >= 6 { Ok(sample_standard_deviation(values) / (n as f64).sqrt()) } else { let coefficient = diff --git a/src/domain.rs b/src/domain.rs index 368eb5c..2c50e28 100644 --- a/src/domain.rs +++ b/src/domain.rs @@ -8,12 +8,82 @@ pub struct SampleInput { pub ra: NuclideMeasurements, pub th: NuclideMeasurements, pub k: NuclideMeasurements, - /// 合格判定标准值(限值)。前端可省略,默认 IRa ≤ 1.0、Ir ≤ 1.0(GB 6566 主体材料)。 + /// 样品材料类型,决定限值集(GB 6566)。默认建筑主体材料。 #[serde(default)] - pub limits: AcceptanceLimits, + pub material_type: MaterialType, + /// 样品编号(输出元信息,6.1)。 + #[serde(default)] + pub sample_id: Option, + /// 计算日期(前端传入的 ISO 字符串,6.1)。 + #[serde(default)] + pub calculation_date: Option, } -/// 内照射指数 IRa 与外照射指数 Ir 的合格判定标准值(限值)。 +/// 样品材料类型。每种类型对应一组(或多级)限值。 +#[derive(Debug, Clone, Copy, PartialEq, Eq, Default, Serialize, Deserialize)] +pub enum MaterialType { + /// 建筑主体材料:IRa ≤ 1.0、Ir ≤ 1.0。 + #[default] + BuildingMainBody, + /// 空心率大于 25% 的建筑主体材料:IRa ≤ 1.0、Ir ≤ 1.3。 + HollowBuildingMainBody, + /// 装饰装修材料:按 A / B / C 三级分类。 + DecorativeMaterial, +} + +/// 一级限值(装饰材料的 C 类无 IRa 约束,故用 `Option`)。 +#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)] +pub struct LimitTier { + pub label: &'static str, + pub ira_limit: Option, + pub ir_limit: Option, +} + +impl MaterialType { + /// 从严到宽的限值阶梯。主体/空心材料各 1 级;装饰材料 A/B/C 三级。 + pub fn tiers(&self) -> &'static [LimitTier] { + match self { + MaterialType::BuildingMainBody => &[LimitTier { + label: "合格", + ira_limit: Some(1.0), + ir_limit: Some(1.0), + }], + MaterialType::HollowBuildingMainBody => &[LimitTier { + label: "合格", + ira_limit: Some(1.0), + ir_limit: Some(1.3), + }], + MaterialType::DecorativeMaterial => &[ + LimitTier { + label: "A", + ira_limit: Some(1.0), + ir_limit: Some(1.3), + }, + LimitTier { + label: "B", + ira_limit: Some(1.3), + ir_limit: Some(1.9), + }, + LimitTier { + label: "C", + ira_limit: None, + ir_limit: Some(2.8), + }, + ], + } + } + + /// MCM 比较所用的主限值(取最严一级,无约束项以 +∞ 表示)。 + pub fn primary_limits(&self) -> AcceptanceLimits { + let tier = &self.tiers()[0]; + AcceptanceLimits { + ira_limit: tier.ira_limit.unwrap_or(f64::INFINITY), + ir_limit: tier.ir_limit.unwrap_or(f64::INFINITY), + } + } +} + +/// 内照射指数 IRa 与外照射指数 Ir 的合格判定标准值(限值)。MCM 仿真比较使用。 #[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)] pub struct AcceptanceLimits { pub ira_limit: f64, @@ -51,10 +121,59 @@ pub struct CalculationResult { pub ira: IndexResult, pub ir: IndexResult, pub conclusion: Conclusion, + /// 分析判定结果(有效性 + 合格/不合格/分级)。 + pub analysis: AnalysisResult, /// 蒙特卡洛法(MCM)仿真结果。 pub mcm: McmResult, } +/// 分析判定结果(PDF 第 3 节)。 +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct AnalysisResult { + /// 总比活度 A1·a + A2·b + A3·c(Bq/kg),用于 3.1 有效性判定。 + pub total_calibrated_activity: f64, + /// 有效性判定结果。 + pub validity: Validity, + /// 最终判定结论。 + pub verdict: Verdict, +} + +/// 3.1 有效性判定结果。 +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] +pub enum Validity { + /// 总比活度 ≤ 37 Bq/kg,直接有效。 + LowActivityExempt, + /// 总比活度 > 37 Bq/kg 且 Ur(IRa) ≤ 20%(k=2),有效。 + UncertaintyAcceptable, + /// 总比活度 > 37 Bq/kg 且 Ur(IRa) > 20%,无效。 + Invalid, +} + +/// 3.2 临界值判定的最终结论。 +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] +pub enum Verdict { + /// 主体/空心材料:合格。 + Qualified, + /// 不合格。 + Unqualified, + /// 装饰装修材料:A/B/C 分级结果。 + DecorativeClass(DecorClass), + /// 真值区间跨越极限值,建议增加测量次数至 6 次。 + NeedMoreMeasurements, + /// 有效性不成立,结果无效。 + InvalidResult, +} + +/// 装饰装修材料分级。 +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] +pub enum DecorClass { + A, + B, + C, + /// 不满足 C 类,不可用于建筑材料。 + Unqualified, +} + /// 蒙特卡洛法(MCM)整体仿真结果。 #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] pub struct McmResult { @@ -103,8 +222,18 @@ pub struct NuclideResult { #[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)] pub struct IndexResult { pub value: f64, + /// 标准(合成)不确定度 u。 pub standard_uncertainty: f64, + /// 扩展不确定度 U = u·k(k=2)。 + pub expanded_uncertainty: f64, + /// 相对标准不确定度 u/value(k=1),百分数。 pub relative_uncertainty_percent: f64, + /// 相对扩展不确定度 U/value(k=2),百分数。 + pub relative_expanded_uncertainty_percent: f64, + /// 95% 真值区间下限 = value − U(GUM 解析法)。 + pub p2_5: f64, + /// 95% 真值区间上限 = value + U。 + pub p97_5: f64, } #[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] diff --git a/src/lib.rs b/src/lib.rs index c41623d..9ff9cbe 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -4,6 +4,7 @@ mod mcm; pub use calculator::calculate_sample; pub use domain::{ - AcceptanceLimits, CalculationError, CalculationResult, CalibrationParams, Conclusion, - IndexResult, McmIndexStats, McmResult, NuclideMeasurements, NuclideResult, SampleInput, + AcceptanceLimits, AnalysisResult, CalculationError, CalculationResult, CalibrationParams, + Conclusion, DecorClass, IndexResult, LimitTier, MaterialType, McmIndexStats, McmResult, + NuclideMeasurements, NuclideResult, SampleInput, Validity, Verdict, }; diff --git a/tests/calculator_tests.rs b/tests/calculator_tests.rs index 1189afe..4191d66 100644 --- a/tests/calculator_tests.rs +++ b/tests/calculator_tests.rs @@ -1,41 +1,45 @@ use ceramic_radioactivity::{ - calculate_sample, AcceptanceLimits, CalibrationParams, Conclusion, NuclideMeasurements, - SampleInput, + calculate_sample, CalibrationParams, Conclusion, DecorClass, MaterialType, NuclideMeasurements, + SampleInput, Validity, Verdict, }; +fn calibration(factor: f64, expanded_uncertainty_percent: f64) -> CalibrationParams { + CalibrationParams { + factor, + expanded_uncertainty_percent, + coverage_factor: 2.0, + } +} + fn default_input() -> SampleInput { SampleInput { ra: NuclideMeasurements { measured_values: vec![100.0, 102.0, 98.0, 101.0, 99.0, 100.0], - calibration: CalibrationParams { - factor: 0.916, - expanded_uncertainty_percent: 6.3, - coverage_factor: 2.0, - }, + calibration: calibration(0.916, 6.3), }, th: NuclideMeasurements { measured_values: vec![110.0, 111.0, 109.0, 110.0, 112.0, 108.0], - calibration: CalibrationParams { - factor: 0.884, - expanded_uncertainty_percent: 6.9, - coverage_factor: 2.0, - }, + calibration: calibration(0.884, 6.9), }, k: NuclideMeasurements { measured_values: vec![560.0, 565.0, 555.0, 562.0, 558.0, 561.0], - calibration: CalibrationParams { - factor: 0.961, - expanded_uncertainty_percent: 6.7, - coverage_factor: 2.0, - }, - }, - limits: AcceptanceLimits { - ira_limit: 1.0, - ir_limit: 1.0, + calibration: calibration(0.961, 6.7), }, + material_type: MaterialType::BuildingMainBody, + sample_id: None, + calculation_date: None, } } +/// 由目标校准比活度构造 n=6 的等值输入(A 类不确定度为 0,仅保留 B 类)。 +fn from_calibrated(ra_cal: f64, th_cal: f64, k_cal: f64) -> SampleInput { + let mut input = default_input(); + input.ra.measured_values = vec![ra_cal / 0.916; 6]; + input.th.measured_values = vec![th_cal / 0.884; 6]; + input.k.measured_values = vec![k_cal / 0.961; 6]; + input +} + #[test] fn calculates_indices_and_ok_conclusion_for_six_measurements() { let result = calculate_sample(default_input()).expect("valid sample should calculate"); @@ -47,6 +51,146 @@ fn calculates_indices_and_ok_conclusion_for_six_measurements() { assert_close(result.ira.value, 0.458, 1e-9); assert_close(result.ir.value, 0.749_739_035_821_535_9, 1e-9); assert_eq!(result.conclusion, Conclusion::Ok); + assert_eq!(result.analysis.verdict, Verdict::Qualified); +} + +/// 对齐 PDF 单次测量算例(A1=83.439, A2=116.995, A3=554.268)。 +#[test] +fn single_measurement_matches_pdf_example() { + let input = SampleInput { + ra: NuclideMeasurements { + measured_values: vec![83.439], + calibration: calibration(0.916, 6.3), + }, + th: NuclideMeasurements { + measured_values: vec![116.995], + calibration: calibration(0.884, 6.9), + }, + k: NuclideMeasurements { + measured_values: vec![554.268], + calibration: calibration(0.961, 6.7), + }, + material_type: MaterialType::BuildingMainBody, + sample_id: Some("PDF-EX".to_string()), + calculation_date: Some("2026-06-11".to_string()), + }; + + let result = calculate_sample(input).expect("single measurement should calculate"); + + assert_eq!(result.measurement_count, 1); + // A 类不确定度为 0。 + assert_close(result.ra.type_a_uncertainty, 0.0, 1e-12); + + // 2.1 检测结果。 + assert_close(result.ira.value, 0.38, 5e-3); + assert_close(result.ir.value, 0.73, 5e-3); + + // 2.2.3 标准不确定度、2.2.4 扩展不确定度、2.2.6 真值区间。 + assert_close(result.ira.standard_uncertainty, 0.012, 5e-4); + assert_close(result.ira.expanded_uncertainty, 0.024, 1e-3); + // PDF 区间用已四舍五入的 0.38±0.024 得 0.36/0.40;此处用未舍入值,放宽容差。 + assert_close(result.ira.p2_5, 0.36, 1e-2); + assert_close(result.ira.p97_5, 0.40, 1e-2); + assert_close(result.ir.standard_uncertainty, 0.016, 5e-4); + assert_close(result.ir.expanded_uncertainty, 0.032, 1e-3); + + // 2.2.5 相对扩展不确定度 k=2。 + assert_close(result.ira.relative_expanded_uncertainty_percent, 6.3, 0.2); + assert_close(result.ir.relative_expanded_uncertainty_percent, 4.4, 0.2); + + // 3.1 有效性 + 3.2 判定。 + assert_close(result.analysis.total_calibrated_activity, 712.5, 1.0); + assert_eq!(result.analysis.validity, Validity::UncertaintyAcceptable); + assert_eq!(result.analysis.verdict, Verdict::Qualified); +} + +#[test] +fn low_activity_sample_is_exempt_and_valid() { + let input = SampleInput { + ra: NuclideMeasurements { + measured_values: vec![2.0], + calibration: calibration(0.916, 6.3), + }, + th: NuclideMeasurements { + measured_values: vec![2.0], + calibration: calibration(0.884, 6.9), + }, + k: NuclideMeasurements { + measured_values: vec![2.0], + calibration: calibration(0.961, 6.7), + }, + material_type: MaterialType::BuildingMainBody, + sample_id: None, + calculation_date: None, + }; + + let result = calculate_sample(input).expect("low activity sample should calculate"); + + assert!(result.analysis.total_calibrated_activity <= 37.0); + assert_eq!(result.analysis.validity, Validity::LowActivityExempt); + assert_eq!(result.analysis.verdict, Verdict::Qualified); +} + +#[test] +fn high_uncertainty_above_37_is_invalid() { + let mut input = default_input(); + input.ra.measured_values = vec![10.0, 200.0, 400.0]; + input.th.measured_values = vec![10.0, 200.0, 400.0]; + input.k.measured_values = vec![10.0, 200.0, 400.0]; + + let result = calculate_sample(input).expect("valid sample should calculate"); + + assert!(result.analysis.total_calibrated_activity > 37.0); + assert_eq!(result.analysis.validity, Validity::Invalid); + assert_eq!(result.analysis.verdict, Verdict::InvalidResult); +} + +#[test] +fn main_body_unqualified_when_interval_above_limit() { + // IRa ≈ 1.5,区间整体高于 1.0。 + let result = + calculate_sample(from_calibrated(300.0, 50.0, 50.0)).expect("valid sample should calculate"); + + assert!(result.ira.p2_5 > 1.0); + assert_eq!(result.analysis.verdict, Verdict::Unqualified); +} + +#[test] +fn main_body_needs_more_measurements_when_interval_straddles_limit() { + // IRa = 1.0,区间跨越 1.0。 + let result = + calculate_sample(from_calibrated(200.0, 50.0, 50.0)).expect("valid sample should calculate"); + + assert!(result.ira.p2_5 < 1.0 && result.ira.p97_5 > 1.0); + assert_eq!(result.analysis.verdict, Verdict::NeedMoreMeasurements); +} + +#[test] +fn decorative_material_classifies_into_tiers() { + // A 类:IRa、Ir 均低。 + let a = calculate_sample(decorative(100.0, 100.0, 100.0)).expect("valid"); + assert_eq!(a.analysis.verdict, Verdict::DecorativeClass(DecorClass::A)); + + // B 类:Ir 超 A 限(1.3) 但在 B 限(1.9) 内,IRa 低。 + let b = calculate_sample(decorative(100.0, 317.0, 42.0)).expect("valid"); + assert_eq!(b.analysis.verdict, Verdict::DecorativeClass(DecorClass::B)); + + // C 类:Ir 超 B 限(1.9) 但在 C 限(2.8) 内。 + let c = calculate_sample(decorative(100.0, 520.0, 100.0)).expect("valid"); + assert_eq!(c.analysis.verdict, Verdict::DecorativeClass(DecorClass::C)); + + // 不合格:Ir 超 C 限(2.8)。 + let fail = calculate_sample(decorative(100.0, 900.0, 100.0)).expect("valid"); + assert_eq!( + fail.analysis.verdict, + Verdict::DecorativeClass(DecorClass::Unqualified) + ); +} + +fn decorative(ra_cal: f64, th_cal: f64, k_cal: f64) -> SampleInput { + let mut input = from_calibrated(ra_cal, th_cal, k_cal); + input.material_type = MaterialType::DecorativeMaterial; + input } #[test] @@ -125,14 +269,12 @@ fn monte_carlo_is_deterministic_for_same_input() { } #[test] -fn monte_carlo_gives_about_half_pass_probability_when_limit_equals_mean() { - let mut input = default_input(); - let analytical = calculate_sample(input.clone()).expect("valid sample should calculate"); - - // 将 IRa 标准值设为其均值,合格概率应接近 0.5。 - input.limits.ira_limit = analytical.ira.value; - let result = calculate_sample(input).expect("valid sample should calculate"); +fn monte_carlo_gives_about_half_pass_probability_when_index_equals_limit() { + // 主体材料 IRa 标准值为 1.0;构造 IRa=1.0 的样本,合格概率应接近 0.5。 + let result = + calculate_sample(from_calibrated(200.0, 50.0, 50.0)).expect("valid sample should calculate"); + assert_close(result.ira.value, 1.0, 1e-9); assert_close(result.mcm.ira.pass_probability, 0.5, 0.03); assert_close( result.mcm.ira.fail_probability, diff --git a/ui/public/logo.png b/ui/public/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..0e793b76ee3a3c5ec519560559d5452dde748c45 GIT binary patch literal 2997 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 void; -}; - -const defaultCalibration = { - ra: { factor: 0.916, expanded_uncertainty_percent: 6.3, coverage_factor: 2 }, - th: { factor: 0.884, expanded_uncertainty_percent: 6.9, coverage_factor: 2 }, - k: { factor: 0.961, expanded_uncertainty_percent: 6.7, coverage_factor: 2 } -}; - -const defaultLimits: AcceptanceLimits = { ira_limit: 1.0, ir_limit: 1.0 }; - -const initialRows: MeasurementRow[] = [ - { key: 1, ra: 100, th: 110, k: 560 }, - { key: 2, ra: 102, th: 111, k: 565 }, - { key: 3, ra: 98, th: 109, k: 555 }, - { key: 4, ra: 101, th: 110, k: 562 }, - { key: 5, ra: 99, th: 112, k: 558 }, - { key: 6, ra: 100, th: 108, k: 561 } -]; - -const conclusionText: Record = { - Ok: "OK", - IncreaseMeasurementsToSix: "请增加试验次数至 6 次", - RecalibrateInstrument: "校准仪器后重新测量" -}; - -function formatNumber(value: number, digits = 4) { - if (!Number.isFinite(value)) return "-"; - return value.toFixed(digits); -} - -function formatPercent(value: number, digits = 2) { - if (!Number.isFinite(value)) return "-"; - return (value * 100).toFixed(digits) + "%"; -} - -function App() { - const [rows, setRows] = useState(initialRows); - const [limits, setLimits] = useState(defaultLimits); - const [result, setResult] = useState(null); - const [error, setError] = useState(null); - const [loading, setLoading] = useState(false); - const firstCellRefs = useRef>({}); - - const dataSource = useMemo(() => rows, [rows]); - - const updateRow = (key: number, field: keyof Omit, value: number | null) => { - setRows((current) => - current.map((row) => (row.key === key ? { ...row, [field]: value } : row)) - ); - }; - - const addRow = () => { - const key = Date.now(); - setRows((current) => [...current, { key, ra: null, th: null, k: null }]); - window.setTimeout(() => firstCellRefs.current[key]?.focus(), 0); - }; - - const removeRow = (key: number) => { - setRows((current) => current.filter((row) => row.key !== key)); - }; - - const buildInput = (): SampleInput => { - const toValues = (field: keyof Omit) => - rows.map((row) => row[field]).filter((value): value is number => typeof value === "number"); - - return { - ra: { measured_values: toValues("ra"), calibration: defaultCalibration.ra }, - th: { measured_values: toValues("th"), calibration: defaultCalibration.th }, - k: { measured_values: toValues("k"), calibration: defaultCalibration.k }, - limits - }; - }; - - const calculate = async () => { - setLoading(true); - setError(null); - try { - const response = await invoke("calculate", { input: buildInput() }); - setResult(response); - } catch (err) { - setResult(null); - setError(err instanceof Error ? err.message : String(err)); - } finally { - setLoading(false); - } - }; - +function Brand() { return ( - -

-
-
- -
- - pagination={false} - dataSource={dataSource} - rowKey="key" - size="small" - columns={[ - { - title: "序号", - key: "index", - width: 56, - align: "center", - render: (_, _row, index) => index + 1 - }, - { - title: "Ra-226", - dataIndex: "ra", - render: (_, row) => ( - { - firstCellRefs.current[row.key] = instance; - }} - value={row.ra} - min={0} - onChange={(value) => updateRow(row.key, "ra", value)} - /> - ) - }, - { - title: "Th-232", - dataIndex: "th", - render: (_, row) => ( - updateRow(row.key, "th", value)} /> - ) - }, - { - title: "K-40", - dataIndex: "k", - render: (_, row) => ( - updateRow(row.key, "k", value)} /> - ) - }, - { - title: "", - key: "action", - width: 88, - render: (_, row) => ( - - ) - } - ]} - /> -
-
- - -
-
- - - - className="calibration-table" - pagination={false} - size="small" - rowKey="key" - dataSource={[ - { key: "ra", name: "Ra", ...defaultCalibration.ra }, - { key: "th", name: "Th", ...defaultCalibration.th }, - { key: "k", name: "K", ...defaultCalibration.k } - ]} - columns={[ - { title: "核素", dataIndex: "name", align: "center" }, - { title: "a", dataIndex: "factor", align: "center" }, - { - title: "U", - dataIndex: "expanded_uncertainty_percent", - align: "center", - render: (value: number) => `${value}%` - }, - { title: "k", dataIndex: "coverage_factor", align: "center" } - ]} - /> -
-
- IRa 标准值 - setLimits((current) => ({ ...current, ira_limit: value ?? 0 }))} - /> -
-
- Ir 标准值 - setLimits((current) => ({ ...current, ir_limit: value ?? 0 }))} - /> -
-
-
-
- - {error ? : null} - -
- {result ? ( -
- -
- - -
- 判定 - - {conclusionText[result.conclusion]} - -
-
- - pagination={false} - rowKey="name" - size="small" - dataSource={[ - { name: "Ra-226", ...result.ra }, - { name: "Th-232", ...result.th }, - { name: "K-40", ...result.k } - ]} - columns={[ - { title: "核素", dataIndex: "name" }, - { title: "均值", dataIndex: "mean_measured", render: (value: number) => formatNumber(value) }, - { title: "校准活度", dataIndex: "mean_calibrated", render: (value: number) => formatNumber(value) }, - { title: "A 类", dataIndex: "type_a_uncertainty", render: (value: number) => formatNumber(value) }, - { title: "B 类相对", dataIndex: "type_b_relative", render: (value) => formatNumber(value * 100, 3) + "%" }, - { title: "合成", dataIndex: "combined_uncertainty", render: (value: number) => formatNumber(value) } - ]} - /> -
- - -
-
- 综合合格概率 - {formatPercent(result.mcm.overall_pass_probability)} - IRa 与 Ir 同时合格 -
-
- 综合不合格概率 - {formatPercent(result.mcm.overall_fail_probability)} - 任一指数超标 -
-
- 仿真判定 - = 0.95 ? "success" : "warning"}> - {result.mcm.overall_pass_probability >= 0.95 ? "合格" : "不合格风险"} - -
-
- - pagination={false} - rowKey="name" - size="small" - dataSource={[ - { name: "IRa", ...result.mcm.ira }, - { name: "Ir", ...result.mcm.ir } - ]} - columns={[ - { title: "指数", dataIndex: "name" }, - { title: "平均值", dataIndex: "mean", render: (value: number) => formatNumber(value) }, - { title: "标准偏差", dataIndex: "std_dev", render: (value: number) => formatNumber(value) }, - { title: "P2.5", dataIndex: "p2_5", render: (value: number) => formatNumber(value) }, - { title: "P97.5", dataIndex: "p97_5", render: (value: number) => formatNumber(value) }, - { title: "标准值", dataIndex: "standard_value", render: (value: number) => formatNumber(value, 2) }, - { - title: "合格概率", - dataIndex: "pass_probability", - render: (value: number) => ( - = 0.95 ? "success" : "warning"}>{formatPercent(value)} - ) - } - ]} - /> -
-
- ) : ( -
请计算后查看结果
- )} -
-
-
- - ); -} - -function ResultTile(props: { title: string; value: number; uncertainty: number }) { - return ( -
- {props.title} - {formatNumber(props.value)} - 相对不确定度 {formatNumber(props.uncertainty, 2)}% +
+ + 建筑材料放射性判定分析
); } +function App() { + const [activeTab, setActiveTab] = useState("calc"); + const [reloadSignal, setReloadSignal] = useState(0); + // 复算:带入历史 input 并强制重挂 CalculatorPanel(key 递增)。 + const [loadedInput, setLoadedInput] = useState(undefined); + const [calcKey, setCalcKey] = useState(0); + + const recompute = (input: SampleInput) => { + setLoadedInput(input); + setCalcKey((k) => k + 1); + setActiveTab("calc"); + }; + + return ( + + +
+ }} + items={[ + { + key: "calc", + label: "计算", + children: ( + setReloadSignal((s) => s + 1)} + /> + ) + }, + { + key: "history", + label: "历史记录", + children: ( + + ) + } + ]} + /> +
+
+
+ ); +} + export { App }; diff --git a/ui/src/CalculatorPanel.tsx b/ui/src/CalculatorPanel.tsx new file mode 100644 index 0000000..6050e43 --- /dev/null +++ b/ui/src/CalculatorPanel.tsx @@ -0,0 +1,416 @@ +import { useEffect, useMemo, useRef, useState } from "react"; +import { invoke } from "@tauri-apps/api/core"; +import { Alert, App, Button, Card, DatePicker, Input, InputNumber, Select, Table, Tag } from "antd"; +import dayjs, { type Dayjs } from "dayjs"; +import { ReportModal } from "./ReportView"; +import { + conclusionText, + defaultCalibration, + formatNumber, + formatPercent, + materialOptions, + materialTiers, + validityText, + verdictDisplay, + type CalculationResult, + type LimitTier, + type MaterialType, + type SampleInput +} from "./types"; + +type MeasurementRow = { + key: number; + ra: number | null; + th: number | null; + k: number | null; +}; + +type CalibrationRow = { key: string; name: string } & (typeof defaultCalibration)["ra"]; + +type FocusableInput = { focus: () => void }; + +type Props = { + initialInput?: SampleInput; + onSaved: () => void; +}; + +function rowsFromInput(input?: SampleInput): MeasurementRow[] { + if (!input) return [{ key: 1, ra: 100, th: 110, k: 560 }]; + const n = input.ra.measured_values.length; + return Array.from({ length: n }, (_, i) => ({ + key: i + 1, + ra: input.ra.measured_values[i] ?? null, + th: input.th.measured_values[i] ?? null, + k: input.k.measured_values[i] ?? null + })); +} + +function CalculatorPanel({ initialInput, onSaved }: Props) { + const { message } = App.useApp(); + const [rows, setRows] = useState(() => rowsFromInput(initialInput)); + const [materialType, setMaterialType] = useState( + initialInput?.material_type ?? "BuildingMainBody" + ); + const [sampleId, setSampleId] = useState(initialInput?.sample_id ?? ""); + const [calcDate, setCalcDate] = useState( + initialInput?.calculation_date ? dayjs(initialInput.calculation_date) : dayjs() + ); + const [result, setResult] = useState(null); + const [lastInput, setLastInput] = useState(null); + const [error, setError] = useState(null); + const [loading, setLoading] = useState(false); + const [saving, setSaving] = useState(false); + const [reportOpen, setReportOpen] = useState(false); + const firstCellRefs = useRef>({}); + + const dataSource = useMemo(() => rows, [rows]); + + const updateRow = (key: number, field: keyof Omit, value: number | null) => { + setRows((current) => current.map((row) => (row.key === key ? { ...row, [field]: value } : row))); + }; + + const addRow = () => { + const key = Date.now(); + setRows((current) => [...current, { key, ra: null, th: null, k: null }]); + window.setTimeout(() => firstCellRefs.current[key]?.focus(), 0); + }; + + const removeRow = (key: number) => { + setRows((current) => current.filter((row) => row.key !== key)); + }; + + const buildInput = (): SampleInput => { + const toValues = (field: keyof Omit) => + rows.map((row) => row[field]).filter((value): value is number => typeof value === "number"); + + return { + ra: { measured_values: toValues("ra"), calibration: defaultCalibration.ra }, + th: { measured_values: toValues("th"), calibration: defaultCalibration.th }, + k: { measured_values: toValues("k"), calibration: defaultCalibration.k }, + material_type: materialType, + sample_id: sampleId.trim() ? sampleId.trim() : null, + calculation_date: calcDate ? calcDate.format("YYYY-MM-DD") : null + }; + }; + + const calculate = async () => { + setLoading(true); + setError(null); + const input = buildInput(); + try { + const response = await invoke("calculate", { input }); + setResult(response); + setLastInput(input); + } catch (err) { + setResult(null); + setLastInput(null); + setError(err instanceof Error ? err.message : String(err)); + } finally { + setLoading(false); + } + }; + + // 复算:带入历史记录后自动计算一次。 + useEffect(() => { + if (initialInput) void calculate(); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + const save = async () => { + if (!result || !lastInput) return; + setSaving(true); + try { + await invoke("save_record", { + args: { input: lastInput, result, created_at: new Date().toISOString() } + }); + message.success("已保存到历史"); + onSaved(); + } catch (err) { + message.error(`保存失败:${String(err)}`); + } finally { + setSaving(false); + } + }; + + const tiers = materialTiers[materialType]; + + return ( +
+
+ +
+ + pagination={false} + dataSource={dataSource} + rowKey="key" + size="small" + columns={[ + { title: "序号", key: "index", width: 56, align: "center", render: (_, _row, index) => index + 1 }, + { + title: "Ra-226", + dataIndex: "ra", + render: (_, row) => ( + { + firstCellRefs.current[row.key] = instance; + }} + value={row.ra} + min={0} + onChange={(value) => updateRow(row.key, "ra", value)} + /> + ) + }, + { + title: "Th-232", + dataIndex: "th", + render: (_, row) => ( + updateRow(row.key, "th", value)} /> + ) + }, + { + title: "K-40", + dataIndex: "k", + render: (_, row) => ( + updateRow(row.key, "k", value)} /> + ) + }, + { + title: "", + key: "action", + width: 88, + render: (_, row) => ( + + ) + } + ]} + /> +
+
+ + + + +
+
+ + +
+
+ 样品编号 + setSampleId(event.target.value)} /> +
+
+ 计算日期 + +
+
+ 材料类型 + + value={materialType} + options={materialOptions} + onChange={setMaterialType} + style={{ width: "100%" }} + /> +
+
+ +
+ + className="calibration-table" + pagination={false} + size="small" + rowKey="key" + dataSource={[ + { key: "ra", name: "Ra", ...defaultCalibration.ra }, + { key: "th", name: "Th", ...defaultCalibration.th }, + { key: "k", name: "K", ...defaultCalibration.k } + ]} + columns={[ + { title: "核素", dataIndex: "name", align: "center" }, + { title: "a", dataIndex: "factor", align: "center" }, + { + title: "U", + dataIndex: "expanded_uncertainty_percent", + align: "center", + render: (value: number) => `${value}%` + }, + { title: "k", dataIndex: "coverage_factor", align: "center" } + ]} + /> + + + className="limit-table" + pagination={false} + size="small" + rowKey="label" + dataSource={tiers} + columns={[ + { title: "级别", dataIndex: "label", align: "center" }, + { title: "IRa 限", dataIndex: "ira", align: "center", render: (value: number | null) => value ?? "—" }, + { title: "Ir 限", dataIndex: "ir", align: "center", render: (value: number | null) => value ?? "—" } + ]} + /> +
+
+
+ + {error ? : null} + +
+ {result && lastInput ? ( + <> + + {sampleId.trim() || "未编号"} · {calcDate ? calcDate.format("YYYY-MM-DD") : "无日期"} ·{" "} + {result.measurement_count} 次测量 + + } + > +
+
+ 有效性 + + {validityText[result.analysis.validity].text} + + 总比活度 {formatNumber(result.analysis.total_calibrated_activity, 1)} Bq/kg(阈值 37) +
+
+ 最终判定 + + {verdictDisplay(result.analysis.verdict).text} + + {result.analysis.verdict === "NeedMoreMeasurements" ? 真值区间跨越极限值 : null} +
+
+ IRa 真值区间 + {formatNumber(result.ira.value)} + + [{formatNumber(result.ira.p2_5)}, {formatNumber(result.ira.p97_5)}] · k=2{" "} + {formatNumber(result.ira.relative_expanded_uncertainty_percent, 2)}% + +
+
+ Ir 真值区间 + {formatNumber(result.ir.value)} + + [{formatNumber(result.ir.p2_5)}, {formatNumber(result.ir.p97_5)}] · k=2{" "} + {formatNumber(result.ir.relative_expanded_uncertainty_percent, 2)}% + +
+
+
+ +
+ +
+ + +
+ 不确定度判定 + + {conclusionText[result.conclusion]} + +
+
+ + pagination={false} + rowKey="name" + size="small" + dataSource={[ + { name: "Ra-226", ...result.ra }, + { name: "Th-232", ...result.th }, + { name: "K-40", ...result.k } + ]} + columns={[ + { title: "核素", dataIndex: "name" }, + { title: "均值", dataIndex: "mean_measured", render: (value: number) => formatNumber(value) }, + { title: "校准活度", dataIndex: "mean_calibrated", render: (value: number) => formatNumber(value) }, + { title: "A 类", dataIndex: "type_a_uncertainty", render: (value: number) => formatNumber(value) }, + { title: "B 类相对", dataIndex: "type_b_relative", render: (value) => formatNumber(value * 100, 3) + "%" }, + { title: "合成", dataIndex: "combined_uncertainty", render: (value: number) => formatNumber(value) } + ]} + /> +
+ + +
+
+ 综合合格概率 + {formatPercent(result.mcm.overall_pass_probability)} + IRa 与 Ir 同时合格 +
+
+ 不符合概率 + {formatPercent(result.mcm.overall_fail_probability)} + 95% 置信概率下 +
+
+ 仿真判定 + + {result.mcm.overall_fail_probability < 0.05 ? "合格(不符合概率<5%)" : "不合格风险"} + +
+
+ + pagination={false} + rowKey="name" + size="small" + dataSource={[ + { name: "IRa", ...result.mcm.ira }, + { name: "Ir", ...result.mcm.ir } + ]} + columns={[ + { title: "指数", dataIndex: "name" }, + { title: "平均值", dataIndex: "mean", render: (value: number) => formatNumber(value) }, + { title: "标准偏差", dataIndex: "std_dev", render: (value: number) => formatNumber(value) }, + { title: "P2.5", dataIndex: "p2_5", render: (value: number) => formatNumber(value) }, + { title: "P97.5", dataIndex: "p97_5", render: (value: number) => formatNumber(value) }, + { title: "标准值", dataIndex: "standard_value", render: (value: number) => formatNumber(value, 2) }, + { + title: "合格概率", + dataIndex: "pass_probability", + render: (value: number) => = 0.95 ? "success" : "warning"}>{formatPercent(value)} + } + ]} + /> +
+
+ + ) : ( +
请计算后查看结果
+ )} +
+ + setReportOpen(false)} + detail={result && lastInput ? { input: lastInput, result } : null} + /> +
+ ); +} + +function ResultTile(props: { title: string; value: number; uncertainty: number }) { + return ( +
+ {props.title} + {formatNumber(props.value)} + 相对不确定度 {formatNumber(props.uncertainty, 2)}% +
+ ); +} + +export { CalculatorPanel }; diff --git a/ui/src/HistoryTab.tsx b/ui/src/HistoryTab.tsx new file mode 100644 index 0000000..7dc0008 --- /dev/null +++ b/ui/src/HistoryTab.tsx @@ -0,0 +1,202 @@ +import { useCallback, useEffect, useState } from "react"; +import { invoke } from "@tauri-apps/api/core"; +import { App, Button, DatePicker, Input, Popconfirm, Select, Space, Table, Tag } from "antd"; +import dayjs, { type Dayjs } from "dayjs"; +import { ReportModal } from "./ReportView"; +import { + formatNumber, + materialOptions, + materialText, + verdictDisplay, + verdictKindOptions, + type MaterialType, + type RecordDetail, + type RecordFilter, + type RecordSummary, + type SampleInput +} from "./types"; + +const { RangePicker } = DatePicker; + +type Props = { + active: boolean; + reloadSignal: number; + onRecompute: (input: SampleInput) => void; +}; + +function HistoryTab({ active, reloadSignal, onRecompute }: Props) { + const { message } = App.useApp(); + const [rows, setRows] = useState([]); + const [loading, setLoading] = useState(false); + const [sampleId, setSampleId] = useState(""); + const [materialType, setMaterialType] = useState(null); + const [verdictKind, setVerdictKind] = useState(null); + const [range, setRange] = useState<[Dayjs | null, Dayjs | null] | null>(null); + const [report, setReport] = useState(null); + const [reportOpen, setReportOpen] = useState(false); + + const fetchList = useCallback(async () => { + setLoading(true); + try { + const filter: RecordFilter = { + sample_id: sampleId.trim() || null, + material_type: materialType, + date_from: range?.[0] ? range[0]!.format("YYYY-MM-DD") : null, + date_to: range?.[1] ? range[1]!.format("YYYY-MM-DD") : null, + verdict_kind: verdictKind + }; + const result = await invoke("list_records", { filter }); + setRows(result); + } catch (err) { + message.error(`加载历史失败:${String(err)}`); + } finally { + setLoading(false); + } + }, [sampleId, materialType, verdictKind, range]); + + useEffect(() => { + if (active) void fetchList(); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [active, reloadSignal]); + + const openReport = async (id: number) => { + try { + const detail = await invoke("get_record", { id }); + setReport(detail); + setReportOpen(true); + } catch (err) { + message.error(`读取记录失败:${String(err)}`); + } + }; + + const recompute = async (id: number) => { + try { + const detail = await invoke("get_record", { id }); + onRecompute(detail.input); + } catch (err) { + message.error(`复算失败:${String(err)}`); + } + }; + + const exportExcel = async (id: number) => { + try { + const path = await invoke("export_excel", { id }); + if (path) message.success(`已导出 Excel:${path}`); + else message.info("已取消导出"); + } catch (err) { + message.error(`导出失败:${String(err)}`); + } + }; + + const remove = async (id: number) => { + try { + await invoke("delete_record", { id }); + message.success("已删除"); + void fetchList(); + } catch (err) { + message.error(`删除失败:${String(err)}`); + } + }; + + return ( +
+ + setSampleId(e.target.value)} + /> + + allowClear + placeholder="材料类型" + style={{ width: 180 }} + options={materialOptions} + value={materialType ?? undefined} + onChange={(v) => setMaterialType(v ?? null)} + /> +