瀏覽代碼

update

master
CANCERYS\kw093 2 月之前
父節點
當前提交
f6660b37b1
共有 3 個檔案被更改,包括 196 行新增15 行删除
  1. +40
    -2
      src/app/api/do/actions.tsx
  2. +155
    -12
      src/components/DoDetail/DoDetail.tsx
  3. +1
    -1
      src/components/PickOrderSearch/PickExecution.tsx

+ 40
- 2
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<ReleaseDoResponse>(`${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<AssignByStoreResponse>(`${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<AssignByStoreResponse>(`${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<ReleaseDoResponse>(`${BASE_API_URL}/do/release`, {
method: 'POST',
body: JSON.stringify(input),
headers: {
'Content-Type': 'application/json',
},
});
revalidateTag('do');
return response;
}
export const preloadDo = () => {
fetchDoList();
};


+ 155
- 12
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<Props> = ({
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<DoDetailType>({
defaultValues: defaultValues
})
@@ -38,24 +45,100 @@ const DoDetail: React.FC<Props> = ({
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<SubmitHandler<DoDetailType>>(async (data, event) => {
console.log(data)
@@ -73,10 +156,17 @@ const DoDetail: React.FC<Props> = ({
onSubmit={formProps.handleSubmit(onSubmit, onSubmitError)}
>
{serverError && (
<Typography variant="body2" color="error" alignSelf="flex-end">
<Alert severity="error" sx={{ mb: 2 }}>
{serverError}
</Typography>
</Alert>
)}
{successMessage && (
<Alert severity="success" sx={{ mb: 2 }}>
{successMessage}
</Alert>
)}

{
formProps.watch("status")?.toLowerCase() === "pending" && (
<Stack direction="row" justifyContent="flex-start" gap={1}>
@@ -84,11 +174,64 @@ const DoDetail: React.FC<Props> = ({
variant="outlined"
startIcon={<StartIcon />}
onClick={handleRelease}
disabled={isAssigning}
>
{t("Release")}
</Button>
</Stack>
)}
{/* ✅ ADD STORE-BASED ASSIGNMENT BUTTONS */}
{
formProps.watch("status")?.toLowerCase() === "released" && (
<Box sx={{ mb: 2 }}>
<Typography variant="h6" gutterBottom>
{t("Pick Order Assignment")}
</Typography>
<Stack direction="row" spacing={2}>
<Button
variant="contained"
color="primary"
onClick={() => handleAssignByStore("2/F")}
disabled={isAssigning}
sx={{ minWidth: 120 }}
>
{t("Assign 2/F")}
</Button>
<Button
variant="contained"
color="secondary"
onClick={() => handleAssignByStore("4/F")}
disabled={isAssigning}
sx={{ minWidth: 120 }}
>
{t("Assign 4/F")}
</Button>
</Stack>
<Stack direction="row" spacing={2} sx={{ mt: 1 }}>
<Button
variant="outlined"
color="primary"
onClick={() => handleReleaseByStore("2/F")}
disabled={isAssigning}
sx={{ minWidth: 120 }}
>
{t("Release 2/F")}
</Button>
<Button
variant="outlined"
color="secondary"
onClick={() => handleReleaseByStore("4/F")}
disabled={isAssigning}
sx={{ minWidth: 120 }}
>
{t("Release 4/F")}
</Button>
</Stack>
</Box>
)}
<DoInfoCard />
<DoLineTable />
<Stack direction="row" justifyContent="flex-end" gap={1}>


+ 1
- 1
src/components/PickOrderSearch/PickExecution.tsx 查看文件

@@ -522,7 +522,7 @@ const PickExecution: React.FC<Props> = ({ filterArgs }) => {
itemId: line.itemId,
lowerLimit: undefined,
upperLimit: undefined,
description: item.qcDescription,
description: item.description,
qcPassed: undefined,
failQty: undefined,
remarks: undefined


Loading…
取消
儲存