|  |  | 
 |  |  |     TabbedShowLayout, | 
 |  |  |     useListContext, | 
 |  |  |     useRecordContext, | 
 |  |  |     useShowContext, | 
 |  |  |     useTranslate, | 
 |  |  |     useResourceContext, | 
 |  |  | } from 'react-admin'; | 
 |  |  | import { Link as RouterLink, useLocation } from 'react-router-dom'; | 
 |  |  | import { | 
 |  |  |     Box, | 
 |  |  |     Button, | 
 |  |  |     Card, | 
 |  |  |     CardContent, | 
 |  |  |     Grid, | 
 |  |  |     Skeleton, | 
 |  |  |     Stack, | 
 |  |  |     Typography, | 
 |  |  |     Divider, | 
 |  |  | } from '@mui/material'; | 
 |  |  | import { formatDistance } from 'date-fns'; | 
 |  |  | import request from '@/utils/request'; | 
 |  |  |  | 
 |  |  | const ITEM_COL = 3; | 
 |  |  | const GRID_CONTAINER_MAX_WIDTH = '100%'; | 
 |  |  |  | 
 |  |  | export const AgvShowDetail = (props) => { | 
 |  |  |     const { agvId, ...rest } = props; | 
 |  |  |  | 
 |  |  |     const dataProvider = useDataProvider(); | 
 |  |  |     const [data, setData] = useState(null); | 
 |  |  |     const { agvId, setOnline } = props; | 
 |  |  |     const [record, setRecord] = useState(null); | 
 |  |  |     const resource = useResourceContext(); | 
 |  |  |  | 
 |  |  |     useEffect(() => { | 
 |  |  |         const http = async (agvId) => { | 
 |  |  |             if (agvId) { | 
 |  |  |                 const res = await request.get(resource + '/' + agvId); | 
 |  |  |                 const { code, msg, data } = res.data; | 
 |  |  |                 if (code === 200) { | 
 |  |  |                     setOnline(data.online); | 
 |  |  |                     setRecord(data); | 
 |  |  |                 } else { | 
 |  |  |                     setRecord(null); | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |         const intervalId = setInterval(() => { | 
 |  |  |             http(agvId); | 
 |  |  |         }, 1000); | 
 |  |  |         http(agvId); | 
 |  |  |         return () => clearInterval(intervalId); | 
 |  |  |     }, [agvId]); | 
 |  |  |  | 
 |  |  |     }, []); | 
 |  |  |  | 
 |  |  |     if (!data) { | 
 |  |  |     if (!record) { | 
 |  |  |         return ( | 
 |  |  |             <Stack mt={0.5}> | 
 |  |  |                 {Array.from({ length: 5 }).map((_, index) => ( | 
 |  |  | 
 |  |  |  | 
 |  |  |     return ( | 
 |  |  |         <> | 
 |  |  |             <Card> | 
 |  |  |  | 
 |  |  |             </Card> | 
 |  |  |             <Box m={2}> | 
 |  |  |                 <AgvMainDetail record={record} /> | 
 |  |  |                 <Divider sx={{ mt: 2, mb: 2 }} /> | 
 |  |  |                 <AgvMoreDetail record={record} /> | 
 |  |  |                 <Divider sx={{ mt: 2, mb: 2 }} /> | 
 |  |  |                 <AgvModelDetail record={record} /> | 
 |  |  |             </Box> | 
 |  |  |         </> | 
 |  |  |     ) | 
 |  |  | } | 
 |  |  |  | 
 |  |  | const DetailTitle = ({ title, ...rest }) => { | 
 |  |  |     const translate = useTranslate(); | 
 |  |  |     return ( | 
 |  |  |         <Typography | 
 |  |  |             color="textSecondary" | 
 |  |  |             variant="caption" | 
 |  |  |             {...rest} | 
 |  |  |         > | 
 |  |  |             {translate(title)} | 
 |  |  |         </Typography> | 
 |  |  |     ) | 
 |  |  | } | 
 |  |  |  | 
 |  |  | const DetailValue = ({ value, fontBold = false }) => { | 
 |  |  |     return ( | 
 |  |  |         <Typography | 
 |  |  |             variant="body2" | 
 |  |  |             color={fontBold ? 'textSecondary' : 'textPrimary'} | 
 |  |  |             width='80%' | 
 |  |  |             sx={{ | 
 |  |  |                 wordWrap: 'break-word', | 
 |  |  |                 whiteSpace: 'normal', | 
 |  |  |                 fontWeight: fontBold && 'bold', | 
 |  |  |             }} | 
 |  |  |         > | 
 |  |  |             {value} | 
 |  |  |         </Typography> | 
 |  |  |     ) | 
 |  |  | } | 
 |  |  |  | 
 |  |  |  | 
 |  |  | const AgvMainDetail = ({ record }) => { | 
 |  |  |     const translate = useTranslate(); | 
 |  |  |     return ( | 
 |  |  |         <Grid container spacing={1} sx={{ maxWidth: GRID_CONTAINER_MAX_WIDTH }}> | 
 |  |  |             <Grid item xs={ITEM_COL}> | 
 |  |  |                 <DetailTitle title='common.field.status' /> | 
 |  |  |                 <DetailValue fontBold value={record.agvDetail.statusDesc} /> | 
 |  |  |             </Grid> | 
 |  |  |             <Grid item xs={ITEM_COL}> | 
 |  |  |                 <DetailTitle title='table.field.agvDetail.pos' /> | 
 |  |  |                 <DetailValue value={record.agvDetail.pos === 1 ? translate('common.enums.true') : translate('common.enums.false')} /> | 
 |  |  |             </Grid > | 
 |  |  |             <Grid item xs={ITEM_COL}> | 
 |  |  |                 <DetailTitle title='table.field.agvDetail.code' /> | 
 |  |  |                 <DetailValue value={record.agvDetail.code$} /> | 
 |  |  |             </Grid> | 
 |  |  |             <Grid item xs={ITEM_COL}> | 
 |  |  |                 <DetailTitle title='table.field.agv.ip' /> | 
 |  |  |                 <DetailValue value={record.ip} /> | 
 |  |  |             </Grid> | 
 |  |  |         </Grid> | 
 |  |  |     ) | 
 |  |  | } | 
 |  |  |  | 
 |  |  | const AgvMoreDetail = ({ record }) => { | 
 |  |  |     const translate = useTranslate(); | 
 |  |  |     return ( | 
 |  |  |         <Grid container spacing={1} sx={{ maxWidth: GRID_CONTAINER_MAX_WIDTH }}> | 
 |  |  |  | 
 |  |  |             <Grid item xs={ITEM_COL}> | 
 |  |  |                 <DetailTitle title='table.field.agvDetail.agvAngle' /> | 
 |  |  |                 <DetailValue value={record.agvDetail.agvAngle} /> | 
 |  |  |             </Grid> | 
 |  |  |             <Grid item xs={ITEM_COL}> | 
 |  |  |                 <DetailTitle title='table.field.agvDetail.gyroAngle' /> | 
 |  |  |                 <DetailValue value={record.agvDetail.gyroAngle} /> | 
 |  |  |             </Grid> | 
 |  |  |  | 
 |  |  |             <Grid item xs={ITEM_COL}> | 
 |  |  |                 <DetailTitle title='table.field.agvDetail.encoderAngle' /> | 
 |  |  |                 <DetailValue value={record.agvDetail.encoderAngle} /> | 
 |  |  |             </Grid> | 
 |  |  |  | 
 |  |  |             <Grid item xs={ITEM_COL}> | 
 |  |  |                 <DetailTitle title='table.field.agvDetail.high' /> | 
 |  |  |                 <DetailValue value={record.agvDetail.high} /> | 
 |  |  |             </Grid> | 
 |  |  |             <Grid item xs={ITEM_COL}> | 
 |  |  |                 <DetailTitle title='table.field.agvDetail.vol' /> | 
 |  |  |                 <DetailValue value={record.agvDetail.vol} /> | 
 |  |  |             </Grid> | 
 |  |  |             <Grid item xs={ITEM_COL}> | 
 |  |  |                 <DetailTitle title='table.field.agvDetail.soc' /> | 
 |  |  |                 <DetailValue value={record.agvDetail.soc} /> | 
 |  |  |             </Grid> | 
 |  |  |             <Grid item xs={ITEM_COL}> | 
 |  |  |                 <DetailTitle title='table.field.agvDetail.soh' /> | 
 |  |  |                 <DetailValue value={record.agvDetail.soh} /> | 
 |  |  |             </Grid> | 
 |  |  |             <Grid item xs={ITEM_COL}> | 
 |  |  |                 <DetailTitle title='table.field.agvDetail.tempe' /> | 
 |  |  |                 <DetailValue value={record.agvDetail.tempe} /> | 
 |  |  |             </Grid> | 
 |  |  |             <Grid item xs={ITEM_COL}> | 
 |  |  |                 <DetailTitle title='table.field.agvDetail.motorFail' /> | 
 |  |  |                 <DetailValue value={record.agvDetail.motorFail} /> | 
 |  |  |             </Grid> | 
 |  |  |             <Grid item xs={ITEM_COL}> | 
 |  |  |                 <DetailTitle title='table.field.agvDetail.workDistance' /> | 
 |  |  |                 <DetailValue value={record.agvDetail.workDistance} /> | 
 |  |  |             </Grid> | 
 |  |  |         </Grid > | 
 |  |  |     ) | 
 |  |  | } | 
 |  |  | const AgvModelDetail = ({ record }) => { | 
 |  |  |     const translate = useTranslate(); | 
 |  |  |     return ( | 
 |  |  |         <Grid container spacing={1} sx={{ maxWidth: GRID_CONTAINER_MAX_WIDTH }}> | 
 |  |  |             <Grid item xs={ITEM_COL}> | 
 |  |  |                 <DetailTitle title='table.field.agvModel.name' /> | 
 |  |  |                 <DetailValue fontBold value={record.agvModelData.name} /> | 
 |  |  |             </Grid> | 
 |  |  |             <Grid item xs={ITEM_COL}> | 
 |  |  |                 <DetailTitle title='table.field.agvModel.length' /> | 
 |  |  |                 <DetailValue value={record.agvModelData.length} /> | 
 |  |  |             </Grid> | 
 |  |  |             <Grid item xs={ITEM_COL}> | 
 |  |  |                 <DetailTitle title='table.field.agvModel.width' /> | 
 |  |  |                 <DetailValue value={record.agvModelData.width} /> | 
 |  |  |             </Grid> | 
 |  |  |             <Grid item xs={ITEM_COL}> | 
 |  |  |                 <DetailTitle title='table.field.agvModel.height' /> | 
 |  |  |                 <DetailValue value={record.agvModelData.height} /> | 
 |  |  |             </Grid> | 
 |  |  |             <Grid item xs={ITEM_COL}> | 
 |  |  |                 <DetailTitle title='table.field.agvModel.liftHeight' /> | 
 |  |  |                 <DetailValue value={record.agvModelData.liftHeight} /> | 
 |  |  |             </Grid> | 
 |  |  |             <Grid item xs={ITEM_COL}> | 
 |  |  |                 <DetailTitle title='table.field.agvModel.diameter' /> | 
 |  |  |                 <DetailValue value={record.agvModelData.diameter} /> | 
 |  |  |             </Grid> | 
 |  |  |             <Grid item xs={ITEM_COL}> | 
 |  |  |                 <DetailTitle title='table.field.agvModel.backpack' /> | 
 |  |  |                 <DetailValue value={record.agvModelData.backpack} /> | 
 |  |  |             </Grid> | 
 |  |  |             <Grid item xs={ITEM_COL}> | 
 |  |  |                 <DetailTitle title='table.field.agvModel.lowBattery' /> | 
 |  |  |                 <DetailValue value={record.agvModelData.lowBattery} /> | 
 |  |  |             </Grid> | 
 |  |  |             <Grid item xs={ITEM_COL}> | 
 |  |  |                 <DetailTitle title='table.field.agvModel.quaBattery' /> | 
 |  |  |                 <DetailValue value={record.agvModelData.quaBattery} /> | 
 |  |  |             </Grid> | 
 |  |  |             <Grid item xs={ITEM_COL}> | 
 |  |  |                 <DetailTitle title='table.field.agvModel.travelSpeed' /> | 
 |  |  |                 <DetailValue value={record.agvModelData.travelSpeed} /> | 
 |  |  |             </Grid> | 
 |  |  |             <Grid item xs={ITEM_COL}> | 
 |  |  |                 <DetailTitle title='table.field.agvModel.workDirection' /> | 
 |  |  |                 <DetailValue value={record.agvModelData.workDirection} /> | 
 |  |  |             </Grid> | 
 |  |  |             <Grid item xs={ITEM_COL}> | 
 |  |  |                 <DetailTitle title='table.field.agvModel.allDirection' /> | 
 |  |  |                 <DetailValue value={record.agvModelData.allDirection === 1 ? translate('common.enums.true') : translate('common.enums.false')} /> | 
 |  |  |             </Grid> | 
 |  |  |             <Grid item xs={ITEM_COL}> | 
 |  |  |                 <DetailTitle title='table.field.agvModel.protocol' /> | 
 |  |  |                 <DetailValue value={record.agvModelData.protocol} /> | 
 |  |  |             </Grid> | 
 |  |  |             <Grid item xs={ITEM_COL}> | 
 |  |  |                 <DetailTitle title='table.field.agvModel.mqttTopic' /> | 
 |  |  |                 <DetailValue value={record.agvModelData.mqttTopic} /> | 
 |  |  |             </Grid> | 
 |  |  |         </Grid> | 
 |  |  |     ) | 
 |  |  | } |