feat: 借还记录默认排序重构——有限期单按预计归还时间升序靠前,无限期单按借出时间升序靠后(优先关注快到期/逾期)

This commit is contained in:
yueli
2026-09-04 16:17:42 +08:00
parent b274ed1ed1
commit 73510d3a71

View File

@ -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)