单据引擎作为云砺企业协同平台的核心功能模块,在实现票据流转、优化业务流程、提高协同效率等方面有着突出作用。云砺技术团队基于多年来积累的深刻行业Know-How以及从实际问题出发的用户思维,持续打磨云砺企业协同平台单据引擎,全力满足客户多样化的业务场景需求。
本文将深度解析云砺企业协同平台单据引擎的设计背景、功能本质与整体架构,以便您更好的了解。
01
设计背景
目前,市面上常见的单据引擎在设计和功能上普遍存在以下五大痛点:
因此,对于零售、消费等需求和业务场景较为复杂的大型企业而言,诸多业务场景需要定制开发,二开工作量大、交付周期长。为了规避上述问题,更好地满足客户业务场景需要,云砺技术团队对企业协同平台的单据引擎进行了详尽规划与设计。
02
功能本质
对于销项业务来说,单据引擎本质上是一个同构数据的处理系统,将客户ERP中的单据上传到票易通云平台,根据客户业务要求进行批量处理,生成最终结算单,同时将发票-结算单-原单进行关联;对于进项业务来说,单据引擎的主要能力是存储单据数据,由配单模块进行发票和原单的关联操作,或者满足客户单据处理操作的部分需求。
因此,解决单据引擎问题其实就是解决单据处理问题。单据(云砺技术团队创造了一个英文单词bizorder来表示,因为单据既可能是销售订单也可能是采购订单,或是其他单据)是一个典型的主从结构的数据,包含单头和明细,根据这种数据结构并且结合实际的业务场景,为了能够让单据变换可以进行自由组合和叠加操作,云砺技术团队严格定义了以下五种变换操作:
| 组合(join):两个单据之间进行合并,允许其中一单的部分明细进行合并(部分合并),也允许部分合并的时候拆分一条明细进行合并(例如顶额合并场景),join操作不合并(merge)明细。例如:A、B、C三个单据进行合并,满足合并条件的前提下,A和B先进行join操作,操作结果再和C进行join操作;
| 合并(merge):在同一个单据内,将明细进行合并的操作,不能进行跨单据的明细进行合并(如果需要不同单据的明细合并到一起,先要进行join操作,然后进行merge操作),merge操作的本质和join操作是一致的,因此在实际的代码实现中,merge操作是使用join操作的来完成的;
| 拆分(split):在同一个单据内,针对单个明细进行拆分操作,将一条明细按照规则拆分成两条或者多条明细,拆分出来的明细依然存放在当前的单据下;
| 分组(group):将一批单据按照单头和明细组成配对进行打散,再根据分组规则条件计算分组键,然后使用分组键重新将这些单头和明细归类并生成新的单据;
| 分摊(share):在同一个单据内,将符合分摊条件的一条或者多条明细计算净金额(默认是对应计价方式的金额 - 扣除额 - 价内折扣 - 价外折扣),然后按照分摊条件和方式分摊到其他明细的价内或者价外折扣上;
在云砺企业协同平台的实际业务场景中,使用得比较多的是组合、合并和分摊这类合成操作,拆分操作主要在手工拆分一些金额开票的场景中,大批量处理中很少有拆分操作,分组操作在针对个人用户的开票场景中也有使用。
03
整体架构
确定单据的基本操作之后,云砺技术团队设计了单据处理流程结构的最初框架(图1):通过Pipeline来封装整个处理过程,每个处理过程由操作符(Operator)来执行,一个管道里面可以封装无数的操作符(能够实现一次单据处理过程中叠加不同的操作),操作符通过规则和策略提供的配置信息来驱动(有利于配置化,降低二开需求)。
图1
考虑到开发的效率性和合理性,最终设计中还引入了分摊操作,由于每种操作的输入和输出不同,最终定义了以下五个基本接口(H代表单头Header,D代表明细Detail,K代表Key分组键,V代表Value值):
join和merge操作里面会出现K(分组键),是因为在很多业务场景里面join和merge操作会弱化成分组,比如按字段匹配合并的时候,使用分组效率会很高,而两两比较操作的时间复杂度很高,但是很多业务场景,比如限额组合和合并、正负组合和合并等就无法简单使用分组,所以join操作的策略定义如下:
其中filter是过滤器,keySelector是分类器,在执行完filter和keySelector(如果存在)才会执行join方法确定是否能够进行组合,具体实现将在后面的章节中专门介绍。
为了能够调试复杂的业务场景,云砺技术团队在代码层面做了一些设计,能够更好的结合业务语义来实现业务场景的测试和检查。基于这些底层设计,云砺技术团队在上层构建了规则匹配、管道组装、可组合策略、策略配置等能力,下图(图2)是生产环境最终的规则配置界面:
图2
整个配置界面基于策略的元数据进行渲染,新增策略无需前端开发,操作和策略都可以自由组合使用,没有任何限制,可以根据客户的业务场景自由进行调整和配置,没有二开工作量。
经过周密的设计、开发与配置,云砺企业协同平台单据引擎核心能力的最终实现结构如下图(图3)所示,每一块的功能设计和代码实现将在后续文章中进行详细介绍。
图3