| package com.zy.acs.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.fake.entity.Action; | 
| import com.zy.acs.fake.entity.Agv; | 
| import com.zy.acs.fake.enums.ActionStsType; | 
| import com.zy.acs.fake.service.*; | 
| import com.zy.acs.framework.common.Cools; | 
| 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<Long, Boolean> 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<Agv> agvList = agvService.list(new LambdaQueryWrapper<Agv>().eq(Agv::getStatus, 1)); | 
|         // init executorService | 
|         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)) { | 
|                     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); | 
|         } | 
|     } | 
|   | 
| } |