快递100及快递管家编写并调试简单的Python插件

金蝶云星空供应链领域销售模块对接的快递100和快递管家只能满足部分客户的需求,对于一些客户的特定需求,如果不是比较通用,通版一般不会纳入后续的补丁中,客户可以参考以下快递100及快递管家二开相关的帖子:https://vip.kingdee.com/article/167297791734694912 ,https://vip.kingdee.com/article/173521351129519360 ,https://vip.kingdee.com/article/216286725399032576 ,https://vip.kingdee.com/article/223033855618894592 如果以上二开帖子的内容满足不了客户,或者客户不想写C#插件代码(C#二开插件代码有个明显的缺点,那就是必须先编写C#代码,然后编译成.dll动态链接库文件并上传到金蝶星空系统安装目录中,目录一般为X:\Program Files (x86)\Kingdee\K3Cloud\WebSite\bin,对于公有云客户来说上传比较繁琐,对于多租户来说更是不可用),亦或想通过BOSIDE扩展并输入一些简单的Python代码,则本文是一个可以参考的例子。
如标题所示,本文主要介绍编写并调试Python插件。由于本文是以调试寄宿在IIS下的星空环境为背景,因此首先要有几个前提条件,那就是本机安装了IIS,安装了金蝶云星空,安装了工作负荷包含Python开发的Visual Studio(注意这里必须是Python文件与IIS在同一机器上)。如果是寄宿在ASP.NET Development Server或IIS Express下也是可以类似地附加进程并调试,如下图1-1和图1-2所示:

图1-1

图1-2
打开Visual Studio,创建一个Python应用程序项目,在项目中添加一个Python类,文件命名为KingdeeGalaxy.py,在文件中输入以下Python代码:
import clr
clr.AddReference('System')
clr.AddReference('Newtonsoft.Json')
clr.AddReference('Kingdee.BOS.Core')
from Newtonsoft.Json.Linq import *
from Kingdee.BOS.Core import *
from System import *
def BarItemClick(e):
if e.BarItemKey.Equals("tbManualnputLogistics", StringComparison.OrdinalIgnoreCase):
this.View.ShowMessage("Python Test from KingdeeGalaxy.py File")
def DataChanged(e):
if e.Field.Key.Equals("FItems", StringComparison.OrdinalIgnoreCase):
stringifyItems = Convert.ToString(this.View.Model.GetValue("FItems", e.Row))
if(len(stringifyItems) > 0):
items = JArray.Parse(stringifyItems);
materialNames = ""
for item in items:
itemName = str(item["itemName"])
if not materialNames.__contains__(itemName):
materialNames = materialNames + " " + itemName
this.View.Model.SetValue("FComment", materialNames.strip(), e.Row)注意不要复制以上代码,因为HTML网页会转义空格,下文的Python代码类似,都不要直接复制,文章后面附件有相关代码,可直接下载附件,附件中带Convert后缀的文件也模拟了一个单据转换Python插件,有兴趣的可以看看,代码如下图1-3所示:

图1-3
打开BOS IDE,扩展'获取电子面单'动态表单,修改字段'快递管家属性&物料清单'(比较老的星空版本中的名称可能只有'物料清单',没有&前面的),勾选即时触发值更新事件,如下图2-1所示:

图2-1
然后在表单插件列表中注册Python插件(此插件只是调试用,真正做逻辑的是代码里面的KingdeeGalaxy.py 文件,调试无问题事要用KingdeeGalaxy.py文件中的内容替换),如下图2-2所示:

图2-2
Python脚本如下:
import clr
clr.AddReference('IronPython')
from IronPython.Hosting import Python
def wrap_d(f):
func_name = f.__name__
del f
def wrapper(e):
engine = Python.CreateEngine({'Debug': True})
scope = engine.CreateScope()
g = globals()
for v in ('this',):
scope.SetVariable(v, g[v])
engine.CreateScriptSourceF快递100及快递管家编写并调试简单的Python插件
声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。如若本站内容侵犯了原著者的合法权益,可联系本站删除。



