@@ -2,6 +2,7 @@ import { cache } from "react"; | |||||
import "server-only"; | import "server-only"; | ||||
import { serverFetchJson } from "@/app/utils/fetchUtil"; | import { serverFetchJson } from "@/app/utils/fetchUtil"; | ||||
import { BASE_API_URL } from "@/config/api"; | import { BASE_API_URL } from "@/config/api"; | ||||
import { Uom } from "../settings/uom"; | |||||
export interface PoResult { | export interface PoResult { | ||||
id: number | id: number | ||||
@@ -21,7 +22,7 @@ export interface PurchaseOrderLine { | |||||
itemName: string | itemName: string | ||||
qty: number | qty: number | ||||
processed: number | processed: number | ||||
uom?: string | |||||
uom: Uom | |||||
price: number | price: number | ||||
status: string | status: string | ||||
stockInLine: StockInLine[] | stockInLine: StockInLine[] | ||||
@@ -35,6 +36,7 @@ export interface StockInLine { | |||||
itemId: number | itemId: number | ||||
itemNo: string | itemNo: string | ||||
itemName: string | itemName: string | ||||
itemType: string | |||||
demandQty: number | demandQty: number | ||||
acceptedQty: number | acceptedQty: number | ||||
price: number | price: number | ||||
@@ -45,6 +47,7 @@ export interface StockInLine { | |||||
supplier: string | supplier: string | ||||
lotNo: string | lotNo: string | ||||
poCode: string | poCode: string | ||||
uom: Uom | |||||
} | } | ||||
export const fetchPoList = cache(async () => { | export const fetchPoList = cache(async () => { | ||||
@@ -0,0 +1,20 @@ | |||||
import { cache } from "react"; | |||||
import "server-only"; | |||||
import { serverFetchJson } from "@/app/utils/fetchUtil"; | |||||
import { BASE_API_URL } from "@/config/api"; | |||||
export interface Uom { | |||||
id: number | |||||
code: string | |||||
name: string | |||||
unit1: string | |||||
unit1Qty: number | |||||
unit2?: string | |||||
unit2Qty: number | |||||
unit3?: string | |||||
unit3Qty: number | |||||
unit4?: string | |||||
unit4Qty: number | |||||
sizeInGram: number | |||||
gramPerSmallestUnit: number | |||||
} |
@@ -1,3 +1,5 @@ | |||||
import { Uom } from "../api/settings/uom"; | |||||
export const manhourFormatter = new Intl.NumberFormat("en-HK", { | export const manhourFormatter = new Intl.NumberFormat("en-HK", { | ||||
minimumFractionDigits: 2, | minimumFractionDigits: 2, | ||||
maximumFractionDigits: 2, | maximumFractionDigits: 2, | ||||
@@ -27,4 +29,13 @@ export const stockInLineStatusMap: { [status: string]: number } = { | |||||
"received": 7, | "received": 7, | ||||
"completed": 8, | "completed": 8, | ||||
"rejected": 9, | "rejected": 9, | ||||
}; | |||||
}; | |||||
export const calculateWeight = (qty: number, uom: Uom) => { | |||||
return qty * (uom.unit2Qty || 1) * (uom.unit3Qty || 1) * (uom.unit4Qty || 1); | |||||
} | |||||
export const returnWeightUnit = (uom: Uom) => { | |||||
return uom.unit4 || uom.unit3 || uom.unit2 || uom.unit1; | |||||
} | |||||
@@ -41,6 +41,7 @@ import PoInputGrid from "./PoInputGrid"; | |||||
import { QcItemWithChecks } from "@/app/api/qc"; | import { QcItemWithChecks } from "@/app/api/qc"; | ||||
import { useSearchParams } from "next/navigation"; | import { useSearchParams } from "next/navigation"; | ||||
import { WarehouseResult } from "@/app/api/warehouse"; | import { WarehouseResult } from "@/app/api/warehouse"; | ||||
import { calculateWeight, returnWeightUnit } from "@/app/utils/formatUtil"; | |||||
type Props = { | type Props = { | ||||
po: PoResult; | po: PoResult; | ||||
@@ -65,7 +66,19 @@ const PoDetail: React.FC<Props> = ({ po, qc, warehouse }) => { | |||||
const { row } = props; | const { row } = props; | ||||
const [open, setOpen] = useState(false); | const [open, setOpen] = useState(false); | ||||
const [processedQty, setProcessedQty] = useState(row.processed); | const [processedQty, setProcessedQty] = useState(row.processed); | ||||
const [currStatus, setCurrStatus] = useState(row.status); | |||||
useEffect(() => { | |||||
if (processedQty === row.qty) { | |||||
setCurrStatus("completed".toUpperCase()); | |||||
} else if (processedQty > 0) { | |||||
setCurrStatus("receiving".toUpperCase()); | |||||
} else { | |||||
setCurrStatus("pending".toUpperCase()); | |||||
} | |||||
}, [processedQty]); | |||||
const totalWeight = useMemo(() => calculateWeight(row.qty, row.uom), []); | |||||
const weightUnit = useMemo(() => returnWeightUnit(row.uom), []); | |||||
return ( | return ( | ||||
<> | <> | ||||
<TableRow sx={{ "& > *": { borderBottom: "unset" }, color: "black" }}> | <TableRow sx={{ "& > *": { borderBottom: "unset" }, color: "black" }}> | ||||
@@ -82,14 +95,18 @@ const PoDetail: React.FC<Props> = ({ po, qc, warehouse }) => { | |||||
<TableCell align="left">{row.itemName}</TableCell> | <TableCell align="left">{row.itemName}</TableCell> | ||||
<TableCell align="left">{row.qty}</TableCell> | <TableCell align="left">{row.qty}</TableCell> | ||||
<TableCell align="left">{processedQty}</TableCell> | <TableCell align="left">{processedQty}</TableCell> | ||||
<TableCell align="left">{row.uom}</TableCell> | |||||
<TableCell align="left">{row.uom?.code}</TableCell> | |||||
<TableCell align="left"> | |||||
{totalWeight} {weightUnit} | |||||
</TableCell> | |||||
{/* <TableCell align="left">{weightUnit}</TableCell> */} | |||||
<TableCell align="left">{row.price}</TableCell> | <TableCell align="left">{row.price}</TableCell> | ||||
{/* <TableCell align="left">{row.expiryDate}</TableCell> */} | {/* <TableCell align="left">{row.expiryDate}</TableCell> */} | ||||
<TableCell align="left">{row.status}</TableCell> | |||||
<TableCell align="left">{currStatus}</TableCell> | |||||
</TableRow> | </TableRow> | ||||
<TableRow> | <TableRow> | ||||
{/* <TableCell /> */} | |||||
<TableCell style={{ paddingBottom: 0, paddingTop: 0}} colSpan={12}> | |||||
{/* <TableCell /> */} | |||||
<TableCell style={{ paddingBottom: 0, paddingTop: 0 }} colSpan={12}> | |||||
<Collapse in={open} timeout="auto" unmountOnExit> | <Collapse in={open} timeout="auto" unmountOnExit> | ||||
<Table> | <Table> | ||||
<TableBody> | <TableBody> | ||||
@@ -139,6 +156,8 @@ const PoDetail: React.FC<Props> = ({ po, qc, warehouse }) => { | |||||
<TableCell align="left">{t("qty")}</TableCell> | <TableCell align="left">{t("qty")}</TableCell> | ||||
<TableCell align="left">processed</TableCell> | <TableCell align="left">processed</TableCell> | ||||
<TableCell align="left">{t("uom")}</TableCell> | <TableCell align="left">{t("uom")}</TableCell> | ||||
<TableCell align="left">{t("total weight")}</TableCell> | |||||
{/* <TableCell align="left">{t("weight unit")}</TableCell> */} | |||||
<TableCell align="left">{t("price")}</TableCell> | <TableCell align="left">{t("price")}</TableCell> | ||||
{/* <TableCell align="left">{t("expiryDate")}</TableCell> */} | {/* <TableCell align="left">{t("expiryDate")}</TableCell> */} | ||||
<TableCell align="left">{t("status")}</TableCell> | <TableCell align="left">{t("status")}</TableCell> | ||||
@@ -35,7 +35,7 @@ import PlayArrowIcon from "@mui/icons-material/PlayArrow"; | |||||
import { PurchaseOrderLine, StockInLine } from "@/app/api/po"; | import { PurchaseOrderLine, StockInLine } from "@/app/api/po"; | ||||
import { createStockInLine, testFetch } from "@/app/api/po/actions"; | import { createStockInLine, testFetch } from "@/app/api/po/actions"; | ||||
import { useSearchParams } from "next/navigation"; | import { useSearchParams } from "next/navigation"; | ||||
import { stockInLineStatusMap } from "@/app/utils/formatUtil"; | |||||
import { returnWeightUnit, calculateWeight, stockInLineStatusMap } from "@/app/utils/formatUtil"; | |||||
import PoQcStockInModal from "./PoQcStockInModal"; | import PoQcStockInModal from "./PoQcStockInModal"; | ||||
import NotificationImportantIcon from "@mui/icons-material/NotificationImportant"; | import NotificationImportantIcon from "@mui/icons-material/NotificationImportant"; | ||||
import { WarehouseResult } from "@/app/api/warehouse"; | import { WarehouseResult } from "@/app/api/warehouse"; | ||||
@@ -43,7 +43,7 @@ import LooksOneIcon from '@mui/icons-material/LooksOne'; | |||||
import LooksTwoIcon from '@mui/icons-material/LooksTwo'; | import LooksTwoIcon from '@mui/icons-material/LooksTwo'; | ||||
import Looks3Icon from '@mui/icons-material/Looks3'; | import Looks3Icon from '@mui/icons-material/Looks3'; | ||||
import axiosInstance from "@/app/(main)/axios/axiosInstance"; | import axiosInstance from "@/app/(main)/axios/axiosInstance"; | ||||
import axios, { AxiosRequestConfig } from "axios"; | |||||
// import axios, { AxiosRequestConfig } from "axios"; | |||||
import { NEXT_PUBLIC_API_URL } from "@/config/api"; | import { NEXT_PUBLIC_API_URL } from "@/config/api"; | ||||
import qs from 'qs'; | import qs from 'qs'; | ||||
import QrCodeIcon from '@mui/icons-material/QrCode'; | import QrCodeIcon from '@mui/icons-material/QrCode'; | ||||
@@ -172,11 +172,12 @@ function PoInputGrid({ | |||||
const fetchQcDefaultValue = useCallback(async () => { | const fetchQcDefaultValue = useCallback(async () => { | ||||
const authHeader = axiosInstance.defaults.headers['Authorization']; | const authHeader = axiosInstance.defaults.headers['Authorization']; | ||||
if (!authHeader) { | if (!authHeader) { | ||||
return; // Exit the function if the token is not set | |||||
return; // Exit the function if the token is not set | |||||
} | } | ||||
const res = await axios.get<QcItemWithChecks[]>(`${NEXT_PUBLIC_API_URL}/qcResult/${itemDetail.id}`) | |||||
console.log(authHeader) | |||||
const res = await axiosInstance.get<QcItemWithChecks[]>(`${NEXT_PUBLIC_API_URL}/qcResult/${itemDetail.id}`) | |||||
console.log(res) | console.log(res) | ||||
}, [axiosInstance, axios]) | |||||
}, [axiosInstance]) | |||||
const handleQC = useCallback( | const handleQC = useCallback( | ||||
(id: GridRowId, params: any) => async () => { | (id: GridRowId, params: any) => async () => { | ||||
@@ -320,6 +321,24 @@ function PoInputGrid({ | |||||
editable: true, | editable: true, | ||||
// replace with tooltip + content | // replace with tooltip + content | ||||
}, | }, | ||||
{ | |||||
field: "uom", | |||||
headerName: "uom", | |||||
flex: 0.5, | |||||
renderCell: (params) => { | |||||
return params.row.uom.code; | |||||
}, | |||||
}, | |||||
{ | |||||
field: "weight", | |||||
headerName: "weight", | |||||
flex: 0.5, | |||||
renderCell: (params) => { | |||||
const weight = calculateWeight(params.row.acceptedQty, params.row.uom); | |||||
const weightUnit = returnWeightUnit(params.row.uom); | |||||
return `${weight} ${weightUnit}`; | |||||
}, | |||||
}, | |||||
{ | { | ||||
field: "status", | field: "status", | ||||
flex: 0.5, | flex: 0.5, | ||||
@@ -329,7 +348,7 @@ function PoInputGrid({ | |||||
field: "actions", | field: "actions", | ||||
type: "actions", | type: "actions", | ||||
headerName: "start | qc | escalation | stock in | putaway | delete", | headerName: "start | qc | escalation | stock in | putaway | delete", | ||||
flex: 1.5, | |||||
flex: 1, | |||||
cellClassName: "actions", | cellClassName: "actions", | ||||
getActions: (params) => { | getActions: (params) => { | ||||
console.log(params.row.status); | console.log(params.row.status); | ||||
@@ -357,9 +376,7 @@ function PoInputGrid({ | |||||
// marginRight: 1, | // marginRight: 1, | ||||
}} | }} | ||||
disabled={ | disabled={ | ||||
// stockInLineStatusMap[status] <= 0 || | |||||
// stockInLineStatusMap[status] >= 5 | |||||
stockInLineStatusMap[status] != 1 | |||||
stockInLineStatusMap[status] < 1 | |||||
} | } | ||||
// set _isNew to false after posting | // set _isNew to false after posting | ||||
// or check status | // or check status | ||||
@@ -405,7 +422,7 @@ function PoInputGrid({ | |||||
color: "primary.main", | color: "primary.main", | ||||
// marginRight: 1, | // marginRight: 1, | ||||
}} | }} | ||||
disabled={stockInLineStatusMap[status] !== 7} | |||||
disabled={stockInLineStatusMap[status] < 7} | |||||
// set _isNew to false after posting | // set _isNew to false after posting | ||||
// or check status | // or check status | ||||
onClick={handlePutAway(params.row.id, params)} | onClick={handlePutAway(params.row.id, params)} | ||||
@@ -446,6 +463,7 @@ function PoInputGrid({ | |||||
); | ); | ||||
const addRow = useCallback(() => { | const addRow = useCallback(() => { | ||||
console.log(itemDetail) | |||||
const newEntry = { | const newEntry = { | ||||
id: Date.now(), | id: Date.now(), | ||||
_isNew: true, | _isNew: true, | ||||
@@ -455,6 +473,7 @@ function PoInputGrid({ | |||||
itemNo: itemDetail.itemNo, | itemNo: itemDetail.itemNo, | ||||
itemName: itemDetail.itemName, | itemName: itemDetail.itemName, | ||||
acceptedQty: itemDetail.qty - currQty, // this bug | acceptedQty: itemDetail.qty - currQty, // this bug | ||||
uom: itemDetail.uom, | |||||
status: "draft", | status: "draft", | ||||
}; | }; | ||||
setEntries((e) => [...e, newEntry]); | setEntries((e) => [...e, newEntry]); | ||||
@@ -14,6 +14,7 @@ import { StockInLineRow } from "./PoInputGrid"; | |||||
import EscalationForm from "./EscalationForm"; | import EscalationForm from "./EscalationForm"; | ||||
import StockInForm from "./StockInForm"; | import StockInForm from "./StockInForm"; | ||||
import PutawayForm from "./PutawayForm"; | import PutawayForm from "./PutawayForm"; | ||||
import { stockInLineStatusMap } from "@/app/utils/formatUtil"; | |||||
interface CommonProps extends Omit<ModalProps, "children"> { | interface CommonProps extends Omit<ModalProps, "children"> { | ||||
setEntries: Dispatch<SetStateAction<StockInLineRow[]>> | setEntries: Dispatch<SetStateAction<StockInLineRow[]>> | ||||
@@ -88,7 +89,6 @@ const PoQcStockInModal: React.FC<Props> = ({ | |||||
const onSubmit = useCallback<SubmitHandler<ModalFormInput & {}>>( | const onSubmit = useCallback<SubmitHandler<ModalFormInput & {}>>( | ||||
async (data, event) => { | async (data, event) => { | ||||
let hasErrors = false; | let hasErrors = false; | ||||
console.log("errors"); | |||||
console.log(errors); | console.log(errors); | ||||
console.log(data); | console.log(data); | ||||
console.log(itemDetail); | console.log(itemDetail); | ||||
@@ -105,14 +105,6 @@ const PoQcStockInModal: React.FC<Props> = ({ | |||||
if (data.qcResult) { | if (data.qcResult) { | ||||
acceptedQty = itemDetail.acceptedQty - data.qcResult.reduce((acc, curr) => acc + curr.failQty, 0) | acceptedQty = itemDetail.acceptedQty - data.qcResult.reduce((acc, curr) => acc + curr.failQty, 0) | ||||
} | } | ||||
console.log(acceptedQty) | |||||
// if (data.acceptedQty) { | |||||
// console.log("1") | |||||
// acceptedQty = parseInt(data.acceptedQty.toString()) | |||||
// } else { | |||||
// console.log("2") | |||||
// acceptedQty = data.sampleRate | |||||
// } | |||||
const args = { | const args = { | ||||
id: itemDetail.id, | id: itemDetail.id, | ||||
purchaseOrderId: parseInt(params.get("id")!!), | purchaseOrderId: parseInt(params.get("id")!!), | ||||
@@ -130,7 +122,7 @@ const PoQcStockInModal: React.FC<Props> = ({ | |||||
} | } | ||||
const res = await updateStockInLine(args) | const res = await updateStockInLine(args) | ||||
if (Boolean(res.id)) { | if (Boolean(res.id)) { | ||||
// set entries | |||||
// update entries | |||||
const newEntries = res.entity as StockInLine[] | const newEntries = res.entity as StockInLine[] | ||||
setEntries((prev) => { | setEntries((prev) => { | ||||
const updatedEntries = [...prev]; // Create a new array | const updatedEntries = [...prev]; // Create a new array | ||||
@@ -149,7 +141,6 @@ const PoQcStockInModal: React.FC<Props> = ({ | |||||
// add loading | // add loading | ||||
closeHandler({}, "backdropClick") | closeHandler({}, "backdropClick") | ||||
} | } | ||||
console.log(res) | console.log(res) | ||||
// if (res) | // if (res) | ||||
} catch (e) { | } catch (e) { | ||||
@@ -161,20 +152,20 @@ const PoQcStockInModal: React.FC<Props> = ({ | |||||
[t, itemDetail] | [t, itemDetail] | ||||
); | ); | ||||
const canSubmit = useMemo(() => { | |||||
if (type === "qc") { | |||||
// console.log(itemDetail.status) | |||||
return formProps.formState.isValid | |||||
} | |||||
if (type === "stockIn") { | |||||
return formProps.formState.isValid | |||||
} | |||||
if (type === "putaway") { | |||||
return formProps.formState.isValid | |||||
} | |||||
return true | |||||
const renderSubmitButton = useMemo((): Boolean => { | |||||
if (itemDetail) { | |||||
const status = itemDetail.status | |||||
switch (type) { | |||||
case "qc": | |||||
return stockInLineStatusMap[status] === 1 | |||||
case "putaway": | |||||
return stockInLineStatusMap[status] === 7 | |||||
default: | |||||
return false; // Handle unexpected type | |||||
} | |||||
} else return false | |||||
}, [type, itemDetail]) | }, [type, itemDetail]) | ||||
console.log(canSubmit) | |||||
renderSubmitButton | |||||
return ( | return ( | ||||
<> | <> | ||||
<Modal open={open} onClose={closeHandler}> | <Modal open={open} onClose={closeHandler}> | ||||
@@ -188,17 +179,20 @@ const PoQcStockInModal: React.FC<Props> = ({ | |||||
{type === "stockIn" && <StockInForm itemDetail={itemDetail} />} | {type === "stockIn" && <StockInForm itemDetail={itemDetail} />} | ||||
{type === "escalation" && <EscalationForm itemDetail={itemDetail} />} | {type === "escalation" && <EscalationForm itemDetail={itemDetail} />} | ||||
{type === "putaway" && <PutawayForm itemDetail={itemDetail} warehouse={warehouse} />} | {type === "putaway" && <PutawayForm itemDetail={itemDetail} warehouse={warehouse} />} | ||||
<Stack direction="row" justifyContent="flex-end" gap={1}> | |||||
<Button | |||||
name="submit" | |||||
variant="contained" | |||||
startIcon={<Check />} | |||||
type="submit" | |||||
// disabled={submitDisabled} | |||||
> | |||||
{t("submit")} | |||||
</Button> | |||||
</Stack> | |||||
{renderSubmitButton ? ( | |||||
<Stack direction="row" justifyContent="flex-end" gap={1}> | |||||
<Button | |||||
name="submit" | |||||
variant="contained" | |||||
startIcon={<Check />} | |||||
type="submit" | |||||
// disabled={submitDisabled} | |||||
> | |||||
{t("submit")} | |||||
</Button> | |||||
</Stack> | |||||
) : undefined | |||||
} | |||||
</Box> | </Box> | ||||
</FormProvider> | </FormProvider> | ||||
</Modal> | </Modal> | ||||
@@ -35,6 +35,8 @@ import { GridEditInputCell } from "@mui/x-data-grid"; | |||||
import { StockInLine } from "@/app/api/po"; | import { StockInLine } from "@/app/api/po"; | ||||
import { WarehouseResult } from "@/app/api/warehouse"; | import { WarehouseResult } from "@/app/api/warehouse"; | ||||
import { stockInLineStatusMap } from "@/app/utils/formatUtil"; | import { stockInLineStatusMap } from "@/app/utils/formatUtil"; | ||||
import { QRCodeSVG } from 'qrcode.react'; | |||||
import { QrCode } from "../QrCode"; | |||||
interface Props { | interface Props { | ||||
itemDetail: StockInLine; | itemDetail: StockInLine; | ||||
@@ -106,6 +108,15 @@ const PutawayForm: React.FC<Props> = ({ itemDetail, warehouse }) => { | |||||
[] | [] | ||||
); | ); | ||||
const qrContent = useMemo(() => ({ | |||||
itemId: itemDetail.itemId, | |||||
lotNo: itemDetail.lotNo, | |||||
// expiryDate: itemDetail.expiryDate, | |||||
// productionDate: itemDetail.productionDate, | |||||
// supplier: itemDetail.supplier, | |||||
// poCode: itemDetail.poCode, | |||||
}),[itemDetail]) | |||||
useEffect(() => { | useEffect(() => { | ||||
setValue("status", "completed") | setValue("status", "completed") | ||||
}, []) | }, []) | ||||
@@ -197,6 +208,7 @@ const PutawayForm: React.FC<Props> = ({ itemDetail, warehouse }) => { | |||||
max: itemDetail.acceptedQty, | max: itemDetail.acceptedQty, | ||||
valueAsNumber: true, | valueAsNumber: true, | ||||
})} | })} | ||||
defaultValue={itemDetail.acceptedQty} | |||||
error={Boolean(errors.acceptedQty)} | error={Boolean(errors.acceptedQty)} | ||||
helperText={errors.acceptedQty?.message} | helperText={errors.acceptedQty?.message} | ||||
/> | /> | ||||
@@ -215,6 +227,9 @@ const PutawayForm: React.FC<Props> = ({ itemDetail, warehouse }) => { | |||||
/> | /> | ||||
</FormControl> | </FormControl> | ||||
</Grid> | </Grid> | ||||
<Grid item xs={12} style={{ display: 'flex', justifyContent: 'center' }}> | |||||
<QrCode content={qrContent} sx={{width: 200, height: 200}}/> | |||||
</Grid> | |||||
</Grid> | </Grid> | ||||
<Grid | <Grid | ||||
container | container | ||||
@@ -67,21 +67,21 @@ const QcForm: React.FC<Props> = ({ qc, itemDetail }) => { | |||||
console.log(itemDetail); | console.log(itemDetail); | ||||
// const [qc, setQc] = useState<QcItemWithChecks[]>([]) | // const [qc, setQc] = useState<QcItemWithChecks[]>([]) | ||||
// const fetchQcCheck = useCallback(async () => { | |||||
// const authHeader = axiosInstance.defaults.headers['Authorization']; | |||||
// if (!authHeader) { | |||||
// return; // Exit the function if the token is not set | |||||
// } | |||||
// const params = { | |||||
// itemId: itemDetail.itemId | |||||
// } | |||||
// console.log(params) | |||||
// const res = await axios.get<QcItemWithChecks[]>(`${NEXT_PUBLIC_API_URL}/qcCheck`, { params }) | |||||
// console.log(res) | |||||
// }, [axios]) | |||||
// useEffect(() => { | |||||
// fetchQcCheck() | |||||
// }, [fetchQcCheck]) | |||||
const fetchQcCheck = useCallback(async () => { | |||||
const authHeader = axiosInstance.defaults.headers['Authorization']; | |||||
if (!authHeader) { | |||||
return; // Exit the function if the token is not set | |||||
} | |||||
const params = { | |||||
itemId: itemDetail.itemId | |||||
} | |||||
console.log(params) | |||||
const res = await axios.get<QcItemWithChecks[]>(`${NEXT_PUBLIC_API_URL}/qcCheck`, { params }) | |||||
console.log(res) | |||||
}, [axios]) | |||||
useEffect(() => { | |||||
fetchQcCheck() | |||||
}, [fetchQcCheck]) | |||||
const [recordQty, setRecordQty] = useState(0); | const [recordQty, setRecordQty] = useState(0); | ||||
const columns = useMemo<GridColDef[]>( | const columns = useMemo<GridColDef[]>( | ||||
@@ -0,0 +1,15 @@ | |||||
"use client" | |||||
import { QRCodeSVG } from 'qrcode.react'; | |||||
import { CSSProperties } from 'react'; | |||||
interface Props { | |||||
content: any; | |||||
sx?: CSSProperties; | |||||
} | |||||
export default function QrCode({ content, sx }: Props) { | |||||
console.log(content); | |||||
const jsonStr = JSON.stringify(content); | |||||
return <QRCodeSVG value={jsonStr} style={sx} />; | |||||
} |
@@ -0,0 +1 @@ | |||||
export {default as QrCode} from "./QrCode" |
@@ -1,17 +1,21 @@ | |||||
import { fetchAllItems, } from "@/app/api/settings/item"; | |||||
import {RoughScheduleLoading} from "./RoughScheduleLoading"; | |||||
import { fetchAllItems } from "@/app/api/settings/item"; | |||||
import { RoughScheduleLoading } from "./RoughScheduleLoading"; | |||||
import RSOverview from "./RoughSchedileSearchView"; | import RSOverview from "./RoughSchedileSearchView"; | ||||
interface SubComponents { | interface SubComponents { | ||||
Loading: typeof RoughScheduleLoading; | |||||
Loading: typeof RoughScheduleLoading; | |||||
} | } | ||||
const RoughScheduleWrapper: ({}: {}) => Promise<JSX.Element> = async ({ | |||||
// type, | |||||
}) => { | |||||
// console.log(type) | |||||
var result = await fetchAllItems() | |||||
return <RSOverview records={result} />; | |||||
type Props = {}; | |||||
const RoughScheduleWrapper: React.FC<Props> & SubComponents = async ( | |||||
{ | |||||
// type, | |||||
} | |||||
) => { | |||||
// console.log(type) | |||||
var result = await fetchAllItems(); | |||||
return <RSOverview records={[]} />; | |||||
}; | }; | ||||
RoughScheduleWrapper.Loading = RoughScheduleLoading; | RoughScheduleWrapper.Loading = RoughScheduleLoading; | ||||