|
|
@@ -1,5 +1,6 @@ |
|
|
"use client"; |
|
|
"use client"; |
|
|
|
|
|
|
|
|
|
|
|
import dayjs from "dayjs"; |
|
|
|
|
|
import { OUTPUT_DATE_FORMAT } from "@/app/utils/formatUtil"; |
|
|
import SearchBox, { Criterion } from "../SearchBox"; |
|
|
import SearchBox, { Criterion } from "../SearchBox"; |
|
|
import { useCallback, useMemo, useState } from "react"; |
|
|
import { useCallback, useMemo, useState } from "react"; |
|
|
import { useTranslation } from "react-i18next"; |
|
|
import { useTranslation } from "react-i18next"; |
|
|
@@ -52,7 +53,7 @@ const SearchPage: React.FC<Props> = ({ dataList }) => { |
|
|
const [selectedIds, setSelectedIds] = useState<(string | number)[]>([]); |
|
|
const [selectedIds, setSelectedIds] = useState<(string | number)[]>([]); |
|
|
const [submittingIds, setSubmittingIds] = useState<Set<number>>(new Set()); |
|
|
const [submittingIds, setSubmittingIds] = useState<Set<number>>(new Set()); |
|
|
const [batchSubmitting, setBatchSubmitting] = useState(false); |
|
|
const [batchSubmitting, setBatchSubmitting] = useState(false); |
|
|
|
|
|
|
|
|
|
|
|
const [paging, setPaging] = useState({ pageNum: 1, pageSize: 10 }); |
|
|
const searchCriteria: Criterion<SearchParamNames>[] = useMemo( |
|
|
const searchCriteria: Criterion<SearchParamNames>[] = useMemo( |
|
|
() => [ |
|
|
() => [ |
|
|
{ |
|
|
{ |
|
|
@@ -251,7 +252,33 @@ const SearchPage: React.FC<Props> = ({ dataList }) => { |
|
|
{ name: "itemDescription", label: t("Item") }, |
|
|
{ name: "itemDescription", label: t("Item") }, |
|
|
{ name: "lotNo", label: t("Lot No.") }, |
|
|
{ name: "lotNo", label: t("Lot No.") }, |
|
|
{ name: "storeLocation", label: t("Location") }, |
|
|
{ name: "storeLocation", label: t("Location") }, |
|
|
{ name: "expiryDate", label: t("Expiry Date") }, |
|
|
|
|
|
|
|
|
{ |
|
|
|
|
|
name: "expiryDate", |
|
|
|
|
|
label: t("Expiry Date"), |
|
|
|
|
|
renderCell: (item) => { |
|
|
|
|
|
const raw = String(item.expiryDate ?? "").trim(); |
|
|
|
|
|
if (!raw) return "—"; |
|
|
|
|
|
let d; |
|
|
|
|
|
if (raw.includes(",")) { |
|
|
|
|
|
const parts = raw.split(",").map((s) => parseInt(s.trim(), 10)); |
|
|
|
|
|
const [y, m, d_] = parts; |
|
|
|
|
|
if (parts.length >= 3 && y != null && m != null && d_ != null && !Number.isNaN(y) && !Number.isNaN(m) && !Number.isNaN(d_)) { |
|
|
|
|
|
d = dayjs(new Date(y, m - 1, d_)); |
|
|
|
|
|
} else { |
|
|
|
|
|
d = dayjs(""); |
|
|
|
|
|
} |
|
|
|
|
|
} else { |
|
|
|
|
|
let normalized = raw; |
|
|
|
|
|
if (raw.length === 7) { |
|
|
|
|
|
normalized = raw.slice(0, 4) + "0" + raw.slice(4, 5) + raw.slice(5, 7); |
|
|
|
|
|
} else if (raw.length === 6) { |
|
|
|
|
|
normalized = raw.slice(0, 4) + "0" + raw.slice(4, 5) + "0" + raw.slice(5, 6); |
|
|
|
|
|
} |
|
|
|
|
|
d = dayjs(normalized, "YYYYMMDD", true); |
|
|
|
|
|
} |
|
|
|
|
|
return d.isValid() ? d.format(OUTPUT_DATE_FORMAT) : raw; |
|
|
|
|
|
}, |
|
|
|
|
|
}, |
|
|
{ name: "remainingQty", label: t("Remaining Qty") }, |
|
|
{ name: "remainingQty", label: t("Remaining Qty") }, |
|
|
{ |
|
|
{ |
|
|
name: "id", |
|
|
name: "id", |
|
|
@@ -280,6 +307,7 @@ const SearchPage: React.FC<Props> = ({ dataList }) => { |
|
|
(_: React.SyntheticEvent, value: string) => { |
|
|
(_: React.SyntheticEvent, value: string) => { |
|
|
setTab(value as "miss" | "bad" | "expiry"); |
|
|
setTab(value as "miss" | "bad" | "expiry"); |
|
|
setSelectedIds([]); |
|
|
setSelectedIds([]); |
|
|
|
|
|
setPaging((prev) => ({ ...prev, pageNum: 1 })); // 新增:切 Tab 时回到第 1 页 |
|
|
}, |
|
|
}, |
|
|
[], |
|
|
[], |
|
|
); |
|
|
); |
|
|
@@ -291,8 +319,9 @@ const SearchPage: React.FC<Props> = ({ dataList }) => { |
|
|
<SearchResults<StockIssueResult> |
|
|
<SearchResults<StockIssueResult> |
|
|
items={items} |
|
|
items={items} |
|
|
columns={missColumns} |
|
|
columns={missColumns} |
|
|
pagingController={{ pageNum: 1, pageSize: 10 }} |
|
|
|
|
|
|
|
|
pagingController={paging} |
|
|
checkboxIds={selectedIds} |
|
|
checkboxIds={selectedIds} |
|
|
|
|
|
setPagingController={setPaging} |
|
|
setCheckboxIds={setSelectedIds} |
|
|
setCheckboxIds={setSelectedIds} |
|
|
/> |
|
|
/> |
|
|
); |
|
|
); |
|
|
@@ -304,7 +333,8 @@ const SearchPage: React.FC<Props> = ({ dataList }) => { |
|
|
<SearchResults<StockIssueResult> |
|
|
<SearchResults<StockIssueResult> |
|
|
items={items} |
|
|
items={items} |
|
|
columns={badColumns} |
|
|
columns={badColumns} |
|
|
pagingController={{ pageNum: 1, pageSize: 10 }} |
|
|
|
|
|
|
|
|
pagingController={paging} |
|
|
|
|
|
setPagingController={setPaging} |
|
|
checkboxIds={selectedIds} |
|
|
checkboxIds={selectedIds} |
|
|
setCheckboxIds={setSelectedIds} |
|
|
setCheckboxIds={setSelectedIds} |
|
|
/> |
|
|
/> |
|
|
@@ -316,7 +346,8 @@ const SearchPage: React.FC<Props> = ({ dataList }) => { |
|
|
<SearchResults<ExpiryItemResult> |
|
|
<SearchResults<ExpiryItemResult> |
|
|
items={items} |
|
|
items={items} |
|
|
columns={expiryColumns} |
|
|
columns={expiryColumns} |
|
|
pagingController={{ pageNum: 1, pageSize: 10 }} |
|
|
|
|
|
|
|
|
pagingController={paging} |
|
|
|
|
|
setPagingController={setPaging} |
|
|
checkboxIds={selectedIds} |
|
|
checkboxIds={selectedIds} |
|
|
setCheckboxIds={setSelectedIds} |
|
|
setCheckboxIds={setSelectedIds} |
|
|
/> |
|
|
/> |
|
|
@@ -336,16 +367,18 @@ const SearchPage: React.FC<Props> = ({ dataList }) => { |
|
|
onSearch={handleSearch} |
|
|
onSearch={handleSearch} |
|
|
/> |
|
|
/> |
|
|
|
|
|
|
|
|
<Box sx={{ display: "flex", justifyContent: "flex-end", mb: 1 }}> |
|
|
|
|
|
<Button |
|
|
|
|
|
variant="contained" |
|
|
|
|
|
color="primary" |
|
|
|
|
|
onClick={handleSubmitSelected} |
|
|
|
|
|
disabled={batchSubmitting || !currentUserId} |
|
|
|
|
|
> |
|
|
|
|
|
{batchSubmitting ? tab === "miss" ? t("Processing...") : tab === "bad" ? t("Disposing...") : t("Disposing...") : t("Batch Disposed All")} |
|
|
|
|
|
</Button> |
|
|
|
|
|
</Box> |
|
|
|
|
|
|
|
|
{tab === "expiry" && ( |
|
|
|
|
|
<Box sx={{ display: "flex", justifyContent: "flex-end", mb: 1 }}> |
|
|
|
|
|
<Button |
|
|
|
|
|
variant="contained" |
|
|
|
|
|
color="primary" |
|
|
|
|
|
onClick={handleSubmitSelected} |
|
|
|
|
|
disabled={batchSubmitting || !currentUserId} |
|
|
|
|
|
> |
|
|
|
|
|
{batchSubmitting ? t("Disposing...") : t("Batch Disposed All")} |
|
|
|
|
|
</Button> |
|
|
|
|
|
</Box> |
|
|
|
|
|
)} |
|
|
|
|
|
|
|
|
{renderCurrentTab()} |
|
|
{renderCurrentTab()} |
|
|
<SubmitIssueForm |
|
|
<SubmitIssueForm |
|
|
|