FPSMS-frontend
No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.
 
 

349 líneas
9.1 KiB

  1. "use server";
  2. import { cache } from 'react';
  3. import { Pageable, serverFetchJson, serverFetchWithNoContent } from "@/app/utils/fetchUtil";
  4. import { JoStatus, Machine, Operator } from ".";
  5. import { BASE_API_URL } from "@/config/api";
  6. import { revalidateTag } from "next/cache";
  7. import { convertObjToURLSearchParams } from "@/app/utils/commonUtil";
  8. export interface SaveJo {
  9. bomId: number;
  10. planStart: string;
  11. planEnd: string;
  12. reqQty: number;
  13. type: string;
  14. }
  15. export interface SaveJoResponse {
  16. id: number;
  17. }
  18. export interface SearchJoResultRequest extends Pageable {
  19. code: string;
  20. name: string;
  21. }
  22. export interface SearchJoResultResponse {
  23. records: SearchJoResult[];
  24. total: number;
  25. }
  26. export interface SearchJoResult {
  27. id: number;
  28. code: string;
  29. itemCode: string;
  30. name: string;
  31. reqQty: number;
  32. uom: string;
  33. status: JoStatus;
  34. }
  35. // For Jo Button Actions
  36. export interface CommonActionJoRequest {
  37. id: number;
  38. }
  39. export interface CommonActionJoResponse {
  40. id: number;
  41. entity: { status: JoStatus }
  42. }
  43. // For Jo Process
  44. export interface IsOperatorExistResponse<T> {
  45. id: number | null;
  46. name: string;
  47. code: string;
  48. type?: string;
  49. message: string | null;
  50. errorPosition: string | keyof T;
  51. entity: T;
  52. }
  53. export interface isCorrectMachineUsedResponse<T> {
  54. id: number | null;
  55. name: string;
  56. code: string;
  57. type?: string;
  58. message: string | null;
  59. errorPosition: string | keyof T;
  60. entity: T;
  61. }
  62. export interface JobOrderDetail {
  63. id: number;
  64. code: string;
  65. name: string;
  66. reqQty: number;
  67. uom: string;
  68. pickLines: any[];
  69. status: string;
  70. }
  71. export interface UnassignedJobOrderPickOrder {
  72. pickOrderId: number;
  73. pickOrderCode: string;
  74. pickOrderConsoCode: string;
  75. pickOrderTargetDate: string;
  76. pickOrderStatus: string;
  77. jobOrderId: number;
  78. jobOrderCode: string;
  79. jobOrderName: string;
  80. reqQty: number;
  81. uom: string;
  82. planStart: string;
  83. planEnd: string;
  84. }
  85. export interface AssignJobOrderResponse {
  86. id: number | null;
  87. code: string | null;
  88. name: string | null;
  89. type: string | null;
  90. message: string | null;
  91. errorPosition: string | null;
  92. }
  93. export interface PrintPickRecordRequest{
  94. pickOrderId: number;
  95. printerId: number;
  96. printQty: number;
  97. }
  98. export interface PrintPickRecordResponse{
  99. success: boolean;
  100. message?: string
  101. }
  102. export const recordSecondScanIssue = cache(async (
  103. pickOrderId: number,
  104. itemId: number,
  105. data: {
  106. qty: number;
  107. isMissing: boolean;
  108. isBad: boolean;
  109. reason: string;
  110. createdBy: number;
  111. }
  112. ) => {
  113. return serverFetchJson<any>(
  114. `${BASE_API_URL}/jo/second-scan-issue/${pickOrderId}/${itemId}`,
  115. {
  116. method: "POST",
  117. headers: { "Content-Type": "application/json" },
  118. body: JSON.stringify(data),
  119. next: { tags: ["jo-second-scan"] },
  120. },
  121. );
  122. });
  123. export const updateSecondQrScanStatus = cache(async (pickOrderId: number, itemId: number) => {
  124. return serverFetchJson<any>(
  125. `${BASE_API_URL}/jo/second-scan-qr/${pickOrderId}/${itemId}`,
  126. {
  127. method: "POST",
  128. next: { tags: ["jo-second-scan"] },
  129. },
  130. );
  131. });
  132. export const submitSecondScanQuantity = cache(async (
  133. pickOrderId: number,
  134. itemId: number,
  135. data: { qty: number; isMissing?: boolean; isBad?: boolean; reason?: string }
  136. ) => {
  137. return serverFetchJson<any>(
  138. `${BASE_API_URL}/jo/second-scan-submit/${pickOrderId}/${itemId}`,
  139. {
  140. method: "POST",
  141. headers: { "Content-Type": "application/json" },
  142. body: JSON.stringify(data),
  143. next: { tags: ["jo-second-scan"] },
  144. },
  145. );
  146. });
  147. // 获取未分配的 Job Order pick orders
  148. export const fetchUnassignedJobOrderPickOrders = cache(async () => {
  149. return serverFetchJson<UnassignedJobOrderPickOrder[]>(
  150. `${BASE_API_URL}/jo/unassigned-job-order-pick-orders`,
  151. {
  152. method: "GET",
  153. next: { tags: ["jo-unassigned"] },
  154. },
  155. );
  156. });
  157. // 分配 Job Order pick order 给用户
  158. export const assignJobOrderPickOrder = async (pickOrderId: number, userId: number) => {
  159. return serverFetchJson<AssignJobOrderResponse>(
  160. `${BASE_API_URL}/jo/assign-job-order-pick-order/${pickOrderId}/${userId}`,
  161. {
  162. method: "POST",
  163. headers: { "Content-Type": "application/json" },
  164. }
  165. );
  166. };
  167. // 获取 Job Order 分层数据
  168. export const fetchJobOrderLotsHierarchical = cache(async (userId: number) => {
  169. return serverFetchJson<any>(
  170. `${BASE_API_URL}/jo/all-lots-hierarchical/${userId}`,
  171. {
  172. method: "GET",
  173. next: { tags: ["jo-hierarchical"] },
  174. },
  175. );
  176. });
  177. export const fetchCompletedJobOrderPickOrders = cache(async (userId: number) => {
  178. return serverFetchJson<any>(
  179. `${BASE_API_URL}/jo/completed-job-order-pick-orders${userId}`,
  180. {
  181. method: "GET",
  182. next: { tags: ["jo-completed"] },
  183. },
  184. );
  185. });
  186. // 获取已完成的 Job Order pick orders
  187. export const fetchCompletedJobOrderPickOrdersrecords = cache(async (userId: number) => {
  188. return serverFetchJson<any>(
  189. `${BASE_API_URL}/jo/completed-job-order-pick-orders-only/${userId}`,
  190. {
  191. method: "GET",
  192. next: { tags: ["jo-completed"] },
  193. },
  194. );
  195. });
  196. // 获取已完成的 Job Order pick order records
  197. export const fetchCompletedJobOrderPickOrderRecords = cache(async (userId: number) => {
  198. return serverFetchJson<any[]>(
  199. `${BASE_API_URL}/jo/completed-job-order-pick-order-records/${userId}`,
  200. {
  201. method: "GET",
  202. next: { tags: ["jo-records"] },
  203. },
  204. );
  205. });
  206. export const fetchJobOrderDetailByCode = cache(async (code: string) => {
  207. return serverFetchJson<JobOrderDetail>(
  208. `${BASE_API_URL}/jo/detailByCode/${code}`,
  209. {
  210. method: "GET",
  211. next: { tags: ["jo"] },
  212. },
  213. );
  214. });
  215. export const isOperatorExist = async (username: string) => {
  216. const isExist = await serverFetchJson<IsOperatorExistResponse<Operator>>(
  217. `${BASE_API_URL}/jop/isOperatorExist`,
  218. {
  219. method: "POST",
  220. body: JSON.stringify({ username }),
  221. headers: { "Content-Type": "application/json" },
  222. },
  223. );
  224. revalidateTag("po");
  225. return isExist;
  226. };
  227. export const isCorrectMachineUsed = async (machineCode: string) => {
  228. const isExist = await serverFetchJson<isCorrectMachineUsedResponse<Machine>>(
  229. `${BASE_API_URL}/jop/isCorrectMachineUsed`,
  230. {
  231. method: "POST",
  232. body: JSON.stringify({ machineCode }),
  233. headers: { "Content-Type": "application/json" },
  234. },
  235. );
  236. revalidateTag("po");
  237. return isExist;
  238. };
  239. export const fetchJos = cache(async (data?: SearchJoResultRequest) => {
  240. const queryStr = convertObjToURLSearchParams(data)
  241. const response = serverFetchJson<SearchJoResultResponse>(
  242. `${BASE_API_URL}/jo/getRecordByPage?${queryStr}`,
  243. {
  244. method: "GET",
  245. headers: { "Content-Type": "application/json" },
  246. next: {
  247. tags: ["jos"]
  248. }
  249. }
  250. )
  251. return response
  252. })
  253. export const releaseJo = cache(async (data: CommonActionJoRequest) => {
  254. const response = serverFetchJson<CommonActionJoResponse>(`${BASE_API_URL}/jo/release`,
  255. {
  256. method: "POST",
  257. body: JSON.stringify(data),
  258. headers: { "Content-Type": "application/json" },
  259. })
  260. // Invalidate the cache after releasing
  261. revalidateTag("jo");
  262. return response;
  263. })
  264. export const startJo = cache(async (data: CommonActionJoRequest) => {
  265. const response = serverFetchJson<CommonActionJoResponse>(`${BASE_API_URL}/jo/start`,
  266. {
  267. method: "POST",
  268. body: JSON.stringify(data),
  269. headers: { "Content-Type": "application/json" },
  270. })
  271. // Invalidate the cache after starting
  272. revalidateTag("jo");
  273. return response;
  274. })
  275. export const manualCreateJo = cache(async (data: SaveJo) => {
  276. return serverFetchJson<SaveJoResponse>(`${BASE_API_URL}/jo/manualCreate`, {
  277. method: "POST",
  278. body: JSON.stringify(data),
  279. headers: { "Content-Type": "application/json" }
  280. })
  281. })
  282. export const fetchCompletedJobOrderPickOrdersWithCompletedSecondScan = cache(async (userId: number) => {
  283. return serverFetchJson<any[]>(`${BASE_API_URL}/jo/completed-job-order-pick-orders-with-completed-second-scan/${userId}`, {
  284. method: "GET",
  285. headers: { "Content-Type": "application/json" }
  286. })
  287. })
  288. export const fetchCompletedJobOrderPickOrderLotDetails = cache(async (pickOrderId: number) => {
  289. return serverFetchJson<any[]>(`${BASE_API_URL}/jo/completed-job-order-pick-order-lot-details/${pickOrderId}`, {
  290. method: "GET",
  291. headers: { "Content-Type": "application/json" }
  292. })
  293. })
  294. export const fetchCompletedJobOrderPickOrderLotDetailsForCompletedPick = cache(async (pickOrderId: number) => {
  295. return serverFetchJson<any[]>(`${BASE_API_URL}/jo/completed-job-order-pick-order-lot-details-completed-pick/${pickOrderId}`, {
  296. method: "GET",
  297. headers: { "Content-Type": "application/json" }
  298. })
  299. })
  300. export async function PrintPickRecord(request: PrintPickRecordRequest){
  301. const params = new URLSearchParams();
  302. params.append('pickOrderId', request.pickOrderId.toString())
  303. params.append('printerId', request.printerId.toString())
  304. if (request.printQty !== null && request.printQty !== undefined) {
  305. params.append('printQty', request.printQty.toString());
  306. }
  307. const response = await serverFetchWithNoContent(`${BASE_API_URL}/jo/print-PickRecord?${params.toString()}`,{
  308. method: "GET"
  309. });
  310. return { success: true, message: "Print job sent successfully (Pick Record)" } as PrintPickRecordResponse;
  311. }