ソースを参照

feat(djk): 新增大健康福利活动功能

- 添加福利活动相关API定义和类型声明
- 实现福利活动列表页面和详情页面
- 集成福利活动的领取和查询功能
- 添加大健康订单详情页面
- 优化大健康Tab页面结构,增加订单列表组件
- 修复支付成功后跳转参数传递问题
- 调整开发环境配置,修改确认弹窗层级
zhangtao 3 日 前
コミット
2115e3c0e3

+ 4 - 0
async-component.d.ts

@@ -30,3 +30,7 @@ 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
+}

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

@@ -2586,5 +2586,90 @@ namespace Api {
     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
+  }
 
 }

+ 7 - 0
src/api/apiDefinitions.ts

@@ -108,4 +108,11 @@ export default {
   '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':['GET', '/smqjh-oms/api/v1/djkOrder/addWelfareOrder'],
+
 };

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

@@ -1039,6 +1039,101 @@ declare global {
       >(
         config: Config
       ): Alova2Method<apiResData<string>, 'djk.djkAppletOrderConfirm', Config>;
+      welfareList<
+        Config extends Alova2MethodConfig<apiResData<DjkWelfareVO[]>> & {
+
+        }
+      >(
+        config: Config
+      ): Alova2Method<apiResData<DjkWelfareVO[]>, 'djk.welfareList', Config>;
+      welfareInfo<
+        Config extends Alova2MethodConfig<apiResData<DjkWelfareVO>> & {
+          data: {
+            id: number
+          }
+        }
+      >(
+        config: Config
+      ): Alova2Method<apiResData<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<DjkWelfareVO>> & {
+          pathParams: { memberId: number };
+        }
+      >(
+        config: Config
+      ): Alova2Method<apiResData<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>;
 
     }
   }

+ 2 - 2
src/config/index.ts

@@ -4,11 +4,11 @@ const mapEnvVersion = {
    */
   // develop: 'http://192.168.1.166:8080', // 张
   // develop: 'http://192.168.1.101:8080',
-  develop: 'http://192.168.0.157:8080',
+  // develop: 'http://192.168.0.157:8080',
   // 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.1.89:8080', // 田
+  develop: 'http://192.168.1.89:8080', // 田
   // develop: 'http://74949mkfh190.vicp.fun', // 付
   // develop: 'http://47.109.84.152:8081',
   // develop: 'https://smqjh.api.zswlgz.com',

+ 17 - 0
src/pages.json

@@ -542,6 +542,15 @@
             "navigationBarTitleText": "大健康商品详情"
           }
         },
+        {
+          "path": "orderDetaile/index",
+          "name": "djk-orderDetaile",
+          "islogin": true,
+          "style": {
+            "navigationBarTitleText": "订单详情",
+            "navigationStyle": "custom"
+          }
+        },
         {
           "path": "shopinfo/index",
           "name": "djk-shopinfo",
@@ -549,6 +558,14 @@
           "style": {
             "navigationBarTitleText": "商家主页"
           }
+        },
+        {
+          "path": "welfare/index",
+          "name": "djk-welfare",
+          "islogin": false,
+          "style": {
+            "navigationBarTitleText": "活动详情"
+          }
         }
       ]
     }

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

@@ -64,7 +64,7 @@ const navList = computed(() => {
     { icon: `${StaticUrl}/smqjh-jiayou.png`, title: '加油', name: '', show: !isOnlineAudit.value },
     { 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: !isOnlineAudit.value },
+    { icon: `${StaticUrl}/smqjh-djk.png`, title: '大健康', name: 'djk-homeTabbar', show: true },
   ]
   return list
 })

+ 3 - 0
src/store/user.ts

@@ -292,6 +292,7 @@ export const useUserStore = defineStore('user', {
         useGlobalMessage().confirm({
           title: '确认收货',
           msg: '确定要确认收货吗?',
+          zIndex: 99999999999999,
           success: async () => {
             uni.showLoading({ mask: true })
             await Apis.xsb.confirmReceipt({
@@ -315,6 +316,7 @@ export const useUserStore = defineStore('user', {
         useGlobalMessage().confirm({
           title: '删除订单',
           msg: '确定要删除该订单吗?',
+          zIndex: 99999999999999,
           success: async () => {
             uni.showLoading({ mask: true })
             Apis.xsb.deleteOrder({
@@ -339,6 +341,7 @@ export const useUserStore = defineStore('user', {
         useGlobalMessage().confirm({
           title: '取消订单',
           msg: '确定要取消订单吗?',
+          zIndex: 99999999999999,
           success: async () => {
             uni.showLoading({ mask: true })
             Apis.xsb.cancelOrder({

+ 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">
               查看订单

+ 26 - 8
src/subPack-djk/commonTab/components/fl.vue

@@ -1,5 +1,20 @@
 <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' },
+]
 </script>
 
 <template>
@@ -14,27 +29,30 @@ const { statusBarHeight, MenuButtonHeight } = storeToRefs(useSysStore())
     />
     <scroll-view scroll-y :style="{ height: `calc(100vh - ${(statusBarHeight + MenuButtonHeight) * 4}rpx)` }">
       <view class="px24rpx">
-        <view v-for="item in 20" :key="item" class="mt20rpx rounded-16rpx bg-white p24rpx">
+        <view v-for="item in flList" :key="item.id" class="mt20rpx rounded-16rpx bg-white p24rpx" @click="router.push({ name: 'djk-welfare', params: { id: String(item.id) } })">
           <view class="h248rpx w-full">
-            12
+            <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">
-                未开始
+              <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">
-            2026-01-19 14:03:59
+            {{ item.activityStartTime }}
-            2026-01-19 14:03:59
+            {{ item.activityEndTime }}
           </view>
           <view class="mt20rpx text-24rpx">
-            领取:24/4,458
+            领取:{{ item.quantityClaimed }}/{{ item.inventory }}
           </view>
         </view>
         <view class="h40rpx" />

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

@@ -0,0 +1,50 @@
+<script setup lang="ts">
+import djkorder from '@/subPack-smqjh/components/djk-order/index.vue?async'
+import { createGlobalLoadingMiddleware } from '@/api/core/middleware'
+
+const { statusBarHeight, MenuButtonHeight } = 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(),
+})
+const state = computed(() => {
+  return error.value ? 'error' : !isLastPage.value ? 'loading' : 'finished'
+})
+function handleBottom() {
+  if (!isLastPage.value) {
+    page.value++
+  }
+}
+</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>

+ 7 - 1
src/subPack-djk/commonTab/index.vue

@@ -1,6 +1,7 @@
 <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'
 
 definePage({
@@ -13,6 +14,11 @@ definePage({
     disableScroll: true,
   },
 })
+onLoad((options: any) => {
+  if (options.pay) {
+    handleTabbarChange({ value: 'djk-order' })
+  }
+})
 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` },
@@ -38,7 +44,7 @@ function setTabbarItemActive(name: string) {
 <template>
   <view class="page-xsb">
     <fl v-if="tabbarName == 'djk-fl'" />
-
+    <order v-if="tabbarName == 'djk-order'" />
     <home v-show="tabbarName == 'djk-home'" />
     <wd-tabbar
       v-model="tabbarName" placeholder safe-area-inset-bottom fixed :bordered="false" custom-class="custom-tab"

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

@@ -0,0 +1,316 @@
+<script setup lang="ts">
+import { StaticUrl } from '@/config'
+import router from '@/router'
+
+definePage({
+  name: 'djk-orderDetaile',
+  islogin: true,
+  style: {
+    navigationBarTitleText: '订单详情',
+    navigationStyle: 'custom',
+  },
+})
+const collapse = ref(true)
+const orderInfo = ref<Api.xsbOrderList>()
+const orderNum = ref()
+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
+}
+
+function handleCollapse() {
+  collapse.value = !collapse.value
+}
+async function handleCancel() {
+  await handleCommonCancelOrder(orderInfo.value as Api.xsbOrderList)
+  getDetail(String(unref(orderInfo)?.orderNumber))
+}
+async function handlePay() {
+  const res = await handleCommonPayMent(String(unref(orderInfo)?.orderNumber))
+  if (res.payType !== 1) {
+    await getWxCommonPayment(res)
+    getDetail(String(unref(orderInfo)?.orderNumber))
+  }
+  else {
+    getDetail(String(unref(orderInfo)?.orderNumber))
+  }
+}
+async function handelDel() {
+  await handleCommonDeleteOrder(unref(orderInfo) as Api.xsbOrderList)
+  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() {
+  if (!orderInfo.value?.orderItemList) {
+    useGlobalToast().show('商品异常!')
+    return
+  }
+  await useSysStore().getRefunOrder(orderInfo.value.orderNumber as string)
+}
+async function handleReceive() {
+  await useUserStore().handleCommonOrderReceive(orderInfo.value as Api.xsbOrderList)
+  getDetail(String(unref(orderInfo)?.orderNumber))
+}
+</script>
+
+<template>
+  <view
+    v-if="orderInfo" class="page-xsb"
+  >
+    <wd-navbar
+      title="订单详情" :bordered="false" placeholder :z-index="99" safe-area-inset-top left-arrow 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"
+            @click="handleCollapse"
+          >
+            <view v-if="orderInfo.hbOrderStatus === OrderStatus.OrderAccepted" class="mr-10rpx">
+              商家拣货中
+            </view>
+            <view v-if="orderInfo.hbOrderStatus === OrderStatus.OrderWaitDelivery" class="mr-10rpx">
+              订单待配送
+            </view>
+            <view v-if="orderInfo.hbOrderStatus === OrderStatus.OrderDelivering" class="mr-10rpx">
+              订单配送中
+            </view>
+            <view v-if="orderInfo.hbOrderStatus === OrderStatus.OrderCancelAudit" class="mr-10rpx">
+              订单取消审核
+            </view>
+            <view v-if="orderInfo.hbOrderStatus === OrderStatus.OrderCancel" class="mr-10rpx">
+              订单取消
+            </view>
+            <view v-if="orderInfo.hbOrderStatus === OrderStatus.OrderArrived" class="mr-10rpx">
+              订单已送达
+            </view>
+            <view v-if="orderInfo.hbOrderStatus === OrderStatus.OrderCompleted" class="mr-10rpx">
+              订单已完成
+            </view>
+          </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="orderInfo.hbOrderStatus === OrderStatus.OrderArrived" class="flex flex-col items-center"
+            @click="handleReceive"
+          >
+            <image :src="`${StaticUrl}/orderDetaile-submit-order.png`" class="h-40rpx w-40rpx" />
+            <view class="mt-40rpx">
+              确认收货
+            </view>
+          </view>
+          <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.refundStatus != 2 && [OrderStatus.OrderCompleted, OrderStatus.OrderWaitDelivery, OrderStatus.OrderAccepted].includes(orderInfo.hbOrderStatus)"
+            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 rounded-16rpx bg-white p-24rpx">
+        <view class="flex items-center">
+          <image :src="`${StaticUrl}/order-icon.png`" class="h-36rpx w-36rpx" />
+          <view class="ml-20rpx text-32rpx font-semibold">
+            {{ orderInfo?.shopName }}
+          </view>
+        </view>
+        <view class="my-24rpx h-2rpx w-full bg-[#F0F0F0]" />
+        <CollapsePanel :line-height="150">
+          <view v-for="item in orderInfo?.orderItemList" :key="item.skuId" class="mb-20rpx w-full flex items-center">
+            <view class="mr-20rpx w-120rpx flex-shrink-0">
+              <image :src="item.pic" class="h-120rpx w-120rpx" />
+            </view>
+            <view class="flex-1">
+              <view class="w-full flex items-center justify-between font-semibold">
+                <view class="text-28rpx">
+                  {{ item.skuName }}
+                </view>
+                <view class="text-32rpx text-[#FF4D3A]">
+                  ¥{{ item.price }}
+                </view>
+              </view>
+              <view class="text-24rpx text-[#AAAAAA]">
+                规格:{{ item.spec }}
+              </view>
+              <view class="text-24rpx text-[#AAAAAA]">
+                ×{{ item.prodCount }}
+              </view>
+            </view>
+          </view>
+        </CollapsePanel>
+
+        <view class="mt-24rpx h-2rpx w-full bg-[#F0F0F0]" />
+        <view class="mt-24rpx flex items-center justify-between">
+          <view class="text-28rpx">
+            商品金额
+          </view>
+          <view class="text-[#FF4A39] font-semibold">
+            ¥{{ orderInfo?.total }}
+          </view>
+        </view>
+        <view class="mt-24rpx flex items-center justify-between">
+          <view class="text-28rpx">
+            积分
+          </view>
+          <view class="text-[#FF4A39] font-semibold">
+            -¥{{ Number(orderInfo?.offsetPoints) / 100 }}
+          </view>
+        </view>
+        <view class="my-24rpx h-2rpx w-full bg-[#F0F0F0]" />
+        <view class="flex items-center justify-end">
+          <view class="text-28rpx">
+            总计{{ orderInfo.orderMoney }} 共减 {{ Number(orderInfo.offsetPoints) / 100 }}
+          </view>
+        </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]">
+              微信支付
+            </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 class="mb-28rpx flex items-center justify-between">
+            <view class="text-28rpx text-[#AAAAAA]">
+              备注信息
+            </view>
+            <view class="text-[#222]">
+              {{ orderInfo?.remarks || '无' }}
+            </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>

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

@@ -0,0 +1,95 @@
+<script setup lang="ts">
+import router from '@/router'
+
+definePage({ name: 'djk-welfare', islogin: false, style: { navigationBarTitleText: '活动详情' } })
+const welfare = ref<Api.DjkWelfareVO>()
+
+onLoad((options: any) => {
+  getWelfare(options.id)
+})
+const mapUser = ['全部用户', '仅限新用户', '特定用户标签', '指定用户']
+async function getWelfare(id: number) {
+  const res = await Apis.djk.welfareInfo({ data: { id } })
+  welfare.value = res.data
+}
+async function handleSelect(item: Api.PmsDjkGoods) {
+  try {
+    await Apis.djk.welfareClaimInfo({
+      data: {
+        welfareId: Number(welfare.value?.id),
+        goodsId: item.id,
+        memberId: useUserStore().userInfo.id,
+      },
+    })
+    useGlobalToast().show('领取成功!')
+  }
+  catch {
+    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.goodsCode" class="mt20rpx">
+        <view class="flex" @click="router.push({ name: 'djk-goods', params: { id: `${item.id}` } })">
+          <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>
+  </view>
+</template>
+
+<style lang="scss" scoped></style>

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

@@ -0,0 +1,138 @@
+<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) {
+  if (!item.orderItemList) {
+    useGlobalToast().show('商品异常!')
+    return
+  }
+  await useSysStore().getRefunOrder(item.orderNumber as string)
+}
+</script>
+
+<template>
+  <view class="mb-20rpx rounded-16rpx bg-white p-24rpx">
+    <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().handleXSBCommonOrderStatusText(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>
+      <view
+        class="box-border h-176rpx w-full flex items-center justify-between"
+        @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 order.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">
+            ¥{{ order.actualTotal }}
+          </view>
+          <view class="text-center text-28rpx text-[#AAAAAA]">
+            共{{ order.goodsTotal }}件
+          </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.refundStatus != 2 && [OrderStatus.OrderCompleted, OrderStatus.OrderWaitDelivery, OrderStatus.OrderAccepted].includes(order.hbOrderStatus) ">
+        <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>

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

@@ -63,7 +63,13 @@ async function handleAfterSale(item: Api.xsbOrderList) {
         </template>
         <template v-else>
           <view class="flex items-center">
-            待支付( 还剩 <wd-count-down :time="useUserStore().handleXSBCommonOrderStatusText(order)" @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>
@@ -145,4 +151,6 @@ async function handleAfterSale(item: Api.xsbOrderList) {
   </view>
 </template>
 
-<style lang="scss" scoped></style>
+<style lang="scss" scoped>
+
+</style>

+ 5 - 0
src/subPack-smqjh/order/components/OrderRenderer.vue

@@ -2,6 +2,7 @@
 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'
 
 interface Props {
   orderList: Api.xsbOrderList
@@ -26,5 +27,9 @@ defineEmits<{
       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')"
+    />
   </block>
 </template>

+ 2 - 2
src/subPack-smqjh/order/index.vue

@@ -59,7 +59,7 @@ function handleChangeStatus(value: string) {
     <view class="nav sticky top-0 z-10 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
@@ -87,7 +87,7 @@ function handleChangeStatus(value: string) {
         </view>
       </view>
     </view>
-    <view class="px-24rpx">
+    <view class="p-24rpx">
       <template v-for="item in orderList" :key="item.orderNumber">
         <OrderRenderer
           :order-list="item"

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

@@ -51,7 +51,9 @@ interface NavigateToOptions {
        "/subPack-djk/commonTab/index" |
        "/subPack-djk/confirmOrder/index" |
        "/subPack-djk/goodsinfo/index" |
-       "/subPack-djk/shopinfo/index";
+       "/subPack-djk/orderDetaile/index" |
+       "/subPack-djk/shopinfo/index" |
+       "/subPack-djk/welfare/index";
 }
 interface RedirectToOptions extends NavigateToOptions {}