diff --git a/src/views/AccountView/AccountView.vue b/src/views/AccountView/AccountView.vue
index 845a3b2..9e18ff4 100644
--- a/src/views/AccountView/AccountView.vue
+++ b/src/views/AccountView/AccountView.vue
@@ -141,6 +141,34 @@
+
+
+ 待支付通信卡充值
+
+ {{ cardLabel(pendingSimOrder.simCardId) }}
+ · {{ pendingSimOrder.amountGb != null ? `${pendingSimOrder.amountGb} GB` : '--' }}
+ · {{ moneyFromFen(pendingSimOrder.totalFeeFen) }}
+ · {{ payStatusName(pendingSimOrder.paymentStatus) }}
+
+
+
+ 去支付
+ 取消
+
+
通信卡充值记录
共 {{ simRechargeTotal }} 条
{{ cardLabel(row.simCardId) }}
@@ -298,6 +326,9 @@ const simRechargeOpen = ref(false)
const simRechargeCard = ref(null)
const selectedSimPackageId = ref(0)
const simRecharging = ref(false)
+const pendingSimOrder = ref(null)
+const payingPendingSim = ref(false)
+const cancellingPendingSim = ref(false)
const editOpen = ref(false); const saving = ref(false); const editForm = ref({ name: '', email: '' })
const orderColumns = [
@@ -366,6 +397,10 @@ const profileInitial = computed(() => profileName.value === '--' ? '-' : profile
const invoiceOrderOptions = computed(() => [{ label: '请选择已支付订单', value: 0 }, ...invoiceOrders.value.map((order) => ({ label: `${order.id} · ${money(order.totalPrice)}`, value: order.id }))])
const activeSimCount = computed(() => simCards.value.filter((card) => simStatus(card).cls === 'normal').length)
const warnSimCount = computed(() => simTotal.value - activeSimCount.value)
+const isPendingSimOrderActionable = computed(() => {
+ const status = pendingSimOrder.value?.paymentStatus
+ return status === 'unpaid' || status === 'processing'
+})
function applyPage(targetRef, page) {
const records = page?.records || []
@@ -511,6 +546,64 @@ function openSimRecharge(card) {
selectedSimPackageId.value = simPackages.value[0]?.id || 0
simRechargeOpen.value = true
}
+function mapPendingSimOrder(order) {
+ if (!order?.id) return null
+ return {
+ id: order.id,
+ simCardId: order.simCardId,
+ amountGb: order.amountGb,
+ totalFeeFen: order.totalFeeFen ?? order.totalPriceFen ?? null,
+ paymentStatus: order.paymentStatus || order.payStatus || 'unpaid'
+ }
+}
+function clearPendingSimOrderIfSettled(status) {
+ if (status === 'paid' || status === 'cancelled' || status === 'closed') {
+ pendingSimOrder.value = null
+ }
+}
+async function refreshPendingSimOrder(orderId) {
+ if (!orderId) return
+ try {
+ const order = await request.get(urls.SIM_RECHARGE_ORDER(orderId))
+ const mapped = mapPendingSimOrder(order)
+ pendingSimOrder.value = mapped
+ clearPendingSimOrderIfSettled(mapped?.paymentStatus)
+ } catch {
+ // keep local pending if refresh fails
+ }
+}
+async function payPendingSimOrder() {
+ if (!pendingSimOrder.value?.id || !isPendingSimOrderActionable.value) return
+ payingPendingSim.value = true
+ try {
+ const payment = await createPayment('sim_recharge_order', pendingSimOrder.value.id)
+ ui.toast(describePayment(payment))
+ await refreshPendingSimOrder(pendingSimOrder.value.id)
+ await loadSim()
+ } catch (error) {
+ ui.toast(error.message || '发起支付失败')
+ await refreshPendingSimOrder(pendingSimOrder.value?.id)
+ } finally {
+ payingPendingSim.value = false
+ }
+}
+async function cancelPendingSimOrder() {
+ if (!pendingSimOrder.value?.id || !isPendingSimOrderActionable.value) return
+ const ok = await ui.confirm('取消该通信卡充值订单?', '仅待支付/支付中订单可取消。', ['订单将关闭', '可重新选择套餐充值'])
+ if (!ok) return
+ cancellingPendingSim.value = true
+ try {
+ await request.delete(urls.SIM_RECHARGE_ORDER(pendingSimOrder.value.id))
+ pendingSimOrder.value = null
+ ui.toast('充值订单已取消')
+ await loadSim()
+ } catch (error) {
+ ui.toast(error.message || '取消失败')
+ await refreshPendingSimOrder(pendingSimOrder.value?.id)
+ } finally {
+ cancellingPendingSim.value = false
+ }
+}
async function submitSimRecharge() {
if (!simRechargeCard.value?.id) return
if (!selectedSimPackageId.value) {
@@ -525,12 +618,19 @@ async function submitSimRecharge() {
{ packageId: Number(selectedSimPackageId.value) }
)
orderCreated = true
+ pendingSimOrder.value = mapPendingSimOrder(order)
const payment = await createPayment('sim_recharge_order', order.id)
ui.toast(describePayment(payment))
simRechargeOpen.value = false
+ await refreshPendingSimOrder(order.id)
await loadSim()
} catch (error) {
- ui.toast(error.message || '充值下单失败')
+ const message = error.message || '充值下单失败'
+ if (!orderCreated && /pending|未结|待支付|已有/.test(message) && pendingSimOrder.value?.simCardId === simRechargeCard.value?.id) {
+ ui.toast(`${message};可先完成或取消上方待支付订单`)
+ } else {
+ ui.toast(message)
+ }
if (orderCreated) {
simRechargeOpen.value = false
await loadSim()
@@ -611,6 +711,28 @@ onMounted(load)
display: block;
margin-bottom: 12px;
}
+.pending-sim-order {
+ margin: 12px 0 4px;
+ padding: 12px 14px;
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ gap: 12px;
+ border: 1px solid #f0d7a8;
+ border-radius: 5px;
+ background: #fff8ea;
+}
+.pending-sim-order strong {
+ display: block;
+ color: #8a5a12;
+ font-size: 12px;
+}
+.pending-sim-order small {
+ display: block;
+ margin-top: 4px;
+ color: #95631d;
+ font-size: 11px;
+}
.traffic-order-summary :deep(.t-select) {
margin: 10px 0 14px;
}