补全分销分账结算闭环并修复站点越权

- 权限落库:新增 000066 迁移,注册 11 个 distribution:* 权限并授权 super_admin/ops/finance
- 越权修复:siteAccessAllowed 校验贯穿站点/规则/订单/展示/支付通道/结算全部按 ID 操作
- 分账闭环:SplitSettlement 按比例拆分分成基数,销售加价归卖出方,尾差记入 rounding_adjustment_cent 归平台;支付快照与退款重算均按拆分写入参与方金额
- 结算批次:创建时聚合周期内待结算订单生成明细并汇总金额,结算时校验明细与总额一致后联动置位财务快照
- 手工补数接口禁止覆盖已有快照并写入审计日志
- 杂项:二维码池校验站点启用状态且不吞真实 DB 错误;绑定支付通道校验商户配置存在;表探测改为 sync.Once 缓存
This commit is contained in:
yml2213
2026-09-05 11:12:44 +08:00
parent 576cadcafa
commit ac777f5b16
11 changed files with 547 additions and 98 deletions
+11 -4
View File
@@ -306,11 +306,18 @@ func fetchUnusedQrCode(tx *gorm.DB) (*model.ChatQrCode, error) {
func fetchUnusedQrCodeForListing(tx *gorm.DB, listingID uint64) (*model.ChatQrCode, error) {
var relation model.DistributionSiteAccount
if err := tx.Where("listing_id = ? AND display_status = 'enabled'", listingID).Order("id ASC").First(&relation).Error; err == nil {
// 仅匹配启用中的分销站点,真实 DB 错误直接返回,避免误回退到全局二维码池。
err := tx.Table("distribution_site_accounts AS relation").
Select("relation.*").
Joins("JOIN distribution_sites AS site ON site.id = relation.site_id AND site.status = 'active'").
Where("relation.listing_id = ? AND relation.display_status = 'enabled'", listingID).
Order("relation.id ASC").
Scan(&relation).Error
if err != nil {
return nil, err
}
if relation.ID != 0 {
return fetchUnusedQrCodeForSite(tx, &relation.SiteID)
} else if !errors.Is(err, gorm.ErrRecordNotFound) {
// 兼容尚未执行分销迁移的环境,继续使用全局二维码池。
return fetchUnusedQrCodeForSite(tx, nil)
}
return fetchUnusedQrCodeForSite(tx, nil)
}
@@ -23,6 +23,8 @@ func setupQrCodeTestDB(t *testing.T) *gorm.DB {
}
if err := db.AutoMigrate(
&model.ChatQrCode{},
&model.DistributionSite{},
&model.DistributionSiteAccount{},
&model.ChatConversation{},
&model.ChatParticipant{},
&model.ChatMessage{},