package com.hivekion.room.bean; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.RandomUtil; import cn.hutool.extra.spring.SpringUtil; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONObject; import com.hivekion.Global; import com.hivekion.common.entity.ResponseCmdInfo; 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.BattleConsume; import com.hivekion.scenario.entity.ScenarioResource; import com.hivekion.scenario.entity.ScenarioTask; import com.hivekion.scenario.service.IBattleConsumeService; import com.hivekion.scenario.service.impl.BattleSupplierServiceImpl; import com.hivekion.scenario.service.impl.ScenarioResourceServiceImpl; import com.hivekion.scenario.service.impl.ScenarioTaskServiceImpl; import com.hivekion.statistic.bean.*; import com.hivekion.statistic.service.StatisticService; import com.hivekion.statistic.service.impl.StatisticServiceImpl; import com.hivekion.supplier.entity.SupplierRequest; import com.hivekion.supplier.service.ISupplierRequestService; import java.util.concurrent.atomic.AtomicBoolean; import com.hivekion.team.entity.Teaminfo; import com.hivekion.team.service.impl.TeaminfoServiceImpl; import lombok.extern.slf4j.Slf4j; import org.springframework.core.env.Environment; import org.springframework.util.CollectionUtils; import javax.swing.*; import java.time.LocalDateTime; import java.time.ZoneId; import java.util.*; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; /** * [类的简要说明] *

* [详细描述,可选] *

* * @author LiDongYU * @since 2025/7/22 */ @Slf4j public class BattleRootTask extends AbtParentTask { private RedisUtil redisUtil = null; private ISupplierRequestService supplierRequestService; private IBattleConsumeService battleConsumeService; private ScenarioInfo scenarioInfo; private static final Double FOOD_SPREED = 0.3D; private static final Double WATER_SPREED = 0.1D; // private static final Double FUEL_SPREED = 3.6D; private static final Double MEDICAL_SPREED = 0.2D; private final AtomicBoolean isAlreadyProduceTask = new AtomicBoolean(false); public BattleRootTask(ScenarioTask scenarioTask,String roomId) { super(scenarioTask,roomId); } private void initBean(){ if(redisUtil == null) { redisUtil = SpringUtil.getBean(RedisUtil.class); } if(supplierRequestService == null){ supplierRequestService = SpringUtil.getBean(ISupplierRequestService.class); } if(battleConsumeService == null){ battleConsumeService = SpringUtil.getBean(IBattleConsumeService.class); } } //执行一次 @Override public void doSomeThing() { log.info("===============begin BattleRootTask=========={}==========",this.getRoomStatus()); this.initBean(); if(this.getRoomStatus()) { long initDuringTime = this.getDuringTime(); redisUtil.hset(scenarioTask.getScenarioId() + "-" + roomId + "-" + scenarioTask.getResourceId(),"duringTime",String.valueOf(initDuringTime)); String jsonStr = (String)redisUtil.hget(scenarioTask.getScenarioId() + "-" + roomId + "-" + scenarioTask.getResourceId(),"scenarioInfo"); ScenarioInfo scenarioInfo =JSONObject.parseObject(jsonStr,ScenarioInfo.class); this.scenarioInfo = scenarioInfo; log.info("===============================初始化本次战斗任务各种资源数===================================="); double suppleAmount =scenarioInfo.getAmmunition().getTotal(); int suppleDeath =scenarioInfo.getPerson().getDeath(); int suppleInjured =scenarioInfo.getPerson().getInjured(); final Map suppleFlagMap = new HashMap<>(); suppleFlagMap.put("ammunition",false); suppleFlagMap.put("death",false); suppleFlagMap.put("injured",false); //定时检查统计各种资源消耗量 this.createBattleTaskOnTimingHandle(new BizTaskOnTiming() { @Override public void execTask() { log.info("===============================战斗检查统计各种资源消耗量 begin===================================="); Long deathConsume = null; Long injuredConsume = null; Double ammunitionConsume = null; Double foodConsume = null; Double waterConsume = null; // Double fuelConsume = null; Double medicalConsume = null; String teamLat = null; String teamLng = null; JSONObject jsonObject = new JSONObject(); String jsonStr = (String)redisUtil.hget(scenarioTask.getScenarioId() + "-" + roomId + "-" + scenarioTask.getResourceId(),"scenarioInfo"); ScenarioInfo scenarioInfoOnTime =JSONObject.parseObject(jsonStr,ScenarioInfo.class); String updJsonStr = (String) redisUtil.hget(scenarioTask.getScenarioId() + "-" + roomId + "-" + scenarioTask.getResourceId(), "updScenarioInfo"); EditScenarioInfo updScenarioInfo = JSON.parseObject(updJsonStr, EditScenarioInfo.class); try { long duringTime = getDuringTime(); long lastDuringTime = Long.valueOf(redisUtil.hget(scenarioTask.getScenarioId() + "-" + roomId + "-" + scenarioTask.getResourceId(),"duringTime").toString()); long intervalDuringTime = duringTime - lastDuringTime; double ammunition = Double.valueOf(scenarioInfoOnTime.getAmmunition().getCurrent()); double food = Double.valueOf(scenarioInfoOnTime.getFood().getCurrent()); double medical = Double.valueOf(scenarioInfoOnTime.getMedical().getCurrent()); double water = Double.valueOf(scenarioInfoOnTime.getWater().getCurrent()); long death = Long.valueOf(scenarioInfoOnTime.getPerson().getDeath()); long injured = Long.valueOf(scenarioInfoOnTime.getPerson().getInjured()); teamLat = scenarioInfoOnTime.getTeam().getLat().toString(); teamLng = scenarioInfoOnTime.getTeam().getLng().toString(); if(scenarioInfoOnTime.getPerson().getCurrent() >0) { // do { int deathParam = RandomUtil.getSecureRandom().nextInt(6); int baseParam = deathParam / 2; if (deathParam != 0 && baseParam != 0) { deathConsume = Long.valueOf(deathParam % baseParam); } else { deathConsume = 0L; } injuredConsume = Long.valueOf(RandomUtil.getSecureRandom().nextInt(3)); } while(scenarioInfoOnTime.getPerson().getCurrent() - Long.valueOf(deathConsume).intValue()-Long.valueOf(injuredConsume).intValue() < 0); ammunitionConsume = intervalDuringTime * (0.1D + RandomUtil.getSecureRandom().nextDouble()); foodConsume = FOOD_SPREED; waterConsume = WATER_SPREED; medicalConsume = MEDICAL_SPREED; scenarioInfoOnTime.getPerson().setDeath(Long.valueOf(death + deathConsume).intValue()); scenarioInfoOnTime.getPerson().setInjured(Long.valueOf(injured + injuredConsume).intValue()); if(scenarioInfoOnTime.getPerson().getCurrent() - Long.valueOf(deathConsume).intValue()-Long.valueOf(injuredConsume).intValue() <=0){ scenarioInfoOnTime.getPerson().setCurrent(0); }else { scenarioInfoOnTime.getPerson().setCurrent(scenarioInfoOnTime.getPerson().getCurrent() - Long.valueOf(deathConsume).intValue() - Long.valueOf(injuredConsume).intValue()); } updScenarioInfo.getJbxx().getPerson().setDeath(Long.valueOf(death + deathConsume).intValue()); updScenarioInfo.getJbxx().getPerson().setInjured(Long.valueOf(injured + injuredConsume).intValue()); if(updScenarioInfo.getJbxx().getPerson().getCurrent() - Long.valueOf(deathConsume).intValue()-Long.valueOf(injuredConsume).intValue() <=0){ updScenarioInfo.getJbxx().getPerson().setCurrent(0); }else { updScenarioInfo.getJbxx().getPerson().setCurrent(updScenarioInfo.getJbxx().getPerson().getCurrent() - Long.valueOf(deathConsume).intValue() - Long.valueOf(injuredConsume).intValue()); } }else { if(scenarioInfoOnTime.getPerson().getTotal() - scenarioInfoOnTime.getPerson().getInjured()-scenarioInfoOnTime.getPerson().getDeath() > 0){ scenarioInfoOnTime.getPerson().setInjured(scenarioInfoOnTime.getPerson().getTotal() - scenarioInfoOnTime.getPerson().getInjured()-scenarioInfoOnTime.getPerson().getDeath()); updScenarioInfo.getJbxx().getPerson().setInjured(scenarioInfoOnTime.getPerson().getTotal() - scenarioInfoOnTime.getPerson().getInjured()-scenarioInfoOnTime.getPerson().getDeath()); } } if(scenarioInfoOnTime.getAmmunition().getCurrent() - Double.valueOf(ammunitionConsume)>0) { scenarioInfoOnTime.getAmmunition().setCurrent(Double.valueOf(ammunition - ammunitionConsume)); }else{ scenarioInfoOnTime.getAmmunition().setCurrent(0D); } if(scenarioInfoOnTime.getFood().getCurrent() -Double.valueOf(foodConsume)> 0) { scenarioInfoOnTime.getFood().setCurrent(Double.valueOf(food - foodConsume)); }else{ scenarioInfoOnTime.getFood().setCurrent(0D); } if(scenarioInfoOnTime.getMedical().getCurrent() -Double.valueOf(medicalConsume)> 0) { scenarioInfoOnTime.getMedical().setCurrent(Double.valueOf(medical - medicalConsume)); }else{ scenarioInfoOnTime.getMedical().setCurrent(0D); } if(scenarioInfoOnTime.getWater().getCurrent() - Double.valueOf(waterConsume)> 0) { scenarioInfoOnTime.getWater().setCurrent(Double.valueOf(water - waterConsume)); }else{ scenarioInfoOnTime.getWater().setCurrent(0D); } if(updScenarioInfo.getJbxx().getAmmunition().getCurrent() - Double.valueOf(ammunitionConsume)>0) { updScenarioInfo.getJbxx().getAmmunition().setCurrent(Double.valueOf(ammunition - ammunitionConsume)); }else{ updScenarioInfo.getJbxx().getAmmunition().setCurrent(0D); } if(updScenarioInfo.getJbxx().getFood().getCurrent() - Double.valueOf(foodConsume) > 0) { updScenarioInfo.getJbxx().getFood().setCurrent(Double.valueOf(food - foodConsume)); }else{ updScenarioInfo.getJbxx().getFood().setCurrent(0D); } // updScenarioInfo.getJbxx().getFuel().setCurrent(Double.valueOf(fuel - fuelConsume)); if(updScenarioInfo.getJbxx().getMedical().getCurrent() - Double.valueOf(medicalConsume)> 0) { updScenarioInfo.getJbxx().getMedical().setCurrent(Double.valueOf(medical - medicalConsume)); }else{ updScenarioInfo.getJbxx().getMedical().setCurrent(0D); } if(updScenarioInfo.getJbxx().getWater().getCurrent() -Double.valueOf(waterConsume)> 0) { updScenarioInfo.getJbxx().getWater().setCurrent(Double.valueOf(water - waterConsume)); }else{ updScenarioInfo.getJbxx().getWater().setCurrent(0D); } redisUtil.hset(scenarioTask.getScenarioId() + "-" + roomId + "-" + scenarioTask.getResourceId(), "updScenarioInfo", JSON.toJSONString(updScenarioInfo)); ResponseCmdInfo respObj = new ResponseCmdInfo<>(); respObj.setData(JSON.toJSONString(updScenarioInfo)); respObj.setRoom(roomId); respObj.setScenarioId(scenarioTask.getScenarioId()); respObj.setCmdType("updScenarioInfo"); Global.sendCmdInfoQueue.add(respObj); redisUtil.hset(scenarioTask.getScenarioId() + "-" + roomId + "-" + scenarioTask.getResourceId(), "duringTime", String.valueOf(duringTime)); redisUtil.hset(scenarioTask.getScenarioId() + "-" + roomId + "-" + scenarioTask.getResourceId(), "scenarioInfo", JSONObject.toJSONString(scenarioInfoOnTime)); if(scenarioInfoOnTime.getAmmunition().getCurrent() <0) { scenarioInfoOnTime.getAmmunition().setCurrent(0D); } if(scenarioInfoOnTime.getFood().getCurrent()<0) { scenarioInfoOnTime.getAmmunition().setCurrent(0D); } if(scenarioInfoOnTime.getMedical().getCurrent()<0) { scenarioInfoOnTime.getAmmunition().setCurrent(0D); } if(scenarioInfoOnTime.getWater().getCurrent()<0) { scenarioInfoOnTime.getAmmunition().setCurrent(0D); } redisUtil.hset(scenarioTask.getScenarioId() + "-" + roomId + "-" + scenarioTask.getResourceId(), "scenarioInfo", JSONObject.toJSONString(scenarioInfoOnTime)); }catch (Exception ex){ ex.printStackTrace(); log.error("==============================设置消耗信息失败=============================================",ex.getMessage()); } try { if(scenarioInfoOnTime.getPerson().getCurrent() >0) { //推送消耗數據 String battleConsumeStr = ""; ResponseCmdInfo sendConsumeMsg = new ResponseCmdInfo<>(); LocalDateTime currentDateTime = new Date().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime(); battleConsumeStr += currentDateTime.toString() + " 战斗消耗 ["; battleConsumeStr += "死亡人数:" + deathConsume; battleConsumeStr += "受伤人数:" + injuredConsume; battleConsumeStr += "弹药消耗:" + ammunitionConsume; battleConsumeStr += "食品消耗:" + foodConsume; battleConsumeStr += "用水消耗:" + waterConsume; battleConsumeStr += "药材消耗:" + medicalConsume + "]"; jsonObject.put("teamLat",teamLat); jsonObject.put("teamLng",teamLng); jsonObject.put("resourceId", scenarioTask.getResourceId()); jsonObject.put("消耗时间", currentDateTime); jsonObject.put("日志类型", "战斗消耗"); sendConsumeMsg.setData(battleConsumeStr); sendConsumeMsg.setRoom(roomId); sendConsumeMsg.setScenarioId(scenarioTask.getScenarioId()); sendConsumeMsg.setCmdType("battleConsume"); Global.sendCmdInfoQueue.add(sendConsumeMsg); BattleConsume battleConsume = new BattleConsume(); battleConsume.setLat(teamLat); battleConsume.setLng(teamLng); battleConsume.setId(IdUtils.simpleUUID()); battleConsume.setAmmunition(ammunitionConsume); if(deathConsume == 0L){ battleConsume.setDeath(0); }else { battleConsume.setDeath(Integer.valueOf(Double.valueOf(deathConsume).intValue())); } battleConsume.setInjured(Integer.valueOf(Double.valueOf(injuredConsume).intValue())); battleConsume.setFood(foodConsume); // battleConsume.setFuel(fuelConsume); battleConsume.setMedical(medicalConsume); battleConsume.setWater(waterConsume); battleConsume.setResourceId(scenarioTask.getResourceId()); battleConsume.setConsumeDate(currentDateTime); battleConsumeService.save(battleConsume); if (injuredConsume > 2 && !isAlreadyProduceTask.get()) { //产生一个 } } }catch (Exception ex){ ex.printStackTrace(); log.error("==================推送消耗數據 失败============================================",ex.getMessage()); } try { if(scenarioInfoOnTime.getPerson().getCurrent() >0) { LocalDateTime currentDateTime = new Date().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime(); String death = SpringUtil.getBean(Environment.class).getProperty("death.warn"); String injured = SpringUtil.getBean(Environment.class).getProperty("injured.warn"); String ammunition = SpringUtil.getBean(Environment.class).getProperty("ammunition.warn"); log.info("===========person ammunition==={}===={}====={}========", death, injured, ammunition); Double restAmmunition = Double.valueOf(scenarioInfoOnTime.getAmmunition().getCurrent()); // StatisticBean battleResourceStat = statisticService.statistic(scenarioTask.getResourceId()); Double ammunitionConsumeRate = restAmmunition / scenarioInfoOnTime.getAmmunition().getTotal() * 100; if (Double.valueOf(ammunitionConsumeRate) <= Double.valueOf(ammunition) && suppleFlagMap.get("ammunition") == false) { SupplierRequest supplierRequest = new SupplierRequest(); supplierRequest.setId(IdUtils.simpleUUID()); supplierRequest.setFromResourceId(scenarioTask.getResourceId()); supplierRequest.setSupplierNum(String.valueOf(suppleAmount)); supplierRequest.setSupplierType("ammunition"); supplierRequest.setGeneralTime(currentDateTime); supplierRequest.setLat(jsonObject.get("teamLat").toString()); supplierRequest.setLng(jsonObject.get("teamLng").toString()); supplierRequestService.save(supplierRequest); ResponseCmdInfo respObj = new ResponseCmdInfo<>(); respObj.setData(JSON.toJSONString(supplierRequest)); respObj.setRoom(roomId); respObj.setScenarioId(scenarioTask.getScenarioId()); respObj.setCmdType("ammunitionRequest"); Global.sendCmdInfoQueue.add(respObj); suppleFlagMap.put("ammunition", true); } Long restDeath = Long.valueOf(scenarioInfo.getPerson().getDeath()); Long deathConsumeRate = 0L; if (scenarioInfo.getPerson().getTotal() != 0) { deathConsumeRate = restDeath * 100 / scenarioInfoOnTime.getPerson().getTotal(); } if (deathConsumeRate >= Long.valueOf(death) && suppleFlagMap.get("death") == false) { SupplierRequest supplierRequest = new SupplierRequest(); supplierRequest.setId(IdUtils.simpleUUID()); supplierRequest.setFromResourceId(scenarioTask.getResourceId()); supplierRequest.setSupplierNum(String.valueOf(scenarioInfoOnTime.getPerson().getTotal())); supplierRequest.setSupplierType("death"); supplierRequest.setGeneralTime(currentDateTime); supplierRequest.setLat(jsonObject.get("teamLat").toString()); supplierRequest.setLng(jsonObject.get("teamLng").toString()); supplierRequestService.save(supplierRequest); ResponseCmdInfo respObj = new ResponseCmdInfo<>(); respObj.setData(JSON.toJSONString(supplierRequest)); respObj.setRoom(roomId); respObj.setScenarioId(scenarioTask.getScenarioId()); respObj.setCmdType("deathRequest"); Global.sendCmdInfoQueue.add(respObj); log.info("================================begin death Supplier Task====================================="); produceTask(scenarioInfoOnTime.getPerson().getDeath()); String jsonInjured = (String)redisUtil.hget(scenarioTask.getScenarioId() + "-" + roomId + "-" + scenarioTask.getResourceId(),"scenarioInfo"); ScenarioInfo scenarioInfoInjured =JSONObject.parseObject(jsonInjured,ScenarioInfo.class); scenarioInfoInjured.getPerson().setDeath(Long.valueOf(0).intValue()); redisUtil.hset(scenarioTask.getScenarioId() + "-" + roomId + "-" + scenarioTask.getResourceId(), "scenarioInfo", JSONObject.toJSONString(scenarioInfoInjured)); updJsonStr = (String) redisUtil.hget(scenarioTask.getScenarioId() + "-" + roomId + "-" + scenarioTask.getResourceId(), "updScenarioInfo"); updScenarioInfo = JSON.parseObject(updJsonStr, EditScenarioInfo.class); updScenarioInfo.getJbxx().getPerson().setDeath(Long.valueOf(0).intValue()); redisUtil.hset(scenarioTask.getScenarioId() + "-" + roomId + "-" + scenarioTask.getResourceId(), "updScenarioInfo", JSON.toJSONString(updScenarioInfo)); log.info("================================end death Supplier Task====================================="); suppleFlagMap.put("death", true); } Long restInjured = Long.valueOf(scenarioInfoOnTime.getPerson().getInjured()); Long injuredConsumeRate = restInjured * 100 / scenarioInfoOnTime.getPerson().getTotal(); if (Long.valueOf(injuredConsumeRate) <= Long.valueOf(injured) && suppleFlagMap.get("injured") == false) { SupplierRequest supplierRequest = new SupplierRequest(); supplierRequest.setId(IdUtils.simpleUUID()); supplierRequest.setFromResourceId(scenarioTask.getResourceId()); supplierRequest.setSupplierNum(String.valueOf(scenarioInfoOnTime.getPerson().getTotal())); supplierRequest.setSupplierType("injured"); supplierRequest.setGeneralTime(currentDateTime); supplierRequest.setLat(jsonObject.get("teamLat").toString()); supplierRequest.setLng(jsonObject.get("teamLng").toString()); supplierRequestService.save(supplierRequest); ResponseCmdInfo respObj = new ResponseCmdInfo<>(); respObj.setData(JSON.toJSONString(supplierRequest)); respObj.setRoom(roomId); respObj.setScenarioId(scenarioTask.getScenarioId()); respObj.setCmdType("injuredRequest"); Global.sendCmdInfoQueue.add(respObj); log.info("================================begin injured Supplier Task====================================="); produceTask(scenarioInfoOnTime.getPerson().getInjured()); String jsonInjured = (String)redisUtil.hget(scenarioTask.getScenarioId() + "-" + roomId + "-" + scenarioTask.getResourceId(),"scenarioInfo"); ScenarioInfo scenarioInfoInjured =JSONObject.parseObject(jsonInjured,ScenarioInfo.class); scenarioInfoInjured.getPerson().setInjured(Long.valueOf(0).intValue()); redisUtil.hset(scenarioTask.getScenarioId() + "-" + roomId + "-" + scenarioTask.getResourceId(), "scenarioInfo", JSONObject.toJSONString(scenarioInfoInjured)); updJsonStr = (String) redisUtil.hget(scenarioTask.getScenarioId() + "-" + roomId + "-" + scenarioTask.getResourceId(), "updScenarioInfo"); updScenarioInfo = JSON.parseObject(updJsonStr, EditScenarioInfo.class); updScenarioInfo.getJbxx().getPerson().setInjured(Long.valueOf(0).intValue()); redisUtil.hset(scenarioTask.getScenarioId() + "-" + roomId + "-" + scenarioTask.getResourceId(), "updScenarioInfo", JSON.toJSONString(updScenarioInfo)); log.info("================================end injured Supplier Task====================================="); suppleFlagMap.put("injured", true); } } }catch (Exception ex){ ex.printStackTrace(); log.error("===========BattleRootTask supplierRequestService.saveBatch error====================",ex.getMessage()); } log.info("===============================战斗检查统计各种资源消耗量 end===================================="); } }); } } private void produceTask(Integer injured) { try { Map teamInfoMap = SpringUtil.getBean(TeaminfoServiceImpl.class) .teamInfoMap(); log.info("{}-产生自动保障任务", this.scenarioTask.getResourceId()); List resourceList = SpringUtil.getBean(BattleSupplierServiceImpl.class) .selectSupplierResource(scenarioTask.getResourceId()); log.info("{}-可选保障分队长度{}", scenarioTask.getResourceId(), resourceList.size()); if (!resourceList.isEmpty()) { ScenarioResource supplierResource = null; // 找出油料保障分队 for (ScenarioResource resource : resourceList) { Teaminfo teaminfo = teamInfoMap.get(resource.getResourceId()); if ("HOSPITAL".equals(teaminfo.getRoleCode())) { supplierResource = resource; break; } } if (supplierResource == null) { log.error("找不到对应的医院分队"); return; } //找出医院 List resources = SpringUtil.getBean(ScenarioResourceServiceImpl.class) .selectResourceByRoleCode(scenarioTask.getScenarioId(), "HOSPITAL"); if (resources.isEmpty()) { log.error("找不到医院仓库"); return; } produceMoveTask(supplierResource, resources.get(0), this.coordinateReference.get(), injured); } else { log.error("{}-没有保障分队可以选择", scenarioTask.getResourceId()); } } catch (Exception e) { log.error("produceTask exception", e); } } private void produceMoveTask(ScenarioResource supplierResource, ScenarioResource fuelResource, Coordinate coordinate, Integer injured) { 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"); log.info("承担保障任务的resourceId::{}", supplierResource.getId()); 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("3"); task.setInsureResourceId(scenarioTask.getResourceId()); task.setSupplierNum(injured); 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); } }