fix media supply citation attribution
Desktop Client Build / Resolve Build Metadata (push) Successful in 26s
Frontend CI / Frontend (push) Successful in 2m53s
Backend CI / Backend (push) Successful in 16m37s
Desktop Client Build / Build Desktop Client (push) Successful in 23m40s
Desktop Client Build / Publish Client Artifacts to NAS (push) Successful in 28s

This commit is contained in:
2026-06-25 23:53:35 +08:00
parent 89ef95b65d
commit 6780963c28
16 changed files with 1033 additions and 457 deletions
@@ -3733,9 +3733,9 @@ func (s *MonitoringService) loadCitedArticleSourceMeta(ctx context.Context, tena
manualIDs := make([]int64, 0, len(sources))
for _, source := range sources {
switch source.SourceType {
case "published_article":
case monitoringContentSourcePublishedArticle:
publishedIDs = append(publishedIDs, source.SourceID)
case "manual_mark":
case monitoringContentSourceManualMark:
manualIDs = append(manualIDs, source.SourceID)
}
}
@@ -3766,7 +3766,7 @@ func (s *MonitoringService) loadCitedArticleSourceMeta(ctx context.Context, tena
item.ArticleID = &value
item.ArticleTitle = repairMonitoringMojibake(item.ArticleTitle)
item.PublishPlatform = repairMonitoringMojibake(item.PublishPlatform)
item.SourceType = "published_article"
item.SourceType = monitoringContentSourcePublishedArticle
item.SourceID = articleID
result[monitoringContentSourceKey(item.SourceType, item.SourceID)] = item
}
@@ -3796,13 +3796,68 @@ func (s *MonitoringService) loadCitedArticleSourceMeta(ctx context.Context, tena
}
item.ArticleTitle = repairMonitoringMojibake(item.ArticleTitle)
item.PublishPlatform = repairMonitoringMojibake(item.PublishPlatform)
item.SourceType = "manual_mark"
item.SourceType = monitoringContentSourceManualMark
result[monitoringContentSourceKey(item.SourceType, item.SourceID)] = item
}
if err := rows.Err(); err != nil {
return nil, response.ErrInternal(50041, "scan_failed", "failed to iterate marked article metadata")
}
}
mediaItems, err := s.loadMediaSupplyCitedArticleSourceMeta(ctx, tenantID, sources)
if err != nil {
return nil, err
}
for key, item := range mediaItems {
result[key] = item
}
return result, nil
}
func (s *MonitoringService) loadMediaSupplyCitedArticleSourceMeta(ctx context.Context, tenantID int64, sources []monitoringCitedArticleSourceRow) (map[string]MonitoringCitedArticle, error) {
result := make(map[string]MonitoringCitedArticle)
mediaItemIDs := make([]int64, 0, len(sources))
for _, source := range sources {
if source.SourceType == monitoringContentSourceMediaSupplyOrderItem {
mediaItemIDs = append(mediaItemIDs, source.SourceID)
}
}
if len(mediaItemIDs) == 0 {
return result, nil
}
rows, err := s.businessPool.Query(ctx, `
SELECT
i.id,
o.article_id,
COALESCE(NULLIF(o.title, ''), NULLIF(i.resource_name_snapshot, ''), '未命名文章') AS article_title,
COALESCE(NULLIF(i.resource_name_snapshot, ''), $3) AS publish_platform,
i.external_article_url
FROM media_supply_order_items i
JOIN media_supply_orders o ON o.id = i.order_id
WHERE o.tenant_id = $1
AND i.id = ANY($2)
AND o.deleted_at IS NULL
`, tenantID, mediaItemIDs, monitoringMediaSupplySubmissionCitationLabel)
if err != nil {
return nil, response.ErrInternal(50041, "query_failed", "failed to load media supply citation metadata")
}
defer rows.Close()
for rows.Next() {
var item MonitoringCitedArticle
var articleID sql.NullInt64
if scanErr := rows.Scan(&item.SourceID, &articleID, &item.ArticleTitle, &item.PublishPlatform, &item.SourceURL); scanErr != nil {
return nil, response.ErrInternal(50041, "scan_failed", "failed to parse media supply citation metadata")
}
item.ArticleID = nullableInt64Value(articleID)
item.ArticleTitle = repairMonitoringMojibake(item.ArticleTitle)
item.PublishPlatform = repairMonitoringMojibake(item.PublishPlatform)
item.SourceType = monitoringContentSourceMediaSupplyOrderItem
result[monitoringContentSourceKey(item.SourceType, item.SourceID)] = item
}
if err := rows.Err(); err != nil {
return nil, response.ErrInternal(50041, "scan_failed", "failed to iterate media supply citation metadata")
}
return result, nil
}
@@ -4012,7 +4067,7 @@ func (s *MonitoringService) loadCitationsForRuns(ctx context.Context, tenantID i
return result, nil
}
aliasIndex, err := loadMonitoringPublishedAliasIndex(ctx, s.monitoringPool, tenantID)
aliasIndex, err := loadMonitoringPublishedAliasIndex(ctx, s.monitoringPool, s.businessPool, tenantID)
if err != nil {
return nil, err
}
@@ -4120,7 +4175,7 @@ func (s *MonitoringService) loadCitationsForRuns(ctx context.Context, tenantID i
articleTitle = &title
aliasSourceType := strings.TrimSpace(alias.SourceType)
if aliasSourceType == "" {
aliasSourceType = "published_article"
aliasSourceType = monitoringContentSourcePublishedArticle
}
sourceType = &aliasSourceType
aliasSourceID := alias.SourceID