hr~ 14 godzin temu
rodzic
commit
0af0c536cb

+ 4 - 0
order-common/pom.xml

@@ -18,6 +18,10 @@
     </properties>
 
     <dependencies>
+        <dependency>
+            <groupId>com.github.pagehelper</groupId>
+            <artifactId>pagehelper-spring-boot-starter</artifactId>
+        </dependency>
         <dependency>
             <groupId>org.redisson</groupId>
             <artifactId>redisson-spring-boot-starter</artifactId>

+ 6 - 2
order-common/src/main/java/com/poyee/aspect/weblog/WebLogAspect.java

@@ -38,7 +38,10 @@ public class WebLogAspect {
     @Before("webLog()")
     public void doBefore(JoinPoint joinPoint) {
         HttpServletRequest request = ServletUtils.getRequest();
-        String traceId = Objects.requireNonNull(request).getHeader("X-Trace-Id");
+        if (request == null) {
+            return;
+        }
+        String traceId = request.getHeader("X-Trace-Id");
         if (!StringUtils.hasText(traceId)) {
             traceId = UUID.randomUUID().toString().replace("-", "");
         }
@@ -75,7 +78,8 @@ public class WebLogAspect {
     public void throwing(Throwable e) {
         HttpServletRequest request = ServletUtils.getRequest();
         long costTime = System.currentTimeMillis() - RequestNoContext.callTime.get();
-        logger.error("\n--------------[{}]返回内容开始----------------\n    接口地址:{}\n    请求令牌:{}\n    接口参数:{}\n    请求失败:{}\n    请求耗时:{}ms\n--------------[{}]返回内容结束----------------", RequestNoContext.currentThreadId.get(), RequestNoContext.apiUrl.get(), Objects.requireNonNull(request).getHeader("Authorization"), RequestNoContext.requestParam.get(), e.getMessage(), costTime, RequestNoContext.currentThreadId.get());
+        String authorization = request != null ? request.getHeader("Authorization") : "";
+        logger.error("\n--------------[{}]返回内容开始----------------\n    接口地址:{}\n    请求令牌:{}\n    接口参数:{}\n    请求失败:{}\n    请求耗时:{}ms\n--------------[{}]返回内容结束----------------", RequestNoContext.currentThreadId.get(), RequestNoContext.apiUrl.get(), authorization, RequestNoContext.requestParam.get(), e.getMessage(), costTime, RequestNoContext.currentThreadId.get());
         RequestNoContext.remove();
         MDC.remove("traceId");
     }

+ 60 - 18
order-common/src/main/java/com/poyee/exception/GlobalExceptionHandler.java

@@ -33,17 +33,27 @@ public class GlobalExceptionHandler {
      */
     @ExceptionHandler(BusinessException.class)
     public Result<Void> handleBusinessException(BusinessException e) {
-        log.warn("业务异常:{}", I18nUtil.getMessage(e.getMessage()));
-        ServletUtils.getHttpResponse().setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
-        return Result.error(e.getCode(), I18nUtil.getMessage(e.getMessage()));
+        String message = e.getMessage();
+        String i18nMessage = I18nUtil.getMessage(message);
+        log.warn("业务异常:{}", i18nMessage != null ? i18nMessage : message);
+        HttpServletResponse response = ServletUtils.getHttpResponse();
+        if (response != null) {
+            response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+        }
+        return Result.error(e.getCode(), i18nMessage != null ? i18nMessage : message);
     }
 
 
     @ExceptionHandler(RuntimeException.class)
     public Result<Void> handleRuntimeException(RuntimeException e) {
-        log.warn("运行异常:{}", I18nUtil.getMessage(e.getMessage()));
-        ServletUtils.getHttpResponse().setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
-        return Result.error(I18nUtil.getMessage(e.getMessage()));
+        String message = e.getMessage();
+        String i18nMessage = message != null ? I18nUtil.getMessage(message) : null;
+        log.warn("运行异常:{}", i18nMessage != null ? i18nMessage : message);
+        HttpServletResponse response = ServletUtils.getHttpResponse();
+        if (response != null) {
+            response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+        }
+        return Result.error(i18nMessage != null ? i18nMessage : (message != null ? message : "系统运行异常"));
     }
 
     /**
@@ -52,7 +62,10 @@ public class GlobalExceptionHandler {
     @ExceptionHandler(Exception.class)
     public Result<Void> handleException(Exception e) {
         log.error("系统异常", e);
-        ServletUtils.getHttpResponse().setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+        HttpServletResponse response = ServletUtils.getHttpResponse();
+        if (response != null) {
+            response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+        }
         return Result.error(500, "系统繁忙,请稍后重试");
     }
 
@@ -63,7 +76,10 @@ public class GlobalExceptionHandler {
     @ExceptionHandler(IllegalArgumentException.class)
     public Result<Void> handleIllegalArgumentException(IllegalArgumentException e) {
         log.error("参数异常", e);
-        ServletUtils.getHttpResponse().setStatus(HttpServletResponse.SC_BAD_REQUEST);
+        HttpServletResponse response = ServletUtils.getHttpResponse();
+        if (response != null) {
+            response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
+        }
         return Result.error(HttpServletResponse.SC_BAD_REQUEST, e.getMessage());
     }
 
@@ -81,7 +97,10 @@ public class GlobalExceptionHandler {
                     return i18nMessage != null ? i18nMessage : defaultMessage;
                 })
                 .collect(Collectors.toList());
-        ServletUtils.getHttpResponse().setStatus(HttpServletResponse.SC_BAD_REQUEST);
+        HttpServletResponse response = ServletUtils.getHttpResponse();
+        if (response != null) {
+            response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
+        }
         return Result.error(HttpServletResponse.SC_BAD_REQUEST, collect.toString());
     }
 
@@ -91,7 +110,10 @@ public class GlobalExceptionHandler {
     @ExceptionHandler(MissingServletRequestParameterException.class)
     public Result<Void> handleMissingServletRequestParameter(MissingServletRequestParameterException e) {
         log.warn("缺少请求参数:{}", e.getParameterName());
-        ServletUtils.getHttpResponse().setStatus(HttpServletResponse.SC_BAD_REQUEST);
+        HttpServletResponse response = ServletUtils.getHttpResponse();
+        if (response != null) {
+            response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
+        }
         return Result.error(HttpServletResponse.SC_BAD_REQUEST, "缺少请求参数:" + e.getParameterName());
     }
 
@@ -101,7 +123,10 @@ public class GlobalExceptionHandler {
     @ExceptionHandler(MethodArgumentTypeMismatchException.class)
     public Result<Void> handleMethodArgumentTypeMismatch(MethodArgumentTypeMismatchException e) {
         log.warn("参数类型不匹配:{}", e.getName());
-        ServletUtils.getHttpResponse().setStatus(HttpServletResponse.SC_BAD_REQUEST);
+        HttpServletResponse response = ServletUtils.getHttpResponse();
+        if (response != null) {
+            response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
+        }
         return Result.error(HttpServletResponse.SC_BAD_REQUEST, "参数类型不匹配:" + e.getName());
     }
 
@@ -111,7 +136,10 @@ public class GlobalExceptionHandler {
     @ExceptionHandler(HttpMessageNotReadableException.class)
     public Result<Void> handleHttpMessageNotReadable(HttpMessageNotReadableException e) {
         log.warn("请求体解析失败:{}", e.getMessage());
-        ServletUtils.getHttpResponse().setStatus(HttpServletResponse.SC_BAD_REQUEST);
+        HttpServletResponse response = ServletUtils.getHttpResponse();
+        if (response != null) {
+            response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
+        }
         return Result.error(HttpServletResponse.SC_BAD_REQUEST, "请求体格式错误");
     }
 
@@ -121,7 +149,10 @@ public class GlobalExceptionHandler {
     @ExceptionHandler(HttpRequestMethodNotSupportedException.class)
     public Result<Void> handleHttpRequestMethodNotSupported(HttpRequestMethodNotSupportedException e) {
         log.warn("请求方法不支持:{}", e.getMethod());
-        ServletUtils.getHttpResponse().setStatus(HttpServletResponse.SC_METHOD_NOT_ALLOWED);
+        HttpServletResponse response = ServletUtils.getHttpResponse();
+        if (response != null) {
+            response.setStatus(HttpServletResponse.SC_METHOD_NOT_ALLOWED);
+        }
         return Result.error(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "不支持的请求方法:" + e.getMethod());
     }
 
@@ -131,7 +162,10 @@ public class GlobalExceptionHandler {
     @ExceptionHandler(HttpMediaTypeNotSupportedException.class)
     public Result<Void> handleHttpMediaTypeNotSupported(HttpMediaTypeNotSupportedException e) {
         log.warn("媒体类型不支持:{}", e.getContentType());
-        ServletUtils.getHttpResponse().setStatus(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE);
+        HttpServletResponse response = ServletUtils.getHttpResponse();
+        if (response != null) {
+            response.setStatus(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE);
+        }
         return Result.error(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE, "不支持的媒体类型:" + e.getContentType());
     }
 
@@ -141,18 +175,23 @@ public class GlobalExceptionHandler {
     @ExceptionHandler(TokenExpiredException.class)
     public Result<Void> handleTokenExpired(TokenExpiredException e) {
         log.warn("Token已过期:{}", e.getMessage());
-        ServletUtils.getHttpResponse().setStatus(HttpServletResponse.SC_UNAUTHORIZED);
+        HttpServletResponse response = ServletUtils.getHttpResponse();
+        if (response != null) {
+            response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
+        }
         return Result.error(HttpServletResponse.SC_UNAUTHORIZED, "Token已过期,请重新登录");
     }
 
-
     /**
      * JWT Token 验证失败
      */
     @ExceptionHandler(JWTVerificationException.class)
     public Result<Void> handleJWTVerification(JWTVerificationException e) {
         log.warn("Token验证失败:{}", e.getMessage());
-        ServletUtils.getHttpResponse().setStatus(HttpServletResponse.SC_UNAUTHORIZED);
+        HttpServletResponse response = ServletUtils.getHttpResponse();
+        if (response != null) {
+            response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
+        }
         return Result.error(HttpServletResponse.SC_UNAUTHORIZED, "Token无效,请重新登录");
     }
 
@@ -162,7 +201,10 @@ public class GlobalExceptionHandler {
     @ExceptionHandler(NullPointerException.class)
     public Result<Void> handleNullPointerException(NullPointerException e) {
         log.error("空指针异常", e);
-        ServletUtils.getHttpResponse().setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+        HttpServletResponse response = ServletUtils.getHttpResponse();
+        if (response != null) {
+            response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+        }
         return Result.error(500, "系统繁忙,请稍后重试");
     }
 }

+ 8 - 3
order-common/src/main/java/com/poyee/utils/JwtUtils.java

@@ -18,8 +18,13 @@ public class JwtUtils {
      * 2. Base64编码的用户信息
      */
     public static JSONObject getTokenUserInfo(String token) {
-        JWT jwt = JWTUtil.parseToken(token);
-        String payloads = jwt.getPayloads().toString();
-        return JSONObject.parseObject(payloads);
+        try {
+            JWT jwt = JWTUtil.parseToken(token);
+            String payloads = jwt.getPayloads().toString();
+            return JSONObject.parseObject(payloads);
+        } catch (Exception e) {
+            log.error("解析JWT Token失败", e);
+            return null;
+        }
     }
 }

+ 19 - 0
order-common/src/main/java/com/poyee/utils/PageUtil.java

@@ -0,0 +1,19 @@
+package com.poyee.utils;
+
+import cn.hutool.core.bean.BeanUtil;
+import com.github.pagehelper.PageInfo;
+
+import java.util.List;
+
+/**
+ * @author huang_run
+ * @date 2026/3/23 10:08
+ */
+public class PageUtil {
+    public static <T, R> PageInfo<R> convertPage(PageInfo<T> source, List<R> list) {
+        PageInfo<R> target = new PageInfo<>();
+        BeanUtil.copyProperties(source, target, "list");
+        target.setList(list);
+        return target;
+    }
+}

+ 5 - 1
order-common/src/main/java/com/poyee/utils/ServletUtils.java

@@ -26,7 +26,11 @@ public class ServletUtils {
     }
 
     public static HttpServletResponse getHttpResponse() {
-        return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse();
+        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
+        if (attributes == null) {
+            return null;
+        }
+        return attributes.getResponse();
     }
 
     /**

+ 18 - 10
order-web/src/main/java/com/poyee/facade/impl/OrderBaseFacade.java

@@ -1,6 +1,5 @@
 package com.poyee.facade.impl;
 
-import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.lang.Assert;
 import cn.hutool.core.util.StrUtil;
@@ -26,6 +25,7 @@ import com.poyee.service.OrderBaseService;
 import com.poyee.service.OrderItemService;
 import com.poyee.service.OrderLogisticsService;
 import com.poyee.utils.LocaleTimeZoneUtil;
+import com.poyee.utils.PageUtil;
 import com.poyee.utils.ServletUtils;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -92,15 +92,16 @@ public class OrderBaseFacade implements IOrderBaseFacade {
                 .list();
         Map<String, OrderAddress> buyerAddressMap = addressList.stream()
                 .filter(address -> Objects.equals(address.getType(), AddressTypeEnum.BUYER.getCode()))
-                .collect(Collectors.toMap(OrderAddress::getRelationNo, address -> address));
+                .collect(Collectors.toMap(OrderAddress::getRelationNo, address -> address, (a, b) -> a));
         Map<String, OrderAddress> sellerAddressMap = addressList.stream()
                 .filter(address -> Objects.equals(address.getType(), AddressTypeEnum.SELLER.getCode()))
-                .collect(Collectors.toMap(OrderAddress::getRelationNo, address -> address));
+                .collect(Collectors.toMap(OrderAddress::getRelationNo, address -> address, (a, b) -> a));
         // 查待审核地址 valid=1
         Set<String> pendingAddressOrderNoSet = orderAddressService.lambdaQuery()
                 .eq(OrderAddress::getRelationTable, OrderConstant.ORDER)
                 .in(OrderAddress::getRelationNo, orderNoList)
                 .eq(OrderAddress::getValid, WhetherEnum.YES.getCode())
+                .eq(OrderAddress::getDeleteFlag, WhetherEnum.NO.getCode())
                 .list()
                 .stream()
                 .map(OrderAddress::getRelationNo)
@@ -137,10 +138,7 @@ public class OrderBaseFacade implements IOrderBaseFacade {
                     return res;
                 })
                 .collect(Collectors.toList());
-        PageInfo<OrderBaseListRes> orderBaseListResPageInfo = new PageInfo<>();
-        BeanUtil.copyProperties(orderBasePageInfo, orderBaseListResPageInfo);
-        orderBaseListResPageInfo.setList(orderBaseListResList);
-        return orderBaseListResPageInfo;
+        return PageUtil.convertPage(orderBasePageInfo, orderBaseListResList);
     }
 
     @Transactional
@@ -150,12 +148,19 @@ public class OrderBaseFacade implements IOrderBaseFacade {
         Assert.notNull(orderBase, "order_not_found");
         Assert.isTrue(Objects.equals(orderBase.getOrderStatus(), SalesOrderStatusEnum.PENDING_SHIPMENT.getCode()),
                 "only_supports_shipping_for_flash_purchase_orders");
-        List<OrderItem> orderItemList = orderItemService.lambdaQuery().eq(OrderItem::getRelationTable, OrderConstant.ORDER).eq(OrderItem::getRelationNo, orderBaseSearchReq.getOrderNo()).list();
+        List<OrderItem> orderItemList = orderItemService.lambdaQuery()
+                .eq(OrderItem::getRelationTable, OrderConstant.ORDER)
+                .eq(OrderItem::getRelationNo, orderBaseSearchReq.getOrderNo())
+                .eq(OrderItem::getDeleteFlag, WhetherEnum.NO.getCode())
+                .list();
         boolean anyMatch = orderItemList.stream().anyMatch(item -> Objects.equals(item.getItemType(), ItemTypeEnum.FLASH_SALE.getCode()));
         Assert.isTrue(anyMatch, "only_supports_shipping_for_flash_purchase_orders");
-        List<OrderAddress> list = orderAddressService.lambdaQuery().eq(OrderAddress::getRelationNo, orderBase.getOrderNo())
+        List<OrderAddress> list = orderAddressService.lambdaQuery()
+                .eq(OrderAddress::getRelationNo, orderBase.getOrderNo())
                 .eq(OrderAddress::getRelationTable, OrderConstant.ORDER)
-                .eq(OrderAddress::getValid, WhetherEnum.YES.getCode()).list();
+                .eq(OrderAddress::getValid, WhetherEnum.YES.getCode())
+                .eq(OrderAddress::getDeleteFlag, WhetherEnum.NO.getCode())
+                .list();
         Assert.isTrue(CollUtil.isEmpty(list), "order_with_address_modification_request_Please_approve_and_redo_the_operation");
         orderBase.setOrderStatus(SalesOrderStatusEnum.SHIPPED.getCode());
         OrderLogistics orderLogistics = OrderLogistics.builder()
@@ -181,6 +186,7 @@ public class OrderBaseFacade implements IOrderBaseFacade {
                 .eq(OrderAddress::getRelationNo, req.getOrderNo())
                 .eq(OrderAddress::getRelationTable, OrderConstant.ORDER)
                 .eq(OrderAddress::getValid, WhetherEnum.YES.getCode())
+                .eq(OrderAddress::getDeleteFlag, WhetherEnum.NO.getCode())
                 .one();
         Assert.notNull(pending, "no_pending_address_modification_request");
         OrderAddress old = orderAddressService.lambdaQuery()
@@ -188,6 +194,7 @@ public class OrderBaseFacade implements IOrderBaseFacade {
                 .eq(OrderAddress::getRelationTable, OrderConstant.ORDER)
                 .eq(OrderAddress::getValid, WhetherEnum.NO.getCode())
                 .eq(OrderAddress::getType, pending.getType())
+                .eq(OrderAddress::getDeleteFlag, WhetherEnum.NO.getCode())
                 .one();
         if (Objects.nonNull(old)) {
             old.setDeleteFlag(WhetherEnum.YES.getCode());
@@ -208,6 +215,7 @@ public class OrderBaseFacade implements IOrderBaseFacade {
                 .eq(OrderAddress::getRelationNo, req.getOrderNo())
                 .eq(OrderAddress::getRelationTable, OrderConstant.ORDER)
                 .eq(OrderAddress::getValid, WhetherEnum.YES.getCode())
+                .eq(OrderAddress::getDeleteFlag, WhetherEnum.NO.getCode())
                 .one();
         Assert.notNull(pending, "no_pending_address_modification_request");
         String operator = Objects.nonNull(ServletUtils.getCurrentUser()) ? ServletUtils.getCurrentUser().getString(OrderConstant.SUB) : null;

+ 2 - 9
order-web/src/main/java/com/poyee/facade/impl/RecycleOrderFacade.java

@@ -1,6 +1,5 @@
 package com.poyee.facade.impl;
 
-import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@@ -14,12 +13,12 @@ import com.poyee.enums.AddressTypeEnum;
 import com.poyee.enums.WhetherEnum;
 import com.poyee.facade.IRecycleOrderFacade;
 import com.poyee.req.RecycleListSearchReq;
-import com.poyee.res.OrderBaseListRes;
 import com.poyee.res.RecycleListRes;
 import com.poyee.service.OrderAddressService;
 import com.poyee.service.OrderItemService;
 import com.poyee.service.OrderLogisticsService;
 import com.poyee.service.RecycleOrderService;
+import com.poyee.utils.PageUtil;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Component;
@@ -117,12 +116,6 @@ public class RecycleOrderFacade implements IRecycleOrderFacade {
                     return res;
                 })
                 .collect(Collectors.toList());
-        PageInfo<RecycleListRes> recycleListResPageInfo = new PageInfo<>();
-        BeanUtil.copyProperties(pageInfo, recycleListResPageInfo);
-        recycleListResPageInfo.setList(resList);
-        return recycleListResPageInfo;
+           return PageUtil.convertPage(pageInfo, resList);
     }
-
-
-
 }