From 9587a27ede2dd4354a3083fab0031b4c50785cce Mon Sep 17 00:00:00 2001 From: "weicw1996@qq.com" Date: Tue, 29 Sep 2026 17:44:59 +0800 Subject: [PATCH] =?UTF-8?q?feat(order):=20=E6=94=B6=E9=93=B6=E5=8F=B0?= =?UTF-8?q?=E6=94=AF=E4=BB=98=E5=80=92=E8=AE=A1=E6=97=B6=EF=BC=8C=E8=B6=85?= =?UTF-8?q?=E6=97=B6=E9=94=81=E6=AD=BB=E5=B9=B6=E5=BC=95=E5=AF=BC=E9=87=8D?= =?UTF-8?q?=E6=96=B0=E4=B8=8B=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 到期时刻由后端下发(payDeadline),倒计时与"到点锁页面"都用它,前端不自己算时限 - 解析后端时间时把空格换成 T:后端格式是 `yyyy-MM-dd HH:mm:ss`, 而 iOS Safari / 微信内置浏览器解析不了不带 T 的写法(返回 NaN, 会让倒计时与锁页在最主要的那一端静默失效) - 修正收银台写死的「2 小时」文案:有效期由后端配置,页面不该复述一个具体数字 - 订单列表/详情:超时后不再给「去支付」,并显示「已取消(支付超时)」 - `hjcCanActOn` 收成共享导出,两个页面不再各写一份判定 - 与 hjc-h5 的 utils/orderStatus 保持同一套定义(两仓逐字对齐) --- app/composables/useHjcPayStatus.ts | 22 +++++--- app/pages/tender/orders/[id].vue | 20 ++++++- app/pages/tender/orders/index.vue | 10 +++- app/pages/tender/pay.vue | 91 ++++++++++++++++++++++++++++-- app/types/tender.ts | 11 ++++ app/utils/orderStatus.ts | 89 ++++++++++++++++++++++++++++- 6 files changed, 225 insertions(+), 18 deletions(-) diff --git a/app/composables/useHjcPayStatus.ts b/app/composables/useHjcPayStatus.ts index 9890273..bd6736d 100644 --- a/app/composables/useHjcPayStatus.ts +++ b/app/composables/useHjcPayStatus.ts @@ -13,11 +13,11 @@ */ /** - * 支付码的有效期。 + * 支付码有效期的**兜底**值(从调用 `start` 的那一刻起算)。 * - * 微信 Native 默认 2 小时;支付宝当面付的超时由下单时的 `timeout_express` 决定。 - * 服务端都不下发过期时刻(`PaymentResponse` 不设 `expireTime`), - * 所以只能以「本次拿到支付码的时刻」本地计时;到点停止轮询并提示重新获取。 + * 优先用后端随订单下发的 `payDeadline`——那才是权威值,且与后端判定超时、渠道单失效 + * 是同一个时刻(见 ADR 0019),`start` 的第二个参数就是传它。 + * 拿不到到期时刻时才退回这个本地计时(例如购标流程里还没取到订单对象就被调用)。 */ export const HJC_PAY_QR_TTL_MS = 2 * 60 * 60 * 1000 @@ -143,14 +143,22 @@ export function useHjcPayStatus( } } - /** 开始(或重新开始)轮询,并重置 2 小时计时 */ - function start(no: string) { + /** + * 开始(或重新开始)轮询。 + * + * @param no 订单号 + * @param deadlineAtMs 该订单支付时限的到期时刻(毫秒)。**传后端下发的 `payDeadline`**—— + * 用本地倒计时代替它,两者会在边界上错开。不传则退回 {@link HJC_PAY_QR_TTL_MS} + */ + function start(no: string, deadlineAtMs?: number | null) { orderNo = no paid.value = false expired.value = false error.value = '' status.value = null - deadline = Date.now() + HJC_PAY_QR_TTL_MS + deadline = typeof deadlineAtMs === 'number' && Number.isFinite(deadlineAtMs) + ? deadlineAtMs + : Date.now() + HJC_PAY_QR_TTL_MS active = true pauseTimer() ensureTimer() diff --git a/app/pages/tender/orders/[id].vue b/app/pages/tender/orders/[id].vue index 74a7730..7d5635f 100644 --- a/app/pages/tender/orders/[id].vue +++ b/app/pages/tender/orders/[id].vue @@ -66,8 +66,12 @@ - -
+ +