背景
金蝶云星空支持Python和C#两种插件开发方式。Python插件无需编译、上手快、修改灵活,于是我们选择用Python实现移动端调拨申请单下推调拨申请单功能。
然后踩了两天坑。
Python踩坑经过
第一关:按钮事件不触发
移动端Python插件必须继承AbstractMobileBillPlugin,且方法带self参数。同时BOSIDE保存时即使报ServiceHelper引用错误,忽略即可。
✅ 解决后:按钮事件成功触发,弹窗显示Key值
第二关到下推逻辑:全面失败
· ListSelectedRow → global name is not defined
· 改用object列表 → expected str, got type
· 改参数数量 → 参数数量错误
· 改传数据包 → 还是参数错误
· 动态反射创建 → 安全策略拦截__import__
根本原因
金蝶移动端Python环境无法正确调用ConvertServiceHelper.Push执行下推
原因:
1. PushArgs依赖ListSelectedRow[]等复杂类型,Python侧构造不出下推引擎能识别的对象图
2. IronPython 2.7.x对某些.NET复杂API存在底层限制
3. 官方知识库移动端下推示例全部是C#,没有Python版本的成功案例
转机:改用C#
C#版本移除了所有Python环境限制,ListSelectedRow,PushArgs,ConvertServiceHelper.Push全部正常工作。
部署步骤:编译生成DLL → 复制到金蝶服务器WebSite\bin目录 → BOS设计器注册插件
第一次测试报“申请人”等字段必填——这说明C#插件已成功执行下推,只是转换规则字段映射需要补充。完善映射后功能完全正常。
经验总结
场景 建议
快速原型验证 ✅ Python
移动端下推 ❌ Python,✅ C#
服务端接口调用 ❌ Python,✅ C#
执行计划任务 ❌ Python,✅ C#
Python能覆盖90%的场景,但剩下10%恰恰是关键场景。
如果一开始就判断业务逻辑涉及下推这类复杂API,建议直接上C#,省去从Python再切换的时间成本。
---
希望这篇精简版能帮到正在踩坑的你。🎯
夜雨聆风