add 联联平台相关工具类

This commit is contained in:
Lemon
2023-05-10 08:49:01 +08:00
parent 97db024485
commit d2eed9ad3a
16 changed files with 1196 additions and 39 deletions

View File

@@ -1,5 +1,6 @@
package com.jsowell.thirdparty.service;
import com.jsowell.pile.dto.LianLianGetTokenDTO;
import com.jsowell.pile.dto.QueryEquipmentDTO;
import com.jsowell.pile.dto.QueryStartChargeDTO;
import com.jsowell.thirdparty.domain.StationStatsInfo;
@@ -16,6 +17,12 @@ public interface LianLianService {
*/
void pushMerchantInfo(Long merchantId);
/**
* 根据充电站id推送充电站信息
* @param stationId
*/
void pushStationInfo(Long stationId) throws Exception;
/**
* 联联平台获取充电站信息
* @param dto
@@ -67,4 +74,6 @@ public interface LianLianService {
* @return
*/
QueryStopChargeVO query_stop_charge(QueryStartChargeDTO dto);
String getToken(LianLianGetTokenDTO dto);
}

View File

@@ -1,20 +1,28 @@
package com.jsowell.thirdparty.service.impl;
import cn.hutool.core.util.PageUtil;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.github.pagehelper.PageInfo;
import com.google.common.collect.Lists;
import com.jsowell.common.constant.Constants;
import com.jsowell.common.core.domain.ykc.RealTimeMonitorData;
import com.jsowell.common.core.redis.RedisCache;
import com.jsowell.common.enums.ykc.OrderStatusEnum;
import com.jsowell.common.enums.ykc.PileConnectorDataBaseStatusEnum;
import com.jsowell.common.exception.BusinessException;
import com.jsowell.common.util.DateUtils;
import com.jsowell.common.util.PageUtils;
import com.jsowell.common.util.StringUtils;
import com.jsowell.common.util.*;
import com.jsowell.common.util.http.HttpUtils;
import com.jsowell.common.util.lianlian.Cryptos;
import com.jsowell.common.util.lianlian.Encodes;
import com.jsowell.common.util.lianlian.GBSignUtils;
import com.jsowell.common.util.lianlian.LianLianUtils;
import com.jsowell.netty.command.ykc.StartChargingCommand;
import com.jsowell.netty.command.ykc.StopChargingCommand;
import com.jsowell.netty.service.yunkuaichong.YKCPushCommandService;
import com.jsowell.pile.domain.*;
import com.jsowell.pile.dto.LianLianGetTokenDTO;
import com.jsowell.pile.dto.QueryEquipmentDTO;
import com.jsowell.pile.dto.QueryStartChargeDTO;
import com.jsowell.pile.dto.QueryStationInfoDTO;
@@ -27,7 +35,6 @@ import com.jsowell.pile.service.IPileStationInfoService;
import com.jsowell.pile.vo.base.ConnectorInfoVO;
import com.jsowell.pile.vo.base.MerchantInfoVO;
import com.jsowell.pile.vo.lianlian.AccumulativeInfoVO;
import com.jsowell.pile.vo.uniapp.SendMessageVO;
import com.jsowell.pile.vo.web.PileConnectorInfoVO;
import com.jsowell.pile.vo.web.PileModelInfoVO;
import com.jsowell.thirdparty.domain.ConnectorChargeStatusInfo;
@@ -47,9 +54,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.stream.Collectors;
@Service
@@ -82,13 +87,81 @@ public class LianLianServiceImpl implements LianLianService {
MerchantInfoVO merchantInfo = pileMerchantInfoService.getMerchantInfo(String.valueOf(merchantId));
// 组装联联平台所需要的数据格式
OperatorInfo operatorInfo = OperatorInfo.builder()
.OperatorID(merchantInfo.getOrganizationCode()) // 组织机构代码
.OperatorID(Constants.OPERATORID_LIANLIAN) // 组织机构代码
.OperatorName(merchantInfo.getMerchantName()) // 机构全称
.OperatorTel1(merchantInfo.getMerchantTel()) // 对接平台客服电话1
.build();
// 调用联联平台接口
}
/**
* 根据站点id推送站点信息
* @param stationId
*/
@Override
public void pushStationInfo(Long stationId) throws Exception {
// 通过id查询站点相关信息
PileStationInfo pileStationInfo = pileStationInfoService.selectPileStationInfoById(stationId);
// 组装联联平台所需要的数据格式
StationInfo info = StationInfo.builder()
.StationID(String.valueOf(stationId))
.OperatorID(Constants.OPERATORID_LIANLIAN)
.EquipmentOwnerID(Constants.OPERATORID_LIANLIAN)
.StationName(pileStationInfo.getStationName())
.IsAloneApply(Integer.valueOf(pileStationInfo.getAloneApply()))
.IsPublicParkingLot(Integer.valueOf(pileStationInfo.getPublicParking()))
.CountryCode(pileStationInfo.getCountryCode())
.AreaCode(pileStationInfo.getAreaCode())
.Address(pileStationInfo.getAddress())
.ServiceTel(pileStationInfo.getServiceTel())
.StationType(Integer.valueOf(pileStationInfo.getStationType()))
.StationStatus(Integer.valueOf(pileStationInfo.getStationStatus()))
.ParkNums(Integer.valueOf(pileStationInfo.getParkNums()))
.StationLng(new BigDecimal(pileStationInfo.getStationLng()))
.StationLat(new BigDecimal(pileStationInfo.getStationLat()))
.Construction(Integer.valueOf(pileStationInfo.getConstruction()))
.OpenAllDay(Integer.valueOf(pileStationInfo.getOpenAllDay()))
// .MinElectricityPrice()
// .ElectricityFee()
// .ServiceFee()
.ParkFree(Integer.valueOf(pileStationInfo.getParkFree()))
// .ParkFee()
.Payment(pileStationInfo.getPayment())
.SupportOrder(Integer.valueOf(pileStationInfo.getSupportOrder()))
// .equipmentInfos()
// .ParkFeeType()
.ToiletFlag(Integer.valueOf(pileStationInfo.getToiletFlag()))
.StoreFlag(Integer.valueOf(pileStationInfo.getStoreFlag()))
.RestaurantFlag(Integer.valueOf(pileStationInfo.getRestaurantFlag()))
.LoungeFlag(Integer.valueOf(pileStationInfo.getLoungeFlag()))
.CanopyFlag(Integer.valueOf(pileStationInfo.getCanopyFlag()))
.PrinterFlag(Integer.valueOf(pileStationInfo.getPrinterFlag()))
.BarrierFlag(Integer.valueOf(pileStationInfo.getBarrierFlag()))
.ParkingLockFlag(Integer.valueOf(pileStationInfo.getParkingLockFlag()))
.build();
List<EquipmentInfo> pileList = getPileList(pileStationInfo);
if (CollectionUtils.isNotEmpty(pileList)) {
info.setEquipmentInfos(pileList); // 充电设备信息列表
}
// 调用联联平台接口
String url = "http://dataexchange.evchargeonline.com:81/shevcs/v1/" + "notification_stationInfo";
JSONObject jsonObject = new JSONObject();
// Map<String, Object> map = new HashMap<>();
jsonObject.put("StationInfo", info);
String s = HttpUtils.sendPost(url, jsonObject.toJSONString());
System.out.println(s);
}
public static void main(String[] args) throws Exception {
}
/**
@@ -112,8 +185,8 @@ public class LianLianServiceImpl implements LianLianService {
for (PileStationInfo pileStationInfo : pageInfo.getList()) {
StationInfo stationInfo = new StationInfo();
stationInfo.setStationID(String.valueOf(pileStationInfo.getId()));
MerchantInfoVO merchantInfo = pileMerchantInfoService.getMerchantInfo(String.valueOf(pileStationInfo.getMerchantId()));
stationInfo.setOperatorID(merchantInfo.getOrganizationCode()); // 组织机构代码
// MerchantInfoVO merchantInfo = pileMerchantInfoService.getMerchantInfo(String.valueOf(pileStationInfo.getMerchantId()));
stationInfo.setOperatorID(Constants.OPERATORID_LIANLIAN); // 组织机构代码
stationInfo.setEquipmentOwnerID(String.valueOf(pileStationInfo.getMerchantId()));
stationInfo.setStationName(pileStationInfo.getStationName());
stationInfo.setIsAloneApply(Integer.valueOf(pileStationInfo.getAloneApply()));
@@ -481,6 +554,60 @@ public class LianLianServiceImpl implements LianLianService {
return vo;
}
/**
* 获取令牌
* @param dto
* @return
*/
@Override
public String getToken(LianLianGetTokenDTO dto) {
String operatorId = dto.getOperatorId();
String operatorSecret = dto.getOperatorSecret();
String token = "";
try {
//测试用请求地址
String requestUrl = "http://testdataexchange.evchargeonline.com:82/shevcs/v1/query_token";
//请求data
Map<String, String> data = new HashMap<>();
data.put("OperatorID", operatorId);
data.put("OperatorSecret", operatorSecret);
String dataJson = JSONUtil.toJsonStr(data);
//加密
byte[] encryptText = Cryptos.aesEncrypt(dataJson.getBytes("UTF-8"),
operatorSecret.getBytes(), operatorSecret.getBytes());
String strData = Encodes.encodeBase64(encryptText);
Map<String, String> request = new LinkedHashMap<>();
request.put("OperatorID", operatorId);
request.put("Data", strData);
request.put("TimeStamp", System.currentTimeMillis() + "");
request.put("Seq", "0001");
//生成签名
String sig = GBSignUtils.sign(request, operatorSecret);
request.put("Sig", sig);
String tokenRequest = JSONUtil.toJsonStr(request);
String response = HttpUtil.post(requestUrl, tokenRequest);
LianLianResultVO result = JSON.parseObject(response, LianLianResultVO.class);
if (result.getRet() == 0) {
//解密data
byte[] plainText = Cryptos.aesDecrypt(Encodes.decodeBase64((String) result.getData()),
operatorSecret.getBytes(), operatorSecret.getBytes());
String dataStr = new String(plainText, "UTF-8");
Map<String, String> resultMap = (Map<String, String>) JSON.parse(dataStr);
token = resultMap.get("AccessToken");
}
} catch (Exception e) {
return token;
}
return token;
}
// TODO 推送停止充电结果 notification_stop_charge_result
// TODO 推送充电订单信息 notification_charge_order_info

View File

@@ -0,0 +1,43 @@
package com.jsowell.thirdparty.vo;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 联联平台接口返回对象
*
* @author JS-ZZA
* @date 2023/5/10 8:36
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class LianLianResultVO {
/**
* 系统错误码
*/
@JsonProperty("Ret")
int ret = 0;
/**
* 返回提示信息
*/
@JsonProperty("Msg")
String msg = "";
/**
* 返回结果
*/
@JsonProperty("Data")
Object data;
/**
* 签名
*/
@JsonProperty("Sig")
String sig;
}