diff --git a/src/views/workflow/timer/index.vue b/src/views/workflow/timer/index.vue
index 3845668c..3900897f 100644
--- a/src/views/workflow/timer/index.vue
+++ b/src/views/workflow/timer/index.vue
@@ -124,7 +124,11 @@
{{ TRIGGER_TYPE_NAMES[scope.row.triggerType || ''] || scope.row.triggerType || '-' }}
-
+
+
+ {{ formatTriggerInterval(scope.row.triggerType, scope.row.triggerInterval) }}
+
+
@@ -177,7 +181,7 @@
{{ detail.eventTypeName || '-' }}
{{ detail.eventName || '-' }}
{{ TRIGGER_TYPE_NAMES[detail.triggerType || ''] || '-' }}
- {{ detail.triggerInterval || '-' }}
+ {{ formatTriggerInterval(detail.triggerType, detail.triggerInterval) }}
{{ detail.timezone || '-' }}
{{ detail.nextTriggerAt || '-' }}
{{ detail.statusName || detail.status }}
@@ -249,6 +253,50 @@ const TRIGGER_TYPE_NAMES: Record = {
POINT_IN_TIME: '每日时点'
};
+/** ISO-8601 时长转中文:PT30S → "30 秒",PT1H30M → "1 小时 30 分钟",解析失败返回原文 */
+function formatIsoDuration(value: string): string {
+ const m = /^P(?:(\d+)D)?(?:T(?:(\d+)H)?(?:(\d+)M)?(?:(\d+(?:\.\d+)?)S)?)?$/.exec(value.trim());
+ if (!m) return value;
+ const parts: string[] = [];
+ if (m[1]) parts.push(`${m[1]} 天`);
+ if (m[2]) parts.push(`${m[2]} 小时`);
+ if (m[3]) parts.push(`${m[3]} 分钟`);
+ if (m[4]) parts.push(`${m[4]} 秒`);
+ return parts.length ? parts.join(' ') : value;
+}
+
+/** 间隔/时点列展示:按触发策略把原始值转成可读描述,解析失败按原文展示 */
+function formatTriggerInterval(triggerType: string | undefined, triggerInterval: string | undefined): string {
+ const raw = (triggerInterval || '').trim();
+ if (!raw) return '-';
+ try {
+ if (triggerType === 'POINT_IN_TIME') {
+ const arr = JSON.parse(raw);
+ const times = Array.isArray(arr) ? arr : [raw];
+ return times.length ? `每日 ${times.map((t: string) => String(t)).join('、')}` : raw;
+ }
+ if (triggerType === 'AFTER') {
+ let value = raw;
+ try {
+ // 兼容 JSON 数组存储;纯时长字符串(非合法 JSON)按原文处理
+ const parsed = JSON.parse(raw);
+ if (Array.isArray(parsed) && parsed.length) value = String(parsed[0]);
+ } catch {
+ // 纯时长字符串
+ }
+ const dur = formatIsoDuration(value);
+ return dur === value ? raw : `${dur}后`;
+ }
+ if (triggerType === 'FIXED') {
+ const dur = formatIsoDuration(raw);
+ return dur === raw ? raw : `每 ${dur}`;
+ }
+ } catch {
+ // 非法 JSON 或未知格式,按原文展示
+ }
+ return raw;
+}
+
const { showSearch } = useSearchToggle();
const { loading, withLoading } = useLoading(true);
const queryFormRef = ref();