FPSMS-frontend
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.
 
 
 

391 lignes
9.6 KiB

  1. "use server";
  2. import { BASE_API_URL } from "@/config/api";
  3. // import { ServerFetchError, serverFetchJson, serverFetchWithNoContent } from "@/app/utils/fetchUtil";
  4. import { revalidateTag } from "next/cache";
  5. import { cache } from "react";
  6. import { serverFetchJson } from "@/app/utils/fetchUtil";
  7. import { QcItemResult } from "../settings/qcItem";
  8. import { RecordsRes } from "../utils";
  9. import {
  10. ConsoPickOrderResult,
  11. PickOrderLineWithSuggestedLot,
  12. PickOrderResult,
  13. PreReleasePickOrderSummary,
  14. StockOutLine,
  15. } from ".";
  16. import { PurchaseQcResult } from "../po/actions";
  17. // import { BASE_API_URL } from "@/config/api";
  18. export interface SavePickOrderLineRequest {
  19. itemId: number
  20. qty: number
  21. uomId: number
  22. }
  23. export interface SavePickOrderRequest {
  24. type: string
  25. targetDate: string
  26. pickOrderLine: SavePickOrderLineRequest[]
  27. }
  28. export interface PostPickOrderResponse<T = null> {
  29. id: number | null;
  30. name: string;
  31. code: string;
  32. type?: string;
  33. message: string | null;
  34. errorPosition: string
  35. entity?: T | T[];
  36. }
  37. export interface PostStockOutLiineResponse<T> {
  38. id: number | null;
  39. name: string;
  40. code: string;
  41. type?: string;
  42. message: string | null;
  43. errorPosition: string | keyof T;
  44. entity: T | T[] | null;
  45. }
  46. export interface ReleasePickOrderInputs {
  47. consoCode: string;
  48. assignTo: number;
  49. }
  50. export interface CreateStockOutLine {
  51. consoCode: string;
  52. pickOrderLineId: number;
  53. inventoryLotLineId: number;
  54. qty: number;
  55. }
  56. export interface UpdateStockOutLine {
  57. id: number;
  58. // consoCode: String,
  59. itemId: number;
  60. qty: number;
  61. pickOrderLineId: number;
  62. inventoryLotLineId?: number;
  63. status: string;
  64. pickTime?: string;
  65. // pickerId: number?
  66. }
  67. export interface PickOrderQcInput {
  68. qty: number;
  69. status: string;
  70. qcResult: PurchaseQcResult[];
  71. }
  72. export interface PickOrderApprovalInput {
  73. allowQty: number;
  74. rejectQty: number;
  75. status: string;
  76. }
  77. export interface GetPickOrderInfoResponse {
  78. pickOrders: GetPickOrderInfo[];
  79. items: CurrentInventoryItemInfo[];
  80. }
  81. export interface GetPickOrderInfo {
  82. id: number;
  83. code: string;
  84. targetDate: string;
  85. type: string;
  86. status: string;
  87. assignTo: number;
  88. pickOrderLines: GetPickOrderLineInfo[];
  89. }
  90. export interface GetPickOrderLineInfo {
  91. id: number;
  92. itemId: number;
  93. itemCode: string;
  94. itemName: string;
  95. availableQty: number| null;
  96. requiredQty: number;
  97. uomCode: string;
  98. uomDesc: string;
  99. suggestedList: any[];
  100. }
  101. export interface CurrentInventoryItemInfo {
  102. id: number;
  103. code: string;
  104. name: string;
  105. uomDesc: string;
  106. availableQty: number;
  107. requiredQty: number;
  108. }
  109. export const fetchPickOrderDetails = cache(async (ids: string) => {
  110. return serverFetchJson<GetPickOrderInfoResponse>(
  111. `${BASE_API_URL}/pickOrder/detail/${ids}`,
  112. {
  113. method: "GET",
  114. next: { tags: ["pickorder"] },
  115. },
  116. );
  117. });
  118. export interface PickOrderLotDetailResponse {
  119. lotId: number;
  120. lotNo: string;
  121. expiryDate: string;
  122. location: string;
  123. stockUnit: string;
  124. availableQty: number;
  125. requiredQty: number;
  126. actualPickQty: number;
  127. suggestedPickLotId: number;
  128. lotStatus: string;
  129. lotAvailability: 'available' | 'insufficient_stock' | 'expired' | 'status_unavailable';
  130. }
  131. export const fetchAllPickOrderDetails = cache(async () => {
  132. return serverFetchJson<GetPickOrderInfoResponse>(
  133. `${BASE_API_URL}/pickOrder/detail`,
  134. {
  135. method: "GET",
  136. next: { tags: ["pickorder"] },
  137. },
  138. );
  139. });
  140. export const fetchPickOrderLineLotDetails = cache(async (pickOrderLineId: number) => {
  141. return serverFetchJson<PickOrderLotDetailResponse[]>(
  142. `${BASE_API_URL}/pickOrder/lot-details/${pickOrderLineId}`,
  143. {
  144. method: "GET",
  145. next: { tags: ["pickorder"] },
  146. },
  147. );
  148. });
  149. export const createPickOrder = async (data: SavePickOrderRequest) => {
  150. console.log(data);
  151. const po = await serverFetchJson<PostPickOrderResponse>(
  152. `${BASE_API_URL}/pickOrder/create`,
  153. {
  154. method: "POST",
  155. body: JSON.stringify(data),
  156. headers: { "Content-Type": "application/json" },
  157. },
  158. );
  159. revalidateTag("pickorder");
  160. return po;
  161. }
  162. export const assignPickOrder = async (ids: number[]) => {
  163. const pickOrder = await serverFetchJson<any>(
  164. `${BASE_API_URL}/pickOrder/conso`,
  165. {
  166. method: "POST",
  167. body: JSON.stringify({ ids: ids }),
  168. headers: { "Content-Type": "application/json" },
  169. },
  170. );
  171. // revalidateTag("po");
  172. return pickOrder;
  173. };
  174. export const consolidatePickOrder_revert = async (ids: number[]) => {
  175. const pickOrder = await serverFetchJson<any>(
  176. `${BASE_API_URL}/pickOrder/deconso`,
  177. {
  178. method: "POST",
  179. body: JSON.stringify({ ids: ids }),
  180. headers: { "Content-Type": "application/json" },
  181. },
  182. );
  183. // revalidateTag("po");
  184. return pickOrder;
  185. };
  186. export const fetchPickOrderClient = cache(
  187. async (queryParams?: Record<string, any>) => {
  188. if (queryParams) {
  189. const queryString = new URLSearchParams(queryParams).toString();
  190. return serverFetchJson<RecordsRes<PickOrderResult[]>>(
  191. `${BASE_API_URL}/pickOrder/getRecordByPage?${queryString}`,
  192. {
  193. method: "GET",
  194. next: { tags: ["pickorder"] },
  195. },
  196. );
  197. } else {
  198. return serverFetchJson<RecordsRes<PickOrderResult[]>>(
  199. `${BASE_API_URL}/pickOrder/getRecordByPage`,
  200. {
  201. method: "GET",
  202. next: { tags: ["pickorder"] },
  203. },
  204. );
  205. }
  206. },
  207. );
  208. export const fetchPickOrderWithStockClient = cache(
  209. async (queryParams?: Record<string, any>) => {
  210. if (queryParams) {
  211. const queryString = new URLSearchParams(queryParams).toString();
  212. return serverFetchJson<RecordsRes<GetPickOrderInfo[]>>(
  213. `${BASE_API_URL}/pickOrder/getRecordByPageWithStock?${queryString}`,
  214. {
  215. method: "GET",
  216. next: { tags: ["pickorder"] },
  217. },
  218. );
  219. } else {
  220. return serverFetchJson<RecordsRes<GetPickOrderInfo[]>>(
  221. `${BASE_API_URL}/pickOrder/getRecordByPageWithStock`,
  222. {
  223. method: "GET",
  224. next: { tags: ["pickorder"] },
  225. },
  226. );
  227. }
  228. },
  229. );
  230. export const fetchConsoPickOrderClient = cache(
  231. async (queryParams?: Record<string, any>) => {
  232. if (queryParams) {
  233. const queryString = new URLSearchParams(queryParams).toString();
  234. return serverFetchJson<RecordsRes<ConsoPickOrderResult[]>>(
  235. `${BASE_API_URL}/pickOrder/getRecordByPage-conso?${queryString}`,
  236. {
  237. method: "GET",
  238. next: { tags: ["pickorder"] },
  239. },
  240. );
  241. } else {
  242. return serverFetchJson<RecordsRes<ConsoPickOrderResult[]>>(
  243. `${BASE_API_URL}/pickOrder/getRecordByPage-conso`,
  244. {
  245. method: "GET",
  246. next: { tags: ["pickorder"] },
  247. },
  248. );
  249. }
  250. },
  251. );
  252. export const fetchPickOrderLineClient = cache(
  253. async (queryParams?: Record<string, any>) => {
  254. if (queryParams) {
  255. const queryString = new URLSearchParams(queryParams).toString();
  256. return serverFetchJson<RecordsRes<PickOrderLineWithSuggestedLot[]>>(
  257. `${BASE_API_URL}/pickOrder/get-pickorder-line-byPage?${queryString}`,
  258. {
  259. method: "GET",
  260. next: { tags: ["pickorder"] },
  261. },
  262. );
  263. } else {
  264. return serverFetchJson<RecordsRes<PickOrderLineWithSuggestedLot[]>>(
  265. `${BASE_API_URL}/pickOrder/get-pickorder-line-byPage`,
  266. {
  267. method: "GET",
  268. next: { tags: ["pickorder"] },
  269. },
  270. );
  271. }
  272. },
  273. );
  274. export const fetchStockOutLineClient = cache(
  275. async (pickOrderLineId: number) => {
  276. return serverFetchJson<StockOutLine[]>(
  277. `${BASE_API_URL}/stockOutLine/getByPickOrderLineId/${pickOrderLineId}`,
  278. {
  279. method: "GET",
  280. next: { tags: ["pickorder"] },
  281. },
  282. );
  283. },
  284. );
  285. export const fetchConsoDetail = cache(async (consoCode: string) => {
  286. return serverFetchJson<PreReleasePickOrderSummary>(
  287. `${BASE_API_URL}/pickOrder/pre-release-info/${consoCode}`,
  288. {
  289. method: "GET",
  290. next: { tags: ["pickorder"] },
  291. },
  292. );
  293. });
  294. export const releasePickOrder = async (data: ReleasePickOrderInputs) => {
  295. console.log(data);
  296. console.log(JSON.stringify(data));
  297. const po = await serverFetchJson<{ consoCode: string }>(
  298. `${BASE_API_URL}/pickOrder/releaseConso`,
  299. {
  300. method: "POST",
  301. body: JSON.stringify(data),
  302. headers: { "Content-Type": "application/json" },
  303. },
  304. );
  305. revalidateTag("pickorder");
  306. return po;
  307. };
  308. export const createStockOutLine = async (data: CreateStockOutLine) => {
  309. console.log("triggering");
  310. const po = await serverFetchJson<PostStockOutLiineResponse<StockOutLine>>(
  311. `${BASE_API_URL}/stockOutLine/create`,
  312. {
  313. method: "POST",
  314. body: JSON.stringify(data),
  315. headers: { "Content-Type": "application/json" },
  316. },
  317. );
  318. revalidateTag("pickorder");
  319. return po;
  320. };
  321. export const updateStockOutLine = async (data: UpdateStockOutLine) => {
  322. console.log(data);
  323. const po = await serverFetchJson<PostStockOutLiineResponse<StockOutLine>>(
  324. `${BASE_API_URL}/stockOutLine/update`,
  325. {
  326. method: "POST",
  327. body: JSON.stringify(data),
  328. headers: { "Content-Type": "application/json" },
  329. },
  330. );
  331. revalidateTag("pickorder");
  332. return po;
  333. };
  334. export const completeConsoPickOrder = async (consoCode: string) => {
  335. const po = await serverFetchJson<PostStockOutLiineResponse<StockOutLine>>(
  336. `${BASE_API_URL}/pickOrder/consoPickOrder/complete/${consoCode}`,
  337. {
  338. method: "POST",
  339. headers: { "Content-Type": "application/json" },
  340. },
  341. );
  342. revalidateTag("pickorder");
  343. return po;
  344. };
  345. export const fetchConsoStatus = cache(async (consoCode: string) => {
  346. return serverFetchJson<{ status: string }>(
  347. `${BASE_API_URL}/stockOut/get-status/${consoCode}`,
  348. {
  349. method: "GET",
  350. next: { tags: ["pickorder"] },
  351. },
  352. );
  353. });