TaxAgent 系统设计文档
版本信息
| 版本 | 修订日期 | 作者 | 说明 |
|---|---|---|---|
| 1.0 | 2025-11-11 | AI助手 | 基于项目代码分析生成的完整设计文档 |
| 1.1 | 2025-11-12 | AI助手 | 根据最新代码更新文档内容 |
| 1.2 | 2025-11-14 | AI助手 | 根据最新代码更新文档内容,增加业务配置管理功能 |
1. 系统概述
TaxAgent 是一个税务代理系统,用于处理不同业务系统与财务系统(如金蝶K3 Cloud)之间的数据传输和转换。系统采用模块化设计,通过责任链模式处理业务流程,支持多租户、多账套的配置管理。
系统主要处理四种业务单据类型:
- 客户信息 (BD_Customer)
- 收款单 (AR_RECEIVE_BILL)
- 应收单 (AR_RECEIVABLE)
- 退款单 (AR_REFUND_BILL)
1.1 设计目标
TaxAgent系统旨在提供一个统一的平台,实现业务系统与财务系统之间的数据自动同步。系统通过以下方式实现设计目标:
- 解耦业务系统与财务系统:通过中间件方式,降低业务系统与财务系统之间的耦合度
- 提高数据传输效率:批量处理和异步传输机制,提高数据处理效率
- 增强系统可靠性:通过异常处理和重试机制,确保数据传输的可靠性
- 支持多租户架构:支持多个租户同时使用系统,实现资源隔离
- 灵活的配置管理:通过配置化管理,适应不同客户的业务需求
1.2 系统架构
系统采用模块化架构设计,主要包含以下模块:
- tax-boot: 系统启动模块,负责整合其他模块并启动Spring Boot应用
- tax-central: 核心模块,包含基础类、接口定义、工具类等
- tax-doc: 文档处理模块,负责将原始数据转换为标准文档对象
- tax-map: 映射转换模块,将文档对象转换为财务系统所需的映射对象
- tax-proxy: 代理发送模块,负责与外部财务系统通信
- tax-storage: 存储模块,负责数据持久化和配置管理
1.3 技术栈
TaxAgent系统采用现代化的技术栈构建:
- 核心框架:Spring Boot 3.x、Spring Cloud
- ORM框架:MyBatis-Plus
- 消息队列:RabbitMQ
- 配置中心:Nacos
- 数据库:MySQL 8.x
- 连接池:HikariCP
- JSON处理:Jackson
- 日志框架:Logback
- 构建工具:Maven
1.4 核心流程
系统采用责任链模式处理业务流程:
- 初始化处理 (InitializeProcessor): 解析原始消息,构建标准文档对象
- 映射转换 (MappingProcessor): 将文档对象转换为映射对象
- 代理发送 (ProxyProcessor): 发送映射对象到目标系统
整个处理流程中,系统会进行数据映射记录和错误处理:
- 成功处理的数据会被记录到 tax_pipeline_mapping 表中
- 处理失败的数据会被记录到 tax_mapping_error 表中
1.5 核心概念
在深入了解系统设计之前,需要理解以下核心概念:
- 租户(Tenant):系统中的独立客户或组织单位,具有独立的配置和数据空间
- 账套(Pipeline):财务系统中的独立核算单位,对应财务系统中的具体账套
- 文档(Document):业务系统中的原始业务数据,如客户信息、应收单等
- 映射(Mapping):将文档对象转换为财务系统所需的格式
- 代理(Proxy):负责与外部财务系统通信的组件
2. 模块详细设计
2.1 tax-boot 模块
2.1.1 功能说明
系统启动模块,整合所有组件并提供消息接收处理能力。该模块是整个系统的入口点,负责初始化Spring Boot应用并配置核心组件。
2.1.2 核心组件
- TaxApplication: Spring Boot启动类,配置ProcessorChain
- TaxAutoPush: RabbitMQ队列配置
- TaxReceiver: RabbitMQ消息接收器,处理外部传入的消息
- TaxReceiveService: 消息处理服务,负责消息预处理和结果记录
2.1.3 消息处理流程
TaxAgent系统通过RabbitMQ接收来自业务系统的消息,处理流程如下:
- 消息接收:TaxReceiver.receiveMessage()方法接收来自RabbitMQ的消息
-
消息预处理:TaxReceiveService.messagePreHandle()方法对消息进行预处理,包括:
- 验证租户信息
- 验证系统类型与文档类型的匹配性
- 获取租户账套配置
-
责任链处理:调用processorChainMap.get(SystemType).startProcess()启动处理链,依次执行:
- InitializeProcessor(初始化处理)
- MappingProcessor(映射转换)
- ProxyProcessor(代理发送)
- 结果记录:TaxReceiveService.recordMapping()方法记录处理结果到数据库
// 消息接收处理流程
1. TaxReceiver.receiveMessage() 接收消息
2. TaxReceiveService.messagePreHandle() 预处理消息
3. 调用 processorChainMap.get(SystemType).startProcess() 启动处理链
4. 依次执行 InitializeProcessor -> MappingProcessor -> ProxyProcessor
5. TaxReceiveService.recordMapping() 处理结果记录到数据库
// 异常处理流程
1. 消息处理过程中出现异常会被捕获
2. 系统会记录错误信息到 tax_mapping_error 表
3. 即使出现异常,消息也会被确认消费(手动ACK)以避免重复处理
2.2 tax-central 模块
2.2.1 功能说明
核心模块,包含系统的基础类定义、枚举类型、异常处理、工具类等。该模块是整个系统的基础,为其他模块提供公共的类和接口定义。
2.2.2 核心类设计
2.2.2.1 基础领域对象
- BaseDocument: 所有文档对象的基类,包含业务系统传入的原始数据
- BaseMapping: 所有映射对象的基类,包含 verifyInformation 和 returnKeys 字段用于验证和查询
- BaseProxy: 所有代理对象的基类,包含发送到财务系统的响应数据
- MessageContext: 消息上下文,贯穿整个处理流程,包含处理过程中的所有数据
2.2.2.2 枚举类型
- SystemType: 系统类型枚举(如金蝶K3 Cloud),定义了系统支持的文档类型
- DocumentType: 文档类型枚举(客户信息、应收单、退款单等)
- StatusType: 处理状态枚举
- ProcessType: 流程类型枚举
- MappingStateType: 映射状态类型枚举(已同步、同步失败、同步重试)
- AuditType: 审核类型枚举
- SettingFieldType: 配置字段类型枚举(固定值、动态映射、远程调用)
- FieldType: 字段类型枚举,定义了各种业务字段
2.2.2.3 处理器接口
- Processor: 处理器接口,定义处理方法
- AbstractProcessor: 抽象处理器实现,提供通用处理逻辑
- ProcessorChain: 处理器链,实现责任链模式,按顺序执行各个处理器
2.2.2.4 转换器
- IConverter: 字段转换器接口,用于简单字段的转换
- ISubConverter: 子对象转换器接口,用于复杂对象列表的转换
- @Converter: 字段转换注解,用于标注需要转换的字段
- @SubConverter: 子对象转换注解,用于标注需要转换的复杂对象列表
转换器是TaxAgent系统中非常重要的组件,通过注解方式实现对象间的自动转换。系统支持三种配置方式:
- 固定值配置:直接使用预设的固定值
- 动态映射:通过键值对映射实现值的转换
- 远程调用:通过HTTP调用外部服务获取值
2.2.3 上下文管理
- TenantStorageContext: 租户存储上下文,管理租户配置信息,在系统启动时加载所有启用的账套配置
- ConnectionContext: 连接上下文,管理不同系统的连接信息,如金蝶系统的连接参数
- ConverterContext: 转换器上下文,管理所有字段转换器实例
- DocumentContext: 文档上下文,管理所有文档构建器
- MappingContext: 映射上下文,管理所有映射转换器
- ProxyContext: 代理上下文,管理所有数据发送器
2.3 tax-doc 模块
2.3.1 功能说明
文档处理模块,负责将原始JSON消息转换为标准文档对象。该模块是处理流程的第一步,将业务系统传入的JSON数据转换为系统内部使用的标准Java对象。
2.3.2 核心组件
- InitializeProcessor: 初始化处理器,处理流程的第一步,继承自AbstractProcessor,@Order(1)
- DocumentContext: 文档上下文,管理所有文档构建器,在系统启动时初始化
-
Builder: 文档构建器抽象类,定义构建文档对象的接口
- CustomerBuilder: 客户信息构建器,处理客户信息文档
- ReceiptBuilder: 收款单构建器,处理收款单文档
- ReceivableBuilder: 应收单构建器,处理应收单文档
- RefundBuilder: 退款单构建器,处理退款单文档
2.3.3 处理流程
InitializeProcessor处理流程:
- 从DocumentContext.CONTEXT根据documentTypeEnum获取对应的Builder
- 调用builder.build()方法构建文档对象
- 将文档对象设置到MessageContext中
Builder处理逻辑:
- 解析msgBody中的JSON数据构建具体文档对象
- 如果存在对应的配置,则应用默认配置(固定值、动态映射或远程调用)
- 查询数据库中是否已存在映射记录,如果存在则设置customerId等字段
// InitializeProcessor处理流程
1. 从DocumentContext.CONTEXT根据documentTypeEnum获取对应的Builder
2. 调用builder.build()方法构建文档对象
3. 将文档对象设置到MessageContext中
// Builder处理逻辑
1. 解析msgBody中的JSON数据构建具体文档对象
2. 如果存在对应的配置,则应用默认配置
3. 查询数据库中是否已存在映射记录,如果存在则设置customerId等字段
2.4 tax-map 模块
2.4.1 功能说明
映射转换模块,将文档对象转换为财务系统所需的映射对象。该模块是处理流程的第二步,负责将内部标准文档对象转换为财务系统(如金蝶K3 Cloud)所需的格式。
2.4.2 核心组件
- MappingProcessor: 映射处理器,处理流程的第二步,继承自AbstractProcessor,@Order(2)
- MappingContext: 映射上下文,管理所有转换器,在系统启动时初始化
-
Transformer: 映射转换器抽象类,定义文档对象到映射对象的转换接口
- CustomerTransformer: 客户信息转换器,处理客户信息文档到映射的转换
- ReceiptTransformer: 收款单转换器,处理收款单文档到映射的转换
- ReceivableTransformer: 应收单转换器,处理应收单文档到映射的转换
- RefundTransformer: 退款单转换器,处理退款单文档到映射的转换
2.4.3 处理流程
MappingProcessor处理流程:
- 从MappingContext.CONTEXT根据documentTypeEnum获取对应的Transformer
- 调用transformer.transform()方法转换文档对象
- 将映射对象设置到MessageContext中
- 将映射对象转换为Map格式用于日志输出
Transformer处理逻辑:
- 使用MappingUtils.convertValue将BaseDocument转换为BaseMapping
- 设置verifyInformation和returnKeys用于后续的重复性校验和查询
- verifyInformation用于在发送前验证数据是否已存在,避免重复发送
- returnKeys用于指定查询返回的字段
// MappingProcessor处理流程
1. 从MappingContext.CONTEXT根据documentTypeEnum获取对应的Transformer
2. 调用transformer.transform()方法转换文档对象
3. 将映射对象设置到MessageContext中
4. 将映射对象转换为Map格式用于日志输出
// Transformer处理逻辑
1. 使用MappingUtils.convertValue将BaseDocument转换为BaseMapping
2. 设置verifyInformation和returnKeys用于后续的重复性校验和查询
3. verifyInformation用于在发送前验证数据是否已存在,避免重复发送
4. returnKeys用于指定查询返回的字段
2.5 tax-proxy 模块
2.5.1 功能说明
代理发送模块,负责与外部财务系统通信,发送处理后的数据。该模块是处理流程的第三步,也是最后一步,负责将映射对象发送到目标财务系统(如金蝶K3 Cloud)。
2.5.2 核心组件
- ProxyProcessor: 代理处理器,处理流程的第三步,继承自AbstractProcessor,@Order(3)
- ProxyContext: 代理上下文,管理所有发送器,在系统启动时初始化
-
Sender: 数据发送器抽象类,定义映射对象到代理对象的发送接口
- CustomerSender: 客户信息发送器,处理客户信息映射到代理的发送
- ReceiptSender: 收款单发送器,处理收款单映射到代理的发送
- ReceivableSender: 应收单发送器,处理应收单映射到代理的发送
- RefundSender: 退款单发送器,处理退款单映射到代理的发送
- KingDeeHelper: 金蝶系统API调用助手类,封装与金蝶系统的API交互
2.5.3 处理流程
ProxyProcessor处理流程:
- 从ConnectionContext.CONNECTION_MAP根据systemTypeEnum获取对应的AbstractConnectionManager
- 通过AbstractConnectionManager获取系统连接信息(如金蝶系统的认证信息)
- 从ProxyContext.CONTEXT根据documentTypeEnum获取对应的Sender
- 调用sender.send()方法发送数据到目标系统
- 将返回的代理对象设置到MessageContext中
Sender处理逻辑:
- 首先通过querySend查询是否已存在相同数据,避免重复发送
- 调用KingDeeHelper.auditSend方法发送数据到金蝶系统
- 处理返回结果,提取thirdPartyId和thirdPartyCode
// ProxyProcessor处理流程
1. 从ConnectionContext.CONNECTION_MAP根据systemTypeEnum获取对应的AbstractConnectionManager
2. 通过AbstractConnectionManager获取系统连接信息(如金蝶系统的认证信息)
3. 从ProxyContext.CONTEXT根据documentTypeEnum获取对应的Sender
4. 调用sender.send()方法发送数据到目标系统
5. 将返回的代理对象设置到MessageContext中
// Sender处理逻辑
1. 首先通过querySend查询是否已存在相同数据,避免重复发送
2. 调用KingDeeHelper.auditSend方法发送数据到金蝶系统
3. 处理返回结果,提取thirdPartyId和thirdPartyCode
2.6 tax-storage 模块
2.6.1 功能说明
存储模块,负责数据持久化和配置管理。该模块基于MyBatis-Plus实现数据访问,提供租户、账套、配置和映射数据的存储功能。
2.6.2 核心实体
- TaxTenant: 租户信息,包含租户的基本信息(名称、组、实体等)
- TaxPipeline: 账套信息,包含账套的基本信息和连接参数
- TaxPipelineFieldType: 账套字段配置信息,定义账套中各字段的配置类型
- TaxPipelineFixedConfig: 账套固定值配置,存储字段的固定值配置
- TaxPipelineDynamicConfig: 账套动态映射配置,存储字段的动态映射关系
- TaxPipelineRemoteConfig: 账套远程调用配置,存储字段的远程调用参数
- TaxPipelineMapping: 账套映射信息,记录已处理的业务数据映射关系
- TaxMappingError: 映射错误信息,记录处理失败的业务数据
- TaxPipelineFieldVerify: 字段验证配置,用于配置哪些字段用于重复性校验
- TaxPipelineFieldVerifyReturn: 返回字段配置,用于配置查询时返回的字段
- TaxPipelineBusiness: 账套业务信息,用于配置账套支持的业务类型
- TaxPipelineBusinessConfig: 账套业务配置,用于配置业务支持的文档类型
- TaxPipelineBusinessExt: 账套业务扩展信息,用于配置业务的扩展字段
- TaxPipelineBusinessExtData: 账套业务扩展数据,用于配置业务扩展字段的默认值
2.6.3 核心服务
- TaxTenantService: 租户服务,提供租户的增删改查功能
- TaxPipelineService: 账套服务,提供账套的增删改查功能
- TaxPipelineFieldConfigService: 账套字段配置服务,提供字段配置的增删改查功能
- TaxPipelineMappingService: 账套映射服务,提供映射数据的增删改查功能
- TaxMappingErrorService: 映射错误服务,提供错误记录的存储功能
- DynamicTaxPipelineMappingService: 动态账套映射服务,提供动态表操作功能
- TaxPipelineFieldVerifyService: 字段验证服务,提供验证字段配置的增删改查功能
- TaxPipelineBusinessConfigService: 业务配置服务,提供业务配置的增删改查功能
2.6.4 核心功能
- 租户管理:创建、更新、查询租户信息
- 账套管理:创建、更新、启用/禁用账套
- 配置管理:管理账套的各项配置参数,支持固定值、动态映射和远程调用三种配置方式
- 映射管理:维护系统间数据的映射关系
- 错误管理:记录和查询处理失败的数据
- 动态表管理:为每个租户创建独立的映射数据表
- 验证管理:配置用于数据重复性校验的字段和返回字段
- 业务配置管理:管理账套支持的业务类型及其配置
3. 数据模型设计
3.1 核心实体关系图
erDiagram
TaxTenant ||--o{ TaxPipeline : has
TaxPipeline ||--o{ TaxPipelineFieldType : has
TaxPipelineFieldType ||--o{ TaxPipelineFixedConfig : has
TaxPipelineFieldType ||--o{ TaxPipelineDynamicConfig : has
TaxPipelineFieldType ||--o{ TaxPipelineRemoteConfig : has
TaxPipeline ||--o{ TaxPipelineFieldVerify : has
TaxPipeline ||--o{ TaxPipelineFieldVerifyReturn : has
TaxPipeline ||--o{ TaxPipelineBusiness : has
TaxPipelineBusiness ||--o{ TaxPipelineBusinessConfig : has
TaxPipelineBusiness ||--o{ TaxPipelineBusinessExt : has
TaxPipelineBusinessExt ||--o{ TaxPipelineBusinessExtData : has
TaxTenant ||--o{ TaxPipelineMapping : has
TaxTenant ||--o{ TaxMappingError : has
TaxTenant {
bigint id PK
varchar name
varchar group
varchar entity
int state
datetime created_time
datetime modified_time
}
TaxPipeline {
bigint id PK
bigint tenant_id FK
varchar system_code
varchar name
varchar code
json params
int state
datetime created_time
datetime modified_time
}
TaxPipelineFieldType {
bigint id PK
bigint pipeline_id FK
varchar document_type
varchar config_key
int setting_field_type
datetime created_time
datetime modified_time
}
TaxPipelineFixedConfig {
bigint id PK
bigint pipeline_field_type_id FK
varchar config_value
datetime created_time
datetime modified_time
}
TaxPipelineDynamicConfig {
bigint id PK
bigint pipeline_field_type_id FK
varchar config_value
varchar config_map_value
datetime created_time
datetime modified_time
}
TaxPipelineRemoteConfig {
bigint id PK
bigint pipeline_field_type_id FK
varchar fixed_params
varchar field
varchar remote_address
varchar data_path
datetime created_time
datetime modified_time
}
TaxPipelineFieldVerify {
bigint id PK
bigint pipeline_id FK
varchar document_type
varchar config_verify_field
datetime created_time
datetime modified_time
}
TaxPipelineFieldVerifyReturn {
bigint id PK
bigint pipeline_id FK
varchar document_type
varchar config_return_field
datetime created_time
datetime modified_time
}
TaxPipelineBusiness {
bigint id PK
bigint pipeline_id FK
varchar business_code
varchar business_name
datetime created_time
datetime modified_time
}
TaxPipelineBusinessConfig {
bigint id PK
bigint tax_pipeline_business_id FK
varchar document_type
datetime created_time
datetime modified_time
}
TaxPipelineBusinessExt {
bigint id PK
bigint tax_pipeline_business_id FK
varchar ext_name
varchar ext_code
varchar ext_default_data
datetime created_time
datetime modified_time
}
TaxPipelineBusinessExtData {
bigint id PK
bigint tax_pipeline_business_ext_id FK
varchar ext_data
datetime created_time
datetime modified_time
}
TaxPipelineMapping {
bigint id PK
bigint tenant_id FK
bigint pipeline_id FK
varchar document_type
varchar system_data_id
varchar pipeline_data_id
json origin_data
int state
datetime created_time
datetime modified_time
}
TaxMappingError {
bigint id PK
varchar group
varchar entity
varchar pipeline_code
varchar document_type
varchar system_type
varchar system_data_id
json origin_data
int state
varchar error_message
datetime created_time
datetime modified_time
}
3.2 业务文档模型
TaxAgent系统支持四种主要的业务文档类型,每种类型都有对应的文档类、映射类和代理类。
3.2.1 客户信息 (StandardCustomer)
继承关系:BaseCustomer -> BaseDocument
主要字段:
- systemDataId: 系统数据ID
- customerId: 客户ID
- customerCode: 客户编码
- customerName: 客户名称
- customerShortName: 客户简称
- customerInvoiceTitle: 客户发票抬头
- legalPerson: 法人姓名
- idNumber: 证件号
- country: 国家
- provincial: 区域组织
- address: 地址
- registerAddress: 注册地址
- customerGroup: 客户分组
- customerCreateOrg: 创建组织
- customerUseOrg: 使用组织
- contacts: 联系人列表
3.2.2 收款单 (ReceiptBill)
继承关系:BaseBill -> BaseDocument
主要字段:
- createTime: 创建时间
- businessType: 业务类型
- settleOrg: 结算组织
- saleOrg: 销售组织
- saleDept: 销售部门
- payOrg: 支付组织
- currency: 货币
- remark: 备注
- businessCardNumber: 业务卡号
- settleCurrency: 结算货币
- contactType: 往来单位类型
- contact: 往来单位
- payContactType: 付款单位类型
- payContact: 付款单位
- receiptItems: 收款项目列表
3.2.3 应收单 (ReceivableBill)
继承关系:BaseBill -> BaseDocument
主要字段:
- createTime: 创建时间
- businessType: 业务类型
- settleOrg: 结算组织
- saleOrg: 销售组织
- saleDept: 销售部门
- payOrg: 支付组织
- currency: 货币
- settleMethod: 结算方法
- remark: 备注
- businessCardNumber: 业务卡号
- customer: 客户
- receiver: 收货方
- orderer: 订货方
- payer: 付款人
- settleName: 结算人名称
- standardCurrency: 标准货币
- receivableItems: 应收项目列表
3.2.4 退款单 (RefundBill)
继承关系:BaseBill -> BaseDocument
主要字段:
- createTime: 创建时间
- businessType: 业务类型
- settleOrg: 结算组织
- saleOrg: 销售组织
- saleDept: 销售部门
- payOrg: 支付组织
- currency: 货币
- remark: 备注
- businessCardNumber: 业务卡号
- settleCurrency: 结算货币
- receiveContactType: 收款单位类型
- receiveContact: 收款单位
- contactType: 往来单位类型
- contact: 往来单位
- refundItems: 退款项目列表
4. 系统集成设计
4.1 与金蝶K3 Cloud集成
4.1.1 连接管理
通过KingDeeConnectionManager管理金蝶系统的连接信息,连接参数存储在TaxPipeline的params字段中。系统使用金蝶官方提供的K3CloudApi SDK与金蝶K3 Cloud系统进行交互。
4.1.2 API调用
使用KingDeeHelper工具类封装与金蝶系统的API交互:
- nonAuditSend: 无需审核的保存操作,适用于客户联系人等基础信息
- auditSend: 需要审核的保存操作,适用于业务单据
- unAuditSend: 反审核操作,用于更新已审核的单据
- querySend: 查询操作,用于验证数据是否已存在
API调用异常处理:
- 所有金蝶系统API调用异常都会被封装为TaxAgentServiceException抛出
- 异常信息会被记录到日志中
- 根据异常类型返回相应的错误码给调用方
4.1.3 数据发送流程
- 根据DocumentType获取对应的Sender
- 构造金蝶系统所需的映射对象
- 处理特殊字段(如联系人信息)
- 调用KingDeeHelper发送数据
- 处理返回结果
4.1.4 重复数据处理
系统通过verifyInformation和returnKeys字段实现重复数据检测:
- verifyInformation: 包含用于验证数据是否已存在的查询条件
- returnKeys: 指定查询返回的字段
在发送数据前,系统会先调用querySend方法检查数据是否已存在,避免重复发送。
4.2 消息队列集成
系统通过RabbitMQ接收外部消息:
- 队列名称: tax-agent.queue
- 交换机: tax-agent.exchange
- 路由键: tax-agent.routing.process
消息格式为JSON字符串,包含以下字段:
- pipelineCode: 账套编码
- group: 租户组
- entity: 租户实体
- msgBody: 消息体(业务数据)
- systemType: 系统类型
- documentType: 文档类型
- systemDataId: 系统数据ID,用于唯一标识业务数据
系统采用手动ACK机制确保消息的可靠处理,即使在处理过程中发生异常,也会确认消息以避免重复处理。
5. 配置管理
TaxAgent系统提供灵活的配置管理功能,支持多种配置方式。
5.1 租户配置
通过TaxTenant实体管理租户信息,包含group和entity两个维度。租户是系统中的独立客户或组织单位,具有独立的配置和数据空间。
5.2 账套配置
通过TaxPipeline实体管理账套信息,关联具体的系统类型和连接参数。账套是财务系统中的独立核算单位,对应财务系统中的具体账套。
5.3 字段配置
系统支持三种字段配置方式:
- 固定值配置:通过TaxPipelineFixedConfig实体管理,直接使用预设的固定值
- 动态映射:通过TaxPipelineDynamicConfig实体管理,通过键值对映射实现值的转换
- 远程调用:通过TaxPipelineRemoteConfig实体管理,通过HTTP调用外部服务获取值
配置按文档类型进行分类管理,通过TaxPipelineFieldType实体关联具体的配置类型。
5.4 数据映射配置
通过TaxPipelineMapping实体管理不同系统间数据的映射关系,记录已处理的业务数据。
5.5 验证字段配置
通过TaxPipelineFieldVerify和TaxPipelineFieldVerifyReturn实体管理验证字段配置:
- TaxPipelineFieldVerify: 配置用于验证数据是否已存在的字段
- TaxPipelineFieldVerifyReturn: 配置查询时返回的字段
5.6 业务配置管理
通过TaxPipelineBusiness、TaxPipelineBusinessConfig和TaxPipelineBusinessExt实体管理业务配置:
- TaxPipelineBusiness: 配置账套支持的业务类型
- TaxPipelineBusinessConfig: 配置业务支持的文档类型
- TaxPipelineBusinessExt: 配置业务的扩展字段及默认值
6. 异常处理机制
6.1 异常类型
- TaxAgentServiceException: 系统业务异常,继承自RuntimeException
- 全局异常处理器: GlobalExceptionHandler统一处理系统异常,提供统一的异常响应格式
6.2 异常码定义 (TaxSystemType)
- UNKNOWN_ERROR: 未知错误
- MISSING_BUSINESS_INFORMATION: 缺少业务信息
- BUSINESS_MATCHES_ARE_INCORRECT: 业务匹配不正确
- NO_MATCHING_SET_OF_ACCOUNTS_FOUND: 未找到匹配的账套
- NO_TENANT_INFORMATION_FOUND: 未找到租户信息
- REMOTE_SERVICE_CALLS_ARE_EXCEPTIONAL: 远程服务调用异常
- REPEAT_SENDING: 重复发送
- INCORRECT_BUSINESS_PROCESSES: 业务流程不正确
- ABNORMAL_PARAMETERS: 参数异常
- INVALID_HTTP_REQUEST_PARAMS: HTTP请求参数无效
系统通过GlobalExceptionHandler统一处理各类异常,确保向客户端返回一致的错误格式。
7. 系统扩展性设计
TaxAgent系统设计时充分考虑了扩展性,支持多种方式的扩展。
7.1 多系统支持
通过SystemType枚举和对应的ConnectionManager实现支持不同财务系统。目前系统已实现对金蝶K3 Cloud的支持,可以通过扩展AbstractConnectionManager来支持其他财务系统。
7.2 多文档类型支持
通过DocumentType枚举和对应的Builder、Transformer、Sender实现支持不同文档类型。系统目前已支持客户信息、应收单、收款单和退款单四种文档类型,可以通过实现相应的抽象类来扩展新的文档类型。
7.3 字段转换扩展
通过Converter和SubConverter机制支持灵活的字段转换配置。系统提供了IConverter和ISubConverter接口,可以通过实现这些接口来支持自定义的字段转换逻辑。
7.4 处理器链扩展
通过ProcessorChain实现责任链模式,可以方便地添加新的处理步骤到处理流程中。
8. 性能优化考虑
8.1 缓存机制
- 使用ConcurrentHashMap缓存租户配置信息,在系统启动时加载所有启用的账套配置
- 使用ConcurrentHashMap缓存各类处理器、转换器和发送器
- 通过RestoreTenantEvent事件机制实现缓存的动态刷新
8.2 连接池管理
- 使用K3CloudApi提供的连接管理机制
- 数据库连接使用HikariCP连接池
8.3 异步处理
- 消息处理采用手动ACK机制
- 异常处理独立进行,不影响消息队列的正常消费
- 数据库操作使用事务管理确保数据一致性
8.4 数据库优化
- 为TaxPipelineMapping表设计了租户独立的表结构,提高查询性能
- 为常用查询字段添加了索引
9. 部署架构
9.1 依赖组件
- MySQL: 数据存储
- RabbitMQ: 消息队列
- Nacos: 配置中心和服务发现
9.2 部署配置
- application.properties: 应用配置
- logback-spring.xml: 日志配置
9.3 部署方式
系统采用Spring Boot应用方式部署,可以通过以下方式启动:
# 使用Maven插件启动
./mvnw spring-boot:run
# 构建jar包并运行
./mvnw clean package
java -jar tax-boot/target/tax-boot.jar
10. 安全设计
10.1 数据安全
- 敏感信息(如数据库密码)进行编码存储
- 通过Nacos配置中心管理敏感配置
- 数据库访问使用参数化查询防止SQL注入
10.2 通信安全
- 与金蝶系统通信采用HTTPS协议
- 数据传输采用JSON格式
- 消息队列使用认证机制确保消息安全
10.3 应用安全
- 使用Spring Security框架提供认证和授权功能
- 对外暴露的REST API使用JWT进行认证
- 敏感操作进行权限验证
11. 监控和日志
11.1 日志管理
- 使用Logback作为日志框架
- 支持控制台和文件双输出
- 按时间和大小滚动日志文件
- 支持不同环境(dev、test、pre、prod)的日志级别配置
- 对数据库操作有专门的DEBUG级别日志配置
- 重要业务操作有详细日志记录
11.2 监控指标
- 消息处理成功/失败统计
- 系统响应时间监控
- 异常信息记录和报警
- API调用成功率统计
- 数据库操作性能监控
11.3 健康检查
- 提供应用健康检查接口
- 数据库连接状态监控
- 消息队列连接状态监控
- 外部服务可用性检查
12. 测试策略
12.1 单元测试
针对各个模块的核心功能编写单元测试,使用JUnit 5作为测试框架。
12.2 集成测试
测试与外部系统的集成,包括金蝶K3 Cloud和RabbitMQ。
12.3 性能测试
测试系统在高并发情况下的处理能力。
12.4 测试环境
- 开发环境(dev):用于功能开发和调试
- 测试环境(test):用于功能测试和集成测试
- 预生产环境(pre):用于性能测试和用户验收测试
- 生产环境(prod):正式运行环境
13. 未来规划
13.1 功能扩展
- 支持更多财务系统(如用友、SAP等)
- 增加更多的业务文档类型
- 提供更丰富的配置管理功能
- 增加业务配置管理API,支持远程获取业务配置信息
13.2 性能优化
- 引入缓存机制(如Redis)提升查询性能
- 实现消息的批量处理提升吞吐量
- 优化数据库索引和查询语句
13.3 监控完善
- 集成Prometheus和Grafana实现可视化监控
- 增加更详细的业务指标监控
- 实现自动告警机制