TaxAgent系统设计文档.md 31.8 KB

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. 提高数据传输效率:批量处理和异步传输机制,提高数据处理效率
  3. 增强系统可靠性:通过异常处理和重试机制,确保数据传输的可靠性
  4. 支持多租户架构:支持多个租户同时使用系统,实现资源隔离
  5. 灵活的配置管理:通过配置化管理,适应不同客户的业务需求

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 核心流程

系统采用责任链模式处理业务流程:

  1. 初始化处理 (InitializeProcessor): 解析原始消息,构建标准文档对象
  2. 映射转换 (MappingProcessor): 将文档对象转换为映射对象
  3. 代理发送 (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接收来自业务系统的消息,处理流程如下:

  1. 消息接收:TaxReceiver.receiveMessage()方法接收来自RabbitMQ的消息
  2. 消息预处理:TaxReceiveService.messagePreHandle()方法对消息进行预处理,包括:
    • 验证租户信息
    • 验证系统类型与文档类型的匹配性
    • 获取租户账套配置
  3. 责任链处理:调用processorChainMap.get(SystemType).startProcess()启动处理链,依次执行:
    • InitializeProcessor(初始化处理)
    • MappingProcessor(映射转换)
    • ProxyProcessor(代理发送)
  4. 结果记录: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系统中非常重要的组件,通过注解方式实现对象间的自动转换。系统支持三种配置方式:

  1. 固定值配置:直接使用预设的固定值
  2. 动态映射:通过键值对映射实现值的转换
  3. 远程调用:通过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处理流程:

  1. 从DocumentContext.CONTEXT根据documentTypeEnum获取对应的Builder
  2. 调用builder.build()方法构建文档对象
  3. 将文档对象设置到MessageContext中

Builder处理逻辑:

  1. 解析msgBody中的JSON数据构建具体文档对象
  2. 如果存在对应的配置,则应用默认配置(固定值、动态映射或远程调用)
  3. 查询数据库中是否已存在映射记录,如果存在则设置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处理流程:

  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用于指定查询返回的字段
// MappingProcessor处理流程
1. MappingContext.CONTEXT根据documentTypeEnum获取对应的Transformer
2. 调用transformer.transform()方法转换文档对象
3. 将映射对象设置到MessageContext
4. 将映射对象转换为Map格式用于日志输出

// Transformer处理逻辑
1. 使用MappingUtils.convertValueBaseDocument转换为BaseMapping
2. 设置verifyInformationreturnKeys用于后续的重复性校验和查询
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处理流程:

  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
// 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. 处理返回结果,提取thirdPartyIdthirdPartyCode

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 核心功能

  1. 租户管理:创建、更新、查询租户信息
  2. 账套管理:创建、更新、启用/禁用账套
  3. 配置管理:管理账套的各项配置参数,支持固定值、动态映射和远程调用三种配置方式
  4. 映射管理:维护系统间数据的映射关系
  5. 错误管理:记录和查询处理失败的数据
  6. 动态表管理:为每个租户创建独立的映射数据表
  7. 验证管理:配置用于数据重复性校验的字段和返回字段
  8. 业务配置管理:管理账套支持的业务类型及其配置

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 数据发送流程

  1. 根据DocumentType获取对应的Sender
  2. 构造金蝶系统所需的映射对象
  3. 处理特殊字段(如联系人信息)
  4. 调用KingDeeHelper发送数据
  5. 处理返回结果

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 字段配置

系统支持三种字段配置方式:

  1. 固定值配置:通过TaxPipelineFixedConfig实体管理,直接使用预设的固定值
  2. 动态映射:通过TaxPipelineDynamicConfig实体管理,通过键值对映射实现值的转换
  3. 远程调用:通过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实现可视化监控
  • 增加更详细的业务指标监控
  • 实现自动告警机制