@@ -0,0 +1,783 @@
package com.jsowell.thirdparty.platform.service.impl ;
import com.alibaba.fastjson2.JSON ;
import com.alibaba.fastjson2.JSONObject ;
import com.github.pagehelper.PageHelper ;
import com.github.pagehelper.PageInfo ;
import com.google.common.collect.Lists ;
import com.google.common.collect.Maps ;
import com.jsowell.common.constant.Constants ;
import com.jsowell.common.core.domain.ykc.RealTimeMonitorData ;
import com.jsowell.common.enums.thirdparty.BusinessInformationExchangeEnum ;
import com.jsowell.common.enums.thirdparty.ThirdPartyOperatorIdEnum ;
import com.jsowell.common.enums.thirdparty.ThirdPlatformTypeEnum ;
import com.jsowell.common.enums.ykc.BillingTimeTypeEnum ;
import com.jsowell.common.enums.ykc.PileConnectorDataBaseStatusEnum ;
import com.jsowell.common.enums.ykc.ReturnCodeEnum ;
import com.jsowell.common.exception.BusinessException ;
import com.jsowell.common.util.DateUtils ;
import com.jsowell.common.util.JWTUtils ;
import com.jsowell.common.util.PageUtils ;
import com.jsowell.common.util.StringUtils ;
import com.jsowell.pile.domain.OrderBasicInfo ;
import com.jsowell.pile.domain.OrderDetail ;
import com.jsowell.pile.domain.ThirdPartyPlatformConfig ;
import com.jsowell.pile.domain.ThirdPartyStationRelation ;
import com.jsowell.pile.dto.PushRealTimeInfoDTO ;
import com.jsowell.pile.dto.QueryEquipChargeStatusDTO ;
import com.jsowell.pile.dto.QueryOperatorInfoDTO ;
import com.jsowell.pile.dto.QueryStationInfoDTO ;
import com.jsowell.pile.service.* ;
import com.jsowell.pile.thirdparty.CommonParamsDTO ;
import com.jsowell.pile.thirdparty.EquipmentInfo ;
import com.jsowell.pile.util.MerchantUtils ;
import com.jsowell.pile.vo.ThirdPartySecretInfoVO ;
import com.jsowell.pile.vo.base.ConnectorInfoVO ;
import com.jsowell.pile.vo.base.MerchantInfoVO ;
import com.jsowell.pile.vo.base.ThirdPartyStationInfoVO ;
import com.jsowell.pile.vo.base.ThirdPartyStationRelationVO ;
import com.jsowell.pile.vo.uniapp.BillingPriceVO ;
import com.jsowell.pile.vo.web.PileConnectorInfoVO ;
import com.jsowell.pile.vo.web.PileStationVO ;
import com.jsowell.thirdparty.lianlian.domain.ConnectorChargeStatusInfo ;
import com.jsowell.thirdparty.lianlian.domain.ConnectorStatusInfo ;
import com.jsowell.thirdparty.lianlian.domain.StationStatusInfo ;
import com.jsowell.thirdparty.lianlian.vo.AccessTokenVO ;
import com.jsowell.thirdparty.lianlian.vo.QueryChargingStatusVO ;
import com.jsowell.thirdparty.platform.domain.* ;
import com.jsowell.thirdparty.platform.service.ThirdPartyPlatformService ;
import com.jsowell.thirdparty.platform.factory.ThirdPartyPlatformFactory ;
import com.jsowell.thirdparty.platform.util.Cryptos ;
import com.jsowell.thirdparty.platform.util.Encodes ;
import com.jsowell.thirdparty.platform.util.HttpRequestUtil ;
import com.jsowell.thirdparty.platform.util.ThirdPartyPlatformUtils ;
import com.jsowell.thirdparty.service.ThirdpartySecretInfoService ;
import org.apache.commons.collections4.CollectionUtils ;
import org.springframework.beans.factory.annotation.Autowired ;
import org.springframework.stereotype.Service ;
import java.math.BigDecimal ;
import java.nio.charset.StandardCharsets ;
import java.util.* ;
import java.util.stream.Collectors ;
@Service
public class NinaXiaPlatformServiceImpl implements ThirdPartyPlatformService {
// 平台类型
private final String thirdPlatformType = ThirdPlatformTypeEnum . NING_XIA_PLATFORM . getTypeCode ( ) ;
@Override
public void afterPropertiesSet ( ) throws Exception {
ThirdPartyPlatformFactory . register ( thirdPlatformType , this ) ;
}
@Autowired
private ThirdPartyPlatformConfigService thirdPartyPlatformConfigService ;
@Autowired
private ThirdPartyStationRelationService thirdPartyStationRelationService ;
@Autowired
private ThirdpartySecretInfoService thirdpartySecretInfoService ;
@Autowired
private PileBasicInfoService pileBasicInfoService ;
@Autowired
private PileStationInfoService pileStationInfoService ;
@Autowired
private PileMerchantInfoService pileMerchantInfoService ;
@Autowired
private PileConnectorInfoService pileConnectorInfoService ;
@Autowired
private OrderBasicInfoService orderBasicInfoService ;
@Autowired
private PileBillingTemplateService pileBillingTemplateService ;
/**
* @return
*/
@Override
public void printServiceName ( ) {
System . out . println ( " 当前类名: " + this . getClass ( ) . getSimpleName ( ) ) ;
}
/**
* query_token 获取token, 提供给第三方平台使用
*
* @param dto
* @return
*/
@Override
public Map < String , String > queryToken ( CommonParamsDTO dto ) {
AccessTokenVO vo = new AccessTokenVO ( ) ;
// 0:成功; 1:失败
int succStat = 0 ;
// 0:无; 1:无此对接平台; 2:密钥错误; 3~ 99:自定义
int failReason = 0 ;
String operatorId = dto . getOperatorID ( ) ;
// 通过operatorId 查出 operatorSecret
ThirdPartySecretInfoVO thirdPartySecretInfoVO = thirdpartySecretInfoService . queryByOperatorId ( operatorId ) ;
if ( thirdPartySecretInfoVO = = null ) {
failReason = 1 ;
succStat = 1 ;
} else {
String theirOperatorSecret = thirdPartySecretInfoVO . getTheirOperatorSecret ( ) ;
String dataSecret = thirdPartySecretInfoVO . getOurDataSecret ( ) ;
String dataSecretIv = thirdPartySecretInfoVO . getOurDataSecretIv ( ) ;
// 解密data 获取参数中的OperatorSecret
String decrypt = Cryptos . decrypt ( dto . getData ( ) , dataSecret , dataSecretIv ) ;
String inputOperatorSecret = null ;
if ( StringUtils . isNotBlank ( decrypt ) ) {
inputOperatorSecret = JSON . parseObject ( decrypt ) . getString ( " OperatorSecret " ) ;
}
// 对比密钥
if ( ! StringUtils . equals ( theirOperatorSecret , inputOperatorSecret ) ) {
failReason = 1 ;
succStat = 1 ;
} else {
// 生成token
String token = JWTUtils . createToken ( operatorId , theirOperatorSecret , JWTUtils . ttlMillis ) ;
vo . setAccessToken ( token ) ;
vo . setTokenAvailableTime ( ( int ) ( JWTUtils . ttlMillis / 1000 ) ) ;
}
}
// 组装返回参数
vo . setPlatformId ( operatorId ) ;
vo . setFailReason ( failReason ) ;
vo . setSuccStat ( succStat ) ;
Map < String , String > resultMap = ThirdPartyPlatformUtils . generateResultMap ( vo , thirdPartySecretInfoVO ) ;
return resultMap ;
}
/**
* 查询运营商信息 query_operator_info
* supervise_query_operator_info
*
* @param dto 查询运营商信息DTO
* @throws UnsupportedOperationException 未实现异常
*/
@Override
public Map < String , String > queryOperatorInfo ( QueryOperatorInfoDTO dto ) {
PageHelper . startPage ( dto . getPageNo ( ) , dto . getPageSize ( ) ) ;
List < MerchantInfoVO > merchantList = thirdPartyStationRelationService . selectMerchantList ( thirdPlatformType ) ;
PageInfo < MerchantInfoVO > pageInfo = new PageInfo < > ( merchantList ) ;
List < SupOperatorInfo > operatorInfos = Lists . newArrayList ( ) ;
if ( CollectionUtils . isNotEmpty ( pageInfo . getList ( ) ) ) {
SupOperatorInfo supOperatorInfo ;
for ( MerchantInfoVO merchantInfoVO : pageInfo . getList ( ) ) {
supOperatorInfo = new SupOperatorInfo ( ) ;
supOperatorInfo . setOperatorID ( MerchantUtils . getOperatorID ( merchantInfoVO . getOrganizationCode ( ) ) ) ;
supOperatorInfo . setOperatorUSCID ( merchantInfoVO . getOrganizationCode ( ) ) ;
supOperatorInfo . setOperatorName ( merchantInfoVO . getMerchantName ( ) ) ;
supOperatorInfo . setOperatorTel1 ( merchantInfoVO . getMerchantTel ( ) ) ;
supOperatorInfo . setOperatorRegAddress ( merchantInfoVO . getMerchantAddress ( ) ) ;
operatorInfos . add ( supOperatorInfo ) ;
}
}
ThirdPartySecretInfoVO thirdPartySecretInfoVO = thirdpartySecretInfoService . queryByThirdPlatformType ( thirdPlatformType ) ;
// 组装结果集
Map < String , Object > map = Maps . newHashMap ( ) ;
map . put ( " PageNo " , pageInfo . getPageNum ( ) ) ;
map . put ( " PageCount " , pageInfo . getPages ( ) ) ;
map . put ( " ItemSize " , pageInfo . getTotal ( ) ) ;
map . put ( " OperatorInfos " , operatorInfos ) ;
Map < String , String > resultMap = ThirdPartyPlatformUtils . generateResultMap ( map , thirdPartySecretInfoVO ) ;
return resultMap ;
}
/**
* 查询充电站信息 query_stations_info
* 此接口用于查询对接平台的充电站的信息
*
* @param dto 查询站点信息dto
* @throws UnsupportedOperationException 未实现异常
*/
@Override
public Map < String , String > queryStationsInfo ( QueryStationInfoDTO dto ) {
int pageNo = dto . getPageNo ( ) = = null ? 1 : dto . getPageNo ( ) ;
int pageSize = dto . getPageSize ( ) = = null ? 10 : dto . getPageSize ( ) ;
PageUtils . startPage ( pageNo , pageSize ) ;
List < ThirdPartyStationInfoVO > stationInfos = pileStationInfoService . getStationInfosByThirdParty ( dto ) ;
if ( CollectionUtils . isEmpty ( stationInfos ) ) {
// 未查到数据
return null ;
}
// ThirdPartyPlatformConfig configInfo = thirdPartyPlatformConfigService.getInfoByOperatorId(dto.getOperatorId());
ThirdPartySecretInfoVO thirdPartySecretInfoVO = thirdpartySecretInfoService . queryByThirdPlatformType ( thirdPlatformType ) ;
if ( thirdPartySecretInfoVO = = null ) {
return null ;
}
PageInfo < ThirdPartyStationInfoVO > pageInfo = new PageInfo < > ( stationInfos ) ;
List < SupStationInfo > resultList = new ArrayList < > ( ) ;
for ( ThirdPartyStationInfoVO pileStationInfo : pageInfo . getList ( ) ) {
SupStationInfo stationInfo = new SupStationInfo ( ) ;
String stationId = String . valueOf ( pileStationInfo . getId ( ) ) ;
stationInfo . setStationID ( stationId ) ;
// 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 ( ) ) ) ;
stationInfo . setIsPublicParkingLot ( Integer . valueOf ( pileStationInfo . getPublicParking ( ) ) ) ;
stationInfo . setCountryCode ( pileStationInfo . getCountryCode ( ) ) ;
stationInfo . setAreaCode ( pileStationInfo . getAreaCode ( ) ) ;
stationInfo . setAddress ( pileStationInfo . getAddress ( ) ) ;
stationInfo . setServiceTel ( pileStationInfo . getStationTel ( ) ) ;
stationInfo . setStationType ( Integer . valueOf ( pileStationInfo . getStationType ( ) ) ) ;
stationInfo . setParkNums ( Integer . valueOf ( pileStationInfo . getParkNums ( ) ) ) ;
stationInfo . setStationLng ( new BigDecimal ( pileStationInfo . getStationLng ( ) ) ) ;
stationInfo . setStationLat ( new BigDecimal ( pileStationInfo . getStationLat ( ) ) ) ;
stationInfo . setConstruction ( Integer . valueOf ( pileStationInfo . getConstruction ( ) ) ) ;
stationInfo . setOpenAllDay ( Integer . valueOf ( pileStationInfo . getOpenAllDay ( ) ) ) ;
// stationInfo.setMinElectricityPrice(pileStationInfo); // 最低充电电费率
// stationInfo.setElectricityFee(); // 电费 xx元/度
// stationInfo.setServiceFee(); // 服务费 xx元/度
stationInfo . setParkFree ( Integer . valueOf ( pileStationInfo . getParkFree ( ) ) ) ;
stationInfo . setPayment ( pileStationInfo . getPayment ( ) ) ;
stationInfo . setSupportOrder ( Integer . valueOf ( pileStationInfo . getSupportOrder ( ) ) ) ;
// stationInfo.setParkFeeType(pileStationInfo); // 停车收费类型
stationInfo . setToiletFlag ( Integer . valueOf ( pileStationInfo . getToiletFlag ( ) ) ) ;
stationInfo . setStoreFlag ( Integer . valueOf ( pileStationInfo . getStoreFlag ( ) ) ) ;
stationInfo . setRestaurantFlag ( Integer . valueOf ( pileStationInfo . getRestaurantFlag ( ) ) ) ;
stationInfo . setLoungeFlag ( Integer . valueOf ( pileStationInfo . getLoungeFlag ( ) ) ) ;
stationInfo . setCanopyFlag ( Integer . valueOf ( pileStationInfo . getCanopyFlag ( ) ) ) ;
stationInfo . setPrinterFlag ( Integer . valueOf ( pileStationInfo . getPrinterFlag ( ) ) ) ;
stationInfo . setBarrierFlag ( Integer . valueOf ( pileStationInfo . getBarrierFlag ( ) ) ) ;
stationInfo . setParkingLockFlag ( Integer . valueOf ( pileStationInfo . getParkingLockFlag ( ) ) ) ;
List < EquipmentInfo > pileList = pileBasicInfoService . getPileListForLianLian ( stationId ) ;
if ( CollectionUtils . isNotEmpty ( pileList ) ) {
stationInfo . setEquipmentInfos ( pileList ) ; // 充电设备信息列表
}
resultList . add ( stationInfo ) ;
}
Map < String , Object > map = new LinkedHashMap < > ( ) ;
map . put ( " PageNo " , pageInfo . getPageNum ( ) ) ;
map . put ( " PageCount " , pageInfo . getPages ( ) ) ;
map . put ( " ItemSize " , pageInfo . getTotal ( ) ) ;
map . put ( " StationInfos " , resultList ) ;
Map < String , String > resultMap = ThirdPartyPlatformUtils . generateResultMap ( map , thirdPartySecretInfoVO ) ;
return resultMap ;
}
/**
* 设备接口状态查询 query_station_status
*
* @param dto 查询站点信息dto
* @throws UnsupportedOperationException 未实现异常
*/
@Override
public Map < String , String > queryStationStatus ( QueryStationInfoDTO dto ) {
List < String > stationIds = dto . getStationIds ( ) ;
List < StationStatusInfo > StationStatusInfos = new ArrayList < > ( ) ;
List < Object > connectorStatusInfos = new ArrayList < > ( ) ;
// ThirdPartyPlatformConfig configInfo = thirdPartyPlatformConfigService.getInfoByOperatorId(dto.getOperatorId());
ThirdPartySecretInfoVO thirdPartySecretInfoVO = thirdpartySecretInfoService . queryByThirdPlatformType ( thirdPlatformType ) ;
if ( thirdPartySecretInfoVO = = null ) {
return null ;
}
ConnectorStatusInfo connectorStatusInfo ;
for ( String stationId : stationIds ) {
StationStatusInfo stationStatusInfo = new StationStatusInfo ( ) ;
stationStatusInfo . setStationId ( stationId ) ;
// 根据站点id查询
List < ConnectorInfoVO > list = pileConnectorInfoService . getConnectorListForLianLian ( Long . parseLong ( stationId ) ) ;
for ( ConnectorInfoVO connectorInfoVO : list ) {
String connectorStatus = connectorInfoVO . getConnectorStatus ( ) ;
if ( StringUtils . equals ( connectorStatus , PileConnectorDataBaseStatusEnum . OCCUPIED_CHARGING . getValue ( ) ) ) {
// 充电中
ConnectorChargeStatusInfo info = new ConnectorChargeStatusInfo ( ) ;
OrderBasicInfo orderBasicInfo = orderBasicInfoService . queryChargingByPileConnectorCode ( connectorInfoVO . getPileConnectorCode ( ) ) ;
if ( orderBasicInfo = = null ) {
continue ;
}
List < RealTimeMonitorData > chargingRealTimeData = orderBasicInfoService . getChargingRealTimeData ( orderBasicInfo . getTransactionCode ( ) ) ;
if ( CollectionUtils . isNotEmpty ( chargingRealTimeData ) ) {
RealTimeMonitorData realTimeMonitorData = chargingRealTimeData . get ( 0 ) ;
info . setStartChargeSeq ( orderBasicInfo . getOrderCode ( ) ) ;
info . setConnectorID ( orderBasicInfo . getPileConnectorCode ( ) ) ;
info . setConnectorStatus ( Integer . valueOf ( connectorInfoVO . getConnectorStatus ( ) ) ) ;
info . setCurrentA ( new BigDecimal ( realTimeMonitorData . getOutputCurrent ( ) ) ) ;
info . setVoltageA ( new BigDecimal ( realTimeMonitorData . getOutputVoltage ( ) ) ) ;
info . setSoc ( new BigDecimal ( realTimeMonitorData . getSOC ( ) ) ) ;
info . setStartTime ( DateUtils . parseDateToStr ( DateUtils . YYYY_MM_DD_HH_MM_SS , orderBasicInfo . getChargeStartTime ( ) ) ) ;
info . setEndTime ( DateUtils . getDateTime ( ) ) ; // 本次采样时间
info . setTotalPower ( new BigDecimal ( realTimeMonitorData . getChargingDegree ( ) ) ) ; // 累计充电量
// info.setElecMoney(); // 累计电费
// info.setSeviceMoney(); // 累计服务费
info . setTotalMoney ( new BigDecimal ( realTimeMonitorData . getChargingAmount ( ) ) ) ;
connectorStatusInfos . add ( info ) ;
}
} else {
// 其他
connectorStatusInfo = new ConnectorStatusInfo ( ) ;
connectorStatusInfo . setConnectorID ( connectorInfoVO . getPileConnectorCode ( ) ) ;
connectorStatusInfo . setStatus ( Integer . parseInt ( connectorInfoVO . getConnectorStatus ( ) ) ) ;
connectorStatusInfos . add ( connectorStatusInfo ) ;
}
}
stationStatusInfo . setConnectorStatusInfos ( connectorStatusInfos ) ;
StationStatusInfos . add ( stationStatusInfo ) ;
}
// 将 StationStatusInfos 分页
int pageNum = 1 ;
int pageSize = 10 ;
List < StationStatusInfo > collect = StationStatusInfos . stream ( )
. skip ( ( pageNum - 1 ) * pageSize )
. limit ( pageSize )
. collect ( Collectors . toList ( ) ) ;
// int total = StationStatusInfos.size();
// int pages = PageUtil.totalPage(total, pageSize);
Map < String , Object > map = new LinkedHashMap < > ( ) ;
// map.put("Total", total);
map . put ( " StationStatusInfos " , collect ) ;
Map < String , String > resultMap = ThirdPartyPlatformUtils . generateResultMap ( map , thirdPartySecretInfoVO ) ;
return resultMap ;
}
/**
* 设备状态变化推送 notification_stationStatus
* 推送充电设备接口状态信息 supervise_notification_station_status
*
* @param dto
* @throws UnsupportedOperationException 未实现异常
*/
@Override
public String notificationStationStatus ( PushRealTimeInfoDTO dto ) {
String status = dto . getStatus ( ) ;
String pileConnectorCode = dto . getPileConnectorCode ( ) ;
// 查出该桩所属哪个站点
String pileSn = StringUtils . substring ( pileConnectorCode , 0 , 14 ) ;
PileStationVO stationVO = pileStationInfoService . getStationInfoByPileSn ( pileSn ) ;
// 通过站点id查询相关配置信息
ThirdPartyStationRelationVO relationInfo = thirdPartyStationRelationService . selectRelationInfo ( stationVO . getId ( ) ) ;
if ( relationInfo = = null ) {
return null ;
}
String operatorId = relationInfo . getOperatorId ( ) ;
String operatorSecret = relationInfo . getOperatorSecret ( ) ;
String signSecret = relationInfo . getSignSecret ( ) ;
String dataSecret = relationInfo . getDataSecret ( ) ;
String dataSecretIv = relationInfo . getDataSecretIv ( ) ;
String urlAddress = relationInfo . getUrlAddress ( ) ;
String url = urlAddress + BusinessInformationExchangeEnum . NOTIFICATION_STATION_STATUS . getValue ( ) ;
ConnectorStatusInfo info = ConnectorStatusInfo . builder ( )
. connectorID ( pileConnectorCode )
. status ( Integer . parseInt ( status ) )
. build ( ) ;
// 调用联联平台接口
JSONObject json = new JSONObject ( ) ;
json . put ( " ConnectorStatusInfo " , info ) ;
String jsonString = JSON . toJSONString ( json ) ;
// 获取令牌
String token = getToken ( urlAddress , operatorId , operatorSecret , dataSecretIv , signSecret , dataSecret ) ;
String result = HttpRequestUtil . sendPost ( token , jsonString , url , dataSecret , dataSecretIv , operatorId , signSecret ) ;
return result ;
}
@Override
public String notificationStationStatus ( String stationId , String pileConnectorCode , String status , ThirdPartySecretInfoVO secretInfoVO ) {
// 查询充电枪口状态
PileConnectorInfoVO connectorInfo = pileConnectorInfoService . getPileConnectorInfoByConnectorCode ( pileConnectorCode ) ;
if ( Objects . isNull ( connectorInfo ) ) {
throw new BusinessException ( ReturnCodeEnum . CODE_CONNECTOR_INFO_NULL_ERROR ) ;
}
String merchantId = connectorInfo . getMerchantId ( ) ;
MerchantInfoVO merchantInfoVO = pileMerchantInfoService . getMerchantInfoVO ( merchantId ) ;
if ( Objects . isNull ( merchantInfoVO ) ) {
throw new BusinessException ( ReturnCodeEnum . CODE_CONNECTOR_INFO_NULL_ERROR ) ;
}
SupConnectorStatusInfo info = SupConnectorStatusInfo . builder ( )
. operatorID ( Constants . JSOWELL_OPERATORID )
. equipmentOwnerID ( MerchantUtils . getOperatorID ( merchantInfoVO . getOrganizationCode ( ) ) )
. stationID ( connectorInfo . getStationId ( ) )
. equipmentID ( connectorInfo . getPileSn ( ) )
. connectorID ( pileConnectorCode )
. equipmentClassification ( Constants . ONE )
. status ( Integer . parseInt ( status ) )
. statusDesc ( PileConnectorDataBaseStatusEnum . getStatusDescription ( status ) )
. parkStatus ( Constants . ZERO )
. lockStatus ( Constants . ZERO )
. batteryStatus ( Constants . ZERO )
. batteryPackID ( " " )
. lastChangeTime ( DateUtils . getDateTime ( ) )
. build ( ) ;
// 调用联联平台接口
String operatorId = secretInfoVO . getTheirOperatorId ( ) ;
String operatorSecret = secretInfoVO . getTheirOperatorSecret ( ) ;
String signSecret = secretInfoVO . getTheirSigSecret ( ) ;
String dataSecret = secretInfoVO . getTheirDataSecret ( ) ;
String dataSecretIv = secretInfoVO . getTheirDataSecretIv ( ) ;
String urlAddress = secretInfoVO . getTheirUrlPrefix ( ) ;
String url = urlAddress + " supervise_notification_station_status " ;
// JSONObject json = new JSONObject();
// json.put("ConnectorStatusInfo", info);
String jsonString = JSON . toJSONString ( info ) ;
// 获取令牌
String token = getToken ( urlAddress , operatorId , operatorSecret , dataSecretIv , signSecret , dataSecret ) ;
String result = HttpRequestUtil . sendPost ( token , jsonString , url , dataSecret , dataSecretIv , operatorId , signSecret ) ;
return result ;
}
/**
* 充电订单推送 notification_charge_order_info
*
* @param orderCode 订单编号
* @throws UnsupportedOperationException 未实现异常
*/
@Override
public String notificationChargeOrderInfo ( String orderCode ) {
// 根据订单号查询出信息
OrderBasicInfo orderBasicInfo = orderBasicInfoService . getOrderInfoByOrderCode ( orderCode ) ;
if ( orderBasicInfo = = null ) {
return null ;
}
// 通过站点id查询相关配置信息
ThirdPartyStationRelationVO relationInfo = thirdPartyStationRelationService . selectRelationInfo ( orderBasicInfo . getStationId ( ) ) ;
if ( relationInfo = = null ) {
return null ;
}
String operatorId = relationInfo . getOperatorId ( ) ;
String operatorSecret = relationInfo . getOperatorSecret ( ) ;
String signSecret = relationInfo . getSignSecret ( ) ;
String dataSecret = relationInfo . getDataSecret ( ) ;
String dataSecretIv = relationInfo . getDataSecretIv ( ) ;
String urlAddress = relationInfo . getUrlAddress ( ) ;
// 根据订单号查询订单详情
OrderDetail orderDetail = orderBasicInfoService . getOrderDetailByOrderCode ( orderCode ) ;
if ( orderDetail = = null ) {
return null ;
}
// 推送地址
String url = urlAddress + " notification_orderInfo " ;
// 拼装成内蒙古平台所需格式对象
ChargeOrderInfo orderInfo = transformChargeOrderInfo ( orderBasicInfo , orderDetail ) ;
orderInfo . setOperatorID ( operatorId ) ;
String equipmentOwnerID ;
if ( MerchantUtils . isXiXiaoMerchant ( orderBasicInfo . getMerchantId ( ) ) ) {
equipmentOwnerID = Constants . OPERATORID_XI_XIAO ;
} else {
equipmentOwnerID = Constants . OPERATORID_LIANLIAN ;
}
orderInfo . setEquipmentOwnerID ( equipmentOwnerID ) ;
List < BillingPriceVO > billingList = pileBillingTemplateService . queryBillingPrice ( orderBasicInfo . getStationId ( ) ) ;
// 先将list按照 尖、峰、平、谷 时段排序
// List<BillingPriceVO> collect = billingList.stream().sorted(Comparator.comparing(BillingPriceVO::getTimeType)).collect(Collectors.toList());
// 再循环该list, 拼装对应的充电价格、费率
List < SupChargeDetails > chargeDetails = transformSupChargeDetails ( orderDetail , billingList ) ;
orderInfo . setChargeDetails ( chargeDetails ) ;
// 获取令牌
String token = getToken ( urlAddress , operatorId , operatorSecret , dataSecretIv , signSecret , dataSecret ) ;
if ( StringUtils . isBlank ( token ) ) {
return null ;
}
// 调用联联平台接口
JSONObject json = new JSONObject ( ) ;
json . put ( " ChargeOrderInfo " , orderInfo ) ;
String jsonString = JSON . toJSONString ( json ) ;
String result = HttpRequestUtil . sendPost ( token , jsonString , url , dataSecret , dataSecretIv , operatorId , signSecret ) ;
return result ;
}
@Override
public String notificationChargeOrderInfo ( String orderCode , ThirdPartySecretInfoVO secretInfoVO ) {
// 根据订单号查询出信息
OrderBasicInfo orderBasicInfo = orderBasicInfoService . getOrderInfoByOrderCode ( orderCode ) ;
if ( orderBasicInfo = = null ) {
return null ;
}
// 通过站点id查询相关配置信息
// ThirdPartyStationRelationVO relationInfo = thirdPartyStationRelationService.selectRelationInfo(orderBasicInfo.getStationId());
// if (relationInfo == null) {
// return null;
// }
String operatorId = secretInfoVO . getTheirOperatorId ( ) ;
String operatorSecret = secretInfoVO . getTheirOperatorSecret ( ) ;
String signSecret = secretInfoVO . getTheirSigSecret ( ) ;
String dataSecret = secretInfoVO . getTheirDataSecret ( ) ;
String dataSecretIv = secretInfoVO . getTheirDataSecretIv ( ) ;
String urlAddress = secretInfoVO . getTheirUrlPrefix ( ) ;
// 根据订单号查询订单详情
OrderDetail orderDetail = orderBasicInfoService . getOrderDetailByOrderCode ( orderCode ) ;
if ( orderDetail = = null ) {
return null ;
}
// 推送地址
String url = urlAddress + " notification_orderInfo " ;
// 拼装成内蒙古平台所需格式对象
ChargeOrderInfo orderInfo = transformChargeOrderInfo ( orderBasicInfo , orderDetail ) ;
orderInfo . setOperatorID ( operatorId ) ;
String equipmentOwnerID ;
if ( MerchantUtils . isXiXiaoMerchant ( orderBasicInfo . getMerchantId ( ) ) ) {
equipmentOwnerID = Constants . OPERATORID_XI_XIAO ;
} else {
equipmentOwnerID = Constants . OPERATORID_LIANLIAN ;
}
orderInfo . setEquipmentOwnerID ( equipmentOwnerID ) ;
List < BillingPriceVO > billingList = pileBillingTemplateService . queryBillingPrice ( orderBasicInfo . getStationId ( ) ) ;
// 先将list按照 尖、峰、平、谷 时段排序
// List<BillingPriceVO> collect = billingList.stream().sorted(Comparator.comparing(BillingPriceVO::getTimeType)).collect(Collectors.toList());
// 再循环该list, 拼装对应的充电价格、费率
List < SupChargeDetails > chargeDetails = transformSupChargeDetails ( orderDetail , billingList ) ;
orderInfo . setChargeDetails ( chargeDetails ) ;
// 获取令牌
String token = getToken ( urlAddress , operatorId , operatorSecret , dataSecretIv , signSecret , dataSecret ) ;
if ( StringUtils . isBlank ( token ) ) {
return null ;
}
// 调用联联平台接口
JSONObject json = new JSONObject ( ) ;
json . put ( " ChargeOrderInfo " , orderInfo ) ;
String jsonString = JSON . toJSONString ( json ) ;
String result = HttpRequestUtil . sendPost ( token , jsonString , url , dataSecret , dataSecretIv , operatorId , signSecret ) ;
return result ;
}
/**
* 推送充电状态 notification_equip_charge_status
* 推送充电状态信息 supervise_notification_equip_charge_status
*
* @param orderCode 订单编号
* @throws UnsupportedOperationException 未实现异常
*/
@Override
public String notificationEquipChargeStatus ( String orderCode ) {
// 根据订单号查询订单信息
OrderBasicInfo orderInfo = orderBasicInfoService . getOrderInfoByOrderCode ( orderCode ) ;
// 通过第三方平台类型查询相关配置信息
ThirdPartyStationRelation relation = new ThirdPartyStationRelation ( ) ;
relation . setThirdPartyType ( orderInfo . getThirdPartyType ( ) ) ;
ThirdPartyStationRelationVO relationInfo = thirdPartyStationRelationService . selectRelationInfo ( relation ) ;
// ThirdPartySettingInfo settingInfo = thirdPartySettingInfoService.getInfoByStationId(Long.parseLong(orderInfo.getStationId()));
if ( relationInfo = = null ) {
return null ;
}
String operatorId = relationInfo . getOperatorId ( ) ;
String operatorSecret = relationInfo . getOperatorSecret ( ) ;
String signSecret = relationInfo . getSignSecret ( ) ;
String dataSecret = relationInfo . getDataSecret ( ) ;
String dataSecretIv = relationInfo . getDataSecretIv ( ) ;
String urlAddress = relationInfo . getUrlAddress ( ) ;
String thirdPartyType = relationInfo . getThirdPartyType ( ) ;
// 调用 查询充电状态方法
QueryEquipChargeStatusDTO dto = new QueryEquipChargeStatusDTO ( ) ;
dto . setStartChargeSeq ( orderCode ) ;
// 根据type获取operatorId
String operatorIdByType = ThirdPartyOperatorIdEnum . getOperatorIdByType ( thirdPartyType ) ;
dto . setOperatorID ( operatorIdByType ) ;
Map < String , String > map = queryEquipChargeStatus ( dto ) ;
if ( map = = null ) {
return null ;
}
String data = map . get ( " Data " ) ;
// 解密data (此处解密需用 thirdparty_platform_config 的密钥配置)
ThirdPartyPlatformConfig configInfo = thirdPartyPlatformConfigService . getInfoByOperatorId ( operatorIdByType ) ;
ThirdPartySecretInfoVO thirdPartySecretInfoVO = thirdpartySecretInfoService . queryByThirdPlatformType ( thirdPlatformType ) ;
byte [ ] plainText = Cryptos . aesDecrypt ( Encodes . decodeBase64 ( data ) ,
configInfo . getDataSecret ( ) . getBytes ( ) , configInfo . getDataSecretIv ( ) . getBytes ( ) ) ;
String dataStr = new String ( plainText , StandardCharsets . UTF_8 ) ;
// 转成对应的对象
QueryChargingStatusVO vo = JSONObject . parseObject ( dataStr , QueryChargingStatusVO . class ) ;
String url = urlAddress + BusinessInformationExchangeEnum . NOTIFICATION_EQUIP_CHARGE_STATUS . getValue ( ) ;
// 调用联联平台接口
String jsonString = JSON . toJSONString ( vo ) ;
// 获取令牌
String token = getToken ( urlAddress , operatorId , operatorSecret , dataSecretIv , signSecret , dataSecret ) ;
String result = HttpRequestUtil . sendPost ( token , jsonString , url , dataSecret , dataSecretIv , operatorId , signSecret ) ;
return result ;
}
/**
* 推送充换电站用能统计信息 supervise_notification_operation_stats_info
*
* @param stationId
* @throws UnsupportedOperationException 未实现异常
*/
@Override
public String notificationOperationStatsInfo ( String stationId ) {
return ThirdPartyPlatformService . super . notificationOperationStatsInfo ( stationId ) ;
}
/**
* 推送充电站历史充电订单信息 supervise_notification_charge_order_info_history
*
* @param orderCode
* @throws UnsupportedOperationException 未实现异常
*/
@Override
public String notificationChargeOrderInfoHistory ( String orderCode ) {
// 根据订单号查询出信息
OrderBasicInfo orderBasicInfo = orderBasicInfoService . getOrderInfoByOrderCode ( orderCode ) ;
// 通过站点id查询相关配置信息
ThirdPartyStationRelationVO relationInfo = thirdPartyStationRelationService . selectRelationInfo ( orderBasicInfo . getStationId ( ) ) ;
if ( relationInfo = = null ) {
return null ;
}
OrderDetail orderDetail = orderBasicInfoService . getOrderDetailByOrderCode ( orderCode ) ;
String operatorId = relationInfo . getOperatorId ( ) ;
String operatorSecret = relationInfo . getOperatorSecret ( ) ;
String signSecret = relationInfo . getSignSecret ( ) ;
String dataSecret = relationInfo . getDataSecret ( ) ;
String dataSecretIv = relationInfo . getDataSecretIv ( ) ;
String urlAddress = relationInfo . getUrlAddress ( ) ;
String url = urlAddress + " supervise_notification_charge_order_info_history " ;
// 拼装成内蒙古平台所需格式对象
ChargeOrderInfo orderInfo = transformChargeOrderInfo ( orderBasicInfo , orderDetail ) ;
orderInfo . setOperatorID ( operatorId ) ;
String equipmentOwnerID ;
if ( MerchantUtils . isXiXiaoMerchant ( orderBasicInfo . getMerchantId ( ) ) ) {
equipmentOwnerID = Constants . OPERATORID_XI_XIAO ;
} else {
equipmentOwnerID = Constants . OPERATORID_LIANLIAN ;
}
orderInfo . setEquipmentOwnerID ( equipmentOwnerID ) ;
List < BillingPriceVO > billingList = pileBillingTemplateService . queryBillingPrice ( orderBasicInfo . getStationId ( ) ) ;
// 先将list按照 尖、峰、平、谷 时段排序
// List<BillingPriceVO> collect = billingList.stream().sorted(Comparator.comparing(BillingPriceVO::getTimeType)).collect(Collectors.toList());
// 再循环该list, 拼装对应的充电价格、费率
List < SupChargeDetails > chargeDetails = transformSupChargeDetails ( orderDetail , billingList ) ;
orderInfo . setChargeDetails ( chargeDetails ) ;
// 获取令牌
String token = getToken ( urlAddress , operatorId , operatorSecret , dataSecretIv , signSecret , dataSecret ) ;
if ( StringUtils . isBlank ( token ) ) {
return null ;
}
// 调用联联平台接口
JSONObject json = new JSONObject ( ) ;
json . put ( " ChargeOrderInfo " , orderInfo ) ;
String jsonString = JSON . toJSONString ( json ) ;
String result = HttpRequestUtil . sendPost ( token , jsonString , url , dataSecret , dataSecretIv , operatorId , signSecret ) ;
return result ;
}
/**
* 转换充电站充电订单信息
* @param orderBasicInfo
* @param orderDetail
* @return
*/
private ChargeOrderInfo transformChargeOrderInfo ( OrderBasicInfo orderBasicInfo , OrderDetail orderDetail ) {
ChargeOrderInfo chargeOrderInfo = ChargeOrderInfo . builder ( )
. stationID ( orderBasicInfo . getStationId ( ) )
. equipmentID ( orderBasicInfo . getPileSn ( ) )
. orderNo ( orderBasicInfo . getOrderCode ( ) )
. connectorID ( orderBasicInfo . getPileConnectorCode ( ) )
. licensePlate ( orderBasicInfo . getPlateNumber ( ) )
. vin ( orderBasicInfo . getVinCode ( ) )
. startSOC ( orderBasicInfo . getStartSoc ( ) )
. endSOC ( orderBasicInfo . getEndSoc ( ) )
. startTime ( DateUtils . parseDateToStr ( DateUtils . YYYY_MM_DD_HH_MM_SS , orderBasicInfo . getChargeStartTime ( ) ) )
. endTime ( DateUtils . parseDateToStr ( DateUtils . YYYY_MM_DD_HH_MM_SS , orderBasicInfo . getChargeEndTime ( ) ) )
. totalPower ( orderDetail . getTotalUsedElectricity ( ) )
. cuspElect ( orderDetail . getSharpUsedElectricity ( ) )
. peakElect ( orderDetail . getSharpUsedElectricity ( ) )
. flatElect ( orderDetail . getFlatUsedElectricity ( ) )
. valleyElect ( orderDetail . getValleyUsedElectricity ( ) )
. pushTimeStamp ( DateUtils . getDateTime ( ) )
. totalElecMoney ( orderDetail . getTotalElectricityAmount ( ) )
. totalSeviceMoney ( orderDetail . getTotalServiceAmount ( ) )
. totalMoney ( orderDetail . getTotalOrderAmount ( ) )
. stopReason ( 0 )
. stopDesc ( orderBasicInfo . getReason ( ) ) // TODO 停止原因
. sumPeriod ( 0 )
. build ( ) ;
return chargeOrderInfo ;
}
/**
* 转换时段充电明细
* @param orderDetail
* @param billingList
* @return
*/
private List < SupChargeDetails > transformSupChargeDetails ( OrderDetail orderDetail , List < BillingPriceVO > billingList ) {
List < SupChargeDetails > resultList = Lists . newArrayList ( ) ;
SupChargeDetails detail ;
for ( BillingPriceVO billingPriceVO : billingList ) {
detail = new SupChargeDetails ( ) ;
if ( StringUtils . equals ( billingPriceVO . getTimeType ( ) , BillingTimeTypeEnum . SHARP . getValue ( ) ) ) {
// 尖时段
detail . setDetailStartTime ( billingPriceVO . getStartTime ( ) ) ;
detail . setDetailEndTime ( billingPriceVO . getEndTime ( ) ) ;
detail . setElecPrice ( new BigDecimal ( billingPriceVO . getElectricityPrice ( ) ) . setScale ( 4 , BigDecimal . ROUND_HALF_UP ) ) ;
detail . setSevicePrice ( new BigDecimal ( billingPriceVO . getServicePrice ( ) ) . setScale ( 4 , BigDecimal . ROUND_HALF_UP ) ) ;
detail . setDetailPower ( orderDetail . getSharpUsedElectricity ( ) ) ;
detail . setDetailElecMoney ( orderDetail . getSharpElectricityPrice ( ) ) ;
detail . setDetailSeviceMoney ( orderDetail . getSharpServicePrice ( ) ) ;
} else if ( StringUtils . equals ( billingPriceVO . getTimeType ( ) , BillingTimeTypeEnum . PEAK . getValue ( ) ) ) {
// 峰时段
detail . setDetailStartTime ( billingPriceVO . getStartTime ( ) ) ;
detail . setDetailEndTime ( billingPriceVO . getEndTime ( ) ) ;
detail . setElecPrice ( new BigDecimal ( billingPriceVO . getElectricityPrice ( ) ) . setScale ( 4 , BigDecimal . ROUND_HALF_UP ) ) ;
detail . setSevicePrice ( new BigDecimal ( billingPriceVO . getServicePrice ( ) ) . setScale ( 4 , BigDecimal . ROUND_HALF_UP ) ) ;
detail . setDetailPower ( orderDetail . getPeakUsedElectricity ( ) ) ;
detail . setDetailElecMoney ( orderDetail . getPeakElectricityPrice ( ) ) ;
detail . setDetailSeviceMoney ( orderDetail . getPeakServicePrice ( ) ) ;
} else if ( StringUtils . equals ( billingPriceVO . getTimeType ( ) , BillingTimeTypeEnum . FLAT . getValue ( ) ) ) {
// 平时段
detail . setDetailStartTime ( billingPriceVO . getStartTime ( ) ) ;
detail . setDetailEndTime ( billingPriceVO . getEndTime ( ) ) ;
detail . setElecPrice ( new BigDecimal ( billingPriceVO . getElectricityPrice ( ) ) . setScale ( 4 , BigDecimal . ROUND_HALF_UP ) ) ;
detail . setSevicePrice ( new BigDecimal ( billingPriceVO . getServicePrice ( ) ) . setScale ( 4 , BigDecimal . ROUND_HALF_UP ) ) ;
detail . setDetailPower ( orderDetail . getFlatUsedElectricity ( ) ) ;
detail . setDetailElecMoney ( orderDetail . getFlatElectricityPrice ( ) ) ;
detail . setDetailSeviceMoney ( orderDetail . getFlatServicePrice ( ) ) ;
} else if ( StringUtils . equals ( billingPriceVO . getTimeType ( ) , BillingTimeTypeEnum . VALLEY . getValue ( ) ) ) {
// 谷时段
detail . setDetailStartTime ( billingPriceVO . getStartTime ( ) ) ;
detail . setDetailEndTime ( billingPriceVO . getEndTime ( ) ) ;
detail . setElecPrice ( new BigDecimal ( billingPriceVO . getElectricityPrice ( ) ) . setScale ( 4 , BigDecimal . ROUND_HALF_UP ) ) ;
detail . setSevicePrice ( new BigDecimal ( billingPriceVO . getServicePrice ( ) ) . setScale ( 4 , BigDecimal . ROUND_HALF_UP ) ) ;
detail . setDetailPower ( orderDetail . getValleyUsedElectricity ( ) ) ;
detail . setDetailElecMoney ( orderDetail . getValleyElectricityPrice ( ) ) ;
detail . setDetailSeviceMoney ( orderDetail . getValleyServicePrice ( ) ) ;
}
resultList . add ( detail ) ;
}
return resultList ;
}
}