Просмотр исходного кода

PO 收貨 UI and 超量警告

fix負數倉
CANCERYS\kw093 1 неделю назад
Родитель
Сommit
79ccf5ae6f
8 измененных файлов: 43 добавлений и 19 удалений
  1. +2
    -2
      src/app/(main)/po/edit/page.tsx
  2. +30
    -7
      src/components/PoDetail/PoDetail.tsx
  3. +1
    -1
      src/components/PoDetail/PoInputGrid.tsx
  4. +1
    -1
      src/components/PoDetail/QcStockInModal.tsx
  5. +6
    -5
      src/components/PoSearch/PoSearch.tsx
  6. +1
    -1
      src/components/Qc/QcStockInModal.tsx
  7. +1
    -1
      src/i18n/en/purchaseOrder.json
  8. +1
    -1
      src/i18n/zh/purchaseOrder.json

+ 2
- 2
src/app/(main)/po/edit/page.tsx Просмотреть файл

@@ -16,11 +16,11 @@ type Props = {} & SearchParams;
const PoEdit: React.FC<Props> = async ({ searchParams }) => {
const type = "purchaseOrder";
const { t } = await getServerI18n(type);
console.log(searchParams["id"]);
//console.log(searchParams["id"]);
const id = isString(searchParams["id"])
? parseInt(searchParams["id"])
: undefined;
console.log(id);
//console.log(id);
if (!id) {
notFound();
}


+ 30
- 7
src/components/PoDetail/PoDetail.tsx Просмотреть файл

@@ -253,7 +253,7 @@ interface PolInputResult {
dnQty: string,
}

/** FP-MTMS Version Checklist | Functions Ref. No. 56 | v1.0.1 | 2026-08-12 */
/** FP-MTMS Version Checklist | Functions Ref. No. 56 | v1.0.2 | 2026-09-07 */
const PoDetail: React.FC<Props> = ({ po, warehouse, printerCombo }) => {
const cameras = useContext(CameraContext);
const { data: session } = useSession();
@@ -678,11 +678,29 @@ const PoDetail: React.FC<Props> = ({ po, warehouse, printerCombo }) => {
}, 200);
};
const exceedOrderBy10Percent = orderQty > 0 && acceptedQty > orderQty * 1.1;
if (exceedOrderBy10Percent) {
const sils = row.stockInLine ?? [];
const alreadyM18 = sils.reduce(
(acc, sil) => acc + Number(sil.purchaseAcceptedQty ?? 0),
0,
);
const alreadyStock = sils.reduce(
(acc, sil) => acc + Number(sil.acceptedQty ?? 0),
0,
);
const stockDemand = Number(row.stockUom?.stockQty ?? 0);
const thisBatchStock =
orderQty > 0 && stockDemand > 0
? acceptedQty * (stockDemand / orderQty)
: acceptedQty;
const exceedByOrderUnit =
orderQty > 0 && alreadyM18 + acceptedQty > orderQty * 1.1;
const exceedByStockUnit =
stockDemand > 0 &&
alreadyStock + thisBatchStock > stockDemand * 1.1;
if (exceedByOrderUnit || exceedByStockUnit) {
submitDialogWithWarning(doSubmit, t, {
title: t("Confirm submit"),
html: t("This batch quantity exceeds order quantity. Do you still want to submit?"),
html: t("qtyExceedsOrderConfirm"),
confirmButtonText: t("Submit"),
});
} else {
@@ -834,6 +852,11 @@ const PoDetail: React.FC<Props> = ({ po, warehouse, printerCombo }) => {
<TableCell align="center">
<Button
variant="contained"
onMouseDown={(e) => {
// Keep input focused so onBlur does not remount this row and swallow the click.
e.preventDefault();
e.stopPropagation();
}}
onClick={(e) => {
e.stopPropagation();
handleStart();
@@ -998,7 +1021,7 @@ const PoDetail: React.FC<Props> = ({ po, warehouse, printerCombo }) => {
<>
<Stack spacing={2}>
{/* Area1: title */}
<Grid container xs={12} justifyContent="start">
<Grid container justifyContent="start">
<Grid item>
<Typography mb={2} variant="h4">
{purchaseOrder.code} -{" "}
@@ -1153,7 +1176,7 @@ const PoDetail: React.FC<Props> = ({ po, warehouse, printerCombo }) => {


{/* Area4: Main Table */}
<Grid container xs={12} justifyContent="start">
<Grid container justifyContent="start">
<Grid item xs={12}>
<TableContainer component={Paper} sx={{ width: 'fit-content', overflow: 'auto' }}>
<Table aria-label="collapsible table" stickyHeader>
@@ -1187,7 +1210,7 @@ const PoDetail: React.FC<Props> = ({ po, warehouse, printerCombo }) => {
</Grid>

{/* area5: selected item info */}
<Grid container xs={12} justifyContent="start">
<Grid container justifyContent="start">
<Grid item xs={12}>
<Typography variant="h6">
{selectedRow ? `已選擇貨品: ${selectedRow?.itemNo ? selectedRow.itemNo : 'N/A'} - ${selectedRow?.itemName ? selectedRow?.itemName : 'N/A'}` : "未選擇貨品"}


+ 1
- 1
src/components/PoDetail/PoInputGrid.tsx Просмотреть файл

@@ -170,7 +170,7 @@ class ProcessRowUpdateError extends Error {
}
}

/** FP-MTMS Version Checklist | Functions Ref. No. 56 | v1.0.1 | 2026-08-12 */
/** FP-MTMS Version Checklist | Functions Ref. No. 56 | v1.0.2 | 2026-09-07 */
function PoInputGrid({
// qc,
setRows,


+ 1
- 1
src/components/PoDetail/QcStockInModal.tsx Просмотреть файл

@@ -71,7 +71,7 @@ interface CommonProps extends Omit<ModalProps, "children"> {
interface Props extends CommonProps {
// itemDetail: StockInLine & { qcResult?: PurchaseQcResult[] } & { escResult?: EscalationResult[] };
}
/** FP-MTMS Version Checklist | Functions Ref. No. 56 | v1.0.1 | 2026-08-12 */
/** FP-MTMS Version Checklist | Functions Ref. No. 56 | v1.0.2 | 2026-09-07 */
const PoQcStockInModalVer2: React.FC<Props> = ({
open,
onClose,


+ 6
- 5
src/components/PoSearch/PoSearch.tsx Просмотреть файл

@@ -29,6 +29,7 @@ type SearchParamNames = keyof SearchQuery;

// cal offset (pageSize)
// cal limit (pageSize)
/** FP-MTMS Version Checklist | Functions Ref. No. 76 | v1.0.0 | 2026-09-07 */
const PoSearch: React.FC<Props> = ({
po,
totalCount: initTotalCount,
@@ -150,7 +151,7 @@ const PoSearch: React.FC<Props> = ({
return <Grid>"N/A"</Grid>
}
const items = value.split(",")
return items.map((item) => <Grid key={item}>{item}</Grid>)
return items.map((item, index) => <Grid key={`${index}-${item}`}>{item}</Grid>)
}, [])

const columns = useMemo<Column<PoResult>[]>(
@@ -272,8 +273,8 @@ const PoSearch: React.FC<Props> = ({
pagingController: Record<string, number>,
filterArgs: Record<string, number>,
) => {
console.log(pagingController);
console.log(filterArgs);
// console.log(pagingController);
//console.log(filterArgs);
const params = {
...pagingController,
...filterArgs,
@@ -379,7 +380,7 @@ const PoSearch: React.FC<Props> = ({
);

useEffect(() => {
console.log(filteredPo)
//console.log(filteredPo)
}, [filteredPo])

useEffect(() => {
@@ -404,7 +405,7 @@ const PoSearch: React.FC<Props> = ({
disabled={isM18LookupLoading}
onSearch={(query) => {
if (isM18LookupLoading) return;
console.log(query);
//console.log(query);
const code = typeof query.code === "string" ? query.code.trim() : "";
if (code) {
// When PO code is provided, ignore other search criteria (especially date ranges).


+ 1
- 1
src/components/Qc/QcStockInModal.tsx Просмотреть файл

@@ -72,7 +72,7 @@ interface Props extends CommonProps {
// itemDetail: StockInLine & { qcResult?: PurchaseQcResult[] } & { escResult?: EscalationResult[] };
}

/** FP-MTMS Version Checklist | Functions Ref. No. 56 | v1.0.1 | 2026-08-12 */
/** FP-MTMS Version Checklist | Functions Ref. No. 56 | v1.0.2 | 2026-09-07 */
const QcStockInModal: React.FC<Props> = ({
open,
onClose,


+ 1
- 1
src/i18n/en/purchaseOrder.json Просмотреть файл

@@ -51,7 +51,7 @@
"acceptedPutawayQty": "Put Away Qty (This Batch)",
"putawayQty": "Put Away Qty",
"Confirm submit": "Confirm Submit",
"This batch quantity exceeds order quantity. Do you still want to submit?": "This batch quantity exceeds order quantity. Do you still want to submit?",
"qtyExceedsOrderConfirm": "Cumulative received quantity exceeds order quantity. Do you still want to submit?",
"acceptQty": "Accept Qty",
"printQty": "Print Qty",
"qcResult": "QC Result",


+ 1
- 1
src/i18n/zh/purchaseOrder.json Просмотреть файл

@@ -51,7 +51,7 @@
"acceptedPutawayQty": "本批上架數量",
"putawayQty": "上架數量",
"Confirm submit": "確定提交",
"This batch quantity exceeds order quantity. Do you still want to submit?": "本批收貨數量超出訂單數量。仍要提交嗎?",
"qtyExceedsOrderConfirm": "累計收貨數量超出訂單數量。仍要提交嗎?",
"acceptQty": "揀收數量",
"printQty": "列印數量",
"qcResult": "品檢結果",


Загрузка…
Отмена
Сохранить