package com.hivekion.room.bean; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.extra.spring.SpringUtil; import com.alibaba.fastjson2.JSONObject; import com.hivekion.Global; import com.hivekion.common.entity.ResponseCmdInfo; import com.hivekion.common.redis.RedisUtil; 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.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 Double TEAM_SPREED = 1.2D; private static final Integer PERSON_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"); } if(redisUtil == null) { redisUtil = SpringUtil.getBean("redisUtil"); } if(supplierRequestService == null){ supplierRequestService = SpringUtil.getBean("supplierRequestService"); } } //执行一次 @Override public void doSomeThing() { this.initBean(); if(this.getRoomStatus()) { long initduringTime = this.getDuringTime(); StatisticBean statisticBean = statisticService.statistic(scenarioTask.getResourceId()); // statisticBean.getAmmunition().getCurrent() //初始化本次战斗任务各种资源数 redisUtil.hset(scenarioTask.getScenarioId()+"-"+roomId+"-"+scenarioTask.getResourceId(),"ammunition",statisticBean.getAmmunition().getCurrent()); redisUtil.hset(scenarioTask.getScenarioId()+"-"+roomId+"-"+scenarioTask.getResourceId(),"food",statisticBean.getFood().getCurrent()); redisUtil.hset(scenarioTask.getScenarioId()+"-"+roomId+"-"+scenarioTask.getResourceId(),"fuel",statisticBean.getFuel().getCurrent()); redisUtil.hset(scenarioTask.getScenarioId()+"-"+roomId+"-"+scenarioTask.getResourceId(),"medical",statisticBean.getMedical().getCurrent()); redisUtil.hset(scenarioTask.getScenarioId()+"-"+roomId+"-"+scenarioTask.getResourceId(),"water",statisticBean.getWater().getCurrent()); redisUtil.hset(scenarioTask.getScenarioId()+"-"+roomId+"-"+scenarioTask.getResourceId(),"person",statisticBean.getPerson().getCurrent()); redisUtil.hset(scenarioTask.getScenarioId()+"-"+roomId+"-"+scenarioTask.getResourceId(),"team",statisticBean.getPerson().getCurrent()); redisUtil.hset(scenarioTask.getScenarioId()+"-"+roomId+"-"+scenarioTask.getResourceId(),"duringTime",initduringTime); log.info("===============================初始化本次战斗任务各种资源数===================================="); //定时检查统计各种资源消耗量 ScheduledExecutorService schedule = Executors.newScheduledThreadPool( 1); schedule.scheduleWithFixedDelay(() -> { log.info("===============================定时检查统计各种资源消耗量 begin===================================="); Double teamConsume = null; Long personConsume = null; Double ammunitionConsume = null; Double foodConsume = null; Double waterConsume = null; Double fuelConsume = null; Double medicalConsume = null; JSONObject jsonObject = new JSONObject(); try { long duringTime = getDuringTime(); long lastDuringTime = (long) redisUtil.hget(scenarioTask.getScenarioId() + "-" + roomId + "-" + scenarioTask.getResourceId(), "duringTime"); long intervalDuringTime = duringTime - lastDuringTime; double ammunition = (double) redisUtil.hget(scenarioTask.getScenarioId() + "-" + roomId + "-" + scenarioTask.getResourceId(), "ammunition"); double food = (double) redisUtil.hget(scenarioTask.getScenarioId() + "-" + roomId + "-" + scenarioTask.getResourceId(), "food"); double fuel = (double) redisUtil.hget(scenarioTask.getScenarioId() + "-" + roomId + "-" + scenarioTask.getResourceId(), "fuel"); double medical = (double) redisUtil.hget(scenarioTask.getScenarioId() + "-" + roomId + "-" + scenarioTask.getResourceId(), "medical"); double water = (double) redisUtil.hget(scenarioTask.getScenarioId() + "-" + roomId + "-" + scenarioTask.getResourceId(), "water"); int person = (int) redisUtil.hget(scenarioTask.getScenarioId() + "-" + roomId + "-" + scenarioTask.getResourceId(), "person"); double team = (double) redisUtil.hget(scenarioTask.getScenarioId() + "-" + roomId + "-" + scenarioTask.getResourceId(), "team"); // teamConsume = intervalDuringTime * TEAM_SPREED; personConsume = intervalDuringTime * PERSON_SPREED; ammunitionConsume = intervalDuringTime * AMMUNITION_SPREED; foodConsume = intervalDuringTime * FOOD_SPREED; waterConsume = intervalDuringTime * WATER_SPREED; fuelConsume = intervalDuringTime * FUEL_SPREED; medicalConsume = intervalDuringTime * MEDICAL_SPREED; redisUtil.hset(scenarioTask.getScenarioId() + "-" + roomId + "-" + scenarioTask.getResourceId(), "ammunition", ammunition - ammunitionConsume); redisUtil.hset(scenarioTask.getScenarioId() + "-" + roomId + "-" + scenarioTask.getResourceId(), "food", food - foodConsume); redisUtil.hset(scenarioTask.getScenarioId() + "-" + roomId + "-" + scenarioTask.getResourceId(), "fuel", fuel - fuelConsume); redisUtil.hset(scenarioTask.getScenarioId() + "-" + roomId + "-" + scenarioTask.getResourceId(), "medical", medical - medicalConsume); redisUtil.hset(scenarioTask.getScenarioId() + "-" + roomId + "-" + scenarioTask.getResourceId(), "water", water - waterConsume); redisUtil.hset(scenarioTask.getScenarioId() + "-" + roomId + "-" + scenarioTask.getResourceId(), "person", person - personConsume); redisUtil.hset(scenarioTask.getScenarioId() + "-" + roomId + "-" + scenarioTask.getResourceId(), "team", team - teamConsume); redisUtil.hset(scenarioTask.getScenarioId() + "-" + roomId + "-" + scenarioTask.getResourceId(), "duringTime", duringTime); }catch (Exception ex){ log.error("==============================设置消耗信息失败=============================================",ex.getMessage()); } try { //推送消耗數據 ResponseCmdInfo sendConsumeMsg = new ResponseCmdInfo<>(); jsonObject.put("teamConsume", teamConsume); jsonObject.put("personConsume", personConsume); jsonObject.put("ammunitionConsume", ammunitionConsume); jsonObject.put("foodConsume", foodConsume); jsonObject.put("waterConsume", waterConsume); jsonObject.put("fuelConsume", fuelConsume); jsonObject.put("medicalConsume", medicalConsume); sendConsumeMsg.setData(jsonObject); Global.sendCmdInfoQueue.add(sendConsumeMsg); }catch (Exception ex){ log.error("==================推送消耗數據 失败============================================",ex.getMessage()); } try { LocalDateTime currentDateTime = new Date().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime(); List requestList = new ArrayList<>(); Set> consumeSet = jsonObject.entrySet(); for (Map.Entry consumeEntry : consumeSet) { SupplierRequest supplierRequest = new SupplierRequest(); supplierRequest.setFromResourceId(scenarioTask.getResourceId()); supplierRequest.setSupplierNum((Double) consumeEntry.getValue()); supplierRequest.setSupplierType(consumeEntry.getKey()); supplierRequest.setGeneralTime(currentDateTime); requestList.add(supplierRequest); } supplierRequestService.saveBatch(requestList); }catch (Exception ex){ log.error("===========BattleRootTask supplierRequestService.saveBatch error====================",ex.getMessage()); } log.info("===============================定时检查统计各种资源消耗量 end===================================="); }, 0, 10, TimeUnit.SECONDS); //房间统一管理定时器;房间关闭后,定时器销毁 addScheduledExecutorServiceRefenceToRoom(schedule); } } }