Explorar o código

feat(djk): 添加退款功能

- 新增退款API定义和类型声明
- 创建退款页面组件,支持选择退款原因、填写说明和上传凭证
- 在订单详情页添加退款按钮,跳转至退款页面
- 添加统一的订单状态处理方法,支持多种订单状态显示
- 更新订单列表中的状态显示逻辑
- 修复商品信息页面参数类型转换问题
- 调整积分计算方式为实际金额显示
zhangtao hai 6 horas
pai
achega
1a10a19f59

+ 1 - 0
src/api/apiDefinitions.ts

@@ -117,5 +117,6 @@ export default {
   'djk.welfareClaimInfoDetaile':['GET', '/smqjh-pms/app-api/v1/welfareClaimInfo/{memberId}'],
   'djk.welfareClaimInfoPopup':['GET', '/smqjh-pms/app-api/v1/welfareClaimInfo/popup/{memberId}'],
   'djk.addWelfareOrder':['POST', '/smqjh-oms/api/v1/djkOrder/addWelfareOrder'],
+  'djk.submitRefund':['POST', '/smqjh-oms/api/v1/djkOrder/submitRefund'],
 
 };

+ 24 - 1
src/api/globals.d.ts

@@ -1147,7 +1147,30 @@ declare global {
       >(
         config: Config
       ): Alova2Method<apiResData<any>, 'djk.addWelfareOrder', Config>;
-
+      submitRefund<
+        Config extends Alova2MethodConfig<apiResData<any>> & {
+          data: {
+            /**
+          * 订单号
+          */
+            orderNumber?: string;
+            /**
+             * 退款描述
+             */
+            refundDesc?: string;
+            /**
+             * 退款图片
+             */
+            refundImg?: string;
+            /**
+             * 退款原因
+             */
+            refundReason?: string;
+          };
+        }
+      >(
+        config: Config
+      ): Alova2Method<apiResData<any>, 'djk.submitRefund', Config>;
     }
   }
 }

+ 8 - 0
src/pages.json

@@ -514,6 +514,14 @@
     {
       "root": "subPack-djk",
       "pages": [
+        {
+          "path": "afterSales/index",
+          "name": "djk-afterSales",
+          "islogin": true,
+          "style": {
+            "navigationBarTitleText": "申请退款"
+          }
+        },
         {
           "path": "commonTab/index",
           "name": "djk-homeTabbar",

+ 10 - 0
src/store/user.ts

@@ -416,5 +416,15 @@ export const useUserStore = defineStore('user', {
       }
       return '未知订单状态'
     },
+    handleDjkCommonOrderStatusText(order: Api.xsbOrderList) {
+      const textMap = {
+        [OrderStatus.OrderAccepted]: '待使用',
+        [OrderStatus.OrderCompleted]: '已完成',
+        [OrderStatus.OrderCancel]: '已取消',
+        [OrderStatus.OrderRefund]: '已退款',
+        [OrderStatus.OrderExpired]: '已过期',
+      }
+      return textMap[order.hbOrderStatus as keyof typeof textMap] || '未知订单状态'
+    },
   },
 })

+ 140 - 0
src/subPack-djk/afterSales/index.vue

@@ -0,0 +1,140 @@
+<script setup lang="ts">
+import { StaticUrl } from '@/config'
+import router from '@/router'
+
+definePage({ name: 'djk-afterSales', islogin: true, style: { navigationBarTitleText: '申请退款' } })
+const orderInfo = ref<Api.xsbOrderList>()
+const fileList = ref<{ url: string }[]>([])
+const remark = ref()
+const reson = ref()
+const { refreshOrderList } = storeToRefs(useSysStore())
+onLoad((option: any) => {
+  orderInfo.value = JSON.parse(option.data)
+  console.log(orderInfo.value, '===')
+})
+async function handleSubmit() {
+  if (!reson.value) {
+    useGlobalToast().show('请选择退款原因')
+    return
+  }
+  uni.showLoading({ mask: true })
+  try {
+    await Apis.djk.submitRefund({ data: {
+      orderNumber: orderInfo.value?.orderNumber,
+      refundReason: reson.value,
+      refundDesc: remark.value,
+      refundImg: fileList.value.map(item => item.url).join(','),
+    } })
+    uni.hideLoading()
+    useGlobalToast().show('申请退款成功')
+    setTimeout(() => {
+      refreshOrderList.value = true
+      router.back()
+    }, 2000)
+  }
+  catch {
+    uni.hideLoading()
+  }
+}
+</script>
+
+<template>
+  <view class="pages-djk p24rpx">
+    <view class="rounded-16rpx bg-white p24rpx">
+      <view class="text-36rpx font-semibold">
+        退款订单:{{ orderInfo?.djkOrderAttachInfo?.goodsName }}
+      </view>
+      <view class="mt16rpx">
+        <view class="text-24rpx">
+          商品金额: {{ orderInfo?.djkOrderAttachInfo?.price }}
+        </view>
+      </view>
+      <view class="mt16rpx">
+        <view class="text-24rpx">
+          可退金额: {{ orderInfo?.actualTotal }}
+        </view>
+      </view>
+    </view>
+    <view class="mt20rpx rounded-16rpx bg-white px24rpx py28rpx">
+      <view class="flex items-center justify-between">
+        <view class="text-32rpx font-semibold">
+          请选择退款原因 <text class="text-28rpx text-gray">
+            (必选)
+          </text>
+        </view>
+      </view>
+      <view class="mt20rpx">
+        <wd-radio-group v-model="reson" shape="dot">
+          <wd-radio value="计划有变,无法使用">
+            计划有变,无法使用
+          </wd-radio>
+          <wd-radio value="服务项目不符">
+            服务项目不符
+          </wd-radio>
+          <wd-radio value="找到更合适的服务">
+            找到更合适的服务
+          </wd-radio>
+          <wd-radio value="其他项目">
+            其他项目
+          </wd-radio>
+        </wd-radio-group>
+      </view>
+      <view class="mt24rpx text-28rpx font-semibold">
+        详情说明 <text class="text-gray">
+          (可选)
+        </text>
+      </view>
+      <view class="mt20rpx rounded-16rpx bg-#F6F6F6 p24rpx">
+        <wd-textarea v-model="remark" placeholder="请描述您的具体情况" show-word-limit :maxlength="200" />
+        <view class="upload mt18rpx">
+          <Zupload v-model:value="fileList" />
+        </view>
+      </view>
+    </view>
+    <view class="mt20rpx rounded-16rpx bg-white p24rpx">
+      <view class="text-32rpx font-semibold">
+        <image
+          :src="`${StaticUrl}/djk-goods-erro.png`"
+          class="mr5rpx h24rpx w24rpx"
+        /> 退款提示
+      </view>
+      <view class="mt20rpx text-28rpx">
+        ·退款申请提交后立即处理,无需审核
+      </view>
+      <view class="mt20rpx text-28rpx">
+        ·退款将在1-3个工作日内到账
+      </view>
+      <view class="mt20rpx text-28rpx">
+        ·退款将原路返回支付账户
+      </view>
+      <view class="mt20rpx text-28rpx">
+        ·退款成功后订单将关闭
+      </view>
+    </view>
+    <view class="h200rpx" />
+  </view>
+  <view
+    class="ios fixed bottom-0 z-10 box-border w-full w-full rounded-t-32rpx bg-white px32rpx pt-16rpx"
+  >
+    <wd-button block @click="handleSubmit">
+      提交
+    </wd-button>
+  </view>
+</template>
+
+<style lang="scss" scoped>
+.pages-djk{
+  :deep(){
+    .wd-textarea{
+      background: #F6F6F6 !important;
+      padding: 0 !important;
+      .wd-textarea__value{
+        background: #F6F6F6 !important;
+      }
+      .wd-textarea__count{
+        background: #F6F6F6 !important;
+      }
+    }
+  }
+}
+</style>

+ 1 - 1
src/subPack-djk/commonTab/components/order.vue

@@ -27,7 +27,7 @@ function handleBottom() {
 }
 reload()
 watch(() => refreshOrderList.value, () => {
-  console.log('刷新页面')
+  console.log('刷新页面', refreshOrderList.value)
   if (refreshOrderList.value) {
     reload()
     refreshOrderList.value = false

+ 1 - 1
src/subPack-djk/goodsinfo/index.vue

@@ -16,7 +16,7 @@ const isShowTab = ref(false)
 const goodsId = ref()
 const type = ref(0)
 onLoad((option: any) => {
-  type.value = option.type
+  type.value = Number(option.type)
   goodsId.value = option.id
   getGoodsDetaile()
 })

+ 6 - 17
src/subPack-djk/orderDetaile/index.vue

@@ -59,7 +59,10 @@ function handleCopy() {
   })
 }
 async function handleAfterSale() {
-
+  router.push({
+    name: 'djk-afterSales',
+    params: { data: JSON.stringify(orderInfo.value) },
+  })
 }
 function handleNav() {
   uni.openLocation({
@@ -117,21 +120,7 @@ function handlePhone() {
           <view
             v-if="orderInfo.hbOrderStatus !== OrderStatus.PaddingPay" class="flex items-center"
           >
-            <view v-if="orderInfo.hbOrderStatus === OrderStatus.OrderAccepted" class="mr-10rpx">
-              待使用
-            </view>
-            <view v-if="orderInfo.hbOrderStatus === OrderStatus.OrderCompleted" class="mr-10rpx">
-              已完成
-            </view>
-            <view v-if="orderInfo.hbOrderStatus === OrderStatus.OrderCancel" class="mr-10rpx">
-              已取消
-            </view>
-            <view v-if="orderInfo.hbOrderStatus === OrderStatus.OrderRefund" class="mr-10rpx">
-              已退款
-            </view>
-            <view v-if="orderInfo.hbOrderStatus === OrderStatus.OrderExpired" class="mr-10rpx">
-              已过期
-            </view>
+            {{ useUserStore().handleDjkCommonOrderStatusText(orderInfo) }}
           </view>
           <view v-if="orderInfo.hbOrderStatus === OrderStatus.OrderCancel" class="mt-20rpx text-28rpx text-[#AAAAAA]">
             取消原因:{{ orderInfo.cancelReason }}
@@ -206,7 +195,7 @@ function handlePhone() {
             积分{{ orderInfo.offsetPoints ? `(${orderInfo.offsetPoints})` : '' }}
           </view>
           <view class="text-28rpx text-#FF4D3A font-semibold">
-            -¥{{ orderInfo.offsetPoints }}
+            -¥{{ Number(orderInfo.offsetPoints) / 100 }}
           </view>
         </view>
         <view class="my20rpx h2rpx w-full bg-#F0F0F0" />

+ 6 - 7
src/subPack-smqjh/components/djk-order/index.vue

@@ -39,11 +39,10 @@ function handleClick(no: string) {
   router.push({ name: 'djk-orderDetaile', params: { id: no } })
 }
 async function handleAfterSale(item: Api.xsbOrderList) {
-  if (!item.orderItemList) {
-    useGlobalToast().show('商品异常!')
-    return
-  }
-  await useSysStore().getRefunOrder(item.orderNumber as string)
+  router.push({
+    name: 'djk-afterSales',
+    params: { data: JSON.stringify(item) },
+  })
 }
 </script>
 
@@ -58,7 +57,7 @@ async function handleAfterSale(item: Api.xsbOrderList) {
         </view>
         <view class="text-24rpx">
           <template v-if="order.hbOrderStatus !== OrderStatus.PaddingPay">
-            {{ useUserStore().handleXSBCommonOrderStatusText(order) }}
+            {{ useUserStore().handleDjkCommonOrderStatusText(order) }}
           </template>
           <template v-else>
             <view class="down flex items-center text-[#449DFE]">
@@ -135,7 +134,7 @@ async function handleAfterSale(item: Api.xsbOrderList) {
       <template v-if="order.hbOrderStatus == OrderStatus.OrderAccepted && order.djkOrderAttachInfo?.djkOrderType == 0 ">
         <view class="mr-20rpx">
           <wd-button size="small" plain type="info" @click.stop="() => handleAfterSale(order)">
-            申请售后
+            申请退款
           </wd-button>
         </view>
       </template>

+ 1 - 0
src/uni-pages.d.ts

@@ -48,6 +48,7 @@ interface NavigateToOptions {
        "/subPack-videoRights/videoRightsDetail/videoRightsDetail" |
        "/subPack-videoRights/videoRightsOrderInfo/videoRightsOrderInfo" |
        "/subPack-videoRights/videoRightsSubmitOrder/videoRightsSubmitOrder" |
+       "/subPack-djk/afterSales/index" |
        "/subPack-djk/commonTab/index" |
        "/subPack-djk/confirmOrder/index" |
        "/subPack-djk/goodsinfo/index" |