"use server"; import { cache } from 'react'; import { Pageable, serverFetchJson } from "@/app/utils/fetchUtil"; import { JoStatus, Machine, Operator } from "."; import { BASE_API_URL } from "@/config/api"; import { revalidateTag } from "next/cache"; import { convertObjToURLSearchParams } from "@/app/utils/commonUtil"; export interface SaveJo { bomId: number; planStart: string; planEnd: string; reqQty: number; type: string; } export interface SaveJoResponse { id: number; } export interface SearchJoResultRequest extends Pageable { code: string; name: string; } export interface SearchJoResultResponse { records: SearchJoResult[]; total: number; } export interface SearchJoResult { id: number; code: string; name: string; reqQty: number; uom: string; status: JoStatus; } // For Jo Button Actions export interface CommonActionJoRequest { id: number; } export interface CommonActionJoResponse { id: number; entity: { status: JoStatus } } // For Jo Process export interface IsOperatorExistResponse { id: number | null; name: string; code: string; type?: string; message: string | null; errorPosition: string | keyof T; entity: T; } export interface isCorrectMachineUsedResponse { id: number | null; name: string; code: string; type?: string; message: string | null; errorPosition: string | keyof T; entity: T; } export interface JobOrderDetail { id: number; code: string; name: string; reqQty: number; uom: string; pickLines: any[]; status: string; } export interface UnassignedJobOrderPickOrder { pickOrderId: number; pickOrderCode: string; pickOrderConsoCode: string; pickOrderTargetDate: string; pickOrderStatus: string; jobOrderId: number; jobOrderCode: string; jobOrderName: string; reqQty: number; uom: string; planStart: string; planEnd: string; } export interface AssignJobOrderResponse { id: number | null; code: string | null; name: string | null; type: string | null; message: string | null; errorPosition: string | null; } export const recordSecondScanIssue = cache(async ( pickOrderId: number, itemId: number, data: { qty: number; isMissing: boolean; isBad: boolean; reason: string; createdBy: number; } ) => { return serverFetchJson( `${BASE_API_URL}/jo/second-scan-issue/${pickOrderId}/${itemId}`, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(data), next: { tags: ["jo-second-scan"] }, }, ); }); export const updateSecondQrScanStatus = cache(async (pickOrderId: number, itemId: number) => { return serverFetchJson( `${BASE_API_URL}/jo/second-scan-qr/${pickOrderId}/${itemId}`, { method: "POST", next: { tags: ["jo-second-scan"] }, }, ); }); export const submitSecondScanQuantity = cache(async ( pickOrderId: number, itemId: number, data: { qty: number; isMissing?: boolean; isBad?: boolean; reason?: string } ) => { return serverFetchJson( `${BASE_API_URL}/jo/second-scan-submit/${pickOrderId}/${itemId}`, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(data), next: { tags: ["jo-second-scan"] }, }, ); }); // 获取未分配的 Job Order pick orders export const fetchUnassignedJobOrderPickOrders = cache(async () => { return serverFetchJson( `${BASE_API_URL}/jo/unassigned-job-order-pick-orders`, { method: "GET", next: { tags: ["jo-unassigned"] }, }, ); }); // 分配 Job Order pick order 给用户 export const assignJobOrderPickOrder = async (pickOrderId: number, userId: number) => { return serverFetchJson( `${BASE_API_URL}/jo/assign-job-order-pick-order/${pickOrderId}/${userId}`, { method: "POST", headers: { "Content-Type": "application/json" }, } ); }; // 获取 Job Order 分层数据 export const fetchJobOrderLotsHierarchical = cache(async (userId: number) => { return serverFetchJson( `${BASE_API_URL}/jo/all-lots-hierarchical/${userId}`, { method: "GET", next: { tags: ["jo-hierarchical"] }, }, ); }); export const fetchCompletedJobOrderPickOrders = cache(async (userId: number) => { return serverFetchJson( `${BASE_API_URL}/jo/completed-job-order-pick-orders${userId}`, { method: "GET", next: { tags: ["jo-completed"] }, }, ); }); // 获取已完成的 Job Order pick orders export const fetchCompletedJobOrderPickOrdersrecords = cache(async (userId: number) => { return serverFetchJson( `${BASE_API_URL}/jo/completed-job-order-pick-orders-only/${userId}`, { method: "GET", next: { tags: ["jo-completed"] }, }, ); }); // 获取已完成的 Job Order pick order records export const fetchCompletedJobOrderPickOrderRecords = cache(async (userId: number) => { return serverFetchJson( `${BASE_API_URL}/jo/completed-job-order-pick-order-records/${userId}`, { method: "GET", next: { tags: ["jo-records"] }, }, ); }); export const fetchJobOrderDetailByCode = cache(async (code: string) => { return serverFetchJson( `${BASE_API_URL}/jo/detailByCode/${code}`, { method: "GET", next: { tags: ["jo"] }, }, ); }); export const isOperatorExist = async (username: string) => { const isExist = await serverFetchJson>( `${BASE_API_URL}/jop/isOperatorExist`, { method: "POST", body: JSON.stringify({ username }), headers: { "Content-Type": "application/json" }, }, ); revalidateTag("po"); return isExist; }; export const isCorrectMachineUsed = async (machineCode: string) => { const isExist = await serverFetchJson>( `${BASE_API_URL}/jop/isCorrectMachineUsed`, { method: "POST", body: JSON.stringify({ machineCode }), headers: { "Content-Type": "application/json" }, }, ); revalidateTag("po"); return isExist; }; export const fetchJos = cache(async (data?: SearchJoResultRequest) => { const queryStr = convertObjToURLSearchParams(data) const response = serverFetchJson( `${BASE_API_URL}/jo/getRecordByPage?${queryStr}`, { method: "GET", headers: { "Content-Type": "application/json" }, next: { tags: ["jos"] } } ) return response }) export const releaseJo = cache(async (data: CommonActionJoRequest) => { const response = serverFetchJson(`${BASE_API_URL}/jo/release`, { method: "POST", body: JSON.stringify(data), headers: { "Content-Type": "application/json" }, }) // Invalidate the cache after releasing revalidateTag("jo"); return response; }) export const startJo = cache(async (data: CommonActionJoRequest) => { const response = serverFetchJson(`${BASE_API_URL}/jo/start`, { method: "POST", body: JSON.stringify(data), headers: { "Content-Type": "application/json" }, }) // Invalidate the cache after starting revalidateTag("jo"); return response; }) export const manualCreateJo = cache(async (data: SaveJo) => { return serverFetchJson(`${BASE_API_URL}/jo/manualCreate`, { method: "POST", body: JSON.stringify(data), headers: { "Content-Type": "application/json" } }) }) export const fetchCompletedJobOrderPickOrdersWithCompletedSecondScan = cache(async (userId: number) => { return serverFetchJson(`${BASE_API_URL}/jo/completed-job-order-pick-orders-with-completed-second-scan/${userId}`, { method: "GET", headers: { "Content-Type": "application/json" } }) }) export const fetchCompletedJobOrderPickOrderLotDetails = cache(async (pickOrderId: number) => { return serverFetchJson(`${BASE_API_URL}/jo/completed-job-order-pick-order-lot-details/${pickOrderId}`, { method: "GET", headers: { "Content-Type": "application/json" } }) }) export const fetchCompletedJobOrderPickOrderLotDetailsForCompletedPick = cache(async (pickOrderId: number) => { return serverFetchJson(`${BASE_API_URL}/jo/completed-job-order-pick-order-lot-details-completed-pick/${pickOrderId}`, { method: "GET", headers: { "Content-Type": "application/json" } }) })