update 联联平台接口

This commit is contained in:
Lemon
2023-05-15 10:30:16 +08:00
parent 738c9fde3d
commit fb260eb68d
9 changed files with 178 additions and 111 deletions

View File

@@ -5,6 +5,7 @@ import com.jsowell.common.annotation.Anonymous;
import com.jsowell.common.core.controller.BaseController;
import com.jsowell.common.exception.BusinessException;
import com.jsowell.common.response.RestApiResponse;
import com.jsowell.pile.dto.LianLianPushStationInfoDTO;
import com.jsowell.pile.dto.QueryEquipmentDTO;
import com.jsowell.pile.dto.QueryStartChargeDTO;
import com.jsowell.pile.dto.QueryStationInfoDTO;
@@ -33,11 +34,11 @@ public class LianLianController extends BaseController {
@PostMapping("/pushStationInfo")
public RestApiResponse<?> pushStationInfo(@RequestBody QueryStationInfoDTO dto) {
public RestApiResponse<?> pushStationInfo(@RequestBody LianLianPushStationInfoDTO dto) {
logger.info("推送联联平台充电站信息 params:{}", JSONObject.toJSONString(dto));
RestApiResponse<?> response = null;
try {
lianLianService.pushStationInfo(Long.parseLong(dto.getStationID()));
lianLianService.pushStationInfo(dto);
response = new RestApiResponse<>();
}catch (BusinessException e) {
logger.error("推送联联平台充电站信息 error",e);

View File

@@ -159,66 +159,27 @@ public class SpringBootTestController {
}
@Test
public void testLianLian() throws Exception {
// Long stationId = 2L;
// // 通过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 = lianLianService.getPileList(pileStationInfo);
// if (CollectionUtils.isNotEmpty(pileList)) {
// info.setEquipmentInfos(pileList); // 充电设备信息列表
// }
String url = "http://testdataexchange.evchargeonline.com:82/shevcs/v1/" + "notification_stationInfo";
JSONObject json = new JSONObject();
json.put("OperatorID", "MA1JLFUU8");
json.put("OperatorSecret", "Nh62XxllR5OjAzFj");
// json.put("StationInfo", info);
public void testLianLian(){
// 获取令牌
LianLianGetTokenDTO dto = new LianLianGetTokenDTO();
dto.setOperatorId("987654321");
dto.setOperatorSecret("1234567890abcdef");
String token = lianLianService.getToken(dto);
System.out.println("token:" + token);
LianLianPushStationInfoDTO dto1 = LianLianPushStationInfoDTO.builder()
.OperatorID("987654321")
.DataSecret("1234567890abcdef")
.DataSecretIV("1234567890abcdef")
.SigSecret("1234567890abcdef")
.token(token)
.stationId(2L)
.build();
lianLianService.pushStationInfo(dto1);
}

View File

@@ -169,7 +169,6 @@ public class LoginRequestHandler extends AbstractHandler{
ProofreadTimeCommand command = ProofreadTimeCommand.builder().pileSn(pileSn).build();
ykcPushCommandService.pushProofreadTimeCommand(command);
});
// log.info("下面进行下发二维码 pileSn:{}, thread:{}", pileSn, Thread.currentThread().getName());
CompletableFuture.runAsync(() -> {
try {

View File

@@ -0,0 +1,48 @@
package com.jsowell.pile.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 联联平台推送站点信息
*
* @author JS-ZZA
* @date 2023/5/10 14:56
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class LianLianPushStationInfoDTO {
/**
* 运营商id
*/
private String OperatorID;
/**
* 签名秘钥
*/
private String SigSecret;
/**
* 消息密钥
*/
private String DataSecret;
/**
* 消息密钥初始化向量
*/
private String DataSecretIV;
/**
* 令牌
*/
private String token;
/**
* 站点id
*/
private Long stationId;
}

View File

@@ -1,5 +1,6 @@
package com.jsowell.thirdparty.domain;
import com.alibaba.fastjson2.annotation.JSONField;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
@@ -24,7 +25,7 @@ public class ConnectorInfo {
/**
* 充电设备接口名称 N
*/
private String ConnectorName;
// private String ConnectorName;
/**
* 充电设备接口类型 Y
@@ -59,6 +60,6 @@ public class ConnectorInfo {
* 车位号 N
* 停车场车位编号
*/
private String ParkNo;
// private String ParkNo;
}

View File

@@ -1,5 +1,6 @@
package com.jsowell.thirdparty.domain;
import com.alibaba.fastjson2.annotation.JSONField;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
@@ -31,18 +32,18 @@ public class EquipmentInfo {
* 设备型号 N
* 由设备生厂商定义的设备型号
*/
private String EquipmentModel;
// private String EquipmentModel;
/**
* 设备名称 N
*/
private String EquipmentName;
// private String EquipmentName;
/**
* 设备生产日期 N
* YYYY-MM-DD
*/
private String ProductionDate;
// private String ProductionDate;
/**
* 建设时间 Y
@@ -86,13 +87,13 @@ public class EquipmentInfo {
* 充电设备经度 N
* GCJ-02坐标系
*/
private BigDecimal EquipmentLng;
// private BigDecimal EquipmentLng;
/**
* 充电设备纬度 N
* GCJ-02坐标系
*/
private BigDecimal EquipmentLat;
// private BigDecimal EquipmentLat;
/**
* 是否支持VIN码识别(0-否1-是) Y

View File

@@ -1,10 +1,12 @@
package com.jsowell.thirdparty.domain;
import com.alibaba.fastjson2.annotation.JSONField;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.apache.commons.lang3.builder.ToStringBuilder;
import java.math.BigDecimal;
import java.util.List;
@@ -51,13 +53,13 @@ public class StationInfo {
* 户号 N
* 国网电费账单户号
*/
private String AccountNumber;
// private String AccountNumber;
/**
* 容量(单位KW) N
* 独立电表申请的功率
*/
private BigDecimal Capacity;
// private BigDecimal Capacity;
/**
* 是否是公共停车场库 (0-否;1-是) Y
@@ -69,7 +71,7 @@ public class StationInfo {
* 停车场库编号 N
* 公共停车场库编号
*/
private String ParkingLotNumber;
// private String ParkingLotNumber;
/**
* 充电站国家代码 Y
@@ -92,7 +94,7 @@ public class StationInfo {
* 站点电话 N
* 能够联系场站工作人员进行协助的联系电话
*/
private String StationTel;
// private String StationTel;
/**
* 服务电话 Y
@@ -147,7 +149,7 @@ public class StationInfo {
* 站点引导 N
* 描述性文字,用于引导车主找到充电车位
*/
private String SiteGuide;
// private String SiteGuide;
/**
* 建设场所 Y
@@ -174,31 +176,31 @@ public class StationInfo {
* 站点照片 N
* 充电设备照片、充电车位照片、停车场入口照片
*/
private List<String> Pictures;
// private List<String> Pictures;
/**
* 使用车型描述 N
* 描述该站点接受的车大小以及类型,如大巴、物流车、私家乘用车、出租车等
*/
private String MatchCars;
// private String MatchCars;
/**
* 车位楼层及数量描述 N
* 车位楼层以及数量信息
*/
private String ParkInfo;
// private String ParkInfo;
/**
* 停车场产权方 N
* 停车场产权人
*/
private String ParkOwner;
// private String ParkOwner;
/**
* 停车场管理方 N
* 停车场管理人XX 物业)
*/
private String ParkManager;
// private String ParkManager;
/**
* 全天开放 Y
@@ -210,7 +212,7 @@ public class StationInfo {
* 营业时间 N
* 营业时间描述,推荐格式周一至周日00:00-24:00
*/
private String BusinessHours;
// private String BusinessHours;
/**
* 最低单价 Y
@@ -240,7 +242,7 @@ public class StationInfo {
* 停车费 N
* 停车费率描述
*/
private String ParkFee;
// private String ParkFee;
/**
* 支付方式 Y
@@ -258,13 +260,13 @@ public class StationInfo {
* 备注 N
* 其他备注信息
*/
private String Remark;
// private String Remark;
/**
* 充电设备信息列表 Y
* 该充电站所有充电设备信息对象集合
*/
private List<EquipmentInfo> equipmentInfos;
private List<EquipmentInfo> EquipmentInfos;
/**
* 停车收费类型 Y

View File

@@ -1,10 +1,7 @@
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.pile.dto.*;
import com.jsowell.thirdparty.domain.StationStatsInfo;
import com.jsowell.pile.dto.QueryStationInfoDTO;
import com.jsowell.thirdparty.vo.*;
import java.util.List;
@@ -21,7 +18,7 @@ public interface LianLianService {
* 根据充电站id推送充电站信息
* @param stationId
*/
void pushStationInfo(Long stationId) throws Exception;
void pushStationInfo(LianLianPushStationInfoDTO dto);
/**
* 联联平台获取充电站信息
@@ -75,5 +72,10 @@ public interface LianLianService {
*/
QueryStopChargeVO query_stop_charge(QueryStartChargeDTO dto);
/**
* 联联平台获取令牌
* @param dto
* @return
*/
String getToken(LianLianGetTokenDTO dto);
}

View File

@@ -1,12 +1,15 @@
package com.jsowell.thirdparty.service.impl;
import cn.hutool.core.util.PageUtil;
import cn.hutool.http.HttpRequest;
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.google.common.collect.Maps;
import com.google.gson.Gson;
import com.jsowell.common.constant.Constants;
import com.jsowell.common.core.domain.ykc.RealTimeMonitorData;
import com.jsowell.common.enums.ykc.OrderStatusEnum;
@@ -22,10 +25,7 @@ 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;
import com.jsowell.pile.dto.*;
import com.jsowell.pile.service.IOrderBasicInfoService;
import com.jsowell.pile.service.IPileBasicInfoService;
import com.jsowell.pile.service.IPileConnectorInfoService;
@@ -98,24 +98,30 @@ public class LianLianServiceImpl implements LianLianService {
/**
* 根据站点id推送站点信息
* @param stationId
* @param dto
*/
@Override
public void pushStationInfo(Long stationId) throws Exception {
public void pushStationInfo(LianLianPushStationInfoDTO dto){
// String OperatorID = "987654321";
// String SigSecret = "1234567890abcdef"; // 签名秘钥
// String DataSecret = "1234567890abcdef"; // 消息密钥
// String DataSecretIV = "1234567890abcdef"; // 消息密钥初始化向量
// String token = "c548f9276c1c4ea8b88b1f7b1eb7cf07"; //QueryToken类查询接口获取到的token
// 通过id查询站点相关信息
PileStationInfo pileStationInfo = pileStationInfoService.selectPileStationInfoById(stationId);
PileStationInfo pileStationInfo = pileStationInfoService.selectPileStationInfoById(dto.getStationId());
// 组装联联平台所需要的数据格式
StationInfo info = StationInfo.builder()
.StationID(String.valueOf(stationId))
.OperatorID(Constants.OPERATORID_LIANLIAN)
.EquipmentOwnerID(Constants.OPERATORID_LIANLIAN)
.StationID(String.valueOf(dto.getStationId()))
.OperatorID(dto.getOperatorID())
.EquipmentOwnerID(dto.getOperatorID())
.StationName(pileStationInfo.getStationName())
.IsAloneApply(Integer.valueOf(pileStationInfo.getAloneApply()))
.IsPublicParkingLot(Integer.valueOf(pileStationInfo.getPublicParking()))
.CountryCode(pileStationInfo.getCountryCode())
.AreaCode(pileStationInfo.getAreaCode())
.AreaCode("310118")
.Address(pileStationInfo.getAddress())
.ServiceTel(pileStationInfo.getServiceTel())
.ServiceTel(pileStationInfo.getStationTel())
.StationType(Integer.valueOf(pileStationInfo.getStationType()))
.StationStatus(Integer.valueOf(pileStationInfo.getStationStatus()))
.ParkNums(Integer.valueOf(pileStationInfo.getParkNums()))
@@ -123,15 +129,15 @@ public class LianLianServiceImpl implements LianLianService {
.StationLat(new BigDecimal(pileStationInfo.getStationLat()))
.Construction(Integer.valueOf(pileStationInfo.getConstruction()))
.OpenAllDay(Integer.valueOf(pileStationInfo.getOpenAllDay()))
// .MinElectricityPrice()
// .ElectricityFee()
// .ServiceFee()
.MinElectricityPrice(new BigDecimal("2"))
.ElectricityFee("2")
.ServiceFee("2")
.ParkFree(Integer.valueOf(pileStationInfo.getParkFree()))
// .ParkFee()
.Payment(pileStationInfo.getPayment())
// .ParkFee("2")
.Payment("线上")
.SupportOrder(Integer.valueOf(pileStationInfo.getSupportOrder()))
// .equipmentInfos()
// .ParkFeeType()
.ParkFeeType(0)
.ToiletFlag(Integer.valueOf(pileStationInfo.getToiletFlag()))
.StoreFlag(Integer.valueOf(pileStationInfo.getStoreFlag()))
.RestaurantFlag(Integer.valueOf(pileStationInfo.getRestaurantFlag()))
@@ -149,14 +155,60 @@ public class LianLianServiceImpl implements LianLianService {
}
// 调用联联平台接口
String url = "http://dataexchange.evchargeonline.com:81/shevcs/v1/" + "notification_stationInfo";
String url = "http://testdataexchange.evchargeonline.com:82/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());
// String jsonString = JSON.toJSONString(info);
System.out.println(s);
// Gson gson = new Gson();
// String gsonString = gson.toJson(info);
String jsonStr = JSONUtil.toJsonStr(info);
// System.out.println("jsonString : " + jsonString);
// System.out.println("gsonString : " + gsonString);
System.out.println("jsonStr : " + jsonStr);
JSONObject data = new JSONObject();
data.put("StationInfo", jsonStr);
String jsonString = JSONObject.toJSONString(data);
System.out.println("jsonString : " + jsonString);
//加密
byte[] encryptText = Cryptos.aesEncrypt(jsonString.getBytes(),
dto.getDataSecret().getBytes(), dto.getDataSecretIV().getBytes());
String encryptData = Encodes.encodeBase64(encryptText);
System.out.println("加密数据:" + encryptData);
Map<String, String> params = Maps.newLinkedHashMap();
params.put("OperatorID", dto.getOperatorID());
params.put("Data", encryptData);
params.put("TimeStamp", "20230510145200");
params.put("Seq", "001");
String sign = GBSignUtils.sign(params, dto.getSigSecret());
params.put("Sig", sign);
String postData = JSON.toJSONString(params);
System.out.println("最终提交数据:" + postData);
String hutoolRequest = HttpRequest.post(url).header("Authorization", "Bearer " + dto.getToken()).body(postData).execute().body();
System.out.println("接收到返回数据:" + hutoolRequest);
Map<String, String> map = (Map<String, String>) JSON.parse(hutoolRequest);
String rData = map.get("Data");
byte[] plainText = Cryptos.aesDecrypt(Encodes.decodeBase64(rData),
dto.getDataSecret().getBytes(), dto.getDataSecretIV().getBytes());
String plainData = "";
try {
plainData = new String(plainText, "UTF-8");
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("解密数据:" + plainData);
}
@@ -194,7 +246,7 @@ public class LianLianServiceImpl implements LianLianService {
stationInfo.setCountryCode(pileStationInfo.getCountryCode());
stationInfo.setAreaCode(pileStationInfo.getAreaCode());
stationInfo.setAddress(pileStationInfo.getAddress());
stationInfo.setServiceTel(pileStationInfo.getServiceTel());
stationInfo.setServiceTel(pileStationInfo.getStationTel());
stationInfo.setStationType(Integer.valueOf(pileStationInfo.getStationType()));
stationInfo.setParkNums(Integer.valueOf(pileStationInfo.getParkNums()));
stationInfo.setStationLng(new BigDecimal(pileStationInfo.getStationLng()));
@@ -645,14 +697,14 @@ public class LianLianServiceImpl implements LianLianService {
equipmentInfo.setEquipmentID(pileSn);
equipmentInfo.setManufacturerID(merchantInfo.getOrganizationCode());
equipmentInfo.setConstructionTime(DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, pileBasicInfo.getCreateTime()));
equipmentInfo.setConstructionTime(DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD, pileBasicInfo.getCreateTime()));
PileModelInfoVO modelInfo = pileModelInfoService.getPileModelInfoByPileSn(pileSn);
equipmentInfo.setEquipmentType(Integer.valueOf(modelInfo.getSpeedType()));
// Map<String, String> pileStatus = pileConnectorInfoService.getPileStatus(Lists.newArrayList(pileBasicInfo.getSn()));
equipmentInfo.setEquipmentStatus(50);
equipmentInfo.setEquipmentPower(new BigDecimal(modelInfo.getRatedPower()));
equipmentInfo.setEquipmentPower(new BigDecimal(modelInfo.getRatedPower()).setScale(1, BigDecimal.ROUND_HALF_UP));
equipmentInfo.setNewNationalStandard(1);
equipmentInfo.setVinFlag(1);
@@ -686,7 +738,7 @@ public class LianLianServiceImpl implements LianLianService {
connectorInfo.setVoltageUpperLimits(Integer.valueOf(modelInfo.getRatedVoltage()));
connectorInfo.setVoltageLowerLimits(Integer.valueOf(modelInfo.getRatedVoltage()));
connectorInfo.setCurrent(Integer.valueOf(modelInfo.getRatedCurrent()));
connectorInfo.setPower(new BigDecimal(modelInfo.getRatedPower()));
connectorInfo.setPower(new BigDecimal(modelInfo.getRatedPower()).setScale(1, BigDecimal.ROUND_HALF_UP));
resultList.add(connectorInfo);
}