fujian_water_biz_doc/processed_docs/water_biz_database_design.md

40 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. 数据库架构图

流程图 1\n

2. 多租户架构设计

流程图 2\n

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图

流程图 3\n

2. 营收管理模块ER图

流程图 4\n

3. 表务管理模块ER图

流程图 5\n

4. 系统管理模块ER图

流程图 6\n

四、核心数据表设计

1. 表务管理模块ER图

流程图 7\n

2. 系统管理模块ER图

流程图 8\n

五、完整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');