package com.hivekion.room.bean; import cn.hutool.extra.spring.SpringUtil; import com.alibaba.fastjson2.JSON; import com.hivekion.Global; import com.hivekion.common.entity.ResponseCmdInfo; import com.hivekion.common.redis.RedisUtil; import com.hivekion.common.uuid.IdUtils; import com.hivekion.room.RoomManager; import com.hivekion.room.func.TaskAction; import com.hivekion.scenario.entity.BattleConsume; import com.hivekion.scenario.entity.ScenarioTask; import com.hivekion.scenario.service.impl.BattleConsumeServiceImpl; import com.hivekion.statistic.bean.EditScenarioInfo; import com.hivekion.statistic.bean.ScenarioInfo; import java.time.LocalDateTime; import java.util.HashMap; import java.util.Map; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; import lombok.extern.slf4j.Slf4j; /** * [类的简要说明] *

* [详细描述,可选] *

* * @author LiDongYU * @since 2025/7/22 */ @Slf4j public class MoveTask extends AbtParentTask implements TaskAction { /** * 速度 换算为100Km/小时 */ private final double SPEED = 27; /** * 消耗任务间隔 */ private final int consumptionTaskInterval = 5; private final TaskAction finishedAction; public MoveTask(ScenarioTask scenarioTask, String roomId,TaskAction finishedAction) { super(scenarioTask, roomId); this.finishedAction = finishedAction; } @Override public void doSomeThing() { log.info("move task running:{},fuel::{}", scenarioTask.getResourceId(), getCurrentFuel()); initPath(); //初始化路径 updatePath(SPEED, new TaskAction() { @Override public void doSomeThing() { //推送移动任务 Map map = new HashMap<>(); map.put("duringTime", getDuringTime()); map.put("id", scenarioTask.getResourceId()); map.put("roomStatus", true); map.put("type", scenarioTask.getType()); Global.sendCmdInfoQueue.add( ResponseCmdInfo.create("moveTask", roomId, scenarioTask.getScenarioId(), map)); } @Override public String getId() { return ""; } @Override public String getType() { return ""; } }, this.finishedAction); //更新路径 fuelConsumption();//油品消耗 } private void fuelConsumption() { try { ScheduledExecutorService schedule = Executors.newScheduledThreadPool( 1); schedule.scheduleWithFixedDelay(() -> { if (getRoomStatus()) { double currentFuel = getCurrentFuel(); if(currentFuel > 0&&!"general".equals(scenarioTask.getFromSource())&&!taskFinishedStatus.get()) { double currentUseUp = consumptionTaskInterval*RoomManager.getMag(roomId) * SPEED / 1000 * fuelConsumption; log.info("{}-当前消耗油料::{},当前剩余油料::{}", scenarioTask.getResourceId(), currentUseUp, currentFuel); //修改油料 EditScenarioInfo editScenarioInfo = getEditScenarioInfo( this.scenarioTask.getResourceId()); editScenarioInfo.getJbxx().getFuel().setCurrent(editScenarioInfo.getJbxx().getFuel().getCurrent()-currentUseUp); setEditScenarioInfo(editScenarioInfo,scenarioTask.getResourceId()); //插入消耗表 insertConsumption(currentUseUp); setCurrentFuel(currentUseUp); pushStatus(scenarioTask.getResourceId()); } } }, 0, consumptionTaskInterval, TimeUnit.SECONDS); } catch (Exception e) { log.error("fuel consumption exception", e); } } private void insertConsumption(double num) { try{ log.info("{}-插入油料消耗::{}", this.scenarioTask.getResourceId(), num); BattleConsume battleConsume = new BattleConsume(); battleConsume.setId(IdUtils.simpleUUID()); battleConsume.setResourceId(scenarioTask.getResourceId()); battleConsume.setFuel(num); battleConsume.setConsumeDate(LocalDateTime.now()); SpringUtil.getBean(BattleConsumeServiceImpl.class).save(battleConsume); }catch (Exception e){ log.error("insertConsumption exception", e); } } private void setCurrentFuel(double num) { Object statisticObj = SpringUtil.getBean(RedisUtil.class).hget( scenarioTask.getScenarioId() + "-" + roomId + "-" + scenarioTask.getResourceId(), "scenarioInfo"); if (statisticObj != null) { ScenarioInfo scenarioInfo = JSON.parseObject(statisticObj.toString(), ScenarioInfo.class); scenarioInfo.getFuel().setCurrent(scenarioInfo.getFuel().getCurrent() - num); SpringUtil.getBean(RedisUtil.class).hset(scenarioTask.getScenarioId() + "-" + roomId + "-" + scenarioTask.getResourceId(), "scenarioInfo", JSON.toJSONString(scenarioInfo)); } } }