diff --git a/datavines-notification/datavines-notification-plugins/datavines-notification-plugin-email/src/main/java/io/datavines/notification/plugin/email/EMailSender.java b/datavines-notification/datavines-notification-plugins/datavines-notification-plugin-email/src/main/java/io/datavines/notification/plugin/email/EMailSender.java index 4c43c55b1..0b79273f7 100644 --- a/datavines-notification/datavines-notification-plugins/datavines-notification-plugin-email/src/main/java/io/datavines/notification/plugin/email/EMailSender.java +++ b/datavines-notification/datavines-notification-plugins/datavines-notification-plugin-email/src/main/java/io/datavines/notification/plugin/email/EMailSender.java @@ -177,8 +177,14 @@ private String getTextTypeMessage(String content) { ArrayNode list = JSONUtils.parseArray(content); StringBuilder contents = new StringBuilder(100); for (JsonNode jsonNode : list) { + String nodeMessage = jsonNode.toString().replace("\"", ""); contents.append(EmailConstants.TR); - contents.append(EmailConstants.TD).append(jsonNode.toString().replace("\"", "")).append(EmailConstants.TD_END); + if (nodeMessage.startsWith("Task Execution Record")||nodeMessage.startsWith("任务执行记录")){ + String formatMessage = String.format("%s : %s", nodeMessage.substring(0,nodeMessage.indexOf(" : ")),nodeMessage.substring(nodeMessage.indexOf(":")+2),nodeMessage.substring(nodeMessage.indexOf(":")+2)); + contents.append(EmailConstants.TD).append(formatMessage).append(EmailConstants.TD_END); + }else { + contents.append(EmailConstants.TD).append(jsonNode.toString().replace("\"", "")).append(EmailConstants.TD_END); + } contents.append(EmailConstants.TR_END); } return EmailConstants.HTML_HEADER_PREFIX + contents.toString() + EmailConstants.TABLE_HTML_TAIL + EmailConstants.BODY_HTML_TAIL; diff --git a/datavines-notification/datavines-notification-plugins/datavines-notification-plugin-email/src/main/java/io/datavines/notification/plugin/email/EmailConstants.java b/datavines-notification/datavines-notification-plugins/datavines-notification-plugin-email/src/main/java/io/datavines/notification/plugin/email/EmailConstants.java index c122e35fa..a9e232cb7 100644 --- a/datavines-notification/datavines-notification-plugins/datavines-notification-plugin-email/src/main/java/io/datavines/notification/plugin/email/EmailConstants.java +++ b/datavines-notification/datavines-notification-plugins/datavines-notification-plugin-email/src/main/java/io/datavines/notification/plugin/email/EmailConstants.java @@ -73,4 +73,6 @@ private EmailConstants() { public static final String EXCEL_SUFFIX_XLSX = ".xlsx"; public static final String SINGLE_SLASH = "/"; + + public static final String URL=" import(/* webpackChunkName: 'view-forgetPwd' */ '@/view/ForgetPassword')), }, + { + path: '/history', + component: lazy(()=>import('@/view/JobHistory')) + } ]; export { diff --git a/datavines-ui/src/utils/base64.ts b/datavines-ui/src/utils/base64.ts new file mode 100644 index 000000000..b63d26ef0 --- /dev/null +++ b/datavines-ui/src/utils/base64.ts @@ -0,0 +1,11 @@ +// @ts-ignore +import { decode } from "base-64"; + +export function base64Decode(encodedString: string): string | null { + try { + return decode(encodedString); + } catch (error) { + console.error('Base64 decoding error:', error); + return null; + } +} \ No newline at end of file diff --git a/datavines-ui/src/view/JobHistory/index.tsx b/datavines-ui/src/view/JobHistory/index.tsx new file mode 100644 index 000000000..b828d2a6c --- /dev/null +++ b/datavines-ui/src/view/JobHistory/index.tsx @@ -0,0 +1,98 @@ +/* eslint-disable react/no-danger */ +import React, {useRef, useState, useImperativeHandle} from 'react'; +import { DownloadOutlined, SyncOutlined} from '@ant-design/icons'; +import {usePersistFn, useMount,} from '@/common'; +import {useIntl} from 'react-intl'; +import {$http} from '@/http'; +import {download} from '@/utils'; +import querystring from "querystring"; +import {base64Decode} from "utils/base64"; + +const JobHistory = () => { + const intl = useIntl(); + const innerRef = useRef(); + const dealMsg = (msg: string) => { + if (msg) { + return msg.replace(/\r\n/g, '
'); + } + return ''; + }; + const [loading, setLoading] = useState(false); + const [wholeLog, setWholeLog] = useState<{ offsetLine: number, msg: string }[]>([]); + let executionId = querystring.parse(base64Decode(window.location.href.split('?')[1] as string) || '').executionId; + const getData = async (offsetLine: number) => { + try { + setLoading(true); + const res = (await $http.get('history/job/execution/queryLogWithOffsetLine', { + taskId: executionId, + offsetLine, + })) || []; + res.msg = dealMsg(res.msg); + if (offsetLine === 0) { + setWholeLog([res]); + } else { + setWholeLog([...wholeLog, res]); + } + } catch (error) { + } finally { + setLoading(false); + } + }; + + const onDownload = usePersistFn(async () => { + try { + const blob = await $http.get('history/job/execution/download', { taskId: executionId }, { + responseType: 'blob', + }); + download(blob); + } catch (error) { + } + }); + + useMount(async () => { + getData(0); + }); + useImperativeHandle(innerRef, () => ({ + onRefresh() { + getData(wholeLog[wholeLog.length - 1]?.offsetLine || 0); + }, + })); + return ( +
+
+ {intl.formatMessage({id: 'job_log_view_log'})} +
+ { + innerRef.current.onRefresh(); + }} + > + + {intl.formatMessage({id: 'job_log_refresh'})} + + + + {intl.formatMessage({id: 'job_log_download'})} + + +
+
+
+ { + wholeLog.map((item) => ( +
+ )) + } +
+
+
+ ) + +} +export default JobHistory; + + + + +