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.
 
 

266 rader
6.6 KiB

  1. "use server";
  2. import { serverFetchJson } from "@/app/utils/fetchUtil";
  3. import { BASE_API_URL } from "@/config/api";
  4. import { revalidatePath, revalidateTag } from "next/cache";
  5. import {
  6. ItemQcCategoryMappingInfo,
  7. QcItemInfo,
  8. DeleteResponse,
  9. QcCategoryResult,
  10. ItemsResult,
  11. QcItemResult,
  12. } from ".";
  13. export interface SaveQcCategoryInputs {
  14. id?: number;
  15. code: string;
  16. name: string;
  17. description?: string;
  18. }
  19. export interface SaveQcCategoryResponse {
  20. id?: number;
  21. code: string;
  22. name: string;
  23. description?: string;
  24. errors: Record<string, string> | null;
  25. }
  26. export interface SaveQcItemInputs {
  27. id?: number;
  28. code: string;
  29. name: string;
  30. description?: string;
  31. }
  32. export interface SaveQcItemResponse {
  33. id?: number;
  34. code: string;
  35. name: string;
  36. description?: string;
  37. errors: Record<string, string> | null;
  38. }
  39. // Item and QcCategory mapping
  40. export const getItemQcCategoryMappings = async (
  41. qcCategoryId?: number,
  42. itemId?: number
  43. ): Promise<ItemQcCategoryMappingInfo[]> => {
  44. const params = new URLSearchParams();
  45. if (qcCategoryId) params.append("qcCategoryId", qcCategoryId.toString());
  46. if (itemId) params.append("itemId", itemId.toString());
  47. return serverFetchJson<ItemQcCategoryMappingInfo[]>(
  48. `${BASE_API_URL}/qcItemAll/itemMappings?${params.toString()}`
  49. );
  50. };
  51. export const saveItemQcCategoryMapping = async (
  52. itemId: number,
  53. qcCategoryId: number,
  54. type: string
  55. ): Promise<ItemQcCategoryMappingInfo> => {
  56. const params = new URLSearchParams();
  57. params.append("itemId", itemId.toString());
  58. params.append("qcCategoryId", qcCategoryId.toString());
  59. params.append("type", type);
  60. const response = await serverFetchJson<ItemQcCategoryMappingInfo>(
  61. `${BASE_API_URL}/qcItemAll/itemMapping?${params.toString()}`,
  62. {
  63. method: "POST",
  64. }
  65. );
  66. revalidateTag("qcItemAll");
  67. return response;
  68. };
  69. export const deleteItemQcCategoryMapping = async (
  70. mappingId: number
  71. ): Promise<void> => {
  72. await serverFetchJson<void>(
  73. `${BASE_API_URL}/qcItemAll/itemMapping/${mappingId}`,
  74. {
  75. method: "DELETE",
  76. }
  77. );
  78. revalidateTag("qcItemAll");
  79. };
  80. // QcCategory and QcItem mapping
  81. export const getQcCategoryQcItemMappings = async (
  82. qcCategoryId: number
  83. ): Promise<QcItemInfo[]> => {
  84. return serverFetchJson<QcItemInfo[]>(
  85. `${BASE_API_URL}/qcItemAll/qcItemMappings/${qcCategoryId}`
  86. );
  87. };
  88. export const saveQcCategoryQcItemMapping = async (
  89. qcCategoryId: number,
  90. qcItemId: number,
  91. order: number,
  92. description?: string
  93. ): Promise<QcItemInfo> => {
  94. const params = new URLSearchParams();
  95. params.append("qcCategoryId", qcCategoryId.toString());
  96. params.append("qcItemId", qcItemId.toString());
  97. params.append("order", order.toString());
  98. if (description) params.append("description", description);
  99. const response = await serverFetchJson<QcItemInfo>(
  100. `${BASE_API_URL}/qcItemAll/qcItemMapping?${params.toString()}`,
  101. {
  102. method: "POST",
  103. }
  104. );
  105. revalidateTag("qcItemAll");
  106. return response;
  107. };
  108. export const deleteQcCategoryQcItemMapping = async (
  109. mappingId: number
  110. ): Promise<void> => {
  111. await serverFetchJson<void>(
  112. `${BASE_API_URL}/qcItemAll/qcItemMapping/${mappingId}`,
  113. {
  114. method: "DELETE",
  115. }
  116. );
  117. revalidateTag("qcItemAll");
  118. };
  119. // Counts
  120. export const getItemCountByQcCategory = async (
  121. qcCategoryId: number
  122. ): Promise<number> => {
  123. return serverFetchJson<number>(
  124. `${BASE_API_URL}/qcItemAll/itemCount/${qcCategoryId}`
  125. );
  126. };
  127. export const getQcItemCountByQcCategory = async (
  128. qcCategoryId: number
  129. ): Promise<number> => {
  130. return serverFetchJson<number>(
  131. `${BASE_API_URL}/qcItemAll/qcItemCount/${qcCategoryId}`
  132. );
  133. };
  134. // Validation
  135. export const canDeleteQcCategory = async (id: number): Promise<boolean> => {
  136. return serverFetchJson<boolean>(
  137. `${BASE_API_URL}/qcItemAll/canDeleteQcCategory/${id}`
  138. );
  139. };
  140. export const canDeleteQcItem = async (id: number): Promise<boolean> => {
  141. return serverFetchJson<boolean>(
  142. `${BASE_API_URL}/qcItemAll/canDeleteQcItem/${id}`
  143. );
  144. };
  145. // Save and delete with validation
  146. export const saveQcCategoryWithValidation = async (
  147. data: SaveQcCategoryInputs
  148. ): Promise<SaveQcCategoryResponse> => {
  149. const response = await serverFetchJson<SaveQcCategoryResponse>(
  150. `${BASE_API_URL}/qcItemAll/saveQcCategory`,
  151. {
  152. method: "POST",
  153. body: JSON.stringify(data),
  154. headers: { "Content-Type": "application/json" },
  155. }
  156. );
  157. revalidateTag("qcCategories");
  158. revalidateTag("qcItemAll");
  159. return response;
  160. };
  161. export const deleteQcCategoryWithValidation = async (
  162. id: number
  163. ): Promise<DeleteResponse> => {
  164. const response = await serverFetchJson<DeleteResponse>(
  165. `${BASE_API_URL}/qcItemAll/deleteQcCategory/${id}`,
  166. {
  167. method: "DELETE",
  168. }
  169. );
  170. revalidateTag("qcCategories");
  171. revalidateTag("qcItemAll");
  172. revalidatePath("/(main)/settings/qcItemAll");
  173. return response;
  174. };
  175. export const saveQcItemWithValidation = async (
  176. data: SaveQcItemInputs
  177. ): Promise<SaveQcItemResponse> => {
  178. const response = await serverFetchJson<SaveQcItemResponse>(
  179. `${BASE_API_URL}/qcItemAll/saveQcItem`,
  180. {
  181. method: "POST",
  182. body: JSON.stringify(data),
  183. headers: { "Content-Type": "application/json" },
  184. }
  185. );
  186. revalidateTag("qcItems");
  187. revalidateTag("qcItemAll");
  188. return response;
  189. };
  190. export const deleteQcItemWithValidation = async (
  191. id: number
  192. ): Promise<DeleteResponse> => {
  193. const response = await serverFetchJson<DeleteResponse>(
  194. `${BASE_API_URL}/qcItemAll/deleteQcItem/${id}`,
  195. {
  196. method: "DELETE",
  197. }
  198. );
  199. revalidateTag("qcItems");
  200. revalidateTag("qcItemAll");
  201. revalidatePath("/(main)/settings/qcItemAll");
  202. return response;
  203. };
  204. // Server actions for fetching data (to be used in client components)
  205. export const fetchQcCategoriesForAll = async (): Promise<QcCategoryResult[]> => {
  206. return serverFetchJson<QcCategoryResult[]>(`${BASE_API_URL}/qcCategories`, {
  207. next: { tags: ["qcCategories"] },
  208. });
  209. };
  210. export const fetchItemsForAll = async (): Promise<ItemsResult[]> => {
  211. return serverFetchJson<ItemsResult[]>(`${BASE_API_URL}/items`, {
  212. next: { tags: ["items"] },
  213. });
  214. };
  215. export const fetchQcItemsForAll = async (): Promise<QcItemResult[]> => {
  216. return serverFetchJson<QcItemResult[]>(`${BASE_API_URL}/qcItems`, {
  217. next: { tags: ["qcItems"] },
  218. });
  219. };
  220. // Get item by code (for Tab 0 - validate item code input)
  221. export const getItemByCode = async (code: string): Promise<ItemsResult | null> => {
  222. try {
  223. return await serverFetchJson<ItemsResult>(`${BASE_API_URL}/qcItemAll/itemByCode/${encodeURIComponent(code)}`);
  224. } catch (error) {
  225. // Item not found
  226. return null;
  227. }
  228. };