|
|
@@ -70,6 +70,7 @@ type LotRow = { |
|
|
uomDesc: string; |
|
|
uomDesc: string; |
|
|
requiredQty: number; |
|
|
requiredQty: number; |
|
|
availableQty: number; |
|
|
availableQty: number; |
|
|
|
|
|
itemTotalAvailableQty?: number | null; |
|
|
stockOutLineId: number; |
|
|
stockOutLineId: number; |
|
|
status: string; |
|
|
status: string; |
|
|
pickedQty: number; |
|
|
pickedQty: number; |
|
|
@@ -247,11 +248,19 @@ function lineHasStockOutOrSuggestion(details: PickOrderLotDetailResponse[]): boo |
|
|
|
|
|
|
|
|
function mapLotDetailsToRows( |
|
|
function mapLotDetailsToRows( |
|
|
details: PickOrderLotDetailResponse[], |
|
|
details: PickOrderLotDetailResponse[], |
|
|
ctx: { pickOrderId: number; pickOrderLineId: number; pickOrderCode: string; itemCode: string; itemName: string }, |
|
|
|
|
|
|
|
|
ctx: { |
|
|
|
|
|
pickOrderId: number; |
|
|
|
|
|
pickOrderLineId: number; |
|
|
|
|
|
pickOrderCode: string; |
|
|
|
|
|
itemCode: string; |
|
|
|
|
|
itemName: string; |
|
|
|
|
|
totalAvailableQty?: number | null; |
|
|
|
|
|
}, |
|
|
): LotRow[] { |
|
|
): LotRow[] { |
|
|
return details.map((d, i) => { |
|
|
return details.map((d, i) => { |
|
|
const solId = toNum(d.stockOutLineId); |
|
|
const solId = toNum(d.stockOutLineId); |
|
|
const lotId = toNum(d.lotId, i); |
|
|
const lotId = toNum(d.lotId, i); |
|
|
|
|
|
const stockInLineId = toNum(d.stockInLineId); |
|
|
return { |
|
|
return { |
|
|
key: solId > 0 ? `sol:${solId}` : `lot:${lotId}:${i}`, |
|
|
key: solId > 0 ? `sol:${solId}` : `lot:${lotId}:${i}`, |
|
|
pickOrderId: ctx.pickOrderId, |
|
|
pickOrderId: ctx.pickOrderId, |
|
|
@@ -262,13 +271,14 @@ function mapLotDetailsToRows( |
|
|
uomDesc: toStr(d.stockUnit), |
|
|
uomDesc: toStr(d.stockUnit), |
|
|
requiredQty: toNum(d.requiredQty), |
|
|
requiredQty: toNum(d.requiredQty), |
|
|
availableQty: toNum(d.remainingAfterAllPickOrders ?? d.availableQty), |
|
|
availableQty: toNum(d.remainingAfterAllPickOrders ?? d.availableQty), |
|
|
|
|
|
itemTotalAvailableQty: toNum(ctx.totalAvailableQty), |
|
|
stockOutLineId: solId, |
|
|
stockOutLineId: solId, |
|
|
status: toStr(d.stockOutLineStatus ?? "pending"), |
|
|
status: toStr(d.stockOutLineStatus ?? "pending"), |
|
|
pickedQty: toNum(d.actualPickQty ?? d.stockOutLineQty), |
|
|
pickedQty: toNum(d.actualPickQty ?? d.stockOutLineQty), |
|
|
lotNo: toStr(d.lotNo), |
|
|
lotNo: toStr(d.lotNo), |
|
|
location: toStr(d.location), |
|
|
location: toStr(d.location), |
|
|
itemId: toNum(d.itemId) || undefined, |
|
|
itemId: toNum(d.itemId) || undefined, |
|
|
stockInLineId: lotId > 0 ? lotId : undefined, |
|
|
|
|
|
|
|
|
stockInLineId: stockInLineId > 0 ? stockInLineId : undefined, |
|
|
suggestedPickLotId: toNum(d.suggestedPickLotId) || undefined, |
|
|
suggestedPickLotId: toNum(d.suggestedPickLotId) || undefined, |
|
|
lotAvailability: toStr((d as any).lotAvailability), |
|
|
lotAvailability: toStr((d as any).lotAvailability), |
|
|
lotStatus: toStr((d as any).lotStatus), |
|
|
lotStatus: toStr((d as any).lotStatus), |
|
|
@@ -295,6 +305,7 @@ const WorkbenchPickExecution: React.FC<Props> = ({ filterArgs }) => { |
|
|
pickOrderCode: string; |
|
|
pickOrderCode: string; |
|
|
itemCode: string; |
|
|
itemCode: string; |
|
|
itemName: string; |
|
|
itemName: string; |
|
|
|
|
|
totalAvailableQty?: number; |
|
|
} | null>(null); |
|
|
} | null>(null); |
|
|
|
|
|
|
|
|
const [lotRows, setLotRows] = useState<LotRow[]>([]); |
|
|
const [lotRows, setLotRows] = useState<LotRow[]>([]); |
|
|
@@ -499,7 +510,12 @@ const WorkbenchPickExecution: React.FC<Props> = ({ filterArgs }) => { |
|
|
async ( |
|
|
async ( |
|
|
pickOrderId: number, |
|
|
pickOrderId: number, |
|
|
pickOrderLineId: number, |
|
|
pickOrderLineId: number, |
|
|
meta: { pickOrderCode: string; itemCode: string; itemName: string }, |
|
|
|
|
|
|
|
|
meta: { |
|
|
|
|
|
pickOrderCode: string; |
|
|
|
|
|
itemCode: string; |
|
|
|
|
|
itemName: string; |
|
|
|
|
|
totalAvailableQty?: number; |
|
|
|
|
|
}, |
|
|
) => { |
|
|
) => { |
|
|
if (!userId || pickOrderLineId <= 0) return; |
|
|
if (!userId || pickOrderLineId <= 0) return; |
|
|
setLoading(true); |
|
|
setLoading(true); |
|
|
@@ -526,6 +542,7 @@ const WorkbenchPickExecution: React.FC<Props> = ({ filterArgs }) => { |
|
|
pickOrderCode: meta.pickOrderCode, |
|
|
pickOrderCode: meta.pickOrderCode, |
|
|
itemCode: meta.itemCode, |
|
|
itemCode: meta.itemCode, |
|
|
itemName: meta.itemName, |
|
|
itemName: meta.itemName, |
|
|
|
|
|
totalAvailableQty: meta.totalAvailableQty, |
|
|
}), |
|
|
}), |
|
|
); |
|
|
); |
|
|
setQtyEditableBySolId({}); |
|
|
setQtyEditableBySolId({}); |
|
|
@@ -704,7 +721,12 @@ const WorkbenchPickExecution: React.FC<Props> = ({ filterArgs }) => { |
|
|
} |
|
|
} |
|
|
setSelectedPickOrderLineId(row.pickOrderLineId); |
|
|
setSelectedPickOrderLineId(row.pickOrderLineId); |
|
|
setSelectedPickOrderId(row.pickOrderId); |
|
|
setSelectedPickOrderId(row.pickOrderId); |
|
|
setSelectedTopMeta({ pickOrderCode: row.pickOrderCode, itemCode: row.itemCode, itemName: row.itemName }); |
|
|
|
|
|
|
|
|
setSelectedTopMeta({ |
|
|
|
|
|
pickOrderCode: row.pickOrderCode, |
|
|
|
|
|
itemCode: row.itemCode, |
|
|
|
|
|
itemName: row.itemName, |
|
|
|
|
|
totalAvailableQty: row.currentStock, |
|
|
|
|
|
}); |
|
|
setLotRows([]); |
|
|
setLotRows([]); |
|
|
setQtyBySolId({}); |
|
|
setQtyBySolId({}); |
|
|
setQtyEditableBySolId({}); |
|
|
setQtyEditableBySolId({}); |
|
|
@@ -714,6 +736,7 @@ const WorkbenchPickExecution: React.FC<Props> = ({ filterArgs }) => { |
|
|
pickOrderCode: row.pickOrderCode, |
|
|
pickOrderCode: row.pickOrderCode, |
|
|
itemCode: row.itemCode, |
|
|
itemCode: row.itemCode, |
|
|
itemName: row.itemName, |
|
|
itemName: row.itemName, |
|
|
|
|
|
totalAvailableQty: row.currentStock, |
|
|
}); |
|
|
}); |
|
|
}, |
|
|
}, |
|
|
[loadLineDetailV2, selectedPickOrderLineId], |
|
|
[loadLineDetailV2, selectedPickOrderLineId], |
|
|
@@ -1383,7 +1406,7 @@ const WorkbenchPickExecution: React.FC<Props> = ({ filterArgs }) => { |
|
|
<TableCell align="right">{row.pickedQty.toLocaleString()}</TableCell> |
|
|
<TableCell align="right">{row.pickedQty.toLocaleString()}</TableCell> |
|
|
<TableCell>{row.stockUnit || "-"}</TableCell> |
|
|
<TableCell>{row.stockUnit || "-"}</TableCell> |
|
|
<TableCell>{safeDisplayTargetDate(row.targetDate)}</TableCell> |
|
|
<TableCell>{safeDisplayTargetDate(row.targetDate)}</TableCell> |
|
|
<TableCell>{row.status || "-"}</TableCell> |
|
|
|
|
|
|
|
|
<TableCell>{t(row.status || "-")}</TableCell> |
|
|
</TableRow> |
|
|
</TableRow> |
|
|
)) |
|
|
)) |
|
|
)} |
|
|
)} |
|
|
@@ -1476,7 +1499,11 @@ const WorkbenchPickExecution: React.FC<Props> = ({ filterArgs }) => { |
|
|
</Stack> |
|
|
</Stack> |
|
|
</TableCell> |
|
|
</TableCell> |
|
|
<TableCell align="right">{`${r.requiredQty.toLocaleString()}(${r.uomDesc || ""})`}</TableCell> |
|
|
<TableCell align="right">{`${r.requiredQty.toLocaleString()}(${r.uomDesc || ""})`}</TableCell> |
|
|
<TableCell align="right">{`${r.availableQty.toLocaleString()}(${r.uomDesc || ""})`}</TableCell> |
|
|
|
|
|
|
|
|
<TableCell align="right"> |
|
|
|
|
|
{`${Number( |
|
|
|
|
|
r.itemTotalAvailableQty ?? r.availableQty ?? 0, |
|
|
|
|
|
).toLocaleString()}(${r.uomDesc || ""})`} |
|
|
|
|
|
</TableCell> |
|
|
<TableCell align="center"> |
|
|
<TableCell align="center"> |
|
|
<Checkbox |
|
|
<Checkbox |
|
|
checked={isCompletedStatus(r.status) || isCheckedStatus(r.status)} |
|
|
checked={isCompletedStatus(r.status) || isCheckedStatus(r.status)} |
|
|
|