diff --git a/jsowell-common/src/main/java/com/jsowell/common/core/domain/ykc/TransactionRecordsData.java b/jsowell-common/src/main/java/com/jsowell/common/core/domain/ykc/TransactionRecordsData.java index 75906bf98..4376e2816 100644 --- a/jsowell-common/src/main/java/com/jsowell/common/core/domain/ykc/TransactionRecordsData.java +++ b/jsowell-common/src/main/java/com/jsowell/common/core/domain/ykc/TransactionRecordsData.java @@ -123,6 +123,15 @@ public class TransactionRecordsData { private Date createTime; + /** + * 以下为附加字段,不是交易记录报文中原有字段 + */ + // 总电费 + private String totalElectricityAmount; + + // 总服务费 + private String totalServiceAmount; + @Override public String toString() { return new ToStringBuilder(this, ToStringStyle.JSON_STYLE) diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/dto/QueryStartChargeDTO.java b/jsowell-pile/src/main/java/com/jsowell/pile/dto/QueryStartChargeDTO.java index b1841aa45..c4210798f 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/dto/QueryStartChargeDTO.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/dto/QueryStartChargeDTO.java @@ -69,4 +69,10 @@ public class QueryStartChargeDTO { * 司机在合作公司的唯一标识(手机号),方便维护订单信息 */ private String driverId; + + + /** + * 支付方式(1-余额支付;3-白名单支付;4-微信支付;5-支付宝支付) + */ + private String payMode; } diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/dto/huawei/HWQueryStartChargeDTO.java b/jsowell-pile/src/main/java/com/jsowell/pile/dto/huawei/HWQueryStartChargeDTO.java index 43f3831f9..fab7e002c 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/dto/huawei/HWQueryStartChargeDTO.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/dto/huawei/HWQueryStartChargeDTO.java @@ -64,4 +64,9 @@ public class HWQueryStartChargeDTO { private String operatorId; + + /** + * 支付方式(1-余额支付;3-白名单支付;4-微信支付;5-支付宝支付) + */ + private String payMode; } diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java index 6c3f29c24..2b3f55409 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java @@ -2564,13 +2564,16 @@ public class OrderBasicInfoServiceImpl implements OrderBasicInfoService { .payStatus(Constants.ONE) .payAmount(dto.getAccountBalance()) // 支付金额 .payTime(new Date()) - // .payMode(PayModeEnum.PAYMENT_OF_BALANCE.getValue()) // 支付方式 + // .payMode() // 支付方式 .orderAmount(BigDecimal.ZERO) .build(); if (StringUtils.isNotBlank(dto.getPlateNum())) { // 车牌号 orderBasicInfo.setPlateNumber(dto.getPlateNum()); } + if (StringUtils.isNotBlank(dto.getPayMode())) { + orderBasicInfo.setPayMode(dto.getPayMode()); + } // 根据桩编码查询当前计费模板 BillingTemplateVO billingTemplateVO = pileBillingTemplateService.selectBillingTemplateDetailByPileSn(pileSn); // 订单详情 diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/AbstractProgramLogic.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/AbstractProgramLogic.java index 602dc2369..2bf4c71e8 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/AbstractProgramLogic.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/AbstractProgramLogic.java @@ -144,6 +144,13 @@ public abstract class AbstractProgramLogic implements InitializingBean { */ public abstract void settleOrder(TransactionRecordsData data, OrderBasicInfo orderBasicInfo); + /** + * 第三方平台结算订单(目前给华为用) + * @param data + * @param orderBasicInfo + */ + public abstract void settleOrderForThirdParty(TransactionRecordsData data, OrderBasicInfo orderBasicInfo); + /** * 订单退款 */ @@ -546,6 +553,30 @@ public abstract class AbstractProgramLogic implements InitializingBean { return orderDetail; } + + /** + * 获取更新数据后的orderDetail对象(给第三方平台结算订单用) + * @param orderBasicInfo + * @param data + * @return + */ + protected OrderDetail returnUpdateOrderDetailForThirdParty(OrderBasicInfo orderBasicInfo, TransactionRecordsData data){ + String orderCode = orderBasicInfo.getOrderCode(); + BigDecimal orderAmount = orderBasicInfo.getOrderAmount(); + // 更新订单详情 查询订单详情 修改订单数据 + OrderDetail orderDetail = orderBasicInfoService.getOrderDetailByOrderCode(orderCode); + // 总用电量 + orderDetail.setTotalUsedElectricity(new BigDecimal(data.getTotalElectricity())); + // 总电费 + orderDetail.setTotalElectricityAmount(new BigDecimal(data.getTotalElectricityAmount())); + // 总服务费 + orderDetail.setTotalServiceAmount(new BigDecimal(data.getTotalServiceAmount())); + // 总订单金额 + orderDetail.setTotalOrderAmount(orderAmount); + + return orderDetail; + } + /** * 余额支付 计算需要退回的金额 * 【公共方法】 diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/DelayMerchantProgramLogic.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/DelayMerchantProgramLogic.java index 4c785f37c..1d81c0054 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/DelayMerchantProgramLogic.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/DelayMerchantProgramLogic.java @@ -406,6 +406,45 @@ public class DelayMerchantProgramLogic extends AbstractProgramLogic { logger.info("结算订单end:{} OrderTransactionDTO:{}", orderBasicInfo.getOrderCode(), JSON.toJSONString(dto)); } + /** + * 第三方平台结算订单(目前给华为用) + * @param data + * @param orderBasicInfo + */ + public void settleOrderForThirdParty(TransactionRecordsData data, OrderBasicInfo orderBasicInfo) { + logger.info("第三方平台结算订单start data:{}, orderBasicInfo:{}", data.toString(), JSON.toJSONString(orderBasicInfo)); + // 判断订单状态 + if (StringUtils.equals(orderBasicInfo.getOrderStatus(), OrderStatusEnum.ORDER_COMPLETE.getValue())) { + logger.info("结算订单:{}, 是订单完成状态", orderBasicInfo.getOrderCode()); + return; + } + // 获取更新数据后的orderBasicInfo对象 + returnUpdateOrderBasicInfo(orderBasicInfo, data); + + // 获取更新数据后的orderDetail对象/更新订单详情 查询订单详情 修改订单数据 + OrderDetail orderDetail = returnUpdateOrderDetailForThirdParty(orderBasicInfo, data); + + // 计算订单折扣 + // calculateOrderDiscountsV2(orderBasicInfo, orderDetail); + + // 更新数据库 + OrderTransactionDTO dto = new OrderTransactionDTO(); + dto.setOrderBasicInfo(orderBasicInfo); + dto.setOrderDetail(orderDetail); + transactionService.doUpdateOrder(dto); + + // 订单退款 + refundOrder(orderBasicInfo); + + // 发送停止充电订阅消息 + sendMsg(orderBasicInfo); + + // 从redis中取出实时记录保存到表中 + realTimeMonitorDataRedis2DB(orderBasicInfo.getTransactionCode(), orderBasicInfo.getOrderCode()); + + logger.info("结算订单end:{} OrderTransactionDTO:{}", orderBasicInfo.getOrderCode(), JSON.toJSONString(dto)); + } + // uniApp 发送停止充电订阅消息 private void sendMsg(OrderBasicInfo orderBasicInfo) { try { diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/NotDelayMerchantProgramLogic.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/NotDelayMerchantProgramLogic.java index 7b03eb65d..5e053b799 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/NotDelayMerchantProgramLogic.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/NotDelayMerchantProgramLogic.java @@ -413,6 +413,46 @@ public class NotDelayMerchantProgramLogic extends AbstractProgramLogic { logger.info("结算订单end:{} OrderTransactionDTO:{}", orderBasicInfo.getOrderCode(), JSON.toJSONString(dto)); } + /** + * 第三方平台结算订单(目前给华为用) + * @param data + * @param orderBasicInfo + */ + @Override + public void settleOrderForThirdParty(TransactionRecordsData data, OrderBasicInfo orderBasicInfo) { + logger.info("第三方平台结算订单start data:{}, orderBasicInfo:{}", data.toString(), JSON.toJSONString(orderBasicInfo)); + // 判断订单状态 + if (StringUtils.equals(orderBasicInfo.getOrderStatus(), OrderStatusEnum.ORDER_COMPLETE.getValue())) { + logger.info("结算订单:{}, 是订单完成状态", orderBasicInfo.getOrderCode()); + return; + } + // 获取更新数据后的orderBasicInfo对象 + returnUpdateOrderBasicInfo(orderBasicInfo, data); + + // 获取更新数据后的orderDetail对象/更新订单详情 查询订单详情 修改订单数据 + OrderDetail orderDetail = returnUpdateOrderDetailForThirdParty(orderBasicInfo, data); + + // 计算订单折扣 + // calculateOrderDiscountsV2(orderBasicInfo, orderDetail); + + // 更新数据库 + OrderTransactionDTO dto = new OrderTransactionDTO(); + dto.setOrderBasicInfo(orderBasicInfo); + dto.setOrderDetail(orderDetail); + transactionService.doUpdateOrder(dto); + + // 订单退款 + refundOrder(orderBasicInfo); + + // 发送停止充电订阅消息 + sendMsg(orderBasicInfo); + + // 从redis中取出实时记录保存到表中 + realTimeMonitorDataRedis2DB(orderBasicInfo.getTransactionCode(), orderBasicInfo.getOrderCode()); + + logger.info("结算订单end:{} OrderTransactionDTO:{}", orderBasicInfo.getOrderCode(), JSON.toJSONString(dto)); + } + @Override public void refundOrder(OrderBasicInfo orderBasicInfo) { BigDecimal refundAmount = orderBasicInfo.getRefundAmount(); diff --git a/jsowell-thirdparty/src/main/java/com/jsowell/thirdparty/common/CommonService.java b/jsowell-thirdparty/src/main/java/com/jsowell/thirdparty/common/CommonService.java index 31d86815e..887f6b368 100644 --- a/jsowell-thirdparty/src/main/java/com/jsowell/thirdparty/common/CommonService.java +++ b/jsowell-thirdparty/src/main/java/com/jsowell/thirdparty/common/CommonService.java @@ -507,7 +507,7 @@ public class CommonService { * @param pileConnectorCode * @return */ - public String commonQueryStartCharge(String thirdPartyType, List stationIds, String pileConnectorCode, BigDecimal chargeAmount) { + public String commonQueryStartCharge(String thirdPartyType, List stationIds, String pileConnectorCode, BigDecimal chargeAmount, String payMode) { // 判断平台类型 if (StringUtils.equals(ThirdPlatformTypeEnum.HUA_WEI.getCode(), thirdPartyType)) { // 华为平台 @@ -528,6 +528,7 @@ public class CommonService { HWQueryStartChargeDTO dto = new HWQueryStartChargeDTO(); dto.setConnectorID(pileConnectorCode); dto.setMoneyLimit(chargeAmount); + dto.setPayMode(payMode); QueryStartChargeVO startChargeVO = huaweiServiceV2.queryStartCharge(dto); if (startChargeVO.getSuccStat() != Constants.zero) { log.error(thirdPartyType + "请求启动充电 error, {}", startChargeVO.getFailReason()); diff --git a/jsowell-thirdparty/src/main/java/com/jsowell/thirdparty/huawei/HuaweiServiceV2.java b/jsowell-thirdparty/src/main/java/com/jsowell/thirdparty/huawei/HuaweiServiceV2.java index 1393cc29f..d3eccdc22 100644 --- a/jsowell-thirdparty/src/main/java/com/jsowell/thirdparty/huawei/HuaweiServiceV2.java +++ b/jsowell-thirdparty/src/main/java/com/jsowell/thirdparty/huawei/HuaweiServiceV2.java @@ -8,6 +8,7 @@ import com.alibaba.fastjson2.JSONObject; import com.google.common.collect.Maps; import com.jsowell.common.constant.Constants; import com.jsowell.common.core.domain.ykc.RealTimeMonitorData; +import com.jsowell.common.core.domain.ykc.TransactionRecordsData; import com.jsowell.common.core.redis.RedisCache; import com.jsowell.common.enums.thirdparty.ThirdPartyOperatorIdEnum; import com.jsowell.common.enums.thirdparty.ThirdPlatformTypeEnum; @@ -27,6 +28,8 @@ import com.jsowell.pile.dto.GenerateOrderDTO; import com.jsowell.pile.dto.QueryStartChargeDTO; import com.jsowell.pile.dto.huawei.*; import com.jsowell.pile.service.*; +import com.jsowell.pile.service.programlogic.AbstractProgramLogic; +import com.jsowell.pile.service.programlogic.ProgramLogicFactory; import com.jsowell.pile.transaction.dto.OrderTransactionDTO; import com.jsowell.pile.transaction.service.TransactionService; import com.jsowell.pile.vo.huawei.QueryChargeStatusVO; @@ -87,6 +90,9 @@ public class HuaweiServiceV2 { @Autowired private PileBillingTemplateService pileBillingTemplateService; + @Autowired + private PileMerchantInfoService pileMerchantInfoService; + @Autowired private OrderBasicInfoService orderBasicInfoService; @@ -493,13 +499,14 @@ public class HuaweiServiceV2 { /** * 请求启动充电 - * 只需传枪口号、充电金额即可 + * 只需传枪口号、充电金额、支付方式即可 * @param dto * @return QueryStartChargeVO */ public QueryStartChargeVO queryStartCharge(HWQueryStartChargeDTO dto) { String pileConnectorCode = dto.getConnectorID(); BigDecimal chargeAmount = dto.getMoneyLimit(); + String payMode = dto.getPayMode(); String requestName = "query_start_charge"; @@ -511,6 +518,7 @@ public class HuaweiServiceV2 { startChargeDTO.setStartChargeSeq(startChargeSeq); startChargeDTO.setConnectorID(pileConnectorCode); startChargeDTO.setAccountBalance(chargeAmount); + startChargeDTO.setPayMode(dto.getPayMode()); Map map = orderBasicInfoService.generateOrderForThirdParty(startChargeDTO); if (map == null) { @@ -741,17 +749,30 @@ public class HuaweiServiceV2 { // 查出订单基本信息和详情 OrderBasicInfo orderBasicInfo = orderBasicInfoService.getOrderInfoByOrderCode(startChargeSeq); - OrderDetail orderDetail = orderBasicInfoService.getOrderDetailByOrderCode(startChargeSeq); + // OrderDetail orderDetail = orderBasicInfoService.getOrderDetailByOrderCode(startChargeSeq); - orderBasicInfo.setChargeStartTime(DateUtils.parseDate(dto.getStartTime())); - orderBasicInfo.setChargeEndTime(DateUtils.parseDate(dto.getEndTime())); - orderBasicInfo.setOrderStatus(OrderStatusEnum.ORDER_COMPLETE.getValue()); // 订单状态改为订单完成 - orderBasicInfo.setReason(String.valueOf(dto.getStopReason())); // TODO 新建停止原因枚举 + // TODO 结算订单 + TransactionRecordsData data = TransactionRecordsData.builder() + .consumptionAmount(String.valueOf(dto.getTotalMoney())) // 订单总金额 + .stopReasonMsg(String.valueOf(dto.getStopReason())) // 停止原因 + .totalElectricity(String.valueOf(dto.getTotalPower())) // 总用电量 + .totalElectricityAmount(String.valueOf(dto.getTotalElecMoney())) // 总电费 + .totalServiceAmount(String.valueOf(dto.getTotalSeviceMoney())) // 总服务费 + .build(); + String mode = pileMerchantInfoService.getDelayModeByMerchantId(orderBasicInfo.getMerchantId()); + AbstractProgramLogic orderLogic = ProgramLogicFactory.getProgramLogic(mode); + orderLogic.settleOrderForThirdParty(data, orderBasicInfo); - orderDetail.setTotalUsedElectricity(dto.getTotalPower()); - orderDetail.setTotalElectricityAmount(dto.getTotalElecMoney()); - orderDetail.setTotalServiceAmount(dto.getTotalSeviceMoney()); - orderDetail.setTotalOrderAmount(dto.getTotalMoney()); + + // orderBasicInfo.setChargeStartTime(DateUtils.parseDate(dto.getStartTime())); + // orderBasicInfo.setChargeEndTime(DateUtils.parseDate(dto.getEndTime())); + // orderBasicInfo.setOrderStatus(OrderStatusEnum.ORDER_COMPLETE.getValue()); // 订单状态改为订单完成 + // orderBasicInfo.setReason(String.valueOf(dto.getStopReason())); // TODO 新建停止原因枚举 + // + // orderDetail.setTotalUsedElectricity(dto.getTotalPower()); + // orderDetail.setTotalElectricityAmount(dto.getTotalElecMoney()); + // orderDetail.setTotalServiceAmount(dto.getTotalSeviceMoney()); + // orderDetail.setTotalOrderAmount(dto.getTotalMoney()); // if (CollectionUtils.isNotEmpty(chargeDetails)) { // for (BillingPriceVO billingPriceVO : billingPriceVOList) { @@ -765,13 +786,12 @@ public class HuaweiServiceV2 { // } // } // 通过事务修改订单信息 - OrderTransactionDTO transactionDTO = OrderTransactionDTO.builder() - .orderBasicInfo(orderBasicInfo) - .orderDetail(orderDetail) - .build(); - transactionService.doUpdateOrder(transactionDTO); + // OrderTransactionDTO transactionDTO = OrderTransactionDTO.builder() + // .orderBasicInfo(orderBasicInfo) + // .orderDetail(orderDetail) + // .build(); + // transactionService.doUpdateOrder(transactionDTO); - // TODO 订单退款 // 构建返回参数 JSONObject jsonObject = new JSONObject();