| import React, { useState, useRef, useEffect, useMemo } from "react"; | 
| import { | 
|     useDataProvider, | 
|     SortButton, | 
|     TabbedShowLayout, | 
|     useListContext, | 
|     useRecordContext, | 
|     useTranslate, | 
|     useResourceContext, | 
| } from 'react-admin'; | 
| import { Link as RouterLink, useLocation } from 'react-router-dom'; | 
| import { | 
|     Box, | 
|     Button, | 
|     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, 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 (!record) { | 
|         return ( | 
|             <Stack mt={0.5}> | 
|                 {Array.from({ length: 5 }).map((_, index) => ( | 
|                     <Stack spacing={2} sx={{ mt: 1 }} key={index}> | 
|                         <Stack | 
|                             direction="row" | 
|                             spacing={2} | 
|                             sx={{ alignItems: 'center' }} | 
|                         > | 
|                             <Skeleton | 
|                                 variant="circular" | 
|                                 width={20} | 
|                                 height={20} | 
|                             /> | 
|                             <Skeleton width="100%" /> | 
|                         </Stack> | 
|                         <Skeleton variant="rectangular" height={50} /> | 
|                         <Divider /> | 
|                     </Stack> | 
|                 ))} | 
|             </Stack> | 
|         ); | 
|     } | 
|   | 
|     return ( | 
|         <> | 
|             <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> | 
|     ) | 
| } |