@@ -7,7 +7,7 @@ use crate::database::dto::{
77 BatchOperationError , BatchOperationResult , InsertGameData , UpdateGameData ,
88} ;
99use crate :: entity:: prelude:: * ;
10- use crate :: entity:: { games, savedata} ;
10+ use crate :: entity:: { game_statistics , games, savedata} ;
1111use sea_orm:: sea_query:: Expr ;
1212use sea_orm:: * ;
1313use serde:: { Deserialize , Serialize } ;
@@ -463,6 +463,19 @@ impl GamesRepository {
463463 . order_by_asc ( games:: Column :: Id )
464464 }
465465
466+ /// 最近游玩排序:无游玩记录始终置末尾,升序按最近优先,降序按最久优先。
467+ fn apply_last_played_order ( query : Select < Games > , sort_order : SortOrder ) -> Select < Games > {
468+ let query = query. left_join ( game_statistics:: Entity ) . order_by (
469+ Expr :: col ( game_statistics:: Column :: LastPlayed ) . is_null ( ) ,
470+ Order :: Asc ,
471+ ) ;
472+ match sort_order {
473+ SortOrder :: Asc => query. order_by_desc ( game_statistics:: Column :: LastPlayed ) ,
474+ SortOrder :: Desc => query. order_by_asc ( game_statistics:: Column :: LastPlayed ) ,
475+ }
476+ . order_by_asc ( games:: Column :: Id )
477+ }
478+
466479 /// 应用层排序:按可选数值键排序,None 值统一置末尾
467480 ///
468481 /// - `key_fn`:从游戏记录提取排序键,返回 `Option<K>`
@@ -595,13 +608,10 @@ impl GamesRepository {
595608 . await
596609 }
597610 SortOption :: LastPlayed => {
598- use crate :: entity:: game_statistics;
599- Self :: build_base_query ( game_type)
611+ let query = Self :: build_base_query ( game_type)
600612 . select_only ( )
601- . column ( games:: Column :: Id )
602- . left_join ( game_statistics:: Entity )
603- . order_by ( game_statistics:: Column :: LastPlayed , Order :: Desc )
604- . order_by_asc ( games:: Column :: Id )
613+ . column ( games:: Column :: Id ) ;
614+ Self :: apply_last_played_order ( query, sort_order)
605615 . into_tuple :: < i32 > ( )
606616 . all ( db)
607617 . await
@@ -618,8 +628,6 @@ impl GamesRepository {
618628 sort_order : SortOrder ,
619629 language : Option < String > ,
620630 ) -> Result < Vec < games:: Model > , DbErr > {
621- use crate :: entity:: game_statistics;
622-
623631 match sort_option {
624632 SortOption :: Addtime => {
625633 let mut query = Self :: build_base_query ( game_type) ;
@@ -635,10 +643,7 @@ impl GamesRepository {
635643 . await
636644 }
637645 SortOption :: LastPlayed => {
638- let query = Self :: build_base_query ( game_type) . left_join ( game_statistics:: Entity ) ;
639- query
640- . order_by ( game_statistics:: Column :: LastPlayed , Order :: Desc )
641- . order_by_asc ( games:: Column :: Id )
646+ Self :: apply_last_played_order ( Self :: build_base_query ( game_type) , sort_order)
642647 . all ( db)
643648 . await
644649 }
0 commit comments