This commit is contained in:
@@ -313,6 +313,51 @@ func main() {
|
||||
srcDB.Find(&subPlans)
|
||||
srcDB.Find(&payments)
|
||||
|
||||
// ── 处理多订阅:如果用户有多个订阅,仅保留未过期的 ──
|
||||
nowTime := time.Now()
|
||||
subByUser := make(map[int64][]UserSubscribe)
|
||||
for _, s := range subscribes {
|
||||
subByUser[s.UserId] = append(subByUser[s.UserId], s)
|
||||
}
|
||||
|
||||
var validSubscribes []UserSubscribe
|
||||
for _, subs := range subByUser {
|
||||
if len(subs) <= 1 {
|
||||
// 单个订阅直接保留
|
||||
validSubscribes = append(validSubscribes, subs...)
|
||||
continue
|
||||
}
|
||||
|
||||
var unexpired []UserSubscribe
|
||||
var latest *UserSubscribe
|
||||
|
||||
for i := range subs {
|
||||
s := subs[i]
|
||||
// 如果没有过期时间,或者过期时间在当前时间之后
|
||||
if s.ExpireTime == nil || s.ExpireTime.After(nowTime) {
|
||||
unexpired = append(unexpired, s)
|
||||
}
|
||||
|
||||
// 记录到期时间最晚的一个,以防全部都过期了
|
||||
if latest == nil {
|
||||
latest = &s
|
||||
} else if latest.ExpireTime != nil && s.ExpireTime != nil && s.ExpireTime.After(*latest.ExpireTime) {
|
||||
latest = &s
|
||||
} else if latest.ExpireTime != nil && s.ExpireTime == nil {
|
||||
latest = &s
|
||||
}
|
||||
}
|
||||
|
||||
if len(unexpired) > 0 {
|
||||
// 存在未过期的订阅,仅保留所有未过期的
|
||||
validSubscribes = append(validSubscribes, unexpired...)
|
||||
} else if latest != nil {
|
||||
// 如果全部过期,仅保留到期时间最晚的那一个
|
||||
validSubscribes = append(validSubscribes, *latest)
|
||||
}
|
||||
}
|
||||
subscribes = validSubscribes
|
||||
|
||||
fmt.Println("OK")
|
||||
fmt.Println()
|
||||
fmt.Println(" 数据统计:")
|
||||
@@ -631,6 +676,11 @@ func main() {
|
||||
|
||||
err = dstDB.Transaction(func(tx *gorm.DB) error {
|
||||
for _, uid := range paidIDs {
|
||||
// 只为多设备用户创建家庭组
|
||||
if len(deviceByUser[uid]) <= 1 {
|
||||
continue
|
||||
}
|
||||
|
||||
family := UserFamily{
|
||||
OwnerUserId: uid,
|
||||
MaxMembers: defaultFamilyMaxSize,
|
||||
@@ -703,10 +753,40 @@ func main() {
|
||||
}
|
||||
}
|
||||
|
||||
// 4. 查找原用户的家庭组
|
||||
// 4. 查找原用户的家庭组(如果不存在则创建,虽然理论上 Step 8 已经为多设备用户创建了)
|
||||
var family UserFamily
|
||||
if err := tx.Where("owner_user_id = ?", s.OwnerUID).First(&family).Error; err != nil {
|
||||
return fmt.Errorf("查找家庭组失败(owner=%d): %w", s.OwnerUID, err)
|
||||
if err == gorm.ErrRecordNotFound {
|
||||
// 补救措施:为该用户创建一个家庭组
|
||||
family = UserFamily{
|
||||
OwnerUserId: s.OwnerUID,
|
||||
MaxMembers: defaultFamilyMaxSize,
|
||||
Status: 1,
|
||||
CreatedAt: now,
|
||||
UpdatedAt: now,
|
||||
}
|
||||
if err := tx.Create(&family).Error; err != nil {
|
||||
return fmt.Errorf("创建家庭组补救失败(owner=%d): %w", s.OwnerUID, err)
|
||||
}
|
||||
|
||||
// 创建家主成员
|
||||
ownerMember := UserFamilyMember{
|
||||
FamilyId: family.Id,
|
||||
UserId: s.OwnerUID,
|
||||
Role: familyRoleOwner,
|
||||
Status: 1,
|
||||
JoinSource: "migration_split_recovery",
|
||||
JoinedAt: now,
|
||||
CreatedAt: now,
|
||||
UpdatedAt: now,
|
||||
}
|
||||
if err := tx.Create(&ownerMember).Error; err != nil {
|
||||
return fmt.Errorf("创建家主成员补救失败(owner=%d): %w", s.OwnerUID, err)
|
||||
}
|
||||
familyCount++ // 更新计数器
|
||||
} else {
|
||||
return fmt.Errorf("查找家庭组失败(owner=%d): %w", s.OwnerUID, err)
|
||||
}
|
||||
}
|
||||
|
||||
// 5. 加入家庭组
|
||||
|
||||
Reference in New Issue
Block a user