From c42a7c76e24940db9e81307dc67104d9068c3119 Mon Sep 17 00:00:00 2001
From: zhang <zc857179121@qq.com>
Date: 星期二, 07 四月 2026 15:04:21 +0800
Subject: [PATCH] 1

---
 zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/ChargeService.java          |   12 +-
 /dev/null                                                                                |   26 -----
 zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainService.java            |   11 -
 zy-acs-common/src/main/java/com/zy/acs/common/constant/RedisConstant.java                |    4 
 zy-acs-manager/src/main/java/com/zy/acs/manager/core/scheduler/MaintainScheduler.java    |   58 ++++++++++-
 zy-acs-manager/src/main/java/com/zy/acs/manager/manager/entity/FuncSta.java              |    6 +
 zy-acs-charge/src/main/java/com/zy/acs/charge/ChargeCoreService.java                     |   59 ++++++++++-
 zy-acs-charge/src/main/java/com/zy/acs/charge/impl/AiPowerChargeServiceImpl.java         |   88 ++++++++++-------
 zy-acs-manager/pom.xml                                                                   |    6 +
 zy-acs-manager/src/main/java/com/zy/acs/manager/manager/enums/FuncStaStateType.java      |    1 
 zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/AgvServiceImpl.java |    4 
 11 files changed, 183 insertions(+), 92 deletions(-)

diff --git a/zy-acs-charge/src/main/java/com/zy/acs/charge/ChargeCoreService.java b/zy-acs-charge/src/main/java/com/zy/acs/charge/ChargeCoreService.java
index bd7701e..bf473af 100644
--- a/zy-acs-charge/src/main/java/com/zy/acs/charge/ChargeCoreService.java
+++ b/zy-acs-charge/src/main/java/com/zy/acs/charge/ChargeCoreService.java
@@ -1,6 +1,6 @@
 package com.zy.acs.charge;
 
-import com.github.xingshuangs.iot.protocol.modbus.service.ModbusTcp;
+import com.github.xingshuangs.iot.protocol.modbus.service.ModbusRtuOverTcp;
 import com.zy.acs.charge.model.ChargerStatus;
 
 /**
@@ -8,20 +8,63 @@
  */
 public interface ChargeCoreService {
 
+    /**
+     * 璋冨害寮�鍚厖鐢�
+     *
+     * @param client
+     * @return
+     */
+    boolean startCharging(ModbusRtuOverTcp client);
 
-    boolean startCharging(ModbusTcp modbusTcp) ;
+    /**
+     * 璋冨害鍋滄鍏呯數
+     *
+     * @param client
+     * @return
+     */
+    boolean stopCharging(ModbusRtuOverTcp client);
 
-    boolean stopCharging(ModbusTcp modbusTcp) ;
-
-    ChargerStatus getStatus(ModbusTcp modbusTcp) ;
+    /**
+     * 鍦ㄧ嚎姝g户鐢靛櫒鐘舵��(鍓嶈繘鍒颁綅)
+     *
+     * @param client
+     * @return
+     */
+    boolean checkForwardRelayOnline(ModbusRtuOverTcp client);
 
 
+    /**
+     * 绂荤嚎姝g户鐢靛櫒鐘舵��(鍚庨��鍒颁綅)
+     *
+     * @param client
+     * @return
+     */
+    boolean checkBackwardRelayOffline(ModbusRtuOverTcp client);
 
-    boolean clearFault(ModbusTcp modbusTcp) ;
+    /**
+     * 鑾峰彇鍏呯數鏈哄厖鐢电數鍘�
+     *
+     * @param client
+     * @return
+     */
+    double getVoltage(ModbusRtuOverTcp client);
 
-    boolean finishRetract(ModbusTcp modbusTcp) ;
+    /**
+     * 鑾峰彇鍏呯數鏈哄厖鐢电數娴�
+     *
+     * @param client
+     * @return
+     */
+    double getCurrent(ModbusRtuOverTcp client);
 
 
-    boolean restoreStandby(ModbusTcp modbusTcp) ;
+    ChargerStatus getStatus(ModbusRtuOverTcp client);
+
+
+    boolean clearFault(ModbusRtuOverTcp client);
+
+    boolean finishRetract(ModbusRtuOverTcp client);
+
+    boolean restoreStandby(ModbusRtuOverTcp client);
 
 }
diff --git a/zy-acs-charge/src/main/java/com/zy/acs/charge/impl/AiPowerChargeServiceImpl.java b/zy-acs-charge/src/main/java/com/zy/acs/charge/impl/AiPowerChargeServiceImpl.java
index 1dfa120..7c6c445 100644
--- a/zy-acs-charge/src/main/java/com/zy/acs/charge/impl/AiPowerChargeServiceImpl.java
+++ b/zy-acs-charge/src/main/java/com/zy/acs/charge/impl/AiPowerChargeServiceImpl.java
@@ -1,17 +1,15 @@
 package com.zy.acs.charge.impl;
 
-import com.github.xingshuangs.iot.protocol.modbus.service.ModbusTcp;
+import com.github.xingshuangs.iot.protocol.modbus.service.ModbusRtuOverTcp;
 import com.zy.acs.charge.ChargeCoreService;
 import com.zy.acs.charge.constant.AiPowerChargerCoilEnum;
 import com.zy.acs.charge.constant.AiPowerChargerRegisterEnum;
 import com.zy.acs.charge.model.ChargerStatus;
 import com.zy.acs.common.utils.ByteUtils;
 import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Primary;
 import org.springframework.stereotype.Service;
 
-import javax.annotation.PostConstruct;
 import java.util.List;
 
 /**
@@ -22,30 +20,46 @@
 @Slf4j
 public class AiPowerChargeServiceImpl implements ChargeCoreService {
 
-      
-        
-
-    
 
     @Override
-    public boolean startCharging(ModbusTcp modbusTcp) {
+    public boolean startCharging(ModbusRtuOverTcp client) {
         // AGV杞︽姤鍛婂埌浣� -> true
-        modbusTcp.writeCoil(AiPowerChargerCoilEnum.AGV_REPORTED_IN_POSITION.getAddr(), true);
+        client.writeCoil(AiPowerChargerCoilEnum.AGV_REPORTED_IN_POSITION.getAddr(), true);
         return true;
     }
 
     @Override
-    public boolean stopCharging(ModbusTcp modbusTcp)  {
-        modbusTcp.writeCoil(AiPowerChargerCoilEnum.AGV_REPORTED_IN_POSITION.getAddr(), false);
+    public boolean stopCharging(ModbusRtuOverTcp client) {
+        client.writeCoil(AiPowerChargerCoilEnum.AGV_REPORTED_IN_POSITION.getAddr(), false);
         return true;
     }
 
     @Override
-    public ChargerStatus getStatus(ModbusTcp modbusTcp)  {
+    public boolean checkForwardRelayOnline(ModbusRtuOverTcp client) {
+        return client.readBoolean(AiPowerChargerCoilEnum.FORWARD_RELAY_ONLINE.getAddr(), 1);
+    }
+
+    @Override
+    public boolean checkBackwardRelayOffline(ModbusRtuOverTcp client) {
+        return client.readBoolean(AiPowerChargerCoilEnum.BACKWARD_RELAY_OFFLINE.getAddr(), 1);
+    }
+
+    @Override
+    public double getVoltage(ModbusRtuOverTcp client) {
+        return client.readInt16(AiPowerChargerRegisterEnum.CHARGE_VOLTAGE.getAddr(), 1) * AiPowerChargerRegisterEnum.CHARGE_CURRENT.getRaw();
+    }
+
+    @Override
+    public double getCurrent(ModbusRtuOverTcp client) {
+        return client.readInt16(AiPowerChargerRegisterEnum.CHARGE_CURRENT.getAddr(), 1) * AiPowerChargerRegisterEnum.CHARGE_CURRENT.getRaw();
+    }
+
+    @Override
+    public ChargerStatus getStatus(ModbusRtuOverTcp client) {
         ChargerStatus status = new ChargerStatus();
 
         // ---------- 鎵归噺璇诲彇绾垮湀锛堝湴鍧�100~115鍏�16涓級 ----------
-        List<Boolean> coils = modbusTcp.readCoil(100, 16);
+        List<Boolean> coils = client.readCoil(100, 16);
         status.setWorking(coils.get(0));                      // 鍦板潃100
         status.setOverheat(coils.get(0));                     // 101
         status.setFault(coils.get(0));                        // 102
@@ -64,24 +78,24 @@
         status.setCommBmsSuccess(!coils.get(15));              // 115
 
         // ---------- 鎵归噺璇诲彇淇濇寔瀵勫瓨鍣紙鍦板潃100~116鍏�17涓級 ----------
-        byte[] bytes = modbusTcp.readHoldRegister(100, 16);
-        status.setVoltage(ByteUtils.getInt(bytes,0) * AiPowerChargerRegisterEnum.CHARGE_VOLTAGE.getRaw());
-        status.setCurrent(ByteUtils.getInt(bytes,0) * AiPowerChargerRegisterEnum.CHARGE_CURRENT.getRaw());
-        status.setChargingTime(ByteUtils.getInt(bytes,0));
-        status.setCapacity(ByteUtils.getInt(bytes,0) * AiPowerChargerRegisterEnum.CHARGE_CAPACITY.getRaw());
-        status.setEnergy(ByteUtils.getInt(bytes,0) * AiPowerChargerRegisterEnum.CHARGE_ENERGY.getRaw());
-        status.setCellMaxVoltage(ByteUtils.getInt(bytes,0));
-        status.setCellMinVoltage(ByteUtils.getInt(bytes,0));
-        status.setPackVoltage(ByteUtils.getInt(bytes,0) * AiPowerChargerRegisterEnum.BMS_PACK_VOLTAGE.getRaw());
-        status.setVoltageDemand(ByteUtils.getInt(bytes,0) * AiPowerChargerRegisterEnum.BMS_VOLTAGE_DEMAND.getRaw());
-        status.setCurrentDemand(ByteUtils.getInt(bytes,0) * AiPowerChargerRegisterEnum.BMS_CURRENT_DEMAND.getRaw());
-        status.setTemperature(ByteUtils.getInt(bytes,0));
-        status.setSoc(ByteUtils.getInt(bytes,0) * AiPowerChargerRegisterEnum.BMS_SOC.getRaw());
-        status.setEndFlag(ByteUtils.getInt(bytes,0));
-        status.setChargerId(ByteUtils.getInt(bytes,0));
-        status.setFaultCode(ByteUtils.getInt(bytes,0));
-        status.setChargeMode(ByteUtils.getInt(bytes,0));
-        status.setScheduleFlag(ByteUtils.getInt(bytes,0));
+        byte[] bytes = client.readHoldRegister(100, 16);
+        status.setVoltage(ByteUtils.getInt(bytes, 0) * AiPowerChargerRegisterEnum.CHARGE_VOLTAGE.getRaw());
+        status.setCurrent(ByteUtils.getInt(bytes, 0) * AiPowerChargerRegisterEnum.CHARGE_CURRENT.getRaw());
+        status.setChargingTime(ByteUtils.getInt(bytes, 0));
+        status.setCapacity(ByteUtils.getInt(bytes, 0) * AiPowerChargerRegisterEnum.CHARGE_CAPACITY.getRaw());
+        status.setEnergy(ByteUtils.getInt(bytes, 0) * AiPowerChargerRegisterEnum.CHARGE_ENERGY.getRaw());
+        status.setCellMaxVoltage(ByteUtils.getInt(bytes, 0));
+        status.setCellMinVoltage(ByteUtils.getInt(bytes, 0));
+        status.setPackVoltage(ByteUtils.getInt(bytes, 0) * AiPowerChargerRegisterEnum.BMS_PACK_VOLTAGE.getRaw());
+        status.setVoltageDemand(ByteUtils.getInt(bytes, 0) * AiPowerChargerRegisterEnum.BMS_VOLTAGE_DEMAND.getRaw());
+        status.setCurrentDemand(ByteUtils.getInt(bytes, 0) * AiPowerChargerRegisterEnum.BMS_CURRENT_DEMAND.getRaw());
+        status.setTemperature(ByteUtils.getInt(bytes, 0));
+        status.setSoc(ByteUtils.getInt(bytes, 0) * AiPowerChargerRegisterEnum.BMS_SOC.getRaw());
+        status.setEndFlag(ByteUtils.getInt(bytes, 0));
+        status.setChargerId(ByteUtils.getInt(bytes, 0));
+        status.setFaultCode(ByteUtils.getInt(bytes, 0));
+        status.setChargeMode(ByteUtils.getInt(bytes, 0));
+        status.setScheduleFlag(ByteUtils.getInt(bytes, 0));
 
         return status;
     }
@@ -89,22 +103,22 @@
 
     // 娓呴櫎鏁呴殰
     @Override
-    public boolean clearFault(ModbusTcp modbusTcp)  {
-        modbusTcp.writeInt16(AiPowerChargerRegisterEnum.SCHEDULE_FLAG.getAddr(), (short) 1);
+    public boolean clearFault(ModbusRtuOverTcp client) {
+        client.writeInt16(AiPowerChargerRegisterEnum.SCHEDULE_FLAG.getAddr(), (short) 1);
         return true;
     }
 
     // 瀹屾垚閫�鍥炲懡浠�
     @Override
-    public boolean finishRetract(ModbusTcp modbusTcp)  {
-        modbusTcp.writeInt16(AiPowerChargerRegisterEnum.SCHEDULE_FLAG.getAddr(), (short) 2);
+    public boolean finishRetract(ModbusRtuOverTcp client) {
+        client.writeInt16(AiPowerChargerRegisterEnum.SCHEDULE_FLAG.getAddr(), (short) 2);
         return true;
     }
 
     // 鎭㈠寰呮満鐘舵��
     @Override
-    public boolean restoreStandby(ModbusTcp modbusTcp)  {
-        modbusTcp.writeInt16(AiPowerChargerRegisterEnum.SCHEDULE_FLAG.getAddr(), (short) 3);
+    public boolean restoreStandby(ModbusRtuOverTcp client) {
+        client.writeInt16(AiPowerChargerRegisterEnum.SCHEDULE_FLAG.getAddr(), (short) 3);
         return true;
     }
 }
diff --git a/zy-acs-common/src/main/java/com/zy/acs/common/constant/RedisConstant.java b/zy-acs-common/src/main/java/com/zy/acs/common/constant/RedisConstant.java
index 84d4f7c..343b060 100644
--- a/zy-acs-common/src/main/java/com/zy/acs/common/constant/RedisConstant.java
+++ b/zy-acs-common/src/main/java/com/zy/acs/common/constant/RedisConstant.java
@@ -54,7 +54,9 @@
     public static final String MAP_LANE_DATA = "MAP_LANE_DATA";
 
     public static final String MAP_AREA_DATA_FLAG = "MAP_AREA_DATA_FLAG";
-
+    /**
+     * 鍦╮edis涓瓨MAP锛寁alue琛ㄧず鐘舵�侊細1灏忚溅鍒颁綅锛�2涓嬪彂鍏呯數鍛戒护锛�3鍚庨��鍒颁綅娑堝け锛�4鍓嶈繘鍒颁綅鍑虹幇锛�5鐢垫祦鐢靛帇>0,6
+     */
     public static final String AGV_CHARGE_FLAG = "AGV_CHARGE_FLAG";
 
 }
diff --git a/zy-acs-flow/src/page/funcTask/FuncTaskCreate.jsx b/zy-acs-flow/src/page/funcTask/FuncTaskCreate.jsx
deleted file mode 100644
index 6e6955d..0000000
--- a/zy-acs-flow/src/page/funcTask/FuncTaskCreate.jsx
+++ /dev/null
@@ -1,144 +0,0 @@
-import React, { useState, useRef, useEffect, useMemo } from "react";
-import {
-    CreateBase,
-    useTranslate,
-    TextInput,
-    NumberInput,
-    BooleanInput,
-    DateInput,
-    SaveButton,
-    SelectInput,
-    ReferenceInput,
-    ReferenceArrayInput,
-    AutocompleteInput,
-    Toolbar,
-    required,
-    useDataProvider,
-    useNotify,
-    Form,
-    useCreateController,
-} from 'react-admin';
-import {
-    Dialog,
-    DialogActions,
-    DialogContent,
-    DialogTitle,
-    Stack,
-    Grid,
-    Box,
-} from '@mui/material';
-import DialogCloseButton from "../components/DialogCloseButton";
-import StatusSelectInput from "../components/StatusSelectInput";
-import MemoInput from "../components/MemoInput";
-
-const FuncTaskCreate = (props) => {
-    const { open, setOpen } = props;
-
-    const translate = useTranslate();
-    const notify = useNotify();
-
-    const handleClose = (event, reason) => {
-        if (reason !== "backdropClick") {
-            setOpen(false);
-        }
-    };
-
-    const handleSuccess = async (data) => {
-        setOpen(false);
-        notify('common.response.success');
-    };
-
-    const handleError = async (error) => {
-        notify(error.message || 'common.response.fail', { type: 'error', messageArgs: { _: error.message } });
-    };
-
-    return (
-        <>
-            <CreateBase
-                record={{}}
-                transform={(data) => {
-                    return data;
-                }}
-                mutationOptions={{ onSuccess: handleSuccess, onError: handleError }}
-            >
-                <Dialog
-                    open={open}
-                    onClose={handleClose}
-                    aria-labelledby="form-dialog-title"
-                    fullWidth
-                    disableRestoreFocus
-                    maxWidth="md"   // 'xs' | 'sm' | 'md' | 'lg' | 'xl'
-                >
-                    <Form>
-                        <DialogTitle id="form-dialog-title" sx={{
-                            position: 'sticky',
-                            top: 0,
-                            backgroundColor: 'background.paper',
-                            zIndex: 1000
-                        }}
-                        >
-                            {translate('create.title')}
-                            <Box sx={{ position: 'absolute', top: 8, right: 8, zIndex: 1001 }}>
-                                <DialogCloseButton onClose={handleClose} />
-                            </Box>
-                        </DialogTitle>
-                        <DialogContent>
-                            <Grid container rowSpacing={2} columnSpacing={2}>
-                                <Grid item xs={6} display="flex" gap={1}>
-                                    <TextInput
-                                        label="table.field.funcTask.uuid"
-                                        source="uuid"
-                                        parse={v => v}
-                                        autoFocus
-                                    />
-                                </Grid>
-                                <Grid item xs={6} display="flex" gap={1}>
-                                    <TextInput
-                                        label="table.field.funcTask.taskId"
-                                        source="taskId"
-                                        parse={v => v}
-                                    />
-                                </Grid>
-                                <Grid item xs={6} display="flex" gap={1}>
-                                    <TextInput
-                                        label="table.field.funcTask.funcTaskSts"
-                                        source="funcTaskSts"
-                                        parse={v => v}
-                                    />
-                                </Grid>
-                                <Grid item xs={6} display="flex" gap={1}>
-                                    <NumberInput
-                                        label="table.field.funcTask.agvId"
-                                        source="agvId"
-                                    />
-                                </Grid>
-                                <Grid item xs={6} display="flex" gap={1}>
-                                    <NumberInput
-                                        label="table.field.funcTask.funcStaId"
-                                        source="funcStaId"
-                                    />
-                                </Grid>
-
-                                <Grid item xs={6} display="flex" gap={1}>
-                                    <StatusSelectInput />
-                                </Grid>
-                                <Grid item xs={12} display="flex" gap={1}>
-                                    <Stack direction="column" spacing={1} width={'100%'}>
-                                        <MemoInput />
-                                    </Stack>
-                                </Grid>
-                            </Grid>
-                        </DialogContent>
-                        <DialogActions sx={{ position: 'sticky', bottom: 0, backgroundColor: 'background.paper', zIndex: 1000 }}>
-                            <Toolbar sx={{ width: '100%', justifyContent: 'space-between' }}  >
-                                <SaveButton />
-                            </Toolbar>
-                        </DialogActions>
-                    </Form>
-                </Dialog>
-            </CreateBase>
-        </>
-    )
-}
-
-export default FuncTaskCreate;
diff --git a/zy-acs-flow/src/page/funcTask/FuncTaskEdit.jsx b/zy-acs-flow/src/page/funcTask/FuncTaskEdit.jsx
deleted file mode 100644
index 38797ef..0000000
--- a/zy-acs-flow/src/page/funcTask/FuncTaskEdit.jsx
+++ /dev/null
@@ -1,116 +0,0 @@
-import React, { useState, useRef, useEffect, useMemo } from "react";
-import {
-    Edit,
-    SimpleForm,
-    FormDataConsumer,
-    useTranslate,
-    TextInput,
-    NumberInput,
-    BooleanInput,
-    DateInput,
-    SelectInput,
-    ReferenceInput,
-    ReferenceArrayInput,
-    AutocompleteInput,
-    SaveButton,
-    Toolbar,
-    Labeled,
-    NumberField,
-    required,
-    useRecordContext,
-    DeleteButton,
-} from 'react-admin';
-import { useWatch, useFormContext } from "react-hook-form";
-import { Stack, Grid, Box, Typography } from '@mui/material';
-import * as Common from '@/utils/common';
-import { EDIT_MODE, REFERENCE_INPUT_PAGESIZE } from '@/config/setting';
-import EditBaseAside from "../components/EditBaseAside";
-import CustomerTopToolBar from "../components/EditTopToolBar";
-import MemoInput from "../components/MemoInput";
-import StatusSelectInput from "../components/StatusSelectInput";
-
-const FormToolbar = () => {
-    const { getValues } = useFormContext();
-
-    return (
-        <Toolbar sx={{ justifyContent: 'space-between' }}>
-            <SaveButton />
-            <DeleteButton mutationMode="optimistic" />
-        </Toolbar>
-    )
-}
-
-const FuncTaskEdit = () => {
-    const translate = useTranslate();
-
-    return (
-        <Edit
-            redirect="list"
-            mutationMode={EDIT_MODE}
-            actions={<CustomerTopToolBar />}
-            aside={<EditBaseAside />}
-        >
-            <SimpleForm
-                shouldUnregister
-                warnWhenUnsavedChanges
-                toolbar={<FormToolbar />}
-                mode="onTouched"
-                defaultValues={{}}
-            // validate={(values) => { }}
-            >
-                <Grid container width={{ xs: '100%', xl: '80%' }} rowSpacing={3} columnSpacing={3}>
-                    <Grid item xs={12} md={8}>
-                        <Typography variant="h6" gutterBottom>
-                            {translate('common.edit.title.main')}
-                        </Typography>
-                        <Stack direction='row' gap={2}>
-                            <TextInput
-                                label="table.field.funcTask.uuid"
-                                source="uuid"
-                                parse={v => v}
-                                autoFocus
-                            />
-                        </Stack>
-                        <Stack direction='row' gap={2}>
-                            <TextInput
-                                label="table.field.funcTask.taskId"
-                                source="taskId"
-                                parse={v => v}
-                            />
-                        </Stack>
-                        <Stack direction='row' gap={2}>
-                            <TextInput
-                                label="table.field.funcTask.funcTaskSts"
-                                source="funcTaskSts"
-                                parse={v => v}
-                            />
-                        </Stack>
-                        <Stack direction='row' gap={2}>
-                            <NumberInput
-                                label="table.field.funcTask.agvId"
-                                source="agvId"
-                            />
-                        </Stack>
-                        <Stack direction='row' gap={2}>
-                            <NumberInput
-                                label="table.field.funcTask.funcStaId"
-                                source="funcStaId"
-                            />
-                        </Stack>
-
-                    </Grid>
-                    <Grid item xs={12} md={4}>
-                        <Typography variant="h6" gutterBottom>
-                            {translate('common.edit.title.common')}
-                        </Typography>
-                        <StatusSelectInput />
-                        <Box mt="2em" />
-                        <MemoInput />
-                    </Grid>
-                </Grid>
-            </SimpleForm>
-        </Edit >
-    )
-}
-
-export default FuncTaskEdit;
diff --git a/zy-acs-flow/src/page/funcTask/FuncTaskList.jsx b/zy-acs-flow/src/page/funcTask/FuncTaskList.jsx
deleted file mode 100644
index 1fc80b9..0000000
--- a/zy-acs-flow/src/page/funcTask/FuncTaskList.jsx
+++ /dev/null
@@ -1,160 +0,0 @@
-import React, { useState, useRef, useEffect, useMemo, useCallback } from "react";
-import { useNavigate } from 'react-router-dom';
-import {
-    List,
-    DatagridConfigurable,
-    SearchInput,
-    TopToolbar,
-    SelectColumnsButton,
-    EditButton,
-    FilterButton,
-    CreateButton,
-    ExportButton,
-    BulkDeleteButton,
-    WrapperField,
-    useRecordContext,
-    useTranslate,
-    useNotify,
-    useListContext,
-    FunctionField,
-    TextField,
-    NumberField,
-    DateField,
-    BooleanField,
-    ReferenceField,
-    TextInput,
-    DateTimeInput,
-    DateInput,
-    SelectInput,
-    NumberInput,
-    ReferenceInput,
-    ReferenceArrayInput,
-    AutocompleteInput,
-    DeleteButton,
-} from 'react-admin';
-import { Box, Typography, Card, Stack } from '@mui/material';
-import { styled } from '@mui/material/styles';
-import FuncTaskCreate from "./FuncTaskCreate";
-import FuncTaskPanel from "./FuncTaskPanel";
-import EmptyData from "../components/EmptyData";
-import MyCreateButton from "../components/MyCreateButton";
-import MyExportButton from '../components/MyExportButton';
-import PageDrawer from "../components/PageDrawer";
-import MyField from "../components/MyField";
-import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE } from '@/config/setting';
-import * as Common from '@/utils/common';
-
-const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({
-    '& .css-1vooibu-MuiSvgIcon-root': {
-        height: '.9em'
-    },
-    '& .RaDatagrid-row': {
-        cursor: 'auto'
-    },
-    '& .column-name': {
-    },
-    '& .opt': {
-        width: 200
-    },
-}));
-
-const filters = [
-    <SearchInput source="condition" alwaysOn />,
-    <DateInput label='common.time.after' source="timeStart" alwaysOn />,
-    <DateInput label='common.time.before' source="timeEnd" alwaysOn />,
-
-    <TextInput source="uuid" label="table.field.funcTask.uuid" />,
-    <TextInput source="taskId" label="table.field.funcTask.taskId" />,
-    <TextInput source="funcTaskSts" label="table.field.funcTask.funcTaskSts" />,
-    <NumberInput source="agvId" label="table.field.funcTask.agvId" />,
-    <NumberInput source="funcStaId" label="table.field.funcTask.funcStaId" />,
-
-    <TextInput label="common.field.memo" source="memo" />,
-    <SelectInput
-        label="common.field.status"
-        source="status"
-        choices={[
-            { id: '1', name: 'common.enums.statusTrue' },
-            { id: '0', name: 'common.enums.statusFalse' },
-        ]}
-        resettable
-    />,
-]
-
-const FuncTaskList = () => {
-    const translate = useTranslate();
-
-    const [createDialog, setCreateDialog] = useState(false);
-    const [drawerVal, setDrawerVal] = useState(false);
-
-    return (
-        <Box display="flex">
-            <List
-                sx={{
-                    flexGrow: 1,
-                    transition: (theme) =>
-                        theme.transitions.create(['all'], {
-                            duration: theme.transitions.duration.enteringScreen,
-                        }),
-                    marginRight: !!drawerVal ? `${PAGE_DRAWER_WIDTH}px` : 0,
-                }}
-                title={"menu.funcTask"}
-                empty={<EmptyData onClick={() => { setCreateDialog(true) }} />}
-                filters={filters}
-                sort={{ field: "create_time", order: "desc" }}
-                actions={(
-                    <TopToolbar>
-                        <FilterButton />
-                        <MyCreateButton onClick={() => { setCreateDialog(true) }} />
-                        <SelectColumnsButton preferenceKey='funcTask' />
-                        <MyExportButton />
-                    </TopToolbar>
-                )}
-                perPage={DEFAULT_PAGE_SIZE}
-            >
-                <StyledDatagrid
-                    preferenceKey='funcTask'
-                    bulkActionButtons={() => <BulkDeleteButton mutationMode={OPERATE_MODE} />}
-                    rowClick={(id, resource, record) => false}
-                    expand={() => <FuncTaskPanel />}
-                    expandSingle={true}
-                    omit={['id', 'createTime', 'createBy', 'memo']}
-                >
-                    <NumberField source="id" />
-                    <TextField source="uuid" label="table.field.funcTask.uuid" />
-                    <TextField source="taskId" label="table.field.funcTask.taskId" />
-                    <TextField source="funcTaskSts" label="table.field.funcTask.funcTaskSts" />
-                    <NumberField source="agvId" label="table.field.funcTask.agvId" />
-                    <NumberField source="funcStaId" label="table.field.funcTask.funcStaId" />
-
-                    <ReferenceField source="updateBy" label="common.field.updateBy" reference="user" link={false} sortable={false}>
-                        <TextField source="nickname" />
-                    </ReferenceField>
-                    <DateField source="updateTime" label="common.field.updateTime" showTime />
-                    <ReferenceField source="createBy" label="common.field.createBy" reference="user" link={false} sortable={false}>
-                        <TextField source="nickname" />
-                    </ReferenceField>
-                    <DateField source="createTime" label="common.field.createTime" showTime />
-                    <BooleanField source="statusBool" label="common.field.status" sortable={false} />
-                    <TextField source="memo" label="common.field.memo" sortable={false} />
-                    <WrapperField cellClassName="opt" label="common.field.opt">
-                        <EditButton sx={{ padding: '1px', fontSize: '.75rem' }} />
-                        <DeleteButton sx={{ padding: '1px', fontSize: '.75rem' }} mutationMode={OPERATE_MODE} />
-                    </WrapperField>
-                </StyledDatagrid>
-            </List>
-            <FuncTaskCreate
-                open={createDialog}
-                setOpen={setCreateDialog}
-            />
-            <PageDrawer
-                title='FuncTask Detail'
-                drawerVal={drawerVal}
-                setDrawerVal={setDrawerVal}
-            >
-            </PageDrawer>
-        </Box>
-    )
-}
-
-export default FuncTaskList;
diff --git a/zy-acs-flow/src/page/funcTask/FuncTaskPanel.jsx b/zy-acs-flow/src/page/funcTask/FuncTaskPanel.jsx
deleted file mode 100644
index bfce6b9..0000000
--- a/zy-acs-flow/src/page/funcTask/FuncTaskPanel.jsx
+++ /dev/null
@@ -1,81 +0,0 @@
-import React, { useState, useRef, useEffect, useMemo } from "react";
-import { Box, Card, CardContent, Grid, Typography, Tooltip } from '@mui/material';
-import {
-    useTranslate,
-    useRecordContext,
-} from 'react-admin';
-import PanelTypography from "../components/PanelTypography";
-import * as Common from '@/utils/common'
-
-const FuncTaskPanel = () => {
-    const record = useRecordContext();
-    if (!record) return null;
-    const translate = useTranslate();
-    return (
-        <>
-            <Card sx={{ width: { xs: 300, sm: 500, md: 600, lg: 800 }, margin: 'auto' }}>
-                <CardContent>
-                    <Grid container spacing={2}>
-                        <Grid item xs={12} sx={{ display: 'flex', justifyContent: 'space-between' }}>
-                            <Typography variant="h6" gutterBottom align="left" sx={{
-                                maxWidth: { xs: '100px', sm: '180px', md: '260px', lg: '360px' },
-                                whiteSpace: 'nowrap',
-                                overflow: 'hidden',
-                                textOverflow: 'ellipsis',
-                            }}>
-                                {Common.camelToPascalWithSpaces(translate('table.field.funcTask.id'))}: {record.id}
-                            </Typography>
-                            {/*  inherit, primary, secondary, textPrimary, textSecondary, error */}
-                            <Typography variant="h6" gutterBottom align="right" >
-                                ID: {record.id}
-                            </Typography>
-                        </Grid>
-                    </Grid>
-                    <Grid container spacing={2}>
-                        <Grid item xs={12} container alignContent="flex-end">
-                            <Typography variant="caption" color="textSecondary" sx={{ wordWrap: 'break-word', wordBreak: 'break-all' }}>
-                                {Common.camelToPascalWithSpaces(translate('common.field.memo'))}:{record.memo}
-                            </Typography>
-                        </Grid>
-                    </Grid>
-                    <Box height={20}>&nbsp;</Box>
-                    <Grid container spacing={2}>
-                        <Grid item xs={6}>
-                            <PanelTypography
-                                title="table.field.funcTask.uuid" 
-                                property={record.uuid}
-                            />
-                        </Grid>
-                        <Grid item xs={6}>
-                            <PanelTypography
-                                title="table.field.funcTask.taskId" 
-                                property={record.taskId}
-                            />
-                        </Grid>
-                        <Grid item xs={6}>
-                            <PanelTypography
-                                title="table.field.funcTask.funcTaskSts" 
-                                property={record.funcTaskSts}
-                            />
-                        </Grid>
-                        <Grid item xs={6}>
-                            <PanelTypography
-                                title="table.field.funcTask.agvId" 
-                                property={record.agvId}
-                            />
-                        </Grid>
-                        <Grid item xs={6}>
-                            <PanelTypography
-                                title="table.field.funcTask.funcStaId" 
-                                property={record.funcStaId}
-                            />
-                        </Grid>
-
-                    </Grid>
-                </CardContent>
-            </Card >
-        </>
-    );
-};
-
-export default FuncTaskPanel;
diff --git a/zy-acs-flow/src/page/funcTask/index.jsx b/zy-acs-flow/src/page/funcTask/index.jsx
deleted file mode 100644
index 9ba88ea..0000000
--- a/zy-acs-flow/src/page/funcTask/index.jsx
+++ /dev/null
@@ -1,18 +0,0 @@
-import React, { useState, useRef, useEffect, useMemo } from "react";
-import {
-    ListGuesser,
-    EditGuesser,
-    ShowGuesser,
-} from "react-admin";
-
-import FuncTaskList from "./FuncTaskList";
-import FuncTaskEdit from "./FuncTaskEdit";
-
-export default {
-    list: FuncTaskList,
-    edit: FuncTaskEdit,
-    show: ShowGuesser,
-    recordRepresentation: (record) => {
-        return `${record.id}`
-    }
-};
diff --git a/zy-acs-manager/pom.xml b/zy-acs-manager/pom.xml
index 53469b6..0c57d09 100644
--- a/zy-acs-manager/pom.xml
+++ b/zy-acs-manager/pom.xml
@@ -171,6 +171,12 @@
             <artifactId>iot-communication</artifactId>
             <version>1.5.6</version>
         </dependency>
+        <dependency>
+            <groupId>com.zy</groupId>
+            <artifactId>acs-charge</artifactId>
+            <version>1.0.0</version>
+            <scope>compile</scope>
+        </dependency>
     </dependencies>
 
     <build>
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/scheduler/MaintainScheduler.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/scheduler/MaintainScheduler.java
index e817f55..e8e0107 100644
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/scheduler/MaintainScheduler.java
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/scheduler/MaintainScheduler.java
@@ -1,6 +1,10 @@
 package com.zy.acs.manager.core.scheduler;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.github.xingshuangs.iot.protocol.modbus.service.ModbusRtuOverTcp;
+import com.github.xingshuangs.iot.protocol.modbus.service.ModbusTcp;
+import com.zy.acs.charge.ChargeCoreService;
+import com.zy.acs.common.constant.RedisConstant;
 import com.zy.acs.common.enums.AgvStatusType;
 import com.zy.acs.common.utils.RedisSupport;
 import com.zy.acs.framework.common.Cools;
@@ -8,6 +12,7 @@
 import com.zy.acs.manager.common.config.UplinkProperties;
 import com.zy.acs.manager.core.integrate.wms.TaskReportService;
 import com.zy.acs.manager.core.integrate.wms.FaultReportService;
+import com.zy.acs.manager.core.service.ChargeService;
 import com.zy.acs.manager.core.service.MainLockWrapService;
 import com.zy.acs.manager.manager.entity.*;
 import com.zy.acs.manager.manager.enums.*;
@@ -23,6 +28,7 @@
 import java.util.Date;
 import java.util.List;
 import java.util.Optional;
+import java.util.Set;
 
 /**
  * judge whether agv go to funcSta which be charging or standby
@@ -59,7 +65,9 @@
     @Autowired
     private FaultReportService faultReportService;
     @Autowired
-    private FuncTaskService funcTaskService;
+    private ChargeService chargeService;
+    @Autowired
+    private ChargeCoreService chargeCoreService;
 
 
     @Scheduled(cron = "0/5 * * * * ? ")
@@ -119,6 +127,10 @@
 //            if (agvDetailService.isPowerLoss(agv, agvDetail, agvModel)) {
 //                continue;
 //            }
+            // 瀛樺湪鍏呯數鏍囪锛岃烦杩�
+            if (redis.getMap(RedisConstant.AGV_CHARGE_FLAG, agv.getUuid()) != null) {
+                continue;
+            }
             // is charging ?
             if (agvDetail.getAgvStatus().equals(AgvStatusType.CHARGE)) {
                 if (agvDetail.getSoc() < agvModel.getQuaBattery()) {
@@ -221,12 +233,46 @@
 
     }
 
+    /**
+     * 璋冨害瀵规帴鍏呯數妗�
+     */
     @Scheduled(cron = "0/5 * * * * ? ")
-    private synchronized void workFuncTask() {
-        List<FuncTask> funcTaskList = funcTaskService.list(new LambdaQueryWrapper<FuncTask>().eq(FuncTask::getFuncTaskSts, TaskStsType.INIT.toString()));
-        for (FuncTask funcTask : funcTaskList) {
-            // 璋冨害灏忚溅鍘诲鎺ュ厖鐢垫々
-
+    private synchronized void startCharge() {
+        Set<String> mapKeys = redis.getMapKeys(RedisConstant.AGV_CHARGE_FLAG);
+        for (String key : mapKeys) {
+            Integer status = redis.getMap(RedisConstant.AGV_CHARGE_FLAG, key);
+            AgvDetail agvDetail = agvDetailService.selectByAgvNo(key);
+            FuncSta funcSta = funcStaService.getByCodeAndType(agvDetail.getCode(), FuncStaType.CHARGE.toString());
+            ModbusRtuOverTcp modbusTcp = chargeService.get(funcSta.getUuid());
+            if (status != null && status == 1) {
+                // 鍚庨��淇″彿娑堝け锛岃鏄庨┈杈炬鍦ㄥ墠杩�
+                if (chargeCoreService.checkBackwardRelayOffline(modbusTcp)) {
+                    chargeCoreService.startCharging(modbusTcp);
+                }
+                while (chargeCoreService.checkForwardRelayOnline(modbusTcp)) {
+                    double current = chargeCoreService.getCurrent(modbusTcp);
+                    double voltage = chargeCoreService.getVoltage(modbusTcp);
+                    if (current > 0 && voltage > 0) {
+                        redis.setMap(RedisConstant.AGV_CHARGE_FLAG, key, 2);
+                        log.info("charge complete");
+                    }else {
+                        log.info("read charge current and voltage: {},{}", current, voltage);
+                    }
+                }
+            } else if (status != null && status == 2) {
+                // 鍚庨��淇″彿娑堝け锛岃鏄庨┈杈炬鍦ㄥ墠杩�
+                if (chargeCoreService.checkForwardRelayOnline(modbusTcp)) {
+                    chargeCoreService.startCharging(modbusTcp);
+                }
+                while (chargeCoreService.checkBackwardRelayOffline(modbusTcp)) {
+                    redis.deleteMap(RedisConstant.AGV_CHARGE_FLAG, key);
+                    log.info("charge over");
+                }
+            }
         }
     }
+
+
+
+
 }
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/ChargeService.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/ChargeService.java
index 52c1f6b..707c4f5 100644
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/ChargeService.java
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/ChargeService.java
@@ -1,6 +1,7 @@
 package com.zy.acs.manager.core.service;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.github.xingshuangs.iot.protocol.modbus.service.ModbusRtuOverTcp;
 import com.github.xingshuangs.iot.protocol.modbus.service.ModbusTcp;
 import com.github.xingshuangs.iot.utils.HexUtil;
 import com.zy.acs.framework.common.Cools;
@@ -25,7 +26,7 @@
     @Autowired
     private FuncStaService funcStaService;
 
-    private final Map<String, ModbusTcp> CHARGE_CACHE = new ConcurrentHashMap<>();
+    private final Map<String, ModbusRtuOverTcp> CHARGE_CACHE = new ConcurrentHashMap<>();
 
 
     @PostConstruct
@@ -42,7 +43,7 @@
 
 
     public void add(FuncSta funcSta) {
-        ModbusTcp modbusTcp = new ModbusTcp(funcSta.getIp(), funcSta.getPort());
+        ModbusRtuOverTcp modbusTcp = new ModbusRtuOverTcp(funcSta.getIp(), funcSta.getPort());
         modbusTcp.setComCallback((tag, bytes) -> log.info("%s[%d] %s%n", tag, bytes.length, HexUtil.toHexString(bytes)));
         CHARGE_CACHE.put(funcSta.getUuid(), modbusTcp);
     }
@@ -51,14 +52,15 @@
         CHARGE_CACHE.remove(chargePointId);
     }
 
-    public ModbusTcp get(String chargePointId) {
-        ModbusTcp modbusTcp = CHARGE_CACHE.get(chargePointId);
+    public ModbusRtuOverTcp get(String chargePointId) {
+        ModbusRtuOverTcp modbusTcp = CHARGE_CACHE.get(chargePointId);
         if (modbusTcp != null) {
             return modbusTcp;
         }
         FuncSta funcSta = funcStaService.getOne(new LambdaQueryWrapper<FuncSta>().eq(FuncSta::getUuid, chargePointId));
-        modbusTcp = new ModbusTcp(funcSta.getIp(), funcSta.getPort());
+        modbusTcp = new ModbusRtuOverTcp(funcSta.getIp(), funcSta.getPort());
         modbusTcp.setComCallback((tag, bytes) -> log.info("%s[%d] %s%n", tag, bytes.length, HexUtil.toHexString(bytes)));
+        CHARGE_CACHE.put(chargePointId, modbusTcp);
         return modbusTcp;
     }
 
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainService.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainService.java
index b871092..ad44410 100644
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainService.java
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/MainService.java
@@ -98,8 +98,7 @@
     private StaReserveService staReserveService;
     @Autowired
     private ConveyorStationService conveyorStationService;
-    @Autowired
-    private FuncTaskService funcTaskService;
+
 
     @SuppressWarnings("all")
     @Transactional
@@ -1990,13 +1989,7 @@
                 // 鍦ㄥ厖鐢典换鍔¤璧板埌缁堢偣锛屽悓鏃跺垽鏂厖鐢垫々鐨勭被鍨�
                 if (segment.getPosType().equals(TaskPosDto.PosType.TO_CHARGE)){
                     // 淇濆瓨涓�鏉℃暟鎹�
-                    FuncTask funcTask = new FuncTask();
-                    FuncSta destFuncSta = funcStaService.getByCodeAndType(task.getDestCode(), FuncStaType.CHARGE.toString());
-                    funcTask.setFuncStaId(destFuncSta.getId());
-                    funcTask.setAgvId(segment.getAgvId());
-                    funcTask.setTaskId(segment.getTaskId());
-                    funcTask.setFuncTaskSts(TaskStsType.INIT.val());
-                    funcTaskService.save(funcTask);
+                    redis.setMap(RedisConstant.AGV_CHARGE_FLAG,segment.getAgvId$(),1);
                 }
                 task.setTaskSts(TaskStsType.COMPLETE.val());
                 task.setEndTime(now);
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/controller/FuncTaskController.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/controller/FuncTaskController.java
deleted file mode 100644
index e809e96..0000000
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/controller/FuncTaskController.java
+++ /dev/null
@@ -1,111 +0,0 @@
-package com.zy.acs.manager.manager.controller;
-
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.zy.acs.framework.common.Cools;
-import com.zy.acs.framework.common.R;
-import com.zy.acs.manager.common.utils.ExcelUtil;
-import com.zy.acs.manager.common.annotation.OperationLog;
-import com.zy.acs.manager.common.domain.BaseParam;
-import com.zy.acs.manager.common.domain.KeyValVo;
-import com.zy.acs.manager.common.domain.PageParam;
-import com.zy.acs.manager.manager.entity.FuncTask;
-import com.zy.acs.manager.manager.service.FuncTaskService;
-import com.zy.acs.manager.system.controller.BaseController;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.web.bind.annotation.*;
-
-import javax.servlet.http.HttpServletResponse;
-import java.util.*;
-
-@RestController
-@RequestMapping("/api")
-public class FuncTaskController extends BaseController {
-
-    @Autowired
-    private FuncTaskService funcTaskService;
-
-    @PreAuthorize("hasAuthority('manager:funcTask:list')")
-    @PostMapping("/funcTask/page")
-    public R page(@RequestBody Map<String, Object> map) {
-        BaseParam baseParam = buildParam(map, BaseParam.class);
-        PageParam<FuncTask, BaseParam> pageParam = new PageParam<>(baseParam, FuncTask.class);
-        return R.ok().add(funcTaskService.page(pageParam, pageParam.buildWrapper(true)));
-    }
-
-    @PreAuthorize("hasAuthority('manager:funcTask:list')")
-    @PostMapping("/funcTask/list")
-    public R list(@RequestBody Map<String, Object> map) {
-        return R.ok().add(funcTaskService.list());
-    }
-
-    @PreAuthorize("hasAuthority('manager:funcTask:list')")
-    @PostMapping({"/funcTask/many/{ids}", "/funcTasks/many/{ids}"})
-    public R many(@PathVariable Long[] ids) {
-        return R.ok().add(funcTaskService.listByIds(Arrays.asList(ids)));
-    }
-
-    @PreAuthorize("hasAuthority('manager:funcTask:list')")
-    @GetMapping("/funcTask/{id}")
-    public R get(@PathVariable("id") Long id) {
-        return R.ok().add(funcTaskService.getById(id));
-    }
-
-    @PreAuthorize("hasAuthority('manager:funcTask:save')")
-    @OperationLog("Create 鍔熻兘绔欑偣浠诲姟琛�")
-    @PostMapping("/funcTask/save")
-    public R save(@RequestBody FuncTask funcTask) {
-        funcTask.setCreateBy(getLoginUserId());
-        funcTask.setCreateTime(new Date());
-        funcTask.setUpdateBy(getLoginUserId());
-        funcTask.setUpdateTime(new Date());
-        if (!funcTaskService.save(funcTask)) {
-            return R.error("Save Fail");
-        }
-        return R.ok("Save Success").add(funcTask);
-    }
-
-    @PreAuthorize("hasAuthority('manager:funcTask:update')")
-    @OperationLog("Update 鍔熻兘绔欑偣浠诲姟琛�")
-    @PostMapping("/funcTask/update")
-    public R update(@RequestBody FuncTask funcTask) {
-        funcTask.setUpdateBy(getLoginUserId());
-        funcTask.setUpdateTime(new Date());
-        if (!funcTaskService.updateById(funcTask)) {
-            return R.error("Update Fail");
-        }
-        return R.ok("Update Success").add(funcTask);
-    }
-
-    @PreAuthorize("hasAuthority('manager:funcTask:remove')")
-    @OperationLog("Delete 鍔熻兘绔欑偣浠诲姟琛�")
-    @PostMapping("/funcTask/remove/{ids}")
-    public R remove(@PathVariable Long[] ids) {
-        if (!funcTaskService.removeByIds(Arrays.asList(ids))) {
-            return R.error("Delete Fail");
-        }
-        return R.ok("Delete Success").add(ids);
-    }
-
-    @PreAuthorize("hasAuthority('manager:funcTask:list')")
-    @PostMapping("/funcTask/query")
-    public R query(@RequestParam(required = false) String condition) {
-        List<KeyValVo> vos = new ArrayList<>();
-        LambdaQueryWrapper<FuncTask> wrapper = new LambdaQueryWrapper<>();
-        if (!Cools.isEmpty(condition)) {
-            wrapper.like(FuncTask::getId, condition);
-        }
-        funcTaskService.page(new Page<>(1, 30), wrapper).getRecords().forEach(
-                item -> vos.add(new KeyValVo(item.getId(), item.getId()))
-        );
-        return R.ok().add(vos);
-    }
-
-    @PreAuthorize("hasAuthority('manager:funcTask:list')")
-    @PostMapping("/funcTask/export")
-    public void export(@RequestBody Map<String, Object> map, HttpServletResponse response) throws Exception {
-        ExcelUtil.build(ExcelUtil.create(funcTaskService.list(), FuncTask.class), response);
-    }
-
-}
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/entity/FuncSta.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/entity/FuncSta.java
index 19ebdde..40e96ed 100644
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/entity/FuncSta.java
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/entity/FuncSta.java
@@ -86,6 +86,12 @@
     private Integer port;
 
     /**
+     * 鏁呴殰淇℃伅
+     */
+    @ApiModelProperty(value= "鏁呴殰淇℃伅")
+    private String error;
+
+    /**
      * 鐜扮姸
      */
     @ApiModelProperty(value= "鐜扮姸")
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/entity/FuncTask.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/entity/FuncTask.java
deleted file mode 100644
index 6062037..0000000
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/entity/FuncTask.java
+++ /dev/null
@@ -1,83 +0,0 @@
-package com.zy.acs.manager.manager.entity;
-
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableName;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-
-import java.util.Date;
-
-@Data
-@TableName("man_func_task")
-public class FuncTask {
-
-    @ApiModelProperty(value= "ID")
-    @TableId(value = "id", type = IdType.AUTO)
-    private Long id;
-
-    @ApiModelProperty(value= "缂栧彿")
-    private String uuid;
-
-    @ApiModelProperty(value= "浠诲姟id")
-    private Long taskId;
-
-
-    @ApiModelProperty(value= "浠诲姟杩涘害")
-    private Long funcTaskSts;
-
-    //@ApiModelProperty(value= "浠诲姟绫诲瀷")
-    //private Long taskType;
-
-    @ApiModelProperty(value= "AGV")
-    private Long agvId;
-
-    @ApiModelProperty(value= "鍔熻兘绔檌d")
-    private Long funcStaId;
-
-
-
-
-    @ApiModelProperty(value= "鐘舵�� 1: 姝e父  0: 鍐荤粨  ")
-    private Integer status;
-
-    @ApiModelProperty(value= "鏄惁鍒犻櫎 1: 鏄�  0: 鍚�  ")
-    private Integer deleted;
-
-    @ApiModelProperty(value= "绉熸埛")
-    private Long tenantId;
-
-    @ApiModelProperty(value= "娣诲姞浜哄憳")
-    private Long createBy;
-
-    @ApiModelProperty(value= "娣诲姞鏃堕棿")
-    private Date createTime;
-
-    @ApiModelProperty(value= "淇敼浜哄憳")
-    private Long updateBy;
-
-    @ApiModelProperty(value= "淇敼鏃堕棿")
-    private Date updateTime;
-
-    @ApiModelProperty(value= "澶囨敞")
-    private String memo;
-
-    public FuncTask() {
-    }
-
-    public FuncTask(String uuid, Long taskId, Long funcTaskSts, Long agvId, Long funcStaId, Integer status, Integer deleted, Long tenantId, Long createBy, Date createTime, Long updateBy, Date updateTime, String memo) {
-        this.uuid = uuid;
-        this.taskId = taskId;
-        this.funcTaskSts = funcTaskSts;
-        this.agvId = agvId;
-        this.funcStaId = funcStaId;
-        this.status = status;
-        this.deleted = deleted;
-        this.tenantId = tenantId;
-        this.createBy = createBy;
-        this.createTime = createTime;
-        this.updateBy = updateBy;
-        this.updateTime = updateTime;
-        this.memo = memo;
-    }
-}
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/enums/FuncStaStateType.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/enums/FuncStaStateType.java
index 070bd6b..b2cbebe 100644
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/enums/FuncStaStateType.java
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/enums/FuncStaStateType.java
@@ -6,6 +6,7 @@
 
     IDLE,
     OCCUPIED,
+    ERROR,
     ;
 
     public static FuncStaStateType query(String state) {
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/mapper/FuncTaskMapper.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/mapper/FuncTaskMapper.java
deleted file mode 100644
index 206f080..0000000
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/mapper/FuncTaskMapper.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package com.zy.acs.manager.manager.mapper;
-
-import com.zy.acs.manager.manager.entity.FuncTask;
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import org.apache.ibatis.annotations.Mapper;
-import org.springframework.stereotype.Repository;
-
-@Mapper
-@Repository
-public interface FuncTaskMapper extends BaseMapper<FuncTask> {
-
-}
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/FuncTaskService.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/FuncTaskService.java
deleted file mode 100644
index 1e8fc1e..0000000
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/FuncTaskService.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package com.zy.acs.manager.manager.service;
-
-import com.baomidou.mybatisplus.extension.service.IService;
-import com.zy.acs.manager.manager.entity.FuncTask;
-
-public interface FuncTaskService extends IService<FuncTask> {
-
-}
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/AgvServiceImpl.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/AgvServiceImpl.java
index 4fb9bd3..35df23b 100644
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/AgvServiceImpl.java
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/AgvServiceImpl.java
@@ -224,6 +224,10 @@
                 return false;
             }
         }
+        if (redis.getMap(RedisConstant.AGV_CHARGE_FLAG,agvDetail.getUuid()) != null) {
+            log.warn("[{}]鍙稟gv鍦╮edis瀛樺湪鍏呯數鏍囪瘑......", agvNo);
+            return false;
+        }
         if (agvDetail.getAgvStatus().equals(AgvStatusType.CHARGE)) {
             if (agvDetail.getSoc() < agvModel.getQuaBattery()) {
                 return false;
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/FuncTaskServiceImpl.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/FuncTaskServiceImpl.java
deleted file mode 100644
index 9f7fe16..0000000
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/service/impl/FuncTaskServiceImpl.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package com.zy.acs.manager.manager.service.impl;
-
-import com.zy.acs.manager.manager.mapper.FuncTaskMapper;
-import com.zy.acs.manager.manager.entity.FuncTask;
-import com.zy.acs.manager.manager.service.FuncTaskService;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import org.springframework.stereotype.Service;
-
-@Service("funcTaskService")
-public class FuncTaskServiceImpl extends ServiceImpl<FuncTaskMapper, FuncTask> implements FuncTaskService {
-
-}
diff --git a/zy-acs-manager/src/main/java/funcTask.sql b/zy-acs-manager/src/main/java/funcTask.sql
deleted file mode 100644
index 32a6dd8..0000000
--- a/zy-acs-manager/src/main/java/funcTask.sql
+++ /dev/null
@@ -1,26 +0,0 @@
--- save funcTask record
--- mysql
-insert into `sys_menu` ( `name`, `parent_id`, `route`, `component`, `type`, `sort`, `tenant_id`, `status`) values ( 'menu.funcTask', '0', '/manager/funcTask', 'funcTask', '0' , '0', '1' , '1');
-
-insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `tenant_id`, `status`) values ( 'Query 鍔熻兘绔欑偣浠诲姟琛�', '', '1', 'manager:funcTask:list', '0', '1', '1');
-insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `tenant_id`, `status`) values ( 'Create 鍔熻兘绔欑偣浠诲姟琛�', '', '1', 'manager:funcTask:save', '1', '1', '1');
-insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `tenant_id`, `status`) values ( 'Update 鍔熻兘绔欑偣浠诲姟琛�', '', '1', 'manager:funcTask:update', '2', '1', '1');
-insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `tenant_id`, `status`) values ( 'Delete 鍔熻兘绔欑偣浠诲姟琛�', '', '1', 'manager:funcTask:remove', '3', '1', '1');
-
--- locale menu name
-funcTask: 'FuncTask',
-
--- locale field
-funcTask: {
-    uuid: "uuid",
-    taskId: "taskId",
-    funcTaskSts: "funcTaskSts",
-    agvId: "agvId",
-    funcStaId: "funcStaId",
-},
-
--- ResourceContent
-import funcTask from './funcTask';
-
-case 'funcTask':
-    return funcTask;

--
Gitblit v1.9.1