如何覆盖快递100电子面单参数原创
金蝶云社区-文安根
文安根
15人赞赏了该文章 1977次浏览 未经作者许可,禁止转载编辑于2022年05月19日 09:52:16

    星空供应链领域下的销售模块集成的快递100和快递管家功能不是万能的,满足不了所有客户的需求。例如,现阶段就不满足根据登录用户配置设备码。目前最新的功能只支持按物流公司和组织机构来隔离设备码,如下图1-1配置所示:

image.png

图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所示:

image.png

图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所示的快递接口文档中找到属性名:

image.png

图1-4


    以上图相关接口字段举个例,如果我想覆盖快递100电子面单HTML接口中的物品名称,可以直接在扩展属性中输入{"cargo":"我的统一物品名称"}即可,这时在获取电子面单界面中不管输入的真实物品名称是什么,都会被'我的统一物品名称'替换掉,但这里有个限制,就是如果想覆盖寄件人姓名就不行了,因为他有两层结构sendMan.name(2022年6月之后的版本将对多层结构的扩展属性提供支持),这种方式也可以用来替换类似设备码,业务类型,模板等参数(只要这些参数是在param参数的第一层结构上都可覆盖),另外通过结合论坛地址‘https://vip.kingdee.com/article/167297791734694912’ 介绍的界面二开赋值逻辑(指的是在获取电子面单界面中选择单据后填充界面上的值时,这里可适用于快递100和快递管家接口)可以比较容易地满足客户的其它二开需求。



赞 15