Browse Source

推送客户群设置及冲突解决

hbchen 8 months ago
parent
commit
bd2925affc

+ 158 - 0
src/components/pubDialog.vue

@@ -0,0 +1,158 @@
+<script setup>
+import { ref } from 'vue';
+
+const props = defineProps({
+  isShow: {
+    type: Boolean,
+    required: true,
+  },
+  title: {
+    type: String,
+    default: '',
+  },
+  title_icon: {
+    type: String,
+    default: '',
+  },
+  dialogWidth: {
+    type: String,
+    default: '550px',
+  },
+  //显示必填
+  isHideRequired: {
+    type: Boolean,
+    default: false,
+  },
+  //form 数据
+  formData: {
+    type: Object,
+    default: {},
+  },
+  //form 规则
+  formRules: {
+    type: Object,
+    default: {},
+  },
+  //表单key数组 { label:对应的名称,prop:规则的key, type: input支持的类型 默认input,placeholder}
+  keysArr: {
+    type: Array,
+    default: [],
+  },
+  /* select的数据 {name,value}格式 */
+  selectArr: {
+    type: Array,
+    default: [],
+  },
+  confimTxt: {
+    type: Array,
+    default: ['保存', '取消'],
+  },
+});
+
+const emits = defineEmits(['cancel','ensureCallBack'])
+
+const diaFormRef=ref(null)
+
+const cancelHandle=()=>{
+  diaFormRef.value.resetFields();
+  emits('cancel');
+}
+const saveHandle=()=>{
+  diaFormRef.value.validate((valid) => {
+    if (valid) {
+      emits('ensureCallBack', props.formData, props.title);
+    }
+  });
+}
+
+</script>
+
+<template>
+  <!-- 公用弹窗组件 根据实际自行追加具体type 通用input -->
+  <el-dialog
+    :model-value="isShow"
+    :close-on-click-modal="false"
+    :modal-append-to-body="false"
+    @close="cancelHandle"
+    class="public-dialog"
+    center
+    :width="dialogWidth"
+    v-dialogDrag
+  >
+    <template #header>
+      <div style="display: flex; align-items: center">
+        <img
+          :src="$icons.title_icon"
+          style="color: #fff; width: 16px; height: 16px; margin-right: 5px"
+          v-if="title_icon"
+        />
+        <span style="font-size: 16px">{{ title }}</span>
+      </div>
+    </template>
+
+    <el-form
+      ref="diaFormRef"
+      class="form-cont"
+      label-position="left"
+      :hide-required-asterisk="isHideRequired"
+      label-width="82px"
+      :model="formData"
+      :rules="formRules"
+    >
+      <el-form-item
+        v-for="(item, index) in keysArr"
+        :key="index"
+        :label="item.label"
+        :prop="item.prop"
+        width="100%"
+      >
+        <el-input
+          v-if="item.type === 'input'"
+          :maxlength="item.maxlen"
+          v-model.trim="formData[item.prop]"
+          :placeholder="item.placeholder"
+        />
+        <el-select
+          v-model="formData[item.prop]"
+          :placeholder="item.placeholder"
+          style="width: 80%;"
+          v-else-if="item.type === 'select'"
+          :multiple="item.multiple"
+          clearable>
+          <el-option v-for="Type in selectArr" :key="Type.value" :label="Type.name" :value="Type.value">
+          </el-option>
+        </el-select>
+      </el-form-item>
+    </el-form>
+    <div class="dia-bot">
+      <el-button
+        type="primary"
+        style="margin-right: 20px"
+        @click="saveHandle"
+        >{{ confimTxt[0] }}</el-button
+      >
+      <el-button type="primary" plain @click="cancelHandle">{{
+        confimTxt[1]
+      }}</el-button>
+    </div>
+  </el-dialog>
+</template>
+
+<style lang="scss">
+.public-dialog {
+  .el-form-item__content {
+    margin-left: 0;
+  }
+  .form-cont {
+    padding-left: 50px;
+  }
+  .el-input {
+    width: 80%;
+  }
+  .dia-bot {
+    margin: 52px 0 30px;
+    display: flex;
+    justify-content: center;
+  }
+}
+</style>

+ 3 - 1
src/main.js

@@ -12,7 +12,7 @@ import '@/styles/global.scss'
 
 import vue3TreeOrg from 'vue3-tree-org';
 import "vue3-tree-org/lib/vue3-tree-org.css";
-
+import {optionScrollRegister} from '@/utils/option-scroll.js';
 
 import 'froala-editor/js/plugins.pkgd.min.js';
 //Import third party plugins
@@ -48,6 +48,8 @@ function setupApp() {
   
   // 注册全局组件
   registerComponents(app)
+  // 注册loadMore指令
+  optionScrollRegister(app)
 
   app.use(ElementPlus,{locale: zhCn,size: 'large'})
   app.use(vue3TreeOrg)

+ 1 - 2
src/router/index.js

@@ -58,7 +58,6 @@ router.beforeEach(async(to, from, next) => {
 
   let auth = localStorage.getItem("auth") || false;
   if (to.path != "/login" && to.path!='/temppage' &&to.path!='/fogetpassword' && !auth) {
-    console.log(1111111)
     window.location.href =  window.location.origin + '/login';
     return false;
   }
@@ -71,7 +70,7 @@ router.beforeEach(async(to, from, next) => {
     next();
   } else {
     next({ path: "/404" });
-  }
+	}
 });
 
 router.afterEach((to, from, next) => {

+ 10 - 9
src/router/modules/stopUpdateRoutes.js

@@ -191,19 +191,20 @@ export default [
 					title:'图库权限开通统计'
 				}
 			},
-      //       {
-			// 	path:'ReportThsSend',
-			// 	component:()=> import('@/views/report_manage/pushSetting.vue'),
-			// 	name:'推送客户群设置',
-			// 	hidden:false
-			// },
+			{
+				path:'ReportThsSend',
+				component:()=> import('@/views/report_manage/pushSetting.vue'),
+				name:'ReportThsSend',
+				meta: {
+					title: '推送客户群设置'
+				}
+			},
 			// {
 			// 	path:"enAuthManage",
 			// 	component: () => import('@/views/system_manage/enAuthManage.vue'),
 			// 	name: '英文权限配置',
 			// 	hidden: false,
-			// },
-			
-        ]
+			// }
+		]
     }
 ]

+ 19 - 12
src/utils/option-scroll.js

@@ -1,13 +1,20 @@
-import Vue from 'vue';
 
-Vue.directive('loadMore', {
-	bind(el, binding) {
-		const SELECT_DOM = el.querySelector('.el-select-dropdown .el-select-dropdown__wrap');
-    SELECT_DOM.addEventListener('scroll', _.debounce(function () {
-      const CONDITION = parseInt(this.scrollHeight - this.scrollTop) <= this.clientHeight+1
-      if (CONDITION) {
-        binding.value()
-      }
-    },200))
-	}
-})
+export function optionScrollRegister(app){
+  console.log(app,'apppp');
+  app.directive('loadMore', {
+    beforeMount(el, binding,node) {
+      // console.log(binding,'binding',node,node.teleported,el,el.querySelector('.el-select-dropdown .el-select-dropdown__wrap'));
+      // return 
+      const SELECT_DOM = el.querySelector('.el-select-dropdown .el-select-dropdown__wrap');
+      // return console.log(SELECT_DOM,'SELECT_DOM');
+      if(!SELECT_DOM) return 
+      SELECT_DOM.addEventListener('scroll', _.debounce(function () {
+        const CONDITION = parseInt(this.scrollHeight - this.scrollTop) <= this.clientHeight+1
+        if (CONDITION) {
+          binding.value()
+        }
+      },200))
+    }
+  })
+}
+

+ 0 - 1
src/views/dataReport_manage/readClassify.vue

@@ -257,4 +257,3 @@ function renderHeader(h, { column, $index }) {
     }
   }
   </style>
-  

+ 1 - 1
src/views/dataReport_manage/readStatistics.vue

@@ -126,4 +126,4 @@ function readDetail(item) {
     display: flex;
   }
   </style>
-  
+

+ 378 - 0
src/views/report_manage/components/prioritySettingList.vue

@@ -0,0 +1,378 @@
+<script setup>
+import { reactive, ref } from "vue";
+import { ElMessage,ElMessageBox } from "element-plus";
+
+import mPage from '@/components/mPage.vue';
+import {pushSettingInterface} from '@/api/modules/pushSettingApi.js';
+import {classifylist,interactiveInterface} from '@/api/api.js';
+
+const tableColumns=[
+  {label:'产品名称',key:'ClassifyName',minWidth:''},
+  {label:'产品类型',key:'ConfigType',minWidth:''},
+  {label:'优先类型',key:'Level',minWidth:''},
+  {label:'更新时间',key:'ModifyTime',minWidth:''},
+]
+const tableData=ref([])
+const total=ref(0)
+const pageNo=ref(1)
+const pageSize=ref(10)
+
+const reactiveData=reactive({
+  sortOption:{SortParam:'',SortType:''},
+  settingItem:{
+    ClassifyName:'',
+    ConfigType:'',
+    Level:'',
+    ConfigId:0
+  }
+})
+
+const isSettingDialogShow=ref(false) 
+const productTypeOptions=[
+  {id:1,label:'研报'},
+  {id:2,label:'语音播报'},
+  {id:3,label:'视频社区'},
+  {id:4,label:'线上路演'},
+]//现可推送的产品:研报、语音播报、视频社区、线上路演
+const productNameOptions=ref([])//根据productType取相应值
+const levelOptions=[
+  {key:1,label:'紧急'},
+  {key:2,label:'优先'},
+  {key:3,label:'普通'}
+]
+const title=ref('添加产品')
+const modifyType=ref('add')
+const formRules={
+  ClassifyName: [
+      { required: true, message: '请选择产品', trigger: 'change' }
+  ],
+  ConfigType: [
+      { required: true, message: '请选择产品类型', trigger: 'change' }
+  ],
+  Level: [
+      { required: true, message: '请选择优先级', trigger: 'change' }
+  ]
+}
+
+const priorityFormRef=ref(null)
+
+const handleModifyPriority=(type,data)=>{
+  modifyType.value = type
+  productNameOptions.value=[]
+  if(type==='add'){
+    title.value = '添加产品'
+    reactiveData.settingItem={ClassifyName:'',ConfigType:'',Level:'',ConfigId:0}
+  }else{
+    title.value='编辑优先类型'
+    const {ClassifyName,ConfigType,Level,ConfigId} = data
+    reactiveData.settingItem = {ClassifyName,ConfigType,Level,ConfigId}
+  }
+  isSettingDialogShow.value = true 
+}
+const deleteSetting=(data)=>{
+  ElMessageBox.confirm('删除后不可恢复,确认删除吗?', '提示', {
+    confirmButtonText: '确定',
+    cancelButtonText: '取消',
+    type: 'warning'
+  }).then(() => {
+    const {ConfigId} = data
+    pushSettingInterface.deletePriority({ConfigId}).then((res)=>{
+      if(res.Ret!==200) return 
+      ElMessage.success('删除成功')
+      changePage(1)
+    })
+  }).catch(()=>{})
+}
+const getTableData=()=>{
+  const {SortParam, SortType} = reactiveData.sortOption
+  pushSettingInterface.getPriorityList({
+    SortParam,SortType,
+    CurrentIndex:pageNo.value,
+    PageSize:pageSize.value
+  }).then(res=>{
+    if(res.Ret!==200) return 
+    const {Paging,List} = res.Data
+    tableData.value = List||[]
+    total.value = Paging.Totals
+  })
+}
+const changePage=(page)=>{
+  pageNo.value=page
+  getTableData()
+}
+const sortChangeHandle=({ prop,order })=>{
+  let SortParam='',SortType=''
+  SortType = order==='ascending'?'asc':order==='descending'?'desc':''
+  SortParam = prop==='Level'&&SortType?'level':''
+  reactiveData.sortOption = {SortParam,SortType}
+  getTableData()
+}
+//产品类型变化时
+const handleSelectChange=()=>{
+  const {ConfigType} = reactiveData.settingItem
+  //重置产品名称的值
+  reactiveData.settingItem.ClassifyName=''
+
+  productNameOptions.value = []
+  //根据ConfigType决定productNameOptions的值
+  const configTypeMap = {
+    '研报':getReportClassify,
+    '语音播报':getVoiceClassify
+  }
+  if(configTypeMap[ConfigType]){
+    configTypeMap[ConfigType]()
+  }else{
+    productNameOptions.value = [{key:0,label:ConfigType}]
+  }
+}
+//获取研报的分类列表,转换结构后赋值给productNameOptions
+const getReportClassify=()=>{
+  classifylist({
+    CurrentIndex: 0, PageSize: 1000,
+  }).then(res=>{
+    if(res.Ret!==200||!Array.isArray(res.Data.List)) return
+    let tempArr = []
+    res.Data.List.forEach(item=>{
+      let tempItem = {
+        key:item.Id,
+        label:item.ClassifyName,
+      }
+      if(item.Child&&item.Child.length>0){
+        tempItem.children = []
+        item.Child.forEach(i=>{
+          let tempI = {
+            key:i.Id,
+            label:i.ClassifyName
+          }
+          tempItem.children.push(tempI)
+        })
+      }
+      tempArr.push(tempItem)
+    })
+    productNameOptions.value = tempArr
+  })
+}
+//获取语音播报板块列表,转换结构后赋值给productNameOptions
+const getVoiceClassify=()=>{
+  interactiveInterface.voiceList({
+    CurrentIndex: pageNo.value,
+    PageSize:1000
+  }).then(res=>{
+    if(res.Ret!==200||!Array.isArray(res.Data.List)) return
+    let tempArr = []
+    res.Data.List.forEach(item=>{
+        let tempItem = {
+        key:item.SectionId,
+        label:item.SectionName,
+      }
+      tempArr.push(tempItem)
+    })
+    productNameOptions.value = tempArr
+  })
+}
+const saveChange=async ()=>{
+  let formValid = null
+  await priorityFormRef.value.validate((valid)=>{formValid = valid})
+  if(!formValid) return 
+  const {ConfigType,Level,ClassifyName,ConfigId} = reactiveData.settingItem
+  if(modifyType.value==='edit'){
+    pushSettingInterface.editPriority({
+      ConfigId,Level
+    }).then(res=>{
+      if(res.Ret!==200) return 
+      ElMessage.success('编辑成功')
+      closeDialog()
+      changePage(1)
+      return
+    })
+  }else{
+    let ClassifyId = 0
+    if(ConfigType==='研报'){
+      ClassifyId =Number(ClassifyName[ClassifyName.length-1]) 
+    }else if(ConfigType==='语音播报'){
+      ClassifyId = ClassifyName
+    }
+    pushSettingInterface.addPriority({
+      ConfigType,ClassifyId,Level
+    }).then(res=>{
+      if(res.Ret!==200) return
+      ElMessage.success('添加成功')
+      closeDialog()
+      changePage(1)
+      return
+    })
+  }
+  
+}
+const closeDialog=()=>{
+  reactiveData.settingItem={ClassifyName:'',ConfigType:'',Level:'',ConfigId:0}
+  priorityFormRef.value.resetFields()
+  isSettingDialogShow.value = false
+}
+
+getTableData()
+
+</script>
+
+<template>
+  <div class="priority-setting-list">
+    <div class="add-btn-wrap">
+      <el-button type="primary" @click="handleModifyPriority('add',{})">添加产品</el-button>
+    </div>
+    <div class="setting-table">
+      <el-table :data="tableData" border @sort-change="sortChangeHandle">
+        <el-table-column v-for="item in tableColumns" 
+          :label="item.label"
+          :key="item.key"
+          :prop="item.key"
+          :sortable="item.key==='Level'?'custom':false"
+          align="center">
+          <template #default="{row}">
+            <span v-if="item.key==='Level'">
+              {{levelOptions[row['Level']-1].label}}
+            </span>
+            <span v-else>{{row[item.key]||'--'}}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="操作" align="center">
+          <template #default="{row}">
+            <span
+              style="cursor: pointer; font-size: 14px; color: #409eff;margin-right:15px;"
+              @click="handleModifyPriority('edit',row)"
+              >编辑</span>
+            <span
+              style="cursor: pointer; font-size: 14px; color: #D1433A"
+              @click="deleteSetting(row)"
+              >删除</span>
+          </template>
+        </el-table-column>
+        <template #empty>
+          <div class="table-noData">
+            <img src="~@/assets/img/cus_m/nodata.png" />
+            <span>暂无数据</span>
+          </div>
+        </template>
+      </el-table>
+    </div>
+    <m-page
+      :page_no="pageNo"
+      :pageSize="pageSize"
+      :total="total"
+      style="position: absolute; right: 50px; bottom: 50px"
+      @handleCurrentChange="changePage"
+    />
+    <!-- 添加/编辑产品弹窗 -->
+    <el-dialog
+      :title="title"
+      v-model="isSettingDialogShow"
+      :close-on-click-modal="false"
+      :modal-append-to-body="false"
+      width="592px"
+      @closed="closeDialog"
+    >
+    <div class="dialog-container">
+      <el-form :model="reactiveData.settingItem" :rules="formRules" ref="priorityFormRef" style="max-width: 300px;margin: 0 auto;">
+        <el-form-item label="产品类型" prop="ConfigType">
+          <el-select placeholder="请选择产品类型" :disabled="modifyType==='edit'"
+            v-model="reactiveData.settingItem.ConfigType"  @change="handleSelectChange">
+              <el-option v-for="productType in productTypeOptions" :key="productType.id"
+                :label="productType.label" :value="productType.label"
+              />
+            </el-select>
+        </el-form-item>
+        <el-form-item label="产品名称" prop="ClassifyName">
+          <template v-if="reactiveData.settingItem.ConfigType==='研报'&&modifyType==='add'">
+            <el-cascader 
+            placeholder="请选择产品名称"
+            v-model="reactiveData.settingItem.ClassifyName" 
+            :options="productNameOptions"
+            :props="{value:'key',label:'label'}"
+            >
+            </el-cascader>
+          </template>
+          <template v-else>
+            <el-select placeholder="请选择产品类型" :disabled="modifyType==='edit'" v-model="reactiveData.settingItem.ClassifyName">
+              <el-option v-for="productName in productNameOptions" :key="productName.key"
+                :label="productName.label" :value="productName.key"
+              />
+            </el-select>
+          </template>
+        </el-form-item>
+        <el-form-item label="优先类型" prop="Level">
+          <el-select placeholder="请选择优先类型" v-model="reactiveData.settingItem.Level">
+              <el-option v-for="level in levelOptions" :key="level.key"
+                :label="level.label" :value="level.key"
+              />
+            </el-select>
+        </el-form-item>
+      </el-form>
+    </div>
+    <template  #footer>
+      <div class="foot-container">
+        <el-button type="primary" @click="saveChange">保 存</el-button>
+        <el-button @click="closeDialog">取 消</el-button>
+      </div>
+    </template>
+
+    </el-dialog>
+  </div>
+</template>
+
+<style lang="scss">
+.priority-setting-list{
+  .dialog-container{
+    .el-form-item{
+      .el-cascader{
+        .el-input{
+          width: 100%;
+        }
+      }
+    }
+  }
+}
+.el-dialog .el-input{
+  width: 100%;
+}
+</style>
+<style scoped lang="scss">
+.priority-setting-list{
+  .add-btn-wrap{
+    text-align: right;
+    position: relative;
+    .el-button{
+      position:absolute;
+      right:0;
+      top:-70px;
+    }
+  }
+  .setting-table{
+    .table-noData{
+      display: flex;
+      flex-direction: column;
+      align-items: center;
+      justify-content: center;
+      margin: 18vh 0;
+      img{
+        height: 110px;
+        width: 136px;
+      }
+      span{
+        font-weight: 400;
+        font-size: 16px;
+        color: #999999;
+      }
+    }
+  }
+  .dialog-container{
+    .el-form{
+      .el-form-item{
+        display: flex;
+        justify-content: center;
+      }
+    }
+  }
+  .foot-container{
+    text-align: center;
+  }
+}
+</style>

+ 325 - 0
src/views/report_manage/components/waitPushList.vue

@@ -0,0 +1,325 @@
+
+<script setup>
+import { reactive, ref } from "vue";
+import { ElMessage } from "element-plus";
+import {Search} from '@element-plus/icons-vue'
+
+import { getBeingPushedReportType , getBeingPushedReportList,setPushingTime} from '@/api/api.js';
+import mPage from '@/components/mPage.vue';
+
+const searchParams=reactive({
+  CreateTimeStart:"",
+  CreateTimeEnd:"",
+  PushTimeStart:"",
+  PushTimeEnd:"",
+  ReportType:"",
+  Title:"",
+  CurrentIndex:1,
+  PageSize:10
+})
+const total=ref(0)
+// 创建时间范围
+const createTimeRange=ref([])
+// 待推送时间范围
+const pushTimeRange=ref([])
+const dataList=ref([])
+// 显示设置推送时间的时间选择器 -- 数组
+const showPushingTime=ref(false)
+const pushingTimeSet=reactive({
+  PushTime:'',
+  SendId:''
+})
+// 储存临时的推送时间,用于判断推送时间是否改变
+const pushTimeTemp=ref("") 
+const reportTypeArray=ref([])
+// 计算序号
+const pageCounts=ref(0)
+const levelOptions={
+  1:'紧急',
+  2:'优先',
+  3:'普通'
+}
+
+const PushingTimeFormRef=ref(null)
+
+// 获取待推送报告类型
+const getReportType=()=>{
+  getBeingPushedReportType().then(res=>{
+    if(res.Ret==200){
+      reportTypeArray.value = res.Data.List || []
+    }
+  })
+}
+const getList=(type='')=>{
+  // 是否是搜索
+  if(type == 'search'){
+    searchParams.CurrentIndex=1
+  }
+  getBeingPushedReportList(searchParams).then(res=>{
+    if(res.Ret==200){
+      dataList.value = res.Data.List || []
+      total.value = res.Data.Paging.Totals
+      pageCounts.value = (searchParams.CurrentIndex-1)*searchParams.PageSize
+    }
+  })
+}
+// 查询日期范围改变 type- create:创建 push:待推送
+const dateRangeChange=(value,type)=>{
+  // console.log(value,type);
+  if(type == "create"){
+    searchParams.CreateTimeStart = value?value[0]:''
+    searchParams.CreateTimeEnd = value?value[1]:''
+  }else{
+    searchParams.PushTimeStart = value?value[0]:''
+    searchParams.PushTimeEnd = value?value[1]:''
+  }
+  getList('search')
+}
+//切换页码
+const pageChange=(page_no)=>{
+  searchParams.CurrentIndex=page_no
+  getList()
+}
+// 打开设置推送时间弹窗
+const openSetTimeDia=(row)=>{
+  pushingTimeSet.SendId = row.SendId
+  pushTimeTemp.value = pushingTimeSet.PushTime = row.PushTime
+  showPushingTime.value=true
+}
+// 设置推送时间 - 提交
+const submitPushTime=()=>{
+  if(pushTimeTemp.value == pushingTimeSet.PushTime){
+    // 没有改变
+    setCancel()
+    return 
+  }
+  PushingTimeFormRef.value.validate(valid=>{
+    if(valid){
+      // 秒数重置为零
+      pushingTimeSet.PushTime = pushingTimeSet.PushTime.substring(0,17)+'00'
+      setPushingTime(pushingTimeSet).then(res=>{
+        if(res.Ret == 200){
+          // console.log(res.Ret);
+          ElMessage.success(res.Msg)
+          getList('search')
+          setCancel()
+        }
+      })
+    }
+  })
+}
+// 取消推送
+const setCancel=()=>{
+  pushingTimeSet.PushTime=''
+  PushingTimeFormRef.value.clearValidate()
+  showPushingTime.value=false
+}
+
+getReportType()
+getList()
+</script>
+
+<template>
+  <div>
+    <!-- 搜索区域 -->
+    <div class="search-zone">
+      <div class="search-item" style="margin: 0 30px 10px 0">
+        创建时间:
+        <el-date-picker
+          v-model="createTimeRange"
+          type="daterange"
+          style="width: 320px"
+          range-separator="至"
+          value-format="YYYY-MM-DD"
+          @change="(e) => dateRangeChange(e, 'create')"
+          start-placeholder="活动开始日期"
+          end-placeholder="活动结束日期"
+        ></el-date-picker>
+      </div>
+      <div class="search-item" style="margin: 0 30px 10px 0">
+        待推送时间:
+        <el-date-picker
+          v-model="pushTimeRange"
+          type="daterange"
+          style="width: 320px"
+          range-separator="至"
+          value-format="YYYY-MM-DD"
+          @change="(e) => dateRangeChange(e, 'push')"
+          start-placeholder="活动开始日期"
+          end-placeholder="活动结束日期"
+        ></el-date-picker>
+      </div>
+      <el-select
+        v-model="searchParams.ReportType"
+        style="margin: 0 30px 10px 0; width: 240px"
+        placeholder="请选择产品类型"
+        @change="getList('search')"
+        clearable
+        filterable 
+      >
+        <el-option
+          v-for="(item, index) in reportTypeArray"
+          :key="index"
+          :label="item.ReportType"
+          :value="item.ReportType"
+        ></el-option>
+      </el-select>
+      <el-input
+        v-model="searchParams.Title"
+        placeholder="请输入推送标题"
+        style="width: 432px; margin-bottom: 10px"
+        :prefix-icon="Search"
+        clearable
+        @input="getList('search')"
+      ></el-input>
+    </div>
+    <!-- 表格区域 -->
+    <div class="table-zone">
+      <el-table :data="dataList" border>
+        <el-table-column label="序号" align="center" width="100px">
+          <template #default="scope">
+            {{ scope.$index + pageCounts + 1 }}
+          </template>
+        </el-table-column>
+        <el-table-column
+          label="推送标题"
+          align="center"
+          prop="Title"
+        ></el-table-column>
+        <el-table-column
+          label="产品类型"
+          align="center"
+          prop="ReportType"
+          width="160px"
+        ></el-table-column>
+        <el-table-column
+          label="优先类型"
+          align="center"
+          prop="Level"
+          width="160px"
+        >
+          <template #default="{row}">
+            <span>
+              {{levelOptions[row['Level']]||''}}
+            </span>
+          </template>
+        </el-table-column>
+        <el-table-column
+          label="推送标签"
+          align="center"
+          prop="LabelStr"
+        ></el-table-column>
+        <el-table-column
+          label="待推送时间"
+          align="center"
+          width="160px"
+          prop="PushTime"
+        ></el-table-column>
+        <el-table-column
+          label="创建时间"
+          align="center"
+          show-overflow-tooltip
+          prop="CreateTime"
+          width="160px"
+        ></el-table-column>
+        <el-table-column label="操作" align="center" width="150px">
+          <template #default="{ row }">
+            <span
+              style="cursor: pointer; font-size: 14px; color: #409eff"
+              @click="openSetTimeDia(row)"
+              >设置待推送时间</span
+            >
+          </template>
+        </el-table-column>
+        <template #empty >
+          <div class="table-noData">
+            <img src="~@/assets/img/cus_m/nodata.png" />
+            <span>暂无数据</span>
+          </div>
+        </template>
+      </el-table>
+    </div>
+    <!-- 页数 -->
+    <m-page
+      :page_no="searchParams.CurrentIndex"
+      :pageSize="searchParams.PageSize"
+      :total="total"
+      style="position: absolute; right: 50px; bottom: 50px"
+      @handleCurrentChange="pageChange"
+    />
+    <!-- 设置推送时间弹窗 -->
+    <el-dialog
+      title="设置待推送时间"
+      v-model="showPushingTime"
+      :close-on-click-modal="false"
+      append-to-body
+      width="592px"
+      @closed="setCancel"
+    >
+      <el-form :model="pushingTimeSet" ref="PushingTimeFormRef">
+        <el-form-item
+          prop="PushTime"
+          style="margin-left: 80px"
+          :rules="{
+            required: true,
+            message: '请选择待推送时间',
+            trigger: 'change',
+          }"
+        >
+          <el-date-picker
+            v-model="pushingTimeSet.PushTime"
+            placeholder="请选择日期"
+            type="datetime"
+            format="YYYY-MM-DD HH:mm"
+            value-format="YYYY-MM-DD HH:mm:ss"
+            style="width: 256px"
+            :clearable="false"
+          ></el-date-picker>
+        </el-form-item>
+        <el-form-item style="text-align: center; padding-top: 20px">
+          <el-button @click="setCancel" style="width: 112px">取消</el-button>
+          <el-button
+            type="primary"
+            @click="submitPushTime"
+            style="margin-left: 40px; width: 112px"
+            >确定</el-button
+          >
+        </el-form-item>
+      </el-form>
+    </el-dialog>
+  </div>
+</template>
+
+<style scoped lang="scss">
+    .search-zone{
+      display: flex;
+      flex-wrap: wrap;
+      .search-item{
+        font-weight: 400;
+        font-size: 16px;
+        color:#666666 ;
+      }
+    }
+    .table-zone{
+      overflow: auto;
+      flex-grow: 1;
+      margin-top: 10px;
+      margin-bottom: 50px;
+      .table-noData{
+        display: flex;
+        flex-direction: column;
+        align-items: center;
+        justify-content: center;
+        margin: 18vh 0;
+        img{
+          height: 110px;
+          width: 136px;
+        }
+        span{
+          font-weight: 400;
+          font-size: 16px;
+          color: #999999;
+        }
+      }
+    }
+</style>

+ 63 - 0
src/views/report_manage/pushSetting.vue

@@ -0,0 +1,63 @@
+<script setup>
+import {shallowRef} from "vue"
+
+import WaitPushList from './components/waitPushList.vue'
+import PrioritySettingList from './components/prioritySettingList.vue'
+
+const selectPage=shallowRef(WaitPushList)
+
+const changePage=(page)=>{
+  selectPage.value = page
+}
+
+</script>
+
+<template>
+  <div id="push-setting-container">
+    <div class="tabs-box">
+			<span
+				class="custom-tab" 
+				:class="selectPage===WaitPushList ?'activeTab':''"
+				@click="changePage(WaitPushList)"
+			>待推送列表</span>
+      <span
+				class="custom-tab" 
+				:class="selectPage===PrioritySettingList ?'activeTab':''"
+				@click="changePage(PrioritySettingList)"
+			>产品优先列表</span>
+		</div>
+    <component :is="selectPage"/>
+  </div>
+</template>
+
+<style lang="scss" scoped>
+  #push-setting-container{
+    // min-height:calc(100vh - 110px);
+    display: flex;
+    flex-direction: column;
+    height:calc(100vh - 110px);
+    background-color: white;
+    border: 1px solid #ECECEC;
+    border-radius: 2px;
+    box-sizing: border-box;
+    padding: 30px;
+    .tabs-box{
+      font-size: 18px;
+      color: #999;
+      margin-bottom: 30px;
+      .custom-tab{
+        display: inline-block;
+        margin-right: 30px;
+        color: #333;
+        cursor: pointer;
+        height: 40px;
+        line-height: 40px;
+        box-sizing: border-box;
+      }
+      .activeTab{
+        color: #409EFF;
+        border-bottom: 2px solid #409EFF;
+      }
+    }
+  }
+</style>