From 7f70cb15d035f0c233b9e62b9e43aa985317c908 Mon Sep 17 00:00:00 2001 From: luxiaotao1123 <t1341870251@163.com> Date: 星期一, 04 十一月 2024 10:22:45 +0800 Subject: [PATCH] # --- zy-acs-flow/src/map/insight/agv/AgvControl.jsx | 436 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 432 insertions(+), 4 deletions(-) diff --git a/zy-acs-flow/src/map/insight/agv/AgvControl.jsx b/zy-acs-flow/src/map/insight/agv/AgvControl.jsx index 53a9c1d..a350946 100644 --- a/zy-acs-flow/src/map/insight/agv/AgvControl.jsx +++ b/zy-acs-flow/src/map/insight/agv/AgvControl.jsx @@ -1,11 +1,439 @@ +import React, { useEffect } from 'react'; +import { useTranslate } from "react-admin"; +import { useForm, Controller } from 'react-hook-form'; +import { + Button, + TextField, + Grid, + Box, + ToggleButton, + ToggleButtonGroup, + Typography, + Divider, + Toolbar, + useTheme, + Autocomplete, + CircularProgress, +} from '@mui/material'; +import CheckOutlinedIcon from '@mui/icons-material/CheckOutlined'; +import RestartAltIcon from '@mui/icons-material/RestartAlt'; +import useCoolHook from './useCoolHook'; +import { handleControlAgv } from '../../http'; -const AgvControl = () => { +function AgvControl(props) { + const { curAgvNo } = props; + const theme = useTheme(); + const translate = useTranslate(); + const { control, handleSubmit, reset, watch, setValue } = useForm({ + defaultValues: { + taskMode: 'MOVE', + startCode: '', + endCode: '', + startLocNo: '', + endLocNo: '', + startStaNo: '', + endStaNo: '', + }, + }); + + const taskModes = [ + { value: 'MOVE', label: translate('page.map.insight.control.type.MOVE') }, + { value: 'TO_CHARGE', label: translate('page.map.insight.control.type.TO_CHARGE') }, + { value: 'TO_STANDBY', label: translate('page.map.insight.control.type.TO_STANDBY') }, + { value: 'LOC_TO_LOC', label: translate('page.map.insight.control.type.LOC_TO_LOC') }, + { value: 'LOC_TO_STA', label: translate('page.map.insight.control.type.LOC_TO_STA') }, + { value: 'STA_TO_LOC', label: translate('page.map.insight.control.type.STA_TO_LOC') }, + { value: 'STA_TO_STA', label: translate('page.map.insight.control.type.STA_TO_STA') }, + ]; + + useEffect(() => { + reset(); + }, [curAgvNo, reset]); + + const onSubmit = (data) => { + if (curAgvNo) { + handleControlAgv({ agvNo: curAgvNo, ...data }, () => { + + }); + } + }; + + const taskMode = watch('taskMode'); + + const showField = (field) => { + const mode = taskMode; + switch (field) { + case 'startCode': + return false; + case 'endCode': + return ['MOVE'].includes(mode); + case 'startLocNo': + return ['LOC_TO_LOC', 'LOC_TO_STA'].includes(mode); + case 'endLocNo': + return ['LOC_TO_LOC', 'STA_TO_LOC'].includes(mode); + case 'startStaNo': + return ['STA_TO_LOC', 'STA_TO_STA'].includes(mode); + case 'endStaNo': + return ['LOC_TO_STA', 'STA_TO_STA'].includes(mode); + default: + return false; + } + }; + + const { + options: endCodeOptions, + setInputValue: setEndCodeInputValue, + resetInput: resetEndCodeInput, + } = useCoolHook('/code/page', 'data'); + + const { + options: startLocOptions, + setInputValue: setStartLocInputValue, + resetInput: resetStartLocInput, + } = useCoolHook('/loc/page', 'locNo'); + + const { + options: endLocOptions, + setInputValue: setEndLocInputValue, + resetInput: resetEndLocInput, + } = useCoolHook('/loc/page', 'locNo'); + + const { + options: startStaOptions, + setInputValue: setStartStaInputValue, + resetInput: resetStartStaInput, + } = useCoolHook('/sta/page', 'staNo'); + + const { + options: endStaOptions, + setInputValue: setEndStaInputValue, + resetInput: resetEndStaInput, + } = useCoolHook('/sta/page', 'staNo'); + + useEffect(() => { + const fieldsToClear = ['endCode', 'startLocNo', 'endLocNo', 'startStaNo', 'endStaNo']; + + fieldsToClear.forEach(field => { + if (!showField(field)) { + setValue(field, ''); + + switch (field) { + case 'endCode': + resetEndCodeInput(); + break; + case 'startLocNo': + resetStartLocInput(); + break; + case 'endLocNo': + resetEndLocInput(); + break; + case 'startStaNo': + resetStartStaInput(); + break; + case 'endStaNo': + resetEndStaInput(); + break; + default: + break; + } + } + }); + }, [ + taskMode, + setValue, + showField, + resetEndCodeInput, + resetStartLocInput, + resetEndLocInput, + resetStartStaInput, + resetEndStaInput + ]); return ( <> - <h1>Control</h1> + <form onSubmit={handleSubmit(onSubmit)}> + <Box display="flex" flexDirection="row" height="100%" justifyContent="space-around" p={2}> + {/* left */} + <Box + position="relative" + width="35%" + height="100%" + > + <Controller + name="taskMode" + control={control} + render={({ field }) => ( + <ToggleButtonGroup + {...field} + orientation="vertical" + exclusive + fullWidth + color="primary" + onChange={(e, value) => { + if (value !== null) { + field.onChange(value); + } + }} + > + {taskModes.map((mode) => ( + <ToggleButton key={mode.value} value={mode.value} sx={{ textAlign: 'left' }}> + {mode.label} + </ToggleButton> + ))} + </ToggleButtonGroup> + )} + /> + </Box> + + {/* right */} + <Box + position="relative" + width="55%" + height="100%" + > + <Grid container spacing={2}> + {showField('startCode') && ( + <Grid item xs={12}> + <Controller + name="startCode" + control={control} + rules={{ required: translate('ra.validation.required') }} + render={({ field, fieldState }) => ( + <TextField + {...field} + fullWidth + label={translate('page.map.insight.control.startCode')} + error={!!fieldState.error} + helperText={fieldState.error?.message} + /> + )} + /> + </Grid> + )} + + {showField('endCode') && ( + <Grid item xs={12}> + <Controller + name="endCode" + control={control} + rules={{ required: translate('ra.validation.required') }} + render={({ field, fieldState }) => { + const selectedOption = endCodeOptions.find(option => option.id === field.value) || null; + return ( + <Autocomplete + options={endCodeOptions} + getOptionLabel={(option) => option.label} + isOptionEqualToValue={(option, value) => option.id === value.id} + value={selectedOption} + onInputChange={(event, value) => { + setEndCodeInputValue(value); + }} + onChange={(event, value) => { + field.onChange(value ? value.id : null); + }} + renderInput={(params) => ( + <TextField + {...params} + label={translate('page.map.insight.control.endCode')} + error={!!fieldState.error} + helperText={fieldState.error?.message} + /> + )} + /> + ); + }} + /> + </Grid> + )} + + {showField('startLocNo') && ( + <Grid item xs={12}> + <Controller + name="startLocNo" + control={control} + rules={{ required: translate('ra.validation.required') }} + render={({ field, fieldState }) => { + const selectedOption = startLocOptions.find(option => option.id === field.value) || null; + return ( + <Autocomplete + options={startLocOptions} + getOptionLabel={(option) => option.label} + isOptionEqualToValue={(option, value) => option.id === value.id} + value={selectedOption} + onInputChange={(event, value) => { + setStartLocInputValue(value); + }} + onChange={(event, value) => { + field.onChange(value ? value.id : null); + }} + renderInput={(params) => ( + <TextField + {...params} + label={translate('page.map.insight.control.startLoc')} + error={!!fieldState.error} + helperText={fieldState.error?.message} + /> + )} + /> + ); + }} + /> + </Grid> + )} + + {showField('endLocNo') && ( + <Grid item xs={12}> + <Controller + name="endLocNo" + control={control} + rules={{ required: translate('ra.validation.required') }} + render={({ field, fieldState }) => { + const selectedOption = endLocOptions.find(option => option.id === field.value) || null; + return ( + <Autocomplete + options={endLocOptions} + getOptionLabel={(option) => option.label} + isOptionEqualToValue={(option, value) => option.id === value.id} + value={selectedOption} + onInputChange={(event, value) => { + setEndLocInputValue(value); + }} + onChange={(event, value) => { + field.onChange(value ? value.id : null); + }} + renderInput={(params) => ( + <TextField + {...params} + label={translate('page.map.insight.control.endLoc')} + error={!!fieldState.error} + helperText={fieldState.error?.message} + /> + )} + /> + ); + }} + /> + </Grid> + )} + + {showField('startStaNo') && ( + <Grid item xs={12}> + <Controller + name="startStaNo" + control={control} + rules={{ required: translate('ra.validation.required') }} + render={({ field, fieldState }) => { + const selectedOption = startStaOptions.find(option => option.id === field.value) || null; + return ( + <Autocomplete + options={startStaOptions} + getOptionLabel={(option) => option.label} + isOptionEqualToValue={(option, value) => option.id === value.id} + value={selectedOption} + onInputChange={(event, value) => { + setStartStaInputValue(value); + }} + onChange={(event, value) => { + field.onChange(value ? value.id : null); + }} + renderInput={(params) => ( + <TextField + {...params} + label={translate('page.map.insight.control.startSta')} + error={!!fieldState.error} + helperText={fieldState.error?.message} + /> + )} + /> + ); + }} + /> + </Grid> + )} + + {showField('endStaNo') && ( + <Grid item xs={12}> + <Controller + name="endStaNo" + control={control} + rules={{ required: translate('ra.validation.required') }} + render={({ field, fieldState }) => { + const selectedOption = endStaOptions.find(option => option.id === field.value) || null; + return ( + <Autocomplete + options={endStaOptions} + getOptionLabel={(option) => option.label} + isOptionEqualToValue={(option, value) => option.id === value.id} + value={selectedOption} + onInputChange={(event, value) => { + setEndStaInputValue(value); + }} + onChange={(event, value) => { + field.onChange(value ? value.id : null); + }} + renderInput={(params) => ( + <TextField + {...params} + label={translate('page.map.insight.control.endSta')} + error={!!fieldState.error} + helperText={fieldState.error?.message} + /> + )} + /> + ); + }} + /> + </Grid> + )} + + </Grid> + </Box> + </Box> + <Box pl={5} pr={5}> + <Divider sx={{ + marginBottom: '16px' + }} /> + <Toolbar sx={{ + display: 'flex', + justifyContent: 'space-between', + minHeight: { sm: 0 }, + }}> + <Button + variant="outlined" + color="primary" + type="submit" + sx={{ + borderColor: theme => theme.palette.primary.main, + color: theme => theme.palette.primary.main, + }} + startIcon={ + <CheckOutlinedIcon sx={{ color: theme => theme.palette.primary.main }} /> + } + > + {translate('ra.action.confirm')} + </Button> + + <Button + variant="outlined" + color="primary" + onClick={() => { + reset(); + }} + sx={{ + borderColor: theme => theme.palette.warning.main, + color: theme => theme.palette.warning.main, + }} + startIcon={ + <RestartAltIcon sx={{ color: theme => theme.palette.warning.main }} /> + } + > + {translate('common.action.reset')} + </Button> + </Toolbar> + </Box> + </form> </> - ) + ); } -export default AgvControl; \ No newline at end of file +export default AgvControl; -- Gitblit v1.9.1