Browse Source

feat: 客户群群发 - 选择群聊

zhengxy 1 year ago
parent
commit
e1e1a45660

+ 123 - 38
project/src/components/customOperate/chatGroup/components/chatGroupOptions.vue

15
         <div class="common-screen-self-icon"><i class="el-icon-arrow-down" /></div>
15
         <div class="common-screen-self-icon"><i class="el-icon-arrow-down" /></div>
16
       </div>
16
       </div>
17
 
17
 
18
+      <div class="filter-wrap">
19
+        <el-select v-model="owner" class="select-wrap" size="small" placeholder="全部群主" clearable @change="onChangeOwner">
20
+          <el-option v-for="item in ownerOptions" :key="item.user_id" :label="item.name" :value="item.user_id" />
21
+        </el-select>
22
+        <self-input :reset="reset" :hasLabel="false" label_name="群名称" width="180px" style="margin:0 4px 0 0;" @inputChange="onChangeKeyword" />
23
+        <el-date-picker v-model="times" type="datetimerange" range-separator="至" start-placeholder="创建时间" end-placeholder="创建时间" :picker-options="pickerOptions" :defaultTime="['00:00:00', '23:59:59']" value-format="yyyy-MM-dd HH:mm:ss" size="small" class="time-wrap" @change="onChangeTimes" />
24
+      </div>
25
+
18
       <div class="flex" style="padding:10px" v-loading="loading">
26
       <div class="flex" style="padding:10px" v-loading="loading">
19
         <div class="propoverItem">
27
         <div class="propoverItem">
20
-          <div class="filter-wrap">
21
-            <el-select v-model="owner" class="select-wrap" size="small" placeholder="全部群主" clearable @change="onChangeOwner">
22
-              <el-option v-for="item in ownerOptions" :key="item.user_id" :label="item.name" :value="item.user_id" />
23
-            </el-select>
24
-            <self-input :reset="reset" :hasLabel="false" label_name="群名称" width="180px" style="margin-top:0; margin-bottom:0;" @inputChange="onChangeKeyword" />
28
+          <div class="all-wrap">
29
+            <div class="allMember">全部群聊({{ chatList && chatList.length }})</div>
30
+            <div :class="['checkbox', !chatList.length ? 'disabled' : '', isSelectedAll ? 'checkbox_active' : '']" @click="onClickSelectAll">
31
+              <i class="el-icon-check" />
32
+            </div>
25
           </div>
33
           </div>
26
-          <div class="allMember">全部群聊({{ chatList && chatList.length }}):</div>
34
+
27
           <div class="memberBoxBig self-scrollbar-3">
35
           <div class="memberBoxBig self-scrollbar-3">
28
             <div class="memberBox" v-for="(item, idx) in chatList" :key="item.chat_id">
36
             <div class="memberBox" v-for="(item, idx) in chatList" :key="item.chat_id">
29
               <div class="meberList">
37
               <div class="meberList">
33
                     <div class="memberInfo">
41
                     <div class="memberInfo">
34
                       <div class="name">{{ item.name }}</div>
42
                       <div class="name">{{ item.name }}</div>
35
                       <div class="other">群主:{{ item.owner_name }}</div>
43
                       <div class="other">群主:{{ item.owner_name }}</div>
44
+                      <div class="other">创建时间:{{ item.create_time }}</div>
36
                     </div>
45
                     </div>
37
                   </div>
46
                   </div>
38
                   <div :class="['checkbox', item.isSelected ? 'checkbox_active' : '']">
47
                   <div :class="['checkbox', item.isSelected ? 'checkbox_active' : '']">
59
                 <div class="memberInfo">
68
                 <div class="memberInfo">
60
                   <div class="name">{{ item.name }}</div>
69
                   <div class="name">{{ item.name }}</div>
61
                   <div class="other">群主:{{ item.owner_name }}</div>
70
                   <div class="other">群主:{{ item.owner_name }}</div>
71
+                  <div class="other">创建时间:{{ item.create_time }}</div>
62
                 </div>
72
                 </div>
63
               </div>
73
               </div>
64
               <i class="el-icon-close" style="margin-left:10px" @click="handleDelSelectedChat(idx)" />
74
               <i class="el-icon-close" style="margin-left:10px" @click="handleDelSelectedChat(idx)" />
98
   },
108
   },
99
   data() {
109
   data() {
100
     return {
110
     return {
111
+      pickerOptions: {
112
+        shortcuts: [{
113
+          text: '最近7天',
114
+          onClick: (picker) => {
115
+            const start = `${this.$moment().subtract(6, 'days').format('YYYY-MM-DD')} 00:00:00`
116
+            const end = `${this.$moment().format('YYYY-MM-DD')} 23:59:59`
117
+            picker.$emit('pick', [start, end]);
118
+          }
119
+        }, {
120
+          text: '最近30天',
121
+          onClick: (picker) => {
122
+            const start = `${this.$moment().subtract(29, 'days').format('YYYY-MM-DD')} 00:00:00`
123
+            const end = `${this.$moment().format('YYYY-MM-DD')} 23:59:59`
124
+            picker.$emit('pick', [start, end]);
125
+          }
126
+        }, {
127
+          text: '最近90天',
128
+          onClick: (picker) => {
129
+            const start = `${this.$moment().subtract(89, 'days').format('YYYY-MM-DD')} 00:00:00`
130
+            const end = `${this.$moment().format('YYYY-MM-DD')} 23:59:59`
131
+            picker.$emit('pick', [start, end]);
132
+          }
133
+        }]
134
+      },
101
       reset: false,
135
       reset: false,
102
       loading: false,
136
       loading: false,
103
       dialogVisible: false, // 控制弹框显示
137
       dialogVisible: false, // 控制弹框显示
104
       ownerOptions: [], // 群主筛选
138
       ownerOptions: [], // 群主筛选
105
       owner: '', // 群主id
139
       owner: '', // 群主id
106
       keyword: '', // 关键字
140
       keyword: '', // 关键字
141
+      times: [],
107
       chatList: [], // 可选择客户群列表
142
       chatList: [], // 可选择客户群列表
108
       chatListSelected: [], // 已选择的群列表
143
       chatListSelected: [], // 已选择的群列表
109
     }
144
     }
113
       const arr = this.chatListResult.map(c => c.name)
148
       const arr = this.chatListResult.map(c => c.name)
114
       return arr.join(',')
149
       return arr.join(',')
115
     },
150
     },
151
+    isSelectedAll() { // 是否选择全部群聊
152
+      // 左右长度相等
153
+      const isSameLength = this.chatListSelected.length && (this.chatListSelected.length === this.chatList.length)
154
+      // 左边全部已勾选
155
+      const isSameChat = this.chatList.every(c => c.isSelected)
156
+      return isSameLength && isSameChat
157
+    },
116
   },
158
   },
117
   watch: {
159
   watch: {
118
     dialogVisible(isShow) {
160
     dialogVisible(isShow) {
122
       } else { // 清空搜索关键字
164
       } else { // 清空搜索关键字
123
         this.owner = ''
165
         this.owner = ''
124
         this.keyword = ''
166
         this.keyword = ''
167
+        this.times = []
125
         this.reset = !this.reset
168
         this.reset = !this.reset
126
       }
169
       }
127
     },
170
     },
132
       try {
175
       try {
133
         this.loading = true
176
         this.loading = true
134
         this.chatList = []
177
         this.chatList = []
135
-        const params = { keyword: this.keyword, owner: this.owner }
178
+        const params = {
179
+          keyword: this.keyword,
180
+          owner: this.owner,
181
+          start_time: this.times && this.times.length ? this.times[0] : '',
182
+          end_time: this.times && this.times.length ? this.times[1] : '',
183
+        }
136
         if (this.isOnJobUser) {
184
         if (this.isOnJobUser) {
137
           params.is_active = 1
185
           params.is_active = 1
138
         }
186
         }
181
       this.owner = val
229
       this.owner = val
182
       this.handleGetChatList()
230
       this.handleGetChatList()
183
     },
231
     },
232
+    onChangeTimes(val) {
233
+      this.times = val && val.length ? [...val] : []
234
+      this.handleGetChatList()
235
+    },
184
     onChangeKeyword(val) {
236
     onChangeKeyword(val) {
185
       this.keyword = val
237
       this.keyword = val
186
       this.handleGetChatList()
238
       this.handleGetChatList()
242
       this.$emit('change', _lodash.cloneDeep(this.chatListSelected))
294
       this.$emit('change', _lodash.cloneDeep(this.chatListSelected))
243
       this.dialogVisible = false
295
       this.dialogVisible = false
244
     },
296
     },
297
+
298
+    onClickSelectAll() {
299
+      console.log('this.isSelectedAll => ', this.isSelectedAll)
300
+      if (!this.chatList || !this.chatList.length) return false
301
+      if (this.isSelectedAll) { // 当前是全选状态 => 执行清空逻辑
302
+        this.handleDelAllSelectedChat()
303
+      } else { // 当前是非全选状态 => 选择全部群聊
304
+        this.chatList.forEach(c => {
305
+          c.isSelected = true
306
+        })
307
+        this.chatListSelected = [...this.chatList]
308
+      }
309
+    },
245
   },
310
   },
246
 };
311
 };
247
 </script>
312
 </script>
253
   padding-right: 4px;
318
   padding-right: 4px;
254
   .select-wrap {
319
   .select-wrap {
255
     margin-right: 4px;
320
     margin-right: 4px;
256
-    flex: 1;
321
+    width: 180px;
322
+  }
323
+  /deep/ .time-wrap {
324
+    width: 350px;
325
+    &.el-date-editor .el-range-input {
326
+      width: 50%;
327
+    }
257
   }
328
   }
258
 }
329
 }
259
 
330
 
262
   flex: 1;
333
   flex: 1;
263
   height: 100%;
334
   height: 100%;
264
 
335
 
265
-  .allMember {
266
-    color: #666666;
267
-    font-size: 14px;
268
-    line-height: 20px;
269
-    margin-top: 17px;
336
+  .all-wrap {
337
+    display: flex;
338
+    align-items: center;
339
+    justify-content: space-between;
340
+    padding-right: 19px;
341
+    padding-bottom: 6px;
342
+    margin-top: 3px;
343
+    .allMember {
344
+      color: #666;
345
+      font-size: 14px;
346
+    }
270
   }
347
   }
271
 
348
 
272
   .title {
349
   .title {
330
 .memberBox {
407
 .memberBox {
331
   display: flex;
408
   display: flex;
332
   margin-top: 10px;
409
   margin-top: 10px;
410
+  &:first-child {
411
+    margin-top: 0;
412
+  }
333
 
413
 
334
   .el-icon-caret-bottom {
414
   .el-icon-caret-bottom {
335
     color: #46a7ff;
415
     color: #46a7ff;
358
         font-weight: bold;
438
         font-weight: bold;
359
       }
439
       }
360
     }
440
     }
361
-
362
-    .checkbox {
363
-      width: 15px;
364
-      height: 15px;
365
-      border: 1px solid #979797;
366
-      border-radius: 50%;
367
-      display: flex;
368
-      align-items: center;
369
-      justify-content: center;
370
-      font-size: 12px;
371
-      margin-left: 10px;
372
-
373
-      i {
374
-        color: transparent;
375
-      }
376
-
377
-      &.checkbox_active {
378
-        i {
379
-          color: #ffffff;
380
-        }
381
-
382
-        background: #00b38a;
383
-        border-color: #00b38a;
384
-      }
385
-    }
386
   }
441
   }
387
 }
442
 }
388
 
443
 
433
   text-align: right;
488
   text-align: right;
434
   padding: 20px 0 10px;
489
   padding: 20px 0 10px;
435
 }
490
 }
491
+
492
+.checkbox {
493
+  width: 15px;
494
+  height: 15px;
495
+  border: 1px solid #979797;
496
+  border-radius: 50%;
497
+  display: flex;
498
+  align-items: center;
499
+  justify-content: center;
500
+  font-size: 12px;
501
+  margin-left: 10px;
502
+  cursor: pointer;
503
+
504
+  i {
505
+    color: transparent;
506
+  }
507
+
508
+  &.checkbox_active {
509
+    i {
510
+      color: #ffffff;
511
+    }
512
+
513
+    background: #00b38a;
514
+    border-color: #00b38a;
515
+  }
516
+
517
+  &.disabled {
518
+    cursor: not-allowed;
519
+  }
520
+}
436
 </style>
521
 </style>
437
 
522