补全分销分账结算闭环并修复站点越权
- 权限落库:新增 000066 迁移,注册 11 个 distribution:* 权限并授权 super_admin/ops/finance - 越权修复:siteAccessAllowed 校验贯穿站点/规则/订单/展示/支付通道/结算全部按 ID 操作 - 分账闭环:SplitSettlement 按比例拆分分成基数,销售加价归卖出方,尾差记入 rounding_adjustment_cent 归平台;支付快照与退款重算均按拆分写入参与方金额 - 结算批次:创建时聚合周期内待结算订单生成明细并汇总金额,结算时校验明细与总额一致后联动置位财务快照 - 手工补数接口禁止覆盖已有快照并写入审计日志 - 杂项:二维码池校验站点启用状态且不吞真实 DB 错误;绑定支付通道校验商户配置存在;表探测改为 sync.Once 缓存
This commit is contained in:
@@ -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{},
|
||||
|
||||
Reference in New Issue
Block a user