Browse Source

feat(order): 实现订单页面及相关接口与支付流程支持

- 新增并配置优惠券相关API接口,支持优惠券列表、详情及下单使用优惠券查询
- 定义和扩展优惠券相关的类型接口以支持优惠券功能
- 新增加油订单列表查询接口,支持分页和状态筛选
- 完善订单页UI,添加订单状态Tab切换及订单详情展示功能
- 实现订单取消功能与订单列表数据自动刷新
- 增加付款和申请开票按钮占位提示,完善订单状态相关逻辑和倒计时展示
- 优化H5环境用户支付状态处理,支付结果通过路由跳转至对应页面
- 修正并调整确认订单页支付跳转方式,统一H5端跳转URL处理
- 增添部分全局组件声明包括加载Loading和单选框组件
- 增加manifest及manifest.config相关配置,添加QQ地图SDK key支持
- 订单页标题和登录校验属性调整,确保用户登录才能访问
- 修复支付成功页金额显示格式,避免除以100后的错误
- 调整获取定位逻辑,禁用旧的浏览器navigator.geolocation方法,改用uni.getLocation实现定位
- 统一定位失败错误提示和处理逻辑,提升用户体验
zhangtao 6 days ago
parent
commit
b30f89b654

+ 7 - 1
manifest.config.ts

@@ -81,7 +81,13 @@ export default defineManifestConfig({
   'h5': {
     darkmode: true,
     themeLocation: 'theme.json',
-
+    sdkConfigs: {
+      maps: {
+        qqmap: {
+          key: 'JO5BZ-QLVCJ-22OFQ-XNV4U-MHIWV-UCFQB',
+        },
+      },
+    },
   },
   'uniStatistics': {
     enable: false,

+ 4 - 0
src/api/apiDefinitions.ts

@@ -18,6 +18,9 @@
 export default {
   'app.get_smqjh_system_app_api_membercoupon_page': ['GET', '/smqjh-system/app-api/memberCoupon/page'],
   'app.get_smqjh_system_app_api_membercoupon_findbyid': ['GET', '/smqjh-system/app-api/memberCoupon/findById'],
+  'app.get_app_api_membercoupon_page': ['GET', '/app-api/memberCoupon/page'],
+  'app.get_app_api_membercoupon_findbyid': ['GET', '/app-api/memberCoupon/findById'],
+  'app.get_app_api_membercoupon_findplaceorderlist': ['GET', '/app-api/memberCoupon/findPlaceOrderList'],
   'app.get_smqjh_system_app_api_coupon_page': ['GET', '/smqjh-system/app-api/coupon/page'],
   'app.get_smqjh_system_app_api_coupon_findbyid': ['GET', '/smqjh-system/app-api/coupon/findById'],
   'app.get_smqjh_system_app_api_coupon_exchangeinfo': ['GET', '/smqjh-system/app-api/coupon/exchangeInfo'],
@@ -93,6 +96,7 @@ export default {
   'general.post_smqjh_oms_api_v1_oil_order_cancel': ['POST', '/smqjh-oms/api/v1/oil/order/cancel'],
   'general.post_smqjh_oms_api_v1_oil_order_pay': ['POST', '/smqjh-oms/api/v1/oil/order/pay'],
   'general.post_smqjh_oms_api_v1_oil_order_refundorder': ['POST', '/smqjh-oms/api/v1/oil/order/refundOrder'],
+  'general.post_smqjh_oms_api_v1_oil_order_findoilorderpage': ['POST', '/smqjh-oms/api/v1/oil/order/findOilOrderPage'],
   'general.post_api_v1_oil_order_findoilorderpage': ['POST', '/api/v1/oil/order/findOilOrderPage'],
   'general.post_api_v1_oil_order_createorder': ['POST', '/api/v1/oil/order/createOrder'],
   'general.post_api_v1_oil_order_cancel': ['POST', '/api/v1/oil/order/cancel'],

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

@@ -907,6 +907,63 @@ export interface ResultAppCouponDetailsVO {
   data?: AppCouponDetailsVO;
   msg?: string;
 }
+export interface AppCouponOrderOptimalVO {
+  /**
+   * id
+   */
+  id?: string;
+  /**
+   * 券Id
+   */
+  allowanceId?: string;
+  /**
+   * 订单金额,单位:元
+   */
+  amountMoney?: number;
+  /**
+   * 优惠金额,单位:元
+   */
+  discountMoney?: number;
+  /**
+   * 优惠类型 1-满减,2-立减
+   */
+  promotionType?: number;
+  /**
+   * 状态 1-可用;其他不可用
+   */
+  status?: number;
+  /**
+   * 状态描述
+   */
+  statusDesc?: string;
+  /**
+   * 限制使用优惠券,true:被限制
+   */
+  restrict?: boolean;
+  /**
+   * 结束时间
+   */
+  expirationTime?: string;
+}
+export interface AppMemberCouponOrderVO {
+  appCouponOrderOptimalVO?: AppCouponOrderOptimalVO;
+  /**
+   * 可以用优惠劵
+   */
+  appCouponOrderVOList?: AppCouponOrderOptimalVO[];
+  /**
+   * 不可用优惠劵
+   */
+  appCouponNoOrderVOList?: AppCouponOrderOptimalVO[];
+}
+export interface ResultAppMemberCouponOrderVO {
+  /**
+   * 返回状态码
+   */
+  code?: string;
+  data?: AppMemberCouponOrderVO;
+  msg?: string;
+}
 export interface DataCouponInfoAppVo {
   list?: CouponInfoAppVo[];
   total?: number;
@@ -2068,6 +2125,282 @@ declare global {
       >(
         config: Config
       ): Alova2Method<ResultAppCouponDetailsVO, 'app.get_smqjh_system_app_api_membercoupon_findbyid', Config>;
+      /**
+       * ---
+       *
+       * [GET] 优惠券活动列表查询
+       *
+       * **path:** /app-api/memberCoupon/page
+       *
+       * ---
+       *
+       * **Query Parameters**
+       * ```ts
+       * type QueryParameters = {
+       *   // 页码
+       *   pageNum?: number
+       *   // 每页记录数
+       *   pageSize?: number
+       *   // 优惠券状态
+       *   useStatus?: number
+       * }
+       * ```
+       *
+       * ---
+       *
+       * **Response**
+       * ```ts
+       * type Response = {
+       *   // 返回状态码
+       *   code?: string
+       *   data?: {
+       *     // [items] start
+       *     // [items] end
+       *     list?: Array<{
+       *       // id
+       *       id?: string
+       *       // 门槛(单位(元)) 满减时的需要达到什么金额
+       *       amountMoney?: number
+       *       // 面额(单位(元)) 优惠的金额
+       *       discountMoney?: number
+       *       // 使用状态:0-未使用 1-已使用 2-已过期
+       *       useStatus?: number
+       *       // 锁定状态:0-未锁定/已释放 1-已锁定
+       *       lockStatus?: number
+       *       // 锁定的订单ID
+       *       lockOrderId?: string
+       *       // 过期时间
+       *       expirationTime?: string
+       *       // 订单使用时间
+       *       orderCreateTime?: string
+       *     }>
+       *     total?: number
+       *   }
+       *   // 返回处理消息
+       *   msg?: string
+       * }
+       * ```
+       */
+      get_app_api_membercoupon_page<
+        Config extends Alova2MethodConfig<PageResultAppMemberCouponVO> & {
+          params: {
+            /**
+             * 页码
+             */
+            pageNum?: number;
+            /**
+             * 每页记录数
+             */
+            pageSize?: number;
+            /**
+             * 优惠券状态
+             */
+            useStatus?: number;
+          };
+        }
+      >(
+        config: Config
+      ): Alova2Method<PageResultAppMemberCouponVO, 'app.get_app_api_membercoupon_page', Config>;
+      /**
+       * ---
+       *
+       * [GET] 优惠券详情查询
+       *
+       * **path:** /app-api/memberCoupon/findById
+       *
+       * ---
+       *
+       * **Query Parameters**
+       * ```ts
+       * type QueryParameters = {
+       *   id: string
+       * }
+       * ```
+       *
+       * ---
+       *
+       * **Response**
+       * ```ts
+       * type Response = {
+       *   // 返回状态码
+       *   code?: string
+       *   data?: {
+       *     // id
+       *     id?: string
+       *     // 门槛(单位(元)) 满减时的需要达到什么金额
+       *     amountMoney?: number
+       *     // 第三方的津贴/券id
+       *     allowanceId?: string
+       *     // 批次id
+       *     batchId?: string
+       *     // 面额(单位(元)) 优惠的金额
+       *     discountMoney?: number
+       *     // 使用状态:0-未使用 1-已使用 2-已过期
+       *     useStatus?: number
+       *     // 锁定状态:0-未锁定/已释放 1-已锁定
+       *     lockStatus?: number
+       *     // 领取时间
+       *     getTime?: string
+       *     // 过期时间
+       *     expirationTime?: string
+       *     // 订单使用时间
+       *     orderPayTime?: string
+       *     // 锁定的订单ID
+       *     orderNumber?: string
+       *     // 门店名称
+       *     storeName?: string
+       *     // 枪号
+       *     gunNo?: string
+       *     // 商品名称(油品名称)
+       *     itemName?: string
+       *     // 订单金额(单位:分)
+       *     totalMoney?: number
+       *     // 实付金额(单位:分)
+       *     realMoney?: number
+       *     // 优惠减免金额
+       *     promotionAmount?: number
+       *     // 下单时间
+       *     orderCreateTime?: string
+       *   }
+       *   msg?: string
+       * }
+       * ```
+       */
+      get_app_api_membercoupon_findbyid<
+        Config extends Alova2MethodConfig<ResultAppCouponDetailsVO> & {
+          params: {
+            id: string;
+          };
+        }
+      >(
+        config: Config
+      ): Alova2Method<ResultAppCouponDetailsVO, 'app.get_app_api_membercoupon_findbyid', Config>;
+      /**
+       * ---
+       *
+       * [GET] 查询用户下单时使用优惠劵
+       *
+       * **path:** /app-api/memberCoupon/findPlaceOrderList
+       *
+       * ---
+       *
+       * **Query Parameters**
+       * ```ts
+       * type QueryParameters = {
+       *   // 门店id
+       *   // 用于判断是否满足门店使用限制条件
+       *   storeId?: string
+       *   // 订单金额
+       *   // 用于判断是否满足满减的条件。 单位:分
+       *   orderAmount?: number
+       *   // 津贴类型
+       *   // 2.枪价券
+       *   allowanceType?: number
+       * }
+       * ```
+       *
+       * ---
+       *
+       * **Response**
+       * ```ts
+       * type Response = {
+       *   // 返回状态码
+       *   code?: string
+       *   data?: {
+       *     appCouponOrderOptimalVO?: {
+       *       // id
+       *       id?: string
+       *       // 券Id
+       *       allowanceId?: string
+       *       // 订单金额,单位:元
+       *       amountMoney?: number
+       *       // 优惠金额,单位:元
+       *       discountMoney?: number
+       *       // 优惠类型 1-满减,2-立减
+       *       promotionType?: number
+       *       // 状态 1-可用;其他不可用
+       *       status?: number
+       *       // 状态描述
+       *       statusDesc?: string
+       *       // 限制使用优惠券,true:被限制
+       *       restrict?: boolean
+       *       // 结束时间
+       *       expirationTime?: string
+       *     }
+       *     // 可以用优惠劵
+       *     // [items] start
+       *     // [items] end
+       *     appCouponOrderVOList?: Array<{
+       *       // id
+       *       id?: string
+       *       // 券Id
+       *       allowanceId?: string
+       *       // 订单金额,单位:元
+       *       amountMoney?: number
+       *       // 优惠金额,单位:元
+       *       discountMoney?: number
+       *       // 优惠类型 1-满减,2-立减
+       *       promotionType?: number
+       *       // 状态 1-可用;其他不可用
+       *       status?: number
+       *       // 状态描述
+       *       statusDesc?: string
+       *       // 限制使用优惠券,true:被限制
+       *       restrict?: boolean
+       *       // 结束时间
+       *       expirationTime?: string
+       *     }>
+       *     // 不可用优惠劵
+       *     // [items] start
+       *     // [items] end
+       *     appCouponNoOrderVOList?: Array<{
+       *       // id
+       *       id?: string
+       *       // 券Id
+       *       allowanceId?: string
+       *       // 订单金额,单位:元
+       *       amountMoney?: number
+       *       // 优惠金额,单位:元
+       *       discountMoney?: number
+       *       // 优惠类型 1-满减,2-立减
+       *       promotionType?: number
+       *       // 状态 1-可用;其他不可用
+       *       status?: number
+       *       // 状态描述
+       *       statusDesc?: string
+       *       // 限制使用优惠券,true:被限制
+       *       restrict?: boolean
+       *       // 结束时间
+       *       expirationTime?: string
+       *     }>
+       *   }
+       *   msg?: string
+       * }
+       * ```
+       */
+      get_app_api_membercoupon_findplaceorderlist<
+        Config extends Alova2MethodConfig<ResultAppMemberCouponOrderVO> & {
+          params: {
+            /**
+             * 门店id
+             * 用于判断是否满足门店使用限制条件
+             */
+            storeId?: string;
+            /**
+             * 订单金额
+             * 用于判断是否满足满减的条件。 单位:分
+             */
+            orderAmount?: number;
+            /**
+             * 津贴类型
+             * 2.枪价券
+             */
+            allowanceType?: number;
+          };
+        }
+      >(
+        config: Config
+      ): Alova2Method<ResultAppMemberCouponOrderVO, 'app.get_app_api_membercoupon_findplaceorderlist', Config>;
       /**
        * ---
        *
@@ -5537,6 +5870,81 @@ declare global {
       >(
         config: Config
       ): Alova2Method<ResultBoolean, 'general.post_smqjh_oms_api_v1_oil_order_refundorder', Config>;
+      /**
+       * ---
+       *
+       * [POST] 加油订单列表
+       *
+       * **path:** /smqjh-oms/api/v1/oil/order/findOilOrderPage
+       *
+       * ---
+       *
+       * **RequestBody**
+       * ```ts
+       * type RequestBody = {
+       *   // 页码
+       *   pageNum?: number
+       *   // 每页记录数
+       *   pageSize?: number
+       *   // 订单状态:0全部,1-待支付,2-已支付,6-已退款,9-已取消
+       *   status?: number
+       * }
+       * ```
+       *
+       * ---
+       *
+       * **Response**
+       * ```ts
+       * type Response = {
+       *   // 返回状态码
+       *   code?: string
+       *   data?: {
+       *     // [items] start
+       *     // [items] end
+       *     list?: Array<{
+       *       // 订购流水号
+       *       orderNumber?: string
+       *       // 门店名称
+       *       storeName?: string
+       *       // 枪号
+       *       gunNo?: string
+       *       // 商品名称(油品名称)
+       *       itemName?: string
+       *       // 品牌
+       *       brandName?: string
+       *       // 实付金额
+       *       realMoney?: number
+       *       // 订单金额
+       *       totalMoney?: number
+       *       // 订单状态:1-待支付,2-已支付,6-已退款,9-已取消
+       *       oilOrderStatus?: number
+       *       // 合作方订单号
+       *       thirdOrderId?: string
+       *       // 付款时间
+       *       payTime?: string
+       *       // 退款时间
+       *       refundTime?: string
+       *       // 下单时间
+       *       createTime?: string
+       *       // 取消时间
+       *       cancelTime?: string
+       *       // 订单过期时间
+       *       expireTime?: string
+       *     }>
+       *     total?: number
+       *   }
+       *   // 返回处理消息
+       *   msg?: string
+       * }
+       * ```
+       */
+      post_smqjh_oms_api_v1_oil_order_findoilorderpage<
+        Config extends Alova2MethodConfig<PageResultOmsOrderOilPageVO> & {
+          data: OmsOrderOilPageQuery;
+        }
+      >(
+        config: Config
+      ): Alova2Method<PageResultOmsOrderOilPageVO, 'general.post_smqjh_oms_api_v1_oil_order_findoilorderpage', Config>;
       /**
        * ---
        *

+ 3 - 0
src/components.d.ts

@@ -20,9 +20,12 @@ declare module 'vue' {
     WdCountDown: typeof import('wot-design-uni/components/wd-count-down/wd-count-down.vue')['default']
     WdGap: typeof import('wot-design-uni/components/wd-gap/wd-gap.vue')['default']
     WdIcon: typeof import('wot-design-uni/components/wd-icon/wd-icon.vue')['default']
+    WdLoading: typeof import('wot-design-uni/components/wd-loading/wd-loading.vue')['default']
     WdMessageBox: typeof import('wot-design-uni/components/wd-message-box/wd-message-box.vue')['default']
     WdNotify: typeof import('wot-design-uni/components/wd-notify/wd-notify.vue')['default']
     WdPopup: typeof import('wot-design-uni/components/wd-popup/wd-popup.vue')['default']
+    WdRadio: typeof import('wot-design-uni/components/wd-radio/wd-radio.vue')['default']
+    WdRadioGroup: typeof import('wot-design-uni/components/wd-radio-group/wd-radio-group.vue')['default']
     WdStatusTip: typeof import('wot-design-uni/components/wd-status-tip/wd-status-tip.vue')['default']
     WdSwiper: typeof import('wot-design-uni/components/wd-swiper/wd-swiper.vue')['default']
     WdTabbar: typeof import('wot-design-uni/components/wd-tabbar/wd-tabbar.vue')['default']

+ 8 - 1
src/manifest.json

@@ -78,6 +78,13 @@
   "vueVersion": "3",
   "h5": {
     "darkmode": true,
-    "themeLocation": "theme.json"
+    "themeLocation": "theme.json",
+    "sdkConfigs": {
+      "maps": {
+        "qqmap": {
+          "key": "JO5BZ-QLVCJ-22OFQ-XNV4U-MHIWV-UCFQB"
+        }
+      }
+    }
   }
 }

+ 2 - 1
src/pages.json

@@ -68,7 +68,7 @@
       "name": "order",
       "islogin": true,
       "style": {
-        "navigationBarTitleText": "订单",
+        "navigationBarTitleText": "订单列表",
         "navigationStyle": "custom"
       },
       "layout": "tabbar"
@@ -104,6 +104,7 @@
       "path": "pages/voucher/index",
       "name": "voucher",
       "layout": "tabbar",
+      "islogin": true,
       "style": {
         "navigationBarTitleText": "抵扣券",
         "navigationStyle": "custom"

+ 3 - 2
src/pages/confirmOrder/index.vue

@@ -96,10 +96,11 @@ async function goPay() {
       storeId: storeDetail.value?.storeId,
       itemName: priceData.value?.itemName,
     } })
-    uni.hideLoading()
+    const url = `${res.data}&redirectUrl=https://smqjh.admin.zswlgz.com/h5`
     // #ifdef H5
-    window.location.href = `${res.data}&redirectUrl=https://smqjh.admin.zswlgz.com/h5/#/pages/transition/index`
+    window.location.href = url
     // #endif
+    uni.hideLoading()
   }
   catch {
     uni.hideLoading()

+ 14 - 0
src/pages/index/index.vue

@@ -34,9 +34,23 @@ function handleView(_item: any) {
   })
 }
 
+onLoad((_options: any) => {
+
+})
 onMounted(async () => {
   await useUserStore().getLocationH5()
   send()
+  // #ifdef H5
+  // 解析浏览器 URL 参数,处理第三方支付回调
+  const urlParams = new URLSearchParams(window.location.search)
+  const payStatus = urlParams.get('payStatus')
+  const outerOrderId = urlParams.get('outerOrderId') || ''
+  if (payStatus !== null) {
+    router.push({ name: 'transition', params: { payStatus, outerOrderId } })
+  }
+
+  // #
+  // endif
 })
 onReachBottom(() => {
   if (!isLastPage.value) {

+ 228 - 4
src/pages/order/index.vue

@@ -1,11 +1,235 @@
 <script setup lang="ts">
-definePage({ name: 'order', islogin: true, style: { navigationBarTitleText: '订单', navigationStyle: 'custom' }, layout: 'tabbar' })
+import type { OmsOrderOilPageVO } from '@/api/globals'
+
+definePage({
+  name: 'order',
+  islogin: true,
+  style: { navigationBarTitleText: '订单列表', navigationStyle: 'custom' },
+  layout: 'tabbar',
+})
+
+// Tab 列表
+const tabList = ref([
+  { label: '全部', value: 0 },
+  { label: '待支付', value: 1 },
+  { label: '已支付', value: 2 },
+  { label: '已退款', value: 6 },
+])
+const currentTab = ref(0)
+
+// 分页请求
+const { data, send, isLastPage, page } = usePagination(
+  (pageNum, pageSize) => Apis.general.post_smqjh_oms_api_v1_oil_order_findoilorderpage({
+    data: { pageNum, pageSize, status: currentTab.value },
+  }),
+  {
+    initialPage: 1,
+    initialPageSize: 10,
+    immediate: false,
+    data: res => res.data?.list,
+    append: true,
+  },
+)
+
+// 切换 Tab
+function handleTabChange(value: number) {
+  currentTab.value = value
+  data.value = []
+  page.value = 1
+  send()
+}
+
+// 订单状态映射
+const statusMap = new Map([
+  [1, '待支付'],
+  [2, '已支付'],
+  [6, '已退款'],
+  [9, '已取消'],
+])
+
+// 获取状态文字
+function getStatusText(status?: number) {
+  return statusMap.get(status as number) || ''
+}
+
+// 计算倒计时剩余毫秒数(30分钟)
+function getCountdownTime(expireTime?: string): number {
+  if (!expireTime)
+    return 0
+  const expire = new Date(expireTime).getTime()
+  const remaining = expire - Date.now()
+  return remaining > 0 ? remaining : 0
+}
+
+// 取消订单
+async function handleCancelOrder(item: OmsOrderOilPageVO) {
+  useGlobalMessage().confirm({
+    title: '提示',
+    msg: '确定要取消该订单吗?',
+    success: async () => {
+      uni.showLoading({ mask: true })
+      try {
+        await Apis.general.post_smqjh_oms_api_v1_oil_order_cancel({ params: { orderId: item.orderNumber as string } })
+        useGlobalToast().show('取消成功')
+        // 刷新列表
+        data.value = []
+        page.value = 1
+        send()
+      }
+      catch {
+        useGlobalToast().show('取消失败')
+      }
+      finally {
+        uni.hideLoading()
+      }
+    },
+  })
+}
+
+// 付款(占位)
+function handlePay(_item: OmsOrderOilPageVO) {
+  useGlobalToast().show('功能开发中')
+}
+
+// 申请开票(占位)
+function handleInvoice(_item: OmsOrderOilPageVO) {
+  useGlobalToast().show('功能开发中')
+}
+
+onShow(() => {
+  data.value = []
+  page.value = 1
+  send()
+})
+
+onReachBottom(() => {
+  if (!isLastPage.value) {
+    page.value++
+  }
+})
+
+watch(() => currentTab.value, () => {
+  data.value = []
+  page.value = 1
+  send()
+})
 </script>
 
 <template>
-  <view class="">
-    view
+  <view class="min-h-100vh bg-#f5f5f5">
+    <!-- Tab 切换 -->
+    <view class="sticky top-0 z-10 flex items-center justify-around bg-white px24rpx">
+      <view
+        v-for="item in tabList"
+        :key="item.value"
+        class="mr40rpx py24rpx text-28rpx"
+        :class="[currentTab === item.value ? 'text-[var(--them-color)] font-semibold border-b-4rpx border-[var(--them-color)]' : 'text-#666']"
+        @click="handleTabChange(item.value)"
+      >
+        {{ item.label }}
+      </view>
+    </view>
+
+    <!-- 订单列表 -->
+    <view class="px24rpx pt20rpx">
+      <view
+        v-for="item in data"
+        :key="item.orderNumber"
+        class="mb20rpx rounded-16rpx bg-white px24rpx py28rpx"
+      >
+        <!-- 头部:油站名称 + 状态 -->
+        <view class="flex items-center justify-between">
+          <view class="text-30rpx font-semibold">
+            {{ item.brandName ? `${item.brandName}·` : '' }}{{ item.storeName }}
+          </view>
+          <!-- 待支付状态显示倒计时 -->
+          <view v-if="item.oilOrderStatus === 1" class="w300rpx flex items-center justify-end text-24rpx text-#1890ff">
+            待支付(<wd-count-down :time="getCountdownTime(item.expireTime)" format="还剩mm:ss" />)
+          </view>
+          <view v-else class="text-24rpx text-#666">
+            {{ getStatusText(item.oilOrderStatus) }}
+          </view>
+        </view>
+
+        <!-- 油号 | 油枪 -->
+        <view class="mt16rpx text-26rpx text-#999">
+          {{ item.itemName }} | {{ item.gunNo }}号枪
+        </view>
+
+        <!-- 订单金额 -->
+        <view class="mt12rpx text-26rpx text-#999">
+          订单金额:<text class="text-#333">
+            ¥{{ item.totalMoney }}
+          </text>
+        </view>
+
+        <!-- 根据状态显示不同金额 -->
+        <view v-if="item.oilOrderStatus === 1" class="mt12rpx text-26rpx text-#999">
+          需付金额:<text class="text-#333">
+            ¥{{ item.realMoney }}
+          </text>
+        </view>
+        <view v-else-if="item.oilOrderStatus === 2" class="mt12rpx text-26rpx text-#999">
+          实付金额:<text class="text-#333">
+            ¥{{ item.realMoney }}
+          </text>
+        </view>
+        <view v-else-if="item.oilOrderStatus === 6" class="mt12rpx text-26rpx text-#999">
+          退款金额:<text class="text-#333">
+            ¥{{ item.realMoney }}
+          </text>
+        </view>
+
+        <!-- 根据状态显示不同时间 -->
+        <view v-if="item.oilOrderStatus === 1" class="mt12rpx text-26rpx text-#999">
+          下单时间:{{ item.createTime }}
+        </view>
+        <view v-else-if="item.oilOrderStatus === 2" class="mt12rpx text-26rpx text-#999">
+          支付时间:{{ item.payTime }}
+        </view>
+        <view v-else-if="item.oilOrderStatus === 6" class="mt12rpx text-26rpx text-#999">
+          退款时间:{{ item.refundTime }}
+        </view>
+        <view v-else-if="item.oilOrderStatus === 9" class="mt12rpx text-26rpx text-#999">
+          取消时间:{{ item.cancelTime }}
+        </view>
+
+        <!-- 已支付显示合作方订单号 -->
+        <view v-if="item.oilOrderStatus === 2 && item.thirdOrderId" class="mt12rpx text-26rpx text-#999">
+          合作方订单号:{{ item.thirdOrderId }}
+        </view>
+
+        <!-- 操作按钮 -->
+        <view v-if="item.oilOrderStatus === 1" class="mt20rpx flex items-center justify-end gap-20rpx">
+          <wd-button plain size="small" custom-class="action-btn" @click="handleCancelOrder(item)">
+            取消订单
+          </wd-button>
+          <wd-button plain size="small" custom-class="action-btn" @click="handlePay(item)">
+            付款
+          </wd-button>
+        </view>
+        <view v-else-if="item.oilOrderStatus === 2" class="mt20rpx flex items-center justify-end">
+          <wd-button plain size="small" custom-class="action-btn" @click="handleInvoice(item)">
+            申请开票
+          </wd-button>
+        </view>
+      </view>
+
+      <!-- 空状态 -->
+      <view v-if="data && data.length === 0" class="flex flex-col items-center pt100rpx">
+        <StatusTip tip="暂无订单" />
+      </view>
+    </view>
   </view>
 </template>
 
-<style lang="scss" scoped></style>
+<style lang="scss" scoped>
+:deep(.action-btn) {
+  border-color: #333 !important;
+  color: #333 !important;
+  border-radius: 32rpx !important;
+}
+:deep(.wd-count-down){
+  color: #1890ff !important;
+}
+</style>

+ 1 - 1
src/pages/paySuccess/index.vue

@@ -67,7 +67,7 @@ function handleBackHome() {
           订单金额
         </view>
         <view class="text-32rpx text-#ff4d3a font-semibold">
-          ¥{{ orderInfo?.totalMoney ? (orderInfo.totalMoney / 100).toFixed(2) : '0.00' }}
+          ¥{{ orderInfo?.totalMoney }}
         </view>
       </view>
       <view class="mt20rpx flex items-center justify-between">

+ 4 - 3
src/pages/transition/index.vue

@@ -15,14 +15,15 @@ const loading = ref(true)
 onLoad((options: any) => {
   console.log(options, 'transition=========================================')
 
-  const payStatus = options.payStatus
+  const payStatus = Number(options.payStatus)
   const outerOrderId = options.outerOrderId || ''
+  useGlobalToast().show(options)
 
   // 延迟跳转,显示 loading 效果
   setTimeout(() => {
     loading.value = false
 
-    if (payStatus === '1') {
+    if (payStatus === 1) {
       // 支付成功,跳转支付成功页
       router.replace({
         name: 'paySuccess',
@@ -33,7 +34,7 @@ onLoad((options: any) => {
       // 支付失败或其他情况,跳转订单列表
       uni.switchTab({ url: '/pages/order/index' })
     }
-  }, 2000)
+  }, 3000)
 })
 </script>
 

+ 67 - 66
src/store/user.ts

@@ -31,73 +31,74 @@ export const useUserStore = defineStore('user', {
     getLocationH5() {
       return new Promise((resolve, reject) => {
         uni.showLoading({ mask: true, title: '获取位置中...' })
-        if (navigator.geolocation) {
-          // 调用定位接口(enableHighAccuracy:是否高精度定位)
-          navigator.geolocation.getCurrentPosition(
-            // 定位成功回调(返回经纬度)
-            (position) => {
-              this.lat = Number(position.coords.latitude.toFixed(6))
-              this.lng = Number(position.coords.longitude.toFixed(6))
-              resolve(true)
-              uni.hideLoading()
-            },
-            // 定位失败回调(处理用户拒绝、设备无GPS等情况)
-            (error) => {
-              reject(error.code)
-              uni.hideLoading()
-              switch (error.code) {
-                case error.PERMISSION_DENIED:
-                  console.log('用户拒绝了定位权限')
-                  // 提示用户开启定位:引导打开手机系统定位 + 微信定位权限
-                  useGlobalToast().show('请允许定位权限以获取当前位置')
-                  break
-                case error.POSITION_UNAVAILABLE:
-                  console.log('定位信息不可用')
-                  useGlobalToast().show('无法获取定位,请检查设备GPS是否开启')
-                  break
-                case error.TIMEOUT:
-                  console.log('定位请求超时')
+        // if (navigator.geolocation) {
+        //   // 调用定位接口(enableHighAccuracy:是否高精度定位)
+        //   navigator.geolocation.getCurrentPosition(
+        //     // 定位成功回调(返回经纬度)
+        //     (position) => {
+        //       this.lat = Number(position.coords.latitude.toFixed(6))
+        //       this.lng = Number(position.coords.longitude.toFixed(6))
+        //       resolve(true)
+        //       uni.hideLoading()
+        //     },
+        //     // 定位失败回调(处理用户拒绝、设备无GPS等情况)
+        //     (error) => {
+        //       reject(error.code)
+        //       uni.hideLoading()
+        //       switch (error.code) {
+        //         case error.PERMISSION_DENIED:
+        //           console.log('用户拒绝了定位权限')
+        //           // 提示用户开启定位:引导打开手机系统定位 + 微信定位权限
+        //           useGlobalToast().show('请允许定位权限以获取当前位置')
+        //           break
+        //         case error.POSITION_UNAVAILABLE:
+        //           console.log('定位信息不可用')
+        //           useGlobalToast().show('无法获取定位,请检查设备GPS是否开启')
+        //           break
+        //         case error.TIMEOUT:
+        //           console.log('定位请求超时')
 
-                  useGlobalToast().show('定位超时,请重试')
-                  break
-              }
-            },
-            // 可选配置项
-            {
-              enableHighAccuracy: true, // 开启高精度(GPS定位,耗时稍长),关闭则用网络定位(更快但精度低)
-              timeout: 10000, // 超时时间(10秒)
-              maximumAge: 300000, // 缓存时间(5分钟内重复定位可复用之前结果)
-            },
-          )
-        }
-        else {
-          uni.getLocation({
-            type: 'wgs84',
-            geocode: true,
-            success: (res) => {
-              uni.hideLoading()
-              console.log('H5位置获取成功', res)
-              this.lat = Number(res.latitude.toFixed(6))
-              this.lng = Number(res.longitude.toFixed(6))
-              resolve(true)
-            },
-            fail: (err) => {
-              uni.hideLoading()
-              reject(new Error('获取位置失败'))
-              console.log('H5获取位置失败', err)
-              const errMsg = err.errMsg || ''
-              if (errMsg.includes('auth deny') || errMsg.includes('authorize')) {
-                useGlobalToast().show('请授权位置权限')
-              }
-              else if (errMsg.includes('timeout')) {
-                useGlobalToast().show('获取位置超时,请重试')
-              }
-              else {
-                useGlobalToast().show(`获取定位失败:${errMsg}`)
-              }
-            },
-          })
-        }
+        //           useGlobalToast().show('定位超时,请重试')
+        //           break
+        //       }
+        //     },
+        //     // 可选配置项
+        //     {
+        //       enableHighAccuracy: true, // 开启高精度(GPS定位,耗时稍长),关闭则用网络定位(更快但精度低)
+        //       timeout: 10000, // 超时时间(10秒)
+        //       maximumAge: 300000, // 缓存时间(5分钟内重复定位可复用之前结果)
+        //     },
+        //   )
+        // }
+        // else {
+
+        // }
+        uni.getLocation({
+          type: 'wgs84',
+          geocode: true,
+          success: (res) => {
+            uni.hideLoading()
+            console.log('H5位置获取成功', res)
+            this.lat = Number(res.latitude.toFixed(6))
+            this.lng = Number(res.longitude.toFixed(6))
+            resolve(true)
+          },
+          fail: (err) => {
+            uni.hideLoading()
+            reject(new Error('获取位置失败'))
+            console.log('H5获取位置失败', err)
+            const errMsg = err.errMsg || ''
+            if (errMsg.includes('auth deny') || errMsg.includes('authorize')) {
+              useGlobalToast().show('请授权位置权限')
+            }
+            else if (errMsg.includes('timeout')) {
+              useGlobalToast().show('获取位置超时,请重试')
+            }
+            else {
+              useGlobalToast().show(`获取定位失败:${errMsg}`)
+            }
+          },
+        })
       })
     },