更新Makefile,新增导出包含图表的Word文档和快速修复docx文档中流程图问题的功能。同时,更新项目进度和任务清单,记录Mermaid图表处理工具的创建及标题层次修复,确保文档质量和规范性符合甲方A级交付标准。

This commit is contained in:
tangweijie 2025-06-09 16:26:47 +08:00
parent d775ab95eb
commit 5212e52031
11 changed files with 6337 additions and 32 deletions

View File

@ -20,6 +20,8 @@ help:
@echo " check-links 检查所有链接"
@echo " merge-docs 合并所有文档"
@echo " clean 清理临时文件"
@echo " export-word-with-diagrams 导出包含图表的Word文档"
@echo " fix-docx-diagrams 快速修复处理docx文档中的流程图问题"
@echo ""
@echo "示例:"
@echo " make init # 初始化工具链"
@ -181,4 +183,15 @@ update:
@echo "更新文档工具链..."
@git pull origin main 2>/dev/null || echo "无法从远程仓库更新"
@chmod +x scripts/doc-toolkit.sh
@echo "工具链更新完成"
@echo "工具链更新完成"
# 导出包含图表的Word文档
export-word-with-diagrams:
@echo "导出包含图表的Word格式文档..."
@chmod +x scripts/process-mermaid.sh
@./scripts/process-mermaid.sh
# 快速修复处理Mermaid图表问题
fix-docx-diagrams:
@echo "修复docx文档中的流程图问题..."
@./scripts/process-mermaid.sh

View File

@ -0,0 +1,926 @@
# 福建水务营收系统数据库设计文档
## 文档信息
| 项目信息 | 详情 |
|---------|------|
| **项目名称** | 福建水务营收系统 |
| **文档类型** | 概要设计文档 |
| **技术框架** | RuoYi-Vue-Pro + yudao-ui-admin-vue3 |
| **文档版本** | v1.0 |
| **编写日期** | 2024-12-19 |
| **文档状态** | ✅ 已完成 |
## 目录
- [一、数据库设计概述](#一数据库设计概述)
- [二、数据库架构](#二数据库架构)
- [三、核心数据模型ER图](#三核心数据模型er图)
- [四、核心数据表设计](#四核心数据表设计)
- [五、完整DDL语句](#五完整ddl语句)
- [六、OpenGauss数据库特性应用](#六opengauss数据库特性应用)
- [七、索引设计与优化](#七索引设计与优化)
- [八、OpenGauss数据安全设计](#八opengauss数据安全设计)
## 一、数据库设计概述
福建水务营收系统采用**华为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](temp_mermaid_86176/diagram_1.png)\n
### 2. 多租户架构设计
![流程图 2](temp_mermaid_86176/diagram_2.png)\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](temp_mermaid_86176/diagram_3.png)\n
### 2. 营收管理模块ER图
![流程图 4](temp_mermaid_86176/diagram_4.png)\n
### 3. 表务管理模块ER图
![流程图 5](temp_mermaid_86176/diagram_5.png)\n
### 4. 系统管理模块ER图
![流程图 6](temp_mermaid_86176/diagram_6.png)\n
## 四、核心数据表设计
### 1. 表务管理模块ER图
![流程图 7](temp_mermaid_86176/diagram_7.png)\n
### 2. 系统管理模块ER图
![流程图 8](temp_mermaid_86176/diagram_8.png)\n
## 五、完整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='水表信息表';
```
### 3. 表务工单管理表DDL
#### 3.1 表务工单表
```sql
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 水表库存管理表
```sql
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 数据字典类型表
```sql
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版本)
```sql
-- 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 水表信息表
```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, '银行自动代扣');
```
## 六、OpenGauss数据库特性应用
### 1. OpenGauss高级特性
#### 1.1 分区表设计
```sql
-- 按月份分区的账单表
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 列存储表
```sql
-- 统计分析用的列存储表
CREATE TABLE water_bill_stats (
-- 字段定义...
) WITH (ORIENTATION = COLUMN);
```
#### 1.3 内存表
```sql
-- 配置参数缓存表
CREATE TABLE water_config_cache (
-- 字段定义...
) WITH (ORIENTATION = ROW, STORAGE_TYPE = USTORE);
```
### 2. 性能优化配置
#### 2.1 连接池配置
```sql
-- 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 并行查询
```sql
-- 启用并行查询
ALTER SYSTEM SET max_parallel_workers = 8;
ALTER SYSTEM SET max_parallel_workers_per_gather = 4;
```
## 七、索引设计与优化
### 1. 基础索引设计
#### 1.1 主键索引
- 所有表使用SERIAL主键自动创建B树索引
- 支持OpenGauss的快速主键查询优化
#### 1.2 唯一索引
```sql
-- 客户编号唯一索引
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 复合索引
```sql
-- 多租户查询优化
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索引
```sql
-- 等值查询优化
CREATE INDEX CONCURRENTLY idx_customer_phone_hash ON water_customer USING HASH (phone);
```
#### 2.2 GIN索引
```sql
-- 全文检索索引
CREATE INDEX idx_customer_name_gin ON water_customer USING GIN (to_tsvector('simple', customer_name));
```
#### 2.3 部分索引
```sql
-- 只对有效数据建索引
CREATE INDEX idx_active_customers ON water_customer (customer_code) WHERE deleted = FALSE AND status = 1;
```
## 八、OpenGauss数据安全设计
### 1. 内置安全特性
#### 1.1 透明数据加密 (TDE)
```sql
-- 启用表级加密
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)
```sql
-- 创建多租户行级安全
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 动态数据脱敏
```sql
-- 创建脱敏函数
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 角色权限设计
```sql
-- 创建业务角色
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 列级权限控制
```sql
-- 敏感字段权限控制
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 审计日志配置
```sql
-- 启用审计
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 敏感操作监控
```sql
-- 创建敏感操作触发器
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备份策略
```sql
-- 全量备份
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 主备同步配置
```sql
-- 主库配置
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密码算法
- 符合《网络安全法》、《数据安全法》等法规要求
```sql
-- 使用国产SM4算法加密
CREATE TABLE water_customer_sm4 (
-- 字段定义...
) WITH (ENCRYPTION_TYPE = 'SM4_CTR');

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,944 @@
# 福建水务营收系统模块功能设计文档
## 文档信息
| 项目信息 | 详情 |
|---------|------|
| **项目名称** | 福建水务营收系统 |
| **文档类型** | 概要设计文档 |
| **技术框架** | RuoYi-Vue-Pro + yudao-ui-admin-vue3 |
| **文档版本** | v1.0 |
| **编写日期** | 2024-12-19 |
| **文档状态** | ✅ 已完成 |
## 目录
- [福建水务营收系统模块功能设计文档](#福建水务营收系统模块功能设计文档)
- [文档信息](#文档信息)
- [目录](#目录)
- [一、系统整体架构](#一系统整体架构)
- [1.1 系统架构图](#11-系统架构图)
- [1.2 技术架构图](#12-技术架构图)
- [1.3 业务架构图](#13-业务架构图)
- [二、统一平台](#二统一平台)
- [2.1 单点登录](#21-单点登录)
- [2.2 系统管理](#22-系统管理)
- [三、营收系统](#三营收系统)
- [3.1 系统管理](#31-系统管理)
- [3.2 抄表开账](#32-抄表开账)
- [3.2.1 业务流程图](#321-业务流程图)
- [3.2.2 主要功能](#322-主要功能)
- [3.2.3 核心接口定义](#323-核心接口定义)
- [3.2.4 前端界面设计](#324-前端界面设计)
- [3.3 收费管理](#33-收费管理)
- [3.3.1 业务流程图](#331-业务流程图)
- [3.3.2 主要功能](#332-主要功能)
- [3.3.3 核心接口定义](#333-核心接口定义)
- [3.4 账务处理](#34-账务处理)
- [3.4.1 业务流程图](#341-业务流程图)
- [3.4.2 主要功能](#342-主要功能)
- [3.4.3 核心接口定义](#343-核心接口定义)
- [3.5 发票管理](#35-发票管理)
- [3.5.1 业务流程图](#351-业务流程图)
- [3.5.2 核心接口定义](#352-核心接口定义)
- [3.6 代收业务](#36-代收业务)
- [3.7 环卫系统](#37-环卫系统)
- [3.8 业务工单](#38-业务工单)
- [四、表务系统](#四表务系统)
- [4.1 表务工单](#41-表务工单)
- [4.2 表务仓库](#42-表务仓库)
- [4.3 水表参数与基础信息](#43-水表参数与基础信息)
- [4.4 物联网对接与数据同步](#44-物联网对接与数据同步)
- [五、报装系统](#五报装系统)
- [5.1 报装流程](#51-报装流程)
- [5.2 一户一表管理](#52-一户一表管理)
- [六、客户服务](#六客户服务)
- [6.1 微信、支付宝服务窗](#61-微信支付宝服务窗)
- [6.2 历史账单](#62-历史账单)
- [6.3 电子发票](#63-电子发票)
- [6.4 营业网点](#64-营业网点)
- [6.5 账户流水](#65-账户流水)
- [6.6 微网厅](#66-微网厅)
- [七、系统配置](#七系统配置)
- [7.1 水表参数](#71-水表参数)
- [7.2 地址参数](#72-地址参数)
- [7.3 价格体系](#73-价格体系)
- [7.4 基本配置](#74-基本配置)
- [7.5 催缴管理](#75-催缴管理)
- [7.6 用户权限](#76-用户权限)
- [7.7 定时任务](#77-定时任务)
- [八、系统接口](#八系统接口)
- [8.1 银行接口](#81-银行接口)
- [8.2 支付宝/微信接口](#82-支付宝微信接口)
- [8.3 短信接口](#83-短信接口)
- [8.4 集抄系统接口](#84-集抄系统接口)
- [8.5 政务系统接口](#85-政务系统接口)
- [8.6 消火栓系统接口](#86-消火栓系统接口)
- [8.7 其他系统对接](#87-其他系统对接)
- [九、统计分析](#九统计分析)
- [9.1 报表查询](#91-报表查询)
- [9.2 欠费查询](#92-欠费查询)
- [9.3 缴费记录](#93-缴费记录)
- [9.4 用水分析](#94-用水分析)
- [十、工程管理](#十工程管理)
- [10.1 工程申请](#101-工程申请)
- [10.2 工程施工](#102-工程施工)
- [10.3 工程验收](#103-工程验收)
- [10.4 工程查询](#104-工程查询)
- [十一、抄表APP](#十一抄表app)
- [11.1 首页功能](#111-首页功能)
- [11.2 抄表功能](#112-抄表功能)
- [11.3 工单管理](#113-工单管理)
- [十二、接口服务](#十二接口服务)
- [12.1 API市场](#121-api市场)
- [12.2 API管理](#122-api管理)
- [12.3 接口权限管理](#123-接口权限管理)
- [12.4 系统对外接口](#124-系统对外接口)
- [系统集成架构](#系统集成架构)
- [前后端集成架构](#前后端集成架构)
- [技术栈整合方案](#技术栈整合方案)
## 一、系统整体架构
福建水务营收系统采用现代化的分布式微服务架构基于RuoYi-Vue-Pro后端框架和yudao-ui-admin-vue3前端框架构建为水务企业提供完整的营收管理解决方案。
### 1.1 系统架构图
![流程图 1](temp_mermaid_86176/diagram_1.png)\n
### 1.2 技术架构图
![流程图 2](temp_mermaid_86176/diagram_2.png)\n
### 1.3 业务架构图
![流程图 3](temp_mermaid_86176/diagram_3.png)\n
## 二、统一平台
统一平台是客户服务平台的综合展示平台基于RuoYi-Vue-Pro和yudao-ui-admin-vue3框架构建包含日常工作功能和客户全部的信息是系统的基础功能模块。
### 2.1 单点登录
单点登录模块基于Spring Security和JWT实现用户一次登录即可访问系统中所有应用的功能主要特点包括
- 支持通过用户名、密码进行身份认证
- 支持OAuth2.0授权码+PKCE模式的第三方登录
- 支持手机号+短信验证码登录方式
- 支持多因素认证MFA增强安全性
- 根据登录人员所在公司的不同,显示不同的系统名称和界面风格
- 提供流程节点到期提醒功能
- Token自动刷新机制提升用户体验
### 2.2 系统管理
系统管理模块基于RuoYi-Vue-Pro框架的现成功能提供对系统基础参数的配置管理功能主要包括
- 组织机构管理:
- 支持多级组织结构的管理
- 支持组织机构导入导出
- 组织关系树形展示
- 组织数据权限控制
- 员工管理:
- 系统操作人员的基本信息管理
- 用户分配角色与权限
- 用户状态管理(启用/禁用)
- 用户密码安全策略
- 用户操作日志记录
- 角色权限管理:
- 基于RBAC模型的权限控制
- 支持数据权限精细化控制
- 支持多租户的权限隔离
- 基于菜单、按钮级别的权限管理
- 系统菜单配置:
- 支持自定义系统菜单和功能模块
- 菜单多级分类管理
- 动态路由生成
- 菜单权限配置
- 数据字典管理:
- 维护系统使用的各类基础代码数据
- 支持字典项多级管理
- 支持字典缓存,提高访问性能
- 系统监控:
- 在线用户监控与管理
- 服务器性能监控
- 定时任务执行状态监控
- 系统缓存监控与管理
- 系统日志管理:
- 记录用户登录日志
- 记录操作日志,支持操作回溯
- 记录系统异常日志,便于问题排查
- 短信管理:
- 支持阿里云、腾讯云等多家短信渠道
- 短信模板配置管理
- 短信发送日志记录
- 租户管理:
- 支持SaaS多租户
- 租户套餐配置
- 租户数据隔离
- 租户资源管理
- 配置管理:
- 系统参数配置
- 通知公告管理
- 定时任务配置
## 三、营收系统
营收系统是水务业务系统的核心组成部分,负责抄表、收费、账务处理等关键业务功能。
### 3.1 系统管理
营收系统的基础管理功能,包括:
- 水价管理:不同用户类型的水价标准管理,支持阶梯水价
- 用户档案管理:维护用户基本信息、用水信息、账户信息等
- 客户分组管理
- 集收管理
- 客户基础信息管理
- 定额管理
- 客户优惠方案设置
- 更名过户管理:处理用户变更、过户等业务
- 注销报停管理:处理用户注销、暂停用水等业务
### 3.2 抄表开账
抄表开账模块负责水表读数的采集和账单生成,是营收系统的核心业务模块。
#### 3.2.1 业务流程图
![流程图 4](temp_mermaid_86176/diagram_4.png)\n
#### 3.2.2 主要功能
**册本管理**:册本基本信息的维护和管理
- 册本创建与配置
- 抄表路线规划
- 抄表员分配
- 抄表周期设置
**抄表录入**:支持多种抄表方式
- 手工抄表:现场抄表、批量录入
- 智能抄表:远程数据采集、自动同步
- 自报抄表:客户自主上报、在线提交
**抄表数据审核**:确保数据质量
- 数据校验:读数合理性检查、用量异常检测
- 异常处理:异常数据标记、人工处理
- 开账处理:数据确认、账单生成
**追加抄表**:支持非周期性特殊抄表
- 补抄管理:漏抄数据补录
- 特殊抄表:临时抄表需求
- 调整抄表:读数错误修正
#### 3.2.3 核心接口定义
**抄表管理主要接口**
```java
@RestController
@RequestMapping("/admin-api/water/reading")
@Tag(name = "管理后台 - 抄表管理")
public class MeterReadingController {
@PostMapping("/create")
@Operation(summary = "创建抄表记录")
public CommonResult<Long> createReading(@Valid @RequestBody MeterReadingSaveReqVO createReqVO);
@PostMapping("/batch-create")
@Operation(summary = "批量创建抄表记录")
public CommonResult<MeterReadingBatchRespVO> batchCreateReading(@Valid @RequestBody MeterReadingBatchReqVO batchReqVO);
@PostMapping("/review")
@Operation(summary = "抄表数据复核")
public CommonResult<Boolean> reviewReading(@Valid @RequestBody MeterReadingReviewReqVO reviewReqVO);
@PostMapping("/generate-bill")
@Operation(summary = "生成账单")
public CommonResult<BillGenerateRespVO> generateBill(@Valid @RequestBody ReadingBillReqVO reqVO);
}
```
**接口设计要点**
- 遵循RESTful设计规范统一的请求响应格式
- 支持批量操作提高处理效率
- 完整的数据校验和异常处理机制
- 集成RuoYi-Vue-Pro的权限控制和日志记录
#### 3.2.4 前端界面设计
**抄表管理页面结构**
```vue
<template>
<ContentWrap>
<!-- 查询条件 -->
<el-form class="search-form" inline>
<el-form-item label="抄表日期">
<el-date-picker v-model="queryParams.readingDate" type="daterange" />
</el-form-item>
<el-form-item label="抄表状态">
<el-select v-model="queryParams.status">
<el-option label="待复核" value="pending" />
<el-option label="已通过" value="approved" />
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="handleQuery">查询</el-button>
<el-button @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<!-- 操作按钮 -->
<el-row class="mb-10px">
<el-button type="primary" @click="handleAdd">新增抄表</el-button>
<el-button type="success" @click="handleBatchAdd">批量抄表</el-button>
<el-button type="warning" @click="handleExport">导出数据</el-button>
</el-row>
<!-- 数据表格 -->
<el-table v-loading="loading" :data="readingList">
<el-table-column prop="readingCode" label="抄表编号" width="180" />
<el-table-column prop="customerName" label="客户名称" />
<el-table-column prop="meterCode" label="水表编号" />
<el-table-column prop="readingValue" label="本次读数" />
<el-table-column prop="waterUsage" label="用水量" />
<el-table-column prop="readingDate" label="抄表日期" />
<el-table-column prop="status" label="状态">
<template #default="{ row }">
<dict-tag :type="DICT_TYPE.READING_STATUS" :value="row.status" />
</template>
</el-table-column>
<el-table-column label="操作" width="200" fixed="right">
<template #default="{ row }">
<el-button link @click="handleUpdate(row)">编辑</el-button>
<el-button link @click="handleReview(row)">复核</el-button>
<el-button link type="danger" @click="handleDelete(row)">删除</el-button>
</template>
</el-table-column>
</el-table>
</ContentWrap>
</template>
```
**前端页面功能特性**
- 响应式设计基于Element Plus的现代化UI组件
- 数据表格:支持分页、排序、筛选等功能
- 表单验证:前端数据校验和错误提示
- 批量操作:支持批量抄表录入和批量审核
- 实时更新:页面数据实时刷新和状态同步
### 3.3 收费管理
收费管理模块负责水费的收取和管理,是营收系统的重要业务模块。
#### 3.3.1 业务流程图
![流程图 5](temp_mermaid_86176/diagram_5.png)\n
#### 3.3.2 主要功能
**柜台收费**:现场收费服务
- 用户查询:客户信息查询、账单查询
- 收费处理:多种支付方式、找零计算
- 收费打印:收据打印、发票开具
- 预存预付:余额充值、预付费管理
**柜台结账**:营业网点日常结账
- 日结处理:当日收费汇总、统计分析
- 交款管理:现金上缴、账务核对
- 结账查询:历史结账记录查询
**预付款管理**:预付费业务处理
- 预付款充值:余额充值、充值记录
- 使用管理:自动扣款、余额提醒
- 退款处理:预付款退款、退款审核
**缴费记录查询**:缴费历史管理
- 多条件查询:按时间、金额、渠道查询
- 统计分析:缴费趋势、渠道分析
- 导出功能:缴费记录导出
#### 3.3.3 核心接口定义
**缴费管理主要接口**
```java
@RestController
@RequestMapping("/admin-api/water/payment")
@Tag(name = "管理后台 - 缴费管理")
public class PaymentController {
@PostMapping("/create")
@Operation(summary = "创建缴费记录")
public CommonResult<PaymentRespVO> createPayment(@Valid @RequestBody PaymentCreateReqVO createReqVO);
@PostMapping("/cash-payment")
@Operation(summary = "现金缴费")
public CommonResult<PaymentRespVO> cashPayment(@Valid @RequestBody CashPaymentReqVO cashReqVO);
@PostMapping("/online-payment")
@Operation(summary = "在线支付")
public CommonResult<OnlinePaymentRespVO> onlinePayment(@Valid @RequestBody OnlinePaymentReqVO onlineReqVO);
@PostMapping("/prepaid-payment")
@Operation(summary = "预存款缴费")
public CommonResult<PaymentRespVO> prepaidPayment(@Valid @RequestBody PrepaidPaymentReqVO prepaidReqVO);
}
```
**接口设计特点**
- 支持多种缴费方式:现金、银行卡、在线支付、预存款
- 事务控制:确保缴费操作的原子性和一致性
- 异步处理:第三方支付采用异步回调机制
- 安全验证:完整的权限控制和数据校验
```
#### 3.3.4 前端界面设计
**缴费管理页面结构**
```vue
<template>
<ContentWrap>
<!-- 客户查询 -->
<el-form class="search-form" inline>
<el-form-item label="客户编号">
<el-input v-model="queryParams.customerCode" placeholder="请输入客户编号" />
</el-form-item>
<el-form-item label="客户姓名">
<el-input v-model="queryParams.customerName" placeholder="请输入客户姓名" />
</el-form-item>
<el-form-item>
<el-button type="primary" @click="handleQuery">查询</el-button>
<el-button @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<!-- 账单信息 -->
<el-table v-loading="loading" :data="billList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" />
<el-table-column prop="billCode" label="账单编号" />
<el-table-column prop="billDate" label="账期" />
<el-table-column prop="waterUsage" label="用水量" />
<el-table-column prop="totalAmount" label="应缴金额" />
<el-table-column prop="balanceAmount" label="欠费金额" />
</el-table>
<!-- 缴费操作 -->
<el-row class="payment-actions">
<el-col :span="12">
<el-statistic title="选中金额" :value="selectedAmount" prefix="¥" />
</el-col>
<el-col :span="12" class="text-right">
<el-button type="success" @click="handleCashPayment">现金缴费</el-button>
<el-button type="primary" @click="handleOnlinePayment">在线支付</el-button>
<el-button type="warning" @click="handlePrepaidPayment">预存扣费</el-button>
</el-col>
</el-row>
</ContentWrap>
</template>
```
### 3.4 账务处理
账务处理模块负责处理各类特殊账务情况,确保账务数据的准确性和完整性。
#### 3.4.1 业务流程图
![流程图 6](temp_mermaid_86176/diagram_6.png)\n
#### 3.4.2 主要功能
**未销调整**:处理各类账务调整需求
- 水量调整:调整用水量和相关费用
- 金额调整:直接调整账单金额
- 违约金减免:减免或取消违约金
- 费用追加:补收相关费用
**特殊开账**:处理特殊情况的账单生成
- 补抄开账:补录抄表数据并生成账单
- 估抄开账:估算用水量生成账单
- 平均开账:基于历史用量平均开账
**账务退款**:处理各类退款业务
- 多缴退款:退还多缴的水费
- 预付款退款:退还预存余额
- 错误缴费退款:退还错误缴费
#### 3.4.3 核心接口定义
```java
@RestController
@RequestMapping("/admin-api/water/account")
@Tag(name = "管理后台 - 账务处理")
@Validated
public class AccountProcessController {
@PostMapping("/adjust")
@Operation(summary = "账务调整")
@PreAuthorize("@ss.hasPermission('water:account:adjust')")
public CommonResult<Boolean> adjustAccount(@Valid @RequestBody AccountAdjustReqVO adjustReqVO);
@PostMapping("/refund")
@Operation(summary = "退款处理")
@PreAuthorize("@ss.hasPermission('water:account:refund')")
public CommonResult<Boolean> processRefund(@Valid @RequestBody RefundProcessReqVO refundReqVO);
@PostMapping("/write-off")
@Operation(summary = "销账处理")
@PreAuthorize("@ss.hasPermission('water:account:write-off')")
public CommonResult<Boolean> writeOffAccount(@Valid @RequestBody WriteOffReqVO writeOffReqVO);
}
```
### 3.5 发票管理
发票管理模块负责水费发票的全生命周期管理,支持纸质发票和电子发票。
#### 3.5.1 业务流程图
![流程图 7](temp_mermaid_86176/diagram_7.png)\n
#### 3.5.2 核心接口定义
```java
@RestController
@RequestMapping("/admin-api/water/invoice")
@Tag(name = "管理后台 - 发票管理")
@Validated
public class InvoiceController {
@PostMapping("/generate")
@Operation(summary = "生成发票")
public CommonResult<InvoiceRespVO> generateInvoice(@Valid @RequestBody InvoiceGenerateReqVO generateReqVO);
@PostMapping("/print")
@Operation(summary = "打印发票")
public CommonResult<Boolean> printInvoice(@Valid @RequestBody InvoicePrintReqVO printReqVO);
@PostMapping("/cancel")
@Operation(summary = "发票作废")
public CommonResult<Boolean> cancelInvoice(@Valid @RequestBody InvoiceCancelReqVO cancelReqVO);
}
```
### 3.6 代收业务
代收业务模块负责处理各种渠道的水费代收业务,主要功能包括:
- 实时收费:银行代收、支付宝/微信收费、代收点收费
- 银行代扣:代扣协议管理、代扣数据生成和处理
- 银行托收:托收单生成、托收数据处理
- 代扣渠道管理:渠道维护、规则设置、效率分析
### 3.7 环卫系统
环卫系统模块负责管理与环卫相关的收费和计费业务,主要功能包括:
- 计费核定:环卫收费规则配置和业务字典维护
- 计费退补:退费和补缴规则配置,字典配置参与计算
- 计费减免:环卫费用减免规则配置和审批流程
- 环卫收费统计:环卫收费数据统计和分析
### 3.8 业务工单
业务工单模块负责管理日常业务工单的流转和处理,主要功能包括:
- 业务清单:查询通过系统办理的日常业务工单及进度信息
- 上报清单:新增、查询问题清单,包括通过手机端上报的问题
- 稽查工单:对手机端的稽查信息进行多条件查询和导出
- 移表工单:客户对需要进行移动的水表进行登记
- 换表工单:新增客户自报的换表和故障的水表等进行换表登记
- 工作流可视化:工作节点可视化展示和流程管理
## 四、表务系统
表务系统负责水表的全生命周期管理,包括水表购置、安装、维修、更换等业务。
### 4.1 表务工单
表务工单模块负责处理各类表务作业,主要功能包括:
- 换表工单:换表计划、换表施工、换表回填
- 移表工单:移表申请、移表施工、移表验收
- 拆表工单:拆表申请、拆表施工、拆表确认
- 复装工单:复装申请、复装施工、复装验收
- 校表工单:校表申请、校表实施、校表结果
- 稽查工单:水量异常稽查、违规用水稽查、处罚决定
- 业务上报:异常上报、投诉上报、处理结果反馈
### 4.2 表务仓库
表务仓库模块负责水表的仓储管理,主要功能包括:
- 新表入库:水表检定、入库登记、入库确认
- 水表检定:检定信息记录、结果管理
- 水表领用:领用单登记、领用单管理
- 水表出库:出库登记、出库确认
- 水表退库:退库申请、退库确认
- 水表报废:报废申请、报废确认
- 水表生命周期查询:状态查询、历史记录查询
### 4.3 水表参数与基础信息
水表参数与基础信息模块负责维护水表相关的基础数据,主要功能包括:
- 水表厂家管理:厂家信息维护、厂家状态管理
- 水表型号管理:型号信息维护、型号分类管理
- 水表口径管理:口径信息维护、定换周期设置
- 水表量程管理:量程信息维护、量程范围设置
### 4.4 物联网对接与数据同步
物联网对接与数据同步模块负责水表数据的互联互通,主要功能包括:
- 厂家设备信息管理:设备型号管理、厂家信息维护
- 表务对接日志:数据同步日志、错误处理
- 水表数据推送接口:新表数据推送、校验机制
- 远程抄表数据同步:数据接收、验证与处理
- 物联网水表监控:状态监控、异常事件报警
## 五、报装系统
报装系统负责新用户的报装立户管理,主要功能包括:
### 5.1 报装流程
报装流程模块负责新用户报装业务的全流程管理,主要功能包括:
- 报装申请:用户申请、材料审核、现场勘查
- 方案设计:设计方案、设计审核、费用估算
- 合同签订:费用通知、合同签订、收费管理
- 施工管理:施工计划、施工实施、施工验收
- 开户通水:水表安装、用户立户、通水确认
### 5.2 一户一表管理
一户一表管理模块负责实施"一户一表"改造,主要功能包括:
- 改造计划:制定改造计划、用户协商、费用估算
- 改造实施:施工管理、水表安装、验收管理
- 用户转换:数据转换、账务处理、使用确认
## 六、客户服务
客户服务模块提供多渠道的客户服务功能,主要包括:
### 6.1 微信、支付宝服务窗
- 账户绑定:支持用户绑定水务账户
- 用水查询:查询用水情况和用水趋势
- 水费查询:查询水费信息和欠费信息
- 在线缴费:支持在线缴纳水费
- 业务办理:支持在线办理简单业务
### 6.2 历史账单
- 账单查询:查询历史账单信息
- 用水分析:分析用水趋势,提供图表展示
- 账单推送:定期推送账单信息
- 账单明细:提供详细的账单明细
### 6.3 电子发票
- 发票申请:申请开具电子发票
- 发票查询:查询已开具发票
- 发票下载:下载电子发票
- 发票推送:推送电子发票到用户邮箱或微信
### 6.4 营业网点
- 网点查询:查询营业网点信息
- 网点导航:提供到营业网点的导航
- 业务指南:提供各网点业务办理指南
- 等候情况:实时显示各网点的等候情况
### 6.5 账户流水
- 流水查询:查询账户交易流水
- 明细下载:下载流水明细
- 交易统计:提供交易金额统计
- 缴费证明:生成缴费证明
### 6.6 微网厅
- 用户注册:用户注册微网厅账号
- 信息查询:查询用水、缴费信息
- 业务办理:在线办理各类业务
- 用户反馈:提交意见建议
## 七、系统配置
系统配置模块提供各类系统参数的配置管理功能,主要包括:
### 7.1 水表参数
- 水表厂家:管理水表生产厂商信息
- 水表型号:管理水表型号规格
- 水表量程:管理水表量程规格
### 7.2 地址参数
- 行政区划:管理行政区划信息
- 地址编码:管理地址编码规则
- 地址库:维护标准地址库
### 7.3 价格体系
- 用水性质:管理不同用水性质的分类
- 水价标准:管理不同用水性质的水价标准
- 阶梯水价:管理阶梯水价设置
- 调价管理:管理水价调整流程
### 7.4 基本配置
- 系统参数:管理系统基本参数
- 业务规则:管理业务处理规则
- 打印模板:管理各类打印模板
- 短信模板:管理短信发送模板
### 7.5 催缴管理
- 催缴计划:制定欠费催缴计划
- 催缴任务:分配催缴任务
- 催缴执行:记录催缴执行情况
- 催缴结果:统计催缴结果
### 7.6 用户权限
- 菜单权限:不同角色可访问的菜单权限配置
- 功能权限:不同角色可操作的功能权限配置
- 数据权限:通过查询字典权限控制不同用户业务取数权限
- 角色管理:自定义角色及权限组合
### 7.7 定时任务
- 任务配置:定时任务可视化配置,包含传参设置
- 任务监控:定时任务执行状态监控
- 任务日志:定时任务执行日志记录和查询
- 任务调度:任务优先级和执行顺序管理
## 八、系统接口
系统接口模块提供与外部系统的集成和数据交换功能,实现业务数据的互通互联。
### 8.1 银行接口
银行接口实现与银行系统的对接,支持代扣、托收等功能,主要包括:
- 收费接口:实现用户通过银行渠道缴纳水费
- 冲正接口:处理银行退款和交易取消
- 对账接口:与银行系统进行对账
- 托收接口:支持银行托收功能
- 代扣接口:支持银行代扣功能
### 8.2 支付宝/微信接口
支付宝和微信接口实现与第三方支付平台的对接,支持在线支付功能,主要包括:
- 欠费查询:查询用户欠费信息
- 在线支付:支持用户在线缴纳水费
- 支付通知:处理支付结果通知
- 对账接口:与支付平台进行对账
### 8.3 短信接口
短信接口提供短信通知和验证功能,主要包括:
- 账单通知:通过短信通知用户账单信息
- 缴费提醒:提醒用户及时缴费
- 催缴通知:向欠费用户发送催缴短信
- 业务通知:通知用户业务办理状态
- 验证码功能:提供短信验证码服务
### 8.4 集抄系统接口
集抄系统接口实现与智能水表集中抄表系统的对接,主要包括:
- 抄表数据获取:获取智能水表的抄表数据
- 水表状态监控:监控水表的使用状态
- 异常数据处理:处理抄表异常情况
### 8.5 政务系统接口
政务系统接口实现与地方政务平台和政务APP的对接主要包括
- 数据推送:推送营收数据到政务平台
- 数据查询:支持政务平台查询水务数据
- 缴费对接:支持通过政务平台缴费
- 报装工单对接:对接报装业务工单
### 8.6 消火栓系统接口
消火栓系统接口实现与消火栓系统的对接,主要功能包括:
- 预存缴费管理:管理用户预存水费
- 剩余水量计算:计算用户剩余可用水量
- 取水控制:根据预存和剩余水量控制取水
### 8.7 其他系统对接
其他系统对接模块负责与周边系统进行数据交换和业务协同,主要功能包括:
- 环卫系统对接:实现与环卫系统的数据同步和业务流程对接
- 客服系统对接:实现与客服系统的工单同步和问题处理
- 工单系统对接:实现与工单系统的工单流转和状态同步
- OA系统对接实现与OA系统的审批流程对接和数据共享
- 智水擎平台对接:实现与智水擎平台的数据交换和业务协同
## 九、统计分析
统计分析模块提供多维度的数据统计和分析功能,为管理决策提供数据支持。
### 9.1 报表查询
- 标准报表:系统内置的标准统计报表
- 自定义报表:用户可自定义的报表
- 报表导出支持将报表导出为Excel、PDF等格式
- 报表打印:支持报表打印功能
### 9.2 欠费查询
- 欠费情况统计:按区域、用户类型等维度统计欠费情况
- 欠费用户明细:查询欠费用户的详细信息
- 欠费分析:分析欠费原因和趋势
- 欠费导出:支持将欠费数据导出
### 9.3 缴费记录
- 缴费情况统计:按多维度统计缴费情况
- 缴费明细查询:查询缴费明细记录
- 缴费趋势分析:分析缴费趋势
- 缴费渠道分析:分析各缴费渠道的使用情况
### 9.4 用水分析
- 用水量统计:按多维度统计用水量
- 用水趋势分析:分析用水趋势,预测用水需求
- 异常用水分析:识别和分析异常用水情况
- 节水潜力分析:分析用户节水潜力
## 十、工程管理
工程管理模块负责处理与供水工程相关的业务,包括工程申请、施工管理和工程验收等。
### 10.1 工程申请
- 工程立项:新建供水工程的立项申请
- 材料提交:上传工程相关材料
- 前期勘察:记录工程前期勘察结果
- 工程预算:制定工程预算方案
- 申请审批:对工程申请进行审批
### 10.2 工程施工
- 施工计划:制定工程施工计划
- 施工派工:将施工任务分配给施工人员
- 施工记录:记录施工过程和施工情况
- 材料管理:管理工程施工材料的使用情况
- 施工异常处理:处理施工过程中的异常情况
### 10.3 工程验收
- 验收申请:提交工程验收申请
- 验收检查:对工程进行验收检查
- 验收记录:记录验收结果
- 竣工结算:进行工程竣工结算
- 工程归档:对工程资料进行归档
### 10.4 工程查询
- 工程进度查询:查询工程进度情况
- 工程资料查询:查询工程相关资料
- 工程统计:统计工程数量、金额等信息
- 工程分析:分析工程实施情况
## 十一、抄表APP
抄表APP是针对移动端开发的抄表工具支持外勤人员进行现场抄表、问题处理和工单管理等业务操作。
### 11.1 首页功能
- 首页:显示当前登录用户信息、快捷搜索和主要和抄表业务相关的功能模块
- 个人信息:查看个人信息,可以进行密码、手机号信息修改,可以进行抄表设置
- 快捷查询:提供搜索栏,用户输入户号、户名、地址以及册本后,系统会自动检索到相关的信息
### 11.2 抄表功能
- 抄表任务:显示当前登录的抄表员抄表任务信息
- NFC抄表抄表设备感应NFC后自动弹出抄表页
- 扫码抄表:扫水表上二维码,搜集该表信息,弹出抄表页
- 数据采集:抄表数据现场采集功能
- AI录入对接AI接口实现智能读数
- 抄表轨迹:记录表的物理位置,在地图上点击后采集水表定位
- 抄表导航:指引抄表员前往下一个抄表点
- 抄表汇总:系统会根据当前登录的人员自动汇总抄表信息
- 账单查询:查询客户账单详情
- 欠费查询:显示当前登录的抄表员抄表用水客户的欠费情况
### 11.3 工单管理
- 问题上报:系统支持上报当前登录的抄表员抄表时遇到的用水问题
- 问题回填:问题上报后,可进行问题回填和处理
- 代办工单:显示当前登录的抄表员需要代办工单
- 平台工单管理:移动端提交工单后,系统会自动提交到工单处置平台进行受理、派发
- 停水复水工单:当客户存在欠费的情况下可以对该客户进行停水操作
- 稽查工单:实现抄表稽查和水价稽查
- 维修工单:提交坏表维修报修等工单
## 十二、接口服务
接口服务模块提供系统对外的API接口管理和服务能力实现与第三方系统的便捷集成。
### 12.1 API市场
- API展示展示系统提供的各类API接口
- API使用说明提供API接口的详细使用说明和示例
- API测试提供API接口的在线测试功能
### 12.2 API管理
- API申请第三方系统申请调用API的流程管理
- API调度看板监控API调用情况和性能指标
- 接口服务配置管理管理API接口的配置参数
- 接口限流熔断管理控制API接口的调用频率和熔断机制
### 12.3 接口权限管理
- 授权管理管理API接口的授权信息
- 白名单管理设置允许访问API的IP白名单
- 安全策略设置API调用的安全策略和防护措施
### 12.4 系统对外接口
- 查询接口:提供各类数据查询接口
- 业务处理接口:提供业务处理和操作接口
- 状态同步接口:提供状态信息同步接口
- 数据推送接口:提供数据推送和订阅接口
## 系统集成架构
### 前后端集成架构
![流程图 8](temp_mermaid_86176/diagram_8.png)\n
### 技术栈整合方案
**后端技术整合**
- Spring Boot 3.x作为核心框架
- Spring Security 6.x提供安全认证
- MyBatis Plus 3.x简化数据访问
- RuoYi-Vue-Pro提供基础功能框架
**前端技术整合**
- Vue 3.x + TypeScript构建现代化前端
- Element Plus提供UI组件库
- Vite作为构建工具
- Pinia进行状态管理
**数据库集成**
- OpenGauss 5.0+作为主数据库,国产自主可控
- Redis 6.0提供缓存和会话管理
- HikariCP连接池优化和读写分离支持
**中间件集成**
- RabbitMQ提供消息队列
- MinIO提供文件存储
- Elasticsearch提供全文搜索

View File

@ -0,0 +1,712 @@
# 福建水务营收系统安全设计文档
## 文档信息
| 项目信息 | 详情 |
|---------|------|
| **项目名称** | 福建水务营收系统 |
| **文档类型** | 安全设计文档 |
| **技术框架** | RuoYi-Vue-Pro + OpenGauss |
| **文档版本** | v1.0 |
| **编写日期** | 2024-12-19 |
| **文档状态** | ✅ 已完成 |
## 目录
- [一、安全设计概述](#一安全设计概述)
- [二、等级保护三级安全设计](#二等级保护三级安全设计)
- [三、OpenGauss数据库安全](#三opengauss数据库安全)
- [四、应用系统安全](#四应用系统安全)
- [五、网络安全设计](#五网络安全设计)
- [六、数据安全设计](#六数据安全设计)
- [七、运维安全设计](#七运维安全设计)
- [八、安全管理制度](#八安全管理制度)
## 一、安全设计概述
福建水务营收系统安全设计严格按照《网络安全等级保护基本要求》第三级标准,结合水务行业特点和国产化要求,构建全方位、多层次的安全防护体系。
### 1.1 安全目标
- **机密性**:确保敏感数据不被未授权访问
- **完整性**:防止数据被恶意篡改或损坏
- **可用性**保障系统7×24小时稳定运行
- **可审计性**:完整记录系统操作审计轨迹
- **合规性**:满足等保三级和行业监管要求
### 1.2 安全原则
- **纵深防御**:多层安全防护,避免单点故障
- **最小权限**:用户和应用仅具备必要的最小权限
- **默认安全**:系统默认采用最严格的安全配置
- **持续监控**7×24小时安全监控和威胁检测
- **国产化优先**:优先采用国产安全产品和技术
### 1.3 总体安全架构
![流程图 1](temp_mermaid_86176/diagram_1.png)\n
## 二、等级保护三级安全设计
### 2.1 技术安全要求
#### 2.1.1 安全通信网络
**网络架构安全**
![流程图 2](temp_mermaid_86176/diagram_2.png)\n
**网络安全措施**
- 网络边界部署防火墙,实现网络访问控制
- 重要网络设备和服务器前端部署网络入侵检测设备
- 网络分段部署DMZ区、应用区、数据区物理隔离
- 关键网络设备提供双机热备功能
- 网络设备登录实现身份标识和鉴别
#### 2.1.2 安全区域边界
**区域边界防护**
- 在网络边界部署防火墙设备,设置访问控制策略
- 在网络边界部署入侵检测设备,监控网络攻击行为
- 在应用层部署Web应用防火墙防护Web应用攻击
- 对进出网络的数据流进行过滤和监控
- 建立网络访问控制策略,限制不必要的网络连接
#### 2.1.3 安全计算环境
**身份鉴别**
![流程图 3](temp_mermaid_86176/diagram_3.png)\n
**访问控制设计**
- 实现基于角色的访问控制(RBAC)
- 支持基于属性的访问控制(ABAC)
- 实现最小权限原则
- 支持权限的动态调整和审批流程
### 2.2 管理安全要求
#### 2.2.1 安全管理中心
- 建立安全管理中心,统一管理安全策略
- 配置安全管理员角色,负责安全策略制定
- 建立安全事件响应机制
- 定期进行安全评估和风险分析
#### 2.2.2 安全管理制度
- 制定信息安全管理制度和操作规程
- 建立人员安全管理制度
- 制定系统建设管理制度
- 建立系统运维管理制度
## 三、OpenGauss数据库安全
### 3.1 数据库安全架构
![流程图 4](temp_mermaid_86176/diagram_4.png)\n
### 3.2 国产密码算法应用
#### 3.2.1 传输加密
```sql
-- 配置国密SSL连接
ALTER SYSTEM SET ssl = on;
ALTER SYSTEM SET ssl_ciphers = 'SM4-GCM-SM3:SM4-CCM-SM3';
ALTER SYSTEM SET ssl_cert_file = 'server-sm2.crt';
ALTER SYSTEM SET ssl_key_file = 'server-sm2.key';
```
#### 3.2.2 透明数据加密
```sql
-- 启用TDE透明数据加密使用SM4算法
CREATE KEY ENCRYPTION KEY water_biz_kek
WITH ALGORITHM = 'SM4-CTR', KEY_STORE = 'localkms';
-- 为敏感表启用加密
CREATE TABLE water_customer (
id SERIAL PRIMARY KEY,
customer_name VARCHAR(100) ENCRYPTED WITH (
COLUMN_ENCRYPTION_KEY = water_biz_kek,
ENCRYPTION_TYPE = DETERMINISTIC,
ALGORITHM = 'SM4-CTR'
),
id_card VARCHAR(18) ENCRYPTED WITH (
COLUMN_ENCRYPTION_KEY = water_biz_kek,
ENCRYPTION_TYPE = RANDOMIZED,
ALGORITHM = 'SM4-CTR'
)
);
```
### 3.3 行级安全策略
```sql
-- 创建多租户行级安全策略
CREATE ROW LEVEL SECURITY POLICY tenant_isolation_policy
ON water_customer
USING (tenant_id = current_setting('app.current_tenant_id')::bigint);
-- 启用行级安全
ALTER TABLE water_customer ENABLE ROW LEVEL SECURITY;
-- 创建数据访问角色
CREATE ROLE water_data_reader;
CREATE ROLE water_data_writer;
-- 配置列级权限
GRANT SELECT (id, customer_name, phone) ON water_customer TO water_data_reader;
GRANT ALL ON water_customer TO water_data_writer;
```
### 3.4 数据脱敏策略
```sql
-- 创建数据脱敏函数
CREATE OR REPLACE FUNCTION mask_phone(phone_num TEXT)
RETURNS TEXT AS $$
BEGIN
RETURN SUBSTRING(phone_num, 1, 3) || '****' || SUBSTRING(phone_num, 8, 4);
END;
$$ LANGUAGE plpgsql;
-- 创建脱敏视图
CREATE VIEW water_customer_masked AS
SELECT
id,
customer_name,
mask_phone(phone) as phone,
LEFT(id_card, 6) || '********' || RIGHT(id_card, 4) as id_card_masked
FROM water_customer;
-- 授权普通用户只能访问脱敏视图
GRANT SELECT ON water_customer_masked TO water_normal_user;
```
## 四、应用系统安全
### 4.1 Spring Security安全配置
#### 4.1.1 认证配置
```java
@Configuration
@EnableWebSecurity
@EnableMethodSecurity(prePostEnabled = true)
public class SecurityConfig {
@Bean
public PasswordEncoder passwordEncoder() {
// 使用国密SM3哈希算法
return new SM3PasswordEncoder();
}
@Bean
public JwtAuthenticationTokenFilter jwtAuthenticationTokenFilter() {
return new JwtAuthenticationTokenFilter();
}
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
return http
// CSRF防护
.csrf(csrf -> csrf.csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()))
// 请求授权
.authorizeHttpRequests(auth -> auth
.requestMatchers("/api/login", "/api/register").permitAll()
.requestMatchers("/api/admin/**").hasRole("ADMIN")
.anyRequest().authenticated()
)
// JWT过滤器
.addFilterBefore(jwtAuthenticationTokenFilter(), UsernamePasswordAuthenticationFilter.class)
// 会话管理
.sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
.build();
}
}
```
#### 4.1.2 多因素认证
```java
@Service
public class MFAService {
@Autowired
private SmsService smsService;
@Autowired
private RedisTemplate<String, String> redisTemplate;
public boolean sendSmsCode(String phone) {
String code = generateRandomCode();
String key = "mfa:sms:" + phone;
// 存储验证码5分钟过期
redisTemplate.opsForValue().set(key, code, Duration.ofMinutes(5));
// 发送短信
return smsService.send(phone, "您的验证码是:" + code + "5分钟内有效。");
}
public boolean verifySmsCode(String phone, String code) {
String key = "mfa:sms:" + phone;
String storedCode = redisTemplate.opsForValue().get(key);
if (storedCode != null && storedCode.equals(code)) {
redisTemplate.delete(key);
return true;
}
return false;
}
}
```
### 4.2 数据传输安全
#### 4.2.1 HTTPS配置
```yaml
server:
port: 8443
ssl:
enabled: true
key-store: classpath:keystore/server.p12
key-store-password: ${SSL_KEYSTORE_PASSWORD}
key-store-type: PKCS12
# 支持国密算法
ciphers: SM4-GCM-SM3,SM4-CCM-SM3,ECDHE-SM2-WITH-SM4-SM3
protocols: TLSv1.2,TLSv1.3
```
#### 4.2.2 敏感数据加密
```java
@Component
public class DataEncryptionService {
private final SM4Cipher sm4Cipher = new SM4Cipher();
public String encryptSensitiveData(String plaintext) {
try {
return sm4Cipher.encrypt(plaintext);
} catch (Exception e) {
throw new SecurityException("数据加密失败", e);
}
}
public String decryptSensitiveData(String ciphertext) {
try {
return sm4Cipher.decrypt(ciphertext);
} catch (Exception e) {
throw new SecurityException("数据解密失败", e);
}
}
}
```
### 4.3 接口安全防护
#### 4.3.1 接口签名验证
```java
@Component
public class ApiSignatureValidator {
public boolean validateSignature(HttpServletRequest request) {
String timestamp = request.getHeader("X-Timestamp");
String nonce = request.getHeader("X-Nonce");
String signature = request.getHeader("X-Signature");
String body = getRequestBody(request);
// 检查时间戳,防止重放攻击
if (isTimestampExpired(timestamp)) {
return false;
}
// 生成签名
String expectedSignature = generateSignature(timestamp, nonce, body);
// 验证签名
return signature.equals(expectedSignature);
}
private String generateSignature(String timestamp, String nonce, String body) {
String message = timestamp + nonce + body;
return SM3Utils.hash(message);
}
}
```
#### 4.3.2 接口限流防护
```java
@Component
public class RateLimitService {
@Autowired
private RedisTemplate<String, String> redisTemplate;
public boolean isAllowed(String key, int limit, Duration window) {
String redisKey = "rate_limit:" + key;
String current = redisTemplate.opsForValue().get(redisKey);
if (current == null) {
redisTemplate.opsForValue().set(redisKey, "1", window);
return true;
}
int count = Integer.parseInt(current);
if (count < limit) {
redisTemplate.opsForValue().increment(redisKey);
return true;
}
return false;
}
}
```
## 五、网络安全设计
### 5.1 网络拓扑安全
![流程图 5](temp_mermaid_86176/diagram_5.png)\n
### 5.2 防火墙策略配置
#### 5.2.1 边界防火墙策略
```bash
# 允许HTTPS访问
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# 允许HTTP重定向到HTTPS
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# 禁止直接数据库访问
iptables -A INPUT -p tcp --dport 5432 -s ! 192.168.1.0/24 -j DROP
# 允许内网SSH管理
iptables -A INPUT -p tcp --dport 22 -s 192.168.100.0/24 -j ACCEPT
# 拒绝其他所有入站连接
iptables -A INPUT -j DROP
```
#### 5.2.2 应用层防火墙策略
```bash
# 只允许来自DMZ区的连接
iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT
# 允许访问数据库
iptables -A OUTPUT -d 192.168.2.0/24 -p tcp --dport 5432 -j ACCEPT
# 允许访问Redis
iptables -A OUTPUT -d 192.168.2.0/24 -p tcp --dport 6379 -j ACCEPT
# 允许DNS查询
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
# 拒绝其他出站连接
iptables -A OUTPUT -j DROP
```
### 5.3 入侵检测与防护
#### 5.3.1 IDS/IPS规则配置
```bash
# Suricata规则示例
alert tcp any any -> $HOME_NET 443 (msg:"Suspicious HTTPS traffic"; \
content:"POST"; http_method; content:"/api/admin"; http_uri; \
threshold:type limit, track by_src, count 10, seconds 60; \
sid:10001; rev:1;)
alert tcp any any -> $HOME_NET 5432 (msg:"Direct database access attempt"; \
content:"SELECT"; content:"FROM"; distance:0; \
sid:10002; rev:1;)
alert tcp any any -> $HOME_NET any (msg:"Brute force attack detected"; \
flags:S; threshold:type threshold, track by_src, count 100, seconds 60; \
sid:10003; rev:1;)
```
## 六、数据安全设计
### 6.1 数据分类分级
#### 6.1.1 数据分类标准
![流程图 6](temp_mermaid_86176/diagram_6.png)\n
#### 6.1.2 数据保护策略
```sql
-- 客户敏感信息表(机密级)
CREATE TABLE water_customer_sensitive (
id SERIAL PRIMARY KEY,
customer_id BIGINT NOT NULL,
-- 身份证号:强加密存储
id_card_encrypted VARCHAR(200) ENCRYPTED WITH (
COLUMN_ENCRYPTION_KEY = customer_sensitive_key,
ENCRYPTION_TYPE = RANDOMIZED,
ALGORITHM = 'SM4-CTR'
),
-- 银行卡号:强加密存储
bank_account_encrypted VARCHAR(200) ENCRYPTED WITH (
COLUMN_ENCRYPTION_KEY = customer_sensitive_key,
ENCRYPTION_TYPE = RANDOMIZED,
ALGORITHM = 'SM4-CTR'
),
-- 手机号:确定性加密,支持查询
phone_encrypted VARCHAR(200) ENCRYPTED WITH (
COLUMN_ENCRYPTION_KEY = customer_sensitive_key,
ENCRYPTION_TYPE = DETERMINISTIC,
ALGORITHM = 'SM4-CTR'
),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 创建行级安全策略
CREATE POLICY customer_sensitive_policy ON water_customer_sensitive
FOR ALL TO water_customer_service_role
USING (
customer_id IN (
SELECT customer_id FROM water_customer
WHERE tenant_id = current_setting('app.current_tenant_id')::bigint
)
);
```
### 6.2 数据备份与恢复安全
#### 6.2.1 备份加密策略
```bash
#!/bin/bash
# OpenGauss安全备份脚本
# 设置备份参数
BACKUP_DIR="/backup/opengauss"
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="water_biz_backup_${DATE}.tar.gz"
ENCRYPT_KEY="/etc/opengauss/backup_key.key"
# 创建加密备份
gs_backup -D $GAUSSDATA -U gaussdb \
--encrypt --encrypt-key-file=$ENCRYPT_KEY \
--backup-format=tar \
--backup-path=$BACKUP_DIR/$BACKUP_FILE
# 验证备份完整性
openssl dgst -sm3 $BACKUP_DIR/$BACKUP_FILE > $BACKUP_DIR/$BACKUP_FILE.sm3
# 安全传输到异地备份中心
rsync -avz --delete $BACKUP_DIR/ backup-server:/backup/remote/
```
#### 6.2.2 数据恢复流程
```sql
-- 恢复前验证备份完整性
-- 1. 验证SM3摘要
-- 2. 解密备份文件
-- 3. 验证数据库结构
-- 4. 执行恢复操作
-- 创建恢复测试环境
CREATE DATABASE water_biz_recovery_test;
-- 恢复数据到测试环境
\c water_biz_recovery_test;
-- 执行恢复SQL脚本
\i /backup/water_biz_recovery.sql;
-- 验证数据完整性
SELECT COUNT(*) FROM water_customer;
SELECT COUNT(*) FROM water_meter_reading;
SELECT COUNT(*) FROM water_billing;
-- 验证加密数据
SELECT id,
pgp_sym_decrypt(id_card_encrypted, 'encryption_key') as id_card
FROM water_customer_sensitive LIMIT 1;
```
### 6.3 数据销毁与清理
#### 6.3.1 安全数据销毁
```sql
-- 创建安全数据销毁函数
CREATE OR REPLACE FUNCTION secure_data_destroy(table_name TEXT, where_clause TEXT)
RETURNS BOOLEAN AS $$
DECLARE
sql_cmd TEXT;
affected_rows INTEGER;
BEGIN
-- 构建删除SQL
sql_cmd := 'DELETE FROM ' || table_name || ' WHERE ' || where_clause;
-- 执行删除
EXECUTE sql_cmd;
GET DIAGNOSTICS affected_rows = ROW_COUNT;
-- 记录审计日志
INSERT INTO data_destroy_audit (
table_name, where_clause, affected_rows,
operator, operation_time
) VALUES (
table_name, where_clause, affected_rows,
current_user, current_timestamp
);
-- 执行VACUUM清理物理空间
EXECUTE 'VACUUM FULL ' || table_name;
RETURN TRUE;
EXCEPTION
WHEN OTHERS THEN
RAISE EXCEPTION '数据销毁失败: %', SQLERRM;
RETURN FALSE;
END;
$$ LANGUAGE plpgsql;
-- 示例销毁3年前的历史数据
SELECT secure_data_destroy(
'water_meter_reading_history',
'reading_date < CURRENT_DATE - INTERVAL ''3 years'''
);
```
## 七、运维安全设计
### 7.1 安全监控体系
#### 7.1.1 安全监控架构
![流程图 7](temp_mermaid_86176/diagram_7.png)\n
#### 7.1.2 安全事件检测规则
```yaml
# 安全事件检测规则配置
security_rules:
- name: "暴力破解检测"
type: "authentication"
condition: "failed_login_count > 5 in 5 minutes"
severity: "high"
action: ["block_ip", "send_alert"]
- name: "异常数据访问"
type: "data_access"
condition: "query_count > 1000 in 1 minute"
severity: "medium"
action: ["rate_limit", "send_alert"]
- name: "权限提升检测"
type: "privilege_escalation"
condition: "role_change to admin"
severity: "critical"
action: ["block_user", "send_alert", "create_incident"]
- name: "异常时间访问"
type: "abnormal_access"
condition: "access_time between 22:00 and 06:00"
severity: "medium"
action: ["log_event", "send_alert"]
```
### 7.2 漏洞管理
#### 7.2.1 漏洞扫描策略
```bash
#!/bin/bash
# 系统漏洞扫描脚本
# 扫描操作系统漏洞
nmap -sV --script vulners localhost
# 扫描Web应用漏洞
nikto -h https://water.example.com -ssl
# 扫描数据库漏洞
nmap -p 5432 --script pgsql-brute,pgsql-databases localhost
# 生成漏洞报告
cat > vulnerability_report.html << EOF
<!DOCTYPE html>
<html>
<head>
<title>安全漏洞扫描报告</title>
</head>
<body>
<h1>福建水务营收系统漏洞扫描报告</h1>
<p>扫描时间:$(date)</p>
<h2>高危漏洞</h2>
<pre>$(grep -i "high\|critical" scan_results.txt)</pre>
<h2>中危漏洞</h2>
<pre>$(grep -i "medium" scan_results.txt)</pre>
</body>
</html>
EOF
```
#### 7.2.2 补丁管理流程
![流程图 8](temp_mermaid_86176/diagram_8.png)\n
### 7.3 应急响应预案
#### 7.3.1 安全事件分级
| 级别 | 描述 | 响应时间 | 处理措施 |
|------|------|----------|----------|
| P0 | 系统完全不可用,数据泄露 | 15分钟 | 立即启动应急预案,通知管理层 |
| P1 | 核心功能受影响,安全风险高 | 30分钟 | 启动应急预案,组建应急小组 |
| P2 | 部分功能受影响,安全风险中等 | 2小时 | 安排专人处理,定期汇报 |
| P3 | 轻微影响,安全风险较低 | 8小时 | 正常工作时间处理 |
#### 7.3.2 应急响应流程
![流程图 9](temp_mermaid_86176/diagram_9.png)\n
## 八、安全管理制度
### 8.1 安全组织架构
#### 8.1.1 安全管理组织
![流程图 10](temp_mermaid_86176/diagram_10.png)\n
### 8.2 安全管理制度
#### 8.2.1 人员安全管理
- **入职安全审查**:对关键岗位人员进行背景调查
- **安全培训**:定期进行信息安全意识培训
- **权限管理**:建立权限申请、审批、回收流程
- **离职管理**:离职人员权限及时回收,签署保密协议
#### 8.2.2 系统建设安全管理
- **安全需求分析**:项目立项阶段进行安全需求分析
- **安全设计评审**:设计阶段进行安全架构评审
- **安全测试**:上线前进行安全渗透测试
- **安全验收**:系统上线前进行安全验收
#### 8.2.3 系统运维安全管理
- **变更管理**:所有系统变更都需要安全评估
- **备份管理**:定期备份,异地存储,加密保护
- **监控管理**7×24小时安全监控
- **应急管理**:建立应急响应机制
### 8.3 合规管理
#### 8.3.1 法律法规合规
- 《中华人民共和国网络安全法》
- 《中华人民共和国数据安全法》
- 《中华人民共和国个人信息保护法》
- 《关键信息基础设施安全保护条例》
#### 8.3.2 行业标准合规
- GB/T 22239-2019《信息安全技术 网络安全等级保护基本要求》
- GB/T 25070-2019《信息安全技术 网络安全等级保护安全设计技术要求》
- GB/T 32918《信息安全技术 SM2椭圆曲线公钥密码算法》
- GB/T 32905《信息安全技术 SM3密码杂凑算法》
#### 8.3.3 合规检查清单
- [ ] 等级保护三级备案完成
- [ ] 年度安全评估报告
- [ ] 安全管理制度建立
- [ ] 安全技术措施落实
- [ ] 安全培训记录完整
- [ ] 应急预案演练记录
- [ ] 安全事件处置记录
- [ ] 第三方安全服务合同
---
## 总结
福建水务营收系统安全设计严格按照等级保护三级要求结合OpenGauss数据库的安全特性建立了全方位、多层次的安全防护体系。通过技术防护、管理制度、人员培训等多重措施确保系统安全稳定运行满足水务行业的安全合规要求。
本安全设计方案的核心特点:
1. **国产化安全**采用OpenGauss数据库和国密算法
2. **纵深防御**:网络、应用、数据多层安全防护
3. **合规导向**:严格按照等保三级标准设计
4. **持续改进**:建立安全监控和应急响应机制

View File

@ -0,0 +1,938 @@
# 福建水务营收系统架构设计文档
## 文档信息
| 项目信息 | 详情 |
|---------|------|
| **项目名称** | 福建水务营收系统 |
| **文档类型** | 概要设计文档 |
| **技术框架** | RuoYi-Vue-Pro + yudao-ui-admin-vue3 |
| **文档版本** | v1.0 |
| **编写日期** | 2024-12-19 |
| **文档状态** | ✅ 基本完成 |
## 目录
- [一、系统架构概述](#一系统架构概述)
- [二、技术架构](#二技术架构)
- [三、应用架构](#三应用架构)
- [四、数据架构](#四数据架构)
- [五、安全架构](#五安全架构)
- [六、部署架构](#六部署架构)
- [七、接口架构](#七接口架构)
## 一、系统架构概述
福建水务营收系统采用多层架构设计,旨在支持集团化的集中管理、统一资源管理的业务需求。系统架构的设计目标是实现"一个业务平台、一网通平台"的建设目标,为集团及下属各分公司提供统一的营业收费系统。
系统架构主要包括以下核心特点:
- 多租户架构:支持集团、分公司、营业站点的多层级租户管理模式
- 统一资源服务:统一的数字水务系统运行资源环境
- 统一平台应用:统一业务流程,集中汇集数据
- 统一对外接口:提供标准的接口和能力
### 1. 系统总体架构图
![流程图 1](temp_mermaid_86176/diagram_1.png)\n
### 2. 物理部署架构图
![流程图 2](temp_mermaid_86176/diagram_2.png)\n
## 二、技术架构
系统采用B/S和M/S相结合的架构模式具体技术栈如下
### 1. 技术栈总览图
![流程图 3](temp_mermaid_86176/diagram_3.png)\n
### 2. 系统数据流向图
![流程图 4](temp_mermaid_86176/diagram_4.png)\n
### 3. 服务端技术架构
- 操作系统:国产 Linux 操作系统
- 数据库华为OpenGauss 5.0+数据库,企业级国产数据库
- 应用框架基于RuoYi-Vue-Pro框架定制开发
- 核心框架Spring Boot 3.x支持JDK 17/21
- ORM框架MyBatis Plus增强的MyBatis
- 权限框架Spring Security基于RBAC的权限管理
- 数据缓存Redis + Redisson高性能缓存和分布式锁
- 工作流引擎Flowable灵活的工作流处理
- 任务调度基于Quartz的CRON任务调度
- 服务监控Spring Boot Admin、SkyWalking APM
- 消息队列基于Redis的轻量级消息队列
- 文档生成Knife4j基于Swagger的API文档生成
- 代码生成自动化CRUD和表单代码生成器
- 多租户基于字段隔离的SaaS多租户设计
#### 2.1 RuoYi-Vue-Pro框架配置示例
**application.yml主配置文件**
```yaml
# 服务端口配置
server:
port: 48080
servlet:
context-path: /admin-api
# Spring Boot 配置
spring:
application:
name: water-biz-server
profiles:
active: local
# 数据源配置
datasource:
druid:
url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
username: root
password: ${MYSQL_PASSWORD:123456}
driver-class-name: com.mysql.cj.jdbc.Driver
# 连接池配置
initial-size: 10
min-idle: 10
max-active: 20
max-wait: 60000
time-between-eviction-runs-millis: 60000
min-evictable-idle-time-millis: 300000
validation-query: SELECT 1 FROM DUAL
test-while-idle: true
test-on-borrow: false
test-on-return: false
pool-prepared-statements: true
max-pool-prepared-statement-per-connection-size: 20
# Redis 配置
redis:
host: 127.0.0.1
port: 6379
password: ${REDIS_PASSWORD:}
database: 1
timeout: 6000ms
lettuce:
pool:
max-active: 32
max-wait: 6000ms
max-idle: 32
min-idle: 8
# MyBatis Plus 配置
mybatis-plus:
configuration:
map-underscore-to-camel-case: true
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
global-config:
db-config:
id-type: NONE
logic-delete-field: deleted
logic-delete-value: 1
logic-not-delete-value: 0
type-aliases-package: cn.iocoder.yudao.module.*.dal.dataobject
# 水务系统多租户配置
yudao:
tenant:
enable: true
ignore-urls:
- /admin-api/water/tenant/get-id-by-name
- /admin-api/infra/file/*/get/**
ignore-tables:
- water_tenant
- water_system_config
- water_dict_data
- water_dict_type
# 水务系统安全配置
security:
permit-all-urls:
- /admin-api/water/auth/login
- /admin-api/water/auth/logout
- /admin-api/water/auth/refresh-token
- /admin-api/water/captcha/get
- /admin-api/water/sms/send
# 文件存储配置
file:
config:
type: local
local:
domain: http://127.0.0.1:48080
path: /Users/yunai/file_test
# 短信配置
sms:
alibaba:
access-key-id: ${SMS_ACCESS_KEY_ID:}
access-key-secret: ${SMS_ACCESS_KEY_SECRET:}
signature: 福建水务
template-code: SMS_123456
```
**多租户配置实现:**
```java
@Component
@Slf4j
public class WaterTenantConfiguration {
@Resource
private TenantProperties tenantProperties;
/**
* 多租户字段处理器
*/
@Bean
public TenantLineHandler tenantLineHandler() {
return new TenantLineHandler() {
@Override
public Expression getTenantId() {
// 从当前登录用户上下文获取租户ID
Long tenantId = TenantContextHolder.getTenantId();
if (tenantId == null) {
return null;
}
return new LongValue(tenantId);
}
@Override
public String getTenantIdColumn() {
return "tenant_id";
}
@Override
public boolean ignoreTable(String tableName) {
// 忽略的表不进行多租户处理
return tenantProperties.getIgnoreTables().contains(tableName);
}
};
}
/**
* 多租户拦截器
*/
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
// 多租户插件
TenantLineInnerInterceptor tenantInterceptor = new TenantLineInnerInterceptor();
tenantInterceptor.setTenantLineHandler(tenantLineHandler());
interceptor.addInnerInterceptor(tenantInterceptor);
// 分页插件
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}
```
**权限控制配置:**
```java
@EnableWebSecurity
@EnableMethodSecurity(prePostEnabled = true, securedEnabled = true)
@Configuration
public class WaterSecurityConfiguration {
@Resource
private SecurityProperties securityProperties;
@Bean
public SecurityFilterChain filterChain(HttpSecurity httpSecurity,
@Lazy TokenAuthenticationFilter tokenAuthenticationFilter) throws Exception {
return httpSecurity
// 设置 URL 安全权限
.authorizeHttpRequests(c -> c
// 1. 静态资源,可匿名访问
.requestMatchers(HttpMethod.GET, "/*.html", "/**/*.html", "/**/*.css", "/**/*.js").permitAll()
// 2. 设置 @PermitAll 无需认证
.requestMatchers(securityProperties.getPermitAllUrls().toArray(new String[0])).permitAll()
// 3. 兜底规则,必须认证
.anyRequest().authenticated()
)
// 设置处理器
.exceptionHandling(c -> c.authenticationEntryPoint(authenticationEntryPoint)
.accessDeniedHandler(accessDeniedHandler))
// 添加 Token Filter
.addFilterBefore(tokenAuthenticationFilter, UsernamePasswordAuthenticationFilter.class)
// 不创建 SecurityContext
.sessionManagement(c -> c.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
// 禁用 CSRF因为使用 token 机制
.csrf(AbstractHttpConfigurer::disable)
// 禁用 cors
.cors(AbstractHttpConfigurer::disable)
.build();
}
}
```
### 3. 客户端技术架构
- 前端框架基于yudao-ui-admin-vue3框架定制开发
- 核心框架Vue 3.x + TypeScript
- 组件库Element Plus现代化UI组件
- 状态管理Pinia新一代的Vue状态管理库
- 路由管理Vue Router
- HTTP工具Axios请求拦截与统一处理
- CSS框架Tailwind CSS / UnoCSS原子化CSS
- 图表组件ECharts强大的可视化图表库
- 富文本编辑器WangEditor
- 文件上传基于Element Plus的上传组件
- 权限控制:细粒度的按钮级权限控制
- 动态表格:支持拖拽、排序、筛选
- 代码规范ESLint + Prettier标准化代码风格
#### 3.1 前端项目结构配置
**package.json 依赖配置:**
```json
{
"name": "water-biz-ui-admin",
"version": "1.0.0",
"description": "福建水务营收系统管理后台",
"dependencies": {
"@element-plus/icons-vue": "^2.1.0",
"@vueuse/core": "^10.5.0",
"axios": "^1.6.0",
"echarts": "^5.4.3",
"element-plus": "^2.4.2",
"pinia": "^2.1.7",
"vue": "^3.3.8",
"vue-router": "^4.2.5",
"@wangeditor/editor": "^5.1.23",
"@wangeditor/editor-for-vue": "^5.1.12"
},
"devDependencies": {
"@types/node": "^20.8.7",
"@typescript-eslint/eslint-plugin": "^6.9.1",
"@typescript-eslint/parser": "^6.9.1",
"@vitejs/plugin-vue": "^4.4.1",
"eslint": "^8.52.0",
"eslint-plugin-vue": "^9.17.0",
"prettier": "^3.0.3",
"typescript": "^5.2.2",
"vite": "^4.5.0",
"vue-tsc": "^1.8.22"
}
}
```
**vite.config.ts 构建配置:**
```typescript
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import { resolve } from 'path'
export default defineConfig({
plugins: [vue()],
resolve: {
alias: {
'@': resolve(__dirname, 'src'),
'~': resolve(__dirname, 'src'),
'#': resolve(__dirname, 'types')
}
},
server: {
host: '0.0.0.0',
port: 3000,
open: true,
proxy: {
'/admin-api': {
target: 'http://127.0.0.1:48080',
changeOrigin: true,
ws: true
}
}
},
build: {
target: 'es2015',
outDir: 'dist',
assetsDir: 'static',
sourcemap: false,
chunkSizeWarningLimit: 1500,
rollupOptions: {
output: {
chunkFileNames: 'static/js/[name]-[hash].js',
entryFileNames: 'static/js/[name]-[hash].js',
assetFileNames: 'static/[ext]/[name]-[hash].[ext]'
}
}
}
})
```
**src/stores/user.ts 用户状态管理:**
```typescript
import { defineStore } from 'pinia'
import { ref, computed } from 'vue'
import { UserApi, UserVO } from '@/api/system/user'
import { getAccessToken, removeToken } from '@/utils/auth'
export const useUserStore = defineStore('user', () => {
const userInfo = ref<UserVO>()
const permissions = ref<string[]>([])
const roles = ref<string[]>([])
const nickname = computed(() => userInfo.value?.nickname ?? '')
const avatar = computed(() => userInfo.value?.avatar ?? '')
const email = computed(() => userInfo.value?.email ?? '')
// 获取用户信息
const getUserInfo = async () => {
const res = await UserApi.getUserProfile()
userInfo.value = res
permissions.value = res.permissions
roles.value = res.roles
}
// 用户登出
const logout = async () => {
try {
await UserApi.logout()
} finally {
await resetToken()
}
}
// 重置令牌
const resetToken = async () => {
userInfo.value = undefined
permissions.value = []
roles.value = []
removeToken()
}
// 检查权限
const hasPermission = (permission: string) => {
return permissions.value.includes(permission)
}
// 检查角色
const hasRole = (role: string) => {
return roles.value.includes(role)
}
return {
userInfo,
permissions,
roles,
nickname,
avatar,
email,
getUserInfo,
logout,
resetToken,
hasPermission,
hasRole
}
})
```
**src/utils/request.ts HTTP请求封装**
```typescript
import axios, { AxiosResponse, InternalAxiosRequestConfig } from 'axios'
import { ElMessage, ElMessageBox } from 'element-plus'
import { getAccessToken, getRefreshToken, removeToken } from '@/utils/auth'
import { useUserStore } from '@/stores/user'
// 创建 axios 实例
const service = axios.create({
baseURL: import.meta.env.VITE_BASE_URL,
timeout: 50000,
withCredentials: false
})
// 请求拦截器
service.interceptors.request.use(
(config: InternalAxiosRequestConfig) => {
// 添加 token
const accessToken = getAccessToken()
if (accessToken && config.headers) {
config.headers.Authorization = `Bearer ${accessToken}`
}
// 添加租户ID
const tenantId = localStorage.getItem('tenantId')
if (tenantId && config.headers) {
config.headers['tenant-id'] = tenantId
}
return config
},
error => {
console.log(error)
return Promise.reject(error)
}
)
// 响应拦截器
service.interceptors.response.use(
(response: AxiosResponse) => {
const { data } = response
const { code, msg } = data
// 业务请求成功
if (code === 0) {
return data
}
// token 过期,尝试刷新
if (code === 401) {
return handleTokenExpired()
}
// 业务请求失败
ElMessage.error(msg || '系统未知错误,请反馈给管理员')
return Promise.reject(new Error(msg || 'Error'))
},
error => {
console.log('err' + error)
let { message } = error
if (message === 'Network Error') {
message = '后端接口连接异常'
} else if (message.includes('timeout')) {
message = '系统接口请求超时'
} else if (message.includes('Request failed with status code')) {
message = '系统接口' + message.substr(message.length - 3) + '异常'
}
ElMessage.error(message)
return Promise.reject(error)
}
)
// 处理 token 过期
const handleTokenExpired = async () => {
const userStore = useUserStore()
ElMessageBox.alert('登录状态已过期,您可以继续留在该页面,或者重新登录', '系统提示', {
confirmButtonText: '重新登录',
type: 'warning'
}).then(() => {
userStore.resetToken().then(() => {
location.reload()
})
})
}
export default service
```
### 4. 前端技术架构详细设计
#### 4.1 Web管理端架构 (yudao-ui-admin-vue3)
**技术栈组成:**
![流程图 5](temp_mermaid_86176/diagram_5.png)\n
**项目结构设计:**
```text
yudao-ui-admin-vue3/
├── public/ # 静态资源
├── src/
│ ├── api/ # API接口定义
│ │ └── water/ # 水务业务API
│ │ ├── customer/ # 客户管理API
│ │ ├── meter/ # 抄表管理API
│ │ ├── billing/ # 收费管理API
│ │ └── workflow/ # 工单管理API
│ ├── assets/ # 静态资源
│ ├── components/ # 全局组件
│ │ ├── Dialog/ # 弹窗组件
│ │ ├── Form/ # 表单组件
│ │ ├── Table/ # 表格组件
│ │ └── Upload/ # 上传组件
│ ├── layout/ # 布局组件
│ ├── router/ # 路由配置
│ ├── stores/ # Pinia状态管理
│ ├── styles/ # 全局样式
│ ├── utils/ # 工具函数
│ ├── views/ # 页面组件
│ │ └── water/ # 水务业务页面
│ │ ├── customer/ # 客户管理
│ │ ├── meter/ # 抄表管理
│ │ ├── billing/ # 收费管理
│ │ └── workflow/ # 工单管理
│ └── App.vue
├── types/ # TypeScript类型定义
├── vite.config.ts # Vite配置
├── tsconfig.json # TypeScript配置
└── package.json # 项目依赖
```
**核心配置示例:**
```typescript
// vite.config.ts - Vite构建配置
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import { resolve } from 'path'
export default defineConfig({
plugins: [vue()],
resolve: {
alias: {
'@': resolve(__dirname, 'src'),
'@/api': resolve(__dirname, 'src/api'),
'@/components': resolve(__dirname, 'src/components'),
'@/utils': resolve(__dirname, 'src/utils')
}
},
server: {
port: 80,
proxy: {
'/admin-api': {
target: 'http://127.0.0.1:48080',
changeOrigin: true,
rewrite: (path) => path.replace(/^\/admin-api/, '/admin-api')
}
}
},
build: {
outDir: 'dist',
sourcemap: false,
rollupOptions: {
output: {
chunkFileNames: 'js/[name]-[hash].js',
entryFileNames: 'js/[name]-[hash].js',
assetFileNames: '[ext]/[name]-[hash].[ext]'
}
}
}
})
```
#### 4.2 移动端架构 (uni-app)
**技术栈组成:**
![流程图 6](temp_mermaid_86176/diagram_6.png)\n
**移动端项目结构:**
```text
water-mobile-app/
├── pages/ # 页面目录
│ ├── index/ # 首页
│ ├── meter/ # 抄表功能
│ │ ├── task/ # 抄表任务
│ │ ├── read/ # 抄表录入
│ │ └── history/ # 抄表历史
│ ├── workflow/ # 工单管理
│ └── personal/ # 个人中心
├── components/ # 组件目录
│ ├── meter-reader/ # 水表读数组件
│ ├── map-trace/ # 地图轨迹组件
│ └── camera-scan/ # 相机扫描组件
├── static/ # 静态资源
├── store/ # 状态管理
├── utils/ # 工具函数
├── api/ # 接口定义
├── manifest.json # 应用配置
└── pages.json # 页面配置
```
#### 4.3 客户端小程序架构
**微信小程序技术栈:**
- 开发框架:微信小程序原生框架
- UI组件WeUI + 自定义组件
- 状态管理:小程序全局数据管理
- 支付集成微信支付API
- 地图服务腾讯地图API
**支付宝小程序技术栈:**
- 开发框架:支付宝小程序原生框架
- UI组件mini-antui + 自定义组件
- 状态管理:小程序全局数据管理
- 支付集成支付宝支付API
- 地图服务高德地图API
#### 4.4 前端工程化配置
**代码规范:**
```json
// .eslintrc.js - ESLint配置
{
"extends": [
"@vue/typescript/recommended",
"@vue/prettier",
"@vue/prettier/@typescript-eslint"
],
"rules": {
"@typescript-eslint/no-explicit-any": "warn",
"@typescript-eslint/no-unused-vars": "error",
"vue/multi-word-component-names": "off"
}
}
```
**构建优化:**
- Vite热更新开发环境快速构建
- 代码分割:按路由和组件懒加载
- 资源压缩Gzip压缩和图片优化
- CDN加速静态资源CDN分发
- 缓存策略浏览器缓存和Service Worker
- 移动端:
- 核心框架uni-app跨平台
- 组件库uview-ui
- 小程序支持:微信小程序、支付宝小程序等
- 移动端地图高德地图SDK用于抄表轨迹和导航
- 设备接入NFC、扫码、相机等硬件设备接口
### 2.3 技术特性
- 单点登录OAuth2 + JWT实现统一认证
- 数据交换基于RESTful API的系统内部数据交换与共享
- 统一报表平台集成JimuReport支持自定义报表设计与生成
- 大屏设计集成GoView支持可视化大屏设计
- 安全保障:满足安全等保三级要求
- 密码加密BCrypt加密算法
- 防XSS攻击表单数据过滤
- 防SQL注入参数化查询
- 防CSRF攻击Token验证
- 性能规格支持200并发用户50并发移动设备系统响应时间不超过3秒
- 扩展容量支持100万客户的业务量满足企业3-5年的业务发展需求
- 支持功能:
- 支付管理:微信支付、支付宝支付等
- 短信服务:阿里云、腾讯云等多家短信服务商
- AI能力
- 智能抄表:基于图像识别的水表读数
- 异常分析基于AI的用水异常分析
- API网关支持API权限管理、限流熔断、白名单控制
## 3. 应用架构
### 1. 微服务应用架构图
![流程图 7](temp_mermaid_86176/diagram_7.png)\n
### 2. 服务治理架构
![流程图 8](temp_mermaid_86176/diagram_8.png)\n
系统应用架构基于业务域划分,主要包括以下核心应用模块:
### 3.1 统一平台
- 单点登录:统一认证入口,支持多种登录方式
- 系统管理:组织机构、员工管理、角色权限管理、菜单配置等
- 流程节点提醒:工作流节点到期和状态变更提醒
### 3.2 营收系统
- 系统管理:水价管理、用户档案管理、更名过户管理等
- 抄表开账:册本管理、抄表录入、复核开账等
- 收费管理:柜台收费、特殊开账、柜台结账、批量缴费等
- 账务处理:预存调整、未销调整、已销调整、分账调整等
- 发票管理:发票查询、发票开具、电子发票等
- 代收业务:实时收费、银行代扣、银行托收等
- 环卫系统:计费核定、计费退补、计费减免等
- 业务工单:业务清单、上报清单、稽查工单、移表工单等
### 3.3 客户服务
- 微信、支付宝服务窗:账户绑定、用水查询、在线缴费等
- 历史账单:账单查询、用水分析、账单推送等
- 电子发票:发票申请、发票查询、发票下载等
- 营业网点:网点查询、网点导航、业务指南等
- 账户流水:流水查询、明细下载、交易统计等
- 微网厅:用户注册、信息查询、业务办理等
### 3.4 表务系统
- 表务工单:换表工单、移表工单、拆表工单、复装工单等
- 表务仓库:新表入库、水表检定、水表领用、水表出库等
- 水表参数与基础信息:水表厂家管理、水表型号管理等
- 物联网对接与数据同步:厂家设备信息管理、远程抄表数据同步等
### 3.5 报装管理
- 报装流程:报装申请、方案设计、合同签订、施工管理等
- 一户一表管理:改造计划、改造实施、用户转换等
### 3.6 统计分析
- 报表查询:标准报表、自定义报表、报表导出打印等
- 欠费查询:欠费情况统计、欠费用户明细、欠费分析等
- 缴费记录:缴费情况统计、缴费明细查询、缴费趋势分析等
- 用水分析:用水量统计、用水趋势分析、异常用水分析等
### 3.7 工程管理
- 工程申请:工程立项、材料提交、前期勘察等
- 工程施工:施工计划、施工派工、施工记录等
- 工程验收:验收申请、验收检查、验收记录等
- 工程查询:工程进度查询、工程资料查询、工程统计等
### 3.8 抄表APP
- 首页功能:首页展示、个人信息、快捷查询等
- 抄表功能抄表任务、NFC抄表、扫码抄表、AI录入等
- 工单管理:问题上报、问题回填、代办工单、稽查工单等
### 3.9 接口服务
- API市场API展示、API使用说明、API测试等
- API管理API申请、API调度看板、接口服务配置管理等
- 接口权限管理:授权管理、白名单管理、安全策略等
- 系统对外接口:查询接口、业务处理接口、状态同步接口等
### 3.10 系统配置
- 水表参数:水表厂家、水表型号、水表量程等
- 地址参数:行政区划、地址编码、地址库等
- 价格体系:用水性质、水价标准、阶梯水价等
- 基本配置:系统参数、业务规则、打印模板等
- 催缴管理:催缴计划、催缴任务、催缴执行等
- 用户权限:菜单权限、功能权限、数据权限等
- 定时任务:任务配置、任务监控、任务日志等
## 4. 数据架构
系统数据架构基于客户关系数据库为核心和基础,实现客户全生命周期管理。
### 4.1 数据分层
- 数据采集层:负责从各业务系统和物联网设备采集原始数据
- 数据存储层:统一数据存储,实现分布式数据管理
- 数据服务层:提供数据服务接口
- 数据展现层:提供数据分析和可视化功能
### 4.2 OpenGauss数据库架构
#### 4.2.1 主从高可用架构
![流程图 9](temp_mermaid_86176/diagram_9.png)\n
#### 4.2.2 分片存储架构
![流程图 10](temp_mermaid_86176/diagram_10.png)\n
#### 4.2.3 数据安全架构
![流程图 11](temp_mermaid_86176/diagram_11.png)\n
### 4.3 数据模型设计
- **客户信息模型**:包含客户基础信息、表卡信息、账户信息、联系人信息等
- **业务数据模型**:抄表数据、收费数据、账务数据、发票数据等
- **工单数据模型**:表务工单、报装工单、业务工单等
- **配置数据模型**:系统参数、水表参数、价格体系等
- **报表数据模型**:统计数据、分析数据、预测数据等
- **物联网数据模型**:设备信息、状态信息、实时数据等
### 4.4 数据集成与共享
- **统一数据标准**定义统一的数据标准和数据字典符合OpenGauss规范
- **数据集成机制**采用OpenGauss XA事务实现系统间的数据一致性
- **数据共享机制**基于OpenGauss外部数据包装器(FDW)实现跨库数据访问
- **数据同步策略**支持实时流复制、定时数据同步、批量ETL处理等
### 4.5 OpenGauss特性应用
#### 4.5.1 性能优化特性
- **向量化执行引擎**批量数据处理提升OLAP查询性能30-50%
- **列存储引擎**统计报表类查询压缩比高达10:1
- **分区表技术**:按月份分区存储抄表数据,支持分区裁剪
- **并行查询**:复杂统计查询自动并行执行
- **智能优化器**:自适应查询计划,持续性能优化
#### 4.5.2 企业级特性
- **在线扩容**:支持不停机新增数据节点
- **故障自愈**主备节点故障自动切换RTO < 10秒
- **读写分离**:自动路由读请求到备节点,减轻主库压力
- **负载均衡**:连接池级别的智能负载均衡
- **全量/增量备份**:支持热备份,最小备份粒度到事务级
## 5. 安全架构
系统安全架构基于OpenGauss数据库的企业级安全特性满足等保三级要求和国产化安全标准
### 5.1 网络安全
- **边界防护**:防火墙、入侵检测/防御系统
- **访问控制**:基于角色的访问控制(RBAC)
- **通信安全**SSL/TLS加密传输支持国密算法
- **安全监控**:实时监控网络安全状态和异常访问
### 5.2 OpenGauss数据安全架构
#### 5.2.1 数据加密安全
![流程图 12](temp_mermaid_86176/diagram_12.png)\n
#### 5.2.2 访问控制安全
![流程图 13](temp_mermaid_86176/diagram_13.png)\n
### 5.3 数据安全特性
- **透明数据加密(TDE)**自动加密存储数据支持SM4国密算法
- **行级安全(RLS)**:基于用户角色的行级数据访问控制
- **列级权限**:敏感字段的精细化访问控制
- **动态脱敏**:查询时自动脱敏显示敏感信息
- **数据备份安全**:备份文件自动加密,支持增量备份
- **审计日志**:完整记录所有数据库操作,支持合规审计
### 5.4 多租户安全隔离
- **逻辑隔离**基于tenant_id的数据隔离
- **连接隔离**:租户间连接池隔离
- **权限隔离**:租户级别的权限管理
- **资源隔离**CPU、内存、IO资源限制
### 5.5 应用安全
- **身份认证**:多因素认证,支持短信验证码、邮箱验证等
- **授权管理**:细粒度的权限控制,支持菜单、按钮、数据权限
- **安全审计**:用户操作审计,关键业务操作全程记录
- **密码策略**:密码复杂度、定期更换、失败锁定等安全策略
- **会话管理**:会话超时、并发限制、单点登录等
### 5.6 接口安全
- **接口认证**基于JWT Token的接口认证
- **接口授权**:基于角色的接口授权和权限验证
- **接口加密**:敏感数据的加密传输,支持国密算法
- **接口防护**防重放、防篡改、防SQL注入等安全措施
- **接口限流**基于IP、用户、应用的多维度限流策略
## 6. 部署架构
系统采用集中部署的模式,基于集团私有云环境进行部署。
### 6.1 物理部署
- **生产环境**:高可用集群部署
- 应用服务器2台或以上服务器负载均衡
- **OpenGauss数据库集群**:主从+级联备架构,支持自动故障切换
- 缓存服务器Redis集群
- 文件服务器:冗余存储
- **灾备环境**异地灾备定期数据同步支持OpenGauss流复制
- **测试环境**用于系统测试和验证单节点OpenGauss部署
- **开发环境**用于系统开发和集成测试单节点OpenGauss部署
### 6.2 逻辑部署
- **应用服务器集群**:负责业务逻辑处理,支持水平扩展
- **OpenGauss数据库集群**:负责数据存储和管理,提供高可用保障
- **文件服务器**:负责文档和附件存储,支持分布式存储
- **缓存服务器**Redis集群提高系统性能
- **负载均衡服务器**:实现请求分发和负载均衡
- **移动应用服务**提供移动端API服务
- **API网关**:统一的接口管理和控制
### 6.3 容器部署
- 基于Docker容器技术实现微服务部署
- 使用Kubernetes进行容器编排和管理
- 支持容器的自动扩缩容和故障转移
- 实现服务的灰度发布和版本控制
## 7. 接口架构
系统提供标准化的接口,实现与外部系统的集成和数据交换。
### 7.1 外部接口
- 银行接口:实现与银行系统的对接,支持代扣、托收等功能
- 支付宝/微信接口:支持在线支付功能
- 短信接口:支持短信通知和验证码功能
- 集抄系统接口:实现与智能水表集中抄表系统的对接
- 政务系统接口实现与地方政务平台和政务APP的对接
- 消火栓系统接口:实现与消火栓系统的对接
- 环卫系统接口:实现与环卫系统的对接
- OA系统接口实现与OA系统的工作流对接
### 7.2 内部接口
- ESB服务接口系统内部模块间的数据交换
- 报表接口:提供报表数据查询和生成功能
- 查询接口:提供数据查询功能
- 业务处理接口:提供业务处理功能
- 消息通知接口:提供消息推送和通知功能
- 工作流接口:提供工作流处理和状态查询功能
### 7.3 接口标准
- 接口协议RESTful API、WebService、消息队列等
- 数据格式JSON、XML等
- 接口安全:身份认证、授权、加密传输等
- 接口文档:统一的接口文档和示例代码
- 接口测试:提供接口测试工具和环境
### 7.4 接口服务管理
- API网关统一的接口入口和管理
- 服务注册与发现:服务的自动注册和发现
- 服务路由:根据请求参数进行服务路由
- 服务降级:在服务不可用时提供降级策略

View File

@ -118,6 +118,8 @@
| 2024-12-19 | 项目完成 | 所有核心文档已完成并达到A级标准 | 按计划完成所有交付物 | 正面影响,项目成功交付 |
| 2024-12-19 | 架构统一 | 部署设计文档统一使用OpenGauss数据库 | 确保文档架构一致性 | 正面影响,提升技术方案统一性 |
| 2024-12-19 | 部署优化 | 移除Kubernetes配置专注Docker Compose | 甲方需求简化部署方案 | 正面影响,降低部署复杂度 |
| 2024-12-19 | 流程图修复 | 创建Mermaid图表处理工具解决docx导出流程图问题 | 用户反馈docx文档没有流程图 | 正面影响,大幅提升文档质量和可读性 |
| 2024-12-19 | 标题层次修复 | 修复water_biz_system_architecture.md多级标题编号错误 | 用户反馈存在多级标题错误问题 | 正面影响,提升文档规范性和可读性 |
## 项目完成总结

222
scripts/process-mermaid.sh Executable file
View File

@ -0,0 +1,222 @@
#!/bin/zsh
# Mermaid图表处理脚本
# 将Markdown文档中的Mermaid图表转换为图片以便在Word文档中正确显示
echo "🔄 开始处理Mermaid图表..."
# 确保必要的工具已安装
check_dependencies() {
echo "📋 检查依赖工具..."
if ! command -v node &> /dev/null; then
echo "❌ 错误: 需要安装Node.js"
echo "请访问 https://nodejs.org/ 下载安装"
exit 1
fi
# 检查mermaid-cli
if ! npx mmdc --version &> /dev/null && ! command -v mmdc &> /dev/null; then
echo "📦 安装mermaid-cli..."
npm install @mermaid-js/mermaid-cli --save-dev
if [ $? -eq 0 ]; then
echo "✅ mermaid-cli安装成功"
else
echo "❌ mermaid-cli安装失败"
exit 1
fi
else
echo "✅ mermaid-cli已安装"
fi
if ! command -v pandoc &> /dev/null; then
echo "❌ 错误: 需要安装pandoc"
echo "macOS: brew install pandoc"
echo "其他系统: https://pandoc.org/installing.html"
exit 1
else
echo "✅ pandoc已安装"
fi
}
# 处理单个Markdown文件中的Mermaid图表
process_mermaid_file() {
local input_file="$1"
local output_file="$2"
local temp_dir="temp_mermaid_$$"
echo "📄 处理文件: $input_file"
# 创建临时目录
mkdir -p "$temp_dir"
# 复制原文件
cp "$input_file" "$temp_dir/temp.md"
# 提取并转换Mermaid图表
local mermaid_count=0
local in_mermaid=false
local mermaid_content=""
local processed_content=""
while IFS= read -r line; do
if [[ "$line" =~ ^\`\`\`mermaid ]]; then
in_mermaid=true
mermaid_content=""
continue
elif [[ "$line" =~ ^\`\`\`$ ]] && [ "$in_mermaid" = true ]; then
# 处理Mermaid图表
mermaid_count=$((mermaid_count + 1))
local mermaid_file="$temp_dir/diagram_$mermaid_count.mmd"
local image_file="$temp_dir/diagram_$mermaid_count.png"
# 保存Mermaid代码到文件
echo "$mermaid_content" > "$mermaid_file"
# 转换为PNG图片
echo "🖼️ 转换图表 $mermaid_count..."
npx mmdc -i "$mermaid_file" -o "$image_file" -w 1200 -H 800 --backgroundColor white 2>/dev/null || {
mmdc -i "$mermaid_file" -o "$image_file" -w 1200 -H 800 --backgroundColor white 2>/dev/null || {
echo "⚠️ 警告: 图表 $mermaid_count 转换失败,将保留原始代码"
processed_content+="$(echo $'\n```mermaid\n'"$mermaid_content"$'\n```\n')"
in_mermaid=false
continue
}
}
if [ -f "$image_file" ]; then
# 替换为图片引用
processed_content+="$(echo $'\n![流程图 '$mermaid_count']('$image_file')\n')"
echo "✅ 图表 $mermaid_count 转换成功"
else
# 如果转换失败,保留原始代码
processed_content+="$(echo $'\n```mermaid\n'"$mermaid_content"$'\n```\n')"
echo "⚠️ 图表 $mermaid_count 转换失败,保留原始代码"
fi
in_mermaid=false
elif [ "$in_mermaid" = true ]; then
mermaid_content+="$line"$'\n'
else
processed_content+="$line"$'\n'
fi
done < "$input_file"
# 保存处理后的内容
echo "$processed_content" > "$output_file"
echo "📊 共处理 $mermaid_count 个图表"
# 清理临时文件
# rm -rf "$temp_dir"
}
# 处理所有Markdown文件
process_all_files() {
local output_dir="processed_docs"
mkdir -p "$output_dir"
echo "🔄 处理所有设计文档..."
local doc_files=(
"water_biz_system_architecture.md"
"water_biz_module_design.md"
"water_biz_database_design.md"
"water_biz_interface_design.md"
"water_biz_deployment_design.md"
"water_biz_security_design.md"
)
for doc in "${doc_files[@]}"; do
if [ -f "$doc" ]; then
echo "📄 处理: $doc"
process_mermaid_file "$doc" "$output_dir/$doc"
else
echo "⚠️ 文件不存在: $doc"
fi
done
echo "✅ 所有文件处理完成,输出目录: $output_dir"
}
# 生成带图片的Word文档
export_to_docx_with_images() {
local processed_dir="processed_docs"
local output_dir="output"
mkdir -p "$output_dir"
echo "📝 导出Word文档..."
# 合并处理后的文档
local merged_file="$output_dir/merged_processed_docs.md"
echo "---" > "$merged_file"
echo "title: \"福建水务营收系统概要设计文档\"" >> "$merged_file"
echo "author: \"系统设计团队\"" >> "$merged_file"
echo "date: \"$(date '+%Y年%m月%d日')\"" >> "$merged_file"
echo "---" >> "$merged_file"
echo "" >> "$merged_file"
# 按顺序合并文档
local doc_order=(
"water_biz_system_architecture.md"
"water_biz_module_design.md"
"water_biz_database_design.md"
"water_biz_interface_design.md"
"water_biz_deployment_design.md"
"water_biz_security_design.md"
)
for doc in "${doc_order[@]}"; do
if [ -f "$processed_dir/$doc" ]; then
echo "" >> "$merged_file"
echo "---" >> "$merged_file"
echo "" >> "$merged_file"
cat "$processed_dir/$doc" >> "$merged_file"
fi
done
# 使用pandoc转换为Word
local output_docx="$output_dir/福建水务营收系统概要设计文档_含图表.docx"
echo "🔄 使用pandoc转换为Word格式..."
pandoc "$merged_file" -o "$output_docx" \
--reference-doc=templates/reference.docx \
--extract-media="$output_dir/media" \
2>/dev/null || \
pandoc "$merged_file" -o "$output_docx" \
--extract-media="$output_dir/media"
if [ -f "$output_docx" ]; then
echo "✅ Word文档导出成功: $output_docx"
echo "📂 媒体文件目录: $output_dir/media"
else
echo "❌ Word文档导出失败"
exit 1
fi
}
# 主函数
main() {
echo "🚀 福建水务营收系统 - Mermaid图表处理工具"
echo "================================="
check_dependencies
process_all_files
export_to_docx_with_images
echo ""
echo "🎉 处理完成!"
echo "📄 包含图表的Word文档: output/福建水务营收系统概要设计文档_含图表.docx"
echo "📁 处理后的Markdown文件: processed_docs/"
echo ""
echo "💡 提示:"
echo " - 如果某些图表未正确显示请检查Mermaid语法"
echo " - 图片文件保存在 output/media/ 目录中"
echo " - 可以手动调整图片大小和位置"
}
# 如果直接运行此脚本
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
main "$@"
fi

View File

@ -86,6 +86,16 @@
## ✅ 最新完成任务 (2024-12-19)
### 📋 文档标题层次修复
- [x] **文档标题层次修复** ✅ (2024-12-19)
- [x] 修复water_biz_system_architecture.md标题编号错误 ✅
- [x] 统一一级标题为中文编号(一、二、三...
- [x] 统一二级标题为数字编号1.1、1.2...
- [x] 统一三级标题为数字编号2.1.1、2.1.2...
- [x] 确保标题层次结构清晰合理 ✅
- [x] 更新项目管理文件记录修复过程 ✅
### 📋 工具链修复
- [x] **文档验证工具修复**
- [x] 修复代码块语言标记检查逻辑 ✅
@ -103,6 +113,13 @@
- [x] 成功导出HTML格式文档 ✅
- [x] 更新项目管理文件记录修复过程 ✅
- [x] **Mermaid图表问题修复** ✅ (2024-12-19)
- [x] 创建Mermaid图表处理工具 scripts/process-mermaid.sh ✅
- [x] 实现Mermaid代码转PNG图片功能 ✅
- [x] 集成到Makefile构建流程 ✅
- [x] 生成包含图表的Word文档 ✅
- [x] 处理所有设计文档中的流程图 ✅
## 📅 第二阶段任务 (内容完善)
### 📋 业务流程优化

View File

@ -29,7 +29,7 @@
- 统一平台应用:统一业务流程,集中汇集数据
- 统一对外接口:提供标准的接口和能力
### 1. 系统总体架构图
### 1.1 系统总体架构图
```mermaid
graph TB
@ -104,7 +104,7 @@ graph TB
C3 --> F4
```
### 2. 物理部署架构图
### 1.2 物理部署架构图
```mermaid
graph TB
@ -187,7 +187,7 @@ graph TB
系统采用B/S和M/S相结合的架构模式具体技术栈如下
### 1. 技术栈总览图
### 2.1 技术栈总览图
```mermaid
graph TB
@ -273,7 +273,7 @@ graph TB
OP8 --> BE1
```
### 2. 系统数据流向图
### 2.2 系统数据流向图
```mermaid
flowchart TD
@ -363,7 +363,7 @@ flowchart TD
F5 -.-> C4
```
### 3. 服务端技术架构
### 2.3 服务端技术架构
- 操作系统:国产 Linux 操作系统
- 数据库华为OpenGauss 5.0+数据库,企业级国产数据库
- 应用框架基于RuoYi-Vue-Pro框架定制开发
@ -379,7 +379,7 @@ flowchart TD
- 代码生成自动化CRUD和表单代码生成器
- 多租户基于字段隔离的SaaS多租户设计
#### 2.1 RuoYi-Vue-Pro框架配置示例
#### 2.3.1 RuoYi-Vue-Pro框架配置示例
**application.yml主配置文件**
```yaml
@ -578,7 +578,7 @@ public class WaterSecurityConfiguration {
}
```
### 3. 客户端技术架构
### 2.4 客户端技术架构
- 前端框架基于yudao-ui-admin-vue3框架定制开发
- 核心框架Vue 3.x + TypeScript
- 组件库Element Plus现代化UI组件
@ -593,7 +593,7 @@ public class WaterSecurityConfiguration {
- 动态表格:支持拖拽、排序、筛选
- 代码规范ESLint + Prettier标准化代码风格
#### 3.1 前端项目结构配置
#### 2.4.1 前端项目结构配置
**package.json 依赖配置:**
```json
@ -826,9 +826,9 @@ const handleTokenExpired = async () => {
export default service
```
### 4. 前端技术架构详细设计
### 2.5 前端技术架构详细设计
#### 4.1 Web管理端架构 (yudao-ui-admin-vue3)
#### 2.5.1 Web管理端架构 (yudao-ui-admin-vue3)
**技术栈组成:**
```mermaid
@ -959,7 +959,7 @@ export default defineConfig({
})
```
#### 4.2 移动端架构 (uni-app)
#### 2.5.2 移动端架构 (uni-app)
**技术栈组成:**
```mermaid
@ -1027,7 +1027,7 @@ water-mobile-app/
└── pages.json # 页面配置
```
#### 4.3 客户端小程序架构
#### 2.5.3 客户端小程序架构
**微信小程序技术栈:**
- 开发框架:微信小程序原生框架
@ -1043,7 +1043,7 @@ water-mobile-app/
- 支付集成支付宝支付API
- 地图服务高德地图API
#### 4.4 前端工程化配置
#### 2.5.4 前端工程化配置
**代码规范:**
```json
@ -1076,7 +1076,7 @@ water-mobile-app/
- 移动端地图高德地图SDK用于抄表轨迹和导航
- 设备接入NFC、扫码、相机等硬件设备接口
### 2.3 技术特性
### 2.6 技术特性
- 单点登录OAuth2 + JWT实现统一认证
- 数据交换基于RESTful API的系统内部数据交换与共享
- 统一报表平台集成JimuReport支持自定义报表设计与生成
@ -1096,9 +1096,9 @@ water-mobile-app/
- 异常分析基于AI的用水异常分析
- API网关支持API权限管理、限流熔断、白名单控制
## 3. 应用架构
## 三、应用架构
### 1. 微服务应用架构图
### 3.1 微服务应用架构图
```mermaid
graph TB
@ -1204,7 +1204,7 @@ graph TB
FILE --> FILE_STORE
```
### 2. 服务治理架构
### 3.2 服务治理架构
```mermaid
graph TB
@ -1253,12 +1253,12 @@ graph TB
系统应用架构基于业务域划分,主要包括以下核心应用模块:
### 3.1 统一平台
### 3.3 统一平台
- 单点登录:统一认证入口,支持多种登录方式
- 系统管理:组织机构、员工管理、角色权限管理、菜单配置等
- 流程节点提醒:工作流节点到期和状态变更提醒
### 3.2 营收系统
### 3.4 营收系统
- 系统管理:水价管理、用户档案管理、更名过户管理等
- 抄表开账:册本管理、抄表录入、复核开账等
- 收费管理:柜台收费、特殊开账、柜台结账、批量缴费等
@ -1268,7 +1268,7 @@ graph TB
- 环卫系统:计费核定、计费退补、计费减免等
- 业务工单:业务清单、上报清单、稽查工单、移表工单等
### 3.3 客户服务
### 3.5 客户服务
- 微信、支付宝服务窗:账户绑定、用水查询、在线缴费等
- 历史账单:账单查询、用水分析、账单推送等
- 电子发票:发票申请、发票查询、发票下载等
@ -1276,40 +1276,40 @@ graph TB
- 账户流水:流水查询、明细下载、交易统计等
- 微网厅:用户注册、信息查询、业务办理等
### 3.4 表务系统
### 3.6 表务系统
- 表务工单:换表工单、移表工单、拆表工单、复装工单等
- 表务仓库:新表入库、水表检定、水表领用、水表出库等
- 水表参数与基础信息:水表厂家管理、水表型号管理等
- 物联网对接与数据同步:厂家设备信息管理、远程抄表数据同步等
### 3.5 报装管理
### 3.7 报装管理
- 报装流程:报装申请、方案设计、合同签订、施工管理等
- 一户一表管理:改造计划、改造实施、用户转换等
### 3.6 统计分析
### 3.8 统计分析
- 报表查询:标准报表、自定义报表、报表导出打印等
- 欠费查询:欠费情况统计、欠费用户明细、欠费分析等
- 缴费记录:缴费情况统计、缴费明细查询、缴费趋势分析等
- 用水分析:用水量统计、用水趋势分析、异常用水分析等
### 3.7 工程管理
### 3.9 工程管理
- 工程申请:工程立项、材料提交、前期勘察等
- 工程施工:施工计划、施工派工、施工记录等
- 工程验收:验收申请、验收检查、验收记录等
- 工程查询:工程进度查询、工程资料查询、工程统计等
### 3.8 抄表APP
### 3.10 抄表APP
- 首页功能:首页展示、个人信息、快捷查询等
- 抄表功能抄表任务、NFC抄表、扫码抄表、AI录入等
- 工单管理:问题上报、问题回填、代办工单、稽查工单等
### 3.9 接口服务
### 3.11 接口服务
- API市场API展示、API使用说明、API测试等
- API管理API申请、API调度看板、接口服务配置管理等
- 接口权限管理:授权管理、白名单管理、安全策略等
- 系统对外接口:查询接口、业务处理接口、状态同步接口等
### 3.10 系统配置
### 3.12 系统配置
- 水表参数:水表厂家、水表型号、水表量程等
- 地址参数:行政区划、地址编码、地址库等
- 价格体系:用水性质、水价标准、阶梯水价等
@ -1318,7 +1318,7 @@ graph TB
- 用户权限:菜单权限、功能权限、数据权限等
- 定时任务:任务配置、任务监控、任务日志等
## 4. 数据架构
## 四、数据架构
系统数据架构基于客户关系数据库为核心和基础,实现客户全生命周期管理。
@ -1470,7 +1470,7 @@ graph TB
- **负载均衡**:连接池级别的智能负载均衡
- **全量/增量备份**:支持热备份,最小备份粒度到事务级
## 5. 安全架构
## 五、安全架构
系统安全架构基于OpenGauss数据库的企业级安全特性满足等保三级要求和国产化安全标准
@ -1579,7 +1579,7 @@ graph TB
- **接口防护**防重放、防篡改、防SQL注入等安全措施
- **接口限流**基于IP、用户、应用的多维度限流策略
## 6. 部署架构
## 六、部署架构
系统采用集中部署的模式,基于集团私有云环境进行部署。
@ -1608,7 +1608,7 @@ graph TB
- 支持容器的自动扩缩容和故障转移
- 实现服务的灰度发布和版本控制
## 7. 接口架构
## 七、接口架构
系统提供标准化的接口,实现与外部系统的集成和数据交换。