feat(media-supply): add media resource supply marketplace
Desktop Client Build / Resolve Build Metadata (push) Successful in 43s
Frontend CI / Frontend (push) Successful in 3m49s
Backend CI / Backend (push) Failing after 7m10s
Desktop Client Build / Build Desktop Client (push) Successful in 23m4s
Desktop Client Build / Publish Client Artifacts to NAS (push) Successful in 28s

Introduce an end-to-end media-supply feature: tenant-side resource sync
service/worker backed by a Meijiequan supplier client, ops-side management
APIs, and admin/ops web views for resources, orders, favorites and
submission. Adds a shared digitocr helper, MediaSupply config blocks for
tenant and ops, shared types, and migrations for supplier media resources,
price overrides, customer visibility and order refunds.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-29 23:17:01 +08:00
parent 607a3fffe7
commit 9d6181260a
121 changed files with 14909 additions and 36 deletions
@@ -874,11 +874,7 @@ func (s *DesktopTaskService) Reconcile(ctx context.Context, actor auth.Actor, de
}
}
eventType := "task_reconciled"
if task.Kind == "monitor" && req.Status == "retry" {
eventType = "task_available"
}
s.publishTaskEvent(ctx, task, eventType)
s.publishTaskEvent(ctx, task, reconcileDesktopTaskEventType(task.Kind, req.Status))
view := buildDesktopTaskView(task)
return &view, nil
@@ -1785,6 +1781,13 @@ func (s *DesktopTaskService) publishTaskEvent(ctx context.Context, task *reposit
publishDesktopTaskLifecycleEvent(ctx, s.messaging, s.logger, task, eventType)
}
func reconcileDesktopTaskEventType(_ string, status string) string {
if status == "retry" {
return "task_available"
}
return "task_reconciled"
}
func (s *DesktopTaskService) logWarn(message string, err error, fields ...zap.Field) {
if s.logger == nil || err == nil {
return