feat(phase2): 数据回传聚合与可信分账(F09/F18)
- internal/playback: 播放事件存储/MA码维度聚合/分账结算(CP60/平台34/服务费6) - service: ReportPlayback(链上状态门禁)/PlaybackSummary/ComputeSettlement - api: /data/playback, /data/playback-summary, /settlement/compute - 分账取余兜底无丢分; 未知/已下架MA码回传被拒 - 13项新测试通过; 端到端验证: 回传3条→聚合40元→分账24/13.6/2.4
This commit is contained in:
@@ -174,3 +174,34 @@ func (s *Service) RestoreEpisode(role chain.Role, maCode string, episode int) er
|
||||
func certContainsMA(cert, maCode string) bool {
|
||||
return cert != "" && maCode != "" && strings.Contains(cert, maCode)
|
||||
}
|
||||
|
||||
// ---- 二期 F09/F18:数据回传聚合与分账(需求9/需求21) ----
|
||||
|
||||
// ReportPlayback 运营商以 MA 码为维度批量回传播放/消费事件(需求9-AC1)。
|
||||
// 仅当 MA 码存在且处于流通状态时接收,保证数据归属可信。
|
||||
func (s *Service) ReportPlayback(events []model.PlaybackEvent) (accepted int, rejected int) {
|
||||
valid := make([]model.PlaybackEvent, 0, len(events))
|
||||
for _, e := range events {
|
||||
c, err := s.chain.QueryContent(e.MACode)
|
||||
if err != nil || c.Status == model.StatusRevoked {
|
||||
rejected++
|
||||
continue
|
||||
}
|
||||
valid = append(valid, e)
|
||||
}
|
||||
accepted = s.pb.Ingest(valid)
|
||||
return accepted, rejected
|
||||
}
|
||||
|
||||
// PlaybackSummary 查询按 MA 码聚合的可信播放数据(需求9-AC2/AC3)。
|
||||
func (s *Service) PlaybackSummary(maCode string) model.PlaybackSummary {
|
||||
return s.pb.Summary(maCode)
|
||||
}
|
||||
|
||||
// ComputeSettlement 基于可信播放数据计算分账(需求21-AC3)。
|
||||
func (s *Service) ComputeSettlement(maCode, period string) (model.Settlement, error) {
|
||||
if _, err := s.chain.QueryContent(maCode); err != nil {
|
||||
return model.Settlement{}, err
|
||||
}
|
||||
return s.pb.ComputeSettlement(maCode, period, model.DefaultShareConfig())
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user