From 2ee120f75672f06f542a7e068df4d4212a564cb6 Mon Sep 17 00:00:00 2001 From: james Date: Tue, 19 May 2026 22:27:43 +0800 Subject: [PATCH] Initial commit --- .gitignore | 75 + README-VITEPRESS.md | 103 + README.md | 343 ++ docker-compose.yml | 32 + docker/API.md | 420 ++ docker/Dockerfile | 97 + docker/api/package.json | 16 + docker/api/server.js | 220 + docker/docker-entrypoint.sh | 84 + docs/.vitepress/config.mjs | 219 + docs/.vitepress/public/logo.svg | 11 + docs/.vitepress/theme/index.ts | 13 + docs/.vitepress/theme/style/print.css | 101 + docs/.vitepress/vitepress-pdf.config.ts | 94 + docs/analysis/reports.md | 380 ++ docs/appendix/glossary.md | 195 + docs/basic/data-management.md | 397 ++ docs/basic/equipment.md | 340 ++ docs/business/equipment-warehouse.md | 462 +++ docs/business/production.md | 441 ++ docs/business/quality.md | 452 +++ docs/getting-started/quick-start.md | 372 ++ docs/guide/document-guide.md | 154 + docs/guide/system-overview.md | 376 ++ docs/index.md | 38 + docs/integration/data-integration.md | 289 ++ docs/operation/system-operation.md | 366 ++ docs/operation/technical-support.md | 459 +++ docs/格式标准.md | 117 + docs/格式样例.md | 325 ++ env.example | 42 + package-lock.json | 4901 +++++++++++++++++++++++ package.json | 15 + 33 files changed, 11949 insertions(+) create mode 100644 .gitignore create mode 100644 README-VITEPRESS.md create mode 100644 README.md create mode 100644 docker-compose.yml create mode 100644 docker/API.md create mode 100644 docker/Dockerfile create mode 100644 docker/api/package.json create mode 100644 docker/api/server.js create mode 100644 docker/docker-entrypoint.sh create mode 100644 docs/.vitepress/config.mjs create mode 100644 docs/.vitepress/public/logo.svg create mode 100644 docs/.vitepress/theme/index.ts create mode 100644 docs/.vitepress/theme/style/print.css create mode 100644 docs/.vitepress/vitepress-pdf.config.ts create mode 100644 docs/analysis/reports.md create mode 100644 docs/appendix/glossary.md create mode 100644 docs/basic/data-management.md create mode 100644 docs/basic/equipment.md create mode 100644 docs/business/equipment-warehouse.md create mode 100644 docs/business/production.md create mode 100644 docs/business/quality.md create mode 100644 docs/getting-started/quick-start.md create mode 100644 docs/guide/document-guide.md create mode 100644 docs/guide/system-overview.md create mode 100644 docs/index.md create mode 100644 docs/integration/data-integration.md create mode 100644 docs/operation/system-operation.md create mode 100644 docs/operation/technical-support.md create mode 100644 docs/格式标准.md create mode 100644 docs/格式样例.md create mode 100644 env.example create mode 100644 package-lock.json create mode 100644 package.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..361d30f --- /dev/null +++ b/.gitignore @@ -0,0 +1,75 @@ +# Environment files (敏感配置) +.env +.env.local +.env.production +!.env.example + +# Dependencies +node_modules/ +.pnpm-store/ +**/node_modules/ + +# Build outputs +docs/.vitepress/dist/ +docs/.vitepress/cache/ +**/.vitepress/dist/ +**/.vitepress/cache/ + +# PDF exports (导出的 PDF 文件不应提交) +*.pdf +!*.example.pdf + +# Docker +docker/tmp/ +docker/*.log +**/*.log + +# Logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +# OS +.DS_Store +Thumbs.db +ehthumbs.db +*.swp +*.swo +*~ +.fuse_hidden* +.Directory +Desktop.ini + +# IDE +.vscode/ +.idea/ +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? +*.sublime-workspace +*.sublime-project + +# Temporary files +*.tmp +*.temp +.cache/ +.tmp/ +temp/ + +# Test coverage +coverage/ +.nyc_output/ + +# Build artifacts +dist/ +build/ +*.tgz + +# Misc +*.local +*.log diff --git a/README-VITEPRESS.md b/README-VITEPRESS.md new file mode 100644 index 0000000..9690f52 --- /dev/null +++ b/README-VITEPRESS.md @@ -0,0 +1,103 @@ +# VitePress 使用手册 + +基于 VitePress 构建的使用手册。 + +## 📖 文档预览 + +本手册采用 VitePress 构建,支持实时预览和静态站点生成。 + +## 🚀 快速开始 + +### 准备package.json文件 + +文件夹下具备 package.json 文件 + +json文件结构如下: + +```json +{ + "name": "docs-vitepress", + "version": "1.0.0", + "description": "vitepress在线文档", + "scripts": { + "docs:dev": "vitepress dev docs", + "docs:build": "vitepress build docs", + "docs:preview": "vitepress preview docs", + "export-pdf": "press-export-pdf export docs" + }, + "devDependencies": { + "vitepress": "latest", + "vitepress-export-pdf": "^1.0.0" + } +} +``` +### 安装依赖 + +执行以下命令安装依赖: +```bash +npm install +``` + +### 开发预览 + +```bash +npm run docs:dev +``` + +### 构建静态站点 + +```bash +npm run docs:build +``` + +### 预览构建结果 + +```bash +npm run docs:preview +``` + +## 📁 文档结构 + +``` +docs/ +├── .vitepress/ +│ └── config.mjs # VitePress 配置 +├── guide/ # 文档说明 +│ ├── document-guide.md +│ └── system-overview.md +├── getting-started/ # 快速入门 +│ └── quick-start.md +├── basic/ # 基础配置 +│ ├── data-management.md +│ └── equipment.md +├── business/ # 业务模块 +│ ├── production.md +│ ├── quality.md +│ └── equipment-warehouse.md +├── integration/ # 数据集成 +│ └── data-integration.md +├── analysis/ # 报表分析 +│ └── reports.md +├── operation/ # 系统运维 +│ ├── system-operation.md +│ └── technical-support.md +├── appendix/ # 附录 +│ └── glossary.md +└── index.md # 首页 +``` + +## 🔧 配置说明 + +VitePress 配置文件位于 `docs/.vitepress/config.mjs`,包含以下配置: + +- 网站标题和描述 +- 导航栏配置 +- 侧边栏配置 +- 主题配置 +- Markdown 配置 + +## 📦 技术栈 + +- [VitePress](https://vitepress.dev/) - Vite 驱动的静态站点生成器 +- [Vue.js](https://vuejs.org/) - 渐进式 JavaScript 框架 + diff --git a/README.md b/README.md new file mode 100644 index 0000000..0bdafde --- /dev/null +++ b/README.md @@ -0,0 +1,343 @@ +# VitePress Docker 部署指南 + +## 概述 + +本项目提供了完整的 VitePress 文档系统 Docker 部署方案,包含 VitePress 文档服务、API 服务和 PDF 导出功能。 + +## 功能特性 + +- ✅ VitePress 文档服务(端口 3000) +- ✅ RESTful API 服务(端口 3001) +- ✅ PDF 导出功能 +- ✅ 中文、俄语等多语言字体支持 +- ✅ 跨平台部署支持 + +## 系统要求 + +- Docker 20.10+ +- Docker Compose 2.0+ +- 至少 2GB 可用内存 + +## 快速开始 + +### 1. 准备配置文件 + +在项目根目录创建 `.env` 文件: + +```bash +# VitePress 文档服务器端口 +VITEPRESS_PORT=3000 + +# API 服务器端口 +API_PORT=3001 + +# 文档目录路径(相对于项目根目录) +DOCS_DIR=./docs +``` + +### 2. 构建并启动服务 + +```bash +# 构建镜像并启动服务 +docker-compose up --build + +# 或者后台运行 +docker-compose up --build -d +``` + +### 3. 验证服务状态 + +访问以下地址确认服务正常运行: + +- **VitePress 文档**: http://localhost:3000 +- **API 健康检查**: http://localhost:3001/health + +## 目录结构 + +``` +hf-mes-docs-vitepress/ +├── docker/ +│ ├── api/ +│ │ ├── server.js # API 服务主文件 +│ │ └── package.json # API 依赖 +│ ├── Dockerfile # Docker 镜像构建文件 +│ └── docker-entrypoint.sh # 容器启动脚本 +├── docs/ # VitePress 文档目录 **生产时使用** +│ ├── .vitepress/ +│ │ ├── config.mjs # VitePress 配置 +│ │ └── vitepress-pdf.config.ts # PDF 导出配置 +│ ├── index.md # 首页 +│ ├── guide/ # 指南目录 +│ ├── getting-started/ # 入门目录 +│ └── ... # 其他文档 +├── docker-compose.yml # Docker Compose 配置 +├── package.json # 项目依赖 **构建docker时使用** +└── .env # 环境变量配置 +``` + +## 常用命令 + + +### 直接拉取image +```bash +docker pull xeden3/vitepress-docker:latest +``` + +### 启动服务 +```bash +# 前台运行 +docker-compose up + +# 后台运行 +docker-compose up -d + +# 重新构建并启动 +docker-compose up --build +``` + +### 停止服务 + +```bash +# 停止服务 +docker-compose down + +# 停止并删除数据卷 +docker-compose down -v +``` + +### 查看日志 + +```bash +# 查看所有日志 +docker-compose logs -f + +# 查看 API 服务日志 +docker-compose logs -f api + +# 查看最近 100 行日志 +docker-compose logs --tail=100 +``` + +### 重启服务 + +```bash +# 重启所有服务 +docker-compose restart +``` + +## 环境变量配置 + +### 可用环境变量 + +| 变量名 | 默认值 | 说明 | +|--------|--------|------| +| `VITEPRESS_PORT` | 3000 | VitePress 文档服务端口 | +| `API_PORT` | 3001 | API 服务端口 | +| `DOCS_DIR` | ./docs | 文档目录(支持绝对路径和相对路径) | +| `DOCS_PATH` | /app/docs | 容器内文档路径(固定值) | + +### 配置示例 + +#### 使用相对路径(默认) + +```bash +DOCS_DIR=./docs +``` + +#### 使用绝对路径 + +**Windows:** +```bash +DOCS_DIR=C:\Users\xeden\Desktop\MES使用手册\hf-mes-docs-vitepress\docs +``` + +**Linux/Mac:** +```bash +DOCS_DIR=/home/user/docs +``` + +## 自定义文档目录 + +默认情况下,Docker 会挂载项目根目录下的 `./docs` 文件夹到容器的 `/app/docs`。 + +### 方法一:通过 .env 文件 + +在项目根目录的 `.env` 文件中修改: + +```bash +DOCS_DIR=./docs +``` + +### 方法二:通过命令行 + +```bash +# Linux/Mac +DOCS_DIR=/custom/path docker-compose up -d + +# Windows PowerShell +$env:DOCS_DIR="C:\custom\docs"; docker-compose up -d +``` + +### 方法三:修改 docker-compose.yml + +直接修改 `docker-compose.yml` 文件中的 `volumes` 配置: + +```yaml +volumes: + - /your/custom/path:/app/docs +``` + +## PDF 导出功能 + +### 使用 API 导出 PDF + +API 服务提供以下端点: + +#### 健康检查 + +```bash +curl http://localhost:3001/health +``` + +#### 导出 PDF + +```bash +curl "http://localhost:3001/export-pdf" +``` + +#### 查看已导出的 PDF + +```bash +curl http://localhost:3001/pdf-files +``` + +### PDF 文件位置 + +导出的 PDF 文件保存在你配置的 `DOCS_DIR` 目录下。 + +### 导出配置 + +PDF 导出使用 `vitepress-export-pdf` 插件,配置位于: + +``` +docs/.vitepress/vitepress-pdf.config.ts +``` + +如需自定义 PDF 导出选项,请修改该配置文件。 + +**导出文件名与 `vitepress-pdf.config.ts` 配置一致** + +## 多语言支持 + +Docker 镜像已包含以下字体支持: + +- ✅ 中文字体(文泉驿、Noto CJK) +- ✅ 俄文字体(DejaVu) +- ✅ 其他语言字体 + +### 使用自定义字体 + +如需使用 Windows 雅黑字体,可以: + +1. 从 Windows 系统复制字体文件: + ```bash + # 假设容器名称为 vitepress-docker + docker cp C:\Windows\Fonts\msyh.ttc vitepress-docker:/usr/share/fonts/truetype/ + ``` + +2. 进入容器更新字体缓存: + ```bash + docker exec vitepress-docker fc-cache -fv + ``` + +3. 重新导出 PDF 即可使用新字体 + +## 故障排除 + +### 容器无法启动 + +1. 检查端口占用: + ```bash + # Windows + netstat -ano | findstr 3000 + netstat -ano | findstr 3001 + + # Linux/Mac + netstat -tuln | grep -E '3000|3001' + ``` + +2. 检查 Docker 状态: + ```bash + docker ps + docker-compose ps + ``` + +3. 查看错误日志: + ```bash + docker-compose logs --tail=50 + ``` + +### 文档目录挂载失败 + +1. 确认目录存在: + ```bash + ls -la ./docs + ``` + +2. 检查权限: + ```bash + # Linux/Mac 可能需要授权 + chmod 755 ./docs + ``` + +3. 使用绝对路径尝试 + +### PDF 导出失败 + +1. 检查容器日志: + ```bash + docker-compose logs -f + ``` + +2. 验证 Chromium 安装: + ```bash + docker exec vitepress-docker which chromium + ``` + +3. 检查文档目录权限: + ```bash + docker exec vitepress-docker ls -la /app/docs + ``` + +4. 确认 VitePress 服务正常运行: + ```bash + curl http://localhost:3000 + ``` + +### 服务无法访问 + +1. 检查容器状态: + ```bash + docker ps | grep vitepress + ``` + +2. 检查防火墙设置: + ```bash + # Windows + netsh advfirewall firewall show rule name="Docker VitePress" + ``` + +3. 尝试重启服务: + ```bash + docker-compose restart + ``` + +## 技术栈 + +- **基础镜像**: Node.js 25 +- **Web 服务器**: Express.js +- **文档框架**: VitePress +- **PDF 导出**: vitepress-export-pdf +- **浏览器引擎**: Chromium (Puppeteer) +- **容器化**: Docker + Docker Compose + diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..773a826 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,32 @@ +services: + vitepress: + build: + context: . + dockerfile: docker/Dockerfile + image: xeden3/vitepress-docker:latest + container_name: vitepress-docker + ports: + - "${VITEPRESS_PORT:-3000}:${VITEPRESS_PORT:-3000}" + - "${API_PORT:-3001}:${API_PORT:-3001}" + environment: + - NODE_ENV=production + - VITEPRESS_PORT=${VITEPRESS_PORT:-3000} + - API_PORT=${API_PORT:-3001} + - DOCS_PATH=/app/docs + - PUPPETEER_EXECUTABLE_PATH=/usr/bin/chromium + - PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true + volumes: + - ${DOCS_DIR:-./docs}:/app/docs + restart: unless-stopped + healthcheck: + test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost:${API_PORT:-3001}/health"] + interval: 30s + timeout: 10s + retries: 3 + start_period: 40s + networks: + - vitepress-network + +networks: + vitepress-network: + driver: bridge diff --git a/docker/API.md b/docker/API.md new file mode 100644 index 0000000..f71d248 --- /dev/null +++ b/docker/API.md @@ -0,0 +1,420 @@ +# VitePress API Documentation + +## 概述 + +VitePress Docker 服务提供了一套完整的 RESTful API,用于管理文档系统和 PDF 导出功能。 + +## 服务地址 + +- **API 服务**: `http://localhost:3001` +- **VitePress 文档**: `http://localhost:3000` + +## API 端点概览 + +| 方法 | 端点 | 描述 | +|------|------|------| +| GET | `/health` | 健康检查 | +| GET | `/export-pdf` | 导出 PDF | +| GET | `/pdf-files` | 列出所有 PDF 文件 | + +--- + +## API 端点详情 + +### 1. 健康检查 + +**端点**: `GET /health` + +检查 API 服务和 VitePress 服务是否正常运行。 + +**响应示例**: +```json +{ + "status": "ok", + "timestamp": "2026-04-11T12:00:00.000Z", + "services": { + "api": "running", + "vitepress": "running" + } +} +``` + +**状态码**: +- `200 OK`: 服务正常运行 + +**curl 示例**: +```bash +curl http://localhost:3001/health +``` + +--- + +### 2. 导出 PDF + +**端点**: `GET /export-pdf` + +启动 PDF 导出流程,将当前 VitePress 文档导出为 PDF 文件。 + +**请求参数**: + +| 参数 | 类型 | 必需 | 默认值 | 说明 | +|------|------|------|--------|------| +| `fileName` | string | 否 | `export-{timestamp}.pdf` | 导出文件名 | + +**示例请求**: + +```bash +# 使用默认文件名 +curl "http://localhost:3001/export-pdf" + +# 指定文件名 +curl "http://localhost:3001/export-pdf?fileName=HF-MES-Manual.pdf" +``` + +**成功响应**: +```json +{ + "success": true, + "message": "PDF exported successfully", + "pdfPath": "/app/docs/HF-MES-Manual.pdf", + "pdfUrl": "HF-MES-Manual.pdf", + "fileName": "HF-MES-Manual.pdf", + "fileSize": 1234567, + "fileSizeMB": "1.18" +} +``` + +**错误响应**: +```json +{ + "success": false, + "error": "PDF file was not created", + "stack": "Error: PDF file was not created..." +} +``` + +**状态码**: +- `200 OK`: PDF 导出成功 +- `500 Internal Server Error`: 导出失败 + +**工作流程**: + +1. 清理旧的 `.vitepress/dist` 目录 +2. 检查 VitePress 开发服务器是否运行 +3. 执行 `npm run export-pdf` 命令 +4. 查找生成的 PDF 文件 +5. 返回 PDF 文件信息 + +**注意事项**: + +- PDF 文件会保存到配置的 `DOCS_DIR` 目录下 +- 如果 VitePress 服务未运行,导出会失败 +- 首次导出可能需要较长时间 + +--- + +### 3. 列出 PDF 文件 + +**端点**: `GET /pdf-files` + +列出 `DOCS_DIR` 目录下所有已导出的 PDF 文件。 + +**响应示例**: +```json +{ + "count": 2, + "files": [ + { + "name": "HF-MES-Manual.pdf", + "size": 1234567, + "sizeMB": "1.18", + "created": "2026-04-11T12:00:00.000Z", + "modified": "2026-04-11T12:00:00.000Z" + }, + { + "name": "export-123456.pdf", + "size": 2345678, + "sizeMB": "2.24", + "created": "2026-04-11T11:00:00.000Z", + "modified": "2026-04-11T11:00:00.000Z" + } + ] +} +``` + +**文件信息字段**: + +| 字段 | 类型 | 说明 | +|------|------|------| +| `name` | string | 文件名 | +| `size` | number | 文件大小(字节) | +| `sizeMB` | string | 文件大小(MB,保留两位小数) | +| `created` | string | 文件创建时间(ISO 8601) | +| `modified` | string | 文件最后修改时间(ISO 8601) | + +**状态码**: +- `200 OK`: 成功获取文件列表 +- `500 Internal Server Error`: 读取目录失败 + +**curl 示例**: +```bash +curl http://localhost:3001/pdf-files +``` + +--- + +## 使用示例 + +### 完整的 PDF 导出流程 + +```bash +# 1. 检查服务状态 +curl http://localhost:3001/health + +# 2. 导出 PDF(指定文件名) +curl "http://localhost:3001/export-pdf?fileName=My-Document.pdf" + +# 3. 查看导出的文件 +curl http://localhost:3001/pdf-files + +# 4. 在浏览器中访问 +# http://localhost:3000/My-Document.pdf +``` + +### 使用 JavaScript 调用 + +```javascript +// 检查服务状态 +async function checkHealth() { + const response = await fetch('http://localhost:3001/health'); + const data = await response.json(); + console.log('Service Status:', data); +} + +// 导出 PDF +async function exportPDF(fileName = null) { + const url = fileName + ? `http://localhost:3001/export-pdf?fileName=${fileName}` + : 'http://localhost:3001/export-pdf'; + + const response = await fetch(url); + const data = await response.json(); + + if (data.success) { + console.log('PDF exported:', data.fileName); + console.log('File size:', data.fileSizeMB, 'MB'); + } else { + console.error('Export failed:', data.error); + } +} + +// 获取 PDF 列表 +async function listPDFs() { + const response = await fetch('http://localhost:3001/pdf-files'); + const data = await response.json(); + + console.log(`Found ${data.count} PDF files:`); + data.files.forEach(file => { + console.log(` - ${file.name} (${file.sizeMB} MB)`); + }); +} +``` + +### 使用 Python 调用 + +```python +import requests + +# 检查服务状态 +def check_health(): + response = requests.get('http://localhost:3001/health') + print(response.json()) + +# 导出 PDF +def export_pdf(file_name=None): + url = 'http://localhost:3001/export-pdf' + if file_name: + url += f'?fileName={file_name}' + + response = requests.get(url) + data = response.json() + + if data['success']: + print(f"PDF exported: {data['fileName']}") + print(f"File size: {data['fileSizeMB']} MB") + else: + print(f"Export failed: {data['error']}") + +# 列出 PDF 文件 +def list_pdfs(): + response = requests.get('http://localhost:3001/pdf-files') + data = response.json() + + print(f"Found {data['count']} PDF files:") + for file in data['files']: + print(f" - {file['name']} ({file['sizeMB']} MB)") +``` + +--- + +## 错误处理 + +### 常见错误 + +| 错误信息 | 可能原因 | 解决方案 | +|----------|----------|----------| +| `PDF file was not created` | VitePress 服务未运行 | 确认 http://localhost:3000 可访问 | +| `Export command failed` | PDF 导出命令执行失败 | 检查容器日志 | +| `ENOENT: no such file or directory` | 文档目录不存在 | 确认 DOCS_DIR 配置正确 | + +### 错误响应格式 + +所有错误响应都遵循以下格式: + +```json +{ + "success": false, + "error": "错误描述信息", + "stack": "错误堆栈信息(仅在开发环境显示)" +} +``` + +--- + +## 配置说明 + +### 环境变量 + +| 变量名 | 默认值 | 说明 | +|--------|--------|------| +| `API_PORT` | 3001 | API 服务端口 | +| `DOCS_PATH` | /app/docs | 容器内文档目录路径 | +| `VITEPRESS_PORT` | 3000 | VitePress 服务端口 | +| `NODE_ENV` | production | Node.js 运行环境 | + +### Docker Compose 配置 + +```yaml +services: + vitepress: + environment: + - API_PORT=3001 + - DOCS_PATH=/app/docs + - VITEPRESS_PORT=3000 + - NODE_ENV=production + ports: + - "3001:3001" + volumes: + - ${DOCS_DIR:-./docs}:/app/docs +``` + +--- + +## 注意事项 + +1. **PDF 文件位置**: 导出的 PDF 文件保存在配置的 `DOCS_DIR` 目录下,可直接在浏览器中通过 VitePress 服务访问 + +2. **VitePress 服务依赖**: PDF 导出功能依赖 VitePress 开发服务器运行,请确保 http://localhost:3000 可访问 + +3. **导出超时**: PDF 导出命令超时时间设置为 3 分钟,大型文档可能需要更长的时间 + +4. **并发限制**: 不建议同时发起多个 PDF 导出请求 + +5. **CORS 支持**: API 服务已启用 CORS,允许来自任何源的请求 + +6. **文件覆盖**: 如果指定文件名已存在,导出时会被覆盖 + +--- + +## 技术实现 + +### API 服务架构 + +``` +Express.js Server (端口 3001) +├── /health → 直接返回状态 +├── /export-pdf → 执行 export-pdf 脚本 +└── /pdf-files → 读取 DOCS_DIR 目录 +``` + +### PDF 导出流程 + +``` +1. Client Request + ↓ +2. Clean .vitepress/dist + ↓ +3. Check VitePress Server + ↓ +4. Execute npm run export-pdf + ↓ +5. Find Generated PDF + ↓ +6. Return Response +``` + +### 依赖项 + +- **express**: Web 框架 +- **cors**: 跨域资源共享 +- **fs-extra**: 文件系统操作 +- **vitepress-export-pdf**: PDF 导出插件 + +--- + +## 故障排除 + +### 服务无法访问 + +1. 检查容器状态: + ```bash + docker ps | grep vitepress + ``` + +2. 检查端口占用: + ```bash + netstat -ano | findstr 3001 + ``` + +3. 查看日志: + ```bash + docker-compose logs -f vitepress + ``` + +### PDF 导出失败 + +1. 确认 VitePress 服务运行: + ```bash + curl http://localhost:3000 + ``` + +2. 检查容器日志: + ```bash + docker-compose logs -f + ``` + +3. 验证文档目录挂载: + ```bash + docker exec vitepress-docker ls -la /app/docs + ``` + +4. 检查权限: + ```bash + docker exec vitepress-docker whoami + ``` + +### 文件列表为空 + +1. 确认 PDF 文件存在: + ```bash + ls -la ./docs/*.pdf + ``` + +2. 检查 DOCS_DIR 配置: + ```bash + cat .env | grep DOCS_DIR + ``` + +--- + +如有问题,请查看容器日志或联系技术支持。 diff --git a/docker/Dockerfile b/docker/Dockerfile new file mode 100644 index 0000000..dd8e5f7 --- /dev/null +++ b/docker/Dockerfile @@ -0,0 +1,97 @@ +# VitePress Docker Image +FROM node:25 + +LABEL maintainer="xeden3" +LABEL description="VitePress Documentation with PDF Export Support" + +# Install Chrome dependencies for PDF export (Debian) +RUN apt-get update && apt-get install -y \ + chromium \ + chromium-driver \ + tzdata \ + fonts-liberation \ + libnss3 \ + libatk-bridge2.0-0 \ + libxcomposite1 \ + libxdamage1 \ + libxrandr2 \ + libgbm1 \ + libasound2 \ + libpangocairo-1.0-0 \ + libgtk-3-0 \ + libxss1 \ + libglib2.0-0 \ + libxkbcommon0 \ + libdrm2 \ + libcups2 \ + libdbus-1-3 \ + # 中文字体支持(开源字体,Docker环境默认使用) + fonts-wqy-microhei \ + fonts-wqy-zenhei \ + xfonts-intl-chinese \ + fonts-noto-cjk \ + # 俄语字体支持(DejaVu 字体包含 Cyrillic 字符) + fonts-dejavu-core \ + # 字体缓存工具 + fontconfig \ + && fc-cache -fv \ + && rm -rf /var/lib/apt/lists/* + +# 提示:如果需要使用微软雅黑字体,可以从 Windows 系统复制字体文件到容器 +# Windows 字体目录:C:\Windows\Fonts\msyh.ttc (微软雅黑) +# 将字体复制到容器:docker cp msyh.ttc :/usr/share/fonts/truetype/ +# 然后运行:fc-cache -fv + +# Set environment variables +ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true \ + PUPPETEER_EXECUTABLE_PATH=/usr/bin/chromium \ + NODE_ENV=development \ + CHROME_BIN=/usr/bin/chromium + +WORKDIR /app + +# Copy package files for main app +COPY package*.json ./ + +# Install main dependencies (vitepress, etc.) +RUN export NODE_ENV=development && \ + rm -rf node_modules package-lock.json && \ + npm install && \ + npm install vitepress-export-pdf -D && \ + npm install vitepress-plugin-mermaid mermaid && \ + npm install medium-zoom markdown-it-mathjax3 + +# Copy API service +COPY docker/api/package*.json ./api/ +WORKDIR /app/api + +# Install API dependencies +RUN npm install + +# Go back to app directory +WORKDIR /app + +# Copy API service files +COPY docker/api/ ./api/ + +# Copy entry point script +COPY docker/docker-entrypoint.sh /docker-entrypoint.sh +RUN chmod +x /docker-entrypoint.sh + +# Create log directory +RUN mkdir -p /var/log + +# Create working directory for docs +WORKDIR /app + +# Expose ports +EXPOSE ${VITEPRESS_PORT:-3000} ${API_PORT:-3001} + +# Volume for docs and PDF output +VOLUME ["/app/docs"] + +WORKDIR /app + +# Entry point +ENTRYPOINT ["/docker-entrypoint.sh"] +CMD [] diff --git a/docker/api/package.json b/docker/api/package.json new file mode 100644 index 0000000..a96ed09 --- /dev/null +++ b/docker/api/package.json @@ -0,0 +1,16 @@ +{ + "name": "vitepress-pdf-api", + "version": "1.0.0", + "description": "API service for VitePress PDF export", + "main": "server.js", + "type": "module", + "scripts": { + "start": "node server.js" + }, + "dependencies": { + "express": "^4.18.2", + "cors": "^2.8.5", + "child_process": "^1.0.2", + "fs-extra": "^11.1.1" + } +} diff --git a/docker/api/server.js b/docker/api/server.js new file mode 100644 index 0000000..61cf31a --- /dev/null +++ b/docker/api/server.js @@ -0,0 +1,220 @@ +import express from 'express'; +import cors from 'cors'; +import { exec } from 'child_process'; +import { promisify } from 'util'; +import fs from 'fs-extra'; +import path from 'path'; +import { fileURLToPath } from 'url'; + +const execAsync = promisify(exec); +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); + +const app = express(); +const PORT = process.env.API_PORT || 3001; + +// Enable CORS for all origins +app.use(cors({ + origin: '*', + methods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'], + allowedHeaders: ['Content-Type', 'Authorization'] +})); + +app.use(express.json()); + +// Logging middleware +app.use((req, res, next) => { + console.log(`[${new Date().toISOString()}] ${req.method} ${req.url}`); + next(); +}); + +// Health check endpoint +app.get('/health', (req, res) => { + res.json({ + status: 'ok', + timestamp: new Date().toISOString(), + services: { + api: 'running', + vitepress: 'running' + } + }); +}); + +// Export PDF endpoint +app.get('/export-pdf', async (req, res) => { + const docsPath = process.env.DOCS_PATH || '/app/docs'; + const pdfFileName = req.query.fileName || `export-${Date.now()}.pdf`; + const vitepressPort = process.env.VITEPRESS_PORT || 3000; + + console.log(`[${new Date().toISOString()}] Starting PDF export...`); + console.log(`Docs path: ${docsPath}`); + console.log(`PDF output: ${path.join(docsPath, pdfFileName)}`); + console.log(`VitePress port: ${vitepressPort}`); + + try { + // Ensure PDF directory exists + await fs.ensureDir(docsPath); + + // Clean old dist directory + const distDir = path.join(docsPath, '.vitepress', 'dist'); + console.log('Cleaning old dist directory...'); + await fs.remove(distDir).catch(() => {}); + + // Build the VitePress site + /* + console.log('Building VitePress site...'); + try { + await execAsync('npm run docs:build', { + cwd: '/app', + stdio: 'inherit', + timeout: 120000 // 2 minutes timeout + }); + } catch (buildError) { + console.error('Build warning/error:', buildError.message); + // Continue anyway, sometimes there are non-fatal warnings + } + */ + + // Run PDF export (VitePress preview is already running) + console.log('Starting PDF export using running VitePress server...'); + + const exportEnv = { + ...process.env, + NODE_ENV: 'development' + }; + + try { + /* + console.log('Installing vitepress-export-pdf...'); + await execAsync('npm install vitepress-export-pdf -D', { + cwd: '/app', + stdio: 'inherit', + env: exportEnv, + timeout: 120000 + }); + */ + + console.log('Running export-pdf...'); + await execAsync('npm run export-pdf', { + cwd: '/app', + stdio: 'inherit', + env: exportEnv, + timeout: 180000, + maxBuffer: 1024 * 1024 * 100 + }); + } catch (exportError) { + console.error('Export command failed:', exportError.message); + throw new Error(`PDF export failed: ${exportError.message}`); + } + + // Verify PDF was created + const pdfPath = path.join(docsPath, pdfFileName); + const pdfExists = await fs.pathExists(pdfPath); + + if (!pdfExists) { + // Try to find any PDF file in the directory + const files = await fs.readdir(docsPath); + const pdfFiles = files.filter(f => f.endsWith('.pdf')); + + if (pdfFiles.length > 0) { + console.log(`PDF found with different name: ${pdfFiles[0]}`); + const stats = await fs.stat(path.join(docsPath, pdfFiles[0])); + + console.log(`[${new Date().toISOString()}] PDF export completed successfully!`); + console.log(`PDF size: ${(stats.size / 1024 / 1024).toFixed(2)} MB`); + + return res.json({ + success: true, + message: 'PDF exported successfully', + pdfPath: path.join(docsPath, pdfFiles[0]), + pdfUrl: `${pdfFiles[0]}`, + fileName: pdfFiles[0], + fileSize: stats.size, + fileSizeMB: (stats.size / 1024 / 1024).toFixed(2) + }); + } else { + throw new Error('PDF file was not created'); + } + } + + const stats = await fs.stat(pdfPath); + + console.log(`[${new Date().toISOString()}] PDF export completed successfully!`); + console.log(`PDF path: ${pdfPath}`); + console.log(`PDF size: ${(stats.size / 1024 / 1024).toFixed(2)} MB`); + + res.json({ + success: true, + message: 'PDF exported successfully', + pdfPath: pdfPath, + pdfUrl: `${pdfFileName}`, + fileName: pdfFileName, + fileSize: stats.size, + fileSizeMB: (stats.size / 1024 / 1024).toFixed(2) + }); + + } catch (error) { + console.error(`[${new Date().toISOString()}] PDF export failed:`, error); + + res.status(500).json({ + success: false, + error: error.message, + stack: process.env.NODE_ENV === 'development' ? error.stack : undefined + }); + } +}); + +// List all PDF files +app.get('/pdf-files', async (req, res) => { + const docsPath = process.env.DOCS_PATH || '/app/docs'; + + try { + await fs.ensureDir(docsPath); + const files = await fs.readdir(docsPath); + const pdfFiles = files.filter(f => f.endsWith('.pdf')); + + const fileDetails = await Promise.all( + pdfFiles.map(async (file) => { + const stats = await fs.stat(path.join(docsPath, file)); + return { + name: file, + size: stats.size, + sizeMB: (stats.size / 1024 / 1024).toFixed(2), + created: stats.birthtime, + modified: stats.mtime + }; + }) + ); + + res.json({ + count: pdfFiles.length, + files: fileDetails + }); + } catch (error) { + res.status(500).json({ error: error.message }); + } +}); + +// Error handling middleware +app.use((err, req, res, next) => { + console.error(`[${new Date().toISOString()}] Error:`, err); + res.status(500).json({ + error: err.message || 'Internal server error', + stack: process.env.NODE_ENV === 'development' ? err.stack : undefined + }); +}); + +app.listen(PORT, '0.0.0.0', () => { + console.log(`========================================`); + console.log(`VitePress API Server`); + console.log(`========================================`); + console.log(`API Server running on port: ${PORT}`); + console.log(`VitePress Server: http://localhost:${process.env.VITEPRESS_PORT || 3000}`); + console.log(`PDF output directory: ${process.env.DOCS_PATH || '/app/docs'}`); + console.log(`========================================`); + console.log(`Available API endpoints:`); + console.log(` GET /health - Health check`); + console.log(` GET /export-pdf - Export PDF`); + console.log(` GET /pdf-files - List all PDF files`); + console.log(`========================================`); +}); diff --git a/docker/docker-entrypoint.sh b/docker/docker-entrypoint.sh new file mode 100644 index 0000000..9023c05 --- /dev/null +++ b/docker/docker-entrypoint.sh @@ -0,0 +1,84 @@ +#!/bin/sh +set -e + +echo "========================================" +echo "VitePress Container" +echo "========================================" + +# Set default values +export DOCS_PATH=${DOCS_PATH:-/app/docs} +export VITEPRESS_PORT=${VITEPRESS_PORT:-3000} +export API_PORT=${API_PORT:-3001} + +echo "Configuration:" +echo " DOCS_PATH: $DOCS_PATH" +echo " VITEPRESS_PORT: $VITEPRESS_PORT" +echo " API_PORT: $API_PORT" +echo "========================================" + +# Check if docs directory exists +if [ ! -d "$DOCS_PATH" ]; then + echo "Creating docs directory: $DOCS_PATH" + mkdir -p "$DOCS_PATH" +fi + +# Check if package.json exists +if [ ! -f "/app/package.json" ]; then + echo "Error: /app/package.json not found!" + exit 1 +fi + +# Install API dependencies if needed +if [ ! -f "/app/api/node_modules/.package-lock.json" ]; then + echo "Installing API dependencies..." + cd /app/api && npm install +fi + +echo "" +echo "========================================" +echo "Starting VitePress Documentation Server..." +echo "========================================" + +# Start VitePress dev server in background (运行在 docs 目录下) +echo "[1/2] Starting VitePress dev server on port $VITEPRESS_PORT..." +cd /app +export NODE_ENV=development +nohup npm run docs:dev -- --port $VITEPRESS_PORT --host > /var/log/vitepress.log 2>&1 & +VITEPRESS_PID=$! +echo "VitePress started with PID: $VITEPRESS_PID" +# export NODE_ENV=development +# npm run docs:dev -- --port $VITEPRESS_PORT --host + + +# Wait for VitePress to start +echo "Waiting for VitePress to start..." +sleep 10 + +# Check if VitePress is running +if ! kill -0 $VITEPRESS_PID 2>/dev/null; then + echo "Warning: VitePress server may not have started properly" + echo "Check logs: cat /var/log/vitepress.log" +fi + +echo "[2/2] Starting API server on port $API_PORT..." +echo "" + +echo "========================================" +echo "All services started successfully!" +echo "========================================" +echo "" +echo "Services:" +echo " - VitePress Documentation: http://localhost:$VITEPRESS_PORT" +echo " - API Server: http://localhost:$API_PORT" +echo "" +echo "API Endpoints:" +echo " GET /health - Health check" +echo " GET /export-pdf - Export PDF" +echo "Logs:" +echo " VitePress: cat /var/log/vitepress.log" +echo " API Server: docker logs vitepress-docker" +echo "" +echo "========================================" + +# Execute the API server with absolute path +exec node /app/api/server.js diff --git a/docs/.vitepress/config.mjs b/docs/.vitepress/config.mjs new file mode 100644 index 0000000..eaf12cc --- /dev/null +++ b/docs/.vitepress/config.mjs @@ -0,0 +1,219 @@ +import { defineConfig } from 'vitepress' +import { withMermaid } from 'vitepress-plugin-mermaid' +import mathjax3 from 'markdown-it-mathjax3' + +export default withMermaid( + defineConfig({ + title: 'HF-MES v5.0 使用手册', + description: 'HF-MES v5.0 制造执行系统完整使用指南', + lang: 'zh-CN', + themeConfig: { + logo: '/logo.svg', + siteTitle: 'HF-MES v5.0 使用手册', + + nav: [ + { text: '首页', link: '/' }, + { + text: '文档说明', + items: [ + { text: '文档说明', link: '/guide/document-guide' }, + { text: '系统概述', link: '/guide/system-overview' } + ] + }, + { + text: '快速入门', + items: [ + { text: '快速入门', link: '/getting-started/quick-start' } + ] + }, + { + text: '基础配置', + items: [ + { text: '基础数据管理', link: '/basic/data-management' }, + { text: '设备管理', link: '/basic/equipment' } + ] + }, + { + text: '业务模块', + items: [ + { text: '生产管理', link: '/business/production' }, + { text: '质量管理', link: '/business/quality' }, + { text: '仓储物流', link: '/business/warehouse' }, + { text: '设备仓储', link: '/business/equipment-warehouse' } + ] + }, + { + text: '数据集成', + items: [ + { text: '数据与集成', link: '/integration/data-integration' } + ] + }, + { + text: '报表分析', + items: [ + { text: '报表与分析', link: '/analysis/reports' } + ] + }, + { + text: '系统运维', + items: [ + { text: '系统运维', link: '/operation/system-operation' }, + { text: '技术支持', link: '/operation/technical-support' } + ] + }, + { + text: '附录', + items: [ + { text: '术语表', link: '/appendix/glossary' } + ] + } + ], + + sidebar: { + '/guide/': [ + { + text: '文档管理篇', + items: [ + { text: '文档说明', link: '/guide/document-guide' } + ] + }, + { + text: '系统认知篇', + items: [ + { text: '系统概述', link: '/guide/system-overview' } + ] + } + ], + '/getting-started/': [ + { + text: '快速入门篇', + items: [ + { text: '快速入门', link: '/getting-started/quick-start' } + ] + } + ], + '/basic/': [ + { + text: '基础配置篇', + items: [ + { text: '基础数据管理', link: '/basic/data-management' }, + { text: '设备基础信息', link: '/basic/equipment' } + ] + } + ], + '/business/': [ + { + text: '生产管理篇', + items: [ + { text: '生产管理', link: '/business/production' } + ] + }, + { + text: '质量管理篇', + items: [ + { text: '质量与追溯', link: '/business/quality' } + ] + }, + { + text: '仓储物流篇', + items: [ + { text: '设备与仓储', link: '/business/equipment-warehouse' } + ] + } + ], + '/integration/': [ + { + text: '数据集成篇', + items: [ + { text: '数据与集成', link: '/integration/data-integration' } + ] + } + ], + '/analysis/': [ + { + text: '报表分析篇', + items: [ + { text: '报表与分析', link: '/analysis/reports' } + ] + } + ], + '/operation/': [ + { + text: '系统运维篇', + items: [ + { text: '系统运维', link: '/operation/system-operation' } + ] + }, + { + text: '技术支持篇', + items: [ + { text: '异常处理与技术支持', link: '/operation/technical-support' } + ] + } + ], + '/appendix/': [ + { + text: '附录篇', + items: [ + { text: '术语表', link: '/appendix/glossary' } + ] + } + ] + }, + + socialLinks: [ + { icon: 'github', link: 'https://github.com/vuejs/vitepress' } + ], + + footer: { + message: 'HF-MES v5.0 使用手册', + copyright: 'Copyright © 2026 All Rights Reserved' + }, + + search: { + provider: 'local' + }, + + editLink: { + pattern: 'https://github.com/vuejs/vitepress/edit/main/docs/:path', + text: '在 GitHub 上编辑此页' + }, + + lastUpdated: { + text: '最后更新于', + formatOptions: { + dateStyle: 'short', + timeStyle: 'short' + } + }, + + outline: { + level: [2, 3], + label: '目录' + }, + + docFooter: { + prev: '← 上一页', + next: '下一页 →' + } + }, + + markdown: { + theme: { + light: 'github-light', + dark: 'github-dark' + }, + lineNumbers: false, + config(md) { + md.use(mathjax3) + } + }, + + head: [ + ['link', { rel: 'icon', href: '/favicon.ico' }], + ['meta', { name: 'author', content: 'HF-MES' }], + ['meta', { name: 'viewport', content: 'width=device-width, initial-scale=1.0' }] + ] + }) + +) \ No newline at end of file diff --git a/docs/.vitepress/public/logo.svg b/docs/.vitepress/public/logo.svg new file mode 100644 index 0000000..af337a3 --- /dev/null +++ b/docs/.vitepress/public/logo.svg @@ -0,0 +1,11 @@ + + + + + + + + + MES + v5.0 + diff --git a/docs/.vitepress/theme/index.ts b/docs/.vitepress/theme/index.ts new file mode 100644 index 0000000..71111a0 --- /dev/null +++ b/docs/.vitepress/theme/index.ts @@ -0,0 +1,13 @@ +import DefaultTheme from 'vitepress/theme' +import mediumZoom from 'medium-zoom' +import { onMounted } from 'vue' +import './style/print.css' + +export default { + ...DefaultTheme, + setup() { + onMounted(() => { + mediumZoom('.main img') + }) + } +} diff --git a/docs/.vitepress/theme/style/print.css b/docs/.vitepress/theme/style/print.css new file mode 100644 index 0000000..42331a2 --- /dev/null +++ b/docs/.vitepress/theme/style/print.css @@ -0,0 +1,101 @@ +@media print { + .VPNav, + .VPNavBar, + .VPLocalNav, + .VPDocFooter, + .VPDocAside, + .VPLink, + .cur, + .next-link, + .prev-link, + .edit-link-button, + .pager, + .vp-doc-footer, + .table-of-contents { + display: none !important; + } + + body { + font-size: 12pt; + line-height: 1.6; + color: #333; + font-family: "Microsoft YaHei", "微软雅黑", "Microsoft YaHei UI", "PingFang SC", "Hiragino Sans GB", "Noto Sans CJK SC", "Source Han Sans CN", "WenQuanYi Micro Hei", "Heiti SC", sans-serif; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + } + + h1 { + font-size: 24pt; + page-break-after: avoid; + margin-bottom: 20pt; + font-family: "Microsoft YaHei", "微软雅黑", "Microsoft YaHei UI", "PingFang SC", "Hiragino Sans GB", "Noto Sans CJK SC", "Source Han Sans CN", "WenQuanYi Micro Hei", "Heiti SC", sans-serif; + } + + h2 { + font-size: 18pt; + page-break-after: avoid; + margin-top: 20pt; + margin-bottom: 10pt; + font-family: "Microsoft YaHei", "微软雅黑", "Microsoft YaHei UI", "PingFang SC", "Hiragino Sans GB", "Noto Sans CJK SC", "Source Han Sans CN", "WenQuanYi Micro Hei", "Heiti SC", sans-serif; + } + + h3 { + font-size: 14pt; + page-break-after: avoid; + margin-top: 15pt; + margin-bottom: 8pt; + font-family: "Microsoft YaHei", "微软雅黑", "Microsoft YaHei UI", "PingFang SC", "Hiragino Sans GB", "Noto Sans CJK SC", "Source Han Sans CN", "WenQuanYi Micro Hei", "Heiti SC", sans-serif; + } + + p, li, td, th { + font-family: "Microsoft YaHei", "微软雅黑", "Microsoft YaHei UI", "PingFang SC", "Hiragino Sans GB", "Noto Sans CJK SC", "Source Han Sans CN", "WenQuanYi Micro Hei", "Heiti SC", sans-serif; + } + + table { + font-size: 10pt; + page-break-inside: avoid; + font-family: "Microsoft YaHei", "微软雅黑", "Microsoft YaHei UI", "PingFang SC", "Hiragino Sans GB", "Noto Sans CJK SC", "Source Han Sans CN", "WenQuanYi Micro Hei", "Heiti SC", sans-serif; + } + + img { + max-width: 100%; + page-break-inside: avoid; + } + + pre { + page-break-inside: avoid; + } + + .vp-doc div[class*="language-"] { + background: #f6f8fa; + border: 1px solid #e1e4e8; + border-radius: 6px; + padding: 16px; + overflow-x: auto; + page-break-inside: avoid; + } + + .vp-doc div[class*="language-"] code { + font-family: Consolas, Monaco, 'Andale Mono', monospace; + font-size: 9pt; + line-height: 1.45; + } + + a { + color: #0366d6; + text-decoration: none; + } + + .vp-doc h1, + .vp-doc h2, + .vp-doc h3 { + border-bottom: 1px solid #eaecef; + padding-bottom: 0.3em; + } + + * { + -webkit-print-color-adjust: exact !important; + print-color-adjust: exact !important; + color-adjust: exact !important; + } +} diff --git a/docs/.vitepress/vitepress-pdf.config.ts b/docs/.vitepress/vitepress-pdf.config.ts new file mode 100644 index 0000000..124567c --- /dev/null +++ b/docs/.vitepress/vitepress-pdf.config.ts @@ -0,0 +1,94 @@ +import { defineUserConfig } from 'vitepress-export-pdf' +import userConfig from './config.mjs' + +function extractLinksFromConfig(config: DefaultTheme.Config) { + const links: string[] = [] + + function extractLinks(sidebar: DefaultTheme.SidebarItem[]) { + for (const item of sidebar) { + if (item.items) + extractLinks(item.items) + + else if (item.link) + links.push(`${item.link}.html`) + } + } + + for (const key in config.sidebar) + extractLinks(config.sidebar[key]) + + return links +} + +const links = extractLinksFromConfig(userConfig.themeConfig!) + + +export default defineUserConfig({ + sorter: (pageA, pageB) => { + const routeOrder = [ + '/index.html', + ...links, + ] + + const aIndex = routeOrder.findIndex(route => route === pageA.path) + const bIndex = routeOrder.findIndex(route => route === pageB.path) + + if (aIndex === -1 && bIndex === -1) { + return pageA.path.localeCompare(pageB.path) + } + if (aIndex === -1) return 1 + if (bIndex === -1) return -1 + + return aIndex - bIndex + }, + outFile: 'HF-MES-v5.0-使用手册.pdf', + outDir: 'docs', + routePatterns: ['/**'], + pdfOptions: { + format: 'A4', + margin: { + top: '20mm', + right: '15mm', + bottom: '20mm', + left: '15mm' + }, + printBackground: true, + preferCSSPageSize: true, + displayHeaderFooter: true, + headerTemplate: ` +
+ +
+ `, + footerTemplate: ` +
+ HF-MES v5.0 使用手册 + / +
+ ` + }, + pdfOutlines: true, + puppeteerLaunchOptions: { + headless: true, + timeout: 60000, + args: [ + '--no-sandbox', + '--disable-setuid-sandbox', + '--disable-dev-shm-usage', + '--disable-gpu', + '--disable-software-rasterizer', + '--no-first-run', + '--no-zygote', + '--single-process', + '--font-render-hinting=none', + '--disable-font-subpixel-positioning', + '--force-color-profile=srgb', + ], + env: { + FC_LANG: 'zh-CN', + LANG: 'zh_CN.UTF-8', + LC_ALL: 'zh_CN.UTF-8', + }, + dumpio: false, + } +}) diff --git a/docs/analysis/reports.md b/docs/analysis/reports.md new file mode 100644 index 0000000..498937b --- /dev/null +++ b/docs/analysis/reports.md @@ -0,0 +1,380 @@ +# 报表与分析 + +## 1. 功能概述 + +报表与分析模块提供丰富的统计分析报表,帮助企业洞察生产运营情况,辅助管理层决策。 + +**核心功能:** + +| 功能 | 说明 | +|------|------| +| 生产报表 | 生产数据统计分析 | +| 质量报表 | 质量数据统计分析 | +| 设备报表 | 设备运行数据分析 | +| 库存报表 | 库存数据分析 | +| 报表定制 | 自定义报表开发 | +| 报表订阅 | 报表自动推送 | + +## 2. 生产报表 + +### 2.1 生产日报 + +**报表内容:** + +| 统计项 | 说明 | +|--------|------| +| 日期 | 统计日期 | +| 产线 | 产线名称 | +| 计划产量 | 当日计划生产数量 | +| 实际产量 | 当日实际生产数量 | +| 达成率 | 实际/计划×100% | +| 合格数量 | 合格品数量 | +| 合格率 | 合格/实际×100% | +| 不良数量 | 不良品数量 | +| 不良率 | 不良/实际×100% | +| 在制数量 | 当日在制品数量 | + +**报表展示示例:** + +``` +┌─────────────────────────────────────────────────────────────┐ +│ 生产日报 - 2026-04-10 │ +├─────────────────────────────────────────────────────────────┤ +│ │ +│ SMT-A线 │ +│ ┌──────────┬──────────┬──────────┬──────────┬──────────┐ │ +│ │ 计划产量 │ 实际产量 │ 达成率 │ 合格率 │ 不良率 │ │ +│ │ 10000 │ 9520 │ 95.2% │ 98.5% │ 1.5% │ │ +│ └──────────┴──────────┴──────────┴──────────┴──────────┘ │ +│ │ +│ SMT-B线 │ +│ ┌──────────┬──────────┬──────────┬──────────┬──────────┐ │ +│ │ 8000 │ 7600 │ 95.0% │ 98.2% │ 1.8% │ │ +│ └──────────┴──────────┴──────────┴──────────┴──────────┘ │ +│ │ +└─────────────────────────────────────────────────────────────┘ +``` + +### 2.2 生产月报 + +**报表内容:** + +| 统计项 | 说明 | +|--------|------| +| 月份 | 统计月份 | +| 部门 | 部门名称 | +| 产品 | 产品名称 | +| 计划产量 | 月度计划数量 | +| 完成产量 | 月度完成数量 | +| 计划达成率 | 完成/计划×100% | +| 人均产量 | 产量/人数 | +| 设备利用率 | 设备运行时间/可用时间 | + +### 2.3 工单统计 + +**统计维度:** + +| 维度 | 说明 | +|------|------| +| 工单数量 | 已完成/进行中/已取消 | +| 工单准时率 | 按时完成工单/总工单 | +| 工单超期率 | 超期工单/总工单 | +| 工单变更率 | 变更工单/总工单 | + +### 2.4 产能分析 + +**分析内容:** + +| 分析项 | 说明 | +|--------|------| +| 产能利用率 | 实际产能/理论产能 | +| 产能瓶颈 | 影响产能的工序/设备 | +| 产能提升空间 | 优化后可提升空间 | +| 产能预测 | 未来产能预测 | + +**产能分析表:** + +| 产线 | 理论产能 | 实际产能 | 利用率 | 瓶颈工序 | +|------|---------|---------|--------|---------| +| SMT-A | 25000 | 21250 | 85.0% | 回流焊接 | +| SMT-B | 20000 | 17000 | 85.0% | AOI检测 | +| 组装-A | 15000 | 12000 | 80.0% | 组装 | + +## 3. 质量报表 + +### 3.1 质量日报 + +**报表内容:** + +| 统计项 | 说明 | +|--------|------| +| 日期 | 统计日期 | +| 检验类型 | IQC/IPQC/FQC | +| 检验批次 | 检验批次数量 | +| 合格批次 | 合格批次数量 | +| 批次合格率 | 合格/总批次×100% | +| 检验数量 | 检验数量 | +| 合格数量 | 合格数量 | +| 单件合格率 | 合格/检验×100% | +| 主要不良 | 主要不良类型 | + +### 3.2 质量月报 + +**报表内容:** + +| 统计项 | 说明 | +|--------|------| +| 月份 | 统计月份 | +| IQC批次合格率 | 来料检验批次合格率 | +| IPQC合格率 | 过程检验合格率 | +| FQC合格率 | 最终检验合格率 | +| 客户投诉数 | 客户质量投诉次数 | +| 质量成本 | 质量损失成本 | +| 质量目标达成 | 实际/目标×100% | + +### 3.3 不良品分析 + +**分析维度:** + +| 分析类型 | 分析内容 | +|---------|---------| +| 不良项目分析 | 各种不良类型占比 | +| 不良工序分析 | 各工序不良分布 | +| 不良时段分析 | 不良发生时段分布 | +| 不良原因分析 | 不良原因占比 | +| 不良趋势分析 | 不良率变化趋势 | + +**不良柏拉图分析:** + +| 不良类型 | 数量 | 占比 | 累计占比 | +|---------|------|------|---------| +| 外观不良 | 150 | 30% | 30% | +| 尺寸不良 | 120 | 24% | 54% | +| 功能不良 | 100 | 20% | 74% | +| 性能不良 | 80 | 16% | 90% | +| 其他不良 | 50 | 10% | 100% | + +### 3.4 质量趋势分析 + +**趋势分析:** + +| 分析项 | 展示方式 | +|--------|---------| +| 合格率趋势 | 折线图 | +| 不良率趋势 | 折线图 | +| 目标达成趋势 | 对比图 | +| SPC控制图 | 控制图 | + +## 4. 设备报表 + +### 4.1 设备运行日报 + +**报表内容:** + +| 统计项 | 说明 | +|--------|------| +| 日期 | 统计日期 | +| 设备编号 | 设备编码 | +| 设备名称 | 设备名称 | +| 运行时间 | 实际运行小时 | +| 停机时间 | 停机小时数 | +| 运行率 | 运行/可用×100% | +| 故障次数 | 故障次数 | +| 维护次数 | 维护次数 | +| OEE | 设备综合效率 | + +### 4.2 OEE分析报表 + +**OEE组成分析:** + +| OEE组成 | 说明 | 计算公式 | +|--------|------|---------| +| 可用率 | 时间利用率 | 运行时间/计划时间 | +| 性能率 | 速度利用率 | 实际产出/理论产出 | +| 合格率 | 质量利用率 | 合格数/总产出 | +| OEE | 综合效率 | 可用率×性能率×合格率 | + +**OEE分析表:** + +| 设备 | 可用率 | 性能率 | 合格率 | OEE | +|------|--------|--------|--------|-----| +| 贴片机-A | 95% | 90% | 98% | 83.8% | +| 回流焊-B | 92% | 88% | 99% | 80.1% | +| AOI-C | 98% | 85% | 97% | 80.9% | + +### 4.3 设备维护报表 + +**维护统计:** + +| 统计项 | 说明 | +|--------|------| +| 设备编号 | 设备编码 | +| 点检次数 | 点检执行次数 | +| 保养次数 | 保养执行次数 | +| 故障次数 | 故障发生次数 | +| 维修时间 | 总维修时间 | +| MTBF | 平均故障间隔时间 | +| MTTR | 平均维修时间 | +| 维护成本 | 维护费用 | + +## 5. 库存报表 + +### 5.1 库存台账 + +**报表内容:** + +| 统计项 | 说明 | +|--------|------| +| 物料编码 | 物料编号 | +| 物料名称 | 物料名称 | +| 仓库 | 仓库名称 | +| 库位 | 库位编码 | +| 批次 | 物料批次 | +| 数量 | 库存数量 | +| 单位 | 计量单位 | +| 金额 | 库存金额 | +| 库存状态 | 正常/冻结 | + +### 5.2 库存周转分析 + +**周转指标:** + +| 指标 | 计算公式 | 说明 | +|------|---------|------| +| 库存周转率 | 出库成本/平均库存 | 周转次数 | +| 库存周转天数 | 360/周转率 | 周转天数 | +| 库存周转率目标 | - | 目标值 | + +**分析表:** + +| 物料类别 | 平均库存 | 月出库 | 周转率 | 周转天数 | +|---------|---------|--------|--------|---------| +| 原材料 | 100万 | 50万 | 6次 | 60天 | +| 半成品 | 80万 | 40万 | 6次 | 60天 | +| 成品 | 120万 | 60万 | 6次 | 60天 | + +### 5.3 呆滞物料分析 + +**呆滞定义:** + +| 呆滞等级 | 定义 | 说明 | +|---------|------|------| +| 一级呆滞 | 6个月未使用 | 需处理 | +| 二级呆滞 | 3-6个月未使用 | 关注 | +| 三级呆滞 | 1-3个月未使用 | 预警 | + +**呆滞物料表:** + +| 物料编码 | 物料名称 | 库存数量 | 呆滞时长 | 库存金额 | 处理建议 | +|---------|---------|---------|---------|---------|---------| +| M001 | 电阻10K | 50000 | 8个月 | 5万 | 促销/报废 | +| M002 | 电容100u | 30000 | 7个月 | 3万 | 促销/转用 | + +## 6. 报表管理 + +### 6.1 报表分类 + +| 报表类别 | 说明 | 使用对象 | +|---------|------|---------| +| 日常报表 | 每日生产、质量数据 | 车间主管 | +| 统计报表 | 月度统计数据 | 部门经理 | +| 分析报表 | 深度分析报告 | 高层管理 | +| 自定义报表 | 用户自定义报表 | 根据需求 | + +### 6.2 报表导出 + +**导出格式:** + +| 格式 | 说明 | 适用场景 | +|------|------|---------| +| Excel | .xlsx格式 | 数据分析 | +| PDF | PDF格式 | 打印存档 | +| CSV | CSV格式 | 数据导入 | +| Word | .docx格式 | 报告编写 | + +### 6.3 报表订阅 + +**订阅配置:** + +| 配置项 | 说明 | +|--------|------| +| 报表名称 | 订阅的报表 | +| 订阅周期 | 每日/每周/每月 | +| 发送时间 | 发送时间点 | +| 接收人 | 接收人邮箱 | +| 发送格式 | Excel/PDF | + +## 7. 数据可视化 + +### 7.1 图表类型 + +| 图表类型 | 适用场景 | +|---------|---------| +| 折线图 | 趋势分析 | +| 柱状图 | 对比分析 | +| 饼图 | 占比分析 | +| 散点图 | 关联分析 | +| 甘特图 | 进度展示 | +| 仪表盘 | 目标达成展示 | + +### 7.2 看板展示 + +**生产监控看板:** + +``` +┌─────────────────────────────────────────────────────────────┐ +│ 生产监控看板 │ +├─────────────────────────────────────────────────────────────┤ +│ │ +│ ┌─────────────────┐ ┌─────────────────┐ │ +│ │ 今日产量 │ │ 达成率 │ │ +│ │ 95,520 │ │ 95.5% │ │ +│ │ ▲ 3.2% │ │ ▲ 2.1% │ │ +│ └─────────────────┘ └─────────────────┘ │ +│ │ +│ ┌─────────────────┐ ┌─────────────────┐ │ +│ │ 合格率 │ │ OEE │ │ +│ │ 98.5% │ │ 82.3% │ │ +│ │ ▲ 0.3% │ │ ▼ 1.5% │ │ +│ └─────────────────┘ └─────────────────┘ │ +│ │ +│ 产量趋势图: │ +│ ┌─────────────────────────────────────────────────────┐ │ +│ │ ╱╲ ╱╲ ╱╲ ╱╲ │ │ +│ │ ╱╲╱ ╲╱ ╲╱ ╲╱ ╲╱ ╲╱ │ │ +│ │──╱────────────────────────────── │ │ +│ │ 1 2 3 4 5 6 7 8 9 10 (日期) │ │ +│ └─────────────────────────────────────────────────────┘ │ +│ │ +└─────────────────────────────────────────────────────────────┘ +``` + +## 8. 自定义报表 + +### 8.1 报表设计 + +**设计要素:** + +| 要素 | 说明 | +|------|------| +| 数据源 | 数据来源表/视图 | +| 查询条件 | 筛选条件 | +| 数据字段 | 显示字段 | +| 计算字段 | 计算公式 | +| 分组汇总 | 分组汇总方式 | +| 排序规则 | 排序方式 | +| 展示样式 | 表格/图表/看板 | + +### 8.2 报表权限 + +| 权限类型 | 说明 | +|---------|------| +| 创建权限 | 新建报表 | +| 编辑权限 | 修改报表 | +| 查看权限 | 查看报表 | +| 删除权限 | 删除报表 | +| 导出权限 | 导出报表 | + +--- + +**报表与分析篇完** diff --git a/docs/appendix/glossary.md b/docs/appendix/glossary.md new file mode 100644 index 0000000..d384ff3 --- /dev/null +++ b/docs/appendix/glossary.md @@ -0,0 +1,195 @@ +# 术语表 + +## 1. 专业术语定义 + +### 1.1 MES系统相关术语 + +| 术语 | 英文全称 | 中文定义 | +|------|---------|---------| +| MES | Manufacturing Execution System | 制造执行系统 | +| ERP | Enterprise Resource Planning | 企业资源计划 | +| WMS | Warehouse Management System | 仓库管理系统 | +| QMS | Quality Management System | 质量管理系统 | +| SCADA | Supervisory Control And Data Acquisition | 数据采集与监控系统 | +| PLC | Programmable Logic Controller | 可编程逻辑控制器 | +| BOM | Bill of Materials | 物料清单 | +| WIP | Work In Process | 在制品 | +| OEE | Overall Equipment Effectiveness | 设备综合效率 | +| SPC | Statistical Process Control | 统计过程控制 | + +### 1.2 质量相关术语 + +| 术语 | 英文全称 | 中文定义 | +|------|---------|---------| +| IQC | Incoming Quality Control | 来料质量控制 | +| IPQC | In-Process Quality Control | 过程质量控制 | +| FQC | Final Quality Control | 最终质量控制 | +| OQC | Outgoing Quality Control | 出货质量控制 | +| MRB | Material Review Board | 物料审核委员会 | +| AQL | Acceptable Quality Level | 允收质量水平 | +| QC | Quality Control | 质量控制 | +| QA | Quality Assurance | 质量保证 | + +### 1.3 设备相关术语 + +| 术语 | 英文全称 | 中文定义 | +|------|---------|---------| +| MTBF | Mean Time Between Failures | 平均故障间隔时间 | +| MTTR | Mean Time To Repair | 平均维修时间 | +| TPM | Total Productive Maintenance | 全面生产维护 | +| TPM | Total Productive Management | 全面生产管理 | + +### 1.4 仓储物流相关术语 + +| 术语 | 英文全称 | 中文定义 | +|------|---------|---------| +| FIFO | First In First Out | 先进先出 | +| RFID | Radio Frequency Identification | 射频识别 | +| SKU | Stock Keeping Unit | 库存单位 | +| WMS | Warehouse Management System | 仓库管理系统 | + +### 1.5 系统与技术相关术语 + +| 术语 | 英文全称 | 中文定义 | +|------|---------|---------| +| API | Application Programming Interface | 应用程序接口 | +| REST | Representational State Transfer | 表述性状态转移 | +| MQTT | Message Queuing Telemetry Transport | 消息队列遥测传输 | +| OPC | OLE for Process Control | 过程控制对象链接与嵌入 | +| RBAC | Role-Based Access Control | 基于角色的访问控制 | + +## 2. 业务术语定义 + +### 2.1 生产管理术语 + +| 术语 | 定义 | +|------|------| +| 工单 | 生产任务的执行单据,包含生产信息、工艺信息、数量信息 | +| 批次 | 具有相同生产条件的同质产品集合,通过批次号标识 | +| 工序 | 产品生产过程中的具体加工作业步骤 | +| 工艺路线 | 产品从投料到完工所经过的加工顺序 | +| 报工 | 向系统报告生产进度和数量的操作 | +| 完工 | 工序或工单生产完成 | +| 投料 | 将物料投入生产工序 | +| 齐套 | 生产所需的物料、设备、人员等资源准备齐全 | + +### 2.2 质量管理术语 + +| 术语 | 定义 | +|------|------| +| 追溯 | 追踪产品从原材料到成品的全过程信息 | +| 不良品 | 不符合质量标准的产品 | +| 返工 | 将不良品返回工序重新加工 | +| 降级 | 降低产品等级使用 | +| 让步接收 | 经审批后特殊放行 | +| 首件检验 | 每批次开始生产时的第一件产品检验 | +| 巡检 | 生产过程中的定期巡查检验 | +| 抽检 | 按抽样方案进行的随机抽样检验 | + +### 2.3 设备管理术语 + +| 术语 | 定义 | +|------|------| +| 点检 | 对设备进行的日常检查维护 | +| 保养 | 设备的预防性维护活动 | +| 故障 | 设备无法正常运行的异常状态 | +| 维修 | 修复设备故障的活动 | +| OEE | 设备综合效率,反映设备实际生产能力 | + +### 2.4 仓储管理术语 + +| 术语 | 定义 | +|------|------| +| 入库 | 物料进入仓库的操作 | +| 出库 | 物料离开仓库的操作 | +| 库存 | 仓库中存储的物料数量 | +| 库位 | 仓库中物料存放的具体位置 | +| 盘点 | 对仓库物料进行清点的操作 | +| 呆滞 | 长期未使用的物料 | + +## 3. 缩略语索引 + +| 缩略语 | 全称 | +|--------|------| +| WO | Work Order(工单) | +| LOT | Lot(批次) | +| EQ | Equipment(设备) | +| WH | Warehouse(仓库) | +| UPH | Units Per Hour(小时产能) | +| KPI | Key Performance Indicator(关键绩效指标) | +| SLA | Service Level Agreement(服务级别协议) | +| ROI | Return on Investment(投资回报率) | +| BOM | Bill of Materials(物料清单) | +| ERP | Enterprise Resource Planning(企业资源计划) | + +## 4. 流程图汇总 + +### 4.1 生产主流程 + +``` +订单接收 → 计划制定 → 工单生成 → 工单下发 + ↓ + ┌──────────────┐ + │ 生产执行 │ + │ 领料→投料→报工→工序流转 │ + └──────────────┘ + ↓ + 完工入库 → 质检入库 → 客户交付 +``` + +### 4.2 质量管理流程 + +``` +来料到货 → IQC检验 → 物料入库 + ↓ + ┌────────────────────┐ + │ 质量管理 │ + │ 首件→巡检→抽检→末件 │ + └────────────────────┘ + ↓ + 成品检验 → 出货检验 → 客户交付 +``` + +### 4.3 设备管理流程 + +``` +设备入账 → 设备运行 → 日常点检 → 计划保养 → 故障维修 → 设备报废 +``` + +### 4.4 仓储物流流程 + +``` +入库流程:到货 → 创建入库单 → IQC检验 → 分配库位 → 上架确认 +出库流程:领料申请 → 审核 → 备料 → 扫描出库 → 投料生产 +``` + +## 5. 版本更新日志 + +### 5.1 版本历史 + +| 版本号 | 发布日期 | 更新类型 | 更新内容 | +|--------|---------|---------|---------| +| v5.0 | 2026-04-10 | 正式发布 | 初始版本发布,包含完整功能模块 | + +### 5.2 更新类型说明 + +| 更新类型 | 说明 | +|---------|------| +| 新增 | 新增功能 | +| 优化 | 功能优化 | +| 修复 | Bug修复 | +| 变更 | 功能变更 | + +## 6. 文档信息 + +| 文档属性 | 信息 | +|---------|------| +| 文档名称 | HF-MES v5.0 使用手册 | +| 文档版本 | v1.0 | +| 发布日期 | 2026-04-10 | +| 所属公司 | - | +| 文档状态 | 正式发布 | + +--- + +**术语表完** diff --git a/docs/basic/data-management.md b/docs/basic/data-management.md new file mode 100644 index 0000000..71ff74c --- /dev/null +++ b/docs/basic/data-management.md @@ -0,0 +1,397 @@ +# 基础数据管理 + +## 1. 功能概述 + +基础数据是 MES 系统运行的核心支撑,涵盖产品、物料、工艺、设备、组织等各类主数据的管理。完善的基础数据是系统正常运转的前提。 + +**核心数据分类:** + +| 数据类别 | 主要内容 | 重要性 | +|---------|---------|--------| +| 产品数据 | 产品信息、BOM、工艺路线 | ⭐⭐⭐⭐⭐ | +| 物料数据 | 物料主数据、单位转换 | ⭐⭐⭐⭐⭐ | +| 工艺数据 | 工序定义、工艺路线 | ⭐⭐⭐⭐ | +| 设备数据 | 设备台账、产线信息 | ⭐⭐⭐⭐ | +| 组织数据 | 工厂、车间、仓库 | ⭐⭐⭐⭐⭐ | + +## 2. 产品数据管理 + +### 2.1 产品主数据 + +**产品信息定义:** + +| 字段 | 说明 | 是否必填 | +|------|------|---------| +| 产品编码 | 产品唯一标识 | ✓ | +| 产品名称 | 产品名称 | ✓ | +| 产品规格 | 产品规格型号 | ✓ | +| 产品分类 | 产品类别 | ✓ | +| 计量单位 | 默认计量单位 | ✓ | +| 产品版本 | 版本号 | - | +| 保质期 | 保质天数 | - | +| 追溯要求 | 是否需要批次追溯 | ✓ | + +**产品创建步骤:** + +1. 进入【基础数据】→【产品管理】 +2. 点击【新建】 +3. 填写产品基本信息 +4. 保存产品信息 + +### 2.2 物料清单(BOM) + +BOM(Bill of Materials)是产品的物料构成清单,是生产计划、物料核算的基础。 + +**BOM结构类型:** + +| 类型 | 说明 | 适用场景 | +|------|------|---------| +| 单层BOM | 仅包含直接下级物料 | 简单产品 | +| 多层BOM | 包含多层级的物料结构 | 复杂装配产品 | +| 工艺BOM | 包含工艺路线信息 | 生产制造 | +| 成本BOM | 包含成本信息 | 成本核算 | + +**BOM层级结构示例:** + +``` +产品A (1个) +├── 物料B (2个) +│ ├── 物料C (3个) +│ └── 物料D (1个) +└── 物料E (5个) +``` + +**BOM创建步骤:** + +1. 进入【基础数据】→【BOM管理】 +2. 选择产品 +3. 添加下级物料 +4. 填写用量和损耗率 +5. 保存BOM + +**【提示】** BOM变更需要经过审核流程,确保数据准确性。 + +### 2.3 工艺路线 + +工艺路线定义产品从原材料到成品的加工顺序和工艺参数。 + +**工艺路线要素:** + +| 要素 | 说明 | +|------|------| +| 工序编号 | 工序唯一标识 | +| 工序名称 | 工序名称 | +| 工序顺序 | 工序执行顺序 | +| 标准工时 | 标准作业时间 | +| 作业指导 | 作业指导书 | +| 检验点 | 是否需要质量检验 | + +**工艺路线示例:** + +| 工序号 | 工序名称 | 作业工时 | 检验点 | 设备要求 | +|--------|---------|---------|--------|---------| +| 001 | SMT贴片 | 10min | ✓ | SMT设备 | +| 002 | 回流焊接 | 5min | ✓ | 回流焊机 | +| 003 | AOI检测 | 3min | ✓ | AOI设备 | +| 004 | 组装 | 15min | - | 产线 | +| 005 | 测试 | 10min | ✓ | 测试设备 | +| 006 | 包装 | 5min | - | 包装线 | + +**工艺路线创建步骤:** + +1. 进入【基础数据】→【工艺路线】 +2. 选择产品 +3. 添加工序 +4. 配置工序参数 +5. 保存工艺路线 + +## 3. 物料数据管理 + +### 3.1 物料主数据 + +**物料信息字段:** + +| 字段 | 说明 | 是否必填 | +|------|------|---------| +| 物料编码 | 物料唯一标识 | ✓ | +| 物料名称 | 物料名称 | ✓ | +| 物料分类 | 物料类别 | ✓ | +| 规格型号 | 物料规格 | ✓ | +| 计量单位 | 计量单位 | ✓ | +| 安全库存 | 最低库存量 | - | +| 最高库存 | 最高库存量 | - | +| 采购周期 | 采购提前期 | - | +| 批次管理 | 是否批次管理 | ✓ | + +**物料分类示例:** + +| 一级分类 | 二级分类 | 示例 | +|---------|---------|------| +| 原材料 | 金属材料 | 铜材、铝材 | +| 原材料 | 塑料材料 | ABS、PC | +| 半成品 | PCB板 | 单面板、双面板 | +| 半成品 | 结构件 | 外壳、支架 | +| 成品 | 电子元件 | 电阻、电容 | +| 成品 | 模块 | 电源模块、通讯模块 | +| 包材 | 包装材料 | 纸箱、说明书 | +| 辅材 | 化学品 | 焊锡、助焊剂 | + +### 3.2 单位管理 + +**单位类型:** + +| 类型 | 说明 | 示例 | +|------|------|------| +| 基本单位 | 最小计量单位 | PCS、KG | +| 采购单位 | 采购计量单位 | 箱、卷 | +| 库存单位 | 库存计量单位 | PCS、KG | +| 生产单位 | 生产投料单位 | 盘、卷 | + +**单位转换规则:** + +| 物料 | 基本单位 | 采购单位 | 转换比例 | +|------|---------|---------|---------| +| 电阻 | PCS | 盘 | 5000 PCS/盘 | +| 焊锡 | KG | 卷 | 1 KG/卷 | +| PCB板 | PCS | 箱 | 50 PCS/箱 | + +### 3.3 仓库管理 + +**仓库信息:** + +| 字段 | 说明 | +|------|------| +| 仓库编码 | 仓库唯一标识 | +| 仓库名称 | 仓库名称 | +| 仓库类型 | 原材料库/成品库/半成品库 | +| 地址 | 仓库地址 | +| 管理员 | 仓库负责人 | + +**库位管理:** + +| 库位编码 | 说明 | 示例 | +|---------|------|------| +| A-01-001 | 区域-货架-层位 | A区01排001位 | +| 立体库位 | 仓库-区-排-层-位 | 01-01-001-01-01 | + +**库位规划原则:** + +- 按物料类别分区 +- 常用物料靠近出入口 +- 危险品单独存放 +- 批次管理物料分批存放 + +## 4. 组织数据管理 + +### 4.1 组织架构 + +**组织层级:** + +``` +公司 +└── 工厂 + └── 车间 + └── 产线 + └── 工位 +``` + +**组织数据示例:** + +| 层级 | 名称 | 编码 | +|------|------|------| +| 公司 | XX电子有限公司 | HQ | +| 工厂 | 深圳工厂 | SZ01 | +| 车间 | SMT车间 | SZ01-SMT | +| 车间 | 组装车间 | SZ01-ASM | +| 产线 | SMT-A线 | SZ01-SMT-A | +| 产线 | SMT-B线 | SZ01-SMT-B | +| 产线 | 组装-A线 | SZ01-ASM-A | + +### 4.2 工厂数据 + +**工厂信息配置:** + +| 配置项 | 说明 | +|--------|------| +| 工厂编码 | 工厂唯一标识 | +| 工厂名称 | 工厂名称 | +| 工厂地址 | 工厂地址 | +| 联系方式 | 联系电话 | +| 工作时间 | 上班时间-下班时间 | +| 时区设置 | 时区配置 | + +### 4.3 车间数据 + +**车间信息配置:** + +| 配置项 | 说明 | +|--------|------| +| 车间编码 | 车间唯一标识 | +| 车间名称 | 车间名称 | +| 所属工厂 | 上级工厂 | +| 车间类型 | 生产车间/仓储车间 | +| 负责人 | 车间主管 | +| 联系方式 | 联系电话 | + +### 4.4 产线数据 + +**产线信息配置:** + +| 配置项 | 说明 | +|--------|------| +| 产线编码 | 产线唯一标识 | +| 产线名称 | 产线名称 | +| 所属车间 | 上级车间 | +| 产线类型 | 专用线/柔性线 | +| 产能 | UPH(每小时产能) | +| 设备列表 | 产线设备 | + +**产能配置:** + +| 产线 | 日产能 | 月产能 | 利用率 | +|------|--------|--------|--------| +| SMT-A线 | 10000 PCS | 220000 PCS | 85% | +| SMT-B线 | 8000 PCS | 176000 PCS | 80% | +| 组装-A线 | 5000 PCS | 110000 PCS | 75% | + +## 5. 客户与供应商数据 + +### 5.1 客户数据 + +**客户信息字段:** + +| 字段 | 说明 | +|------|------| +| 客户编码 | 客户唯一标识 | +| 客户名称 | 客户名称 | +| 客户类型 | 经销商/终端客户 | +| 联系信息 | 联系人、电话、邮箱 | +| 地址信息 | 送货地址 | +| 信用等级 | 客户信用等级 | + +### 5.2 供应商数据 + +**供应商信息字段:** + +| 字段 | 说明 | +|------|------| +| 供应商编码 | 供应商唯一标识 | +| 供应商名称 | 供应商名称 | +| 供应物料 | 供应的物料类别 | +| 联系信息 | 联系人、电话、邮箱 | +| 地址信息 | 公司地址/送货地址 | +| 资质信息 | 营业执照等资质 | + +## 6. 数据导入导出 + +### 6.1 数据导入 + +**导入流程:** + +1. 下载导入模板 +2. 填写数据 +3. 上传文件 +4. 数据校验 +5. 导入确认 +6. 导入完成 + +**【注意】** 导入前请仔细阅读模板填写说明,确保数据格式正确。 + +### 6.2 数据导出 + +**导出方式:** + +| 方式 | 说明 | +|------|------| +| 页面导出 | 在列表页面选择导出 | +| 批量导出 | 按条件批量导出 | +| 接口导出 | 通过API接口导出 | + +**导出格式:** + +- Excel格式(.xlsx) +- CSV格式(.csv) +- PDF格式(报表) + +### 6.3 导入模板字段说明 + +**产品导入模板:** + +| 列名 | 说明 | 示例 | +|------|------|------| +| 产品编码 | 产品唯一编码 | P001 | +| 产品名称 | 产品名称 | PCB板 | +| 规格型号 | 规格型号 | 100*80mm | +| 产品分类 | 产品分类编码 | 03 | +| 计量单位 | 计量单位编码 | 01 | +| 是否追溯 | 是/否 | 是 | + +**物料导入模板:** + +| 列名 | 说明 | 示例 | +|------|------|------| +| 物料编码 | 物料唯一编码 | M001 | +| 物料名称 | 物料名称 | 电阻 | +| 规格型号 | 规格型号 | 10KΩ | +| 物料分类 | 物料分类编码 | 0101 | +| 计量单位 | 计量单位编码 | 01 | +| 安全库存 | 安全库存数量 | 1000 | +| 是否批次 | 是否批次管理 | 是 | + +## 7. 数据校验规则 + +### 7.1 编码规则 + +**编码规范:** + +| 数据类型 | 编码规则 | 示例 | +|---------|---------|------| +| 产品编码 | P+数字 | P001 | +| 物料编码 | M+数字 | M001 | +| 客户编码 | C+数字 | C001 | +| 供应商编码 | S+数字 | S001 | +| 设备编码 | E+数字 | E001 | +| 工位编码 | W+数字 | W001 | + +**【提示】** 建议在实施前制定统一的编码规范,避免后续混乱。 + +### 7.2 数据校验 + +**必填校验:** + +- 必填字段不能为空 +- 编码不能重复 +- 数量必须大于0 + +**格式校验:** + +| 字段 | 格式要求 | 示例 | +|------|---------|------| +| 编码 | 字母+数字组合 | P001 | +| 日期 | YYYY-MM-DD | 2026-04-10 | +| 数量 | 正整数或小数 | 100、99.5 | +| 比例 | 0-100之间 | 85.5% | + +## 8. 数据权限管理 + +### 8.1 数据权限级别 + +| 权限级别 | 说明 | 适用对象 | +|---------|------|---------| +| 公司级 | 可查看所有工厂数据 | 高管 | +| 工厂级 | 可查看所属工厂数据 | 工厂负责人 | +| 车间级 | 可查看所属车间数据 | 车间主管 | +| 产线级 | 可查看所属产线数据 | 产线主管 | +| 个人级 | 只能查看自己的数据 | 普通员工 | + +### 8.2 数据权限配置 + +**配置要点:** + +1. 根据用户角色分配数据权限级别 +2. 特殊用户可配置例外权限 +3. 定期审核权限配置 + +--- + +**基础数据管理篇完** diff --git a/docs/basic/equipment.md b/docs/basic/equipment.md new file mode 100644 index 0000000..faeed60 --- /dev/null +++ b/docs/basic/equipment.md @@ -0,0 +1,340 @@ +# 设备基础信息 + +## 1. 功能概述 + +设备基础信息管理是 MES 设备管理模块的重要组成部分,涵盖设备台账、设备分类、设备参数等基础数据的管理,为设备的日常运维和监控分析提供数据支撑。 + +**核心功能:** + +| 功能 | 说明 | +|------|------| +| 设备台账 | 设备基本信息管理 | +| 设备分类 | 设备分类体系管理 | +| 设备参数 | 设备技术参数配置 | +| 设备关联 | 设备与产线、工序关联 | + +## 2. 设备台账管理 + +### 2.1 设备基本信息 + +**设备信息字段:** + +| 字段 | 说明 | 是否必填 | +|------|------|---------| +| 设备编码 | 设备唯一标识 | ✓ | +| 设备名称 | 设备名称 | ✓ | +| 设备型号 | 设备型号规格 | ✓ | +| 设备分类 | 设备所属类别 | ✓ | +| 所属产线 | 所属产线 | ✓ | +| 供应商 | 设备供应商 | - | +| 购置日期 | 购置时间 | ✓ | +| 购置金额 | 采购价格 | - | +| 使用部门 | 使用部门 | ✓ | +| 设备状态 | 在用/停用/报废 | ✓ | + +### 2.2 设备状态定义 + +| 状态 | 说明 | 业务场景 | +|------|------|---------| +| 在用 | 正常运行中 | 正常生产使用 | +| 闲置 | 可用但未使用 | 备用设备 | +| 维修中 | 正在维修 | 故障维修 | +| 保养中 | 正在保养 | 计划保养 | +| 停用 | 暂时停用 | 产能调整 | +| 报废 | 已淘汰 | 设备报废 | + +### 2.3 设备创建步骤 + +**操作步骤:** + +1. 进入【设备管理】→【设备台账】 +2. 点击【新增设备】 +3. 填写设备基本信息 +4. 上传设备图片(可选) +5. 保存设备信息 +6. 设备审核(如需) + +**【提示】** 设备编码建议使用统一的编码规则,便于识别和管理。 + +## 3. 设备分类管理 + +### 3.1 设备分类体系 + +**分类层级结构:** + +``` +设备 +├── 生产设备 +│ ├── 加工设备 +│ │ ├── CNC加工中心 +│ │ ├── 车床 +│ │ ├── 铣床 +│ │ └── 磨床 +│ ├── 专用设备 +│ │ ├── SMT设备 +│ │ ├── 回流焊 +│ │ └── AOI检测仪 +│ └── 装配设备 +│ ├── 自动装配机 +│ └── 手工装配台 +├── 检测设备 +│ ├── 测量设备 +│ ├── 测试设备 +│ └── 检验设备 +├── 辅助设备 +│ ├── 空压设备 +│ ├── 通风设备 +│ └── 配电设备 +└── 办公设备 + ├── 计算机 + └── 网络设备 +``` + +### 3.2 分类管理配置 + +**分类信息:** + +| 配置项 | 说明 | +|--------|------| +| 分类编码 | 分类唯一标识 | +| 分类名称 | 分类名称 | +| 上级分类 | 父级分类 | +| 分类级别 | 层级深度 | +| 排序号 | 显示顺序 | + +**【提示】** 合理的设备分类有助于设备统计和分析,建议在实施时仔细规划分类体系。 + +## 4. 设备参数管理 + +### 4.1 技术参数 + +**设备技术参数:** + +| 参数类别 | 参数项 | 说明 | +|---------|--------|------| +| 基本参数 | 设备型号 | 设备型号 | +| 基本参数 | 制造商 | 生产厂家 | +| 基本参数 | 出厂日期 | 出厂时间 | +| 基本参数 | 序列号 | 出厂序列号 | +| 性能参数 | 额定功率 | kW | +| 性能参数 | 额定电压 | V | +| 性能参数 | 额定电流 | A | +| 性能参数 | 工作压力 | MPa | +| 性能参数 | 产能 | UPH | +| 尺寸参数 | 外形尺寸 | 长×宽×高 | +| 尺寸参数 | 重量 | kg | + +### 4.2 运行时参数 + +**实时监控参数:** + +| 参数类型 | 参数项 | 采集方式 | +|---------|--------|---------| +| 运行状态 | 启动/停止 | 自动采集 | +| 运行时间 | 累计运行时间 | 自动累计 | +| 产量数据 | 当班产量 | 自动统计 | +| 报警状态 | 报警信息 | 自动采集 | +| 能耗数据 | 电力消耗 | 自动采集 | +| 温度数据 | 设备温度 | 传感器采集 | + +## 5. 设备关联管理 + +### 5.1 设备与产线关联 + +**关联关系:** + +| 产线 | 设备列表 | 设备数量 | +|------|---------|---------| +| SMT-A线 | 贴片机、回流焊、AOI | 3台 | +| 组装-A线 | 自动装配机、检测仪 | 2台 | +| 包装-A线 | 贴标机、打包机 | 2台 | + +**关联配置步骤:** + +1. 进入【设备管理】→【设备关联】 +2. 选择产线 +3. 添加设备 +4. 设置设备在产线中的角色 +5. 保存关联关系 + +### 5.2 设备与工序关联 + +**工序-设备对应关系:** + +| 工序 | 使用设备 | 设备数量 | +|------|---------|---------| +| SMT贴片 | 贴片机 | 1台 | +| 回流焊接 | 回流焊 | 1台 | +| AOI检测 | AOI检测仪 | 1台 | +| 组装 | 自动装配机 | 1台 | +| 测试 | 综合测试仪 | 2台 | + +### 5.3 设备能力配置 + +**产能配置:** + +| 设备 | 理论产能 | 实际产能 | 产能利用率 | +|------|---------|---------|-----------| +| SMT贴片机 | 25000 CPH | 20000 CPH | 80% | +| 回流焊机 | 30000 CPH | 25000 CPH | 83% | +| AOI检测仪 | 5000 CPH | 4500 CPH | 90% | + +## 6. 设备文档管理 + +### 6.1 设备文档类型 + +| 文档类型 | 说明 | +|---------|------| +| 使用说明书 | 设备操作手册 | +| 维修手册 | 维修指南 | +| 保养手册 | 保养规范 | +| 电路图纸 | 电气原理图 | +| 机械图纸 | 机械结构图 | +| 合格证书 | 出厂合格证 | +| 验收报告 | 设备验收单 | + +### 6.2 文档上传步骤 + +**操作步骤:** + +1. 进入设备详情页面 +2. 点击【文档管理】标签 +3. 点击【上传文档】 +4. 选择文档类型 +5. 上传文件 +6. 保存文档信息 + +**【注意】** 文档建议使用 PDF 格式,确保长期可读性。 + +## 7. 设备位置管理 + +### 7.1 设备位置信息 + +**位置配置:** + +| 配置项 | 说明 | +|--------|------| +| 所在工厂 | 所属工厂 | +| 所在车间 | 所属车间 | +| 所在区域 | 车间内区域 | +| 具体位置 | 具体位置描述 | +| GPS坐标 | 经纬度坐标(可选) | + +### 7.2 设备布局图 + +**产线设备布局:** + +``` +产线布局示意图: + +入口 ──▶ [来料暂存区] + │ + ▼ + ┌────────┐ + │ 贴片机 │ ← 设备1 + └────┬───┘ + │ + ▼ + ┌────────┐ + │ 回流焊 │ ← 设备2 + └────┬───┘ + │ + ▼ + ┌────────┐ + │ AOI检测 │ ← 设备3 + └────┬───┘ + │ + ▼ + ┌────────┐ + │ 组装工位 │ ← 工位1 + └────┬───┘ + │ + ▼ + [成品暂存区] ──▶ 出口 +``` + +## 8. 设备点检标准 + +### 8.1 点检项目定义 + +**点检标准内容:** + +| 项目 | 说明 | +|------|------| +| 点检编码 | 点检项目唯一标识 | +| 点检名称 | 点检项目名称 | +| 点检周期 | 日/周/月点检 | +| 点检方法 | 视觉/触觉/听觉等 | +| 判断标准 | 正常/异常判定标准 | +| 处理方式 | 异常时的处理方法 | + +### 8.2 点检标准示例 + +**贴片机日点检标准:** + +| 点检项目 | 点检方法 | 判断标准 | 异常处理 | +|---------|---------|---------|---------| +| 设备外观 | 视觉检查 | 无破损、变形 | 停机报修 | +| 电源指示 | 观察指示灯 | 绿色正常 | 检查电源 | +| 物料状态 | 视觉检查 | 物料充足 | 补充物料 | +| 吸嘴清洁度 | 视觉检查 | 无杂物、干净 | 清洁吸嘴 | +| 传送带状态 | 运行观察 | 运行平稳 | 调整张力 | +| 润滑状态 | 触觉检查 | 润滑良好 | 补充润滑油 | + +## 9. 设备保养标准 + +### 9.1 保养周期定义 + +| 保养类型 | 周期 | 内容 | +|---------|------|------| +| 日常保养 | 每日 | 清洁、润滑、检查 | +| 一级保养 | 每周 | 清洁、润滑、调整 | +| 二级保养 | 每月 | 清洁、润滑、紧固 | +| 三级保养 | 每季 | 检查、调整、更换 | +| 项修 | 每半年 | 部分检修 | +| 大修 | 每年 | 全面检修 | + +### 9.2 保养标准内容 + +**保养标准要素:** + +| 要素 | 说明 | +|------|------| +| 保养编码 | 保养标准唯一标识 | +| 保养名称 | 保养项目名称 | +| 保养周期 | 执行周期 | +| 保养项目 | 具体保养内容 | +| 所需备件 | 保养所需备件 | +| 预计工时 | 保养预计时间 | +| 保养指导 | 保养操作指导 | + +## 10. 数据导入与维护 + +### 10.1 批量导入 + +**导入模板字段:** + +| 列名 | 说明 | 示例 | +|------|------|------| +| 设备编码 | 唯一编码 | E001 | +| 设备名称 | 设备名称 | SMT贴片机 | +| 设备型号 | 型号规格 | YS-200 | +| 设备分类 | 分类编码 | 0101 | +| 所属产线 | 产线编码 | LINE01 | +| 供应商 | 供应商名称 | XX机械 | +| 购置日期 | 日期格式 | 2025-01-01 | + +### 10.2 数据维护规范 + +**维护要点:** + +1. **及时更新** - 设备变更后及时更新信息 +2. **定期审核** - 定期审核设备数据准确性 +3. **完整记录** - 记录设备全生命周期信息 +4. **规范编码** - 遵循统一的编码规范 + +**【提示】** 设备基础数据的准确性直接影响设备管理效果,建议安排专人负责数据维护。 + +--- + +**设备基础信息篇完** diff --git a/docs/business/equipment-warehouse.md b/docs/business/equipment-warehouse.md new file mode 100644 index 0000000..1970cf6 --- /dev/null +++ b/docs/business/equipment-warehouse.md @@ -0,0 +1,462 @@ +# 设备与仓储 + +## 1. 功能概述 + +本篇涵盖设备管理和仓储物流两大模块,实现设备的全生命周期管理和物料的仓储物流管理,确保生产过程的顺利进行。 + +**主要内容包括:** + +| 章节 | 主要内容 | +|------|---------| +| 设备管理 | 设备台账、点检保养、故障维修、OEE分析 | +| 仓储物流 | 入库管理、出库管理、库存管理 | + +## 2. 设备管理 + +### 2.1 设备台账 + +**设备信息管理:** + +| 功能 | 说明 | +|------|------| +| 设备登记 | 设备基本信息录入 | +| 设备查询 | 按条件查询设备信息 | +| 设备变更 | 设备信息变更管理 | +| 设备报废 | 设备报废流程处理 | +| 设备文档 | 设备文档资料管理 | + +**设备生命周期:** + +``` +设备采购 → 设备安装 → 设备验收 → 设备运行 → 设备维护 → 设备报废 +``` + +### 2.2 设备点检 + +**点检类型:** + +| 点检类型 | 执行周期 | 执行人员 | 主要内容 | +|---------|---------|---------|---------| +| 日常点检 | 每日 | 操作员 | 设备运行状态检查 | +| 定期点检 | 每周/每月 | 维修员 | 设备性能检查 | +| 精密点检 | 每季/每年 | 工程师 | 设备精度检查 | + +**点检流程:** + +``` +点检计划生成 → 点检任务派发 → 执行点检 → 点检记录 → 异常处理 +``` + +**点检执行步骤:** + +1. 接收点检任务 +2. 到达设备现场 +3. 按照点检标准逐项检查 +4. 记录点检结果 +5. 提交点检记录 +6. 如有异常,触发异常处理流程 + +**点检记录信息:** + +| 记录项 | 说明 | +|--------|------| +| 点检单号 | 点检单唯一标识 | +| 设备编号 | 点检的设备 | +| 点检类型 | 日常/定期/精密 | +| 点检人员 | 执行点检的人员 | +| 点检时间 | 点检时间 | +| 点检项目 | 检查的项目 | +| 点检结果 | 正常/异常 | +| 异常描述 | 异常情况描述 | + +### 2.3 设备保养 + +**保养类型:** + +| 保养类型 | 周期 | 内容 | 工时 | +|---------|------|------|------| +| 日常保养 | 每日 | 清洁、润滑、紧固 | 15-30min | +| 一级保养 | 每周 | 清洁、润滑、调整 | 2-4h | +| 二级保养 | 每月 | 清洁、润滑、紧固、更换易损件 | 8h | +| 三级保养 | 每季 | 全方面检查、调整、更换 | 1-2天 | +| 大修 | 每年 | 全面拆解检修 | 3-7天 | + +**保养流程:** + +``` +保养计划 → 保养准备 → 保养执行 → 保养记录 → 验收确认 +``` + +**保养内容:** + +| 保养项目 | 保养内容 | 所需物料 | +|---------|---------|---------| +| 清洁 | 设备表面、内部清洁 | 清洁剂、抹布 | +| 润滑 | 运动部件润滑 | 润滑油 | +| 紧固 | 检查并紧固松动部件 | 扳手等工具 | +| 调整 | 调整设备参数 | 调试工具 | +| 更换 | 更换易损件 | 备件 | + +### 2.4 设备故障管理 + +**故障分类:** + +| 故障类别 | 说明 | 维修要求 | +|---------|------|---------| +| 轻微故障 | 不影响生产 | 2小时内修复 | +| 一般故障 | 部分功能受影响 | 4小时内修复 | +| 严重故障 | 设备停机 | 8小时内修复 | +| 紧急故障 | 设备损坏 | 立即响应 | + +**故障处理流程:** + +``` +故障发现 → 故障报告 → 故障诊断 → 维修处理 → 维修验收 → 故障记录 +``` + +**故障报修步骤:** + +1. 发现设备故障 +2. 评估故障影响 +3. 紧急停机(如需要) +4. 提交故障报修单 +5. 维修人员接单 +6. 故障诊断 +7. 执行维修 +8. 维修验收 +9. 故障记录归档 + +**故障报修信息:** + +| 字段 | 说明 | +|------|------| +| 报修单号 | 报修单唯一标识 | +| 设备编号 | 故障设备 | +| 故障类型 | 故障类型 | +| 故障描述 | 故障情况描述 | +| 故障时间 | 发现故障时间 | +| 报修人 | 报告故障的人员 | +| 紧急程度 | 紧急/一般/轻微 | +| 影响范围 | 对生产的影响 | + +**维修记录信息:** + +| 记录项 | 说明 | +|--------|------| +| 维修单号 | 维修单唯一标识 | +| 维修人员 | 执行维修的人员 | +| 维修开始时间 | 开始维修时间 | +| 维修结束时间 | 完成维修时间 | +| 故障原因 | 导致故障的原因 | +| 维修措施 | 采取的维修方法 | +| 更换备件 | 更换的备件列表 | +| 维修结果 | 维修效果 | + +### 2.5 设备OEE分析 + +**OEE概念:** + +OEE(Overall Equipment Effectiveness)设备综合效率,是衡量设备实际生产能力与理论生产能力的比率。 + +**OEE计算公式:** + +``` +OEE = 可用率 × 性能率 × 合格率 + +其中: +- 可用率 = 实际运行时间 / 计划运行时间 × 100% +- 性能率 = 实际产出 / 理论产出 × 100% +- 合格率 = 合格品数量 / 总产出数量 × 100% +``` + +**OEE指标标准:** + +| OEE值 | 等级 | 说明 | +|-------|------|------| +| ≥85% | 世界级 | 优秀 | +| 70%-85% | 良好 | 达标 | +| 60%-70% | 一般 | 需要改善 | +| <60% | 较差 | 需重点改善 | + +**OEE分析维度:** + +| 分析维度 | 损失类型 | 说明 | +|---------|---------|------| +| 可用率 | 故障停机 | 设备故障导致的停机 | +| 可用率 | 换型调试 | 产品换型、调试时间 | +| 性能率 | 空转小停顿 | 短暂停机 | +| 性能率 | 速度降低 | 运行速度低于理论速度 | +| 合格率 | 废品 | 不合格产品 | +| 合格率 | 返工 | 需要返工的产品 | + +**OEE提升措施:** + +| 损失类型 | 改善措施 | +|---------|---------| +| 故障停机 | 加强预防性维护 | +| 换型调试 | 优化换型流程 | +| 空转小停顿 | 优化作业流程 | +| 速度降低 | 设备升级改造 | +| 废品返工 | 加强质量控制 | + +## 3. 仓储物流 + +### 3.1 仓库布局 + +**仓库区域规划:** + +| 区域类型 | 用途 | 特点 | +|---------|------|------| +| 待检区 | 待检验物料 | 隔离存放 | +| 原材料区 | 原材料存储 | 按类别分区 | +| 半成品区 | 半成品存储 | 批次管理 | +| 成品区 | 成品存储 | 先进先出 | +| 退货区 | 退货物料 | 单独管理 | +| 废品区 | 废品存放 | 安全隔离 | +| 不良品区 | 不良品存放 | 标识清晰 | + +**库位编码规则:** + +| 编码示例 | 含义 | +|---------|------| +| A-01-001 | A区01排001位 | +| B-02-005 | B区02排005位 | +| C-03-010 | C区03排010位 | + +### 3.2 入库管理 + +**入库类型:** + +| 入库类型 | 说明 | 单据类型 | +|---------|------|---------| +| 采购入库 | 采购物料到货 | 采购入库单 | +| 生产入库 | 生产成品入库 | 生产入库单 | +| 退货入库 | 销售退货入库 | 退货入库单 | +| 调拨入库 | 其他仓库调拨入库 | 调拨单 | +| 其他入库 | 其他原因入库 | 其他入库单 | + +**入库流程:** + +``` +┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ +│ 到货 │───▶│ 单据 │───▶│ IQC │───▶│ 检验 │ +│ 接收 │ │ 创建 │ │ 推送 │ │ 执行 │ +└──────────┘ └──────────┘ └──────────┘ └──────────┘ + │ + ▼ +┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ +│ 确认 │◀───│ 分配 │◀───│ 库位 │◀───│ 合格 │ +│ 入库 │ │ 库位 │ │ 选择 │ │ 判定 │ +└──────────┘ └──────────┘ └──────────┘ └──────────┘ +``` + +**入库操作步骤:** + +1. 物料到货,接收送货单 +2. 创建入库单 +3. 系统自动推送IQC检验任务 +4. 执行来料检验 +5. 检验合格后,分配库位 +6. 物料上架到指定库位 +7. 扫描库位确认 +8. 完成入库 + +**入库单信息:** + +| 字段 | 说明 | +|------|------| +| 入库单号 | 入库单唯一标识 | +| 入库类型 | 采购/生产/退货等 | +| 供应商 | 物料供应商(采购入库) | +| 关联单号 | 采购订单/工单等 | +| 入库日期 | 入库日期 | +| 物料明细 | 入库物料列表 | +| 仓库 | 入库仓库 | +| 状态 | 待检验/已入库等 | + +### 3.3 出库管理 + +**出库类型:** + +| 出库类型 | 说明 | 单据类型 | +|---------|------|---------| +| 生产领料 | 生产使用领料 | 领料单 | +| 销售出库 | 销售发货出库 | 销售出库单 | +| 退货出库 | 退货给供应商 | 退货单 | +| 调拨出库 | 调拨到其他仓库 | 调拨单 | +| 其他出库 | 其他原因出库 | 其他出库单 | + +**出库流程:** + +``` +┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ +│ 领料 │───▶│ 单据 │───▶│ 备料 │───▶│ 审核 │ +│ 申请 │ │ 创建 │ │ 拣货 │ │ 通过 │ +└──────────┘ └──────────┘ └──────────┘ └──────────┘ + │ + ▼ +┌──────────┐ ┌──────────┐ +│ 确认 │◀───│ 扫描 │ +│ 出库 │ │ 出库 │ +└──────────┘ └──────────┘ +``` + +**出库操作步骤:** + +1. 根据工单或手工创建领料单 +2. 选择需要的物料 +3. 系统检查库存情况 +4. 审核领料单 +5. 仓库人员备料、拣货 +6. 扫描物料和库位 +7. 确认出库 +8. 物料交付使用部门 + +**领料单信息:** + +| 字段 | 说明 | +|------|------| +| 领料单号 | 领料单唯一标识 | +| 领料类型 | 生产领料/其他 | +| 关联工单 | 领料对应的工单 | +| 领料部门 | 领料的部门 | +| 领料人员 | 领料人员 | +| 领料日期 | 领料日期 | +| 物料明细 | 领料物料列表 | +| 仓库 | 出库仓库 | +| 状态 | 待审核/已领料等 | + +### 3.4 库存管理 + +**库存查询:** + +| 查询维度 | 查询内容 | +|---------|---------| +| 按物料查询 | 某物料的库存情况 | +| 按仓库查询 | 某仓库的库存情况 | +| 按库位查询 | 某库位的库存情况 | +| 按批次查询 | 某批次的库存情况 | +| 按库存状态 | 库存数量分布 | + +**库存数据:** + +| 数据项 | 说明 | +|--------|------| +| 物料编码 | 物料编号 | +| 物料名称 | 物料名称 | +| 仓库 | 所在仓库 | +| 库位 | 所在库位 | +| 批次 | 物料批次 | +| 数量 | 库存数量 | +| 单位 | 计量单位 | +| 库存状态 | 正常/冻结/待检 | + +**库存账务:** + +| 账务类型 | 说明 | +|---------|------| +| 期初库存 | 账期开始时的库存 | +| 本期入库 | 本期增加的数量 | +| 本期出库 | 本期减少的数量 | +| 期末库存 | 账期结束时的库存 | + +**库存计算公式:** + +``` +期末库存 = 期初库存 + 本期入库 - 本期出库 +``` + +### 3.5 批次管理 + +**批次追溯:** + +| 追溯维度 | 追溯内容 | +|---------|---------| +| 正向追溯 | 原料→成品 | +| 逆向追溯 | 成品→原料 | + +**批次信息:** + +| 信息项 | 说明 | +|--------|------| +| 批次号 | 批次唯一标识 | +| 物料批次 | 物料批次 | +| 供应商批次 | 供应商提供的批次 | +| 生产批次 | 生产批次 | +| 入库日期 | 入库时间 | +| 保质期 | 保质期限 | +| 检验状态 | 合格/不合格 | + +**先进先出(FIFO):** + +| 原则 | 说明 | +|------|------| +| 先入库先出库 | 较早入库的物料优先出库 | +| 保质期管理 | 近保质期的优先出库 | +| 批次清晰 | 批次标识清晰可追溯 | + +### 3.6 库存预警 + +**预警类型:** + +| 预警类型 | 触发条件 | 提醒内容 | +|---------|---------|---------| +| 安全库存预警 | 库存≤安全库存 | 库存不足提醒 | +| 保质期预警 | 临近保质期 | 保质期即将到期 | +| 呆滞预警 | 长期未使用 | 物料呆滞提醒 | +| 最大库存预警 | 库存≥最高库存 | 库存过高提醒 | + +**库存控制策略:** + +| 策略 | 说明 | 适用场景 | +|------|------|---------| +| 安全库存 | 最低库存保障 | 常规物料 | +| 最高库存 | 库存上限控制 | 避免积压 | +| 订货点法 | 库存到订货点时补货 | 定量采购 | +| 定期订货法 | 定期检查库存补货 | 定期采购 | + +### 3.7 库存盘点 + +**盘点类型:** + +| 盘点类型 | 说明 | 频率 | +|---------|------|------| +| 全面盘点 | 所有物料全面盘点 | 年末 | +| 部分盘点 | 部分物料盘点 | 每月/每周 | +| 循环盘点 | 按计划循环盘点 | 每日 | +| 动态盘点 | 实时盘点 | 持续 | + +**盘点流程:** + +``` +盘点计划 → 盘点准备 → 初盘 → 复盘 → 差异审核 → 账务调整 +``` + +**盘点步骤:** + +1. 创建盘点单 +2. 选择盘点仓库和物料 +3. 执行初盘(首次清点) +4. 执行复盘(复核确认) +5. 核对系统账务 +6. 分析盘点差异 +7. 审核差异 +8. 执行账务调整 + +**盘点记录:** + +| 记录项 | 说明 | +|--------|------| +| 盘点单号 | 盘点单唯一标识 | +| 盘点类型 | 全面/部分/循环 | +| 盘点仓库 | 盘点仓库 | +| 盘点日期 | 盘点日期 | +| 账面数量 | 系统账面数量 | +| 实盘数量 | 实际盘点数量 | +| 差异数量 | 差异数量 | +| 差异原因 | 差异原因说明 | +| 审核状态 | 待审核/已审核 | + +--- + +**设备与仓储篇完** diff --git a/docs/business/production.md b/docs/business/production.md new file mode 100644 index 0000000..b032275 --- /dev/null +++ b/docs/business/production.md @@ -0,0 +1,441 @@ +# 生产管理 + +## 1. 功能概述 + +生产管理模块是 MES 系统的核心模块,涵盖从生产计划到生产执行的全过程管理,实现生产过程的数字化、透明化和智能化。 + +**核心功能:** + +| 功能 | 说明 | +|------|------| +| 生产计划 | 生产计划制定与分解 | +| 工单管理 | 工单的创建、审核、下发、变更 | +| 报工管理 | 生产报工、完工确认 | +| 生产监控 | 实时监控生产进度 | +| 物料流转 | 投料、领料、半成品流转 | +| 生产报表 | 生产数据统计分析 | + +## 2. 生产计划管理 + +### 2.1 生产计划类型 + +| 计划类型 | 说明 | 时间范围 | +|---------|------|---------| +| 年度计划 | 年度生产大纲 | 1年 | +| 月度计划 | 月度生产计划 | 1个月 | +| 周计划 | 周生产排程 | 1周 | +| 日计划 | 日生产派工 | 1天 | +| 紧急计划 | 插单、变更计划 | 即时 | + +### 2.2 生产计划来源 + +**计划生成方式:** + +| 来源 | 说明 | 自动程度 | +|------|------|---------| +| 销售订单 | 根据销售订单生成 | 半自动 | +| 预测订单 | 根据预测数据生成 | 半自动 | +| 库存补货 | 根据库存低于安全线生成 | 自动 | +| 手工创建 | 手工制定计划 | 手动 | + +### 2.3 计划平衡与分解 + +**计划平衡流程:** + +``` +┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ +│ 需求计划 │───▶│ 能力检查 │───▶│ 计划调整 │───▶│ 计划确认 │ +└─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ +``` + +**能力评估要素:** + +| 评估项目 | 评估内容 | +|---------|---------| +| 设备能力 | 设备产能是否满足 | +| 物料能力 | 物料是否齐套 | +| 人员能力 | 人员是否充足 | +| 工装能力 | 工装夹具是否到位 | +| 环境能力 | 生产环境是否满足 | + +## 3. 工单管理 + +### 3.1 工单类型 + +| 工单类型 | 说明 | 触发方式 | +|---------|------|---------| +| 生产工单 | 正常生产工单 | 计划触发 | +| 返工工单 | 返工生产工单 | 质量问题触发 | +| 补料工单 | 物料追加工单 | 损耗触发 | +| 试做工单 | 试产工单 | 研发触发 | +| 紧急工单 | 紧急插单 | 临时触发 | + +### 3.2 工单状态流转 + +**状态流转图:** + +``` +┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ +│ 待制定 │───▶│ 已制定 │───▶│ 已审核 │───▶│ 已下发 │───▶│ 生产中 │ +└────────┘ └────────┘ └────────┘ └────────┘ └────────┘ + │ │ + │ ▼ + │ ┌────────┐ + │ │ 已完工 │ + └────────────────────────────────────────────────────▶│ │ + └────────┘ +``` + +**状态说明:** + +| 状态 | 说明 | 可执行操作 | +|------|------|---------| +| 待制定 | 计划制定中 | 编辑、删除 | +| 已制定 | 计划已完成 | 提交审核、编辑 | +| 已审核 | 审核通过 | 下发 | +| 已下发 | 已下发到产线 | 开始生产 | +| 生产中 | 正在生产 | 报工、暂停 | +| 已完工 | 生产完成 | 入库、关闭 | +| 已关闭 | 工单关闭 | 查看 | +| 已取消 | 工单取消 | 查看 | + +### 3.3 工单创建 + +**创建步骤:** + +1. 进入【生产管理】→【工单管理】 +2. 点击【新建工单】 +3. 选择产品 +4. 填写工单信息: + - 生产数量 + - 计划开始/结束日期 + - 计划产线 + - 优先级 +5. 系统自动计算物料需求 +6. 保存工单 + +**【注意】** 创建工单前请确保产品BOM和工艺路线已维护完成。 + +### 3.4 工单信息 + +**工单基本信息:** + +| 字段 | 说明 | 是否必填 | +|------|------|---------| +| 工单编号 | 工单唯一标识 | ✓ | +| 产品编码 | 生产产品 | ✓ | +| 产品名称 | 产品名称 | ✓ | +| 生产数量 | 计划生产数量 | ✓ | +| 合格数量 | 合格品数量 | - | +| 不良品数量 | 不良品数量 | - | +| 计划开工日 | 计划开工日期 | ✓ | +| 计划完工日 | 计划完工日期 | ✓ | +| 实际开工日 | 实际开工日期 | - | +| 实际完工日 | 实际完工日期 | - | +| 优先级 | 工单优先级 | ✓ | +| 工单状态 | 当前状态 | 系统自动 | + +**工单关联信息:** + +| 关联项 | 说明 | +|--------|------| +| 销售订单 | 关联的销售订单 | +| 客户信息 | 客户信息 | +| BOM版本 | 使用的BOM版本 | +| 工艺版本 | 使用的工艺版本 | + +### 3.5 工单审核 + +**审核流程:** + +1. 工单制定人提交审核 +2. 审核人员收到审核任务 +3. 审核工单信息 +4. 检查物料齐套情况 +5. 检查产能情况 +6. 审核通过/驳回 + +**【提示】** 审核时可以调整工单数量和计划日期。 + +### 3.6 工单下发 + +**下发条件:** + +| 条件 | 检查项 | 说明 | +|------|--------|------| +| 信息完整 | 所有必填项已填写 | ✓ | +| 审核通过 | 工单状态为已审核 | ✓ | +| BOM有效 | BOM已审核生效 | ✓ | +| 工艺有效 | 工艺路线已审核生效 | ✓ | +| 物料齐套 | 所需物料库存充足 | ✓ | +| 产线可用 | 产线处于可用状态 | ✓ | + +**下发步骤:** + +1. 选择已审核工单 +2. 点击【下发】按钮 +3. 系统执行齐套检查 +4. 齐套检查通过 +5. 确认下发信息 +6. 工单状态变为"已下发" + +**【注意】** 齐套检查不通过时,需要先补充物料或调整工单。 + +### 3.7 工单变更 + +**变更类型:** + +| 变更类型 | 说明 | 变更影响 | +|---------|------|---------| +| 数量调整 | 增加/减少生产数量 | 影响物料需求 | +| 计划调整 | 调整计划日期 | 影响排程 | +| 产线变更 | 变更生产产线 | 影响排程 | +| 工序调整 | 调整工序顺序 | 影响工艺 | +| 紧急插单 | 调整工单优先级 | 影响排程 | + +**变更流程:** + +``` +变更申请 → 变更审核 → 变更执行 → 变更确认 +``` + +**【提示】** 工单在生产中变更需要谨慎,可能影响正在进行的生产作业。 + +## 4. 报工管理 + +### 4.1 报工类型 + +| 报工类型 | 说明 | 时机 | +|---------|------|------| +| 开工报工 | 工序开始作业 | 工序开工时 | +| 完工报工 | 工序完成作业 | 工序完工时 | +| 异常报工 | 工序异常暂停 | 发生异常时 | +| 交接班报工 | 交接班记录 | 交接班时 | + +### 4.2 报工流程 + +**工序报工流程:** + +``` +开工报工 → 工序作业 → 完工报工 → 下一工序 +``` + +**详细流程:** + +``` +┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ +│ 开工 │───▶│ 作业 │───▶│ 完工 │───▶│ 质检 │ +│ 报工 │ │ 进行中 │ │ 报工 │ │ 判定 │ +└──────────┘ └──────────┘ └──────────┘ └──────────┘ + │ + ┌──────────────────────────────────────┘ + │ + ▼ + ┌──────────┐ + │ 工序 │ + │ 流转 │ + └──────────┘ +``` + +### 4.3 开工报工 + +**操作步骤:** + +1. 进入【生产管理】→【报工管理】 +2. 选择待开工的工单 +3. 选择工序 +4. 填写开工信息: + - 开工时间 + - 作业人员 + - 设备选择 +5. 提交开工报工 +6. 系统记录开工时间 + +**【提示】** 开工报工后,系统会锁定该工序,防止重复开工。 + +### 4.4 完工报工 + +**操作步骤:** + +1. 选择已开工的工单 +2. 选择工序 +3. 填写完工信息: + - 完工数量 + - 合格数量 + - 不良品数量 + - 不良原因(如有) + - 作业时间 + - 物料消耗(如需) +4. 提交完工报工 +5. 系统自动触发质量检验(如配置了检验点) + +**完工报工信息:** + +| 字段 | 说明 | 是否必填 | +|------|------|---------| +| 完工数量 | 本次完工数量 | ✓ | +| 合格数量 | 合格品数量 | ✓ | +| 不良品数量 | 不良品数量 | - | +| 不良原因 | 不良原因描述 | - | +| 作业工时 | 实际作业时间 | ✓ | +| 物料消耗 | 消耗的物料数量 | - | + +### 4.5 报工数据 + +**报工记录信息:** + +| 数据项 | 说明 | +|--------|------| +| 报工时间 | 报工操作时间 | +| 报工类型 | 开工/完工/异常 | +| 工单编号 | 关联工单 | +| 工序编号 | 关联工序 | +| 作业人员 | 执行作业的人员 | +| 设备编号 | 使用的设备 | +| 报工数量 | 报工数量 | +| 合格率 | 合格数量/报工数量 | +| 作业工时 | 实际作业时间 | + +## 5. 生产监控 + +### 5.1 监控内容 + +**实时监控数据:** + +| 监控项 | 说明 | 更新频率 | +|--------|------|---------| +| 工单进度 | 各工单完成情况 | 实时 | +| 工序进度 | 各工序完成情况 | 实时 | +| 产量统计 | 当日/当班产量 | 实时 | +| 不良品率 | 不良品比例 | 实时 | +| 设备状态 | 设备运行状态 | 实时 | +| 人员状态 | 作业人员状态 | 实时 | + +### 5.2 监控看板 + +**生产看板展示:** + +``` +┌─────────────────────────────────────────────────────────────┐ +│ 生产监控看板 │ +├─────────────────────────────────────────────────────────────┤ +│ │ +│ 今日生产概况: │ +│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ +│ │ 计划产量 │ │ 实际产量 │ │ 达成率 │ │ +│ │ 10000 │ │ 9520 │ │ 95.2% │ │ +│ └──────────────┘ └──────────────┘ └──────────────┘ │ +│ │ +│ 产线状态: │ +│ ┌─────────────────────────────────────────────────────┐ │ +│ │ SMT-A线 ████████████░░░░ 80% 运行中 │ │ +│ │ SMT-B线 ██████████████░░ 85% 运行中 │ │ +│ │ 组装-A线 ██████████░░░░░░ 60% 运行中 │ │ +│ └─────────────────────────────────────────────────────┘ │ +│ │ +└─────────────────────────────────────────────────────────────┘ +``` + +### 5.3 工序流转控制 + +**流转规则:** + +| 流转类型 | 说明 | 配置要求 | +|---------|------|---------| +| 顺序流转 | 按工艺顺序依次作业 | 工艺路线定义 | +| 并行流转 | 多工序同时作业 | 工艺路线定义 | +| 条件流转 | 根据条件选择工序 | 流转条件配置 | + +**工序开工条件:** + +| 条件项 | 检查内容 | +|--------|---------| +| 前工序完成 | 前工序是否完工 | +| 物料齐套 | 物料是否到位 | +| 设备就绪 | 设备是否空闲 | +| 人员就绪 | 作业人员是否到位 | + +## 6. 物料流转 + +### 6.1 投料管理 + +**投料流程:** + +``` +领料申请 → 仓库备料 → 扫描投料 → 系统确认 +``` + +**投料方式:** + +| 方式 | 说明 | 适用场景 | +|------|------|---------| +| 按工单投料 | 根据工单BOM投料 | 批量生产 | +| 按工序投料 | 根据工序需求投料 | 多工序生产 | +| 按产线投料 | 产线批量投料 | 连续生产 | +| 自动投料 | 系统自动控制投料 | 自动化产线 | + +### 6.2 物料消耗记录 + +**消耗数据:** + +| 数据项 | 说明 | +|--------|------| +| 物料编码 | 消耗的物料 | +| 物料批次 | 物料批次号 | +| 消耗数量 | 本次消耗数量 | +| 消耗时间 | 消耗时间 | +| 关联工单 | 关联的工单 | +| 关联工序 | 关联的工序 | +| 消耗方式 | 实际消耗/损耗 | + +### 6.3 在制品(WIP)管理 + +**WIP监控:** + +| 监控项 | 说明 | +|--------|------| +| 在制工单数 | 正在生产的工单数量 | +| 在制工序数 | 各工序进行中的数量 | +| 在制数量 | 各工序在制数量 | +| 流转时间 | 工件在各工序流转时间 | +| 堆积情况 | 各工序堆积情况 | + +## 7. 生产统计与分析 + +### 7.1 生产报表 + +| 报表类型 | 说明 | 使用对象 | +|---------|------|---------| +| 生产日报 | 每日生产情况统计 | 车间主管 | +| 生产月报 | 每月生产情况统计 | 生产经理 | +| 工单统计 | 工单执行情况统计 | 计划员 | +| 产量统计 | 产量完成情况统计 | 生产主管 | +| 质量统计 | 生产质量情况统计 | 质量主管 | + +### 7.2 生产指标 + +**核心KPI指标:** + +| 指标 | 计算公式 | 说明 | +|------|---------|------| +| 产量达成率 | 实际产量/计划产量×100% | 目标:≥100% | +| 生产合格率 | 合格数量/总数量×100% | 目标:≥98% | +| 工时利用率 | 实际工时/可用工时×100% | 目标:≥85% | +| 工序流转时间 | 各工序平均流转时间 | 越短越好 | +| 在制品周转 | WIP数量/日产量 | 目标:3-5天 | + +### 7.3 生产分析 + +**分析维度:** + +| 分析维度 | 分析内容 | +|---------|---------| +| 产能分析 | 产能利用率、瓶颈分析 | +| 效率分析 | OEE分析、效率提升空间 | +| 质量分析 | 不良品分析、质量趋势 | +| 物料分析 | 物料消耗分析、超耗分析 | +| 工时分析 | 工时利用分析、加班分析 | + +--- + +**生产管理篇完** diff --git a/docs/business/quality.md b/docs/business/quality.md new file mode 100644 index 0000000..3a87e68 --- /dev/null +++ b/docs/business/quality.md @@ -0,0 +1,452 @@ +# 质量与追溯 + +## 1. 功能概述 + +质量管理模块实现从原材料到成品的全流程质量控制,包括来料检验、过程检验、成品检验、质量异常处理和追溯管理,确保产品质量稳定可控。 + +**核心功能:** + +| 功能 | 说明 | +|------|------| +| 检验标准 | 检验项目、检验标准定义 | +| IQC检验 | 来料质量控制 | +| IPQC检验 | 过程质量控制 | +| FQC/OQC | 成品/出货检验 | +| 质量异常 | 不良品处理、MRB管理 | +| 质量追溯 | 正向/逆向追溯 | + +## 2. 质量管理体系 + +### 2.1 质量管理流程 + +**全面质量管理流程:** + +``` +原材料检验 → 生产过程控制 → 成品检验 → 出货检验 + │ │ │ │ + ▼ ▼ ▼ ▼ + IQC IPQC FQC OQC +``` + +### 2.2 质量管理原则 + +| 原则 | 说明 | +|------|------| +| 预防为主 | 将质量控制前移到设计和生产阶段 | +| 全员参与 | 质量是每一个人的责任 | +| 过程控制 | 关注生产过程的每一个环节 | +| 持续改进 | 不断优化质量管理体系 | +| 数据驱动 | 基于数据分析做出决策 | + +## 3. 检验标准管理 + +### 3.1 检验标准定义 + +**检验标准组成:** + +| 组成要素 | 说明 | +|---------|------| +| 检验类型 | IQC/IPQC/FQC/OQC | +| 检验项目 | 具体检验的项目 | +| 检验方法 | 如何进行检验 | +| 判断标准 | 合格/不合格的判定依据 | +| 检验设备 | 需要的检验设备 | +| 抽样方案 | 抽样数量和规则 | + +### 3.2 检验项目类型 + +| 项目类型 | 说明 | 示例 | +|---------|------|------| +| 外观检验 | 视觉检查 | 颜色、形状、表面质量 | +| 尺寸检验 | 尺寸测量 | 长、宽、高、直径 | +| 功能检验 | 功能测试 | 电气性能、机械性能 | +| 性能检验 | 性能测试 | 寿命、可靠性 | +| 安全检验 | 安全测试 | 绝缘、耐压 | + +### 3.3 检验标准创建 + +**创建步骤:** + +1. 进入【质量管理】→【检验标准】 +2. 点击【新建检验标准】 +3. 填写标准信息: + - 标准编码 + - 标准名称 + - 适用产品 + - 检验类型 +4. 添加检验项目 +5. 定义检验方法 +6. 设置判断标准 +7. 保存检验标准 + +**【提示】** 检验标准需要经过审核后才能生效使用。 + +### 3.4 抽样方案 + +**抽样标准:** + +| 抽样标准 | 说明 | 适用场景 | +|---------|------|---------| +| GB/T 2828.1 | 正常检验一次抽样方案 | 常规检验 | +| GB/T 2829 | 周期检验抽样方案 | 定期抽检 | +| AQL抽样 | 允收质量水平抽样 | 大批量检验 | +| 全检 | 100%检验 | 关键项目 | + +**AQL标准示例:** + +| 检验批数量 | AQL 1.0 | AQL 2.5 | AQL 4.0 | +|-----------|---------|---------|---------| +| 26-50 | 3 | 5 | 7 | +| 51-90 | 5 | 7 | 10 | +| 91-150 | 8 | 12 | 18 | +| 151-280 | 13 | 18 | 25 | + +## 4. 来料检验(IQC) + +### 4.1 IQC流程 + +**IQC完整流程:** + +``` +┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ +│ 到货 │───▶│ 入库单 │───▶│ IQC │───▶│ 判定 │ +│ 接收 │ │ 创建 │ │ 检验 │ │ 判定 │ +└──────────┘ └──────────┘ └──────────┘ └──────────┘ + │ + ▼ + ┌──────────────────────────────────┐ + │ 不合格处理 │ + │ ┌──────┐ ┌──────┐ ┌──────┐ │ + │ │ 退货 │ │ 让步 │ │ 报废 │ │ + │ │ │ │ 接收 │ │ │ │ + │ └──────┘ └──────┘ └──────┘ │ + └──────────────────────────────────┘ +``` + +### 4.2 IQC检验执行 + +**检验步骤:** + +1. 供应商送货到达 +2. 仓管员创建入库单 +3. 系统自动推送检验任务到IQC +4. IQC检验员领取检验任务 +5. 执行来料检验: + - 核对送货单与订单 + - 外观检验 + - 数量核对 + - 抽样检验 +6. 记录检验数据 +7. 判定检验结果 + +**检验判定:** + +| 判定结果 | 说明 | 处理方式 | +|---------|------|---------| +| 合格 | 允许入库 | 直接入库 | +| 让步接收 | 特殊放行 | 需审批 | +| 拒收 | 退货处理 | 退回供应商 | + +### 4.3 IQC检验记录 + +**检验记录信息:** + +| 记录项 | 说明 | +|--------|------| +| 检验单号 | IQC检验单编号 | +| 供应商 | 物料供应商 | +| 物料编码 | 检验的物料 | +| 物料批次 | 物料批次号 | +| 到货数量 | 到货数量 | +| 抽样数量 | 抽样检验数量 | +| 合格数量 | 合格数量 | +| 不良数量 | 不良数量 | +| 合格率 | 合格数量/抽样数量 | +| 检验结论 | 合格/不合格 | +| 检验员 | 执行检验的人员 | +| 检验时间 | 检验时间 | + +## 5. 过程检验(IPQC) + +### 5.1 IPQC类型 + +| 检验类型 | 时机 | 说明 | +|---------|------|------| +| 首件检验 | 每批次开始生产时 | 第一件产品的检验 | +| 巡检 | 生产过程中 | 定期巡查检验 | +| 抽检 | 按抽样方案 | 随机抽样检验 | +| 末件检验 | 每批次结束生产时 | 最后一件产品的检验 | + +### 5.2 首件检验 + +**首件检验流程:** + +``` +开工生产 → 首件制作 → 首件检验 → 判定合格 → 批量生产 + │ + ▼ + 判定不合格 + │ + ▼ + 原因分析整改 +``` + +**首件检验时机:** + +| 时机 | 说明 | +|------|------| +| 换班首件 | 交接班后第一件 | +| 换料首件 | 更换物料后第一件 | +| 换工艺首件 | 调整工艺后第一件 | +| 设备维修后首件 | 设备维修后第一件 | + +### 5.3 巡检管理 + +**巡检要点:** + +| 巡检项目 | 检查内容 | 检查方法 | +|---------|---------|---------| +| 工艺参数 | 温度、压力、时间 | 查看设备参数 | +| 物料使用 | 物料是否正确 | 核对物料标识 | +| 作业方法 | 作业是否规范 | 观察作业过程 | +| 产品外观 | 外观是否正常 | 视觉检查 | +| 设备状态 | 设备是否正常 | 查看设备运行状态 | + +**巡检记录:** + +| 记录项 | 说明 | +|--------|------| +| 巡检时间 | 巡检时间 | +| 巡检工位 | 巡检的工位 | +| 巡检人员 | 执行巡检的人员 | +| 巡检项目 | 检查的项目 | +| 检查结果 | 检查结果 | +| 异常描述 | 发现的问题(如有) | + +## 6. 成品检验(FQC/OQC) + +### 6.1 FQC(最终检验) + +**FQC检验内容:** + +| 检验类别 | 检验项目 | +|---------|---------| +| 外观检验 | 颜色、标识、包装 | +| 尺寸检验 | 外形尺寸 | +| 功能检验 | 电气性能测试 | +| 安全检验 | 安全项目测试 | +| 可靠性检验 | 老化测试等 | + +### 6.2 OQC(出货检验) + +**OQC检验内容:** + +| 检验项目 | 说明 | +|---------|------| +| 数量核对 | 核对出货数量 | +| 外观检查 | 检查包装外观 | +| 标识检查 | 检查标签、标识 | +| 随机抽检 | 按抽样方案抽检 | +| 文档检查 | 检查随货文件 | + +### 6.3 成品入库流程 + +**入库条件:** + +``` +FQC检验合格 → OQC检验合格 → 包装完成 → 成品入库 +``` + +**入库要求:** + +| 要求项 | 说明 | +|--------|------| +| 检验完成 | FQC/OQC检验必须完成 | +| 检验合格 | 检验结果必须为合格 | +| 批次标识 | 必须有批次标识 | +| 包装完整 | 包装必须完整无损 | +| 数量准确 | 数量必须准确 | + +## 7. 质量异常处理 + +### 7.1 不良品分类 + +| 不良类别 | 说明 | 处理方式 | +|---------|------|---------| +| 外观不良 | 颜色、形状、表面缺陷 | 返工/报废 | +| 尺寸不良 | 尺寸超出公差范围 | 返工/降级 | +| 功能不良 | 功能不达标 | 返工/报废 | +| 性能不良 | 性能不达标 | 返工/降级 | +| 安全不良 | 存在安全隐患 | 报废 | + +### 7.2 MRB处理流程 + +**MRB流程:** + +``` +┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ +│ 不良品 │───▶│ MRB │───▶│ 评审 │───▶│ 处置 │ +│ 识别 │ │ 发起 │ │ 判定 │ │ 执行 │ +└──────────┘ └──────────┘ └──────────┘ └──────────┘ +``` + +**MRB处置方式:** + +| 处置方式 | 说明 | 审批要求 | +|---------|------|---------| +| 返工 | 返回工序重新加工 | 需要审批 | +| 降级 | 降低产品等级使用 | 需要审批 | +| 让步接收 | 特殊情况下接收使用 | 高层审批 | +| 报废 | 直接报废处理 | 需要审批 | +| 退货 | 退回供应商 | 联系供应商 | + +### 7.3 质量异常处理步骤 + +**处理步骤:** + +1. 发现质量问题 +2. 隔离不合格品 +3. 标识不合格品 +4. 创建MRB单 +5. 质量评审 +6. 评审结果判定 +7. 执行处置方案 +8. 处置确认 + +**【提示】** 不合格品必须隔离存放,防止误用。 + +## 8. 质量追溯 + +### 8.1 追溯内容 + +**追溯数据要素:** + +| 追溯要素 | 追溯内容 | +|---------|---------| +| 物料来源 | 原材料供应商、批次 | +| 生产过程 | 工序、设备、人员 | +| 质量数据 | 检验记录、不良品 | +| 设备数据 | 设备参数、状态 | +| 环境数据 | 生产环境条件 | + +### 8.2 正向追溯 + +**正向追溯流程:** + +``` +物料批次 → 半成品批次 → 成品批次 → 客户 +``` + +**追溯查询:** + +1. 输入成品批次号 +2. 查询成品生产信息: + - 生产工单 + - 生产工序 + - 生产时间 + - 作业人员 + - 使用设备 +3. 查询使用的物料: + - 物料批次 + - 供应商 + - IQC检验结果 +4. 继续追溯物料的上游 + +### 8.3 逆向追溯 + +**逆向追溯流程:** + +``` +成品批次 → 半成品批次 → 物料批次 → 供应商 +``` + +**追溯查询:** + +1. 输入物料批次号 +2. 查询物料使用情况: + - 使用的工单 + - 使用的工序 + - 生产的成品批次 +3. 查询成品去向: + - 出货记录 + - 客户信息 + +### 8.4 追溯查询示例 + +**查询场景:** 客户投诉某批次产品有质量问题 + +**追溯步骤:** + +1. 根据客户提供的批次号查询 +2. 追溯该批次的: + - 生产工单信息 + - 各工序生产情况 + - 使用物料批次 + - 物料供应商 + - 质量检验记录 +3. 分析质量问题原因 +4. 确定影响范围 +5. 通知相关客户 +6. 制定改进措施 + +**追溯结果示例:** + +| 项目 | 信息 | +|------|------| +| 成品批次 | LOT-20260410-001 | +| 产品型号 | PCB-1000 | +| 生产工单 | WO-20260410001 | +| 生产日期 | 2026-04-10 | +| 生产产线 | SMT-A线 | +| 作业人员 | 张三、李四 | +| 使用物料 | 焊锡批次LOT-S-001(供应商:A公司) | +| 检验记录 | 首件合格、巡检合格 | +| 出货记录 | 出货给B客户,数量1000PCS | + +## 9. 质量统计分析 + +### 9.1 质量指标 + +**核心质量KPI:** + +| 指标 | 计算公式 | 目标值 | +|------|---------|--------| +| 来料合格率 | IQC合格批数/IQC总批数×100% | ≥98% | +| 过程合格率 | IPQC合格数/IPQC总检验数×100% | ≥99% | +| 成品合格率 | FQC合格数/FQC总检验数×100% | ≥99.5% | +| 不良品率 | 不良品数/总生产数×100% | ≤1% | +| 批次追溯率 | 追溯成功批次/总批次×100% | 100% | + +### 9.2 质量报表 + +| 报表类型 | 说明 | 使用对象 | +|---------|------|---------| +| IQC日报 | 来料检验每日统计 | IQC组长 | +| IPQC日报 | 过程检验每日统计 | IPQC组长 | +| 质量月报 | 质量月度汇总报告 | 质量经理 | +| 不良品分析 | 不良品原因分析 | 质量工程师 | +| 趋势分析 | 质量趋势分析 | 质量主管 | + +### 9.3 SPC统计过程控制 + +**控制图监控:** + +| 控制图类型 | 监控内容 | 适用场景 | +|-----------|---------|---------| +| X-bar图 | 平均值监控 | 计量数据 | +| R图 | 极差监控 | 计量数据 | +| P图 | 不良率监控 | 计数数据 | +| C图 | 缺陷数监控 | 计数数据 | + +**异常判定规则:** + +| 规则 | 判定条件 | 说明 | +|------|---------|------| +| 规则1 | 1点超出控制限 | 单点异常 | +| 规则2 | 连续9点在中心线同一侧 | 偏移异常 | +| 规则3 | 连续6点递增或递减 | 趋势异常 | +| 规则4 | 连续14点交替上下 | 周期性异常 | + +--- + +**质量与追溯篇完** diff --git a/docs/getting-started/quick-start.md b/docs/getting-started/quick-start.md new file mode 100644 index 0000000..031dbe1 --- /dev/null +++ b/docs/getting-started/quick-start.md @@ -0,0 +1,372 @@ +# 快速入门 + +## 1. 系统登录 + +### 1.1 登录前准备 + +在登录系统前,请确保您已完成以下准备工作: + +| 准备项 | 说明 | +|--------|------| +| 账户开通 | 联系系统管理员申请账户 | +| 浏览器准备 | 建议使用 Chrome、Firefox 或 Edge 浏览器 | +| 网络连接 | 确保能够访问 MES 系统服务器 | +| 客户端安装 | 部分功能需要安装插件(首次登录时提示) | + +### 1.2 登录操作 + +**登录步骤:** + +1. 打开浏览器,输入系统地址(如:`http://mes.yourcompany.com`) +2. 进入登录页面 +3. 输入用户名和密码 +4. 点击【登录】按钮 +5. 系统验证通过后进入主界面 + +**【提示】** 首次登录建议修改初始密码,并完善个人资料。 + +### 1.3 忘记密码 + +如果您忘记了密码,可以通过以下方式重置: + +| 重置方式 | 操作方法 | +|---------|---------| +| 自助找回 | 点击登录页"忘记密码",通过绑定的邮箱/手机重置 | +| 管理员重置 | 联系系统管理员手动重置密码 | + +## 2. 系统主界面 + +### 2.1 主界面布局 + +``` +┌────────────────────────────────────────────────────────────┐ +│ 顶部栏 │ +│ ┌──────────────┬──────────────────────────────┬─────────┐ │ +│ │ Logo │ 系统名称 │ 用户信息 │ │ +│ └──────────────┴──────────────────────────────┴─────────┘ │ +├────────────────────────────────────────────────────────────┤ +│ 导航栏 │ +│ ┌────────────────────────────────────────────────────────┐ │ +│ │ 📊 首页 │ 📋 生产 │ 📦 质量 │ 🏭 仓库 │ 🔧 设备 │ ⚙️ 系统 │ │ +│ └────────────────────────────────────────────────────────┘ │ +├────────────────────────────────────────────────────────────┤ +│ │ +│ 主内容区 │ +│ ┌────────────────────────────────────────────────────────┐ │ +│ │ │ │ +│ │ 欢迎使用 HF-MES v5.0 制造执行系统 │ │ +│ │ │ │ +│ │ ┌─────────────┐ ┌─────────────┐ │ │ +│ │ │ 待办事项 │ │ 生产看板 │ │ │ +│ │ └─────────────┘ └─────────────┘ │ │ +│ │ │ │ +│ └────────────────────────────────────────────────────────┘ │ +│ │ +└────────────────────────────────────────────────────────────┘ +``` + +### 2.2 功能菜单 + +系统主要功能模块包括: + +| 模块 | 功能说明 | +|------|---------| +| 首页 | 系统首页、待办事项、生产看板 | +| 生产管理 | 工单管理、报工管理、生产监控 | +| 质量管理 | 来料检验、过程检验、质量追溯 | +| 仓储物流 | 入库管理、出库管理、库存管理 | +| 设备管理 | 设备台账、点检保养、故障维修 | +| 系统管理 | 用户管理、角色权限、参数配置 | + +### 2.3 快捷操作 + +| 快捷键 | 功能 | +|--------|------| +| `Ctrl + S` | 保存 | +| `Ctrl + N` | 新建 | +| `Ctrl + F` | 搜索/筛选 | +| `F5` | 刷新 | +| `Esc` | 取消 | + +## 3. 基础操作流程 + +### 3.1 工单完整流程 + +下面以一个典型的生产工单为例,介绍完整的操作流程: + +**流程概览:** + +``` +创建工单 → 审核工单 → 下发工单 → 领料投料 → 开工报工 → 工序流转 → 完工入库 +``` + +#### 3.1.1 创建工单 + +**操作步骤:** + +1. 进入【生产管理】→【工单管理】 +2. 点击【新建】按钮 +3. 填写工单信息: + - 选择产品 + - 填写生产数量 + - 设置计划开始/结束日期 + - 选择产线/车间 +4. 点击【保存】 + +**【提示】** 带 * 号的字段为必填项。 + +#### 3.1.2 审核工单 + +**操作步骤:** + +1. 在工单列表中找到待审核工单 +2. 点击工单编号查看详情 +3. 审核工单信息 +4. 点击【审核通过】或【驳回】 + +**【注意】** 审核驳回后需要修改后重新提交。 + +#### 3.1.3 下发工单 + +**操作步骤:** + +1. 在工单列表中找到已审核工单 +2. 点击【下发】按钮 +3. 系统自动检查物料齐套情况 +4. 齐套检查通过后确认下发 +5. 工单状态变更为"已下发" + +**【注意】** 下发前请确保物料、设备、人员已准备就绪。 + +#### 3.1.4 领料投料 + +**操作步骤:** + +1. 进入【仓储物流】→【领料管理】 +2. 点击【新建领料单】 +3. 选择对应工单 +4. 系统自动带出物料清单 +5. 确认领料数量 +6. 提交审核 +7. 审核通过后到仓库领料 +8. 扫描物料条码投料 + +#### 3.1.5 报工管理 + +**工序报工流程:** + +``` +开工报工 → 工序作业 → 完工报工 +``` + +**开工报工:** + +1. 进入【生产管理】→【报工管理】 +2. 选择对应工单 +3. 执行开工报工 +4. 记录开工时间 + +**完工报工:** + +1. 完成工序作业后 +2. 执行完工报工 +3. 填写完工数量、不良品数量 +4. 提交报工数据 + +#### 3.1.6 完工入库 + +**操作步骤:** + +1. 工单所有工序完成后 +2. 进入工单详情 +3. 点击【完工确认】 +4. 确认入库信息 +5. 生成入库单 +6. 物料入库到仓库 + +### 3.2 质量管理流程 + +#### 3.2.1 来料检验(IQC) + +**操作步骤:** + +1. 供应商送货到达 +2. 仓管员创建入库单 +3. 系统自动推送检验任务 +4. 质检员领取检验任务 +5. 执行来料检验 +6. 判定合格/不合格 +7. 不合格走MRB流程 + +#### 3.2.2 过程检验(IPQC) + +**检验时机:** + +| 检验类型 | 执行时机 | +|---------|---------| +| 首件检验 | 每批次产品开始生产时 | +| 巡检 | 生产过程中定期执行 | +| 抽检 | 按抽样方案定期执行 | +| 末件检验 | 每批次产品生产结束时 | + +### 3.3 仓储管理流程 + +#### 3.3.1 入库流程 + +``` +到货 → 创建入库单 → IQC检验 → 分配库位 → 上架确认 +``` + +#### 3.3.2 出库流程 + +``` +领料申请 → 审核 → 备料 → 扫描出库 → 投料生产 +``` + +## 4. 常用操作示例 + +### 4.1 如何查询工单 + +**方法一:通过列表筛选** + +1. 进入【生产管理】→【工单管理】 +2. 在筛选条件中输入查询条件: + - 工单编号 + - 产品名称 + - 工单状态 + - 日期范围 +3. 点击【查询】按钮 +4. 查看查询结果 + +**方法二:通过搜索框** + +1. 在页面顶部的搜索框中 +2. 输入工单编号或产品名称 +3. 按回车键搜索 +4. 系统自动跳转到工单详情 + +### 4.2 如何进行报工 + +**操作步骤:** + +1. 进入【生产管理】→【报工管理】 +2. 当前用户待报工的工单列表 +3. 选择需要报工的工单 +4. 选择工序 +5. 填写报工信息: + - 报工类型(开工/完工) + - 报工数量 + - 不良品数量(如有) + - 作业时间 +6. 提交报工数据 + +**【提示】** 完工报工后,系统会自动触发下一工序的开工作业。 + +### 4.3 如何查看生产进度 + +**操作步骤:** + +1. 进入【生产管理】→【生产监控】 +2. 选择产线或工单 +3. 查看实时生产状态: + - 工序进度 + - 产量统计 + - 不良品率 + - 达成率 +4. 点击详情查看更多信息 + +### 4.4 如何进行批次追溯 + +**操作步骤:** + +1. 进入【质量管理】→【质量追溯】 +2. 输入追溯信息: + - 批次号 + - 产品编号 + - 日期范围 +3. 执行追溯查询 +4. 查看追溯结果: + - 物料来源 + - 生产过程 + - 质量数据 + - 出货去向 + +## 5. 常见问题速查 + +### 5.1 登录问题 + +**Q1: 提示"用户名或密码错误"** + +| 可能原因 | 解决方案 | +|---------|---------| +| 输入错误 | 检查用户名和密码 | +| 大小写问题 | 确认Caps Lock未开启 | +| 账户锁定 | 等待30分钟或联系管理员 | + +**Q2: 提示"无访问权限"** + +| 可能原因 | 解决方案 | +|---------|---------| +| 未分配角色 | 联系管理员分配权限 | +| 权限不足 | 申请更高权限 | + +### 5.2 操作问题 + +**Q3: 页面显示异常** + +| 解决方案 | 操作方式 | +|---------|---------| +| 清除缓存 | Ctrl + Shift + Delete | +| 更换浏览器 | 使用推荐的浏览器 | +| 检查分辨率 | 确保分辨率≥1280×720 | + +**Q4: 数据保存失败** + +| 可能原因 | 解决方案 | +|---------|---------| +| 必填字段未填 | 检查必填项 | +| 数据格式错误 | 修正数据格式 | +| 网络问题 | 检查网络连接 | +| 会话过期 | 重新登录 | + +### 5.3 业务问题 + +**Q5: 工单无法下发** + +| 可能原因 | 解决方案 | +|---------|---------| +| 物料未齐套 | 检查物料库存 | +| 产线不可用 | 检查产线状态 | +| 工艺路线未维护 | 维护工艺路线 | + +**Q6: 报工数据无法提交** + +| 可能原因 | 解决方案 | +|---------|---------| +| 工序未开工 | 先执行开工报工 | +| 数据格式错误 | 检查输入数据 | +| 数量超出范围 | 确认数量在允许范围内 | + +## 6. 下一步学习 + +恭喜您完成快速入门学习!接下来您可以: + +| 学习路径 | 建议内容 | +|---------|---------| +| 深入学习 | 阅读详细的功能模块文档 | +| 日常操作 | 根据实际业务场景练习 | +| 问题解决 | 查看异常处理与技术支持章节 | + +**推荐学习顺序:** + +1. 📖 [系统概述](/guide/system-overview) - 了解系统整体架构 +2. 📋 [基础数据管理](/basic/data-management) - 掌握基础数据配置 +3. 🏭 [生产管理](/business/production) - 熟悉生产业务操作 +4. 📊 [质量管理](/business/quality) - 了解质量控制流程 +5. ⚙️ [系统运维](/operation/system-operation) - 学习系统管理 + +**【提示】** 如遇到问题,请查阅 [异常处理与技术支持](/operation/technical-support) 章节。 + +--- + +**快速入门篇完** diff --git a/docs/guide/document-guide.md b/docs/guide/document-guide.md new file mode 100644 index 0000000..d231b3b --- /dev/null +++ b/docs/guide/document-guide.md @@ -0,0 +1,154 @@ +# 文档说明 + +## 1. 文档简介 + +本文档为 HF-MES v5.0 制造执行系统的完整使用指南,旨在帮助用户快速掌握系统的各项功能,顺利完成日常生产管理任务。 + +**文档版本:** v1.0 +**发布日期:** 2026-04-10 +**适用版本:** HF-MES v5.0 + +## 2. 文档结构 + +| 章节 | 名称 | 主要内容 | +|------|------|---------| +| 文档说明篇 | 文档管理 | 文档说明、系统概述 | +| 快速入门篇 | 新手入门 | 系统登录、快速入门指南 | +| 基础配置篇 | 基础配置 | 基础数据管理、设备基础信息 | +| 生产管理篇 | 生产执行 | 生产计划、工单管理、报工管理 | +| 质量管理篇 | 质量追溯 | 质量检验、质量控制、追溯管理 | +| 仓储物流篇 | 仓储管理 | 入库管理、出库管理、库存管理 | +| 数据集成篇 | 系统集成 | 数据接口、系统集成方案 | +| 报表分析篇 | 数据分析 | 生产报表、质量报表、设备报表 | +| 系统运维篇 | 系统管理 | 系统管理、系统运维 | +| 技术支持篇 | 技术支持 | 异常处理、技术支持 | +| 附录篇 | 参考资料 | 术语表、流程图、更新日志 | + +## 3. 文档约定 + +### 3.1 菜单路径表示 + +本文档使用【】表示菜单路径,例如: + +- 【系统管理】→【用户管理】表示:点击"系统管理"菜单,然后点击"用户管理"子菜单 + +### 3.2 界面元素表示 + +| 表示方式 | 含义 | 示例 | +|---------|------|------| +| 【按钮】 | 操作按钮 | 【保存】、【取消】 | +| 「输入框」 | 输入控件 | 「工单编号」 | +| 「下拉框」 | 选择控件 | 「工单状态」 | +| ☐ | 复选框 | ☐ 启用 | +| ○ | 单选按钮 | ○ 新增 | + +### 3.3 操作步骤表示 + +**操作步骤格式:** + +1. 第一步操作 +2. 第二步操作 +3. 第三步操作 + +### 3.4 注意事项 + +| 标记 | 含义 | +|------|------| +| 【注意】 | 需要特别注意的事项 | +| 【提示】 | 有助于操作的提示信息 | +| 【重要】 | 必须遵守的重要规则 | + +## 4. 符号说明 + +| 符号 | 说明 | 示例 | +|------|------|------| +| → | 操作流向 | 工单创建 → 工单审核 | +| ───▶ | 流程跳转 | 提交 ───▶ 审批 | +| │ | 分支判断 | 是 │ 否 | +| □ | 可选项 | □ 启用 | +| ■ | 已选项 | ■ 启用 | +| - | 列表项 | - 列表内容 | + +## 5. 排版规范 + +### 5.1 标题层级 + +使用 # 符号表示标题层级: + +- # 一级标题 +- ## 二级标题 +- ### 三级标题 +- #### 四级标题 + +### 5.2 表格格式 + +| 列头1 | 列头2 | 列头3 | +|-------|-------|-------| +| 内容1 | 内容2 | 内容3 | +| 内容4 | 内容5 | 内容6 | + +### 5.3 代码块 + +使用 ``` 包裹代码块,例如: + +```bash +# 示例命令 +cd /opt/mes +./start.sh +``` + +## 6. 文档维护 + +### 6.1 更新频率 + +- 常规更新:每月一次 +- 紧急更新:随时发布 + +### 6.2 反馈渠道 + +如果您发现文档内容有误或需要补充,请通过以下方式反馈: + +- 邮箱:docs-feedback@hfmes.com +- 服务热线:400-XXX-XXXX + +## 7. Mermaid 流程图测试 + +### 7.1 基础流程图示例 + +以下是一个简单的工单处理流程图示例: + +```mermaid +graph TD + A[工单创建] --> B[工单审核] + B --> C{审核结果} + C -->|通过| D[工单执行] + C -->|驳回| E[修改工单] + E --> A + D --> F[报工确认] + F --> G[质量检验] + G --> H{检验结果} + H -->|合格| I[入库] + H -->|不合格| J[返工] + J --> D +``` + +### 7.2 序列图示例 + +```mermaid +sequenceDiagram + participant 用户 + participant 系统 + participant 设备 + 用户->>系统: 提交工单 + 系统->>设备: 下发生产指令 + 设备->>系统: 报工数据 + 系统->>用户: 返回处理结果 +``` + +## 8. 版权声明 + +本文档版权归 HF-MES 所属公司所有,未经许可不得擅自复制、传播或修改。 + +--- + +**文档说明篇完** diff --git a/docs/guide/system-overview.md b/docs/guide/system-overview.md new file mode 100644 index 0000000..5413de7 --- /dev/null +++ b/docs/guide/system-overview.md @@ -0,0 +1,376 @@ +# 文档说明 +## 系统概述 + +## 1. 系统简介 + +HF-MES v5.0(Manufacturing Execution System)是一套面向制造企业的生产执行管理系统,旨在实现生产过程的数字化、智能化管理,提高生产效率、保证产品质量、降低运营成本。 + +### 1.1 系统定位 + +``` +┌─────────────────────────────────────────────────────────┐ +│ 企业信息化金字塔 │ +├─────────────────────────────────────────────────────────┤ +│ │ +│ ┌─────────────┐ │ +│ │ ERP │ 企业资源计划 │ +│ │ 企业管理层 │ │ +│ └──────┬──────┘ │ +│ │ │ +│ ┌──────▼──────┐ │ +│ │ MES │ 制造执行系统 │ +│ │ 生产执行层 │ ← 我们的系统 │ +│ └──────┬──────┘ │ +│ │ │ +│ ┌──────▼──────┐ │ +│ │ SCADA │ 数据采集与监控系统 │ +│ │ 设备控制层 │ │ +│ └─────────────┘ │ +│ │ +└─────────────────────────────────────────────────────────┘ +``` + +### 1.2 核心价值 + +| 核心价值 | 说明 | 客户收益 | +|---------|------|---------| +| 生产透明化 | 实时监控生产进度 | 掌握实时生产状态 | +| 过程可追溯 | 全流程数据追溯 | 质量问题快速定位 | +| 质量可控 | 全过程质量控制 | 产品质量有保障 | +| 效率提升 | 优化生产流程 | 生产效率提升 | +| 成本降低 | 减少浪费损耗 | 生产成本下降 | + +## 2. 系统架构 + +### 2.1 技术架构 + +**系统采用前后端分离架构:** + +| 层级 | 技术栈 | 说明 | +|------|--------|------| +| 前端展示层 | Vue.js + Element UI | 用户界面交互 | +| 后端服务层 | Java Spring Boot | 业务逻辑处理 | +| 数据存储层 | MySQL + Redis | 数据存储与缓存 | +| 消息中间件 | RabbitMQ | 异步消息处理 | +| 文件存储 | MinIO/OSS | 文件与附件存储 | + +### 2.2 系统部署架构 + +``` +┌────────────────────────────────────────────────────────────┐ +│ 客户端层 │ +│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ +│ │ Web浏览器 │ │ 移动端 │ │ 大屏展示 │ │ +│ └──────────────┘ └──────────────┘ └──────────────┘ │ +└────────────────────────────────────────────────────────────┘ + │ + ▼ +┌────────────────────────────────────────────────────────────┐ +│ 应用服务层 │ +│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ +│ │ Web服务 │ │ API服务 │ │ 定时服务 │ │ +│ │ (Nginx) │ │ (Gateway) │ │ (Scheduler) │ │ +│ └──────────────┘ └──────────────┘ └──────────────┘ │ +└────────────────────────────────────────────────────────────┘ + │ + ▼ +┌────────────────────────────────────────────────────────────┐ +│ 数据服务层 │ +│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ +│ │ 数据库 │ │ 缓存 │ │ 消息队列 │ │ +│ │ (MySQL) │ │ (Redis) │ │ (RabbitMQ) │ │ +│ └──────────────┘ └──────────────┘ └──────────────┘ │ +└────────────────────────────────────────────────────────────┘ + │ + ▼ +┌────────────────────────────────────────────────────────────┐ +│ 设备集成层 │ +│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ +│ │ PLC/SCADA │ │ RFID │ │ 条码枪 │ │ +│ └──────────────┘ └──────────────┘ └──────────────┘ │ +└────────────────────────────────────────────────────────────┘ +``` + +### 2.3 系统网络架构 + +``` + ┌─────────────────┐ + │ 互联网用户 │ + └────────┬────────┘ + │ + ▼ +┌────────────────────────────────────────────────────────────┐ +│ 企业内网 │ +│ │ +│ ┌────────────────────┐ ┌────────────────────┐ │ +│ │ MES应用服务器 │◀────▶│ ERP服务器 │ │ +│ │ (应用集群) │ │ (SAP/用友/金蝶) │ │ +│ └─────────┬──────────┘ └────────────────────┘ │ +│ │ │ +│ ├──────────┬──────────┬──────────┐ │ +│ │ │ │ │ │ +│ ▼ ▼ ▼ ▼ │ +│ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ │ +│ │ 车间1 │ │ 车间2 │ │ 车间3 │ │ 仓库 │ │ +│ │ 客户端 │ │ 客户端 │ │ 客户端 │ │ 客户端 │ │ +│ └────────┘ └────────┘ └────────┘ └────────┘ │ +│ │ │ │ │ │ +│ └──────────┴──────────┴──────────┘ │ +│ │ │ +│ ▼ │ +│ ┌────────────┐ │ +│ │ 数据库服务器 │ │ +│ │ (主备集群) │ │ +│ └────────────┘ │ +└────────────────────────────────────────────────────────────┘ +``` + +## 3. 功能模块 + +### 3.1 功能模块总览 + +``` +┌─────────────────────────────────────────────────────────┐ +│ HF-MES v5.0 功能架构 │ +├─────────────────────────────────────────────────────────┤ +│ │ +│ ┌─────────────────────────────────────────────────┐ │ +│ │ 系统管理层 │ │ +│ │ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ │ │ +│ │ │ 用户管理 │ │ 角色管理 │ │ 权限管理 │ │ 参数配置 │ │ │ +│ │ └────────┘ └────────┘ └────────┘ └────────┘ │ │ +│ └─────────────────────────────────────────────────┘ │ +│ │ +│ ┌─────────────────────────────────────────────────┐ │ +│ │ 生产管理层 │ │ +│ │ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ │ │ +│ │ │ 生产计划 │ │ 工单管理 │ │ 报工管理 │ │ 生产调度 │ │ │ +│ │ └────────┘ └────────┘ └────────┘ └────────┘ │ │ +│ └─────────────────────────────────────────────────┘ │ +│ │ +│ ┌─────────────────────────────────────────────────┐ │ +│ │ 质量管理层 │ │ +│ │ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ │ │ +│ │ │ 来料检验 │ │ 过程检验 │ │ 成品检验 │ │ 质量追溯 │ │ │ +│ │ └────────┘ └────────┘ └────────┘ └────────┘ │ │ +│ └─────────────────────────────────────────────────┘ │ +│ │ +│ ┌─────────────────────────────────────────────────┐ │ +│ │ 仓储管理层 │ │ +│ │ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ │ │ +│ │ │ 入库管理 │ │ 出库管理 │ │ 库存管理 │ │ 库位管理 │ │ │ +│ │ └────────┘ └────────┘ └────────┘ └────────┘ │ │ +│ └─────────────────────────────────────────────────┘ │ +│ │ +│ ┌─────────────────────────────────────────────────┐ │ +│ │ 设备管理层 │ │ +│ │ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ │ │ +│ │ │ 设备台账 │ │ 点检保养 │ │ 故障维修 │ │ OEE分析 │ │ │ +│ │ └────────┘ └────────┘ └────────┘ └────────┘ │ │ +│ └─────────────────────────────────────────────────┘ │ +│ │ +│ ┌─────────────────────────────────────────────────┐ │ +│ │ 报表管理层 │ │ +│ │ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ │ │ +│ │ │ 生产报表 │ │ 质量报表 │ │ 设备报表 │ │ 库存报表 │ │ │ +│ │ └────────┘ └────────┘ └────────┘ └────────┘ │ │ +│ └─────────────────────────────────────────────────┘ │ +│ │ +└─────────────────────────────────────────────────────────┘ +``` + +### 3.2 模块详细介绍 + +#### 3.2.1 生产管理模块 + +**核心功能:** + +| 功能 | 说明 | +|------|------| +| 生产计划 | 根据销售订单生成生产计划 | +| 工单管理 | 工单的创建、审核、下发、变更 | +| 报工管理 | 生产报工、完工确认 | +| 生产监控 | 实时监控生产进度、状态 | +| 工序管理 | 工艺路线、工序定义 | +| 物料流转 | 投料、领料、半成品流转 | + +#### 3.2.2 质量管理模块 + +**核心功能:** + +| 功能 | 说明 | +|------|------| +| 检验标准 | 检验项目、检验标准定义 | +| IQC检验 | 来料质量控制 | +| IPQC检验 | 过程质量控制 | +| FQC/OQC | 成品/出货检验 | +| 质量异常 | 不良品处理、MRB管理 | +| 质量追溯 | 正向/逆向追溯 | + +#### 3.2.3 仓储管理模块 + +**核心功能:** + +| 功能 | 说明 | +|------|------| +| 入库管理 | 采购入库、生产入库、其他入库 | +| 出库管理 | 生产领料、销售出库、其他出库 | +| 库存管理 | 库存查询、库存预警、库存盘点 | +| 库位管理 | 库位定义、库位分配 | +| 批次管理 | 批次定义、批次追溯 | +| 齐套检查 | 物料齐套性检查 | + +#### 3.2.4 设备管理模块 + +**核心功能:** + +| 功能 | 说明 | +|------|------| +| 设备台账 | 设备信息、分类管理 | +| 点检管理 | 日常点检、点检标准 | +| 保养管理 | 计划保养、保养标准 | +| 故障管理 | 故障报修、维修记录 | +| OEE分析 | 设备综合效率分析 | +| 备件管理 | 备件库存、备件领用 | + +### 3.3 功能矩阵 + +| 功能模块 | 基础版 | 标准版 | 高级版 | 旗舰版 | +|---------|--------|--------|--------|--------| +| 生产管理 | ✓ | ✓ | ✓ | ✓ | +| 质量管理 | ✓ | ✓ | ✓ | ✓ | +| 仓储管理 | ✓ | ✓ | ✓ | ✓ | +| 设备管理 | - | ✓ | ✓ | ✓ | +| 报表分析 | 基础 | 基础 | 高级 | 高级 | +| 系统集成 | - | 基础 | 高级 | 高级 | +| 二次开发 | - | - | ✓ | ✓ | +| 私有化部署 | - | - | ✓ | ✓ | + +## 4. 适用行业 + +### 4.1 典型行业应用 + +| 行业 | 典型场景 | +|------|---------| +| 电子制造 | SMT贴片、组装测试、包装出货 | +| 汽车零部件 | 冲压、焊接、涂装、总装 | +| 机械加工 | CNC加工、装配、检测 | +| 食品饮料 | 配方生产、灌装包装、质量追溯 | +| 医药化工 | 制剂生产、包装、批次追溯 | +| 新能源 | 电池生产、光伏组件 | + +### 4.2 行业解决方案 + +针对不同行业,我们提供定制化的解决方案,包括: + +- 行业专用功能模块 +- 行业最佳实践流程 +- 行业特色报表模板 +- 行业集成接口方案 + +## 5. 性能指标 + +### 5.1 系统性能 + +| 指标 | 标准值 | 说明 | +|------|--------|------| +| 系统响应时间 | < 3秒 | 页面加载时间 | +| 接口响应时间 | < 1秒 | API调用响应 | +| 并发用户数 | 500+ | 同时在线用户 | +| 数据处理能力 | 10万+/日 | 日处理单据量 | +| 系统可用性 | 99.9% | 系统正常运行时间 | +| 数据备份 | 每日增量 | 自动备份机制 | + +### 5.2 运行环境 + +| 环境要求 | 配置 | +|---------|------| +| 浏览器 | Chrome、Firefox、Edge、360等 | +| 最低分辨率 | 1280×720 | +| 网络要求 | 局域网≥100M | +| 服务器配置 | CPU 8核+,内存 16G+,硬盘 500G+ | + +## 6. 安全特性 + +### 6.1 安全保障体系 + +| 安全维度 | 保障措施 | +|---------|---------| +| 身份认证 | 用户名密码、LDAP集成 | +| 权限控制 | RBAC权限模型 | +| 数据安全 | 传输加密、敏感字段加密 | +| 操作审计 | 完整操作日志记录 | +| 安全策略 | 密码策略、会话管理 | +| 数据备份 | 自动备份、异地备份 | + +### 6.2 权限模型 + +``` +┌─────────────────────────────────────────────────────────┐ +│ 权限模型 │ +├─────────────────────────────────────────────────────────┤ +│ │ +│ ┌─────────┐ │ +│ │ 用户 │ ←────────────┐ │ +│ └────┬────┘ │ │ +│ │ │ 归属 │ +│ ▼ │ │ +│ ┌─────────┐ │ │ +│ │ 角色 │──────────────┼──────────┐ │ +│ └────┬────┘ │ │ │ +│ │ │ 拥有 │ │ +│ ▼ │ ▼ │ +│ ┌─────────┐ │ ┌───────────┐ │ +│ │ 权限点 │◀─────────────┘ │ 功能菜单 │ │ +│ └─────────┘ └───────────┘ │ +│ │ +│ ┌─────────────────────────────────────────────────┐ │ +│ │ 数据权限 │ │ +│ │ 工厂级 ─ 车间级 ─ 产线级 ─ 个人数据 │ │ +│ └─────────────────────────────────────────────────┘ │ +│ │ +└─────────────────────────────────────────────────────────┘ +``` + +## 7. 与其他系统集成 + +### 7.1 系统集成架构 + +``` +┌─────────────────────────────────────────────────────────┐ +│ 系统集成架构 │ +├─────────────────────────────────────────────────────────┤ +│ │ +│ ┌───────────┐ │ +│ │ ERP │ ←──→ 物料主数据、工单、采购订单 │ +│ │ (SAP) │ │ +│ └─────┬─────┘ │ +│ │ │ +│ ▼ │ +│ ┌───────────┐ │ +│ │ MES │ ←──→ 生产执行、质量数据、设备数据 │ +│ │ (自身) │ │ +│ └─────┬─────┘ │ +│ │ │ +│ ▼ │ +│ ┌───────────┐ │ +│ │ SCADA │ ←──→ 设备数据、实时状态 │ +│ │ (设备层) │ │ +│ └───────────┘ │ +│ │ +└─────────────────────────────────────────────────────────┘ +``` + +### 7.2 集成方式 + +| 集成方式 | 说明 | 适用场景 | +|---------|------|---------| +| API接口 | RESTful API | 实时数据交换 | +| 中间库 | 数据库直连 | 批量数据同步 | +| 文件导入 | Excel/CSV导入 | 周期性数据交换 | +| 消息队列 | 事件驱动 | 异步消息通知 | +| WebService | SOAP接口 | 传统系统集成 | + +--- + +**系统概述篇完** diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 0000000..dfec56e --- /dev/null +++ b/docs/index.md @@ -0,0 +1,38 @@ +--- +layout: home + +hero: + name: "HF-MES v5.0" + text: "制造执行系统使用手册" + tagline: "数字化生产 · 智能化执行 · 透明化管理" + actions: + - theme: brand + text: 快速入门 + link: /getting-started/quick-start + - theme: alt + text: 系统概述 + link: /guide/system-overview + +features: + - icon: 🏭 + title: 生产管理 + details: 全面覆盖生产计划、工单执行、报工管理、过程监控等核心业务 + - icon: 📊 + title: 质量管理 + details: 实现从原材料到成品的全流程质量控制与追溯管理 + - icon: 📦 + title: 仓储物流 + details: 优化库存管理、入出库流程、物料流转与追溯 + - icon: 🔧 + title: 设备管理 + details: 设备全生命周期管理、点检保养、OEE分析 + - icon: 🔗 + title: 系统集成 + details: 与ERP、SCADA等系统无缝集成,数据互联互通 + - icon: 📈 + title: 报表分析 + details: 丰富的统计分析报表,辅助决策支持 + +footer: | + HF-MES v5.0 使用手册 · Copyright © 2026 All Rights Reserved +--- diff --git a/docs/integration/data-integration.md b/docs/integration/data-integration.md new file mode 100644 index 0000000..f05ea21 --- /dev/null +++ b/docs/integration/data-integration.md @@ -0,0 +1,289 @@ +# 数据与集成 + +## 1. 功能概述 + +数据与集成模块实现 MES 系统与 ERP、SCADA、PLC 等系统的数据互联互通,打通企业信息孤岛,实现数据共享和业务协同。 + +**核心功能:** + +| 功能 | 说明 | +|------|------| +| 接口管理 | 接口配置与监控 | +| 数据同步 | 主数据同步 | +| 消息集成 | 消息队列集成 | +| 文件传输 | 文件数据交换 | + +## 2. 系统集成架构 + +### 2.1 集成架构图 + +``` +┌─────────────────────────────────────────────────────────────┐ +│ 企业应用集成架构 │ +├─────────────────────────────────────────────────────────────┤ +│ │ +│ ┌─────────┐ │ +│ │ ERP │ ─────────────────────────────────────────▶ │ +│ │ SAP/用友 │ 物料主数据、采购订单、生产计划、销售订单 │ +│ └────┬────┘ │ +│ │ │ +│ │ ◀───────────────────────────────────────── │ +│ │ 工单完工、质量数据、库存数据 │ +│ ▼ │ +│ ┌─────────┐ │ +│ │ MES │ │ +│ │ MES │ ──────────────────────────────────────────▶ │ +│ └────┬────┘ 工单执行、产量数据、质量数据 │ +│ │ │ +│ │ ◀───────────────────────────────────────── │ +│ │ 设备运行参数、状态数据 │ +│ ▼ │ +│ ┌─────────┐ │ +│ │ SCADA │ ──────────────────────────────────────────▶ │ +│ │ PLC/RTU │ 设备数据采集、实时监控 │ +│ └─────────┘ │ +│ │ +│ ┌─────────────────────────────────────────────────────┐ │ +│ │ 集成中间件 │ │ +│ │ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ │ │ +│ │ │消息队列 │ │数据总线 │ │文件传输 │ │API网关 │ │ │ +│ │ └────────┘ └────────┘ └────────┘ └────────┘ │ │ +│ └─────────────────────────────────────────────────────┘ │ +│ │ +└─────────────────────────────────────────────────────────────┘ +``` + +### 2.2 集成方式对比 + +| 集成方式 | 实时性 | 复杂度 | 数据量 | 适用场景 | +|---------|--------|--------|--------|---------| +| API接口 | 高 | 中 | 中 | 实时交互 | +| 中间库 | 低 | 低 | 大 | 批量同步 | +| 消息队列 | 中 | 中 | 中 | 异步消息 | +| 文件交换 | 低 | 低 | 大 | 批量数据 | + +## 3. 接口管理 + +### 3.1 接口类型 + +| 接口类型 | 说明 | 方向 | +|---------|------|------| +| 上游接口 | 从其他系统获取数据 | ERP→MES | +| 下游接口 | 向其他系统推送数据 | MES→ERP | +| 双向接口 | 双向数据交换 | ↔ | + +### 3.2 常用接口 + +**与ERP系统集成:** + +| 接口名称 | 方向 | 数据内容 | +|---------|------|---------| +| 物料主数据 | ERP→MES | 物料信息、BOM、工艺 | +| 供应商主数据 | ERP→MES | 供应商信息 | +| 客户主数据 | ERP→MES | 客户信息 | +| 采购订单 | ERP→MES | 采购到货信息 | +| 生产工单 | ERP→MES | 生产工单 | +| 完工汇报 | MES→ERP | 工单完工信息 | +| 质量数据 | MES→ERP | 检验数据 | +| 库存数据 | MES→ERP | 库存数据 | + +**与SCADA系统集成:** + +| 接口名称 | 方向 | 数据内容 | +|---------|------|---------| +| 设备状态 | SCADA→MES | 设备运行状态 | +| 产量数据 | SCADA→MES | 实时产量 | +| 工艺参数 | SCADA→MES | 温度、压力等 | +| 报警信息 | SCADA→MES | 设备报警 | +| 生产指令 | MES→SCADA | 生产控制指令 | + +### 3.3 接口配置 + +**接口配置要素:** + +| 配置项 | 说明 | +|--------|------| +| 接口编码 | 接口唯一标识 | +| 接口名称 | 接口名称 | +| 接口类型 | API/中间库/消息 | +| 源系统 | 数据来源系统 | +| 目标系统 | 数据目标系统 | +| 接口地址 | API地址或数据库连接 | +| 认证方式 | 认证类型和凭证 | +| 数据格式 | JSON/XML/DB | + +**接口配置示例:** + +| 接口项 | 配置值 | +|--------|--------| +| 接口编码 | INT-001 | +| 接口名称 | 物料主数据同步 | +| 接口类型 | API | +| 源系统 | ERP | +| 目标系统 | MES | +| 接口地址 | http://erp-api/mdm/materials | +| 认证方式 | Token认证 | +| 调用频率 | 每日全量+实时增量 | + +## 4. 数据同步 + +### 4.1 同步策略 + +| 同步策略 | 说明 | 触发方式 | +|---------|------|---------| +| 实时同步 | 数据变化即时同步 | 事件触发 | +| 定时同步 | 按计划定时同步 | 定时任务 | +| 手动同步 | 手工触发同步 | 人工操作 | +| 全量同步 | 全部数据同步 | 定时/手动 | +| 增量同步 | 仅同步变化数据 | 事件/定时 | + +### 4.2 主数据同步 + +**物料数据同步:** + +| 同步字段 | 说明 | 必填 | +|---------|------|------| +| 物料编码 | 物料唯一标识 | ✓ | +| 物料名称 | 物料名称 | ✓ | +| 规格型号 | 规格型号 | - | +| 计量单位 | 计量单位 | ✓ | +| 物料分类 | 物料类别 | - | +| 安全库存 | 安全库存量 | - | +| 采购周期 | 采购提前期 | - | + +**BOM数据同步:** + +| 同步字段 | 说明 | 必填 | +|---------|------|------| +| 产品编码 | 父项物料编码 | ✓ | +| 物料编码 | 子项物料编码 | ✓ | +| 用量 | 物料用量 | ✓ | +| 损耗率 | 损耗百分比 | - | +| 工序序号 | 物料使用的工序 | - | + +### 4.3 业务数据同步 + +**工单数据同步:** + +| 同步方向 | 数据内容 | +|---------|---------| +| ERP→MES | 工单编号、产品、数量、计划日期 | +| MES→ERP | 完工数量、完工时间、不良数量 | + +**库存数据同步:** + +| 同步方向 | 数据内容 | +|---------|---------| +| MES→ERP | 入库数量、出库数量、库存数量 | + +## 5. 消息集成 + +### 5.1 消息类型 + +| 消息类型 | 说明 | 用途 | +|---------|------|------| +| 生产消息 | 生产相关事件 | 工单开工、完工等 | +| 质量消息 | 质量相关事件 | 检验完成、不良发生等 | +| 设备消息 | 设备相关事件 | 设备故障、报警等 | +| 库存消息 | 库存相关事件 | 入库、出库等 | + +### 5.2 消息格式 + +**消息标准格式:** + +```json +{ + "messageId": "MSG-20260410-001", + "messageType": "PRODUCTION_START", + "sourceSystem": "MES", + "targetSystem": "ERP", + "timestamp": "2026-04-10 10:00:00", + "data": { + "workOrderId": "WO-001", + "productId": "P001", + "quantity": 1000, + "startTime": "2026-04-10 10:00:00" + } +} +``` + +### 5.3 消息处理 + +| 处理模式 | 说明 | 特点 | +|---------|------|------| +| 即时处理 | 消息立即处理 | 低延迟 | +| 异步处理 | 消息队列缓冲 | 高吞吐 | +| 批量处理 | 消息批量处理 | 高效率 | + +## 6. 接口监控 + +### 6.1 监控指标 + +| 指标 | 说明 | 监控内容 | +|------|------|---------| +| 接口调用次数 | 接口调用统计 | 成功/失败次数 | +| 接口响应时间 | 接口响应速度 | 平均/最大响应时间 | +| 接口成功率 | 接口可用性 | 成功/总调用 | +| 数据同步时效 | 数据同步及时性 | 延迟时间 | + +### 6.2 接口日志 + +| 日志类型 | 说明 | 保留时间 | +|---------|------|---------| +| 调用日志 | 接口调用记录 | 6个月 | +| 请求日志 | 请求报文记录 | 3个月 | +| 响应日志 | 响应报文记录 | 3个月 | +| 错误日志 | 错误信息记录 | 12个月 | + +### 6.3 异常处理 + +| 异常类型 | 处理方式 | +|---------|---------| +| 网络异常 | 自动重试(3次) | +| 超时异常 | 增加超时时间 | +| 认证异常 | 重新获取Token | +| 数据异常 | 记录异常,人工处理 | + +## 7. 数据转换 + +### 7.1 数据映射 + +**字段映射配置:** + +| 源字段 | 目标字段 | 转换规则 | +|--------|---------|---------| +| material_code | mat_code | 直接映射 | +| unit_price | cost | 单位转换(元→万元) | +| create_time | createDate | 时间格式转换 | + +### 7.2 数据校验 + +| 校验规则 | 说明 | +|---------|------| +| 必填校验 | 必填字段不能为空 | +| 格式校验 | 数据格式正确 | +| 长度校验 | 字段长度不超限 | +| 业务校验 | 业务规则校验 | + +## 8. 集成安全 + +### 8.1 认证方式 + +| 认证方式 | 说明 | 安全性 | +|---------|------|--------| +| 用户名密码 | 基础认证 | 中 | +| API Key | 接口密钥 | 中 | +| Token认证 | OAuth2.0 | 高 | +| 数字证书 | SSL证书 | 高 | + +### 8.2 传输安全 + +| 安全措施 | 说明 | +|---------|------| +| HTTPS | 数据传输加密 | +| 数据签名 | 数据完整性验证 | +| 数据脱敏 | 敏感数据保护 | + +--- + +**数据与集成篇完** diff --git a/docs/operation/system-operation.md b/docs/operation/system-operation.md new file mode 100644 index 0000000..50aa5ce --- /dev/null +++ b/docs/operation/system-operation.md @@ -0,0 +1,366 @@ +# 系统运维 + +## 1. 功能概述 + +系统管理与运维模块为系统管理员提供系统的配置、管理和运维功能,确保系统的稳定运行。 + +**核心功能:** + +| 功能 | 说明 | +|------|------| +| 系统参数配置 | 通用参数、业务参数 | +| 审批流程配置 | 审批流程定义 | +| 消息通知配置 | 通知渠道、模板 | +| 日志管理与审计 | 操作日志、安全日志 | +| 数据备份与恢复 | 备份策略、数据恢复 | +| 权限安全策略 | 密码策略、登录安全 | + +## 2. 系统参数配置 + +### 2.1 通用参数 + +**系统信息配置:** + +| 参数项 | 说明 | 默认值 | +|--------|------|--------| +| 系统名称 | 显示在系统标题 | HF-MES | +| 系统Logo | 登录页面Logo | - | +| 公司名称 | 系统所属公司 | - | +| 工作开始时间 | 默认上班时间 | 08:00 | +| 工作结束时间 | 默认下班时间 | 18:00 | +| 日期格式 | 日期显示格式 | YYYY-MM-DD | +| 时间格式 | 时间显示格式 | HH:mm:ss | + +### 2.2 业务参数 + +**生产参数配置:** + +| 参数项 | 说明 | 默认值 | +|--------|------|--------| +| 工序流转规则 | 顺序/并行 | 顺序 | +| 报工允许提前时间 | 报工可提前分钟数 | 10分钟 | +| 工单超期预警 | 提前预警天数 | 3天 | +| 报工允许滞后时间 | 报工可滞后分钟数 | 30分钟 | + +**质量参数配置:** + +| 参数项 | 说明 | 默认值 | +|--------|------|--------| +| 检验标准默认值 | 默认检验标准 | - | +| 批次号编码规则 | 批次号格式 | LOT-YYYYMMDD-XXX | +| 允收质量水平(AQL) | 默认AQL值 | 1.0 | + +**设备参数配置:** + +| 参数项 | 说明 | 默认值 | +|--------|------|--------| +| 点检提醒时间 | 提前提醒分钟数 | 30分钟 | +| 保养提醒时间 | 提前提醒天数 | 7天 | +| 设备OEE计算周期 | OEE统计周期 | 日/月 | + +**【注意】** 修改系统参数可能影响业务运行,请谨慎操作。 + +## 3. 审批流程配置 + +### 3.1 审批流程定义 + +**流程要素:** + +| 要素 | 说明 | +|------|------| +| 流程编码 | 流程唯一标识 | +| 流程名称 | 流程显示名称 | +| 流程类型 | 审批的业务类型 | +| 流程节点 | 审批环节 | +| 审批人 | 各环节审批人 | +| 流转规则 | 条件判断 | + +### 3.2 流程类型 + +| 流程类型 | 说明 | 示例 | +|---------|------|------| +| 工单变更 | 工单信息变更审批 | 数量调整、延期 | +| 物料放行 | 物料特殊放行审批 | 让步接收 | +| 设备报损 | 设备报废审批 | 设备报废 | +| 不良处理 | 不良品处置审批 | MRB处理 | +| 补料审批 | 生产补料审批 | 物料追加 | + +### 3.3 审批节点配置 + +**节点配置项:** + +| 配置项 | 说明 | +|--------|------| +| 节点名称 | 审批环节名称 | +| 审批角色 | 审批人角色 | +| 审批人 | 具体审批人员 | +| 审批方式 | 会签/或签 | +| 时限要求 | 审批时限 | +| 超时处理 | 超时后处理方式 | + +**审批方式:** + +| 方式 | 说明 | +|------|------| +| 会签 | 所有审批人必须全部通过 | +| 或签 | 任意一个审批人通过即可 | + +## 4. 消息通知配置 + +### 4.1 通知渠道 + +| 渠道类型 | 说明 | 配置要求 | +|---------|------|---------| +| 系统消息 | 系统内消息通知 | 内置 | +| 邮件通知 | 发送至邮箱 | 配置SMTP | +| 短信通知 | 发送至手机 | 配置短信网关 | +| 钉钉通知 | 钉钉企业消息 | 钉钉应用配置 | +| 企业微信 | 企业微信消息 | 企业微信配置 | + +### 4.2 通知类型配置 + +| 业务事件 | 通知类型 | 接收人 | +|---------|---------|--------| +| 工单下發 | 系统消息/邮件 | 车间主管 | +| 工单完工 | 系统消息 | 计划员 | +| 质量异常 | 系统消息/短信 | 质量工程师 | +| 设备故障 | 系统消息/短信 | 设备工程师 | +| 库存不足 | 系统消息/邮件 | 仓管员 | +| 审批待办 | 系统消息/邮件 | 审批人 | + +### 4.3 通知模板 + +**模板配置项:** + +| 配置项 | 说明 | +|--------|------| +| 模板编码 | 模板唯一标识 | +| 模板名称 | 模板名称 | +| 通知渠道 | 发送渠道 | +| 标题模板 | 消息标题 | +| 内容模板 | 消息内容 | + +**模板变量:** + +| 变量 | 说明 | +|------|------| +| ${工单编号} | 工单编号 | +| ${产品名称} | 产品名称 | +| ${数量} | 数量 | +| ${时间} | 时间 | +| ${审批人} | 审批人姓名 | + +## 5. 日志管理与审计 + +### 5.1 日志类型 + +| 日志类型 | 说明 | 保留时间 | +|---------|------|---------| +| 操作日志 | 用户操作记录 | 6个月 | +| 系统日志 | 系统运行日志 | 3个月 | +| 接口日志 | 接口调用日志 | 6个月 | +| 异常日志 | 异常错误日志 | 12个月 | +| 安全日志 | 登录安全日志 | 12个月 | + +### 5.2 操作日志内容 + +| 记录项 | 说明 | +|--------|------| +| 操作时间 | 操作发生时间 | +| 用户账号 | 执行操作的用户 | +| 用户姓名 | 用户姓名 | +| 操作类型 | 操作类别 | +| 操作内容 | 具体操作描述 | +| 操作对象 | 操作的数据对象 | +| IP地址 | 操作人IP地址 | +| 结果 | 成功/失败 | + +### 5.3 日志查询 + +**查询条件:** + +| 查询维度 | 可选条件 | +|---------|---------| +| 时间范围 | 开始时间-结束时间 | +| 用户 | 操作人员 | +| 操作类型 | 新增/修改/删除等 | +| 操作模块 | 功能模块 | +| 操作结果 | 成功/失败 | + +### 5.4 审计报表 + +| 报表类型 | 说明 | +|---------|------| +| 用户操作统计 | 各用户操作频次 | +| 模块操作统计 | 各模块操作统计 | +| 异常操作统计 | 失败操作统计 | +| 登录审计 | 登录情况审计 | + +## 6. 数据备份与恢复 + +### 6.1 备份策略 + +| 备份类型 | 执行频率 | 保留份数 | 说明 | +|---------|---------|---------|------| +| 全量备份 | 每周 | 4份 | 每周一次完整备份 | +| 增量备份 | 每日 | 7份 | 每日备份增量数据 | +| 实时备份 | 实时 | - | 数据库日志备份 | + +### 6.2 备份配置 + +**备份任务配置:** + +| 配置项 | 说明 | +|--------|------| +| 任务名称 | 备份任务名称 | +| 备份类型 | 全量/增量 | +| 执行时间 | 备份执行时间 | +| 存储位置 | 备份文件存放位置 | +| 保留策略 | 备份保留份数 | +| 压缩方式 | 是否压缩 | + +### 6.3 手动备份 + +**操作步骤:** + +1. 进入【系统管理】→【数据备份】 +2. 点击【手动备份】 +3. 选择备份类型 +4. 点击【开始备份】 +5. 系统执行备份 +6. 完成后显示备份文件 + +### 6.4 数据恢复 + +**恢复操作步骤:** + +1. 进入【系统管理】→【数据恢复】 +2. 选择恢复时间点 +3. 选择备份文件 +4. 确认恢复信息 +5. 确认恢复(需输入确认码) +6. 系统执行恢复 +7. 恢复完成后重启服务 + +**【重要】** 数据恢复会覆盖当前数据,请确保已做好当前数据备份! + +## 7. 权限安全策略 + +### 7.1 密码策略 + +| 策略项 | 配置值 | 说明 | +|--------|--------|------| +| 最小长度 | 8位 | 密码最少位数 | +| 复杂度要求 | 必须包含字母和数字 | 复杂度规则 | +| 有效期 | 90天 | 密码有效天数 | +| 过期提醒 | 7天 | 过期前提醒 | +| 历史密码 | 5个 | 不能重复使用 | +| 尝试次数 | 5次 | 错误次数限制 | +| 锁定时间 | 30分钟 | 账户锁定时间 | + +### 7.2 登录安全 + +| 配置项 | 说明 | +|--------|------| +| 允许同时登录 | 是/否 | +| 会话超时时间 | 30分钟 | +| IP白名单 | 允许登录的IP | +| IP黑名单 | 禁止登录的IP | +| 异地登录提醒 | 是/否 | + +### 7.3 数据权限 + +**数据权限级别:** + +| 权限级别 | 说明 | +|---------|------| +| 全部数据 | 可查看所有数据 | +| 工厂级 | 只能查看所属工厂数据 | +| 车间级 | 只能查看所属车间数据 | +| 产线级 | 只能查看所属产线数据 | +| 个人数据 | 只能查看自己的数据 | + +## 8. 系统性能监控 + +### 8.1 监控指标 + +| 指标类别 | 具体指标 | 正常范围 | +|---------|---------|---------| +| 服务器性能 | CPU使用率 | < 80% | +| 服务器性能 | 内存使用率 | < 85% | +| 服务器性能 | 磁盘使用率 | < 90% | +| 数据库性能 | 连接数 | < 连接池上限 | +| 数据库性能 | 查询响应时间 | < 1秒 | +| 应用性能 | API响应时间 | < 3秒 | +| 应用性能 | 并发用户数 | < 许可数量 | + +### 8.2 监控面板 + +**监控面板展示:** + +``` +┌─────────────────────────────────────────────────────────────┐ +│ 系统监控面板 │ +├─────────────────────────────────────────────────────────────┤ +│ │ +│ 服务器状态 │ +│ ┌───────────────┐ ┌───────────────┐ ┌───────────────┐ │ +│ │ CPU │ │ 内存 │ │ 磁盘 │ │ +│ │ 45.2% │ │ 68.5% │ │ 52.3% │ │ +│ └───────────────┘ └───────────────┘ └───────────────┘ │ +│ │ +│ 应用服务状态 │ +│ ┌───────────────┐ ┌───────────────┐ ┌───────────────┐ │ +│ │ Web服务 │ │ API服务 │ │ 定时服务 │ │ +│ │ 正常 │ │ 正常 │ │ 正常 │ │ +│ └───────────────┘ └───────────────┘ └───────────────┘ │ +│ │ +│ 数据库状态 │ +│ ┌───────────────┐ ┌───────────────┐ ┌───────────────┐ │ +│ │ 连接数 │ │ 活跃会话 │ │ 查询响应 │ │ +│ │ 45/200 │ │ 12 │ │ 0.5秒 │ │ +│ └───────────────┘ └───────────────┘ └───────────────┘ │ +│ │ +└─────────────────────────────────────────────────────────────┘ +``` + +### 8.3 告警配置 + +| 告警项 | 告警条件 | 告警方式 | +|--------|---------|---------| +| CPU过高 | > 90% | 短信/邮件 | +| 内存过高 | > 95% | 短信/邮件 | +| 磁盘空间不足 | < 10% | 短信/邮件 | +| 服务宕机 | 服务停止 | 短信/电话 | +| 数据库连接满 | 100% | 短信/电话 | + +## 9. 版本升级 + +### 9.1 升级流程 + +``` +备份数据 → 下载升级 → 执行升级 → 验证功能 → 发布上线 +``` + +### 9.2 升级前检查 + +| 检查项 | 说明 | +|--------|------| +| 数据备份 | 确认数据已备份 | +| 环境检查 | 服务器环境符合要求 | +| 兼容性检查 | 确认升级包兼容 | +| 停机通知 | 通知相关人员 | +| 回滚方案 | 准备回滚方案 | + +### 9.3 升级后验证 + +| 验证项 | 说明 | +|--------|------| +| 服务启动 | 确认服务正常运行 | +| 功能验证 | 验证核心功能 | +| 数据验证 | 确认数据完整性 | +| 性能验证 | 确认系统性能正常 | + +--- + +**系统运维篇完** diff --git a/docs/operation/technical-support.md b/docs/operation/technical-support.md new file mode 100644 index 0000000..add5da4 --- /dev/null +++ b/docs/operation/technical-support.md @@ -0,0 +1,459 @@ +# 异常处理与技术支持 + +## 1. 功能概述 + +本章为用户提供常见问题的解决方案和获取技术支持的渠道,帮助用户快速解决使用过程中遇到的问题。 + +**主要内容:** + +| 内容 | 说明 | +|------|------| +| 常见问题FAQ | 各类常见问题解答 | +| 系统错误码说明 | 错误码及解决方案 | +| 故障排查指南 | 问题排查方法 | +| 技术支持联系方式 | 获取支持的渠道 | + +## 2. 常见问题FAQ + +### 2.1 登录相关问题 + +**Q1: 登录提示"用户名或密码错误"** + +| 可能原因 | 解决方案 | +|---------|---------| +| 输入错误 | 检查用户名和密码是否正确 | +| 大小写问题 | 检查是否开启了大小写敏感 | +| 键盘问题 | 确认Caps Lock未开启 | + +**Q2: 登录提示"账户已锁定"** + +| 可能原因 | 解决方案 | +|---------|---------| +| 多次登录失败 | 等待30分钟后自动解锁或联系管理员 | +| 账户被禁用 | 联系系统管理员启用账户 | + +**Q3: 登录提示"无访问权限"** + +| 可能原因 | 解决方案 | +|---------|---------| +| 未分配角色 | 联系管理员分配权限 | +| 角色权限不足 | 申请更高权限 | +| IP限制 | 检查是否在允许的IP范围内 | + +**Q4: 忘记密码怎么办?** + +| 解决方案 | 操作方式 | +|---------|---------| +| 自助找回 | 点击登录页"忘记密码",通过邮箱/手机重置 | +| 管理员重置 | 联系系统管理员重置密码 | + +### 2.2 生产管理相关问题 + +**Q5: 无法创建工单?** + +| 可能原因 | 解决方案 | +|---------|---------| +| 缺少产品BOM | 先维护产品BOM | +| 缺少工艺路线 | 先维护工艺路线 | +| 物料未齐套 | 确认物料库存充足 | +| 权限不足 | 联系管理员开通权限 | + +**Q6: 工单无法下发?** + +| 可能原因 | 解决方案 | +|---------|---------| +| 物料未齐套 | 检查物料库存 | +| 产线不可用 | 检查产线状态 | +| 工艺路线未维护 | 维护工艺路线 | +| 计划日期冲突 | 调整计划日期 | + +**Q7: 报工数据无法保存?** + +| 可能原因 | 解决方案 | +|---------|---------| +| 工序未开工 | 先执行开工报工 | +| 数据格式错误 | 检查输入数据格式 | +| 数量超出范围 | 确认数量在允许范围内 | +| 会话超时 | 重新登录 | + +### 2.3 质量管理相关问题 + +**Q8: 检验项目无法添加?** + +| 可能原因 | 解决方案 | +|---------|---------| +| 检验标准未维护 | 先创建检验标准 | +| 权限不足 | 联系管理员授权 | +| 数据格式错误 | 检查输入格式 | + +**Q9: 不良品如何处理?** + +| 处理方式 | 说明 | +|---------|------| +| 返工 | 将不良品返回工序重新加工 | +| 降级使用 | 降低产品等级使用 | +| 让步接收 | 经审批后特殊放行 | +| 报废 | 办理报废手续 | + +**Q10: 批次追溯查询无结果?** + +| 可能原因 | 解决方案 | +|---------|---------| +| 批次号输入错误 | 核对批次号 | +| 批次未纳入追溯 | 确认物料是否批次管理 | +| 数据未同步 | 联系管理员检查数据 | + +### 2.4 设备管理相关问题 + +**Q11: 点检任务未生成?** + +| 可能原因 | 解决方案 | +|---------|---------| +| 设备未配置点检标准 | 为设备配置点检标准 | +| 日期不在点检周期 | 确认点检周期配置 | +| 点检标准未启用 | 启用点检标准 | + +**Q12: 设备故障如何报修?** + +| 操作步骤 | 说明 | +|---------|------| +| 1. 发现故障 | 发现设备异常 | +| 2. 紧急评估 | 评估是否需要紧急停机 | +| 3. 提交报修 | 在设备管理中提交报修单 | +| 4. 维修处理 | 等待维修人员处理 | +| 5. 验收确认 | 维修完成后确认 | + +### 2.5 仓储物流相关问题 + +**Q13: 入库单无法确认?** + +| 可能原因 | 解决方案 | +|---------|---------| +| IQC未完成 | 完成来料检验 | +| 批次号重复 | 修改批次号 | +| 库位不可用 | 选择其他库位 | + +**Q14: 库存数据不准确?** + +| 可能原因 | 解决方案 | +|---------|---------| +| 单据未审核 | 审核相关单据 | +| 盘点差异 | 执行库存盘点 | +| 数据同步问题 | 联系管理员检查 | + +**Q15: 如何进行库存盘点?** + +| 操作步骤 | 说明 | +|---------|------| +| 1. 创建盘点单 | 选择仓库和物料 | +| 2. 执行盘点 | 现场清点数量 | +| 3. 录入实盘 | 输入实际数量 | +| 4. 差异审核 | 审核盘点差异 | +| 5. 账务调整 | 调整库存账务 | + +### 2.6 系统操作相关问题 + +**Q16: 页面显示不完整?** + +| 解决方案 | 操作方式 | +|---------|---------| +| 清除缓存 | 清除浏览器缓存 | +| 更换浏览器 | 使用推荐的浏览器 | +| 调整缩放 | 调整浏览器缩放比例 | +| 检查分辨率 | 确保屏幕分辨率达标 | + +**Q17: 数据导出失败?** + +| 可能原因 | 解决方案 | +|---------|---------| +| 数据量过大 | 分批导出 | +| 网络问题 | 检查网络连接 | +| 权限不足 | 联系管理员授权 | +| 格式不支持 | 更换导出格式 | + +**Q18: 审批流程无法流转?** + +| 可能原因 | 解决方案 | +|---------|---------| +| 审批人未配置 | 配置审批人 | +| 条件不满足 | 检查流转条件 | +| 审批人不在线 | 提醒审批人 | + +## 3. 系统错误码说明 + +### 3.1 错误码分类 + +| 错误码范围 | 错误类型 | 说明 | +|-----------|---------|------| +| 1000-1999 | 基础错误 | 系统基础错误 | +| 2000-2999 | 权限错误 | 权限相关错误 | +| 3000-3999 | 业务错误 | 业务逻辑错误 | +| 4000-4999 | 数据错误 | 数据验证错误 | +| 5000-5999 | 接口错误 | 外部接口错误 | +| 9000-9999 | 系统错误 | 系统内部错误 | + +### 3.2 权限类错误 + +| 错误码 | 错误信息 | 解决方案 | +|--------|---------|---------| +| 2001 | 无访问权限 | 联系管理员开通权限 | +| 2002 | 权限不足 | 申请更高权限 | +| 2003 | 角色未分配 | 联系管理员分配角色 | +| 2004 | 会话过期 | 重新登录系统 | +| 2005 | IP限制访问 | 在允许的IP范围内访问 | + +### 3.3 业务类错误 + +| 错误码 | 错误信息 | 解决方案 | +|--------|---------|---------| +| 3001 | 数据已存在 | 检查是否重复创建 | +| 3002 | 数据不存在 | 检查数据是否正确 | +| 3003 | 状态不允许操作 | 确认当前状态可执行操作 | +| 3004 | 数量超出范围 | 调整数量在允许范围内 | +| 3005 | 业务规则校验失败 | 检查是否符合业务规则 | +| 3006 | 关联数据不存在 | 检查关联数据是否完整 | +| 3007 | 数据被引用 | 解除数据引用关系后再操作 | + +### 3.4 数据类错误 + +| 错误码 | 错误信息 | 解决方案 | +|--------|---------|---------| +| 4001 | 必填字段为空 | 填写必填字段 | +| 4002 | 数据格式错误 | 检查数据格式 | +| 4003 | 字段长度超限 | 缩短输入内容 | +| 4004 | 数据类型不匹配 | 输入正确类型数据 | +| 4005 | 日期格式错误 | 使用正确的日期格式 | +| 4006 | 编码重复 | 使用不重复的编码 | + +### 3.5 接口类错误 + +| 错误码 | 错误信息 | 解决方案 | +|--------|---------|---------| +| 5001 | 接口连接超时 | 检查网络连接 | +| 5002 | 接口服务不可用 | 联系接口服务方 | +| 5003 | 接口认证失败 | 检查接口认证信息 | +| 5004 | 接口返回错误 | 查看接口返回信息 | +| 5005 | 数据同步失败 | 检查数据同步配置 | + +### 3.6 系统类错误 + +| 错误码 | 错误信息 | 解决方案 | +|--------|---------|---------| +| 9001 | 系统繁忙 | 稍后重试 | +| 9002 | 操作失败 | 重试或联系管理员 | +| 9003 | 服务器错误 | 联系技术支持 | +| 9004 | 数据库错误 | 联系技术支持 | +| 9005 | 内存不足 | 重启服务或扩容 | + +## 4. 故障排查指南 + +### 4.1 登录故障排查 + +**排查流程:** + +``` +开始 + │ + ▼ +登录失败? + │ + ├─── 是 ───→ 检查错误提示 + │ │ + │ ▼ + │ ┌─────────┐ + │ │ 错误码? │ + │ └────┬────┘ + │ │ + │ ┌─────────┼─────────┐ + │ │ │ │ + │ ▼ ▼ ▼ + │ 权限类 业务类 系统类 + │ 错误 错误 错误 + │ │ │ │ + │ │ │ ▼ + │ │ │ 重试/联系技术支持 + │ │ + │检查用户状态/权限 + │ + └─── 否 ───→ 排查完成 +``` + +### 4.2 性能问题排查 + +**排查项目:** + +| 检查项 | 检查方法 | 正常范围 | +|--------|---------|---------| +| CPU使用率 | 任务管理器查看 | < 80% | +| 内存使用率 | 任务管理器查看 | < 85% | +| 磁盘IO | 性能监控查看 | < 70% | +| 网络延迟 | ping命令测试 | < 100ms | +| 数据库连接 | 查看连接池 | < 最大值 | +| 慢查询 | 查看查询日志 | < 1秒 | + +**常见性能问题:** + +| 问题现象 | 可能原因 | 解决方案 | +|---------|---------|---------| +| 页面加载慢 | 网络问题/服务器负载高 | 检查网络/扩容 | +| 操作响应慢 | 数据库查询慢 | 优化索引/增加资源 | +| 报表生成慢 | 数据量大 | 分批查询/优化SQL | +| 批量操作慢 | 逐条处理 | 改为批量处理 | + +### 4.3 数据问题排查 + +**数据一致性检查:** + +| 检查项 | 检查方法 | 处理方式 | +|--------|---------|---------| +| 库存账实不符 | 盘点核对 | 差异审核调整 | +| 批次追溯断裂 | 查询追溯链 | 检查数据录入 | +| 工单状态异常 | 查看工单日志 | 修正状态 | +| 检验数据缺失 | 查看检验记录 | 补录数据 | + +### 4.4 接口问题排查 + +**排查步骤:** + +1. 检查接口配置 +2. 验证认证信息 +3. 测试网络连通性 +4. 检查接口日志 +5. 验证数据格式 +6. 联系接口提供方 + +## 5. 日志提取指南 + +### 5.1 日志类型 + +| 日志类型 | 存储位置 | 用途 | +|---------|---------|------| +| 操作日志 | /logs/operation/ | 追踪用户操作 | +| 错误日志 | /logs/error/ | 排查系统错误 | +| 接口日志 | /logs/interface/ | 排查接口问题 | +| 数据库日志 | /logs/database/ | 排查数据问题 | +| 应用日志 | /logs/application/ | 排查应用问题 | + +### 5.2 日志提取方法 + +**方法一:通过系统导出** + +1. 进入【系统管理】→【日志管理】 +2. 选择日志类型 +3. 设置查询条件 +4. 点击【导出】 +5. 下载日志文件 + +**方法二:通过服务器访问** + +```bash +# 访问日志目录 +cd /opt/mes/logs + +# 查看最近的错误日志 +tail -n 100 error.log + +# 搜索指定关键词 +grep "error" error.log + +# 导出指定时间段的日志 +grep "2026-04-10" error.log > error_20260410.log +``` + +### 5.3 日志提取注意事项 + +- 【注意】日志提取可能包含敏感信息,请注意保密 +- 【提示】提供日志时请注明问题发生的时间范围 +- 【重要】请在问题复现时同步提取日志 + +## 6. 问题上报指南 + +### 6.1 问题分类 + +| 问题级别 | 定义 | 响应时间 | 解决时间 | +|---------|------|---------|---------| +| 紧急 | 系统不可用、业务中断 | 1小时 | 4小时 | +| 高 | 核心功能异常 | 4小时 | 24小时 | +| 中 | 一般功能异常 | 8小时 | 72小时 | +| 低 | 界面/体验问题 | 24小时 | 1周 | + +### 6.2 问题描述模板 + +请按以下模板描述问题: + +``` +【问题描述】 +1. 问题现象:描述遇到的问题 +2. 期望行为:期望的正确行为 +3. 实际行为:实际发生的错误 + +【问题环境】 +- 模块:xxx +- 页面:xxx +- 浏览器:xxx +- 操作系统:xxx + +【复现步骤】 +1. +2. +3. + +【错误信息】 +(错误提示截图或文字) + +【附件】 +- 截图 +- 日志 +- 相关数据 +``` + +## 7. 技术支持联系方式 + +### 7.1 常规支持 + +| 联系方式 | 信息 | +|---------|------| +| 服务热线 | 400-XXX-XXXX | +| 服务邮箱 | support@hfmes.com | +| 服务时间 | 周一至周五 9:00-18:00 | +| 紧急电话 | 138-XXXX-XXXX | + +### 7.2 在线支持 + +| 渠道 | 说明 | +|------|------| +| 企业微信群 | 专属服务群 | +| 在线工单 | 提交技术支持工单 | +| 远程协助 | TeamViewer远程支持 | + +### 7.3 服务承诺 + +| 服务类型 | 承诺内容 | +|---------|---------| +| 响应时间 | 紧急问题1小时内响应 | +| 问题解决 | 承诺时间内给出解决方案 | +| 服务态度 | 专业、耐心、负责任 | +| 信息安全 | 严格保密客户数据 | + +## 8. 版本与更新 + +### 8.1 版本信息 + +| 版本号 | 发布日期 | 更新内容 | +|--------|---------|---------| +| v5.0 | 2026-04-10 | 初始版本发布 | +| - | - | - | + +### 8.2 更新订阅 + +**订阅方式:** + +| 订阅渠道 | 说明 | +|---------|------| +| 系统消息 | 登录系统查看更新公告 | +| 邮件订阅 | 订阅版本更新邮件 | +| 企业微信 | 加入服务群获取通知 | + +--- + +**异常处理与技术支持篇完** diff --git a/docs/格式标准.md b/docs/格式标准.md new file mode 100644 index 0000000..1f7f3ee --- /dev/null +++ b/docs/格式标准.md @@ -0,0 +1,117 @@ +# 一、文档结构层级规范 + +## 1.1 标题层级定义 + +- 一级标题 :文档主标题,用于封面标识,格式为 # 文档名称 +- 页面标题 :每个页面的标题,对应单独一个md文件 格式为 # 页面标题 +- 页面一级标题 :页面内一级标题,标识主要章节内容、核心业务模块,格式为 ## X. 模块名称 +- 页面二级标题 :页面内二级标题,功能节标题,标识具体功能点,格式为 ### X.X 功能名称 +- 页面三级标题 :页面内三级标题,细节标题,用于细分功能内的具体内容,格式为 #### X.X.X 详细内容 +- 特殊加强 : 针对特殊加强部分,可以使用 **功能标题:** 进行特殊加强 + +# 二、标题块书写标准 + +## 2.1 功能概述块标准格式 + +每个功能模块的开篇应包含功能概述块,采用以下标准格式: + +```text +**核心功能:** + +- 功能点一 +- 功能点二 +- 功能点三 +``` + +概述内容应简洁明了,通常列出3至6个核心功能点,使用无序列表呈现。概述块放置于功能节标题之后、正文内容之前。 + +## 2.2 术语说明块标准格式 + +涉及专业术语的章节应包含术语说明块,采用表格形式呈现: + +```text +#### X.X.X 术语说明 + +| 术语 | 定义 | 说明 | +|------|------|------| +| 术语一 | 术语一定义 | 补充说明 | +| 术语二 | 术语二定义 | 补充说明 | +``` +表格应包含术语、定义、说明三列,定义列应简洁准确,说明列提供必要的上下文信息。 + +# 三、操作说明块书写标准 + +## 3.1 操作步骤标准格式 + +操作说明应采用编号列表形式,基本格式如下: + +```text +**操作步骤:** + +1. 进入【菜单路径】→【子菜单】 +2. 点击【操作按钮】 +3. 填写表单信息 +4. 点击【确认】完成操作 +``` +操作步骤应遵循以下规范:每个步骤以动词开头(如进入、点击、填写、选择、确认等);菜单路径使用【】包裹;按钮名称使用【】包裹;操作说明使用祈使句式;步骤编号连续不间断。 + +## 3.2 字段说明表格标准格式 + +操作中涉及的表单字段应使用标准表格进行说明: + +```text +| 字段 | 说明 | 必填 | +|------|------|------| +| 字段一 | 字段一的含义和填写要求 | 是 | +| 字段二 | 字段二的含义和填写要求 | 否 | +``` + +表格必须包含字段、说明、必填三列。必填列使用“是”或“否”标识。说明列应详细描述字段的用途、格式要求、取值范围等信息。对于需要自动生成的字段,在必填列标注“-”或说明“系统自动生成”。 + +## 3.3 提示与注意事项标注规范 + +文档中应使用统一的标注符号系统来提示不同类型的信息: + +- 【重要】 :用于标识关键操作点或不可逆操作,如“【重要】删除操作不可恢复,请谨慎操作” +- 【注意】 :用于标识常见的操作误区或需要特别关注的事项,如“【注意】修改BOM版本会影响新的工单” +- 【提示】 :用于提供便于操作的技巧或建议,如“【提示】建议使用移动端进行扫码操作” + +这些标注应放置于相关操作说明的末尾或独立成段,使用加粗格式以突出显示。 + +## 3.4 查询条件与结果说明规范 + +涉及查询功能的操作应包含查询条件说明: + +```text +**查询条件:** + +| 查询条件 | 说明 | +|---------|------| +| 条件一 | 条件一的含义 | +| 条件二 | 条件二的选择方式 | + +``` +查询结果应描述系统的返回内容和展示方式,必要时使用表格或图示说明结果字段的含义。 + +# 四、截图说明块书写标准 + +## 4.1 界面示意图绘制规范 + +图片名称或说明用 **图片说明** 放置在图片插入点上方 + +```text +**操作示意图:** + +xxxxxx[图片] +``` +# 五、流程说明块书写标准 + +5.1 流程图规范 + +所有文档中的流程图,均使用mermaid语法绘制。 + +如果涉及到mermaid无法表述的复杂图表,使用SVG方式进行嵌入,并确保SVG来源于Draw.IO绘制导出的标准SVG格式。 + +# 六、文档样例 + +> 查阅 格式样例.md 文件 \ No newline at end of file diff --git a/docs/格式样例.md b/docs/格式样例.md new file mode 100644 index 0000000..95b16dc --- /dev/null +++ b/docs/格式样例.md @@ -0,0 +1,325 @@ +# 查询追溯 + +## 1. 功能概述 + +质量追溯模块实现从原材料到成品的全流程正向追溯,以及从成品到原材料的逆向追溯,支持快速定位问题、精准召回和持续改进。 + +**核心功能:** + +- 正向追溯:从原材料批次出发,追踪其在生产过程中的流转路径,最终追溯到使用的成品批次及出货去向 +- 逆向追溯:从成品批次或客户投诉出发,反向追溯到原材料供应商,实现问题快速定位 +- 生产过程追溯:记录和追溯每个生产工序的作业人员、设备参数、开工完工时间等详细信息 +- 质量数据追溯:关联检验记录、不良品处理记录,为质量问题分析提供完整数据支撑 +- 供应链追溯:串联供应商信息、物流信息、仓储信息,构建完整的供应链追溯链条 +- 追溯报告生成:支持一键生成追溯报告,导出 PDF 或 Excel 格式便于存档和交接 + +## 2. 术语说明 + +#### 2.1.1 追溯相关术语 + +| 术语 | 定义 | 说明 | +|------|------|------| +| 正向追溯 | Forward Trace,从原材料到成品的追溯方向 | 又称顺着物料流向追溯 | +| 逆向追溯 | Reverse Trace,从成品到原材料的追溯方向 | 又称反着物料流向追溯 | +| 批次号 | Batch/Lot Number,物料或产品的唯一标识 | 格式通常为 LOT-YYYYMMDD-XXX | +| 工序追溯 | Process Trace,对生产过程中各工序的追溯 | 记录人员、设备、时间等信息 | +| 物料清单 | BOM,Bill of Materials,产品构成清单 | 包含子物料及其用量比例 | + +## 3. 追溯类型 + +### 3.1 正向追溯 + +正向追溯是指从原材料批次出发,按照生产加工路径,顺向追踪物料的流转过程,最终追溯到使用该物料生产的成品批次及其出货记录。 + +**典型应用场景:** + +- 原材料出现质量问题时,快速定位受影响的所有成品批次 +- 供应商物料存在安全隐患时,进行精准召回 +- 生产异常排查时,分析物料在生产环节的影响范围 + +**正向追溯数据链:** + +```mermaid +flowchart LR + A[原材料批次] --> B[来料检验] + B --> C[物料入库] + C --> D[生产领料] + D --> E[工序加工] + E --> F[半成品/成品] + F --> G[成品入库] + G --> H[出货检验] + H --> I[成品出货] + I --> J[客户接收] +``` + +### 3.2 逆向追溯 + +逆向追溯是指从成品批次或客户反馈出发,反向追踪产品的构成物料及其来源,实现问题的快速定位和原因分析。 + +**典型应用场景:** + +- 客户投诉成品质量问题时,反向排查原因 +- 成品出现质量异常时,定位责任环节和物料 +- 定期质量分析时,构建完整的产品质量档案 + +**逆向追溯数据链:** + +```mermaid +flowchart RL + A[成品批次] --> B[成品检验记录] + A --> C[生产工单] + C --> D[领料记录] + D --> E[物料批次] + E --> F[IQC检验记录] + E --> G[供应商信息] + F --> H[质量问题分析] +``` + +### 3.3 生产过程追溯 + +生产过程追溯聚焦于工单执行过程中的详细信息,包括作业人员、设备状态、工艺参数、报工记录等。 + +**追溯内容:** + +| 追溯要素 | 追溯内容 | 数据来源 | +|---------|---------|---------| +| 工单信息 | 工单编号、产品型号、计划数量、开工完工时间 | 生产工单 | +| 工序信息 | 工序名称、工序顺序、作业内容 | 工艺路线 | +| 作业人员 | 人员姓名、工号、班组 | 报工记录 | +| 设备信息 | 设备编号、设备名称、设备状态 | 设备报工 | +| 工艺参数 | 温度、压力、速度、时间等 | 参数采集 | +| 产量数据 | 合格数量、不良数量、报废数量 | 报工记录 | + +## 4. 追溯查询操作 + +### 4.1 追溯条件设置 + +**查询条件:** + +| 查询条件 | 说明 | +|---------|------| +| 追溯类型 | 选择"正向追溯"或"逆向追溯" | +| 追溯标识 | 输入批次号,支持模糊查询 | +| 追溯日期范围 | 选择追溯数据的时间范围 | +| 产品范围 | 选择需要追溯的产品范围 | +| 追溯深度 | 选择追溯层级:简单/详细/完整 | + +### 4.2 正向追溯查询 + +**操作步骤:** + +1. 进入【质量管理】→【质量追溯】→【正向追溯】 +2. 在追溯类型下拉框中选择"正向追溯" +3. 在批次号输入框中输入物料批次号,例如:LOT-20260410-001 +4. 选择追溯日期范围,系统默认显示最近 30 天数据 +5. 点击【开始追溯】按钮 +6. 系统自动展开追溯链路,展示完整的物料流转路径 + +**追溯结果展示:** + +| 层级 | 追溯对象 | 数量 | 时间 | 状态 | +|------|---------|------|------|------| +| 1 | 原材料批次 LOT-20260410-001 | 1000 PCS | 2026-04-10 | 已检验合格 | +| 2 | 入库单 RK-20260410-001 | 1000 PCS | 2026-04-10 | 已入库 | +| 3 | 领料单 LL-20260412-001 | 200 PCS | 2026-04-12 | 已领料 | +| 4 | 工单 WO-20260412-001 | 200 PCS | 2026-04-12 | 生产中 | +| 5 | 成品批次 LOT-F-20260413-001 | 198 PCS | 2026-04-13 | 待检验 | + +**【提示】** 点击追溯对象可展开详细信息,如查看检验记录、工序作业记录等。 + +### 4.3 逆向追溯查询 + +**操作步骤:** + +1. 进入【质量管理】→【质量追溯】→【逆向追溯】 +2. 在追溯类型下拉框中选择"逆向追溯" +3. 输入成品批次号或客户投诉单号 +4. 点击【开始追溯】按钮 +5. 系统自动反向展开追溯链路 + +**追溯结果展示:** + +| 层级 | 追溯对象 | 数量 | 时间 | 责任方 | +|------|---------|------|------|--------| +| 1 | 成品批次 LOT-F-20260413-001 | 500 PCS | 2026-04-13 | 某客户 | +| 2 | 出货记录 SO-20260415-001 | 500 PCS | 2026-04-15 | 某客户 | +| 3 | 成品检验记录 FQC-20260413-001 | 500 PCS | 2026-04-13 | FQC组 | +| 4 | 工单 WO-20260412-001 | 500 PCS | 2026-04-12 | SMT车间 | +| 5 | 领料记录 LOT-20260410-001 | 100 PCS | 2026-04-12 | 仓库 | +| 6 | IQC检验记录 IQC-20260410-001 | 1000 PCS | 2026-04-10 | IQC组 | +| 7 | 供应商 深圳市华星电子有限公司 | 1000 PCS | - | 供应商 | + +**【重要】** 逆向追溯结果中的供应商信息仅作为参考,实际责任认定需结合质量分析报告。 + +### 4.4 追溯深度设置 + +| 追溯深度 | 说明 | 适用场景 | +|---------|------|---------| +| 简单追溯 | 仅显示批次流转路径 | 快速确认物料流向 | +| 详细追溯 | 显示批次流转及关键节点信息 | 日常质量排查 | +| 完整追溯 | 显示完整数据链,包括人员、设备、参数等 | 深度问题分析 | + +## 5. 追溯详细信息 + +### 5.1 工序作业详情 + +当追溯到某个工单时,可以展开查看该工单下各工序的详细作业信息。 + +**操作示意图:** + +**工序作业详情:** + +[图片:工序作业详情界面] + +工序作业详情包含以下内容: + +1. **工序列表**:展示工单涉及的所有工序 +2. **作业人员**:执行该工序的具体人员 +3. **设备信息**:使用的生产设备及状态 +4. **工艺参数**:关键工艺参数的实际值 +5. **产量记录**:合格数、不良数、报废数 + +**字段说明:** + +| 字段 | 说明 | 必填 | +|------|------|------| +| 工序序号 | 工序在工艺路线中的顺序号 | - | +| 工序名称 | 工序的名称,如 SMT、焊接、组装等 | 是 | +| 开工时间 | 工序开始作业的时间 | 是 | +| 完工时间 | 工序完成作业的时间 | 是 | +| 作业人员 | 执行该工序的作业人员姓名 | 是 | +| 设备编号 | 使用设备的唯一编号 | 否 | +| 合格数量 | 本工序生产的合格品数量 | 是 | +| 不良数量 | 本工序产生的不良品数量 | 是 | +| 报废数量 | 本工序报废的数量 | 是 | + +### 5.2 检验记录详情 + +追溯过程中可以查看相关的质量检验记录,包括 IQC、IPQC、FQC 等各类检验数据。 + +**字段说明:** + +| 字段 | 说明 | 必填 | +|------|------|------| +| 检验单号 | 检验记录的唯一编号 | - | +| 检验类型 | IQC/IPQC/FQC/OQC | 是 | +| 检验批次 | 被检验的物料或产品批次 | 是 | +| 抽样数量 | 按抽样方案抽取的检验数量 | 是 | +| 合格数量 | 检验合格的数量 | 是 | +| 不良数量 | 检验不合格的数量 | 是 | +| 合格率 | 合格数量/抽样数量×100% | - | +| 检验结论 | 合格/让步接收/拒收 | 是 | +| 检验员 | 执行检验的人员 | 是 | +| 检验时间 | 执行检验的时间 | 是 | + +### 5.3 不良品记录详情 + +追溯过程中可以查看产生的不良品记录,包括不良类型、原因分析及处理结果。 + +**字段说明:** + +| 字段 | 说明 | 必填 | +|------|------|------| +| 不良单号 | 不良品记录的唯一编号 | - | +| 不良批次 | 产生不良的批次号 | 是 | +| 不良数量 | 不良品数量 | 是 | +| 不良类型 | 外观不良/尺寸不良/功能不良/性能不良/安全不良 | 是 | +| 不良位置 | 不良发生的具体位置 | 否 | +| 不良原因 | 产生不良的原因分析 | 是 | +| 处理方式 | 返工/降级/报废/让步接收 | 是 | +| 处理结果 | 实际的处置结果 | 是 | +| 责任人 | 对不良负责的人员或部门 | 否 | + +**【注意】** 不良品记录的完整性和准确性直接影响追溯分析的有效性,请确保在发现不良时及时登记。 + +## 6. 追溯报告生成 + +### 6.1 报告生成操作 + +追溯完成后,可以将追溯结果生成为正式的报告文档,便于存档和交接。 + +**操作步骤:** + +1. 在追溯结果页面,点击【生成报告】按钮 +2. 选择报告格式:PDF / Excel / Word +3. 选择报告模板:简洁版 / 标准版 / 详细版 +4. 填写报告信息: + - 报告标题 + - 追溯原因:如"客户投诉追溯"、"质量问题追溯" + - 编制人 + - 编制日期 +5. 点击【确认生成】按钮 +6. 系统自动生成报告,可在线预览或下载保存 + +**字段说明:** + +| 字段 | 说明 | 必填 | +|------|------|------| +| 报告标题 | 追溯报告的名称 | 是 | +| 追溯类型 | 正向追溯/逆向追溯 | 是 | +| 报告格式 | PDF/Excel/Word | 是 | +| 报告模板 | 简洁版/标准版/详细版 | 是 | +| 追溯原因 | 本次追溯的原因说明 | 是 | +| 编制人 | 编制报告的人员 | 是 | +| 编制日期 | 编制报告的日期 | 是 | + +**【提示】** 建议使用标准版或详细版报告模板,以包含完整的追溯数据和细节信息。 + +### 6.2 报告内容结构 + +追溯报告应包含以下内容结构: + +| 章节 | 内容 | +|------|------| +| 报告封面 | 报告标题、追溯类型、追溯对象、编制信息 | +| 追溯概述 | 追溯原因、追溯范围、追溯时间 | +| 追溯数据 | 追溯链路图、批次流转记录 | +| 详细数据 | 工序作业、检验记录、不良品记录等详细信息 | +| 分析结论 | 问题原因分析、责任判定 | +| 处理建议 | 针对本次追溯结果的处理建议 | +| 附件 | 原始数据截图、相关单据等 | + +## 7. 追溯数据维护 + +### 7.1 数据完整性要求 + +**【重要】** 为确保追溯数据的完整性和可靠性,必须保证以下数据完整录入: + +- 所有来料必须经过 IQC 检验并记录 +- 所有物料必须有明确的批次标识 +- 所有工序必须有报工记录 +- 所有不良品必须登记并跟踪处理结果 +- 所有检验记录必须关联批次号和工单号 + +### 7.2 数据追溯规则 + +| 规则 | 说明 | +|------|------| +| 批次唯一性 | 同一批次号的物料或产品在整个系统中唯一 | +| 关联完整性 | 批次、工单、检验单之间必须建立关联关系 | +| 时间连续性 | 批次流转的各节点时间必须符合逻辑顺序 | +| 数量一致性 | 领料数量、加工数量、入库数量应保持一致 | + +**【注意】** 如果追溯数据存在断点或异常,系统会标记为"追溯异常",需要人工核实和补充。 + +## 8. 常见问题与处理 + +### 8.1 追溯异常处理 + +| 问题现象 | 可能原因 | 处理方法 | +|---------|---------|---------| +| 追溯链路中断 | 批次信息未录入 | 联系仓库补录入库批次 | +| 数量不匹配 | 报工数量与实际不符 | 联系车间核实报工数据 | +| 时间倒置 | 工序记录时间错误 | 联系相关人员修正时间 | +| 批次缺失 | 物料未进行批次管理 | 建议启用批次管理 | + +**【重要】** 发现追溯异常后,应及时查明原因并修正数据,以确保追溯系统的可靠性。 + +### 8.2 追溯效率优化 + +为提升追溯查询效率,建议遵循以下原则: + +- 定期清理过期数据,保持系统性能 +- 规范批次号命名规则,便于识别和查询 +- 及时完成报工和检验记录,避免数据延迟 +- 建立追溯数据审核机制,确保数据质量 diff --git a/env.example b/env.example new file mode 100644 index 0000000..fb5a0a6 --- /dev/null +++ b/env.example @@ -0,0 +1,42 @@ +# VitePress Docker Configuration +# Copy this file to .env and configure your settings + +# ============================================================================== +# Port Configuration +# ============================================================================== + +# VitePress documentation server port (external:internal) +VITEPRESS_PORT=3000 + +# API server port for PDF export (external:internal) +API_PORT=3001 + +# ============================================================================== +# Directory Configuration +# ============================================================================== + +# Path to your VitePress documentation directory +# This directory should contain: +# - index.md (home page) +# - .vitepress/ (configuration) +# - guide/, getting-started/, etc. (documentation folders) +# +# Example: ./docs or absolute path like /home/user/docs +DOCS_DIR=./docs + +# ============================================================================== +# PDF Export Configuration +# ============================================================================== + +# PDF output will be saved to: ${DOCS_DIR}/dist-pdf/ + +# ============================================================================== +# Advanced Configuration +# ============================================================================== + +# Node environment +NODE_ENV=production + +# Puppeteer configuration (for PDF export) +PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true +PUPPETEER_EXECUTABLE_PATH=/usr/bin/chromium diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..e53fce5 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,4901 @@ +{ + "name": "hf-mes-docs-vitepress", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "hf-mes-docs-vitepress", + "version": "1.0.0", + "devDependencies": { + "vitepress": "latest", + "vitepress-export-pdf": "^1.0.0" + } + }, + "node_modules/@algolia/abtesting": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.16.1.tgz", + "integrity": "sha512-Xxk4l00pYI+jE0PNw8y0MvsQWh5278WRtZQav8/BMMi3HKi2xmeuqe11WJ3y8/6nuBHdv39w76OpJb09TMfAVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.50.1", + "@algolia/requester-browser-xhr": "5.50.1", + "@algolia/requester-fetch": "5.50.1", + "@algolia/requester-node-http": "5.50.1" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/autocomplete-core": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.17.7.tgz", + "integrity": "sha512-BjiPOW6ks90UKl7TwMv7oNQMnzU+t/wk9mgIDi6b1tXpUek7MW0lbNOUHpvam9pe3lVCf4xPFT+lK7s+e+fs7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-plugin-algolia-insights": "1.17.7", + "@algolia/autocomplete-shared": "1.17.7" + } + }, + "node_modules/@algolia/autocomplete-plugin-algolia-insights": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.17.7.tgz", + "integrity": "sha512-Jca5Ude6yUOuyzjnz57og7Et3aXjbwCSDf/8onLHSQgw1qW3ALl9mrMWaXb5FmPVkV3EtkD2F/+NkT6VHyPu9A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-shared": "1.17.7" + }, + "peerDependencies": { + "search-insights": ">= 1 < 3" + } + }, + "node_modules/@algolia/autocomplete-preset-algolia": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.17.7.tgz", + "integrity": "sha512-ggOQ950+nwbWROq2MOCIL71RE0DdQZsceqrg32UqnhDz8FlO9rL8ONHNsI2R1MH0tkgVIDKI/D0sMiUchsFdWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-shared": "1.17.7" + }, + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, + "node_modules/@algolia/autocomplete-shared": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.17.7.tgz", + "integrity": "sha512-o/1Vurr42U/qskRSuhBH+VKxMvkkUVTLU6WZQr+L5lGZZLYWyhdzWjW0iGXY7EkwRTjBqvN2EsR81yCTGV/kmg==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, + "node_modules/@algolia/client-abtesting": { + "version": "5.50.1", + "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.50.1.tgz", + "integrity": "sha512-4peZlPXMwTOey9q1rQKMdCnwZb/E95/1e+7KujXpLLSh0FawJzg//U2NM+r4AiJy4+naT2MTBhj0K30yshnVTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.50.1", + "@algolia/requester-browser-xhr": "5.50.1", + "@algolia/requester-fetch": "5.50.1", + "@algolia/requester-node-http": "5.50.1" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-analytics": { + "version": "5.50.1", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.50.1.tgz", + "integrity": "sha512-i+aWHHG8NZvGFHtPeMZkxL2Loc6Fm7iaRo15lYSMx8gFL+at9vgdWxhka7mD1fqxkrxXsQstUBCIsSY8FvkEOw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.50.1", + "@algolia/requester-browser-xhr": "5.50.1", + "@algolia/requester-fetch": "5.50.1", + "@algolia/requester-node-http": "5.50.1" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-common": { + "version": "5.50.1", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.50.1.tgz", + "integrity": "sha512-Hw52Fwapyk/7hMSV/fI4+s3H9MGZEUcRh4VphyXLAk2oLYdndVUkc6KBi0zwHSzwPAr+ZBwFPe2x6naUt9mZGw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-insights": { + "version": "5.50.1", + "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.50.1.tgz", + "integrity": "sha512-Bn/wtwhJ7p1OD/6pY+Zzn+zlu2N/SJnH46md/PAbvqIzmjVuwjNwD4y0vV5Ov8naeukXdd7UU9v550+v8+mtlg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.50.1", + "@algolia/requester-browser-xhr": "5.50.1", + "@algolia/requester-fetch": "5.50.1", + "@algolia/requester-node-http": "5.50.1" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-personalization": { + "version": "5.50.1", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.50.1.tgz", + "integrity": "sha512-0V4Tu0RWR8YxkgI9EPVOZHGE4K5pEIhkLNN0CTkP/rnPsqaaSQpNMYW3/mGWdiKOWbX0iVmwLB9QESk3H0jS5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.50.1", + "@algolia/requester-browser-xhr": "5.50.1", + "@algolia/requester-fetch": "5.50.1", + "@algolia/requester-node-http": "5.50.1" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-query-suggestions": { + "version": "5.50.1", + "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.50.1.tgz", + "integrity": "sha512-jofcWNYMXJDDr87Z2eivlWY6o71Zn7F7aOvQCXSDAo9QTlyf7BhXEsZymLUvF0O1yU9Q9wvrjAWn8uVHYnAvgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.50.1", + "@algolia/requester-browser-xhr": "5.50.1", + "@algolia/requester-fetch": "5.50.1", + "@algolia/requester-node-http": "5.50.1" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-search": { + "version": "5.50.1", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.50.1.tgz", + "integrity": "sha512-OteRb8WubcmEvU0YlMJwCXs3Q6xrdkb0v50/qZBJP1TF0CvujFZQM++9BjEkTER/Jr9wbPHvjSFKnbMta0b4dQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.50.1", + "@algolia/requester-browser-xhr": "5.50.1", + "@algolia/requester-fetch": "5.50.1", + "@algolia/requester-node-http": "5.50.1" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/ingestion": { + "version": "1.50.1", + "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.50.1.tgz", + "integrity": "sha512-0GmfSgDQK6oiIVXnJvGxtNFOfosBspRTR7csCOYCTL1P8QtxX2vDCIKwTM7xdSAEbJaZ43QlWg25q0Qdsndz8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.50.1", + "@algolia/requester-browser-xhr": "5.50.1", + "@algolia/requester-fetch": "5.50.1", + "@algolia/requester-node-http": "5.50.1" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/monitoring": { + "version": "1.50.1", + "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.50.1.tgz", + "integrity": "sha512-ySuigKEe4YjYV3si8NVk9BHQpFj/1B+ON7DhhvTvbrZJseHQQloxzq0yHwKmznSdlO6C956fx4pcfOKkZClsyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.50.1", + "@algolia/requester-browser-xhr": "5.50.1", + "@algolia/requester-fetch": "5.50.1", + "@algolia/requester-node-http": "5.50.1" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/recommend": { + "version": "5.50.1", + "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.50.1.tgz", + "integrity": "sha512-Cp8T/B0gVmjFlzzp6eP47hwKh5FGyeqQp1N48/ANDdvdiQkPqLyFHQVDwLBH0LddfIPQE+yqmZIgmKc82haF4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.50.1", + "@algolia/requester-browser-xhr": "5.50.1", + "@algolia/requester-fetch": "5.50.1", + "@algolia/requester-node-http": "5.50.1" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-browser-xhr": { + "version": "5.50.1", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.50.1.tgz", + "integrity": "sha512-XKdGGLikfrlK66ZSXh/vWcXZZ8Vg3byDFbJD8pwEvN1FoBRGxhxya476IY2ohoTymLa4qB5LBRlIa+2TLHx3Uw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.50.1" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-fetch": { + "version": "5.50.1", + "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.50.1.tgz", + "integrity": "sha512-mBAU6WyVsDwhHyGM+nodt1/oebHxgvuLlOAoMGbj/1i6LygDHZWDgL1t5JEs37x9Aywv7ZGhqbM1GsfZ54sU6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.50.1" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-node-http": { + "version": "5.50.1", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.50.1.tgz", + "integrity": "sha512-qmo1LXrNKLHvJE6mdQbLnsZAoZvj7VyF2ft4xmbSGWI2WWm87fx/CjUX4kEExt4y0a6T6nEts6ofpUfH5TEE1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.50.1" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz", + "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@condorhero/merge-pdfs": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/@condorhero/merge-pdfs/-/merge-pdfs-0.0.7.tgz", + "integrity": "sha512-qx4dpWrKYVNEg0VH8zjAo9lq6Au7M7cQi/RTUzfECv/jslHVYw9zQ/E5i/aO0BCaghUzaFRsoCdlilgmOMwGTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "colorette": "^2.0.20", + "fast-glob": "^3.3.0", + "yargs": "^17.7.2" + }, + "bin": { + "merge-pdfs": "bin/merge-pdfs.mjs" + }, + "engines": { + "node": ">=18.5.0" + } + }, + "node_modules/@condorhero/vuepress-plugin-export-pdf-core": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@condorhero/vuepress-plugin-export-pdf-core/-/vuepress-plugin-export-pdf-core-3.0.3.tgz", + "integrity": "sha512-wmifVw9TUOYWgihUBTcgdlzB0TW9uVtsQsRLrHKiW9gxyICiJhMQNmTtfKvtuqEhk/p6ML8qQAQ+K+k9ro3EuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@condorhero/merge-pdfs": "^0.0.7", + "bundle-require": "^4.1.0", + "cac": "^6.7.14", + "envinfo": "^7.13.0", + "fs-extra": "^11.2.0", + "html-export-pdf-cli": "^1.1.5", + "multimatch": "^7.0.0", + "ora": "^8.0.1", + "pdfjs": "^2.5.3", + "picocolors": "^1.0.0", + "semver": "^7.6.2" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/@docsearch/css": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.8.2.tgz", + "integrity": "sha512-y05ayQFyUmCXze79+56v/4HpycYF3uFqB78pLPrSV5ZKAlDuIAAJNhaRi8tTdRNXh05yxX/TyNnzD6LwSM89vQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@docsearch/js": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/@docsearch/js/-/js-3.8.2.tgz", + "integrity": "sha512-Q5wY66qHn0SwA7Taa0aDbHiJvaFJLOJyHmooQ7y8hlwwQLQ/5WwCcoX0g7ii04Qi2DJlHsd0XXzJ8Ypw9+9YmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@docsearch/react": "3.8.2", + "preact": "^10.0.0" + } + }, + "node_modules/@docsearch/react": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.8.2.tgz", + "integrity": "sha512-xCRrJQlTt8N9GU0DG4ptwHRkfnSnD/YpdeaXe02iKfqs97TkZJv60yE+1eq/tjPcVnTW8dP5qLP7itifFVV5eg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-core": "1.17.7", + "@algolia/autocomplete-preset-algolia": "1.17.7", + "@docsearch/css": "3.8.2", + "algoliasearch": "^5.14.2" + }, + "peerDependencies": { + "@types/react": ">= 16.8.0 < 19.0.0", + "react": ">= 16.8.0 < 19.0.0", + "react-dom": ">= 16.8.0 < 19.0.0", + "search-insights": ">= 1 < 3" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "search-insights": { + "optional": true + } + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@iconify-json/simple-icons": { + "version": "1.2.77", + "resolved": "https://registry.npmjs.org/@iconify-json/simple-icons/-/simple-icons-1.2.77.tgz", + "integrity": "sha512-oaENvo6C3BkAEWMlcQA3XemxU9v2SFOTlApSUCODAkIu1haeLCjzrmH3HgmGqjRnJjM+LevO8sA+MgdMHBFBDA==", + "dev": true, + "license": "CC0-1.0", + "dependencies": { + "@iconify/types": "*" + } + }, + "node_modules/@iconify/types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz", + "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "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.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pdf-lib/standard-fonts": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@pdf-lib/standard-fonts/-/standard-fonts-1.0.0.tgz", + "integrity": "sha512-hU30BK9IUN/su0Mn9VdlVKsWBS6GyhVfqjwl1FjZN4TxP6cCw0jP2w7V3Hf5uX7M0AZJ16vey9yE0ny7Sa59ZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pako": "^1.0.6" + } + }, + "node_modules/@pdf-lib/upng": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@pdf-lib/upng/-/upng-1.0.1.tgz", + "integrity": "sha512-dQK2FUMQtowVP00mtIksrlZhdFXQZPC+taih1q4CvPZ5vqdxR/LKBaFg0oAfzd1GlHZXXSPdQfzQnt+ViGvEIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "pako": "^1.0.10" + } + }, + "node_modules/@puppeteer/browsers": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.3.0.tgz", + "integrity": "sha512-ioXoq9gPxkss4MYhD+SFaU9p1IHFUX0ILAWFPyjGaBdjLsYAlZw6j1iLA0N/m12uVHLFDfSYNF7EQccjinIMDA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "debug": "^4.3.5", + "extract-zip": "^2.0.1", + "progress": "^2.0.3", + "proxy-agent": "^6.4.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/@rkusa/linebreak": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@rkusa/linebreak/-/linebreak-1.0.0.tgz", + "integrity": "sha512-yCSm87XA1aYMgfcABSxcIkk3JtCw3AihNceHY+DnZGLvVP/g2z3UWZbi0xIoYpZWAJEVPr5Zt3QE37Q80wF1pA==", + "dev": true, + "license": "MIT", + "dependencies": { + "unicode-trie": "^0.3.0" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.1.tgz", + "integrity": "sha512-d6FinEBLdIiK+1uACUttJKfgZREXrF0Qc2SmLII7W2AD8FfiZ9Wjd+rD/iRuf5s5dWrr1GgwXCvPqOuDquOowA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.60.1.tgz", + "integrity": "sha512-YjG/EwIDvvYI1YvYbHvDz/BYHtkY4ygUIXHnTdLhG+hKIQFBiosfWiACWortsKPKU/+dUwQQCKQM3qrDe8c9BA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.1.tgz", + "integrity": "sha512-mjCpF7GmkRtSJwon+Rq1N8+pI+8l7w5g9Z3vWj4T7abguC4Czwi3Yu/pFaLvA3TTeMVjnu3ctigusqWUfjZzvw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.60.1.tgz", + "integrity": "sha512-haZ7hJ1JT4e9hqkoT9R/19XW2QKqjfJVv+i5AGg57S+nLk9lQnJ1F/eZloRO3o9Scy9CM3wQ9l+dkXtcBgN5Ew==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.60.1.tgz", + "integrity": "sha512-czw90wpQq3ZsAVBlinZjAYTKduOjTywlG7fEeWKUA7oCmpA8xdTkxZZlwNJKWqILlq0wehoZcJYfBvOyhPTQ6w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.60.1.tgz", + "integrity": "sha512-KVB2rqsxTHuBtfOeySEyzEOB7ltlB/ux38iu2rBQzkjbwRVlkhAGIEDiiYnO2kFOkJp+Z7pUXKyrRRFuFUKt+g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.60.1.tgz", + "integrity": "sha512-L+34Qqil+v5uC0zEubW7uByo78WOCIrBvci69E7sFASRl0X7b/MB6Cqd1lky/CtcSVTydWa2WZwFuWexjS5o6g==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.60.1.tgz", + "integrity": "sha512-n83O8rt4v34hgFzlkb1ycniJh7IR5RCIqt6mz1VRJD6pmhRi0CXdmfnLu9dIUS6buzh60IvACM842Ffb3xd6Gg==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.60.1.tgz", + "integrity": "sha512-Nql7sTeAzhTAja3QXeAI48+/+GjBJ+QmAH13snn0AJSNL50JsDqotyudHyMbO2RbJkskbMbFJfIJKWA6R1LCJQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.60.1.tgz", + "integrity": "sha512-+pUymDhd0ys9GcKZPPWlFiZ67sTWV5UU6zOJat02M1+PiuSGDziyRuI/pPue3hoUwm2uGfxdL+trT6Z9rxnlMA==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.60.1.tgz", + "integrity": "sha512-VSvgvQeIcsEvY4bKDHEDWcpW4Yw7BtlKG1GUT4FzBUlEKQK0rWHYBqQt6Fm2taXS+1bXvJT6kICu5ZwqKCnvlQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.60.1.tgz", + "integrity": "sha512-4LqhUomJqwe641gsPp6xLfhqWMbQV04KtPp7/dIp0nzPxAkNY1AbwL5W0MQpcalLYk07vaW9Kp1PBhdpZYYcEw==", + "cpu": [ + "loong64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.60.1.tgz", + "integrity": "sha512-tLQQ9aPvkBxOc/EUT6j3pyeMD6Hb8QF2BTBnCQWP/uu1lhc9AIrIjKnLYMEroIz/JvtGYgI9dF3AxHZNaEH0rw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.60.1.tgz", + "integrity": "sha512-RMxFhJwc9fSXP6PqmAz4cbv3kAyvD1etJFjTx4ONqFP9DkTkXsAMU4v3Vyc5BgzC+anz7nS/9tp4obsKfqkDHg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.60.1.tgz", + "integrity": "sha512-QKgFl+Yc1eEk6MmOBfRHYF6lTxiiiV3/z/BRrbSiW2I7AFTXoBFvdMEyglohPj//2mZS4hDOqeB0H1ACh3sBbg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.60.1.tgz", + "integrity": "sha512-RAjXjP/8c6ZtzatZcA1RaQr6O1TRhzC+adn8YZDnChliZHviqIjmvFwHcxi4JKPSDAt6Uhf/7vqcBzQJy0PDJg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.60.1.tgz", + "integrity": "sha512-wcuocpaOlaL1COBYiA89O6yfjlp3RwKDeTIA0hM7OpmhR1Bjo9j31G1uQVpDlTvwxGn2nQs65fBFL5UFd76FcQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.1.tgz", + "integrity": "sha512-77PpsFQUCOiZR9+LQEFg9GClyfkNXj1MP6wRnzYs0EeWbPcHs02AXu4xuUbM1zhwn3wqaizle3AEYg5aeoohhg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.1.tgz", + "integrity": "sha512-5cIATbk5vynAjqqmyBjlciMJl1+R/CwX9oLk/EyiFXDWd95KpHdrOJT//rnUl4cUcskrd0jCCw3wpZnhIHdD9w==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.60.1.tgz", + "integrity": "sha512-cl0w09WsCi17mcmWqqglez9Gk8isgeWvoUZ3WiJFYSR3zjBQc2J5/ihSjpl+VLjPqjQ/1hJRcqBfLjssREQILw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.60.1.tgz", + "integrity": "sha512-4Cv23ZrONRbNtbZa37mLSueXUCtN7MXccChtKpUnQNgF010rjrjfHx3QxkS2PI7LqGT5xXyYs1a7LbzAwT0iCA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.60.1.tgz", + "integrity": "sha512-i1okWYkA4FJICtr7KpYzFpRTHgy5jdDbZiWfvny21iIKky5YExiDXP+zbXzm3dUcFpkEeYNHgQ5fuG236JPq0g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.60.1.tgz", + "integrity": "sha512-u09m3CuwLzShA0EYKMNiFgcjjzwqtUMLmuCJLeZWjjOYA3IT2Di09KaxGBTP9xVztWyIWjVdsB2E9goMjZvTQg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.60.1.tgz", + "integrity": "sha512-k+600V9Zl1CM7eZxJgMyTUzmrmhB/0XZnF4pRypKAlAgxmedUA+1v9R+XOFv56W4SlHEzfeMtzujLJD22Uz5zg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.60.1.tgz", + "integrity": "sha512-lWMnixq/QzxyhTV6NjQJ4SFo1J6PvOX8vUx5Wb4bBPsEb+8xZ89Bz6kOXpfXj9ak9AHTQVQzlgzBEc1SyM27xQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@shikijs/core": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-2.5.0.tgz", + "integrity": "sha512-uu/8RExTKtavlpH7XqnVYBrfBkUc20ngXiX9NSrBhOVZYv/7XQRKUyhtkeflY5QsxC0GbJThCerruZfsUaSldg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/engine-javascript": "2.5.0", + "@shikijs/engine-oniguruma": "2.5.0", + "@shikijs/types": "2.5.0", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4", + "hast-util-to-html": "^9.0.4" + } + }, + "node_modules/@shikijs/engine-javascript": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-2.5.0.tgz", + "integrity": "sha512-VjnOpnQf8WuCEZtNUdjjwGUbtAVKuZkVQ/5cHy/tojVVRIRtlWMYVjyWhxOmIq05AlSOv72z7hRNRGVBgQOl0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "2.5.0", + "@shikijs/vscode-textmate": "^10.0.2", + "oniguruma-to-es": "^3.1.0" + } + }, + "node_modules/@shikijs/engine-oniguruma": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-2.5.0.tgz", + "integrity": "sha512-pGd1wRATzbo/uatrCIILlAdFVKdxImWJGQ5rFiB5VZi2ve5xj3Ax9jny8QvkaV93btQEwR/rSz5ERFpC5mKNIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "2.5.0", + "@shikijs/vscode-textmate": "^10.0.2" + } + }, + "node_modules/@shikijs/langs": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-2.5.0.tgz", + "integrity": "sha512-Qfrrt5OsNH5R+5tJ/3uYBBZv3SuGmnRPejV9IlIbFH3HTGLDlkqgHymAlzklVmKBjAaVmkPkyikAV/sQ1wSL+w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "2.5.0" + } + }, + "node_modules/@shikijs/themes": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-2.5.0.tgz", + "integrity": "sha512-wGrk+R8tJnO0VMzmUExHR+QdSaPUl/NKs+a4cQQRWyoc3YFbUzuLEi/KWK1hj+8BfHRKm2jNhhJck1dfstJpiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "2.5.0" + } + }, + "node_modules/@shikijs/transformers": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/transformers/-/transformers-2.5.0.tgz", + "integrity": "sha512-SI494W5X60CaUwgi8u4q4m4s3YAFSxln3tzNjOSYqq54wlVgz0/NbbXEb3mdLbqMBztcmS7bVTaEd2w0qMmfeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/core": "2.5.0", + "@shikijs/types": "2.5.0" + } + }, + "node_modules/@shikijs/types": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-2.5.0.tgz", + "integrity": "sha512-ygl5yhxki9ZLNuNpPitBWvcy9fsSKKaRuO4BAlMyagszQidxcpLAr0qiW/q43DtSIDxO6hEbtYLiFZNXO/hdGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + } + }, + "node_modules/@shikijs/vscode-textmate": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", + "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tootallnate/quickjs-emscripten": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", + "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/markdown-it": { + "version": "14.1.2", + "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.2.tgz", + "integrity": "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/linkify-it": "^5", + "@types/mdurl": "^2" + } + }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "25.6.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.6.0.tgz", + "integrity": "sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "undici-types": "~7.19.0" + } + }, + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/web-bluetooth": { + "version": "0.0.21", + "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.21.tgz", + "integrity": "sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/yauzl": { + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", + "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "dev": true, + "license": "ISC" + }, + "node_modules/@vitejs/plugin-vue": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.2.4.tgz", + "integrity": "sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.32", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.32.tgz", + "integrity": "sha512-4x74Tbtqnda8s/NSD6e1Dr5p1c8HdMU5RWSjMSUzb8RTcUQqevDCxVAitcLBKT+ie3o0Dl9crc/S/opJM7qBGQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.2", + "@vue/shared": "3.5.32", + "entities": "^7.0.1", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.32", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.32.tgz", + "integrity": "sha512-ybHAu70NtiEI1fvAUz3oXZqkUYEe5J98GjMDpTGl5iHb0T15wQYLR4wE3h9xfuTNA+Cm2f4czfe8B4s+CCH57Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.32", + "@vue/shared": "3.5.32" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.32", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.32.tgz", + "integrity": "sha512-8UYUYo71cP/0YHMO814TRZlPuUUw3oifHuMR7Wp9SNoRSrxRQnhMLNlCeaODNn6kNTJsjFoQ/kqIj4qGvya4Xg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.2", + "@vue/compiler-core": "3.5.32", + "@vue/compiler-dom": "3.5.32", + "@vue/compiler-ssr": "3.5.32", + "@vue/shared": "3.5.32", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.21", + "postcss": "^8.5.8", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.32", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.32.tgz", + "integrity": "sha512-Gp4gTs22T3DgRotZ8aA/6m2jMR+GMztvBXUBEUOYOcST+giyGWJ4WvFd7QLHBkzTxkfOt8IELKNdpzITLbA2rw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.32", + "@vue/shared": "3.5.32" + } + }, + "node_modules/@vue/devtools-api": { + "version": "7.7.9", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.7.9.tgz", + "integrity": "sha512-kIE8wvwlcZ6TJTbNeU2HQNtaxLx3a84aotTITUuL/4bzfPxzajGBOoqjMhwZJ8L9qFYDU/lAYMEEm11dnZOD6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/devtools-kit": "^7.7.9" + } + }, + "node_modules/@vue/devtools-kit": { + "version": "7.7.9", + "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.7.9.tgz", + "integrity": "sha512-PyQ6odHSgiDVd4hnTP+aDk2X4gl2HmLDfiyEnn3/oV+ckFDuswRs4IbBT7vacMuGdwY/XemxBoh302ctbsptuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/devtools-shared": "^7.7.9", + "birpc": "^2.3.0", + "hookable": "^5.5.3", + "mitt": "^3.0.1", + "perfect-debounce": "^1.0.0", + "speakingurl": "^14.0.1", + "superjson": "^2.2.2" + } + }, + "node_modules/@vue/devtools-shared": { + "version": "7.7.9", + "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.7.9.tgz", + "integrity": "sha512-iWAb0v2WYf0QWmxCGy0seZNDPdO3Sp5+u78ORnyeonS6MT4PC7VPrryX2BpMJrwlDeaZ6BD4vP4XKjK0SZqaeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "rfdc": "^1.4.1" + } + }, + "node_modules/@vue/reactivity": { + "version": "3.5.32", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.32.tgz", + "integrity": "sha512-/ORasxSGvZ6MN5gc+uE364SxFdJ0+WqVG0CENXaGW58TOCdrAW76WWaplDtECeS1qphvtBZtR+3/o1g1zL4xPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/shared": "3.5.32" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.5.32", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.32.tgz", + "integrity": "sha512-pDrXCejn4UpFDFmMd27AcJEbHaLemaE5o4pbb7sLk79SRIhc6/t34BQA7SGNgYtbMnvbF/HHOftYBgFJtUoJUQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.32", + "@vue/shared": "3.5.32" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.5.32", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.32.tgz", + "integrity": "sha512-1CDVv7tv/IV13V8Nip1k/aaObVbWqRlVCVezTwx3K07p7Vxossp5JU1dcPNhJk3w347gonIUT9jQOGutyJrSVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.32", + "@vue/runtime-core": "3.5.32", + "@vue/shared": "3.5.32", + "csstype": "^3.2.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.5.32", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.32.tgz", + "integrity": "sha512-IOjm2+JQwRFS7W28HNuJeXQle9KdZbODFY7hFGVtnnghF51ta20EWAZJHX+zLGtsHhaU6uC9BGPV52KVpYryMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/compiler-ssr": "3.5.32", + "@vue/shared": "3.5.32" + }, + "peerDependencies": { + "vue": "3.5.32" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.32", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.32.tgz", + "integrity": "sha512-ksNyrmRQzWJJ8n3cRDuSF7zNNontuJg1YHnmWRJd2AMu8Ij2bqwiiri2lH5rHtYPZjj4STkNcgcmiQqlOjiYGg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vueuse/core": { + "version": "12.8.2", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-12.8.2.tgz", + "integrity": "sha512-HbvCmZdzAu3VGi/pWYm5Ut+Kd9mn1ZHnn4L5G8kOQTPs/IwIAmJoBrmYk2ckLArgMXZj0AW3n5CAejLUO+PhdQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/web-bluetooth": "^0.0.21", + "@vueuse/metadata": "12.8.2", + "@vueuse/shared": "12.8.2", + "vue": "^3.5.13" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/integrations": { + "version": "12.8.2", + "resolved": "https://registry.npmjs.org/@vueuse/integrations/-/integrations-12.8.2.tgz", + "integrity": "sha512-fbGYivgK5uBTRt7p5F3zy6VrETlV9RtZjBqd1/HxGdjdckBgBM4ugP8LHpjolqTj14TXTxSK1ZfgPbHYyGuH7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vueuse/core": "12.8.2", + "@vueuse/shared": "12.8.2", + "vue": "^3.5.13" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "async-validator": "^4", + "axios": "^1", + "change-case": "^5", + "drauu": "^0.4", + "focus-trap": "^7", + "fuse.js": "^7", + "idb-keyval": "^6", + "jwt-decode": "^4", + "nprogress": "^0.2", + "qrcode": "^1.5", + "sortablejs": "^1", + "universal-cookie": "^7" + }, + "peerDependenciesMeta": { + "async-validator": { + "optional": true + }, + "axios": { + "optional": true + }, + "change-case": { + "optional": true + }, + "drauu": { + "optional": true + }, + "focus-trap": { + "optional": true + }, + "fuse.js": { + "optional": true + }, + "idb-keyval": { + "optional": true + }, + "jwt-decode": { + "optional": true + }, + "nprogress": { + "optional": true + }, + "qrcode": { + "optional": true + }, + "sortablejs": { + "optional": true + }, + "universal-cookie": { + "optional": true + } + } + }, + "node_modules/@vueuse/metadata": { + "version": "12.8.2", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-12.8.2.tgz", + "integrity": "sha512-rAyLGEuoBJ/Il5AmFHiziCPdQzRt88VxR+Y/A/QhJ1EWtWqPBBAxTAFaSkviwEuOEZNtW8pvkPgoCZQ+HxqW1A==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared": { + "version": "12.8.2", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-12.8.2.tgz", + "integrity": "sha512-dznP38YzxZoNloI0qpEfpkms8knDtaoQ6Y/sfS0L7Yki4zh40LFHEhur0odJC6xTHG5dxWVPiUWBXn+wCG2s5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "vue": "^3.5.13" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/algoliasearch": { + "version": "5.50.1", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.50.1.tgz", + "integrity": "sha512-/bwdue1/8LWELn/DBalGRfuLsXBLXULJo/yOeavJtDu8rBwxIzC6/Rz9Jg19S21VkJvRuZO1k8CZXBMS73mYbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/abtesting": "1.16.1", + "@algolia/client-abtesting": "5.50.1", + "@algolia/client-analytics": "5.50.1", + "@algolia/client-common": "5.50.1", + "@algolia/client-insights": "5.50.1", + "@algolia/client-personalization": "5.50.1", + "@algolia/client-query-suggestions": "5.50.1", + "@algolia/client-search": "5.50.1", + "@algolia/ingestion": "1.50.1", + "@algolia/monitoring": "1.50.1", + "@algolia/recommend": "5.50.1", + "@algolia/requester-browser-xhr": "5.50.1", + "@algolia/requester-fetch": "5.50.1", + "@algolia/requester-node-http": "5.50.1" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/array-differ": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-4.0.0.tgz", + "integrity": "sha512-Q6VPTLMsmXZ47ENG3V+wQyZS1ZxXMxFyYzA+Z/GMrJ6yIutAIEf9wTyroTzmGjNfox9/h3GdGBCVh43GVFx4Uw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/array-union": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-3.0.1.tgz", + "integrity": "sha512-1OvF9IbWwaeiM9VhzYXVQacMibxpXOMYVNIvMtKRyX9SImBXpKcFr8XvFDeEslCyuH/t6KRt7HEO94AlP8Iatw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ast-types": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", + "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ast-types/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, + "node_modules/b4a": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.8.0.tgz", + "integrity": "sha512-qRuSmNSkGQaHwNbM7J78Wwy+ghLEYF1zNrSeMxj4Kgw6y33O3mXcQ6Ie9fRvfU/YnxWkOchPXbaLb73TkIsfdg==", + "dev": true, + "license": "Apache-2.0", + "peerDependencies": { + "react-native-b4a": "*" + }, + "peerDependenciesMeta": { + "react-native-b4a": { + "optional": true + } + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/bare-events": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.8.2.tgz", + "integrity": "sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==", + "dev": true, + "license": "Apache-2.0", + "peerDependencies": { + "bare-abort-controller": "*" + }, + "peerDependenciesMeta": { + "bare-abort-controller": { + "optional": true + } + } + }, + "node_modules/bare-fs": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.7.0.tgz", + "integrity": "sha512-xzqKsCFxAek9aezYhjJuJRXBIaYlg/0OGDTZp+T8eYmYMlm66cs6cYko02drIyjN2CBbi+I6L7YfXyqpqtKRXA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bare-events": "^2.5.4", + "bare-path": "^3.0.0", + "bare-stream": "^2.6.4", + "bare-url": "^2.2.2", + "fast-fifo": "^1.3.2" + }, + "engines": { + "bare": ">=1.16.0" + }, + "peerDependencies": { + "bare-buffer": "*" + }, + "peerDependenciesMeta": { + "bare-buffer": { + "optional": true + } + } + }, + "node_modules/bare-os": { + "version": "3.8.7", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.8.7.tgz", + "integrity": "sha512-G4Gr1UsGeEy2qtDTZwL7JFLo2wapUarz7iTMcYcMFdS89AIQuBoyjgXZz0Utv7uHs3xA9LckhVbeBi8lEQrC+w==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "bare": ">=1.14.0" + } + }, + "node_modules/bare-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz", + "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bare-os": "^3.0.1" + } + }, + "node_modules/bare-stream": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.13.0.tgz", + "integrity": "sha512-3zAJRZMDFGjdn+RVnNpF9kuELw+0Fl3lpndM4NcEOhb9zwtSo/deETfuIwMSE5BXanA0FrN1qVjffGwAg2Y7EA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "streamx": "^2.25.0", + "teex": "^1.0.1" + }, + "peerDependencies": { + "bare-abort-controller": "*", + "bare-buffer": "*", + "bare-events": "*" + }, + "peerDependenciesMeta": { + "bare-abort-controller": { + "optional": true + }, + "bare-buffer": { + "optional": true + }, + "bare-events": { + "optional": true + } + } + }, + "node_modules/bare-url": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.4.0.tgz", + "integrity": "sha512-NSTU5WN+fy/L0DDenfE8SXQna4voXuW0FHM7wH8i3/q9khUSchfPbPezO4zSFMnDGIf9YE+mt/RWhZgNRKRIXA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bare-path": "^3.0.0" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/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" + } + ], + "license": "MIT" + }, + "node_modules/basic-ftp": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.2.2.tgz", + "integrity": "sha512-1tDrzKsdCg70WGvbFss/ulVAxupNauGnOlgpyjKzeQxzyllBLS0CGLV7tjIXTK3ZQA9/FBEm9qyFFN1bciA6pw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/birpc": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/birpc/-/birpc-2.9.0.tgz", + "integrity": "sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz", + "integrity": "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/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" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/bundle-require": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/bundle-require/-/bundle-require-4.2.1.tgz", + "integrity": "sha512-7Q/6vkyYAwOmQNRw75x+4yRtZCZJXUDmHHlFdkiV0wgv/reNjtJwpu1jPJ0w2kbEpIM0uoKI3S4/f39dU7AjSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "load-tsconfig": "^0.2.3" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "peerDependencies": { + "esbuild": ">=0.17" + } + }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chromium-bidi": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.6.3.tgz", + "integrity": "sha512-qXlsCmpCZJAnoTYI83Iu6EdYQpMYdVkCfq08KDh2pmlVqK5t5IA9mGs4/LwCwp4fqisSOMXZxP3HIh8w8aRn0A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "mitt": "3.0.1", + "urlpattern-polyfill": "10.0.0", + "zod": "3.23.8" + }, + "peerDependencies": { + "devtools-protocol": "*" + } + }, + "node_modules/cli-cursor": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-progress": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/cli-progress/-/cli-progress-3.12.0.tgz", + "integrity": "sha512-tRkV3HJ1ASwm19THiiLIXLO7Im7wlTuKnvkYaTkyoAPefqjNg7W7DHKUlGRxy9vxDvbyCYQkQozvptuMkGCg8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "string-width": "^4.2.3" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "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.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/commander": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/copy-anything": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-4.0.5.tgz", + "integrity": "sha512-7Vv6asjS4gMOuILabD3l739tsaxFQmC+a7pLZm02zyvs8p977bL3zEgq3yDk5rn9B0PbYgIv++jmHcuUab4RhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-what": "^5.2.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/cosmiconfig": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.1.tgz", + "integrity": "sha512-hr4ihw+DBqcvrsEDioRO31Z17x71pUYoNe/4h6Z0wB72p7MU7/9gH8Q3s12NFhHPfYBBOV3qyfUxmr/Yn3shnQ==", + "dev": true, + "license": "MIT", + "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/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/data-uri-to-buffer": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", + "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/degenerator": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", + "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ast-types": "^0.13.4", + "escodegen": "^2.1.0", + "esprima": "^4.0.1" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/devtools-protocol": { + "version": "0.0.1312386", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1312386.tgz", + "integrity": "sha512-DPnhUXvmvKT2dFA/j7B+riVLUt9Q6RKJlcppojL5CoRywJJKLDYnRlw0gTFKfgDPHP5E04UoB71SxoJlVZy8FA==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/emoji-regex-xs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex-xs/-/emoji-regex-xs-1.0.0.tgz", + "integrity": "sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==", + "dev": true, + "license": "MIT" + }, + "node_modules/end-of-stream": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/entities": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/envinfo": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.21.0.tgz", + "integrity": "sha512-Lw7I8Zp5YKHFCXL7+Dz95g4CcbMEpgvqZNNq3AmlT5XAV6CgAAk6gyAMqn2zjw08K9BHfcNuKrMiCPLByGafow==", + "dev": true, + "license": "MIT", + "bin": { + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dev": true, + "license": "BSD-2-Clause", + "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.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/events-universal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz", + "integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bare-events": "^2.7.0" + } + }, + "node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "dev": true, + "license": "BSD-2-Clause", + "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.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "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/fastq": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/focus-trap": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.8.0.tgz", + "integrity": "sha512-/yNdlIkpWbM0ptxno3ONTuf+2g318kh2ez3KSeZN5dZ8YC6AAmgeWz+GasYYiBJPFaYcSAPeu4GfhUaChzIJXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tabbable": "^6.4.0" + } + }, + "node_modules/fs-extra": { + "version": "11.3.4", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.4.tgz", + "integrity": "sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-east-asian-width": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.5.0.tgz", + "integrity": "sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-uri": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.5.tgz", + "integrity": "sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "basic-ftp": "^5.0.2", + "data-uri-to-buffer": "^6.0.2", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/hash-sum": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-2.0.0.tgz", + "integrity": "sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==", + "dev": true, + "license": "MIT" + }, + "node_modules/hast-util-to-html": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz", + "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-whitespace": "^3.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "stringify-entities": "^4.0.0", + "zwitch": "^2.0.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hookable": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz", + "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/html-entities": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.6.0.tgz", + "integrity": "sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ], + "license": "MIT" + }, + "node_modules/html-export-pdf-cli": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/html-export-pdf-cli/-/html-export-pdf-cli-1.2.0.tgz", + "integrity": "sha512-yhXr27+Rt2g1lEvBisCOpFbt5cVQOpai125s9iStKk1S8xBOpQ/YI56uiYKNj4Es3Fp/5z/1IsHV2Unkrfaq+g==", + "dev": true, + "license": "MIT", + "workspaces": [ + "examples/*" + ], + "dependencies": { + "cli-progress": "^3.12.0", + "commander": "^12.1.0", + "fast-glob": "^3.3.2", + "html-entities": "^2.5.2", + "pdf-lib": "1.17.1", + "puppeteer": "^22.15.0" + }, + "bin": { + "html-export-pdf-cli": "bin/html-export-pdf-cli.mjs" + }, + "engines": { + "node": ">=18.12.0" + } + }, + "node_modules/html-void-elements": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "license": "MIT", + "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.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/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" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/ip-address": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz", + "integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-interactive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", + "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-unicode-supported": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", + "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-what": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-5.5.0.tgz", + "integrity": "sha512-oG7cgbmg5kLYae2N5IVd3jm2s+vldjxJzK1pcu9LfpGuQ93MQSzo0okvRna+7y5ifrD+20FE8FvjusyGaz14fw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, + "node_modules/load-tsconfig": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/load-tsconfig/-/load-tsconfig-0.2.5.tgz", + "integrity": "sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/log-symbols": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", + "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^5.3.0", + "is-unicode-supported": "^1.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-symbols/node_modules/is-unicode-supported": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/mark.js": { + "version": "8.11.1", + "resolved": "https://registry.npmjs.org/mark.js/-/mark.js-8.11.1.tgz", + "integrity": "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.1", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", + "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minisearch": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/minisearch/-/minisearch-7.2.0.tgz", + "integrity": "sha512-dqT2XBYUOZOiC5t2HRnwADjhNS2cecp9u+TJRiJ1Qp/f5qjkeT5APcGPjHw+bz89Ms8Jp+cG4AlE+QZ/QnDglg==", + "dev": true, + "license": "MIT" + }, + "node_modules/mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "dev": true, + "license": "MIT" + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/multimatch": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-7.0.0.tgz", + "integrity": "sha512-SYU3HBAdF4psHEL/+jXDKHO95/m5P2RvboHT2Y0WtTttvJLP4H/2WS9WlQPFvF6C8d6SpLw8vjCnQOnVIVOSJQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-differ": "^4.0.0", + "array-union": "^3.0.1", + "minimatch": "^9.0.3" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/netmask": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.1.1.tgz", + "integrity": "sha512-eonl3sLUha+S1GzTPxychyhnUzKyeQkZ7jLjKrBagJgPla13F+uQ71HgpFefyHgqrjEbCPkDArxYsjY8/+gLKA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-function": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/oniguruma-to-es": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-3.1.1.tgz", + "integrity": "sha512-bUH8SDvPkH3ho3dvwJwfonjlQ4R80vjyvrU8YpxuROddv55vAEJrTuCuCVUhhsHbtlD9tGGbaNApGQckXhS8iQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex-xs": "^1.0.0", + "regex": "^6.0.1", + "regex-recursion": "^6.0.2" + } + }, + "node_modules/opentype.js": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/opentype.js/-/opentype.js-1.3.4.tgz", + "integrity": "sha512-d2JE9RP/6uagpQAVtJoF0pJJA/fgai89Cc50Yp0EJHk+eLp6QQ7gBoblsnubRULNY132I0J1QKMJ+JTbMqz4sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "string.prototype.codepointat": "^0.2.1", + "tiny-inflate": "^1.0.3" + }, + "bin": { + "ot": "bin/ot" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/ora": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-8.2.0.tgz", + "integrity": "sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^5.3.0", + "cli-cursor": "^5.0.0", + "cli-spinners": "^2.9.2", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^2.0.0", + "log-symbols": "^6.0.0", + "stdin-discarder": "^0.2.2", + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "dev": true, + "license": "MIT" + }, + "node_modules/ora/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pac-proxy-agent": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz", + "integrity": "sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==", + "dev": true, + "license": "MIT", + "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.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", + "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", + "dev": true, + "license": "MIT", + "dependencies": { + "degenerator": "^5.0.0", + "netmask": "^2.0.2" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true, + "license": "(MIT AND Zlib)" + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "license": "MIT", + "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/pdf-lib": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/pdf-lib/-/pdf-lib-1.17.1.tgz", + "integrity": "sha512-V/mpyJAoTsN4cnP31vc0wfNA1+p20evqqnap0KLoRUN0Yk/p3wN52DOEsL4oBFcLdb76hlpKPtzJIgo67j/XLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@pdf-lib/standard-fonts": "^1.0.0", + "@pdf-lib/upng": "^1.0.1", + "pako": "^1.0.11", + "tslib": "^1.11.1" + } + }, + "node_modules/pdfjs": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/pdfjs/-/pdfjs-2.5.4.tgz", + "integrity": "sha512-+vlkbSV2KDxn1btbBYzjnzt4jDxastsR/ZLzYIvOVMr+VZnW107j2TCwa0tzjp5gOk7SW9HmYRRPt+AMtjs6uw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rkusa/linebreak": "^1.0.0", + "opentype.js": "^1.3.3", + "pako": "^2.0.3", + "readable-stream": "^3.6.0", + "unorm": "^1.6.0", + "uuid": "^8.3.1" + }, + "engines": { + "node": ">=7" + } + }, + "node_modules/pdfjs/node_modules/pako": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", + "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==", + "dev": true, + "license": "(MIT AND Zlib)" + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true, + "license": "MIT" + }, + "node_modules/perfect-debounce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz", + "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.9", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.9.tgz", + "integrity": "sha512-7a70Nsot+EMX9fFU3064K/kdHWZqGVY+BADLyXc8Dfv+mTLLVl6JzJpPaCZ2kQL9gIJvKXSLMHhqdRRjwQeFtw==", + "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" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/preact": { + "version": "10.29.1", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.29.1.tgz", + "integrity": "sha512-gQCLc/vWroE8lIpleXtdJhTFDogTdZG9AjMUpVkDf2iTCNwYNWA+u16dL41TqUDJO4gm2IgrcMv3uTpjd4Pwmg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/preact" + } + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/property-information": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", + "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/proxy-agent": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.5.0.tgz", + "integrity": "sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==", + "dev": true, + "license": "MIT", + "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.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true, + "license": "MIT" + }, + "node_modules/pump": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz", + "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/puppeteer": { + "version": "22.15.0", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-22.15.0.tgz", + "integrity": "sha512-XjCY1SiSEi1T7iSYuxS82ft85kwDJUS7wj1Z0eGVXKdtr5g4xnVcbjwxhq5xBnpK/E7x1VZZoJDxpjAOasHT4Q==", + "deprecated": "< 24.15.0 is no longer supported", + "dev": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@puppeteer/browsers": "2.3.0", + "cosmiconfig": "^9.0.0", + "devtools-protocol": "0.0.1312386", + "puppeteer-core": "22.15.0" + }, + "bin": { + "puppeteer": "lib/esm/puppeteer/node/cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/puppeteer-core": { + "version": "22.15.0", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-22.15.0.tgz", + "integrity": "sha512-cHArnywCiAAVXa3t4GGL2vttNxh7GqXtIYGym99egkNJ3oG//wL9LkvO4WE8W1TJe95t1F1ocu9X4xWaGsOKOA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@puppeteer/browsers": "2.3.0", + "chromium-bidi": "0.6.3", + "debug": "^4.3.6", + "devtools-protocol": "0.0.1312386", + "ws": "^8.18.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/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" + } + ], + "license": "MIT" + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/regex/-/regex-6.1.0.tgz", + "integrity": "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-recursion": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-6.0.2.tgz", + "integrity": "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==", + "dev": true, + "license": "MIT", + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-utilities": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz", + "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==", + "dev": true, + "license": "MIT" + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/restore-cursor": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "dev": true, + "license": "MIT" + }, + "node_modules/rollup": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.60.1.tgz", + "integrity": "sha512-VmtB2rFU/GroZ4oL8+ZqXgSA38O6GR8KSIvWmEFv63pQ0G6KaBH9s07PO8XTXP4vI+3UJUEypOfjkGfmSBBR0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.60.1", + "@rollup/rollup-android-arm64": "4.60.1", + "@rollup/rollup-darwin-arm64": "4.60.1", + "@rollup/rollup-darwin-x64": "4.60.1", + "@rollup/rollup-freebsd-arm64": "4.60.1", + "@rollup/rollup-freebsd-x64": "4.60.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.60.1", + "@rollup/rollup-linux-arm-musleabihf": "4.60.1", + "@rollup/rollup-linux-arm64-gnu": "4.60.1", + "@rollup/rollup-linux-arm64-musl": "4.60.1", + "@rollup/rollup-linux-loong64-gnu": "4.60.1", + "@rollup/rollup-linux-loong64-musl": "4.60.1", + "@rollup/rollup-linux-ppc64-gnu": "4.60.1", + "@rollup/rollup-linux-ppc64-musl": "4.60.1", + "@rollup/rollup-linux-riscv64-gnu": "4.60.1", + "@rollup/rollup-linux-riscv64-musl": "4.60.1", + "@rollup/rollup-linux-s390x-gnu": "4.60.1", + "@rollup/rollup-linux-x64-gnu": "4.60.1", + "@rollup/rollup-linux-x64-musl": "4.60.1", + "@rollup/rollup-openbsd-x64": "4.60.1", + "@rollup/rollup-openharmony-arm64": "4.60.1", + "@rollup/rollup-win32-arm64-msvc": "4.60.1", + "@rollup/rollup-win32-ia32-msvc": "4.60.1", + "@rollup/rollup-win32-x64-gnu": "4.60.1", + "@rollup/rollup-win32-x64-msvc": "4.60.1", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/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" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/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" + } + ], + "license": "MIT" + }, + "node_modules/search-insights": { + "version": "2.17.3", + "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.17.3.tgz", + "integrity": "sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shiki": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-2.5.0.tgz", + "integrity": "sha512-mI//trrsaiCIPsja5CNfsyNOqgAZUb6VpJA+340toL42UpzQlXpwRV9nch69X6gaUxrr9kaOOa6e3y3uAkGFxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/core": "2.5.0", + "@shikijs/engine-javascript": "2.5.0", + "@shikijs/engine-oniguruma": "2.5.0", + "@shikijs/langs": "2.5.0", + "@shikijs/themes": "2.5.0", + "@shikijs/types": "2.5.0", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.8.7", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz", + "integrity": "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ip-address": "^10.0.1", + "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.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", + "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "socks": "^2.8.3" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/speakingurl": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz", + "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stdin-discarder": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz", + "integrity": "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/streamx": { + "version": "2.25.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.25.0.tgz", + "integrity": "sha512-0nQuG6jf1w+wddNEEXCF4nTg3LtufWINB5eFEN+5TNZW7KWJp6x87+JFL43vaAUPyCfH1wID+mNVyW6OHtFamg==", + "dev": true, + "license": "MIT", + "dependencies": { + "events-universal": "^1.0.0", + "fast-fifo": "^1.3.2", + "text-decoder": "^1.1.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "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/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.codepointat": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/string.prototype.codepointat/-/string.prototype.codepointat-0.2.1.tgz", + "integrity": "sha512-2cBVCj6I4IOvEnjgO/hWqXjqBGsY+zwPmHl12Srk9IXSZ56Jwwmy+66XO5Iut/oQVR7t5ihYdLB0GMa4alEUcg==", + "dev": true, + "license": "MIT" + }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "dev": true, + "license": "MIT", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/superjson": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/superjson/-/superjson-2.2.6.tgz", + "integrity": "sha512-H+ue8Zo4vJmV2nRjpx86P35lzwDT3nItnIsocgumgr0hHMQ+ZGq5vrERg9kJBo5AWGmxZDhzDo+WVIJqkB0cGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "copy-anything": "^4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/tabbable": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.4.0.tgz", + "integrity": "sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tar-fs": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.2.tgz", + "integrity": "sha512-QGxxTxxyleAdyM3kpFs14ymbYmNFrfY+pHj7Z8FgtbZ7w2//VAgLMac7sT6nRpIHjppXO2AwwEOg0bPFVRcmXw==", + "dev": true, + "license": "MIT", + "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.8", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.8.tgz", + "integrity": "sha512-U6QpVRyCGHva435KoNWy9PRoi2IFYCgtEhq9nmrPPpbRacPs9IH4aJ3gbrFC8dPcXvdSZ4XXfXT5Fshbp2MtlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "b4a": "^1.6.4", + "bare-fs": "^4.5.5", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + }, + "node_modules/teex": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/teex/-/teex-1.0.1.tgz", + "integrity": "sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "streamx": "^2.12.5" + } + }, + "node_modules/text-decoder": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.7.tgz", + "integrity": "sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "b4a": "^1.6.4" + } + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tiny-inflate": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz", + "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==", + "dev": true, + "license": "MIT" + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true, + "license": "0BSD" + }, + "node_modules/unbzip2-stream": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", + "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer": "^5.2.1", + "through": "^2.3.8" + } + }, + "node_modules/undici-types": { + "version": "7.19.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.19.2.tgz", + "integrity": "sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/unicode-trie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/unicode-trie/-/unicode-trie-0.3.1.tgz", + "integrity": "sha512-WgVuO0M2jDl7hVfbPgXv2LUrD81HM0bQj/bvLGiw6fJ4Zo8nNFnDrA0/hU2Te/wz6pjxCm5cxJwtLjo2eyV51Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "pako": "^0.2.5", + "tiny-inflate": "^1.0.0" + } + }, + "node_modules/unicode-trie/node_modules/pako": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==", + "dev": true, + "license": "MIT" + }, + "node_modules/unist-util-is": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", + "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz", + "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", + "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unorm": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/unorm/-/unorm-1.6.0.tgz", + "integrity": "sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA==", + "dev": true, + "license": "MIT or GPL-2.0", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/urlpattern-polyfill": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.0.0.tgz", + "integrity": "sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==", + "dev": true, + "license": "MIT" + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", + "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vite": { + "version": "5.4.21", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz", + "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vitepress": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/vitepress/-/vitepress-1.6.4.tgz", + "integrity": "sha512-+2ym1/+0VVrbhNyRoFFesVvBvHAVMZMK0rw60E3X/5349M1GuVdKeazuksqopEdvkKwKGs21Q729jX81/bkBJg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@docsearch/css": "3.8.2", + "@docsearch/js": "3.8.2", + "@iconify-json/simple-icons": "^1.2.21", + "@shikijs/core": "^2.1.0", + "@shikijs/transformers": "^2.1.0", + "@shikijs/types": "^2.1.0", + "@types/markdown-it": "^14.1.2", + "@vitejs/plugin-vue": "^5.2.1", + "@vue/devtools-api": "^7.7.0", + "@vue/shared": "^3.5.13", + "@vueuse/core": "^12.4.0", + "@vueuse/integrations": "^12.4.0", + "focus-trap": "^7.6.4", + "mark.js": "8.11.1", + "minisearch": "^7.1.1", + "shiki": "^2.1.0", + "vite": "^5.4.14", + "vue": "^3.5.13" + }, + "bin": { + "vitepress": "bin/vitepress.js" + }, + "peerDependencies": { + "markdown-it-mathjax3": "^4", + "postcss": "^8" + }, + "peerDependenciesMeta": { + "markdown-it-mathjax3": { + "optional": true + }, + "postcss": { + "optional": true + } + } + }, + "node_modules/vitepress-export-pdf": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/vitepress-export-pdf/-/vitepress-export-pdf-1.0.0.tgz", + "integrity": "sha512-YHMxXYk1y13v4BXl88yImpxxyBeuF6HUJ6UBGOplBebz81JJqAY1bDTyRMMWkKy0JZK/018imknicVgnaqlBTA==", + "dev": true, + "license": "MIT", + "workspaces": [ + "examples/*" + ], + "dependencies": { + "@condorhero/vuepress-plugin-export-pdf-core": "^3.0.3", + "debug": "^4.3.4", + "hash-sum": "^2.0.0" + }, + "bin": { + "press-export-pdf": "bin/press-export-pdf.mjs" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "vitepress": ">=1.0.0-alpha.35" + } + }, + "node_modules/vue": { + "version": "3.5.32", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.32.tgz", + "integrity": "sha512-vM4z4Q9tTafVfMAK7IVzmxg34rSzTFMyIe0UUEijUCkn9+23lj0WRfA83dg7eQZIUlgOSGrkViIaCfqSAUXsMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.32", + "@vue/compiler-sfc": "3.5.32", + "@vue/runtime-dom": "3.5.32", + "@vue/server-renderer": "3.5.32", + "@vue/shared": "3.5.32" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "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/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/ws": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.20.0.tgz", + "integrity": "sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA==", + "dev": true, + "license": "MIT", + "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.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "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.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "node_modules/zod": { + "version": "3.23.8", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", + "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..fe2514c --- /dev/null +++ b/package.json @@ -0,0 +1,15 @@ +{ + "name": "docs-vitepress", + "version": "1.0.0", + "description": "vitepress在线文档", + "scripts": { + "docs:dev": "vitepress dev docs", + "docs:build": "vitepress build docs", + "docs:preview": "vitepress preview docs", + "export-pdf": "press-export-pdf export docs" + }, + "devDependencies": { + "vitepress": "latest", + "vitepress-export-pdf": "^1.0.0" + } +}