package com.ruoyi.biz.service.impl; import com.ruoyi.biz.domain.TwinCalc2hr; import com.ruoyi.biz.domain.TwinDevice; import com.ruoyi.biz.mapper.TwinCalc2hrMapper; import com.ruoyi.biz.service.ITwinCalc2hrService; import com.ruoyi.biz.service.ITwinDeviceService; import com.ruoyi.common.core.text.Convert; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; import java.time.ZoneOffset; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Map; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; /** * 2小时统计数据Service业务层处理 * * @author ruoyi * @date 2024-05-12 */ @Service public class TwinCalc2hrServiceImpl implements ITwinCalc2hrService { @Resource private TwinCalc2hrMapper twinCalc2hrMapper; @Resource private ITwinDeviceService deviceService; @Resource private IotTokenServiceImpl iotTokenService; @Resource private AsyncServiceImpl asyncService; /** * 查询2小时统计数据 * * @param id 2小时统计数据主键 * @return 2小时统计数据 */ @Override public TwinCalc2hr selectTwinCalc2hrById(Long id) { return twinCalc2hrMapper.selectTwinCalc2hrById(id); } /** * 查询2小时统计数据列表 * * @param twinCalc2hr 2小时统计数据 * @return 2小时统计数据 */ @Override public List selectTwinCalc2hrList(TwinCalc2hr twinCalc2hr) { return twinCalc2hrMapper.selectTwinCalc2hrList(twinCalc2hr); } /** * 新增2小时统计数据 * * @param twinCalc2hr 2小时统计数据 * @return 结果 */ @Override public int insertTwinCalc2hr(TwinCalc2hr twinCalc2hr) { return twinCalc2hrMapper.insertTwinCalc2hr(twinCalc2hr); } /** * 修改2小时统计数据 * * @param twinCalc2hr 2小时统计数据 * @return 结果 */ @Override public int updateTwinCalc2hr(TwinCalc2hr twinCalc2hr) { return twinCalc2hrMapper.updateTwinCalc2hr(twinCalc2hr); } /** * 批量删除2小时统计数据 * * @param ids 需要删除的2小时统计数据主键 * @return 结果 */ @Override public int deleteTwinCalc2hrByIds(String ids) { return twinCalc2hrMapper.deleteTwinCalc2hrByIds(Convert.toStrArray(ids)); } /** * 删除2小时统计数据信息 * * @param id 2小时统计数据主键 * @return 结果 */ @Override public int deleteTwinCalc2hrById(Long id) { return twinCalc2hrMapper.deleteTwinCalc2hrById(id); } /** * 获取上一个时段 * * @return 时段 1-12 */ @Override public Long lastPeriod() { return twinCalc2hrMapper.lastPeriod(); } /** * 计算当天的统计数据 * * @return 统计数据 */ @Override public TwinCalc2hr calcToday() { TwinCalc2hr calc2hr = twinCalc2hrMapper.calcToday(); TwinCalc2hr curr2hr = calcCurr(); calc2hr.calc(curr2hr); return calc2hr; } /** * 统计上一个偶数时间至当前的数据 */ private TwinCalc2hr calcCurr() { TwinCalc2hr result = new TwinCalc2hr(); //获取上一个时段 Long lastPeriod = lastPeriod(); LocalDateTime start = LocalDateTime.of(LocalDate.now(), LocalTime.MIN); if (lastPeriod != 12L) { //如果为12,则代表是前一天的,那就从今天0点开始 start = start.plusHours(2 * lastPeriod); } start = start.minusSeconds(1); //获取时段范围 时间 1=0-2点 2=2-4 LocalDateTime end = LocalDateTime.now(); Long startTime = start.toInstant(ZoneOffset.of("+8")).toEpochMilli(); Long endTime = end.toInstant(ZoneOffset.of("+8")).toEpochMilli(); //为了避免多线程同时获取token导致重复执行,先执行一次获取token iotTokenService.getToken(); List list = deviceService.selectTwinDeviceList(new TwinDevice()); List>>> futureList = new ArrayList<>(); for (int i = 0; i < list.size(); i++) { TwinDevice twinDevice = list.get(i); futureList.add(asyncService.process(twinDevice, new Date(), startTime, endTime, 0)); } try { for (Future>> future : futureList) { Map> map = future.get(); List calc2hrs = (List) map.get("calc"); for (TwinCalc2hr calc2hr : calc2hrs) { result.calc(calc2hr); } } } catch (InterruptedException e) { throw new RuntimeException(e); } catch (ExecutionException e) { throw new RuntimeException(e); } return result; } }