Sfoglia il codice sorgente

update truck X part

MergeProblem1
CANCERYS\kw093 18 ore fa
parent
commit
27f062341e
5 ha cambiato i file con 67 aggiunte e 27 eliminazioni
  1. +22
    -2
      src/app/api/do/actions.tsx
  2. +6
    -0
      src/components/DoSearch/DoSearch.tsx
  3. +3
    -0
      src/components/FinishedGoodSearch/FinishedGoodFloorLanePanel.tsx
  4. +33
    -22
      src/components/FinishedGoodSearch/ReleasedDoPickOrderSelectModal.tsx
  5. +3
    -3
      src/components/Jodetail/newJobPickExecution.tsx

+ 22
- 2
src/app/api/do/actions.tsx Vedi File

@@ -292,6 +292,12 @@ export const fetchDoDetail = cache(async (id: number) => {
}); });
}); });


/** 車線搜尋為「車線-X」時改走後端專用 API(只含推算車線為 null/空白之送貨單) */
function isTruckLaneXSearch(truckLanceCode?: string): boolean {
const t = truckLanceCode?.trim().toLowerCase() ?? "";
return t === "車線-x";
}

export async function fetchDoSearch( export async function fetchDoSearch(
code: string, code: string,
shopName: string, shopName: string,
@@ -322,7 +328,14 @@ export async function fetchDoSearch(
requestBody.estimatedArrivalDate = null; requestBody.estimatedArrivalDate = null;
} }


const url = `${BASE_API_URL}/do/search-do-lite`;
const useUnassignedTruck = isTruckLaneXSearch(truckLanceCode);
if (useUnassignedTruck) {
delete requestBody.truckLanceCode;
}

const url = useUnassignedTruck
? `${BASE_API_URL}/do/search-do-lite-unassigned-truck`
: `${BASE_API_URL}/do/search-do-lite`;


const data = await serverFetchJson<DoSearchLiteResponse>(url, { const data = await serverFetchJson<DoSearchLiteResponse>(url, {
method: "POST", method: "POST",
@@ -460,7 +473,14 @@ export async function fetchAllDoSearch(
requestBody.estimatedArrivalDate = null; requestBody.estimatedArrivalDate = null;
} }


const url = `${BASE_API_URL}/do/search-do-lite`;
const useUnassignedTruck = isTruckLaneXSearch(truckLanceCode);
if (useUnassignedTruck) {
delete requestBody.truckLanceCode;
}

const url = useUnassignedTruck
? `${BASE_API_URL}/do/search-do-lite-unassigned-truck`
: `${BASE_API_URL}/do/search-do-lite`;


const data = await serverFetchJson<DoSearchLiteResponse>(url, { const data = await serverFetchJson<DoSearchLiteResponse>(url, {
method: "POST", method: "POST",


+ 6
- 0
src/components/DoSearch/DoSearch.tsx Vedi File

@@ -239,6 +239,12 @@ const DoSearch: React.FC<Props> = ({ filterArgs, searchQuery, onDeliveryOrderSea
field: "truckLanceCode", field: "truckLanceCode",
headerName: t("Truck Lance Code"), headerName: t("Truck Lance Code"),
flex: 1, flex: 1,
renderCell: (params) => {
const v = params.row.truckLanceCode;
if (v == null) return "車線-X";
if (typeof v === "string" && v.trim() === "") return "車線-X";
return v;
}
}, },
{ {
field: "orderDate", field: "orderDate",


+ 3
- 0
src/components/FinishedGoodSearch/FinishedGoodFloorLanePanel.tsx Vedi File

@@ -670,6 +670,7 @@ const getDateLabel = (offset: number) => {
variant="outlined" variant="outlined"
size="medium" size="medium"
onClick={() => { onClick={() => {
setIsDefaultTruck(false);
setSelectedStore("2/F"); setSelectedStore("2/F");
setSelectedTruck(truck); setSelectedTruck(truck);
setModalOpen(true); setModalOpen(true);
@@ -737,6 +738,7 @@ const getDateLabel = (offset: number) => {
variant="outlined" variant="outlined"
size="medium" size="medium"
onClick={() => { onClick={() => {
setIsDefaultTruck(false);
setSelectedStore("4/F"); setSelectedStore("4/F");
setSelectedTruck(truck); setSelectedTruck(truck);
setModalOpen(true); setModalOpen(true);
@@ -802,6 +804,7 @@ const getDateLabel = (offset: number) => {
storeId={selectedStore} storeId={selectedStore}
truck={selectedTruck} truck={selectedTruck}
isDefaultTruck={isDefaultTruck} isDefaultTruck={isDefaultTruck}
defaultDateScope={defaultDateScope}
onClose={() => setModalOpen(false)} onClose={() => setModalOpen(false)}
onAssigned={() => { onAssigned={() => {
loadSummaries(); loadSummaries();


+ 33
- 22
src/components/FinishedGoodSearch/ReleasedDoPickOrderSelectModal.tsx Vedi File

@@ -23,12 +23,28 @@ import {
assignByDoPickOrderId, assignByDoPickOrderId,
type ReleasedDoPickOrderListItem, type ReleasedDoPickOrderListItem,
fetchReleasedDoPickOrdersForSelectionToday, fetchReleasedDoPickOrdersForSelectionToday,
type PostPickOrderResponse,
} from "@/app/api/pickOrder/actions"; } from "@/app/api/pickOrder/actions";
import { useSession } from "next-auth/react"; import { useSession } from "next-auth/react";
import { SessionWithTokens } from "@/config/authConfig"; import { SessionWithTokens } from "@/config/authConfig";
import Swal from "sweetalert2"; import Swal from "sweetalert2";
import dayjs from "dayjs"; import dayjs from "dayjs";
type DateScope = "today" | "before";

/** DO workbench 使用 workbench released API;Finished Good 不傳即可 */
export type ReleasedDoPickListBridge = {
loadBeforeToday: (
shopName?: string,
storeId?: string,
truck?: string
) => Promise<ReleasedDoPickOrderListItem[]>;
loadToday: (
shopName?: string,
storeId?: string,
truck?: string
) => Promise<ReleasedDoPickOrderListItem[]>;
assignByListItemId: (userId: number, id: number) => Promise<PostPickOrderResponse>;
};

interface Props { interface Props {
open: boolean; open: boolean;
onClose: () => void; onClose: () => void;
@@ -36,7 +52,9 @@ interface Props {
storeId: string; storeId: string;
truck: string; truck: string;
isDefaultTruck: boolean; isDefaultTruck: boolean;
/** Truck X only: today → released-today; before → released (歷史未完工) */
defaultDateScope?: "today" | "before"; defaultDateScope?: "today" | "before";
listBridge?: ReleasedDoPickListBridge;
} }


const ReleasedDoPickOrderSelectModal: React.FC<Props> = ({ const ReleasedDoPickOrderSelectModal: React.FC<Props> = ({
@@ -46,11 +64,12 @@ const ReleasedDoPickOrderSelectModal: React.FC<Props> = ({
storeId, storeId,
truck, truck,
isDefaultTruck, isDefaultTruck,
defaultDateScope: defaultDateScopeProp = "today",
listBridge,
}) => { }) => {
const { t } = useTranslation("pickOrder"); const { t } = useTranslation("pickOrder");
const { data: session } = useSession() as { data: SessionWithTokens | null }; const { data: session } = useSession() as { data: SessionWithTokens | null };
const currentUserId = session?.id ? parseInt(session.id) : undefined; const currentUserId = session?.id ? parseInt(session.id) : undefined;
const [defaultDateScope, setDefaultDateScope] = useState<"today" | "before">("today");
const [list, setList] = useState<ReleasedDoPickOrderListItem[]>([]); const [list, setList] = useState<ReleasedDoPickOrderListItem[]>([]);
const [loading, setLoading] = useState(false); const [loading, setLoading] = useState(false);
const [shopSearch, setShopSearch] = useState(""); const [shopSearch, setShopSearch] = useState("");
@@ -60,27 +79,18 @@ const ReleasedDoPickOrderSelectModal: React.FC<Props> = ({
if (!open) return; if (!open) return;
setLoading(true); setLoading(true);
try { try {
let data: ReleasedDoPickOrderListItem[]; // ⭐ 先宣告
let data: ReleasedDoPickOrderListItem[];
const loadReleased = listBridge?.loadBeforeToday ?? fetchReleasedDoPickOrdersForSelection;
const loadTodayFn = listBridge?.loadToday ?? fetchReleasedDoPickOrdersForSelectionToday;

if (isDefaultTruck) { if (isDefaultTruck) {
if (defaultDateScope === "today") {
// Truck X 今天
data = await fetchReleasedDoPickOrdersForSelectionToday(
undefined, // shopName
undefined, // storeId
"車線-X" // truck
);
if (defaultDateScopeProp === "today") {
data = await loadTodayFn(undefined, undefined, "車線-X");
} else { } else {
// Truck X 以前(/released,server 內是 < today)
data = await fetchReleasedDoPickOrdersForSelection(
undefined,
undefined,
"車線-X"
);
data = await loadReleased(undefined, undefined, "車線-X");
} }
} else { } else {
// 一般車道
data = await fetchReleasedDoPickOrdersForSelection(
data = await loadReleased(
shopSearch.trim() || undefined, shopSearch.trim() || undefined,
storeId, storeId,
truck?.trim() || undefined truck?.trim() || undefined
@@ -94,7 +104,7 @@ const ReleasedDoPickOrderSelectModal: React.FC<Props> = ({
} finally { } finally {
setLoading(false); setLoading(false);
} }
}, [open, shopSearch, storeId, truck, isDefaultTruck, defaultDateScope]);
}, [open, shopSearch, storeId, truck, isDefaultTruck, defaultDateScopeProp, listBridge]);


useEffect(() => { useEffect(() => {
loadList(); loadList();
@@ -131,7 +141,8 @@ const ReleasedDoPickOrderSelectModal: React.FC<Props> = ({


setIsAssigning(true); setIsAssigning(true);
try { try {
const res = await assignByDoPickOrderId(currentUserId, item.id);
const assignFn = listBridge?.assignByListItemId ?? assignByDoPickOrderId;
const res = await assignFn(currentUserId, item.id);
if (res?.code === "SUCCESS") { if (res?.code === "SUCCESS") {
Swal.fire({ Swal.fire({
icon: "success", icon: "success",
@@ -154,7 +165,7 @@ const ReleasedDoPickOrderSelectModal: React.FC<Props> = ({
setIsAssigning(false); setIsAssigning(false);
} }
}, },
[currentUserId, t, onAssigned, onClose]
[currentUserId, t, onAssigned, onClose, listBridge]
); );


return ( return (


+ 3
- 3
src/components/Jodetail/newJobPickExecution.tsx Vedi File

@@ -2979,7 +2979,7 @@ const sortedData = [...sourceData].sort((a, b) => {
variant="outlined" variant="outlined"
size="small" size="small"
onClick={() => handlePickExecutionForm(lot)} onClick={() => handlePickExecutionForm(lot)}
/*
disabled={ disabled={
lot.lotAvailability === "expired" || lot.lotAvailability === "expired" ||
lot.stockOutLineStatus === "completed" || lot.stockOutLineStatus === "completed" ||
@@ -2988,8 +2988,8 @@ const sortedData = [...sourceData].sort((a, b) => {
(Number(lot.stockOutLineId) > 0 && (Number(lot.stockOutLineId) > 0 &&
actionBusyBySolId[Number(lot.stockOutLineId)] === true) actionBusyBySolId[Number(lot.stockOutLineId)] === true)
} }
*/
disabled={true}
//disabled={true}
sx={{ sx={{
fontSize: '0.7rem', fontSize: '0.7rem',
py: 0.5, py: 0.5,


Caricamento…
Annulla
Salva