7daf9d9d by xukangle

Merge branch 'develop' into dev_20241202_xukangle

2 parents ae2ab82f b4f46b1b
This diff could not be displayed because it is too large.
...@@ -76,7 +76,7 @@ export const updateRuleBizState = (params) => request({ ...@@ -76,7 +76,7 @@ export const updateRuleBizState = (params) => request({
76 76
77 /** 获取数据库表列表 */ 77 /** 获取数据库表列表 */
78 export const getDatabase = (params) => request({ 78 export const getDatabase = (params) => request({
79 url: `${import.meta.env.VITE_APP_API_BASEURL}/data-source/get-source-list`, 79 url: `${import.meta.env.VITE_APP_DATA_SOURCE_URL}/data-source/get-source-list`,
80 method: 'post', 80 method: 'post',
81 data: params 81 data: params
82 }) 82 })
...@@ -138,23 +138,20 @@ export const getRuleTypeList = () => request({ ...@@ -138,23 +138,20 @@ export const getRuleTypeList = () => request({
138 138
139 // 获取规则大类的接口 139 // 获取规则大类的接口
140 export const getLargeCategoryList = () => request({ 140 export const getLargeCategoryList = () => request({
141 url:`${import.meta.env.VITE_APP_API_BASEURL}/data-dict/get-data-list`, 141 url: `${import.meta.env.VITE_APP_CONFIG_URL}/dict/data/get-by-dictType?dictType=${'规则大类'}`,
142 method: 'post', 142 method: 'get',
143 data: { paramCode: "LARGE-CATEGORY" }
144 }) 143 })
145 144
146 // 获取规则小类的接口 145 // 获取规则小类的接口
147 export const getSmallCategoryList = () => request({ 146 export const getSmallCategoryList = () => request({
148 url:`${import.meta.env.VITE_APP_API_BASEURL}/data-dict/get-data-list`, 147 url: `${import.meta.env.VITE_APP_CONFIG_URL}/dict/data/get-by-dictType?dictType=${'规则小类'}`,
149 method: 'post', 148 method: 'get',
150 data: { paramCode: "SMALL-CATEGORY" }
151 }) 149 })
152 150
153 // 获取规范性检验规则。 151 // 获取规范性检验规则。
154 export const getCheckRulesList = () => request({ 152 export const getCheckRulesList = () => request({
155 url:`${import.meta.env.VITE_APP_API_BASEURL}/data-dict/get-data-list`, 153 url: `${import.meta.env.VITE_APP_CONFIG_URL}/dict/data/get-by-dictType?dictType=${'正则校验'}`,
156 method: 'post', 154 method: 'get',
157 data: { paramCode: "REGULAR_RULE" }
158 }) 155 })
159 156
160 // 根据规则guid获取规则的详情信息。 157 // 根据规则guid获取规则的详情信息。
......
...@@ -23,6 +23,7 @@ export const parseAndDecodeUrl = (url:string) => { ...@@ -23,6 +23,7 @@ export const parseAndDecodeUrl = (url:string) => {
23 23
24 // 返回去掉主机信息和开头斜杠后的解码部分以及最后一个斜杠后面的内容 24 // 返回去掉主机信息和开头斜杠后的解码部分以及最后一个斜杠后面的内容
25 return { 25 return {
26 fileName: pathname,
26 decodedPath: pathname + search + hash, 27 decodedPath: pathname + search + hash,
27 lastPart: lastPart 28 lastPart: lastPart
28 }; 29 };
......
...@@ -27,8 +27,7 @@ export const refreshToken = (params) => { ...@@ -27,8 +27,7 @@ export const refreshToken = (params) => {
27 27
28 export const getSystemMenu = (params) => { 28 export const getSystemMenu = (params) => {
29 return request({ 29 return request({
30 url: `${ 30 url: `${import.meta.env.VITE_APP_AUTH_URL
31 import.meta.env.VITE_APP_AUTH_URL
32 }/product-menu-permission/tenant/get-product-menu?tenantGuid=${params.tenantGuid}&platformSystemGuid=32774fcfdf5e43e8b866660374d8bced`, 31 }/product-menu-permission/tenant/get-product-menu?tenantGuid=${params.tenantGuid}&platformSystemGuid=32774fcfdf5e43e8b866660374d8bced`,
33 method: "get", 32 method: "get",
34 }); 33 });
...@@ -217,3 +216,62 @@ export const exportDictionary = (params) => request({ ...@@ -217,3 +216,62 @@ export const exportDictionary = (params) => request({
217 data: params, 216 data: params,
218 responseType: 'blob' 217 responseType: 'blob'
219 }) 218 })
219
220 /**
221 * 数据源管理
222 **/
223 // 分页查询
224 export const getDataSourceList = (params) => request({
225 url: `${import.meta.env.VITE_APP_DATA_SOURCE_URL}/data-source/list`,
226 method: "post",
227 data: params,
228 });
229
230 // 获取数据源列表
231 export const getDataSource = (params) => request({
232 url: `${import.meta.env.VITE_APP_DATA_SOURCE_URL}/data-source/get-source-list`,
233 method: "post",
234 data: params,
235 });
236 // 新增
237 export const addDataSource = (params) => request({
238 url: `${import.meta.env.VITE_APP_DATA_SOURCE_URL}/data-source/save`,
239 method: "post",
240 data: params,
241 });
242 // 删除
243 export const deleteDataSource = (params) => request({
244 url: `${import.meta.env.VITE_APP_DATA_SOURCE_URL}/data-source/delete`,
245 method: "delete",
246 data: params,
247 });
248 // 修改
249 export const updateDataSource = (params) => request({
250 url: `${import.meta.env.VITE_APP_DATA_SOURCE_URL}/data-source/update`,
251 method: "put",
252 data: params,
253 });
254 // 查看数据源详情
255 export const getDataSourceDetail = (params) => request({
256 url: `${import.meta.env.VITE_APP_DATA_SOURCE_URL}/data-source/detail/${params}`,
257 method: "get",
258 });
259 // 连通检测
260 export const checkDataSourceConnect = (params) => request({
261 url: `${import.meta.env.VITE_APP_DATA_SOURCE_URL}/data-source/check-connect`,
262 method: "post",
263 params,
264 });
265 // 连接测试
266 export const checkDataSourceConnectTest = (params) => request({
267 url: `${import.meta.env.VITE_APP_DATA_SOURCE_URL}/data-source/check-connect-test`,
268 method: "post",
269 data: params,
270 });
271
272 // 获取所有参数列表
273 export const getAllFlowData = (params) => request({
274 url: `${import.meta.env.VITE_APP_CONFIG_URL}/dict/data/get-by-dictType`,
275 method: 'get',
276 params
277 })
......
...@@ -337,7 +337,8 @@ const handlePictureCardPreview = (file, item) => { ...@@ -337,7 +337,8 @@ const handlePictureCardPreview = (file, item) => {
337 const onUploadFilePreview = async (file, item) => { 337 const onUploadFilePreview = async (file, item) => {
338 let f = formInline.value[item.field].find(i => i.name == file.name); 338 let f = formInline.value[item.field].find(i => i.name == file.name);
339 let url = f.url; 339 let url = f.url;
340 const refSignInfo: any = await getDownFileSignByUrl(parseAndDecodeUrl(url).decodedPath); 340 let fileName: string = parseAndDecodeUrl(url).fileName;
341 const refSignInfo: any = await getDownFileSignByUrl(fileName);
341 if (!refSignInfo?.data) { 342 if (!refSignInfo?.data) {
342 refSignInfo?.msg && ElMessage.error(refSignInfo?.msg); 343 refSignInfo?.msg && ElMessage.error(refSignInfo?.msg);
343 return; 344 return;
...@@ -360,7 +361,7 @@ const onUploadFilePreview = async (file, item) => { ...@@ -360,7 +361,7 @@ const onUploadFilePreview = async (file, item) => {
360 } 361 }
361 362
362 const downloadTemplate = async (url) => { 363 const downloadTemplate = async (url) => {
363 const refSignInfo: any = await getDownFileSignByUrl(parseAndDecodeUrl(url).decodedPath); 364 const refSignInfo: any = await getDownFileSignByUrl(parseAndDecodeUrl(url).fileName);
364 if (!refSignInfo?.data) { 365 if (!refSignInfo?.data) {
365 refSignInfo?.msg && ElMessage.error(refSignInfo?.msg); 366 refSignInfo?.msg && ElMessage.error(refSignInfo?.msg);
366 return; 367 return;
...@@ -379,7 +380,7 @@ const downloadTemplate = async (url) => { ...@@ -379,7 +380,7 @@ const downloadTemplate = async (url) => {
379 380
380 const onUploadFileDownload = async (file, item) => { 381 const onUploadFileDownload = async (file, item) => {
381 let url = file.url; 382 let url = file.url;
382 const refSignInfo: any = await getDownFileSignByUrl(parseAndDecodeUrl(url).decodedPath); 383 const refSignInfo: any = await getDownFileSignByUrl(parseAndDecodeUrl(url).fileName);
383 if (!refSignInfo?.data) { 384 if (!refSignInfo?.data) {
384 refSignInfo?.msg && ElMessage.error(refSignInfo?.msg); 385 refSignInfo?.msg && ElMessage.error(refSignInfo?.msg);
385 return; 386 return;
......
...@@ -63,7 +63,7 @@ const routes: RouteRecordRaw[] = [ ...@@ -63,7 +63,7 @@ const routes: RouteRecordRaw[] = [
63 to.meta.title = `${to.query.name}-${to.query.status == 'Y'?'查看结果':'结果确认'}`; 63 to.meta.title = `${to.query.name}-${to.query.status == 'Y'?'查看结果':'结果确认'}`;
64 to.meta.editPage = to.query.status == 'Y'? false: true; 64 to.meta.editPage = to.query.status == 'Y'? false: true;
65 } else { 65 } else {
66 to.meta.title = `${to.query.name}-${to.query.type == 'confirm'?'结果确认':'结果修改'}`; 66 to.meta.title = `${to.query.name}-${to.query.status == 'Y'?'结果修改':'结果确认'}`;
67 to.meta.editPage = true; 67 to.meta.editPage = true;
68 } 68 }
69 } 69 }
...@@ -282,6 +282,27 @@ const routes: RouteRecordRaw[] = [ ...@@ -282,6 +282,27 @@ const routes: RouteRecordRaw[] = [
282 }, 282 },
283 ], 283 ],
284 }, 284 },
285 {
286 path: '/data-inventory/data-source',
287 component: Layout,
288 meta: {
289 title: '数据源管理',
290 icon: 'sidebar-videos',
291 },
292 children: [
293 {
294 path: '',
295 name: 'dataSource',
296 component: () => import('@/views/data_inventory/dataSource.vue'),
297 meta: {
298 title: '数据源管理',
299 sidebar: false,
300 breadcrumb: false,
301 cache: true
302 },
303 },
304 ],
305 },
285 ] 306 ]
286 307
287 export default routes 308 export default routes
......
...@@ -9,6 +9,7 @@ import { ElMessage, ElMessageBox } from 'element-plus'; ...@@ -9,6 +9,7 @@ import { ElMessage, ElMessageBox } from 'element-plus';
9 import { useRouter, useRoute } from "vue-router"; 9 import { useRouter, useRoute } from "vue-router";
10 import { MoreFilled } from "@element-plus/icons-vue"; 10 import { MoreFilled } from "@element-plus/icons-vue";
11 import { 11 import {
12 changeNum,
12 tagMethod, 13 tagMethod,
13 tagType, 14 tagType,
14 } from "@/utils/common"; 15 } from "@/utils/common";
...@@ -34,6 +35,13 @@ const route = useRoute(); ...@@ -34,6 +35,13 @@ const route = useRoute();
34 const { proxy } = getCurrentInstance() as any; 35 const { proxy } = getCurrentInstance() as any;
35 const path = route.path; 36 const path = route.path;
36 37
38 const loading = ref(false);
39 const defaultItemLogo = new URL('@/assets/images/home-finance-product.png', import.meta.url).href
40 const demandListData: any = ref([
41 { companyName: '北数所', listedNum: 16, processNum: 1235 },
42 { companyName: '深数所', listedNum: 16, processNum: 1235 },
43 { companyName: '苏数所', listedNum: 16, processNum: 1235 },
44 ]);
37 const searchItemList = ref([ 45 const searchItemList = ref([
38 { 46 {
39 type: "input", 47 type: "input",
...@@ -167,6 +175,9 @@ const getTableBtns = (row, includeDetail = true) => { ...@@ -167,6 +175,9 @@ const getTableBtns = (row, includeDetail = true) => {
167 175
168 const currTableData: any = ref({}); 176 const currTableData: any = ref({});
169 177
178 const btnClick = (btn) => {
179 }
180
170 const tableBtnClick = (scope, btn) => { 181 const tableBtnClick = (scope, btn) => {
171 const type = btn.value; 182 const type = btn.value;
172 const row = scope.row; 183 const row = scope.row;
...@@ -486,7 +497,33 @@ const createBtnVisible = computed(() => { ...@@ -486,7 +497,33 @@ const createBtnVisible = computed(() => {
486 </script> 497 </script>
487 498
488 <template> 499 <template>
489 <div class="container_wrap"> 500 <div class="container_wrap" v-loading="loading">
501 <div class="list-content">
502 <div class="card-content" v-for="item in demandListData" :key="item.guid">
503 <div class="header">
504 <img class="left-img" :src="(item.picUrl && typeof item.picUrl == 'string') ? item.picUrl : defaultItemLogo"
505 alt="" />
506 <div class="right-main">
507 <div class="title">{{ item.companyName ?? '--' }}</div>
508 <div class="count-group">
509 <div class="count-item">
510 <div class="item-label">已上架产品数</div>
511 <div class="item-num">{{ changeNum(item.listedNum) }}</div>
512 </div>
513 <div class="count-item">
514 <div class="item-label">审批中产品数</div>
515 <div class="item-num">{{ changeNum(item.processNum) }}</div>
516 </div>
517 </div>
518 </div>
519 </div>
520 <div class="operator-btn">
521 <div class="left-btn borderRight" @click="btnClick(item)">更新模板</div>
522 <div class="left-btn" @click="btnClick(item)">资产登记</div>
523 </div>
524 </div>
525 </div>
526 <div class="content_main_wrap">
490 <div class="table_tool_wrap"> 527 <div class="table_tool_wrap">
491 <TableTools :searchItems="searchItemList" :searchId="'register-data-search'" @search="toSearch" /> 528 <TableTools :searchItems="searchItemList" :searchId="'register-data-search'" @search="toSearch" />
492 <div class="tools_btns"> 529 <div class="tools_btns">
...@@ -554,6 +591,7 @@ const createBtnVisible = computed(() => { ...@@ -554,6 +591,7 @@ const createBtnVisible = computed(() => {
554 <Table v-else :tableInfo="tableInfo" @tableBtnClick="tableBtnClick" /> 591 <Table v-else :tableInfo="tableInfo" @tableBtnClick="tableBtnClick" />
555 <PageNav :class="[pageInfo.type]" :pageInfo="pageInfo" @pageChange="pageChange" /> 592 <PageNav :class="[pageInfo.type]" :pageInfo="pageInfo" @pageChange="pageChange" />
556 </div> 593 </div>
594 </div>
557 <Dialog :dialogInfo="passDialogInfo" @btnClick="passDialogBtnClick" /> 595 <Dialog :dialogInfo="passDialogInfo" @btnClick="passDialogBtnClick" />
558 <Dialog :dialogInfo="rejectDialogInfo" @btnClick="rejectDialogBtnClick" /> 596 <Dialog :dialogInfo="rejectDialogInfo" @btnClick="rejectDialogBtnClick" />
559 </div> 597 </div>
...@@ -561,7 +599,13 @@ const createBtnVisible = computed(() => { ...@@ -561,7 +599,13 @@ const createBtnVisible = computed(() => {
561 599
562 <style scoped lang="scss"> 600 <style scoped lang="scss">
563 .container_wrap { 601 .container_wrap {
564 padding: 0 16px; 602 padding: 16px 16px 0;
603 display: flex;
604 flex-direction: column;
605 }
606
607 .content_main_wrap {
608 flex: 1;
565 } 609 }
566 610
567 .table_panel { 611 .table_panel {
...@@ -696,4 +740,83 @@ const createBtnVisible = computed(() => { ...@@ -696,4 +740,83 @@ const createBtnVisible = computed(() => {
696 } 740 }
697 } 741 }
698 } 742 }
743
744 .list-content {
745 display: flex;
746 justify-content: space-between;
747 flex-wrap: wrap;
748 margin-bottom: 8px;
749
750 .card-content {
751 width: calc(33.33% - 10px);
752 padding: 16px;
753 box-shadow: 0 0 0 1px #d9d9d9;
754
755 .header {
756 display: flex;
757 margin-bottom: 16px;
758
759 img {
760 width: 80px;
761 margin-right: 16px;
762 }
763
764 .title {
765 font-size: 16px;
766 color: #212121;
767 font-weight: 600;
768 margin-bottom: 8px;
769 }
770
771 .right-main {
772 width: calc(100% - 96px);
773 display: flex;
774 flex-direction: column;
775 justify-content: space-between;
776
777 .count-group {
778 display: flex;
779 justify-content: space-between;
780
781 .item-num {
782 font-size: 20px;
783 font-weight: 600;
784 color: #212121;
785 margin-top: 8px;
786 }
787 }
788 }
789 }
790
791 .operator-btn {
792 display: flex;
793 justify-content: space-between;
794 align-items: center;
795 box-shadow: 0 0 0 1px #d9d9d9;
796 position: relative;
797
798 &::after {
799 content: '';
800 width: 0;
801 height: 100%;
802 border-left: 1px solid #d9d9d9;
803 position: absolute;
804 left: 50%;
805 transform: translateX(-50%);
806 }
807
808 >.left-btn {
809 width: 50%;
810 height: 40px;
811 line-height: 40px;
812 text-align: center;
813 cursor: pointer;
814
815 &:hover {
816 color: #4fa1a4;
817 }
818 }
819 }
820 }
821 }
699 </style> 822 </style>
......
1 <route lang="yaml">
2 name: dataSource
3 </route>
4
5 <script lang="ts" setup name="dataSource">
6 import { ref, onMounted } from "vue";
7 import { ElMessage, ElMessageBox } from "element-plus";
8 import TableTools from "@/components/Tools/table_tools.vue";
9
10 import {
11 addDataSource,
12 getDataSourceList,
13 deleteDataSource,
14 updateDataSource,
15 getDataSourceDetail,
16 checkDataSourceConnect,
17 checkDataSourceConnectTest,
18 getAllFlowData
19 } from "@/api/modules/queryService";
20
21 const { proxy } = getCurrentInstance() as any;
22
23 const searchItemList = ref([
24 {
25 type: "select",
26 label: "",
27 field: "systemLayer",
28 default: "",
29 placeholder: "系统分层",
30 options: [
31 { label: "业务系统", value: "业务系统" },
32 { label: "数据中心", value: "数据中心" },
33 ],
34 clearable: true,
35 },
36 {
37 type: "select",
38 label: "",
39 field: "databaseType",
40 default: "",
41 placeholder: "库类型",
42 options: [
43 { label: "mysql", value: "mysql" },
44 { label: "doris", value: "doris" },
45 { label: "oracle", value: "oracle" },
46 ],
47 clearable: true,
48 },
49 {
50 type: "select",
51 label: "",
52 field: "connectStatus",
53 default: "",
54 placeholder: "连通状态",
55 options: [
56 { label: "已连通", value: "1" },
57 { label: "连通失败", value: "2" },
58 ],
59 clearable: true,
60 },
61 {
62 type: "input",
63 label: "",
64 field: "databaseNameZh",
65 default: "",
66 placeholder: "数据源名称",
67 clearable: true,
68 },
69 {
70 type: "input",
71 label: "",
72 field: "databaseNameEn",
73 default: "",
74 placeholder: "数据库名",
75 clearable: true,
76 },
77 ]);
78
79 const currTableData: any = ref<Object>({});
80 const page = ref({
81 limit: 50,
82 curr: 1,
83 sizes: [
84 { label: "10", value: 10 },
85 { label: "50", value: 50 },
86 { label: "100", value: 100 },
87 { label: "150", value: 150 },
88 { label: "200", value: 200 },
89 ],
90 systemLayer: '',
91 databaseType: '',
92 connectStatus: '',
93 databaseNameZh: '',
94 databaseNameEn: ''
95 });
96 const selectRowData = ref([]);
97 const tableInfo = ref({
98 id: "data-source-table",
99 multiple: true,
100 fields: [
101 { label: "序号", type: "index", width: 56, align: "center" },
102 { label: "数据源名称", field: "databaseNameZh", width: 120 },
103 { label: "系统分层", field: "systemLayer", width: 96 },
104 { label: "库类型", field: "databaseType", width: 96 },
105 { label: "数据库名", field: "databaseNameEn", width: 200 },
106 {
107 label: "连通状态",
108 field: "connectStatus",
109 type: "tag",
110 width: 96,
111 align: "center",
112 },
113 { label: "连通时间", field: "lastCheckTime", width: 172 },
114 { label: "操作人", field: "updateUserName", width: 140 },
115 { label: "更新时间", field: "updateTime", width: 172 },
116 ],
117 data: [],
118 page: {
119 type: "normal",
120 rows: 0,
121 ...page.value,
122 },
123 actionInfo: {
124 label: "操作",
125 type: "btn",
126 width: 160,
127 btns: [
128 { label: "编辑", value: "edit" },
129 { label: "连通测试", value: "test" },
130 { label: "删除", value: "delete" },
131 ],
132 },
133 loading: false,
134 });
135
136 const tabActiveName = ref("1");
137 const tabsInfo: any = ref({
138 type: "tabs",
139 title: "",
140 style: {
141 padding: "0 24px",
142 },
143 tabsInfo: {
144 activeName: "",
145 tabs: [
146 { label: "常规", name: "常规" },
147 // { label: "SSL", name: "SSL" }, //未支持,先隐藏掉
148 // { label: "SSH", name: "SSH" },
149 // { label: "HTTP", name: "HTTP" },
150 ],
151 },
152 });
153 const formItems: any = ref([]);
154 const formRules: any = ref({});
155 const flowList: any = ref([])
156 const formInfo: any = ref({
157 type: "form",
158 title: "",
159 style: {
160 padding: "0 24px",
161 overflow: 'hidden auto'
162 },
163 formInfo: {
164 id: "add-source-form",
165 items: formItems.value,
166 rules: formRules.value,
167 },
168 });
169 const contents: any = ref({
170 normal: {
171 items: [
172 {
173 label: "数据源名称",
174 type: "input",
175 placeholder: "请输入",
176 field: "databaseNameZh",
177 default: "",
178 clearable: true,
179 required: true,
180 },
181 {
182 label: "系统分层",
183 type: "select",
184 placeholder: "请选择",
185 field: "systemLayer",
186 default: "",
187 options: [
188 {
189 label: "业务系统",
190 value: "业务系统",
191 },
192 {
193 label: "数据中心",
194 value: "数据中心",
195 },
196 ],
197 clearable: true,
198 required: true,
199 },
200 {
201 label: "库类型",
202 type: "select",
203 placeholder: "请选择",
204 field: "databaseType",
205 default: "",
206 options: [
207 { label: "mysql", value: "mysql" },
208 { label: "doris", value: "doris" },
209 { label: "oracle", value: "oracle" },
210 ],
211 clearable: true,
212 required: true,
213 },
214 {
215 label: "业务系统",
216 type: "select",
217 placeholder: "请选择",
218 field: "bizSystem",
219 default: "",
220 options: [],
221 clearable: true,
222 required: true,
223 },
224 {
225 label: "集群信息",
226 type: "textarea-group",
227 placeholder: "请输入",
228 field: "jqxx",
229 default: "",
230 tooltipContent:
231 "格式:doris-fe-zs.doris:8030,doris-fe-zs.doris:8090 多个地址用英文半角逗号分隔",
232 children: [
233 {
234 label: "feLoadUrl",
235 type: "textarea",
236 placeholder: "请输入",
237 field: "feLoadUrl",
238 default: "",
239 clearable: true,
240 required: true,
241 block: true,
242 },
243 {
244 label: "beLoadUrl",
245 type: "textarea",
246 placeholder: "请输入",
247 field: "beLoadUrl",
248 default: "",
249 clearable: true,
250 required: true,
251 block: true,
252 },
253 {
254 label: "dorisJdbcUrl",
255 type: "textarea",
256 placeholder: "请输入",
257 field: "dorisJdbcUrl",
258 default: "",
259 clearable: true,
260 required: true,
261 block: true,
262 },
263 ],
264 block: true,
265 visible: false,
266 },
267 {
268 label: "服务器",
269 type: "input",
270 placeholder: "请输入",
271 field: "host",
272 default: "",
273 clearable: true,
274 required: true,
275 },
276 {
277 label: "端口",
278 type: "input",
279 placeholder: "请输入",
280 field: "port",
281 default: "",
282 clearable: true,
283 required: true,
284 },
285 {
286 label: "用户名",
287 type: "input",
288 placeholder: "请输入",
289 field: "logonUser",
290 default: "",
291 clearable: true,
292 required: true,
293 autocompleteSetting: {
294 autocomplete: "off",
295 readonly: true,
296 },
297 },
298 {
299 label: "密码",
300 type: "password",
301 placeholder: "请输入",
302 field: "password",
303 default: "",
304 clearable: true,
305 required: true,
306 autocompleteSetting: {
307 autocomplete: "off",
308 readonly: true,
309 },
310 },
311 {
312 label: "数据库名",
313 type: "input",
314 placeholder: "请输入",
315 field: "databaseNameEn",
316 default: "",
317 clearable: true,
318 required: true,
319 },
320 {
321 label: "连接属性",
322 type: "textarea-tips",
323 placeholder: "请输入",
324 field: "linkage",
325 default: "",
326 tips: {
327 type: "table",
328 size: 400,
329 placement: "right",
330 offset: 12,
331 tableInfo: {
332 id: "",
333 fields: [
334 { label: "数据库", field: "jsmc", width: 120 },
335 { label: "连接属性", field: "sx", width: 200 },
336 ],
337 data: [
338 {
339 jsmc: "MYSQL8.0",
340 sx: "列出支持的连接属性,并给出解释和范例,多个属性用;分割",
341 cjsj: "2022-12-12 08:12:12",
342 },
343 {
344 jsmc: "MYSQL8.0",
345 sx: "服务器的时区:serverTimezone=Asia/Shanghai;",
346 cjsj: "2022-12-12 08:12:12",
347 },
348 {
349 jsmc: "MYSQL8.0",
350 sx: "useUnicode=utf8;",
351 cjsj: "2022-12-12 08:12:12",
352 },
353 {
354 jsmc: "MYSQL8.0",
355 sx: "characterEncoding=utf8;",
356 cjsj: "2022-12-12 08:12:12",
357 },
358 {
359 jsmc: "MYSQL8.0",
360 sx: "useSSL=false",
361 cjsj: "2022-12-12 08:12:12",
362 },
363 ],
364 showPage: false,
365 tableTool: [],
366 actionInfo: {
367 show: false,
368 },
369 btn: {
370 label: "",
371 value: "QuestionFilled",
372 },
373 },
374 },
375 clearable: true,
376 required: false,
377 block: true,
378 },
379 ],
380 rules: {
381 databaseNameZh: [
382 {
383 validator: (rule: any, value: any, callback: any) => {
384 if (value === "") {
385 callback(new Error("请填写数据源名称"));
386 } else {
387 if (
388 dialogInfo.value.type == "edit" &&
389 value == currTableData.value.databaseNameZh
390 ) {
391 callback();
392 return;
393 }
394 callback();
395 // let params: any = {
396 // dataPermissionName: value,
397 // };
398 // if (dialogInfo.value.type == 'edit') {
399 // params.guid = currTableData.value.guid
400 // }
401 // checkPermissionDict(params)
402 // .then((res: any) => {
403 // if (res.code == proxy.$passCode) {
404 // if (res.data) {
405 // callback(new Error("该名称已存在,请填写其他名称"));
406 // } else {
407 // callback();
408 // }
409 // } else {
410 // callback(new Error(res.msg));
411 // }
412 // })
413 // .catch((xhr) => {
414 // callback(new Error(xhr.msg));
415 // });
416 }
417 },
418 trigger: "blur",
419 },
420 ],
421 bizSystem: [{
422 required: true,
423 message: "请选择业务系统",
424 trigger: "change",
425 }],
426 systemLayer: [
427 {
428 required: true,
429 message: "请选择系统分层",
430 trigger: "change",
431 },
432 ],
433 databaseType: [
434 {
435 required: true,
436 message: "请选择库类型",
437 trigger: "change",
438 },
439 ],
440 host: [
441 {
442 required: true,
443 message: "请填写服务器ip地址",
444 trigger: "blur",
445 },
446 ],
447 port: [
448 {
449 required: true,
450 message: "请填写端口号",
451 trigger: "blur",
452 },
453 ],
454 logonUser: [
455 {
456 required: true,
457 message: "请填写用户名",
458 trigger: "blur",
459 },
460 ],
461 password: [
462 {
463 required: true,
464 message: "请填写密码",
465 trigger: "blur",
466 },
467 ],
468 databaseNameEn: [
469 {
470 required: true,
471 message: "请填写数据库名",
472 trigger: "blur",
473 },
474 ],
475 feLoadUrl: [
476 {
477 validator: (rule: any, value: any, callback: any) => {
478 if (value === "") {
479 callback(new Error("请填写feLoadUrl"));
480 } else {
481 if (
482 dialogInfo.value.type == "edit" &&
483 value == currTableData.value.feLoadUrl
484 ) {
485 callback();
486 return;
487 }
488 callback();
489 }
490 },
491 trigger: "blur",
492 },
493 ],
494 beLoadUrl: [
495 {
496 validator: (rule: any, value: any, callback: any) => {
497 if (value === "") {
498 callback(new Error("请填写beLoadUrl"));
499 } else {
500 if (
501 dialogInfo.value.type == "edit" &&
502 value == currTableData.value.beLoadUrl
503 ) {
504 callback();
505 return;
506 }
507 callback();
508 }
509 },
510 trigger: "blur",
511 },
512 ],
513 dorisJdbcUrl: [
514 {
515 validator: (rule: any, value: any, callback: any) => {
516 if (value === "") {
517 callback(new Error("请填写dorisJdbcUrl"));
518 } else {
519 if (
520 dialogInfo.value.type == "edit" &&
521 value == currTableData.value.dorisJdbcUrl
522 ) {
523 callback();
524 return;
525 }
526 callback();
527 }
528 },
529 trigger: "blur",
530 },
531 ],
532 },
533 },
534 ssl: {
535 items: [
536 {
537 label: "",
538 type: "checkbox",
539 col: "margin_b_0",
540 placeholder: "使用SSL",
541 field: "useSsl",
542 required: false,
543 block: true,
544 },
545 {
546 label: "",
547 type: "checkbox-panel",
548 placeholder: "使用验证",
549 field: "yz",
550 children: [
551 {
552 label: "客户端秘钥",
553 type: "file-upload",
554 placeholder: "选择文件上传",
555 field: "khdmy",
556 disabled: true,
557 required: true,
558 block: true,
559 },
560 {
561 label: "客户端证书",
562 type: "file-upload",
563 placeholder: "选择文件上传",
564 field: "khdzs",
565 disabled: true,
566 required: true,
567 block: true,
568 },
569 {
570 label: "CA证书",
571 type: "file-upload",
572 placeholder: "选择文件上传",
573 field: "cazs",
574 disabled: true,
575 required: true,
576 block: true,
577 },
578 {
579 label: "指定密码检索表",
580 type: "append-empty",
581 placeholder: "请输入",
582 field: "khdzs",
583 disabled: true,
584 required: true,
585 block: true,
586 },
587 ],
588 required: false,
589 block: true,
590 },
591 ],
592 rules: {},
593 },
594 ssh: {
595 items: [
596 {
597 label: "",
598 type: "checkbox-panel",
599 placeholder: "使用SSH",
600 field: "yz",
601 children: [
602 {
603 label: "主机名或IP地址",
604 type: "input",
605 placeholder: "请输入",
606 field: "khdmy",
607 required: false,
608 disabled: true,
609 },
610 {
611 label: "端口",
612 type: "input",
613 placeholder: "请输入",
614 field: "khdzs",
615 required: false,
616 disabled: true,
617 },
618 {
619 label: "用户名",
620 type: "input",
621 placeholder: "请输入",
622 field: "cazs",
623 required: false,
624 disabled: true,
625 },
626 {
627 label: "验证方法",
628 type: "select",
629 placeholder: "请选择",
630 field: "yzfs",
631 options: [
632 { label: "密码", value: "pwd" },
633 { label: "手机号", value: "tel" },
634 ],
635 required: false,
636 disabled: true,
637 },
638 {
639 label: "密码",
640 type: "input",
641 placeholder: "请输入",
642 field: "pwd",
643 required: false,
644 disabled: true,
645 },
646 {
647 label: "",
648 type: "checkbox",
649 placeholder: "保存密码",
650 field: "savePwd",
651 required: false,
652 },
653 ],
654 required: false,
655 block: true,
656 },
657 ],
658 rules: {},
659 },
660 http: {
661 items: [
662 {
663 label: "",
664 type: "checkbox-input",
665 placeholder: "使用HTTP通道",
666 field: "tddz",
667 children: [
668 {
669 label: "",
670 type: "input",
671 placeholder: "通道地址",
672 field: "khdmy",
673 required: false,
674 disabled: true,
675 },
676 ],
677 block: true,
678 },
679 {
680 label: "",
681 type: "tabs-panel-card",
682 placeholder: "用base64编码传出查询",
683 field: "basebm",
684 tabsInfo: {
685 type: "card",
686 activeName: "yz",
687 col: "border",
688 tabs: [
689 {
690 label: "验证",
691 name: "yz",
692 pane: {
693 type: "form",
694 title: "",
695 formInfo: {
696 id: "",
697 items: [
698 {
699 label: "",
700 type: "checkbox-panel",
701 col: "margin_b_0 border_none col_3",
702 placeholder: "使用密码验证",
703 field: "mmyz",
704 children: [
705 {
706 label: "",
707 type: "input",
708 placeholder: "用户名",
709 field: "cazs",
710 required: false,
711 disabled: true,
712 },
713 {
714 label: "",
715 type: "input",
716 placeholder: "密码",
717 field: "pwd",
718 required: false,
719 disabled: true,
720 },
721 {
722 label: "",
723 type: "checkbox",
724 placeholder: "保存密码",
725 field: "savePwd",
726 required: false,
727 },
728 ],
729 required: false,
730 block: true,
731 },
732 {
733 label: "",
734 type: "checkbox-panel",
735 col: "border_none",
736 placeholder: "使用证书验证",
737 field: "zsyz",
738 children: [
739 {
740 label: "客户端秘钥",
741 type: "file-upload",
742 placeholder: "选择文件上传",
743 field: "khdmy",
744 disabled: true,
745 required: true,
746 block: true,
747 },
748 {
749 label: "客户端证书",
750 type: "file-upload",
751 placeholder: "选择文件上传",
752 field: "khdzs",
753 disabled: true,
754 required: true,
755 block: true,
756 },
757 {
758 label: "CA证书",
759 type: "file-upload",
760 placeholder: "选择文件上传",
761 field: "cazs",
762 disabled: true,
763 required: true,
764 block: true,
765 },
766 {
767 label: "密码短语",
768 type: "append-empty",
769 placeholder: "请输入",
770 field: "khdzs",
771 disabled: true,
772 required: true,
773 block: true,
774 },
775 ],
776 required: false,
777 block: true,
778 },
779 ],
780 },
781 },
782 },
783 {
784 label: "代理服务器",
785 name: "dl",
786 pane: {
787 type: "form",
788 title: "",
789 formInfo: {
790 id: "",
791 items: [
792 {
793 label: "",
794 type: "checkbox-panel",
795 col: "border_none",
796 placeholder: "使用代理服务器",
797 field: "yz",
798 children: [
799 {
800 label: "主机名或IP地址",
801 type: "input",
802 placeholder: "请输入",
803 field: "khdmy",
804 required: false,
805 disabled: true,
806 },
807 {
808 label: "端口",
809 type: "input",
810 placeholder: "请输入",
811 field: "khdzs",
812 required: false,
813 disabled: true,
814 },
815 {
816 label: "用户名",
817 type: "input",
818 placeholder: "请输入",
819 field: "cazs",
820 required: false,
821 disabled: true,
822 },
823 {
824 label: "验证方法",
825 type: "select",
826 placeholder: "请选择",
827 field: "yzfs",
828 options: [
829 { label: "密码", value: "pwd" },
830 { label: "手机号", value: "tel" },
831 ],
832 required: false,
833 disabled: true,
834 },
835 {
836 label: "密码",
837 type: "input",
838 placeholder: "请输入",
839 field: "pwd",
840 required: false,
841 disabled: true,
842 },
843 {
844 label: "",
845 type: "checkbox",
846 placeholder: "保存密码",
847 field: "savePwd",
848 required: false,
849 },
850 ],
851 required: false,
852 block: true,
853 },
854 ],
855 },
856 },
857 },
858 ],
859 },
860 children: [
861 {
862 label: "主机名或IP地址",
863 type: "input",
864 placeholder: "请输入",
865 field: "khdmy",
866 required: false,
867 },
868 {
869 label: "端口",
870 type: "input",
871 placeholder: "请输入",
872 field: "khdzs",
873 required: false,
874 },
875 {
876 label: "用户名",
877 type: "input",
878 placeholder: "请输入",
879 field: "cazs",
880 required: false,
881 },
882 {
883 label: "验证方法",
884 type: "select",
885 placeholder: "请选择",
886 field: "yzfs",
887 default: "pwd",
888 options: [
889 { label: "密码", value: "pwd" },
890 { label: "手机号", value: "tel" },
891 ],
892 required: false,
893 },
894 {
895 label: "密码",
896 type: "input",
897 placeholder: "请输入",
898 field: "pwd",
899 required: false,
900 },
901 {
902 label: "",
903 type: "checkbox",
904 placeholder: "保存密码",
905 field: "savePwd",
906 required: false,
907 },
908 ],
909 required: false,
910 block: true,
911 },
912 ],
913 rules: {},
914 },
915 });
916
917 const dialogRef = ref();
918 const dialogInfo = ref({
919 visible: false,
920 size: 700,
921 direction: "column",
922 height: '440px',
923 header: {
924 title: "",
925 },
926 type: "",
927 readonly: false,
928 contents: [],
929 footer: {
930 btns: [
931 { type: "default", label: "取消", value: "cancel" },
932 { type: "primary", label: "确定", value: "submit" },
933 ],
934 textBtns: [{ type: "primary", label: "连通测试", value: "connect" }],
935 },
936 });
937
938 const setFormItems = (name, info: any = null) => {
939 let contentFormInfo: any = {};
940 if (name == "常规") {
941 tabActiveName.value = "1";
942 contentFormInfo = contents.value["normal"];
943 } else if (name == "SSL") {
944 tabActiveName.value = "2";
945 contentFormInfo = contents.value["ssl"];
946 } else if (name == "SSH") {
947 tabActiveName.value = "3";
948 contentFormInfo = contents.value["ssh"];
949 } else if (name == "HTTP") {
950 tabActiveName.value = "4";
951 contentFormInfo = contents.value["http"];
952 }
953
954 tabsInfo.value.tabsInfo.activeName = name;
955 formItems.value = contentFormInfo.items;
956 formRules.value = contentFormInfo.rules;
957
958 if (info !== null) {
959 const type = dialogInfo.value.type;
960 formItems.value.map((item) => {
961 if (
962 item.field == "host" ||
963 item.field == "port" ||
964 item.field == "logonUser" ||
965 item.field == "password"
966 ) {
967 if (type == "edit" || type == "detail") {
968 item.default = info?.[item.field] ?? "";
969 } else {
970 item.default = info[item.field] ?? "";
971 }
972 if (item.field == "logonUser" || item.field == "password") {
973 item.autocompleteSetting.readonly = true;
974 }
975 } else if (item.field == "jqxx") {
976 item.visible = info.databaseType == "doris";
977 item.children.map((child) => {
978 if (type == 'edit' || type == 'detail') {
979 child.default = info?.[child.field] ?? "";
980 } else {
981 child.default = info[child.field] ?? "";
982 }
983 });
984 } else if (item.field == 'bizSystem') {
985 item.visible = info.systemLayer == '业务系统';
986 item.default = info[item.field] || "";
987 }
988 else {
989 item.default = info[item.field] || "";
990 }
991 });
992 } else {
993 formItems.value.map((item) => {
994 if (item.field == "logonUser" || item.field == "password") {
995 item.autocompleteSetting.readonly = true;
996 }
997 });
998 }
999
1000 formInfo.value.formInfo.items = formItems.value;
1001 formInfo.value.formInfo.rules = formRules.value;
1002
1003 const content: any = [tabsInfo.value, formInfo.value];
1004 dialogInfo.value.contents = content;
1005 };
1006
1007 const getFirstPageData = () => {
1008 page.value.curr = 1;
1009 getTableData();
1010 };
1011 onMounted(() => {
1012 getAllFlowData({ dictType: "业务系统" }).then((res) => {
1013 flowList.value = res.data
1014 contents.value.normal.items[3].options = flowList.value
1015 })
1016 })
1017 const toSearch = (val: any, clear: boolean = false) => {
1018 if (clear) {
1019 searchItemList.value.map((item) => (item.default = ""));
1020 page.value.systemLayer = "";
1021 page.value.databaseType = "";
1022 page.value.connectStatus = "";
1023 page.value.databaseNameZh = "";
1024 page.value.databaseNameEn = "";
1025 } else {
1026 page.value.systemLayer = val.systemLayer;
1027 page.value.databaseType = val.databaseType;
1028 page.value.connectStatus = val.connectStatus;
1029 page.value.databaseNameZh = val.databaseNameZh;
1030 page.value.databaseNameEn = val.databaseNameEn;
1031 }
1032 getTableData();
1033 };
1034
1035 const getTableData = () => {
1036 tableInfo.value.loading = true;
1037 getDataSourceList({
1038 pageIndex: page.value.curr,
1039 pageSize: page.value.limit,
1040 systemLayer: page.value.systemLayer,
1041 databaseType: page.value.databaseType,
1042 connectStatus: page.value.connectStatus,
1043 databaseNameZh: page.value.databaseNameZh,
1044 databaseNameEn: page.value.databaseNameEn
1045 })
1046 .then((res: any) => {
1047 if (res.code == proxy.$passCode) {
1048 const data = res.data || {};
1049 tableInfo.value.data = data.records || [];
1050 tableInfo.value.page.limit = data.pageSize;
1051 tableInfo.value.page.curr = data.pageIndex;
1052 tableInfo.value.page.rows = data.totalRows;
1053 } else {
1054 ElMessage({
1055 type: "error",
1056 message: res.msg,
1057 });
1058 }
1059 tableInfo.value.loading = false;
1060 })
1061 .catch((xhr) => {
1062 tableInfo.value.loading = false;
1063 });
1064 };
1065
1066 const tableSelectionChange = (val) => {
1067 selectRowData.value = val.map((item) => item.guid);
1068 };
1069
1070 const tablePageChange = (info) => {
1071 page.value.curr = Number(info.curr);
1072 page.value.limit = Number(info.limit);
1073 getTableData();
1074 };
1075
1076 const tabChange = (tabName) => {
1077 // TODO.等添加了tab切换之后再保留旧值.
1078 setFormItems(tabName);
1079 };
1080
1081 /** 表单修改时的原始值 */
1082 const originValue: any = ref({});
1083
1084 const formSelectChange = (val, row, info) => {
1085 console.log(row, info)
1086 if (row.field == "databaseType" || row.field == 'systemLayer') {
1087 if (tabsInfo.value.tabsInfo.activeName == "常规") {
1088 let newInfo = originValue.value = Object.assign(originValue.value, info);
1089 setFormItems("常规", newInfo);
1090 }
1091 }
1092 };
1093
1094 const tableBtnClick = (scope, btn) => {
1095 const type = btn.value;
1096 const row = scope.row;
1097 currTableData.value = row;
1098 if (type == "edit") {
1099 dialogInfo.value.type = type;
1100 dialogInfo.value.header.title = "编辑数据源";
1101 const guid = row.guid;
1102 getDataSourceDetail(guid).then((res: any) => {
1103 if (res.code == proxy.$passCode && res.data) {
1104 const data = res.data;
1105 currTableData.value = data;
1106 setDetailInfo();
1107 } else {
1108 ElMessage({
1109 type: "error",
1110 message: res.msg,
1111 });
1112 }
1113 });
1114 } else if (type == "test") {
1115 checkConnect({});
1116 } else if (type == "delete") {
1117 open("此操作将永久删除, 是否继续?", "warning");
1118 }
1119 };
1120
1121 const open = (msg, type, isBatch = false) => {
1122 ElMessageBox.confirm(msg, "提示", {
1123 confirmButtonText: "确定",
1124 cancelButtonText: "取消",
1125 type: type,
1126 }).then(() => {
1127 let guids = [currTableData.value.guid];
1128 if (isBatch) {
1129 guids = selectRowData.value;
1130 }
1131 deleteDataSource(guids).then((res: any) => {
1132 if (res.code == proxy.$passCode) {
1133 getTableData();
1134 ElMessage({
1135 type: "success",
1136 message: "删除成功",
1137 });
1138 } else {
1139 ElMessage({
1140 type: "error",
1141 message: res.msg,
1142 });
1143 }
1144 });
1145 });
1146 };
1147
1148 const setDetailInfo = async () => {
1149 let info = Object.assign({}, currTableData.value, currTableData.value.dataConfigure || {});
1150 let newInfo = originValue.value = Object.assign(originValue.value, info);
1151 setFormItems("常规", newInfo);
1152 dialogInfo.value.visible = true;
1153 };
1154
1155 const checkConnect = (val) => {
1156 let params = { guid: currTableData.value.guid };
1157 checkDataSourceConnect(params).then((res: any) => {
1158 if (res.code == proxy.$passCode && res.data && res.data == "1") {
1159 getTableData();
1160 ElMessage({
1161 type: "success",
1162 message: "连通成功",
1163 });
1164 } else {
1165 getTableData();
1166 ElMessage({
1167 type: "error",
1168 message: "连通失败",
1169 });
1170 }
1171 });
1172 };
1173
1174 const loadDialog = async () => {
1175 dialogInfo.value.type = "add";
1176 dialogInfo.value.header.title = "添加数据源";
1177 originValue.value = {};
1178 setFormItems("常规", {});
1179 dialogInfo.value.visible = true;
1180 };
1181
1182 const batching = (type) => {
1183 if (type == "delete") {
1184 if (selectRowData.value.length == 0) {
1185 ElMessage({
1186 type: "error",
1187 message: "请选择需要删除的数据",
1188 });
1189 return;
1190 }
1191 open("此操作将永久删除, 是否继续?", "warning", true);
1192 }
1193 };
1194
1195 const dialogBtnClick = (btn, info) => {
1196 if (btn.value == "submit") {
1197 // dialogInfo.value.footer.btns.map((item: any) => item.disabled = true)
1198 const params = { ...info };
1199 delete params.host;
1200 delete params.port;
1201 delete params.logonUser;
1202 delete params.password;
1203 delete params.feLoadUrl;
1204 delete params.beLoadUrl;
1205 delete params.dorisJdbcUrl;
1206 params.dataConnectionContract = tabActiveName.value;
1207 if (dialogInfo.value.type == "add") {
1208 params.dataConfigureAddDTO = {
1209 host: info.host,
1210 port: info.port,
1211 logonUser: info.logonUser,
1212 password: info.password,
1213 feLoadUrl: info.feLoadUrl,
1214 beLoadUrl: info.beLoadUrl,
1215 dorisJdbcUrl: info.dorisJdbcUrl
1216 };
1217 addDataSource(params)
1218 .then((res: any) => {
1219 if (res.code == proxy.$passCode) {
1220 getFirstPageData();
1221 ElMessage({
1222 type: "success",
1223 message: "添加数据源成功",
1224 });
1225 dialogInfo.value.visible = false;
1226 } else {
1227 ElMessage({
1228 type: "error",
1229 message: res.msg,
1230 });
1231 // dialogInfo.value.footer.btns.map((item: any) => delete item.disabled)
1232 }
1233 })
1234 .catch(() => {
1235 // dialogInfo.value.footer.btns.map((item: any) => delete item.disabled)
1236 });
1237 } else {
1238 params.dataConfigureUpdateDTO = {
1239 guid: currTableData.value.dataConfigure.guid,
1240 host: info.host,
1241 port: info.port,
1242 logonUser: info.logonUser,
1243 password:
1244 info.password == "******"
1245 ? currTableData.value.dataConfigure.password
1246 : info.password,
1247 feLoadUrl: info.feLoadUrl,
1248 beLoadUrl: info.beLoadUrl,
1249 dorisJdbcUrl: info.dorisJdbcUrl
1250 };
1251 params.guid = currTableData.value.guid;
1252 updateDataSource(params)
1253 .then((res: any) => {
1254 if (res.code == proxy.$passCode) {
1255 getTableData();
1256 ElMessage({
1257 type: "success",
1258 message: "修改数据源成功",
1259 });
1260 dialogInfo.value.visible = false;
1261 } else {
1262 ElMessage({
1263 type: "error",
1264 message: res.msg,
1265 });
1266 }
1267 // dialogInfo.value.footer.btns.map((item: any) => delete item.disabled)
1268 })
1269 .catch(() => {
1270 // dialogInfo.value.footer.btns.map((item: any) => delete item.disabled)
1271 });
1272 }
1273 } else if (btn.value == "connect") {
1274 const params = {
1275 databaseType: info.databaseType,
1276 databaseNameEn: info.databaseNameEn,
1277 host: info.host,
1278 port: info.port,
1279 logonUser: info.logonUser,
1280 password: info.password,
1281 linkage: info.linkage,
1282 };
1283 checkDataSourceConnectTest(params).then((res: any) => {
1284 if (res.code == proxy.$passCode) {
1285 if (res.data && res.data == "1") {
1286 ElMessage({
1287 type: "success",
1288 message: "连通成功",
1289 });
1290 } else {
1291 ElMessage({
1292 type: "error",
1293 message: "连通失败",
1294 });
1295 }
1296 } else {
1297 ElMessage({
1298 type: "error",
1299 message: res.msg,
1300 });
1301 }
1302 });
1303 } else if (btn.value == "cancel") {
1304 // dialogInfo.value.footer.btns.map((item: any) => delete item.disabled)
1305 nextTick(() => {
1306 dialogInfo.value.visible = false;
1307 });
1308 }
1309 };
1310 </script>
1311
1312 <template>
1313 <div class="container_wrap">
1314 <div class="table_tool_wrap has_search">
1315 <TableTools :searchItems="searchItemList" :searchId="'data-source-search'" @search="toSearch" />
1316 <div class="tools_btns">
1317 <el-button type="primary" @click="loadDialog" v-preReClick>新建</el-button>
1318 <el-button @click="batching('delete')" v-preReClick>批量删除</el-button>
1319 </div>
1320 </div>
1321 <div class="table_panel_wrap">
1322 <Table :tableInfo="tableInfo" @tableBtnClick="tableBtnClick" @tablePageChange="tablePageChange"
1323 @tableSelectionChange="tableSelectionChange" />
1324 </div>
1325
1326 <Dialog ref="dialogRef" :dialogInfo="dialogInfo" @btnClick="dialogBtnClick" @tableBtnClick="tableBtnClick"
1327 @selectChange="formSelectChange" @tabChange="tabChange" />
1328 </div>
1329 </template>
1330
1331 <style lang="scss" scoped>
1332 .container_wrap {
1333 overflow: hidden auto;
1334 }
1335
1336 .table_tool_wrap {
1337 width: 100%;
1338 height: 84px !important;
1339 padding: 0 8px;
1340
1341 .tools_btns {
1342 padding: 8px 0 0;
1343 }
1344 }
1345
1346 .table_panel_wrap {
1347 width: 100%;
1348 height: calc(100% - 84px);
1349 padding: 8px 8px 0;
1350 }
1351 </style>
...@@ -85,11 +85,12 @@ const sheetItemList = ref([ ...@@ -85,11 +85,12 @@ const sheetItemList = ref([
85 value: 'dbGuid' 85 value: 'dbGuid'
86 }, 86 },
87 clearable: true, 87 clearable: true,
88 filterable: true,
88 }, 89 },
89 { 90 {
90 type: "select", 91 type: "select",
91 label: "", 92 label: "",
92 placeholder: '表中文/英文名', 93 placeholder: '表中文名',
93 field: 'tableGuid', 94 field: 'tableGuid',
94 default: '', 95 default: '',
95 options: [], 96 options: [],
...@@ -98,6 +99,7 @@ const sheetItemList = ref([ ...@@ -98,6 +99,7 @@ const sheetItemList = ref([
98 value: 'dbGuid' 99 value: 'dbGuid'
99 }, 100 },
100 clearable: true, 101 clearable: true,
102 filterable: true,
101 disabled: true 103 disabled: true
102 }, 104 },
103 ]); 105 ]);
...@@ -128,11 +130,12 @@ const fieldItemList = ref([ ...@@ -128,11 +130,12 @@ const fieldItemList = ref([
128 value: 'dbGuid' 130 value: 'dbGuid'
129 }, 131 },
130 clearable: true, 132 clearable: true,
133 filterable: true,
131 }, 134 },
132 { 135 {
133 type: "select", 136 type: "select",
134 label: "", 137 label: "",
135 placeholder: '表中文/英文名', 138 placeholder: '表中文名',
136 field: 'tableGuid', 139 field: 'tableGuid',
137 default: '', 140 default: '',
138 options: [], 141 options: [],
...@@ -141,12 +144,13 @@ const fieldItemList = ref([ ...@@ -141,12 +144,13 @@ const fieldItemList = ref([
141 value: 'dbGuid' 144 value: 'dbGuid'
142 }, 145 },
143 clearable: true, 146 clearable: true,
147 filterable: true,
144 disabled: true 148 disabled: true
145 }, 149 },
146 { 150 {
147 type: "select", 151 type: "select",
148 label: "", 152 label: "",
149 placeholder: '字段中文/英文名', 153 placeholder: '字段中文名',
150 field: 'fieldGuid', 154 field: 'fieldGuid',
151 default: '', 155 default: '',
152 options: [], 156 options: [],
...@@ -155,6 +159,7 @@ const fieldItemList = ref([ ...@@ -155,6 +159,7 @@ const fieldItemList = ref([
155 value: 'dbGuid' 159 value: 'dbGuid'
156 }, 160 },
157 clearable: true, 161 clearable: true,
162 filterable: true,
158 disabled: true 163 disabled: true
159 }, 164 },
160 { 165 {
...@@ -167,10 +172,7 @@ const fieldItemList = ref([ ...@@ -167,10 +172,7 @@ const fieldItemList = ref([
167 { label: '已分类', value: 'Y' }, 172 { label: '已分类', value: 'Y' },
168 { label: '未分类', value: 'N' }, 173 { label: '未分类', value: 'N' },
169 ], 174 ],
170 props: { 175 props: {},
171 // label: 'name',
172 // value: 'dbGuid'
173 },
174 clearable: true, 176 clearable: true,
175 }, 177 },
176 { 178 {
...@@ -187,7 +189,6 @@ const fieldItemList = ref([ ...@@ -187,7 +189,6 @@ const fieldItemList = ref([
187 label: "classifyName", 189 label: "classifyName",
188 value: "classifyDetailGuid", 190 value: "classifyDetailGuid",
189 }, 191 },
190 // popperClass: 'strictiy_cascader',
191 filterable: true, 192 filterable: true,
192 clearable: true, 193 clearable: true,
193 blur: true 194 blur: true
...@@ -226,17 +227,13 @@ const sheetTableInfo = ref({ ...@@ -226,17 +227,13 @@ const sheetTableInfo = ref({
226 id: "mapping-table", 227 id: "mapping-table",
227 fields: [ 228 fields: [
228 { label: "序号", type: "index", width: 56, align: "center", fixed: "left" }, 229 { label: "序号", type: "index", width: 56, align: "center", fixed: "left" },
229 // { 230 { label: "表中文名", field: "tableChName", width: 180 },
230 // label: "分类分级变更状态", field: "isCgChange", width: 140, align: 'center', type: "tag", getName: (scope) => {
231 // return filterVal(scope.row.isCgChange, 'isCgChange');
232 // }
233 // },
234 { label: "表中文名", field: "tableChName", width: 120 },
235 { 231 {
236 label: "表英文名", field: "tableName", width: 200, type: "text_btn", value: 'tab' 232 label: "表英文名", field: "tableName", width: 200, type: "text_btn", value: 'tab'
237 }, 233 },
238 { label: "数据库名", field: "database", width: 120 }, 234 { label: "数据库名", field: "databaseChName", width: 140 },
239 { label: "字段数", field: "fieldNum", width: 96, align: 'right' }, 235 { label: "数据库名称", field: "database", width: 200 },
236 { label: "字段数", field: "fieldNum", width: 80, align: 'right' },
240 { label: "已分类字段数", field: "classifyFieldNum", width: 120, align: 'right' }, 237 { label: "已分类字段数", field: "classifyFieldNum", width: 120, align: 'right' },
241 { label: "已分级字段数", field: "gradeFieldNum", width: 120, align: 'right' }, 238 { label: "已分级字段数", field: "gradeFieldNum", width: 120, align: 'right' },
242 ], 239 ],
...@@ -252,6 +249,7 @@ const sheetTableInfo = ref({ ...@@ -252,6 +249,7 @@ const sheetTableInfo = ref({
252 }, 249 },
253 }); 250 });
254 const selectRowData = ref([]); 251 const selectRowData = ref([]);
252 const fieldTableRef = ref();
255 const fieldTableInfo = ref({ 253 const fieldTableInfo = ref({
256 id: "metadata-table", 254 id: "metadata-table",
257 fields: [ 255 fields: [
...@@ -297,8 +295,9 @@ const fieldTableInfo = ref({ ...@@ -297,8 +295,9 @@ const fieldTableInfo = ref({
297 { label: "标签", field: "label", width: 120 }, 295 { label: "标签", field: "label", width: 120 },
298 { label: "规则", field: "ruleDetail", width: 200 }, 296 { label: "规则", field: "ruleDetail", width: 200 },
299 { label: "表英文名", field: "tableName", width: 200 }, 297 { label: "表英文名", field: "tableName", width: 200 },
300 { label: "表中文名", field: "tableChName", width: 120 }, 298 { label: "表中文名", field: "tableChName", width: 140 },
301 { label: "数据库名", field: "database", width: 120 }, 299 { label: "数据库名", field: "databaseChName", width: 140 },
300 { label: "数据库名称", field: "database", width: 200 },
302 ], 301 ],
303 loading: false, 302 loading: false,
304 data: [], 303 data: [],
...@@ -390,25 +389,40 @@ const dialogInfo: any = ref({ ...@@ -390,25 +389,40 @@ const dialogInfo: any = ref({
390 }, 389 },
391 }) 390 })
392 391
392 /**
393 * 传入多个promise对象,当全部结束时取消Loading
394 * @param promises 传入多个promise对象,当全部结束时取消Loading
395 */
396 const promiseList = async (...promises: Promise<void>[]) => {
397 // loading方法全局封装成一个组件
398 loading.value = true;
399 try {
400 await Promise.all(promises);
401 } catch (e) {
402 loading.value = false;
403 } finally {
404 loading.value = false;
405 }
406 };
407
393 // 获取任务详情 408 // 获取任务详情
394 const getTaskDetail = (param) => { 409 const getTaskDetail = (param) => {
395 loading.value = true; 410 loading.value = true;
396 getCgTaskDetail(param).then((res: any) => { 411 getCgTaskDetail(param).then((res: any) => {
397 loading.value = false;
398 if (res.code == proxy.$passCode) { 412 if (res.code == proxy.$passCode) {
399 taskDetail.value = res.data || {}; 413 taskDetail.value = res.data || {};
400 // taskDetail.value.confirmStatus != 'Y' && (showBtns.value = true);
401 getFieldCount()
402 getSheetFieldList({ type: 1 });
403 getFieldTree()
404 getGradeData();
405 nextTick(() => { 414 nextTick(() => {
406 getSheetTableData(); 415 promiseList(
407 getFieldTableData(); 416 getSheetFieldList({ type: 1 }),
417 getFieldCount(),
418 getFieldTree(),
419 getGradeData(),
420 getSheetTableData(),
421 getFieldTableData()
422 )
408 }) 423 })
409 } else { 424 } else {
410 ElMessage.error(res.msg); 425 ElMessage.error(res.msg);
411 loading.value = false;
412 } 426 }
413 }).catch(() => { 427 }).catch(() => {
414 loading.value = false; 428 loading.value = false;
...@@ -417,7 +431,7 @@ const getTaskDetail = (param) => { ...@@ -417,7 +431,7 @@ const getTaskDetail = (param) => {
417 431
418 // 获取字段统计 432 // 获取字段统计
419 const getFieldCount = () => { 433 const getFieldCount = () => {
420 getTaskFieldCount({ execGuid: taskDetail.value.execGuid }).then((res: any) => { 434 return getTaskFieldCount({ execGuid: taskDetail.value.execGuid }).then((res: any) => {
421 if (res.code == proxy.$passCode) { 435 if (res.code == proxy.$passCode) {
422 const data = res.data || {}; 436 const data = res.data || {};
423 fieldCounts.value = data; 437 fieldCounts.value = data;
...@@ -432,27 +446,24 @@ const getFieldCount = () => { ...@@ -432,27 +446,24 @@ const getFieldCount = () => {
432 446
433 // 获取分级数据 447 // 获取分级数据
434 const getGradeData = () => { 448 const getGradeData = () => {
435 getGradeList({ classifyGradeGuid: taskDetail.value.gradeGuid, pageIndex: 1, pageSize: -1 }).then((res: any) => { 449 return getGradeList({ classifyGradeGuid: taskDetail.value.gradeGuid, pageIndex: 1, pageSize: -1 }).then((res: any) => {
436 if (res.code == proxy.$passCode) { 450 if (res.code == proxy.$passCode) {
437 let data = res.data.records || []; 451 let data = res.data.records || [];
438 data.map(d => d.gradeName = d.dataGrade + '级'); 452 data.map(d => d.gradeName = d.dataGrade + '级');
439 gradeList.value = JSON.parse(JSON.stringify(data)); 453 gradeList.value = JSON.parse(JSON.stringify(data));
440 formItems.value[1].options = JSON.parse(JSON.stringify(data)); 454 formItems.value[1].options = JSON.parse(JSON.stringify(data));
441 fieldItemList.value[5].options = JSON.parse(JSON.stringify(data)); 455 fieldItemList.value[6].options = JSON.parse(JSON.stringify(data));
442 fieldTableInfo.value.fields[5].options = JSON.parse(JSON.stringify(data)); 456 fieldTableInfo.value.fields[5].options = JSON.parse(JSON.stringify(data));
443 } else { 457 } else {
444 ElMessage.error(res.msg); 458 ElMessage.error(res.msg);
445 loading.value = false;
446 } 459 }
447 }).catch(() => { 460 }).catch(() => {
448 loading.value = false;
449 }) 461 })
450 } 462 }
451 463
452 // 获取分类树形数据 464 // 获取分类树形数据
453 const getFieldTree = () => { 465 const getFieldTree = () => {
454 getTaskExeTreeList({ execGuid: taskDetail.value.execGuid }).then((res: any) => { 466 return getTaskExeTreeList({ execGuid: taskDetail.value.execGuid }).then((res: any) => {
455 // treeInfo.value.loading = false;
456 if (res.code == proxy.$passCode) { 467 if (res.code == proxy.$passCode) {
457 const data: any = res.data || []; 468 const data: any = res.data || [];
458 treeData.value[0].children.push(...data); 469 treeData.value[0].children.push(...data);
...@@ -464,16 +475,14 @@ const getFieldTree = () => { ...@@ -464,16 +475,14 @@ const getFieldTree = () => {
464 fieldTableInfo.value.fields[4].options = JSON.parse(JSON.stringify(data)); 475 fieldTableInfo.value.fields[4].options = JSON.parse(JSON.stringify(data));
465 } else { 476 } else {
466 ElMessage.error(res.msg); 477 ElMessage.error(res.msg);
467 loading.value = false;
468 } 478 }
469 }).catch(() => { 479 }).catch(() => {
470 loading.value = false;
471 }) 480 })
472 } 481 }
473 482
474 // 获取库、表、字段信息 483 // 获取库、表、字段信息
475 const getSheetFieldList = (params, tId = null) => { 484 const getSheetFieldList = (params, tId = null) => {
476 getDbFieldList({ execGuid: taskDetail.value.execGuid, ...params }).then((res: any) => { 485 return getDbFieldList({ execGuid: taskDetail.value.execGuid, ...params }).then((res: any) => {
477 if (res.code == proxy.$passCode) { 486 if (res.code == proxy.$passCode) {
478 const data = res.data || []; 487 const data = res.data || [];
479 if (params.type == 1) { 488 if (params.type == 1) {
...@@ -495,10 +504,8 @@ const getSheetFieldList = (params, tId = null) => { ...@@ -495,10 +504,8 @@ const getSheetFieldList = (params, tId = null) => {
495 } 504 }
496 } else { 505 } else {
497 ElMessage.error(res.msg); 506 ElMessage.error(res.msg);
498 loading.value = false;
499 } 507 }
500 }).catch(() => { 508 }).catch(() => {
501 loading.value = false;
502 }) 509 })
503 } 510 }
504 511
...@@ -511,28 +518,30 @@ const nodeClick = (data, node) => { ...@@ -511,28 +518,30 @@ const nodeClick = (data, node) => {
511 if (data.classifyDetailGuid == 'all') { 518 if (data.classifyDetailGuid == 'all') {
512 fieldItemList.value[4].default = ''; 519 fieldItemList.value[4].default = '';
513 fieldItemList.value[5].default = []; 520 fieldItemList.value[5].default = [];
521 promiseList(
514 getFieldTableData() 522 getFieldTableData()
523 )
515 } else { 524 } else {
516 const parentGuids = data.parentGuids || []; 525 const parentGuids = data.parentGuids || [];
517 parentGuids.push(data.classifyDetailGuid) 526 parentGuids.push(data.classifyDetailGuid)
518 fieldItemList.value[4].default = 'Y'; 527 fieldItemList.value[4].default = 'Y';
519 fieldItemList.value[5].default = parentGuids; 528 fieldItemList.value[5].default = parentGuids;
520 getFieldTableData(); 529 promiseList(
530 getFieldTableData()
531 )
521 } 532 }
522 } 533 }
523 534
524 // 获取库表数据 535 // 获取库表数据
525 const getSheetTableData = () => { 536 const getSheetTableData = () => {
526 loading.value = true;
527 const sheetParams = sheetSearchRef.value.toolSearch.formInline || {}; 537 const sheetParams = sheetSearchRef.value.toolSearch.formInline || {};
528 execTaskSheetList( 538 return execTaskSheetList(
529 Object.assign({}, { ...sheetParams }, { 539 Object.assign({}, { ...sheetParams }, {
530 execGuid: taskDetail.value.execGuid, 540 execGuid: taskDetail.value.execGuid,
531 pageIndex: sheetTableInfo.value.page.curr, 541 pageIndex: sheetTableInfo.value.page.curr,
532 pageSize: sheetTableInfo.value.page.limit, 542 pageSize: sheetTableInfo.value.page.limit,
533 }) 543 })
534 ).then((res: any) => { 544 ).then((res: any) => {
535 loading.value = false;
536 if (res.code == proxy.$passCode) { 545 if (res.code == proxy.$passCode) {
537 sheetTableInfo.value.data = res.data.records || []; 546 sheetTableInfo.value.data = res.data.records || [];
538 sheetTableInfo.value.page.curr = res.data.pageIndex; 547 sheetTableInfo.value.page.curr = res.data.pageIndex;
...@@ -543,13 +552,11 @@ const getSheetTableData = () => { ...@@ -543,13 +552,11 @@ const getSheetTableData = () => {
543 } 552 }
544 }) 553 })
545 .catch((res) => { 554 .catch((res) => {
546 loading.value = false;
547 }); 555 });
548 }; 556 };
549 557
550 // 获取字段表格数据 558 // 获取字段表格数据
551 const getFieldTableData = () => { 559 const getFieldTableData = () => {
552 loading.value = true;
553 const fieldParams = fieldSearchRef.value.toolSearch.formInline || {}; 560 const fieldParams = fieldSearchRef.value.toolSearch.formInline || {};
554 let params: any = { 561 let params: any = {
555 ...fieldParams, 562 ...fieldParams,
...@@ -559,13 +566,11 @@ const getFieldTableData = () => { ...@@ -559,13 +566,11 @@ const getFieldTableData = () => {
559 isMergeClassify: checked1.value ? 'Y' : 'N' 566 isMergeClassify: checked1.value ? 'Y' : 'N'
560 } 567 }
561 const classifyName = params.classifyName?.at(-1) || undefined; 568 const classifyName = params.classifyName?.at(-1) || undefined;
562 // params.isClassify = classifyName === undefined ? '' : classifyName == 'unclassified' ? 'N' : 'Y';
563 if (classifyName && classifyName != 'unclassified') { 569 if (classifyName && classifyName != 'unclassified') {
564 params.classifyDetail = classifyName; 570 params.classifyDetail = classifyName;
565 } 571 }
566 delete params.classifyName 572 delete params.classifyName
567 execTaskFieldList(params).then((res: any) => { 573 return execTaskFieldList(params).then((res: any) => {
568 loading.value = false;
569 if (res.code == proxy.$passCode) { 574 if (res.code == proxy.$passCode) {
570 let data = res.data.records || []; 575 let data = res.data.records || [];
571 data.map(item => item.STATE = ''); 576 data.map(item => item.STATE = '');
...@@ -578,7 +583,6 @@ const getFieldTableData = () => { ...@@ -578,7 +583,6 @@ const getFieldTableData = () => {
578 } 583 }
579 }) 584 })
580 .catch((res) => { 585 .catch((res) => {
581 loading.value = false;
582 }); 586 });
583 }; 587 };
584 588
...@@ -622,7 +626,6 @@ const tableBtnClick = (scope, btn) => { ...@@ -622,7 +626,6 @@ const tableBtnClick = (scope, btn) => {
622 row.classifyDetailGuid = cascaderData.length ? cascaderData[0].value : ''; 626 row.classifyDetailGuid = cascaderData.length ? cascaderData[0].value : '';
623 row.classifyDetailName = cascaderData.length ? cascaderData[0].label : ''; 627 row.classifyDetailName = cascaderData.length ? cascaderData[0].label : '';
624 row.gradeDetailName = gradeList.value.find(item => item.guid == row.gradeDetailGuid)?.gradeName; 628 row.gradeDetailName = gradeList.value.find(item => item.guid == row.gradeDetailGuid)?.gradeName;
625 row.STATE = '';
626 if (cascaderData.length && row.gradeDetailGuid) { 629 if (cascaderData.length && row.gradeDetailGuid) {
627 const params = [ 630 const params = [
628 { 631 {
...@@ -632,9 +635,19 @@ const tableBtnClick = (scope, btn) => { ...@@ -632,9 +635,19 @@ const tableBtnClick = (scope, btn) => {
632 classifyDetailName: row.classifyDetailName, 635 classifyDetailName: row.classifyDetailName,
633 gradeDetailGuid: row.gradeDetailGuid, 636 gradeDetailGuid: row.gradeDetailGuid,
634 gradeDetailName: row.gradeDetailName, 637 gradeDetailName: row.gradeDetailName,
638 execGuid: taskDetail.value.execGuid
635 } 639 }
636 ]; 640 ];
637 saveFields(params) 641 saveFields(params)
642 row.STATE = '';
643 } else {
644 if (row.classifyDetailGuid && !row.gradeDetailGuid) {
645 ElMessage.error('分级不能为空');
646 } else if (!row.classifyDetailGuid && row.gradeDetailGuid) {
647 ElMessage.error('分类不能为空');
648 } else {
649 ElMessage.error('分类和分级均不能为空');
650 }
638 } 651 }
639 } 652 }
640 }; 653 };
...@@ -643,11 +656,15 @@ const tablePageChange = (info) => { ...@@ -643,11 +656,15 @@ const tablePageChange = (info) => {
643 if (tabsInfo.value.activeName == 'sheet') { 656 if (tabsInfo.value.activeName == 'sheet') {
644 sheetTableInfo.value.page.limit = Number(info.limit); 657 sheetTableInfo.value.page.limit = Number(info.limit);
645 sheetTableInfo.value.page.curr = Number(info.curr); 658 sheetTableInfo.value.page.curr = Number(info.curr);
646 getSheetTableData(); 659 promiseList(
660 getSheetTableData()
661 )
647 } else { 662 } else {
648 fieldTableInfo.value.page.limit = Number(info.limit); 663 fieldTableInfo.value.page.limit = Number(info.limit);
649 fieldTableInfo.value.page.curr = Number(info.curr); 664 fieldTableInfo.value.page.curr = Number(info.curr);
650 getFieldTableData(); 665 promiseList(
666 getFieldTableData()
667 )
651 } 668 }
652 }; 669 };
653 670
...@@ -665,7 +682,28 @@ const btnClick = async (btn, bType = null) => { ...@@ -665,7 +682,28 @@ const btnClick = async (btn, bType = null) => {
665 name: "taskConfig", 682 name: "taskConfig",
666 }); 683 });
667 } else if (type == 'confirm') { 684 } else if (type == 'confirm') {
685 const row = fieldTableInfo.value.data.find(item => item.STATE == 'Running');
686 const rIndex = fieldTableInfo.value.data.findIndex(item => item.STATE == 'Running');
687 if (rIndex > -1) {
688 ElMessageBox.confirm(
689 '存在未保存的数据,提交后会丢失,是否确定提交',
690 '提示',
691 {
692 confirmButtonText: '确定',
693 cancelButtonText: '取消',
694 type: 'warning',
695 }
696 ).then(() => {
668 saveTask(); 697 saveTask();
698 }).catch(() => {
699 // 设置高亮
700 fieldTableRef.value.setCurrentRow(row)
701 // 设置表格滚动的位置
702 fieldTableRef.value.scrollTo({ top: 36 * rIndex, behavior: 'smooth' });
703 })
704 } else {
705 saveTask();
706 }
669 } else if (type == 'status') { 707 } else if (type == 'status') {
670 if (selectRowData.value.length == 0) { 708 if (selectRowData.value.length == 0) {
671 ElMessage.warning('请选择需要操作的数据'); 709 ElMessage.warning('请选择需要操作的数据');
...@@ -692,14 +730,12 @@ const btnClick = async (btn, bType = null) => { ...@@ -692,14 +730,12 @@ const btnClick = async (btn, bType = null) => {
692 const saveFields = (params, isBatch = false) => { 730 const saveFields = (params, isBatch = false) => {
693 loading.value = true; 731 loading.value = true;
694 execFieldConfirm(params).then((res: any) => { 732 execFieldConfirm(params).then((res: any) => {
695 loading.value = false;
696 if (res.code == proxy.$passCode) { 733 if (res.code == proxy.$passCode) {
697 ElMessage.success('保存成功'); 734 ElMessage.success('保存成功');
698 if (isBatch) { 735 promiseList(
699 getFieldTableData(); 736 getFieldCount(),
700 } else { 737 getFieldTableData()
701 currTableData.value.changeStatus = 'Y'; 738 )
702 }
703 } else { 739 } else {
704 ElMessage.error(res.msg); 740 ElMessage.error(res.msg);
705 } 741 }
...@@ -735,7 +771,9 @@ const saveStatus = (params) => { ...@@ -735,7 +771,9 @@ const saveStatus = (params) => {
735 loading.value = false; 771 loading.value = false;
736 if (res.code == proxy.$passCode) { 772 if (res.code == proxy.$passCode) {
737 ElMessage.success('确认成功'); 773 ElMessage.success('确认成功');
738 getFieldTableData(); 774 promiseList(
775 getFieldTableData()
776 )
739 } 777 }
740 }) 778 })
741 } 779 }
...@@ -746,7 +784,9 @@ const searchSheet = (val: any, clear: boolean = false) => { ...@@ -746,7 +784,9 @@ const searchSheet = (val: any, clear: boolean = false) => {
746 sheetItemList.value.map(item => item.default = '') 784 sheetItemList.value.map(item => item.default = '')
747 } 785 }
748 sheetParams.value = Object.assign({}, { ...sheetParams.value }, { ...val }); 786 sheetParams.value = Object.assign({}, { ...sheetParams.value }, { ...val });
749 getSheetTableData(); 787 promiseList(
788 getSheetTableData()
789 )
750 }; 790 };
751 791
752 const searchField = (val: any, clear: boolean = false) => { 792 const searchField = (val: any, clear: boolean = false) => {
...@@ -756,7 +796,9 @@ const searchField = (val: any, clear: boolean = false) => { ...@@ -756,7 +796,9 @@ const searchField = (val: any, clear: boolean = false) => {
756 treeInfoRef.value.setCurrentKey('all'); 796 treeInfoRef.value.setCurrentKey('all');
757 } 797 }
758 fieldParams.value = Object.assign({}, { ...fieldParams.value }, { ...val }); 798 fieldParams.value = Object.assign({}, { ...fieldParams.value }, { ...val });
759 getFieldTableData(); 799 promiseList(
800 getFieldTableData()
801 )
760 }; 802 };
761 803
762 const cascaderChange = (val, info) => { 804 const cascaderChange = (val, info) => {
...@@ -768,15 +810,22 @@ const cascaderChange = (val, info) => { ...@@ -768,15 +810,22 @@ const cascaderChange = (val, info) => {
768 if (info && info.row) { 810 if (info && info.row) {
769 const cascaderData = getCascaderCheckedData(); 811 const cascaderData = getCascaderCheckedData();
770 info.row.gradeDetailGuid = cascaderData.length ? cascaderData[0].data.gradeGuid : ''; 812 info.row.gradeDetailGuid = cascaderData.length ? cascaderData[0].data.gradeGuid : '';
771
772 } else { 813 } else {
773 treeInfoRef.value.expandedKey = val || ['all']; 814 treeInfoRef.value.expandedKey = val || ['all'];
774 treeInfoRef.value.setCurrentKey(val?.at(-1) || 'all'); 815 treeInfoRef.value.setCurrentKey(val?.at(-1) || 'all');
775 getFieldTableData(); 816 promiseList(
817 getFieldTableData()
818 )
776 } 819 }
777 } 820 }
778 }; 821 };
779 822
823 const checkboxChange = (val) => {
824 promiseList(
825 getFieldTableData()
826 )
827 };
828
780 const selectChange = (val, item, scope = null) => { 829 const selectChange = (val, item, scope = null) => {
781 if (scope && item.field == 'gradeDetailName') { 830 if (scope && item.field == 'gradeDetailName') {
782 let row = scope.row; 831 let row = scope.row;
...@@ -785,19 +834,24 @@ const selectChange = (val, item, scope = null) => { ...@@ -785,19 +834,24 @@ const selectChange = (val, item, scope = null) => {
785 } else if (item.field == 'databaseGuid' || item.field == 'tableGuid') { 834 } else if (item.field == 'databaseGuid' || item.field == 'tableGuid') {
786 const params: any = scope; 835 const params: any = scope;
787 if (tabsInfo.value.activeName == 'sheet') { 836 if (tabsInfo.value.activeName == 'sheet') {
837 if (item.field == "databaseGuid") {
788 if (!val) { 838 if (!val) {
789 sheetItemList.value[1].default = ''; 839 sheetItemList.value[1].default = '';
790 sheetItemList.value[1].disabled = true; 840 sheetItemList.value[1].disabled = true;
791 } else { 841 } else {
792 sheetItemList.value[1].disabled = false; 842 sheetItemList.value[1].disabled = false;
793 } 843 }
844 }
845
794 item.field == "databaseGuid" && (params.tableGuid = ''); 846 item.field == "databaseGuid" && (params.tableGuid = '');
795 if (val && item.field != "tableGuid") { 847 if (val && item.field != "tableGuid") {
796 const params = { 848 const params = {
797 type: 2, 849 type: 2,
798 dbGuid: val || '' 850 dbGuid: val || ''
799 } 851 }
852 promiseList(
800 getSheetFieldList(params) 853 getSheetFieldList(params)
854 )
801 } 855 }
802 } else { 856 } else {
803 if (item.field == "databaseGuid") { 857 if (item.field == "databaseGuid") {
...@@ -828,7 +882,9 @@ const selectChange = (val, item, scope = null) => { ...@@ -828,7 +882,9 @@ const selectChange = (val, item, scope = null) => {
828 type: item.field == "databaseGuid" ? 2 : 3, 882 type: item.field == "databaseGuid" ? 2 : 3,
829 dbGuid: val || '' 883 dbGuid: val || ''
830 } 884 }
885 promiseList(
831 getSheetFieldList(params) 886 getSheetFieldList(params)
887 )
832 } 888 }
833 } 889 }
834 } else if (item.field == 'isClassify') { 890 } else if (item.field == 'isClassify') {
...@@ -837,7 +893,9 @@ const selectChange = (val, item, scope = null) => { ...@@ -837,7 +893,9 @@ const selectChange = (val, item, scope = null) => {
837 treeInfo.value.expandedKey = ['all']; 893 treeInfo.value.expandedKey = ['all'];
838 treeInfoRef.value.setCurrentKey('all'); 894 treeInfoRef.value.setCurrentKey('all');
839 fieldItemList.value[4].default = val || ''; 895 fieldItemList.value[4].default = val || '';
840 getFieldTableData(); 896 promiseList(
897 getFieldTableData()
898 )
841 } 899 }
842 } 900 }
843 901
...@@ -854,10 +912,11 @@ const dialogBtnClick = (btn, info) => { ...@@ -854,10 +912,11 @@ const dialogBtnClick = (btn, info) => {
854 classifyDetailName: cascaderData[0].label, 912 classifyDetailName: cascaderData[0].label,
855 gradeDetailGuid: info.gradeGuid, 913 gradeDetailGuid: info.gradeGuid,
856 gradeDetailName: gradeName, 914 gradeDetailName: gradeName,
915 execGuid: taskDetail.value.execGuid
857 } 916 }
858 params.push(param) 917 params.push(param)
859 }) 918 })
860 saveFields(params, true); 919 saveFields(params, true)
861 dialogInfo.value.visible = false; 920 dialogInfo.value.visible = false;
862 } else if (btn.value == 'cancel') { 921 } else if (btn.value == 'cancel') {
863 dialogInfo.value.visible = false; 922 dialogInfo.value.visible = false;
...@@ -913,7 +972,7 @@ onMounted(() => { ...@@ -913,7 +972,7 @@ onMounted(() => {
913 </div> 972 </div>
914 <div class="desc_item"> 973 <div class="desc_item">
915 <span class="desc_label">执行时间:</span> 974 <span class="desc_label">执行时间:</span>
916 <span class="desc_value">{{ taskDetail.updateTime || '--' }}</span> 975 <span class="desc_value">{{ taskDetail.execTime || '--' }}</span>
917 </div> 976 </div>
918 </div> 977 </div>
919 <div class="desc_group"> 978 <div class="desc_group">
...@@ -967,27 +1026,27 @@ onMounted(() => { ...@@ -967,27 +1026,27 @@ onMounted(() => {
967 <div class="table_tool_wrap" ref="tableToolRef"> 1026 <div class="table_tool_wrap" ref="tableToolRef">
968 <TableTools ref="fieldSearchRef" :searchItems="fieldItemList" :searchId="'field-search'" :init="false" 1027 <TableTools ref="fieldSearchRef" :searchItems="fieldItemList" :searchId="'field-search'" :init="false"
969 @selectChange="selectChange" @cascaderChange="cascaderChange" @search="searchField" /> 1028 @selectChange="selectChange" @cascaderChange="cascaderChange" @search="searchField" />
970 <div class="tools_btns"> 1029 <div class="tools_btns" v-if="showBtns">
971 <div class="btns" v-if="showBtns" > 1030 <div class="btns">
972 <el-button type="primary" plain @click="btnClick({ value: 'batch' })">批量变更分类分级</el-button> 1031 <el-button type="primary" plain @click="btnClick({ value: 'batch' })">批量变更分类分级</el-button>
973 <el-button type="primary" plain @click="btnClick({ value: 'status' })">批量确认</el-button> 1032 <el-button type="primary" plain @click="btnClick({ value: 'status' })">批量确认</el-button>
974 <!-- <el-button plain @click="btnClick({ value: 'export' })">导出</el-button> --> 1033 <!-- <el-button plain @click="btnClick({ value: 'export' })">导出</el-button> -->
975 </div> 1034 </div>
976 <!-- <div class="checkboxs"> 1035 <div class="checkboxs">
977 <el-checkbox v-model="checked1" @change="getFieldTableData()">仅看多分类</el-checkbox> 1036 <el-checkbox v-model="checked1" @change="checkboxChange">仅看多分类</el-checkbox>
978 <el-tooltip effect="light" placement="top" content="一个字段只能有一个分类,多分类的字段需要人工确定分类"> 1037 <el-tooltip effect="light" placement="top" content="一个字段只能有一个分类,多分类的字段需要人工确定分类">
979 <el-icon style="margin-left: 8px;"> 1038 <el-icon style="margin-left: 8px;">
980 <svg-icon name="icon-tip" /> 1039 <svg-icon name="icon-tip" />
981 </el-icon> 1040 </el-icon>
982 </el-tooltip> 1041 </el-tooltip>
983 </div> --> 1042 </div>
984 </div> 1043 </div>
985 </div> 1044 </div>
986 <div class="table_panel_wrap panel" :style="{ height: 'calc(100% - ' + toolH + 'px)' }"> 1045 <div class="table_panel_wrap panel" :style="{ height: 'calc(100% - ' + toolH + 'px)' }">
987 <div class="table_panel" v-loading="fieldTableInfo.loading"> 1046 <div class="table_panel" v-loading="fieldTableInfo.loading">
988 <el-table ref="costTableRef" :data="fieldTableInfo.data" border :height="'100%'" 1047 <el-table ref="fieldTableRef" :data="fieldTableInfo.data" border :height="'100%'"
989 style="width: 100%; display: inline-block" :style="{ 'max-height': 'calc(100% - 44px)' }" 1048 style="width: 100%; display: inline-block" :style="{ 'max-height': 'calc(100% - 44px)' }"
990 :cell-class-name="tableCellClassName" @selection-change="tableSelectionChange"> 1049 :cell-class-name="tableCellClassName" @selection-change="tableSelectionChange" highlight-current-row>
991 <el-table-column type="selection" align="center" :width="32" :selectable="rowSelectable" 1050 <el-table-column type="selection" align="center" :width="32" :selectable="rowSelectable"
992 fixed="left" /> 1051 fixed="left" />
993 <el-table-column v-for="(item, i) in fieldTableInfo.fields" :label="item.label" :width="item.width" 1052 <el-table-column v-for="(item, i) in fieldTableInfo.fields" :label="item.label" :width="item.width"
......
...@@ -48,8 +48,7 @@ const treeInfo = ref({ ...@@ -48,8 +48,7 @@ const treeInfo = ref({
48 expandOnNodeClick: false, 48 expandOnNodeClick: false,
49 data: [], 49 data: [],
50 }); 50 });
51 const toolH = ref(82) 51
52 const toolRef = ref();
53 const expand1 = ref(true) 52 const expand1 = ref(true)
54 const expand2 = ref(true) 53 const expand2 = ref(true)
55 54
...@@ -154,7 +153,24 @@ const metadataTableInfo = ref({ ...@@ -154,7 +153,24 @@ const metadataTableInfo = ref({
154 }, 153 },
155 }) 154 })
156 155
156 /**
157 * 传入多个promise对象,当全部结束时取消Loading
158 * @param promises 传入多个promise对象,当全部结束时取消Loading
159 */
160 const promiseList = async (...promises: Promise<void>[]) => {
161 // loading方法全局封装成一个组件
162 loading.value = true;
163 try {
164 await Promise.all(promises);
165 } catch (e) {
166 loading.value = false;
167 } finally {
168 loading.value = false;
169 }
170 };
171
157 const getTaskDetail = (data) => { 172 const getTaskDetail = (data) => {
173 loading.value = true;
158 getCgTaskDetail(data).then((res: any) => { 174 getCgTaskDetail(data).then((res: any) => {
159 if (res.code == proxy.$passCode) { 175 if (res.code == proxy.$passCode) {
160 const data = res.data || {}; 176 const data = res.data || {};
...@@ -163,28 +179,31 @@ const getTaskDetail = (data) => { ...@@ -163,28 +179,31 @@ const getTaskDetail = (data) => {
163 item.default = data[item.field] || ''; 179 item.default = data[item.field] || '';
164 }) 180 })
165 selectRowData.value = data.metaGuids || []; 181 selectRowData.value = data.metaGuids || [];
166 getPermissionList({}); 182 promiseList(
167 getMetaTableData(); 183 getPermissionList(),
184 getMetaTableData()
185 )
168 } 186 }
187 }).catch(() => {
188 loading.value = false;
169 }) 189 })
170 } 190 }
171 191
172 const nodeClick = (data) => { 192 const nodeClick = (data) => {
173 searchItemValue.value.classifyGuid = templateInfo.value.guid; 193 searchItemValue.value.classifyGuid = templateInfo.value.guid;
174 searchItemValue.value.detailGuid = data.guid; 194 searchItemValue.value.detailGuid = data.guid;
175 getTableData(); 195 promiseList(
196 getTableData()
197 )
176 } 198 }
177 199
178 // 获取标签数据 200 // 获取标签数据
179 const getTableData = () => { 201 const getTableData = () => {
180 tableInfo.value.loading = true; 202 const params = Object.assign({}, searchItemValue.value, {
181 getCgLabelPageList(
182 Object.assign({}, searchItemValue.value, {
183 pageIndex: page.value.curr, 203 pageIndex: page.value.curr,
184 pageSize: page.value.limit, 204 pageSize: page.value.limit,
185 }) 205 })
186 ).then((res: any) => { 206 return getCgLabelPageList(params).then((res: any) => {
187 tableInfo.value.loading = false;
188 if (res.code == proxy.$passCode) { 207 if (res.code == proxy.$passCode) {
189 tableInfo.value.data = res.data.records || []; 208 tableInfo.value.data = res.data.records || [];
190 tableInfo.value.page.curr = res.data.pageIndex; 209 tableInfo.value.page.curr = res.data.pageIndex;
...@@ -193,7 +212,6 @@ const getTableData = () => { ...@@ -193,7 +212,6 @@ const getTableData = () => {
193 } 212 }
194 }) 213 })
195 .catch((res) => { 214 .catch((res) => {
196 tableInfo.value.loading = false;
197 }); 215 });
198 }; 216 };
199 217
...@@ -215,7 +233,9 @@ const tablePageChange = (info) => { ...@@ -215,7 +233,9 @@ const tablePageChange = (info) => {
215 page.value.limit = Number(info.limit); 233 page.value.limit = Number(info.limit);
216 tableInfo.value.page.limit = page.value.limit; 234 tableInfo.value.page.limit = page.value.limit;
217 tableInfo.value.page.curr = page.value.curr; 235 tableInfo.value.page.curr = page.value.curr;
218 getTableData(); 236 promiseList(
237 getTableData()
238 )
219 } else { 239 } else {
220 240
221 } 241 }
...@@ -223,8 +243,7 @@ const tablePageChange = (info) => { ...@@ -223,8 +243,7 @@ const tablePageChange = (info) => {
223 243
224 // 获取元数据表格 244 // 获取元数据表格
225 const getMetaTableData = () => { 245 const getMetaTableData = () => {
226 getMetaTableCollectList({}).then((res: any) => { 246 return getMetaTableCollectList({}).then((res: any) => {
227 metadataTableInfo.value.loading = false;
228 if (res.code == proxy.$passCode) { 247 if (res.code == proxy.$passCode) {
229 const data = res.data.records || []; 248 const data = res.data.records || [];
230 metadataTableInfo.value.data = data; 249 metadataTableInfo.value.data = data;
...@@ -236,16 +255,18 @@ const getMetaTableData = () => { ...@@ -236,16 +255,18 @@ const getMetaTableData = () => {
236 }) 255 })
237 } 256 }
238 } 257 }
258 }).catch(() => {
259
239 }) 260 })
240 } 261 }
241 262
242 const querySearch = (queryString: string) => { 263 const querySearch = (queryString: string) => {
243 listLoading.value = true 264 loading.value = true;
244 const results = queryString 265 const results = queryString
245 ? currpermissionList.value.filter(item => item.dataPermissionName.indexOf(queryString) > -1) 266 ? currpermissionList.value.filter(item => item.dataPermissionName.indexOf(queryString) > -1)
246 : permissionList.value; 267 : permissionList.value;
247 currpermissionList.value = results 268 currpermissionList.value = results
248 listLoading.value = false 269 loading.value = false;
249 } 270 }
250 271
251 const btnClick = async (btn, bType = null) => { 272 const btnClick = async (btn, bType = null) => {
...@@ -332,7 +353,7 @@ const submitForm = (formEl, info) => { ...@@ -332,7 +353,7 @@ const submitForm = (formEl, info) => {
332 const handleScroll = () => { 353 const handleScroll = () => {
333 if (listPage.value.curr < listPage.value.totalPages) { 354 if (listPage.value.curr < listPage.value.totalPages) {
334 listPage.value.curr++ 355 listPage.value.curr++
335 getPermissionList({}) 356 getPermissionList()
336 } 357 }
337 } 358 }
338 359
...@@ -340,20 +361,21 @@ const handleScroll = () => { ...@@ -340,20 +361,21 @@ const handleScroll = () => {
340 const listClick = (row) => { 361 const listClick = (row) => {
341 selectIndex.value = row.guid; 362 selectIndex.value = row.guid;
342 templateInfo.value = row; 363 templateInfo.value = row;
343 getClassifyTree();
344 searchItemValue.value.classifyGuid = row.guid; 364 searchItemValue.value.classifyGuid = row.guid;
345 searchItemValue.value.detailGuid = ''; 365 searchItemValue.value.detailGuid = '';
346 getTableData(); 366 promiseList(
367 getClassifyTree(),
368 getTableData()
369 )
347 }; 370 };
348 371
349 // 获取分类列表 372 // 获取分类列表
350 const getPermissionList = (val, init = true) => { 373 const getPermissionList = (val = {}, init = true) => {
351 let params: any = val ? { ...val } : {} 374 let params: any = val ? { ...val } : {}
352 params.pageIndex = listPage.value.curr; 375 params.pageIndex = listPage.value.curr;
353 params.pageSize = listPage.value.limit; 376 params.pageSize = listPage.value.limit;
354 params.type = 'C'; 377 params.type = 'C';
355 listLoading.value = true 378 return getClassifyGradList(params).then((res: any) => {
356 getClassifyGradList(params).then((res: any) => {
357 if (res.code == proxy.$passCode) { 379 if (res.code == proxy.$passCode) {
358 const data = res.data?.records || [] 380 const data = res.data?.records || []
359 if (init) { 381 if (init) {
...@@ -366,18 +388,14 @@ const getPermissionList = (val, init = true) => { ...@@ -366,18 +388,14 @@ const getPermissionList = (val, init = true) => {
366 tempInfo = data.filter(item => item.guid == taskDetail.value.classifyGuid)[0] 388 tempInfo = data.filter(item => item.guid == taskDetail.value.classifyGuid)[0]
367 } 389 }
368 listClick(tempInfo); 390 listClick(tempInfo);
369 nextTick(() => {
370 toolH.value = toolRef.value.offsetHeight
371 })
372 } 391 }
373 } else { 392 } else {
374 permissionList.value.push(...JSON.parse(JSON.stringify(data))) 393 permissionList.value.push(...JSON.parse(JSON.stringify(data)))
375 querySearch(asideSearchInput.value) 394 querySearch(asideSearchInput.value)
376 } 395 }
377 } 396 }
378 listLoading.value = false
379 }).catch(() => { 397 }).catch(() => {
380 listLoading.value = false 398
381 }) 399 })
382 } 400 }
383 401
...@@ -386,16 +404,13 @@ const getClassifyTree = () => { ...@@ -386,16 +404,13 @@ const getClassifyTree = () => {
386 const params = { 404 const params = {
387 classifyGradeGuid: templateInfo.value.guid 405 classifyGradeGuid: templateInfo.value.guid
388 } 406 }
389 treeInfo.value.loading = true; 407 return getClassifyTreeList(params).then((res: any) => {
390 getClassifyTreeList(params).then((res: any) => {
391 treeInfo.value.loading = false;
392 if (res.code == proxy.$passCode) { 408 if (res.code == proxy.$passCode) {
393 const data = res.data || []; 409 const data = res.data || [];
394 treeInfo.value.data = data; 410 treeInfo.value.data = data;
395 treeInfoRef.value.setCurrentKey(''); 411 treeInfoRef.value.setCurrentKey('');
396 } 412 }
397 }).catch(() => { 413 }).catch(() => {
398 treeInfo.value.loading = false;
399 }) 414 })
400 } 415 }
401 416
...@@ -412,15 +427,14 @@ onBeforeMount(() => { ...@@ -412,15 +427,14 @@ onBeforeMount(() => {
412 if (route.query.type == 'edit') { 427 if (route.query.type == 'edit') {
413 getTaskDetail({ guid: route.query.guid }) 428 getTaskDetail({ guid: route.query.guid })
414 } else { 429 } else {
415 getPermissionList({}); 430 promiseList(
416 getMetaTableData(); 431 getPermissionList(),
432 getMetaTableData()
433 )
417 } 434 }
418 }) 435 })
419 436
420 onMounted(() => { 437 onMounted(() => {
421 window.addEventListener('resize', function () {
422 toolH.value = toolRef.value.offsetHeight
423 })
424 }) 438 })
425 439
426 </script> 440 </script>
...@@ -433,14 +447,14 @@ onMounted(() => { ...@@ -433,14 +447,14 @@ onMounted(() => {
433 <el-input v-model.trim="asideSearchInput" placeholder="请输入关键字" :prefix-icon="Search" clearable 447 <el-input v-model.trim="asideSearchInput" placeholder="请输入关键字" :prefix-icon="Search" clearable
434 @change="querySearch" /> 448 @change="querySearch" />
435 </div> --> 449 </div> -->
436 <div class="aside_list" v-loading="listLoading" v-infinite-scroll="handleScroll"> 450 <div class="aside_list" v-infinite-scroll="handleScroll">
437 <div class="list_item" v-for="(item, i) in currpermissionList" :class="{ active: selectIndex == item.guid }" 451 <div class="list_item" v-for="(item, i) in currpermissionList" :class="{ active: selectIndex == item.guid }"
438 @click="listClick(item);" v-preReClick>{{ item.name }}</div> 452 @click="listClick(item);" v-preReClick>{{ item.name }}</div>
439 </div> 453 </div>
440 </div> 454 </div>
441 <div class="main_wrap" :class="{ full: step == 1 }"> 455 <div class="main_wrap" :class="{ full: step == 1 }">
442 <div class="content_main" v-show="step == 0"> 456 <div class="content_main" v-show="step == 0">
443 <div class="template_panel" ref="toolRef"> 457 <div class="template_panel">
444 <div class="title_item"> 458 <div class="title_item">
445 <span class="title_label">分类标准:</span> 459 <span class="title_label">分类标准:</span>
446 <span class="title_text">{{ templateInfo.name || '--' }}</span> 460 <span class="title_text">{{ templateInfo.name || '--' }}</span>
...@@ -454,7 +468,7 @@ onMounted(() => { ...@@ -454,7 +468,7 @@ onMounted(() => {
454 <span class="title_text">{{ templateInfo.description || '--' }}</span> 468 <span class="title_text">{{ templateInfo.description || '--' }}</span>
455 </div> 469 </div>
456 </div> 470 </div>
457 <div class="panel_content" :style="{ height: 'calc(100% - ' + toolH + 'px)' }"> 471 <div class="panel_content">
458 <div class="box_left"> 472 <div class="box_left">
459 <Tree ref="treeInfoRef" :treeInfo="treeInfo" @nodeClick="nodeClick" /> 473 <Tree ref="treeInfoRef" :treeInfo="treeInfo" @nodeClick="nodeClick" />
460 </div> 474 </div>
...@@ -563,6 +577,7 @@ onMounted(() => { ...@@ -563,6 +577,7 @@ onMounted(() => {
563 display: flex; 577 display: flex;
564 flex-wrap: wrap; 578 flex-wrap: wrap;
565 padding: 16px 16px 8px; 579 padding: 16px 16px 8px;
580 min-height: 82px;
566 581
567 .title_item { 582 .title_item {
568 display: flex; 583 display: flex;
...@@ -597,14 +612,15 @@ onMounted(() => { ...@@ -597,14 +612,15 @@ onMounted(() => {
597 612
598 .panel_content { 613 .panel_content {
599 height: 100%; 614 height: 100%;
600 display: flex;
601 flex: 1; 615 flex: 1;
602 border-top: 1px solid #d9d9d9; 616 border-top: 1px solid #d9d9d9;
617 position: relative;
603 618
604 .box_left { 619 .box_left {
605 width: 200px; 620 width: 200px;
606 height: 100%; 621 height: 100%;
607 border-right: 1px solid #d9d9d9; 622 border-right: 1px solid #d9d9d9;
623 position: absolute;
608 624
609 .aside_title { 625 .aside_title {
610 padding: 0 8px; 626 padding: 0 8px;
...@@ -622,7 +638,10 @@ onMounted(() => { ...@@ -622,7 +638,10 @@ onMounted(() => {
622 638
623 .box_right { 639 .box_right {
624 width: calc(100% - 200px); 640 width: calc(100% - 200px);
641 height: 100%;
625 padding-top: 8px; 642 padding-top: 8px;
643 position: absolute;
644 right: 0;
626 645
627 .el-breadcrumb { 646 .el-breadcrumb {
628 padding: 0 12px; 647 padding: 0 12px;
......
...@@ -107,7 +107,7 @@ const toPath = (type) => { ...@@ -107,7 +107,7 @@ const toPath = (type) => {
107 guid: currTableData.value.taskGuid, 107 guid: currTableData.value.taskGuid,
108 name: currTableData.value.taskName, 108 name: currTableData.value.taskName,
109 status: currTableData.value.status, 109 status: currTableData.value.status,
110 type: currTableData.value.status == 'Y'? 'modify':'confirm' 110 type: currTableData.value.status == 'Y'? 'detail':'confirm'
111 }, 111 },
112 }); 112 });
113 } 113 }
......
...@@ -8,10 +8,14 @@ import { ElMessage, ElMessageBox } from "element-plus"; ...@@ -8,10 +8,14 @@ import { ElMessage, ElMessageBox } from "element-plus";
8 import Table from '@/components/Table/index.vue' 8 import Table from '@/components/Table/index.vue'
9 import TableTools from '@/components/Tools/table_tools.vue' 9 import TableTools from '@/components/Tools/table_tools.vue'
10 import {getAnalysisReportList,delAnalysisRepor,updateAnalysisRepor} from "@/api/modules/dataMetaService" 10 import {getAnalysisReportList,delAnalysisRepor,updateAnalysisRepor} from "@/api/modules/dataMetaService"
11 import { getImageContent } from "@/api/modules/queryService";
12 import Dialog from '@/components/Dialog/index.vue' 11 import Dialog from '@/components/Dialog/index.vue'
13 import { getDownloadUrl, download } from "@/utils/common"; 12 import { getDownloadUrl, download } from "@/utils/common";
14 import { useRouter } from 'vue-router'; 13 import { useRouter } from 'vue-router';
14 import {
15 parseAndDecodeUrl,
16 getDownFileSignByUrl,
17 obsDownloadRequest
18 } from "@/api/modules/obsService";
15 const router = useRouter() 19 const router = useRouter()
16 const page = ref({ 20 const page = ref({
17 limit: 50, 21 limit: 50,
...@@ -119,20 +123,25 @@ const tableSearchItemList: any = ref([{ ...@@ -119,20 +123,25 @@ const tableSearchItemList: any = ref([{
119 placeholder: '血缘关系名称', 123 placeholder: '血缘关系名称',
120 clearable: true 124 clearable: true
121 }]); 125 }]);
122 const tableBtnClick = (scope, btn) => { 126 const tableBtnClick = async (scope, btn) => {
123 const type = btn.value; 127 const type = btn.value;
124 let row = scope.row; 128 let row = scope.row;
125 rowData.value = row 129 rowData.value = row
126 currTableData.value = row; 130 currTableData.value = row;
127 if (type == 'view') { 131 if (type == 'view') {
128 getImageContent(row.analysisReportUrl).then((res: any) => { 132 let fileName: string = parseAndDecodeUrl(row.analysisReportUrl).fileName;
133 const refSignInfo: any = await getDownFileSignByUrl(fileName);
134 if (!refSignInfo?.data) {
135 refSignInfo?.msg && ElMessage.error(refSignInfo?.msg);
136 return;
137 }
138 obsDownloadRequest(refSignInfo?.data).then((res: any) => {
129 if (res && !res.msg) { 139 if (res && !res.msg) {
130 let name = row.analysisReportUrl; 140 var fileSuffix = fileName ? fileName.substring(fileName.lastIndexOf('.') + 1) : '';
131 var fileSuffix = name ? name.substring(name.lastIndexOf('.') + 1) : '';
132 if (fileSuffix === 'png') { //浏览器可以支持图片和pdf预览 141 if (fileSuffix === 'png') { //浏览器可以支持图片和pdf预览
133 let fileUrl = getDownloadUrl(res, name, fileSuffix); 142 let fileUrl = <string>getDownloadUrl(res, name, fileSuffix);
134 let win = window.open(fileUrl, name); 143 let win = window.open(fileUrl, row.analysisReportName + fileSuffix);
135 win && (win.document.title = name); 144 win && (win.document.title = row.analysisReportName + fileSuffix);
136 } else { 145 } else {
137 download(res, row.analysisReportName, fileSuffix); 146 download(res, row.analysisReportName, fileSuffix);
138 } 147 }
...@@ -141,10 +150,16 @@ const tableBtnClick = (scope, btn) => { ...@@ -141,10 +150,16 @@ const tableBtnClick = (scope, btn) => {
141 } 150 }
142 }); 151 });
143 } else if (type == 'export') { 152 } else if (type == 'export') {
144 getImageContent(row.analysisReportUrl).then((res: any) => { 153 let fileName: string = parseAndDecodeUrl(row.analysisReportUrl).fileName;
154 const refSignInfo: any = await getDownFileSignByUrl(fileName);
155 if (!refSignInfo?.data) {
156 refSignInfo?.msg && ElMessage.error(refSignInfo?.msg);
157 return;
158 }
159 obsDownloadRequest(refSignInfo?.data).then((res: any) => {
145 if (res && !res.msg) { 160 if (res && !res.msg) {
146 let name = row.analysisReportUrl; 161 // let name = row.analysisReportUrl;
147 var fileSuffix = name ? name.substring(name.lastIndexOf('.') + 1) : ''; 162 var fileSuffix = fileName ? fileName.substring(fileName.lastIndexOf('.') + 1) : '';
148 download(res, row.analysisReportName, fileSuffix); 163 download(res, row.analysisReportName, fileSuffix);
149 } else { 164 } else {
150 res?.msg && ElMessage.error(res?.msg); 165 res?.msg && ElMessage.error(res?.msg);
......
...@@ -22,7 +22,11 @@ import { ...@@ -22,7 +22,11 @@ import {
22 delLineAge, 22 delLineAge,
23 checkTableData 23 checkTableData
24 } from '@/api/modules/dataMetaService'; 24 } from '@/api/modules/dataMetaService';
25 import { getFileUrl } from "@/api/modules/queryService" 25 import {
26 parseAndDecodeUrl,
27 getUpFileSignByUrl,
28 obsUploadRequest
29 } from "@/api/modules/obsService";
26 import { useRouter, useRoute } from "vue-router"; 30 import { useRouter, useRoute } from "vue-router";
27 import useDataMetaStore from "@/store/modules/dataMeta" 31 import useDataMetaStore from "@/store/modules/dataMeta"
28 import { cloneDeep } from 'lodash-es' 32 import { cloneDeep } from 'lodash-es'
...@@ -857,17 +861,23 @@ const pageSave = () => { ...@@ -857,17 +861,23 @@ const pageSave = () => {
857 return 861 return
858 } 862 }
859 863
860 let formData = new FormData(); 864 dialogInfo1.value.footer.btns[1].loading = true;
861 formData.append('file', file.value); 865 return getUpFileSignByUrl({ fileName: `${analysisReportName}.png` })
862 formData.append('fileName', `${analysisReportName}.png`); 866 .then((res: any) => {
863 getFileUrl(formData).then((res) => { 867 obsUploadRequest({
868 signedUrl: res.data.signedUrl,
869 file: file.value,
870 actualSignedRequestHeaders: res.data.actualSignedRequestHeaders
871 }).then(() => {
872 if (res.code == '00000') {
864 saveMetaReportAnalysis({ 873 saveMetaReportAnalysis({
865 table: lastClickNode.value.tableName, 874 table: lastClickNode.value.tableName,
866 database: lastClickNode.value.databaseName, 875 database: lastClickNode.value.databaseName,
867 analysisReportUrl: res.data, 876 analysisReportUrl: res.data?.signedUrl,
868 analysisReportName: analysisReportName, 877 analysisReportName: analysisReportName,
869 databaseChName: lastClickNode.value.databaseChName 878 databaseChName: lastClickNode.value.databaseChName
870 }).then((res: any) => { 879 }).then((res: any) => {
880 dialogInfo1.value.footer.btns[1].loading = false;
871 if (res.code == proxy.$passCode) { 881 if (res.code == proxy.$passCode) {
872 ElMessage({ 882 ElMessage({
873 type: "success", 883 type: "success",
...@@ -883,9 +893,19 @@ const pageSave = () => { ...@@ -883,9 +893,19 @@ const pageSave = () => {
883 }) 893 })
884 } 894 }
885 }) 895 })
896 } else {
897 ElMessage({
898 type: "error",
899 message: res.msg,
900 appendTo: lineageGraph.value.containerRef
901 })
902 }
886 }).catch((res) => { 903 }).catch((res) => {
887 ElMessage.error(res.msg) 904 ElMessage.error(res.msg)
888 }) 905 });
906 }).catch((res) => {
907 ElMessage.error(res.msg)
908 });
889 } 909 }
890 910
891 const formItems1: any = ref([ 911 const formItems1: any = ref([
...@@ -933,7 +953,7 @@ const dialogInfo1 = ref({ ...@@ -933,7 +953,7 @@ const dialogInfo1 = ref({
933 footer: { 953 footer: {
934 btns: [ 954 btns: [
935 { type: "default", label: "取消", value: "cancel" }, 955 { type: "default", label: "取消", value: "cancel" },
936 { type: "primary", label: "保存", value: "submit" }, 956 { type: "primary", label: "保存", value: "submit", loading: false },
937 ], 957 ],
938 }, 958 },
939 }); 959 });
......
...@@ -144,7 +144,7 @@ const getMetaChangeTableData = () => { ...@@ -144,7 +144,7 @@ const getMetaChangeTableData = () => {
144 } 144 }
145 145
146 146
147 const activeTabName = ref('task'); 147 const activeTabName = ref('meta');
148 148
149 watch(() => activeTabName.value, (val) => { 149 watch(() => activeTabName.value, (val) => {
150 if(val==="task"){ 150 if(val==="task"){
...@@ -420,9 +420,7 @@ const metaChangeTableInfo = ref({ ...@@ -420,9 +420,7 @@ const metaChangeTableInfo = ref({
420 // { label: "状态", field: "changeTime", width: 180, }, 420 // { label: "状态", field: "changeTime", width: 180, },
421 // { label: "操作时间", field: "changeTime", width: 180, }, 421 // { label: "操作时间", field: "changeTime", width: 180, },
422 ], 422 ],
423 data: [{ 423 data: [],
424 guid: 1
425 }],
426 page: { 424 page: {
427 type: "normal", 425 type: "normal",
428 rows: 0, 426 rows: 0,
...@@ -486,6 +484,7 @@ onBeforeMount(() => { ...@@ -486,6 +484,7 @@ onBeforeMount(() => {
486 </div> 484 </div>
487 <div class="main_wrap"> 485 <div class="main_wrap">
488 <el-tabs v-model="activeTabName"> 486 <el-tabs v-model="activeTabName">
487 <!--
489 <el-tab-pane label="同步任务变更记录" name="task"> 488 <el-tab-pane label="同步任务变更记录" name="task">
490 <div class="table_tool_wrap"> 489 <div class="table_tool_wrap">
491 <TableTools :searchItems="tableSearchItemList" :init="false" searchId="detect-table-search" 490 <TableTools :searchItems="tableSearchItemList" :init="false" searchId="detect-table-search"
...@@ -496,6 +495,7 @@ onBeforeMount(() => { ...@@ -496,6 +495,7 @@ onBeforeMount(() => {
496 @tablePageChange="taskChangeTablePageChange" /> 495 @tablePageChange="taskChangeTablePageChange" />
497 </div> 496 </div>
498 </el-tab-pane> 497 </el-tab-pane>
498 -->
499 <el-tab-pane label="元数据变更记录" name="meta"> 499 <el-tab-pane label="元数据变更记录" name="meta">
500 <div class="table_tool_wrap"> 500 <div class="table_tool_wrap">
501 <TableTools :searchItems="metaTableSearchItemList" :init="false" searchId="meta-detect-table-search" 501 <TableTools :searchItems="metaTableSearchItemList" :init="false" searchId="meta-detect-table-search"
......
...@@ -26,9 +26,13 @@ import { ...@@ -26,9 +26,13 @@ import {
26 saveMetaReportAnalysis, 26 saveMetaReportAnalysis,
27 checkTableData 27 checkTableData
28 } from '@/api/modules/dataMetaService'; 28 } from '@/api/modules/dataMetaService';
29 import { getFileUrl } from "@/api/modules/queryService"
30 import useDataMetaStore from "@/store/modules/dataMeta" 29 import useDataMetaStore from "@/store/modules/dataMeta"
31 import { TableColumnWidth } from '@/utils/enum'; 30 import { TableColumnWidth } from '@/utils/enum';
31 import {
32 parseAndDecodeUrl,
33 getUpFileSignByUrl,
34 obsUploadRequest
35 } from "@/api/modules/obsService";
32 36
33 const { proxy } = getCurrentInstance() as any; 37 const { proxy } = getCurrentInstance() as any;
34 const router = useRouter(); 38 const router = useRouter();
...@@ -556,18 +560,24 @@ const pageSave = () => { ...@@ -556,18 +560,24 @@ const pageSave = () => {
556 }) 560 })
557 return 561 return
558 } 562 }
559 let formData = new FormData();
560 formData.append('file', file.value);
561 formData.append('fileName', `${analysisReportName}.png`);
562 console.log(formInline1.value.pageName) 563 console.log(formInline1.value.pageName)
563 getFileUrl(formData).then((res) => { 564 dialogInfo1.value.footer.btns[1].loading = true;
565 getUpFileSignByUrl({ fileName: `${analysisReportName}.png` })
566 .then((res: any) => {
567 obsUploadRequest({
568 signedUrl: res.data.signedUrl,
569 file: file.value,
570 actualSignedRequestHeaders: res.data.actualSignedRequestHeaders
571 }).then(() => {
572 if (res.code == '00000') {
564 saveMetaReportAnalysis({ 573 saveMetaReportAnalysis({
565 table: sheetInfo.value.tableName, 574 table: sheetInfo.value.tableName,
566 database: sheetInfo.value.databaseName, 575 database: sheetInfo.value.databaseName,
567 analysisReportUrl: res.data, 576 analysisReportUrl: res.data?.signedUrl,
568 analysisReportName: analysisReportName, 577 analysisReportName: analysisReportName,
569 databaseChName: sheetInfo.value.databaseChName 578 databaseChName: sheetInfo.value.databaseChName
570 }).then((res: any) => { 579 }).then((res: any) => {
580 dialogInfo1.value.footer.btns[1].loading = false;
571 if (res.code == proxy.$passCode) { 581 if (res.code == proxy.$passCode) {
572 // ElMessage.success("保存成功") 582 // ElMessage.success("保存成功")
573 ElMessage({ 583 ElMessage({
...@@ -584,13 +594,19 @@ const pageSave = () => { ...@@ -584,13 +594,19 @@ const pageSave = () => {
584 }) 594 })
585 } 595 }
586 }) 596 })
587 }).catch((res) => { 597 } else {
588 ElMessage({ 598 ElMessage({
589 type: "error", 599 type: "error",
590 message: res.msg, 600 message: res.msg,
591 appendTo: lineageGraph.value[0].containerRef 601 appendTo: lineageGraph.value.containerRef
592 })
593 }) 602 })
603 }
604 }).catch((res) => {
605 ElMessage.error(res.msg)
606 });
607 }).catch((res) => {
608 ElMessage.error(res.msg)
609 });
594 } 610 }
595 611
596 const formItems1: any = ref([ 612 const formItems1: any = ref([
...@@ -638,7 +654,7 @@ const dialogInfo1 = ref({ ...@@ -638,7 +654,7 @@ const dialogInfo1 = ref({
638 footer: { 654 footer: {
639 btns: [ 655 btns: [
640 { type: "default", label: "取消", value: "cancel" }, 656 { type: "default", label: "取消", value: "cancel" },
641 { type: "primary", label: "保存", value: "submit" }, 657 { type: "primary", label: "保存", value: "submit", loading: false },
642 ], 658 ],
643 }, 659 },
644 }); 660 });
......
...@@ -238,12 +238,12 @@ const rulesDetailTableBtnClick = (scope, btn) => { ...@@ -238,12 +238,12 @@ const rulesDetailTableBtnClick = (scope, btn) => {
238 label: row.ruleName 238 label: row.ruleName
239 }]; 239 }];
240 smallCategoryList.value = [{ 240 smallCategoryList.value = [{
241 paramValue: detailInfo.value.smallCategory, 241 value: detailInfo.value.smallCategory,
242 paramName: row.smallCategory 242 label: row.smallCategory
243 }]; 243 }];
244 largeCategoryList.value = [{ 244 largeCategoryList.value = [{
245 paramValue: detailInfo.value.largeCategory, 245 value: detailInfo.value.largeCategory,
246 paramName: row.largeCategory 246 label: row.largeCategory
247 }]; 247 }];
248 oneRulesDetailDialogVisible.value = true; 248 oneRulesDetailDialogVisible.value = true;
249 } else { 249 } else {
...@@ -268,12 +268,12 @@ const rulesDetailTableBtnClick = (scope, btn) => { ...@@ -268,12 +268,12 @@ const rulesDetailTableBtnClick = (scope, btn) => {
268 label: row.ruleName 268 label: row.ruleName
269 }]; 269 }];
270 smallCategoryList.value = [{ 270 smallCategoryList.value = [{
271 paramValue: detailInfo.value.smallCategory, 271 value: detailInfo.value.smallCategory,
272 paramName: row.smallCategory 272 label: row.smallCategory
273 }]; 273 }];
274 largeCategoryList.value = [{ 274 largeCategoryList.value = [{
275 paramValue: detailInfo.value.largeCategory, 275 value: detailInfo.value.largeCategory,
276 paramName: row.largeCategory 276 label: row.largeCategory
277 }]; 277 }];
278 } else { 278 } else {
279 ElMessage.error(res.msg); 279 ElMessage.error(res.msg);
......
...@@ -135,18 +135,18 @@ const rulesListByType: any = computed(() => { ...@@ -135,18 +135,18 @@ const rulesListByType: any = computed(() => {
135 return {}; 135 return {};
136 } 136 }
137 return { 137 return {
138 char: checkRulesList.value.filter(r => r.paramValue == 'length_rule' || r.paramValue == 'ch_rule' || r.paramValue == 'en_rule' || r.paramValue == 'num_value_rule' || r.paramValue == 'custom_regular_rule'), 138 char: checkRulesList.value.filter(r => r.value == 'length_rule' || r.value == 'ch_rule' || r.value == 'en_rule' || r.value == 'num_value_rule' || r.value == 'custom_regular_rule'),
139 varchar: checkRulesList.value.filter(r => r.paramValue == 'length_rule' || r.paramValue == 'id_card_rule' || r.paramValue == 'phone_number_rule' || r.paramValue == 'ch_rule' || r.paramValue == 'en_rule' || r.paramValue == 'num_value_rule' || r.paramValue == 'custom_regular_rule'), 139 varchar: checkRulesList.value.filter(r => r.value == 'length_rule' || r.value == 'id_card_rule' || r.value == 'phone_number_rule' || r.value == 'ch_rule' || r.value == 'en_rule' || r.value == 'num_value_rule' || r.value == 'custom_regular_rule'),
140 int: checkRulesList.value.filter(r => r.paramValue == 'length_rule' || r.paramValue == 'num_value_rule' || r.paramValue == 'custom_regular_rule'), 140 int: checkRulesList.value.filter(r => r.value == 'length_rule' || r.value == 'num_value_rule' || r.value == 'custom_regular_rule'),
141 date: checkRulesList.value.filter(r => r.paramValue == 'date_format_rule' || r.paramValue == 'custom_regular_rule'), 141 date: checkRulesList.value.filter(r => r.value == 'date_format_rule' || r.value == 'custom_regular_rule'),
142 datetime: checkRulesList.value.filter(r => r.paramValue == 'date_format_rule' || r.paramValue == 'custom_regular_rule'), 142 datetime: checkRulesList.value.filter(r => r.value == 'date_format_rule' || r.value == 'custom_regular_rule'),
143 timestamp: checkRulesList.value.filter(r => r.paramValue == 'custom_regular_rule' || r.paramValue == 'custom_regular_rule'), 143 timestamp: checkRulesList.value.filter(r => r.value == 'custom_regular_rule' || r.value == 'custom_regular_rule'),
144 // text: checkRulesList.value.filter(r => r.paramValue == ''), 144 // text: checkRulesList.value.filter(r => r.value == ''),
145 decimal: checkRulesList.value.filter(r => r.paramValue == 'length_rule' || r.paramValue == 'precision_rule' || r.paramValue == 'num_value_rule' || r.paramValue == 'custom_regular_rule'), 145 decimal: checkRulesList.value.filter(r => r.value == 'length_rule' || r.value == 'precision_rule' || r.value == 'num_value_rule' || r.value == 'custom_regular_rule'),
146 // json: checkRulesList.value.filter(r => r.paramValue == ''), 146 // json: checkRulesList.value.filter(r => r.value == ''),
147 tinyint: checkRulesList.value.filter(r => r.paramValue == 'length_rule' || r.paramValue == 'num_value_rule' || r.paramValue == 'custom_regular_rule'), 147 tinyint: checkRulesList.value.filter(r => r.value == 'length_rule' || r.value == 'num_value_rule' || r.value == 'custom_regular_rule'),
148 time: checkRulesList.value.filter(r => r.paramValue == 'custom_regular_rule'), 148 time: checkRulesList.value.filter(r => r.value == 'custom_regular_rule'),
149 bit: checkRulesList.value.filter(r => r.paramValue == 'ch_rule' || r.paramValue == 'en_rule' || r.paramValue == 'custom_regular_rule'), 149 bit: checkRulesList.value.filter(r => r.value == 'ch_rule' || r.value == 'en_rule' || r.value == 'custom_regular_rule'),
150 } 150 }
151 }); 151 });
152 152
...@@ -238,8 +238,8 @@ const panelList: any = ref([ ...@@ -238,8 +238,8 @@ const panelList: any = ref([
238 default: '1', 238 default: '1',
239 options: props.largeCategoryList, 239 options: props.largeCategoryList,
240 props: { 240 props: {
241 label: 'paramName', 241 label: 'label',
242 value: 'paramValue' 242 value: 'value'
243 }, 243 },
244 required: true, 244 required: true,
245 visible: true 245 visible: true
...@@ -249,8 +249,8 @@ const panelList: any = ref([ ...@@ -249,8 +249,8 @@ const panelList: any = ref([
249 placeholder: '请选择', 249 placeholder: '请选择',
250 field: 'smallCategory', 250 field: 'smallCategory',
251 props: { 251 props: {
252 label: 'paramName', 252 label: 'label',
253 value: 'paramValue' 253 value: 'value'
254 }, 254 },
255 default: '', 255 default: '',
256 options: props.smallCategoryList.slice(6), 256 options: props.smallCategoryList.slice(6),
...@@ -1006,7 +1006,7 @@ const setPanelListValue = (item, isSelectChange = false, init = false, radioGrou ...@@ -1006,7 +1006,7 @@ const setPanelListValue = (item, isSelectChange = false, init = false, radioGrou
1006 } 1006 }
1007 } 1007 }
1008 if (isSelectChange) { 1008 if (isSelectChange) {
1009 val['smallCategory'] = panelList.value[2].options[0]?.paramValue; 1009 val['smallCategory'] = panelList.value[2].options[0]?.value;
1010 } else if (!val['smallCategory']) { 1010 } else if (!val['smallCategory']) {
1011 val['smallCategory'] = getDefaultSmallCategory(formItems.value[0].default); 1011 val['smallCategory'] = getDefaultSmallCategory(formItems.value[0].default);
1012 } else if (radioGroupChange && !init) {//切换规则类型。 1012 } else if (radioGroupChange && !init) {//切换规则类型。
...@@ -2306,8 +2306,8 @@ defineExpose({ ...@@ -2306,8 +2306,8 @@ defineExpose({
2306 <template #default="scope"> 2306 <template #default="scope">
2307 <el-select v-if="!props.readonly || (scope.row.dataType == 'text' || scope.row.dataType == 'json')" 2307 <el-select v-if="!props.readonly || (scope.row.dataType == 'text' || scope.row.dataType == 'json')"
2308 v-model="scope.row['checkRule']" placeholder="请选择" filterable clearable> 2308 v-model="scope.row['checkRule']" placeholder="请选择" filterable clearable>
2309 <el-option v-for="opt in rulesListByType[scope.row.dataType]" :key="opt['paramValue']" 2309 <el-option v-for="opt in rulesListByType[scope.row.dataType]" :key="opt['value']"
2310 :label="opt['paramName']" :value="opt['paramValue']" /> 2310 :label="opt['label']" :value="opt['value']" />
2311 </el-select> 2311 </el-select>
2312 <span v-else>{{ scope.row.checkRuleName ?? '--' }}</span> 2312 <span v-else>{{ scope.row.checkRuleName ?? '--' }}</span>
2313 </template> 2313 </template>
......
...@@ -16,6 +16,9 @@ import { ...@@ -16,6 +16,9 @@ import {
16 getSmallCategoryList, 16 getSmallCategoryList,
17 getLargeCategoryList, 17 getLargeCategoryList,
18 } from '@/api/modules/dataQuality'; 18 } from '@/api/modules/dataQuality';
19 import {
20 getMetaTreeData
21 } from '@/api/modules/dataMetaService';
19 import ruleForm from "../data_quality/ruleForm.vue"; 22 import ruleForm from "../data_quality/ruleForm.vue";
20 import useUserStore from "@/store/modules/user"; 23 import useUserStore from "@/store/modules/user";
21 import useDataQualityStore from "@/store/modules/dataQuality"; 24 import useDataQualityStore from "@/store/modules/dataQuality";
...@@ -60,7 +63,7 @@ const toSubjectTables: any = ref([]); ...@@ -60,7 +63,7 @@ const toSubjectTables: any = ref([]);
60 63
61 const getSubjectTableTreeData = () => { 64 const getSubjectTableTreeData = () => {
62 dsFromTreeDataLoading.value = true; 65 dsFromTreeDataLoading.value = true;
63 getSubjectTableTree({}).then((res: any) => { 66 getMetaTreeData({}).then((res: any) => {
64 dsFromTreeDataLoading.value = false; 67 dsFromTreeDataLoading.value = false;
65 if (res.code == proxy.$passCode) { 68 if (res.code == proxy.$passCode) {
66 dsFromTreeData.value = res.data?.map(d => { 69 dsFromTreeData.value = res.data?.map(d => {
...@@ -428,17 +431,17 @@ const save = () => { ...@@ -428,17 +431,17 @@ const save = () => {
428 <div class="operator_panel is-block"> 431 <div class="operator_panel is-block">
429 <div class="panel_title"> 432 <div class="panel_title">
430 <div class="title_text"> 433 <div class="title_text">
431 <span>选择主题</span> 434 <span>选择表</span>
432 <span class="tips_text">选择需要添加质检规则的主题表</span> 435 <span class="tips_text">选择需要添加质检规则的表,请确保数据库为脱产环境,避免数据质检影响您的生产环境,且允许在该脱产环境建脏数据的库,请知晓!</span>
433 </div> 436 </div>
434 </div> 437 </div>
435 <TreeTransfer mode="transfer" :title="['主题表', '已选表']" pid="parentGuid" 438 <TreeTransfer mode="transfer" :title="['可选表', '已选表']" pid="parentGuid"
436 :from-tree-data-loading="dsFromTreeDataLoading" :lazy="true" :checkOnClickNode="true" 439 :from-tree-data-loading="dsFromTreeDataLoading" :checkOnClickNode="true"
437 :from_checked_all="false" :from_data="dsFromTreeData" :to_data="dsToTreeData" node_key="guid" 440 :from_checked_all="false" :from_data="dsFromTreeData" :to_data="dsToTreeData" node_key="guid"
438 :transferOpenNode="true" width="70%" :defaultProps="{ 441 :transferOpenNode="true" width="70%" :defaultProps="{
439 label: 'name', 442 label: 'name',
440 value: 'guid' 443 value: 'guid'
441 }" :lazyFn="handleSubjectTableLazyFn" @left-check-change="handleSubjectCheckedChange" 444 }"
442 height="calc(100% - 64px)"> 445 height="calc(100% - 64px)">
443 </TreeTransfer> 446 </TreeTransfer>
444 </div> 447 </div>
......
...@@ -221,7 +221,7 @@ const tableBtnClick = async (scope, btn) => { ...@@ -221,7 +221,7 @@ const tableBtnClick = async (scope, btn) => {
221 const row = scope.row; 221 const row = scope.row;
222 currTableData.value = row; 222 currTableData.value = row;
223 if (type == "export_file") { 223 if (type == "export_file") {
224 const refSignInfo: any = await getDownFileSignByUrl(parseAndDecodeUrl(row.filePath).decodedPath); 224 const refSignInfo: any = await getDownFileSignByUrl(parseAndDecodeUrl(row.filePath).fileName);
225 if (!refSignInfo?.data) { 225 if (!refSignInfo?.data) {
226 refSignInfo?.msg && ElMessage.error(refSignInfo?.msg); 226 refSignInfo?.msg && ElMessage.error(refSignInfo?.msg);
227 return; 227 return;
...@@ -236,7 +236,7 @@ const tableBtnClick = async (scope, btn) => { ...@@ -236,7 +236,7 @@ const tableBtnClick = async (scope, btn) => {
236 //downFile(row.filePath, row.fileName) 236 //downFile(row.filePath, row.fileName)
237 } else if (type == 'export_abnormal_data') { 237 } else if (type == 'export_abnormal_data') {
238 //downFile(row.errorFilePath, '') 238 //downFile(row.errorFilePath, '')
239 const refSignInfo: any = await getDownFileSignByUrl(parseAndDecodeUrl(row.errorFilePath).decodedPath); 239 const refSignInfo: any = await getDownFileSignByUrl(parseAndDecodeUrl(row.errorFilePath).fileName);
240 if (!refSignInfo?.data) { 240 if (!refSignInfo?.data) {
241 refSignInfo?.msg && ElMessage.error(refSignInfo?.msg); 241 refSignInfo?.msg && ElMessage.error(refSignInfo?.msg);
242 return; 242 return;
......
Styling with Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!