2025-11-16 20:30:17 +00:00
package service
import (
"blazing/cool"
2026-01-19 18:51:56 +08:00
"blazing/modules/player/model"
2026-04-12 13:27:39 +08:00
"fmt"
"strings"
2026-01-31 19:10:36 +08:00
"github.com/gogf/gf/v2/frame/g"
2025-11-16 20:30:17 +00:00
)
type DoneService struct {
BaseService
}
func NewDoneService ( id uint32 ) * DoneService {
return & DoneService {
BaseService : BaseService { userid : id ,
Service : & cool . Service { Model : model . NewMilestone ( ) , UniqueKey : map [ string ] string {
"player_id" : "角色名称不能重复" ,
} } ,
} ,
}
}
2026-01-31 19:10:36 +08:00
// ID
2026-02-02 18:32:41 +08:00
// 击杀-捕捉
2026-01-31 19:10:36 +08:00
func ( s * DoneService ) UpdatePet ( ptye model . PetInfo , res ... uint32 ) {
2026-02-01 11:09:34 +08:00
//属性->属性值->ID 击杀-捕捉-炫彩击杀-炫彩捕捉 雄性 雌性
2026-01-31 19:10:36 +08:00
args := [ ] uint32 { ptye . ID }
r1 := s . get ( model . MilestoneMode . Pet , args )
results := make ( [ ] uint32 , len ( res ) )
if r1 != nil {
results = r1 . Results
}
for i , v := range res {
results [ i ] += v
}
s . update ( model . MilestoneMode . Pet , args , results )
2026-02-14 07:36:05 +08:00
}
func ( s * DoneService ) UpdateRoom ( res ... uint32 ) {
args := [ ] uint32 { 0 }
r1 := s . get ( model . MilestoneMode . Room , args )
results := make ( [ ] uint32 , len ( res ) )
if r1 != nil {
results = r1 . Results
}
for i , v := range res {
results [ i ] += v
}
s . update ( model . MilestoneMode . Room , args , results )
2026-01-31 19:10:36 +08:00
}
// 内部方法,实现更新
func ( s * DoneService ) update ( ptye model . EnumMilestone , args [ ] uint32 , results [ ] uint32 ) {
if cool . Config . ServerInfo . IsVip != 0 {
2026-02-13 22:57:05 +08:00
2026-01-31 19:10:36 +08:00
return
}
2026-04-12 13:27:39 +08:00
whereArgs , whereParams := buildJSONBArrayAnyCondition ( "args" , args )
if t , _ := s . dbm_fix ( s . Model ) . Where ( "done_type" , ptye ) . Wheref ( whereArgs , whereParams ... ) .
2026-01-31 19:10:36 +08:00
Wheref ( ` jsonb_typeof(args) = ? ` , "array" ) . Exist ( ) ; t {
2026-04-12 13:27:39 +08:00
s . dbm_fix ( s . Model ) . Where ( "done_type" , ptye ) . Wheref ( whereArgs , whereParams ... ) .
2026-01-31 19:10:36 +08:00
Wheref ( ` jsonb_typeof(args) = ? ` , "array" ) . Data (
g . Map {
"results" : results ,
} ,
) . Update ( )
} else {
r := g . Map {
"player_id" : s . userid ,
"done_type" : ptye ,
"args" : args ,
"results" : results ,
}
2026-02-13 22:57:05 +08:00
s . dbm_fix ( s . Model ) . Data ( r ) . Insert ( )
2026-01-31 19:10:36 +08:00
}
}
func ( s * DoneService ) get ( ptye model . EnumMilestone , args [ ] uint32 ) * model . Milestone {
var Barges * model . Milestone
2026-04-12 13:27:39 +08:00
whereArgs , whereParams := buildJSONBArrayAnyCondition ( "args" , args )
s . dbm_fix ( s . Model ) . Where ( "done_type" , ptye ) . Wheref ( whereArgs , whereParams ... ) .
2026-01-31 19:10:36 +08:00
Wheref ( ` jsonb_typeof(args) = ? ` , "array" ) . Scan ( & Barges )
return Barges
}
2026-04-12 13:27:39 +08:00
func buildJSONBArrayAnyCondition ( column string , values [ ] uint32 ) ( string , [ ] any ) {
if len ( values ) == 0 {
return "FALSE" , nil
}
clauses := make ( [ ] string , 0 , len ( values ) + 1 )
params := make ( [ ] any , 0 , len ( values ) + 1 )
for _ , value := range values {
2026-04-15 03:46:55 +08:00
clauses = append ( clauses , fmt . Sprintf (
` EXISTS (SELECT 1 FROM jsonb_array_elements_text(CASE WHEN jsonb_typeof(%s) = 'array' THEN %s ELSE '[]'::jsonb END) AS elem WHERE elem = CAST(? AS text)) ` ,
column ,
column ,
) )
2026-04-12 13:27:39 +08:00
params = append ( params , value )
}
2026-04-15 03:46:55 +08:00
clauses = append ( clauses , fmt . Sprintf (
` CASE WHEN jsonb_typeof(%s) = 'array' THEN jsonb_array_length(%s) ELSE -1 END = ? ` ,
column ,
column ,
) )
2026-04-12 13:27:39 +08:00
params = append ( params , len ( values ) )
return strings . Join ( clauses , " AND " ) , params
}
2026-01-31 19:10:36 +08:00
func ( s * DoneService ) PetBarge ( start , end uint32 ) [ ] model . Milestone {
var Barges [ ] model . Milestone
2026-02-13 22:57:05 +08:00
s . dbm_fix ( s . Model ) . Where ( "done_type" , model . MilestoneMode . Pet ) .
2026-01-31 19:10:36 +08:00
Wheref ( ` jsonb_typeof(args) = ? ` , "array" ) .
Wheref ( ` jsonb_typeof(args) != ? ` , "'[]'::jsonb" ) .
Wheref ( ` (args->> 0)::int BETWEEN ? AND ? ` , start , end ) .
Scan ( & Barges )
return Barges
}