mdm-client 1.0.2 → 1.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/App.vue +72 -61
- package/src/assets/image/common/layout-active16.png +0 -0
- package/src/assets/image/common/layout-active25.png +0 -0
- package/src/assets/image/common/layout-active3.png +0 -0
- package/src/assets/image/common/layout-active9.png +0 -0
- package/src/assets/image/common/layout16.png +0 -0
- package/src/assets/image/common/layout25.png +0 -0
- package/src/assets/image/common/layout3.png +0 -0
- package/src/assets/image/common/layout9.png +0 -0
- package/src/assets/image/common/mirror.png +0 -0
- package/src/assets/image/common/platform_app_icon.png +0 -0
- package/src/assets/image/common/platform_mini_icon.png +0 -0
- package/src/assets/image/common/platform_pc_icon.png +0 -0
- package/src/assets/image/common/platform_volte_icon.png +0 -0
- package/src/assets/image/common/rotate_icon1.png +0 -0
- package/src/assets/image/common/rotate_icon2.png +0 -0
- package/src/assets/image/common/rotate_icon3.png +0 -0
- package/src/assets/image/common/rotate_icon4.png +0 -0
- package/src/assets/style/base.scss +5 -0
- package/src/components/LiveMulti/LiveMulti.vue +26 -15
- package/src/components/LiveMultipleMeeting/LiveMultipleMeeting.vue +1443 -228
- package/src/components/LiveMultipleMeeting/style/index.scss +145 -14
- package/src/components/LivePoint/LivePoint.vue +49 -211
- package/src/components/LivePointMeeting/LivePointMeeting.vue +159 -10
- package/src/components/LivePointMeeting/style/index.scss +35 -0
- package/src/components/MeetingReadyDialog/MeetingReadyDialog.vue +96 -14
- package/src/components/other/addressBook.vue +274 -37
- package/src/components/other/appointDialog.vue +1 -1
- package/src/components/other/customGroupDialog.vue +2 -1
- package/src/components/other/customLayout.vue +368 -202
- package/src/components/other/editGroupDialog.vue +2 -0
- package/src/components/other/layoutSwitch.vue +253 -37
- package/src/components/other/leadershipFocus.vue +422 -0
- package/src/components/other/leaveOptionDialog.vue +1 -1
- package/src/components/other/memberManage.vue +61 -4
- package/src/components/other/moreOptionDialog.vue +17 -1
- package/src/components/other/selectDialog.vue +1 -1
- package/src/components/other/selectSpecialDialog.vue +1 -1
- package/src/main.js +4 -4
- package/src/utils/api.js +28 -0
- package/src/utils/livekit/live-client-esm.js +1 -1
- package/src/utils/livekit/live-client-esm-old.js +0 -1
|
@@ -47,6 +47,31 @@
|
|
|
47
47
|
</template>
|
|
48
48
|
</vue-virtual-tree>
|
|
49
49
|
|
|
50
|
+
<!-- 会议终端树 -->
|
|
51
|
+
<vue-virtual-tree
|
|
52
|
+
v-show="activeTab === '会议终端'"
|
|
53
|
+
ref="terminalTreeRef"
|
|
54
|
+
:data="terminalTreeData"
|
|
55
|
+
:props="{ children: 'children', label: 'label' }"
|
|
56
|
+
node-key="id"
|
|
57
|
+
show-checkbox
|
|
58
|
+
:height="dynamicTreeHeight"
|
|
59
|
+
:item-height="36"
|
|
60
|
+
@check="handleNodeCheck"
|
|
61
|
+
:filter-node-method="filterNode"
|
|
62
|
+
>
|
|
63
|
+
<template #default="{ node, data }">
|
|
64
|
+
<span class="custom-tree-node">
|
|
65
|
+
<span class="custom-tree-node-label" :title="node.label" v-if="data.isDept">{{
|
|
66
|
+
node.label
|
|
67
|
+
}}</span>
|
|
68
|
+
<span class="custom-tree-node-user" v-else>
|
|
69
|
+
<span :class="['custom-tree-node-icon']"></span>
|
|
70
|
+
<span class="custom-tree-node-label" :title="node.label">{{ node.label }}</span>
|
|
71
|
+
</span>
|
|
72
|
+
</span>
|
|
73
|
+
</template>
|
|
74
|
+
</vue-virtual-tree>
|
|
50
75
|
<!-- 应用树 -->
|
|
51
76
|
<vue-virtual-tree
|
|
52
77
|
v-show="activeTab === '人员'"
|
|
@@ -73,6 +98,31 @@
|
|
|
73
98
|
</template>
|
|
74
99
|
</vue-virtual-tree>
|
|
75
100
|
|
|
101
|
+
<!-- volte树 -->
|
|
102
|
+
<vue-virtual-tree
|
|
103
|
+
v-show="activeTab === 'volte'"
|
|
104
|
+
ref="volteTreeRef"
|
|
105
|
+
:data="volteTreeData"
|
|
106
|
+
:props="{ children: 'children', label: 'label' }"
|
|
107
|
+
node-key="id"
|
|
108
|
+
show-checkbox
|
|
109
|
+
:height="dynamicTreeHeight"
|
|
110
|
+
:item-height="36"
|
|
111
|
+
@check="handleNodeCheck"
|
|
112
|
+
:filter-node-method="filterNode"
|
|
113
|
+
>
|
|
114
|
+
<template #default="{ node, data }">
|
|
115
|
+
<span class="custom-tree-node">
|
|
116
|
+
<span class="custom-tree-node-label" :title="node.label" v-if="data.isDept">{{
|
|
117
|
+
node.label
|
|
118
|
+
}}</span>
|
|
119
|
+
<span class="custom-tree-node-user" v-else>
|
|
120
|
+
<span :class="['custom-tree-node-icon']"></span>
|
|
121
|
+
<span class="custom-tree-node-label" :title="node.label">{{ node.label }}</span>
|
|
122
|
+
</span>
|
|
123
|
+
</span>
|
|
124
|
+
</template>
|
|
125
|
+
</vue-virtual-tree>
|
|
76
126
|
<!-- 常用分组树 -->
|
|
77
127
|
<vue-virtual-tree
|
|
78
128
|
v-show="activeTab === '常用分组'"
|
|
@@ -165,7 +215,18 @@
|
|
|
165
215
|
<div class="checkutl">
|
|
166
216
|
<div v-for="item of tempInviteList" :key="item.id" class="userFlex">
|
|
167
217
|
<div class="label">
|
|
168
|
-
<span :class="['custom-item-icon', getInviteItemIconClass(item)]"></span>
|
|
218
|
+
<span :class="['custom-item-icon', getInviteItemIconClass(item)]"></span>
|
|
219
|
+
<span>{{ item.label }}</span>
|
|
220
|
+
<!-- 会议终端:小输入框编辑会议ID,Enter/失焦提交 -->
|
|
221
|
+
<el-input
|
|
222
|
+
v-if="item.source === '会议终端' && item.callMethod == 1"
|
|
223
|
+
v-model="item._callMeetingID"
|
|
224
|
+
class="terminal-id-input"
|
|
225
|
+
placeholder="请输入会议ID"
|
|
226
|
+
@keyup.enter="confirmTerminalMeetingId(item)"
|
|
227
|
+
@blur="confirmTerminalMeetingId(item)"
|
|
228
|
+
/>
|
|
229
|
+
<span :class="getChosenItemPlatformClass(item)"></span>
|
|
169
230
|
</div>
|
|
170
231
|
<div class="close" @click="removeInviteItem(item)"></div>
|
|
171
232
|
</div>
|
|
@@ -207,7 +268,7 @@
|
|
|
207
268
|
|
|
208
269
|
<script>
|
|
209
270
|
import { debounce } from "lodash-es";
|
|
210
|
-
import { mittBus, ShowMessage, deleteCommonGroupAndUser, getAddressOrgTree, getAddressAppTree, getCommonOrgTree, queryEquipmentAddressBook, queryMonitorAddressBook } from "../../utils/index";
|
|
271
|
+
import { mittBus, ShowMessage, deleteCommonGroupAndUser, getAddressOrgTree, getAddressAppTree, getCommonOrgTree, queryEquipmentAddressBook, queryMonitorAddressBook, getVolteAddressBook, getMeetingRoomAddressBook, updateConfTerminal } from "../../utils/index";
|
|
211
272
|
import VueVirtualTree from "@fit2cloud-ui/vue-virtual-tree";
|
|
212
273
|
import CustomGroupDialog from "./customGroupDialog.vue";
|
|
213
274
|
import EditGroupDialog from "./editGroupDialog.vue";
|
|
@@ -236,6 +297,12 @@ export default {
|
|
|
236
297
|
type: String,
|
|
237
298
|
default: "",
|
|
238
299
|
},
|
|
300
|
+
tabList: {
|
|
301
|
+
type: Array,
|
|
302
|
+
default: () => {
|
|
303
|
+
return ["组织架构", "人员", "会议终端", "volte", "设备", "监控", "常用分组"];
|
|
304
|
+
},
|
|
305
|
+
}
|
|
239
306
|
},
|
|
240
307
|
data() {
|
|
241
308
|
return {
|
|
@@ -243,14 +310,15 @@ export default {
|
|
|
243
310
|
|
|
244
311
|
// 树数据
|
|
245
312
|
treeData: [],
|
|
313
|
+
terminalTreeData: [],
|
|
246
314
|
appTreeData: [],
|
|
315
|
+
volteTreeData: [],
|
|
247
316
|
groupTreeData: [],
|
|
248
317
|
equipmentTreeData: [],
|
|
249
318
|
monitorTreeData: [],
|
|
250
319
|
|
|
251
320
|
// 标签页相关
|
|
252
321
|
activeTab: "组织架构",
|
|
253
|
-
tabList: ["组织架构", "人员", "设备", "监控", "常用分组"],
|
|
254
322
|
|
|
255
323
|
// 搜索相关
|
|
256
324
|
filterText: "",
|
|
@@ -316,17 +384,17 @@ export default {
|
|
|
316
384
|
|
|
317
385
|
// 监听对话框显示状态
|
|
318
386
|
isaddressShow: {
|
|
319
|
-
|
|
387
|
+
handler(newVal) {
|
|
320
388
|
if (newVal) {
|
|
321
389
|
// 初始化选中状态
|
|
322
390
|
this.isSyncing = true;
|
|
323
391
|
this.chosenList = [...this.tempInviteList];
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
392
|
+
this.$nextTick(() => {
|
|
393
|
+
this.syncTreeSelectionFromChosenList();
|
|
394
|
+
// 更新树高度
|
|
395
|
+
this.updateTreeHeight();
|
|
396
|
+
this.isSyncing = false;
|
|
397
|
+
});
|
|
330
398
|
}
|
|
331
399
|
}
|
|
332
400
|
}
|
|
@@ -341,23 +409,28 @@ export default {
|
|
|
341
409
|
this.$refs.orgTreeRef.filter(val);
|
|
342
410
|
} else if (this.activeTab === "人员" && this.$refs.appTreeRef) {
|
|
343
411
|
this.$refs.appTreeRef.filter(val);
|
|
412
|
+
} else if (this.activeTab === "volte" && this.$refs.volteTreeRef) {
|
|
413
|
+
this.$refs.volteTreeRef.filter(val);
|
|
344
414
|
} else if (this.activeTab === "常用分组" && this.$refs.groupTreeRef) {
|
|
345
415
|
this.$refs.groupTreeRef.filter(val);
|
|
346
416
|
} else if (this.activeTab === "设备" && this.$refs.equipmentTreeRef) {
|
|
347
417
|
this.$refs.equipmentTreeRef.filter(val);
|
|
348
418
|
} else if (this.activeTab === "监控" && this.$refs.monitorTreeRef) {
|
|
349
419
|
this.$refs.monitorTreeRef.filter(val);
|
|
350
|
-
}
|
|
420
|
+
} else if (this.activeTab === "会议终端" && this.$refs.terminalTreeRef) {
|
|
421
|
+
this.$refs.terminalTreeRef.filter(val);
|
|
422
|
+
}
|
|
351
423
|
}, 300);
|
|
352
424
|
|
|
353
425
|
// 监听mitt事件
|
|
354
426
|
mittBus.on("getaddressBookUser", (e) => {
|
|
355
427
|
this.filterText = "";
|
|
356
428
|
// 转换props.inviteList的数据格式以适配新的tree结构
|
|
357
|
-
this.tempInviteList = this.inviteList.map((item) => {
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
});
|
|
429
|
+
// this.tempInviteList = this.inviteList.map((item) => {
|
|
430
|
+
// // 如果已经是新格式,直接使用
|
|
431
|
+
// return item;
|
|
432
|
+
// });
|
|
433
|
+
this.tempInviteList = []
|
|
361
434
|
this.isaddressShow = true;
|
|
362
435
|
if (e) {
|
|
363
436
|
this.isInner = e.isInner;
|
|
@@ -397,6 +470,14 @@ export default {
|
|
|
397
470
|
this.appTreeData = res.data.data;
|
|
398
471
|
}
|
|
399
472
|
},
|
|
473
|
+
|
|
474
|
+
// 获取volte树数据
|
|
475
|
+
async getVolteTreeData() {
|
|
476
|
+
const res = await getVolteAddressBook({}, { baseUrl: this.baseUrl, token: this.token });
|
|
477
|
+
if(res.data?.code == 200) {
|
|
478
|
+
this.volteTreeData = res.data.data;
|
|
479
|
+
}
|
|
480
|
+
},
|
|
400
481
|
|
|
401
482
|
// 获取常用分组树数据
|
|
402
483
|
async getGroupTreeData() {
|
|
@@ -421,14 +502,29 @@ export default {
|
|
|
421
502
|
this.monitorTreeData = res.data.data;
|
|
422
503
|
}
|
|
423
504
|
},
|
|
424
|
-
|
|
505
|
+
// 获取会议终端树数据
|
|
506
|
+
async getTerminalTreeData() {
|
|
507
|
+
try {
|
|
508
|
+
const res = await getMeetingRoomAddressBook({}, { baseUrl: this.baseUrl, token: this.token });
|
|
509
|
+
if (res.data?.code == 200) {
|
|
510
|
+
const data = res.data?.data || [];
|
|
511
|
+
this.terminalTreeData = data.length > 0 ? data : [];
|
|
512
|
+
} else {
|
|
513
|
+
this.terminalTreeData = [];
|
|
514
|
+
}
|
|
515
|
+
} catch (e) {
|
|
516
|
+
this.terminalTreeData = [];
|
|
517
|
+
}
|
|
518
|
+
},
|
|
425
519
|
// 获取所有树数据
|
|
426
520
|
async getAllTreeData() {
|
|
427
521
|
await this.getOrgTreeData();
|
|
428
522
|
await this.getAppTreeData();
|
|
523
|
+
await this.getVolteTreeData();
|
|
429
524
|
await this.getGroupTreeData();
|
|
430
525
|
await this.getEquipmentTreeData();
|
|
431
526
|
await this.getMonitorTreeData();
|
|
527
|
+
await this.getTerminalTreeData();
|
|
432
528
|
},
|
|
433
529
|
|
|
434
530
|
// 过滤树节点的方法 - 虚拟树使用filter-node-method
|
|
@@ -456,16 +552,20 @@ export default {
|
|
|
456
552
|
// 修改判断条件,只有当isDept为false时,才是叶子节点
|
|
457
553
|
// isDept为true的节点(即使是空数组)都视为非叶子节点
|
|
458
554
|
if (!node.isDept) {
|
|
459
|
-
leafNodes.push(
|
|
460
|
-
...node,
|
|
461
|
-
source: this.activeTab, // 记录节点来源于哪个树
|
|
462
|
-
});
|
|
555
|
+
leafNodes.push(this.prepareChosenUser(node, this.activeTab));
|
|
463
556
|
}
|
|
464
557
|
});
|
|
465
558
|
|
|
466
559
|
return leafNodes;
|
|
467
560
|
},
|
|
468
|
-
|
|
561
|
+
// 构建已选用户对象:当来源为“会议终端”时,初始化 _callMeetingID,避免输入框为空
|
|
562
|
+
prepareChosenUser(raw, source) {
|
|
563
|
+
const user = { ...raw, source };
|
|
564
|
+
if (source === '会议终端') {
|
|
565
|
+
user._callMeetingID = raw?.callMeetingID ?? '';
|
|
566
|
+
}
|
|
567
|
+
return user;
|
|
568
|
+
},
|
|
469
569
|
// 更新chosenList,保留其他树的选中状态
|
|
470
570
|
updateChosenListWithLeafNodes(newLeafNodes) {
|
|
471
571
|
// 从chosenList中过滤掉当前激活树的节点
|
|
@@ -474,13 +574,39 @@ export default {
|
|
|
474
574
|
// 将当前树的新叶子节点添加进来
|
|
475
575
|
const mergedList = [...otherTreeNodes];
|
|
476
576
|
|
|
477
|
-
//
|
|
577
|
+
// 添加新节点,避免重复(基于source+id组合判断)
|
|
578
|
+
const validNewNodes = [];
|
|
478
579
|
newLeafNodes.forEach((node) => {
|
|
479
|
-
if (!mergedList.some((item) => item.id === node.id)) {
|
|
480
|
-
|
|
580
|
+
if (!mergedList.some((item) => item.id === node.id && item.source === node.source)) {
|
|
581
|
+
validNewNodes.push(node);
|
|
481
582
|
}
|
|
482
583
|
});
|
|
483
|
-
|
|
584
|
+
// 检查 volte 用户数量限制(限制volte用户总数,不限于当前标签页)
|
|
585
|
+
const currentVolteCount = mergedList.filter(user => user.source === 'volte').length;
|
|
586
|
+
const newVolteNodes = validNewNodes.filter(node => node.source === 'volte');
|
|
587
|
+
|
|
588
|
+
if (currentVolteCount + newVolteNodes.length > 10) {
|
|
589
|
+
// 超出限制,需要处理
|
|
590
|
+
if (this.activeTab === 'volte') {
|
|
591
|
+
// 如果当前在volte标签页,清空当前树的选中状态并提示
|
|
592
|
+
this.$refs.volteTreeRef && this.$refs.volteTreeRef.setCheckedKeys([]);
|
|
593
|
+
this.showMessage.message('warning', '单次VoLTE呼叫仅支持选择10人');
|
|
594
|
+
// 只保留其他树的选中状态,不添加新的volte节点
|
|
595
|
+
this.chosenList = otherTreeNodes;
|
|
596
|
+
return;
|
|
597
|
+
} else {
|
|
598
|
+
// 如果不在volte标签页,只添加非volte节点,并提示volte限制
|
|
599
|
+
const nonVolteNodes = validNewNodes.filter(node => node.source !== 'volte');
|
|
600
|
+
if (newVolteNodes.length > 0) {
|
|
601
|
+
this.showMessage.message('warning', '单次VoLTE呼叫仅支持选择10人,VoLTE用户未添加');
|
|
602
|
+
}
|
|
603
|
+
mergedList.push(...nonVolteNodes);
|
|
604
|
+
this.chosenList = mergedList;
|
|
605
|
+
return;
|
|
606
|
+
}
|
|
607
|
+
}
|
|
608
|
+
// 添加所有有效的新节点
|
|
609
|
+
mergedList.push(...validNewNodes);
|
|
484
610
|
this.chosenList = mergedList;
|
|
485
611
|
},
|
|
486
612
|
|
|
@@ -491,16 +617,20 @@ export default {
|
|
|
491
617
|
this.$refs.orgTreeRef.setCheckedKeys([]);
|
|
492
618
|
} else if (this.activeTab === "人员" && this.$refs.appTreeRef) {
|
|
493
619
|
this.$refs.appTreeRef.setCheckedKeys([]);
|
|
620
|
+
} else if (this.activeTab === "volte" && this.$refs.volteTreeRef) {
|
|
621
|
+
this.$refs.volteTreeRef.setCheckedKeys([]);
|
|
494
622
|
} else if (this.activeTab === "常用分组" && this.$refs.groupTreeRef) {
|
|
495
623
|
this.$refs.groupTreeRef.setCheckedKeys([]);
|
|
496
624
|
} else if (this.activeTab === "设备" && this.$refs.equipmentTreeRef) {
|
|
497
625
|
this.$refs.equipmentTreeRef.setCheckedKeys([]);
|
|
498
626
|
} else if (this.activeTab === "监控" && this.$refs.monitorTreeRef) {
|
|
499
627
|
this.$refs.monitorTreeRef.setCheckedKeys([]);
|
|
628
|
+
} else if (this.activeTab === "会议终端" && this.$refs.terminalTreeRef) {
|
|
629
|
+
this.$refs.terminalTreeRef.setCheckedKeys([]);
|
|
500
630
|
}
|
|
501
631
|
|
|
502
632
|
// 然后根据chosenList设置选中状态
|
|
503
|
-
const selectedIds = this.chosenList.map((user) => user.id);
|
|
633
|
+
const selectedIds = this.chosenList.filter(user => user.source === this.activeTab).map((user) => user.id);
|
|
504
634
|
|
|
505
635
|
if (this.activeTab === "组织架构" && this.$refs.orgTreeRef) {
|
|
506
636
|
selectedIds.forEach((id) => {
|
|
@@ -510,6 +640,10 @@ export default {
|
|
|
510
640
|
selectedIds.forEach((id) => {
|
|
511
641
|
this.$refs.appTreeRef.setChecked(id, true, false);
|
|
512
642
|
});
|
|
643
|
+
} else if (this.activeTab === "volte" && this.$refs.volteTreeRef) {
|
|
644
|
+
selectedIds.forEach((id) => {
|
|
645
|
+
this.$refs.volteTreeRef.setChecked(id, true, false);
|
|
646
|
+
});
|
|
513
647
|
} else if (this.activeTab === "常用分组" && this.$refs.groupTreeRef) {
|
|
514
648
|
selectedIds.forEach((id) => {
|
|
515
649
|
this.$refs.groupTreeRef.setChecked(id, true, false);
|
|
@@ -522,6 +656,10 @@ export default {
|
|
|
522
656
|
selectedIds.forEach((id) => {
|
|
523
657
|
this.$refs.monitorTreeRef.setChecked(id, true, false);
|
|
524
658
|
});
|
|
659
|
+
} else if (this.activeTab === "会议终端" && this.$refs.terminalTreeRef) {
|
|
660
|
+
selectedIds.forEach((id) => {
|
|
661
|
+
this.$refs.terminalTreeRef.setChecked(id, true, false);
|
|
662
|
+
});
|
|
525
663
|
}
|
|
526
664
|
},
|
|
527
665
|
|
|
@@ -541,17 +679,40 @@ export default {
|
|
|
541
679
|
|
|
542
680
|
// 根据邀请列表项类型获取图标类名
|
|
543
681
|
getInviteItemIconClass(item) {
|
|
544
|
-
if (item.source !== '设备' && item.source !== '监控') return 'custom-item-icon-person';
|
|
545
|
-
|
|
682
|
+
if (item.source !== '设备' && item.source !== '监控' && item.source !== 'volte') return 'custom-item-icon-person';
|
|
683
|
+
if (item.source === '设备') return 'custom-item-icon-device';
|
|
684
|
+
if (item.source === '监控') return 'custom-item-icon-monitor';
|
|
685
|
+
if (item.source === 'volte') return 'custom-item-icon-person'; // volte 使用人员图标
|
|
686
|
+
return 'custom-item-icon-person';
|
|
687
|
+
},
|
|
688
|
+
getChosenItemPlatformClass(item) {
|
|
689
|
+
if(item.source === "组织架构") {
|
|
690
|
+
return 'platform platform-mini'
|
|
691
|
+
} else if(item.source === "人员") {
|
|
692
|
+
return 'platform platform-application'
|
|
693
|
+
} else if(item.source === "常用分组") {
|
|
694
|
+
if(item.original === '组织架构') {
|
|
695
|
+
return 'platform platform-mini'
|
|
696
|
+
} else if(item.original === '人员') {
|
|
697
|
+
return 'platform platform-application'
|
|
698
|
+
} else if(item.original === 'volte') {
|
|
699
|
+
return 'platform platform-volte'
|
|
700
|
+
} else {
|
|
701
|
+
return 'platform platform-unknown'
|
|
702
|
+
}
|
|
703
|
+
} else if(item.source === "volte") {
|
|
704
|
+
return 'platform platform-volte'
|
|
705
|
+
} else {
|
|
706
|
+
return 'platform platform-unknown'
|
|
707
|
+
}
|
|
546
708
|
},
|
|
547
|
-
|
|
548
709
|
getinvitation() {
|
|
549
710
|
this.$refs.inviteNonContactDialogRef.open();
|
|
550
711
|
},
|
|
551
712
|
|
|
552
713
|
addOutterContactToChosenList(outterContact) {
|
|
553
|
-
//
|
|
554
|
-
if (this.tempInviteList.find((item) => item.
|
|
714
|
+
// 改进的存在性检查:结合source和手机号进行查找
|
|
715
|
+
if (this.tempInviteList.find((item) => item.phone === outterContact.phone && item.source === outterContact.source)) {
|
|
555
716
|
this.showMessage.message("error", "该人员已存在");
|
|
556
717
|
return;
|
|
557
718
|
}
|
|
@@ -571,11 +732,11 @@ export default {
|
|
|
571
732
|
this.showMessage.message("error", "请先选择要添加的人员");
|
|
572
733
|
return;
|
|
573
734
|
}
|
|
574
|
-
if(this.tempInviteList.some((item) => item.source === '设备' || item.source === '监控')) {
|
|
735
|
+
if(this.tempInviteList.some((item) => item.source === '设备' || item.source === '监控' || item.source === '会议终端')) {
|
|
575
736
|
this.showMessage.message("info", "设备和监控人员暂不支持添加分组, 将不会被添加到常用分组");
|
|
576
737
|
}
|
|
577
738
|
// 确保数据格式正确
|
|
578
|
-
const formattedList = this.tempInviteList.filter((item) => item.source !== '设备' && item.source !== '监控').map((item) => {
|
|
739
|
+
const formattedList = this.tempInviteList.filter((item) => item.source !== '设备' && item.source !== '监控' && item.source !== '常用分组' && item.source !== '会议终端').map((item) => {
|
|
579
740
|
return {
|
|
580
741
|
id: item.id,
|
|
581
742
|
label: item.label,
|
|
@@ -612,13 +773,13 @@ export default {
|
|
|
612
773
|
},
|
|
613
774
|
|
|
614
775
|
removeInviteItem(item) {
|
|
615
|
-
const index = this.tempInviteList.findIndex((user) => user.id === item.id);
|
|
776
|
+
const index = this.tempInviteList.findIndex((user) => user.id === item.id && user.source === item.source);
|
|
616
777
|
if (index !== -1) {
|
|
617
778
|
this.isSyncing = true;
|
|
618
779
|
this.tempInviteList.splice(index, 1);
|
|
619
780
|
|
|
620
781
|
// 同步到chosenList
|
|
621
|
-
const chosenIndex = this.chosenList.findIndex((user) => user.id === item.id);
|
|
782
|
+
const chosenIndex = this.chosenList.findIndex((user) => user.id === item.id && user.source === item.source);
|
|
622
783
|
if (chosenIndex !== -1) {
|
|
623
784
|
this.chosenList.splice(chosenIndex, 1);
|
|
624
785
|
}
|
|
@@ -639,12 +800,36 @@ export default {
|
|
|
639
800
|
if (this.$refs.monitorTreeRef) {
|
|
640
801
|
this.$refs.monitorTreeRef.setChecked(item.id, false);
|
|
641
802
|
}
|
|
803
|
+
if( this.$refs.volteTreeRef) {
|
|
804
|
+
this.$refs.volteTreeRef.setChecked(item.id, false);
|
|
805
|
+
}
|
|
806
|
+
if (this.$refs.terminalTreeRef) {
|
|
807
|
+
this.$refs.terminalTreeRef.setChecked(item.id, false);
|
|
808
|
+
}
|
|
642
809
|
this.$nextTick(() => {
|
|
643
810
|
this.isSyncing = false;
|
|
644
811
|
});
|
|
645
812
|
}
|
|
646
813
|
},
|
|
647
814
|
|
|
815
|
+
// 更新会议终端会议ID(Enter/失焦)
|
|
816
|
+
async confirmTerminalMeetingId(user) {
|
|
817
|
+
const newId = (user._callMeetingID || '').toString().trim()
|
|
818
|
+
const oldId = (user.callMeetingID || '').toString().trim()
|
|
819
|
+
if (newId === oldId) return
|
|
820
|
+
try {
|
|
821
|
+
const res = await updateConfTerminal({ id: user.id, callMeetingID: newId }, { baseUrl: props.baseUrl, token: props.token })
|
|
822
|
+
if (res.data?.code == 200) {
|
|
823
|
+
user.callMeetingID = newId
|
|
824
|
+
this.showMessage.message('success', '会议ID已更新')
|
|
825
|
+
} else {
|
|
826
|
+
this.showMessage.message('error', res.data?.msg || '更新会议ID失败')
|
|
827
|
+
}
|
|
828
|
+
} catch (e) {
|
|
829
|
+
this.showMessage.message('error', e.message || '网络异常,更新会议ID失败')
|
|
830
|
+
}
|
|
831
|
+
},
|
|
832
|
+
|
|
648
833
|
cancel() {
|
|
649
834
|
this.tempInviteList = [];
|
|
650
835
|
this.isaddressShow = false;
|
|
@@ -652,7 +837,7 @@ export default {
|
|
|
652
837
|
|
|
653
838
|
confirm() {
|
|
654
839
|
// 转换数据格式以保持向后兼容
|
|
655
|
-
const convertedList = this.tempInviteList.filter((item) => item.source !== '设备' && item.source !== '监控').map((item) => {
|
|
840
|
+
const convertedList = this.tempInviteList.filter((item) => item.source !== '设备' && item.source !== '监控' && item.source !== '会议终端').map((item) => {
|
|
656
841
|
return {
|
|
657
842
|
...item,
|
|
658
843
|
};
|
|
@@ -662,11 +847,17 @@ export default {
|
|
|
662
847
|
...item,
|
|
663
848
|
};
|
|
664
849
|
});
|
|
665
|
-
|
|
850
|
+
const convertedTerminalList = this.tempInviteList.filter(item => item.source === '会议终端')
|
|
851
|
+
.map(item => {
|
|
852
|
+
return {
|
|
853
|
+
...item,
|
|
854
|
+
}
|
|
855
|
+
})
|
|
666
856
|
this.$emit("inviteListUpdate", convertedList);
|
|
667
857
|
if (this.isInner) {
|
|
668
858
|
this.$emit("appendInvitePeople", convertedList);
|
|
669
859
|
this.$emit("appendInviteDevice", convertedDeviceList);
|
|
860
|
+
this.$emit("appendInviteTerminal", convertedTerminalList);
|
|
670
861
|
}
|
|
671
862
|
this.isaddressShow = false;
|
|
672
863
|
},
|
|
@@ -1036,6 +1227,30 @@ export default {
|
|
|
1036
1227
|
font-size: 16px;
|
|
1037
1228
|
color: var(--theme-font-color);
|
|
1038
1229
|
|
|
1230
|
+
:deep(.el-input) {
|
|
1231
|
+
margin-left: 8px;
|
|
1232
|
+
width: 100px;
|
|
1233
|
+
line-height: 28px;
|
|
1234
|
+
height: 28px;
|
|
1235
|
+
border: none;
|
|
1236
|
+
.el-input__inner {
|
|
1237
|
+
box-shadow: none;
|
|
1238
|
+
background-color: transparent;
|
|
1239
|
+
border-radius: 0px;
|
|
1240
|
+
border: none;
|
|
1241
|
+
border-bottom: 1px solid var(--input-border-color);
|
|
1242
|
+
padding: 0 6px;
|
|
1243
|
+
color: var(--theme-font-color);
|
|
1244
|
+
font-size: 14px;
|
|
1245
|
+
font-weight: 400;
|
|
1246
|
+
line-height: 28px;
|
|
1247
|
+
&::placeholder {
|
|
1248
|
+
color: var(--input-placeholder-color);
|
|
1249
|
+
font-family: var(--main-font);
|
|
1250
|
+
}
|
|
1251
|
+
}
|
|
1252
|
+
}
|
|
1253
|
+
|
|
1039
1254
|
.custom-item-icon {
|
|
1040
1255
|
width: 20px;
|
|
1041
1256
|
height: 20px;
|
|
@@ -1055,6 +1270,18 @@ export default {
|
|
|
1055
1270
|
100%;
|
|
1056
1271
|
}
|
|
1057
1272
|
}
|
|
1273
|
+
.platform {
|
|
1274
|
+
display: none;
|
|
1275
|
+
width: 16px;
|
|
1276
|
+
height: 16px;
|
|
1277
|
+
margin-left: 5px;
|
|
1278
|
+
&-mini {
|
|
1279
|
+
background: url("../../assets/image/common/platform_mini_icon.png") no-repeat center / 100% 100%;
|
|
1280
|
+
}
|
|
1281
|
+
&-volte {
|
|
1282
|
+
background: url("../../assets/image/common/platform_volte_icon.png") no-repeat center / 100% 100%;
|
|
1283
|
+
}
|
|
1284
|
+
}
|
|
1058
1285
|
}
|
|
1059
1286
|
|
|
1060
1287
|
.close {
|
|
@@ -1063,6 +1290,16 @@ export default {
|
|
|
1063
1290
|
height: 16px;
|
|
1064
1291
|
background: var(--close-icon) no-repeat center / 100% 100%;
|
|
1065
1292
|
}
|
|
1293
|
+
|
|
1294
|
+
&:hover {
|
|
1295
|
+
.platform {
|
|
1296
|
+
display: inline-block;
|
|
1297
|
+
&-unknown,
|
|
1298
|
+
&-application {
|
|
1299
|
+
display: none;
|
|
1300
|
+
}
|
|
1301
|
+
}
|
|
1302
|
+
}
|
|
1066
1303
|
}
|
|
1067
1304
|
}
|
|
1068
1305
|
}
|