CHANGELOG.md 6.2 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 时传入重量参数

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