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
@@ -302,12 +302,12 @@ function summaryForTask(
}
return '文章已成功发送到目标平台。'
case 'failed':
return '本次发送失败,请检查账号状态或平台提示后重新创建发布。'
return '本次发送失败,请检查账号状态或平台提示后重新提交发布。'
case 'aborted':
return '任务已被取消,请检查原因后重新创建发布。'
return '任务已被取消,请检查原因后重新提交发布。'
case 'unknown':
default:
return '发送结果异常,已按失败处理,请检查平台侧结果后重新创建发布。'
return '发送结果异常,已按失败处理,请检查平台侧结果后重新提交发布。'
}
}
@@ -487,8 +487,11 @@ async function retryTask(record: PublishTaskItem) {
const result = await window.desktopBridge.app.retryPublishTask(record.id)
const created = result.created_task_ids.length
const existing = result.existing_task_ids.length
const requeued = result.requeued_task_ids?.length ?? 0
if (created > 0) {
notifySuccess(created === 1 ? '已重新创建发布任务' : `重新创建 ${created} 个发布任务`)
notifySuccess(created === 1 ? '已创建新的发布任务' : `已创建 ${created}新的发布任务`)
} else if (requeued > 0) {
notifySuccess(requeued === 1 ? '已重新提交发布任务' : `已重新提交 ${requeued} 个发布任务`)
} else if (existing > 0) {
if (record.status === 'unknown') {
notifyActionError('原任务结果未知且已有发布记录,可能已成功,请先核实平台侧结果。')
@@ -501,8 +504,8 @@ async function retryTask(record: PublishTaskItem) {
await refreshTasks(1)
} catch (err) {
notifyActionError(
normalizeTaskErrorMessage(unwrapClientErrorMessage(err, '重新创建发布任务失败')) ??
'重新创建发布任务失败',
normalizeTaskErrorMessage(unwrapClientErrorMessage(err, '重新提交发布任务失败')) ??
'重新提交发布任务失败',
)
} finally {
retryingTaskId.value = null
@@ -882,12 +885,12 @@ const tableScroll = { x: 1080 } as const
<template #icon><DesktopOutlined /></template>
</a-button>
</a-tooltip>
<a-tooltip v-if="canRetryTask(record)" title="重新创建发布任务" placement="top">
<a-tooltip v-if="canRetryTask(record)" title="重新提交发布任务" placement="top">
<a-button
type="text"
class="icon-action-btn"
:loading="retryingTaskId === record.id"
:aria-label="`重新创建发布任务:${record.title}`"
:aria-label="`重新提交发布任务:${record.title}`"
@click.stop="retryTask(record)"
>
<template #icon><RetweetOutlined /></template>