CHANGELOG.md 7.6 KB

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,禁用飞书后告警仍发送

部署说明

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 新增配置

[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