|
|
@@ -40,6 +40,7 @@ interface Props { |
|
|
type LaneSlot4F = { truckDepartureTime: string; lane: LaneBtn }; |
|
|
type LaneSlot4F = { truckDepartureTime: string; lane: LaneBtn }; |
|
|
type TruckGroup4F = { truckLanceCode: string; slots: (LaneSlot4F & { sequenceIndex: number })[] }; |
|
|
type TruckGroup4F = { truckLanceCode: string; slots: (LaneSlot4F & { sequenceIndex: number })[] }; |
|
|
|
|
|
|
|
|
|
|
|
/** FP-MTMS Version Checklist | Functions Ref. No. 36 | v1.0.0 | 2026-07-27 */ |
|
|
const WorkbenchFloorLanePanel: React.FC<Props> = ({ |
|
|
const WorkbenchFloorLanePanel: React.FC<Props> = ({ |
|
|
onPickOrderAssigned, |
|
|
onPickOrderAssigned, |
|
|
onSwitchToDetailTab, |
|
|
onSwitchToDetailTab, |
|
|
@@ -689,11 +690,17 @@ const WorkbenchFloorLanePanel: React.FC<Props> = ({ |
|
|
group.lanes.map((lane, li) => { |
|
|
group.lanes.map((lane, li) => { |
|
|
const sid = (lane.storeId ?? "").trim(); |
|
|
const sid = (lane.storeId ?? "").trim(); |
|
|
const dep = (lane.truckDepartureTime ?? "").trim(); |
|
|
const dep = (lane.truckDepartureTime ?? "").trim(); |
|
|
const is4F = sid.replace(/\//g, "").toUpperCase() === "4F"; |
|
|
|
|
|
|
|
|
const isTruckX = |
|
|
|
|
|
(lane.truckLanceCode ?? "").trim() === "車線-X" || |
|
|
|
|
|
(lane.truckLanceCode ?? "").trim() === "Truck X"; |
|
|
|
|
|
const floorKey = sid.replace(/\//g, "").toUpperCase(); |
|
|
|
|
|
const is4F = floorKey === "4F"; |
|
|
const labelCore = |
|
|
const labelCore = |
|
|
is4F && lane.loadingSequence != null |
|
|
|
|
|
? `${t("Loading sequence n", { n: lane.loadingSequence })} (${lane.unassigned}/${lane.total})` |
|
|
|
|
|
: `${dep ? `${dep} ` : ""}${lane.truckLanceCode} (${lane.unassigned}/${lane.total})`; |
|
|
|
|
|
|
|
|
isTruckX |
|
|
|
|
|
? `${t("車線-X")}${sid ? ` · ${sid}` : ""} (${lane.unassigned}/${lane.total})` |
|
|
|
|
|
: is4F && lane.loadingSequence != null |
|
|
|
|
|
? `${t("Loading sequence n", { n: lane.loadingSequence })} (${lane.unassigned}/${lane.total})` |
|
|
|
|
|
: `${dep ? `${dep} ` : ""}${lane.truckLanceCode} (${lane.unassigned}/${lane.total})`; |
|
|
const handlerName = (lane.handlerName ?? "").trim(); |
|
|
const handlerName = (lane.handlerName ?? "").trim(); |
|
|
const shopCode = (group.shopCode ?? "").trim(); |
|
|
const shopCode = (group.shopCode ?? "").trim(); |
|
|
const shopName = (group.shopName ?? "").trim(); |
|
|
const shopName = (group.shopName ?? "").trim(); |
|
|
@@ -702,20 +709,29 @@ const WorkbenchFloorLanePanel: React.FC<Props> = ({ |
|
|
? `${shopCode} · ${shopName}` |
|
|
? `${shopCode} · ${shopName}` |
|
|
: shopName || shopCode || t("Shop"); |
|
|
: shopName || shopCode || t("Shop"); |
|
|
const laneSecondary = `${labelCore}${handlerName ? ` · ${handlerName}` : ""}`; |
|
|
const laneSecondary = `${labelCore}${handlerName ? ` · ${handlerName}` : ""}`; |
|
|
const tileKey = `${shopCode}|${shopName}|${lane.truckLanceCode}|${dep}|${lane.loadingSequence ?? ""}|${li}`; |
|
|
|
|
|
|
|
|
const tileKey = `${shopCode}|${shopName}|${lane.truckLanceCode}|${dep}|${lane.loadingSequence ?? ""}|${sid}|${li}`; |
|
|
return ( |
|
|
return ( |
|
|
<Grid item xs={12} sm={6} md={4} lg={3} key={tileKey}> |
|
|
<Grid item xs={12} sm={6} md={4} lg={3} key={tileKey}> |
|
|
<Button |
|
|
<Button |
|
|
fullWidth |
|
|
fullWidth |
|
|
variant="outlined" |
|
|
variant="outlined" |
|
|
disabled={lane.unassigned === 0 || !sid} |
|
|
|
|
|
|
|
|
disabled={lane.unassigned === 0 || (!isTruckX && !sid)} |
|
|
onClick={() => { |
|
|
onClick={() => { |
|
|
setModalReleaseTypeFilter("isExtra"); |
|
|
setModalReleaseTypeFilter("isExtra"); |
|
|
setModalFilterRequiredDeliveryDate(selectedDeliveryDateYmd); |
|
|
setModalFilterRequiredDeliveryDate(selectedDeliveryDateYmd); |
|
|
setModalInitialShopSearch((group.shopName || group.shopCode || "").trim() || undefined); |
|
|
setModalInitialShopSearch((group.shopName || group.shopCode || "").trim() || undefined); |
|
|
setSelectedStore(sid); |
|
|
|
|
|
setSelectedTruck(lane.truckLanceCode); |
|
|
|
|
|
setIsDefaultTruck(false); |
|
|
|
|
|
|
|
|
if (isTruckX) { |
|
|
|
|
|
// Truck X: DB storeId stays null; use display floor + default-truck list path. |
|
|
|
|
|
setSelectedStore(""); |
|
|
|
|
|
setSelectedTruck("車線-X"); |
|
|
|
|
|
setIsDefaultTruck(true); |
|
|
|
|
|
setModalTruckXFloor(floorKey || undefined); |
|
|
|
|
|
} else { |
|
|
|
|
|
setSelectedStore(sid); |
|
|
|
|
|
setSelectedTruck(lane.truckLanceCode); |
|
|
|
|
|
setIsDefaultTruck(false); |
|
|
|
|
|
setModalTruckXFloor(undefined); |
|
|
|
|
|
} |
|
|
setDefaultDateScope("today"); |
|
|
setDefaultDateScope("today"); |
|
|
setModalOpen(true); |
|
|
setModalOpen(true); |
|
|
}} |
|
|
}} |
|
|
|