| | |
| | | import React, { useState, useEffect } from "react"; |
| | | import React, { useState, useEffect, useMemo } from "react"; |
| | | import { |
| | | Box, |
| | | Card, |
| | |
| | | useTranslate, |
| | | useRecordContext, |
| | | useDataProvider, |
| | | useGetMany, |
| | | } from 'react-admin'; |
| | | import { format } from 'date-fns'; |
| | | import * as Common from '@/utils/common' |
| | |
| | | ]; |
| | | |
| | | const INFO_FIELDS = [ |
| | | // { labelKey: 'table.field.sta.uuid', valueKey: 'uuid' }, |
| | | { labelKey: 'table.field.sta.zoneId', valueKey: 'zoneId$' }, |
| | | { labelKey: 'table.field.sta.staType', valueKey: 'staType$' }, |
| | | { labelKey: 'table.field.sta.code', valueKey: 'code$' }, |
| | | { labelKey: 'table.field.sta.capacity', valueKey: 'capacity' }, |
| | | { labelKey: 'table.field.sta.rsvInCnt', valueKey: 'rsvInCnt' }, |
| | | { labelKey: 'table.field.sta.rsvOutCnt', valueKey: 'rsvOutCnt' }, |
| | | // { labelKey: 'table.field.sta.staSts', valueKey: 'staSts$' }, |
| | | { labelKey: 'table.field.sta.offset', valueKey: 'offset' }, |
| | | { labelKey: 'table.field.sta.zpallet', valueKey: 'zpallet' }, |
| | | ]; |
| | | |
| | | const RESERVE_COLUMN_COUNT = 11; |
| | | const StaPanel = () => { |
| | | const record = useRecordContext(); |
| | | const translate = useTranslate(); |
| | | const dataProvider = useDataProvider(); |
| | | const [reserves, setReserves] = useState([]); |
| | | const [isReservesLoading, setIsReservesLoading] = useState(false); |
| | | const taskIds = useMemo(() => extractIds(reserves, 'taskId'), [reserves]); |
| | | const segmentIds = useMemo(() => extractIds(reserves, 'segmentId'), [reserves]); |
| | | const agvIds = useMemo(() => extractIds(reserves, 'agvId'), [reserves]); |
| | | |
| | | const { data: taskRecords = [] } = useGetMany('task', { ids: taskIds }, { enabled: taskIds.length > 0 }); |
| | | const { data: segmentRecords = [] } = useGetMany('segment', { ids: segmentIds }, { enabled: segmentIds.length > 0 }); |
| | | const { data: agvRecords = [] } = useGetMany('agv', { ids: agvIds }, { enabled: agvIds.length > 0 }); |
| | | |
| | | const taskLabelMap = useMemo( |
| | | () => createLabelMap(taskRecords, (item) => item.seqNum), |
| | | [taskRecords] |
| | | ); |
| | | const segmentLabelMap = useMemo( |
| | | () => createLabelMap(segmentRecords, (item) => item.groupId + '-' + item.serial), |
| | | [segmentRecords] |
| | | ); |
| | | const agvLabelMap = useMemo( |
| | | () => createLabelMap(agvRecords, (item) => item.uuid), |
| | | [agvRecords] |
| | | ); |
| | | |
| | | useEffect(() => { |
| | | if (!record?.id) { |
| | |
| | | <Table size="small"> |
| | | <TableHead> |
| | | <TableRow> |
| | | <TableCell>{translate('table.field.staReserve.name')}</TableCell> |
| | | <TableCell>{translate('table.field.staReserve.uuid')}</TableCell> |
| | | <TableCell>{translate('table.field.staReserve.taskId')}</TableCell> |
| | | <TableCell>{translate('table.field.staReserve.segmentId')}</TableCell> |
| | | <TableCell>{translate('table.field.staReserve.agvId')}</TableCell> |
| | | <TableCell>{translate('table.field.staReserve.type')}</TableCell> |
| | | <TableCellRight>{translate('table.field.staReserve.qty')}</TableCellRight> |
| | | <TableCell>{translate('table.field.staReserve.state')}</TableCell> |
| | | <TableCell>{translate('table.field.staReserve.agvId')}</TableCell> |
| | | <TableCell>{translate('table.field.staReserve.expireTime')}</TableCell> |
| | | <TableCell>{translate('table.field.staReserve.waitingAt')}</TableCell> |
| | | <TableCell>{translate('table.field.staReserve.confirmedAt')}</TableCell> |
| | | <TableCell>{translate('table.field.staReserve.uniqKey')}</TableCell> |
| | | </TableRow> |
| | | </TableHead> |
| | | <TableBody> |
| | | {isReservesLoading && ( |
| | | <TableRow> |
| | | <TableCell colSpan={7}> |
| | | <TableCell colSpan={RESERVE_COLUMN_COUNT}> |
| | | <Box display="flex" alignItems="center" gap={1}> |
| | | <CircularProgress size={16} /> |
| | | <Typography variant="body2" color="textSecondary"> |
| | |
| | | )} |
| | | {!isReservesLoading && reserves.length === 0 && ( |
| | | <TableRow> |
| | | <TableCell colSpan={7}> |
| | | <TableCell colSpan={RESERVE_COLUMN_COUNT}> |
| | | <Typography variant="body2" color="textSecondary"> |
| | | {translate('ra.navigation.no_results')} |
| | | </Typography> |
| | |
| | | )} |
| | | {reserves.map((reserve) => ( |
| | | <TableRow key={reserve.id}> |
| | | <TableCell>{reserve.name || '-'}</TableCell> |
| | | <TableCell>{reserve.uuid || '-'}</TableCell> |
| | | <TableCell>{getReferenceLabel(taskLabelMap, reserve.taskId)}</TableCell> |
| | | <TableCell>{getReferenceLabel(segmentLabelMap, reserve.segmentId)}</TableCell> |
| | | <TableCell>{getReferenceLabel(agvLabelMap, reserve.agvId)}</TableCell> |
| | | <TableCell>{formatReserveType(reserve.type, translate)}</TableCell> |
| | | <TableCellRight>{reserve.qty ?? '-'}</TableCellRight> |
| | | <TableCell>{formatReserveState(reserve.state, translate)}</TableCell> |
| | | <TableCell>{reserve.agvId$ || reserve.agvId || '-'}</TableCell> |
| | | <TableCell>{formatDateTime(reserve.expireTime)}</TableCell> |
| | | <TableCell>{formatDateTime(reserve.waitingAt)}</TableCell> |
| | | <TableCell>{formatDateTime(reserve.confirmedAt)}</TableCell> |
| | | <TableCell>{reserve.uniqKey || '-'}</TableCell> |
| | | </TableRow> |
| | | ))} |
| | | </TableBody> |
| | |
| | | return String(value); |
| | | }; |
| | | |
| | | const extractIds = (items, key) => { |
| | | if (!items || items.length === 0) return []; |
| | | const unique = new Set(); |
| | | items.forEach((item) => { |
| | | const value = item?.[key]; |
| | | if (value !== undefined && value !== null && value !== '') { |
| | | unique.add(value); |
| | | } |
| | | }); |
| | | return Array.from(unique); |
| | | }; |
| | | |
| | | const createLabelMap = (records, getLabel) => { |
| | | if (!records || records.length === 0) return {}; |
| | | return records.reduce((acc, record) => { |
| | | if (record?.id === undefined || record?.id === null) { |
| | | return acc; |
| | | } |
| | | const label = getLabel(record); |
| | | acc[record.id] = label ?? record.id; |
| | | return acc; |
| | | }, {}); |
| | | }; |
| | | |
| | | const getReferenceLabel = (map, id) => { |
| | | if (id === undefined || id === null || id === '') { |
| | | return '-'; |
| | | } |
| | | return map?.[id] || id; |
| | | }; |
| | | |
| | | const formatReserveType = (value, translate) => |
| | | formatReserveEnum(value, translate, 'type'); |
| | | |
| | |
| | | cancelled: 'canceled', |
| | | }); |
| | | |
| | | const getReserveRelationValue = (reserve, key) => { |
| | | if (!reserve) return '-'; |
| | | return reserve[`${key}$`] || reserve[key] || '-'; |
| | | }; |
| | | |
| | | const formatReserveEnum = (value, translate, enumType, overrides = {}) => { |
| | | const normalized = normalizeValueKey(value); |
| | | if (!normalized) { |