Jelajahi Sumber

修改日志打印

chenxiaofei 1 bulan lalu
induk
melakukan
8314466ff4

+ 47 - 21
iot-platform-manager/src/main/java/com/platform/api/controller/WeighbridgeV2Controller.java

@@ -4,16 +4,18 @@ import com.platform.api.manager.WeighbridgeRecordManage;
 import com.platform.api.request.LicensePlateValidateRequest;
 import com.platform.api.request.WeighbridgePushRequest;
 import com.platform.api.response.LicensePlateValidateResponse;
+import com.platform.config.XpCloudProperties;
+import com.platform.exception.IotException;
+import com.platform.external.request.CarInfoReq;
+import com.platform.external.request.WeighbridgeRecordReq;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.enums.ParameterIn;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
 import java.math.BigDecimal;
@@ -33,6 +35,9 @@ public class WeighbridgeV2Controller {
 
     private final WeighbridgeRecordManage weighbridgeRecordManage;
 
+    private static final String SIGNATURE = "Signature";
+    private final XpCloudProperties xpCloudProperties;
+
     /**
      * 地磅过磅数据上报
      */
@@ -69,47 +74,68 @@ public class WeighbridgeV2Controller {
     @Operation(summary = "车牌验证", description = "用于验证车牌是否合法,允许上磅")
     @PostMapping("/validateLicensePlate")
     public LicensePlateValidateResponse validateLicensePlate(
-            @Parameter(description = "车牌号") @RequestParam("licensePlate") String licensePlate,
-            @Parameter(description = "厂商来源标识") @RequestParam("uuid") String uuid
+            @Parameter(
+                    name = SIGNATURE,
+                    in = ParameterIn.HEADER)
+            @RequestHeader(value = SIGNATURE, required = false)  String printReceiptAuthSn,
+            @RequestBody CarInfoReq req
     ) {
+        assertPrintReceiptAuthorized(printReceiptAuthSn);
         LicensePlateValidateRequest request = new LicensePlateValidateRequest();
         String replac2 = "";
-        if (StringUtils.isNotBlank(licensePlate)) {
-            String trim = licensePlate.trim();
+        if (StringUtils.isNotBlank(req.getLicensePlate())) {
+            String trim = req.getLicensePlate().trim();
             String replace = trim.replace("\\r", "");
             String replace1 = replace.replace("\\n", "");
             replac2 = replace1.replace("\\r\\n", "");
         }
 
         request.setLicensePlate(replac2);
-        request.setUuid(uuid);
+        request.setUuid(req.getUuid());
         return weighbridgeRecordManage.handleValidateLicensePlate(request);
     }
 
     @Operation(summary = "地磅过磅数据上报", description = "接收地磅设备上报的过磅数据和图片")
     @PostMapping("/weighBridgePushV2")
     public LicensePlateValidateResponse weighBridgePushV2(
-            @Parameter(description = "车牌号") @RequestParam("licensePlate") String licensePlate,
-            @Parameter(description = "地磅编号") @RequestParam("weighbridgeCode") String weighbridgeCode,
-            @Parameter(description = "称重重量(吨)") @RequestParam("grossWeight") String grossWeight,
-            @Parameter(description = "时间戳(秒或毫秒)") @RequestParam("timestamp") String timestamp,
-            @Parameter(description = "处理标签") @RequestParam(value = "tag", required = false) String tag,
-            @Parameter(description = "车辆照片") @RequestParam(value = "images", required = false) List<String> images
+            @Parameter(
+                    name = SIGNATURE,
+                    in = ParameterIn.HEADER)
+            @RequestHeader(value = SIGNATURE, required = false)  String printReceiptAuthSn,
+            @RequestBody WeighbridgeRecordReq req
     ) {
+        assertPrintReceiptAuthorized(printReceiptAuthSn);
         // 构建请求对象
         WeighbridgePushRequest request = new WeighbridgePushRequest();
-        String lience = StringUtils.isNotBlank(licensePlate) ? licensePlate.trim().replace("\\r", "").replace("\\n", ""):"";
+        String lience = StringUtils.isNotBlank(req.getLicensePlate()) ? req.getLicensePlate().trim().replace("\\r", "").replace("\\n", ""):"";
         request.setLicensePlate(lience);
-        String weighCode =StringUtils.isNotBlank(weighbridgeCode) ?  weighbridgeCode.trim().replace("\\r", "").replace("\\n", ""):"";
+        String weighCode =StringUtils.isNotBlank(req.getWeighbridgeCode()) ?  req.getWeighbridgeCode().trim().replace("\\r", "").replace("\\n", ""):"";
         request.setWeighbridgeCode(weighCode);
-        String rossWeight = StringUtils.isNotBlank(grossWeight) ?grossWeight.trim().replace("\\r", "").replace("\\n", ""):"";
+        String rossWeight = StringUtils.isNotBlank(req.getGrossWeight()) ? req.getGrossWeight().trim().replace("\\r", "").replace("\\n", ""):"";
         request.setGrossWeight(new BigDecimal(rossWeight));
-        String time = StringUtils.isNotBlank(timestamp) ? timestamp.trim().replace("\\r", "").replace("\\n", ""):"";
+        String time = StringUtils.isNotBlank(req.getTimestamp()) ? req.getTimestamp().trim().replace("\\r", "").replace("\\n", ""):"";
         request.setTimestamp(Long.valueOf(time));
-        request.setTag(tag);
-        request.setBase64Images(images);
+        request.setTag(request.getTag());
+        request.setBase64Images(req.getImages());
 
         // 调用业务层处理
         return weighbridgeRecordManage.handleWeighbridgePushV2(request);
     }
+
+    /**
+     * 简单鉴权:当配置了允许的凭证时,请求头 {@link #SIGNATURE} 的值必须与其一致。
+     *
+     * @param headerSn 请求头 {@code X-Print-Receipt-Auth-Sn} 的取值
+     */
+    private void assertPrintReceiptAuthorized(String headerSn) {
+        if (!xpCloudProperties.isPrintReceiptAuthorizationConfigured()) {
+            log.debug("未配置 xp.dev.print-receipt-authorized-sn,跳过地磅请求头 {} 鉴权", SIGNATURE);
+            return;
+        }
+        if (xpCloudProperties.isUnauthorizedForPrintReceipt(headerSn)) {
+            log.warn("地磅鉴权拒绝:请求头 {} 与配置不一致(已屏蔽具体值)", SIGNATURE);
+            throw new IotException("无权限调用地磅接口");
+
+        }
+    }
 }

+ 24 - 0
iot-platform-manager/src/main/java/com/platform/external/request/CarInfoReq.java

@@ -0,0 +1,24 @@
+package com.platform.external.request;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
+import lombok.Data;
+
+@Data
+@Schema(description = "车辆信息请求参数")
+public class CarInfoReq {
+
+    /**
+     * 车牌号(必填)
+     */
+    @NotBlank(message = "车牌号不能为空")
+    @Schema(description = "车牌号", requiredMode = Schema.RequiredMode.REQUIRED)
+    private String licensePlate;
+
+    /**
+     * 厂商来源标识(必填)
+     */
+    @NotBlank(message = "厂商来源标识不能为空")
+    @Schema(description = "厂商来源标识", requiredMode = Schema.RequiredMode.REQUIRED)
+    private String uuid;
+}

+ 40 - 0
iot-platform-manager/src/main/java/com/platform/external/request/WeighbridgeRecordReq.java

@@ -0,0 +1,40 @@
+package com.platform.external.request;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
+import lombok.Data;
+import java.util.List;
+
+@Data
+@Schema(description = "地磅称重上报请求参数")
+public class WeighbridgeRecordReq {
+
+
+    // 【必填】车牌号
+    @NotBlank(message = "车牌号不能为空")
+    @Schema(description = "车牌号", requiredMode = Schema.RequiredMode.REQUIRED)
+    private String licensePlate;
+
+    // 【必填】地磅编号
+    @NotBlank(message = "地磅编号不能为空")
+    @Schema(description = "地磅编号", requiredMode = Schema.RequiredMode.REQUIRED)
+    private String weighbridgeCode;
+
+    // 【必填】称重重量(吨)
+    @NotBlank(message = "称重重量不能为空")
+    @Schema(description = "称重重量(吨)", requiredMode = Schema.RequiredMode.REQUIRED)
+    private String grossWeight;
+
+    // 【必填】时间戳(秒或毫秒)
+    @NotBlank(message = "时间戳不能为空")
+    @Schema(description = "时间戳(秒或毫秒)", requiredMode = Schema.RequiredMode.REQUIRED)
+    private String timestamp;
+
+    // 【非必填】处理标签
+    @Schema(description = "处理标签", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    private String tag;
+
+    // 【非必填】车辆照片列表
+    @Schema(description = "车辆照片", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    private List<String> images;
+}