注销
Build docker and publish / build (20.15.1) (push) Successful in 7m34s

This commit is contained in:
2026-03-17 07:12:42 -07:00
parent 3cd22d8538
commit dcdbabdb13
15 changed files with 195 additions and 51 deletions
+82 -2
View File
@@ -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. 加入家庭组