Xiao_123 il y a 5 mois
Parent
commit
fb69a219e4

+ 86 - 0
src/api/mall/promotion/lottery/config/index.ts

@@ -0,0 +1,86 @@
+import request from '@/config/axios'
+
+// 幸运抽奖-活动 VO
+export interface LuckLotteryVO {
+  id: number // id
+  name: string // 奖品名称
+  type: string // 类别(1九宫格 2大转盘 3九宫格升级版 4幸运翻牌)
+  factor: string // 抽奖消耗 (1积分 2余额 3下单支付成功 4关注 5订单评价)
+  factorNum: number // 获取一次抽奖的条件数量
+  desc: string // 活动描述
+  image: string // 活动背景图
+  attendsUser: boolean // 参与用户(1所有 2部分)
+  userLevel: string // 参与用户等级
+  userLabel: string // 参与用户标签
+  isSvip: boolean // 参与用户是否付费会员
+  prizeNum: number // 奖品数量
+  startTime: Date // 开始时间
+  endTime: Date // 结束时间
+  lotteryNumTerm: number // 抽奖次数限制(1每天 2每人)
+  lotteryNum: number // 抽奖次数
+  spreadNum: number // 关注推广获取抽奖次数
+  isAllRecord: boolean // 中奖记录展示
+  isPersonalRecord: boolean // 个人中奖纪录展示
+  isContent: boolean // 活动规格是否展示
+  content: string // 活动文案抽奖协议之类
+  sort: number // 排序
+  status: string // 状态
+}
+
+// 幸运抽奖-活动 API
+export const LuckLotteryApi = {
+  // 查询幸运抽奖-活动分页
+  getLuckLotteryPage: async (params: any) => {
+    return await request.get({ url: `/promotion/luck-lottery/page`, params })
+  },
+
+  // 查询幸运抽奖-活动详情
+  getLuckLottery: async (id: number) => {
+    return await request.get({ url: `/promotion/luck-lottery/get?id=` + id })
+  },
+
+  // 新增幸运抽奖-活动
+  createLuckLottery: async (data: LuckLotteryVO) => {
+    return await request.post({ url: `/promotion/luck-lottery/create`, data })
+  },
+
+  // 修改幸运抽奖-活动
+  updateLuckLottery: async (data: LuckLotteryVO) => {
+    return await request.put({ url: `/promotion/luck-lottery/update`, data })
+  },
+
+  // 删除幸运抽奖-活动
+  deleteLuckLottery: async (id: number) => {
+    return await request.delete({ url: `/promotion/luck-lottery/delete?id=` + id })
+  },
+
+  // 导出幸运抽奖-活动 Excel
+  exportLuckLottery: async (params) => {
+    return await request.download({ url: `/promotion/luck-lottery/export-excel`, params })
+  },
+
+  // 查询幸运抽奖-奖品分页
+  getLuckLotteryPrizePage: async (params: any) => {
+    return await request.get({ url: `/promotion/luck-prize/page`, params })
+  },
+
+  // 查询幸运抽奖-奖品
+  getLuckLotteryPrize: async (id: number) => {
+    return await request.get({ url: `/promotion/luck-prize/get?id=${id}` })
+  },
+
+  // 新增幸运抽奖-奖品
+  createLuckLotteryPrize: async (data: any) => {
+    return await request.post({ url: `/promotion/luck-prize/create`, data })
+  },
+
+  // 修改幸运抽奖-奖品
+  updateLuckLotteryPrize: async (data: any) => {
+    return await request.put({ url: `/promotion/luck-prize/update`, data })
+  },
+
+  // 删除幸运抽奖-奖品
+  deleteLuckLotteryPrize: async (id: number) => {
+    return await request.delete({ url: `/promotion/luck-prize/delete?id=` + id })
+  },
+}

+ 49 - 0
src/api/mall/promotion/lottery/record/index.ts

@@ -0,0 +1,49 @@
+import request from '@/config/axios'
+
+// 幸运抽奖-抽奖记录 VO
+export interface LuckLotteryRecordVO {
+  id: number // id
+  userId: number // 用户id
+  lotteryId: number // 活动id
+  prizeId: number // 奖品id
+  type: string // 奖品类型1:未中奖 2:积分3:余额 4:红包 5:优惠券 6:站内商品 7:等级经验 8:用户等级 9:svip天数'
+  isReceive: boolean // 是否领取
+  receiveTime: Date // 领取时间
+  receiveInfo: string // 收获地址、备注等
+  isDeliver: boolean // 是否发货
+  deliverTime: Date // 发货处理时间
+  deliverInfo: string // 发货单号、备注等
+}
+
+// 幸运抽奖-抽奖记录 API
+export const LuckLotteryRecordApi = {
+  // 查询幸运抽奖-抽奖记录分页
+  getLuckLotteryRecordPage: async (params: any) => {
+    return await request.get({ url: `/promotion/luck-lottery-record/page`, params })
+  },
+
+  // 查询幸运抽奖-抽奖记录详情
+  getLuckLotteryRecord: async (id: number) => {
+    return await request.get({ url: `/promotion/luck-lottery-record/get?id=` + id })
+  },
+
+  // 新增幸运抽奖-抽奖记录
+  createLuckLotteryRecord: async (data: LuckLotteryRecordVO) => {
+    return await request.post({ url: `/promotion/luck-lottery-record/create`, data })
+  },
+
+  // 修改幸运抽奖-抽奖记录
+  updateLuckLotteryRecord: async (data: LuckLotteryRecordVO) => {
+    return await request.put({ url: `/promotion/luck-lottery-record/update`, data })
+  },
+
+  // 删除幸运抽奖-抽奖记录
+  deleteLuckLotteryRecord: async (id: number) => {
+    return await request.delete({ url: `/promotion/luck-lottery-record/delete?id=` + id })
+  },
+
+  // 导出幸运抽奖-抽奖记录 Excel
+  exportLuckLotteryRecord: async (params) => {
+    return await request.download({ url: `/promotion/luck-lottery-record/export-excel`, params })
+  }
+}

+ 5 - 0
src/utils/dict.ts

@@ -246,4 +246,9 @@ export enum DICT_TYPE {
   MENDUNER_JOB_SEEK_STATUS = 'menduner_job_seek_status', // 求职状态
   MENDUNER_INTERVIEW_INVITE_STATUS = 'menduner_interview_invite_status', // 面试邀约状态
   MENDUNER_AREA_TYPE = 'menduner_area_type', // 门墩儿 城市
+
+  // 抽奖配置
+  PROMOTION_LUCK_LOTTERY_TYPE = 'promotion_luck_lottery_type', // 抽奖类型
+  PROMOTION_LUCK_PRIZE_TYPE = 'promotion_luck_prize_type', // 抽奖奖品类型
+  PROMOTION_LUCK_LOTTERY_FACTOR = 'promotion_luck_lottery_factor', // 抽奖消耗
 }

+ 204 - 0
src/views/mall/promotion/lottery/config/LuckLotteryForm.vue

@@ -0,0 +1,204 @@
+<template>
+  <Dialog :title="dialogTitle" v-model="dialogVisible">
+    <el-form
+      ref="formRef"
+      :model="formData"
+      :rules="formRules"
+      label-width="180px"
+      v-loading="formLoading"
+    >
+      <el-form-item label="活动名称" prop="name">
+        <el-input v-model="formData.name" placeholder="请输入活动名称" />
+      </el-form-item>
+      <el-form-item label="类型" prop="type">
+        <el-select v-model="formData.type" placeholder="请选择类型" clearable>
+          <el-option v-for="dict in getIntDictOptions(DICT_TYPE.PROMOTION_LUCK_LOTTERY_TYPE)" :key="dict.value" :label="dict.label" :value="dict.value.toString()" />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="抽奖消耗" prop="factor">
+        <el-select v-model="formData.factor" placeholder="请选择抽奖消耗" clearable @change="handleSelectFactor">
+          <el-option v-for="dict in getIntDictOptions(DICT_TYPE.PROMOTION_LUCK_LOTTERY_FACTOR)" :key="dict.value" :label="dict.label" :value="dict.value.toString()" />
+        </el-select>
+      </el-form-item>
+      <el-form-item v-if="isShowSpu" label="商品" prop="factorInfo">
+        <div v-if="formData.factorInfo && formData.factorInfo.length" style=" display: flex;width: 100%; flex-wrap: wrap;" class="mb-10px">
+          <img v-for="val in formData.factorInfo" :key="val.id" :src="val.picUrl" alt="" class="h-70px w-70px mr-10px mb-5px" />
+        </div>
+        <el-button :icon="Plus" type="primary" @click.stop="showSpu = true">选择商品</el-button>
+      </el-form-item>
+      <el-form-item label="获取一次抽奖的条件数量" prop="factorNum">
+        <el-input-number v-model="formData.factorNum" :min="1" />
+      </el-form-item>
+      <el-form-item label="开始时间" prop="startTime">
+        <el-date-picker v-model="formData.startTime" type="date" value-format="x" placeholder="选择开始时间" />
+      </el-form-item>
+      <el-form-item label="结束时间" prop="endTime">
+        <el-date-picker v-model="formData.endTime" type="date"  value-format="x" placeholder="选择结束时间" />
+      </el-form-item>
+      <el-form-item label="活动文案" prop="content">
+        <Editor v-model="formData.content" height="150px" />
+      </el-form-item>
+      <el-form-item label="中奖记录展示" prop="isAllRecord">
+        <el-switch v-model="formData.isAllRecord" />
+      </el-form-item>
+      <el-form-item label="个人中奖纪录展示" prop="isPersonalRecord">
+        <el-switch v-model="formData.isPersonalRecord" />
+      </el-form-item>
+      <el-form-item label="活动规格是否展示" prop="isContent">
+        <el-switch v-model="formData.isContent" />
+      </el-form-item>
+      <el-form-item label="排序" prop="sort">
+        <el-input v-model="formData.sort" placeholder="请输入排序" />
+      </el-form-item>
+      <el-form-item label="状态" prop="status">
+        <el-select v-model="formData.status" placeholder="请选择状态" clearable>
+          <el-option v-for="dict in getIntDictOptions(DICT_TYPE.COMMON_STATUS)" :key="dict.value" :label="dict.label" :value="dict.value.toString()" />
+        </el-select>
+      </el-form-item>
+    </el-form>
+    <template #footer>
+      <el-button @click="submitForm" type="primary" :disabled="formLoading">确 定</el-button>
+      <el-button @click="dialogVisible = false">取 消</el-button>
+    </template>
+  </Dialog>
+
+  <Dialog title="商品列表" v-model="showSpu" style="width: 70%;">
+    <div style="display: inline-block; width: 100%;">
+      <SpuList ref="spuRef" :multiple="true" :select="formData.factorInfo" />
+    </div>
+    <template #footer>
+      <el-button @click="handleSubmitSpu" type="primary" :disabled="formLoading">确 定</el-button>
+      <el-button @click="showSpu = false">取 消</el-button>
+    </template>
+  </Dialog>
+</template>
+
+<script setup lang="ts">
+  import { Plus } from '@element-plus/icons-vue'
+  import { getIntDictOptions, DICT_TYPE } from '@/utils/dict'
+  import { LuckLotteryApi, LuckLotteryVO } from '@/api/mall/promotion/lottery/config'
+  import SpuList from './components/spuList.vue'
+              
+  /** 幸运抽奖-活动 表单 */
+  defineOptions({ name: 'LuckLotteryForm' })
+
+  const { t } = useI18n() // 国际化
+  const message = useMessage() // 消息弹窗
+
+  const spuRef = ref()
+  const dialogVisible = ref(false) // 弹窗的是否展示
+  const dialogTitle = ref('') // 弹窗的标题
+  const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
+  const formType = ref('') // 表单的类型:create - 新增;update - 修改
+  const formData = ref({
+    id: undefined,
+    name: undefined,
+    type: undefined,
+    factor: undefined,
+    factorNum: 1,
+    startTime: undefined,
+    endTime: undefined,
+    lotteryNumTerm: 1,
+    lotteryNum: 1,
+    isAllRecord: true,
+    isPersonalRecord: true,
+    isContent: true,
+    content: undefined,
+    sort: undefined,
+    status: undefined,
+    factorInfo: []
+  })
+  const formRules = reactive({
+    name: [{ required: true, message: '活动名称不能为空', trigger: 'blur' }],
+    type: [{ required: true, message: '类别不能为空', trigger: 'change' }],
+    factor: [{ required: true, message: '抽奖消耗不能为空', trigger: 'blur' }],
+    factorNum: [{ required: true, message: '获取一次抽奖的条件数量不能为空', trigger: 'blur' }],
+    startTime: [{ required: true, message: '开始时间不能为空', trigger: 'blur' }],
+    endTime: [{ required: true, message: '结束时间不能为空', trigger: 'blur' }],
+    status: [{ required: true, message: '状态不能为空', trigger: 'blur' }],
+  })
+  const formRef = ref() // 表单 Ref
+
+  // 抽奖消耗选择
+  const showSpu = ref(false)
+  const isShowSpu = ref(false)
+  const handleSelectFactor = (val: string) => {
+    isShowSpu.value = val === '6' // 指定商品下单支付成功选项方展示商品选择
+  }
+              
+  /** 打开弹窗 */
+  const open = async (type: string, id?: number) => {
+    dialogVisible.value = true
+    dialogTitle.value = t('action.' + type)
+    formType.value = type
+    resetForm()
+    // 修改时,设置数据
+    if (id) {
+      formLoading.value = true
+      try {
+        formData.value = await LuckLotteryApi.getLuckLottery(id)
+        formData.value.factorInfo = formData.value.spuList
+        isShowSpu.value = formData.value.factor === '6'
+      } finally {
+        formLoading.value = false
+      }
+    }
+  }
+  defineExpose({ open }) // 提供 open 方法,用于打开弹窗
+
+  // 商品选中
+  const handleSubmitSpu = () => {
+    const spu = spuRef.value.spuListRef.getSelectionRows()
+    if (!spu.length) return message.warning('请选择商品')
+    formData.value.factorInfo = spu
+    showSpu.value = false
+  }
+
+  /** 提交表单 */
+  const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
+  const submitForm = async () => {
+    // 校验表单
+    await formRef.value.validate()
+    formData.value.factorInfo = formData.value.factorInfo.map(e => e.id)
+    // 提交请求
+    formLoading.value = true
+    try {
+      const data = formData.value as unknown as LuckLotteryVO
+      if (formType.value === 'create') {
+        await LuckLotteryApi.createLuckLottery(data)
+        message.success(t('common.createSuccess'))
+      } else {
+        await LuckLotteryApi.updateLuckLottery(data)
+        message.success(t('common.updateSuccess'))
+      }
+      dialogVisible.value = false
+      // 发送操作成功的事件
+      emit('success')
+    } finally {
+      formLoading.value = false
+    }
+  }
+
+  /** 重置表单 */
+  const resetForm = () => {
+    formData.value = {
+      id: undefined,
+      name: undefined,
+      type: undefined,
+      factor: undefined,
+      factorNum: 1,
+      startTime: undefined,
+      endTime: undefined,
+      lotteryNumTerm: 1,
+      lotteryNum: 1,
+      isAllRecord: true,
+      isPersonalRecord: true,
+      isContent: true,
+      content: undefined,
+      sort: undefined,
+      status: undefined,
+      factorInfo: []
+    }
+    formRef.value?.resetFields()
+  }
+</script>

+ 257 - 0
src/views/mall/promotion/lottery/config/PrizeForm.vue

@@ -0,0 +1,257 @@
+<template>
+  <Dialog title="活动奖品配置" v-model="dialogVisible" style="width: 70%;">
+    <div class="text-right mb-20px">
+      <el-button type="primary" plain @click="handleAddPrize">
+        <Icon icon="ep:plus" class="mr-5px" /> 新增奖品
+      </el-button>
+    </div>
+    <div style="display: inline-block; width: 100%;">
+      <el-table v-loading="loading" :data="list" :stripe="true">
+      <el-table-column label="奖品名称" align="center" prop="name" />
+      <el-table-column label="奖品图片" align="center" min-width="80" prop="image">
+        <template #default="scope">
+          <img :src="scope.row.image" alt="" class="h-70px" />
+        </template>
+      </el-table-column>
+      <el-table-column label="奖品数量" align="center" prop="total" />
+      <el-table-column label="权重" align="center" prop="chance" />
+      <el-table-column label="类型" align="center" prop="type">
+        <template #default="scope">
+          <dict-tag :type="DICT_TYPE.PROMOTION_LUCK_PRIZE_TYPE" :value="scope.row.type" />
+        </template>
+      </el-table-column>
+      <el-table-column label="提示语" align="center" prop="prompt" />
+      <el-table-column label="排序" align="center" prop="sort" />
+      <el-table-column label="操作" align="center">
+        <template #default="scope">
+          <el-button link type="primary" @click="handleEdit(scope.row.id)">编辑</el-button>
+          <el-button link type="danger" @click="handleDelete(scope.row.id)">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <!-- 分页 -->
+    <Pagination :total="total" v-model:page="queryParams.pageNo" v-model:limit="queryParams.pageSize" @pagination="getList" />
+    </div>
+    <template #footer>
+      <el-button @click="dialogVisible = false">取 消</el-button>
+    </template>
+  </Dialog>
+
+  <Dialog title="添加奖品" v-model="showAddPrize">
+    <el-form
+      ref="formRef"
+      :model="addPrizeData"
+      :rules="addPrizeFormRules"
+      label-width="80px"
+    >
+      <el-form-item label="奖品" prop="type">
+        <el-radio-group v-model="addPrizeData.type">
+          <el-radio v-for="dict in getIntDictOptions(DICT_TYPE.PROMOTION_LUCK_PRIZE_TYPE)" :key="dict.value" :value="dict.value.toString()" @change="handleChangeType">{{ dict.label }}</el-radio>
+        </el-radio-group>
+      </el-form-item>
+      <el-form-item v-if="isShowSpu" label="商品" prop="productId">
+        <div style="width: 100%;">
+          <el-image v-if="Object.keys(spu).length && spu?.id" class="w-100px h-100px" :src="spu?.picUrl" />
+        </div>
+        <el-button :icon="Plus" type="primary" @click.stop="spuQueryParams.pageNo = 1,showSpu = true">选择商品</el-button>
+      </el-form-item>
+      <el-form-item label="奖品名称" prop="name">
+        <el-input v-model="addPrizeData.name" placeholder="请输入奖品名称" />
+      </el-form-item>
+      <el-form-item label="奖品图片" prop="image">
+        <UploadImg v-model="addPrizeData.image" :validSpecifications="true" height="150px" width="150px" :fileSize="10" :maxWidth="150" :maxHeight="150" />
+      </el-form-item>
+      <el-form-item label="排序" prop="sort">
+        <el-input-number v-model="addPrizeData.sort" :min="1" />
+      </el-form-item>
+      <el-form-item label="奖品数量" prop="total">
+        <el-input-number v-model="addPrizeData.total" :min="1" />
+      </el-form-item>
+      <el-form-item label="奖品权重" prop="chance">
+        <el-input-number v-model="addPrizeData.chance" :min="1" />
+      </el-form-item>
+      <el-form-item label="提示语" prop="prompt">
+        <el-input v-model="addPrizeData.prompt" placeholder="请输入提示语" />
+      </el-form-item>
+    </el-form>
+    <template #footer>
+      <el-button @click="submitPrize" type="primary">确 定</el-button>
+      <el-button @click="showAddPrize = false, spu = {}">取 消</el-button>
+    </template>
+  </Dialog>
+
+  <Dialog title="商品列表" v-model="showSpu" style="width: 70%;">
+    <div style="display: inline-block; width: 100%;">
+      <SpuList @select="handleSelectSpu" @refresh="getSpuList" />
+    </div>
+    <template #footer>
+      <el-button @click="showSpu = false">取 消</el-button>
+    </template>
+  </Dialog>
+</template>
+
+<script setup lang="ts">
+  import { Plus } from '@element-plus/icons-vue'
+  import { getIntDictOptions, DICT_TYPE } from '@/utils/dict'
+  import { LuckLotteryApi } from '@/api/mall/promotion/lottery/config'
+  import * as ProductSpuApi from '@/api/mall/product/spu'
+  import SpuList from './components/spuList.vue'
+              
+  /** 幸运抽奖-活动 表单 */
+  defineOptions({ name: 'LuckLotteryForm' })
+
+  const message = useMessage() // 消息弹窗
+
+  const loading = ref(false)
+  const list = ref([])
+  const dialogVisible = ref(false) // 弹窗的是否展示
+  const total = ref(0)
+  const queryParams = reactive({
+    pageNo: 1,
+    pageSize: 10,
+    lotteryId: undefined as any
+  })
+
+  // 获取奖品分页
+  const getList = async () => {
+    loading.value = true
+    try {
+      const res = await LuckLotteryApi.getLuckLotteryPrizePage(queryParams)
+      list.value = res.list
+      total.value = res.total
+    } finally {
+      loading.value = false
+    }
+  }
+
+  // 商品列表
+  const showSpu = ref(false)
+  const spuLoading = ref(false)
+  const spuList = ref([])
+  const spuTotal = ref(0)
+  const spuQueryParams = reactive({
+    pageNo: 1,
+    pageSize: 10
+  })
+  const getSpuList = async () => {
+    spuLoading.value = true
+    try {
+      const res = await ProductSpuApi.getSpuPage(spuQueryParams)
+      spuList.value = res.list
+      spuTotal.value = res.total
+    } finally {
+      spuLoading.value = false
+    }
+  }
+              
+  /** 打开弹窗 */
+  const open = async (id: number) => {
+    queryParams.lotteryId = id
+    await getList()
+    dialogVisible.value = true
+  }
+  defineExpose({ open }) // 提供 open 方法,用于打开弹窗
+
+  // 删除奖品
+  const handleDelete = async (id: number) => {
+    await message.confirm('确定删除该奖品吗?')
+    try {
+      await LuckLotteryApi.deleteLuckLotteryPrize(id)
+      message.success('删除成功')
+      await getList()
+    } catch {}
+  }
+
+  // 编辑奖品
+  const formType = ref('add')
+  const handleEdit = async (id: number) => {
+    resetForm()
+    formType.value = 'edit'
+    if (!id) return
+    try {
+      const data = await LuckLotteryApi.getLuckLotteryPrize(id)
+      addPrizeData.value = data
+      spu.value = data.spu
+      isShowSpu.value = data.type === '6'
+      showAddPrize.value = true
+    } catch {}
+  }
+
+  // 添加奖品
+  const addPrizeData = ref({
+    type: '1',
+    productId: undefined,
+    name: undefined,
+    total: 10,
+    chance: 10,
+    prompt: undefined,
+    image: undefined,
+    status: 0,
+    sort: 0,
+    lotteryId: undefined as any
+  })
+  const showAddPrize = ref(false)
+  const formRef = ref()
+  const addPrizeFormRules = reactive({
+    type: [{ required: true, message: '奖品类型不能为空', trigger: 'change' }],
+    name: [{ required: true, message: '奖品名称不能为空', trigger: 'blur' }],
+    chance: [{ required: true, message: '奖品权重不能为空', trigger: 'blur' }],
+    image: [{ required: true, message: '奖品图片不能为空', trigger: 'blur' }],
+    total: [{ required: true, message: '商品数量不能为空', trigger: 'blur' }],
+    prompt: [{ required: true, message: '提示语不能为空', trigger: 'blur' }]
+  })
+  const handleAddPrize = async () => {
+    formType.value = 'add'
+    isShowSpu.value = false
+    resetForm()
+    showAddPrize.value = true
+    await getSpuList()
+  }
+
+  // 只有站内商品才展示商品信息
+  const isShowSpu = ref(false)
+  const handleChangeType = (val: string) => {
+    isShowSpu.value = val === '6'
+  }
+  const submitPrize = async () => {
+    // 校验表单
+    await formRef.value.validate()
+    if (isShowSpu.value && !Object.keys(spu.value).length && !spu.value?.id) return message.warning('请选择商品')
+    addPrizeData.value.lotteryId = queryParams.lotteryId
+    addPrizeData.value.productId = spu.value.id
+    addPrizeData.value.image = spu.value?.picUrl
+    delete addPrizeData.value.spu
+    try {
+      formType.value === 'add' ? await LuckLotteryApi.createLuckLotteryPrize(addPrizeData.value) : await LuckLotteryApi.updateLuckLotteryPrize(addPrizeData.value)
+      message.success(formType.value === 'add' ? '添加成功' : '修改成功')
+      showAddPrize.value = false
+      spu.value = {}
+      getList()
+    } catch {}
+  }
+
+  const resetForm = () => {
+    spu.value = {}
+    addPrizeData.value = {
+      type: '1',
+      productId: undefined,
+      name: undefined,
+      total: 10,
+      chance: 10,
+      prompt: undefined,
+      image: undefined,
+      status: 0,
+      sort: 0,
+      lotteryId: undefined as any
+    }
+  }
+
+  // 选中商品
+  const spu = ref({})
+  const handleSelectSpu = (row: any) =>{
+    spu.value = row
+    addPrizeData.value.name = row.name
+    addPrizeData.value.image = row.picUrl
+    showSpu.value = false
+  }
+</script>

+ 80 - 0
src/views/mall/promotion/lottery/config/components/spuList.vue

@@ -0,0 +1,80 @@
+<template>
+	<el-table ref="spuListRef" v-loading="loading" :data="list" :stripe="true" row-key="id">
+		<el-table-column v-if="multiple" type="selection" width="55" />
+    <el-table-column label="商品图片" align="center" min-width="80" prop="picUrl">
+      <template #default="scope">
+        <img :src="scope.row.picUrl" alt="" class="h-40px" />
+      </template>
+    </el-table-column>
+    <el-table-column label="商品名称" align="center" prop="name" />
+    <el-table-column v-if="!multiple" label="操作" align="center" min-width="80" prop="url">
+      <template #default="scope">
+      <el-button link type="primary" @click.stop="emit('select', scope.row)">选择</el-button>
+      </template>
+    </el-table-column>
+  </el-table>
+  <!-- 分页 -->
+  <Pagination :total="total" v-model:page="queryParams.pageNo" v-model:limit="queryParams.pageSize" @pagination="getSpuList" />
+</template>
+
+<script setup lang="ts">
+defineOptions({ name: 'SpuList'})
+import * as ProductSpuApi from '@/api/mall/product/spu'
+
+const emit = defineEmits(['refresh', 'select'])
+
+const props = defineProps({
+	// 是否选择,是否多选
+	multiple: {
+		type: Boolean,
+		default: false
+	},
+	// 选中的数据
+	select: {
+		type: Array,
+		default: () => []
+	}
+})
+
+const spuListRef = ref()
+
+const total = ref(0)
+const list = ref([])
+const loading = ref(false)
+const queryParams = reactive({
+  pageNo: 1,
+	pageSize: 10
+})
+const selectedRows = ref(props.select)
+
+const getSpuList = async () => {
+  loading.value = true
+  try {
+    const res = await ProductSpuApi.getSpuPage(queryParams)
+    list.value = res.list
+    total.value = res.total
+
+		// 回显已选中的数据
+		if (props.multiple && selectedRows.value && selectedRows.value.length) {
+			nextTick(() => {
+				selectedRows.value.forEach(item => {
+					const index = list.value.findIndex(row => row.id === item.id)
+					if (index > -1) {
+						spuListRef.value.toggleRowSelection(list.value[index], true)
+					}
+				})
+			})
+		}
+  } finally {
+    loading.value = false
+  }
+}
+
+onMounted(async () => {
+  await getSpuList()
+})
+
+defineExpose({
+	spuListRef
+})
+</script>

+ 250 - 0
src/views/mall/promotion/lottery/config/index.vue

@@ -0,0 +1,250 @@
+<template>
+  <ContentWrap>
+    <!-- 搜索工作栏 -->
+    <el-form
+      class="-mb-15px"
+      :model="queryParams"
+      ref="queryFormRef"
+      :inline="true"
+      label-width="80px"
+    >
+      <el-form-item label="奖品名称" prop="name">
+        <el-input
+          v-model="queryParams.name"
+          placeholder="请输入奖品名称"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="类型" prop="type">
+        <el-select v-model="queryParams.type" placeholder="请选择类型" clearable class="!w-240px">
+          <el-option v-for="dict in getIntDictOptions(DICT_TYPE.PROMOTION_LUCK_LOTTERY_TYPE)" :key="dict.value" :label="dict.label" :value="dict.value" />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="状态" prop="status">
+        <el-select v-model="queryParams.status" placeholder="请选择状态" clearable class="!w-240px">
+          <el-option v-for="dict in getIntDictOptions(DICT_TYPE.COMMON_STATUS)" :key="dict.value" :label="dict.label" :value="dict.value" />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="开始时间" prop="startTime">
+        <el-date-picker
+          v-model="queryParams.startTime"
+          value-format="YYYY-MM-DD HH:mm:ss"
+          type="daterange"
+          start-placeholder="开始日期"
+          end-placeholder="结束日期"
+          :default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="结束时间" prop="endTime">
+        <el-date-picker
+          v-model="queryParams.endTime"
+          value-format="YYYY-MM-DD HH:mm:ss"
+          type="daterange"
+          start-placeholder="开始日期"
+          end-placeholder="结束日期"
+          :default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="创建时间" prop="createTime">
+        <el-date-picker
+          v-model="queryParams.createTime"
+          value-format="YYYY-MM-DD HH:mm:ss"
+          type="daterange"
+          start-placeholder="开始日期"
+          end-placeholder="结束日期"
+          :default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
+        <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
+        <el-button
+          type="primary"
+          plain
+          @click="openForm('create')"
+          v-hasPermi="['promotion:luck-lottery:create']"
+        >
+          <Icon icon="ep:plus" class="mr-5px" /> 新增
+        </el-button>
+        <el-button
+          type="success"
+          plain
+          @click="handleExport"
+          :loading="exportLoading"
+          v-hasPermi="['promotion:luck-lottery:export']"
+        >
+          <Icon icon="ep:download" class="mr-5px" /> 导出
+        </el-button>
+      </el-form-item>
+    </el-form>
+  </ContentWrap>
+
+  <!-- 列表 -->
+  <ContentWrap>
+    <el-table v-loading="loading" :data="list" :stripe="true">
+      <el-table-column label="活动名称" align="center" prop="name" />
+      <el-table-column label="类型" align="center" prop="type">
+        <template #default="scope">
+          <dict-tag :type="DICT_TYPE.PROMOTION_LUCK_LOTTERY_TYPE" :value="scope.row.type" />
+        </template>
+      </el-table-column>
+      <el-table-column label="抽奖消耗" align="center" prop="factor" width="153px">
+        <template #default="scope">
+          <dict-tag :type="DICT_TYPE.PROMOTION_LUCK_LOTTERY_FACTOR" :value="scope.row.factor" />
+        </template>
+      </el-table-column>
+      <el-table-column label="开始时间" align="center" prop="startTime" :formatter="dateFormatter2" width="110px" />
+      <el-table-column label="结束时间" align="center" prop="endTime" :formatter="dateFormatter2" width="110px" />
+      <el-table-column label="获取一次抽奖的条件数量" align="center" prop="factorNum" />
+      <el-table-column label="中奖记录展示" align="center" prop="isAllRecord">
+        <template #default="scope">{{ scope.row.isAllRecord ? '是' : '否'}}</template>
+      </el-table-column>
+      <el-table-column label="个人中奖记录展示" align="center" prop="isPersonalRecord">
+        <template #default="scope">{{ scope.row.isPersonalRecord ? '是' : '否'}}</template>
+      </el-table-column>
+      <el-table-column label="活动规格是否展示" align="center" prop="isContent">
+        <template #default="scope">{{ scope.row.isContent ? '是' : '否'}}</template>
+      </el-table-column>
+      <el-table-column label="排序" align="center" prop="sort" />
+      <el-table-column label="状态" align="center" prop="status">
+        <template #default="scope">
+          <dict-tag :type="DICT_TYPE.COMMON_STATUS" :value="scope.row.status" />
+        </template>
+      </el-table-column>
+      <el-table-column label="创建时间" align="center" prop="createTime" :formatter="dateFormatter" width="170px" />
+      <el-table-column label="操作" align="center" fixed="right" min-width="150">
+        <template #default="scope">
+          <el-button link type="success" @click="openPrize(scope.row.id)">奖品</el-button>
+          <el-button link type="primary" @click="openForm('update', scope.row.id)" v-hasPermi="['promotion:luck-lottery:update']">编辑</el-button>
+          <el-button link type="danger" @click="handleDelete(scope.row.id)" v-hasPermi="['promotion:luck-lottery:delete']">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <!-- 分页 -->
+    <Pagination
+      :total="total"
+      v-model:page="queryParams.pageNo"
+      v-model:limit="queryParams.pageSize"
+      @pagination="getList"
+    />
+  </ContentWrap>
+
+  <!-- 表单弹窗:添加/修改 -->
+  <LuckLotteryForm ref="formRef" @success="getList" />
+
+  <!-- 奖品配置 -->
+  <PrizeForm ref="prizeRef" @success="getList" />
+</template>
+
+<script setup lang="ts">
+import { getIntDictOptions, DICT_TYPE } from '@/utils/dict'
+import { dateFormatter2, dateFormatter } from '@/utils/formatTime'
+import download from '@/utils/download'
+import { LuckLotteryApi, LuckLotteryVO } from '@/api/mall/promotion/lottery/config'
+import LuckLotteryForm from './LuckLotteryForm.vue'
+import PrizeForm from './PrizeForm.vue'
+
+/** 幸运抽奖-活动 列表 */
+defineOptions({ name: 'LotteryConfigIndex' })
+
+const message = useMessage() // 消息弹窗
+const { t } = useI18n() // 国际化
+
+const loading = ref(true) // 列表的加载中
+const list = ref<LuckLotteryVO[]>([]) // 列表的数据
+const total = ref(0) // 列表的总页数
+const queryParams = reactive({
+  pageNo: 1,
+  pageSize: 10,
+  name: undefined,
+  type: undefined,
+  factor: undefined,
+  factorNum: undefined,
+  attendsUser: undefined,
+  isSvip: undefined,
+  startTime: [],
+  endTime: [],
+  isAllRecord: undefined,
+  isPersonalRecord: undefined,
+  isContent: undefined,
+  sort: undefined,
+  status: undefined,
+  createTime: []
+})
+const queryFormRef = ref() // 搜索的表单
+const exportLoading = ref(false) // 导出的加载中
+
+/** 查询列表 */
+const getList = async () => {
+  loading.value = true
+  try {
+    const data = await LuckLotteryApi.getLuckLotteryPage(queryParams)
+    list.value = data.list
+    total.value = data.total
+  } finally {
+    loading.value = false
+  }
+}
+
+/** 搜索按钮操作 */
+const handleQuery = () => {
+  queryParams.pageNo = 1
+  getList()
+}
+
+/** 重置按钮操作 */
+const resetQuery = () => {
+  queryFormRef.value.resetFields()
+  handleQuery()
+}
+
+/** 添加/修改操作 */
+const formRef = ref()
+const openForm = (type: string, id?: number) => {
+  formRef.value.open(type, id)
+}
+
+// 奖品配置
+const prizeRef = ref()
+const openPrize = (id: number) => {
+  prizeRef.value.open(id)
+}
+
+/** 删除按钮操作 */
+const handleDelete = async (id: number) => {
+  try {
+    // 删除的二次确认
+    await message.delConfirm()
+    // 发起删除
+    await LuckLotteryApi.deleteLuckLottery(id)
+    message.success(t('common.delSuccess'))
+    // 刷新列表
+    await getList()
+  } catch {}
+}
+
+/** 导出按钮操作 */
+const handleExport = async () => {
+  try {
+    // 导出的二次确认
+    await message.exportConfirm()
+    // 发起导出
+    exportLoading.value = true
+    const data = await LuckLotteryApi.exportLuckLottery(queryParams)
+    download.excel(data, '幸运抽奖-活动.xls')
+  } catch {
+  } finally {
+    exportLoading.value = false
+  }
+}
+
+/** 初始化 **/
+onMounted(() => {
+  getList()
+})
+</script>

+ 130 - 0
src/views/mall/promotion/lottery/record/LuckLotteryRecordForm.vue

@@ -0,0 +1,130 @@
+<template>
+    <Dialog :title="dialogTitle" v-model="dialogVisible">
+        <el-form
+            ref="formRef"
+            :model="formData"
+            :rules="formRules"
+            label-width="130px"
+            v-loading="formLoading"
+        >
+            <el-form-item label="奖品类型" prop="type">
+                <el-select v-model="formData.type" placeholder="请选择奖品类型" clearable>
+                    <el-option v-for="dict in getIntDictOptions(DICT_TYPE.PROMOTION_LUCK_PRIZE_TYPE)" :key="dict.value" :label="dict.label" :value="dict.value.toString()" />
+                </el-select>
+            </el-form-item>
+            <el-form-item label="是否领取" prop="isReceive">
+                <el-switch v-model="formData.isReceive" />
+            </el-form-item>
+            <el-form-item label="领取时间" prop="receiveTime">
+                <el-date-picker v-model="formData.receiveTime" type="date" value-format="x" placeholder="选择领取时间" />
+            </el-form-item>
+            <el-form-item label="收获地址、备注等" prop="receiveInfo">
+                <el-input v-model="formData.receiveInfo" placeholder="请输入收获地址、备注等" />
+            </el-form-item>
+            <el-form-item label="是否发货" prop="isDeliver">
+                <el-switch v-model="formData.isDeliver" />
+            </el-form-item>
+            <el-form-item label="发货处理时间" prop="deliverTime">
+                <el-date-picker v-model="formData.deliverTime" type="date" value-format="x" placeholder="选择发货处理时间" />
+            </el-form-item>
+            <el-form-item label="发货单号、备注等" prop="deliverInfo">
+                <el-input v-model="formData.deliverInfo" placeholder="请输入发货单号、备注等" />
+            </el-form-item>
+        </el-form>
+        <template #footer>
+          <el-button @click="submitForm" type="primary" :disabled="formLoading">确 定</el-button>
+          <el-button @click="dialogVisible = false">取 消</el-button>
+        </template>
+    </Dialog>
+</template>
+
+<script setup lang="ts">
+import { getIntDictOptions, DICT_TYPE } from '@/utils/dict'
+import { LuckLotteryRecordApi, LuckLotteryRecordVO } from '@/api/mall/promotion/lottery/record'
+          
+/** 幸运抽奖-抽奖记录 表单 */
+defineOptions({ name: 'LuckLotteryRecordForm' })
+const { t } = useI18n() // 国际化
+const message = useMessage() // 消息弹窗
+const dialogVisible = ref(false) // 弹窗的是否展示
+const dialogTitle = ref('') // 弹窗的标题
+const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
+const formType = ref('') // 表单的类型:create - 新增;update - 修改
+const formData = ref({
+    id: undefined,
+    userId: undefined,
+    lotteryId: undefined,
+    prizeId: undefined,
+    type: undefined,
+    isReceive: undefined,
+    receiveTime: undefined,
+    receiveInfo: undefined,
+    isDeliver: undefined,
+    deliverTime: undefined,
+    deliverInfo: undefined,
+})
+const formRules = reactive({
+    type: [{ required: true, message: '奖品类型不能为空', trigger: 'change' }],
+    isReceive: [{ required: true, message: '是否领取不能为空', trigger: 'change' }],
+    isDeliver: [{ required: true, message: '是否发货不能为空', trigger: 'change' }],
+})
+const formRef = ref() // 表单 Ref
+          
+/** 打开弹窗 */
+const open = async (type: string, id?: number) => {
+    dialogVisible.value = true
+    dialogTitle.value = t('action.' + type)
+    formType.value = type
+    resetForm()
+    // 修改时,设置数据
+    if (id) {
+        formLoading.value = true
+        try {
+            formData.value = await LuckLotteryRecordApi.getLuckLotteryRecord(id)
+        } finally {
+            formLoading.value = false
+        }
+    }
+}
+defineExpose({ open }) // 提供 open 方法,用于打开弹窗
+/** 提交表单 */
+const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
+const submitForm = async () => {
+    // 校验表单
+    await formRef.value.validate()
+    // 提交请求
+    formLoading.value = true
+    try {
+        const data = formData.value as unknown as LuckLotteryRecordVO
+        if (formType.value === 'create') {
+            await LuckLotteryRecordApi.createLuckLotteryRecord(data)
+            message.success(t('common.createSuccess'))
+        } else {
+            await LuckLotteryRecordApi.updateLuckLotteryRecord(data)
+            message.success(t('common.updateSuccess'))
+        }
+        dialogVisible.value = false
+        // 发送操作成功的事件
+        emit('success')
+    } finally {
+        formLoading.value = false
+    }
+}
+/** 重置表单 */
+const resetForm = () => {
+    formData.value = {
+        id: undefined,
+        userId: undefined,
+        lotteryId: undefined,
+        prizeId: undefined,
+        type: undefined,
+        isReceive: undefined,
+        receiveTime: undefined,
+        receiveInfo: undefined,
+        isDeliver: undefined,
+        deliverTime: undefined,
+        deliverInfo: undefined,
+    }
+    formRef.value?.resetFields()
+}
+</script>

+ 201 - 0
src/views/mall/promotion/lottery/record/index.vue

@@ -0,0 +1,201 @@
+<template>
+  <ContentWrap>
+    <!-- 搜索工作栏 -->
+    <el-form
+      class="-mb-15px"
+      :model="queryParams"
+      ref="queryFormRef"
+      :inline="true"
+      label-width="68px"
+    >
+      <el-form-item label="奖品类型" prop="type">
+        <el-select v-model="queryParams.type" placeholder="请选择奖品类型" clearable class="!w-240px">
+          <el-option v-for="dict in getIntDictOptions(DICT_TYPE.PROMOTION_LUCK_PRIZE_TYPE)" :key="dict.value" :label="dict.label" :value="dict.value" />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="是否领取" prop="isReceive">
+        <el-input
+          v-model="queryParams.isReceive"
+          placeholder="请输入是否领取"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="是否发货" prop="isDeliver">
+        <el-input
+          v-model="queryParams.isDeliver"
+          placeholder="请输入是否发货"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="创建时间" prop="createTime">
+        <el-date-picker
+          v-model="queryParams.createTime"
+          value-format="YYYY-MM-DD HH:mm:ss"
+          type="daterange"
+          start-placeholder="开始日期"
+          end-placeholder="结束日期"
+          :default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
+        <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
+        <el-button
+          type="primary"
+          plain
+          @click="openForm('create')"
+          v-hasPermi="['promotion:luck-lottery-record:create']"
+        >
+          <Icon icon="ep:plus" class="mr-5px" /> 新增
+        </el-button>
+        <el-button
+          type="success"
+          plain
+          @click="handleExport"
+          :loading="exportLoading"
+          v-hasPermi="['promotion:luck-lottery-record:export']"
+        >
+          <Icon icon="ep:download" class="mr-5px" /> 导出
+        </el-button>
+      </el-form-item>
+    </el-form>
+  </ContentWrap>
+
+  <!-- 列表 -->
+  <ContentWrap>
+    <el-table v-loading="loading" :data="list" :stripe="true">
+      <el-table-column label="中奖用户" align="center" prop="user.name" />
+      <el-table-column label="奖品类型" align="center" prop="record.type" width="153px">
+        <template #default="scope">
+          <dict-tag :type="DICT_TYPE.PROMOTION_LUCK_PRIZE_TYPE" :value="scope.row.record.type" />
+        </template>
+      </el-table-column>
+      <el-table-column label="是否领取" align="center" prop="record.isReceive">
+        <template #default="scope">{{ scope.row.record.isReceive ? '是' : '否' }}</template>
+      </el-table-column>
+      <el-table-column label="领取时间" align="center" prop="record.receiveTime" :formatter="dateFormatter" width="180px" />
+      <el-table-column label="收获地址、备注等" align="center" prop="record.receiveInfo" />
+      <el-table-column label="是否发货" align="center" prop="record.isDeliver">
+        <template #default="scope">{{ scope.row.record.isDeliver ? '是' : '否' }}</template>
+      </el-table-column>
+      <el-table-column label="发货处理时间" align="center" prop="record.deliverTime" :formatter="dateFormatter" width="180px" />
+      <el-table-column label="发货单号、备注等" align="center" prop="record.deliverInfo" />
+      <el-table-column label="创建时间" align="center" prop="record.createTime" :formatter="dateFormatter" width="180px" />
+      <el-table-column label="操作" align="center" fixed="right" min-width="120">
+        <template #default="scope">
+          <el-button link type="primary" @click="openForm('update', scope.row.id)" v-hasPermi="['promotion:luck-lottery-record:update']">编辑</el-button>
+          <el-button link type="danger" @click="handleDelete(scope.row.id)" v-hasPermi="['promotion:luck-lottery-record:delete']">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <!-- 分页 -->
+    <Pagination
+      :total="total"
+      v-model:page="queryParams.pageNo"
+      v-model:limit="queryParams.pageSize"
+      @pagination="getList"
+    />
+  </ContentWrap>
+
+  <!-- 表单弹窗:添加/修改 -->
+  <LuckLotteryRecordForm ref="formRef" @success="getList" />
+</template>
+
+<script setup lang="ts">
+import { dateFormatter } from '@/utils/formatTime'
+import { getIntDictOptions, DICT_TYPE } from '@/utils/dict'
+import download from '@/utils/download'
+import { LuckLotteryRecordApi, LuckLotteryRecordVO } from '@/api/mall/promotion/lottery/record'
+import LuckLotteryRecordForm from './LuckLotteryRecordForm.vue'
+
+/** 幸运抽奖-抽奖记录 列表 */
+defineOptions({ name: 'LuckLotteryRecord' })
+
+const message = useMessage() // 消息弹窗
+const { t } = useI18n() // 国际化
+
+const loading = ref(true) // 列表的加载中
+const list = ref<LuckLotteryRecordVO[]>([]) // 列表的数据
+const total = ref(0) // 列表的总页数
+const queryParams = reactive({
+  pageNo: 1,
+  pageSize: 10,
+  userId: undefined,
+  lotteryId: undefined,
+  prizeId: undefined,
+  type: undefined,
+  isReceive: undefined,
+  isDeliver: undefined,
+  createTime: []
+})
+const queryFormRef = ref() // 搜索的表单
+const exportLoading = ref(false) // 导出的加载中
+
+/** 查询列表 */
+const getList = async () => {
+  loading.value = true
+  try {
+    const data = await LuckLotteryRecordApi.getLuckLotteryRecordPage(queryParams)
+    list.value = data.list
+    total.value = data.total
+  } finally {
+    loading.value = false
+  }
+}
+
+/** 搜索按钮操作 */
+const handleQuery = () => {
+  queryParams.pageNo = 1
+  getList()
+}
+
+/** 重置按钮操作 */
+const resetQuery = () => {
+  queryFormRef.value.resetFields()
+  handleQuery()
+}
+
+/** 添加/修改操作 */
+const formRef = ref()
+const openForm = (type: string, id?: number) => {
+  formRef.value.open(type, id)
+}
+
+/** 删除按钮操作 */
+const handleDelete = async (id: number) => {
+  try {
+    // 删除的二次确认
+    await message.delConfirm()
+    // 发起删除
+    await LuckLotteryRecordApi.deleteLuckLotteryRecord(id)
+    message.success(t('common.delSuccess'))
+    // 刷新列表
+    await getList()
+  } catch {}
+}
+
+/** 导出按钮操作 */
+const handleExport = async () => {
+  try {
+    // 导出的二次确认
+    await message.exportConfirm()
+    // 发起导出
+    exportLoading.value = true
+    const data = await LuckLotteryRecordApi.exportLuckLotteryRecord(queryParams)
+    download.excel(data, '幸运抽奖-抽奖记录.xls')
+  } catch {
+  } finally {
+    exportLoading.value = false
+  }
+}
+
+/** 初始化 **/
+onMounted(() => {
+  getList()
+})
+</script>

+ 3 - 1
src/views/menduner/system/enterprise/register/index.vue

@@ -233,7 +233,9 @@ const handleReject = (id: number) => {
   registerRef.value.open(id)
 }
 /** 初始化 **/
-onMounted(() => {
+onActivated(() => {
+  queryParams.pageNo = 1
   getList()
 })
+
 </script>