Prechádzať zdrojové kódy

Merge remote-tracking branch 'origin/dev_20260131_youshen430' into dev_20260131_youshen430

xucaiqin 1 mesiac pred
rodič
commit
abda981697

+ 45 - 17
sckw-common/sckw-common-log/src/main/java/com/sckw/log/aspect/LogInfoAspect.java

@@ -1,7 +1,8 @@
 package com.sckw.log.aspect;
 
-import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson2.JSON;
+import com.alibaba.fastjson2.JSONObject;
+import com.alibaba.fastjson2.filter.ValueFilter;
 import jakarta.servlet.http.HttpServletRequest;
 import jakarta.servlet.http.HttpServletResponse;
 import lombok.extern.slf4j.Slf4j;
@@ -56,9 +57,37 @@ public class LogInfoAspect {
         return getResult(p);
     }
 
+    // 定义最大字符串长度(例如 10000 字符)
+    private static final int MAX_STR_LEN = 10000;
+
+    // 复用 ValueFilter 实例,避免重复创建
+    private static final ValueFilter TRUNCATE_FILTER = (object, name, value) -> {
+        if (value instanceof String) {
+            String str = (String) value;
+            if (str.length() > MAX_STR_LEN) {
+                return str.substring(0, MAX_STR_LEN) + "...(truncated)";
+            }
+        }
+        return value;
+    };
+
+    /**
+     * 安全序列化对象,截断超大字符串
+     */
+    private String safeToJSONString(Object obj) {
+        if (obj == null) {
+            return null;
+        }
+        try {
+            return JSON.toJSONString(obj, TRUNCATE_FILTER);
+        } catch (Exception e) {
+            // 如果序列化依然失败,返回简单类型信息
+            return "Serialization failed: " + e.getMessage() + " - object type: " + obj.getClass().getSimpleName();
+        }
+    }
+
     private Object getResult(ProceedingJoinPoint p) throws Throwable {
         Object result = null;
-        //开始时间
         Date startTime = new Date();
         String targetName = p.getTarget().getClass().getName();
         String methodName = p.getSignature().getName();
@@ -68,39 +97,39 @@ public class LogInfoAspect {
         List<Object> logArgs = stream
                 .filter(arg -> (!(arg instanceof HttpServletRequest) && !(arg instanceof HttpServletResponse)) && !(arg instanceof MultipartFile))
                 .collect(Collectors.toList());
-        //过滤后序列化无异常
-        String param = JSON.toJSONString(logArgs);
+        // 参数序列化(也可使用安全版本,但通常参数较小)
+        String param = safeToJSONString(logArgs);  // 替换为安全方法
         String exception = "";
         try {
-            //执行结果,返回参数
             result = p.proceed();
         } catch (Throwable e) {
             exception = e.getMessage();
-            //异常抛出
             throw e;
         } finally {
             Date endTime = new Date();
             long time = endTime.getTime() - startTime.getTime();
             Boolean slowRequest = (time > 1500L);
 
+            // 使用 safeToJSONString 替代直接序列化
+            String resultJson = safeToJSONString(result);
             if (exception != null && !exception.isEmpty()) {
                 log.error("\nAPI调用异常 - {}.{} \n调用方 - {} \n参数:{} \n结果:{} \n异常:{} \n耗时:{}ms \n慢请求:{}",
-                        targetName, methodName, callerMethodName, param, JSON.toJSONString(result), exception, time, slowRequest);
+                        targetName, methodName, callerMethodName, param, resultJson, exception, time, slowRequest);
             } else if (slowRequest) {
                 log.warn("\nAPI慢请求 - {}.{} \n调用方 - {} \n参数:{} \n结果:{} \n耗时:{}ms \n慢请求:{}",
-                        targetName, methodName, callerMethodName, param, JSON.toJSONString(result), time, slowRequest);
+                        targetName, methodName, callerMethodName, param, resultJson, time, slowRequest);
             } else {
                 log.info("\nAPI调用成功 - {}.{} \n调用方 - {} \n参数:{} \n结果:{} \n耗时:{}ms",
-                        targetName, methodName, callerMethodName, param, JSON.toJSONString(result), time);
+                        targetName, methodName, callerMethodName, param, resultJson, time);
             }
 
-            // 原始详细日志保留为debug级别
+            // debug 日志同样使用安全序列化
             log.debug("\n接口调用 - {}.{} \n调用方 - {}\nparam={}\nresult={}\nexception={}\n[{}->{}],slowRequest{}=[{}]",
                     targetName,
                     methodName,
                     callerMethodName,
                     param,
-                    JSON.toJSONString(result),
+                    resultJson,
                     exception,
                     DateFormatUtils.format(startTime, TIME_PATTERN),
                     DateFormatUtils.format(endTime, TIME_PATTERN),
@@ -148,17 +177,16 @@ public void doAfterThrowing(JoinPoint point, Throwable e) throws Throwable {
         String targetName = point.getTarget().getClass().getName();
         String methodName = point.getSignature().getName();
         String callerMethodName = getCallerMethodName();
-        //获取用户请求方法的参数并序列化为JSON格式字符串
         StringBuilder params = new StringBuilder();
         if (point.getArgs() != null && point.getArgs().length > 0) {
             for (int i = 0; i < point.getArgs().length; i++) {
-                Object object = point.getArgs()[i];
-                if (!(object instanceof MultipartFile) && !(object instanceof HttpServletResponse) && !(object instanceof HttpServletRequest)) {
-                    params.append(JSONObject.toJSONString(point.getArgs()[i])).append(";");
+                Object arg = point.getArgs()[i];
+                if (!(arg instanceof MultipartFile) && !(arg instanceof HttpServletResponse) && !(arg instanceof HttpServletRequest)) {
+                    // 使用安全序列化
+                    params.append(safeToJSONString(arg)).append(";");
                 }
             }
         }
-
         Date endTime = new Date();
         long time = endTime.getTime() - startTime.getTime();
         log.error("\nSERVICE异常 - {}.{} \n调用方 - {} \n参数:{} \n异常:{} \n耗时:{}ms \n时间:[{}->{}]",

+ 2 - 0
sckw-modules/sckw-product/src/main/java/com/sckw/product/model/vo/req/AddGoodsParam.java

@@ -1,5 +1,6 @@
 package com.sckw.product.model.vo.req;
 
+import com.alibaba.fastjson2.annotation.JSONField;
 import io.swagger.v3.oas.annotations.media.Schema;
 import jakarta.validation.Valid;
 import jakarta.validation.constraints.*;
@@ -83,6 +84,7 @@ public class AddGoodsParam {
      * 富文本内容
      */
     @Schema(description = "富文本内容")
+    @JSONField(serialize = false)
     private String content;
 
     /**

+ 3 - 22
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/handler/UnloadingWeighHandler.java

@@ -166,12 +166,9 @@ public class UnloadingWeighHandler extends AbstractWaybillOrderHandler<WaybillOr
         }
 
         // 1.填充运单卸货单皮重、净重
-        BigDecimal unloadAmount = updateTareAmount(param, takeTicket);
+        updateTareAmount(param, takeTicket);
 
-        // 2.填充子运单卸货净重
-        updateUnLoadAmount(param, waybillOrder, unloadAmount);
-
-        // 3.创建卸货过磅记录
+        // 2.创建卸货过磅记录
         createWeighbridges(waybillOrder);
     }
 
@@ -180,7 +177,7 @@ public class UnloadingWeighHandler extends AbstractWaybillOrderHandler<WaybillOr
      * @param param
      * @param takeTicket
      */
-    private BigDecimal updateTareAmount(WaybillOrderUnloadingWeighParam param, KwtWaybillOrderTicket takeTicket) {
+    private void updateTareAmount(WaybillOrderUnloadingWeighParam param, KwtWaybillOrderTicket takeTicket) {
         //皮重
         BigDecimal tareAmount = param.getWeighAmount();
         //毛重
@@ -191,22 +188,6 @@ public class UnloadingWeighHandler extends AbstractWaybillOrderHandler<WaybillOr
         takeTicket.setTareAmount(tareAmount);
         takeTicket.setAmount(unloadAmount);
         waybillOrderTicketRepository.updateById(takeTicket);
-        return unloadAmount;
-    }
-
-    /**
-     * 填充装货净重
-     * @param param
-     * @param waybillOrder
-     * @param unloadAmount
-     */
-    private void updateUnLoadAmount(WaybillOrderUnloadingWeighParam param, KwtWaybillOrder waybillOrder, BigDecimal unloadAmount) {
-        //更新子运单卸货净重
-        KwtWaybillOrderSubtask subtask = getWaybillSubtask(waybillOrder.getId());
-        subtask.setUnloadAmount(unloadAmount);
-        subtask.setUnloadTime(new Date());
-        waybillOrderSubtaskRepository.updateById(subtask);
-        log.info("物流运单离场过磅成功!运单ID: {}, 皮重: {}, 卸货净重: {}", param.getWaybillOrderId(), param.getWeighAmount(), unloadAmount);
     }
 
 

+ 2 - 2
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/repository/KwtWaybillOrderRepository.java

@@ -250,7 +250,7 @@ public class KwtWaybillOrderRepository extends ServiceImpl<KwtWaybillOrderMapper
      */
     public List<KwtWaybillOrder> queryCompletedWaybillOrders(Integer status) {
         return list(Wrappers.<KwtWaybillOrder>lambdaQuery()
-                .select(KwtWaybillOrder::getId, KwtWaybillOrder::getUpdateTime)
+                .select(KwtWaybillOrder::getId, KwtWaybillOrder::getLOrderId, KwtWaybillOrder::getUpdateTime)
                 .eq(KwtWaybillOrder::getDelFlag, 0)
                 .eq(KwtWaybillOrder::getStatus, status)
                 .orderByDesc(KwtWaybillOrder::getUpdateTime));
@@ -358,4 +358,4 @@ public class KwtWaybillOrderRepository extends ServiceImpl<KwtWaybillOrderMapper
         return page(page,wrapper);
     }
 
-}
+}

+ 4 - 4
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/KwtWaybillOrderV1Service.java

@@ -3472,10 +3472,10 @@ public class KwtWaybillOrderV1Service {
         //氧化钙
         WaybillOrderSaleDto waybillOrderSaleDto2 = waybillOrderV1Dao.saleSum(List.of("003", "0007", "0008", "0009"));
         WaybillOrderSaleVo waybillOrderSaleVo = new WaybillOrderSaleVo();
-        waybillOrderSaleVo.setShsChl(waybillOrderSaleDto.getChl());
-        waybillOrderSaleVo.setShsXsl(waybillOrderSaleDto.getXsl());
-        waybillOrderSaleVo.setYhgChl(waybillOrderSaleDto2.getChl());
-        waybillOrderSaleVo.setYhgXsl(waybillOrderSaleDto2.getXsl());
+        waybillOrderSaleVo.setShsChl(Objects.nonNull(waybillOrderSaleDto) ? waybillOrderSaleDto.getChl() : BigDecimal.ZERO);
+        waybillOrderSaleVo.setShsXsl(Objects.nonNull(waybillOrderSaleDto) ? waybillOrderSaleDto.getXsl() : BigDecimal.ZERO);
+        waybillOrderSaleVo.setYhgChl(Objects.nonNull(waybillOrderSaleDto2) ? waybillOrderSaleDto2.getChl() : BigDecimal.ZERO);
+        waybillOrderSaleVo.setYhgXsl(Objects.nonNull(waybillOrderSaleDto2) ? waybillOrderSaleDto2.getXsl() : BigDecimal.ZERO);
 
         return waybillOrderSaleVo;
     }

+ 22 - 4
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/TransportStatisticsService.java

@@ -15,6 +15,7 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
+import java.util.Collections;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
@@ -59,8 +60,8 @@ public class TransportStatisticsService {
 
         log.info("查询顶部运输统计数据,todayStart={}, tomorrowStart={}", todayStart, tomorrowStart);
 
-        List<KwtWaybillOrder> completedWaybillOrders =
-                waybillOrderRepository.queryCompletedWaybillOrders(CarWaybillV1Enum.COMPLETED.getCode());
+        List<KwtWaybillOrder> completedWaybillOrders = defaultList(
+                waybillOrderRepository.queryCompletedWaybillOrders(CarWaybillV1Enum.COMPLETED.getCode()));
         if (completedWaybillOrders.isEmpty()) {
             log.info("未查询到已完成运单,返回默认零值");
             return buildEmptyStatistics();
@@ -68,11 +69,13 @@ public class TransportStatisticsService {
 
         // 提取已完成运单的ID列表,用于查询关联的子任务数据
         List<Long> waybillOrderIds = completedWaybillOrders.stream()
+                .filter(Objects::nonNull)
                 .map(KwtWaybillOrder::getId)
                 .filter(Objects::nonNull)
                 .toList();
         // 提取已完成运单关联的物流订单ID,用于查询计费方式
         List<Long> logisticsOrderIds = completedWaybillOrders.stream()
+                .filter(Objects::nonNull)
                 .map(KwtWaybillOrder::getLOrderId)
                 .filter(Objects::nonNull)
                 .distinct()
@@ -80,22 +83,28 @@ public class TransportStatisticsService {
         log.debug("提取到 {} 个唯一的物流订单ID", logisticsOrderIds.size());
 
         // 批量查询物流订单信息
-        List<KwtLogisticsOrder> logisticsOrders = logisticsOrderRepository.queryByLogisticsOrderIds(logisticsOrderIds);
+        List<KwtLogisticsOrder> logisticsOrders = logisticsOrderIds.isEmpty()
+                ? Collections.emptyList()
+                : defaultList(logisticsOrderRepository.queryByLogisticsOrderIds(logisticsOrderIds));
         log.debug("查询到 {} 条物流订单记录", logisticsOrders.size());
 
         // 构建物流订单ID到计费方式的映射关系
         Map<Long, String> billingModeMap = logisticsOrders.stream()
+                .filter(Objects::nonNull)
                 .filter(logisticsOrder -> Objects.nonNull(logisticsOrder.getId()))
                 .collect(Collectors.toMap(KwtLogisticsOrder::getId, KwtLogisticsOrder::getBillingMode, (left, right) -> left));
         log.debug("构建计费方式映射完成,共 {} 条记录", billingModeMap.size());
 
         // 根据运单ID列表批量查询子任务信息,用于后续统计净重
-        List<KwtWaybillOrderSubtask> subtasks = waybillOrderSubtaskRepository.queryByWOrderIds(waybillOrderIds);
+        List<KwtWaybillOrderSubtask> subtasks = waybillOrderIds.isEmpty()
+                ? Collections.emptyList()
+                : defaultList(waybillOrderSubtaskRepository.queryByWOrderIds(waybillOrderIds));
 
         // 先按运单维度汇总净重,后续累计和今日统计都直接复用,避免重复遍历明细数据。
         // 其中净重按物流订单计费方式动态取值:
         // billingMode=1 取装货量,billingMode=2 取卸货量,其它情况默认按卸货量处理。
         Map<Long, BigDecimal> transportAmountMap = subtasks.stream()
+                .filter(Objects::nonNull)
                 .filter(subtask -> Objects.nonNull(subtask.getWOrderId()))
                 .collect(Collectors.groupingBy(
                         KwtWaybillOrderSubtask::getWOrderId,
@@ -107,12 +116,14 @@ public class TransportStatisticsService {
 
         // 计算累计运量:遍历所有已完成运单,从预计算的运量映射中获取各运单净重并累加
         BigDecimal totalTransportAmount = completedWaybillOrders.stream()
+                .filter(Objects::nonNull)
                 .map(KwtWaybillOrder::getId)
                 .map(id -> transportAmountMap.getOrDefault(id, BigDecimal.ZERO))
                 .reduce(BigDecimal.ZERO, BigDecimal::add);
 
         // 筛选今日完成的运单:根据运单更新时间判断是否落在当天时间范围内
         List<KwtWaybillOrder> todayCompletedWaybillOrders = completedWaybillOrders.stream()
+                .filter(Objects::nonNull)
                 .filter(waybillOrder -> isBetween(waybillOrder.getUpdateTime(), todayStart, tomorrowStart))
                 .toList();
 
@@ -143,6 +154,10 @@ public class TransportStatisticsService {
                 .build();
     }
 
+    private <T> List<T> defaultList(List<T> list) {
+        return list == null ? Collections.emptyList() : list;
+    }
+
     private BigDecimal defaultAmount(BigDecimal amount) {
         return amount == null ? BigDecimal.ZERO : amount;
     }
@@ -155,6 +170,9 @@ public class TransportStatisticsService {
      * @return 当前子单应参与统计的净重
      */
     private BigDecimal resolveTransportAmount(KwtWaybillOrderSubtask subtask, String billingMode) {
+        if (billingMode == null) {
+            return BigDecimal.ZERO;
+        }
         if (DictEnum.CHARGING_TYPE_1.getValue().equals(billingMode)) {
             return defaultAmount(subtask.getLoadAmount());
         }