package com.zy.acs.manager.fake; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.zy.acs.common.constant.RedisConstant; import com.zy.acs.common.domain.AgvProtocol; import com.zy.acs.common.domain.protocol.AGV_01_DOWN; import com.zy.acs.common.domain.protocol.AGV_01_UP; import com.zy.acs.common.utils.RedisSupport; import com.zy.acs.framework.common.Cools; import com.zy.acs.manager.core.service.MapService; import com.zy.acs.manager.manager.entity.Action; import com.zy.acs.manager.manager.entity.Agv; import com.zy.acs.manager.manager.enums.ActionStsType; import com.zy.acs.manager.manager.enums.StatusType; import com.zy.acs.manager.manager.service.*; import com.zy.acs.manager.system.service.ConfigService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * Created by vincent on 11/9/2024 */ @Slf4j @Component public class FakeProcessor { private final RedisSupport redis = RedisSupport.defaultRedisSupport; public static final Map AGV_PROCESSING_MAP = new ConcurrentHashMap<>(); private ExecutorService executorService; @Autowired private AgvService agvService; @Autowired private AgvDetailService agvDetailService; @Autowired private ActionService actionService; @Autowired private ConfigService configService; @Autowired private CodeService codeService; @Autowired private MapService mapService; @Autowired private JamService jamService; /** * 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; } List agvList = agvService.list(new LambdaQueryWrapper().eq(Agv::getStatus, StatusType.ENABLE.val)); // init executorService if (null == this.executorService) { int count = agvList.size() > 30 ? agvList.size() : 20; 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 actionList = actionService.queryLatestGroup(agv.getId(), ActionStsType.ISSUED); if (!Cools.isEmpty(actionList)) { executorService.submit(new AgvSimulatorTask( agv , redis , agvDetailService , actionService , codeService , mapService , jamService , actionList )); } } } } private void processOnline(Agv agv) { 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(); agv_01_up.setSerialNo(agv_01_down.getSerialNo()); redis.setObject(RedisConstant.AGV_PATH_UP_FLAG , protocol.getAgvNo() + "_" + agv_01_up.getSerialNo() , agv_01_up); } } }