From 73510d3a71264e7b53ee6e13dab8e7bb7821eb7e Mon Sep 17 00:00:00 2001 From: yueli Date: Fri, 4 Sep 2026 16:17:42 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=80=9F=E8=BF=98=E8=AE=B0=E5=BD=95?= =?UTF-8?q?=E9=BB=98=E8=AE=A4=E6=8E=92=E5=BA=8F=E9=87=8D=E6=9E=84=E2=80=94?= =?UTF-8?q?=E2=80=94=E6=9C=89=E9=99=90=E6=9C=9F=E5=8D=95=E6=8C=89=E9=A2=84?= =?UTF-8?q?=E8=AE=A1=E5=BD=92=E8=BF=98=E6=97=B6=E9=97=B4=E5=8D=87=E5=BA=8F?= =?UTF-8?q?=E9=9D=A0=E5=89=8D=EF=BC=8C=E6=97=A0=E9=99=90=E6=9C=9F=E5=8D=95?= =?UTF-8?q?=E6=8C=89=E5=80=9F=E5=87=BA=E6=97=B6=E9=97=B4=E5=8D=87=E5=BA=8F?= =?UTF-8?q?=E9=9D=A0=E5=90=8E=EF=BC=88=E4=BC=98=E5=85=88=E5=85=B3=E6=B3=A8?= =?UTF-8?q?=E5=BF=AB=E5=88=B0=E6=9C=9F/=E9=80=BE=E6=9C=9F=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/services/trans_service.py | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) 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)