返回开发日志
飞书多维表同步工具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下载方式与网页自动化方式的凭据配置混在一起,界面逻辑混乱。

根因分析

  1. tabs/erp_report_tab.py 第715行get_credentials_by_platform(platform)platform="lingxing",只返回网页凭据,不包含API凭据
  2. tabs/erp_report_tab.py 第892-897行toggle_api_config() 只切换了API字段配置区的显示,没有切换凭据下拉框的来源
  3. 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

技术要点

  1. 凭据平台与导出方式绑定:API方式 → platform="lingxing_api" 的凭据(含 app_id/app_secret);网页自动化 → platform="lingxing" 的凭据(含 username/password)。切换导出方式时自动切换凭据来源
  2. 闭包变量共享机制current_creds 用列表作为可变容器,toggle_api_config 通过 current_creds[:] = new_list 切片赋值更新内容,on_cred_changed 闭包也能看到新值,避免 nonlocal 的复杂性
  3. 编辑旧任务兼容:编辑时根据 export_method 加载对应凭据列表,检查已保存的 credential_id 是否在列表中。若在则恢复选中,若不在(旧bug绑定了错误类型凭据)则选第一个
  4. 切换时保持选中:切换导出方式后,如果当前选中的凭据仍在新的列表中则保持不变,否则选第一个。避免用户切换回来时需要重新选择

验证结果

  • 语法检查: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凭据,请先在凭据管理中添加"
  • 考虑切换导出方式时记录每种方式最后选中的凭据,切换回来时恢复