浏览代码

update truck X part

MergeProblem1
CANCERYS\kw093 18 小时前
父节点
当前提交
27f062341e
共有 5 个文件被更改,包括 67 次插入27 次删除
  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 查看文件

@@ -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(
code: string,
shopName: string,
@@ -322,7 +328,14 @@ export async function fetchDoSearch(
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, {
method: "POST",
@@ -460,7 +473,14 @@ export async function fetchAllDoSearch(
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, {
method: "POST",


+ 6
- 0
src/components/DoSearch/DoSearch.tsx 查看文件

@@ -239,6 +239,12 @@ const DoSearch: React.FC<Props> = ({ filterArgs, searchQuery, onDeliveryOrderSea
field: "truckLanceCode",
headerName: t("Truck Lance Code"),
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",


+ 3
- 0
src/components/FinishedGoodSearch/FinishedGoodFloorLanePanel.tsx 查看文件

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


+ 33
- 22
src/components/FinishedGoodSearch/ReleasedDoPickOrderSelectModal.tsx 查看文件

@@ -23,12 +23,28 @@ import {
assignByDoPickOrderId,
type ReleasedDoPickOrderListItem,
fetchReleasedDoPickOrdersForSelectionToday,
type PostPickOrderResponse,
} from "@/app/api/pickOrder/actions";
import { useSession } from "next-auth/react";
import { SessionWithTokens } from "@/config/authConfig";
import Swal from "sweetalert2";
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 {
open: boolean;
onClose: () => void;
@@ -36,7 +52,9 @@ interface Props {
storeId: string;
truck: string;
isDefaultTruck: boolean;
/** Truck X only: today → released-today; before → released (歷史未完工) */
defaultDateScope?: "today" | "before";
listBridge?: ReleasedDoPickListBridge;
}

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

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

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

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

return (


+ 3
- 3
src/components/Jodetail/newJobPickExecution.tsx 查看文件

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


正在加载...
取消
保存