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 +1 -1
- package/src/components/AttachmentInfo/index.vue +123 -201
- package/src/components/AttachmentInfo/modules/AddAction.vue +274 -0
- package/src/components/AttachmentInfo/modules/AddAttachments.vue +10 -2
- package/src/components/AttachmentInfo/modules/MultipleAddAttachments.vue +11 -3
- package/src/components/ChooseHousingResources/index.vue +213 -42
package/package.json
CHANGED
|
@@ -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')
|
|
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
|
-
<
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
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
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
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"
|
|
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
|
|
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
|
|
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
|
|
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(
|
|
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
|
|
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
|
-
|
|
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 = (
|
|
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}/${
|
|
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: "
|
|
692
|
-
key: "
|
|
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
|
-
|
|
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:
|
|
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: `/${
|
|
173
|
-
url: `${
|
|
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: `/${
|
|
193
|
-
url: `${
|
|
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="
|
|
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
|
-
<
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
<div class="
|
|
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
|
-
|
|
96
|
-
|
|
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
|
-
</
|
|
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(
|
|
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 =
|
|
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 =
|
|
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 (!
|
|
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(
|
|
1833
|
+
state.treeList = filterDeptVillageByType(cloneTreeData(originTreeData.value));
|
|
1685
1834
|
} else {
|
|
1686
|
-
let 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(
|
|
1842
|
+
state.treeList = filterTreeByNotShowType(cloneTreeData(originTreeData.value));
|
|
1694
1843
|
} else {
|
|
1695
|
-
let 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 =
|
|
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
|
-
|
|
2094
|
-
let
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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;
|