飞书多维表同步工具2026-07-10v4.1.2
ERP报表任务凭据配置改造(API方式与网页自动化凭据分离)
bug修复v4.1.2
需求描述
运行API方式下载任务时报错"API凭据未配置(缺少app_id或app_secret)"。根因是任务编辑界面的凭据下拉框只加载 platform="lingxing" 的网页凭据,领星API凭据(platform="lingxing_api")根本不会出现在下拉框中。用户选择"API方式"导出时只能选到网页凭据,执行器从网页凭据中读取 app_id/app_secret 必然为空。API下载方式与网页自动化方式的凭据配置混在一起,界面逻辑混乱。
根因分析
- tabs/erp_report_tab.py 第715行:
get_credentials_by_platform(platform)中platform="lingxing",只返回网页凭据,不包含API凭据 - tabs/erp_report_tab.py 第892-897行:
toggle_api_config()只切换了API字段配置区的显示,没有切换凭据下拉框的来源 - core/erp_executor.py 第175-181行:从网页凭据中读取
app_id/app_secret,必然为空,触发错误
改动文件清单
| 文件 | 类型 | 改动内容 |
|---|---|---|
tabs/erp_report_tab.py | 修改 | 1. import 增加 PLATFORM_LINGXING_API;2. 重构凭据加载逻辑:method_var 提前初始化,新增 _load_creds_for_method(method) 函数根据导出方式动态加载对应类型凭据(API→lingxing_api,网页→lingxing);3. current_creds 用列表作为可变容器(切片赋值更新,闭包可共享);4. 编辑旧任务时尝试恢复已保存的凭据选择,若凭据不在当前列表中则选第一个;5. toggle_api_config() 增加凭据刷新逻辑:切换方式时重新加载凭据到下拉框,尝试保持当前选中 |
gui_sync.py | 修改 | 版本号 4.1.1→4.1.2 |
技术要点
- 凭据平台与导出方式绑定:API方式 →
platform="lingxing_api"的凭据(含 app_id/app_secret);网页自动化 →platform="lingxing"的凭据(含 username/password)。切换导出方式时自动切换凭据来源 - 闭包变量共享机制:
current_creds用列表作为可变容器,toggle_api_config通过current_creds[:] = new_list切片赋值更新内容,on_cred_changed闭包也能看到新值,避免nonlocal的复杂性 - 编辑旧任务兼容:编辑时根据
export_method加载对应凭据列表,检查已保存的credential_id是否在列表中。若在则恢复选中,若不在(旧bug绑定了错误类型凭据)则选第一个 - 切换时保持选中:切换导出方式后,如果当前选中的凭据仍在新的列表中则保持不变,否则选第一个。避免用户切换回来时需要重新选择
验证结果
- 语法检查:
tabs/erp_report_tab.py通过py_compile - 自动化测试:19个测试全部通过(
python -m unittest tests.test_erp_credential_flow -v)- 凭据加载逻辑:5项测试通过(API方式加载lingxing_api凭据、网页自动化加载lingxing凭据、凭据列表无交集、API凭据有app_id/app_secret、网页凭据有username/password)
- 执行器凭据读取:4项测试通过(API凭据读取成功、网页凭据读取失败、空凭据读取失败、无erp_config读取失败)
- GUI凭据切换:5项测试通过(列表随方式变化、API→Web切换、Web→API切换、API凭据有app_id、网页凭据有username)
- 端到端凭据流:2项测试通过(API凭据完整流程成功、网页凭据完整流程失败)
- 旧任务兼容性:3项测试通过(编辑API任务恢复正确凭据、编辑API任务检测到错误凭据、编辑网页任务恢复正确凭据)
踩坑与解决
- method_var 初始化顺序:原代码中
method_var在凭据选择之后才创建(第739行),但凭据加载需要根据method_var的值决定加载哪种凭据。解决方法:将method_var的初始化提前到凭据加载之前,单选按钮仍在原位置创建(Tkinter grid不要求按顺序创建) - 闭包变量更新问题:
toggle_api_config中重新加载凭据后,on_cred_changed闭包中的current_creds引用需要看到新值。如果用current_creds = new_list重新赋值,需要nonlocal声明且on_cred_changed也需要能看到。解决方法:用current_creds[:] = new_list切片赋值,利用列表可变性共享状态,无需nonlocal
下一阶段规划
- 考虑在 on_save 中增加更精确的校验提示:API方式无API凭据时提示"未找到领星API凭据,请先在凭据管理中添加"
- 考虑切换导出方式时记录每种方式最后选中的凭据,切换回来时恢复