import { serverFetchJson } from "@/app/utils/fetchUtil"; import { BASE_API_URL } from "@/config/api"; import { cache } from "react"; export interface BomCombo { id: number; value: number; label: string; outputQty: number; outputQtyUom: string; description: string; } export interface BomFormatFileGroup { fileName: string; problems: string[]; } /** Format-check 回傳:正確檔名列表 + 失敗列表 */ export interface BomFormatCheckResponse { correctFileNames: string[]; failList: BomFormatFileGroup[]; issueLogFileId: string; } export interface BomUploadResponse { batchId: string; fileNames: string[]; } export interface ImportBomItemPayload { fileName: string; isAlsoWip: boolean; isDrink: boolean; } export const preloadBomCombo = (() => { fetchBomCombo() }) export interface BomScoreResult { id: number; code: string; name: string; baseScore: number | string | { value?: number; [key: string]: any }; } export const fetchBomCombo = cache(async () => { return serverFetchJson(`${BASE_API_URL}/bom/combo`, { next: { tags: ["bomCombo"] }, }); }); export const fetchBomScores = cache(async () => { return serverFetchJson(`${BASE_API_URL}/bom/scores`, { next: { tags: ["boms"] }, }); }); export interface BomMaterialDto { itemCode?: string; itemName?: string; isConsumable?: boolean; baseQty?: number; baseUom?: string; stockQty?: number; stockUom?: string; salesQty?: number; salesUom?: string; } export interface BomProcessDto { seqNo?: number; processCode?: string; processName?: string; processDescription?: string; equipmentCode?: string; equipmentName?: string; durationInMinute?: number; prepTimeInMinute?: number; postProdTimeInMinute?: number; } export interface BomDetailResponse { id: number; itemCode?: string; itemName?: string; isDark?: number; isFloat?: number; isDense?: number; isDrink?: boolean; scrapRate?: number; allergicSubstances?: number; timeSequence?: number; complexity?: number; baseScore?: number; description?: string; outputQty?: number; outputQtyUom?: string; materials: BomMaterialDto[]; processes: BomProcessDto[]; } export interface EditBomRequest { // basic fields description?: string; outputQty?: number; outputQtyUom?: string; yield?: number; // baseScore inputs (server will recalculate) isDark?: number; isFloat?: number; isDense?: number; scrapRate?: number; allergicSubstances?: number; timeSequence?: number; complexity?: number; isDrink?: boolean; materials?: EditBomMaterialRequest[]; processes?: EditBomProcessRequest[]; } export interface EditBomMaterialRequest { id?: number; // At least one of itemId/itemCode should be present. itemId?: number; itemCode?: string; qty: number; isConsumable?: boolean; } export interface EditBomProcessRequest { id?: number; seqNo?: number; processId?: number; processCode?: string; equipmentId?: number; equipmentCode?: string; newEquipment?: { code: string; name: string; description?: string; equipmentTypeId?: number; }; description?: string; durationInMinute?: number; prepTimeInMinute?: number; postProdTimeInMinute?: number; }