工程架构详解.md 60 KB

养老院管理系统 - 工程架构详解

一、项目整体架构图

┌─────────────────────────────────────────────────────────────────────┐
│                         前端应用层                                   │
│  ┌──────────────┬──────────────┬──────────────┬──────────────┐     │
│  │  Vue3后台    │  Vue2后台    │  Vben后台    │  UniApp移动  │     │
│  └──────────────┴──────────────┴──────────────┴──────────────┘     │
└────────────────────────────┬────────────────────────────────────────┘
                             │ HTTP/REST API
┌────────────────────────────────────────────────────────────────────┐
│                      API网关 / 负载均衡                             │
│                      (Nginx / Spring Cloud)                        │
└────────────────────────────┬────────────────────────────────────────┘
                             │
┌────────────────────────────────────────────────────────────────────┐
│                     Spring Boot 应用层                             │
│  ┌──────────────────────────────────────────────────────────────┐ │
│  │                    yudao-server (主应用)                     │ │
│  │  ┌────────────────────────────────────────────────────────┐ │ │
│  │  │              Controller 层(控制器)                   │ │ │
│  │  │  ┌──────────┬──────────┬──────────┬──────────────┐   │ │ │
│  │  │  │Expense   │Elderly   │Contract  │DailyExpenses│   │ │ │
│  │  │  │Controller│Controller│Controller│Controller   │   │ │ │
│  │  │  └──────────┴──────────┴──────────┴──────────────┘   │ │ │
│  │  └────────────────────────────────────────────────────────┘ │ │
│  │                          ↓                                   │ │
│  │  ┌────────────────────────────────────────────────────────┐ │ │
│  │  │              Service 层(业务逻辑)                    │ │ │
│  │  │  ┌──────────┬──────────┬──────────┬──────────────┐   │ │ │
│  │  │  │Expense   │Elderly   │Contract  │DailyExpenses│   │ │ │
│  │  │  │Service   │Service   │Service   │Service       │   │ │ │
│  │  │  └──────────┴──────────┴──────────┴──────────────┘   │ │ │
│  │  └────────────────────────────────────────────────────────┘ │ │
│  │                          ↓                                   │ │
│  │  ┌────────────────────────────────────────────────────────┐ │ │
│  │  │              Mapper 层(数据访问)                     │ │ │
│  │  │  ┌──────────┬──────────┬──────────┬──────────────┐   │ │ │
│  │  │  │Expense   │Elderly   │Contract  │DailyExpenses│   │ │ │
│  │  │  │Mapper    │Mapper    │Mapper    │Mapper        │   │ │ │
│  │  │  └──────────┴──────────┴──────────┴──────────────┘   │ │ │
│  │  └────────────────────────────────────────────────────────┘ │ │
│  └──────────────────────────────────────────────────────────────┘ │
│                                                                    │
│  ┌──────────────────────────────────────────────────────────────┐ │
│  │                  框架层(yudao-framework)                   │ │
│  │  ┌─────────────┬─────────────┬─────────────┬────────────┐  │ │
│  │  │ Security    │ MyBatis     │ Redis       │ Excel      │  │ │
│  │  │ 权限认证    │ ORM增强     │ 缓存        │ 导入导出   │  │ │
│  │  └─────────────┴─────────────┴─────────────┴────────────┘  │ │
│  │  ┌─────────────┬─────────────┬─────────────┬────────────┐  │ │
│  │  │ Tenant      │ Job         │ MQ          │ Monitor    │  │ │
│  │  │ 多租户      │ 定时任务    │ 消息队列    │ 监控       │  │ │
│  │  └─────────────┴─────────────┴─────────────┴────────────┘  │ │
│  └──────────────────────────────────────────────────────────────┘ │
└────────────────────────────┬────────────────────────────────────────┘
                             │
┌────────────────────────────────────────────────────────────────────┐
│                      数据持久化层                                   │
│  ┌──────────────┬──────────────┬──────────────┬──────────────┐   │
│  │   MySQL      │   Redis      │   Elasticsearch  │  其他DB  │   │
│  │  关系型数据库 │  缓存存储    │  搜索引擎    │  备选方案  │   │
│  └──────────────┴──────────────┴──────────────┴──────────────┘   │
└────────────────────────────────────────────────────────────────────┘

二、模块依赖关系图

yudao-dependencies (依赖版本管理)
    ↓
yudao-framework (框架层)
    ├─ yudao-common (通用工具)
    ├─ yudao-spring-boot-starter-security (权限)
    ├─ yudao-spring-boot-starter-mybatis (ORM)
    ├─ yudao-spring-boot-starter-redis (缓存)
    ├─ yudao-spring-boot-starter-biz-tenant (多租户)
    ├─ yudao-spring-boot-starter-job (定时任务)
    ├─ yudao-spring-boot-starter-mq (消息队列)
    ├─ yudao-spring-boot-starter-excel (Excel)
    ├─ yudao-spring-boot-starter-web (Web)
    ├─ yudao-spring-boot-starter-monitor (监控)
    └─ yudao-spring-boot-starter-protection (保护)
        ↓
yudao-module-system (系统模块 - 核心业务)
    ├─ yudao-module-system-api (API接口)
    └─ yudao-module-system-biz (业务实现)
        ↓
yudao-module-infra (基础设施模块)
    ├─ yudao-module-infra-api
    └─ yudao-module-infra-biz
        ↓
yudao-module-member (会员模块 - 可选)
    ├─ yudao-module-member-api
    └─ yudao-module-member-biz
        ↓
yudao-module-bpm (工作流模块 - 可选)
    ├─ yudao-module-bpm-api
    └─ yudao-module-bpm-biz
        ↓
yudao-module-report (报表模块 - 可选)
    ├─ yudao-module-report-api
    └─ yudao-module-report-biz
        ↓
yudao-server (主应用 - 容器)
    └─ 依赖所有上述模块

三、数据流向图

3.1 账单查询流程

┌─────────────────────────────────────────────────────────────────┐
│  前端请求: GET /api/order/receivable-total?year=2024            │
└────────────────────────┬────────────────────────────────────────┘
                         │
                         ↓
┌─────────────────────────────────────────────────────────────────┐
│  OrderController.getOrderReceivableTotal()                      │
│  - 参数验证                                                      │
│  - 权限检查                                                      │
└────────────────────────┬────────────────────────────────────────┘
                         │
                         ↓
┌─────────────────────────────────────────────────────────────────┐
│  OrderApiImpl.getOrderReceivableTotal()                          │
│  - 循环12个月                                                    │
│  - 调用 getReceivableListByMonth()                              │
│  - 累加各项金额                                                  │
└────────────────────────┬────────────────────────────────────────┘
                         │
                         ↓
┌─────────────────────────────────────────────────────────────────┐
│  OrderApiImpl.getReceivableListByMonth()                         │
│  - 调用 getListByMonth()                                        │
└────────────────────────┬────────────────────────────────────────┘
                         │
                         ↓
┌─────────────────────────────────────────────────────────────────┐
│  OrderApiImpl.getListByMonth()                                   │
│  ├─ orderMapper.selectListByMonth()                             │
│  │  └─ SQL: SELECT * FROM elderly_expense_order WHERE ...      │
│  │     (查询该月订单列表)                                        │
│  │                                                               │
│  ├─ orderItemMapper.selectList()                                │
│  │  └─ SQL: SELECT * FROM elderly_expense_order_item           │
│  │     WHERE expense_order_id IN (...)                          │
│  │     (批量查询订单项)                                          │
│  │                                                               │
│  ├─ itemMapper.selectBatchIds()                                 │
│  │  └─ SQL: SELECT * FROM elderly_expense_item                 │
│  │     WHERE id IN (...)                                        │
│  │     (批量查询费用项)                                          │
│  │                                                               │
│  └─ dailyExpensesMapper.selectBatchIds()                        │
│     └─ SQL: SELECT * FROM daily_expenses                        │
│        WHERE id IN (...)                                        │
│        (批量查询日常开支)                                        │
└────────────────────────┬────────────────────────────────────────┘
                         │
                         ↓
┌─────────────────────────────────────────────────────────────────┐
│  数据组装与计算                                                  │
│  - 将DO转换为VO                                                  │
│  - 计算各项金额                                                  │
│  - 计算实付比例                                                  │
└────────────────────────┬────────────────────────────────────────┘
                         │
                         ↓
┌─────────────────────────────────────────────────────────────────┐
│  返回响应: OrderItemTotalRespVO                                  │
│  {                                                               │
│    "billingMonth": "2024年12月",                                 │
│    "bedTotalAmount": 12000.00,                                   │
│    "nurseTotalAmount": 8000.00,                                  │
│    "mealTotalAmount": 5000.00,                                   │
│    "serviceTotalAmount": 3000.00,                                │
│    "totalAmount": 28000.00,                                      │
│    "totalActualAmount": 25000.00,                                │
│    "actualTotalProportion": "89%"                                │
│  }                                                               │
└─────────────────────────────────────────────────────────────────┘

3.2 性能问题展示

【当前实现】- 性能问题
┌──────────────────────────────────────────────────────────────┐
│ getOrderReceivableTotal()                                    │
│   for i=1 to 12:                                             │
│     ├─ getReceivableListByMonth(month=i)                     │
│     │   └─ getListByMonth()                                  │
│     │       ├─ Query 1: selectListByMonth()                  │
│     │       ├─ Query 2: selectList() - 订单项                │
│     │       ├─ Query 3: selectBatchIds() - 费用项            │
│     │       └─ Query 4: selectBatchIds() - 日常开支          │
│     │                                                         │
│     └─ 累加数据                                               │
│                                                               │
│ 总查询数: 12 × 4 = 48 次数据库查询 ❌                         │
└──────────────────────────────────────────────────────────────┘

【优化方案】- 性能改进
┌──────────────────────────────────────────────────────────────┐
│ getOrderReceivableTotal()                                    │
│   ├─ selectListByYear(year)                                  │
│   │   ├─ Query 1: selectListByYear()                         │
│   │   ├─ Query 2: selectList() - 订单项                      │
│   │   ├─ Query 3: selectBatchIds() - 费用项                  │
│   │   └─ Query 4: selectBatchIds() - 日常开支                │
│   │                                                           │
│   └─ 在内存中按月份分组                                       │
│       └─ 循环12个月进行累加                                   │
│                                                               │
│ 总查询数: 1 × 4 = 4 次数据库查询 ✅                           │
│ 性能提升: 92% 的查询减少                                       │
└──────────────────────────────────────────────────────────────┘

四、业务对象关系图

┌─────────────────────────────────────────────────────────────────┐
│                      ElderlyInfo (长者)                          │
│  ├─ id: 长者ID                                                   │
│  ├─ elder_name: 姓名                                             │
│  ├─ in_status: 在住状态 (1=在住, 2=退住)                         │
│  ├─ org_type: 机构类型                                           │
│  └─ tenant_id: 租户ID                                            │
└────────┬──────────────────────────────────────────────────────────┘
         │ 1:N
         ├─────────────────────────────────────────────────────────┐
         │                                                          │
         ↓                                                          ↓
┌──────────────────────────┐                    ┌──────────────────────────┐
│  ElderlyContract (合同)   │                    │  ElderlyExpense (费用)   │
│  ├─ id                   │                    │  ├─ id                   │
│  ├─ contract_number      │                    │  ├─ elder_id             │
│  ├─ begin_time           │                    │  ├─ created_time         │
│  ├─ expire_time          │                    │  └─ ...                  │
│  ├─ contract_term        │                    │                          │
│  └─ ...                  │                    │  1:N                     │
└──────────────────────────┘                    │  ↓                       │
                                                │  ┌──────────────────────┐│
                                                │  │ExpenseItem (费用项)  ││
                                                │  │├─ id                 ││
                                                │  │├─ expense_id         ││
                                                │  │├─ item_category_id   ││
                                                │  │├─ type               ││
                                                │  │├─ amount             ││
                                                │  │└─ ...                ││
                                                │  └──────────────────────┘│
                                                └──────────────────────────┘
         │
         ├─────────────────────────────────────────────────────────┐
         │                                                          │
         ↓                                                          ↓
┌──────────────────────────────┐                ┌──────────────────────────┐
│  ExpenseOrder (账单)         │                │  DailyExpenses (日常开支)│
│  ├─ id                       │                │  ├─ id                   │
│  ├─ elder_id                 │                │  ├─ elder_id             │
│  ├─ billing_month            │                │  ├─ item_name            │
│  ├─ pay_status               │                │  ├─ amount               │
│  ├─ payable_amount           │                │  ├─ round_amount         │
│  ├─ actual_amount            │                │  ├─ type                 │
│  └─ ...                      │                │  └─ ...                  │
│                              │                │                          │
│  1:N                         │                │  1:N                     │
│  ↓                           │                │  ↓                       │
│  ┌──────────────────────────┐│                │  (关联)                  │
│  │ExpenseOrderItem (账单项) ││                │                          │
│  │├─ id                     ││                │                          │
│  │├─ expense_order_id       ││                │                          │
│  │├─ expense_source         ││                │                          │
│  │├─ source_expense_item_id ││                │                          │
│  │├─ total_amount           ││                │                          │
│  │├─ actual_price           ││                │                          │
│  │├─ pay_status             ││                │                          │
│  │└─ ...                    ││                │                          │
│  └──────────────────────────┘│                │                          │
└──────────────────────────────┘                └──────────────────────────┘
         │
         ├─────────────────────────────────────────────────────────┐
         │                                                          │
         ↓                                                          ↓
┌──────────────────────────┐                    ┌──────────────────────────┐
│  DepositRecord (押金)    │                    │  ElderlyBalance (余额)   │
│  ├─ id                   │                    │  ├─ id                   │
│  ├─ elder_id             │                    │  ├─ elder_id             │
│  ├─ deposit_amount       │                    │  ├─ amount               │
│  ├─ refund_amount        │                    │  └─ ...                  │
│  └─ ...                  │                    │                          │
└──────────────────────────┘                    └──────────────────────────┘

五、系统功能模块图

┌─────────────────────────────────────────────────────────────────┐
│                    养老院管理系统功能模块                         │
└─────────────────────────────────────────────────────────────────┘
         │
         ├─────────────────────────────────────────────────────────┐
         │                                                          │
         ↓                                                          ↓
┌──────────────────────────┐                    ┌──────────────────────────┐
│   长者管理模块           │                    │   合同管理模块           │
│  ├─ 长者信息维护         │                    │  ├─ 合同创建             │
│  ├─ 入住管理             │                    │  ├─ 合同续签             │
│  ├─ 退住管理             │                    │  ├─ 合同终止             │
│  ├─ 床位分配             │                    │  ├─ 合同查询             │
│  ├─ 护理等级             │                    │  └─ 合同统计             │
│  └─ 长者查询             │                    └──────────────────────────┘
└──────────────────────────┘
         │
         ├─────────────────────────────────────────────────────────┐
         │                                                          │
         ↓                                                          ↓
┌──────────────────────────┐                    ┌──────────────────────────┐
│   费用管理模块           │                    │   账单管理模块           │
│  ├─ 费用项维护           │                    │  ├─ 账单生成             │
│  ├─ 费用分类             │                    │  ├─ 账单查询             │
│  ├─ 费用统计             │                    │  ├─ 账单打印             │
│  ├─ 费用调整             │                    │  ├─ 缴费管理             │
│  └─ 费用查询             │                    │  ├─ 欠费管理             │
└──────────────────────────┘                    │  └─ 账单统计             │
         │                                       └──────────────────────────┘
         │
         ├─────────────────────────────────────────────────────────┐
         │                                                          │
         ↓                                                          ↓
┌──────────────────────────┐                    ┌──────────────────────────┐
│   日常开支模块           │                    │   押金管理模块           │
│  ├─ 开支录入             │                    │  ├─ 押金收取             │
│  ├─ 开支分类             │                    │  ├─ 押金退还             │
│  ├─ 开支统计             │                    │  ├─ 押金查询             │
│  ├─ 开支查询             │                    │  └─ 押金统计             │
│  └─ 开支导出             │                    └──────────────────────────┘
└──────────────────────────┘
         │
         ├─────────────────────────────────────────────────────────┐
         │                                                          │
         ↓                                                          ↓
┌──────────────────────────┐                    ┌──────────────────────────┐
│   员工管理模块           │                    │   设备管理模块           │
│  ├─ 员工信息             │                    │  ├─ 设备维护             │
│  ├─ 排班管理             │                    │  ├─ 设备监控             │
│  ├─ 考勤管理             │                    │  ├─ 设备告警             │
│  ├─ 薪资管理             │                    │  └─ 设备统计             │
│  └─ 员工查询             │                    └──────────────────────────┘
└──────────────────────────┘
         │
         ├─────────────────────────────────────────────────────────┐
         │                                                          │
         ↓                                                          ↓
┌──────────────────────────┐                    ┌──────────────────────────┐
│   工作流模块             │                    │   报表统计模块           │
│  ├─ 流程定义             │                    │  ├─ 收入统计             │
│  ├─ 流程监控             │                    │  ├─ 开支统计             │
│  ├─ 任务管理             │                    │  ├─ 长者统计             │
│  └─ 流程查询             │                    │  ├─ 占用率统计           │
└──────────────────────────┘                    │  └─ 自定义报表           │
                                                 └──────────────────────────┘

六、数据库表结构关系

elderly_info (长者信息表)
    │
    ├─ PK: id
    ├─ FK: tenant_id → tenant (租户)
    ├─ FK: bed_id → org_build_bed (床位)
    ├─ FK: build_id → org_build (建筑)
    │
    ├─ 1:N → elderly_contract (合同)
    │         ├─ PK: id
    │         ├─ FK: elder_id → elderly_info
    │         └─ 字段: contract_number, begin_time, expire_time, contract_term
    │
    ├─ 1:N → elderly_expense_order (账单)
    │         ├─ PK: id
    │         ├─ FK: elder_id → elderly_info
    │         ├─ 字段: billing_month, pay_status, payable_amount, actual_amount
    │         │
    │         └─ 1:N → elderly_expense_order_item (账单项)
    │                   ├─ PK: id
    │                   ├─ FK: expense_order_id → elderly_expense_order
    │                   ├─ 字段: expense_source, source_expense_item_id, total_amount
    │                   └─ 关联: ExpenseItem 或 DailyExpenses
    │
    ├─ 1:N → elderly_expense (费用)
    │         ├─ PK: id
    │         ├─ FK: elder_id → elderly_info
    │         │
    │         └─ 1:N → elderly_expense_item (费用项)
    │                   ├─ PK: id
    │                   ├─ FK: expense_id → elderly_expense
    │                   ├─ FK: item_category_id → sys_charge_category
    │                   └─ 字段: type, amount
    │
    ├─ 1:N → daily_expenses (日常开支)
    │         ├─ PK: id
    │         ├─ FK: elder_id → elderly_info
    │         └─ 字段: item_name, amount, round_amount, type
    │
    ├─ 1:N → deposit_record (押金)
    │         ├─ PK: id
    │         ├─ FK: elder_id → elderly_info
    │         └─ 字段: deposit_amount, refund_amount
    │
    ├─ 1:N → elderly_change_record (变更记录)
    │         ├─ PK: id
    │         ├─ FK: elder_id → elderly_info
    │         └─ 字段: change_type, change_content
    │
    ├─ 1:1 → elderly_balance (余额)
    │         ├─ PK: id
    │         ├─ FK: elder_id → elderly_info
    │         └─ 字段: amount
    │
    └─ 1:1 → elderly_expense_subsidy_account (补贴账户)
             ├─ PK: id
             ├─ FK: elder_id → elderly_info
             └─ 字段: amount

七、API接口层次结构

┌─────────────────────────────────────────────────────────────────┐
│                    API 接口层次结构                              │
└─────────────────────────────────────────────────────────────────┘

┌─ 长者管理 API ──────────────────────────────────────────────────┐
│ GET    /api/elderly/list              # 查询长者列表             │
│ GET    /api/elderly/{id}              # 查询长者详情             │
│ POST   /api/elderly/create            # 创建长者                 │
│ PUT    /api/elderly/update            # 更新长者                 │
│ DELETE /api/elderly/{id}              # 删除长者                 │
│ POST   /api/elderly/check-in          # 入住                     │
│ POST   /api/elderly/check-out         # 退住                     │
└─────────────────────────────────────────────────────────────────┘

┌─ 合同管理 API ──────────────────────────────────────────────────┐
│ GET    /api/contract/list             # 查询合同列表             │
│ GET    /api/contract/{id}             # 查询合同详情             │
│ POST   /api/contract/create           # 创建合同                 │
│ PUT    /api/contract/update           # 更新合同                 │
│ DELETE /api/contract/{id}             # 删除合同                 │
│ POST   /api/contract/renew            # 续签合同                 │
└─────────────────────────────────────────────────────────────────┘

┌─ 费用管理 API ──────────────────────────────────────────────────┐
│ GET    /api/expense/list              # 查询费用列表             │
│ GET    /api/expense/{id}              # 查询费用详情             │
│ POST   /api/expense/create            # 创建费用                 │
│ PUT    /api/expense/update            # 更新费用                 │
│ DELETE /api/expense/{id}              # 删除费用                 │
│ GET    /api/expense/statistics        # 费用统计                 │
└─────────────────────────────────────────────────────────────────┘

┌─ 账单管理 API ──────────────────────────────────────────────────┐
│ GET    /api/order/list                # 查询账单列表             │
│ GET    /api/order/{id}                # 查询账单详情             │
│ POST   /api/order/create              # 创建账单                 │
│ PUT    /api/order/update              # 更新账单                 │
│ DELETE /api/order/{id}                # 删除账单                 │
│ GET    /api/order/by-month            # 按月查询账单             │
│ GET    /api/order/total-by-month      # 按月查询总计             │
│ GET    /api/order/receivable-list     # 查询应收列表             │
│ GET    /api/order/receivable-total    # 查询应收总计【性能问题】 │
│ POST   /api/order/mark-paid           # 标记已缴费               │
└─────────────────────────────────────────────────────────────────┘

┌─ 日常开支 API ──────────────────────────────────────────────────┐
│ GET    /api/daily-expenses/list       # 查询开支列表             │
│ GET    /api/daily-expenses/{id}       # 查询开支详情             │
│ POST   /api/daily-expenses/create     # 创建开支                 │
│ PUT    /api/daily-expenses/update     # 更新开支                 │
│ DELETE /api/daily-expenses/{id}       # 删除开支                 │
│ GET    /api/daily-expenses/statistics # 开支统计                 │
└─────────────────────────────────────────────────────────────────┘

┌─ 押金管理 API ──────────────────────────────────────────────────┐
│ GET    /api/deposit/list              # 查询押金列表             │
│ GET    /api/deposit/{id}              # 查询押金详情             │
│ POST   /api/deposit/create            # 创建押金                 │
│ PUT    /api/deposit/update            # 更新押金                 │
│ DELETE /api/deposit/{id}              # 删除押金                 │
│ POST   /api/deposit/refund            # 退还押金                 │
└─────────────────────────────────────────────────────────────────┘

八、系统部署架构

┌─────────────────────────────────────────────────────────────────┐
│                      开发环境                                    │
│  ┌──────────────┬──────────────┬──────────────┐                 │
│  │  IDE         │  Git         │  Maven       │                 │
│  │  (IntelliJ)  │  (GitHub)    │  (3.8+)      │                 │
│  └──────────────┴──────────────┴──────────────┘                 │
└─────────────────────────────────────────────────────────────────┘
                         ↓
┌─────────────────────────────────────────────────────────────────┐
│                      测试环境                                    │
│  ┌──────────────┬──────────────┬──────────────┐                 │
│  │  JUnit       │  Mockito     │  H2 Database │                 │
│  │  (单元测试)  │  (Mock框架)  │  (内存数据库)│                 │
│  └──────────────┴──────────────┴──────────────┘                 │
└─────────────────────────────────────────────────────────────────┘
                         ↓
┌─────────────────────────────────────────────────────────────────┐
│                      生产环境                                    │
│  ┌────────────────────────────────────────────────────────────┐ │
│  │                    Nginx (反向代理)                        │ │
│  │                  :80 / :443 (HTTPS)                        │ │
│  └────────────────────────────────────────────────────────────┘ │
│                         ↓                                        │
│  ┌────────────────────────────────────────────────────────────┐ │
│  │                 负载均衡器 (可选)                           │ │
│  │              (Nginx / HAProxy / F5)                        │ │
│  └────────────────────────────────────────────────────────────┘ │
│                         ↓                                        │
│  ┌────────────────────────────────────────────────────────────┐ │
│  │              Spring Boot 应用集群                          │ │
│  │  ┌──────────────┬──────────────┬──────────────┐            │ │
│  │  │  Instance 1  │  Instance 2  │  Instance N  │            │ │
│  │  │  :8080       │  :8081       │  :808N       │            │ │
│  │  └──────────────┴──────────────┴──────────────┘            │ │
│  └────────────────────────────────────────────────────────────┘ │
│                         ↓                                        │
│  ┌────────────────────────────────────────────────────────────┐ │
│  │                   数据持久化层                             │ │
│  │  ┌──────────────┬──────────────┬──────────────┐            │ │
│  │  │  MySQL       │  Redis       │  Elasticsearch           │ │
│  │  │  (主从)      │  (集群)      │  (可选)      │            │ │
│  │  └──────────────┴──────────────┴──────────────┘            │ │
│  └────────────────────────────────────────────────────────────┘ │
│                         ↓                                        │
│  ┌────────────────────────────────────────────────────────────┐ │
│  │                   备份与监控                               │ │
│  │  ┌──────────────┬──────────────┬──────────────┐            │ │
│  │  │  备份系统    │  监控系统    │  日志系统    │            │ │
│  │  │  (定时备份)  │  (Prometheus)│  (ELK Stack) │            │ │
│  │  └──────────────┴──────────────┴──────────────┘            │ │
│  └────────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘

九、请求处理流程

┌─────────────────────────────────────────────────────────────────┐
│                    HTTP 请求处理流程                             │
└─────────────────────────────────────────────────────────────────┘

1. 请求到达
   ↓
   Client 发送 HTTP 请求
   GET /api/order/receivable-total?year=2024&tenantId=1
   ↓

2. 网关层
   ↓
   Nginx 接收请求
   ├─ SSL/TLS 解密 (如果是HTTPS)
   ├─ 请求路由
   ├─ 负载均衡
   └─ 请求转发到应用
   ↓

3. Spring Boot 应用
   ↓
   DispatcherServlet 接收请求
   ↓

4. 过滤器链
   ↓
   ├─ CharacterEncodingFilter (字符编码)
   ├─ CorsFilter (跨域处理)
   ├─ SecurityFilter (安全过滤)
   └─ 其他自定义过滤器
   ↓

5. 拦截器链
   ↓
   ├─ PreHandle (前置处理)
   │  ├─ 权限验证
   │  ├─ 租户隔离
   │  └─ 日志记录
   ├─ PostHandle (后置处理)
   └─ AfterCompletion (完成处理)
   ↓

6. 控制器处理
   ↓
   OrderController.getOrderReceivableTotal()
   ├─ 参数验证 (@Valid)
   ├─ 权限检查 (@PreAuthorize)
   ├─ 租户隔离 (TenantContext)
   └─ 调用业务层
   ↓

7. 业务层处理
   ↓
   OrderApiImpl.getOrderReceivableTotal()
   ├─ 业务逻辑处理
   ├─ 数据库查询
   ├─ 数据组装
   └─ 返回结果
   ↓

8. 数据访问层
   ↓
   ExpenseOrderMapper.selectListByYear()
   ├─ SQL 构建
   ├─ 参数绑定
   ├─ 数据库执行
   └─ 结果映射
   ↓

9. 数据库操作
   ↓
   MySQL 执行 SQL 查询
   ├─ 查询优化
   ├─ 索引使用
   ├─ 缓存查询
   └─ 返回结果集
   ↓

10. 响应处理
    ↓
    ├─ 数据转换 (DO → VO)
    ├─ 序列化 (Object → JSON)
    ├─ 响应头设置
    └─ 返回给客户端
    ↓

11. 客户端接收
    ↓
    {
      "code": 0,
      "msg": "success",
      "data": {
        "billingMonth": "2024年12月",
        "totalAmount": 28000.00,
        ...
      }
    }

十、缓存策略

┌─────────────────────────────────────────────────────────────────┐
│                      缓存分层策略                                │
└─────────────────────────────────────────────────────────────────┘

┌─ 一级缓存 (本地缓存) ─────────────────────────────────────────┐
│ 位置: 应用内存                                                  │
│ 工具: Guava Cache / Caffeine                                   │
│ 特点: 速度快,但不支持分布式                                    │
│ 使用场景:                                                       │
│   ├─ 字典数据缓存                                               │
│   ├─ 配置信息缓存                                               │
│   └─ 热点数据缓存                                               │
│ TTL: 5-30 分钟                                                  │
└─────────────────────────────────────────────────────────────────┘
                         ↓
┌─ 二级缓存 (分布式缓存) ───────────────────────────────────────┐
│ 位置: Redis 服务器                                              │
│ 工具: Spring Data Redis                                         │
│ 特点: 支持分布式,速度快                                        │
│ 使用场景:                                                       │
│   ├─ 用户会话缓存                                               │
│   ├─ 权限数据缓存                                               │
│   ├─ 账单数据缓存                                               │
│   └─ 统计数据缓存                                               │
│ TTL: 30 分钟 - 1 小时                                           │
│ 缓存键设计:                                                     │
│   ├─ order:receivable:total:{year}:{tenantId}                  │
│   ├─ order:list:{month}:{tenantId}                             │
│   └─ elderly:info:{elderId}                                    │
└─────────────────────────────────────────────────────────────────┘
                         ↓
┌─ 三级缓存 (数据库缓存) ───────────────────────────────────────┐
│ 位置: MySQL 数据库                                              │
│ 工具: MyBatis 查询缓存                                          │
│ 特点: 持久化存储                                                │
│ 使用场景:                                                       │
│   ├─ 所有业务数据                                               │
│   └─ 历史数据                                                   │
│ TTL: 永久存储                                                   │
└─────────────────────────────────────────────────────────────────┘

缓存更新策略:
├─ Cache-Aside (旁路缓存)
│  ├─ 读: 先查缓存,缓存未命中则查数据库,更新缓存
│  └─ 写: 先更新数据库,再删除缓存
│
├─ Write-Through (写穿)
│  ├─ 读: 先查缓存,缓存未命中则查数据库
│  └─ 写: 同时更新缓存和数据库
│
└─ Write-Behind (写回)
   ├─ 读: 先查缓存,缓存未命中则查数据库
   └─ 写: 先更新缓存,异步更新数据库

十一、监控与告警

┌─────────────────────────────────────────────────────────────────┐
│                    监控与告警体系                                │
└─────────────────────────────────────────────────────────────────┘

┌─ 应用监控 ────────────────────────────────────────────────────┐
│ 工具: Spring Boot Actuator + Prometheus + Grafana              │
│ 指标:                                                           │
│   ├─ JVM 内存使用率                                             │
│   ├─ 线程数                                                     │
│   ├─ GC 频率                                                    │
│   ├─ HTTP 请求数                                               │
│   ├─ 请求响应时间                                               │
│   ├─ 错误率                                                     │
│   └─ 业务指标                                                   │
│       ├─ 账单生成数                                             │
│       ├─ 缴费成功率                                             │
│       └─ 应收总额                                               │
└─────────────────────────────────────────────────────────────────┘

┌─ 数据库监控 ──────────────────────────────────────────────────┐
│ 工具: MySQL Slow Query Log + pt-query-digest                   │
│ 指标:                                                           │
│   ├─ 慢查询日志                                                 │
│   ├─ 查询执行时间                                               │
│   ├─ 连接数                                                     │
│   ├─ 锁等待时间                                                 │
│   └─ 复制延迟                                                   │
└─────────────────────────────────────────────────────────────────┘

┌─ 缓存监控 ────────────────────────────────────────────────────┐
│ 工具: Redis Info + Redis Exporter                              │
│ 指标:                                                           │
│   ├─ 缓存命中率                                                 │
│   ├─ 缓存大小                                                   │
│   ├─ 过期键数                                                   │
│   ├─ 连接数                                                     │
│   └─ 内存使用率                                                 │
└─────────────────────────────────────────────────────────────────┘

┌─ 日志监控 ────────────────────────────────────────────────────┐
│ 工具: ELK Stack (Elasticsearch + Logstash + Kibana)            │
│ 日志类型:                                                       │
│   ├─ 应用日志 (INFO, WARN, ERROR)                              │
│   ├─ 访问日志 (HTTP 请求)                                      │
│   ├─ 审计日志 (用户操作)                                        │
│   └─ 业务日志 (关键业务操作)                                    │
└─────────────────────────────────────────────────────────────────┘

告警规则:
├─ CPU 使用率 > 80% → 告警
├─ 内存使用率 > 85% → 告警
├─ 磁盘使用率 > 90% → 告警
├─ 数据库连接数 > 80% → 告警
├─ 慢查询 > 1s → 告警
├─ 错误率 > 1% → 告警
├─ 缓存命中率 < 70% → 告警
└─ 应用响应时间 > 1s → 告警

文档生成时间: 2025-12-08 文档版本: 1.0 作者: AI Assistant