import { intl } from '@/utils/intl'; import { useEffect, useState } from 'react'; import { useModel } from 'umi'; import { Space, Button, Table, Alert, Result, Tooltip, message, Tag, Modal, Typography, Spin, } from 'antd'; import { CloseCircleFilled, CheckCircleFilled, CaretRightFilled, CaretDownFilled, CopyOutlined, ExclamationCircleOutlined, CheckOutlined, } from '@ant-design/icons'; import { ProCard } from '@ant-design/pro-components'; import useRequest from '@/utils/useRequest'; import type { ColumnsType } from 'antd/es/table'; import copy from 'copy-to-clipboard'; import { queryDeploymentReport, queryConnectionInfo, queryInstallLog, } from '@/services/ob-deploy-web/Deployments'; import { componentsConfig, componentVersionTypeToComponent, } from '../constants'; import { handleQuit, getErrorInfo } from '@/utils'; import { getLocale } from 'umi'; import EnStyles from './indexEn.less'; import ZhStyles from './indexZh.less'; const locale = getLocale(); const styles = locale === 'zh-CN' ? ZhStyles : EnStyles; const { Paragraph } = Typography; export default function InstallProcess() { const { configData, installStatus, setCurrentStep, handleQuitProgress, setErrorVisible, setErrorsList, errorsList, } = useModel('global'); const [logs, setLogs] = useState({}); const [currentExpeandedName, setCurrentExpeandedName] = useState(''); const name = configData?.components?.oceanbase?.appname; const { run: fetchReportInfo, data: reportInfo } = useRequest( queryDeploymentReport, { onError: (e: any) => { const errorInfo = getErrorInfo(e); setErrorVisible(true); setErrorsList([...errorsList, errorInfo]); }, }, ); const { run: fetchConnectInfo, data: connectInfo } = useRequest( queryConnectionInfo, { onError: (e: any) => { const errorInfo = getErrorInfo(e); setErrorVisible(true); setErrorsList([...errorsList, errorInfo]); }, }, ); const { run: handleInstallLog, loading } = useRequest(queryInstallLog, { onSuccess: ( { success, data }: API.OBResponseInstallLog_, [{ component_name }]: [API.queryInstallLogParams], ) => { if (success) { setLogs({ ...logs, [component_name]: data?.log }); setTimeout(() => { const log = document.getElementById(`report-log-${component_name}`); if (log) { log.scrollTop = log.scrollHeight; } }); } }, onError: (e: any) => { const errorInfo = getErrorInfo(e); setErrorVisible(true); setErrorsList([...errorsList, errorInfo]); }, }); const handleCopy = (content: string) => { copy(content); message.success( intl.formatMessage({ id: 'OBD.pages.components.InstallFinished.CopiedSuccessfully', defaultMessage: '复制成功', }), ); }; const handleCopyCommand = (command: string) => { copy(command); message.success( intl.formatMessage({ id: 'OBD.pages.components.InstallFinished.CopiedSuccessfully', defaultMessage: '复制成功', }), ); }; useEffect(() => { fetchReportInfo({ name }); fetchConnectInfo({ name }); }, []); const connectColumns: ColumnsType = [ { title: intl.formatMessage({ id: 'OBD.pages.components.InstallFinished.Component', defaultMessage: '组件', }), dataIndex: 'component', width: 200, render: (text) => { const component = componentVersionTypeToComponent[text] ? componentVersionTypeToComponent[text] : text; return componentsConfig[component]?.showComponentName || '-'; }, }, { title: intl.formatMessage({ id: 'OBD.pages.components.InstallFinished.AccessAddress', defaultMessage: '访问地址', }), dataIndex: 'access_url', width: 160, render: (text) => text || '-', }, { title: intl.formatMessage({ id: 'OBD.pages.components.InstallFinished.Account', defaultMessage: '账号', }), dataIndex: 'user', render: (text) => text || '-', }, { title: intl.formatMessage({ id: 'OBD.pages.components.InstallFinished.Password', defaultMessage: '密码', }), dataIndex: 'password', width: 160, render: (text) => text ? (
{text}
) : ( '-' ), }, { title: intl.formatMessage({ id: 'OBD.pages.components.InstallFinished.ConnectionString', defaultMessage: '连接串', }), dataIndex: 'connect_url', width: 300, render: (text, record) => { let content; if (/^http/g.test(text)) { content = ( {text} ); } else { content = (
{text}
); } return (
{content}
handleCopy(text)} />
); }, }, ]; const reportColumns: ColumnsType = [ { title: intl.formatMessage({ id: 'OBD.pages.components.InstallFinished.ComponentName', defaultMessage: '组件名称', }), dataIndex: 'name', render: (text) => { const component = componentVersionTypeToComponent[text] ? componentVersionTypeToComponent[text] : text; return componentsConfig[component]?.showComponentName || '-'; }, }, { title: intl.formatMessage({ id: 'OBD.pages.components.InstallFinished.ComponentType', defaultMessage: '组件类型', }), dataIndex: 'type', render: (_, record) => { const component = componentVersionTypeToComponent[record.name] ? componentVersionTypeToComponent[record.name] : record.name; return componentsConfig[component]?.type || '-'; }, }, { title: intl.formatMessage({ id: 'OBD.pages.components.InstallFinished.Version', defaultMessage: '版本', }), dataIndex: 'version', render: (text) => text || '-', }, { title: intl.formatMessage({ id: 'OBD.pages.components.InstallFinished.InstallationResults', defaultMessage: '安装结果', }), dataIndex: 'status', width: locale === 'zh-CN' ? 200 : 260, render: (text, record) => { const statusIcon = text === 'SUCCESSFUL' ? ( ) : ( ); const status = text === 'SUCCESSFUL' ? intl.formatMessage({ id: 'OBD.pages.components.InstallFinished.Success', defaultMessage: '成功', }) : intl.formatMessage({ id: 'OBD.pages.components.InstallFinished.Failed', defaultMessage: '失败', }); const getCommand = (component: string, ip: string) => { return `obd tool command ${name} log -c ${component} -s ${ip}`; }; const serversInfo = record.servers?.map((server) => ({ server, command: getCommand(record.name, server), })); return ( <> {statusIcon} {status}
{intl.formatMessage({ id: 'OBD.pages.components.InstallFinished.GoToTheObdConsole', defaultMessage: '请前往 OBD 中控机执行以下命令查看日志', })}
{serversInfo.map((item) => ( <>
{statusIcon} {item.server}
))} } placement="topRight" overlayClassName={styles.reportTooltip} > {intl.formatMessage({ id: 'OBD.pages.components.InstallFinished.ViewDetails', defaultMessage: '查看详情', })}
); }, }, ]; const onExpand = (expeanded: boolean, record: API.DeploymentReport) => { if (expeanded && !logs?.[record.name]) { setCurrentExpeandedName(record.name); handleInstallLog({ name, component_name: record.name }); } }; const expandedRowRender = (record: API.DeploymentReport) => { return (
          {logs?.[record.name]}
        
); }; const handleFinished = () => { Modal.confirm({ title: intl.formatMessage({ id: 'OBD.pages.components.InstallFinished.DoYouWantToExit', defaultMessage: '是否要退出页面?', }), okText: intl.formatMessage({ id: 'OBD.pages.components.InstallFinished.Exit', defaultMessage: '退出', }), cancelText: intl.formatMessage({ id: 'OBD.pages.components.InstallFinished.Cancel', defaultMessage: '取消', }), okButtonProps: { type: 'primary', danger: true }, content: (
{intl.formatMessage({ id: 'OBD.pages.components.InstallFinished.BeforeExitingMakeSureThat', defaultMessage: '退出前,请确保已复制访问地址及账密信息', })}
{intl.formatMessage({ id: 'OBD.pages.components.InstallFinished.CopyInformation', defaultMessage: '复制信息', })} , <> {intl.formatMessage({ id: 'OBD.pages.components.InstallFinished.CopyInformation', defaultMessage: '复制信息', })} , ], onCopy: () => handleCopy(JSON.stringify(connectInfo?.items, null, '\n')), }} />
), icon: , onOk: () => { handleQuit(handleQuitProgress, setCurrentStep, true); }, }); }; return ( } title={ installStatus === 'SUCCESSFUL' ? (
{intl.formatMessage({ id: 'OBD.pages.components.InstallFinished.OceanbaseSuccessfullyDeployed', defaultMessage: 'OceanBase 部署成功', })}
) : (
{intl.formatMessage({ id: 'OBD.pages.components.InstallFinished.OceanbaseDeploymentFailed', defaultMessage: 'OceanBase 部署失败', })}
) } /> {connectInfo?.items?.length ? ( handleCopy(JSON.stringify(connectInfo?.items, null, '\n')) } data-aspm-click="c307514.d317299" data-aspm-desc={intl.formatMessage({ id: 'OBD.pages.components.InstallFinished.DeploymentResultCopyInformation', defaultMessage: '部署结果-复制信息', })} data-aspm-param={``} data-aspm-expo > {intl.formatMessage({ id: 'OBD.pages.components.InstallFinished.OneClickCopy', defaultMessage: '一键复制', })} } /> ) : null} collapsed ? : } bodyStyle={{ paddingLeft: '0px', paddingRight: '0px' }} >
); }