Commit 45aab328d4302a25dfb6c35017e5c612a03bfe22
1 parent
7d1419db
docs(tax-agent): 添加TaxAgent系统设计文档
- 创建完整的系统设计文档,涵盖架构、模块设计、数据模型等 - 详细描述各模块功能及核心组件,包括tax-boot、tax-central等六大模块 - 提供系统核心流程说明,如消息处理、责任链模式应用 - 定义系统核心概念,如租户、账套、文档、映射和代理 - 描述与金蝶K3 Cloud的集成方式及API调用机制 - 说明配置管理机制,支持多租户、多账套灵活配置 - 添加异常处理机制和错误码定义 - 提供部署架构、安全设计和监控日志方案 - 规划未来功能扩展方向和性能优化策略
Showing
2 changed files
with
813 additions
and
0 deletions
doc/TaxAgent系统设计文档.md
0 → 100644
| 1 | +# TaxAgent 系统设计文档 | ||
| 2 | + | ||
| 3 | +## 版本信息 | ||
| 4 | +| 版本 | 修订日期 | 作者 | 说明 | | ||
| 5 | +|------|----------|------|------| | ||
| 6 | +| 1.0 | 2025-11-11 | AI助手 | 基于项目代码分析生成的完整设计文档 | | ||
| 7 | +| 1.1 | 2025-11-12 | AI助手 | 根据最新代码更新文档内容 | | ||
| 8 | +| 1.2 | 2025-11-14 | AI助手 | 根据最新代码更新文档内容,增加业务配置管理功能 | | ||
| 9 | + | ||
| 10 | +## 1. 系统概述 | ||
| 11 | + | ||
| 12 | +TaxAgent 是一个税务代理系统,用于处理不同业务系统与财务系统(如金蝶K3 Cloud)之间的数据传输和转换。系统采用模块化设计,通过责任链模式处理业务流程,支持多租户、多账套的配置管理。 | ||
| 13 | + | ||
| 14 | +系统主要处理四种业务单据类型: | ||
| 15 | +- 客户信息 (BD_Customer) | ||
| 16 | +- 收款单 (AR_RECEIVE_BILL) | ||
| 17 | +- 应收单 (AR_RECEIVABLE) | ||
| 18 | +- 退款单 (AR_REFUND_BILL) | ||
| 19 | + | ||
| 20 | +### 1.1 设计目标 | ||
| 21 | + | ||
| 22 | +TaxAgent系统旨在提供一个统一的平台,实现业务系统与财务系统之间的数据自动同步。系统通过以下方式实现设计目标: | ||
| 23 | + | ||
| 24 | +1. **解耦业务系统与财务系统**:通过中间件方式,降低业务系统与财务系统之间的耦合度 | ||
| 25 | +2. **提高数据传输效率**:批量处理和异步传输机制,提高数据处理效率 | ||
| 26 | +3. **增强系统可靠性**:通过异常处理和重试机制,确保数据传输的可靠性 | ||
| 27 | +4. **支持多租户架构**:支持多个租户同时使用系统,实现资源隔离 | ||
| 28 | +5. **灵活的配置管理**:通过配置化管理,适应不同客户的业务需求 | ||
| 29 | + | ||
| 30 | +### 1.2 系统架构 | ||
| 31 | + | ||
| 32 | +系统采用模块化架构设计,主要包含以下模块: | ||
| 33 | + | ||
| 34 | +- **tax-boot**: 系统启动模块,负责整合其他模块并启动Spring Boot应用 | ||
| 35 | +- **tax-central**: 核心模块,包含基础类、接口定义、工具类等 | ||
| 36 | +- **tax-doc**: 文档处理模块,负责将原始数据转换为标准文档对象 | ||
| 37 | +- **tax-map**: 映射转换模块,将文档对象转换为财务系统所需的映射对象 | ||
| 38 | +- **tax-proxy**: 代理发送模块,负责与外部财务系统通信 | ||
| 39 | +- **tax-storage**: 存储模块,负责数据持久化和配置管理 | ||
| 40 | + | ||
| 41 | +### 1.3 技术栈 | ||
| 42 | + | ||
| 43 | +TaxAgent系统采用现代化的技术栈构建: | ||
| 44 | + | ||
| 45 | +- **核心框架**:Spring Boot 3.x、Spring Cloud | ||
| 46 | +- **ORM框架**:MyBatis-Plus | ||
| 47 | +- **消息队列**:RabbitMQ | ||
| 48 | +- **配置中心**:Nacos | ||
| 49 | +- **数据库**:MySQL 8.x | ||
| 50 | +- **连接池**:HikariCP | ||
| 51 | +- **JSON处理**:Jackson | ||
| 52 | +- **日志框架**:Logback | ||
| 53 | +- **构建工具**:Maven | ||
| 54 | + | ||
| 55 | +### 1.4 核心流程 | ||
| 56 | + | ||
| 57 | +系统采用责任链模式处理业务流程: | ||
| 58 | +1. **初始化处理** (InitializeProcessor): 解析原始消息,构建标准文档对象 | ||
| 59 | +2. **映射转换** (MappingProcessor): 将文档对象转换为映射对象 | ||
| 60 | +3. **代理发送** (ProxyProcessor): 发送映射对象到目标系统 | ||
| 61 | + | ||
| 62 | +整个处理流程中,系统会进行数据映射记录和错误处理: | ||
| 63 | +- 成功处理的数据会被记录到 tax_pipeline_mapping 表中 | ||
| 64 | +- 处理失败的数据会被记录到 tax_mapping_error 表中 | ||
| 65 | + | ||
| 66 | +### 1.5 核心概念 | ||
| 67 | + | ||
| 68 | +在深入了解系统设计之前,需要理解以下核心概念: | ||
| 69 | + | ||
| 70 | +- **租户(Tenant)**:系统中的独立客户或组织单位,具有独立的配置和数据空间 | ||
| 71 | +- **账套(Pipeline)**:财务系统中的独立核算单位,对应财务系统中的具体账套 | ||
| 72 | +- **文档(Document)**:业务系统中的原始业务数据,如客户信息、应收单等 | ||
| 73 | +- **映射(Mapping)**:将文档对象转换为财务系统所需的格式 | ||
| 74 | +- **代理(Proxy)**:负责与外部财务系统通信的组件 | ||
| 75 | + | ||
| 76 | +## 2. 模块详细设计 | ||
| 77 | + | ||
| 78 | +### 2.1 tax-boot 模块 | ||
| 79 | + | ||
| 80 | +#### 2.1.1 功能说明 | ||
| 81 | +系统启动模块,整合所有组件并提供消息接收处理能力。该模块是整个系统的入口点,负责初始化Spring Boot应用并配置核心组件。 | ||
| 82 | + | ||
| 83 | +#### 2.1.2 核心组件 | ||
| 84 | +- **TaxApplication**: Spring Boot启动类,配置ProcessorChain | ||
| 85 | +- **TaxAutoPush**: RabbitMQ队列配置 | ||
| 86 | +- **TaxReceiver**: RabbitMQ消息接收器,处理外部传入的消息 | ||
| 87 | +- **TaxReceiveService**: 消息处理服务,负责消息预处理和结果记录 | ||
| 88 | + | ||
| 89 | +#### 2.1.3 消息处理流程 | ||
| 90 | + | ||
| 91 | +TaxAgent系统通过RabbitMQ接收来自业务系统的消息,处理流程如下: | ||
| 92 | + | ||
| 93 | +1. **消息接收**:TaxReceiver.receiveMessage()方法接收来自RabbitMQ的消息 | ||
| 94 | +2. **消息预处理**:TaxReceiveService.messagePreHandle()方法对消息进行预处理,包括: | ||
| 95 | + - 验证租户信息 | ||
| 96 | + - 验证系统类型与文档类型的匹配性 | ||
| 97 | + - 获取租户账套配置 | ||
| 98 | +3. **责任链处理**:调用processorChainMap.get(SystemType).startProcess()启动处理链,依次执行: | ||
| 99 | + - InitializeProcessor(初始化处理) | ||
| 100 | + - MappingProcessor(映射转换) | ||
| 101 | + - ProxyProcessor(代理发送) | ||
| 102 | +4. **结果记录**:TaxReceiveService.recordMapping()方法记录处理结果到数据库 | ||
| 103 | + | ||
| 104 | +```java | ||
| 105 | +// 消息接收处理流程 | ||
| 106 | +1. TaxReceiver.receiveMessage() 接收消息 | ||
| 107 | +2. TaxReceiveService.messagePreHandle() 预处理消息 | ||
| 108 | +3. 调用 processorChainMap.get(SystemType).startProcess() 启动处理链 | ||
| 109 | +4. 依次执行 InitializeProcessor -> MappingProcessor -> ProxyProcessor | ||
| 110 | +5. TaxReceiveService.recordMapping() 处理结果记录到数据库 | ||
| 111 | + | ||
| 112 | +// 异常处理流程 | ||
| 113 | +1. 消息处理过程中出现异常会被捕获 | ||
| 114 | +2. 系统会记录错误信息到 tax_mapping_error 表 | ||
| 115 | +3. 即使出现异常,消息也会被确认消费(手动ACK)以避免重复处理 | ||
| 116 | +``` | ||
| 117 | + | ||
| 118 | +### 2.2 tax-central 模块 | ||
| 119 | + | ||
| 120 | +#### 2.2.1 功能说明 | ||
| 121 | +核心模块,包含系统的基础类定义、枚举类型、异常处理、工具类等。该模块是整个系统的基础,为其他模块提供公共的类和接口定义。 | ||
| 122 | + | ||
| 123 | +#### 2.2.2 核心类设计 | ||
| 124 | + | ||
| 125 | +##### 2.2.2.1 基础领域对象 | ||
| 126 | +- **BaseDocument**: 所有文档对象的基类,包含业务系统传入的原始数据 | ||
| 127 | +- **BaseMapping**: 所有映射对象的基类,包含 verifyInformation 和 returnKeys 字段用于验证和查询 | ||
| 128 | +- **BaseProxy**: 所有代理对象的基类,包含发送到财务系统的响应数据 | ||
| 129 | +- **MessageContext**: 消息上下文,贯穿整个处理流程,包含处理过程中的所有数据 | ||
| 130 | + | ||
| 131 | +##### 2.2.2.2 枚举类型 | ||
| 132 | +- **SystemType**: 系统类型枚举(如金蝶K3 Cloud),定义了系统支持的文档类型 | ||
| 133 | +- **DocumentType**: 文档类型枚举(客户信息、应收单、退款单等) | ||
| 134 | +- **StatusType**: 处理状态枚举 | ||
| 135 | +- **ProcessType**: 流程类型枚举 | ||
| 136 | +- **MappingStateType**: 映射状态类型枚举(已同步、同步失败、同步重试) | ||
| 137 | +- **AuditType**: 审核类型枚举 | ||
| 138 | +- **SettingFieldType**: 配置字段类型枚举(固定值、动态映射、远程调用) | ||
| 139 | +- **FieldType**: 字段类型枚举,定义了各种业务字段 | ||
| 140 | + | ||
| 141 | +##### 2.2.2.3 处理器接口 | ||
| 142 | +- **Processor**: 处理器接口,定义处理方法 | ||
| 143 | +- **AbstractProcessor**: 抽象处理器实现,提供通用处理逻辑 | ||
| 144 | +- **ProcessorChain**: 处理器链,实现责任链模式,按顺序执行各个处理器 | ||
| 145 | + | ||
| 146 | +##### 2.2.2.4 转换器 | ||
| 147 | +- **IConverter**: 字段转换器接口,用于简单字段的转换 | ||
| 148 | +- **ISubConverter**: 子对象转换器接口,用于复杂对象列表的转换 | ||
| 149 | +- **@Converter**: 字段转换注解,用于标注需要转换的字段 | ||
| 150 | +- **@SubConverter**: 子对象转换注解,用于标注需要转换的复杂对象列表 | ||
| 151 | + | ||
| 152 | +转换器是TaxAgent系统中非常重要的组件,通过注解方式实现对象间的自动转换。系统支持三种配置方式: | ||
| 153 | +1. 固定值配置:直接使用预设的固定值 | ||
| 154 | +2. 动态映射:通过键值对映射实现值的转换 | ||
| 155 | +3. 远程调用:通过HTTP调用外部服务获取值 | ||
| 156 | + | ||
| 157 | +#### 2.2.3 上下文管理 | ||
| 158 | +- **TenantStorageContext**: 租户存储上下文,管理租户配置信息,在系统启动时加载所有启用的账套配置 | ||
| 159 | +- **ConnectionContext**: 连接上下文,管理不同系统的连接信息,如金蝶系统的连接参数 | ||
| 160 | +- **ConverterContext**: 转换器上下文,管理所有字段转换器实例 | ||
| 161 | +- **DocumentContext**: 文档上下文,管理所有文档构建器 | ||
| 162 | +- **MappingContext**: 映射上下文,管理所有映射转换器 | ||
| 163 | +- **ProxyContext**: 代理上下文,管理所有数据发送器 | ||
| 164 | + | ||
| 165 | +### 2.3 tax-doc 模块 | ||
| 166 | + | ||
| 167 | +#### 2.3.1 功能说明 | ||
| 168 | +文档处理模块,负责将原始JSON消息转换为标准文档对象。该模块是处理流程的第一步,将业务系统传入的JSON数据转换为系统内部使用的标准Java对象。 | ||
| 169 | + | ||
| 170 | +#### 2.3.2 核心组件 | ||
| 171 | +- **InitializeProcessor**: 初始化处理器,处理流程的第一步,继承自AbstractProcessor,@Order(1) | ||
| 172 | +- **DocumentContext**: 文档上下文,管理所有文档构建器,在系统启动时初始化 | ||
| 173 | +- **Builder**: 文档构建器抽象类,定义构建文档对象的接口 | ||
| 174 | + - **CustomerBuilder**: 客户信息构建器,处理客户信息文档 | ||
| 175 | + - **ReceiptBuilder**: 收款单构建器,处理收款单文档 | ||
| 176 | + - **ReceivableBuilder**: 应收单构建器,处理应收单文档 | ||
| 177 | + - **RefundBuilder**: 退款单构建器,处理退款单文档 | ||
| 178 | + | ||
| 179 | +#### 2.3.3 处理流程 | ||
| 180 | + | ||
| 181 | +InitializeProcessor处理流程: | ||
| 182 | +1. 从DocumentContext.CONTEXT根据documentTypeEnum获取对应的Builder | ||
| 183 | +2. 调用builder.build()方法构建文档对象 | ||
| 184 | +3. 将文档对象设置到MessageContext中 | ||
| 185 | + | ||
| 186 | +Builder处理逻辑: | ||
| 187 | +1. 解析msgBody中的JSON数据构建具体文档对象 | ||
| 188 | +2. 如果存在对应的配置,则应用默认配置(固定值、动态映射或远程调用) | ||
| 189 | +3. 查询数据库中是否已存在映射记录,如果存在则设置customerId等字段 | ||
| 190 | + | ||
| 191 | +```java | ||
| 192 | +// InitializeProcessor处理流程 | ||
| 193 | +1. 从DocumentContext.CONTEXT根据documentTypeEnum获取对应的Builder | ||
| 194 | +2. 调用builder.build()方法构建文档对象 | ||
| 195 | +3. 将文档对象设置到MessageContext中 | ||
| 196 | + | ||
| 197 | +// Builder处理逻辑 | ||
| 198 | +1. 解析msgBody中的JSON数据构建具体文档对象 | ||
| 199 | +2. 如果存在对应的配置,则应用默认配置 | ||
| 200 | +3. 查询数据库中是否已存在映射记录,如果存在则设置customerId等字段 | ||
| 201 | +``` | ||
| 202 | + | ||
| 203 | +### 2.4 tax-map 模块 | ||
| 204 | + | ||
| 205 | +#### 2.4.1 功能说明 | ||
| 206 | +映射转换模块,将文档对象转换为财务系统所需的映射对象。该模块是处理流程的第二步,负责将内部标准文档对象转换为财务系统(如金蝶K3 Cloud)所需的格式。 | ||
| 207 | + | ||
| 208 | +#### 2.4.2 核心组件 | ||
| 209 | +- **MappingProcessor**: 映射处理器,处理流程的第二步,继承自AbstractProcessor,@Order(2) | ||
| 210 | +- **MappingContext**: 映射上下文,管理所有转换器,在系统启动时初始化 | ||
| 211 | +- **Transformer**: 映射转换器抽象类,定义文档对象到映射对象的转换接口 | ||
| 212 | + - **CustomerTransformer**: 客户信息转换器,处理客户信息文档到映射的转换 | ||
| 213 | + - **ReceiptTransformer**: 收款单转换器,处理收款单文档到映射的转换 | ||
| 214 | + - **ReceivableTransformer**: 应收单转换器,处理应收单文档到映射的转换 | ||
| 215 | + - **RefundTransformer**: 退款单转换器,处理退款单文档到映射的转换 | ||
| 216 | + | ||
| 217 | +#### 2.4.3 处理流程 | ||
| 218 | + | ||
| 219 | +MappingProcessor处理流程: | ||
| 220 | +1. 从MappingContext.CONTEXT根据documentTypeEnum获取对应的Transformer | ||
| 221 | +2. 调用transformer.transform()方法转换文档对象 | ||
| 222 | +3. 将映射对象设置到MessageContext中 | ||
| 223 | +4. 将映射对象转换为Map格式用于日志输出 | ||
| 224 | + | ||
| 225 | +Transformer处理逻辑: | ||
| 226 | +1. 使用MappingUtils.convertValue将BaseDocument转换为BaseMapping | ||
| 227 | +2. 设置verifyInformation和returnKeys用于后续的重复性校验和查询 | ||
| 228 | +3. verifyInformation用于在发送前验证数据是否已存在,避免重复发送 | ||
| 229 | +4. returnKeys用于指定查询返回的字段 | ||
| 230 | + | ||
| 231 | +```java | ||
| 232 | +// MappingProcessor处理流程 | ||
| 233 | +1. 从MappingContext.CONTEXT根据documentTypeEnum获取对应的Transformer | ||
| 234 | +2. 调用transformer.transform()方法转换文档对象 | ||
| 235 | +3. 将映射对象设置到MessageContext中 | ||
| 236 | +4. 将映射对象转换为Map格式用于日志输出 | ||
| 237 | + | ||
| 238 | +// Transformer处理逻辑 | ||
| 239 | +1. 使用MappingUtils.convertValue将BaseDocument转换为BaseMapping | ||
| 240 | +2. 设置verifyInformation和returnKeys用于后续的重复性校验和查询 | ||
| 241 | +3. verifyInformation用于在发送前验证数据是否已存在,避免重复发送 | ||
| 242 | +4. returnKeys用于指定查询返回的字段 | ||
| 243 | +``` | ||
| 244 | + | ||
| 245 | +### 2.5 tax-proxy 模块 | ||
| 246 | + | ||
| 247 | +#### 2.5.1 功能说明 | ||
| 248 | +代理发送模块,负责与外部财务系统通信,发送处理后的数据。该模块是处理流程的第三步,也是最后一步,负责将映射对象发送到目标财务系统(如金蝶K3 Cloud)。 | ||
| 249 | + | ||
| 250 | +#### 2.5.2 核心组件 | ||
| 251 | +- **ProxyProcessor**: 代理处理器,处理流程的第三步,继承自AbstractProcessor,@Order(3) | ||
| 252 | +- **ProxyContext**: 代理上下文,管理所有发送器,在系统启动时初始化 | ||
| 253 | +- **Sender**: 数据发送器抽象类,定义映射对象到代理对象的发送接口 | ||
| 254 | + - **CustomerSender**: 客户信息发送器,处理客户信息映射到代理的发送 | ||
| 255 | + - **ReceiptSender**: 收款单发送器,处理收款单映射到代理的发送 | ||
| 256 | + - **ReceivableSender**: 应收单发送器,处理应收单映射到代理的发送 | ||
| 257 | + - **RefundSender**: 退款单发送器,处理退款单映射到代理的发送 | ||
| 258 | +- **KingDeeHelper**: 金蝶系统API调用助手类,封装与金蝶系统的API交互 | ||
| 259 | + | ||
| 260 | +#### 2.5.3 处理流程 | ||
| 261 | + | ||
| 262 | +ProxyProcessor处理流程: | ||
| 263 | +1. 从ConnectionContext.CONNECTION_MAP根据systemTypeEnum获取对应的AbstractConnectionManager | ||
| 264 | +2. 通过AbstractConnectionManager获取系统连接信息(如金蝶系统的认证信息) | ||
| 265 | +3. 从ProxyContext.CONTEXT根据documentTypeEnum获取对应的Sender | ||
| 266 | +4. 调用sender.send()方法发送数据到目标系统 | ||
| 267 | +5. 将返回的代理对象设置到MessageContext中 | ||
| 268 | + | ||
| 269 | +Sender处理逻辑: | ||
| 270 | +1. 首先通过querySend查询是否已存在相同数据,避免重复发送 | ||
| 271 | +2. 调用KingDeeHelper.auditSend方法发送数据到金蝶系统 | ||
| 272 | +3. 处理返回结果,提取thirdPartyId和thirdPartyCode | ||
| 273 | + | ||
| 274 | +```java | ||
| 275 | +// ProxyProcessor处理流程 | ||
| 276 | +1. 从ConnectionContext.CONNECTION_MAP根据systemTypeEnum获取对应的AbstractConnectionManager | ||
| 277 | +2. 通过AbstractConnectionManager获取系统连接信息(如金蝶系统的认证信息) | ||
| 278 | +3. 从ProxyContext.CONTEXT根据documentTypeEnum获取对应的Sender | ||
| 279 | +4. 调用sender.send()方法发送数据到目标系统 | ||
| 280 | +5. 将返回的代理对象设置到MessageContext中 | ||
| 281 | + | ||
| 282 | +// Sender处理逻辑 | ||
| 283 | +1. 首先通过querySend查询是否已存在相同数据,避免重复发送 | ||
| 284 | +2. 调用KingDeeHelper.auditSend方法发送数据到金蝶系统 | ||
| 285 | +3. 处理返回结果,提取thirdPartyId和thirdPartyCode | ||
| 286 | +``` | ||
| 287 | + | ||
| 288 | +### 2.6 tax-storage 模块 | ||
| 289 | + | ||
| 290 | +#### 2.6.1 功能说明 | ||
| 291 | +存储模块,负责数据持久化和配置管理。该模块基于MyBatis-Plus实现数据访问,提供租户、账套、配置和映射数据的存储功能。 | ||
| 292 | + | ||
| 293 | +#### 2.6.2 核心实体 | ||
| 294 | +- **TaxTenant**: 租户信息,包含租户的基本信息(名称、组、实体等) | ||
| 295 | +- **TaxPipeline**: 账套信息,包含账套的基本信息和连接参数 | ||
| 296 | +- **TaxPipelineFieldType**: 账套字段配置信息,定义账套中各字段的配置类型 | ||
| 297 | +- **TaxPipelineFixedConfig**: 账套固定值配置,存储字段的固定值配置 | ||
| 298 | +- **TaxPipelineDynamicConfig**: 账套动态映射配置,存储字段的动态映射关系 | ||
| 299 | +- **TaxPipelineRemoteConfig**: 账套远程调用配置,存储字段的远程调用参数 | ||
| 300 | +- **TaxPipelineMapping**: 账套映射信息,记录已处理的业务数据映射关系 | ||
| 301 | +- **TaxMappingError**: 映射错误信息,记录处理失败的业务数据 | ||
| 302 | +- **TaxPipelineFieldVerify**: 字段验证配置,用于配置哪些字段用于重复性校验 | ||
| 303 | +- **TaxPipelineFieldVerifyReturn**: 返回字段配置,用于配置查询时返回的字段 | ||
| 304 | +- **TaxPipelineBusiness**: 账套业务信息,用于配置账套支持的业务类型 | ||
| 305 | +- **TaxPipelineBusinessConfig**: 账套业务配置,用于配置业务支持的文档类型 | ||
| 306 | +- **TaxPipelineBusinessExt**: 账套业务扩展信息,用于配置业务的扩展字段 | ||
| 307 | +- **TaxPipelineBusinessExtData**: 账套业务扩展数据,用于配置业务扩展字段的默认值 | ||
| 308 | + | ||
| 309 | +#### 2.6.3 核心服务 | ||
| 310 | +- **TaxTenantService**: 租户服务,提供租户的增删改查功能 | ||
| 311 | +- **TaxPipelineService**: 账套服务,提供账套的增删改查功能 | ||
| 312 | +- **TaxPipelineFieldConfigService**: 账套字段配置服务,提供字段配置的增删改查功能 | ||
| 313 | +- **TaxPipelineMappingService**: 账套映射服务,提供映射数据的增删改查功能 | ||
| 314 | +- **TaxMappingErrorService**: 映射错误服务,提供错误记录的存储功能 | ||
| 315 | +- **DynamicTaxPipelineMappingService**: 动态账套映射服务,提供动态表操作功能 | ||
| 316 | +- **TaxPipelineFieldVerifyService**: 字段验证服务,提供验证字段配置的增删改查功能 | ||
| 317 | +- **TaxPipelineBusinessConfigService**: 业务配置服务,提供业务配置的增删改查功能 | ||
| 318 | + | ||
| 319 | +#### 2.6.4 核心功能 | ||
| 320 | +1. 租户管理:创建、更新、查询租户信息 | ||
| 321 | +2. 账套管理:创建、更新、启用/禁用账套 | ||
| 322 | +3. 配置管理:管理账套的各项配置参数,支持固定值、动态映射和远程调用三种配置方式 | ||
| 323 | +4. 映射管理:维护系统间数据的映射关系 | ||
| 324 | +5. 错误管理:记录和查询处理失败的数据 | ||
| 325 | +6. 动态表管理:为每个租户创建独立的映射数据表 | ||
| 326 | +7. 验证管理:配置用于数据重复性校验的字段和返回字段 | ||
| 327 | +8. 业务配置管理:管理账套支持的业务类型及其配置 | ||
| 328 | + | ||
| 329 | +## 3. 数据模型设计 | ||
| 330 | + | ||
| 331 | +### 3.1 核心实体关系图 | ||
| 332 | + | ||
| 333 | +```mermaid | ||
| 334 | +erDiagram | ||
| 335 | + TaxTenant ||--o{ TaxPipeline : has | ||
| 336 | + TaxPipeline ||--o{ TaxPipelineFieldType : has | ||
| 337 | + TaxPipelineFieldType ||--o{ TaxPipelineFixedConfig : has | ||
| 338 | + TaxPipelineFieldType ||--o{ TaxPipelineDynamicConfig : has | ||
| 339 | + TaxPipelineFieldType ||--o{ TaxPipelineRemoteConfig : has | ||
| 340 | + TaxPipeline ||--o{ TaxPipelineFieldVerify : has | ||
| 341 | + TaxPipeline ||--o{ TaxPipelineFieldVerifyReturn : has | ||
| 342 | + TaxPipeline ||--o{ TaxPipelineBusiness : has | ||
| 343 | + TaxPipelineBusiness ||--o{ TaxPipelineBusinessConfig : has | ||
| 344 | + TaxPipelineBusiness ||--o{ TaxPipelineBusinessExt : has | ||
| 345 | + TaxPipelineBusinessExt ||--o{ TaxPipelineBusinessExtData : has | ||
| 346 | + TaxTenant ||--o{ TaxPipelineMapping : has | ||
| 347 | + TaxTenant ||--o{ TaxMappingError : has | ||
| 348 | + | ||
| 349 | + TaxTenant { | ||
| 350 | + bigint id PK | ||
| 351 | + varchar name | ||
| 352 | + varchar group | ||
| 353 | + varchar entity | ||
| 354 | + int state | ||
| 355 | + datetime created_time | ||
| 356 | + datetime modified_time | ||
| 357 | + } | ||
| 358 | + | ||
| 359 | + TaxPipeline { | ||
| 360 | + bigint id PK | ||
| 361 | + bigint tenant_id FK | ||
| 362 | + varchar system_code | ||
| 363 | + varchar name | ||
| 364 | + varchar code | ||
| 365 | + json params | ||
| 366 | + int state | ||
| 367 | + datetime created_time | ||
| 368 | + datetime modified_time | ||
| 369 | + } | ||
| 370 | + | ||
| 371 | + TaxPipelineFieldType { | ||
| 372 | + bigint id PK | ||
| 373 | + bigint pipeline_id FK | ||
| 374 | + varchar document_type | ||
| 375 | + varchar config_key | ||
| 376 | + int setting_field_type | ||
| 377 | + datetime created_time | ||
| 378 | + datetime modified_time | ||
| 379 | + } | ||
| 380 | + | ||
| 381 | + TaxPipelineFixedConfig { | ||
| 382 | + bigint id PK | ||
| 383 | + bigint pipeline_field_type_id FK | ||
| 384 | + varchar config_value | ||
| 385 | + datetime created_time | ||
| 386 | + datetime modified_time | ||
| 387 | + } | ||
| 388 | + | ||
| 389 | + TaxPipelineDynamicConfig { | ||
| 390 | + bigint id PK | ||
| 391 | + bigint pipeline_field_type_id FK | ||
| 392 | + varchar config_value | ||
| 393 | + varchar config_map_value | ||
| 394 | + datetime created_time | ||
| 395 | + datetime modified_time | ||
| 396 | + } | ||
| 397 | + | ||
| 398 | + TaxPipelineRemoteConfig { | ||
| 399 | + bigint id PK | ||
| 400 | + bigint pipeline_field_type_id FK | ||
| 401 | + varchar fixed_params | ||
| 402 | + varchar field | ||
| 403 | + varchar remote_address | ||
| 404 | + varchar data_path | ||
| 405 | + datetime created_time | ||
| 406 | + datetime modified_time | ||
| 407 | + } | ||
| 408 | + | ||
| 409 | + TaxPipelineFieldVerify { | ||
| 410 | + bigint id PK | ||
| 411 | + bigint pipeline_id FK | ||
| 412 | + varchar document_type | ||
| 413 | + varchar config_verify_field | ||
| 414 | + datetime created_time | ||
| 415 | + datetime modified_time | ||
| 416 | + } | ||
| 417 | + | ||
| 418 | + TaxPipelineFieldVerifyReturn { | ||
| 419 | + bigint id PK | ||
| 420 | + bigint pipeline_id FK | ||
| 421 | + varchar document_type | ||
| 422 | + varchar config_return_field | ||
| 423 | + datetime created_time | ||
| 424 | + datetime modified_time | ||
| 425 | + } | ||
| 426 | + | ||
| 427 | + TaxPipelineBusiness { | ||
| 428 | + bigint id PK | ||
| 429 | + bigint pipeline_id FK | ||
| 430 | + varchar business_code | ||
| 431 | + varchar business_name | ||
| 432 | + datetime created_time | ||
| 433 | + datetime modified_time | ||
| 434 | + } | ||
| 435 | + | ||
| 436 | + TaxPipelineBusinessConfig { | ||
| 437 | + bigint id PK | ||
| 438 | + bigint tax_pipeline_business_id FK | ||
| 439 | + varchar document_type | ||
| 440 | + datetime created_time | ||
| 441 | + datetime modified_time | ||
| 442 | + } | ||
| 443 | + | ||
| 444 | + TaxPipelineBusinessExt { | ||
| 445 | + bigint id PK | ||
| 446 | + bigint tax_pipeline_business_id FK | ||
| 447 | + varchar ext_name | ||
| 448 | + varchar ext_code | ||
| 449 | + varchar ext_default_data | ||
| 450 | + datetime created_time | ||
| 451 | + datetime modified_time | ||
| 452 | + } | ||
| 453 | + | ||
| 454 | + TaxPipelineBusinessExtData { | ||
| 455 | + bigint id PK | ||
| 456 | + bigint tax_pipeline_business_ext_id FK | ||
| 457 | + varchar ext_data | ||
| 458 | + datetime created_time | ||
| 459 | + datetime modified_time | ||
| 460 | + } | ||
| 461 | + | ||
| 462 | + TaxPipelineMapping { | ||
| 463 | + bigint id PK | ||
| 464 | + bigint tenant_id FK | ||
| 465 | + bigint pipeline_id FK | ||
| 466 | + varchar document_type | ||
| 467 | + varchar system_data_id | ||
| 468 | + varchar pipeline_data_id | ||
| 469 | + json origin_data | ||
| 470 | + int state | ||
| 471 | + datetime created_time | ||
| 472 | + datetime modified_time | ||
| 473 | + } | ||
| 474 | + | ||
| 475 | + TaxMappingError { | ||
| 476 | + bigint id PK | ||
| 477 | + varchar group | ||
| 478 | + varchar entity | ||
| 479 | + varchar pipeline_code | ||
| 480 | + varchar document_type | ||
| 481 | + varchar system_type | ||
| 482 | + varchar system_data_id | ||
| 483 | + json origin_data | ||
| 484 | + int state | ||
| 485 | + varchar error_message | ||
| 486 | + datetime created_time | ||
| 487 | + datetime modified_time | ||
| 488 | + } | ||
| 489 | +``` | ||
| 490 | + | ||
| 491 | +### 3.2 业务文档模型 | ||
| 492 | + | ||
| 493 | +TaxAgent系统支持四种主要的业务文档类型,每种类型都有对应的文档类、映射类和代理类。 | ||
| 494 | + | ||
| 495 | +#### 3.2.1 客户信息 (StandardCustomer) | ||
| 496 | +继承关系:BaseCustomer -> BaseDocument | ||
| 497 | + | ||
| 498 | +主要字段: | ||
| 499 | +- systemDataId: 系统数据ID | ||
| 500 | +- customerId: 客户ID | ||
| 501 | +- customerCode: 客户编码 | ||
| 502 | +- customerName: 客户名称 | ||
| 503 | +- customerShortName: 客户简称 | ||
| 504 | +- customerInvoiceTitle: 客户发票抬头 | ||
| 505 | +- legalPerson: 法人姓名 | ||
| 506 | +- idNumber: 证件号 | ||
| 507 | +- country: 国家 | ||
| 508 | +- provincial: 区域组织 | ||
| 509 | +- address: 地址 | ||
| 510 | +- registerAddress: 注册地址 | ||
| 511 | +- customerGroup: 客户分组 | ||
| 512 | +- customerCreateOrg: 创建组织 | ||
| 513 | +- customerUseOrg: 使用组织 | ||
| 514 | +- contacts: 联系人列表 | ||
| 515 | + | ||
| 516 | +#### 3.2.2 收款单 (ReceiptBill) | ||
| 517 | +继承关系:BaseBill -> BaseDocument | ||
| 518 | + | ||
| 519 | +主要字段: | ||
| 520 | +- createTime: 创建时间 | ||
| 521 | +- businessType: 业务类型 | ||
| 522 | +- settleOrg: 结算组织 | ||
| 523 | +- saleOrg: 销售组织 | ||
| 524 | +- saleDept: 销售部门 | ||
| 525 | +- payOrg: 支付组织 | ||
| 526 | +- currency: 货币 | ||
| 527 | +- remark: 备注 | ||
| 528 | +- businessCardNumber: 业务卡号 | ||
| 529 | +- settleCurrency: 结算货币 | ||
| 530 | +- contactType: 往来单位类型 | ||
| 531 | +- contact: 往来单位 | ||
| 532 | +- payContactType: 付款单位类型 | ||
| 533 | +- payContact: 付款单位 | ||
| 534 | +- receiptItems: 收款项目列表 | ||
| 535 | + | ||
| 536 | +#### 3.2.3 应收单 (ReceivableBill) | ||
| 537 | +继承关系:BaseBill -> BaseDocument | ||
| 538 | + | ||
| 539 | +主要字段: | ||
| 540 | +- createTime: 创建时间 | ||
| 541 | +- businessType: 业务类型 | ||
| 542 | +- settleOrg: 结算组织 | ||
| 543 | +- saleOrg: 销售组织 | ||
| 544 | +- saleDept: 销售部门 | ||
| 545 | +- payOrg: 支付组织 | ||
| 546 | +- currency: 货币 | ||
| 547 | +- settleMethod: 结算方法 | ||
| 548 | +- remark: 备注 | ||
| 549 | +- businessCardNumber: 业务卡号 | ||
| 550 | +- customer: 客户 | ||
| 551 | +- receiver: 收货方 | ||
| 552 | +- orderer: 订货方 | ||
| 553 | +- payer: 付款人 | ||
| 554 | +- settleName: 结算人名称 | ||
| 555 | +- standardCurrency: 标准货币 | ||
| 556 | +- receivableItems: 应收项目列表 | ||
| 557 | + | ||
| 558 | +#### 3.2.4 退款单 (RefundBill) | ||
| 559 | +继承关系:BaseBill -> BaseDocument | ||
| 560 | + | ||
| 561 | +主要字段: | ||
| 562 | +- createTime: 创建时间 | ||
| 563 | +- businessType: 业务类型 | ||
| 564 | +- settleOrg: 结算组织 | ||
| 565 | +- saleOrg: 销售组织 | ||
| 566 | +- saleDept: 销售部门 | ||
| 567 | +- payOrg: 支付组织 | ||
| 568 | +- currency: 货币 | ||
| 569 | +- remark: 备注 | ||
| 570 | +- businessCardNumber: 业务卡号 | ||
| 571 | +- settleCurrency: 结算货币 | ||
| 572 | +- receiveContactType: 收款单位类型 | ||
| 573 | +- receiveContact: 收款单位 | ||
| 574 | +- contactType: 往来单位类型 | ||
| 575 | +- contact: 往来单位 | ||
| 576 | +- refundItems: 退款项目列表 | ||
| 577 | + | ||
| 578 | +## 4. 系统集成设计 | ||
| 579 | + | ||
| 580 | +### 4.1 与金蝶K3 Cloud集成 | ||
| 581 | + | ||
| 582 | +#### 4.1.1 连接管理 | ||
| 583 | +通过KingDeeConnectionManager管理金蝶系统的连接信息,连接参数存储在TaxPipeline的params字段中。系统使用金蝶官方提供的K3CloudApi SDK与金蝶K3 Cloud系统进行交互。 | ||
| 584 | + | ||
| 585 | +#### 4.1.2 API调用 | ||
| 586 | +使用KingDeeHelper工具类封装与金蝶系统的API交互: | ||
| 587 | +- **nonAuditSend**: 无需审核的保存操作,适用于客户联系人等基础信息 | ||
| 588 | +- **auditSend**: 需要审核的保存操作,适用于业务单据 | ||
| 589 | +- **unAuditSend**: 反审核操作,用于更新已审核的单据 | ||
| 590 | +- **querySend**: 查询操作,用于验证数据是否已存在 | ||
| 591 | + | ||
| 592 | +API调用异常处理: | ||
| 593 | +- 所有金蝶系统API调用异常都会被封装为TaxAgentServiceException抛出 | ||
| 594 | +- 异常信息会被记录到日志中 | ||
| 595 | +- 根据异常类型返回相应的错误码给调用方 | ||
| 596 | + | ||
| 597 | +#### 4.1.3 数据发送流程 | ||
| 598 | +1. 根据DocumentType获取对应的Sender | ||
| 599 | +2. 构造金蝶系统所需的映射对象 | ||
| 600 | +3. 处理特殊字段(如联系人信息) | ||
| 601 | +4. 调用KingDeeHelper发送数据 | ||
| 602 | +5. 处理返回结果 | ||
| 603 | + | ||
| 604 | +#### 4.1.4 重复数据处理 | ||
| 605 | +系统通过verifyInformation和returnKeys字段实现重复数据检测: | ||
| 606 | +- verifyInformation: 包含用于验证数据是否已存在的查询条件 | ||
| 607 | +- returnKeys: 指定查询返回的字段 | ||
| 608 | + | ||
| 609 | +在发送数据前,系统会先调用querySend方法检查数据是否已存在,避免重复发送。 | ||
| 610 | + | ||
| 611 | +### 4.2 消息队列集成 | ||
| 612 | + | ||
| 613 | +系统通过RabbitMQ接收外部消息: | ||
| 614 | +- 队列名称: tax-agent.queue | ||
| 615 | +- 交换机: tax-agent.exchange | ||
| 616 | +- 路由键: tax-agent.routing.process | ||
| 617 | + | ||
| 618 | +消息格式为JSON字符串,包含以下字段: | ||
| 619 | +- pipelineCode: 账套编码 | ||
| 620 | +- group: 租户组 | ||
| 621 | +- entity: 租户实体 | ||
| 622 | +- msgBody: 消息体(业务数据) | ||
| 623 | +- systemType: 系统类型 | ||
| 624 | +- documentType: 文档类型 | ||
| 625 | +- systemDataId: 系统数据ID,用于唯一标识业务数据 | ||
| 626 | + | ||
| 627 | +系统采用手动ACK机制确保消息的可靠处理,即使在处理过程中发生异常,也会确认消息以避免重复处理。 | ||
| 628 | + | ||
| 629 | +## 5. 配置管理 | ||
| 630 | + | ||
| 631 | +TaxAgent系统提供灵活的配置管理功能,支持多种配置方式。 | ||
| 632 | + | ||
| 633 | +### 5.1 租户配置 | ||
| 634 | +通过TaxTenant实体管理租户信息,包含group和entity两个维度。租户是系统中的独立客户或组织单位,具有独立的配置和数据空间。 | ||
| 635 | + | ||
| 636 | +### 5.2 账套配置 | ||
| 637 | +通过TaxPipeline实体管理账套信息,关联具体的系统类型和连接参数。账套是财务系统中的独立核算单位,对应财务系统中的具体账套。 | ||
| 638 | + | ||
| 639 | +### 5.3 字段配置 | ||
| 640 | +系统支持三种字段配置方式: | ||
| 641 | + | ||
| 642 | +1. **固定值配置**:通过TaxPipelineFixedConfig实体管理,直接使用预设的固定值 | ||
| 643 | +2. **动态映射**:通过TaxPipelineDynamicConfig实体管理,通过键值对映射实现值的转换 | ||
| 644 | +3. **远程调用**:通过TaxPipelineRemoteConfig实体管理,通过HTTP调用外部服务获取值 | ||
| 645 | + | ||
| 646 | +配置按文档类型进行分类管理,通过TaxPipelineFieldType实体关联具体的配置类型。 | ||
| 647 | + | ||
| 648 | +### 5.4 数据映射配置 | ||
| 649 | +通过TaxPipelineMapping实体管理不同系统间数据的映射关系,记录已处理的业务数据。 | ||
| 650 | + | ||
| 651 | +### 5.5 验证字段配置 | ||
| 652 | +通过TaxPipelineFieldVerify和TaxPipelineFieldVerifyReturn实体管理验证字段配置: | ||
| 653 | +- TaxPipelineFieldVerify: 配置用于验证数据是否已存在的字段 | ||
| 654 | +- TaxPipelineFieldVerifyReturn: 配置查询时返回的字段 | ||
| 655 | + | ||
| 656 | +### 5.6 业务配置管理 | ||
| 657 | +通过TaxPipelineBusiness、TaxPipelineBusinessConfig和TaxPipelineBusinessExt实体管理业务配置: | ||
| 658 | +- TaxPipelineBusiness: 配置账套支持的业务类型 | ||
| 659 | +- TaxPipelineBusinessConfig: 配置业务支持的文档类型 | ||
| 660 | +- TaxPipelineBusinessExt: 配置业务的扩展字段及默认值 | ||
| 661 | + | ||
| 662 | +## 6. 异常处理机制 | ||
| 663 | + | ||
| 664 | +### 6.1 异常类型 | ||
| 665 | +- **TaxAgentServiceException**: 系统业务异常,继承自RuntimeException | ||
| 666 | +- **全局异常处理器**: GlobalExceptionHandler统一处理系统异常,提供统一的异常响应格式 | ||
| 667 | + | ||
| 668 | +### 6.2 异常码定义 (TaxSystemType) | ||
| 669 | +- UNKNOWN_ERROR: 未知错误 | ||
| 670 | +- MISSING_BUSINESS_INFORMATION: 缺少业务信息 | ||
| 671 | +- BUSINESS_MATCHES_ARE_INCORRECT: 业务匹配不正确 | ||
| 672 | +- NO_MATCHING_SET_OF_ACCOUNTS_FOUND: 未找到匹配的账套 | ||
| 673 | +- NO_TENANT_INFORMATION_FOUND: 未找到租户信息 | ||
| 674 | +- REMOTE_SERVICE_CALLS_ARE_EXCEPTIONAL: 远程服务调用异常 | ||
| 675 | +- REPEAT_SENDING: 重复发送 | ||
| 676 | +- INCORRECT_BUSINESS_PROCESSES: 业务流程不正确 | ||
| 677 | +- ABNORMAL_PARAMETERS: 参数异常 | ||
| 678 | +- INVALID_HTTP_REQUEST_PARAMS: HTTP请求参数无效 | ||
| 679 | + | ||
| 680 | +系统通过GlobalExceptionHandler统一处理各类异常,确保向客户端返回一致的错误格式。 | ||
| 681 | + | ||
| 682 | +## 7. 系统扩展性设计 | ||
| 683 | + | ||
| 684 | +TaxAgent系统设计时充分考虑了扩展性,支持多种方式的扩展。 | ||
| 685 | + | ||
| 686 | +### 7.1 多系统支持 | ||
| 687 | +通过SystemType枚举和对应的ConnectionManager实现支持不同财务系统。目前系统已实现对金蝶K3 Cloud的支持,可以通过扩展AbstractConnectionManager来支持其他财务系统。 | ||
| 688 | + | ||
| 689 | +### 7.2 多文档类型支持 | ||
| 690 | +通过DocumentType枚举和对应的Builder、Transformer、Sender实现支持不同文档类型。系统目前已支持客户信息、应收单、收款单和退款单四种文档类型,可以通过实现相应的抽象类来扩展新的文档类型。 | ||
| 691 | + | ||
| 692 | +### 7.3 字段转换扩展 | ||
| 693 | +通过Converter和SubConverter机制支持灵活的字段转换配置。系统提供了IConverter和ISubConverter接口,可以通过实现这些接口来支持自定义的字段转换逻辑。 | ||
| 694 | + | ||
| 695 | +### 7.4 处理器链扩展 | ||
| 696 | +通过ProcessorChain实现责任链模式,可以方便地添加新的处理步骤到处理流程中。 | ||
| 697 | + | ||
| 698 | +## 8. 性能优化考虑 | ||
| 699 | + | ||
| 700 | +### 8.1 缓存机制 | ||
| 701 | +- 使用ConcurrentHashMap缓存租户配置信息,在系统启动时加载所有启用的账套配置 | ||
| 702 | +- 使用ConcurrentHashMap缓存各类处理器、转换器和发送器 | ||
| 703 | +- 通过RestoreTenantEvent事件机制实现缓存的动态刷新 | ||
| 704 | + | ||
| 705 | +### 8.2 连接池管理 | ||
| 706 | +- 使用K3CloudApi提供的连接管理机制 | ||
| 707 | +- 数据库连接使用HikariCP连接池 | ||
| 708 | + | ||
| 709 | +### 8.3 异步处理 | ||
| 710 | +- 消息处理采用手动ACK机制 | ||
| 711 | +- 异常处理独立进行,不影响消息队列的正常消费 | ||
| 712 | +- 数据库操作使用事务管理确保数据一致性 | ||
| 713 | + | ||
| 714 | +### 8.4 数据库优化 | ||
| 715 | +- 为TaxPipelineMapping表设计了租户独立的表结构,提高查询性能 | ||
| 716 | +- 为常用查询字段添加了索引 | ||
| 717 | + | ||
| 718 | +## 9. 部署架构 | ||
| 719 | + | ||
| 720 | +### 9.1 依赖组件 | ||
| 721 | +- MySQL: 数据存储 | ||
| 722 | +- RabbitMQ: 消息队列 | ||
| 723 | +- Nacos: 配置中心和服务发现 | ||
| 724 | + | ||
| 725 | +### 9.2 部署配置 | ||
| 726 | +- application.properties: 应用配置 | ||
| 727 | +- logback-spring.xml: 日志配置 | ||
| 728 | + | ||
| 729 | +### 9.3 部署方式 | ||
| 730 | +系统采用Spring Boot应用方式部署,可以通过以下方式启动: | ||
| 731 | +```bash | ||
| 732 | +# 使用Maven插件启动 | ||
| 733 | +./mvnw spring-boot:run | ||
| 734 | + | ||
| 735 | +# 构建jar包并运行 | ||
| 736 | +./mvnw clean package | ||
| 737 | +java -jar tax-boot/target/tax-boot.jar | ||
| 738 | +``` | ||
| 739 | + | ||
| 740 | +## 10. 安全设计 | ||
| 741 | + | ||
| 742 | +### 10.1 数据安全 | ||
| 743 | +- 敏感信息(如数据库密码)进行编码存储 | ||
| 744 | +- 通过Nacos配置中心管理敏感配置 | ||
| 745 | +- 数据库访问使用参数化查询防止SQL注入 | ||
| 746 | + | ||
| 747 | +### 10.2 通信安全 | ||
| 748 | +- 与金蝶系统通信采用HTTPS协议 | ||
| 749 | +- 数据传输采用JSON格式 | ||
| 750 | +- 消息队列使用认证机制确保消息安全 | ||
| 751 | + | ||
| 752 | +### 10.3 应用安全 | ||
| 753 | +- 使用Spring Security框架提供认证和授权功能 | ||
| 754 | +- 对外暴露的REST API使用JWT进行认证 | ||
| 755 | +- 敏感操作进行权限验证 | ||
| 756 | + | ||
| 757 | +## 11. 监控和日志 | ||
| 758 | + | ||
| 759 | +### 11.1 日志管理 | ||
| 760 | +- 使用Logback作为日志框架 | ||
| 761 | +- 支持控制台和文件双输出 | ||
| 762 | +- 按时间和大小滚动日志文件 | ||
| 763 | +- 支持不同环境(dev、test、pre、prod)的日志级别配置 | ||
| 764 | +- 对数据库操作有专门的DEBUG级别日志配置 | ||
| 765 | +- 重要业务操作有详细日志记录 | ||
| 766 | + | ||
| 767 | +### 11.2 监控指标 | ||
| 768 | +- 消息处理成功/失败统计 | ||
| 769 | +- 系统响应时间监控 | ||
| 770 | +- 异常信息记录和报警 | ||
| 771 | +- API调用成功率统计 | ||
| 772 | +- 数据库操作性能监控 | ||
| 773 | + | ||
| 774 | +### 11.3 健康检查 | ||
| 775 | +- 提供应用健康检查接口 | ||
| 776 | +- 数据库连接状态监控 | ||
| 777 | +- 消息队列连接状态监控 | ||
| 778 | +- 外部服务可用性检查 | ||
| 779 | + | ||
| 780 | +## 12. 测试策略 | ||
| 781 | + | ||
| 782 | +### 12.1 单元测试 | ||
| 783 | +针对各个模块的核心功能编写单元测试,使用JUnit 5作为测试框架。 | ||
| 784 | + | ||
| 785 | +### 12.2 集成测试 | ||
| 786 | +测试与外部系统的集成,包括金蝶K3 Cloud和RabbitMQ。 | ||
| 787 | + | ||
| 788 | +### 12.3 性能测试 | ||
| 789 | +测试系统在高并发情况下的处理能力。 | ||
| 790 | + | ||
| 791 | +### 12.4 测试环境 | ||
| 792 | +- 开发环境(dev):用于功能开发和调试 | ||
| 793 | +- 测试环境(test):用于功能测试和集成测试 | ||
| 794 | +- 预生产环境(pre):用于性能测试和用户验收测试 | ||
| 795 | +- 生产环境(prod):正式运行环境 | ||
| 796 | + | ||
| 797 | +## 13. 未来规划 | ||
| 798 | + | ||
| 799 | +### 13.1 功能扩展 | ||
| 800 | +- 支持更多财务系统(如用友、SAP等) | ||
| 801 | +- 增加更多的业务文档类型 | ||
| 802 | +- 提供更丰富的配置管理功能 | ||
| 803 | +- 增加业务配置管理API,支持远程获取业务配置信息 | ||
| 804 | + | ||
| 805 | +### 13.2 性能优化 | ||
| 806 | +- 引入缓存机制(如Redis)提升查询性能 | ||
| 807 | +- 实现消息的批量处理提升吞吐量 | ||
| 808 | +- 优化数据库索引和查询语句 | ||
| 809 | + | ||
| 810 | +### 13.3 监控完善 | ||
| 811 | +- 集成Prometheus和Grafana实现可视化监控 | ||
| 812 | +- 增加更详细的业务指标监控 | ||
| 813 | +- 实现自动告警机制 | ||
| 0 | \ No newline at end of file | 814 | \ No newline at end of file |
doc/customerAsync.xlsx
0 → 100644
No preview for this file type