simulation-backend/src/main/java/com/hivekion/room/bean/MoveRootTask.java

194 lines
6.2 KiB
Java
Raw Normal View History

2025-09-18 10:47:37 +08:00
package com.hivekion.room.bean;
import cn.hutool.extra.spring.SpringUtil;
2025-09-19 11:17:49 +08:00
import com.hivekion.common.redis.RedisUtil;
2025-09-19 14:56:12 +08:00
import com.hivekion.common.uuid.IdUtils;
import com.hivekion.room.RoomManager;
2025-09-18 10:47:37 +08:00
import com.hivekion.room.func.TaskAction;
2025-09-19 20:01:21 +08:00
import com.hivekion.scenario.entity.BattleConsume;
2025-09-19 14:56:12 +08:00
import com.hivekion.scenario.entity.ScenarioResource;
2025-09-18 10:47:37 +08:00
import com.hivekion.scenario.entity.ScenarioTask;
2025-09-19 20:01:21 +08:00
import com.hivekion.scenario.service.impl.BattleConsumeServiceImpl;
2025-09-19 14:56:12 +08:00
import com.hivekion.scenario.service.impl.BattleSupplierServiceImpl;
import com.hivekion.scenario.service.impl.ScenarioTaskServiceImpl;
2025-09-19 11:17:49 +08:00
import com.hivekion.statistic.bean.StatisticBean;
import com.hivekion.statistic.service.impl.StatisticServiceImpl;
2025-09-19 14:56:12 +08:00
import com.hivekion.supplier.entity.SupplierRequest;
import com.hivekion.supplier.service.impl.SupplierRequestServiceImpl;
import java.time.LocalDateTime;
import java.util.List;
2025-09-18 11:41:46 +08:00
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
2025-09-18 13:51:58 +08:00
import java.util.concurrent.TimeUnit;
2025-09-19 14:56:12 +08:00
import java.util.concurrent.atomic.AtomicBoolean;
2025-09-18 10:47:37 +08:00
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.env.Environment;
/**
* [类的简要说明]
* <p>
* [详细描述可选]
* <p>
*
* @author LiDongYU
* @since 2025/7/22
*/
@Slf4j
public class MoveRootTask extends AbtParentTask implements TaskAction {
2025-09-18 23:33:24 +08:00
/**
* 速度 换算为100Km/小时
*/
private final double SPEED = 27;
2025-09-19 14:56:12 +08:00
/**
* 需求产生标志
*/
private final AtomicBoolean requestFlag = new AtomicBoolean(false);
2025-09-19 11:17:49 +08:00
/**
* 油料消耗速率
*/
private double fuelConsumption = 0;
2025-09-19 12:14:09 +08:00
private double fuelThreshold = 0;
2025-09-19 11:17:49 +08:00
/**
* 消耗任务间隔
*/
2025-09-19 20:01:21 +08:00
private final int consumptionTaskInterval = 10;
2025-09-19 11:17:49 +08:00
/**
* redis 服务类
*/
private final RedisUtil redis = SpringUtil.getBean(RedisUtil.class);
private StatisticBean statisticBean;
2025-09-18 13:51:58 +08:00
2025-09-18 10:47:37 +08:00
public MoveRootTask(ScenarioTask scenarioTask, String roomId) {
super(scenarioTask, roomId);
}
@Override
public void doSomeThing() {
2025-09-19 20:01:21 +08:00
log.info("move task running:{}", scenarioTask.getResourceId());
2025-09-19 11:17:49 +08:00
initEnv(); //初始化环境
2025-09-18 13:51:58 +08:00
initPath(); //初始化路径
2025-09-19 14:56:12 +08:00
updatePath(SPEED, null); //更新路径
2025-09-19 11:17:49 +08:00
fuelConsumption();//油品消耗
}
/**
* 初始化环境
*/
private void initEnv() {
2025-09-19 20:01:21 +08:00
try {
2025-09-19 15:29:58 +08:00
//获取油品消耗规则
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());
2025-09-19 20:01:21 +08:00
} catch (Exception e) {
log.error("init env exception", e);
2025-09-19 15:29:58 +08:00
}
2025-09-19 12:14:09 +08:00
2025-09-18 13:51:58 +08:00
}
2025-09-18 23:33:24 +08:00
2025-09-19 12:14:09 +08:00
private void fuelConsumption() {
2025-09-19 20:01:21 +08:00
try {
2025-09-19 15:29:58 +08:00
ScheduledExecutorService schedule = Executors.newScheduledThreadPool(
1);
schedule.scheduleWithFixedDelay(() -> {
if (getRoomStatus()) {
double currentUseUp = consumptionTaskInterval * SPEED / 1000 * fuelConsumption;
//更新redis中油品的消耗
Object currentFuelObj = redis.hget(
2025-09-19 14:56:12 +08:00
scenarioTask.getScenarioId() + "-" + roomId + "-" + scenarioTask.getResourceId(),
2025-09-19 15:29:58 +08:00
"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();
}
2025-09-19 11:17:49 +08:00
}
2025-09-19 15:29:58 +08:00
//插入消耗表
2025-09-19 20:01:21 +08:00
insertConsumption(currentUseUp);
2025-09-20 11:10:20 +08:00
2025-09-19 11:17:49 +08:00
}
2025-09-18 23:33:24 +08:00
2025-09-19 15:29:58 +08:00
}, 0, consumptionTaskInterval, TimeUnit.SECONDS);
2025-09-19 20:01:21 +08:00
} catch (Exception e) {
log.error("fuel consumption exception", e);
2025-09-19 15:29:58 +08:00
}
2025-09-19 11:17:49 +08:00
}
2025-09-19 14:56:12 +08:00
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);
}
2025-09-19 13:58:18 +08:00
2025-09-19 14:56:12 +08:00
private void produceTask() {
List<ScenarioResource> 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());
2025-09-19 15:11:47 +08:00
task.setFromSource("general");
2025-09-19 14:56:12 +08:00
SpringUtil.getBean(ScenarioTaskServiceImpl.class).save(task);
2025-09-19 20:01:21 +08:00
//增加到房间任务
2025-09-19 14:56:12 +08:00
SupplierTask supplierTask = new SupplierTask(task, roomId);
//立即执行
RoomManager.addAction(roomId, 0, supplierTask);
}
}
2025-09-19 20:01:21 +08:00
private void insertConsumption(double num) {
BattleConsume battleConsume = new BattleConsume();
battleConsume.setId(IdUtils.simpleUUID());
battleConsume.setResourceId(scenarioTask.getResourceId());
battleConsume.setFuel(num);
2025-09-20 11:10:20 +08:00
battleConsume.setConsumeDate(LocalDateTime.now());
2025-09-19 20:01:21 +08:00
SpringUtil.getBean(BattleConsumeServiceImpl.class).save(battleConsume);
}
2025-09-20 11:10:20 +08:00
private void pushStatus(double num){
}
2025-09-18 23:33:24 +08:00
}