From 38673d3a0fe367b944ff6d9579953bb26b391023 Mon Sep 17 00:00:00 2001
From: yeg <1347747024@qq.com>
Date: 星期一, 28 九月 2026 17:49:42 +0800
Subject: [PATCH] 修 22 所取数程序对 NULL 列的兼容与推式来源离线提示的措辞

---
 scripts/j22-collector.ps1                                                               |   33 +++++++++++++++++++++------------
 battery-business/src/main/java/com/battery/business/service/impl/PushIngestAdapter.java |    3 ++-
 2 files changed, 23 insertions(+), 13 deletions(-)

diff --git a/battery-business/src/main/java/com/battery/business/service/impl/PushIngestAdapter.java b/battery-business/src/main/java/com/battery/business/service/impl/PushIngestAdapter.java
index 167a78f..ac014a2 100644
--- a/battery-business/src/main/java/com/battery/business/service/impl/PushIngestAdapter.java
+++ b/battery-business/src/main/java/com/battery/business/service/impl/PushIngestAdapter.java
@@ -213,7 +213,8 @@
         java.util.Date receivedAt = records.selectHeartbeatAt(config.adapterCode());
         if (receivedAt == null)
             throw new DeviceAdapterException("SOURCE_OFFLINE",
-                    "尚未收到取数程序的推送:请确认程序已启动并指向 " + config.host() + ":" + config.port(), null);
+                    "尚未收到取数程序的推送:请确认 " + config.host()
+                            + " 那台机器上的取数程序已启动,并指向本系统的接收端点", null);
         Duration staleAfter = staleAfter();
         Duration silent = Duration.between(receivedAt.toInstant(), clock.instant());
         if (silent.compareTo(staleAfter) > 0)
diff --git a/scripts/j22-collector.ps1 b/scripts/j22-collector.ps1
index 868cf34..50fc189 100644
--- a/scripts/j22-collector.ps1
+++ b/scripts/j22-collector.ps1
@@ -220,20 +220,29 @@
 where record_time > @since
 "@ @{ '@since' = $since }
                 foreach ($row in $read) {
+                    # 厂商列可能为 NULL:直接强转 [double]/[int] 会抛异常、让整个通道从此不再推进。
+                    # 缺列一律转成 JSON null,后端把测量列的缺失当"设备没给",不写零代替缺失。
+                    $recordTime = To-Text $row[0]
+                    $dataPoint = To-Int $row[1]
+                    if ($null -eq $recordTime -or $null -eq $dataPoint) {
+                        # 这两个是记录位置与幂等键:缺了无法归属,只能跳过并留下日志
+                        Write-Log "  跳过一个缺少 record_time 或 Data_Point 的行 [$key]"
+                        continue
+                    }
                     # record_time 是 Int64,超过 JavaScript 安全整数范围:必须以字符串传输
                     $rows += [pscustomobject]@{
-                        record_time       = [string]$row[0]
-                        Data_Point        = [int]$row[1]
-                        Schedule_Index    = [string]$row[2]
-                        Step_Index        = [int]$row[3]
-                        Cycle_Index       = [int]$row[4]
-                        Step_Time         = [double]$row[5]
-                        Voltage           = [double]$row[6]
-                        eCurrent          = [double]$row[7]
-                        ChargeCapacity    = [double]$row[8]
-                        DischargeCapacity = [double]$row[9]
-                        ChargeEnergy      = [double]$row[10]
-                        DischargeEnergy   = [double]$row[11]
+                        record_time       = $recordTime
+                        Data_Point        = $dataPoint
+                        Schedule_Index    = To-Text $row[2]
+                        Step_Index        = To-Int $row[3]
+                        Cycle_Index       = To-Int $row[4]
+                        Step_Time         = To-Num $row[5]
+                        Voltage           = To-Num $row[6]
+                        eCurrent          = To-Num $row[7]
+                        ChargeCapacity    = To-Num $row[8]
+                        DischargeCapacity = To-Num $row[9]
+                        ChargeEnergy      = To-Num $row[10]
+                        DischargeEnergy   = To-Num $row[11]
                     }
                 }
             }

--
Gitblit v1.7.1