fix(growth): harden deterministic report evidence

This commit is contained in:
2026-08-21 00:32:21 +03:30
parent 1d8d4edf92
commit 6c80f71847
11 changed files with 369 additions and 103 deletions

View File

@@ -9,16 +9,17 @@ import (
)
type FingerprintInput struct {
MerchantID int64 `json:"merchantId"`
TerminalID string `json:"terminalId,omitempty"`
DatasetWatermark string `json:"datasetWatermark"`
ForecastStart time.Time `json:"forecastStart"`
HorizonDays int `json:"horizonDays"`
CatalogVersion string `json:"catalogVersion"`
AnalyticsVersion string `json:"analyticsVersion"`
PromptVersion string `json:"promptVersion"`
SchemaVersion string `json:"schemaVersion"`
Model string `json:"model"`
MerchantID int64 `json:"merchantId"`
TerminalID string `json:"terminalId,omitempty"`
DatasetWatermark string `json:"datasetWatermark"`
ForecastStart time.Time `json:"forecastStart"`
HorizonDays int `json:"horizonDays"`
CatalogVersion string `json:"catalogVersion"`
AnalyticsVersion string `json:"analyticsVersion"`
PromptVersion string `json:"promptVersion"`
SchemaVersion string `json:"schemaVersion"`
Model string `json:"model"`
ModelConfigVersion string `json:"modelConfigVersion"`
}
func Fingerprint(input FingerprintInput) string {
@@ -30,6 +31,7 @@ func Fingerprint(input FingerprintInput) string {
DatasetWatermark: input.DatasetWatermark, HorizonDays: input.HorizonDays,
CatalogVersion: input.CatalogVersion, AnalyticsVersion: input.AnalyticsVersion,
PromptVersion: input.PromptVersion, SchemaVersion: input.SchemaVersion, Model: input.Model,
ModelConfigVersion: input.ModelConfigVersion,
}, ForecastDate: input.ForecastStart.In(tehranLocation()).Format(time.DateOnly)})
if err != nil {
return ""
@@ -95,6 +97,7 @@ func BuildFallback(bundle EvidenceBundle) []CampaignBrief {
HeadlineFA: "یک فرصت مناسب در راه است: " + opportunity.EventTitleFA,
GuidanceFA: "داده‌های قبلی شما نشان می‌دهد این مناسبت می‌تواند برای برنامه‌ریزی فروش ارزشمند باشد.",
OfferFA: "پیشنهاد خود را متناسب با نیاز مشتریان این مناسبت آماده کنید.",
MessageFA: "برای این مناسبت یک پیشنهاد ویژه برای شما آماده کرده‌ایم.",
PreparationFA: "موجودی، پیام کمپین و مسیر پرداخت را پیش از شروع مناسبت بررسی کنید.",
LimitationFA: "این پیشنهاد بر پایه الگوهای گذشته است و نتیجه قطعی نیست.",
EvidenceIDs: []string{opportunity.EvidenceID},
@@ -105,6 +108,7 @@ func BuildFallback(bundle EvidenceBundle) []CampaignBrief {
HeadlineFA: "برای یک بازه آرام‌تر آماده باشید",
GuidanceFA: "الگوی گذشته احتمال کاهش فعالیت را در این بازه نشان می‌دهد.",
OfferFA: "یک پیشنهاد سبک برای حفظ ارتباط با مشتریان در نظر بگیرید.",
MessageFA: "این روزها هم کنار شما هستیم؛ پیشنهادهای تازه را ببینید.",
PreparationFA: "پیام یادآوری و تجربه پرداخت را پیش از این بازه بازبینی کنید.",
LimitationFA: "این هشدار بر پایه الگوهای گذشته است و نتیجه قطعی نیست.",
EvidenceIDs: []string{risk.EvidenceID},