fujian_water_biz_doc/water_biz_database_design.md

852 lines
31 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 福建水务营收系统数据库设计文档
## 文档信息
| 项目信息 | 详情 |
|---------|------|
| **项目名称** | 福建水务营收系统 |
| **文档类型** | 概要设计文档 |
| **技术框架** | 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<br/>RuoYi-Vue-Pro]
end
subgraph "数据访问层"
MP[MyBatis Plus<br/>ORM框架]
CACHE[Redis缓存<br/>热点数据]
end
subgraph "数据存储层"
subgraph "OpenGauss主从集群"
MASTER[(OpenGauss主库<br/>读写)]
SLAVE[(OpenGauss从库<br/>只读)]
end
subgraph "业务数据库"
DB_CUSTOMER[(客户数据库<br/>Customer DB)]
DB_BILLING[(营收数据库<br/>Billing DB)]
DB_METER[(表务数据库<br/>Meter DB)]
DB_SYSTEM[(系统数据库<br/>System DB)]
end
subgraph "数据归档"
DB_HISTORY[(历史数据库<br/>Archive DB)]
BACKUP[(备份存储<br/>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<br/>+ tenant_id]
TABLE2[water_meter<br/>+ tenant_id]
TABLE3[water_bill<br/>+ tenant_id]
TABLE4[water_payment<br/>+ tenant_id]
end
subgraph "租户隔离机制"
INTERCEPTOR[MyBatis Plus<br/>多租户拦截器]
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国产密码算法
- **密码合规**:符合国家密码管理局相关要求
- **安全认证**:通过相关安全产品认证
#### 等保合规
- **等保三级**:满足等保三级安全防护要求
- **安全管理**:建立完善的安全管理制度
- **技术防护**:采用多层次的技术防护措施
- **安全评估**:定期进行安全风险评估