Commit 4bd7ccf7 authored by yangyang's avatar yangyang

对接 碳银电站接口

parent d6cbfbe9
package com.yeejoin.amos.api.householdapi.Utils;
import cn.hutool.http.HttpResponse;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.github.pagehelper.PageInfo;
import com.yeejoin.amos.api.householdapi.constant.TanYinConstant;
import com.yeejoin.amos.api.householdapi.exception.BusinessException;
import com.yeejoin.amos.api.householdapi.face.dto.TanYinAccessTokenDTO;
import com.yeejoin.amos.api.householdapi.face.dto.TanYinBaseResultDTO;
import com.yeejoin.amos.api.householdapi.face.dto.TanYinPageResultDTO;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;
/**
* 碳银接口类
*
* <p>
* ProjectName: amos-boot-zx-biz
* PackageName: com.yeejoin.amos.api.householdapi.Utils
*
* @author yangyang
* @version v1.0
* @date 2024/7/15 10:25
*/
@Slf4j
@Component
public class TanYinApiUtils {
@Value ("${tanYin.api.apiUrl:}")
private String apiUrl;
@Value ("${tanYin.api.clientSecret:}")
private String clientSecret;
@Value ("${tanYin.api.clientKey:}")
private String clientKey;
@Resource (type = RedisUtils.class)
private RedisUtils redisUtils;
/**
* 获取 accessToken 接口
*
* @param clientKey 用户 ID
* @param clientSecret 用户 Secret
* @return {@link String}
* @throws
* @author yangyang
* @date 2024/7/15 14:00
*/
private String getAccessToken(String clientKey, String clientSecret) {
String accessToken = (String) redisUtils.get(TanYinConstant.ACCESS_TOKEN_KEY);
if (StringUtils.isNotEmpty(accessToken)) {
return accessToken;
}
String url = apiUrl + TanYinConstant.getAccessTokenUrl + String.format("?clientSecret=%s&grantType=client_credentials&clientKey=%s", clientSecret, clientKey);
HttpResponse response = HttpUtil.createGet(url).execute();
TanYinAccessTokenDTO accessTokenDTO = parseResponse("获取 accessToken 接口", response, TanYinAccessTokenDTO.class);
putAccessTokenInCache(accessTokenDTO);
return accessTokenDTO.getAccessToken();
}
/**
* 刷新 accessToken 接口
*
* @param clientKey 用户 ID
* @param clientSecret 用户 Secret
* @return {@link String}
* @throws
* @author yangyang
* @date 2024/7/15 13:59
*/
private String refreshAccessToken(String clientKey, String clientSecret) {
String url = apiUrl + TanYinConstant.refreshAccessTokenUrl + String.format("?clientSecret=%s&grantType=client_credentials&clientKey=%s", clientSecret, clientKey);
HttpResponse response = HttpUtil.createGet(url).execute();
TanYinAccessTokenDTO accessTokenDTO = parseResponse("刷新 accessToken 接口", response, TanYinAccessTokenDTO.class);
putAccessTokenInCache(accessTokenDTO);
return accessTokenDTO.getAccessToken();
}
private void putAccessTokenInCache(TanYinAccessTokenDTO accessTokenDTO) {
redisUtils.set(TanYinConstant.ACCESS_TOKEN_KEY, accessTokenDTO.getAccessToken(), accessTokenDTO.getAccessTokenExpiresIn() != null && accessTokenDTO.getAccessTokenExpiresIn() > 2 ? accessTokenDTO.getAccessTokenExpiresIn() - 1 : 1);
}
/**
* 使用GET方法向指定URL发送请求,并解析返回的数据。
*
* @param desc 对请求的描述,用于日志记录。
* @param url 请求的URL地址。
* @param resultClass 返回结果的类型,用于解析响应体。
* @param <T> 请求结果的类型参数。
* @param <R> 返回类型参数,与resultClass相同。
* @return 解析后的返回结果,如果请求失败或URL为空,则返回null。
*/
public <T, R> R get(String desc, String url, Class<T> resultClass) {
// 检查URL是否为空,如果为空则直接返回null。
if (StringUtils.isBlank(url)) {
return null;
}
// 记录请求开始的日志信息。
log.debug("请求 => 碳银{}接口,url:{}", desc, url);
Map<String, String> headers = new HashMap<>();
HttpResponse response;
try {
// 添加Authorization头,使用Bearer令牌模式。
headers.put("Authorization", "Bearer " + getAccessToken(clientKey, clientSecret));
// 发送GET请求并获取响应。
response = HttpUtil.createGet(url).execute();
// 解析响应并返回结果。
return parseResponse(desc, response, resultClass);
} catch (BusinessException businessException) {
// 在业务异常发生时,尝试刷新令牌并重新发送请求。
// 刷新 Access_token
headers.put("Authorization", "Bearer " + refreshAccessToken(clientKey, clientSecret));
response = HttpUtil.createGet(url).execute();
return parseResponse(desc, response, resultClass);
} catch (Exception e) {
// 记录未预期异常的日志信息。
log.warn(String.format("异常 => 碳银%s接口", desc), e);
return null;
}
}
/**
* 使用POST方法向指定URL发送带参数和头部信息的请求,并解析返回的结果。
*
* @param desc 请求描述,用于日志记录。
* @param url 请求的URL地址。
* @param params 请求的参数,以Map形式提供。
* @param headers 请求的头部信息,以Map形式提供。
* @param resultClass 返回结果的类类型,用于解析响应。
* @param <T> 请求参数的泛型类型。
* @param <R> 响应结果的泛型类型。
* @return 解析后的响应结果,如果请求失败或解析异常,可能返回null。
*/
public <T, R> R post(String desc, String url, Map<String, Object> params, Map<String, String> headers, Class<T> resultClass) {
// 检查URL是否为空,如果为空直接返回null。
if (StringUtils.isBlank(url)) {
return null;
}
// 将参数转换为JSON字符串。
String paramsJsonStr = JSON.toJSONString(params);
// 初始化headers,默认添加Authorization头。
if (headers == null) {
headers = new HashMap<>();
}
headers.put("Authorization", "Bearer " + getAccessToken(clientKey, clientSecret));
// 记录请求日志。
log.debug("请求 => 碳银{}接口,url:{},参数:{},headers:{}", desc, url, paramsJsonStr, JSON.toJSONString(headers));
HttpResponse response;
try {
// 发送POST请求,带上参数和headers,并执行。
response = HttpUtil.createPost(url).body(paramsJsonStr, MediaType.APPLICATION_JSON_UTF8_VALUE).headerMap(headers, true).execute();
// 解析响应并返回。
return parseResponse(desc, response, resultClass);
} catch (BusinessException businessException) {
// 在业务异常情况下,尝试刷新令牌并重试请求。
// 刷新 Access_token
headers.put("Authorization", "Bearer " + refreshAccessToken(clientKey, clientSecret));
response = HttpUtil.createPost(url).body(paramsJsonStr, MediaType.APPLICATION_JSON_UTF8_VALUE).headerMap(headers, true).execute();
// 解析刷新令牌后的响应并返回。
return parseResponse(desc, response, resultClass);
} catch (Exception e) {
// 记录未预期的异常日志。
log.warn(String.format("异常 => 碳银%s接口,参数: %s", desc, paramsJsonStr), e);
return null;
}
}
/**
* 使用POST方法发送带分页信息的网络请求。
*
* @param desc 请求描述,用于日志记录。
* @param url 请求的URL地址。
* @param paramsJsonStr 请求参数的JSON字符串形式。
* @param headers 请求的头部信息,可以为null。如果为null,则会添加默认的Authorization头。
* @param resultClass 结果对象的类类型,用于解析响应。
* @param <T> 结果对象的泛型类型。
* @return 返回包含分页信息和请求结果的PageInfo对象,如果请求URL为空,则返回null。
*/
public <T> PageInfo<T> postPage(String desc, String url, String paramsJsonStr, Map<String, String> headers, Class<T> resultClass) {
// 检查URL是否为空,如果为空直接返回null
if (StringUtils.isBlank(url)) {
return null;
}
// 初始化headers,默认添加Authorization头。
if (headers == null) {
headers = new HashMap<>();
}
// 添加Authorization头,使用Bearer令牌模式
headers.put("Authorization", "Bearer " + getAccessToken(clientKey, clientSecret));
// 记录请求日志
log.info("请求 => 碳银{}接口,url:{},参数:{},headers:{}", desc, url, paramsJsonStr, JSON.toJSONString(headers));
HttpResponse response;
try {
// 发送POST请求,设置请求体和请求头
response = HttpUtil.createPost(url).body(paramsJsonStr, MediaType.APPLICATION_JSON_UTF8_VALUE).headerMap(headers, true).execute();
// 记录响应日志
log.info("响应 => 碳银{}接口,参数:{},httpCode:{}, response:{}", desc, paramsJsonStr, response.getStatus(), response.body());
// 解析响应,返回分页信息和请求结果
return parsePageResponse(desc, response, resultClass);
} catch (BusinessException businessException) {
// 在业务异常情况下,尝试刷新令牌并重试请求。
// 刷新 Access_token
headers.put("Authorization", "Bearer " + refreshAccessToken(clientKey, clientSecret));
// 重新发送请求并解析响应
response = HttpUtil.createPost(url).body(paramsJsonStr, MediaType.APPLICATION_JSON_UTF8_VALUE).headerMap(headers, true).execute();
return parsePageResponse(desc, response, resultClass);
} catch (Exception e) {
// 记录异常日志
log.warn(String.format("异常 => 碳银%s接口,参数: %s", desc, paramsJsonStr), e);
return null;
}
}
/**
* 解析响应数据。
* <p>
* 该方法用于处理来自碳银接口的响应,解析响应体并根据预期的结果类型返回相应的数据。
* 如果响应不成功或数据解析失败,将返回null或抛出异常。
*
* @param desc 接口描述,用于日志记录。
* @param response HTTP响应对象,包含响应状态码和响应体。
* @param resultClass 预期结果的类类型,用于解析响应体并转换为相应的Java对象。
* @param <T> 泛型参数,表示响应数据的类型。
* @param <R> 泛型参数,表示返回数据的类型。
* @return 解析后的结果对象,如果响应失败或数据无法解析,则返回null。
*/
@SuppressWarnings ("unchecked")
public <T, R> R parseResponse(String desc, HttpResponse response, Class<T> resultClass) {
// 记录响应日志,包括接口描述、HTTP状态码和响应体。
log.debug("响应 => 碳银{}接口,httpCode:{}, response:{}", desc, response.getStatus(), response.body());
// 检查响应是否成功,如果不成功则直接返回null。
if (!response.isOk()) {
return null;
}
// 解析响应体为TanYinBaseResultDTO对象,用于检查响应的通用状态。
TanYinBaseResultDTO baseResult = JSONObject.parseObject(response.body(), TanYinBaseResultDTO.class);
// 检查响应是否成功并存在有效数据,如果不成功且错误码为401,则抛出业务异常;其他情况返回null。
if (!baseResult.getSuccess() || Objects.isNull(baseResult.getData())) {
if ("401".equals(baseResult.getCode())) {
// Token 过期
throw new BusinessException(baseResult.getCode().toString(), baseResult.getMsg());
}
return null;
}
// 解析响应数据部分,根据其类型进行相应的处理和转换。
JSON result = (JSON) baseResult.getData();
if (result instanceof Map) {
// 如果结果是Map类型,则将其转换为指定的Java对象。
return (R) JSON.parseObject(result.toJSONString()).toJavaObject(resultClass);
}
if (result instanceof List) {
// 如果结果是List类型,则将其转换为指定的Java列表。
return (R) JSON.parseArray(result.toJSONString()).toJavaList(resultClass);
}
// 如果结果类型既不是Map也不是List,则返回null。
return null;
}
/**
* 解析分页响应数据。
* 该方法用于将请求的响应数据解析为特定类型的分页信息对象,方便后续处理和使用。
*
* @param desc 请求描述,用于日志记录,便于问题追踪。
* @param response HTTP响应对象,包含请求的返回状态码和响应体。
* @param resultClass 结果对象的类类型,用于将JSON字符串转换为对应类型的对象。
* @param <T> 泛型参数,表示结果对象的类型。
* @return 返回解析后的分页信息对象,如果响应不成功或数据为空,则返回null。
*/
public <T> PageInfo<T> parsePageResponse(String desc, HttpResponse response, Class<T> resultClass) {
// 记录请求的响应信息到日志,包括描述、HTTP状态码和响应体。
log.info("响应 => 碳银{}接口,httpCode:{}, response:{}", desc, response.getStatus(), response.body());
// 将响应体解析为TanYinBaseResultDTO对象,其中包含分页数据。
TanYinBaseResultDTO<JSONObject> listResult = JSONObject.parseObject(response.body(), TanYinBaseResultDTO.class);
// 检查响应是否成功且数据不为空,如果不满足则直接返回null。
if (!response.isOk() || Objects.isNull(listResult.getData())) {
return null;
}
if ("401".equals(listResult.getCode())) {
// Token 过期
throw new BusinessException(listResult.getCode().toString(), listResult.getMsg());
}
// 初始化PageInfo对象,用于存放解析后的分页数据。
PageInfo<T> pageInfo = new PageInfo<>();
// 从解析结果中获取具体的分页数据对象。
TanYinPageResultDTO tanYinPageResultDTO = JSONObject.parseObject(listResult.getData().toJSONString(), TanYinPageResultDTO.class);
// 将分页数据中的列表数据转换为指定类型的集合。
List<T> newList = (List<T>) tanYinPageResultDTO.getList().parallelStream().map(json -> JSON.toJavaObject((JSON) json, resultClass)).collect(Collectors.toList());
// 将转换后的集合设置到PageInfo对象中。
pageInfo.setList(newList);
// 设置分页信息,包括总页数、每页大小、当前页码和总记录数。
pageInfo.setPages(tanYinPageResultDTO.getTotalPage() == null ? 0 : tanYinPageResultDTO.getTotalPage());
pageInfo.setPageSize(tanYinPageResultDTO.getPageSize() == null ? 0 : tanYinPageResultDTO.getPageSize());
pageInfo.setPageNum(tanYinPageResultDTO.getPageNo() == null ? 0 : tanYinPageResultDTO.getPageNo());
pageInfo.setTotal(tanYinPageResultDTO.getTotal() == null ? 0 : tanYinPageResultDTO.getTotal());
// 返回解析后的分页信息对象。
return pageInfo;
}
}
package com.yeejoin.amos.api.householdapi.constant;
/**
* 碳银常量类
* <p>
* ProjectName: amos-boot-zx-biz
* PackageName: com.yeejoin.amos.api.householdapi.constant
*
* @author yangyang
* @version v1.0
* @date 2024/7/15 10:22
*/
public class TanYinConstant {
public static String ACCESS_TOKEN_KEY = "TanYin_Token";
/**
* 获取电站信息
*/
public static String stationListUrl = "/v1/yx/query/station/info";
/**
* 获取客户信息
*/
public static String customerInfoUrl = "/v1/yx/query/customer/info";
/**
* 电站逆变器信息接口
*/
public static String inverterListUrl = "/v1/station/getTodayDetail";
/**
* 获取 Access_Token
*/
public static String getAccessTokenUrl = "/v1/auth/getAccessToken";
/**
* 刷新 Access_Token
*/
public static String refreshAccessTokenUrl = "/v1/auth/refreshAccessToken";
}
...@@ -277,6 +277,6 @@ public class HouseholdTestController { ...@@ -277,6 +277,6 @@ public class HouseholdTestController {
@PostMapping(value = "/tanyin/customer") @PostMapping(value = "/tanyin/customer")
@ApiOperation(httpMethod = "POST", value = "客户信息查询接口", notes = "客户信息查询接口") @ApiOperation(httpMethod = "POST", value = "客户信息查询接口", notes = "客户信息查询接口")
public void tanyinCustomer() { public void tanyinCustomer() {
tanYinDataAcquisitionService.customerList(); tanYinDataAcquisitionService.customerInfoList();
} }
} }
package com.yeejoin.amos.api.householdapi.exception;
import org.apache.commons.lang3.StringUtils;
import org.typroject.tyboot.core.foundation.exception.BaseException;
/**
* 自定义异常
*
* @author yangyang
* @version v1.0
* @date 2023/9/19 12:37
*/
public class BusinessException extends BaseException {
public BusinessException(String message) {
super(message, BusinessException.class.getSimpleName(), "错误的请求.");
this.httpStatus = 500;
}
public BusinessException(String message, String errorCode) {
super(message, BusinessException.class.getSimpleName(), message);
if (StringUtils.isBlank(errorCode)) {
this.httpStatus = 500;
} else {
this.httpStatus = Integer.parseInt(errorCode);
}
}
}
package com.yeejoin.amos.api.householdapi.face.dto;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 碳银Access_Token类
* <p>
* ProjectName: amos-boot-zx-biz
* PackageName: com.yeejoin.amos.api.householdapi.face.dto
*
* @author yangyang
* @version v1.0
* @date 2024/7/16 14:08
*/
@NoArgsConstructor
@Data
public class TanYinAccessTokenDTO {
@ApiModelProperty ("业务请求 token")
@JsonProperty ("access_token")
private String accessToken;
@ApiModelProperty ("有效时间")
@JsonProperty ("expires_in")
private Integer accessTokenExpiresIn;
}
package com.yeejoin.amos.api.householdapi.face.dto;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 碳银接口返回类
* <p>
* ProjectName: amos-boot-zx-biz
* PackageName: com.yeejoin.amos.api.householdapi.face.dto
*
* @author yangyang
* @version v1.0
* @date 2024/7/15 14:03
*/
@NoArgsConstructor
@Data
public class TanYinBaseResultDTO<T> {
@JsonProperty ("code")
private Integer code;
@JsonProperty ("data")
private T data;
@JsonProperty ("msg")
private String msg;
@JsonProperty ("deskey")
private Object deskey;
@JsonProperty ("success")
private Boolean success;
@JsonProperty ("fail")
private Boolean fail;
}
package com.yeejoin.amos.api.householdapi.face.dto;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* 碳银分页请求类
* <p>
* ProjectName: amos-boot-zx-biz
* PackageName: com.yeejoin.amos.api.householdapi.face.dto
*
* @author yangyang
* @version v1.0
* @date 2024/7/16 14:09
*/
@NoArgsConstructor
@Data
public class TanYinPageResultDTO<T> {
@JsonProperty ("pageNo")
private Integer pageNo;
@JsonProperty ("pageSize")
private Integer pageSize;
@JsonProperty ("totalPage")
private Integer totalPage;
@JsonProperty ("total")
private Integer total;
@JsonProperty ("list")
private List<T> list;
@JsonProperty ("start")
private Integer start;
}
package com.yeejoin.amos.api.householdapi.face.orm.houseapi.entity.tdeingine;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 客户信息
* <p>
* ProjectName: amos-boot-zx-biz
* PackageName: com.yeejoin.amos.api.householdapi.face.orm.houseapi.entity.tdeingine
*
* @author yangyang
* @version v1.0
* @date 2024/7/15 16:11
*/
@NoArgsConstructor
@Data
@TableName (value = "tanyin_customer_info", autoResultMap = true)
public class TanYinCustomerInfo {
@ApiModelProperty ("客户身份证号码")
@TableField ("customer_id_no")
private String customerIdNo;
@ApiModelProperty ("客户姓名")
@TableField ("customer_name")
private String customerName;
@ApiModelProperty ("客户手机号")
@TableField ("customer_phone")
private String customerPhone;
@ApiModelProperty ("客户并网通过时间 毫秒时间戳")
@TableField ("electric_contract_pass")
private Long electricContractPass;
@ApiModelProperty ("项目编号")
@TableField ("project_no")
private String projectNo;
@TableField("create_time")
private Long createTime;
}
package com.yeejoin.amos.api.householdapi.face.orm.houseapi.entity.tdeingine;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 逆变器实时数据
* <p>
* ProjectName: amos-boot-zx-biz
* PackageName: com.yeejoin.amos.api.householdapi.face.orm.houseapi.entity.tdeingine
*
* @author yangyang
* @version v1.0
* @date 2024/7/15 16:10
*/
@NoArgsConstructor
@Data
@TableName (value = "tanyin_inveter_info", autoResultMap = true)
public class TanYinInveterInfo {
@TableField ("project_no")
private String projectNo;
@TableField ("device_name")
private String deviceName;
@TableField ("sn")
private String sn;
@TableField ("supplier")
private Integer supplier;
@ApiModelProperty ("更新时间")
@TableField ("gmt_create")
private String gmtCreate;
@ApiModelProperty ("功率")
@TableField ("watt")
private String watt;
@ApiModelProperty ("日发电量")
@TableField ("daily_energy")
private String dailyEnergy;
@ApiModelProperty ("总发电量")
@TableField ("total_energy")
private String totalEnergy;
@ApiModelProperty ("逆变器在线状态:在线;1、离线;2、异常")
@TableField ("status")
private String status;
@ApiModelProperty ("故障原因")
@TableField ("error_detail")
private String errorDetail;
@ApiModelProperty ("故障码")
@TableField ("error_code")
private String errorCode;
@ApiModelProperty ("输入电压 1")
@TableField ("vol0")
private String vol0;
@ApiModelProperty ("输入电压 2")
@TableField ("vol1")
private String vol1;
@ApiModelProperty ("输入电压 3")
@TableField ("vol2")
private String vol2;
@ApiModelProperty ("输入电压 4")
@TableField ("vol3")
private String vol3;
@ApiModelProperty ("输入电压 5")
@TableField ("vol4")
private String vol4;
@ApiModelProperty ("输入电压 6")
@TableField ("vol10")
private String vol10;
@ApiModelProperty ("输入电流 1")
@TableField ("amp0")
private String amp0;
@ApiModelProperty ("输入电流 2")
@TableField ("amp1")
private String amp1;
@ApiModelProperty ("输入电流 3")
@TableField ("amp2")
private String amp2;
@ApiModelProperty ("输入电流 4")
@TableField ("amp3")
private String amp3;
@ApiModelProperty ("输入电流 5")
@TableField ("amp4")
private String amp4;
@ApiModelProperty ("输入电流 6")
@TableField ("amp10")
private String amp10;
@ApiModelProperty ("输出电压 1")
@TableField ("vol5")
private String vol5;
@ApiModelProperty ("输出电压 2")
@TableField ("vol6")
private String vol6;
@ApiModelProperty ("输出电压 3")
@TableField ("vol7")
private String vol7;
@ApiModelProperty ("输出电流 1")
@TableField ("amp5")
private String amp5;
@ApiModelProperty ("输出电流 2")
@TableField ("amp6")
private String amp6;
@ApiModelProperty ("输出电流 3")
@TableField ("amp7")
private String amp7;
@ApiModelProperty ("温度(单位:摄氏度)")
@TableField ("temperature")
private String temperature;
@TableField ("create_time")
private Long createTime;
}
package com.yeejoin.amos.api.householdapi.face.orm.houseapi.entity.tdeingine;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* 电站基本信息
* <p>
* ProjectName: amos-boot-zx-biz
* PackageName: com.yeejoin.amos.api.householdapi.face.orm.houseapi.entity.tdeingine
*
* @author yangyang
* @version v1.0
* @date 2024/7/15 16:05
*/
@NoArgsConstructor
@Data
@TableName (value = "tanyin_station_info", autoResultMap = true)
public class TanYinStationInfo {
@ApiModelProperty ("项目编号")
@TableField ("project_no")
private String projectNo;
@ApiModelProperty ("姓名")
@TableField ("customer_name")
private String customerName;
@ApiModelProperty ("手机号")
@TableField ("customer_phone")
private String customerPhone;
@ApiModelProperty ("身份证")
@TableField ("customer_id_no")
private String customerIdNo;
@ApiModelProperty ("省")
@TableField ("province")
private String province;
@ApiModelProperty ("市")
@TableField ("city")
private String city;
@ApiModelProperty ("区")
@TableField ("area")
private String area;
@ApiModelProperty ("镇 + 详细地址")
@TableField ("complete_address")
private String completeAddress;
@TableField (value = "inverterList",exist = false)
private List<InverterListDTO> inverterList;
@ApiModelProperty ("装机容量")
@TableField ("capacity_size")
private String capacitySize;
@ApiModelProperty ("累计总发电量")
@TableField ("total_power")
private String totalPower;
@ApiModelProperty ("当年发电量")
@TableField ("year_power")
private String yearPower;
@ApiModelProperty ("当月发电量")
@TableField ("month_power")
private String monthPower;
@ApiModelProperty ("当日发电量")
@TableField ("day_power")
private String dayPower;
@ApiModelProperty ("纬度")
@TableField ("latitude")
private String latitude;
@ApiModelProperty ("经度")
@TableField ("longitude")
private String longitude;
@TableField ("create_time")
private Long createTime;
@NoArgsConstructor
@Data
public static class InverterListDTO {
private String deviceName;
private Integer supplier;
private String sn;
}
}
package com.yeejoin.amos.api.householdapi.face.orm.mapper.tdengine;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yeejoin.amos.api.householdapi.face.orm.houseapi.entity.tdeingine.TanYinCustomerInfo;
import org.apache.ibatis.annotations.Select;
import java.util.List;
public interface TanYinCustomerInfoMapper extends BaseMapper<TanYinCustomerInfo> {
@Select("select project_no from tanyin_customer_info")
List<String> listProjectNo();
}
package com.yeejoin.amos.api.householdapi.face.orm.mapper.tdengine;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yeejoin.amos.api.householdapi.face.orm.houseapi.entity.tdeingine.TanYinInveterInfo;
public interface TanYinInveterInfoMapper extends BaseMapper<TanYinInveterInfo> {
}
package com.yeejoin.amos.api.householdapi.face.orm.mapper.tdengine;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yeejoin.amos.api.householdapi.face.orm.houseapi.entity.tdeingine.TanYinStationInfo;
public interface TanYinStationInfoMapper extends BaseMapper<TanYinStationInfo> {
}
package com.yeejoin.amos.api.householdapi.face.service;
/**
* <p>
* ProjectName: amos-boot-zx-biz
* PackageName: com.yeejoin.amos.api.householdapi.face.service
*
* @author yangyang
* @version v1.0
* @date 2024/7/15 10:05
*/
public interface TanYinDataAcquisitionService {
/**
* 通过并网时间段查询对应范围内的项目信息
*
* @param
* @return {@link }
* @throws
* @author yangyang
* @date 2024/7/15 16:55
*/
void customerInfoList();
/**
* 电站基本信息
*
* @param
* @return {@link }
* @throws
* @author yangyang
* @date 2024/7/15 16:55
*/
void stationList();
/**
* 电站逆变器信息
*
* @param
* @return {@link }
* @throws
* @author yangyang
* @date 2024/7/15 16:55
*/
void inverterList();
}
package com.yeejoin.amos.api.householdapi.face.service.impl;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.map.MapBuilder;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.github.pagehelper.PageInfo;
import com.yeejoin.amos.api.householdapi.Utils.RedisUtils;
import com.yeejoin.amos.api.householdapi.Utils.TanYinApiUtils;
import com.yeejoin.amos.api.householdapi.constant.GoLangConstant;
import com.yeejoin.amos.api.householdapi.constant.TanYinConstant;
import com.yeejoin.amos.api.householdapi.face.orm.houseapi.entity.hygf.JpInverter;
import com.yeejoin.amos.api.householdapi.face.orm.houseapi.entity.hygf.JpStation;
import com.yeejoin.amos.api.householdapi.face.orm.houseapi.entity.tdeingine.HYGFJPDayPower;
import com.yeejoin.amos.api.householdapi.face.orm.houseapi.entity.tdeingine.HYGFJPStationPowerHistory;
import com.yeejoin.amos.api.householdapi.face.orm.houseapi.entity.tdeingine.TanYinCustomerInfo;
import com.yeejoin.amos.api.householdapi.face.orm.houseapi.entity.tdeingine.TanYinInveterInfo;
import com.yeejoin.amos.api.householdapi.face.orm.houseapi.entity.tdeingine.TanYinStationInfo;
import com.yeejoin.amos.api.householdapi.face.orm.houseapi.entity.tdeingine.TdHYGFStationAllGenerate;
import com.yeejoin.amos.api.householdapi.face.orm.houseapi.entity.tdeingine.TdHYGFStationMonthGenerate;
import com.yeejoin.amos.api.householdapi.face.orm.houseapi.entity.tdeingine.TdHYGFStationYearGenerate;
import com.yeejoin.amos.api.householdapi.face.orm.mapper.hygf.JpCollectorMapper;
import com.yeejoin.amos.api.householdapi.face.orm.mapper.hygf.JpInverterElectricityMapper;
import com.yeejoin.amos.api.householdapi.face.orm.mapper.hygf.JpInverterMapper;
import com.yeejoin.amos.api.householdapi.face.orm.mapper.hygf.JpStationMapper;
import com.yeejoin.amos.api.householdapi.face.orm.mapper.tdengine.HYGFJPCollectorHistoryMapper;
import com.yeejoin.amos.api.householdapi.face.orm.mapper.tdengine.HYGFJPDayPowerMapper;
import com.yeejoin.amos.api.householdapi.face.orm.mapper.tdengine.HYGFJPInverterElecHistoryMapper;
import com.yeejoin.amos.api.householdapi.face.orm.mapper.tdengine.HYGFJPInverterHistoryMapper;
import com.yeejoin.amos.api.householdapi.face.orm.mapper.tdengine.HYGFJPInverterWarnMapper;
import com.yeejoin.amos.api.householdapi.face.orm.mapper.tdengine.HYGFJPStationPowerHistoryMapper;
import com.yeejoin.amos.api.householdapi.face.orm.mapper.tdengine.KsolarStationCollectListMapper;
import com.yeejoin.amos.api.householdapi.face.orm.mapper.tdengine.KsolarStationDetailsMapper;
import com.yeejoin.amos.api.householdapi.face.orm.mapper.tdengine.KsolarStationEarnMapper;
import com.yeejoin.amos.api.householdapi.face.orm.mapper.tdengine.KsolarStationMapper;
import com.yeejoin.amos.api.householdapi.face.orm.mapper.tdengine.TanYinCustomerInfoMapper;
import com.yeejoin.amos.api.householdapi.face.orm.mapper.tdengine.TanYinInveterInfoMapper;
import com.yeejoin.amos.api.householdapi.face.orm.mapper.tdengine.TanYinStationInfoMapper;
import com.yeejoin.amos.api.householdapi.face.orm.mapper.tdengine.TdHYGFInverterDayGenerateMapper;
import com.yeejoin.amos.api.householdapi.face.orm.mapper.tdengine.TdHYGFInverterMonthGenerateMapper;
import com.yeejoin.amos.api.householdapi.face.orm.mapper.tdengine.TdHYGFInverterTotalGenerateMapper;
import com.yeejoin.amos.api.householdapi.face.orm.mapper.tdengine.TdHYGFInverterYearGenerateMapper;
import com.yeejoin.amos.api.householdapi.face.orm.mapper.tdengine.TdHYGFStationAllGenerateMapper;
import com.yeejoin.amos.api.householdapi.face.orm.mapper.tdengine.TdHYGFStationMonthGenerateMapper;
import com.yeejoin.amos.api.householdapi.face.orm.mapper.tdengine.TdHYGFStationYearGenerateMapper;
import com.yeejoin.amos.api.householdapi.face.orm.mapper.tdengine.TdJpStationMapper;
import com.yeejoin.amos.api.householdapi.face.service.TanYinDataAcquisitionService;
import com.yeejoin.amos.openapi.enums.PVProducerInfoEnum;
import fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import org.springframework.util.ObjectUtils;
import javax.annotation.Resource;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
* 碳银业务类
* <p>
* ProjectName: amos-boot-zx-biz
* PackageName: com.yeejoin.amos.api.householdapi.face.service.impl
*
* @author yangyang
* @version v1.0
* @date 2024/7/15 10:15
*/
@Component
@Slf4j
public class TanYinDataAcquisitionServiceImpl implements TanYinDataAcquisitionService {
@Value ("${tanYin.api.apiUrl:}")
private String apiUrl;
@Resource (type = TanYinApiUtils.class)
private TanYinApiUtils tanYinApiUtils;
@Resource (type = RedisUtils.class)
private RedisUtils redisUtils;
@Resource (type = TanYinCustomerInfoMapper.class)
private TanYinCustomerInfoMapper tanYinCustomerInfoMapper;
@Resource (type = TanYinStationInfoMapper.class)
private TanYinStationInfoMapper tanYinStationInfoMapper;
@Resource (type = TanYinInveterInfoMapper.class)
private TanYinInveterInfoMapper tanYinInveterInfoMapper;
@Autowired
private JpStationMapper jpStationMapper;
@Autowired
private HYGFJPStationPowerHistoryMapper hygfjpStationPowerHistoryMapper;
@Autowired
private HYGFJPInverterHistoryMapper hygfjpInverterHistoryMapper;
@Autowired
private HYGFJPCollectorHistoryMapper hygfjpCollectorHistoryMapper;
@Autowired
private HYGFJPInverterWarnMapper hygfjpInverterWarnMapper;
@Autowired
private HYGFJPInverterElecHistoryMapper hygfjpInverterElecHistoryMapper;
@Autowired
private HYGFJPDayPowerMapper hygfjpDayPowerMapper;
@Autowired
private JpCollectorMapper jpCollectorMapper;
@Autowired
private JpInverterMapper jpInverterMapper;
@Autowired
private JpInverterElectricityMapper jpInverterElectricityMapper;
@Autowired
private TdHYGFInverterDayGenerateMapper tdHYGFInverterDayGenerateMapper;
@Autowired
private TdHYGFInverterMonthGenerateMapper tdHYGFInverterMonthGenerateMapper;
@Autowired
private TdHYGFInverterYearGenerateMapper tdHYGFInverterYearGenerateMapper;
@Autowired
private com.yeejoin.amos.api.householdapi.face.orm.mapper.tdengine.TdHYGFStationMonthGenerateMapper TdHYGFStationMonthGenerateMapper;
@Autowired
private com.yeejoin.amos.api.householdapi.face.orm.mapper.tdengine.TdHYGFStationYearGenerateMapper TdHYGFStationYearGenerateMapper;
@Autowired
private com.yeejoin.amos.api.householdapi.face.orm.mapper.tdengine.TdHYGFStationAllGenerateMapper TdHYGFStationAllGenerateMapper;
@Autowired
private TdHYGFInverterTotalGenerateMapper tdHYGFInverterTotalGenerateMapper;
@Autowired
private TdJpStationMapper tdJpStationMapper;
private final static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
@Scheduled (cron = "${dataRequestScheduled.tanYin}")
@Override
public void customerInfoList() {
long ts = System.currentTimeMillis();
log.info("-------碳银同步项目信息开始: {} ------- ", ts);
Map<String, Object> params = MapBuilder.<String, Object>create()
.put("pageNo", "1")
.put("pageSize", "100")// 每页行数
.put("startDate", LocalDate.now().minusDays(360).format(DateTimeFormatter.ofPattern("yyyy-MM-dd")))// 开始时间 YYYY-MM-dd
.put("endDate", LocalDate.now().plusDays(1).format(DateTimeFormatter.ofPattern("yyyy-MM-dd")))// 结束时间 YYYY-MM-dd
.build();
PageInfo<TanYinCustomerInfo> tanYinCustomerInfos = tanYinApiUtils.postPage("客户信息", apiUrl + TanYinConstant.customerInfoUrl, JSON.toJSONString(params), null, TanYinCustomerInfo.class);
if (tanYinCustomerInfos == null || CollectionUtils.isEmpty(tanYinCustomerInfos.getList())) {
return;
}
for (TanYinCustomerInfo tanYinCustomerInfo : tanYinCustomerInfos.getList()) {
if (tanYinCustomerInfoMapper.update(tanYinCustomerInfo, new QueryWrapper<TanYinCustomerInfo>().lambda().eq(TanYinCustomerInfo::getProjectNo, tanYinCustomerInfo.getProjectNo())) == 0) {
tanYinCustomerInfoMapper.insert(tanYinCustomerInfo);
}
}
log.info("-------碳银同步项目信息结束: {} ------- ", ts, sdf.format(new Date()));
}
@Scheduled (cron = "${dataRequestScheduled.tanYin}")
@Async
@Override
public void stationList() {
long ts = System.currentTimeMillis();
log.info("-------碳银同步电站开始: {} ------- ", ts);
List<String> projectNos = tanYinCustomerInfoMapper.listProjectNo();
projectNos.add("TF2024060312382700202");
if (CollectionUtils.isEmpty(projectNos)) {
return;
}
Map<String, Object> params = MapBuilder.<String, Object>create().put("projectNoList", projectNos).put("powerDate", "2024-07-16").build();
List<TanYinStationInfo> tanYinStationInfos = tanYinApiUtils.post("电站基本信息", apiUrl + TanYinConstant.stationListUrl, params, null, TanYinStationInfo.class);
if (CollectionUtils.isEmpty(tanYinStationInfos)) {
return;
}
List<String> stationIds = tanYinStationInfos.stream().map(TanYinStationInfo::getProjectNo).collect(Collectors.toList());
List<JpStation> jpStations = jpStationMapper.selectList(new QueryWrapper<JpStation>().eq("third_code", PVProducerInfoEnum.TANYIN.getCode()).in("third_station_id", stationIds));
Map<String, JpStation> jpStationMap = jpStations.stream().collect(Collectors.toMap(JpStation::getThirdStationId, Function.identity()));
for (TanYinStationInfo tanYinStationInfo : tanYinStationInfos) {
tanYinStationInfo.setCreateTime(System.currentTimeMillis());
tanYinStationInfoMapper.insert(tanYinStationInfo);
List<TanYinStationInfo.InverterListDTO> inverterList = tanYinStationInfo.getInverterList();
for (TanYinStationInfo.InverterListDTO inverterListDTO : inverterList) {
TanYinInveterInfo tanYinInveterInfo = new TanYinInveterInfo();
tanYinInveterInfo.setProjectNo(tanYinStationInfo.getProjectNo());
tanYinInveterInfo.setDeviceName(inverterListDTO.getDeviceName());
tanYinInveterInfo.setSn(inverterListDTO.getSn());
tanYinInveterInfo.setSupplier(inverterListDTO.getSupplier());
tanYinInveterInfo.setCreateTime(System.currentTimeMillis());
tanYinInveterInfoMapper.insert(tanYinInveterInfo);
}
String stationId = tanYinStationInfo.getProjectNo();
JpStation jpStation = jpStationMap.get(stationId);
// 给户用光伏存储的数据赋值
if (ObjectUtils.isEmpty(jpStation)) {
jpStation = new JpStation();
}
jpStation.setCapacity(Double.valueOf(tanYinStationInfo.getCapacitySize()));// 装机容量
jpStation.setAddress(tanYinStationInfo.getProvince() + tanYinStationInfo.getCity() + tanYinStationInfo.getArea() + tanYinStationInfo.getCompleteAddress());
jpStation.setLongitude(tanYinStationInfo.getLongitude());
jpStation.setLatitude(tanYinStationInfo.getLatitude());
jpStation.setUserName(tanYinStationInfo.getCustomerName());
jpStation.setUserPhone(String.valueOf(tanYinStationInfo.getCustomerPhone()));
jpStation.setStationContact(tanYinStationInfo.getProvince() + tanYinStationInfo.getCity() + tanYinStationInfo.getArea() + tanYinStationInfo.getCompleteAddress());
jpStation.setName(tanYinStationInfo.getCustomerName());
jpStation.setThirdCode(PVProducerInfoEnum.TANYIN.getCode());
jpStation.setThirdStationId(tanYinStationInfo.getProjectNo());
jpStation.setDayGenerate(Double.parseDouble(tanYinStationInfo.getDayPower()));
jpStation.setMonthGenerate(Double.parseDouble(tanYinStationInfo.getMonthPower()));
jpStation.setYearGenerate(Double.parseDouble(tanYinStationInfo.getYearPower()));
jpStation.setAccumulatedPower(Double.parseDouble(tanYinStationInfo.getTotalPower()));
// 并网类型
// jpStation.setSnCode(golangStationDetail.getNmicode());
// jpStation.setPrice();
// if (!ObjectUtils.isEmpty(golangStationDetail.getModule())) {
// jpStation.setModuleCount(ObjectUtils.isEmpty(Math.toIntExact(golangStationDetail.getModule())) ? 0 : Math.toIntExact(golangStationDetail.getModule()));
// }
// jpStation.setState(GoLangConstant.stationStaus.get(String.valueOf(golangStationDetail.getState())));
// jpStation.setThirdStationId(String.valueOf(golangStationDetail.getId()));
// jpStation.setRealTimePower();
// jpStation.setOnGridType();
// jpStation.setDayIncome();
// jpStation.setMonthIncome();
// jpStation.setYearIncome();
// jpStation.setCumulativeIncome();
// jpStation.setArea();
// jpStation.setEmail();
// jpStation.setOnGridTime();
// jpStation.setAccessTime();
// jpStation.setCreateTime();
// jpStation.setRatedPower();
jpStation.setType("家庭户用");
jpStation.setRecDate(new Date());
if (!ObjectUtils.isEmpty(jpStation.getSequenceNbr())) {
jpStationMapper.updateById(jpStation);
} else {
jpStationMapper.insert(jpStation);
}
HYGFJPStationPowerHistory hygfjpStationPowerHistory = new HYGFJPStationPowerHistory();
hygfjpStationPowerHistory.setCreatedTime(System.currentTimeMillis());
hygfjpStationPowerHistory.setThirdStationId(jpStation.getThirdStationId());
hygfjpStationPowerHistory.setPower(Double.parseDouble(tanYinStationInfo.getTotalPower()));
hygfjpStationPowerHistory.setThirdCode(jpStation.getThirdCode());
hygfjpStationPowerHistory.setTime(System.currentTimeMillis());
// 新加
hygfjpStationPowerHistory.setAmosCompanyCode(jpStation.getAmosCompanyCode());
hygfjpStationPowerHistory.setRegionalCompaniesCode(jpStation.getRegionalCompaniesCode());
hygfjpStationPowerHistory.setStationName(jpStation.getName());
hygfjpStationPowerHistory.setStationState(jpStation.getState());
hygfjpStationPowerHistoryMapper.insert(hygfjpStationPowerHistory);
// ------ 这里要重写
// HYGFJPDayPower hygfjpDayPower = hygfjpDayPowerMapper.selectOne(new QueryWrapper<HYGFJPDayPower>().eq("tation_id", stationId).eq("year_month_day", today).eq("hour", hour));
// if (ObjectUtils.isEmpty(hygfjpDayPower)) {
// hygfjpDayPower = new HYGFJPDayPower();
// }
// hygfjpDayPower.setTationId(stationId);
//
// hygfjpDayPower.setHour(hour);
// hygfjpDayPower.setYearMonthDay(today);
// hygfjpDayPower.setPower(in.getPower());
//
// // 新加
// hygfjpDayPower.setAmosCompanyCode(jpStation.getAmosCompanyCode());
// hygfjpDayPower.setRegionalCompaniesCode(jpStation.getRegionalCompaniesCode());
// hygfjpDayPower.setStationName(jpStation.getName());
// hygfjpDayPower.setStationState(jpStation.getState());
//
// if (ObjectUtils.isEmpty(hygfjpDayPower.getCreatedTime())) {
// hygfjpDayPower.setCreatedTime(System.currentTimeMillis());
// hygfjpDayPowerMapper.insert(hygfjpDayPower);
// } else {
// hygfjpDayPowerMapper.insert(hygfjpDayPower);
// }
Date today1 = new Date();
// 户用场站日发电量
TdHYGFStationMonthGenerate TdHYGFStationMonthGenerate = TdHYGFStationMonthGenerateMapper.selectOne(new QueryWrapper<TdHYGFStationMonthGenerate>().eq("third_station_id", stationId).eq("day_time", DateUtil.format(today1, "yyyy-MM-dd")).eq("year_month", DateUtil.format(today1, "yyyy-MM")));
if (ObjectUtils.isEmpty(TdHYGFStationMonthGenerate)) {
TdHYGFStationMonthGenerate = new TdHYGFStationMonthGenerate();
}
TdHYGFStationMonthGenerate.setThirdStationId(stationId);
TdHYGFStationMonthGenerate.setDayTime(DateUtil.format(today1, "yyyy-MM-dd"));
TdHYGFStationMonthGenerate.setYearMonth(DateUtil.format(today1, "yyyy-MM"));
TdHYGFStationMonthGenerate.setGenerate(jpStation.getDayGenerate());
TdHYGFStationMonthGenerate.setFullhour(jpStation.getDayGenerate() / jpStation.getCapacity());
TdHYGFStationMonthGenerate.setIncome(jpStation.getDayIncome());
// 新加
TdHYGFStationMonthGenerate.setAmosCompanyCode(jpStation.getAmosCompanyCode());
TdHYGFStationMonthGenerate.setRegionalCompaniesCode(jpStation.getRegionalCompaniesCode());
TdHYGFStationMonthGenerate.setStationName(jpStation.getName());
TdHYGFStationMonthGenerate.setStationState(jpStation.getState());
if (ObjectUtils.isEmpty(TdHYGFStationMonthGenerate.getCreatedTime())) {
TdHYGFStationMonthGenerate.setCreatedTime(System.currentTimeMillis());
TdHYGFStationMonthGenerateMapper.insert(TdHYGFStationMonthGenerate);
} else {
TdHYGFStationMonthGenerateMapper.insert(TdHYGFStationMonthGenerate);
}
// 户用场站月发电量
TdHYGFStationYearGenerate TdHYGFStationYearGenerate = TdHYGFStationYearGenerateMapper.selectOne(new QueryWrapper<TdHYGFStationYearGenerate>().eq("third_station_id", stationId).eq("month_time", DateUtil.format(today1, "yyyy-MM")).eq("year", DateUtil.format(today1, "yyyy")));
if (ObjectUtils.isEmpty(TdHYGFStationYearGenerate)) {
TdHYGFStationYearGenerate = new TdHYGFStationYearGenerate();
}
TdHYGFStationYearGenerate.setThirdStationId(stationId);
TdHYGFStationYearGenerate.setMonthTime(DateUtil.format(today1, "yyyy-MM"));
TdHYGFStationYearGenerate.setYear(DateUtil.format(today1, "yyyy"));
TdHYGFStationYearGenerate.setGenerate(jpStation.getMonthGenerate());
TdHYGFStationYearGenerate.setFullhour(jpStation.getMonthGenerate() / jpStation.getCapacity());
TdHYGFStationYearGenerate.setIncome(jpStation.getMonthIncome());
// 新加
TdHYGFStationYearGenerate.setAmosCompanyCode(jpStation.getAmosCompanyCode());
TdHYGFStationYearGenerate.setRegionalCompaniesCode(jpStation.getRegionalCompaniesCode());
TdHYGFStationYearGenerate.setStationName(jpStation.getName());
TdHYGFStationYearGenerate.setStationState(jpStation.getState());
if (ObjectUtils.isEmpty(TdHYGFStationYearGenerate.getCreatedTime())) {
TdHYGFStationYearGenerate.setCreatedTime(System.currentTimeMillis());
TdHYGFStationYearGenerateMapper.insert(TdHYGFStationYearGenerate);
} else {
TdHYGFStationYearGenerateMapper.insert(TdHYGFStationYearGenerate);
}
// 户用场站年发电量
TdHYGFStationAllGenerate TdHYGFStationAllGenerate = TdHYGFStationAllGenerateMapper.selectOne(new QueryWrapper<TdHYGFStationAllGenerate>().eq("third_station_id", stationId).eq("year_time", DateUtil.format(today1, "yyyy")).eq("year", DateUtil.format(today1, "yyyy")));
if (ObjectUtils.isEmpty(TdHYGFStationAllGenerate)) {
TdHYGFStationAllGenerate = new TdHYGFStationAllGenerate();
}
TdHYGFStationAllGenerate.setThirdStationId(stationId);
TdHYGFStationAllGenerate.setYearTime(DateUtil.format(today1, "yyyy"));
TdHYGFStationAllGenerate.setYear(DateUtil.format(today1, "yyyy"));
TdHYGFStationAllGenerate.setGenerate(jpStation.getYearGenerate());
TdHYGFStationAllGenerate.setFullhour(jpStation.getYearGenerate() / jpStation.getCapacity());
TdHYGFStationAllGenerate.setIncome(jpStation.getYearIncome());
// 新加
TdHYGFStationAllGenerate.setAmosCompanyCode(jpStation.getAmosCompanyCode());
TdHYGFStationAllGenerate.setRegionalCompaniesCode(jpStation.getRegionalCompaniesCode());
TdHYGFStationAllGenerate.setStationName(jpStation.getName());
TdHYGFStationAllGenerate.setStationState(jpStation.getState());
if (ObjectUtils.isEmpty(TdHYGFStationAllGenerate.getCreatedTime())) {
TdHYGFStationAllGenerate.setCreatedTime(System.currentTimeMillis());
TdHYGFStationAllGenerateMapper.insert(TdHYGFStationAllGenerate);
} else {
TdHYGFStationAllGenerateMapper.insert(TdHYGFStationAllGenerate);
}
}
log.info("-------碳银同步电站结束: {} ------- " + ts + "------- " + sdf.format(new Date()));
}
@Scheduled (cron = "${dataRequestScheduled.tanYin}")
@Override
public void inverterList() {
long ts = System.currentTimeMillis();
log.info("-------碳银同步逆变器开始: {} ------- ", ts);
Wrapper<TanYinInveterInfo> queryWrapper = new QueryWrapper<>();
List<TanYinInveterInfo> tanYinInveterInfos = tanYinInveterInfoMapper.selectList(queryWrapper);
if (CollectionUtils.isEmpty(tanYinInveterInfos)) {
return;
}
List<String> snList = tanYinInveterInfos.stream().map(TanYinInveterInfo::getSn).distinct().collect(Collectors.toList());
Map<String, TanYinInveterInfo> tanYinInveterInfoMap = tanYinInveterInfos.stream().collect(Collectors.toMap(TanYinInveterInfo::getSn, v -> v, (k1, k2) -> k1));
Map<String, Object> params = MapBuilder.<String, Object>create().put("snList", snList).build();
JSONObject tanYinInveterInfoResultMap = tanYinApiUtils.post("电站逆变器信息", apiUrl + TanYinConstant.inverterListUrl, params, null, JSONObject.class);
if (CollectionUtils.isEmpty(tanYinInveterInfoMap)) {
return;
}
for (TanYinInveterInfo tanYinInveterInfo : tanYinInveterInfos) {
TanYinInveterInfo tanYinInveterInfoDTO = tanYinInveterInfoResultMap.getJSONObject(tanYinInveterInfo.getSn()).toJavaObject(TanYinInveterInfo.class);
JpInverter jpInverter = jpInverterMapper.selectOne(
new QueryWrapper<JpInverter>().eq("third_station_id", tanYinInveterInfo.getProjectNo())
.eq("third_code", PVProducerInfoEnum.TANYIN.getCode())
.eq("sn_code", tanYinInveterInfo.getSn()));
if (org.springframework.util.ObjectUtils.isEmpty(jpInverter)) {
jpInverter = new JpInverter();
}
// jpInverter.setName(goodWeINverterDetailDto.getIt_name());
jpInverter.setSnCode(tanYinInveterInfo.getSn());
// jpInverter.setId(String.valueOf(goodWeINverterDetailDto.getId()));
// jpInverter.setCapacity(goodWeINverterDetailDto.getIt_capacity());
jpInverter.setThirdStationId(tanYinInveterInfo.getProjectNo());
jpInverter.setThirdCode(PVProducerInfoEnum.TANYIN.getCode());
// if (ObjectUtil.isNotEmpty(jpStation) && StringUtils.isNotEmpty(jpStation.getName())) {
// jpInverter.setStationName(jpStation.getName());
// }
jpInverter.setRecDate(new Date());
if (tanYinInveterInfoDTO.getGmtCreate() != null) {
// jpInverter.setUpdateTime(new Date(tanYinInveterInfoDTO.getGmtCreate()));
}
//
// jpInverter.setRatedPower(inverterDetailDto.getPower() != null
// ? Double.valueOf(inverterDetailDto.getPower())
// : null); // 额定功率
jpInverter.setCurrentPower(Double.parseDouble(tanYinInveterInfoDTO.getWatt()));
jpInverter.setDayPowerGeneration(Double.parseDouble(tanYinInveterInfoDTO.getDailyEnergy()));
// jpInverter.setMonthPowerGeneration(inverterDetailDto.getEMonth());
// jpInverter.setYearPowerGeneration(inverterDetailDto.getEYear());
jpInverter.setTotalPowerGeneration(Double.parseDouble(tanYinInveterInfoDTO.getTotalEnergy()));
jpInverter.setBrand(tanYinInveterInfoDTO.getSupplier().toString());
jpInverter.setModel(tanYinInveterInfoDTO.getDeviceName());
if (!ObjectUtils.isEmpty(jpInverter.getSequenceNbr())) {
jpInverterMapper.updateById(jpInverter);
} else {
jpInverterMapper.insert(jpInverter);
}
}
}
}
...@@ -9,7 +9,8 @@ public enum PVProducerInfoEnum { ...@@ -9,7 +9,8 @@ public enum PVProducerInfoEnum {
JLY("锦浪云","JLY"), JLY("锦浪云","JLY"),
KSOLAR("科士达","KSD"), KSOLAR("科士达","KSD"),
YG("阳光","YG"), YG("阳光","YG"),
HUAWEI("华为","HW"); HUAWEI("华为","HW"),
TANYIN("碳银","TY");
private String name; private String name;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment