浏览代码

feat: 群发任务停止 - 客户群发&客户群群发&智能推送v3

zhengxy 1 年之前
父节点
当前提交
856ec60bef

+ 174 - 0
project/src/components/assembly/cancelSendListDialog.vue

@@ -0,0 +1,174 @@
1
+<template>
2
+  <el-dialog
3
+    :visible.sync="dialogVisible"
4
+    :before-close="handleCancel"
5
+    class="list-dialog"
6
+    :title="dialogTitle"
7
+    width="900px"
8
+  >
9
+    <div class="form-wrap" v-loading="loading">
10
+      <el-table ref="tableDom" :height="height" :data="list" tooltip-effect="dark" style="width: 100%;">
11
+        <el-table-column label="群发标题" prop="title" min-width="160" align="center" fixed="left" />
12
+        <el-table-column label="创建人" align="center" min-width="140">
13
+          <template slot-scope="{ row }">
14
+            <div class="customerServiceTagBox">
15
+              <div class="customerServiceTag"><i class="el-icon-user-solid"></i> {{ row.creator }}</div>
16
+            </div>
17
+          </template>
18
+        </el-table-column>
19
+        <el-table-column label="创建时间" prop="created_at" min-width="160" align="center" />
20
+        <el-table-column label="状态" min-width="160" align="center">
21
+          <template slot-scope="{ row }">
22
+            <span :class="['status', handleGetStatusDesc(row.status).tColor]">
23
+              {{ handleGetStatusDesc(row.status).label }}
24
+            </span>
25
+          </template>
26
+        </el-table-column>
27
+      </el-table>
28
+      <div class="pagination" v-show="pagination.total > 0">
29
+        <el-pagination background :current-page="pagination.page" @current-change="handleCurrentChange" layout="prev, pager, next" :page-count="Number(pagination.pages)" />
30
+      </div>
31
+    </div>
32
+    <div slot="footer" class="dialog-footer">
33
+      <!-- <el-button size="mini" @click="handleCancel">关 闭</el-button> -->
34
+    </div>
35
+  </el-dialog>
36
+</template>
37
+
38
+<script>
39
+import selfInput from '@/components/assembly/screen/input.vue'
40
+
41
+const statusMap = new Map([
42
+  [-1, { label: '停止失败', tColor: 'c-666' }],
43
+  [0, { label: '禁用', tColor: 'c-F03F5C' }],
44
+  [1, { label: '待停止', tColor: 'c-FFB055' }],
45
+  [2, { label: '执行中', tColor: 'c-448AFF' }],
46
+  [3, { label: '已完成', tColor: 'c-58BCA6' }],
47
+])
48
+
49
+export default {
50
+  components: {
51
+    selfInput,
52
+  },
53
+  props: {
54
+    // 控制弹框是否显示
55
+    dialogVisible: {
56
+      type: Boolean,
57
+      default: () => false
58
+    },
59
+    // 群发消息类型。1正常群发 2智能群发 3客户群群发
60
+    listType: {
61
+      type: Number | String,
62
+      default: () => ''
63
+    },
64
+  },
65
+  data() {
66
+    return {
67
+      height: 500,
68
+      loading: false,
69
+      pagination: {
70
+        page: 1,
71
+        page_size: 20,
72
+        pages: 0,
73
+        total: 0,
74
+      },
75
+      filter: {
76
+        type: '',
77
+      },
78
+      list: [],
79
+    }
80
+  },
81
+  computed: {
82
+    // 弹框标题
83
+    dialogTitle() {
84
+      return '停止群发记录'
85
+    }
86
+  },
87
+  watch: {
88
+    dialogVisible(isShow) {
89
+      // 弹框显示 => 初始化表单数据
90
+      if (isShow) {
91
+        this.pagination.page = 1
92
+        this.filter.type = this.listType
93
+        this.handleInitList()
94
+        this.handleGetList()
95
+      }
96
+    },
97
+  },
98
+  methods: {
99
+    // 获取列表数据
100
+    async handleGetList() {
101
+      try {
102
+        this.loading = true
103
+        const url = `${this.URL.BASEURL}${this.URL.massMsgCancel_taskList}`
104
+        const params = {
105
+          type: this.filter.type,
106
+          page: this.pagination.page,
107
+          page_size: this.pagination.page_size,
108
+        }
109
+        const { data: res = {} } = await this.$axios.get(url, { params })
110
+        if (res && res.errno == 0 && Array.isArray(res.rst.data)) {
111
+          this.list = res.rst.data;
112
+          this.pagination.total = res.rst.pageInfo.total;
113
+          this.pagination.pages = res.rst.pageInfo.pages;
114
+          this.$refs.tableDom.bodyWrapper.scrollTop = 0
115
+        } else if (res.errno != 4002) {
116
+          this.$message.warning(res.err)
117
+          this.handleInitList()
118
+        }
119
+      } catch (error) {
120
+        console.log(error)
121
+        this.handleInitList()
122
+      } finally {
123
+        this.loading = false
124
+      }
125
+    },
126
+    // 监听当前页数变化
127
+    handleCurrentChange(currentPage) {
128
+      this.pagination.page = currentPage
129
+      this.handleGetList()
130
+    },
131
+    // 初始化列表数据
132
+    handleInitList() {
133
+      this.list = [];
134
+      this.pagination.total = 0;
135
+      this.pagination.pages = 0;
136
+    },
137
+    handleCancel() {
138
+      this.$emit('close')
139
+    },
140
+    handleGetStatusDesc(status) {
141
+      return statusMap.get(Number(status)) || {}
142
+    },
143
+  },
144
+};
145
+</script>
146
+
147
+<style lang="scss" scoped>
148
+.list-dialog {
149
+  .status {
150
+    margin: 2px auto;
151
+    padding: 0 6px;
152
+  }
153
+  .form-wrap {
154
+    padding: 0 10px;
155
+  }
156
+  .dialog-footer {
157
+    text-align: center;
158
+  }
159
+  /deep/ .el-dialog {
160
+    position: absolute;
161
+    top: 50%;
162
+    left: 50%;
163
+    margin: 0 !important;
164
+    transform: translate(-50%, -50%);
165
+  }
166
+
167
+  /deep/ .el-dialog__body {
168
+    padding: 0 10px 10px;
169
+  }
170
+  /deep/ .el-dialog__footer {
171
+    padding: 0;
172
+  }
173
+}
174
+</style>

+ 69 - 5
project/src/components/customOperate/chatGroup/index.vue

@@ -24,6 +24,7 @@
24 24
       </div>
25 25
       <div class="flex">
26 26
         <el-button type="primary" size="mini" @click="createdMassMsg">新建群发</el-button>
27
+        <el-button type="primary" plain size="mini" @click="onClickCancelSendList">停止群发记录</el-button>
27 28
         <el-button type="primary" plain size="mini" @click="init(1, 'export')">导出Excel</el-button>
28 29
       </div>
29 30
     </div>
@@ -88,9 +89,9 @@
88 89
           <span v-if="scope.row.enable == 4" class="c-58BCA6">发送完成</span>
89 90
         </template>
90 91
       </el-table-column>
91
-      <el-table-column min-width="120" label="操作" align="center">
92
+      <el-table-column min-width="150" label="操作" align="center" fixed="right">
92 93
         <template slot-scope="scope">
93
-          <div class="flex" style="justify-content:center">
94
+          <div class="flex" style="justify-content:center;flex-wrap:wrap;">
94 95
             <el-popconfirm :disabled="scope.row.enable == 3 ? false : true" @confirm="remind_send(scope.row)"
95 96
               :title="'猎羽将提醒未发送的群主发送消息,是否确认提醒 ?'">
96 97
               <div slot="reference" class="table_button" v-if="scope.row.enable == 3"
@@ -105,6 +106,9 @@
105 106
             <el-popconfirm @confirm="copyDetail(scope.row)" :title="`确定复制【${scope.row.name}】群发消息?`">
106 107
               <div slot="reference" class="c-00B38A pointer table_button">复制</div>
107 108
             </el-popconfirm>
109
+            <div v-if="scope.row.enable == 4" class="pointer table_button c-FF604D" @click="onClickCancelSend(scope.row)">
110
+              停止群发
111
+            </div>
108 112
           </div>
109 113
         </template>
110 114
       </el-table-column>
@@ -120,6 +124,14 @@
120 124
     <el-drawer size="1200px" :visible.sync="detialFlag" :with-header="false">
121 125
       <detail v-if="detialFlag" title="群发详情" :rule_id='detail_rule_id' @close="detailClose" />
122 126
     </el-drawer>
127
+
128
+    <!-- S 停止群发记录 -->
129
+    <cancelSendListDialog
130
+      :dialogVisible="cancelSendDialogVisible"
131
+      :listType="cancelSendListType"
132
+      @close="onCloseCancelSendDialog"
133
+    />
134
+    <!-- E 停止群发记录 -->
123 135
   </div>
124 136
 </template>
125 137
 <script>
@@ -129,8 +141,16 @@ import createMsg from './createMsg.vue'
129 141
 import detail from './createMsgDetail.vue'
130 142
 import selfChannel from '@/components/assembly/screen/channel.vue'
131 143
 import selfInput from '@/components/assembly/screen/input.vue'
144
+import cancelSendListDialog from '@/components/assembly/cancelSendListDialog.vue'
132 145
 export default {
133
-  components: { datePicker, createMsg, detail, selfChannel, selfInput },
146
+  components: {
147
+    datePicker,
148
+    createMsg,
149
+    detail,
150
+    selfChannel,
151
+    selfInput,
152
+    cancelSendListDialog,
153
+  },
134 154
   data () {
135 155
     return {
136 156
       detialFlag: false,
@@ -152,7 +172,10 @@ export default {
152 172
       is_copy: false,
153 173
       sort_field: 'send_time',
154 174
       circleCreate_val: '',
155
-      input_keyword: ''
175
+      input_keyword: '',
176
+
177
+      cancelSendDialogVisible: false,
178
+      cancelSendListType: 3, // 停止群发任务 群发消息类型。1正常群发 2智能群发 3客户群群发
156 179
     }
157 180
   },
158 181
   created () {
@@ -336,7 +359,48 @@ export default {
336 359
         }
337 360
       ]
338 361
       this.$exportOrder({ excelDatas, name: `客户群群发(导出时间:${this.$getDay(0)})` })
339
-    }
362
+    },
363
+
364
+    // 监听点击“停止群发”
365
+    async onClickCancelSend({ name, rule_id }) {
366
+      try {
367
+        await this.$confirm(`确定停止当前群发任务吗?`, `${ name }`, {
368
+          confirmButtonText: '确定',
369
+          cancelButtonText: '取消',
370
+          type: 'warning'
371
+        })
372
+        this.handleCancelSend(rule_id)
373
+      } catch (error) {
374
+        console.log('error => ', error)
375
+      }
376
+    },
377
+    async handleCancelSend(rule_id) {
378
+      try {
379
+        this.loading = true
380
+        const url = `${this.URL.BASEURL}${this.URL.massMsgCancel_setConfig}`
381
+        const params = {
382
+          rule_id,
383
+          type: this.cancelSendListType,
384
+        }
385
+        const { data: res = {} } = await this.$axios.post(url, params)
386
+        if (res && res.errno == 0) {
387
+          this.$message.success('操作成功')
388
+          this.init(this.page)
389
+        } else if (res.errno != 4002) {
390
+          this.$message.warning(res.err)
391
+        }
392
+      } catch (error) {
393
+        console.log(error)
394
+      } finally {
395
+        this.loading = false
396
+      }
397
+    },
398
+    onClickCancelSendList() {
399
+      this.cancelSendDialogVisible = true
400
+    },
401
+    onCloseCancelSendDialog() {
402
+      this.cancelSendDialogVisible = false
403
+    },
340 404
   }
341 405
 }
342 406
 </script>

+ 50 - 24
project/src/components/customOperate/employee_bulk_messaging_log.vue

@@ -20,6 +20,7 @@
20 20
         </div>
21 21
       </div>
22 22
       <div class="flex">
23
+        <el-button type="primary" plain size="mini" @click="onClickCancelSendList">停止群发记录</el-button>
23 24
         <el-button type="primary" plain size="mini" @click="init(1,'export')">导出Excel</el-button>
24 25
         <!-- 使用说明 -->
25 26
         <instructions style="margin-left: 20px;" doc="employee_bulk_messaging_log"></instructions>
@@ -101,9 +102,9 @@
101 102
           </div>
102 103
         </template>
103 104
       </el-table-column>
104
-      <el-table-column min-width="140" label="操作" align="center" fixed="right">
105
+      <el-table-column min-width="150" label="操作" align="center" fixed="right">
105 106
         <template slot-scope="scope">
106
-          <div class="flex" style="justify-content:center">
107
+          <div class="flex" style="justify-content:center;flex-wrap:wrap;">
107 108
             <el-popconfirm :disabled="scope.row.enable==1||scope.row.enable==2?false:true" @confirm="remind_send(scope.row)" :title="'猎羽将提醒未发送的客户发送消息,是否确认提醒 ?'">
108 109
               <div slot="reference" class="table_button" v-if="scope.row.enable==1||scope.row.enable==2" :class="scope.row.enable==1||scope.row.enable==2?'c-00B38A pointer':'pointer-drop c-999'">提醒</div>
109 110
             </el-popconfirm>
@@ -131,6 +132,14 @@
131 132
     <el-drawer size="1200px" :visible.sync="detialFlag" :with-header="false">
132 133
       <massMsgDetail v-if="detialFlag" title="群发详情" :rule_id='detail_rule_id' @close="detailClose"></massMsgDetail>
133 134
     </el-drawer>
135
+
136
+    <!-- S 停止群发记录 -->
137
+    <cancelSendListDialog
138
+      :dialogVisible="cancelSendDialogVisible"
139
+      :listType="cancelSendListType"
140
+      @close="onCloseCancelSendDialog"
141
+    />
142
+    <!-- E 停止群发记录 -->
134 143
   </div>
135 144
 </template>
136 145
 <script>
@@ -141,8 +150,16 @@ import massMsgDetail from './massMsgDetail/index.vue'
141 150
 import selfChannel from '@/components/assembly/screen/channel.vue'
142 151
 import { pageFromType } from '@/assets/js/staticTypes'
143 152
 import selfInput from '@/components/assembly/screen/input.vue'
153
+import cancelSendListDialog from '@/components/assembly/cancelSendListDialog.vue'
144 154
 export default {
145
-  components: { selfInput, datePicker, createMassMsg, massMsgDetail, selfChannel },
155
+  components: {
156
+    selfInput,
157
+    datePicker,
158
+    createMassMsg,
159
+    massMsgDetail,
160
+    selfChannel,
161
+    cancelSendListDialog,
162
+  },
146 163
   data () {
147 164
     return {
148 165
       detialFlag: false,
@@ -163,6 +180,9 @@ export default {
163 180
       is_copy: false,
164 181
       sort_field: 'send_time',
165 182
       circleCreate_val: '',
183
+
184
+      cancelSendDialogVisible: false,
185
+      cancelSendListType: 1, // 停止群发任务 群发消息类型。1正常群发 2智能群发 3客户群群发
166 186
     }
167 187
   },
168 188
   created () {
@@ -436,27 +456,33 @@ export default {
436 456
         console.log('error => ', error)
437 457
       }
438 458
     },
439
-    // async handleCancelSend(rule_id) {
440
-    //   try {
441
-    //     this.loading = true
442
-    //     const url = `${this.URL.BASEURL}${this.URL.massMsgCancel_setConfig}`
443
-    //     const params = {
444
-    //       rule_id,
445
-    //       type: 1, // 群发消息类型。1正常群发 2智能群发 3客户群群发
446
-    //     }
447
-    //     const { data: res = {} } = await this.$axios.post(url, params)
448
-    //     if (res && res.errno == 0) {
449
-    //       this.$message.success('操作成功')
450
-    //       this.resetEvent()
451
-    //     } else if (res.errno != 4002) {
452
-    //       this.$message.warning(res.err)
453
-    //     }
454
-    //   } catch (error) {
455
-    //     console.log(error)
456
-    //   } finally {
457
-    //     this.loading = false
458
-    //   }
459
-    // },
459
+    async handleCancelSend(rule_id) {
460
+      try {
461
+        this.loading = true
462
+        const url = `${this.URL.BASEURL}${this.URL.massMsgCancel_setConfig}`
463
+        const params = {
464
+          rule_id,
465
+          type: this.cancelSendListType,
466
+        }
467
+        const { data: res = {} } = await this.$axios.post(url, params)
468
+        if (res && res.errno == 0) {
469
+          this.$message.success('操作成功')
470
+          this.init(this.page)
471
+        } else if (res.errno != 4002) {
472
+          this.$message.warning(res.err)
473
+        }
474
+      } catch (error) {
475
+        console.log(error)
476
+      } finally {
477
+        this.loading = false
478
+      }
479
+    },
480
+    onClickCancelSendList() {
481
+      this.cancelSendDialogVisible = true
482
+    },
483
+    onCloseCancelSendDialog() {
484
+      this.cancelSendDialogVisible = false
485
+    },
460 486
   }
461 487
 }
462 488
 </script>

+ 72 - 4
project/src/components/smartPushV3/detailList.vue

@@ -25,6 +25,7 @@
25 25
       <div class="flex">
26 26
         <el-button type="primary" size="mini" @click="onClickCreatedRule">新建智能推送</el-button>
27 27
         <el-button type="primary" plain size="mini" @click="onClickBatchGroup">批量设置分组</el-button>
28
+        <el-button type="primary" plain size="mini" @click="onClickCancelSendList">停止群发记录</el-button>
28 29
         <el-button type="primary" plain size="mini" @click="init(1,'export')">导出Excel</el-button>
29 30
       </div>
30 31
     </div>
@@ -46,6 +47,11 @@
46 47
       </el-table-column>
47 48
       <el-table-column prop="desc" label="规则" align="center" min-width="200" />
48 49
       <el-table-column label="创建时间" prop="created_at" min-width="120" show-overflow-tooltip align="center" />
50
+      <el-table-column label="推送记录" align="center" min-width="100">
51
+        <template slot-scope="{ row }">
52
+          <div class="c-00B38A pointer table_button" @click="onClickPushRecords(row)">查看</div>
53
+        </template>
54
+      </el-table-column>
49 55
       <el-table-column label="状态" show-overflow-tooltip align="center" min-width="120">
50 56
         <template slot-scope="{ row }">
51 57
           <el-switch v-model="row.status" :active-value="1" :inactive-value="0" disabled @click.native="onClickStatus(row)" />
@@ -59,14 +65,15 @@
59 65
               <div slot="reference" class="c-00B38A pointer table_button">复制</div>
60 66
             </el-popconfirm>
61 67
             <div class="c-FF604D pointer table_button" @click="onClickDelRule(scope.row)">删除</div>
62
-            <div class="c-00B38A pointer table_button" @click="onClickPushRecords(scope.row)">推送记录</div>
68
+            <div v-if="scope.row.status==1" class="pointer table_button c-FF604D" @click="onClickCancelSend(scope.row)">
69
+              停止群发
70
+            </div>
63 71
           </div>
64 72
         </template>
65 73
       </el-table-column>
66 74
     </el-table>
67 75
     <div class="pagination" v-show="total>0">
68
-      <el-pagination background :current-page="page" @current-change="handleCurrentChange" layout="prev, pager, next" :page-count='Number(pages)'>
69
-      </el-pagination>
76
+      <el-pagination background :current-page="page" @current-change="handleCurrentChange" layout="prev, pager, next" :page-count='Number(pages)' />
70 77
     </div>
71 78
     <!-- S 新建/编辑智能推送 -->
72 79
     <el-drawer size="1200px" :visible.sync="massMsgFlag" :with-header="false">
@@ -90,6 +97,14 @@
90 97
     />
91 98
     <!-- E 批量分组 -->
92 99
 
100
+    <!-- S 停止群发记录 -->
101
+    <cancelSendListDialog
102
+      :dialogVisible="cancelSendDialogVisible"
103
+      :listType="cancelSendListType"
104
+      @close="onCloseCancelSendDialog"
105
+    />
106
+    <!-- E 停止群发记录 -->
107
+
93 108
   </div>
94 109
 </template>
95 110
 <script>
@@ -98,8 +113,17 @@ import selfChannel from '@/components/assembly/screen/channel.vue'
98 113
 import selfInputV2 from '@/components/assembly/screen/inputV2.vue'
99 114
 import createMassMsg from './createMassMsg.vue'
100 115
 import batchGroupDialog from './batchGroupDialog.vue'
116
+import cancelSendListDialog from '@/components/assembly/cancelSendListDialog.vue'
117
+
101 118
 export default {
102
-  components: { datePicker, selfChannel, selfInputV2, createMassMsg, batchGroupDialog, },
119
+  components: {
120
+    datePicker,
121
+    selfChannel,
122
+    selfInputV2,
123
+    createMassMsg,
124
+    batchGroupDialog,
125
+    cancelSendListDialog,
126
+  },
103 127
   data () {
104 128
     return {
105 129
       massMsgFlag: false,
@@ -123,6 +147,9 @@ export default {
123 147
       multipleSelection: [],
124 148
       currentSelectedRules: '',
125 149
       batchGroupVisible: false,
150
+
151
+      cancelSendDialogVisible: false,
152
+      cancelSendListType: 2, // 停止群发任务 群发消息类型。1正常群发 2智能群发 3客户群群发
126 153
     }
127 154
   },
128 155
   created () {
@@ -369,6 +396,47 @@ export default {
369 396
     onCancelBatchGroup() {
370 397
       this.batchGroupVisible = false
371 398
     },
399
+
400
+    // 监听点击“停止群发”
401
+    async onClickCancelSend({ name, rule_id }) {
402
+      try {
403
+        await this.$confirm(`确定停止当前群发任务吗?`, `${ name }`, {
404
+          confirmButtonText: '确定',
405
+          cancelButtonText: '取消',
406
+          type: 'warning'
407
+        })
408
+        this.handleCancelSend(rule_id)
409
+      } catch (error) {
410
+        console.log('error => ', error)
411
+      }
412
+    },
413
+    async handleCancelSend(rule_id) {
414
+      try {
415
+        this.loading = true
416
+        const url = `${this.URL.BASEURL}${this.URL.massMsgCancel_setConfig}`
417
+        const params = {
418
+          rule_id,
419
+          type: this.cancelSendListType,
420
+        }
421
+        const { data: res = {} } = await this.$axios.post(url, params)
422
+        if (res && res.errno == 0) {
423
+          this.$message.success('操作成功')
424
+          this.init(this.page)
425
+        } else if (res.errno != 4002) {
426
+          this.$message.warning(res.err)
427
+        }
428
+      } catch (error) {
429
+        console.log(error)
430
+      } finally {
431
+        this.loading = false
432
+      }
433
+    },
434
+    onClickCancelSendList() {
435
+      this.cancelSendDialogVisible = true
436
+    },
437
+    onCloseCancelSendDialog() {
438
+      this.cancelSendDialogVisible = false
439
+    },
372 440
   }
373 441
 }
374 442
 </script>