diff --git a/inventory-backend/app/services/trans_service.py b/inventory-backend/app/services/trans_service.py index e4c3b32..215572d 100644 --- a/inventory-backend/app/services/trans_service.py +++ b/inventory-backend/app/services/trans_service.py @@ -434,7 +434,12 @@ class TransService: order_subq = ( db.session.query( TransBorrow.borrow_no.label('borrow_no'), - func.min(TransBorrow.expected_return_time).label('sort_key') + # 有限期梯队内:单号内最早预计归还时间 + func.min(TransBorrow.expected_return_time).label('sort_key'), + # 无限期梯队内:单号内最早借出时间(呆滞借用盘点) + func.min(TransBorrow.borrow_time).label('min_borrow_time'), + # 单内是否含"有限期"明细:任一 expected_return_time 非空 → 1(有限期单排前) + func.max(case((TransBorrow.expected_return_time.isnot(None), 1), else_=0)).label('has_finite') ) .group_by(TransBorrow.borrow_no) .subquery() @@ -673,8 +678,15 @@ class TransService: ) ) - # 排序(单号维度的 sort_key ASC) - borrow_no_q = borrow_no_q.order_by(nullslast(asc(order_subq.c.sort_key))) + # ★ 默认排序(多级复合,符合"优先关注快到期/逾期"业务): + # 1) 有限期单(含 expected_return_time)排前,无限期单排后 + # 2) 有限期内按最早预计归还时间 ASC(越快到期/逾期越久越靠前) + # 3) 无限期内按最早借出时间 ASC(借出越久越靠前,暴露长期未还的呆滞借用) + borrow_no_q = borrow_no_q.order_by( + case((order_subq.c.has_finite == 0, 1), else_=0).asc(), + nullslast(asc(order_subq.c.sort_key)), + asc(order_subq.c.min_borrow_time) + ) # 分页(基准 = borrow_no 单号数) pagination = borrow_no_q.paginate(page=page, per_page=limit, error_out=False)