fujian_water_biz_doc/water_biz_database_design.md

53 KiB
Raw Blame History

福建水务营收系统数据库设计文档

文档信息

项目信息 详情
项目名称 福建水务营收系统
文档类型 概要设计文档
技术框架 RuoYi-Vue-Pro + yudao-ui-admin-vue3
文档版本 v1.0
编写日期 2024-12-19
文档状态 已完成

目录

一、数据库设计概述

福建水务营收系统采用**华为OpenGauss 5.0+**数据库基于RuoYi-Vue-Pro框架规范设计。OpenGauss作为国产自主可控的企业级数据库具有高性能、高可用、高安全的特点完全满足水务行业对数据安全和国产化的要求。数据库架构支持多租户、高并发、高可用的业务需求为水务营收业务提供稳定可靠的数据存储服务。

1.1 设计目标

  • 支持100万客户的业务量满足3-5年业务发展需求
  • 支持200并发用户50并发移动设备
  • 系统响应时间不超过3秒
  • 数据安全等保三级要求
  • 支持多租户数据隔离
  • 国产化要求:符合国产数据库替代要求

1.2 数据库选型优势

  • 国产自主可控华为OpenGauss是完全自主知识产权的数据库
  • 高性能优化的SQL引擎查询性能优于传统数据库20-30%
  • 高可用:支持主备同步、读写分离、故障自动切换
  • 安全可信:内置数据加密、审计、权限管控等安全特性
  • 生态兼容兼容PostgreSQL/MySQL协议迁移成本低

1.3 设计原则

  • 标准化遵循OpenGauss数据库设计规范
  • 多租户基于tenant_id字段实现数据隔离
  • 可扩展:预留扩展字段,支持业务增长
  • 高性能:合理设计索引,优化查询性能
  • 安全性利用OpenGauss内置安全特性

二、数据库架构

1. 数据库架构图

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

2. 多租户架构设计

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

3. 通用字段设计

所有业务表统一包含以下基础字段:

字段名 数据类型 长度 默认值 描述
id BIGINT - AUTO_INCREMENT 主键ID
tenant_id BIGINT - 0 租户ID(多租户隔离)
creator VARCHAR 64 '' 创建者
create_time DATETIME - CURRENT_TIMESTAMP 创建时间
updater VARCHAR 64 '' 更新者
update_time DATETIME - CURRENT_TIMESTAMP 更新时间
deleted BIT 1 0 逻辑删除标识

三、核心数据模型ER图

1. 客户管理模块ER图

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图

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图

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图

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 : "包含"

四、核心数据表设计

1. 表务管理模块ER图

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 : "关联"

2. 系统管理模块ER图

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 : "包含"

五、完整DDL语句

1. 客户管理相关表DDL

1.1 客户基本信息表

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 水表信息表

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='水表信息表';

3. 表务工单管理表DDL

3.1 表务工单表

CREATE TABLE `water_meter_workorder` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `workorder_code` varchar(32) NOT NULL COMMENT '工单编号',
  `workorder_type` varchar(20) NOT NULL COMMENT '工单类型(换表:CHANGE,移表:MOVE,拆表:REMOVE,装表:INSTALL,维修:REPAIR)',
  `workorder_status` varchar(20) NOT NULL DEFAULT 'PENDING' COMMENT '工单状态(待处理:PENDING,执行中:PROCESSING,已完成:COMPLETED,已取消:CANCELLED)',
  `apply_date` date NOT NULL COMMENT '申请日期',
  `plan_date` date DEFAULT NULL COMMENT '计划执行日期',
  `execute_date` date DEFAULT NULL COMMENT '实际执行日期',
  `applicant_id` varchar(20) DEFAULT NULL COMMENT '申请人ID',
  `applicant_name` varchar(50) DEFAULT NULL COMMENT '申请人姓名',
  `executor_id` varchar(20) DEFAULT NULL COMMENT '执行人ID',
  `executor_name` varchar(50) DEFAULT NULL COMMENT '执行人姓名',
  `reason` varchar(500) DEFAULT NULL COMMENT '申请原因',
  `result` varchar(500) DEFAULT NULL COMMENT '执行结果',
  `old_meter_no` varchar(30) DEFAULT NULL COMMENT '旧水表表号',
  `new_meter_no` varchar(30) DEFAULT NULL COMMENT '新水表表号',
  `old_reading` decimal(10,2) DEFAULT NULL COMMENT '旧表读数',
  `new_reading` decimal(10,2) DEFAULT NULL COMMENT '新表读数',
  `cost_amount` decimal(10,2) DEFAULT NULL COMMENT '费用金额',
  `remark` varchar(500) DEFAULT NULL COMMENT '备注',
  `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_workorder_code` (`workorder_code`, `tenant_id`),
  KEY `idx_workorder_type` (`workorder_type`),
  KEY `idx_workorder_status` (`workorder_status`),
  KEY `idx_apply_date` (`apply_date`),
  KEY `idx_meter_id` (`meter_id`),
  KEY `idx_customer_id` (`customer_id`),
  KEY `idx_tenant_type_status` (`tenant_id`, `workorder_type`, `workorder_status`),
  CONSTRAINT `fk_workorder_meter` FOREIGN KEY (`meter_id`) REFERENCES `water_meter` (`id`),
  CONSTRAINT `fk_workorder_customer` FOREIGN KEY (`customer_id`) REFERENCES `water_customer` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='表务工单表';

3.2 水表库存管理表

CREATE TABLE `water_meter_stock` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `stock_code` varchar(32) NOT NULL COMMENT '库存编号',
  `meter_brand` varchar(50) NOT NULL COMMENT '水表品牌',
  `meter_model` varchar(50) NOT NULL COMMENT '水表型号',
  `meter_caliber` varchar(10) NOT NULL COMMENT '水表口径',
  `meter_type` varchar(20) NOT NULL COMMENT '水表类型',
  `stock_quantity` int NOT NULL DEFAULT '0' COMMENT '库存数量',
  `min_stock` int NOT NULL DEFAULT '0' COMMENT '最小库存',
  `max_stock` int DEFAULT NULL COMMENT '最大库存',
  `unit_price` decimal(10,2) DEFAULT NULL COMMENT '单价',
  `warehouse_location` varchar(100) DEFAULT NULL COMMENT '仓库位置',
  `supplier` varchar(100) DEFAULT NULL COMMENT '供应商',
  `purchase_date` date DEFAULT NULL COMMENT '进货日期',
  `warranty_period` int DEFAULT '24' COMMENT '质保期(月)',
  `stock_status` tinyint NOT NULL DEFAULT '1' COMMENT '库存状态(0:停用,1:正常,2:缺货,3:超储)',
  `remark` varchar(500) DEFAULT NULL COMMENT '备注',
  `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_stock_code` (`stock_code`, `tenant_id`),
  KEY `idx_meter_brand` (`meter_brand`),
  KEY `idx_meter_model` (`meter_model`),
  KEY `idx_meter_caliber` (`meter_caliber`),
  KEY `idx_stock_status` (`stock_status`),
  KEY `idx_tenant_brand_model` (`tenant_id`, `meter_brand`, `meter_model`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='水表库存管理表';

4. 系统管理相关表DDL

4.1 数据字典类型表

CREATE TABLE `water_dict_type` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `dict_name` varchar(100) NOT NULL COMMENT '字典名称',
  `dict_type` varchar(100) NOT NULL COMMENT '字典类型',
  `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`),
  UNIQUE KEY `uk_dict_type` (`dict_type`, `tenant_id`),
  KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='数据字典类型表';

5. 完整DDL语句列表

5.1 客户基本信息表 (OpenGauss版本)

-- OpenGauss数据库DDL语句
CREATE TABLE water_customer (
  id SERIAL PRIMARY KEY,
  customer_code VARCHAR(32) NOT NULL,
  customer_name VARCHAR(100) NOT NULL,
  customer_type VARCHAR(20) NOT NULL CHECK (customer_type IN ('RESIDENT','NON_RESIDENT','INDUSTRIAL','ADMINISTRATIVE')),
  id_type VARCHAR(20) DEFAULT NULL CHECK (id_type IN ('ID_CARD','BUSINESS_LICENSE') OR id_type IS NULL),
  id_number VARCHAR(30) DEFAULT NULL,
  phone VARCHAR(20) DEFAULT NULL,
  mobile VARCHAR(20) DEFAULT NULL,
  email VARCHAR(100) DEFAULT NULL,
  address VARCHAR(500) DEFAULT NULL,
  area_code VARCHAR(20) DEFAULT NULL,
  postal_code VARCHAR(10) DEFAULT NULL,
  contact_person VARCHAR(50) DEFAULT NULL,
  bank_account VARCHAR(50) DEFAULT NULL,
  bank_name VARCHAR(100) DEFAULT NULL,
  remark VARCHAR(500) DEFAULT NULL,
  status SMALLINT NOT NULL DEFAULT 1 CHECK (status IN (0,1,2,3)),
  tenant_id BIGINT NOT NULL DEFAULT 0,
  creator VARCHAR(64) DEFAULT '',
  create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  updater VARCHAR(64) DEFAULT '',
  update_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  deleted BOOLEAN NOT NULL DEFAULT FALSE
);

-- 创建注释
COMMENT ON TABLE water_customer IS '客户基本信息表';
COMMENT ON COLUMN water_customer.id IS '主键ID';
COMMENT ON COLUMN water_customer.customer_code IS '客户编号';
COMMENT ON COLUMN water_customer.customer_name IS '客户名称';
COMMENT ON COLUMN water_customer.customer_type IS '客户类型(居民:RESIDENT,非居民:NON_RESIDENT,工业:INDUSTRIAL,行政:ADMINISTRATIVE)';
COMMENT ON COLUMN water_customer.id_type IS '证件类型(身份证:ID_CARD,营业执照:BUSINESS_LICENSE)';
COMMENT ON COLUMN water_customer.id_number IS '证件号码';
COMMENT ON COLUMN water_customer.phone IS '联系电话';
COMMENT ON COLUMN water_customer.mobile IS '手机号码';
COMMENT ON COLUMN water_customer.email IS '邮箱';
COMMENT ON COLUMN water_customer.address IS '详细地址';
COMMENT ON COLUMN water_customer.area_code IS '行政区划代码';
COMMENT ON COLUMN water_customer.postal_code IS '邮政编码';
COMMENT ON COLUMN water_customer.contact_person IS '联系人';
COMMENT ON COLUMN water_customer.bank_account IS '银行账户';
COMMENT ON COLUMN water_customer.bank_name IS '开户银行';
COMMENT ON COLUMN water_customer.remark IS '备注信息';
COMMENT ON COLUMN water_customer.status IS '状态(0:停用,1:正常,2:欠费,3:销户)';
COMMENT ON COLUMN water_customer.tenant_id IS '租户ID';
COMMENT ON COLUMN water_customer.creator IS '创建者';
COMMENT ON COLUMN water_customer.create_time IS '创建时间';
COMMENT ON COLUMN water_customer.updater IS '更新者';
COMMENT ON COLUMN water_customer.update_time IS '更新时间';
COMMENT ON COLUMN water_customer.deleted IS '是否删除';

-- 创建索引
CREATE UNIQUE INDEX uk_customer_code ON water_customer (customer_code, tenant_id);
CREATE INDEX idx_customer_name ON water_customer (customer_name);
CREATE INDEX idx_phone ON water_customer (phone);
CREATE INDEX idx_id_number ON water_customer (id_number);
CREATE INDEX idx_tenant_customer_type ON water_customer (tenant_id, customer_type);
CREATE INDEX idx_status ON water_customer (status);
CREATE INDEX idx_create_time ON water_customer (create_time);

-- 创建更新时间触发器
CREATE OR REPLACE FUNCTION update_timestamp()
RETURNS TRIGGER AS $$
BEGIN
    NEW.update_time = CURRENT_TIMESTAMP;
    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER water_customer_update_timestamp
    BEFORE UPDATE ON water_customer
    FOR EACH ROW
    EXECUTE FUNCTION update_timestamp();

1.2 水表信息表

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 客户账户表

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 抄表记录表

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 水费账单表

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 缴费记录表

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 水表档案表

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 数据字典表

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. 初始化数据脚本

-- 插入基础字典数据
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, '银行自动代扣');

六、OpenGauss数据库特性应用

1. OpenGauss高级特性

1.1 分区表设计

-- 按月份分区的账单表
CREATE TABLE water_bill (
  -- 字段定义...
) PARTITION BY RANGE (bill_month) (
  PARTITION p202401 VALUES LESS THAN ('2024-02'),
  PARTITION p202402 VALUES LESS THAN ('2024-03'),
  PARTITION p202403 VALUES LESS THAN ('2024-04')
  -- 继续按月创建分区...
);

1.2 列存储表

-- 统计分析用的列存储表
CREATE TABLE water_bill_stats (
  -- 字段定义...
) WITH (ORIENTATION = COLUMN);

1.3 内存表

-- 配置参数缓存表
CREATE TABLE water_config_cache (
  -- 字段定义...
) WITH (ORIENTATION = ROW, STORAGE_TYPE = USTORE);

2. 性能优化配置

2.1 连接池配置

-- OpenGauss连接池参数
ALTER SYSTEM SET max_connections = 200;
ALTER SYSTEM SET shared_buffers = '256MB';
ALTER SYSTEM SET effective_cache_size = '1GB';
ALTER SYSTEM SET work_mem = '4MB';

2.2 并行查询

-- 启用并行查询
ALTER SYSTEM SET max_parallel_workers = 8;
ALTER SYSTEM SET max_parallel_workers_per_gather = 4;

七、索引设计与优化

1. 基础索引设计

1.1 主键索引

  • 所有表使用SERIAL主键自动创建B树索引
  • 支持OpenGauss的快速主键查询优化

1.2 唯一索引

-- 客户编号唯一索引
CREATE UNIQUE INDEX uk_customer_code ON water_customer (customer_code, tenant_id);
-- 水表编号唯一索引  
CREATE UNIQUE INDEX uk_meter_code ON water_meter (meter_code, tenant_id);

1.3 复合索引

-- 多租户查询优化
CREATE INDEX idx_tenant_customer_type ON water_customer (tenant_id, customer_type);
-- 账单查询优化
CREATE INDEX idx_tenant_customer_month ON water_bill (tenant_id, customer_id, bill_month);
-- 抄表查询优化
CREATE INDEX idx_tenant_meter_date ON water_meter_reading (tenant_id, meter_id, reading_date);

2. OpenGauss特殊索引

2.1 HASH索引

-- 等值查询优化
CREATE INDEX CONCURRENTLY idx_customer_phone_hash ON water_customer USING HASH (phone);

2.2 GIN索引

-- 全文检索索引
CREATE INDEX idx_customer_name_gin ON water_customer USING GIN (to_tsvector('simple', customer_name));

2.3 部分索引

-- 只对有效数据建索引
CREATE INDEX idx_active_customers ON water_customer (customer_code) WHERE deleted = FALSE AND status = 1;

八、OpenGauss数据安全设计

1. 内置安全特性

1.1 透明数据加密 (TDE)

-- 启用表级加密
CREATE TABLE water_customer_encrypted (
  -- 字段定义...
) WITH (ENCRYPTION_TYPE = 'AES_128_CTR');

-- 敏感字段加密
ALTER TABLE water_customer 
ADD COLUMN id_number_encrypted BYTEA 
GENERATED ALWAYS AS (gs_encrypt_aes128(id_number, '密钥')) STORED;

1.2 行级安全策略 (RLS)

-- 创建多租户行级安全
ALTER TABLE water_customer ENABLE ROW LEVEL SECURITY;

-- 创建策略
CREATE POLICY tenant_isolation_policy ON water_customer
  FOR ALL TO PUBLIC
  USING (tenant_id = current_setting('app.current_tenant_id')::bigint);

1.3 动态数据脱敏

-- 创建脱敏函数
CREATE OR REPLACE FUNCTION mask_phone(phone_no TEXT)
RETURNS TEXT AS $$
BEGIN
  RETURN SUBSTRING(phone_no, 1, 3) || '****' || SUBSTRING(phone_no, 8);
END;
$$ LANGUAGE plpgsql;

-- 创建脱敏视图
CREATE VIEW water_customer_masked AS
SELECT 
  id, customer_code, customer_name,
  mask_phone(phone) as phone_masked,
  -- 其他字段...
FROM water_customer;

2. 权限控制体系

2.1 角色权限设计

-- 创建业务角色
CREATE ROLE water_admin;
CREATE ROLE water_operator;
CREATE ROLE water_viewer;

-- 分配权限
GRANT ALL ON water_customer TO water_admin;
GRANT SELECT, INSERT, UPDATE ON water_customer TO water_operator;
GRANT SELECT ON water_customer_masked TO water_viewer;

2.2 列级权限控制

-- 敏感字段权限控制
REVOKE ALL ON water_customer FROM PUBLIC;
GRANT SELECT (id, customer_name, phone) ON water_customer TO water_viewer;
GRANT SELECT ON water_customer TO water_admin;

3. 审计与监控

3.1 审计日志配置

-- 启用审计
ALTER SYSTEM SET audit_enabled = on;
ALTER SYSTEM SET audit_directory = '/data/audit';
ALTER SYSTEM SET audit_file_remain_threshold = 1024;

-- 配置审计策略
SELECT pg_audit_set_policy('DDL_LOGIN_LOGOUT', 'DDL, LOGIN, LOGOUT');
SELECT pg_audit_set_policy('DML_DCL', 'DML, DCL');

3.2 敏感操作监控

-- 创建敏感操作触发器
CREATE OR REPLACE FUNCTION audit_sensitive_data()
RETURNS TRIGGER AS $$
BEGIN
  INSERT INTO audit_log (
    table_name, operation, old_values, new_values, 
    user_name, operation_time
  ) VALUES (
    TG_TABLE_NAME, TG_OP, 
    row_to_json(OLD), row_to_json(NEW),
    current_user, current_timestamp
  );
  RETURN COALESCE(NEW, OLD);
END;
$$ LANGUAGE plpgsql;

-- 应用到敏感表
CREATE TRIGGER audit_customer_changes
  AFTER INSERT OR UPDATE OR DELETE ON water_customer
  FOR EACH ROW EXECUTE FUNCTION audit_sensitive_data();

4. 数据备份与灾备

4.1 OpenGauss备份策略

-- 全量备份
gs_backup -D /data/backup -h localhost -p 5432 -U backup_user

-- 增量备份  
gs_backup -D /data/backup -h localhost -p 5432 -U backup_user --incremental

-- 归档日志备份
ALTER SYSTEM SET archive_mode = on;
ALTER SYSTEM SET archive_command = 'cp %p /data/archive/%f';

4.2 主备同步配置

-- 主库配置
ALTER SYSTEM SET synchronous_standby_names = 'standby1';
ALTER SYSTEM SET synchronous_commit = on;

-- 备库配置
ALTER SYSTEM SET hot_standby = on;
ALTER SYSTEM SET max_standby_streaming_delay = 30s;

5. 国产化安全合规

5.1 等保三级要求

  • 身份鉴别:支持多因子认证、密码复杂度策略
  • 访问控制:基于角色的强制访问控制
  • 安全审计:完整的操作审计和安全事件记录
  • 数据完整性:数据校验和完整性保护
  • 数据保密性:敏感数据加密存储和传输

5.2 国产化认证

  • 华为OpenGauss已通过国家密码管理局商用密码产品认证
  • 支持国产SM2/SM3/SM4密码算法
  • 符合《网络安全法》、《数据安全法》等法规要求
-- 使用国产SM4算法加密
CREATE TABLE water_customer_sm4 (
  -- 字段定义...
) WITH (ENCRYPTION_TYPE = 'SM4_CTR');