Files
labelmain-demo/components/label/useDescToolsStore.ts
2026-02-03 18:05:47 +08:00

223 lines
6.0 KiB
TypeScript

import { Project } from "./api/project/typing"
import { create } from "zustand"
import { splitWord } from "./components/EditorContainer"
interface SubAttribute {
value?: string | { [x: string]: any }
is_correct?: boolean
comment?: string
}
interface QaDataProps {
value: string
id: number // 轮次
is_pre: boolean // 是否是预设问题
tag: number // 标识该问题是否被审核过 0-未审核 1-正确 2-错误
uid: number // 创建人
create_timestamp: number // 创建时间
modify_uid: number // 修改人
modify_timestamp: number // 修改时间
comment: string // 批注内容
flag: number // 标识被批注过的问题,标注员是否已修改
}
interface DescToolsStore {
updateDescDataFlag: boolean
descOperations: Project.LabelSchemaList[]
setDescOperations: (val: Project.LabelSchemaList[]) => void
metaOperation: Project.LabelSchemaList | null
setMetaOperation: (val: Project.LabelSchemaList | null) => void
descData: Map<string, Map<string, SubAttribute>>
getFormDataByImageId: (id: string) => { [x: string]: any }
getDataByClassName: (id: string, name: string) => SubAttribute | null
setDescData: (data: Map<string, Map<string, SubAttribute>>) => void
metaData: Map<string, string[]>
setMetaData: (data: Map<string, string[]>) => void
qaOperations: Project.LabelSchemaList[]
setQaOperations: (val: Project.LabelSchemaList[]) => void
qaData: Map<string, { [x: string]: Array<{ [x: string]: QaDataProps }> }>
setQaData: (
data: Map<string, { [x: string]: Array<{ [x: string]: QaDataProps }> }>
) => void
getQuestionList: (imageId: string) => string[]
countTurnsAndQaNumber: (
imageId: string,
label: string
) => {
turns: number
question_size: number
}
countAllTurnsAndQaNumber: (imageId: string) => {
turns: number
question_size: number
new_single_turns: number
new_multiple_turns: number
}
resetData: () => void
updateFlag: (val: boolean) => void
}
export const useDescToolsStore = create<DescToolsStore>((set) => ({
updateDescDataFlag: false,
descOperations: [],
descData: new Map(),
metaOperation: null,
metaData: new Map(),
qaOperations: [],
qaData: new Map(),
setDescOperations: (val) =>
set((state) => ({
...state,
descOperations: val,
})),
getFormDataByImageId: (id) => {
let obj: any = {}
const data: Map<string, SubAttribute> | undefined = useDescToolsStore
.getState()
.descData.get(id)
if (!data) return {}
data.entries().forEach(([label_class, subattr]) => {
if (typeof subattr.value === "string") {
obj[label_class] = {
...subattr,
value: subattr.value.split(splitWord)[0],
}
} else if (typeof subattr.value === "object") {
obj[label_class] = { ...subattr.value }
} else {
obj[label_class] = {}
}
})
return obj
},
getDataByClassName: (id, label_class) => {
let attr = null
const data: any = useDescToolsStore.getState().descData.get(id)
if (data && data.has(label_class)) {
attr = data.get(label_class)
}
return attr
},
setDescData: (data) =>
set((state) => ({
...state,
descData: data,
})),
setMetaOperation: (val) =>
set((state) => ({
...state,
metaOperation: val,
})),
setMetaData: (data) =>
set((state) => ({
...state,
metaData: data,
})),
setQaOperations: (val) =>
set((state) => ({
...state,
qaOperations: val,
})),
setQaData: (data) =>
set((state) => ({
...state,
qaData: data,
})),
getQuestionList: (imageId) => {
let names: string[] = []
const data = useDescToolsStore.getState().qaData.get(imageId) ?? {}
Object.values(data).forEach((value) => {
value.forEach((v) => {
const key = Object.keys(v)[0]
names.push(key)
})
})
return names
},
countTurnsAndQaNumber: (imageId, label) => {
let obj = {
turns: 0,
question_size: 0,
}
const data =
useDescToolsStore.getState().qaData.get(imageId) ??
useDescToolsStore.getState().qaData.get("init") ??
{}
const labelArr = data[label]
if (labelArr && labelArr.length) {
obj.question_size = labelArr.length
obj.turns = [
...new Set(
labelArr.map((l) => {
const v = Object.values(l)[0]
return v.id
})
),
].length
}
return obj
},
countAllTurnsAndQaNumber: (imageId) => {
let obj = {
turns: 0,
question_size: 0,
new_single_turns: 0,
new_multiple_turns: 0,
}
const data =
useDescToolsStore.getState().qaData.get(imageId) ??
useDescToolsStore.getState().qaData.get("init") ??
{}
Object.values(data).forEach((value) => {
obj.question_size += value.length
obj.turns += [
...new Set(
value.map((d) => {
const v = Object.values(d)[0]
return v.id
})
),
].length
let singleRoundCount = 0
let multiRoundCount = 0
const roundMap = new Map<
number,
{ hasNewQuestion: boolean; count: number }
>()
value.forEach((d) => {
const v = Object.values(d)[0]
if (!roundMap.has(v.id)) {
roundMap.set(v.id, { hasNewQuestion: !v.is_pre, count: 1 })
} else {
const exist = roundMap.get(v.id)
if (!exist?.hasNewQuestion && !v.is_pre) exist!.hasNewQuestion = true
exist!.count++
}
})
roundMap.values().forEach((round) => {
if (round.hasNewQuestion) {
if (round.count > 1) {
multiRoundCount++
} else {
singleRoundCount++
}
}
})
obj.new_single_turns += singleRoundCount
obj.new_multiple_turns += multiRoundCount
})
return obj
},
resetData: () =>
set((state) => ({
...state,
descData: new Map(),
metaData: new Map(),
})),
updateFlag: (data) =>
set((state) => ({
...state,
updateDescDataFlag: data,
})),
}))