mirror of
https://codeup.aliyun.com/67c68d4e484ca2f0a13ac3c1/ydc/jsowell-charger-web.git
synced 2026-07-18 21:18:01 +08:00
对接科拓停车优惠
This commit is contained in:
@@ -17,6 +17,8 @@ import com.jsowell.common.util.StringUtils;
|
||||
import com.jsowell.pile.domain.CarCouponRecord;
|
||||
import com.jsowell.pile.domain.OrderBasicInfo;
|
||||
import com.jsowell.pile.domain.PileBasicInfo;
|
||||
import com.jsowell.pile.domain.PileConnectorInfo;
|
||||
import com.jsowell.pile.domain.PileStationInfo;
|
||||
import com.jsowell.pile.domain.ThirdPartyStationRelation;
|
||||
import com.jsowell.pile.dto.PushRealTimeInfoDTO;
|
||||
import com.jsowell.pile.dto.PushStationInfoDTO;
|
||||
@@ -34,6 +36,8 @@ import com.jsowell.thirdparty.huawei.HuaweiServiceV2;
|
||||
import com.jsowell.thirdparty.lianlian.service.LianLianService;
|
||||
import com.jsowell.thirdparty.nanrui.service.NRService;
|
||||
import com.jsowell.thirdparty.parking.common.bean.QcyunParkCouponDTO;
|
||||
import com.jsowell.thirdparty.parking.common.bean.KetuoChargePileDeductionDTO;
|
||||
import com.jsowell.thirdparty.parking.service.KetuoService;
|
||||
import com.jsowell.thirdparty.parking.service.LTYTService;
|
||||
import com.jsowell.thirdparty.parking.service.QcyunsService;
|
||||
import com.jsowell.thirdparty.parking.service.RJService;
|
||||
@@ -54,6 +58,7 @@ import org.springframework.stereotype.Service;
|
||||
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import java.math.BigDecimal;
|
||||
import java.math.RoundingMode;
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
import java.security.NoSuchProviderException;
|
||||
import java.security.spec.InvalidKeySpecException;
|
||||
@@ -112,6 +117,12 @@ public class CommonService {
|
||||
@Autowired
|
||||
private QcyunsService qcyunsService;
|
||||
|
||||
@Autowired
|
||||
private KetuoService ketuoService;
|
||||
|
||||
@Autowired
|
||||
private PileConnectorInfoService pileConnectorInfoService;
|
||||
|
||||
@Autowired
|
||||
private HuaweiServiceV2 huaweiServiceV2;
|
||||
|
||||
@@ -827,6 +838,11 @@ public class CommonService {
|
||||
.discountValue(chargeParkingDiscount.getDiscountValue())
|
||||
.build();
|
||||
discountFlag = qcyunsService.issuanceOfParkingTickets(dto);
|
||||
} else if (StringUtils.equals(ParkingPlatformEnum.KE_TUO_PLATFORM.getCode(), parkingPlatformId)) {
|
||||
// 科拓--充电桩抵扣
|
||||
KetuoChargePileDeductionDTO dto = buildKetuoChargePileDeductionDTO(
|
||||
realTimeMonitorData, orderBasicInfo, chargeParkingDiscount);
|
||||
discountFlag = ketuoService.syncChargePilePay(dto);
|
||||
}
|
||||
|
||||
if (discountFlag) {
|
||||
@@ -842,6 +858,81 @@ public class CommonService {
|
||||
}
|
||||
}
|
||||
|
||||
private KetuoChargePileDeductionDTO buildKetuoChargePileDeductionDTO(RealTimeMonitorData realTimeMonitorData,
|
||||
OrderBasicInfo orderBasicInfo,
|
||||
ChargeParkingDiscountVO chargeParkingDiscount) {
|
||||
PileStationInfo stationInfo = pileStationInfoService.selectPileStationInfoById(Long.parseLong(orderBasicInfo.getStationId()));
|
||||
PileBasicInfo pileBasicInfo = pileBasicInfoService.selectPileBasicInfoBySN(orderBasicInfo.getPileSn());
|
||||
PileConnectorInfo connectorInfo = getPileConnectorInfo(orderBasicInfo);
|
||||
|
||||
Integer totalMoney = yuanToFen(realTimeMonitorData.getChargingAmount());
|
||||
Integer freeMoney = Constants.TWO.equals(String.valueOf(chargeParkingDiscount.getDiscountType()))
|
||||
? yuanToFen(chargeParkingDiscount.getDiscountValue())
|
||||
: 0;
|
||||
Integer freeTime = Constants.ONE.equals(String.valueOf(chargeParkingDiscount.getDiscountType()))
|
||||
? minutesToSeconds(chargeParkingDiscount.getDiscountValue())
|
||||
: 0;
|
||||
|
||||
return KetuoChargePileDeductionDTO.builder()
|
||||
.stationId(orderBasicInfo.getStationId())
|
||||
.orderNo(orderBasicInfo.getOrderCode())
|
||||
.plateNo(orderBasicInfo.getPlateNumber())
|
||||
.startTime(formatDateTime(orderBasicInfo.getChargeStartTime(), orderBasicInfo.getCreateTime()))
|
||||
.endTime(formatDateTime(orderBasicInfo.getChargeEndTime(), new java.util.Date()))
|
||||
.stationName(stationInfo == null ? orderBasicInfo.getStationId() : stationInfo.getStationName())
|
||||
.deviceId(orderBasicInfo.getPileSn())
|
||||
.deviceName(pileBasicInfo == null || StringUtils.isBlank(pileBasicInfo.getName())
|
||||
? orderBasicInfo.getPileSn() : pileBasicInfo.getName())
|
||||
.spaceNo(connectorInfo == null || StringUtils.isBlank(connectorInfo.getParkNo())
|
||||
? "0" : connectorInfo.getParkNo())
|
||||
.power(formatPower(realTimeMonitorData.getChargingDegree()))
|
||||
.elecMoney(0)
|
||||
.seviceMoney(totalMoney)
|
||||
.totalMoney(totalMoney)
|
||||
.freeType(0)
|
||||
.freeMoney(freeMoney)
|
||||
.freeTime(freeTime)
|
||||
.build();
|
||||
}
|
||||
|
||||
private PileConnectorInfo getPileConnectorInfo(OrderBasicInfo orderBasicInfo) {
|
||||
if (StringUtils.isBlank(orderBasicInfo.getPileConnectorCode())) {
|
||||
return null;
|
||||
}
|
||||
PileConnectorInfo query = new PileConnectorInfo();
|
||||
query.setPileConnectorCode(orderBasicInfo.getPileConnectorCode());
|
||||
List<PileConnectorInfo> connectorInfoList = pileConnectorInfoService.selectPileConnectorInfoList(query);
|
||||
if (CollectionUtils.isNotEmpty(connectorInfoList)) {
|
||||
return connectorInfoList.get(0);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private String formatDateTime(java.util.Date date, java.util.Date defaultDate) {
|
||||
return DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, date == null ? defaultDate : date);
|
||||
}
|
||||
|
||||
private String formatPower(String power) {
|
||||
if (StringUtils.isBlank(power)) {
|
||||
return "0.00";
|
||||
}
|
||||
return new BigDecimal(power).setScale(2, RoundingMode.HALF_UP).toPlainString();
|
||||
}
|
||||
|
||||
private Integer yuanToFen(String amount) {
|
||||
if (StringUtils.isBlank(amount)) {
|
||||
return 0;
|
||||
}
|
||||
return new BigDecimal(amount).multiply(new BigDecimal("100")).setScale(0, RoundingMode.HALF_UP).intValue();
|
||||
}
|
||||
|
||||
private Integer minutesToSeconds(String minutes) {
|
||||
if (StringUtils.isBlank(minutes)) {
|
||||
return 0;
|
||||
}
|
||||
return new BigDecimal(minutes).multiply(new BigDecimal("60")).setScale(0, RoundingMode.HALF_UP).intValue();
|
||||
}
|
||||
|
||||
/**
|
||||
* 统一请求启动充电,目前给华为平台用
|
||||
* @param dto
|
||||
|
||||
@@ -0,0 +1,68 @@
|
||||
package com.jsowell.thirdparty.parking.common.bean;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
/**
|
||||
* 科拓充电桩抵扣 DTO.
|
||||
*/
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
@Builder
|
||||
public class KetuoChargePileDeductionDTO {
|
||||
private String stationId;
|
||||
|
||||
private String orderNo;
|
||||
|
||||
private String plateNo;
|
||||
|
||||
private String startTime;
|
||||
|
||||
private String endTime;
|
||||
|
||||
private String stationName;
|
||||
|
||||
private String deviceId;
|
||||
|
||||
private String deviceName;
|
||||
|
||||
private String spaceNo;
|
||||
|
||||
/**
|
||||
* 充电量,单位度,小数点后 2 位。
|
||||
*/
|
||||
private String power;
|
||||
|
||||
/**
|
||||
* 电费,单位分。
|
||||
*/
|
||||
private Integer elecMoney;
|
||||
|
||||
/**
|
||||
* 服务费/附加费,单位分。科拓接口字段名为 seviceMoney。
|
||||
*/
|
||||
private Integer seviceMoney;
|
||||
|
||||
/**
|
||||
* 总费用,单位分。
|
||||
*/
|
||||
private Integer totalMoney;
|
||||
|
||||
/**
|
||||
* 0: 根据 freeMoney/freeTime 减免; 1: 本地车场配置减免规则。
|
||||
*/
|
||||
private Integer freeType;
|
||||
|
||||
/**
|
||||
* 减免停车金额,单位分。
|
||||
*/
|
||||
private Integer freeMoney;
|
||||
|
||||
/**
|
||||
* 减免停车时长,单位秒。
|
||||
*/
|
||||
private Integer freeTime;
|
||||
}
|
||||
11
jsowell-thirdparty/src/main/java/com/jsowell/thirdparty/parking/service/KetuoService.java
vendored
Normal file
11
jsowell-thirdparty/src/main/java/com/jsowell/thirdparty/parking/service/KetuoService.java
vendored
Normal file
@@ -0,0 +1,11 @@
|
||||
package com.jsowell.thirdparty.parking.service;
|
||||
|
||||
import com.jsowell.thirdparty.parking.common.bean.KetuoChargePileDeductionDTO;
|
||||
|
||||
public interface KetuoService {
|
||||
|
||||
/**
|
||||
* 科拓--充电桩抵扣。
|
||||
*/
|
||||
boolean syncChargePilePay(KetuoChargePileDeductionDTO dto);
|
||||
}
|
||||
139
jsowell-thirdparty/src/main/java/com/jsowell/thirdparty/parking/service/impl/KetuoServiceImpl.java
vendored
Normal file
139
jsowell-thirdparty/src/main/java/com/jsowell/thirdparty/parking/service/impl/KetuoServiceImpl.java
vendored
Normal file
@@ -0,0 +1,139 @@
|
||||
package com.jsowell.thirdparty.parking.service.impl;
|
||||
|
||||
import cn.hutool.http.HttpUtil;
|
||||
import com.alibaba.fastjson2.JSON;
|
||||
import com.alibaba.fastjson2.JSONObject;
|
||||
import com.jsowell.common.enums.parkplatform.ParkingPlatformEnum;
|
||||
import com.jsowell.common.util.StringUtils;
|
||||
import com.jsowell.common.util.id.UUID;
|
||||
import com.jsowell.common.util.sign.MD5Util;
|
||||
import com.jsowell.pile.domain.ThirdpartyParkingConfig;
|
||||
import com.jsowell.pile.service.ThirdPartyParkingConfigService;
|
||||
import com.jsowell.thirdparty.parking.common.bean.KetuoChargePileDeductionDTO;
|
||||
import com.jsowell.thirdparty.parking.service.KetuoService;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.TreeMap;
|
||||
|
||||
@Slf4j
|
||||
@Service
|
||||
public class KetuoServiceImpl implements KetuoService {
|
||||
|
||||
private static final String SERVICE_CODE_SYNC_CHARGE_PILE_PAY = "syncChargePilePay";
|
||||
|
||||
private static final String API_PATH_SYNC_CHARGE_PILE_PAY = "/api/wec/SyncChargePilePay";
|
||||
|
||||
@Autowired
|
||||
private ThirdPartyParkingConfigService thirdPartyParkingConfigService;
|
||||
|
||||
@Override
|
||||
public boolean syncChargePilePay(KetuoChargePileDeductionDTO dto) {
|
||||
ThirdpartyParkingConfig parkingConfig = resolveParkingConfig(dto);
|
||||
if (parkingConfig == null) {
|
||||
return false;
|
||||
}
|
||||
JSONObject requestBody = buildRequestBody(dto, parkingConfig);
|
||||
requestBody.put("key", generateKey(requestBody, parkingConfig.getSecretKey()));
|
||||
|
||||
String requestUrl = getRequestUrl(parkingConfig);
|
||||
log.info("科拓充电桩抵扣 requestUrl:{}, requestBody:{}", requestUrl, requestBody.toJSONString());
|
||||
String result = HttpUtil.post(requestUrl, requestBody.toJSONString());
|
||||
if (StringUtils.isBlank(result)) {
|
||||
log.warn("科拓充电桩抵扣返回为空, requestBody:{}", requestBody.toJSONString());
|
||||
return false;
|
||||
}
|
||||
JSONObject response = JSON.parseObject(result);
|
||||
log.info("科拓充电桩抵扣 response:{}", JSON.toJSONString(response));
|
||||
return StringUtils.equals("0", response.getString("resCode"));
|
||||
}
|
||||
|
||||
private ThirdpartyParkingConfig resolveParkingConfig(KetuoChargePileDeductionDTO dto) {
|
||||
if (dto == null || StringUtils.isBlank(dto.getStationId())) {
|
||||
log.warn("科拓充电桩抵扣失败, stationId为空, dto:{}", JSON.toJSONString(dto));
|
||||
return null;
|
||||
}
|
||||
ThirdpartyParkingConfig parkingConfig = thirdPartyParkingConfigService.selectByStationId(dto.getStationId());
|
||||
if (parkingConfig == null) {
|
||||
log.warn("科拓充电桩抵扣失败, 站点未绑定停车场配置, stationId:{}", dto.getStationId());
|
||||
return null;
|
||||
}
|
||||
if (!StringUtils.equals(ParkingPlatformEnum.KE_TUO_PLATFORM.getCode(), parkingConfig.getPlatformType())) {
|
||||
log.warn("科拓充电桩抵扣失败, 站点绑定的停车平台类型不是科拓, stationId:{}, parkingConfigId:{}, platformType:{}",
|
||||
dto.getStationId(), parkingConfig.getId(), parkingConfig.getPlatformType());
|
||||
return null;
|
||||
}
|
||||
if (StringUtils.isBlank(parkingConfig.getAppId())
|
||||
|| StringUtils.isBlank(parkingConfig.getSecretKey())
|
||||
|| StringUtils.isBlank(parkingConfig.getParkId())) {
|
||||
log.warn("科拓充电桩抵扣失败, 停车场配置缺少appId/secretKey/parkId, stationId:{}, parkingConfigId:{}",
|
||||
dto.getStationId(), parkingConfig.getId());
|
||||
return null;
|
||||
}
|
||||
if (StringUtils.isBlank(parkingConfig.getApiUrl())) {
|
||||
log.warn("科拓充电桩抵扣失败, 停车场配置缺少apiUrl, stationId:{}, parkingConfigId:{}",
|
||||
dto.getStationId(), parkingConfig.getId());
|
||||
return null;
|
||||
}
|
||||
return parkingConfig;
|
||||
}
|
||||
|
||||
private JSONObject buildRequestBody(KetuoChargePileDeductionDTO dto, ThirdpartyParkingConfig parkingConfig) {
|
||||
JSONObject requestBody = new JSONObject();
|
||||
requestBody.put("appId", parkingConfig.getAppId());
|
||||
requestBody.put("parkId", parkingConfig.getParkId());
|
||||
requestBody.put("serviceCode", SERVICE_CODE_SYNC_CHARGE_PILE_PAY);
|
||||
requestBody.put("ts", System.currentTimeMillis());
|
||||
requestBody.put("reqId", UUID.randomUUID().toString().replace("-", ""));
|
||||
requestBody.put("orderNo", dto.getOrderNo());
|
||||
requestBody.put("plateNo", dto.getPlateNo());
|
||||
requestBody.put("startTime", dto.getStartTime());
|
||||
requestBody.put("endTime", dto.getEndTime());
|
||||
requestBody.put("stationId", dto.getStationId());
|
||||
requestBody.put("stationName", dto.getStationName());
|
||||
requestBody.put("deviceId", dto.getDeviceId());
|
||||
requestBody.put("deviceName", dto.getDeviceName());
|
||||
requestBody.put("spaceNo", dto.getSpaceNo());
|
||||
requestBody.put("power", dto.getPower());
|
||||
requestBody.put("elecMoney", dto.getElecMoney());
|
||||
requestBody.put("seviceMoney", dto.getSeviceMoney());
|
||||
requestBody.put("totalMoney", dto.getTotalMoney());
|
||||
requestBody.put("freeType", dto.getFreeType());
|
||||
requestBody.put("freeMoney", dto.getFreeMoney());
|
||||
requestBody.put("freeTime", dto.getFreeTime());
|
||||
return requestBody;
|
||||
}
|
||||
|
||||
private String generateKey(JSONObject requestBody, String appSecret) {
|
||||
TreeMap<String, String> params = new TreeMap<>();
|
||||
requestBody.entrySet().stream()
|
||||
.filter(entry -> !"key".equals(entry.getKey()) && !"appId".equals(entry.getKey()))
|
||||
.filter(entry -> entry.getValue() != null)
|
||||
.filter(entry -> !(entry.getValue() instanceof Map) && !(entry.getValue() instanceof Iterable))
|
||||
.filter(entry -> !StringUtils.equals("", entry.getValue().toString()))
|
||||
.forEach(entry -> params.put(entry.getKey(), entry.getValue().toString()));
|
||||
|
||||
StringBuilder signContent = new StringBuilder();
|
||||
for (Map.Entry<String, String> entry : params.entrySet()) {
|
||||
if (signContent.length() > 0) {
|
||||
signContent.append("&");
|
||||
}
|
||||
signContent.append(entry.getKey()).append("=").append(entry.getValue());
|
||||
}
|
||||
signContent.append("&").append(appSecret);
|
||||
return MD5Util.MD5Encode(signContent.toString()).toUpperCase();
|
||||
}
|
||||
|
||||
private String getRequestUrl(ThirdpartyParkingConfig parkingConfig) {
|
||||
String apiUrl = parkingConfig.getApiUrl();
|
||||
if (apiUrl.endsWith(API_PATH_SYNC_CHARGE_PILE_PAY)) {
|
||||
return apiUrl;
|
||||
}
|
||||
while (apiUrl.endsWith("/")) {
|
||||
apiUrl = apiUrl.substring(0, apiUrl.length() - 1);
|
||||
}
|
||||
return apiUrl + API_PATH_SYNC_CHARGE_PILE_PAY;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user