From 35995ce8ffef6f894f04bb5c662b4a9df47d5f50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E7=8E=89=E4=B8=9C?= <129883742+liyudong2018@users.noreply.github.com> Date: Sat, 20 Sep 2025 20:14:26 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E7=9B=B8=E5=85=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/hivekion/room/bean/AbtParentTask.java | 28 ++- .../java/com/hivekion/room/bean/MoveTask.java | 6 +- .../com/hivekion/room/bean/SupplierTask.java | 200 +++++++++++------- 3 files changed, 142 insertions(+), 92 deletions(-) diff --git a/src/main/java/com/hivekion/room/bean/AbtParentTask.java b/src/main/java/com/hivekion/room/bean/AbtParentTask.java index 8fdb790..b4fe1c9 100644 --- a/src/main/java/com/hivekion/room/bean/AbtParentTask.java +++ b/src/main/java/com/hivekion/room/bean/AbtParentTask.java @@ -33,6 +33,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 +64,7 @@ public abstract class AbtParentTask implements TaskAction { //http请求 protected WebClient webClient = WebClient.create(); protected final AtomicBoolean canMoved = new AtomicBoolean(true); - protected final AtomicReference coordinateReference = new AtomicReference<>(); + protected final AtomicReference coordinateReference = new AtomicReference<>(); /** * 任务相对与想定的开始时间 @@ -202,7 +203,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 +214,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 +232,7 @@ public abstract class AbtParentTask implements TaskAction { endPoint = distanceInfoMap.lastEntry(); } - // log.info("enPoint::{}",endPoint); + // log.info("enPoint::{}",endPoint); //ws数据 List dataList = new ArrayList<>(); HashMap dataMap = new HashMap<>(); @@ -241,7 +242,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 +312,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 respObj = new ResponseCmdInfo<>(); respObj.setData(jsonStr); respObj.setRoom(roomId); diff --git a/src/main/java/com/hivekion/room/bean/MoveTask.java b/src/main/java/com/hivekion/room/bean/MoveTask.java index ebc1696..bef7165 100644 --- a/src/main/java/com/hivekion/room/bean/MoveTask.java +++ b/src/main/java/com/hivekion/room/bean/MoveTask.java @@ -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 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()); diff --git a/src/main/java/com/hivekion/room/bean/SupplierTask.java b/src/main/java/com/hivekion/room/bean/SupplierTask.java index cc144f3..e169382 100644 --- a/src/main/java/com/hivekion/room/bean/SupplierTask.java +++ b/src/main/java/com/hivekion/room/bean/SupplierTask.java @@ -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 + ""); } } + } From 25507ce2aafeb1dc11323d4bacfb02c1a7db4f91 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E7=8E=89=E4=B8=9C?= <129883742+liyudong2018@users.noreply.github.com> Date: Sat, 20 Sep 2025 21:51:45 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E7=9B=B8=E5=85=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/hivekion/baseData/entity/Scenario.java | 1 + src/main/java/com/hivekion/room/bean/AbtParentTask.java | 2 ++ 2 files changed, 3 insertions(+) diff --git a/src/main/java/com/hivekion/baseData/entity/Scenario.java b/src/main/java/com/hivekion/baseData/entity/Scenario.java index 58a7343..a766dca 100644 --- a/src/main/java/com/hivekion/baseData/entity/Scenario.java +++ b/src/main/java/com/hivekion/baseData/entity/Scenario.java @@ -106,6 +106,7 @@ public class Scenario extends SearchInputVo { private String leftBottomLat; @TableField(value = "right_bottom_lat") private String rightBottomLat; + private String desc; /** * 想定关联的资源列表 */ diff --git a/src/main/java/com/hivekion/room/bean/AbtParentTask.java b/src/main/java/com/hivekion/room/bean/AbtParentTask.java index b4fe1c9..3c3d60a 100644 --- a/src/main/java/com/hivekion/room/bean/AbtParentTask.java +++ b/src/main/java/com/hivekion/room/bean/AbtParentTask.java @@ -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; @@ -333,6 +334,7 @@ public abstract class AbtParentTask implements TaskAction { respObj.setCmdType("scenarioInfo"); Global.sendCmdInfoQueue.add(respObj); } + } interface BizTaskOnTiming {