diff --git a/.cursorrules b/.cursorrules new file mode 100644 index 0000000..3abd17f --- /dev/null +++ b/.cursorrules @@ -0,0 +1,191 @@ +# 福建水务营收系统概要设计文档编写 Cursor Rules + +## 1. 项目角色与专长 +你是一名专业的系统架构师和技术文档编写专家,专门负责福建水务营收系统的概要设计文档编写工作。 + +## 2. 文档编写核心原则 + +### 2.1 技术架构原则 +- 必须基于 RuoYi-Vue-Pro 后端框架和 yudao-ui-admin-vue3 前端框架 +- 采用前后端分离架构,使用 RESTful API 设计 +- 遵循微服务设计思想,模块化组织代码 +- 必须考虑系统安全性、可扩展性和高可用性 + +### 2.2 文档质量原则 +- 结构清晰:使用统一的文档模板和章节结构 +- 内容完整:覆盖所有必要的技术细节和业务逻辑 +- 表达准确:使用标准的技术术语和业务术语 +- 图文并茂:合理使用流程图、架构图、时序图等 + +## 3. 文档结构规范 + +### 3.1 标准章节结构 +每个模块设计文档必须包含以下标准章节: +1. 功能概述 +2. 需求分析 +3. 技术架构 +4. 功能模块设计 +5. 数据库设计 +6. 接口设计 +7. 安全设计 +8. 性能设计 +9. 部署设计 +10. 测试方案 + +### 3.2 标题编号规范 +- 一级标题:# 一、二、三... +- 二级标题:## 1、2、3... +- 三级标题:### 1.1、1.2、1.3... +- 四级标题:#### 1.1.1、1.1.2、1.1.3... + +### 3.3 文件命名规范 +- 主设计文档:water_biz_[模块名]_design.md +- 数据库设计:water_biz_database_design.md +- 接口文档:water_biz_interface_design.md +- 部署文档:water_biz_deployment_design.md + +## 4. 技术术语标准化 + +### 4.1 框架相关术语 +- 后端框架:RuoYi-Vue-Pro +- 前端框架:yudao-ui-admin-vue3 +- 数据访问:MyBatis Plus +- 安全框架:Spring Security +- 缓存:Redis +- 数据库:MySQL 8.0+ + +### 4.2 水务业务术语 +- 抄表:meter reading +- 阶梯水价:tiered water pricing +- 远传水表:remote water meter +- 客户编号:customer code +- 水表编号:meter code +- 账务:accounting +- 收费:billing +- 营业网点:service outlet + +## 5. 图表绘制规范 + +### 5.1 必须使用 Mermaid 语法绘制图表 +```mermaid +graph TD + A[需求分析] --> B[架构设计] + B --> C[详细设计] + C --> D[实现开发] +``` + +### 5.2 常用图表类型 +- 系统架构图:使用 graph TD 或 graph LR +- 业务流程图:使用 flowchart TD +- 数据库关系图:使用 erDiagram +- 时序图:使用 sequenceDiagram +- 状态图:使用 stateDiagram + +## 6. 代码示例规范 + +### 6.1 后端代码示例 +必须基于 RuoYi-Vue-Pro 框架结构,包含: +- Controller 层示例 +- Service 层示例 +- Entity 层示例 +- VO/DTO 层示例 + +### 6.2 前端代码示例 +必须基于 yudao-ui-admin-vue3 框架,包含: +- Vue 3 组件示例 +- TypeScript 类型定义 +- API 调用示例 +- 路由配置示例 + +## 7. 文档验证工具链 + +### 7.1 自动化检查项目 +- 文档结构完整性检查 +- 标题编号规范性检查 +- 术语一致性检查 +- 图表格式检查 +- 代码示例格式检查 +- 链接有效性检查 + +### 7.2 质量评估标准 +- 章节完整度:必须包含所有标准章节 +- 内容丰富度:每个章节内容不少于200字 +- 图表数量:平均每1000字至少包含1个图表 +- 代码示例:技术章节必须包含代码示例 + +## 8. 导出与发布规范 + +### 8.1 支持的导出格式 +- Markdown 原生格式(.md) +- Word 文档格式(.docx) +- PDF 文档格式(.pdf) +- HTML 网页格式(.html) + +### 8.2 版本控制要求 +- 每次修改必须记录版本号和修改说明 +- 使用 Git 进行版本控制 +- 重要版本创建标签(tag) + +## 9. 协作工作流程 + +### 9.1 文档创建流程 +1. 创建文档骨架(使用标准模板) +2. 填充内容(遵循编写规范) +3. 自动化验证(运行检查工具) +4. 内部评审(技术团队评审) +5. 业务确认(业务团队确认) +6. 发布归档(生成最终版本) + +### 9.2 质量控制检查点 +- 语法检查:检查 Markdown 语法正确性 +- 格式检查:检查文档格式规范性 +- 内容检查:检查内容完整性和准确性 +- 图表检查:检查图表清晰度和正确性 + +## 10. 特殊指令与快捷操作 + +### 10.1 文档创建指令 +当用户说"创建[模块名]设计文档"时,自动生成标准模板并填充基础结构。 + +### 10.2 验证指令 +当用户说"验证文档"时,运行完整的文档质量检查流程。 + +### 10.3 导出指令 +当用户说"导出文档"时,根据需要的格式进行导出操作。 + +### 10.4 图表生成指令 +当用户说"生成[图表类型]"时,根据内容自动生成对应的 Mermaid 图表。 + +## 11. 错误处理与修复 + +### 11.1 常见问题自动修复 +- 标题编号错误:自动重新编号 +- 术语不一致:提供标准术语替换建议 +- 图表语法错误:提供正确语法示例 +- 链接失效:检查并提示修复 + +### 11.2 质量问题警告 +- 章节内容过少:警告并提供内容扩展建议 +- 缺少图表:提醒添加必要的图表 +- 代码示例不规范:提供规范的代码模板 + +## 12. 输出要求 + +### 12.1 始终使用中文 +- 所有文档内容必须使用中文编写 +- 技术术语可以保留英文,但需要中文解释 +- 代码注释必须使用中文 + +### 12.2 保持专业性 +- 使用专业的技术语言 +- 确保内容的准确性和完整性 +- 遵循软件工程文档编写最佳实践 + +### 12.3 注重实用性 +- 提供可实施的技术方案 +- 包含具体的配置示例 +- 考虑实际开发中的技术约束 + +--- + +记住:你的目标是帮助创建高质量、专业、实用的系统概要设计文档,确保文档能够指导实际的系统开发工作。 \ No newline at end of file diff --git a/.doc-config.json b/.doc-config.json new file mode 100644 index 0000000..7727603 --- /dev/null +++ b/.doc-config.json @@ -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" + } + } +} diff --git a/.gitignore b/.gitignore index 0733e14..4434f0f 100644 --- a/.gitignore +++ b/.gitignore @@ -32,3 +32,4 @@ pdf_output/福建水务业务系统模块设计.pdf pdf_output/福建水务业务系统设计方案.pdf pdf_output/福建水务业务系统数据库设计.pdf pdf_output.tar.gz +node_modules diff --git a/DOC_TOOLKIT_GUIDE.md b/DOC_TOOLKIT_GUIDE.md new file mode 100644 index 0000000..9bf39c8 --- /dev/null +++ b/DOC_TOOLKIT_GUIDE.md @@ -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` 开始您的文档编写之旅! \ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..bbd1491 --- /dev/null +++ b/Makefile @@ -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 "工具链更新完成" \ No newline at end of file diff --git a/QUICK_START.md b/QUICK_START.md new file mode 100644 index 0000000..d4eed9d --- /dev/null +++ b/QUICK_START.md @@ -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 +``` + +### 问题3:pandoc未安装 +```bash +# 解决方案:安装依赖 +make install-deps +# 或手动安装:brew install pandoc (macOS) +``` + +## 下一步 + +恭喜!您已经掌握了文档工具链的基本使用。 + +继续阅读: +- 📖 [完整使用指南](DOC_TOOLKIT_GUIDE.md) +- 📋 [Cursor Rules说明](.cursorrules) +- 📝 [文档编写计划](water_biz_design_plan.md) + +--- + +💡 **提示**:将本页面加入书签,随时查看常用命令! \ No newline at end of file diff --git a/README.md b/README.md index 3ffbe2d..b655ac6 100644 --- a/README.md +++ b/README.md @@ -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 \ No newline at end of file +### 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.0:Shell环境 +- **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) + +--- + +

+ 🚀 开始使用: + make init → + make create MODULE=你的模块名 → + make validate → + make export-word +

+ +

+ ✨ 让文档编写变得简单高效! +

\ No newline at end of file diff --git a/output/merged_docs.md b/output/merged_docs.md new file mode 100644 index 0000000..8997c70 --- /dev/null +++ b/output/merged_docs.md @@ -0,0 +1,2285 @@ +--- +title: "福建水务营收系统概要设计文档" +author: "系统设计团队" +date: "2025年06月09日" +--- + + +--- + +# 福建水务营收系统概要设计文档编写计划 + +## 一、项目背景与概述 + +福建水务营收系统是基于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. 部署运维设计说明书 +--- + +# 福建水务营收系统概要设计文档总结 + +## 一、文档构成 + +福建水务营收系统概要设计文档包含以下几个主要部分: + +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. **促进企业发展**:支持企业规模扩张,为福建水投集团打造成水利行业龙头企业提供信息化支撑。 +--- + +# 福建水务业务系统架构设计 + +## 目录 +- [1. 系统架构概述](#1-系统架构概述) +- [2. 技术架构](#2-技术架构) +- [3. 应用架构](#3-应用架构) +- [4. 数据架构](#4-数据架构) +- [5. 安全架构](#5-安全架构) +- [6. 部署架构](#6-部署架构) +- [7. 接口架构](#7-接口架构) + +## 1. 系统架构概述 + +福建水务业务系统采用多层架构设计,旨在支持集团化的集中管理、统一资源管理的业务需求。系统架构的设计目标是实现"一个业务平台、一网通平台"的建设目标,为集团及下属各分公司提供统一的营业收费系统。 + +系统架构主要包括以下核心特点: +- 多租户架构:支持集团、分公司、营业站点的多层级租户管理模式 +- 统一资源服务:统一的数字水务系统运行资源环境 +- 统一平台应用:统一业务流程,集中汇集数据 +- 统一对外接口:提供标准的接口和能力 + +### 1.1 系统架构图 + +系统整体架构如下图所示: + +![系统架构图](images/architecture_diagram.png) + + +## 2. 技术架构 + +系统采用B/S和M/S相结合的架构模式,具体技术栈如下: + +### 2.1 服务端 +- 操作系统:国产 Linux 操作系统 +- 数据库:MySQL/MariaDB数据库,支持国产OpenGauss数据库 +- 应用框架:基于RuoYi-Vue-Pro框架定制开发 + - 核心框架:Spring Boot 3.x,支持JDK 17/21 + - ORM框架:MyBatis Plus,增强的MyBatis + - 权限框架:Spring Security,基于RBAC的权限管理 + - 数据缓存:Redis + Redisson,高性能缓存和分布式锁 + - 工作流引擎:Flowable,灵活的工作流处理 + - 任务调度:基于Quartz的CRON任务调度 + - 服务监控:Spring Boot Admin、SkyWalking APM + - 消息队列:基于Redis的轻量级消息队列 + - 文档生成:Knife4j,基于Swagger的API文档生成 + - 代码生成:自动化CRUD和表单代码生成器 + - 多租户:基于字段隔离的SaaS多租户设计 + +### 2.2 客户端 +- 前端框架:基于yudao-ui-admin-vue3框架定制开发 + - 核心框架:Vue 3.x + TypeScript + - 组件库:Element Plus,现代化UI组件 + - 状态管理:Pinia,新一代的Vue状态管理库 + - 路由管理:Vue Router + - HTTP工具:Axios,请求拦截与统一处理 + - CSS框架:Tailwind CSS / UnoCSS,原子化CSS + - 图表组件:ECharts,强大的可视化图表库 + - 富文本编辑器:WangEditor + - 文件上传:基于Element Plus的上传组件 + - 权限控制:细粒度的按钮级权限控制 + - 动态表格:支持拖拽、排序、筛选 + - 代码规范:ESLint + Prettier,标准化代码风格 +- 移动端: + - 核心框架:uni-app(跨平台) + - 组件库:uview-ui + - 小程序支持:微信小程序、支付宝小程序等 + - 移动端地图:高德地图SDK(用于抄表轨迹和导航) + - 设备接入:NFC、扫码、相机等硬件设备接口 + +### 2.3 技术特性 +- 单点登录:OAuth2 + JWT实现统一认证 +- 数据交换:基于RESTful API的系统内部数据交换与共享 +- 统一报表平台:集成JimuReport,支持自定义报表设计与生成 +- 大屏设计:集成GoView,支持可视化大屏设计 +- 安全保障:满足安全等保三级要求 + - 密码加密:BCrypt加密算法 + - 防XSS攻击:表单数据过滤 + - 防SQL注入:参数化查询 + - 防CSRF攻击:Token验证 +- 性能规格:支持200并发用户,50并发移动设备,系统响应时间不超过3秒 +- 扩展容量:支持100万客户的业务量,满足企业3-5年的业务发展需求 +- 支持功能: + - 支付管理:微信支付、支付宝支付等 + - 短信服务:阿里云、腾讯云等多家短信服务商 + - AI能力: + - 智能抄表:基于图像识别的水表读数 + - 异常分析:基于AI的用水异常分析 + - API网关:支持API权限管理、限流熔断、白名单控制 + +## 3. 应用架构 + +系统应用架构基于业务域划分,主要包括以下核心应用模块: + +### 3.1 统一平台 +- 单点登录:统一认证入口,支持多种登录方式 +- 系统管理:组织机构、员工管理、角色权限管理、菜单配置等 +- 流程节点提醒:工作流节点到期和状态变更提醒 + +### 3.2 营收系统 +- 系统管理:水价管理、用户档案管理、更名过户管理等 +- 抄表开账:册本管理、抄表录入、复核开账等 +- 收费管理:柜台收费、特殊开账、柜台结账、批量缴费等 +- 账务处理:预存调整、未销调整、已销调整、分账调整等 +- 发票管理:发票查询、发票开具、电子发票等 +- 代收业务:实时收费、银行代扣、银行托收等 +- 环卫系统:计费核定、计费退补、计费减免等 +- 业务工单:业务清单、上报清单、稽查工单、移表工单等 + +### 3.3 客户服务 +- 微信、支付宝服务窗:账户绑定、用水查询、在线缴费等 +- 历史账单:账单查询、用水分析、账单推送等 +- 电子发票:发票申请、发票查询、发票下载等 +- 营业网点:网点查询、网点导航、业务指南等 +- 账户流水:流水查询、明细下载、交易统计等 +- 微网厅:用户注册、信息查询、业务办理等 + +### 3.4 表务系统 +- 表务工单:换表工单、移表工单、拆表工单、复装工单等 +- 表务仓库:新表入库、水表检定、水表领用、水表出库等 +- 水表参数与基础信息:水表厂家管理、水表型号管理等 +- 物联网对接与数据同步:厂家设备信息管理、远程抄表数据同步等 + +### 3.5 报装管理 +- 报装流程:报装申请、方案设计、合同签订、施工管理等 +- 一户一表管理:改造计划、改造实施、用户转换等 + +### 3.6 统计分析 +- 报表查询:标准报表、自定义报表、报表导出打印等 +- 欠费查询:欠费情况统计、欠费用户明细、欠费分析等 +- 缴费记录:缴费情况统计、缴费明细查询、缴费趋势分析等 +- 用水分析:用水量统计、用水趋势分析、异常用水分析等 + +### 3.7 工程管理 +- 工程申请:工程立项、材料提交、前期勘察等 +- 工程施工:施工计划、施工派工、施工记录等 +- 工程验收:验收申请、验收检查、验收记录等 +- 工程查询:工程进度查询、工程资料查询、工程统计等 + +### 3.8 抄表APP +- 首页功能:首页展示、个人信息、快捷查询等 +- 抄表功能:抄表任务、NFC抄表、扫码抄表、AI录入等 +- 工单管理:问题上报、问题回填、代办工单、稽查工单等 + +### 3.9 接口服务 +- API市场:API展示、API使用说明、API测试等 +- API管理:API申请、API调度看板、接口服务配置管理等 +- 接口权限管理:授权管理、白名单管理、安全策略等 +- 系统对外接口:查询接口、业务处理接口、状态同步接口等 + +### 3.10 系统配置 +- 水表参数:水表厂家、水表型号、水表量程等 +- 地址参数:行政区划、地址编码、地址库等 +- 价格体系:用水性质、水价标准、阶梯水价等 +- 基本配置:系统参数、业务规则、打印模板等 +- 催缴管理:催缴计划、催缴任务、催缴执行等 +- 用户权限:菜单权限、功能权限、数据权限等 +- 定时任务:任务配置、任务监控、任务日志等 + +## 4. 数据架构 + +系统数据架构基于客户关系数据库为核心和基础,实现客户全生命周期管理。 + +### 4.1 数据分层 +- 数据采集层:负责从各业务系统和物联网设备采集原始数据 +- 数据存储层:统一数据存储,实现分布式数据管理 +- 数据服务层:提供数据服务接口 +- 数据展现层:提供数据分析和可视化功能 + +### 4.2 数据模型 +- 客户信息模型:包含客户基础信息、表卡信息、账户信息、联系人信息等 +- 业务数据模型:抄表数据、收费数据、账务数据、发票数据等 +- 工单数据模型:表务工单、报装工单、业务工单等 +- 配置数据模型:系统参数、水表参数、价格体系等 +- 报表数据模型:统计数据、分析数据、预测数据等 +- 物联网数据模型:设备信息、状态信息、实时数据等 + +### 4.3 数据集成与共享 +- 统一数据标准:定义统一的数据标准和数据字典 +- 数据集成机制:采用ESB实现系统间的数据集成 +- 数据共享机制:基于统一的数据服务接口实现数据共享 +- 数据同步策略:实时同步、定时同步、批量同步等 + +## 5. 安全架构 + +系统安全架构满足等保三级要求,主要包括以下安全措施: + +### 5.1 网络安全 +- 边界防护:防火墙、入侵检测/防御系统 +- 访问控制:基于角色的访问控制 +- 通信安全:SSL/TLS加密传输 +- 安全监控:实时监控网络安全状态 + +### 5.2 数据安全 +- 数据加密:敏感数据加密存储 +- 数据备份:定期数据备份和恢复机制 +- 数据审计:关键操作的审计日志 +- 数据脱敏:敏感数据的显示脱敏和处理脱敏 +- 数据权限:基于多租户的数据隔离和访问控制 + +### 5.3 应用安全 +- 身份认证:多因素认证 +- 授权管理:细粒度的权限控制 +- 安全审计:用户操作审计 +- 密码策略:密码复杂度、定期更换、失败锁定等 +- 会话管理:会话超时、并发限制等 + +### 5.4 接口安全 +- 接口认证:基于Token的接口认证 +- 接口授权:基于角色的接口授权 +- 接口加密:敏感数据的加密传输 +- 接口防护:防重放、防篡改等安全措施 +- 接口限流:基于IP、用户、应用的限流策略 + +## 6. 部署架构 + +系统采用集中部署的模式,基于集团私有云环境进行部署。 + +### 6.1 物理部署 +- 生产环境:高可用集群部署 + - 应用服务器:2台或以上服务器,负载均衡 + - 数据库服务器:主从架构,实时同步 + - 缓存服务器:Redis集群 + - 文件服务器:冗余存储 +- 灾备环境:异地灾备,定期数据同步 +- 测试环境:用于系统测试和验证 +- 开发环境:用于系统开发和集成测试 + +### 6.2 逻辑部署 +- 应用服务器集群:负责业务逻辑处理 +- 数据库服务器集群:负责数据存储和管理 +- 文件服务器:负责文档和附件存储 +- 缓存服务器:提高系统性能 +- 负载均衡服务器:实现请求分发和负载均衡 +- 移动应用服务:提供移动端API服务 +- API网关:统一的接口管理和控制 + +### 6.3 容器部署 +- 基于Docker容器技术实现微服务部署 +- 使用Kubernetes进行容器编排和管理 +- 支持容器的自动扩缩容和故障转移 +- 实现服务的灰度发布和版本控制 + +## 7. 接口架构 + +系统提供标准化的接口,实现与外部系统的集成和数据交换。 + +### 7.1 外部接口 +- 银行接口:实现与银行系统的对接,支持代扣、托收等功能 +- 支付宝/微信接口:支持在线支付功能 +- 短信接口:支持短信通知和验证码功能 +- 集抄系统接口:实现与智能水表集中抄表系统的对接 +- 政务系统接口:实现与地方政务平台和政务APP的对接 +- 消火栓系统接口:实现与消火栓系统的对接 +- 环卫系统接口:实现与环卫系统的对接 +- OA系统接口:实现与OA系统的工作流对接 + +### 7.2 内部接口 +- ESB服务接口:系统内部模块间的数据交换 +- 报表接口:提供报表数据查询和生成功能 +- 查询接口:提供数据查询功能 +- 业务处理接口:提供业务处理功能 +- 消息通知接口:提供消息推送和通知功能 +- 工作流接口:提供工作流处理和状态查询功能 + +### 7.3 接口标准 +- 接口协议:RESTful API、WebService、消息队列等 +- 数据格式:JSON、XML等 +- 接口安全:身份认证、授权、加密传输等 +- 接口文档:统一的接口文档和示例代码 +- 接口测试:提供接口测试工具和环境 + +### 7.4 接口服务管理 +- API网关:统一的接口入口和管理 +- 服务注册与发现:服务的自动注册和发现 +- 服务路由:根据请求参数进行服务路由 +- 服务降级:在服务不可用时提供降级策略 +- 服务监控:实时监控服务的可用性和性能 +--- + +# 福建水务业务系统概要设计 + +## 目录 +- [福建水务业务系统概要设计](#福建水务业务系统概要设计) + - [目录](#目录) + - [1. 统一平台](#1-统一平台) + - [1.1 单点登录](#11-单点登录) + - [1.2 系统管理](#12-系统管理) + - [2. 营收系统](#2-营收系统) + - [2.1 系统管理](#21-系统管理) + - [2.2 抄表开账](#22-抄表开账) + - [2.3 收费管理](#23-收费管理) + - [2.4 账务处理](#24-账务处理) + - [2.5 发票管理](#25-发票管理) + - [2.6 代收业务](#26-代收业务) + - [2.7 环卫系统](#27-环卫系统) + - [2.8 业务工单](#28-业务工单) + - [3. 表务系统](#3-表务系统) + - [3.1 表务工单](#31-表务工单) + - [3.2 表务仓库](#32-表务仓库) + - [3.3 水表参数与基础信息](#33-水表参数与基础信息) + - [3.4 物联网对接与数据同步](#34-物联网对接与数据同步) + - [4. 报装系统](#4-报装系统) + - [4.1 报装流程](#41-报装流程) + - [4.2 一户一表管理](#42-一户一表管理) + - [5. 客户服务](#5-客户服务) + - [5.1 微信、支付宝服务窗](#51-微信支付宝服务窗) + - [5.2 历史账单](#52-历史账单) + - [5.3 电子发票](#53-电子发票) + - [5.4 营业网点](#54-营业网点) + - [5.5 账户流水](#55-账户流水) + - [5.6 微网厅](#56-微网厅) + - [6. 系统配置](#6-系统配置) + - [6.1 水表参数](#61-水表参数) + - [6.2 地址参数](#62-地址参数) + - [6.3 价格体系](#63-价格体系) + - [6.4 基本配置](#64-基本配置) + - [6.5 催缴管理](#65-催缴管理) + - [6.6 用户权限](#66-用户权限) + - [6.7 定时任务](#67-定时任务) + - [7. 系统接口](#7-系统接口) + - [7.1 银行接口](#71-银行接口) + - [7.2 支付宝/微信接口](#72-支付宝微信接口) + - [7.3 短信接口](#73-短信接口) + - [7.4 集抄系统接口](#74-集抄系统接口) + - [7.5 政务系统接口](#75-政务系统接口) + - [7.6 消火栓系统接口](#76-消火栓系统接口) + - [7.7 其他系统对接](#77-其他系统对接) + - [8. 统计分析](#8-统计分析) + - [8.1 报表查询](#81-报表查询) + - [8.2 欠费查询](#82-欠费查询) + - [8.3 缴费记录](#83-缴费记录) + - [8.4 用水分析](#84-用水分析) + - [9. 工程管理](#9-工程管理) + - [9.1 工程申请](#91-工程申请) + - [9.2 工程施工](#92-工程施工) + - [9.3 工程验收](#93-工程验收) + - [9.4 工程查询](#94-工程查询) + - [10. 抄表APP](#10-抄表app) + - [10.1 首页功能](#101-首页功能) + - [10.2 抄表功能](#102-抄表功能) + - [10.3 工单管理](#103-工单管理) + - [11. 接口服务](#11-接口服务) + - [11.1 API市场](#111-api市场) + - [11.2 API管理](#112-api管理) + - [11.3 接口权限管理](#113-接口权限管理) + - [11.4 系统对外接口](#114-系统对外接口) + +## 1. 统一平台 + +统一平台是客户服务平台的综合展示平台,基于RuoYi-Vue-Pro和yudao-ui-admin-vue3框架构建,包含日常工作功能和客户全部的信息,是系统的基础功能模块。 + +### 1.1 单点登录 + +单点登录模块基于Spring Security和JWT实现用户一次登录即可访问系统中所有应用的功能,主要特点包括: + +- 支持通过用户名、密码进行身份认证 +- 支持OAuth2.0授权码+PKCE模式的第三方登录 +- 支持手机号+短信验证码登录方式 +- 支持多因素认证(MFA)增强安全性 +- 根据登录人员所在公司的不同,显示不同的系统名称和界面风格 +- 提供流程节点到期提醒功能 +- Token自动刷新机制,提升用户体验 + +### 1.2 系统管理 + +系统管理模块基于RuoYi-Vue-Pro框架的现成功能,提供对系统基础参数的配置管理功能,主要包括: + +- 组织机构管理: + - 支持多级组织结构的管理 + - 支持组织机构导入导出 + - 组织关系树形展示 + - 组织数据权限控制 +- 员工管理: + - 系统操作人员的基本信息管理 + - 用户分配角色与权限 + - 用户状态管理(启用/禁用) + - 用户密码安全策略 + - 用户操作日志记录 +- 角色权限管理: + - 基于RBAC模型的权限控制 + - 支持数据权限精细化控制 + - 支持多租户的权限隔离 + - 基于菜单、按钮级别的权限管理 +- 系统菜单配置: + - 支持自定义系统菜单和功能模块 + - 菜单多级分类管理 + - 动态路由生成 + - 菜单权限配置 +- 数据字典管理: + - 维护系统使用的各类基础代码数据 + - 支持字典项多级管理 + - 支持字典缓存,提高访问性能 +- 系统监控: + - 在线用户监控与管理 + - 服务器性能监控 + - 定时任务执行状态监控 + - 系统缓存监控与管理 +- 系统日志管理: + - 记录用户登录日志 + - 记录操作日志,支持操作回溯 + - 记录系统异常日志,便于问题排查 +- 短信管理: + - 支持阿里云、腾讯云等多家短信渠道 + - 短信模板配置管理 + - 短信发送日志记录 +- 租户管理: + - 支持SaaS多租户 + - 租户套餐配置 + - 租户数据隔离 + - 租户资源管理 +- 配置管理: + - 系统参数配置 + - 通知公告管理 + - 定时任务配置 + +## 2. 营收系统 + +营收系统是水务业务系统的核心组成部分,负责抄表、收费、账务处理等关键业务功能。 + +### 2.1 系统管理 + +营收系统的基础管理功能,包括: + +- 水价管理:不同用户类型的水价标准管理,支持阶梯水价 +- 用户档案管理:维护用户基本信息、用水信息、账户信息等 + - 客户分组管理 + - 集收管理 + - 客户基础信息管理 + - 定额管理 + - 客户优惠方案设置 +- 更名过户管理:处理用户变更、过户等业务 +- 注销报停管理:处理用户注销、暂停用水等业务 + +### 2.2 抄表开账 + +抄表开账模块负责水表读数的采集和账单生成,主要功能包括: + +- 册本管理:册本基本信息的维护和管理 +- 抄表录入:支持手工抄表、智能抄表、自报抄表 +- 抄表数据审核:数据校验、异常处理、开账处理 +- 追加抄表:支持非周期性特殊抄表 + +### 2.3 收费管理 + +收费管理模块负责水费的收取和管理,主要功能包括: + +- 柜台收费:用户查询、收费处理、收费打印、预存预付 +- 柜台结账:日结、交款、结账查询 +- 预付款管理:预付款充值、使用和退款 +- 缴费记录查询:支持多条件查询缴费记录 + +### 2.4 账务处理 + +账务处理模块负责处理各类特殊账务情况,主要功能包括: + +- 未销调整:水量调整、金额调整、违约金减免等 +- 特殊开账:特殊情况下的账单生成 +- 账务退款:多缴费退款、预付款退款等 +- 销账调正:对已缴费账单进行调整处理 +- 预存调整:预存余额调整、预存转账等 +- 账务处理日志:记录所有账务处理操作 + +### 2.5 发票管理 + +发票管理模块负责水费发票的管理,主要功能包括: + +- 库存管理:发票入库、领用、作废 +- 发票打印:普通发票和电子发票 +- 发票查询:发票信息查询和统计 +- 发票调整:发票重开、补开 + +### 2.6 代收业务 + +代收业务模块负责处理各种渠道的水费代收业务,主要功能包括: + +- 实时收费:银行代收、支付宝/微信收费、代收点收费 +- 银行代扣:代扣协议管理、代扣数据生成和处理 +- 银行托收:托收单生成、托收数据处理 +- 代扣渠道管理:渠道维护、规则设置、效率分析 + +### 2.7 环卫系统 + +环卫系统模块负责管理与环卫相关的收费和计费业务,主要功能包括: + +- 计费核定:环卫收费规则配置和业务字典维护 +- 计费退补:退费和补缴规则配置,字典配置参与计算 +- 计费减免:环卫费用减免规则配置和审批流程 +- 环卫收费统计:环卫收费数据统计和分析 + +### 2.8 业务工单 + +业务工单模块负责管理日常业务工单的流转和处理,主要功能包括: + +- 业务清单:查询通过系统办理的日常业务工单及进度信息 +- 上报清单:新增、查询问题清单,包括通过手机端上报的问题 +- 稽查工单:对手机端的稽查信息进行多条件查询和导出 +- 移表工单:客户对需要进行移动的水表进行登记 +- 换表工单:新增客户自报的换表和故障的水表等进行换表登记 +- 工作流可视化:工作节点可视化展示和流程管理 + +## 3. 表务系统 + +表务系统负责水表的全生命周期管理,包括水表购置、安装、维修、更换等业务。 + +### 3.1 表务工单 + +表务工单模块负责处理各类表务作业,主要功能包括: + +- 换表工单:换表计划、换表施工、换表回填 +- 移表工单:移表申请、移表施工、移表验收 +- 拆表工单:拆表申请、拆表施工、拆表确认 +- 复装工单:复装申请、复装施工、复装验收 +- 校表工单:校表申请、校表实施、校表结果 +- 稽查工单:水量异常稽查、违规用水稽查、处罚决定 +- 业务上报:异常上报、投诉上报、处理结果反馈 + +### 3.2 表务仓库 + +表务仓库模块负责水表的仓储管理,主要功能包括: + +- 新表入库:水表检定、入库登记、入库确认 +- 水表检定:检定信息记录、结果管理 +- 水表领用:领用单登记、领用单管理 +- 水表出库:出库登记、出库确认 +- 水表退库:退库申请、退库确认 +- 水表报废:报废申请、报废确认 +- 水表生命周期查询:状态查询、历史记录查询 + +### 3.3 水表参数与基础信息 + +水表参数与基础信息模块负责维护水表相关的基础数据,主要功能包括: + +- 水表厂家管理:厂家信息维护、厂家状态管理 +- 水表型号管理:型号信息维护、型号分类管理 +- 水表口径管理:口径信息维护、定换周期设置 +- 水表量程管理:量程信息维护、量程范围设置 + +### 3.4 物联网对接与数据同步 + +物联网对接与数据同步模块负责水表数据的互联互通,主要功能包括: + +- 厂家设备信息管理:设备型号管理、厂家信息维护 +- 表务对接日志:数据同步日志、错误处理 +- 水表数据推送接口:新表数据推送、校验机制 +- 远程抄表数据同步:数据接收、验证与处理 +- 物联网水表监控:状态监控、异常事件报警 + +## 4. 报装系统 + +报装系统负责新用户的报装立户管理,主要功能包括: + +### 4.1 报装流程 + +报装流程模块负责新用户报装业务的全流程管理,主要功能包括: + +- 报装申请:用户申请、材料审核、现场勘查 +- 方案设计:设计方案、设计审核、费用估算 +- 合同签订:费用通知、合同签订、收费管理 +- 施工管理:施工计划、施工实施、施工验收 +- 开户通水:水表安装、用户立户、通水确认 + +### 4.2 一户一表管理 + +一户一表管理模块负责实施"一户一表"改造,主要功能包括: + +- 改造计划:制定改造计划、用户协商、费用估算 +- 改造实施:施工管理、水表安装、验收管理 +- 用户转换:数据转换、账务处理、使用确认 + +## 5. 客户服务 + +客户服务模块提供多渠道的客户服务功能,主要包括: + +### 5.1 微信、支付宝服务窗 + +- 账户绑定:支持用户绑定水务账户 +- 用水查询:查询用水情况和用水趋势 +- 水费查询:查询水费信息和欠费信息 +- 在线缴费:支持在线缴纳水费 +- 业务办理:支持在线办理简单业务 + +### 5.2 历史账单 + +- 账单查询:查询历史账单信息 +- 用水分析:分析用水趋势,提供图表展示 +- 账单推送:定期推送账单信息 +- 账单明细:提供详细的账单明细 + +### 5.3 电子发票 + +- 发票申请:申请开具电子发票 +- 发票查询:查询已开具发票 +- 发票下载:下载电子发票 +- 发票推送:推送电子发票到用户邮箱或微信 + +### 5.4 营业网点 + +- 网点查询:查询营业网点信息 +- 网点导航:提供到营业网点的导航 +- 业务指南:提供各网点业务办理指南 +- 等候情况:实时显示各网点的等候情况 + +### 5.5 账户流水 + +- 流水查询:查询账户交易流水 +- 明细下载:下载流水明细 +- 交易统计:提供交易金额统计 +- 缴费证明:生成缴费证明 + +### 5.6 微网厅 + +- 用户注册:用户注册微网厅账号 +- 信息查询:查询用水、缴费信息 +- 业务办理:在线办理各类业务 +- 用户反馈:提交意见建议 + + +## 6. 系统配置 + +系统配置模块提供各类系统参数的配置管理功能,主要包括: + +### 6.1 水表参数 + +- 水表厂家:管理水表生产厂商信息 +- 水表型号:管理水表型号规格 +- 水表量程:管理水表量程规格 + +### 6.2 地址参数 + +- 行政区划:管理行政区划信息 +- 地址编码:管理地址编码规则 +- 地址库:维护标准地址库 + +### 6.3 价格体系 + +- 用水性质:管理不同用水性质的分类 +- 水价标准:管理不同用水性质的水价标准 +- 阶梯水价:管理阶梯水价设置 +- 调价管理:管理水价调整流程 + +### 6.4 基本配置 + +- 系统参数:管理系统基本参数 +- 业务规则:管理业务处理规则 +- 打印模板:管理各类打印模板 +- 短信模板:管理短信发送模板 + +### 6.5 催缴管理 + +- 催缴计划:制定欠费催缴计划 +- 催缴任务:分配催缴任务 +- 催缴执行:记录催缴执行情况 +- 催缴结果:统计催缴结果 + +### 6.6 用户权限 + +- 菜单权限:不同角色可访问的菜单权限配置 +- 功能权限:不同角色可操作的功能权限配置 +- 数据权限:通过查询字典权限控制不同用户业务取数权限 +- 角色管理:自定义角色及权限组合 + +### 6.7 定时任务 + +- 任务配置:定时任务可视化配置,包含传参设置 +- 任务监控:定时任务执行状态监控 +- 任务日志:定时任务执行日志记录和查询 +- 任务调度:任务优先级和执行顺序管理 + +## 7. 系统接口 + +系统接口模块提供与外部系统的集成和数据交换功能,实现业务数据的互通互联。 + +### 7.1 银行接口 + +银行接口实现与银行系统的对接,支持代扣、托收等功能,主要包括: + +- 收费接口:实现用户通过银行渠道缴纳水费 +- 冲正接口:处理银行退款和交易取消 +- 对账接口:与银行系统进行对账 +- 托收接口:支持银行托收功能 +- 代扣接口:支持银行代扣功能 + +### 7.2 支付宝/微信接口 + +支付宝和微信接口实现与第三方支付平台的对接,支持在线支付功能,主要包括: + +- 欠费查询:查询用户欠费信息 +- 在线支付:支持用户在线缴纳水费 +- 支付通知:处理支付结果通知 +- 对账接口:与支付平台进行对账 + +### 7.3 短信接口 + +短信接口提供短信通知和验证功能,主要包括: + +- 账单通知:通过短信通知用户账单信息 +- 缴费提醒:提醒用户及时缴费 +- 催缴通知:向欠费用户发送催缴短信 +- 业务通知:通知用户业务办理状态 +- 验证码功能:提供短信验证码服务 + +### 7.4 集抄系统接口 + +集抄系统接口实现与智能水表集中抄表系统的对接,主要包括: + +- 抄表数据获取:获取智能水表的抄表数据 +- 水表状态监控:监控水表的使用状态 +- 异常数据处理:处理抄表异常情况 + +### 7.5 政务系统接口 + +政务系统接口实现与地方政务平台和政务APP的对接,主要包括: + +- 数据推送:推送营收数据到政务平台 +- 数据查询:支持政务平台查询水务数据 +- 缴费对接:支持通过政务平台缴费 +- 报装工单对接:对接报装业务工单 + +### 7.6 消火栓系统接口 + +消火栓系统接口实现与消火栓系统的对接,主要功能包括: + +- 预存缴费管理:管理用户预存水费 +- 剩余水量计算:计算用户剩余可用水量 +- 取水控制:根据预存和剩余水量控制取水 + +### 7.7 其他系统对接 + +其他系统对接模块负责与周边系统进行数据交换和业务协同,主要功能包括: + +- 环卫系统对接:实现与环卫系统的数据同步和业务流程对接 +- 客服系统对接:实现与客服系统的工单同步和问题处理 +- 工单系统对接:实现与工单系统的工单流转和状态同步 +- OA系统对接:实现与OA系统的审批流程对接和数据共享 +- 智水擎平台对接:实现与智水擎平台的数据交换和业务协同 + +## 8. 统计分析 + +统计分析模块提供多维度的数据统计和分析功能,为管理决策提供数据支持。 + +### 8.1 报表查询 + +- 标准报表:系统内置的标准统计报表 +- 自定义报表:用户可自定义的报表 +- 报表导出:支持将报表导出为Excel、PDF等格式 +- 报表打印:支持报表打印功能 + +### 8.2 欠费查询 + +- 欠费情况统计:按区域、用户类型等维度统计欠费情况 +- 欠费用户明细:查询欠费用户的详细信息 +- 欠费分析:分析欠费原因和趋势 +- 欠费导出:支持将欠费数据导出 + +### 8.3 缴费记录 + +- 缴费情况统计:按多维度统计缴费情况 +- 缴费明细查询:查询缴费明细记录 +- 缴费趋势分析:分析缴费趋势 +- 缴费渠道分析:分析各缴费渠道的使用情况 + +### 8.4 用水分析 + +- 用水量统计:按多维度统计用水量 +- 用水趋势分析:分析用水趋势,预测用水需求 +- 异常用水分析:识别和分析异常用水情况 +- 节水潜力分析:分析用户节水潜力 + +## 9. 工程管理 + +工程管理模块负责处理与供水工程相关的业务,包括工程申请、施工管理和工程验收等。 + +### 9.1 工程申请 + +- 工程立项:新建供水工程的立项申请 +- 材料提交:上传工程相关材料 +- 前期勘察:记录工程前期勘察结果 +- 工程预算:制定工程预算方案 +- 申请审批:对工程申请进行审批 + +### 9.2 工程施工 + +- 施工计划:制定工程施工计划 +- 施工派工:将施工任务分配给施工人员 +- 施工记录:记录施工过程和施工情况 +- 材料管理:管理工程施工材料的使用情况 +- 施工异常处理:处理施工过程中的异常情况 + +### 9.3 工程验收 + +- 验收申请:提交工程验收申请 +- 验收检查:对工程进行验收检查 +- 验收记录:记录验收结果 +- 竣工结算:进行工程竣工结算 +- 工程归档:对工程资料进行归档 + +### 9.4 工程查询 + +- 工程进度查询:查询工程进度情况 +- 工程资料查询:查询工程相关资料 +- 工程统计:统计工程数量、金额等信息 +- 工程分析:分析工程实施情况 + +## 10. 抄表APP + +抄表APP是针对移动端开发的抄表工具,支持外勤人员进行现场抄表、问题处理和工单管理等业务操作。 + +### 10.1 首页功能 + +- 首页:显示当前登录用户信息、快捷搜索和主要和抄表业务相关的功能模块 +- 个人信息:查看个人信息,可以进行密码、手机号信息修改,可以进行抄表设置 +- 快捷查询:提供搜索栏,用户输入户号、户名、地址以及册本后,系统会自动检索到相关的信息 + +### 10.2 抄表功能 + +- 抄表任务:显示当前登录的抄表员抄表任务信息 +- NFC抄表:抄表设备感应NFC后自动弹出抄表页 +- 扫码抄表:扫水表上二维码,搜集该表信息,弹出抄表页 +- 数据采集:抄表数据现场采集功能 +- AI录入:对接AI接口实现智能读数 +- 抄表轨迹:记录表的物理位置,在地图上点击后采集水表定位 +- 抄表导航:指引抄表员前往下一个抄表点 +- 抄表汇总:系统会根据当前登录的人员自动汇总抄表信息 +- 账单查询:查询客户账单详情 +- 欠费查询:显示当前登录的抄表员抄表用水客户的欠费情况 + +### 10.3 工单管理 + +- 问题上报:系统支持上报当前登录的抄表员抄表时遇到的用水问题 +- 问题回填:问题上报后,可进行问题回填和处理 +- 代办工单:显示当前登录的抄表员需要代办工单 +- 平台工单管理:移动端提交工单后,系统会自动提交到工单处置平台进行受理、派发 +- 停水复水工单:当客户存在欠费的情况下可以对该客户进行停水操作 +- 稽查工单:实现抄表稽查和水价稽查 +- 维修工单:提交坏表维修报修等工单 + +## 11. 接口服务 + +接口服务模块提供系统对外的API接口管理和服务能力,实现与第三方系统的便捷集成。 + +### 11.1 API市场 + +- API展示:展示系统提供的各类API接口 +- API使用说明:提供API接口的详细使用说明和示例 +- API测试:提供API接口的在线测试功能 + +### 11.2 API管理 + +- API申请:第三方系统申请调用API的流程管理 +- API调度看板:监控API调用情况和性能指标 +- 接口服务配置管理:管理API接口的配置参数 +- 接口限流熔断管理:控制API接口的调用频率和熔断机制 + +### 11.3 接口权限管理 + +- 授权管理:管理API接口的授权信息 +- 白名单管理:设置允许访问API的IP白名单 +- 安全策略:设置API调用的安全策略和防护措施 + +### 11.4 系统对外接口 + +- 查询接口:提供各类数据查询接口 +- 业务处理接口:提供业务处理和操作接口 +- 状态同步接口:提供状态信息同步接口 +- 数据推送接口:提供数据推送和订阅接口 +--- + +# 福建水务业务系统数据库设计 + +## 目录 +- [1. 数据库设计概述](#1-数据库设计概述) +- [2. 数据库架构](#2-数据库架构) +- [3. 主要数据实体](#3-主要数据实体) +- [4. 表结构设计](#4-表结构设计) +- [5. 索引设计](#5-索引设计) +- [6. 数据安全性设计](#6-数据安全性设计) + +## 1. 数据库设计概述 + +福建水务业务系统的数据库设计基于MySQL/MariaDB数据库管理系统(同时支持国产OpenGauss数据库),采用关系型数据库模型,以支持业务系统的高并发、高可靠性需求。数据库设计遵循标准化、安全性、扩展性和性能优化的原则,为业务系统提供稳定、高效的数据存储和访问支持。 + +### 1.1 设计目标 + +- 支持系统功能需求,满足业务处理的数据需求 +- 优化数据库性能,支持高并发访问 +- 确保数据安全性,防止数据泄露和丢失 +- 支持系统横向扩展,适应业务增长需求 +- 支持多租户架构,实现数据隔离 + +### 1.2 设计原则 + +- **规范化设计**:遵循数据库设计的第三范式,减少数据冗余 +- **适度冗余**:对于常用查询,适度保留冗余字段,提高查询效率 +- **模块化**:按业务模块划分表组,便于维护和扩展 +- **安全性**:设计完善的权限控制和数据加密方案 +- **可扩展性**:预留扩展字段,支持业务功能的扩展 +- **通用字段**:遵循RuoYi-Vue-Pro框架规范,统一基础字段定义 + +## 2. 数据库架构 + +### 2.1 总体架构 + +系统采用集中式数据库架构,主要包含以下组件: + +- **主数据库**:MySQL/MariaDB主从架构,存储核心业务数据,支持事务处理 +- **报表数据库**:存储统计分析数据,支持复杂查询和报表生成 +- **历史数据库**:存储历史业务数据,减轻主数据库负担 +- **缓存系统**:使用Redis作为缓存数据库,缓存热点数据,提高访问效率 + +### 2.2 多租户设计 + +系统采用基于字段的方式实现多租户架构,主要包括: + +- **共享数据库,共享模式**:所有租户共享同一数据库实例和表结构 +- **租户标识列**:在每个表中增加tenant_id租户标识列,实现数据隔离 +- **多租户拦截器**:基于MyBatis Plus的多租户拦截器,自动为SQL添加租户条件 +- **权限控制**:通过数据权限控制租户对数据的访问 + +### 2.3 数据访问层设计 + +系统基于MyBatis Plus框架实现数据访问层,主要特点包括: + +- **通用CRUD**:利用MyBatis Plus提供的BaseMapper,简化基础CRUD操作 +- **分页查询**:使用MyBatis Plus的分页插件,实现高性能分页 +- **条件构造器**:使用LambdaQueryWrapper/LambdaUpdateWrapper构建动态SQL +- **自动填充**:通过MetaObjectHandler自动填充创建时间、更新时间等字段 +- **乐观锁**:支持通过版本号实现乐观锁控制 +- **数据权限**:通过自定义拦截器实现数据权限过滤 +- **多租户**:基于TenantLineInnerInterceptor实现多租户数据隔离 + +### 2.4 通用字段设计 + +系统中所有业务表都包含以下通用字段: + +| 字段名 | 数据类型 | 长度 | 是否为空 | 描述 | +|-------|---------|------|---------|-----| +| id | BIGINT | - | 否 | 主键ID | +| creator | VARCHAR | 64 | 是 | 创建者 | +| create_time | DATETIME | - | 否 | 创建时间 | +| updater | VARCHAR | 64 | 是 | 更新者 | +| update_time | DATETIME | - | 是 | 更新时间 | +| deleted | TINYINT | 1 | 否 | 是否删除(0正常,1删除) | +| tenant_id | BIGINT | - | 否 | 租户ID | +| version | INT | - | 是 | 乐观锁版本号 | + +## 3. 主要数据实体 + +系统主要包含以下核心数据实体: + +### 3.1 客户实体 + +- **客户基本信息**:存储客户的基本资料 +- **表卡信息**:存储水表基本信息和安装位置 +- **账户信息**:存储客户账户信息和余额 +- **联系人信息**:存储客户联系人信息 + +### 3.2 营收实体 + +- **抄表记录**:存储水表抄读记录 +- **账单信息**:存储客户水费账单 +- **缴费记录**:存储客户缴费记录 +- **调价记录**:存储水价调整记录 + +### 3.3 表务实体 + +- **水表档案**:存储水表的完整信息和生命周期 +- **表务工单**:存储表务作业工单信息 +- **仓库信息**:存储水表仓库信息 +- **出入库记录**:存储水表出入库记录 + +### 3.4 报装实体 + +- **报装申请**:存储新用户报装申请信息 +- **报装工单**:存储报装作业工单信息 +- **施工记录**:存储报装施工记录 +- **验收记录**:存储报装验收记录 + +### 3.5 系统管理实体 + +- **组织机构**:存储系统组织机构信息 +- **用户信息**:存储系统用户信息 +- **角色权限**:存储系统角色和权限信息 +- **系统日志**:存储系统操作日志 + +## 4. 表结构设计 + +以下是系统主要表结构设计,按业务模块划分: + +### 4.1 客户管理相关表 + +#### 4.1.1 客户基本信息表(TB_CUSTOMER) + +| 字段名 | 数据类型 | 长度 | 是否为空 | 主键 | 描述 | +|-------|---------|------|---------|-----|------| +| CUSTOMER_ID | VARCHAR | 20 | 否 | 是 | 客户编号,主键 | +| TENANT_ID | VARCHAR | 20 | 否 | 否 | 租户标识 | +| CUSTOMER_NAME | VARCHAR | 100 | 否 | 否 | 客户名称 | +| CUSTOMER_TYPE | VARCHAR | 10 | 否 | 否 | 客户类型 | +| ID_TYPE | VARCHAR | 10 | 是 | 否 | 证件类型 | +| ID_NUMBER | VARCHAR | 30 | 是 | 否 | 证件号码 | +| PHONE | VARCHAR | 20 | 是 | 否 | 联系电话 | +| ADDRESS | VARCHAR | 200 | 是 | 否 | 地址 | +| AREA_CODE | VARCHAR | 20 | 是 | 否 | 行政区划代码 | +| CREATE_TIME | DATETIME | - | 否 | 否 | 创建时间 | +| UPDATE_TIME | DATETIME | - | 是 | 否 | 更新时间 | +| STATUS | VARCHAR | 10 | 否 | 否 | 状态 | + +#### 4.1.2 表卡信息表(TB_METER_INFO) + +| 字段名 | 数据类型 | 长度 | 是否为空 | 主键 | 描述 | +|-------|---------|------|---------|-----|------| +| METER_ID | VARCHAR | 20 | 否 | 是 | 水表编号,主键 | +| CUSTOMER_ID | VARCHAR | 20 | 否 | 否 | 客户编号,外键 | +| TENANT_ID | VARCHAR | 20 | 否 | 否 | 租户标识 | +| METER_NO | VARCHAR | 30 | 否 | 否 | 水表号 | +| METER_TYPE | VARCHAR | 10 | 否 | 否 | 水表类型 | +| METER_MODEL | VARCHAR | 20 | 是 | 否 | 水表型号 | +| METER_CALIBER | VARCHAR | 10 | 是 | 否 | 水表口径 | +| INSTALL_DATE | DATE | - | 是 | 否 | 安装日期 | +| INSTALL_POSITION | VARCHAR | 200 | 是 | 否 | 安装位置 | +| INITIAL_READING | DECIMAL | 10,2 | 否 | 否 | 初始读数 | +| CURRENT_READING | DECIMAL | 10,2 | 否 | 否 | 当前读数 | +| READING_CYCLE | VARCHAR | 10 | 否 | 否 | 抄表周期 | +| BOOK_ID | VARCHAR | 20 | 是 | 否 | 册本编号 | +| STATUS | VARCHAR | 10 | 否 | 否 | 状态 | +| CREATE_TIME | DATETIME | - | 否 | 否 | 创建时间 | +| UPDATE_TIME | DATETIME | - | 是 | 否 | 更新时间 | + +#### 4.1.3 账户信息表(TB_ACCOUNT) + +| 字段名 | 数据类型 | 长度 | 是否为空 | 主键 | 描述 | +|-------|---------|------|---------|-----|------| +| ACCOUNT_ID | VARCHAR | 20 | 否 | 是 | 账户编号,主键 | +| CUSTOMER_ID | VARCHAR | 20 | 否 | 否 | 客户编号,外键 | +| TENANT_ID | VARCHAR | 20 | 否 | 否 | 租户标识 | +| BALANCE | DECIMAL | 12,2 | 否 | 否 | 账户余额 | +| CREDIT_AMOUNT | DECIMAL | 12,2 | 是 | 否 | 信用额度 | +| LAST_PAYMENT_DATE | DATE | - | 是 | 否 | 最近缴费日期 | +| STATUS | VARCHAR | 10 | 否 | 否 | 状态 | +| CREATE_TIME | DATETIME | - | 否 | 否 | 创建时间 | +| UPDATE_TIME | DATETIME | - | 是 | 否 | 更新时间 | + +### 4.2 营收管理相关表 + +#### 4.2.1 抄表记录表(TB_METER_READING) + +| 字段名 | 数据类型 | 长度 | 是否为空 | 主键 | 描述 | +|-------|---------|------|---------|-----|------| +| READING_ID | VARCHAR | 20 | 否 | 是 | 抄表记录编号,主键 | +| METER_ID | VARCHAR | 20 | 否 | 否 | 水表编号,外键 | +| TENANT_ID | VARCHAR | 20 | 否 | 否 | 租户标识 | +| READING_DATE | DATE | - | 否 | 否 | 抄表日期 | +| READING_VALUE | DECIMAL | 10,2 | 否 | 否 | 抄表读数 | +| PREV_READING_VALUE | DECIMAL | 10,2 | 是 | 否 | 上次读数 | +| WATER_USAGE | DECIMAL | 10,2 | 否 | 否 | 用水量 | +| READING_TYPE | VARCHAR | 10 | 否 | 否 | 抄表类型(人工/远传/自报) | +| READER_ID | VARCHAR | 20 | 是 | 否 | 抄表员编号 | +| STATUS | VARCHAR | 10 | 否 | 否 | 状态 | +| REMARK | VARCHAR | 200 | 是 | 否 | 备注 | +| CREATE_TIME | DATETIME | - | 否 | 否 | 创建时间 | +| UPDATE_TIME | DATETIME | - | 是 | 否 | 更新时间 | + +#### 4.2.2 账单信息表(TB_BILL) + +| 字段名 | 数据类型 | 长度 | 是否为空 | 主键 | 描述 | +|-------|---------|------|---------|-----|------| +| BILL_ID | VARCHAR | 20 | 否 | 是 | 账单编号,主键 | +| CUSTOMER_ID | VARCHAR | 20 | 否 | 否 | 客户编号,外键 | +| METER_ID | VARCHAR | 20 | 否 | 否 | 水表编号,外键 | +| READING_ID | VARCHAR | 20 | 是 | 否 | 抄表记录编号,外键 | +| TENANT_ID | VARCHAR | 20 | 否 | 否 | 租户标识 | +| BILL_MONTH | VARCHAR | 7 | 否 | 否 | 账期(格式:YYYY-MM) | +| WATER_USAGE | DECIMAL | 10,2 | 否 | 否 | 用水量 | +| WATER_FEE | DECIMAL | 10,2 | 否 | 否 | 水费金额 | +| OTHER_FEE | DECIMAL | 10,2 | 是 | 否 | 其他费用 | +| TOTAL_AMOUNT | DECIMAL | 10,2 | 否 | 否 | 总金额 | +| DUE_DATE | DATE | - | 否 | 否 | 缴费截止日期 | +| STATUS | VARCHAR | 10 | 否 | 否 | 状态 | +| CREATE_TIME | DATETIME | - | 否 | 否 | 创建时间 | +| UPDATE_TIME | DATETIME | - | 是 | 否 | 更新时间 | + +#### 4.2.3 缴费记录表(TB_PAYMENT) + +| 字段名 | 数据类型 | 长度 | 是否为空 | 主键 | 描述 | +|-------|---------|------|---------|-----|------| +| PAYMENT_ID | VARCHAR | 20 | 否 | 是 | 缴费记录编号,主键 | +| BILL_ID | VARCHAR | 20 | 是 | 否 | 账单编号,外键 | +| CUSTOMER_ID | VARCHAR | 20 | 否 | 否 | 客户编号,外键 | +| TENANT_ID | VARCHAR | 20 | 否 | 否 | 租户标识 | +| PAYMENT_TYPE | VARCHAR | 10 | 否 | 否 | 缴费类型 | +| PAYMENT_CHANNEL | VARCHAR | 10 | 否 | 否 | 缴费渠道 | +| PAYMENT_AMOUNT | DECIMAL | 10,2 | 否 | 否 | 缴费金额 | +| PAYMENT_DATE | DATETIME | - | 否 | 否 | 缴费时间 | +| TRANSACTION_NO | VARCHAR | 30 | 是 | 否 | 交易流水号 | +| OPERATOR_ID | VARCHAR | 20 | 是 | 否 | 操作员编号 | +| STATUS | VARCHAR | 10 | 否 | 否 | 状态 | +| REMARK | VARCHAR | 200 | 是 | 否 | 备注 | +| CREATE_TIME | DATETIME | - | 否 | 否 | 创建时间 | +| UPDATE_TIME | DATETIME | - | 是 | 否 | 更新时间 | + +### 4.3 表务管理相关表 + +#### 4.3.1 水表档案表(TB_METER_ARCHIVE) + +| 字段名 | 数据类型 | 长度 | 是否为空 | 主键 | 描述 | +|-------|---------|------|---------|-----|------| +| METER_ARCHIVE_ID | VARCHAR | 20 | 否 | 是 | 水表档案编号,主键 | +| METER_ID | VARCHAR | 20 | 否 | 否 | 水表编号,外键 | +| TENANT_ID | VARCHAR | 20 | 否 | 否 | 租户标识 | +| FACTORY | VARCHAR | 50 | 是 | 否 | 生产厂家 | +| PRODUCTION_DATE | DATE | - | 是 | 否 | 生产日期 | +| VALID_PERIOD | INT | - | 是 | 否 | 有效期(月) | +| VERIFICATION_DATE | DATE | - | 是 | 否 | 检定日期 | +| NEXT_VERIFICATION_DATE | DATE | - | 是 | 否 | 下次检定日期 | +| STATUS | VARCHAR | 10 | 否 | 否 | 状态 | +| CREATE_TIME | DATETIME | - | 否 | 否 | 创建时间 | +| UPDATE_TIME | DATETIME | - | 是 | 否 | 更新时间 | + +#### 4.3.2 表务工单表(TB_METER_WORKORDER) + +| 字段名 | 数据类型 | 长度 | 是否为空 | 主键 | 描述 | +|-------|---------|------|---------|-----|------| +| WORKORDER_ID | VARCHAR | 20 | 否 | 是 | 工单编号,主键 | +| METER_ID | VARCHAR | 20 | 否 | 否 | 水表编号,外键 | +| CUSTOMER_ID | VARCHAR | 20 | 否 | 否 | 客户编号,外键 | +| TENANT_ID | VARCHAR | 20 | 否 | 否 | 租户标识 | +| WORKORDER_TYPE | VARCHAR | 10 | 否 | 否 | 工单类型 | +| WORKORDER_STATUS | VARCHAR | 10 | 否 | 否 | 工单状态 | +| APPLY_DATE | DATE | - | 否 | 否 | 申请日期 | +| PLAN_DATE | DATE | - | 是 | 否 | 计划执行日期 | +| EXECUTE_DATE | DATE | - | 是 | 否 | 实际执行日期 | +| APPLICANT_ID | VARCHAR | 20 | 是 | 否 | 申请人编号 | +| EXECUTOR_ID | VARCHAR | 20 | 是 | 否 | 执行人编号 | +| REASON | VARCHAR | 200 | 是 | 否 | 原因 | +| RESULT | VARCHAR | 200 | 是 | 否 | 结果 | +| CREATE_TIME | DATETIME | - | 否 | 否 | 创建时间 | +| UPDATE_TIME | DATETIME | - | 是 | 否 | 更新时间 | + +## 5. 索引设计 + +为提高系统性能,针对主要查询场景设计了以下索引: + +### 5.1 主键索引 +- 所有表的主键字段均建立主键索引 + +### 5.2 外键索引 +- 表关联字段建立外键索引,如 CUSTOMER_ID, METER_ID 等 + +### 5.3 常用查询字段索引 +- 客户表:CUSTOMER_NAME, PHONE, ID_NUMBER +- 水表表:METER_NO, BOOK_ID +- 账单表:BILL_MONTH, STATUS +- 缴费表:PAYMENT_DATE, TRANSACTION_NO +- 抄表表:READING_DATE + +### 5.4 复合索引 +- 客户表:(TENANT_ID, CUSTOMER_TYPE) +- 账单表:(TENANT_ID, CUSTOMER_ID, BILL_MONTH) +- 抄表表:(TENANT_ID, METER_ID, READING_DATE) + +## 6. 数据安全性设计 + +### 6.1 数据加密 +- 敏感个人信息(如身份证号码、银行账号等)采用加密存储 +- 加密算法采用 AES-256 或同等安全级别的加密方式 + +### 6.2 权限控制 +- 采用基于角色的访问控制(RBAC)模型 +- 对不同角色用户设置不同的数据访问权限 +- 实现行级、列级的细粒度权限控制 + +### 6.3 数据备份与恢复 +- 定期全量备份,每日增量备份 +- 异地数据灾备,确保数据安全 +- 完善的数据恢复机制,支持按时间点恢复 + +### 6.4 数据审计 +- 关键业务操作的数据变更记录 +- 敏感数据访问日志记录 +- 数据异常访问监控与告警 +--- + +# 福建水务业务系统接口设计 + +## 目录 +- [1. 接口概述](#1-接口概述) +- [2. 外部接口](#2-外部接口) +- [3. 内部接口](#3-内部接口) +- [4. 接口标准](#4-接口标准) + +## 1. 接口概述 + +福建水务业务系统提供丰富的接口,用于与外部系统集成以及系统内部各模块间的数据交换。接口设计遵循标准化、安全性、可扩展性的原则,基于RuoYi-Vue-Pro框架采用RESTful风格设计,支持JSON数据格式。 + +### 1.1 接口设计原则 + +- **统一性**:所有接口遵循统一的设计规范和数据格式 +- **安全性**:接口通过认证授权、参数校验等机制保障安全 +- **可维护性**:接口文档完善,便于维护和升级 +- **兼容性**:接口设计考虑版本兼容,支持平滑升级 +- **性能优化**:接口设计考虑性能,支持缓存、分页等机制 + +### 1.2 RESTful API规范 + +系统API接口采用RESTful风格设计,主要规范如下: + +#### 1.2.1 资源命名 + +- 使用名词复数表示资源集合,如`/users`、`/meters` +- 使用资源ID标识特定资源,如`/users/1`、`/meters/123` +- 资源层级关系通过路径嵌套表示,如`/users/1/meters` + +#### 1.2.2 HTTP方法 + +- GET:获取资源 +- POST:创建资源 +- PUT:更新资源(全量更新) +- PATCH:部分更新资源 +- DELETE:删除资源 + +#### 1.2.3 状态码 + +- 200 OK:请求成功 +- 201 Created:资源创建成功 +- 400 Bad Request:请求参数错误 +- 401 Unauthorized:未授权 +- 403 Forbidden:权限不足 +- 404 Not Found:资源不存在 +- 500 Internal Server Error:服务器内部错误 + +#### 1.2.4 响应格式 + +系统统一采用以下JSON格式响应: + +```json +{ + "code": 0, // 业务状态码,0表示成功,非0表示失败 + "data": {}, // 响应数据 + "msg": "success" // 响应消息 +} +``` + +分页查询响应格式: + +```json +{ + "code": 0, + "data": { + "list": [], // 数据列表 + "total": 100, // 总记录数 + "pageNum": 1, // 当前页码 + "pageSize": 10 // 每页记录数 + }, + "msg": "success" +} +``` + +### 1.3 接口文档 + +系统使用Knife4j(基于Swagger)自动生成API文档,文档地址为:`http://{系统地址}/doc.html`。 + +主要特点: +- 在线接口文档:支持在线查看接口定义 +- 接口调试:支持在线调试接口 +- 文档导出:支持导出OpenAPI规范文档 +- 权限控制:支持对接口文档的访问控制 + +## 2. 外部接口 + +### 2.1 与银行接口 + +#### 2.1.1 银行代扣接口 + +**功能描述**:通过银行系统自动从用户账户中扣除水费。 + +**接口规范**: +- 接口方式:文件交换或WebService +- 数据格式:文本文件或XML +- 交换频率:每日或实时 + +#### 2.1.2 银行实时缴费接口 + +**功能描述**:用户在银行柜台、网上银行或手机银行实时缴纳水费。 + +**接口规范**: +- 接口方式:WebService或HTTP接口 +- 数据格式:XML或JSON +- 交换频率:实时 + +### 2.2 支付宝接口 + +**功能描述**:用户通过支付宝缴纳水费。 + +**接口规范**: +- 接口方式:HTTP接口 +- 数据格式:JSON +- 交换频率:实时 + +### 2.3 微信支付接口 + +**功能描述**:用户通过微信支付缴纳水费。 + +**接口规范**: +- 接口方式:HTTP接口 +- 数据格式:XML或JSON +- 交换频率:实时 + +### 2.4 短信接口 + +**功能描述**:向用户发送各类业务通知短信。 + +**接口规范**: +- 接口方式:HTTP接口 +- 数据格式:JSON +- 交换频率:实时 + +### 2.5 物联网集抄平台接口 + +**功能描述**:与物联网集抄平台交互,获取智能水表数据。 + +**接口规范**: +- 接口方式:HTTP接口或WebService +- 数据格式:JSON或XML +- 交换频率:定时或实时 + +## 3. 内部接口 + +### 3.1 用户接口 + +#### 3.1.1 用户信息查询接口 + +**功能描述**:查询用户基本信息。 + +**接口规范**: +- 请求方式:GET +- 请求路径:/api/users/{userId} +- 返回格式:JSON + +#### 3.1.2 用户信息更新接口 + +**功能描述**:更新用户基本信息。 + +**接口规范**: +- 请求方式:PUT +- 请求路径:/api/users/{userId} +- 请求/返回格式:JSON + +### 3.2 水表接口 + +#### 3.2.1 水表信息查询接口 + +**功能描述**:查询水表基本信息。 + +**接口规范**: +- 请求方式:GET +- 请求路径:/api/meters/{meterId} +- 返回格式:JSON + +#### 3.2.2 水表读数上传接口 + +**功能描述**:上传水表读数。 + +**接口规范**: +- 请求方式:POST +- 请求路径:/api/meters/{meterId}/readings +- 请求/返回格式:JSON + +### 3.3 账单接口 + +#### 3.3.1 账单查询接口 + +**功能描述**:查询用户账单信息。 + +**接口规范**: +- 请求方式:GET +- 请求路径:/api/users/{userId}/bills +- 返回格式:JSON + +#### 3.3.2 缴费接口 + +**功能描述**:处理用户缴费。 + +**接口规范**: +- 请求方式:POST +- 请求路径:/api/bills/{billId}/payments +- 请求/返回格式:JSON + +### 3.4 工单接口 + +#### 3.4.1 工单创建接口 + +**功能描述**:创建业务工单。 + +**接口规范**: +- 请求方式:POST +- 请求路径:/api/workorders +- 请求/返回格式:JSON + +#### 3.4.2 工单状态更新接口 + +**功能描述**:更新工单处理状态。 + +**接口规范**: +- 请求方式:PUT +- 请求路径:/api/workorders/{workorderId}/status +- 请求/返回格式:JSON + +## 4. 接口标准 + +### 4.1 接口协议 + +系统接口主要采用以下协议: + +- **RESTful API**:适用于系统内部模块间的交互以及移动应用等轻量级客户端 +- **WebService**:适用于与外部系统的集成,特别是银行等传统机构 +- **消息队列**:适用于异步处理的场景,如批量数据处理、通知推送等 + +### 4.2 数据格式 + +接口数据主要采用以下格式: + +- **JSON**:主要用于RESTful API接口,结构简单清晰,适合Web应用 +- **XML**:主要用于WebService接口,兼容性好,适合与传统系统对接 +- **文本文件**:主要用于批量数据交换,如银行代扣文件等 + +### 4.3 接口安全 + +接口安全采用以下机制: + +- **令牌认证**:使用JWT(JSON Web Token)进行身份认证 +- **签名验证**:请求参数签名,确保数据完整性 +- **IP白名单**:限制接口调用者的IP地址 +- **传输加密**:使用HTTPS协议加密传输数据 +- **接口限流**:限制单位时间内的请求次数 +- **访问日志**:记录所有接口调用情况 +--- + +# 福建水务业务系统部署设计 + +## 目录 +- [1. 部署概述](#1-部署概述) +- [2. 部署架构](#2-部署架构) +- [3. 服务器配置](#3-服务器配置) +- [4. 网络架构](#4-网络架构) +- [5. 安全设计](#5-安全设计) +- [6. 部署流程](#6-部署流程) +- [7. 监控与运维](#7-监控与运维) + +## 1. 部署概述 + +福建水务业务系统采用集中化部署模式,基于集团私有云环境进行部署,构建高可用、可扩展的系统架构,满足集团及下属各水务公司的业务需求。 + +### 1.1 部署目标 + +- 实现系统的集中部署和统一管理 +- 确保系统高可用性和可靠性 +- 支持业务动态扩展和弹性伸缩 +- 保障数据安全和业务连续性 +- 降低运维成本,提高管理效率 + +### 1.2 部署原则 + +- **集中部署**:核心业务系统集中部署在集团数据中心,统一管理和维护 +- **多级架构**:采用多级架构设计,实现前端负载分担和后端高可用 +- **灾备设计**:重要系统和数据实现灾备,确保业务连续性 +- **安全防护**:多层次安全防护体系,确保系统和数据安全 +- **弹性扩展**:支持系统横向和纵向扩展,适应业务增长需求 + +## 2. 部署架构 + +### 2.1 总体部署架构 + +福建水务业务系统采用三层架构部署: + +- **接入层**:负责外部访问请求的接入和负载均衡 +- **应用层**:部署业务应用服务,处理业务逻辑 +- **数据层**:部署数据库服务,存储业务数据 + +系统部署采用集群模式,各层均部署多个节点,实现高可用和负载均衡。 + +### 2.2 生产环境部署架构 + +生产环境采用双机房部署方案,包括主生产环境和灾备环境: + +#### 2.2.1 主生产环境 + +主生产环境部署在集团主数据中心,包括: + +- 负载均衡集群:2台负载均衡服务器 +- Web服务器集群:4台Web服务器 +- 应用服务器集群:6台应用服务器 +- 数据库服务器集群:2台主备数据库服务器 +- 文件服务器:2台主备文件服务器 +- 缓存服务器集群:2台缓存服务器 + +#### 2.2.2 灾备环境 + +灾备环境部署在集团备用数据中心,包括: + +- 负载均衡服务器:1台 +- Web服务器:2台 +- 应用服务器:3台 +- 数据库服务器:1台 +- 文件服务器:1台 +- 缓存服务器:1台 + +### 2.3 测试环境部署架构 + +测试环境部署在集团测试中心,用于系统测试和验证,包括: + +- Web服务器:1台 +- 应用服务器:2台 +- 数据库服务器:1台 +- 文件服务器:1台 + +### 2.4 开发环境部署架构 + +开发环境部署在开发中心,用于系统开发和集成测试,包括: + +- 应用服务器:1台 +- 数据库服务器:1台 + +## 3. 服务器配置 + +### 3.1 硬件配置要求 + +#### 3.1.1 负载均衡服务器 + +- CPU:8核 +- 内存:16GB +- 存储:100GB SSD +- 网卡:双千兆网卡 + +#### 3.1.2 Web服务器 + +- CPU:8核 +- 内存:16GB +- 存储:200GB SSD +- 网卡:双千兆网卡 + +#### 3.1.3 应用服务器 + +- CPU:16核 +- 内存:32GB +- 存储:300GB SSD +- 网卡:双千兆网卡 + +#### 3.1.4 数据库服务器 + +- CPU:24核 +- 内存:64GB +- 存储:2TB SSD (RAID 10) +- 网卡:双万兆网卡 + +#### 3.1.5 文件服务器 + +- CPU:8核 +- 内存:16GB +- 存储:4TB (RAID 5) +- 网卡:双千兆网卡 + +#### 3.1.6 缓存服务器 + +- CPU:8核 +- 内存:32GB +- 存储:100GB SSD +- 网卡:双千兆网卡 + +### 3.2 软件配置要求 + +#### 3.2.1 操作系统 + +- 服务端:CentOS 7+、Ubuntu 18.04+或其他国产Linux发行版 +- 客户端:支持Windows、macOS、Linux等现代操作系统 + +#### 3.2.2 数据库 + +- MySQL 5.7+ 或 MariaDB 10.2+(推荐) +- 国产数据库可选:OpenGauss、达梦等 + +#### 3.2.3 应用服务器 + +- JDK 17或JDK 21(兼容支持JDK 8) +- Apache Tomcat 9.0+或内嵌Tomcat +- Nginx 1.18+(作为前端静态资源服务器和反向代理) + +#### 3.2.4 缓存服务器 + +- Redis 5.0+或Redis集群 + +#### 3.2.5 中间件 + +- 消息队列:基于Redis的轻量级队列(可选) +- 分布式任务调度:Quartz集群 +- 工作流引擎:Flowable 6.x +- 文件存储:支持本地存储、MinIO、阿里云OSS等 + +#### 3.2.6 前端环境 + +- Node.js 16+ +- NPM 8+或Yarn 1.22+ +- Vue 3.x +- Element Plus + +## 4. 网络架构 + +### 4.1 网络拓扑 + +福建水务业务系统网络架构采用三层网络结构: + +- **接入层**:对外提供服务接入,部署防火墙、负载均衡等设备 +- **核心层**:实现业务系统间的互联互通,部署核心交换机 +- **服务层**:部署各类服务器,实现业务处理和数据存储 + +### 4.2 网络安全区域划分 + +网络安全区域划分为以下几个区域: + +- **DMZ区**:部署面向外部的Web服务器,与内网隔离 +- **应用区**:部署业务应用服务器 +- **数据区**:部署数据库服务器和文件服务器 +- **管理区**:部署运维管理服务器 + +### 4.3 网络带宽配置 + +- 外网接入带宽:100Mbps,根据实际需求可升级 +- 内网骨干带宽:1000Mbps +- 服务器接入带宽:1000Mbps +- 数据中心间专线带宽:100Mbps + +## 5. 安全设计 + +### 5.1 网络安全 + +#### 5.1.1 边界安全 + +- 部署高性能防火墙,实现网络隔离 +- 部署入侵检测系统(IDS)和入侵防御系统(IPS) +- 部署Web应用防火墙(WAF),防御Web应用攻击 +- 采用VPN技术,保障远程访问安全 + +#### 5.1.2 内网安全 + +- 网络安全区域划分,实现不同级别网络隔离 +- 内网访问控制,限制不必要的网络访问 +- 内网流量监控,及时发现异常流量 + +### 5.2 系统安全 + +#### 5.2.1 主机安全 + +- 操作系统安全加固,关闭不必要的服务和端口 +- 系统补丁及时更新,修复安全漏洞 +- 部署主机防病毒软件,防御恶意代码 +- 主机审计和日志管理,记录重要操作 + +#### 5.2.2 应用安全 + +- 应用访问控制,基于角色的权限管理 +- 应用操作审计,记录重要业务操作 +- 数据传输加密,保护敏感信息 +- 输入验证,防止SQL注入、XSS等攻击 + +### 5.3 数据安全 + +#### 5.3.1 数据存储安全 + +- 数据库访问控制,限制数据库访问权限 +- 敏感数据加密存储,防止数据泄露 +- 数据库审计,记录重要数据操作 + +#### 5.3.2 数据备份与恢复 + +- 定期数据备份,每日增量备份,每周全量备份 +- 备份数据异地存储,防止灾难性事件导致数据丢失 +- 定期演练数据恢复,确保备份数据可用 + +## 6. 部署流程 + +### 6.1 部署准备 + +- 服务器硬件准备和上架 +- 网络环境配置和测试 +- 操作系统安装和配置 +- 基础软件安装和配置 + +### 6.2 应用部署 + +#### 6.2.1 数据库部署 + +- 数据库服务器配置 +- 数据库实例创建和配置 +- 数据库高可用配置 +- 数据备份策略配置 + +#### 6.2.2 应用服务部署 + +- 应用服务器配置 +- 应用程序部署 +- 应用服务参数配置 +- 应用服务高可用配置 + +#### 6.2.3 Web服务部署 + +- Web服务器配置 +- Web应用部署 +- Web服务参数配置 +- 负载均衡配置 + +### 6.3 系统联调 + +- 各组件功能测试 +- 系统整体联调测试 +- 性能和压力测试 +- 高可用性测试 + +### 6.4 系统上线 + +- 制定上线计划 +- 系统割接准备 +- 系统割接实施 +- 系统运行监控 + +## 7. 监控与运维 + +### 7.1 监控系统 + +#### 7.1.1 基础设施监控 + +- 服务器硬件监控:CPU、内存、磁盘、网络等 +- 网络设备监控:带宽使用率、连接状态等 +- 操作系统监控:系统负载、进程状态等 + +#### 7.1.2 应用监控 + +- 应用服务状态监控 +- 应用性能监控:响应时间、并发数等 +- 业务监控:重要业务指标监控 + +#### 7.1.3 数据库监控 + +- 数据库服务状态监控 +- 数据库性能监控:CPU使用率、内存使用率、IO性能等 +- SQL执行监控:慢查询、锁等待等 + +### 7.2 运维管理 + +#### 7.2.1 日常运维 + +- 系统日常巡检 +- 系统性能优化 +- 系统容量管理 +- 系统备份管理 + +#### 7.2.2 变更管理 + +- 变更申请和审批 +- 变更实施和验证 +- 变更回退预案 +- 变更记录管理 + +#### 7.2.3 故障管理 + +- 故障监控和告警 +- 故障处理流程 +- 故障升级机制 +- 故障复盘和改进 + +#### 7.2.4 应急预案 + +- 系统宕机应急预案 +- 网络故障应急预案 +- 数据丢失应急预案 +- 安全事件应急预案 \ No newline at end of file diff --git a/output/福建水务营收系统概要设计文档.docx b/output/福建水务营收系统概要设计文档.docx new file mode 100644 index 0000000..a4f5c58 Binary files /dev/null and b/output/福建水务营收系统概要设计文档.docx differ diff --git a/output/福建水务营收系统概要设计文档.html b/output/福建水务营收系统概要设计文档.html new file mode 100644 index 0000000..25c9ba7 --- /dev/null +++ b/output/福建水务营收系统概要设计文档.html @@ -0,0 +1,3154 @@ + + + + + + + + 福建水务营收系统概要设计文档 + + + + +
+

福建水务营收系统概要设计文档

+

系统设计团队

+

2025年06月09日

+
+
+

福建水务营收系统概要设计文档编写计划

+

一、项目背景与概述

+

福建水务营收系统是基于RuoYi-Vue-Pro和yudao-ui-admin-vue3框架开发的一套现代化水务营收管理系统,旨在满足原有系统的所有功能需求,并通过技术升级提升系统的性能、安全性和用户体验。

+

二、系统设计总体规划

+

1. 设计依据

+ +

2. 设计原则

+ +

三、编写工作步骤与时间规划

+

第一阶段:需求分析(2周)

+
    +
  1. 原系统功能梳理 +
  2. +
  3. 业务流程梳理 +
  4. +
+

第二阶段:系统架构设计(2周)

+
    +
  1. 技术架构设计 +
  2. +
  3. 系统功能模块划分 +
  4. +
+

第三阶段:详细设计(3周)

+
    +
  1. 系统功能模块详细设计 +
  2. +
  3. 数据库设计 +
  4. +
  5. 接口设计 +
  6. +
+

第四阶段:非功能性设计(1周)

+
    +
  1. 性能设计 +
  2. +
  3. 安全设计 +
  4. +
  5. 部署设计 +
  6. +
+

第五阶段:文档整合与评审(2周)

+
    +
  1. 文档整合 +
  2. +
  3. 文档评审 +
  4. +
+

四、人员分工建议

+

对于多人协作编写文档,建议按照以下方式进行分工:

+

1. 按模块分工

+ +

2. 按系统功能分工

+ +

五、文档规范与模板

+

1. 文档格式规范

+ +

2. 设计文档模板

+

每个功能模块的设计文档应包含以下内容:

+
# [模块名称]设计说明
+
+## 1. 功能概述
+[简要描述该模块的主要功能和目标]
+
+## 2. 功能列表
+[列出该模块包含的所有功能点]
+
+## 3. 业务流程
+[使用流程图描述主要业务流程]
+
+## 4. 数据模型
+[描述该模块涉及的主要数据实体及关系]
+
+## 5. 接口设计
+[描述该模块提供的接口,包括参数、返回值等]
+
+## 6. 界面设计
+[提供界面原型或描述,说明界面交互逻辑]
+
+## 7. 安全考虑
+[描述该模块的安全控制措施]
+
+## 8. 特殊说明
+[其他需要说明的事项]
+

六、Cursor Rules配置

+

为了使用Cursor更高效地完成概要设计文档,建议配置以下规则:

+
    +
  1. 文档结构检查:确保文档结构符合预定义的模板
  2. +
  3. 术语一致性检查:确保整个文档中术语使用的一致性
  4. +
  5. 图表格式化:自动格式化PlantUML或Mermaid图表代码
  6. +
  7. 引用链接检查:确保文档内的交叉引用有效
  8. +
  9. 中文标点规范:确保使用规范的中文标点符号
  10. +
+

七、协作工具与流程

+
    +
  1. 版本控制:使用Git进行文档版本控制
  2. +
  3. 协作平台:使用GitLab/GitHub进行协作
  4. +
  5. 评审工具:使用MR/PR进行文档评审
  6. +
  7. 任务管理:使用项目管理工具(如JIRA)跟踪文档编写进度
  8. +
+

八、成果交付物

+

最终交付物应包括:

+
    +
  1. 系统概要设计说明书(主文档)
  2. +
  3. 各功能模块详细设计说明
  4. +
  5. 数据库设计说明书
  6. +
  7. 接口设计说明书
  8. +
  9. 部署运维设计说明书

  10. +
+

福建水务营收系统概要设计文档总结

+

一、文档构成

+

福建水务营收系统概要设计文档包含以下几个主要部分:

+
    +
  1. 设计计划文档:描述文档编写计划、分工和规范
  2. +
  3. 系统架构设计:描述系统总体架构和技术选型
  4. +
  5. 模块功能设计:描述各功能模块的详细设计
  6. +
  7. 数据库设计:描述数据库结构和优化策略
  8. +
  9. 接口设计:描述系统内部和外部接口设计
  10. +
  11. 部署运维设计:描述系统部署架构和运维方案
  12. +
+

二、主要内容概述

+

1. 设计计划文档

+

设计计划文档明确了概要设计文档的编写计划、时间规划、人员分工和文档规范,为后续设计工作提供了指导框架。主要内容包括:

+ +

2. 系统架构设计

+

系统架构设计描述了福建水务营收系统的总体架构、技术框架和实现方案,为系统开发提供了技术指导。主要内容包括:

+ +

3. 模块功能设计

+

模块功能设计详细描述了系统各个功能模块的设计,包括功能需求、业务流程、实现方式等。主要内容包括:

+ +

4. 数据库设计

+

数据库设计描述了系统的数据模型、表结构和数据库优化策略,为数据存储和管理提供了技术方案。主要内容包括:

+ +

5. 接口设计

+

接口设计描述了系统内部模块间的接口和与外部系统的集成接口,为系统集成提供了技术方案。主要内容包括:

+ +

6. 部署运维设计

+

部署运维设计描述了系统的部署架构、运维方案和灾备策略,为系统运行维护提供了技术支持。主要内容包括:

+ +

三、编写建议

+

1. 编写前的准备

+ +

2. 编写过程中的注意事项

+ +

3. 多人协作编写策略

+ +

4. 编写工具使用建议

+ +

四、后续工作建议

+

1. 文档评审与完善

+ +

2. 详细设计与开发

+ +

3. 文档维护与更新

+ +

五、常见问题与解决方案

+

1. 文档过于庞大,难以管理

+ +

2. 文档与实际实现不一致

+ +

3. 多人协作导致风格不一致

+ +

4. 文档内容难以理解

+ +

福建水务业务系统概述

+

目录

+ +

1. 系统背景

+

福建水投集团注册资本46亿元,经营范围为水利项目投资及管理,水利工程建筑设计与施工及相关技术服务;水资源开发与利用,水的生产与供应、污水处理及其再生利用,水生态产业投资、运营及相关配套服务;水利设施周边配套土地等资源综合开发利用等。

+

在全省40多个县市区投资重大水利项目超过450亿元,实现全省全覆盖,大幅控制我省岛屿、沿海经济发达以及经济发展潜力大、后劲足的地区水资源、水务市场。目前,集团公司总资产超173亿元,净资产超70亿元,拥有全级次子公司超过67家,职工人数超3500人。

+

当前,福建水投集团针对营收、新装、表务等核心业务系统,在集团下属各水务公司中,在用的业务系统均来自不同的系统集成商,存在业务不统一、软件功能不完善、自动化数据处理水平低、升级维护工作量大、自建硬件环境导致运营成本过高等弊端,加上由于业务、数据过度分散,不利于集团化的集中管理、统一资源管理理念。

+

随着互联网技术的飞速发展,以及市场竞争日益激烈的今天,集中企业优势、发展企业已成社会共识。通过应用系统集中部署,可以在此基础上实现先进的集团化管理理念。目前集团已经搭建起私有云,需要在信息系统建设方面,统一构建SaaS模式服务平台,服务于集团、各分公司、营业网点,以便于实现集中式生产控制、集中式财务控制、集中物资管理、公司领导对下属各水务公司的集中管理和综合报表上报、分析的功能。

+

2. 系统目标

+

福建水务业务系统是以客户关系数据库为核心和基础的综合管理平台,包含客户完整的资料和数据,实现客户全生命周期管理。系统建设的主要目标包括:

+
    +
  1. 统一资源服务:在集团现有基础上,建设统一的数字水务系统运行资源环境,为集团下属各分公司提供日常业务的IT运营环境服务。

  2. +
  3. 统一平台应用:根据业务需要,在集团所属分公司在用的营收、新装、表务系统基础上进行全面改造升级,统一业务,集中汇集数据,形成统一、多租户管理模式的营业收费系统。集团所属各分公司不再独立建设业务系统基础设施和开发应用系统,实现”一个业务平台、一网通平台”的建设目标。

  4. +
  5. 统一业务平台功能:建设平台具备集团、分公司、分公司所属业务站点多租户管理模式,实现对用水客户的营收业务、新装业务、表务业务管理功能;各租户之间独立,数据统一汇总到集团数据中心。

  6. +
  7. 统一对外接口:整合统一用户资源,与相关业务系统对接提供标准的接口和能力。

  8. +
  9. 统一对外服务:统一对外服务标准,为百姓提供便民服务,做到从”群众跑路”到”数据跑腿”的转变,简化百姓办事流程、提高办事效率、提升百姓的获得感,塑造良好的企业形象。

  10. +
+

通过系统的建设,实现福建省水投数字科技有限公司客户服务管理领域的业务流程梳理再造、组织架构的优化、管理制度的建设、绩效考核标准的建设。构建以客户为中心的客户服务平台,将客户的所有信息进行有机的关联,方便企业对客户信息进行综合分析和管理,为客户提供更多、更便捷、更主动的个性化服务,提高客户服务的质量和客户满意度。

+

3. 系统范围

+

福建水务业务系统的功能范围涵盖客户服务全生命周期,主要包括以下功能模块:

+
    +
  1. 统一平台:员工管理、权限管理、组织机构、系统菜单配置、角色配置、水表厂家、水表型号、水表量程等。

  2. +
  3. 营收系统

    +
  4. +
  5. 表务系统

    +
  6. +
  7. 报装系统

    +
  8. +
  9. 客户服务

    +
  10. +
  11. 外部接口

    +
  12. +
+

4. 系统用户

+

福建水务业务系统的用户主要包括以下几类:

+
    +
  1. 集团管理人员:负责对全集团业务数据进行统计分析、监督管理。

  2. +
  3. 分公司管理人员:负责分公司业务管理、数据统计分析。

  4. +
  5. 营业网点工作人员:负责日常营业收费、客户服务等工作。

  6. +
  7. 抄表员:负责水表抄读、录入等工作。

  8. +
  9. 表务人员:负责水表安装、更换、维修等工作。

  10. +
  11. 报装人员:负责新用户报装、立户等工作。

  12. +
  13. 系统管理员:负责系统参数配置、用户权限管理等工作。

  14. +
  15. 最终用户:通过微信、支付宝服务窗、微网厅等渠道使用系统服务的水务客户。

  16. +
+

5. 系统特点

+

福建水务业务系统具有以下特点:

+
    +
  1. 多租户架构:支持集团、分公司、营业站点多层级租户管理模式,各租户数据相互隔离,同时数据可统一汇总到集团数据中心。

  2. +
  3. 一体化设计:将营收、表务、报装等业务系统集成为一体,实现业务流程的无缝衔接。

  4. +
  5. 全渠道服务:支持营业厅柜台、自助终端、移动APP、微信小程序、支付宝服务窗等多种服务渠道。

  6. +
  7. 智能化应用:引入智能抄表、智能分析等功能,提高业务处理效率和准确性。

  8. +
  9. 标准化接口:提供标准化的接口,支持与银行、支付平台、短信平台等外部系统的集成。

  10. +
  11. 安全可靠:系统满足安全等保三级要求,确保系统和数据的安全性。

  12. +
  13. 高性能扩展:系统支持100万客户规模,满足企业未来3-5年的业务发展需求。

  14. +
+

6. 系统价值

+

福建水务业务系统的建设将为企业带来以下价值:

+
    +
  1. 降低IT成本:通过统一平台建设,减少重复投资,降低硬件采购、系统运维等成本。

  2. +
  3. 提高管理效率:实现业务流程优化再造,提高业务处理效率,降低人力成本。

  4. +
  5. 增强数据价值:实现数据的集中管理和统一分析,为管理决策提供有力支持。

  6. +
  7. 提升服务质量:为客户提供便捷、多渠道的服务方式,提高客户满意度。

  8. +
  9. 支持业务创新:为业务创新提供灵活的技术支持,增强企业市场竞争力。

  10. +
  11. 促进企业发展:支持企业规模扩张,为福建水投集团打造成水利行业龙头企业提供信息化支撑。

  12. +
+

福建水务业务系统架构设计

+

目录

+ +

1. 系统架构概述

+

福建水务业务系统采用多层架构设计,旨在支持集团化的集中管理、统一资源管理的业务需求。系统架构的设计目标是实现”一个业务平台、一网通平台”的建设目标,为集团及下属各分公司提供统一的营业收费系统。

+

系统架构主要包括以下核心特点: - +多租户架构:支持集团、分公司、营业站点的多层级租户管理模式 - +统一资源服务:统一的数字水务系统运行资源环境 - +统一平台应用:统一业务流程,集中汇集数据 - +统一对外接口:提供标准的接口和能力

+

1.1 系统架构图

+

系统整体架构如下图所示:

+
+系统架构图 + +
+

2. 技术架构

+

系统采用B/S和M/S相结合的架构模式,具体技术栈如下:

+

2.1 服务端

+ +

2.2 客户端

+ +

2.3 技术特性

+ +

3. 应用架构

+

系统应用架构基于业务域划分,主要包括以下核心应用模块:

+

3.1 统一平台

+ +

3.2 营收系统

+ +

3.3 客户服务

+ +

3.4 表务系统

+ +

3.5 报装管理

+ +

3.6 统计分析

+ +

3.7 工程管理

+ +

3.8 抄表APP

+ +

3.9 接口服务

+ +

3.10 系统配置

+ +

4. 数据架构

+

系统数据架构基于客户关系数据库为核心和基础,实现客户全生命周期管理。

+

4.1 数据分层

+ +

4.2 数据模型

+ +

4.3 数据集成与共享

+ +

5. 安全架构

+

系统安全架构满足等保三级要求,主要包括以下安全措施:

+

5.1 网络安全

+ +

5.2 数据安全

+ +

5.3 应用安全

+ +

5.4 接口安全

+ +

6. 部署架构

+

系统采用集中部署的模式,基于集团私有云环境进行部署。

+

6.1 物理部署

+ +

6.2 逻辑部署

+ +

6.3 容器部署

+ +

7. 接口架构

+

系统提供标准化的接口,实现与外部系统的集成和数据交换。

+

7.1 外部接口

+ +

7.2 内部接口

+ +

7.3 接口标准

+ +

7.4 接口服务管理

+ +

福建水务业务系统概要设计

+

目录

+ +

1. 统一平台

+

统一平台是客户服务平台的综合展示平台,基于RuoYi-Vue-Pro和yudao-ui-admin-vue3框架构建,包含日常工作功能和客户全部的信息,是系统的基础功能模块。

+

1.1 单点登录

+

单点登录模块基于Spring +Security和JWT实现用户一次登录即可访问系统中所有应用的功能,主要特点包括:

+ +

1.2 系统管理

+

系统管理模块基于RuoYi-Vue-Pro框架的现成功能,提供对系统基础参数的配置管理功能,主要包括:

+ +

2. 营收系统

+

营收系统是水务业务系统的核心组成部分,负责抄表、收费、账务处理等关键业务功能。

+

2.1 系统管理

+

营收系统的基础管理功能,包括:

+ +

2.2 抄表开账

+

抄表开账模块负责水表读数的采集和账单生成,主要功能包括:

+ +

2.3 收费管理

+

收费管理模块负责水费的收取和管理,主要功能包括:

+ +

2.4 账务处理

+

账务处理模块负责处理各类特殊账务情况,主要功能包括:

+ +

2.5 发票管理

+

发票管理模块负责水费发票的管理,主要功能包括:

+ +

2.6 代收业务

+

代收业务模块负责处理各种渠道的水费代收业务,主要功能包括:

+ +

2.7 环卫系统

+

环卫系统模块负责管理与环卫相关的收费和计费业务,主要功能包括:

+ +

2.8 业务工单

+

业务工单模块负责管理日常业务工单的流转和处理,主要功能包括:

+ +

3. 表务系统

+

表务系统负责水表的全生命周期管理,包括水表购置、安装、维修、更换等业务。

+

3.1 表务工单

+

表务工单模块负责处理各类表务作业,主要功能包括:

+ +

3.2 表务仓库

+

表务仓库模块负责水表的仓储管理,主要功能包括:

+ +

3.3 水表参数与基础信息

+

水表参数与基础信息模块负责维护水表相关的基础数据,主要功能包括:

+ +

3.4 物联网对接与数据同步

+

物联网对接与数据同步模块负责水表数据的互联互通,主要功能包括:

+ +

4. 报装系统

+

报装系统负责新用户的报装立户管理,主要功能包括:

+

4.1 报装流程

+

报装流程模块负责新用户报装业务的全流程管理,主要功能包括:

+ +

4.2 一户一表管理

+

一户一表管理模块负责实施”一户一表”改造,主要功能包括:

+ +

5. 客户服务

+

客户服务模块提供多渠道的客户服务功能,主要包括:

+

5.1 微信、支付宝服务窗

+ +

5.2 历史账单

+ +

5.3 电子发票

+ +

5.4 营业网点

+ +

5.5 账户流水

+ +

5.6 微网厅

+ +

6. 系统配置

+

系统配置模块提供各类系统参数的配置管理功能,主要包括:

+

6.1 水表参数

+ +

6.2 地址参数

+ +

6.3 价格体系

+ +

6.4 基本配置

+ +

6.5 催缴管理

+ +

6.6 用户权限

+ +

6.7 定时任务

+ +

7. 系统接口

+

系统接口模块提供与外部系统的集成和数据交换功能,实现业务数据的互通互联。

+

7.1 银行接口

+

银行接口实现与银行系统的对接,支持代扣、托收等功能,主要包括:

+ +

7.2 支付宝/微信接口

+

支付宝和微信接口实现与第三方支付平台的对接,支持在线支付功能,主要包括:

+ +

7.3 短信接口

+

短信接口提供短信通知和验证功能,主要包括:

+ +

7.4 集抄系统接口

+

集抄系统接口实现与智能水表集中抄表系统的对接,主要包括:

+ +

7.5 政务系统接口

+

政务系统接口实现与地方政务平台和政务APP的对接,主要包括:

+ +

7.6 消火栓系统接口

+

消火栓系统接口实现与消火栓系统的对接,主要功能包括:

+ +

7.7 其他系统对接

+

其他系统对接模块负责与周边系统进行数据交换和业务协同,主要功能包括:

+ +

8. 统计分析

+

统计分析模块提供多维度的数据统计和分析功能,为管理决策提供数据支持。

+

8.1 报表查询

+ +

8.2 欠费查询

+ +

8.3 缴费记录

+ +

8.4 用水分析

+ +

9. 工程管理

+

工程管理模块负责处理与供水工程相关的业务,包括工程申请、施工管理和工程验收等。

+

9.1 工程申请

+ +

9.2 工程施工

+ +

9.3 工程验收

+ +

9.4 工程查询

+ +

10. 抄表APP

+

抄表APP是针对移动端开发的抄表工具,支持外勤人员进行现场抄表、问题处理和工单管理等业务操作。

+

10.1 首页功能

+ +

10.2 抄表功能

+ +

10.3 工单管理

+ +

11. 接口服务

+

接口服务模块提供系统对外的API接口管理和服务能力,实现与第三方系统的便捷集成。

+

11.1 API市场

+ +

11.2 API管理

+ +

11.3 接口权限管理

+ +

11.4 系统对外接口

+ +

福建水务业务系统数据库设计

+

目录

+ +

1. 数据库设计概述

+

福建水务业务系统的数据库设计基于MySQL/MariaDB数据库管理系统(同时支持国产OpenGauss数据库),采用关系型数据库模型,以支持业务系统的高并发、高可靠性需求。数据库设计遵循标准化、安全性、扩展性和性能优化的原则,为业务系统提供稳定、高效的数据存储和访问支持。

+

1.1 设计目标

+ +

1.2 设计原则

+ +

2. 数据库架构

+

2.1 总体架构

+

系统采用集中式数据库架构,主要包含以下组件:

+ +

2.2 多租户设计

+

系统采用基于字段的方式实现多租户架构,主要包括:

+ +

2.3 数据访问层设计

+

系统基于MyBatis Plus框架实现数据访问层,主要特点包括:

+ +

2.4 通用字段设计

+

系统中所有业务表都包含以下通用字段:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
字段名数据类型长度是否为空描述
idBIGINT-主键ID
creatorVARCHAR64创建者
create_timeDATETIME-创建时间
updaterVARCHAR64更新者
update_timeDATETIME-更新时间
deletedTINYINT1是否删除(0正常,1删除)
tenant_idBIGINT-租户ID
versionINT-乐观锁版本号
+

3. 主要数据实体

+

系统主要包含以下核心数据实体:

+

3.1 客户实体

+ +

3.2 营收实体

+ +

3.3 表务实体

+ +

3.4 报装实体

+ +

3.5 系统管理实体

+ +

4. 表结构设计

+

以下是系统主要表结构设计,按业务模块划分:

+

4.1 客户管理相关表

+

4.1.1 +客户基本信息表(TB_CUSTOMER)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
字段名数据类型长度是否为空主键描述
CUSTOMER_IDVARCHAR20客户编号,主键
TENANT_IDVARCHAR20租户标识
CUSTOMER_NAMEVARCHAR100客户名称
CUSTOMER_TYPEVARCHAR10客户类型
ID_TYPEVARCHAR10证件类型
ID_NUMBERVARCHAR30证件号码
PHONEVARCHAR20联系电话
ADDRESSVARCHAR200地址
AREA_CODEVARCHAR20行政区划代码
CREATE_TIMEDATETIME-创建时间
UPDATE_TIMEDATETIME-更新时间
STATUSVARCHAR10状态
+

4.1.2 表卡信息表(TB_METER_INFO)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
字段名数据类型长度是否为空主键描述
METER_IDVARCHAR20水表编号,主键
CUSTOMER_IDVARCHAR20客户编号,外键
TENANT_IDVARCHAR20租户标识
METER_NOVARCHAR30水表号
METER_TYPEVARCHAR10水表类型
METER_MODELVARCHAR20水表型号
METER_CALIBERVARCHAR10水表口径
INSTALL_DATEDATE-安装日期
INSTALL_POSITIONVARCHAR200安装位置
INITIAL_READINGDECIMAL10,2初始读数
CURRENT_READINGDECIMAL10,2当前读数
READING_CYCLEVARCHAR10抄表周期
BOOK_IDVARCHAR20册本编号
STATUSVARCHAR10状态
CREATE_TIMEDATETIME-创建时间
UPDATE_TIMEDATETIME-更新时间
+

4.1.3 账户信息表(TB_ACCOUNT)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
字段名数据类型长度是否为空主键描述
ACCOUNT_IDVARCHAR20账户编号,主键
CUSTOMER_IDVARCHAR20客户编号,外键
TENANT_IDVARCHAR20租户标识
BALANCEDECIMAL12,2账户余额
CREDIT_AMOUNTDECIMAL12,2信用额度
LAST_PAYMENT_DATEDATE-最近缴费日期
STATUSVARCHAR10状态
CREATE_TIMEDATETIME-创建时间
UPDATE_TIMEDATETIME-更新时间
+

4.2 营收管理相关表

+

4.2.1 +抄表记录表(TB_METER_READING)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
字段名数据类型长度是否为空主键描述
READING_IDVARCHAR20抄表记录编号,主键
METER_IDVARCHAR20水表编号,外键
TENANT_IDVARCHAR20租户标识
READING_DATEDATE-抄表日期
READING_VALUEDECIMAL10,2抄表读数
PREV_READING_VALUEDECIMAL10,2上次读数
WATER_USAGEDECIMAL10,2用水量
READING_TYPEVARCHAR10抄表类型(人工/远传/自报)
READER_IDVARCHAR20抄表员编号
STATUSVARCHAR10状态
REMARKVARCHAR200备注
CREATE_TIMEDATETIME-创建时间
UPDATE_TIMEDATETIME-更新时间
+

4.2.2 账单信息表(TB_BILL)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
字段名数据类型长度是否为空主键描述
BILL_IDVARCHAR20账单编号,主键
CUSTOMER_IDVARCHAR20客户编号,外键
METER_IDVARCHAR20水表编号,外键
READING_IDVARCHAR20抄表记录编号,外键
TENANT_IDVARCHAR20租户标识
BILL_MONTHVARCHAR7账期(格式:YYYY-MM)
WATER_USAGEDECIMAL10,2用水量
WATER_FEEDECIMAL10,2水费金额
OTHER_FEEDECIMAL10,2其他费用
TOTAL_AMOUNTDECIMAL10,2总金额
DUE_DATEDATE-缴费截止日期
STATUSVARCHAR10状态
CREATE_TIMEDATETIME-创建时间
UPDATE_TIMEDATETIME-更新时间
+

4.2.3 缴费记录表(TB_PAYMENT)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
字段名数据类型长度是否为空主键描述
PAYMENT_IDVARCHAR20缴费记录编号,主键
BILL_IDVARCHAR20账单编号,外键
CUSTOMER_IDVARCHAR20客户编号,外键
TENANT_IDVARCHAR20租户标识
PAYMENT_TYPEVARCHAR10缴费类型
PAYMENT_CHANNELVARCHAR10缴费渠道
PAYMENT_AMOUNTDECIMAL10,2缴费金额
PAYMENT_DATEDATETIME-缴费时间
TRANSACTION_NOVARCHAR30交易流水号
OPERATOR_IDVARCHAR20操作员编号
STATUSVARCHAR10状态
REMARKVARCHAR200备注
CREATE_TIMEDATETIME-创建时间
UPDATE_TIMEDATETIME-更新时间
+

4.3 表务管理相关表

+

4.3.1 +水表档案表(TB_METER_ARCHIVE)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
字段名数据类型长度是否为空主键描述
METER_ARCHIVE_IDVARCHAR20水表档案编号,主键
METER_IDVARCHAR20水表编号,外键
TENANT_IDVARCHAR20租户标识
FACTORYVARCHAR50生产厂家
PRODUCTION_DATEDATE-生产日期
VALID_PERIODINT-有效期(月)
VERIFICATION_DATEDATE-检定日期
NEXT_VERIFICATION_DATEDATE-下次检定日期
STATUSVARCHAR10状态
CREATE_TIMEDATETIME-创建时间
UPDATE_TIMEDATETIME-更新时间
+

4.3.2 +表务工单表(TB_METER_WORKORDER)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
字段名数据类型长度是否为空主键描述
WORKORDER_IDVARCHAR20工单编号,主键
METER_IDVARCHAR20水表编号,外键
CUSTOMER_IDVARCHAR20客户编号,外键
TENANT_IDVARCHAR20租户标识
WORKORDER_TYPEVARCHAR10工单类型
WORKORDER_STATUSVARCHAR10工单状态
APPLY_DATEDATE-申请日期
PLAN_DATEDATE-计划执行日期
EXECUTE_DATEDATE-实际执行日期
APPLICANT_IDVARCHAR20申请人编号
EXECUTOR_IDVARCHAR20执行人编号
REASONVARCHAR200原因
RESULTVARCHAR200结果
CREATE_TIMEDATETIME-创建时间
UPDATE_TIMEDATETIME-更新时间
+

5. 索引设计

+

为提高系统性能,针对主要查询场景设计了以下索引:

+

5.1 主键索引

+ +

5.2 外键索引

+ +

5.3 常用查询字段索引

+ +

5.4 复合索引

+ +

6. 数据安全性设计

+

6.1 数据加密

+ +

6.2 权限控制

+ +

6.3 数据备份与恢复

+ +

6.4 数据审计

+ +

福建水务业务系统接口设计

+

目录

+ +

1. 接口概述

+

福建水务业务系统提供丰富的接口,用于与外部系统集成以及系统内部各模块间的数据交换。接口设计遵循标准化、安全性、可扩展性的原则,基于RuoYi-Vue-Pro框架采用RESTful风格设计,支持JSON数据格式。

+

1.1 接口设计原则

+ +

1.2 RESTful API规范

+

系统API接口采用RESTful风格设计,主要规范如下:

+

1.2.1 资源命名

+ +

1.2.2 HTTP方法

+ +

1.2.3 状态码

+ +

1.2.4 响应格式

+

系统统一采用以下JSON格式响应:

+
{
+  "code": 0,           // 业务状态码,0表示成功,非0表示失败
+  "data": {},          // 响应数据
+  "msg": "success"     // 响应消息
+}
+

分页查询响应格式:

+
{
+  "code": 0,
+  "data": {
+    "list": [],        // 数据列表
+    "total": 100,      // 总记录数
+    "pageNum": 1,      // 当前页码
+    "pageSize": 10     // 每页记录数
+  },
+  "msg": "success"
+}
+

1.3 接口文档

+

系统使用Knife4j(基于Swagger)自动生成API文档,文档地址为:http://{系统地址}/doc.html

+

主要特点: - 在线接口文档:支持在线查看接口定义 - +接口调试:支持在线调试接口 - 文档导出:支持导出OpenAPI规范文档 - +权限控制:支持对接口文档的访问控制

+

2. 外部接口

+

2.1 与银行接口

+

2.1.1 银行代扣接口

+

功能描述:通过银行系统自动从用户账户中扣除水费。

+

接口规范: - 接口方式:文件交换或WebService - +数据格式:文本文件或XML - 交换频率:每日或实时

+

2.1.2 银行实时缴费接口

+

功能描述:用户在银行柜台、网上银行或手机银行实时缴纳水费。

+

接口规范: - 接口方式:WebService或HTTP接口 - +数据格式:XML或JSON - 交换频率:实时

+

2.2 支付宝接口

+

功能描述:用户通过支付宝缴纳水费。

+

接口规范: - 接口方式:HTTP接口 - 数据格式:JSON - +交换频率:实时

+

2.3 微信支付接口

+

功能描述:用户通过微信支付缴纳水费。

+

接口规范: - 接口方式:HTTP接口 - +数据格式:XML或JSON - 交换频率:实时

+

2.4 短信接口

+

功能描述:向用户发送各类业务通知短信。

+

接口规范: - 接口方式:HTTP接口 - 数据格式:JSON - +交换频率:实时

+

2.5 物联网集抄平台接口

+

功能描述:与物联网集抄平台交互,获取智能水表数据。

+

接口规范: - 接口方式:HTTP接口或WebService - +数据格式:JSON或XML - 交换频率:定时或实时

+

3. 内部接口

+

3.1 用户接口

+

3.1.1 用户信息查询接口

+

功能描述:查询用户基本信息。

+

接口规范: - 请求方式:GET - +请求路径:/api/users/{userId} - 返回格式:JSON

+

3.1.2 用户信息更新接口

+

功能描述:更新用户基本信息。

+

接口规范: - 请求方式:PUT - +请求路径:/api/users/{userId} - 请求/返回格式:JSON

+

3.2 水表接口

+

3.2.1 水表信息查询接口

+

功能描述:查询水表基本信息。

+

接口规范: - 请求方式:GET - +请求路径:/api/meters/{meterId} - 返回格式:JSON

+

3.2.2 水表读数上传接口

+

功能描述:上传水表读数。

+

接口规范: - 请求方式:POST - +请求路径:/api/meters/{meterId}/readings - 请求/返回格式:JSON

+

3.3 账单接口

+

3.3.1 账单查询接口

+

功能描述:查询用户账单信息。

+

接口规范: - 请求方式:GET - +请求路径:/api/users/{userId}/bills - 返回格式:JSON

+

3.3.2 缴费接口

+

功能描述:处理用户缴费。

+

接口规范: - 请求方式:POST - +请求路径:/api/bills/{billId}/payments - 请求/返回格式:JSON

+

3.4 工单接口

+

3.4.1 工单创建接口

+

功能描述:创建业务工单。

+

接口规范: - 请求方式:POST - +请求路径:/api/workorders - 请求/返回格式:JSON

+

3.4.2 工单状态更新接口

+

功能描述:更新工单处理状态。

+

接口规范: - 请求方式:PUT - +请求路径:/api/workorders/{workorderId}/status - 请求/返回格式:JSON

+

4. 接口标准

+

4.1 接口协议

+

系统接口主要采用以下协议:

+ +

4.2 数据格式

+

接口数据主要采用以下格式:

+ +

4.3 接口安全

+

接口安全采用以下机制:

+ +

福建水务业务系统部署设计

+

目录

+ +

1. 部署概述

+

福建水务业务系统采用集中化部署模式,基于集团私有云环境进行部署,构建高可用、可扩展的系统架构,满足集团及下属各水务公司的业务需求。

+

1.1 部署目标

+ +

1.2 部署原则

+ +

2. 部署架构

+

2.1 总体部署架构

+

福建水务业务系统采用三层架构部署:

+ +

系统部署采用集群模式,各层均部署多个节点,实现高可用和负载均衡。

+

2.2 生产环境部署架构

+

生产环境采用双机房部署方案,包括主生产环境和灾备环境:

+

2.2.1 主生产环境

+

主生产环境部署在集团主数据中心,包括:

+ +

2.2.2 灾备环境

+

灾备环境部署在集团备用数据中心,包括:

+ +

2.3 测试环境部署架构

+

测试环境部署在集团测试中心,用于系统测试和验证,包括:

+ +

2.4 开发环境部署架构

+

开发环境部署在开发中心,用于系统开发和集成测试,包括:

+ +

3. 服务器配置

+

3.1 硬件配置要求

+

3.1.1 负载均衡服务器

+ +

3.1.2 Web服务器

+ +

3.1.3 应用服务器

+ +

3.1.4 数据库服务器

+ +

3.1.5 文件服务器

+ +

3.1.6 缓存服务器

+ +

3.2 软件配置要求

+

3.2.1 操作系统

+ +

3.2.2 数据库

+ +

3.2.3 应用服务器

+ +

3.2.4 缓存服务器

+ +

3.2.5 中间件

+ +

3.2.6 前端环境

+ +

4. 网络架构

+

4.1 网络拓扑

+

福建水务业务系统网络架构采用三层网络结构:

+ +

4.2 网络安全区域划分

+

网络安全区域划分为以下几个区域:

+ +

4.3 网络带宽配置

+ +

5. 安全设计

+

5.1 网络安全

+

5.1.1 边界安全

+ +

5.1.2 内网安全

+ +

5.2 系统安全

+

5.2.1 主机安全

+ +

5.2.2 应用安全

+ +

5.3 数据安全

+

5.3.1 数据存储安全

+ +

5.3.2 数据备份与恢复

+ +

6. 部署流程

+

6.1 部署准备

+ +

6.2 应用部署

+

6.2.1 数据库部署

+ +

6.2.2 应用服务部署

+ +

6.2.3 Web服务部署

+ +

6.3 系统联调

+ +

6.4 系统上线

+ +

7. 监控与运维

+

7.1 监控系统

+

7.1.1 基础设施监控

+ +

7.1.2 应用监控

+ +

7.1.3 数据库监控

+ +

7.2 运维管理

+

7.2.1 日常运维

+ +

7.2.2 变更管理

+ +

7.2.3 故障管理

+ +

7.2.4 应急预案

+ + + diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..5a51ef4 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,4709 @@ +{ + "name": "01_doc_preliminary_design", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "devDependencies": { + "@mermaid-js/mermaid-cli": "^11.4.2" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmmirror.com/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@antfu/install-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/@antfu/install-pkg/-/install-pkg-1.1.0.tgz", + "integrity": "sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==", + "dev": true, + "dependencies": { + "package-manager-detector": "^1.3.0", + "tinyexec": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@antfu/utils": { + "version": "8.1.1", + "resolved": "https://registry.npmmirror.com/@antfu/utils/-/utils-8.1.1.tgz", + "integrity": "sha512-Mex9nXf9vR6AhcXmMrlz/HVgYYZpVGJ6YlPgwl7UnaFpnshXs6EK/oa5Gpf3CzENMjkvEx2tQtntGnb7UtSTOQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@braintree/sanitize-url": { + "version": "7.1.1", + "resolved": "https://registry.npmmirror.com/@braintree/sanitize-url/-/sanitize-url-7.1.1.tgz", + "integrity": "sha512-i1L7noDNxtFyL5DmZafWy1wRVhGehQmzZaz1HiN5e7iylJMSZR7ekOV7NsIqa5qBldlLrsKv4HbgFUVlQrz8Mw==", + "dev": true + }, + "node_modules/@chevrotain/cst-dts-gen": { + "version": "11.0.3", + "resolved": "https://registry.npmmirror.com/@chevrotain/cst-dts-gen/-/cst-dts-gen-11.0.3.tgz", + "integrity": "sha512-BvIKpRLeS/8UbfxXxgC33xOumsacaeCKAjAeLyOn7Pcp95HiRbrpl14S+9vaZLolnbssPIUuiUd8IvgkRyt6NQ==", + "dev": true, + "dependencies": { + "@chevrotain/gast": "11.0.3", + "@chevrotain/types": "11.0.3", + "lodash-es": "4.17.21" + } + }, + "node_modules/@chevrotain/gast": { + "version": "11.0.3", + "resolved": "https://registry.npmmirror.com/@chevrotain/gast/-/gast-11.0.3.tgz", + "integrity": "sha512-+qNfcoNk70PyS/uxmj3li5NiECO+2YKZZQMbmjTqRI3Qchu8Hig/Q9vgkHpI3alNjr7M+a2St5pw5w5F6NL5/Q==", + "dev": true, + "dependencies": { + "@chevrotain/types": "11.0.3", + "lodash-es": "4.17.21" + } + }, + "node_modules/@chevrotain/regexp-to-ast": { + "version": "11.0.3", + "resolved": "https://registry.npmmirror.com/@chevrotain/regexp-to-ast/-/regexp-to-ast-11.0.3.tgz", + "integrity": "sha512-1fMHaBZxLFvWI067AVbGJav1eRY7N8DDvYCTwGBiE/ytKBgP8azTdgyrKyWZ9Mfh09eHWb5PgTSO8wi7U824RA==", + "dev": true + }, + "node_modules/@chevrotain/types": { + "version": "11.0.3", + "resolved": "https://registry.npmmirror.com/@chevrotain/types/-/types-11.0.3.tgz", + "integrity": "sha512-gsiM3G8b58kZC2HaWR50gu6Y1440cHiJ+i3JUvcp/35JchYejb2+5MVeJK0iKThYpAa/P2PYFV4hoi44HD+aHQ==", + "dev": true + }, + "node_modules/@chevrotain/utils": { + "version": "11.0.3", + "resolved": "https://registry.npmmirror.com/@chevrotain/utils/-/utils-11.0.3.tgz", + "integrity": "sha512-YslZMgtJUyuMbZ+aKvfF3x1f5liK4mWNxghFRv7jqRR9C3R3fAOGTTKvxXDa2Y1s9zSbcpuO0cAxDYsc9SrXoQ==", + "dev": true + }, + "node_modules/@floating-ui/core": { + "version": "1.7.1", + "resolved": "https://registry.npmmirror.com/@floating-ui/core/-/core-1.7.1.tgz", + "integrity": "sha512-azI0DrjMMfIug/ExbBaeDVJXcY0a7EPvPjb2xAJPa4HeimBX+Z18HK8QQR3jb6356SnDDdxx+hinMLcJEDdOjw==", + "dev": true, + "dependencies": { + "@floating-ui/utils": "^0.2.9" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.7.1", + "resolved": "https://registry.npmmirror.com/@floating-ui/dom/-/dom-1.7.1.tgz", + "integrity": "sha512-cwsmW/zyw5ltYTUeeYJ60CnQuPqmGwuGVhG9w0PRaRKkAyi38BT5CKrpIbb+jtahSwUl04cWzSx9ZOIxeS6RsQ==", + "dev": true, + "dependencies": { + "@floating-ui/core": "^1.7.1", + "@floating-ui/utils": "^0.2.9" + } + }, + "node_modules/@floating-ui/react": { + "version": "0.27.12", + "resolved": "https://registry.npmmirror.com/@floating-ui/react/-/react-0.27.12.tgz", + "integrity": "sha512-kKlWNrpIQxF1B/a2MZvE0/uyKby4960yjO91W7nVyNKmmfNi62xU9HCjL1M1eWzx/LFj/VPSwJVbwQk9Pq/68A==", + "dev": true, + "dependencies": { + "@floating-ui/react-dom": "^2.1.3", + "@floating-ui/utils": "^0.2.9", + "tabbable": "^6.0.0" + }, + "peerDependencies": { + "react": ">=17.0.0", + "react-dom": ">=17.0.0" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "2.1.3", + "resolved": "https://registry.npmmirror.com/@floating-ui/react-dom/-/react-dom-2.1.3.tgz", + "integrity": "sha512-huMBfiU9UnQ2oBwIhgzyIiSpVgvlDstU8CX0AF+wS+KzmYMs0J2a3GwuFHV1Lz+jlrQGeC1fF+Nv0QoumyV0bA==", + "dev": true, + "dependencies": { + "@floating-ui/dom": "^1.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.9", + "resolved": "https://registry.npmmirror.com/@floating-ui/utils/-/utils-0.2.9.tgz", + "integrity": "sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==", + "dev": true + }, + "node_modules/@headlessui/react": { + "version": "2.2.4", + "resolved": "https://registry.npmmirror.com/@headlessui/react/-/react-2.2.4.tgz", + "integrity": "sha512-lz+OGcAH1dK93rgSMzXmm1qKOJkBUqZf1L4M8TWLNplftQD3IkoEDdUFNfAn4ylsN6WOTVtWaLmvmaHOUk1dTA==", + "dev": true, + "dependencies": { + "@floating-ui/react": "^0.26.16", + "@react-aria/focus": "^3.20.2", + "@react-aria/interactions": "^3.25.0", + "@tanstack/react-virtual": "^3.13.9", + "use-sync-external-store": "^1.5.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "react": "^18 || ^19 || ^19.0.0-rc", + "react-dom": "^18 || ^19 || ^19.0.0-rc" + } + }, + "node_modules/@headlessui/react/node_modules/@floating-ui/react": { + "version": "0.26.28", + "resolved": "https://registry.npmmirror.com/@floating-ui/react/-/react-0.26.28.tgz", + "integrity": "sha512-yORQuuAtVpiRjpMhdc0wJj06b9JFjrYF4qp96j++v2NBpbi6SEGF7donUJ3TMieerQ6qVkAv1tgr7L4r5roTqw==", + "dev": true, + "dependencies": { + "@floating-ui/react-dom": "^2.1.2", + "@floating-ui/utils": "^0.2.8", + "tabbable": "^6.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@headlessui/tailwindcss": { + "version": "0.2.2", + "resolved": "https://registry.npmmirror.com/@headlessui/tailwindcss/-/tailwindcss-0.2.2.tgz", + "integrity": "sha512-xNe42KjdyA4kfUKLLPGzME9zkH7Q3rOZ5huFihWNWOQFxnItxPB3/67yBI8/qBfY8nwBRx5GHn4VprsoluVMGw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "tailwindcss": "^3.0 || ^4.0" + } + }, + "node_modules/@iconify/types": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/@iconify/types/-/types-2.0.0.tgz", + "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==", + "dev": true + }, + "node_modules/@iconify/utils": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/@iconify/utils/-/utils-2.3.0.tgz", + "integrity": "sha512-GmQ78prtwYW6EtzXRU1rY+KwOKfz32PD7iJh6Iyqw68GiKuoZ2A6pRtzWONz5VQJbp50mEjXh/7NkumtrAgRKA==", + "dev": true, + "dependencies": { + "@antfu/install-pkg": "^1.0.0", + "@antfu/utils": "^8.1.0", + "@iconify/types": "^2.0.0", + "debug": "^4.4.0", + "globals": "^15.14.0", + "kolorist": "^1.8.0", + "local-pkg": "^1.0.0", + "mlly": "^1.7.4" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmmirror.com/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.8", + "resolved": "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@mermaid-js/mermaid-cli": { + "version": "11.4.2", + "resolved": "https://registry.npmmirror.com/@mermaid-js/mermaid-cli/-/mermaid-cli-11.4.2.tgz", + "integrity": "sha512-nBsEW1AxHsjsjTBrqFInkh91Vvb5vNPmnN7UGWkutExcQQZev6XzMlEZp0i6HYFSoGTHZT2tOT0l/KLzvDyPfg==", + "dev": true, + "dependencies": { + "@mermaid-js/mermaid-zenuml": "^0.2.0", + "chalk": "^5.0.1", + "commander": "^12.1.0", + "import-meta-resolve": "^4.1.0", + "mermaid": "^11.0.2" + }, + "bin": { + "mmdc": "src/cli.js" + }, + "engines": { + "node": "^18.19 || >=20.0" + }, + "peerDependencies": { + "puppeteer": "^23" + } + }, + "node_modules/@mermaid-js/mermaid-zenuml": { + "version": "0.2.0", + "resolved": "https://registry.npmmirror.com/@mermaid-js/mermaid-zenuml/-/mermaid-zenuml-0.2.0.tgz", + "integrity": "sha512-Lv7xNlFT5y2TIlts+yYl1HfeEgjoqw5cfSZsWYejoJvt9K0QfdPBoj5D9Tft1aN0pj1mxjuTZbZQ1Anmem/RMg==", + "dev": true, + "dependencies": { + "@zenuml/core": "^3.17.2" + }, + "peerDependencies": { + "mermaid": ">=10.0.0" + } + }, + "node_modules/@mermaid-js/parser": { + "version": "0.4.0", + "resolved": "https://registry.npmmirror.com/@mermaid-js/parser/-/parser-0.4.0.tgz", + "integrity": "sha512-wla8XOWvQAwuqy+gxiZqY+c7FokraOTHRWMsbB4AgRx9Sy7zKslNyejy7E+a77qHfey5GXw/ik3IXv/NHMJgaA==", + "dev": true, + "dependencies": { + "langium": "3.3.1" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmmirror.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmmirror.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@puppeteer/browsers": { + "version": "2.6.1", + "resolved": "https://registry.npmmirror.com/@puppeteer/browsers/-/browsers-2.6.1.tgz", + "integrity": "sha512-aBSREisdsGH890S2rQqK82qmQYU3uFpSH8wcZWHgHzl3LfzsxAKbLNiAG9mO8v1Y0UICBeClICxPJvyr0rcuxg==", + "dev": true, + "peer": true, + "dependencies": { + "debug": "^4.4.0", + "extract-zip": "^2.0.1", + "progress": "^2.0.3", + "proxy-agent": "^6.5.0", + "semver": "^7.6.3", + "tar-fs": "^3.0.6", + "unbzip2-stream": "^1.4.3", + "yargs": "^17.7.2" + }, + "bin": { + "browsers": "lib/cjs/main-cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@react-aria/focus": { + "version": "3.20.4", + "resolved": "https://registry.npmmirror.com/@react-aria/focus/-/focus-3.20.4.tgz", + "integrity": "sha512-E9M/kPYvF1fBZpkRXsKqMhvBVEyTY7vmkHeXLJo6tInKQOjYyYs0VeWlnGnxBjQIAH7J7ZKAORfTFQQHyhoueQ==", + "dev": true, + "dependencies": { + "@react-aria/interactions": "^3.25.2", + "@react-aria/utils": "^3.29.1", + "@react-types/shared": "^3.30.0", + "@swc/helpers": "^0.5.0", + "clsx": "^2.0.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", + "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" + } + }, + "node_modules/@react-aria/interactions": { + "version": "3.25.2", + "resolved": "https://registry.npmmirror.com/@react-aria/interactions/-/interactions-3.25.2.tgz", + "integrity": "sha512-BWyZXBT4P17b9C9HfOIT2glDFMH9nUCfQF7vZ5FEeXNBudH/8OcSbzyBUG4Dg3XPtkOem5LP59ocaizkl32Tvg==", + "dev": true, + "dependencies": { + "@react-aria/ssr": "^3.9.9", + "@react-aria/utils": "^3.29.1", + "@react-stately/flags": "^3.1.2", + "@react-types/shared": "^3.30.0", + "@swc/helpers": "^0.5.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", + "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" + } + }, + "node_modules/@react-aria/ssr": { + "version": "3.9.9", + "resolved": "https://registry.npmmirror.com/@react-aria/ssr/-/ssr-3.9.9.tgz", + "integrity": "sha512-2P5thfjfPy/np18e5wD4WPt8ydNXhij1jwA8oehxZTFqlgVMGXzcWKxTb4RtJrLFsqPO7RUQTiY8QJk0M4Vy2g==", + "dev": true, + "dependencies": { + "@swc/helpers": "^0.5.0" + }, + "engines": { + "node": ">= 12" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" + } + }, + "node_modules/@react-aria/utils": { + "version": "3.29.1", + "resolved": "https://registry.npmmirror.com/@react-aria/utils/-/utils-3.29.1.tgz", + "integrity": "sha512-yXMFVJ73rbQ/yYE/49n5Uidjw7kh192WNN9PNQGV0Xoc7EJUlSOxqhnpHmYTyO0EotJ8fdM1fMH8durHjUSI8g==", + "dev": true, + "dependencies": { + "@react-aria/ssr": "^3.9.9", + "@react-stately/flags": "^3.1.2", + "@react-stately/utils": "^3.10.7", + "@react-types/shared": "^3.30.0", + "@swc/helpers": "^0.5.0", + "clsx": "^2.0.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", + "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" + } + }, + "node_modules/@react-stately/flags": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/@react-stately/flags/-/flags-3.1.2.tgz", + "integrity": "sha512-2HjFcZx1MyQXoPqcBGALwWWmgFVUk2TuKVIQxCbRq7fPyWXIl6VHcakCLurdtYC2Iks7zizvz0Idv48MQ38DWg==", + "dev": true, + "dependencies": { + "@swc/helpers": "^0.5.0" + } + }, + "node_modules/@react-stately/utils": { + "version": "3.10.7", + "resolved": "https://registry.npmmirror.com/@react-stately/utils/-/utils-3.10.7.tgz", + "integrity": "sha512-cWvjGAocvy4abO9zbr6PW6taHgF24Mwy/LbQ4TC4Aq3tKdKDntxyD+sh7AkSRfJRT2ccMVaHVv2+FfHThd3PKQ==", + "dev": true, + "dependencies": { + "@swc/helpers": "^0.5.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" + } + }, + "node_modules/@react-types/shared": { + "version": "3.30.0", + "resolved": "https://registry.npmmirror.com/@react-types/shared/-/shared-3.30.0.tgz", + "integrity": "sha512-COIazDAx1ncDg046cTJ8SFYsX8aS3lB/08LDnbkH/SkdYrFPWDlXMrO/sUam8j1WWM+PJ+4d1mj7tODIKNiFog==", + "dev": true, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" + } + }, + "node_modules/@swc/helpers": { + "version": "0.5.17", + "resolved": "https://registry.npmmirror.com/@swc/helpers/-/helpers-0.5.17.tgz", + "integrity": "sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==", + "dev": true, + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/@tanstack/react-virtual": { + "version": "3.13.9", + "resolved": "https://registry.npmmirror.com/@tanstack/react-virtual/-/react-virtual-3.13.9.tgz", + "integrity": "sha512-SPWC8kwG/dWBf7Py7cfheAPOxuvIv4fFQ54PdmYbg7CpXfsKxkucak43Q0qKsxVthhUJQ1A7CIMAIplq4BjVwA==", + "dev": true, + "dependencies": { + "@tanstack/virtual-core": "3.13.9" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/@tanstack/virtual-core": { + "version": "3.13.9", + "resolved": "https://registry.npmmirror.com/@tanstack/virtual-core/-/virtual-core-3.13.9.tgz", + "integrity": "sha512-3jztt0jpaoJO5TARe2WIHC1UQC3VMLAFUW5mmMo0yrkwtDB2AQP0+sh10BVUpWrnvHjSLvzFizydtEGLCJKFoQ==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tootallnate/quickjs-emscripten": { + "version": "0.23.0", + "resolved": "https://registry.npmmirror.com/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", + "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", + "dev": true, + "peer": true + }, + "node_modules/@types/d3": { + "version": "7.4.3", + "resolved": "https://registry.npmmirror.com/@types/d3/-/d3-7.4.3.tgz", + "integrity": "sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==", + "dev": true, + "dependencies": { + "@types/d3-array": "*", + "@types/d3-axis": "*", + "@types/d3-brush": "*", + "@types/d3-chord": "*", + "@types/d3-color": "*", + "@types/d3-contour": "*", + "@types/d3-delaunay": "*", + "@types/d3-dispatch": "*", + "@types/d3-drag": "*", + "@types/d3-dsv": "*", + "@types/d3-ease": "*", + "@types/d3-fetch": "*", + "@types/d3-force": "*", + "@types/d3-format": "*", + "@types/d3-geo": "*", + "@types/d3-hierarchy": "*", + "@types/d3-interpolate": "*", + "@types/d3-path": "*", + "@types/d3-polygon": "*", + "@types/d3-quadtree": "*", + "@types/d3-random": "*", + "@types/d3-scale": "*", + "@types/d3-scale-chromatic": "*", + "@types/d3-selection": "*", + "@types/d3-shape": "*", + "@types/d3-time": "*", + "@types/d3-time-format": "*", + "@types/d3-timer": "*", + "@types/d3-transition": "*", + "@types/d3-zoom": "*" + } + }, + "node_modules/@types/d3-array": { + "version": "3.2.1", + "resolved": "https://registry.npmmirror.com/@types/d3-array/-/d3-array-3.2.1.tgz", + "integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==", + "dev": true + }, + "node_modules/@types/d3-axis": { + "version": "3.0.6", + "resolved": "https://registry.npmmirror.com/@types/d3-axis/-/d3-axis-3.0.6.tgz", + "integrity": "sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==", + "dev": true, + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-brush": { + "version": "3.0.6", + "resolved": "https://registry.npmmirror.com/@types/d3-brush/-/d3-brush-3.0.6.tgz", + "integrity": "sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==", + "dev": true, + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-chord": { + "version": "3.0.6", + "resolved": "https://registry.npmmirror.com/@types/d3-chord/-/d3-chord-3.0.6.tgz", + "integrity": "sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==", + "dev": true + }, + "node_modules/@types/d3-color": { + "version": "3.1.3", + "resolved": "https://registry.npmmirror.com/@types/d3-color/-/d3-color-3.1.3.tgz", + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", + "dev": true + }, + "node_modules/@types/d3-contour": { + "version": "3.0.6", + "resolved": "https://registry.npmmirror.com/@types/d3-contour/-/d3-contour-3.0.6.tgz", + "integrity": "sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==", + "dev": true, + "dependencies": { + "@types/d3-array": "*", + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmmirror.com/@types/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==", + "dev": true + }, + "node_modules/@types/d3-dispatch": { + "version": "3.0.6", + "resolved": "https://registry.npmmirror.com/@types/d3-dispatch/-/d3-dispatch-3.0.6.tgz", + "integrity": "sha512-4fvZhzMeeuBJYZXRXrRIQnvUYfyXwYmLsdiN7XXmVNQKKw1cM8a5WdID0g1hVFZDqT9ZqZEY5pD44p24VS7iZQ==", + "dev": true + }, + "node_modules/@types/d3-drag": { + "version": "3.0.7", + "resolved": "https://registry.npmmirror.com/@types/d3-drag/-/d3-drag-3.0.7.tgz", + "integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==", + "dev": true, + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-dsv": { + "version": "3.0.7", + "resolved": "https://registry.npmmirror.com/@types/d3-dsv/-/d3-dsv-3.0.7.tgz", + "integrity": "sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==", + "dev": true + }, + "node_modules/@types/d3-ease": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/@types/d3-ease/-/d3-ease-3.0.2.tgz", + "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", + "dev": true + }, + "node_modules/@types/d3-fetch": { + "version": "3.0.7", + "resolved": "https://registry.npmmirror.com/@types/d3-fetch/-/d3-fetch-3.0.7.tgz", + "integrity": "sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==", + "dev": true, + "dependencies": { + "@types/d3-dsv": "*" + } + }, + "node_modules/@types/d3-force": { + "version": "3.0.10", + "resolved": "https://registry.npmmirror.com/@types/d3-force/-/d3-force-3.0.10.tgz", + "integrity": "sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==", + "dev": true + }, + "node_modules/@types/d3-format": { + "version": "3.0.4", + "resolved": "https://registry.npmmirror.com/@types/d3-format/-/d3-format-3.0.4.tgz", + "integrity": "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==", + "dev": true + }, + "node_modules/@types/d3-geo": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/@types/d3-geo/-/d3-geo-3.1.0.tgz", + "integrity": "sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==", + "dev": true, + "dependencies": { + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-hierarchy": { + "version": "3.1.7", + "resolved": "https://registry.npmmirror.com/@types/d3-hierarchy/-/d3-hierarchy-3.1.7.tgz", + "integrity": "sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==", + "dev": true + }, + "node_modules/@types/d3-interpolate": { + "version": "3.0.4", + "resolved": "https://registry.npmmirror.com/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", + "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", + "dev": true, + "dependencies": { + "@types/d3-color": "*" + } + }, + "node_modules/@types/d3-path": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/@types/d3-path/-/d3-path-3.1.1.tgz", + "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==", + "dev": true + }, + "node_modules/@types/d3-polygon": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/@types/d3-polygon/-/d3-polygon-3.0.2.tgz", + "integrity": "sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==", + "dev": true + }, + "node_modules/@types/d3-quadtree": { + "version": "3.0.6", + "resolved": "https://registry.npmmirror.com/@types/d3-quadtree/-/d3-quadtree-3.0.6.tgz", + "integrity": "sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==", + "dev": true + }, + "node_modules/@types/d3-random": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/@types/d3-random/-/d3-random-3.0.3.tgz", + "integrity": "sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==", + "dev": true + }, + "node_modules/@types/d3-scale": { + "version": "4.0.9", + "resolved": "https://registry.npmmirror.com/@types/d3-scale/-/d3-scale-4.0.9.tgz", + "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==", + "dev": true, + "dependencies": { + "@types/d3-time": "*" + } + }, + "node_modules/@types/d3-scale-chromatic": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==", + "dev": true + }, + "node_modules/@types/d3-selection": { + "version": "3.0.11", + "resolved": "https://registry.npmmirror.com/@types/d3-selection/-/d3-selection-3.0.11.tgz", + "integrity": "sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==", + "dev": true + }, + "node_modules/@types/d3-shape": { + "version": "3.1.7", + "resolved": "https://registry.npmmirror.com/@types/d3-shape/-/d3-shape-3.1.7.tgz", + "integrity": "sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg==", + "dev": true, + "dependencies": { + "@types/d3-path": "*" + } + }, + "node_modules/@types/d3-time": { + "version": "3.0.4", + "resolved": "https://registry.npmmirror.com/@types/d3-time/-/d3-time-3.0.4.tgz", + "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==", + "dev": true + }, + "node_modules/@types/d3-time-format": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/@types/d3-time-format/-/d3-time-format-4.0.3.tgz", + "integrity": "sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==", + "dev": true + }, + "node_modules/@types/d3-timer": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/@types/d3-timer/-/d3-timer-3.0.2.tgz", + "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", + "dev": true + }, + "node_modules/@types/d3-transition": { + "version": "3.0.9", + "resolved": "https://registry.npmmirror.com/@types/d3-transition/-/d3-transition-3.0.9.tgz", + "integrity": "sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==", + "dev": true, + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-zoom": { + "version": "3.0.8", + "resolved": "https://registry.npmmirror.com/@types/d3-zoom/-/d3-zoom-3.0.8.tgz", + "integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==", + "dev": true, + "dependencies": { + "@types/d3-interpolate": "*", + "@types/d3-selection": "*" + } + }, + "node_modules/@types/geojson": { + "version": "7946.0.16", + "resolved": "https://registry.npmmirror.com/@types/geojson/-/geojson-7946.0.16.tgz", + "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==", + "dev": true + }, + "node_modules/@types/node": { + "version": "22.15.30", + "resolved": "https://registry.npmmirror.com/@types/node/-/node-22.15.30.tgz", + "integrity": "sha512-6Q7lr06bEHdlfplU6YRbgG1SFBdlsfNC4/lX+SkhiTs0cpJkOElmWls8PxDFv4yY/xKb8Y6SO0OmSX4wgqTZbA==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmmirror.com/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "dev": true, + "optional": true + }, + "node_modules/@types/yauzl": { + "version": "2.10.3", + "resolved": "https://registry.npmmirror.com/@types/yauzl/-/yauzl-2.10.3.tgz", + "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@zenuml/core": { + "version": "3.32.3", + "resolved": "https://registry.npmmirror.com/@zenuml/core/-/core-3.32.3.tgz", + "integrity": "sha512-Mja96LOR4ltww0V0eysSMZ0ihJSBqDraTPaWSgLDEOvRg+R+eCNs3h579Bo3kVl7Ic7xNyoVfku4qiT99Sv8OA==", + "dev": true, + "dependencies": { + "@floating-ui/react": "^0.27.8", + "@headlessui/react": "^2.2.1", + "@headlessui/tailwindcss": "^0.2.2", + "antlr4": "~4.11.0", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "color-string": "^2.0.1", + "dompurify": "^3.2.5", + "highlight.js": "^10.7.3", + "html-to-image": "^1.11.13", + "immer": "^10.1.1", + "jotai": "^2.12.2", + "marked": "^4.3.0", + "pino": "^8.8.0", + "radash": "^12.1.0", + "ramda": "^0.28.0", + "react": "^19.0.0", + "react-dom": "^19.0.0", + "tailwind-merge": "^3.1.0", + "tailwindcss": "^3.4.17" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dev": true, + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "7.1.3", + "resolved": "https://registry.npmmirror.com/agent-base/-/agent-base-7.1.3.tgz", + "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 14" + } + }, + "node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/antlr4": { + "version": "4.11.0", + "resolved": "https://registry.npmmirror.com/antlr4/-/antlr4-4.11.0.tgz", + "integrity": "sha512-GUGlpE2JUjAN+G8G5vY+nOoeyNhHsXoIJwP1XF1oRw89vifA1K46T6SEkwLwr7drihN7I/lf0DIjKc4OZvBX8w==", + "dev": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmmirror.com/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "peer": true + }, + "node_modules/ast-types": { + "version": "0.13.4", + "resolved": "https://registry.npmmirror.com/ast-types/-/ast-types-0.13.4.tgz", + "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", + "dev": true, + "peer": true, + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/atomic-sleep": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/atomic-sleep/-/atomic-sleep-1.0.0.tgz", + "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/b4a": { + "version": "1.6.7", + "resolved": "https://registry.npmmirror.com/b4a/-/b4a-1.6.7.tgz", + "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==", + "dev": true, + "peer": true + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/bare-events": { + "version": "2.5.4", + "resolved": "https://registry.npmmirror.com/bare-events/-/bare-events-2.5.4.tgz", + "integrity": "sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/bare-fs": { + "version": "4.1.5", + "resolved": "https://registry.npmmirror.com/bare-fs/-/bare-fs-4.1.5.tgz", + "integrity": "sha512-1zccWBMypln0jEE05LzZt+V/8y8AQsQQqxtklqaIyg5nu6OAYFhZxPXinJTSG+kU5qyNmeLgcn9AW7eHiCHVLA==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "bare-events": "^2.5.4", + "bare-path": "^3.0.0", + "bare-stream": "^2.6.4" + }, + "engines": { + "bare": ">=1.16.0" + }, + "peerDependencies": { + "bare-buffer": "*" + }, + "peerDependenciesMeta": { + "bare-buffer": { + "optional": true + } + } + }, + "node_modules/bare-os": { + "version": "3.6.1", + "resolved": "https://registry.npmmirror.com/bare-os/-/bare-os-3.6.1.tgz", + "integrity": "sha512-uaIjxokhFidJP+bmmvKSgiMzj2sV5GPHaZVAIktcxcpCyBFFWO+YlikVAdhmUo2vYFvFhOXIAlldqV29L8126g==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "bare": ">=1.14.0" + } + }, + "node_modules/bare-path": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/bare-path/-/bare-path-3.0.0.tgz", + "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "bare-os": "^3.0.1" + } + }, + "node_modules/bare-stream": { + "version": "2.6.5", + "resolved": "https://registry.npmmirror.com/bare-stream/-/bare-stream-2.6.5.tgz", + "integrity": "sha512-jSmxKJNJmHySi6hC42zlZnq00rga4jjxcgNZjY9N5WlOe/iOoGRtdwGsHzQv2RlH2KOYMwGUXhf2zXd32BA9RA==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "streamx": "^2.21.0" + }, + "peerDependencies": { + "bare-buffer": "*", + "bare-events": "*" + }, + "peerDependenciesMeta": { + "bare-buffer": { + "optional": true + }, + "bare-events": { + "optional": true + } + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmmirror.com/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/basic-ftp": { + "version": "5.0.5", + "resolved": "https://registry.npmmirror.com/basic-ftp/-/basic-ftp-5.0.5.tgz", + "integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmmirror.com/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmmirror.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, + "peer": true, + "engines": { + "node": "*" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/chalk": { + "version": "5.4.1", + "resolved": "https://registry.npmmirror.com/chalk/-/chalk-5.4.1.tgz", + "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chevrotain": { + "version": "11.0.3", + "resolved": "https://registry.npmmirror.com/chevrotain/-/chevrotain-11.0.3.tgz", + "integrity": "sha512-ci2iJH6LeIkvP9eJW6gpueU8cnZhv85ELY8w8WiFtNjMHA5ad6pQLaJo9mEly/9qUyCpvqX8/POVUTf18/HFdw==", + "dev": true, + "dependencies": { + "@chevrotain/cst-dts-gen": "11.0.3", + "@chevrotain/gast": "11.0.3", + "@chevrotain/regexp-to-ast": "11.0.3", + "@chevrotain/types": "11.0.3", + "@chevrotain/utils": "11.0.3", + "lodash-es": "4.17.21" + } + }, + "node_modules/chevrotain-allstar": { + "version": "0.3.1", + "resolved": "https://registry.npmmirror.com/chevrotain-allstar/-/chevrotain-allstar-0.3.1.tgz", + "integrity": "sha512-b7g+y9A0v4mxCW1qUhf3BSVPg+/NvGErk/dOkrDaHA0nQIQGAtrOjlX//9OQtRlSCy+x9rfB5N8yC71lH1nvMw==", + "dev": true, + "dependencies": { + "lodash-es": "^4.17.21" + }, + "peerDependencies": { + "chevrotain": "^11.0.0" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/chromium-bidi": { + "version": "0.11.0", + "resolved": "https://registry.npmmirror.com/chromium-bidi/-/chromium-bidi-0.11.0.tgz", + "integrity": "sha512-6CJWHkNRoyZyjV9Rwv2lYONZf1Xm0IuDyNq97nwSsxxP3wf5Bwy15K5rOvVKMtJ127jJBmxFUanSAOjgFRxgrA==", + "dev": true, + "peer": true, + "dependencies": { + "mitt": "3.0.1", + "zod": "3.23.8" + }, + "peerDependencies": { + "devtools-protocol": "*" + } + }, + "node_modules/class-variance-authority": { + "version": "0.7.1", + "resolved": "https://registry.npmmirror.com/class-variance-authority/-/class-variance-authority-0.7.1.tgz", + "integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==", + "dev": true, + "dependencies": { + "clsx": "^2.1.1" + }, + "funding": { + "url": "https://polar.sh/cva" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmmirror.com/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "peer": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "peer": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "peer": true + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "peer": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "peer": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "peer": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-convert/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/color-name": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/color-name/-/color-name-2.0.0.tgz", + "integrity": "sha512-SbtvAMWvASO5TE2QP07jHBMXKafgdZz8Vrsrn96fiL+O92/FN/PLARzUW5sKt013fjAprK2d2iCn2hk2Xb5oow==", + "dev": true, + "engines": { + "node": ">=12.20" + } + }, + "node_modules/color-string": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/color-string/-/color-string-2.0.1.tgz", + "integrity": "sha512-5z9FbYTZPAo8iKsNEqRNv+OlpBbDcoE+SY9GjLfDUHEfcNNV7tS9eSAlFHEaub/r5tBL9LtskAeq1l9SaoZ5tQ==", + "dev": true, + "dependencies": { + "color-name": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/commander": { + "version": "12.1.0", + "resolved": "https://registry.npmmirror.com/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "dev": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/confbox": { + "version": "0.2.2", + "resolved": "https://registry.npmmirror.com/confbox/-/confbox-0.2.2.tgz", + "integrity": "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==", + "dev": true + }, + "node_modules/cose-base": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/cose-base/-/cose-base-1.0.3.tgz", + "integrity": "sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==", + "dev": true, + "dependencies": { + "layout-base": "^1.0.0" + } + }, + "node_modules/cosmiconfig": { + "version": "9.0.0", + "resolved": "https://registry.npmmirror.com/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "dev": true, + "peer": true, + "dependencies": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cytoscape": { + "version": "3.32.0", + "resolved": "https://registry.npmmirror.com/cytoscape/-/cytoscape-3.32.0.tgz", + "integrity": "sha512-5JHBC9n75kz5851jeklCPmZWcg3hUe6sjqJvyk3+hVqFaKcHwHgxsjeN1yLmggoUc6STbtm9/NQyabQehfjvWQ==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/cytoscape-cose-bilkent": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/cytoscape-cose-bilkent/-/cytoscape-cose-bilkent-4.1.0.tgz", + "integrity": "sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==", + "dev": true, + "dependencies": { + "cose-base": "^1.0.0" + }, + "peerDependencies": { + "cytoscape": "^3.2.0" + } + }, + "node_modules/cytoscape-fcose": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/cytoscape-fcose/-/cytoscape-fcose-2.2.0.tgz", + "integrity": "sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==", + "dev": true, + "dependencies": { + "cose-base": "^2.2.0" + }, + "peerDependencies": { + "cytoscape": "^3.2.0" + } + }, + "node_modules/cytoscape-fcose/node_modules/cose-base": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/cose-base/-/cose-base-2.2.0.tgz", + "integrity": "sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==", + "dev": true, + "dependencies": { + "layout-base": "^2.0.0" + } + }, + "node_modules/cytoscape-fcose/node_modules/layout-base": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/layout-base/-/layout-base-2.0.1.tgz", + "integrity": "sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==", + "dev": true + }, + "node_modules/d3": { + "version": "7.9.0", + "resolved": "https://registry.npmmirror.com/d3/-/d3-7.9.0.tgz", + "integrity": "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==", + "dev": true, + "dependencies": { + "d3-array": "3", + "d3-axis": "3", + "d3-brush": "3", + "d3-chord": "3", + "d3-color": "3", + "d3-contour": "4", + "d3-delaunay": "6", + "d3-dispatch": "3", + "d3-drag": "3", + "d3-dsv": "3", + "d3-ease": "3", + "d3-fetch": "3", + "d3-force": "3", + "d3-format": "3", + "d3-geo": "3", + "d3-hierarchy": "3", + "d3-interpolate": "3", + "d3-path": "3", + "d3-polygon": "3", + "d3-quadtree": "3", + "d3-random": "3", + "d3-scale": "4", + "d3-scale-chromatic": "3", + "d3-selection": "3", + "d3-shape": "3", + "d3-time": "3", + "d3-time-format": "4", + "d3-timer": "3", + "d3-transition": "3", + "d3-zoom": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmmirror.com/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "dev": true, + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-axis": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/d3-axis/-/d3-axis-3.0.0.tgz", + "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-brush": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/d3-brush/-/d3-brush-3.0.0.tgz", + "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", + "dev": true, + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "3", + "d3-transition": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-chord": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/d3-chord/-/d3-chord-3.0.1.tgz", + "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", + "dev": true, + "dependencies": { + "d3-path": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-contour": { + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/d3-contour/-/d3-contour-4.0.2.tgz", + "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", + "dev": true, + "dependencies": { + "d3-array": "^3.2.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmmirror.com/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", + "dev": true, + "dependencies": { + "delaunator": "5" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dispatch": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-drag": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "dev": true, + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-selection": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dsv": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/d3-dsv/-/d3-dsv-3.0.1.tgz", + "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", + "dev": true, + "dependencies": { + "commander": "7", + "iconv-lite": "0.6", + "rw": "1" + }, + "bin": { + "csv2json": "bin/dsv2json.js", + "csv2tsv": "bin/dsv2dsv.js", + "dsv2dsv": "bin/dsv2dsv.js", + "dsv2json": "bin/dsv2json.js", + "json2csv": "bin/json2dsv.js", + "json2dsv": "bin/json2dsv.js", + "json2tsv": "bin/json2dsv.js", + "tsv2csv": "bin/dsv2dsv.js", + "tsv2json": "bin/dsv2json.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dsv/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-fetch": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/d3-fetch/-/d3-fetch-3.0.1.tgz", + "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", + "dev": true, + "dependencies": { + "d3-dsv": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-force": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/d3-force/-/d3-force-3.0.0.tgz", + "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", + "dev": true, + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-quadtree": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/d3-format/-/d3-format-3.1.0.tgz", + "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-geo": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/d3-geo/-/d3-geo-3.1.1.tgz", + "integrity": "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==", + "dev": true, + "dependencies": { + "d3-array": "2.5.0 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-hierarchy": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", + "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "dev": true, + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-polygon": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/d3-polygon/-/d3-polygon-3.0.1.tgz", + "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-quadtree": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/d3-quadtree/-/d3-quadtree-3.0.1.tgz", + "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-random": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/d3-random/-/d3-random-3.0.1.tgz", + "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-sankey": { + "version": "0.12.3", + "resolved": "https://registry.npmmirror.com/d3-sankey/-/d3-sankey-0.12.3.tgz", + "integrity": "sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==", + "dev": true, + "dependencies": { + "d3-array": "1 - 2", + "d3-shape": "^1.2.0" + } + }, + "node_modules/d3-sankey/node_modules/d3-array": { + "version": "2.12.1", + "resolved": "https://registry.npmmirror.com/d3-array/-/d3-array-2.12.1.tgz", + "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==", + "dev": true, + "dependencies": { + "internmap": "^1.0.0" + } + }, + "node_modules/d3-sankey/node_modules/d3-path": { + "version": "1.0.9", + "resolved": "https://registry.npmmirror.com/d3-path/-/d3-path-1.0.9.tgz", + "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==", + "dev": true + }, + "node_modules/d3-sankey/node_modules/d3-shape": { + "version": "1.3.7", + "resolved": "https://registry.npmmirror.com/d3-shape/-/d3-shape-1.3.7.tgz", + "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", + "dev": true, + "dependencies": { + "d3-path": "1" + } + }, + "node_modules/d3-sankey/node_modules/internmap": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/internmap/-/internmap-1.0.1.tgz", + "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==", + "dev": true + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "dev": true, + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale-chromatic": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==", + "dev": true, + "dependencies": { + "d3-color": "1 - 3", + "d3-interpolate": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-selection": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "dev": true, + "dependencies": { + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "dev": true, + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "dev": true, + "dependencies": { + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-transition": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "dev": true, + "dependencies": { + "d3-color": "1 - 3", + "d3-dispatch": "1 - 3", + "d3-ease": "1 - 3", + "d3-interpolate": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "d3-selection": "2 - 3" + } + }, + "node_modules/d3-zoom": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "dev": true, + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "2 - 3", + "d3-transition": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/dagre-d3-es": { + "version": "7.0.11", + "resolved": "https://registry.npmmirror.com/dagre-d3-es/-/dagre-d3-es-7.0.11.tgz", + "integrity": "sha512-tvlJLyQf834SylNKax8Wkzco/1ias1OPw8DcUMDE7oUIoSEW25riQVuiu/0OWEFqT0cxHT3Pa9/D82Jr47IONw==", + "dev": true, + "dependencies": { + "d3": "^7.9.0", + "lodash-es": "^4.17.21" + } + }, + "node_modules/data-uri-to-buffer": { + "version": "6.0.2", + "resolved": "https://registry.npmmirror.com/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", + "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 14" + } + }, + "node_modules/dayjs": { + "version": "1.11.13", + "resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.13.tgz", + "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==", + "dev": true + }, + "node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/degenerator": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/degenerator/-/degenerator-5.0.1.tgz", + "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", + "dev": true, + "peer": true, + "dependencies": { + "ast-types": "^0.13.4", + "escodegen": "^2.1.0", + "esprima": "^4.0.1" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/delaunator": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/delaunator/-/delaunator-5.0.1.tgz", + "integrity": "sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==", + "dev": true, + "dependencies": { + "robust-predicates": "^3.0.2" + } + }, + "node_modules/devtools-protocol": { + "version": "0.0.1367902", + "resolved": "https://registry.npmmirror.com/devtools-protocol/-/devtools-protocol-0.0.1367902.tgz", + "integrity": "sha512-XxtPuC3PGakY6PD7dG66/o8KwJ/LkH2/EKe19Dcw58w53dv4/vSQEkn/SzuyhHE2q4zPgCkxQBxus3VV4ql+Pg==", + "dev": true, + "peer": true + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmmirror.com/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true + }, + "node_modules/dompurify": { + "version": "3.2.6", + "resolved": "https://registry.npmmirror.com/dompurify/-/dompurify-3.2.6.tgz", + "integrity": "sha512-/2GogDQlohXPZe6D6NOgQvXLPSYBqIWMnZ8zzOhn09REE4eyAzb+Hed3jhoM9OkuaJ8P6ZGTTVWQKAi8ieIzfQ==", + "dev": true, + "optionalDependencies": { + "@types/trusted-types": "^2.0.7" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmmirror.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmmirror.com/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "peer": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmmirror.com/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmmirror.com/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "peer": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dev": true, + "peer": true, + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "peer": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmmirror.com/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/exsolve": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/exsolve/-/exsolve-1.0.5.tgz", + "integrity": "sha512-pz5dvkYYKQ1AHVrgOzBKWeP4u4FRb3a6DNK2ucr0OoNwYIU4QWsJ+NM36LLzORT+z845MzKHHhpXiUF5nvQoJg==", + "dev": true + }, + "node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "dev": true, + "peer": true, + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "node_modules/fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmmirror.com/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", + "dev": true, + "peer": true + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-redact": { + "version": "3.5.0", + "resolved": "https://registry.npmmirror.com/fast-redact/-/fast-redact-3.5.0.tgz", + "integrity": "sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmmirror.com/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dev": true, + "peer": true, + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmmirror.com/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "peer": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmmirror.com/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "peer": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-uri": { + "version": "6.0.4", + "resolved": "https://registry.npmmirror.com/get-uri/-/get-uri-6.0.4.tgz", + "integrity": "sha512-E1b1lFFLvLgak2whF2xDBcOy6NLVGZBqqjJjsIhvopKfWWEi64pLVTWWehV8KlLerZkfNTA95sTe2OdJKm1OzQ==", + "dev": true, + "peer": true, + "dependencies": { + "basic-ftp": "^5.0.2", + "data-uri-to-buffer": "^6.0.2", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmmirror.com/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "15.15.0", + "resolved": "https://registry.npmmirror.com/globals/-/globals-15.15.0.tgz", + "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/hachure-fill": { + "version": "0.5.2", + "resolved": "https://registry.npmmirror.com/hachure-fill/-/hachure-fill-0.5.2.tgz", + "integrity": "sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==", + "dev": true + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/highlight.js": { + "version": "10.7.3", + "resolved": "https://registry.npmmirror.com/highlight.js/-/highlight.js-10.7.3.tgz", + "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/html-to-image": { + "version": "1.11.13", + "resolved": "https://registry.npmmirror.com/html-to-image/-/html-to-image-1.11.13.tgz", + "integrity": "sha512-cuOPoI7WApyhBElTTb9oqsawRvZ0rHhaHwghRLlTuffoD1B2aDemlCruLeZrUIIdvG7gs9xeELEPm6PhuASqrg==", + "dev": true + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmmirror.com/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "peer": true, + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmmirror.com/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, + "peer": true, + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/immer": { + "version": "10.1.1", + "resolved": "https://registry.npmmirror.com/immer/-/immer-10.1.1.tgz", + "integrity": "sha512-s2MPrmjovJcoMaHtx6K11Ra7oD05NT97w1IC5zpMkT6Atjr7H8LjaDd81iIxUYpMKSRRNMJE703M1Fhr/TctHw==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmmirror.com/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "peer": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-meta-resolve": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz", + "integrity": "sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/ip-address": { + "version": "9.0.5", + "resolved": "https://registry.npmmirror.com/ip-address/-/ip-address-9.0.5.tgz", + "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", + "dev": true, + "peer": true, + "dependencies": { + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "peer": true + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmmirror.com/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmmirror.com/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jiti": { + "version": "1.21.7", + "resolved": "https://registry.npmmirror.com/jiti/-/jiti-1.21.7.tgz", + "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", + "dev": true, + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/jotai": { + "version": "2.12.5", + "resolved": "https://registry.npmmirror.com/jotai/-/jotai-2.12.5.tgz", + "integrity": "sha512-G8m32HW3lSmcz/4mbqx0hgJIQ0ekndKWiYP7kWVKi0p6saLXdSoye+FZiOFyonnd7Q482LCzm8sMDl7Ar1NWDw==", + "dev": true, + "engines": { + "node": ">=12.20.0" + }, + "peerDependencies": { + "@types/react": ">=17.0.0", + "react": ">=17.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "react": { + "optional": true + } + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "peer": true + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "peer": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsbn": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/jsbn/-/jsbn-1.1.0.tgz", + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", + "dev": true, + "peer": true + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "peer": true + }, + "node_modules/katex": { + "version": "0.16.22", + "resolved": "https://registry.npmmirror.com/katex/-/katex-0.16.22.tgz", + "integrity": "sha512-XCHRdUw4lf3SKBaJe4EvgqIuWwkPSo9XoeO8GjQW94Bp7TWv9hNhzZjZ+OH9yf1UmLygb7DIT5GSFQiyt16zYg==", + "dev": true, + "funding": [ + "https://opencollective.com/katex", + "https://github.com/sponsors/katex" + ], + "dependencies": { + "commander": "^8.3.0" + }, + "bin": { + "katex": "cli.js" + } + }, + "node_modules/katex/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmmirror.com/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "dev": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/khroma": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/khroma/-/khroma-2.1.0.tgz", + "integrity": "sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==", + "dev": true + }, + "node_modules/kolorist": { + "version": "1.8.0", + "resolved": "https://registry.npmmirror.com/kolorist/-/kolorist-1.8.0.tgz", + "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==", + "dev": true + }, + "node_modules/langium": { + "version": "3.3.1", + "resolved": "https://registry.npmmirror.com/langium/-/langium-3.3.1.tgz", + "integrity": "sha512-QJv/h939gDpvT+9SiLVlY7tZC3xB2qK57v0J04Sh9wpMb6MP1q8gB21L3WIo8T5P1MSMg3Ep14L7KkDCFG3y4w==", + "dev": true, + "dependencies": { + "chevrotain": "~11.0.3", + "chevrotain-allstar": "~0.3.0", + "vscode-languageserver": "~9.0.1", + "vscode-languageserver-textdocument": "~1.0.11", + "vscode-uri": "~3.0.8" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/layout-base": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/layout-base/-/layout-base-1.0.2.tgz", + "integrity": "sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==", + "dev": true + }, + "node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmmirror.com/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/local-pkg": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/local-pkg/-/local-pkg-1.1.1.tgz", + "integrity": "sha512-WunYko2W1NcdfAFpuLUoucsgULmgDBRkdxHxWQ7mK0cQqwPiy8E1enjuRBrhLtZkB5iScJ1XIPdhVEFK8aOLSg==", + "dev": true, + "dependencies": { + "mlly": "^1.7.4", + "pkg-types": "^2.0.1", + "quansync": "^0.2.8" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmmirror.com/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", + "dev": true + }, + "node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/marked": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/marked/-/marked-4.3.0.tgz", + "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", + "dev": true, + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/mermaid": { + "version": "11.6.0", + "resolved": "https://registry.npmmirror.com/mermaid/-/mermaid-11.6.0.tgz", + "integrity": "sha512-PE8hGUy1LDlWIHWBP05SFdqUHGmRcCcK4IzpOKPE35eOw+G9zZgcnMpyunJVUEOgb//KBORPjysKndw8bFLuRg==", + "dev": true, + "dependencies": { + "@braintree/sanitize-url": "^7.0.4", + "@iconify/utils": "^2.1.33", + "@mermaid-js/parser": "^0.4.0", + "@types/d3": "^7.4.3", + "cytoscape": "^3.29.3", + "cytoscape-cose-bilkent": "^4.1.0", + "cytoscape-fcose": "^2.2.0", + "d3": "^7.9.0", + "d3-sankey": "^0.12.3", + "dagre-d3-es": "7.0.11", + "dayjs": "^1.11.13", + "dompurify": "^3.2.4", + "katex": "^0.16.9", + "khroma": "^2.1.0", + "lodash-es": "^4.17.21", + "marked": "^15.0.7", + "roughjs": "^4.6.6", + "stylis": "^4.3.6", + "ts-dedent": "^2.2.0", + "uuid": "^11.1.0" + } + }, + "node_modules/mermaid/node_modules/marked": { + "version": "15.0.12", + "resolved": "https://registry.npmmirror.com/marked/-/marked-15.0.12.tgz", + "integrity": "sha512-8dD6FusOQSrpv9Z1rdNMdlSgQOIP880DHqnohobOmYLElGEqAL/JvxvuxZO16r4HtjTlfPRDC1hbvxC9dPN2nA==", + "dev": true, + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmmirror.com/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "dev": true, + "peer": true + }, + "node_modules/mlly": { + "version": "1.7.4", + "resolved": "https://registry.npmmirror.com/mlly/-/mlly-1.7.4.tgz", + "integrity": "sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==", + "dev": true, + "dependencies": { + "acorn": "^8.14.0", + "pathe": "^2.0.1", + "pkg-types": "^1.3.0", + "ufo": "^1.5.4" + } + }, + "node_modules/mlly/node_modules/confbox": { + "version": "0.1.8", + "resolved": "https://registry.npmmirror.com/confbox/-/confbox-0.1.8.tgz", + "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", + "dev": true + }, + "node_modules/mlly/node_modules/pkg-types": { + "version": "1.3.1", + "resolved": "https://registry.npmmirror.com/pkg-types/-/pkg-types-1.3.1.tgz", + "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", + "dev": true, + "dependencies": { + "confbox": "^0.1.8", + "mlly": "^1.7.4", + "pathe": "^2.0.1" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/netmask": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/netmask/-/netmask-2.0.2.tgz", + "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmmirror.com/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/on-exit-leak-free": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz", + "integrity": "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "peer": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/pac-proxy-agent": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz", + "integrity": "sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==", + "dev": true, + "peer": true, + "dependencies": { + "@tootallnate/quickjs-emscripten": "^0.23.0", + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "get-uri": "^6.0.1", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.6", + "pac-resolver": "^7.0.1", + "socks-proxy-agent": "^8.0.5" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/pac-resolver": { + "version": "7.0.1", + "resolved": "https://registry.npmmirror.com/pac-resolver/-/pac-resolver-7.0.1.tgz", + "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", + "dev": true, + "peer": true, + "dependencies": { + "degenerator": "^5.0.0", + "netmask": "^2.0.2" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true + }, + "node_modules/package-manager-detector": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/package-manager-detector/-/package-manager-detector-1.3.0.tgz", + "integrity": "sha512-ZsEbbZORsyHuO00lY1kV3/t72yp6Ysay6Pd17ZAlNGuGwmWDLCJxFpRs0IzfXfj1o4icJOkUEioexFHzyPurSQ==", + "dev": true + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "peer": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmmirror.com/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-data-parser": { + "version": "0.1.0", + "resolved": "https://registry.npmmirror.com/path-data-parser/-/path-data-parser-0.1.0.tgz", + "integrity": "sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==", + "dev": true + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmmirror.com/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true, + "peer": true + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pino": { + "version": "8.21.0", + "resolved": "https://registry.npmmirror.com/pino/-/pino-8.21.0.tgz", + "integrity": "sha512-ip4qdzjkAyDDZklUaZkcRFb2iA118H9SgRh8yzTkSQK8HilsOJF7rSY8HoW5+I0M46AZgX/pxbprf2vvzQCE0Q==", + "dev": true, + "dependencies": { + "atomic-sleep": "^1.0.0", + "fast-redact": "^3.1.1", + "on-exit-leak-free": "^2.1.0", + "pino-abstract-transport": "^1.2.0", + "pino-std-serializers": "^6.0.0", + "process-warning": "^3.0.0", + "quick-format-unescaped": "^4.0.3", + "real-require": "^0.2.0", + "safe-stable-stringify": "^2.3.1", + "sonic-boom": "^3.7.0", + "thread-stream": "^2.6.0" + }, + "bin": { + "pino": "bin.js" + } + }, + "node_modules/pino-abstract-transport": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/pino-abstract-transport/-/pino-abstract-transport-1.2.0.tgz", + "integrity": "sha512-Guhh8EZfPCfH+PMXAb6rKOjGQEoy0xlAIn+irODG5kgfYV+BQ0rGYYWTIel3P5mmyXqkYkPmdIkywsn6QKUR1Q==", + "dev": true, + "dependencies": { + "readable-stream": "^4.0.0", + "split2": "^4.0.0" + } + }, + "node_modules/pino-std-serializers": { + "version": "6.2.2", + "resolved": "https://registry.npmmirror.com/pino-std-serializers/-/pino-std-serializers-6.2.2.tgz", + "integrity": "sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==", + "dev": true + }, + "node_modules/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmmirror.com/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-types": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/pkg-types/-/pkg-types-2.1.0.tgz", + "integrity": "sha512-wmJwA+8ihJixSoHKxZJRBQG1oY8Yr9pGLzRmSsNms0iNWyHHAlZCa7mmKiFR10YPZuz/2k169JiS/inOjBCZ2A==", + "dev": true, + "dependencies": { + "confbox": "^0.2.1", + "exsolve": "^1.0.1", + "pathe": "^2.0.3" + } + }, + "node_modules/points-on-curve": { + "version": "0.2.0", + "resolved": "https://registry.npmmirror.com/points-on-curve/-/points-on-curve-0.2.0.tgz", + "integrity": "sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==", + "dev": true + }, + "node_modules/points-on-path": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/points-on-path/-/points-on-path-0.2.1.tgz", + "integrity": "sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g==", + "dev": true, + "dependencies": { + "path-data-parser": "0.1.0", + "points-on-curve": "0.2.0" + } + }, + "node_modules/postcss": { + "version": "8.5.4", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.5.4.tgz", + "integrity": "sha512-QSa9EBe+uwlGTFmHsPKokv3B/oEMQZxfqW0QqNCyhpa6mB1afzulwn8hihglqAb2pOw+BJgNlmXQ8la2VeHB7w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmmirror.com/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dev": true, + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/postcss-load-config/-/postcss-load-config-4.0.2.tgz", + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "lilconfig": "^3.0.0", + "yaml": "^2.3.4" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-nested": { + "version": "6.2.0", + "resolved": "https://registry.npmmirror.com/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "postcss-selector-parser": "^6.1.1" + }, + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmmirror.com/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmmirror.com/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-warning": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/process-warning/-/process-warning-3.0.0.tgz", + "integrity": "sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==", + "dev": true + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/proxy-agent": { + "version": "6.5.0", + "resolved": "https://registry.npmmirror.com/proxy-agent/-/proxy-agent-6.5.0.tgz", + "integrity": "sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==", + "dev": true, + "peer": true, + "dependencies": { + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "http-proxy-agent": "^7.0.1", + "https-proxy-agent": "^7.0.6", + "lru-cache": "^7.14.1", + "pac-proxy-agent": "^7.1.0", + "proxy-from-env": "^1.1.0", + "socks-proxy-agent": "^8.0.5" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true, + "peer": true + }, + "node_modules/pump": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/pump/-/pump-3.0.2.tgz", + "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", + "dev": true, + "peer": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/puppeteer": { + "version": "23.11.1", + "resolved": "https://registry.npmmirror.com/puppeteer/-/puppeteer-23.11.1.tgz", + "integrity": "sha512-53uIX3KR5en8l7Vd8n5DUv90Ae9QDQsyIthaUFVzwV6yU750RjqRznEtNMBT20VthqAdemnJN+hxVdmMHKt7Zw==", + "dev": true, + "hasInstallScript": true, + "peer": true, + "dependencies": { + "@puppeteer/browsers": "2.6.1", + "chromium-bidi": "0.11.0", + "cosmiconfig": "^9.0.0", + "devtools-protocol": "0.0.1367902", + "puppeteer-core": "23.11.1", + "typed-query-selector": "^2.12.0" + }, + "bin": { + "puppeteer": "lib/cjs/puppeteer/node/cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/puppeteer-core": { + "version": "23.11.1", + "resolved": "https://registry.npmmirror.com/puppeteer-core/-/puppeteer-core-23.11.1.tgz", + "integrity": "sha512-3HZ2/7hdDKZvZQ7dhhITOUg4/wOrDRjyK2ZBllRB0ZCOi9u0cwq1ACHDjBB+nX+7+kltHjQvBRdeY7+W0T+7Gg==", + "dev": true, + "peer": true, + "dependencies": { + "@puppeteer/browsers": "2.6.1", + "chromium-bidi": "0.11.0", + "debug": "^4.4.0", + "devtools-protocol": "0.0.1367902", + "typed-query-selector": "^2.12.0", + "ws": "^8.18.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/quansync": { + "version": "0.2.10", + "resolved": "https://registry.npmmirror.com/quansync/-/quansync-0.2.10.tgz", + "integrity": "sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/antfu" + }, + { + "type": "individual", + "url": "https://github.com/sponsors/sxzz" + } + ] + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/quick-format-unescaped": { + "version": "4.0.4", + "resolved": "https://registry.npmmirror.com/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", + "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==", + "dev": true + }, + "node_modules/radash": { + "version": "12.1.0", + "resolved": "https://registry.npmmirror.com/radash/-/radash-12.1.0.tgz", + "integrity": "sha512-b0Zcf09AhqKS83btmUeYBS8tFK7XL2e3RvLmZcm0sTdF1/UUlHSsjXdCcWNxe7yfmAlPve5ym0DmKGtTzP6kVQ==", + "dev": true, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/ramda": { + "version": "0.28.0", + "resolved": "https://registry.npmmirror.com/ramda/-/ramda-0.28.0.tgz", + "integrity": "sha512-9QnLuG/kPVgWvMQ4aODhsBUFKOUmnbUnsSXACv+NCQZcHbeb+v8Lodp8OVxtRULN1/xOyYLLaL6npE6dMq5QTA==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/ramda" + } + }, + "node_modules/react": { + "version": "19.1.0", + "resolved": "https://registry.npmmirror.com/react/-/react-19.1.0.tgz", + "integrity": "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.1.0", + "resolved": "https://registry.npmmirror.com/react-dom/-/react-dom-19.1.0.tgz", + "integrity": "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==", + "dev": true, + "dependencies": { + "scheduler": "^0.26.0" + }, + "peerDependencies": { + "react": "^19.1.0" + } + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readable-stream": { + "version": "4.7.0", + "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-4.7.0.tgz", + "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", + "dev": true, + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/real-require": { + "version": "0.2.0", + "resolved": "https://registry.npmmirror.com/real-require/-/real-require-0.2.0.tgz", + "integrity": "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==", + "dev": true, + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmmirror.com/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "dev": true, + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/robust-predicates": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/robust-predicates/-/robust-predicates-3.0.2.tgz", + "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==", + "dev": true + }, + "node_modules/roughjs": { + "version": "4.6.6", + "resolved": "https://registry.npmmirror.com/roughjs/-/roughjs-4.6.6.tgz", + "integrity": "sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==", + "dev": true, + "dependencies": { + "hachure-fill": "^0.5.2", + "path-data-parser": "^0.1.0", + "points-on-curve": "^0.2.0", + "points-on-path": "^0.2.1" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rw": { + "version": "1.3.3", + "resolved": "https://registry.npmmirror.com/rw/-/rw-1.3.3.tgz", + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==", + "dev": true + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safe-stable-stringify": { + "version": "2.5.0", + "resolved": "https://registry.npmmirror.com/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", + "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/scheduler": { + "version": "0.26.0", + "resolved": "https://registry.npmmirror.com/scheduler/-/scheduler-0.26.0.tgz", + "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", + "dev": true + }, + "node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmmirror.com/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "peer": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmmirror.com/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.8.4", + "resolved": "https://registry.npmmirror.com/socks/-/socks-2.8.4.tgz", + "integrity": "sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ==", + "dev": true, + "peer": true, + "dependencies": { + "ip-address": "^9.0.5", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "8.0.5", + "resolved": "https://registry.npmmirror.com/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", + "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", + "dev": true, + "peer": true, + "dependencies": { + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "socks": "^2.8.3" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/sonic-boom": { + "version": "3.8.1", + "resolved": "https://registry.npmmirror.com/sonic-boom/-/sonic-boom-3.8.1.tgz", + "integrity": "sha512-y4Z8LCDBuum+PBP3lSV7RHrXscqksve/bi0as7mhwVnBW+/wUqKT/2Kb7um8yqcFy0duYbbPxzt89Zy2nOCaxg==", + "dev": true, + "dependencies": { + "atomic-sleep": "^1.0.0" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmmirror.com/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "dev": true, + "engines": { + "node": ">= 10.x" + } + }, + "node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "dev": true, + "peer": true + }, + "node_modules/streamx": { + "version": "2.22.1", + "resolved": "https://registry.npmmirror.com/streamx/-/streamx-2.22.1.tgz", + "integrity": "sha512-znKXEBxfatz2GBNK02kRnCXjV+AA4kjZIUxeWSr3UGirZMJfTE9uiwKHobnbgxWyL/JWro8tTq+vOqAK1/qbSA==", + "dev": true, + "peer": true, + "dependencies": { + "fast-fifo": "^1.3.2", + "text-decoder": "^1.1.0" + }, + "optionalDependencies": { + "bare-events": "^2.2.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmmirror.com/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/stylis": { + "version": "4.3.6", + "resolved": "https://registry.npmmirror.com/stylis/-/stylis-4.3.6.tgz", + "integrity": "sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==", + "dev": true + }, + "node_modules/sucrase": { + "version": "3.35.0", + "resolved": "https://registry.npmmirror.com/sucrase/-/sucrase-3.35.0.tgz", + "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "^10.3.10", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/sucrase/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmmirror.com/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tabbable": { + "version": "6.2.0", + "resolved": "https://registry.npmmirror.com/tabbable/-/tabbable-6.2.0.tgz", + "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==", + "dev": true + }, + "node_modules/tailwind-merge": { + "version": "3.3.0", + "resolved": "https://registry.npmmirror.com/tailwind-merge/-/tailwind-merge-3.3.0.tgz", + "integrity": "sha512-fyW/pEfcQSiigd5SNn0nApUOxx0zB/dm6UDU/rEwc2c3sX2smWUNbapHv+QRqLGVp9GWX3THIa7MUGPo+YkDzQ==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, + "node_modules/tailwindcss": { + "version": "3.4.17", + "resolved": "https://registry.npmmirror.com/tailwindcss/-/tailwindcss-3.4.17.tgz", + "integrity": "sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==", + "dev": true, + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.6.0", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.2", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.6", + "lilconfig": "^3.1.3", + "micromatch": "^4.0.8", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.1.1", + "postcss": "^8.4.47", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.2", + "postcss-nested": "^6.2.0", + "postcss-selector-parser": "^6.1.2", + "resolve": "^1.22.8", + "sucrase": "^3.35.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tar-fs": { + "version": "3.0.9", + "resolved": "https://registry.npmmirror.com/tar-fs/-/tar-fs-3.0.9.tgz", + "integrity": "sha512-XF4w9Xp+ZQgifKakjZYmFdkLoSWd34VGKcsTCwlNWM7QG3ZbaxnTsaBwnjFZqHRf/rROxaR8rXnbtwdvaDI+lA==", + "dev": true, + "peer": true, + "dependencies": { + "pump": "^3.0.0", + "tar-stream": "^3.1.5" + }, + "optionalDependencies": { + "bare-fs": "^4.0.1", + "bare-path": "^3.0.0" + } + }, + "node_modules/tar-stream": { + "version": "3.1.7", + "resolved": "https://registry.npmmirror.com/tar-stream/-/tar-stream-3.1.7.tgz", + "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", + "dev": true, + "peer": true, + "dependencies": { + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + }, + "node_modules/text-decoder": { + "version": "1.2.3", + "resolved": "https://registry.npmmirror.com/text-decoder/-/text-decoder-1.2.3.tgz", + "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==", + "dev": true, + "peer": true, + "dependencies": { + "b4a": "^1.6.4" + } + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmmirror.com/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmmirror.com/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/thread-stream": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/thread-stream/-/thread-stream-2.7.0.tgz", + "integrity": "sha512-qQiRWsU/wvNolI6tbbCKd9iKaTnCXsTwVxhhKM6nctPdujTyztjlbUkUTUymidWcMnZ5pWR0ej4a0tjsW021vw==", + "dev": true, + "dependencies": { + "real-require": "^0.2.0" + } + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmmirror.com/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true, + "peer": true + }, + "node_modules/tinyexec": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/tinyexec/-/tinyexec-1.0.1.tgz", + "integrity": "sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==", + "dev": true + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-dedent": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/ts-dedent/-/ts-dedent-2.2.0.tgz", + "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==", + "dev": true, + "engines": { + "node": ">=6.10" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmmirror.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true + }, + "node_modules/typed-query-selector": { + "version": "2.12.0", + "resolved": "https://registry.npmmirror.com/typed-query-selector/-/typed-query-selector-2.12.0.tgz", + "integrity": "sha512-SbklCd1F0EiZOyPiW192rrHZzZ5sBijB6xM+cpmrwDqObvdtunOHHIk9fCGsoK5JVIYXoyEp4iEdE3upFH3PAg==", + "dev": true, + "peer": true + }, + "node_modules/ufo": { + "version": "1.6.1", + "resolved": "https://registry.npmmirror.com/ufo/-/ufo-1.6.1.tgz", + "integrity": "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==", + "dev": true + }, + "node_modules/unbzip2-stream": { + "version": "1.4.3", + "resolved": "https://registry.npmmirror.com/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", + "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", + "dev": true, + "peer": true, + "dependencies": { + "buffer": "^5.2.1", + "through": "^2.3.8" + } + }, + "node_modules/unbzip2-stream/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmmirror.com/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "peer": true, + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmmirror.com/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/use-sync-external-store": { + "version": "1.5.0", + "resolved": "https://registry.npmmirror.com/use-sync-external-store/-/use-sync-external-store-1.5.0.tgz", + "integrity": "sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==", + "dev": true, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/uuid": { + "version": "11.1.0", + "resolved": "https://registry.npmmirror.com/uuid/-/uuid-11.1.0.tgz", + "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", + "dev": true, + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/esm/bin/uuid" + } + }, + "node_modules/vscode-jsonrpc": { + "version": "8.2.0", + "resolved": "https://registry.npmmirror.com/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz", + "integrity": "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/vscode-languageserver": { + "version": "9.0.1", + "resolved": "https://registry.npmmirror.com/vscode-languageserver/-/vscode-languageserver-9.0.1.tgz", + "integrity": "sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==", + "dev": true, + "dependencies": { + "vscode-languageserver-protocol": "3.17.5" + }, + "bin": { + "installServerIntoExtension": "bin/installServerIntoExtension" + } + }, + "node_modules/vscode-languageserver-protocol": { + "version": "3.17.5", + "resolved": "https://registry.npmmirror.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.5.tgz", + "integrity": "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==", + "dev": true, + "dependencies": { + "vscode-jsonrpc": "8.2.0", + "vscode-languageserver-types": "3.17.5" + } + }, + "node_modules/vscode-languageserver-textdocument": { + "version": "1.0.12", + "resolved": "https://registry.npmmirror.com/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.12.tgz", + "integrity": "sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==", + "dev": true + }, + "node_modules/vscode-languageserver-types": { + "version": "3.17.5", + "resolved": "https://registry.npmmirror.com/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz", + "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==", + "dev": true + }, + "node_modules/vscode-uri": { + "version": "3.0.8", + "resolved": "https://registry.npmmirror.com/vscode-uri/-/vscode-uri-3.0.8.tgz", + "integrity": "sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==", + "dev": true + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "peer": true + }, + "node_modules/ws": { + "version": "8.18.2", + "resolved": "https://registry.npmmirror.com/ws/-/ws-8.18.2.tgz", + "integrity": "sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmmirror.com/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yaml": { + "version": "2.8.0", + "resolved": "https://registry.npmmirror.com/yaml/-/yaml-2.8.0.tgz", + "integrity": "sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==", + "dev": true, + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmmirror.com/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "peer": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "peer": true + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "peer": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "peer": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmmirror.com/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dev": true, + "peer": true, + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "node_modules/zod": { + "version": "3.23.8", + "resolved": "https://registry.npmmirror.com/zod/-/zod-3.23.8.tgz", + "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", + "dev": true, + "peer": true, + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..f82b63b --- /dev/null +++ b/package.json @@ -0,0 +1,5 @@ +{ + "devDependencies": { + "@mermaid-js/mermaid-cli": "^11.4.2" + } +} diff --git a/scripts/doc-toolkit.sh b/scripts/doc-toolkit.sh new file mode 100755 index 0000000..7f14b53 --- /dev/null +++ b/scripts/doc-toolkit.sh @@ -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 创建新的模块设计文档" + echo " validate [file_path] 验证文档格式和内容" + echo " export [file] 导出文档为指定格式" + echo " generate-diagram 生成指定类型的图表" + 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 "$@" \ No newline at end of file diff --git a/templates/module_design_template.md b/templates/module_design_template.md new file mode 100644 index 0000000..bdac2f4 --- /dev/null +++ b/templates/module_design_template.md @@ -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}} diff --git a/templates/style.css b/templates/style.css new file mode 100644 index 0000000..f5dd3ec --- /dev/null +++ b/templates/style.css @@ -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; +} diff --git a/系统概要设计文档 word.docx b/系统概要设计文档 word.docx new file mode 100644 index 0000000..010b584 Binary files /dev/null and b/系统概要设计文档 word.docx differ