完成退款列表,增加车辆编号、骑行起止时间,便于查询骑行轨迹

This commit is contained in:
jkcdev 2025-05-19 17:13:09 +08:00
parent 2494cdad98
commit 518bfb8ae9
11 changed files with 249 additions and 12 deletions

View File

@ -68,12 +68,12 @@ public class EbikeWxPaymentController {
* 退款申请 * 退款申请
* *
* @param refundDto 退款信息 * @param refundDto 退款信息
* @return 退款成功返回true否则返回false * @return 退款成功返回主键id否则返回失败
*/ */
@PostMapping("/refundApply") @PostMapping("/refundApply")
public JsonResult<?> refundApply(@RequestBody EbikeRefundDto refundDto) { public JsonResult<?> refundApply(@RequestBody EbikeRefundDto refundDto) {
String r = wxPayService.refundApply(refundDto.getOrderId(), refundDto.getReason()); String r = wxPayService.refundApply(refundDto.getOrderId(), refundDto.getReason());
return r == null?JsonResult.failed("退款失败"):JsonResult.success(r); return r == null?JsonResult.failed("退款申请失败"):JsonResult.success((Object) r);
} }
/** /**

View File

@ -17,7 +17,7 @@ import java.util.List;
public class ReqRefundDto { public class ReqRefundDto {
/** /**
* 退款单号 * 主键id
*/ */
private String refundId; private String refundId;

View File

@ -17,7 +17,7 @@ import java.util.List;
public class ReqRefundProcessDto { public class ReqRefundProcessDto {
/** /**
* 退款单号 * 主键id
*/ */
private String refundId; private String refundId;

View File

@ -76,4 +76,19 @@ public class ResApplyRefundDto {
*/ */
private String applicant; private String applicant;
/**
* 骑行设备编号
*/
private String ebikeCode;;
/**
* 骑行开始时间
*/
private LocalDateTime startTime;
/**
* 骑行开始时间
*/
private LocalDateTime endTime;
} }

View File

@ -86,4 +86,19 @@ public class ResCloseRefundDto {
*/ */
private String applicant; private String applicant;
/**
* 骑行设备编号
*/
private String ebikeCode;;
/**
* 骑行开始时间
*/
private LocalDateTime startTime;
/**
* 骑行开始时间
*/
private LocalDateTime endTime;
} }

View File

@ -81,4 +81,19 @@ public class ResHandleRefundDto {
*/ */
private String applicant; private String applicant;
/**
* 骑行设备编号
*/
private String ebikeCode;;
/**
* 骑行开始时间
*/
private LocalDateTime startTime;
/**
* 骑行开始时间
*/
private LocalDateTime endTime;
} }

View File

@ -106,4 +106,19 @@ public class ResProcessedRefundDto {
*/ */
private String applicant; private String applicant;
/**
* 骑行设备编号
*/
private String ebikeCode;;
/**
* 骑行开始时间
*/
private LocalDateTime startTime;
/**
* 骑行开始时间
*/
private LocalDateTime endTime;
} }

View File

@ -34,6 +34,11 @@ public class EbikeRefund implements Serializable {
@Id @Id
private String refundId; private String refundId;
/**
* 退款单号
*/
private String refundOrder;
/** /**
* 骑行订单号 * 骑行订单号
*/ */
@ -116,4 +121,14 @@ public class EbikeRefund implements Serializable {
*/ */
private LocalDateTime processTime ; private LocalDateTime processTime ;
/**
* 审核人
*/
private String reviewOperator ;
/**
* 退款人
*/
private String refundOperator ;
} }

View File

@ -0,0 +1,136 @@
package com.cdzy.payment.model.entity;
import com.mybatisflex.annotation.Column;
import com.mybatisflex.annotation.Id;
import com.mybatisflex.annotation.Table;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
* 用户订单表 实体类
*
* @author attiya
* @since 2025-03-28
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Table("ebike_user_orders")
public class EbikeUserOrders implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 分布式ID雪花算法或业务前缀+序列
*/
@Id
private Long orderId;
/**
* 用户ID关联用户表
*/
private String userId;
private String bikeId;
/**
* 订单类型1-单次骑行 2-骑行卡购买 3-会员卡续费
*/
private Integer orderType;
/**
* 状态0-进行中 1-已取消 2-待支付 3-已支付 4-退款中 5-已退款
*/
@Column(onInsertValue = "0")
private Integer status;
/**
* 订单总金额单位
*/
private BigDecimal totalAmount;
/**
* 实付金额扣除卡券优惠后
*/
private BigDecimal actualAmount;
/**
* 骑行开始时间仅骑行订单有效
*/
private LocalDateTime startTime;
/**
* 骑行结束时间仅骑行订单有效
*/
private LocalDateTime endTime;
/**
* 支付成功时间
*/
private LocalDateTime paymentTime;
/**
* 支付方式wechat/alipay/balance
*/
private String paymentMethod;
/**
* 使用卡券ID集合JSON数组
*/
private String couponIds;
/**
* 优惠明细结构化存储便于对账
*/
private String discountDetails;
/**
* 骑行设备编号仅骑行订单有效
*/
private String bikeCode;
/**
* 地理位置GeoHash编码用于区域优惠分析
*/
private String geoHash;
/**
* 创建时间
*/
@Column(onInsertValue = "now()")
private LocalDateTime createdAt;
/**
* 更新时间
*/
@Column(onUpdateValue = "now()")
private LocalDateTime updatedAt;
/**
* 骑行起始点
*/
private String ridePoint;
/**
* 骑行结束点
*/
private String returnPoint;
/**
* 0-未临时锁车 -1临时锁车
*/
private Integer tempLock;
@Column(isLogicDelete = true,onInsertValue = "0")
private Integer isDelete;
}

View File

@ -20,6 +20,7 @@ import java.util.List;
import static com.cdzy.payment.model.entity.table.EbikePaymentTableDef.EBIKE_PAYMENT; import static com.cdzy.payment.model.entity.table.EbikePaymentTableDef.EBIKE_PAYMENT;
import static com.cdzy.payment.model.entity.table.EbikeRefundTableDef.EBIKE_REFUND; import static com.cdzy.payment.model.entity.table.EbikeRefundTableDef.EBIKE_REFUND;
import static com.cdzy.payment.model.entity.table.EbikeUserOrdersTableDef.EBIKE_USER_ORDERS;
import static com.cdzy.payment.model.entity.table.EbikeUserTableDef.EBIKE_USER; import static com.cdzy.payment.model.entity.table.EbikeUserTableDef.EBIKE_USER;
import static com.cdzy.payment.model.enums.RefundProcessState.*; import static com.cdzy.payment.model.enums.RefundProcessState.*;
import static com.mybatisflex.core.constant.FuncName.*; import static com.mybatisflex.core.constant.FuncName.*;
@ -91,10 +92,12 @@ public class EbikeRefundServiceImpl extends ServiceImpl<EbikeRefundMapper, Ebike
.when(PayMethod.balance.name()).then("余额").end().as("pay_method"), .when(PayMethod.balance.name()).then("余额").end().as("pay_method"),
EBIKE_PAYMENT.PAYMENT_TIME.as("pay_time"), EBIKE_REFUND.REASON.as("apply_reason"), EBIKE_PAYMENT.PAYMENT_TIME.as("pay_time"), EBIKE_REFUND.REASON.as("apply_reason"),
QueryMethods.case_(EBIKE_REFUND.SOURCE).when("0").then("用户") QueryMethods.case_(EBIKE_REFUND.SOURCE).when("0").then("用户")
.when("1").then("客服").end().as("source"), EBIKE_USER.NICKNAME.as("applicant") .when("1").then("客服").end().as("source"), EBIKE_USER.NICKNAME.as("applicant"),
EBIKE_USER_ORDERS.BIKE_CODE.as("ebike_code"),EBIKE_USER_ORDERS.START_TIME.as("start_time"), EBIKE_USER_ORDERS.END_TIME.as("end_time")
) )
.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_USER_ORDERS).on(EBIKE_USER_ORDERS.ORDER_ID.eq(EBIKE_REFUND.ORDER_ID))
.where(EBIKE_REFUND.PROCESS_STATE.eq(String.valueOf(applying.ordinal()))); .where(EBIKE_REFUND.PROCESS_STATE.eq(String.valueOf(applying.ordinal())));
if(refundDto.getPhone() != null && !refundDto.getPhone().isEmpty()) if(refundDto.getPhone() != null && !refundDto.getPhone().isEmpty())
query.and(EBIKE_USER.MOBILE.like(refundDto.getPhone())); query.and(EBIKE_USER.MOBILE.like(refundDto.getPhone()));
@ -124,10 +127,12 @@ public class EbikeRefundServiceImpl extends ServiceImpl<EbikeRefundMapper, Ebike
.when("2").then("线下退款").end().as("refund_method"), .when("2").then("线下退款").end().as("refund_method"),
EBIKE_PAYMENT.PAYMENT_TIME.as("pay_time"), EBIKE_REFUND.REASON.as("apply_reason"), EBIKE_PAYMENT.PAYMENT_TIME.as("pay_time"), EBIKE_REFUND.REASON.as("apply_reason"),
QueryMethods.case_(EBIKE_REFUND.SOURCE).when("0").then("用户") QueryMethods.case_(EBIKE_REFUND.SOURCE).when("0").then("用户")
.when("1").then("客服").end().as("source"), EBIKE_USER.NICKNAME.as("applicant") .when("1").then("客服").end().as("source"), EBIKE_USER.NICKNAME.as("applicant"),
EBIKE_USER_ORDERS.BIKE_CODE.as("ebike_code"),EBIKE_USER_ORDERS.START_TIME.as("start_time"), EBIKE_USER_ORDERS.END_TIME.as("end_time")
) )
.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_USER_ORDERS).on(EBIKE_USER_ORDERS.ORDER_ID.eq(EBIKE_REFUND.ORDER_ID))
.where(EBIKE_REFUND.PROCESS_STATE.eq(String.valueOf(processing.ordinal()))); .where(EBIKE_REFUND.PROCESS_STATE.eq(String.valueOf(processing.ordinal())));
if(refundDto.getPhone() != null && !refundDto.getPhone().isEmpty()) if(refundDto.getPhone() != null && !refundDto.getPhone().isEmpty())
query.and(EBIKE_USER.MOBILE.like(refundDto.getPhone())); query.and(EBIKE_USER.MOBILE.like(refundDto.getPhone()));
@ -162,10 +167,12 @@ public class EbikeRefundServiceImpl extends ServiceImpl<EbikeRefundMapper, Ebike
.when("2").then("线下退款").end().as("refund_method"), .when("2").then("线下退款").end().as("refund_method"),
EBIKE_PAYMENT.PAYMENT_TIME.as("pay_time"), EBIKE_REFUND.REASON.as("apply_reason"), EBIKE_PAYMENT.PAYMENT_TIME.as("pay_time"), EBIKE_REFUND.REASON.as("apply_reason"),
QueryMethods.case_(EBIKE_REFUND.SOURCE).when("0").then("用户") QueryMethods.case_(EBIKE_REFUND.SOURCE).when("0").then("用户")
.when("1").then("客服").end().as("source"), EBIKE_USER.NICKNAME.as("applicant") .when("1").then("客服").end().as("source"), EBIKE_USER.NICKNAME.as("applicant"),
EBIKE_USER_ORDERS.BIKE_CODE.as("ebike_code"),EBIKE_USER_ORDERS.START_TIME.as("start_time"), EBIKE_USER_ORDERS.END_TIME.as("end_time")
) )
.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_USER_ORDERS).on(EBIKE_USER_ORDERS.ORDER_ID.eq(EBIKE_REFUND.ORDER_ID))
.where(EBIKE_REFUND.PROCESS_STATE.eq(String.valueOf(processed.ordinal()))); .where(EBIKE_REFUND.PROCESS_STATE.eq(String.valueOf(processed.ordinal())));
if(refundDto.getPhone() != null && !refundDto.getPhone().isEmpty()) if(refundDto.getPhone() != null && !refundDto.getPhone().isEmpty())
query.and(EBIKE_USER.MOBILE.like(refundDto.getPhone())); query.and(EBIKE_USER.MOBILE.like(refundDto.getPhone()));
@ -192,10 +199,12 @@ public class EbikeRefundServiceImpl extends ServiceImpl<EbikeRefundMapper, Ebike
.when(PayMethod.balance.name()).then("余额").end().as("pay_method"), .when(PayMethod.balance.name()).then("余额").end().as("pay_method"),
EBIKE_PAYMENT.PAYMENT_TIME.as("pay_time"), EBIKE_REFUND.REASON.as("apply_reason"), EBIKE_PAYMENT.PAYMENT_TIME.as("pay_time"), EBIKE_REFUND.REASON.as("apply_reason"),
QueryMethods.case_(EBIKE_REFUND.SOURCE).when("0").then("用户") QueryMethods.case_(EBIKE_REFUND.SOURCE).when("0").then("用户")
.when("1").then("客服").end().as("source"), EBIKE_USER.NICKNAME.as("applicant") .when("1").then("客服").end().as("source"), EBIKE_USER.NICKNAME.as("applicant"),
EBIKE_USER_ORDERS.BIKE_CODE.as("ebike_code"),EBIKE_USER_ORDERS.START_TIME.as("start_time"), EBIKE_USER_ORDERS.END_TIME.as("end_time")
) )
.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_USER_ORDERS).on(EBIKE_USER_ORDERS.ORDER_ID.eq(EBIKE_REFUND.ORDER_ID))
.where(EBIKE_REFUND.PROCESS_STATE.eq(String.valueOf(closed.ordinal()))); .where(EBIKE_REFUND.PROCESS_STATE.eq(String.valueOf(closed.ordinal())));
if(refundDto.getPhone() != null && !refundDto.getPhone().isEmpty()) if(refundDto.getPhone() != null && !refundDto.getPhone().isEmpty())
query.and(EBIKE_USER.MOBILE.like(refundDto.getPhone())); query.and(EBIKE_USER.MOBILE.like(refundDto.getPhone()));

View File

@ -359,7 +359,7 @@ public class WxPayServiceImpl implements WxPayService {
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.setRefundId(outRefundNo); ebikeRefund.setRefundOrder(outRefundNo);
ebikeRefund.setOrderId(outTradeNo); ebikeRefund.setOrderId(outTradeNo);
ebikeRefund.setCurrency(ebikePayment.getCurrency()); ebikeRefund.setCurrency(ebikePayment.getCurrency());
ebikeRefund.setTotal(ebikePayment.getCostPrice()); ebikeRefund.setTotal(ebikePayment.getCostPrice());
@ -370,7 +370,7 @@ public class WxPayServiceImpl implements WxPayService {
ebikeRefund.setProcessState(String.valueOf(RefundProcessState.applying.ordinal())); ebikeRefund.setProcessState(String.valueOf(RefundProcessState.applying.ordinal()));
ebikeRefund.setSource(String.valueOf(RefoundApplySource.user.ordinal())); ebikeRefund.setSource(String.valueOf(RefoundApplySource.user.ordinal()));
ebikeRefundService.saveRefundResult(ebikeRefund); ebikeRefundService.saveRefundResult(ebikeRefund);
return outRefundNo; return ebikeRefund.getRefundId();
} }
@Override @Override
@ -406,6 +406,23 @@ public class WxPayServiceImpl implements WxPayService {
result_.setMessage(String.format("{%s}退款申请不存在", refundDto.getRefundId())); result_.setMessage(String.format("{%s}退款申请不存在", refundDto.getRefundId()));
return result_; return result_;
} }
// 检查退款状态
if (String.valueOf(Status.SUCCESS.ordinal()).equals(ebikeRefund.getStatus())) {
log.error("退款refund失败{} 退款已经成功,不能重复退款", refundDto.getRefundId());
result_.setMessage(String.format("{%s}退款已经成功,不能重复退款", refundDto.getRefundId()));
return result_;
}
if (String.valueOf(Status.PROCESSING.ordinal()).equals(ebikeRefund.getStatus())) {
log.error("退款refund失败{} 退款中,不能重复退款", refundDto.getRefundId());
result_.setMessage(String.format("{%s}退款中,不能重复退款", refundDto.getRefundId()));
return result_;
}
if (String.valueOf(Status.CLOSED.ordinal()).equals(ebikeRefund.getStatus())||
String.valueOf(Status.ABNORMAL.ordinal()).equals(ebikeRefund.getStatus())) {
//重新发起
String new_order = StringUtils.generateSnowflakeId("refundId");
ebikeRefund.setRefundOrder(new_order);
}
// 查询支付记录 // 查询支付记录
String outTradeNo = ebikeRefund.getOrderId(); String outTradeNo = ebikeRefund.getOrderId();
EbikePayment ebikePayment = ebikePaymentService.getByOrderId(outTradeNo); EbikePayment ebikePayment = ebikePaymentService.getByOrderId(outTradeNo);
@ -418,7 +435,7 @@ public class WxPayServiceImpl implements WxPayService {
CreateRequest request = new CreateRequest(); CreateRequest request = new CreateRequest();
request.setTransactionId(transactionId); request.setTransactionId(transactionId);
request.setOutTradeNo(outTradeNo); request.setOutTradeNo(outTradeNo);
request.setOutRefundNo(ebikeRefund.getRefundId()); request.setOutRefundNo(ebikeRefund.getRefundOrder());
request.setReason(ebikeRefund.getReason()); request.setReason(ebikeRefund.getReason());
request.setNotifyUrl(wxPayConfig.getRefundNotifyUrl()); request.setNotifyUrl(wxPayConfig.getRefundNotifyUrl());
AmountReq amountReq = new AmountReq(); AmountReq amountReq = new AmountReq();