fix: 店铺分配覆盖为实名即生效的套餐纳入沉默期配置口径
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 9m27s

存量中套餐本身购买即生效、店铺分配覆盖为实名即生效的正式套餐,购买后同样等实名,
但原口径只看套餐本身:无法配置默认沉默期、不进未配置清单与打开前检查,
待实名记录无法回填导致总开关打不开,新购买也绕过沉默期。

- 未配置清单与打开前检查纳入存在实名即生效分配覆盖的套餐
- 购买即生效正式套餐允许选填默认沉默期,加油包仍禁止
- 分配覆盖购买即生效 → 实名即生效在套餐已配置默认沉默期时放行
- 同步 OpenSpec design D11、spec、tasks 3.4/3.5 与前端说明

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
邹进
2026-10-27 17:56:29 +09:00
parent 69ec98aa5f
commit af57de0d4d
7 changed files with 59 additions and 21 deletions

View File

@@ -154,7 +154,10 @@ func (s *PackageStore) CountBySeriesID(ctx context.Context, seriesID uint) (int6
}
// SilenceUnconfiguredPackageCondition 返回"未配置默认沉默期的实名即生效正式套餐"的条件(总开关打开前检查与补齐清单共用)。
// 实名即生效包含套餐本身 from_activation,以及存在未删除的店铺分配覆盖为 from_activation 的套餐(design D11)。
func SilenceUnconfiguredPackageCondition(alias string) string {
return alias + ".package_type <> '" + constants.PackageTypeAddon + "' AND " + alias + ".expiry_base = '" +
constants.PackageExpiryBaseFromActivation + "' AND " + alias + ".silence_period_days IS NULL"
return alias + ".package_type <> '" + constants.PackageTypeAddon + "' AND " + alias + ".silence_period_days IS NULL AND (" +
alias + ".expiry_base = '" + constants.PackageExpiryBaseFromActivation + "' OR EXISTS (" +
"SELECT 1 FROM tb_shop_package_allocation AS silence_alloc WHERE silence_alloc.package_id = " + alias + ".id" +
" AND silence_alloc.deleted_at IS NULL AND silence_alloc.expiry_base_override = '" + constants.PackageExpiryBaseFromActivation + "'))"
}