FPSMS-frontend
Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.
 
 

152 rader
3.2 KiB

  1. import { serverFetchJson } from "@/app/utils/fetchUtil";
  2. import { BASE_API_URL } from "@/config/api";
  3. import { cache } from "react";
  4. export interface BomCombo {
  5. id: number;
  6. value: number;
  7. label: string;
  8. outputQty: number;
  9. outputQtyUom: string;
  10. description: string;
  11. }
  12. export interface BomFormatFileGroup {
  13. fileName: string;
  14. problems: string[];
  15. }
  16. /** Format-check 回傳:正確檔名列表 + 失敗列表 */
  17. export interface BomFormatCheckResponse {
  18. correctFileNames: string[];
  19. failList: BomFormatFileGroup[];
  20. issueLogFileId: string;
  21. }
  22. export interface BomUploadResponse {
  23. batchId: string;
  24. fileNames: string[];
  25. }
  26. export interface ImportBomItemPayload {
  27. fileName: string;
  28. isAlsoWip: boolean;
  29. isDrink: boolean;
  30. }
  31. export const preloadBomCombo = (() => {
  32. fetchBomCombo()
  33. })
  34. export interface BomScoreResult {
  35. id: number;
  36. code: string;
  37. name: string;
  38. baseScore: number | string | { value?: number; [key: string]: any };
  39. }
  40. export const fetchBomCombo = cache(async () => {
  41. return serverFetchJson<BomCombo[]>(`${BASE_API_URL}/bom/combo`, {
  42. next: { tags: ["bomCombo"] },
  43. });
  44. });
  45. export const fetchBomScores = cache(async () => {
  46. return serverFetchJson<BomScoreResult[]>(`${BASE_API_URL}/bom/scores`, {
  47. next: { tags: ["boms"] },
  48. });
  49. });
  50. export interface BomMaterialDto {
  51. itemCode?: string;
  52. itemName?: string;
  53. isConsumable?: boolean;
  54. baseQty?: number;
  55. baseUom?: string;
  56. stockQty?: number;
  57. stockUom?: string;
  58. salesQty?: number;
  59. salesUom?: string;
  60. }
  61. export interface BomProcessDto {
  62. seqNo?: number;
  63. processCode?: string;
  64. processName?: string;
  65. processDescription?: string;
  66. equipmentCode?: string;
  67. equipmentName?: string;
  68. durationInMinute?: number;
  69. prepTimeInMinute?: number;
  70. postProdTimeInMinute?: number;
  71. }
  72. export interface BomDetailResponse {
  73. id: number;
  74. itemCode?: string;
  75. itemName?: string;
  76. isDark?: number;
  77. isFloat?: number;
  78. isDense?: number;
  79. isDrink?: boolean;
  80. scrapRate?: number;
  81. allergicSubstances?: number;
  82. timeSequence?: number;
  83. complexity?: number;
  84. baseScore?: number;
  85. description?: string;
  86. outputQty?: number;
  87. outputQtyUom?: string;
  88. materials: BomMaterialDto[];
  89. processes: BomProcessDto[];
  90. }
  91. export interface EditBomRequest {
  92. // basic fields
  93. description?: string;
  94. outputQty?: number;
  95. outputQtyUom?: string;
  96. yield?: number;
  97. // baseScore inputs (server will recalculate)
  98. isDark?: number;
  99. isFloat?: number;
  100. isDense?: number;
  101. scrapRate?: number;
  102. allergicSubstances?: number;
  103. timeSequence?: number;
  104. complexity?: number;
  105. isDrink?: boolean;
  106. materials?: EditBomMaterialRequest[];
  107. processes?: EditBomProcessRequest[];
  108. }
  109. export interface EditBomMaterialRequest {
  110. id?: number;
  111. // At least one of itemId/itemCode should be present.
  112. itemId?: number;
  113. itemCode?: string;
  114. qty: number;
  115. isConsumable?: boolean;
  116. }
  117. export interface EditBomProcessRequest {
  118. id?: number;
  119. seqNo?: number;
  120. processId?: number;
  121. processCode?: string;
  122. equipmentId?: number;
  123. equipmentCode?: string;
  124. newEquipment?: {
  125. code: string;
  126. name: string;
  127. description?: string;
  128. equipmentTypeId?: number;
  129. };
  130. description?: string;
  131. durationInMinute?: number;
  132. prepTimeInMinute?: number;
  133. postProdTimeInMinute?: number;
  134. }