Преглед на файлове

feat(payment): 新增hybridPaymentType支付类型支持并优化支付流程

- 添加common.hybridPaymentType接口定义及对应的请求方法
- 在user store中新增getPayMent方法获取支付类型
- 支付流程中优先调用getPayMent判断支付类型,区分积分支付与其他支付方式
- 多个子包订单支付流程修改,提升支付逻辑的统一性和健壮性
- 优化视频权益首页布局,调整列表展示样式
- 删除components.d.ts中未使用的组件声明,清理冗余代码
zhangtao преди 1 седмица
родител
ревизия
4971a1c9c6

+ 1 - 0
src/api/apiDefinitions.ts

@@ -81,6 +81,7 @@ export default {
   'common.addOrder':['POST', '/smqjh-oms/api/v1/order/addOrder'],
   'common.hybridPayment':['POST', '/smqjh-oms/service/pay/hybridPayment'],
   'smqjh.getCategoryList':['POST', '/smqjh-pms/app-api/v1/categories/getCategoryList'],
+  'common.hybridPaymentType':['POST', '/smqjh-oms/service/pay/hybridPaymentType'],
 
   'film.getCityList':['GET', '/smqjh-pms/api/v1/app/city/list'],
   'film.getMovieList':['GET', '/smqjh-pms/api/v1/app/movie/page'],

+ 9 - 0
src/api/globals.d.ts

@@ -763,6 +763,15 @@ declare global {
       >(
         config: Config
       ): Alova2Method<apiResData<wxpay>, 'common.hybridPayment', Config>;
+      hybridPaymentType<
+        Config extends Alova2MethodConfig<apiResData<{ payType:  'point' | 'hybrid' | 'wx' }>> & {
+          data: {
+            orderNumber: string;
+          }
+        }
+      >(
+        config: Config
+      ): Alova2Method<apiResData<{ payType:  'point' | 'hybrid' | 'wx' }>, 'common.hybridPaymentType', Config>;
     }
     smqjh: {
       getCategoryList<

+ 11 - 2
src/store/user.ts

@@ -290,11 +290,9 @@ export const useUserStore = defineStore('user', {
         */
 
     clearCart(skuList: Api.CartSkuVo[]) {
-      console.log('进入清空购物车')
       uni.showLoading({ mask: true })
       return new Promise((resolve) => {
         const skuids = skuList.map(item => item.id).join(',')
-        console.log(skuids, '执行前')
         if (skuids.length) {
           console.log(skuids, '执行中')
           Apis.common.deleteShoppingCart({
@@ -568,5 +566,16 @@ export const useUserStore = defineStore('user', {
       uni.hideLoading()
       // #endif
     },
+    async getPayMent(orderNumber: string): Promise<{ payType: 'point' | 'hybrid' | 'wx' }> {
+      return new Promise((resolve, reject) => {
+        Apis.common.hybridPaymentType({ data: { orderNumber } })
+          .then((res) => {
+            resolve(res.data)
+          })
+          .catch((err) => {
+            reject(err)
+          })
+      })
+    },
   },
 })

+ 3 - 2
src/subPack-attractions/attractionsOrderPay/attractionsOrderPay.vue

@@ -29,10 +29,11 @@ async function getPayPreview() {
 }
 
 async function submitPay() {
-  const res = await useUserStore().handleCommonPayMent(orderNo.value)
-  if (res.payType !== 1) {
+  const payMent = await useUserStore().getPayMent(orderNo.value)
+  if (payMent.payType !== 'point') {
     try {
       // #ifdef MP-WEIXIN
+      const res = await useUserStore().handleCommonPayMent(orderNo.value)
       await useUserStore().getWxCommonPayment(res)
       router.replace({ name: 'attractions-order-detail', params: { orderNo: String(payPreviewInfo.value?.orderNumber), ispay: 'true' } })
       // #endif

+ 4 - 4
src/subPack-djk/confirmOrder/index.vue

@@ -36,18 +36,18 @@ async function handlePay() {
   isPay.value = true
   try {
     const data = await Apis.djk.addDJKOrder({ data: { shopId: orderInfo.value.shopId, channelId: useUserStore().userInfo.channelId, phone: phone.value, goodsId: orderInfo.value.id, goodsNum: 1, customerAuthorization: boolToNumber(isAllow.value) } })
-    const res = await useUserStore().handleCommonPayMent(data.data)
-    if (res.payType !== 1) {
+    const payMent = await useUserStore().getPayMent(data.data)
+    if (payMent.payType !== 'point') {
       try {
         // #ifdef MP-WEIXIN
+        const res = await useUserStore().handleCommonPayMent(data.data)
         await useUserStore().getWxCommonPayment(res)
         await useUserStore().paySuccess('djk-homeTabbar', 'subPack-djk/commonTab/index')
         // #endif
-
         // #ifdef H5
         useUserStore().handleCommonWechatPay(data.data)
-        isPay.value = false
         // #endif
+        isPay.value = false
       }
       catch {
         useUserStore().payError('djk-homeTabbar', 'subPack-djk/commonTab/index')

+ 3 - 2
src/subPack-djk/orderDetaile/index.vue

@@ -32,9 +32,10 @@ async function handleCancel() {
   getDetail(String(unref(orderInfo)?.orderNumber))
 }
 async function handlePay() {
-  const res = await useUserStore().handleCommonPayMent(String(unref(orderInfo)?.orderNumber))
-  if (res.payType !== 1) {
+  const payMent = await useUserStore().getPayMent(String(unref(orderInfo)?.orderNumber))
+  if (payMent.payType !== 'point') {
     // #ifdef MP-WEIXIN
+    const res = await useUserStore().handleCommonPayMent(String(unref(orderInfo)?.orderNumber))
     await useUserStore().getWxCommonPayment(res)
     getDetail(String(unref(orderInfo)?.orderNumber))
     // #endif

+ 3 - 2
src/subPack-smqjh/components/djk-order/index.vue

@@ -15,9 +15,10 @@ async function handleCancel(order: Api.xsbOrderList) {
 }
 
 async function handlePay(orderNumber: string) {
-  const res = await useUserStore().handleCommonPayMent?.(orderNumber)
-  if (res?.payType !== 1 && res) {
+  const payMent = await useUserStore().getPayMent(orderNumber)
+  if (payMent?.payType !== 'point' && payMent) {
     // #ifdef MP-WEIXIN
+    const res = await useUserStore().handleCommonPayMent?.(orderNumber)
     await useUserStore().getWxCommonPayment(res)
     _emit('refresh')
     // #endif

+ 4 - 2
src/subPack-smqjh/components/xsb-orderList/xsb-orderList.vue

@@ -21,9 +21,11 @@ async function handleCancel(order: Api.xsbOrderList) {
 }
 
 async function handlePay(orderNumber: string) {
-  const res = await useUserStore().handleCommonPayMent?.(orderNumber)
-  if (res?.payType !== 1 && res) {
+  const payMent = await useUserStore().getPayMent(orderNumber)
+  if (payMent?.payType !== 'point' && payMent) {
     // #ifdef MP-WEIXIN
+    const res = await useUserStore().handleCommonPayMent?.(orderNumber)
+
     await useUserStore().getWxCommonPayment(res)
     _emit('refresh')
     // #endif

+ 34 - 31
src/subPack-videoRights/commonTab/components/home.vue

@@ -4,7 +4,6 @@ import { StaticUrl } from '@/config'
 import { createGlobalLoadingMiddleware } from '@/api/core/middleware'
 
 const { show } = useGlobalToast()
-const { statusBarHeight, MenuButtonHeight } = storeToRefs(useSysStore())
 /**
  * 获取视频权益列表
  */
@@ -49,43 +48,47 @@ function clearSearch() {
   <view class="video-rights-home-page">
     <wd-navbar
       title="视频权益" custom-style="background-color:#FFF" :bordered="false" :z-index="99"
-      safe-area-inset-top left-arrow fixed @click-left="router.back()"
+      safe-area-inset-top
+      left-arrow placeholder fixed @click-left="router.back()"
     />
-    <view :style="{ paddingTop: `${(Number(statusBarHeight) || 44) + MenuButtonHeight + 12}px` }" />
+    <!-- <view :style="{ paddingTop: `${(Number(statusBarHeight) || 44) + MenuButtonHeight + 12}px` }" /> -->
     <wd-search v-model="productName" placeholder="请输入名称" cancel-txt="搜索" @cancel="submitSearch" @clear="clearSearch" />
-    <view class="box-border px24rpx">
-      <scroll-view scroll-y type="custom">
-        <grid-view type="masonry" cross-axis-count="2" main-axis-gap="10" cross-axis-gap="10">
-          <view v-for="item in videoDataList" :key="item?.id" class="mt-18rpx rounded-16rpx bg-#FFF" @click="router.push({ name: 'video-rights-detail', params: { id: item.id || '' } })">
-            <view class="image-wrapper h-342rpx w-342rpx">
-              <image
-                class="h-full w-full rounded-16rpx object-c"
-                mode="aspectFill"
-                :src="item.productImg ? item.productImg : `${StaticUrl}/list-page-img.png`"
-              />
+    <view class="box-border px24rpx pt24rpx">
+      <view class="w-full columns-2 gap-[10px]">
+        <view
+          v-for="item in videoDataList"
+          :key="item?.id"
+          class="mb-[10px] break-inside-avoid rounded-16rpx bg-#FFF"
+          @click="router.push({ name: 'video-rights-detail', params: { id: item.id || '' } })"
+        >
+          <view class="image-wrapper h-342rpx w-full">
+            <image
+              class="h-full w-full rounded-16rpx object-c"
+              mode="aspectFill"
+              :src="item.productImg ? item.productImg : `${StaticUrl}/list-page-img.png`"
+            />
+          </view>
+          <view class="mx20rpx my-24rpx">
+            <view class="text-28rpx font-bold">
+              {{ item.localProductName ? item.localProductName : item.productName }}
             </view>
-            <view class="mx20rpx my-24rpx">
-              <view class="text-28rpx font-bold">
-                {{ item.localProductName ? item.localProductName : item.productName }}
+            <view class="mt-30rpx flex items-center justify-between">
+              <view class="text-#FF4D3A">
+                <text class="text-22rpx font-500">
+                  ¥
+                </text>
+                <text class="text-34rpx font-800">
+                  {{ item.price }}
+                </text>
               </view>
-              <view class="mt-30rpx flex items-center justify-between">
-                <view class="text-#FF4D3A">
-                  <text class="text-22rpx font-500">
-                    ¥
-                  </text>
-                  <text class="text-34rpx font-800">
-                    {{ item.price }}
-                  </text>
-                </view>
-                <view class="text-22rpx text-#AAA decoration-line-through">
-                  市场价¥{{ item.faceValue }}
-                </view>
+              <view class="text-22rpx text-#AAA decoration-line-through">
+                市场价¥{{ item.faceValue }}
               </view>
             </view>
           </view>
-        </grid-view>
-        <StatusTip v-if="!videoDataList.length" tip="暂无内容" />
-      </scroll-view>
+        </view>
+      </view>
+      <StatusTip v-if="!videoDataList.length" tip="暂无内容" />
       <wd-loadmore :state="state" :loading-props="{ color: '#9ED605', size: 20 }" @reload="reload" />
     </view>
   </view>

+ 7 - 6
src/subPack-xsb/confirmOrder/index.vue

@@ -275,20 +275,21 @@ async function handlePay() {
           }
         : undefined,
     )
-    const res = await useUserStore().handleCommonPayMent(orderNumber)
-    console.log(orderInfo.value, '=====订单信息')
-    await useUserStore().clearCart(orderInfo.value.skuList)
-    totalProduct.value = null
-    if (res.payType !== 1) {
+    const payMent = await useUserStore().getPayMent(orderNumber)
+
+    if (payMent.payType !== 'point') {
       try {
         // #ifdef H5
         useUserStore().handleCommonWechatPay(orderNumber)
-        isPay.value = false
         // #endif
         // #ifdef MP-WEIXIN
+        const res = await useUserStore().handleCommonPayMent(orderNumber)
         await useUserStore().getWxCommonPayment(res)
         await useUserStore().paySuccess('xsb-order', 'subPack-xsb/commonTab/index')
         // #endif
+        await useUserStore().clearCart(orderInfo.value.skuList)
+        totalProduct.value = null
+        isPay.value = false
       }
       catch {
         await useUserStore().payError('xsb-order', 'subPack-xsb/commonTab/index')

+ 3 - 2
src/subPack-xsb/orderDetaile/index.vue

@@ -78,9 +78,10 @@ async function handleCancel() {
   getDetail(String(unref(orderInfo)?.orderNumber))
 }
 async function handlePay() {
-  const res = await useUserStore().handleCommonPayMent(String(unref(orderInfo)?.orderNumber))
-  if (res.payType !== 1) {
+  const payMent = await useUserStore().getPayMent(String(unref(orderInfo)?.orderNumber))
+  if (payMent.payType !== 'point') {
     // #ifdef MP-WEIXIN
+    const res = await useUserStore().handleCommonPayMent(String(unref(orderInfo)?.orderNumber))
     await useUserStore().getWxCommonPayment(res)
     getDetail(String(unref(orderInfo)?.orderNumber))
     // #endif