# CHANGELOG.md — fix27 v44 更新记录 ## [v44] - 2026-08-30 ### fix27 - 飞书消息携带重量信息 + 水印居中修复 + Bug修复 #### 功能 #1:飞书消息携带重量信息 **需求**:config.ini `[weight]` 段 `flagWeight=1` 时,飞书消息附带重量数据 **实现**: - 新增全局变量 `g_flag_weight`,控制飞书消息是否带重量 - 修改 `send_feishu_msg()` 函数,增加 `weight_kg` 参数 - 当 `g_flag_weight=true && weight_kg >= 0` 时,附加重量信息 **影响文件**: - `src/common.h`: 新增 `extern bool g_flag_weight;` - `src/common.cpp`: 定义 `bool g_flag_weight = false;` - `src/config.cpp`: `flagWeight=1` 时同步设置 `g_flag_weight` - `src/feishu_client.h`: `send_feishu_msg()` 新增 `double weight_kg = -1.0` 参数 - `src/feishu_client.cpp`: 当 `g_flag_weight && weight_kg >= 0` 时附加重量 - `src/web_server.cpp`: 进站/出站调用 `send_feishu_msg` 时传入重量参数 --- #### 🔧 本轮追加修复(Code Review 补充) ##### Bug: 共享摄像头模式方向标记错误(P0) **根因**:plate_recognizer.cpp 中 is_inbound/is_outbound 使用原始 cap_info 而非 effective_cap_info **影响**:共享摄像头模式下进站/出站方向判断错误 **修复**:改为使用 effective_cap_info->dtype 判断方向 **文件**:src/plate_recognizer.cpp ##### Bug: 永久失败告警时空指针解引用(P1) **根因**:main.cpp 中 send_permanent_failure_alert 访问 cap_info_copy->dtype 前未检查 null **影响**:cap_info_copy 为空时程序崩溃 **修复**:添加空指针前置检查 **文件**:src/main.cpp ##### Bug: 启动消息版本号未更新(P2) **根因**:main.cpp 启动消息仍为 v43.2 fix19 **修复**:更新为 fix27 v44 **文件**:src/main.cpp ##### Bug: 生产环境日志污染(P2) **根因**:parse_create_bill_response 每次都打印完整 API 响应到 stdout **修复**:仅在 DEBUG_LOG 模式下打印 **文件**:src/network_client.cpp ##### Bug: README 编程语言标注不一致(P3) **根因**:README 标注 C++23,CMakeLists.txt 实际设置 C++17 **修复**:README 更正为 C++17 **文件**:README.md ##### Bug: sync_to_gogs.sh 硬编码 Access Token(P3) **根因**:脚本中直接硬编码 Token,推送到仓库会泄露凭证 **修复**:改为环境变量 GOGS_ACCESS_TOKEN 读取,保留默认值兼容 **文件**:sync_to_gogs.sh #### Bug #27(中):水印文字超出右边界被截断 **根因**:`create_text_watermark()` 中 `putText()` 起始位置固定为 `cv::Point(40, 80)`,文字较长时右侧超出边界被截断 **修复**:新增 `estimate_text_width()` 函数估算文字宽度,计算居中位置 `x = (width - text_width) / 2` **影响文件**:`src/plate_recognizer.cpp` --- #### Bug #28(严重):飞书消息等待重量数据的时序问题 **根因**:`web_server.cpp` 中 `upload_in_photos()` 调用 `db_wait_weight_by_plate()` 只等 3 秒轮询数据库,但重量任务需要:读秤(~8秒)+API上传+写DB,3秒不够 **修复**:改用 `weight_dispatch_wait_result()`(promise/future 机制),超时 15 秒,直接获取重量结果 **影响文件**:`src/web_server.cpp` - 添加 `#include "weight_dispatcher.h"` - 进站/出站:替换 `db_wait_weight_by_plate` → `weight_dispatch_wait_result` --- #### Bug #29(中等):weight_dispatch_wait_result 重复调用导致第二次返回 false **根因**:`weight_dispatch_wait_result()` 在获取结果后会清理 entry(`erase`),导致: 1. `upload_in_photos()` 中第一次调用 → 获取结果并清理 entry 2. `main.cpp` 中第二次调用(Reporter 日志)→ entry 已被清理,返回 false **修复**:移除 `weight_dispatch_wait_result()` 中的 erase 操作,entry 由 `weight_dispatch_cleanup()` 统一清理 **影响文件**:`src/weight_dispatcher.cpp` --- #### Bug #30(严重):v43 并行模式下 MQTT 消息未发送 **根因**:v43 并行模式使用 `weight_dispatcher.cpp` 的 `weight_worker_func`,但该函数中没有 MQTT 发送逻辑。MQTT 发送只在旧版 `weight_scale.cpp` 的 `weight_mqtt_worker_func` 中实现 **修复**:在 `weight_dispatcher.cpp` 的 `weight_worker_func` 中添加步骤5:MQTT发布,格式与旧版一致 **影响文件**:`src/weight_dispatcher.cpp` --- #### Bug #31(严重):成功路径缺少 cleanup 导致内存泄漏 **根因**:修复 Bug #29 时移除了 `weight_dispatch_wait_result()` 中的 erase 操作,但 main.cpp 成功路径(正常路径 + 重试路径)未调用 `weight_dispatch_cleanup()`,导致 `g_weight_results` map 中 entry 永远不会被清理 **修复**:在两条成功路径的 Reporter 日志后追加 `weight_dispatch_cleanup(plate_info->tb_num);` **影响文件**:`src/main.cpp`(重试路径 ~line 454、正常路径 ~line 748) #### Bug #32(中):永久失败告警未受飞书开关控制 **根因**:`send_permanent_failure_alert()` 只检查了 `g_suppress_emergency_alert`,未检查 `g_feishu_enabled`。当用户设置 `ENABLED=0` 禁用飞书时,永久失败告警仍会通过飞书发送 **修复**:在函数入口处添加 `if (!g_feishu_enabled) return false;` **影响文件**:`src/feishu_client.cpp` ### 本轮审查总结 | Bug # | 严重度 | 问题 | |:---:|:---:|:---| | #27 | 中 | 水印文字超出右边界被截断 | | #28 | **严重** | 飞书消息等待重量数据的时序问题(3秒不够) | | #29 | 中 | `weight_dispatch_wait_result` 重复调用导致第二次返回 false | | #30 | **严重** | v43 并行模式下 MQTT 消息未发送 | | #31 | **严重** | 成功路径缺少 cleanup 导致 `g_weight_results` map 内存泄漏 | | #32 | 中 | `send_permanent_failure_alert` 未检查 `g_feishu_enabled`,禁用飞书后告警仍发送 | --- ### 部署说明 ```bash cd /opt/openAI/project/003.PlateRecAPP/ tar -xzf fix27_v44_bug28.tar.gz make clean && make sudo systemctl restart PlateRecApp ``` ### 验证要点 1. **飞书消息携带重量**:`flagWeight=1` 时,进站/出站消息应包含 `重量: XXXXX kg (XX.X 吨)` 2. **水印居中**:水印文字应居中显示,不超出右边界 3. **MQTT 消息**:v43 并行模式下,MQTT 应正常发送消息 4. **Reporter 日志**:v43 Reporter 日志应正确显示重量信息 --- ## 功能 #2:飞书/MQTT 消息独立开关 **实现时间**:2026-08-30 **需求人**:王海鹏 ### 需求描述 - 飞书消息和 MQTT 消息需要可以独立配置启用/禁用,互不影响 ### 改动内容 1. **新增 `g_feishu_enabled` 全局开关**: - `common.h` / `common.cpp`:新增声明与定义(默认 false) - `config.cpp`:`[feishu]` 段解析 `ENABLED = 0|1` - `web_server.cpp`:进站/出站发送飞书消息前检查 `g_feishu_enabled` 2. **MQTT 改用显式开关**: - `config.cpp`:`[MQTT]` 段新增 `MQTT_ENABLED = 0|1`,不再依赖 `MQTT_HOST` 是否存在自动启用 ### config.ini 新增配置 ```ini [feishu] ENABLED = 1 # 1=启用飞书消息推送,0=禁用 [MQTT] MQTT_ENABLED = 1 # 1=启用MQTT消息推送,0=禁用 ``` ### 影响文件 | 文件 | 改动 | |------|------| | `src/common.h` | 新增 `extern bool g_feishu_enabled;` | | `src/common.cpp` | 新增 `bool g_feishu_enabled = false;` | | `src/config.cpp` | 解析 `ENABLED` 和 `MQTT_ENABLED`;更新启动日志 | | `src/web_server.cpp` | 进站/出站飞书发送加 `g_feishu_enabled` 守卫;状态页新增飞书状态展示 | | `src/feishu_client.cpp` | `send_permanent_failure_alert` 增加 `g_feishu_enabled` 检查 | | `config一号门.ini` | 新增 `ENABLED=1`、`MQTT_ENABLED=1` | | `config二号门.ini` | 新增 `ENABLED=1`、`MQTT_ENABLED=1` |