yeg
2026-09-28 38673d3a0fe367b944ff6d9579953bb26b391023
修 22 所取数程序对 NULL 列的兼容与推式来源离线提示的措辞

- 取数程序:厂商列可能为 NULL,直接强转 [double]/[int] 会抛异常并让该通道
从此不再推进。改为缺列转 JSON null,只有 record_time 与 Data_Point 缺失
才跳行(它们是记录位置与幂等键),跳过时留下日志。演练已覆盖含 NULL 列的
一批:端点接受,落地行的缺列保持为空而不是零。
- 推式来源:实例配置的 host 表示"取数程序所在那台机器",原来的离线提示写成
"指向 <host>:<port>"会误导现场去改推送目标。改为点名那台机器上的程序应
指向本系统的接收端点。
2个文件已修改
36 ■■■■■ 已修改文件
battery-business/src/main/java/com/battery/business/service/impl/PushIngestAdapter.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
scripts/j22-collector.ps1 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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)
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]
                    }
                }
            }