飞书多维表同步工具2026-07-10v4.1.3
API下载三个关键bug修复(report_type/标签/网页专属配置隐藏)
bug修复v4.1.3
需求描述
v4.1.2修复了凭据加载问题后,运行API方式任务仍报错"不支持的报表类型: FBA补货建议"。深入排查发现3个关键bug:
- report_type保存的是中文名"FBA补货建议",但API下载器期望的是report_id"fba_replenishment_advice"
- "ERP账号"标签不随导出方式变化,API方式仍显示"ERP账号"而非"API凭据"
- API方式仍显示网页专属配置(报表下载名称/管理按钮),违反spec要求
根因分析
- report_type中文名bug:erp_report_tab.py的on_save中
task["report_type"] = report_var.get()保存的是combobox显示的中文名(如"FBA补货建议"),但API下载器的_fetch_raw_data方法用if report_type == REPORT_REPLENISHMENT_ADVICE比较的是英文id(如"fba_replenishment_advice"),两者不匹配走到else分支报错 - 标签固定bug:cred_label固定写死text="ERP账号:",toggle_api_config未根据导出方式动态修改文字
- 网页专属配置未隐藏bug:toggle_api_config只切换了api_config_frame的显示,未隐藏dimension_frame中的"报表下载名称"Label/Combo和"管理"Button。spec第367行明确要求"API方式隐藏网页自动化专属配置(导出名称等)"
改动文件清单
| 文件 | 类型 | 改动内容 |
|---|---|---|
tabs/erp_report_tab.py | 修改 | 1. report_type保存改为report_config.get("id", report_var.get())保存report_id;2. 编辑模式加载时通过report_id反查中文名用于combobox显示;3. cred_label改为可引用变量,toggle_api_config中根据方式动态设置文字(API→"API凭据:",网页→"ERP账号:");4. "报表下载名称"Label/Combo和"管理"Button改为可引用变量(export_name_label/export_name_combo/export_name_mgr_btn),toggle_api_config中API方式grid_remove隐藏;5. on_save中删除api_config["export_name"]保存(API方式不需要export_name) |
tests/test_erp_credential_flow.py | 修改 | 新增TestReportTypeIdConsistency测试类(6个测试):报表配置有id和name、补货建议id与API下载器常量一致、本地库存id与API下载器常量一致、API下载器能识别report_id、中文名不被识别、保存的report_type应是id格式 |
gui_sync.py | 修改 | 版本号 4.1.2→4.1.3 |
技术要点
- report_id与report_name分离:combobox显示中文名(用户友好),但任务保存的是英文report_id(程序识别用)。加载旧任务时通过report_id反查中文名设置combobox。这与凭据管理的"显示名称+存储ID"模式一致
- API方式维度保留但导出名称隐藏:dimension_frame中row=0是维度选择(API方式也需要),row=1是报表下载名称+管理按钮(网页自动化专属)。toggle_api_config只隐藏row=1的控件,保留row=0的维度选择
- 标签动态变化的实现:Tkinter的Label控件通过
label.config(text="新文字")动态修改文字,无需销毁重建控件
验证结果
- 语法检查:
tabs/erp_report_tab.py通过py_compile - 自动化测试:25个测试全部通过(
python -m unittest tests.test_erp_credential_flow -v)- 凭据加载逻辑:5项通过
- 执行器凭据读取:4项通过
- GUI凭据切换:5项通过
- 端到端凭据流:2项通过
- 旧任务兼容性:3项通过
- report_type正确性:6项通过(报表配置有id和name、两个报表id与API下载器常量一致、API下载器能识别report_id、中文名不被识别、保存的report_type应是id格式)
踩坑与解决
- report_type中文名bug根因:combobox的textvariable直接绑定到report_var,report_var的值是中文名。on_save直接用report_var.get()保存了中文名。解决方法:保存时通过get_current_report_config()获取报表配置,用report_config.get("id")保存report_id
- 编辑模式加载兼容:旧任务保存的可能是中文名(v4.1.2之前)或report_id(v4.1.3之后)。加载时先尝试用report_id查找报表配置,找不到再尝试用中文名查找。当前实现:先通过report_id反查中文名,找不到则用第一个报表名
下一阶段规划
- 考虑在切换导出方式时记录每种方式最后选中的凭据,切换回来时恢复
- 考虑API方式下"保存路径"是否可选(feishu_only模式不需要保存路径)