130 lines
5.1 KiB
Java
130 lines
5.1 KiB
Java
|
|
package com.zhgd.xmgl.task;
|
|||
|
|
|
|||
|
|
import cn.hutool.core.collection.CollUtil;
|
|||
|
|
import com.alibaba.fastjson.JSONObject;
|
|||
|
|
import com.zhgd.xmgl.modules.doublecarbon.entity.PhotovoltaicPowerCurrentData;
|
|||
|
|
import com.zhgd.xmgl.modules.doublecarbon.entity.PhotovoltaicPowerDev;
|
|||
|
|
import com.zhgd.xmgl.modules.doublecarbon.entity.dto.Oauth2TokenDTO;
|
|||
|
|
import com.zhgd.xmgl.modules.doublecarbon.service.PhotovoltaicPowerCurrentDataService;
|
|||
|
|
import com.zhgd.xmgl.modules.doublecarbon.service.PhotovoltaicPowerDevService;
|
|||
|
|
import com.zhgd.xmgl.util.Base64;
|
|||
|
|
import lombok.extern.slf4j.Slf4j;
|
|||
|
|
import net.javacrumbs.shedlock.core.SchedulerLock;
|
|||
|
|
import org.springframework.beans.factory.annotation.Value;
|
|||
|
|
import org.springframework.http.*;
|
|||
|
|
import org.springframework.scheduling.annotation.Scheduled;
|
|||
|
|
import org.springframework.stereotype.Component;
|
|||
|
|
import org.springframework.web.client.RestTemplate;
|
|||
|
|
|
|||
|
|
import javax.annotation.Resource;
|
|||
|
|
import java.nio.charset.StandardCharsets;
|
|||
|
|
import java.util.Date;
|
|||
|
|
import java.util.LinkedList;
|
|||
|
|
import java.util.List;
|
|||
|
|
import java.util.Map;
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @author 邱平毅
|
|||
|
|
* @ClassName PhotovoltaicPowerTask
|
|||
|
|
* @date 2023/1/3
|
|||
|
|
* @Version 1.0
|
|||
|
|
*/
|
|||
|
|
@Slf4j
|
|||
|
|
@Component
|
|||
|
|
public class PhotovoltaicPowerTask {
|
|||
|
|
|
|||
|
|
private final String token;
|
|||
|
|
|
|||
|
|
PhotovoltaicPowerTask(@Value("${koyoe.clientId}") String clientId, @Value("${koyoe.secret}") String secret) {
|
|||
|
|
this.token = Base64.encodeBase64((clientId + ":" + secret).getBytes(StandardCharsets.UTF_8));
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
@Value("${koyoe.get-token}")
|
|||
|
|
private String getToken;
|
|||
|
|
|
|||
|
|
@Value("${koyoe.nowData}")
|
|||
|
|
private String nowDataUrl;
|
|||
|
|
|
|||
|
|
private Oauth2TokenDTO oauth2TokenDTO;
|
|||
|
|
|
|||
|
|
@Resource
|
|||
|
|
private PhotovoltaicPowerDevService photovoltaicPowerDevService;
|
|||
|
|
|
|||
|
|
@Resource
|
|||
|
|
private PhotovoltaicPowerCurrentDataService photovoltaicPowerCurrentDataService;
|
|||
|
|
|
|||
|
|
@Resource
|
|||
|
|
private RestTemplate restTemplate;
|
|||
|
|
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 接收第三方厂家数据,获取最新光伏发电设备发电量
|
|||
|
|
*/
|
|||
|
|
@SchedulerLock(name = "photovoltaicPowerNowData", lockAtMostFor = 1000 * 60 * 5, lockAtLeastFor = 1000 * 60 * 3)
|
|||
|
|
@Scheduled(cron = "0 0/5 * * * ?")
|
|||
|
|
public void nowData() {
|
|||
|
|
// 光伏发电设备列表
|
|||
|
|
List<PhotovoltaicPowerDev> photovoltaicPowerDevList = photovoltaicPowerDevService.list();
|
|||
|
|
if (photovoltaicPowerDevList == null) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
// token刷新
|
|||
|
|
if (oauth2TokenDTO == null || oauth2TokenDTO.getExpiresDate().before(new Date())) {
|
|||
|
|
setOauth2Token();
|
|||
|
|
}
|
|||
|
|
// 设备id对应总发电量
|
|||
|
|
Map<Long, Float> devIdSumMap = photovoltaicPowerCurrentDataService.devSumGeneratingCapacity();
|
|||
|
|
|
|||
|
|
List<PhotovoltaicPowerCurrentData> dataList = new LinkedList<>();
|
|||
|
|
photovoltaicPowerDevList.forEach(dev -> {
|
|||
|
|
// 循环查询光伏发电设备的最后一条数据
|
|||
|
|
HttpHeaders requestHeaders = new HttpHeaders();
|
|||
|
|
requestHeaders.setBearerAuth(oauth2TokenDTO.getAccessToken());
|
|||
|
|
HttpEntity requestEntity = new HttpEntity<>(requestHeaders);
|
|||
|
|
ResponseEntity<JSONObject> responseEntity;
|
|||
|
|
try {
|
|||
|
|
responseEntity =
|
|||
|
|
restTemplate.exchange(String.format(nowDataUrl, dev.getDevSn()), HttpMethod.GET, requestEntity, JSONObject.class);
|
|||
|
|
} catch (Exception e) {
|
|||
|
|
e.printStackTrace();
|
|||
|
|
log.error(e.toString());
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
JSONObject body = responseEntity.getBody();
|
|||
|
|
// 判断请求接口是否正确
|
|||
|
|
if (responseEntity.getStatusCodeValue() != HttpStatus.OK.value() || body == null) {
|
|||
|
|
log.error("光伏发电,查找最新一条数据异常!设备sn为:{},响应体为:{}", dev.getDevSn(), responseEntity);
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
// 最后一条数据
|
|||
|
|
JSONObject nowData = body.getJSONObject("nowData");
|
|||
|
|
if (nowData != null) {
|
|||
|
|
Float sum = nowData.getFloat("pvTotalOutputPwer");
|
|||
|
|
// 避免恶意数据导致发电值为负值
|
|||
|
|
Long devId = dev.getId();
|
|||
|
|
float generatingCapacity = sum - devIdSumMap.getOrDefault(devId, 0F);
|
|||
|
|
if (generatingCapacity > 0) {
|
|||
|
|
dataList.add(new PhotovoltaicPowerCurrentData(devId, generatingCapacity));
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
if (CollUtil.isNotEmpty(dataList)) {
|
|||
|
|
photovoltaicPowerCurrentDataService.saveBatch(dataList);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void setOauth2Token() {
|
|||
|
|
HttpHeaders requestHeaders = new HttpHeaders();
|
|||
|
|
requestHeaders.set("Authorization", "Basic " + token);
|
|||
|
|
HttpEntity<String> httpEntity = new HttpEntity<>(requestHeaders);
|
|||
|
|
JSONObject jsonObject = restTemplate.postForObject(getToken, httpEntity, JSONObject.class);
|
|||
|
|
if (jsonObject != null) {
|
|||
|
|
oauth2TokenDTO = new Oauth2TokenDTO(jsonObject.getString("access_token"), jsonObject.getString("scope"),
|
|||
|
|
jsonObject.getString("token_type")).setExpiresIn(jsonObject.getInteger("expires_in"));
|
|||
|
|
} else {
|
|||
|
|
throw new RuntimeException("setOauth2Token#getToken返回体为空!");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|