自动锁库解锁服务插件干预试例原创
金蝶云社区-angen
angen
22人赞赏了该文章 1,500次浏览 未经作者许可,禁止转载编辑于2022年12月01日 17:12:08
summary-icon摘要由AI智能服务提供

本文介绍了在2023年1月补丁中,自动锁库解锁服务将增加插件干预功能,以解决原有服务不支持复杂自定义逻辑的问题。文章通过二开插件的方式,详细说明了如何扩展发货通知单并配置锁库服务,以及如何通过重写插件中的方法来实现自定义锁库排序、筛选锁库需求、解锁后执行自定义逻辑等功能。同时,提醒了二开代码中的异常处理、可重写的方法及其用途,并说明了此功能的初始版本可能存在的不足及后续优化方向。

    预计在2023年1月补丁中,对自动锁库解锁服务将提供插件干预功能,原有的服务在锁库时只支持本单据(本单据指的是自动锁库解锁服务配置于的单据上)上的操作,而解锁时可以支持本单据的某个操作解锁特定上游单据的锁库信息,当然也支持解锁本单据的锁库信息,但是有些自定义逻辑支持的不太好或者根本就不支持。由于一些限制,此服务不可能满足所有客户的要求,比如客户可能需要根据非常复杂的条件来过滤哪些单据体记录参与锁库,哪些不参与锁库(通版的锁库服务有个数据筛选条件配置,但它只支持一些简单的表达式配置),或者客户可能需要在锁库/解锁成功后调用自定义逻辑,抑或是自定义锁库排序逻辑。因此本服务添加了自定义插件干预功能,有关自动锁库解锁服务的介绍,可参阅:https://vip.kingdee.com/article/284352629646877184?productLineId=1,本文将通过二开插件自定义逻辑,简单介绍下此功能。

    1,首先扩展发货通知单,在审核操作上配置锁库服务,在自动锁库解锁服务配置界面中的插件文本框中输入:Kingdee.K3.SCM.Custom.ServicePlugin.CustomAutoLockOrUnlockStockPlugin,Kingdee.K3.SCM.Custom.ServicePlugin ,注意这里只是一个扩展的例子,客户可自行命名此类的全名,其他例子类似地配置。

image.png

图1-1


    创建自定义类CustomAutoLockOrUnlockStockPlugin,此类必须继承至AbstractAutoLockOrUnlockPlugin,重写其中的方法 SortLockSupplies,如下图1-2所示:

image.png

图1-2


    上面的二开代码例子在锁库时会对即时库存排序(参数lockSupplies会有一个默认排序,但通常他可能不符合客户的排序要求),即优先使用可用量小的即时库存锁库,如果可用量相同,则再使用有效期小的。举个例子,如果即时库存初始时有三个即时库存,且有相同的数量(假设都为5),但有效期不同,当发货通知单上的数量是4时,审核并锁库成功后,会优先使用第三行有效期小的那条即时库存,如下图1-3所示和图1-4所示:

image.png

图1-3


image.png

图1-4


    2,修改类CustomAutoLockOrUnlockStockPlugin,重写其中的 FilterLockRequirements 方法,如下图2-1所示:

image.png

图2-1


    上面的代码通过LINK表排除有销售订单下推销售订单的下游分录内码记录(通版一般是退货类型的销售订单),当在销售订单保存操作上配置类似于上图1-1所示的自定义插件时(注意这里演示的是销售订单保存操作而不是审核操作是因为审核操作会有根据单据类型参数自动审核的逻辑,而这一逻辑在自动锁库解锁服务发布之前就存在了),创建一个标准销售订单A,可以看到它可以锁库,但当标准销售订单下推一个退货方向的销售订单B时,订单B锁库不成功,查看日志可以看到有如下图2-2所示的记录:

image.png

图2-2


    3,修改类CustomAutoLockOrUnlockStockPlugin,重写其中的 AfterUnlockOperation 方法,如下图3-1所示:

image.png

图3-1


    当在发货通知单保存操作上配置了解锁上游销售订单的锁库信息时,发货通知单保存后可以看到有如下图3-2所示的日志(注意日志中有重复的上游销售订单分录内码是因为销售订单下推发货通知单时下游拆分行了):image.png

图3-2


写在最后:

    1,插件中的所有可重写的方法都是锁库或解锁的一部分,当二开重写方法代码中有异常且未处理时,整个锁库/解锁服务将回滚,因此二开代码应当尽量避免出现未捕获的异常。

    2,插件中目前只有 FilterLockRequirements, SortLockSupplies, BeforeLockOperation, BeforeUnlockOperation, AfterLockOperation, AfterUnlockOperation 这些方法可重写,通过其中的方法名可以看出它们的执行时点及要处理什么事情,在BeforeXXX和AfterXXX的方法中可以根据其中的方法参数获取到单据原始数据包(通过e.DataEntities),自动锁库解锁服务配置信息(通过e.Metadata),在AfterXXX方法中可获取到锁库或解锁的原始参数(通过 e.LockArgs 或者 e.UnlockArgs),所谓原始参数就是调用库存模块 IStockLockService接口中的SaveLockInfo 和 SaveUnLockInfo方法中的参数,详情可参阅:https://vip.kingdee.com/article/12461?productLineId=1&isKnowledge=2  。

    3,此功能是应部分客户需求添加的,初始版本可能有设计上的不足,后续可能会根据客户提单反馈进行优化设计。

    4,上文中的演示代码日志记录级别为INFO,内部使用的是log4net框架,测试时请把Web.config中的log4net日志记录级别设置成INFO以上,否则可能看不到日志。



图标赞 22
22人点赞
还没有人点赞,快来当第一个点赞的人吧!
图标打赏
0人打赏
还没有人打赏,快来当第一个打赏的人吧!