|
|
@@ -32,8 +32,8 @@ import { useCallback, useEffect, useState, useRef, useMemo } from "react"; |
|
|
import { useTranslation } from "react-i18next"; |
|
|
import { useTranslation } from "react-i18next"; |
|
|
import { useRouter } from "next/navigation"; |
|
|
import { useRouter } from "next/navigation"; |
|
|
import { |
|
|
import { |
|
|
fetchCompletedJobOrderPickOrdersrecords, |
|
|
|
|
|
fetchCompletedJobOrderPickOrderLotDetailsForCompletedPick, |
|
|
|
|
|
|
|
|
fetchJobOrderPickOrdersrecords, |
|
|
|
|
|
fetchJobOrderPickOrderLotDetailsForPick, |
|
|
PrintPickRecord |
|
|
PrintPickRecord |
|
|
} from "@/app/api/jo/actions"; |
|
|
} from "@/app/api/jo/actions"; |
|
|
import { fetchNameList, NameList } from "@/app/api/user/actions"; |
|
|
import { fetchNameList, NameList } from "@/app/api/user/actions"; |
|
|
@@ -148,8 +148,8 @@ const CompleteJobOrderRecord: React.FC<Props> = ({ |
|
|
const errors = formProps.formState.errors; |
|
|
const errors = formProps.formState.errors; |
|
|
|
|
|
|
|
|
// 修改:使用新的 Job Order API 获取已完成的 Job Order Pick Orders(仅完成pick的) |
|
|
// 修改:使用新的 Job Order API 获取已完成的 Job Order Pick Orders(仅完成pick的) |
|
|
const fetchCompletedJobOrderPickOrdersData = useCallback( |
|
|
|
|
|
async (forDate?: string) => { |
|
|
|
|
|
|
|
|
const fetchJobOrderPickOrdersData = useCallback( |
|
|
|
|
|
async (forDate?: string, forStatus?: string) => { |
|
|
if (!currentUserId) return; |
|
|
if (!currentUserId) return; |
|
|
|
|
|
|
|
|
setCompletedJobOrderPickOrdersLoading(true); |
|
|
setCompletedJobOrderPickOrdersLoading(true); |
|
|
@@ -160,21 +160,27 @@ const CompleteJobOrderRecord: React.FC<Props> = ({ |
|
|
: searchQuery.completedDate |
|
|
: searchQuery.completedDate |
|
|
? String(searchQuery.completedDate) |
|
|
? String(searchQuery.completedDate) |
|
|
: dayjs().format("YYYY-MM-DD"); |
|
|
: dayjs().format("YYYY-MM-DD"); |
|
|
const completedJobOrderPickOrders = await fetchCompletedJobOrderPickOrdersrecords( |
|
|
|
|
|
dateParam.trim() ? dateParam.trim() : null, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const statusParam = |
|
|
|
|
|
forStatus !== undefined |
|
|
|
|
|
? forStatus |
|
|
|
|
|
: searchQuery.pickOrderStatus |
|
|
|
|
|
? String(searchQuery.pickOrderStatus) |
|
|
|
|
|
: null; |
|
|
|
|
|
|
|
|
|
|
|
const data = await fetchJobOrderPickOrdersrecords( |
|
|
|
|
|
dateParam?.trim() ? dateParam.trim() : null, |
|
|
|
|
|
statusParam?.trim() ? statusParam.trim() : null, |
|
|
); |
|
|
); |
|
|
const safeData = Array.isArray(completedJobOrderPickOrders) ? completedJobOrderPickOrders : []; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const safeData = Array.isArray(data) ? data : []; |
|
|
setCompletedJobOrderPickOrders(safeData); |
|
|
setCompletedJobOrderPickOrders(safeData); |
|
|
setFilteredJobOrderPickOrders(safeData); |
|
|
setFilteredJobOrderPickOrders(safeData); |
|
|
} catch (error) { |
|
|
|
|
|
console.error("❌ Error fetching completed Job Order pick orders:", error); |
|
|
|
|
|
setCompletedJobOrderPickOrders([]); |
|
|
|
|
|
setFilteredJobOrderPickOrders([]); |
|
|
|
|
|
} finally { |
|
|
} finally { |
|
|
setCompletedJobOrderPickOrdersLoading(false); |
|
|
setCompletedJobOrderPickOrdersLoading(false); |
|
|
} |
|
|
} |
|
|
}, |
|
|
}, |
|
|
[currentUserId, searchQuery.completedDate], |
|
|
|
|
|
|
|
|
[currentUserId, searchQuery.completedDate, searchQuery.pickOrderStatus], |
|
|
); |
|
|
); |
|
|
// 新增:获取 lot 详情数据(使用新的API) |
|
|
// 新增:获取 lot 详情数据(使用新的API) |
|
|
const fetchLotDetailsData = useCallback(async (pickOrderId: number) => { |
|
|
const fetchLotDetailsData = useCallback(async (pickOrderId: number) => { |
|
|
@@ -182,7 +188,7 @@ const CompleteJobOrderRecord: React.FC<Props> = ({ |
|
|
try { |
|
|
try { |
|
|
console.log("🔍 Fetching lot details for completed pick order:", pickOrderId); |
|
|
console.log("🔍 Fetching lot details for completed pick order:", pickOrderId); |
|
|
|
|
|
|
|
|
const lotDetails = await fetchCompletedJobOrderPickOrderLotDetailsForCompletedPick(pickOrderId); |
|
|
|
|
|
|
|
|
const lotDetails = await fetchJobOrderPickOrderLotDetailsForPick(pickOrderId); |
|
|
|
|
|
|
|
|
setDetailLotData(Array.isArray(lotDetails) ? lotDetails : []); |
|
|
setDetailLotData(Array.isArray(lotDetails) ? lotDetails : []); |
|
|
console.log(" Fetched lot details:", lotDetails); |
|
|
console.log(" Fetched lot details:", lotDetails); |
|
|
@@ -198,9 +204,13 @@ const CompleteJobOrderRecord: React.FC<Props> = ({ |
|
|
useEffect(() => { |
|
|
useEffect(() => { |
|
|
if (!currentUserId) return; |
|
|
if (!currentUserId) return; |
|
|
const d = searchQuery?.completedDate; |
|
|
const d = searchQuery?.completedDate; |
|
|
|
|
|
const s = searchQuery?.pickOrderStatus; |
|
|
|
|
|
|
|
|
const dateStr = d != null && String(d).trim() !== "" ? String(d).trim() : ""; |
|
|
const dateStr = d != null && String(d).trim() !== "" ? String(d).trim() : ""; |
|
|
void fetchCompletedJobOrderPickOrdersData(dateStr || undefined); |
|
|
|
|
|
}, [currentUserId, searchQuery?.completedDate, fetchCompletedJobOrderPickOrdersData]); |
|
|
|
|
|
|
|
|
const statusStr = s != null && String(s).trim() !== "" ? String(s).trim() : ""; |
|
|
|
|
|
|
|
|
|
|
|
void fetchJobOrderPickOrdersData(dateStr || undefined, statusStr || undefined); |
|
|
|
|
|
}, [currentUserId, searchQuery?.completedDate, searchQuery?.pickOrderStatus, fetchJobOrderPickOrdersData]); |
|
|
|
|
|
|
|
|
// 修改:搜索功能(只更新 query;实际过滤交给 useEffect + date filter 统一处理) |
|
|
// 修改:搜索功能(只更新 query;实际过滤交给 useEffect + date filter 统一处理) |
|
|
const handleSearch = useCallback((query: Record<string, any>) => { |
|
|
const handleSearch = useCallback((query: Record<string, any>) => { |
|
|
@@ -316,6 +326,15 @@ const CompleteJobOrderRecord: React.FC<Props> = ({ |
|
|
paramName: "jobOrderCode", |
|
|
paramName: "jobOrderCode", |
|
|
type: "text", |
|
|
type: "text", |
|
|
}, |
|
|
}, |
|
|
|
|
|
{ |
|
|
|
|
|
label: t("Pick Order Status"), |
|
|
|
|
|
paramName: "pickOrderStatus", |
|
|
|
|
|
type: "select-labelled", |
|
|
|
|
|
options: [ |
|
|
|
|
|
{ label: t("Released"), value: "RELEASED" }, |
|
|
|
|
|
{ label: t("Completed"), value: "COMPLETED" }, |
|
|
|
|
|
], // 依你后端实际枚举 |
|
|
|
|
|
}, |
|
|
{ |
|
|
{ |
|
|
label: t("Job Order Item Name"), |
|
|
label: t("Job Order Item Name"), |
|
|
paramName: "jobOrderName", |
|
|
paramName: "jobOrderName", |
|
|
@@ -640,7 +659,9 @@ const CompleteJobOrderRecord: React.FC<Props> = ({ |
|
|
</Box> |
|
|
</Box> |
|
|
) : ( |
|
|
) : ( |
|
|
<Stack spacing={2}> |
|
|
<Stack spacing={2}> |
|
|
{paginatedData.map((jobOrderPickOrder) => ( |
|
|
|
|
|
|
|
|
{paginatedData.map((jobOrderPickOrder) => { |
|
|
|
|
|
const normalizedStatus = String(jobOrderPickOrder.pickOrderStatus ?? "").toLowerCase(); |
|
|
|
|
|
return ( |
|
|
<Card key={jobOrderPickOrder.id}> |
|
|
<Card key={jobOrderPickOrder.id}> |
|
|
<CardContent> |
|
|
<CardContent> |
|
|
<Stack direction="row" justifyContent="space-between" alignItems="center"> |
|
|
<Stack direction="row" justifyContent="space-between" alignItems="center"> |
|
|
@@ -660,21 +681,18 @@ const CompleteJobOrderRecord: React.FC<Props> = ({ |
|
|
</Box> |
|
|
</Box> |
|
|
|
|
|
|
|
|
<Box> |
|
|
<Box> |
|
|
<Chip |
|
|
|
|
|
label={t(jobOrderPickOrder.pickOrderStatus) } |
|
|
|
|
|
color={jobOrderPickOrder.pickOrderStatus === 'completed' ? 'success' : 'default'} |
|
|
|
|
|
size="small" |
|
|
|
|
|
sx={{ mb: 1 }} |
|
|
|
|
|
/> |
|
|
|
|
|
|
|
|
<Chip |
|
|
|
|
|
|
|
|
|
|
|
label={t(jobOrderPickOrder.pickOrderStatus)} |
|
|
|
|
|
color={normalizedStatus === "completed" ? "success" : "default"} |
|
|
|
|
|
size="small" |
|
|
|
|
|
sx={{ mb: 1 }} |
|
|
|
|
|
/> |
|
|
<Typography variant="body2" color="text.secondary"> |
|
|
<Typography variant="body2" color="text.secondary"> |
|
|
{jobOrderPickOrder.completedItems}/{jobOrderPickOrder.totalItems} {t("items completed")} |
|
|
{jobOrderPickOrder.completedItems}/{jobOrderPickOrder.totalItems} {t("items completed")} |
|
|
</Typography> |
|
|
</Typography> |
|
|
<Chip |
|
|
|
|
|
label={jobOrderPickOrder.secondScanCompleted ? t("Second Scan Completed") : t("Second Scan Pending")} |
|
|
|
|
|
color={jobOrderPickOrder.secondScanCompleted ? 'success' : 'warning'} |
|
|
|
|
|
size="small" |
|
|
|
|
|
sx={{ mt: 1 }} |
|
|
|
|
|
/> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
</Box> |
|
|
</Box> |
|
|
</Stack> |
|
|
</Stack> |
|
|
</CardContent> |
|
|
</CardContent> |
|
|
@@ -694,7 +712,9 @@ const CompleteJobOrderRecord: React.FC<Props> = ({ |
|
|
</Button> |
|
|
</Button> |
|
|
</CardActions> |
|
|
</CardActions> |
|
|
</Card> |
|
|
</Card> |
|
|
))} |
|
|
|
|
|
|
|
|
); |
|
|
|
|
|
})} |
|
|
|
|
|
|
|
|
</Stack> |
|
|
</Stack> |
|
|
)} |
|
|
)} |
|
|
|
|
|
|
|
|
|