本文介绍了星空供应链销售模块集成的快递功能不足,特别是无法满足按登录用户配置设备码的需求。文中提出了两种解决方案:一是通过反编译并修改程序集来实现,但此方法复杂且易出错;二是利用新版本中将公开的插件属性,通过继承并重写插件的方法来自定义设备码赋值逻辑,并介绍了如何在BOSIDE中启用自定义插件。此外,还介绍了通过电子面单扩展属性JSON值来统一覆盖快递100接口中的参数值的方法,并提供了相关接口文档链接和示例。
星空供应链领域下的销售模块集成的快递100和快递管家功能不是万能的,满足不了所有客户的需求。例如,现阶段就不满足根据登录用户配置设备码。目前最新的功能只支持按物流公司和组织机构来隔离设备码,如下图1-1配置所示:
图1-1
那如何根据登录用户配置设备码呢?这种情况可以通过反编译工具(比如dnSpy,.Net Reflector)反编译程序集'Kingdee.K3.SCM.Sal.Business.PlugIn.dll'并修改通版插件‘Kingdee.K3.SCM.Sal.Business.PlugIn.GetKuaidiBillEdit’中的方法‘CommonCheckParameter’,在方法中自行处理参数对象中的设备码赋值逻辑。但是这种处理方式比较复杂,容易出错且每次更新补丁时都会被通版覆盖。下面介绍另一种比较方便的方法:
在即将发布的版本中(注:2021.5.13号发布的版本中已经包含此功能),会修改通版中的‘获取电子面单’配置的动态表单插件‘Kingdee.K3.SCM.Sal.Business.PlugIn.GetKuaidiBillEdit’,在其中公开属性‘Kuaidi100Parameter’,此属性在通版中的逻辑是打开'获取电子面单'界面就会赋值(在AfterBindData中读取参数配置),客户可二开继承此插件,假设二开插件类名为GetKuaidiBillEditExtend,继承通版插件类后重写AfterBindData,在重写的方法中先调用通版的AfterBindData方法再自行定义逻辑,然后在BOSIDE中的‘获取电子面单’动态表单禁用通版的插件,启用二开的插件即可, 如下图1-2所示:
图1-2
上图右侧中的项目引用也需要注意下,图中的代码文本如下所示:
public override void AfterBindData(EventArgs e) { base.AfterBindData(e); //基类AfterBindData会根据快递100参数配置自动填充属性 Kuaidi100Parameter //在基类填充数据之后重新设置码 if (this.Kuaidi100Parameter != null && this.Kuaidi100Parameter.KuaidiComSettings != null) { string deviceCode = "abcd"; //假设设备码为abcd,如果要根据当前登录用户获取设备码,可使用以下属性获取登录信息并自行获取设备码信息, //this.Context.UserId; //当前登录用户 //this.Context.UserName foreach (var item in this.Kuaidi100Parameter.KuaidiComSettings) { item.DeviceCode = deviceCode; } } }
用户可根据上面的类似方法自行设置属性Kuaidi100Parameter中的其它参数值,也可直接反编译其中的类'Kingdee.K3.SCM.Core.SAL.Kuaidi100Parameter',并查看相关属性值,这些属性与快递100参数配置中的几乎是一一对应的,覆盖其中的相关值对后续快递100电子面单接口或快递管家订单导入接口都会有影响。
另外,如果是快递100电子面单接口中的参数统一值(注:不适用于快递管家接口参数,快递管家扩展属性将在后续版本的'获取电子面单'界面中提供),比如说所有的快递公司都用同一设备码,可通过如下图1-3参数配置的电子面单扩展属性JSON值来简单覆盖快递100参数配置:
图1-3
这里需要注意的是,电子面单扩展属性值只能是一个JSON格式的字符串,且只有一层属性(稍后会举例),如果要覆盖接口中的值,必须对应好接口中的属性名,可以在如下图1-4所示的快递接口文档中找到属性名:
图1-4
以上图相关接口字段举个例,如果我想覆盖快递100电子面单HTML接口中的物品名称,可以直接在扩展属性中输入{"cargo":"我的统一物品名称"}即可,这时在获取电子面单界面中不管输入的真实物品名称是什么,都会被'我的统一物品名称'替换掉,但这里有个限制,就是如果想覆盖寄件人姓名就不行了,因为他有两层结构sendMan.name(2022年6月之后的版本将对多层结构的扩展属性提供支持),这种方式也可以用来替换类似设备码,业务类型,模板等参数(只要这些参数是在param参数的第一层结构上都可覆盖),另外通过结合论坛地址‘https://vip.kingdee.com/article/167297791734694912’ 介绍的界面二开赋值逻辑(指的是在获取电子面单界面中选择单据后填充界面上的值时,这里可适用于快递100和快递管家接口)可以比较容易地满足客户的其它二开需求。
推荐阅读