"use server"; import { BASE_API_URL } from "@/config/api"; import { serverFetchJson } from "@/app/utils/fetchUtil"; import { cache } from "react"; import type { MessageResponse } from "@/app/api/shop/actions"; // Export types/interfaces (these are safe to import in client components) export interface StockIssueResult { id: number; itemId: number; itemCode: string; itemDescription: string; lotId: number; lotNo: string; storeLocation: string | null; requiredQty: number | null; actualPickQty: number | null; missQty: number; badItemQty: number; bookQty: number; issueQty: number; issueRemark: string | null; pickerName: string | null; handleStatus: string; handleDate: string | null; handledBy: number | null; } export interface ExpiryItemResult { id: number; itemId: number; itemCode: string; itemDescription: string | null; lotId: number; lotNo: string | null; storeLocation: string | null; expiryDate: string | null; remainingQty: number; } export interface StockIssueLists { missItems: StockIssueResult[]; badItems: StockIssueResult[]; expiryItems: ExpiryItemResult[]; } // Server actions (these work from both server and client components) export const PreloadList = () => { fetchList(); }; export const fetchMissItemList = cache(async (issueCategory: string = "lot_issue") => { return serverFetchJson( `${BASE_API_URL}/pickExecution/issues/missItem?issueCategory=${issueCategory}`, { next: { tags: ["Miss Item List"] }, }, ); }); export const fetchBadItemList = cache(async (issueCategory: string = "lot_issue") => { return serverFetchJson( `${BASE_API_URL}/pickExecution/issues/badItem?issueCategory=${issueCategory}`, { next: { tags: ["Bad Item List"] }, }, ); }); export const fetchExpiryItemList = cache(async () => { return serverFetchJson( `${BASE_API_URL}/pickExecution/issues/expiryItem`, { next: { tags: ["Expiry Item List"] }, }, ); }); export const fetchList = cache(async (issueCategory: string = "lot_issue"): Promise => { const [missItems, badItems, expiryItems] = await Promise.all([ fetchMissItemList(issueCategory), fetchBadItemList(issueCategory), fetchExpiryItemList(), ]); return { missItems, badItems, expiryItems, }; }); export async function submitMissItem(issueId: number, handler: number) { return serverFetchJson( `${BASE_API_URL}/pickExecution/submitMissItem`, { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify({ issueId, handler }), }, ); } export async function batchSubmitMissItem(issueIds: number[], handler: number) { return serverFetchJson( `${BASE_API_URL}/pickExecution/batchSubmitMissItem`, { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify({ issueIds, handler }), }, ); } export async function submitBadItem(issueId: number, handler: number) { return serverFetchJson( `${BASE_API_URL}/pickExecution/submitBadItem`, { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify({ issueId, handler }), }, ); } export async function batchSubmitBadItem(issueIds: number[], handler: number) { return serverFetchJson( `${BASE_API_URL}/pickExecution/batchSubmitBadItem`, { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify({ issueIds, handler }), }, ); } export async function submitExpiryItem(lotLineId: number, handler: number) { return serverFetchJson( `${BASE_API_URL}/pickExecution/submitExpiryItem`, { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify({ lotLineId, handler }), }, ); } export async function batchSubmitExpiryItem(lotLineIds: number[], handler: number) { return serverFetchJson( `${BASE_API_URL}/pickExecution/batchSubmitExpiryItem`, { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify({ lotLineIds, handler }), }, ); } export interface LotIssueDetailResponse { lotId: number | null; lotNo: string | null; itemId: number; itemCode: string | null; itemDescription: string | null; storeLocation: string | null; issues: IssueDetailItem[]; } export interface IssueDetailItem { issueId: number; pickerName: string | null; missQty: number | null; issueQty: number | null; pickOrderCode: string; doOrderCode: string | null; joOrderCode: string | null; issueRemark: string | null; } export async function getLotIssueDetails( lotId: number, itemId: number, issueType: "miss" | "bad" ) { return serverFetchJson( `${BASE_API_URL}/pickExecution/lotIssueDetails?lotId=${lotId}&itemId=${itemId}&issueType=${issueType}`, { method: "GET", headers: { "Content-Type": "application/json", }, } ); } export async function submitIssueWithQty( lotId: number, itemId: number, issueType: "miss" | "bad", submitQty: number, handler: number ){return serverFetchJson( `${BASE_API_URL}/pickExecution/submitIssueWithQty`, { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify({ lotId, itemId, issueType, submitQty, handler }), } ); }