diff --git a/app/person/report/page.tsx b/app/person/report/page.tsx index 74ee103..46a5d2b 100644 --- a/app/person/report/page.tsx +++ b/app/person/report/page.tsx @@ -43,6 +43,7 @@ import { VirtualTreeSelect } from "@/components/tree-select/tree" import { DateInput } from "@mantine/dates" import dayjs from "dayjs" import "dayjs/locale/zh-cn" +import duration from "dayjs/plugin/duration" import { DataTableColumn, DataTableSortStatus } from "mantine-datatable" import { useCallback, useEffect, useMemo, useState } from "react" import DailyReportModal from "./components/DailyReportModal" @@ -57,6 +58,7 @@ import { workTypeOpts, } from "./config" import classes from "./page.module.css" +dayjs.extend(duration) function weekDayText(day: number) { const list = ["周日", "周一", "周二", "周三", "周四", "周五", "周六"] @@ -276,6 +278,10 @@ export default function PersonReportPage() { return accumulator + (Number.isFinite(value) ? value : 0) }, 0) + const getTime = (time: number) => { + return dayjs.duration(time, "seconds").format("HH:mm:ss") + } + const columns = useMemo(() => { const cols: DataTableColumn[] = [ { @@ -366,7 +372,8 @@ export default function PersonReportPage() { title: "工时", width: 90, sortable: true, - footer: sum(records.map((r) => r.work_time ?? 0)).toLocaleString(), + render: (record) => (record.work_time ? getTime(record.work_time) : 0), + footer: getTime(sum(records.map((r) => r.work_time ?? 0))), }, { accessor: "rate", title: "额定倍率", width: 90 }, { diff --git a/app/person/workload/WorkloadMetricsTable.tsx b/app/person/workload/WorkloadMetricsTable.tsx index 80548ee..c691f2a 100644 --- a/app/person/workload/WorkloadMetricsTable.tsx +++ b/app/person/workload/WorkloadMetricsTable.tsx @@ -23,10 +23,12 @@ import { } from "@tabler/icons-react" import dayjs from "dayjs" import "dayjs/locale/zh-cn" +import duration from "dayjs/plugin/duration" import { DataTableColumn, DataTableSortStatus } from "mantine-datatable" import { useEffect, useMemo, useState } from "react" import * as XLSX from "xlsx-js-style" import { DimensionType, GroupedData, MetricColumn } from "./config" +dayjs.extend(duration) function emptyGroupedData(): GroupedData { return { @@ -159,6 +161,10 @@ export default function WorkloadMetricsTable(props: { return list }, [filteredRecords, sortStatus.columnAccessor, sortStatus.direction]) + const getTime = (time: number) => { + return dayjs.duration(time, "seconds").format("HH:mm:ss") + } + const baseColumns = useMemo(() => { const allCols: Record[]> = { all: [ @@ -190,18 +196,33 @@ export default function WorkloadMetricsTable(props: { const value = Number(item?.[metric.key] ?? 0) return acc + (Number.isFinite(value) ? value : 0) }, 0) - return [metric.key, sum] + if (["work_time"].includes(metric.key)) { + return [metric.key, getTime(sum ?? 0)] + } else { + return [metric.key, sum] + } }) ) as Record const metricCols = metrics.map((metric) => { - return { - accessor: metric.key, - title: metric.title, - width: 140, - sortable: true, - footer: totalsByKey[metric.key] ?? 0, - } as DataTableColumn + if (["work_time"].includes(metric.key)) { + return { + accessor: metric.key, + title: metric.title, + width: 140, + sortable: true, + footer: totalsByKey[metric.key] ?? 0, + render: (record) => getTime(record[metric.key] ?? 0), + } as DataTableColumn + } else { + return { + accessor: metric.key, + title: metric.title, + width: 140, + sortable: true, + footer: totalsByKey[metric.key] ?? 0, + } as DataTableColumn + } }) return [ {