diff --git a/dbm-ui/frontend/src/hooks/useTicketCloneInfo/generateCloneData/mysql/haDbBackup.ts b/dbm-ui/frontend/src/hooks/useTicketCloneInfo/generateCloneData/mysql/haDbBackup.ts index 7b8f0bc728..a3b9dcfb12 100644 --- a/dbm-ui/frontend/src/hooks/useTicketCloneInfo/generateCloneData/mysql/haDbBackup.ts +++ b/dbm-ui/frontend/src/hooks/useTicketCloneInfo/generateCloneData/mysql/haDbBackup.ts @@ -18,18 +18,20 @@ import { random } from '@utils'; // Mysql 全库备份 export function generateMysqlDbBackupCloneData(ticketData: TicketModel) { const { clusters, infos } = ticketData.details; - const tableDataList = infos.clusters.map((item) => ({ + const isNewProtocol = Array.isArray(infos); + const tableDataList = (isNewProtocol ? infos : infos.clusters).map((item) => ({ rowKey: random(), clusterData: { id: item.cluster_id, domain: clusters[item.cluster_id].immute_domain, + type: clusters[item.cluster_id].cluster_type, }, backupLocal: item.backup_local, })); return Promise.resolve({ tableDataList, - backupType: infos.backup_type, - fileTag: infos.file_tag, + backupType: isNewProtocol ? ticketData.details.backup_type : infos.backup_type, + fileTag: isNewProtocol ? ticketData.details.file_tag : infos.file_tag, remark: ticketData.remark, }); } diff --git a/dbm-ui/frontend/src/hooks/useTicketCloneInfo/generateCloneData/mysql/haDbTableBackup.ts b/dbm-ui/frontend/src/hooks/useTicketCloneInfo/generateCloneData/mysql/haDbTableBackup.ts index 1605c6a88a..8966753389 100644 --- a/dbm-ui/frontend/src/hooks/useTicketCloneInfo/generateCloneData/mysql/haDbTableBackup.ts +++ b/dbm-ui/frontend/src/hooks/useTicketCloneInfo/generateCloneData/mysql/haDbTableBackup.ts @@ -13,6 +13,8 @@ import type { MySQLTableBackupDetails } from '@services/model/ticket/details/mysql'; import TicketModel from '@services/model/ticket/ticket'; +import { ClusterTypes } from '@common/const'; + import { random } from '@utils'; // Mysql 库表备份 @@ -24,6 +26,7 @@ export function generateMysqlDbTableBackupCloneData(ticketData: TicketModel) { const { infos, clusters } = ticketData.details; - const tableDataList = infos.clusters.map((item) => { + const isNewProtocol = Array.isArray(infos); + const tableDataList = (isNewProtocol ? infos : infos.clusters).map((item) => { const clusterItem = clusters[item.cluster_id]; return { @@ -35,8 +36,8 @@ export function generateSpiderDbBackupCloneData(ticketData: TicketModel @@ -105,6 +105,8 @@ import { useRouter } from 'vue-router'; import TendbhaModel from '@services/model/mysql/tendbha'; + import TendbsingleModel from '@services/model/mysql/tendbsingle'; + import { queryClusters } from '@services/source/mysqlCluster'; import { createTicket } from '@services/source/ticket'; import { useTicketCloneInfo } from '@hooks'; @@ -149,7 +151,10 @@ const formData = reactive(createDefaultData()); const tableData = ref>([createRowData({})]); - const selectedClusters = shallowRef<{ [key: string]: Array }>({ [ClusterTypes.TENDBHA]: [] }); + const selectedClusters = shallowRef<{ [key: string]: Array }>({ + [ClusterTypes.TENDBHA]: [], + [ClusterTypes.TENDBSINGLE]: [], + }); // 集群域名是否已存在表格的映射表 let domainMemo: Record = {}; @@ -174,28 +179,32 @@ } tableData.value.forEach((row) => { Object.assign(row, { - backupLocal: value, + backupLocal: !row.clusterData || row.clusterData.type === ClusterTypes.TENDBSINGLE ? 'master' : value, }); }); }; // 批量选择 - const handelClusterChange = (selected: Record>) => { + const handelClusterChange = (selected: Record>) => { selectedClusters.value = selected; - const newList = selected[ClusterTypes.TENDBHA].reduce((results, clusterData) => { - const domain = clusterData.master_domain; - if (!domainMemo[domain]) { - const row = createRowData({ - clusterData: { - id: clusterData.id, - domain: clusterData.master_domain, - }, - }); - results.push(row); - domainMemo[domain] = true; - } - return results; - }, [] as IDataRow[]); + const newList = [...selected[ClusterTypes.TENDBHA], ...selected[ClusterTypes.TENDBSINGLE]].reduce( + (results, clusterData) => { + const domain = clusterData.master_domain; + if (!domainMemo[domain]) { + const row = createRowData({ + clusterData: { + id: clusterData.id, + domain: clusterData.master_domain, + type: clusterData.cluster_type, + }, + }); + results.push(row); + domainMemo[domain] = true; + } + return results; + }, + [] as IDataRow[], + ); if (checkListEmpty(tableData.value)) { tableData.value = newList; @@ -206,8 +215,34 @@ }; // 输入一个集群 - const handleInputCluster = (index: number, item: IDataRow) => { - tableData.value[index] = item; + const handleChangeCluster = async (index: number, clusterId: number) => { + if (tableData.value[index].clusterData?.id === clusterId) { + return; + } + + const resultList = await queryClusters({ + cluster_filters: [ + { + id: clusterId, + }, + ], + bk_biz_id: window.PROJECT_CONFIG.BIZ_ID, + }); + if (resultList.length < 1) { + return; + } + const item = resultList[0]; + const domain = item.master_domain; + const row = createRowData({ + clusterData: { + id: item.id, + domain, + type: item.cluster_type, + }, + }); + tableData.value[index] = row; + domainMemo[domain] = true; + selectedClusters.value[item.cluster_type].push(item); }; // 追加集群 @@ -225,8 +260,10 @@ tableData.value = dataList; if (domain) { delete domainMemo[domain]; - const clustersArr = selectedClusters.value[ClusterTypes.TENDBHA]; - selectedClusters.value[ClusterTypes.TENDBHA] = clustersArr.filter((item) => item.master_domain !== domain); + const haList = selectedClusters.value[ClusterTypes.TENDBHA]; + selectedClusters.value[ClusterTypes.TENDBHA] = haList.filter((item) => item.master_domain !== domain); + const singleList = selectedClusters.value[ClusterTypes.TENDBSINGLE]; + selectedClusters.value[ClusterTypes.TENDBSINGLE] = singleList.filter((item) => item.master_domain !== domain); } }; @@ -250,10 +287,9 @@ ticket_type: 'MYSQL_HA_FULL_BACKUP', remark: formData.remark, details: { - infos: { - ...formData, - clusters: infos, - }, + backup_type: formData.backup_type, + file_tag: formData.file_tag, + infos, }, }).then((data) => { window.changeConfirm = false; @@ -276,6 +312,7 @@ tableData.value = [createRowData()]; Object.assign(formData, createDefaultData()); selectedClusters.value[ClusterTypes.TENDBHA] = []; + selectedClusters.value[ClusterTypes.TENDBSINGLE] = []; domainMemo = {}; window.changeConfirm = false; }; diff --git a/dbm-ui/frontend/src/views/db-manage/mysql/db-backup/pages/page1/components/RenderData/Index.vue b/dbm-ui/frontend/src/views/db-manage/mysql/db-backup/pages/page1/components/RenderData/Index.vue index 0e47e049bf..9d97d54ada 100644 --- a/dbm-ui/frontend/src/views/db-manage/mysql/db-backup/pages/page1/components/RenderData/Index.vue +++ b/dbm-ui/frontend/src/views/db-manage/mysql/db-backup/pages/page1/components/RenderData/Index.vue @@ -78,11 +78,11 @@ const selectList = [ { value: 'master', - label: 'master', + label: 'Master', }, { value: 'slave', - label: 'slave', + label: 'Slave', }, ]; diff --git a/dbm-ui/frontend/src/views/db-manage/mysql/db-backup/pages/page1/components/RenderData/RenderBackupLocal.vue b/dbm-ui/frontend/src/views/db-manage/mysql/db-backup/pages/page1/components/RenderData/RenderBackupLocal.vue index 291c4e3d56..1283354341 100644 --- a/dbm-ui/frontend/src/views/db-manage/mysql/db-backup/pages/page1/components/RenderData/RenderBackupLocal.vue +++ b/dbm-ui/frontend/src/views/db-manage/mysql/db-backup/pages/page1/components/RenderData/RenderBackupLocal.vue @@ -12,22 +12,19 @@ --> - diff --git a/dbm-ui/frontend/src/views/db-manage/mysql/db-backup/pages/page1/components/RenderData/Row.vue b/dbm-ui/frontend/src/views/db-manage/mysql/db-backup/pages/page1/components/RenderData/Row.vue index e72d614f08..a2e501cb45 100644 --- a/dbm-ui/frontend/src/views/db-manage/mysql/db-backup/pages/page1/components/RenderData/Row.vue +++ b/dbm-ui/frontend/src/views/db-manage/mysql/db-backup/pages/page1/components/RenderData/Row.vue @@ -17,7 +17,7 @@ + @id-change="handleClusterIdChange" /> --> -->