65 Revize c0cd45638e ... ede0a664db

Autor SHA1 Zpráva Datum
  zouzexu ede0a664db ``` před 1 měsícem
  zouzexu 6ed6b6269e ``` před 1 měsícem
  zouzexu 35fba20354 Merge remote-tracking branch 'origin/master' into zzx před 1 měsícem
  zouzexu bc5d2d373b Merge branch 'master' of http://git.zonelife.cn:3000/zhangtao/city-gather před 1 měsícem
  zouzexu 47af66e4d3 ``` před 1 měsícem
  zouzexu ef8f49edb0 ``` před 1 měsícem
  zhangtao 43423ff7b6 Merge branch 'zhangtao' před 1 měsícem
  zhangtao 5d0fddb9d6 fix(confirmOrder,welfare): 添加输入框聚焦功能 před 1 měsícem
  zouzexu 59cbb25639 Merge remote-tracking branch 'origin/master' into zzx před 1 měsícem
  zouzexu bd68bf083f ``` před 1 měsícem
  zhangtao 84286a1e9f Merge branch 'zhangtao' před 1 měsícem
  zhangtao aba5980dec fix(commonTab): 修复商品列表布局样式问题 před 1 měsícem
  zouzexu 01d02d1b18 Merge branch 'master' into zzx před 1 měsícem
  zouzexu 7e5fb2f336 ``` před 1 měsícem
  zhangtao 16612902c0 Merge branch 'zhangtao' před 1 měsícem
  zhangtao 34b059bf73 Merge branch 'master' of http://git.zonelife.cn:3000/zhangtao/city-gather před 1 měsícem
  zhangtao d1a1014b72 ``` před 1 měsícem
  zhangtao 176e669646 fix(index): 修复大健康tabbar显示逻辑 před 1 měsícem
  zhangtao fde5820c6e feat: 新增加油子包页面并更新页面配置 před 1 měsícem
  zouzexu 5b1df576cd Merge remote-tracking branch 'origin/master' into zzx před 1 měsícem
  zouzexu e86d1dea4c ``` před 1 měsícem
  zouzexu 6379ced388 ``` před 1 měsícem
  zhangtao caa3d8307e ``` před 1 měsícem
  zouzexu e634318f2a ``` před 1 měsícem
  zhangtao 9d7d1f7e1d feat(config): 更新开发环境API配置 před 1 měsícem
  zhangtao df1c0f1250 Merge remote-tracking branch 'origin/master' into zhangtao před 1 měsícem
  zhangtao 219c902aa4 feat(djk): 更新大健康模块订单详情和确认页面功能 před 1 měsícem
  zouzexu 42ce75772a ``` před 1 měsícem
  zouzexu e513935789 ``` před 1 měsícem
  zhangtao dd409ca700 Merge remote-tracking branch 'origin/master' into zhangtao před 1 měsícem
  zhangtao 21185a01f7 fix(common): 修复积分页面导航标签数据获取问题 před 1 měsícem
  zouzexu b40c0f8d59 ``` před 1 měsícem
  zhangtao c2ab0d2472 feat: 添加商品图片水印效果并优化开发环境配置 před 1 měsícem
  zhangtao 92e3c8ef92 feat(djk): 添加福利弹窗功能并集成wot-design组件 před 1 měsícem
  zhangtao 6b2578ac1b config(index): 更新测试环境API配置 před 1 měsícem
  zhangtao 69a5297b2c feat(order): 新增大健康分类并优化商品名称显示 před 1 měsícem
  zhangtao 7ed25da2b5 feat(api): 添加订单类型定义 před 1 měsícem
  zouzexu 498d91b4ed Merge branch 'master' into zzx před 1 měsícem
  zouzexu 897037ef0f ``` před 1 měsícem
  zouzexu cae1ce8bea ``` před 1 měsícem
  zhangtao 9f733f58a7 fix(config): 启用测试环境API配置并修复页面结构 před 1 měsícem
  zhangtao d87481f41a feat(commonTab): 添加订单列表刷新状态管理 před 1 měsícem
  zhangtao 9ec348ece0 feat(subPack-djk): 添加空状态提示组件 před 1 měsícem
  zhangtao 1a10a19f59 feat(djk): 添加退款功能 před 1 měsícem
  zhangtao 1996fa4b04 feat(djk): 新增大健康订单相关功能 před 1 měsícem
  zhangtao f68e8c23b0 Merge branch 'master' into zhangtao před 1 měsícem
  zhangtao 93117725fd fix(chargeOrderList): 修改充电订单页面登录验证配置 před 1 měsícem
  zhangtao ac7e75724b feat(components): Zpopup组件添加footer显示控制 před 1 měsícem
  zouzexu d951974894 ``` před 1 měsícem
  zhangtao 0600f4b94d refactor(order): 移除navActiveTab属性并优化条件判断 před 1 měsícem
  zhangtao 025bfbda82 Merge branch 'master' into zhangtao před 1 měsícem
  zhangtao 866dafc433 Merge remote-tracking branch 'origin/master' into zhangtao před 1 měsícem
  zouzexu d0529305f6 ``` před 1 měsícem
  zouzexu 714a57bf06 Merge branch 'zzx' před 1 měsícem
  zouzexu 777aa96414 ``` před 1 měsícem
  zhangtao 2115e3c0e3 feat(djk): 新增大健康福利活动功能 před 1 měsícem
  zouzexu e4f0220d7d ``` před 1 měsícem
  zouzexu 85fc5204f0 ``` před 1 měsícem
  zouzexu 850c85538a ``` před 1 měsícem
  zhangtao a7d9e25b98 feat(djk): 新增订单确认页面和相关API接口 před 1 měsícem
  zouzexu cdb44b5103 ``` před 1 měsícem
  zhangtao a2161a9d39 feat(djk): 新增大健康模块功能 před 1 měsícem
  zhangtao a459c40e91 Merge remote-tracking branch 'origin/master' into zhangtao před 1 měsícem
  zhangtao 2a372322cd feat(config): 启用试用环境API配置并注释正式环境地址 před 1 měsícem
  zhangtao 40b817373e feat(user-store): 添加通用支付和订单管理功能 před 1 měsícem
63 změnil soubory, kde provedl 3278 přidání a 1264 odebrání
  1. 12 0
      async-component.d.ts
  2. 342 0
      src/api/api.type.d.ts
  3. 18 0
      src/api/apiDefinitions.ts
  4. 212 0
      src/api/globals.d.ts
  5. 11 21
      src/auto-imports.d.ts
  6. 2 0
      src/components.d.ts
  7. 1 1
      src/components/Zpopup.vue
  8. 4 2
      src/config/index.ts
  9. 92 5
      src/pages.json
  10. 76 21
      src/pages/index/index.vue
  11. 6 0
      src/store/sys.ts
  12. 294 0
      src/store/user.ts
  13. 4 2
      src/subPack-charge/chargeOrderList/chargeOrderList.vue
  14. 1 1
      src/subPack-common/afterSales/index.vue
  15. 8 10
      src/subPack-common/integral/index.vue
  16. 1 1
      src/subPack-common/payError/index.vue
  17. 1 1
      src/subPack-common/paySuccess/index.vue
  18. 140 0
      src/subPack-djk/afterSales/index.vue
  19. 71 0
      src/subPack-djk/commonTab/components/fl.vue
  20. 79 0
      src/subPack-djk/commonTab/components/index.vue
  21. 59 0
      src/subPack-djk/commonTab/components/order.vue
  22. 109 0
      src/subPack-djk/commonTab/index.vue
  23. 204 0
      src/subPack-djk/confirmOrder/index.vue
  24. 168 0
      src/subPack-djk/goodsinfo/index.vue
  25. 326 0
      src/subPack-djk/orderDetaile/index.vue
  26. 140 0
      src/subPack-djk/shopinfo/index.vue
  27. 168 0
      src/subPack-djk/welfare/index.vue
  28. 2 3
      src/subPack-film/order-detail/index.vue
  29. 5 110
      src/subPack-film/order/index.vue
  30. 5 5
      src/subPack-film/select-time/index.vue
  31. 2 4
      src/subPack-film/submit-order/index.vue
  32. 0 153
      src/subPack-film/utils/confirm-order.ts
  33. 0 156
      src/subPack-film/utils/order-data.ts
  34. 29 0
      src/subPack-refueling/commonTab/index.vue
  35. 18 0
      src/subPack-refueling/webView/index.vue
  36. 30 32
      src/subPack-smqjh/components/charge-orderList/charge-orderList.vue
  37. 146 0
      src/subPack-smqjh/components/djk-order/index.vue
  38. 26 44
      src/subPack-smqjh/components/film-orderList/film-orderList.vue
  39. 61 0
      src/subPack-smqjh/components/videoRights-orderList/videoRights-orderList.vue
  40. 43 50
      src/subPack-smqjh/components/xsb-orderList/xsb-orderList.vue
  41. 20 48
      src/subPack-smqjh/order/components/OrderRenderer.vue
  42. 60 65
      src/subPack-smqjh/order/index.vue
  43. 2 19
      src/subPack-smqjh/order/order-data.ts
  44. 26 8
      src/subPack-videoRights/commonTab/components/home.vue
  45. 1 0
      src/subPack-videoRights/commonTab/components/order.vue
  46. 2 2
      src/subPack-videoRights/commonTab/index.vue
  47. 1 1
      src/subPack-videoRights/videoRightsDetail/videoRightsDetail.vue
  48. 1 1
      src/subPack-videoRights/videoRightsOrderInfo/videoRightsOrderInfo.vue
  49. 33 3
      src/subPack-videoRights/videoRightsSubmitOrder/videoRightsSubmitOrder.vue
  50. 11 5
      src/subPack-xsb/commonTab/components/cart.vue
  51. 13 5
      src/subPack-xsb/commonTab/components/classfiy.vue
  52. 19 7
      src/subPack-xsb/commonTab/components/index.vue
  53. 22 0
      src/subPack-xsb/commonTab/index.vue
  54. 4 0
      src/subPack-xsb/components/goodsItem/index.vue
  55. 12 9
      src/subPack-xsb/confirmOrder/index.vue
  56. 17 132
      src/subPack-xsb/order/index.vue
  57. 8 10
      src/subPack-xsb/orderDetaile/index.vue
  58. 12 5
      src/subPack-xsb/search/index.vue
  59. 0 155
      src/subPack-xsb/utils/confirm-order.ts
  60. 0 156
      src/subPack-xsb/utils/order-data.ts
  61. 10 1
      src/uni-pages.d.ts
  62. 82 0
      src/utils/index.ts
  63. 6 10
      vite.config.ts

+ 12 - 0
async-component.d.ts

@@ -22,3 +22,15 @@ declare module '@/subPack-smqjh/components/charge-orderList/charge-orderList.vue
   const component: typeof import('@/subPack-smqjh/components/charge-orderList/charge-orderList.vue')
   export = component
 }
+declare module '@/subPack-smqjh/components/film-orderList/film-orderList.vue?async' {
+  const component: typeof import('@/subPack-smqjh/components/film-orderList/film-orderList.vue')
+  export = component
+}
+declare module '@/subPack-smqjh/components/xsb-orderList/xsb-orderList.vue?async' {
+  const component: typeof import('@/subPack-smqjh/components/xsb-orderList/xsb-orderList.vue')
+  export = component
+}
+declare module '@/subPack-smqjh/components/djk-order/index.vue?async' {
+  const component: typeof import('@/subPack-smqjh/components/djk-order/index.vue')
+  export = component
+}

+ 342 - 0
src/api/api.type.d.ts

@@ -53,6 +53,26 @@ namespace Api {
     [property: string]: any
   }
 
+  interface MemberPointsClaimVO {
+    /**
+     * 所属顶级企业ID
+     */
+    channelId?: number
+    /**
+     * 所属顶级企业名称
+     */
+    channelName?: string
+    /**
+     * 是否领取(true:已领取,false:未领取)
+     */
+    isClaimed?: boolean
+    /**
+     * 可领取积分
+     */
+    points?: number
+    [property: string]: any
+  }
+
   interface xsbCategoriesChildren {
     id: number
     name: string
@@ -716,6 +736,107 @@ namespace Api {
      * 充电订单
      */
     chargeOrder?: ChargeOrderInfo
+    /**
+     *
+     */
+    djkOrderAttachInfo?: OmsDjkOrderAttach
+  }
+  interface OmsDjkOrderAttach {
+    /**
+     * 活动名称
+     */
+    activityName?: string
+    createTime?: string
+    /**
+     * 客户授权
+     */
+    customerAuthorization?: number
+    /**
+     * 大健康订单类型 0-正常订单 1-福利订单
+     */
+    djkOrderType?: number
+    /**
+     * 过期时间
+     */
+    expiredTime?: string
+    /**
+     * 商品编码
+     */
+    goodsCode?: string
+    /**
+     * 商品id
+     */
+    goodsId?: number
+    /**
+     * 商品图
+     */
+    goodsImg?: string
+    /**
+     * 商品名
+     */
+    goodsName?: string
+    /**
+     * 商品数量
+     */
+    goodsNum?: number
+    /**
+     * 订单号
+     */
+    orderNumber?: string
+    /**
+     * 价格
+     */
+    price?: number
+    /**
+     * 退款描述
+     */
+    refundDesc?: string
+    /**
+     * 退款图片
+     */
+    refundImg?: string
+    /**
+     * 退款单号
+     */
+    refundNo?: string
+    /**
+     * 退款原因
+     */
+    refundReason?: string
+    /**
+     * 退款到账时间
+     */
+    refundTime?: string
+    /**
+     * 订单备注
+     */
+    remark?: string
+    /**
+     * 提交退款时间
+     */
+    submitRefundTime?: string
+    updateTime?: string
+    /**
+     * 核销人
+     */
+    verificationPerson?: string
+    /**
+     * 核销门店
+     */
+    verificationShop?: string
+    /**
+     * 核销时间
+     */
+    verificationTime?: string
+    /**
+     * 需提前预约天数
+     */
+    advanceBookingTime?: number
+    /**
+     * 有效时间
+     */
+    effectiveTime?: number
+    [property: string]: any
   }
   interface ChargeOrderInfo {
     /**
@@ -2451,4 +2572,225 @@ namespace Api {
     sellPrice?: number
     [property: string]: any
   }
+  interface DJKShopVO {
+    /**
+     * 营业时间
+     */
+    businessTime?: string
+    /**
+     * 商品
+     */
+    goodsList?: DJKGoodsVO[]
+    /**
+     * 销量
+     */
+    sales?: number
+    /**
+     * 门店地址
+     */
+    shopAddress?: string
+    /**
+     * shopId
+     */
+    shopId?: number
+    /**
+     * 纬度
+     */
+    shopLat?: number
+    /**
+     * 经度
+     */
+    shopLng?: number
+    /**
+     * 门店图片
+     */
+    shopLogo?: string
+    /**
+     * 门店名
+     */
+    shopName?: string
+    /**
+     * 电话
+     */
+    tel?: string
+    [property: string]: any
+  }
+  interface DJKGoodsVO {
+    /**
+     * 商品图
+     */
+    goodsImg?: string
+    /**
+     * 商品名
+     */
+    goodsName?: string
+    /**
+     * 商品id
+     */
+    id?: number
+    /**
+     * 门店地址
+     */
+    price?: string
+    /**
+     * 销量
+     */
+    sales?: number
+    [property: string]: any
+  }
+  interface PmsDjkGoods {
+    /**
+     * 提前预约时间(天)
+     */
+    advanceBookingTime?: number
+    /**
+     * 购买人群
+     */
+    buyNotice?: string
+    /**
+     * 图文说明
+     */
+    content?: string
+    createTime?: string
+    /**
+     * 有效时间(天)
+     */
+    effectiveTime?: number
+    /**
+     * 商品编码
+     */
+    goodsCode?: string
+    /**
+     * 封面
+     */
+    goodsImg?: string
+    /**
+     * 商品名
+     */
+    goodsName?: string
+    /**
+     * 价格
+     */
+    price?: number
+    /**
+     * 销量
+     */
+    sales?: number
+    /**
+     * 上下架
+     */
+    shelfStatus?: number
+    /**
+     * 门店id
+     */
+    shopId?: number
+    /**
+     * shopName
+     */
+    shopName?: string
+    /**
+     * tel
+     */
+    tel?: string
+    updateTime?: string
+    /**
+     * 消费流程
+     */
+    usageProcess?: string
+    /**
+     * 可用结束时间
+     */
+    useEndTime?: string
+    /**
+     * 可用开始时间
+     */
+    useStartTime?: string
+    [property: string]: any
+  }
+  interface DjkWelfareVO {
+    /**
+     * 活动结束时间
+     * 活动结束时间,选择日期的23点59分59秒
+     */
+    activityEndTime?: string
+    /**
+     * 活动封面
+     */
+    activityImg?: string
+    /**
+     * 活动名称
+     */
+    activityName?: string
+    /**
+     * 活动开始时间
+     * 活动开始时间,选择日期的0点0分0秒
+     */
+    activityStartTime?: string
+    /**
+     * 活动状态 0-全部 1-未开始 2-进行中 3-已结束
+     */
+    activityStatus?: number
+    /**
+     * 活动类型
+     * 活动类型 1:新用户专享 2:节日活动 3:用户召回 4:会员活动 5:其他
+     */
+    activityType?: number
+    /**
+     * 参与用户
+     * 参与用户 1:全部用户 2:仅限新用户 3:特定用户标签 4:指定用户
+     */
+    activityUser?: number
+    /**
+     * 领取限制
+     * 领取限制 0:不限制 1:限制
+     */
+    claimLimit?: number
+    /**
+     * 限领数量
+     */
+    claimNum?: number
+    /**
+     * 活动ID
+     */
+    id?: number
+    /**
+     * 库存
+     */
+    inventory?: number
+    /**
+     * 商品A
+     * 商品A ID
+     */
+    productA?: number
+    /**
+     * 商品A
+     * 商品A 名称
+     */
+    productAName?: string
+    /**
+     * 商品B
+     * 商品B ID
+     */
+    productB?: number
+    /**
+     * 商品B
+     * 商品B 名称
+     */
+    productBName?: string
+    /**
+     * 领取数量
+     */
+    quantityClaimed?: number
+    /**
+     * 上下架
+     * 上下架 0:上架 1:下架
+     */
+    shelfStatus?: number
+    /**
+     * 活动商品
+     */
+    welfareGoodList?: PmsDjkGoods[]
+    [property: string]: any
+  }
+
 }

+ 18 - 0
src/api/apiDefinitions.ts

@@ -34,6 +34,9 @@ export default {
   'sys.addressesDetail': ['GET', '/smqjh-system/app-api/v1/addresses/{addressId}'],
   'sys.uploadFile': ['POST', '/smqjh-system/api/v1/files'],
   'sys.updateUserInfo': ['PUT', '/smqjh-system/app-api/v1/members/{memberId}'],
+  'sys.selectZhUser': ['GET', '/smqjh-system/app-api/v1/claim/select'],
+  'sys.zhUserReceived': ['POST', '/smqjh-system/app-api/v1/claim/received'],
+
   'xsb.categories':['GET', '/smqjh-pms/app-api/v1/categories'],
   'xsb.getCategoryProductList':['POST', '/smqjh-pms/app-api/v1/spu/getCategoryProductList'],
   'xsb.getProductDetail':['GET', '/smqjh-pms/app-api/v1/spu/getProductDetails'],
@@ -61,6 +64,7 @@ export default {
   'xsb.refundList':['POST', '/smqjh-oms/app-api/v1/refund/findList'],
   'xsb.refundCancel':['GET', '/smqjh-oms/app-api/v1/refund/cancel'],
   'xsb.refundDetails':['GET', '/smqjh-oms/app-api/v1/refund/findByDetails'],
+  'xsb.popupConfig':['GET', '/smqjh-system/app-api/v1/appAdvertInfo/popupConfig'],
 
   'common.myShoppingCart':['GET', '/smqjh-oms/app-api/v1/shoppingCart/myShoppingCart'],
   'common.addShoppingCart':['POST', '/smqjh-oms/app-api/v1/shoppingCart/addShoppingCart'],
@@ -102,4 +106,18 @@ export default {
   'videoRight.orderCreate':['POST', '/smqjh-oms/app-api/v1/order/virtual'],
   'videoRight.orderDetail':['GET', '/smqjh-oms/app-api/v1/order/virtual/detail'],
   'videoRight.orderList':['GET', '/smqjh-oms/app-api/v1/order/virtual/list'],
+
+  'djk.appletGoodsList':['GET', '/smqjh-pms/app-api/v1/goods/appletGoodsList'],
+  'djk.appletShopInfo':['GET', '/smqjh-pms/app-api/v1/goods/appletShopInfo'],
+  'djk.goodsInfo':['GET', '/smqjh-pms/app-api/v1/goods/goodsInfo'],
+  'djk.djkAppletOrderConfirm':['GET', '/smqjh-oms/api/v1/djkOrder/djkAppletOrderConfirm'],
+  'djk.addDJKOrder':['POST', '/smqjh-oms/api/v1/djkOrder/addDJKOrder'],
+  'djk.welfareList':['GET', '/smqjh-pms/app-api/v1/welfare/list'],
+  'djk.welfareInfo':['GET', '/smqjh-pms/app-api/v1/welfare/detail'],
+  'djk.welfareClaimInfo':['POST', '/smqjh-pms/app-api/v1/welfareClaimInfo/claim'],
+  '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'],
+
 };

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

@@ -181,6 +181,19 @@ declare global {
       >(
         config: Config
       ): Alova2Method<apiResData<Api.addressList>, 'sys.addressesDetail', Config>;
+
+      selectZhUser<
+        Config extends Alova2MethodConfig<apiResData<Api.MemberPointsClaimVO>> & {}
+      >(
+        config: Config
+      ): Alova2Method<apiResData<Api.MemberPointsClaimVO>, 'sys.selectZhUser', Config>;
+
+      zhUserReceived<
+        Config extends Alova2MethodConfig<apiResData<any>> & {}
+      >(
+        config: Config
+      ): Alova2Method<apiResData<any>, 'sys.zhUserReceived', Config>;
+
       dictPage<
         Config extends Alova2MethodConfig<listData<Api.sysDict>> & {
           data: {
@@ -192,6 +205,12 @@ declare global {
       ): Alova2Method<listData<Api.sysDict>, 'sys.dictPage', Config>;
     }
     xsb: {
+      popupConfig<
+        Config extends Alova2MethodConfig<apiResData<any>> & { }
+      >(
+        config: Config
+      ): Alova2Method<apiResData<any>, 'xsb.popupConfig', Config>;
+
       refundDetails<
         Config extends Alova2MethodConfig<apiResData<Api.OrderRefundDetails>> & {
           data: {
@@ -911,6 +930,7 @@ declare global {
           data: {
             pageNum?: number;
             pageSize?: number;
+            productName?: string;
           }
         }
       >(
@@ -967,6 +987,198 @@ declare global {
         config: Config
       ): Alova2Method<apiResData<DataVirtualOrderListVo>, 'videoRight.orderList', Config>;
     }
+    djk: {
+      appletGoodsList<
+        Config extends Alova2MethodConfig<listData<Api.DJKShopVO>> & {
+          data: {
+            pageNum?: number;
+            pageSize?: number;
+          }
+        }
+      >(
+        config: Config
+      ): Alova2Method<listData<Api.DJKShopVO>, 'djk.appletGoodsList', Config>;
+      appletShopInfo<
+        Config extends Alova2MethodConfig<apiResData<Api.DJKShopVO>> & {
+          data: {
+            shopId: number
+          }
+        }
+      >(
+        config: Config
+      ): Alova2Method<apiResData<Api.DJKShopVO>, 'djk.appletShopInfo', Config>;
+      goodsInfo<
+        Config extends Alova2MethodConfig<apiResData<Api.PmsDjkGoods>> & {
+          data: {
+            goodsId: number
+          }
+        }
+      >(
+        config: Config
+      ): Alova2Method<apiResData<Api.PmsDjkGoods>, 'djk.goodsInfo', Config>;
+      djkAppletOrderConfirm<
+        Config extends Alova2MethodConfig<apiResData<{ price: number, points: number }>> & {
+          data: {
+            goodsId: number
+            channelId: number
+          }
+        }
+      >(
+        config: Config
+      ): Alova2Method<apiResData<{ price: number, points: number }>, 'djk.djkAppletOrderConfirm', Config>;
+      addDJKOrder<
+        Config extends Alova2MethodConfig<apiResData<string>> & {
+          data: {
+            channelId?: number;
+            /**
+             * 客户授权
+             */
+            customerAuthorization?: number;
+            /**
+             * 商品id
+             */
+            goodsId?: number;
+            /**
+             * 商品数量
+             */
+            goodsNum?: number;
+            /**
+             * phone
+             */
+            phone?: string;
+            /**
+             * 买家备注
+             */
+            remarks?: string;
+            /**
+             * 店铺id
+             */
+            shopId?: number;
+          }
+        }
+      >(
+        config: Config
+      ): Alova2Method<apiResData<string>, 'djk.djkAppletOrderConfirm', Config>;
+      welfareList<
+        Config extends Alova2MethodConfig<apiResData<Api.DjkWelfareVO[]>> & {
+
+        }
+      >(
+        config: Config
+      ): Alova2Method<apiResData<Api.DjkWelfareVO[]>, 'djk.welfareList', Config>;
+      welfareInfo<
+        Config extends Alova2MethodConfig<apiResData<Api.DjkWelfareVO>> & {
+          data: {
+            id: number
+          }
+        }
+      >(
+        config: Config
+      ): Alova2Method<apiResData<Api.DjkWelfareVO>, 'djk.welfareList', Config>;
+      welfareClaimInfo<
+        Config extends Alova2MethodConfig<apiResData<any>> & {
+          data: {
+            /**
+     * 领取时间
+     */
+            claimTime?: string;
+            createTime?: string;
+            /**
+             * 领取商品ID
+             */
+            goodsId?: number;
+            /**
+             * 用户ID
+             */
+            memberId?: number;
+            updateTime?: string;
+            /**
+             * 福利活动ID
+             */
+            welfareId?: number;
+          }
+        }
+      >(
+        config: Config
+      ): Alova2Method<apiResData<any>, 'djk.welfareClaimInfo', Config>;
+      welfareClaimInfoDetaile<
+        Config extends Alova2MethodConfig<apiResData<any>> & {
+          pathParams: { memberId: number };
+        }
+      >(
+        config: Config
+      ): Alova2Method<apiResData<any>, 'djk.welfareClaimInfoDetaile', Config>;
+      welfareClaimInfoPopup<
+        Config extends Alova2MethodConfig<apiResData<Api.DjkWelfareVO>> & {
+          pathParams: { memberId: number };
+        }
+      >(
+        config: Config
+      ): Alova2Method<apiResData<Api.DjkWelfareVO>, 'djk.welfareClaimInfoPopup', Config>;
+      addWelfareOrder<
+        Config extends Alova2MethodConfig<apiResData<any>> & {
+          data: {/**
+     * 企业ID
+     */
+            channelId?: number;
+            /**
+             * 客户授权
+             */
+            customerAuthorization?: number;
+            /**
+             * 商品id
+             */
+            goodsId?: number;
+            /**
+             * 商品数量
+             */
+            goodsNum?: number;
+            /**
+             * phone
+             */
+            phone?: string;
+            /**
+             * 买家备注
+             */
+            remarks?: string;
+            /**
+             * 店铺id
+             */
+            shopId?: number;
+            /**
+             * 福利活动Id
+             */
+            welfareId?: number;
+          };
+        }
+      >(
+        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>;
+    }
   }
 }
 var Apis: Apis;

+ 11 - 21
src/auto-imports.d.ts

@@ -9,13 +9,15 @@ declare global {
   const Apis: typeof import('./api/index')['Apis']
   const CommonUtil: typeof import('wot-design-uni')['CommonUtil']
   const EffectScope: typeof import('vue')['EffectScope']
-  const OrderStatus: typeof import('./subPack-xsb/utils/order-data')['OrderStatus']
+  const InputFormatUtil: typeof import('./utils/index')['InputFormatUtil']
+  const OrderStatus: typeof import('./utils/index')['OrderStatus']
   const acceptHMRUpdate: typeof import('pinia')['acceptHMRUpdate']
   const alovaInstance: typeof import('./api/index')['alovaInstance']
   const api: typeof import('./api/index')['default']
   const apiDefinitions: typeof import('./api/apiDefinitions')['default']
   const asyncComputed: typeof import('@vueuse/core')['asyncComputed']
   const autoResetRef: typeof import('@vueuse/core')['autoResetRef']
+  const boolToNumber: typeof import('./utils/index')['boolToNumber']
   const calculateCenterPointSpherical: typeof import('./utils/index')['calculateCenterPointSpherical']
   const computed: typeof import('vue')['computed']
   const computedAsync: typeof import('@vueuse/core')['computedAsync']
@@ -49,13 +51,7 @@ declare global {
   const getCurrentInstance: typeof import('vue')['getCurrentInstance']
   const getCurrentPath: typeof import('./utils/index')['getCurrentPath']
   const getCurrentScope: typeof import('vue')['getCurrentScope']
-  const getOrderPayMent: typeof import('./subPack-xsb/utils/confirm-order')['getOrderPayMent']
-  const getWxCommonPayment: typeof import('./subPack-xsb/utils/confirm-order')['getWxCommonPayment']
   const h: typeof import('vue')['h']
-  const handleCommonCancelOrder: typeof import('./subPack-xsb/utils/order-data')['handleCommonCancelOrder']
-  const handleCommonDeleteOrder: typeof import('./subPack-xsb/utils/order-data')['handleCommonDeleteOrder']
-  const handleCommonOrderStatusText: typeof import('./subPack-xsb/utils/order-data')['handleCommonOrderStatusText']
-  const handleCommonPayMent: typeof import('./subPack-xsb/utils/confirm-order')['handleCommonPayMent']
   const ignorableWatch: typeof import('@vueuse/core')['ignorableWatch']
   const inject: typeof import('vue')['inject']
   const injectLocal: typeof import('@vueuse/core')['injectLocal']
@@ -73,8 +69,6 @@ declare global {
   const mapWritableState: typeof import('pinia')['mapWritableState']
   const markRaw: typeof import('vue')['markRaw']
   const mountApis: typeof import('./api/createApis')['mountApis']
-  const navCommonMiniProgram: typeof import('./utils/index')['navCommonMiniProgram']
-  const navTabTypeList: typeof import('./subPack-xsb/utils/order-data')['navTabTypeList']
   const nextTick: typeof import('vue')['nextTick']
   const onActivated: typeof import('vue')['onActivated']
   const onAddToFavorites: typeof import('@dcloudio/uni-app')['onAddToFavorites']
@@ -117,12 +111,9 @@ declare global {
   const onUnload: typeof import('@dcloudio/uni-app')['onUnload']
   const onUnmounted: typeof import('vue')['onUnmounted']
   const onUpdated: typeof import('vue')['onUpdated']
-  const onWatcherCleanup: typeof import('vue')['onWatcherCleanup']
-  const orderStatusList: typeof import('./subPack-xsb/utils/order-data')['orderStatusList']
   const pausableWatch: typeof import('@vueuse/core')['pausableWatch']
-  const payError: typeof import('./subPack-xsb/utils/confirm-order')['payError']
-  const paySuccess: typeof import('./subPack-xsb/utils/confirm-order')['paySuccess']
   const persistPlugin: typeof import('./store/persist')['persistPlugin']
+  const phoneFormat: typeof import('./utils/index')['phoneFormat']
   const provide: typeof import('vue')['provide']
   const provideLocal: typeof import('@vueuse/core')['provideLocal']
   const reactify: typeof import('@vueuse/core')['reactify']
@@ -196,7 +187,6 @@ declare global {
   const useClipboardItems: typeof import('@vueuse/core')['useClipboardItems']
   const useCloned: typeof import('@vueuse/core')['useCloned']
   const useColorMode: typeof import('@vueuse/core')['useColorMode']
-  const useConcurrentRequests: typeof import('./composables/useConcurrentRequests')['useConcurrentRequests']
   const useConfirmDialog: typeof import('@vueuse/core')['useConfirmDialog']
   const useCounter: typeof import('@vueuse/core')['useCounter']
   const useCssModule: typeof import('vue')['useCssModule']
@@ -239,7 +229,6 @@ declare global {
   const useGlobalLoading: typeof import('./composables/useGlobalLoading')['useGlobalLoading']
   const useGlobalMessage: typeof import('./composables/useGlobalMessage')['useGlobalMessage']
   const useGlobalToast: typeof import('./composables/useGlobalToast')['useGlobalToast']
-  const useId: typeof import('vue')['useId']
   const useIdle: typeof import('@vueuse/core')['useIdle']
   const useImage: typeof import('@vueuse/core')['useImage']
   const useInfiniteScroll: typeof import('@vueuse/core')['useInfiniteScroll']
@@ -258,7 +247,6 @@ declare global {
   const useMemoize: typeof import('@vueuse/core')['useMemoize']
   const useMemory: typeof import('@vueuse/core')['useMemory']
   const useMessage: typeof import('wot-design-uni')['useMessage']
-  const useModel: typeof import('vue')['useModel']
   const useMounted: typeof import('@vueuse/core')['useMounted']
   const useMouse: typeof import('@vueuse/core')['useMouse']
   const useMouseInElement: typeof import('@vueuse/core')['useMouseInElement']
@@ -313,7 +301,6 @@ declare global {
   const useSysStore: typeof import('./store/sys')['useSysStore']
   const useSysXsbStore: typeof import('./subPack-xsb/store-xsb/sys')['useSysXsbStore']
   const useTabbar: typeof import('./composables/useTabbar')['useTabbar']
-  const useTemplateRef: typeof import('vue')['useTemplateRef']
   const useTemplateRefsList: typeof import('@vueuse/core')['useTemplateRefsList']
   const useTextDirection: typeof import('@vueuse/core')['useTextDirection']
   const useTextSelection: typeof import('@vueuse/core')['useTextSelection']
@@ -350,10 +337,6 @@ declare global {
   const useWindowFocus: typeof import('@vueuse/core')['useWindowFocus']
   const useWindowScroll: typeof import('@vueuse/core')['useWindowScroll']
   const useWindowSize: typeof import('@vueuse/core')['useWindowSize']
-  const useXsbCartStore: typeof import('./store/cart')['useXsbCartStore']
-  const useXsbTabbar: typeof import('./composables/useXsbTabbar')['useXsbTabbar']
-  const useXsbTabbarStore: typeof import('./subPack-xsb/store-xsb/tabbar')['useXsbTabbarStore']
-  const useconfirmOrderStore: typeof import('./store/confirmOrder')['useconfirmOrderStore']
   const watch: typeof import('vue')['watch']
   const watchArray: typeof import('@vueuse/core')['watchArray']
   const watchAtMost: typeof import('@vueuse/core')['watchAtMost']
@@ -377,6 +360,9 @@ declare global {
   // @ts-ignore
   export type { Component, ComponentPublicInstance, ComputedRef, ExtractDefaultPropTypes, ExtractPropTypes, ExtractPublicPropTypes, InjectionKey, PropType, Ref, VNode, WritableComputedRef } from 'vue'
   import('vue')
+  // @ts-ignore
+  export type { OrderStatus } from './utils/index'
+  import('./utils/index')
 }
 // for vue template auto import
 import { UnwrapRef } from 'vue'
@@ -387,12 +373,15 @@ declare module 'vue' {
     readonly Apis: UnwrapRef<typeof import('./api/index')['Apis']>
     readonly CommonUtil: UnwrapRef<typeof import('wot-design-uni')['CommonUtil']>
     readonly EffectScope: UnwrapRef<typeof import('vue')['EffectScope']>
+    readonly InputFormatUtil: UnwrapRef<typeof import('./utils/index')['InputFormatUtil']>
+    readonly OrderStatus: UnwrapRef<typeof import('./utils/index')['OrderStatus']>
     readonly acceptHMRUpdate: UnwrapRef<typeof import('pinia')['acceptHMRUpdate']>
     readonly alovaInstance: UnwrapRef<typeof import('./api/index')['alovaInstance']>
     readonly api: UnwrapRef<typeof import('./api/index')['default']>
     readonly apiDefinitions: UnwrapRef<typeof import('./api/apiDefinitions')['default']>
     readonly asyncComputed: UnwrapRef<typeof import('@vueuse/core')['asyncComputed']>
     readonly autoResetRef: UnwrapRef<typeof import('@vueuse/core')['autoResetRef']>
+    readonly boolToNumber: UnwrapRef<typeof import('./utils/index')['boolToNumber']>
     readonly calculateCenterPointSpherical: UnwrapRef<typeof import('./utils/index')['calculateCenterPointSpherical']>
     readonly computed: UnwrapRef<typeof import('vue')['computed']>
     readonly computedAsync: UnwrapRef<typeof import('@vueuse/core')['computedAsync']>
@@ -488,6 +477,7 @@ declare module 'vue' {
     readonly onUpdated: UnwrapRef<typeof import('vue')['onUpdated']>
     readonly pausableWatch: UnwrapRef<typeof import('@vueuse/core')['pausableWatch']>
     readonly persistPlugin: UnwrapRef<typeof import('./store/persist')['persistPlugin']>
+    readonly phoneFormat: UnwrapRef<typeof import('./utils/index')['phoneFormat']>
     readonly provide: UnwrapRef<typeof import('vue')['provide']>
     readonly provideLocal: UnwrapRef<typeof import('@vueuse/core')['provideLocal']>
     readonly reactify: UnwrapRef<typeof import('@vueuse/core')['reactify']>

+ 2 - 0
src/components.d.ts

@@ -25,6 +25,7 @@ declare module 'vue' {
     WdCircle: typeof import('wot-design-uni/components/wd-circle/wd-circle.vue')['default']
     WdConfigProvider: typeof import('wot-design-uni/components/wd-config-provider/wd-config-provider.vue')['default']
     WdCountDown: typeof import('wot-design-uni/components/wd-count-down/wd-count-down.vue')['default']
+    WdCurtain: typeof import('wot-design-uni/components/wd-curtain/wd-curtain.vue')['default']
     WdDivider: typeof import('wot-design-uni/components/wd-divider/wd-divider.vue')['default']
     WdIcon: typeof import('wot-design-uni/components/wd-icon/wd-icon.vue')['default']
     WdInput: typeof import('wot-design-uni/components/wd-input/wd-input.vue')['default']
@@ -40,6 +41,7 @@ declare module 'vue' {
     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']
     WdRate: typeof import('wot-design-uni/components/wd-rate/wd-rate.vue')['default']
+    WdSearch: typeof import('wot-design-uni/components/wd-search/wd-search.vue')['default']
     WdSkeleton: typeof import('wot-design-uni/components/wd-skeleton/wd-skeleton.vue')['default']
     WdSortButton: typeof import('wot-design-uni/components/wd-sort-button/wd-sort-button.vue')['default']
     WdStatusTip: typeof import('wot-design-uni/components/wd-status-tip/wd-status-tip.vue')['default']

+ 1 - 1
src/components/Zpopup.vue

@@ -15,7 +15,7 @@ const show = defineModel({ default: false })
   <wd-popup v-model="show" lock-scroll custom-style="border-radius:32rpx;32rpx 0rpx 0rpx" :z-index="zindex" position="bottom">
     <view :style="{ background: bg }">
       <slot />
-      <view class="h150rpx" />
+      <view v-if="showfooter" class="h150rpx" />
       <view v-if="showfooter" class="ios footer fixed bottom-0 left-0 box-border w-full rounded-t-32rpx bg-white px24rpx pt20rpx">
         <slot name="footer" />
       </view>

+ 4 - 2
src/config/index.ts

@@ -8,18 +8,20 @@ const mapEnvVersion = {
   // develop: 'http://192.168.1.253:8080',
   // develop: 'http://192.168.0.19:8080',
   // develop: 'http://192.168.0.217:8080', // 黄
+  // develop: 'http://192.168.0.11:8080', // 王
   // develop: 'http://192.168.1.89:8080', // 田
   // develop: 'http://74949mkfh190.vicp.fun', // 付
   // develop: 'http://47.109.84.152:8081',
+  // develop: 'https://5ed0f7cc.r9.vip.cpolar.cn',
   develop: 'https://smqjh.api.zswlgz.com',
   /**
    * 体验版
    */
   // trial: "http://192.168.1.166:8080/jeecg-boot",
   // trial: 'http://192.168.0.157:8080',
-  // trial: 'http://47.109.84.152:8081',
+  trial: 'http://47.109.84.152:8081',
   // trial: 'http://192.168.1.166:8080',
-  trial: 'https://smqjh.api.zswlgz.com',
+  // trial: 'https://smqjh.api.zswlgz.com',
   /**
    * 正式版
    */

+ 92 - 5
src/pages.json

@@ -428,7 +428,7 @@
         {
           "path": "chargeOrderList/chargeOrderList",
           "name": "charge-order-list",
-          "islogin": false,
+          "islogin": true,
           "style": {
             "navigationBarTitleText": "充电订单",
             "navigationStyle": "custom"
@@ -479,7 +479,7 @@
         {
           "path": "commonTab/index",
           "name": "video-rights-tabbar",
-          "islogin": false,
+          "islogin": true,
           "style": {
             "navigationBarTitleText": "",
             "navigationStyle": "custom"
@@ -488,7 +488,7 @@
         {
           "path": "videoRightsDetail/videoRightsDetail",
           "name": "video-rights-detail",
-          "islogin": false,
+          "islogin": true,
           "style": {
             "navigationBarTitleText": "详情"
           }
@@ -496,7 +496,7 @@
         {
           "path": "videoRightsOrderInfo/videoRightsOrderInfo",
           "name": "video-rights-order-info",
-          "islogin": false,
+          "islogin": true,
           "style": {
             "navigationBarTitleText": "订单确认"
           }
@@ -504,12 +504,99 @@
         {
           "path": "videoRightsSubmitOrder/videoRightsSubmitOrder",
           "name": "video-rights-submit-order",
-          "islogin": false,
+          "islogin": true,
           "style": {
             "navigationBarTitleText": "订单确认"
           }
         }
       ]
+    },
+    {
+      "root": "subPack-djk",
+      "pages": [
+        {
+          "path": "afterSales/index",
+          "name": "djk-afterSales",
+          "islogin": true,
+          "style": {
+            "navigationBarTitleText": "申请退款"
+          }
+        },
+        {
+          "path": "commonTab/index",
+          "name": "djk-homeTabbar",
+          "islogin": false,
+          "style": {
+            "navigationStyle": "custom",
+            "navigationBarTitleText": "大健康首页",
+            "backgroundColorBottom": "#fff",
+            "disableScroll": true
+          }
+        },
+        {
+          "path": "confirmOrder/index",
+          "name": "djk-confirmOrder",
+          "islogin": true,
+          "style": {
+            "navigationBarTitleText": "提交订单"
+          }
+        },
+        {
+          "path": "goodsinfo/index",
+          "name": "djk-goods",
+          "islogin": false,
+          "style": {
+            "navigationStyle": "custom",
+            "navigationBarTitleText": "大健康商品详情"
+          }
+        },
+        {
+          "path": "orderDetaile/index",
+          "name": "djk-orderDetaile",
+          "islogin": true,
+          "style": {
+            "navigationBarTitleText": "订单详情",
+            "navigationStyle": "custom"
+          }
+        },
+        {
+          "path": "shopinfo/index",
+          "name": "djk-shopinfo",
+          "islogin": false,
+          "style": {
+            "navigationBarTitleText": "商家主页"
+          }
+        },
+        {
+          "path": "welfare/index",
+          "name": "djk-welfare",
+          "islogin": false,
+          "style": {
+            "navigationBarTitleText": "活动详情"
+          }
+        }
+      ]
+    },
+    {
+      "root": "subPack-refueling",
+      "pages": [
+        {
+          "path": "commonTab/index",
+          "name": "refueling-tabbar",
+          "islogin": false,
+          "style": {
+            "navigationBarTitleText": "加油"
+          }
+        },
+        {
+          "path": "webView/index",
+          "name": "refueling-webview",
+          "islogin": false,
+          "style": {
+            "navigationBarTitleText": "支付"
+          }
+        }
+      ]
     }
   ]
 }

+ 76 - 21
src/pages/index/index.vue

@@ -33,12 +33,12 @@ const { data: goodsList, isLastPage, page, reload, error, refresh } = usePaginat
 const state = computed(() => {
   return error.value ? 'error' : !isLastPage.value ? 'loading' : 'finished'
 })
+const currentIndex = ref(0)
 const loading = ref(true)
-
 onShow(async () => {
   useSysStore().getAudit()
   useSmqjhCartStore().getCartList('XSB')
-
+  getSelectZhUser()
   xsbStore.value = await AsyncImport('@/subPack-xsb/store-xsb/sys')
   refresh()
 })
@@ -58,11 +58,12 @@ const navList = computed(() => {
     { icon: `${StaticUrl}/xsb.png`, title: '星闪豹', name: 'xsb-homeTabbar', show: true },
     { icon: `${StaticUrl}/smqjh-index-cd.png`, title: '充电', name: 'charge-index', show: true },
     { icon: `${StaticUrl}/smqjh-sp.png`, title: '电影演出', name: 'film-index', show: true },
-    { icon: `${StaticUrl}/smqjh-vip.png`, title: '视频权益', name: 'video-rights-tabbar', show: true },
+    { icon: `${StaticUrl}/smqjh-vip.png`, title: '视频权益', name: 'video-rights-tabbar', show: !isOnlineAudit.value },
     { icon: `${StaticUrl}/smqjh-diancan.png`, title: '大牌点餐', name: '', show: !isOnlineAudit.value },
-    { icon: `${StaticUrl}/smqjh-jiayou.png`, title: '加油', name: '', show: !isOnlineAudit.value },
+    { icon: `${StaticUrl}/smqjh-jiayou.png`, title: '加油', name: '', show: !isOnlineAudit.value }, // refueling-tabbar
     { icon: `${StaticUrl}/smqjh-jiudian.png`, title: '酒店民宿', name: '', show: !isOnlineAudit.value },
     { icon: `${StaticUrl}/smqjh-daijia.png`, title: '代驾', name: '', show: !isOnlineAudit.value },
+    { icon: `${StaticUrl}/smqjh-djk.png`, title: '大健康', name: 'djk-homeTabbar', show: true },
   ]
   return list
 })
@@ -87,9 +88,30 @@ onShareAppMessage(() => {
     title: '市民请集合',
   }
 })
+const showoverlay = ref(false)
+async function getSelectZhUser() {
+  const res = await Apis.sys.selectZhUser({})
+  if (res.data.channelId === 54 && !res.data.isClaimed) {
+    showoverlay.value = true
+  }
+}
+
+async function getZhUserReceived() {
+  useGlobalLoading().loading({ msg: '领取中...' })
+  await Apis.sys.zhUserReceived({})
+  useGlobalLoading().close()
+  show({ msg: '领取成功 !' })
+  showoverlay.value = false
+}
+
 function handleGo() {
   show({ msg: '敬请期待 !' })
 }
+function handleChangeSwiper(e: UniHelper.SwiperOnChangeEvent) {
+  console.log(e.detail.current, 'e.detail.current')
+
+  currentIndex.value = e.detail.current
+}
 </script>
 
 <template>
@@ -151,26 +173,38 @@ function handleGo() {
 
           ]"
         >
-          <view class="grid grid-cols-4 gap-12rpx">
-            <template v-for="item in navList" :key="item.icon">
-              <view
-                v-if="item.show" class="flex flex-col items-center justify-center"
-                @click="handleClick(String(item.name))"
-              >
-                <view class="relative h-120rpx w-120rpx">
-                  <image :src="item.icon" class="h-120rpx w-120rpx" />
+          <swiper :duration="300" class="h340rpx" @change="handleChangeSwiper">
+            <swiper-item
+              v-for="pageIndex in Math.ceil(navList.filter(i => i.show).length / 8)" :key="pageIndex"
+            >
+              <view class="grid grid-cols-4 gap-12rpx">
+                <template
+                  v-for="item in navList.filter(i => i.show).slice((pageIndex - 1) * 8, pageIndex * 8)"
+                  :key="item.icon"
+                >
                   <view
-                    v-if="item.name == ''"
-                    class="linebg absolute left-0 top-0 h-full w-full flex items-center justify-center rounded-32rpx text-24rpx text-white font-semibold"
+                    class="flex flex-col items-center justify-center"
+                    @click="handleClick(String(item.name))"
                   >
-                    敬请期待
+                    <view class="relative h-120rpx w-120rpx">
+                      <image :src="item.icon" class="h-120rpx w-120rpx" />
+                      <view
+                        v-if="item.name == ''"
+                        class="linebg absolute left-0 top-0 h-full w-full flex items-center justify-center rounded-32rpx text-24rpx text-white font-semibold"
+                      >
+                        敬请期待
+                      </view>
+                    </view>
+                    <view class="text-24rpx">
+                      {{ item.title }}
+                    </view>
                   </view>
-                </view>
-                <view class="text-24rpx">
-                  {{ item.title }}
-                </view>
+                </template>
               </view>
-            </template>
+            </swiper-item>
+          </swiper>
+          <view class="w-full flex items-center justify-center">
+            <view v-for="_pageIndex, index in Math.ceil(navList.filter(i => i.show).length / 8)" :key="index" class="mr14rpx transition-all transition-duration-400 ease-in" :class="[currentIndex == index ? 'rounded-12rpx w-40rpx h12rpx bg-[var(--them-color)]' : 'w12rpx h12rpx rounded-50% bg-#F0F0F0']" />
           </view>
         </wd-skeleton>
       </view>
@@ -197,6 +231,10 @@ function handleGo() {
                   <view @click="router.push({ name: 'xsb-goods', params: { id: item.prodId } })">
                     <view class="relative h-344rpx">
                       <image :src="item.pic" class="h-344rpx w-344rpx" />
+                      <image
+                        :src="`${StaticUrl}/xsb-shui-index.png`"
+                        class="absolute left-0 top-0 h-344rpx w-344rpx"
+                      />
                       <view class="absolute bottom-0 left-0 flex items-center text-22rpx">
                         <view class="rounded-tl-8rpx bg-[#02ECFD] pl-4rpx">
                           星闪豹
@@ -243,7 +281,24 @@ function handleGo() {
             </scroll-view>
           </view>
         </wd-skeleton>
-        <wd-loadmore :state="state" :loading-props="{ color: '#9ED605', size: 20 }" @reload="reload" />
+        <wd-loadmore v-if="goodsList.length > 9" :state="state" :loading-props="{ color: '#9ED605', size: 20 }" @reload="reload" />
+        <wd-overlay :show="showoverlay" @click="showoverlay = false">
+          <view class="mt-280rpx flex items-center justify-center">
+            <view class="relative h-906rpx w-644rpx flex flex-col justify-center text-center" :style="{ backgroundImage: `url(${StaticUrl}/home-overlay-img.png)`, backgroundSize: 'cover', backgroundPosition: 'center' }">
+              <view>
+                <view class="text-80rpx text-#FF1B51 font-600">
+                  ¥200
+                </view>
+                <view class="text-28rpx font-800">
+                  现金抵扣券
+                </view>
+              </view>
+              <view class="absolute bottom-110rpx left-42% text-60rpx text-#FF1B51 font-bold" @click="getZhUserReceived">
+                领
+              </view>
+            </view>
+          </view>
+        </wd-overlay>
       </view>
     </view>
   </view>

+ 6 - 0
src/store/sys.ts

@@ -32,6 +32,10 @@ interface SysState {
    * 是否上线审核
    */
   isOnlineAudit: boolean
+  /**
+   * 如果是组件模式加tabbar,从订单详情返回订单列表页面需要刷新,监听此字段刷新页面
+   */
+  refreshOrderList: boolean
 
 }
 export const useSysStore = defineStore('system', {
@@ -43,6 +47,7 @@ export const useSysStore = defineStore('system', {
     payFailPath: '',
     opcity: 0,
     isOnlineAudit: true,
+    refreshOrderList: false,
   }),
   actions: {
     getSystemData() {
@@ -88,5 +93,6 @@ export const useSysStore = defineStore('system', {
         })
       })
     },
+
   },
 })

+ 294 - 0
src/store/user.ts

@@ -1,6 +1,8 @@
 import { defineStore } from 'pinia'
+import { dayjs } from 'wot-design-uni'
 import { StaticUrl } from '@/config'
 import router from '@/router'
+import type { wxpay } from '@/api/globals'
 
 interface userStroe {
   token: string
@@ -131,6 +133,298 @@ export const useUserStore = defineStore('user', {
         }
       })
     },
+    /**
+     * 通用支付逻辑
+     * @param orderNumber
+     * @returns
+     */
+    handleCommonPayMent(orderNumber: string): Promise<wxpay> {
+      return new Promise((resolve, reject) => {
+        if (!orderNumber) {
+          useGlobalToast().show({ msg: '订单号为空!请联系管理员' })
+          reject(new Error('订单号为空!请联系管理员'))
+          return
+        }
+        uni.showLoading({ mask: true })
+        Apis.common.hybridPayment({ data: { orderNumber } }).then((res) => {
+          resolve(res.data)
+          uni.hideLoading()
+        }).catch((err) => {
+          uni.hideLoading()
+          reject(err)
+        })
+      })
+    }, /**
+        *
+        * @param businessType
+        * @param dvyType  配送类型 1:快递 2:自提 3:及时配送
+        * @param remarks
+        * @param shopId
+        * @param orderItemList
+        * @returns 下单获取待支付订单号
+        */
+    getOrderPayMent(freightFee: number, businessType: string, dvyType: number, shopId: number, orderItemList: {
+      prodCount?: number
+      skuId?: number
+    }[], remarks?: string): Promise<string> {
+      uni.showLoading({ mask: true })
+      return new Promise((resolve, reject) => {
+        if (!this.selectedAddress) {
+          reject(new Error('请选择收货地址'))
+          return
+        }
+        Apis.common.addOrder({
+          data: {
+            channelId: Number(this.userInfo.channelId),
+            businessType,
+            addressId: this.selectedAddress.id,
+            dvyType,
+            freightAmount: freightFee,
+            shopId,
+            orderItemList,
+            remarks,
+          },
+        }).then((res) => {
+          resolve(res.data)
+          uni.hideLoading()
+        }).catch((err) => {
+          uni.hideLoading()
+          reject(err)
+        })
+      })
+    },
+    /**
+     *
+     * @param orderInfo
+     * @returns 统一拉起微信支付
+     * @param type 0是下单,1是列表下单
+     */
 
+    getWxCommonPayment(orderPay: wxpay) {
+      uni.showLoading({ mask: true })
+      return new Promise((resolve, reject) => {
+        const orderInfo = {
+          appid: orderPay.appId,
+          timeStamp: orderPay.timeStamp,
+          nonceStr: orderPay.nonceStr,
+          package: orderPay.package,
+          signType: orderPay.signType,
+          paySign: orderPay.paySign,
+        }
+        uni.requestPayment({
+          provider: 'wxpay',
+          orderInfo,
+          ...orderInfo,
+          success: (res) => {
+            resolve(res)
+          },
+          fail: (e) => {
+            reject(e)
+          },
+          complete() {
+            uni.hideLoading()
+          },
+        })
+      })
+    },
+    /**
+     *
+     * 支付成功统一跳转
+     *  @param name 订单列表
+     * @param idxPath 首页路径
+     *
+     */
+    paySuccess(name: string, idxPath: string) {
+      return new Promise((resolve) => {
+        useSysStore().setPaySuccessPath(name, idxPath)
+        router.replace({ name: 'common-paySuccess' })
+        setTimeout(() => {
+          resolve(1)
+        }, 2000)
+      })
+    },
+    /**
+     *
+     * 支付失败统一跳转
+     * @param name 订单列表
+     * @param idxPath 首页路径
+     */
+    payError(name: string, idxPath: string) {
+      return new Promise((resolve) => {
+        useSysStore().setPaySuccessPath(name, idxPath)
+        router.replace({ name: 'common-payError' })
+        setTimeout(() => {
+          resolve(1)
+        }, 2000)
+      })
+    }, /**
+        * 支付成功清空购买的商品的购物车
+        */
+
+    clearCart(skuList: Api.CartSkuVo[]) {
+      uni.showLoading({ mask: true })
+      return new Promise((resolve) => {
+        const skuids = skuList.map(item => item.id).join(',')
+        if (skuids.length) {
+          Apis.common.deleteShoppingCart({
+            pathParams: {
+              ids: skuids,
+            },
+          }).then(async (res) => {
+            resolve(res)
+            await useSmqjhCartStore().getCartList('XSB')
+            uni.hideLoading()
+          }).finally(() => resolve(1))
+        }
+        else {
+          resolve(1)
+          uni.hideLoading()
+        }
+      })
+    },
+    /**
+     * 统一确认收货
+     * @param order
+     * @returns
+     */
+    handleCommonOrderReceive(order: Api.xsbOrderList) {
+      return new Promise((resolve, reject) => {
+        useGlobalMessage().confirm({
+          title: '确认收货',
+          msg: '确定要确认收货吗?',
+          zIndex: 99999999999999,
+          success: async () => {
+            uni.showLoading({ mask: true })
+            await Apis.xsb.confirmReceipt({
+              data: {
+                orderNumber: String(order.orderNumber),
+              },
+            })
+            resolve(1)
+          },
+          fail: err => reject(err),
+        })
+      })
+    },
+    /**
+     * 统一删除订单
+     * @param order
+     * @returns
+     */
+    handleCommonDeleteOrder(order: Api.xsbOrderList) {
+      return new Promise((resolve, reject) => {
+        useGlobalMessage().confirm({
+          title: '删除订单',
+          msg: '确定要删除该订单吗?',
+          zIndex: 99999999999999,
+          success: async () => {
+            uni.showLoading({ mask: true })
+            Apis.xsb.deleteOrder({
+              pathParams: {
+                ids: String(order.orderId),
+              },
+            }).then(res => resolve(res)).catch(err => reject(err)).finally(() => uni.hideLoading())
+          },
+          fail: async (err) => {
+            reject(err)
+          },
+        })
+      })
+    },
+    /**
+     * 统一取消订单
+     * @param order
+     * @returns
+     */
+    handleCommonCancelOrder(order: Api.xsbOrderList) {
+      return new Promise((resolve, reject) => {
+        useGlobalMessage().confirm({
+          title: '取消订单',
+          msg: '确定要取消订单吗?',
+          zIndex: 99999999999999,
+          success: async () => {
+            uni.showLoading({ mask: true })
+            Apis.xsb.cancelOrder({
+              data: {
+                orderNo: String(order.orderNumber),
+              },
+            }).then(res => resolve(res)).catch(err => reject(err)).finally(() => uni.hideLoading())
+          },
+          fail: async (err) => {
+            reject(err)
+          },
+        })
+      })
+    },
+    handleXSBCommonOrderStatusText(order: Api.xsbOrderList): any {
+      if (order.hbOrderStatus === OrderStatus.PaddingPay) {
+        const endTime = dayjs(order.createTime).add(16, 'minutes')
+        const remaining = dayjs(endTime).valueOf() - dayjs().valueOf()
+        return Math.max(0, remaining) // 确保不会返回负数
+      }
+
+      if (order.hbOrderStatus === OrderStatus.OrderAccepted) {
+        return '订单已接单'
+      }
+      if (order.hbOrderStatus === OrderStatus.OrderWaitDelivery) {
+        return '订单待配送'
+      }
+      if (order.hbOrderStatus === OrderStatus.OrderDelivering) {
+        return '订单配送中'
+      }
+      if (order.hbOrderStatus === OrderStatus.OrderCancelAudit) {
+        return '订单取消审核'
+      }
+      if (order.hbOrderStatus === OrderStatus.OrderCancel) {
+        return '订单取消'
+      }
+      if (order.hbOrderStatus === OrderStatus.OrderArrived) {
+        return '订单已送达'
+      }
+      if (order.hbOrderStatus === OrderStatus.OrderCompleted) {
+        return '订单完成'
+      }
+      return '未知订单状态'
+    },
+    handleFilmCommonOrderStatusText(order: Api.xsbOrderList): any {
+      if (order.hbOrderStatus === OrderStatus.PaddingPay) {
+        const endTime = dayjs(order.createTime).add(16, 'minutes')
+        const remaining = dayjs(endTime).valueOf() - dayjs().valueOf()
+        return Math.max(0, remaining) // 确保不会返回负数
+      }
+
+      if (order.hbOrderStatus === OrderStatus.OrderAccepted) {
+        return '待出票'
+      }
+      if (order.hbOrderStatus === OrderStatus.OrderWaitDelivery) {
+        return '订单待配送'
+      }
+      if (order.hbOrderStatus === OrderStatus.OrderDelivering) {
+        return '出票中'
+      }
+      if (order.hbOrderStatus === OrderStatus.OrderCancelAudit) {
+        return '订单取消审核'
+      }
+      if (order.hbOrderStatus === OrderStatus.OrderCancel) {
+        return '订单取消'
+      }
+      if (order.hbOrderStatus === OrderStatus.OrderArrived) {
+        return '订单完成'
+      }
+      if (order.hbOrderStatus === OrderStatus.OrderCompleted) {
+        return '订单完成'
+      }
+      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] || '未知订单状态'
+    },
   },
 })

+ 4 - 2
src/subPack-charge/chargeOrderList/chargeOrderList.vue

@@ -8,7 +8,7 @@ const navActiveTab = ref(0)
 const { statusBarHeight, MenuButtonHeight, opcity } = storeToRefs(useSysStore())
 definePage({
   name: 'charge-order-list',
-  islogin: false,
+  islogin: true,
   style: {
     navigationBarTitleText: '充电订单',
     navigationStyle: 'custom',
@@ -74,7 +74,9 @@ function handleChangeTypeNav(value: number) {
       </view>
     </view>
     <view class="box-border px24rpx">
-      <chargeList :order-list="orderList" />
+      <template v-for="item in orderList" :key="item.orderNumber">
+        <chargeList :order="item" />
+      </template>
       <StatusTip v-if="!orderList.length" tip="暂无内容" />
     </view>
   </view>

+ 1 - 1
src/subPack-common/afterSales/index.vue

@@ -29,7 +29,7 @@ const remark = ref('')
 onLoad((options: any) => {
   orderList.value = JSON.parse(options.order)
   orderList.value = orderList.value.map((item: Api.xsbOmsOrderItem) => {
-    item.num = 1
+    item.num = item.prodCount as number
     return item
   })
 })

+ 8 - 10
src/subPack-common/integral/index.vue

@@ -9,17 +9,11 @@ definePage({
     disableScroll: true,
   },
 })
-const navTabTypeList = [
-  { name: '全部', value: 'all' },
-  { name: '星闪豹', value: 'XSB' },
-  { name: '充电', value: 'CD' },
-  { name: '电影演出', value: 'DYY' },
-  { name: '视频权益', value: 'VIDEO' },
-  { name: '大牌点餐', value: 'SHOP' },
-]
+const navTabTypeList = ref<Api.sysDict[]>([])
 const { data: info } = useRequest(() =>
   Apis.xsb.findUserPoints({}),
 )
+
 const type = ['充值', '下单', '退款', '过期积分', '退款过期积分']
 const { data: pointList, isLastPage, page } = usePagination((pageNum, pageSize) => Apis.xsb.findUserPointsPage({ data: { pageNum, pageSize } }), { data: resp => resp.data?.list, initialPage: 1, initialPageSize: 10, immediate: true, append: true })
 
@@ -30,9 +24,13 @@ function handleScrollBottom() {
     page.value++
   }
 }
-
+async function getNavList() {
+  const res = await Apis.sys.dictPage({ data: { typeCode: 'sys_business_type' } })
+  navTabTypeList.value = res.data?.list || []
+}
+getNavList()
 function getLabel(val: string) {
-  return navTabTypeList.find(i => i.value === val)?.name || '未知类型'
+  return navTabTypeList.value.find(i => i.value === val)?.name || '未知类型'
 }
 </script>
 

+ 1 - 1
src/subPack-common/payError/index.vue

@@ -48,7 +48,7 @@ function handleBackIndex() {
         </view>
         <view class="mt60rpx flex items-center">
           <wd-button
-            type="info" block size="large" @click=" router.replace({ name: paySuccessPath })"
+            type="info" block size="large" @click=" router.replace({ name: paySuccessPath, params: { pay: '1' } })"
           >
             <text class="text-32rpx font-semibold">
               查看订单

+ 1 - 1
src/subPack-common/paySuccess/index.vue

@@ -48,7 +48,7 @@ function handleBackIndex() {
         </view>
         <view class="mt60rpx flex items-center">
           <wd-button
-            type="info" block size="large" @click="router.replace({ name: paySuccessPath })"
+            type="info" block size="large" @click="router.replace({ name: paySuccessPath, params: { pay: '1' } })"
           >
             <text class="text-32rpx font-semibold">
               查看订单

+ 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>

+ 71 - 0
src/subPack-djk/commonTab/components/fl.vue

@@ -0,0 +1,71 @@
+<script setup lang="ts">
+import router from '@/router'
+
+const { statusBarHeight, MenuButtonHeight } = storeToRefs(useSysStore())
+const flList = ref<Api.DjkWelfareVO[]>([])
+async function getList() {
+  const res = await Apis.djk.welfareList({})
+  flList.value = res.data
+}
+getList()
+
+const mapStatus = [
+  { status: 0, name: '全部', color: '#000' },
+  { status: 1, name: '未开始', color: '#222222' },
+  { status: 2, name: '进行中', color: '#52C41A' },
+  { status: 3, name: '已结束', color: '#AAAAAA' },
+]
+async function handleGo(item: Api.DjkWelfareVO) {
+  await useUserStore().checkLogin()
+  router.push({ name: 'djk-welfare', params: { id: String(item.id) } })
+}
+</script>
+
+<template>
+  <view>
+    <wd-navbar
+      title="福利中心"
+      :bordered="false"
+      :z-index="99"
+      safe-area-inset-top
+      placeholder
+      fixed
+    />
+    <scroll-view scroll-y :style="{ height: `calc(100vh - ${(statusBarHeight + MenuButtonHeight) * 4}rpx)` }">
+      <view class="px24rpx">
+        <view v-for="item in flList" :key="item.id" class="mt20rpx rounded-16rpx bg-white p24rpx" @click="handleGo(item)">
+          <view class="h248rpx w-full overflow-hidden rounded-16rpx">
+            <image
+              :src="item.activityImg"
+              class="h-full w-full"
+            />
+          </view>
+          <view class="mt24rpx w-full">
+            <view class="flex items-center justify-between">
+              <view class="text-32rpx font-semibold">
+                {{ item.activityName }}
+              </view>
+              <view class="text-28rpx" :style="{ color: mapStatus.find((it) => item.activityStatus == it.status)?.color }">
+                {{ mapStatus.find((it) => item.activityStatus == it.status)?.name }}
+              </view>
+            </view>
+          </view>
+          <view class="mt16rpx text-gray">
+            {{ item.activityStartTime }}
+            至
+            {{ item.activityEndTime }}
+          </view>
+          <view class="mt20rpx text-24rpx">
+            领取:{{ item.quantityClaimed }}/{{ item.inventory }}
+          </view>
+        </view>
+        <view class="h40rpx" />
+        <StatusTip v-if="!flList.length" tip="暂无内容" />
+      </view>
+    </scroll-view>
+  </view>
+</template>
+
+<style scoped>
+
+</style>

+ 79 - 0
src/subPack-djk/commonTab/components/index.vue

@@ -0,0 +1,79 @@
+<script setup lang="ts">
+import router from '@/router'
+
+const { statusBarHeight, MenuButtonHeight } = storeToRefs(useSysStore())
+
+const { data: goodsList, isLastPage, page, reload, error } = usePagination((pageNum, pageSize) =>
+  Apis.djk.appletGoodsList({ data: { pageNum, pageSize } }), {
+  data: resp => resp.data?.list,
+  initialData: [],
+  initialPage: 1,
+  initialPageSize: 10,
+  append: true,
+})
+const state = computed(() => {
+  return error.value ? 'error' : !isLastPage.value ? 'loading' : 'finished'
+})
+function handleBottom() {
+  if (!isLastPage.value) {
+    page.value++
+  }
+}
+</script>
+
+<template>
+  <view>
+    <wd-navbar
+      title="大健康"
+      :bordered="false" :z-index="99"
+      safe-area-inset-top left-arrow placeholder fixed @click-left="router.back()"
+    />
+    <scroll-view scroll-y :style="{ height: `calc(100vh - ${(statusBarHeight + MenuButtonHeight) * 4}rpx)` }" @scrolltolower="handleBottom">
+      <view class="px24rpx">
+        <view v-for="item in goodsList" :key="item.shopId" class="mt20rpx rounded-16rpx bg-white p24rpx">
+          <view class="flex" @click="router.push({ name: 'djk-shopinfo', params: { id: `${item.shopId}` } })">
+            <image
+              :src="item.shopLogo?.split(',')[0]"
+              class="h144rpx w144rpx flex-shrink-0 rounded-16rpx"
+            />
+            <view class="ml20rpx flex-1">
+              <view class="text-32rpx font-semibold">
+                {{ item.shopName }}
+              </view>
+              <view class="mt16rpx text-24rpx text-gray">
+                总销量 {{ item.sales }}
+              </view>
+              <view class="mt16rpx text-24rpx text-gray">
+                {{ item.shopAddress }}
+              </view>
+            </view>
+          </view>
+          <view class="ml164rpx">
+            <view v-for="its in item.goodsList" :key="its.id" class="mt14rpx flex items-center justify-between" @click="router.push({ name: 'djk-goods', params: { id: `${its.id}`, type: '0' } })">
+              <view class="w-180rpx flex-shrink-0 text-28rpx text-#FF4D3A font-semibold">
+                <text class="text-20rpx">
+                  ¥
+                </text> {{ its.price }}
+              </view>
+              <view class="w-200rpx flex-shrink-0 truncate text-24rpx">
+                {{ its.goodsName }}
+              </view>
+              <view class="flex-shrink-0 text-24rpx text-gray">
+                已售 {{ its.sales }}
+              </view>
+            </view>
+          </view>
+        </view>
+        <view class="h40rpx" />
+      </view>
+      <template v-if="goodsList.length > 10">
+        <wd-loadmore :state="state" :loading-props="{ color: '#9ED605', size: 20 }" @reload="reload" />
+      </template>
+      <StatusTip v-if="!goodsList.length" tip="暂无内容" />
+    </scroll-view>
+  </view>
+</template>
+
+<style scoped>
+
+</style>

+ 59 - 0
src/subPack-djk/commonTab/components/order.vue

@@ -0,0 +1,59 @@
+<script setup lang="ts">
+import djkorder from '@/subPack-smqjh/components/djk-order/index.vue?async'
+import { createGlobalLoadingMiddleware } from '@/api/core/middleware'
+
+const { statusBarHeight, MenuButtonHeight, refreshOrderList } = storeToRefs(useSysStore())
+const { data: orderList, refresh, isLastPage, page, reload, error } = usePagination((pageNum, pageSize) => Apis.xsb.orderList({ data: {
+  businessType: 'DJK',
+  pageNum,
+  pageSize,
+  orderStatus: 'all',
+} }), {
+  pageNum: 1,
+  pageSize: 10,
+  initialData: [],
+  data: res => res.data?.list,
+  append: true,
+  middleware: createGlobalLoadingMiddleware(),
+  immediate: false,
+})
+const state = computed(() => {
+  return error.value ? 'error' : !isLastPage.value ? 'loading' : 'finished'
+})
+function handleBottom() {
+  if (!isLastPage.value) {
+    page.value++
+  }
+}
+reload()
+watch(() => refreshOrderList.value, () => {
+  console.log('刷新页面', refreshOrderList.value)
+  if (refreshOrderList.value) {
+    reload()
+    refreshOrderList.value = false
+  }
+})
+</script>
+
+<template>
+  <wd-navbar
+    title="订单列表"
+    :bordered="false"
+    :z-index="99"
+    safe-area-inset-top
+    placeholder
+    fixed
+  />
+  <scroll-view scroll-y :style="{ height: `calc(100vh - ${(statusBarHeight + MenuButtonHeight) * 4}rpx)` }" @scrolltolower="handleBottom">
+    <view class="p24rpx">
+      <template v-for="item in orderList" :key="item.orderNumber">
+        <djkorder :order="item" @refresh="reload" />
+      </template>
+      <wd-loadmore v-if="orderList.length > 10" :state="state" :loading-props="{ color: '#9ED605', size: 20 }" @reload="refresh" />
+      <StatusTip v-if="!orderList.length" tip="暂无内容" />
+      <view class="h60rpx" />
+    </view>
+  </scroll-view>
+</template>
+
+<style lang="scss" scoped></style>

+ 109 - 0
src/subPack-djk/commonTab/index.vue

@@ -0,0 +1,109 @@
+<script setup lang="ts">
+import home from './components/index.vue'
+import fl from './components/fl.vue'
+import order from './components/order.vue'
+import { StaticUrl } from '@/config'
+import router from '@/router'
+
+definePage({
+  name: 'djk-homeTabbar',
+  islogin: false,
+  style: {
+    navigationStyle: 'custom',
+    navigationBarTitleText: '大健康首页',
+    backgroundColorBottom: '#fff',
+    disableScroll: true,
+  },
+})
+const { refreshOrderList } = storeToRefs(useSysStore())
+const { userInfo, token } = storeToRefs(useUserStore())
+const showCurtain = ref(false)
+onLoad((options: any) => {
+  if (options.pay) {
+    handleTabbarChange({ value: 'djk-order' })
+  }
+})
+onMounted(() => {
+  refreshOrderList.value = false
+})
+const tabbarItems = ref([
+  { name: 'djk-home', value: null, active: true, title: '首页', icon1: `${StaticUrl}/djk-idx0.png`, icon2: `${StaticUrl}/djk-idx1.png` },
+  { name: 'djk-fl', value: null, active: false, title: '福利中心', icon1: `${StaticUrl}/djk-fl0.png`, icon2: `${StaticUrl}/djk-fl1.png` },
+  { name: 'djk-order', value: null, active: false, title: '订单', icon1: `${StaticUrl}/djk-order0.png`, icon2: `${StaticUrl}/djk-order1.png` },
+])
+const tabbarName = ref('djk-home')
+const welfare = ref<Api.DjkWelfareVO>()
+function handleTabbarChange({ value }: { value: string }) {
+  setTabbarItemActive(value)
+  tabbarName.value = value
+}
+function setTabbarItemActive(name: string) {
+  tabbarItems.value.forEach((item) => {
+    if (item.name === name) {
+      item.active = true
+    }
+    else {
+      item.active = false
+    }
+  })
+}
+async function getData() {
+  if (!token.value)
+    return
+  const res = await Apis.djk.welfareClaimInfoPopup({ pathParams: { memberId: userInfo.value.id } })
+  if (res.data.id) {
+    welfare.value = res.data
+    showCurtain.value = true
+  }
+}
+getData()
+</script>
+
+<template>
+  <view class="page-xsb">
+    <fl v-if="tabbarName == 'djk-fl'" />
+    <order v-if="tabbarName == 'djk-order'" />
+    <home v-if="tabbarName == 'djk-home'" />
+    <wd-tabbar
+      v-model="tabbarName" safe-area-inset-bottom placeholder fixed :bordered="false" custom-class="custom-tab"
+      :z-index="99999" @change="handleTabbarChange"
+    >
+      <wd-tabbar-item
+        v-for="(item, index) in tabbarItems" :key="index" :name="item.name"
+        :title="index == 0 && item.active ? '' : item.title"
+        @change="handleTabbarChange"
+      >
+        <template #icon="{ active }">
+          <template v-if="index == 0 && !active">
+            <image :src="item.icon1" class="h44rpx w44rpx" />
+          </template>
+          <template v-else-if="index == 0 && active">
+            <image :src="item.icon2" class="h74rpx w74rpx" />
+          </template>
+          <template v-else-if="index != 0">
+            <image v-if="active" :src="item.icon2" class="h44rpx w44rpx" />
+            <image v-else :src="item.icon1" class="h44rpx w44rpx" />
+          </template>
+        </template>
+      </wd-tabbar-item>
+    </wd-tabbar>
+    <wd-overlay :show="showCurtain" :z-index="999999999" @click="showCurtain = false">
+      <view class="h-screen flex items-center justify-center">
+        <view class="relative h702rpx w702rpx">
+          <image
+            :src="`${StaticUrl}/djk-fl-popup.png`"
+            class="h702rpx w702rpx"
+            @click="router.push({ name: 'djk-welfare', params: { id: String(welfare?.id) } })"
+          />
+          <view class="absolute bottom-120rpx left-50% text-28rpx text-white -translate-x-50%">
+            领取:{{ welfare?.quantityClaimed || 0 }}/{{ welfare?.inventory || 0 }}
+          </view>
+        </view>
+      </view>
+    </wd-overlay>
+  </view>
+</template>
+
+<style scoped lang="scss">
+
+</style>

+ 204 - 0
src/subPack-djk/confirmOrder/index.vue

@@ -0,0 +1,204 @@
+<script setup lang="ts">
+definePage({
+  name: 'djk-confirmOrder',
+  islogin: true,
+  style: {
+    navigationBarTitleText: '提交订单',
+  },
+})
+const orderInfo = ref<Api.PmsDjkGoods>()
+const isPay = ref(false)
+const isAllow = ref(true)
+const phone = ref(useUserStore().userInfo.mobile)
+const isEdit = ref(false)
+const points = ref(0)
+const price = ref(0)
+const goodsId = ref()
+onLoad((options: any) => {
+  goodsId.value = options.order
+  getGoodsDetaile()
+})
+async function getCore() {
+  const res = await Apis.djk.djkAppletOrderConfirm({ data: { goodsId: orderInfo.value?.id, channelId: useUserStore().userInfo.channelId } })
+  points.value = res.data.points
+  price.value = res.data.price
+}
+async function getGoodsDetaile() {
+  const res = await Apis.djk.goodsInfo({ data: { goodsId: goodsId.value } })
+  orderInfo.value = res.data
+  getCore()
+}
+async function handlePay() {
+  if (!orderInfo.value) {
+    useGlobalToast().show({ msg: '网络异常!请联系客服' })
+    return
+  }
+  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) {
+      try {
+        await useUserStore().getWxCommonPayment(res)
+        await useUserStore().paySuccess('djk-homeTabbar', 'subPack-djk/commonTab/index')
+      }
+      catch {
+        useUserStore().payError('djk-homeTabbar', 'subPack-djk/commonTab/index')
+      }
+    }
+    else {
+      await useUserStore().paySuccess('djk-homeTabbar', 'subPack-djk/commonTab/index')
+    }
+  }
+  catch (error) {
+    console.log('error', error)
+    isPay.value = false
+  }
+}
+</script>
+
+<template>
+  <view v-if="orderInfo" class="page px20rpx py20rpx">
+    <view class="flex items-center rounded-16rpx bg-white p24rpx">
+      <image
+        :src="orderInfo.goodsImg?.split(',')[0]"
+        class="h160rpx w160rpx flex-shrink-0 rounded-16rpx"
+      />
+      <view class="ml20rpx flex-1">
+        <view class="text-32rpx font-semibold">
+          {{ orderInfo.goodsName }}
+        </view>
+        <view class="mt16rpx text-24rpx text-gray">
+          有效期{{ orderInfo.effectiveTime }}天·需提前{{ orderInfo.advanceBookingTime }}天预约
+        </view>
+        <view class="mt16rpx flex items-center justify-between">
+          <view class="text-36rpx text-#FF4D3A font-semibold">
+            <text class="text-20rpx">
+              ¥
+            </text> {{ orderInfo.price }}
+          </view>
+          <view class="text-24rpx text-gray">
+            x1
+          </view>
+        </view>
+      </view>
+    </view>
+    <view class="mt20rpx rounded-16rpx bg-white p24rpx">
+      <view class="flex items-center justify-between">
+        <view class="text-28rpx text-gray">
+          商品金额
+        </view>
+        <view class="text-28rpx font-semibold">
+          ¥{{ orderInfo.price }}
+        </view>
+      </view>
+      <view class="mt20rpx flex items-center justify-between">
+        <view class="text-28rpx text-gray">
+          积分{{ points ? `(${points})` : '' }}
+        </view>
+        <view class="text-28rpx font-semibold" :class="[points ? '' : 'text-gray']">
+          {{ points ? `-¥${points / 100}` : '不可用' }}
+        </view>
+      </view>
+      <view class="my20rpx h2rpx w-full bg-#F0F0F0" />
+      <view class="mt20rpx flex items-center justify-between">
+        <view class="text-28rpx text-gray">
+          总计
+        </view>
+        <view class="text-28rpx font-semibold">
+          ¥{{ price }}
+        </view>
+      </view>
+    </view>
+    <view class="mt20rpx rounded-16rpx bg-white p24rpx">
+      <view class="flex items-center justify-between">
+        <view class="text-28rpx text-gray">
+          允许商户通过此号码致电沟通到店时间
+        </view>
+        <wd-checkbox v-model="isAllow" />
+      </view>
+      <view class="mt16rpx flex items-center text-28rpx">
+        <view v-if="!isEdit" class="mr10rpx">
+          {{ phoneFormat(String(phone)) }}
+        </view>
+        <view v-else>
+          <input v-model="phone" type="number" :maxlength="11" :focus="isEdit" @blur="isEdit = false">
+        </view>
+        <view v-if="!isEdit" class="flex items-center" @click="isEdit = true">
+          <view class="mr5rpx">
+            修改
+          </view>
+          <wd-icon name="arrow-right" size="18px" color="#000" />
+        </view>
+      </view>
+    </view>
+    <view class="mt20rpx rounded-16rpx bg-white p24rpx">
+      <view class="text-32rpx font-semibold">
+        购买须知
+      </view>
+      <view class="mt20rpx text-24rpx text-gray">
+        有效期
+      </view>
+      <view class="mt16rpx text-28rpx">
+        购买之日起{{ orderInfo.effectiveTime }}天有效
+      </view>
+      <view class="mt20rpx text-24rpx text-gray">
+        预约信息
+      </view>
+      <view class="mt16rpx text-28rpx">
+        请您提前{{ orderInfo.advanceBookingTime }}天预定
+      </view>
+      <view class="mt20rpx text-24rpx text-gray">
+        可用时间
+      </view>
+      <view class="mt16rpx text-28rpx">
+        {{ orderInfo.useStartTime }} 至 {{ orderInfo.useEndTime }}
+      </view>
+      <view class="mt20rpx text-24rpx text-gray">
+        消费流程
+      </view>
+      <view class="mt16rpx text-28rpx">
+        {{ orderInfo.usageProcess }}
+      </view>
+      <view class="mt20rpx text-24rpx text-gray">
+        购买人群
+      </view>
+      <view class="mt16rpx text-28rpx">
+        {{ orderInfo.buyNotice }}
+      </view>
+    </view>
+    <view class="h250rpx" />
+    <view class="ios footer fixed bottom-0 left-0 box-border w-full rounded-t-16rpx bg-white px24rpx">
+      <view class="box-border w-full flex items-center justify-between py20rpx">
+        <view class="flex items-center text-#FF4D3A">
+          <view class="font-semibold10 flex items-baseline text-36rpx">
+            <text class="text-24rpx">
+              ¥
+            </text> {{ price }}
+          </view>
+          <view class="ml20rpx text-22rpx">
+            共减¥ {{ points / 100 }}
+          </view>
+        </view>
+        <view class="w180rpx">
+          <wd-button size="large" :loading="isPay" loading-color="#9ED605" @click="handlePay">
+            立即支付
+          </wd-button>
+        </view>
+      </view>
+    </view>
+  </view>
+</template>
+
+<style scoped lang="scss">
+  .footer{
+    box-shadow: 0rpx -6rpx 12rpx 2rpx rgba(0,0,0,0.05);
+  }
+  .page{
+    :deep(){
+      .wd-button{
+        width: 180rpx !important;
+      }
+    }
+  }
+</style>

+ 168 - 0
src/subPack-djk/goodsinfo/index.vue

@@ -0,0 +1,168 @@
+<script setup lang="ts">
+import { StaticUrl } from '@/config'
+import router from '@/router'
+
+definePage({
+  name: 'djk-goods',
+  islogin: false,
+  style: {
+    navigationStyle: 'custom',
+    navigationBarTitleText: '大健康商品详情',
+  },
+})
+const current = ref<number>(0)
+
+const isShowTab = ref(false)
+const goodsId = ref()
+const type = ref(0)
+onLoad((option: any) => {
+  type.value = Number(option.type)
+  goodsId.value = option.id
+  getGoodsDetaile()
+})
+
+const goodsInfo = ref<Api.PmsDjkGoods>()
+
+const swiperList = computed(() => {
+  if (goodsInfo.value) {
+    return goodsInfo.value.goodsImg?.split(',')
+  }
+  return []
+})
+const goodsContent = computed(() => {
+  if (goodsInfo.value?.content) {
+    return goodsInfo.value.content.replace(
+      /<img/gi,
+      '<img style="max-width:100%;height:auto" ',
+    )
+  }
+  return '暂无数据'
+})
+
+async function getGoodsDetaile() {
+  const res = await Apis.djk.goodsInfo({ data: { goodsId: goodsId.value } })
+  goodsInfo.value = res.data
+}
+function handlePhone() {
+  uni.makePhoneCall({
+    phoneNumber: String(goodsInfo.value?.tel),
+  })
+}
+async function handlePay() {
+  await useUserStore().checkLogin()
+  router.push({ name: 'djk-confirmOrder', params: { order: goodsId.value } })
+}
+</script>
+
+<template>
+  <view class="page-djk">
+    <wd-navbar
+      title="商品详情" :custom-style="`background-color:${isShowTab ? '#FFF !important' : 'transparent !important'}`" :bordered="false" :z-index="99"
+      safe-area-inset-top left-arrow fixed @click-left="router.back()"
+    />
+    <template v-if="goodsInfo">
+      <wd-swiper v-model:current="current" :list="swiperList" :autoplay="false" :height="375" />
+      <view class="relative z999 rounded-t-48rpx bg-white px24rpx py28rpx -mt20rpx">
+        <view class="flex items-center">
+          <view v-if="type" class="text-24rpx text-#FF4D3A">
+            福利价
+          </view>
+          <view class="flex items-end text-#FF4D3A font-semibold">
+            <view class="text-24rpx">
+              ¥
+            </view>
+            <view class="text-36rpx line-height-[36rpx]">
+              {{ type ? 0 : goodsInfo?.price }}
+            </view>
+          </view>
+          <view v-if="type" class="ml16rpx text-24rpx text-gray line-through">
+            ¥{{ goodsInfo?.price }}
+          </view>
+        </view>
+        <view class="mt20rpx text-32rpx font-semibold">
+          {{ goodsInfo.goodsName }}
+        </view>
+        <view class="mt20rpx">
+          <text class="text-24rpx text-gray">
+            服务保障
+          </text>
+          <text class="ml10rpx text-24rpx">
+            随时退·过期退
+          </text>
+        </view>
+        <view class="mt20rpx flex items-center text-24rpx text-gray">
+          <image
+            :src="`${StaticUrl}/djk-goods-erro.png`"
+            class="mr5rpx h24rpx w24rpx"
+          />  使用积分购买的,退款后返回的积分,有效期不变
+        </view>
+      </view>
+      <view class="px24rpx">
+        <view class="mt20rpx rounded-16rpx bg-white p24rpx">
+          <view class="text-32rpx font-semibold">
+            购买须知
+          </view>
+          <view class="mt20rpx text-24rpx text-gray">
+            有效期
+          </view>
+          <view class="mt16rpx text-28rpx">
+            购买之日起{{ goodsInfo.effectiveTime }}天有效
+          </view>
+          <view class="mt20rpx text-24rpx text-gray">
+            预约信息
+          </view>
+          <view class="mt16rpx text-28rpx">
+            请您提前{{ goodsInfo.advanceBookingTime }}天预定
+          </view>
+          <view class="mt20rpx text-24rpx text-gray">
+            可用时间
+          </view>
+          <view class="mt16rpx text-28rpx">
+            {{ goodsInfo.useStartTime }} 至 {{ goodsInfo.useEndTime }}
+          </view>
+          <view class="mt20rpx text-24rpx text-gray">
+            消费流程
+          </view>
+          <view class="mt16rpx text-28rpx">
+            {{ goodsInfo.usageProcess }}
+          </view>
+          <view class="mt20rpx text-24rpx text-gray">
+            购买人群
+          </view>
+          <view class="mt16rpx text-28rpx">
+            {{ goodsInfo.buyNotice }}
+          </view>
+        </view>
+        <view class="mt20rpx rounded-16rpx bg-white">
+          <view class="p24rpx text-32rpx font-semibold">
+            套餐详情
+            <rich-text :nodes="goodsContent" />
+          </view>
+        </view>
+      </view>
+      <view class="h180rpx" />
+      <view class="ios shadow-fixed fixed bottom-0 left-0 box-border w-full rounded-t-32rpx bg-white pl28rpx pr32rpx">
+        <view class="flex items-center pt10rpx">
+          <view class="w80rpx flex flex-col items-center justify-center" @click="handlePhone">
+            <image
+              :src="`${StaticUrl}/film-phone.png`"
+              class="h40rpx w40rpx"
+            />
+            <view class="mt20rpx text-28rpx">
+              电话
+            </view>
+          </view>
+          <view class="ml24rpx flex-1">
+            <wd-button block class="w-full" :disabled="Boolean(type)" @click="handlePay">
+              立即购买
+            </wd-button>
+          </view>
+        </view>
+      </view>
+    </template>
+  </view>
+</template>
+
+<style scoped lang="scss">
+
+</style>

+ 326 - 0
src/subPack-djk/orderDetaile/index.vue

@@ -0,0 +1,326 @@
+<script setup lang="ts">
+import { StaticUrl } from '@/config'
+import router from '@/router'
+
+definePage({
+  name: 'djk-orderDetaile',
+  islogin: true,
+  style: {
+    navigationBarTitleText: '订单详情',
+    navigationStyle: 'custom',
+  },
+})
+const orderInfo = ref<Api.xsbOrderList>()
+const orderNum = ref()
+const { refreshOrderList } = storeToRefs(useSysStore())
+onLoad((options: any) => {
+  orderNum.value = options.id
+  getDetail(options.id)
+})
+async function getDetail(id: string) {
+  const { data } = await Apis.xsb.orderInfo({
+    data: {
+      orderNo: id,
+    },
+  })
+  orderInfo.value = data
+}
+
+async function handleCancel() {
+  await useUserStore().handleCommonCancelOrder(orderInfo.value as Api.xsbOrderList)
+  refreshOrderList.value = true
+  getDetail(String(unref(orderInfo)?.orderNumber))
+}
+async function handlePay() {
+  const res = await useUserStore().handleCommonPayMent(String(unref(orderInfo)?.orderNumber))
+  if (res.payType !== 1) {
+    await useUserStore().getWxCommonPayment(res)
+    getDetail(String(unref(orderInfo)?.orderNumber))
+  }
+  else {
+    getDetail(String(unref(orderInfo)?.orderNumber))
+  }
+  refreshOrderList.value = true
+}
+async function handelDel() {
+  await useUserStore().handleCommonDeleteOrder(unref(orderInfo) as Api.xsbOrderList)
+  refreshOrderList.value = true
+  router.back()
+}
+async function handleFinish() {
+  uni.showLoading({ mask: true })
+  setTimeout(async () => {
+    await getDetail(String(unref(orderInfo)?.orderNumber))
+    uni.hideLoading()
+  }, 2000)
+}
+function handleCopy() {
+  uni.setClipboardData({
+    data: String(orderInfo.value?.orderNumber),
+    showToast: true,
+  })
+}
+async function handleAfterSale() {
+  router.push({
+    name: 'djk-afterSales',
+    params: { data: JSON.stringify(orderInfo.value) },
+  })
+}
+function handleNav() {
+  uni.openLocation({
+    latitude: Number(orderInfo.value?.shopInfo?.shopLat),
+    longitude: Number(orderInfo.value?.shopInfo?.shopLng),
+  })
+}
+function handlePhone() {
+  uni.makePhoneCall({
+    phoneNumber: String(orderInfo.value?.shopInfo?.tel),
+  })
+}
+</script>
+
+<template>
+  <view
+    v-if="orderInfo" class="page-xsb"
+  >
+    <wd-navbar
+      title="订单详情" :bordered="false" :z-index="99" safe-area-inset-top left-arrow placeholder fixed
+      @click-left="router.back()"
+    />
+    <view class="relative z-90 box-border bg-[#f6f6f6] px-24rpx">
+      <view class="pt-20rpx">
+        <view class="text-36rpx font-semibold">
+          <view v-if="orderInfo.hbOrderStatus === OrderStatus.PaddingPay">
+            <view class="flex items-center">
+              请在
+              <wd-count-down format="mm:ss" :time="useUserStore().handleXSBCommonOrderStatusText(orderInfo)" @finish="handleFinish">
+                <template #default="{ current }">
+                  <view class="flex items-center">
+                    <view> {{ current.minutes }} 分</view>
+                    <view> {{ current.seconds }} 秒</view>
+                  </view>
+                </template>
+              </wd-count-down>
+              内支付
+            </view>
+            <!-- <view class="mt-20rpx text-28rpx text-[#AAAAAA]">
+              现在支付:预计10:40-10:55送达
+            </view> -->
+            <view class="btn mt-20rpx flex items-center justify-between">
+              <view class="info-btn mr-20rpx w-226rpx">
+                <wd-button type="info" @click="handleCancel">
+                  取消订单
+                </wd-button>
+              </view>
+              <view class="ml-20rpx flex-1">
+                <wd-button @click="handlePay">
+                  立即支付¥{{ orderInfo.actualTotal }}
+                </wd-button>
+              </view>
+            </view>
+          </view>
+          <view
+            v-if="orderInfo.hbOrderStatus !== OrderStatus.PaddingPay" class="flex items-center"
+          >
+            {{ useUserStore().handleDjkCommonOrderStatusText(orderInfo) }}
+          </view>
+          <view v-if="orderInfo.hbOrderStatus === OrderStatus.OrderCancel" class="mt-20rpx text-28rpx text-[#AAAAAA]">
+            取消原因:{{ orderInfo.cancelReason }}
+          </view>
+        </view>
+      </view>
+      <view class="mt-20rpx rounded-16rpx bg-white p-24rpx">
+        <view class="grid grid-cols-5 text-28rpx text-[#222]">
+          <view
+            v-if="[OrderStatus.OrderCancel, OrderStatus.OrderCompleted].includes(Number(orderInfo.hbOrderStatus))"
+            class="flex flex-col items-center" @click="handelDel"
+          >
+            <image :src="`${StaticUrl}/orderDetaile-del.png`" class="h-40rpx w-40rpx" />
+            <view class="mt-40rpx">
+              删除订单
+            </view>
+          </view>
+          <view class="contact relative flex flex-col items-center">
+            <image :src="`${StaticUrl}/orderDetaile-wx.png`" class="h-40rpx w-40rpx" />
+            <Zcontact>
+              <view class="mt-40rpx text-28rpx">
+                联系客服
+              </view>
+            </Zcontact>
+          </view>
+          <view
+            v-if="orderInfo.hbOrderStatus == OrderStatus.OrderAccepted && orderInfo.djkOrderAttachInfo?.djkOrderType == 0 "
+            class="flex flex-col items-center" @click="handleAfterSale"
+          >
+            <image :src="`${StaticUrl}/orderDetaile-shou.png`" class="h-40rpx w-40rpx" />
+            <view class="mt-40rpx">
+              申请退款
+            </view>
+          </view>
+        </view>
+      </view>
+      <view class="mt-20rpx flex items-center rounded-16rpx bg-white p-24rpx">
+        <image
+          :src="orderInfo.djkOrderAttachInfo?.goodsImg?.split(',')[0]"
+          class="h160rpx w160rpx flex-shrink-0 rounded-16rpx"
+        />
+        <view class="ml20rpx flex-1">
+          <view class="text-32rpx font-semibold">
+            {{ orderInfo.djkOrderAttachInfo?.goodsName }}
+          </view>
+          <view class="mt16rpx text-24rpx text-gray">
+            有效期{{ orderInfo.djkOrderAttachInfo?.effectiveTime }}天·需提前{{ orderInfo.djkOrderAttachInfo?.advanceBookingTime }}天预约
+          </view>
+          <view class="mt16rpx flex items-center justify-between">
+            <view class="text-36rpx text-#FF4D3A font-semibold">
+              <text class="text-20rpx">
+                ¥
+              </text> {{ orderInfo.djkOrderAttachInfo?.price }}
+            </view>
+            <view class="text-24rpx text-gray">
+              x{{ orderInfo.djkOrderAttachInfo?.goodsNum }}
+            </view>
+          </view>
+        </view>
+      </view>
+      <view class="mt-20rpx rounded-16rpx bg-white p-24rpx">
+        <view class="flex items-center justify-between">
+          <view class="text-28rpx text-gray">
+            商品金额
+          </view>
+          <view class="text-28rpx font-semibold">
+            ¥{{ orderInfo.djkOrderAttachInfo?.price }}
+          </view>
+        </view>
+        <view class="mt20rpx flex items-center justify-between">
+          <view class="text-28rpx text-gray">
+            积分{{ orderInfo.offsetPoints ? `(${orderInfo.offsetPoints})` : '' }}
+          </view>
+          <view class="text-28rpx text-#FF4D3A font-semibold">
+            -¥{{ Number(orderInfo.offsetPoints) / 100 }}
+          </view>
+        </view>
+        <view class="my20rpx h2rpx w-full bg-#F0F0F0" />
+        <view class="mt20rpx flex items-center justify-between">
+          <view class="text-28rpx text-gray">
+            总计
+          </view>
+          <view class="text-28rpx font-semibold">
+            ¥{{ orderInfo.actualTotal }}
+          </view>
+        </view>
+      </view>
+      <view class="mt20rpx rounded-16rpx bg-white p24rpx">
+        <view class="mt20rpx h160rpx flex items-center justify-between bg-cover bg-center px24rpx" :style="{ backgroundImage: `url(${StaticUrl}/djk-shop-nav-bg.png)` }">
+          <view class="flex items-center">
+            {{ orderInfo.shopInfo?.shopName }}
+          </view>
+          <view class="flex items-center">
+            <view class="mr40rpx flex flex-col items-center justify-center" @click="handleNav">
+              <image
+                :src="`${StaticUrl}/djk-shop-dh.png`"
+                class="h40rpx w40rpx"
+              />
+              <view class="mt20rpx text-28rpx">
+                导航
+              </view>
+            </view>
+            <view class="flex flex-col items-center justify-center" @click="handlePhone">
+              <image
+                :src="`${StaticUrl}/film-phone.png`"
+                class="h40rpx w40rpx"
+              />
+              <view class="mt20rpx text-28rpx">
+                电话
+              </view>
+            </view>
+          </view>
+        </view>
+      </view>
+      <view class="mt20rpx rounded-16rpx bg-white p24rpx">
+        <view class="text-32rpx font-semibold">
+          客户信息
+        </view>
+        <view class="mt20rpx text-24rpx">
+          {{ phoneFormat(String(orderInfo.consigneeMobile)) }}
+        </view>
+      </view>
+      <view class="mt20rpx rounded-16rpx bg-white p24rpx">
+        <view class="text-32rpx font-semibold">
+          退款规则
+        </view>
+        <view class="mt20rpx text-24rpx">
+          支付成功后,服务有效期为{{ orderInfo.djkOrderAttachInfo?.effectiveTime }}天
+        </view>
+        <view class="mt20rpx text-24rpx">
+          有效期内可自主申请退款
+        </view>
+        <view class="mt20rpx text-24rpx">
+          过期未使用将自动退款,无需申请
+        </view>
+        <view class="mt20rpx text-24rpx text-gray">
+          (积分支付的,退还后积分过期后,也将不可使用)
+        </view>
+        <view class="mt20rpx text-24rpx">
+          已核销服务不可退款
+        </view>
+      </view>
+      <view class="mt-20rpx rounded-16rpx bg-white p-24rpx">
+        <view class="mb-24rpx text-28rpx font-semibold">
+          订单信息
+        </view>
+        <view class="pb-20rpx">
+          <view class="mb-28rpx flex items-center justify-between">
+            <view class="text-28rpx text-[#AAAAAA]">
+              订单号
+            </view>
+            <view class="flex items-center">
+              <text class="text-[#222]">
+                {{ orderInfo?.orderNumber }}
+              </text>
+              <view class="ml-10rpx" @click="handleCopy">
+                <wd-icon name="file-copy" size="22px" />
+              </view>
+            </view>
+          </view>
+          <view class="mb-28rpx flex items-center justify-between">
+            <view class="text-28rpx text-[#AAAAAA]">
+              下单时间
+            </view>
+            <view class="text-[#222]">
+              {{ orderInfo?.createTime }}
+            </view>
+          </view>
+        </view>
+      </view>
+      <view class="h-80rpx" />
+    </view>
+  </view>
+</template>
+
+<style scoped lang="scss">
+.page-xsb {
+  :deep() {
+    .info-btn .wd-button {
+      background: #fff !important;
+      color: #aaa !important;
+    }
+
+    .btn .wd-button {
+      width: 100% !important;
+    }
+
+    .wd-count-down {
+      color: #FF4D3A !important;
+      font-size: 36rpx !important;
+    }
+
+    .contact .wd-button {
+      font-size: 28rpx !important;
+      height: 40rpx !important;
+      padding: 0 !important;
+      margin-top: 40rpx !important;
+    }
+  }
+}
+</style>

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

@@ -0,0 +1,140 @@
+<script setup lang="ts">
+import { StaticUrl } from '@/config'
+import router from '@/router'
+
+definePage({ name: 'djk-shopinfo', islogin: false, style: { navigationBarTitleText: '商家主页' } })
+const shopInfo = ref<Api.DJKShopVO>()
+async function getShopInfo(shopId: number) {
+  const res = await Apis.djk.appletShopInfo({ data: { shopId } })
+  console.log(res)
+  shopInfo.value = res.data
+}
+onLoad((options: any) => {
+  getShopInfo(Number(options.id))
+})
+function handleNav() {
+  if (!shopInfo.value) {
+    useGlobalToast().show('商家信息获取失败!')
+    return
+  }
+  uni.openLocation({
+    latitude: Number(shopInfo.value.shopLat),
+    longitude: Number(shopInfo.value.shopLng),
+    fail: (e) => {
+      console.log(e, '打开失败')
+    },
+  })
+}
+function handlePhone() {
+  uni.makePhoneCall({
+    phoneNumber: String(shopInfo.value?.tel),
+  })
+}
+</script>
+
+<template>
+  <view v-if="shopInfo" class="py20rpx">
+    <scroll-view scroll-x class="box-border h165rpx w-full whitespace-nowrap pl24rpx">
+      <view class="w-full flex items-center">
+        <view v-for="item in shopInfo.shopLogo?.split(',')" :key="item" class="mr20rpx h164rpx w280rpx flex-shrink-0">
+          <image
+            :src="item"
+            class="h164rpx w280rpx rounded-16rpx"
+          />
+        </view>
+      </view>
+    </scroll-view>
+    <view class="mt20rpx px24rpx">
+      <view class="rounded-16rpx bg-white p24rpx">
+        <view class="flex items-center justify-between">
+          <view class="text-32rpx font-semibold">
+            {{ shopInfo.shopName }}
+          </view>
+          <view class="text-24rpx text-gray">
+            已售 {{ shopInfo.sales }}
+          </view>
+        </view>
+        <view class="mt20rpx text-24rpx text-#52c41a">
+          营业中 {{ shopInfo.businessTime }}
+        </view>
+        <view class="mt20rpx h160rpx flex items-center justify-between bg-cover bg-center px24rpx" :style="{ backgroundImage: `url(${StaticUrl}/djk-shop-nav-bg.png)` }">
+          <view class="line-clamp-2 w450rpx flex items-center">
+            <image
+              :src="`${StaticUrl}/location-black.png`"
+              class="mr16rpx h-33.8rpx min-w-28.97rpx w-28.97rpx"
+            />
+            {{ shopInfo.shopAddress }}
+          </view>
+          <view class="flex items-center">
+            <view class="mr40rpx flex flex-col items-center justify-center" @click="handleNav">
+              <image
+                :src="`${StaticUrl}/djk-shop-dh.png`"
+                class="h40rpx w40rpx"
+              />
+              <view class="mt20rpx text-28rpx">
+                导航
+              </view>
+            </view>
+            <view class="flex flex-col items-center justify-center" @click="handlePhone">
+              <image
+                :src="`${StaticUrl}/film-phone.png`"
+                class="h40rpx w40rpx"
+              />
+              <view class="mt20rpx text-28rpx">
+                电话
+              </view>
+            </view>
+          </view>
+        </view>
+      </view>
+      <view class="mt20rpx rounded-16rpx bg-white p24rpx">
+        <view class="mb20rpx flex items-center">
+          <view class="text-32rpx font-semibold">
+            精选商品
+          </view>
+          <view class="ml20rpx flex items-center text-22rpx">
+            <wd-icon name="check-circle" size="10px" color="#000" />
+            <view class="ml8rpx">
+              随时退
+            </view>
+          </view>
+          <view class="ml20rpx flex items-center text-22rpx">
+            <wd-icon name="check-circle" size="10px" color="#000" />
+            <view class="ml8rpx">
+              过期退
+            </view>
+          </view>
+        </view>
+        <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 shopInfo.goodsList" :key="item.id" class="overflow-hidden rounded-16rpx" @click="router.push({ name: 'djk-goods', params: { id: `${item.id}`, type: '0' } })">
+              <image
+                class="h318rpx w318rpx"
+                :src="item.goodsImg"
+              />
+              <view class="bg-#F9F9F9 p16rpx">
+                <view class="line-clamp-2 text-28rpx font-semibold">
+                  {{ item.goodsName }}
+                </view>
+                <view class="mt16rpx flex items-center justify-between">
+                  <view class="text-36rpx text-#FF4D3A font-semibold">
+                    <text class="text-24rpx">
+                      ¥
+                    </text> {{ item.price }}
+                  </view>
+                  <view class="text-gray">
+                    已售{{ item.sales }}
+                  </view>
+                </view>
+              </view>
+            </view>
+          </grid-view>
+        </scroll-view>
+      </view>
+    </view>
+  </view>
+</template>
+
+<style lang="scss" scoped>
+
+</style>

+ 168 - 0
src/subPack-djk/welfare/index.vue

@@ -0,0 +1,168 @@
+<script setup lang="ts">
+import router from '@/router'
+
+definePage({ name: 'djk-welfare', islogin: false, style: { navigationBarTitleText: '活动详情' } })
+const welfare = ref<Api.DjkWelfareVO>()
+const show = ref(false)
+const isAllow = ref(true)
+const isEdit = ref(false)
+
+onLoad((options: any) => {
+  getWelfare(options.id)
+})
+const mapUser = ['全部用户', '仅限新用户', '特定用户标签', '指定用户']
+const phone = ref(useUserStore().userInfo.mobile)
+const selectGoods = ref<Api.PmsDjkGoods>()
+const subLoding = ref(false)
+async function getWelfare(id: number) {
+  const res = await Apis.djk.welfareInfo({ data: { id } })
+  welfare.value = res.data
+}
+async function handleSelect(item: Api.PmsDjkGoods) {
+  show.value = true
+  selectGoods.value = item
+}
+async function handelSubmit() {
+  uni.showLoading({ mask: true })
+  subLoding.value = true
+  try {
+    await Apis.djk.welfareClaimInfo({
+      data: {
+        welfareId: Number(welfare.value?.id),
+        goodsId: selectGoods.value?.id,
+        memberId: useUserStore().userInfo.id,
+        customerAuthorization: boolToNumber(isAllow.value),
+      },
+    })
+    const data = await Apis.djk.addWelfareOrder({ data: { welfareId: Number(welfare.value?.id), shopId: selectGoods.value?.shopId, channelId: useUserStore().userInfo.channelId, phone: phone.value, goodsId: selectGoods.value?.id, goodsNum: 1, customerAuthorization: boolToNumber(isAllow.value) } })
+    useGlobalToast().show('领取成功!')
+    uni.hideLoading()
+    show.value = false
+    setTimeout(() => {
+      router.push({
+        name: 'djk-orderDetaile',
+        params: { id: data.data },
+      })
+      subLoding.value = false
+    }, 1500)
+  }
+  catch {
+    uni.hideLoading()
+    subLoding.value = false
+    show.value = false
+    console.log('领取失败')
+  }
+}
+</script>
+
+<template>
+  <view v-if="welfare" class="p24rpx">
+    <view class="rounded-16rpx bg-white p24rpx">
+      <view class="text-36rpx font-semibold">
+        {{ welfare.activityName }}
+      </view>
+      <view class="my16rpx text-gray">
+        {{ mapUser[Number(welfare.activityUser) - 1] }},{{ welfare.claimLimit ? `每个用户限领${welfare.claimNum}次` : '不限次数' }}
+      </view>
+      <view class="text-24rpx">
+        领取:{{ welfare.quantityClaimed }}/{{ welfare.inventory }}
+      </view>
+    </view>
+    <view class="mt20rpx rounded-16rpx bg-white p24rpx">
+      <view class="text-28rpx">
+        请选择商品(二选一)
+      </view>
+      <view v-for="item, idx in welfare.welfareGoodList" :key="item.id" class="mt20rpx">
+        <view class="flex" @click="router.push({ name: 'djk-goods', params: { id: `${item.id}`, type: '1' } })">
+          <image
+            :src="item.goodsImg?.split(',')[0]"
+            class="h160rpx w160rpx flex-shrink-0"
+          />
+          <view class="ml20rpx flex-1">
+            <view class="text-32rpx font-semibold">
+              {{ item.goodsName }}
+            </view>
+            <view class="mt20rpx flex items-center">
+              <view class="text-#FF4D3A font-semibold">
+                <text class="text-20rpx">
+                  福利价¥
+                </text> <text class="text-36rpx">
+                  0
+                </text>
+              </view>
+              <view class="ml16rpx text-24rpx text-gray line-through">
+                ¥{{ item.price }}
+              </view>
+            </view>
+          </view>
+        </view>
+        <view class="mt24rpx w-full flex items-center justify-center">
+          <wd-button size="small" @click="handleSelect(item)">
+            选择此套餐
+          </wd-button>
+        </view>
+        <view v-if=" idx == 0" class="mt24rpx h2rpx w-full bg-#F0F0F0" />
+      </view>
+    </view>
+    <view class="mt20rpx rounded-16rpx bg-white p24rpx">
+      <view class="text-32rpx font-semibold">
+        活动规则说明:
+      </view>
+      <view class="mt16rpx text-28rpx">
+        1.福利商品不可退款,不可转让;
+      </view>
+      <view class="mt16rpx text-28rpx">
+        2.到店使用需提前预约
+      </view>
+    </view>
+
+    <Zpopup v-model="show">
+      <view class="bg-white p24rpx">
+        <view class="text-center text-32rpx font-semibold">
+          确认选择
+        </view>
+        <view class="mt20rpx text-32rpx font-semibold">
+          您确认选择【{{ selectGoods?.goodsName }}】吗?
+        </view>
+        <view class="mt20rpx rounded-16rpx bg-white p24rpx">
+          <view class="flex items-center justify-between">
+            <view class="text-28rpx text-gray">
+              允许商户通过此号码致电沟通到店时间
+            </view>
+            <wd-checkbox v-model="isAllow" />
+          </view>
+          <view class="mt16rpx flex items-center text-28rpx">
+            <view v-if="!isEdit" class="mr10rpx">
+              {{ phone?.replace(/^(\d{3})\d{4}(\d{4})$/, '$1****$2') }}
+            </view>
+            <view v-else>
+              <input v-model="phone" type="number" :maxlength="11" :focus="isEdit" @blur="isEdit = false">
+            </view>
+            <view v-if="!isEdit" class="flex items-center" @click="isEdit = true">
+              <view class="mr5rpx">
+                修改
+              </view>
+              <wd-icon name="arrow-right" size="18px" color="#000" />
+            </view>
+          </view>
+        </view>
+      </view>
+      <template #footer>
+        <view class="flex items-center justify-between">
+          <view class="w48%">
+            <wd-button block type="info" @click="show = false">
+              取消
+            </wd-button>
+          </view>
+          <view class="w48%">
+            <wd-button block :loading="subLoding" @click="handelSubmit">
+              确认领取
+            </wd-button>
+          </view>
+        </view>
+      </template>
+    </Zpopup>
+  </view>
+</template>
+
+<style lang="scss" scoped></style>

+ 2 - 3
src/subPack-film/order-detail/index.vue

@@ -1,6 +1,5 @@
 <script setup lang="ts">
 import { filterDay, timeFormat } from '../utils'
-import { OrderStatus, handleCommonOrderStatusText } from '../utils/order-data'
 import { StaticUrl } from '@/config'
 
 definePage({
@@ -79,10 +78,10 @@ onLoad((options) => {
 </script>
 
 <template>
-  <view class="film-order-detail">
+  <view v-if="orderInfo" class="film-order-detail">
     <view class="status">
       <!-- 支付成功,待出票  -->
-      {{ orderInfo.hbOrderStatus == 0 ? "待支付" : handleCommonOrderStatusText(orderInfo) }}
+      {{ orderInfo.hbOrderStatus == 0 ? "待支付" : useUserStore().handleFilmCommonOrderStatusText(orderInfo) }}
     </view>
     <view class="status-desc">
       如需改签、退款,请直接联系商家

+ 5 - 110
src/subPack-film/order/index.vue

@@ -1,11 +1,7 @@
 <script setup lang="ts">
 import Tabbar from '../components/tabbar.vue'
-import { OrderStatus, handleCommonCancelOrder, handleCommonOrderStatusText } from '../utils/order-data'
-import { getWxCommonPayment, handleCommonPayMent } from '../utils/confirm-order'
-// import { StaticUrl } from '@/config'
-import { timeFormat } from '../utils'
 import { createGlobalLoadingMiddleware } from '@/api/core/middleware'
-import router from '@/router'
+import filmOrderList from '@/subPack-smqjh/components/film-orderList/film-orderList.vue?async'
 
 definePage({
   name: 'film-order',
@@ -14,6 +10,7 @@ definePage({
     navigationBarTitleText: '我的订单',
     backgroundColorBottom: '#fff',
   },
+
 })
 
 const orderStatus = ref('all')
@@ -51,34 +48,6 @@ function handleItem(value: string) {
   reload()
 }
 
-async function handlePay(orderNumber: string) {
-  const res = await handleCommonPayMent(orderNumber)
-  if (res.payType !== 1) {
-    await getWxCommonPayment(res)
-  }
-  else {
-    reload()
-  }
-}
-async function handleCancel(order: Api.xsbOrderList) {
-  await handleCommonCancelOrder(order)
-  reload()
-}
-function handleCopy(data: string) {
-  uni.setClipboardData({
-    data,
-    showToast: true,
-  })
-}
-function handleOrder(orderNo: string) {
-  router.push({
-    name: 'film-order-detail',
-    params: {
-      orderNo,
-    },
-  })
-}
-
 onReachBottom(() => {
   if (!isLastPage.value) {
     page.value++
@@ -102,83 +71,9 @@ onLoad(() => {
     </view>
 
     <!-- 列表 -->
-    <view class="order-list">
-      <view
-        v-for="(item, index) in orderList" :key="index" class="order-item block"
-        @click.self="handleOrder(item.orderNumber as string)"
-      >
-        <view class="top-box">
-          <view class="title">
-            {{ item.movieName }}
-          </view>
-          <view class="status">
-            <template v-if="item.hbOrderStatus === OrderStatus.PaddingPay">
-              <view class="flex items-center">
-                待支付( 还剩 <wd-count-down :time="handleCommonOrderStatusText(item)" @finish="refresh" /> )
-              </view>
-            </template>
-            <text v-else>
-              {{ handleCommonOrderStatusText(item) }}
-            </text>
-          </view>
-        </view>
-        <!-- <view class="status-box">
-          <view class="reason-box">
-            <image class="icon" :src="`${StaticUrl}/film-error.png`" mode="scaleToFill" />
-            <view class="reason">
-              订单取消原因
-            </view>
-          </view>
-          <view class="info">
-            退款金额 ¥240 预计1-3个工作日到账
-          </view>
-        </view> -->
-
-        <view class="info-box">
-          <image class="img" :src="item.orderImage" mode="scaleToFill" />
-          <view class="info">
-            <view class="info-item">
-              影院:{{ item.cinemaName }}
-            </view>
-            <view class="info-item">
-              场次:{{ timeFormat(item.session) }}
-            </view>
-            <view class="info-item">
-              数量:{{ item.orderMovieItems?.length }}张
-            </view>
-            <view class="info-item">
-              总价:¥{{ item.orderMoney }}
-            </view>
-          </view>
-        </view>
-        <view class="btn-box">
-          <template v-if="item.hbOrderStatus === OrderStatus.PaddingPay">
-            <!-- 待支付 -->
-            <view
-              class="btn cancel"
-              custom-style="width: 128rpx;height: 38rpx;font-size: 24rpx;color: #AAAAAA;box-sizing: border-box;"
-              @click.stop="handleCancel(item)"
-            >
-              取消订单
-            </view>
-            <view
-              class="btn"
-              custom-style="width: 128rpx;height: 38rpx;font-size: 24rpx;color: #222222;box-sizing: border-box"
-              @click.stop="handlePay(item.orderNumber as string)"
-            >
-              付款
-            </view>
-          </template>
-          <wd-button
-            v-if="item.orderMovieItems[0].ticketCode"
-            custom-style="width: 188rpx;height: 44rpx;font-size: 28rpx;box-sizing: border-box"
-            @click.stop="handleCopy(item.orderMovieItems[0].ticketCode as string)"
-          >
-            复制取票码
-          </wd-button>
-        </view>
-      </view>
-    </view>
+    <template v-for="(item, index) in orderList" :key="index">
+      <filmOrderList :order="item" @refresh="refresh" />
+    </template>
 
     <wd-loadmore :state="state" :loading-props="{ color: '#9ED605', size: 20 }" @reload="reload" />
   </view>

+ 5 - 5
src/subPack-film/select-time/index.vue

@@ -151,20 +151,20 @@ onLoad((options) => {
     <view class="info-box">
       <view class="title-box">
         <view class="title">
-          {{ movieInfo.name }}
+          {{ movieInfo?.name }}
         </view>
         <view class="score">
-          评分{{ movieInfo.score }}
+          评分{{ movieInfo?.score }}
         </view>
       </view>
       <view class="info">
         <view class="time">
-          {{ movieInfo.duration }}分钟 |
+          {{ movieInfo?.duration }}分钟 |
         </view>
         <view class="type">
-          {{ movieInfo.category }}
+          {{ movieInfo?.category }}
         </view>
-        <view v-if="movieInfo.director" class="director">
+        <view v-if="movieInfo?.director" class="director">
           | {{ movieInfo.director }}
         </view>
       </view>

+ 2 - 4
src/subPack-film/submit-order/index.vue

@@ -1,5 +1,4 @@
 <script setup lang="ts">
-import { handleCommonPayMent, paySuccess } from '../utils/confirm-order'
 import { getArrayFieldMax, isWithin45Minutes, timeFormat } from '../utils/index'
 import router from '@/router'
 import { StaticUrl } from '@/config'
@@ -107,11 +106,10 @@ async function pay() {
     }
   })
   const { data: orderNumber } = await Apis.film.addFilmOrder({ data: query.value })
-  const res = await handleCommonPayMent(orderNumber)
+  const res = await useUserStore().handleCommonPayMent(orderNumber)
   loading.value = false
   if (res.payType !== 1) {
     // await getWxCommonPayment(res)
-    // await paySuccess()
     uni.showToast({
       title: '当前只支持积分支付',
       icon: 'none',
@@ -119,7 +117,7 @@ async function pay() {
     })
   }
   else {
-    await paySuccess()
+    await useUserStore().paySuccess('film-order', 'subPack-film/index/index')
   }
 }
 

+ 0 - 153
src/subPack-film/utils/confirm-order.ts

@@ -1,153 +0,0 @@
-import type { wxpay } from '@/api/globals'
-import router from '@/router'
-
-export function handleCommonPayMent(orderNumber: string): Promise<wxpay> {
-  return new Promise((resolve, reject) => {
-    if (!orderNumber) {
-      useGlobalToast().show({ msg: '订单号为空!请联系管理员' })
-      reject(new Error('订单号为空!请联系管理员'))
-      return
-    }
-    uni.showLoading({ mask: true })
-    Apis.common.hybridPayment({ data: { orderNumber } }).then((res) => {
-      resolve(res.data)
-      uni.hideLoading()
-    }).catch((err) => {
-      uni.hideLoading()
-      reject(err)
-    })
-  })
-}
-const { selectedAddress, userInfo } = storeToRefs(useUserStore())
-
-/**
- *
- * @param businessType
- * @param dvyType  配送类型 1:快递 2:自提 3:及时配送
- * @param remarks
- * @param shopId
- * @param orderItemList
- * @returns 下单获取待支付订单号
- */
-export function getOrderPayMent(freightFee: number, businessType: string, dvyType: number, shopId: number, orderItemList: {
-  prodCount?: number
-  skuId?: number
-}[], remarks?: string): Promise<string> {
-  uni.showLoading({ mask: true })
-  return new Promise((resolve, reject) => {
-    if (!selectedAddress.value) {
-      reject(new Error('请选择收货地址'))
-      return
-    }
-    Apis.common.addOrder({
-      data: {
-        channelId: Number(unref(userInfo).channelId),
-        businessType,
-        addressId: selectedAddress.value.id,
-        dvyType,
-        freightAmount: freightFee,
-        shopId,
-        orderItemList,
-        remarks,
-      },
-    }).then((res) => {
-      resolve(res.data)
-      uni.hideLoading()
-    }).catch((err) => {
-      uni.hideLoading()
-      reject(err)
-    })
-  })
-}
-/**
- *
- * @param orderInfo
- * @returns 统一拉起微信支付
- */
-
-export function getWxCommonPayment(orderPay: wxpay) {
-  uni.showLoading({ mask: true })
-  return new Promise((resolve, reject) => {
-    const orderInfo = {
-      appid: orderPay.appId,
-      timeStamp: orderPay.timeStamp,
-      nonceStr: orderPay.nonceStr,
-      package: orderPay.package,
-      signType: orderPay.signType,
-      paySign: orderPay.paySign,
-    }
-    uni.requestPayment({
-      provider: 'wxpay',
-      orderInfo,
-      ...orderInfo,
-      success(res) {
-        resolve(res)
-      },
-      fail(e) {
-        console.log(e, '失败')
-
-        reject(e)
-      },
-      complete() {
-        uni.hideLoading()
-      },
-    })
-  })
-}
-
-/**
- * 电影
- * 支付成功统一跳转
- */
-export function paySuccess() {
-  return new Promise((resolve) => {
-    const { paySuccessPath, payBackIndexPath } = storeToRefs(useSysStore())
-    paySuccessPath.value = 'film-order'
-    payBackIndexPath.value = 'subPack-flim/index/index'
-    router.replace({ name: 'common-paySuccess' })
-    setTimeout(() => {
-      resolve(1)
-    }, 2000)
-  })
-}
-/**
- * 电影
- * 支付成功统一跳转
- */
-export function payError() {
-  return new Promise((resolve) => {
-    const { paySuccessPath, payBackIndexPath } = storeToRefs(useSysStore())
-    paySuccessPath.value = 'xsb-order'
-    payBackIndexPath.value = 'subPack-xsb/commonTab/index'
-    router.replace({ name: 'common-payError' })
-    setTimeout(() => {
-      resolve(1)
-    }, 2000)
-  })
-}
-
-/**
- * 支付成功清空购买的商品的购物车
- */
-
-export async function clearCart(skuList: Api.CartSkuVo[]) {
-  uni.showLoading({ mask: true })
-  return new Promise((resolve) => {
-    const skuids = skuList.map(item => item.id).join(',')
-    if (skuids.length) {
-      Apis.common.deleteShoppingCart({
-        pathParams: {
-          ids: skuids,
-        },
-      }).then(async (res) => {
-        resolve(res)
-        await useSmqjhCartStore().getCartList('XSB')
-        uni.hideLoading()
-      }).finally(() => resolve(1))
-    }
-    else {
-      resolve(1)
-      uni.hideLoading()
-    }
-  })
-}

+ 0 - 156
src/subPack-film/utils/order-data.ts

@@ -1,156 +0,0 @@
-import { dayjs } from 'wot-design-uni'
-
-export const navTabTypeList = [
-  { name: '全部', value: 0 },
-  { name: '配送(外卖)', value: 3 },
-  { name: '快递', value: 1 },
-]
-
-export const orderStatusList = [
-  { name: '全部', value: 'all' },
-  { name: '待支付', value: 'paddingPay' },
-  { name: '进行中', value: 'ing' },
-  { name: '已完成', value: 'completed' },
-  { name: '已取消', value: 'cancel' },
-]
-export enum OrderStatus {
-  /**
-   * 待支付
-   */
-  PaddingPay = 0,
-  /**
-   * 订单已接单
-   */
-  OrderAccepted = 20,
-  /**
-   * 订单待配送
-   */
-  OrderWaitDelivery = 30,
-  /**
-   * 订单配送中
-   */
-  OrderDelivering = 40,
-  /**
-   * 订单取消审核
-   */
-  OrderCancelAudit = 50,
-  /**
-   * 订单取消
-   */
-  OrderCancel = 60,
-  /**
-   * 订单已送达
-   */
-  OrderArrived = 70,
-  /**
-   * 订单完成
-   */
-  OrderCompleted = 80,
-}
-
-/**
- * 订单状态文字统一处理
- * @param order
- *
- */
-export function handleCommonOrderStatusText(order: Api.xsbOrderList): any {
-  if (order.hbOrderStatus === OrderStatus.PaddingPay) {
-    const endTime = dayjs(order.createTime).add(16, 'minutes')
-    const remaining = dayjs(endTime).valueOf() - dayjs().valueOf()
-    return Math.max(0, remaining) // 确保不会返回负数
-  }
-
-  if (order.hbOrderStatus === OrderStatus.OrderAccepted) {
-    return '待出票'
-  }
-  if (order.hbOrderStatus === OrderStatus.OrderWaitDelivery) {
-    return '订单待配送'
-  }
-  if (order.hbOrderStatus === OrderStatus.OrderDelivering) {
-    return '出票中'
-  }
-  if (order.hbOrderStatus === OrderStatus.OrderCancelAudit) {
-    return '订单取消审核'
-  }
-  if (order.hbOrderStatus === OrderStatus.OrderCancel) {
-    return '订单取消'
-  }
-  if (order.hbOrderStatus === OrderStatus.OrderArrived) {
-    return '订单完成'
-  }
-  if (order.hbOrderStatus === OrderStatus.OrderCompleted) {
-    return '订单完成'
-  }
-  return '未知订单状态'
-}
-
-/**
- *  统一取消订单逻辑处理
- * @param order
- */
-export function handleCommonCancelOrder(order: Api.xsbOrderList) {
-  console.log(order, '取消顶顶顶')
-
-  return new Promise((resolve, reject) => {
-    useGlobalMessage().confirm({
-      title: '取消订单',
-      msg: '确定要取消订单吗?',
-      success: async () => {
-        uni.showLoading({ mask: true })
-        Apis.xsb.cancelOrder({
-          data: {
-            orderNo: String(order.orderNumber),
-          },
-        }).then(res => resolve(res)).catch(err => reject(err)).finally(() => uni.hideLoading())
-      },
-      fail: async (err) => {
-        reject(err)
-      },
-    })
-  })
-}
-
-/**
- * 统一删除订单
- */
-export function handleCommonDeleteOrder(order: Api.xsbOrderList) {
-  return new Promise((resolve, reject) => {
-    useGlobalMessage().confirm({
-      title: '删除订单',
-      msg: '确定要删除该订单吗?',
-      success: async () => {
-        uni.showLoading({ mask: true })
-        Apis.xsb.deleteOrder({
-          pathParams: {
-            ids: String(order.orderId),
-          },
-        }).then(res => resolve(res)).catch(err => reject(err)).finally(() => uni.hideLoading())
-      },
-      fail: async (err) => {
-        reject(err)
-      },
-    })
-  })
-}
-
-/**
- * 统一确认收货
- */
-export function handleCommonOrderReceive(order: Api.xsbOrderList) {
-  return new Promise((resolve, reject) => {
-    useGlobalMessage().confirm({
-      title: '确认收货',
-      msg: '确定要确认收货吗?',
-      success: async () => {
-        uni.showLoading({ mask: true })
-        await Apis.xsb.confirmReceipt({
-          data: {
-            orderNumber: String(order.orderNumber),
-          },
-        })
-        resolve(1)
-      },
-      fail: err => reject(err),
-    })
-  })
-}

+ 29 - 0
src/subPack-refueling/commonTab/index.vue

@@ -0,0 +1,29 @@
+<script setup lang="ts">
+definePage({
+  name: 'refueling-tabbar',
+  islogin: false,
+  style: {
+    navigationBarTitleText: '加油',
+  },
+})
+
+function refuelingPay() {
+  console.log('触发跳转')
+  // router.push({ name: 'refueling-webview' })
+  uni.navigateToMiniProgram({
+    appId: 'wx0d252f6ed9755862', // 滴滴加油小程序appId
+    path: 'packageA/pages/open-energy-pay/index?orderId=&tradeId=&appId=wx43b5b906cc30ed0b&path=/pages/index/index&envVersion=小程序回跳环境', // 滴滴加油收银台页面地址,需要拼接orderId和tradeId
+    envVersion: 'release', // 固定release
+  })
+}
+</script>
+
+<template>
+  <view class="">
+    <wd-button @click="refuelingPay">
+      加油充值
+    </wd-button>
+  </view>
+</template>
+
+<style lang="scss" scoped></style>

+ 18 - 0
src/subPack-refueling/webView/index.vue

@@ -0,0 +1,18 @@
+<script setup lang="ts">
+definePage({
+  name: 'refueling-webview',
+  islogin: false,
+  style: {
+    navigationBarTitleText: '支付',
+  },
+})
+const url = ref('https://static.am.xiaojukeji.com/cf-terminal/oil/thanos-fe-oil/pages/open-energy-h5-pay/index.html?orderId=3521815090950710849&tradeId=20260130e21328dee081108086896a3c4e630e9926408709&redirectUrl=')
+</script>
+
+<template>
+  <view class="">
+    <web-view :src="url" />
+  </view>
+</template>
+
+<style lang="scss" scoped></style>

+ 30 - 32
src/subPack-smqjh/components/charge-orderList/charge-orderList.vue

@@ -4,7 +4,7 @@ import router from '@/router'
 import { StaticUrl } from '@/config'
 
 defineProps<{
-  orderList: Api.xsbOrderList[]
+  order: Api.xsbOrderList
 }>()
 
 function handleItemClick(item: Api.xsbOrderList) {
@@ -30,43 +30,41 @@ function handleItemClick(item: Api.xsbOrderList) {
 </script>
 
 <template>
-  <view class="">
-    <view v-for="item in orderList" :key="item.orderNumber" class="mt-20rpx mt20rpx rounded-16rpx bg-#FFF p-24rpx" @click="handleItemClick(item)">
-      <view class="flex items-center justify-between">
-        <view>
-          <view class="text-28rpx font-bold">
-            {{ item.chargeOrder?.powerStationName }}
-          </view>
-          <view class="mt-20rpx text-24rpx text-#AAA">
-            订单时间:{{ item.createTime || '未知' }}
-          </view>
-          <view class="mt-20rpx text-24rpx text-#AAA">
-            终端编号:{{ item.chargeOrder?.connectorId || '未知' }}
-          </view>
+  <view class="mt-20rpx mt20rpx rounded-16rpx bg-#FFF p-24rpx" @click="handleItemClick(order)">
+    <view class="flex items-center justify-between">
+      <view>
+        <view class="text-28rpx font-bold">
+          {{ order.chargeOrder?.powerStationName }}
         </view>
-        <view class="text-center text-28rpx">
-          <image
-            class="h-64rpx w-64rpx"
-            :src="`${StaticUrl}/${chargeOrderStatus(item.hbOrderStatus).icon}.png`"
-          />
-          <view :style="{ color: chargeOrderStatus(item.hbOrderStatus).color }">
-            {{ chargeOrderStatus(item.hbOrderStatus).text }}
-          </view>
+        <view class="mt-20rpx text-24rpx text-#AAA">
+          订单时间:{{ order.createTime || '未知' }}
         </view>
-      </view>
-      <view class="my-20rpx h-2rpx w-full bg-#F0F0F0" />
-      <view class="flex items-center justify-between">
-        <view class="text-28rpx">
-          充电费用:
+        <view class="mt-20rpx text-24rpx text-#AAA">
+          终端编号:{{ order.chargeOrder?.connectorId || '未知' }}
         </view>
-        <view class="text-32rpx text-#FF6464 font-800">
-          <text class="text-18rpx">
-            ¥
-          </text>
-          {{ item.chargeOrder?.realCost }}
+      </view>
+      <view class="text-center text-28rpx">
+        <image
+          class="h-64rpx w-64rpx"
+          :src="`${StaticUrl}/${chargeOrderStatus(order.hbOrderStatus).icon}.png`"
+        />
+        <view :style="{ color: chargeOrderStatus(order.hbOrderStatus).color }">
+          {{ chargeOrderStatus(order.hbOrderStatus).text }}
         </view>
       </view>
     </view>
+    <view class="my-20rpx h-2rpx w-full bg-#F0F0F0" />
+    <view class="flex items-center justify-between">
+      <view class="text-28rpx">
+        充电费用:
+      </view>
+      <view class="text-32rpx text-#FF6464 font-800">
+        <text class="text-18rpx">
+          ¥
+        </text>
+        {{ order.chargeOrder?.realCost }}
+      </view>
+    </view>
   </view>
 </template>
 

+ 146 - 0
src/subPack-smqjh/components/djk-order/index.vue

@@ -0,0 +1,146 @@
+<script setup lang="ts">
+import router from '@/router'
+
+defineProps<{
+  order: Api.xsbOrderList
+}>()
+
+const _emit = defineEmits<{
+  refresh: []
+}>()
+
+async function handleCancel(order: Api.xsbOrderList) {
+  await useUserStore().handleCommonCancelOrder?.(order)
+  _emit('refresh')
+}
+
+async function handlePay(orderNumber: string) {
+  const res = await useUserStore().handleCommonPayMent?.(orderNumber)
+  if (res?.payType !== 1 && res) {
+    await useUserStore().getWxCommonPayment(res)
+    _emit('refresh')
+  }
+  else {
+    _emit('refresh')
+  }
+}
+
+async function handleSubmit(order: Api.xsbOrderList) {
+  await useUserStore().handleCommonOrderReceive(order)
+  _emit('refresh')
+}
+
+async function handleDel(order: Api.xsbOrderList) {
+  await useUserStore().handleCommonDeleteOrder(order)
+  _emit('refresh')
+}
+
+function handleClick(no: string) {
+  router.push({ name: 'djk-orderDetaile', params: { id: no } })
+}
+async function handleAfterSale(item: Api.xsbOrderList) {
+  router.push({
+    name: 'djk-afterSales',
+    params: { data: JSON.stringify(item) },
+  })
+}
+</script>
+
+<template>
+  <view class="mb-20rpx rounded-16rpx bg-white p-24rpx">
+    <view @click="handleClick(order.orderNumber as string)">
+      <view class="flex items-center justify-between">
+        <view class="flex items-center">
+          <view class="text-32rpx font-semibold">
+            {{ order.shopName }}
+          </view>
+        </view>
+        <view class="text-24rpx">
+          <template v-if="order.hbOrderStatus !== OrderStatus.PaddingPay">
+            {{ useUserStore().handleDjkCommonOrderStatusText(order) }}
+          </template>
+          <template v-else>
+            <view class="down flex items-center text-[#449DFE]">
+              待支付( 还剩 <wd-count-down :time="useUserStore().handleXSBCommonOrderStatusText(order)" @finish="$emit('refresh')">
+                <template #default="{ current }">
+                  <view class="text-24rpx text-[#449DFE]">
+                    {{ current.minutes }}:{{ current.seconds }}
+                  </view>
+                </template>
+              </wd-count-down> )
+            </view>
+          </template>
+        </view>
+      </view>
+      <view
+        class="mt20rpx box-border w-full flex items-center"
+      >
+        <image
+          :src="order.djkOrderAttachInfo?.goodsImg?.split(',')[0]"
+          class="h160rpx w160rpx flex-shrink-0 rounded-16rpx"
+        />
+        <view class="ml20rpx box-border flex-1">
+          <view class="w-full flex items-center">
+            <view v-if="order.djkOrderAttachInfo?.djkOrderType" class="mr5rpx w60rpx flex-shrink-0">
+              <wd-tag type="danger">
+                福利
+              </wd-tag>
+            </view>
+            <view class="w386rpx truncate text-32rpx font-semibold">
+              {{ order.djkOrderAttachInfo?.goodsName }}
+            </view>
+          </view>
+          <view class="text-24rpx">
+            <view class="mt5rpx">
+              订单号:{{ order.djkOrderAttachInfo?.orderNumber }}
+            </view>
+            <view class="mt5rpx">
+              ¥{{ order.djkOrderAttachInfo?.price }} 有效期{{ order.djkOrderAttachInfo?.effectiveTime }}天
+            </view>
+            <view class="mt5rpx">
+              {{ phoneFormat(String(order.consigneeMobile)) }}
+            </view>
+          </view>
+        </view>
+      </view>
+    </view>
+    <view class="my-24rpx flex items-center justify-end">
+      <template v-if="order.hbOrderStatus === OrderStatus.PaddingPay">
+        <view class="mr-20rpx">
+          <wd-button size="small" plain type="info" @click.stop="handleCancel(order)">
+            取消订单
+          </wd-button>
+        </view>
+        <view class="mr-20rpx">
+          <wd-button size="small" plain type="error" @click.stop="handlePay(order.orderNumber as string)">
+            付款
+          </wd-button>
+        </view>
+      </template>
+      <template v-if="[OrderStatus.OrderCancel, OrderStatus.OrderCompleted].includes(order.hbOrderStatus) ">
+        <view class="mr-20rpx">
+          <wd-button size="small" plain type="info" @click.stop="handleDel(order)">
+            删除订单
+          </wd-button>
+        </view>
+      </template>
+      <template v-if="order.hbOrderStatus === OrderStatus.OrderArrived">
+        <view class="mr-20rpx">
+          <wd-button size="small" plain type="info" @click.stop="handleSubmit(order)">
+            确认收货
+          </wd-button>
+        </view>
+      </template>
+      <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>
+    </view>
+  </view>
+</template>
+
+<style lang="scss" scoped>
+</style>

+ 26 - 44
src/subPack-smqjh/components/film-orderList/film-orderList.vue

@@ -1,42 +1,27 @@
 <script setup lang="ts">
-// import { StaticUrl } from '@/config'
 import router from '@/router'
 
-const props = defineProps<{
-  orderList: Api.xsbOrderList[]
-  subPackOrder?: typeof import('@/subPack-film/utils/order-data')
-  subPackConfirm?: typeof import('@/subPack-film/utils/confirm-order')
+defineProps<{
+  order: Api.xsbOrderList
 }>()
 
 const _emit = defineEmits<{
-  'after-sale': [item: Api.xsbOrderList]
-  'refresh': []
+  refresh: []
 }>()
 
-function resolveModule<T = any>(maybeRef: any): T | undefined {
-  if (!maybeRef)
-    return undefined
-  if (maybeRef.value !== undefined)
-    return maybeRef.value as T
-  return maybeRef as T
-}
 async function handlePay(orderNumber: string) {
-  const spc = resolveModule(props.subPackConfirm)
-  if (!spc)
-    return
-  const res = await spc.handleCommonPayMent(orderNumber)
+  const res = await useUserStore().handleCommonPayMent(orderNumber)
   if (res.payType !== 1) {
-    await getWxCommonPayment(res)
+    // await useUserStore().getWxCommonPayment(res, 1)
+    useGlobalToast().show('当前只支持积分支付')
   }
   else {
     _emit('refresh')
   }
 }
+
 async function handleCancel(order: Api.xsbOrderList) {
-  const sp = resolveModule(props.subPackOrder)
-  if (!sp)
-    return
-  await handleCommonCancelOrder(order)
+  await useUserStore().handleCommonCancelOrder(order)
   _emit('refresh')
 }
 function handleCopy(data: string) {
@@ -54,31 +39,28 @@ function handleOrder(orderNo: string) {
     },
   })
 }
-onMounted(() => {
-  console.log('mounted', props.orderList)
-})
 </script>
 
 <template>
   <view
-    v-for="(item, index) in props.orderList" :key="index" class="order-item block"
-    @click.self="handleOrder(item.orderNumber as string)"
+    class="blockc order-item"
+    @click.self="handleOrder(order.orderNumber as string)"
   >
     <view class="top-box">
       <view class="title">
-        {{ item.movieName }}
+        {{ order.movieName }}
       </view>
       <view class="status">
-        <template v-if="item.hbOrderStatus === props.subPackOrder?.OrderStatus.PaddingPay">
+        <template v-if="order.hbOrderStatus === OrderStatus.PaddingPay">
           <view class="flex items-center">
             待支付( 还剩 <wd-count-down
-              :time="props.subPackOrder?.handleCommonOrderStatusText(item)"
+              :time="useUserStore().handleFilmCommonOrderStatusText(order)"
               @finish="() => _emit('refresh')"
             /> )
           </view>
         </template>
         <text v-else>
-          {{ props.subPackOrder?.handleCommonOrderStatusText(item) }}
+          {{ useUserStore().handleFilmCommonOrderStatusText(order) }}
         </text>
       </view>
     </view>
@@ -95,44 +77,44 @@ onMounted(() => {
         </view> -->
 
     <view class="info-box">
-      <image class="img" :src="item.orderImage" mode="scaleToFill" />
+      <image class="img" :src="order.orderImage" mode="scaleToFill" />
       <view class="info">
         <view class="info-item">
-          影院:{{ item.cinemaName }}
+          影院:{{ order.cinemaName }}
         </view>
         <view class="info-item">
-          场次:{{ item.session.replace('T', ' ') }}
+          场次:{{ order.session.replace('T', ' ') }}
         </view>
         <view class="info-item">
-          数量:{{ item.orderMovieItems?.length }}张
+          数量:{{ order.orderMovieItems?.length }}张
         </view>
         <view class="info-item">
-          总价:¥{{ item.orderMoney }}
+          总价:¥{{ order.orderMoney }}
         </view>
       </view>
     </view>
     <view class="btn-box">
-      <template v-if="item.hbOrderStatus === props.subPackOrder?.OrderStatus.PaddingPay">
+      <template v-if="order.hbOrderStatus === OrderStatus.PaddingPay">
         <!-- 待支付 -->
         <view
           class="btn cancel"
           custom-style="width: 128rpx;height: 38rpx;font-size: 24rpx;color: #AAAAAA;box-sizing: border-box;"
-          @click.stop="handleCancel(item)"
+          @click.stop="handleCancel(order)"
         >
           取消订单
         </view>
         <view
           class="btn"
           custom-style="width: 128rpx;height: 38rpx;font-size: 24rpx;color: #222222;box-sizing: border-box"
-          @click.stop="handlePay(item.orderNumber as string)"
+          @click.stop="handlePay(order.orderNumber as string)"
         >
           付款
         </view>
       </template>
       <wd-button
-        v-if="item.orderMovieItems[0].ticketCode"
+        v-if="order.orderMovieItems[0].ticketCode"
         custom-style="width: 188rpx;height: 44rpx;font-size: 28rpx;box-sizing: border-box"
-        @click.stop="handleCopy(item.orderMovieItems[0].ticketCode as string)"
+        @click.stop="handleCopy(order.orderMovieItems[0].ticketCode as string)"
       >
         复制取票码
       </wd-button>
@@ -141,11 +123,11 @@ onMounted(() => {
 </template>
 
 <style lang="scss" scoped>
-.block {
+.blockc {
   background: #FFFFFF;
   border-radius: 16rpx 16rpx 16rpx 16rpx;
   padding: 24rpx;
-  margin-bottom: 20rpx;
+  margin-top: 20rpx;
 }
 
   .order-item {

+ 61 - 0
src/subPack-smqjh/components/videoRights-orderList/videoRights-orderList.vue

@@ -0,0 +1,61 @@
+<script setup lang="ts">
+import router from '@/router'
+import { StaticUrl } from '@/config'
+
+defineProps<{
+  order: Api.xsbOrderList
+}>()
+
+function handleItemClick(item: Api.xsbOrderList) {
+  const orderNumber = item.orderNumber
+  if (orderNumber) {
+    router.push({
+      name: 'video-rights-order-info',
+      params: { orderNo: orderNumber },
+    })
+  }
+  else {
+    console.warn('订单号不存在,无法跳转到详情页')
+  }
+}
+</script>
+
+<template>
+  <view class="mb-28rpx rounded-16rpx bg-#FFF p-24rpx" @click="handleItemClick(order)">
+    <view class="flex items-center justify-between">
+      <view class="text-28rpx">
+        {{ order.createTime }}
+      </view>
+      <view class="text-28rpx font-bold">
+        {{ order.rechargeStatusDesc }}
+      </view>
+    </view>
+    <view class="mt-24rpx h-2rpx w-full bg-#F0F0F0" />
+    <view class="mt-24rpx flex items-center justify-between">
+      <view class="flex items-center gap-20rpx">
+        <view class="h-160rpx w-160rpx">
+          <image class="h-160rpx w-160rpx" :src="`${StaticUrl}/list-page-img.png`" />
+        </view>
+        <view>
+          <view class="text-32rpx font-bold">
+            {{ order?.orderItemList?.[0]?.prodName || '' }}
+          </view>
+          <view class="mt-16rpx text-#FF4D3A">
+            <text class="text-22rpx font-500">
+              ¥
+            </text>
+            <text class="text-36rpx font-800">
+              {{ order?.orderItemList?.[0]?.price || 0 }}
+            </text>
+          </view>
+          <view class="mt-16rpx text-24rpx">
+            {{ order.orderNumber }}
+          </view>
+        </view>
+      </view>
+      <wd-icon name="chevron-right" size="22px" color="#222222" />
+    </view>
+  </view>
+</template>
+
+<style lang="scss" scoped></style>

+ 43 - 50
src/subPack-smqjh/components/xsb-orderList/xsb-orderList.vue

@@ -2,40 +2,24 @@
 import { StaticUrl } from '@/config'
 import router from '@/router'
 
-const props = defineProps<{
-  orderList: Api.xsbOrderList[]
-  subPackOrder?: typeof import('@/subPack-xsb/utils/order-data')
-  subPackConfirm?: typeof import('@/subPack-xsb/utils/confirm-order')
+defineProps<{
+  order: Api.xsbOrderList
 }>()
 
 const _emit = defineEmits<{
-  'after-sale': [item: Api.xsbOrderList]
-  'refresh': []
+  refresh: []
 }>()
 
-function resolveModule<T = any>(maybeRef: any): T | undefined {
-  if (!maybeRef)
-    return undefined
-  if (maybeRef.value !== undefined)
-    return maybeRef.value as T
-  return maybeRef as T
-}
-
 async function handleCancel(order: Api.xsbOrderList) {
-  const sp = resolveModule(props.subPackOrder)
-  if (!sp)
-    return
-  await sp.handleCommonCancelOrder?.(order)
+  await useUserStore().handleCommonCancelOrder?.(order)
   _emit('refresh')
 }
 
 async function handlePay(orderNumber: string) {
-  const spc = resolveModule(props.subPackConfirm)
-  if (!spc)
-    return
-  const res = await spc.handleCommonPayMent?.(orderNumber)
+  const res = await useUserStore().handleCommonPayMent?.(orderNumber)
   if (res?.payType !== 1 && res) {
-    await spc.getWxCommonPayment?.(res)
+    await useUserStore().getWxCommonPayment(res)
+    _emit('refresh')
   }
   else {
     _emit('refresh')
@@ -43,42 +27,49 @@ async function handlePay(orderNumber: string) {
 }
 
 async function handleSubmit(order: Api.xsbOrderList) {
-  const sp = resolveModule(props.subPackOrder)
-  if (!sp)
-    return
-  await sp.handleCommonOrderReceive?.(order)
+  await useUserStore().handleCommonOrderReceive(order)
   _emit('refresh')
 }
 
 async function handleDel(order: Api.xsbOrderList) {
-  const sp = resolveModule(props.subPackOrder)
-  if (!sp)
-    return
-  await sp.handleCommonDeleteOrder?.(order)
+  await useUserStore().handleCommonDeleteOrder(order)
   _emit('refresh')
 }
 
 function handleClick(no: string) {
   router.push({ name: 'xsb-orderDetaile', params: { id: no } })
 }
+async function handleAfterSale(item: Api.xsbOrderList) {
+  if (!item.orderItemList) {
+    useGlobalToast().show('商品异常!')
+    return
+  }
+  await useSysStore().getRefunOrder(item.orderNumber as string)
+}
 </script>
 
 <template>
-  <view v-for="item in orderList" :key="item.orderNumber" class="mt-20rpx rounded-16rpx bg-white p-24rpx">
+  <view class="mt-20rpx rounded-16rpx bg-white p-24rpx">
     <view class="flex items-center justify-between">
       <view class="flex items-center">
         <image :src="`${StaticUrl}/order-icon.png`" class="h-36rpx w-36rpx" />
         <view class="ml-20rpx text-32rpx font-semibold">
-          {{ item.shopName }}
+          {{ order.shopName }}
         </view>
       </view>
       <view class="text-24rpx text-[#FF4D3A]">
-        <template v-if="item.hbOrderStatus !== props.subPackOrder?.OrderStatus.PaddingPay">
-          {{ props.subPackOrder?.handleCommonOrderStatusText(item) }}
+        <template v-if="order.hbOrderStatus !== OrderStatus.PaddingPay">
+          {{ useUserStore().handleXSBCommonOrderStatusText(order) }}
         </template>
         <template v-else>
           <view class="flex items-center">
-            待支付( 还剩 <wd-count-down :time="props.subPackOrder?.handleCommonOrderStatusText(item)" @finish="$emit('refresh')" /> )
+            待支付( 还剩 <wd-count-down :time="useUserStore().handleXSBCommonOrderStatusText(order)" @finish="$emit('refresh')">
+              <template #default="{ current }">
+                <view class="text-24rpx text-[#FF4D3A]">
+                  {{ current.minutes }}:{{ current.seconds }}
+                </view>
+              </template>
+            </wd-count-down> )
           </view>
         </template>
       </view>
@@ -101,12 +92,12 @@ function handleClick(no: string) {
           </view> -->
       <view
         class="box-border h-176rpx w-full flex items-center justify-between rounded-16rpx bg-[#F9F9F9]"
-        @click="handleClick(item.orderNumber as string)"
+        @click="handleClick(order.orderNumber as string)"
       >
         <view class="box-border h-full w-480rpx py-28rpx pl-20rpx">
           <scroll-view scroll-x class="h-full w-full whitespace-nowrap">
             <view class="flex items-center">
-              <view v-for="goods in item.orderItemList" :key="goods.skuId" class="mr-50rpx">
+              <view v-for="goods in order.orderItemList" :key="goods.skuId" class="mr-50rpx">
                 <image :src="goods.pic" class="h-120rpx w-120rpx" />
               </view>
             </view>
@@ -114,44 +105,44 @@ function handleClick(no: string) {
         </view>
         <view class="box-shadow box-border h-full flex-1 flex-shrink-0 px-14rpx py-40rpx">
           <view class="text-center text-32rpx text-[#FF4D3A] font-semibold">
-            ¥{{ item.actualTotal }}
+            ¥{{ order.actualTotal }}
           </view>
           <view class="text-center text-28rpx text-[#AAAAAA]">
-            共{{ item.goodsTotal }}件
+            共{{ order.goodsTotal }}件
           </view>
         </view>
       </view>
     </view>
     <view class="my-24rpx flex items-center justify-end">
-      <template v-if="item.hbOrderStatus === resolveModule(props.subPackOrder)?.OrderStatus.PaddingPay">
+      <template v-if="order.hbOrderStatus === OrderStatus.PaddingPay">
         <view class="mr-20rpx">
-          <wd-button size="small" plain type="info" @click.stop="handleCancel(item)">
+          <wd-button size="small" plain type="info" @click.stop="handleCancel(order)">
             取消订单
           </wd-button>
         </view>
         <view class="mr-20rpx">
-          <wd-button size="small" plain type="error" @click.stop="handlePay(item.orderNumber as string)">
+          <wd-button size="small" plain type="error" @click.stop="handlePay(order.orderNumber as string)">
             付款
           </wd-button>
         </view>
       </template>
-      <template v-if="[resolveModule(props.subPackOrder)?.OrderStatus.OrderCancel, resolveModule(props.subPackOrder)?.OrderStatus.OrderCompleted].includes(item.hbOrderStatus) ">
+      <template v-if="[OrderStatus.OrderCancel, OrderStatus.OrderCompleted].includes(order.hbOrderStatus) ">
         <view class="mr-20rpx">
-          <wd-button size="small" plain type="info" @click.stop="handleDel(item)">
+          <wd-button size="small" plain type="info" @click.stop="handleDel(order)">
             删除订单
           </wd-button>
         </view>
       </template>
-      <template v-if="item.hbOrderStatus === resolveModule(props.subPackOrder)?.OrderStatus.OrderArrived">
+      <template v-if="order.hbOrderStatus === OrderStatus.OrderArrived">
         <view class="mr-20rpx">
-          <wd-button size="small" plain type="info" @click.stop="handleSubmit(item)">
+          <wd-button size="small" plain type="info" @click.stop="handleSubmit(order)">
             确认收货
           </wd-button>
         </view>
       </template>
-      <template v-if="item.refundStatus != 2 && [resolveModule(props.subPackOrder)?.OrderStatus.OrderCompleted, resolveModule(props.subPackOrder)?.OrderStatus.OrderWaitDelivery, resolveModule(props.subPackOrder)?.OrderStatus.OrderAccepted].includes(item.hbOrderStatus) ">
+      <template v-if="order.refundStatus != 2 && [OrderStatus.OrderCompleted, OrderStatus.OrderWaitDelivery, OrderStatus.OrderAccepted].includes(order.hbOrderStatus) ">
         <view class="mr-20rpx">
-          <wd-button size="small" plain type="info" @click.stop="() => _emit('after-sale', item)">
+          <wd-button size="small" plain type="info" @click.stop="() => handleAfterSale(order)">
             申请售后
           </wd-button>
         </view>
@@ -160,4 +151,6 @@ function handleClick(no: string) {
   </view>
 </template>
 
-<style lang="scss" scoped></style>
+<style lang="scss" scoped>
+
+</style>

+ 20 - 48
src/subPack-smqjh/order/components/OrderRenderer.vue

@@ -2,63 +2,35 @@
 import chargeList from '../../components/charge-orderList/charge-orderList.vue'
 import xsbList from '../../components/xsb-orderList/xsb-orderList.vue'
 import filmList from '../../components/film-orderList/film-orderList.vue'
+import djkorder from '../../components/djk-order/index.vue'
+import videoRightsList from '../../components/videoRights-orderList/videoRights-orderList.vue'
 
 interface Props {
-  orderList: Api.xsbOrderList[]
-  navActiveTab: string
-  subPackOrder: any
-  subPackConfirm: any
+  orderList: Api.xsbOrderList
 }
 
 defineProps<Props>()
 
 defineEmits<{
-  'cancel': [order: Api.xsbOrderList]
-  'pay': [orderNumber: string]
-  'submit': [order: Api.xsbOrderList]
-  'del': [order: Api.xsbOrderList]
-  'after-sale': [item: Api.xsbOrderList]
-  'refresh': []
+  refresh: []
 }>()
-
-const subPackFilmOrder = ref<typeof import('@/subPack-film/utils/order-data')>()
-const subPackFilmComfirm = ref<typeof import('@/subPack-film/utils/confirm-order')>()
-
-onMounted(async () => {
-  subPackFilmOrder.value = await AsyncImport('@/subPack-film/utils/order-data')
-  subPackFilmComfirm.value = await AsyncImport('@/subPack-film/utils/confirm-order')
-})
 </script>
 
 <template>
-  <template v-if="navActiveTab === 'all'">
-    <template v-for="order in orderList" :key="order.orderNumber">
-      <xsbList
-        v-if="order.businessType === 'XSB'" :order-list="[order]" :sub-pack-order="subPackOrder"
-        :sub-pack-confirm="subPackConfirm" @cancel="$emit('cancel', $event)" @pay="$emit('pay', $event)"
-        @submit="$emit('submit', $event)" @del="$emit('del', $event)" @after-sale="$emit('after-sale', $event)"
-        @refresh="$emit('refresh')"
-      />
-      <chargeList v-else-if="order.businessType === 'CD'" :order-list="[order]" />
-      <filmList
-        v-else-if="order.businessType === 'DYY'" :order-list="[order]" :sub-pack-order="subPackFilmOrder"
-        :sub-pack-confirm="subPackFilmComfirm" @cancel="$emit('cancel', $event)" @pay="$emit('pay', $event)"
-        @submit="$emit('submit', $event)" @del="$emit('del', $event)" @after-sale="$emit('after-sale', $event)"
-        @refresh="$emit('refresh')"
-      />
-    </template>
-  </template>
-  <xsbList
-    v-else-if="navActiveTab === 'XSB'" :order-list="orderList" :sub-pack-order="subPackOrder"
-    :sub-pack-confirm="subPackConfirm" @cancel="$emit('cancel', $event)" @pay="$emit('pay', $event)"
-    @submit="$emit('submit', $event)" @del="$emit('del', $event)" @after-sale="$emit('after-sale', $event)"
-    @refresh="$emit('refresh')"
-  />
-  <chargeList v-else-if="navActiveTab === 'CD'" :order-list="orderList" />
-  <filmList
-    v-else-if="navActiveTab === 'DYY'" :order-list="orderList" :sub-pack-order="subPackFilmOrder"
-    :sub-pack-confirm="subPackFilmComfirm" @cancel="$emit('cancel', $event)" @pay="$emit('pay', $event)"
-    @submit="$emit('submit', $event)" @del="$emit('del', $event)" @after-sale="$emit('after-sale', $event)"
-    @refresh="$emit('refresh')"
-  />
+  <block>
+    <xsbList
+      v-if="orderList.businessType === 'XSB' || orderList.businessType === 'all'" :order="orderList"
+      @refresh="$emit('refresh')"
+    />
+    <chargeList v-else-if="orderList.businessType === 'CD' || orderList.businessType === 'all'" :order="orderList" />
+    <filmList
+      v-else-if="orderList.businessType === 'DYY' || orderList.businessType === 'all'" :order="orderList"
+      @refresh="$emit('refresh')"
+    />
+    <djkorder
+      v-else-if="orderList.businessType === 'DJK' || orderList.businessType === 'all'" :order="orderList"
+      @refresh="$emit('refresh')"
+    />
+    <videoRightsList v-else-if="orderList.businessType === 'XNSP' || orderList.businessType === 'all'" :order="orderList" />
+  </block>
 </template>

+ 60 - 65
src/subPack-smqjh/order/index.vue

@@ -1,8 +1,6 @@
 <script setup lang="ts">
-import { computed } from 'vue'
 import OrderRenderer from './components/OrderRenderer.vue'
 import { navTabTypeList, orderStatusList } from './order-data'
-import { createGlobalLoadingMiddleware } from '@/api/core/middleware'
 
 definePage({
   name: 'smqjh-order',
@@ -11,13 +9,12 @@ definePage({
     navigationBarTitleText: '订单列表',
   },
 })
-const subPackOrder = ref<typeof import('@/subPack-xsb/utils/order-data')>()
-const subPackComfirm = ref<typeof import('@/subPack-xsb/utils/confirm-order')>()
+const skelet = ref(true)
 
 const navActiveTab = ref('all')
 const scrollViewId = ref()
 const orderStatusActive = ref('all')
-const { data: orderList, refresh, isLastPage, page, reload } = usePagination((pageNum, pageSize) => Apis.xsb.orderList({
+const { data: orderList, isLastPage, page, reload } = usePagination((pageNum, pageSize) => Apis.xsb.orderList({
   data: {
     businessType: unref(navActiveTab) === 'all' ? '' : unref(navActiveTab),
     orderStatus: unref(orderStatusActive),
@@ -31,46 +28,10 @@ const { data: orderList, refresh, isLastPage, page, reload } = usePagination((pa
   initialData: [],
   data: res => res.data?.list,
   append: true,
-  middleware: createGlobalLoadingMiddleware(),
-})
-
-function createFilteredList(businessType: string) {
-  return computed(() => {
-    if (navActiveTab.value === 'all') {
-      return orderList.value.filter(order => order.businessType === businessType)
-    }
-    else if (navActiveTab.value === businessType) {
-      return orderList.value
-    }
-    return []
-  })
-}
-
-const xsbOrderList = createFilteredList('XSB')
-const chargeOrderList = createFilteredList('CD')
-const filmOrderList = createFilteredList('DYY')
+}).onSuccess(() => skelet.value = false)
 
-const currentOrderList = computed(() => {
-  if (navActiveTab.value === 'all') {
-    return orderList.value
-  }
-  else if (navActiveTab.value === 'XSB') {
-    return xsbOrderList.value
-  }
-  else if (navActiveTab.value === 'CD') {
-    return chargeOrderList.value
-  }
-  else if (navActiveTab.value === 'DYY') {
-    return filmOrderList.value
-  }
-  return []
-})
-
-onMounted(async () => {
-  subPackOrder.value = await AsyncImport('@/subPack-xsb/utils/order-data')
-  subPackComfirm.value = await AsyncImport('@/subPack-xsb/utils/confirm-order')
-})
 function handleChangeTypeNav(value: string) {
+  skelet.value = true
   navActiveTab.value = value
   scrollViewId.value = null
   orderList.value = []
@@ -78,8 +39,8 @@ function handleChangeTypeNav(value: string) {
   reload()
 }
 onShow(() => {
-  orderList.value = []
-  refresh()
+  // orderList.value = []
+  reload()
 })
 onReachBottom(() => {
   if (!isLastPage.value) {
@@ -87,26 +48,19 @@ onReachBottom(() => {
   }
 })
 function handleChangeStatus(value: string) {
+  skelet.value = true
   orderStatusActive.value = value
   orderList.value = []
   reload()
 }
-// Cancel / Pay / Submit / Delete are handled inside child components now
-async function handleAfterSale(item: Api.xsbOrderList) {
-  if (!item.orderItemList) {
-    useGlobalToast().show('商品异常!')
-    return
-  }
-  await useSysStore().getRefunOrder(item.orderNumber as string)
-}
 </script>
 
 <template>
   <view class="page-smqjh">
-    <view class="nav sticky top-0 z-10 bg-white px-24rpx py-18rpx">
+    <view class="nav sticky top-0 z-99 bg-white px-24rpx py-18rpx">
       <scroll-view
         class="whitespace-nowrap" :scroll-into-view="`id-${scrollViewId}`"
-        :scroll-into-view-offset="-150" scroll-with-animation scroll-x enable-passive
+        :scroll-into-view-offset="-150" scroll-x scroll-with-animation enable-passive
       >
         <view class="flex items-center">
           <view
@@ -134,16 +88,57 @@ async function handleAfterSale(item: Api.xsbOrderList) {
         </view>
       </view>
     </view>
-    <view class="px-24rpx">
-      <OrderRenderer
-        :order-list="currentOrderList"
-        :nav-active-tab="navActiveTab"
-        :sub-pack-order="subPackOrder"
-        :sub-pack-confirm="subPackComfirm"
-        @after-sale="handleAfterSale"
-        @refresh="refresh"
-      />
-      <StatusTip v-if="!orderList.length" tip="暂无内容" />
+    <view class="p-24rpx">
+      <templat v-if="skelet">
+        <view v-for="item in 10" :key="item" class="mb20rpx rounded-16rpx bg-white p24rpx">
+          <wd-skeleton
+            animation="gradient"
+            theme="text"
+            :row-col="[{ width: '100%' }]"
+          />
+          <view class="mt20rpx flex">
+            <wd-skeleton
+              animation="gradient"
+              theme="image"
+              :row-col="[{ width: '160rpx', height: '160rpx' }]"
+            />
+            <view class="ml20rpx flex-1">
+              <wd-skeleton
+                animation="gradient"
+                theme="text"
+                :row-col="[{ width: '100%' }]"
+              />
+              <wd-skeleton
+                animation="gradient"
+                theme="text"
+                :row-col="[{ width: '90%' }]"
+                :custom-style="{ marginTop: '20rpx' }"
+              />
+              <wd-skeleton
+                animation="gradient"
+                theme="text"
+                :row-col="[{ width: '80%' }]"
+                :custom-style="{ marginTop: '20rpx' }"
+              />
+            </view>
+          </view>
+          <wd-skeleton
+            animation="gradient"
+            theme="text"
+            :custom-style="{ marginTop: '20rpx' }"
+            :row-col="[{ width: '100%', height: '60rpx' }]"
+          />
+        </view>
+      </templat>
+      <view v-else>
+        <template v-for="item in orderList" :key="item.orderNumber">
+          <OrderRenderer
+            :order-list="item"
+            @refresh="reload"
+          />
+        </template>
+        <StatusTip v-if="!orderList.length" tip="暂无内容" />
+      </view>
     </view>
     <view class="h-20rpx" />
   </view>

+ 2 - 19
src/subPack-smqjh/order/order-data.ts

@@ -3,7 +3,8 @@ export const navTabTypeList = [
   { name: '星闪豹', value: 'XSB' },
   { name: '充电', value: 'CD' },
   { name: '电影演出', value: 'DYY' },
-  { name: '视频权益', value: 'VIDEO' },
+  { name: '视频权益', value: 'XNSP' },
+  { name: '大健康', value: 'DJK' },
   { name: '大牌点餐', value: 'SHOP' },
 ]
 
@@ -15,24 +16,6 @@ export const orderStatusList = [
   { name: '已取消', value: 'cancel' },
 ]
 
-/**
- * 统一待支付状态支付按钮逻辑处理
- * @param order
- */
-
-export function handleCommonOrderPay(order: any) {
-  return order
-}
-
-/**
- *  统一取消订单逻辑处理
- * @param order
- */
-
-export function handleCommonCancelOrder(order: any) {
-  return order
-}
-
 /**
  * 统一充电订单状态处理
  * @param status 0:待充电,20:充电中,30:结算中,80:已完成

+ 26 - 8
src/subPack-videoRights/commonTab/components/home.vue

@@ -3,12 +3,14 @@ import router from '@/router'
 import { StaticUrl } from '@/config'
 import { createGlobalLoadingMiddleware } from '@/api/core/middleware'
 
+const { show } = useGlobalToast()
 const { statusBarHeight, MenuButtonHeight } = storeToRefs(useSysStore())
 /**
  * 获取视频权益列表
  */
-const { data: videoDataList, isLastPage, page, refresh } = usePagination((pageNum, pageSize) =>
-  Apis.videoRight.findAppByPage({ data: { pageNum, pageSize } }), {
+const productName = ref('')
+const { data: videoDataList, isLastPage, page, reload, error, refresh } = usePagination((pageNum, pageSize) =>
+  Apis.videoRight.findAppByPage({ data: { pageNum, pageSize, productName: productName.value } }), {
   data: (resp) => {
     return resp.data?.list
   },
@@ -19,6 +21,9 @@ const { data: videoDataList, isLastPage, page, refresh } = usePagination((pageNu
   immediate: true,
   middleware: createGlobalLoadingMiddleware(),
 })
+const state = computed(() => {
+  return error.value ? 'error' : !isLastPage.value ? 'loading' : 'finished'
+})
 onShow(() => {
   refresh()
 })
@@ -27,6 +32,17 @@ onReachBottom(() => {
     page.value++
   }
 })
+
+function submitSearch() {
+  if (productName.value === '') {
+    return show({ msg: '搜索内容不能为空' })
+  }
+  refresh()
+}
+
+function clearSearch() {
+  refresh()
+}
 </script>
 
 <template>
@@ -36,38 +52,40 @@ onReachBottom(() => {
       safe-area-inset-top left-arrow fixed @click-left="router.back()"
     />
     <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 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>
               <image
                 class="h-342rpx w-342rpx rounded-16rpx"
-                :src="`${StaticUrl}/list-page-img.png`"
+                :src="item.productImg ? item.productImg : `${StaticUrl}/list-page-img.png`"
               />
             </view>
             <view class="mx20rpx my-24rpx">
               <view class="text-28rpx font-bold">
                 {{ item.productName }}
               </view>
-              <view class="mt-30rpx flex items-center gap-18rpx">
+              <view class="mt-30rpx flex items-center justify-between">
                 <view class="text-#FF4D3A">
                   <text class="text-22rpx font-500">
                   </text>
-                  <text class="text-36rpx font-800">
+                  <text class="text-34rpx font-800">
                     {{ item.price }}
                   </text>
                 </view>
-                <view class="text-24rpx text-#AAA decoration-line-through">
+                <view class="text-22rpx text-#AAA decoration-line-through">
                   市场价¥{{ item.faceValue }}
                 </view>
               </view>
             </view>
           </view>
-          <StatusTip v-if="!videoDataList.length" tip="暂无内容" />
         </grid-view>
+        <StatusTip v-if="!videoDataList.length" tip="暂无内容" />
       </scroll-view>
+      <wd-loadmore :state="state" :loading-props="{ color: '#9ED605', size: 20 }" @reload="reload" />
     </view>
   </view>
 </template>

+ 1 - 0
src/subPack-videoRights/commonTab/components/order.vue

@@ -25,6 +25,7 @@ onShow(() => {
 onReachBottom(() => {
   if (!isLastPage.value) {
     page.value++
+    refresh()
   }
 })
 

+ 2 - 2
src/subPack-videoRights/commonTab/index.vue

@@ -4,7 +4,7 @@ import order from './components/order.vue'
 
 definePage({
   name: 'video-rights-tabbar',
-  islogin: false,
+  islogin: true,
   style: {
     navigationBarTitleText: '',
     navigationStyle: 'custom',
@@ -17,7 +17,7 @@ const tabbar = ref(0)
   <home v-if="tabbar === 0" />
   <order v-if="tabbar === 1" />
   <view class="">
-    <wd-tabbar v-model="tabbar" placeholder safe-area-inset-bottom fixed :bordered="false" :z-index="99999">
+    <wd-tabbar v-model="tabbar" safe-area-inset-bottom placeholder fixed :bordered="false" :z-index="99999">
       <wd-tabbar-item title="商品" icon="goods" />
       <wd-tabbar-item title="订单记录" icon="list" />
     </wd-tabbar>

+ 1 - 1
src/subPack-videoRights/videoRightsDetail/videoRightsDetail.vue

@@ -4,7 +4,7 @@ import router from '@/router'
 
 definePage({
   name: 'video-rights-detail',
-  islogin: false,
+  islogin: true,
   style: {
     navigationBarTitleText: '详情',
   },

+ 1 - 1
src/subPack-videoRights/videoRightsOrderInfo/videoRightsOrderInfo.vue

@@ -5,7 +5,7 @@ import router from '@/router'
 
 definePage({
   name: 'video-rights-order-info',
-  islogin: false,
+  islogin: true,
   style: {
     navigationBarTitleText: '订单确认',
   },

+ 33 - 3
src/subPack-videoRights/videoRightsSubmitOrder/videoRightsSubmitOrder.vue

@@ -1,10 +1,11 @@
 <script setup lang="ts">
+import { InputFormatUtil } from '../../utils/index'
 import { StaticUrl } from '@/config'
 import router from '@/router'
 
 definePage({
   name: 'video-rights-submit-order',
-  islogin: false,
+  islogin: true,
   style: {
     navigationBarTitleText: '订单确认',
   },
@@ -36,9 +37,38 @@ function selectAccountType(type: number) {
   submitFrom.value.accountType = type
 }
 
+function validateRechargeAccount(formData: Api.videoRightsubmitOrder): {
+  isValid: boolean
+  errorMessage: string | null
+} {
+  if (formData.rechargeAccount === '') {
+    return {
+      isValid: false,
+      errorMessage: '请输入充值账号',
+    }
+  }
+  if (formData.accountType === 1 && !InputFormatUtil.isPhone(formData.rechargeAccount || '')) {
+    return {
+      isValid: false,
+      errorMessage: '请输入正确的手机号',
+    }
+  }
+  if (formData.accountType === 2 && !InputFormatUtil.isQQ(formData.rechargeAccount || '')) {
+    return {
+      isValid: false,
+      errorMessage: '请输入正确的QQ号',
+    }
+  }
+  return {
+    isValid: true,
+    errorMessage: null,
+  }
+}
+
 function submitPay() {
-  if (submitFrom.value.rechargeAccount === '') {
-    useGlobalToast().show({ msg: '请输入充值账号' })
+  const validation = validateRechargeAccount(submitFrom.value)
+  if (!validation.isValid) {
+    useGlobalToast().show({ msg: validation.errorMessage! })
     return
   }
   submitFrom.value.productId = previewGoods.value.id

+ 11 - 5
src/subPack-xsb/commonTab/components/cart.vue

@@ -50,11 +50,17 @@ onMounted(async () => {
                   <wd-checkbox :model-value="item.id" />
                 </view>
                 <view class="flex flex-1">
-                  <image
-                    :src="item.pic"
-                    class="h206rpx w200rpx flex-shrink-0"
-                    @click.stop="router.push({ name: 'xsb-goods', params: { id: String(item.prodId) } })"
-                  />
+                  <view class="relative">
+                    <image
+                      :src="item.pic"
+                      class="h206rpx w200rpx flex-shrink-0"
+                      @click.stop="router.push({ name: 'xsb-goods', params: { id: String(item.prodId) } })"
+                    />
+                    <image
+                      :src="`${StaticUrl}/xbs-shui-cart.png`"
+                      class="absolute left-0 top-0 h206rpx w200rpx flex-shrink-0"
+                    />
+                  </view>
                   <view class="ml20rpx flex-1">
                     <view class="text-left text-28rpx font-semibold">
                       <!-- <view v-for="i in 2" :key="i" class="mr5px inline-block">

+ 13 - 5
src/subPack-xsb/commonTab/components/classfiy.vue

@@ -202,12 +202,16 @@ onMounted(async () => {
   if (leftActive.value) {
     handleChange({ value: leftActive.value })
   }
+  else {
+    goodsLoading.value = 'finished'
+  }
   if (topNavActive.value) {
     topScrollView.value = null
     nextTick(() => {
       topScrollView.value = topNavActive.value
     })
   }
+  console.log(topNavActive.value, '  ==', leftActive.value)
 
   getCartBox()
   if (token.value) {
@@ -332,7 +336,7 @@ function handlePay() {
 <template>
   <view class="page-xsb">
     <wd-navbar
-      title="" custom-style="background-color:#F4FFD1" :bordered="false" :z-index="99" safe-area-inset-top
+      title="" custom-style="background-color:#F4FFD1" :bordered="false" :z-index="9999" safe-area-inset-top
       fixed
     >
       <template #left>
@@ -400,7 +404,7 @@ function handlePay() {
         展开
         <image :src="`${StaticUrl}/xia.png`" class="mt20rpx h20rpx w20rpx" />
       </view>
-      <wd-popup v-model="show" position="top" custom-style="border-radius:32rpx;">
+      <wd-popup v-model="show" :z-index="9998" position="top" custom-style="border-radius:32rpx;">
         <view
           class="box-border bg-#F4FFD1 p24rpx"
           :style="{ paddingTop: `${(Number(statusBarHeight) || 44) + MenuButtonHeight + 12}px` }"
@@ -467,8 +471,12 @@ function handlePay() {
             <view v-if="productList.length" class="p20rpx">
               <view v-for="item in productList" :id="`class${item.prodId}`" :key="item.id" class="relative">
                 <view class="flex" @click="handleGo(item)">
-                  <view class="mr20rpx h172rpx w172rpx flex-shrink-0 overflow-hidden rounded-16rpx bg-#F6F6F6">
+                  <view class="relative mr20rpx h172rpx w172rpx flex-shrink-0 overflow-hidden rounded-16rpx bg-#F6F6F6">
                     <image :src="item.pic" lazy-load class="h-full w-full" />
+                    <image
+                      :src="`${StaticUrl}/xsb-shui-class.png`"
+                      class="absolute left-0 top-0 h-full w-full"
+                    />
                   </view>
                   <view class="flex-1">
                     <view class="text-left text-28rpx font-semibold">
@@ -540,7 +548,7 @@ function handlePay() {
                     </view>
                   </view>
                 </view>
-              </view>.
+              </view>
             </view>
             <StatusTip v-else tip="暂无内容" />
             <view v-if="goodsLoading == 'finished' || isTopLoading" class="h-40vh" />
@@ -648,7 +656,7 @@ function handlePay() {
       <template #footer>
         <view class="box-border w-full flex items-center justify-between py20rpx">
           <view class="w-48%">
-            <wd-button plain hairline block @click="selectGoods = false">
+            <wd-button hairline plain block @click="selectGoods = false">
               取消
             </wd-button>
           </view>

+ 19 - 7
src/subPack-xsb/commonTab/components/index.vue

@@ -38,6 +38,10 @@ onMounted(() => {
 
 function handleCommonClass(item: Api.xsbCategories) {
   console.log(item, '===================')
+  if (!item.children) {
+    useGlobalToast().show('敬请期待!')
+    return
+  }
 
   topNavActive.value = item.code
   leftActive.value = item.children && item.children[0].code
@@ -103,7 +107,7 @@ function handleChangeSwiper(e: UniHelper.SwiperOnChangeEvent) {
     </wd-navbar>
     <scroll-view
       :lower-threshold="80"
-      scroll-y enable-passive scroll-anchoring :scroll-top="scrollTop" class="content ios" @scroll="handleScroll" @scrolltolower="emit('scrollBottom')"
+      scroll-y enable-passive scroll-anchoring :scroll-top="scrollTop" class="ios content" @scroll="handleScroll" @scrolltolower="emit('scrollBottom')"
     >
       <view
         class="header-linear h320rpx px24rpx"
@@ -176,18 +180,23 @@ function handleChangeSwiper(e: UniHelper.SwiperOnChangeEvent) {
                 ]"
               >
                 <view class="px24rpx pt24rpx">
-                  <view class="grid grid-cols-5 gap-x-38rpx gap-y-24rpx">
-                    <view v-for="item, index in classfiylist" :key="index" @click="handleCommonClass(item)">
-                      <image :src="item.icon" class="h100rpx w100rpx" />
-                      <view class="mt12rpx text-24rpx text-#222">
-                        {{ item.name }}
+                  <view class="grid grid-cols-5 gap-x-24rpx gap-y-24rpx">
+                    <view v-for="item, index in classfiylist" :key="index" class="relative">
+                      <view @click="handleCommonClass(item)">
+                        <image :src="item.icon" class="h100rpx w100rpx" />
+                        <view class="mt12rpx whitespace-nowrap text-nowrap text-24rpx text-#222">
+                          {{ item.name }}
+                        </view>
+                      </view>
+                      <view v-if="!item.children" class="absolute left-0 top-0 h100rpx w100rpx flex items-center justify-center rounded-26rpx bg-[rgba(0,0,0,0.6)] text-16rpx text-white">
+                        敬请期待
                       </view>
                     </view>
                   </view>
                 </view>
 
                 <view v-if="swiperClassList.length" class="swiper-img swiper mt26rpx">
-                  <swiper class="h125rpx gap-16rpx" display-multiple-items="5" @change="handleChangeSwiper">
+                  <swiper class="h125rpx gap-16rpx" :display-multiple-items="5" @change="handleChangeSwiper">
                     <swiper-item v-for="item, idx in swiperClassList" :key="item.id" class="mb20rpx flex flex-col items-center text-center" @click="handleSwiperClick({ index: idx, item })">
                       <view class="pic-box">
                         <image class="h72rpx w72rpx" :src="item.icon" />
@@ -195,6 +204,9 @@ function handleChangeSwiper(e: UniHelper.SwiperOnChangeEvent) {
                       <view class="text-24rpx text-#222">
                         {{ item.name }}
                       </view>
+                      <view v-if="!item.children" class="absolute left-50% top-0 h72rpx w72rpx flex items-center justify-center rounded-26rpx bg-[rgba(0,0,0,0.6)] text-16rpx text-white -translate-x-50%">
+                        敬请期待
+                      </view>
                     </swiper-item>
                   </swiper>
                   <view class="mt24rpx flex items-center justify-center">

+ 22 - 0
src/subPack-xsb/commonTab/index.vue

@@ -91,6 +91,7 @@ onMounted(async () => {
   // reload()
   getCategories()
   loading.value = false
+  queryPopupConfig()
 })
 onShow(() => refresh())
 
@@ -134,6 +135,22 @@ function beforeleave() {
     })
   }
 }
+
+const curtainInfo = ref({
+  enabled: false,
+  imageUrl: '',
+})
+
+async function queryPopupConfig() {
+  try {
+    const res = await Apis.xsb.popupConfig({})
+    curtainInfo.value = res.data
+  }
+  catch (error) {
+    console.error('获取弹窗配置失败:', error)
+    curtainInfo.value = { enabled: false, imageUrl: '' }
+  }
+}
 </script>
 
 <template>
@@ -191,6 +208,11 @@ function beforeleave() {
         </view>
       </view>
     </wd-popup>
+    <wd-overlay :show="curtainInfo.enabled" :z-index="99999" @click="curtainInfo.enabled = false">
+      <view class="h-full flex items-center justify-center">
+        <image class="h-784rpx w-750rpx" :src="curtainInfo.imageUrl" />
+      </view>
+    </wd-overlay>
   </view>
 </template>
 

+ 4 - 0
src/subPack-xsb/components/goodsItem/index.vue

@@ -13,6 +13,10 @@ defineProps<{ itemGoods: Api.xsbCategoryProductList }>()
           :src="itemGoods.pic"
           class="h344rpx w344rpx"
         />
+        <image
+          :src="`${StaticUrl}/xsb-shui-index.png`"
+          class="absolute left-0 top-0 h344rpx w344rpx"
+        />
       </view>
       <view class="mt20rpx px20rpx">
         <view class="line-clamp-2 text-left text-28rpx font-semibold">

+ 12 - 9
src/subPack-xsb/confirmOrder/index.vue

@@ -1,5 +1,4 @@
 <script setup lang="ts">
-import { clearCart, getOrderPayMent, getWxCommonPayment, handleCommonPayMent, paySuccess } from '../utils/confirm-order'
 import router from '@/router'
 
 definePage({
@@ -65,18 +64,22 @@ async function handlePay() {
       }
     })
 
-    const orderNumber = await getOrderPayMent(orderInfo.value.transfee, 'XSB', deliveryType.value, Number(orderInfo.value?.skuList[0].shopId || SelectShopInfo.value.shopId), orderItemList, unref(remarks))
-    const res = await handleCommonPayMent(orderNumber)
-    await clearCart(orderInfo.value.skuList)
+    const orderNumber = await useUserStore().getOrderPayMent(orderInfo.value.transfee, 'XSB', deliveryType.value, Number(orderInfo.value?.skuList[0].shopId || SelectShopInfo.value.shopId), orderItemList, unref(remarks))
+    const res = await useUserStore().handleCommonPayMent(orderNumber)
+    await useUserStore().clearCart(orderInfo.value.skuList)
     totalProduct.value = null
+    console.log('进入微信支付', res)
     if (res.payType !== 1) {
-      await getWxCommonPayment(res)
-      await paySuccess()
-      isPay.value = false
+      try {
+        await useUserStore().getWxCommonPayment(res)
+        await useUserStore().paySuccess('xsb-order', 'subPack-xsb/commonTab/index')
+      }
+      catch {
+        await useUserStore().payError('xsb-order', 'subPack-xsb/commonTab/index')
+      }
     }
     else {
-      await paySuccess()
-      isPay.value = false
+      await useUserStore().paySuccess('xsb-order', 'subPack-xsb/commonTab/index')
     }
   }
   catch {

+ 17 - 132
src/subPack-xsb/order/index.vue

@@ -1,9 +1,6 @@
 <script setup lang="ts">
-import { getWxCommonPayment, handleCommonPayMent } from '../utils/confirm-order'
-import { OrderStatus, handleCommonCancelOrder, handleCommonDeleteOrder, handleCommonOrderReceive, handleCommonOrderStatusText, navTabTypeList, orderStatusList } from '../utils/order-data'
 import { createGlobalLoadingMiddleware } from '@/api/core/middleware'
-import { StaticUrl } from '@/config'
-import router from '@/router'
+import xsbOrderList from '@/subPack-smqjh/components/xsb-orderList/xsb-orderList.vue?async'
 
 definePage({
   name: 'xsb-order',
@@ -12,7 +9,19 @@ definePage({
     navigationBarTitleText: '订单列表',
   },
 })
+const navTabTypeList = [
+  { name: '全部', value: 0 },
+  { name: '配送(外卖)', value: 3 },
+  { name: '快递', value: 1 },
+]
 
+const orderStatusList = [
+  { name: '全部', value: 'all' },
+  { name: '待支付', value: 'paddingPay' },
+  { name: '进行中', value: 'ing' },
+  { name: '已完成', value: 'completed' },
+  { name: '已取消', value: 'cancel' },
+]
 const navActiveTab = ref(0)
 const orderStatusActive = ref('all') // 我的订单 all-全部 paddingPay-待支付 ing-进行中 completed-已完成 cancel-已取消
 
@@ -42,9 +51,7 @@ function handleChangeStatus(value: string) {
   orderList.value = []
   reload()
 }
-function handleClick(item: Api.xsbOrderList) {
-  router.push({ name: 'xsb-orderDetaile', params: { id: String(item.orderNumber) } })
-}
+
 onReachBottom(() => {
   if (!isLastPage.value) {
     page.value++
@@ -53,35 +60,6 @@ onReachBottom(() => {
 onShow(() => {
   refresh()
 })
-
-async function handlePay(orderNumber: string) {
-  const res = await handleCommonPayMent(orderNumber)
-  if (res.payType !== 1) {
-    await getWxCommonPayment(res)
-  }
-  else {
-    reload()
-  }
-}
-async function handleCancel(order: Api.xsbOrderList) {
-  await handleCommonCancelOrder(order)
-  reload()
-}
-async function handleDel(order: Api.xsbOrderList) {
-  await handleCommonDeleteOrder(order)
-  reload()
-}
-async function handleSubmitOrder(order: Api.xsbOrderList) {
-  await handleCommonOrderReceive(order)
-  reload()
-}
-async function handleAfterSale(item: Api.xsbOrderList) {
-  if (!item.orderItemList) {
-    useGlobalToast().show('商品异常!')
-    return
-  }
-  await useSysStore().getRefunOrder(item.orderNumber as string)
-}
 </script>
 
 <template>
@@ -112,102 +90,9 @@ async function handleAfterSale(item: Api.xsbOrderList) {
       </view>
     </view>
     <view class="px-24rpx">
-      <view v-for="item in orderList" :key="item.orderNumber" class="mt-20rpx rounded-16rpx bg-white p-24rpx">
-        <view class="w-full flex items-center justify-between">
-          <view class="flex items-center">
-            <image :src="`${StaticUrl}/order-icon.png`" class="h-36rpx w-36rpx" />
-            <view class="ml-20rpx text-32rpx font-semibold">
-              {{ item.shopName }}
-            </view>
-          </view>
-          <view class="text-24rpx text-[#FF4D3A]">
-            <template v-if="item.hbOrderStatus === OrderStatus.PaddingPay">
-              <view class="flex items-center">
-                待支付( 还剩 <wd-count-down :time="handleCommonOrderStatusText(item)" @finish="refresh" /> )
-              </view>
-            </template>
-            <text v-else>
-              {{ handleCommonOrderStatusText(item) }}
-            </text>
-          </view>
-        </view>
-        <view class="my-24rpx h-2rpx w-full bg-[#F0F0F0]" />
-        <view>
-          <!-- <view class="mb20rpx box-border rounded-16rpx bg-#F9F9F9 p24rpx">
-            <view class="flex items-center">
-              <image :src="`${StaticUrl}/order-car.png`" class="h36rpx w36rpx" />
-              <view class="ml20rpx text-28rpx text-#222 font-semibold">
-                预计10:40前可送达
-              </view>
-            </view>
-            <view class="mt18rpx">
-              您的订单预计3月7日 10:40前送达
-            </view>
-            <view class="mt20rpx">
-              2025-03-26 11:56:07
-            </view>
-          </view> -->
-          <view class="box-border h-176rpx w-full flex items-center justify-between rounded-16rpx bg-[#F9F9F9]" @click="handleClick(item)">
-            <view class="box-border h-full w-480rpx py-28rpx pl-20rpx">
-              <scroll-view scroll-x class="h-full w-full whitespace-nowrap">
-                <view class="flex items-center">
-                  <view v-for="goods in item.orderItemList" :key="goods.skuId" class="mr-50rpx">
-                    <image :src="goods.pic" class="h-120rpx w-120rpx" />
-                  </view>
-                </view>
-              </scroll-view>
-            </view>
-            <view class="box-shadow box-border h-full flex-1 flex-shrink-0 px-14rpx py-40rpx">
-              <view class="text-center text-32rpx text-[#FF4D3A] font-semibold">
-                ¥{{ item.actualTotal }}
-              </view>
-              <view class="text-center text-28rpx text-[#AAAAAA]">
-                共{{ item.goodsTotal }}件
-              </view>
-            </view>
-          </view>
-        </view>
-        <view class="mt-24rpx flex items-center justify-end">
-          <template v-if="item.hbOrderStatus === OrderStatus.PaddingPay">
-            <view class="mr-20rpx">
-              <wd-button size="small" plain type="info" @click.stop="handleCancel(item)">
-                取消订单
-              </wd-button>
-            </view>
-            <view class="mr-20rpx">
-              <wd-button size="small" plain type="error" @click.stop="handlePay(item.orderNumber as string)">
-                付款
-              </wd-button>
-            </view>
-          </template>
-          <template v-if="[OrderStatus.OrderCancel, OrderStatus.OrderCompleted].includes(item.hbOrderStatus) ">
-            <view class="mr-20rpx">
-              <wd-button size="small" plain type="info" @click.stop="handleDel(item)">
-                删除订单
-              </wd-button>
-            </view>
-            <!-- <view class="ml20rpx">
-              <wd-button size="small" plain type="error" @click.stop="handleDel(item)">
-                再次购买
-              </wd-button>
-            </view> -->
-          </template>
-          <template v-if="item.hbOrderStatus === OrderStatus.OrderArrived">
-            <view class="mr-20rpx">
-              <wd-button size="small" plain type="info" @click.stop="handleSubmitOrder(item)">
-                确认收货
-              </wd-button>
-            </view>
-          </template>
-          <template v-if="item.refundStatus != 2 && [OrderStatus.OrderCompleted, OrderStatus.OrderWaitDelivery, OrderStatus.OrderAccepted].includes(item.hbOrderStatus) ">
-            <view class="mr-20rpx">
-              <wd-button size="small" plain type="info" @click.stop="handleAfterSale(item)">
-                申请售后
-              </wd-button>
-            </view>
-          </template>
-        </view>
-      </view>
+      <template v-for="item in orderList" :key="item.orderNumber">
+        <xsbOrderList :order="item" @refresh="reload" />
+      </template>
     </view>
     <StatusTip v-if="!orderList.length" tip="暂无内容" />
     <view class="h-20rpx" />

+ 8 - 10
src/subPack-xsb/orderDetaile/index.vue

@@ -1,9 +1,7 @@
 <script setup lang="ts">
 import type { MapMarker, MapPolyline } from '@uni-helper/uni-types'
-import { OrderStatus, handleCommonCancelOrder, handleCommonDeleteOrder, handleCommonOrderReceive, handleCommonOrderStatusText } from '../utils/order-data'
 import { StaticUrl } from '@/config'
 import router from '@/router'
-import { getWxCommonPayment, handleCommonPayMent } from '@/subPack-xsb/utils/confirm-order'
 
 const plugins = requirePlugin('logisticsPlugin')
 const { statusBarHeight, MenuButtonHeight } = storeToRefs(useSysStore())
@@ -75,13 +73,13 @@ function handleCollapse() {
   collapse.value = !collapse.value
 }
 async function handleCancel() {
-  await handleCommonCancelOrder(orderInfo.value as Api.xsbOrderList)
+  await useUserStore().handleCommonCancelOrder(orderInfo.value as Api.xsbOrderList)
   getDetail(String(unref(orderInfo)?.orderNumber))
 }
 async function handlePay() {
-  const res = await handleCommonPayMent(String(unref(orderInfo)?.orderNumber))
+  const res = await useUserStore().handleCommonPayMent(String(unref(orderInfo)?.orderNumber))
   if (res.payType !== 1) {
-    await getWxCommonPayment(res)
+    await useUserStore().getWxCommonPayment(res)
     getDetail(String(unref(orderInfo)?.orderNumber))
   }
   else {
@@ -89,7 +87,7 @@ async function handlePay() {
   }
 }
 async function handelDel() {
-  await handleCommonDeleteOrder(unref(orderInfo) as Api.xsbOrderList)
+  await useUserStore().handleCommonDeleteOrder(unref(orderInfo) as Api.xsbOrderList)
   router.back()
 }
 async function handleFinish() {
@@ -264,7 +262,7 @@ async function handleMarkerTap(e: UniHelper.MapOnMarkertapEvent) {
   }
 }
 async function handleReceive() {
-  await handleCommonOrderReceive(orderInfo.value as Api.xsbOrderList)
+  await useUserStore().handleCommonOrderReceive(orderInfo.value as Api.xsbOrderList)
   getDetail(String(unref(orderInfo)?.orderNumber))
 }
 </script>
@@ -293,7 +291,7 @@ async function handleReceive() {
           <view v-if="orderInfo.hbOrderStatus === OrderStatus.PaddingPay">
             <view class="flex items-center">
               请在
-              <wd-count-down format="mm:ss" :time="handleCommonOrderStatusText(orderInfo)" @finish="handleFinish">
+              <wd-count-down format="mm:ss" :time="useUserStore().handleXSBCommonOrderStatusText(orderInfo)" @finish="handleFinish">
                 <template #default="{ current }">
                   <view class="flex items-center">
                     <view> {{ current.minutes }} 分</view>
@@ -303,9 +301,9 @@ async function handleReceive() {
               </wd-count-down>
               内支付
             </view>
-            <view class="mt-20rpx text-28rpx text-[#AAAAAA]">
+            <!-- <view class="mt-20rpx text-28rpx text-[#AAAAAA]">
               现在支付:预计10:40-10:55送达
-            </view>
+            </view> -->
             <view class="btn mt-20rpx flex items-center justify-between">
               <view class="info-btn mr-20rpx w-226rpx">
                 <wd-button type="info" @click="handleCancel">

+ 12 - 5
src/subPack-xsb/search/index.vue

@@ -1,4 +1,5 @@
 <script setup lang="ts">
+import { StaticUrl } from '@/config'
 import router from '@/router'
 
 definePage({
@@ -104,7 +105,7 @@ function handleSearchText(text: string) {
         <view class="flex flex-1 items-center">
           <wd-icon name="search" size="20px" color="#aaa" />
           <view class="ml20rpx flex-1">
-            <input v-model.trim="searchText" type="text" placeholder="请输入搜索内容">
+            <input v-model.trim="searchText" type="text" placeholder="请输入搜索内容" @confirm="handleSearch">
           </view>
         </view>
         <view class="w-90rpx flex items-center">
@@ -152,10 +153,16 @@ function handleSearchText(text: string) {
     <view v-if="isSearch" class="px24rpx pt20rpx">
       <view v-for="item in data" :key="item.id" class="relative mb20rpx rounded-16rpx bg-white p24rpx">
         <view class="box-border flex items-center justify-between" @click="router.push({ name: 'xsb-goods', params: { id: String(item.prodId) } })">
-          <image
-            :src="item.pic"
-            class="h200rpx w200rpx flex-shrink-0 rounded-16rpx"
-          />
+          <view class="relative">
+            <image
+              :src="item.pic"
+              class="h200rpx w200rpx flex-shrink-0 rounded-16rpx"
+            />
+            <image
+              :src="`${StaticUrl}/xsb-shui-search.png`"
+              class="absolute left-0 top-0 h200rpx w200rpx flex-shrink-0 rounded-16rpx"
+            />
+          </view>
           <view class="ml20rpx flex-1">
             <view class="text-32rpx font-semibold">
               {{ item.prodName }}

+ 0 - 155
src/subPack-xsb/utils/confirm-order.ts

@@ -1,155 +0,0 @@
-import type { wxpay } from '@/api/globals'
-import router from '@/router'
-
-export function handleCommonPayMent(orderNumber: string): Promise<wxpay> {
-  return new Promise((resolve, reject) => {
-    if (!orderNumber) {
-      useGlobalToast().show({ msg: '订单号为空!请联系管理员' })
-      reject(new Error('订单号为空!请联系管理员'))
-      return
-    }
-    uni.showLoading({ mask: true })
-    Apis.common.hybridPayment({ data: { orderNumber } }).then((res) => {
-      resolve(res.data)
-      uni.hideLoading()
-    }).catch((err) => {
-      uni.hideLoading()
-      reject(err)
-    })
-  })
-}
-const { selectedAddress, userInfo } = storeToRefs(useUserStore())
-
-/**
- *
- * @param businessType
- * @param dvyType  配送类型 1:快递 2:自提 3:及时配送
- * @param remarks
- * @param shopId
- * @param orderItemList
- * @returns 下单获取待支付订单号
- */
-export function getOrderPayMent(freightFee: number, businessType: string, dvyType: number, shopId: number, orderItemList: {
-  prodCount?: number
-  skuId?: number
-}[], remarks?: string): Promise<string> {
-  uni.showLoading({ mask: true })
-  return new Promise((resolve, reject) => {
-    if (!selectedAddress.value) {
-      reject(new Error('请选择收货地址'))
-      return
-    }
-    Apis.common.addOrder({
-      data: {
-        channelId: Number(unref(userInfo).channelId),
-        businessType,
-        addressId: selectedAddress.value.id,
-        dvyType,
-        freightAmount: freightFee,
-        shopId,
-        orderItemList,
-        remarks,
-      },
-    }).then((res) => {
-      resolve(res.data)
-      uni.hideLoading()
-    }).catch((err) => {
-      uni.hideLoading()
-      reject(err)
-    })
-  })
-}
-/**
- *
- * @param orderInfo
- * @returns 统一拉起微信支付
- */
-
-export function getWxCommonPayment(orderPay: wxpay) {
-  uni.showLoading({ mask: true })
-  return new Promise((resolve, reject) => {
-    const orderInfo = {
-      appid: orderPay.appId,
-      timeStamp: orderPay.timeStamp,
-      nonceStr: orderPay.nonceStr,
-      package: orderPay.package,
-      signType: orderPay.signType,
-      paySign: orderPay.paySign,
-    }
-    uni.requestPayment({
-      provider: 'wxpay',
-      orderInfo,
-      ...orderInfo,
-      success(res) {
-        resolve(res)
-      },
-      fail(e) {
-        console.log(e, '失败')
-        payError()
-        reject(e)
-      },
-      complete() {
-        uni.hideLoading()
-      },
-    })
-  })
-}
-
-/**
- * 星闪豹
- * 支付成功统一跳转
- */
-export function paySuccess() {
-  return new Promise((resolve) => {
-    const { paySuccessPath, payBackIndexPath } = storeToRefs(useSysStore())
-    paySuccessPath.value = 'xsb-order'
-    payBackIndexPath.value = 'subPack-xsb/commonTab/index'
-    router.replace({ name: 'common-paySuccess' })
-    setTimeout(() => {
-      resolve(1)
-    }, 2000)
-  })
-}
-/**
- * 星闪豹
- * 支付成功统一跳转
- */
-export function payError() {
-  console.log('进入支付失败')
-
-  return new Promise((resolve) => {
-    const { paySuccessPath, payBackIndexPath } = storeToRefs(useSysStore())
-    paySuccessPath.value = 'xsb-order'
-    payBackIndexPath.value = 'subPack-xsb/commonTab/index'
-    router.replace({ name: 'common-payError' })
-    setTimeout(() => {
-      resolve(1)
-    }, 2000)
-  })
-}
-
-/**
- * 支付成功清空购买的商品的购物车
- */
-
-export async function clearCart(skuList: Api.CartSkuVo[]) {
-  uni.showLoading({ mask: true })
-  return new Promise((resolve) => {
-    const skuids = skuList.map(item => item.id).join(',')
-    if (skuids.length) {
-      Apis.common.deleteShoppingCart({
-        pathParams: {
-          ids: skuids,
-        },
-      }).then(async (res) => {
-        resolve(res)
-        await useSmqjhCartStore().getCartList('XSB')
-        uni.hideLoading()
-      }).finally(() => resolve(1))
-    }
-    else {
-      resolve(1)
-      uni.hideLoading()
-    }
-  })
-}

+ 0 - 156
src/subPack-xsb/utils/order-data.ts

@@ -1,156 +0,0 @@
-import { dayjs } from 'wot-design-uni'
-
-export const navTabTypeList = [
-  { name: '全部', value: 0 },
-  { name: '配送(外卖)', value: 3 },
-  { name: '快递', value: 1 },
-]
-
-export const orderStatusList = [
-  { name: '全部', value: 'all' },
-  { name: '待支付', value: 'paddingPay' },
-  { name: '进行中', value: 'ing' },
-  { name: '已完成', value: 'completed' },
-  { name: '已取消', value: 'cancel' },
-]
-export enum OrderStatus {
-  /**
-   * 待支付
-   */
-  PaddingPay = 0,
-  /**
-   * 订单已接单
-   */
-  OrderAccepted = 20,
-  /**
-   * 订单待配送
-   */
-  OrderWaitDelivery = 30,
-  /**
-   * 订单配送中
-   */
-  OrderDelivering = 40,
-  /**
-   * 订单取消审核
-   */
-  OrderCancelAudit = 50,
-  /**
-   * 订单取消
-   */
-  OrderCancel = 60,
-  /**
-   * 订单已送达
-   */
-  OrderArrived = 70,
-  /**
-   * 订单完成
-   */
-  OrderCompleted = 80,
-}
-
-/**
- * 订单状态文字统一处理
- * @param order
- *
- */
-export function handleCommonOrderStatusText(order: Api.xsbOrderList): any {
-  if (order.hbOrderStatus === OrderStatus.PaddingPay) {
-    const endTime = dayjs(order.createTime).add(16, 'minutes')
-    const remaining = dayjs(endTime).valueOf() - dayjs().valueOf()
-    return Math.max(0, remaining) // 确保不会返回负数
-  }
-
-  if (order.hbOrderStatus === OrderStatus.OrderAccepted) {
-    return '订单已接单'
-  }
-  if (order.hbOrderStatus === OrderStatus.OrderWaitDelivery) {
-    return '订单待配送'
-  }
-  if (order.hbOrderStatus === OrderStatus.OrderDelivering) {
-    return '订单配送中'
-  }
-  if (order.hbOrderStatus === OrderStatus.OrderCancelAudit) {
-    return '订单取消审核'
-  }
-  if (order.hbOrderStatus === OrderStatus.OrderCancel) {
-    return '订单取消'
-  }
-  if (order.hbOrderStatus === OrderStatus.OrderArrived) {
-    return '订单已送达'
-  }
-  if (order.hbOrderStatus === OrderStatus.OrderCompleted) {
-    return '订单完成'
-  }
-  return '未知订单状态'
-}
-
-/**
- *  统一取消订单逻辑处理
- * @param order
- */
-export function handleCommonCancelOrder(order: Api.xsbOrderList) {
-  console.log(order, '取消顶顶顶')
-
-  return new Promise((resolve, reject) => {
-    useGlobalMessage().confirm({
-      title: '取消订单',
-      msg: '确定要取消订单吗?',
-      success: async () => {
-        uni.showLoading({ mask: true })
-        Apis.xsb.cancelOrder({
-          data: {
-            orderNo: String(order.orderNumber),
-          },
-        }).then(res => resolve(res)).catch(err => reject(err)).finally(() => uni.hideLoading())
-      },
-      fail: async (err) => {
-        reject(err)
-      },
-    })
-  })
-}
-
-/**
- * 统一删除订单
- */
-export function handleCommonDeleteOrder(order: Api.xsbOrderList) {
-  return new Promise((resolve, reject) => {
-    useGlobalMessage().confirm({
-      title: '删除订单',
-      msg: '确定要删除该订单吗?',
-      success: async () => {
-        uni.showLoading({ mask: true })
-        Apis.xsb.deleteOrder({
-          pathParams: {
-            ids: String(order.orderId),
-          },
-        }).then(res => resolve(res)).catch(err => reject(err)).finally(() => uni.hideLoading())
-      },
-      fail: async (err) => {
-        reject(err)
-      },
-    })
-  })
-}
-
-/**
- * 统一确认收货
- */
-export function handleCommonOrderReceive(order: Api.xsbOrderList) {
-  return new Promise((resolve, reject) => {
-    useGlobalMessage().confirm({
-      title: '确认收货',
-      msg: '确定要确认收货吗?',
-      success: async () => {
-        uni.showLoading({ mask: true })
-        await Apis.xsb.confirmReceipt({
-          data: {
-            orderNumber: String(order.orderNumber),
-          },
-        })
-        resolve(1)
-      },
-      fail: err => reject(err),
-    })
-  })
-}

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

@@ -47,7 +47,16 @@ interface NavigateToOptions {
        "/subPack-videoRights/commonTab/index" |
        "/subPack-videoRights/videoRightsDetail/videoRightsDetail" |
        "/subPack-videoRights/videoRightsOrderInfo/videoRightsOrderInfo" |
-       "/subPack-videoRights/videoRightsSubmitOrder/videoRightsSubmitOrder";
+       "/subPack-videoRights/videoRightsSubmitOrder/videoRightsSubmitOrder" |
+       "/subPack-djk/afterSales/index" |
+       "/subPack-djk/commonTab/index" |
+       "/subPack-djk/confirmOrder/index" |
+       "/subPack-djk/goodsinfo/index" |
+       "/subPack-djk/orderDetaile/index" |
+       "/subPack-djk/shopinfo/index" |
+       "/subPack-djk/welfare/index" |
+       "/subPack-refueling/commonTab/index" |
+       "/subPack-refueling/webView/index";
 }
 interface RedirectToOptions extends NavigateToOptions {}
 

+ 82 - 0
src/utils/index.ts

@@ -75,3 +75,85 @@ export function calculateCenterPointSpherical(
     lng: toDegrees(centerLng),
   }
 }
+/**
+ * 订单统一枚举
+ */
+export enum OrderStatus {
+  /**
+   * 待支付
+   */
+  PaddingPay = 0,
+  /**
+   * 订单已接单
+   */
+  OrderAccepted = 20,
+  /**
+   * 订单待配送
+   */
+  OrderWaitDelivery = 30,
+  /**
+   * 订单配送中
+   */
+  OrderDelivering = 40,
+  /**
+   * 订单取消审核
+   */
+  OrderCancelAudit = 50,
+  /**
+   * 订单取消
+   */
+  OrderCancel = 60,
+  /**
+   * 订单已过期
+   */
+  OrderExpired = 62,
+  /**
+   * 大健康退款
+   */
+  OrderRefund = 61,
+
+  /**
+   * 订单已送达
+   */
+  OrderArrived = 70,
+  /**
+   * 订单完成
+   */
+  OrderCompleted = 80,
+}
+
+/**
+ * 把true转为数字true为1,false是0
+ *
+ * @param value
+ */
+export function boolToNumber(value: boolean): number {
+  return value ? 1 : 0
+}
+/**
+ * 输入框格式校验工具类
+ */
+export class InputFormatUtil {
+  /**
+   * 手机号校验
+   * @param phone
+   */
+  static isPhone(phone: string) {
+    return /^1[3-9]\d{9}$/.test(phone)
+  }
+
+  /**
+   * QQ号校验
+   * @param qq
+   */
+  static isQQ(qq: string) {
+    return /^[1-9]\d{4,10}$/.test(qq)
+  }
+}
+
+/**
+ * 手机号*号
+ */
+export function phoneFormat(phone: string) {
+  return phone.replace(/(\d{3})\d{4}(\d{4})/, '$1****$2')
+}

+ 6 - 10
vite.config.ts

@@ -1,5 +1,4 @@
 import process from 'node:process'
-import path from 'node:path'
 import Uni from '@dcloudio/vite-plugin-uni'
 import UniHelperComponents from '@uni-helper/vite-plugin-uni-components'
 import { WotResolver } from '@uni-helper/vite-plugin-uni-components/resolvers'
@@ -24,8 +23,8 @@ export default async () => {
       UniHelperManifest(),
       // https://github.com/uni-helper/vite-plugin-uni-pages
       pagesJson({
-        dts: path.resolve(process.cwd(), 'src/uni-pages.d.ts'),
-        pagesDir: 'pages',
+        dts: 'src/uni-pages.d.ts',
+        pageDir: 'pages',
         subPackageDirs: [
           'subPack-xsb',
           'subPack-common',
@@ -33,6 +32,8 @@ export default async () => {
           'subPack-film',
           'subPack-charge',
           'subPack-videoRights',
+          'subPack-djk',
+          'subPack-refueling',
         ],
         /**
          * 排除的页面,相对于 dir 和 subPackages
@@ -41,12 +42,6 @@ export default async () => {
         exclude: ['**/components/**/*.*'],
         hooks: [
           hookUniPlatform,
-          // 简单调试 hook:在生成时打印上下文,帮助定位问题
-          (ctx) => {
-            console.log('[pages-json] pages type:', Object.prototype.toString.call(ctx.pages))
-            console.log('[pages-json] pages count:', Array.isArray(ctx.pages) ? ctx.pages.length : 'not array')
-            console.log('[pages-json] output dts:', path.resolve(process.cwd(), 'src/uni-pages.d.ts'))
-          },
         ],
       }),
       // https://github.com/uni-helper/vite-plugin-uni-layouts
@@ -60,7 +55,8 @@ export default async () => {
       }),
       // https://github.com/uni-ku/root
       UniKuRoot(),
-      Uni(),
+      Uni({
+      }),
       // https://github.com/uni-ku/bundle-optimizer
       Optimization({
         logger: true,