From 5c81a990a62bbfce3fe5a90cd238e7d2b93d2d0d Mon Sep 17 00:00:00 2001 From: zhangheng Date: Sat, 23 May 2026 17:42:20 +0800 Subject: [PATCH] feat(workload): change header --- .gitignore | 10 +- app/person/workload/LabelWorkloadTable.tsx | 6 +- app/person/workload/WorkloadMetricsTable.tsx | 116 ++++++++++++++----- components/label/api/workload/typing.ts | 3 + package.json | 2 +- 5 files changed, 102 insertions(+), 35 deletions(-) diff --git a/.gitignore b/.gitignore index 010a409..738fd71 100644 --- a/.gitignore +++ b/.gitignore @@ -47,4 +47,12 @@ redislocal/logs redislocal/conf -pnpm-lock.yaml \ No newline at end of file +pnpm-lock.yaml +graphify-out +.graphify_detect.json +.graphify_extract.json +.graphify_ast.json +.graphify_semantic.json +.graphify_analysis.json +.graphify_labels.json +.graphify_chunk_*.json diff --git a/app/person/workload/LabelWorkloadTable.tsx b/app/person/workload/LabelWorkloadTable.tsx index 186e51e..23f5738 100644 --- a/app/person/workload/LabelWorkloadTable.tsx +++ b/app/person/workload/LabelWorkloadTable.tsx @@ -15,12 +15,12 @@ export default function LabelWorkloadTable() { { key: "object_size", title: "新增对象数" }, { key: "confirmed_prelabel_size", title: "确认预标注对象数" }, { key: "prelabel_object_size", title: "预标注对象数" }, - { key: "commit_label_1", title: "提交标注任务数" }, - { key: "commit_reviewed_1", title: "被审核任务数" }, { key: "reviewed_size", title: "被审核对象数" }, { key: "commented_size", title: "被批注对象数" }, - { key: "rejected_label_1", title: "被驳回任务数" }, { key: "total_reviewed_size", title: "被审核过任务对象总数" }, + { key: "commit_label_1", title: "提交标注任务数" }, + { key: "commit_reviewed_1", title: "被审核任务数" }, + { key: "rejected_label_1", title: "标注任务被驳回数" }, { key: "dynamic_size", title: "新增动态对象数" }, { key: "static_size", title: "新增静态对象数" }, { key: "key_frame_size", title: "新增关键帧数" }, diff --git a/app/person/workload/WorkloadMetricsTable.tsx b/app/person/workload/WorkloadMetricsTable.tsx index c691f2a..1fa32e3 100644 --- a/app/person/workload/WorkloadMetricsTable.tsx +++ b/app/person/workload/WorkloadMetricsTable.tsx @@ -53,6 +53,19 @@ function createInitialFilters() { } } +function createDimensionColumn( + accessor: string, + title: string, + width: number +): DataTableColumn { + return { + accessor, + title, + width, + sortable: true, + } +} + export default function WorkloadMetricsTable(props: { title: string sheetName: string @@ -144,6 +157,72 @@ export default function WorkloadMetricsTable(props: { return records }, [appliedFilters, data]) + const getTime = (time: number) => { + return dayjs.duration(time, "seconds").format("HH:mm:ss") + } + + const baseColumns = useMemo(() => { + const allCols: Record[]> = { + all: [ + createDimensionColumn("uid", "用户ID", 100), + createDimensionColumn("user_name", "用户名", 140), + createDimensionColumn("group_name", "用户组", 160), + createDimensionColumn("project_id", "项目ID", 120), + createDimensionColumn("project_name", "项目名称", 180), + createDimensionColumn("project_type", "项目类型", 320), + createDimensionColumn("project_label_type", "标注类别", 140), + ], + order_by_group_name: [createDimensionColumn("group_name", "用户组", 180)], + order_by_project_name: [ + createDimensionColumn("project_name", "项目名称", 220), + ], + order_by_project_type: [ + createDimensionColumn("project_type", "项目类型", 320), + ], + order_by_user_name: [createDimensionColumn("user_name", "用户名", 180)], + } + return allCols[appliedFilters.dimension] + }, [appliedFilters.dimension]) + + const defaultSortStatus = useMemo(() => { + const dimensionDefaultAccessorMap: Record = { + all: "work_time", + order_by_group_name: "group_name", + order_by_project_name: "project_name", + order_by_project_type: "project_type", + order_by_user_name: "user_name", + } + + const preferredAccessor = + dimensionDefaultAccessorMap[appliedFilters.dimension] ?? + metrics[0]?.key ?? + String(baseColumns[0]?.accessor ?? "index") + const isMetricColumn = metrics.some( + (metric) => metric.key === preferredAccessor + ) + + return { + columnAccessor: preferredAccessor, + direction: isMetricColumn ? "desc" : "asc", + } + }, [appliedFilters.dimension, baseColumns, metrics]) + + const availableSortAccessors = useMemo( + () => + new Set([ + ...baseColumns.map((column) => String(column.accessor)), + ...metrics.map((metric) => metric.key), + ]), + [baseColumns, metrics] + ) + + useEffect(() => { + if (availableSortAccessors.has(String(sortStatus.columnAccessor))) { + return + } + setSortStatus(defaultSortStatus) + }, [availableSortAccessors, defaultSortStatus, sortStatus.columnAccessor]) + const sortedRecords = useMemo(() => { const list = [...filteredRecords] const accessor = sortStatus.columnAccessor @@ -156,39 +235,16 @@ export default function WorkloadMetricsTable(props: { if (Number.isFinite(an) && Number.isFinite(bn)) { return (an - bn) * dir } - return String(av ?? "").localeCompare(String(bv ?? "")) * dir + return ( + String(av ?? "").localeCompare(String(bv ?? ""), "zh-CN", { + numeric: true, + sensitivity: "base", + }) * dir + ) }) 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: [ - { accessor: "project_name", title: "项目名称", width: 180 }, - { accessor: "project_type", title: "项目类型", width: 280 }, - { accessor: "user_name", title: "用户名", width: 120 }, - { accessor: "group_name", title: "用户组", width: 160 }, - ], - order_by_group_name: [ - { accessor: "group_name", title: "用户组", width: 180 }, - ], - order_by_project_name: [ - { accessor: "project_name", title: "项目名称", width: 220 }, - ], - order_by_project_type: [ - { accessor: "project_type", title: "项目类型", width: 320 }, - ], - order_by_user_name: [ - { accessor: "user_name", title: "用户名", width: 180 }, - ], - } - return allCols[appliedFilters.dimension] - }, [appliedFilters.dimension]) - const columns = useMemo(() => { const totalsByKey = Object.fromEntries( metrics.map((metric) => { @@ -268,7 +324,7 @@ export default function WorkloadMetricsTable(props: { const rowKey = useMemo(() => { if (appliedFilters.dimension === "all") { return (record: any) => - `${record.project_id ?? "p"}_${record.uid ?? "u"}_${record.project_name ?? ""}_${record.user_name ?? ""}` + `${record.project_id ?? "p"}_${record.uid ?? "u"}_${record.project_label_type ?? ""}_${record.project_name ?? ""}_${record.user_name ?? ""}` } if (appliedFilters.dimension === "order_by_group_name") return "group_name" if (appliedFilters.dimension === "order_by_project_name") diff --git a/components/label/api/workload/typing.ts b/components/label/api/workload/typing.ts index b5e0767..80ca73f 100644 --- a/components/label/api/workload/typing.ts +++ b/components/label/api/workload/typing.ts @@ -18,6 +18,7 @@ export namespace WorkLoad { project_id: number project_name: string project_type: string + project_label_type: string question_size: number rejected_label_1: number reviewed_question_size: number @@ -48,6 +49,7 @@ export namespace WorkLoad { object_size: number prelabel_object_size: number project_id: number + project_label_type: string project_name: string project_type: string reject_review_1: number @@ -82,6 +84,7 @@ export namespace WorkLoad { object_size: number prelabel_object_size: number project_id: number + project_label_type: string project_name: string project_type: string reject_review_2: number diff --git a/package.json b/package.json index e3d15da..d27b2a1 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,7 @@ "env-cmd": "^11.0.0", "geojson": "^0.5.0", "html-react-parser": "^5.2.11", - "idb-keyval": "^6.2.2", + "idb-keyval": "6.2.2", "ioredis": "^5.8.0", "js-base64": "^3.7.8", "libav.js": "^6.8.8",