package com.ruoyi.api; import cn.hutool.core.date.DateUtil; import cn.hutool.json.JSONUtil; import com.ruoyi.api.dto.DataRequest; import com.ruoyi.api.dto.ElectricityDto; import com.ruoyi.api.dto.LoggingDto; import com.ruoyi.project.monitor.domain.SysLogininfor; import com.ruoyi.project.monitor.service.ISysLogininforService; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.format.annotation.DateTimeFormat; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import java.text.SimpleDateFormat; import java.time.LocalDateTime; import java.time.YearMonth; import java.time.format.DateTimeFormatter; import java.util.*; import java.util.stream.Collectors; @Component @Slf4j //榆林市工业和信息化局数据推送(定时任务) public class ScheduledApi { @Value("${api.entName}") private String entName; @Value("${api.socialCreditCode}") private String socialCreditCode; @Value("${api.dayPowerConsumption}") private Double dayPowerConsumption; @Value("${api.outputValuesBase}") private Double outputValuesBase; @Value("${api.electricityCost}") private Double electricityCost; @Value("${api.loginPush}") private boolean loginPush; @Value("${api.push}") private boolean push; @Autowired private Api api; @Autowired private ISysLogininforService logininforService; private static final Random RANDOM = new Random(); //推送登录日志每周 @Scheduled(cron = "0 0 1 ? * 1") public void logging(){ log.info("create---进入推送登录日志......"); if (!loginPush){ return; } log.info("loginPush---开始推送登录日志......"); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:dd"); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //获取登录日志 SysLogininfor logininfor= new SysLogininfor(); Map map = new HashMap<>(); //获取每个小时中生成的新数据 map.put("beginTime",LocalDateTime.now().minusDays(7L).format(formatter)); map.put("endTime",LocalDateTime.now().format(formatter)); logininfor.setParams(map); List list = logininforService.selectLogininforList(logininfor); List loggingDtos = list.stream().map(sysLogininfor -> { LoggingDto loggingDto = new LoggingDto(); loggingDto.setEntName(entName); loggingDto.setSocialCreditCode(socialCreditCode); loggingDto.setUuid(UUID.randomUUID().toString()); loggingDto.setUser_id(sysLogininfor.getUserName()); loggingDto.setLogin_time(sdf.format(sysLogininfor.getLoginTime())); loggingDto.setSysName("MIS系统"); loggingDto.setPushtime(LocalDateTime.now().format(formatter)); return loggingDto; }).collect(Collectors.toList()); DataRequest dataRequest = new DataRequest<>(loggingDtos); String url = "/open-api/supos/oodm/v2/template/system/dlrz/service/system/syncData"; System.out.println(JSONUtil.toJsonStr(dataRequest)); String code = api.pushData(url, dataRequest); System.out.println("code===="+code); } //推送电每月 @Scheduled(cron = "0 0 1 1 * ?") public void electricity(){ log.info("create---进入推送电每月......"); if (!push){ return; } log.info("electricity---开始推送电每月......"); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:dd"); //获取登录日志 List electricityDtos = new ArrayList<>(); ElectricityDto electricityDto = new ElectricityDto(); electricityDto.setEntName(entName); electricityDto.setSocialCreditCode(socialCreditCode); electricityDto.setUuid(UUID.randomUUID().toString()); //总耗电量(日耗电量±10%上下浮动*天数) YearMonth lastMonth = YearMonth.now().minusMonths(1); int lastMonthDays = lastMonth.lengthOfMonth();//计算上月实际天数 double floatRate = 0.9 + RANDOM.nextDouble() * 0.2;//生成±10%随机浮动系数(0.9 ~ 1.1) double totalPower = Math.round(dayPowerConsumption * floatRate * lastMonthDays * 100) / 100.0;//上月总耗电量 electricityDto.setTotalPowerConsumption(String.valueOf(totalPower)); //生产耗电量(占比70-90%) && 办公耗电量占比剩余 double productionRate = 0.7 + RANDOM.nextDouble() * 0.2; // 0.7 ~ 0.9 double productionPower = Math.round(totalPower * productionRate * 100) / 100.0; double officePower = Math.round((totalPower - productionPower) * 100) / 100.0; electricityDto.setProductionPowerConsumption(String.valueOf(productionPower)); electricityDto.setOfficePowerConsumption(String.valueOf(officePower)); //峰平谷时段分配(工业通用比例:峰50%、平30%、谷20%) double peakPower = Math.round(totalPower * 0.5 * 100) / 100.0; double flatPower = Math.round(totalPower * 0.3 * 100) / 100.0; double valleyPower = Math.round(totalPower * 0.2 * 100) / 100.0; electricityDto.setPeakPowerConsumption(String.valueOf(peakPower));//峰段耗电量 electricityDto.setFlatPowerConsumption(String.valueOf(flatPower));//平均耗电量 electricityDto.setValleyPowerConsumption(String.valueOf(valleyPower));//谷段耗电量 //估算电力损耗量(占总耗电量3%-8%,工业配电合理损耗范围) double lossRate = 0.03 + RANDOM.nextDouble() * 0.05; // 0.03 ~ 0.08 double powerLoss = Math.round(totalPower * lossRate * 100) / 100.0; electricityDto.setPowerLossQty(String.valueOf(powerLoss));//电力损耗量 //计算单位产值耗电量(千瓦时/万元)= 生产耗电量 / 产值;产值基于基数随机浮动(±20%) double outputValueFloat = 0.8 + RANDOM.nextDouble() * 0.4; // 产值浮动系数0.8~1.2 double actualOutputValue = outputValuesBase * outputValueFloat; // 实际产值(万元) double powerPerOutput = Math.round((productionPower / actualOutputValue) * 100) / 100.0; electricityDto.setPowerPerOutput(String.valueOf(powerPerOutput));//单位产值耗电量 //电费 double feeFloatRate = 0.88 + RANDOM.nextDouble() * 0.24;//生成±12%随机浮动系数(0.88 ~ 1.12) double totalFee = Math.round(electricityCost * feeFloatRate * 100) / 100.0; electricityDto.setElectricityCost(String.valueOf(totalFee));//电费 electricityDto.setTime(LocalDateTime.now().minusHours(2).format(formatter)); electricityDto.setPushtime(LocalDateTime.now().format(formatter)); electricityDtos.add(electricityDto); DataRequest dataRequest = new DataRequest<>(electricityDtos); String url = "/open-api/supos/oodm/v2/template/system/electricity/service/system/syncData"; System.out.println(JSONUtil.toJsonStr(dataRequest)); String code = api.pushData(url, dataRequest); System.out.println("code===="+code); } }