feat(health): 批量随访操作 — batch_create/assign/complete 三个端点
POST /health/follow-up-tasks/batch-create — 多患者同配置批量创建 POST /health/follow-up-tasks/batch-assign — 批量分配负责人 POST /health/follow-up-tasks/batch-complete — 批量标记完成 含参数校验(上限 100)、部分失败报告、事件发布、审计日志。
This commit is contained in:
@@ -13,6 +13,79 @@ use crate::dto::DeleteWithVersion;
|
||||
use crate::service::follow_up_service;
|
||||
use crate::state::HealthState;
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// 批量操作 Handler
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
pub async fn batch_create_tasks<S>(
|
||||
State(state): State<HealthState>,
|
||||
Extension(ctx): Extension<TenantContext>,
|
||||
Json(req): Json<BatchCreateTasksReq>,
|
||||
) -> Result<Json<ApiResponse<BatchResultResp>>, AppError>
|
||||
where
|
||||
HealthState: FromRef<S>,
|
||||
S: Clone + Send + Sync + 'static,
|
||||
{
|
||||
require_permission(&ctx, "health.follow-up.manage")?;
|
||||
if req.patient_ids.is_empty() {
|
||||
return Err(AppError::Validation("patient_ids 不能为空".to_string()));
|
||||
}
|
||||
if req.patient_ids.len() > 100 {
|
||||
return Err(AppError::Validation("单次批量最多 100 条".to_string()));
|
||||
}
|
||||
let result = follow_up_service::batch_create_tasks(
|
||||
&state, ctx.tenant_id, Some(ctx.user_id), req,
|
||||
)
|
||||
.await?;
|
||||
Ok(Json(ApiResponse::ok(result)))
|
||||
}
|
||||
|
||||
pub async fn batch_assign_tasks<S>(
|
||||
State(state): State<HealthState>,
|
||||
Extension(ctx): Extension<TenantContext>,
|
||||
Json(req): Json<BatchAssignReq>,
|
||||
) -> Result<Json<ApiResponse<BatchResultResp>>, AppError>
|
||||
where
|
||||
HealthState: FromRef<S>,
|
||||
S: Clone + Send + Sync + 'static,
|
||||
{
|
||||
require_permission(&ctx, "health.follow-up.manage")?;
|
||||
if req.task_ids.is_empty() {
|
||||
return Err(AppError::Validation("task_ids 不能为空".to_string()));
|
||||
}
|
||||
if req.task_ids.len() > 100 {
|
||||
return Err(AppError::Validation("单次批量最多 100 条".to_string()));
|
||||
}
|
||||
let result = follow_up_service::batch_assign_tasks(
|
||||
&state, ctx.tenant_id, Some(ctx.user_id), req,
|
||||
)
|
||||
.await?;
|
||||
Ok(Json(ApiResponse::ok(result)))
|
||||
}
|
||||
|
||||
pub async fn batch_complete_tasks<S>(
|
||||
State(state): State<HealthState>,
|
||||
Extension(ctx): Extension<TenantContext>,
|
||||
Json(req): Json<BatchCompleteReq>,
|
||||
) -> Result<Json<ApiResponse<BatchResultResp>>, AppError>
|
||||
where
|
||||
HealthState: FromRef<S>,
|
||||
S: Clone + Send + Sync + 'static,
|
||||
{
|
||||
require_permission(&ctx, "health.follow-up.manage")?;
|
||||
if req.task_ids.is_empty() {
|
||||
return Err(AppError::Validation("task_ids 不能为空".to_string()));
|
||||
}
|
||||
if req.task_ids.len() > 100 {
|
||||
return Err(AppError::Validation("单次批量最多 100 条".to_string()));
|
||||
}
|
||||
let result = follow_up_service::batch_complete_tasks(
|
||||
&state, ctx.tenant_id, Some(ctx.user_id), req,
|
||||
)
|
||||
.await?;
|
||||
Ok(Json(ApiResponse::ok(result)))
|
||||
}
|
||||
|
||||
#[derive(Debug, Deserialize, IntoParams)]
|
||||
pub struct FollowUpTaskListParams {
|
||||
pub page: Option<u64>,
|
||||
|
||||
Reference in New Issue
Block a user