┌─────────────────────────────────────────────────────────────────────┐
│ 前端应用层 │
│ ┌──────────────┬──────────────┬──────────────┬──────────────┐ │
│ │ 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 (主应用 - 容器)
└─ 依赖所有上述模块
┌─────────────────────────────────────────────────────────────────┐
│ 前端请求: 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%" │
│ } │
└─────────────────────────────────────────────────────────────────┘
【当前实现】- 性能问题
┌──────────────────────────────────────────────────────────────┐
│ 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 ──────────────────────────────────────────────────┐
│ 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