fix(health): 患者摘要列表按 user_id 过滤

小程序 loadPatients() 现在只获取当前登录用户关联的患者,
不再返回整个租户的所有患者。修复 wx_7141 上传数据写到
错误 patient 记录下的问题。

- PatientListParams 增加 user_id 可选参数
- list_summaries 增加 user_id 过滤条件
- 小程序 getPatientSummaries 传入 userId
- auth store loadPatients 传入当前 user.id
This commit is contained in:
iven
2026-06-05 10:51:17 +08:00
parent 76a89dc7de
commit 1982698b79
4 changed files with 21 additions and 5 deletions

View File

@@ -68,7 +68,9 @@ export interface PatientSummary {
} }
/** 获取患者摘要列表(字段最小化,替代 getPatients */ /** 获取患者摘要列表(字段最小化,替代 getPatients */
export async function getPatientSummaries() { export async function getPatientSummaries(userId?: string) {
const res = await api.get<PaginatedData<PatientSummary>>('/health/patients/summary'); const params: Record<string, string> = {};
if (userId) params.user_id = userId;
const res = await api.get<PaginatedData<PatientSummary>>('/health/patients/summary', { params });
return Array.isArray(res?.data) ? res.data : (Array.isArray(res) ? res : []); return Array.isArray(res?.data) ? res.data : (Array.isArray(res) ? res : []);
} }

View File

@@ -249,7 +249,8 @@ export const useAuthStore = create<AuthState>((set, get) => ({
loadPatients: async () => { loadPatients: async () => {
try { try {
const summaries = await authApi.getPatientSummaries(); const userId = get().user?.id;
const summaries = await authApi.getPatientSummaries(userId);
const patients: authApi.PatientInfo[] = summaries.map((p) => ({ const patients: authApi.PatientInfo[] = summaries.map((p) => ({
id: p.id, id: p.id,
name: p.name, name: p.name,

View File

@@ -24,6 +24,9 @@ pub struct PatientListParams {
pub page_size: Option<u64>, pub page_size: Option<u64>,
pub search: Option<String>, pub search: Option<String>,
pub tag_id: Option<Uuid>, pub tag_id: Option<Uuid>,
/// Optional user_id filter — only return patients linked to this user.
/// Used by the mini-program to fetch only the logged-in user's own patients.
pub user_id: Option<Uuid>,
} }
/// 分配医生请求 /// 分配医生请求
@@ -70,7 +73,9 @@ where
require_permission(&ctx, "health.patient.list")?; require_permission(&ctx, "health.patient.list")?;
let page = params.page.unwrap_or(1); let page = params.page.unwrap_or(1);
let page_size = params.page_size.unwrap_or(20).min(100); let page_size = params.page_size.unwrap_or(20).min(100);
let result = patient_service::list_summaries(&state, ctx.tenant_id, page, page_size).await?; let result =
patient_service::list_summaries(&state, ctx.tenant_id, page, page_size, params.user_id)
.await?;
Ok(Json(ApiResponse::ok(result))) Ok(Json(ApiResponse::ok(result)))
} }

View File

@@ -552,19 +552,27 @@ pub async fn bind_by_phone(
} }
/// 患者摘要列表 — 仅返回非敏感字段,供小程序切换/列表使用 /// 患者摘要列表 — 仅返回非敏感字段,供小程序切换/列表使用
///
/// When `user_id` is provided, only patients linked to that user are returned.
/// This allows the mini-program to fetch only the logged-in user's own patients.
pub async fn list_summaries( pub async fn list_summaries(
state: &HealthState, state: &HealthState,
tenant_id: Uuid, tenant_id: Uuid,
page: u64, page: u64,
page_size: u64, page_size: u64,
user_id: Option<Uuid>,
) -> HealthResult<PaginatedResponse<PatientSummary>> { ) -> HealthResult<PaginatedResponse<PatientSummary>> {
let limit = page_size.min(100); let limit = page_size.min(100);
let offset = page.saturating_sub(1) * limit; let offset = page.saturating_sub(1) * limit;
let query = patient::Entity::find() let mut query = patient::Entity::find()
.filter(patient::Column::TenantId.eq(tenant_id)) .filter(patient::Column::TenantId.eq(tenant_id))
.filter(patient::Column::DeletedAt.is_null()); .filter(patient::Column::DeletedAt.is_null());
if let Some(uid) = user_id {
query = query.filter(patient::Column::UserId.eq(uid));
}
let total = query.clone().count(&state.db).await?; let total = query.clone().count(&state.db).await?;
let models = query let models = query