# VoucherRule **Repository Path**: what_is_that/VoucherRule ## Basic Information - **Project Name**: VoucherRule - **Description**: 用DSL规则实现生成会计凭证 - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 4 - **Created**: 2016-11-19 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 会计凭证规则处理库 ## 1. Required * JDK 1.5 * Maven 3.0.0+ * JSR223 * Groovy 2.0.0+ ## 2. 介绍 根据规则脚本文件(使用`Groovy`脚本语言编写,如:[rules.groovy](./src/test/resources/rules.groovy))来生成会计凭证。 规则脚本文件可以动态添加修改,不需要重启服务(重新加载规则脚本文件即可)。 ## 3. why 在将业务数据转换成会计凭证时,往往都涉及到如何描述转换的问题,这些问题的描述从而形成转换规则。 而随着业务系统的壮大,转换规则变的复杂且繁多,并且分散在系统的各个角落里,从而造成维护上的困难。 描述转换规则的简洁性,由繁到简依次排序为:文档 < 规则记录 < 静态语言 < 动态语言 < 领域专用语言 选择`Groovy`,是因为它是兼容`Java`的,并且汲取了`ruby`和`python`等动态语言的特点。 本库则是在`Groovy`基础上构建的领域专用语言。 目的在于简化转换规则的维护。 ## 4. 安装 * 打包 ```shell // 跳过测试进行安装 mvn package -DskipTests ``` ## 5. 使用 1 添加规则文件: ```Java // 定义规则,规则实际上是一个闭包函数 def rule1 = { context, vo1, name -> // 上下文参数,应用规则时传入,数量不限。 凭证 { 制单人 name 业务日期 vo2.date 年 vo2.date[YEAR] 期间 vo2.date[MONTH] + 1 凭证字 '记' 借 { 科目编码 '102'; 科目名称 '银行科目'; 金额 context.amt; 摘要 '测试中文' 单位 { 核算编码 context.unitId 核算名称 context.unitName } 项目 { 核算编码 context.projectId 核算名称 context.projectName } } 贷 { 科目编码 '103' 科目名称 '授权额度' 金额 context.amt 关联记录 { 类名 context.getClass()?.simpleName 标识号 context.id } } } } // 定义完规则后需注册模板 TemplateManager.reg("规则1", tmpCenterPayIn) //将规则注册为“规则1” ``` 2 在程序中应用规则: ```Java // 使用“规则1”生成会计凭证集合对象,当第一个参数为`Iterable`时,会将规则应用`Iterable`的明细中 VoucherList vouchers = RuleManager.apply("规则1", list, context1, "tester"); ``` 返回的`VoucherList`对象为会计凭证对象集合(多张凭证)。如下: ``` =============== [凭证号:记1] [年度:2015] [期间:3] [业务日期:2015-03-31] [附件数:] 借: 102[银行科目]|{单位: 0011[AAA单位]}|{项目: 00110001[测试项目1]}; (¥1234567.89); (摘要: 测试中文); 借: 102[银行科目]|{单位: 0012[BBB单位]}|{项目: 00110002[测试项目2]}; (¥12345.67); (摘要: 测试中文); 借: 102[银行科目]|{单位: 0013[CCC单位]}|{项目: 00110003[测试项目3]}; (¥123.45); (摘要: 测试中文); 贷: 103[授权额度]; (¥1234567.89); (摘要:); [制单人:tester] =============== ```