Compare commits

...

9 Commits

Author SHA1 Message Date
41cd594c13 统一登陆接口修改 2026-04-16 10:56:49 +08:00
c63b92481b 中车、寄点站点融合 2026-04-14 17:33:01 +08:00
21a3c2f9cf 添加英文大屏接口修改 2026-03-07 11:14:02 +08:00
b8a3f9e0f9 天气同步问题bug处理 2025-11-20 17:19:14 +08:00
855967d083 增加今日收益计算 2025-10-30 15:06:31 +08:00
530f4396f7 添加百度翻译api接口工具类 2025-08-19 10:10:56 +08:00
584ad2e6e4 修改topic订阅发布问题 2025-08-12 16:18:17 +08:00
8e3aac4cea 示范电站sn 2025-08-08 10:10:51 +08:00
f98a57c510 新增电站sn 2025-08-07 17:40:07 +08:00
41 changed files with 1845 additions and 92 deletions

View File

@ -0,0 +1,47 @@
package com.ho.business.vo.resp;
import com.alibaba.fastjson.JSONArray;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* 主监控汇总信息
*/
@Data
public class ShipStationRespVO {
@ApiModelProperty(value = "储能系统累计收益,单位(元)")
private Float incomeSum;
@ApiModelProperty(value = "储能系统昨⽇收益")
private Float incomeYesterday;
@ApiModelProperty(value = "储能系统累计充电量单位kWh")
private Float positivePowerSum;
@ApiModelProperty(value = "储能系统累计放电量单位kWh")
private Float reversePowerSum;
@ApiModelProperty(value = "储能系统今⽇充电量单位kWh")
private Float positivePowerToday;
@ApiModelProperty(value = "储能系统今⽇放电量单位kWh")
private Float reversePowerToday;
@ApiModelProperty(value = "储能系统实时功率单位kw")
private Float realTimePower;
@ApiModelProperty(value = "关⼝表电压单位v")
private Float voltage;
@ApiModelProperty(value = "储能系统剩余电量单位kwh")
private Float surplus;
@ApiModelProperty(value = "储能系统剩余SOC")
private Float soc;
@ApiModelProperty(value = "储能系统装机容量单位kWh")
private Integer capacity;
@ApiModelProperty(value = "储能系统投运时⻓,单位(天)")
private Integer operationTime;
@ApiModelProperty(value = "储能系统能量链数量,单位(条)")
private Integer eLinkNumber;
@ApiModelProperty(value = "储能系统在线能量链数量,单位(条)")
private Integer eLinkOnline;
@ApiModelProperty(value = "储能系统能量块数量,单位(个)")
private Integer eBLockNumber;
@ApiModelProperty(value = "储能系统在线能量块数量,单位(个)")
private Integer eBlockOnline;
@ApiModelProperty(value = "储能系统今⽇功率和soc曲线")
private JSONArray historyDataList;
}

View File

@ -31,6 +31,8 @@ public class AnnualOverviewResp {
@ApiModelProperty(value = "年总充")
BigDecimal yearCharge;
@ApiModelProperty(value = "今日收益")
BigDecimal todayProfit;
@ApiModelProperty(value = "昨日收益")
BigDecimal yestProfit;

View File

@ -29,6 +29,8 @@ public interface EarningsCalculateMapper {
int deleteByDay(@Param("day") String day, @Param("typeList") List<Integer> typeList);
int deleteByStationAndDay(@Param("day") String day, @Param("typeList") List<Integer> typeList, @Param("stationId") Integer stationId);
int insertBatch(List<EarningsCalculate> list);
// 类型是传入多个
//List<EarningsCalculate> selectList(@Param("stationId") Integer stationId, @Param("typeList") List<Integer> typeList, @Param("beginTime") String beginTime, @Param("endTime") String endTime);

View File

@ -36,7 +36,7 @@ public interface StationMapper {
List<Station> selectByDimName(String name,Integer groupId);
List<Station> selectByIds(List<Integer> ids);
List<Station> selectByIds(@Param("ids") List<Integer> ids,@Param("lang") String lang);
Station selectByNameAndId(@Param("name") String name, @Param("id") Integer id, @Param("deptId") Integer deptId);

View File

@ -0,0 +1,354 @@
package com.ho.business.service;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Maps;
import com.ho.business.constant.DeviceTypeConstant;
import com.ho.business.entity.EarningsCalculate;
import com.ho.business.entity.ElecMeterValue;
import com.ho.business.mapper.EarningsCalculateMapper;
import com.ho.business.vo.req.carbin.EarningsCalculateReq;
import com.ho.business.vo.resp.ShipStationRespVO;
import com.ho.common.tools.constant.CommonConstant;
import com.ho.common.tools.service.RedisService;
import com.ho.common.tools.util.HttpUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.io.IOException;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.time.Instant;
import java.time.LocalDate;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.concurrent.TimeUnit;
/**
* 成都巨石 能源 储能
* 成都巨石能源 API 接口 服务
*
* @author kerwin
*/
@Service
@Slf4j
public class BoulderEnergyService {
/**
* 获取token 参数 appAccount
*/
private static final String APP_ACCOUNT = "cdjs_app";
/**
* 获取token 参数 appSecretKey
*/
private static final String APP_SECRET_KEY = "cdjs@0108";
/**
* 中车- 获取电站id
*/
private static final Integer BOULDER_STATION_ID = 11006;
/**
* 中车- 获取token Url
*/
private static final String TOKEN_URL = "http://111.15.176.77:18082/gate-newpc/zhny-openapi/openapi/v1/authentication/getAccessToken";
/**
* 中车- 统计数据 Url
*/
private static final String BOULDER_DATA_URL = "http://111.15.176.77:18082/gate-newpc/zhny-openapi/openapi/v1/statistics/station/qryIncDayBill";
@Autowired
private RedisService redisService;
@Autowired
ElecMeterValueService elecMeterValueService;
@Autowired
EarningsCalculateMapper earningsCalculateMapper;
/**
* 中车能源 - 获取token
* @return token
*/
public String getToken(){
String token = null;
if(redisService.hasKey(CommonConstant.BOULDER_ENERGY_TOKEN_KEY)){
token = (String)redisService.get(CommonConstant.BOULDER_ENERGY_TOKEN_KEY);
return token;
}
Map<String, Object> params = Maps.newHashMap();
params.put("appAccount",APP_ACCOUNT);
params.put("appSecretKey",APP_SECRET_KEY);
try {
String json = HttpUtils.postWithJson(TOKEN_URL,params);
log.info("json:" + TOKEN_URL);
log.info("json:" + json);
JSONObject jsonObject = JSONObject.parseObject(json);
Integer code = jsonObject.getInteger("code");
if(CommonConstant.HttpCode.SUCCESS_CODE.equals(code)){
JSONObject data = jsonObject.getJSONObject("data");
token = data.getString("accessToken");
//redis 缓存
redisService.set(CommonConstant.BOULDER_ENERGY_TOKEN_KEY,token,50, TimeUnit.SECONDS);
}
} catch (IOException e) {
throw new RuntimeException(e);
}
return token;
}
/**
* 中车能源 - 统计数据
* @param beginTime 开始时间
* @return
*/
public String getBoulderData(String beginTime){
Map<String, String> headers = new HashMap<>();
headers.put("Authorization", getToken());
Map<String, Object> params = new HashMap<>();
params.put("stationCode","SC020075040001");
params.put("time",beginTime);
String contentType = "application/json; charset=utf-8";
try {
String json = HttpUtils.postWithHeaders(BOULDER_DATA_URL,HttpUtils.mapToJson(params),contentType,headers);
log.info("MAIN_URL:" + BOULDER_DATA_URL);
log.info("json:" + json);
JSONObject jsonObject = JSONObject.parseObject(json);
Integer code = jsonObject.getInteger("code");
if(CommonConstant.HttpCode.SUCCESS_CODE.equals(code)){
String data = jsonObject.getString("data");
JSONObject dataJson = JSONObject.parseObject(data);
return dataJson.getString("records");
}
} catch (IOException e) {
throw new RuntimeException(e);
}
return null;
}
/*****************************************业务处理******************************************************/
/**
* 中车 - 获取电站历史收益、充放电数据并存储
*/
public void getBoulderEleIncome(String beginTime){
DateTime yesterday = DateUtil.yesterday();
String yesterdayStr = DateUtil.formatDate(yesterday);
if(beginTime==null){
beginTime = yesterdayStr;
}
long timestamp = dateStringToTimestamp(beginTime);
String records = getBoulderData(String.valueOf(timestamp));
JSONArray data = JSON.parseArray(records);
String finalBeginTime = beginTime;
data.forEach(i->{
List<EarningsCalculate> list = new ArrayList<>();
List<ElecMeterValue> elecList = new ArrayList<>();
JSONObject obj = (JSONObject) i;
String date = timestampToDateString(obj.getLong("balanceDate"));
if(finalBeginTime.equals(date)){
//收益-充-尖
EarningsCalculate sharpCharge = new EarningsCalculate();
BigDecimal sharpChargeEle = obj.getBigDecimal("sharpChargeElectricity");
sharpCharge.setElec(sharpChargeEle);
sharpCharge.setType(0);
sharpCharge.setRateType(CommonConstant.RateType.TIP);
sharpCharge.setPrice(BigDecimal.ZERO);
sharpCharge.setDigital(BigDecimal.ZERO);
sharpCharge.setTotal(BigDecimal.ZERO);
list.add(sharpCharge);
//收益-充-峰
EarningsCalculate peakCharge = new EarningsCalculate();
BigDecimal peakChargeEle = obj.getBigDecimal("peakChargeElectricity");
peakCharge.setElec(peakChargeEle);
peakCharge.setType(0);
peakCharge.setRateType(CommonConstant.RateType.PEAK);
peakCharge.setPrice(BigDecimal.ZERO);
peakCharge.setDigital(BigDecimal.ZERO);
peakCharge.setTotal(BigDecimal.ZERO);
list.add(peakCharge);
//收益-充-平
EarningsCalculate flatCharge = new EarningsCalculate();
BigDecimal flatChargeEle = obj.getBigDecimal("flatChargeElectricity");
flatCharge.setElec(flatChargeEle);
flatCharge.setType(0);
flatCharge.setRateType(CommonConstant.RateType.FLAT);
flatCharge.setPrice(BigDecimal.ZERO);
flatCharge.setDigital(BigDecimal.ZERO);
flatCharge.setTotal(BigDecimal.ZERO);
list.add(flatCharge);
//收益-充-谷
EarningsCalculate valleyCharge = new EarningsCalculate();
BigDecimal valleyChargeEle = obj.getBigDecimal("valleyChargeElectricity");
valleyCharge.setElec(valleyChargeEle);
valleyCharge.setType(0);
valleyCharge.setRateType(CommonConstant.RateType.VALLEY);
valleyCharge.setPrice(BigDecimal.ZERO);
valleyCharge.setDigital(BigDecimal.ZERO);
valleyCharge.setTotal(BigDecimal.ZERO);
list.add(valleyCharge);
//收益-充-深谷
EarningsCalculate deepValleyCharge = new EarningsCalculate();
BigDecimal deepValleyChargeEle = obj.getBigDecimal("deepValleyChargeElectricity");
deepValleyCharge.setElec(deepValleyChargeEle);
deepValleyCharge.setType(0);
deepValleyCharge.setRateType(CommonConstant.RateType.DEEP_VALLEY);
deepValleyCharge.setPrice(BigDecimal.ZERO);
deepValleyCharge.setDigital(BigDecimal.ZERO);
deepValleyCharge.setTotal(BigDecimal.ZERO);
list.add(deepValleyCharge);
//收益-放-尖
EarningsCalculate sharpDischarge = new EarningsCalculate();
BigDecimal reverseSharp = obj.getBigDecimal("sharpDischargeElectricity");
sharpDischarge.setElec(reverseSharp);
sharpDischarge.setType(1);
sharpDischarge.setRateType(CommonConstant.RateType.TIP);
sharpDischarge.setPrice(BigDecimal.ZERO);
sharpDischarge.setDigital(BigDecimal.ZERO);
sharpDischarge.setTotal(BigDecimal.ZERO);
list.add(sharpDischarge);
//收益-放-峰
EarningsCalculate peakDischarge = new EarningsCalculate();
BigDecimal peakDischargeEle = obj.getBigDecimal("peakDischargeElectricity");
peakDischarge.setElec(peakDischargeEle);
peakDischarge.setType(1);
peakDischarge.setRateType(CommonConstant.RateType.PEAK);
peakDischarge.setPrice(BigDecimal.ZERO);
peakDischarge.setDigital(BigDecimal.ZERO);
peakDischarge.setTotal(BigDecimal.ZERO);
list.add(peakDischarge);
//收益-放-平
EarningsCalculate flatDischarge = new EarningsCalculate();
BigDecimal flatDischargeEle = obj.getBigDecimal("flatDischargeElectricity");
flatDischarge.setElec(flatDischargeEle);
flatDischarge.setType(1);
flatDischarge.setRateType(CommonConstant.RateType.FLAT);
flatDischarge.setPrice(BigDecimal.ZERO);
flatDischarge.setDigital(BigDecimal.ZERO);
flatDischarge.setTotal(BigDecimal.ZERO);
list.add(flatDischarge);
//收益-放-谷
EarningsCalculate valleyDischarge = new EarningsCalculate();
BigDecimal valleyDischargeEle = obj.getBigDecimal("valleyDischargeElectricity");
valleyDischarge.setElec(valleyDischargeEle);
valleyDischarge.setType(1);
valleyDischarge.setRateType(CommonConstant.RateType.VALLEY);
valleyDischarge.setPrice(BigDecimal.ZERO);
valleyDischarge.setDigital(BigDecimal.ZERO);
valleyDischarge.setTotal(BigDecimal.ZERO);
list.add(valleyDischarge);
//收益-放-深谷
EarningsCalculate deepValleyDischarge = new EarningsCalculate();
BigDecimal deepValleyDischargeEle = obj.getBigDecimal("deepValleyDischargeElectricity");
BigDecimal income = obj.getBigDecimal("income");
deepValleyDischarge.setElec(deepValleyDischargeEle);
deepValleyDischarge.setType(1);
deepValleyDischarge.setRateType(CommonConstant.RateType.DEEP_VALLEY);
deepValleyDischarge.setPrice(BigDecimal.ZERO);
deepValleyDischarge.setDigital(income);
deepValleyDischarge.setTotal(income);
list.add(deepValleyDischarge);
// 充电
ElecMeterValue charge = new ElecMeterValue();
BigDecimal chargeEle = obj.getBigDecimal("chargeElectricity");
charge.setDigital(chargeEle);
charge.setType(DeviceTypeConstant.ELEC_METER_VALUE_TYPE.CHARGE);
charge.setStatus(CommonConstant.STATUS_FLAG);
elecList.add(charge);
// 放电
ElecMeterValue disCharge = new ElecMeterValue();
BigDecimal dischargeEle = obj.getBigDecimal("dischargeElectricity");
disCharge.setDigital(dischargeEle);
disCharge.setType(DeviceTypeConstant.ELEC_METER_VALUE_TYPE.DISCHARGE);
disCharge.setStatus(CommonConstant.STATUS_FLAG);
elecList.add(disCharge);
if(elecList.size()>0){
//删除
elecMeterValueService.deleteByStationAndDay(BOULDER_STATION_ID,date,null);
elecList.forEach(eleMeter -> {
eleMeter.setGroupId(155);
eleMeter.setStationId(BOULDER_STATION_ID);
eleMeter.setCreateTime(new Date());
eleMeter.setDay(date);
//新增
elecMeterValueService.insert(eleMeter);
});
}
if(list.size()>0){
//删除
earningsCalculateMapper.deleteByStationAndDay(date,null,BOULDER_STATION_ID);
list.forEach(a->{
a.setGroupId(155);
a.setStationId(BOULDER_STATION_ID);
a.setCreateTime(new Date());
a.setDay(date);
a.setDiscount(BigDecimal.ONE);
//新增
earningsCalculateMapper.insertSelective(a);
});
}
}
});
}
public void getCacheBoulderData(){
ShipStationRespVO vo = new ShipStationRespVO();
//查询电站收益数据
EarningsCalculateReq ec = new EarningsCalculateReq();
//昨日
DateTime yesterday = DateUtil.yesterday();
String yesterdayStr = DateUtil.formatDate(yesterday);
//今日
DateTime nowDay = DateUtil.date();
String nowDayStr = DateUtil.formatDate(nowDay);
//查询电站所有收益数据-组装参数
ec.setStationId(BOULDER_STATION_ID);
ec.setBeginTime(earningsCalculateMapper.getFirstTime());
ec.setEndTime(nowDayStr);
List<EarningsCalculate> earnList = earningsCalculateMapper.selectList(ec);
// 累计充电、放电、收益
BigDecimal incomeSum = earnList.stream().map(EarningsCalculate::getDigital).reduce(BigDecimal.ZERO, BigDecimal::add);
BigDecimal positivePowerSum = earnList.stream().filter(i->i.getType().equals(CommonConstant.ZERO)).map(EarningsCalculate::getElec).reduce(BigDecimal.ZERO, BigDecimal::add);
BigDecimal reversePowerSum = earnList.stream().filter(i->i.getType().equals(CommonConstant.ONE)).map(EarningsCalculate::getElec).reduce(BigDecimal.ZERO, BigDecimal::add);
vo.setIncomeSum(incomeSum.floatValue());
vo.setPositivePowerSum(positivePowerSum.floatValue());
vo.setReversePowerSum(reversePowerSum.floatValue());
// 昨日收益
BigDecimal incomeYesterday = earnList.stream().filter(i->i.getDay().equals(yesterdayStr)).map(EarningsCalculate::getDigital).reduce(BigDecimal.ZERO, BigDecimal::add);
vo.setIncomeYesterday(incomeYesterday.floatValue());
// 今日充、放电
BigDecimal positivePowerToday = earnList.stream().filter(i->i.getDay().equals(nowDayStr)&&i.getType().equals(CommonConstant.ZERO)).map(EarningsCalculate::getElec).reduce(BigDecimal.ZERO, BigDecimal::add);
vo.setPositivePowerToday(positivePowerToday.floatValue());
BigDecimal reversePowerToday = earnList.stream().filter(i->i.getDay().equals(nowDayStr)&&i.getType().equals(CommonConstant.ONE)).map(EarningsCalculate::getElec).reduce(BigDecimal.ZERO, BigDecimal::add);
vo.setReversePowerToday(reversePowerToday.floatValue());
String mainKey = CommonConstant.SHIP_ENERGY_MAIN + BOULDER_STATION_ID;
redisService.set(mainKey,JSONObject.toJSONString(vo));
}
/**
* 时间日期 转换为时间戳
* @param dateStr yyyy-MM-dd
* @return long 时间戳
*/
public static long dateStringToTimestamp(String dateStr) {
LocalDate localDate = LocalDate.parse(dateStr, DateTimeFormatter.ISO_LOCAL_DATE);
return localDate.atStartOfDay(ZoneId.systemDefault()).toInstant().toEpochMilli();
}
/**
* 毫秒级时间戳 转换为日期 yyyy-MM-dd
* @param timestamp long 时间戳
* @return yyyy-MM-dd
*/
public static String timestampToDateString(long timestamp) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(CommonConstant.DATE_YMD);
return Instant.ofEpochMilli(timestamp)
.atZone(ZoneId.systemDefault())
.format(formatter);
}
}

View File

@ -62,7 +62,7 @@ public interface IargeScreenShowService {
* @param stationIds
* @return
*/
List<Subdata> getCommonRegionList(List<Integer> stationIds);
List<Subdata> getCommonRegionList(List<Integer> stationIds,String lang);
/**
* 获取节能减排数据
@ -90,27 +90,27 @@ public interface IargeScreenShowService {
* 查询收益按电站分组
* @return
*/
List<Subdata> getCommonProfit(String beginString, String endString,List<Integer> stationIds);
List<Subdata> getCommonProfit(String beginString, String endString,List<Integer> stationIds,String lang);
/**
* 通用系统转换率
* @param stationIds
* @return
*/
List<Subdata> getCommonEfficiencyDate(List<Integer> stationIds);
List<Subdata> getCommonEfficiencyDate(List<Integer> stationIds,String lang);
/**
* 获取统计电站信息
* @param stationIds
* @return
*/
List<Station> getCountStations(List<Integer> stationIds);
List<Station> getCountStations(List<Integer> stationIds,String lang);
/**
* 通用装机容量倒排
* @return
*/
List<Subdata> getCommonCapacity(List<Integer> stationIds);
List<Subdata> getCommonCapacity(List<Integer> stationIds,String lang);
/**
* 通用根据天获取告警数目曲线

View File

@ -0,0 +1,446 @@
package com.ho.business.service;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Maps;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.ho.business.constant.DeviceTypeConstant;
import com.ho.business.entity.EarningsCalculate;
import com.ho.business.entity.ElecMeterValue;
import com.ho.business.entity.Station;
import com.ho.business.mapper.EarningsCalculateMapper;
import com.ho.business.vo.req.StationReqVO;
import com.ho.business.vo.resp.ShipStationRespVO;
import com.ho.common.tools.constant.CommonConstant;
import com.ho.common.tools.exception.BaseResponseCode;
import com.ho.common.tools.exception.BusinessException;
import com.ho.common.tools.service.RedisService;
import com.ho.common.tools.util.HttpUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.jsf.FacesContextUtils;
import java.io.IOException;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.concurrent.TimeUnit;
/**
* 西安寄点能源股份有限公司
* 西安寄点能源 API 接口 服务
*
* @author kerwin
*/
@Service
@Slf4j
public class ShipEnergyService {
/**
* 获取token 参数 platform
*/
private static final String PLATFORM = "f9599b6c79a5efbfc6ddce5fed1bbed5";
/**
* 获取token 参数 platformsecret
*/
private static final String PLATFORM_SECRET = "2928b16f9cb8e85199a4caa6ba3b6620";
/**
* 寄点能源- 获取token Url
*/
private static final String TOKEN_URL = "https://www.emind2000.cloud/rest-api/gettoken";
/**
* 寄点能源- 获取项目列表 Url
*/
private static final String STATION_URL = "https://www.emind2000.cloud/rest-api/getStations";
/**
* 寄点能源- 主监控汇总 Url
*/
private static final String MAIN_URL = "https://www.emind2000.cloud/rest-api/getMainTotal";
/**
* 寄点能源- 历史收益 Url
*/
private static final String INCOME_HIS_URL = "https://www.emind2000.cloud/rest-api/getIncomeHis";
@Autowired
private RedisService redisService;
@Autowired
private StationService stationService;
@Autowired
ElecMeterValueService elecMeterValueService;
@Autowired
EarningsCalculateMapper earningsCalculateMapper;
/**
* 寄点能源 - 获取token
* @return token
*/
public String getToken(){
String token = null;
if(redisService.hasKey(CommonConstant.SHIP_ENERGY_TOKEN_KEY)){
token = (String)redisService.get(CommonConstant.SHIP_ENERGY_TOKEN_KEY);
return token;
}
Map<String, String> params = Maps.newHashMap();
params.put("platform",PLATFORM);
params.put("platformsecret",PLATFORM_SECRET);
try {
String json = HttpUtils.getWithForm(TOKEN_URL,params);
log.info("json:" + TOKEN_URL);
log.info("json:" + json);
JSONObject jsonObject = JSONObject.parseObject(json);
Integer code = jsonObject.getInteger("code");
if(CommonConstant.HttpCode.SUCCESS_CODE.equals(code)){
JSONObject data = jsonObject.getJSONObject("data");
token = data.getString("access_token");
//redis 缓存
redisService.set(CommonConstant.SHIP_ENERGY_TOKEN_KEY,token,10, TimeUnit.HOURS);
}
} catch (IOException e) {
throw new RuntimeException(e);
}
return token;
}
/**
* 寄点能源 - 获取 项目列表
* @return 项目列表 json 字符串
*/
public String getStations(){
Map<String, String> headers = new HashMap<>();
headers.put("Authorization", getToken());
try {
String json = HttpUtils.getWithHeaders(STATION_URL,null,headers);
log.info("json:" + STATION_URL);
log.info("json:" + json);
JSONObject jsonObject = JSONObject.parseObject(json);
Integer code = jsonObject.getInteger("code");
if(CommonConstant.HttpCode.SUCCESS_CODE.equals(code)){
JSONObject data = jsonObject.getJSONObject("data");
return data.getString("rows");
}
} catch (IOException e) {
throw new RuntimeException(e);
}
return null;
}
/**
*
* 寄点能源 - 获取 主监控汇总信息
* @param stationId 电站id
* @return 返回对应电站汇总信息
*/
public String getMainTotal(Integer stationId){
Map<String, String> headers = new HashMap<>();
headers.put("Authorization", getToken());
Map<String, String> params = new HashMap<>();
params.put("stationId",stationId.toString());
try {
Thread.sleep(2000);
String json = HttpUtils.getWithHeaders(MAIN_URL,params,headers);
log.info("MAIN_URL:" + MAIN_URL);
log.info("json:" + json);
JSONObject jsonObject = JSONObject.parseObject(json);
Integer code = jsonObject.getInteger("code");
if(CommonConstant.HttpCode.SUCCESS_CODE.equals(code)){
return jsonObject.getString("data");
}
} catch (IOException e) {
throw new RuntimeException(e);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
return null;
}
/**
* 寄点能源 - 获取 历史收益查询
*/
public String getIncomeHis(Integer stationId,String beginTime){
Map<String, String> headers = new HashMap<>();
headers.put("Authorization", getToken());
Map<String, String> params = new HashMap<>();
params.put("stationId",stationId.toString());
params.put("startTime",beginTime+CommonConstant.START_SUFFIX_TIMESTAMP);
params.put("endTime",beginTime+CommonConstant.END_SUFFIX_TIMESTAMP);
try {
String json = HttpUtils.getWithHeaders(INCOME_HIS_URL,params,headers);
log.info("INCOME_HIS_URL:" + INCOME_HIS_URL);
log.info("json:" + json);
JSONObject jsonObject = JSONObject.parseObject(json);
Integer code = jsonObject.getInteger("code");
if(CommonConstant.HttpCode.SUCCESS_CODE.equals(code)){
return jsonObject.getString("data");
}
} catch (IOException e) {
throw new RuntimeException(e);
}
return null;
}
/*****************************************业务处理******************************************************/
/**
* 寄点能源 - 电站信息融合储能平台处理
*/
public void addShipEnergyStation(){
String json = getStations();
JSONArray jsonStation = JSON.parseArray(json);
jsonStation.forEach(i->{
JSONObject jsonObj = (JSONObject) i;
Integer stationId = jsonObj.getInteger("stationId");
String name = jsonObj.getString("name");
String address = jsonObj.getString("address");
String province = jsonObj.getString("province");
String city = jsonObj.getString("city");
BigDecimal longitude = jsonObj.getBigDecimal("longitude");
BigDecimal latitude = jsonObj.getBigDecimal("latitude");
BigDecimal maxPower = jsonObj.getBigDecimal("maxPower");
BigDecimal capacity = jsonObj.getBigDecimal("capacity");
Date commossioningTime = jsonObj.getDate("commossioningTime");
StationReqVO vo = new StationReqVO();
vo.setId(stationId+10000);
vo.setName(name);
vo.setAddress(address);
vo.setLongitude(longitude);
vo.setLatitude(latitude);
vo.setCapacity(capacity);
vo.setRatePower(maxPower);
vo.setGridTime(commossioningTime);
vo.setGroupId(155);
vo.setDeptId(592);
vo.setStatus(1);
vo.setType(7);
vo.setPId(0);
vo.setIsDailyCount(0);
vo.setTopologyType(1);
vo.setCupboardType(2);
Station station = stationService.selectByName(vo.getName());
if (station != null) {
throw new BusinessException(BaseResponseCode.STATION_ALREADY_EXISTS);
}
stationService.insertStation(vo);
});
}
/**
* 寄点能源 - 缓存电站监控信息
*/
public void getShipEnergyTotal(){
String stations = getStations();
JSONArray jsonStation = JSON.parseArray(stations);
jsonStation.forEach(i->{
JSONObject jsonObj = (JSONObject) i;
Integer stationId = jsonObj.getInteger("stationId");
String json = getMainTotal(stationId);
Integer finalStationId = stationId +10000;
String mainKey = CommonConstant.SHIP_ENERGY_MAIN + finalStationId;
redisService.set(mainKey,json);
});
}
/**
* 寄点能源 - 获取寄点电站历史收益 并存储
*/
public void getStationIncomeHis(String beginTime){
DateTime yesterday = DateUtil.yesterday();
String yesterdayStr = DateUtil.formatDate(yesterday);
if(beginTime==null){
beginTime = yesterdayStr;
}
String stations = getStations();
JSONArray jsonStation = JSON.parseArray(stations);
String finalBeginTime = beginTime;
log.info("传入参数-统计时间:{}",beginTime);
jsonStation.forEach(i->{
JSONObject jsonObj = (JSONObject) i;
Integer stationId = jsonObj.getInteger("stationId");
String incomeHis = getIncomeHis(stationId, finalBeginTime);
JSONArray incomes = JSON.parseArray(incomeHis);
log.info("远程查询-历史收益数据:{}",incomes);
incomes.forEach(j->{
JSONObject income = (JSONObject) j;
String date = income.getString("date");
String price = income.getString("price");
JsonObject jsonPrice = JsonParser.parseString(price).getAsJsonObject();
List<EarningsCalculate> list = new ArrayList<>();
List<ElecMeterValue> elecList = new ArrayList<>();
BigDecimal inTotalIncome = BigDecimal.ZERO;
BigDecimal outTotalIncome = BigDecimal.ZERO;
log.info("远程查询-统计日期:{}",date);
if(finalBeginTime.equals(date)){
//收益-充-尖
EarningsCalculate inSharp = new EarningsCalculate();
BigDecimal positiveSharp = income.getBigDecimal("sum_e_positive_sharp");
inSharp.setElec(positiveSharp);
inSharp.setType(0);
inSharp.setRateType(CommonConstant.RateType.TIP);
BigDecimal inSharpPrice = jsonPrice.get("in_sharp_price").getAsBigDecimal();
inSharp.setPrice(inSharpPrice);
inSharp.setDigital(positiveSharp.multiply(inSharpPrice));
inTotalIncome = inTotalIncome.add(inSharp.getDigital());
inSharp.setTotal(BigDecimal.ZERO);
list.add(inSharp);
//收益-充-峰
EarningsCalculate inPeak = new EarningsCalculate();
BigDecimal positivePeak = income.getBigDecimal("sum_e_positive_peak");
inPeak.setElec(positivePeak);
inPeak.setType(0);
inPeak.setRateType(CommonConstant.RateType.PEAK);
BigDecimal inPeakPrice = jsonPrice.get("in_peak_price").getAsBigDecimal();
inPeak.setPrice(inPeakPrice);
inPeak.setDigital(positivePeak.multiply(inPeakPrice));
inTotalIncome = inTotalIncome.add(inPeak.getDigital());
inPeak.setTotal(BigDecimal.ZERO);
list.add(inPeak);
//收益-充-平
EarningsCalculate inFlat = new EarningsCalculate();
BigDecimal positiveFlat = income.getBigDecimal("sum_e_positive_flat");
inFlat.setElec(positiveFlat);
inFlat.setType(0);
inFlat.setRateType(CommonConstant.RateType.FLAT);
BigDecimal inFlatPrice = jsonPrice.get("in_flat_price").getAsBigDecimal();
inFlat.setPrice(inFlatPrice);
inFlat.setDigital(positiveFlat.multiply(inFlatPrice));
inTotalIncome = inTotalIncome.add(inFlat.getDigital());
inFlat.setTotal(BigDecimal.ZERO);
list.add(inFlat);
//收益-充-谷
EarningsCalculate inValley = new EarningsCalculate();
BigDecimal positiveValley = income.getBigDecimal("sum_e_positive_valley");
inValley.setElec(positiveValley);
inValley.setType(0);
inValley.setRateType(CommonConstant.RateType.VALLEY);
BigDecimal inValleyPrice = jsonPrice.get("in_valley_price").getAsBigDecimal();
inValley.setPrice(inValleyPrice);
inValley.setDigital(positiveValley.multiply(inValleyPrice));
inTotalIncome = inTotalIncome.add(inValley.getDigital());
inValley.setTotal(BigDecimal.ZERO);
list.add(inValley);
//收益-充-深谷
EarningsCalculate inDeepValley = new EarningsCalculate();
BigDecimal positiveDeepValley = income.getBigDecimal("sum_e_positive_deep_valley");
inDeepValley.setElec(positiveDeepValley);
inDeepValley.setType(0);
inDeepValley.setRateType(CommonConstant.RateType.DEEP_VALLEY);
BigDecimal inDeepValleyPrice = jsonPrice.get("in_deep_valley_price").getAsBigDecimal();
inDeepValley.setPrice(inDeepValleyPrice);
inDeepValley.setDigital(positiveDeepValley.multiply(inDeepValleyPrice));
inTotalIncome = inTotalIncome.add(inValley.getDigital());
inDeepValley.setTotal(inTotalIncome);
list.add(inDeepValley);
//收益-放-尖
EarningsCalculate outSharp = new EarningsCalculate();
BigDecimal reverseSharp = income.getBigDecimal("sum_e_reverse_sharp");
outSharp.setElec(reverseSharp);
outSharp.setType(1);
outSharp.setRateType(CommonConstant.RateType.TIP);
BigDecimal outSharpPrice = jsonPrice.get("out_sharp_price").getAsBigDecimal();
outSharp.setPrice(outSharpPrice);
outSharp.setDigital(reverseSharp.multiply(outSharpPrice));
outTotalIncome = outTotalIncome.add(outSharp.getDigital());
outSharp.setTotal(BigDecimal.ZERO);
list.add(outSharp);
//收益-放-峰
EarningsCalculate outPeak = new EarningsCalculate();
BigDecimal reversePeak = income.getBigDecimal("sum_e_reverse_peak");
outPeak.setElec(reversePeak);
outPeak.setType(1);
outPeak.setRateType(CommonConstant.RateType.PEAK);
BigDecimal outPeakPrice = jsonPrice.get("out_peak_price").getAsBigDecimal();
outPeak.setPrice(outPeakPrice);
outPeak.setDigital(reversePeak.multiply(outPeakPrice));
outTotalIncome = outTotalIncome.add(outPeak.getDigital());
outPeak.setTotal(BigDecimal.ZERO);
list.add(outPeak);
//收益-放-平
EarningsCalculate outFlat = new EarningsCalculate();
BigDecimal reverseFlat = income.getBigDecimal("sum_e_reverse_flat");
outFlat.setElec(reverseFlat);
outFlat.setType(1);
outFlat.setRateType(CommonConstant.RateType.FLAT);
BigDecimal outFlatPrice = jsonPrice.get("out_flat_price").getAsBigDecimal();
outFlat.setPrice(outFlatPrice);
outFlat.setDigital(reverseFlat.multiply(outFlatPrice));
outTotalIncome = outTotalIncome.add(outFlat.getDigital());
outFlat.setTotal(BigDecimal.ZERO);
list.add(outFlat);
//收益-放-谷
EarningsCalculate outValley = new EarningsCalculate();
BigDecimal reverseValley = income.getBigDecimal("sum_e_reverse_valley");
outValley.setElec(reverseValley);
outValley.setType(1);
outValley.setRateType(CommonConstant.RateType.VALLEY);
BigDecimal outValleyPrice = jsonPrice.get("out_valley_price").getAsBigDecimal();
outValley.setPrice(outValleyPrice);
outValley.setDigital(reverseValley.multiply(outValleyPrice));
outTotalIncome = outTotalIncome.add(outValley.getDigital());
outValley.setTotal(BigDecimal.ZERO);
list.add(outValley);
//收益-放-深谷
EarningsCalculate outDeepValley = new EarningsCalculate();
BigDecimal reverseDeepValley = income.getBigDecimal("sum_e_reverse_deep_valley");
outDeepValley.setElec(reverseDeepValley);
outDeepValley.setType(1);
outDeepValley.setRateType(CommonConstant.RateType.DEEP_VALLEY);
BigDecimal outDeepValleyPrice = jsonPrice.get("out_deep_valley_price").getAsBigDecimal();
outDeepValley.setPrice(outDeepValleyPrice);
outDeepValley.setDigital(reverseDeepValley.multiply(outDeepValleyPrice));
outTotalIncome = outTotalIncome.add(outDeepValley.getDigital());
outDeepValley.setTotal(outTotalIncome);
list.add(outDeepValley);
// 充电
ElecMeterValue charge = new ElecMeterValue();
BigDecimal sumEPositive = income.getBigDecimal("sum_e_positive");
charge.setDigital(sumEPositive);
charge.setType(DeviceTypeConstant.ELEC_METER_VALUE_TYPE.CHARGE);
charge.setStatus(CommonConstant.STATUS_FLAG);
elecList.add(charge);
// 放电
ElecMeterValue disCharge = new ElecMeterValue();
BigDecimal sumEReverse = income.getBigDecimal("sum_e_reverse");
disCharge.setDigital(sumEReverse);
disCharge.setType(DeviceTypeConstant.ELEC_METER_VALUE_TYPE.DISCHARGE);
disCharge.setStatus(CommonConstant.STATUS_FLAG);
elecList.add(disCharge);
}
if(elecList.size()>0){
//删除
elecMeterValueService.deleteByStationAndDay(stationId+10000,date,null);
elecList.forEach(eleMeter -> {
eleMeter.setGroupId(155);
eleMeter.setStationId(stationId+10000);
eleMeter.setCreateTime(new Date());
eleMeter.setDay(date);
//新增
elecMeterValueService.insert(eleMeter);
});
}
if(list.size()>0){
//删除
earningsCalculateMapper.deleteByStationAndDay(date,null,stationId+10000);
list.forEach(a->{
a.setGroupId(155);
a.setStationId(stationId+10000);
a.setCreateTime(new Date());
a.setDay(date);
a.setDiscount(BigDecimal.ONE);
//新增
earningsCalculateMapper.insertSelective(a);
});
}
});
});
}
}

View File

@ -27,7 +27,7 @@ public interface StationService {
List<StationRespVO> selectByIds(List<Integer> ids);
List<Station> selectStationsByIds(List<Integer> ids);
List<Station> selectStationsByIds(List<Integer> ids,String lang);
Station insertStation(StationReqVO vo);

View File

@ -1623,7 +1623,7 @@ public class DeviceServiceImpl implements DeviceService {
}
}else if(CommonConstant.THREE.equals(vo.getType())){
//导出电站数据
List<Station> list = stationService.selectStationsByIds(vo.getStationIds());
List<Station> list = stationService.selectStationsByIds(vo.getStationIds(),null);
String fileName = "station";
String sheetName = "data";
try {

View File

@ -6,6 +6,7 @@ import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import com.alibaba.excel.util.DateUtils;
import com.alibaba.excel.util.StringUtils;
import com.alibaba.fastjson.JSON;
import com.ho.business.constant.DeviceTypeConstant;
import com.ho.business.entity.*;
import com.ho.business.feignclient.UserFeignClient;
@ -24,6 +25,7 @@ import com.ho.business.vo.req.pcsStation.PcsStationReq;
import com.ho.business.vo.req.report.ReportReqVO;
import com.ho.business.vo.resp.CountEleData;
import com.ho.business.vo.resp.DeviceRespVO;
import com.ho.business.vo.resp.ShipStationRespVO;
import com.ho.business.vo.resp.cabin.EarningsCalculateCountResp;
import com.ho.business.vo.resp.cabin.EarningsCalculateResp;
import com.ho.business.vo.resp.colCount.ColCountResp;
@ -1403,6 +1405,16 @@ public class EarningsCalculateServiceImpl implements EarningsCalculateService {
revenueOverview.setStationName(station.getName());
revenueOverview.setCapacity(station.getCapacity());
revenueOverview.setOperationDays((int) operationDays);
if(station.getId()==11003 || station.getId()==10942 ||station.getId()==11006){
// 寄点电站数据
String mainKey = CommonConstant.SHIP_ENERGY_MAIN + station.getId();
String json = (String)redisService.get(mainKey);
ShipStationRespVO respVO = JSON.parseObject(json,ShipStationRespVO.class);
revenueOverview.setCharging(respVO.getPositivePowerSum()==null?BigDecimal.ZERO:BigDecimal.valueOf(respVO.getPositivePowerSum()));
revenueOverview.setDischarging(respVO.getReversePowerSum()==null?BigDecimal.ZERO:BigDecimal.valueOf(respVO.getReversePowerSum()));
revenueOverview.setTotalRevenue(respVO.getIncomeSum()==null?BigDecimal.ZERO:BigDecimal.valueOf(respVO.getIncomeSum()));
return revenueOverview;
}
List<RevenueOverviewData> list = getRevenueOverviewData(vo);

View File

@ -3,6 +3,7 @@ package com.ho.business.service.impl;
import cn.hutool.core.date.DateField;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSON;
import com.ho.business.constant.DeviceTypeConstant;
import com.ho.business.entity.Device;
import com.ho.business.entity.ElecMeterValue;
@ -17,6 +18,7 @@ import com.ho.business.vo.req.colCount.ColCountReq;
import com.ho.business.vo.resp.CountEleData;
import com.ho.business.vo.resp.DeviceRespVO;
import com.ho.business.vo.resp.ProvinceStation;
import com.ho.business.vo.resp.ShipStationRespVO;
import com.ho.business.vo.resp.colCount.ColCountResp;
import com.ho.business.vo.resp.iargeScreen.*;
import com.ho.business.vo.resp.profit.DayProfitType;
@ -282,6 +284,7 @@ public class IargeScreenShowServiceImpl implements IargeScreenShowService {
annualOverviewResp.setYestProfit(overviewProfit.getYestProfit()==null?null:overviewProfit.getYestProfit().multiply(new BigDecimal("10000")));
annualOverviewResp.setYearProfit(overviewProfit.getYearProfit()==null?null:overviewProfit.getYearProfit().multiply(new BigDecimal("10000")));
annualOverviewResp.setTotalProfit(overviewProfit.getTotalProfit()==null?null:overviewProfit.getTotalProfit().multiply(new BigDecimal("10000")));
annualOverviewResp.setTodayProfit(overviewProfit.getTodayProfit()==null?null:overviewProfit.getTodayProfit().multiply(new BigDecimal("10000")));
//时间当年
DateTime begin = DateUtil.beginOfYear(new Date());
String beginString = DateUtil.format(begin, CommonConstant.DATE_YMD);
@ -293,6 +296,19 @@ public class IargeScreenShowServiceImpl implements IargeScreenShowService {
annualOverviewResp.setTotalCharge(incomeShow1.getYearCharge());
annualOverviewResp.setTotalDischarge(incomeShow1.getYearDischarge());
}
// 寄点站点数据融合
stations.forEach(s->{
if(s.getId()==11003 || s.getId()==10942 || s.getId()==11006) {
// 寄点电站数据
String mainKey = CommonConstant.SHIP_ENERGY_MAIN + s.getId();
String json = (String) redisService.get(mainKey);
ShipStationRespVO respVO = JSON.parseObject(json, ShipStationRespVO.class);
// 日充
annualOverviewResp.setDayCharge(annualOverviewResp.getDayCharge().add(respVO.getPositivePowerToday()==null?BigDecimal.ZERO:BigDecimal.valueOf(respVO.getPositivePowerToday())));
// 日放
annualOverviewResp.setDayDischarge(annualOverviewResp.getDayDischarge().add(respVO.getReversePowerToday()==null?BigDecimal.ZERO:BigDecimal.valueOf(respVO.getReversePowerToday())));
}
});
return annualOverviewResp;
}
@ -1294,17 +1310,17 @@ public class IargeScreenShowServiceImpl implements IargeScreenShowService {
if (stationIds == null) {
return new AnnualOverviewResp();
}
List<Station> list = stationService.selectStationsByIds(stationIds);
List<Station> list = stationService.selectStationsByIds(stationIds,null);
AnnualOverviewResp annualOverviewResp = getOverviewDatas(list);
return annualOverviewResp;
}
@Override
public List<Subdata> getCommonRegionList(List<Integer> stationIds) {
public List<Subdata> getCommonRegionList(List<Integer> stationIds,String lang) {
if (stationIds == null) {
return new ArrayList<>();
}
List<Station> list = getCountStations(stationIds);
List<Station> list = getCountStations(stationIds,lang);
List<Subdata> regionList = new ArrayList<>();
Map<String, List<Station>> provinceMap = list.stream().filter(i -> i.getProvince() != null).collect(Collectors.groupingBy(Station::getProvince));
if (provinceMap.size() > CommonConstant.ONE) {
@ -1355,7 +1371,7 @@ public class IargeScreenShowServiceImpl implements IargeScreenShowService {
if (stationIds == null) {
return new EnergySavingRespVo();
}
List<Station> list = getCountStations(stationIds);
List<Station> list = getCountStations(stationIds,null);
return getEnergySavingRespVo(list);
}
@ -1364,7 +1380,7 @@ public class IargeScreenShowServiceImpl implements IargeScreenShowService {
if (stationIds == null) {
return new ArrayList<>();
}
List<Station> list = getCountStations(stationIds);
List<Station> list = getCountStations(stationIds,null);
return getProfitCurve(vo, list);
}
@ -1373,16 +1389,16 @@ public class IargeScreenShowServiceImpl implements IargeScreenShowService {
if (stationIds == null) {
return new ArrayList<>();
}
return getAnnualChartValues(getCountStations(stationIds));
return getAnnualChartValues(getCountStations(stationIds,null));
}
@Override
public List<Subdata> getCommonProfit(String beginString, String endString, List<Integer> stationIds) {
public List<Subdata> getCommonProfit(String beginString, String endString, List<Integer> stationIds,String lang) {
List<Subdata> subdata = new ArrayList<>();
if (stationIds == null) {
return subdata;
}
List<Station> countStations = getCountStations(stationIds);
List<Station> countStations = getCountStations(stationIds,lang);
if (countStations != null && !countStations.isEmpty()) {
if (countStations.size() >= CommonConstant.FIVE) {
subdata = getSubdata(beginString, endString, countStations);
@ -1400,12 +1416,12 @@ public class IargeScreenShowServiceImpl implements IargeScreenShowService {
}
@Override
public List<Subdata> getCommonEfficiencyDate(List<Integer> stationIds) {
public List<Subdata> getCommonEfficiencyDate(List<Integer> stationIds,String lang) {
List<Subdata> subdata = new ArrayList<>();
if (stationIds == null) {
return subdata;
}
List<Station> countStations = getCountStations(stationIds);
List<Station> countStations = getCountStations(stationIds,lang);
if (countStations != null && !countStations.isEmpty()) {
subdata = getEfficiencyDate(countStations);
// if (countStations.size() >= CommonConstant.FIVE) {
@ -1532,7 +1548,7 @@ public class IargeScreenShowServiceImpl implements IargeScreenShowService {
if(beginDate == null){
return annualOverviewResp;
}
Date date = DateUtil.yesterday();
Date date = DateUtil.date();
Date startDate = DateUtil.beginOfYear(beginDate);
Date endDate = DateUtil.endOfDay(date);
String begin = DateUtil.format(startDate, CommonConstant.DATE_YMD);
@ -1546,6 +1562,7 @@ public class IargeScreenShowServiceImpl implements IargeScreenShowService {
profitList.add(dayProfitType);
}
}
//计算总收益
Map<String, List<DayProfitType>> dayMap = profitList.stream().collect(Collectors.groupingBy(DayProfitType::getDay));
List<AnnualChartValue> yearProfitCurve = new ArrayList<>();
getAnnualOverviewResp(yearProfitCurve, dateTimes, CommonConstant.DATE_Y, dayMap);
@ -1554,6 +1571,7 @@ public class IargeScreenShowServiceImpl implements IargeScreenShowService {
yearProfit = yearProfit.add(chartValue.getProfit());
}
annualOverviewResp.setTotalProfit(yearProfit);
//计算年收益
startDate = DateUtil.beginOfYear(date);
List<DateTime> nowDateTime = DateUtil.rangeToList(startDate, endDate, DateField.MONTH);
List<AnnualChartValue> monthProfitCurve = new ArrayList<>();
@ -1563,6 +1581,18 @@ public class IargeScreenShowServiceImpl implements IargeScreenShowService {
monthProfit = monthProfit.add(chartValue.getProfit());
}
annualOverviewResp.setYearProfit(monthProfit);
// 计算今日收益
List<DateTime> todayDateTime = DateUtil.rangeToList(endDate, endDate, DateField.DAY_OF_MONTH);
List<AnnualChartValue> todayProfitCurve = new ArrayList<>();
getAnnualOverviewResp(todayProfitCurve, todayDateTime, CommonConstant.DATE_YMD, dayMap);
BigDecimal todayProfit = BigDecimal.ZERO;
for (AnnualChartValue chartValue : todayProfitCurve) {
todayProfit = todayProfit.add(chartValue.getProfit());
}
annualOverviewResp.setTodayProfit(todayProfit);
// 计算昨日收益
date = DateUtil.yesterday();
endDate = DateUtil.endOfDay(date);
List<DateTime> dayDateTime = DateUtil.rangeToList(endDate, endDate, DateField.DAY_OF_MONTH);
List<AnnualChartValue> dayProfitCurve = new ArrayList<>();
getAnnualOverviewResp(dayProfitCurve, dayDateTime, CommonConstant.DATE_YMD, dayMap);
@ -1606,12 +1636,13 @@ public class IargeScreenShowServiceImpl implements IargeScreenShowService {
}
}
BigDecimal result = dischargeProfit.subtract(chargeProfit).divide(new BigDecimal("10000"));
if (result.doubleValue() > 0.0) {
annualChartValue.setProfit(result);
} else {
log.info("{},大屏计算收益,放电收益小于充电收益",day);
annualChartValue.setProfit(BigDecimal.ZERO);
}
// if (result.doubleValue() > 0.0) {
// annualChartValue.setProfit(result);
// } else {
// log.info("{},大屏计算收益,放电收益小于充电收益",day);
// annualChartValue.setProfit(BigDecimal.ZERO);
// }
annualChartValue.setProfit(result);
annualChartValue.setTime(day);
curveResult.add(annualChartValue);
}
@ -1702,17 +1733,17 @@ public class IargeScreenShowServiceImpl implements IargeScreenShowService {
* @return
*/
@Override
public List<Station> getCountStations(List<Integer> stationIds) {
List<Station> list = stationService.selectStationsByIds(stationIds);
public List<Station> getCountStations(List<Integer> stationIds,String lang) {
List<Station> list = stationService.selectStationsByIds(stationIds,lang);
List<Station> oneList = list.stream().filter(i -> CommonConstant.ONE.equals(i.getStatus())).collect(Collectors.toList());
return oneList;
}
@Override
public List<Subdata> getCommonCapacity(List<Integer> stationIds) {
public List<Subdata> getCommonCapacity(List<Integer> stationIds,String lang) {
List<Subdata> subDataList = new ArrayList<>();
if (stationIds != null) {
List<Station> stations = getCountStations(stationIds);
List<Station> stations = getCountStations(stationIds,lang);
subDataList = getSubdataList(stations);
}
return subDataList;

View File

@ -557,7 +557,7 @@ public class OpenStationServiceImpl implements OpenStationService {
public void exportEleData(PcsStationReq req, HttpServletResponse response) {
try {
List<Integer> stationIds = req.getStationIds();
List<Station> stations = stationService.selectStationsByIds(stationIds);
List<Station> stations = stationService.selectStationsByIds(stationIds,null);
Map<Integer, String> idNameMap = getStationMap(stations);
List<Map<String, Object>> sheetsList = new ArrayList<>();
//汇总
@ -685,7 +685,7 @@ public class OpenStationServiceImpl implements OpenStationService {
PageResult pageResult = new PageResult<>();
try {
List<Integer> stationIds = req.getStationIds();
List<Station> stations = stationService.selectStationsByIds(stationIds);
List<Station> stations = stationService.selectStationsByIds(stationIds,null);
Map<Integer, String> idNameMap = stations.stream().collect(Collectors.toMap(Station::getId, Station::getName));
List<PcsElecData> result = new ArrayList<>();
String name = null;
@ -720,7 +720,7 @@ public class OpenStationServiceImpl implements OpenStationService {
Object obj = new Object();
try {
List<Integer> stationIds = req.getStationIds();
List<Station> stations = stationService.selectStationsByIds(stationIds);
List<Station> stations = stationService.selectStationsByIds(stationIds,null);
Map<Integer, String> idNameMap = getStationMap(stations);
//汇总
BigDecimal charge = BigDecimal.ZERO;
@ -857,7 +857,7 @@ public class OpenStationServiceImpl implements OpenStationService {
Object obj = new Object();
try {
List<Integer> stationIds = req.getStationIds();
List<Station> stations = stationService.selectStationsByIds(stationIds);
List<Station> stations = stationService.selectStationsByIds(stationIds,null);
Map<Integer, String> idNameMap = getStationMap(stations);
//汇总
String segmentType = req.getSegmentType();

View File

@ -197,6 +197,7 @@ public class OutApiServiceImpl implements OutApiService {
SysSubDictVO sysSubDictVO = new SysSubDictVO();
sysSubDictVO.setType(CommonConstant.CF_FROZEN);
Map<String, String> cfMap = userFeignClient.getSysSubDict(sysSubDictVO);
stations = stations.stream().filter(i->i.getId()!=11003 && i.getId()!=10942 && i.getId()!=11006).collect(Collectors.toList());
for (Station station : stations) {
try {
//先删除站的当日数据
@ -464,7 +465,7 @@ public class OutApiServiceImpl implements OutApiService {
ids.add(418);//新凤鸣电站
ids.add(551);//江苏暨阳电力科技发展有限公司1号柜
ids.add(564);//江苏暨阳电力科技发展有限公司2号柜
List<Station> stations = stationService.selectStationsByIds(ids);
List<Station> stations = stationService.selectStationsByIds(ids,null);
String deviceType = DeviceTypeConstant.PCS;
for (Station station : stations) {
//先删除站的当日数据

View File

@ -4,6 +4,7 @@ import cn.hutool.core.date.DateField;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.ho.business.constant.DeviceTypeConstant;
import com.ho.business.entity.*;
@ -1042,6 +1043,14 @@ public class StationHomeServiceImpl implements StationHomeService {
dailyDischargeElec = new BigDecimal(dailyDischargeElecStr);
pcsElecData.setChargeElec(dailyChargeElec);
pcsElecData.setDischargeElec(dailyDischargeElec);
if(req.getStationId()==11003 || req.getStationId()==10942 || req.getStationId()==11006){
// 寄点电站数据
String mainKey = CommonConstant.SHIP_ENERGY_MAIN + req.getStationId();
String json = (String)redisService.get(mainKey);
ShipStationRespVO vo = JSON.parseObject(json,ShipStationRespVO.class);
pcsElecData.setChargeElec(vo.getPositivePowerToday()==null?BigDecimal.ZERO:BigDecimal.valueOf(vo.getPositivePowerToday()));
pcsElecData.setDischargeElec(vo.getReversePowerToday()==null?BigDecimal.ZERO:BigDecimal.valueOf(vo.getReversePowerToday()));
}
}
}
}

View File

@ -213,7 +213,7 @@ public class StationServiceImpl implements StationService {
@Override
public List<StationRespVO> selectByIds(List<Integer> ids) {
List<Station> stations = stationMapper.selectByIds(ids);
List<Station> stations = stationMapper.selectByIds(ids,null);
List<StationRespVO> stationRespVOS = getStationRespVOS(stations);
if (stationRespVOS != null) {
for (StationRespVO stationRespVO : stationRespVOS) {
@ -235,8 +235,8 @@ public class StationServiceImpl implements StationService {
}
@Override
public List<Station> selectStationsByIds(List<Integer> ids) {
List<Station> stations = stationMapper.selectByIds(ids);
public List<Station> selectStationsByIds(List<Integer> ids,String lang) {
List<Station> stations = stationMapper.selectByIds(ids,lang);
return stations;
}

View File

@ -16,6 +16,18 @@
electricity_type,customer_type,voltage_level,batch_number,nation
</sql>
<sql id="Base_Column_List1">
id
,pid,group_id,dept_id,
name_en `name`,name_en,address,address_en,longitude,
latitude,capacity,rate_power,
status,type,create_time,
contact,contact_details,grid_time,
update_time,deleted,is_enable,cabin_num,district,ad_code,is_daily_count,
topology_type,cupboard_type,plan_version,inverter_flag,icc_id,province_en province,city,
electricity_type,customer_type,voltage_level,batch_number,nation
</sql>
<select id="selectByName" resultType="com.ho.business.entity.Station">
select
<include refid="Base_Column_List"/>
@ -50,7 +62,14 @@
<select id="selectByIds" resultType="com.ho.business.entity.Station">
select
<include refid="Base_Column_List"/>
<choose>
<when test="lang != null and lang=='en_US' ">
<include refid="Base_Column_List1"></include>
</when>
<otherwise>
<include refid="Base_Column_List"></include>
</otherwise>
</choose>
from station
<where>
<if test="ids != null and ids.size() != 0">

View File

@ -0,0 +1,47 @@
package com.ho.business.controller;
import com.ho.business.service.BoulderEnergyService;
import com.ho.common.tools.annotation.TokenIgnore;
import com.ho.common.tools.constant.ContextConstant;
import com.ho.common.tools.exception.DataResult;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RequestMapping(ContextConstant.BUSINESS + "boulderEnergyStation")
@RestController
@Api(tags = "业务模块-中车能源电站管理")
@Slf4j
public class BoulderEnergyController {
@Autowired
BoulderEnergyService boulderEnergyService;
@PostMapping("getToken")
@ApiOperation(value = "获取token")
@TokenIgnore
public DataResult<String> getToken() {
return DataResult.success(boulderEnergyService.getToken());
}
@PostMapping("getBoulderEleIncome")
@ApiOperation(value = "中车-统计缓存充放电、及收益数据")
@TokenIgnore
public DataResult getBoulderEleIncome(@RequestBody(required = false) String beginTime) {
log.info("参数: {} ", beginTime);
// beginTime ==null 时统计昨日充放电、及收益数据
// beginTime =null 时统计beginTime充放电、及收益数据
boulderEnergyService.getBoulderEleIncome(beginTime);
if(beginTime!=null){
//beginTime =null 缓存中车电站累计数据
boulderEnergyService.getCacheBoulderData();
}
return DataResult.success();
}
}

View File

@ -13,6 +13,7 @@ import com.ho.business.vo.resp.iargeScreen.EnergySavingRespVo;
import com.ho.business.vo.resp.iargeScreen.Subdata;
import com.ho.common.tools.annotation.CommonLargeScreenToken;
import com.ho.common.tools.annotation.TokenIgnore;
import com.ho.common.tools.constant.CommonConstant;
import com.ho.common.tools.constant.ContextConstant;
import com.ho.common.tools.constant.RedisKeyConstant;
import com.ho.common.tools.entity.SimpleUser;
@ -20,6 +21,7 @@ import com.ho.common.tools.entity.WeatherRespVo;
import com.ho.common.tools.exception.DataResult;
import com.ho.common.tools.service.RedisService;
import com.ho.common.tools.util.BigDecimalUtil;
import com.ho.common.tools.util.TranslateUtils;
import com.ho.flow.vo.resp.event.EventDayNum;
import com.ho.user.api.entity.SysDept;
import com.ho.user.api.vo.req.QueryDeptReqVO;
@ -33,6 +35,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
@ -174,9 +177,17 @@ public class IargeScreenShowController {
@PostMapping("/newWeather")
@ApiOperation(value = "新大屏天气接口")
@TokenIgnore
public DataResult<WeatherRespVo> newWeather() {
public DataResult<WeatherRespVo> newWeather(HttpServletRequest request) {
String lang =request.getHeader(RedisKeyConstant.User.LANG);
String key = RedisKeyConstant.WEATHER_PROVINCE_CITY + adCode;
WeatherRespVo info = (WeatherRespVo) redisService.get(key);
if(CommonConstant.EN_US.equals(lang)){
try {
info.setSkyCon(TranslateUtils.translate(info.getSkyCon()));
} catch (IOException e) {
throw new RuntimeException(e);
}
}
return DataResult.success(info);
}
@ -199,7 +210,8 @@ public class IargeScreenShowController {
@TokenIgnore
@CommonLargeScreenToken
public DataResult<List<Subdata>> getCommonRegionalDistribution(HttpServletRequest request) {
List<Subdata> regionList = iargeScreenShowService.getCommonRegionList(getSimpleUser(request));
String lang =request.getHeader(RedisKeyConstant.User.LANG);
List<Subdata> regionList = iargeScreenShowService.getCommonRegionList(getSimpleUser(request),lang);
regionList.sort(Comparator.comparing((Subdata::getRegionValue)).reversed());
return DataResult.success(regionList);
}
@ -243,7 +255,8 @@ public class IargeScreenShowController {
@TokenIgnore
@CommonLargeScreenToken
public DataResult<List<Subdata>> getCommonIncomeList(HttpServletRequest request) {
List<Subdata> regionList = iargeScreenShowService.getCommonProfit(null, null, getSimpleUser(request));
String lang =request.getHeader(RedisKeyConstant.User.LANG);
List<Subdata> regionList = iargeScreenShowService.getCommonProfit(null, null, getSimpleUser(request),lang);
if (regionList.size() > maxSize) {
regionList = regionList.subList(0, maxSize);
}
@ -259,7 +272,8 @@ public class IargeScreenShowController {
@TokenIgnore
@CommonLargeScreenToken
public DataResult<List<Subdata>> getCommonEfficiencyDate(HttpServletRequest request) {
List<Subdata> efficiencyList = iargeScreenShowService.getCommonEfficiencyDate(getSimpleUser(request));
String lang =request.getHeader(RedisKeyConstant.User.LANG);
List<Subdata> efficiencyList = iargeScreenShowService.getCommonEfficiencyDate(getSimpleUser(request),lang);
return DataResult.success(efficiencyList);
}
@ -271,7 +285,7 @@ public class IargeScreenShowController {
List<Integer> ids = getSimpleUser(request);
List<Station> stations = new ArrayList<>();
if (ids != null) {
stations = iargeScreenShowService.getCountStations(ids);
stations = iargeScreenShowService.getCountStations(ids,null);
}
return DataResult.success(stations);
}
@ -281,7 +295,8 @@ public class IargeScreenShowController {
@TokenIgnore
@CommonLargeScreenToken
public DataResult<List<Subdata>> getCommonCapacity(HttpServletRequest request) {
List<Subdata> regionList = iargeScreenShowService.getCommonCapacity(getSimpleUser(request));
String lang =request.getHeader(RedisKeyConstant.User.LANG);
List<Subdata> regionList = iargeScreenShowService.getCommonCapacity(getSimpleUser(request),lang);
return DataResult.success(regionList);
}
@ -339,8 +354,9 @@ public class IargeScreenShowController {
@PostMapping("getZhongZiDistribution")
@ApiOperation(value = "中自电站区域分布")
@TokenIgnore
public DataResult<List<Subdata>> getZhongZiDistribution(@RequestBody CockpitReqVO vo) {
List<Subdata> regionList = iargeScreenShowService.getCommonRegionList((getByDeptId(vo.getDeptId())));
public DataResult<List<Subdata>> getZhongZiDistribution(@RequestBody CockpitReqVO vo,HttpServletRequest request) {
String lang =request.getHeader(RedisKeyConstant.User.LANG);
List<Subdata> regionList = iargeScreenShowService.getCommonRegionList((getByDeptId(vo.getDeptId())),lang);
regionList.sort(Comparator.comparing((Subdata::getRegionValue)).reversed());
return DataResult.success(regionList);
}
@ -379,8 +395,9 @@ public class IargeScreenShowController {
@PostMapping("getZhongZiIncomeList")
@ApiOperation(value = "中自电站收益排名")
@TokenIgnore
public DataResult<List<Subdata>> getZhongZiIncomeList(@RequestBody CockpitReqVO vo) {
List<Subdata> regionList = iargeScreenShowService.getCommonProfit(null, null, getByDeptId(vo.getDeptId()));
public DataResult<List<Subdata>> getZhongZiIncomeList(@RequestBody CockpitReqVO vo,HttpServletRequest request) {
String lang =request.getHeader(RedisKeyConstant.User.LANG);
List<Subdata> regionList = iargeScreenShowService.getCommonProfit(null, null, getByDeptId(vo.getDeptId()),lang);
if (regionList.size() > maxSize) {
regionList = regionList.subList(0, maxSize);
}
@ -394,8 +411,9 @@ public class IargeScreenShowController {
@PostMapping("getZhongZiEfficiencyDate")
@ApiOperation(value = "中自系统转换率")
@TokenIgnore
public DataResult<List<Subdata>> getZhongZiEfficiencyDate(@RequestBody CockpitReqVO vo) {
List<Subdata> efficiencyList = iargeScreenShowService.getCommonEfficiencyDate(getByDeptId(vo.getDeptId()));
public DataResult<List<Subdata>> getZhongZiEfficiencyDate(@RequestBody CockpitReqVO vo,HttpServletRequest request) {
String lang =request.getHeader(RedisKeyConstant.User.LANG);
List<Subdata> efficiencyList = iargeScreenShowService.getCommonEfficiencyDate(getByDeptId(vo.getDeptId()),lang);
return DataResult.success(efficiencyList);
}
@ -406,7 +424,7 @@ public class IargeScreenShowController {
List<Integer> ids = getByDeptId(vo.getDeptId());
List<Station> stations = new ArrayList<>();
if (ids != null) {
stations = iargeScreenShowService.getCountStations(ids);
stations = iargeScreenShowService.getCountStations(ids,null);
}
return DataResult.success(stations);
}
@ -414,8 +432,9 @@ public class IargeScreenShowController {
@PostMapping("getZhongZiCapacity")
@ApiOperation(value = "中自装机容量倒排")
@TokenIgnore
public DataResult<List<Subdata>> getZhongZiCapacity(@RequestBody CockpitReqVO vo) {
List<Subdata> regionList = iargeScreenShowService.getCommonCapacity(getByDeptId(vo.getDeptId()));
public DataResult<List<Subdata>> getZhongZiCapacity(@RequestBody CockpitReqVO vo,HttpServletRequest request) {
String lang =request.getHeader(RedisKeyConstant.User.LANG);
List<Subdata> regionList = iargeScreenShowService.getCommonCapacity(getByDeptId(vo.getDeptId()),lang);
return DataResult.success(regionList);
}

View File

@ -1,6 +1,8 @@
package com.ho.business.controller;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.ho.business.constant.DeviceTypeConstant;
import com.ho.business.entity.Station;
import com.ho.business.service.*;
@ -10,6 +12,7 @@ import com.ho.business.vo.req.StationReq;
import com.ho.business.vo.req.dynamicConfig.DynamicConfigQuery;
import com.ho.business.vo.req.pcsStation.PcsStationReq;
import com.ho.business.vo.resp.DeviceRespVO;
import com.ho.business.vo.resp.ShipStationRespVO;
import com.ho.business.vo.resp.cabin.CircleCtrlResp;
import com.ho.business.vo.resp.cabin.EarningsCalculateCountResp;
import com.ho.business.vo.resp.openStationHome.OpenStationMiddle;
@ -44,6 +47,8 @@ import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.math.BigDecimal;
import java.text.ParseException;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.stream.Collectors;
@ -106,6 +111,38 @@ public class OpenStationController {
public DataResult<List<NewRealTimeCurveVo>> realtimeCurve(@RequestBody StationReq stationReq) {
log.info("realtimeCurve.stationRealtimeCurve:" + stationReq);
List<NewRealTimeCurveVo> resList = stationHomeService.getRealtimeCurve(stationReq);
// 寄点电站功率、soc曲线
if(stationReq.getStationId()==11003 || stationReq.getStationId()==10942 || stationReq.getStationId()==11006){
// 寄点电站数据
String mainKey = CommonConstant.SHIP_ENERGY_MAIN + stationReq.getStationId();
String json = (String)redisService.get(mainKey);
ShipStationRespVO vo = JSON.parseObject(json,ShipStationRespVO.class);
JSONArray historyDataList = vo.getHistoryDataList();
if(historyDataList!=null){
NewRealTimeCurveVo soc = new NewRealTimeCurveVo();
soc.setName("SOC");
List<StationHomeRespVo> soclist =new ArrayList<>();
NewRealTimeCurveVo p = new NewRealTimeCurveVo();
p.setName("实时功率");
List<StationHomeRespVo> plist =new ArrayList<>();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(CommonConstant.DATE);
historyDataList.forEach(i->{
JSONObject obj = (JSONObject) i;
StationHomeRespVo socCurve = new StationHomeRespVo();
socCurve.setDate(ZonedDateTime.parse(obj.getString("record_time")).format(formatter));
socCurve.setDigital(obj.getBigDecimal("soc"));
soclist.add(socCurve);
StationHomeRespVo pCurve = new StationHomeRespVo();
pCurve.setDate(ZonedDateTime.parse(obj.getString("record_time")).format(formatter));
pCurve.setDigital(obj.getBigDecimal("p_total"));
plist.add(pCurve);
});
soc.setList(soclist);
p.setList(plist);
resList.add(soc);
resList.add(p);
}
}
//返回值的BigDecimal类型保留两位小数
for (NewRealTimeCurveVo newRealTimeCurveVo : resList) {
List<StationHomeRespVo> list = newRealTimeCurveVo.getList();
@ -221,6 +258,21 @@ public class OpenStationController {
req.setDeviceType(deviceType);
}
PcsTotalData data = stationHomeService.getPcsTotalData(req);
if(req.getStationId()==11003 || req.getStationId()==10942 || req.getStationId()==11006){
// 寄点电站数据
String mainKey = CommonConstant.SHIP_ENERGY_MAIN + req.getStationId();
String json = (String)redisService.get(mainKey);
ShipStationRespVO vo = JSON.parseObject(json,ShipStationRespVO.class);
// 数据转换
data.setTotalChargeElec(vo.getPositivePowerSum()==null?BigDecimal.ZERO:BigDecimal.valueOf(vo.getPositivePowerSum()));
data.setTotalDischargeElec(vo.getReversePowerSum()==null?BigDecimal.ZERO:BigDecimal.valueOf(vo.getReversePowerSum()));
data.setDailyChargeElec(vo.getPositivePowerToday()==null?BigDecimal.ZERO:BigDecimal.valueOf(vo.getPositivePowerToday()));
data.setDailyDischargeElec(vo.getReversePowerToday()==null?BigDecimal.ZERO:BigDecimal.valueOf(vo.getReversePowerToday()));
data.setCurrentPower(vo.getRealTimePower()==null?BigDecimal.ZERO:BigDecimal.valueOf(vo.getRealTimePower()));
if(data.getTotalChargeElec().compareTo(BigDecimal.ZERO)>0){
data.setSystemEfficiency(data.getTotalDischargeElec().divide(data.getTotalChargeElec(), 4, BigDecimal.ROUND_HALF_UP));
}
}
BigDecimal systemEfficiency = data.getSystemEfficiency();
bigDecimalUtil.keepTwoDecimalPlaces(data);
bigDecimalUtil.ifIsNUll(data);

View File

@ -219,7 +219,7 @@ public class OuterApiController {
@PostMapping("selectByStationIds")
@TokenIgnore
public DataResult<List<Station>> selectByStationIds(@RequestBody List<Integer> ids) {
List<Station> stations = stationService.selectStationsByIds(ids);
List<Station> stations = stationService.selectStationsByIds(ids,null);
return DataResult.success(stations);
}

View File

@ -0,0 +1,51 @@
package com.ho.business.controller;
import com.ho.business.service.ShipEnergyService;
import com.ho.common.tools.annotation.TokenIgnore;
import com.ho.common.tools.constant.ContextConstant;
import com.ho.common.tools.exception.DataResult;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RequestMapping(ContextConstant.BUSINESS + "shipEnergyStation")
@RestController
@Api(tags = "业务模块-寄点能源电站管理")
public class ShipEnergyController {
@Autowired
ShipEnergyService shipEnergyService;
@PostMapping("add")
@ApiOperation(value = "新增电站接口")
@TokenIgnore
public DataResult add() {
shipEnergyService.addShipEnergyStation();
return DataResult.success();
}
@PostMapping("getMainTotal")
@ApiOperation(value = "获取主监控汇总信息")
@TokenIgnore
public DataResult getMainTotal() {
shipEnergyService.getShipEnergyTotal();
return DataResult.success();
}
@PostMapping("getStationIncomeHis")
@ApiOperation(value = "获取寄点电站历史收益")
@TokenIgnore
public DataResult getStationIncomeHis(@RequestBody(required = false) String beginTime) {
shipEnergyService.getStationIncomeHis(beginTime);
return DataResult.success();
}
}

View File

@ -79,7 +79,7 @@ inverter:
largeScreen:
#收益系数
income: 0.6
weatherCode: 510105
weatherCode: 510117
#线上环境redis密码
openRedis:

View File

@ -146,6 +146,16 @@
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
</dependency>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.12.0</version>
</dependency>
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20231013</version>
</dependency>
</dependencies>

View File

@ -994,4 +994,24 @@ public interface CommonConstant {
String CF_FROZEN = "cfFrozen";
//将数据库统配符合“_”变成普通字符
String JOIN_STATION_ID = "\\_";
String EN_US="en_US";
interface HttpCode {
// 调用成功code
Integer SUCCESS_CODE = 200;
}
/**
* 寄点 token 缓存 key
*/
String SHIP_ENERGY_TOKEN_KEY = "ShipEnergyToken";
/**
* 中车 token 缓存 key
*/
String BOULDER_ENERGY_TOKEN_KEY = "BoulderEnergyToken";
/**
* 监控数据
*/
String SHIP_ENERGY_MAIN = "ShipEnergyMain:";
}

View File

@ -0,0 +1,342 @@
package com.ho.common.tools.util;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
import java.util.StringJoiner;
/**
* HTTP工具类 - 支持GET/POST请求支持表单和JSON传参
*/
public class HttpUtils {
/**
* 连接超时时间(毫秒)
*/
private static final int CONNECT_TIMEOUT = 10000;
/**
* 读取超时时间(毫秒)
*/
private static final int READ_TIMEOUT = 30000;
/**
* 发送GET请求表单参数模式
*
* @param url 请求URL
* @param params 表单参数
* @return 响应字符串
* @throws IOException 网络异常
*/
public static String getWithForm(String url, Map<String, String> params) throws IOException {
return get(url, buildFormParams(params), "application/x-www-form-urlencoded");
}
/**
* 发送GET请求JSON参数模式
*
* @param url 请求URL
* @param jsonParams JSON参数字符串
* @return 响应字符串
* @throws IOException 网络异常
*/
public static String getWithJson(String url, String jsonParams) throws IOException {
// 注意GET请求通常不支持请求体中的JSON参数
// 但某些API可能支持这里将其作为查询参数传递
Map<String, String> params = new HashMap<>();
params.put("json", jsonParams);
return get(url, buildFormParams(params), "application/x-www-form-urlencoded");
}
/**
* 发送POST请求表单参数模式
*
* @param url 请求URL
* @param params 表单参数
* @return 响应字符串
* @throws IOException 网络异常
*/
public static String postWithForm(String url, Map<String, String> params) throws IOException {
return post(url, buildFormParams(params), "application/x-www-form-urlencoded");
}
/**
* 发送POST请求JSON参数模式
*
* @param url 请求URL
* @param jsonParams JSON参数字符串
* @return 响应字符串
* @throws IOException 网络异常
*/
public static String postWithJson(String url, String jsonParams) throws IOException {
return post(url, jsonParams, "application/json; charset=utf-8");
}
/**
* 发送POST请求JSON参数模式使用Map自动转换为JSON
*
* @param url 请求URL
* @param params 参数Map
* @return 响应字符串
* @throws IOException 网络异常
*/
public static String postWithJson(String url, Map<String, Object> params) throws IOException {
String jsonParams = mapToJson(params);
return postWithJson(url, jsonParams);
}
/**
* 发送GET请求基础方法
*/
private static String get(String url, String queryParams, String contentType) throws IOException {
String fullUrl = url;
if (queryParams != null && !queryParams.isEmpty()) {
fullUrl = url + "?" + queryParams;
}
HttpURLConnection connection = null;
BufferedReader reader = null;
try {
URL requestUrl = new URL(fullUrl);
connection = (HttpURLConnection) requestUrl.openConnection();
connection.setRequestMethod("GET");
connection.setConnectTimeout(CONNECT_TIMEOUT);
connection.setReadTimeout(READ_TIMEOUT);
connection.setRequestProperty("Content-Type", contentType);
connection.setRequestProperty("User-Agent", "HttpUtils/1.0");
int responseCode = connection.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_OK) {
reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), StandardCharsets.UTF_8));
return readResponse(reader);
} else {
reader = new BufferedReader(new InputStreamReader(connection.getErrorStream(), StandardCharsets.UTF_8));
String errorResponse = readResponse(reader);
throw new IOException("HTTP GET Request Failed with Error Code: " + responseCode + ", Response: " + errorResponse);
}
} finally {
reader.close();
connection.disconnect();
}
}
/**
* 发送POST请求基础方法
*/
private static String post(String url, String requestBody, String contentType) throws IOException {
HttpURLConnection connection = null;
OutputStream outputStream = null;
BufferedReader reader = null;
try {
URL requestUrl = new URL(url);
connection = (HttpURLConnection) requestUrl.openConnection();
connection.setRequestMethod("POST");
connection.setConnectTimeout(CONNECT_TIMEOUT);
connection.setReadTimeout(READ_TIMEOUT);
connection.setDoOutput(true);
connection.setRequestProperty("Content-Type", contentType);
connection.setRequestProperty("User-Agent", "HttpUtils/1.0");
connection.setRequestProperty("Accept", "application/json, text/plain, */*");
// 写入请求体
if (requestBody != null && !requestBody.isEmpty()) {
outputStream = connection.getOutputStream();
outputStream.write(requestBody.getBytes(StandardCharsets.UTF_8));
outputStream.flush();
}
int responseCode = connection.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_OK ||
responseCode == HttpURLConnection.HTTP_CREATED ||
responseCode == HttpURLConnection.HTTP_ACCEPTED) {
reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), StandardCharsets.UTF_8));
return readResponse(reader);
} else {
reader = new BufferedReader(new InputStreamReader(connection.getErrorStream(), StandardCharsets.UTF_8));
String errorResponse = readResponse(reader);
throw new IOException("HTTP POST Request Failed with Error Code: " + responseCode + ", Response: " + errorResponse);
}
} finally {
outputStream.close();
reader.close();
connection.connect();
}
}
/**
* 构建表单参数字符串
*/
private static String buildFormParams(Map<String, String> params) throws UnsupportedEncodingException {
if (params == null || params.isEmpty()) {
return "";
}
StringJoiner joiner = new StringJoiner("&");
for (Map.Entry<String, String> entry : params.entrySet()) {
String encodedKey = URLEncoder.encode(entry.getKey(), StandardCharsets.UTF_8.toString());
String encodedValue = URLEncoder.encode(entry.getValue(), StandardCharsets.UTF_8.toString());
joiner.add(encodedKey + "=" + encodedValue);
}
return joiner.toString();
}
/**
* 将Map转换为JSON字符串简单实现实际项目中建议使用Jackson/Gson等库
*/
public static String mapToJson(Map<String, Object> params) {
if (params == null || params.isEmpty()) {
return "{}";
}
StringBuilder jsonBuilder = new StringBuilder("{");
boolean first = true;
for (Map.Entry<String, Object> entry : params.entrySet()) {
if (!first) {
jsonBuilder.append(",");
}
first = false;
jsonBuilder.append("\"").append(escapeJson(entry.getKey())).append("\":");
Object value = entry.getValue();
if (value == null) {
jsonBuilder.append("null");
} else if (value instanceof String) {
jsonBuilder.append("\"").append(escapeJson((String) value)).append("\"");
} else if (value instanceof Number || value instanceof Boolean) {
jsonBuilder.append(value);
} else {
// 复杂对象需要序列化,这里简单处理
jsonBuilder.append("\"").append(escapeJson(value.toString())).append("\"");
}
}
jsonBuilder.append("}");
return jsonBuilder.toString();
}
/**
* 转义JSON特殊字符
*/
private static String escapeJson(String input) {
if (input == null) {
return "";
}
return input.replace("\\", "\\\\")
.replace("\"", "\\\"")
.replace("\b", "\\b")
.replace("\f", "\\f")
.replace("\n", "\\n")
.replace("\r", "\\r")
.replace("\t", "\\t");
}
/**
* 读取响应内容
*/
private static String readResponse(BufferedReader reader) throws IOException {
StringBuilder response = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
response.append(line);
}
return response.toString();
}
/**
* 发送带请求头的GET请求扩展方法
*/
public static String getWithHeaders(String url, Map<String, String> params, Map<String, String> headers) throws IOException {
String fullUrl = url;
if (params != null && !params.isEmpty()) {
fullUrl = url + "?" + buildFormParams(params);
}
HttpURLConnection connection = null;
BufferedReader reader = null;
try {
URL requestUrl = new URL(fullUrl);
connection = (HttpURLConnection) requestUrl.openConnection();
connection.setRequestMethod("GET");
connection.setConnectTimeout(CONNECT_TIMEOUT);
connection.setReadTimeout(READ_TIMEOUT);
connection.setRequestProperty("User-Agent", "HttpUtils/1.0");
// 添加自定义请求头
if (headers != null) {
for (Map.Entry<String, String> header : headers.entrySet()) {
connection.setRequestProperty(header.getKey(), header.getValue());
}
}
int responseCode = connection.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_OK) {
reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), StandardCharsets.UTF_8));
return readResponse(reader);
} else {
reader = new BufferedReader(new InputStreamReader(connection.getErrorStream(), StandardCharsets.UTF_8));
String errorResponse = readResponse(reader);
throw new IOException("HTTP GET Request Failed with Error Code: " + responseCode + ", Response: " + errorResponse);
}
} finally {
reader.close();
connection.disconnect();
}
}
/**
* 发送带请求头的POST请求扩展方法
*/
public static String postWithHeaders(String url, String requestBody, String contentType, Map<String, String> headers) throws IOException {
HttpURLConnection connection = null;
OutputStream outputStream = null;
BufferedReader reader = null;
try {
URL requestUrl = new URL(url);
connection = (HttpURLConnection) requestUrl.openConnection();
connection.setRequestMethod("POST");
connection.setConnectTimeout(CONNECT_TIMEOUT);
connection.setReadTimeout(READ_TIMEOUT);
connection.setDoOutput(true);
connection.setRequestProperty("Content-Type", contentType);
connection.setRequestProperty("User-Agent", "HttpUtils/1.0");
// 添加自定义请求头
if (headers != null) {
for (Map.Entry<String, String> header : headers.entrySet()) {
connection.setRequestProperty(header.getKey(), header.getValue());
}
}
// 写入请求体
if (requestBody != null && !requestBody.isEmpty()) {
outputStream = connection.getOutputStream();
outputStream.write(requestBody.getBytes(StandardCharsets.UTF_8));
outputStream.flush();
}
int responseCode = connection.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_OK ||
responseCode == HttpURLConnection.HTTP_CREATED ||
responseCode == HttpURLConnection.HTTP_ACCEPTED) {
reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), StandardCharsets.UTF_8));
return readResponse(reader);
} else {
reader = new BufferedReader(new InputStreamReader(connection.getErrorStream(), StandardCharsets.UTF_8));
String errorResponse = readResponse(reader);
throw new IOException("HTTP POST Request Failed with Error Code: " + responseCode + ", Response: " + errorResponse);
}
} finally {
outputStream.close();
reader.close();
connection.disconnect();
}
}
}

View File

@ -0,0 +1,79 @@
package com.ho.common.tools.util;
import lombok.extern.slf4j.Slf4j;
import okhttp3.*;
import org.json.JSONArray;
import org.json.JSONObject;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
/**
* @author kerwin
*/
@Slf4j
public class TranslateUtils {
public static final String API_KEY = "hNDgbvTzhQymYvVvcAhCWEkh";
public static final String SECRET_KEY = "tkgqkVDEJi8xBSrToNPdJdV2CYFNZM31";
public static final OkHttpClient HTTP_CLIENT = new OkHttpClient().newBuilder().readTimeout(300, TimeUnit.SECONDS).build();
// 静态翻译方法:输入待翻译文本,返回目标语言文本
public static String translate(String text) throws IOException {
MediaType mediaType = MediaType.parse("application/json");
// 动态构建请求体(支持任意文本)
String jsonBody = String.format("{\"from\":\"zh\",\"to\":\"en\",\"q\":\"%s\"}", text);
RequestBody body = RequestBody.create(mediaType, jsonBody);
Request request = new Request.Builder()
.url("https://aip.baidubce.com/rpc/2.0/mt/texttrans/v1?access_token=" + getAccessToken())
.post(body)
.addHeader("Content-Type", "application/json")
.addHeader("Accept", "application/json")
.build();
try (Response response = HTTP_CLIENT.newCall(request).execute()) {
String responseBody = response.body().string();
// 解析JSON获取dst值
return parseDstFromResponse(responseBody);
}
}
// 解析JSON响应并提取dst
private static String parseDstFromResponse(String jsonResponse) {
JSONObject root = new JSONObject(jsonResponse);
JSONObject result = root.getJSONObject("result");
JSONArray transResult = result.getJSONArray("trans_result");
// 获取第一条翻译结果的dst字段
return transResult.getJSONObject(0).getString("dst");
}
// 示例调用
public static void main(String[] args) throws IOException {
String translated = translate("PCS环境过温降额[恢复]");
System.out.println("翻译结果: " + translated); // 输出: active power
}
/**
* 从用户的AKSK生成鉴权签名Access Token
*
* @return 鉴权签名Access Token
* @throws IOException IO异常
*/
static String getAccessToken() throws IOException {
MediaType mediaType = MediaType.parse("application/x-www-form-urlencoded");
RequestBody body = RequestBody.create(mediaType, "grant_type=client_credentials&client_id=" + API_KEY
+ "&client_secret=" + SECRET_KEY);
Request request = new Request.Builder()
.url("https://aip.baidubce.com/oauth/2.0/token")
.method("POST", body)
.addHeader("Content-Type", "application/x-www-form-urlencoded")
.build();
Response response = HTTP_CLIENT.newCall(request).execute();
return new JSONObject(response.body().string()).getString("access_token");
}
}

View File

@ -128,7 +128,10 @@ public class MqttConfigUtil {
"+/device/cd6cb4a64b42bda5",
"+/device/436de647bbf01b22",
"+/device/e9eee97d793756fa",
"+/device/8c062827b5c1548b"
"+/device/8c062827b5c1548b",
"+/device/d143856d757625e1",
"+/device/3522ab4e7faf28b8",
"1/device/+"
};
/**

View File

@ -18,6 +18,7 @@ import com.ho.common.tools.util.PageResult;
import com.ho.filecenter.entity.MediaFile;
import com.ho.filecenter.service.AnotherFileService;
import com.ho.filecenter.service.FileService;
import com.ho.filecenter.service.MqttTopicService;
import com.ho.filecenter.util.MqttConfigUtil;
import com.ho.filecenter.vo.mqtt.*;
import com.ho.filecenter.vo.resp.*;
@ -58,6 +59,9 @@ public class FileController {
@Autowired
AnotherFileService anotherFileService;
@Autowired
MqttTopicService mqttTopicService;
@PostMapping("filePage")
@ApiOperation(value = "分页查询文件")
public DataResult<PageResult<MediaFile>> filePage(@RequestBody FilePageVO vo, HttpServletRequest request) {
@ -158,7 +162,7 @@ public class FileController {
return DataResult.success(fileAttributeResp);
}
String serialNo = vo.getSerialNo();
List<String> snList = MqttConfigUtil.getSnList();
List<String> snList = mqttTopicService.getSnList();
if(snList.stream().anyMatch(s -> s.contains(serialNo))){
fileAttributeResp = fileService.getFileAttribute(vo);
}else{
@ -180,7 +184,7 @@ public class FileController {
return DataResult.success(fileDeleteResp);
}
String serialNo = fileDeleteReqVO.getSerialNo();
List<String> snList = MqttConfigUtil.getSnList();
List<String> snList = mqttTopicService.getSnList();
if(snList.stream().anyMatch(s -> s.contains(serialNo))){
fileDeleteResp = fileService.deleteDeviceFiles(fileDeleteReqVO);
}else{
@ -210,7 +214,7 @@ public class FileController {
resp.setMsg(CommonConstant.Heartbeat.MSG + serialNo + CommonConstant.Heartbeat.SUCCESS);
resp.setHeartbeatStatus(CommonConstant.ONE);
log.info("文件上传(向边端上传)开始上传");
List<String> snList = MqttConfigUtil.getSnList();
List<String> snList = mqttTopicService.getSnList();
if(snList.stream().anyMatch(s -> s.contains(serialNo))){
fileService.fileUploadForDevice(file, stationId, serialNo, filePath);
}else{
@ -240,7 +244,7 @@ public class FileController {
log.info("文件下载(从边端下载到云端)开始下载");
fileService.downloadFromDevice(fileForDeviceReqVO);
String serialNo = fileForDeviceReqVO.getSerialNo();
List<String> snList = MqttConfigUtil.getSnList();
List<String> snList = mqttTopicService.getSnList();
if(snList.stream().anyMatch(s -> s.contains(serialNo))){
fileService.downloadFromDevice(fileForDeviceReqVO);
}else{

View File

@ -19,6 +19,7 @@ import com.ho.common.tools.util.PageResult;
import com.ho.filecenter.feignclient.BusinessFeignClient;
import com.ho.filecenter.feignclient.UserFeignClient;
import com.ho.filecenter.service.AnotherOrderSendService;
import com.ho.filecenter.service.MqttTopicService;
import com.ho.filecenter.service.OrderSendService;
import com.ho.filecenter.util.MqttConfigUtil;
import com.ho.filecenter.vo.mqtt.*;
@ -65,6 +66,9 @@ public class OrderSendController {
@Autowired
AnotherOrderSendService anotherOrderSendService;
@Autowired
MqttTopicService mqttTopicService;
public static final Long TIME_LIMIT = 90L;
@PostMapping("orderIssued")
@ -163,8 +167,8 @@ public class OrderSendController {
return DataResult.success(heartbeatResp);
}
log.info("指令下发正常开始下发");
List<String> snList = MqttConfigUtil.getSnList();
if(snList.contains(sn)){
List<String> snList = mqttTopicService.getSnList();
if(snList.stream().anyMatch(s -> s.contains(sn))){
orderSendService.orderIssued(vo);
}else{
anotherOrderSendService.orderIssued(vo);
@ -333,9 +337,9 @@ public class OrderSendController {
@TokenIgnore
public DataResult<HeartbeatResp> sendPlanPowerOrder(@RequestBody OrderPlanPowerReq vo) {
String sn = vo.getSn();
List<String> snList = MqttConfigUtil.getSnList();
List<String> snList = mqttTopicService.getSnList();
HeartbeatResp heartbeatResp = null;
if(snList.contains(sn)){
if(snList.stream().anyMatch(s -> s.contains(sn))){
heartbeatResp = orderSendService.sendPlanPowerOrder(vo);
}else{
heartbeatResp = anotherOrderSendService.sendPlanPowerOrder(vo);

View File

@ -203,7 +203,7 @@ public class WeatherController {
//每天的站级天气信息
@PostMapping("jobStationWeathers")
@TokenIgnore
public DataResult jobStationWeathers() {
public DataResult jobStationWeathers() throws InterruptedException {
log.info("jobStationWeathers ,start");
//先查所有电站
DataResult<List<Station>> listDataResult = businessFeignClient.selectAllStation();
@ -213,23 +213,9 @@ public class WeatherController {
}
List<Station> stations = listDataResult.getData();
if (!stations.isEmpty()) {
//得到不重复的电站
// List<Station> stationList = weatherStationService.dealStation(stations);
//生成按省市为key的缓存
long updateTime = System.currentTimeMillis();
Map<String, String> map = new HashMap<>();
for (Station station : stations) {
//循环调用
// String pinyin = PinyinUtil.getPinyin(station.getAddress());
// log.info("pinyin:" + pinyin);
// String longitude = String.valueOf(station.getLongitude());
// String latitude = String.valueOf(station.getLatitude());
// WeatherRespVo weather = weatherService.getWeatherFromApi(longitude, latitude);
// weather.setUpdateTime(updateTime);
// weather.setCityzh(station.getName());
// //
// String key = "weatherProvinceCity:" + pinyin;
// redisService.set(key,weather );
String adCode = station.getAdCode();
if (null == adCode) {
MyAddress address = AddressUntils.getAddress(String.valueOf(station.getLatitude()),String.valueOf(station.getLongitude()));
@ -241,9 +227,15 @@ public class WeatherController {
continue;
}
String key = RedisKeyConstant.WEATHER_PROVINCE_CITY + adCode;
Thread.sleep(200);
WeatherRespVo weatherRespVo = WeatherUntils.getWeatherRespVo(station.getAdCode());
weatherRespVo.setUpdateTime(updateTime);
redisService.set(key, weatherRespVo);
if(weatherRespVo!=null){
weatherRespVo.setUpdateTime(updateTime);
redisService.set(key, weatherRespVo);
log.info("更新天气站点名称:{},weatherRespVo:{}",station.getName(),weatherRespVo);
}else{
log.info("报错的站id:{},报错的adCode:{}",station.getId(),adCode);
}
map.put(adCode, adCode);
}
}

View File

@ -0,0 +1,10 @@
package com.ho.filecenter.mapper;
import java.util.List;
/**
* @author kerwin
*/
public interface MqttTopicMapper {
List<String> getSnList();
}

View File

@ -0,0 +1,11 @@
package com.ho.filecenter.service;
import java.util.List;
/**
* @author kerwin
*/
public interface MqttTopicService {
List<String> getSnList();
}

View File

@ -0,0 +1,24 @@
package com.ho.filecenter.service.impl;
import com.ho.filecenter.mapper.MqttTopicMapper;
import com.ho.filecenter.service.MqttTopicService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @author kerwin
*/
@Service
@Slf4j
public class MqttTopicServiceImpl implements MqttTopicService {
@Autowired
MqttTopicMapper mqttTopicMapper;
@Override
public List<String> getSnList() {
return mqttTopicMapper.getSnList();
}
}

View File

@ -133,8 +133,10 @@ public class MqttConfigUtil {
"+/device/cd6cb4a64b42bda5",
"+/device/436de647bbf01b22",
"+/device/e9eee97d793756fa",
"+/device/8c062827b5c1548b"
"+/device/8c062827b5c1548b",
"+/device/d143856d757625e1",
"+/device/3522ab4e7faf28b8",
"1/device/+"
};
/**
@ -180,13 +182,4 @@ public class MqttConfigUtil {
}
return str;
}
/**
* 获取SN配置合集
* @return
*/
public static List<String> getSnList(){
List<String> strings = Arrays.asList(commonTopic);
return strings;
}
}

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ho.filecenter.mapper.MqttTopicMapper">
<select id="getSnList" resultType="java.lang.String">
select topic from mqtt_topic
</select>
</mapper>

View File

@ -0,0 +1,19 @@
package com.ho.user.api.vo.req;
import com.ho.common.tools.entity.UserDetailRespVO;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* 用户统一登陆
*/
@Data
public class UserUnifiedLoginVo {
@ApiModelProperty(value = "储能登陆")
private UserDetailRespVO energy;
@ApiModelProperty(value = "光伏登陆")
private UserDetailRespVO pv;
}

View File

@ -73,6 +73,7 @@ public class ShiroConfig {
// 配置不会被拦截的链接 顺序判断
filterChainDefinitionMap.put("/sys/user/login", "anon");
filterChainDefinitionMap.put("/sys/user/getToken", "anon");
filterChainDefinitionMap.put("/sys/user/getUnifiedLogin", "anon");
filterChainDefinitionMap.put("/sys/user/register", "anon");
filterChainDefinitionMap.put("/sys/key/decrypt", "anon");
filterChainDefinitionMap.put("/mongoId", "anon");

View File

@ -2,6 +2,9 @@ package com.ho.user.controller;
import cn.hutool.core.date.DateUtil;
import cn.hutool.crypto.digest.BCrypt;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.ho.common.tools.annotation.HzPermission;
import com.ho.common.tools.annotation.LogAnnotation;
import com.ho.common.tools.annotation.TokenIgnore;
@ -18,9 +21,11 @@ import com.ho.common.tools.exception.DataResult;
import com.ho.common.tools.service.RedisService;
import com.ho.common.tools.util.AESEncryptUtil;
import com.ho.common.tools.util.FastUtils;
import com.ho.common.tools.util.HttpUtils;
import com.ho.user.api.entity.SysDept;
import com.ho.user.api.entity.SysUser;
import com.ho.user.api.entity.WorkOrderUser;
import com.ho.user.api.vo.req.UserUnifiedLoginVo;
import com.ho.user.entity.SysTheme;
import com.ho.user.service.*;
import com.ho.user.vo.req.*;
@ -543,4 +548,60 @@ public class UserController {
return DataResult.success();
}
@PostMapping(value = "getUnifiedLogin")
@ApiOperation(value = "用户统一登录接口")
@TokenIgnore
public DataResult<UserUnifiedLoginVo> getUnifiedLogin(@RequestBody @Valid LoginReqVO loginReqVO) {
UserUnifiedLoginVo unifiedLoginVo = new UserUnifiedLoginVo();
ObjectMapper mapper = new ObjectMapper();
try {
//储能登陆
String enUrl = "http://192.168.0.142:8012/api/sys/user/login";
String enJson = HttpUtils.postWithJson(enUrl,mapper.writeValueAsString(loginReqVO));
JSONObject en = JSONObject.parseObject(enJson);
Integer codeEn = en.getInteger("code");
if(CommonConstant.HttpCode.SUCCESS_CODE.equals(codeEn)){
String enString = en.getString("data");
UserDetailRespVO enVo = JSON.parseObject(enString,UserDetailRespVO.class);
unifiedLoginVo.setEnergy(enVo);
}
//光伏登陆
String pvUrl = "http://192.168.0.183:18012/api/sys/user/login";
String pvJson = HttpUtils.postWithJson(pvUrl,mapper.writeValueAsString(loginReqVO));
JSONObject pv = JSONObject.parseObject(pvJson);
Integer codePv = pv.getInteger("code");
if(CommonConstant.HttpCode.SUCCESS_CODE.equals(codePv)){
String pvString = pv.getString("data");
UserDetailRespVO pvVo = JSON.parseObject(pvString,UserDetailRespVO.class);
unifiedLoginVo.setPv(pvVo);
}
if(unifiedLoginVo.getEnergy()==null && unifiedLoginVo.getPv()==null){
if(BaseResponseCode.NOT_ACCOUNT.getCode()==codeEn
&&BaseResponseCode.NOT_ACCOUNT.getCode()==codePv){
throw new BusinessException(BaseResponseCode.NOT_ACCOUNT);
}
if (BaseResponseCode.PASSWORD_ERROR.getCode()==codeEn
||BaseResponseCode.PASSWORD_ERROR.getCode()==codePv ){
throw new BusinessException(BaseResponseCode.PASSWORD_ERROR);
}
if (BaseResponseCode.USER_LOCK.getCode()==codeEn
||BaseResponseCode.USER_LOCK.getCode()==codePv ){
throw new BusinessException(BaseResponseCode.USER_LOCK);
}
if (BaseResponseCode.LOSE_EFFICACY.getCode()==codeEn
||BaseResponseCode.LOSE_EFFICACY.getCode()==codePv ){
throw new BusinessException(BaseResponseCode.LOSE_EFFICACY);
}
if (BaseResponseCode.TO_BELONGING_DEPT_DISABLE.getCode()==codeEn
||BaseResponseCode.TO_BELONGING_DEPT_DISABLE.getCode()==codePv ){
throw new BusinessException(BaseResponseCode.TO_BELONGING_DEPT_DISABLE);
}
}
} catch (IOException e) {
throw new RuntimeException(e);
}
return DataResult.success(unifiedLoginVo);
}
}

View File

@ -231,4 +231,55 @@ public class JobHandler {
log.info("jobUpdateMessageInfo end !");
return ReturnT.SUCCESS;
}
/**
* 寄点-站点监控数据
* @param param
* @return
*/
@XxlJob("jobCacheShipEnergyMainInfo")
public ReturnT<String> jobCacheShipEnergyMainInfo(String param){
log.info("jobCacheShipEnergyMainInfo start !");
businessFeignClient.jobCacheShipEnergyMainInfo();
log.info("jobCacheShipEnergyMainInfo end !");
return ReturnT.SUCCESS;
}
/**
* 寄点-站点充放电数据
* @param param
* @return
*/
@XxlJob("jobCacheShipEleIncome")
public ReturnT<String> jobCacheShipEleIncome(String param){
log.info("jobCacheShipEnergyEle start !");
businessFeignClient.jobCacheShipEleIncome(param);
log.info("jobCacheShipEnergyEle end !");
return ReturnT.SUCCESS;
}
/**
* 中车-站点收益、充放电数据 - 昨日
* @param param
* @return
*/
@XxlJob("jobBoulderEleIncome")
public ReturnT<String> jobBoulderEleIncome(String param){
log.info("jobCacheShipEnergyEle start !");
businessFeignClient.jobBoulderEleIncome(param);
log.info("jobCacheShipEnergyEle end !");
return ReturnT.SUCCESS;
}
/**
* 中车-站点收益、充放电数据 - 今日
* @param param
* @return
*/
@XxlJob("jobBoulderEleIncomeToday")
public ReturnT<String> jobBoulderEleIncomeToday(String param){
log.info("jobCacheShipEnergyEle start !");
businessFeignClient.jobBoulderEleIncome(DateUtil.formatDate(new Date()));
log.info("jobCacheShipEnergyEle end !");
return ReturnT.SUCCESS;
}
}

View File

@ -67,4 +67,13 @@ public interface BusinessFeignClient {
@PostMapping(value = ContextConstant.ROOT_CONTEXT + ContextConstant.BUSINESS + "messageInfo/jobUpdateMessageInfo")
void jobUpdateMessageInfo();
@PostMapping(value = ContextConstant.ROOT_CONTEXT + ContextConstant.BUSINESS + "shipEnergyStation/getMainTotal")
void jobCacheShipEnergyMainInfo();
@PostMapping(value = ContextConstant.ROOT_CONTEXT + ContextConstant.BUSINESS + "shipEnergyStation/getStationIncomeHis")
void jobCacheShipEleIncome(@RequestBody String dateTime);
@PostMapping(value = ContextConstant.ROOT_CONTEXT + ContextConstant.BUSINESS + "boulderEnergyStation/getBoulderEleIncome")
void jobBoulderEleIncome(@RequestBody String dateTime);
}

View File

@ -99,4 +99,22 @@ public class BusinessFeignClientFallback implements BusinessFeignClient {
throw new BusinessException(BaseResponseCode.FEIGN_CALL_FAIL);
}
@Override
public void jobCacheShipEnergyMainInfo() {
log.error("BusinessFeignClient.jobCacheShipEnergyMainInfo error!");
throw new BusinessException(BaseResponseCode.FEIGN_CALL_FAIL);
}
@Override
public void jobCacheShipEleIncome(String dateTime) {
log.error("BusinessFeignClient.jobCacheShipEleIncome error!");
throw new BusinessException(BaseResponseCode.FEIGN_CALL_FAIL);
}
@Override
public void jobBoulderEleIncome(String dateTime) {
log.error("BusinessFeignClient.jobBoulderEleIncome error!");
throw new BusinessException(BaseResponseCode.FEIGN_CALL_FAIL);
}
}