kelvin.yau 2 mesi fa
parent
commit
97a0589caf
4 ha cambiato i file con 140 aggiunte e 7 eliminazioni
  1. +29
    -0
      src/app/api/do/actions.tsx
  2. +107
    -5
      src/components/FinishedGoodSearch/FinishedGoodSearch.tsx
  3. +1
    -1
      src/components/FinishedGoodSearch/GoodPickExecution.tsx
  4. +3
    -1
      src/i18n/zh/pickOrder.json

+ 29
- 0
src/app/api/do/actions.tsx Vedi File

@@ -8,6 +8,8 @@ import { QcItemResult } from "../settings/qcItem";
import { RecordsRes } from "../utils";
import { DoResult } from ".";
import { GridRowId, GridRowSelectionModel } from "@mui/x-data-grid";
import { GET } from "../auth/[...nextauth]/route";
import { stringify } from "querystring";

export interface CreateConsoDoInput {
ids: GridRowSelectionModel;
@@ -70,6 +72,21 @@ export interface AssignByStoreResponse {
errorPosition: string;
entity: any;
}

export interface PrintDeliveryNoteRequest{
deliveryOrderId: number;
printerId: number;
printQty: number;
numOfCarton: number;
isDraft: boolean;
pickOrderId: number;
}

export interface PrintDeliveryNoteResponse{
success: boolean;
message?: string
}

export const assignPickOrderByStore = cache(async (data: AssignByStoreRequest) => {
return await serverFetchJson<AssignByStoreResponse>(`${BASE_API_URL}/doPickOrder/assign-by-store`,
{
@@ -128,3 +145,15 @@ export const fetchDoSearch = cache(async (code: string, shopName: string, status
});

export async function printDN(request: PrintDeliveryNoteRequest){
const response = await serverFetchJson<PrintDeliveryNoteResponse>(`${BASE_API_URL}/do/print-DN`,{
method: "GET",
body: JSON.stringify(request),
headers: {
'Content-type': 'application/json',
},
});
return response;
}



+ 107
- 5
src/components/FinishedGoodSearch/FinishedGoodSearch.tsx Vedi File

@@ -24,11 +24,15 @@ import NewCreateItem from "./newcreatitem";
import AssignAndRelease from "./AssignAndRelease";
import AssignTo from "./assignTo";
import { fetchAllItemsInClient, ItemCombo } from "@/app/api/settings/item/actions";
import { fetchPickOrderClient, autoAssignAndReleasePickOrder, autoAssignAndReleasePickOrderByStore } from "@/app/api/pickOrder/actions";
import { fetchPickOrderClient, autoAssignAndReleasePickOrder, autoAssignAndReleasePickOrderByStore, FGPickOrderResponse, fetchFGPickOrders } from "@/app/api/pickOrder/actions";
import Jobcreatitem from "./Jobcreatitem";
import { useSession } from "next-auth/react";
import { SessionWithTokens } from "@/config/authConfig";
import PickExecutionDetail from "./GoodPickExecutiondetail";
import Swal from "sweetalert2";
import { PrintDeliveryNoteRequest, printDN } from "@/app/api/do/actions";


interface Props {
pickOrders: PickOrderResult[];
}
@@ -52,6 +56,9 @@ const PickOrderSearch: React.FC<Props> = ({ pickOrders }) => {
const [tabIndex, setTabIndex] = useState(0);
const [totalCount, setTotalCount] = useState<number>();
const [isAssigning, setIsAssigning] = useState(false);

const [fgPickOrdersData, setFgPickOrdersData] = useState<FGPickOrderResponse[]>([]);

const handleAssignByStore = async (storeId: "2/F" | "4/F") => {
if (!currentUserId) {
console.error("Missing user id in session");
@@ -109,6 +116,101 @@ const PickOrderSearch: React.FC<Props> = ({ pickOrders }) => {
setIsOpenCreateModal(false)
}, [])

const handleDN = useCallback(async () =>{
const askNumofCarton = await Swal.fire({
title: t("Enter the number of cartons: "),
input: "number",
inputPlaceholder: t("Number of cartons"),
inputAttributes:{
min: "1",
step: "1"
},
inputValidator: (value) => {
if(!value){
return t("You need to enter a number")
}
if(parseInt(value) < 1){
return t("Number must be at least 1");
}
return null
},
showCancelButton: true,
confirmButtonText: t("Confirm"),
cancelButtonText: t("Cancel"),
showLoaderOnConfirm: true,
allowOutsideClick: () => !Swal.isLoading()
});

if (askNumofCarton.isConfirmed) {
const numOfCartons = askNumofCarton.value;
console.log(numOfCartons)
}
},[t]);

const handleDNandLabel = useCallback(async () =>{
const askNumofCarton = await Swal.fire({
title: t("Enter the number of cartons: "),
input: "number",
inputPlaceholder: t("Number of cartons"),
inputAttributes:{
min: "1",
step: "1"
},
inputValidator: (value) => {
if(!value){
return t("You need to enter a number")
}
if(parseInt(value) < 1){
return t("Number must be at least 1");
}
return null
},
showCancelButton: true,
confirmButtonText: t("Confirm"),
cancelButtonText: t("Cancel"),
showLoaderOnConfirm: true,
allowOutsideClick: () => !Swal.isLoading()
});

if (askNumofCarton.isConfirmed) {
const numOfCartons = askNumofCarton.value;
}
},[t]);

const handleLabel = useCallback(async () =>{
const askNumofCarton = await Swal.fire({
title: t("Enter the number of cartons: "),
input: "number",
inputPlaceholder: t("Number of cartons"),
inputAttributes:{
min: "1",
step: "1"
},
inputValidator: (value) => {
if(!value){
return t("You need to enter a number")
}
if(parseInt(value) < 1){
return t("Number must be at least 1");
}
return null
},
showCancelButton: true,
confirmButtonText: t("Confirm"),
cancelButtonText: t("Cancel"),
showLoaderOnConfirm: true,
allowOutsideClick: () => !Swal.isLoading()
});

if (askNumofCarton.isConfirmed) {
const numOfCartons = askNumofCarton.value;
}
},[t]);

const handleDraft = useCallback(async () =>{

},[t]);

useEffect(() => {
@@ -294,10 +396,10 @@ const PickOrderSearch: React.FC<Props> = ({ pickOrders }) => {
{/* First 4 buttons aligned left */}
<Grid item xs={6}>
<Stack direction="row" spacing={1}>
<Button variant="contained">{t("Print Draft")}</Button>
<Button variant="contained">{t("Print Pick Order and DN Label")}</Button>
<Button variant="contained">{t("Print Pick Order")}</Button>
<Button variant="contained">{t("Print DN Label")}</Button>
<Button variant="contained" onClick={handleDraft}>{t("Print Draft")}</Button>
<Button variant="contained" onClick={handleDNandLabel}>{t("Print Pick Order and DN Label")}</Button>
<Button variant="contained" onClick={handleDN}>{t("Print Pick Order")}</Button>
<Button variant="contained" onClick={handleLabel}>{t("Print DN Label")}</Button>
</Stack>
</Grid>



+ 1
- 1
src/components/FinishedGoodSearch/GoodPickExecution.tsx Vedi File

@@ -427,7 +427,7 @@ const PickExecution: React.FC<Props> = ({ filterArgs }) => {
} finally {
setCombinedDataLoading(false);
}
}, [currentUserId]);
}, [currentUserId, combinedLotData]);

// ✅ Only fetch existing data when session is ready, no auto-assignment
useEffect(() => {


+ 3
- 1
src/i18n/zh/pickOrder.json Vedi File

@@ -273,7 +273,9 @@
"Print Draft":"列印草稿",
"Print Pick Order and DN Label":"列印提料單和送貨單標貼",
"Print Pick Order":"列印提料單",
"Print DN Label":"列印送貨單標貼"
"Print DN Label":"列印送貨單標貼",
"Enter the number of cartons: ": "請輸入總箱數",
"Number of cartons": "箱數"




Caricamento…
Annulla
Salva