package com.hivekion.room.bean; import cn.hutool.extra.spring.SpringUtil; 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.ScenarioResource; import com.hivekion.scenario.entity.ScenarioTask; import com.hivekion.scenario.service.impl.BattleSupplierServiceImpl; import com.hivekion.scenario.service.impl.ScenarioTaskServiceImpl; import com.hivekion.statistic.bean.StatisticBean; import com.hivekion.statistic.service.impl.StatisticServiceImpl; import com.hivekion.supplier.entity.SupplierRequest; import com.hivekion.supplier.service.impl.SupplierRequestServiceImpl; import java.time.LocalDateTime; import java.util.List; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; import lombok.extern.slf4j.Slf4j; import org.springframework.core.env.Environment; /** * [类的简要说明] *

* [详细描述,可选] *

* * @author LiDongYU * @since 2025/7/22 */ @Slf4j public class MoveRootTask extends AbtParentTask implements TaskAction { /** * 速度 换算为100Km/小时 */ private final double SPEED = 27; /** * 需求产生标志 */ private final AtomicBoolean requestFlag = new AtomicBoolean(false); /** * 油料消耗速率 */ private double fuelConsumption = 0; private double fuelThreshold = 0; /** * 消耗任务间隔 */ private final int consumptionTaskInterval = 5; /** * redis 服务类 */ private final RedisUtil redis = SpringUtil.getBean(RedisUtil.class); private StatisticBean statisticBean; public MoveRootTask(ScenarioTask scenarioTask, String roomId) { super(scenarioTask, roomId); } @Override public void doSomeThing() { log.info("move task running"); initEnv(); //初始化环境 initPath(); //初始化路径 updatePath(SPEED, null); //更新路径 fuelConsumption();//油品消耗 } /** * 初始化环境 */ private void initEnv() { //获取油品消耗规则 String fuelConsumptionStr = SpringUtil.getBean(Environment.class) .getProperty("fuel_spreed"); fuelConsumption = Double.parseDouble(fuelConsumptionStr == null ? "0" : fuelConsumptionStr); fuelThreshold = Double.parseDouble(SpringUtil.getBean(Environment.class) .getProperty("fuel.warn ", "0")); statisticBean = SpringUtil.getBean(StatisticServiceImpl.class) .statistic(scenarioTask.getResourceId()); } private void fuelConsumption() { ScheduledExecutorService schedule = Executors.newScheduledThreadPool( 1); schedule.scheduleWithFixedDelay(() -> { if (getRoomStatus()) { double currentUseUp = consumptionTaskInterval * SPEED / 1000 * fuelConsumption; //更新redis中油品的消耗 Object currentFuelObj = redis.hget( scenarioTask.getScenarioId() + "-" + roomId + "-" + scenarioTask.getResourceId(), "fuel"); if (currentFuelObj != null) { double fuel = Double.parseDouble(currentFuelObj.toString()); fuel = fuel - currentUseUp; redis.hset( scenarioTask.getScenarioId() + "-" + roomId + "-" + scenarioTask.getResourceId(), "fuelConsume", fuel); double totalFuel = statisticBean.getFuel().getTotal(); if (fuel * 100 / totalFuel < fuelThreshold && !requestFlag.get()) { requestFlag.set(true); //需要产生需求 produceFuelRequest(); //产生任务 produceTask(); } } //插入消耗表 } }, 0, consumptionTaskInterval, TimeUnit.SECONDS); } private void produceFuelRequest() { SupplierRequest supplierRequest = new SupplierRequest(); supplierRequest.setId(IdUtils.simpleUUID()); supplierRequest.setFromResourceId(scenarioTask.getResourceId()); supplierRequest.setSupplierNum(String.valueOf(statisticBean.getFuel().getTotal())); supplierRequest.setSupplierType("fuel"); supplierRequest.setGeneralTime(LocalDateTime.now()); supplierRequest.setLat(scenarioTask.getToLat()); supplierRequest.setLng(scenarioTask.getToLng()); supplierRequest.setHandleFlag(1); SpringUtil.getBean(SupplierRequestServiceImpl.class).save(supplierRequest); } private void produceTask() { List resourceList = SpringUtil.getBean(BattleSupplierServiceImpl.class) .selectSupplierResource(scenarioTask.getResourceId()); if (!resourceList.isEmpty()) { ScenarioTask task = new ScenarioTask(); task.setId(IdUtils.simpleUUID()); task.setScenarioId(scenarioTask.getScenarioId()); task.setResourceId(scenarioTask.getResourceId()); task.setTaskType("6"); task.setSupplierNum(statisticBean.getFuel().getTotal()); task.setToLat(scenarioTask.getToLat()); task.setToLng(scenarioTask.getToLng()); task.setStartTime(LocalDateTime.now()); task.setFromLat(resourceList.get(0).getLat()); task.setFromLng(resourceList.get(0).getLng()); task.setFromSource("general"); SpringUtil.getBean(ScenarioTaskServiceImpl.class).save(task); //增加到房间任务 SupplierTask supplierTask = new SupplierTask(task, roomId); //立即执行 RoomManager.addAction(roomId, 0, supplierTask); } } }