996 lines
46 KiB
Markdown
996 lines
46 KiB
Markdown
# 福建水务营收系统数据库设计文档
|
||
|
||
## 文档信息
|
||
| 项目信息 | 详情 |
|
||
|---------|------|
|
||
| **项目名称** | 福建水务营收系统 |
|
||
| **文档类型** | 概要设计文档 |
|
||
| **技术框架** | RuoYi-Vue-Pro + yudao-ui-admin-vue3 |
|
||
| **文档版本** | v1.0 |
|
||
| **编写日期** | 2024-12-19 |
|
||
| **文档状态** | 🟡 进行中 |
|
||
|
||
## 目录
|
||
- [一、数据库设计概述](#一数据库设计概述)
|
||
- [二、数据库架构](#二数据库架构)
|
||
- [三、核心数据模型ER图](#三核心数据模型er图)
|
||
- [四、数据表结构设计](#四数据表结构设计)
|
||
- [五、完整DDL语句](#五完整ddl语句)
|
||
- [六、索引设计](#六索引设计)
|
||
- [七、数据安全性设计](#七数据安全性设计)
|
||
|
||
## 一、数据库设计概述
|
||
|
||
福建水务营收系统的数据库设计基于MySQL/MariaDB数据库管理系统(同时支持国产OpenGauss数据库),采用关系型数据库模型,以支持业务系统的高并发、高可靠性需求。数据库设计遵循标准化、安全性、扩展性和性能优化的原则,为业务系统提供稳定、高效的数据存储和访问支持。
|
||
|
||
### 1.1 设计目标
|
||
|
||
- 支持系统功能需求,满足业务处理的数据需求
|
||
- 优化数据库性能,支持高并发访问
|
||
- 确保数据安全性,防止数据泄露和丢失
|
||
- 支持系统横向扩展,适应业务增长需求
|
||
- 支持多租户架构,实现数据隔离
|
||
|
||
### 1.2 设计原则
|
||
|
||
- **规范化设计**:遵循数据库设计的第三范式,减少数据冗余
|
||
- **适度冗余**:对于常用查询,适度保留冗余字段,提高查询效率
|
||
- **模块化**:按业务模块划分表组,便于维护和扩展
|
||
- **安全性**:设计完善的权限控制和数据加密方案
|
||
- **可扩展性**:预留扩展字段,支持业务功能的扩展
|
||
- **通用字段**:遵循RuoYi-Vue-Pro框架规范,统一基础字段定义
|
||
|
||
## 2. 数据库架构
|
||
|
||
### 2.1 总体架构
|
||
|
||
系统采用集中式数据库架构,主要包含以下组件:
|
||
|
||
- **主数据库**:MySQL/MariaDB主从架构,存储核心业务数据,支持事务处理
|
||
- **报表数据库**:存储统计分析数据,支持复杂查询和报表生成
|
||
- **历史数据库**:存储历史业务数据,减轻主数据库负担
|
||
- **缓存系统**:使用Redis作为缓存数据库,缓存热点数据,提高访问效率
|
||
|
||
### 2.2 多租户设计
|
||
|
||
系统采用基于字段的方式实现多租户架构,主要包括:
|
||
|
||
- **共享数据库,共享模式**:所有租户共享同一数据库实例和表结构
|
||
- **租户标识列**:在每个表中增加tenant_id租户标识列,实现数据隔离
|
||
- **多租户拦截器**:基于MyBatis Plus的多租户拦截器,自动为SQL添加租户条件
|
||
- **权限控制**:通过数据权限控制租户对数据的访问
|
||
|
||
### 2.3 数据访问层设计
|
||
|
||
系统基于MyBatis Plus框架实现数据访问层,主要特点包括:
|
||
|
||
- **通用CRUD**:利用MyBatis Plus提供的BaseMapper,简化基础CRUD操作
|
||
- **分页查询**:使用MyBatis Plus的分页插件,实现高性能分页
|
||
- **条件构造器**:使用LambdaQueryWrapper/LambdaUpdateWrapper构建动态SQL
|
||
- **自动填充**:通过MetaObjectHandler自动填充创建时间、更新时间等字段
|
||
- **乐观锁**:支持通过版本号实现乐观锁控制
|
||
- **数据权限**:通过自定义拦截器实现数据权限过滤
|
||
- **多租户**:基于TenantLineInnerInterceptor实现多租户数据隔离
|
||
|
||
### 2.4 通用字段设计
|
||
|
||
系统中所有业务表都包含以下通用字段:
|
||
|
||
| 字段名 | 数据类型 | 长度 | 是否为空 | 描述 |
|
||
|-------|---------|------|---------|-----|
|
||
| id | BIGINT | - | 否 | 主键ID |
|
||
| creator | VARCHAR | 64 | 是 | 创建者 |
|
||
| create_time | DATETIME | - | 否 | 创建时间 |
|
||
| updater | VARCHAR | 64 | 是 | 更新者 |
|
||
| update_time | DATETIME | - | 是 | 更新时间 |
|
||
| deleted | TINYINT | 1 | 否 | 是否删除(0正常,1删除) |
|
||
| tenant_id | BIGINT | - | 否 | 租户ID |
|
||
| version | INT | - | 是 | 乐观锁版本号 |
|
||
|
||
## 三、核心数据模型ER图
|
||
|
||
### 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 : "对应"
|
||
```
|
||
|
||
### 2. 营收管理模块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 : "对应"
|
||
```
|
||
|
||
### 3. 表务管理模块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 : "产生"
|
||
```
|
||
|
||
### 4. 系统管理模块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 : "包含"
|
||
```
|
||
|
||
## 四、数据表结构设计
|
||
|
||
以下是系统主要表结构设计,按业务模块划分:
|
||
|
||
### 4.1 客户管理相关表
|
||
|
||
#### 4.1.1 客户基本信息表(TB_CUSTOMER)
|
||
|
||
| 字段名 | 数据类型 | 长度 | 是否为空 | 主键 | 描述 |
|
||
|-------|---------|------|---------|-----|------|
|
||
| CUSTOMER_ID | VARCHAR | 20 | 否 | 是 | 客户编号,主键 |
|
||
| TENANT_ID | VARCHAR | 20 | 否 | 否 | 租户标识 |
|
||
| CUSTOMER_NAME | VARCHAR | 100 | 否 | 否 | 客户名称 |
|
||
| CUSTOMER_TYPE | VARCHAR | 10 | 否 | 否 | 客户类型 |
|
||
| ID_TYPE | VARCHAR | 10 | 是 | 否 | 证件类型 |
|
||
| ID_NUMBER | VARCHAR | 30 | 是 | 否 | 证件号码 |
|
||
| PHONE | VARCHAR | 20 | 是 | 否 | 联系电话 |
|
||
| ADDRESS | VARCHAR | 200 | 是 | 否 | 地址 |
|
||
| AREA_CODE | VARCHAR | 20 | 是 | 否 | 行政区划代码 |
|
||
| CREATE_TIME | DATETIME | - | 否 | 否 | 创建时间 |
|
||
| UPDATE_TIME | DATETIME | - | 是 | 否 | 更新时间 |
|
||
| STATUS | VARCHAR | 10 | 否 | 否 | 状态 |
|
||
|
||
#### 4.1.2 表卡信息表(TB_METER_INFO)
|
||
|
||
| 字段名 | 数据类型 | 长度 | 是否为空 | 主键 | 描述 |
|
||
|-------|---------|------|---------|-----|------|
|
||
| METER_ID | VARCHAR | 20 | 否 | 是 | 水表编号,主键 |
|
||
| CUSTOMER_ID | VARCHAR | 20 | 否 | 否 | 客户编号,外键 |
|
||
| TENANT_ID | VARCHAR | 20 | 否 | 否 | 租户标识 |
|
||
| METER_NO | VARCHAR | 30 | 否 | 否 | 水表号 |
|
||
| METER_TYPE | VARCHAR | 10 | 否 | 否 | 水表类型 |
|
||
| METER_MODEL | VARCHAR | 20 | 是 | 否 | 水表型号 |
|
||
| METER_CALIBER | VARCHAR | 10 | 是 | 否 | 水表口径 |
|
||
| INSTALL_DATE | DATE | - | 是 | 否 | 安装日期 |
|
||
| INSTALL_POSITION | VARCHAR | 200 | 是 | 否 | 安装位置 |
|
||
| INITIAL_READING | DECIMAL | 10,2 | 否 | 否 | 初始读数 |
|
||
| CURRENT_READING | DECIMAL | 10,2 | 否 | 否 | 当前读数 |
|
||
| READING_CYCLE | VARCHAR | 10 | 否 | 否 | 抄表周期 |
|
||
| BOOK_ID | VARCHAR | 20 | 是 | 否 | 册本编号 |
|
||
| STATUS | VARCHAR | 10 | 否 | 否 | 状态 |
|
||
| CREATE_TIME | DATETIME | - | 否 | 否 | 创建时间 |
|
||
| UPDATE_TIME | DATETIME | - | 是 | 否 | 更新时间 |
|
||
|
||
#### 4.1.3 账户信息表(TB_ACCOUNT)
|
||
|
||
| 字段名 | 数据类型 | 长度 | 是否为空 | 主键 | 描述 |
|
||
|-------|---------|------|---------|-----|------|
|
||
| ACCOUNT_ID | VARCHAR | 20 | 否 | 是 | 账户编号,主键 |
|
||
| CUSTOMER_ID | VARCHAR | 20 | 否 | 否 | 客户编号,外键 |
|
||
| TENANT_ID | VARCHAR | 20 | 否 | 否 | 租户标识 |
|
||
| BALANCE | DECIMAL | 12,2 | 否 | 否 | 账户余额 |
|
||
| CREDIT_AMOUNT | DECIMAL | 12,2 | 是 | 否 | 信用额度 |
|
||
| LAST_PAYMENT_DATE | DATE | - | 是 | 否 | 最近缴费日期 |
|
||
| STATUS | VARCHAR | 10 | 否 | 否 | 状态 |
|
||
| CREATE_TIME | DATETIME | - | 否 | 否 | 创建时间 |
|
||
| UPDATE_TIME | DATETIME | - | 是 | 否 | 更新时间 |
|
||
|
||
### 4.2 营收管理相关表
|
||
|
||
#### 4.2.1 抄表记录表(TB_METER_READING)
|
||
|
||
| 字段名 | 数据类型 | 长度 | 是否为空 | 主键 | 描述 |
|
||
|-------|---------|------|---------|-----|------|
|
||
| READING_ID | VARCHAR | 20 | 否 | 是 | 抄表记录编号,主键 |
|
||
| METER_ID | VARCHAR | 20 | 否 | 否 | 水表编号,外键 |
|
||
| TENANT_ID | VARCHAR | 20 | 否 | 否 | 租户标识 |
|
||
| READING_DATE | DATE | - | 否 | 否 | 抄表日期 |
|
||
| READING_VALUE | DECIMAL | 10,2 | 否 | 否 | 抄表读数 |
|
||
| PREV_READING_VALUE | DECIMAL | 10,2 | 是 | 否 | 上次读数 |
|
||
| WATER_USAGE | DECIMAL | 10,2 | 否 | 否 | 用水量 |
|
||
| READING_TYPE | VARCHAR | 10 | 否 | 否 | 抄表类型(人工/远传/自报) |
|
||
| READER_ID | VARCHAR | 20 | 是 | 否 | 抄表员编号 |
|
||
| STATUS | VARCHAR | 10 | 否 | 否 | 状态 |
|
||
| REMARK | VARCHAR | 200 | 是 | 否 | 备注 |
|
||
| CREATE_TIME | DATETIME | - | 否 | 否 | 创建时间 |
|
||
| UPDATE_TIME | DATETIME | - | 是 | 否 | 更新时间 |
|
||
|
||
#### 4.2.2 账单信息表(TB_BILL)
|
||
|
||
| 字段名 | 数据类型 | 长度 | 是否为空 | 主键 | 描述 |
|
||
|-------|---------|------|---------|-----|------|
|
||
| BILL_ID | VARCHAR | 20 | 否 | 是 | 账单编号,主键 |
|
||
| CUSTOMER_ID | VARCHAR | 20 | 否 | 否 | 客户编号,外键 |
|
||
| METER_ID | VARCHAR | 20 | 否 | 否 | 水表编号,外键 |
|
||
| READING_ID | VARCHAR | 20 | 是 | 否 | 抄表记录编号,外键 |
|
||
| TENANT_ID | VARCHAR | 20 | 否 | 否 | 租户标识 |
|
||
| BILL_MONTH | VARCHAR | 7 | 否 | 否 | 账期(格式:YYYY-MM) |
|
||
| WATER_USAGE | DECIMAL | 10,2 | 否 | 否 | 用水量 |
|
||
| WATER_FEE | DECIMAL | 10,2 | 否 | 否 | 水费金额 |
|
||
| OTHER_FEE | DECIMAL | 10,2 | 是 | 否 | 其他费用 |
|
||
| TOTAL_AMOUNT | DECIMAL | 10,2 | 否 | 否 | 总金额 |
|
||
| DUE_DATE | DATE | - | 否 | 否 | 缴费截止日期 |
|
||
| STATUS | VARCHAR | 10 | 否 | 否 | 状态 |
|
||
| CREATE_TIME | DATETIME | - | 否 | 否 | 创建时间 |
|
||
| UPDATE_TIME | DATETIME | - | 是 | 否 | 更新时间 |
|
||
|
||
#### 4.2.3 缴费记录表(TB_PAYMENT)
|
||
|
||
| 字段名 | 数据类型 | 长度 | 是否为空 | 主键 | 描述 |
|
||
|-------|---------|------|---------|-----|------|
|
||
| PAYMENT_ID | VARCHAR | 20 | 否 | 是 | 缴费记录编号,主键 |
|
||
| BILL_ID | VARCHAR | 20 | 是 | 否 | 账单编号,外键 |
|
||
| CUSTOMER_ID | VARCHAR | 20 | 否 | 否 | 客户编号,外键 |
|
||
| TENANT_ID | VARCHAR | 20 | 否 | 否 | 租户标识 |
|
||
| PAYMENT_TYPE | VARCHAR | 10 | 否 | 否 | 缴费类型 |
|
||
| PAYMENT_CHANNEL | VARCHAR | 10 | 否 | 否 | 缴费渠道 |
|
||
| PAYMENT_AMOUNT | DECIMAL | 10,2 | 否 | 否 | 缴费金额 |
|
||
| PAYMENT_DATE | DATETIME | - | 否 | 否 | 缴费时间 |
|
||
| TRANSACTION_NO | VARCHAR | 30 | 是 | 否 | 交易流水号 |
|
||
| OPERATOR_ID | VARCHAR | 20 | 是 | 否 | 操作员编号 |
|
||
| STATUS | VARCHAR | 10 | 否 | 否 | 状态 |
|
||
| REMARK | VARCHAR | 200 | 是 | 否 | 备注 |
|
||
| CREATE_TIME | DATETIME | - | 否 | 否 | 创建时间 |
|
||
| UPDATE_TIME | DATETIME | - | 是 | 否 | 更新时间 |
|
||
|
||
### 4.3 表务管理相关表
|
||
|
||
#### 4.3.1 水表档案表(TB_METER_ARCHIVE)
|
||
|
||
| 字段名 | 数据类型 | 长度 | 是否为空 | 主键 | 描述 |
|
||
|-------|---------|------|---------|-----|------|
|
||
| METER_ARCHIVE_ID | VARCHAR | 20 | 否 | 是 | 水表档案编号,主键 |
|
||
| METER_ID | VARCHAR | 20 | 否 | 否 | 水表编号,外键 |
|
||
| TENANT_ID | VARCHAR | 20 | 否 | 否 | 租户标识 |
|
||
| FACTORY | VARCHAR | 50 | 是 | 否 | 生产厂家 |
|
||
| PRODUCTION_DATE | DATE | - | 是 | 否 | 生产日期 |
|
||
| VALID_PERIOD | INT | - | 是 | 否 | 有效期(月) |
|
||
| VERIFICATION_DATE | DATE | - | 是 | 否 | 检定日期 |
|
||
| NEXT_VERIFICATION_DATE | DATE | - | 是 | 否 | 下次检定日期 |
|
||
| STATUS | VARCHAR | 10 | 否 | 否 | 状态 |
|
||
| CREATE_TIME | DATETIME | - | 否 | 否 | 创建时间 |
|
||
| UPDATE_TIME | DATETIME | - | 是 | 否 | 更新时间 |
|
||
|
||
## 五、完整DDL语句
|
||
|
||
### 1. 客户管理相关表DDL
|
||
|
||
#### 1.1 客户基本信息表
|
||
|
||
```sql
|
||
CREATE TABLE `water_customer` (
|
||
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
|
||
`customer_code` varchar(32) NOT NULL COMMENT '客户编号',
|
||
`customer_name` varchar(100) NOT NULL COMMENT '客户名称',
|
||
`customer_type` varchar(20) NOT NULL COMMENT '客户类型(居民:RESIDENT,非居民:NON_RESIDENT,工业:INDUSTRIAL,行政:ADMINISTRATIVE)',
|
||
`id_type` varchar(20) DEFAULT NULL COMMENT '证件类型(身份证:ID_CARD,营业执照:BUSINESS_LICENSE)',
|
||
`id_number` varchar(30) DEFAULT NULL COMMENT '证件号码',
|
||
`phone` varchar(20) DEFAULT NULL COMMENT '联系电话',
|
||
`mobile` varchar(20) DEFAULT NULL COMMENT '手机号码',
|
||
`email` varchar(100) DEFAULT NULL COMMENT '邮箱',
|
||
`address` varchar(500) DEFAULT NULL COMMENT '详细地址',
|
||
`area_code` varchar(20) DEFAULT NULL COMMENT '行政区划代码',
|
||
`postal_code` varchar(10) DEFAULT NULL COMMENT '邮政编码',
|
||
`contact_person` varchar(50) DEFAULT NULL COMMENT '联系人',
|
||
`bank_account` varchar(50) DEFAULT NULL COMMENT '银行账户',
|
||
`bank_name` varchar(100) DEFAULT NULL COMMENT '开户银行',
|
||
`remark` varchar(500) DEFAULT NULL COMMENT '备注信息',
|
||
`status` tinyint NOT NULL DEFAULT '1' COMMENT '状态(0:停用,1:正常,2:欠费,3:销户)',
|
||
`tenant_id` bigint NOT NULL DEFAULT '0' COMMENT '租户ID',
|
||
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
|
||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
|
||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
|
||
PRIMARY KEY (`id`),
|
||
UNIQUE KEY `uk_customer_code` (`customer_code`, `tenant_id`),
|
||
KEY `idx_customer_name` (`customer_name`),
|
||
KEY `idx_phone` (`phone`),
|
||
KEY `idx_id_number` (`id_number`),
|
||
KEY `idx_tenant_customer_type` (`tenant_id`, `customer_type`),
|
||
KEY `idx_status` (`status`),
|
||
KEY `idx_create_time` (`create_time`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='客户基本信息表';
|
||
```
|
||
|
||
#### 1.2 水表信息表
|
||
|
||
```sql
|
||
CREATE TABLE `water_meter` (
|
||
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
|
||
`meter_code` varchar(32) NOT NULL COMMENT '水表编号',
|
||
`meter_no` varchar(30) DEFAULT NULL COMMENT '水表表号',
|
||
`meter_type` varchar(20) NOT NULL COMMENT '水表类型(机械:MECHANICAL,智能:SMART,远传:REMOTE)',
|
||
`meter_model` varchar(50) DEFAULT NULL COMMENT '水表型号',
|
||
`meter_caliber` varchar(10) DEFAULT NULL COMMENT '水表口径(15mm,20mm,25mm等)',
|
||
`manufacturer` varchar(100) DEFAULT NULL COMMENT '生产厂家',
|
||
`production_date` date DEFAULT NULL COMMENT '生产日期',
|
||
`install_date` date DEFAULT NULL COMMENT '安装日期',
|
||
`install_position` varchar(500) DEFAULT NULL COMMENT '安装位置',
|
||
`longitude` decimal(10,7) DEFAULT NULL COMMENT '经度',
|
||
`latitude` decimal(10,7) DEFAULT NULL COMMENT '纬度',
|
||
`initial_reading` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '初始读数',
|
||
`current_reading` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '当前读数',
|
||
`reading_cycle` varchar(20) NOT NULL DEFAULT 'MONTHLY' COMMENT '抄表周期(月度:MONTHLY,双月:BIMONTHLY,季度:QUARTERLY)',
|
||
`book_code` varchar(32) DEFAULT NULL COMMENT '册本编号',
|
||
`reading_route` varchar(100) DEFAULT NULL COMMENT '抄表路线',
|
||
`meter_status` tinyint NOT NULL DEFAULT '1' COMMENT '水表状态(0:停用,1:正常,2:故障,3:拆除)',
|
||
`customer_id` bigint NOT NULL COMMENT '客户ID',
|
||
`tenant_id` bigint NOT NULL DEFAULT '0' COMMENT '租户ID',
|
||
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
|
||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
|
||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
|
||
PRIMARY KEY (`id`),
|
||
UNIQUE KEY `uk_meter_code` (`meter_code`, `tenant_id`),
|
||
KEY `idx_meter_no` (`meter_no`),
|
||
KEY `idx_customer_id` (`customer_id`),
|
||
KEY `idx_book_code` (`book_code`),
|
||
KEY `idx_meter_type` (`meter_type`),
|
||
KEY `idx_meter_status` (`meter_status`),
|
||
KEY `idx_tenant_status` (`tenant_id`, `meter_status`),
|
||
CONSTRAINT `fk_meter_customer` FOREIGN KEY (`customer_id`) REFERENCES `water_customer` (`id`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='水表信息表';
|
||
```
|
||
|
||
### 2. 基础数据初始化脚本
|
||
|
||
```sql
|
||
-- 插入基础字典数据
|
||
INSERT INTO `water_dict_data` (`dict_type`, `dict_label`, `dict_value`, `dict_sort`, `status`, `remark`) VALUES
|
||
('customer_type', '居民用户', 'RESIDENT', 1, 1, '居民生活用水'),
|
||
('customer_type', '非居民用户', 'NON_RESIDENT', 2, 1, '非居民用水'),
|
||
('customer_type', '工业用户', 'INDUSTRIAL', 3, 1, '工业生产用水'),
|
||
('customer_type', '行政用户', 'ADMINISTRATIVE', 4, 1, '行政事业单位用水'),
|
||
|
||
('meter_type', '机械水表', 'MECHANICAL', 1, 1, '传统机械式水表'),
|
||
('meter_type', '智能水表', 'SMART', 2, 1, '智能电子水表'),
|
||
('meter_type', '远传水表', 'REMOTE', 3, 1, '远程传输水表'),
|
||
|
||
('reading_type', '人工抄表', 'MANUAL', 1, 1, '抄表员现场抄表'),
|
||
('reading_type', '远程抄表', 'REMOTE', 2, 1, '远程自动抄表'),
|
||
('reading_type', '客户自报', 'SELF_REPORT', 3, 1, '客户自主上报'),
|
||
('reading_type', '估算抄表', 'ESTIMATE', 4, 1, '估算用水量'),
|
||
|
||
('payment_channel', '现金', 'CASH', 1, 1, '现金缴费'),
|
||
('payment_channel', '银行卡', 'BANK_CARD', 2, 1, '银行卡刷卡'),
|
||
('payment_channel', '微信支付', 'WECHAT', 3, 1, '微信在线支付'),
|
||
('payment_channel', '支付宝', 'ALIPAY', 4, 1, '支付宝在线支付'),
|
||
('payment_channel', '银行代扣', 'BANK_DEDUCT', 5, 1, '银行自动代扣');
|
||
```
|
||
|
||
#### 4.3.2 表务工单表(TB_METER_WORKORDER)
|
||
|
||
| 字段名 | 数据类型 | 长度 | 是否为空 | 主键 | 描述 |
|
||
|-------|---------|------|---------|-----|------|
|
||
| WORKORDER_ID | VARCHAR | 20 | 否 | 是 | 工单编号,主键 |
|
||
| METER_ID | VARCHAR | 20 | 否 | 否 | 水表编号,外键 |
|
||
| CUSTOMER_ID | VARCHAR | 20 | 否 | 否 | 客户编号,外键 |
|
||
| TENANT_ID | VARCHAR | 20 | 否 | 否 | 租户标识 |
|
||
| WORKORDER_TYPE | VARCHAR | 10 | 否 | 否 | 工单类型 |
|
||
| WORKORDER_STATUS | VARCHAR | 10 | 否 | 否 | 工单状态 |
|
||
| APPLY_DATE | DATE | - | 否 | 否 | 申请日期 |
|
||
| PLAN_DATE | DATE | - | 是 | 否 | 计划执行日期 |
|
||
| EXECUTE_DATE | DATE | - | 是 | 否 | 实际执行日期 |
|
||
| APPLICANT_ID | VARCHAR | 20 | 是 | 否 | 申请人编号 |
|
||
| EXECUTOR_ID | VARCHAR | 20 | 是 | 否 | 执行人编号 |
|
||
| REASON | VARCHAR | 200 | 是 | 否 | 原因 |
|
||
| RESULT | VARCHAR | 200 | 是 | 否 | 结果 |
|
||
| CREATE_TIME | DATETIME | - | 否 | 否 | 创建时间 |
|
||
| UPDATE_TIME | DATETIME | - | 是 | 否 | 更新时间 |
|
||
|
||
## 五、完整DDL语句
|
||
|
||
### 1. 客户管理相关表DDL
|
||
|
||
#### 1.1 客户基本信息表
|
||
|
||
```sql
|
||
CREATE TABLE `water_customer` (
|
||
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
|
||
`customer_code` varchar(32) NOT NULL COMMENT '客户编号',
|
||
`customer_name` varchar(100) NOT NULL COMMENT '客户名称',
|
||
`customer_type` varchar(20) NOT NULL COMMENT '客户类型(居民:RESIDENT,非居民:NON_RESIDENT,工业:INDUSTRIAL,行政:ADMINISTRATIVE)',
|
||
`id_type` varchar(20) DEFAULT NULL COMMENT '证件类型(身份证:ID_CARD,营业执照:BUSINESS_LICENSE)',
|
||
`id_number` varchar(30) DEFAULT NULL COMMENT '证件号码',
|
||
`phone` varchar(20) DEFAULT NULL COMMENT '联系电话',
|
||
`mobile` varchar(20) DEFAULT NULL COMMENT '手机号码',
|
||
`email` varchar(100) DEFAULT NULL COMMENT '邮箱',
|
||
`address` varchar(500) DEFAULT NULL COMMENT '详细地址',
|
||
`area_code` varchar(20) DEFAULT NULL COMMENT '行政区划代码',
|
||
`postal_code` varchar(10) DEFAULT NULL COMMENT '邮政编码',
|
||
`contact_person` varchar(50) DEFAULT NULL COMMENT '联系人',
|
||
`bank_account` varchar(50) DEFAULT NULL COMMENT '银行账户',
|
||
`bank_name` varchar(100) DEFAULT NULL COMMENT '开户银行',
|
||
`remark` varchar(500) DEFAULT NULL COMMENT '备注信息',
|
||
`status` tinyint NOT NULL DEFAULT '1' COMMENT '状态(0:停用,1:正常,2:欠费,3:销户)',
|
||
`tenant_id` bigint NOT NULL DEFAULT '0' COMMENT '租户ID',
|
||
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
|
||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
|
||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
|
||
PRIMARY KEY (`id`),
|
||
UNIQUE KEY `uk_customer_code` (`customer_code`, `tenant_id`),
|
||
KEY `idx_customer_name` (`customer_name`),
|
||
KEY `idx_phone` (`phone`),
|
||
KEY `idx_id_number` (`id_number`),
|
||
KEY `idx_tenant_customer_type` (`tenant_id`, `customer_type`),
|
||
KEY `idx_status` (`status`),
|
||
KEY `idx_create_time` (`create_time`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='客户基本信息表';
|
||
```
|
||
|
||
#### 1.2 水表信息表
|
||
|
||
```sql
|
||
CREATE TABLE `water_meter` (
|
||
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
|
||
`meter_code` varchar(32) NOT NULL COMMENT '水表编号',
|
||
`meter_no` varchar(30) DEFAULT NULL COMMENT '水表表号',
|
||
`meter_type` varchar(20) NOT NULL COMMENT '水表类型(机械:MECHANICAL,智能:SMART,远传:REMOTE)',
|
||
`meter_model` varchar(50) DEFAULT NULL COMMENT '水表型号',
|
||
`meter_caliber` varchar(10) DEFAULT NULL COMMENT '水表口径(15mm,20mm,25mm等)',
|
||
`manufacturer` varchar(100) DEFAULT NULL COMMENT '生产厂家',
|
||
`production_date` date DEFAULT NULL COMMENT '生产日期',
|
||
`install_date` date DEFAULT NULL COMMENT '安装日期',
|
||
`install_position` varchar(500) DEFAULT NULL COMMENT '安装位置',
|
||
`longitude` decimal(10,7) DEFAULT NULL COMMENT '经度',
|
||
`latitude` decimal(10,7) DEFAULT NULL COMMENT '纬度',
|
||
`initial_reading` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '初始读数',
|
||
`current_reading` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '当前读数',
|
||
`reading_cycle` varchar(20) NOT NULL DEFAULT 'MONTHLY' COMMENT '抄表周期(月度:MONTHLY,双月:BIMONTHLY,季度:QUARTERLY)',
|
||
`book_code` varchar(32) DEFAULT NULL COMMENT '册本编号',
|
||
`reading_route` varchar(100) DEFAULT NULL COMMENT '抄表路线',
|
||
`meter_status` tinyint NOT NULL DEFAULT '1' COMMENT '水表状态(0:停用,1:正常,2:故障,3:拆除)',
|
||
`customer_id` bigint NOT NULL COMMENT '客户ID',
|
||
`tenant_id` bigint NOT NULL DEFAULT '0' COMMENT '租户ID',
|
||
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
|
||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
|
||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
|
||
PRIMARY KEY (`id`),
|
||
UNIQUE KEY `uk_meter_code` (`meter_code`, `tenant_id`),
|
||
KEY `idx_meter_no` (`meter_no`),
|
||
KEY `idx_customer_id` (`customer_id`),
|
||
KEY `idx_book_code` (`book_code`),
|
||
KEY `idx_meter_type` (`meter_type`),
|
||
KEY `idx_meter_status` (`meter_status`),
|
||
KEY `idx_tenant_status` (`tenant_id`, `meter_status`),
|
||
CONSTRAINT `fk_meter_customer` FOREIGN KEY (`customer_id`) REFERENCES `water_customer` (`id`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='水表信息表';
|
||
```
|
||
|
||
#### 1.3 客户账户表
|
||
|
||
```sql
|
||
CREATE TABLE `water_customer_account` (
|
||
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
|
||
`account_code` varchar(32) NOT NULL COMMENT '账户编号',
|
||
`balance` decimal(12,2) NOT NULL DEFAULT '0.00' COMMENT '账户余额',
|
||
`credit_amount` decimal(12,2) DEFAULT '0.00' COMMENT '信用额度',
|
||
`deposit_amount` decimal(12,2) DEFAULT '0.00' COMMENT '保证金',
|
||
`frozen_amount` decimal(12,2) DEFAULT '0.00' COMMENT '冻结金额',
|
||
`last_payment_date` date DEFAULT NULL COMMENT '最近缴费日期',
|
||
`last_payment_amount` decimal(12,2) DEFAULT NULL COMMENT '最近缴费金额',
|
||
`arrears_amount` decimal(12,2) DEFAULT '0.00' COMMENT '欠费金额',
|
||
`arrears_months` int DEFAULT '0' COMMENT '欠费月数',
|
||
`account_status` tinyint NOT NULL DEFAULT '1' COMMENT '账户状态(0:停用,1:正常,2:欠费,3:冻结)',
|
||
`customer_id` bigint NOT NULL COMMENT '客户ID',
|
||
`tenant_id` bigint NOT NULL DEFAULT '0' COMMENT '租户ID',
|
||
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
|
||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
|
||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
|
||
PRIMARY KEY (`id`),
|
||
UNIQUE KEY `uk_account_code` (`account_code`, `tenant_id`),
|
||
UNIQUE KEY `uk_customer_account` (`customer_id`, `tenant_id`),
|
||
KEY `idx_account_status` (`account_status`),
|
||
KEY `idx_balance` (`balance`),
|
||
KEY `idx_arrears` (`arrears_amount`),
|
||
CONSTRAINT `fk_account_customer` FOREIGN KEY (`customer_id`) REFERENCES `water_customer` (`id`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='客户账户信息表';
|
||
```
|
||
|
||
### 2. 营收管理相关表DDL
|
||
|
||
#### 2.1 抄表记录表
|
||
|
||
```sql
|
||
CREATE TABLE `water_meter_reading` (
|
||
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
|
||
`reading_code` varchar(32) NOT NULL COMMENT '抄表记录编号',
|
||
`reading_date` date NOT NULL COMMENT '抄表日期',
|
||
`reading_time` datetime DEFAULT NULL COMMENT '抄表时间',
|
||
`reading_value` decimal(10,2) NOT NULL COMMENT '抄表读数',
|
||
`prev_reading_value` decimal(10,2) DEFAULT NULL COMMENT '上次读数',
|
||
`water_usage` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '用水量',
|
||
`reading_type` varchar(20) NOT NULL COMMENT '抄表类型(手工:MANUAL,远传:REMOTE,自报:SELF_REPORT,估算:ESTIMATE)',
|
||
`reading_method` varchar(20) DEFAULT NULL COMMENT '抄表方式(现场:FIELD,拍照:PHOTO,NFC:NFC,扫码:SCAN)',
|
||
`reader_id` varchar(20) DEFAULT NULL COMMENT '抄表员ID',
|
||
`reader_name` varchar(50) DEFAULT NULL COMMENT '抄表员姓名',
|
||
`photo_url` varchar(255) DEFAULT NULL COMMENT '抄表照片URL',
|
||
`reading_location` varchar(200) DEFAULT NULL COMMENT '抄表位置',
|
||
`abnormal_flag` tinyint DEFAULT '0' COMMENT '异常标识(0:正常,1:异常)',
|
||
`abnormal_reason` varchar(200) DEFAULT NULL COMMENT '异常原因',
|
||
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
|
||
`reading_status` tinyint NOT NULL DEFAULT '0' COMMENT '状态(0:未复核,1:已复核,2:已开账,3:作废)',
|
||
`meter_id` bigint NOT NULL COMMENT '水表ID',
|
||
`customer_id` bigint NOT NULL COMMENT '客户ID',
|
||
`tenant_id` bigint NOT NULL DEFAULT '0' COMMENT '租户ID',
|
||
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
|
||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
|
||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
|
||
PRIMARY KEY (`id`),
|
||
UNIQUE KEY `uk_reading_code` (`reading_code`, `tenant_id`),
|
||
KEY `idx_meter_reading_date` (`meter_id`, `reading_date`),
|
||
KEY `idx_reading_date` (`reading_date`),
|
||
KEY `idx_reader_id` (`reader_id`),
|
||
KEY `idx_reading_status` (`reading_status`),
|
||
KEY `idx_customer_id` (`customer_id`),
|
||
KEY `idx_tenant_meter_date` (`tenant_id`, `meter_id`, `reading_date`),
|
||
CONSTRAINT `fk_reading_meter` FOREIGN KEY (`meter_id`) REFERENCES `water_meter` (`id`),
|
||
CONSTRAINT `fk_reading_customer` FOREIGN KEY (`customer_id`) REFERENCES `water_customer` (`id`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='抄表记录表';
|
||
```
|
||
|
||
#### 2.2 水费账单表
|
||
|
||
```sql
|
||
CREATE TABLE `water_bill` (
|
||
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
|
||
`bill_code` varchar(32) NOT NULL COMMENT '账单编号',
|
||
`bill_month` varchar(7) NOT NULL COMMENT '账期(格式:YYYY-MM)',
|
||
`bill_date` date NOT NULL COMMENT '开账日期',
|
||
`water_usage` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '用水量',
|
||
`prev_reading` decimal(10,2) DEFAULT NULL COMMENT '上期读数',
|
||
`current_reading` decimal(10,2) DEFAULT NULL COMMENT '本期读数',
|
||
`reading_days` int DEFAULT NULL COMMENT '抄表间隔天数',
|
||
`water_price` decimal(8,4) DEFAULT NULL COMMENT '水价单价',
|
||
`water_fee` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '水费金额',
|
||
`sewage_fee` decimal(10,2) DEFAULT '0.00' COMMENT '污水处理费',
|
||
`garbage_fee` decimal(10,2) DEFAULT '0.00' COMMENT '垃圾处理费',
|
||
`other_fee` decimal(10,2) DEFAULT '0.00' COMMENT '其他费用',
|
||
`adjustment_fee` decimal(10,2) DEFAULT '0.00' COMMENT '调整费用',
|
||
`late_fee` decimal(10,2) DEFAULT '0.00' COMMENT '滞纳金',
|
||
`total_amount` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '总金额',
|
||
`paid_amount` decimal(10,2) DEFAULT '0.00' COMMENT '已缴金额',
|
||
`balance_amount` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '余额',
|
||
`due_date` date NOT NULL COMMENT '缴费截止日期',
|
||
`billing_type` varchar(20) DEFAULT 'NORMAL' COMMENT '开账类型(正常:NORMAL,追补:SUPPLEMENT,调整:ADJUSTMENT)',
|
||
`bill_status` tinyint NOT NULL DEFAULT '0' COMMENT '账单状态(0:未缴费,1:已缴费,2:部分缴费,3:作废)',
|
||
`payment_status` tinyint DEFAULT '0' COMMENT '缴费状态(0:未缴,1:已缴,2:部分缴费)',
|
||
`customer_id` bigint NOT NULL COMMENT '客户ID',
|
||
`meter_id` bigint NOT NULL COMMENT '水表ID',
|
||
`reading_id` bigint DEFAULT NULL COMMENT '抄表记录ID',
|
||
`tenant_id` bigint NOT NULL DEFAULT '0' COMMENT '租户ID',
|
||
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
|
||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
|
||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
|
||
PRIMARY KEY (`id`),
|
||
UNIQUE KEY `uk_bill_code` (`bill_code`, `tenant_id`),
|
||
KEY `idx_customer_bill_month` (`customer_id`, `bill_month`),
|
||
KEY `idx_meter_bill_month` (`meter_id`, `bill_month`),
|
||
KEY `idx_bill_status` (`bill_status`),
|
||
KEY `idx_due_date` (`due_date`),
|
||
KEY `idx_tenant_customer_month` (`tenant_id`, `customer_id`, `bill_month`),
|
||
CONSTRAINT `fk_bill_customer` FOREIGN KEY (`customer_id`) REFERENCES `water_customer` (`id`),
|
||
CONSTRAINT `fk_bill_meter` FOREIGN KEY (`meter_id`) REFERENCES `water_meter` (`id`),
|
||
CONSTRAINT `fk_bill_reading` FOREIGN KEY (`reading_id`) REFERENCES `water_meter_reading` (`id`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='水费账单表';
|
||
```
|
||
|
||
#### 2.3 缴费记录表
|
||
|
||
```sql
|
||
CREATE TABLE `water_payment` (
|
||
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
|
||
`payment_code` varchar(32) NOT NULL COMMENT '缴费记录编号',
|
||
`payment_type` varchar(20) NOT NULL COMMENT '缴费类型(正常缴费:NORMAL,预存:PREPAID,退费:REFUND)',
|
||
`payment_channel` varchar(20) NOT NULL COMMENT '缴费渠道(现金:CASH,银行卡:BANK_CARD,微信:WECHAT,支付宝:ALIPAY,银行代扣:BANK_DEDUCT)',
|
||
`payment_amount` decimal(10,2) NOT NULL COMMENT '缴费金额',
|
||
`actual_amount` decimal(10,2) DEFAULT NULL COMMENT '实收金额',
|
||
`change_amount` decimal(10,2) DEFAULT '0.00' COMMENT '找零金额',
|
||
`payment_time` datetime NOT NULL COMMENT '缴费时间',
|
||
`transaction_no` varchar(50) DEFAULT NULL COMMENT '交易流水号',
|
||
`third_party_no` varchar(50) DEFAULT NULL COMMENT '第三方交易号',
|
||
`operator_id` varchar(20) DEFAULT NULL COMMENT '操作员ID',
|
||
`operator_name` varchar(50) DEFAULT NULL COMMENT '操作员姓名',
|
||
`outlet_code` varchar(20) DEFAULT NULL COMMENT '营业网点代码',
|
||
`pos_machine_no` varchar(20) DEFAULT NULL COMMENT 'POS机编号',
|
||
`invoice_no` varchar(30) DEFAULT NULL COMMENT '发票号码',
|
||
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
|
||
`payment_status` tinyint NOT NULL DEFAULT '1' COMMENT '缴费状态(0:待确认,1:成功,2:失败,3:退费)',
|
||
`bill_id` bigint DEFAULT NULL COMMENT '账单ID',
|
||
`customer_id` bigint NOT NULL COMMENT '客户ID',
|
||
`tenant_id` bigint NOT NULL DEFAULT '0' COMMENT '租户ID',
|
||
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
|
||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
|
||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
|
||
PRIMARY KEY (`id`),
|
||
UNIQUE KEY `uk_payment_code` (`payment_code`, `tenant_id`),
|
||
KEY `idx_customer_payment_time` (`customer_id`, `payment_time`),
|
||
KEY `idx_payment_time` (`payment_time`),
|
||
KEY `idx_transaction_no` (`transaction_no`),
|
||
KEY `idx_operator_id` (`operator_id`),
|
||
KEY `idx_payment_status` (`payment_status`),
|
||
KEY `idx_bill_id` (`bill_id`),
|
||
CONSTRAINT `fk_payment_customer` FOREIGN KEY (`customer_id`) REFERENCES `water_customer` (`id`),
|
||
CONSTRAINT `fk_payment_bill` FOREIGN KEY (`bill_id`) REFERENCES `water_bill` (`id`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='缴费记录表';
|
||
```
|
||
|
||
### 3. 表务管理相关表DDL
|
||
|
||
#### 3.1 水表档案表
|
||
|
||
```sql
|
||
CREATE TABLE `water_meter_archive` (
|
||
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
|
||
`archive_code` varchar(32) NOT NULL COMMENT '档案编号',
|
||
`manufacturer` varchar(100) DEFAULT NULL COMMENT '生产厂家',
|
||
`production_date` date DEFAULT NULL COMMENT '生产日期',
|
||
`valid_period` int DEFAULT '72' COMMENT '有效期(月)',
|
||
`verification_date` date DEFAULT NULL COMMENT '检定日期',
|
||
`next_verification_date` date DEFAULT NULL COMMENT '下次检定日期',
|
||
`certificate_no` varchar(50) DEFAULT NULL COMMENT '检定证书号',
|
||
`verification_agency` varchar(100) DEFAULT NULL COMMENT '检定机构',
|
||
`accuracy_level` varchar(10) DEFAULT NULL COMMENT '精度等级',
|
||
`max_flow` decimal(8,2) DEFAULT NULL COMMENT '最大流量',
|
||
`nominal_flow` decimal(8,2) DEFAULT NULL COMMENT '常用流量',
|
||
`min_flow` decimal(8,2) DEFAULT NULL COMMENT '最小流量',
|
||
`working_pressure` decimal(8,2) DEFAULT NULL COMMENT '工作压力',
|
||
`purchase_date` date DEFAULT NULL COMMENT '采购日期',
|
||
`purchase_price` decimal(10,2) DEFAULT NULL COMMENT '采购价格',
|
||
`supplier` varchar(100) DEFAULT NULL COMMENT '供应商',
|
||
`warranty_period` int DEFAULT '24' COMMENT '质保期(月)',
|
||
`installation_cost` decimal(10,2) DEFAULT NULL COMMENT '安装费用',
|
||
`archive_status` tinyint NOT NULL DEFAULT '1' COMMENT '档案状态(0:停用,1:正常,2:报废)',
|
||
`meter_id` bigint NOT NULL COMMENT '水表ID',
|
||
`tenant_id` bigint NOT NULL DEFAULT '0' COMMENT '租户ID',
|
||
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
|
||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
|
||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
|
||
PRIMARY KEY (`id`),
|
||
UNIQUE KEY `uk_archive_code` (`archive_code`, `tenant_id`),
|
||
UNIQUE KEY `uk_meter_archive` (`meter_id`, `tenant_id`),
|
||
KEY `idx_manufacturer` (`manufacturer`),
|
||
KEY `idx_verification_date` (`verification_date`),
|
||
KEY `idx_next_verification_date` (`next_verification_date`),
|
||
KEY `idx_archive_status` (`archive_status`),
|
||
CONSTRAINT `fk_archive_meter` FOREIGN KEY (`meter_id`) REFERENCES `water_meter` (`id`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='水表档案表';
|
||
```
|
||
|
||
### 4. 系统管理相关表DDL
|
||
|
||
#### 4.1 数据字典表
|
||
|
||
```sql
|
||
CREATE TABLE `water_dict_data` (
|
||
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
|
||
`dict_type` varchar(100) NOT NULL COMMENT '字典类型',
|
||
`dict_label` varchar(100) NOT NULL COMMENT '字典标签',
|
||
`dict_value` varchar(100) NOT NULL COMMENT '字典键值',
|
||
`dict_sort` int NOT NULL DEFAULT '0' COMMENT '字典排序',
|
||
`color_type` varchar(100) DEFAULT '' COMMENT '颜色类型',
|
||
`css_class` varchar(100) DEFAULT '' COMMENT 'CSS类名',
|
||
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
|
||
`status` tinyint NOT NULL DEFAULT '1' COMMENT '状态(0:停用,1:正常)',
|
||
`tenant_id` bigint NOT NULL DEFAULT '0' COMMENT '租户ID',
|
||
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
|
||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
|
||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
|
||
PRIMARY KEY (`id`),
|
||
KEY `idx_dict_type` (`dict_type`),
|
||
KEY `idx_dict_value` (`dict_value`),
|
||
KEY `idx_status` (`status`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='数据字典表';
|
||
```
|
||
|
||
### 5. 初始化数据脚本
|
||
|
||
```sql
|
||
-- 插入基础字典数据
|
||
INSERT INTO `water_dict_data` (`dict_type`, `dict_label`, `dict_value`, `dict_sort`, `status`, `remark`) VALUES
|
||
('customer_type', '居民用户', 'RESIDENT', 1, 1, '居民生活用水'),
|
||
('customer_type', '非居民用户', 'NON_RESIDENT', 2, 1, '非居民用水'),
|
||
('customer_type', '工业用户', 'INDUSTRIAL', 3, 1, '工业生产用水'),
|
||
('customer_type', '行政用户', 'ADMINISTRATIVE', 4, 1, '行政事业单位用水'),
|
||
|
||
('meter_type', '机械水表', 'MECHANICAL', 1, 1, '传统机械式水表'),
|
||
('meter_type', '智能水表', 'SMART', 2, 1, '智能电子水表'),
|
||
('meter_type', '远传水表', 'REMOTE', 3, 1, '远程传输水表'),
|
||
|
||
('reading_type', '人工抄表', 'MANUAL', 1, 1, '抄表员现场抄表'),
|
||
('reading_type', '远程抄表', 'REMOTE', 2, 1, '远程自动抄表'),
|
||
('reading_type', '客户自报', 'SELF_REPORT', 3, 1, '客户自主上报'),
|
||
('reading_type', '估算抄表', 'ESTIMATE', 4, 1, '估算用水量'),
|
||
|
||
('payment_channel', '现金', 'CASH', 1, 1, '现金缴费'),
|
||
('payment_channel', '银行卡', 'BANK_CARD', 2, 1, '银行卡刷卡'),
|
||
('payment_channel', '微信支付', 'WECHAT', 3, 1, '微信在线支付'),
|
||
('payment_channel', '支付宝', 'ALIPAY', 4, 1, '支付宝在线支付'),
|
||
('payment_channel', '银行代扣', 'BANK_DEDUCT', 5, 1, '银行自动代扣');
|
||
```
|
||
|
||
## 六、索引设计
|
||
|
||
为提高系统性能,针对主要查询场景设计了以下索引:
|
||
|
||
### 5.1 主键索引
|
||
- 所有表的主键字段均建立主键索引
|
||
|
||
### 5.2 外键索引
|
||
- 表关联字段建立外键索引,如 CUSTOMER_ID, METER_ID 等
|
||
|
||
### 5.3 常用查询字段索引
|
||
- 客户表:CUSTOMER_NAME, PHONE, ID_NUMBER
|
||
- 水表表:METER_NO, BOOK_ID
|
||
- 账单表:BILL_MONTH, STATUS
|
||
- 缴费表:PAYMENT_DATE, TRANSACTION_NO
|
||
- 抄表表:READING_DATE
|
||
|
||
### 5.4 复合索引
|
||
- 客户表:(TENANT_ID, CUSTOMER_TYPE)
|
||
- 账单表:(TENANT_ID, CUSTOMER_ID, BILL_MONTH)
|
||
- 抄表表:(TENANT_ID, METER_ID, READING_DATE)
|
||
|
||
## 6. 数据安全性设计
|
||
|
||
### 6.1 数据加密
|
||
- 敏感个人信息(如身份证号码、银行账号等)采用加密存储
|
||
- 加密算法采用 AES-256 或同等安全级别的加密方式
|
||
|
||
### 6.2 权限控制
|
||
- 采用基于角色的访问控制(RBAC)模型
|
||
- 对不同角色用户设置不同的数据访问权限
|
||
- 实现行级、列级的细粒度权限控制
|
||
|
||
### 6.3 数据备份与恢复
|
||
- 定期全量备份,每日增量备份
|
||
- 异地数据灾备,确保数据安全
|
||
- 完善的数据恢复机制,支持按时间点恢复
|
||
|
||
### 6.4 数据审计
|
||
- 关键业务操作的数据变更记录
|
||
- 敏感数据访问日志记录
|
||
- 数据异常访问监控与告警 |