瀏覽代碼

消息推送

Alex 9 月之前
父節點
當前提交
e8f88429bf

+ 97 - 48
src/views/marketing/messagePush/components/message-push-dialog.vue

@@ -12,19 +12,28 @@
       label-width="100px"
       class="send-form"
     >
-      <el-form-item>
+      <el-form-item label="用户类型:" prop="userType">
         <el-radio-group v-model="sendForm.userType">
-          <el-radio :label="0">全平台用户</el-radio>
-          <el-radio :label="1">部分用户</el-radio>
+          <el-radio :label="1">全部用户</el-radio>
+          <el-radio :label="2">部分用户</el-radio>
         </el-radio-group>
       </el-form-item>
 
-      <el-form-item v-if="sendForm.userType === 1" label="搜索条件:" prop="userSearch">
-        <el-input
+      <el-form-item v-if="sendForm.userType === 2" label="用户标签:" prop="userSearch">
+        <el-select
           v-model="sendForm.userSearch"
-          placeholder="请输入搜索条件"
+          multiple
+          placeholder="请选择用户标签"
           clearable
-        />
+          class="w-full"
+        >
+          <el-option
+            v-for="item in tagList"
+            :key="item.id"
+            :label="item.tagName"
+            :value="item.id"
+          />
+        </el-select>
       </el-form-item>
 
       <div class="content-section">
@@ -45,29 +54,29 @@
             />
           </el-select>
         </el-form-item>
-
-        <el-form-item label="签名名称:" prop="sign">
+        <el-form-item label="签名名称:" v-if="templateDetail.sign">
           <el-input
-            v-model="sendForm.sign"
-            placeholder="请选择模板后自动填充"
+            v-model="templateDetail.sign"
+            readonly
             disabled
           />
         </el-form-item>
 
-        <el-form-item label="短信内容:" prop="content">
+        <el-form-item label="短信内容:" v-if="templateDetail.content">
           <el-input
-            v-model="sendForm.content"
+            v-model="templateDetail.content"
             type="textarea"
-            :rows="4"
-            placeholder="请选择模板后自动填充"
+            :rows="3"
+            readonly
             disabled
           />
         </el-form-item>
 
+
         <el-form-item label="备注:" prop="remark">
           <el-input
             v-model="sendForm.remark"
-            placeholder="请输入"
+            placeholder="请输入备注"
             clearable
           />
         </el-form-item>
@@ -75,19 +84,21 @@
 
       <el-form-item label="发送方式:" prop="sendType">
         <el-radio-group v-model="sendForm.sendType">
-          <el-radio :label="0">立即发送</el-radio>
-          <el-radio :label="1">定时发送</el-radio>
+          <el-radio :label="1">立即发送</el-radio>
+          <el-radio :label="2">定时发送</el-radio>
         </el-radio-group>
       </el-form-item>
 
       <el-form-item
-        v-if="sendForm.sendType === 1"
+        v-if="sendForm.sendType === 2"
         label="发送时间:"
         prop="sendTime"
       >
         <el-date-picker
           v-model="sendForm.sendTime"
           type="datetime"
+          format="YYYY-MM-DD HH:mm:ss"
+          value-format="YYYY-MM-DD HH:mm:ss"
           placeholder="选择时间"
         />
       </el-form-item>
@@ -113,15 +124,19 @@ const visible = defineModel({ type: Boolean });
 const loading = ref(false);
 const sendFormRef = ref(null);
 const templateList = ref([]);
+const tagList = ref([]);
+const templateDetail = reactive({
+  content: '',
+  sign: ''
+});
 
 const sendForm = reactive({
-  userType: 0,
-  userSearch: '',
+  id: undefined,
+  userType: 1,
+  userSearch: [],
   templateId: '',
-  sign: '',
-  content: '',
   remark: '',
-  sendType: 0,
+  sendType: 1,
   sendTime: ''
 });
 
@@ -143,35 +158,58 @@ const getTemplateList = async () => {
   }
 };
 
-// 模板选择变更
-const handleTemplateChange = async (templateId) => {
-  if (!templateId) {
-    sendForm.sign = '';
-    sendForm.content = '';
-    return;
+// 获取用户标签列表
+const getTagList = async () => {
+  try {
+    const { data } = await request.get('/user/tag/pagelist?pageNum=1&pageSize=1000');
+    console.log(data);
+    if (data.code === 200) {
+      tagList.value = data.rows || [];
+    }
+  } catch (e) {
+    console.error('获取用户标签列表失败:', e);
   }
+};
+
+// 获取模板详情
+const getTemplateDetail = async (id) => {
   try {
-    const { data } = await request.get(`/message/templetemsg/getInfo/${templateId}`);
+    const { data } = await request.get(`/message/templetemsg/getInfo/${id}`);
     if (data.code === 200) {
-      sendForm.sign = data.data.sign;
-      sendForm.content = data.data.content;
+      templateDetail.content = data.data.content;
+      templateDetail.sign = data.data.sign;
     }
   } catch (e) {
     console.error('获取模板详情失败:', e);
   }
 };
 
+// 模板选择变更
+const handleTemplateChange = async (templateId) => {
+  if (!templateId) {
+    sendForm.templateId = '';
+    templateDetail.content = '';
+    templateDetail.sign = '';
+    return;
+  }
+  sendForm.templateId = templateId;
+  await getTemplateDetail(templateId);
+};
+
 function handleReset() {
   Object.assign(sendForm, {
-    userType: 0,
-    userSearch: '',
+    id: undefined,
+    userType: 1,
+    userSearch: [],
     templateId: '',
-    sign: '',
-    content: '',
     remark: '',
-    sendType: 0,
+    sendType: 1,
     sendTime: ''
   });
+  Object.assign(templateDetail, {
+    content: '',
+    sign: ''
+  });
 }
 
 async function handleSubmitSend() {
@@ -183,17 +221,18 @@ async function handleSubmitSend() {
 
     // 构建请求参数
     const params = {
-      templateId: sendForm.templateId,
-      userType: sendForm.userType,
-      userSearch: sendForm.userSearch,
-      remark: sendForm.remark,
-      sendType: sendForm.sendType,
-      sendTime: sendForm.sendTime ? sendForm.sendTime.toISOString() : undefined
+      ...sendForm,
+      userSearch: sendForm.userSearch.join(','),
+      sendTime: sendForm.sendTime
     };
 
-    const { data } = await request.post('/message/message/add', params);
+    const url = sendForm.id
+      ? '/message/messagepush/update'
+      : '/message/messagepush/add';
+
+    const { data } = await request.post(url, params);
     if (data.code === 200) {
-      EleMessage.success('发送成功');
+      EleMessage.success(sendForm.id ? '修改成功' : '发送成功');
       visible.value = false;
       handleReset();
       emit('success');
@@ -208,9 +247,19 @@ async function handleSubmitSend() {
 }
 
 // 打开弹窗时获取模板列表
-const handleOpen = () => {
+const handleOpen = (row) => {
+  visible.value = true;
   getTemplateList();
-  handleReset();
+  getTagList();
+  if (row) {
+    const formData = { ...row };
+    if (formData.userSearch) {
+      formData.userSearch = formData.userSearch.split(',');
+    }
+    Object.assign(sendForm, formData);
+  } else {
+    handleReset();
+  }
 };
 
 defineExpose({ handleOpen });

+ 84 - 78
src/views/marketing/messagePush/components/message-push.vue

@@ -31,94 +31,100 @@
       </template>
     </common-table>
 
-    <message-push-dialog ref="dialogRef" @success="reload()"></message-push-dialog>
+    <message-push-dialog
+      ref="dialogRef"
+      @success="reload()"
+    ></message-push-dialog>
   </div>
 </template>
 
 <script setup>
-import { ref, reactive } from 'vue';
-import { EleMessage } from 'ele-admin-plus/es';
-import { PlusOutlined } from '@/components/icons';
-import CommonTable from '@/components/CommonPage/CommonTable.vue';
-import MessagePushDialog from './message-push-dialog.vue';
-import request from '@/utils/request';
+  import { ref, reactive } from 'vue';
+  import { EleMessage } from 'ele-admin-plus/es';
+  import { PlusOutlined } from '@/components/icons';
+  import CommonTable from '@/components/CommonPage/CommonTable.vue';
+  import MessagePushDialog from './message-push-dialog.vue';
+  import request from '@/utils/request';
 
-defineOptions({ name: 'MessagePush' });
+  defineOptions({ name: 'MessagePush' });
 
-const search = ref('');
-const pageRef = ref(null);
-const dialogRef = ref(null);
+  const search = ref('');
+  const pageRef = ref(null);
+  const dialogRef = ref(null);
 
-const reset = () => {
-  search.value = '';
-  reload();
-};
+  const reset = () => {
+    search.value = '';
+    reload();
+  };
 
-/** 表格列配置 */
-const columns = ref([
-  {
-    label: '模板名称',
-    prop: 'templateName',
-    align: 'center',
-    minWidth: 140
-  },
-  {
-    label: '发送类型',
-    prop: 'userType',
-    align: 'center',
-    width: 100,
-    formatter: (row) => {
-      return row.userType === 0 ? '全平台用户' : '部分用户';
+  /** 表格列配置 */
+  const columns = ref([
+    {
+      label: '模板名称',
+      prop: 'templateName',
+      align: 'center',
+      minWidth: 140
+    },
+    {
+      label: '发送类型',
+      prop: 'userType',
+      align: 'center',
+      width: 110,
+      formatter: (row) => {
+        return row.userType === 0 ? '全平台用户' : '部分用户';
+      }
+    },
+    {
+      label: '用户标签',
+      prop: 'userSearch',
+      align: 'center',
+      minWidth: 140,
+      formatter: (row) => {
+        return row.tagNameList ? row.tagNameList.join(',') : '-';
+      }
+    },
+    {
+      label: '发送方式',
+      prop: 'sendType',
+      align: 'center',
+      width: 110,
+      formatter: (row) => {
+        return row.sendType === 0 ? '立即发送' : '定时发送';
+      }
+    },
+    {
+      label: '发送时间',
+      prop: 'sendTime',
+      align: 'center',
+      minWidth: 160
+    },
+    {
+      label: '备注',
+      prop: 'remark',
+      align: 'center',
+      minWidth: 140
+    },
+    {
+      label: '添加时间',
+      prop: 'createTime',
+      align: 'center',
+      minWidth: 160
     }
-  },
-  {
-    label: '搜索条件',
-    prop: 'userSearch',
-    align: 'center',
-    minWidth: 140
-  },
-  {
-    label: '发送方式',
-    prop: 'sendType',
-    align: 'center',
-    width: 100,
-    formatter: (row) => {
-      return row.sendType === 0 ? '立即发送' : '定时发送';
-    }
-  },
-  {
-    label: '发送时间',
-    prop: 'sendTime',
-    align: 'center',
-    minWidth: 160
-  },
-  {
-    label: '备注',
-    prop: 'remark',
-    align: 'center',
-    minWidth: 140
-  },
-  {
-    label: '添加时间',
-    prop: 'createTime',
-    align: 'center',
-    minWidth: 160
-  }
-]);
+  ]);
 
-const pageConfig = reactive({
-  pageUrl: '/message/message/pagelist',
-  fileName: '消息推送',
-  cacheKey: 'messagePushTable'
-});
+  const pageConfig = reactive({
+    pageUrl: '/message/messagepush/pagelist',
+    fileName: '消息推送',
+    cacheKey: 'messagePushTable'
+  });
 
-// 刷新表格
-function reload(where) {
-  pageRef.value?.reload({ ...where, content: search.value });
-}
+  // 刷新表格
+  function reload(where) {
+    pageRef.value?.reload({ ...where, content: search.value });
+  }
 
-// 新增推送
-function handleAdd() {
-  dialogRef.value?.handleOpen();
-}
+  // 新增推送
+  function handleAdd() {
+    dialogRef.value?.handleOpen();
+  }
 </script>

+ 2 - 1
src/views/marketing/messagePush/components/template-edit.vue

@@ -120,7 +120,8 @@
         sign: form.sign,
         content: form.content,
         remark: form.remark,
-        pushWay: form.pushWay.join(',')
+        pushWay: form.pushWay.join(','),
+        status: 1
       };
 
       if (editId.value) {