123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172 |
- 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<TwinCalc2hr> 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<TwinDevice> list = deviceService.selectTwinDeviceList(new TwinDevice());
- List<Future<Map<String, 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<Map<String, List<?>>> future : futureList) {
- Map<String, List<?>> map = future.get();
- List<TwinCalc2hr> calc2hrs = (List<TwinCalc2hr>) 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;
- }
- }
|