From 8e081af4d88077f44ccee2f967f33433a786e7fb Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E8=B5=B5=E5=BF=A0=E6=9E=97?= <170083662@qq.com>
Date: Mon, 27 Jul 2026 11:36:51 +0800
Subject: [PATCH] =?UTF-8?q?fix(order):=20=E7=BB=AD=E8=B4=B9=E6=97=B6?=
=?UTF-8?q?=E9=97=B4=E6=97=A0=E7=BC=9D=E8=A1=94=E6=8E=A5=EF=BC=8C=E9=81=BF?=
=?UTF-8?q?=E5=85=8D=E7=A9=BA=E7=AA=97=E6=9C=9F=E5=A4=9A=E9=80=81=E6=9C=89?=
=?UTF-8?q?=E6=95=88=E6=9C=9F?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- 续费时根据父订单到期时间判断,未逾期顺延,否则从当天延续一个月
- 后台统一计算续费开始与结束时间,不信任前端传入的时间参数
- 更新订单与续费记录的起始和结束时间逻辑,防止有效期重叠或空白
- 修改查询参数,支持仅查询续费单(rentOrderId 不为空)
- 保持支付状态和订单状态更新的正常流程,确保续费处理正确
---
.../shop/controller/OrderPayController.java | 30 +++++++++++++------
.../shop/controller/PaymentController.java | 6 ++--
.../shop/mapper/xml/OrderPayMapper.xml | 3 ++
.../gxwebsoft/shop/param/OrderPayParam.java | 3 ++
.../shop/service/impl/OrderServiceImpl.java | 7 +++--
5 files changed, 35 insertions(+), 14 deletions(-)
diff --git a/src/main/java/com/gxwebsoft/shop/controller/OrderPayController.java b/src/main/java/com/gxwebsoft/shop/controller/OrderPayController.java
index 3423173..7ea5f0c 100644
--- a/src/main/java/com/gxwebsoft/shop/controller/OrderPayController.java
+++ b/src/main/java/com/gxwebsoft/shop/controller/OrderPayController.java
@@ -162,8 +162,12 @@ public class OrderPayController extends BaseController {
one.setCurrPeriods(order.getCurrPeriods() + 1);
one.setPeriods(order.getPeriods());
one.setRentOrderId(order.getOrderId());
- one.setStartTime(order.getExpirationTime());
- one.setExpirationTime(DateUtil.offset(order.getExpirationTime(), DateField.MONTH, 1));
+ // 续费无缝衔接:未逾期时从上一个到期日顺延一个月;已逾期时从今天顺延,
+ // 避免“旧到期日~续费当天”这段空窗期被白送(表现为下半月续费有效期多给一个月)
+ Date baseExpire = order.getExpirationTime();
+ Date renewStart = (baseExpire != null && baseExpire.after(new Date())) ? baseExpire : new Date();
+ one.setStartTime(renewStart);
+ one.setExpirationTime(DateUtil.offset(renewStart, DateField.MONTH, 1));
one.setPayStatus(PAY_STATUS_NO_PAY);
one.setBatteryDeposit(order.getBatteryDeposit());
one.setBatteryInsurance(order.getBatteryInsurance());
@@ -262,11 +266,19 @@ public class OrderPayController extends BaseController {
}
- Order order = new Order();
- order.setOrderId(orderPay.getRentOrderId());
- order.setStartTime(orderPay.getStartTime());
- order.setExpirationTime(orderPay.getExpirationTime());
- orderService.updateById(order);
+ // 续费时间以父订单当前到期日为准无缝衔接,不信任前端传入的 startTime/expirationTime,
+ // 避免后台操作时把有效期算多一个月
+ Order parentOrder = orderService.getById(orderPay.getRentOrderId());
+ if (parentOrder == null) {
+ return fail("关联订单不存在");
+ }
+ Date parentExpire = parentOrder.getExpirationTime();
+ Date renewStart = (parentExpire != null && parentExpire.after(new Date())) ? parentExpire : new Date();
+ Date renewExpire = DateUtil.offset(renewStart, DateField.MONTH, 1);
+
+ parentOrder.setStartTime(renewStart);
+ parentOrder.setExpirationTime(renewExpire);
+ orderService.updateById(parentOrder);
OrderPay olderPay = orderPayService.getOne(Wrappers.lambdaQuery(OrderPay.class).eq(OrderPay::getOrderNo, orderPay.getOrderNo()));
OrderPay newOrderPay = new OrderPay();
@@ -274,10 +286,10 @@ public class OrderPayController extends BaseController {
newOrderPay.setOrderPrice(BigDecimal.valueOf(orderPay.getOrderPriceInt()));
- newOrderPay.setStartTime(orderPay.getStartTime());
+ newOrderPay.setStartTime(renewStart);
newOrderPay.setPayTime(new Date());
newOrderPay.setCreateTime(new Date());
- newOrderPay.setExpirationTime(orderPay.getExpirationTime());
+ newOrderPay.setExpirationTime(renewExpire);
newOrderPay.setOrderNo(IdUtil.getSnowflakeNextIdStr());
newOrderPay.setIsAdminRenew(1);//是否管理员续费订单
diff --git a/src/main/java/com/gxwebsoft/shop/controller/PaymentController.java b/src/main/java/com/gxwebsoft/shop/controller/PaymentController.java
index d24bd73..b9b766c 100644
--- a/src/main/java/com/gxwebsoft/shop/controller/PaymentController.java
+++ b/src/main/java/com/gxwebsoft/shop/controller/PaymentController.java
@@ -575,7 +575,9 @@ public class PaymentController extends BaseController {
}
Date expirationTime = parentOrder.getExpirationTime();
- DateTime nextMonthTime = DateUtil.offsetMonth(expirationTime, 1);
+ // 逾期续费从今天衔接,避免“旧到期日~续费当天”空窗期白送一个月
+ Date renewBase = (expirationTime != null && expirationTime.after(new Date())) ? expirationTime : new Date();
+ DateTime nextMonthTime = DateUtil.offsetMonth(renewBase, 1);
parentOrder.setExpirationTime(nextMonthTime);
orderService.updateById(parentOrder);
// 保存续费订单状态
@@ -583,7 +585,7 @@ public class PaymentController extends BaseController {
d.setDeliveryStatus(DELIVERY_STATUS_ACCEPT);
d.setReceiptStatus(RECEIPT_STATUS_YES);
d.setOrderStatus(ORDER_STATUS_COMPLETED);
- d.setStartTime(expirationTime);
+ d.setStartTime(renewBase);
d.setExpirationTime(nextMonthTime);
orderService.updateById(d);
}
diff --git a/src/main/java/com/gxwebsoft/shop/mapper/xml/OrderPayMapper.xml b/src/main/java/com/gxwebsoft/shop/mapper/xml/OrderPayMapper.xml
index 80f9987..bdb48e7 100644
--- a/src/main/java/com/gxwebsoft/shop/mapper/xml/OrderPayMapper.xml
+++ b/src/main/java/com/gxwebsoft/shop/mapper/xml/OrderPayMapper.xml
@@ -25,6 +25,9 @@
AND a.rent_order_id = #{param.rentOrderId}
+
+ AND a.rent_order_id IS NOT NULL
+
AND a.pay_status = #{param.payStatus}
diff --git a/src/main/java/com/gxwebsoft/shop/param/OrderPayParam.java b/src/main/java/com/gxwebsoft/shop/param/OrderPayParam.java
index 25eda05..09e1691 100644
--- a/src/main/java/com/gxwebsoft/shop/param/OrderPayParam.java
+++ b/src/main/java/com/gxwebsoft/shop/param/OrderPayParam.java
@@ -116,6 +116,9 @@ public class OrderPayParam extends BaseParam {
@QueryField(type = QueryType.EQ)
private Integer rentOrderId;
+ @ApiModelProperty(value = "仅查询续费单(rentOrderId 不为空)")
+ private Boolean rentOrderIdNotNull;
+
@ApiModelProperty(value = "电池租金")
@QueryField(type = QueryType.EQ)
private BigDecimal batteryRent;
diff --git a/src/main/java/com/gxwebsoft/shop/service/impl/OrderServiceImpl.java b/src/main/java/com/gxwebsoft/shop/service/impl/OrderServiceImpl.java
index 17cf7b2..11c5fdd 100644
--- a/src/main/java/com/gxwebsoft/shop/service/impl/OrderServiceImpl.java
+++ b/src/main/java/com/gxwebsoft/shop/service/impl/OrderServiceImpl.java
@@ -260,16 +260,17 @@ public class OrderServiceImpl extends ServiceImpl implements
// 主订单
Order parentOrder = orderService.getById(order.getRentOrderId());
parentOrder.setCurrPeriods(count + 1);
- // 更新过期时间延长一个月
+ // 更新过期时间延长一个月(逾期时从今天衔接,避免空窗期白送)
Date expirationTime = parentOrder.getExpirationTime();
- DateTime nextMonthTime = DateUtil.offsetMonth(expirationTime, 1);
+ Date renewBase = (expirationTime != null && expirationTime.after(new Date())) ? expirationTime : new Date();
+ DateTime nextMonthTime = DateUtil.offsetMonth(renewBase, 1);
parentOrder.setExpirationTime(nextMonthTime);
// 保存续费订单状态
// order.setDeliveryStatus(DELIVERY_STATUS_YES);
order.setDeliveryStatus(DELIVERY_STATUS_ACCEPT);
order.setReceiptStatus(RECEIPT_STATUS_YES);
order.setOrderStatus(ORDER_STATUS_COMPLETED);
- order.setStartTime(expirationTime);
+ order.setStartTime(renewBase);
order.setExpirationTime(nextMonthTime);
try {