Compare commits

...

2 Commits

Author SHA1 Message Date
李玉东
25507ce2aa 任务相关 2025-09-20 21:51:45 +08:00
李玉东
35995ce8ff 任务相关 2025-09-20 20:14:26 +08:00
4 changed files with 145 additions and 92 deletions

View File

@ -106,6 +106,7 @@ public class Scenario extends SearchInputVo {
private String leftBottomLat;
@TableField(value = "right_bottom_lat")
private String rightBottomLat;
private String desc;
/**
* 想定关联的资源列表
*/

View File

@ -14,6 +14,7 @@ import com.hivekion.enums.WsCmdTypeEnum;
import com.hivekion.room.RoomManager;
import com.hivekion.room.func.TaskAction;
import com.hivekion.scenario.entity.ScenarioTask;
import com.hivekion.statistic.bean.ScenarioInfo;
import java.time.Duration;
import java.util.ArrayList;
import java.util.HashMap;
@ -33,6 +34,7 @@ import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicLong;
import java.util.concurrent.atomic.AtomicReference;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.core.env.Environment;
import org.springframework.web.reactive.function.client.WebClient;
@ -63,7 +65,7 @@ public abstract class AbtParentTask implements TaskAction {
//http请求
protected WebClient webClient = WebClient.create();
protected final AtomicBoolean canMoved = new AtomicBoolean(true);
protected final AtomicReference<Coordinate> coordinateReference = new AtomicReference<>();
protected final AtomicReference<Coordinate> coordinateReference = new AtomicReference<>();
/**
* 任务相对与想定的开始时间
@ -202,7 +204,7 @@ 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 duringTime = new AtomicLong(0);
ScheduledExecutorService schedule = Executors.newScheduledThreadPool(
1);
@ -213,13 +215,13 @@ public abstract class AbtParentTask implements TaskAction {
if (distanceInfoMap.isEmpty()) {
return;
}
if(!this.canMoved.get()){
if (!this.canMoved.get()) {
return;
}
log.info("{}-移动中,canRemove::{}",this.scenarioTask.getResourceId(),this.canMoved.get());
log.info("{}-移动中,canRemove::{}", this.scenarioTask.getResourceId(),
this.canMoved.get());
if(duringAction!=null){
if (duringAction != null) {
duringAction.doSomeThing();
}
//跑动距离
@ -231,7 +233,7 @@ public abstract class AbtParentTask implements TaskAction {
endPoint = distanceInfoMap.lastEntry();
}
// log.info("enPoint::{}",endPoint);
// log.info("enPoint::{}",endPoint);
//ws数据
List<double[]> dataList = new ArrayList<>();
HashMap<Object, Object> dataMap = new HashMap<>();
@ -241,7 +243,7 @@ public abstract class AbtParentTask implements TaskAction {
if (Double.compare(distance, endPoint.getKey()) < 0) {
//获取小于最大值的第一个key
Double lowerKey = distanceInfoMap.lowerKey(endPoint.getKey());
if(lowerKey==null){
if (lowerKey == null) {
lowerKey = endPoint.getKey();
}
@ -311,13 +313,20 @@ public abstract class AbtParentTask implements TaskAction {
//房间统一管理定时器房间关闭后定时器销毁
addScheduledExecutorServiceRefenceToRoom(schedule);
}
private RedisUtil redisUtil;
//统一推送方法
protected void pushStatus(String resourceId) {
if( redisUtil == null) {
if (StringUtils.isBlank(resourceId)) {
return;
}
if (redisUtil == null) {
redisUtil = SpringUtil.getBean(RedisUtil.class);
}
String jsonStr= (String) redisUtil.hget(this.scenarioTask.getScenarioId() + "-" + roomId + "-" + scenarioTask.getResourceId(),"scenarioInfo");
String jsonStr = (String) redisUtil.hget(
this.scenarioTask.getScenarioId() + "-" + roomId + "-" + scenarioTask.getResourceId(),
"scenarioInfo");
ResponseCmdInfo<String> respObj = new ResponseCmdInfo<>();
respObj.setData(jsonStr);
respObj.setRoom(roomId);
@ -325,6 +334,7 @@ public abstract class AbtParentTask implements TaskAction {
respObj.setCmdType("scenarioInfo");
Global.sendCmdInfoQueue.add(respObj);
}
}
interface BizTaskOnTiming {

View File

@ -161,7 +161,7 @@ public class MoveTask extends AbtParentTask implements TaskAction {
//需要产生需求
produceFuelRequest();
//产生任务
produceTask();
produceTask(fuel);
}
@ -200,7 +200,7 @@ public class MoveTask extends AbtParentTask implements TaskAction {
SpringUtil.getBean(SupplierRequestServiceImpl.class).save(supplierRequest);
}
private void produceTask() {
private void produceTask(double fuel) {
try {
log.info("{}-产生自动保障任务", this.scenarioTask.getResourceId());
List<ScenarioResource> resourceList = SpringUtil.getBean(BattleSupplierServiceImpl.class)
@ -214,7 +214,7 @@ public class MoveTask extends AbtParentTask implements TaskAction {
task.setResourceId(resourceList.get(0).getId());
task.setTaskType("6");
task.setInsureResourceId(scenarioTask.getResourceId());
task.setSupplierNum(statisticBean.getFuel().getTotal());
task.setSupplierNum(statisticBean.getFuel().getTotal()-fuel);
task.setToLat(this.coordinateReference.get().getLat() + "");
task.setToLng(this.coordinateReference.get().getLng() + "");
task.setStartTime(LocalDateTime.now());

View File

@ -1,9 +1,11 @@
package com.hivekion.room.bean;
import cn.hutool.extra.spring.SpringUtil;
import com.alibaba.fastjson2.JSON;
import com.hivekion.common.redis.RedisUtil;
import com.hivekion.room.func.TaskAction;
import com.hivekion.scenario.entity.ScenarioTask;
import com.hivekion.statistic.bean.ScenarioInfo;
import com.hivekion.statistic.bean.StatisticBean;
import com.hivekion.statistic.service.StatisticService;
import lombok.extern.slf4j.Slf4j;
@ -55,7 +57,7 @@ public class SupplierTask extends AbtParentTask implements TaskAction {
}
//推送最新状态信息
pushStatus(scenarioTask.getResourceId());
pushStatus(scenarioTask.getResourceId());
pushStatus(scenarioTask.getInsureResourceId());
}
@Override
@ -71,112 +73,152 @@ public class SupplierTask extends AbtParentTask implements TaskAction {
}
private void supplierMedical(StatisticBean statistic) {
//保障分队
Object supplierObj = SpringUtil.getBean(RedisUtil.class).hget(
scenarioTask.getScenarioId() + "-" + roomId + "-" + scenarioTask.getResourceId(),
"scenarioInfo");
//被保障分队
Object insureObj = SpringUtil.getBean(RedisUtil.class).hget(
scenarioTask.getScenarioId() + "-" + roomId + "-" + scenarioTask.getInsureResourceId(),
"scenarioInfo");
if(supplierObj!=null&&insureObj!=null){
//增加被保障分队的量
SpringUtil.getBean(RedisUtil.class)
.hset(scenarioTask.getScenarioId() + "-" + roomId + "-" + scenarioTask.getInsureResourceId(),
"medical", statistic.getMedical().getTotal() + "");
ScenarioInfo scenarioSupplierInfo = JSON.parseObject(supplierObj.toString(), ScenarioInfo.class);
ScenarioInfo scenarioInsureInfo = JSON.parseObject(insureObj.toString(), ScenarioInfo.class);
//获取保障任务的药品信息
Object supplierObj = SpringUtil.getBean(RedisUtil.class)
.hget(scenarioTask.getScenarioId() + "-" + roomId + "-"
+ scenarioTask.getResourceId(),
"medical");
//减少保障分队的量
if (supplierObj != null) {
double supplierMedical = Double.parseDouble(supplierObj.toString());
scenarioSupplierInfo.getMedical().setCurrent(scenarioInsureInfo.getMedical().getCurrent() - statistic.getMedical().getTotal());
scenarioInsureInfo.getMedical().setCurrent(statistic.getMedical().getTotal());
double remain = supplierMedical - statistic.getMedical().getTotal();
SpringUtil.getBean(RedisUtil.class)
.hset(scenarioTask.getScenarioId() + "-" + roomId + "-"
+ scenarioTask.getResourceId(),
"medical", remain + "");
}
SpringUtil.getBean(RedisUtil.class).hset(
scenarioTask.getScenarioId() + "-" + roomId + "-" + scenarioTask.getInsureResourceId(),
"scenarioInfo",JSON.toJSONString(scenarioInsureInfo));
SpringUtil.getBean(RedisUtil.class).hset(
scenarioTask.getScenarioId() + "-" + roomId + "-" + scenarioTask.getResourceId(),
"scenarioInfo",JSON.toJSONString(scenarioSupplierInfo));
}
}
private void supplierFuel(StatisticBean statistic) {
SpringUtil.getBean(RedisUtil.class)
.hset(scenarioTask.getScenarioId() + "-" + roomId + "-" + scenarioTask.getInsureResourceId(),
"fuel", statistic.getFuel().getTotal() + "");
//保障分队
Object supplierObj = SpringUtil.getBean(RedisUtil.class).hget(
scenarioTask.getScenarioId() + "-" + roomId + "-" + scenarioTask.getResourceId(),
"scenarioInfo");
//被保障分队
Object insureObj = SpringUtil.getBean(RedisUtil.class).hget(
scenarioTask.getScenarioId() + "-" + roomId + "-" + scenarioTask.getInsureResourceId(),
"scenarioInfo");
if(supplierObj!=null&&insureObj!=null){
Object supplierObj = SpringUtil.getBean(RedisUtil.class)
.hget(scenarioTask.getScenarioId() + "-" + roomId + "-"
+ scenarioTask.getResourceId(),
"fuel");
//减少保障分队的量
if (supplierObj != null) {
double supplierMedical = Double.parseDouble(supplierObj.toString());
ScenarioInfo scenarioSupplierInfo = JSON.parseObject(supplierObj.toString(), ScenarioInfo.class);
ScenarioInfo scenarioInsureInfo = JSON.parseObject(insureObj.toString(), ScenarioInfo.class);
scenarioSupplierInfo.getFuel().setCurrent(scenarioInsureInfo.getFuel().getCurrent() - statistic.getFuel().getTotal());
scenarioInsureInfo.getFuel().setCurrent(statistic.getFuel().getTotal());
SpringUtil.getBean(RedisUtil.class).hset(
scenarioTask.getScenarioId() + "-" + roomId + "-" + scenarioTask.getInsureResourceId(),
"scenarioInfo",JSON.toJSONString(scenarioInsureInfo));
SpringUtil.getBean(RedisUtil.class).hset(
scenarioTask.getScenarioId() + "-" + roomId + "-" + scenarioTask.getResourceId(),
"scenarioInfo",JSON.toJSONString(scenarioSupplierInfo));
double remain = supplierMedical - statistic.getFuel().getTotal();
SpringUtil.getBean(RedisUtil.class)
.hset(scenarioTask.getScenarioId() + "-" + roomId + "-"
+ scenarioTask.getResourceId(),
"fuel", remain + "");
}
}
private void supplierAmmunition(StatisticBean statistic) {
SpringUtil.getBean(RedisUtil.class)
.hset(scenarioTask.getScenarioId() + "-" + roomId + "-" + scenarioTask.getInsureResourceId(),
"ammunition", statistic.getAmmunition().getTotal() + "");
Object supplierObj = SpringUtil.getBean(RedisUtil.class)
.hget(scenarioTask.getScenarioId() + "-" + roomId + "-"
+ scenarioTask.getResourceId(),
"ammunition");
//减少保障分队的量
if (supplierObj != null) {
double supplierMedical = Double.parseDouble(supplierObj.toString());
//保障分队
Object supplierObj = SpringUtil.getBean(RedisUtil.class).hget(
scenarioTask.getScenarioId() + "-" + roomId + "-" + scenarioTask.getResourceId(),
"scenarioInfo");
//被保障分队
Object insureObj = SpringUtil.getBean(RedisUtil.class).hget(
scenarioTask.getScenarioId() + "-" + roomId + "-" + scenarioTask.getInsureResourceId(),
"scenarioInfo");
if(supplierObj!=null&&insureObj!=null){
ScenarioInfo scenarioSupplierInfo = JSON.parseObject(supplierObj.toString(), ScenarioInfo.class);
ScenarioInfo scenarioInsureInfo = JSON.parseObject(insureObj.toString(), ScenarioInfo.class);
scenarioSupplierInfo.getAmmunition().setCurrent(scenarioInsureInfo.getAmmunition().getCurrent() - statistic.getAmmunition().getTotal());
scenarioInsureInfo.getAmmunition().setCurrent(statistic.getAmmunition().getTotal());
SpringUtil.getBean(RedisUtil.class).hset(
scenarioTask.getScenarioId() + "-" + roomId + "-" + scenarioTask.getInsureResourceId(),
"scenarioInfo",JSON.toJSONString(scenarioInsureInfo));
SpringUtil.getBean(RedisUtil.class).hset(
scenarioTask.getScenarioId() + "-" + roomId + "-" + scenarioTask.getResourceId(),
"scenarioInfo",JSON.toJSONString(scenarioSupplierInfo));
double remain = supplierMedical - statistic.getAmmunition().getTotal();
SpringUtil.getBean(RedisUtil.class)
.hset(scenarioTask.getScenarioId() + "-" + roomId + "-"
+ scenarioTask.getResourceId(),
"ammunition", remain + "");
}
}
private void supplierWater(StatisticBean statistic) {
SpringUtil.getBean(RedisUtil.class)
.hset(scenarioTask.getScenarioId() + "-" + roomId + "-" + scenarioTask.getInsureResourceId(),
"water", statistic.getWater().getTotal() + "");
Object supplierObj = SpringUtil.getBean(RedisUtil.class)
.hget(scenarioTask.getScenarioId() + "-" + roomId + "-"
+ scenarioTask.getResourceId(),
"water");
//减少保障分队的量
if (supplierObj != null) {
double supplierMedical = Double.parseDouble(supplierObj.toString());
//保障分队
Object supplierObj = SpringUtil.getBean(RedisUtil.class).hget(
scenarioTask.getScenarioId() + "-" + roomId + "-" + scenarioTask.getResourceId(),
"scenarioInfo");
//被保障分队
Object insureObj = SpringUtil.getBean(RedisUtil.class).hget(
scenarioTask.getScenarioId() + "-" + roomId + "-" + scenarioTask.getInsureResourceId(),
"scenarioInfo");
if(supplierObj!=null&&insureObj!=null){
ScenarioInfo scenarioSupplierInfo = JSON.parseObject(supplierObj.toString(), ScenarioInfo.class);
ScenarioInfo scenarioInsureInfo = JSON.parseObject(insureObj.toString(), ScenarioInfo.class);
scenarioSupplierInfo.getWater().setCurrent(scenarioInsureInfo.getWater().getCurrent() - statistic.getWater().getTotal());
scenarioInsureInfo.getWater().setCurrent(statistic.getWater().getTotal());
SpringUtil.getBean(RedisUtil.class).hset(
scenarioTask.getScenarioId() + "-" + roomId + "-" + scenarioTask.getInsureResourceId(),
"scenarioInfo",JSON.toJSONString(scenarioInsureInfo));
SpringUtil.getBean(RedisUtil.class).hset(
scenarioTask.getScenarioId() + "-" + roomId + "-" + scenarioTask.getResourceId(),
"scenarioInfo",JSON.toJSONString(scenarioSupplierInfo));
double remain = supplierMedical - statistic.getWater().getTotal();
SpringUtil.getBean(RedisUtil.class)
.hset(scenarioTask.getScenarioId() + "-" + roomId + "-"
+ scenarioTask.getResourceId(),
"water", remain + "");
}
}
private void supplierFood(StatisticBean statistic) {
//保障分队
Object supplierObj = SpringUtil.getBean(RedisUtil.class).hget(
scenarioTask.getScenarioId() + "-" + roomId + "-" + scenarioTask.getResourceId(),
"scenarioInfo");
//被保障分队
Object insureObj = SpringUtil.getBean(RedisUtil.class).hget(
scenarioTask.getScenarioId() + "-" + roomId + "-" + scenarioTask.getInsureResourceId(),
"scenarioInfo");
if(supplierObj!=null&&insureObj!=null){
SpringUtil.getBean(RedisUtil.class)
.hset(scenarioTask.getScenarioId() + "-" + roomId + "-" + scenarioTask.getInsureResourceId(),
"food", statistic.getFood().getTotal() + "");
Object supplierObj = SpringUtil.getBean(RedisUtil.class)
.hget(scenarioTask.getScenarioId() + "-" + roomId + "-"
+ scenarioTask.getResourceId(),
"food");
//减少保障分队的量
if (supplierObj != null) {
double supplierMedical = Double.parseDouble(supplierObj.toString());
ScenarioInfo scenarioSupplierInfo = JSON.parseObject(supplierObj.toString(), ScenarioInfo.class);
ScenarioInfo scenarioInsureInfo = JSON.parseObject(insureObj.toString(), ScenarioInfo.class);
scenarioSupplierInfo.getFood().setCurrent(scenarioInsureInfo.getFood().getCurrent() - statistic.getFood().getTotal());
scenarioInsureInfo.getFood().setCurrent(statistic.getFood().getTotal());
SpringUtil.getBean(RedisUtil.class).hset(
scenarioTask.getScenarioId() + "-" + roomId + "-" + scenarioTask.getInsureResourceId(),
"scenarioInfo",JSON.toJSONString(scenarioInsureInfo));
SpringUtil.getBean(RedisUtil.class).hset(
scenarioTask.getScenarioId() + "-" + roomId + "-" + scenarioTask.getResourceId(),
"scenarioInfo",JSON.toJSONString(scenarioSupplierInfo));
double remain = supplierMedical - statistic.getFood().getTotal();
SpringUtil.getBean(RedisUtil.class)
.hset(scenarioTask.getScenarioId() + "-" + roomId + "-"
+ scenarioTask.getResourceId(),
"food", remain + "");
}
}
}