diff --git a/src/config/douyin.ts b/src/config/douyin.ts index a9c7ea9..291b913 100644 --- a/src/config/douyin.ts +++ b/src/config/douyin.ts @@ -87,6 +87,8 @@ export const douyinConfig = { selectQuantity: '请选择下单数量', orderSubmitted: '本订单号已提交制作,不能继续上传图片或生图', orderSubmittedBtn: '订单已提交制作', + orderStatFail: '订单信息获取失败,暂不可上传生图', + orderStatFailBtn: '暂不可上传生图', }, } diff --git a/src/views/douyin/generating.vue b/src/views/douyin/generating.vue index e464bfb..29a6602 100644 --- a/src/views/douyin/generating.vue +++ b/src/views/douyin/generating.vue @@ -132,8 +132,6 @@ import ImagePointCloud from './components/ImagePointCloud.vue' import DyNavBar from './components/DyNavBar.vue' import { takePendingUpload } from './pendingUpload' -const SUBMITTED_KEY = 'douyin_order_submitted' - function isSubmittedBizError(msg: string) { return /已提交制作|不能继续上传|不能继续生图/.test(String(msg || '')) } @@ -404,7 +402,6 @@ async function beginPendingUpload() { errorTip.value = msg // 已提交制作:不停留等待页,标记锁定并回首页 if (isSubmittedBizError(msg)) { - sessionStorage.setItem(SUBMITTED_KEY, '1') showToast(msg) setTimeout(() => { router.replace(config.routes.home) @@ -442,7 +439,6 @@ async function confirmSubmit() { imageId.value = res.imageId sessionStorage.setItem('douyin_image_id', res.imageId) } - sessionStorage.setItem(SUBMITTED_KEY, '1') showConfirmModal.value = false router.replace(config.routes.success) } catch (err: any) { diff --git a/src/views/douyin/index.vue b/src/views/douyin/index.vue index 07fae4b..41e4598 100644 --- a/src/views/douyin/index.vue +++ b/src/views/douyin/index.vue @@ -73,7 +73,11 @@ > {{ orderLocked - ? (lockReason === config.messages.noRemain ? config.messages.noRemain : config.messages.orderSubmittedBtn) + ? (Number(orderStat.order_count) > 0 + ? config.messages.orderSubmittedBtn + : (lockReason === config.messages.noRemain + ? config.messages.noRemain + : config.messages.orderStatFailBtn)) : (photoPreview ? config.messages.startGenerate : config.messages.uploadBtn) }} @@ -95,7 +99,6 @@ import { preloadLogoCloud } from './components/image-point-cloud/logo-cloud-cach import DyNavBar from './components/DyNavBar.vue' import { setPendingUpload } from './pendingUpload' -const SUBMITTED_KEY = 'douyin_order_submitted' const SUBMITTED_MSG = '本订单号已提交制作,不能继续上传图片或生图' const router = useRouter() @@ -108,20 +111,18 @@ const orderStat = ref({}) const orderLocked = ref(false) const lockReason = ref('') -function markOrderSubmitted(reason?: string) { - orderLocked.value = true - lockReason.value = reason || SUBMITTED_MSG - sessionStorage.setItem(SUBMITTED_KEY, '1') -} - +/** 仅根据接口 orders/stat 判断,不用本地缓存 */ function applyOrderLock(res: any) { orderStat.value = res || {} - // order_count > 0 表示已提交制作,锁定上传/生图 - if (res && Number(res.order_count) > 0) { - markOrderSubmitted(config.messages.orderSubmitted || SUBMITTED_MSG) + orderLocked.value = false + lockReason.value = '' + // order_count > 0 表示已提交制作 + if (Number(res?.order_count) > 0) { + orderLocked.value = true + lockReason.value = config.messages.orderSubmitted || SUBMITTED_MSG return } - if (res && res.remain_count != null && Number(res.remain_count) <= 0) { + if (res?.remain_count != null && Number(res.remain_count) <= 0) { orderLocked.value = true lockReason.value = config.messages.noRemain } @@ -142,8 +143,11 @@ function triggerPick() { function getOrderStat() { return badgeApi.getOrderStat({}).then((res: any) => { applyOrderLock(res) - }).catch(() => { - // 抖音链路可不依赖该接口,失败时不阻断上传 + }).catch((err: any) => { + // stat 失败(如 code:-1 没有卡券数据)禁止上传生图 + orderStat.value = {} + orderLocked.value = true + lockReason.value = err?.message || config.messages.orderStatFail || '订单信息获取失败,暂不可上传生图' }) } @@ -180,28 +184,23 @@ function onFileChange(e: Event) { } } -function onSubmit() { +async function onSubmit() { if (submitting.value) return - if (orderLocked.value) { - showToast(lockReason.value || SUBMITTED_MSG) - return - } if (!photoFile.value || !photoPreview.value) { showToast(config.messages.pleaseUpload) return } - if (Number(orderStat.value.order_count) > 0) { - markOrderSubmitted() + + submitting.value = true + // 提交前重新拉 orders/stat,不依赖本地缓存 / 页面内存旧值 + await getOrderStat() + if (orderLocked.value) { + submitting.value = false showToast(lockReason.value || SUBMITTED_MSG) return } - if (orderStat.value.remain_count != null && Number(orderStat.value.remain_count) <= 0) { - showToast(config.messages.noRemain) - return - } // 先跳等待页,后台再上传/生图(不弹成功失败 toast) - submitting.value = true setPendingUpload(photoFile.value, photoPreview.value) sessionStorage.setItem('douyin_source_preview', photoPreview.value) router.push({ @@ -212,9 +211,6 @@ function onSubmit() { } onMounted(() => { - if (sessionStorage.getItem(SUBMITTED_KEY) === '1') { - markOrderSubmitted() - } getOrderStat() // 预采样 Logo 点云,进入等待页可立刻上屏 preloadLogoCloud().catch(() => {}) diff --git a/src/views/douyin/preview.vue b/src/views/douyin/preview.vue index 65fdeda..3822153 100644 --- a/src/views/douyin/preview.vue +++ b/src/views/douyin/preview.vue @@ -164,7 +164,6 @@ function confirmOrder() { imageId.value = res.imageId sessionStorage.setItem('douyin_image_id', res.imageId) } - sessionStorage.setItem('douyin_order_submitted', '1') showConfirmModal.value = false showSuccessToast({ message: config.messages.orderSuccess,