This commit is contained in:
zlwu committed 2026-05-17 23:08:38 +08:00
1 parent 135dd550b6
commit 2a4767a014
76 files changed
+25160 -2306

No files matched your search

+82 -22
View File
@@ -5,15 +5,24 @@ from fastapi import APIRouter, Depends, Query
from pydantic import BaseModel, ConfigDict, Field
from sqlalchemy.orm import Session
from app.core.data_scope import apply_data_scope
from app.core.database import get_db
from app.core.menu_guard import require_admin_or_super_admin
from app.core.menu_guard import require_admin_or_super_admin, require_menu_code
from app.core.response import error_response, success_response
from app.crud import cell_sample_type as cell_type_svc
from app.crud import collection_region as region_svc
from app.crud import collection_protocol as collection_protocol_svc
from app.crud import collection_protocol_no as protocol_no_svc
from app.crud import customer as customer_svc
from app.crud import sample_code as sample_code_svc
from app.models.models import SysUser
from app.models.models import (
BizCellSampleType,
BizCollectionProtocolNo,
BizCollectionRegion,
BizCustomer,
BizSampleCode,
SysUser,
)
router = APIRouter(prefix="/web/admin", tags=["基础信息管理"])
@@ -64,13 +73,22 @@ async def list_customers(
page: int = Query(1, ge=1),
pageSize: int = Query(10, ge=1, le=100, alias="pageSize"),
keyword: Optional[str] = None,
user: dict = Depends(require_admin_or_super_admin),
user: dict = Depends(require_menu_code("biz:customer:list")),
db: Session = Depends(get_db),
):
tenant_no = _get_tenant_no(db, user)
items, total = customer_svc.list_customers(db, page=page, page_size=pageSize, keyword=keyword, tenant_no=tenant_no)
query = db.query(BizCustomer).filter(
BizCustomer.del_flag == 0,
BizCustomer.tenant_no == tenant_no,
)
if keyword:
query = query.filter(BizCustomer.customer_name.like(f"%{keyword}%"))
query = apply_data_scope(query, BizCustomer, user, db, tenant_no)
total = query.count()
items = query.order_by(BizCustomer.create_time.desc()).offset((page - 1) * pageSize).limit(pageSize).all()
result_list = [customer_svc._row_to_dict(r) for r in items]
tp = customer_svc.total_pages(total, pageSize)
return success_response({"list": items, "total": total, "page": page, "pageSize": pageSize, "totalPages": tp})
return success_response({"list": result_list, "total": total, "page": page, "pageSize": pageSize, "totalPages": tp})
@router.post("/customers")
@@ -174,15 +192,22 @@ async def list_cell_sample_types(
page: int = Query(1, ge=1),
pageSize: int = Query(10, ge=1, le=100, alias="pageSize"),
keyword: Optional[str] = None,
user: dict = Depends(require_admin_or_super_admin),
user: dict = Depends(require_menu_code("biz:cellSampleType:list")),
db: Session = Depends(get_db),
):
tenant_no = _get_tenant_no(db, user)
items, total = cell_type_svc.list_cell_sample_types(
db, page=page, page_size=pageSize, keyword=keyword, tenant_no=tenant_no
query = db.query(BizCellSampleType).filter(
BizCellSampleType.del_flag == 0,
BizCellSampleType.tenant_no == tenant_no,
)
if keyword:
query = query.filter(BizCellSampleType.type_name.like(f"%{keyword}%"))
query = apply_data_scope(query, BizCellSampleType, user, db, tenant_no)
total = query.count()
items = query.order_by(BizCellSampleType.create_time.desc()).offset((page - 1) * pageSize).limit(pageSize).all()
result_list = [cell_type_svc._row_to_dict(r) for r in items]
tp = cell_type_svc.total_pages(total, pageSize)
return success_response({"list": items, "total": total, "page": page, "pageSize": pageSize, "totalPages": tp})
return success_response({"list": result_list, "total": total, "page": page, "pageSize": pageSize, "totalPages": tp})
@router.post("/cell-sample-types")
@@ -276,15 +301,22 @@ async def list_collection_regions(
page: int = Query(1, ge=1),
pageSize: int = Query(10, ge=1, le=100, alias="pageSize"),
keyword: Optional[str] = None,
user: dict = Depends(require_admin_or_super_admin),
user: dict = Depends(require_menu_code("biz:collectionRegion:list")),
db: Session = Depends(get_db),
):
tenant_no = _get_tenant_no(db, user)
items, total = region_svc.list_collection_regions(
db, page=page, page_size=pageSize, keyword=keyword, tenant_no=tenant_no
query = db.query(BizCollectionRegion).filter(
BizCollectionRegion.del_flag == 0,
BizCollectionRegion.tenant_no == tenant_no,
)
if keyword:
query = query.filter(BizCollectionRegion.region_name.like(f"%{keyword}%"))
query = apply_data_scope(query, BizCollectionRegion, user, db, tenant_no)
total = query.count()
items = query.order_by(BizCollectionRegion.create_time.desc()).offset((page - 1) * pageSize).limit(pageSize).all()
result_list = [region_svc._region_to_dict(r) for r in items]
tp = region_svc.total_pages(total, pageSize)
return success_response({"list": items, "total": total, "page": page, "pageSize": pageSize, "totalPages": tp})
return success_response({"list": result_list, "total": total, "page": page, "pageSize": pageSize, "totalPages": tp})
@router.post("/collection-regions")
@@ -373,7 +405,7 @@ async def list_hospitals(
page: int = Query(1, ge=1),
pageSize: int = Query(10, ge=1, le=100, alias="pageSize"),
keyword: Optional[str] = None,
user: dict = Depends(require_admin_or_super_admin),
user: dict = Depends(require_menu_code("biz:collectionRegion:list")),
db: Session = Depends(get_db),
):
try:
@@ -487,15 +519,29 @@ async def list_protocol_nos(
page: int = Query(1, ge=1),
pageSize: int = Query(10, ge=1, le=100, alias="pageSize"),
keyword: Optional[str] = None,
user: dict = Depends(require_admin_or_super_admin),
user: dict = Depends(require_menu_code("biz:collectionProtocolNo:list")),
db: Session = Depends(get_db),
):
tenant_no = _get_tenant_no(db, user)
items, total = protocol_no_svc.list_protocol_nos(
db, page=page, page_size=pageSize, keyword=keyword, tenant_no=tenant_no
query = db.query(BizCollectionProtocolNo).filter(
BizCollectionProtocolNo.del_flag == 0,
BizCollectionProtocolNo.tenant_no == tenant_no,
)
if keyword:
query = query.filter(BizCollectionProtocolNo.protocol_no.like(f"%{keyword}%"))
query = apply_data_scope(query, BizCollectionProtocolNo, user, db, tenant_no)
total = query.count()
items = query.order_by(BizCollectionProtocolNo.create_time.desc()).offset((page - 1) * pageSize).limit(pageSize).all()
result_list = [protocol_no_svc._row_to_dict(r) for r in items]
used_nos = collection_protocol_svc.get_protocol_nos_used_in_protocols(
db,
tenant_no=tenant_no,
protocol_nos=[row["protocolNo"] for row in result_list],
)
for row in result_list:
row["usedInProtocol"] = row.get("protocolNo") in used_nos
tp = protocol_no_svc.total_pages(total, pageSize)
return success_response({"list": items, "total": total, "page": page, "pageSize": pageSize, "totalPages": tp})
return success_response({"list": result_list, "total": total, "page": page, "pageSize": pageSize, "totalPages": tp})
class ProtocolNoBatchGenerateBody(BaseModel):
@@ -785,15 +831,29 @@ async def list_sample_codes(
page: int = Query(1, ge=1),
pageSize: int = Query(10, ge=1, le=100, alias="pageSize"),
keyword: Optional[str] = None,
user: dict = Depends(require_admin_or_super_admin),
user: dict = Depends(require_menu_code("biz:sampleCode:list")),
db: Session = Depends(get_db),
):
tenant_no = _get_tenant_no(db, user)
items, total = sample_code_svc.list_sample_codes(
db, page=page, page_size=pageSize, keyword=keyword, tenant_no=tenant_no
query = db.query(BizSampleCode).filter(
BizSampleCode.del_flag == 0,
BizSampleCode.tenant_no == tenant_no,
)
if keyword:
query = query.filter(BizSampleCode.sample_code.like(f"%{keyword}%"))
query = apply_data_scope(query, BizSampleCode, user, db, tenant_no)
total = query.count()
items = query.order_by(BizSampleCode.create_time.desc()).offset((page - 1) * pageSize).limit(pageSize).all()
result_list = [sample_code_svc._row_to_dict(r) for r in items]
used_codes = collection_protocol_svc.get_sample_codes_used_in_protocol_samples(
db,
tenant_no=tenant_no,
sample_codes=[row["sampleCode"] for row in result_list],
)
for row in result_list:
row["usedInProtocol"] = row.get("sampleCode") in used_codes
tp = sample_code_svc.total_pages(total, pageSize)
return success_response({"list": items, "total": total, "page": page, "pageSize": pageSize, "totalPages": tp})
return success_response({"list": result_list, "total": total, "page": page, "pageSize": pageSize, "totalPages": tp})
@router.post("/sample-codes")