Bläddra i källkod

fix:开发抽奖活动

wuguojie 1 år sedan
förälder
incheckning
c8474f2348

+ 3 - 1
src/api/index.ts

@@ -14,6 +14,7 @@ import operationApi from './modules/operation.ts'
 import menuApi from './modules/menu.ts'
 import commonApi from "./modules/common.ts";
 import teamApi from "@/api/modules/team.ts";
+import lotteryApi from '@/api/modules/lottery.ts'
 
 const axiosInstance:ApiInstance = axios.create({
   baseURL: (import.meta.env.DEV && import.meta.env.VITE_OPEN_PROXY === 'true') ? '/proxy/' : import.meta.env.VITE_APP_API_BASEURL,
@@ -98,6 +99,7 @@ const api = {
   operationApi: operationApi(axiosInstance),
   menuApi:menuApi(axiosInstance),
   commonApi: commonApi(axiosInstance),
-  teamApi: teamApi(axiosInstance)
+  teamApi: teamApi(axiosInstance),
+  lotteryApi: lotteryApi(axiosInstance)
 }
 export default api

+ 41 - 0
src/api/modules/lottery.ts

@@ -0,0 +1,41 @@
+import { ApiInstance } from '../type'
+
+export interface AddActivity {
+  actName: string,
+  actMethod: string, // 1 九宫格 2 大转盘
+  actStartTime: string,
+  actEndTime: string,
+  actDept: string,
+  deptIds: string[],
+  id?: string
+}
+export interface GetActivityList {
+  actName?: string,
+  actStatus?: string
+}
+
+export interface AwardList {
+  awardType?: string,
+  cashType?: string,
+  awardName?: string,
+  fixedAmount?: number,
+  minAmount?: number,
+  maxAmount?: number,
+  awardImg?: string
+}
+export interface AddActivityAward {
+  awardList: AwardList[],
+  activityId: string
+}
+
+const lotteryApi = (axiosInstance: ApiInstance) => ({
+  addActivity: (data: AddActivity) => axiosInstance.post('/activity/addActivity', data),
+  getActivityList: (data: GetActivityList) => axiosInstance.post('/activity/getActivityList', data),
+  addActivityAward: (data: AddActivityAward) => axiosInstance.post('/activity/addActivityAward', data),
+  getActivity: (data: { id: string }) => axiosInstance.post('/activity/getActivity', data),
+  updateActivity: (data: AddActivity) => axiosInstance.post('/activity/updateActivity', data),
+  deleteActivity: (data: { id: string }) => axiosInstance.post('/activity/deleteActivity', data),
+  endActivity: (data: { id: string }) => axiosInstance.post('/activity/endActivity', data)
+})
+
+export default lotteryApi

BIN
src/assets/images/jiugongge.png


BIN
src/assets/images/zhuanpan.png


+ 0 - 1
src/layouts/components/Menu/index.vue

@@ -30,7 +30,6 @@ const isMenuPopup = computed<MenuInjection['isMenuPopup']>(() => {
 
 // 解析传入的 menu 数据,并保存到 items 和 subMenus 对象中
 function initItems(menu: MenuProps['menu'], parentPaths: string[] = []) {
-  console.log(menu)
   menu.forEach((item) => {
     const index = item.path ?? JSON.stringify(item)
     if (item.children) {

+ 1 - 2
src/router/guards.ts

@@ -75,12 +75,11 @@ function setupRoutes(router: Router) {
         routeStore.flatRoutes.forEach((route) => {
 
           if (!/^(?:https?:|mailto:|tel:)/.test(route.path)) {
-            console.log(router)
             removeRoutes.push(router.addRoute(route as RouteRecordRaw))
           }
         })
         if (settingsStore.settings.app.routeBaseOn !== 'filesystem') {
-     
+
           routeStore.flatSystemRoutes.forEach((route) => {
             removeRoutes.push(router.addRoute(route as RouteRecordRaw))
           })

+ 34 - 0
src/router/modules/marketing.ts

@@ -0,0 +1,34 @@
+import type { RouteRecordRaw } from 'vue-router'
+
+const Layout = () => import('@/layouts/index.vue')
+
+const routes: RouteRecordRaw = {
+  path: '/marketingManagement',
+  component: Layout,
+  redirect: '/marketingManagement/lottery',
+  name: 'MarketingManagement',
+  meta: {
+    title: '营销工具',
+  },
+  children: [
+    // {
+    //   path: '/operationDetail',
+    //   name: 'OperationDetail',
+    //   component: () => import('@/views/operationManagement/operationDetail.vue'),
+    //   meta: {
+    //     title: '业务员详情',
+    //     menu: false,
+    //   },
+    // },
+    {
+      path: 'lottery',
+      name: 'Lottery',
+      component: () => import('@/views/marketingManagement/lottery.vue'),
+      meta: {
+        title: '抽奖活动',
+      },
+    }
+  ],
+}
+
+export default routes

+ 8 - 0
src/router/routes.ts

@@ -7,6 +7,7 @@ import MultilevelMenuExample from "./modules/multilevel.menu.example";
 import organizationManagement from "./modules/organization";
 import operationManagement from "./modules/operation";
 import personnel from "./modules/personnel";
+import marketingManagement from "./modules/marketing.ts";
 // import {  } from "@/store/modules/user";
 // 固定路由(默认路由
 // console.log(useUserStore)
@@ -87,6 +88,13 @@ const asyncRoutes: Route.recordMainRaw[] = [
     },
     children: [operationManagement],
   },
+  {
+    meta: {
+      title: '营销管理',
+      icon: "i-uim:box",
+    },
+    children: [marketingManagement],
+  }
   // {
   //   meta: {
   //     title: "租户运营",

+ 592 - 0
src/views/marketingManagement/configurate.vue

@@ -0,0 +1,592 @@
+<template>
+  <div class="configurate">
+    <div class="steps">
+      <el-steps style="width: 800px" :active="active" finish-status="success" simple>
+        <el-step title="配置基本信息" />
+        <el-step title="配置奖品" />
+        <el-step title="配置完成" />
+      </el-steps>
+    </div>
+    <div class="content" v-if="active===0">
+      <el-row :gutter="20" style="height: 100%">
+        <el-col :span="4" class="image">
+          <img v-if="basicForm.actMethod=='2'" src="@/assets/images/zhuanpan.png" />
+          <img v-else src="@/assets/images/jiugongge.png" />
+        </el-col>
+        <el-col :span="20">
+          <el-descriptions title="基本信息">
+            <el-descriptions-item>
+              <el-form ref="BasicFormRef" :model="basicForm" :rules="basicRules">
+                <el-row :gutter="20">
+                  <el-col :span="12">
+                    <el-form-item label="活动名称" prop="actName">
+                      <el-input v-model="basicForm.actName" placeholder="输入活动名称"></el-input>
+                    </el-form-item>
+                  </el-col>
+                  <el-col :span="12">
+                    <el-form-item label="抽奖方式" prop="actMethod">
+                      <el-radio-group v-model="basicForm.actMethod">
+                        <el-radio-button label="大转盘" value="2"></el-radio-button>
+                        <el-radio-button label="九宫格" value="1"></el-radio-button>
+                      </el-radio-group>
+                    </el-form-item>
+                  </el-col>
+                </el-row>
+                <el-row :gutter="20">
+                  <el-col :span="12">
+                    <el-form-item label="开始时间" prop="actStartTime">
+                      <el-date-picker
+                        v-model="basicForm.actStartTime"
+                        type="date"
+                        placeholder="请选择"
+                        format="YYYY-MM-DD"
+                        value-format="YYYY-MM-DD"
+                        style="width: 100%"
+                      />
+                    </el-form-item>
+                  </el-col>
+                  <el-col :span="12">
+                    <el-form-item label="结束时间" prop="actEndTime">
+                      <el-date-picker
+                        v-model="basicForm.actEndTime"
+                        type="date"
+                        placeholder="请选择"
+                        format="YYYY-MM-DD"
+                        value-format="YYYY-MM-DD"
+                        :disabled-date="disabledDate"
+                        style="width: 100%"
+                      />
+                    </el-form-item>
+                  </el-col>
+                </el-row>
+                <el-row :gutter="20">
+                  <el-col :span="12">
+                    <el-form-item label="所属机构" prop="actDept">
+                      <el-cascader
+                        clearable
+                        v-model="basicForm.actDept"
+                        :options="option"
+                        :props="cascaderProps"
+                        style="width: 100%"
+                        placeholder="选择机构"
+                        filterable
+                      ></el-cascader>
+                    </el-form-item>
+                  </el-col>
+                </el-row>
+              </el-form>
+            </el-descriptions-item>
+          </el-descriptions>
+          <el-divider />
+          <el-descriptions title="参与限制">
+            <el-descriptions-item>
+              <div>
+                <a>参与机构</a>&nbsp;&nbsp;&nbsp;
+                <el-button link type="primary" @click="selectDeptData">
+                  选择
+                </el-button>
+              </div>
+              <el-table
+                :data="deptData"
+                height="330"
+              >
+                <el-table-column label="机构" prop="name"></el-table-column>
+                <el-table-column label="操作" width="150">
+                  <template #default="scope">
+                    <el-button link type="primary" @click="deleteDeptData(scope)">
+                      删除
+                    </el-button>
+                  </template>
+                </el-table-column>
+              </el-table>
+            </el-descriptions-item>
+          </el-descriptions>
+          <div class="btns">
+            <el-button plain @click="cancelFirst">取消</el-button>
+            <el-button type="primary" @click="confirmFirst(BasicFormRef)">下一步</el-button>
+          </div>
+        </el-col>
+      </el-row>
+    </div>
+    <div class="content" v-if="active===1">
+      <el-row :gutter="20" style="height: 100%">
+        <el-col :span="4" class="image">
+          <img v-if="basicForm.actMethod=='2'" src="@/assets/images/zhuanpan.png" />
+          <img v-else src="@/assets/images/jiugongge.png" />
+        </el-col>
+        <el-col :span="20">
+          <el-descriptions title="奖品配置" style="height: 650px;">
+            <el-descriptions-item>
+              <el-tabs v-model="activeName" class="demo-tabs" @tab-click="handleClick">
+                <el-tab-pane v-for="(item, index) in gifts" :label="item.tab.label" :name="item.tab.name" :key="index">
+                  <el-form :model="item.form" label-width="70">
+                    <el-form-item label="奖品分类" prop="type">
+                      <el-radio-group v-model="item.form.awardType">
+                        <el-radio value="1">现金</el-radio>
+                        <el-radio value="2">增值</el-radio>
+                      </el-radio-group>
+                      <div v-if="item.form.awardType=='1'" style="display: flex; align-items: center; margin-left: 20px;">
+                        <span>面值类型:</span>
+                        <el-select v-model="item.form.awardCashType" style="width: 150px;">
+                          <el-option label="固定面值" value="1"></el-option>
+                          <el-option label="区间面值" value="2"></el-option>
+                        </el-select>
+                      </div>
+                    </el-form-item>
+                    <el-form-item label="奖品名称" prop="name">
+                      <el-input v-model="item.form.awardName" placeholder="请输入"></el-input>
+                    </el-form-item>
+                    <el-form-item label="现金面值" prop="money" v-if="item.form.awardType=='1'">
+                      <el-input v-if="item.form.awardCashType == '1'" v-model="item.form.awardFixedAmount" placeholder="请输入"></el-input>
+                      <div v-else style="display: flex; align-items: center">
+                        <el-input v-model="item.form.awardMinAmount" placeholder="请输入"></el-input>
+                        &nbsp;至&nbsp;
+                        <el-input v-model="item.form.awardMaxAmount" placeholder="请输入"></el-input>
+                      </div>
+                    </el-form-item>
+                    <el-form-item label="奖品图" prop="image">
+                      <el-upload v-if="item.form.imageUrl" style="display: inline" :auto-upload="false" :show-file-list="false" accept=".png, .jpg, .jpeg" @change="uploadImage($event, item)">
+                        <img class="imageUrl" :src="item.form.imageUrl" />
+                      </el-upload>
+                      <el-upload v-else style="display: inline" :auto-upload="false" :show-file-list="false" accept=".png, .jpg, .jpeg" @change="uploadImage($event, item)">
+                        <el-icon class="btn-icon"><Plus /></el-icon>
+                      </el-upload>
+                    </el-form-item>
+                  </el-form>
+                </el-tab-pane>
+              </el-tabs>
+            </el-descriptions-item>
+          </el-descriptions>
+          <div class="btns">
+            <el-button plain @click="cancelSecond">取消</el-button>
+            <el-button type="primary" @click="confirmSecond(BasicFormRef)">下一步</el-button>
+          </div>
+        </el-col>
+      </el-row>
+    </div>
+    <div class="content" v-if="active===2 || active===3">
+      <div class="result">
+        <el-result
+          icon="success"
+          title="奖品配置完成!"
+        >
+          <template #extra>
+            <el-button type="primary" @click="back">返回</el-button>
+          </template>
+        </el-result>
+      </div>
+    </div>
+    <el-dialog
+      v-model="selectDeptShow"
+      title="参与机构选择"
+      width="600"
+    >
+      <el-input
+        v-model="filterText"
+        style="width: 240px"
+        placeholder="输入名称"
+        :prefix-icon="Search"
+      />
+      <el-tree
+        ref="treeRef"
+        class="filter-tree"
+        show-checkbox
+        node-key="id"
+        :data="option"
+        :props="defaultProps"
+        :check-strictly="true"
+        :default-expand-all="true"
+        :filter-node-method="filterNode"
+        @check="getCheckedNodes"
+      />
+      <template #footer>
+        <el-button plain @click="cancelCheckDept">取消</el-button>
+        <el-button type="primary" @click="confirmCheckDept">确认</el-button>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script setup lang="ts">
+import { ref } from 'vue'
+import type { FormRules, FormInstance, ElTree } from "element-plus";
+import { Search } from '@element-plus/icons-vue'
+import api from '@/api'
+import {ElMessage, ElMessageBox} from "element-plus";
+import { useRouter, useRoute } from 'vue-router'
+
+const router = useRouter()
+const route = useRoute()
+
+let active = ref(0)
+
+const BasicFormRef = ref<FormInstance>()
+
+let basicForm = ref({
+  deptIds: []
+})
+const basicRules = ref<FormRules>({
+  actName: [
+    { required: true, trigger: "blur", message: "请填写活动名称" }
+  ],
+  actMethod: [
+    { required: true, trigger: "change", message: "请选择抽奖方式" }
+  ],
+  actStartTime: [
+    { required: true, trigger: "blur", message: "请选择开始时间" }
+  ],
+  actEndTime: [
+    { required: true, trigger: "blur", message: "请选择结束时间" }
+  ],
+  actDept: [
+    { required: true, trigger: "change", message: "请选择所属机构" }
+  ]
+})
+
+const disabledDate = (time: Date) => {
+  return time.getTime() < Date.now()
+}
+
+let deptData = ref([])
+
+let activeName = ref('1')
+let gifts = ref([
+  {
+    tab: {
+      label: '奖品1',
+      name: '1'
+    },
+    form: {
+      awardType: '1',
+      awardCashType: '1'
+    }
+  },{
+    tab: {
+      label: '奖品2',
+      name: '2'
+    },
+    form: {
+      awardType: '1',
+      awardCashType: '1'
+    }
+  }
+])
+
+const handleClick = (tab, event) => {
+
+}
+// 机构
+let option = ref([])
+const cascaderProps = {
+  value: 'id',
+  label: 'name',
+  children: 'children'
+}
+const institutionList = () => {
+  api.institutionApi.institutionList({ name: '', system: '' }).then(res => {
+    if(res?.code == 200) {
+      option.value = res.data
+    } else {
+      ElMessage({
+        message: res.msg,
+        type: 'warning'
+      })
+    }
+  })
+}
+
+// 第一步取消
+const cancelFirst = () => {
+
+}
+const confirmFirst = async (BasicFormRef: FormInstance) => {
+  if(!BasicFormRef) {
+    BasicFormRef.resetFields()
+    return
+  }
+  await BasicFormRef.validate((valid) => {
+    if(valid) {
+      if(basicForm.value.deptIds.length>0) {
+        active.value = 1
+      } else {
+        ElMessage({
+          message: '请勾选参与机构!',
+          type: 'warning'
+        })
+      }
+    } else {
+      ElMessage({
+        message: '请正确填写相关信息!',
+        type: 'warning'
+      })
+    }
+  })
+}
+
+const uploadImage = async (file, item) => {
+  let files = file.raw
+  const params = new FormData(); // 声明formData数据类型
+  params.append("file", files);
+  params.append("type", "image");
+  const { code, data, msg } = await api.commonApi.fileUpload(params)
+  if(code == 200) {
+    item.form.awardImg = data.id
+    item.form.imageUrl = data.downloadUrl
+  }
+}
+
+const cancelSecond = () => {
+  active.value = 0
+}
+const confirmSecond = (BasicFormRef: FormInstance) => {
+  let awardList = gifts.value.map((item) => {
+    if(item.form.awardCashType == '1') {
+      return {
+        awardId: item.form.id?item.form.id:null,
+        awardType: item.form.awardType,
+        awardCashType: item.form.awardCashType,
+        awardName: item.form.awardName,
+        awardFixedAmount: item.form.awardFixedAmount,
+        awardImg: item.form.awardImg,
+      }
+    } else {
+      return {
+        awardId: item.form.id?item.form.id:null,
+        awardType: item.form.awardType,
+        awardCashType: item.form.awardCashType,
+        awardName: item.form.awardName,
+        awardMinAmount: item.form.awardMinAmount,
+        awardMaxAmount: item.form.awardMaxAmount,
+        awardImg: item.form.awardImg,
+      }
+    }
+  })
+  let formData = {...basicForm.value}
+  if(basicForm.value.actDept.length != 1&&typeof basicForm.value.actDept != 'string') {
+    formData.actDept = basicForm.value.actDept[basicForm.value.actDept.length-1]
+  }
+  formData.awardList = awardList
+  console.log(789, formData)
+  if(route.query.id) {
+    api.lotteryApi.updateActivity(formData).then(res => {
+      if(res.code == 200) {
+        ElMessage({
+          message: res.msg,
+          type: 'success'
+        })
+        active.value = 3
+      } else {
+        ElMessage({
+          message: res.msg,
+          type: 'warning'
+        })
+      }
+    })
+  } else {
+    api.lotteryApi.addActivity(formData).then(res => {
+      if(res.code == 200) {
+        ElMessage({
+          message: res.msg,
+          type: 'success'
+        })
+        active.value = 3
+      } else {
+        ElMessage({
+          message: res.msg,
+          type: 'warning'
+        })
+      }
+      BasicFormRef.resetFields()
+    })
+  }
+  // api.lotteryApi.addActivityAward({
+  //   awardList: awardList,
+  //   activityId: activityId.value
+  // }).then(res => {
+  //   if(res.code == 200) {
+  //     ElMessage({
+  //       message: res.msg,
+  //       type: 'success'
+  //     })
+  //     active.value = 3
+  //   } else {
+  //     ElMessage({
+  //       message: res.msg,
+  //       type: 'warning'
+  //     })
+  //   }
+  // })
+}
+
+// 回显相关数据
+let editData = ref(null)
+let checkedDeptIds = ref([])
+let checkedDeptData = ref([])
+
+const initEdit = (id) => {
+  api.lotteryApi.getActivity({ id: id }).then(res => {
+    if(res.code == 200) {
+      editData.value = {...res.data}
+      basicForm.value = {...editData.value}
+      checkedDeptIds.value = res.data.deptIds
+      checkedDeptData.value = res.data.deptData
+      deptData.value = checkedDeptData.value
+      if(res.data.awardList&&res.data.awardList.length>0) {
+        gifts.value.forEach((item, index) => {
+          item.form = res.data.awardList[index]
+        })
+      }
+    } else {
+      ElMessage({
+        message: res.msg,
+        type: 'warning'
+      })
+    }
+  })
+}
+
+// 参与机构数选择弹框
+let selectDeptShow = ref(false)
+let filterText = ref('')
+const treeRef = ref<InstanceType<typeof ElTree>>()
+const defaultProps = {
+  children: 'children',
+  label: 'name',
+}
+watch(filterText, (val) => {
+  treeRef.value!.filter(val)
+})
+const selectDeptData = () => {
+  selectDeptShow.value = true
+  nextTick(() => {
+    treeRef.value!.setCheckedKeys([...basicForm.value.deptIds], true)
+  })
+}
+const deleteDeptData = (scope) => {
+  ElMessageBox({
+    title: '删除机构',
+    message: '确定要删除该机构吗?',
+    type: 'warning',
+    showCancelButton: true,
+    confirmButtonText: '确定',
+    cancelButtonText: '取消',
+  }).then(( action ) => {
+    if(action === 'confirm') {
+      let arr = deptData.value.filter(item => item.id != scope.row.id)
+      let brr = basicForm.value.deptIds.filter(item => item != scope.row.id)
+      checkedDeptData.value = [...arr]
+      checkedDeptIds.value = [...brr]
+      basicForm.value.deptIds = [...checkedDeptIds.value]
+      deptData.value = [...checkedDeptData.value]
+      console.log(123, basicForm.value.deptIds)
+      console.log(456, deptData.value)
+    }
+  }).catch(( action ) => {
+
+  })
+}
+const filterNode = (value: string, data: any) => {
+  if (!value) return true
+  return data.name.includes(value)
+}
+const getCheckedNodes = (a, b) => {
+  checkedDeptIds.value = [...b.checkedKeys]
+  checkedDeptData.value = [...b.checkedNodes]
+}
+
+const cancelCheckDept = () => {
+  selectDeptShow.value = false
+  checkedDeptIds.value = [...basicForm.value.deptIds]
+  checkedDeptData.value = [...deptData.value]
+  // if(route.query.id) {
+  //   selectDeptShow.value = false
+  //   checkedDeptIds.value = [...basicForm.value.deptIds]
+  //   checkedDeptData.value = [...deptData.value]
+  // } else {
+  //   checkedDeptIds.value = []
+  //   checkedDeptData.value = []
+  //   basicForm.value.deptIds = []
+  //   deptData.value = []
+  // }
+}
+const confirmCheckDept = () => {
+  selectDeptShow.value = false
+  basicForm.value.deptIds = [...checkedDeptIds.value]
+  deptData.value = [...checkedDeptData.value]
+}
+
+const back = () => {
+  router.push({
+    path: '/marketingManagement/lottery'
+  })
+}
+
+onMounted(() => {
+  institutionList()
+  if(route.query.id) {
+    initEdit(route.query.id)
+  }
+})
+
+</script>
+
+<style scoped lang="scss">
+.configurate{
+  width: calc(100% - 40px);
+  margin: 20px;
+  background: white;
+  .steps{
+    width: 100%;
+    display: flex;
+    align-content: center;
+    justify-content: center;
+  }
+  .content{
+    height: 688px;
+    .image{
+      display: flex;
+      align-items: center;
+      justify-content: center;
+      img{
+        width: calc(100% - 20px);
+        height: 70%;
+      }
+    }
+    .btns{
+      display: flex;
+      align-items: center;
+      justify-content: center;
+    }
+    .imageUrl{
+      width: 100px;
+      height: 100px;
+      border-radius: 5px;
+    }
+    .btn-icon{
+      border: 1px solid #ccc;
+      width: 100px;
+      height: 100px;
+      font-size: 30px;
+      color: #ccc;
+      border-radius: 5px;
+    }
+    .result{
+      width: 100%;
+      height: 100%;
+      display: flex;
+      align-items: center;
+      justify-content: center;
+    }
+  }
+  :deep(.el-steps--simple) {
+    background: none;
+  }
+  :deep(.el-step__head.is-success) {
+    color: #00a0f4;
+    border-color: #00a0f4;
+  }
+  :deep(.el-step__title.is-success) {
+    color: #00a0f4;
+  }
+}
+</style>

+ 231 - 0
src/views/marketingManagement/lottery.vue

@@ -0,0 +1,231 @@
+<template>
+  <div class="lottery">
+    <el-form class="form" :model="form">
+      <el-row :gutter="20">
+        <el-col :span="8">
+          <el-form-item label="活动名称">
+            <el-input v-model="form.actName" placeholder="请输入标题查找" clearable></el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="8">
+          <el-form-item label="活动状态">
+            <el-select v-model="form.actStatus" placeholder="请选择活动状态" clearable>
+              <el-option label="未开始" value="1" key="1"></el-option>
+              <el-option label="进行中" value="2" key="2"></el-option>
+              <el-option label="已结束" value="3" key="3"></el-option>
+            </el-select>
+          </el-form-item>
+        </el-col>
+        <el-col :span="8">
+          <el-button type="primary" @click="search">查询</el-button>
+          <el-button type="primary" plain @click="reset">重置</el-button>
+        </el-col>
+      </el-row>
+    </el-form>
+    <el-button class="publish" type="primary" icon="Position" @click="createActive">发布新活动</el-button>
+    <el-table
+      :data="tableData"
+      height="580"
+      style="width: 100%"
+    >
+      <el-table-column prop="actName" label="活动信息" width="300"></el-table-column>
+      <el-table-column prop="actStartTime" label="开始时间" width="200"></el-table-column>
+      <el-table-column prop="actEndTime" label="结束时间" width="200"></el-table-column>
+      <el-table-column prop="actMethod" label="抽奖方式" width="150">
+        <template #default="scope">
+          {{ scope.row.actMethod == '1'?'九宫格':scope.row.actMethod == '2'?'大转盘':'' }}
+        </template>
+      </el-table-column>
+      <el-table-column prop="actDept" label="所属机构" width="300"></el-table-column>
+      <el-table-column prop="f" label="参与范围" width="300"></el-table-column>
+      <el-table-column prop="g" label="参与用户" width="150"></el-table-column>
+      <el-table-column prop="actStatus" label="状态" width="150">
+        <template #default="scope">
+          {{ scope.row.actStatus == '1'?'未开始':scope.row.actStatus == '2'?'进行中':scope.row.actStatus == '3'?'已结束':'' }}
+        </template>
+      </el-table-column>
+      <el-table-column fixed="right" label="操作" width="150">
+        <template #default="scope">
+          <div style="display: flex; align-content: center; justify-content: center">
+            <el-button link type="primary" size="small" @click="edit(scope)">
+              编辑
+            </el-button>
+            <el-dropdown
+              placement="bottom"
+              trigger="click"
+              @command="tableDataCommand(scope, $event)"
+            >
+              <el-button link type="primary" size="small">更多</el-button>
+              <template #dropdown>
+                <el-dropdown-menu>
+                  <el-dropdown-item command="删除">删除</el-dropdown-item>
+                  <el-dropdown-item command="结束活动" v-if="scope.row.actStatus == '2'">结束活动</el-dropdown-item>
+                </el-dropdown-menu>
+              </template>
+            </el-dropdown>
+          </div>
+        </template>
+      </el-table-column>
+    </el-table>
+    <div style="display: flex; justify-content: center; margin-top: 15px">
+      <el-pagination
+        v-model:current-page="currentPage"
+        v-model:page-size="pageSize"
+        :page-sizes="[10, 20, 30, 40]"
+        layout="total, sizes, prev, pager, next, jumper"
+        :total="total"
+        @size-change="handleSizeChange"
+        @current-change="handleCurrentChange"
+      />
+    </div>
+  </div>
+</template>
+
+<script setup lang="ts">
+import { ref } from 'vue'
+import {ElMessage, ElMessageBox} from "element-plus";
+import { useRouter } from 'vue-router'
+import api from '@/api'
+
+const router = useRouter()
+
+// 搜索条件
+let form = ref({})
+
+// 列表数据
+let tableData = ref([{
+  a:'1111'
+}])
+// 更多
+const tableDataCommand = (scope, e) => {
+  switch (e) {
+    case '删除':
+      ElMessageBox({
+        title: '删除活动',
+        message: '确定要删除该活动吗?',
+        type: 'warning',
+        showCancelButton: true,
+        confirmButtonText: '确定删除',
+        cancelButtonText: '取消',
+      }).then(( action ) => {
+        if(action === 'confirm') {
+          api.lotteryApi.deleteActivity({ id: scope.row.id }).then(res => {
+            if(res.code == 200) {
+              ElMessage({
+                message: res.msg,
+                type: 'success'
+              })
+              initData()
+            } else {
+              ElMessage({
+                message: res.msg,
+                type: 'warning'
+              })
+            }
+          })
+        }
+      }).catch(( action ) => {
+
+      })
+      break;
+    case '结束活动':
+      ElMessageBox({
+        title: '结束活动',
+        message: '结束后,参与机构的活动将结束,不可抽奖,请确认是否结束?',
+        type: 'warning',
+        showCancelButton: true,
+        confirmButtonText: '确定结束',
+        cancelButtonText: '取消',
+      }).then(( action ) => {
+        if(action === 'confirm') {
+          api.lotteryApi.endActivity({ id: scope.row.id }).then(res => {
+            if(res.code == 200) {
+              ElMessage({
+                message: res.msg,
+                type: 'success'
+              })
+              initData()
+            } else {
+              ElMessage({
+                message: res.msg,
+                type: 'warning'
+              })
+            }
+          })
+        }
+      }).catch(( action ) => {
+
+      })
+  }
+}
+
+// 分页数据
+let currentPage = ref(1)
+let pageSize = ref(10)
+let total = ref(0)
+const handleSizeChange = (pageSize) => {
+  pageSize.value = pageSize
+}
+const handleCurrentChange = (page) => {
+  currentPage.value = page
+}
+
+const createActive = () => {
+  router.push({
+    path: '/marketingManagement/configurate'
+  })
+}
+
+const initData = () => {
+  api.lotteryApi.getActivityList({
+    ...form.value,
+    pages: currentPage.value,
+    size: pageSize.value
+  }).then(res => {
+    if(res.code == 200) {
+      tableData.value = res.data.records
+      total.value = res.data.total
+    } else {
+      ElMessage({
+        message: res.msg,
+        type: 'warning'
+      })
+    }
+  })
+}
+
+const search = () => {
+  currentPage.value = 1
+  pageSize.value = 10
+  initData()
+}
+const reset = () => {
+  form.value = {}
+  currentPage.value = 1
+  pageSize.value = 10
+  initData()
+}
+const edit = (scope) => {
+  router.push({
+    path: '/marketingManagement/configurate',
+    query: {
+      id: scope.row.id
+    }
+  })
+}
+
+onMounted(() => {
+  initData()
+})
+
+</script>
+
+<style scoped lang="scss">
+.lottery {
+  width: calc(100% - 40px);
+  margin: 20px;
+  .publish{
+    margin-bottom: 20px;
+  }
+}
+</style>

+ 101 - 0
src/views/marketingManagement/record.vue

@@ -0,0 +1,101 @@
+<template>
+  <div class="record">
+    <el-form :model="form" label-width="100">
+      <el-row :gutter="20">
+        <el-col :span="8">
+          <el-form-item label="业务员信息">
+            <el-input v-model="form.info" placeholder="请输入"></el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="8">
+          <el-form-item label="抽奖时间">
+            <el-date-picker
+              v-model="form.time"
+              type="daterange"
+              range-separator="至"
+              start-placeholder="开始时间"
+              end-placeholder="结束时间"
+            />
+          </el-form-item>
+        </el-col>
+        <el-col :span="8">
+          <el-form-item label="奖品类型">
+            <el-select v-model="form.type">
+              <el-option label="类型1" value="1"></el-option>
+            </el-select>
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <el-row :gutter="20">
+        <el-col :span="8">
+          <el-form-item label="奖品名称">
+            <el-input v-model="form.name" placeholder="请输入"></el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="8">
+          <el-form-item label="中奖结果">
+            <el-select v-model="form.result">
+              <el-option label="结果1" value="1"></el-option>
+            </el-select>
+          </el-form-item>
+        </el-col>
+        <el-col :span="8"></el-col>
+      </el-row>
+    </el-form>
+    <el-table
+      :data="tableData"
+      height="580"
+      style="width: 100%"
+    >
+      <el-table-column type="selection" width="55"></el-table-column>
+      <el-table-column prop="a" label="业务员" ></el-table-column>
+      <el-table-column prop="b" label="手机号" ></el-table-column>
+      <el-table-column prop="c" label="归属机构" ></el-table-column>
+      <el-table-column prop="d" label="抽奖时间" ></el-table-column>
+      <el-table-column prop="e" label="中奖结果" ></el-table-column>
+      <el-table-column prop="f" label="奖品类型" ></el-table-column>
+      <el-table-column prop="g" label="奖品名称" ></el-table-column>
+      <el-table-column prop="h" label="中奖数量" ></el-table-column>
+    </el-table>
+    <div style="display: flex; justify-content: center; margin-top: 15px">
+      <el-pagination
+        v-model:current-page="currentPage"
+        v-model:page-size="pageSize"
+        :page-sizes="[10, 20, 30, 40]"
+        layout="total, sizes, prev, pager, next, jumper"
+        :total="total"
+        @size-change="handleSizeChange"
+        @current-change="handleCurrentChange"
+      />
+    </div>
+  </div>
+</template>
+
+<script setup lang="ts">
+import { ref } from 'vue'
+
+let form = ref({})
+// 列表数据
+let tableData = ref([{
+  a:'1111'
+}])
+
+// 分页数据
+let currentPage = ref(1)
+let pageSize = ref(10)
+let total = ref(0)
+const handleSizeChange = (pageSize) => {
+  pageSize.value = pageSize
+}
+const handleCurrentChange = (page) => {
+  currentPage.value = page
+}
+</script>
+
+<style scoped lang="scss">
+.record{
+  width: 100%;
+  padding: 20px;
+  background: white;
+}
+</style>

+ 0 - 2
src/views/operationManagement/modules/addCard.vue

@@ -61,7 +61,6 @@ let props = defineProps<{
 }>()
 const emits = defineEmits(['closeDialog'])
 watch(() => props.userInfo, (newVal, oldVal) => {
-  console.log(123123123, newVal, oldVal)
   bankForm.value = newVal
 }, { deep: true });
 
@@ -103,7 +102,6 @@ const uploadImage = async (file) => {
   params.append("file", files);
   params.append("type", "image");
   const { code, data, msg } = await api.commonApi.fileUpload(params)
-  console.log(123, data)
   if(code == 200) {
     bankForm.value.imageUrl = data.downloadUrl
     bankForm.value.attachment = data.id

+ 0 - 9
src/views/operationManagement/modules/addOperation.vue

@@ -636,14 +636,6 @@ const initEditData = (id) => {
           let applicantImg = formData.fileList.find(item => item.fileType == 'applicant')
           let salaryTable = formData.fileList.find(item => item.fileType == 'salary')
           let leaveTable = formData.fileList.find(item => item.fileType == 'leave')
-          console.log('图片', formData.fileList)
-          console.log('身份证1', sfz1)
-          console.log('身份证2', sfz1)
-          console.log('展业资格证', qualification)
-          console.log('劳务合同', contract)
-          console.log('应聘表', applicant)
-          console.log('定薪表', salaryTable)
-          console.log('离职表', leaveTable)
           if(sfz1) {
             operationForm.value.sfz1 = sfz1.id
             IDCardFrontName.value = sfz1.fileName
@@ -682,7 +674,6 @@ const initEditData = (id) => {
         }
         operationForm.value.address = address
         getUser(operationForm.value.deptId)
-        console.log(123123123, operationForm.value)
       } else {
         ElMessage({
           message: res.msg,

+ 0 - 1
src/views/operationManagement/modules/addTeam.vue

@@ -75,7 +75,6 @@ let isEdit = ref(false)
 const initEdit = (data, bool) => {
   isEdit.value = bool
   teamForm.value = data
-  console.log(1111111, teamForm.value.deptId)
   institutionList()
   getUser(data.deptId)
 }

+ 0 - 1
src/views/operationManagement/modules/allocation.vue

@@ -116,7 +116,6 @@ const institutionList = () => {
   })
 }
 const handleNodeClick = (data) => {
-  console.log(data)
   initUser(data.id)
 }
 const filterNode = (value: string, data: any) => {