Compare commits

..
3 Commits
Author SHA1 Message Date
rootandClaude Opus 5 4cdca06289 修复子渠道汇总到父渠道时未区分 appId 导致数据多加
ChannelStat 按 (channel, sumDate, appId) 三维存储,但子渠道累加到父渠道的
匹配条件只比了 ParentChannel 和 SumDate,漏了 AppId。

当父渠道在多个 app 下都有记录时(如 appId=[2,3,4] 查同一渠道码),一个子渠道
的数据会被同时累加进该 (channel, sumDate) 下所有 app 的父渠道行,选几个 app
就多加几倍。settlement 的三处子查询本身也没有 appId 约束,父列表虽锁定单个
appId,子列表却跨 app,同样会把其他 app 的子渠道数据算进结算金额。

5 处匹配条件统一补上 child.AppId == parent.AppId:
- stat.go:162          SearchChannelStat         (列表接口,多值 appId)
- settlement.go:200    ChannelSettlementCalc     (结算计算,影响金额)
- settlement.go:327    SearchChannelSettlementStat2 (原本父子共用同一 filter
                       而侥幸正确,补上以免后续改动破坏该前提)
- settlement.go:857    AddSettlementInfo2        (影响金额)
- settlement.go:1138   DetailSettlementInfo

本次只改匹配条件。settlement 三处 childFilter 缺少 appId 约束的冗余查询,
以及 SearchChannelStat 在无 start/end 时 resp.Total 硬编码为 1000000、
withChild 累加被 canSum 跳过的问题,均未处理。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-10-02 09:38:03 +08:00
rootandClaude Opus 5 836e42b364 修复排名图空数据时生成坏图
innerServers 未配置时 GetRankPhoto/GetRankDetail 的跨服循环零次执行,
statList 为空仍继续渲染。go-charts 对空数据集会把坐标轴范围退化成
math.MinInt64 与 NaN,产出一张 Y 轴刻度为 -9,223,372,036,854,776,000、
X 轴为 NaN、图例全 0 的坏图,并照常推送到群里。

增加 ErrNoRankData 哨兵错误,两个函数在渲染前拦截空数据集。11 个调用点
原本就是 if err != nil { return err },无需改动即可全部覆盖。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-27 09:13:03 +08:00
root 0deb1bbedc 糖果短剧 2026-09-27 08:53:36 +08:00
4 changed files with 82 additions and 5 deletions
File diff suppressed because one or more lines are too long
+4 -4
View File
@@ -197,7 +197,7 @@ func ChannelSettlementCalc(ctx context.Context, req *proto.SettlementCalcReq) (*
for _, parent := range ParentList {
parent.CorrectValidData()
for _, child := range ChildList {
if child.ParentChannel == parent.Channel && child.SumDate.Equal(parent.SumDate) {
if child.ParentChannel == parent.Channel && child.AppId == parent.AppId && child.SumDate.Equal(parent.SumDate) {
channelmod.ChannelStatSummation(parent, child.CorrectValidData()) // 把子渠道的数据累加到父渠道上面
}
}
@@ -324,7 +324,7 @@ func SearchChannelSettlementStat2(ctx context.Context, req *proto.ChannelStatSet
for _, parent := range ParentsChannelStatList {
parent.CorrectValidData()
for _, child := range ChildChannelStatList {
if child.ParentChannel == parent.Channel && child.SumDate.Equal(parent.SumDate) {
if child.ParentChannel == parent.Channel && child.AppId == parent.AppId && child.SumDate.Equal(parent.SumDate) {
channelmod.ChannelStatSummation(parent, child) // 把子渠道的数据累加到父渠道上面
}
}
@@ -854,7 +854,7 @@ func AddSettlementInfo2(ctx context.Context, req *proto.SettlementInfoAdd2, accT
for _, parent := range ParentList {
parent.CorrectValidData()
for _, child := range ChildList {
if child.ParentChannel == parent.Channel && child.SumDate.Equal(parent.SumDate) {
if child.ParentChannel == parent.Channel && child.AppId == parent.AppId && child.SumDate.Equal(parent.SumDate) {
channelmod.ChannelStatSummation(parent, child) // 把子渠道的数据累加到父渠道上面
}
}
@@ -1138,7 +1138,7 @@ func DetailSettlementInfo(ctx context.Context, req proto.SettlementInfoDetail) (
// 把子级记录汇总到一级记录上面
for _, parent := range ParentsChannelStatList {
for _, child := range ChildsChannelStatList {
if child.ParentChannel == parent.Channel && child.SumDate.Equal(parent.SumDate) {
if child.ParentChannel == parent.Channel && child.AppId == parent.AppId && child.SumDate.Equal(parent.SumDate) {
channelmod.ChannelStatSummation(parent, child) // 把子渠道的数据累加到父渠道上面
}
}
+1 -1
View File
@@ -159,7 +159,7 @@ func SearchChannelStat(ctx context.Context, req *proto.ChannelStatSearch) (*prot
channelmod.ChannelStatSummation(&resp.TotalInfo, item)
if req.WithChild != nil && *req.WithChild {
for _, v := range ChannelStatList {
if item.ParentChannel == v.Channel && v.SumDate.Equal(item.SumDate) {
if item.ParentChannel == v.Channel && item.AppId == v.AppId && v.SumDate.Equal(item.SumDate) {
channelmod.ChannelStatSummation(v, item)
}
}
+15
View File
@@ -2,6 +2,7 @@ package crossSer
import (
"context"
"errors"
"fmt"
"sort"
"stat/api/proto"
@@ -20,6 +21,11 @@ import (
"github.com/vicanso/go-charts/v2"
)
// ErrNoRankData 排名数据为空。空数据集不能交给 go-charts 渲染: 坐标轴范围会退化成
// math.MinInt64 与 NaN,产出一张刻度为 -9,223,372,036,854,776,000 的坏图。
// 常见原因是 innerServers 未配置,跨服循环零次执行。
var ErrNoRankData = errors.New("排名数据为空,无法生成图表(请检查 innerServers 配置)")
var Colors = []drawing.Color{
drawing.ColorFromHex("0780cf"),
drawing.ColorFromHex("765005"),
@@ -353,6 +359,11 @@ func GetRankPhoto(reportTime time.Time, title string, getValue FuncGetStatValue)
}
}
}
// 空数据集不能进入渲染: go-charts 会把坐标轴范围退化成 MinInt64/NaN,
// 产出一张刻度为 -9,223,372,036,854,776,000 的坏图并照常发到群里。
if len(statList) == 0 {
return "", nil, ErrNoRankData
}
// sort
sort.Sort(statList)
// draw chart
@@ -481,6 +492,10 @@ func GetRankDetail(reportTime time.Time, title string, getValue FuncGetStatValue
}
}
}
// 同 GetRankPhoto: 空数据集会渲染出坐标轴为 MinInt64/NaN 的坏图
if len(statList) == 0 {
return "", ErrNoRankData
}
// sort
sort.Sort(statList)
// draw chart