feat(health): patient_service 集成 PiiCrypto — 电话/过敏史/病史加密
Some checks failed
CI / rust-check (push) Has been cancelled
CI / rust-test (push) Has been cancelled
CI / frontend-build (push) Has been cancelled
CI / security-audit (push) Has been cancelled

- HealthState.crypto: HealthCrypto → PiiCrypto (erp-core)
- create_patient: 加密 phone/allergy/medical_history + HMAC 索引
- update_patient: 同上,同步加密
- model_to_resp_decrypted: 解密所有 Tier 1 字段
- model_to_resp (列表): Tier 1 字段返回 None
- list_patients 搜索: 新增 phone hash 精确搜索
- article handler: 适配新 list_articles 签名
- article 迁移: 添加 category_id 列
- error.rs: From<String> for HealthError
- 集成测试: HealthCrypto → PiiCrypto::dev_default()
This commit is contained in:
iven
2026-04-26 10:37:52 +08:00
parent e0b299ccd4
commit e6f036eaf4
11 changed files with 367 additions and 51 deletions

View File

@@ -16,9 +16,31 @@ pub struct Model {
#[sea_orm(skip_serializing_if = "Option::is_none")]
pub category: Option<String>,
#[sea_orm(skip_serializing_if = "Option::is_none")]
pub category_id: Option<Uuid>,
#[sea_orm(skip_serializing_if = "Option::is_none")]
pub author: Option<String>,
#[sea_orm(skip_serializing_if = "Option::is_none")]
pub published_at: Option<DateTimeUtc>,
/// 状态: draft / pending_review / approved / rejected / published
pub status: String,
/// URL 友好标识
#[sea_orm(skip_serializing_if = "Option::is_none")]
pub slug: Option<String>,
/// 内容类型: rich_text / markdown
pub content_type: String,
/// 审核人
#[sea_orm(skip_serializing_if = "Option::is_none")]
pub reviewed_by: Option<Uuid>,
/// 审核时间
#[sea_orm(skip_serializing_if = "Option::is_none")]
pub reviewed_at: Option<DateTimeUtc>,
/// 审核备注
#[sea_orm(skip_serializing_if = "Option::is_none")]
pub review_note: Option<String>,
/// 浏览次数
pub view_count: i32,
/// 排序权重
pub sort_order: i32,
pub created_at: DateTimeUtc,
pub updated_at: DateTimeUtc,
#[sea_orm(skip_serializing_if = "Option::is_none")]