Selaa lähdekoodia

支付方式:微信支付

lifanagju_citu 4 kuukautta sitten
vanhempi
commit
d33ba18ba1

+ 8 - 0
src/api/common/index.js

@@ -335,6 +335,14 @@ export const getEnableCodeList = async (params) => {
   })
 }
 
+// 获得指定应用的开启的支付渠道编码列表
+export const getEnableCodeList2 = async (code) => {
+  return await request.get({
+    url: '/app-api/pay/channel/get-enable-code-list2',
+    params: { code }
+  })
+}
+
 // 获取待支付的订单
 export const getUnpaidOrder = async (params) => {
   return await request.get({

+ 16 - 0
src/api/mall/trade.js

@@ -70,3 +70,19 @@ export const settlementOrder = async (data) => {
     url:  `/app-api/trade/order/settlement?${queryString}`
   })
 }
+
+// 获得支付订单
+export const getOrder = async (id, sync) => {
+  return request.get({
+    url: '/app-api/pay/order/get',
+    params: { id, sync }
+  })
+}
+
+// 创建订单
+export const submitOrder = async (data) => {
+  return await request.post({
+    url: '/app-api/pay/order/submit',
+    data
+  })
+}

+ 1 - 1
src/utils/payType.js

@@ -76,7 +76,7 @@ const channelsMock = [
   },
   {
     name: '模拟支付',
-    icon: 'wallet',
+    // icon: 'wallet',
     size: 22,
     color: 'success',
     code: 'mock'

+ 40 - 19
src/views/mall/cart/index.vue

@@ -3,7 +3,10 @@
   <v-card class="default-width card-box mb-5 pa-5 resume-box">
     <div class="resume-header">
       <div class="resume-title">我的购物车</div>
-      <v-btn color="primary" size="small" variant="text" @click="getCartList"><v-icon>mdi-refresh</v-icon>刷新购物车</v-btn>
+      <div>
+        <v-btn color="primary" size="small" variant="text" class="ml-2" @click="getCartList"><v-icon>mdi-refresh</v-icon>刷新购物车</v-btn>
+        <v-btn color="primary" size="small" variant="text" class="ml-2" to="/mall/user/order"><v-icon>mdi-account-circle-outline</v-icon>我的订单</v-btn>
+      </div>
     </div>
     <div v-if="cartList.length" class="mt-3">
       <v-data-table
@@ -60,14 +63,18 @@
     </div>
   </v-card>
   <!-- 结算 -->
-  <CtDialog :visible="showPay" titleClass="text-h6" :widthType="3" title="订单信息" @submit="handleSubmit" @close="handleClose">
-    <confirm ref="confirmRef" :data="skuInfo" @paySuccess="paySuccess"></confirm>
+  <CtDialog :visible="showSettlement" titleClass="text-h6" :widthType="3" title="订单信息" @submit="handleSubmit" @close="handleClose">
+    <confirm ref="confirmRef" :data="skuInfo" @orderCreated="orderCreated"></confirm>
+  </CtDialog>
+  <!-- 支付 -->
+  <CtDialog :visible="showPay" titleClass="text-h6" :widthType="3" title="收银台" :footer="false" @close="payCancel">
+    <pay ref="payRef" :id="payOrderId" @paySuccess="paySuccess"></pay>
   </CtDialog>
 </template>
 
 <script setup>
 defineOptions({ name: 'mall-cart'})
-import { ref, computed, onMounted } from 'vue'
+import { ref, computed, onMounted, nextTick } from 'vue'
 import Navbar from '../components/navbar.vue'
 import { useRouter } from 'vue-router'
 import { getMallUserCartList } from '@/api/mall/cart'
@@ -76,6 +83,7 @@ import GoodsItem from '../components/GoodsItem'
 import { updateCartSelected, updateCartCount, deleteCartGoods } from '@/api/mall/cart'
 import Snackbar from '@/plugins/snackbar'
 import confirm from '@/views/mall/components/details/order/confirm.vue'
+import pay from '@/views/mall/components/details/order/pay.vue'
 import Confirm from '@/plugins/confirm'
 import { useI18n } from '@/hooks/web/useI18n'; const { t } = useI18n()
 
@@ -155,22 +163,8 @@ const handleChangeCount = async (count, id) => {
   await getCartList()
 }
 
-const confirmRef = ref()
-const handleSubmit = () => {
-  if (confirmRef.value) confirmRef.value.onConfirm()
-}
-
-const handleClose = () => {
-  showPay.value = false
-}
-const paySuccess = () => {
-  // 更新购物车列表
-  showPay.value = false
-  getCartList()
-}
-
 // 结算
-const showPay = ref(false)
+const showSettlement = ref(false)
 const selectedList = ref([])
 const skuInfo = ref(null) // 购买商品规格信息
 const handleSettlement = () => {
@@ -199,7 +193,34 @@ const handleSettlement = () => {
   skuInfo.value = JSON.stringify({
     items
   })
+  showSettlement.value = true
+}
+const confirmRef = ref()
+const handleSubmit = () => {
+  if (confirmRef.value) confirmRef.value.onConfirm()
+}
+const handleClose = () => {
+  showSettlement.value = false
+}
+
+// 创建订单完成
+const payRef = ref()
+const showPay = ref(false)
+const payOrderId = ref('')
+const orderCreated = (id) => {
+  showSettlement.value = false
+  payOrderId.value = id
   showPay.value = true
+  // 更新购物车列表
+  getCartList()
+}
+const payCancel = () => {
+  Snackbar.warning('您已取消支付,请前往我的订单中查看!')
+  showPay.value = false
+}
+const paySuccess = () => {
+  Snackbar.success('支付成功,请前往我的订单查看!')
+  showPay.value = false
 }
 </script>
 

+ 28 - 4
src/views/mall/components/details.vue

@@ -69,8 +69,12 @@
   <!-- 快速登录 -->
   <loginPage v-if="showLogin" @loginSuccess="loginSuccess" @close="loginClose"></loginPage>
   <!-- 结算 -->
-  <CtDialog :visible="showPay" titleClass="text-h6" :widthType="3" title="订单信息" @submit="handleSubmit" @close="handleClose">
-    <confirm ref="confirmRef" :data="skuInfo" @paySuccess="showPay = false"></confirm>
+  <CtDialog :visible="showSettlement" titleClass="text-h6" :widthType="3" title="订单信息" @submit="handleSubmit" @close="handleClose">
+    <confirm ref="confirmRef" :data="skuInfo" @orderCreated="orderCreated"></confirm>
+  </CtDialog>
+  <!-- 支付 -->
+  <CtDialog :visible="showPay" titleClass="text-h6" :widthType="3" title="收银台" :footer="false" @close="payCancel">
+    <pay ref="payRef" :id="payOrderId" @paySuccess="paySuccess"></pay>
   </CtDialog>
 </template>
 
@@ -87,6 +91,7 @@ import { useRouter } from 'vue-router'
 import Snackbar from '@/plugins/snackbar'
 import { getToken } from '@/utils/auth'
 import loginPage from '@/views/common/loginDialog.vue'
+import pay from '@/views/mall/components/details/order/pay.vue'
 
 const router = useRouter()
 const { id } = router.currentRoute.value.params
@@ -138,7 +143,7 @@ function onSkuChange(e) {
   selectedSkuMarketPrice.value = calcPrice(state.selectedSku?.marketPrice || state.goodsInfo.marketPrice)
 }
 
-const showPay = ref(false)
+const showSettlement = ref(false)
 const skuInfo = ref(null) // 购买商品规格信息
 const onBuy = async (e) => {
   if (!getToken()) return handleLogin()
@@ -148,8 +153,27 @@ const onBuy = async (e) => {
   skuInfo.value = JSON.stringify({
     items: [{ skuId: e.id, count: e.goods_num, categoryId: state.goodsInfo.categoryId, }]
   })
+  showSettlement.value = true
+}
+
+// 创建订单完成
+const payRef = ref()
+const showPay = ref(false)
+const payOrderId = ref('')
+const orderCreated = (id) => {
+  showSettlement.value = false
+  payOrderId.value = id
   showPay.value = true
 }
+// 
+const payCancel = () => {
+  Snackbar.warning('您已取消支付,请前往我的订单中查看!')
+  showPay.value = false
+}
+const paySuccess = () => {
+  Snackbar.success('支付成功,请前往我的订单查看!')
+  showPay.value = false
+}
 
 // 添加购物车
 const onAddCart = async (e) => {
@@ -167,7 +191,7 @@ const handleSubmit = () => {
   if (confirmRef.value) confirmRef.value.onConfirm()
 }
 const handleClose = () => {
-  showPay.value = false
+  showSettlement.value = false
 }
 
 const showLogin = ref(false)

+ 5 - 88
src/views/mall/components/details/order/confirm.vue

@@ -74,13 +74,7 @@
   import { spaces } from '@/utils/index.js'
   import { getTradeConfig, createOrder, settlementOrder } from '@/api/mall/trade'
   import Snackbar from '@/plugins/snackbar'
-  import { getOrderPayStatus, payOrderSubmit } from '@/api/common'
-  import Confirm from '@/plugins/confirm'
-  import { useRouter } from 'vue-router'; const router = useRouter()
-  import { useUserStore } from '@/store/user'; const userStore = useUserStore()
-  import { useI18n } from '@/hooks/web/useI18n'; const { t } = useI18n()
-  const emit = defineEmits(['paySuccess'])
-
+  const emit = defineEmits(['orderCreated'])
   const props = defineProps({
     data: {
       type: String,
@@ -160,73 +154,9 @@
       Snackbar.warning('请选择收货地址')
       return;
     }
-    // if (addressState.value.deliveryType === 2) {
-    //   if (!addressState.value.pickUpInfo.id) {
-    //     Snackbar.warning('请选择自提门店地址')
-    //     return;
-    //   }
-    //   if (addressState.value.receiverName === '' || addressState.value.receiverMobile === '') {
-    //     Snackbar.warning('请填写联系人或联系人电话')
-    //     return;
-    //   }
-    //   if (!/^[\u4e00-\u9fa5\w]{2,16}$/.test(addressState.value.receiverName)) {
-    //     Snackbar.warning('请填写您的真实姓名')
-    //     return;
-    //   }
-    //   if (!/^1(3|4|5|7|8|9|6)\d{9}$/.test(addressState.value.receiverMobile)) {
-    //     Snackbar.warning('请填写正确的手机号')
-    //     return;
-    //   }
-    // }
-    submitOrder();
+    submitOrder()
   }
   
-  const userAccount = ref(JSON.parse(localStorage.getItem('userAccount')) || {}) // 账户信息
-
-  userStore.$subscribe((mutation, state) => {
-    if (Object.keys(state.userAccount).length) userAccount.value = state.userAccount
-  })
-
-  // 获得支付方式 // 暂时只对接余额支付(wallet) 
-  const channel = 'wallet'
-  const payOrderSubmitFun = async () => {
-    // 提交支付订单
-    let obj = {
-      id: payState.orderInfo.id,
-      channelCode: channel,
-      channelExtras: {},
-    };
-    const res = await payOrderSubmit(obj)
-    // console.log('提交支付订单payOrderSubmit:', res)
-    Snackbar.success('支付成功,请前往我的订单查看!')
-    emit('paySuccess')
-    userStore.getUserAccountBalance()
-  }
-
-  // 设置支付订单信息
-  const payImmediately = async (id) => {
-    // 获得支付订单信息
-    const orderRes = await getOrderPayStatus({ id, sync: true })
-    if (!orderRes) {
-      payState.payStatus = -2;
-      return;
-    }
-    payState.orderInfo = orderRes;
-    // 对比余额是否不足 订单金额:orderInfo?.price-0
-    const balance = userAccount.value?.balance ? userAccount.value.balance-0 : 0
-    // const balanceShow = userAccount.value?.balance && userAccount.value?.balance > 0 ? (userAccount.value?.balance / 100.0).toFixed(2) : 0
-    if (balance < payState?.orderInfo?.price-0) {
-      // 余额不足
-      Confirm(t('common.confirmTitle'), '余额不足,是否前往充值?', {sureText: '立即前往'}).then(() => {
-        router.push({ path: '/personalRecharge' })
-      })
-    } else {
-      Confirm(t('common.confirmTitle'), `将会从余额扣除¥${fen2yuan(state.orderInfo.price.payPrice)},是否确定支付?`).then(() => {
-        payOrderSubmitFun()
-      })
-    }
-  }
-
   // 创建订单&跳转
   async function submitOrder() {
     const data = await createOrder({
@@ -244,22 +174,9 @@
       seckillActivityId: state.orderPayload.seckillActivityId,
       pointActivityId: state.orderPayload.pointActivityId,
     });
-    if (data.payOrderId && data.payOrderId > 0) payImmediately(data.payOrderId)
-    // 更新购物车列表,如果来自购物车
-    // if (state.orderPayload.items[0].cartId > 0) {
-    //   sheep.$store('cart').getList();
-    // }
-
-    // // 跳转到支付页面
-    // if (data.payOrderId && data.payOrderId > 0) {
-    //   sheep.$router.redirect('/pages/pay/index', {
-    //     id: data.payOrderId,
-    //   });
-    // } else {
-    //   sheep.$router.redirect('/pages/order/detail', {
-    //     id: data.id,
-    //   });
-    // }
+    if (!data.payOrderId && data.payOrderId > 0) return
+    emit('orderCreated', data.payOrderId) // 更新购物车列表,如果来自购物车
+    // payImmediately(data.payOrderId)
   }
 
   // 检查库存 & 计算订单价格

+ 311 - 0
src/views/mall/components/details/order/pay.vue

@@ -0,0 +1,311 @@
+<!-- 支付方式 -->
+<template>
+  <v-card elevation="0" :loading="loading" :disabled="loading">
+    <!-- 加载样式 -->
+    <template v-slot:loader="{ isActive }">
+      <v-progress-linear
+        :active="isActive"
+        color="var(--v-primary-base)"
+        height="1"
+        indeterminate
+      ></v-progress-linear>
+    </template>
+    <div style="color: var(--v-error-base); font-weight: bold; text-align: center;">
+      <span class="font-size-13 mr-2">¥</span>
+      <span class="font-size-40"> {{ orderInfo?.price ? orderInfo?.price / 100 : 0 }}</span>
+    </div>
+    <template v-if="payMethods?.length">
+      <v-chip-group v-model="payment" selected-class="text-primary" column mandatory @update:modelValue="payTypeChange">
+        <v-chip filter v-for="k in payMethods" :key="k.code" :value="k.code" class="mr-3" label>
+          {{ k.name }}
+          <svg-icon v-if="k.icon" class="ml-1" :name="k.icon" :size="k.size"></svg-icon>
+        </v-chip>
+      </v-chip-group>
+      <div v-if="tip" style="text-align: center;" class="mt-2">{{ tip }}</div>
+      <div>
+        <!-- 钱包支付 -->
+        <div v-if="isWalletPay" class="py-10" style="text-align: center;">
+          <div>
+            <span>剩余现金:</span>
+            <span style="color: var(--v-primary-base);">{{ balance ? (balance / 100.0).toFixed(2) : 0 }}</span>
+          </div>
+          <div class="mt-3" @click="updateAccountInfo">
+            <v-icon size="20" style="color: var(--v-primary-base)">mdi-refresh</v-icon>
+            <span class="text-decoration-underline cursor-pointer mr-2" style="color: var(--v-primary-base)">刷新</span>
+          </div>
+          <div class="my-3" v-if="notEnoughMoney">
+            <span class="color-error">
+              余额不足,请微信扫码付款
+              <span class="text-decoration-underline cursor-pointer" @click="open">(充值)</span>
+            </span>
+          </div>
+        </div>
+        <!-- 模拟支付 -->
+        <div v-if="payment === 'mock'" class="py-10"></div>
+        <!-- 二维码支付 -->
+        <div v-if="isQrCodePay" style="text-align: center;">
+          <QrCode :text="payQrCodeTxt" :width="170" style="margin: 0 auto;" />
+          <div
+            v-if="payQrCodeTxt"
+            class="mb-5"
+            style="color: var(--v-error-base);"
+          >
+            扫码支付时请勿离开
+            <span v-if="remainderZhShow">{{ remainderZhShow }}</span>
+          </div>
+        </div>
+        <!-- 钱包支付确认按钮 -->
+        <div v-if="(isWalletPay && !notEnoughMoney) || payment === 'mock'" class="mt-2" style="text-align: center;">
+          <v-btn
+            class="buttons" color="primary"
+            :loading="payLoading"
+            @click="walletPaySubmit"
+          >
+            确认
+          </v-btn>
+        </div>
+      </div>
+    </template>
+  </v-card>
+</template>
+
+<script setup>
+defineOptions({ name: 'mall-pay'})
+import { computed, onUnmounted, ref } from 'vue'
+import QrCode from '@/components/QrCode'
+import { definePayTypeList, qrCodePay, walletPay } from '@/utils/payType'
+import { getEnableCodeList, getOrderPayStatus } from '@/api/common'
+import { getOrder, submitOrder } from '@/api/mall/trade'
+const emit = defineEmits(['payTypeChange', 'paySuccess', 'stopInterval', 'getOrderFail'])
+const props = defineProps({
+  code: {
+    type: String,
+    default: 'mall' // mall:商城付款
+  },
+  appId: {
+    type: Number,
+    default: 12 // 12:商城付款
+  },
+  id: {
+    type: String,
+    default: '',
+  }
+})
+const loading = ref(true)
+const tip = ref('')
+// const orderType = ref('goods') // 订单类型; goods - 商品订单, recharge - 充值订单
+const orderInfo = ref({})
+const payStatus = ref(0) // 0=检测支付环境, -2=未查询到支付单信息, -1=支付已过期, 1=待支付,2=订单已支付
+const payMethods = ref([]) // 可选的支付方式
+const payment = ref('') // 选中的支付方式
+
+
+import { useUserStore } from '@/store/user'; const userStore = useUserStore()
+const userAccount = ref(JSON.parse(localStorage.getItem('userAccount')) || {}) // 账户信息
+userStore.$subscribe((mutation, state) => {
+  if (Object.keys(state.userAccount).length) userAccount.value = state.userAccount
+})
+
+const updateAccountInfo = async (isSnackbar = true) => {
+  await userStore.getUserAccountBalance()
+  userAccount.value = JSON.parse(localStorage.getItem('userAccount')) || {}
+  if (isSnackbar) Snackbar.success('刷新成功!')
+}
+
+// 对比余额是否不足 订单金额:orderInfo?.price-0
+const balance = computed(() => {
+  return userAccount.value?.balance ? userAccount.value.balance-0 : 0
+})
+const notEnoughMoney = computed(() => {
+  return orderInfo.value?.price-0 > balance.value
+})
+
+const timer = ref(null)
+onUnmounted(() => {
+  if (timer.value) clearInterval(timer.value); timer.value = null
+})
+// 如果是点数支付的话走完payOrderSubmit之后即扣点数,如果是二维码支付的话只是生成二维码,这一步以后是轮询是否支付成功
+const paySubmit = async () => {
+  if (!payment.value) return
+  try {
+    if (orderInfo.value) {
+      // 提交支付订单
+      // channelExtras: { openid: null} // 特殊逻辑:微信公众号、小程序支付时,必须传入 openid
+      const params = {
+        id: orderInfo.value.id, // 支付单编号
+        channelCode: payment.value, // 支付渠道
+        // returnUrl: , // 支付成功后,支付渠道跳转回当前页;再由当前页,跳转回 {@link returnUrl} 对应的地址
+      }
+      const res = await submitOrder(params)
+      payQrCodeTxt.value = res?.displayContent || '' // 生成二维码内容
+      
+      initIntervalFun()
+
+      if (timer.value) clearInterval(timer.value); timer.value = null
+      timer.value = setInterval(() => { getPayStatus() }, 1000) // 轮巡查询用户是否支付
+    }
+  } catch (error) {
+    console.log(error)
+  }
+}
+
+// 状态转换:payOrder.status => payStatus
+const checkPayStatus = () => {
+  if (orderInfo.value.status === 10 || orderInfo.value.status === 20) {
+    // 支付成功
+    payStatus.value = 2;
+    Snackbar.warning('订单已支付')
+    // emit('payed')
+    router.go(0)
+    return
+  }
+  if (orderInfo.value.status === 30) {
+    // 支付关闭
+    payStatus.value = -1;
+    return;
+  }
+  payStatus.value = 1; // 待支付
+}
+
+// 获得支付订单信息
+const setOrder = async () => {
+  if (!props.id-0) return emit('getOrderFail')
+  try {
+    const data = await getOrder(props.id, true) // 获取待支付的订单 (order:业务订单; orderInfo:支付订单)
+    orderInfo.value = data || null
+    console.log('orderInfo:', data)
+    // 设置支付状态
+    checkPayStatus()
+    // await updateAccountInfo()
+    // 获得支付方式
+    await setPayMethods()
+    // 获得支付方式
+    // await setPayMethods();
+    if (isQrCodePay.value) paySubmit()
+  } catch (error) {
+    console.log('error:', error)
+  } finally {
+    loading.value = false
+  }
+}
+setOrder()
+
+
+// 1.获得支付方式
+const isWalletPay = ref(false)
+const isQrCodePay = ref(false)
+const payTypeChange = (value) => {
+  payment.value = value
+  tip.value = payMethods.value.find(e => e.code === payment.value)?.tip || ''
+  isQrCodePay.value = qrCodePay.includes(payment.value)
+  isWalletPay.value = walletPay.includes(payment.value)
+  if (isQrCodePay.value) paySubmit()
+}
+// 1.支付方式
+const setPayMethods = async () => {
+  let list = []
+  payMethods.value = []
+  try {
+    // list = await getEnableCodeList2(props.code)
+    list = await getEnableCodeList({ appId: props.appId })
+  } catch (error) {
+    console.log(error)
+  } finally {
+    if (definePayTypeList?.length && list?.length) {
+      list.forEach(code => {
+        const item = definePayTypeList.find(p => p.code === code)
+        if (item) {
+          if (!payment.value) {
+            tip.value = item.tip || ''
+            payTypeChange(code) // 默认值赋值
+          }
+          payMethods.value.push(item)
+        }
+      })
+    }
+  }
+}
+
+
+const payLoading = ref(false)
+const payQrCodeTxt = ref('')
+
+// 钱包支付(余额支付)
+const walletPaySubmit = () => {
+  payLoading.value = true
+  paySubmit() // 使用点数
+}
+
+import Snackbar from '@/plugins/snackbar'
+import { useRoute } from 'vue-router'; const route = useRoute()
+import { useRouter } from 'vue-router'; const router = useRouter()
+const getPayStatus = async () => {
+  try {
+    const data = await getOrderPayStatus({ id: orderInfo.value.id || orderInfo.value.payOrderId })
+    if ((data?.status - 0) === 10) {
+      // 支付成功
+      if (timer.value) clearInterval(timer.value); timer.value = null
+      setTimeout(() => {
+        // 更新余额
+        updateAccountInfo()
+        // 支付成功
+        emit('paySuccess')
+        // Snackbar.success('支付成功')
+        // 返回指定页面
+        if (route.fullPath === props.returnUrl) router.go(0)
+        else if (props.returnUrl) router.push(props.returnUrl)
+      }, 2000);
+    }
+  } catch (error) {
+    console.log(error)
+  }
+}
+
+// 倒计时
+const countdownTime = 60000 * 3 // 倒计时三分钟
+let remainder = 0 // number
+const remainderZhShow = ref('') // 倒计时展示
+
+const remainderTimer = ref(null)
+// 初始化倒计时
+const initIntervalFun = () => {
+  remainder = countdownTime // 初始倒计时时间
+  if (remainderTimer.value) clearInterval(remainderTimer.value); remainderTimer.value = null // 每一次点击都清除上一个轮询
+  // 倒计时计算
+  remainderCalc()
+  remainderTimer.value = setInterval(() => { remainderCalc() }, 1000)
+
+  if (timer.value) clearInterval(timer.value); timer.value = null
+  timer.value = setInterval(() => { getPayStatus() }, 2000) // 轮巡查询用户是否支付
+}
+
+const remainderCalc = () => {
+  remainder -= 1000
+  remainderZhShow.value = formatDuration(remainder)
+  if (remainder <= 0) {
+    emit('stopInterval') // 倒计时结束,关闭倒计时弹窗
+  }
+}
+
+const formatDuration = (remainder) => {
+  // 将毫秒转换为秒
+  var seconds = Math.floor(remainder / 1000)
+  // 计算分钟和剩余的秒数
+  var minutes = Math.floor(seconds / 60)
+  var remainingSeconds = seconds % 60
+  // 格式化分钟和秒数,确保秒数为两位数(如果小于10,则前面补0)
+  minutes = minutes.toString().padStart(2, '0')
+  remainingSeconds = remainingSeconds.toString().padStart(2, '0')
+  // 返回格式化的字符串
+  return `${minutes}分${remainingSeconds}秒`
+}
+
+const open = () => {
+  window.open('/personalRecharge')
+}
+
+</script>
+
+<style lang="scss" scoped>
+.font-size-40 { font-size: 40px; }
+</style>

+ 24 - 1
src/views/mall/user/order/index.vue

@@ -25,7 +25,7 @@
           <v-btn v-if="val.buttons.includes('express')" class="mt-2" variant="tonal" rounded="xl">查看物流</v-btn>
           <v-btn v-if="val.buttons.includes('cancel')" class="mt-2" variant="tonal" rounded="xl" @click.stop="handleCancel(val)">取消订单</v-btn>
           <v-btn v-if="val.buttons.includes('delete')" class="mt-2" variant="tonal" color="error" rounded="xl" @click.stop="handleDelete(val)">删除订单</v-btn>
-          <v-btn v-if="val.buttons.includes('pay')" class="mt-2 ml-3" variant="tonal" rounded="xl">继续支付</v-btn>
+          <v-btn v-if="val.buttons.includes('pay')" class="mt-2 ml-3" variant="tonal" rounded="xl" @click.stop="handlePay(val)">继续支付</v-btn>
         </div>
       </div>
       <CtPagination :total="total" :page="queryParams.pageNo" :limit="queryParams.pageSize" @handleChange="handleChangePage"></CtPagination>
@@ -36,6 +36,10 @@
   <CtDialog :visible="showDialog" titleClass="text-h6" :footer="true" :widthType="3" title="商品评论" @submit="handleSubmit" @close="handleClose">
     <CommentForm ref="commentFormRef" v-if="showDialog" :orderId="commentOrderId" />
   </CtDialog>
+  <!-- 支付 -->
+  <CtDialog :visible="showPay" titleClass="text-h6" :widthType="3" title="收银台" :footer="false" @close="payCancel">
+    <pay ref="payRef" :id="payOrderId" @paySuccess="paySuccess"></pay>
+  </CtDialog>
 </template>
 
 <script setup>
@@ -48,6 +52,7 @@ import Confirm from '@/plugins/confirm'
 import Snackbar from '@/plugins/snackbar'
 import GoodsItem from '../../components/GoodsItem/index.vue'
 import CommentForm from './commentForm.vue'
+import pay from '@/views/mall/components/details/order/pay.vue'
 // import { useRouter } from 'vue-router'
 
 // const router = useRouter()
@@ -151,6 +156,24 @@ const handleConfirm = ({ id }) => {
   })
 }
 
+const showPay = ref(false)
+const payOrderId  = ref('')
+const handlePay = (val) => {
+  if (!payOrderId) return Snackbar.success('订单错误!')
+  payOrderId.value = val.payOrderId
+  showPay.value = true
+}
+// 
+const payCancel = () => {
+  Snackbar.warning('您已取消支付,请前往我的订单中查看!')
+  showPay.value = false
+}
+const paySuccess = () => {
+  Snackbar.success('支付成功,请前往我的订单查看!')
+  showPay.value = false
+  getOrderPage()
+}
+
 </script>
 
 <style scoped lang="scss">