From 0690dcbbb25a9e13efe843538cc7143c52ed2c5a Mon Sep 17 00:00:00 2001 From: shay7sev Date: Wed, 4 Feb 2026 17:19:03 +0800 Subject: [PATCH] fix(/person/report): add /person/report --- app/component/base/select/page.tsx | 2 +- app/layout.tsx | 2 +- .../components/PersonalProjectTable.tsx | 180 +++-- .../components/PersonalTaskTable.tsx | 5 +- app/management/person/dashboard/page.tsx | 6 - .../report/components/DailyReportModal.tsx | 541 ++++++++++++++ app/management/person/report/config.ts | 69 ++ app/management/person/report/page.tsx | 706 ++++++++++++++++++ components/label/api/daily/index.ts | 63 ++ components/label/api/daily/typing.ts | 84 +++ components/label/api/project/index.ts | 2 +- components/label/api/project/typing.ts | 8 + 12 files changed, 1604 insertions(+), 64 deletions(-) create mode 100644 app/management/person/report/components/DailyReportModal.tsx create mode 100644 app/management/person/report/config.ts create mode 100644 app/management/person/report/page.tsx create mode 100644 components/label/api/daily/index.ts create mode 100644 components/label/api/daily/typing.ts diff --git a/app/component/base/select/page.tsx b/app/component/base/select/page.tsx index a369830..7141d16 100644 --- a/app/component/base/select/page.tsx +++ b/app/component/base/select/page.tsx @@ -14,7 +14,7 @@ import { } from "@mantine/core" import { useCallback, useEffect, useState } from "react" -export const convertTreeNodeToTreeNodeData = ( +const convertTreeNodeToTreeNodeData = ( list: TreeNode[], level: number = 1 ): TreeNodeData[] => diff --git a/app/layout.tsx b/app/layout.tsx index e77ae3b..d415e34 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -3,7 +3,7 @@ import "@mantine/core/styles.css" import "@mantine/core/styles.layer.css" import "@mantine/notifications/styles.css" -import "mantine-datatable/styles.layer.css" +import "mantine-datatable/styles.css" import Script from "next/script" import { InfoCheck } from "@/app/store/InfoCheck" diff --git a/app/management/person/dashboard/components/PersonalProjectTable.tsx b/app/management/person/dashboard/components/PersonalProjectTable.tsx index 2af6f19..132ad59 100644 --- a/app/management/person/dashboard/components/PersonalProjectTable.tsx +++ b/app/management/person/dashboard/components/PersonalProjectTable.tsx @@ -1,24 +1,18 @@ "use client" import { getPersonProjectDashBoard } from "@/components/label/api/project" -import { - Button, - Group, - Pagination, - ScrollArea, - Select, - Table, -} from "@mantine/core" +import { Project } from "@/components/label/api/project/typing" +import { Button, Group, Text, UnstyledButton } from "@mantine/core" import { IconRefresh } from "@tabler/icons-react" import dayjs from "dayjs" import duration from "dayjs/plugin/duration" +import { DataTable, DataTableColumn } from "mantine-datatable" +import { useRouter } from "next/navigation" import { useCallback, useEffect, useMemo, useState } from "react" dayjs.extend(duration) -const pageSizeOptions = [50, 100, 200] - function formatDurationSeconds(seconds?: number | null) { const value = seconds ?? 0 if (!value) return "-" @@ -31,11 +25,15 @@ function formatDurationSeconds(seconds?: number | null) { } export default function PersonalProjectTable() { - const [records, setRecords] = useState([]) + const router = useRouter() + const [records, setRecords] = useState< + Project.PersonProjectDashboardResponseItem[] + >([]) const [loading, setLoading] = useState(false) const [page, setPage] = useState(1) const [pageSize, setPageSize] = useState(50) + const [totalItems, setTotalItems] = useState(0) const totalPages = useMemo(() => { const totalItems = records.length @@ -52,6 +50,7 @@ export default function PersonalProjectTable() { try { const res = await getPersonProjectDashBoard() setRecords(res ?? []) + setTotalItems(res?.length ?? 0) setPage(1) } finally { setLoading(false) @@ -66,13 +65,96 @@ export default function PersonalProjectTable() { if (page > totalPages) setPage(totalPages) }, [page, totalPages]) + const [currentRowId, setCurrentRowId] = useState(0) + + const originColumn = useMemo(() => { + let column: DataTableColumn[] = + [ + { + accessor: "project_id", + title: "项目ID", + width: 150, + render: (record: Project.PersonProjectDashboardResponseItem) => { + return ( + { + setCurrentRowId(record.project_id) + router.push(`/project/info/detail?id=${record.project_id}`) + }} + title={record.project_id.toString()} + c={"brand"} + style={{ + fontSize: "14px", + maxWidth: "100%", + whiteSpace: "nowrap", + overflow: "hidden", + textOverflow: "ellipsis", + }}> + {record.project_id} + + ) + }, + }, + { + accessor: "project_name", + title: "项目名称", + width: 160, + render: (record: Project.PersonProjectDashboardResponseItem) => { + return record.project_name ?? "-" + }, + }, + { + accessor: "project_type", + title: "所属业务", + width: 160, + render: (record: Project.PersonProjectDashboardResponseItem) => { + return ( + + {record.project_type ?? "-"} + + ) + }, + }, + { + accessor: "work_time", + title: "任务耗时", + width: 140, + render: (record: Project.PersonProjectDashboardResponseItem) => { + return formatDurationSeconds(record.work_time) + }, + }, + { + accessor: "project_label_type", + title: "标注类别", + width: 160, + render: (record: Project.PersonProjectDashboardResponseItem) => { + return record.project_label_type ?? "-" + }, + }, + ] + return column + }, [router]) + return ( - + + + 参与项目 +