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 {