1 Commits

Author SHA1 Message Date
jsowell
0ec61089fc update qcyun停车优化 2026-06-24 14:39:02 +08:00
14 changed files with 305 additions and 119 deletions

View File

@@ -563,25 +563,25 @@ public class PersonPileController extends BaseController {
}
/**
* 羽信主板修改预约充电状态
* http://localhost:8080/uniapp/personalPile/yuxin/updateReservedStatus
* 羽信主板取消预约充电
* http://localhost:8080/uniapp/personalPile/yuxin/cancelReservation
*/
@PostMapping("/yuxin/updateReservedStatus")
@PostMapping("/yuxin/cancelReservation")
public RestApiResponse<?> cancelYuxinReservation(HttpServletRequest request, @RequestBody YuxinReservationChargingDTO dto) {
RestApiResponse<?> response = null;
try {
String memberId = getMemberIdByAuthorization(request);
dto.setMemberId(memberId);
yuxinReservationChargingService.updateReservedStatus(dto);
yuxinReservationChargingService.cancelReservation(dto);
response = new RestApiResponse<>();
} catch (BusinessException e) {
logger.error("羽信修改预约充电状态error, params:{}", dto, e);
logger.error("羽信取消预约充电error, params:{}", dto, e);
response = new RestApiResponse<>(e.getCode(), e.getMessage());
} catch (Exception e) {
logger.error("羽信修改预约充电状态error, params:{}", dto, e);
logger.error("羽信取消预约充电error, params:{}", dto, e);
response = new RestApiResponse<>(ReturnCodeEnum.CODE_UPDATE_RESERVED_STATUS_ERROR);
}
logger.info("羽信修改预约充电状态params:{}, result:{}", dto, response);
logger.info("羽信取消预约充电params:{}, result:{}", dto, response);
return response;
}

View File

@@ -26,6 +26,11 @@ public class ThirdpartyParkingConfig {
*/
private String parkingName;
/**
* 停车平台类型(1-路通云停;2-软杰;3-qcyun)
*/
private String platformType;
/**
* 停车场库appId
*/
@@ -46,6 +51,21 @@ public class ThirdpartyParkingConfig {
*/
private String couponId;
/**
* qcyun机构ID
*/
private String orgId;
/**
* qcyun车场ID
*/
private String parkId;
/**
* 平台接口地址
*/
private String apiUrl;
private Date createTime;
private String createBy;

View File

@@ -23,11 +23,6 @@ public class YuxinReservationChargingDTO {
*/
private String reservedId;
/**
* 状态 0-停用1-启用)
*/
private String status;
/**
* 充电桩编号
*/

View File

@@ -61,4 +61,12 @@ public interface ThirdpartyParkingConfigMapper {
* @return
*/
List<ThirdpartyParkingConfig> selectInfoList();
/**
* 根据站点查询绑定的停车平台配置
*
* @param stationId 站点id
* @return 停车平台配置
*/
ThirdpartyParkingConfig selectByStationId(String stationId);
}

View File

@@ -57,4 +57,12 @@ public interface ThirdPartyParkingConfigService {
* 查询基本信息列表(调用时需分页)
*/
List<ThirdpartyParkingConfig> selectInfoList();
/**
* 根据站点查询绑定的停车平台配置
*
* @param stationId 站点id
* @return 停车平台配置
*/
ThirdpartyParkingConfig selectByStationId(String stationId);
}

View File

@@ -14,6 +14,4 @@ public interface YuxinReservationChargingService {
void deleteReservation(YuxinReservationChargingDTO dto);
PileReservationInfoVO queryReservationInfo(YuxinReservationChargingDTO dto);
void updateReservedStatus(YuxinReservationChargingDTO dto);
}

View File

@@ -59,4 +59,9 @@ public class ThirdPartyParkingConfigServiceImpl implements ThirdPartyParkingConf
return thirdpartyParkingConfigMapper.selectInfoList();
}
@Override
public ThirdpartyParkingConfig selectByStationId(String stationId) {
return thirdpartyParkingConfigMapper.selectByStationId(stationId);
}
}

View File

@@ -181,11 +181,6 @@ public class YuxinReservationChargingServiceImpl implements YuxinReservationChar
.build();
}
@Override
public void updateReservedStatus(YuxinReservationChargingDTO dto) {
}
private void fillReservationInfo(PileReservationInfo reservationInfo, YuxinReservationChargingDTO dto) {
reservationInfo.setMemberId(dto.getMemberId());
reservationInfo.setPileSn(dto.getPileSn());

View File

@@ -6,10 +6,14 @@
<!--@Table thirdparty_parking_config-->
<id column="id" jdbcType="INTEGER" property="id"/>
<result column="parking_name" jdbcType="VARCHAR" property="parkingName"/>
<result column="platform_type" jdbcType="VARCHAR" property="platformType"/>
<result column="app_id" jdbcType="VARCHAR" property="appId"/>
<result column="secret_key" jdbcType="VARCHAR" property="secretKey"/>
<result column="parking_merchant_id" jdbcType="VARCHAR" property="parkingMerchantId"/>
<result column="coupon_id" jdbcType="VARCHAR" property="couponId"/>
<result column="org_id" jdbcType="VARCHAR" property="orgId"/>
<result column="park_id" jdbcType="VARCHAR" property="parkId"/>
<result column="api_url" jdbcType="VARCHAR" property="apiUrl"/>
<result column="create_time" jdbcType="TIMESTAMP" property="createTime"/>
<result column="create_by" jdbcType="VARCHAR" property="createBy"/>
<result column="update_time" jdbcType="TIMESTAMP" property="updateTime"/>
@@ -21,10 +25,14 @@
<!--@mbg.generated-->
id,
parking_name,
platform_type,
app_id,
secret_key,
parking_merchant_id,
coupon_id,
org_id,
park_id,
api_url,
create_time,
create_by,
update_time,
@@ -49,12 +57,13 @@
<insert id="insert" parameterType="com.jsowell.pile.domain.ThirdpartyParkingConfig">
<!--@mbg.generated-->
insert into thirdparty_parking_config (id, parking_name, app_id,
secret_key, parking_merchant_id, coupon_id,
insert into thirdparty_parking_config (id, parking_name, platform_type, app_id,
secret_key, parking_merchant_id, coupon_id, org_id, park_id, api_url,
create_time, create_by, update_time,
update_by, del_flag)
values (#{id,jdbcType=INTEGER}, #{parkingName,jdbcType=VARCHAR}, #{appId,jdbcType=VARCHAR},
values (#{id,jdbcType=INTEGER}, #{parkingName,jdbcType=VARCHAR}, #{platformType,jdbcType=VARCHAR}, #{appId,jdbcType=VARCHAR},
#{secretKey,jdbcType=VARCHAR}, #{parkingMerchantId,jdbcType=VARCHAR}, #{couponId,jdbcType=VARCHAR},
#{orgId,jdbcType=VARCHAR}, #{parkId,jdbcType=VARCHAR}, #{apiUrl,jdbcType=VARCHAR},
#{createTime,jdbcType=TIMESTAMP}, #{createBy,jdbcType=VARCHAR}, #{updateTime,jdbcType=TIMESTAMP},
#{updateBy,jdbcType=VARCHAR}, #{delFlag,jdbcType=VARCHAR})
</insert>
@@ -69,6 +78,9 @@
<if test="parkingName != null">
parking_name,
</if>
<if test="platformType != null">
platform_type,
</if>
<if test="appId != null">
app_id,
</if>
@@ -81,6 +93,15 @@
<if test="couponId != null">
coupon_id,
</if>
<if test="orgId != null">
org_id,
</if>
<if test="parkId != null">
park_id,
</if>
<if test="apiUrl != null">
api_url,
</if>
<if test="createTime != null">
create_time,
</if>
@@ -104,6 +125,9 @@
<if test="parkingName != null">
#{parkingName,jdbcType=VARCHAR},
</if>
<if test="platformType != null">
#{platformType,jdbcType=VARCHAR},
</if>
<if test="appId != null">
#{appId,jdbcType=VARCHAR},
</if>
@@ -116,6 +140,15 @@
<if test="couponId != null">
#{couponId,jdbcType=VARCHAR},
</if>
<if test="orgId != null">
#{orgId,jdbcType=VARCHAR},
</if>
<if test="parkId != null">
#{parkId,jdbcType=VARCHAR},
</if>
<if test="apiUrl != null">
#{apiUrl,jdbcType=VARCHAR},
</if>
<if test="createTime != null">
#{createTime,jdbcType=TIMESTAMP},
</if>
@@ -141,6 +174,9 @@
<if test="parkingName != null">
parking_name = #{parkingName,jdbcType=VARCHAR},
</if>
<if test="platformType != null">
platform_type = #{platformType,jdbcType=VARCHAR},
</if>
<if test="appId != null">
app_id = #{appId,jdbcType=VARCHAR},
</if>
@@ -153,6 +189,15 @@
<if test="couponId != null">
coupon_id = #{couponId,jdbcType=VARCHAR},
</if>
<if test="orgId != null">
org_id = #{orgId,jdbcType=VARCHAR},
</if>
<if test="parkId != null">
park_id = #{parkId,jdbcType=VARCHAR},
</if>
<if test="apiUrl != null">
api_url = #{apiUrl,jdbcType=VARCHAR},
</if>
<if test="createTime != null">
create_time = #{createTime,jdbcType=TIMESTAMP},
</if>
@@ -176,10 +221,14 @@
<!--@mbg.generated-->
update thirdparty_parking_config
set parking_name = #{parkingName,jdbcType=VARCHAR},
platform_type = #{platformType,jdbcType=VARCHAR},
app_id = #{appId,jdbcType=VARCHAR},
secret_key = #{secretKey,jdbcType=VARCHAR},
parking_merchant_id = #{parkingMerchantId,jdbcType=VARCHAR},
coupon_id = #{couponId,jdbcType=VARCHAR},
org_id = #{orgId,jdbcType=VARCHAR},
park_id = #{parkId,jdbcType=VARCHAR},
api_url = #{apiUrl,jdbcType=VARCHAR},
create_time = #{createTime,jdbcType=TIMESTAMP},
create_by = #{createBy,jdbcType=VARCHAR},
update_time = #{updateTime,jdbcType=TIMESTAMP},
@@ -193,4 +242,28 @@
<include refid="Base_Column_List"/>
from thirdparty_parking_config
</select>
<select id="selectByStationId" parameterType="java.lang.String" resultMap="BaseResultMap">
select
tpc.id,
tpc.parking_name,
tpc.platform_type,
tpc.app_id,
tpc.secret_key,
tpc.parking_merchant_id,
tpc.coupon_id,
tpc.org_id,
tpc.park_id,
tpc.api_url,
tpc.create_time,
tpc.create_by,
tpc.update_time,
tpc.update_by,
tpc.del_flag
from pile_station_info psi
inner join thirdparty_parking_config tpc on psi.parking_id = tpc.id
where psi.del_flag = '0'
and tpc.del_flag = '0'
and psi.id = #{stationId,jdbcType=VARCHAR}
</select>
</mapper>

View File

@@ -83,32 +83,17 @@ public class JsowellTask {
@Autowired
private AdapayUnsplitRecordHandleService adapayUnsplitRecordHandleService;
private static final String PRE_PROFILE = "pre";
private static final long YKC_DAILY_TIMECHECK_INTERVAL_MILLIS = 200L;
/**
* 设置挡板, PRE环境不执行
*/
public void setBarrier() {
skipInPre("设置挡板");
String env = SpringUtils.getActiveProfile();
if (StringUtils.equalsIgnoreCase(env, "pre")) {
log.debug("PRE环境不执行");
// return;
}
private boolean skipInPre(String taskName) {
if (!isPreProfile()) {
return false;
}
log.info("PRE环境不执行{}", taskName);
return true;
}
private boolean isPreProfile() {
String[] activeProfiles = SpringUtils.getActiveProfiles();
if (activeProfiles == null) {
return false;
}
return Arrays.stream(activeProfiles)
.anyMatch(profile -> StringUtils.equalsIgnoreCase(profile, PRE_PROFILE));
}
/**
@@ -116,7 +101,9 @@ public class JsowellTask {
* close15MinutesOfUnpaidOrders
*/
public void close15MinutesOfUnpaidOrders() {
if (skipInPre("关闭15分钟未支付的订单")) {
String env = SpringUtils.getActiveProfile();
if (StringUtils.equalsIgnoreCase(env, "pre")) {
log.debug("PRE环境不执行");
return;
}
// log.info("关闭15分钟未支付的订单");
@@ -128,8 +115,10 @@ public class JsowellTask {
* 订单支付成功在15分钟内未启动
*/
public void closeStartFailedOrder() {
if (skipInPre("关闭启动失败的订单")) {
return;
String env = SpringUtils.getActiveProfile();
if (StringUtils.equalsIgnoreCase(env, "pre")) {
log.debug("PRE环境不执行");
// return;
}
// 查询出最近2天支付成功并且订单状态为未启动的订单
String startTime = DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, DateUtils.addDays(new Date(), -2));
@@ -141,7 +130,9 @@ public class JsowellTask {
* 查询预约充电的订单并启动
*/
public void appointmentOrderStart() {
if (skipInPre("查询预约充电的订单并启动")) {
String env = SpringUtils.getActiveProfile();
if (StringUtils.equalsIgnoreCase(env, "pre")) {
log.debug("PRE环境不执行");
return;
}
// 查询出 已支付 设置预约充电 未启动 的订单
@@ -196,7 +187,9 @@ public class JsowellTask {
* jsowellTask.dailyProofreadTimeForYkcV160(200)
*/
public void dailyProofreadTimeForYkcV160(Long intervalMillis) {
if (skipInPre("云快充1.6每日自动对时")) {
String env = SpringUtils.getActiveProfile();
if (StringUtils.equalsIgnoreCase(env, "pre")) {
log.debug("PRE环境不执行");
return;
}
@@ -257,7 +250,9 @@ public class JsowellTask {
* jsowellTask.calculateTheSiteOrdersReport()
*/
public void calculateTheSiteOrdersReport() {
if (skipInPre("计算站点订单报表")) {
String env = SpringUtils.getActiveProfile();
if (StringUtils.equalsIgnoreCase(env, "pre")) {
log.debug("PRE环境不执行");
return;
}
// 查询出所有站点
@@ -284,7 +279,9 @@ public class JsowellTask {
* jsowellTask.pushToAMap()
*/
public void pushToAMap() {
if (skipInPre("站点的枪口数据推送到高德")) {
String env = SpringUtils.getActiveProfile();
if (StringUtils.equalsIgnoreCase(env, "pre")) {
log.debug("PRE环境不执行");
return;
}
Set<String> stationIds = redisCache.getCacheSet(CacheConstants.PUSH_STATION_CONNECTOR);
@@ -307,7 +304,9 @@ public class JsowellTask {
* 贵州省平台推送充电站实时功率 15分钟执行一次
*/
public void pushStationRealTimePowerInfo() {
if (skipInPre("贵州省平台推送充电站实时功率")) {
String env = SpringUtils.getActiveProfile();
if (StringUtils.equalsIgnoreCase(env, "pre")) {
log.debug("PRE环境不执行");
return;
}
@@ -345,7 +344,9 @@ public class JsowellTask {
* 推送统计信息 24小时执行一次
*/
public void pushStatisticsInfo() {
if (skipInPre("推送统计信息 24小时执行一次")) {
String env = SpringUtils.getActiveProfile();
if (StringUtils.equalsIgnoreCase(env, "pre")) {
log.debug("PRE环境不执行");
return;
}
@@ -384,7 +385,9 @@ public class JsowellTask {
* jsowellTask.processOrderSplitting()
*/
public void processOrderSplitting() {
if (skipInPre("定时任务, 订单分账")) {
String env = SpringUtils.getActiveProfile();
if (StringUtils.equalsIgnoreCase(env, "pre")) {
log.debug("PRE环境不执行");
return;
}
// 查询运营商列表
@@ -421,7 +424,9 @@ public class JsowellTask {
*
*/
public void generateMerchantBill() {
if (skipInPre("生成运营商日报表")) {
String env = SpringUtils.getActiveProfile();
if (StringUtils.equalsIgnoreCase(env, "pre")) {
log.debug("PRE环境不执行");
return;
}
// 查询运营商列表
@@ -448,7 +453,9 @@ public class JsowellTask {
* jsowellTask.automaticPayouts()
*/
public void automaticPayouts() {
if (skipInPre("定时任务,自动提现")) {
String env = SpringUtils.getActiveProfile();
if (StringUtils.equalsIgnoreCase(env, "pre")) {
log.debug("PRE环境不执行");
return;
}
// 查询开启自动提现运营商列表
@@ -477,9 +484,6 @@ public class JsowellTask {
* jsowellTask.processUnSettledOrder()
*/
public void processUnSettledOrder() {
if (skipInPre("处理未分帐订单")) {
return;
}
adapayUnsplitRecordHandleService.processUnSettledOrder();
}
@@ -489,9 +493,6 @@ public class JsowellTask {
* jsowellTask.processUnsplitRecordToDefaultMember()
*/
public void processUnsplitRecordToDefaultMember() {
if (skipInPre("处理adapay_unsplit_record待分账数据")) {
return;
}
adapayUnsplitRecordHandleService.processUnsplitRecordToDefaultMember();
}
@@ -500,9 +501,6 @@ public class JsowellTask {
* jsowellTask.processUnsplitRecordToDefaultMember(wechatAppId, pageSize)
*/
public void processUnsplitRecordToDefaultMember(String wechatAppId, Integer pageSize) {
if (skipInPre("处理adapay_unsplit_record待分账数据")) {
return;
}
adapayUnsplitRecordHandleService.processUnsplitRecordToDefaultMember(wechatAppId, pageSize);
}
@@ -517,9 +515,6 @@ public class JsowellTask {
* jsowellTask.importAdapayUnsplitRecordAndCompleteFields()
*/
public void importAdapayUnsplitRecordAndCompleteFields() {
if (skipInPre("从Excel导入adapay_unsplit_record并补齐缺失字段")) {
return;
}
adapayUnsplitRecordHandleService.importAdapayUnsplitRecordAndCompleteFields();
}
@@ -530,9 +525,6 @@ public class JsowellTask {
* 示例jsowellTask.completeAdapayUnsplitRecordFields('2024-01-01 00:00:00', '2025-12-31 23:59:59')
*/
public void completeAdapayUnsplitRecordFields(String startTime, String endTime) {
if (skipInPre("补齐adapay_unsplit_record表中缺失字段")) {
return;
}
adapayUnsplitRecordHandleService.completeAdapayUnsplitRecordFields(startTime, endTime);
}
@@ -541,9 +533,6 @@ public class JsowellTask {
* jsowellTask.syncAndRefreshFlagsFromAdapay(paymentId, wechatAppId)
*/
public void syncAndRefreshFlagsFromAdapay(String paymentId, String wechatAppId) {
if (skipInPre("按paymentId从汇付同步并刷新adapay_unsplit_record标识")) {
return;
}
adapayUnsplitRecordHandleService.syncAndRefreshFlagsFromAdapay(paymentId, wechatAppId);
}
@@ -553,9 +542,6 @@ public class JsowellTask {
* 示例jsowellTask.syncAndRefreshFlagsFromAdapay('2024-01-01 00:00:00', '2025-12-31 23:59:59', 'app_id', 500)
*/
public void syncAndRefreshFlagsFromAdapay(String startTime, String endTime, String wechatAppId, Integer pageSize) {
if (skipInPre("批量从汇付同步并刷新adapay_unsplit_record标识")) {
return;
}
adapayUnsplitRecordHandleService.syncAndRefreshFlagsFromAdapay(startTime, endTime, wechatAppId, pageSize);
}
@@ -569,16 +555,10 @@ public class JsowellTask {
* jsowellTask.importAdapayUnsplitRecordAndCompleteFields(文件路径)
*/
public void importAdapayUnsplitRecordAndCompleteFields(String filePath) {
if (skipInPre("从Excel导入adapay_unsplit_record并补齐缺失字段")) {
return;
}
adapayUnsplitRecordHandleService.importAdapayUnsplitRecordAndCompleteFields(filePath);
}
public void updateOrderReview() {
if (skipInPre("更新订单评价标识")) {
return;
}
LocalDate yesterday = DateUtils.getYesterday();
LocalDateTime start = yesterday.atStartOfDay();
LocalDateTime end = yesterday.atTime(23, 59, 59);

View File

@@ -822,7 +822,9 @@ public class CommonService {
QcyunParkCouponDTO dto = QcyunParkCouponDTO.builder()
.plateNumber(orderBasicInfo.getPlateNumber())
.stationId(orderBasicInfo.getStationId())
.stationName("深圳停车场")
.grantSerial(orderBasicInfo.getOrderCode())
.discountType(chargeParkingDiscount.getDiscountType())
.discountValue(chargeParkingDiscount.getDiscountValue())
.build();
discountFlag = qcyunsService.issuanceOfParkingTickets(dto);
}

View File

@@ -33,4 +33,14 @@ public class QcyunParkCouponDTO {
// 停车流水, 标识具体某次停车事件, 需保证该停车场下唯一
private String parkingSerial;
/**
* 优惠类型(1-减时间单位分钟; 2-减金额单位元)
*/
private Integer discountType;
/**
* 优惠值
*/
private String discountValue;
}

View File

@@ -9,8 +9,7 @@ public interface QcyunsService {
/**
* 发放停车券
* dto中需要传入车牌号, 其他参数取配置文件中的参数
* 现在只有一家车场, parkId在配置文件中, 以后多家车场改为数据库配置
* dto中需要传入车牌号、站点id和优惠配置停车场鉴权参数根据站点绑定配置查询
* @return true: 发放成功, false: 失败
*/
boolean issuanceOfParkingTickets(QcyunParkCouponDTO dto);

View File

@@ -6,18 +6,24 @@ import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.google.common.collect.Maps;
import com.jsowell.common.core.domain.parking.ParkingCommonParam;
import com.jsowell.common.enums.parkplatform.ParkingPlatformEnum;
import com.jsowell.common.util.ParkingUtil;
import com.jsowell.common.util.StringUtils;
import com.jsowell.common.util.id.UUID;
import com.jsowell.pile.domain.ThirdpartyParkingConfig;
import com.jsowell.pile.service.ThirdPartyParkingConfigService;
import com.jsowell.thirdparty.parking.common.ServiceApiCmd;
import com.jsowell.thirdparty.parking.common.bean.QcyunParkCouponDTO;
import com.jsowell.thirdparty.parking.common.bean.TempCarInfo;
import com.jsowell.thirdparty.parking.common.response.DataResponse;
import com.jsowell.thirdparty.parking.service.QcyunsService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Map;
/**
@@ -27,28 +33,36 @@ import java.util.Map;
@Service
public class QcyunsServiceImpl implements QcyunsService {
@Value("${parking.qcyuns.url}")
private String URL;
private static final String QCYUN_DISCOUNT_TYPE_AMOUNT = "1";
@Value("${parking.qcyuns.secretKey}")
private String secretKey;
private static final String QCYUN_DISCOUNT_TYPE_TIME = "2";
@Value("${parking.qcyuns.parkId}")
private String parkId;
private static final Integer DISCOUNT_TYPE_TIME = 1;
@Value("${parking.qcyuns.orgId}")
private String orgId;
private static final Integer DISCOUNT_TYPE_AMOUNT = 2;
@Value("${parking.qcyuns.url:}")
private String defaultUrl;
@Autowired
private ThirdPartyParkingConfigService thirdPartyParkingConfigService;
/**
* 发放停车券
* dto中只需要传入车牌号, 其他参数取配置文件中的参数
* 现在只有一家车场, parkId在配置文件中, 以后多家车场改为数据库配置
* 根据站点绑定的停车场配置动态获取parkId/orgId/secretKey
*/
@Override
public boolean issuanceOfParkingTickets(QcyunParkCouponDTO dto) {
dto.setParkId(parkId);
ThirdpartyParkingConfig parkingConfig = resolveParkingConfig(dto);
if (parkingConfig == null) {
return false;
}
dto.setParkId(parkingConfig.getParkId());
if (StringUtils.isBlank(dto.getGrantSerial())) {
dto.setGrantSerial(UUID.randomUUID().toString());
}
// 1. 查询车辆信息
String carInfo = getCarInfo(dto);
String carInfo = getCarInfo(dto, parkingConfig);
if (StringUtils.isBlank(carInfo)) {
return false;
}
@@ -60,18 +74,48 @@ public class QcyunsServiceImpl implements QcyunsService {
}
dto.setParkingSerial(String.valueOf(tempCarInfo.getRecordId()));
// 2. 创建停车券
boolean discountCoupon = createDiscountCoupon(dto);
boolean discountCoupon = createDiscountCoupon(dto, parkingConfig);
// 3. 查询优惠抵扣金额
// queryCarInfoDiscountDestory(dto);
return discountCoupon;
}
private ThirdpartyParkingConfig resolveParkingConfig(QcyunParkCouponDTO dto) {
if (dto == null || StringUtils.isBlank(dto.getStationId())) {
log.warn("qcyun发券失败, stationId为空, dto:{}", JSON.toJSONString(dto));
return null;
}
ThirdpartyParkingConfig parkingConfig = thirdPartyParkingConfigService.selectByStationId(dto.getStationId());
if (parkingConfig == null) {
log.warn("qcyun发券失败, 站点未绑定停车场配置, stationId:{}", dto.getStationId());
return null;
}
if (!StringUtils.equals(ParkingPlatformEnum.SHEN_ZHEN_PLATFORM.getCode(), parkingConfig.getPlatformType())) {
log.warn("qcyun发券失败, 站点绑定的停车平台类型不是qcyun, stationId:{}, parkingConfigId:{}, platformType:{}",
dto.getStationId(), parkingConfig.getId(), parkingConfig.getPlatformType());
return null;
}
if (StringUtils.isBlank(parkingConfig.getParkId())
|| StringUtils.isBlank(parkingConfig.getOrgId())
|| StringUtils.isBlank(parkingConfig.getSecretKey())) {
log.warn("qcyun发券失败, 停车场配置缺少parkId/orgId/secretKey, stationId:{}, parkingConfigId:{}",
dto.getStationId(), parkingConfig.getId());
return null;
}
if (StringUtils.isBlank(getRequestUrl(parkingConfig))) {
log.warn("qcyun发券失败, 停车场配置缺少接口地址, stationId:{}, parkingConfigId:{}",
dto.getStationId(), parkingConfig.getId());
return null;
}
return parkingConfig;
}
/**
* 获取车辆信息接口
* 根据车牌号获取车辆信息(临时车,月租车,储值车)
*/
private String getCarInfo(QcyunParkCouponDTO dto) {
String parkId = dto.getParkId(); // 使用dto中传入的parkId(写在配置文件中), 也许以后有多家车场改为数据库配置
private String getCarInfo(QcyunParkCouponDTO dto, ThirdpartyParkingConfig parkingConfig) {
String parkId = dto.getParkId();
// 业务参数
Map<String, String> data = Maps.newHashMap();
data.put("parkId", parkId);
@@ -81,13 +125,16 @@ public class QcyunsServiceImpl implements QcyunsService {
param.setService(ServiceApiCmd.CarInfo);
param.setVersion("01");
param.setMsgId(UUID.randomUUID().toString());
// param.setOrgId(dto.getOrgId());
param.setOrgId(orgId);
param.setOrgId(parkingConfig.getOrgId());
param.setData(data);
// 生成sign
ParkingUtil.generateAndSetSign(param, secretKey);
ParkingUtil.generateAndSetSign(param, parkingConfig.getSecretKey());
// 发送请求
String result = HttpUtil.post(URL, JSON.toJSONString(param));
String result = HttpUtil.post(getRequestUrl(parkingConfig), JSON.toJSONString(param));
if (StringUtils.isBlank(result)) {
log.warn("获取车辆信息接口返回为空, param:{}", JSON.toJSONString(param));
return null;
}
DataResponse dataResponse = JSONUtil.toBean(result, DataResponse.class);
log.info("获取车辆信息接口成功, param:{}, response:{}", JSON.toJSONString(param), JSON.toJSONString(dataResponse));
if (dataResponse.getRetCode() == 0) {
@@ -99,28 +146,39 @@ public class QcyunsServiceImpl implements QcyunsService {
/**
* 商家减免
*/
private boolean createDiscountCoupon(QcyunParkCouponDTO dto) {
private boolean createDiscountCoupon(QcyunParkCouponDTO dto, ThirdpartyParkingConfig parkingConfig) {
String qcyunDiscountType = getQcyunDiscountType(dto);
String qcyunDiscountValue = getQcyunDiscountValue(dto);
if (StringUtils.isBlank(qcyunDiscountType) || StringUtils.isBlank(qcyunDiscountValue)) {
log.warn("qcyun创建优惠券失败, 优惠配置错误, stationId:{}, discountType:{}, discountValue:{}",
dto.getStationId(), dto.getDiscountType(), dto.getDiscountValue());
return false;
}
// 业务参数
Map<String, String> data = Maps.newHashMap();
data.put("parkingSerial", dto.getParkingSerial());
data.put("grantSerial", dto.getGrantSerial()); // 对接方唯一id
data.put("plate", dto.getPlateNumber()); // 车牌号
data.put("storeName", dto.getStationName()); // 商家名称
data.put("type", "1"); // 优惠类型: 1.金额, 2.时长, 3.全免
data.put("value", String.valueOf(10 * 100)); // 当type=1时单位为分;当type=2时单位为分钟
data.put("storeName", StringUtils.defaultIfBlank(dto.getStationName(),
StringUtils.defaultIfBlank(parkingConfig.getParkingName(), "充电停车优惠"))); // 商家名称
data.put("type", qcyunDiscountType); // 优惠类型: 1.金额, 2.时长, 3.全免
data.put("value", qcyunDiscountValue); // 当type=1时单位为分;当type=2时单位为分钟
data.put("parkId", dto.getParkId()); // 车场id
// 组装请求体
ParkingCommonParam param = new ParkingCommonParam();
param.setService(ServiceApiCmd.DiscountCreate);
param.setVersion("01");
param.setMsgId(UUID.randomUUID().toString());
// param.setOrgId(dto.getOrgId());
param.setOrgId(orgId);
param.setOrgId(parkingConfig.getOrgId());
param.setData(data);
// 生成sign
ParkingUtil.generateAndSetSign(param, secretKey);
ParkingUtil.generateAndSetSign(param, parkingConfig.getSecretKey());
// 发送请求
String result = HttpUtil.post(URL, JSON.toJSONString(param));
String result = HttpUtil.post(getRequestUrl(parkingConfig), JSON.toJSONString(param));
if (StringUtils.isBlank(result)) {
log.warn("创建优惠券返回为空, param:{}", JSON.toJSONString(param));
return false;
}
DataResponse dataResponse = JSONUtil.toBean(result, DataResponse.class);
log.info("创建优惠券成功, param:{}, response:{}", JSON.toJSONString(param), JSON.toJSONString(dataResponse));
@@ -130,30 +188,65 @@ public class QcyunsServiceImpl implements QcyunsService {
return false;
}
private String getQcyunDiscountType(QcyunParkCouponDTO dto) {
if (DISCOUNT_TYPE_AMOUNT.equals(dto.getDiscountType())) {
return QCYUN_DISCOUNT_TYPE_AMOUNT;
}
if (DISCOUNT_TYPE_TIME.equals(dto.getDiscountType())) {
return QCYUN_DISCOUNT_TYPE_TIME;
}
return null;
}
private String getQcyunDiscountValue(QcyunParkCouponDTO dto) {
if (StringUtils.isBlank(dto.getDiscountValue())) {
return null;
}
try {
BigDecimal discountValue = new BigDecimal(dto.getDiscountValue());
if (discountValue.compareTo(BigDecimal.ZERO) <= 0) {
return null;
}
if (DISCOUNT_TYPE_AMOUNT.equals(dto.getDiscountType())) {
return discountValue.multiply(new BigDecimal("100")).setScale(0, RoundingMode.HALF_UP).toPlainString();
}
if (DISCOUNT_TYPE_TIME.equals(dto.getDiscountType())) {
return discountValue.setScale(0, RoundingMode.HALF_UP).toPlainString();
}
} catch (NumberFormatException e) {
log.warn("qcyun优惠值转换失败, discountValue:{}", dto.getDiscountValue(), e);
}
return null;
}
private String getRequestUrl(ThirdpartyParkingConfig parkingConfig) {
return StringUtils.defaultIfBlank(parkingConfig.getApiUrl(), defaultUrl);
}
/**
* 查询优惠抵扣金额
*/
private void queryCarInfoDiscountDestory(QcyunParkCouponDTO dto) {
private void queryCarInfoDiscountDestory(QcyunParkCouponDTO dto, ThirdpartyParkingConfig parkingConfig) {
// 业务参数
Map<String, String> data = Maps.newHashMap();
data.put("parkingSerial", dto.getParkingSerial());
data.put("grantSerial", dto.getGrantSerial()); // 对接方唯一id
data.put("plate", dto.getPlateNumber()); // 车牌号
data.put("storeName", dto.getStationName()); // 商家名称
data.put("type", "1"); // 优惠类型: 1.金额, 2.时长, 3.全免
data.put("value", String.valueOf(10 * 100)); // 当type=1时单位为分;当type=2时单位为分钟
data.put("type", getQcyunDiscountType(dto)); // 优惠类型: 1.金额, 2.时长, 3.全免
data.put("value", getQcyunDiscountValue(dto)); // 当type=1时单位为分;当type=2时单位为分钟
data.put("parkId", dto.getParkId()); //
// 组装请求体
ParkingCommonParam param = new ParkingCommonParam();
param.setService(ServiceApiCmd.CarInfoDiscountDestory);
param.setVersion("01");
param.setMsgId(UUID.randomUUID().toString());
param.setOrgId(orgId);
param.setOrgId(parkingConfig.getOrgId());
param.setData(data);
// 生成sign
ParkingUtil.generateAndSetSign(param, secretKey);
ParkingUtil.generateAndSetSign(param, parkingConfig.getSecretKey());
// 发送请求
String result = HttpUtil.post(URL, JSON.toJSONString(param));
String result = HttpUtil.post(getRequestUrl(parkingConfig), JSON.toJSONString(param));
DataResponse dataResponse = JSONUtil.toBean(result, DataResponse.class);
log.info("查询优惠抵扣金额, param:{}, response:{}", JSON.toJSONString(param), JSON.toJSONString(dataResponse));
}