167 lines
4.8 KiB
Java
167 lines
4.8 KiB
Java
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;
|
|
|
|
/**
|
|
* [类的简要说明]
|
|
* <p>
|
|
* [详细描述,可选]
|
|
* <p>
|
|
*
|
|
* @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<String, Object> 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));
|
|
}
|
|
}
|
|
}
|
|
|
|
|