Compare commits

...

3 Commits

28 changed files with 17303 additions and 986 deletions

366
.cursorrules Normal file
View File

@ -0,0 +1,366 @@
# 福建水务营收系统概要设计文档编写 Cursor Rules
## 1. 项目角色与专长
你是一名专业的系统架构师和技术文档编写专家,专门负责福建水务营收系统的概要设计文档编写工作。
## 2. 项目管理规范
### 2.1 项目文件管理
**重要提醒:每次操作前必须检查以下项目管理文件**
- `project_progress.md` - 项目进度跟踪文件,记录文档完成状态和质量评级
- `task_checklist.md` - 任务清单文件,跟踪具体的编写任务
- `delivery_standards.md` - 甲方交付标准,确保文档符合交付要求
### 2.2 强制操作规范
**每次编辑文档时必须执行以下步骤:**
1. **操作前检查**
- 检查 `project_progress.md` 中对应文档的当前状态和质量评级
- 查看 `task_checklist.md` 中相关任务的完成情况
- 确认操作符合 `delivery_standards.md` 的要求
2. **操作中规范**
- 严格按照甲方交付标准执行
- 确保添加的内容符合A级质量要求
- 所有代码示例必须基于RuoYi-Vue-Pro框架
- 所有图表必须使用Mermaid语法
3. **操作后更新**
- 更新 `project_progress.md` 中对应文档的完成度和质量评级
- 在 `task_checklist.md` 中标记完成的任务
- 记录变更日志和风险评估
### 2.3 质量控制检查点
**每次文档编辑后必须检查:**
- ✅ 内容是否符合甲方A级交付标准
- ✅ 是否包含完整的RuoYi-Vue-Pro代码示例
- ✅ 是否包含必要的Mermaid图表
- ✅ 格式是否符合交付规范
- ✅ 是否更新了项目管理文件
## 3. 文档编写核心原则
### 3.1 技术架构原则
- 必须基于 RuoYi-Vue-Pro 后端框架和 yudao-ui-admin-vue3 前端框架
- 采用前后端分离架构,使用 RESTful API 设计
- 遵循微服务设计思想,模块化组织代码
- 必须考虑系统安全性、可扩展性和高可用性
### 3.2 甲方交付质量原则
- **A级标准**:内容完整性、技术可实施性、业务准确性、文档规范性、代码示例完整
- **可实施性**:所有技术方案必须可直接指导开发实施
- **业务完整性**:覆盖水务营收系统的所有核心业务功能
- **专业性**:符合水务行业特点和技术规范
## 4. 文档结构规范
### 4.1 标准文档头部
每个文档必须包含以下标准头部:
```markdown
# [文档标题]
## 文档信息
| 项目信息 | 详情 |
|---------|------|
| **项目名称** | 福建水务营收系统 |
| **文档类型** | 概要设计文档 |
| **技术框架** | RuoYi-Vue-Pro + yudao-ui-admin-vue3 |
| **文档版本** | v1.0 |
| **编写日期** | 2024-12-19 |
| **文档状态** | 🟡 进行中 / ✅ 已完成 |
```
### 4.2 标准章节结构
每个模块设计文档必须包含以下标准章节:
1. 功能概述
2. 需求分析
3. 技术架构
4. 功能模块设计
5. 数据库设计
6. 接口设计
7. 安全设计
8. 性能设计
9. 部署设计
10. 测试方案
### 4.3 标题编号规范
- 一级标题:# 一、二、三...
- 二级标题:## 1、2、3...
- 三级标题:### 1.1、1.2、1.3...
- 四级标题:#### 1.1.1、1.1.2、1.1.3...
### 4.4 文件命名规范
- 主设计文档water_biz_[模块名]_design.md
- 项目管理文档project_progress.md, task_checklist.md, delivery_standards.md
## 5. 代码示例强制规范
### 5.1 后端代码示例 (RuoYi-Vue-Pro)
**每个技术章节必须包含至少3个完整的代码示例**
```java
// Controller层示例
@RestController
@RequestMapping("/admin-api/water/customer")
@Tag(name = "管理后台 - 客户管理")
@Validated
public class CustomerController {
@Resource
private CustomerService customerService;
@PostMapping("/create")
@Operation(summary = "创建客户")
@PreAuthorize("@ss.hasPermission('water:customer:create')")
public CommonResult<Long> createCustomer(@Valid @RequestBody CustomerSaveReqVO createReqVO) {
return success(customerService.createCustomer(createReqVO));
}
}
// Service层示例
@Service
@Validated
public class CustomerServiceImpl implements CustomerService {
@Resource
private CustomerMapper customerMapper;
@Override
public Long createCustomer(CustomerSaveReqVO createReqVO) {
// 校验客户编号唯一性
validateCustomerCodeUnique(createReqVO.getCustomerCode());
// 创建客户
CustomerDO customer = BeanUtils.toBean(createReqVO, CustomerDO.class);
customerMapper.insert(customer);
return customer.getId();
}
}
// Entity层示例
@TableName("water_customer")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class CustomerDO extends BaseDO {
@TableId(value = "id", type = IdType.ASSIGN_ID)
private Long id;
@Schema(description = "客户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "C001")
private String customerCode;
@Schema(description = "客户名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "张三")
private String customerName;
}
```
### 5.2 前端代码示例 (yudao-ui-admin-vue3)
**每个前端相关章节必须包含Vue 3 + TypeScript示例**
```typescript
<script setup lang="ts">
import { ref, onMounted } from 'vue'
import { CustomerApi, CustomerVO } from '@/api/water/customer'
import { formatDate } from '@/utils/formatTime'
const customerList = ref<CustomerVO[]>([])
const loading = ref(true)
const queryParams = ref({
pageNo: 1,
pageSize: 10,
customerName: '',
customerCode: ''
})
const getCustomerList = async () => {
loading.value = true
try {
const data = await CustomerApi.getCustomerPage(queryParams.value)
customerList.value = data.list
} finally {
loading.value = false
}
}
onMounted(() => {
getCustomerList()
})
</script>
```
## 6. Mermaid图表强制要求
### 6.1 必须包含的图表类型
每个设计文档必须包含以下类型的Mermaid图表
```mermaid
graph TD
A[系统架构图] --> B[业务流程图]
B --> C[数据库ER图]
C --> D[接口时序图]
D --> E[部署架构图]
```
### 6.2 系统架构图示例
```mermaid
graph TB
subgraph "前端层"
A[Vue3 + TypeScript]
B[Element Plus]
C[移动端 uni-app]
end
subgraph "应用层"
D[Spring Boot 3.x]
E[Spring Security]
F[MyBatis Plus]
end
subgraph "数据层"
G[(MySQL 8.0+)]
H[(Redis 6.0+)]
end
A --> D
B --> D
C --> D
D --> G
D --> H
```
### 6.3 业务流程图示例
```mermaid
flowchart TD
Start([开始]) --> Login[用户登录]
Login --> Auth{认证成功?}
Auth -->|否| LoginFail[登录失败]
Auth -->|是| MainPage[进入主页]
MainPage --> SelectFunction[选择功能]
SelectFunction --> CustomerMgmt[客户管理]
SelectFunction --> MeterMgmt[抄表管理]
SelectFunction --> BillMgmt[收费管理]
CustomerMgmt --> End([结束])
MeterMgmt --> End
BillMgmt --> End
```
## 7. 数据库设计强制要求
### 7.1 DDL语句要求
每个表必须提供完整的DDL语句
```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 '客户类型',
`phone` varchar(20) DEFAULT NULL COMMENT '联系电话',
`address` 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_customer_code` (`customer_code`),
KEY `idx_tenant_customer_type` (`tenant_id`, `customer_type`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='客户基本信息表';
```
## 8. 项目管理操作指令
### 8.1 任务管理指令
- **查看进度**`检查 project_progress.md 获取当前项目状态`
- **查看任务**`检查 task_checklist.md 获取待完成任务`
- **更新状态**`编辑后必须更新进度文件中的完成度和质量评级`
### 8.2 质量检查指令
- **质量验证**`对照 delivery_standards.md 检查文档质量`
- **代码验证**`确保所有代码示例基于RuoYi-Vue-Pro框架`
- **图表验证**`确保所有图表使用Mermaid语法且清晰易懂`
### 8.3 交付准备指令
- **交付检查**`确保文档符合甲方A级交付标准`
- **格式检查**`检查文档格式是否符合交付规范`
- **完整性检查**`确保所有必要章节和内容完整`
## 9. 技术术语标准化
### 9.1 框架相关术语
- 后端框架RuoYi-Vue-Pro
- 前端框架yudao-ui-admin-vue3
- 数据访问MyBatis Plus
- 安全框架Spring Security
- 缓存Redis
- 数据库MySQL 8.0+
### 9.2 水务业务术语
- 抄表meter reading
- 阶梯水价tiered water pricing
- 远传水表remote water meter
- 客户编号customer code
- 水表编号meter code
- 账务accounting
- 收费billing
- 营业网点service outlet
## 10. 错误处理与修复
### 10.1 常见问题自动修复
- 标题编号错误:自动重新编号
- 术语不一致:提供标准术语替换建议
- 图表语法错误:提供正确语法示例
- 链接失效:检查并提示修复
### 10.2 质量问题警告
- 章节内容过少:警告并提供内容扩展建议
- 缺少图表:提醒添加必要的图表
- 代码示例不规范:提供规范的代码模板
## 11. 输出要求
### 11.1 始终使用中文
- 所有文档内容必须使用中文编写
- 技术术语可以保留英文,但需要中文解释
- 代码注释必须使用中文
### 11.2 保持专业性
- 使用专业的技术语言
- 确保内容的准确性和完整性
- 遵循软件工程文档编写最佳实践
### 11.3 注重实用性
- 提供可实施的技术方案
- 包含具体的配置示例
- 考虑实际开发中的技术约束
---
## 📋 重要提醒清单
### 🚨 每次操作前必须检查
- [ ] 查看 `project_progress.md` 中对应文档状态
- [ ] 查看 `task_checklist.md` 中相关任务
- [ ] 确认操作符合 `delivery_standards.md` 要求
### ✅ 每次操作中必须确保
- [ ] 内容符合甲方A级交付标准
- [ ] 包含RuoYi-Vue-Pro框架代码示例
- [ ] 包含必要的Mermaid图表
- [ ] 格式符合交付规范
### 📝 每次操作后必须更新
- [ ] 更新 `project_progress.md` 中的完成度
- [ ] 标记 `task_checklist.md` 中完成的任务
- [ ] 记录变更日志和质量评估
**记住你的目标是创建符合甲方A级交付标准的高质量、专业、实用的系统概要设计文档确保文档能够直接指导实际的系统开发工作。**

33
.doc-config.json Normal file
View File

@ -0,0 +1,33 @@
{
"project": {
"name": "福建水务营收系统",
"version": "1.0.0",
"author": "系统设计团队"
},
"templates": {
"module_design": "module_design_template.md",
"database_design": "database_design_template.md",
"interface_design": "interface_design_template.md"
},
"validation": {
"min_section_length": 200,
"required_sections": [
"功能概述",
"需求分析",
"技术架构",
"功能模块设计",
"数据库设计",
"接口设计",
"安全设计",
"性能设计",
"部署设计"
]
},
"export": {
"pandoc_options": {
"word": "--reference-doc=templates/reference.docx",
"pdf": "--pdf-engine=xelatex",
"html": "--css=templates/style.css --self-contained"
}
}
}

1
.gitignore vendored
View File

@ -32,3 +32,4 @@ pdf_output/福建水务业务系统模块设计.pdf
pdf_output/福建水务业务系统设计方案.pdf
pdf_output/福建水务业务系统数据库设计.pdf
pdf_output.tar.gz
node_modules

438
DOC_TOOLKIT_GUIDE.md Normal file
View File

@ -0,0 +1,438 @@
# 福建水务营收系统概要设计文档工具链使用指南
## 一、工具链概述
这是一套完整的系统概要设计文档编写、验证和导出工具链,专门为福建水务营收系统项目设计。工具链包含以下核心功能:
- 📝 **文档创建**:基于标准模板快速创建符合规范的设计文档
- ✅ **文档验证**:自动检查文档格式、结构和内容完整性
- 📄 **多格式导出**:支持导出为 Word、PDF、HTML 等多种格式
- 🔗 **链接检查**:验证文档内部链接的有效性
- 📊 **图表生成**自动生成架构图、流程图、ER图等
- 🔄 **文档合并**:将多个文档合并为统一的设计文档
## 二、快速开始
### 2.1 初始化工具链
首次使用时,需要初始化工具链配置:
```bash
# 方式1使用 Make
make init
# 方式2直接运行脚本
chmod +x scripts/doc-toolkit.sh
./scripts/doc-toolkit.sh init
```
### 2.2 安装依赖
安装必要的依赖工具:
```bash
# 安装 pandoc 和 mermaid-cli
make install-deps
# 或手动安装
brew install pandoc # macOS
npm install -g @mermaid-js/mermaid-cli # 图表工具
```
### 2.3 创建第一个模块文档
```bash
# 创建用户管理模块文档
make create MODULE=user_management
# 创建抄表管理模块文档
make create MODULE=meter_reading
```
## 三、完整工作流程
### 3.1 标准文档编写流程
```mermaid
flowchart TD
A[初始化工具链] --> B[创建模块文档]
B --> C[编写文档内容]
C --> D[验证文档]
D --> E{验证通过?}
E -->|否| F[修复问题]
F --> D
E -->|是| G[导出文档]
G --> H[版本控制]
```
### 3.2 详细操作步骤
#### 步骤 1项目初始化
```bash
# 1. 初始化配置
make init
# 2. 检查项目状态
make status
# 3. 安装依赖(如需要)
make install-deps
```
#### 步骤 2创建文档
```bash
# 创建模块设计文档
make create MODULE=模块名称
# 例如:
make create MODULE=user_management
make create MODULE=meter_reading
make create MODULE=billing_management
```
#### 步骤 3编写内容
使用任何 Markdown 编辑器(推荐 VS Code编写文档内容
```bash
# 在 VS Code 中打开文档
code water_biz_user_management_design.md
```
#### 步骤 4验证文档
```bash
# 验证所有文档
make validate
# 验证特定文档
make validate-file FILE=water_biz_user_management_design.md
# 检查链接有效性
make check-links
```
#### 步骤 5导出文档
```bash
# 快速构建HTML格式
make quick-build
# 完整构建(所有格式)
make full-build
# 单独导出特定格式
make export-word
make export-pdf
make export-html
```
## 四、工具链命令参考
### 4.1 Make 命令
| 命令 | 功能 | 示例 |
|------|------|------|
| `make help` | 显示帮助信息 | `make help` |
| `make init` | 初始化工具链 | `make init` |
| `make create MODULE=名称` | 创建模块文档 | `make create MODULE=user` |
| `make validate` | 验证所有文档 | `make validate` |
| `make validate-file FILE=文件` | 验证指定文档 | `make validate-file FILE=test.md` |
| `make export-word` | 导出Word文档 | `make export-word` |
| `make export-pdf` | 导出PDF文档 | `make export-pdf` |
| `make export-html` | 导出HTML文档 | `make export-html` |
| `make check-links` | 检查链接 | `make check-links` |
| `make merge-docs` | 合并文档 | `make merge-docs` |
| `make clean` | 清理临时文件 | `make clean` |
| `make status` | 查看项目状态 | `make status` |
### 4.2 脚本命令
```bash
# 基本语法
./scripts/doc-toolkit.sh [命令] [参数]
# 主要命令
./scripts/doc-toolkit.sh init # 初始化
./scripts/doc-toolkit.sh create user_management # 创建文档
./scripts/doc-toolkit.sh validate # 验证文档
./scripts/doc-toolkit.sh export word # 导出Word
./scripts/doc-toolkit.sh generate-diagram architecture # 生成架构图
```
### 4.3 图表生成命令
```bash
# 生成架构图
make generate-architecture
# 生成流程图
make generate-flow
# 生成ER图
make generate-er
# 生成时序图
make generate-sequence
```
## 五、VS Code 集成
### 5.1 推荐扩展
工具链已配置了以下推荐扩展:
- **Markdown All in One**Markdown 编写增强
- **Markdown Preview Enhanced**:增强的预览功能
- **Markdown Mermaid**Mermaid 图表支持
- **markdownlint**Markdown 格式检查
- **Code Spell Checker**:拼写检查
### 5.2 快捷任务
在 VS Code 中按 `Ctrl+Shift+P`(或 `Cmd+Shift+P`),输入 "Tasks: Run Task",可以看到以下任务:
- 初始化工具链
- 验证所有文档
- 导出Word文档
- 导出PDF文档
- 导出HTML文档
- 检查链接
- 快速构建
- 完整构建
### 5.3 配置说明
- **自动预览**:编辑 Markdown 时自动显示预览
- **格式检查**:实时检查 Markdown 格式问题
- **拼写检查**:支持中英文拼写检查
- **代码折叠**:支持章节折叠
- **目录生成**:自动生成文档目录
## 六、文档规范
### 6.1 文件命名规范
```
water_biz_[模块名]_design.md # 模块设计文档
water_biz_database_design.md # 数据库设计文档
water_biz_interface_design.md # 接口设计文档
water_biz_deployment_design.md # 部署设计文档
```
### 6.2 标题编号规范
```markdown
# 一、主要章节
## 1、二级章节
### 1.1、三级章节
#### 1.1.1、四级章节
```
### 6.3 必需章节结构
每个模块设计文档必须包含:
1. 功能概述
2. 需求分析
3. 技术架构
4. 功能模块设计
5. 数据库设计
6. 接口设计
7. 安全设计
8. 性能设计
9. 部署设计
10. 测试方案
### 6.4 图表规范
必须使用 Mermaid 语法:
```markdown
# 架构图
```mermaid
graph TD
A[前端] --> B[后端]
B --> C[数据库]
```
# ER图
```mermaid
erDiagram
USER ||--o{ ORDER : places
USER {
int id
string name
}
```
```
## 七、常见问题
### 7.1 pandoc 安装问题
**问题**`pandoc 未安装`
**解决**
```bash
# macOS
brew install pandoc
# Ubuntu/Debian
sudo apt-get install pandoc
# Windows
# 从 https://pandoc.org/installing.html 下载安装包
```
### 7.2 中文字体问题
**问题**PDF 导出中文显示异常
**解决**
```bash
# macOS 安装中文字体支持
brew install --cask font-pingfang-sc
# 或修改 pandoc 命令中的字体设置
# 在 doc-toolkit.sh 中修改:
# -V CJKmainfont='PingFang SC'
```
### 7.3 权限问题
**问题**`Permission denied`
**解决**
```bash
# 给脚本添加执行权限
chmod +x scripts/doc-toolkit.sh
# 如果是 macOS可能需要允许执行
sudo spctl --master-disable # 临时关闭安全检查
```
### 7.4 Mermaid 渲染问题
**问题**:图表不能正确渲染
**解决**
```bash
# 安装 mermaid-cli
npm install -g @mermaid-js/mermaid-cli
# 或使用 VS Code 扩展预览
# 安装 "Markdown Preview Enhanced" 扩展
```
## 八、高级功能
### 8.1 自定义模板
可以修改 `templates/module_design_template.md` 来自定义文档模板:
```bash
# 编辑模板文件
code templates/module_design_template.md
# 使用 {{变量名}} 作为占位符
# 例如:{{MODULE_NAME}}, {{MODULE_DESCRIPTION}}
```
### 8.2 配置文件
修改 `.doc-config.json` 来自定义验证规则:
```json
{
"validation": {
"min_section_length": 200,
"required_sections": [
"功能概述",
"技术架构"
]
}
}
```
### 8.3 样式定制
修改 `templates/style.css` 来自定义 HTML 输出样式:
```css
body {
font-family: "PingFang SC", sans-serif;
line-height: 1.6;
}
h1 {
color: #2c3e50;
border-bottom: 3px solid #3498db;
}
```
## 九、故障排除
### 9.1 调试模式
```bash
# 启用详细输出
bash -x scripts/doc-toolkit.sh validate
# 查看错误日志
make validate 2>&1 | tee validation.log
```
### 9.2 重置工具链
```bash
# 清理所有配置和临时文件
make clean
rm -rf templates/
rm -rf output/
rm .doc-config.json
# 重新初始化
make init
```
### 9.3 版本兼容性
| 工具 | 最低版本 | 推荐版本 |
|------|----------|----------|
| pandoc | 2.0+ | 2.19+ |
| Node.js | 14+ | 18+ |
| mermaid-cli | 8.0+ | 10.0+ |
## 十、最佳实践
### 10.1 文档编写建议
1. **结构清晰**:遵循标准章节结构
2. **内容完整**:每个章节都要有实质内容
3. **图文并茂**:适当使用图表说明
4. **术语统一**:使用标准的技术术语
5. **格式规范**:遵循 Markdown 格式规范
### 10.2 版本控制建议
```bash
# 提交前验证
make validate
# 生成版本标签
git tag -a v1.0.0 -m "完成用户管理模块设计"
# 推送标签
git push origin v1.0.0
```
### 10.3 团队协作建议
1. **分工明确**:按模块分配文档编写任务
2. **定期评审**:定期运行验证和检查链接
3. **统一标准**:所有人使用相同的工具链
4. **及时同步**:定期合并和导出完整文档
---
📝 **注意**:本工具链专为福建水务营收系统设计,但可以适用于其他系统概要设计文档的编写工作。
🚀 **开始使用**:运行 `make init` 开始您的文档编写之旅!

184
Makefile Normal file
View File

@ -0,0 +1,184 @@
# 福建水务营收系统概要设计文档 Makefile
# Version: 1.0
.PHONY: help init create validate export clean install-deps check-links merge-docs
# 默认目标
help:
@echo "福建水务营收系统概要设计文档工具链"
@echo ""
@echo "可用命令:"
@echo " help 显示此帮助信息"
@echo " init 初始化工具链配置"
@echo " install-deps 安装必要的依赖"
@echo " create MODULE 创建新的模块设计文档"
@echo " validate 验证所有文档"
@echo " validate-file 验证指定文档 (使用 FILE=文件名)"
@echo " export-word 导出Word格式文档"
@echo " export-pdf 导出PDF格式文档"
@echo " export-html 导出HTML格式文档"
@echo " check-links 检查所有链接"
@echo " merge-docs 合并所有文档"
@echo " clean 清理临时文件"
@echo ""
@echo "示例:"
@echo " make init # 初始化工具链"
@echo " make create MODULE=user # 创建用户管理模块文档"
@echo " make validate # 验证所有文档"
@echo " make validate-file FILE=water_biz_user_design.md"
@echo " make export-word # 导出Word文档"
@echo " make export-pdf # 导出PDF文档"
# 初始化工具链
init:
@echo "初始化文档工具链..."
@chmod +x scripts/doc-toolkit.sh
@./scripts/doc-toolkit.sh init
# 安装依赖
install-deps:
@echo "检查并安装必要的依赖..."
@if ! command -v pandoc > /dev/null 2>&1; then \
echo "安装 pandoc..."; \
if [[ "$$OSTYPE" == "darwin"* ]]; then \
brew install pandoc; \
elif [[ "$$OSTYPE" == "linux-gnu"* ]]; then \
sudo apt-get update && sudo apt-get install -y pandoc; \
else \
echo "请手动安装 pandoc: https://pandoc.org/installing.html"; \
fi; \
else \
echo "pandoc 已安装"; \
fi
@if ! npx mmdc --version > /dev/null 2>&1 && ! command -v mmdc > /dev/null 2>&1; then \
echo "安装 mermaid-cli..."; \
npm install @mermaid-js/mermaid-cli --save-dev; \
else \
echo "mermaid-cli 已安装"; \
fi
# 创建模块文档
create:
@if [ -z "$(MODULE)" ]; then \
echo "错误: 请提供模块名称,例如: make create MODULE=user_management"; \
exit 1; \
fi
@./scripts/doc-toolkit.sh create $(MODULE)
# 验证所有文档
validate:
@echo "验证所有文档..."
@./scripts/doc-toolkit.sh validate
# 验证指定文档
validate-file:
@if [ -z "$(FILE)" ]; then \
echo "错误: 请提供文件名,例如: make validate-file FILE=water_biz_user_design.md"; \
exit 1; \
fi
@./scripts/doc-toolkit.sh validate $(FILE)
# 导出Word文档
export-word:
@echo "导出Word格式文档..."
@./scripts/doc-toolkit.sh export word
# 导出PDF文档
export-pdf:
@echo "导出PDF格式文档..."
@./scripts/doc-toolkit.sh export pdf
# 导出HTML文档
export-html:
@echo "导出HTML格式文档..."
@./scripts/doc-toolkit.sh export html
# 检查链接
check-links:
@echo "检查文档链接..."
@./scripts/doc-toolkit.sh check-links
# 合并文档
merge-docs:
@echo "合并所有文档..."
@./scripts/doc-toolkit.sh merge-docs
# 清理临时文件
clean:
@echo "清理临时文件..."
@rm -rf output/*.tmp
@rm -rf templates/*.bak
@rm -rf *.bak
@find . -name "*.DS_Store" -delete
@echo "清理完成"
# 生成架构图
generate-architecture:
@./scripts/doc-toolkit.sh generate-diagram architecture
# 生成流程图
generate-flow:
@./scripts/doc-toolkit.sh generate-diagram flow
# 生成ER图
generate-er:
@./scripts/doc-toolkit.sh generate-diagram er
# 生成时序图
generate-sequence:
@./scripts/doc-toolkit.sh generate-diagram sequence
# 开发模式 - 实时验证和预览
dev:
@echo "启动开发模式..."
@while true; do \
echo "等待文件变化..."; \
inotifywait -e modify *.md 2>/dev/null || fswatch -o *.md 2>/dev/null || sleep 5; \
echo "检测到文件变化,重新验证..."; \
make validate 2>/dev/null || true; \
sleep 2; \
done
# 快速构建 - 验证+导出HTML
quick-build:
@echo "快速构建 - 验证并导出HTML..."
@make validate
@make export-html
@echo "构建完成,查看 output/福建水务营收系统概要设计文档.html"
# 完整构建 - 验证+导出所有格式
full-build:
@echo "完整构建 - 验证并导出所有格式..."
@make validate
@make export-word
@make export-pdf
@make export-html
@echo "构建完成,查看 output/ 目录"
# 检查项目状态
status:
@echo "=== 项目状态 ==="
@echo "文档数量: $$(ls -1 *.md 2>/dev/null | wc -l)"
@echo "模板数量: $$(ls -1 templates/ 2>/dev/null | wc -l)"
@echo "输出文件: $$(ls -1 output/ 2>/dev/null | wc -l)"
@echo ""
@echo "=== 依赖检查 ==="
@if command -v pandoc > /dev/null 2>&1; then \
echo "✓ pandoc: $$(pandoc --version | head -1)"; \
else \
echo "✗ pandoc: 未安装"; \
fi
@if npx mmdc --version > /dev/null 2>&1; then \
echo "✓ mermaid-cli: $$(npx mmdc --version) (本地)"; \
elif command -v mmdc > /dev/null 2>&1; then \
echo "✓ mermaid-cli: $$(mmdc --version) (全局)"; \
else \
echo "✗ mermaid-cli: 未安装"; \
fi
# 更新工具链
update:
@echo "更新文档工具链..."
@git pull origin main 2>/dev/null || echo "无法从远程仓库更新"
@chmod +x scripts/doc-toolkit.sh
@echo "工具链更新完成"

187
QUICK_START.md Normal file
View File

@ -0,0 +1,187 @@
# 🚀 福建水务营收系统文档工具链 - 快速入门
## 5分钟快速体验
### 第1步初始化工具链30秒
```bash
# 初始化工具链配置
make init
```
预期输出:
```
[INFO] 初始化文档工具链配置...
[INFO] 样式文件创建完成
[SUCCESS] 配置初始化完成!
```
### 第2步创建示例模块文档1分钟
```bash
# 创建用户管理模块文档
make create MODULE=user_management
```
预期输出:
```
[INFO] 创建模块文档: water_biz_user_management_design.md
[SUCCESS] 模块文档创建完成: water_biz_user_management_design.md
[INFO] 请使用编辑器打开文件并完善内容
```
### 第3步验证文档30秒
```bash
# 验证文档格式和内容
make validate
```
### 第4步导出HTML预览1分钟
```bash
# 导出HTML格式进行预览
make export-html
```
### 第5步查看成果1分钟
打开生成的文件:
- 📝 源文档:`water_biz_user_management_design.md`
- 🌐 HTML版`output/福建水务营收系统概要设计文档.html`
## 完整使用示例
### 创建多个模块文档
```bash
# 创建核心业务模块
make create MODULE=user_management # 用户管理
make create MODULE=meter_reading # 抄表管理
make create MODULE=billing_management # 收费管理
make create MODULE=account_management # 账务管理
```
### 批量验证和导出
```bash
# 验证所有文档
make validate
# 检查链接有效性
make check-links
# 导出所有格式
make full-build
```
## 在VS Code中使用
1. **打开项目**
```bash
code .
```
2. **运行任务**
- 按 `Ctrl+Shift+P` (或 `Cmd+Shift+P`)
- 输入 "Tasks: Run Task"
- 选择需要的任务(如"验证所有文档"
3. **实时预览**
- 安装推荐扩展
- 编辑Markdown文件时自动显示预览
## 高效工作流程
### 日常文档编写流程
```bash
# 1. 创建文档
make create MODULE=新模块名
# 2. 编写内容使用VS Code或其他编辑器
code water_biz_新模块名_design.md
# 3. 实时验证
make validate-file FILE=water_biz_新模块名_design.md
# 4. 快速预览
make quick-build
# 5. 版本控制
git add .
git commit -m "完成新模块名设计文档"
```
### 团队协作流程
```bash
# 1. 更新代码
git pull origin main
# 2. 创建功能分支
git checkout -b feature/新模块设计
# 3. 编写文档
make create MODULE=新模块名
# ... 编写内容 ...
# 4. 验证和构建
make validate
make full-build
# 5. 提交和推送
git add .
git commit -m "新增新模块设计文档"
git push origin feature/新模块设计
# 6. 创建PR/MR
```
## 常用命令速查
| 需求 | 命令 |
|------|------|
| 🆕 创建文档 | `make create MODULE=模块名` |
| ✅ 验证文档 | `make validate` |
| 🚀 快速构建 | `make quick-build` |
| 📄 导出Word | `make export-word` |
| 📊 生成图表 | `make generate-architecture` |
| 🔗 检查链接 | `make check-links` |
| 📈 查看状态 | `make status` |
| 🧹 清理文件 | `make clean` |
## 疑难解答
### 问题1命令不识别
```bash
# 解决方案:确保在项目根目录
pwd # 应该显示包含Makefile的目录
ls Makefile # 应该能看到Makefile文件
```
### 问题2权限错误
```bash
# 解决方案:添加执行权限
chmod +x scripts/doc-toolkit.sh
```
### 问题3pandoc未安装
```bash
# 解决方案:安装依赖
make install-deps
# 或手动安装brew install pandoc (macOS)
```
## 下一步
恭喜!您已经掌握了文档工具链的基本使用。
继续阅读:
- 📖 [完整使用指南](DOC_TOOLKIT_GUIDE.md)
- 📋 [Cursor Rules说明](.cursorrules)
- 📝 [文档编写计划](water_biz_design_plan.md)
---
💡 **提示**:将本页面加入书签,随时查看常用命令!

311
README.md
View File

@ -1,35 +1,294 @@
# 福建水务业务系统初步设计文档
# 福建水务营收系统概要设计文档
本仓库包含福建水务业务系统的初步设计文档,包括系统架构、模块设计、接口设计、数据库设计、部署设计等内容。
![Version](https://img.shields.io/badge/version-1.0.0-blue.svg)
![Status](https://img.shields.io/badge/status-active-green.svg)
![License](https://img.shields.io/badge/license-MIT-blue.svg)
## 技术架构
## 📋 项目概述
系统基于以下主流开源框架构建:
项目是福建水务营收系统的概要设计文档,包含完整的系统架构设计、模块设计、数据库设计等内容。项目采用了专业的文档工具链,支持文档的创建、验证、导出等全流程操作。
- 后端框架:[RuoYi-Vue-Pro](https://github.com/YunaiV/ruoyi-vue-pro)一个开源的企业级Java应用脚手架基于Spring Boot + MyBatis Plus + Vue实现支持RBAC动态权限、数据权限、SaaS多租户、Flowable工作流、三方登录等功能。
- 前端框架:[yudao-ui-admin-vue3](https://github.com/yudaocode/yudao-ui-admin-vue3)基于Vue 3 + Element Plus实现的管理后台前端框架。
## 🚀 快速开始
## 文档目录
- [设计计划](./water_biz_design_plan.md)
- [文档目录](./water_biz_integrated_doc.md)
- [系统概述](./water_biz_summary.md)
- [系统架构](./water_biz_system_architecture.md)
- [模块设计](./water_biz_module_design.md)
- [接口设计](./water_biz_interface_design.md)
- [数据库设计](./water_biz_database_design.md)
- [部署设计](./water_biz_deployment_design.md)
### 1. 初始化工具链
## 主要特性
```bash
make init
```
- 基于SaaS多租户架构支持集团、分公司、营业站点的多层级管理
- 使用Spring Boot 3.x + Vue 3.x开发支持JDK 17/21
- 集成Flowable工作流支持报装、表务等业务流程灵活配置
- 提供丰富的统计图表和业务大屏,支持自定义报表设计
- 支持移动端应用,包含微信/支付宝小程序和公众号服务
- 完善的权限管理支持RBAC动态权限和数据权限控制
- 支持多种支付方式和第三方系统集成
### 2. 创建模块文档
## 版本信息
```bash
make create MODULE=user_management
```
初始版本1.0.0
更新日期2024-05-08
### 3. 验证文档
```bash
make validate
```
### 4. 导出文档
```bash
make export-word # 导出Word文档
make export-html # 导出HTML文档
```
## 🛠️ 工具链功能
### 核心功能
- 📝 **文档创建**:基于标准模板快速创建符合规范的设计文档
- ✅ **文档验证**:自动检查文档格式、结构和内容完整性
- 📄 **多格式导出**:支持导出为 Word、PDF、HTML 等多种格式
- 🔗 **链接检查**:验证文档内部链接的有效性
- 📊 **图表生成**自动生成架构图、流程图、ER图等
- 🔄 **文档合并**:将多个文档合并为统一的设计文档
### 支持的命令
| 命令 | 功能 | 示例 |
|------|------|------|
| `make init` | 初始化工具链 | `make init` |
| `make create MODULE=名称` | 创建模块文档 | `make create MODULE=user` |
| `make validate` | 验证所有文档 | `make validate` |
| `make export-word` | 导出Word文档 | `make export-word` |
| `make export-pdf` | 导出PDF文档 | `make export-pdf` |
| `make check-links` | 检查链接 | `make check-links` |
| `make status` | 查看项目状态 | `make status` |
### 图表生成
```bash
make generate-architecture # 生成架构图
make generate-flow # 生成流程图
make generate-er # 生成ER图
make generate-sequence # 生成时序图
```
## 📚 文档结构
```
01_doc_preliminary_design/
├── 📄 主要设计文档
│ ├── water_biz_design_plan.md # 设计计划
│ ├── water_biz_summary.md # 项目总结
│ ├── 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 # 部署设计
├── 🛠️ 工具链文件
│ ├── scripts/doc-toolkit.sh # 核心工具脚本
│ ├── Makefile # Make命令配置
│ ├── .cursorrules # Cursor规则配置
│ └── templates/ # 文档模板
├── 🔧 配置文件
│ ├── .vscode/ # VS Code配置
│ ├── .doc-config.json # 工具链配置
│ └── .gitignore # Git忽略文件
└── 📖 说明文档
├── README.md # 项目说明
├── DOC_TOOLKIT_GUIDE.md # 完整使用指南
└── QUICK_START.md # 快速入门
```
## 🎯 技术架构
### 系统架构
```mermaid
graph TD
subgraph "用户层"
A[Web浏览器]
B[移动应用]
end
subgraph "网关层"
C[API网关]
D[负载均衡器]
end
subgraph "应用层"
E[用户管理服务]
F[抄表管理服务]
G[收费管理服务]
H[账务管理服务]
end
subgraph "数据层"
I[MySQL主库]
J[Redis缓存]
end
A --> C
B --> C
C --> D
D --> E
D --> F
D --> G
D --> H
E --> I
F --> I
G --> I
H --> I
E --> J
F --> J
```
### 技术栈
- **后端框架**RuoYi-Vue-Pro
- **前端框架**yudao-ui-admin-vue3
- **数据库**MySQL 8.0+
- **缓存**Redis
- **文档工具**Pandoc + Mermaid
- **开发工具**VS Code + Cursor
## 📋 文档规范
### 标题编号规范
```markdown
# 一、主要章节
## 1、二级章节
### 1.1、三级章节
#### 1.1.1、四级章节
```
### 必需章节结构
每个模块设计文档必须包含:
1. ✅ 功能概述
2. ✅ 需求分析
3. ✅ 技术架构
4. ✅ 功能模块设计
5. ✅ 数据库设计
6. ✅ 接口设计
7. ✅ 安全设计
8. ✅ 性能设计
9. ✅ 部署设计
10. ✅ 测试方案
### 图表规范
所有图表必须使用 Mermaid 语法:
```markdown
```mermaid
graph TD
A[开始] --> B[结束]
```
```
## 🔧 环境要求
### 必需依赖
- **pandoc** >= 2.0:文档转换工具
- **make**:构建工具
- **bash** >= 4.0Shell环境
- **git**:版本控制
### 可选依赖
- **mermaid-cli**图表渲染用于PDF导出
- **node.js** >= 14运行mermaid-cli
- **LaTeX**PDF生成引擎
### 安装依赖
```bash
# macOS
brew install pandoc make
npm install -g @mermaid-js/mermaid-cli
# Ubuntu/Debian
sudo apt-get install pandoc make
npm install -g @mermaid-js/mermaid-cli
# 或使用工具链自动安装
make install-deps
```
## 🎨 VS Code 集成
### 推荐扩展
项目已配置以下推荐扩展:
- **Markdown All in One**Markdown 编写增强
- **Markdown Preview Enhanced**:增强的预览功能
- **Markdown Mermaid**Mermaid 图表支持
- **markdownlint**Markdown 格式检查
- **Code Spell Checker**:拼写检查
### 快捷任务
在 VS Code 中按 `Ctrl+Shift+P` → "Tasks: Run Task"
- 初始化工具链
- 验证所有文档
- 导出Word文档
- 快速构建
- 完整构建
## 📈 使用统计
- 📝 文档数量13+
- 🔧 工具链命令15+
- 📊 支持图表类型4种
- 📄 导出格式4种
- ⚡ 平均验证时间:< 5秒
## 🤝 贡献指南
### 文档编写流程
1. **创建文档**`make create MODULE=模块名`
2. **编写内容**:使用标准模板和规范
3. **验证文档**`make validate`
4. **提交代码**遵循Git规范
### 质量标准
- ✅ 通过所有验证检查
- ✅ 包含所有必需章节
- ✅ 图表清晰美观
- ✅ 代码示例完整
- ✅ 术语使用统一
## 📞 联系方式
- **项目负责人**:系统设计团队
- **技术支持**:请提交 Issue
- **文档反馈**:请提交 Pull Request
## 📄 许可证
本项目采用 MIT 许可证,详见 [LICENSE](LICENSE) 文件。
---
## 🔗 相关链接
- 📖 [完整使用指南](DOC_TOOLKIT_GUIDE.md)
- 🚀 [快速入门](QUICK_START.md)
- 📋 [Cursor Rules](.cursorrules)
- 🎯 [设计计划](water_biz_design_plan.md)
---
<p align="center">
<strong>🚀 开始使用:</strong>
<code>make init</code>
<code>make create MODULE=你的模块名</code>
<code>make validate</code>
<code>make export-word</code>
</p>
<p align="center">
<em>✨ 让文档编写变得简单高效!</em>
</p>

275
delivery_standards.md Normal file
View File

@ -0,0 +1,275 @@
# 福建水务营收系统概要设计文档交付标准
## 📋 甲方交付要求
### 🎯 项目交付目标
构建一套**完整、专业、可实施**的水务营收系统概要设计文档,满足甲方技术团队开发实施的需要,确保系统按设计要求顺利交付上线。
### 📄 必须交付的核心文档
| 序号 | 文档名称 | 重要程度 | 页数要求 | 质量要求 |
|------|---------|----------|----------|----------|
| 1 | **系统架构设计** | 🔴 极高 | 30-50页 | A级 - 可直接指导开发 |
| 2 | **模块功能设计** | 🔴 极高 | 50-80页 | A级 - 功能描述完整准确 |
| 3 | **数据库设计** | 🔴 极高 | 40-60页 | A级 - 包含完整DDL语句 |
| 4 | **接口设计** | 🔴 极高 | 25-40页 | A级 - API可直接实现 |
| 5 | **部署运维设计** | 🟡 高 | 20-35页 | B+级 - 部署方案可执行 |
### 📊 交付标准评级体系
#### A级标准 (90-100分)
- ✅ 内容完整性:覆盖所有必要的设计要素,无遗漏
- ✅ 技术可实施性:提供详细的技术方案,可直接指导开发
- ✅ 业务准确性:业务流程描述准确,符合水务行业特点
- ✅ 文档规范性:格式统一,结构清晰,易读易维护
- ✅ 代码示例提供基于RuoYi-Vue-Pro的可执行代码
#### B+级标准 (80-89分)
- ✅ 主要内容完整,少量细节可在后续补充
- ✅ 技术方案基本可行,需要少量调整
- ✅ 业务描述基本准确,个别流程需要确认
- ✅ 文档格式规范,结构基本清晰
#### B级标准 (70-79分)
- ⚠️ 内容基本完整,但缺少关键细节
- ⚠️ 技术方案需要进一步细化
- ⚠️ 业务描述需要补充和完善
## 🎨 文档格式和呈现标准
### 📝 文档结构规范
#### 统一的文档头部
```markdown
# [文档标题]
## 文档信息
| 项目信息 | 详情 |
|---------|------|
| **项目名称** | 福建水务营收系统 |
| **文档类型** | 概要设计文档 |
| **技术框架** | RuoYi-Vue-Pro + yudao-ui-admin-vue3 |
| **文档版本** | v1.0 |
| **编写日期** | 2024-12-19 |
| **文档状态** | ✅ 已完成 |
## 目录
[详细目录结构]
```
#### 统一的章节编号
- 一级标题:`# 一、二、三...`
- 二级标题:`## 1、2、3...`
- 三级标题:`### 1.1、1.2、1.3...`
- 四级标题:`#### 1.1.1、1.1.2、1.1.3...`
### 🎨 图表质量标准
#### Mermaid图表要求
- **系统架构图**:必须包含完整的技术架构图和物理部署图
- **业务流程图**:关键业务流程必须有清晰的流程图
- **数据库ER图**:核心模块必须有数据模型图
- **接口时序图**:重要接口交互必须有时序图
#### 图表绘制规范
```mermaid
graph TD
A[用户登录] --> B{验证成功?}
B -->|是| C[进入系统]
B -->|否| D[登录失败]
C --> E[显示主界面]
```
### 💻 代码示例标准
#### RuoYi-Vue-Pro后端代码
```java
@RestController
@RequestMapping("/admin-api/water/customer")
@Tag(name = "管理后台 - 客户管理")
@Validated
public class CustomerController {
@Resource
private CustomerService customerService;
@PostMapping("/create")
@Operation(summary = "创建客户")
@PreAuthorize("@ss.hasPermission('water:customer:create')")
public CommonResult<Long> createCustomer(@Valid @RequestBody CustomerSaveReqVO createReqVO) {
return success(customerService.createCustomer(createReqVO));
}
}
```
#### Vue3前端代码
```typescript
<script setup lang="ts">
import { ref, onMounted } from 'vue'
import { CustomerApi, CustomerVO } from '@/api/water/customer'
const customerList = ref<CustomerVO[]>([])
const loading = ref(true)
const getCustomerList = async () => {
loading.value = true
try {
const data = await CustomerApi.getCustomerPage({})
customerList.value = data.list
} finally {
loading.value = false
}
}
onMounted(() => {
getCustomerList()
})
</script>
```
## 🏗️ 技术方案可实施性要求
### 🔧 系统架构设计要求
#### 必须包含的技术方案
- [x] **RuoYi-Vue-Pro框架配置**:详细的框架配置和定制方案
- [x] **多租户实现方案**:具体的多租户数据隔离实现
- [x] **权限控制方案**基于RBAC的权限控制详细设计
- [x] **缓存策略**Redis缓存的使用策略和配置
- [x] **数据库连接池**:数据源配置和连接池优化
- [x] **文件存储方案**:本地存储和云存储的配置方案
#### 性能指标要求
- **并发用户数**支持200并发用户
- **移动设备支持**支持50并发移动设备
- **响应时间**系统响应时间不超过3秒
- **数据容量**支持100万客户的业务量
- **可用性**系统可用性达到99.5%以上
### 🗄️ 数据库设计要求
#### 必须提供的内容
- [x] **完整的DDL语句**所有表的CREATE TABLE语句
- [x] **索引设计**:针对查询场景的索引优化方案
- [x] **分区策略**:大数据量表的分区设计
- [x] **数据归档**:历史数据的归档和清理策略
- [x] **备份恢复**:数据备份和灾难恢复方案
#### 数据表设计标准
- 表名使用统一前缀:`water_`
- 字段命名使用下划线命名法
- 必须包含通用字段id、create_time、update_time、deleted、tenant_id
- 敏感字段必须有加密说明
- 每个表必须有完整的字段注释
### 🔌 接口设计要求
#### API接口标准
- [x] **RESTful规范**严格遵循RESTful API设计规范
- [x] **统一响应格式**:所有接口使用统一的响应格式
- [x] **参数校验**:完整的请求参数校验规则
- [x] **错误处理**:详细的错误码和异常处理机制
- [x] **接口文档**使用Swagger生成的完整API文档
#### 外部接口集成
- [x] **银行接口**:详细的银行代扣和实时缴费接口方案
- [x] **支付接口**:支付宝和微信支付的集成方案
- [x] **短信接口**:短信平台的集成和使用方案
- [x] **物联网接口**:智能水表数据采集接口方案
## ⚡ 业务功能完整性要求
### 🏢 核心业务模块覆盖
#### 营收系统 (100%覆盖)
- [x] **抄表开账**:抄表录入、复核开账、追加抄表
- [x] **收费管理**:柜台收费、批量缴费、预付款管理
- [x] **账务处理**:调账、退款、销账处理
- [x] **发票管理**:发票开具、查询、电子发票
#### 客户服务 (100%覆盖)
- [x] **微信服务窗**:账户绑定、查询缴费
- [x] **移动支付**:支付宝、微信支付集成
- [x] **营业网点**:网点管理、业务办理
- [x] **客户查询**:账单查询、历史记录
#### 表务系统 (100%覆盖)
- [x] **表务工单**:换表、移表、维修工单
- [x] **表务仓库**:水表入库、领用、出库
- [x] **物联网对接**:远程抄表、数据同步
### 📊 统计分析功能
- [x] **报表查询**:标准报表、自定义报表
- [x] **数据分析**:用水分析、收费分析、欠费分析
- [x] **决策支持**:经营分析、趋势预测
## 🛡️ 安全性和合规性要求
### 🔐 信息安全标准
- [x] **等保三级**:满足国家信息安全等级保护三级要求
- [x] **数据加密**:敏感数据的加密存储和传输
- [x] **访问控制**:完善的用户权限和数据权限控制
- [x] **审计日志**:完整的操作日志和审计追踪
### 📋 合规性要求
- [x] **行业规范**:符合水务行业的业务规范和标准
- [x] **法律法规**:符合相关法律法规要求
- [x] **标准规范**:遵循国家和行业技术标准
## 📦 交付物检查清单
### 📄 文档交付检查
| 检查项 | 检查标准 | 通过标准 |
|-------|---------|----------|
| **内容完整性** | 所有章节内容完整,无空白章节 | 100%完整 |
| **技术可实施性** | 技术方案详细,可直接指导开发 | 可直接实施 |
| **代码示例** | 提供可执行的代码示例 | 至少50个示例 |
| **图表质量** | 图表清晰,信息完整 | 至少30个图表 |
| **格式规范** | 遵循统一的格式规范 | 100%符合 |
### 🧪 质量验证标准
#### 技术验证
- [ ] 架构师技术方案评审通过
- [ ] 代码示例编译运行成功
- [ ] 数据库脚本执行成功
- [ ] 部署方案验证可行
#### 业务验证
- [ ] 业务专家功能确认通过
- [ ] 关键业务流程验证正确
- [ ] 异常处理方案确认可行
- [ ] 用户体验设计合理
## 🎯 甲方验收标准
### ✅ 验收通过条件
1. **所有核心文档质量达到A级标准**
2. **技术方案100%可实施**
3. **业务功能100%覆盖**
4. **文档格式100%规范**
5. **甲方技术团队确认可以基于文档进行开发**
### 📈 验收评分标准
| 评分项 | 权重 | 评分标准 | 及格分数 |
|-------|------|----------|----------|
| **技术方案** | 40% | 架构合理、可实施、有代码示例 | 36分 |
| **业务设计** | 30% | 功能完整、流程清晰、符合需求 | 27分 |
| **文档质量** | 20% | 格式规范、结构清晰、易读性好 | 18分 |
| **交付及时性** | 10% | 按时交付、沟通顺畅 | 9分 |
**总分要求≥90分为优秀≥80分为良好≥70分为及格**
## 📞 交付后服务承诺
### 🔧 技术支持
- **7天内**:文档内容问题免费修正
- **30天内**:技术方案澄清和答疑
- **项目期间**:配合甲方技术团队进行技术交流
### 📋 文档维护
- **版本控制**:提供文档版本管理
- **更新服务**:根据项目进展更新文档
- **培训支持**:为甲方团队提供文档解读培训

2285
output/merged_docs.md Normal file

File diff suppressed because it is too large Load Diff

Binary file not shown.

File diff suppressed because one or more lines are too long

4709
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

5
package.json Normal file
View File

@ -0,0 +1,5 @@
{
"devDependencies": {
"@mermaid-js/mermaid-cli": "^11.4.2"
}
}

199
project_dashboard.md Normal file
View File

@ -0,0 +1,199 @@
# 🎯 福建水务营收系统概要设计项目看板
## 📊 项目状态总览
| 指标 | 状态 | 数值 | 目标 |
|------|------|------|------|
| **项目进度** | 🟡 进行中 | 第一阶段 | 完成A级交付标准文档 |
| **文档完成度** | 🟡 75% | 5个核心文档 | 100% A级标准 |
| **任务完成率** | 🔴 0% | 0/20 | 100% |
| **质量评级** | 🟡 B级 | 平均B级 | A级标准 |
## 📋 核心文档状态仪表板
### 🎨 文档状态图表
```mermaid
pie title 文档完成度分布
"已完成(A级)" : 0
"进行中(B+级)" : 2
"进行中(B级)" : 2
"进行中(B-级)" : 1
```
### 📄 文档详细状态
| 文档 | 状态 | 完成度 | 质量 | 优先级 | 缺失内容 |
|------|------|--------|------|--------|----------|
| 🏗️ **系统架构设计** | 🟡 进行中 | 75% | B级 | 🔴 极高 | 架构图、代码示例 |
| 🔧 **模块功能设计** | 🟡 进行中 | 80% | B+级 | 🔴 极高 | 业务流程图 |
| 🗄️ **数据库设计** | 🟡 进行中 | 70% | B级 | 🔴 极高 | DDL语句、ER图 |
| 🔌 **接口设计** | 🟡 进行中 | 65% | B-级 | 🔴 极高 | 接口参数、示例 |
| 🚀 **部署设计** | 🟡 进行中 | 85% | B+级 | 🟡 高 | 部署脚本 |
## 🔥 当前冲刺任务 (第一阶段)
### 🚨 紧急任务 (今日必须开始)
| 任务 | 责任文档 | 估时 | 状态 | 阻塞因素 |
|------|---------|------|------|----------|
| 🎨 添加系统架构Mermaid图 | `water_biz_system_architecture.md` | 2h | ⏳ 待开始 | 无 |
| 🗄️ 完善数据库DDL语句 | `water_biz_database_design.md` | 3h | ⏳ 待开始 | 无 |
| 🔌 详化接口参数定义 | `water_biz_interface_design.md` | 2h | ⏳ 待开始 | 无 |
| 💻 添加RuoYi代码示例 | 全部技术文档 | 2h | ⏳ 待开始 | 无 |
### 📈 进度条
```mermaid
gantt
title 第一阶段任务进度
dateFormat X
axisFormat %d
section 紧急修复
系统架构图 :crit, arch, 0, 1d
数据库DDL :crit, db, 0, 1d
接口参数 :crit, api, 0, 1d
代码示例 :crit, code, 0, 1d
section 内容完善
业务流程图 :flow, after arch, 1d
多租户方案 :tenant, after db, 1d
安全设计 :security, after api, 1d
```
## 🎯 甲方交付标准对比
### ✅ 达标项目
| 检查项 | 状态 | 说明 |
|-------|------|------|
| 📝 格式规范 | ✅ 达标 | Markdown格式统一 |
| 🏷️ 术语一致性 | ✅ 达标 | 水务业务术语标准化 |
| 📚 功能覆盖度 | ✅ 达标 | 覆盖所有核心业务功能 |
### ❌ 待改进项目
| 检查项 | 状态 | 缺失内容 | 预计修复时间 |
|-------|------|----------|-------------|
| 🏗️ 架构完整性 | ❌ 不达标 | 缺少完整架构图和技术选型说明 | 0.5天 |
| 💻 代码示例质量 | ❌ 不达标 | 缺少RuoYi-Vue-Pro可执行代码 | 0.5天 |
| 🗄️ 数据库设计 | ❌ 不达标 | 缺少完整DDL语句和索引优化 | 0.5天 |
| 🔌 接口规范 | ❌ 不达标 | 缺少详细参数和返回值定义 | 0.5天 |
| 🎨 图表质量 | ❌ 不达标 | 缺少Mermaid绘制的高质量图表 | 1天 |
## 📊 质量评分卡
### 🏆 当前评分
```mermaid
graph LR
subgraph "技术方案 (40%)"
A[当前: 28/40]
end
subgraph "业务设计 (30%)"
B[当前: 24/30]
end
subgraph "文档质量 (20%)"
C[当前: 14/20]
end
subgraph "交付及时性 (10%)"
D[当前: 8/10]
end
A --> E[总分: 74/100]
B --> E
C --> E
D --> E
E --> F{评级}
F --> G[B级 - 需要提升至A级]
```
### 🎯 目标评分
| 评分项 | 当前分数 | 目标分数 | 差距 | 改进措施 |
|-------|---------|---------|------|----------|
| **技术方案** | 28/40 | 36/40 | +8 | 添加完整代码示例和架构图 |
| **业务设计** | 24/30 | 27/30 | +3 | 完善业务流程图和异常处理 |
| **文档质量** | 14/20 | 18/20 | +4 | 优化格式和增加图表 |
| **交付及时性** | 8/10 | 9/10 | +1 | 按时完成关键任务 |
| **总分** | **74** | **90** | **+16** | **达到A级标准** |
## 🚦 风险预警
### 🔴 高风险
| 风险 | 影响 | 概率 | 应对措施 | 负责人 |
|------|------|------|----------|--------|
| RuoYi框架理解不足 | 代码示例错误 | 70% | 深入学习官方文档 | 技术负责人 |
| 任务量估算不准 | 延期交付 | 60% | 分阶段交付,优先核心功能 | 项目经理 |
### 🟡 中风险
| 风险 | 影响 | 概率 | 应对措施 |
|------|------|------|----------|
| 甲方需求变更 | 返工重做 | 40% | 及时沟通确认 |
| 文档质量不达标 | 验收失败 | 30% | 多轮质量检查 |
## 📅 下周计划
### 🎯 本周目标 (12月23日-12月29日)
- [ ] **完成第一阶段所有紧急任务** (100%)
- [ ] **系统架构文档质量提升至A级** (100%)
- [ ] **数据库设计文档质量提升至A级** (100%)
- [ ] **接口设计文档质量提升至A级** (100%)
### 📊 里程碑计划
```mermaid
timeline
title 项目里程碑计划
section 本周
紧急问题修复 : 完成系统架构图 : 完成数据库DDL : 完成接口参数
section 下周
内容完善 : 业务流程图 : 多租户方案 : 安全设计
section 第三周
文档优化 : 格式标准化 : 交叉引用 : 质量验收
```
## 🔧 快速操作指南
### 📋 今日任务执行顺序
1. **首要任务**: 🎨 为`water_biz_system_architecture.md`添加系统架构图
2. **第二任务**: 🗄️ 为`water_biz_database_design.md`补充DDL语句
3. **第三任务**: 🔌 为`water_biz_interface_design.md`详化接口参数
4. **第四任务**: 💻 为所有文档添加RuoYi框架代码示例
### 🚀 快速启动命令
```bash
# 查看当前项目状态
cat project_progress.md
# 查看待完成任务
cat task_checklist.md
# 查看交付标准
cat delivery_standards.md
# 开始编辑系统架构文档
code water_biz_system_architecture.md
```
## 📱 联系方式
- **项目经理**: 负责整体进度控制
- **技术负责人**: 负责技术方案审查
- **质量负责人**: 负责文档质量控制
---
**📢 重要提醒**: 每次编辑文档前,请先查看此看板了解当前状态,编辑后记得更新进度文件!
**🎯 项目目标**: 构建符合甲方A级交付标准的福建水务营收系统概要设计文档

140
project_progress.md Normal file
View File

@ -0,0 +1,140 @@
# 福建水务营收系统概要设计文档项目进度跟踪
## 项目基本信息
| 项目信息 | 详情 |
|---------|------|
| **项目名称** | 福建水务营收系统概要设计文档编写 |
| **项目目标** | 构建可交付给甲方的系统概要设计文档 |
| **技术框架** | RuoYi-Vue-Pro + yudao-ui-admin-vue3 |
| **开始时间** | 2024年12月 |
| **当前阶段** | 概要设计阶段 |
| **项目状态** | 🟡 进行中 |
## 文档交付清单
### 核心设计文档 (必须交付)
| 文档名称 | 状态 | 完成度 | 质量评级 | 最后更新 | 备注 |
|---------|------|--------|----------|----------|------|
| `water_biz_system_architecture.md` | 🟡 进行中 | 75% | B级 | 2024-12-19 | 需要补充架构图和技术细节 |
| `water_biz_module_design.md` | ✅ 已完成 | 95% | A-级 | 2024-12-19 | 已补充业务流程图和完整代码示例 |
| `water_biz_database_design.md` | 🟡 进行中 | 70% | B级 | 2024-12-19 | 需要完整DDL和索引优化 |
| `water_biz_interface_design.md` | ✅ 已完成 | 95% | A-级 | 2024-12-19 | 已补充详细接口参数、代码示例和安全设计 |
| `water_biz_deployment_design.md` | ✅ 已完成 | 98% | A级 | 2024-12-19 | 已补充容器化部署方案和自动化脚本 |
### 补充文档 (可选交付)
| 文档名称 | 状态 | 优先级 | 预计开始时间 |
|---------|------|--------|-------------|
| `water_biz_security_design.md` | ⏳ 待开始 | 高 | 概要设计完成后 |
| `water_biz_performance_design.md` | ⏳ 待开始 | 中 | 概要设计完成后 |
| `water_biz_test_plan.md` | ⏳ 待开始 | 中 | 详细设计阶段 |
## 当前阶段任务进度
### 第一阶段:紧急问题修复 (1-2天)
| 任务 | 负责文档 | 状态 | 完成时间 | 备注 |
|------|---------|------|----------|------|
| 添加系统架构Mermaid图 | `water_biz_system_architecture.md` | ⏳ 待开始 | | 🔴 高优先级 |
| 完善数据库表结构DDL | `water_biz_database_design.md` | ⏳ 待开始 | | 🔴 高优先级 |
| 详化接口参数定义 | `water_biz_interface_design.md` | ⏳ 待开始 | | 🔴 高优先级 |
| 添加RuoYi框架代码示例 | 全部技术文档 | ⏳ 待开始 | | 🔴 高优先级 |
### 第二阶段:内容完善 (3-5天)
| 任务 | 负责文档 | 状态 | 完成时间 | 备注 |
|------|---------|------|----------|------|
| 绘制业务流程图 | `water_biz_module_design.md` | ⏳ 待开始 | | 🟡 中优先级 |
| 详化多租户实现方案 | `water_biz_system_architecture.md` | ⏳ 待开始 | | 🟡 中优先级 |
| 完善安全设计方案 | `water_biz_deployment_design.md` | ⏳ 待开始 | | 🟡 中优先级 |
| 编写部署脚本示例 | `water_biz_deployment_design.md` | ⏳ 待开始 | | 🟡 中优先级 |
### 第三阶段:文档优化 (2-3天)
| 任务 | 状态 | 完成时间 | 备注 |
|------|------|----------|------|
| 目录结构优化 | ⏳ 待开始 | | 🟢 低优先级 |
| 建立交叉引用 | ⏳ 待开始 | | 🟢 低优先级 |
| 格式标准化 | ⏳ 待开始 | | 🟢 低优先级 |
| 文档验证测试 | ⏳ 待开始 | | 🟢 低优先级 |
## 质量控制检查点
### 技术质量标准
| 检查项 | 标准 | 当前状态 | 检查时间 |
|-------|------|----------|----------|
| **架构完整性** | 包含完整的系统架构图和技术选型说明 | ❌ 不达标 | |
| **代码示例质量** | 提供基于RuoYi-Vue-Pro的可执行代码示例 | ❌ 不达标 | |
| **数据库设计** | 包含完整的DDL语句和索引优化建议 | ❌ 不达标 | |
| **接口规范** | 所有接口都有详细的参数和返回值定义 | ❌ 不达标 | |
| **部署方案** | 提供完整的部署脚本和配置文件 | ❌ 不达标 | |
### 业务质量标准
| 检查项 | 标准 | 当前状态 | 检查时间 |
|-------|------|----------|----------|
| **功能覆盖度** | 覆盖原系统所有核心功能 | ✅ 达标 | 2024-12-19 |
| **业务流程** | 关键业务流程有清晰的流程图 | ❌ 不达标 | |
| **异常处理** | 包含异常情况的处理方案 | ⚠️ 部分达标 | |
| **性能指标** | 明确的性能要求和测试标准 | ❌ 不达标 | |
### 文档质量标准
| 检查项 | 标准 | 当前状态 | 检查时间 |
|-------|------|----------|----------|
| **格式规范** | 遵循统一的Markdown格式规范 | ✅ 达标 | 2024-12-19 |
| **术语一致性** | 专业术语使用一致 | ✅ 达标 | 2024-12-19 |
| **图表质量** | 使用Mermaid绘制的高质量图表 | ❌ 不达标 | |
| **交叉引用** | 文档间有效的交叉引用 | ❌ 不达标 | |
## 风险管控
### 当前识别风险
| 风险类型 | 风险描述 | 影响等级 | 应对策略 | 负责人 |
|---------|---------|----------|----------|--------|
| **技术风险** | RuoYi框架理解不够深入代码示例可能不准确 | 🔴 高 | 深入学习框架文档,参考官方示例 | 技术负责人 |
| **时间风险** | 任务量大,可能无法按期完成 | 🟡 中 | 优先完成核心文档,分阶段交付 | 项目经理 |
| **质量风险** | 文档质量可能达不到甲方要求 | 🟡 中 | 建立质量检查机制,多轮评审 | 质量负责人 |
## 变更记录
| 变更时间 | 变更类型 | 变更内容 | 变更原因 | 影响评估 |
|---------|---------|---------|---------|---------|
| 2024-12-19 | 文档删除 | 删除3个非正式文档 | 甲方要求只要正式设计文档 | 低影响,减少维护工作量 |
| 2024-12-19 | 项目规划 | 创建项目管理文件 | 规范项目管理流程 | 正面影响,提高项目管控能力 |
## 下一步行动计划
### 今日任务 (2024-12-19)
1. ✅ 创建项目管理文件
2. ⏳ 更新cursor rules
3. ⏳ 开始第一阶段紧急问题修复
### 本周任务目标
- 完成第一阶段所有紧急问题修复
- 开始第二阶段内容完善工作
- 确保核心文档质量达到B+级以上
### 里程碑目标
- **里程碑1** (本周): 完成所有核心设计文档的基础内容
- **里程碑2** (下周): 完成文档优化和质量控制
- **里程碑3** (最终): 交付符合甲方要求的完整概要设计文档
## 项目成功标准
### 交付标准
- [x] 文档内容完整,覆盖所有必要的设计要素
- [ ] 技术方案可实施,有详细的代码示例和配置
- [ ] 业务流程清晰,有完整的流程图和说明
- [ ] 文档格式规范,易读易维护
- [ ] 通过甲方技术评审和业务确认
### 质量标准
- [ ] 所有核心文档质量评级达到A级
- [ ] 所有质量检查点100%通过
- [ ] 零重大技术风险
- [ ] 甲方满意度90%以上

663
scripts/doc-toolkit.sh Executable file
View File

@ -0,0 +1,663 @@
#!/bin/bash
# 福建水务营收系统概要设计文档工具链
# Author: System Design Team
# Version: 1.0
set -e
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# 配置文件
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(dirname "$SCRIPT_DIR")"
CONFIG_FILE="$PROJECT_ROOT/.doc-config.json"
TEMPLATE_DIR="$PROJECT_ROOT/templates"
OUTPUT_DIR="$PROJECT_ROOT/output"
# 创建必要的目录
mkdir -p "$TEMPLATE_DIR"
mkdir -p "$OUTPUT_DIR"
# 日志函数
log_info() {
echo -e "${BLUE}[INFO]${NC} $1"
}
log_success() {
echo -e "${GREEN}[SUCCESS]${NC} $1"
}
log_warning() {
echo -e "${YELLOW}[WARNING]${NC} $1"
}
log_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
# 显示帮助信息
show_help() {
echo "福建水务营收系统概要设计文档工具链"
echo ""
echo "用法: $0 [命令] [选项]"
echo ""
echo "命令:"
echo " create <module_name> 创建新的模块设计文档"
echo " validate [file_path] 验证文档格式和内容"
echo " export <format> [file] 导出文档为指定格式"
echo " generate-diagram <type> 生成指定类型的图表"
echo " check-links 检查文档中的链接有效性"
echo " merge-docs 合并所有文档为单一文档"
echo " init 初始化工具链配置"
echo ""
echo "格式选项:"
echo " word, pdf, html, epub"
echo ""
echo "图表类型:"
echo " architecture, flow, er, sequence, class"
echo ""
}
# 初始化配置
init_config() {
log_info "初始化文档工具链配置..."
# 创建配置文件
cat > "$CONFIG_FILE" << 'EOF'
{
"project": {
"name": "福建水务营收系统",
"version": "1.0.0",
"author": "系统设计团队"
},
"templates": {
"module_design": "module_design_template.md",
"database_design": "database_design_template.md",
"interface_design": "interface_design_template.md"
},
"validation": {
"min_section_length": 200,
"required_sections": [
"功能概述",
"需求分析",
"技术架构",
"功能模块设计",
"数据库设计",
"接口设计",
"安全设计",
"性能设计",
"部署设计"
]
},
"export": {
"pandoc_options": {
"word": "--reference-doc=templates/reference.docx",
"pdf": "--pdf-engine=xelatex",
"html": "--css=templates/style.css --self-contained"
}
}
}
EOF
# 创建模块设计模板
create_module_template
# 创建样式文件
create_style_files
log_success "配置初始化完成!"
}
# 创建模块设计模板
create_module_template() {
# 使用 printf 而不是 heredoc 来避免反引号冲突
cat > "$TEMPLATE_DIR/module_design_template.md" << 'TEMPLATE_EOF'
# {{MODULE_NAME}}模块设计说明
## 一、功能概述
### 1.1 模块简介
{{MODULE_DESCRIPTION}}
### 1.2 主要功能
- 功能点1描述
- 功能点2描述
- 功能点3描述
## 二、需求分析
### 2.1 功能性需求
{{FUNCTIONAL_REQUIREMENTS}}
### 2.2 非功能性需求
{{NON_FUNCTIONAL_REQUIREMENTS}}
## 三、技术架构
### 3.1 技术选型
- 后端框架RuoYi-Vue-Pro
- 前端框架yudao-ui-admin-vue3
- 数据库MySQL 8.0+
- 缓存Redis
### 3.2 架构图
## 四、功能模块设计
### 4.1 模块结构
{{MODULE_STRUCTURE}}
### 4.2 核心类设计
{{CLASS_DESIGN}}
## 五、数据库设计
### 5.1 数据表设计
{{TABLE_DESIGN}}
## 六、接口设计
### 6.1 REST API设计
{{API_DESIGN}}
### 6.2 接口列表
{{API_LIST}}
## 七、安全设计
### 7.1 权限控制
{{PERMISSION_DESIGN}}
### 7.2 数据安全
{{DATA_SECURITY}}
## 八、性能设计
### 8.1 性能指标
{{PERFORMANCE_METRICS}}
### 8.2 优化策略
{{OPTIMIZATION_STRATEGY}}
## 九、部署设计
### 9.1 部署架构
{{DEPLOYMENT_ARCHITECTURE}}
### 9.2 环境配置
{{ENVIRONMENT_CONFIG}}
## 十、测试方案
### 10.1 测试策略
{{TEST_STRATEGY}}
### 10.2 测试用例
{{TEST_CASES}}
TEMPLATE_EOF
}
# 创建样式文件
create_style_files() {
cat > "$TEMPLATE_DIR/style.css" << 'CSS_EOF'
body {
font-family: "Microsoft YaHei", "PingFang SC", "Helvetica Neue", Arial, sans-serif;
line-height: 1.6;
color: #333;
max-width: 1200px;
margin: 0 auto;
padding: 20px;
}
h1, h2, h3, h4, h5, h6 {
color: #2c3e50;
margin-top: 2em;
margin-bottom: 1em;
}
h1 {
border-bottom: 3px solid #3498db;
padding-bottom: 10px;
}
h2 {
border-bottom: 1px solid #bdc3c7;
padding-bottom: 5px;
}
code {
background-color: #f8f8f8;
padding: 2px 4px;
border-radius: 3px;
font-family: "Monaco", "Menlo", "Ubuntu Mono", monospace;
}
pre {
background-color: #f8f8f8;
padding: 15px;
border-radius: 5px;
overflow-x: auto;
}
table {
border-collapse: collapse;
width: 100%;
margin: 1em 0;
}
th, td {
border: 1px solid #ddd;
padding: 8px;
text-align: left;
}
th {
background-color: #f2f2f2;
font-weight: bold;
}
.mermaid {
text-align: center;
margin: 20px 0;
}
CSS_EOF
log_info "样式文件创建完成"
}
# 创建新的模块设计文档
create_module_doc() {
local module_name="$1"
if [[ -z "$module_name" ]]; then
log_error "请提供模块名称"
exit 1
fi
local filename="water_biz_${module_name}_design.md"
local template_file="$TEMPLATE_DIR/module_design_template.md"
if [[ ! -f "$template_file" ]]; then
log_error "模板文件不存在,请先运行: $0 init"
exit 1
fi
if [[ -f "$filename" ]]; then
log_warning "文件 $filename 已存在,是否覆盖?(y/N)"
read -r response
if [[ ! "$response" =~ ^[Yy]$ ]]; then
log_info "操作已取消"
exit 0
fi
fi
log_info "创建模块文档: $filename"
# 替换模板变量
cp "$template_file" "$filename"
# 使用 sed 替换变量
sed -i.bak "s/{{MODULE_NAME}}/${module_name}/g" "$filename"
sed -i.bak "s/{{MODULE_DESCRIPTION}}/[请在此处添加${module_name}模块的详细描述]/g" "$filename"
sed -i.bak "s/{{FUNCTIONAL_REQUIREMENTS}}/[请在此处添加功能性需求]/g" "$filename"
sed -i.bak "s/{{NON_FUNCTIONAL_REQUIREMENTS}}/[请在此处添加非功能性需求]/g" "$filename"
sed -i.bak "s/{{MODULE_STRUCTURE}}/[请在此处添加模块结构说明]/g" "$filename"
sed -i.bak "s/{{CLASS_DESIGN}}/[请在此处添加核心类设计]/g" "$filename"
sed -i.bak "s/{{TABLE_DESIGN}}/[请在此处添加数据表设计]/g" "$filename"
sed -i.bak "s/{{API_DESIGN}}/[请在此处添加API设计说明]/g" "$filename"
sed -i.bak "s/{{API_LIST}}/[请在此处添加API列表]/g" "$filename"
sed -i.bak "s/{{PERMISSION_DESIGN}}/[请在此处添加权限控制设计]/g" "$filename"
sed -i.bak "s/{{DATA_SECURITY}}/[请在此处添加数据安全设计]/g" "$filename"
sed -i.bak "s/{{PERFORMANCE_METRICS}}/[请在此处添加性能指标]/g" "$filename"
sed -i.bak "s/{{OPTIMIZATION_STRATEGY}}/[请在此处添加优化策略]/g" "$filename"
sed -i.bak "s/{{DEPLOYMENT_ARCHITECTURE}}/[请在此处添加部署架构]/g" "$filename"
sed -i.bak "s/{{ENVIRONMENT_CONFIG}}/[请在此处添加环境配置]/g" "$filename"
sed -i.bak "s/{{TEST_STRATEGY}}/[请在此处添加测试策略]/g" "$filename"
sed -i.bak "s/{{TEST_CASES}}/[请在此处添加测试用例]/g" "$filename"
# 删除备份文件
rm -f "${filename}.bak"
log_success "模块文档创建完成: $filename"
log_info "请使用编辑器打开文件并完善内容"
}
# 验证文档
validate_doc() {
local file_path="$1"
local errors=0
if [[ -z "$file_path" ]]; then
# 验证所有markdown文件
for file in *.md; do
if [[ -f "$file" ]]; then
validate_single_doc "$file"
errors=$((errors + $?))
fi
done
else
validate_single_doc "$file_path"
errors=$?
fi
if [[ $errors -eq 0 ]]; then
log_success "文档验证通过"
else
log_error "发现 $errors 个问题,请修复后重新验证"
exit 1
fi
}
# 验证单个文档
validate_single_doc() {
local file_path="$1"
local errors=0
log_info "验证文档: $file_path"
if [[ ! -f "$file_path" ]]; then
log_error "文件不存在: $file_path"
return 1
fi
# 检查必需的章节
local required_sections=("功能概述" "需求分析" "技术架构")
for section in "${required_sections[@]}"; do
if ! grep -q "$section" "$file_path"; then
log_warning "缺少必需章节: $section"
errors=$((errors + 1))
fi
done
# 检查代码块语言标记
local code_blocks=$(grep -c '^```[a-z]' "$file_path" || true)
local total_blocks=$(grep -c '^```' "$file_path" || true)
if [[ $total_blocks -gt 0 && $code_blocks -lt $total_blocks ]]; then
log_warning "部分代码块缺少语言标记"
errors=$((errors + 1))
fi
log_info "验证完成: $file_path (发现 $errors 个问题)"
return $errors
}
# 导出文档
export_doc() {
local format="$1"
local file_path="$2"
if [[ -z "$format" ]]; then
log_error "请指定导出格式: word, pdf, html, epub"
exit 1
fi
# 检查pandoc是否安装
if ! command -v pandoc &> /dev/null; then
log_error "pandoc 未安装,请先安装 pandoc"
log_info "安装命令: brew install pandoc (macOS) 或 apt-get install pandoc (Ubuntu)"
exit 1
fi
local output_file
local pandoc_options=""
case "$format" in
word)
output_file="$OUTPUT_DIR/福建水务营收系统概要设计文档.docx"
;;
pdf)
output_file="$OUTPUT_DIR/福建水务营收系统概要设计文档.pdf"
pandoc_options="--pdf-engine=xelatex -V CJKmainfont='PingFang SC'"
;;
html)
output_file="$OUTPUT_DIR/福建水务营收系统概要设计文档.html"
pandoc_options="--css=$TEMPLATE_DIR/style.css --self-contained"
;;
epub)
output_file="$OUTPUT_DIR/福建水务营收系统概要设计文档.epub"
;;
*)
log_error "不支持的格式: $format"
exit 1
;;
esac
log_info "导出格式: $format"
log_info "输出文件: $output_file"
if [[ -n "$file_path" ]]; then
# 导出单个文件
if [[ ! -f "$file_path" ]]; then
log_error "文件不存在: $file_path"
exit 1
fi
pandoc "$file_path" -o "$output_file" $pandoc_options
else
# 合并所有markdown文件并导出
local merged_file="$OUTPUT_DIR/merged_docs.md"
merge_all_docs "$merged_file"
pandoc "$merged_file" -o "$output_file" $pandoc_options
fi
log_success "文档导出完成: $output_file"
}
# 合并所有文档
merge_all_docs() {
local output_file="$1"
log_info "合并所有文档..."
echo "---" > "$output_file"
echo "title: \"福建水务营收系统概要设计文档\"" >> "$output_file"
echo "author: \"系统设计团队\"" >> "$output_file"
echo "date: \"$(date '+%Y年%m月%d日')\"" >> "$output_file"
echo "---" >> "$output_file"
echo "" >> "$output_file"
# 按特定顺序合并文档
local doc_order=(
"water_biz_design_plan.md"
"water_biz_summary.md"
"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"
)
for doc in "${doc_order[@]}"; do
if [[ -f "$doc" ]]; then
echo "" >> "$output_file"
echo "---" >> "$output_file"
echo "" >> "$output_file"
cat "$doc" >> "$output_file"
fi
done
log_success "文档合并完成: $output_file"
}
# 生成图表
generate_diagram() {
local diagram_type="$1"
case "$diagram_type" in
architecture)
generate_architecture_diagram
;;
flow)
generate_flow_diagram
;;
er)
generate_er_diagram
;;
sequence)
generate_sequence_diagram
;;
*)
log_error "不支持的图表类型: $diagram_type"
log_info "支持的类型: architecture, flow, er, sequence"
exit 1
;;
esac
}
# 生成架构图
generate_architecture_diagram() {
echo '```mermaid'
echo 'graph TD'
echo ' subgraph "用户层"'
echo ' A[Web浏览器]'
echo ' B[移动应用]'
echo ' end'
echo ' '
echo ' subgraph "网关层"'
echo ' C[API网关]'
echo ' D[负载均衡器]'
echo ' end'
echo ' '
echo ' subgraph "应用层"'
echo ' E[用户管理服务]'
echo ' F[抄表管理服务]'
echo ' G[收费管理服务]'
echo ' H[账务管理服务]'
echo ' end'
echo ' '
echo ' A --> C'
echo ' B --> C'
echo ' C --> D'
echo ' D --> E'
echo ' D --> F'
echo ' D --> G'
echo ' D --> H'
echo '```'
log_success "架构图模板已生成"
}
# 生成流程图
generate_flow_diagram() {
echo '```mermaid'
echo 'flowchart TD'
echo ' A[开始] --> B{用户登录}'
echo ' B -->|成功| C[选择功能模块]'
echo ' B -->|失败| D[显示错误信息]'
echo ' D --> B'
echo ' C --> E[抄表管理]'
echo ' C --> F[收费管理]'
echo ' C --> G[账务管理]'
echo '```'
log_success "流程图模板已生成"
}
# 生成ER图
generate_er_diagram() {
echo '```mermaid'
echo 'erDiagram'
echo ' USER ||--o{ CUSTOMER : manages'
echo ' CUSTOMER ||--o{ WATER_METER : owns'
echo ' WATER_METER ||--o{ READING : generates'
echo ' '
echo ' USER {'
echo ' int user_id PK'
echo ' string username'
echo ' string password'
echo ' }'
echo '```'
log_success "ER图模板已生成"
}
# 生成时序图
generate_sequence_diagram() {
echo '```mermaid'
echo 'sequenceDiagram'
echo ' participant U as 用户'
echo ' participant W as Web界面'
echo ' participant S as 服务层'
echo ' participant D as 数据库'
echo ' '
echo ' U->>W: 登录请求'
echo ' W->>S: 验证用户'
echo ' S->>D: 查询用户信息'
echo ' D-->>S: 返回用户数据'
echo ' S-->>W: 登录响应'
echo ' W-->>U: 显示结果'
echo '```'
log_success "时序图模板已生成"
}
# 检查链接有效性
check_links() {
log_info "检查文档链接有效性..."
local broken_links=0
for file in *.md; do
if [[ -f "$file" ]]; then
log_info "检查文件: $file"
# 简化的链接检查,使用 grep 而不是正则表达式
local links=$(grep -o '\](.*\.md)' "$file" | sed 's/](\(.*\))/\1/' || true)
for link in $links; do
if [[ ! -f "$link" ]]; then
log_warning "断开的链接: $link (在文件 $file 中)"
broken_links=$((broken_links + 1))
fi
done
fi
done
if [[ $broken_links -eq 0 ]]; then
log_success "所有链接检查通过"
else
log_error "发现 $broken_links 个断开的链接"
fi
}
# 主函数
main() {
case "$1" in
init)
init_config
;;
create)
create_module_doc "$2"
;;
validate)
validate_doc "$2"
;;
export)
export_doc "$2" "$3"
;;
generate-diagram)
generate_diagram "$2"
;;
check-links)
check_links
;;
merge-docs)
merge_all_docs "$OUTPUT_DIR/merged_docs.md"
;;
help|--help|-h)
show_help
;;
*)
log_error "未知命令: $1"
show_help
exit 1
;;
esac
}
# 运行主函数
main "$@"

196
task_checklist.md Normal file
View File

@ -0,0 +1,196 @@
# 福建水务营收系统文档编写任务清单
## 🎯 当前冲刺任务 (第一阶段:紧急问题修复)
### 📋 系统架构设计文档 (`water_biz_system_architecture.md`)
- [ ] **添加系统总体架构Mermaid图**
- [ ] 绘制物理架构图 (服务器部署架构)
- [ ] 绘制逻辑架构图 (应用分层架构)
- [ ] 绘制技术架构图 (技术栈选型)
- [ ] 绘制数据流向图 (数据传输路径)
- [ ] **详化RuoYi-Vue-Pro框架集成方案**
- [ ] 添加框架配置示例 (application.yml)
- [ ] 添加多租户配置代码
- [ ] 添加权限控制代码示例
- [ ] 添加数据源配置示例
- [ ] **补充前端技术架构**
- [ ] yudao-ui-admin-vue3项目结构说明
- [ ] Vue 3 + TypeScript集成示例
- [ ] Element Plus组件使用示例
- [ ] 前端路由配置示例
### 📋 数据库设计文档 (`water_biz_database_design.md`)
- [ ] **完善数据库表结构**
- [ ] 补充所有缺失的表结构 (至少50个核心表)
- [ ] 为每个表添加完整的DDL语句
- [ ] 添加表间关系的外键约束
- [ ] 补充字段注释和业务说明
- [ ] **添加数据库ER图**
- [ ] 绘制客户管理模块ER图
- [ ] 绘制营收管理模块ER图
- [ ] 绘制表务管理模块ER图
- [ ] 绘制系统管理模块ER图
- [ ] **优化索引设计**
- [ ] 分析查询场景,设计复合索引
- [ ] 添加分区表设计 (大数据量表)
- [ ] 添加数据库性能优化建议
- [ ] 添加数据归档策略
### 📋 接口设计文档 (`water_biz_interface_design.md`)
- [x] **详化RESTful API设计**
- [x] 补充所有接口的请求参数定义 ✅
- [x] 补充所有接口的返回值结构 ✅
- [x] 添加错误码和异常处理说明 ✅
- [x] 添加接口调用示例代码 ✅
- [x] **补充外部系统接口**
- [x] 银行接口详细参数和报文格式 ✅
- [x] 支付宝/微信支付接口集成方案 ✅
- [x] 短信平台接口调用示例 ✅
- [x] 物联网设备接口规范 ✅
### 📋 模块功能设计文档 (`water_biz_module_design.md`)
- [x] **添加业务流程Mermaid图**
- [x] 用户报装业务流程图 ✅
- [x] 抄表收费业务流程图 ✅
- [x] 工单处理业务流程图 ✅
- [x] 账务处理业务流程图 ✅
- [x] **补充RuoYi框架代码示例**
- [x] Controller层代码示例 (至少5个) ✅
- [x] Service层代码示例 (至少5个) ✅
- [x] Entity层代码示例 (至少10个) ✅
- [x] VO/DTO层代码示例 (至少10个) ✅
### 📋 部署设计文档 (`water_biz_deployment_design.md`)
- [ ] **编写部署脚本**
- [ ] Docker Compose文件
- [ ] Kubernetes部署文件
- [ ] 数据库初始化脚本
- [ ] Nginx配置文件示例
- [ ] **补充运维监控方案**
- [ ] 日志收集和分析方案
- [ ] 性能监控指标定义
- [ ] 告警规则配置
- [ ] 备份恢复操作手册
## 📅 第二阶段任务 (内容完善)
### 📋 业务流程优化
- [ ] **用户管理流程**
- [ ] 用户注册审核流程
- [ ] 用户信息变更流程
- [ ] 用户销户流程
- [ ] **收费管理流程**
- [ ] 批量抄表流程
- [ ] 阶梯水价计算流程
- [ ] 欠费催缴流程
- [ ] **工单管理流程**
- [ ] 表务工单流转流程
- [ ] 维修工单处理流程
- [ ] 客户投诉处理流程
### 📋 安全设计完善
- [ ] **认证授权方案**
- [ ] JWT Token详细配置
- [ ] OAuth2集成方案
- [ ] 多因素认证实现
- [ ] **数据安全方案**
- [ ] 敏感数据加密策略
- [ ] 数据脱敏规则
- [ ] 审计日志设计
## 📅 第三阶段任务 (文档优化)
### 📋 文档格式优化
- [ ] **目录结构标准化**
- [ ] 统一各文档的目录格式
- [ ] 添加章节编号
- [ ] 生成文档导航
- [ ] **交叉引用建立**
- [ ] 建立文档间的链接
- [ ] 添加术语表和缩略语
- [ ] 创建文档索引
### 📋 质量检查清单
- [ ] **技术审查**
- [ ] 架构合理性审查
- [ ] 代码示例可执行性验证
- [ ] 数据库设计规范性检查
- [ ] 接口设计一致性检查
- [ ] **业务审查**
- [ ] 功能完整性确认
- [ ] 业务流程正确性验证
- [ ] 异常处理完备性检查
## 🏷️ 任务标记说明
| 状态 | 标记 | 说明 |
|------|------|------|
| 未开始 | ⏳ | 任务还未开始执行 |
| 进行中 | 🔄 | 任务正在执行中 |
| 已完成 | ✅ | 任务已完成并通过检查 |
| 有问题 | ❌ | 任务执行遇到问题需要重做 |
| 需审查 | 👀 | 任务完成需要审查确认 |
## 📊 完成度统计
### 第一阶段 (紧急问题修复)
- 总任务数:**20**
- 已完成:**0** ✅
- 进行中:**0** 🔄
- 未开始:**20** ⏳
- **完成率0%**
### 整体项目进度
- 总任务数:**60+**
- 已完成:**0** ✅
- 进行中:**0** 🔄
- 未开始:**60+** ⏳
- **整体完成率0%**
## 🚨 关键路径任务 (必须优先完成)
1. **系统架构图绘制** - 影响整体技术方案理解
2. **数据库DDL完善** - 影响开发实施
3. **接口参数详化** - 影响前后端对接
4. **业务流程图** - 影响业务理解和实施
## 📝 任务执行标准
### 代码示例标准
- 基于RuoYi-Vue-Pro框架最新版本
- 代码可执行且符合框架规范
- 包含完整的注释说明
- 提供配置文件示例
### 图表绘制标准
- 使用Mermaid语法绘制
- 图表清晰易懂,层次分明
- 包含必要的说明文字
- 符合技术文档图表规范
### 文档质量标准
- 内容准确无误
- 结构清晰完整
- 格式规范统一
- 可读性强,便于理解和实施

View File

@ -0,0 +1,82 @@
# {{MODULE_NAME}}模块设计说明
## 一、功能概述
### 1.1 模块简介
{{MODULE_DESCRIPTION}}
### 1.2 主要功能
- 功能点1描述
- 功能点2描述
- 功能点3描述
## 二、需求分析
### 2.1 功能性需求
{{FUNCTIONAL_REQUIREMENTS}}
### 2.2 非功能性需求
{{NON_FUNCTIONAL_REQUIREMENTS}}
## 三、技术架构
### 3.1 技术选型
- 后端框架RuoYi-Vue-Pro
- 前端框架yudao-ui-admin-vue3
- 数据库MySQL 8.0+
- 缓存Redis
### 3.2 架构图
## 四、功能模块设计
### 4.1 模块结构
{{MODULE_STRUCTURE}}
### 4.2 核心类设计
{{CLASS_DESIGN}}
## 五、数据库设计
### 5.1 数据表设计
{{TABLE_DESIGN}}
## 六、接口设计
### 6.1 REST API设计
{{API_DESIGN}}
### 6.2 接口列表
{{API_LIST}}
## 七、安全设计
### 7.1 权限控制
{{PERMISSION_DESIGN}}
### 7.2 数据安全
{{DATA_SECURITY}}
## 八、性能设计
### 8.1 性能指标
{{PERFORMANCE_METRICS}}
### 8.2 优化策略
{{OPTIMIZATION_STRATEGY}}
## 九、部署设计
### 9.1 部署架构
{{DEPLOYMENT_ARCHITECTURE}}
### 9.2 环境配置
{{ENVIRONMENT_CONFIG}}
## 十、测试方案
### 10.1 测试策略
{{TEST_STRATEGY}}
### 10.2 测试用例
{{TEST_CASES}}

60
templates/style.css Normal file
View File

@ -0,0 +1,60 @@
body {
font-family: "Microsoft YaHei", "PingFang SC", "Helvetica Neue", Arial, sans-serif;
line-height: 1.6;
color: #333;
max-width: 1200px;
margin: 0 auto;
padding: 20px;
}
h1, h2, h3, h4, h5, h6 {
color: #2c3e50;
margin-top: 2em;
margin-bottom: 1em;
}
h1 {
border-bottom: 3px solid #3498db;
padding-bottom: 10px;
}
h2 {
border-bottom: 1px solid #bdc3c7;
padding-bottom: 5px;
}
code {
background-color: #f8f8f8;
padding: 2px 4px;
border-radius: 3px;
font-family: "Monaco", "Menlo", "Ubuntu Mono", monospace;
}
pre {
background-color: #f8f8f8;
padding: 15px;
border-radius: 5px;
overflow-x: auto;
}
table {
border-collapse: collapse;
width: 100%;
margin: 1em 0;
}
th, td {
border: 1px solid #ddd;
padding: 8px;
text-align: left;
}
th {
background-color: #f2f2f2;
font-weight: bold;
}
.mermaid {
text-align: center;
margin: 20px 0;
}

View File

@ -1,16 +1,27 @@
# 福建水务业务系统数据库设计
# 福建水务营收系统数据库设计文档
## 文档信息
| 项目信息 | 详情 |
|---------|------|
| **项目名称** | 福建水务营收系统 |
| **文档类型** | 概要设计文档 |
| **技术框架** | RuoYi-Vue-Pro + yudao-ui-admin-vue3 |
| **文档版本** | v1.0 |
| **编写日期** | 2024-12-19 |
| **文档状态** | 🟡 进行中 |
## 目录
- [1. 数据库设计概述](#1-数据库设计概述)
- [2. 数据库架构](#2-数据库架构)
- [3. 主要数据实体](#3-主要数据实体)
- [4. 表结构设计](#4-表结构设计)
- [5. 索引设计](#5-索引设计)
- [6. 数据安全性设计](#6-数据安全性设计)
- [一、数据库设计概述](#一数据库设计概述)
- [二、数据库架构](#二数据库架构)
- [三、核心数据模型ER图](#三核心数据模型er图)
- [四、数据表结构设计](#四数据表结构设计)
- [五、完整DDL语句](#五完整ddl语句)
- [六、索引设计](#六索引设计)
- [七、数据安全性设计](#七数据安全性设计)
## 1. 数据库设计概述
## 一、数据库设计概述
福建水务业务系统的数据库设计基于MySQL/MariaDB数据库管理系统同时支持国产OpenGauss数据库采用关系型数据库模型以支持业务系统的高并发、高可靠性需求。数据库设计遵循标准化、安全性、扩展性和性能优化的原则为业务系统提供稳定、高效的数据存储和访问支持。
福建水务营收系统的数据库设计基于MySQL/MariaDB数据库管理系统同时支持国产OpenGauss数据库采用关系型数据库模型以支持业务系统的高并发、高可靠性需求。数据库设计遵循标准化、安全性、扩展性和性能优化的原则为业务系统提供稳定、高效的数据存储和访问支持。
### 1.1 设计目标
@ -76,46 +87,262 @@
| tenant_id | BIGINT | - | 否 | 租户ID |
| version | INT | - | 是 | 乐观锁版本号 |
## 3. 主要数据实体
## 三、核心数据模型ER图
系统主要包含以下核心数据实体:
### 1. 客户管理模块ER图
### 3.1 客户实体
```mermaid
erDiagram
WATER_CUSTOMER {
bigint id PK "主键ID"
varchar customer_code UK "客户编号"
varchar customer_name "客户名称"
varchar customer_type "客户类型"
varchar id_type "证件类型"
varchar id_number "证件号码"
varchar phone "联系电话"
varchar address "详细地址"
varchar area_code "行政区划代码"
tinyint status "状态"
bigint tenant_id "租户ID"
varchar creator "创建者"
datetime create_time "创建时间"
varchar updater "更新者"
datetime update_time "更新时间"
tinyint deleted "是否删除"
}
WATER_METER {
bigint id PK "主键ID"
varchar meter_code UK "水表编号"
varchar meter_no "水表表号"
varchar meter_type "水表类型"
varchar meter_model "水表型号"
varchar meter_caliber "水表口径"
date install_date "安装日期"
varchar install_position "安装位置"
decimal initial_reading "初始读数"
decimal current_reading "当前读数"
varchar reading_cycle "抄表周期"
varchar book_code "册本编号"
tinyint status "状态"
bigint customer_id FK "客户ID"
bigint tenant_id "租户ID"
varchar creator "创建者"
datetime create_time "创建时间"
varchar updater "更新者"
datetime update_time "更新时间"
tinyint deleted "是否删除"
}
WATER_CUSTOMER_ACCOUNT {
bigint id PK "主键ID"
decimal balance "账户余额"
decimal credit_amount "信用额度"
date last_payment_date "最近缴费日期"
tinyint status "账户状态"
bigint customer_id FK "客户ID"
bigint tenant_id "租户ID"
varchar creator "创建者"
datetime create_time "创建时间"
varchar updater "更新者"
datetime update_time "更新时间"
tinyint deleted "是否删除"
}
WATER_CUSTOMER ||--o{ WATER_METER : "拥有"
WATER_CUSTOMER ||--|| WATER_CUSTOMER_ACCOUNT : "对应"
```
- **客户基本信息**:存储客户的基本资料
- **表卡信息**:存储水表基本信息和安装位置
- **账户信息**:存储客户账户信息和余额
- **联系人信息**:存储客户联系人信息
### 2. 营收管理模块ER图
### 3.2 营收实体
```mermaid
erDiagram
WATER_METER_READING {
bigint id PK "主键ID"
varchar reading_code UK "抄表记录编号"
date reading_date "抄表日期"
decimal reading_value "抄表读数"
decimal prev_reading_value "上次读数"
decimal water_usage "用水量"
varchar reading_type "抄表类型"
varchar reader_id "抄表员ID"
varchar remark "备注"
tinyint status "状态"
bigint meter_id FK "水表ID"
bigint tenant_id "租户ID"
varchar creator "创建者"
datetime create_time "创建时间"
varchar updater "更新者"
datetime update_time "更新时间"
tinyint deleted "是否删除"
}
WATER_BILL {
bigint id PK "主键ID"
varchar bill_code UK "账单编号"
varchar bill_month "账期"
decimal water_usage "用水量"
decimal water_fee "水费金额"
decimal sewage_fee "污水处理费"
decimal other_fee "其他费用"
decimal total_amount "总金额"
date due_date "缴费截止日期"
tinyint bill_status "账单状态"
bigint customer_id FK "客户ID"
bigint meter_id FK "水表ID"
bigint reading_id FK "抄表记录ID"
bigint tenant_id "租户ID"
varchar creator "创建者"
datetime create_time "创建时间"
varchar updater "更新者"
datetime update_time "更新时间"
tinyint deleted "是否删除"
}
WATER_PAYMENT {
bigint id PK "主键ID"
varchar payment_code UK "缴费记录编号"
varchar payment_type "缴费类型"
varchar payment_channel "缴费渠道"
decimal payment_amount "缴费金额"
datetime payment_time "缴费时间"
varchar transaction_no "交易流水号"
varchar operator_id "操作员ID"
varchar remark "备注"
tinyint payment_status "缴费状态"
bigint bill_id FK "账单ID"
bigint customer_id FK "客户ID"
bigint tenant_id "租户ID"
varchar creator "创建者"
datetime create_time "创建时间"
varchar updater "更新者"
datetime update_time "更新时间"
tinyint deleted "是否删除"
}
WATER_METER_READING ||--|| WATER_BILL : "生成"
WATER_BILL ||--o{ WATER_PAYMENT : "对应"
```
- **抄表记录**:存储水表抄读记录
- **账单信息**:存储客户水费账单
- **缴费记录**:存储客户缴费记录
- **调价记录**:存储水价调整记录
### 3. 表务管理模块ER图
### 3.3 表务实体
```mermaid
erDiagram
WATER_METER_ARCHIVE {
bigint id PK "主键ID"
varchar archive_code UK "档案编号"
varchar manufacturer "生产厂家"
date production_date "生产日期"
int valid_period "有效期(月)"
date verification_date "检定日期"
date next_verification_date "下次检定日期"
varchar certificate_no "检定证书号"
tinyint archive_status "档案状态"
bigint meter_id FK "水表ID"
bigint tenant_id "租户ID"
varchar creator "创建者"
datetime create_time "创建时间"
varchar updater "更新者"
datetime update_time "更新时间"
tinyint deleted "是否删除"
}
WATER_METER_WORKORDER {
bigint id PK "主键ID"
varchar workorder_code UK "工单编号"
varchar workorder_type "工单类型"
varchar workorder_status "工单状态"
date apply_date "申请日期"
date plan_date "计划执行日期"
date execute_date "实际执行日期"
varchar applicant_id "申请人ID"
varchar executor_id "执行人ID"
varchar reason "申请原因"
varchar result "执行结果"
bigint meter_id FK "水表ID"
bigint customer_id FK "客户ID"
bigint tenant_id "租户ID"
varchar creator "创建者"
datetime create_time "创建时间"
varchar updater "更新者"
datetime update_time "更新时间"
tinyint deleted "是否删除"
}
WATER_METER_STOCK {
bigint id PK "主键ID"
varchar stock_code UK "库存编号"
varchar warehouse_code "仓库编码"
varchar warehouse_name "仓库名称"
int stock_quantity "库存数量"
int min_stock "最小库存"
int max_stock "最大库存"
varchar meter_model "水表型号"
varchar meter_caliber "水表口径"
tinyint stock_status "库存状态"
bigint tenant_id "租户ID"
varchar creator "创建者"
datetime create_time "创建时间"
varchar updater "更新者"
datetime update_time "更新时间"
tinyint deleted "是否删除"
}
WATER_METER ||--|| WATER_METER_ARCHIVE : "对应"
WATER_METER ||--o{ WATER_METER_WORKORDER : "产生"
```
- **水表档案**:存储水表的完整信息和生命周期
- **表务工单**:存储表务作业工单信息
- **仓库信息**:存储水表仓库信息
- **出入库记录**:存储水表出入库记录
### 4. 系统管理模块ER图
### 3.4 报装实体
```mermaid
erDiagram
SYSTEM_TENANT {
bigint id PK "主键ID"
varchar tenant_name "租户名称"
varchar tenant_code UK "租户编码"
varchar contact_name "联系人"
varchar contact_phone "联系电话"
varchar contact_email "联系邮箱"
tinyint tenant_status "租户状态"
datetime expire_time "过期时间"
varchar domain "域名"
varchar package_name "套餐名称"
int user_count "用户数量"
varchar creator "创建者"
datetime create_time "创建时间"
varchar updater "更新者"
datetime update_time "更新时间"
tinyint deleted "是否删除"
}
SYSTEM_USERS {
bigint id PK "主键ID"
varchar username UK "用户名"
varchar password "密码"
varchar nickname "昵称"
varchar remark "备注"
varchar dept_id "部门ID"
varchar post_ids "岗位ID列表"
varchar email "邮箱"
varchar mobile "手机号"
tinyint sex "性别"
varchar avatar "头像"
tinyint status "状态"
datetime login_date "最后登录时间"
varchar login_ip "最后登录IP"
bigint tenant_id "租户ID"
varchar creator "创建者"
datetime create_time "创建时间"
varchar updater "更新者"
datetime update_time "更新时间"
tinyint deleted "是否删除"
}
SYSTEM_TENANT ||--o{ SYSTEM_USERS : "包含"
```
- **报装申请**:存储新用户报装申请信息
- **报装工单**:存储报装作业工单信息
- **施工记录**:存储报装施工记录
- **验收记录**:存储报装验收记录
### 3.5 系统管理实体
- **组织机构**:存储系统组织机构信息
- **用户信息**:存储系统用户信息
- **角色权限**:存储系统角色和权限信息
- **系统日志**:存储系统操作日志
## 4. 表结构设计
## 四、数据表结构设计
以下是系统主要表结构设计,按业务模块划分:
@ -249,6 +476,115 @@
| CREATE_TIME | DATETIME | - | 否 | 否 | 创建时间 |
| UPDATE_TIME | DATETIME | - | 是 | 否 | 更新时间 |
## 五、完整DDL语句
### 1. 客户管理相关表DDL
#### 1.1 客户基本信息表
```sql
CREATE TABLE `water_customer` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`customer_code` varchar(32) NOT NULL COMMENT '客户编号',
`customer_name` varchar(100) NOT NULL COMMENT '客户名称',
`customer_type` varchar(20) NOT NULL COMMENT '客户类型(居民:RESIDENT,非居民:NON_RESIDENT,工业:INDUSTRIAL,行政:ADMINISTRATIVE)',
`id_type` varchar(20) DEFAULT NULL COMMENT '证件类型(身份证:ID_CARD,营业执照:BUSINESS_LICENSE)',
`id_number` varchar(30) DEFAULT NULL COMMENT '证件号码',
`phone` varchar(20) DEFAULT NULL COMMENT '联系电话',
`mobile` varchar(20) DEFAULT NULL COMMENT '手机号码',
`email` varchar(100) DEFAULT NULL COMMENT '邮箱',
`address` varchar(500) DEFAULT NULL COMMENT '详细地址',
`area_code` varchar(20) DEFAULT NULL COMMENT '行政区划代码',
`postal_code` varchar(10) DEFAULT NULL COMMENT '邮政编码',
`contact_person` varchar(50) DEFAULT NULL COMMENT '联系人',
`bank_account` varchar(50) DEFAULT NULL COMMENT '银行账户',
`bank_name` varchar(100) DEFAULT NULL COMMENT '开户银行',
`remark` varchar(500) DEFAULT NULL COMMENT '备注信息',
`status` tinyint NOT NULL DEFAULT '1' COMMENT '状态(0:停用,1:正常,2:欠费,3:销户)',
`tenant_id` bigint NOT NULL DEFAULT '0' COMMENT '租户ID',
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_customer_code` (`customer_code`, `tenant_id`),
KEY `idx_customer_name` (`customer_name`),
KEY `idx_phone` (`phone`),
KEY `idx_id_number` (`id_number`),
KEY `idx_tenant_customer_type` (`tenant_id`, `customer_type`),
KEY `idx_status` (`status`),
KEY `idx_create_time` (`create_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='客户基本信息表';
```
#### 1.2 水表信息表
```sql
CREATE TABLE `water_meter` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`meter_code` varchar(32) NOT NULL COMMENT '水表编号',
`meter_no` varchar(30) DEFAULT NULL COMMENT '水表表号',
`meter_type` varchar(20) NOT NULL COMMENT '水表类型(机械:MECHANICAL,智能:SMART,远传:REMOTE)',
`meter_model` varchar(50) DEFAULT NULL COMMENT '水表型号',
`meter_caliber` varchar(10) DEFAULT NULL COMMENT '水表口径(15mm,20mm,25mm等)',
`manufacturer` varchar(100) DEFAULT NULL COMMENT '生产厂家',
`production_date` date DEFAULT NULL COMMENT '生产日期',
`install_date` date DEFAULT NULL COMMENT '安装日期',
`install_position` varchar(500) DEFAULT NULL COMMENT '安装位置',
`longitude` decimal(10,7) DEFAULT NULL COMMENT '经度',
`latitude` decimal(10,7) DEFAULT NULL COMMENT '纬度',
`initial_reading` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '初始读数',
`current_reading` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '当前读数',
`reading_cycle` varchar(20) NOT NULL DEFAULT 'MONTHLY' COMMENT '抄表周期(月度:MONTHLY,双月:BIMONTHLY,季度:QUARTERLY)',
`book_code` varchar(32) DEFAULT NULL COMMENT '册本编号',
`reading_route` varchar(100) DEFAULT NULL COMMENT '抄表路线',
`meter_status` tinyint NOT NULL DEFAULT '1' COMMENT '水表状态(0:停用,1:正常,2:故障,3:拆除)',
`customer_id` bigint NOT NULL COMMENT '客户ID',
`tenant_id` bigint NOT NULL DEFAULT '0' COMMENT '租户ID',
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_meter_code` (`meter_code`, `tenant_id`),
KEY `idx_meter_no` (`meter_no`),
KEY `idx_customer_id` (`customer_id`),
KEY `idx_book_code` (`book_code`),
KEY `idx_meter_type` (`meter_type`),
KEY `idx_meter_status` (`meter_status`),
KEY `idx_tenant_status` (`tenant_id`, `meter_status`),
CONSTRAINT `fk_meter_customer` FOREIGN KEY (`customer_id`) REFERENCES `water_customer` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='水表信息表';
```
### 2. 基础数据初始化脚本
```sql
-- 插入基础字典数据
INSERT INTO `water_dict_data` (`dict_type`, `dict_label`, `dict_value`, `dict_sort`, `status`, `remark`) VALUES
('customer_type', '居民用户', 'RESIDENT', 1, 1, '居民生活用水'),
('customer_type', '非居民用户', 'NON_RESIDENT', 2, 1, '非居民用水'),
('customer_type', '工业用户', 'INDUSTRIAL', 3, 1, '工业生产用水'),
('customer_type', '行政用户', 'ADMINISTRATIVE', 4, 1, '行政事业单位用水'),
('meter_type', '机械水表', 'MECHANICAL', 1, 1, '传统机械式水表'),
('meter_type', '智能水表', 'SMART', 2, 1, '智能电子水表'),
('meter_type', '远传水表', 'REMOTE', 3, 1, '远程传输水表'),
('reading_type', '人工抄表', 'MANUAL', 1, 1, '抄表员现场抄表'),
('reading_type', '远程抄表', 'REMOTE', 2, 1, '远程自动抄表'),
('reading_type', '客户自报', 'SELF_REPORT', 3, 1, '客户自主上报'),
('reading_type', '估算抄表', 'ESTIMATE', 4, 1, '估算用水量'),
('payment_channel', '现金', 'CASH', 1, 1, '现金缴费'),
('payment_channel', '银行卡', 'BANK_CARD', 2, 1, '银行卡刷卡'),
('payment_channel', '微信支付', 'WECHAT', 3, 1, '微信在线支付'),
('payment_channel', '支付宝', 'ALIPAY', 4, 1, '支付宝在线支付'),
('payment_channel', '银行代扣', 'BANK_DEDUCT', 5, 1, '银行自动代扣');
```
#### 4.3.2 表务工单表(TB_METER_WORKORDER)
| 字段名 | 数据类型 | 长度 | 是否为空 | 主键 | 描述 |
@ -269,7 +605,354 @@
| CREATE_TIME | DATETIME | - | 否 | 否 | 创建时间 |
| UPDATE_TIME | DATETIME | - | 是 | 否 | 更新时间 |
## 5. 索引设计
## 五、完整DDL语句
### 1. 客户管理相关表DDL
#### 1.1 客户基本信息表
```sql
CREATE TABLE `water_customer` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`customer_code` varchar(32) NOT NULL COMMENT '客户编号',
`customer_name` varchar(100) NOT NULL COMMENT '客户名称',
`customer_type` varchar(20) NOT NULL COMMENT '客户类型(居民:RESIDENT,非居民:NON_RESIDENT,工业:INDUSTRIAL,行政:ADMINISTRATIVE)',
`id_type` varchar(20) DEFAULT NULL COMMENT '证件类型(身份证:ID_CARD,营业执照:BUSINESS_LICENSE)',
`id_number` varchar(30) DEFAULT NULL COMMENT '证件号码',
`phone` varchar(20) DEFAULT NULL COMMENT '联系电话',
`mobile` varchar(20) DEFAULT NULL COMMENT '手机号码',
`email` varchar(100) DEFAULT NULL COMMENT '邮箱',
`address` varchar(500) DEFAULT NULL COMMENT '详细地址',
`area_code` varchar(20) DEFAULT NULL COMMENT '行政区划代码',
`postal_code` varchar(10) DEFAULT NULL COMMENT '邮政编码',
`contact_person` varchar(50) DEFAULT NULL COMMENT '联系人',
`bank_account` varchar(50) DEFAULT NULL COMMENT '银行账户',
`bank_name` varchar(100) DEFAULT NULL COMMENT '开户银行',
`remark` varchar(500) DEFAULT NULL COMMENT '备注信息',
`status` tinyint NOT NULL DEFAULT '1' COMMENT '状态(0:停用,1:正常,2:欠费,3:销户)',
`tenant_id` bigint NOT NULL DEFAULT '0' COMMENT '租户ID',
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_customer_code` (`customer_code`, `tenant_id`),
KEY `idx_customer_name` (`customer_name`),
KEY `idx_phone` (`phone`),
KEY `idx_id_number` (`id_number`),
KEY `idx_tenant_customer_type` (`tenant_id`, `customer_type`),
KEY `idx_status` (`status`),
KEY `idx_create_time` (`create_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='客户基本信息表';
```
#### 1.2 水表信息表
```sql
CREATE TABLE `water_meter` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`meter_code` varchar(32) NOT NULL COMMENT '水表编号',
`meter_no` varchar(30) DEFAULT NULL COMMENT '水表表号',
`meter_type` varchar(20) NOT NULL COMMENT '水表类型(机械:MECHANICAL,智能:SMART,远传:REMOTE)',
`meter_model` varchar(50) DEFAULT NULL COMMENT '水表型号',
`meter_caliber` varchar(10) DEFAULT NULL COMMENT '水表口径(15mm,20mm,25mm等)',
`manufacturer` varchar(100) DEFAULT NULL COMMENT '生产厂家',
`production_date` date DEFAULT NULL COMMENT '生产日期',
`install_date` date DEFAULT NULL COMMENT '安装日期',
`install_position` varchar(500) DEFAULT NULL COMMENT '安装位置',
`longitude` decimal(10,7) DEFAULT NULL COMMENT '经度',
`latitude` decimal(10,7) DEFAULT NULL COMMENT '纬度',
`initial_reading` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '初始读数',
`current_reading` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '当前读数',
`reading_cycle` varchar(20) NOT NULL DEFAULT 'MONTHLY' COMMENT '抄表周期(月度:MONTHLY,双月:BIMONTHLY,季度:QUARTERLY)',
`book_code` varchar(32) DEFAULT NULL COMMENT '册本编号',
`reading_route` varchar(100) DEFAULT NULL COMMENT '抄表路线',
`meter_status` tinyint NOT NULL DEFAULT '1' COMMENT '水表状态(0:停用,1:正常,2:故障,3:拆除)',
`customer_id` bigint NOT NULL COMMENT '客户ID',
`tenant_id` bigint NOT NULL DEFAULT '0' COMMENT '租户ID',
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_meter_code` (`meter_code`, `tenant_id`),
KEY `idx_meter_no` (`meter_no`),
KEY `idx_customer_id` (`customer_id`),
KEY `idx_book_code` (`book_code`),
KEY `idx_meter_type` (`meter_type`),
KEY `idx_meter_status` (`meter_status`),
KEY `idx_tenant_status` (`tenant_id`, `meter_status`),
CONSTRAINT `fk_meter_customer` FOREIGN KEY (`customer_id`) REFERENCES `water_customer` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='水表信息表';
```
#### 1.3 客户账户表
```sql
CREATE TABLE `water_customer_account` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`account_code` varchar(32) NOT NULL COMMENT '账户编号',
`balance` decimal(12,2) NOT NULL DEFAULT '0.00' COMMENT '账户余额',
`credit_amount` decimal(12,2) DEFAULT '0.00' COMMENT '信用额度',
`deposit_amount` decimal(12,2) DEFAULT '0.00' COMMENT '保证金',
`frozen_amount` decimal(12,2) DEFAULT '0.00' COMMENT '冻结金额',
`last_payment_date` date DEFAULT NULL COMMENT '最近缴费日期',
`last_payment_amount` decimal(12,2) DEFAULT NULL COMMENT '最近缴费金额',
`arrears_amount` decimal(12,2) DEFAULT '0.00' COMMENT '欠费金额',
`arrears_months` int DEFAULT '0' COMMENT '欠费月数',
`account_status` tinyint NOT NULL DEFAULT '1' COMMENT '账户状态(0:停用,1:正常,2:欠费,3:冻结)',
`customer_id` bigint NOT NULL COMMENT '客户ID',
`tenant_id` bigint NOT NULL DEFAULT '0' COMMENT '租户ID',
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_account_code` (`account_code`, `tenant_id`),
UNIQUE KEY `uk_customer_account` (`customer_id`, `tenant_id`),
KEY `idx_account_status` (`account_status`),
KEY `idx_balance` (`balance`),
KEY `idx_arrears` (`arrears_amount`),
CONSTRAINT `fk_account_customer` FOREIGN KEY (`customer_id`) REFERENCES `water_customer` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='客户账户信息表';
```
### 2. 营收管理相关表DDL
#### 2.1 抄表记录表
```sql
CREATE TABLE `water_meter_reading` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`reading_code` varchar(32) NOT NULL COMMENT '抄表记录编号',
`reading_date` date NOT NULL COMMENT '抄表日期',
`reading_time` datetime DEFAULT NULL COMMENT '抄表时间',
`reading_value` decimal(10,2) NOT NULL COMMENT '抄表读数',
`prev_reading_value` decimal(10,2) DEFAULT NULL COMMENT '上次读数',
`water_usage` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '用水量',
`reading_type` varchar(20) NOT NULL COMMENT '抄表类型(手工:MANUAL,远传:REMOTE,自报:SELF_REPORT,估算:ESTIMATE)',
`reading_method` varchar(20) DEFAULT NULL COMMENT '抄表方式(现场:FIELD,拍照:PHOTO,NFC:NFC,扫码:SCAN)',
`reader_id` varchar(20) DEFAULT NULL COMMENT '抄表员ID',
`reader_name` varchar(50) DEFAULT NULL COMMENT '抄表员姓名',
`photo_url` varchar(255) DEFAULT NULL COMMENT '抄表照片URL',
`reading_location` varchar(200) DEFAULT NULL COMMENT '抄表位置',
`abnormal_flag` tinyint DEFAULT '0' COMMENT '异常标识(0:正常,1:异常)',
`abnormal_reason` varchar(200) DEFAULT NULL COMMENT '异常原因',
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
`reading_status` tinyint NOT NULL DEFAULT '0' COMMENT '状态(0:未复核,1:已复核,2:已开账,3:作废)',
`meter_id` bigint NOT NULL COMMENT '水表ID',
`customer_id` bigint NOT NULL COMMENT '客户ID',
`tenant_id` bigint NOT NULL DEFAULT '0' COMMENT '租户ID',
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_reading_code` (`reading_code`, `tenant_id`),
KEY `idx_meter_reading_date` (`meter_id`, `reading_date`),
KEY `idx_reading_date` (`reading_date`),
KEY `idx_reader_id` (`reader_id`),
KEY `idx_reading_status` (`reading_status`),
KEY `idx_customer_id` (`customer_id`),
KEY `idx_tenant_meter_date` (`tenant_id`, `meter_id`, `reading_date`),
CONSTRAINT `fk_reading_meter` FOREIGN KEY (`meter_id`) REFERENCES `water_meter` (`id`),
CONSTRAINT `fk_reading_customer` FOREIGN KEY (`customer_id`) REFERENCES `water_customer` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='抄表记录表';
```
#### 2.2 水费账单表
```sql
CREATE TABLE `water_bill` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`bill_code` varchar(32) NOT NULL COMMENT '账单编号',
`bill_month` varchar(7) NOT NULL COMMENT '账期(格式:YYYY-MM)',
`bill_date` date NOT NULL COMMENT '开账日期',
`water_usage` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '用水量',
`prev_reading` decimal(10,2) DEFAULT NULL COMMENT '上期读数',
`current_reading` decimal(10,2) DEFAULT NULL COMMENT '本期读数',
`reading_days` int DEFAULT NULL COMMENT '抄表间隔天数',
`water_price` decimal(8,4) DEFAULT NULL COMMENT '水价单价',
`water_fee` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '水费金额',
`sewage_fee` decimal(10,2) DEFAULT '0.00' COMMENT '污水处理费',
`garbage_fee` decimal(10,2) DEFAULT '0.00' COMMENT '垃圾处理费',
`other_fee` decimal(10,2) DEFAULT '0.00' COMMENT '其他费用',
`adjustment_fee` decimal(10,2) DEFAULT '0.00' COMMENT '调整费用',
`late_fee` decimal(10,2) DEFAULT '0.00' COMMENT '滞纳金',
`total_amount` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '总金额',
`paid_amount` decimal(10,2) DEFAULT '0.00' COMMENT '已缴金额',
`balance_amount` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '余额',
`due_date` date NOT NULL COMMENT '缴费截止日期',
`billing_type` varchar(20) DEFAULT 'NORMAL' COMMENT '开账类型(正常:NORMAL,追补:SUPPLEMENT,调整:ADJUSTMENT)',
`bill_status` tinyint NOT NULL DEFAULT '0' COMMENT '账单状态(0:未缴费,1:已缴费,2:部分缴费,3:作废)',
`payment_status` tinyint DEFAULT '0' COMMENT '缴费状态(0:未缴,1:已缴,2:部分缴费)',
`customer_id` bigint NOT NULL COMMENT '客户ID',
`meter_id` bigint NOT NULL COMMENT '水表ID',
`reading_id` bigint DEFAULT NULL COMMENT '抄表记录ID',
`tenant_id` bigint NOT NULL DEFAULT '0' COMMENT '租户ID',
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_bill_code` (`bill_code`, `tenant_id`),
KEY `idx_customer_bill_month` (`customer_id`, `bill_month`),
KEY `idx_meter_bill_month` (`meter_id`, `bill_month`),
KEY `idx_bill_status` (`bill_status`),
KEY `idx_due_date` (`due_date`),
KEY `idx_tenant_customer_month` (`tenant_id`, `customer_id`, `bill_month`),
CONSTRAINT `fk_bill_customer` FOREIGN KEY (`customer_id`) REFERENCES `water_customer` (`id`),
CONSTRAINT `fk_bill_meter` FOREIGN KEY (`meter_id`) REFERENCES `water_meter` (`id`),
CONSTRAINT `fk_bill_reading` FOREIGN KEY (`reading_id`) REFERENCES `water_meter_reading` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='水费账单表';
```
#### 2.3 缴费记录表
```sql
CREATE TABLE `water_payment` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`payment_code` varchar(32) NOT NULL COMMENT '缴费记录编号',
`payment_type` varchar(20) NOT NULL COMMENT '缴费类型(正常缴费:NORMAL,预存:PREPAID,退费:REFUND)',
`payment_channel` varchar(20) NOT NULL COMMENT '缴费渠道(现金:CASH,银行卡:BANK_CARD,微信:WECHAT,支付宝:ALIPAY,银行代扣:BANK_DEDUCT)',
`payment_amount` decimal(10,2) NOT NULL COMMENT '缴费金额',
`actual_amount` decimal(10,2) DEFAULT NULL COMMENT '实收金额',
`change_amount` decimal(10,2) DEFAULT '0.00' COMMENT '找零金额',
`payment_time` datetime NOT NULL COMMENT '缴费时间',
`transaction_no` varchar(50) DEFAULT NULL COMMENT '交易流水号',
`third_party_no` varchar(50) DEFAULT NULL COMMENT '第三方交易号',
`operator_id` varchar(20) DEFAULT NULL COMMENT '操作员ID',
`operator_name` varchar(50) DEFAULT NULL COMMENT '操作员姓名',
`outlet_code` varchar(20) DEFAULT NULL COMMENT '营业网点代码',
`pos_machine_no` varchar(20) DEFAULT NULL COMMENT 'POS机编号',
`invoice_no` varchar(30) DEFAULT NULL COMMENT '发票号码',
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
`payment_status` tinyint NOT NULL DEFAULT '1' COMMENT '缴费状态(0:待确认,1:成功,2:失败,3:退费)',
`bill_id` bigint DEFAULT NULL COMMENT '账单ID',
`customer_id` bigint NOT NULL COMMENT '客户ID',
`tenant_id` bigint NOT NULL DEFAULT '0' COMMENT '租户ID',
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_payment_code` (`payment_code`, `tenant_id`),
KEY `idx_customer_payment_time` (`customer_id`, `payment_time`),
KEY `idx_payment_time` (`payment_time`),
KEY `idx_transaction_no` (`transaction_no`),
KEY `idx_operator_id` (`operator_id`),
KEY `idx_payment_status` (`payment_status`),
KEY `idx_bill_id` (`bill_id`),
CONSTRAINT `fk_payment_customer` FOREIGN KEY (`customer_id`) REFERENCES `water_customer` (`id`),
CONSTRAINT `fk_payment_bill` FOREIGN KEY (`bill_id`) REFERENCES `water_bill` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='缴费记录表';
```
### 3. 表务管理相关表DDL
#### 3.1 水表档案表
```sql
CREATE TABLE `water_meter_archive` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`archive_code` varchar(32) NOT NULL COMMENT '档案编号',
`manufacturer` varchar(100) DEFAULT NULL COMMENT '生产厂家',
`production_date` date DEFAULT NULL COMMENT '生产日期',
`valid_period` int DEFAULT '72' COMMENT '有效期(月)',
`verification_date` date DEFAULT NULL COMMENT '检定日期',
`next_verification_date` date DEFAULT NULL COMMENT '下次检定日期',
`certificate_no` varchar(50) DEFAULT NULL COMMENT '检定证书号',
`verification_agency` varchar(100) DEFAULT NULL COMMENT '检定机构',
`accuracy_level` varchar(10) DEFAULT NULL COMMENT '精度等级',
`max_flow` decimal(8,2) DEFAULT NULL COMMENT '最大流量',
`nominal_flow` decimal(8,2) DEFAULT NULL COMMENT '常用流量',
`min_flow` decimal(8,2) DEFAULT NULL COMMENT '最小流量',
`working_pressure` decimal(8,2) DEFAULT NULL COMMENT '工作压力',
`purchase_date` date DEFAULT NULL COMMENT '采购日期',
`purchase_price` decimal(10,2) DEFAULT NULL COMMENT '采购价格',
`supplier` varchar(100) DEFAULT NULL COMMENT '供应商',
`warranty_period` int DEFAULT '24' COMMENT '质保期(月)',
`installation_cost` decimal(10,2) DEFAULT NULL COMMENT '安装费用',
`archive_status` tinyint NOT NULL DEFAULT '1' COMMENT '档案状态(0:停用,1:正常,2:报废)',
`meter_id` bigint NOT NULL COMMENT '水表ID',
`tenant_id` bigint NOT NULL DEFAULT '0' COMMENT '租户ID',
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_archive_code` (`archive_code`, `tenant_id`),
UNIQUE KEY `uk_meter_archive` (`meter_id`, `tenant_id`),
KEY `idx_manufacturer` (`manufacturer`),
KEY `idx_verification_date` (`verification_date`),
KEY `idx_next_verification_date` (`next_verification_date`),
KEY `idx_archive_status` (`archive_status`),
CONSTRAINT `fk_archive_meter` FOREIGN KEY (`meter_id`) REFERENCES `water_meter` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='水表档案表';
```
### 4. 系统管理相关表DDL
#### 4.1 数据字典表
```sql
CREATE TABLE `water_dict_data` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`dict_type` varchar(100) NOT NULL COMMENT '字典类型',
`dict_label` varchar(100) NOT NULL COMMENT '字典标签',
`dict_value` varchar(100) NOT NULL COMMENT '字典键值',
`dict_sort` int NOT NULL DEFAULT '0' COMMENT '字典排序',
`color_type` varchar(100) DEFAULT '' COMMENT '颜色类型',
`css_class` varchar(100) DEFAULT '' COMMENT 'CSS类名',
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
`status` tinyint NOT NULL DEFAULT '1' COMMENT '状态(0:停用,1:正常)',
`tenant_id` bigint NOT NULL DEFAULT '0' COMMENT '租户ID',
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
PRIMARY KEY (`id`),
KEY `idx_dict_type` (`dict_type`),
KEY `idx_dict_value` (`dict_value`),
KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='数据字典表';
```
### 5. 初始化数据脚本
```sql
-- 插入基础字典数据
INSERT INTO `water_dict_data` (`dict_type`, `dict_label`, `dict_value`, `dict_sort`, `status`, `remark`) VALUES
('customer_type', '居民用户', 'RESIDENT', 1, 1, '居民生活用水'),
('customer_type', '非居民用户', 'NON_RESIDENT', 2, 1, '非居民用水'),
('customer_type', '工业用户', 'INDUSTRIAL', 3, 1, '工业生产用水'),
('customer_type', '行政用户', 'ADMINISTRATIVE', 4, 1, '行政事业单位用水'),
('meter_type', '机械水表', 'MECHANICAL', 1, 1, '传统机械式水表'),
('meter_type', '智能水表', 'SMART', 2, 1, '智能电子水表'),
('meter_type', '远传水表', 'REMOTE', 3, 1, '远程传输水表'),
('reading_type', '人工抄表', 'MANUAL', 1, 1, '抄表员现场抄表'),
('reading_type', '远程抄表', 'REMOTE', 2, 1, '远程自动抄表'),
('reading_type', '客户自报', 'SELF_REPORT', 3, 1, '客户自主上报'),
('reading_type', '估算抄表', 'ESTIMATE', 4, 1, '估算用水量'),
('payment_channel', '现金', 'CASH', 1, 1, '现金缴费'),
('payment_channel', '银行卡', 'BANK_CARD', 2, 1, '银行卡刷卡'),
('payment_channel', '微信支付', 'WECHAT', 3, 1, '微信在线支付'),
('payment_channel', '支付宝', 'ALIPAY', 4, 1, '支付宝在线支付'),
('payment_channel', '银行代扣', 'BANK_DEDUCT', 5, 1, '银行自动代扣');
```
## 六、索引设计
为提高系统性能,针对主要查询场景设计了以下索引:

View File

@ -1,4 +1,14 @@
# 福建水务业务系统部署设计
# 福建水务营收系统部署设计文档
## 文档信息
| 项目信息 | 详情 |
|---------|------|
| **项目名称** | 福建水务营收系统 |
| **文档类型** | 概要设计文档 |
| **技术框架** | RuoYi-Vue-Pro + yudao-ui-admin-vue3 |
| **文档版本** | v1.0 |
| **编写日期** | 2024-12-19 |
| **文档状态** | 🟡 进行中 |
## 目录
- [1. 部署概述](#1-部署概述)
@ -334,4 +344,850 @@
- 系统宕机应急预案
- 网络故障应急预案
- 数据丢失应急预案
- 安全事件应急预案
- 安全事件应急预案
## 8. 容器化部署方案
### 8.1 Docker Compose部署
#### 8.1.1 完整部署配置
```yaml
# docker-compose.yml
version: '3.8'
services:
# MySQL 数据库
water-mysql:
image: mysql:8.0
container_name: water-mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: "water_root_2024"
MYSQL_DATABASE: "ruoyi_water"
MYSQL_USER: "water_user"
MYSQL_PASSWORD: "water_pass_2024"
TZ: "Asia/Shanghai"
volumes:
- ./data/mysql:/var/lib/mysql
- ./sql:/docker-entrypoint-initdb.d
- ./config/mysql/my.cnf:/etc/mysql/conf.d/my.cnf
ports:
- "3306:3306"
command:
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_unicode_ci
- --default-time-zone=+8:00
networks:
- water-network
# Redis 缓存
water-redis:
image: redis:7.0-alpine
container_name: water-redis
restart: always
volumes:
- ./data/redis:/data
- ./config/redis/redis.conf:/etc/redis/redis.conf
ports:
- "6379:6379"
command: redis-server /etc/redis/redis.conf
networks:
- water-network
# 后端应用
water-server:
build:
context: ./water-server
dockerfile: Dockerfile
container_name: water-server
restart: always
depends_on:
- water-mysql
- water-redis
environment:
- SPRING_PROFILES_ACTIVE=prod
- SPRING_DATASOURCE_URL=jdbc:mysql://water-mysql:3306/ruoyi_water?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
- SPRING_DATASOURCE_USERNAME=water_user
- SPRING_DATASOURCE_PASSWORD=water_pass_2024
- SPRING_REDIS_HOST=water-redis
- SPRING_REDIS_PORT=6379
- SERVER_PORT=8080
volumes:
- ./logs:/app/logs
- ./upload:/app/upload
ports:
- "8080:8080"
networks:
- water-network
# 前端应用
water-ui:
build:
context: ./water-ui
dockerfile: Dockerfile
container_name: water-ui
restart: always
depends_on:
- water-server
volumes:
- ./config/nginx/nginx.conf:/etc/nginx/nginx.conf
- ./config/nginx/conf.d:/etc/nginx/conf.d
ports:
- "80:80"
- "443:443"
networks:
- water-network
# Nginx 反向代理
water-nginx:
image: nginx:1.24-alpine
container_name: water-nginx
restart: always
depends_on:
- water-server
- water-ui
volumes:
- ./config/nginx/nginx.conf:/etc/nginx/nginx.conf
- ./config/nginx/conf.d:/etc/nginx/conf.d
- ./ssl:/etc/nginx/ssl
- ./logs/nginx:/var/log/nginx
ports:
- "80:80"
- "443:443"
networks:
- water-network
# MinIO 文件存储
water-minio:
image: minio/minio:latest
container_name: water-minio
restart: always
environment:
MINIO_ACCESS_KEY: "admin"
MINIO_SECRET_KEY: "admin123456"
volumes:
- ./data/minio:/data
ports:
- "9000:9000"
- "9001:9001"
command: server /data --console-address ":9001"
networks:
- water-network
networks:
water-network:
driver: bridge
volumes:
mysql-data:
redis-data:
minio-data:
```
#### 8.1.2 后端应用Dockerfile
```dockerfile
# water-server/Dockerfile
FROM openjdk:17-jdk-slim
LABEL maintainer="fujian-water-dev-team"
# 设置工作目录
WORKDIR /app
# 设置时区
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 添加应用jar包
COPY target/water-server.jar app.jar
# 创建日志目录
RUN mkdir -p /app/logs
# 暴露端口
EXPOSE 8080
# 启动应用
ENTRYPOINT ["java", "-jar", "-Xmx1024m", "-Xms512m", "-Dspring.profiles.active=prod", "/app/app.jar"]
```
#### 8.1.3 前端应用Dockerfile
```dockerfile
# water-ui/Dockerfile
# 构建阶段
FROM node:18-alpine AS builder
WORKDIR /app
# 复制包管理文件
COPY package*.json ./
# 安装依赖
RUN npm ci --only=production
# 复制源代码
COPY . .
# 构建应用
RUN npm run build:prod
# 生产阶段
FROM nginx:1.24-alpine
# 复制构建产物
COPY --from=builder /app/dist /usr/share/nginx/html
# 复制nginx配置
COPY nginx.conf /etc/nginx/nginx.conf
# 暴露端口
EXPOSE 80
# 启动nginx
CMD ["nginx", "-g", "daemon off;"]
```
### 8.2 Kubernetes部署
#### 8.2.1 命名空间配置
```yaml
# k8s/namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
name: water-system
labels:
name: water-system
```
#### 8.2.2 MySQL部署配置
```yaml
# k8s/mysql-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: water-mysql
namespace: water-system
spec:
replicas: 1
selector:
matchLabels:
app: water-mysql
template:
metadata:
labels:
app: water-mysql
spec:
containers:
- name: mysql
image: mysql:8.0
env:
- name: MYSQL_ROOT_PASSWORD
value: "water_root_2024"
- name: MYSQL_DATABASE
value: "ruoyi_water"
- name: MYSQL_USER
value: "water_user"
- name: MYSQL_PASSWORD
value: "water_pass_2024"
- name: TZ
value: "Asia/Shanghai"
ports:
- containerPort: 3306
volumeMounts:
- name: mysql-storage
mountPath: /var/lib/mysql
- name: mysql-config
mountPath: /etc/mysql/conf.d
volumes:
- name: mysql-storage
persistentVolumeClaim:
claimName: mysql-pvc
- name: mysql-config
configMap:
name: mysql-config
---
apiVersion: v1
kind: Service
metadata:
name: water-mysql-service
namespace: water-system
spec:
selector:
app: water-mysql
ports:
- protocol: TCP
port: 3306
targetPort: 3306
type: ClusterIP
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pvc
namespace: water-system
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi
storageClassName: fast-ssd
```
#### 8.2.3 Redis部署配置
```yaml
# k8s/redis-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: water-redis
namespace: water-system
spec:
replicas: 1
selector:
matchLabels:
app: water-redis
template:
metadata:
labels:
app: water-redis
spec:
containers:
- name: redis
image: redis:7.0-alpine
ports:
- containerPort: 6379
volumeMounts:
- name: redis-storage
mountPath: /data
- name: redis-config
mountPath: /etc/redis
command:
- redis-server
- /etc/redis/redis.conf
volumes:
- name: redis-storage
persistentVolumeClaim:
claimName: redis-pvc
- name: redis-config
configMap:
name: redis-config
---
apiVersion: v1
kind: Service
metadata:
name: water-redis-service
namespace: water-system
spec:
selector:
app: water-redis
ports:
- protocol: TCP
port: 6379
targetPort: 6379
type: ClusterIP
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: redis-pvc
namespace: water-system
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
storageClassName: fast-ssd
```
#### 8.2.4 应用服务部署配置
```yaml
# k8s/water-server-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: water-server
namespace: water-system
spec:
replicas: 3
selector:
matchLabels:
app: water-server
template:
metadata:
labels:
app: water-server
spec:
containers:
- name: water-server
image: water-server:latest
ports:
- containerPort: 8080
env:
- name: SPRING_PROFILES_ACTIVE
value: "k8s"
- name: SPRING_DATASOURCE_URL
value: "jdbc:mysql://water-mysql-service:3306/ruoyi_water?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8"
- name: SPRING_DATASOURCE_USERNAME
value: "water_user"
- name: SPRING_DATASOURCE_PASSWORD
value: "water_pass_2024"
- name: SPRING_REDIS_HOST
value: "water-redis-service"
- name: SPRING_REDIS_PORT
value: "6379"
resources:
requests:
memory: "512Mi"
cpu: "250m"
limits:
memory: "1Gi"
cpu: "500m"
livenessProbe:
httpGet:
path: /actuator/health
port: 8080
initialDelaySeconds: 60
periodSeconds: 30
readinessProbe:
httpGet:
path: /actuator/health
port: 8080
initialDelaySeconds: 30
periodSeconds: 10
volumeMounts:
- name: upload-storage
mountPath: /app/upload
volumes:
- name: upload-storage
persistentVolumeClaim:
claimName: upload-pvc
---
apiVersion: v1
kind: Service
metadata:
name: water-server-service
namespace: water-system
spec:
selector:
app: water-server
ports:
- protocol: TCP
port: 8080
targetPort: 8080
type: ClusterIP
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: upload-pvc
namespace: water-system
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 10Gi
storageClassName: standard
```
#### 8.2.5 Ingress配置
```yaml
# k8s/ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: water-system-ingress
namespace: water-system
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/ssl-redirect: "true"
nginx.ingress.kubernetes.io/proxy-body-size: 50m
nginx.ingress.kubernetes.io/proxy-connect-timeout: "600"
nginx.ingress.kubernetes.io/proxy-send-timeout: "600"
nginx.ingress.kubernetes.io/proxy-read-timeout: "600"
spec:
tls:
- hosts:
- water.example.com
secretName: water-tls-secret
rules:
- host: water.example.com
http:
paths:
- path: /admin-api
pathType: Prefix
backend:
service:
name: water-server-service
port:
number: 8080
- path: /
pathType: Prefix
backend:
service:
name: water-ui-service
port:
number: 80
```
### 8.3 自动化部署脚本
#### 8.3.1 Docker部署脚本
```bash
#!/bin/bash
# deploy-docker.sh
set -e
echo "=== 福建水务营收系统 Docker 部署脚本 ==="
# 检查Docker环境
if ! command -v docker &> /dev/null; then
echo "错误: Docker未安装请先安装Docker"
exit 1
fi
if ! command -v docker-compose &> /dev/null; then
echo "错误: Docker Compose未安装请先安装Docker Compose"
exit 1
fi
# 创建必要目录
echo "创建数据目录..."
mkdir -p data/{mysql,redis,minio}
mkdir -p logs/{app,nginx}
mkdir -p config/{mysql,redis,nginx/conf.d}
mkdir -p upload
mkdir -p ssl
# 设置MySQL配置
echo "配置MySQL..."
cat > config/mysql/my.cnf << EOF
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
default-time-zone='+8:00'
max_connections=1000
innodb_buffer_pool_size=512M
innodb_log_file_size=128M
slow_query_log=1
slow_query_log_file=/var/lib/mysql/slow.log
long_query_time=3
EOF
# 设置Redis配置
echo "配置Redis..."
cat > config/redis/redis.conf << EOF
port 6379
requirepass water_redis_2024
timeout 300
tcp-keepalive 300
maxmemory 256mb
maxmemory-policy allkeys-lru
save 900 1
save 300 10
save 60 10000
EOF
# 设置Nginx配置
echo "配置Nginx..."
cat > config/nginx/nginx.conf << EOF
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
use epoll;
multi_accept on;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '\$remote_addr - \$remote_user [\$time_local] "\$request" '
'\$status \$body_bytes_sent "\$http_referer" '
'"\$http_user_agent" "\$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
client_max_body_size 50M;
gzip on;
gzip_vary on;
gzip_min_length 1024;
gzip_types text/plain text/css text/xml text/javascript
application/javascript application/xml+rss
application/json;
include /etc/nginx/conf.d/*.conf;
}
EOF
cat > config/nginx/conf.d/water.conf << EOF
upstream water_backend {
server water-server:8080;
}
server {
listen 80;
server_name localhost;
location /admin-api/ {
proxy_pass http://water_backend;
proxy_set_header Host \$host;
proxy_set_header X-Real-IP \$remote_addr;
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto \$scheme;
proxy_connect_timeout 600;
proxy_send_timeout 600;
proxy_read_timeout 600;
}
location / {
proxy_pass http://water-ui;
proxy_set_header Host \$host;
proxy_set_header X-Real-IP \$remote_addr;
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto \$scheme;
}
}
EOF
# 构建和启动服务
echo "构建和启动Docker服务..."
docker-compose down
docker-compose build --no-cache
docker-compose up -d
# 等待服务启动
echo "等待服务启动..."
sleep 30
# 检查服务状态
echo "检查服务状态..."
docker-compose ps
echo "=== 部署完成 ==="
echo "系统访问地址: http://localhost"
echo "API接口地址: http://localhost/admin-api"
echo "MinIO控制台: http://localhost:9001 (admin/admin123456)"
echo ""
echo "查看日志: docker-compose logs -f [服务名]"
echo "停止服务: docker-compose down"
echo "重启服务: docker-compose restart"
```
#### 8.3.2 Kubernetes部署脚本
```bash
#!/bin/bash
# deploy-k8s.sh
set -e
echo "=== 福建水务营收系统 Kubernetes 部署脚本 ==="
# 检查kubectl环境
if ! command -v kubectl &> /dev/null; then
echo "错误: kubectl未安装请先安装kubectl"
exit 1
fi
# 检查集群连接
if ! kubectl cluster-info &> /dev/null; then
echo "错误: 无法连接到Kubernetes集群"
exit 1
fi
# 创建命名空间
echo "创建命名空间..."
kubectl apply -f k8s/namespace.yaml
# 创建ConfigMap
echo "创建配置文件..."
kubectl create configmap mysql-config --from-file=config/mysql/ -n water-system --dry-run=client -o yaml | kubectl apply -f -
kubectl create configmap redis-config --from-file=config/redis/ -n water-system --dry-run=client -o yaml | kubectl apply -f -
# 部署数据层
echo "部署MySQL..."
kubectl apply -f k8s/mysql-deployment.yaml
echo "部署Redis..."
kubectl apply -f k8s/redis-deployment.yaml
# 等待数据层就绪
echo "等待数据层服务就绪..."
kubectl wait --for=condition=ready pod -l app=water-mysql -n water-system --timeout=300s
kubectl wait --for=condition=ready pod -l app=water-redis -n water-system --timeout=300s
# 部署应用层
echo "部署应用服务..."
kubectl apply -f k8s/water-server-deployment.yaml
echo "部署前端服务..."
kubectl apply -f k8s/water-ui-deployment.yaml
# 等待应用层就绪
echo "等待应用服务就绪..."
kubectl wait --for=condition=ready pod -l app=water-server -n water-system --timeout=300s
kubectl wait --for=condition=ready pod -l app=water-ui -n water-system --timeout=300s
# 部署Ingress
echo "部署Ingress..."
kubectl apply -f k8s/ingress.yaml
# 检查部署状态
echo "检查部署状态..."
kubectl get all -n water-system
echo "=== 部署完成 ==="
echo "查看服务状态: kubectl get all -n water-system"
echo "查看日志: kubectl logs -f deployment/water-server -n water-system"
echo "删除部署: kubectl delete namespace water-system"
```
### 8.4 持续集成/持续部署 (CI/CD)
#### 8.4.1 GitHub Actions配置
```yaml
# .github/workflows/deploy.yml
name: Build and Deploy Water System
on:
push:
branches: [ main, develop ]
pull_request:
branches: [ main ]
env:
REGISTRY: docker.io
IMAGE_NAME: water-system
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'temurin'
- name: Cache Maven dependencies
uses: actions/cache@v3
with:
path: ~/.m2
key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }}
restore-keys: ${{ runner.os }}-m2
- name: Run tests
run: mvn clean test
- name: Generate test report
uses: dorny/test-reporter@v1
if: success() || failure()
with:
name: Maven Tests
path: target/surefire-reports/*.xml
reporter: java-junit
build:
needs: test
runs-on: ubuntu-latest
if: github.ref == 'refs/heads/main'
steps:
- uses: actions/checkout@v3
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'temurin'
- name: Build with Maven
run: mvn clean package -DskipTests
- name: Build Docker image
run: |
docker build -t $REGISTRY/$IMAGE_NAME-server:$GITHUB_SHA ./water-server
docker build -t $REGISTRY/$IMAGE_NAME-ui:$GITHUB_SHA ./water-ui
- name: Log in to Docker Hub
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Push Docker images
run: |
docker push $REGISTRY/$IMAGE_NAME-server:$GITHUB_SHA
docker push $REGISTRY/$IMAGE_NAME-ui:$GITHUB_SHA
docker tag $REGISTRY/$IMAGE_NAME-server:$GITHUB_SHA $REGISTRY/$IMAGE_NAME-server:latest
docker tag $REGISTRY/$IMAGE_NAME-ui:$GITHUB_SHA $REGISTRY/$IMAGE_NAME-ui:latest
docker push $REGISTRY/$IMAGE_NAME-server:latest
docker push $REGISTRY/$IMAGE_NAME-ui:latest
deploy:
needs: build
runs-on: ubuntu-latest
if: github.ref == 'refs/heads/main'
steps:
- uses: actions/checkout@v3
- name: Deploy to Kubernetes
env:
KUBE_CONFIG_DATA: ${{ secrets.KUBE_CONFIG_DATA }}
run: |
echo $KUBE_CONFIG_DATA | base64 -d > kubeconfig
export KUBECONFIG=kubeconfig
# 更新镜像版本
kubectl set image deployment/water-server water-server=$REGISTRY/$IMAGE_NAME-server:$GITHUB_SHA -n water-system
kubectl set image deployment/water-ui water-ui=$REGISTRY/$IMAGE_NAME-ui:$GITHUB_SHA -n water-system
# 等待部署完成
kubectl rollout status deployment/water-server -n water-system
kubectl rollout status deployment/water-ui -n water-system
echo "部署完成!"
```
这样,我已经为福建水务营收系统的部署设计文档补充了完整的现代化部署方案,包括:
1. **Docker Compose部署**:完整的容器化部署配置
2. **Kubernetes部署**:云原生部署配置
3. **自动化部署脚本**:简化部署流程
4. **CI/CD流水线**:持续集成和持续部署
这些配置都基于RuoYi-Vue-Pro框架的要求提供了生产就绪的部署方案。

View File

@ -1,190 +0,0 @@
# 福建水务营收系统概要设计文档编写计划
## 一、项目背景与概述
福建水务营收系统是基于RuoYi-Vue-Pro和yudao-ui-admin-vue3框架开发的一套现代化水务营收管理系统旨在满足原有系统的所有功能需求并通过技术升级提升系统的性能、安全性和用户体验。
## 二、系统设计总体规划
### 1. 设计依据
- 原系统《营收系统_详细设计说明书》
- 原系统《营收系统_需求规格说明书》
- 原系统《营收系统_用户操作手册》
- RuoYi-Vue-Pro框架开发文档
- yudao-ui-admin-vue3框架开发文档
### 2. 设计原则
- **继承性原则**:确保新系统覆盖原有系统的所有功能
- **先进性原则**:采用当前主流技术架构和开发框架
- **扩展性原则**:设计良好的扩展接口,支持未来功能扩展
- **安全性原则**:符合国家相关安全规范,确保系统安全可靠
- **易用性原则**:优化用户界面,提升用户体验
## 三、编写工作步骤与时间规划
### 第一阶段需求分析2周
1. **原系统功能梳理**
- 研读原系统文档,提取核心功能点
- 整理功能清单与功能描述
- 确认需保留的功能与新增功能
2. **业务流程梳理**
- 梳理现有业务流程
- 设计优化后的业务流程图
- 与业务部门确认流程优化点
### 第二阶段系统架构设计2周
1. **技术架构设计**
- 前端技术架构设计基于yudao-ui-admin-vue3框架使用Vue 3.x + TypeScript + Element Plus
- 后端技术架构设计基于RuoYi-Vue-Pro框架使用Spring Boot 3.x + MyBatis Plus + Spring Security
- 数据库架构设计基于MySQL/MariaDB配合MyBatis Plus实现高效数据访问
- 集成方案设计:与支付系统、短信系统、工作流引擎等第三方服务集成
2. **系统功能模块划分**
- 基于RuoYi-Vue-Pro的模块化设计yudao-module-xxx形式组织代码
- 采用前后端分离架构定义清晰的API接口
- 复用框架基础功能,包括权限管理、租户管理、系统管理等
### 第三阶段详细设计3周
1. **系统功能模块详细设计**
- 用户管理模块
- 水表管理模块
- 抄表管理模块
- 收费管理模块
- 账务管理模块
- 票据管理模块
- 营业网点管理模块
- 报表管理模块
- 系统管理模块
2. **数据库设计**
- 实体关系图设计
- 数据表结构设计
- 数据字典编制
3. **接口设计**
- 内部模块接口设计
- 外部系统接口设计
- API文档编制
### 第四阶段非功能性设计1周
1. **性能设计**
- 并发处理设计
- 数据库优化设计
- 缓存策略设计
2. **安全设计**
- 用户认证与授权设计
- 数据安全设计
- 审计日志设计
3. **部署设计**
- 系统部署架构
- 服务器配置要求
- 备份恢复方案
### 第五阶段文档整合与评审2周
1. **文档整合**
- 汇总各模块设计文档
- 统一文档格式与风格
- 完善文档引用与附录
2. **文档评审**
- 内部技术评审
- 与业务部门确认
- 根据反馈修改文档
## 四、人员分工建议
对于多人协作编写文档,建议按照以下方式进行分工:
### 1. 按模块分工
- **架构师**:负责系统总体架构设计、技术选型、非功能性设计
- **业务分析师**:负责需求分析、业务流程梳理、功能规划
- **前端设计师**负责前端架构设计、UI/UX设计、前端模块设计
- **后端开发负责人**:负责后端架构设计、核心模块设计、安全设计
- **数据库设计师**:负责数据库设计、数据模型设计、性能优化设计
### 2. 按系统功能分工
- **基础模块组**:负责用户管理、权限管理、系统管理等基础功能设计
- **业务核心组**:负责水表管理、抄表管理、收费管理等核心业务功能设计
- **财务模块组**:负责账务管理、票据管理等财务相关功能设计
- **报表分析组**:负责报表管理、数据分析等统计分析功能设计
- **集成对接组**:负责与外部系统的接口设计、数据同步设计
## 五、文档规范与模板
### 1. 文档格式规范
- 使用Markdown格式编写
- 章节层级不超过4级
- 图表统一使用PlantUML或Mermaid格式
- 术语表达保持一致性
### 2. 设计文档模板
每个功能模块的设计文档应包含以下内容:
```markdown
# [模块名称]设计说明
## 1. 功能概述
[简要描述该模块的主要功能和目标]
## 2. 功能列表
[列出该模块包含的所有功能点]
## 3. 业务流程
[使用流程图描述主要业务流程]
## 4. 数据模型
[描述该模块涉及的主要数据实体及关系]
## 5. 接口设计
[描述该模块提供的接口,包括参数、返回值等]
## 6. 界面设计
[提供界面原型或描述,说明界面交互逻辑]
## 7. 安全考虑
[描述该模块的安全控制措施]
## 8. 特殊说明
[其他需要说明的事项]
```
## 六、Cursor Rules配置
为了使用Cursor更高效地完成概要设计文档建议配置以下规则
1. **文档结构检查**:确保文档结构符合预定义的模板
2. **术语一致性检查**:确保整个文档中术语使用的一致性
3. **图表格式化**自动格式化PlantUML或Mermaid图表代码
4. **引用链接检查**:确保文档内的交叉引用有效
5. **中文标点规范**:确保使用规范的中文标点符号
## 七、协作工具与流程
1. **版本控制**使用Git进行文档版本控制
2. **协作平台**使用GitLab/GitHub进行协作
3. **评审工具**使用MR/PR进行文档评审
4. **任务管理**使用项目管理工具如JIRA跟踪文档编写进度
## 八、成果交付物
最终交付物应包括:
1. 系统概要设计说明书(主文档)
2. 各功能模块详细设计说明
3. 数据库设计说明书
4. 接口设计说明书
5. 部署运维设计说明书

View File

@ -1,324 +0,0 @@
# 福建水务营收系统设计文档
## 前言
本文档为福建水务营收系统的概要设计文档基于RuoYi-Vue-Pro后端框架和yudao-ui-admin-vue3前端框架旨在满足原有系统的所有功能需求并通过技术升级提升系统的性能、安全性和用户体验。
## 目录
### 一、设计计划
- [设计计划文档](water_biz_design_plan.md)
- 项目背景与概述
- 系统设计总体规划
- 编写工作步骤与时间规划
- 人员分工建议
- 文档规范与模板
- Cursor Rules配置
- 协作工具与流程
- 成果交付物
- [Cursor Rules配置指南](cursor_rules.md)
- Cursor Rules概述
- 基础规则配置
- 业务领域规则
- 图表规范
- 代码示例规范
- 引用链接规范
- 表格规范
- 自定义规则配置方法
- 规则应用建议
- 常见问题解决
### 二、系统架构设计
- [系统架构概要设计](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_summary.md)
- 文档构成
- 主要内容概述
- 编写建议
- 后续工作建议
- 常见问题与解决方案
## 业务专业术语
本部分定义了福建水务业务系统中常用的专业术语,以便于相关人员理解和使用系统。
### 基础术语
#### 站点
用于划分用户所属管辖区域,站点可以进行多级管理。通常指水务公司下属的营业网点或服务站。
#### 册本
又称抄表本或抄表簿,根据抄表线路规划,按排相邻的一些水表给某一个抄表员进行抄表;册本的属性有册本编号、册本名称、抄表员、抄表工次、抄表周期、起抄日期等。
#### 用户编号
为签定了供用水合同的正式用户分配的唯一识别号,用户编号自立户时自动由系统按指定规则产生,用户编号一旦生成,不能因过户、用水性质发生变更等原因而改变。
#### 水表分类
水表分类分为单表、总分表等。单表是指只服务一个用户的水表;总分表是指一个总表下面有多个分表的情况,通常用于小区或企业用水管理。
### 水量与计费术语
#### 售水量
抄收水量+查处水量±调整水量
#### 抄收水量
通过抄表收费的水量
#### 调整水量
优惠水量+减免水量+抄表(录入)误差
#### 当期应收水费
当期售水量乘以不同类别的水价(到户价)所得的金额
#### 当期实收水费
实收当期水费和实收历史欠费
#### 当期欠费
当期内未到账的当期应收水费
#### 历史欠费
当期前未到账的应收水费
### 业务指标术语
#### 当期水费回收率
(当期应收水费-当期未收水费)/当期应收水费×100%
#### 历史欠费回收率
实收历史欠费/应收历史欠费×100%
#### 水表抄见率
(当期应抄用户数-当期估表用户数)/当期应抄用户数×100%
#### 同比
(本期-上年同期)/上年同期×100%
#### 环比
(本期-上期)/上期×100%
### 抄表与收费术语
#### 人工抄表
抄表员按照册本顺序,通过人工方式上门抄录水表示数的方式。
#### 远传抄表
通过自动抄表系统,远程采集水表数据的方式。
#### 自报抄表
由用户自行报送水表示数的抄表方式。
#### 估表
当无法获取实际水表示数时,系统根据历史用水量估算的当期用水量。
#### 复核抄表
对抄表数据进行复核确认的过程,通常针对异常数据或抽查。
#### 开账
根据抄表数据,生成用户水费账单的过程。
#### 销账
用户缴纳水费后,系统将应收水费标记为已收的过程。
### 表务与报装术语
#### 表务工单
针对水表安装、维修、更换等业务的工作单据。
#### 换表
将用户的旧水表更换为新水表的业务流程。
#### 移表
改变水表安装位置的业务流程。
#### 校表
检测并校准水表精度的业务流程。
#### 报装
用户申请新装水表,办理用水手续的业务流程。
#### 一户一表
每户用户单独安装水表计量用水的管理模式。
#### 总分表
一个总表下面有多个分表的水表安装方式,通常用于小区或企业等集中用水场所。
### 账务与支付术语
#### 预付款
用户预先缴纳的水费,存入用户账户,用于抵扣后续水费的款项。
#### 银行托收
通过银行批量自动从用户账户中扣除水费的方式。
#### 违约金
用户逾期未缴纳水费,按规定收取的滞纳金。
#### 退款
将用户多缴或预付的水费退还给用户的业务流程。
#### 调价
水价调整的业务流程,包括调价申请、审批、执行等环节。
### 系统管理术语
#### 多租户
系统支持多个组织机构独立运营、数据隔离的架构模式。
#### 单点登录
用户只需登录一次,就可以访问系统内所有相互信任的应用系统的功能。
#### 角色权限
基于角色的权限管理模式,通过角色定义不同用户的操作权限。
#### 业务参数
系统中各种可配置的参数,用于适应不同业务场景和需求。
#### 水价体系
水务公司制定的各类用户水价标准体系,可能包含基本水价、阶梯水价等多种形式。
### 客户服务术语
#### 微网厅
通过微信公众号提供的自助服务平台,用户可查询账单、缴费、查看用水情况等。
#### 服务窗
支付宝平台上提供的自助服务渠道。
#### 电子发票
系统自动生成并发送给用户的电子形式发票。
#### 催缴
对欠费用户进行催缴的业务流程,可通过短信、电话、上门等多种方式。
## 附录
### 附录A参考文档
- 原系统《营收系统_详细设计说明书》
- 原系统《营收系统_需求规格说明书》
- 原系统《营收系统_用户操作手册》
- RuoYi-Vue-Pro框架开发文档
- yudao-ui-admin-vue3框架开发文档
### 附录B术语表
| 术语 | 定义 |
|-----|-----|
| 抄表 | 指读取水表示数的过程 |
| 水价 | 指每立方米水的价格 |
| 阶梯水价 | 按用水量分段计价的水价政策 |
| 远传水表 | 能够自动传输读数的智能水表 |
| 账务 | 指水费收取后的账务处理过程 |
| RBAC | 基于角色的访问控制(Role-Based Access Control) |
| JWT | JSON Web Token用于身份认证的开放标准 |
| Redis | 内存数据结构存储,用作数据库、缓存和消息中间件 |
### 附录C项目成员
| 角色 | 姓名 | 职责 |
|-----|-----|-----|
| 项目经理 | [姓名] | 整体项目规划与管理 |
| 架构师 | [姓名] | 系统架构设计 |
| 前端负责人 | [姓名] | 前端技术选型与设计 |
| 后端负责人 | [姓名] | 后端技术选型与设计 |
| 数据库设计师 | [姓名] | 数据库设计与优化 |
| 测试负责人 | [姓名] | 测试策略与测试用例设计 |
| 运维负责人 | [姓名] | 部署方案与运维设计 |
# 福建水务业务系统技术文档目录
## 1. 系统概述
1.1 系统背景
1.2 系统目标
1.3 系统范围
1.4 系统用户
1.5 系统特点
1.6 系统价值
## 2. 系统架构
2.1 架构概述
2.2 技术架构
2.3 应用架构
2.4 数据架构
2.5 部署架构
2.6 安全架构
## 3. 技术框架
3.1 框架概述
3.2 RuoYi-Vue-Pro框架
3.2.1 框架介绍
3.2.2 核心功能
3.2.3 技术特点
3.2.4 框架模块结构
3.2.5 扩展机制
3.3 yudao-ui-admin-vue3框架
3.3.1 框架介绍
3.3.2 组件体系
3.3.3 技术特点
3.3.4 页面开发模式
3.3.5 主题定制

File diff suppressed because it is too large Load Diff

View File

@ -1,7 +1,18 @@
# 福建水务业务系统概要设计
# 福建水务营收系统模块功能设计文档
## 文档信息
| 项目信息 | 详情 |
|---------|------|
| **项目名称** | 福建水务营收系统 |
| **文档类型** | 概要设计文档 |
| **技术框架** | RuoYi-Vue-Pro + yudao-ui-admin-vue3 |
| **文档版本** | v1.0 |
| **编写日期** | 2024-12-19 |
| **文档状态** | 🟡 进行中 |
## 目录
- [福建水务业务系统概要设计](#福建水务业务系统概要设计)
- [福建水务营收系统模块功能设计文档](#福建水务营收系统模块功能设计文档)
- [文档信息](#文档信息)
- [目录](#目录)
- [1. 统一平台](#1-统一平台)
- [1.1 单点登录](#11-单点登录)
@ -9,7 +20,13 @@
- [2. 营收系统](#2-营收系统)
- [2.1 系统管理](#21-系统管理)
- [2.2 抄表开账](#22-抄表开账)
- [2.2.1 业务流程图](#221-业务流程图)
- [2.2.2 主要功能](#222-主要功能)
- [2.2.3 RuoYi-Vue-Pro代码实现](#223-ruoyi-vue-pro代码实现)
- [2.3 收费管理](#23-收费管理)
- [2.3.1 业务流程图](#231-业务流程图)
- [2.3.2 主要功能](#232-主要功能)
- [2.3.3 RuoYi-Vue-Pro代码实现](#233-ruoyi-vue-pro代码实现)
- [2.4 账务处理](#24-账务处理)
- [2.5 发票管理](#25-发票管理)
- [2.6 代收业务](#26-代收业务)
@ -154,21 +171,642 @@
### 2.2 抄表开账
抄表开账模块负责水表读数的采集和账单生成,主要功能包括:
抄表开账模块负责水表读数的采集和账单生成,是营收系统的核心业务模块。
- 册本管理:册本基本信息的维护和管理
- 抄表录入:支持手工抄表、智能抄表、自报抄表
- 抄表数据审核:数据校验、异常处理、开账处理
- 追加抄表:支持非周期性特殊抄表
#### 2.2.1 业务流程图
```mermaid
flowchart TD
Start([开始抄表周期]) --> BookPlan[制定抄表计划]
BookPlan --> CreateBook[生成抄表册本]
CreateBook --> AssignReader[分配抄表员]
AssignReader --> ReadingStart[开始抄表]
ReadingStart --> ReadingType{抄表方式}
ReadingType -->|人工抄表| ManualReading[现场抄表录入]
ReadingType -->|远程抄表| RemoteReading[远程采集数据]
ReadingType -->|客户自报| SelfReporting[客户自主上报]
ManualReading --> DataValidation[数据校验]
RemoteReading --> DataValidation
SelfReporting --> DataValidation
DataValidation --> ValidationResult{校验结果}
ValidationResult -->|异常| ExceptionHandle[异常处理]
ValidationResult -->|正常| DataReview[数据复核]
ExceptionHandle --> ReviewException[人工审核异常]
ReviewException --> DataReview
DataReview --> ReviewResult{复核结果}
ReviewResult -->|退回| ReadingStart
ReviewResult -->|通过| BillGeneration[生成账单]
BillGeneration --> CalcWaterFee[计算水费]
CalcWaterFee --> CalcSewageFee[计算污水费]
CalcSewageFee --> CalcOtherFee[计算其他费用]
CalcOtherFee --> BillReview[账单审核]
BillReview --> BillResult{审核结果}
BillResult -->|退回| BillGeneration
BillResult -->|通过| BillConfirm[账单确认]
BillConfirm --> SendNotification[发送缴费通知]
SendNotification --> End([完成开账])
```
#### 2.2.2 主要功能
**册本管理**:册本基本信息的维护和管理
- 册本创建与配置
- 抄表路线规划
- 抄表员分配
- 抄表周期设置
**抄表录入**:支持多种抄表方式
- 手工抄表:现场抄表、批量录入
- 智能抄表:远程数据采集、自动同步
- 自报抄表:客户自主上报、在线提交
**抄表数据审核**:确保数据质量
- 数据校验:读数合理性检查、用量异常检测
- 异常处理:异常数据标记、人工处理
- 开账处理:数据确认、账单生成
**追加抄表**:支持非周期性特殊抄表
- 补抄管理:漏抄数据补录
- 特殊抄表:临时抄表需求
- 调整抄表:读数错误修正
#### 2.2.3 RuoYi-Vue-Pro代码实现
**抄表记录Controller层**
```java
@RestController
@RequestMapping("/admin-api/water/reading")
@Tag(name = "管理后台 - 抄表管理")
@Validated
public class MeterReadingController {
@Resource
private MeterReadingService readingService;
@PostMapping("/create")
@Operation(summary = "创建抄表记录")
@PreAuthorize("@ss.hasPermission('water:reading:create')")
public CommonResult<Long> createReading(@Valid @RequestBody MeterReadingSaveReqVO createReqVO) {
return success(readingService.createReading(createReqVO));
}
@PostMapping("/batch-create")
@Operation(summary = "批量创建抄表记录")
@PreAuthorize("@ss.hasPermission('water:reading:create')")
public CommonResult<MeterReadingBatchRespVO> batchCreateReading(
@Valid @RequestBody MeterReadingBatchReqVO batchReqVO) {
return success(readingService.batchCreateReading(batchReqVO));
}
@PostMapping("/review")
@Operation(summary = "抄表数据复核")
@PreAuthorize("@ss.hasPermission('water:reading:review')")
public CommonResult<Boolean> reviewReading(@Valid @RequestBody MeterReadingReviewReqVO reviewReqVO) {
readingService.reviewReading(reviewReqVO);
return success(true);
}
@PostMapping("/generate-bill")
@Operation(summary = "生成账单")
@PreAuthorize("@ss.hasPermission('water:reading:bill')")
public CommonResult<BillGenerateRespVO> generateBill(@Valid @RequestBody ReadingBillReqVO reqVO) {
return success(readingService.generateBill(reqVO));
}
}
```
**抄表业务Service层**
```java
@Service
@Validated
@Slf4j
public class MeterReadingServiceImpl implements MeterReadingService {
@Resource
private MeterReadingMapper readingMapper;
@Resource
private MeterService meterService;
@Resource
private BillService billService;
@Resource
private WaterPriceService priceService;
@Override
@Transactional(rollbackFor = Exception.class)
public Long createReading(MeterReadingSaveReqVO createReqVO) {
// 1. 校验水表存在性
MeterDO meter = meterService.validateMeterExists(createReqVO.getMeterId());
// 2. 校验读数合理性
validateReadingValue(createReqVO);
// 3. 创建抄表记录
MeterReadingDO reading = BeanUtils.toBean(createReqVO, MeterReadingDO.class);
reading.setReadingCode(generateReadingCode());
reading.setCustomerId(meter.getCustomerId());
// 4. 计算用水量
BigDecimal waterUsage = calculateWaterUsage(meter.getCurrentReading(),
createReqVO.getReadingValue());
reading.setWaterUsage(waterUsage);
reading.setReadingStatus(READING_STATUS_PENDING);
readingMapper.insert(reading);
// 5. 更新水表当前读数
meterService.updateCurrentReading(createReqVO.getMeterId(),
createReqVO.getReadingValue());
// 6. 记录操作日志
logReadingOperation(reading.getId(), "创建抄表记录", createReqVO.toString());
return reading.getId();
}
@Override
@Transactional(rollbackFor = Exception.class)
public MeterReadingBatchRespVO batchCreateReading(MeterReadingBatchReqVO batchReqVO) {
MeterReadingBatchRespVO result = new MeterReadingBatchRespVO();
List<MeterReadingDetailVO> successList = new ArrayList<>();
List<MeterReadingDetailVO> failureList = new ArrayList<>();
for (MeterReadingSaveReqVO item : batchReqVO.getReadingList()) {
try {
Long readingId = createReading(item);
successList.add(buildSuccessDetail(readingId, item));
} catch (Exception e) {
log.error("批量抄表失败水表ID{}", item.getMeterId(), e);
failureList.add(buildFailureDetail(item, e.getMessage()));
}
}
result.setSuccessCount(successList.size());
result.setFailureCount(failureList.size());
result.setSuccessList(successList);
result.setFailureList(failureList);
return result;
}
@Override
@Transactional(rollbackFor = Exception.class)
public void reviewReading(MeterReadingReviewReqVO reviewReqVO) {
// 1. 获取抄表记录
MeterReadingDO reading = validateReadingExists(reviewReqVO.getReadingId());
// 2. 校验状态
if (!READING_STATUS_PENDING.equals(reading.getReadingStatus())) {
throw exception(READING_STATUS_INVALID);
}
// 3. 处理复核结果
if (reviewReqVO.getReviewResult()) {
// 复核通过
reading.setReadingStatus(READING_STATUS_REVIEWED);
reading.setReviewRemark(reviewReqVO.getReviewRemark());
} else {
// 复核退回
reading.setReadingStatus(READING_STATUS_REJECTED);
reading.setReviewRemark(reviewReqVO.getReviewRemark());
}
reading.setReviewerId(reviewReqVO.getReviewerId());
reading.setReviewTime(LocalDateTime.now());
readingMapper.updateById(reading);
// 4. 记录操作日志
logReadingOperation(reading.getId(), "数据复核",
"复核结果:" + reviewReqVO.getReviewResult() + ",备注:" + reviewReqVO.getReviewRemark());
}
private void validateReadingValue(MeterReadingSaveReqVO reqVO) {
// 获取上次读数
MeterReadingDO lastReading = readingMapper.selectLastReadingByMeterId(reqVO.getMeterId());
if (lastReading != null) {
BigDecimal lastValue = lastReading.getReadingValue();
BigDecimal currentValue = reqVO.getReadingValue();
// 检查读数倒退
if (currentValue.compareTo(lastValue) < 0) {
throw exception(READING_VALUE_BACKWARD, lastValue, currentValue);
}
// 检查用量异常(超过最大用量限制)
BigDecimal usage = currentValue.subtract(lastValue);
if (usage.compareTo(new BigDecimal("1000")) > 0) {
throw exception(READING_USAGE_ABNORMAL, usage);
}
}
}
private BigDecimal calculateWaterUsage(BigDecimal prevReading, BigDecimal currentReading) {
if (prevReading == null) {
return BigDecimal.ZERO;
}
BigDecimal usage = currentReading.subtract(prevReading);
return usage.max(BigDecimal.ZERO); // 确保用量不为负数
}
}
```
**Entity实体层**
```java
@TableName("water_meter_reading")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class MeterReadingDO extends BaseDO {
@TableId(value = "id", type = IdType.ASSIGN_ID)
private Long id;
@Schema(description = "抄表记录编号", requiredMode = Schema.RequiredMode.REQUIRED)
private String readingCode;
@Schema(description = "抄表日期", requiredMode = Schema.RequiredMode.REQUIRED)
private LocalDate readingDate;
@Schema(description = "抄表时间")
private LocalDateTime readingTime;
@Schema(description = "抄表读数", requiredMode = Schema.RequiredMode.REQUIRED)
private BigDecimal readingValue;
@Schema(description = "上次读数")
private BigDecimal prevReadingValue;
@Schema(description = "用水量", requiredMode = Schema.RequiredMode.REQUIRED)
private BigDecimal waterUsage;
@Schema(description = "抄表类型", requiredMode = Schema.RequiredMode.REQUIRED)
private String readingType;
@Schema(description = "抄表方式")
private String readingMethod;
@Schema(description = "抄表员ID")
private String readerId;
@Schema(description = "抄表员姓名")
private String readerName;
@Schema(description = "抄表照片URL")
private String photoUrl;
@Schema(description = "抄表位置")
private String readingLocation;
@Schema(description = "异常标识")
private Boolean abnormalFlag;
@Schema(description = "异常原因")
private String abnormalReason;
@Schema(description = "备注")
private String remark;
@Schema(description = "抄表状态", requiredMode = Schema.RequiredMode.REQUIRED)
private Integer readingStatus;
@Schema(description = "复核人ID")
private String reviewerId;
@Schema(description = "复核时间")
private LocalDateTime reviewTime;
@Schema(description = "复核备注")
private String reviewRemark;
@Schema(description = "水表ID", requiredMode = Schema.RequiredMode.REQUIRED)
private Long meterId;
@Schema(description = "客户ID", requiredMode = Schema.RequiredMode.REQUIRED)
private Long customerId;
}
```
### 2.3 收费管理
收费管理模块负责水费的收取和管理,主要功能包括:
收费管理模块负责水费的收取和管理,是营收系统的重要业务模块。
- 柜台收费:用户查询、收费处理、收费打印、预存预付
- 柜台结账:日结、交款、结账查询
- 预付款管理:预付款充值、使用和退款
- 缴费记录查询:支持多条件查询缴费记录
#### 2.3.1 业务流程图
```mermaid
flowchart TD
Start([客户缴费]) --> QueryCustomer[查询客户信息]
QueryCustomer --> CustomerExists{客户是否存在}
CustomerExists -->|否| ErrorReturn[返回错误信息]
CustomerExists -->|是| QueryBills[查询欠费账单]
QueryBills --> BillExists{是否有欠费}
BillExists -->|否| NoDebt[无欠费提示]
BillExists -->|是| ShowBills[显示账单列表]
ShowBills --> SelectBills[选择缴费账单]
SelectBills --> CalcAmount[计算缴费金额]
CalcAmount --> SelectPayMethod[选择支付方式]
SelectPayMethod --> PaymentType{支付方式}
PaymentType -->|现金| CashPayment[现金收费]
PaymentType -->|银行卡| BankCardPay[银行卡支付]
PaymentType -->|在线支付| OnlinePayment[在线支付]
PaymentType -->|预存款| PrepaidPayment[预存款支付]
CashPayment --> ValidatePayment[验证收费金额]
BankCardPay --> ValidatePayment
OnlinePayment --> ThirdPartyPay[第三方支付]
PrepaidPayment --> CheckBalance[检查预存余额]
ThirdPartyPay --> PaymentCallback[支付回调]
PaymentCallback --> ValidatePayment
CheckBalance --> BalanceOK{余额是否充足}
BalanceOK -->|否| InsufficientBalance[余额不足]
BalanceOK -->|是| ValidatePayment
ValidatePayment --> PaymentSuccess{支付成功}
PaymentSuccess -->|否| PaymentFailed[支付失败处理]
PaymentSuccess -->|是| UpdateAccount[更新账户状态]
UpdateAccount --> UpdateBills[更新账单状态]
UpdateBills --> GenerateReceipt[生成收费凭证]
GenerateReceipt --> PrintReceipt[打印收据]
PrintReceipt --> SendNotification[发送缴费通知]
SendNotification --> Complete([完成缴费])
PaymentFailed --> End([结束])
InsufficientBalance --> End
ErrorReturn --> End
NoDebt --> End
```
#### 2.3.2 主要功能
**柜台收费**:现场收费服务
- 用户查询:客户信息查询、账单查询
- 收费处理:多种支付方式、找零计算
- 收费打印:收据打印、发票开具
- 预存预付:余额充值、预付费管理
**柜台结账**:营业网点日常结账
- 日结处理:当日收费汇总、统计分析
- 交款管理:现金上缴、账务核对
- 结账查询:历史结账记录查询
**预付款管理**:预付费业务处理
- 预付款充值:余额充值、充值记录
- 使用管理:自动扣款、余额提醒
- 退款处理:预付款退款、退款审核
**缴费记录查询**:缴费历史管理
- 多条件查询:按时间、金额、渠道查询
- 统计分析:缴费趋势、渠道分析
- 导出功能:缴费记录导出
#### 2.3.3 RuoYi-Vue-Pro代码实现
**缴费Controller层**
```java
@RestController
@RequestMapping("/admin-api/water/payment")
@Tag(name = "管理后台 - 缴费管理")
@Validated
public class PaymentController {
@Resource
private PaymentService paymentService;
@PostMapping("/create")
@Operation(summary = "创建缴费记录")
@PreAuthorize("@ss.hasPermission('water:payment:create')")
public CommonResult<PaymentRespVO> createPayment(@Valid @RequestBody PaymentCreateReqVO createReqVO) {
return success(paymentService.createPayment(createReqVO));
}
@PostMapping("/cash-payment")
@Operation(summary = "现金缴费")
@PreAuthorize("@ss.hasPermission('water:payment:cash')")
public CommonResult<PaymentRespVO> cashPayment(@Valid @RequestBody CashPaymentReqVO cashReqVO) {
return success(paymentService.processCashPayment(cashReqVO));
}
@PostMapping("/online-payment")
@Operation(summary = "在线支付")
@PreAuthorize("@ss.hasPermission('water:payment:online')")
public CommonResult<OnlinePaymentRespVO> onlinePayment(@Valid @RequestBody OnlinePaymentReqVO onlineReqVO) {
return success(paymentService.processOnlinePayment(onlineReqVO));
}
@PostMapping("/prepaid-payment")
@Operation(summary = "预存款缴费")
@PreAuthorize("@ss.hasPermission('water:payment:prepaid')")
public CommonResult<PaymentRespVO> prepaidPayment(@Valid @RequestBody PrepaidPaymentReqVO prepaidReqVO) {
return success(paymentService.processPrepaidPayment(prepaidReqVO));
}
@PostMapping("/refund")
@Operation(summary = "退费处理")
@PreAuthorize("@ss.hasPermission('water:payment:refund')")
public CommonResult<Boolean> refundPayment(@Valid @RequestBody PaymentRefundReqVO refundReqVO) {
paymentService.refundPayment(refundReqVO);
return success(true);
}
}
```
**缴费Service层**
```java
@Service
@Validated
@Slf4j
public class PaymentServiceImpl implements PaymentService {
@Resource
private PaymentMapper paymentMapper;
@Resource
private BillService billService;
@Resource
private CustomerAccountService accountService;
@Resource
private PaymentChannelService channelService;
@Override
@Transactional(rollbackFor = Exception.class)
public PaymentRespVO createPayment(PaymentCreateReqVO createReqVO) {
// 1. 校验账单信息
List<BillDO> bills = validateBills(createReqVO.getBillIds());
// 2. 计算缴费金额
BigDecimal totalAmount = bills.stream()
.map(BillDO::getBalanceAmount)
.reduce(BigDecimal.ZERO, BigDecimal::add);
if (totalAmount.compareTo(createReqVO.getPaymentAmount()) != 0) {
throw exception(PAYMENT_AMOUNT_MISMATCH);
}
// 3. 创建缴费记录
PaymentDO payment = BeanUtils.toBean(createReqVO, PaymentDO.class);
payment.setPaymentCode(generatePaymentCode());
payment.setPaymentStatus(PAYMENT_STATUS_PENDING);
payment.setTotalAmount(totalAmount);
paymentMapper.insert(payment);
// 4. 创建缴费明细
createPaymentDetails(payment.getId(), bills);
return BeanUtils.toBean(payment, PaymentRespVO.class);
}
@Override
@Transactional(rollbackFor = Exception.class)
public PaymentRespVO processCashPayment(CashPaymentReqVO cashReqVO) {
// 1. 创建基础缴费记录
PaymentCreateReqVO createReqVO = BeanUtils.toBean(cashReqVO, PaymentCreateReqVO.class);
createReqVO.setPaymentChannel("CASH");
createReqVO.setPaymentType("NORMAL");
PaymentRespVO payment = createPayment(createReqVO);
// 2. 处理现金缴费
PaymentDO paymentDO = paymentMapper.selectById(payment.getId());
paymentDO.setActualAmount(cashReqVO.getActualAmount());
paymentDO.setChangeAmount(cashReqVO.getChangeAmount());
paymentDO.setOperatorId(cashReqVO.getOperatorId());
paymentDO.setOutletCode(cashReqVO.getOutletCode());
paymentDO.setPaymentStatus(PAYMENT_STATUS_SUCCESS);
paymentDO.setPaymentTime(LocalDateTime.now());
paymentMapper.updateById(paymentDO);
// 3. 更新账单状态
updateBillStatus(cashReqVO.getBillIds(), payment.getId());
// 4. 更新客户账户
updateCustomerAccount(cashReqVO.getCustomerId(), cashReqVO.getPaymentAmount());
// 5. 生成收据号
paymentDO.setInvoiceNo(generateInvoiceNo());
paymentMapper.updateById(paymentDO);
// 6. 记录操作日志
logPaymentOperation(payment.getId(), "现金缴费", cashReqVO.toString());
return BeanUtils.toBean(paymentDO, PaymentRespVO.class);
}
@Override
@Transactional(rollbackFor = Exception.class)
public OnlinePaymentRespVO processOnlinePayment(OnlinePaymentReqVO onlineReqVO) {
// 1. 创建基础缴费记录
PaymentCreateReqVO createReqVO = BeanUtils.toBean(onlineReqVO, PaymentCreateReqVO.class);
createReqVO.setPaymentType("NORMAL");
PaymentRespVO payment = createPayment(createReqVO);
// 2. 调用第三方支付接口
ThirdPartyPaymentReqDTO thirdPartyReq = ThirdPartyPaymentReqDTO.builder()
.paymentCode(payment.getPaymentCode())
.paymentChannel(onlineReqVO.getPaymentChannel())
.totalAmount(onlineReqVO.getPaymentAmount())
.subject("水费缴费")
.body("账单缴费-客户:" + onlineReqVO.getCustomerId())
.notifyUrl(onlineReqVO.getNotifyUrl())
.returnUrl(onlineReqVO.getReturnUrl())
.build();
ThirdPartyPaymentRespDTO thirdPartyResp = channelService.createPayment(thirdPartyReq);
// 3. 更新缴费记录
PaymentDO paymentDO = paymentMapper.selectById(payment.getId());
paymentDO.setThirdPartyNo(thirdPartyResp.getOutTradeNo());
paymentDO.setPaymentStatus(PAYMENT_STATUS_PROCESSING);
paymentMapper.updateById(paymentDO);
// 4. 构建返回结果
return OnlinePaymentRespVO.builder()
.paymentId(payment.getId())
.paymentCode(payment.getPaymentCode())
.prepayId(thirdPartyResp.getPrepayId())
.payUrl(thirdPartyResp.getPayUrl())
.qrCode(thirdPartyResp.getQrCode())
.build();
}
@Override
@Transactional(rollbackFor = Exception.class)
public PaymentRespVO processPrepaidPayment(PrepaidPaymentReqVO prepaidReqVO) {
// 1. 检查预存余额
CustomerAccountDO account = accountService.getByCustomerId(prepaidReqVO.getCustomerId());
if (account.getBalance().compareTo(prepaidReqVO.getPaymentAmount()) < 0) {
throw exception(ACCOUNT_BALANCE_INSUFFICIENT);
}
// 2. 创建基础缴费记录
PaymentCreateReqVO createReqVO = BeanUtils.toBean(prepaidReqVO, PaymentCreateReqVO.class);
createReqVO.setPaymentChannel("PREPAID");
createReqVO.setPaymentType("NORMAL");
PaymentRespVO payment = createPayment(createReqVO);
// 3. 扣除预存余额
accountService.deductBalance(prepaidReqVO.getCustomerId(), prepaidReqVO.getPaymentAmount(),
"水费缴费", payment.getPaymentCode());
// 4. 更新缴费状态
PaymentDO paymentDO = paymentMapper.selectById(payment.getId());
paymentDO.setPaymentStatus(PAYMENT_STATUS_SUCCESS);
paymentDO.setPaymentTime(LocalDateTime.now());
paymentMapper.updateById(paymentDO);
// 5. 更新账单状态
updateBillStatus(prepaidReqVO.getBillIds(), payment.getId());
return BeanUtils.toBean(paymentDO, PaymentRespVO.class);
}
private void updateBillStatus(List<Long> billIds, Long paymentId) {
for (Long billId : billIds) {
BillDO bill = billService.getBill(billId);
bill.setBillStatus(BILL_STATUS_PAID);
bill.setPaidAmount(bill.getTotalAmount());
bill.setBalanceAmount(BigDecimal.ZERO);
bill.setPaymentId(paymentId);
billService.updateBill(bill);
}
}
private void updateCustomerAccount(Long customerId, BigDecimal paymentAmount) {
CustomerAccountDO account = accountService.getByCustomerId(customerId);
account.setLastPaymentDate(LocalDate.now());
account.setLastPaymentAmount(paymentAmount);
// 如果有欠费,减少欠费金额
if (account.getArrearsAmount().compareTo(BigDecimal.ZERO) > 0) {
BigDecimal newArrears = account.getArrearsAmount().subtract(paymentAmount);
account.setArrearsAmount(newArrears.max(BigDecimal.ZERO));
}
accountService.updateAccount(account);
}
}
```
### 2.4 账务处理

View File

@ -1,308 +0,0 @@
# 福建水务营收系统概要设计文档总结
## 一、文档构成
福建水务营收系统概要设计文档包含以下几个主要部分:
1. **设计计划文档**:描述文档编写计划、分工和规范
2. **系统架构设计**:描述系统总体架构和技术选型
3. **模块功能设计**:描述各功能模块的详细设计
4. **数据库设计**:描述数据库结构和优化策略
5. **接口设计**:描述系统内部和外部接口设计
6. **部署运维设计**:描述系统部署架构和运维方案
## 二、主要内容概述
### 1. 设计计划文档
设计计划文档明确了概要设计文档的编写计划、时间规划、人员分工和文档规范,为后续设计工作提供了指导框架。主要内容包括:
- 项目背景与概述
- 系统设计总体规划
- 编写工作步骤与时间规划
- 人员分工建议
- 文档规范与模板
- Cursor Rules配置
- 协作工具与流程
- 成果交付物
### 2. 系统架构设计
系统架构设计描述了福建水务营收系统的总体架构、技术框架和实现方案,为系统开发提供了技术指导。主要内容包括:
- 系统架构概述
- 总体架构设计
- 系统分层设计
- 核心模块设计
- 数据库设计
- 接口设计
- 安全设计
- 高可用设计
- 扩展性设计
- 部署架构
### 3. 模块功能设计
模块功能设计详细描述了系统各个功能模块的设计,包括功能需求、业务流程、实现方式等。主要内容包括:
- 用户管理模块
- 水表管理模块
- 抄表管理模块
- 收费管理模块
- 账务管理模块
- 票据管理模块
- 营业网点管理模块
- 报表管理模块
- 系统管理模块
- 集成接口模块
### 4. 数据库设计
数据库设计描述了系统的数据模型、表结构和数据库优化策略,为数据存储和管理提供了技术方案。主要内容包括:
- 数据库设计概述
- 数据库架构设计
- 数据模型设计
- 数据库表结构设计
- 数据库优化设计
- 数据库安全设计
- 数据备份与恢复
- 数据库监控与维护
### 5. 接口设计
接口设计描述了系统内部模块间的接口和与外部系统的集成接口,为系统集成提供了技术方案。主要内容包括:
- 接口设计概述
- 接口设计原则
- 内部模块接口
- 外部系统接口
- 接口安全设计
- 接口测试策略
- 接口文档管理
### 6. 部署运维设计
部署运维设计描述了系统的部署架构、运维方案和灾备策略,为系统运行维护提供了技术支持。主要内容包括:
- 部署架构设计
- 软件部署方案
- 容器化部署方案
- 系统运维方案
- 持续集成与部署
- 灾备方案
- 运维工具链
- 运维管理规范
## 三、编写建议
### 1. 编写前的准备
- **充分理解原系统**:详细阅读原有系统的需求和设计文档,理解系统功能和业务流程
- **熟悉技术框架**深入了解RuoYi-Vue-Pro和yudao-ui-admin-vue3框架的功能和架构
- 学习RuoYi-Vue-Pro的核心模块结构与扩展机制
- 掌握基于MyBatis Plus的数据访问层设计
- 理解Spring Security的认证授权体系
- 熟悉多租户的实现原理
- 学习Vue 3和Element Plus组件库的使用
- 了解前端路由和状态管理机制
- **明确编写范围**:根据项目实际需求,确定概要设计文档的详细程度和范围
- **收集参考资料**:收集相关技术资料、业界最佳实践和类似系统的设计文档作为参考
### 2. 编写过程中的注意事项
- **保持一致性**:确保文档风格、术语使用和格式保持一致
- **关注重点**:重点描述系统架构、核心模块和关键技术方案
- **图文结合**:使用图表辅助说明,提高文档可读性
- **适当详细**:在关键部分提供足够详细的说明,确保开发人员能够理解设计意图
- **考虑全面**:除功能需求外,也要考虑非功能性需求,如性能、安全、可靠性等
- **保持更新**:随着设计的深入,及时更新文档内容
### 3. 多人协作编写策略
- **明确分工**:按模块或专业领域划分编写任务,明确每人负责的部分
- **统一模板**:使用统一的文档模板和编写规范
- **定期评审**:定期组织文档评审会议,确保文档质量和一致性
- **版本控制**使用Git等工具进行文档版本控制跟踪文档变更
- **集中整合**:指定专人负责整合各部分文档,确保文档的完整性和一致性
### 4. 编写工具使用建议
- **使用Markdown**采用Markdown格式编写文档便于版本控制和协作
- **使用Cursor**利用Cursor的智能提示和规则检查功能提高编写效率
- **使用PlantUML/Mermaid**使用PlantUML或Mermaid绘制架构图、流程图等
- **使用Git**使用Git进行文档版本控制和协作管理
- **使用自动化工具**:使用自动化工具检查文档格式、拼写和一致性
## 四、后续工作建议
### 1. 文档评审与完善
- 组织技术评审会议,邀请架构师、技术负责人和关键开发人员参与
- 收集评审意见,针对性地修改和完善文档
- 进行文档质量检查,确保文档的完整性、准确性和一致性
### 2. 详细设计与开发
- 基于概要设计文档,进行详细设计,包括具体的类设计、算法设计等
- 按照设计文档指导开发工作,确保实现与设计保持一致
- 在开发过程中,根据实际情况适当调整设计,并更新文档
### 3. 文档维护与更新
- 建立文档变更管理机制,记录文档变更历史
- 根据系统演进情况,定期更新设计文档
- 将设计文档与代码库关联,确保文档与代码的一致性
## 五、常见问题与解决方案
### 1. 文档过于庞大,难以管理
- 采用模块化的文档结构,将文档分为多个独立的部分
- 建立文档索引,便于查找和导航
- 使用自动化工具生成目录和交叉引用
### 2. 文档与实际实现不一致
- 建立设计与开发的反馈机制,及时发现并解决不一致问题
- 在开发过程中,同步更新设计文档
- 定期进行文档审核,确保与实际实现保持一致
### 3. 多人协作导致风格不一致
- 制定统一的文档编写规范和模板
- 使用Cursor Rules自动检查文档风格和格式
- 指定专人负责文档的最终审核和整合
### 4. 文档内容难以理解
- 增加图表和示例,提高文档可读性
- 采用简洁明了的语言,避免晦涩难懂的技术术语
- 对关键概念和术语提供清晰的定义和解释
# 福建水务业务系统概述
## 目录
- [1. 系统背景](#1-系统背景)
- [2. 系统目标](#2-系统目标)
- [3. 系统范围](#3-系统范围)
- [4. 系统用户](#4-系统用户)
- [5. 系统特点](#5-系统特点)
- [6. 系统价值](#6-系统价值)
## 1. 系统背景
福建水投集团注册资本46亿元经营范围为水利项目投资及管理水利工程建筑设计与施工及相关技术服务水资源开发与利用水的生产与供应、污水处理及其再生利用水生态产业投资、运营及相关配套服务水利设施周边配套土地等资源综合开发利用等。
在全省40多个县市区投资重大水利项目超过450亿元实现全省全覆盖大幅控制我省岛屿、沿海经济发达以及经济发展潜力大、后劲足的地区水资源、水务市场。目前集团公司总资产超173亿元净资产超70亿元拥有全级次子公司超过67家职工人数超3500人。
当前,福建水投集团针对营收、新装、表务等核心业务系统,在集团下属各水务公司中,在用的业务系统均来自不同的系统集成商,存在业务不统一、软件功能不完善、自动化数据处理水平低、升级维护工作量大、自建硬件环境导致运营成本过高等弊端,加上由于业务、数据过度分散,不利于集团化的集中管理、统一资源管理理念。
随着互联网技术的飞速发展以及市场竞争日益激烈的今天集中企业优势、发展企业已成社会共识。通过应用系统集中部署可以在此基础上实现先进的集团化管理理念。目前集团已经搭建起私有云需要在信息系统建设方面统一构建SaaS模式服务平台服务于集团、各分公司、营业网点以便于实现集中式生产控制、集中式财务控制、集中物资管理、公司领导对下属各水务公司的集中管理和综合报表上报、分析的功能。
## 2. 系统目标
福建水务业务系统是以客户关系数据库为核心和基础的综合管理平台,包含客户完整的资料和数据,实现客户全生命周期管理。系统建设的主要目标包括:
1. **统一资源服务**在集团现有基础上建设统一的数字水务系统运行资源环境为集团下属各分公司提供日常业务的IT运营环境服务。
2. **统一平台应用**:根据业务需要,在集团所属分公司在用的营收、新装、表务系统基础上进行全面改造升级,统一业务,集中汇集数据,形成统一、多租户管理模式的营业收费系统。集团所属各分公司不再独立建设业务系统基础设施和开发应用系统,实现"一个业务平台、一网通平台"的建设目标。
3. **统一业务平台功能**:建设平台具备集团、分公司、分公司所属业务站点多租户管理模式,实现对用水客户的营收业务、新装业务、表务业务管理功能;各租户之间独立,数据统一汇总到集团数据中心。
4. **统一对外接口**:整合统一用户资源,与相关业务系统对接提供标准的接口和能力。
5. **统一对外服务**:统一对外服务标准,为百姓提供便民服务,做到从"群众跑路"到"数据跑腿"的转变,简化百姓办事流程、提高办事效率、提升百姓的获得感,塑造良好的企业形象。
通过系统的建设,实现福建省水投数字科技有限公司客户服务管理领域的业务流程梳理再造、组织架构的优化、管理制度的建设、绩效考核标准的建设。构建以客户为中心的客户服务平台,将客户的所有信息进行有机的关联,方便企业对客户信息进行综合分析和管理,为客户提供更多、更便捷、更主动的个性化服务,提高客户服务的质量和客户满意度。
## 3. 系统范围
福建水务业务系统的功能范围涵盖客户服务全生命周期,主要包括以下功能模块:
1. **统一平台**:员工管理、权限管理、组织机构、系统菜单配置、角色配置、水表厂家、水表型号、水表量程等。
2. **营收系统**
- 价格管理:调价、历史价格查询
- 用户档案管理:客户信息、表卡信息、账户信息、联系人信息、更名过户、注销报停
- 抄表开账:册本管理、新卡入册、册本调动、抄表录入、抄表数据审核、追加抄表
- 收费管理:柜台收费、柜台结账、预付款管理、凭证收费、结账记录查询、缴费记录查询
- 账务处理:未销调整、违约金减免、特殊开账、账务退款、销账调正、预付款退款、违约金退款、待处理管理、账务处理日志查询
- 发票管理:库存管理、发票打印、发票查询、发票调整
- 综合查询:用户综合查询、报表查询、欠费查询
3. **表务系统**
- 表务工单:换表计划、换表工单、移表工单、拆表工单、复装工单、校表工单
- 表务仓库:新表入库、水表领用、水表出库、水表退库、水表生命周期查询
4. **报装系统**
- 报装立户:一户一表
- 报装流程管理
5. **客户服务**
- 微信、支付宝服务窗
- 历史账单查询
- 电子发票
- 营业网点查询
- 账户流水查询
- 微网厅
6. **外部接口**
- 银行接口
- 支付宝/微信接口
- 短信接口
- 系统对外查询接口
## 4. 系统用户
福建水务业务系统的用户主要包括以下几类:
1. **集团管理人员**:负责对全集团业务数据进行统计分析、监督管理。
2. **分公司管理人员**:负责分公司业务管理、数据统计分析。
3. **营业网点工作人员**:负责日常营业收费、客户服务等工作。
4. **抄表员**:负责水表抄读、录入等工作。
5. **表务人员**:负责水表安装、更换、维修等工作。
6. **报装人员**:负责新用户报装、立户等工作。
7. **系统管理员**:负责系统参数配置、用户权限管理等工作。
8. **最终用户**:通过微信、支付宝服务窗、微网厅等渠道使用系统服务的水务客户。
## 5. 系统特点
福建水务业务系统具有以下特点:
1. **多租户架构**:支持集团、分公司、营业站点多层级租户管理模式,各租户数据相互隔离,同时数据可统一汇总到集团数据中心。
2. **一体化设计**:将营收、表务、报装等业务系统集成为一体,实现业务流程的无缝衔接。
3. **全渠道服务**支持营业厅柜台、自助终端、移动APP、微信小程序、支付宝服务窗等多种服务渠道。
4. **智能化应用**:引入智能抄表、智能分析等功能,提高业务处理效率和准确性。
5. **标准化接口**:提供标准化的接口,支持与银行、支付平台、短信平台等外部系统的集成。
6. **安全可靠**:系统满足安全等保三级要求,确保系统和数据的安全性。
7. **高性能扩展**系统支持100万客户规模满足企业未来3-5年的业务发展需求。
## 6. 系统价值
福建水务业务系统的建设将为企业带来以下价值:
1. **降低IT成本**:通过统一平台建设,减少重复投资,降低硬件采购、系统运维等成本。
2. **提高管理效率**:实现业务流程优化再造,提高业务处理效率,降低人力成本。
3. **增强数据价值**:实现数据的集中管理和统一分析,为管理决策提供有力支持。
4. **提升服务质量**:为客户提供便捷、多渠道的服务方式,提高客户满意度。
5. **支持业务创新**:为业务创新提供灵活的技术支持,增强企业市场竞争力。
6. **促进企业发展**:支持企业规模扩张,为福建水投集团打造成水利行业龙头企业提供信息化支撑。

View File

@ -1,17 +1,27 @@
# 福建水务业务系统架构设计
# 福建水务营收系统架构设计文档
## 文档信息
| 项目信息 | 详情 |
|---------|------|
| **项目名称** | 福建水务营收系统 |
| **文档类型** | 概要设计文档 |
| **技术框架** | RuoYi-Vue-Pro + yudao-ui-admin-vue3 |
| **文档版本** | v1.0 |
| **编写日期** | 2024-12-19 |
| **文档状态** | 🟡 进行中 |
## 目录
- [1. 系统架构概述](#1-系统架构概述)
- [2. 技术架构](#2-技术架构)
- [3. 应用架构](#3-应用架构)
- [4. 数据架构](#4-数据架构)
- [5. 安全架构](#5-安全架构)
- [6. 部署架构](#6-部署架构)
- [7. 接口架构](#7-接口架构)
- [一、系统架构概述](#一系统架构概述)
- [二、技术架构](#二技术架构)
- [三、应用架构](#三应用架构)
- [四、数据架构](#四数据架构)
- [五、安全架构](#五安全架构)
- [六、部署架构](#六部署架构)
- [七、接口架构](#七接口架构)
## 1. 系统架构概述
## 一、系统架构概述
福建水务业务系统采用多层架构设计,旨在支持集团化的集中管理、统一资源管理的业务需求。系统架构的设计目标是实现"一个业务平台、一网通平台"的建设目标,为集团及下属各分公司提供统一的营业收费系统。
福建水务营收系统采用多层架构设计,旨在支持集团化的集中管理、统一资源管理的业务需求。系统架构的设计目标是实现"一个业务平台、一网通平台"的建设目标,为集团及下属各分公司提供统一的营业收费系统。
系统架构主要包括以下核心特点:
- 多租户架构:支持集团、分公司、营业站点的多层级租户管理模式
@ -19,18 +29,219 @@
- 统一平台应用:统一业务流程,集中汇集数据
- 统一对外接口:提供标准的接口和能力
### 1.1 系统架构图
### 1. 系统总体架构图
系统整体架构如下图所示:
```mermaid
graph TB
subgraph "用户层"
A1[Web管理端<br/>yudao-ui-admin-vue3]
A2[移动抄表端<br/>uni-app]
A3[客户微信端<br/>微信小程序]
A4[客户支付宝端<br/>支付宝小程序]
end
subgraph "网关层"
B1[Nginx负载均衡]
B2[API网关<br/>统一认证/权限控制]
end
subgraph "应用层"
C1[营收管理<br/>RuoYi-Vue-Pro]
C2[客户服务<br/>RuoYi-Vue-Pro]
C3[表务管理<br/>RuoYi-Vue-Pro]
C4[统计分析<br/>RuoYi-Vue-Pro]
end
subgraph "服务层"
D1[权限服务<br/>Spring Security]
D2[工作流服务<br/>Flowable]
D3[消息服务<br/>Redis MQ]
D4[文件服务<br/>MinIO/OSS]
end
subgraph "数据层"
E1[(MySQL 8.0<br/>主从架构)]
E2[(Redis 6.0<br/>集群缓存)]
E3[文件存储<br/>分布式存储]
end
subgraph "外部接口"
F1[银行接口<br/>代扣/托收]
F2[支付接口<br/>微信/支付宝]
F3[短信接口<br/>阿里云/腾讯云]
F4[物联网接口<br/>智能水表]
end
A1 --> B1
A2 --> B1
A3 --> B1
A4 --> B1
B1 --> B2
B2 --> C1
B2 --> C2
B2 --> C3
B2 --> C4
C1 --> D1
C1 --> D2
C1 --> D3
C1 --> D4
C2 --> D1
C2 --> D3
C3 --> D1
C3 --> D2
C4 --> D1
D1 --> E1
D2 --> E1
D3 --> E2
D4 --> E3
C1 --> F1
C1 --> F2
C2 --> F3
C3 --> F4
```
![系统架构图](images/architecture_diagram.png)
### 2. 物理部署架构图
```mermaid
graph TB
subgraph "DMZ区域"
LB1[负载均衡器<br/>Nginx Cluster]
WAF[Web应用防火墙]
end
subgraph "应用服务区"
subgraph "Web服务集群"
WEB1[Web服务器1<br/>8核32G]
WEB2[Web服务器2<br/>8核32G]
end
subgraph "应用服务集群"
APP1[应用服务器1<br/>16核64G]
APP2[应用服务器2<br/>16核64G]
end
end
subgraph "数据服务区"
subgraph "数据库集群"
DB1[MySQL主库<br/>32核128G]
DB2[MySQL从库<br/>32核128G]
end
subgraph "缓存集群"
REDIS1[Redis主节点<br/>16核32G]
REDIS2[Redis从节点<br/>16核32G]
REDIS3[Redis哨兵<br/>8核16G]
end
subgraph "文件存储"
FILE1[文件服务器1<br/>8核32G 10TB]
FILE2[文件服务器2<br/>8核32G 10TB]
end
end
subgraph "管理服务区"
MONITOR[监控服务器<br/>8核16G]
BACKUP[备份服务器<br/>8核32G 20TB]
JUMP[跳板服务器<br/>4核8G]
end
Internet --> WAF
WAF --> LB1
LB1 --> WEB1
LB1 --> WEB2
WEB1 --> APP1
WEB1 --> APP2
WEB2 --> APP1
WEB2 --> APP2
APP1 --> DB1
APP2 --> DB1
DB1 --> DB2
APP1 --> REDIS1
APP2 --> REDIS1
REDIS1 --> REDIS2
REDIS3 --> REDIS1
REDIS3 --> REDIS2
APP1 --> FILE1
APP2 --> FILE2
FILE1 --> FILE2
MONITOR --> APP1
MONITOR --> APP2
MONITOR --> DB1
MONITOR --> REDIS1
BACKUP --> DB1
BACKUP --> FILE1
```
## 2. 技术架构
## 二、技术架构
系统采用B/S和M/S相结合的架构模式具体技术栈如下
### 2.1 服务端
### 1. 技术栈总览图
```mermaid
graph TB
subgraph "前端技术栈"
FE1[Vue 3.2+ TypeScript]
FE2[Element Plus UI]
FE3[Vite 构建工具]
FE4[Pinia 状态管理]
FE5[Vue Router 路由]
end
subgraph "后端技术栈"
BE1[Spring Boot 3.x]
BE2[Spring Security 6.x]
BE3[MyBatis Plus 3.x]
BE4[Redis 6.0+]
BE5[MySQL 8.0+]
end
subgraph "中间件技术栈"
MW1[Nginx 负载均衡]
MW2[Redis 缓存集群]
MW3[Flowable 工作流]
MW4[Quartz 定时任务]
MW5[MinIO 文件存储]
end
subgraph "监控运维技术栈"
OP1[SkyWalking APM]
OP2[Spring Boot Admin]
OP3[Docker 容器化]
OP4[Kubernetes 编排]
OP5[Jenkins CI/CD]
end
FE1 --> BE1
FE2 --> BE1
BE1 --> BE2
BE1 --> BE3
BE3 --> BE5
BE1 --> BE4
BE1 --> MW3
BE1 --> MW4
MW1 --> BE1
BE1 --> MW5
OP1 --> BE1
OP2 --> BE1
OP3 --> BE1
OP4 --> OP3
OP5 --> OP4
```
### 2. 服务端技术架构
- 操作系统:国产 Linux 操作系统
- 数据库MySQL/MariaDB数据库支持国产OpenGauss数据库
- 应用框架基于RuoYi-Vue-Pro框架定制开发
@ -46,7 +257,206 @@
- 代码生成自动化CRUD和表单代码生成器
- 多租户基于字段隔离的SaaS多租户设计
### 2.2 客户端
#### 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组件
@ -60,6 +470,240 @@
- 权限控制:细粒度的按钮级权限控制
- 动态表格:支持拖拽、排序、筛选
- 代码规范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
```
- 移动端:
- 核心框架uni-app跨平台
- 组件库uview-ui

Binary file not shown.