fix(audit): 修复审计日志时区差并支持供应商单号搜索与展示

- 解决审计日志 8 小时时区差:后端输出带时区 UTC ISO 字符串,前端 formatTime 增加 UTC 自动解析换算
- 审计日志支持单号检索:list_audit_logs 关联 DouyuTask 匹配供应商单号、外部单号、UID、昵称等
- 列表摘要与详情抽屉优化:摘要直观展示供应商单号与外部单号,抽屉增加专用供应商订单列表并支持一键复制
- 增加测试用例覆盖时间格式与单号反向检索
This commit is contained in:
yml2213
2026-09-12 14:52:26 +08:00
parent 4518b726ac
commit 1ac6a13a2c
4 changed files with 441 additions and 78 deletions
+16 -4
View File
@@ -7,12 +7,22 @@ dayjs.extend(timezone);
/**
* 将后端返回的 ISO 时间字符串格式化为本地可读格式。
* 后端统一输出带时区的 ISO 字符串(如 2026-06-22T15:51:26+00:00),
* 此函数自动转为本地时区并格式化为 "YYYY-MM-DD HH:mm:ss"。
* 兼容带时区(如 2026-06-22T15:51:26+00:00 / 2026-06-22T15:51:26Z)与
* 不带时区后缀的 UTC 时间字符串(如 2026-06-22T15:51:26 / 2026-06-22 15:51:26),
* 自动转为本地时区并格式化为 "YYYY-MM-DD HH:mm:ss"。
*/
function normalizeUtcDateStr(val: string): string {
let raw = val.trim();
if (/^\d{4}-\d{2}-\d{2}[T ]\d{2}:\d{2}:\d{2}(?:\.\d+)?$/.test(raw)) {
raw = raw.replace(' ', 'T') + 'Z';
}
return raw;
}
export function formatTime(val: string | null | undefined): string {
if (!val) return '-';
return dayjs(val).format('YYYY-MM-DD HH:mm:ss');
const d = dayjs(normalizeUtcDateStr(val));
return d.isValid() ? d.format('YYYY-MM-DD HH:mm:ss') : val;
}
/**
@@ -20,5 +30,7 @@ export function formatTime(val: string | null | undefined): string {
*/
export function formatTimeShort(val: string | null | undefined): string {
if (!val) return '-';
return dayjs(val).format('MM-DD HH:mm');
const d = dayjs(normalizeUtcDateStr(val));
return d.isValid() ? d.format('MM-DD HH:mm') : val;
}