package com.zy.acs.fake; 
 | 
  
 | 
import com.zy.acs.common.constant.RedisConstant; 
 | 
import com.zy.acs.common.domain.AgvProtocol; 
 | 
import com.zy.acs.common.domain.protocol.AGV_11_UP; 
 | 
import com.zy.acs.common.enums.AgvCompleteType; 
 | 
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.entity.AgvDetail; 
 | 
import com.zy.acs.fake.entity.Code; 
 | 
import com.zy.acs.fake.enums.ActionStsType; 
 | 
import com.zy.acs.fake.enums.ActionTypeType; 
 | 
import com.zy.acs.fake.service.*; 
 | 
import lombok.extern.slf4j.Slf4j; 
 | 
  
 | 
import java.util.List; 
 | 
import java.util.Objects; 
 | 
  
 | 
/** 
 | 
 * Created by vincent on 11/11/2024 
 | 
 */ 
 | 
@Slf4j 
 | 
public class AgvSimulatorTask implements Runnable { 
 | 
  
 | 
    public static final int WEBSOCKET_BROADCAST_INTERVAL = 200; 
 | 
  
 | 
    private final Agv agv; 
 | 
    private final AgvDetailService agvDetailService; 
 | 
    private final ActionService actionService; 
 | 
    private final CodeService codeService; 
 | 
    private final MapService mapService; 
 | 
    private final JamService jamService; 
 | 
    private final List<Action> actionList; 
 | 
  
 | 
    private final RedisSupport redis; 
 | 
  
 | 
    private final String groupId; 
 | 
  
 | 
    public AgvSimulatorTask( 
 | 
            Agv agv 
 | 
            , RedisSupport redis 
 | 
            , AgvDetailService agvDetailService 
 | 
            , ActionService actionService 
 | 
            , CodeService codeService 
 | 
            , MapService mapService 
 | 
            , JamService jamService 
 | 
            , List<Action> actionList 
 | 
    ) { 
 | 
        this.agv = agv; 
 | 
        this.redis = redis; 
 | 
        this.agvDetailService = agvDetailService; 
 | 
        this.actionService = actionService; 
 | 
        this.codeService = codeService; 
 | 
        this.mapService = mapService; 
 | 
        this.jamService = jamService; 
 | 
        this.actionList = actionList; 
 | 
  
 | 
        this.groupId = actionList.get(0).getGroupId(); 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public void run() { 
 | 
        try { 
 | 
            FakeProcessor.AGV_PROCESSING_MAP.put(agv.getId(), true); 
 | 
            String qrCode = null; 
 | 
            for (Action action : actionList) { 
 | 
                processAction(agv, action); 
 | 
                qrCode = action.getCode(); 
 | 
            } 
 | 
            this.finishActionList(qrCode); 
 | 
        } catch (Exception e) { 
 | 
            log.error("AgvSimulatorTask AGV[{}]", agv.getUuid(), e); 
 | 
        } finally { 
 | 
            FakeProcessor.AGV_PROCESSING_MAP.put(agv.getId(), false); 
 | 
        } 
 | 
    } 
 | 
  
 | 
    private void processAction(Agv agv, Action action) throws InterruptedException { 
 | 
        AgvDetail agvDetail = agvDetailService.selectByAgvId(agv.getId()); 
 | 
        if (agvDetail == null) { 
 | 
            return; 
 | 
        } 
 | 
  
 | 
        switch (Objects.requireNonNull(ActionTypeType.get(action.getActionTypeEl()))) { 
 | 
            case TurnCorner: 
 | 
                simulateWalking(agv, agvDetail, action); 
 | 
                simulateRotating(agv, agvDetail, action); 
 | 
                break; 
 | 
            case StraightBackUnturnable: 
 | 
            case StraightBackTurnable: 
 | 
            case StraightAheadUnturnable: 
 | 
            case StraightAheadTurnable: 
 | 
            case FinishPath: 
 | 
            case DockingCharge: 
 | 
                simulateWalking(agv, agvDetail, action); 
 | 
                break; 
 | 
            case ReadyTakeFromShelvesLoc: 
 | 
            case ReadyReleaseToShelvesLoc: 
 | 
                break; 
 | 
            default: 
 | 
                log.warn("Unknown action type {} for AGV ID {}.", action.getActionType(), agv.getId()); 
 | 
                break; 
 | 
        } 
 | 
    } 
 | 
  
 | 
  
 | 
    private void simulateWalking(Agv agv, AgvDetail agvDetail, Action action) throws InterruptedException { 
 | 
        Code code = codeService.selectByData(action.getCode()); 
 | 
        agvDetail.setPos(1); 
 | 
        agvDetail.setCode(code.getId()); 
 | 
        // 模拟电量消耗 
 | 
//        agvDetail.setVol(agvDetail.getVol() - 0.1 * distanceToMove); // 根据距离消耗电量 
 | 
  
 | 
        Thread.sleep(WEBSOCKET_BROADCAST_INTERVAL); 
 | 
  
 | 
        agvDetailService.updateById(agvDetail); 
 | 
  
 | 
        mapService.unlockPath(agv.getUuid(), code.getData()); 
 | 
        jamService.checkIfFinish(agv.getId(), code.getData()); 
 | 
  
 | 
        action.setActionSts(ActionStsType.FINISH.val()); 
 | 
        actionService.updateById(action); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 模拟AGV旋转 
 | 
     * 
 | 
     * @param agv        当前AGV 
 | 
     * @param agvDetail  AGV详细信息 
 | 
     * @param action     当前动作 
 | 
     */ 
 | 
    private void simulateRotating(Agv agv, AgvDetail agvDetail, Action action) throws InterruptedException { 
 | 
        double actionAngle = Double.parseDouble(action.getParams()); 
 | 
        agvDetail.setAgvAngle(actionAngle); 
 | 
        // 模拟电量消耗? 
 | 
//        agvDetail.setVol(agvDetail.getVol() - 0.05 * (angleToRotate / 15.0)); // 根据角度消耗电量 
 | 
  
 | 
        Thread.sleep(WEBSOCKET_BROADCAST_INTERVAL); 
 | 
        agvDetailService.updateById(agvDetail); 
 | 
        action.setActionSts(ActionStsType.FINISH.val()); 
 | 
        actionService.updateById(action); 
 | 
    } 
 | 
  
 | 
    private void finishActionList(String qrCode) { 
 | 
        // 1.complete data 
 | 
        AGV_11_UP agv_11_up = new AGV_11_UP(); 
 | 
        agv_11_up.setSerialNo(groupId); 
 | 
        agv_11_up.setCompleteCode(AgvCompleteType.ENTIRE_PATH_COMPLETE.getCode()); 
 | 
        agv_11_up.setCompleteType(AgvCompleteType.ENTIRE_PATH_COMPLETE); 
 | 
        agv_11_up.setQrCode(qrCode); 
 | 
  
 | 
        AgvProtocol agvProtocol = AgvProtocol.build(this.agv.getUuid()).setMessageBody(agv_11_up); 
 | 
        redis.push(RedisConstant.AGV_COMPLETE_FLAG, agvProtocol); 
 | 
    } 
 | 
} 
 |