FPSMS-frontend
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

400 lines
9.8 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. pickOrderLines: GetPickOrderLineInfo[];
  88. }
  89. export interface GetPickOrderLineInfo {
  90. id: number;
  91. itemId: number;
  92. itemCode: string;
  93. itemName: string;
  94. availableQty: number| null;
  95. requiredQty: number;
  96. uomCode: string;
  97. uomDesc: string;
  98. suggestedList: any[];
  99. }
  100. export interface CurrentInventoryItemInfo {
  101. id: number;
  102. code: string;
  103. name: string;
  104. uomDesc: string;
  105. availableQty: number;
  106. requiredQty: number;
  107. }
  108. export const fetchPickOrderDetails = cache(async (ids: string) => {
  109. return serverFetchJson<GetPickOrderInfoResponse>(
  110. `${BASE_API_URL}/pickOrder/detail/${ids}`,
  111. {
  112. method: "GET",
  113. next: { tags: ["pickorder"] },
  114. },
  115. );
  116. });
  117. export interface PickOrderLotDetailResponse {
  118. lotId: number;
  119. lotNo: string;
  120. expiryDate: string;
  121. location: string;
  122. stockUnit: string;
  123. availableQty: number;
  124. requiredQty: number;
  125. actualPickQty: number;
  126. suggestedPickLotId: number;
  127. lotStatus: string;
  128. lotAvailability: 'available' | 'insufficient_stock' | 'expired' | 'status_unavailable';
  129. }
  130. export interface GetPickOrderLineInfo {
  131. id: number;
  132. itemId: number;
  133. itemCode: string;
  134. itemName: string;
  135. availableQty: number;
  136. requiredQty: number;
  137. uomCode: string;
  138. uomDesc: string;
  139. suggestedList: any[];
  140. }
  141. export const fetchAllPickOrderDetails = cache(async () => {
  142. return serverFetchJson<GetPickOrderInfoResponse>(
  143. `${BASE_API_URL}/pickOrder/detail`,
  144. {
  145. method: "GET",
  146. next: { tags: ["pickorder"] },
  147. },
  148. );
  149. });
  150. export const fetchPickOrderLineLotDetails = cache(async (pickOrderLineId: number) => {
  151. return serverFetchJson<PickOrderLotDetailResponse[]>(
  152. `${BASE_API_URL}/pickOrder/lot-details/${pickOrderLineId}`,
  153. {
  154. method: "GET",
  155. next: { tags: ["pickorder"] },
  156. },
  157. );
  158. });
  159. export const createPickOrder = async (data: SavePickOrderRequest) => {
  160. console.log(data);
  161. const po = await serverFetchJson<PostPickOrderResponse>(
  162. `${BASE_API_URL}/pickOrder/create`,
  163. {
  164. method: "POST",
  165. body: JSON.stringify(data),
  166. headers: { "Content-Type": "application/json" },
  167. },
  168. );
  169. revalidateTag("pickorder");
  170. return po;
  171. }
  172. export const assignPickOrder = async (ids: number[]) => {
  173. const pickOrder = await serverFetchJson<any>(
  174. `${BASE_API_URL}/pickOrder/conso`,
  175. {
  176. method: "POST",
  177. body: JSON.stringify({ ids: ids }),
  178. headers: { "Content-Type": "application/json" },
  179. },
  180. );
  181. // revalidateTag("po");
  182. return pickOrder;
  183. };
  184. export const consolidatePickOrder_revert = async (ids: number[]) => {
  185. const pickOrder = await serverFetchJson<any>(
  186. `${BASE_API_URL}/pickOrder/deconso`,
  187. {
  188. method: "POST",
  189. body: JSON.stringify({ ids: ids }),
  190. headers: { "Content-Type": "application/json" },
  191. },
  192. );
  193. // revalidateTag("po");
  194. return pickOrder;
  195. };
  196. export const fetchPickOrderClient = cache(
  197. async (queryParams?: Record<string, any>) => {
  198. if (queryParams) {
  199. const queryString = new URLSearchParams(queryParams).toString();
  200. return serverFetchJson<RecordsRes<PickOrderResult[]>>(
  201. `${BASE_API_URL}/pickOrder/getRecordByPage?${queryString}`,
  202. {
  203. method: "GET",
  204. next: { tags: ["pickorder"] },
  205. },
  206. );
  207. } else {
  208. return serverFetchJson<RecordsRes<PickOrderResult[]>>(
  209. `${BASE_API_URL}/pickOrder/getRecordByPage`,
  210. {
  211. method: "GET",
  212. next: { tags: ["pickorder"] },
  213. },
  214. );
  215. }
  216. },
  217. );
  218. export const fetchPickOrderWithStockClient = cache(
  219. async (queryParams?: Record<string, any>) => {
  220. if (queryParams) {
  221. const queryString = new URLSearchParams(queryParams).toString();
  222. return serverFetchJson<RecordsRes<GetPickOrderInfo[]>>(
  223. `${BASE_API_URL}/pickOrder/getRecordByPageWithStock?${queryString}`,
  224. {
  225. method: "GET",
  226. next: { tags: ["pickorder"] },
  227. },
  228. );
  229. } else {
  230. return serverFetchJson<RecordsRes<GetPickOrderInfo[]>>(
  231. `${BASE_API_URL}/pickOrder/getRecordByPageWithStock`,
  232. {
  233. method: "GET",
  234. next: { tags: ["pickorder"] },
  235. },
  236. );
  237. }
  238. },
  239. );
  240. export const fetchConsoPickOrderClient = cache(
  241. async (queryParams?: Record<string, any>) => {
  242. if (queryParams) {
  243. const queryString = new URLSearchParams(queryParams).toString();
  244. return serverFetchJson<RecordsRes<ConsoPickOrderResult[]>>(
  245. `${BASE_API_URL}/pickOrder/getRecordByPage-conso?${queryString}`,
  246. {
  247. method: "GET",
  248. next: { tags: ["pickorder"] },
  249. },
  250. );
  251. } else {
  252. return serverFetchJson<RecordsRes<ConsoPickOrderResult[]>>(
  253. `${BASE_API_URL}/pickOrder/getRecordByPage-conso`,
  254. {
  255. method: "GET",
  256. next: { tags: ["pickorder"] },
  257. },
  258. );
  259. }
  260. },
  261. );
  262. export const fetchPickOrderLineClient = cache(
  263. async (queryParams?: Record<string, any>) => {
  264. if (queryParams) {
  265. const queryString = new URLSearchParams(queryParams).toString();
  266. return serverFetchJson<RecordsRes<PickOrderLineWithSuggestedLot[]>>(
  267. `${BASE_API_URL}/pickOrder/get-pickorder-line-byPage?${queryString}`,
  268. {
  269. method: "GET",
  270. next: { tags: ["pickorder"] },
  271. },
  272. );
  273. } else {
  274. return serverFetchJson<RecordsRes<PickOrderLineWithSuggestedLot[]>>(
  275. `${BASE_API_URL}/pickOrder/get-pickorder-line-byPage`,
  276. {
  277. method: "GET",
  278. next: { tags: ["pickorder"] },
  279. },
  280. );
  281. }
  282. },
  283. );
  284. export const fetchStockOutLineClient = cache(
  285. async (pickOrderLineId: number) => {
  286. return serverFetchJson<StockOutLine[]>(
  287. `${BASE_API_URL}/stockOutLine/getByPickOrderLineId/${pickOrderLineId}`,
  288. {
  289. method: "GET",
  290. next: { tags: ["pickorder"] },
  291. },
  292. );
  293. },
  294. );
  295. export const fetchConsoDetail = cache(async (consoCode: string) => {
  296. return serverFetchJson<PreReleasePickOrderSummary>(
  297. `${BASE_API_URL}/pickOrder/pre-release-info/${consoCode}`,
  298. {
  299. method: "GET",
  300. next: { tags: ["pickorder"] },
  301. },
  302. );
  303. });
  304. export const releasePickOrder = async (data: ReleasePickOrderInputs) => {
  305. console.log(data);
  306. console.log(JSON.stringify(data));
  307. const po = await serverFetchJson<{ consoCode: string }>(
  308. `${BASE_API_URL}/pickOrder/releaseConso`,
  309. {
  310. method: "POST",
  311. body: JSON.stringify(data),
  312. headers: { "Content-Type": "application/json" },
  313. },
  314. );
  315. revalidateTag("pickorder");
  316. return po;
  317. };
  318. export const createStockOutLine = async (data: CreateStockOutLine) => {
  319. console.log("triggering");
  320. const po = await serverFetchJson<PostStockOutLiineResponse<StockOutLine>>(
  321. `${BASE_API_URL}/stockOutLine/create`,
  322. {
  323. method: "POST",
  324. body: JSON.stringify(data),
  325. headers: { "Content-Type": "application/json" },
  326. },
  327. );
  328. revalidateTag("pickorder");
  329. return po;
  330. };
  331. export const updateStockOutLine = async (data: UpdateStockOutLine) => {
  332. console.log(data);
  333. const po = await serverFetchJson<PostStockOutLiineResponse<StockOutLine>>(
  334. `${BASE_API_URL}/stockOutLine/update`,
  335. {
  336. method: "POST",
  337. body: JSON.stringify(data),
  338. headers: { "Content-Type": "application/json" },
  339. },
  340. );
  341. revalidateTag("pickorder");
  342. return po;
  343. };
  344. export const completeConsoPickOrder = async (consoCode: string) => {
  345. const po = await serverFetchJson<PostStockOutLiineResponse<StockOutLine>>(
  346. `${BASE_API_URL}/pickOrder/consoPickOrder/complete/${consoCode}`,
  347. {
  348. method: "POST",
  349. headers: { "Content-Type": "application/json" },
  350. },
  351. );
  352. revalidateTag("pickorder");
  353. return po;
  354. };
  355. export const fetchConsoStatus = cache(async (consoCode: string) => {
  356. return serverFetchJson<{ status: string }>(
  357. `${BASE_API_URL}/stockOut/get-status/${consoCode}`,
  358. {
  359. method: "GET",
  360. next: { tags: ["pickorder"] },
  361. },
  362. );
  363. });