From d7ea5d64be8b9ac2e73222a1ddbb65c6a079e257 Mon Sep 17 00:00:00 2001 From: kangwenjing <1138819403@qq.com> Date: Wed, 18 Mar 2026 10:44:33 +0800 Subject: [PATCH] =?UTF-8?q?=E6=97=A5=E5=BF=97=E5=A1=AB=E5=86=99=E4=B8=8B?= =?UTF-8?q?=E6=9D=A5=E9=80=89=E6=8B=A9=E9=A1=B9=E7=9B=AE=EF=BC=8C=E6=B2=A1?= =?UTF-8?q?=E6=9C=89=E8=BF=87=E6=BB=A4=E8=BF=87=E6=9C=9F=E9=A1=B9=E7=9B=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/worklog/WorkLogPage.tsx | 98 +++++++++++++++++++++++++++++-- 1 file changed, 94 insertions(+), 4 deletions(-) diff --git a/src/pages/worklog/WorkLogPage.tsx b/src/pages/worklog/WorkLogPage.tsx index 32199fb..bb42fab 100644 --- a/src/pages/worklog/WorkLogPage.tsx +++ b/src/pages/worklog/WorkLogPage.tsx @@ -62,10 +62,16 @@ interface ProjectRow { projectName?: string; startDate?: string; endDate?: string; + startTime?: string; + endTime?: string; beginDate?: string; finishDate?: string; planStartDate?: string; planEndDate?: string; + projectStartDate?: string; + projectEndDate?: string; + projectBeginDate?: string; + projectFinishDate?: string; workTime?: number; [key: string]: unknown; } @@ -138,7 +144,11 @@ const pickProjectBoundaryDate = (row: ProjectRow, keys: Array) if (!raw) { continue; } - const parsed = dayjs(String(raw)); + const normalizedRaw = + typeof raw === 'number' || (typeof raw === 'string' && /^\d{10,13}$/.test(raw.trim())) + ? Number(raw) + : String(raw); + const parsed = dayjs(normalizedRaw); if (parsed.isValid()) { return parsed; } @@ -169,6 +179,51 @@ const normalizeProjectRows = (value: unknown): ProjectRow[] => })) : []; +const PROJECT_BOUNDARY_KEYS: Array = [ + 'startDate', + 'startTime', + 'beginDate', + 'planStartDate', + 'projectStartDate', + 'projectBeginDate', + 'endDate', + 'endTime', + 'finishDate', + 'planEndDate', + 'projectEndDate', + 'projectFinishDate', +]; + +const hasProjectBoundaryInfo = (row: ProjectRow) => + PROJECT_BOUNDARY_KEYS.some((key) => { + const value = row[key]; + return value !== undefined && value !== null && String(value).trim() !== ''; + }); + +const mergeProjectRowsWithDetails = (rows: ProjectRow[], detailRows: ProjectRow[]) => { + if (rows.length === 0 || detailRows.length === 0) { + return rows; + } + + const detailMap = new Map( + detailRows.map((item) => [String(item.projectId ?? ''), item] as const), + ); + + return rows.map((row) => { + const detail = detailMap.get(String(row.projectId ?? '')); + if (!detail) { + return row; + } + + return { + ...detail, + ...row, + projectName: String(row.projectName ?? detail.projectName ?? detail.name ?? ''), + name: String(row.name ?? detail.name ?? detail.projectName ?? ''), + }; + }); +}; + const toNullableNumber = (value: unknown) => { if (value === undefined || value === null || value === '') { return undefined; @@ -436,7 +491,28 @@ const WorkLogPage = () => { } const payload = normalizeResponseData(response); const rows = isObject(payload) && Array.isArray(payload.rows) ? payload.rows : Array.isArray(payload) ? payload : []; - setProjectList(normalizeProjectRows(rows)); + const normalizedRows = normalizeProjectRows(rows); + + if (!normalizedRows.some(hasProjectBoundaryInfo)) { + try { + const detailResponse = await fetchFallbackProjectListRequest(); + if (requestId !== projectListRequestIdRef.current) { + return; + } + const detailPayload = normalizeResponseData(detailResponse); + const detailRows = isObject(detailPayload) && Array.isArray(detailPayload.rows) + ? detailPayload.rows + : Array.isArray(detailPayload) + ? detailPayload + : []; + setProjectList(mergeProjectRowsWithDetails(normalizedRows, normalizeProjectRows(detailRows))); + return; + } catch (detailError) { + console.warn('Failed to enrich user project list with project boundaries:', detailError); + } + } + + setProjectList(normalizedRows); return; } catch (error) { console.warn('Failed to fetch user project list, fallback to full project list:', error); @@ -623,8 +699,22 @@ const WorkLogPage = () => { const projectListFilter = useMemo(() => { return projectList.filter((item) => { - const start = pickProjectBoundaryDate(item, ['startDate', 'beginDate', 'planStartDate']); - const end = pickProjectBoundaryDate(item, ['endDate', 'finishDate', 'planEndDate']); + const start = pickProjectBoundaryDate(item, [ + 'startDate', + 'startTime', + 'beginDate', + 'planStartDate', + 'projectStartDate', + 'projectBeginDate', + ]); + const end = pickProjectBoundaryDate(item, [ + 'endDate', + 'endTime', + 'finishDate', + 'planEndDate', + 'projectEndDate', + 'projectFinishDate', + ]); if (!start && !end) { return true; }