feat(label): add label page

This commit is contained in:
2026-03-10 18:20:50 +08:00
parent 1ae8509cce
commit 014c34ab76
65 changed files with 23477 additions and 0 deletions

View File

@@ -0,0 +1,198 @@
import httpFetch from "@/api/fetch"
import { Project, ProjectDetail, ReviewUsers } from "./typing"
import { BASE_LABEL_API } from "../const"
// 获取项目列表
export const getProjectList = (data: Project.ListRequest) => {
return httpFetch<Project.ListResponse>({
url: BASE_LABEL_API + "/api/v1/label_server/project/list",
method: "POST",
body: JSON.stringify(data),
})
}
// 获取项目详情
export const getProjectDetailById = (id: number) => {
return httpFetch<ProjectDetail.DataProps>({
url: BASE_LABEL_API + `/api/v1/label_server/project/detail/${id}`,
method: "GET",
})
}
// 校验项目源数据
export const checkLabelDataSource = (data: Project.CheckRequest) => {
return httpFetch<Project.CheckResponse>({
url: BASE_LABEL_API + "/api/v1/label_server/project/check_data",
method: "POST",
body: JSON.stringify(data),
})
}
// 创建项目
export const projectAdd = (data: Project.CreateProps) => {
return httpFetch({
url: BASE_LABEL_API + "/api/v1/label_server/project/add",
method: "POST",
body: JSON.stringify(data),
})
}
// 审核项目
export const projectReview = (data: Project.CreateProps) => {
return httpFetch({
url: BASE_LABEL_API + "/api/v1/label_server/project/review",
method: "POST",
body: JSON.stringify(data),
})
}
// 配置项目
export const projectConfig = (data: Project.ConfigProps) => {
return httpFetch({
url: BASE_LABEL_API + "/api/v1/label_server/project/config",
method: "POST",
body: JSON.stringify(data),
})
}
// 编辑项目
export const projectEditById = (data: any, id: number) => {
return httpFetch({
url: BASE_LABEL_API + `/api/v1/label_server/project/edit/${id}`,
method: "POST",
body: JSON.stringify(data),
})
}
// 审核试标项目
export const projectPreLabelReview = (data: Project.PreLabelProps) => {
return httpFetch({
url: BASE_LABEL_API + "/api/v1/label_server/project/prototype_review",
method: "POST",
body: JSON.stringify(data),
})
}
// 提交验收
export const projectDeliver = (data: { project_id: number }) => {
return httpFetch({
url: BASE_LABEL_API + "/api/v1/label_server/project/deliver",
method: "POST",
body: JSON.stringify(data),
})
}
// 完成项目
export const projectAccept = (data: { project_id: number; pass: boolean }) => {
return httpFetch({
url: BASE_LABEL_API + "/api/v1/label_server/project/accept",
method: "POST",
body: JSON.stringify(data),
})
}
// 收藏项目
export const projectCollect = (data: {
project_id: number
is_collect: boolean
}) => {
return httpFetch({
url: BASE_LABEL_API + "/api/v1/label_server/project/collect",
method: "POST",
body: JSON.stringify(data),
})
}
// 获取项目抽检比例
export const getReviewScaleList = (params: { project_id: number }) => {
return httpFetch<any[]>({
url: BASE_LABEL_API + "/api/v1/label_server/review_scale/list",
method: "GET",
data: params,
})
}
// 保存抽检比例
export const saveUserReviewScale = (data: Project.ReviewScaleProps) => {
return httpFetch({
url: BASE_LABEL_API + "/api/v1/label_server/review_scale/save",
method: "POST",
body: JSON.stringify(data),
})
}
export const getProjectDetail = (id: number) => {
return httpFetch<Project.DetailResponse>({
url: BASE_LABEL_API + `/api/v1/label_server/project/detail/${id}`,
method: "GET",
})
}
// 重新生成Embedding
export const regenerateProjectEmbedding = (data: { project_id: number }) => {
return httpFetch({
url: BASE_LABEL_API + `/api/v1/label_server/project/regenerate_embedding`,
method: "POST",
body: JSON.stringify(data),
})
}
// 获取个人参与项目
export const getPersonProjectDashBoard = () => {
return httpFetch<Array<Project.PersonProjectDashboardResponseItem>>({
url:
BASE_LABEL_API + `/api/v1/label_server/data_statistics/personal_project`,
method: "GET",
})
}
// 获取个人看板数据
export const getCurrentPersonData = (params: { date: string }) => {
return httpFetch<{
label_data_size: number
label_work_time: number
review1_data_size: number
review1_work_time: number
review2_data_size: number
review2_work_time: number
}>({
url:
BASE_LABEL_API +
"/api/v1/label_server/data_statistics/personal_dashboard",
method: "GET",
data: params,
})
}
/* ****************************** Options ****************************** */
// 获取项目所属业务列表
export const getProjectTypeList = () => {
return httpFetch<string[]>({
url: BASE_LABEL_API + "/api/v1/label_server/project/type_list",
method: "GET",
})
}
// 获取项目管理员列表
export const getProjectAdminList = () => {
return httpFetch<Array<{ label: string; value: number }>>({
url: BASE_LABEL_API + "/api/v1/label_server/project/admin_list",
method: "GET",
})
}
// 获取项目审核员
export const getProjectReviewers = () => {
return httpFetch<ReviewUsers>({
url: BASE_LABEL_API + "/api/v1/label_server/project/reviewer_map",
method: "GET",
})
}
// 获取用户有权限的项目
export const getSelfProjectList = () => {
return httpFetch<Array<{ label: string; value: number }>>({
url: BASE_LABEL_API + "/api/v1/label_server/project/self",
method: "GET",
})
}

View File

@@ -0,0 +1,474 @@
export namespace Project {
export interface DataProps {
key: React.Key
id: number // 项目ID
name: string // 项目名称
is_collect: boolean // 是否收藏
project_type?: string // 所属业务
label_schema_name?: string // 标注方案
label_schema_version?: string
status: number // 项目状态
labeled_scale?: number // 标注完成比例
reviewed_scale?: number // 审核完成比例
data_size?: number // 总数据量
rate_speed?: number // 额定倍速
create_user: string // 创建人
owner: string // 项目负责人
label_process?: string[] // 工序
admin_user: number[] // 标注管理员id
data_source?: string // 数据源
remarks?: string // 备注
// reviewer_user?: string; // 审核人
// reviewer_comment?: string; // 审核意见
create_at?: string // 创建时间
update_at?: string // 更新时间
modify?: number //0=可以发起变更,无变更 1=正在变更,无变更 2=可以发起变更,有变更 3=正在变更,有变更
}
export interface CheckRequest {
project_type: string
nfs_path: string
flag: number
}
export interface CheckResponse {
data_size: number
error_code: number
}
export interface CreateProps {
admin_user: string[]
create_user: string
data_size: number
data_source: string
label_schema_name: string
label_schema_version: string
project_name: string
project_type: string
related_task?: number[]
remarks?: string
[property: string]: any
}
export interface ReviewProps {
pass: boolean
project_id: number
project_name: string
review_comment?: string
review_user: string
test_proportion?: number
}
export interface ListRequest {
admin_user?: string
create_user?: string
end_date?: string
page_number: number
page_size: number
project_id?: number
project_name?: string
project_type?: string
review_user?: string
start_date?: string
status?: number[]
[property: string]: any
}
export interface ListResponse {
project_list: DataProps[]
total_pages: number
total_items: number
}
export interface LabelConfig {
acquire_mode: number
acquire_size: number
avg_remind_threshold: number
dynamic_label_speed: number
filter_pre_label: boolean
fix_remind_threshold: number
label_accuracy_rate: number
label_update_month: number
max_size: number
pre_label_confirm: boolean
static_label_speed: number
}
export interface Review1Config {
acquire_mode: number
acquire_size: number
dynamic_review1_speed: number
end_date?: string
filter_label_first_sub: boolean
filter_objs: boolean
filter_rework: boolean
filter_task_batch: boolean
filter_track_user: boolean
is_rework?: boolean
label_first_sub_end_date?: string
label_first_sub_start_date?: string
max_objs?: number
max_size: number
min_objs?: number
review1_accuracy_rate: number
review1_update_month: number
start_date?: string
static_review1_speed: number
track_user_list?: number[]
}
export interface Review2Config {
acquire_mode: number
acquire_size: number
dynamic_review2_speed: number
end_date?: string
filter_objs: boolean
filter_review1_first_sub: boolean
filter_review1_user: boolean
filter_rework: boolean
filter_task_batch: boolean
filter_track_user: boolean
is_rework?: boolean
max_objs?: number
max_size: number
min_objs?: number
review1_first_sub_end_date?: string
review1_first_sub_start_date?: string
review1_user_list?: number[]
review2_update_month: number
start_date?: string
static_review2_speed: number
track_user_list?: number[]
}
export interface ConfigProps {
admin_user?: number[]
check_frame?: boolean
check_task?: boolean
comment_rule?: { [key: string]: any }
default_pose?: string
is_lock_object?: boolean
label_config?: LabelConfig
label_users?: number[]
modifiable_types?: string[]
project_id: number
project_name?: string
project_remark?: string
review1_config?: Review1Config
review1_users?: number[]
review2_config?: Review2Config
review2_users?: number[]
user_grade?: { [key: string]: any }
}
// 试标审核
export interface PreLabelProps {
id: number
review_user: string
action: number // 1-试标完成2-试标通过3-试标不通过
detail?: string
}
export interface ReviewScaleProps {
frame_scale?: number
grade?: string
project_id: number
task_scale?: number
uids: number[]
}
/**
* DetailResponse
*/
export interface DetailResponse {
admin_user: string[]
alarm_threshold: AlarmThreshold
check_frame: boolean
check_task: boolean
comment_rule: CommentRule
create_at: string
create_user: string
data_size: number
default_pose: null
id: number
is_lock_object: boolean
label_process: LabelProcess
label_schema_list: LabelSchemaList[]
label_type: number
labeled_multiplier: LabeledMultiplier
modifiable_types: string[]
name: string
project_progress: ProjectProgress
remarks: string
rpath: string
status: number
task_size: number
user_grade: UserGrade
}
export interface AlarmThreshold {
avg_remind_threshold: number
fix_remind_threshold: number
}
export interface CommentRule {
check_box_rules: {
create_date: string
create_user: string
text: string
}[]
text_rules: string[]
}
export interface LabelProcess {
filter_pre_label: boolean
filter_task_info: string[]
pre_label_confirm: boolean
step_detail: StepDetail[]
}
export interface StepDetail {
acquire_mode: number
acquire_size: number
action: number
max_size: number
user_list: number[]
}
export interface LabelSchemaList {
bbox_range: number[]
bbox_size: number[]
bbox_type: number
category_id: number
color: [number, number, number]
label_class: string
label_type: number
radius: number
sensor_list: string[]
sub_attributes: string[]
sub_attributes_describe: SubAttributesDescribe[]
super_category: string
}
export interface SubAttributesDescribe {
chinese_name: string
english_name: string
isrequired: number
optional_item: string[]
round_id: number
select_mode: number
}
export interface LabeledMultiplier {
dynamic_label_speed: null
dynamic_review1_speed: null
dynamic_review2_speed: null
label_accuracy_rate: null
label_update_month: null
review1_accuracy_rate: null
review1_update_month: null
review2_update_month: null
static_label_speed: null
static_review1_speed: null
static_review2_speed: null
}
export interface ProjectProgress {
normal_labeled_task_size: number
normal_reviewed1_task_size: number
normal_reviewed2_task_size: number
rework_labeled_task_size: number
rework_reviewed1_task_size: number
rework_reviewed2_task_size: number
unlabeled_task_size: number
}
export interface UserGrade {
A: {
frame: number
task: number
}
B: {
frame: number
task: number
}
C: {
frame: number
task: number
}
}
/**
* DetailResponse
*/
export interface PersonProjectDashboardResponseItem {
project_id: number
project_label_type: string
project_name: string
project_type: string
work_time: number
}
}
export interface ReviewUsers {
reviewer1: string[]
reviewer2: string[]
reviewer3: string[]
}
export namespace ProjectDetail {
export interface DataProps {
admin_user: number[]
alarm_threshold: AlarmThreshold
check_frame: boolean
check_task: boolean
comment_rule: CommentRule
create_at: string
create_user: string
data_size: number
default_pose: null
id: number
is_lock_object: boolean
label_process: LabelProcess
label_schema_list: LabelSchemaList[]
label_type: number
labeled_multiplier: LabeledMultiplier
modifiable_types: string[]
name: string
project_progress: ProjectProgress
remarks: string
rpath: string
status: number
task_size: number
user_grade: UserGrade
[property: string]: any
}
export interface AlarmThreshold {
avg_remind_threshold: number
fix_remind_threshold: number
[property: string]: any
}
export interface CommentRule {
check_box_rules: string[]
text_rules: string[]
[property: string]: any
}
export interface LabelProcess {
filter_pre_label: boolean
filter_task_info: FilterTaskInfo[]
pre_label_confirm: boolean
step_detail: StepDetail[]
[property: string]: any
}
export interface FilterTaskInfo {
action: number
end_date: string
filter_label_first_sub: boolean
filter_objs: boolean
filter_review1_first_sub: boolean
filter_review1_user: boolean
filter_rework: boolean
filter_task_batch: boolean
filter_track_user: boolean
is_rework: boolean
label_first_sub_end_date: string
label_first_sub_start_date: string
max_objs: number
min_objs: number
review1_first_sub_end_date: string
review1_first_sub_start_date: string
review1_user_list: number[]
start_date: string
track_user_list: number[]
[property: string]: any
}
export interface StepDetail {
acquire_mode: number
acquire_size: number
action: number
max_size: number
user_list: number[]
[property: string]: any
}
export interface LabelSchemaList {
bbox_range: number[]
bbox_size: number[]
bbox_type: number
category_id: number
color: number[]
label_class: string
label_type: number
radius: number
sensor_list: string[]
sub_attributes: string[]
sub_attributes_describe: SubAttributesDescribe[]
super_category: string
[property: string]: any
}
export interface SubAttributesDescribe {
chinese_name: string
english_name: string
isrequired: number
optional_item: string[]
round_id: number
select_mode: number
[property: string]: any
}
export interface LabeledMultiplier {
dynamic_label_speed: number
dynamic_review1_speed: number
dynamic_review2_speed: number
label_accuracy_rate: number
label_update_month: number
review1_accuracy_rate: number
review1_update_month: number
review2_update_month: number
static_label_speed: number
static_review1_speed: number
static_review2_speed: number
[property: string]: any
}
export interface ProjectProgress {
normal_labeled_task_size: number
normal_reviewed1_task_size: number
normal_reviewed2_task_size: number
rework_labeled_task_size: number
rework_reviewed1_task_size: number
rework_reviewed2_task_size: number
unlabeled_task_size: number
[property: string]: any
}
export interface UserGrade {
A: A
B: B
C: C
[property: string]: any
}
export interface A {
frame: number
task: number
[property: string]: any
}
export interface B {
frame: number
task: number
[property: string]: any
}
export interface C {
frame: number
task: number
[property: string]: any
}
}