From f6660b37b1d5514f18473d9f7a7ca11d12130ba9 Mon Sep 17 00:00:00 2001 From: "CANCERYS\\kw093" Date: Thu, 18 Sep 2025 11:28:35 +0800 Subject: [PATCH] update --- src/app/api/do/actions.tsx | 42 ++++- src/components/DoDetail/DoDetail.tsx | 167 ++++++++++++++++-- .../PickOrderSearch/PickExecution.tsx | 2 +- 3 files changed, 196 insertions(+), 15 deletions(-) diff --git a/src/app/api/do/actions.tsx b/src/app/api/do/actions.tsx index 09bed8e..b4655f9 100644 --- a/src/app/api/do/actions.tsx +++ b/src/app/api/do/actions.tsx @@ -48,20 +48,58 @@ export interface DoSearchAll { export interface ReleaseDoRequest { id: number; + userId: number; } export interface ReleaseDoResponse { id: number; entity: { status: string } } -export const releaseDo = cache(async (data: ReleaseDoRequest) => { - return await serverFetchJson(`${BASE_API_URL}/do/release`, + + +export interface AssignByStoreRequest { + storeId: string; // "2/F" or "4/F" + assignTo: number; +} + +export interface AssignByStoreResponse { + id: number; + code: string; + name: string; + type: string; + message: string; + errorPosition: string; + entity: any; +} +export const assignPickOrderByStore = cache(async (data: AssignByStoreRequest) => { + return await serverFetchJson(`${BASE_API_URL}/doPickOrder/assign-by-store`, { method: "POST", body: JSON.stringify(data), headers: { "Content-Type": "application/json" }, }) }) + +export const releaseAssignedPickOrderByStore = cache(async (data: AssignByStoreRequest) => { + return await serverFetchJson(`${BASE_API_URL}/doPickOrder/release-assigned-by-store`, + { + method: "POST", + body: JSON.stringify(data), + headers: { "Content-Type": "application/json" }, + }) +}) + +export async function releaseDo(input: ReleaseDoRequest) { + const response = await serverFetchJson(`${BASE_API_URL}/do/release`, { + method: 'POST', + body: JSON.stringify(input), + headers: { + 'Content-Type': 'application/json', + }, + }); + revalidateTag('do'); + return response; +} export const preloadDo = () => { fetchDoList(); }; diff --git a/src/components/DoDetail/DoDetail.tsx b/src/components/DoDetail/DoDetail.tsx index af855c5..a9569b8 100644 --- a/src/components/DoDetail/DoDetail.tsx +++ b/src/components/DoDetail/DoDetail.tsx @@ -6,12 +6,14 @@ import { useTranslation } from "react-i18next"; import useUploadContext from "../UploadProvider/useUploadContext"; import { FormProvider, SubmitErrorHandler, SubmitHandler, useForm } from "react-hook-form"; import { useCallback, useState } from "react"; -import { Button, Stack, Typography } from "@mui/material"; +import { Button, Stack, Typography, Box, Alert } from "@mui/material"; import ArrowBackIcon from '@mui/icons-material/ArrowBack'; import StartIcon from "@mui/icons-material/Start"; -import { releaseDo } from "@/app/api/do/actions"; +import { releaseDo, assignPickOrderByStore, releaseAssignedPickOrderByStore } from "@/app/api/do/actions"; import DoInfoCard from "./DoInfoCard"; import DoLineTable from "./DoLineTable"; +import { useSession } from "next-auth/react"; +import { SessionWithTokens } from "@/config/authConfig"; // ✅ Import the correct session type type Props = { id?: number; @@ -26,7 +28,12 @@ const DoDetail: React.FC = ({ const router = useRouter(); const { setIsUploading } = useUploadContext(); const [serverError, setServerError] = useState(""); - + const [successMessage, setSuccessMessage] = useState(""); + const [isAssigning, setIsAssigning] = useState(false); + const { data: session } = useSession() as { data: SessionWithTokens | null }; // ✅ Use correct session type + + const currentUserId = session?.id ? parseInt(session.id) : undefined; // ✅ Get user ID from session.id + const formProps = useForm({ defaultValues: defaultValues }) @@ -38,24 +45,100 @@ const DoDetail: React.FC = ({ const handleRelease = useCallback(async () => { try { setIsUploading(true) + setServerError("") + setSuccessMessage("") + if (id) { - console.log(id) - const response = await releaseDo({ id: id }) - console.log(response.entity.status) + // ✅ Get current user ID from session + const currentUserId = session?.id ? parseInt(session.id) : undefined; + + if (!currentUserId) { + setServerError("User session not found. Please login again."); + return; + } + + const response = await releaseDo({ + id: id, + userId: currentUserId // ✅ Pass user ID from session + }) + if (response) { formProps.setValue("status", response.entity.status) - console.log(formProps.watch("status")) + setSuccessMessage("DO released successfully! Pick orders created.") } } - } catch (e) { - // backend error setServerError(t("An error has occurred. Please try again later.")); console.log(e); } finally { setIsUploading(false) } - }, [id, formProps, t, setIsUploading]) + }, [id, formProps, t, setIsUploading, session]) // ✅ Add session to dependencies + + // ✅ UPDATE STORE-BASED ASSIGNMENT HANDLERS + const handleAssignByStore = useCallback(async (storeId: string) => { + try { + setIsAssigning(true) + setServerError("") + setSuccessMessage("") + + // ✅ Get current user ID from session + const currentUserId = session?.id ? parseInt(session.id) : undefined; + + if (!currentUserId) { + setServerError("User session not found. Please login again."); + return; + } + + const response = await assignPickOrderByStore({ + storeId: storeId, + assignTo: currentUserId + }) + + if (response) { + setSuccessMessage(`Pick orders assigned to ${storeId} successfully!`) + console.log("Assignment response:", response) + } + + } catch (e) { + setServerError(t("Failed to assign pick orders. Please try again later.")); + console.log(e); + } finally { + setIsAssigning(false) + } + }, [t, session]) // ✅ Add session to dependencies + + const handleReleaseByStore = useCallback(async (storeId: string) => { + try { + setIsAssigning(true) + setServerError("") + setSuccessMessage("") + + // ✅ Get current user ID from session + const currentUserId = session?.id ? parseInt(session.id) : undefined; + + if (!currentUserId) { + setServerError("User session not found. Please login again."); + return; + } + + const response = await releaseAssignedPickOrderByStore({ + storeId: storeId, + assignTo: currentUserId + }) + + if (response) { + setSuccessMessage(`Pick orders released for ${storeId} successfully!`) + console.log("Release response:", response) + } + + } catch (e) { + setServerError(t("Failed to release pick orders. Please try again later.")); + console.log(e); + } finally { + setIsAssigning(false) + } + }, [t, session]) // ✅ Add session to dependencies const onSubmit = useCallback>(async (data, event) => { console.log(data) @@ -73,10 +156,17 @@ const DoDetail: React.FC = ({ onSubmit={formProps.handleSubmit(onSubmit, onSubmitError)} > {serverError && ( - + {serverError} - + + )} + + {successMessage && ( + + {successMessage} + )} + { formProps.watch("status")?.toLowerCase() === "pending" && ( @@ -84,11 +174,64 @@ const DoDetail: React.FC = ({ variant="outlined" startIcon={} onClick={handleRelease} + disabled={isAssigning} > {t("Release")} )} + + {/* ✅ ADD STORE-BASED ASSIGNMENT BUTTONS */} + { + formProps.watch("status")?.toLowerCase() === "released" && ( + + + {t("Pick Order Assignment")} + + + + + + + + + + + + )} + diff --git a/src/components/PickOrderSearch/PickExecution.tsx b/src/components/PickOrderSearch/PickExecution.tsx index f002fd0..bdf99c8 100644 --- a/src/components/PickOrderSearch/PickExecution.tsx +++ b/src/components/PickOrderSearch/PickExecution.tsx @@ -522,7 +522,7 @@ const PickExecution: React.FC = ({ filterArgs }) => { itemId: line.itemId, lowerLimit: undefined, upperLimit: undefined, - description: item.qcDescription, + description: item.description, qcPassed: undefined, failQty: undefined, remarks: undefined