zss
9 天以前 9019989ca243161b8bb058668dc31d66c54b544f
#榆林市工业和信息化局数据推送
已添加5个文件
已修改2个文件
293 ■■■■■ 文件已修改
ruoyi-admin/pom.xml 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/core/api/Api.java 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/core/api/ScheduledApi.java 133 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/core/api/dto/DataRequest.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/core/api/dto/ElectricityDto.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/core/api/dto/LoggingDto.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/resources/application-jlmy.yml 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/pom.xml
@@ -119,6 +119,13 @@
            <artifactId>okhttp</artifactId>
        </dependency>
        <!-- Hutool æ ¸å¿ƒå·¥å…·åŒ…(包含http模块,无需单独引入http子包) -->
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.3.7</version>
        </dependency>
    </dependencies>
    <build>
ruoyi-admin/src/main/java/com/ruoyi/web/core/api/Api.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,59 @@
package com.ruoyi.web.core.api;
import cn.hutool.http.HttpRequest;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.Map;
@Data
@Slf4j
@Component
//榆林市工业和信息化局数据推送
public class Api {
    @Value("${api.ip}")
    private String ip;
    @Value("${api.appid}")
    private String appid;
    @Value("${api.secret}")
    private String secret;
    //获取token
    public String getToken(){
        try {
            Map<String, Object> map = new HashMap<>();
            map.put("appid", appid);
            map.put("secret", secret);
            map.put("grantType", "client_credential");
            String result = HttpRequest.get(ip + "/oauth2/client/v1/accessToken")
                    .contentType("none")
                    .form(map).execute().body();
            JSONObject jsonObject = JSONObject.parseObject(result);
            return jsonObject.getString("accessToken");
        } catch (Exception e) {
            throw new RuntimeException("token获取异常");
        }
    }
    //推送数据
    public String pushData(String urlApi,Object data){
        String url = ip + urlApi;
        Map<String, String> heads = new HashMap<>();
        heads.put("Content-Type", "application/json;charset=UTF-8");
        heads.put("authorization", "Bearer " + getToken());
        String body = HttpRequest.post(url)
                .headerMap(heads, false)
                .body(JSONUtil.toJsonStr(data)).execute().body();
        return JSON.parseObject(body).get("code").toString();
    }
}
ruoyi-admin/src/main/java/com/ruoyi/web/core/api/ScheduledApi.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,133 @@
package com.ruoyi.web.core.api;
import cn.hutool.json.JSONUtil;
import com.ruoyi.system.domain.SysLogininfor;
import com.ruoyi.system.service.ISysLogininforService;
import com.ruoyi.web.core.api.dto.DataRequest;
import com.ruoyi.web.core.api.dto.ElectricityDto;
import com.ruoyi.web.core.api.dto.LoggingDto;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
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;
    @Autowired
    private Api api;
    @Autowired
    private ISysLogininforService logininforService;
    private static final Random RANDOM = new Random();
    //推送登录日志每周
//    @Scheduled(cron = "0 0 1 ? * 1")
    public void logging(){
        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<String, Object> map = new HashMap<>();
        //获取每个小时中生成的新数据
        map.put("beginTime",LocalDateTime.now().minusDays(7L).format(formatter));
        map.put("endTime",LocalDateTime.now().format(formatter));
        logininfor.setParams(map);
        List<SysLogininfor> list = logininforService.selectLogininforList(logininfor);
        List<LoggingDto> 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<LoggingDto> 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(){
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:dd");
        //获取登录日志
        List<ElectricityDto> 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<ElectricityDto> 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);
    }
}
ruoyi-admin/src/main/java/com/ruoyi/web/core/api/dto/DataRequest.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,21 @@
package com.ruoyi.web.core.api.dto;
import lombok.Data;
import java.util.List;
/**
 * æŽ¥å£å…¥å‚包装类(严格匹配接口要求的外层结构)
 */
@Data
public class DataRequest<T>{
    // æŽ¥å£è¦æ±‚的核心键:data,值为日志列表
    private List<T> data;
    // ä¾¿æ·æž„造方法:直接传入列表生成包装对象,简化调用
    public DataRequest(List<T> data) {
        this.data = data;
    }
}
ruoyi-admin/src/main/java/com/ruoyi/web/core/api/dto/ElectricityDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,38 @@
package com.ruoyi.web.core.api.dto;
import lombok.Data;
@Data
//推送电能耗的传参
public class ElectricityDto {
    //企业名称
    private String entName;
    //统一社会信用代码
    private String socialCreditCode;
    //唯一标识
    private String uuid;
    //总耗电量(千瓦时)
    private String totalPowerConsumption;
    //生产设备耗电量(千瓦时)
    private String productionPowerConsumption;
    //办公设备耗电量(千瓦时)
    private String officePowerConsumption;
    //峰段耗电量(千瓦时)
    private String peakPowerConsumption;
    //平段耗电量(千瓦时)
    private String flatPowerConsumption;
    //谷段耗电量(千瓦时)
    private String valleyPowerConsumption;
    //电力损耗量(千瓦时)
    private String powerLossQty;
    //单位产值耗电量(千瓦时/万元)
    private String powerPerOutput;
    //电费支出(元)
    private String electricityCost;
    //数据时间
    private String time;
    //推送时间
    private String pushtime;
}
ruoyi-admin/src/main/java/com/ruoyi/web/core/api/dto/LoggingDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,24 @@
package com.ruoyi.web.core.api.dto;
import lombok.Data;
@Data
//推送登录日志传参
public class LoggingDto {
    //企业名称
    private String entName;
    //统一社会信用代码
    private String socialCreditCode;
    //唯一标识
    private String uuid;
    //登录人员
    private String user_id;
    //登录时间
    private String login_time;
    //系统名称
    private String sysName;
    //推送时间
    private String pushtime;
}
ruoyi-admin/src/main/resources/application-jlmy.yml
@@ -129,3 +129,14 @@
file:
  temp-dir: D:/Backup/桌面/download/temp/uploads
  upload-dir: D:/Backup/桌面/download/prod/uploads
#榆林市工业和信息化局数据推送
api:
    ip: http://111.20.184.155:8888 #推送ip地址
    appid: 48b97e28e0aad7963e96fc50b9e63908 #企业应用id
    secret: 0db7a9fa112427df622c4207b4707432 #企业应用秘钥
    entName: ç¥žæœ¨å¸‚聚力煤业有限公司 #企业名称
    socialCreditCode: 91610821305529570Q #统一社会信用代码
    dayPowerConsumption: 1200 #日均用电量
    outputValuesBase: 2200 #单位产值基数(万元)
    electricityCost: 1200 #月电费