任务相关

This commit is contained in:
李玉东 2025-09-21 04:31:48 +08:00
parent ab69a278a4
commit 9f9cb97cbc
10 changed files with 113 additions and 41 deletions

View File

@ -1,11 +1,13 @@
package com.hivekion.room; package com.hivekion.room;
import com.alibaba.fastjson2.JSON;
import com.hivekion.baseData.entity.Scenario; import com.hivekion.baseData.entity.Scenario;
import com.hivekion.room.bean.Room; import com.hivekion.room.bean.Room;
import com.hivekion.room.func.TaskAction; import com.hivekion.room.func.TaskAction;
import java.util.Map; import java.util.Map;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledExecutorService;
import lombok.extern.slf4j.Slf4j;
/** /**
* [类的简要说明] * [类的简要说明]
@ -16,6 +18,7 @@ import java.util.concurrent.ScheduledExecutorService;
* @author LiDongYU * @author LiDongYU
* @since 2025/7/22 * @since 2025/7/22
*/ */
@Slf4j
public class RoomManager { public class RoomManager {
private static final Map<String, Room> roomsMap = new ConcurrentHashMap<>(); private static final Map<String, Room> roomsMap = new ConcurrentHashMap<>();
@ -48,6 +51,7 @@ public class RoomManager {
} }
public static void addAction(String id, long time, TaskAction action) { public static void addAction(String id, long time, TaskAction action) {
log.info("增加任务::time::{},action::{}",time, JSON.toJSONString(action));
Room room = roomsMap.get(id); Room room = roomsMap.get(id);
if (room != null) { if (room != null) {
room.addAction(time, action); room.addAction(time, action);

View File

@ -17,6 +17,7 @@ import com.hivekion.room.func.TaskAction;
import com.hivekion.scenario.entity.ScenarioResource; import com.hivekion.scenario.entity.ScenarioResource;
import com.hivekion.scenario.entity.ScenarioTask; import com.hivekion.scenario.entity.ScenarioTask;
import com.hivekion.scenario.service.impl.BattleSupplierServiceImpl; import com.hivekion.scenario.service.impl.BattleSupplierServiceImpl;
import com.hivekion.scenario.service.impl.ScenarioResourceServiceImpl;
import com.hivekion.scenario.service.impl.ScenarioTaskServiceImpl; import com.hivekion.scenario.service.impl.ScenarioTaskServiceImpl;
import com.hivekion.statistic.bean.EditScenarioInfo; import com.hivekion.statistic.bean.EditScenarioInfo;
import com.hivekion.statistic.bean.ScenarioInfo; import com.hivekion.statistic.bean.ScenarioInfo;
@ -24,6 +25,8 @@ import com.hivekion.statistic.bean.StatisticBean;
import com.hivekion.statistic.service.impl.StatisticServiceImpl; import com.hivekion.statistic.service.impl.StatisticServiceImpl;
import com.hivekion.supplier.entity.SupplierRequest; import com.hivekion.supplier.entity.SupplierRequest;
import com.hivekion.supplier.service.impl.SupplierRequestServiceImpl; import com.hivekion.supplier.service.impl.SupplierRequestServiceImpl;
import com.hivekion.team.entity.Teaminfo;
import com.hivekion.team.service.impl.TeaminfoServiceImpl;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
@ -84,16 +87,7 @@ public abstract class AbtParentTask implements TaskAction {
private final AtomicBoolean requestFlag = new AtomicBoolean(false); private final AtomicBoolean requestFlag = new AtomicBoolean(false);
private StatisticBean statisticBean; private StatisticBean statisticBean;
//线程池
// protected ThreadPoolExecutor executor = new ThreadPoolExecutor(
// 5, // 核心线程数
// 10, // 最大线程数
// 60L, // 空闲线程存活时间
// TimeUnit.SECONDS, // 时间单位
// new LinkedBlockingQueue<>(100), // 任务队列
// new CustomThreadFactory("MyPool"), // 线程工厂
// new ThreadPoolExecutor.CallerRunsPolicy() // 拒绝策略
// );
public AbtParentTask(ScenarioTask scenarioTask, String roomId) { public AbtParentTask(ScenarioTask scenarioTask, String roomId) {
this.scenarioTask = scenarioTask; this.scenarioTask = scenarioTask;
@ -259,6 +253,7 @@ public abstract class AbtParentTask implements TaskAction {
double currentFuel = getCurrentFuel(); double currentFuel = getCurrentFuel();
double totalFuel = statisticBean.getFuel().getTotal(); double totalFuel = statisticBean.getFuel().getTotal();
log.info("totalFuel::{}", totalFuel);
if (currentFuel <= 0 || totalFuel <= 0) { if (currentFuel <= 0 || totalFuel <= 0) {
log.error("{}:油量为零停止移动", this.scenarioTask.getResourceId()); log.error("{}:油量为零停止移动", this.scenarioTask.getResourceId());
return; return;
@ -288,7 +283,7 @@ public abstract class AbtParentTask implements TaskAction {
if (duringAction != null) { if (duringAction != null) {
duringAction.doSomeThing(); duringAction.doSomeThing();
} }
log.info("移动中....."); log.info("移动中..... 放大系数{}",RoomManager.getMag(roomId));
//跑动距离 //跑动距离
double distance = duringTime.getAndAdd(RoomManager.getMag(roomId)) * speed; double distance = duringTime.getAndAdd(RoomManager.getMag(roomId)) * speed;
@ -459,35 +454,39 @@ public abstract class AbtParentTask implements TaskAction {
private void produceTask(double fuel) { private void produceTask(double fuel) {
try { try {
Map<Integer, Teaminfo> teamInfoMap = SpringUtil.getBean(TeaminfoServiceImpl.class)
.teamInfoMap();
log.info("{}-产生自动保障任务", this.scenarioTask.getResourceId()); log.info("{}-产生自动保障任务", this.scenarioTask.getResourceId());
List<ScenarioResource> resourceList = SpringUtil.getBean(BattleSupplierServiceImpl.class) List<ScenarioResource> resourceList = SpringUtil.getBean(BattleSupplierServiceImpl.class)
.selectSupplierResource(scenarioTask.getResourceId()); .selectSupplierResource(scenarioTask.getResourceId());
log.info("{}-可选保障分队长度{}", scenarioTask.getResourceId(), resourceList.size()); log.info("{}-可选保障分队长度{}", scenarioTask.getResourceId(), resourceList.size());
if (!resourceList.isEmpty()) { if (!resourceList.isEmpty()) {
ScenarioResource supplierResource = null;
// 找出油料保障分队
for (ScenarioResource resource : resourceList) {
Teaminfo teaminfo = teamInfoMap.get(resource.getResourceId());
ScenarioTask task = new ScenarioTask(); if ("SUPPLIER_FUEL".equals(teaminfo.getRoleCode())) {
task.setId(IdUtils.simpleUUID()); supplierResource = resource;
task.setScenarioId(scenarioTask.getScenarioId());
task.setResourceId(resourceList.get(0).getId()); break;
task.setTaskType("6"); }
task.setInsureResourceId(scenarioTask.getResourceId()); }
task.setSupplierNum(statisticBean.getFuel().getTotal() - fuel); if (supplierResource == null) {
task.setToLat(this.coordinateReference.get().getLat() + ""); log.error("找不到对应的油料保障分队");
task.setToLng(this.coordinateReference.get().getLng() + ""); return;
task.setStartTime(LocalDateTime.now()); }
task.setFromLat(resourceList.get(0).getLat()); //找出油料仓库
task.setFromLng(resourceList.get(0).getLng()); List<ScenarioResource> resources = SpringUtil.getBean(ScenarioResourceServiceImpl.class)
task.setFromSource("general"); .selectResourceByRoleCode(scenarioTask.getScenarioId(), "WARE_FUEL_HOUSE");
if (resources.isEmpty()) {
log.error("找不到油料仓库");
return;
}
produceMoveTask(supplierResource, resources.get(0), this.coordinateReference.get(), fuel);
log.info("{}-保障分队id::{},from::{},to::{}", this.scenarioTask.getInsureResourceId(),
task.getResourceId(), task.getFromLat() + "," + task.getFromLng(),
task.getToLat() + "," + task.getToLng());
SpringUtil.getBean(ScenarioTaskServiceImpl.class).save(task);
//增加到房间任务
SupplierTask supplierTask = new SupplierTask(task, roomId);
//立即执行
RoomManager.addAction(roomId, 0, supplierTask);
} else { } else {
log.error("{}-没有保障分队可以选择", scenarioTask.getResourceId()); log.error("{}-没有保障分队可以选择", scenarioTask.getResourceId());
} }
@ -496,6 +495,59 @@ public abstract class AbtParentTask implements TaskAction {
} }
} }
private void produceMoveTask(ScenarioResource supplierResource, ScenarioResource fuelResource,
Coordinate coordinate, double minusFuel) {
ScenarioTask task = new ScenarioTask();
task.setId(IdUtils.simpleUUID());
task.setScenarioId(scenarioTask.getScenarioId());
task.setResourceId(supplierResource.getId());
task.setTaskType("1");
task.setFromLat(supplierResource.getLat());
task.setFromLng(supplierResource.getLng());
task.setToLat(fuelResource.getLat());
task.setToLng(fuelResource.getLng());
task.setStartTime(LocalDateTime.now());
task.setFromSource("general");
SpringUtil.getBean(ScenarioTaskServiceImpl.class).save(task);
MoveTask moveTask = new MoveTask(task, this.roomId, new TaskAction() {
@Override
public void doSomeThing() {
//创建一个保障任务
ScenarioTask task = new ScenarioTask();
task.setId(IdUtils.simpleUUID());
task.setScenarioId(scenarioTask.getScenarioId());
task.setResourceId(supplierResource.getId());
task.setTaskType("6");
task.setInsureResourceId(scenarioTask.getResourceId());
task.setSupplierNum(statisticBean.getFuel().getTotal() - minusFuel);
task.setToLat(coordinate.getLat() + "");
task.setToLng(coordinate.getLng() + "");
task.setStartTime(LocalDateTime.now());
task.setFromLat(fuelResource.getLat());
task.setFromLng(fuelResource.getLng());
task.setFromSource("general");
SpringUtil.getBean(ScenarioTaskServiceImpl.class).save(task);
SupplierTask supplierTask = new SupplierTask(task, roomId);
RoomManager.addAction(roomId, 0, supplierTask);
}
@Override
public String getId() {
return "";
}
@Override
public String getType() {
return "";
}
});
//立即执行
RoomManager.addAction(roomId, 0, moveTask);
}
} }
interface BizTaskOnTiming { interface BizTaskOnTiming {

View File

@ -229,7 +229,7 @@ public class BattleRootTask extends AbtParentTask {
String death = SpringUtil.getBean(Environment.class).getProperty("death.warn"); String death = SpringUtil.getBean(Environment.class).getProperty("death.warn");
String injured = SpringUtil.getBean(Environment.class).getProperty("injured.warn"); String injured = SpringUtil.getBean(Environment.class).getProperty("injured.warn");
String ammunition = SpringUtil.getBean(Environment.class).getProperty("ammunition.warn"); String ammunition = SpringUtil.getBean(Environment.class).getProperty("ammunition.warn");
log.info("===========person ammunition==={}===={}====={}========",death,injured,ammunition); // log.info("===========person ammunition==={}===={}====={}========",death,injured,ammunition);
String saveJsonStr= (String) redisUtil.hget(scenarioTask.getScenarioId() + "-" + roomId + "-" + scenarioTask.getResourceId(),"scenarioInfo"); String saveJsonStr= (String) redisUtil.hget(scenarioTask.getScenarioId() + "-" + roomId + "-" + scenarioTask.getResourceId(),"scenarioInfo");
ScenarioInfo scenarioInfo =JSONObject.parseObject(saveJsonStr,ScenarioInfo.class); ScenarioInfo scenarioInfo =JSONObject.parseObject(saveJsonStr,ScenarioInfo.class);
Double restAmmunition = Double.valueOf(scenarioInfo.getAmmunition().getCurrent()); Double restAmmunition = Double.valueOf(scenarioInfo.getAmmunition().getCurrent());

View File

@ -44,11 +44,12 @@ public class MoveTask extends AbtParentTask implements TaskAction {
*/ */
private final int consumptionTaskInterval = 5; private final int consumptionTaskInterval = 5;
private final TaskAction finishedAction;
public MoveTask(ScenarioTask scenarioTask, String roomId,TaskAction finishedAction) {
public MoveTask(ScenarioTask scenarioTask, String roomId) {
super(scenarioTask, roomId); super(scenarioTask, roomId);
this.finishedAction = finishedAction;
} }
@ -83,7 +84,7 @@ public class MoveTask extends AbtParentTask implements TaskAction {
public String getType() { public String getType() {
return ""; return "";
} }
}, null); //更新路径 }, this.finishedAction); //更新路径
fuelConsumption();//油品消耗 fuelConsumption();//油品消耗
} }

View File

@ -2,6 +2,8 @@ package com.hivekion.scenario.mapper;
import com.hivekion.scenario.entity.ScenarioResource; import com.hivekion.scenario.entity.ScenarioResource;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import java.util.List;
import org.apache.ibatis.annotations.Param;
/** /**
* <p> * <p>
@ -12,5 +14,5 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
* @since 2025-09-09 * @since 2025-09-09
*/ */
public interface ScenarioResourceMapper extends BaseMapper<ScenarioResource> { public interface ScenarioResourceMapper extends BaseMapper<ScenarioResource> {
List<ScenarioResource> selectResourceByRoleCode(@Param("scenarioId") Integer scenarioId,@Param("roleCode") String roleCode );
} }

View File

@ -4,6 +4,7 @@ import com.hivekion.scenario.entity.ScenarioResource;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import org.apache.ibatis.annotations.Param;
/** /**
* <p> * <p>
@ -17,4 +18,5 @@ public interface ScenarioResourceService extends IService<ScenarioResource> {
List<ScenarioResource> getResourceList(ScenarioResource resource); List<ScenarioResource> getResourceList(ScenarioResource resource);
Map<String,ScenarioResource> resourceMap(); Map<String,ScenarioResource> resourceMap();
List<ScenarioResource> getResourceListByScenarioId(Integer scenarioId); List<ScenarioResource> getResourceListByScenarioId(Integer scenarioId);
List<ScenarioResource> selectResourceByRoleCode( Integer scenarioId, String roleCode );
} }

View File

@ -113,4 +113,9 @@ public class ScenarioResourceServiceImpl extends
queryWrapper.eq("scenario_id", scenarioId); queryWrapper.eq("scenario_id", scenarioId);
return this.list(queryWrapper); return this.list(queryWrapper);
} }
@Override
public List<ScenarioResource> selectResourceByRoleCode(Integer scenarioId, String roleCode) {
return this.baseMapper.selectResourceByRoleCode(scenarioId, roleCode);
}
} }

View File

@ -157,8 +157,8 @@ public class ScenarioTaskServiceImpl extends
switch (task.getTaskType()) { switch (task.getTaskType()) {
//移动任务 //移动任务
case "1": case "1":
log.info("move task::{}",diff);
MoveTask moveRootTask = new MoveTask(task, roomId); MoveTask moveRootTask = new MoveTask(task, roomId,null);
RoomManager.addAction(roomId, diff, moveRootTask); RoomManager.addAction(roomId, diff, moveRootTask);
respObj.setCmdType("moveTask"); respObj.setCmdType("moveTask");
respObj.setData(JSON.toJSONString(moveRootTask)); respObj.setData(JSON.toJSONString(moveRootTask));

View File

@ -3,7 +3,7 @@ death.warn = 56
ammunition.warn = 3 ammunition.warn = 3
food.warn = 3 food.warn = 3
water.warn = 3 water.warn = 3
fuel.warn = 80.6 fuel.warn = 99.3
medical.warn = 1 medical.warn = 1
death.spreed = 3 death.spreed = 3
injured.spreed = 3 injured.spreed = 3

View File

@ -1,5 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.hivekion.scenario.mapper.ScenarioResourceMapper"> <mapper namespace="com.hivekion.scenario.mapper.ScenarioResourceMapper">
<select id="selectResourceByRoleCode" resultType="com.hivekion.scenario.entity.ScenarioResource">
SELECT
id,SCENARIO_ID as scenarioId,RESOURCE_TYPE as resourceType,RESOURCE_ID as resourceId,lng,lat
FROM
TBL_SCENARIO_RESOURCE t where t.SCENARIO_ID = #{scenarioId}
and t.RESOURCE_ID in (select id from TBL_TEAMINFO t2 where t2.role_code=${roleCode})
</select>
</mapper> </mapper>