From 2e100195206a79bcd315863aa6867ee66bdfe999 Mon Sep 17 00:00:00 2001
From: zhang <zc857179121@qq.com>
Date: 星期四, 26 三月 2026 12:41:33 +0800
Subject: [PATCH] 上报小车高级信息

---
 zy-acs-manager/src/main/java/com/zy/acs/manager/core/scheduler/MaintainScheduler.java      |   25 ++++++
 zy-acs-manager/src/main/java/com/zy/acs/manager/core/integrate/dto/FaultUplinkParam.java   |   23 +++++
 zy-acs-manager/src/main/java/com/zy/acs/manager/core/integrate/wms/FaultReportService.java |  106 ++++++++++++++++++++++++++
 zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/FaultProcessor.java           |    2 
 zy-acs-manager/src/main/java/com/zy/acs/manager/manager/enums/VehFaultRecStateType.java    |   27 ++++++
 5 files changed, 183 insertions(+), 0 deletions(-)

diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/integrate/dto/FaultUplinkParam.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/integrate/dto/FaultUplinkParam.java
new file mode 100644
index 0000000..166fec9
--- /dev/null
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/integrate/dto/FaultUplinkParam.java
@@ -0,0 +1,23 @@
+package com.zy.acs.manager.core.integrate.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class FaultUplinkParam {
+
+    private String agvId;
+
+
+    private String faultNo;
+
+    /**
+     * 鏁呴殰鍚�
+     */
+    private String faultName;
+
+    private Date happenTime;
+
+}
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/integrate/wms/FaultReportService.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/integrate/wms/FaultReportService.java
new file mode 100644
index 0000000..8cbc13e
--- /dev/null
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/integrate/wms/FaultReportService.java
@@ -0,0 +1,106 @@
+package com.zy.acs.manager.core.integrate.wms;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.TypeReference;
+import com.zy.acs.framework.common.Cools;
+import com.zy.acs.framework.common.SnowflakeIdWorker;
+import com.zy.acs.manager.common.config.UplinkProperties;
+import com.zy.acs.manager.common.constant.Constants;
+import com.zy.acs.manager.common.utils.HttpGo;
+import com.zy.acs.manager.core.domain.type.NamespaceType;
+import com.zy.acs.manager.core.integrate.dto.FaultUplinkParam;
+import com.zy.acs.manager.core.integrate.dto.HttpResult;
+import com.zy.acs.manager.core.integrate.dto.TaskUplinkParam;
+import com.zy.acs.manager.core.service.ThreadPoolRegulator;
+import com.zy.acs.manager.manager.entity.Bus;
+import com.zy.acs.manager.manager.entity.IntegrationRecord;
+import com.zy.acs.manager.manager.entity.VehFaultRec;
+import com.zy.acs.manager.manager.enums.IntegrationDirectionType;
+import com.zy.acs.manager.manager.enums.StatusType;
+import com.zy.acs.manager.manager.service.BusService;
+import com.zy.acs.manager.manager.service.IntegrationRecordService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.PostConstruct;
+import java.time.Duration;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+@Slf4j
+@Service
+public class FaultReportService {
+
+
+    private HttpGo http;
+
+    private long timeoutSeconds = 15;
+
+    @PostConstruct
+    public void init() {
+        this.http = HttpGo.builder()
+                .connectTimeout(Duration.ofSeconds(timeoutSeconds))
+                .readTimeout(Duration.ofSeconds(timeoutSeconds))
+                .build();
+    }
+
+    public boolean reportFinished(VehFaultRec vehFaultRec, String reportFaultUrl ) {
+        if (Cools.isEmpty(vehFaultRec)) {
+            return false;
+        }
+
+        // headers
+        Map<String, String> headers = new HashMap<>();
+        // params
+        FaultUplinkParam param = new FaultUplinkParam();
+        param.setFaultNo( vehFaultRec.getFaultNo());
+        param.setFaultName( vehFaultRec.getFaultName());
+        param.setAgvId(vehFaultRec.getAgvId$());
+        param.setHappenTime( vehFaultRec.getHappenTime());
+
+
+        HttpResult<?> result;
+        try {
+            result = postForResult(reportFaultUrl, headers, param);
+
+            Integer code = result.getCode();
+            if (null == code || 200 != code) {
+                return false;
+            }
+
+        } catch (Exception e) {
+            log.error("Uplink report failed, taskId={}",
+                    JSON.toJSONString(vehFaultRec),
+                    e);
+            return false;
+        } finally {
+
+        }
+        return true;
+    }
+
+    private HttpResult<?> postForResult(String url, Map<String, String> headers, FaultUplinkParam param) throws Exception {
+        String json = JSON.toJSONString(param);
+        HttpGo.HttpResponse response = this.http.postJson(url, headers, json);
+
+        int status = response.statusCode();
+        if (status != 200) {
+            throw new RuntimeException("Uplink HTTP error: status=" + status + ", body=" + response.body());
+        }
+
+        String body = response.body();
+        if (Cools.isEmpty(body)) {
+            throw new RuntimeException("Uplink empty response body.");
+        }
+
+        HttpResult<?> result = JSON.parseObject(body, new TypeReference<HttpResult<?>>() {});
+        if (result == null) {
+            throw new RuntimeException("Uplink parse HttpResult failed: body=" + body);
+        }
+        return result;
+    }
+
+
+}
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/scheduler/MaintainScheduler.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/scheduler/MaintainScheduler.java
index e63e83b..583bf9f 100644
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/scheduler/MaintainScheduler.java
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/scheduler/MaintainScheduler.java
@@ -7,6 +7,7 @@
 import com.zy.acs.framework.common.DateUtils;
 import com.zy.acs.manager.common.config.UplinkProperties;
 import com.zy.acs.manager.core.integrate.wms.TaskReportService;
+import com.zy.acs.manager.core.integrate.wms.FaultReportService;
 import com.zy.acs.manager.core.service.MainLockWrapService;
 import com.zy.acs.manager.manager.entity.*;
 import com.zy.acs.manager.manager.enums.*;
@@ -17,6 +18,7 @@
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
 
+import java.time.Instant;
 import java.util.Date;
 import java.util.List;
 import java.util.Optional;
@@ -51,6 +53,10 @@
     private SegmentService segmentService;
     @Autowired
     private TaskReportService taskReportService;
+    @Autowired
+    private VehFaultRecService vehFaultRecService;
+    @Autowired
+    private FaultReportService faultReportService;
 
     @Scheduled(cron = "0/5 * * * * ? ")
     private synchronized void autoCharge(){
@@ -191,4 +197,23 @@
         }
     }
 
+
+    @Scheduled(cron = "0/3 * * * * ? ")
+    private void reportFault() {
+        String reportFaultUrl = configService.getVal("reportFaultUrl", String.class);
+        if (Cools.isEmpty(reportFaultUrl)) { return; }
+        List<VehFaultRec> vehFaultRecList = vehFaultRecService.list((new LambdaQueryWrapper<VehFaultRec>().eq(VehFaultRec::getState, VehFaultRecStateType.PENDING).ge(VehFaultRec::getHappenTime, Instant.now().minusSeconds(3))));
+        if (Cools.isEmpty(vehFaultRecList)) { return; }
+        for (VehFaultRec vehFaultRec : vehFaultRecList) {
+            boolean finished = faultReportService.reportFinished(vehFaultRec,reportFaultUrl);
+            if (finished) {
+                vehFaultRec.setState(VehFaultRecStateType.REPORT_SUCCESS.name());
+            } else {
+                log.error("failed to report vehFaultRec to uplink");
+                vehFaultRec.setState(VehFaultRecStateType.REPORT_FAILED.name());
+            }
+            vehFaultRecService.updateById(vehFaultRec);
+        }
+
+    }
 }
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/FaultProcessor.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/FaultProcessor.java
index e453a9b..3a012b1 100644
--- a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/FaultProcessor.java
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/service/FaultProcessor.java
@@ -8,6 +8,7 @@
 import com.zy.acs.framework.common.SnowflakeIdWorker;
 import com.zy.acs.manager.core.domain.VehicleFaultDto;
 import com.zy.acs.manager.manager.entity.VehFaultRec;
+import com.zy.acs.manager.manager.enums.VehFaultRecStateType;
 import com.zy.acs.manager.manager.service.AgvDetailService;
 import com.zy.acs.manager.manager.service.AgvService;
 import com.zy.acs.manager.manager.service.VehFaultRecService;
@@ -56,6 +57,7 @@
             vehFaultRec.setFaultData(GsonUtils.toJson(Cools.add("data1", agv_04_up.getData1()).add("data2", agv_04_up.getData2())));
             vehFaultRec.setHappenTime(new Date());
             vehFaultRec.setProtocol(RadixTools.bytesToHexStr(agv_04_up.writeToBytes()));
+            vehFaultRec.setState(VehFaultRecStateType.PENDING.name());
 
             if (!vehFaultRecService.save(vehFaultRec)) {
                 News.error("{}鍙疯溅杈嗘晠闅滐紒璁板綍鏁呴殰淇℃伅澶辫触......", dto.getVehicle());
diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/enums/VehFaultRecStateType.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/enums/VehFaultRecStateType.java
new file mode 100644
index 0000000..6a0a88d
--- /dev/null
+++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/manager/enums/VehFaultRecStateType.java
@@ -0,0 +1,27 @@
+package com.zy.acs.manager.manager.enums;
+
+import com.zy.acs.framework.common.Cools;
+
+public enum VehFaultRecStateType {
+
+    NONE,       // 鏈煡
+    PENDING,    // 寰呬笂鎶�
+    REPORT_SUCCESS,    // 鎴愬姛
+    REPORT_FAILED,     // 澶辫触
+
+    SKIPPED_REPORT,    // 璺宠繃
+    ;
+
+    public static VehFaultRecStateType of(String state) {
+        if (Cools.isEmpty(state)) {
+            return NONE;
+        }
+        for (VehFaultRecStateType type : VehFaultRecStateType.values()) {
+            if (type.toString().equals(state)) {
+                return type;
+            }
+        }
+        return NONE;
+    }
+
+}

--
Gitblit v1.9.1