任务相关

This commit is contained in:
李玉东 2025-09-20 15:07:45 +08:00
parent 81e4cb3ce6
commit 179c28020b
4 changed files with 78 additions and 37 deletions

View File

@ -76,4 +76,11 @@ public class RoomManager {
} }
return false; return false;
} }
public static int getMag(String id){
Room room = roomsMap.get(id);
if (room != null) {
return room.getMag();
}
return 1;
}
} }

View File

@ -28,7 +28,9 @@ import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ThreadFactory; import java.util.concurrent.ThreadFactory;
import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicLong;
import java.util.concurrent.atomic.AtomicReference; import java.util.concurrent.atomic.AtomicReference;
import com.hivekion.statistic.bean.ScenarioInfo; import com.hivekion.statistic.bean.ScenarioInfo;
@ -66,6 +68,9 @@ public abstract class AbtParentTask implements TaskAction {
private RedisUtil redisUtil; private RedisUtil redisUtil;
private com.hivekion.statistic.service.ScenarioService scenarioService; private com.hivekion.statistic.service.ScenarioService scenarioService;
//是否可以移动
protected final AtomicBoolean canMoved = new AtomicBoolean(true);
protected final AtomicReference<Coordinate> coordinateReference = new AtomicReference<>(new Coordinate());
/** /**
* 任务相对与想定的开始时间 * 任务相对与想定的开始时间
*/ */
@ -114,7 +119,9 @@ public abstract class AbtParentTask implements TaskAction {
public long getDuringTime() { public long getDuringTime() {
return RoomManager.getRoomDuringTime(this.roomId); return RoomManager.getRoomDuringTime(this.roomId);
} }
protected int getMag(){
return RoomManager.getMag(this.roomId);
}
//获取房间状态 //获取房间状态
public boolean getRoomStatus() { public boolean getRoomStatus() {
return RoomManager.isRunning(roomId); return RoomManager.isRunning(roomId);
@ -204,13 +211,14 @@ public abstract class AbtParentTask implements TaskAction {
} }
protected void updatePath(double speed,TaskAction duringAction, TaskAction finishedAction) { protected void updatePath(double speed,TaskAction duringAction, TaskAction finishedAction) {
AtomicLong runSeconds = new AtomicLong(0);
ScheduledExecutorService schedule = Executors.newScheduledThreadPool( ScheduledExecutorService schedule = Executors.newScheduledThreadPool(
1); 1);
schedule.scheduleWithFixedDelay(() -> { schedule.scheduleWithFixedDelay(() -> {
log.info("task is running...."); log.info("task is running....");
try { try {
if (this.getRoomStatus()) {
if (this.getRoomStatus()&&canMoved.get()) {
if (distanceInfoMap.isEmpty()) { if (distanceInfoMap.isEmpty()) {
return; return;
} }
@ -221,8 +229,9 @@ public abstract class AbtParentTask implements TaskAction {
if(duringAction!=null){ if(duringAction!=null){
duringAction.doSomeThing(); duringAction.doSomeThing();
} }
runSeconds.getAndAdd(getMag());
//跑动距离 //跑动距离
double distance = duringTime * speed; double distance = runSeconds.get() * speed;
//获取大与此距离的第一个路线点key //获取大与此距离的第一个路线点key
Entry<Double, Coordinate> endPoint = distanceInfoMap.ceilingEntry(distance); Entry<Double, Coordinate> endPoint = distanceInfoMap.ceilingEntry(distance);
@ -262,6 +271,7 @@ public abstract class AbtParentTask implements TaskAction {
Coordinate coordinate = new Coordinate(); Coordinate coordinate = new Coordinate();
coordinate.setLat(insertPoints[0]); coordinate.setLat(insertPoints[0]);
coordinate.setLng(insertPoints[1]); coordinate.setLng(insertPoints[1]);
coordinateReference.set(coordinate);
distanceInfoMap.put(distance, coordinate); distanceInfoMap.put(distance, coordinate);
startPoint.set(distance); startPoint.set(distance);
SpringUtil.getBean(RedisUtil.class).hset( SpringUtil.getBean(RedisUtil.class).hset(
@ -272,6 +282,7 @@ public abstract class AbtParentTask implements TaskAction {
ResponseCmdInfo.create(WsCmdTypeEnum.PATH_UPDATE.getCode(), roomId, ResponseCmdInfo.create(WsCmdTypeEnum.PATH_UPDATE.getCode(), roomId,
scenarioTask.getScenarioId(), dataMap)); scenarioTask.getScenarioId(), dataMap));
} else if (Double.compare(distance, endPoint.getKey()) == 0) { } else if (Double.compare(distance, endPoint.getKey()) == 0) {
NavigableMap<Double, Coordinate> subPathMap = distanceInfoMap.subMap(startPoint.get(), NavigableMap<Double, Coordinate> subPathMap = distanceInfoMap.subMap(startPoint.get(),
true, endPoint.getKey(), true); true, endPoint.getKey(), true);
@ -279,7 +290,7 @@ public abstract class AbtParentTask implements TaskAction {
Coordinate coordinate = subPathMap.get(key); Coordinate coordinate = subPathMap.get(key);
dataList.add(new double[]{coordinate.getLng(), coordinate.getLat()}); dataList.add(new double[]{coordinate.getLng(), coordinate.getLat()});
} }
coordinateReference.set(endPoint.getValue());
startPoint.set(endPoint.getKey()); startPoint.set(endPoint.getKey());
Global.sendCmdInfoQueue.add( Global.sendCmdInfoQueue.add(
ResponseCmdInfo.create(WsCmdTypeEnum.PATH_UPDATE.getCode(), roomId, ResponseCmdInfo.create(WsCmdTypeEnum.PATH_UPDATE.getCode(), roomId,
@ -289,6 +300,7 @@ public abstract class AbtParentTask implements TaskAction {
if (finishedAction != null) { if (finishedAction != null) {
finishedAction.doSomeThing(); finishedAction.doSomeThing();
} }
coordinateReference.set(endPoint.getValue());
//完成路径 //完成路径
Global.sendCmdInfoQueue.add( Global.sendCmdInfoQueue.add(
ResponseCmdInfo.create(WsCmdTypeEnum.PATH_FINISHED.getCode(), roomId, ResponseCmdInfo.create(WsCmdTypeEnum.PATH_FINISHED.getCode(), roomId,
@ -299,6 +311,7 @@ public abstract class AbtParentTask implements TaskAction {
} }
} catch (Exception e) { } catch (Exception e) {
log.error("error::", e); log.error("error::", e);
} }

View File

@ -71,7 +71,7 @@ public class MoveTask extends AbtParentTask implements TaskAction {
@Override @Override
public void doSomeThing() { public void doSomeThing() {
log.info("move task running:{}", scenarioTask.getResourceId()); log.info("move task running:{},fuel::{}", scenarioTask.getResourceId(), getCurrentFuel());
initEnv(); //初始化环境 initEnv(); //初始化环境
initPath(); //初始化路径 initPath(); //初始化路径
@ -81,10 +81,10 @@ public class MoveTask extends AbtParentTask implements TaskAction {
//推送移动任务 //推送移动任务
Map<String, Object> map = new HashMap<>(); Map<String, Object> map = new HashMap<>();
map.put("duringTime",getDuringTime()); map.put("duringTime", getDuringTime());
map.put("id",scenarioTask.getResourceId()); map.put("id", scenarioTask.getResourceId());
map.put("roomStatus",true); map.put("roomStatus", true);
map.put("type",scenarioTask.getType()); map.put("type", scenarioTask.getType());
Global.sendCmdInfoQueue.add( Global.sendCmdInfoQueue.add(
ResponseCmdInfo.create("moveTask", roomId, ResponseCmdInfo.create("moveTask", roomId,
@ -100,7 +100,7 @@ public class MoveTask extends AbtParentTask implements TaskAction {
public String getType() { public String getType() {
return ""; return "";
} }
},null); //更新路径 }, null); //更新路径
fuelConsumption();//油品消耗 fuelConsumption();//油品消耗
} }
@ -129,35 +129,43 @@ public class MoveTask extends AbtParentTask implements TaskAction {
ScheduledExecutorService schedule = Executors.newScheduledThreadPool( ScheduledExecutorService schedule = Executors.newScheduledThreadPool(
1); 1);
schedule.scheduleWithFixedDelay(() -> { schedule.scheduleWithFixedDelay(() -> {
if (getRoomStatus()) { if (getRoomStatus() && this.canMoved.get()) {
double currentUseUp = consumptionTaskInterval * SPEED / 1000 * fuelConsumption; double currentUseUp = consumptionTaskInterval * SPEED / 1000 * fuelConsumption;
//更新redis中油品的消耗 double fuel = getCurrentFuel();
Object currentFuelObj = redis.hget( if (fuel == 0) {
scenarioTask.getScenarioId() + "-" + roomId + "-" + scenarioTask.getResourceId(), log.error("fuel is empty");
"fuel"); return;
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();
}
} }
fuel = fuel - currentUseUp;
redis.hset(
scenarioTask.getScenarioId() + "-" + roomId + "-" + scenarioTask.getResourceId(),
"fuelConsume", fuel);
double totalFuel = statisticBean.getFuel().getTotal();
if (fuel * 100 / totalFuel < fuelThreshold && !requestFlag.get()) {
log.info("fuel is not enough,stop moving");
this.canMoved.set(false);
requestFlag.set(true);
//需要产生需求
produceFuelRequest();
//产生任务
produceTask();
}
//插入消耗表 //插入消耗表
insertConsumption(currentUseUp); insertConsumption(currentUseUp);
pushStatus(scenarioTask.getResourceId()); pushStatus(scenarioTask.getResourceId());
} }
if (!this.canMoved.get()) {
//判断油料是否满足
double totalFuel = statisticBean.getFuel().getTotal();
if (Double.compare(this.getCurrentFuel(), totalFuel) >= 0) {
this.canMoved.set(true);
}
}
}, 0, consumptionTaskInterval, TimeUnit.SECONDS); }, 0, consumptionTaskInterval, TimeUnit.SECONDS);
@ -193,8 +201,8 @@ public class MoveTask extends AbtParentTask implements TaskAction {
task.setResourceId(scenarioTask.getResourceId()); task.setResourceId(scenarioTask.getResourceId());
task.setTaskType("6"); task.setTaskType("6");
task.setSupplierNum(statisticBean.getFuel().getTotal()); task.setSupplierNum(statisticBean.getFuel().getTotal());
task.setToLat(scenarioTask.getToLat()); task.setToLat(this.coordinateReference.get().getLat() + "");
task.setToLng(scenarioTask.getToLng()); task.setToLng(this.coordinateReference.get().getLng() + "");
task.setStartTime(LocalDateTime.now()); task.setStartTime(LocalDateTime.now());
task.setFromLat(resourceList.get(0).getLat()); task.setFromLat(resourceList.get(0).getLat());
task.setFromLng(resourceList.get(0).getLng()); task.setFromLng(resourceList.get(0).getLng());
@ -208,7 +216,7 @@ public class MoveTask extends AbtParentTask implements TaskAction {
} }
private void insertConsumption(double num) { private void insertConsumption(double num) {
log.info("insertConsumption....{}",num); log.info("insertConsumption....{}", num);
BattleConsume battleConsume = new BattleConsume(); BattleConsume battleConsume = new BattleConsume();
battleConsume.setId(IdUtils.simpleUUID()); battleConsume.setId(IdUtils.simpleUUID());
battleConsume.setResourceId(scenarioTask.getResourceId()); battleConsume.setResourceId(scenarioTask.getResourceId());
@ -217,6 +225,15 @@ public class MoveTask extends AbtParentTask implements TaskAction {
SpringUtil.getBean(BattleConsumeServiceImpl.class).save(battleConsume); SpringUtil.getBean(BattleConsumeServiceImpl.class).save(battleConsume);
} }
private double getCurrentFuel() {
Object currentFuelObj = redis.hget(
scenarioTask.getScenarioId() + "-" + roomId + "-" + scenarioTask.getResourceId(),
"fuel");
if (currentFuelObj != null) {
return Double.parseDouble(currentFuelObj.toString());
}
return 0;
}
} }

View File

@ -92,7 +92,8 @@ public class Room implements AutoCloseable {
status.set(true); status.set(true);
totalTime.set(time); totalTime.set(time);
startTask(); startTask();
//初始化系统资源 物资人员等信息 //初始化系统资源 初始化resource下物资信息
//1.
} }
@ -206,5 +207,8 @@ public class Room implements AutoCloseable {
return status.get(); return status.get();
} }
public int getMag() {
return this.mag;
}
} }