feat: 增加顺丰月结列表、结算和补填接口,市场端不能调用

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
zlwuandCursor committed 2026-10-21 18:54:16 +08:00
1 parent 7aa685840f
commit 41e8d6f7c4
3 files changed
+520

No files matched your search

+123
View File
@@ -12,6 +12,7 @@ from app.core.database import get_db
from app.core.menu_guard import require_admin_or_super_admin
from app.core.response import error_response, success_response
from app.crud import sample_freight as freight_svc
from app.crud import sf_express_settlement as sf_crud
from app.models.models import SysUser
router = APIRouter(prefix="/web/admin", tags=["样本运费批次"])
@@ -66,6 +67,19 @@ class SampleFreightItemsBody(BaseModel):
items: List[SampleFreightItemBody] = Field(default_factory=list)
class SfSettlementSettleBody(BaseModel):
model_config = ConfigDict(extra="ignore", populate_by_name=True)
ids: List[str] = Field(default_factory=list)
freight_amount: Optional[float] = Field(None, alias="freightAmount")
class SfSettlementFillBody(BaseModel):
model_config = ConfigDict(extra="ignore", populate_by_name=True)
freight_amount: float = Field(..., alias="freightAmount")
@router.get("/sample-freights")
async def list_sample_freights(
page: int = Query(1, ge=1),
@@ -132,6 +146,115 @@ async def list_sample_freight_options(
return error_response(400, str(e))
@router.get("/sample-freights/sf-settlements")
async def list_sf_express_settlements(
page: int = Query(1, ge=1),
pageSize: int = Query(10, ge=1, le=100, alias="pageSize"),
waybillNo: Optional[str] = None,
settleStatus: Optional[str] = None,
createTimeFrom: Optional[str] = None,
createTimeTo: Optional[str] = None,
user: dict = Depends(require_admin_or_super_admin),
db: Session = Depends(get_db),
):
try:
tenant_no = _get_tenant_no(db, user)
rows, total = sf_crud.list_sf_settlements(
db,
tenant_no=tenant_no,
user_info=user,
page=page,
page_size=pageSize,
waybill_no=waybillNo,
settle_status=settleStatus,
create_time_from=createTimeFrom,
create_time_to=createTimeTo,
)
return success_response(
{"list": rows, "total": total, "page": page, "pageSize": pageSize}
)
except PermissionError as e:
return error_response(403, str(e))
except ValueError as e:
return error_response(400, str(e))
@router.get("/sample-freights/sf-settlements/export")
async def export_sf_express_settlements(
waybillNo: Optional[str] = None,
settleStatus: Optional[str] = None,
createTimeFrom: Optional[str] = None,
createTimeTo: Optional[str] = None,
user: dict = Depends(require_admin_or_super_admin),
db: Session = Depends(get_db),
):
try:
tenant_no = _get_tenant_no(db, user)
rows = sf_crud.list_sf_settlements_for_export(
db,
tenant_no=tenant_no,
user_info=user,
waybill_no=waybillNo,
settle_status=settleStatus,
create_time_from=createTimeFrom,
create_time_to=createTimeTo,
)
return success_response({"list": rows})
except PermissionError as e:
return error_response(403, str(e))
except ValueError as e:
return error_response(400, str(e))
@router.post("/sample-freights/sf-settlements/settle")
async def settle_sf_express_settlements(
body: SfSettlementSettleBody,
user: dict = Depends(require_admin_or_super_admin),
db: Session = Depends(get_db),
):
try:
tenant_no = _get_tenant_no(db, user)
user_id = _get_current_user_id(user)
data = sf_crud.settle_sf_freights(
db,
tenant_no=tenant_no,
user_id=user_id,
user_info=user,
ids=body.ids,
freight_amount=body.freight_amount,
)
return success_response(data, message="结算成功")
except PermissionError as e:
return error_response(403, str(e))
except ValueError as e:
return error_response(400, str(e))
@router.post("/sample-freights/sf-settlements/{freight_id}/fill-amount")
async def fill_sf_express_settlement_amount(
freight_id: str,
body: SfSettlementFillBody,
user: dict = Depends(require_admin_or_super_admin),
db: Session = Depends(get_db),
):
try:
tenant_no = _get_tenant_no(db, user)
user_id = _get_current_user_id(user)
data = sf_crud.fill_sf_freight_amount(
db,
tenant_no=tenant_no,
user_id=user_id,
user_info=user,
freight_id=freight_id,
freight_amount=body.freight_amount,
)
return success_response(data, message="补填成功")
except PermissionError as e:
return error_response(403, str(e))
except ValueError as e:
return error_response(400, str(e))
@router.get("/sample-freights/{freight_id}")
async def get_sample_freight(
freight_id: str,