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

167 lines
4.8 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-20 15:48:14 +08:00
import com.alibaba.fastjson2.JSON;
2025-09-20 12:07:36 +08:00
import com.hivekion.Global;
import com.hivekion.common.entity.ResponseCmdInfo;
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-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-21 02:50:53 +08:00
import com.hivekion.statistic.bean.EditScenarioInfo;
2025-09-20 15:48:14 +08:00
import com.hivekion.statistic.bean.ScenarioInfo;
2025-09-19 14:56:12 +08:00
import java.time.LocalDateTime;
2025-09-20 12:07:36 +08:00
import java.util.HashMap;
import java.util.Map;
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-18 10:47:37 +08:00
import lombok.extern.slf4j.Slf4j;
/**
* [类的简要说明]
* <p>
* [详细描述可选]
* <p>
*
* @author LiDongYU
* @since 2025/7/22
*/
@Slf4j
2025-09-20 12:07:36 +08:00
public class MoveTask extends AbtParentTask implements TaskAction {
2025-09-18 10:47:37 +08:00
2025-09-18 23:33:24 +08:00
/**
* 速度 换算为100Km/小时
*/
private final double SPEED = 27;
2025-09-21 01:53:44 +08:00
2025-09-19 11:17:49 +08:00
/**
* 消耗任务间隔
*/
2025-09-21 02:50:53 +08:00
private final int consumptionTaskInterval = 5;
2025-09-21 04:31:48 +08:00
private final TaskAction finishedAction;
2025-09-21 01:53:44 +08:00
2025-09-18 13:51:58 +08:00
2025-09-21 04:31:48 +08:00
public MoveTask(ScenarioTask scenarioTask, String roomId,TaskAction finishedAction) {
2025-09-18 10:47:37 +08:00
super(scenarioTask, roomId);
2025-09-21 04:31:48 +08:00
this.finishedAction = finishedAction;
2025-09-18 10:47:37 +08:00
}
@Override
public void doSomeThing() {
2025-09-20 15:07:45 +08:00
log.info("move task running:{},fuel::{}", scenarioTask.getResourceId(), getCurrentFuel());
2025-09-19 11:17:49 +08:00
2025-09-21 01:53:44 +08:00
2025-09-18 13:51:58 +08:00
initPath(); //初始化路径
2025-09-20 12:07:36 +08:00
updatePath(SPEED, new TaskAction() {
@Override
public void doSomeThing() {
2025-09-20 14:24:47 +08:00
2025-09-20 12:07:36 +08:00
//推送移动任务
Map<String, Object> map = new HashMap<>();
2025-09-20 15:07:45 +08:00
map.put("duringTime", getDuringTime());
map.put("id", scenarioTask.getResourceId());
map.put("roomStatus", true);
map.put("type", scenarioTask.getType());
2025-09-20 12:07:36 +08:00
Global.sendCmdInfoQueue.add(
ResponseCmdInfo.create("moveTask", roomId,
scenarioTask.getScenarioId(), map));
}
@Override
public String getId() {
return "";
}
@Override
public String getType() {
return "";
}
2025-09-21 04:31:48 +08:00
}, this.finishedAction); //更新路径
2025-09-19 11:17:49 +08:00
fuelConsumption();//油品消耗
}
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(() -> {
2025-09-21 01:53:44 +08:00
if (getRoomStatus()) {
double currentFuel = getCurrentFuel();
2025-09-21 05:40:40 +08:00
if(currentFuel > 0&&!"general".equals(scenarioTask.getFromSource())&&!taskFinishedStatus.get()) {
2025-09-21 01:53:44 +08:00
double currentUseUp = consumptionTaskInterval*RoomManager.getMag(roomId) * SPEED / 1000 * fuelConsumption;
2025-09-20 15:07:45 +08:00
2025-09-21 01:53:44 +08:00
log.info("{}-当前消耗油料::{},当前剩余油料::{}", scenarioTask.getResourceId(),
currentUseUp, currentFuel);
2025-09-20 15:07:45 +08:00
2025-09-21 02:50:53 +08:00
//修改油料
EditScenarioInfo editScenarioInfo = getEditScenarioInfo(
this.scenarioTask.getResourceId());
editScenarioInfo.getJbxx().getFuel().setCurrent(editScenarioInfo.getJbxx().getFuel().getCurrent()-currentUseUp);
2025-09-21 06:24:08 +08:00
setEditScenarioInfo(editScenarioInfo,scenarioTask.getResourceId());
2025-09-20 15:07:45 +08:00
2025-09-21 01:53:44 +08:00
//插入消耗表
insertConsumption(currentUseUp);
2025-09-21 02:50:53 +08:00
setCurrentFuel(currentUseUp);
pushStatus(scenarioTask.getResourceId());
2025-09-20 15:07:45 +08:00
}
2025-09-21 01:53:44 +08:00
2025-09-20 15:07:45 +08:00
}
2025-09-19 11:17:49 +08:00
2025-09-18 23:33:24 +08:00
2025-09-21 01:53:44 +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-20 17:14:47 +08:00
2025-09-19 20:01:21 +08:00
private void insertConsumption(double num) {
2025-09-20 17:14:47 +08:00
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);
}
2025-09-19 20:01:21 +08:00
}
2025-09-20 11:10:20 +08:00
2025-09-20 18:21:04 +08:00
2025-09-20 17:14:47 +08:00
2025-09-20 15:48:14 +08:00
private void setCurrentFuel(double num) {
2025-09-21 02:50:53 +08:00
Object statisticObj = SpringUtil.getBean(RedisUtil.class).hget(
2025-09-20 15:48:14 +08:00
scenarioTask.getScenarioId() + "-" + roomId + "-" + scenarioTask.getResourceId(),
"scenarioInfo");
if (statisticObj != null) {
ScenarioInfo scenarioInfo = JSON.parseObject(statisticObj.toString(), ScenarioInfo.class);
2025-09-20 17:14:47 +08:00
scenarioInfo.getFuel().setCurrent(scenarioInfo.getFuel().getCurrent() - num);
2025-09-21 02:50:53 +08:00
SpringUtil.getBean(RedisUtil.class).hset(scenarioTask.getScenarioId() + "-" + roomId + "-" + scenarioTask.getResourceId(),
2025-09-20 17:14:47 +08:00
"scenarioInfo", JSON.toJSONString(scenarioInfo));
2025-09-20 15:48:14 +08:00
}
}
2025-09-18 23:33:24 +08:00
}