用户退款

This commit is contained in:
yanglei 2025-11-13 22:27:46 +08:00
parent 4f06b79e77
commit 87dc496944
6 changed files with 40 additions and 38 deletions

View File

@ -78,8 +78,8 @@ public class EbikeWxPaymentController {
*/ */
@PostMapping("/refundApply") @PostMapping("/refundApply")
public JsonResult<?> refundApply(@RequestBody EbikeOrderRefundDto ebikeRefundDto) { public JsonResult<?> refundApply(@RequestBody EbikeOrderRefundDto ebikeRefundDto) {
Long r = wxPayService.refundApply(ebikeRefundDto.getOrderId(), ebikeRefundDto.getReason()); Long refundId = wxPayService.refundApply(ebikeRefundDto.getOrderId(), ebikeRefundDto.getReason());
return JsonResult.success(r); return JsonResult.success(refundId);
} }
/** /**
@ -149,7 +149,7 @@ public class EbikeWxPaymentController {
} }
/** /**
* 退款订单详情 * 退款订单详情 bu
* *
* @param refundId 退款id * @param refundId 退款id
* @return 退款详情 * @return 退款详情
@ -172,20 +172,20 @@ public class EbikeWxPaymentController {
return JsonResult.success(refundApplyOrderInfoVo); return JsonResult.success(refundApplyOrderInfoVo);
} }
/** // /**
* 退款申请用户详情 // * 退款申请用户详情
* // *
* @param refundId 退款id // * @param refundId 退款id
* @return 退款申请用户详情 // * @return 退款申请用户详情
*/ // */
@GetMapping("/refundApplyUserDetail/{refundId}") // @GetMapping("/refundApplyUserDetail/{refundId}")
public JsonResult<?> refundApplyUserDetail(@PathVariable(name = "refundId") Long refundId) { // public JsonResult<?> refundApplyUserDetail(@PathVariable(name = "refundId") Long refundId) {
EbikeRefundUserDetailInfoVo refundUserDetailInfoVo = wxPayService.queryRefundUserInfoById(refundId); // EbikeRefundUserDetailInfoVo refundUserDetailInfoVo = wxPayService.queryRefundUserInfoById(refundId);
return JsonResult.success(refundUserDetailInfoVo); // return JsonResult.success(refundUserDetailInfoVo);
} // }
/** /**
* 退款申请用户交易记录 * 退款申请用户交易记录 -bu
* *
* @param userQueryDto 查询条件 * @param userQueryDto 查询条件
*/ */

View File

@ -22,7 +22,7 @@ import java.time.LocalDateTime;
@Builder @Builder
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
@Table("ebike_Refund") @Table("ebike_refund")
public class EbikeRefund implements Serializable { public class EbikeRefund implements Serializable {
@ -38,7 +38,7 @@ public class EbikeRefund implements Serializable {
/** /**
* 退款单号 * 退款单号
*/ */
private String refundOrder; private String refundOrderId;
/** /**
* 订单号 * 订单号

View File

@ -82,7 +82,7 @@ public class EbikeRefundServiceImpl extends ServiceImpl<EbikeRefundMapper, Ebike
*/ */
private EbikeRefund getByRefundOrderId(String refundOrderId) { private EbikeRefund getByRefundOrderId(String refundOrderId) {
QueryWrapper query = QueryWrapper.create() QueryWrapper query = QueryWrapper.create()
.where(EBIKE_REFUND.REFUND_ORDER.eq(refundOrderId)) .where(EBIKE_REFUND.REFUND_ORDER_ID.eq(refundOrderId))
.orderBy(EBIKE_REFUND.CREATE_TIME.desc()); .orderBy(EBIKE_REFUND.CREATE_TIME.desc());
return getOne(query); return getOne(query);
} }
@ -196,7 +196,7 @@ public class EbikeRefundServiceImpl extends ServiceImpl<EbikeRefundMapper, Ebike
.leftJoin(EBIKE_PAYMENT).on(EBIKE_PAYMENT.ORDER_ID.eq(EBIKE_REFUND.ORDER_ID)) .leftJoin(EBIKE_PAYMENT).on(EBIKE_PAYMENT.ORDER_ID.eq(EBIKE_REFUND.ORDER_ID))
.leftJoin(EBIKE_USER).on(EBIKE_USER.USER_ID.eq(EBIKE_PAYMENT.USER_ID)) .leftJoin(EBIKE_USER).on(EBIKE_USER.USER_ID.eq(EBIKE_PAYMENT.USER_ID))
.leftJoin(EBIKE_ORDER).on(EBIKE_ORDER.ORDER_ID.eq(EBIKE_REFUND.ORDER_ID)) .leftJoin(EBIKE_ORDER).on(EBIKE_ORDER.ORDER_ID.eq(EBIKE_REFUND.ORDER_ID))
.where(EBIKE_REFUND.PROCESS_STATUS.eq(String.valueOf(refundDto.getProcessStatus()))); .where(EBIKE_REFUND.PROCESS_STATUS.eq(refundDto.getProcessStatus()));
// 查询条件 // 查询条件
buildQueryConditions(query, refundDto); buildQueryConditions(query, refundDto);
Page<EbikeProcessedRefundVo> page = refundDto.getPageParam().getPage(); Page<EbikeProcessedRefundVo> page = refundDto.getPageParam().getPage();
@ -268,7 +268,7 @@ public class EbikeRefundServiceImpl extends ServiceImpl<EbikeRefundMapper, Ebike
.from(EBIKE_REFUND) .from(EBIKE_REFUND)
.select(EBIKE_PAYMENT.TOTAL.as("amount"), .select(EBIKE_PAYMENT.TOTAL.as("amount"),
EBIKE_PAYMENT.CREATE_TIME, EBIKE_PAYMENT.CREATE_TIME,
EBIKE_ORDER.ORDER_TYPE.as("transactionContent")) (EBIKE_ORDER.ORDER_TYPE).as("transactionContent"))
.select("'支出' as transactionType") .select("'支出' as transactionType")
.leftJoin(EBIKE_PAYMENT).on(EBIKE_REFUND.ORDER_ID.eq(EBIKE_PAYMENT.ORDER_ID)) .leftJoin(EBIKE_PAYMENT).on(EBIKE_REFUND.ORDER_ID.eq(EBIKE_PAYMENT.ORDER_ID))
.leftJoin(EBIKE_USER).on(EBIKE_PAYMENT.USER_ID.eq(EBIKE_USER.USER_ID)) .leftJoin(EBIKE_USER).on(EBIKE_PAYMENT.USER_ID.eq(EBIKE_USER.USER_ID))
@ -359,7 +359,7 @@ public class EbikeRefundServiceImpl extends ServiceImpl<EbikeRefundMapper, Ebike
QueryWrapper query = QueryWrapper.create() QueryWrapper query = QueryWrapper.create()
.select(QueryMethods.count(EBIKE_FAULT_REPORT.ALL_COLUMNS)) .select(QueryMethods.count(EBIKE_FAULT_REPORT.ALL_COLUMNS))
.from(EBIKE_FAULT_REPORT) .from(EBIKE_FAULT_REPORT)
.where(EBIKE_FAULT_REPORT.ORDER_CODE.eq(orderId)); .where(EBIKE_FAULT_REPORT.ORDER_CODE.eq(String.valueOf(orderId)));
return (long) getObj(query); return (long) getObj(query);
} }

View File

@ -423,7 +423,8 @@ public class EbikeWxPayServiceImpl implements EbikeWxPayService {
String outRefundNo = StringUtils.generateSnowflakeId("refundId"); String outRefundNo = StringUtils.generateSnowflakeId("refundId");
ebikeRefund = new EbikeRefund(); ebikeRefund = new EbikeRefund();
ebikeRefund.setCreateTime(LocalDateTime.now()); ebikeRefund.setCreateTime(LocalDateTime.now());
ebikeRefund.setRefundOrder(outRefundNo); ebikeRefund.setRefundOrderId(outRefundNo);
ebikeRefund.setOperatorId(ebikePayment.getOperatorId());
ebikeRefund.setOrderId(orderId); ebikeRefund.setOrderId(orderId);
ebikeRefund.setCurrency(ebikePayment.getCurrency()); ebikeRefund.setCurrency(ebikePayment.getCurrency());
ebikeRefund.setTotal(ebikePayment.getCostPrice()); ebikeRefund.setTotal(ebikePayment.getCostPrice());
@ -477,16 +478,11 @@ public class EbikeWxPayServiceImpl implements EbikeWxPayService {
notifyVo.setMessage(String.format("{%s}退款已经成功,不能重复退款", refundDto.getRefundId())); notifyVo.setMessage(String.format("{%s}退款已经成功,不能重复退款", refundDto.getRefundId()));
return notifyVo; return notifyVo;
} }
if (Status.PROCESSING.ordinal() == ebikeRefund.getRefundStatus()) {
log.error("退款refund失败{} 退款中,不能重复退款", refundDto.getRefundId());
notifyVo.setMessage(String.format("{%s}退款中,不能重复退款", refundDto.getRefundId()));
return notifyVo;
}
if (Status.CLOSED.ordinal() == ebikeRefund.getRefundStatus() || if (Status.CLOSED.ordinal() == ebikeRefund.getRefundStatus() ||
Status.ABNORMAL.ordinal() == ebikeRefund.getRefundStatus()) { Status.ABNORMAL.ordinal() == ebikeRefund.getRefundStatus()) {
//重新发起 //重新发起
String newOrder = StringUtils.generateSnowflakeId("refundId"); String newOrder = StringUtils.generateSnowflakeId("refundId");
ebikeRefund.setRefundOrder(newOrder); ebikeRefund.setRefundOrderId(newOrder);
} }
// 查询支付记录 // 查询支付记录
Long orderId = ebikeRefund.getOrderId(); Long orderId = ebikeRefund.getOrderId();
@ -499,13 +495,13 @@ public class EbikeWxPayServiceImpl implements EbikeWxPayService {
// 发起退款 // 发起退款
CreateRequest request = new CreateRequest(); CreateRequest request = new CreateRequest();
request.setTransactionId(transactionId); request.setTransactionId(transactionId);
request.setOutTradeNo(String.valueOf(orderId)); request.setOutTradeNo(ebikePayment.getTradeId());
request.setOutRefundNo(ebikeRefund.getRefundOrder()); request.setOutRefundNo(ebikeRefund.getRefundOrderId());
request.setReason(ebikeRefund.getReason()); request.setReason(ebikeRefund.getReason());
request.setNotifyUrl(wxPayConfig.getRefundNotifyUrl()); request.setNotifyUrl(wxPayConfig.getRefundNotifyUrl());
AmountReq amountReq = new AmountReq(); AmountReq amountReq = new AmountReq();
amountReq.setRefund(amount.getRefund().longValue()); amountReq.setRefund(yuanToCent(amount.getRefund()));
amountReq.setTotal(amount.getTotal().longValue()); amountReq.setTotal(yuanToCent(amount.getTotal()));
amountReq.setCurrency(amount.getCurrency()); amountReq.setCurrency(amount.getCurrency());
request.setAmount(amountReq); request.setAmount(amountReq);
try { try {
@ -555,7 +551,7 @@ public class EbikeWxPayServiceImpl implements EbikeWxPayService {
log.error("{}退款订单不存在", refundId); log.error("{}退款订单不存在", refundId);
return null; return null;
} }
return queryRefundByOutTradeNo(ebikeRefund.getRefundOrder()); return queryRefundByOutTradeNo(ebikeRefund.getRefundOrderId());
} }
@Override @Override
@ -591,7 +587,7 @@ public class EbikeWxPayServiceImpl implements EbikeWxPayService {
return result; return result;
} }
Refund refund = queryRefundByOutTradeNo(ebikeRefund.getRefundOrder()); Refund refund = queryRefundByOutTradeNo(ebikeRefund.getRefundOrderId());
if (refund != null && Status.SUCCESS.equals(refund.getStatus())) { if (refund != null && Status.SUCCESS.equals(refund.getStatus())) {
result.setSuccess(true); result.setSuccess(true);
@ -856,4 +852,13 @@ public class EbikeWxPayServiceImpl implements EbikeWxPayService {
} }
return msg; return msg;
} }
private Long yuanToCent(BigDecimal yuan) {
if (yuan == null) {
return null;
}
return yuan.multiply(BigDecimal.valueOf(100))
.setScale(0, RoundingMode.HALF_UP)
.longValue();
}
} }

View File

@ -90,7 +90,7 @@ public class WxPayTask {
for (EbikeRefund ebikeRefund : ebikeRefundList) { for (EbikeRefund ebikeRefund : ebikeRefundList) {
log.warn("超时未退款的退款单号 ===> {}", ebikeRefund.getRefundId()); log.warn("超时未退款的退款单号 ===> {}", ebikeRefund.getRefundId());
// 调用微信退款查询接口查询退款状态 // 调用微信退款查询接口查询退款状态
Refund refund = wxPayService.queryRefundByOutTradeNo(ebikeRefund.getRefundOrder()); Refund refund = wxPayService.queryRefundByOutTradeNo(ebikeRefund.getRefundOrderId());
if (refund != null) { if (refund != null) {
// 3. 更新退款单状态 // 3. 更新退款单状态
ebikeRefundService.updateRefundStatus(refund); ebikeRefundService.updateRefundStatus(refund);

View File

@ -1,9 +1,6 @@
package com.cdzy.user.service; package com.cdzy.user.service;
import com.cdzy.user.model.dto.EbikeUserRealInfoDto;
import com.cdzy.user.model.entity.EbikeUserRealInfo; import com.cdzy.user.model.entity.EbikeUserRealInfo;
import com.cdzy.user.model.vo.EbikeUserVo;
import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.service.IService; import com.mybatisflex.core.service.IService;
/** /**