package com.hivekion.room.bean; import cn.hutool.core.collection.CollectionUtil; 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.scenario.entity.ScenarioTask; 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 lombok.extern.slf4j.Slf4j; import org.springframework.core.env.Environment; import org.springframework.util.CollectionUtils; 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 StatisticService statisticService = null; private RedisUtil redisUtil = null; private ISupplierRequestService supplierRequestService; private static final Integer DEATH_SPREED = 3; private static final Integer INJURED_SPREED = 3; private static final Double AMMUNITION_SPREED = 2.6D; private static final Double FOOD_SPREED = 2.3D; private static final Double WATER_SPREED = 3.6D; private static final Double FUEL_SPREED = 3.6D; private static final Double MEDICAL_SPREED = 1.6D; public BattleRootTask(ScenarioTask scenarioTask,String roomId) { super(scenarioTask,roomId); } private void initBean(){ if(statisticService == null) { statisticService = SpringUtil.getBean(StatisticService.class); } if(redisUtil == null) { redisUtil = SpringUtil.getBean(RedisUtil.class); } if(supplierRequestService == null){ supplierRequestService = SpringUtil.getBean(ISupplierRequestService.class); } } //执行一次 @Override public void doSomeThing() { log.info("===============begin BattleRootTask=========={}==========",this.getRoomStatus()); this.initBean(); if(this.getRoomStatus()) { long initDuringTime = this.getDuringTime(); StatisticBean statisticBean = null; try { statisticBean = statisticService.statistic(scenarioTask.getResourceId()); }catch (Exception ex){ ex.printStackTrace(); } HashMap battleParams = new HashMap<>(); // statisticBean.getAmmunition().getCurrent() //初始化本次战斗任务各种资源数 battleParams.put("ammunition",Double.valueOf(statisticBean.getAmmunition().getCurrent()).toString()); battleParams.put("food",Double.valueOf(statisticBean.getFood().getCurrent()).toString()); battleParams.put("fuel",Double.valueOf(statisticBean.getFuel().getCurrent()).toString()); battleParams.put("medical",Double.valueOf(statisticBean.getMedical().getCurrent()).toString()); battleParams.put("water",Double.valueOf(statisticBean.getWater().getCurrent()).toString()); battleParams.put("death",Double.valueOf(statisticBean.getPerson().getDeath()).toString()); battleParams.put("injured",Double.valueOf(statisticBean.getPerson().getInjured()).toString()); battleParams.put("teamLat",statisticBean.getTeam().getLat().toString()); battleParams.put("teamLng",statisticBean.getTeam().getLng().toString()); battleParams.put("duringTime",Long.valueOf(initDuringTime).toString()); redisUtil.hset(scenarioTask.getScenarioId() + "-" + roomId + "-" + scenarioTask.getResourceId(),battleParams); log.info("===============================初始化本次战斗任务各种资源数===================================="); double suppleAmount =statisticBean.getAmmunition().getTotal(); int suppleDeath =statisticBean.getPerson().getDeath(); int suppleInjured =statisticBean.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(); try { HashMap battleParams = (HashMap) redisUtil.hget(scenarioTask.getScenarioId() + "-" + roomId + "-" + scenarioTask.getResourceId()); long duringTime = getDuringTime(); long lastDuringTime = Long.valueOf(battleParams.get("duringTime").toString()); long intervalDuringTime = duringTime - lastDuringTime; double ammunition = Double.valueOf(battleParams.get("ammunition").toString()); double food = Double.valueOf(battleParams.get("food").toString()); double fuel = Double.valueOf(battleParams.get("fuel").toString()); double medical = Double.valueOf(battleParams.get("medical").toString()); double water = Double.valueOf(battleParams.get("water").toString()); long death = Long.valueOf(battleParams.get("death").toString()); long injured = Long.valueOf(battleParams.get("injured").toString()); teamLat = battleParams.get( "teamLat").toString(); teamLng = battleParams.get( "teamLng").toString(); // deathConsume = DEATH_SPREED * intervalDuringTime; injuredConsume = INJURED_SPREED * intervalDuringTime; ammunitionConsume = intervalDuringTime * AMMUNITION_SPREED; foodConsume = intervalDuringTime * FOOD_SPREED; waterConsume = intervalDuringTime * WATER_SPREED; fuelConsume = intervalDuringTime * FUEL_SPREED; medicalConsume = intervalDuringTime * MEDICAL_SPREED; battleParams.put("ammunition",Double.valueOf(ammunition - ammunitionConsume).toString()); battleParams.put("food",Double.valueOf(food - foodConsume).toString()); battleParams.put("fuel",Double.valueOf(fuel - fuelConsume).toString()); battleParams.put("medical",Double.valueOf(medical - medicalConsume).toString()); battleParams.put("water",Double.valueOf(water - waterConsume).toString()); battleParams.put("death",Long.valueOf(death - deathConsume).toString()); battleParams.put("injured",Long.valueOf(injured - injuredConsume).toString()); battleParams.put("duringTime",Long.valueOf(duringTime).toString()); redisUtil.hset(scenarioTask.getScenarioId() + "-" + roomId + "-" + scenarioTask.getResourceId(), battleParams); }catch (Exception ex){ log.error("==============================设置消耗信息失败=============================================",ex.getMessage()); } try { //推送消耗數據 ResponseCmdInfo sendConsumeMsg = new ResponseCmdInfo<>(); jsonObject.put("deathConsume", deathConsume); jsonObject.put("injuredConsume", injuredConsume); jsonObject.put("ammunitionConsume", ammunitionConsume); jsonObject.put("foodConsume", foodConsume); jsonObject.put("waterConsume", waterConsume); jsonObject.put("fuelConsume", fuelConsume); jsonObject.put("medicalConsume", medicalConsume); jsonObject.put("teamLat",teamLat); jsonObject.put("teamLng",teamLng); sendConsumeMsg.setData(jsonObject); Global.sendCmdInfoQueue.add(sendConsumeMsg); }catch (Exception ex){ log.error("==================推送消耗數據 失败============================================",ex.getMessage()); } try { LocalDateTime currentDateTime = new Date().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime(); String death = SpringUtil.getBean(Environment.class).getProperty("battle.death.warn"); String injured = SpringUtil.getBean(Environment.class).getProperty("battle.injured.warn"); String ammunition = SpringUtil.getBean(Environment.class).getProperty("battle.ammunition.warn"); log.info("===========person ammunition==={}===={}====={}========",death,injured,ammunition); // String food = SpringUtil.getBean(Environment.class).getProperty("battle.food.warn"); // String water = SpringUtil.getBean(Environment.class).getProperty("battle.water.warn"); // String fuel = SpringUtil.getBean(Environment.class).getProperty("battle.fuel.warn"); // String medical = SpringUtil.getBean(Environment.class).getProperty("battle.medical.warn"); if(Double.valueOf(battleParams.get("ammunition").toString()) <= 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); suppleFlagMap.put("ammunition",true) ; } if(Long.valueOf(battleParams.get("death").toString()) <= Long.valueOf(death) && suppleFlagMap.get("death") == false){ SupplierRequest supplierRequest = new SupplierRequest(); supplierRequest.setId(IdUtils.simpleUUID()); supplierRequest.setFromResourceId(scenarioTask.getResourceId()); supplierRequest.setSupplierNum(String.valueOf(suppleDeath)); supplierRequest.setSupplierType("death"); supplierRequest.setGeneralTime(currentDateTime); supplierRequest.setLat(jsonObject.get("teamLat").toString()); supplierRequest.setLng(jsonObject.get("teamLng").toString()); supplierRequestService.save(supplierRequest); suppleFlagMap.put("death",true) ; } if(Long.valueOf(battleParams.get("injured").toString()) <= Long.valueOf(injured) && suppleFlagMap.get("injured") == false){ SupplierRequest supplierRequest = new SupplierRequest(); supplierRequest.setId(IdUtils.simpleUUID()); supplierRequest.setFromResourceId(scenarioTask.getResourceId()); supplierRequest.setSupplierNum(String.valueOf(suppleInjured)); supplierRequest.setSupplierType("injured"); supplierRequest.setGeneralTime(currentDateTime); supplierRequest.setLat(jsonObject.get("teamLat").toString()); supplierRequest.setLng(jsonObject.get("teamLng").toString()); supplierRequestService.save(supplierRequest); suppleFlagMap.put("injured",true) ; } }catch (Exception ex){ ex.printStackTrace(); log.error("===========BattleRootTask supplierRequestService.saveBatch error====================",ex.getMessage()); } log.info("===============================定时检查统计各种资源消耗量 end===================================="); } }); } } }