zoujiajian 1 ماه پیش
والد
کامیت
37b3ff6c80

+ 30 - 0
netflix-dao/src/main/java/com/cyksj/model/response/SpecialMemberInfoRep.java

@@ -0,0 +1,30 @@
+package com.cyksj.model.response;
+
+import com.cyksj.model.entity.SpecialPayOrder;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Date;
+
+@Getter
+@Setter
+public class SpecialMemberInfoRep {
+
+	private Long userId;
+
+	/** Whether the membership is currently active. */
+	private Boolean member;
+
+	private Date expireTime;
+
+	/** Calendar days remaining, rounded up; zero when inactive. */
+	private Long remainingDays;
+
+	private String lastOrderNo;
+
+	private String productCode;
+
+	private String productName;
+
+	private SpecialPayOrder.Status lastOrderStatus;
+}

+ 8 - 1
netflix-service/src/main/java/com/cyksj/service/special/SpecialPayService.java

@@ -5,9 +5,11 @@ import com.cyksj.model.entity.SpecialPayProduct;
 import com.cyksj.model.entity.SpecialMemberEntitlement;
 import com.cyksj.model.request.SpecialPayCreateReq;
 import com.cyksj.model.response.SpecialPayCreateRep;
+import com.cyksj.model.response.SpecialMemberInfoRep;
 
 import java.util.List;
 import java.util.Map;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 
 public interface SpecialPayService {
 
@@ -19,7 +21,12 @@ public interface SpecialPayService {
 
 	SpecialMemberEntitlement getMemberEntitlement(Long userId);
 
-	void refundOrder(Long userId, String orderNo) throws Exception;
+	SpecialMemberInfoRep getMemberInfo(Long userId);
+
+	void refundOrder(String orderNo) throws Exception;
+
+	Page<SpecialPayOrder> getManageOrderPage(Integer start, Integer limit, String orderNo,
+			Long userId, String productCode, SpecialPayOrder.Status status);
 
 	void handleAlipayNotify(Map<String, String> params) throws Exception;
 }

+ 43 - 4
netflix-service/src/main/java/com/cyksj/service/special/impl/SpecialPayServiceImpl.java

@@ -8,6 +8,7 @@ import com.alipay.api.domain.AlipayTradeRefundModel;
 import com.alipay.api.request.AlipayTradeRefundRequest;
 import com.alipay.api.response.AlipayTradeRefundResponse;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.cyksj.common.EnvCommonService;
 import com.cyksj.common.exception.BusinessRuntimeException;
 import com.cyksj.common.snowflake.Sequence;
@@ -29,6 +30,7 @@ import com.cyksj.model.request.SpecialPayCreateReq;
 import com.cyksj.model.request.OrderAttach;
 import com.cyksj.model.response.AliPayTradeStatus;
 import com.cyksj.model.response.SpecialPayCreateRep;
+import com.cyksj.model.response.SpecialMemberInfoRep;
 import com.cyksj.service.pay.AliPayCommonService;
 import com.cyksj.service.special.SpecialPayService;
 import lombok.RequiredArgsConstructor;
@@ -61,14 +63,14 @@ public class SpecialPayServiceImpl implements SpecialPayService {
 
 	@Override
 	@Transactional(rollbackFor = Throwable.class)
-	public void refundOrder(Long userId, String orderNo) throws Exception {
+	public void refundOrder(String orderNo) throws Exception {
 		SpecialPayOrder order = orderMapper.selectOne(Wrappers.lambdaQuery(SpecialPayOrder.class)
-				.eq(SpecialPayOrder::getOrderNo, orderNo).eq(SpecialPayOrder::getUserId, userId).last("limit 1 for update"));
+				.eq(SpecialPayOrder::getOrderNo, orderNo).last("limit 1 for update"));
 		if (order == null) throw BusinessRuntimeException.getInstance("订单不存在");
 		if (order.getStatus() == SpecialPayOrder.Status.REFUNDED) return;
 		if (order.getStatus() != SpecialPayOrder.Status.PAID || StrUtil.isBlank(order.getAlipayTradeNo())) throw BusinessRuntimeException.getInstance("当前订单状态不支持退款");
 		SpecialMemberEntitlement entitlement = entitlementMapper.selectOne(Wrappers.lambdaQuery(SpecialMemberEntitlement.class)
-				.eq(SpecialMemberEntitlement::getUserId, userId).last("limit 1 for update"));
+				.eq(SpecialMemberEntitlement::getUserId, order.getUserId()).last("limit 1 for update"));
 		if (entitlement != null && !order.getId().equals(entitlement.getLastOrderId())) throw BusinessRuntimeException.getInstance("存在后续会员订单,暂不支持自动退款");
 		AlipayTradeRefundModel model = new AlipayTradeRefundModel();
 		model.setTradeNo(order.getAlipayTradeNo());
@@ -80,7 +82,20 @@ public class SpecialPayServiceImpl implements SpecialPayService {
 		AlipayTradeRefundResponse response = AliPayClientFactory.getAlipayClient(order.getShopId()).execute(refundRequest);
 		if (response == null || !response.isSuccess()) throw BusinessRuntimeException.getInstance("支付宝退款失败");
 		if (orderMapper.markRefunded(order.getId()) != 1) throw BusinessRuntimeException.getInstance("退款状态更新失败");
-		if (entitlement != null) entitlementMapper.rollbackIfLastOrder(userId, order.getDurationDays(), order.getId());
+		if (entitlement != null) entitlementMapper.rollbackIfLastOrder(order.getUserId(), order.getDurationDays(), order.getId());
+	}
+
+	@Override
+	public Page<SpecialPayOrder> getManageOrderPage(Integer start, Integer limit, String orderNo,
+			Long userId, String productCode, SpecialPayOrder.Status status) {
+		int pageNo = start == null || start < 1 ? 1 : start;
+		int pageSize = limit == null || limit < 1 ? 10 : Math.min(limit, 100);
+		return orderMapper.selectPage(new Page<>(pageNo, pageSize), Wrappers.lambdaQuery(SpecialPayOrder.class)
+				.like(StrUtil.isNotBlank(orderNo), SpecialPayOrder::getOrderNo, orderNo)
+				.eq(userId != null, SpecialPayOrder::getUserId, userId)
+				.eq(StrUtil.isNotBlank(productCode), SpecialPayOrder::getProductCode, productCode)
+				.eq(status != null, SpecialPayOrder::getStatus, status)
+				.orderByDesc(SpecialPayOrder::getId));
 	}
 
 	@Override
@@ -161,6 +176,30 @@ public class SpecialPayServiceImpl implements SpecialPayService {
 				.last("limit 1"));
 	}
 
+	@Override
+	public SpecialMemberInfoRep getMemberInfo(Long userId) {
+		SpecialMemberEntitlement entitlement = getMemberEntitlement(userId);
+		Date now = new Date();
+		SpecialMemberInfoRep response = new SpecialMemberInfoRep();
+		response.setUserId(userId);
+		response.setMember(entitlement != null && entitlement.getExpireTime() != null
+				&& entitlement.getExpireTime().after(now));
+		response.setExpireTime(entitlement == null ? null : entitlement.getExpireTime());
+		response.setRemainingDays(Boolean.TRUE.equals(response.getMember())
+				? Math.max(1L, (entitlement.getExpireTime().getTime() - now.getTime() + 86400000L - 1) / 86400000L)
+				: 0L);
+		if (entitlement != null && entitlement.getLastOrderId() != null && entitlement.getLastOrderId() > 0) {
+			SpecialPayOrder lastOrder = orderMapper.selectById(entitlement.getLastOrderId());
+			if (lastOrder != null && userId.equals(lastOrder.getUserId())) {
+				response.setLastOrderNo(lastOrder.getOrderNo());
+				response.setProductCode(lastOrder.getProductCode());
+				response.setProductName(lastOrder.getSubject());
+				response.setLastOrderStatus(lastOrder.getStatus());
+			}
+		}
+		return response;
+	}
+
 	@Override
 	@Transactional(rollbackFor = Throwable.class)
 	public void handleAlipayNotify(Map<String, String> params) throws Exception {

+ 33 - 0
netflix-web/src/main/java/com/cyksj/web/controller/manage/SpecialPayManageController.java

@@ -0,0 +1,33 @@
+package com.cyksj.web.controller.manage;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.cyksj.dto.Result;
+import com.cyksj.enums.GatewayResponse;
+import com.cyksj.model.entity.SpecialPayOrder;
+import com.cyksj.service.special.SpecialPayService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+@RestController
+@RequiredArgsConstructor
+@RequestMapping("/manage/special/member/orders")
+public class SpecialPayManageController {
+
+	private final SpecialPayService specialPayService;
+
+	@GetMapping
+	public Result<Page<SpecialPayOrder>> page(
+			@RequestParam(defaultValue = "1") Integer start,
+			@RequestParam(defaultValue = "10") Integer limit,
+			String orderNo, Long userId, String productCode, SpecialPayOrder.Status status) {
+		return GatewayResponse.SUCCESS.newBuilder().toResult(
+				specialPayService.getManageOrderPage(start, limit, orderNo, userId, productCode, status));
+	}
+
+	@PostMapping("/{orderNo}/refund")
+	public Result refund(@PathVariable String orderNo) throws Exception {
+		specialPayService.refundOrder(orderNo);
+		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+}

+ 5 - 4
netflix-web/src/main/java/com/cyksj/web/controller/special/SpecialPayController.java

@@ -7,6 +7,7 @@ import com.cyksj.model.entity.SpecialPayProduct;
 import com.cyksj.model.entity.SpecialMemberEntitlement;
 import com.cyksj.model.request.SpecialPayCreateReq;
 import com.cyksj.model.response.SpecialPayCreateRep;
+import com.cyksj.model.response.SpecialMemberInfoRep;
 import com.cyksj.service.special.SpecialPayService;
 import com.cyksj.web.util.StpUserUtil;
 import lombok.RequiredArgsConstructor;
@@ -51,10 +52,10 @@ public class SpecialPayController {
 		return GatewayResponse.SUCCESS.newBuilder().toResult(specialPayService.getMemberEntitlement(userId));
 	}
 
-	@PostMapping("/orders/{orderNo}/refund")
-	public Result refundOrder(@PathVariable String orderNo) throws Exception {
-		specialPayService.refundOrder(StpUserUtil.getLoginIdAsLong(), orderNo);
-		return GatewayResponse.SUCCESS.newBuilder().toResult();
+	@GetMapping("/info")
+	public Result<SpecialMemberInfoRep> getMemberInfo() {
+		return GatewayResponse.SUCCESS.newBuilder()
+				.toResult(specialPayService.getMemberInfo(StpUserUtil.getLoginIdAsLong()));
 	}
 
 	@PostMapping("/alipay/notify")