# 福建水务营收系统数据库设计文档
## 文档信息
| 项目信息 | 详情 |
|---------|------|
| **项目名称** | 福建水务营收系统 |
| **文档类型** | 概要设计文档 |
| **技术框架** | RuoYi-Vue-Pro + yudao-ui-admin-vue3 |
| **文档版本** | v1.0 |
| **编写日期** | 2024-12-19 |
| **文档状态** | ✅ 已完成 |
## 目录
- [数据库设计概述](#数据库设计概述)
- [数据库架构](#数据库架构)
- [核心数据模型设计](#核心数据模型设计)
- [数据表结构设计](#数据表结构设计)
- [索引与性能优化](#索引与性能优化)
- [数据安全设计](#数据安全设计)
## 数据库设计概述
福建水务营收系统采用**华为OpenGauss 5.0+**数据库,基于RuoYi-Vue-Pro框架规范设计。OpenGauss作为国产自主可控的企业级数据库,具有高性能、高可用、高安全的特点,完全满足水务行业对数据安全和国产化的要求。
### 设计目标
- 支持100万客户的业务量,满足3-5年业务发展需求
- 支持200并发用户,50并发移动设备
- 系统响应时间不超过3秒
- 数据安全等保三级要求
- 支持多租户数据隔离
- **国产化要求**:符合国产数据库替代要求
### 数据库选型优势
- **国产自主可控**:华为OpenGauss是完全自主知识产权的数据库
- **高性能**:优化的SQL引擎,查询性能优于传统数据库20-30%
- **高可用**:支持主备同步、读写分离、故障自动切换
- **安全可信**:内置数据加密、审计、权限管控等安全特性
- **生态兼容**:兼容PostgreSQL/MySQL协议,迁移成本低
### 设计原则
- **标准化**:遵循OpenGauss数据库设计规范
- **多租户**:基于tenant_id字段实现数据隔离
- **可扩展**:预留扩展字段,支持业务增长
- **高性能**:合理设计索引,优化查询性能
- **安全性**:利用OpenGauss内置安全特性
## 数据库架构
### 数据库架构图
```mermaid
graph TB
subgraph "应用层"
APP[Water Biz Application
RuoYi-Vue-Pro]
end
subgraph "数据访问层"
MP[MyBatis Plus
ORM框架]
CACHE[Redis缓存
热点数据]
end
subgraph "数据存储层"
subgraph "OpenGauss主从集群"
MASTER[(OpenGauss主库
读写)]
SLAVE[(OpenGauss从库
只读)]
end
subgraph "业务数据库"
DB_CUSTOMER[(客户数据库
Customer DB)]
DB_BILLING[(营收数据库
Billing DB)]
DB_METER[(表务数据库
Meter DB)]
DB_SYSTEM[(系统数据库
System DB)]
end
subgraph "数据归档"
DB_HISTORY[(历史数据库
Archive DB)]
BACKUP[(备份存储
Backup Storage)]
end
end
APP --> MP
APP --> CACHE
MP --> MASTER
MASTER --> SLAVE
MASTER --> DB_CUSTOMER
MASTER --> DB_BILLING
MASTER --> DB_METER
MASTER --> DB_SYSTEM
SLAVE --> DB_HISTORY
MASTER --> BACKUP
```
### 多租户架构设计
```mermaid
graph TB
subgraph "多租户数据隔离"
TENANT1[租户1: 福建水务集团]
TENANT2[租户2: 厦门分公司]
TENANT3[租户3: 泉州分公司]
end
subgraph "共享数据库"
subgraph "业务表结构"
TABLE1[water_customer
+ tenant_id]
TABLE2[water_meter
+ tenant_id]
TABLE3[water_bill
+ tenant_id]
TABLE4[water_payment
+ tenant_id]
end
subgraph "租户隔离机制"
INTERCEPTOR[MyBatis Plus
多租户拦截器]
FILTER[数据权限过滤器]
end
end
TENANT1 --> INTERCEPTOR
TENANT2 --> INTERCEPTOR
TENANT3 --> INTERCEPTOR
INTERCEPTOR --> FILTER
FILTER --> TABLE1
FILTER --> TABLE2
FILTER --> TABLE3
FILTER --> TABLE4
```
### 通用字段设计
所有业务表统一包含以下基础字段:
| 字段名 | 数据类型 | 长度 | 描述 |
|-------|---------|------|-----|
| id | BIGINT | - | 主键ID |
| tenant_id | BIGINT | - | 租户ID(多租户隔离) |
| creator | VARCHAR | 64 | 创建者 |
| create_time | DATETIME | - | 创建时间 |
| updater | VARCHAR | 64 | 更新者 |
| update_time | DATETIME | - | 更新时间 |
| deleted | BIT | 1 | 逻辑删除标识 |
## 核心数据模型设计
### 客户管理模块ER图
```mermaid
erDiagram
WATER_CUSTOMER {
bigint id PK "主键ID"
varchar customer_code UK "客户编号"
varchar customer_name "客户名称"
varchar customer_type "客户类型"
varchar id_type "证件类型"
varchar id_number "证件号码"
varchar phone "联系电话"
varchar address "详细地址"
varchar area_code "行政区划代码"
tinyint status "状态"
bigint tenant_id "租户ID"
varchar creator "创建者"
datetime create_time "创建时间"
varchar updater "更新者"
datetime update_time "更新时间"
tinyint deleted "是否删除"
}
WATER_METER {
bigint id PK "主键ID"
varchar meter_code UK "水表编号"
varchar meter_no "水表表号"
varchar meter_type "水表类型"
varchar meter_model "水表型号"
varchar meter_caliber "水表口径"
date install_date "安装日期"
varchar install_position "安装位置"
decimal initial_reading "初始读数"
decimal current_reading "当前读数"
varchar reading_cycle "抄表周期"
varchar book_code "册本编号"
tinyint status "状态"
bigint customer_id FK "客户ID"
bigint tenant_id "租户ID"
varchar creator "创建者"
datetime create_time "创建时间"
varchar updater "更新者"
datetime update_time "更新时间"
tinyint deleted "是否删除"
}
WATER_CUSTOMER_ACCOUNT {
bigint id PK "主键ID"
decimal balance "账户余额"
decimal credit_amount "信用额度"
date last_payment_date "最近缴费日期"
tinyint status "账户状态"
bigint customer_id FK "客户ID"
bigint tenant_id "租户ID"
varchar creator "创建者"
datetime create_time "创建时间"
varchar updater "更新者"
datetime update_time "更新时间"
tinyint deleted "是否删除"
}
WATER_CUSTOMER ||--o{ WATER_METER : "拥有"
WATER_CUSTOMER ||--|| WATER_CUSTOMER_ACCOUNT : "对应"
```
### 营收管理模块ER图
```mermaid
erDiagram
WATER_METER_READING {
bigint id PK "主键ID"
varchar reading_code UK "抄表记录编号"
date reading_date "抄表日期"
decimal reading_value "抄表读数"
decimal prev_reading_value "上次读数"
decimal water_usage "用水量"
varchar reading_type "抄表类型"
varchar reader_id "抄表员ID"
varchar remark "备注"
tinyint status "状态"
bigint meter_id FK "水表ID"
bigint tenant_id "租户ID"
varchar creator "创建者"
datetime create_time "创建时间"
varchar updater "更新者"
datetime update_time "更新时间"
tinyint deleted "是否删除"
}
WATER_BILL {
bigint id PK "主键ID"
varchar bill_code UK "账单编号"
varchar bill_month "账期"
decimal water_usage "用水量"
decimal water_fee "水费金额"
decimal sewage_fee "污水处理费"
decimal other_fee "其他费用"
decimal total_amount "总金额"
date due_date "缴费截止日期"
tinyint bill_status "账单状态"
bigint customer_id FK "客户ID"
bigint meter_id FK "水表ID"
bigint reading_id FK "抄表记录ID"
bigint tenant_id "租户ID"
varchar creator "创建者"
datetime create_time "创建时间"
varchar updater "更新者"
datetime update_time "更新时间"
tinyint deleted "是否删除"
}
WATER_PAYMENT {
bigint id PK "主键ID"
varchar payment_code UK "缴费记录编号"
varchar payment_type "缴费类型"
varchar payment_channel "缴费渠道"
decimal payment_amount "缴费金额"
datetime payment_time "缴费时间"
varchar transaction_no "交易流水号"
varchar operator_id "操作员ID"
varchar remark "备注"
tinyint payment_status "缴费状态"
bigint bill_id FK "账单ID"
bigint customer_id FK "客户ID"
bigint tenant_id "租户ID"
varchar creator "创建者"
datetime create_time "创建时间"
varchar updater "更新者"
datetime update_time "更新时间"
tinyint deleted "是否删除"
}
WATER_METER_READING ||--|| WATER_BILL : "生成"
WATER_BILL ||--o{ WATER_PAYMENT : "对应"
```
### 表务管理模块ER图
```mermaid
erDiagram
WATER_METER_ARCHIVE {
bigint id PK "主键ID"
varchar archive_code UK "档案编号"
varchar manufacturer "生产厂家"
date production_date "生产日期"
int valid_period "有效期(月)"
date verification_date "检定日期"
date next_verification_date "下次检定日期"
varchar certificate_no "检定证书号"
tinyint archive_status "档案状态"
bigint meter_id FK "水表ID"
bigint tenant_id "租户ID"
varchar creator "创建者"
datetime create_time "创建时间"
varchar updater "更新者"
datetime update_time "更新时间"
tinyint deleted "是否删除"
}
WATER_METER_WORKORDER {
bigint id PK "主键ID"
varchar workorder_code UK "工单编号"
varchar workorder_type "工单类型"
varchar workorder_status "工单状态"
date apply_date "申请日期"
date plan_date "计划执行日期"
date execute_date "实际执行日期"
varchar applicant_id "申请人ID"
varchar executor_id "执行人ID"
varchar reason "申请原因"
varchar result "执行结果"
bigint meter_id FK "水表ID"
bigint customer_id FK "客户ID"
bigint tenant_id "租户ID"
varchar creator "创建者"
datetime create_time "创建时间"
varchar updater "更新者"
datetime update_time "更新时间"
tinyint deleted "是否删除"
}
WATER_METER_STOCK {
bigint id PK "主键ID"
varchar stock_code UK "库存编号"
varchar warehouse_code "仓库编码"
varchar warehouse_name "仓库名称"
int stock_quantity "库存数量"
int min_stock "最小库存"
int max_stock "最大库存"
varchar meter_model "水表型号"
varchar meter_caliber "水表口径"
tinyint stock_status "库存状态"
bigint tenant_id "租户ID"
varchar creator "创建者"
datetime create_time "创建时间"
varchar updater "更新者"
datetime update_time "更新时间"
tinyint deleted "是否删除"
}
WATER_METER ||--|| WATER_METER_ARCHIVE : "对应"
WATER_METER ||--o{ WATER_METER_WORKORDER : "产生"
```
### 系统管理模块ER图
```mermaid
erDiagram
SYSTEM_TENANT {
bigint id PK "主键ID"
varchar tenant_name "租户名称"
varchar tenant_code UK "租户编码"
varchar contact_name "联系人"
varchar contact_phone "联系电话"
varchar contact_email "联系邮箱"
tinyint tenant_status "租户状态"
datetime expire_time "过期时间"
varchar domain "域名"
varchar package_name "套餐名称"
int user_count "用户数量"
varchar creator "创建者"
datetime create_time "创建时间"
varchar updater "更新者"
datetime update_time "更新时间"
tinyint deleted "是否删除"
}
SYSTEM_USERS {
bigint id PK "主键ID"
varchar username UK "用户名"
varchar password "密码"
varchar nickname "昵称"
varchar remark "备注"
varchar dept_id "部门ID"
varchar post_ids "岗位ID列表"
varchar email "邮箱"
varchar mobile "手机号"
tinyint sex "性别"
varchar avatar "头像"
tinyint status "状态"
datetime login_date "最后登录时间"
varchar login_ip "最后登录IP"
bigint tenant_id "租户ID"
varchar creator "创建者"
datetime create_time "创建时间"
varchar updater "更新者"
datetime update_time "更新时间"
tinyint deleted "是否删除"
}
SYSTEM_TENANT ||--o{ SYSTEM_USERS : "包含"
```
## 核心数据表设计
### 表务管理模块ER图
```mermaid
erDiagram
WATER_METER_WORKORDER {
bigint id PK "主键ID"
varchar workorder_code UK "工单编号"
varchar workorder_type "工单类型"
varchar workorder_status "工单状态"
date apply_date "申请日期"
date plan_date "计划执行日期"
date execute_date "实际执行日期"
varchar applicant_id "申请人ID"
varchar executor_id "执行人ID"
varchar reason "申请原因"
varchar result "执行结果"
bigint meter_id FK "水表ID"
bigint customer_id FK "客户ID"
bigint tenant_id "租户ID"
}
WATER_METER_STOCK {
bigint id PK "主键ID"
varchar stock_code UK "库存编号"
varchar meter_brand "水表品牌"
varchar meter_model "水表型号"
varchar meter_caliber "水表口径"
int stock_quantity "库存数量"
int min_stock "最小库存"
decimal unit_price "单价"
varchar warehouse_location "仓库位置"
tinyint stock_status "库存状态"
bigint tenant_id "租户ID"
}
WATER_METER_INVENTORY {
bigint id PK "主键ID"
varchar inventory_code UK "出入库编号"
varchar inventory_type "出入库类型"
int quantity "数量"
decimal unit_price "单价"
decimal total_amount "总金额"
varchar operator_id "操作员ID"
datetime operation_time "操作时间"
varchar remark "备注"
bigint stock_id FK "库存ID"
bigint workorder_id FK "工单ID"
bigint tenant_id "租户ID"
}
WATER_METER ||--o{ WATER_METER_WORKORDER : "生成"
WATER_METER_STOCK ||--o{ WATER_METER_INVENTORY : "出入库"
WATER_METER_WORKORDER ||--o{ WATER_METER_INVENTORY : "关联"
```
### 系统管理模块ER图
```mermaid
erDiagram
WATER_DICT_TYPE {
bigint id PK "主键ID"
varchar dict_name "字典名称"
varchar dict_type UK "字典类型"
varchar remark "备注"
tinyint status "状态"
bigint tenant_id "租户ID"
}
WATER_DICT_DATA {
bigint id PK "主键ID"
varchar dict_type "字典类型"
varchar dict_label "字典标签"
varchar dict_value "字典键值"
int dict_sort "字典排序"
varchar color_type "颜色类型"
varchar css_class "CSS类名"
varchar remark "备注"
tinyint status "状态"
bigint tenant_id "租户ID"
}
WATER_CONFIG {
bigint id PK "主键ID"
varchar config_name "参数名称"
varchar config_key UK "参数键名"
varchar config_value "参数键值"
varchar config_type "系统内置"
varchar remark "备注"
bigint tenant_id "租户ID"
}
WATER_PRICE_CONFIG {
bigint id PK "主键ID"
varchar price_name "水价名称"
varchar customer_type "客户类型"
varchar price_type "价格类型"
decimal base_price "基础价格"
decimal sewage_price "污水处理费"
decimal garbage_price "垃圾处理费"
date effective_date "生效日期"
date expire_date "失效日期"
tinyint status "状态"
bigint tenant_id "租户ID"
}
WATER_DICT_TYPE ||--o{ WATER_DICT_DATA : "包含"
```
## 数据表结构设计
### 客户管理相关表
#### 客户基本信息表 (water_customer)
| 字段名 | 数据类型 | 长度 | 主键 | 非空 | 默认值 | 说明 |
|-------|---------|------|------|------|--------|------|
| id | BIGINT | - | Y | Y | AUTO_INCREMENT | 主键ID |
| customer_code | VARCHAR | 32 | - | Y | - | 客户编号 |
| customer_name | VARCHAR | 100 | - | Y | - | 客户名称 |
| customer_type | VARCHAR | 20 | - | Y | - | 客户类型 |
| id_type | VARCHAR | 20 | - | N | NULL | 证件类型 |
| id_number | VARCHAR | 30 | - | N | NULL | 证件号码 |
| phone | VARCHAR | 20 | - | N | NULL | 联系电话 |
| mobile | VARCHAR | 20 | - | N | NULL | 手机号码 |
| email | VARCHAR | 100 | - | N | NULL | 邮箱 |
| address | VARCHAR | 500 | - | N | NULL | 详细地址 |
| area_code | VARCHAR | 20 | - | N | NULL | 行政区划代码 |
| status | TINYINT | - | - | Y | 1 | 状态(0:停用,1:正常,2:欠费,3:销户) |
| tenant_id | BIGINT | - | - | Y | 0 | 租户ID |
#### 水表信息表 (water_meter)
| 字段名 | 数据类型 | 长度 | 主键 | 非空 | 默认值 | 说明 |
|-------|---------|------|------|------|--------|------|
| id | BIGINT | - | Y | Y | AUTO_INCREMENT | 主键ID |
| meter_code | VARCHAR | 32 | - | Y | - | 水表编号 |
| meter_no | VARCHAR | 30 | - | N | NULL | 水表表号 |
| meter_type | VARCHAR | 20 | - | Y | - | 水表类型 |
| meter_model | VARCHAR | 50 | - | N | NULL | 水表型号 |
| meter_caliber | VARCHAR | 10 | - | N | NULL | 水表口径 |
| manufacturer | VARCHAR | 100 | - | N | NULL | 生产厂家 |
| install_date | DATE | - | - | N | NULL | 安装日期 |
| install_position | VARCHAR | 500 | - | N | NULL | 安装位置 |
| initial_reading | DECIMAL | 10,2 | - | Y | 0.00 | 初始读数 |
| current_reading | DECIMAL | 10,2 | - | Y | 0.00 | 当前读数 |
| reading_cycle | VARCHAR | 20 | - | Y | MONTHLY | 抄表周期 |
| book_code | VARCHAR | 32 | - | N | NULL | 册本编号 |
| meter_status | TINYINT | - | - | Y | 1 | 水表状态 |
| customer_id | BIGINT | - | - | Y | - | 客户ID |
| tenant_id | BIGINT | - | - | Y | 0 | 租户ID |
#### 客户账户表 (water_customer_account)
| 字段名 | 数据类型 | 长度 | 主键 | 非空 | 默认值 | 说明 |
|-------|---------|------|------|------|--------|------|
| id | BIGINT | - | Y | Y | AUTO_INCREMENT | 主键ID |
| account_code | VARCHAR | 32 | - | Y | - | 账户编号 |
| balance | DECIMAL | 12,2 | - | Y | 0.00 | 账户余额 |
| credit_amount | DECIMAL | 12,2 | - | N | 0.00 | 信用额度 |
| deposit_amount | DECIMAL | 12,2 | - | N | 0.00 | 保证金 |
| frozen_amount | DECIMAL | 12,2 | - | N | 0.00 | 冻结金额 |
| last_payment_date | DATE | - | - | N | NULL | 最近缴费日期 |
| arrears_amount | DECIMAL | 12,2 | - | N | 0.00 | 欠费金额 |
| account_status | TINYINT | - | - | Y | 1 | 账户状态 |
| customer_id | BIGINT | - | - | Y | - | 客户ID |
| tenant_id | BIGINT | - | - | Y | 0 | 租户ID |
### 营收管理相关表
#### 抄表记录表 (water_meter_reading)
| 字段名 | 数据类型 | 长度 | 主键 | 非空 | 默认值 | 说明 |
|-------|---------|------|------|------|--------|------|
| id | BIGINT | - | Y | Y | AUTO_INCREMENT | 主键ID |
| reading_code | VARCHAR | 32 | - | Y | - | 抄表记录编号 |
| reading_date | DATE | - | - | Y | - | 抄表日期 |
| reading_value | DECIMAL | 10,2 | - | Y | - | 抄表读数 |
| prev_reading_value | DECIMAL | 10,2 | - | N | NULL | 上次读数 |
| water_usage | DECIMAL | 10,2 | - | Y | 0.00 | 用水量 |
| reading_type | VARCHAR | 20 | - | Y | - | 抄表类型 |
| reader_id | VARCHAR | 20 | - | N | NULL | 抄表员ID |
| reading_status | TINYINT | - | - | Y | 0 | 状态 |
| meter_id | BIGINT | - | - | Y | - | 水表ID |
| customer_id | BIGINT | - | - | Y | - | 客户ID |
| tenant_id | BIGINT | - | - | Y | 0 | 租户ID |
#### 水费账单表 (water_bill)
| 字段名 | 数据类型 | 长度 | 主键 | 非空 | 默认值 | 说明 |
|-------|---------|------|------|------|--------|------|
| id | BIGINT | - | Y | Y | AUTO_INCREMENT | 主键ID |
| bill_code | VARCHAR | 32 | - | Y | - | 账单编号 |
| bill_month | VARCHAR | 7 | - | Y | - | 账期 |
| bill_date | DATE | - | - | Y | - | 开账日期 |
| water_usage | DECIMAL | 10,2 | - | Y | 0.00 | 用水量 |
| water_fee | DECIMAL | 10,2 | - | Y | 0.00 | 水费金额 |
| sewage_fee | DECIMAL | 10,2 | - | N | 0.00 | 污水处理费 |
| other_fee | DECIMAL | 10,2 | - | N | 0.00 | 其他费用 |
| total_amount | DECIMAL | 10,2 | - | Y | 0.00 | 总金额 |
| due_date | DATE | - | - | Y | - | 缴费截止日期 |
| bill_status | TINYINT | - | - | Y | 0 | 账单状态 |
| customer_id | BIGINT | - | - | Y | - | 客户ID |
| meter_id | BIGINT | - | - | Y | - | 水表ID |
| reading_id | BIGINT | - | - | N | NULL | 抄表记录ID |
| tenant_id | BIGINT | - | - | Y | 0 | 租户ID |
#### 缴费记录表 (water_payment)
| 字段名 | 数据类型 | 长度 | 主键 | 非空 | 默认值 | 说明 |
|-------|---------|------|------|------|--------|------|
| id | BIGINT | - | Y | Y | AUTO_INCREMENT | 主键ID |
| payment_code | VARCHAR | 32 | - | Y | - | 缴费记录编号 |
| payment_type | VARCHAR | 20 | - | Y | - | 缴费类型 |
| payment_channel | VARCHAR | 20 | - | Y | - | 缴费渠道 |
| payment_amount | DECIMAL | 10,2 | - | Y | - | 缴费金额 |
| payment_time | DATETIME | - | - | Y | - | 缴费时间 |
| transaction_no | VARCHAR | 50 | - | N | NULL | 交易流水号 |
| operator_id | VARCHAR | 20 | - | N | NULL | 操作员ID |
| payment_status | TINYINT | - | - | Y | 1 | 缴费状态 |
| bill_id | BIGINT | - | - | N | NULL | 账单ID |
| customer_id | BIGINT | - | - | Y | - | 客户ID |
| tenant_id | BIGINT | - | - | Y | 0 | 租户ID |
### 表务管理相关表
#### 水表档案表 (water_meter_archive)
| 字段名 | 数据类型 | 长度 | 主键 | 非空 | 默认值 | 说明 |
|-------|---------|------|------|------|--------|------|
| id | BIGINT | - | Y | Y | AUTO_INCREMENT | 主键ID |
| archive_code | VARCHAR | 32 | - | Y | - | 档案编号 |
| manufacturer | VARCHAR | 100 | - | N | NULL | 生产厂家 |
| production_date | DATE | - | - | N | NULL | 生产日期 |
| valid_period | INT | - | - | N | 72 | 有效期(月) |
| verification_date | DATE | - | - | N | NULL | 检定日期 |
| next_verification_date | DATE | - | - | N | NULL | 下次检定日期 |
| certificate_no | VARCHAR | 50 | - | N | NULL | 检定证书号 |
| archive_status | TINYINT | - | - | Y | 1 | 档案状态 |
| meter_id | BIGINT | - | - | Y | - | 水表ID |
| tenant_id | BIGINT | - | - | Y | 0 | 租户ID |
#### 表务工单表 (water_meter_workorder)
| 字段名 | 数据类型 | 长度 | 主键 | 非空 | 默认值 | 说明 |
|-------|---------|------|------|------|--------|------|
| id | BIGINT | - | Y | Y | AUTO_INCREMENT | 主键ID |
| workorder_code | VARCHAR | 32 | - | Y | - | 工单编号 |
| workorder_type | VARCHAR | 20 | - | Y | - | 工单类型 |
| workorder_status | VARCHAR | 20 | - | Y | PENDING | 工单状态 |
| apply_date | DATE | - | - | Y | - | 申请日期 |
| plan_date | DATE | - | - | N | NULL | 计划执行日期 |
| execute_date | DATE | - | - | N | NULL | 实际执行日期 |
| applicant_id | VARCHAR | 20 | - | N | NULL | 申请人ID |
| executor_id | VARCHAR | 20 | - | N | NULL | 执行人ID |
| reason | VARCHAR | 500 | - | N | NULL | 申请原因 |
| result | VARCHAR | 500 | - | N | NULL | 执行结果 |
| meter_id | BIGINT | - | - | Y | - | 水表ID |
| customer_id | BIGINT | - | - | Y | - | 客户ID |
| tenant_id | BIGINT | - | - | Y | 0 | 租户ID |
#### 水表库存表 (water_meter_stock)
| 字段名 | 数据类型 | 长度 | 主键 | 非空 | 默认值 | 说明 |
|-------|---------|------|------|------|--------|------|
| id | BIGINT | - | Y | Y | AUTO_INCREMENT | 主键ID |
| stock_code | VARCHAR | 32 | - | Y | - | 库存编号 |
| meter_brand | VARCHAR | 50 | - | Y | - | 水表品牌 |
| meter_model | VARCHAR | 50 | - | Y | - | 水表型号 |
| meter_caliber | VARCHAR | 10 | - | Y | - | 水表口径 |
| stock_quantity | INT | - | - | Y | 0 | 库存数量 |
| min_stock | INT | - | - | Y | 0 | 最小库存 |
| unit_price | DECIMAL | 10,2 | - | N | NULL | 单价 |
| warehouse_location | VARCHAR | 100 | - | N | NULL | 仓库位置 |
| stock_status | TINYINT | - | - | Y | 1 | 库存状态 |
| tenant_id | BIGINT | - | - | Y | 0 | 租户ID |
### 系统管理相关表
#### 数据字典类型表 (water_dict_type)
| 字段名 | 数据类型 | 长度 | 主键 | 非空 | 默认值 | 说明 |
|-------|---------|------|------|------|--------|------|
| id | BIGINT | - | Y | Y | AUTO_INCREMENT | 主键ID |
| dict_name | VARCHAR | 100 | - | Y | - | 字典名称 |
| dict_type | VARCHAR | 100 | - | Y | - | 字典类型 |
| remark | VARCHAR | 500 | - | N | NULL | 备注 |
| status | TINYINT | - | - | Y | 1 | 状态 |
| tenant_id | BIGINT | - | - | Y | 0 | 租户ID |
#### 数据字典表 (water_dict_data)
| 字段名 | 数据类型 | 长度 | 主键 | 非空 | 默认值 | 说明 |
|-------|---------|------|------|------|--------|------|
| id | BIGINT | - | Y | Y | AUTO_INCREMENT | 主键ID |
| dict_type | VARCHAR | 100 | - | Y | - | 字典类型 |
| dict_label | VARCHAR | 100 | - | Y | - | 字典标签 |
| dict_value | VARCHAR | 100 | - | Y | - | 字典键值 |
| dict_sort | INT | - | - | Y | 0 | 字典排序 |
| status | TINYINT | - | - | Y | 1 | 状态 |
| tenant_id | BIGINT | - | - | Y | 0 | 租户ID |
#### 系统配置表 (water_config)
| 字段名 | 数据类型 | 长度 | 主键 | 非空 | 默认值 | 说明 |
|-------|---------|------|------|------|--------|------|
| id | BIGINT | - | Y | Y | AUTO_INCREMENT | 主键ID |
| config_name | VARCHAR | 100 | - | Y | - | 参数名称 |
| config_key | VARCHAR | 100 | - | Y | - | 参数键名 |
| config_value | VARCHAR | 500 | - | N | NULL | 参数键值 |
| config_type | VARCHAR | 20 | - | N | NULL | 系统内置 |
| remark | VARCHAR | 500 | - | N | NULL | 备注 |
| tenant_id | BIGINT | - | - | Y | 0 | 租户ID |
#### 水价配置表 (water_price_config)
| 字段名 | 数据类型 | 长度 | 主键 | 非空 | 默认值 | 说明 |
|-------|---------|------|------|------|--------|------|
| id | BIGINT | - | Y | Y | AUTO_INCREMENT | 主键ID |
| price_name | VARCHAR | 100 | - | Y | - | 水价名称 |
| customer_type | VARCHAR | 20 | - | Y | - | 客户类型 |
| price_type | VARCHAR | 20 | - | Y | - | 价格类型 |
| base_price | DECIMAL | 8,4 | - | Y | - | 基础价格 |
| sewage_price | DECIMAL | 8,4 | - | N | 0.00 | 污水处理费 |
| effective_date | DATE | - | - | Y | - | 生效日期 |
| expire_date | DATE | - | - | N | NULL | 失效日期 |
| status | TINYINT | - | - | Y | 1 | 状态 |
| tenant_id | BIGINT | - | - | Y | 0 | 租户ID |
## 索引与性能优化
### 主要索引设计
#### 唯一索引
- **客户编号索引**:`uk_customer_code (customer_code, tenant_id)`
- **水表编号索引**:`uk_meter_code (meter_code, tenant_id)`
- **账单编号索引**:`uk_bill_code (bill_code, tenant_id)`
- **缴费编号索引**:`uk_payment_code (payment_code, tenant_id)`
#### 复合索引
- **多租户查询索引**:`idx_tenant_customer_type (tenant_id, customer_type)`
- **账单查询索引**:`idx_tenant_customer_month (tenant_id, customer_id, bill_month)`
- **抄表查询索引**:`idx_tenant_meter_date (tenant_id, meter_id, reading_date)`
- **缴费查询索引**:`idx_customer_payment_time (customer_id, payment_time)`
#### 单列索引
- **状态查询索引**:各表的状态字段
- **时间查询索引**:创建时间、更新时间、缴费时间等
- **关联查询索引**:外键字段
### OpenGauss特性应用
#### 分区表设计
- **按月分区**:账单表、缴费表按月份分区
- **按年分区**:历史数据表按年份分区
- **按租户分区**:大租户数据独立分区
#### 列存储优化
- **统计分析表**:使用列存储提高分析查询性能
- **历史数据表**:归档数据使用列存储节省空间
#### 内存表应用
- **配置缓存表**:系统配置参数使用内存表
- **字典数据表**:频繁访问的字典数据使用内存表
### 查询优化策略
#### 多租户查询优化
- 所有查询强制包含tenant_id条件
- 使用MyBatis Plus多租户拦截器自动添加租户条件
- 建立租户级别的分区索引
#### 分页查询优化
- 使用覆盖索引减少回表查询
- 大数据量分页使用游标分页替代传统分页
- 配置合理的LIMIT和OFFSET参数
#### 统计查询优化
- 建立专门的统计视图
- 使用物化视图缓存复杂统计结果
- 配置定期刷新统计信息
## 数据安全设计
### OpenGauss安全特性
#### 透明数据加密 (TDE)
- **表级加密**:敏感数据表启用透明加密
- **字段级加密**:身份证号、银行账号等敏感字段加密存储
- **密钥管理**:使用OpenGauss内置密钥管理系统
#### 行级安全策略 (RLS)
- **多租户隔离**:基于tenant_id的行级安全策略
- **数据权限控制**:根据用户角色限制数据访问范围
- **动态权限策略**:支持基于时间、地域等条件的动态权限
#### 动态数据脱敏
- **敏感数据脱敏**:手机号、身份证号等敏感信息脱敏显示
- **角色权限控制**:不同角色看到不同级别的脱敏数据
- **脱敏规则配置**:支持灵活的脱敏规则配置
### 权限控制体系
#### 角色权限设计
- **系统管理员**:拥有所有权限,负责系统配置和用户管理
- **业务管理员**:拥有业务数据的完整权限
- **业务操作员**:拥有业务数据的查询和部分修改权限
- **只读用户**:仅拥有脱敏数据的查询权限
#### 多级权限控制
- **系统级权限**:控制系统功能模块的访问权限
- **数据级权限**:控制数据记录的访问权限
- **字段级权限**:控制敏感字段的访问权限
- **操作级权限**:控制增删改查等操作权限
### 审计与监控
#### 操作审计
- **数据变更审计**:记录所有数据增删改操作
- **敏感操作审计**:重点审计敏感数据的访问操作
- **登录审计**:记录用户登录、退出等认证操作
- **权限变更审计**:记录权限和角色的变更操作
#### 安全监控
- **异常访问监控**:监控异常的数据访问行为
- **性能监控**:监控数据库性能指标和资源使用情况
- **安全事件监控**:监控安全相关事件和告警
- **合规检查**:定期进行安全合规性检查
### 备份与恢复
#### 数据备份策略
- **全量备份**:定期进行完整数据库备份
- **增量备份**:每日进行增量数据备份
- **归档备份**:历史数据定期归档到备份存储
- **异地备份**:关键数据进行异地备份
#### 灾难恢复
- **主备同步**:OpenGauss主备实时同步
- **故障切换**:支持自动故障检测和切换
- **数据恢复**:支持基于时间点的数据恢复
- **业务连续性**:确保业务服务的高可用性
### 国产化安全合规
#### 密码算法支持
- **国产SM算法**:支持SM2/SM3/SM4国产密码算法
- **密码合规**:符合国家密码管理局相关要求
- **安全认证**:通过相关安全产品认证
#### 等保合规
- **等保三级**:满足等保三级安全防护要求
- **安全管理**:建立完善的安全管理制度
- **技术防护**:采用多层次的技术防护措施
- **安全评估**:定期进行安全风险评估