@@ -8,6 +8,7 @@ use crate::database::dto::{
88} ;
99use crate :: entity:: prelude:: * ;
1010use crate :: entity:: { games, savedata} ;
11+ use sea_orm:: sea_query:: Expr ;
1112use sea_orm:: * ;
1213use serde:: { Deserialize , Serialize } ;
1314use std:: collections:: HashSet ;
@@ -452,6 +453,16 @@ impl GamesRepository {
452453 query
453454 }
454455
456+ /// 发行日期排序:无日期的游戏始终置末尾,升序/降序只影响非空日期。
457+ fn apply_date_order ( query : Select < Games > , sort_order : SortOrder ) -> Select < Games > {
458+ let query = query. order_by ( Expr :: col ( games:: Column :: Date ) . is_null ( ) , Order :: Asc ) ;
459+ match sort_order {
460+ SortOrder :: Asc => query. order_by_asc ( games:: Column :: Date ) ,
461+ SortOrder :: Desc => query. order_by_desc ( games:: Column :: Date ) ,
462+ }
463+ . order_by_asc ( games:: Column :: Id )
464+ }
465+
455466 /// 应用层排序:按可选数值键排序,None 值统一置末尾
456467 ///
457468 /// - `key_fn`:从游戏记录提取排序键,返回 `Option<K>`
@@ -575,14 +586,13 @@ impl GamesRepository {
575586 query. into_tuple :: < i32 > ( ) . all ( db) . await
576587 }
577588 SortOption :: Datetime => {
578- let mut query = Self :: build_base_query ( game_type)
589+ let query = Self :: build_base_query ( game_type)
579590 . select_only ( )
580591 . column ( games:: Column :: Id ) ;
581- query = match sort_order {
582- SortOrder :: Asc => query. order_by_asc ( games:: Column :: Date ) ,
583- SortOrder :: Desc => query. order_by_desc ( games:: Column :: Date ) ,
584- } ;
585- query. into_tuple :: < i32 > ( ) . all ( db) . await
592+ Self :: apply_date_order ( query, sort_order)
593+ . into_tuple :: < i32 > ( )
594+ . all ( db)
595+ . await
586596 }
587597 SortOption :: LastPlayed => {
588598 use crate :: entity:: game_statistics;
@@ -620,12 +630,9 @@ impl GamesRepository {
620630 query. all ( db) . await
621631 }
622632 SortOption :: Datetime => {
623- let mut query = Self :: build_base_query ( game_type) ;
624- query = match sort_order {
625- SortOrder :: Asc => query. order_by_asc ( games:: Column :: Date ) ,
626- SortOrder :: Desc => query. order_by_desc ( games:: Column :: Date ) ,
627- } ;
628- query. all ( db) . await
633+ Self :: apply_date_order ( Self :: build_base_query ( game_type) , sort_order)
634+ . all ( db)
635+ . await
629636 }
630637 SortOption :: LastPlayed => {
631638 let query = Self :: build_base_query ( game_type) . left_join ( game_statistics:: Entity ) ;
0 commit comments