From f51029f35beb182ed442e9d211fc39112ed6a5c0 Mon Sep 17 00:00:00 2001
From: zhang <zc857179121@qq.com>
Date: 星期一, 16 六月 2025 17:01:19 +0800
Subject: [PATCH] 1
---
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..b9f5bf5 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('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('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('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