bl-common-vue3 3.8.53 → 3.8.54

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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bl-common-vue3",
3
- "version": "3.8.53",
3
+ "version": "3.8.54",
4
4
  "main": "index.js",
5
5
  "module": "index.js",
6
6
  "description": "bailing vue3 common components lib",
@@ -3,140 +3,118 @@
3
3
  <a-card size="small">
4
4
  <template #title v-if="titles">
5
5
  <section class="file-title">
6
- <span class="mr-5">{{ t('AttachmentInfo.index.559728-0') }}</span>
7
- <template v-if="!showOption">
8
- (
9
- <a-breadcrumb>
10
- <a-breadcrumb-item
11
- class="crumb-item"
12
- v-for="(crumb, index) of crumbList"
13
- :key="crumb.key"
14
- @click="handleCrumbItemClick(crumb, index)"
15
- :class="crumb.key != currentCrumb.key ? 'active' : ''"
16
- >
17
- {{ crumb.title }}
18
- </a-breadcrumb-item>
19
- </a-breadcrumb>
20
- )
21
- </template>
6
+ <span class="mr-5">{{title || t('AttachmentInfo.index.559728-0')}}</span>
22
7
  </section>
23
8
  </template>
24
9
  <template #extra v-if="showOption">
25
- <a-dropdown :trigger="['click']" :disabled="disabled">
26
- <a-button>
27
- <template #icon>
28
- <PlusOutlined />
29
- </template>
30
- {{ t('AttachmentInfo.index.559728-1') }}
31
- </a-button>
32
- <template #overlay>
33
- <a-menu>
34
- <a-menu-item
35
- v-if="addfolder"
36
- key="new_folder"
37
- @click="addAttachment(1)"
38
- >
39
- <template #icon>
40
- <FolderAddOutlined></FolderAddOutlined>
41
- </template>
42
- {{ t('AttachmentInfo.index.559728-2') }}
43
- </a-menu-item>
44
- <a-menu-item
45
- v-if="batchupload"
46
- key="new_file"
47
- @click="addAttachment(3)"
48
- >
49
- <template #icon><UploadOutlined></UploadOutlined></template>
50
- <a-upload
51
- name="file"
52
- v-model:fileList="fileList"
53
- :action="$utils.fileAction"
54
- :headers="isOrg?{ 'org-token': $store.getters.token }:{'user-token': $store.getters.userToken}"
55
- multiple
56
- :showUploadList="false"
57
- accept=".doc,.docx,.pdf,.jpg,.jpeg,.png,.mp4,.mp3,.mov,.mpeg"
58
- :data="{ dir: 'org_contract_add_attachments' }"
59
- @change="handleChange"
60
- >
61
- {{ t('AttachmentInfo.index.559728-3') }}
62
- </a-upload>
63
- </a-menu-item>
64
- <a-menu-item
65
- v-if="mobileAnnexUpload"
66
- key="BlMobileAnnexUpload"
67
- >
68
- <BlMobileAnnexUpload
69
- :title="mobileAnnexUploadConfigInfo.title"
70
- :h5Domain="mobileAnnexUploadConfigInfo.h5Domain"
71
- :uploadConfig="mobileAnnexUploadConfigInfo.uploadConfig"
72
- :addRequest="mobileAnnexUploadConfigInfo.addRequest"
73
- @request="handleRequest"
74
- @handleCommit="handleAddSuccess">
75
- </BlMobileAnnexUpload>
76
- </a-menu-item>
77
- </a-menu>
78
- </template>
79
- </a-dropdown>
10
+ <AddAction
11
+ :disabled="disabled"
12
+ :addfolder="addfolder"
13
+ :batchupload="batchupload"
14
+ :attachParams="attachParams"
15
+ :serviceFrom="serviceFrom"
16
+ :parentId="0"
17
+ :annexAdd="annexAdd"
18
+ :typeFrom="typeFrom"
19
+ :isOrg="isOrg"
20
+ :id="id"
21
+ :staticPathes="staticPathes"
22
+ :fileAlias="fileAlias"
23
+ @getDataList="getDataList"
24
+ :mobileAnnexUpload="mobileAnnexUpload"
25
+ :mobileAnnexUploadConfig="mobileAnnexUploadConfig"
26
+ @handleRequest="handleRequest"
27
+ />
80
28
  </template>
81
29
  <a-table
82
- :dataSource="dataList"
83
- :columns="columns"
84
- rowKey="id"
85
- :loading="loading"
86
- :pagination="pagination"
87
- @change="handleTableChange"
88
- size="small"
89
- bordered
30
+ :defaultExpandAllRows="true"
31
+ :key="tableKey"
32
+ :dataSource="dataList"
33
+ :columns="columns"
34
+ rowKey="id"
35
+ :loading="loading"
36
+ :pagination="pagination"
37
+ @change="handleTableChange"
38
+ size="small"
39
+ bordered
90
40
  >
91
41
  <template #bodyCell="{ text, record, column }">
92
42
  <template v-if="column.key === 'name'">
93
- <div class="file-name" @click="handleNameClick(record)">
94
- <FolderOutlined v-if="record.annex_type == 1" />
95
- <FileOutlined v-if="record.annex_type == 2" />
43
+ <div class="file-name">
44
+ <FolderOutlined v-if="record.annex_type == 1"/>
45
+ <FileOutlined v-if="record.annex_type == 2"/>
96
46
  <span class="name">{{ text }}</span>
97
47
  </div>
98
48
  </template>
99
49
 
100
50
  <template v-if="column.key === 'action'">
101
- <a-tooltip>
51
+ <a-tooltip v-if="record.annex_type == 2">
102
52
  <template #title>{{ t('AttachmentInfo.index.559728-5') }}</template>
103
- <a-button type="link" @click="previewClick(record)">
53
+ <a-button
54
+ type="link"
55
+ :disabled="record.online_preview && !record.online_preview.previewUrl &&
56
+ record.online_preview.documentType !== 'pic'
57
+ "
58
+ @click="previewClick(record)"
59
+ >
104
60
  <template #icon>
105
- <EyeOutlined v-if="record.annex_type == 2" />
61
+ <EyeOutlined/>
106
62
  </template>
107
63
  </a-button>
108
64
  </a-tooltip>
109
- <a-space v-if="record.operate && record.operate.length">
65
+ <a-space v-if="record.operate && record.operate.length || (showOption && record.annex_type == 1)">
66
+ <AddAction
67
+ v-if="showOption && record.annex_type == 1"
68
+ :disabled="disabled"
69
+ :addfolder="addfolder"
70
+ :batchupload="batchupload"
71
+ :attachParams="{
72
+ ...attachParams,
73
+ parent_id: record.id,
74
+ }"
75
+ :parentId="record.id"
76
+ :serviceFrom="serviceFrom"
77
+ :annexAdd="annexAdd"
78
+ :typeFrom="typeFrom"
79
+ :isOrg="isOrg"
80
+ :id="id"
81
+ :fileAlias="fileAlias"
82
+ :staticPathes="staticPathes"
83
+ @getDataList="getDataList"
84
+ :mobileAnnexUpload="mobileAnnexUpload"
85
+ :mobileAnnexUploadConfig="mobileAnnexUploadConfig"
86
+ @handleRequest="handleRequest"
87
+ />
110
88
  <a-tooltip v-if="record.operate.includes('Topping')">
111
89
  <template #title>{{ t('AttachmentInfo.index.559728-6') }}</template>
112
90
  <a-button
113
91
  type="link"
114
- @click="fileToTop(record)"
92
+ @click="fileToTop(record.id)"
115
93
  :disabled="disabled"
116
94
  >
117
95
  <template #icon>
118
- <ToTopOutlined />
96
+ <ToTopOutlined/>
119
97
  </template>
120
98
  </a-button>
121
99
  </a-tooltip>
122
100
  <a-tooltip v-if="record.operate.includes('Download')">
123
101
  <template #title>{{ t('AttachmentInfo.index.559728-7') }}</template>
124
- <a-button type="link" @click="downloadFile(record.file_path, record.name)">
102
+ <a-button type="link" @click="downloadFile(record.file_path)">
125
103
  <template #icon>
126
- <DownloadOutlined />
104
+ <DownloadOutlined/>
127
105
  </template>
128
106
  </a-button>
129
107
  </a-tooltip>
130
108
  <a-tooltip v-if="showOption && record.operate.includes('Delete')">
131
- <template #title>{{t('common.button.delete')}}</template>
109
+ <template #title>{{ t('common.button.delete') }}</template>
132
110
  <a-button
133
111
  type="link"
134
112
  danger
135
- @click="deleteFile(text)"
113
+ @click="deleteFile(record.id)"
136
114
  :disabled="disabled"
137
115
  >
138
116
  <template #icon>
139
- <DeleteOutlined />
117
+ <DeleteOutlined/>
140
118
  </template>
141
119
  </a-button>
142
120
  </a-tooltip>
@@ -146,33 +124,12 @@
146
124
  </template>
147
125
  </a-table>
148
126
  </a-card>
149
- <add-attachments
150
- :params="addParams"
151
- :visible="addVisible"
152
- :fileAlias="fileAlias"
153
- :id="id"
154
- @cancel="addVisible = false"
155
- @success="handleAddSuccess"
156
- @request="handleRequest"
157
- />
158
-
159
- <MultipleAddAttachments
160
- :visible="multiAddVisible"
161
- :file-list="fileList"
162
- :fileAlias="fileAlias"
163
- :id="id"
164
- @handleCancel="handleCancel"
165
- :params="addParams"
166
- @handleCommit="handleAddSuccess"
167
- @request="handleRequest"
168
- />
169
127
  </section>
170
128
  </template>
171
129
 
172
130
  <script>
173
- import { defineComponent, ref, watch, computed, createVNode } from "vue";
131
+ import { defineComponent, ref, watch, computed, createVNode, nextTick } from "vue";
174
132
  import {
175
- PlusOutlined,
176
133
  ToTopOutlined,
177
134
  FolderOutlined,
178
135
  FileOutlined,
@@ -180,17 +137,12 @@ import {
180
137
  DeleteOutlined,
181
138
  EyeOutlined,
182
139
  ExclamationCircleOutlined,
183
- FolderAddOutlined,
184
- UploadOutlined
185
140
  } from "@ant-design/icons-vue";
186
- import addAttachments from "./modules/AddAttachments.vue";
187
141
  import utils from "../../common/utils/util";
188
142
  import {
189
143
  message,
190
144
  Modal,
191
145
  Card,
192
- Breadcrumb,
193
- BreadcrumbItem,
194
146
  Dropdown,
195
147
  Menu,
196
148
  MenuItem,
@@ -200,36 +152,23 @@ import {
200
152
  Button,
201
153
  Space,
202
154
  } from "ant-design-vue";
203
- import MultipleAddAttachments from "./modules/MultipleAddAttachments.vue";
204
155
  import {t, loadLanguageAsync} from "../../locale";
205
- import BlMobileAnnexUpload from "../BlMobileAnnexUpload/index.vue";
156
+ import AddAction from "./modules/AddAction.vue";
206
157
  export default defineComponent({
207
158
  name: "ContractAttachmentInfo",
208
159
  components: {
209
- PlusOutlined,
210
160
  ToTopOutlined,
211
161
  FolderOutlined,
212
162
  FileOutlined,
213
- addAttachments,
214
163
  DownloadOutlined,
215
164
  DeleteOutlined,
216
165
  EyeOutlined,
217
- MultipleAddAttachments,
218
-
166
+ AddAction,
219
167
  "a-card": Card,
220
- "a-breadcrumb": Breadcrumb,
221
- "a-breadcrumb-item": BreadcrumbItem,
222
- "a-dropdown": Dropdown,
223
- "a-menu": Menu,
224
- "a-menu-item": MenuItem,
225
- "a-upload": Upload,
226
168
  "a-table": Table,
227
169
  "a-tooltip": Tooltip,
228
170
  "a-button": Button,
229
171
  "a-space": Space,
230
- FolderAddOutlined,
231
- UploadOutlined,
232
- BlMobileAnnexUpload
233
172
  },
234
173
  props: {
235
174
  active: {
@@ -301,6 +240,10 @@ export default defineComponent({
301
240
  type: Boolean,
302
241
  default: true,
303
242
  },
243
+ title: {
244
+ type: String,
245
+ default: '',
246
+ },
304
247
  titles: {
305
248
  type: Boolean,
306
249
  default: true,
@@ -342,45 +285,29 @@ export default defineComponent({
342
285
  isOrg:{
343
286
  type: Boolean,
344
287
  default: true,
345
- }
288
+ },
289
+ typeFrom: {
290
+ type: String,
291
+ default: "",
292
+ },
293
+ staticPathes: {
294
+ type: String,
295
+ default: "",
296
+ },
346
297
  },
347
298
  setup(props, context) {
348
299
  const homeCrumb = { key: "home", parentId: 0, title: t('AttachmentInfo.index.559728-8') };
349
300
  const crumbList = ref([homeCrumb]);
350
301
  const currentCrumb = ref(homeCrumb);
351
- // 点击面包屑
352
- const handleCrumbItemClick = (crumb, index) => {
353
- if (currentCrumb.value.key == crumb.key) {
354
- return;
355
- }
356
- currentCrumb.value = crumb;
357
- crumbList.value.splice(index + 1, crumbList.value.length - index - 1);
358
- getDataList();
359
- };
360
-
361
- // 点击进入文件夹
362
- const handleNameClick = (record) => {
363
- if (record.annex_type == 1) {
364
- let item = {
365
- key: "sub_" + record.id,
366
- parentId: record.id,
367
- title: record.name,
368
- };
369
- crumbList.value.push(item);
370
- currentCrumb.value = item;
371
- getDataList();
372
- }
373
- };
302
+ let attachParams = {};
374
303
 
375
304
  // 添加文件、文件夹
376
305
  const addVisible = ref(false);
377
306
  //批量上传
378
307
  const multiAddVisible = ref(false);
379
- const fileList = ref([]);
380
308
 
381
309
  const successIds = ref([]);
382
310
  const handleAddSuccess = ({ data }) => {
383
- fileList.value = [];
384
311
  multiAddVisible.value = false;
385
312
  addVisible.value = false;
386
313
  page.value = 1;
@@ -402,16 +329,6 @@ export default defineComponent({
402
329
  }
403
330
  };
404
331
 
405
- const handleChange = (info) => {
406
- fileList.value = info.fileList;
407
- multiAddVisible.value = true;
408
- console.log(fileList.value);
409
- };
410
- const handleCancel = () => {
411
- fileList.value = [];
412
- multiAddVisible.value = false;
413
- };
414
-
415
332
  // 附件列表
416
333
  const page = ref(1);
417
334
  const limit = ref(20);
@@ -426,28 +343,24 @@ export default defineComponent({
426
343
  const handleTableChange = (pager) => {
427
344
  page.value = pager.current;
428
345
  limit.value = pager.pageSize;
346
+ getDataList();
429
347
  };
430
348
  watch([page, limit], () => {
431
349
  getDataList();
432
350
  });
433
351
  const addParams = ref({});
434
352
  const dataList = ref([]);
435
-
436
353
  const filters = ref([]);
437
354
 
438
355
  // const fis
439
- const getDataList = () => {
356
+ const getDataList = (init) => {
357
+ if (init) {
358
+ page.value = 1;
359
+ }
440
360
  let params = {
441
361
  page: page.value,
442
362
  pageSize: limit.value,
443
363
  };
444
- if (!filters.value.find((item) => item.field == "parent_id")) {
445
- filters.value.push({
446
- field: "parent_id",
447
- type: "equal",
448
- value: currentCrumb.value.parentId,
449
- });
450
- }
451
364
 
452
365
  if (props.id) {
453
366
  if (!filters.value.find((item) => item.field == "business_id")) {
@@ -475,9 +388,6 @@ export default defineComponent({
475
388
  });
476
389
  }
477
390
  filters.value.forEach((item) => {
478
- if (item.field == "parent_id") {
479
- item.value = currentCrumb.value.parentId;
480
- }
481
391
  if (item.field == "id") {
482
392
  item.value = successIds.value;
483
393
  }
@@ -499,12 +409,16 @@ export default defineComponent({
499
409
  },
500
410
  },
501
411
  success: (res) => {
412
+ dataList.value = []
502
413
  dataList.value = res.list;
503
414
  let ids = res.list.map((item) => item.id);
504
415
  if (!successIds.value.length) {
505
416
  successIds.value = ids;
506
417
  }
507
418
  total.value = res.total;
419
+ nextTick(() => {
420
+ getPicList(dataList.value)
421
+ })
508
422
  context.emit(
509
423
  "annexNumChange",
510
424
  dataList.value.length,
@@ -513,8 +427,16 @@ export default defineComponent({
513
427
  });
514
428
  };
515
429
 
430
+ const getPicList = (list) => {
431
+ list.forEach((v) => {
432
+ if (v?.children?.length) {
433
+ getPicList(v.children);
434
+ }
435
+ });
436
+ };
437
+
516
438
  // 文件置顶
517
- const fileToTop = (record) => {
439
+ const fileToTop = (id) => {
518
440
  const params = {
519
441
  needMsg: true,
520
442
  };
@@ -526,7 +448,7 @@ export default defineComponent({
526
448
  params: {
527
449
  method: "put",
528
450
  server: `${props.serviceFrom}`,
529
- url: `${props.annexTopFrom}/${record.id}`,
451
+ url: `${props.annexTopFrom}/${id}`,
530
452
  extra: params,
531
453
  },
532
454
  success: (res) => {
@@ -599,8 +521,6 @@ export default defineComponent({
599
521
  const randomStr = utils.getRandomUid(18);
600
522
  let loaded = false;
601
523
 
602
- let attachParams = {};
603
-
604
524
  // 在线预览
605
525
  const imgVisible = ref(false);
606
526
  const imgList = ref([]);
@@ -648,6 +568,9 @@ export default defineComponent({
648
568
  if (!attachParams.object_id) {
649
569
  attachParams.object_id = randomStr;
650
570
  }
571
+ if(props.typeFrom){
572
+ attachParams.typeFrom = props.typeFrom;
573
+ }
651
574
  console.log("attachParams", attachParams);
652
575
  getDataList();
653
576
  loaded = true;
@@ -688,13 +611,16 @@ export default defineComponent({
688
611
  },
689
612
  {
690
613
  title: t('AttachmentInfo.index.559728-14'),
691
- dataIndex: "operate_name",
692
- key: "operate_name",
614
+ dataIndex: "operate_user",
615
+ key: "operate_user",
693
616
  },
694
617
  {
695
618
  title: t('AttachmentInfo.index.559728-15'),
696
619
  dataIndex: "operate_time",
697
620
  key: "operate_time",
621
+ customRender: ({record}) => {
622
+ return utils.i18nTypeShow(record,'date','operate_time') || '--'
623
+ }
698
624
  },
699
625
  {
700
626
  title: t('common.table.operation'),
@@ -715,7 +641,7 @@ export default defineComponent({
715
641
  const mobileAnnexUploadConfigInfo = computed(() => {
716
642
  return {
717
643
  title: props.mobileAnnexUploadConfig?.title || "",
718
- h5Domain: props.mobileAnnexUploadConfig?.h5Domain || location.origin,
644
+ h5Domain: props.mobileAnnexUploadConfig?.h5Domain || location.origin || props.staticPathes,
719
645
  uploadConfig: props.mobileAnnexUploadConfig?.uploadConfig || {},
720
646
  addRequest: {
721
647
  extra: {
@@ -723,8 +649,9 @@ export default defineComponent({
723
649
  annex_type: 2,
724
650
  parent_id: currentCrumb.value.parentId,
725
651
  ...attachParams,
726
- id: props.id,
652
+ business_id: props.id,
727
653
  alias: props.fileAlias,
654
+ typeFrom: props.typeFrom,
728
655
  },
729
656
  server: props.serviceFrom,
730
657
  url: props.annexAdd,
@@ -744,8 +671,6 @@ export default defineComponent({
744
671
  loading,
745
672
  loaded,
746
673
  addParams,
747
- handleCrumbItemClick,
748
- handleNameClick,
749
674
  handleAddSuccess,
750
675
  addAttachment,
751
676
  handleTableChange,
@@ -757,14 +682,14 @@ export default defineComponent({
757
682
 
758
683
  imgList,
759
684
  imgVisible,
760
- handleChange,
761
685
  multiAddVisible,
762
- fileList,
763
- handleCancel,
764
686
  handleRequest,
765
687
 
766
688
  getAnnexEdit,
767
- mobileAnnexUploadConfigInfo
689
+ mobileAnnexUploadConfigInfo,
690
+ getDataList,
691
+ getPicList,
692
+ attachParams,
768
693
  };
769
694
  },
770
695
  });
@@ -779,7 +704,6 @@ export default defineComponent({
779
704
  .crumb-item {
780
705
  padding: 0 4px;
781
706
  cursor: pointer;
782
- color: rgba(0, 0, 0, 0.45);
783
707
  }
784
708
 
785
709
  .active {
@@ -788,9 +712,7 @@ export default defineComponent({
788
712
  }
789
713
 
790
714
  .file-name {
791
- font-size: 12px;
792
- color: @primary-color;
793
- cursor: pointer;
715
+ font-size: inherit;
794
716
 
795
717
  .name {
796
718
  margin-left: 8px;
@@ -0,0 +1,274 @@
1
+ <template>
2
+ <a-dropdown :trigger="['click']" :disabled="disabled">
3
+ <a-tooltip v-if="parentId">
4
+ <template #title>{{ t('AttachmentInfo.index.559728-1') }}</template>
5
+ <a-button
6
+ type="link"
7
+ >
8
+ <template #icon>
9
+ <PlusOutlined/>
10
+ </template>
11
+ </a-button>
12
+ </a-tooltip>
13
+
14
+ <a-button v-else>
15
+ <template #icon>
16
+ <PlusOutlined/>
17
+ </template>
18
+ {{ t('AttachmentInfo.index.559728-1') }}
19
+ </a-button>
20
+ <template #overlay>
21
+ <a-menu>
22
+ <a-menu-item v-if="addfolder" key="new_folder" @click="addAttachment(1)">
23
+ <template #icon>
24
+ <FolderAddOutlined/>
25
+ </template>
26
+ {{ t('AttachmentInfo.index.559728-2') }}
27
+ </a-menu-item>
28
+ <a-menu-item v-if="batchupload" key="new_file" @click="addAttachment(3)">
29
+ <template #icon>
30
+ <UploadOutlined/>
31
+ </template>
32
+ <a-upload
33
+ name="file"
34
+ v-model:fileList="fileList"
35
+ :action="$utils.fileAction"
36
+ :headers="isOrg?{ 'org-token': $store.getters.token }:{'user-token': $store.getters.userToken}"
37
+ multiple
38
+ :showUploadList="false"
39
+ accept=".doc,.docx,.pdf,.jpg,.jpeg,.png,.mp4,.mp3,.mov,.mpeg"
40
+ :data="{ dir: 'org_contract_add_attachments' }"
41
+ @change="handleChange"
42
+ >
43
+ {{ t('AttachmentInfo.index.559728-3') }}
44
+ </a-upload>
45
+ </a-menu-item>
46
+ <a-menu-item v-if="mobileAnnexUpload" key="BlMobileAnnexUpload">
47
+ <!-- 手机扫码上传 -->
48
+ <BlMobileAnnexUpload
49
+ :title="mobileAnnexUploadConfig.title"
50
+ :h5Domain="mobileAnnexUploadConfig.h5Domain || staticPathes"
51
+ :uploadConfig="mobileAnnexUploadConfig.uploadConfig"
52
+ :addRequest="addRequest"
53
+ @request="handleRequest"
54
+ @handleCommit="handleAddSuccess">
55
+ </BlMobileAnnexUpload>
56
+ </a-menu-item>
57
+ </a-menu>
58
+ </template>
59
+ </a-dropdown>
60
+
61
+ <add-attachments
62
+ :params="attachParams"
63
+ :visible="addVisible"
64
+ :id="id"
65
+ :fileAlias="fileAlias"
66
+ :serviceFrom="serviceFrom"
67
+ :annexAdd="annexAdd"
68
+ @cancel="addVisible = false"
69
+ @success="handleAddSuccess"
70
+ @request="handleRequest"
71
+ />
72
+
73
+ <MultipleAddAttachments
74
+ :visible="multiAddVisible"
75
+ :file-list="fileList"
76
+ @handleCancel="handleCancel"
77
+ :params="attachParams"
78
+ :id="id"
79
+ :fileAlias="fileAlias"
80
+ :serviceFrom="serviceFrom"
81
+ :annexAdd="annexAdd"
82
+ :getFile="getFile"
83
+ @handleCommit="handleAddSuccess"
84
+ @request="handleRequest"/>
85
+ </template>
86
+
87
+ <script>
88
+ import {defineComponent, ref, computed} from "vue";
89
+ import {CheckOutlined, PlusOutlined, FolderAddOutlined, UploadOutlined} from "@ant-design/icons-vue";
90
+ import {
91
+ message,
92
+ Modal,
93
+ Card,
94
+ Dropdown,
95
+ Menu,
96
+ MenuItem,
97
+ Upload,
98
+ Tooltip,
99
+ Table,
100
+ Button,
101
+ Space,
102
+ } from "ant-design-vue";
103
+ import MultipleAddAttachments from "./MultipleAddAttachments.vue";
104
+ import addAttachments from "./AddAttachments.vue";
105
+ import { t } from "../../../locale";
106
+ import BlMobileAnnexUpload from "../../BlMobileAnnexUpload/index.vue";
107
+ export default defineComponent({
108
+ name: "AddAction",
109
+ components: {
110
+ addAttachments,
111
+ MultipleAddAttachments,
112
+ PlusOutlined,
113
+ BlMobileAnnexUpload,
114
+ FolderAddOutlined,
115
+ UploadOutlined,
116
+ "a-dropdown": Dropdown,
117
+ "a-menu": Menu,
118
+ "a-menu-item": MenuItem,
119
+ "a-upload": Upload,
120
+ "a-tooltip": Tooltip,
121
+ "a-button": Button,
122
+ },
123
+ props: {
124
+ disabled: {
125
+ type: Boolean,
126
+ default: false,
127
+ },
128
+ addfolder: {
129
+ type: Boolean,
130
+ default: true,
131
+ },
132
+ batchupload: {
133
+ type: Boolean,
134
+ default: true,
135
+ },
136
+ attachParams: {
137
+ type: Object,
138
+ default: () => ({}),
139
+ },
140
+ parentId: {
141
+ type: [String, Number],
142
+ default: 0,
143
+ },
144
+ typeFrom: {
145
+ type: String,
146
+ default: "contract",
147
+ },
148
+ // 手机扫码上传
149
+ mobileAnnexUpload: {
150
+ type: Boolean,
151
+ default: true,
152
+ },
153
+ // 手机扫码配置
154
+ mobileAnnexUploadConfig: {
155
+ type: Object,
156
+ default: () => {
157
+ return {
158
+ // 按钮标题
159
+ title: '',
160
+ // h5域名最后不需要/
161
+ h5Domain: '',
162
+ uploadConfig: {
163
+ // 现仅支持图片上传
164
+ image: {
165
+ show: true,
166
+ accept: "image/*",
167
+ count: Infinity,
168
+ size: Infinity,
169
+ }
170
+ }
171
+ };
172
+ },
173
+ },
174
+ getFile: {
175
+ type: Boolean,
176
+ default: false,
177
+ }, // 是不是直接拿文件
178
+ serviceFrom: {
179
+ type: String,
180
+ default: "",
181
+ },
182
+ // 添加接口
183
+ annexAdd: {
184
+ type: String,
185
+ default: "",
186
+ },
187
+ id: {
188
+ type: [Number, String],
189
+ default: 0,
190
+ },
191
+ fileAlias: {
192
+ type: String,
193
+ default: "",
194
+ },
195
+ isOrg:{
196
+ type: Boolean,
197
+ default: true,
198
+ },
199
+ staticPathes: {
200
+ type: String,
201
+ default: "",
202
+ },
203
+
204
+ },
205
+ setup(props, context) {
206
+ //批量上传
207
+ const multiAddVisible = ref(false);
208
+ const fileList = ref([]);
209
+ // 添加文件、文件夹
210
+ const addVisible = ref(false);
211
+ const addParams = ref({});
212
+
213
+ const addAttachment = (type) => {
214
+ if (type != 3) {
215
+ addVisible.value = true;
216
+ }
217
+ };
218
+
219
+ const handleCancel = () => {
220
+ fileList.value = []
221
+ multiAddVisible.value = false;
222
+ };
223
+
224
+ const handleChange = (info) => {
225
+ fileList.value = info.fileList
226
+ multiAddVisible.value = true;
227
+ };
228
+
229
+ const handleAddSuccess = (list = []) => {
230
+ fileList.value = []
231
+ multiAddVisible.value = false;
232
+ addVisible.value = false;
233
+ // 请求接口
234
+ context.emit('getDataList', props.getFile ? list : true)
235
+ };
236
+
237
+ const handleRequest = (emitObj) => {
238
+ context.emit("handleRequest", emitObj);
239
+ };
240
+
241
+ const addRequest = computed(() => {
242
+ let params = {
243
+ extra:{
244
+ objectId: props.attachParams?.object_id,
245
+ parent_id: props.parentId,
246
+ ...props.attachParams,
247
+ },
248
+ server:`/${props.serviceFrom}`,
249
+ url:`${props.annexAdd}`,
250
+ method: 'post'
251
+ }
252
+ return props.getFile ? {} : params;
253
+ });
254
+
255
+ return {
256
+ t,
257
+ multiAddVisible,
258
+ fileList,
259
+ addParams,
260
+ addVisible,
261
+ addAttachment,
262
+ handleCancel,
263
+ handleChange,
264
+ handleAddSuccess,
265
+ handleRequest,
266
+ addRequest,
267
+ };
268
+ },
269
+ });
270
+ </script>
271
+
272
+ <style lang="less" scoped>
273
+
274
+ </style>
@@ -103,6 +103,14 @@ export default defineComponent({
103
103
  type: [Number, String],
104
104
  default: 0,
105
105
  },
106
+ serviceFrom: {
107
+ type: String,
108
+ default: "",
109
+ },
110
+ annexAdd: {
111
+ type: String,
112
+ default: "",
113
+ },
106
114
  },
107
115
  components: {
108
116
  FileTextOutlined,
@@ -169,8 +177,8 @@ export default defineComponent({
169
177
  context.emit("request", {
170
178
  params: {
171
179
  method: "post",
172
- server: `/${params.serviceFrom}`,
173
- url: `${params.annexAdd}`,
180
+ server: `/${props.serviceFrom}`,
181
+ url: `${props.annexAdd}`,
174
182
  extra: params,
175
183
  },
176
184
  success: (res) => {
@@ -126,6 +126,14 @@ export default {
126
126
  type: [Number, String],
127
127
  default: 0,
128
128
  },
129
+ serviceFrom: {
130
+ type: String,
131
+ default: "",
132
+ },
133
+ annexAdd: {
134
+ type: String,
135
+ default: "",
136
+ },
129
137
  },
130
138
  setup(props, context) {
131
139
  const state = reactive({
@@ -168,7 +176,7 @@ export default {
168
176
  message.error(t('modules.MultipleAddAttachments.414571-5'));
169
177
  return;
170
178
  }
171
-
179
+
172
180
  for (let i = 0; i < state.uploadList.length; i++) {
173
181
  const item = state.uploadList[i];
174
182
  const params = {
@@ -189,8 +197,8 @@ export default {
189
197
  context.emit("request", {
190
198
  params: {
191
199
  method: "post",
192
- server: `/${params.serviceFrom}`,
193
- url: `${params.annexAdd}`,
200
+ server: `/${props.serviceFrom}`,
201
+ url: `${props.annexAdd}`,
194
202
  extra: params,
195
203
  },
196
204
  success: (res) => {
@@ -26,10 +26,12 @@
26
26
  <a-tree
27
27
  :height="treeHeight"
28
28
  virtual
29
+ :itemHeight="treeItemHeight"
30
+ :openAnimation="treeMotion"
29
31
  :checkable="checkable"
30
- show-icon
32
+ :show-icon="enableTreeIcon"
31
33
  v-model:expandedKeys="expandedKeys"
32
- :loadedKeys="expandedKeys"
34
+ :loadedKeys="loadedKeys"
33
35
  :checkedKeys="checkedKeys"
34
36
  :selectedKeys="selectedKeys"
35
37
  :tree-data="treeList"
@@ -41,7 +43,7 @@
41
43
  @select="onTreeSelect"
42
44
  >
43
45
  <!-- 图标 -->
44
- <template #icon="{ dataRef }">
46
+ <template v-if="enableTreeIcon" #icon="{ dataRef }">
45
47
  <bl-icon
46
48
  v-if="dataRef.slotIcon === 'topCompanyIcon'"
47
49
  type="tree-jigou"
@@ -75,15 +77,43 @@
75
77
 
76
78
  <!-- 标题 -->
77
79
  <template #title="{ dataRef }">
78
- <a-tooltip
79
- v-if="dataRef.slotTitle === 'roomTitle'"
80
- placement="topLeft"
81
- >
82
- <template v-if="dataRef.disabled && dataRef.disabledTip" #title>{{
83
- dataRef.disabledTip
84
- }}</template>
85
- <div class="room-title">
86
- <div class="title-show" key="title-disabled-tip">
80
+ <template v-if="dataRef.slotTitle === 'roomTitle'">
81
+ <a-tooltip
82
+ v-if="enableNodeTooltip"
83
+ placement="topLeft"
84
+ >
85
+ <template v-if="dataRef.disabled && dataRef.disabledTip" #title>{{
86
+ dataRef.disabledTip
87
+ }}</template>
88
+ <div class="room-title">
89
+ <div class="title-show" key="title-disabled-tip">
90
+ <div class="title">
91
+ <LockOutlined v-if="dataRef.is_lock == 1 && dataRef.disabled" class="locked" />
92
+ <span style="cursor: pointer" @click.stop="viewRoomDetail(dataRef)">{{ dataRef.title }}</span>
93
+ </div>
94
+ <span
95
+ v-if="checkable && showRoomArea"
96
+ :class="dataRef.disabled ? 'text-gray' : 'text-primary'"
97
+ >
98
+ <a-tooltip>
99
+ <template #title>
100
+ <div v-if="!noDisabledLog">{{t('ChooseHousingResources.index.592551-0', [dataRef.showArea, commonAreaUnit])}}</div>
101
+ <div v-if="utils.numberToPrecision(dataRef.build_area) || noDisabledLog">{{t('ChooseHousingResources.index.592551-1', [utils.numberToPrecision(dataRef.build_area), commonAreaUnit])}}</div>
102
+ <div v-if="utils.numberToPrecision(dataRef.inside_area)">{{t('ChooseHousingResources.index.592551-2', [utils.numberToPrecision(dataRef.inside_area), commonAreaUnit])}}</div>
103
+ <div v-if="utils.numberToPrecision(dataRef.share_area)">{{t('ChooseHousingResources.index.592551-3', [utils.numberToPrecision(dataRef.share_area), commonAreaUnit])}}</div>
104
+ </template>
105
+ {{ getRoomAreaText(dataRef) }}
106
+ </a-tooltip>
107
+ </span>
108
+ </div>
109
+ </div>
110
+ </a-tooltip>
111
+ <div
112
+ v-else
113
+ class="room-title room-title--plain"
114
+ :title="getRoomNodeTitle(dataRef)"
115
+ >
116
+ <div class="title-show" key="title-disabled-tip-plain">
87
117
  <div class="title">
88
118
  <LockOutlined v-if="dataRef.is_lock == 1 && dataRef.disabled" class="locked" />
89
119
  <span style="cursor: pointer" @click.stop="viewRoomDetail(dataRef)">{{ dataRef.title }}</span>
@@ -92,21 +122,14 @@
92
122
  v-if="checkable && showRoomArea"
93
123
  :class="dataRef.disabled ? 'text-gray' : 'text-primary'"
94
124
  >
95
- <a-tooltip>
96
- <template #title>
97
- <div v-if="!noDisabledLog">{{t('ChooseHousingResources.index.592551-0', [dataRef.showArea, commonAreaUnit])}}</div>
98
- <div v-if="utils.numberToPrecision(dataRef.build_area) || noDisabledLog">{{t('ChooseHousingResources.index.592551-1', [utils.numberToPrecision(dataRef.build_area), commonAreaUnit])}}</div>
99
- <div v-if="utils.numberToPrecision(dataRef.inside_area)">{{t('ChooseHousingResources.index.592551-2', [utils.numberToPrecision(dataRef.inside_area), commonAreaUnit])}}</div>
100
- <div v-if="utils.numberToPrecision(dataRef.share_area)">{{t('ChooseHousingResources.index.592551-3', [utils.numberToPrecision(dataRef.share_area), commonAreaUnit])}}</div>
101
- </template>
102
- {{ noDisabledLog ? utils.numberToPrecision(dataRef.build_area) : dataRef.showArea }}{{commonAreaUnit}}
103
- </a-tooltip>
104
- </span>
125
+ {{ getRoomAreaText(dataRef) }}
126
+ </span>
105
127
  </div>
106
128
  </div>
107
- </a-tooltip>
129
+ </template>
108
130
  <template v-else>
109
131
  <a-tooltip
132
+ v-if="enableNodeTooltip"
110
133
  placement="topLeft"
111
134
  >
112
135
  <template v-if="dataRef.disabled && dataRef.disabledTip" #title>{{
@@ -114,6 +137,7 @@
114
137
  }}</template>
115
138
  <span>{{ dataRef.title }}</span>
116
139
  </a-tooltip>
140
+ <span v-else :title="getNodeTitle(dataRef)">{{ dataRef.title }}</span>
117
141
  </template>
118
142
  </template>
119
143
  </a-tree>
@@ -127,6 +151,8 @@ import {
127
151
  computed,
128
152
  defineComponent,
129
153
  nextTick,
154
+ onUnmounted,
155
+ shallowRef,
130
156
  reactive,
131
157
  toRaw,
132
158
  toRefs,
@@ -375,9 +401,14 @@ export default defineComponent({
375
401
  },
376
402
  setup(props, { emit }) {
377
403
  const commonAreaUnit = utils.getAreaUnit();
404
+ // 大数据量时切换到性能优先模式,减少默认展开、动画和 Tooltip 的同步开销
405
+ const LARGE_TREE_NODE_THRESHOLD = 2000;
406
+ // 当前节点样式包含上下 padding,因此需要显式同步虚拟列表的单项高度
407
+ const TREE_ITEM_HEIGHT = 32;
408
+
378
409
  // 打印方法
379
410
  const CL = (key, value) => {
380
- console.info(`$$$$$$$$$$$$----${key}`, toRaw(value));
411
+ console.info(`ChooseHousingResources----${key}`, toRaw(value));
381
412
  };
382
413
 
383
414
  const roomTitleProps = computed(() => {
@@ -404,6 +435,9 @@ export default defineComponent({
404
435
  const showDpt = computed(() => props.attachDpt == 1);
405
436
  const treeRef = ref(null);
406
437
  const treeHeight = ref(0);
438
+ // 原始树数据单独保存为浅层引用,避免 reactive + JSON 序列化带来的双份内存开销
439
+ const originTreeData = shallowRef([]);
440
+ const sourceTreeNodeCount = ref(0);
407
441
 
408
442
  const spinning = ref(false);
409
443
 
@@ -411,6 +445,7 @@ export default defineComponent({
411
445
  // 树展开节点key值集合
412
446
  initExpandKeys: [],
413
447
  expandedKeys: [],
448
+ loadedKeys: [],
414
449
  // 选中节点的key值集合
415
450
  checkedKeys: [],
416
451
  selectedKeys: [],
@@ -424,7 +459,6 @@ export default defineComponent({
424
459
  deptVillageMap: {},
425
460
  // 展示的树数据
426
461
  treeList: [],
427
- originData: undefined,
428
462
  };
429
463
 
430
464
 
@@ -439,6 +473,118 @@ export default defineComponent({
439
473
  const authBranchOptions = computed(() => {
440
474
  return props.branchOptions?.length ? props.branchOptions : state.authBranchList;
441
475
  });
476
+ const isLargeDataMode = computed(() => {
477
+ return sourceTreeNodeCount.value >= LARGE_TREE_NODE_THRESHOLD;
478
+ });
479
+ const treeItemHeight = computed(() => TREE_ITEM_HEIGHT);
480
+ const treeMotion = computed(() => {
481
+ return isLargeDataMode.value ? null : undefined;
482
+ });
483
+ const enableTreeIcon = computed(() => {
484
+ return !isLargeDataMode.value;
485
+ });
486
+ const enableNodeTooltip = computed(() => {
487
+ return !isLargeDataMode.value;
488
+ });
489
+
490
+ /**
491
+ * 深拷贝树数据。
492
+ * 这里统一用 cloneDeep,避免大树场景下频繁 JSON 序列化造成长任务和额外字符串内存。
493
+ * @param {Array} list - 树数据
494
+ * @returns {Array}
495
+ */
496
+ const cloneTreeData = (list = []) => {
497
+ return _.cloneDeep(toRaw(list || []));
498
+ };
499
+
500
+ /**
501
+ * 统计树节点总数,用于决定是否进入性能优先模式。
502
+ * @param {Array} list - 树数据
503
+ * @returns {number}
504
+ */
505
+ const getTreeNodeCount = (list = []) => {
506
+ let count = 0;
507
+ let queue = Array.isArray(list) ? [...list] : [];
508
+ while (queue.length) {
509
+ const item = queue.shift();
510
+ if (!item) {
511
+ continue;
512
+ }
513
+ count++;
514
+ if (item.children?.length) {
515
+ queue.push(...item.children);
516
+ }
517
+ }
518
+ return count;
519
+ };
520
+
521
+ /**
522
+ * 大数据场景下仅保留首层department默认展开,避免初始化时一次性打平整棵树。
523
+ * @param {Array} list - 树数据
524
+ * @returns {Array}
525
+ */
526
+ const getSafeInitExpandedKeys = (list = []) => {
527
+ return (list || []).filter((item) => item?.childType === "department").map((item) => item.key);
528
+ };
529
+
530
+ /**
531
+ * 根据节点总数重置默认展开策略,优先保证首屏稳定渲染。
532
+ * @param {Array} list - 树数据
533
+ * @returns {void}
534
+ */
535
+ const applyTreePerformanceStrategy = (list = []) => {
536
+ sourceTreeNodeCount.value = getTreeNodeCount(list);
537
+ const normalExpandKeys = Array.from(new Set(state.initExpandKeys));
538
+ const nextInitExpandKeys = sourceTreeNodeCount.value >= LARGE_TREE_NODE_THRESHOLD
539
+ ? getSafeInitExpandedKeys(list)
540
+ : normalExpandKeys;
541
+ state.initExpandKeys = [...nextInitExpandKeys];
542
+ state.expandedKeys = [...nextInitExpandKeys];
543
+ };
544
+
545
+ /**
546
+ * 记录已完成异步加载的节点,避免将 expandedKeys 误当成 loadedKeys 导致额外受控更新。
547
+ * @param {string} key - 节点 key
548
+ * @returns {void}
549
+ */
550
+ const appendLoadedKey = (key) => {
551
+ if (!key || state.loadedKeys.includes(key)) {
552
+ return;
553
+ }
554
+ state.loadedKeys = [...state.loadedKeys, key];
555
+ };
556
+
557
+ /**
558
+ * 大数据模式下改用原生 title,减少 Tooltip 组件树和事件绑定数量。
559
+ * @param {Object} dataRef - 当前节点
560
+ * @returns {string}
561
+ */
562
+ const getNodeTitle = (dataRef) => {
563
+ return dataRef?.disabled && dataRef?.disabledTip ? dataRef.disabledTip : dataRef?.title || "";
564
+ };
565
+
566
+ /**
567
+ * 统一房间面积展示文本,避免模板内重复计算。
568
+ * @param {Object} dataRef - 当前节点
569
+ * @returns {string}
570
+ */
571
+ const getRoomAreaText = (dataRef) => {
572
+ const areaValue = noDisabledLog ? utils.numberToPrecision(dataRef.build_area) : dataRef.showArea;
573
+ return `${areaValue || 0}${commonAreaUnit}`;
574
+ };
575
+
576
+ /**
577
+ * 生成房间节点的原生提示文案,在关闭 Tooltip 时仍能看到关键信息。
578
+ * @param {Object} dataRef - 当前节点
579
+ * @returns {string}
580
+ */
581
+ const getRoomNodeTitle = (dataRef) => {
582
+ const titleList = [getNodeTitle(dataRef)];
583
+ if (props.checkable && props.showRoomArea) {
584
+ titleList.push(getRoomAreaText(dataRef));
585
+ }
586
+ return titleList.filter(Boolean).join(" | ");
587
+ };
442
588
 
443
589
  const getClauseTypeByArray = () => {
444
590
  let otherAttribute = 'other';
@@ -470,6 +616,7 @@ export default defineComponent({
470
616
  );
471
617
  const reset = () => {
472
618
  state.expandedKeys = [...state.initExpandKeys];
619
+ state.loadedKeys = [];
473
620
  state.checkedKeys = [];
474
621
  state.tempCheckedKeys = [];
475
622
  //checkedIds = [];
@@ -484,7 +631,7 @@ export default defineComponent({
484
631
 
485
632
  const filterTreeListByShowList = () => {
486
633
  // 过滤树
487
- const originData = JSON.parse(state.originData);
634
+ const originData = cloneTreeData(originTreeData.value);
488
635
  spinning.value = true;
489
636
  getShowList(originData).then((res) => {
490
637
  spinning.value = false;
@@ -508,7 +655,7 @@ export default defineComponent({
508
655
  } else {
509
656
  spinning.value = false;
510
657
  nextTick(() => {
511
- state.treeList = JSON.parse(state.originData);
658
+ state.treeList = cloneTreeData(originTreeData.value);
512
659
  });
513
660
  }
514
661
  }
@@ -661,7 +808,6 @@ export default defineComponent({
661
808
  const roomIds = [...subRoomParentIds, ...noSubRoomIds];
662
809
  result = list.filter((item) => roomIds.includes(item.id));
663
810
  let haveSubResult = list.filter((item) => subRoomParentIds.includes(item.id));
664
- console.log(roomIds, result,haveSubResult, '0000000000000000000000000' )
665
811
  await getSubRoomAsync(haveSubResult);
666
812
  } else if (childType == "subRoom") {
667
813
  // 子房间
@@ -1326,6 +1472,7 @@ export default defineComponent({
1326
1472
  } else {
1327
1473
  build.isLeaf = true;
1328
1474
  }
1475
+ appendLoadedKey(build.key);
1329
1476
  resolve(build.children);
1330
1477
  },
1331
1478
  });
@@ -1571,6 +1718,7 @@ export default defineComponent({
1571
1718
  } else {
1572
1719
  layOrBuild.isLeaf = true;
1573
1720
  }
1721
+ appendLoadedKey(layOrBuild.key);
1574
1722
  resolve(layOrBuild.children);
1575
1723
  },
1576
1724
  });
@@ -1654,6 +1802,7 @@ export default defineComponent({
1654
1802
  } else {
1655
1803
  room.isLeaf = true;
1656
1804
  }
1805
+ appendLoadedKey(room.key);
1657
1806
  resolve(room.children);
1658
1807
  },
1659
1808
  });
@@ -1676,29 +1825,29 @@ export default defineComponent({
1676
1825
  }
1677
1826
  );
1678
1827
  const filterVillageByType = () => {
1679
- if (!state.originData || !state.treeList.length) {
1828
+ if (!originTreeData.value?.length || !state.treeList.length) {
1680
1829
  return;
1681
1830
  }
1682
1831
  if (props.villageType) {
1683
1832
  if (showDpt.value) {
1684
- state.treeList = filterDeptVillageByType(state.treeList);
1833
+ state.treeList = filterDeptVillageByType(cloneTreeData(originTreeData.value));
1685
1834
  } else {
1686
- let originData = JSON.parse(state.originData);
1835
+ let originData = cloneTreeData(originTreeData.value);
1687
1836
  state.treeList = originData.filter(
1688
1837
  (item) => item.type == props.villageType
1689
1838
  );
1690
1839
  }
1691
1840
  }else if (props.notShowType.length) {
1692
1841
  if (showDpt.value) {
1693
- state.treeList = filterTreeByNotShowType(state.treeList);
1842
+ state.treeList = filterTreeByNotShowType(cloneTreeData(originTreeData.value));
1694
1843
  } else {
1695
- let originData = JSON.parse(state.originData);
1844
+ let originData = cloneTreeData(originTreeData.value);
1696
1845
  state.treeList = originData.filter(
1697
1846
  (item) => !props.notShowType.includes(item.type)
1698
1847
  );
1699
1848
  }
1700
1849
  } else {
1701
- state.treeList = JSON.parse(state.originData);
1850
+ state.treeList = cloneTreeData(originTreeData.value);
1702
1851
  }
1703
1852
  emitTreeList();
1704
1853
  };
@@ -2086,13 +2235,11 @@ export default defineComponent({
2086
2235
  }
2087
2236
  // 默认选中值
2088
2237
  setDefaultChecked();
2089
- console.log(state.treeList,"tree===========")
2090
2238
  if (props.notShowType.length) {
2091
- state.treeList = filterTreeByNotShowType(state.treeList);
2239
+ state.treeList = filterTreeByNotShowType(cloneTreeData(state.treeList));
2092
2240
  }
2093
- console.log(state.treeList,"tree===========111")
2094
- let _treeList = _.cloneDeep(state.treeList);
2095
- let _originData = _.cloneDeep(JSON.parse(state.originData));
2241
+ let _treeList = cloneTreeData(state.treeList);
2242
+ let _originData = cloneTreeData(originTreeData.value);
2096
2243
  let cloneTreeList = filterBuildLevel(_treeList);
2097
2244
  let cloneOriginData = filterBuildLevel(_originData);
2098
2245
  // 最终treeList
@@ -2129,7 +2276,8 @@ export default defineComponent({
2129
2276
  // ------case 1
2130
2277
  const getDeptAndVillageTree = (list) => {
2131
2278
  state.treeList = getDeptTreeList(list, 1);
2132
- state.originData = JSON.stringify(state.treeList);
2279
+ originTreeData.value = cloneTreeData(state.treeList);
2280
+ applyTreePerformanceStrategy(originTreeData.value);
2133
2281
  filterVillageByType();
2134
2282
  };
2135
2283
  // 获取部门树列表
@@ -2299,7 +2447,8 @@ export default defineComponent({
2299
2447
  // -------case 2
2300
2448
  const getVillageTree = (villageList) => {
2301
2449
  state.treeList = getVillageTreeList(villageList);
2302
- state.originData = JSON.stringify(state.treeList);
2450
+ originTreeData.value = cloneTreeData(state.treeList);
2451
+ applyTreePerformanceStrategy(originTreeData.value);
2303
2452
  filterVillageByType();
2304
2453
  };
2305
2454
 
@@ -2400,6 +2549,9 @@ export default defineComponent({
2400
2549
  emitResult(result);
2401
2550
  getShowListLoadedTimes = 0;
2402
2551
  showExpandedKeys = [];
2552
+ // 切换公司后清空原始树缓存和节点数量,避免沿用上一家公司性能模式状态
2553
+ originTreeData.value = [];
2554
+ sourceTreeNodeCount.value = 0;
2403
2555
  let branchIdTxt = authBranchOptions.value?.find((v) => state.branchId == v.value)?.label;
2404
2556
  emit('changeBranchId', state.branchId, branchIdTxt);
2405
2557
  getVillageInfo();
@@ -2448,9 +2600,18 @@ export default defineComponent({
2448
2600
 
2449
2601
  loadLanguageAsync(utils.getLang());
2450
2602
 
2451
- window.addEventListener('setBLLang', (event) => {
2603
+ const handleSetLang = (event) => {
2452
2604
  const newLang = event.newValue; // 获取新的语言值
2453
2605
  loadLanguageAsync(newLang);
2606
+ };
2607
+ window.addEventListener('setBLLang', handleSetLang);
2608
+
2609
+ onUnmounted(() => {
2610
+ if (emitIdsTimeout) {
2611
+ clearTimeout(emitIdsTimeout);
2612
+ emitIdsTimeout = null;
2613
+ }
2614
+ window.removeEventListener('setBLLang', handleSetLang);
2454
2615
  });
2455
2616
 
2456
2617
  watchEffect(() => {
@@ -2468,8 +2629,15 @@ export default defineComponent({
2468
2629
  treeHeight,
2469
2630
  spinning,
2470
2631
  authBranchOptions,
2632
+ enableNodeTooltip,
2633
+ enableTreeIcon,
2634
+ treeItemHeight,
2635
+ treeMotion,
2471
2636
  ...toRefs(state),
2472
2637
  commonAreaUnit,
2638
+ getNodeTitle,
2639
+ getRoomAreaText,
2640
+ getRoomNodeTitle,
2473
2641
  onLoadTreeData,
2474
2642
  handleTreeCheck,
2475
2643
  getIcon,
@@ -2530,6 +2698,9 @@ export default defineComponent({
2530
2698
  .room-title {
2531
2699
  display: inline-block;
2532
2700
  width: 100%;
2701
+ &--plain {
2702
+ overflow: hidden;
2703
+ }
2533
2704
  .title-show {
2534
2705
  display: flex;
2535
2706
  align-content: center;