# 简道云 FastAPI 服务系统说明书 ## 1. 系统概述 ### 1.1 系统简介 简道云 FastAPI 服务是一个基于 FastAPI 框架开发的后端服务系统,主要用于处理简道云插件发送的业务请求,与 F6 汽车维修管理系统进行数据交互,实现数据同步、批量处理、信息管理等核心功能。 ### 1.2 系统定位 - **服务对象**: 简道云插件前端 - **集成系统**: F6 汽车维修管理系统、简道云平台 - **主要功能**: 数据同步、批量操作、信息管理、工作流自动化 ### 1.3 系统特点 - **高性能**: 基于 FastAPI 异步框架,支持高并发请求 - **模块化**: 采用模块化设计,易于扩展和维护 - **可靠性**: 完善的异常处理和重试机制 - **自动化**: 支持后台任务自动执行和工作流自动提交 - **可维护性**: 清晰的代码结构和完善的日志记录 ## 2. 系统功能 ### 2.1 F6系统集成功能 #### 2.1.1 登录认证 **功能描述**: 实现 F6 系统的登录认证,支持用户名密码登录和验证码识别。 **主要流程**: 1. 接收用户名、密码、公司名称 2. 对密码进行 MD5 加密 3. 发送登录请求到 F6 系统 4. 如果触发验证码,自动识别并重试 5. 选择指定公司并完成登录 6. 返回登录结果和 Cookie 信息 **技术实现**: - 使用 `requests` 库发送 HTTP 请求 - 使用 `pytesseract` 进行验证码 OCR 识别 - 使用 `PIL` 进行图像预处理(对比度、亮度调整) #### 2.1.2 公司信息获取 **功能描述**: 获取 F6 系统中用户可访问的公司列表,并保存到简道云表单。 **主要流程**: 1. 使用用户名密码登录 F6 系统 2. 获取公司列表(单店或多店) 3. 将公司信息批量写入简道云表单 4. 返回时间戳用于后续查询 **输出格式**: - 单店: 返回门店名称 - 多店: 返回所有公司名称列表 #### 2.1.3 门店信息获取 **功能描述**: 获取指定公司下的门店列表及统计数据。 **主要流程**: 1. 登录 F6 系统并选择公司 2. 获取门店列表 3. 统计客户车辆数量和客户数量 4. 将门店信息批量写入简道云表单 5. 返回时间戳和统计数据 **输出内容**: - 门店名称列表 - 客户车辆总数 - 客户总数 #### 2.1.4 保持连接 **功能描述**: 心跳检测功能,用于保持连接活跃。 **实现**: 直接返回接收到的数据,不做任何处理。 ### 2.2 文件处理功能 #### 2.2.1 文件上传和下载 **功能描述**: 处理简道云插件上传的文件,下载并保存到本地。 **主要流程**: 1. 从简道云获取文件 URL 2. 解析文件名和扩展名 3. 根据时间戳生成唯一文件名 4. 下载文件到 `下载文件/` 目录 5. 返回文件保存路径 **文件命名规则**: `原文件名_时间戳.扩展名` #### 2.2.2 文件校验 **功能描述**: 校验上传的 Excel 文件格式是否符合要求。 **支持的操作类型**: - `create_brand`: 校验第一列是否为"品牌" - `modify_customer_info`: 校验第一列是否为"客户手机号" - `delete_cars`: 暂不校验 **校验流程**: 1. 读取 Excel 文件第一列 2. 检查表头是否符合要求 3. 返回校验结果(成功/失败) ### 2.3 数据管理功能 #### 2.3.1 品牌批量创建 **功能描述**: 从 Excel 文件读取品牌名称,批量创建到 F6 系统。 **主要流程**: 1. 从简道云获取任务数据(账号、密码、公司名称、文件路径) 2. 登录 F6 系统 3. 读取 Excel 文件(第一列为品牌名称) 4. 在后台线程中批量创建品牌 5. 立即返回"正在执行"提示 6. 后台任务完成后更新简道云表单并自动提交工作流 **后台任务处理**: - 遍历 Excel 文件中的每一行 - 调用 F6 API 创建品牌 - 记录成功和失败的结果 - 执行完成后删除上传的文件 - 更新简道云表单的执行明细 - 自动提交工作流到下一步 #### 2.3.2 客户信息修改 **功能描述**: 从 Excel 文件读取客户修改信息,批量修改 F6 系统中的客户信息。 **主要流程**: 1. 从简道云获取任务数据 2. 登录 F6 系统 3. 读取 Excel 文件(包含客户手机号、修改字段等) 4. 获取所有客户列表 5. 获取员工列表(用于匹配专属运营顾问) 6. 在后台线程中批量修改客户信息 7. 立即返回"正在执行中"提示 **Excel 文件格式**: - 第一列: 客户手机号(必需,用于匹配) - 其他列: 需要修改的字段(客户姓名、客户类型、客户来源、单位名称、专属运营顾问、客户备注等) **匹配逻辑**: - 根据客户手机号匹配 F6 系统中的客户 - 获取客户原始信息 - 合并 Excel 中的修改字段 - 解析地址信息(省市区) - 匹配专属运营顾问的用户ID #### 2.3.3 客户信息删除 **功能描述**: 批量删除 F6 系统中的客户信息。 **主要流程**: 1. 从简道云获取任务数据 2. 登录 F6 系统 3. 获取所有客户列表 4. 获取会员卡列表(提取客户ID) 5. 在后台线程中批量删除客户 6. 立即返回"正在执行中"提示 **删除规则**: - 跳过有最近消费时间的客户 - 跳过有会员卡的客户 - 8-20点之间每3.5秒删除一条,其余时间每1.5秒删除一条 - 记录成功和失败次数 #### 2.3.4 车辆信息删除 **功能描述**: 批量删除 F6 系统中的客户车辆信息。 **主要流程**: 1. 从简道云获取任务数据 2. 登录 F6 系统 3. 分页获取所有车辆列表 4. 获取会员卡列表(提取车辆ID) 5. 在后台线程中批量删除车辆 6. 立即返回"正在执行中"提示 **删除规则**: - 跳过有最近消费时间的客户车辆 - 跳过有会员卡的车辆 - 8-20点之间每3秒删除一条,其余时间每1秒删除一条 - 记录成功和失败次数 #### 2.3.5 历史记录删除 **功能描述**: 删除指定门店的历史维修记录。 **主要流程**: 1. 从简道云获取任务数据(账号、密码、公司名称、门店名称) 2. 登录 F6 系统 3. 获取门店列表并匹配门店ID 4. 在后台线程中删除历史维修记录 5. 立即返回"正在执行中"提示 **删除方式**: 调用 F6 系统的删除接口,删除整个门店的历史维修记录。 ### 2.4 BI任务功能 **功能描述**: 执行 BI 相关的数据处理和报表生成任务。 **当前状态**: 框架已搭建,具体业务逻辑待实现。 **预留接口**: - 支持从 Excel 文件读取数据 - 支持 F6 系统登录(如需要) - 支持后台线程执行 - 支持结果回写到简道云 ### 2.5 工作流自动化 **功能描述**: 自动获取简道云工作流的待处理任务并提交到下一步。 **主要流程**: 1. 获取工作流实例信息 2. 查找状态为待处理(status=0)的任务 3. 提取任务信息(username、instance_id、task_id) 4. 调用审批接口自动提交 5. 记录执行结果 **应用场景**: 后台任务执行完成后,自动将简道云表单提交到工作流下一步,无需人工干预。 ## 3. 技术架构 ### 3.1 系统架构 ``` ┌─────────────────┐ │ 简道云插件前端 │ └────────┬────────┘ │ HTTP/JSON ▼ ┌─────────────────┐ │ FastAPI 服务 │ │ ┌───────────┐ │ │ │ 路由层 │ │ │ └─────┬─────┘ │ │ │ │ │ ┌─────▼─────┐ │ │ │ 业务模块 │ │ │ │ - F6Module│ │ │ │ - Plugin │ │ │ └─────┬─────┘ │ │ │ │ │ ┌─────▼─────┐ │ │ │ 任务队列 │ │ │ └─────┬─────┘ │ │ │ │ │ ┌─────▼─────┐ │ │ │ 后台任务 │ │ │ └───────────┘ │ └────────┬────────┘ │ ┌────┴────┐ ▼ ▼ ┌────────┐ ┌────────┐ │ F6系统 │ │ 简道云 │ └────────┘ └────────┘ ``` ### 3.2 核心组件 #### 3.2.1 应用入口 (main.py) **职责**: - 应用初始化和生命周期管理 - 模块注册和路由配置 - 异常处理器配置 - 中间件配置(CORS) **关键功能**: - `lifespan`: 管理应用启动和关闭 - 全局异常处理 - 模块实例化并注册到注册表 #### 3.2.2 路由层 (app/api/routes.py) **职责**: - 定义 API 端点 - 请求验证和参数解析 - 调用业务模块处理请求 - 返回响应 **主要端点**: - `GET /health`: 健康检查 - `POST /webhook`: 业务请求处理 #### 3.2.3 业务模块层 **F6Module** (`app/module/module.py`): - F6 系统登录和认证 - 公司信息获取 - 门店信息获取 - 保持连接 **F6PluginModule** (`app/module/f6_plugin_module.py`): - 文件上传和校验 - 品牌批量创建 - 客户信息管理(修改、删除) - 车辆信息删除 - 历史记录删除 - BI任务 **OtherPluginModule** (`app/module/other_module.py`): - 其他插件功能(如短信签名状态) #### 3.2.4 任务处理层 **任务队列** (`app/utils/app_tools.py`): - 使用 `Queue` 实现任务队列 - 后台线程处理任务 - 支持同步等待结果 **后台任务** (`app/tasks/`): - `common.py`: 通用任务函数(更新简道云、工作流审批等) - `brand_tasks.py`: 品牌相关任务 - `customer_tasks.py`: 客户相关任务 - `delete_tasks.py`: 删除相关任务 - `bi_tasks.py`: BI相关任务 #### 3.2.5 核心工具层 **模块注册表** (`app/core/module_registry.py`): - 统一管理所有业务操作 - 支持操作查询和路由 - 存储操作元数据(描述、模块名等) **应用工具** (`app/utils/app_tools.py`): - 日志记录器配置(支持轮转) - 任务队列管理 - 请求头解码工具 - 后台调度器 **简道云API封装** (`app/api/__init__.py`): - 封装简道云所有API接口 - 支持失败重试机制 - 字段ID到标签名的替换 - 批量操作支持 ### 3.3 数据流 #### 3.3.1 同步任务流程 ``` 简道云插件 → FastAPI路由 → 业务模块 → 任务队列 → 处理线程 → 返回结果 → 简道云插件 ``` #### 3.3.2 后台任务流程 ``` 简道云插件 → FastAPI路由 → 业务模块 → 启动后台线程 → 立即返回 ↓ 后台任务执行 ↓ 更新简道云表单 ↓ 自动提交工作流 ``` ### 3.4 技术选型 | 技术 | 版本 | 用途 | |------|------|------| | FastAPI | 0.121.0 | Web框架 | | Uvicorn | 0.38.0 | ASGI服务器 | | Pydantic | - | 数据验证 | | Requests | 2.32.5 | HTTP请求 | | Pandas | 2.3.3 | Excel处理 | | APScheduler | 3.11.1 | 任务调度 | | Pillow | 12.0.0 | 图像处理 | | Pytesseract | 0.3.13 | OCR识别 | ## 4. 部署运维 ### 4.1 环境要求 - **操作系统**: Windows/Linux/macOS - **Python版本**: 3.8+ - **内存**: 建议 2GB+ - **磁盘**: 根据文件存储需求,建议 10GB+ ### 4.2 安装步骤 1. **克隆代码**: ```bash git clone cd fastapi_app ``` 2. **安装依赖**: ```bash pip install -r requirements.txt ``` 3. **配置环境**: - 编辑 `app/config.py`,配置 API Token - 确保目录权限正确(logs、下载文件、模板文件) 4. **启动服务**: ```bash python main.py # 或 uvicorn main:app --host 0.0.0.0 --port 5003 ``` ### 4.3 生产环境部署 #### 4.3.1 使用 Gunicorn + Uvicorn Workers ```bash pip install gunicorn gunicorn main:app -w 4 -k uvicorn.workers.UvicornWorker --bind 0.0.0.0:5003 ``` #### 4.3.2 使用 systemd 管理服务(Linux) 创建服务文件 `/etc/systemd/system/fastapi-app.service`: ```ini [Unit] Description=简道云 FastAPI 服务 After=network.target [Service] Type=simple User=your_user WorkingDirectory=/path/to/fastapi_app Environment="PATH=/path/to/venv/bin" ExecStart=/path/to/venv/bin/uvicorn main:app --host 0.0.0.0 --port 5003 Restart=always [Install] WantedBy=multi-user.target ``` 启动服务: ```bash sudo systemctl enable fastapi-app sudo systemctl start fastapi-app ``` #### 4.3.3 使用 Nginx 反向代理 Nginx 配置示例: ```nginx server { listen 80; server_name your_domain.com; location / { proxy_pass http://127.0.0.1:5003; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } ``` ### 4.4 监控和日志 #### 4.4.1 日志管理 - **日志位置**: `logs/简道云.log` - **日志轮转**: 单文件最大 5MB,保留 5 个备份 - **日志级别**: INFO - **日志格式**: `时间戳 级别:模块名:消息` #### 4.4.2 健康检查 定期访问 `/health` 端点检查服务状态: ```bash curl http://localhost:5003/health ``` #### 4.4.3 性能监控 建议使用以下工具监控服务性能: - **APM工具**: New Relic、Datadog 等 - **日志分析**: ELK Stack、Loki 等 - **指标监控**: Prometheus + Grafana ### 4.5 备份和恢复 #### 4.5.1 数据备份 需要备份的内容: - 配置文件 (`app/config.py`) - 日志文件 (`logs/`) - 下载的文件 (`下载文件/`) - 模板文件 (`模板文件/`) #### 4.5.2 恢复步骤 1. 恢复代码和配置文件 2. 恢复数据文件 3. 重新安装依赖 4. 重启服务 ## 5. 安全说明 ### 5.1 认证和授权 - **API Token**: 使用简道云 API Token 进行认证 - **F6系统**: 使用用户名密码登录,密码进行 MD5 加密 ### 5.2 数据安全 - **敏感信息**: API Token 建议使用环境变量管理 - **密码处理**: 密码在传输前进行 MD5 加密 - **文件存储**: 上传的文件在处理完成后自动删除 ### 5.3 网络安全 - **CORS配置**: 生产环境建议限制允许的来源 - **HTTPS**: 建议使用 HTTPS 加密传输 - **防火墙**: 限制服务端口访问 ### 5.4 安全建议 1. 定期更新依赖包,修复安全漏洞 2. 使用强密码策略 3. 定期审查日志,发现异常访问 4. 限制文件上传大小和类型 5. 实施请求频率限制 ## 6. 故障排查 ### 6.1 常见问题 #### 问题1: 服务启动失败 **可能原因**: - 端口被占用 - 依赖包未安装 - 配置文件错误 **解决方法**: - 检查端口占用: `netstat -ano | findstr 5003` - 重新安装依赖: `pip install -r requirements.txt` - 检查配置文件格式 #### 问题2: 登录失败 **可能原因**: - 用户名密码错误 - 公司名称不正确 - 验证码识别失败 - F6系统服务异常 **解决方法**: - 验证用户名密码和公司名称 - 检查 Tesseract OCR 是否正确安装 - 查看日志获取详细错误信息 #### 问题3: 文件上传失败 **可能原因**: - 文件格式不正确 - 文件路径不存在 - 磁盘空间不足 - 网络连接问题 **解决方法**: - 检查文件格式是否符合要求 - 确保目录存在且有写权限 - 检查磁盘空间 - 查看网络连接状态 #### 问题4: 后台任务未执行 **可能原因**: - 线程启动失败 - 任务执行异常 - 简道云API调用失败 **解决方法**: - 查看日志中的错误信息 - 检查简道云API Token是否有效 - 验证任务数据格式是否正确 ### 6.2 日志分析 查看日志文件: ```bash tail -f logs/简道云.log ``` 搜索错误: ```bash grep -i error logs/简道云.log ``` ### 6.3 性能优化 1. **并发处理**: 调整 Uvicorn workers 数量 2. **数据库连接池**: 如使用数据库,配置连接池 3. **缓存**: 对频繁访问的数据使用缓存 4. **异步处理**: 更多使用异步函数提高性能 ## 7. 扩展开发 ### 7.1 添加新功能模块 1. 在 `app/module/` 下创建新模块文件 2. 实现业务逻辑方法 3. 在 `main.py` 中注册模块和操作 4. 在 `app/schemas.py` 中添加数据模型(如需要) ### 7.2 添加新的API端点 1. 在 `app/api/routes.py` 中添加路由 2. 使用依赖注入获取所需服务 3. 实现业务逻辑 4. 返回响应 ### 7.3 添加新的后台任务 1. 在 `app/tasks/` 下创建任务文件 2. 实现后台任务函数 3. 在业务模块中调用,启动线程 4. 使用 `update_jiandaoyun` 更新结果 5. 使用 `approve_workflow` 自动提交工作流 ## 8. 附录 ### 8.1 API接口清单 | 端点 | 方法 | 描述 | |------|------|------| | `/health` | GET | 健康检查 | | `/webhook` | POST | 业务请求处理 | ### 8.2 操作类型清单 | 操作名 | 模块 | 类型 | |--------|------|------| | `login_in` | F6Module | 同步 | | `get_company_information` | F6Module | 同步 | | `get_store_information` | F6Module | 同步 | | `keep_alive` | F6Module | 同步 | | `check_file` | F6PluginModule | 同步 | | `create_brand` | F6PluginModule | 后台 | | `delete_history` | F6PluginModule | 后台 | | `delete_customer` | F6PluginModule | 后台 | | `delete_cars` | F6PluginModule | 后台 | | `modify_customer_info` | F6PluginModule | 后台 | | `bi_task` | F6PluginModule | 后台 | | `sms_signature_status` | OtherPluginModule | 同步 | ### 8.3 配置文件说明 **app/config.py**: - `BASE_DIR`: 项目根目录 - `SAVE_DIRECTORY`: 下载文件目录 - `MODE_DIRECTORY`: 模板文件目录 - `LOGS_DIRECTORY`: 日志目录 - `LOG_FILE`: 日志文件路径 - `JIANDAOYUN_API_TOKEN`: 简道云API Token ### 8.4 目录结构说明 - `logs/`: 日志文件存储 - `下载文件/`: 从简道云下载的文件临时存储 - `模板文件/`: 模板文件存储 - `app/`: 应用代码目录 - `app/api/`: API相关代码 - `app/core/`: 核心功能代码 - `app/module/`: 业务模块代码 - `app/tasks/`: 后台任务代码 - `app/utils/`: 工具类代码 --- **文档版本**: 2.0.0 **最后更新**: 2025年 **维护团队**: 数据组