178 lines
5.7 KiB
Java
178 lines
5.7 KiB
Java
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;
|
|
|
|
/**
|
|
* [类的简要说明]
|
|
* <p>
|
|
* [详细描述,可选]
|
|
* <p>
|
|
*
|
|
* @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:{}",scenarioTask.getResourceId());
|
|
|
|
initEnv(); //初始化环境
|
|
initPath(); //初始化路径
|
|
updatePath(SPEED, null); //更新路径
|
|
fuelConsumption();//油品消耗
|
|
}
|
|
|
|
/**
|
|
* 初始化环境
|
|
*/
|
|
private void initEnv() {
|
|
try{
|
|
//获取油品消耗规则
|
|
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());
|
|
}catch (Exception e){
|
|
log.error("init env exception",e);
|
|
}
|
|
|
|
}
|
|
|
|
|
|
private void fuelConsumption() {
|
|
try{
|
|
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);
|
|
}catch (Exception e){
|
|
log.error("fuel consumption exception",e);
|
|
}
|
|
|
|
|
|
}
|
|
|
|
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<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());
|
|
task.setFromSource("general");
|
|
SpringUtil.getBean(ScenarioTaskServiceImpl.class).save(task);
|
|
//增加到房间任务
|
|
SupplierTask supplierTask = new SupplierTask(task, roomId);
|
|
//立即执行
|
|
RoomManager.addAction(roomId, 0, supplierTask);
|
|
}
|
|
}
|
|
}
|
|
|
|
|