6326d5ed by lxs

全景地图地址修改

2 parents b0d49d5c 3625e1e3
Showing 53 changed files with 2450 additions and 56 deletions
...@@ -83,6 +83,9 @@ VITE_APP_ATTACHMENT_TEMPLATE = ms-daop-personel-service ...@@ -83,6 +83,9 @@ VITE_APP_ATTACHMENT_TEMPLATE = ms-daop-personel-service
83 #人员服务 83 #人员服务
84 VITE_APP_PERSONAL_URL = 'ms-daop-personel-service' 84 VITE_APP_PERSONAL_URL = 'ms-daop-personel-service'
85 85
86 #元数据标准
87 VITE_APP_STANDARD_URL = 'ms-daop-meta-standard-service'
88
86 #流通平台地址 89 #流通平台地址
87 VITE_APP_CIRCULATION = https://daop-lt-test.zgsjzc.com/ 90 VITE_APP_CIRCULATION = https://daop-lt-test.zgsjzc.com/
88 # 测试环境访问地址 91 # 测试环境访问地址
...@@ -91,7 +94,6 @@ VITE_APP_CIRCULATION = https://daop-lt-test.zgsjzc.com/ ...@@ -91,7 +94,6 @@ VITE_APP_CIRCULATION = https://daop-lt-test.zgsjzc.com/
91 #数据加工交付 94 #数据加工交付
92 VITE_APP_DATA_DELIVERY = https://daop-jgjf-test.zgsjzc.com/ 95 VITE_APP_DATA_DELIVERY = https://daop-jgjf-test.zgsjzc.com/
93 96
94
95 # 本地访问地址 97 # 本地访问地址
96 # VITE_API_CIRCULATION_URL = http://localhost:9000/circulation 98 # VITE_API_CIRCULATION_URL = http://localhost:9000/circulation
97 99
......
...@@ -110,6 +110,9 @@ VITE_API_ASSET_BASEURL = ms-swzl-data-dam-service ...@@ -110,6 +110,9 @@ VITE_API_ASSET_BASEURL = ms-swzl-data-dam-service
110 #数据同步接口地址 110 #数据同步接口地址
111 VITE_API_DATA_SYNC = ms-swzl-data-sync-service 111 VITE_API_DATA_SYNC = ms-swzl-data-sync-service
112 112
113 #元数据标准
114 VITE_APP_STANDARD_URL = 'ms-daop-meta-standard-service'
115
113 #消息接口 116 #消息接口
114 VITE_API_MESSAGE = ms-daop-message-service 117 VITE_API_MESSAGE = ms-daop-message-service
115 118
......
...@@ -27,6 +27,7 @@ declare module '@vue/runtime-core' { ...@@ -27,6 +27,7 @@ declare module '@vue/runtime-core' {
27 FileUpload: typeof import('./src/components/FileUpload/index.vue')['default'] 27 FileUpload: typeof import('./src/components/FileUpload/index.vue')['default']
28 FixedActionBar: typeof import('./src/components/FixedActionBar/index.vue')['default'] 28 FixedActionBar: typeof import('./src/components/FixedActionBar/index.vue')['default']
29 Form: typeof import('./src/components/Form/index.vue')['default'] 29 Form: typeof import('./src/components/Form/index.vue')['default']
30 GraphTopbar: typeof import('./src/components/RelationNetwork/graphTopbar.vue')['default']
30 Hour: typeof import('./src/components/Schedule/component/hour.vue')['default'] 31 Hour: typeof import('./src/components/Schedule/component/hour.vue')['default']
31 ImagePreview: typeof import('./src/components/ImagePreview/index.vue')['default'] 32 ImagePreview: typeof import('./src/components/ImagePreview/index.vue')['default']
32 ImagesUpload: typeof import('./src/components/ImagesUpload/index.vue')['default'] 33 ImagesUpload: typeof import('./src/components/ImagesUpload/index.vue')['default']
...@@ -41,6 +42,7 @@ declare module '@vue/runtime-core' { ...@@ -41,6 +42,7 @@ declare module '@vue/runtime-core' {
41 PageNav: typeof import('./src/components/PageNav/index.vue')['default'] 42 PageNav: typeof import('./src/components/PageNav/index.vue')['default']
42 PcasCascader: typeof import('./src/components/PcasCascader/index.vue')['default'] 43 PcasCascader: typeof import('./src/components/PcasCascader/index.vue')['default']
43 Popover: typeof import('./src/components/Popover/index.vue')['default'] 44 Popover: typeof import('./src/components/Popover/index.vue')['default']
45 RelationNetwork: typeof import('./src/components/RelationNetwork/index.vue')['default']
44 RouterLink: typeof import('vue-router')['RouterLink'] 46 RouterLink: typeof import('vue-router')['RouterLink']
45 RouterView: typeof import('vue-router')['RouterView'] 47 RouterView: typeof import('vue-router')['RouterView']
46 Schedule: typeof import('./src/components/Schedule/index.vue')['default'] 48 Schedule: typeof import('./src/components/Schedule/index.vue')['default']
......
...@@ -551,4 +551,9 @@ export const getContractDetail = (params) => request({ ...@@ -551,4 +551,9 @@ export const getContractDetail = (params) => request({
551 url: `https://zcgl.zgsjzc.com/circulation/api/ms-data-circulation-tx-mgr-service/data-contract/detail`, 551 url: `https://zcgl.zgsjzc.com/circulation/api/ms-data-circulation-tx-mgr-service/data-contract/detail`,
552 method: 'get', 552 method: 'get',
553 params 553 params
554 })
555
556 // 获取所有字典
557 export const getDictAllList = () => request({
558 url: `${import.meta.env.VITE_APP_CONFIG_URL}/dict/data/get-all`
554 }) 559 })
...\ No newline at end of file ...\ No newline at end of file
......
...@@ -248,4 +248,298 @@ export const syncChangeDetail = (guid) => request({ ...@@ -248,4 +248,298 @@ export const syncChangeDetail = (guid) => request({
248 export const delMetaDataSource = (databaseGuid) => request({ 248 export const delMetaDataSource = (databaseGuid) => request({
249 url: `${import.meta.env.VITE_APP_PLAN_BASEURL}/meta-collect-task/del-by-database-guid?databaseGuid=${databaseGuid}`, 249 url: `${import.meta.env.VITE_APP_PLAN_BASEURL}/meta-collect-task/del-by-database-guid?databaseGuid=${databaseGuid}`,
250 method: 'delete', 250 method: 'delete',
251 })
252
253 /** 元数据-标准代码分页查询 */
254 export const getStandardCodeList = (params) => request({
255 url: `${import.meta.env.VITE_APP_STANDARD_URL}/standard-code/page-list`,
256 method: 'post',
257 data: params
258 })
259 /** 元数据-标准代码新增 */
260 export const saveStandardCode = (params) => request({
261 url: `${import.meta.env.VITE_APP_STANDARD_URL}/standard-code/save`,
262 method: 'post',
263 data: params
264 })
265 /** 元数据-标准代码修改 */
266 export const updateStandardCode = (params) => request({
267 url: `${import.meta.env.VITE_APP_STANDARD_URL}/standard-code/update`,
268 method: 'put',
269 data: params
270 })
271 /** 元数据-标准代码详情 */
272 export const getStandardCodeDetail = (guid) => request({
273 url: `${import.meta.env.VITE_APP_STANDARD_URL}/standard-code/detail?guid=${guid}`,
274 method: 'get',
275 })
276 /** 元数据-标准代码删除 */
277 export const deleteStandardCode = (params) => request({
278 url: `${import.meta.env.VITE_APP_STANDARD_URL}/standard-code/delete`,
279 method: 'delete',
280 data: params
281 })
282 /** 元数据-查询标准列表 */
283 export const getStandardCodeStandard = (standardTypeCode) => request({
284 url: `${import.meta.env.VITE_APP_STANDARD_URL}/standard-code/get-standard?standardTypeCode=${standardTypeCode}`,
285 method: 'get'
286 })
287 /** 元数据-查询代码列表 */
288 export const getStandardCodeDataList = (params) => request({
289 url: `${import.meta.env.VITE_APP_STANDARD_URL}/standard-code/data/get-data`,
290 method: 'post',
291 data: params
292 })
293 /** 元数据-查询代码字段数据 */
294 export const getStandardCodeFields = (standardGuid) => request({
295 url: `${import.meta.env.VITE_APP_STANDARD_URL}/standard-code/get-field?standardGuid=${standardGuid}`,
296 method: 'get'
297 })
298 /** 元数据-保存标准代码数据 */
299 export const saveStandardCodeFieldsData = (params) => request({
300 url: `${import.meta.env.VITE_APP_STANDARD_URL}/standard-code/data/save-data`,
301 method: 'post',
302 data: params
303 })
304 /** 元数据-删除标准代码数据 */
305 export const deleteStandardCodeFieldsData = (params) => request({
306 url: `${import.meta.env.VITE_APP_STANDARD_URL}/standard-code/data/remove-data`,
307 method: 'post',
308 data: params
309 })
310 /** 元数据-导出 */
311 export const exportStandardCodeData = (params) => request({
312 url: `${import.meta.env.VITE_APP_STANDARD_URL}/standard-code/data/data-export`,
313 method: 'post',
314 data: params,
315 responseType: 'blob'
316 })
317 /** 元数据标准-树形列表 */
318 export const getMetaStandardTree = () => request({
319 url: `${import.meta.env.VITE_APP_STANDARD_URL}/meta-standard/list-tree`,
320 method: 'get'
321 })
322 /** 元数据标准-新增 */
323 export const saveMetaStandard = (params) => request({
324 url: `${import.meta.env.VITE_APP_STANDARD_URL}/meta-standard/save`,
325 method: 'post',
326 data: params
327 })
328 /** 元数据标准-修改 */
329 export const updateMetaStandard = (params) => request({
330 url: `${import.meta.env.VITE_APP_STANDARD_URL}/meta-standard/update`,
331 method: 'put',
332 data: params
333 })
334 /** 元数据标准-删除 */
335 export const deleteMetaStandard = (params) => request({
336 url: `${import.meta.env.VITE_APP_STANDARD_URL}/meta-standard/delete`,
337 method: 'delete',
338 data: params
339 })
340 /** 元数据标准-详情 */
341 export const getMetaStandardDetail = (guid) => request({
342 url: `${import.meta.env.VITE_APP_STANDARD_URL}/meta-standard/detail?guid=${guid}`,
343 method: 'get'
344 })
345 /** 元数据标准-标准数据 */
346 export const getMetaStandardDataList = (params) => request({
347 url: `${import.meta.env.VITE_APP_STANDARD_URL}/meta-standard/data/page-list`,
348 method: 'post',
349 data: params
350 })
351 /** 元数据标准-标准字段 */
352 export const getMetaStandardDataFields = (metaStandardGuid) => request({
353 url: `${import.meta.env.VITE_APP_STANDARD_URL}/meta-standard/get-standard-field?metaStandardGuid=${metaStandardGuid}`,
354 method: 'get'
355 })
356 /** 元数据标准-标准字段保存 */
357 export const saveMetaStandardDataFields = (params) => request({
358 url: `${import.meta.env.VITE_APP_STANDARD_URL}/meta-standard/data/save-or-update`,
359 method: 'post',
360 data: params
361 })
362 /** 元数据标准-标准字段删除 */
363 export const deleteMetaStandardDataFields = (params) => request({
364 url: `${import.meta.env.VITE_APP_STANDARD_URL}/meta-standard/data/del`,
365 method: 'delete',
366 data: params
367 })
368 /** 元数据标准-导出 */
369 export const exportMetaStandardData = (params) => request({
370 url: `${import.meta.env.VITE_APP_STANDARD_URL}/meta-standard/data/data-export`,
371 method: 'post',
372 data: params,
373 responseType: 'blob'
374 })
375 /** 标准代码-树形表 */
376 export const getStandardCodeTree = () => request({
377 url: `${import.meta.env.VITE_APP_STANDARD_URL}/standard-code/code-tree`,
378 method: 'get'
379 })
380
381 /** 元数据标准树形列表查询 */
382 export const getMetaStandardTreeList = (guid) => request({
383 url: `${import.meta.env.VITE_APP_STANDARD_URL}/meta-standard/list-tree?metaStandardGuid=${guid}`,
384 method: 'get'
385 })
386
387 /** 元数据标准guid查询只展示的字段 */
388 export const getMetaStandardField = (guid) => request({
389 url: `${import.meta.env.VITE_APP_STANDARD_URL}/meta-standard/data/list-by-meta-standard-guid?metaStandardGuid=${guid}`,
390 method: 'get'
391 })
392 /** 元数据标准字段详情 */
393 export const getMetaStandardFieldsDetail = (guid) => request({
394 url: `${import.meta.env.VITE_APP_STANDARD_URL}/meta-standard/data/detail?guid=${guid}`,
395 method: 'get'
396 })
397
398 /** 根据元数据标准展示字段去获取未展示的详情信息 */
399 export const getMetaStandardFieldDetail = (guid) => request({
400 url: `${import.meta.env.VITE_APP_STANDARD_URL}/meta-standard/data/convert-detail?guid=${guid}`,
401 method: 'get'
402 })
403
404 /** 获取桑基图数据 */
405 export const getSankeyData = (guid) => request({
406 url: `${import.meta.env.VITE_APP_STANDARD_URL}/meta-standard/sankey-data?metaStandardGuid=${guid}`,
407 method: 'get'
408 })
409
410 /** 数仓目录树列表查询 */
411 export const getDataWareCatalogList = (params) => request({
412 // url: `${import.meta.env.VITE_APP_DATA_DELIVERY}delivery/ms-daop-data-plan-service/data-catalog-directory/tree-list`,
413 url: `${import.meta.env.VITE_API_BASEURL}delivery/api/ms-daop-data-plan-service/data-catalog-directory/tree-list`,
414 method: 'post',
415 data: params
416 })
417
418 export const getAllFlowData = (dictType) => request({
419 url: `${import.meta.env.VITE_APP_CONFIG_URL}/dict/data/get-by-dictType?dictType=${dictType}`,
420 method: 'get',
421 })
422
423 /** 元数据标准guid查询新建数据集字段 */
424 export const getMetaStandardDsField = (guid) => request({
425 url: `${import.meta.env.VITE_APP_STANDARD_URL}/meta-standard/get-standard?metaStandardGuid=${guid}`,
426 method: 'get'
427 })
428
429 /** 表分类类型 */
430 export const tableCategoryList = [
431 {
432 value: 1,
433 label: "明细表",
434 },
435 {
436 value: 2,
437 label: "汇总表",
438 },
439 {
440 value: 3,
441 label: "应用表",
442 },
443 {
444 value: 6,
445 label: "业务表",
446 },
447 // {
448 // value: 4,
449 // label: "维度表",
450 // },
451 // {
452 // value: 5,
453 // label: "缓慢变化维",
454 // }
455 ];
456
457 /** 同步策略 */
458 export const syncPolicys = [
459 {
460 value: 1,
461 label: "实时",
462 },
463 {
464 value: 2,
465 label: "增量",
466 },
467 {
468 value: 3,
469 label: "全量",
470 },
471 {
472 value: 4,
473 label: "增量加更新",
474 },
475 ];
476
477 /** 维表类型 */
478 export const dimTypeList = [{
479 label: "列表",
480 value: 1,
481 },
482 {
483 label: "层级",
484 value: 2,
485 },
486 {
487 label: "螺旋",
488 value: 3,
489 },
490 {
491 label: "通用",
492 value: 4,
493 }];
494
495 /** 表模型分类 */
496 export const tableModels = [
497 {
498 label: "主键模型",
499 value: 1,
500 },
501 {
502 label: "聚合模型",
503 value: 2,
504 },
505 {
506 label: "明细模型",
507 value: 3,
508 }
509 ];
510
511 /** 聚合方式 */
512 export const aggMethodList = [{
513 value: 'SUM',
514 }, {
515 value: 'MAX'
516 }, {
517 value: 'MIN'
518 }, {
519 value: 'REPLACE'
520 }, {
521 value: 'REPLACE_IF_NOT_NULL'
522 }, {
523 value: 'HLL_UNION'
524 }, {
525 value: 'BITMAP_UNION'
526 }];
527
528 /** 保存主题表设置,直接入库 */
529 export const saveSubjectTable = (params) => request({
530 url: `${import.meta.env.VITE_API_BASEURL}delivery/api/ms-daop-data-plan-service/data-catalog-subject/add`,
531 method: 'post',
532 data: params
533 })
534
535 /** 获取字典列表 */
536 export const getDictionary = (params) => request({
537 url: `${import.meta.env.VITE_APP_PLAN_BASEURL}/data-dictionary-general/list-all?state=1`,
538 method: 'post'
539 })
540
541 /** 获取维度列表 */
542 export const getDimList = () => request({
543 url: `${import.meta.env.VITE_API_BASEURL}delivery/api/ms-daop-data-plan-service/data-catalog-subject/get-dim-list`,
544 method: 'get'
251 }) 545 })
...\ No newline at end of file ...\ No newline at end of file
......
1 import request from "@/utils/request";
2
3 //获取需求表树形列表
4 export const getDemandTreeList = (params) => {
5 return request({
6 url: `${import.meta.env.VITE_API_NEW_PORTAL}/pricing-demand-menu/page-list`,
7 method: "post",
8 data: params,
9 });
10 };
11
12 //获取所有需求表列表
13 export const getDemandAll = (params) => {
14 return request({
15 url: `${import.meta.env.VITE_API_NEW_PORTAL}/pricing-demand-menu/get-list-data`,
16 method: "get",
17 params
18 });
19 };
20
21 //新增需求列表
22 export const saveDemandTree = (params) => {
23 return request({
24 url: `${import.meta.env.VITE_API_NEW_PORTAL}/pricing-demand-menu/save`,
25 method: "post",
26 data: params,
27 });
28 };
29
30 //修改需求列表
31 export const updateDemandTree = (params) => {
32 return request({
33 url: `${import.meta.env.VITE_API_NEW_PORTAL}/pricing-demand-menu/update`,
34 method: "post",
35 data: params,
36 });
37 };
38
39 // 删除需求列表
40 export const deleteDemandTree = (params) => {
41 return request({
42 url: `${import.meta.env.VITE_API_NEW_PORTAL}/pricing-demand-menu/delete`,
43 method: "delete",
44 data: params,
45 });
46 };
47
48 //获取需求表
49 export const getDemandList = (params) => {
50 return request({
51 url: `${import.meta.env.VITE_API_NEW_PORTAL}/pricing-demand-table/page-list`,
52 method: "post",
53 data: params,
54 });
55 };
56
57 //获取需求表详情
58 export const getDemandDetail = (params) => {
59 return request({
60 url: `${import.meta.env.VITE_API_NEW_PORTAL}/pricing-demand-table/detail`,
61 method: "get",
62 params,
63 });
64 };
65
66 //新增需求表
67 export const saveDemand = (params) => {
68 return request({
69 url: `${import.meta.env.VITE_API_NEW_PORTAL}/pricing-demand-table/save`,
70 method: "post",
71 data: params,
72 });
73 };
74
75 //修改需求表
76 export const updateDemand = (params) => {
77 return request({
78 url: `${import.meta.env.VITE_API_NEW_PORTAL}/pricing-demand-table/update`,
79 method: "post",
80 data: params,
81 });
82 };
83
84 // 删除需求表
85 export const deleteDemand = (params) => {
86 return request({
87 url: `${import.meta.env.VITE_API_NEW_PORTAL}/pricing-demand-table/delete`,
88 method: "delete",
89 data: params,
90 });
91 };
92
93 // 获取疾病列表
94 export const getDiseaseList = (params) => {
95 return request({
96 url: `${import.meta.env.VITE_API_NEW_PORTAL}/disease-manage/page-list`,
97 method: "post",
98 data: params,
99 });
100 };
101
102 //获取所有疾病列表
103 export const getDiseaseAll = () => {
104 return request({
105 url: `${import.meta.env.VITE_API_NEW_PORTAL}/disease-manage/get-list-data`,
106 method: "post"
107 });
108 };
109
110 // 获取疾病详情
111 export const getDiseaseDetail = (params) => {
112 return request({
113 url: `${import.meta.env.VITE_API_NEW_PORTAL}/disease-manage/detail`,
114 method: "get",
115 params,
116 });
117 };
118
119 // 新增疾病
120 export const saveDisease = (params) => {
121 return request({
122 url: `${import.meta.env.VITE_API_NEW_PORTAL}/disease-manage/save`,
123 method: "post",
124 data: params,
125 });
126 };
127
128 // 修改疾病
129 export const updateDisease = (params) => {
130 return request({
131 url: `${import.meta.env.VITE_API_NEW_PORTAL}/disease-manage/update`,
132 method: "post",
133 data: params,
134 });
135 };
136
137 // 删除疾病
138 export const deleteDisease = (params) => {
139 return request({
140 url: `${import.meta.env.VITE_API_NEW_PORTAL}/disease-manage/delete`,
141 method: "delete",
142 data: params,
143 });
144 };
145
146 // 获取定价配置
147 export const getConfigureList = (params) => {
148 return request({
149 url: `${import.meta.env.VITE_API_NEW_PORTAL}/pricing-configure/page-list`,
150 method: "post",
151 data: params,
152 });
153 };
154
155 // 获取配置详情
156 export const getConfigureDetail = (params) => {
157 return request({
158 url: `${import.meta.env.VITE_API_NEW_PORTAL}/pricing-configure/detail`,
159 method: "get",
160 params,
161 });
162 };
163
164 // 新增配置
165 export const saveConfigure = (params) => {
166 return request({
167 url: `${import.meta.env.VITE_API_NEW_PORTAL}/pricing-configure/save`,
168 method: "post",
169 data: params,
170 });
171 };
172
173 // 修改配置
174 export const updateConfigure = (params) => {
175 return request({
176 url: `${import.meta.env.VITE_API_NEW_PORTAL}/pricing-configure/update`,
177 method: "post",
178 data: params,
179 });
180 };
181
182 // 删除配置
183 export const deleteConfigure = (params) => {
184 return request({
185 url: `${import.meta.env.VITE_API_NEW_PORTAL}/pricing-configure/delete`,
186 method: "delete",
187 data: params,
188 });
189 };
190
191 // 复制配置
192 export const addCopyConfigure = (params) => {
193 return request({
194 url: `${import.meta.env.VITE_API_NEW_PORTAL}/pricing-configure/copy`,
195 method: "post",
196 data: params,
197 });
198 };
199
200 // 获取数据定价
201 export const getPriceList = (params) => {
202 return request({
203 url: `${import.meta.env.VITE_API_NEW_PORTAL}/pricing-data/page-list`,
204 method: "post",
205 data: params,
206 });
207 };
208
209 // 获取数据定价详情
210 export const getPriceDetail = (params) => {
211 return request({
212 url: `${import.meta.env.VITE_API_NEW_PORTAL}/pricing-data/detail`,
213 method: "get",
214 params,
215 });
216 };
217
218 // 新增数据定价
219 export const savePrice = (params) => {
220 return request({
221 url: `${import.meta.env.VITE_API_NEW_PORTAL}/pricing-data/save`,
222 method: "post",
223 data: params,
224 });
225 };
226
227 // 修改数据定价
228 export const updatePrice = (params) => {
229 return request({
230 url: `${import.meta.env.VITE_API_NEW_PORTAL}/pricing-data/update`,
231 method: "post",
232 data: params,
233 });
234 };
235
236 // 获取数据定价结果
237 export const getPriceResult = (params) => {
238 return request({
239 url: `${import.meta.env.VITE_API_NEW_PORTAL}/pricing-data/pricing-price`,
240 method: "post",
241 data: params,
242 });
243 };
244
245 // 删除数据定价
246 export const deletePrice = (params) => {
247 return request({
248 url: `${import.meta.env.VITE_API_NEW_PORTAL}/pricing-data/delete`,
249 method: "delete",
250 data: params,
251 });
252 };
253
254 // 获取数据资源目录
255 export const getDamCatalogList = (params) => {
256 return request({
257 url: `${import.meta.env.VITE_API_NEW_PORTAL}/dam-catalog-table/get-table-select-new`,
258 method: "get",
259 params,
260 });
261 };
262
263 // 获取模型相关需求表
264 export const getModelDemand = (params) => {
265 return request({
266 url: `${import.meta.env.VITE_API_NEW_PORTAL}/pricing-data/pricing-model`,
267 method: "get",
268 params,
269 });
270 };
271
272 // 获取质量模型评分
273 export const getModelScore = (params) => {
274 return request({
275 url: `${import.meta.env.VITE_APP_QUALITY_BASEURL}/quality-analysis-report/get-quality-score-by-dam-guid-v2`,
276 method: "get",
277 params,
278 });
279 };
280
281 export const exportModelScore = (params) => {
282 return request({
283 url: `${import.meta.env.VITE_API_NEW_PORTAL}/pricing-data/download-template`,
284 method: "post",
285 data: params,
286 responseType: 'blob'
287 });
288 };
...@@ -303,3 +303,10 @@ export const getCurrentUserInfo = (params) => { ...@@ -303,3 +303,10 @@ export const getCurrentUserInfo = (params) => {
303 params 303 params
304 }); 304 });
305 }; 305 };
306
307 /** 下载文件模板 */
308 export const exportTemplate = (params) => request({
309 url: `${import.meta.env.VITE_APP_ADD_FILE}/import-config/export-template?bizGuid=${params.bizGuid}&importType=${params.importType}`,
310 method: 'post',
311 responseType: 'blob'
312 });
......
...@@ -1182,3 +1182,12 @@ ...@@ -1182,3 +1182,12 @@
1182 max-width: 100%; 1182 max-width: 100%;
1183 } 1183 }
1184 } 1184 }
1185
1186 .el-drawer__title {
1187 font-size: 18px;
1188 color: #212121;
1189 }
1190 .el-form-item--default .el-form-item__label {
1191 height: 26px;
1192 line-height: 26px;
1193 }
...\ No newline at end of file ...\ No newline at end of file
......
...@@ -44,6 +44,7 @@ const emits = defineEmits([ ...@@ -44,6 +44,7 @@ const emits = defineEmits([
44 "uploadBtnClick", 44 "uploadBtnClick",
45 "beforeUPload", 45 "beforeUPload",
46 "uploadFile", 46 "uploadFile",
47 'deleteFile',
47 "onUpload", 48 "onUpload",
48 "scheduleChange", 49 "scheduleChange",
49 "cascaderChange", 50 "cascaderChange",
...@@ -668,7 +669,7 @@ defineExpose({ ...@@ -668,7 +669,7 @@ defineExpose({
668 <template v-else-if="con.type.indexOf('upload') > -1"> 669 <template v-else-if="con.type.indexOf('upload') > -1">
669 <UploadFiles ref="formUploadRef" :upload-info="con.uploadInfo" @onUpload="onUpload" 670 <UploadFiles ref="formUploadRef" :upload-info="con.uploadInfo" @onUpload="onUpload"
670 @beforeUPload="beforeUPload" @uploadFile="uploadFile" @uploadBtnClick="uploadBtnClick" 671 @beforeUPload="beforeUPload" @uploadFile="uploadFile" @uploadBtnClick="uploadBtnClick"
671 @cascaderChange="cascaderChange" @selectChange="uploadSelectChange" /> 672 @cascaderChange="cascaderChange" @selectChange="uploadSelectChange" @deleteFile="() => emits('deleteFile')"/>
672 </template> 673 </template>
673 <template v-else> 674 <template v-else>
674 <div v-if="con.formInfo.tools"> 675 <div v-if="con.formInfo.tools">
......
...@@ -458,3 +458,7 @@ const drawerClose = () => { ...@@ -458,3 +458,7 @@ const drawerClose = () => {
458 } 458 }
459 } 459 }
460 </style> 460 </style>
461
462 <style lang="scss">
463
464 </style>
......
...@@ -70,7 +70,15 @@ const onMouseOver = (str) => { ...@@ -70,7 +70,15 @@ const onMouseOver = (str) => {
70 </script> 70 </script>
71 71
72 <template> 72 <template>
73 <el-tooltip class="item" placement="top" effect="light" :popper-class="popperClass ?? 'table_tooltip'" :disabled="isShowTooltip" :open-delay="400" :content="content"> 73 <el-tooltip
74 class="item"
75 placement="top"
76 effect="light"
77 :popper-class="popperClass ?? 'table_tooltip'"
78 :disabled="isShowTooltip"
79 :open-delay="400"
80 :content="content"
81 >
74 <p class="over-flow" :class="className" @mouseover="onMouseOver(refName)"> 82 <p class="over-flow" :class="className" @mouseover="onMouseOver(refName)">
75 <span :ref="(el) => setRefMap(el, refName)" v-html="content || '-'"></span> 83 <span :ref="(el) => setRefMap(el, refName)" v-html="content || '-'"></span>
76 </p> 84 </p>
...@@ -91,4 +99,10 @@ const onMouseOver = (str) => { ...@@ -91,4 +99,10 @@ const onMouseOver = (str) => {
91 p { 99 p {
92 margin: 0; 100 margin: 0;
93 } 101 }
102 </style>
103
104 <style lang="scss">
105 .el-popper.tree-popper {
106 max-width: 280px!important;
107 }
94 </style> 108 </style>
...\ No newline at end of file ...\ No newline at end of file
......
...@@ -741,6 +741,7 @@ onMounted(() => { ...@@ -741,6 +741,7 @@ onMounted(() => {
741 toolRef.value.isFull = true 741 toolRef.value.isFull = true
742 } 742 }
743 }, 500) 743 }, 500)
744 return;
744 } 745 }
745 const container: any = containerRef.value; 746 const container: any = containerRef.value;
746 const width = container.clientWidth; 747 const width = container.clientWidth;
......
1 <script lang="ts" setup name="topbar">
2 import { ref, watch } from 'vue';
3
4 const props = defineProps({
5 isGraphDisplay: {
6 type: Boolean,
7 default: true
8 },
9 });
10
11 const isGraph = ref(false);
12
13 watch(() => props.isGraphDisplay, (val) => {
14 isGraph.value = val;
15 }, {
16 immediate: true
17 })
18
19 const emits = defineEmits(["displaySwitchChange"]);
20
21 const switchChange = (val) => {
22 isGraph.value = val
23 emits('displaySwitchChange', val);
24 }
25
26 </script>
27
28 <template>
29 <div className='g6-component-topbar-content'>
30 <div :class="isGraph ? 'selected g6-component-topbar-item' : 'g6-component-topbar-item'" @click="switchChange(true)">
31 关系网
32 </div>
33 <div :class="!isGraph ? 'selected g6-component-topbar-item' : 'g6-component-topbar-item'" @click="switchChange(false)">
34 桑基图
35 </div>
36 </div>
37 </template>
38
39 <style scoped lang="scss">
40 .g6-component-topbar-content {
41 display: flex;
42 flex-direction: row;
43 justify-content: center;
44 align-items: center;
45 background: #fff;
46 border: 1px solid var(--el-color-primary);
47 border-radius: 32px;
48 padding: 4px;
49 width: 138px;
50 height: 32px;
51 }
52
53 .g6-component-topbar-item {
54 width: 50%;
55 height: 100%;
56 display: flex;
57 align-items: center;
58 justify-content: center;
59 font-size: 14px;
60 color: #999999;
61 cursor: pointer;
62
63 &.selected {
64 background: #4FA1A4;
65 border-radius: 32px;
66 color: #fff;
67 }
68 }
69 </style>
...\ No newline at end of file ...\ No newline at end of file
...@@ -248,6 +248,7 @@ onMounted(() => { ...@@ -248,6 +248,7 @@ onMounted(() => {
248 :show-header="props.tableInfo.showHeader ?? true" stripe :border="props.tableInfo.border 248 :show-header="props.tableInfo.showHeader ?? true" stripe :border="props.tableInfo.border
249 ?? true" :height="props.tableInfo.height === null ? null : (props.tableInfo.height ?? '100%')" 249 ?? true" :height="props.tableInfo.height === null ? null : (props.tableInfo.height ?? '100%')"
250 :max-height="maxHeight" :row-key="rowKey" :current-row-key="currentRowKey" :row-class-name="rowClassName" 250 :max-height="maxHeight" :row-key="rowKey" :current-row-key="currentRowKey" :row-class-name="rowClassName"
251 :tree-props="props.tableInfo.treeProps" :default-expand-all="props.tableInfo.expandAll ?? false"
251 :expand-row-keys="props.tableInfo.expandedKey" v-loading="tableDataLoading" @row-click="rowClick" 252 :expand-row-keys="props.tableInfo.expandedKey" v-loading="tableDataLoading" @row-click="rowClick"
252 @row-dblclick="rowDblClick" @selection-change="selectionChange" @select="tableCheckboxSelectChange" 253 @row-dblclick="rowDblClick" @selection-change="selectionChange" @select="tableCheckboxSelectChange"
253 @select-all="tableCheckboxAllSelectChange" style="width: 100%; display: inline-block" 254 @select-all="tableCheckboxAllSelectChange" style="width: 100%; display: inline-block"
...@@ -375,7 +376,7 @@ onMounted(() => { ...@@ -375,7 +376,7 @@ onMounted(() => {
375 <template #default="scope" v-else-if="item.type == 'approveTag'"> 376 <template #default="scope" v-else-if="item.type == 'approveTag'">
376 <el-tag v-if="scope.row[item.field]" :type="tagType(scope.row.approveVO, 'approveState')">{{ 377 <el-tag v-if="scope.row[item.field]" :type="tagType(scope.row.approveVO, 'approveState')">{{
377 tagMethod(scope.row.approveVO, 'approveState') 378 tagMethod(scope.row.approveVO, 'approveState')
378 }}</el-tag> 379 }}</el-tag>
379 <span v-else>{{ '--' }}</span> 380 <span v-else>{{ '--' }}</span>
380 </template> 381 </template>
381 <template #default="scope" v-else-if="item.type == 'tooltip'"> 382 <template #default="scope" v-else-if="item.type == 'tooltip'">
...@@ -480,7 +481,7 @@ onMounted(() => { ...@@ -480,7 +481,7 @@ onMounted(() => {
480 </template> 481 </template>
481 <template #default="scope" v-else-if="item.type == 'stepsBar'"> 482 <template #default="scope" v-else-if="item.type == 'stepsBar'">
482 <div :class="item.className" v-if="item.stepsInfo(scope)"> 483 <div :class="item.className" v-if="item.stepsInfo(scope)">
483 <StepBar :steps-info="item.stepsInfo(scope)" /> 484 <StepBar :steps-info="item.stepsInfo(scope)" />
484 </div> 485 </div>
485 <span v-else>--</span> 486 <span v-else>--</span>
486 </template> 487 </template>
......
...@@ -42,20 +42,20 @@ const checkKeys = computed(() => { ...@@ -42,20 +42,20 @@ const checkKeys = computed(() => {
42 return props.treeInfo.checkedKey ?? [] 42 return props.treeInfo.checkedKey ?? []
43 }); 43 });
44 const currentNodeKey = computed(() => { 44 const currentNodeKey = computed(() => {
45 // if (props.treeInfo.currentNodeKey) { 45 if (props.treeInfo.currentNodeKey) {
46 // nextTick(() => { 46 nextTick(() => {
47 // let domItems = treeRef.value?.$el.getElementsByClassName('el-tree-node'); 47 let domItems = treeRef.value?.$el.getElementsByClassName('el-tree-node');
48 // let clientHeight = treeRef.value?.$el.clientHeight; 48 let clientHeight = treeRef.value?.$el.clientHeight;
49 // for (const item of domItems) { 49 for (const item of domItems) {
50 // if (item.getAttribute('data-key') == props.treeInfo.currentNodeKey) { 50 if (item.getAttribute('data-key') == props.treeInfo.currentNodeKey) {
51 // if (item.offsetTop > clientHeight) { 51 if (item.offsetTop > clientHeight) {
52 // item.scrollIntoView({ block: "end", inline: "nearest" }); 52 item.scrollIntoView({ block: "end", inline: "nearest" });
53 // } 53 }
54 // break; 54 break;
55 // } 55 }
56 // } 56 }
57 // }) 57 })
58 // } 58 }
59 return props.treeInfo.currentNodeKey ?? '' 59 return props.treeInfo.currentNodeKey ?? ''
60 }); 60 });
61 const customInfo = computed(() => { 61 const customInfo = computed(() => {
...@@ -70,6 +70,9 @@ const editTreeItem = computed(() => { ...@@ -70,6 +70,9 @@ const editTreeItem = computed(() => {
70 const expendAll = computed(() => { 70 const expendAll = computed(() => {
71 return props.treeInfo.expendAll ?? false 71 return props.treeInfo.expendAll ?? false
72 }) 72 })
73 const ellipsis = computed(() => {
74 return props.treeInfo.ellipsis ?? true
75 })
73 76
74 interface Tree { 77 interface Tree {
75 [key: string]: any; 78 [key: string]: any;
...@@ -182,6 +185,21 @@ const appendChildren = (key, data) => { ...@@ -182,6 +185,21 @@ const appendChildren = (key, data) => {
182 185
183 const visibleNodes = ref({}); //解决点击树item,下拉菜单不消失的问题,原因是树的点击事件阻止冒泡了。 186 const visibleNodes = ref({}); //解决点击树item,下拉菜单不消失的问题,原因是树的点击事件阻止冒泡了。
184 187
188 function formatNodeLabel (node) {
189 let sliceLength = 8
190 switch (node.level) {
191 case 2:
192 sliceLength = 9
193 break
194 case 3:
195 sliceLength = 6
196 break
197 case 4:
198 sliceLength = 6
199 break
200 }
201 return node.label.slice(0, sliceLength)
202 }
185 defineExpose({ 203 defineExpose({
186 getCheckedNodes, 204 getCheckedNodes,
187 getCheckedKeys, 205 getCheckedKeys,
...@@ -225,8 +243,14 @@ defineExpose({ ...@@ -225,8 +243,14 @@ defineExpose({
225 </span> 243 </span>
226 <template v-else-if="editTreeItem && data.showEdit !== false"> 244 <template v-else-if="editTreeItem && data.showEdit !== false">
227 <span class="list-item-text"> 245 <span class="list-item-text">
228 <ellipsis-tooltip v-if="!customInfo" :content="node.label" class-name="w100f" 246 <template v-if="!ellipsis">
247 <span>{{ formatNodeLabel(node) }}</span>
248 </template>
249 <template v-else>
250 <ellipsis-tooltip v-if="!customInfo" :content="node.label" class-name="w100f" popper-class="tree-popper"
229 :refName="'tooltipOver' + node.id"></ellipsis-tooltip> 251 :refName="'tooltipOver' + node.id"></ellipsis-tooltip>
252 </template>
253
230 </span> 254 </span>
231 <div class="tags-list-right" :class="visibleNodes[node.data.guid] ? 'active' : ''"> 255 <div class="tags-list-right" :class="visibleNodes[node.data.guid] ? 'active' : ''">
232 <el-popover v-model:visible="visibleNodes[node.data.guid]" placement="bottom" width="96" trigger="click" 256 <el-popover v-model:visible="visibleNodes[node.data.guid]" placement="bottom" width="96" trigger="click"
......
...@@ -4,7 +4,7 @@ import { ElMessage, genFileId } from "element-plus"; ...@@ -4,7 +4,7 @@ import { ElMessage, genFileId } from "element-plus";
4 import { Plus, Download, Upload, } from "@element-plus/icons-vue"; 4 import { Plus, Download, Upload, } from "@element-plus/icons-vue";
5 import type { UploadRawFile } from 'element-plus' 5 import type { UploadRawFile } from 'element-plus'
6 6
7 const emits = defineEmits(["onUpload", "beforeUPload", "uploadFile", "uploadBtnClick", "cascaderChange", "selectChange"]); 7 const emits = defineEmits(["onUpload", "beforeUPload", "uploadFile", "uploadBtnClick", "cascaderChange", "selectChange", 'deleteFile']);
8 const props = defineProps({ 8 const props = defineProps({
9 uploadInfo: { 9 uploadInfo: {
10 type: Object, 10 type: Object,
...@@ -75,6 +75,7 @@ const btnClick = (file, type) => { ...@@ -75,6 +75,7 @@ const btnClick = (file, type) => {
75 if (type == 'remove') { 75 if (type == 'remove') {
76 const fileUpload = fileUploadRef.value[0] || fileUploadRef.value 76 const fileUpload = fileUploadRef.value[0] || fileUploadRef.value
77 fileUpload?.handleRemove(file) 77 fileUpload?.handleRemove(file)
78 emits('deleteFile')
78 } else if (type == 'upload') { 79 } else if (type == 'upload') {
79 file.show = false 80 file.show = false
80 emits('uploadFile', file) 81 emits('uploadFile', file)
...@@ -111,13 +112,16 @@ defineExpose({ ...@@ -111,13 +112,16 @@ defineExpose({
111 <p class="item_title">{{ item.title }}</p> 112 <p class="item_title">{{ item.title }}</p>
112 <div class="form_item" v-if="item.type == 'select'"> 113 <div class="form_item" v-if="item.type == 'select'">
113 <span class="item_label" :class="{ required_mark: item.selectInfo.required }">{{ item.selectInfo.label 114 <span class="item_label" :class="{ required_mark: item.selectInfo.required }">{{ item.selectInfo.label
114 }}:</span> 115 }}:</span>
115 <el-select v-model="extraParams[item.selectInfo.field]" :placeholder="item.selectInfo.placeholder" 116 <el-select v-model="extraParams[item.selectInfo.field]" :placeholder="item.selectInfo.placeholder"
116 :disabled="item.selectInfo.disabled" @change="selectChange"> 117 :disabled="item.selectInfo.disabled" @change="selectChange" :filterable="item.selectInfo.filterable" :style="item.selectInfo.style">
117 <el-option v-for="opts in item.selectInfo.options" :label="opts.label" :value="opts.value" /> 118 <el-option v-for="opts in item.selectInfo.options"
119 :label="item.selectInfo.props?.label ? opts[item.selectInfo.props.label] : opts.label"
120 :value="item.selectInfo.props?.value ? opts[item.selectInfo.props.value] : opts.value"
121 :disabled="opts.disabled" />
118 </el-select> 122 </el-select>
119 </div> 123 </div>
120 <div class="form_item" v-if="item.type == 'tree-select'"> 124 <div class="form_item" v-else-if="item.type == 'tree-select'">
121 <span class="item_label" :class="{ required_mark: item.selectInfo.required }">{{ item.selectInfo.label 125 <span class="item_label" :class="{ required_mark: item.selectInfo.required }">{{ item.selectInfo.label
122 }}:</span> 126 }}:</span>
123 <el-tree-select 127 <el-tree-select
...@@ -176,7 +180,7 @@ defineExpose({ ...@@ -176,7 +180,7 @@ defineExpose({
176 </el-button> 180 </el-button>
177 </div> 181 </div>
178 <el-upload v-else ref="fileUploadRef" class="upload_panel" :class="[props.uploadInfo.col]" 182 <el-upload v-else ref="fileUploadRef" class="upload_panel" :class="[props.uploadInfo.col]"
179 v-model:file-list="fileList" :action="item.uploadInfo.action" :auto-upload="item.uploadInfo.auto ?? ''" 183 v-model:file-list="fileList" :action="item.uploadInfo.action ?? ''" :auto-upload="item.uploadInfo.auto ?? ''"
180 :drag="item.uploadInfo.drag ?? false" :accept="item.uploadInfo.accept" :limit="item.uploadInfo.limit ?? 1" 184 :drag="item.uploadInfo.drag ?? false" :accept="item.uploadInfo.accept" :limit="item.uploadInfo.limit ?? 1"
181 :on-change="onUpload" :on-exceed="val => exceedFile(val, item.uploadInfo.cover ?? false)" 185 :on-change="onUpload" :on-exceed="val => exceedFile(val, item.uploadInfo.cover ?? false)"
182 :on-error="handleError" :on-success="handleSuccess" :before-upload="beforeUPload" 186 :on-error="handleError" :on-success="handleSuccess" :before-upload="beforeUPload"
......
...@@ -4,6 +4,7 @@ import { useRouter } from "vue-router"; ...@@ -4,6 +4,7 @@ import { useRouter } from "vue-router";
4 import useUserStore from "@/store/modules/user"; 4 import useUserStore from "@/store/modules/user";
5 import useKeepAliveStore from '@/store/modules/keepAlive' 5 import useKeepAliveStore from '@/store/modules/keepAlive'
6 import { ElMessageBox, ElMessage } from "element-plus"; 6 import { ElMessageBox, ElMessage } from "element-plus";
7 import { isEqual } from "lodash-es";
7 8
8 const router = useRouter(); 9 const router = useRouter();
9 const route = useRoute(); 10 const route = useRoute();
...@@ -26,7 +27,7 @@ watch( ...@@ -26,7 +27,7 @@ watch(
26 if (tab.fullPath.includes(jionPath)) { 27 if (tab.fullPath.includes(jionPath)) {
27 pathIndex.value = index 28 pathIndex.value = index
28 } 29 }
29 return tab.fullPath === newRouter.fullPath; 30 return tab.fullPath === newRouter.fullPath || (tab.path == newRouter.path && isEqual(tab.query, newRouter.query));
30 }); 31 });
31 if (isExist.length == 0) { 32 if (isExist.length == 0) {
32 if (pathIndex.value != -1 && routerLength > 3) { 33 if (pathIndex.value != -1 && routerLength > 3) {
...@@ -45,11 +46,8 @@ watch( ...@@ -45,11 +46,8 @@ watch(
45 46
46 } 47 }
47 } 48 }
48 list.map(item => {
49 item.fullPath = item.fullPath;
50 })
51 tabbarList.value = list; 49 tabbarList.value = list;
52 tabbarActive.value = newRouter.fullPath; 50 tabbarActive.value = isExist[0]?.fullPath || newRouter.fullPath;
53 userStore.setTabbar(tabbarList.value); 51 userStore.setTabbar(tabbarList.value);
54 userStore.setActiveTabbar(combPath, newRouter.fullPath); 52 userStore.setActiveTabbar(combPath, newRouter.fullPath);
55 }, 53 },
...@@ -58,7 +56,7 @@ watch( ...@@ -58,7 +56,7 @@ watch(
58 const changeTab = (pane: any, ev: any) => { 56 const changeTab = (pane: any, ev: any) => {
59 const tabIndex = Number(pane.index); 57 const tabIndex = Number(pane.index);
60 const paneData: any = tabbarList.value[tabIndex]; 58 const paneData: any = tabbarList.value[tabIndex];
61 if (paneData.name == 'budgetDataIndex' || paneData.name == 'iframePage') { 59 if (paneData.name == 'budgetDataIndex' || paneData.name == 'iframePage' || paneData.name == 'portraitMap' || paneData.name == 'portraitMaps') {
62 router.push(paneData.fullPath); 60 router.push(paneData.fullPath);
63 } else { 61 } else {
64 router.push({ 62 router.push({
......
...@@ -144,7 +144,7 @@ const routes: RouteRecordRaw[] = [ ...@@ -144,7 +144,7 @@ const routes: RouteRecordRaw[] = [
144 { 144 {
145 path: 'budgetDataIndex', 145 path: 'budgetDataIndex',
146 name: 'budgetDataIndex', 146 name: 'budgetDataIndex',
147 component: () => import('@/views/data_catalog/budgetDataIndex.vue'), 147 component: () => import('@/views/data_meta/budgetDataIndex.vue'),
148 meta: { 148 meta: {
149 title: '', 149 title: '',
150 // sidebar: false, 150 // sidebar: false,
...@@ -155,7 +155,7 @@ const routes: RouteRecordRaw[] = [ ...@@ -155,7 +155,7 @@ const routes: RouteRecordRaw[] = [
155 } 155 }
156 ] 156 ]
157 }, 157 },
158 { 158 {
159 path: '/data-meta/reports', 159 path: '/data-meta/reports',
160 component: Layout, 160 component: Layout,
161 meta: { 161 meta: {
...@@ -166,7 +166,7 @@ const routes: RouteRecordRaw[] = [ ...@@ -166,7 +166,7 @@ const routes: RouteRecordRaw[] = [
166 { 166 {
167 path: 'iframePage', 167 path: 'iframePage',
168 name: 'iframePage', 168 name: 'iframePage',
169 component: () => import('@/views/data_catalog/budgetDataIndex.vue'), 169 component: () => import('@/views/data_meta/budgetDataIndex.vue'),
170 meta: { 170 meta: {
171 title: '', 171 title: '',
172 sidebar: true, 172 sidebar: true,
...@@ -175,6 +175,19 @@ const routes: RouteRecordRaw[] = [ ...@@ -175,6 +175,19 @@ const routes: RouteRecordRaw[] = [
175 reuse: true, 175 reuse: true,
176 activeMenu: '/data-meta/reports/iframePage', 176 activeMenu: '/data-meta/reports/iframePage',
177 }, 177 },
178 },
179 {
180 path: 'portraitMaps',
181 name: 'portraitMaps',
182 component: () => import('@/views/data_meta/portraitMap.vue'),
183 meta: {
184 title: '全景地图',
185 sidebar: true,
186 breadcrumb: false,
187 cache: true,
188 reuse: true,
189 activeMenu: '/data-meta/reports/portraitMaps',
190 },
178 } 191 }
179 ] 192 ]
180 }, 193 },
...@@ -199,6 +212,119 @@ const routes: RouteRecordRaw[] = [ ...@@ -199,6 +212,119 @@ const routes: RouteRecordRaw[] = [
199 }, 212 },
200 } 213 }
201 ] 214 ]
215 },
216 {
217 path: '/data-meta/metadata-standard',
218 component: Layout,
219 meta: { title: '元数据标准', icon: 'ep:grid' },
220 children: [
221 {
222 path: '',
223 name: 'metadataStandard',
224 component: () => import('@/views/data_meta/standard.vue'),
225 meta: {
226 title: '元数据标准管理',
227 breadcrumb: false,
228 cache: true
229 }
230 },
231 {
232 path: 'standard-query',
233 name: 'metadataStandardQuery',
234 component: () => import('@/views/data_meta/standard-query.vue'),
235 meta: {
236 title: '元数据标准查询',
237 breadcrumb: false,
238 cache: true
239 }
240 },
241 {
242 path: 'standard-query-view',
243 name: 'metadataStandardQueryView',
244 component: () => import('@/views/data_meta/standard-query-view.vue'),
245 meta: {
246 title: '元数据标准查看',
247 breadcrumb: false,
248 cache: true,
249 activeMenu: '/data-meta/metadata-standard'
250 },
251 beforeEnter: (to, from) => {
252 if (to.query.name) {
253 to.meta.title = `元数据标准查看-${to.query.name}`;
254 }
255 }
256 },
257 {
258 path: 'table-create-manual',
259 name: 'tableCreateManual',
260 component: () => import('@/views/data_meta/tableCreateManual.vue'),
261 meta: {
262 title: '新建表',
263 sidebar: false,
264 breadcrumb: false,
265 cache: true,
266 reuse: true,
267 activeMenu: '/data-meta/metadata-standard/standard-query'
268 },
269 beforeEnter: (to, from) => {
270 if (to.query.domainName) {
271 to.meta.title = `新建表(${to.query.domainName})-${to.query.standardName}`;
272 to.meta.editPage = true;
273 }
274 }
275 },
276 {
277 path: 'dim-table-create-manual',
278 name: 'dimTableCreateManual',
279 component: () => import('@/views/data_meta/dimTableCreateManual.vue'),
280 meta: {
281 title: '新建表',
282 sidebar: false,
283 breadcrumb: false,
284 cache: true,
285 reuse: true,
286 activeMenu: '/data-meta/metadata-standard/standard-query'
287 },
288 beforeEnter: (to, from) => {
289 if (to.query.domainName) {
290 to.meta.title = `新建表(${to.query.domainName})-${to.query.standardName}`;
291 to.meta.editPage = true;
292 }
293 }
294 },
295 {
296 path: 'standard-codetable',
297 name: 'metadataStandardCodetable',
298 component: () => import('@/views/data_meta/standard-codetable.vue'),
299 meta: {
300 title: '标准代码表',
301 breadcrumb: false,
302 cache: true
303 }
304 },
305 {
306 path: 'standard-import',
307 name: 'metadataStandardImport',
308 component: () => import('@/views/data_meta/standard-import.vue'),
309 meta: {
310 title: '标准代码导入',
311 breadcrumb: false,
312 cache: true,
313 activeMenu: '/data-meta/metadata-standard/standard-codetable'
314 }
315 },
316 {
317 path: 'standard-meta-import',
318 name: 'standardMetaImport',
319 component: () => import('@/views/data_meta/standard-meta-import.vue'),
320 meta: {
321 title: '元数据标准导入',
322 breadcrumb: false,
323 cache: true,
324 activeMenu: '/data-meta/metadata-standard'
325 }
326 }
327 ]
202 } 328 }
203 ] 329 ]
204 330
......
1 import type { RouteRecordRaw } from 'vue-router'
2
3 function Layout() {
4 return import('@/layouts/index.vue')
5 }
6
7 const routes: RouteRecordRaw[] = [
8 {
9 path: '/data-pricing/pricing-manage',
10 component: Layout,
11 meta: {
12 title: '定价管理',
13 icon: 'ep:grid',
14 },
15 children: [
16 {
17 path: 'demand-manage',
18 name: 'demandManage',
19 component: () => import('@/views/data_pricing/demandManage.vue'),
20 meta: {
21 title: '需求表管理',
22 breadcrumb: false,
23 cache: true
24 },
25 },
26 {
27 path: 'import-file-demand-manage',
28 name: 'importFileDemandManage',
29 component: () => import('@/views/importFile.vue'),
30 meta: {
31 title: '导入数据-需求表管理',
32 sidebar: false,
33 breadcrumb: false,
34 cache: true,
35 reuse: true,
36 activeMenu: '/data-pricing/pricing-manage/demand-manage'
37 }
38 },
39 {
40 path: 'disease-manage',
41 name: 'diseaseManage',
42 component: () => import('@/views/data_pricing/diseaseManage.vue'),
43 meta: {
44 title: '疾病管理',
45 breadcrumb: false,
46 cache: true
47 },
48 },
49 {
50 path: 'import-file-disease',
51 name: 'importFileDisease',
52 component: () => import('@/views/importFile.vue'),
53 meta: {
54 title: '导入数据-疾病管理',
55 sidebar: false,
56 breadcrumb: false,
57 cache: true,
58 reuse: true,
59 activeMenu: '/data-pricing/pricing-manage/disease-manage'
60 }
61 },
62 {
63 path: 'price-config',
64 name: 'priceConfig',
65 component: () => import('@/views/data_pricing/priceConfig.vue'),
66 meta: {
67 title: '定价配置',
68 breadcrumb: false,
69 cache: true
70 },
71 },
72 {
73 path: 'price-model',
74 name: 'priceModel',
75 component: () => import('@/views/data_pricing/priceModel.vue'),
76 meta: {
77 title: '新增配置',
78 sidebar: false,
79 breadcrumb: false,
80 cache: true,
81 reuse: true,
82 editPage: true,
83 activeMenu: '/data-pricing/pricing-manage/price-config'
84 },
85 beforeEnter: (to, from) => {
86 if (to.query.guid) {
87 to.meta.title = `编辑-${to.query.name}`;
88 } else {
89 to.meta.title = `新增配置`;
90 }
91 }
92 },
93 {
94 path: 'price-calculate',
95 name: 'priceCalculate',
96 component: () => import('@/views/data_pricing/priceCalculate.vue'),
97 meta: {
98 title: '数据定价',
99 breadcrumb: false,
100 cache: true
101 }
102 },
103 {
104 path: 'calculate-config',
105 name: 'calculateConfig',
106 component: () => import('@/views/data_pricing/calculateConfig.vue'),
107 meta: {
108 title: '新增数据定价',
109 sidebar: false,
110 breadcrumb: false,
111 cache: true,
112 reuse: true,
113 editPage: true,
114 activeMenu: '/data-pricing/pricing-manage/price-calculate'
115 },
116 beforeEnter: (to, from) => {
117 if (to.query.guid) {
118 to.meta.title = `编辑-${to.query.name}`;
119 } else {
120 to.meta.title = `新增数据定价`;
121 }
122 }
123 },
124 ],
125 },
126 ]
127
128 export default routes
...@@ -10,6 +10,7 @@ import DataTrustedSpace from './modules/dataTrustedSpace'; ...@@ -10,6 +10,7 @@ import DataTrustedSpace from './modules/dataTrustedSpace';
10 import DataAssetRegistry from './modules/dataAssetRegistry'; 10 import DataAssetRegistry from './modules/dataAssetRegistry';
11 import DataEntry from './modules/dataEntry'; 11 import DataEntry from './modules/dataEntry';
12 import SecurityMenu from './modules/securityMenu'; 12 import SecurityMenu from './modules/securityMenu';
13 import DataPricing from './modules/dataPricing';
13 14
14 import useSettingsStore from '@/store/modules/settings' 15 import useSettingsStore from '@/store/modules/settings'
15 16
...@@ -110,9 +111,10 @@ const asyncRoutes: RouteRecordRaw[] = [ ...@@ -110,9 +111,10 @@ const asyncRoutes: RouteRecordRaw[] = [
110 ...DataEntry, 111 ...DataEntry,
111 ...SecurityMenu, 112 ...SecurityMenu,
112 ...DataMeta, 113 ...DataMeta,
113 ...DataQuality, 114 ...DataQuality,
114 ...DataInventory, 115 ...DataInventory,
115 ...DataTrustedSpace 116 ...DataTrustedSpace,
117 ...DataPricing
116 ] 118 ]
117 119
118 const constantRoutesByFilesystem = generatedRoutes.filter((item) => { 120 const constantRoutesByFilesystem = generatedRoutes.filter((item) => {
......
...@@ -174,7 +174,10 @@ const useMenuStore = defineStore( ...@@ -174,7 +174,10 @@ const useMenuStore = defineStore(
174 else { 174 else {
175 // 如果是 string 类型,则认为是路由,需要查找对应的主导航索引 175 // 如果是 string 类型,则认为是路由,需要查找对应的主导航索引
176 const findIndex = allMenus.value.findIndex(item => item.children.some(r => { 176 const findIndex = allMenus.value.findIndex(item => item.children.some(r => {
177 if ((data== "/data-meta/reports/iframePage" || data== "/data-meta/report/budgetDataIndex") && r.path?.includes('/data-meta/report')) { 177 if ((data== "/data-meta/reports/iframePage" || data == '/data-meta/reports/portraitMaps' || data== "/data-meta/report/budgetDataIndex") && r.path?.includes('/data-meta/report')) {
178 return true;
179 }
180 if (data== "/data-meta/portraitMap" && r.path?.includes('/data-meta/portraitMap')) {
178 return true; 181 return true;
179 } 182 }
180 if (data== "/data-meta/portraitMap" && r.path?.includes('/data-meta/portraitMap')) { 183 if (data== "/data-meta/portraitMap" && r.path?.includes('/data-meta/portraitMap')) {
......
...@@ -157,7 +157,7 @@ const useRouteStore = defineStore( ...@@ -157,7 +157,7 @@ const useRouteStore = defineStore(
157 }; 157 };
158 } 158 }
159 r = routes.find((route: any) => { 159 r = routes.find((route: any) => {
160 return route.path === path || route.path === m.path || `/${route.path}` === m.path || ((path.includes('budgetDataIndex') && path.includes('/data-meta/report') && route.path.includes('/data-meta/report')) || (path.includes('iframePage') && path.includes('/data-meta/report')) || (path.includes('/data-meta/portraitMap') && route.path.includes('/data-meta/portraitMap'))); 160 return route.path === path || route.path === m.path || `/${route.path}` === m.path || ((path.includes('budgetDataIndex') && path.includes('/data-meta/report') && route.path.includes('/data-meta/report')) || (path.includes('iframePage') && path.includes('/data-meta/report')) || (path.includes('portraitMaps') && path.includes('/data-meta/report')) || (path.includes('/data-meta/portraitMap') && route.path.includes('/data-meta/portraitMap')));
161 }); 161 });
162 if (r && (path.includes('budgetDataIndex') || path.includes('iframePage')) || path.includes('portraitMap')) { 162 if (r && (path.includes('budgetDataIndex') || path.includes('iframePage')) || path.includes('portraitMap')) {
163 r.path = path; 163 r.path = path;
......
...@@ -27,6 +27,7 @@ declare module '@vue/runtime-core' { ...@@ -27,6 +27,7 @@ declare module '@vue/runtime-core' {
27 FileUpload: typeof import('./../components/FileUpload/index.vue')['default'] 27 FileUpload: typeof import('./../components/FileUpload/index.vue')['default']
28 FixedActionBar: typeof import('./../components/FixedActionBar/index.vue')['default'] 28 FixedActionBar: typeof import('./../components/FixedActionBar/index.vue')['default']
29 Form: typeof import('./../components/Form/index.vue')['default'] 29 Form: typeof import('./../components/Form/index.vue')['default']
30 GraphTopbar: typeof import('./../components/RelationNetwork/graphTopbar.vue')['default']
30 Hour: typeof import('./../components/Schedule/component/hour.vue')['default'] 31 Hour: typeof import('./../components/Schedule/component/hour.vue')['default']
31 ImagePreview: typeof import('./../components/ImagePreview/index.vue')['default'] 32 ImagePreview: typeof import('./../components/ImagePreview/index.vue')['default']
32 ImagesUpload: typeof import('./../components/ImagesUpload/index.vue')['default'] 33 ImagesUpload: typeof import('./../components/ImagesUpload/index.vue')['default']
...@@ -41,6 +42,7 @@ declare module '@vue/runtime-core' { ...@@ -41,6 +42,7 @@ declare module '@vue/runtime-core' {
41 PageNav: typeof import('./../components/PageNav/index.vue')['default'] 42 PageNav: typeof import('./../components/PageNav/index.vue')['default']
42 PcasCascader: typeof import('./../components/PcasCascader/index.vue')['default'] 43 PcasCascader: typeof import('./../components/PcasCascader/index.vue')['default']
43 Popover: typeof import('./../components/Popover/index.vue')['default'] 44 Popover: typeof import('./../components/Popover/index.vue')['default']
45 RelationNetwork: typeof import('./../components/RelationNetwork/index.vue')['default']
44 RouterLink: typeof import('vue-router')['RouterLink'] 46 RouterLink: typeof import('vue-router')['RouterLink']
45 RouterView: typeof import('vue-router')['RouterView'] 47 RouterView: typeof import('vue-router')['RouterView']
46 Schedule: typeof import('./../components/Schedule/index.vue')['default'] 48 Schedule: typeof import('./../components/Schedule/index.vue')['default']
......
...@@ -120,6 +120,9 @@ export const filterCascaderData = (data, field, val, type = 'disabled') => { ...@@ -120,6 +120,9 @@ export const filterCascaderData = (data, field, val, type = 'disabled') => {
120 } 120 }
121 // 数字千分位 保留两位小数 121 // 数字千分位 保留两位小数
122 export const changeNum = (num, fixed = 0, round = false) => { 122 export const changeNum = (num, fixed = 0, round = false) => {
123 if(num === '' || num === null || num === undefined){
124 return '';
125 }
123 num = parseFloat(num); 126 num = parseFloat(num);
124 if (round) { 127 if (round) {
125 let parts = num.toFixed(fixed).split(".") 128 let parts = num.toFixed(fixed).split(".")
......
...@@ -884,7 +884,7 @@ const matchEnValue = ref({ ...@@ -884,7 +884,7 @@ const matchEnValue = ref({
884 <div class="data-label"> 884 <div class="data-label">
885 <div class="container_wrap full flex"> 885 <div class="container_wrap full flex">
886 <div class="aside_wrap"> 886 <div class="aside_wrap">
887 <div class="aside_title">分类分级目录</div> 887 <div class="aside_title">分类分级模板</div>
888 <Tree :treeInfo="treeInfo" @nodeClick="nodeClick" @itemMenuClick="handleTreeItemMenuClick" /> 888 <Tree :treeInfo="treeInfo" @nodeClick="nodeClick" @itemMenuClick="handleTreeItemMenuClick" />
889 </div> 889 </div>
890 <div class="main_wrap"> 890 <div class="main_wrap">
......
...@@ -1293,6 +1293,7 @@ const loadDrawer = async () => { ...@@ -1293,6 +1293,7 @@ const loadDrawer = async () => {
1293 drawerInfo.value.footer.btns.at(-2).visible = false 1293 drawerInfo.value.footer.btns.at(-2).visible = false
1294 drawerInfo.value.footer.btns.at(-3).visible = false 1294 drawerInfo.value.footer.btns.at(-3).visible = false
1295 drawerInfo.value.visible = true 1295 drawerInfo.value.visible = true
1296 console.log('table', formTable.value)
1296 }; 1297 };
1297 1298
1298 const batching = (type) => { 1299 const batching = (type) => {
......
1 <template>
2 <div ref="containerRef" class='canvas-wrapper'>
3
4 </div>
5 </template>
6
7 <script lang="ts" setup name="topbar">
8 import { ref, watch } from 'vue';
9 import * as echarts from "echarts";
10
11 const props = defineProps({
12 treeData: {
13 type: Array<any>,
14 default: [
15 {
16 source: 'a',
17 target: 'a1',
18 value: 5
19 },
20 {
21 source: 'a',
22 target: 'a2',
23 value: 3
24 },
25 {
26 source: 'b',
27 target: 'b1',
28 value: 8
29 },
30 {
31 source: 'a',
32 target: 'b1',
33 value: 3
34 },
35 {
36 source: 'b1',
37 target: 'a1',
38 value: 1
39 },
40 {
41 source: 'b1',
42 target: 'c',
43 value: 2
44 }
45 ]
46 },
47 names: {
48 type: Array<any>,
49 default: [
50 {
51 name: 'a'
52 },
53 {
54 name: 'b'
55 },
56 {
57 name: 'a1'
58 },
59 {
60 name: 'a2'
61 },
62 {
63 name: 'b1'
64 },
65 {
66 name: 'c'
67 }
68 ]
69 }
70 })
71
72 watch(() => props.treeData, (val) => {
73 setChartsOption();
74 })
75
76 const sankeyInstance: any = ref();
77
78 const containerRef = ref();
79
80 const setChartsOption = () => {
81
82 let option = {
83 tooltip: {
84 trigger: 'item',
85 formatter: (params) => {
86 if (params.data.name) {
87 return null;
88 }
89 return params.data.source + ' > ' + params.data.target
90 }
91 },
92 color: ["#3DBCBE", "#6b67d1", "#7BBCE0", "#2B8EF3", "#51dca2", "#E19D46"],
93 series: [
94 {
95 type: 'sankey',
96 top: 60,
97 bottom: 20,
98 draggable: false,
99 left: 50,
100 emphasis: {
101 focus: 'trajectory'
102 },
103 labelLayout: {
104 hideOverlap: true,
105 },
106 right: 100,
107 label: {
108 fontSize: 10,
109 },
110 data: props.names?.map(n => {
111 if (n.isLast) {
112 return {
113 ...n,
114 label: {
115 width: 97,
116 overflow: 'breakAll'
117 }
118 }
119 }
120 return n;
121 }),
122 links: props.treeData,
123 lineStyle: {
124 color: 'source',
125 curveness: 0.5
126 },
127 }
128 ]
129 }
130 sankeyInstance.value.setOption(option);
131 sankeyInstance.value.resize();
132 }
133
134 const resizeObserver = ref();
135
136 const observeResize = () => {
137 window.addEventListener('resize', (e) => {
138 sankeyInstance.value?.resize();
139 });
140 }
141
142 onMounted(() => {
143 nextTick(() => {
144 sankeyInstance.value = echarts.init(containerRef.value);
145 setChartsOption();
146 observeResize();
147 })
148 })
149
150 </script>
151
152 <style lang="scss" scoped>
153 .canvas-wrapper {
154 width: 100%;
155 height: 100%;
156 position: relative;
157 }
158 </style>
...\ No newline at end of file ...\ No newline at end of file
1 <template>
2 <el-drawer
3 v-model="visible"
4 :title="title"
5 size="520px"
6 class="standard-meta-modal"
7 :close-on-click-modal="false"
8 >
9 <el-form
10 :model="form"
11 :rules="formRules"
12 ref="formEl"
13 style="min-height: 200px;"
14 require-asterisk-position="right"
15 v-loading="loading"
16 >
17 <el-row>
18 <el-col v-for="item,index in fields" :key="index" :span="12" style="padding-right:10px;">
19 <el-form-item :label="item.fileNameCodeName" :prop="item.fileNameCode">
20 <el-input
21 v-if="item.inputTypeCode == '1' || item.inputTypeCode == '3'"
22 v-model="form[item.fileNameCode]"
23 placeholder="请输入"
24 />
25 <el-select
26 v-else-if="item.inputTypeCode == '2'"
27 v-model="form[item.fileNameCode]"
28 filterable
29 clearable
30 placeholder="请选择"
31 >
32 <el-option v-for="op in formOptions[item.fileNameCode]" :label="op.label" :value="op.value" :key="op.value"></el-option>
33 </el-select>
34 <el-tree-select
35 v-else-if="item.inputTypeCode == '4'"
36 v-model="form[item.fileNameCode]"
37 :data="standardCodeTree"
38 :props="treeSelectProps"
39 placeholder="请选择"
40 filterable
41 clearable
42 />
43 </el-form-item>
44 </el-col>
45 </el-row>
46 </el-form>
47 <template #footer>
48 <div style="text-align:right">
49 <el-button @click="visible = false" :disabled="confirmLoading">取消</el-button>
50 <el-button type="primary" @click="confirm" :loading="confirmLoading">确认</el-button>
51 </div>
52 </template>
53 </el-drawer>
54 </template>
55
56 <script setup lang="ts">
57 import { watch } from 'vue'
58 import { ElMessage } from "element-plus";
59 import { getParamsList } from '@/api/modules/dataAsset'
60 import { saveMetaStandardDataFields, getMetaStandardFieldsDetail, getStandardCodeTree } from '@/api/modules/dataMetaService'
61
62 const { proxy } = getCurrentInstance() as any;
63 const props = defineProps({
64 modelValue: Boolean,
65 fields: {
66 type: Array,
67 default: () => ([])
68 },
69 metaStandardGuid: {
70 type: String,
71 default: ''
72 },
73 type: {
74 type: String,
75 default: 'add'
76 },
77 data: {
78 type: Object,
79 default: () => ({})
80 }
81 })
82 const emit = defineEmits(['update:modelValue', 'success', 'confirm'])
83 const visible = computed({
84 get() {
85 return props.modelValue;
86 },
87 set(val) {
88 emit('update:modelValue', val);
89 }
90 })
91 const title = computed(() => {
92 return props.type === 'add' ? '新增字段标准' : '编辑字段标准'
93 })
94
95 const formEl = ref()
96 const form = ref({})
97 const formRules = ref({})
98 const formOptions = ref({})
99 const detail = ref({})
100
101 async function initForm () {
102 const { fields, type, data } = props
103 console.log(data)
104 if (!fields) return
105 let formData = {}
106 let formRuleData = {}
107 let formOptionData = {}
108 let detailData:any = {}
109 if (type === 'edit') {
110 detailData = await getDetail()
111 detail.value = detailData
112 }
113 fields.forEach(async (item:any) => {
114 formData[item.fileNameCode] = type === 'add' ? '' : detailData.metaStandardValue[item.fileNameCode]
115 formRuleData[item.fileNameCode] = {
116 required: item.isNotnull === 'Y' ? true : false,
117 message: `缺少${item.fileNameCodeName}`
118 }
119 // formOptionData[item.fileNameCode] = await getOptions(item.dataTypeCode)
120 if (item.inputTypeCode == '2') {
121 formOptions.value[item.fileNameCode] = await getOptions(item.dataTypeCode)
122 }
123 })
124 // formOptions.value = formOptionData
125 form.value = formData
126 formRules.value = formRuleData
127 nextTick(() => formEl.value.clearValidate())
128 setTimeout(() => {
129 formEl.value.clearValidate()
130 }, 100)
131 }
132 function getOptions (dictType) {
133 return new Promise((resolve, reject) => {
134 getParamsList({ dictType }).then((res:any) => {
135 if (res.code === proxy.$passCode) {
136 resolve(res.data)
137 }
138 })
139 })
140 }
141 const loading = ref(false)
142 function getDetail () {
143 return new Promise((resolve) => {
144 loading.value = true
145 getMetaStandardFieldsDetail(props.data.guid).then((res:any) => {
146 if (res.code === proxy.$passCode) {
147 resolve(res.data)
148 }
149 }).finally(() => loading.value = false)
150 })
151 }
152
153 const confirmLoading = ref(false)
154 function confirm () {
155 console.log(form.value)
156 formEl.value.validate(valid => {
157 if (!valid) return
158 let body = {
159 metaStandardGuid: props.type === 'edit' ? detail.value.metaStandardGuid : props.metaStandardGuid,
160 metaStandardValue: { ...form.value }
161 }
162 if (props.type === 'edit') {
163 body.guid = props.data.guid
164 }
165 confirmLoading.value = true
166 saveMetaStandardDataFields(body).then((res:any) => {
167 if (res.code === proxy.$passCode) {
168 ElMessage.success('操作成功')
169 emit('success')
170 visible.value = false
171 } else {
172 ElMessage.error(res.msg)
173 }
174 }).finally(() => confirmLoading.value = false)
175 })
176 }
177
178 const standardCodeTree = ref([])
179 const treeSelectProps = {
180 label: 'name',
181 value: 'guid',
182 isLeaf: 'isCode'
183 }
184 function getStandardCodeTreeList () {
185 getStandardCodeTree().then((res:any) => {
186 if (res.code === proxy.$passCode) {
187 const data = res.data
188 data.forEach(item => {
189 if (item.children) {
190 item.children.forEach(subItem => {
191 // 二级的标准名字作为key
192 subItem.guid = subItem.name
193 // subItem.value = subItem.name
194 })
195 }
196 })
197 standardCodeTree.value = data
198 }
199 })
200 }
201
202 watch(
203 () => visible.value,
204 (v) => {
205 if (!v) return
206 initForm()
207 }
208 )
209
210 onBeforeMount(() => {
211 getStandardCodeTreeList()
212 })
213 </script>
214
215 <style lang="scss">
216 .standard-meta-modal {
217 .el-form-item {
218 flex-direction: column;
219 .el-form-item__label {
220 justify-content: flex-start;
221 }
222 }
223 .el-drawer__footer {
224 padding: 10px;
225 justify-content: flex-end;
226 }
227
228 .table-form-wrapper {
229 display: flex;
230 margin-bottom: 5px;
231 .table-form-item {
232 padding-right: 10px;
233 }
234 .table-form-operation {
235 flex: 0 0 70px;
236 padding-left: 6px;
237 }
238 }
239 }
240 </style>
...\ No newline at end of file ...\ No newline at end of file
1 <template>
2 <el-select v-if="!readonly && isEdit && isSelectType(dbType, scope)" v-model="scope.row['defaultValue']" placeholder="请选择" collapse-tags-tooltip
3 filterable allow-create default-first-option :reserve-keyword="false">
4 <el-option v-for="opt in optionsConfig[dataType]" :key="opt['value']" :label="opt['label']" :value="opt['value']" />
5 </el-select>
6 <el-date-picker v-else-if="!readonly && isEdit && dataType === 'date'" v-model="scope.row['defaultValue']" type="date"
7 format="YYYY-MM-DD" value-format="YYYY-MM-DD" placeholder="请选择" />
8 <el-date-picker v-else-if="!readonly && isEdit && dbType === 'mysql' && dataType === 'datetime'"
9 v-model="scope.row['defaultValue']" placeholder="请选择" type="datetime" format="YYYY-MM-DD HH:mm:ss"
10 value-format="YYYY-MM-DD HH:mm:ss" />
11 <el-input v-else-if="!readonly && isEdit" v-model.trim="scope.row['defaultValue']" placeholder="请填写"
12 @input="(val) => inputChange(val, scope.row.dataType, scope)" />
13 <span v-else>{{ scope.row["defaultValue"] == null ? '-' : (isSelectType(dbType, scope) ?
14 (optionsConfig[dataType].find(s => s.value == scope.row["defaultValue"])?.label ??
15 scope.row["defaultValue"]) : scope.row["defaultValue"]) }}</span>
16 </template>
17
18 <script lang="ts" setup name="tableDefaultValue">
19 import { ref } from "vue";
20 import { useDefault } from "@/hooks/useDefault";
21 const { optionsConfig, inputChange, isSelectType } = useDefault()
22
23 const props = defineProps({
24 dbType: {
25 type: String,
26 default: ''
27 },
28 scope: {
29 type: Object,
30 default: {}
31 },
32 readonly: {
33 type: Boolean,
34 default: false
35 }
36 })
37
38 const isEdit = computed(() => {
39 return props.scope.row['isEdit'];
40 });
41
42 const dataType = computed(() => {
43 return props.scope.row['dataType'];
44 });
45
46 </script>
...\ No newline at end of file ...\ No newline at end of file
...@@ -26,8 +26,8 @@ function encrypt(txt) { ...@@ -26,8 +26,8 @@ function encrypt(txt) {
26 } 26 }
27 const userStore = useUserStore() 27 const userStore = useUserStore()
28 const userInfoData = JSON.parse(localStorage.userData) 28 const userInfoData = JSON.parse(localStorage.userData)
29 // const url: any = 'https://scm.cs4pl.com/portraitBMap?fUrl=portraitMap'; 29 const url: any = 'https://scm-operation-test.csbr.cn/portraitBMap?fUrl=portraitMap&tUrl=portraitBMap';
30 const url: any = 'http://localhost:8086/portraitBMap?fUrl=portraitMap'; 30 // const url: any = 'http://localhost:8086/portraitBMap?fUrl=portraitMap&tUrl=portraitBMap';
31 31
32 const link = ref('') 32 const link = ref('')
33 const loading = ref(true); 33 const loading = ref(true);
......
1 <route lang="yaml">
2 name: metadataStandardQueryView
3 </route>
4
5 <template>
6 <div class="main_wrap" v-loading="graphDataLoading">
7 <div className='g6-component-topbar'>
8 <graphTopbar ref="topBarRef" @displaySwitchChange="displaySwitchChange" :isGraphDisplay="isGraphDisplay" />
9 </div>
10 <RelationNetwork v-show="graphTreeData?.guid && isGraphDisplay" ref="relationNetworkRef" :tree-data="graphTreeData"
11 :noContextMenu="true" @nodeItemClick="handleNodeItemClick" @contextMenu="handleContextMenu">
12 </RelationNetwork>
13 <Sankey v-show="!isGraphDisplay && (sankeyNames?.length || sankeyDataLoading)" v-loading="sankeyDataLoading"
14 :tree-data="sankeyData" :names="sankeyNames">
15 </Sankey>
16 <div v-show="(isGraphDisplay ? !graphTreeData?.guid : (!sankeyDataLoading && !sankeyNames?.length))"
17 class="main-placeholder">
18 <img src="../../assets/images/no-data.png" :style="{ width: '96px', height: '96px' }" />
19 <div class="empty-text">暂无数据</div>
20 </div>
21 </div>
22 </template>
23
24 <script lang="ts" setup name="metadataStandardQueryView">
25 import {
26 getMetaStandardField,
27 getSankeyData,
28 getMetaStandardTreeList
29 } from '@/api/modules/dataMetaService';
30 import Sankey from './components/Sankey.vue';
31 import { ElMessage } from 'element-plus';
32
33 const router = useRouter();
34 const route = useRoute()
35
36 const metaGuid = ref(route.query.guid);
37
38 const { proxy } = getCurrentInstance() as any;
39
40 const relationNetworkRef = ref();
41
42 const graphDataLoading = ref(false);
43
44 /** 关系网树形数据 */
45 const graphTreeData: any = ref({});
46
47 onBeforeUnmount(() => {
48 relationNetworkRef.value.destroy();
49 })
50
51 const sankeyDataLoading = ref(false);
52
53 const sankeyData: any = ref([]);
54
55 const sankeyNames: any = ref([]);
56
57 const isGraphDisplay = ref(true);
58
59 const displaySwitchChange = (val) => {
60 if (val == isGraphDisplay.value) {
61 return;
62 }
63 isGraphDisplay.value = val;
64 if (!val) {
65 getSankeyDataList();
66 }
67 }
68
69 const getSankeyDataList = () => {
70 sankeyDataLoading.value = true;
71 getSankeyData(metaGuid.value).then((res: any) => {
72 sankeyDataLoading.value = false;
73 if (res?.code == proxy.$passCode) {
74 sankeyData.value = res.data?.links || [];
75 sankeyNames.value = res.data?.data || [];
76 } else {
77 ElMessage.error(res.msg);
78 }
79 })
80 }
81
82 const handleNodeItemClick = (graph, nodeItem) => {
83 const nodeId = nodeItem.get('id');
84 let parentData = graph.findDataById(nodeId);
85 if (!parentData.children) {
86 parentData.children = [];
87 }
88 if (parentData.isHaveData == 'N') {
89 ElMessage.warning('没有可展开的下级字段');
90 return;
91 }
92 // graph.updateConfig({ animate: false });
93 // graph.refresh();
94 nodeItem.getModel().collapsed = false;
95 parentData.collapsed = false;
96 graphDataLoading.value = true;
97 getMetaStandardField(nodeId).then((res: any) => {
98 graphDataLoading.value = false;
99 if (res?.code == proxy.$passCode) {
100 parentData = graph.findDataById(nodeId);
101 const data = res.data || [];
102 parentData.children = [];
103 if (!data?.length) {
104 parentData.isHaveData = 'N';
105 ElMessage.warning('没有可展开的下级字段');
106 return;
107 }
108 data.forEach(d => {
109 parentData.children.push(d);
110 })
111 parentData.isLoading = false;
112 nodeItem.getModel().collapsed = false;
113 parentData.collapsed = false;
114 graph.updateItem(nodeItem, {
115 ...nodeItem.getModel(),
116 collapsed: false
117 });
118 graph.layout();
119 setTimeout(() => {
120 // graph.updateConfig({ animate: true });
121 // graph.refresh();
122 graph.updateItem(nodeItem, {
123 ...nodeItem.getModel(),
124 collapsed: false
125 });
126 graph.setMinZoom(1);
127 graph.setMaxZoom(1);
128 graph.layout();
129 graph.setMinZoom(0.5);
130 graph.setMaxZoom(5);
131 graph.focusItem(nodeItem, true, {
132 duration: 400 // 动画时长为500ms
133 });
134 }, 500);
135 } else {
136 parentData.isLoading = false;
137 ElMessage.error(res.msg);
138 }
139 })
140 }
141
142 const handleContextMenu = (model) => {
143 router.push({
144 name: 'metadataStandard',
145 query: {
146 standardGuid: model.guid,
147 name: model.standardName
148 }
149 });
150 }
151
152 onBeforeMount(() => {
153 graphDataLoading.value = true
154 getMetaStandardTreeList(metaGuid.value).then((res: any) => {
155 graphDataLoading.value = false;
156 if (res?.code == proxy.$passCode) {
157 const data = res.data || [];
158 let resultData = data?.[0] || {};
159 if (!resultData?.children?.length && resultData.isHaveData == 'Y') {
160 graphDataLoading.value = true;
161 getMetaStandardField(resultData.guid).then((res: any) => {
162 graphDataLoading.value = false;
163 if (res?.code == proxy.$passCode) {
164 resultData.children = res.data || [];
165 graphTreeData.value = resultData;
166 } else {
167 graphTreeData.value = resultData;
168 ElMessage.error(res.msg);
169 }
170 });
171 } else {
172 graphTreeData.value = resultData;
173 }
174 } else {
175 ElMessage.error(res.msg);
176 }
177 })
178 })
179
180 </script>
181
182 <style lang="scss" scoped>
183 .main_wrap {
184 height: 100%;
185 width: 100%;
186 position: relative;
187
188 :deep(.canvas-wrapper) {
189 background-color: #f7f7f9;
190 }
191
192 .main-placeholder {
193 height: 100%;
194 display: flex;
195 justify-content: center;
196 align-items: center;
197 flex-direction: column;
198
199 .empty-text {
200 font-size: 14px;
201 color: #b2b2b2;
202 }
203 }
204 }
205
206 .g6-component-topbar {
207 position: absolute;
208 left: 24px;
209 bottom: unset;
210 top: 14px;
211 padding: 0;
212 text-align: center;
213 z-index: 999;
214 }
215 </style>
...\ No newline at end of file ...\ No newline at end of file
1 <route lang="yaml">
2 name: priceCalculate
3 </route>
4
5 <script lang="ts" setup name="priceCalculate">
6 import { ref } from 'vue';
7 import TableTools from '@/components/Tools/table_tools.vue';
8 import { TableColumnWidth, commonPageConfig } from '@/utils/enum';
9 import { ElMessage, ElMessageBox } from "element-plus";
10 import { CirclePlus } from "@element-plus/icons-vue";
11 import { useRouter, useRoute } from "vue-router";
12 import useUserStore from "@/store/modules/user";
13 import useDataAssetStore from "@/store/modules/dataAsset";
14 import { getAllFlowData } from '@/api/modules/queryService';
15 import { changeNum } from "@/utils/common";
16 import {
17 getDiseaseAll,
18 getPriceList,
19 deletePrice,
20 } from '@/api/modules/dataPricing';
21
22 const router = useRouter();
23 const userStore = useUserStore()
24 const assetStore = useDataAssetStore();
25 const userData = JSON.parse(userStore.userData)
26 const { proxy } = getCurrentInstance() as any;
27
28 const searchItemList = ref([
29 {
30 type: "input",
31 label: "",
32 field: "dataResourceName",
33 default: "",
34 placeholder: "数据资源名称",
35 clearable: true,
36 },
37 {
38 type: "cascader",
39 label: "",
40 field: "diseaseName",
41 placeholder: "疾病名称",
42 default: "",
43 options: [],
44 showAllLevels: false,
45 props: {
46 checkStrictly: true,
47 label: "diseaseName",
48 value: "guid",
49 children: 'childList',
50 emitPath: false
51 },
52 filterable: true,
53 clearable: true,
54 }
55 ]);
56
57 const typeMap: any = ref({});
58 const selectRowData: any = ref([])
59 const currTableData: any = ref({});
60 const page: any = ref({
61 ...commonPageConfig,
62 dataResourceName: '',
63 diseaseName: ''
64 });
65 const tableField: any = ref([
66 { label: "序号", type: "index", width: TableColumnWidth.INDEX, align: "center" },
67 { label: "定价模型名称", field: "modelName", width: 200 },
68 { label: "数据资源名称", field: "dataResourceName", width: 200 },
69 { label: "疾病名称", field: "diseaseName", width: 200 },
70 {
71 label: "交易价格(元)", field: "dataTransactionPrice", width: 120, align: 'right', getName: (scope) => {
72 return scope.row.dataTransactionPrice ? changeNum(parseFloat(scope.row.dataTransactionPrice), 2) : '-';
73 }
74 },
75 { label: "创建人", field: "createUserName", width: 120 },
76 { label: "创建时间", field: "createTime", width: TableColumnWidth.DATETIME },
77 ]);
78 const tableInfo = ref({
79 id: 'api-data-table',
80 rowKey: 'guid',
81 loading: false,
82 fields: tableField.value,
83 data: [],
84 page: {
85 type: "normal",
86 rows: 0,
87 ...page.value,
88 },
89 actionInfo: {
90 label: "操作",
91 type: "btn",
92 isMore: false,
93 width: 120,
94 btns: [
95 { label: "编辑", value: "edit" },
96 { label: "删除", value: "del" }
97 ]
98 }
99 });
100
101 const setTableField = () => {
102 tableField.value.splice(4, 0, {
103 label: "交易用途", field: "dataUsage", width: 120, getName: (scope) => {
104 return typeMap.value['dataUsage'].find((item) => item.value == scope.row['dataUsage'])?.label || '-';
105 }
106 });
107 tableInfo.value.fields = tableField.value;
108 }
109
110 // 获取所有疾病数据
111 const getDiseaseData = () => {
112 getDiseaseAll().then((res: any) => {
113 if (res.code == proxy.$passCode) {
114 const data = res.data || [];
115 searchItemList.value[1].options = data;
116 }
117 })
118 }
119
120 // 获取数据字典
121 const getDataType = (dictType, fieldName) => {
122 getAllFlowData({ dictType }).then((res: any) => {
123 if (res.code == proxy.$passCode) {
124 const data = res.data || [];
125 typeMap.value[fieldName] = JSON.parse(JSON.stringify(data));
126 setTableField()
127 } else {
128 proxy.$ElMessage.error(res.msg);
129 }
130 })
131 }
132
133 const toSearch = (val: any, clear: boolean = false) => {
134 page.value.curr = 1;
135 if (clear) {
136 searchItemList.value.map((item) => (item.default = ""));
137 page.value.dataResourceName = ''
138 page.value.diseaseName = '';
139 } else {
140 page.value.dataResourceName = val.dataResourceName || '';
141 page.value.diseaseName = val.diseaseName || '';
142 }
143 getTableData();
144 };
145
146 const getTableData = () => {
147 tableInfo.value.loading = true;
148 getPriceList({
149 pageSize: page.value.limit,
150 pageIndex: page.value.curr,
151 dataResourceName: page.value.dataResourceName,
152 diseaseName: page.value.diseaseName,
153 }).then((res: any) => {
154 tableInfo.value.loading = false;
155 if (res.code == proxy.$passCode) {
156 const data = res.data || {};
157 tableInfo.value.data = data.records || [];
158 tableInfo.value.page.limit = data.pageSize
159 tableInfo.value.page.curr = data.pageIndex
160 tableInfo.value.page.rows = data.totalRows
161 } else {
162 proxy.$ElMessage.error(res.msg);
163 }
164 })
165 }
166
167 const tablePageChange = (info) => {
168 page.value.curr = Number(info.curr);
169 page.value.limit = Number(info.limit);
170 tableInfo.value.page.limit = page.value.limit;
171 tableInfo.value.page.curr = page.value.curr;
172 getTableData();
173 };
174
175 const tableBtnClick = (scope, btn) => {
176 const type = btn.value;
177 const row = scope.row;
178 currTableData.value = row;
179 if (type === 'edit') { // 编辑
180 router.push(
181 {
182 name: 'calculateConfig',
183 query: {
184 guid: row.guid,
185 name: row.modelName,
186 type: 'edit'
187 }
188 }
189 );
190 } else if (type === 'del') { // 删除
191 open('确定要删除该条数据吗?', 'warning');
192 }
193 };
194
195 const open = (msg, type, isBatch = false) => {
196 ElMessageBox.confirm(msg, "提示", {
197 confirmButtonText: "确定",
198 cancelButtonText: "取消",
199 type: type,
200 }).then(() => {
201 let guids = [currTableData.value.guid]
202 if (isBatch) {
203 guids = selectRowData.value
204 }
205 deletePrice(guids).then((res: any) => {
206 if (res.code == proxy.$passCode) {
207 getTableData();
208 ElMessage({
209 type: "success",
210 message: "删除成功",
211 });
212 } else {
213 proxy.$ElMessage.error(res.msg);
214 }
215 });
216 });
217 };
218
219 const addDisease = () => {
220 router.push(
221 {
222 name: 'calculateConfig',
223 query: {
224 type: 'create'
225 }
226 }
227 );
228 }
229
230 onBeforeMount(() => {
231 getDiseaseData();
232 getDataType('数据用途', 'dataUsage')
233 });
234
235 onActivated(() => {
236 if (assetStore.isRefresh) {//如果是首次加载,则不需要调用
237 toSearch(null, true);
238 assetStore.set(false);
239 }
240 })
241
242 </script>
243
244 <template>
245 <div class="container_wrap">
246 <div class="table_tool_wrap">
247 <TableTools :searchItems="searchItemList" :searchId="'data-source-search'" @search="toSearch" />
248 <div class="tools_btns">
249 <el-button type="primary" @click="addDisease" v-preReClick>新增</el-button>
250 </div>
251 </div>
252 <div class="table_panel_wrap">
253 <Table :tableInfo="tableInfo" @tablePageChange="tablePageChange" @tableBtnClick="tableBtnClick" />
254 </div>
255 </div>
256 </template>
257
258 <style lang="scss" scoped>
259 .table_tool_wrap {
260 width: 100%;
261 height: 84px !important;
262 padding: 0 8px;
263
264 .tools_btns {
265 padding: 0px 0 0;
266 }
267 }
268
269 .table_panel_wrap {
270 width: 100%;
271 height: calc(100% - 84px);
272 padding: 0px 8px 0;
273 }
274 </style>
1 <route lang="yaml">
2 name: priceConfig
3 </route>
4
5 <script lang="ts" setup name="priceConfig">
6 import { ref } from 'vue';
7 import TableTools from '@/components/Tools/table_tools.vue';
8 import { TableColumnWidth, commonPageConfig } from '@/utils/enum';
9 import { ElMessage, ElMessageBox } from "element-plus";
10 import { CirclePlus } from "@element-plus/icons-vue";
11 import { useRouter, useRoute } from "vue-router";
12 import useUserStore from "@/store/modules/user";
13 import useDataAssetStore from "@/store/modules/dataAsset";
14 import { getAllFlowData } from '@/api/modules/queryService';
15 import {
16 getConfigureList,
17 deleteConfigure,
18 getConfigureDetail,
19 addCopyConfigure
20 } from '@/api/modules/dataPricing';
21
22 const router = useRouter();
23 const userStore = useUserStore()
24 const assetStore = useDataAssetStore();
25 const userData = JSON.parse(userStore.userData)
26 const { proxy } = getCurrentInstance() as any;
27
28 const searchItemList = ref([
29 {
30 type: "input",
31 label: "",
32 field: "modelName",
33 default: "",
34 placeholder: "定价模型名称",
35 clearable: true,
36 },
37 {
38 type: "select",
39 label: "",
40 field: "institutionType",
41 placeholder: "机构类型",
42 default: "",
43 options: [],
44 clearable: true,
45 }
46 ]);
47
48 const typeMap = ref({});
49 const tableData: any = ref([]);
50 const selectRowData: any = ref([])
51 const currTableData: any = ref({});
52 const page: any = ref({
53 ...commonPageConfig,
54 modelName: '',
55 institutionType: ''
56 });
57 const tableInfo = ref({
58 id: 'api-data-table',
59 rowKey: 'guid',
60 loading: false,
61 fields: [
62 { label: "序号", type: "index", width: TableColumnWidth.INDEX, align: "center" },
63 { label: "定价模型名称", field: "modelName", width: 200 },
64 {
65 label: "机构类型", field: "institutionType", width: 120, getName: (scope) => {
66 return filterVal(scope.row.institutionType, 'institutionType')
67 }
68 },
69 {
70 label: "启用状态", field: "bizState", type: 'tag', width: 120, align: 'center', getName: (scope) => {
71 return scope.row.bizState == 'Y' ? '启用' : '停用';
72 }, tagType: (scope) => {
73 return scope.row.bizState == 'Y' ? 'success' : 'info';
74 }
75 },
76 { label: "创建人", field: "createUserName", width: 120 },
77 { label: "创建时间", field: "createTime", width: TableColumnWidth.DATETIME },
78 ],
79 data: tableData.value,
80 page: {
81 type: "normal",
82 rows: 0,
83 ...page.value,
84 },
85 actionInfo: {
86 label: "操作",
87 type: "btn",
88 isMore: false,
89 width: 160,
90 btns: [
91 { label: "编辑", value: "edit" },
92 { label: "复制", value: "copy" },
93 { label: "删除", value: "del" }
94 ]
95 }
96 });
97
98 // 过滤
99 const filterVal = (val, name) => {
100 if (typeMap.value[name]) {
101 const data = typeMap.value[name].find(item => item.value == val);
102 return data?.label || '--';
103 }
104 };
105
106 // 获取需求类型
107 const getDataType = (dictType, fieldName) => {
108 getAllFlowData({ dictType }).then((res: any) => {
109 if (res.code == proxy.$passCode) {
110 const data = res.data || [];
111 typeMap.value[fieldName] = JSON.parse(JSON.stringify(data));
112 let item = searchItemList.value.find(item => item.field == fieldName);
113 item && (item.options = data);
114 } else {
115 proxy.$ElMessage.error(res.msg);
116 }
117 })
118 }
119
120 const toSearch = (val: any, clear: boolean = false) => {
121 page.value.curr = 1;
122 if (clear) {
123 searchItemList.value.map((item) => (item.default = ""));
124 page.value.modelName = '';
125 page.value.institutionType = '';
126 } else {
127 page.value.modelName = val.modelName || '';
128 page.value.institutionType = val.institutionType || '';
129 }
130 getTableData();
131 };
132
133 const getTableData = () => {
134 tableInfo.value.loading = true;
135 getConfigureList({
136 pageSize: page.value.limit,
137 pageIndex: page.value.curr,
138 modelName: page.value.modelName,
139 institutionType: page.value.institutionType,
140 }).then((res: any) => {
141 tableInfo.value.loading = false;
142 if (res.code == proxy.$passCode) {
143 const data = res.data || {};
144 tableInfo.value.data = data.records || []
145 tableInfo.value.page.limit = data.pageSize
146 tableInfo.value.page.curr = data.pageIndex
147 tableInfo.value.page.rows = data.totalRows
148 } else {
149 proxy.$ElMessage.error(res.msg);
150 }
151 })
152 }
153
154 const tablePageChange = (info) => {
155 page.value.curr = Number(info.curr);
156 page.value.limit = Number(info.limit);
157 tableInfo.value.page.limit = page.value.limit;
158 tableInfo.value.page.curr = page.value.curr;
159 getTableData();
160 };
161
162 const tableBtnClick = (scope, btn) => {
163 const type = btn.value;
164 const row = scope.row;
165 currTableData.value = row;
166 if (type === 'edit') { // 编辑
167 router.push(
168 {
169 name: 'priceModel',
170 query: {
171 guid: row.guid,
172 name: row.modelName,
173 type
174 }
175 }
176 );
177 } else if (type == 'copy') { //复制
178 ElMessageBox.confirm('是否确定复制该模型?', "提示", {
179 confirmButtonText: "确定",
180 cancelButtonText: "取消",
181 type: 'warning',
182 }).then(() => {
183 getConfigureDetail({ guid: row.guid }).then((res: any) => {
184 if (res.code == proxy.$passCode) {
185 const data = res.data || {};
186 let params = { ...data };
187 delete params.createTime;
188 delete params.createUserName;
189 delete params.pricingDimensionalityRSVOS;
190 const pricingDimensionalityRSVOS = data.pricingDimensionalityRSVOS || [];
191 pricingDimensionalityRSVOS.map(p => {
192 p.pricingTargetRQVOS = p.pricingTargetRSVOS || [];
193 delete p.pricingTargetRSVOS;
194 });
195 params.pricingDimensionalityRQVOS = pricingDimensionalityRSVOS;
196 addCopyConfigure(params).then((res: any) => {
197 if (res.code == proxy.$passCode) {
198 ElMessage({
199 type: "success",
200 message: "复制定价配置成功",
201 });
202 getTableData();
203 } else {
204 proxy.$ElMessage.error(res.msg);
205 }
206 }).catch(() => {
207
208 });
209 }
210 }).catch(() => {
211
212 })
213 });
214 } else if (type === 'del') { // 删除
215 open('确定要删除该条数据吗?', 'warning');
216 }
217 };
218
219 const open = (msg, type, isBatch = false) => {
220 ElMessageBox.confirm(msg, "提示", {
221 confirmButtonText: "确定",
222 cancelButtonText: "取消",
223 type: type,
224 }).then(() => {
225 let guids = [currTableData.value.guid]
226 if (isBatch) {
227 guids = selectRowData.value
228 }
229 deleteConfigure(guids).then((res: any) => {
230 if (res.code == proxy.$passCode) {
231 getTableData();
232 ElMessage({
233 type: "success",
234 message: "删除成功",
235 });
236 } else {
237 proxy.$ElMessage.error(res.msg);
238 }
239 });
240 });
241 };
242
243 const addDisease = () => {
244 router.push(
245 {
246 name: 'priceModel',
247 query: {
248 type: 'create'
249 }
250 }
251 );
252 }
253
254 onBeforeMount(() => {
255 getDataType('机构类型', 'institutionType')
256 });
257
258 onActivated(() => {
259 if (assetStore.isRefresh) {//如果是首次加载,则不需要调用
260 toSearch(null, true);
261 assetStore.set(false);
262 }
263 })
264
265 </script>
266
267 <template>
268 <div class="container_wrap">
269 <div class="table_tool_wrap">
270 <TableTools :searchItems="searchItemList" :searchId="'data-source-search'" @search="toSearch" />
271 <div class="tools_btns">
272 <el-button type="primary" @click="addDisease" v-preReClick>新增</el-button>
273 </div>
274 </div>
275 <div class="table_panel_wrap">
276 <Table :tableInfo="tableInfo" @tablePageChange="tablePageChange" @tableBtnClick="tableBtnClick" />
277 </div>
278 </div>
279 </template>
280
281 <style lang="scss" scoped>
282 .table_tool_wrap {
283 width: 100%;
284 height: 84px !important;
285 padding: 0 8px;
286
287 .tools_btns {
288 padding: 0px 0 0;
289 }
290 }
291
292 .table_panel_wrap {
293 width: 100%;
294 height: calc(100% - 84px);
295 padding: 0px 8px 0;
296 }
297 </style>
...@@ -25,12 +25,13 @@ import { ...@@ -25,12 +25,13 @@ import {
25 getDatabase, 25 getDatabase,
26 getRuleTypeList 26 getRuleTypeList
27 } from '@/api/modules/dataQuality'; 27 } from '@/api/modules/dataQuality';
28 import { getDamCatalogList } from '@/api/modules/dataPricing';
28 import useDataQualityStore from "@/store/modules/dataQuality"; 29 import useDataQualityStore from "@/store/modules/dataQuality";
29 import { useValidator } from '@/hooks/useValidator'; 30 import { useValidator } from '@/hooks/useValidator';
30 import { TableColumnWidth } from '@/utils/enum'; 31 import { TableColumnWidth } from '@/utils/enum';
31 32
32 const dataQualityStore = useDataQualityStore(); 33 const dataQualityStore = useDataQualityStore();
33 34 const userData = JSON.parse(localStorage.userData);
34 const { proxy } = getCurrentInstance() as any; 35 const { proxy } = getCurrentInstance() as any;
35 const { orderNum, description } = useValidator(); 36 const { orderNum, description } = useValidator();
36 37
...@@ -39,6 +40,8 @@ const cacheStore = useCatchStore(); ...@@ -39,6 +40,8 @@ const cacheStore = useCatchStore();
39 /** 可选择的质量规则列表。 */ 40 /** 可选择的质量规则列表。 */
40 const ruleTypeList: any = ref([]); 41 const ruleTypeList: any = ref([]);
41 42
43 const productList: any = ref([]);
44
42 /** 质量规则集表对象。 */ 45 /** 质量规则集表对象。 */
43 const qualityModelTreeRef = ref(); 46 const qualityModelTreeRef = ref();
44 /** 树选中不同层级的,代表的类型, model, group, table */ 47 /** 树选中不同层级的,代表的类型, model, group, table */
...@@ -281,7 +284,22 @@ const formItems: any = ref([ ...@@ -281,7 +284,22 @@ const formItems: any = ref([
281 default: '', 284 default: '',
282 maxlength: 6, 285 maxlength: 6,
283 required: true 286 required: true
284 }, { 287 },
288 {
289 label: '数据产品',
290 type: 'select',
291 field: 'damGuid',
292 default: '',
293 placeholder: '请选择',
294 options: productList.value,
295 props: {
296 value: 'guid',
297 label: 'damName'
298 },
299 clearable: true,
300 filterable: true
301 },
302 {
285 label: '描述', 303 label: '描述',
286 type: 'textarea', 304 type: 'textarea',
287 placeholder: '请输入', 305 placeholder: '请输入',
...@@ -929,6 +947,17 @@ onActivated(async () => { ...@@ -929,6 +947,17 @@ onActivated(async () => {
929 } 947 }
930 }) 948 })
931 949
950 // 获取数据产品列表
951 const getProducts = () => {
952 getDamCatalogList({ dataType: userData.superTubeFlag == 'Y' ? "P" : "D", sceneType: "Z" }).then((res: any) => {
953 if (res.code == proxy.$passCode) {
954 const data = res.data || [];
955 productList.value = data;
956 formItems.value.at(-2).options = data;
957 }
958 })
959 }
960
932 onBeforeMount(() => { 961 onBeforeMount(() => {
933 getQualityGroupTreeData(); 962 getQualityGroupTreeData();
934 getGroupTableData(); 963 getGroupTableData();
...@@ -945,6 +974,7 @@ onBeforeMount(() => { ...@@ -945,6 +974,7 @@ onBeforeMount(() => {
945 ElMessage.error(res.msg); 974 ElMessage.error(res.msg);
946 } 975 }
947 }) 976 })
977 getProducts();
948 }) 978 })
949 979
950 </script> 980 </script>
......
...@@ -18,7 +18,7 @@ import { ...@@ -18,7 +18,7 @@ import {
18 getImportData, 18 getImportData,
19 exportDictionary, 19 exportDictionary,
20 exportCollectTask, 20 exportCollectTask,
21 // getImageContent 21 exportTemplate
22 } from '@/api/modules/queryService'; 22 } from '@/api/modules/queryService';
23 import { 23 import {
24 parseAndDecodeUrl, 24 parseAndDecodeUrl,
...@@ -29,6 +29,7 @@ import { ...@@ -29,6 +29,7 @@ import {
29 getDictionaryTree 29 getDictionaryTree
30 } from '@/api/modules/dataInventory'; 30 } from '@/api/modules/dataInventory';
31 import { commonPageConfig } from '@/utils/enum'; 31 import { commonPageConfig } from '@/utils/enum';
32 import { getDemandTreeList, getDiseaseAll } from '@/api/modules/dataPricing';
32 33
33 const { proxy } = getCurrentInstance() as any; 34 const { proxy } = getCurrentInstance() as any;
34 35
...@@ -156,6 +157,29 @@ const getDictList = () => { ...@@ -156,6 +157,29 @@ const getDictList = () => {
156 }) 157 })
157 } 158 }
158 159
160 // 获取需求表树形数据
161 const getTreeData = () => {
162 if (isfileImport == '7') {
163 getDemandTreeList({ pageIndex: 1, pageSize: 100000, isCatalog: 'N' }).then((res: any) => {
164 if (res.code == proxy.$passCode) {
165 const data = res.data?.records || [];
166 dictionaryList.value = data;
167 } else {
168 proxy.$ElMessage.error(res.msg);
169 }
170 })
171 } else {
172 getDiseaseAll().then((res: any) => {
173 if (res.code == proxy.$passCode) {
174 const data = res.data || [];
175 dictionaryList.value = data;
176 } else {
177 proxy.$ElMessage.error(res.msg);
178 }
179 })
180 }
181 }
182
159 const tabsChange = (name) => { 183 const tabsChange = (name) => {
160 tabsActiveName.value = name 184 tabsActiveName.value = name
161 let info: any = { 185 let info: any = {
...@@ -283,11 +307,16 @@ const batching = (type) => { ...@@ -283,11 +307,16 @@ const batching = (type) => {
283 } 307 }
284 open("此操作将永久删除, 是否继续?", "warning", true); 308 open("此操作将永久删除, 是否继续?", "warning", true);
285 } else if (type === 'importFile') { 309 } else if (type === 'importFile') {
286 if (isfileImport == '2' || isfileImport == '4') { 310 if (isfileImport == '2' || isfileImport == '4' || isfileImport == '7' || isfileImport == '8') {
287 dialogInfo.value.header.title = '导入数据' 311 dialogInfo.value.header.title = '导入数据'
288 dialogInfo.value.type = 'upload' 312 dialogInfo.value.type = 'upload'
289 dialogInfo.value.size = isfileImport == '4' ? 600 : 500; 313 dialogInfo.value.size = isfileImport == '4' ? 600 : 500;
290 uploadFiles.value = [] 314 uploadFiles.value = []
315 if (isfileImport == '7') {
316 uploadSteps.value[0].selectInfo.options = dictionaryList.value;
317 } else if (isfileImport == '8') {
318 uploadSteps.value[0].cascaderInfo.options = dictionaryList.value;
319 }
291 uploadInfo.value.uploadInfo.steps = uploadSteps.value 320 uploadInfo.value.uploadInfo.steps = uploadSteps.value
292 const content: any = [uploadInfo.value] 321 const content: any = [uploadInfo.value]
293 dialogInfo.value.contents = content 322 dialogInfo.value.contents = content
...@@ -377,6 +406,20 @@ const exportData = (ids: any = null) => { ...@@ -377,6 +406,20 @@ const exportData = (ids: any = null) => {
377 res?.msg && ElMessage.error(res?.msg); 406 res?.msg && ElMessage.error(res?.msg);
378 } 407 }
379 }); 408 });
409 } else if (tabsActiveName.value == 'importFile' && isfileImport == '7') {
410 exportTemplate({
411 bizGuid: '',
412 importType: "0046"
413 }).then((res: any) => {
414 download(res, '需求表管理导入模板.xlsx', 'excel')
415 });
416 } else if (tabsActiveName.value == 'importFile' && isfileImport == '8') {
417 exportTemplate({
418 bizGuid: '',
419 importType: "0047"
420 }).then((res: any) => {
421 download(res, '疾病管理导入模板.xlsx', 'excel')
422 });
380 } 423 }
381 } 424 }
382 425
...@@ -390,11 +433,11 @@ const importData = (info) => { ...@@ -390,11 +433,11 @@ const importData = (info) => {
390 // dialogInfo.value.footer.btns.map((item: any) => delete item.disabled) 433 // dialogInfo.value.footer.btns.map((item: any) => delete item.disabled)
391 return 434 return
392 } 435 }
436 uploadFiles.value.forEach((item: any, index: number) => {
437 params.append("file", item.raw);
438 });
393 let paramUrl = ''; 439 let paramUrl = '';
394 if (isfileImport == '2') { 440 if (isfileImport == '2') {
395 uploadFiles.value.forEach((item: any, index: number) => {
396 params.append("file", item.raw);
397 });
398 paramUrl = `ms-daop-zcgl-asset-dam-service/dam-catalog-table/excel-by-subject-guid?staffGuid=${userData.staffGuid}&subjectGuid=${route.query.bizGuid}` 441 paramUrl = `ms-daop-zcgl-asset-dam-service/dam-catalog-table/excel-by-subject-guid?staffGuid=${userData.staffGuid}&subjectGuid=${route.query.bizGuid}`
399 } else if (isfileImport == '4') { 442 } else if (isfileImport == '4') {
400 if (!info.databaseNameZh) { 443 if (!info.databaseNameZh) {
...@@ -411,14 +454,17 @@ const importData = (info) => { ...@@ -411,14 +454,17 @@ const importData = (info) => {
411 }) 454 })
412 return; 455 return;
413 } 456 }
414 uploadFiles.value.forEach((item: any, index: number) => { 457
415 params.append("uploadFile", item.raw);
416 });
417 paramUrl = `${import.meta.env.VITE_APP_PLAN_BASEURL}/meta-collect-task/meta-collect-import?staffGuid=${userData.staffGuid}&databaseNameZh=${info.databaseNameZh}&databaseNameEn=${info.databaseNameEn}&isCover=${info.isCover}` 458 paramUrl = `${import.meta.env.VITE_APP_PLAN_BASEURL}/meta-collect-task/meta-collect-import?staffGuid=${userData.staffGuid}&databaseNameZh=${info.databaseNameZh}&databaseNameEn=${info.databaseNameEn}&isCover=${info.isCover}`
459 } else if (isfileImport == '7') {
460 info.bizGuid = '0046';
461 paramUrl = `${import.meta.env.VITE_APP_ADD_FILE}/import-data/import-common?importType=${importType.value}&staffGuid=${userData.staffGuid}&tenantGuid=${userData.tenantGuid}`
462 paramUrl += `&extendFields=${encodeURIComponent(JSON.stringify(info))}`
463 } else if (isfileImport == '8') {
464 info.bizGuid = '0047';
465 paramUrl = `${import.meta.env.VITE_APP_ADD_FILE}/import-data/import-common?importType=${importType.value}&staffGuid=${userData.staffGuid}&tenantGuid=${userData.tenantGuid}`
466 paramUrl += `&extendFields=${encodeURIComponent(JSON.stringify(info))}`
418 } else { 467 } else {
419 uploadFiles.value.forEach((item: any, index: number) => {
420 params.append("file", item.raw);
421 });
422 paramUrl = `${import.meta.env.VITE_APP_ADD_FILE}/import-data/import-common?importType=${importType.value}&staffGuid=${userData.staffGuid}&tenantGuid=${userData.tenantGuid}&dataType=2` 468 paramUrl = `${import.meta.env.VITE_APP_ADD_FILE}/import-data/import-common?importType=${importType.value}&staffGuid=${userData.staffGuid}&tenantGuid=${userData.tenantGuid}&dataType=2`
423 if (info && Object.keys(info).length) { 469 if (info && Object.keys(info).length) {
424 paramUrl += `&extendFields=${encodeURIComponent(JSON.stringify(info))}` 470 paramUrl += `&extendFields=${encodeURIComponent(JSON.stringify(info))}`
...@@ -452,6 +498,10 @@ const dialogBtnClick = (btn, info) => { ...@@ -452,6 +498,10 @@ const dialogBtnClick = (btn, info) => {
452 if (dialogInfo.value.type == 'upload') { 498 if (dialogInfo.value.type == 'upload') {
453 if (tabsActiveName.value == 'dictionary') { 499 if (tabsActiveName.value == 'dictionary') {
454 importData({ bizGuid: dictionaryGuid.value }) 500 importData({ bizGuid: dictionaryGuid.value })
501 } else if (tabsActiveName.value == 'importFile' && isfileImport == '7') {
502 importData(info)
503 } else if (tabsActiveName.value == 'importFile' && isfileImport == '8') {
504 importData(info)
455 } else { 505 } else {
456 importData(info) 506 importData(info)
457 } 507 }
...@@ -478,6 +528,10 @@ const setUploadInfo = () => { ...@@ -478,6 +528,10 @@ const setUploadInfo = () => {
478 importType.value = '0034'; 528 importType.value = '0034';
479 } else if (isfileImport == '4') { 529 } else if (isfileImport == '4') {
480 importType.value = '0042'; 530 importType.value = '0042';
531 } else if (isfileImport == '7') {
532 importType.value = '0046';
533 } else if (isfileImport == '8') {
534 importType.value = '0047';
481 } else { 535 } else {
482 importType.value = '0033'; 536 importType.value = '0033';
483 } 537 }
...@@ -641,6 +695,94 @@ const setUploadInfo = () => { ...@@ -641,6 +695,94 @@ const setUploadInfo = () => {
641 } 695 }
642 ] 696 ]
643 uploadInfo.value.uploadInfo.extraParams = { isCover: 'Y' } 697 uploadInfo.value.uploadInfo.extraParams = { isCover: 'Y' }
698 } else if (tabsActiveName.value == 'importFile' && isfileImport == '7') {
699 uploadSteps.value = [
700 {
701 title: '1、导入前请先录入以下内容',
702 type: 'select',
703 selectInfo: {
704 label: '需求表名称',
705 placeholder: '请选择',
706 field: 'menuGuid',
707 default: '',
708 options: [],
709 props: {
710 label: "menuName",
711 value: "guid",
712 },
713 filterable: true,
714 clearable: true,
715 required: true,
716 style: {
717 width: '191px',
718 }
719 }
720 },
721 {
722 title: '2、请下载最新的模板,并按照模板格式准备需要导入的数据',
723 type: 'btn_down'
724 },
725 {
726 title: '3、选择准备好的文件导入',
727 type: 'btn_upload',
728 uploadInfo: {
729 action: '',
730 auto: false,
731 cover: true,
732 fileList: [],
733 accept: '.xlsx, .xls',
734 tips: '当前支持xls、xlsx文件,默认使用第一个sheet'
735 }
736 }
737 ]
738 dictionaryGuid.value = uploadSetting.value?.dictionaryGuid || ''
739 uploadInfo.value.uploadInfo.extraParams = {
740 menuGuid: dictionaryGuid.value
741 }
742 } else if (tabsActiveName.value == 'importFile' && isfileImport == '8') {
743 uploadSteps.value = [
744 {
745 title: '1、导入前请先录入以下内容',
746 type: 'cascader',
747 cascaderInfo: {
748 label: '疾病名称',
749 placeholder: '',
750 field: 'parentGuid',
751 options: [],
752 default: '',
753 showAllLevels: false,
754 props: {
755 checkStrictly: true,
756 label: "diseaseName",
757 value: "guid",
758 children: 'childList',
759 emitPath: false
760 },
761 filterable: true,
762 clearable: true,
763 }
764 },
765 {
766 title: '2、请下载最新的模板,并按照模板格式准备需要导入的数据',
767 type: 'btn_down'
768 },
769 {
770 title: '3、选择准备好的文件导入',
771 type: 'btn_upload',
772 uploadInfo: {
773 action: '',
774 auto: false,
775 cover: true,
776 fileList: [],
777 accept: '.xlsx, .xls',
778 tips: '当前支持xls、xlsx文件,默认使用第一个sheet'
779 }
780 }
781 ]
782 dictionaryGuid.value = uploadSetting.value?.dictionaryGuid || ''
783 uploadInfo.value.uploadInfo.extraParams = {
784 parentGuid: dictionaryGuid.value
785 }
644 } else { 786 } else {
645 uploadSteps.value = [ 787 uploadSteps.value = [
646 { 788 {
...@@ -674,7 +816,8 @@ onActivated(() => { ...@@ -674,7 +816,8 @@ onActivated(() => {
674 if (tabsActiveName.value == 'dictionary') { 816 if (tabsActiveName.value == 'dictionary') {
675 getDictList(); 817 getDictList();
676 } 818 }
677 setUploadInfo() 819 setUploadInfo();
820 (isfileImport == '7' || isfileImport == '8') && getTreeData();
678 }) 821 })
679 822
680 </script> 823 </script>
......
Styling with Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!