|  |  | 
 |  |  | import React, { useState, useRef, useEffect, useMemo } from "react"; | 
 |  |  | import { | 
 |  |  |     ShowBase, | 
 |  |  |     useTranslate, | 
 |  |  |     TabbedShowLayout, | 
 |  |  |     useShowContext, | 
 |  |  | } from 'react-admin'; | 
 |  |  | 
 |  |  |     Stack, | 
 |  |  |     Typography, | 
 |  |  |     Avatar, | 
 |  |  |     Skeleton, | 
 |  |  |     Divider, | 
 |  |  |     List, | 
 |  |  |     ListItem, | 
 |  |  |     ListItemAvatar, | 
 |  |  |     ListItemText, | 
 |  |  |     ListItemSecondaryAction, | 
 |  |  | } from '@mui/material'; | 
 |  |  | import { formatDistance } from 'date-fns'; | 
 |  |  | import request from '@/utils/request'; | 
 |  |  | import { useTheme } from '@mui/material/styles'; | 
 |  |  | import { getTaskStsColor } from '@/utils/common'; | 
 |  |  | import ListEmptyTip from "../../components/ListEmptyTip"; | 
 |  |  |  | 
 |  |  |  | 
 |  |  | export const AgvShowTask = ({ agvId }) => { | 
 |  |  | const TaskItem = ({ record, now }) => { | 
 |  |  |     const translate = useTranslate(); | 
 |  |  |     const theme = useTheme(); | 
 |  |  |  | 
 |  |  |     return ( | 
 |  |  |         <> | 
 |  |  |             <h1>Task</h1> | 
 |  |  |             <ListItem button> | 
 |  |  |                 <Stack direction="row" spacing={1} alignItems="center" width="100%"> | 
 |  |  |                     <ListItemAvatar> | 
 |  |  |                         <Avatar | 
 |  |  |                             alt={record.seqNum} | 
 |  |  |                             variant="rounded" | 
 |  |  |                             sx={{ | 
 |  |  |                                 '& img': { objectFit: 'contain' }, | 
 |  |  |                                 fontSize: '0.9rem', | 
 |  |  |                                 width: 40, | 
 |  |  |                                 height: 25, | 
 |  |  |                                 bgcolor: getTaskStsColor(record.taskSts$), | 
 |  |  |                             }} | 
 |  |  |                         > | 
 |  |  |                             {record.seqNum} | 
 |  |  |                         </Avatar> | 
 |  |  |                     </ListItemAvatar> | 
 |  |  |                     <ListItemText | 
 |  |  |                         primary={<> | 
 |  |  |                             <Stack direction={'row'}> | 
 |  |  |                                 <Typography | 
 |  |  |                                     variant="body1" | 
 |  |  |                                     color="textSecondary" | 
 |  |  |                                     component="span" | 
 |  |  |                                     sx={{ fontWeight: '600' }} | 
 |  |  |                                 > | 
 |  |  |                                     {record.taskType$} | 
 |  |  |                                 </Typography> | 
 |  |  |                                 <Typography | 
 |  |  |                                     variant="caption" | 
 |  |  |                                     color="textSecondary" | 
 |  |  |                                     component="span" | 
 |  |  |                                 > | 
 |  |  |                                      -  {record.taskTypeEl} | 
 |  |  |                                 </Typography> | 
 |  |  |                             </Stack> | 
 |  |  |  | 
 |  |  |                         </>} | 
 |  |  |                         secondary={ | 
 |  |  |                             <> | 
 |  |  |                                 <Typography | 
 |  |  |                                     variant="body2" | 
 |  |  |                                     color="textSecondary" | 
 |  |  |                                     component="span" | 
 |  |  |                                     sx={{ fontWeight: 'bold' }} | 
 |  |  |                                 > | 
 |  |  |                                     {record.taskSts$} | 
 |  |  |                                 </Typography> | 
 |  |  |                             </> | 
 |  |  |                         } | 
 |  |  |                     /> | 
 |  |  |                     <ListItemText | 
 |  |  |                         variant="body2" | 
 |  |  |                         color="textSecondary" | 
 |  |  |                         primary={<> | 
 |  |  |                             <Typography | 
 |  |  |                                 variant="body2" | 
 |  |  |                                 color="textPrimary" | 
 |  |  |                                 component="span" | 
 |  |  |                             > | 
 |  |  |                                 {record.oriLoc$ || ''}{record.oriSta$ || ''} - {record.destLoc$ || ''}{record.destSta$ || ''} | 
 |  |  |                             </Typography> | 
 |  |  |                         </>} | 
 |  |  |                         secondary={`code: ${record.destCode$ || ''}`} | 
 |  |  |                     /> | 
 |  |  |                     <ListItemSecondaryAction> | 
 |  |  |                         <Typography | 
 |  |  |                             variant="body2" | 
 |  |  |                             color="textSecondary" | 
 |  |  |                             component="span" | 
 |  |  |                         > | 
 |  |  |                             last update {' '} | 
 |  |  |                             {formatDistance(record.createTime, now)} ago{' '} | 
 |  |  |                         </Typography> | 
 |  |  |                     </ListItemSecondaryAction> | 
 |  |  |                 </Stack> | 
 |  |  |             </ListItem> | 
 |  |  |         </> | 
 |  |  |     ) | 
 |  |  | } | 
 |  |  | } | 
 |  |  |  | 
 |  |  | export const AgvShowTask = ({ agvId, pageSize = 10 }) => { | 
 |  |  |     const [currCount, setCurrCount] = useState(pageSize); | 
 |  |  |     const [records, setRecords] = useState(null); | 
 |  |  |     const [total, setTotal] = useState(0); | 
 |  |  |     const translate = useTranslate(); | 
 |  |  |  | 
 |  |  |     useEffect(() => { | 
 |  |  |         const http = async () => { | 
 |  |  |             const res = await request.post('task/page', { | 
 |  |  |                 agvId: agvId, | 
 |  |  |                 pageSize: currCount, | 
 |  |  |                 orderBy: 'create_time desc', | 
 |  |  |             }); | 
 |  |  |             const { code, msg, data } = res.data; | 
 |  |  |             if (code === 200) { | 
 |  |  |                 setTotal(data.total); | 
 |  |  |                 setRecords(data.records); | 
 |  |  |             } else { | 
 |  |  |                 setTotal(0); | 
 |  |  |                 setRecords(null); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |         if (agvId) { http() } | 
 |  |  |     }, [agvId, currCount]); | 
 |  |  |  | 
 |  |  |     if (!records) { | 
 |  |  |         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> | 
 |  |  |         ); | 
 |  |  |     } | 
 |  |  |     const now = Date.now(); | 
 |  |  |  | 
 |  |  |     return ( | 
 |  |  |         <> | 
 |  |  |             {records.length > 0 ? ( | 
 |  |  |                 <Box > | 
 |  |  |                     <List> | 
 |  |  |                         {records.map(record => { | 
 |  |  |                             return ( | 
 |  |  |                                 <> | 
 |  |  |                                     <TaskItem | 
 |  |  |                                         key={record.id} | 
 |  |  |                                         record={record} | 
 |  |  |                                         now={now} | 
 |  |  |                                     /> | 
 |  |  |                                     <Divider /> | 
 |  |  |                                 </> | 
 |  |  |  | 
 |  |  |                             ) | 
 |  |  |                         })} | 
 |  |  |                         {currCount < total && ( | 
 |  |  |                             <Button | 
 |  |  |                                 onClick={() => | 
 |  |  |                                     setCurrCount( | 
 |  |  |                                         currCount => | 
 |  |  |                                             currCount + pageSize | 
 |  |  |                                     ) | 
 |  |  |                                 } | 
 |  |  |                                 fullWidth | 
 |  |  |                                 sx={{ mt: 1 }} | 
 |  |  |                             > | 
 |  |  |                                 {translate('common.action.loadMore')} | 
 |  |  |                             </Button> | 
 |  |  |                         )} | 
 |  |  |                     </List> | 
 |  |  |                 </Box> | 
 |  |  |             ) : ( | 
 |  |  |                 <ListEmptyTip /> | 
 |  |  |             )} | 
 |  |  |  | 
 |  |  |         </> | 
 |  |  |     ) | 
 |  |  | } |