From c477dbf361fc9bd336017fcf8123be24704c9c40 Mon Sep 17 00:00:00 2001
From: dzc <2388224167@qq.com>
Date: Fri, 6 Jun 2025 16:49:47 +0800
Subject: [PATCH] =?UTF-8?q?feat:=E5=BE=AE=E4=BF=A1=E4=BB=98=E6=AC=BE?=
=?UTF-8?q?=E7=A0=81=E6=94=AF=E4=BB=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../hard/api/dto/wechat/WechatRefundDto.java | 8 +-
.../api/vo/wechat/WechantRefunCallbackVo.java | 6 +-
.../hard/service/HardAfterSaleService.java | 6 ++
.../hard/service/HardOrderService.java | 7 ++
.../impl/order/HardAfterSaleServiceImpl.java | 98 +++++++++++++++----
.../impl/order/HardOrderServiceImpl.java | 36 +++----
.../impl/wechat/WechatPayServiceImpl.java | 9 +-
7 files changed, 127 insertions(+), 43 deletions(-)
diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/wechat/WechatRefundDto.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/wechat/WechatRefundDto.java
index 5fa3552c4..837bc8152 100644
--- a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/wechat/WechatRefundDto.java
+++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/wechat/WechatRefundDto.java
@@ -14,14 +14,14 @@ import lombok.NoArgsConstructor;
@NoArgsConstructor
public class WechatRefundDto {
- private String orderId;
+ private Long orderId;
private String wechantOrderId;
- private String refundId;
+ private Long refundId;
- private Long orderPrice;
+ private Integer orderPrice;
- private Long refundPrice;
+ private Integer refundPrice;
}
diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/wechat/WechantRefunCallbackVo.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/wechat/WechantRefunCallbackVo.java
index bd00563b5..cf289e298 100644
--- a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/wechat/WechantRefunCallbackVo.java
+++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/wechat/WechantRefunCallbackVo.java
@@ -63,14 +63,14 @@ public class WechantRefunCallbackVo {
public static String wechantError() {
return "" +
"" +
- "" +
+ "" +
"";
}
public static String wechantSuccess() {
return "" +
- "" +
- "" +
+ " " +
+ " \n" +
"";
}
diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardAfterSaleService.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardAfterSaleService.java
index d6cd18b1b..19b9fc66f 100644
--- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardAfterSaleService.java
+++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardAfterSaleService.java
@@ -10,6 +10,7 @@ import com.bsd.pjcloud.hard.api.entity.order.HardAfterSaleEntity;
import com.bsd.pjcloud.hard.api.entity.order.HardAfterSaleLogEntity;
import com.bsd.pjcloud.hard.api.vo.order.HardAfterSaleVo;
import com.bsd.pjcloud.hard.api.vo.order.HardOrderVo;
+import com.bsd.pjcloud.hard.api.vo.wechat.WechantRefunCallbackVo;
import java.util.List;
@@ -43,6 +44,11 @@ public interface HardAfterSaleService extends IService {
void refund(Long afterSaleId, String prefixStr);
+ /**
+ * 微信退款回调通知
+ */
+ boolean wechatRefundCallback(WechantRefunCallbackVo decrypt);
+
/**
* 同意售后
*/
diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardOrderService.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardOrderService.java
index 9e04e2013..ba614d93b 100644
--- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardOrderService.java
+++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardOrderService.java
@@ -7,6 +7,8 @@ import com.bsd.pjcloud.admin.api.entity.SysUser;
import com.bsd.pjcloud.common.core.constant.enums.YesNoEnum;
import com.bsd.pjcloud.common.data.datascope.DataScope;
import com.bsd.pjcloud.common.security.service.PjcloudUser;
+import com.bsd.pjcloud.hard.api.constant.order.HardOrderTypeEnum;
+import com.bsd.pjcloud.hard.api.constant.order.HardPayTypeEnum;
import com.bsd.pjcloud.hard.api.dto.hard.HandCancelCodeDto;
import com.bsd.pjcloud.hard.api.dto.hard.HardCreateOrderDto;
import com.bsd.pjcloud.hard.api.dto.order.HardCreateCarDto;
@@ -106,4 +108,9 @@ public interface HardOrderService extends IService {
* 创建订单后发送mq消息
*/
void createOrderAfterSendMqMsg(Long orderId, UserInfo userInfo);
+
+ /**
+ * 是否需要支付
+ */
+ boolean isPay(HardOrderTypeEnum type, HardPayTypeEnum payType);
}
\ No newline at end of file
diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardAfterSaleServiceImpl.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardAfterSaleServiceImpl.java
index 9d684f1e2..c1bebfa72 100644
--- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardAfterSaleServiceImpl.java
+++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardAfterSaleServiceImpl.java
@@ -21,6 +21,7 @@ import com.bsd.pjcloud.common.data.datascope.DataScope;
import com.bsd.pjcloud.common.security.service.PjcloudUser;
import com.bsd.pjcloud.hard.api.constant.order.HardOrderStatusEnum;
import com.bsd.pjcloud.hard.api.constant.order.HardOrderTypeEnum;
+import com.bsd.pjcloud.hard.api.constant.order.HardPayTypeEnum;
import com.bsd.pjcloud.hard.api.constant.refund.HardAfterSaleOperateTypeEnum;
import com.bsd.pjcloud.hard.api.constant.refund.HardRefundStatusEnum;
import com.bsd.pjcloud.hard.api.constant.refund.HardSaleStatusEnum;
@@ -29,17 +30,21 @@ import com.bsd.pjcloud.hard.api.dto.order.HardAdminRefundDto;
import com.bsd.pjcloud.hard.api.dto.order.HardAfterSaleDto;
import com.bsd.pjcloud.hard.api.dto.order.HardDisagreeDto;
import com.bsd.pjcloud.hard.api.dto.order.HardOrderDto;
+import com.bsd.pjcloud.hard.api.dto.wechat.WechatRefundDto;
import com.bsd.pjcloud.hard.api.entity.order.HardAfterSaleEntity;
import com.bsd.pjcloud.hard.api.entity.order.HardAfterSaleLogEntity;
import com.bsd.pjcloud.hard.api.entity.order.HardOrderEntity;
import com.bsd.pjcloud.hard.api.utils.HardUtil;
import com.bsd.pjcloud.hard.api.vo.order.HardAfterSaleVo;
import com.bsd.pjcloud.hard.api.vo.order.HardOrderVo;
+import com.bsd.pjcloud.hard.api.vo.wechat.WechantRefunCallbackVo;
+import com.bsd.pjcloud.hard.api.vo.wechat.WechatRefundVo;
import com.bsd.pjcloud.hard.mapper.order.HardAfterSaleLogMapper;
import com.bsd.pjcloud.hard.mapper.order.HardAfterSaleMapper;
import com.bsd.pjcloud.hard.mapper.order.HardOrderMapper;
import com.bsd.pjcloud.hard.service.HardAfterSaleService;
import com.bsd.pjcloud.hard.service.HardOrderService;
+import com.bsd.pjcloud.hard.service.WechatPayService;
import com.bsd.pjcloud.thirdparty.constant.pay.ThirdPayVoStatusEnum;
import com.bsd.pjcloud.wallet.api.dto.recharge.WalletRechargeRefundDto;
import com.bsd.pjcloud.wallet.api.feign.RemoteWalletRechargeService;
@@ -57,9 +62,6 @@ import java.util.Map;
/**
* 售后订单
- *
- * @author dzc
- * @date 2025-01-07 17:23:08
*/
@Validated
@Slf4j
@@ -71,6 +73,7 @@ public class HardAfterSaleServiceImpl extends ServiceImpl walletRefundResult = walletRechargeService.refund(hardRefundDto);
- if (walletRefundResult.getCode() != 0 || ObjectUtil.isEmpty(walletRefundResult.getData())) {
- throw new RuntimeException("钱包退款错误");
+ HardOrderTypeEnum hardOrderType = HardOrderTypeEnum.valueOfByType(order.getOrderType());
+ HardPayTypeEnum hardPayType = HardPayTypeEnum.valueOfByType(order.getPayType());
+ // 是否钱包支付
+ boolean isWalletPay = hardOrderService.isPay(hardOrderType, hardPayType);
+ // 是否微信支付
+ boolean isWeChatPay = ObjectUtil.equals(order.getPayType(), HardPayTypeEnum.WECHANT_SELF_QR_CODE_PAY.getType());
+ // 是否支付宝支付
+ boolean isAliPay = ObjectUtil.equals(order.getPayType(), HardPayTypeEnum.ALI_SELF_QR_CODE_PAY.getType());
+ if (isWalletPay) {
+ WalletRechargeRefundDto hardRefundDto = WalletRechargeRefundDto.builder().walletId(order.getWalletId()).orderId(order.getId()).afterSaleId(afterSale.getId()).refundCode(refundCode).reason("订单退款").price(refundPrice).build();
+ R walletRefundResult = walletRechargeService.refund(hardRefundDto);
+ if (walletRefundResult.getCode() != 0 || ObjectUtil.isEmpty(walletRefundResult.getData())) {
+ throw new RuntimeException("钱包退款错误");
+ }
+ WalletRechargeVo walletRefund = walletRefundResult.getData();
+ HardOrderEntity updateObj = HardOrderEntity.builder()
+ .id(order.getId())
+ .orderStatus(HardOrderStatusEnum.REFUND.getType())
+ .refundStatus(HardRefundStatusEnum.SUCCESS.getStatus())
+ .payRefundId(walletRefund.getId())
+ .refundPrice(refundTotalPrice + refundPrice)
+ .refundTime(LocalDateTime.now())
+ .build();
+ hardOrderService.updateById(updateObj);
+ } else if (isWeChatPay) {
+ WechatRefundDto refundDto = WechatRefundDto.builder().orderId(order.getId()).refundId(afterSale.getId()).orderPrice(refundPrice).refundPrice(refundPrice).build();
+ WechatRefundVo refundVo = wechatPayService.refund(refundDto);
+ if (ObjectUtil.isEmpty(refundVo)) {
+ throw new RuntimeException("微信退款错误");
+ }
+ if (!refundVo.isAllSuccess()) {
+ throw new RuntimeException(refundVo.getErr_code_des());
+ }
+ } else if (isAliPay) {
+ throw new RuntimeException("支付宝退款暂不支持");
+ }
+ }
+
+ /**
+ * 微信退款回调通知
+ */
+ @Override
+ public boolean wechatRefundCallback(WechantRefunCallbackVo decrypt) {
+ try {
+ Long orderId = Long.valueOf(decrypt.getOut_trade_no());
+ Long refunId = Long.valueOf(decrypt.getOut_refund_no());
+ // 查询订单
+ HardOrderEntity order = hardOrderService.getById(orderId);
+ if (ObjectUtil.isEmpty(order)) {
+ log.error("微信退款回调通知,订单不存在orderId:{}", orderId);
+ return false;
+ }
+ // 查询售后单
+ HardAfterSaleEntity afterSale = baseMapper.selectById(refunId);
+ if (ObjectUtil.isEmpty(afterSale)) {
+ log.error("微信退款回调通知,售后单不存在refunId:{}", refunId);
+ return false;
+ }
+ if (ObjectUtil.equals(afterSale.getStatus(), HardSaleStatusEnum.COMPLETE.getStatus())) {
+ log.error("微信退款回调通知,售后单已处理完成refunId:{}", refunId);
+ return false;
+ }
+ HardOrderEntity updateObj = HardOrderEntity.builder()
+ .id(order.getId())
+ .orderStatus(HardOrderStatusEnum.REFUND.getType())
+ .refundStatus(HardRefundStatusEnum.SUCCESS.getStatus())
+ .payRefundId(orderId)
+ .refundPrice(Integer.valueOf(decrypt.getRefund_fee()))
+ .refundTime(LocalDateTime.now())
+ .build();
+ hardOrderService.updateById(updateObj);
+ return true;
+ } catch (Exception e) {
+ log.error("微信退款回调通知失败", e);
+ return false;
}
- WalletRechargeVo walletRefund = walletRefundResult.getData();
- HardOrderEntity updateObj = HardOrderEntity.builder()
- .id(order.getId())
- .orderStatus(HardOrderStatusEnum.REFUND.getType())
- .refundStatus(HardRefundStatusEnum.SUCCESS.getStatus())
- .payRefundId(walletRefund.getId())
- .refundPrice(refundTotalPrice + refundPrice)
- .refundTime(LocalDateTime.now())
- .build();
- hardOrderService.updateById(updateObj);
}
@Override
diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardOrderServiceImpl.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardOrderServiceImpl.java
index 29ee720d5..a6f1cba06 100644
--- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardOrderServiceImpl.java
+++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardOrderServiceImpl.java
@@ -301,7 +301,6 @@ public class HardOrderServiceImpl extends ServiceImpl