|
|
@@ -1,52 +1,25 @@ |
|
|
"use client"; |
|
|
"use client"; |
|
|
import { PickOrderResult } from "@/app/api/pickOrder"; |
|
|
|
|
|
import { useCallback, useEffect, useMemo, useState } from "react"; |
|
|
|
|
|
|
|
|
import { useCallback, useEffect, useState } from "react"; |
|
|
import { useTranslation } from "react-i18next"; |
|
|
import { useTranslation } from "react-i18next"; |
|
|
import SearchBox, { Criterion } from "../SearchBox"; |
|
|
|
|
|
import { |
|
|
|
|
|
flatten, |
|
|
|
|
|
intersectionWith, |
|
|
|
|
|
isEmpty, |
|
|
|
|
|
sortBy, |
|
|
|
|
|
uniqBy, |
|
|
|
|
|
upperCase, |
|
|
|
|
|
upperFirst, |
|
|
|
|
|
} from "lodash"; |
|
|
|
|
|
import { |
|
|
|
|
|
arrayToDayjs, |
|
|
|
|
|
} from "@/app/utils/formatUtil"; |
|
|
|
|
|
import { Button, Grid, Stack, Tab, Tabs, TabsProps, Typography, Box } from "@mui/material"; |
|
|
|
|
|
import PickOrders from "./PickOrders"; |
|
|
|
|
|
import ConsolidatedPickOrders from "./ConsolidatedPickOrders"; |
|
|
|
|
|
|
|
|
import { Grid, Stack, Tab, Tabs, TabsProps, Typography, Box } from "@mui/material"; |
|
|
import PickExecution from "./PickExecution"; |
|
|
import PickExecution from "./PickExecution"; |
|
|
import CreatePickOrderModal from "./CreatePickOrderModal"; |
|
|
|
|
|
import NewCreateItem from "./newcreatitem"; |
|
|
import NewCreateItem from "./newcreatitem"; |
|
|
import AssignAndRelease from "./AssignAndRelease"; |
|
|
import AssignAndRelease from "./AssignAndRelease"; |
|
|
import AssignTo from "./assignTo"; |
|
|
import AssignTo from "./assignTo"; |
|
|
import { fetchAllItemsInClient, ItemCombo } from "@/app/api/settings/item/actions"; |
|
|
import { fetchAllItemsInClient, ItemCombo } from "@/app/api/settings/item/actions"; |
|
|
import { fetchPickOrderClient } from "@/app/api/pickOrder/actions"; |
|
|
|
|
|
import Jobcreatitem from "./Jobcreatitem"; |
|
|
|
|
|
|
|
|
|
|
|
interface Props { |
|
|
interface Props { |
|
|
pickOrders: PickOrderResult[]; |
|
|
|
|
|
|
|
|
// Intentionally empty: data is loaded per-tab now. |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
type SearchQuery = Partial< |
|
|
|
|
|
Omit<PickOrderResult, "id" | "consoCode" | "completeDate"> |
|
|
|
|
|
>; |
|
|
|
|
|
|
|
|
|
|
|
type SearchParamNames = keyof SearchQuery; |
|
|
|
|
|
|
|
|
|
|
|
const PickOrderSearch: React.FC<Props> = ({ pickOrders }) => { |
|
|
|
|
|
|
|
|
const PickOrderSearch: React.FC<Props> = () => { |
|
|
const { t } = useTranslation("pickOrder"); |
|
|
const { t } = useTranslation("pickOrder"); |
|
|
|
|
|
|
|
|
const [isOpenCreateModal, setIsOpenCreateModal] = useState(false) |
|
|
|
|
|
const [items, setItems] = useState<ItemCombo[]>([]) |
|
|
|
|
|
const [filteredPickOrders, setFilteredPickOrders] = useState(pickOrders); |
|
|
|
|
|
|
|
|
const [isOpenCreateModal, setIsOpenCreateModal] = useState(false); |
|
|
|
|
|
const [items, setItems] = useState<ItemCombo[]>([]); |
|
|
const [filterArgs, setFilterArgs] = useState<Record<string, any>>({}); |
|
|
const [filterArgs, setFilterArgs] = useState<Record<string, any>>({}); |
|
|
const [searchQuery, setSearchQuery] = useState<Record<string, any>>({}); |
|
|
const [searchQuery, setSearchQuery] = useState<Record<string, any>>({}); |
|
|
const [tabIndex, setTabIndex] = useState(0); |
|
|
const [tabIndex, setTabIndex] = useState(0); |
|
|
const [totalCount, setTotalCount] = useState<number>(); |
|
|
|
|
|
|
|
|
|
|
|
const handleTabChange = useCallback<NonNullable<TabsProps["onChange"]>>( |
|
|
const handleTabChange = useCallback<NonNullable<TabsProps["onChange"]>>( |
|
|
(_e, newValue) => { |
|
|
(_e, newValue) => { |
|
|
@@ -56,16 +29,16 @@ const PickOrderSearch: React.FC<Props> = ({ pickOrders }) => { |
|
|
); |
|
|
); |
|
|
|
|
|
|
|
|
const openCreateModal = useCallback(async () => { |
|
|
const openCreateModal = useCallback(async () => { |
|
|
console.log("testing") |
|
|
|
|
|
const res = await fetchAllItemsInClient() |
|
|
|
|
|
console.log(res) |
|
|
|
|
|
setItems(res) |
|
|
|
|
|
setIsOpenCreateModal(true) |
|
|
|
|
|
}, []) |
|
|
|
|
|
|
|
|
console.log("testing"); |
|
|
|
|
|
const res = await fetchAllItemsInClient(); |
|
|
|
|
|
console.log(res); |
|
|
|
|
|
setItems(res); |
|
|
|
|
|
setIsOpenCreateModal(true); |
|
|
|
|
|
}, []); |
|
|
|
|
|
|
|
|
const closeCreateModal = useCallback(() => { |
|
|
const closeCreateModal = useCallback(() => { |
|
|
setIsOpenCreateModal(false) |
|
|
|
|
|
}, []) |
|
|
|
|
|
|
|
|
setIsOpenCreateModal(false); |
|
|
|
|
|
}, []); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
useEffect(() => { |
|
|
useEffect(() => { |
|
|
@@ -88,142 +61,14 @@ const PickOrderSearch: React.FC<Props> = ({ pickOrders }) => { |
|
|
} |
|
|
} |
|
|
}, [tabIndex, items.length]); |
|
|
}, [tabIndex, items.length]); |
|
|
|
|
|
|
|
|
const searchCriteria: Criterion<SearchParamNames>[] = useMemo( |
|
|
|
|
|
() => { |
|
|
|
|
|
const baseCriteria: Criterion<SearchParamNames>[] = [ |
|
|
|
|
|
{ |
|
|
|
|
|
label: tabIndex === 3 ? t("Item Code") : t("Code"), |
|
|
|
|
|
paramName: "code", |
|
|
|
|
|
type: "text" |
|
|
|
|
|
}, |
|
|
|
|
|
{ |
|
|
|
|
|
label: t("Type"), |
|
|
|
|
|
paramName: "type", |
|
|
|
|
|
type: "autocomplete", |
|
|
|
|
|
options: tabIndex === 3 |
|
|
|
|
|
? |
|
|
|
|
|
[ |
|
|
|
|
|
{ value: "Consumable", label: t("Consumable") }, |
|
|
|
|
|
{ value: "Material", label: t("Material") }, |
|
|
|
|
|
{ value: "Product", label: t("Product") } |
|
|
|
|
|
] |
|
|
|
|
|
: |
|
|
|
|
|
sortBy( |
|
|
|
|
|
uniqBy( |
|
|
|
|
|
pickOrders.map((po) => ({ |
|
|
|
|
|
value: po.type, |
|
|
|
|
|
label: t(upperCase(po.type)), |
|
|
|
|
|
})), |
|
|
|
|
|
"value", |
|
|
|
|
|
), |
|
|
|
|
|
"label", |
|
|
|
|
|
), |
|
|
|
|
|
}, |
|
|
|
|
|
]; |
|
|
|
|
|
|
|
|
|
|
|
// Add Job Order search for Create Item tab (tabIndex === 3) |
|
|
|
|
|
if (tabIndex === 3) { |
|
|
|
|
|
baseCriteria.splice(1, 0, { |
|
|
|
|
|
label: t("Job Order"), |
|
|
|
|
|
paramName: "jobOrderCode" as any, // Type assertion for now |
|
|
|
|
|
type: "text", |
|
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
baseCriteria.splice(2, 0, { |
|
|
|
|
|
label: t("Target Date"), |
|
|
|
|
|
paramName: "targetDate", |
|
|
|
|
|
type: "date", |
|
|
|
|
|
}); |
|
|
|
|
|
} else { |
|
|
|
|
|
baseCriteria.splice(1, 0, { |
|
|
|
|
|
label: t("Target Date From"), |
|
|
|
|
|
label2: t("Target Date To"), |
|
|
|
|
|
paramName: "targetDate", |
|
|
|
|
|
type: "dateRange", |
|
|
|
|
|
}); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// Add Items/Item Name criteria |
|
|
|
|
|
baseCriteria.push({ |
|
|
|
|
|
label: tabIndex === 3 ? t("Item Name") : t("Items"), |
|
|
|
|
|
paramName: "items", |
|
|
|
|
|
type: tabIndex === 3 ? "text" : "autocomplete", |
|
|
|
|
|
options: tabIndex === 3 |
|
|
|
|
|
? [] |
|
|
|
|
|
: |
|
|
|
|
|
uniqBy( |
|
|
|
|
|
flatten( |
|
|
|
|
|
sortBy( |
|
|
|
|
|
pickOrders.map((po) => |
|
|
|
|
|
po.items |
|
|
|
|
|
? po.items.map((item) => ({ |
|
|
|
|
|
value: item.name, |
|
|
|
|
|
label: item.name, |
|
|
|
|
|
})) |
|
|
|
|
|
: [], |
|
|
|
|
|
), |
|
|
|
|
|
"label", |
|
|
|
|
|
), |
|
|
|
|
|
), |
|
|
|
|
|
"value", |
|
|
|
|
|
), |
|
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
// Add Status criteria for non-Create Item tabs |
|
|
|
|
|
if (tabIndex !== 3) { |
|
|
|
|
|
baseCriteria.push({ |
|
|
|
|
|
label: t("Status"), |
|
|
|
|
|
paramName: "status", |
|
|
|
|
|
type: "autocomplete", |
|
|
|
|
|
options: sortBy( |
|
|
|
|
|
uniqBy( |
|
|
|
|
|
pickOrders.map((po) => ({ |
|
|
|
|
|
value: po.status, |
|
|
|
|
|
label: t(upperFirst(po.status)), |
|
|
|
|
|
})), |
|
|
|
|
|
"value", |
|
|
|
|
|
), |
|
|
|
|
|
"label", |
|
|
|
|
|
), |
|
|
|
|
|
}); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return baseCriteria; |
|
|
|
|
|
}, |
|
|
|
|
|
[pickOrders, t, tabIndex, items], |
|
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
|
|
const fetchNewPagePickOrder = useCallback( |
|
|
|
|
|
async ( |
|
|
|
|
|
pagingController: Record<string, number>, |
|
|
|
|
|
filterArgs: Record<string, number>, |
|
|
|
|
|
) => { |
|
|
|
|
|
const params = { |
|
|
|
|
|
...pagingController, |
|
|
|
|
|
...filterArgs, |
|
|
|
|
|
}; |
|
|
|
|
|
const res = await fetchPickOrderClient(params); |
|
|
|
|
|
if (res) { |
|
|
|
|
|
console.log(res); |
|
|
|
|
|
setFilteredPickOrders(res.records); |
|
|
|
|
|
setTotalCount(res.total); |
|
|
|
|
|
} |
|
|
|
|
|
}, |
|
|
|
|
|
[], |
|
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
|
|
const onReset = useCallback(() => { |
|
|
|
|
|
setFilteredPickOrders(pickOrders); |
|
|
|
|
|
}, [pickOrders]); |
|
|
|
|
|
|
|
|
|
|
|
useEffect(() => { |
|
|
useEffect(() => { |
|
|
if (!isOpenCreateModal) { |
|
|
if (!isOpenCreateModal) { |
|
|
setTabIndex(1) |
|
|
|
|
|
|
|
|
setTabIndex(1); |
|
|
setTimeout(async () => { |
|
|
setTimeout(async () => { |
|
|
setTabIndex(0) |
|
|
|
|
|
}, 200) |
|
|
|
|
|
|
|
|
setTabIndex(0); |
|
|
|
|
|
}, 200); |
|
|
} |
|
|
} |
|
|
}, [isOpenCreateModal]) |
|
|
|
|
|
|
|
|
}, [isOpenCreateModal]); |
|
|
|
|
|
|
|
|
// 添加处理提料单创建成功的函数 |
|
|
// 添加处理提料单创建成功的函数 |
|
|
const handlePickOrderCreated = useCallback(() => { |
|
|
const handlePickOrderCreated = useCallback(() => { |
|
|
|