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> getFormDataByImageId: (id: string) => { [x: string]: any } getDataByClassName: (id: string, name: string) => SubAttribute | null setDescData: (data: Map>) => void metaData: Map setMetaData: (data: Map) => void qaOperations: Project.LabelSchemaList[] setQaOperations: (val: Project.LabelSchemaList[]) => void qaData: Map }> setQaData: ( data: Map }> ) => 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((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 | 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, })), }))