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);
|
}
|
}
|
|
}
|