feat(update): show 已上线 state and pre-existing badge for store review

- reviewLabel: APPROVED now displays '已上线' instead of '已通过'
- parseStoreReview: extract liveOnStore and preExisting fields from JSON
- Store review dialog card: show '直接上传' badge when preExisting=true,
  indicating the version was published directly to the store rather than
  via the platform submission flow

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
这个提交包含在:
XuqmGroup 2026-05-18 17:30:38 +08:00
父节点 416783047c
当前提交 1310488835

查看文件

@ -576,6 +576,13 @@
<el-tag :type="reviewTagType(item.state)" size="small" class="review-card-tag"> <el-tag :type="reviewTagType(item.state)" size="small" class="review-card-tag">
{{ reviewLabel(item.state) }} {{ reviewLabel(item.state) }}
</el-tag> </el-tag>
<el-tag
v-if="item.preExisting"
type="info"
size="small"
class="review-card-tag"
title="此版本非由平台提交,为直接在应用商店上传发布"
>直接上传</el-tag>
</div> </div>
<!-- Stage progress --> <!-- Stage progress -->
@ -1487,7 +1494,7 @@ const submitStoreScheduledAt = ref('')
const showStoreReviewDetail = ref(false) const showStoreReviewDetail = ref(false)
const storeReviewDetailVersion = ref<AppVersion | null>(null) const storeReviewDetailVersion = ref<AppVersion | null>(null)
const storeReviewDetailItems = ref<{ store: string; state: string; reason?: string; stage?: string; submittedAt?: string; updatedAt?: string; batchId?: string }[]>([]) const storeReviewDetailItems = ref<{ store: string; state: string; reason?: string; stage?: string; submittedAt?: string; updatedAt?: string; batchId?: string; liveOnStore?: boolean; preExisting?: boolean }[]>([])
const storeReviewDetailLive = ref(false) const storeReviewDetailLive = ref(false)
const cancellingReview = ref(false) const cancellingReview = ref(false)
const retryingStores = ref<Set<string>>(new Set()) const retryingStores = ref<Set<string>>(new Set())
@ -2175,7 +2182,7 @@ function storeLabel(type: string) {
function reviewLabel(state: string): string { function reviewLabel(state: string): string {
return { return {
PENDING: '待提交', SUBMITTING: '提交中', UNDER_REVIEW: '审核中', PENDING: '待提交', SUBMITTING: '提交中', UNDER_REVIEW: '审核中',
APPROVED: '已通过', REJECTED: '已拒绝', WITHDRAWN: '已撤回', FAILED: '提交失败', APPROVED: '已上线', REJECTED: '已拒绝', WITHDRAWN: '已撤回', FAILED: '提交失败',
}[state] ?? state }[state] ?? state
} }
@ -2308,7 +2315,7 @@ function scheduleStoreReviewReload() {
}, 200) }, 200)
} }
function parseStoreReview(json?: string): { store: string; state: string; reason?: string; stage?: string; submittedAt?: string; updatedAt?: string; batchId?: string }[] { function parseStoreReview(json?: string): { store: string; state: string; reason?: string; stage?: string; submittedAt?: string; updatedAt?: string; batchId?: string; liveOnStore?: boolean; preExisting?: boolean }[] {
if (!json) return [] if (!json) return []
try { try {
const m = JSON.parse(json) as Record<string, unknown> const m = JSON.parse(json) as Record<string, unknown>
@ -2326,6 +2333,8 @@ function parseStoreReview(json?: string): { store: string; state: string; reason
submittedAt: String(item.submittedAt ?? ''), submittedAt: String(item.submittedAt ?? ''),
updatedAt: String(item.updatedAt ?? ''), updatedAt: String(item.updatedAt ?? ''),
batchId: String(item.batchId ?? ''), batchId: String(item.batchId ?? ''),
liveOnStore: item.liveOnStore === true,
preExisting: item.preExisting === true,
} }
} }
return { store, state: String(value ?? ''), reason: '' } return { store, state: String(value ?? ''), reason: '' }