#
luxiaotao1123
2024-12-23 4f8eab6610413317b16fe6127c60ff994616e85a
#
5个文件已修改
138 ■■■■ 已修改文件
version/db/sqlIndex 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-fake/src/main/java/com/zy/acs/fake/AgvSimulatorTask.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-fake/src/main/java/com/zy/acs/fake/FakeProcessor.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/java/com/zy/acs/manager/fake/AgvSimulatorTask.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-acs-manager/src/main/java/com/zy/acs/manager/fake/FakeProcessor.java 134 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
version/db/sqlIndex
@@ -11,3 +11,4 @@
CREATE INDEX idx_task_type_uuid ON man_task_type(uuid);
CREATE INDEX idx_zone_uuid ON man_zone(uuid);
CREATE INDEX idx_agv_detail_agv_id ON man_agv_detail(agv_id);
CREATE INDEX idx_config_flag ON sys_config(flag);
zy-acs-fake/src/main/java/com/zy/acs/fake/AgvSimulatorTask.java
@@ -62,7 +62,6 @@
    @Override
    public void run() {
        try {
            FakeProcessor.AGV_PROCESSING_MAP.put(agv.getId(), true);
            String qrCode = null;
            for (Action action : actionList) {
                processAction(agv, action);
zy-acs-fake/src/main/java/com/zy/acs/fake/FakeProcessor.java
@@ -83,6 +83,7 @@
            if (!AGV_PROCESSING_MAP.get(agv.getId())) {
                List<Action> actionList = actionService.queryLatestGroup(agv.getId(), ActionStsType.ISSUED);
                if (!Cools.isEmpty(actionList)) {
                    AGV_PROCESSING_MAP.put(agv.getId(), true);
                    executorService.submit(new AgvSimulatorTask(
                            agv
                            , redis
zy-acs-manager/src/main/java/com/zy/acs/manager/fake/AgvSimulatorTask.java
@@ -65,7 +65,6 @@
    @Override
    public void run() {
        try {
            FakeProcessor.AGV_PROCESSING_MAP.put(agv.getId(), true);
            String qrCode = null;
            for (Action action : actionList) {
                processAction(agv, action);
zy-acs-manager/src/main/java/com/zy/acs/manager/fake/FakeProcessor.java
@@ -19,11 +19,15 @@
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
/**
 * Created by vincent on 11/9/2024
@@ -37,6 +41,14 @@
    public static final Map<Long, Boolean> AGV_PROCESSING_MAP = new ConcurrentHashMap<>();
    private ExecutorService executorService;
    private List<Agv> agvList = new ArrayList<>();
    private Thread heartBeatThread;
    private Thread responseThread;
    private Thread simulatorTread;
    @Autowired
    private AgvService agvService;
@@ -53,37 +65,68 @@
    @Autowired
    private JamService jamService;
    @PostConstruct
    public void init() {
        // heartBeat
        this.heartBeatThread = new Thread(() -> {
            while (!Thread.currentThread().isInterrupted()) {
                try {
                    Thread.sleep(1000);
                    if (configService.getVal("fakeSign", Boolean.class)) {
                        this.processOnline();
                    }
                } catch (Exception e) {
                    log.error("FakeProcessor.heartBeatThread fail", e);
                }
            }
        });
        this.heartBeatThread.start();
        // response the request
        this.responseThread = new Thread(() -> {
            while (!Thread.currentThread().isInterrupted()) {
                try {
                    Thread.sleep(100);
                    if (configService.getVal("fakeSign", Boolean.class)) {
                        this.responseTheRequest();
                    }
                } catch (Exception e) {
                    log.error("FakeProcessor.responseThread fail", e);
                }
            }
        });
        this.responseThread.start();
    /**
     * 1.AgvDataService.dataProcess [ agvDetail: vol, code, agvAngle, agvStatus ]
     * 2.MainService.upDataSubscribe
     * 3.AgvCmdService.executeRequest {@link com.zy.acs.manager.core.service.AgvCmdService#executeAgvActionCmd}
     * 4.AgvServiceImpl.judgeOnline
     * 5.
     */
    @Scheduled(cron = "0/1 * * * * ? ")
    public void process() {
        Boolean fakeSign = configService.getVal("fakeSign", Boolean.class);
        if (null == fakeSign || !fakeSign) {
            return;
        }
        // Simulator
        this.simulatorTread = new Thread(() -> {
            while (!Thread.currentThread().isInterrupted()) {
                try {
                    Thread.sleep(100);
        List<Agv> agvList = agvService.list(new LambdaQueryWrapper<Agv>().eq(Agv::getStatus, StatusType.ENABLE.val));
        // init executorService
                    if (configService.getVal("fakeSign", Boolean.class)) {
                        List<Agv> agvList = this.getAgvList();
        if (null == this.executorService) {
            int count = agvList.size();
            this.executorService = Executors.newFixedThreadPool(count);
        }
        this.responseTheRequest();
        for (Agv agv : agvList) {
            AGV_PROCESSING_MAP.putIfAbsent(agv.getId(), false);
            this.processOnline(agv);
            if (!AGV_PROCESSING_MAP.get(agv.getId())) {
                List<Action> actionList = actionService.queryLatestGroup(agv.getId(), ActionStsType.ISSUED);
                if (!Cools.isEmpty(actionList)) {
                                    AGV_PROCESSING_MAP.put(agv.getId(), true);
                    executorService.submit(new AgvSimulatorTask(
                            agv
                            , redis
@@ -98,19 +141,28 @@
            }
        }
                    } else {
                        this.shutdownFakeThreads();
    }
    private void processOnline(Agv agv) {
                } catch (Exception e) {
                    log.error("FakeProcessor.simulatorTread fail", e);
                }
            }
        });
        this.simulatorTread.start();
    }
    private void processOnline() {
        for (Agv agv : this.getAgvList()) {
        redis.setObject(RedisConstant.AGV_ONLINE_FLAG, agv.getUuid(), 1, 30);
        }
    }
    private void responseTheRequest() {
        AgvProtocol protocol = redis.pop(RedisConstant.AGV_PATH_DOWN_FLAG);
        if (null != protocol) {
            try {
                Thread.sleep(100);
            } catch (InterruptedException ignore) {}
            AGV_01_DOWN agv_01_down = (AGV_01_DOWN) protocol.getMessageBody();
            AGV_01_UP agv_01_up = new AGV_01_UP();
@@ -122,4 +174,48 @@
        }
    }
    public List<Agv> getAgvList() {
        if (Cools.isEmpty(this.agvList)) {
            this.agvList = agvService.list(new LambdaQueryWrapper<Agv>().eq(Agv::getStatus, StatusType.ENABLE.val));
            this.agvList.forEach(agv -> {AGV_PROCESSING_MAP.putIfAbsent(agv.getId(), false);});
        }
        return this.agvList;
    }
    public void shutdownFakeThreads() {
        if (this.executorService != null && !this.executorService.isShutdown()) {
            this.executorService.shutdown();
            try {
                if (!this.executorService.awaitTermination(60, TimeUnit.SECONDS)) {
                    this.executorService.shutdownNow();
                }
            } catch (InterruptedException e) {
                this.executorService.shutdownNow();
                Thread.currentThread().interrupt();
            }
            this.executorService = null; // 释放资源
        }
        if (!Cools.isEmpty(this.agvList)) {
            agvList = new ArrayList<>();
        }
        if (!AGV_PROCESSING_MAP.isEmpty()) {
            AGV_PROCESSING_MAP.clear();
        }
    }
    @PreDestroy
    public void shutDown(){
        if (this.heartBeatThread != null) {
            this.heartBeatThread .interrupt();
        }
        if (this.responseThread != null) {
            this.responseThread .interrupt();
        }
        if (this.simulatorTread != null) {
            this.simulatorTread.interrupt();
        }
        this.shutdownFakeThreads();
    }
}