--- url: /wiki/pi-client-skill-guide.md --- # Pi-fit 客户端安装与 Skill 使用说明 本文档用于指导用户从发布页下载并安装 Pi 客户端,完成登录、激活、工作区设置,以及 Skill 的安装和使用。按照以下步骤操作,即可完成基础环境准备并开始使用技能对话。 *** ## 1. 下载客户端 进入发布页后,找到对应系统版本的安装包并点击下载。 > 建议: > > * Windows 用户下载 `.exe` 安装包。 > > * 下载完成后,如浏览器提示“可能不安全”,请确认来源为官方发布页后再继续。 > > * 若下载速度较慢,可尝试刷新页面或更换网络环境。 下载地址: ![](/static-file/3926015e-be11-4a07-a422-01d3166a6a94/b4c57781-bcb2-477a-a85a-8453398bd552.png) *** ## 2. 安装 Pi 客户端 下载完成后,找到安装包文件,双击运行安装程序。 ![](/static-file/55dba88a-45ec-4779-b163-2f3ba17e15de/a2e6edf8-38f0-4e50-8514-f9cd76507e7d.png) 进入安装界面后,根据提示继续操作。通常保持默认安装路径即可,如需安装到指定目录,也可以自行选择。 ![](/static-file/6b99c607-af95-4a30-9534-4b44333b3675/3efd9f0e-9889-40ad-a1b1-ac5f8e8cd099.png) 安装完成后,点击 **完成** 退出安装向导。 ![](/static-file/800197ed-5ca2-4d53-912a-a25b1c1f6b72/f49d939c-c83f-4400-abc6-4499ca578f28.png) > 安装提示: > > * 如果系统弹出安全确认窗口,请选择允许或继续运行。 > > * 如果安装失败,请先关闭正在运行的 Pi 客户端后重试。 > > * 建议安装完成后从桌面快捷方式或开始菜单启动程序。 *** ## 3. 登录与激活 启动 Pi 客户端后,会进入登录页面。 ![](/static-file/dbe52909-32ae-47ec-a454-0627b9624b44/354bb3c6-d00c-41bb-89d0-cf2560a5561e.png) 根据页面提示完成登录操作。 ![](/static-file/ead46a50-929f-4807-b7cd-2261c3232c89/49839a6e-324a-4e51-9d98-68e59d69aeb9.png) 首次使用时可能需要完成账号激活。按照提示等待管理员分配角色后继续。 ![](/static-file/c3feb14e-9751-4c45-89bc-0bcd7c7a07ae/d909d51e-7e73-4c1d-973b-3a0cc3d2db8a.png) 激活完成后,点击 **钉钉登录**,登录成功后会进入 Pi 首页。 ![](/static-file/0bd5bc7b-1135-4cc9-a828-e13908cec608/b36d0bcf-56e2-4157-aa58-25fe13ba0823.png) > 登录说明: > > * 请确保钉钉账号已具备使用权限。 > > * 如果扫码或跳转登录失败,请检查网络连接,并重新打开客户端尝试。 > > * 如提示账号未授权,请联系管理员开通权限。 *** ## 4. 打开工作区 进入首页后,需要打开一个工作区。工作区用于存储项目文件、生成文件以及 Skill 运行过程中产生的相关内容。 点击 **打开工作区**,选择一个本地文件夹作为工作目录。 ![](/static-file/2a082052-1d58-4cc9-996f-488776b30d80/a65c22be-328f-45ec-918d-40301da84244.png) 选择完成后,客户端会加载该目录。工作区打开成功后,即可进入正常使用状态。 打开完成后: 正常使用状态: ![](/static-file/9a0a64ca-6e0f-4f09-8d34-4cfb901c3f4c/7f08ecba-dc56-42c5-9502-6f1edadcfc12.png) > 工作区建议: > > * 建议为每个项目单独创建一个文件夹,便于管理生成内容。 > > * 文件夹路径尽量不要包含特殊字符,避免部分工具读取失败。 > > * 如果是团队协作项目,可选择共享盘或项目统一目录。 *** ## 5. 安装 Skill Skill 是 Pi 中的技能扩展,可用于执行特定任务或增强对话能力。进入客户端后,找到 Skill 安装入口。 点击安装 Skill: ![](/static-file/7fcee3cb-4bfd-47b3-b36d-916d4446b0f4/ac9eface-ac0a-4ed8-b993-1bcea0ac8159.png) 根据提示选择需要安装的 Skill,并确认安装。 ![](/static-file/65bfea9b-89a7-4822-abab-0f2ea49dc885/e4839dfe-72d9-487b-a5b4-8c346df9710a.png) 安装完成后,Skill 会出现在可用技能列表中。 > 注意事项: > > * 安装 Skill 前请确认当前网络正常。 > > * 如果安装后没有显示,可尝试重启 Pi 客户端。 > > * 如果 Skill 依赖特定文件或环境,请先根据对应说明完成准备工作。 *** ## 6. 使用 Skill 在对话输入框中输入 `/`,系统会弹出可用技能列表。 使用 Skill:输入 `/` 选择技能。 ![](/static-file/e1e73442-00bb-4140-9481-595290e08de4/e217bdfc-35a3-4b46-977d-40f4b339bf22.png) 选择目标 Skill 后,输入你的需求或任务描述,即可开始对话。 开始对话: ![](/static-file/94483dd5-c18a-483c-96a8-1b5705bcf9c0/ea0a7228-eb99-435a-996b-994024cde660.png) ![](/static-file/fa7015f7-6530-4aed-928e-8b1ebcaa8c97/6cff2963-9856-433c-b68d-ec1d45bff26e.png) > 使用建议: > > * 描述任务时尽量明确目标、输入内容和期望输出。 > > * 如果任务涉及文件,请先确认文件已放在当前工作区中。 > > * 如需修改生成结果,可以继续在对话中说明修改要求。 *** ## 7. 常见问题 ### 7.1 安装包无法运行怎么办? 可以尝试以下方法: 1. 确认安装包是否下载完整。 2. 右键安装包,选择“以管理员身份运行”。 3. 检查杀毒软件或系统安全策略是否拦截。 4. 删除安装包后重新下载。 ### 7.2 登录失败怎么办? 可以检查: 1. 当前网络是否正常。 2. 钉钉账号是否已开通权限。 3. 客户端版本是否为最新版本。 4. 退出客户端后重新打开再尝试登录。 ### 7.3 Skill 安装成功但无法使用怎么办? 可以尝试: 1. 重启 Pi 客户端。 2. 确认当前已打开工作区。 3. 在输入框输入 `/` 查看技能是否出现在列表中。 4. 如仍无法使用,请联系管理员检查 Skill 配置。 ### 7.4 工作区应该选择哪里? 建议选择一个专门用于当前项目的文件夹,例如: D:\PiWorkspace\项目名称 这样可以避免多个项目文件混在一起,也方便后续查找和备份。 *** ## 8. 快速流程总结 1. 打开发布页,下载客户端安装包。 2. 双击安装包,完成安装。 3. 启动 Pi 客户端,登录并完成账号激活。 4. 点击钉钉登录进入首页。 5. 打开工作区,用于存储项目文件和生成内容。 6. 安装所需 Skill。 7. 在输入框输入 `/`,选择 Skill 并开始对话。 完成以上步骤后,即可正常使用 Pi 客户端和 Skill 功能。 --- --- url: /wiki/pi-skillhub-publish.md --- # SkillHub 发布 Skill 操作说明 本文档用于说明如何将已经制作完成的 Pi Skill 打包为 ZIP 文件,并发布到 SkillHub 平台,供其他用户下载、安装和使用。 *** ## 1. 发布前准备(可跳过,使用Pi直接检查) 在发布 Skill 之前,需要先确认 Skill 文件夹已经整理完成。 一个标准 Skill 通常包含: skill-name\ ├── SKILL.md\ ├── docs\ │   └── 相关说明文档.md\ ├── templates\ │   └── 模板文件.md\ └── scripts\   └── 可选脚本文件 其中必须包含: | 文件/目录 | 是否必需 | 说明 | | --- | --- | --- | | `SKILL.md` | 必需 | Skill 主说明文件 | | `docs` | 可选 | 存放知识库、操作手册、FAQ 等资料 | | `templates` | 可选 | 存放输出模板 | | `scripts` | 可选 | 存放辅助脚本 | 发布前重点检查: 1. `SKILL.md` 是否存在。 2. `SKILL.md` 顶部是否包含 `name` 和 `description`。 3. Skill 文件夹名称是否与 `name` 保持一致。 4. 是否删除了无关临时文件。 5. 是否确认没有包含敏感信息,例如数据库密码、服务器私钥、Token 等。 6. 是否已在本地 Pi 中测试可以正常识别和使用。 *** ## 2. SKILL.md 基础要求(可跳过,使用Pi直接检查) `SKILL.md` 文件顶部需要包含 frontmatter,例如: \---\ name: my-demo-skill\ description: 当用户需要整理项目资料、生成说明文档、汇总文件内容或按照固定流程输出结果时使用本技能。\ \---\ ​\ \# My Demo Skill\ ​\ \## 使用场景\ ​\ 当用户提出资料整理、文档生成、流程说明、表格汇总等需求时,使用本技能。\ ​\ \## 操作规则\ ​\ 1\. 先读取当前工作区相关文件。\ 2\. 根据用户需求整理内容。\ 3\. 输出结构清晰的 Markdown 文档。\ 4\. 如果信息不足,先向用户确认。 字段说明: | 字段 | 说明 | | --- | --- | | `name` | Skill 名称,建议与文件夹名称一致 | | `description` | Skill 描述,用于告诉 Pi 什么时候使用该技能 | > `description` 必须写清楚适用场景,否则用户安装后 Pi 可能无法准确识别或调用该 Skill。 *** ## 3. 打包 Skill,可以直接使唤Pi打包Skill,并打包成zip 发布前需要将整个 Skill 文件夹压缩为 ZIP 文件。 ![](/static-file/46de0450-3076-4d4e-9f7f-12b008d64682/fd5719ae-4744-4bb0-be31-c13664943880.png) ### 3.1 正确打包方式 假设 Skill 文件夹名称为: my-demo-skill 压缩后应得到: my-demo-skill.zip ZIP 内部结构应为: my-demo-skill.zip\ └── my-demo-skill\   ├── SKILL.md\   ├── docs\   └── templates ### 3.2 不推荐的打包方式 不要只压缩 `SKILL.md` 文件: my-demo-skill.zip\ └── SKILL.md 不推荐原因:缺少外层 Skill 文件夹,用户解压后容易放错目录,也不利于多个 Skill 管理。 *** ## 4. 登录 SkillHub 打开浏览器,访问发布地址: https://skillhub.singzer.cn/ 进入首页后,可以看到 SkillHub 管理页面。 首页界面如下: ![](/static-file/cbfe8c2d-ee88-4505-82a4-8357593e07a2/48feb5ec-c6d9-4d57-8bc4-c913ef47034e.png) 点击右上角登录 ![](/static-file/0eb37cdb-faec-4bba-9303-56167f592163/533d1e1f-eb96-4eb2-9eff-17f516ff27c6.png) 登录成功后进入管理首页。 *** ## 5. 进入发布页面 在 SkillHub 首页或管理页面中,找到发布入口,进入 Skill 发布页面。 发布页面如下: ![](/static-file/d801ce35-99d5-4189-abd9-27a2163261c2/d858deff-4ab5-4a8f-b9b5-754e4d68f151.png) 发布 Skill 的核心操作是: > 将 Skill 打包成 ZIP 文件,然后上传发布。 *** ## 6. 上传并发布 Skill 在发布页面中,按照页面提示填写或选择相关内容。 一般需要操作以下内容: 1. 点击上传按钮。 2. 选择本地已经压缩好的 `.zip` 文件。 3. 确认 Skill 名称、描述或版本信息。 4. 点击确认发布。 ![](/static-file/cbf986ba-9470-428b-8910-5c02f1d60a8e/2ce2289c-3922-4dee-88c9-0613fba6e1ea.png) 5. 等待管理员审核完成即可。 ![](/static-file/eba2f160-91dd-4973-8bd5-29d1489ec75a/b8784d1b-7a16-4bd7-a1b0-3f61da8dba2a.png) *** ## 7. 发布成功后的检查 可在“我的技能”页面中查看已发布的技能 ![](/static-file/ee2fdfb5-24d5-4834-a893-0b12b5ae4abf/f5ec8e73-147a-4fb9-89bf-d68d5f458b7d.png) 打开PI客户端,点击“刷新SkillHub”按钮,能够看到新发布的Skill,点击安装,安装成功后,就可以正常测试使用。 ![](/static-file/5f54790c-47c7-4c4e-8829-495b5b6ab6e7/a814c598-c254-4982-a792-070fcd7bf0a5.png) *** ### 7.1 上传失败怎么办? 可以检查: 1. 网络是否正常。 2. ZIP 文件是否过大。 3. ZIP 文件是否损坏。 4. 文件名是否包含特殊字符。 5. 是否已经登录过期,重新登录后再试。 ### 7.2 发布后用户看不到 Skill 怎么办? 可能原因: 1. 用户没有下载最新版。 2. 用户解压后目录结构不正确。 3. 用户没有把 Skill 放到正确目录。 4. 用户没有重启 Pi。 5. `SKILL.md` 中 `description` 为空或格式错误。 ### 7.3 Skill 无法正常触发怎么办? 检查 `description` 是否写得过于简单。 建议将: description: 文档技能 改为: description: 当用户需要根据项目资料生成操作说明、安装文档、使用手册、验收报告或维护记录时使用本技能。 ### 7.4 更新 Skill 应该怎么发布? 建议: 1. 修改 Skill 文件。 2. 更新版本号。 3. 重新压缩 ZIP。 4. 在 SkillHub 上传新版本。 5. 在更新说明中写清楚修改内容。 *** ## 8. 推荐发布说明模板 每次发布时,可以附带以下说明: \# my-demo-skill 发布说明\ ​\ \## 版本\ ​\ v1.0.0\ ​\ \## 功能简介\ ​\ 本 Skill 用于整理项目资料,并根据固定模板生成 Markdown 操作说明文档。\ ​\ \## 安装方法\ ​\ 1\. 下载 \`my-demo-skill.zip\`。\ 2\. 解压得到 \`my-demo-skill\` 文件夹。\ 3\. 将文件夹复制到:\ ​\   C:\Users\admin\\.pi\agent\skills\ ​\ 4\. 重启 Pi。\ 5\. 在输入框输入 \`/\`,选择 \`my-demo-skill\` 使用。\ ​\ \## 更新说明\ ​\ \- 首次发布。\ ​\ \## 注意事项\ ​\ \- 请勿删除 Skill 文件夹内的 \`docs\` 和 \`templates\` 目录。\ \- 请确认 Pi 已打开正确工作区。 *** ## 9. 快速流程总结 1. 准备 Skill 文件夹。 2. 确认 `SKILL.md` 内容完整。 3. 将整个 Skill 文件夹压缩为 ZIP。 4. 打开 SkillHub:`https://skillhub.singzer.cn/`。 5. 使用账号 `admin` 登录。 6. 进入发布页面。 7. 上传 ZIP 文件。 8. 填写名称、描述、版本和更新说明。 9. 点击发布。 10. 发布成功后下载测试。 11. 将下载和安装说明发给用户。 完成以上步骤后,Skill 即可通过 SkillHub 发布并分发给用户使用。 --- --- url: /wiki/pi-introduction.md --- # 介绍 > 该页面暂无正文内容。 --- --- url: /wiki/wiki-placeholder.md --- # 1 > 该页面暂无正文内容。 --- --- url: /wiki/developer-docs.md --- # 研发文档 研发文档用于沉淀研发侧稳定资料,优先放产品线、架构、调试、开发流程和参考文档。 ## 目录 ## 维护口径 | 类型 | 放置位置 | | --- | --- | | 基础概念、网络原理、虚拟化入门 | 概念入门 | | 产品能力、业务边界、系统架构 | 产品线 | | 远程访问、现场联调、网络配置、虚拟机、容器 | 开发调试 | | 生产环境、部署维护、巡检排障 | 运维文档 | | 协议文件、PDF、外部资料沉淀 | 参考文档 | | 临时项目问题 | 先记录到对应产品线,稳定后再整理 | --- --- url: /wiki/concepts-basics.md --- # 概念入门 概念入门用于解释研发、交付和现场排障中反复出现的基础概念。先理解这些概念,再看产品线、开发调试和运维文档,会更容易判断问题属于软件、系统还是网络。 ## 分类 ## 阅读建议 | 如果你想理解 | 先看 | | --- | --- | | 程序为什么打不开、服务为什么没启动、日志应该看哪里 | 软件运行原理 | | 为什么同一个软件在不同系统上表现不同、信创适配为什么复杂 | 操作系统与处理器架构 | | 为什么现场设备连不上、端口不通、远程桌面打不开 | 网络和常见协议 | ## 维护口径 * 每个概念优先解释“它是什么、现场为什么会遇到、排查时看哪里”。 * 内容变多以后再继续拆小节,不先按术语堆目录。 * 与具体产品强相关的内容放到产品线,概念页只保留通用解释。 --- --- url: /wiki/concepts-basics/software-runtime.md --- # 软件运行原理 软件运行原理解释一个基础问题:软件是什么,为什么能在电脑、服务器、工控机、浏览器或容器里跑起来。 软件不是“屏幕上的按钮”。按钮、窗口、网页和服务端接口只是表现形式。真正运行起来的,是 CPU 能执行的机器指令、操作系统能加载的程序、运行时能解释的脚本、浏览器能解析的资源,以及它们依赖的配置、权限、文件、网络和外部服务。 ## 概览 排查“软件不能运行”时,先把问题拆成几个层次: | 层次 | 关键问题 | 常见现象 | | --- | --- | --- | | 文件形态 | 它是二进制、脚本、网页资源还是容器镜像? | 找不到程序、格式不对、双击没反应 | | 安装包 | 它是系统安装包、语言依赖包还是容器镜像? | 安装失败、依赖缺失、架构不匹配 | | 系统与架构 | 当前系统和 CPU 能不能运行它? | `Exec format error`、安装包不兼容 | | 加载与依赖 | 运行时、动态库、外部服务是否齐全? | 缺库、版本不兼容、接口报错 | | 启动方式 | 谁启动它,以什么参数和目录启动? | 手动正常,服务失败 | | 权限 | 运行用户能不能读取、执行、写入资源? | `Permission denied`、拒绝访问 | | 配置 | 程序实际读到什么配置? | 端口错、连错数据库、生产/测试环境混用 | | 观测 | 日志、退出码、端口、网络请求说明了什么? | 页面报错但后端日志才有真正原因 | 本文按参考手册方式组织。读者不需要一次读完,可以按问题跳到对应章节。 ## 软件形态 ### 二进制可执行文件 二进制可执行文件已经被编译成特定系统和处理器架构能加载的机器代码。 | 平台 | 常见形态 | 关注点 | | --- | --- | --- | | Windows | `.exe`、`.dll` | 系统版本、VC 运行库、管理员权限、杀毒软件拦截 | | Linux | 常见无扩展名、`.so` | 架构、可执行权限、动态库、运行用户 | | macOS | `.app`、Mach-O 二进制、`.dylib` | 签名、公证、权限、架构 | 同一份源码可能构建出多个产物。例如 Windows x86\_64、Linux x86\_64、Linux ARM64、LoongArch 产物不能随便混用。 ### 脚本和运行时 脚本文件本身通常不是直接给 CPU 执行,而是交给解释器或运行时读取。 | 类型 | 例子 | 运行方式 | | --- | --- | --- | | Shell 脚本 | `.sh` | `bash script.sh` 或 `./script.sh` | | Python | `.py` | `python app.py` | | Node.js | `.js`、`.mjs` | `node app.js` | | PowerShell | `.ps1` | `pwsh script.ps1` 或 Windows PowerShell | | 批处理 | `.bat`、`.cmd` | `cmd.exe` 执行 | 脚本运行失败时,要同时检查脚本内容、解释器版本、依赖包、当前目录、环境变量和权限。 ### 字节码和虚拟机 有些语言先生成中间产物,再由虚拟机或运行时执行。 | 技术 | 常见产物 | 关注点 | | --- | --- | --- | | Java | `.class`、`.jar` | JDK/JRE 版本、启动参数、内存限制 | | .NET | `.dll`、`.exe` | .NET Runtime 版本、系统兼容性 | | WebAssembly | `.wasm` | 运行宿主、浏览器或边缘运行时支持 | ### 网页资源和客户端壳 Web 前端由浏览器加载 HTML、CSS、JavaScript、图片和字体。Electron、Tauri 等桌面客户端常把网页资源和本地能力打包在一起。 | 形态 | 关注点 | | --- | --- | | 浏览器页面 | 资源路径、接口地址、缓存、证书、跨域 | | Electron 客户端 | 打包资源、自动更新、本地缓存、系统依赖 | | Tauri 客户端 | WebView、系统权限、本地后端能力 | 页面打不开不一定是“前端坏了”。要区分静态资源 404、接口 404、接口 500、证书失败、浏览器缓存和网络不通。 ### 容器镜像 容器镜像打包了文件系统、程序、依赖和启动命令。它不是一个完整虚拟机,通常共享宿主机内核。 | 内容 | 例子 | | --- | --- | | 文件系统 | `/app`、`/usr/lib`、配置模板 | | 程序 | API 服务、数据库、任务进程 | | 依赖 | 动态库、运行时、字体、证书 | | 启动命令 | `CMD`、`ENTRYPOINT` | 容器启动失败时,除了看应用日志,还要看镜像架构、环境变量、挂载目录权限、端口映射和网络。 ## 包、安装包和包管理器 “包”是软件分发的基本单位。一个包通常不只是一个可执行文件,而是一组文件和元数据。 | 内容 | 说明 | | --- | --- | | 程序文件 | 可执行文件、动态库、脚本、静态资源 | | 元数据 | 名称、版本、架构、依赖、维护者、描述 | | 安装脚本 | 安装前后执行的动作,例如创建用户、注册服务、刷新缓存 | | 签名 / 校验 | 验证包来源和完整性 | | 卸载信息 | 记录哪些文件由这个包安装,便于升级和卸载 | 包管理器负责安装、升级、卸载、查询软件包,并处理依赖关系。软件仓库是包管理器下载软件包的来源。 ### 系统安装包 | 平台 / 发行版 | 常见格式 | 常见包管理器 | 关注点 | | --- | --- | --- | --- | | Windows | `.exe`、`.msi`、`.msix` | Windows Installer、winget、Chocolatey、Scoop | 管理员权限、UAC、安装路径、VC 运行库、静默安装参数 | | macOS | `.app`、`.dmg`、`.pkg` | Installer、Homebrew | 签名、公证、Gatekeeper、Intel / Apple Silicon 架构 | | Debian 系 Linux | `.deb` | `apt`、`dpkg` | 依赖包、软件源、系统版本、CPU 架构 | | Red Hat 系 Linux | `.rpm` | `dnf`、`yum`、`rpm` | 依赖包、仓库、SELinux、系统库版本 | | Arch 系 Linux | `.pkg.tar.zst` | `pacman` | 滚动更新、依赖版本、AUR 风险 | | Alpine Linux | `.apk` | `apk` | musl libc、轻量容器、glibc 兼容问题 | | Android | `.apk`、`.aab` | 系统安装器、应用商店、MDM | ABI、签名、系统权限、厂商定制 | | 容器 | OCI image、Docker image | Docker、Podman、containerd | 镜像架构、基础镜像、入口命令、挂载权限 | 不要只看文件后缀。`.deb` 也分 `amd64`、`arm64`、`loongarch64`;`.rpm` 也分发行版和系统库版本。能安装不代表能正常运行,能运行不代表所有外设和服务都可用。 ### 语言依赖包 很多开发语言还有自己的包生态。它们解决的是“程序内部依赖”,不是完整替代系统包管理器。 | 生态 | 常见文件 / 工具 | 关注点 | | --- | --- | --- | | Node.js | `package.json`、`node_modules`、npm、pnpm、yarn | Node 版本、锁文件、原生模块架构 | | Python | `requirements.txt`、`pyproject.toml`、pip、venv | Python 版本、虚拟环境、系统库依赖 | | Java | Maven、Gradle、`.jar` | JDK 版本、仓库镜像、依赖冲突 | | .NET | NuGet、`.nupkg` | Runtime 版本、目标框架 | | Rust | Cargo、`Cargo.toml` | 目标架构、系统库、交叉编译 | | Go | Go modules、`go.mod` | Go 版本、CGO、目标系统和架构 | 语言包经常依赖系统能力。例如 Python 的图像库可能依赖系统图形库,Node 的原生模块可能需要按 CPU 架构重新编译,Java 程序可能需要系统字体和证书。 ### 包管理和现场排障 | 现象 | 常见原因 | 排查方向 | | --- | --- | --- | | 安装包提示架构不支持 | 下载了错误架构 | 对比 `uname -m`、系统信息和包名 | | 安装时缺依赖 | 软件源不完整、系统版本太旧 | 检查仓库、离线依赖包、厂商源 | | 安装成功但启动失败 | 运行库、配置、权限、服务未就绪 | 看启动日志和系统日志 | | 升级后功能异常 | 依赖版本变化、配置迁移失败 | 看升级日志、配置差异、回滚方案 | | 离线现场无法安装 | 没准备完整依赖 | 提前做离线包、镜像源或安装介质 | | 同一安装包有的机器能跑有的不能 | 系统补丁、架构、库版本、驱动不同 | 记录完整环境,不只记录系统名称 | 交付安装包时,建议同时标明系统、架构、版本和安装方式,例如 `product-linux-arm64-v1.2.3.deb`、`product-windows-x64-v1.2.3.msi`、`product-loongarch64-v1.2.3.tar.gz`。 ## 从源码到运行 源码是给人和工具看的。运行时,源码必须被编译、解释、打包或加载。 ```mermaid flowchart LR A[源码\nGo / C / Rust / Java / JS] --> B{构建方式} B -->|编译| C[二进制可执行文件] B -->|打包| D[前端静态资源 / 客户端包] B -->|解释执行| E[脚本 + 解释器] B -->|字节码| F[虚拟机 / 运行时] C --> G[操作系统加载运行] D --> H[浏览器 / 客户端壳加载] E --> I[运行时读取执行] F --> I ``` | 语言/技术 | 常见运行方式 | 现场关注点 | | --- | --- | --- | | Go / Rust / C / C++ | 编译成二进制 | 架构是否匹配、依赖库是否缺失、权限是否可执行 | | Java | JVM 运行字节码或 jar | JDK/JRE 版本、启动参数、内存限制 | | Node.js | Node 运行 JS | Node 版本、依赖包、环境变量 | | Python | Python 解释器运行脚本 | Python 版本、虚拟环境、pip 依赖 | | Web 前端 | 浏览器加载 HTML/CSS/JS | 资源路径、浏览器兼容、接口地址、缓存 | | Electron | Chromium + Node + 本地壳 | 系统依赖、打包资源、自动更新、权限 | ## 程序如何被操作系统启动 当你双击一个程序,或在命令行执行一个文件时,操作系统大致会做这些事: 1. 找到可执行文件。 2. 判断当前系统和处理器能不能识别它。 3. 检查执行权限。 4. 加载程序本身和它依赖的动态库。 5. 创建进程,分配内存、文件句柄、网络资源。 6. 设置参数、环境变量和工作目录。 7. 把控制权交给程序入口。 对应到现场问题: | 现象 | 可能原因 | | --- | --- | | 双击没反应 | 架构不匹配、依赖缺失、权限不足、被安全软件拦截 | | 提示找不到库 | 动态库缺失、库版本不对、搜索路径不对 | | Linux 下提示 `Permission denied` | 文件没有执行权限,或目录权限不足 | | Linux 下提示 `Exec format error` | 程序架构和系统架构不匹配 | | 程序启动后马上退出 | 配置错误、端口冲突、依赖服务不可用 | 排查时不要只看“能不能打开”,要确认系统类型、CPU 架构、启动方式、运行用户、工作目录、参数、环境变量和日志。 ## 命令行环境 ### 终端、Shell 和 CLI 终端是输入输出通道,Shell 是解释命令的程序,CLI 是命令行界面这种交互方式。 | 概念 | 说明 | | --- | --- | | 终端 | 负责接收键盘输入、显示程序输出。现代常见为终端模拟器或 SSH 会话 | | Shell | 读取命令、解析参数、启动程序,例如 `bash`、`zsh`、`cmd.exe`、PowerShell | | CLI | Command Line Interface,命令行界面,例如 `git`、`ssh`、`curl` | Shell 读取一行文本,判断这是内置命令、脚本,还是某个可执行文件,然后请操作系统启动对应程序。 ```bash curl https://example.com ls -l /opt ./install.sh --port 8080 ``` ### 命令、参数和退出码 命令行程序靠文本输入输出和退出码表达结果。 | 概念 | 说明 | | --- | --- | | 命令 | 要执行的程序名或脚本名 | | 参数 | 告诉程序要做什么,例如 `--port 8080` | | 标准输出 stdout | 正常结果输出 | | 标准错误 stderr | 错误、警告、诊断信息 | | 退出码 | 程序结束状态,通常 `0` 表示成功,非 `0` 表示失败 | 排查 CLI 时要保留完整命令和完整输出。只说“运行失败”不够,需要知道当前目录、执行用户、参数、stdout、stderr 和退出码。 ## Unix 传统 Unix 系统把命令行、进程、文件和权限的组合模式做得很彻底。20 世纪 60 年代末,贝尔实验室的 Ken Thompson、Dennis Ritchie 等人从大型分时系统的经验里,做出了一个更小、更可组合的系统。后来 C 语言、Unix、BSD、GNU/Linux、macOS、Android、服务器运维工具链,都沿着这条线继续发展。 Unix 给后来的软件世界留下了几个重要想法: | 想法 | 含义 | 现场价值 | | --- | --- | --- | | 小工具做一件事 | `cat`、`grep`、`awk`、`curl`、`ssh` 各自解决清晰的小问题 | 出问题时可以一步步拆开验证 | | 文本作为接口 | 命令输入和程序输出多用文本表达 | 日志、脚本、自动化都容易串起来 | | 管道组合 | 一个程序的输出可以接到另一个程序的输入 | `cat app.log \| grep ERROR \| tail` 可以快速过滤问题 | | 一切皆文件 | 普通文件、设备、管道、Socket 都尽量用类似文件的方式访问 | 理解路径、权限、句柄、日志、设备访问会更统一 | | 用户和权限 | 程序以某个用户身份运行,只能访问被授权的资源 | 解释大量“手动能跑,服务跑不了”的问题 | “一切皆文件”不是绝对规则,而是一个有用的理解模型。普通文件是文件,日志是文件,配置是文件;很多设备也暴露成路径,例如 Linux 的 `/dev/ttyUSB0` 串口设备;进程、端口、系统状态也常通过类似文件或文本接口查看。 ## DOS、cmd 和 PowerShell 命令行不是 Unix 独有的。个人电脑普及后,很多人第一次接触命令行是在 DOS 里。 DOS 可以理解成早期个人电脑上的磁盘操作系统。机器启动后,用户看到的往往不是图形桌面,而是类似这样的提示符: ```bat C:\> ``` 这里的 `C:` 是盘符,`\` 是路径分隔符,`>` 后面等待用户输入命令。用户输入 `dir` 看目录,输入 `copy` 复制文件,输入程序名启动软件。很多批处理脚本用 `.bat` 或 `.cmd` 结尾,用来把一串命令自动跑完。 ```bat dir C:\data copy app.exe D:\backup\ ping 192.168.1.1 ``` Windows 9x 还和 DOS 关系很深;Windows NT 之后的命令提示符主要是 `cmd.exe`。它保留了很多 DOS 风格命令和习惯,但现代 Windows 的 `cmd.exe` 不是“真正的 DOS”。它是 Windows 里的命令解释器,运行在 Windows 的权限、进程、文件系统和安全模型之上。 PowerShell 也是 Shell,但它比传统 `cmd.exe` 更适合自动化系统管理。Unix 管道通常传文本,PowerShell 管道主要传对象,所以它可以更稳定地处理服务、进程、注册表、证书、JSON 等结构化信息。 ```powershell Get-Process Get-Service | Where-Object Status -eq "Running" Get-ChildItem C:\data | Sort-Object Length ``` 常见差异: | 主题 | DOS / cmd | Unix Shell | PowerShell | | --- | --- | --- | --- | | 常见提示符 | `C:\>` | `$` 或 `#` | `PS C:\>` | | 路径习惯 | `C:\data\app.exe` | `/opt/app/app` | 两种路径都能处理,Windows 下常见 `C:\...` | | 脚本后缀 | `.bat`、`.cmd` | `.sh` | `.ps1` | | 管道 | 文本为主 | 文本为主 | 对象为主 | | 权限模型 | 早期 DOS 基本是单用户模型,现代 cmd 使用 Windows 权限 | `rwx`、用户、组、其他人 | Windows ACL、执行策略、管理员权限 | | 常见用途 | 兼容老脚本、简单维护命令 | Linux/macOS/服务器运维 | Windows 自动化、系统管理、跨平台脚本 | 现场排障时,不要只问“是不是命令行”,要问清楚是哪一种命令行: | 问题 | 为什么重要 | | --- | --- | | 是 `cmd.exe` 还是 PowerShell? | 同一条命令的引号、变量、管道、转义规则可能不同 | | 是 Windows 还是 Linux? | 路径、权限、可执行文件格式、服务管理方式不同 | | 是本机终端还是 SSH 远程终端? | 当前用户、工作目录、网络位置都可能不同 | | 是管理员权限还是普通用户? | Windows 下很多安装、服务、设备操作需要管理员权限 | | 是手动运行还是服务自动运行? | 服务环境变量、工作目录、用户身份经常和手动终端不同 | ## 权限 ### Unix-like 权限和 chmod Unix-like 系统的基础权限通常分为三组: | 对象 | 说明 | | --- | --- | | user / owner | 文件所有者 | | group | 文件所属组 | | others | 其他用户 | 每组又有三种基础权限: | 权限 | 文件上的含义 | 目录上的含义 | | --- | --- | --- | | `r` read | 读取文件内容 | 列出目录内文件名 | | `w` write | 修改文件内容 | 在目录内创建、删除、重命名文件 | | `x` execute | 把文件当程序执行 | 进入或穿过这个目录 | `chmod` 的意思是 change mode,用来修改这些权限位。 ```bash chmod +x install.sh chmod 755 app chmod 644 config.yaml chmod -R u+rwX data/ ``` | 命令 | 作用 | | --- | --- | | `chmod +x install.sh` | 给脚本增加执行权限,否则 `./install.sh` 可能提示 `Permission denied` | | `chmod 755 app` | 所有者可读写执行,组和其他用户可读可执行,常用于可执行程序 | | `chmod 644 config.yaml` | 所有者可读写,其他人只读,常用于普通配置文件 | | `chmod -R u+rwX data/` | 递归给所有者读写权限,并给目录或已有可执行文件加执行权限 | 目录上的 `x` 不是“执行目录”,而是允许进入或穿过目录。服务用户如果没有某一级目录的 `x` 权限,即使最终文件本身可读,也可能读不到。 ### Windows 权限 Windows 常见权限模型是 ACL、管理员权限和 UAC。Windows 的“拒绝访问”和 Linux 的 `Permission denied` 看起来像同一类问题,底层模型不同。 | 系统 | 常见权限问题 | | --- | --- | | Windows | ACL 不允许访问、没有管理员权限、UAC 拦截、文件被占用、执行策略限制 PowerShell 脚本 | | Linux / Unix-like | `rwx` 不足、属主属组不对、目录缺少 `x` 权限、服务用户和手动用户不同 | ## 运行环境 ### 依赖 很多软件不是孤立运行的。它可能依赖运行时、系统库、驱动或外部服务。 | 类型 | 例子 | 出问题时的表现 | | --- | --- | --- | | 语言运行时 | JVM、Node.js、Python、.NET Runtime | 版本不兼容、命令不存在、启动参数不支持 | | 动态库 | `.dll`、`.so`、系统图形库、驱动库 | 缺库、库版本冲突、启动时报错 | | 外部服务 | 数据库、Redis、对象存储、消息队列 | 程序能启动但接口报错或功能不可用 | | 系统能力 | 字体、证书、打印服务、串口权限 | 页面乱码、HTTPS 失败、打印失败、设备打不开 | 所谓“部署环境”,就是把程序需要的运行时、依赖、配置、权限和外部服务准备好。 ### 进程、服务和端口 程序运行起来后,在操作系统里通常表现为进程。长期运行的后台程序一般会被配置成服务。 | 概念 | 说明 | 现场关注点 | | --- | --- | --- | | 进程 | 正在运行的程序实例 | 是否存在、CPU/内存是否异常 | | 服务 | 由系统管理的长期程序 | 是否启动、是否开机自启 | | 守护进程 | 后台持续运行的服务进程 | 崩溃后是否自动拉起 | | 端口监听 | 服务等待外部连接 | 是否监听正确 IP 和端口 | 一个 Web 后端如果启动成功,通常会监听某个端口。页面访问失败时,要区分是“程序没启动”“端口没监听”“网络不通”还是“接口本身报错”。 ### 配置 同一份程序在不同现场表现不同,往往是因为配置不同。 | 配置来源 | 常见内容 | 常见问题 | | --- | --- | --- | | 配置文件 | 数据库地址、端口、账号、路径、功能开关 | 改错文件、格式错误、路径不存在 | | 环境变量 | 运行模式、密钥、服务地址 | 变量没传进去、大小写写错 | | 启动参数 | 监听端口、配置路径、日志级别 | 参数顺序错、参数不兼容 | | 默认值 | 程序内置配置 | 忘记覆盖,导致连到默认地址 | 现场排障时,要确认“程序实际读到的配置”,不要只看你以为它读的是哪个文件。 ### 日志、缓存和临时文件 不要只看页面提示。页面提示通常经过包装,真正原因经常在服务日志、浏览器网络请求或系统日志里。 | 类型 | 用途 | 常见问题 | | --- | --- | --- | | 应用日志 | 记录程序运行过程和错误 | 日志没开、路径不对、权限不足 | | 系统日志 | 记录服务启动、崩溃、权限等系统事件 | 只看应用日志会漏掉启动失败原因 | | 浏览器网络请求 | 查看前端请求哪个接口、返回什么 | 接口地址错、跨域、证书问题 | | 缓存 | 减少重复计算或请求 | 旧数据未刷新、缓存污染 | | 临时文件 | 保存运行过程中的中间结果 | 磁盘满、权限不足 | ## 前端、后端和数据库 一套业务系统通常不是一个程序,而是多个部分协作。 | 部分 | 主要职责 | 常见形态 | | --- | --- | --- | | 前端 | 展示页面,接收用户操作 | 浏览器页面、Electron 客户端、移动端页面 | | 后端 | 处理业务逻辑,提供接口 | Java / Go / Node.js / Python 服务 | | 数据库 | 持久保存业务数据 | MySQL、PostgreSQL、SQLite | | 缓存 | 临时保存高频数据 | Redis、本地缓存 | 现场排障时先判断问题发生在哪一层:页面打不开通常先看前端资源和网络;按钮报错通常看接口;数据不对通常看后端逻辑和数据库。 ## 虚拟机和容器 虚拟机和容器都能提供隔离环境,但隔离方式不同。 ```mermaid flowchart TB subgraph Type1["Type 1 裸机虚拟化"] H1[硬件] --> VMM1[虚拟机管理程序\nKVM / ESXi / PVE / Hyper-V] VMM1 --> VM1[虚拟机 A] VMM1 --> VM2[虚拟机 B] end subgraph Type2["Type 2 宿主虚拟化"] H2[硬件] --> OS2[宿主操作系统\nWindows / macOS / Linux] OS2 --> VMM2[虚拟机软件\nVMware / VirtualBox / Parallels] VMM2 --> VM3[虚拟机 A] VMM2 --> VM4[虚拟机 B] end subgraph Container["容器"] H3[硬件] --> OS3[宿主操作系统\nLinux] OS3 --> ENG[容器引擎\nDocker / Podman] ENG --> C1[容器 A\n共享内核] ENG --> C2[容器 B\n共享内核] end ``` | | Type 1 | Type 2 | 容器 | | --- | --- | --- | --- | | 隔离方式 | 完整虚拟硬件和系统 | 在宿主系统上跑完整虚拟机 | 共享宿主内核 | | 性能 | 高 | 略低 | 高 | | 启动速度 | 秒到分钟 | 秒到分钟 | 毫秒到秒 | | 适合 | 服务器虚拟化、PVE、ESXi | 本机测试、桌面虚拟机 | Web 服务、数据库、CI | | 不适合 | 轻量单服务快速启停 | 生产高密度部署 | 内核/驱动级隔离 | 选择建议: | 场景 | 选择 | | --- | --- | | 跑 Web 服务 / 数据库 / API | 容器(Docker / Podman) | | 编译代码 / CI 流水线 | 容器 | | 需要完整 Linux 环境 + SSH | 虚拟机 或 WSL2 | | 开发内核模块 / 驱动 | 虚拟机 | | 需要不同架构(ARM / MIPS) | QEMU | | 需要直通 GPU / USB | 虚拟机 | | GPU 加速推理 | 容器 + NVIDIA Container Toolkit | | 测试旧系统兼容性 | 虚拟机 | ## 常见故障 | 现象 | 先看什么 | 常见原因 | | --- | --- | --- | | 程序打不开 | 系统、架构、权限、依赖 | 包不匹配、缺运行库、被拦截 | | 安装包装不上 | 包格式、CPU 架构、软件源 | `.deb` / `.rpm` 不匹配、架构不对、离线依赖缺失 | | `Permission denied` | 运行用户、文件权限、目录权限 | 没有执行位、目录缺少 `x`、服务用户不同 | | Windows 拒绝访问 | 管理员权限、ACL、文件占用 | UAC、权限不足、文件被其他进程占用 | | 找不到库 | 动态库路径、运行时版本 | `.dll` / `.so` 缺失或版本不匹配 | | 手动运行正常,服务失败 | 服务用户、工作目录、环境变量 | systemd/Docker/Nginx 下环境不同 | | 页面 404 | 浏览器地址、前端资源、接口路径 | 路由配置、资源路径、反向代理、后端接口 | | 页面 500 | 后端日志、数据库、外部服务 | 配置错误、依赖不可用、程序异常 | | 端口访问失败 | 进程、端口监听、防火墙、代理 | 服务没启动、监听地址错、网络不通 | | 打印/串口/USB 失败 | 设备文件、驱动、用户组 | 权限不足、驱动缺失、设备被占用 | ## 参考资料 | 资料 | 适合看什么 | | --- | --- | | Dennis M. Ritchie, [The Evolution of the Unix Time-sharing System](https://www.nokia.com/bell-labs/about/dennis-m-ritchie/hist.html) | Unix 从分时系统、Multics 背景中演化出来的历史 | | Dennis M. Ritchie, Ken Thompson, [The UNIX Time-Sharing System](https://www.nokia.com/bell-labs/about/dennis-m-ritchie/cacm.html) | Unix 早期设计思想,包含文件、进程、Shell 等核心概念 | | Microsoft Learn, [Windows Commands](https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/windows-commands) | Windows 命令行、Command shell、PowerShell 的官方说明 | | Microsoft Learn, [`cmd`](https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/cmd) | Windows `cmd.exe` 的参数和行为 | | Microsoft Learn, [What is PowerShell?](https://learn.microsoft.com/en-us/powershell/scripting/overview) | PowerShell 的定位、Shell、脚本和对象管道 | | The Open Group, [POSIX `chmod`](https://pubs.opengroup.org/onlinepubs/9699919799/utilities/chmod.html) | `chmod` 在 POSIX 标准里的定义 | | GNU Coreutils Manual, [`chmod` invocation](https://www.gnu.org/software/coreutils/manual/html_node/chmod-invocation.html) | GNU/Linux 常见 `chmod` 行为和选项 | | Linux man-pages, [`chmod(1)`](https://man7.org/linux/man-pages/man1/chmod.1.html) | Linux 命令手册里的权限位、符号模式和八进制模式说明 | --- --- url: /wiki/concepts-basics/operating-systems-architecture.md --- # 操作系统与处理器架构 操作系统与处理器架构解释“程序跑在什么系统上、系统能不能兼容、驱动和硬件能不能工作”。 同一个软件在不同现场表现不同,常见原因不是业务代码变了,而是操作系统、发行版、CPU 架构、系统库、驱动、桌面环境、浏览器内核或安全策略不同。 ## 概览 排查系统兼容性问题时,先确认以下信息: ![操作系统生态图谱](/illustrations/concepts-basics/operating-systems-ecosystem-map.png) 这张图把操作系统家族、Linux 发行版、云与虚拟化、嵌入式 / RTOS、国产桌面与服务器生态放在同一张地图里。阅读本章时可以先把它当作“方向图”:系统名称只是入口,真正影响兼容性的通常是内核、发行版体系、处理器架构、包管理、驱动和厂商生态。 | 层次 | 要确认什么 | 为什么重要 | | --- | --- | --- | | 操作系统家族 | Windows、Linux、macOS、国产 Linux 发行版 | 决定程序格式、权限模型、服务管理方式 | | 发行版和版本 | Ubuntu、Debian、统信 UOS、银河麒麟、openEuler 等 | 决定包管理器、系统库版本、桌面环境 | | 处理器架构 | x86\_64、ARM64、LoongArch 等 | 决定软件包能不能直接运行 | | 内核版本 | Linux kernel、Windows NT 内核版本 | 影响驱动、容器、文件系统、硬件支持 | | 桌面环境 | GNOME、KDE、DDE、UKUI 等 | 影响窗口、托盘、输入法、远程桌面体验 | | 驱动和外设 | 打印机、串口、USB、摄像头、读卡器 | 影响现场硬件是否能识别和调用 | | 安全策略 | UAC、SELinux、AppArmor、杀毒、信任策略 | 影响安装、执行、端口监听和文件访问 | 不要只问“是不是 Linux”或“是不是国产系统”。至少要拿到系统名称、版本、CPU 架构、安装包架构、运行用户和报错日志。 ## 常见操作系统家族 | 系统 | 常见用途 | 现场关注点 | | --- | --- | --- | | Windows | 办公电脑、桌面客户端、现场终端、部分服务器 | 远程桌面、驱动、开机自启、UAC、杀毒拦截、PowerShell 执行策略 | | Linux | 服务器、网关、边缘设备、容器宿主机、国产桌面系统基础 | 服务管理、权限、日志、网络配置、包管理器、系统库版本 | | macOS | 研发个人电脑、设计和测试设备 | 开发环境、签名、公证、权限、Apple Silicon / Intel 架构差异 | | Android / 嵌入式系统 | 移动设备、屏幕终端、专用设备 | APK 架构、系统权限、厂商定制、外设接口 | 跨系统运行时,最容易出问题的是路径、权限、驱动、字体、浏览器内核、证书、系统库版本和开机自启动方式。 ## Linux、GNU、内核和发行版 日常说的 “Linux” 往往混合了多个层次。 | 名称 | 说明 | | --- | --- | | Linux 内核 | 管硬件、进程、内存、文件系统、网络、驱动和系统调用 | | GNU 工具链 | 提供 Shell、命令行工具、编译工具、C 库等基础用户空间 | | 用户空间 | 系统服务、命令行工具、桌面环境、包管理器、应用程序 | | 发行版 | 把内核、工具链、服务、桌面、软件仓库和安装器组合成可安装系统 | | 桌面环境 | 提供窗口、菜单、设置、文件管理器,例如 GNOME、KDE、DDE、UKUI | 所以“Linux 兼容”不是一句话能说明的。一个程序可能在 Ubuntu x86\_64 上正常,在统信 UOS ARM64 上缺依赖,在银河麒麟 LoongArch 上完全不能运行。 ## 发行版概念 发行版不是“换个主题的 Linux”。发行版会决定软件包格式、系统库版本、默认安全策略、桌面环境、服务管理方式和硬件支持周期。 | 发行版体系 | 常见系统 | 包管理 / 包格式 | 现场关注点 | | --- | --- | --- | --- | | Debian 系 | Debian、Ubuntu、统信 UOS Desktop 常见基础 | `apt`、`.deb` | 包源、依赖版本、桌面组件、国产软件仓库 | | Red Hat 系 | RHEL、CentOS、Rocky、Anolis、部分服务器发行版 | `dnf` / `yum`、`.rpm` | 企业服务器生态、SELinux、长期支持 | | openEuler 系 | openEuler、部分国产服务器系统基础 | `dnf`、`.rpm` | ARM64 / 鲲鹏生态、服务器场景、社区与商业发行版差异 | | Arch 系 | Arch Linux、Manjaro | `pacman` | 滚动更新,适合研发,不适合保守生产现场 | | 独立或深度定制 | 银河麒麟、统信 UOS、中科方德等 | 多为 `.deb` 或 `.rpm`,以厂商说明为准 | 版本、架构、厂商补丁、认证清单比“像哪个上游”更重要 | 现场判断时,不要只根据包格式推断兼容性。两个系统都支持 `.deb`,也不代表系统库、桌面组件和驱动完全一样。 ### 发行版分支图 Linux 发行版之间存在上游、下游、社区版、商业版、衍生版关系。下面这张图来自 Wikimedia Commons,可用来建立“发行版会分支和演化”的直观概念: ![Linux Distribution Timeline](https://upload.wikimedia.org/wikipedia/commons/8/8c/Linux_Distribution_Timeline_Dec._2020.svg) 图中没有覆盖 2020 年之后的所有国产发行版和商业版本,但它说明了一个关键事实:发行版不是孤立存在的,很多系统会继承某个社区生态的软件包格式、工具链和用户空间习惯,再由厂商做长期维护、桌面定制、安全增强和硬件适配。 ### 发行版、版本和补丁包 同一个发行版还会分版本、更新批次和补丁包。 | 信息 | 示例 | 用途 | | --- | --- | --- | | 产品名称 | 统信 UOS、银河麒麟、openEuler | 判断系统体系和厂商支持 | | 大版本 | V20、V10、22.03 LTS 等 | 判断系统代际和软件仓库 | | 架构版本 | x86\_64、ARM64、LoongArch | 判断安装包是否匹配 | | 补丁级别 | SP、Update、Service Pack、补丁批次 | 判断库版本、浏览器版本、驱动修复 | | 桌面 / 服务器版 | Desktop、Server、Advanced Server | 判断是否有图形界面、服务组件和默认策略 | 同名系统的“桌面版”和“服务器版”不要混用安装包和排障经验。桌面版更关注窗口、输入法、浏览器、打印和外设;服务器版更关注服务、网络、存储、容器和安全策略。 ## 处理器架构 处理器架构决定程序能不能直接运行。安装包名称里的 `amd64`、`x86_64`、`aarch64`、`arm64`、`loongarch64` 通常就是架构信息。 | 架构 / 处理器 | 常见位置 | 说明 | | --- | --- | --- | | x86\_64 / amd64 | 普通 PC、服务器、部分国产 CPU | 当前最常见的桌面和服务器架构 | | ARM64 / aarch64 | 手机、ARM 服务器、边缘设备、部分国产终端 | 低功耗设备、鲲鹏、飞腾等生态常见 | | LoongArch / loongarch64 | 龙芯新生态桌面和服务器 | 需要 LoongArch 对应软件包,不能当作 x86 或 ARM 使用 | | MIPS / mips64el | 老龙芯生态、部分嵌入式设备 | 新项目中逐渐被 LoongArch 替代 | | RISC-V | 研发板、实验性设备、部分嵌入式场景 | 生态仍在发展,生产适配需谨慎 | 国产处理器和常见架构关系: | 处理器 / 厂商 | 常见架构归类 | 适配关注点 | | --- | --- | --- | | 龙芯 | LoongArch,新旧设备可能涉及 MIPS | 安装包架构、浏览器插件、外设驱动、旧生态迁移 | | 飞腾 | ARM64 | ARM64 包、驱动、桌面兼容性 | | 鲲鹏 | ARM64 | 服务器软件、数据库、中间件、容器镜像架构 | | 兆芯 | x86\_64 兼容 | 多数 x86\_64 软件更容易适配,但仍要验证驱动和性能 | | 海光 | x86\_64 兼容 | 服务器场景常见,关注内核、虚拟化、密码模块和性能 | 下载软件包时必须同时看系统和架构。`linux-x64`、`linux-arm64`、`loongarch64` 是不同产物。 ## 国产化与信创 信创通常指信息技术应用创新。它不是单个软件或单个系统,而是一套国产基础软硬件生态的替换和适配工作。 ### 发展脉络 国产化发展可以粗略理解为几个阶段: | 阶段 | 重点 | 典型工作 | | --- | --- | --- | | 可用替代 | 先把关键办公、业务和基础设施跑在国产系统上 | 操作系统安装、浏览器适配、驱动适配 | | 生态补齐 | 让数据库、中间件、办公软件、外设和安全软件能协同 | 驱动、插件、字体、证书、打印、UKey | | 规模部署 | 大量终端和服务器统一运维 | 镜像、补丁、软件仓库、远程支持、资产管理 | | 深度适配 | 充分利用国产 CPU、国密、安全策略和厂商能力 | 多架构构建、性能调优、认证测试、长期维护 | 现场不要把信创理解成“Windows 换 Linux”。实际工作通常同时涉及操作系统、CPU、浏览器、数据库、中间件、外设、证书、安全软件和运维流程。 ### 信创组件 | 类别 | 示例 | 常见关注点 | | --- | --- | --- | | 操作系统 | 统信 UOS、银河麒麟、中标麒麟、中科方德、openEuler 衍生系统 | 版本、架构、包管理、桌面环境、系统库 | | 处理器 | 龙芯、飞腾、鲲鹏、兆芯、海光 | 指令集、软件包架构、驱动支持、性能 | | 浏览器 | 系统自带浏览器、360 安全浏览器、奇安信可信浏览器等 | Chromium 内核版本、证书、插件、兼容模式 | | 数据库 | 达梦、人大金仓、OceanBase、openGauss 等 | SQL 兼容、驱动、字符集、连接池、事务行为 | | 中间件 | 东方通、金蝶 Apusic、宝兰德等 | Java 版本、部署包格式、连接池、日志路径 | | 办公与外设 | WPS、OFD、打印机、扫描仪、UKey | 字体、插件、驱动、浏览器调用、本地权限 | ### 常见国产操作系统 | 系统 | 常见定位 | 分支 / 生态口径 | 版本差异关注点 | | --- | --- | --- | --- | | 统信 UOS 桌面版 | 国产桌面系统,政企办公和终端场景常见 | 与 deepin / Debian 生态关系密切,常见 `.deb` 和 `apt` 体验 | 家庭/专业/企业等版本定位不同,桌面组件、软件商店、浏览器和外设适配不同 | | 统信 UOS 服务器版 | 国产服务器系统 | 版本和架构较多,部分服务器产品线会面向 openEuler 等服务器生态适配 | 包源、内核、容器、服务组件、CPU 架构和厂商认证要按具体版本确认 | | 银河麒麟桌面操作系统 | 桌面、政企信创终端常见 | 国产桌面发行版,常见 `.deb` 生态和 UKUI 桌面 | 桌面组件、浏览器、输入法、外设驱动和补丁批次差异明显 | | 银河麒麟高级服务器操作系统 | 政企服务器和信创服务器常见 | 服务器产品线与 openEuler 等服务器生态关系密切,常见 `.rpm` / `dnf` 体验 | 服务组件、安全策略、内核、容器、数据库和中间件认证要按具体版本确认 | | 中标麒麟 | 较早期国产 Linux 生态中常见,存量项目较多 | 历史版本多,曾长期面向 Red Hat / CentOS 服务器生态做兼容适配 | 版本年代差异大,需确认内核、包源、补丁、硬件支持和是否仍可维护 | | 中科方德 | 党政、行业终端和服务器场景 | 厂商深度定制发行版,桌面/服务器产品线和包格式需按具体版本确认 | 外设、浏览器插件、CPU 架构、驱动和厂商认证清单很关键 | | openEuler | 开源服务器操作系统社区,常作为商业发行版基础 | 独立开源社区,服务器生态,常见 `.rpm` / `dnf` | LTS 版本、创新版本、厂商衍生版之间软件包和支持策略不同 | | openKylin | 开源桌面操作系统社区 | 桌面社区发行版,面向国产桌面生态 | 更偏社区和桌面生态,生产项目要看具体商业支持和硬件认证 | | Anolis OS | 龙蜥社区服务器发行版 | Red Hat / CentOS 迁移场景常见,`.rpm` / `dnf` | 关注 ABI、包源、服务兼容和迁移成本 | 这里的“版本差异”不要只看名字。交付时更重要的是:具体镜像、CPU 架构、补丁级别、厂商认证清单、浏览器版本、数据库驱动版本和外设驱动版本。 ### 国产服务器版本和上游口径 服务器版要按具体大版本拆开看。桌面版通常关心窗口、输入法、浏览器和外设;服务器版更关心内核、包管理器、系统库、容器、数据库、中间件、安全策略和长期补丁。 下表里的“上游 / 基线 / 兼容生态”是现场适配口径:能帮助判断该准备 `.deb` 还是 `.rpm`、该按 Debian 习惯还是 openEuler / Red Hat 习惯排障。商业发行版通常还会加入厂商补丁、硬件适配和认证能力,不等同于简单换皮。 | 服务器系统版本 | 上游 / 基线 / 兼容生态 | 常见包管理口径 | 现场适配重点 | | --- | --- | --- | --- | | 银河麒麟高级服务器操作系统 V10 [🔗](https://www.kylinos.cn/productPc/server/serverMain/) | Linux Kernel 4.19 基线;融合 openEuler LTS / SP 特性 [🔗](https://www.openeuler.org/zh/) | `.rpm`、`dnf` / `yum` 口径 | 存量信创服务器常见;重点看 CPU 架构、补丁批次、数据库/中间件认证 | | 银河麒麟高级服务器操作系统 V11 [🔗](https://www.kylinos.cn/productPc/server/serverMainV11/) | Linux Kernel 6.6 基线 [🔗](https://www.kernel.org/);面向新一代国产算力和 openEuler 服务器生态 [🔗](https://www.openeuler.org/zh/) | `.rpm`、`dnf` 口径 | 新项目优先关注;重点看 2503 等小版本、内核能力、容器、国密和多架构镜像 | | 统信 UOS 服务器操作系统 V20 欧拉版 [🔗](https://www.chinauos.com/) | openEuler 生态口径 [🔗](https://www.openeuler.org/zh/) | `.rpm`、`dnf` 口径 | 关注欧拉版和非欧拉版差异,不能只写“UOS V20” | | 统信 UOS 服务器操作系统 V20 企业版 [🔗](https://www.chinauos.com/) | 统信服务器产品线;具体上游和包格式按安装镜像确认 | 以现场镜像为准 | 重点确认 `os-release`、包管理器、CPU 架构、厂商源和补丁批次 | | 中科方德高可信服务器操作系统 V4.0-G320 [🔗](https://www.nfschina.com/) | Linux 内核基础;强调 Red Hat / CentOS 生态兼容口径 [🔗](https://www.centos.org/) | `.rpm`、`yum` / `dnf` 口径 | 存量行业服务器常见;重点看驱动、包源、硬件认证和是否仍有维护支持 | | openEuler LTS [🔗](https://www.openeuler.org/zh/) | openEuler 社区发行版 | `.rpm`、`dnf` 口径 | 很多国产服务器商业版的生态参考;重点看 LTS / SP / 创新版差异 | | Anolis OS 8 [🔗](https://openanolis.cn/anolisos) | Anolis / CentOS 迁移兼容口径 [🔗](https://www.centos.org/) | `.rpm`、`dnf` 口径 | CentOS 迁移项目常见;重点看 RHEL/CentOS 兼容、ABI 和软件仓库 | | Anolis OS 23 [🔗](https://openanolis.cn/anolisos) | 龙蜥社区新分支 | `.rpm`、`dnf` 口径 | 不是简单 CentOS 替代;重点看新版本生态、内核、软件仓库和兼容性 | 如果现场必须精确判断“基于哪个上游”,不要只看产品名称。优先采集这些信息: ```bash cat /etc/os-release uname -r uname -m rpm -q filesystem rpm -q glibc dnf repolist ``` 这些输出比“麒麟 V10”四个字更可靠。比如同样是麒麟 V10,不同 CPU 架构、不同 SP、不同补丁批次和不同厂商镜像,依赖库和驱动状态都可能不同。 ### 国产 OS、处理器和分支口径 国产化项目里,经常需要同时回答三个问题:这个 OS 属于哪个生态分支、它跑在哪类 CPU 上、我们要准备哪种安装包。 | OS / 产品线 | 常见分支 / 生态口径 | 常见 CPU 架构 | 包和适配关注点 | | --- | --- | --- | --- | | 统信 UOS 桌面 | deepin / Debian 生态口径 | x86\_64、ARM64、LoongArch 等,以厂商镜像为准 | `.deb`、`apt`、桌面组件、浏览器、打印和外设 | | 统信 UOS 服务器 | 服务器发行版生态,部分版本面向 openEuler 等生态适配 | x86\_64、ARM64、LoongArch 等,以版本清单为准 | 服务器包源、容器、systemd、数据库和中间件认证 | | 银河麒麟桌面 | 国产桌面发行版,常见 UKUI 桌面和 `.deb` 生态 | x86\_64、ARM64、LoongArch 等,以厂商镜像为准 | 桌面体验、浏览器、输入法、外设、应用商店 | | 银河麒麟高级服务器 | 服务器发行版生态,部分版本与 openEuler 生态关系密切 | x86\_64、ARM64、LoongArch 等,以版本清单为准 | `.rpm` / `dnf` 场景、内核、安全策略、容器和服务组件 | | 中科方德桌面 | 厂商定制桌面发行版 | x86\_64、ARM64、LoongArch 等,以厂商适配清单为准 | 桌面环境、浏览器插件、打印扫描、UKey | | 中科方德服务器 | 厂商定制服务器发行版 | x86\_64、ARM64、LoongArch 等,以厂商适配清单为准 | 包源、服务管理、安全策略、数据库和中间件 | | openEuler | openEuler 社区 | x86\_64、ARM64、LoongArch、RISC-V 等随社区版本扩展 | `.rpm`、`dnf`、服务器软件、容器镜像架构 | | openKylin | openKylin 社区 | x86\_64、ARM64、RISC-V、LoongArch 等随社区版本扩展 | 桌面生态、应用兼容、社区版和商业版边界 | | Anolis OS | Anolis / Red Hat 兼容生态口径 | x86\_64、ARM64 等 | `.rpm`、`dnf`、CentOS/RHEL 迁移兼容 | 这张表是“适配口径”,不是严格源代码血缘表。国产商业发行版通常会吸收上游社区、厂商补丁、硬件适配和认证体系;实际交付以厂商版本说明、适配清单和现场镜像为准。 ### 信创版本差异 同一个信创项目里,经常同时存在多种版本差异: | 差异类型 | 例子 | 风险 | | --- | --- | --- | | 操作系统版本不同 | UOS V20、麒麟 V10、openEuler LTS | 系统库、包源、桌面组件不同 | | CPU 架构不同 | x86\_64、ARM64、LoongArch | 二进制、容器镜像、浏览器插件不能混用 | | 桌面版 / 服务器版不同 | Desktop vs Server | 是否有图形界面、默认服务、安全策略不同 | | 厂商补丁不同 | 同一大版本不同补丁批次 | 驱动、浏览器、证书、系统库行为不同 | | 浏览器内核不同 | Chromium 版本差异、兼容模式 | 前端 CSS/JS、证书、WebSocket、插件表现不同 | | 数据库兼容层不同 | MySQL 模式、Oracle 模式、PostgreSQL 兼容 | SQL 方言、分页、大小写、事务行为不同 | 因此,信创适配报告里要写完整环境,不要只写“已适配国产系统”。 推荐记录格式: ```text 操作系统:银河麒麟桌面操作系统 V10 SPx CPU 架构:ARM64 / 飞腾 内核版本:uname -r 输出 浏览器:系统自带浏览器,Chromium xx 数据库:达梦 DM8,驱动版本 xx 安装包:product-linux-arm64-v1.2.3.deb 外设:某型号打印机,驱动版本 xx ``` ## BIOS、UEFI 和启动链路 系统启动需要固件,虚拟机和物理机都一样。 | 类型 | 说明 | 常见场景 | | --- | --- | --- | | BIOS / Legacy | 旧式启动方式,通常配合 MBR 分区 | 老系统、旧设备兼容 | | UEFI | 现代启动方式,通常配合 GPT 分区 | 新系统、新硬件、Secure Boot | | Secure Boot | 启动时校验引导程序和内核签名 | 安全要求高的终端、部分信创环境 | 现代操作系统优先用 UEFI。调试旧系统、旧镜像或特殊设备启动时,可能需要切到 BIOS / Legacy。Secure Boot 打开时,未签名驱动或自定义内核模块可能加载失败。 ## 驱动、外设和桌面环境 操作系统负责管理硬件和程序权限。现场问题经常发生在业务软件和硬件之间。 | 问题 | 常见原因 | 排查方向 | | --- | --- | --- | | USB 设备识别不到 | 驱动缺失、权限不足、设备被虚拟机/宿主机占用 | 看系统设备列表、驱动、用户权限 | | 串口打不开 | 端口号变化、权限不足、被其他程序占用 | 看 `/dev/ttyUSB*` 或 Windows 设备管理器 | | 打印失败 | 打印服务异常、驱动不匹配、权限不足 | 看 CUPS / Windows 打印队列和驱动 | | 摄像头打不开 | 驱动、权限、浏览器授权、设备占用 | 看系统权限、浏览器权限、占用进程 | | 扫描仪 / UKey 调用失败 | 厂商驱动、浏览器插件、本地服务异常 | 看驱动版本、插件、服务状态 | | 服务开机没启动 | 没配置自启动、依赖服务未就绪、启动用户不对 | 看 systemd / 任务计划程序 / 启动日志 | | 程序能手动运行但服务运行失败 | 工作目录、环境变量、权限不同 | 对比手动用户和服务用户环境 | 桌面环境也会影响应用体验。DDE、UKUI、GNOME、KDE 在托盘、输入法、窗口管理、远程桌面和高 DPI 上可能表现不同。 ## 系统信息采集 ### Linux / 国产 Linux ```bash uname -a uname -m cat /etc/os-release lsb_release -a systemctl status 服务名 journalctl -u 服务名 -n 200 ``` 常见判断: | 命令 | 看什么 | | --- | --- | | `uname -m` | CPU 架构,例如 `x86_64`、`aarch64`、`loongarch64` | | `cat /etc/os-release` | 发行版名称、版本和 ID | | `uname -r` | 内核版本 | | `systemctl status` | 服务状态、运行用户、失败原因 | | `journalctl` | 服务启动日志和系统错误 | ### Windows ```powershell systeminfo Get-ComputerInfo $env:PROCESSOR_ARCHITECTURE Get-Service Get-EventLog -LogName System -Newest 50 ``` 常见判断: | 信息 | 看什么 | | --- | --- | | Windows 版本 | 家庭版、专业版、企业版、Server 版本 | | 架构 | x64、ARM64 | | 权限 | 是否管理员、UAC 是否拦截 | | 事件日志 | 服务启动失败、驱动失败、权限错误 | ## 常见故障 | 现象 | 先看什么 | 常见原因 | | --- | --- | --- | | 安装包无法安装 | 包格式、架构、发行版版本 | `.deb` / `.rpm` 不匹配、架构不对、依赖缺失 | | 程序提示格式错误 | `uname -m` 和安装包名称 | x86\_64 包跑在 ARM64 / LoongArch 上 | | 缺少动态库 | 系统库版本、包源、依赖包 | 发行版版本太旧、缺运行库、厂商仓库不全 | | 浏览器页面异常 | 浏览器内核、证书、缓存、兼容模式 | 信创浏览器 Chromium 版本不同或插件缺失 | | 打印 / 扫描失败 | 驱动、服务、权限 | 厂商驱动未适配当前架构或系统版本 | | Docker 镜像启动失败 | 镜像架构、宿主内核、权限 | 只拉了 amd64 镜像,宿主是 ARM64 | | 服务开机不启动 | 服务管理器、依赖、启动用户 | systemd 配置不完整或权限不足 | | 同一系统有的机器正常有的不正常 | 补丁级别、架构、驱动、浏览器版本 | 镜像批次不同或后续补丁不同 | ## 参考资料 | 资料 | 适合看什么 | | --- | --- | | Linux Kernel, [What is the Linux kernel?](https://www.kernel.org/) | Linux 内核定位和官方入口 | | GNU, [The GNU Operating System](https://www.gnu.org/gnu/gnu-history.html) | GNU 和自由软件操作系统历史 | | Debian, [About Debian](https://www.debian.org/intro/about) | Debian 发行版概念 | | Ubuntu, [Ubuntu documentation](https://help.ubuntu.com/) | Ubuntu 使用和系统管理 | | openEuler, [openEuler documentation](https://docs.openeuler.org/) | openEuler 版本、服务器生态和文档 | | Anolis OS, [龙蜥操作系统](https://openanolis.cn/anolisos) | Anolis OS 版本和 CentOS 迁移场景 | | openKylin, [openKylin documentation](https://docs.openkylin.top/) | openKylin 桌面社区文档 | | 统信软件, [统信 UOS](https://www.chinauos.com/) | 统信 UOS 产品和生态信息 | | 麒麟软件, [银河麒麟](https://www.kylinos.cn/) | 麒麟操作系统产品和生态信息 | | 中科方德, [方德操作系统](https://www.nfschina.com/) | 中科方德产品和生态信息 | | Microsoft Learn, [Windows client documentation](https://learn.microsoft.com/en-us/windows/) | Windows 版本、管理和兼容性文档 | --- --- url: /wiki/concepts-basics/networking-protocols.md --- # 网络和常见协议 网络和常见协议关注“设备之间能不能互相访问、访问的是哪个服务、数据走什么协议”。 ## IP 地址 每台联网设备的唯一编号,类似于门牌号。 | 类型 | 范围 | 说明 | | --- | --- | --- | | 内网 IP | `192.168.x.x` / `10.x.x.x` / `172.16-31.x.x` | 仅局域网内可访问,外部不可达 | | 公网 IP | 其他 | 全球唯一,外部可直接访问 | | `127.0.0.1` | 本机 | 只能本机访问自己(localhost) | | `0.0.0.0` | 所有网卡 | 监听所有网络接口 | > **核心问题**:现场设备通常只有内网 IP,外部无法直接访问,需要端口转发或 VPN 穿透。 ```plantuml @startuml cloud "公网" as internet rectangle "公司网络" as corp { [办公电脑] as pc cloud "VPN 服务" as vpn } rectangle "现场网络" as site { [密集架控制器] as ctrl [飞度网关] as gw } internet --> vpn vpn --> pc pc ..> ctrl : VPN 穿透 gw --> ctrl : 内网直连 @enduml ``` ## 端口 一个 IP 上区分不同服务的编号,类似门牌号里的房间号。 | 常见端口 | 服务 | | --- | --- | | 22 | SSH | | 23 | Telnet(不加密,不要用) | | 53 | DNS | | 80 | HTTP | | 443 | HTTPS | | 3389 | RDP(Windows 远程桌面) | | 5900-5901 | VNC | | 8080 | 常用 Web 服务端口 | 如果 IP 能 ping 通但服务访问不了,通常要继续看端口是否监听、防火墙是否放行、服务是否绑定在正确网卡上。 ## NAT、端口转发和内网穿透 NAT(Network Address Translation)让多台内网设备共享一个公网 IP 上网。 ```mermaid flowchart LR A[内网设备\n192.168.1.100] --> B[路由器/网关\nNAT 转换] --> C[公网\n1.2.3.4] D[外部访问] --> C C -.->|被 NAT 丢弃| D ``` NAT 只管出去的连接,外面主动进来的连接会被丢弃。要从外部访问内网设备,常见方式如下。 | 方案 | 原理 | 特点 | | --- | --- | --- | | 端口转发 | 路由器/防火墙映射端口 | 需要路由器管理权限 | | frpc / GOST | 客户端连公网服务端,服务端转发 | 需要公网服务器 | | ZeroTier / WireGuard | 虚拟组网,设备在同一虚拟局域网 | 长期稳定,多设备互通 | | RustDesk / 向日葵 | 厂商中继服务器转发 | 开箱即用,无需公网 IP | ## 端口转发 vs VPN | | 端口转发 | VPN / 组网 | | --- | --- | --- | | 原理 | 映射一个端口到外部 | 建立虚拟局域网 | | 访问范围 | 只能访问映射的那一个端口 | 可以访问设备所有端口 | | 配置 | 每次换端口都要重新配 | 一次配好,所有端口都能访问 | | 适合 | 临时访问单个服务 | 长期维护多台设备 | ## SSH、RDP 和 VNC 这些都是远程访问协议,但用途不同。 | 协议 | 默认端口 | 传输内容 | 适合 | | --- | --- | --- | --- | | SSH | 22 | 命令行输入输出 | Linux 服务器、网关、嵌入式设备 | | RDP | 3389 | Windows 桌面画面和输入 | Windows 远程桌面 | | VNC | 5900-5901 | 屏幕帧缓冲和输入 | 跨平台桌面远控 | ```mermaid sequenceDiagram participant C as 客户端 participant S as 服务端 (SSH) C->>S: TCP 连接请求 (IP:22) S->>C: 发送公钥指纹 C->>S: 确认指纹 + 发送加密请求 S->>C: 验证密码/密钥 C->>S: 加密通道建立 Note over C,S: 所有命令和输出都加密传输 ``` 前提:客户端能访问到服务端的 IP 和端口。如果服务端在内网,需要先解决网络可达性。 ## 远程终端 vs 远程桌面 | | 远程终端 | 远程桌面 | | --- | --- | --- | | 传输内容 | 文字命令和输出 | 整个屏幕画面 | | 网络带宽 | 极低(几 KB/s) | 较高(几百 KB 到几 MB/s) | | 适合 | 服务器管理、命令行操作 | GUI 操作、排障桌面软件 | | 代表方案 | SSH / ttyd | RDP / VNC / 向日葵 / RustDesk | ## HTTP、HTTPS、DNS 和防火墙 | 概念 | 说明 | 常见问题 | | --- | --- | --- | | HTTP | Web 明文协议,默认 80 端口 | 被代理、跨域、接口路径错误 | | HTTPS | HTTP + TLS 加密,默认 443 端口 | 证书过期、证书不受信任、域名不匹配 | | DNS | 把域名解析成 IP | 解析到旧地址、内外网解析不同 | | 网关 | 网络出口设备 | 网关错了会导致跨网段不可达 | | 防火墙 | 控制端口是否允许访问 | 服务正常但端口被拦截 | 访问一个 Web 服务时,可以按顺序判断:域名能否解析、IP 是否可达、端口是否开放、协议是否正确、接口是否返回预期内容。 --- --- url: /wiki/product-lines.md --- # 产品线 产品线目录用于按产品组织研发资料。先从产品视角理解业务能力,再进入系统架构、开发流程、部署交付和调试运维。 ## 当前产品线 ## 阅读顺序 | 顺序 | 内容 | 说明 | | --- | --- | --- | | 1 | 产品视图 | 先看系统提供哪些能力 | | 2 | 系统架构 | 再看模块边界、服务职责和数据流 | | 3 | 开发流程 | 查版本线、代表仓库和项目演进 | | 4 | 打包分发 / 备份迁移 | 查部署、发布、升级、迁移和现场验证 | ## 补充原则 * 新产品线先建总览页,再补产品视图和系统架构。 * 客户定制内容不要直接混进主线能力,先标明项目范围。 * 代码仓库、部署方式、协议文件要链接到稳定位置,避免散落在多篇文档里。 --- --- url: /wiki/sdv.md --- # 智档宝 智档宝是围绕档案业务、库房设备、环境控制、RFID、数字化和现场交付形成的一条产品线。它不是单个 Web 项目,而是一组前端、后端、本地服务、设备程序、固件和定制项目共同组成的系统。 ![智档宝产品线总览](/illustrations/smart-doc-vault-index.png) ## 总览草稿 下面这张是讲解“三合一系统”时使用的 Excalidraw 草稿,用于辅助理解产品能力和现场系统之间的大致关系,不作为最终架构定稿。 ## 文档定位 这个目录用于沉淀智档宝研发侧的稳定知识,包括产品能力、系统架构、代码仓库、设备接入、部署交付、调试运维和项目定制。 这里的文档按“先理解产品,再理解系统,再处理开发和交付”的顺序维护。产品线总览只放稳定入口,不承载临时项目记录。 ## 阅读路径 | 读者 | 先看 | 目的 | | --- | --- | --- | | 新人研发 | [1-产品视图](/wiki/sdv/product-view) | 先理解智档宝覆盖哪些业务能力 | | 前端 / 后端 | [2-系统架构](/wiki/sdv/system-architecture) | 确认模块边界、服务职责和协作关系 | | 产品 / 测试 | [1-产品视图](/wiki/sdv/product-view) | 按能力查找业务流程和功能范围 | | 实施 / 运维 | [4-打包分发](/wiki/sdv/packaging-distribution)、[5-备份迁移](/wiki/sdv/backup-migration) | 查部署、升级、迁移、回滚和现场验证方式 | | 项目负责人 | [3-开发流程](/wiki/sdv/development-workflow) | 区分主线、能力线、定制线和历史版本 | ## 主线文档入口 | 章节 | 解决的问题 | 适合什么时候看 | | --- | --- | --- | | [1-产品视图](/wiki/sdv/product-view) | 智档宝有哪些业务能力,档案、数字化、环境控制、RFID 分别覆盖什么 | 新人进入产品线、产品/测试确认功能边界 | | [2-系统架构](/wiki/sdv/system-architecture) | 前端、后端、中间件、本地服务、设备接入和硬件之间怎么协作 | 开发排查问题、设计新能力、判断故障位置 | | [3-开发流程](/wiki/sdv/development-workflow) | 版本线、分支关系、代表仓库、版本 hash 和开发演进 | 找仓库、查版本来源、判断定制线关系 | | [4-打包分发](/wiki/sdv/packaging-distribution) | Linux / Windows 离线包怎么构建、命名、发布和验证 | 发版、交付、现场安装、确认包来源 | | [5-备份迁移](/wiki/sdv/backup-migration) | 旧现场怎么备份、换机、迁移、验证和回滚 | 升级前、重装前、换机前、跨系统迁移前 | ## 按场景阅读 | 场景 | 建议顺序 | | --- | --- | | 新人熟悉智档宝 | [1-产品视图](/wiki/sdv/product-view) -> [2-系统架构](/wiki/sdv/system-architecture) -> [3-开发流程](/wiki/sdv/development-workflow) | | 开发定位线上问题 | [2-系统架构](/wiki/sdv/system-architecture) -> [3-开发流程](/wiki/sdv/development-workflow) -> 具体功能页 | | 准备正式发版 | [3-开发流程](/wiki/sdv/development-workflow) -> [4-打包分发](/wiki/sdv/packaging-distribution) | | 现场部署或升级 | [4-打包分发](/wiki/sdv/packaging-distribution) -> [5-备份迁移](/wiki/sdv/backup-migration) | | 换机、重装、跨系统迁移 | [5-备份迁移](/wiki/sdv/backup-migration) -> [4-打包分发](/wiki/sdv/packaging-distribution) -> [2-系统架构](/wiki/sdv/system-architecture) | ## 目录结构 ```text 智档宝 ├─ 1-产品视图 ├─ 2-系统架构 ├─ 3-开发流程 ├─ 4-打包分发 └─ 5-备份迁移 ``` ## 维护原则 * 主线能力写在产品线目录,客户差异写到项目定制目录。 * 仓库地址和版本关系优先维护在 [3-开发流程](/wiki/sdv/development-workflow),不在每篇文章重复堆列表。 * 项目定制分组要标注来源主线、能力线和差异点,避免多年后无法判断 fork 关系。 * 架构文档只写稳定边界和关键流向,临时方案写到调试或项目记录。 * 打包、发布、备份、迁移和回滚必须写清楚来源包、版本 hash、数据对象和验证动作。 * ShowDoc 导入内容作为历史资料逐步迁移,不直接替代现行研发文档。 --- --- url: /wiki/sdv/product-view.md --- # 1-产品视图 产品视图用于从业务能力角度理解智档宝。它回答“系统给用户提供什么能力”,不直接按代码仓库、服务进程或部署组件组织。 ![智档宝产品能力地图](/illustrations/smart-doc-vault-product-view.png) ## 阅读目标 * 知道智档宝目前主要由哪些产品能力组成。 * 区分主线能力、正在开发能力和项目定制能力。 * 给产品、实施、研发、测试提供统一的功能地图。 ## 产品主线 从产品视角看,智档宝目前主要分为四大块。 | 主块 | 当前定位 | 状态 | | --- | --- | --- | | 档案管理 | 智档宝的基础业务主线,围绕档案、库房、架体、借阅、盘点、权限展开 | 主线能力 | | 环境控制 | 围绕库房环境、传感器、网关、空调、除湿、漏水、报警、监控等现场环境能力展开 | 现场设备能力 | | 数字化 | 围绕电子档案、文件上传、文件解析、预览、搜索和断点续传展开 | 主线能力 / 持续增强 | | RFID | 围绕 RFID 标签、门口机、手持机、盘点车、RFID 打印机和实物识别流程展开 | 截至目前仍在开发中 | ## 档案管理 档案管理是智档宝最核心的业务能力。它解决“档案在哪里、是什么状态、谁能操作、如何流转”的问题。 ### 能力范围 | 能力 | 产品说明 | | --- | --- | | 档案建档 | 建立档案基础信息,形成可检索、可流转的业务对象 | | 档案查询 | 按档号、题名、分类、库房、状态等条件查询档案 | | 档案借阅 | 支持借阅申请、借出、归还、状态变更和记录追踪 | | 档案入库 / 出库 | 将档案和库房位置、架体位置、库区信息关联起来 | | 档案盘点 | 对档案实物、系统记录和设备识别结果进行核对 | | 档案状态流转 | 维护在库、借出、归还、待上架、异常等状态 | | 档案架具 | 管理库区、架体、列、节、层、位等空间结构 | | 密集架 / 回转柜 | 维护实体档案装具、库位映射、上架下架和现场联动 | | 权限控制 | 控制用户能访问哪些库房、档案和功能 | ### 产品边界 * 档案管理关注业务流程和状态一致性。 * 具体设备如何移动、识别、开架、扫码,放到环境控制、RFID 或设备文档里说明。 * 数字化文件、全文检索、文件预览属于数字化能力,但会和档案对象关联。 ### 后续建议拆页 ```text 档案管理 ├─ 档案建档 ├─ 档案查询 ├─ 借阅 / 归还 ├─ 入库 / 出库 ├─ 档案盘点 ├─ 档案状态 ├─ 档案架具 ├─ 密集架 / 回转柜 └─ 权限控制 ``` ## 环境控制 环境控制是智档宝面向库房环境和现场安全的能力板块。它关注环境数据采集、设备控制、异常告警和现场联动。 | 能力 | 产品说明 | | --- | --- | | 温湿度监测 | 采集库房温湿度,展示实时状态和历史趋势 | | 空气质量 | 对空气质量、颗粒物等环境数据进行接入和展示 | | 空调 / 除湿 / 加湿 | 控制或联动库房环境设备 | | 漏水 / 报警 | 识别漏水、异常状态和告警事件 | | 网关接入 | 通过网关统一接入现场设备 | | 摄像头 / 门禁 | 对接监控、门禁等现场安全设备 | ### 产品边界 * 环境控制关注库房环境和安全状态,不负责档案业务状态本身。 * 环境控制设备可以影响档案管理和大屏展示,但业务规则仍由主系统承载。 * 具体协议、网关型号、MQTT、Modbus、HTTP、串口等技术细节放到系统架构或设备文档。 ### 后续建议拆页 ```text 环境控制 ├─ 环境控制总览 ├─ 温湿度 / 空气质量 ├─ 空调 / 除湿 / 加湿 ├─ 漏水 / 报警 ├─ 网关接入 ├─ 摄像头 / 监控 └─ 门禁接入 ``` ## 数字化 数字化用于把纸质档案、附件和多媒体材料转成可上传、可预览、可解析、可搜索的电子档案。 ### 能力范围 | 能力 | 产品说明 | | --- | --- | | 文件上传 | 上传档案附件、扫描件、图片、音视频、办公文档等文件 | | 断点续传 | 大文件或不稳定网络下继续上传,避免重复传输 | | 文件预览 | 对图片、PDF、Office、音视频等常见格式进行在线预览 | | 文件解析 | 提取文档内容,为检索和后续处理提供基础 | | 全文搜索 | 对电子档案内容进行检索,支持按关键字定位资料 | | 电子档案 | 将文件、元数据、档案对象绑定,形成电子档案能力 | | 文件存储 | 对接对象存储或本地文件服务,管理文件落盘和访问 | ### 文件类型 数字化能力需要覆盖常见档案材料: ```text 图片:jpg、png、bmp 文档:txt、doc、docx、xls、xlsx、ppt、pptx、pdf 音频:mp3、wav、flac 视频:mp4、flv、m3u8、avi、mkv 压缩包和其他附件:按项目需求扩展 ``` ### 产品边界 * 数字化关注文件从上传到可用的完整链路。 * 文件存储、解析服务、搜索服务属于系统架构层,但产品视图需要明确它们承载的用户能力。 * 如果某个项目只需要上传和预览,不需要全文检索,应在项目定制中单独说明。 ### 后续建议拆页 ```text 数字化 ├─ 文件上传 ├─ 断点续传 ├─ 文件预览 ├─ 文件解析 ├─ 全文搜索 ├─ 电子档案 └─ 文件类型支持 ``` ## RFID RFID 是智档宝面向实物档案识别和现场操作的能力板块。截至目前仍在开发中,文档需要明确已完成能力、正在开发能力和项目定制差异。 | 能力 | 产品说明 | | --- | --- | | RFID 标签 | 将档案实物与 RFID 标签绑定 | | 门口机 | 支持出入库识别、通行识别或现场操作入口 | | 手持机 | 支持移动盘点、查找、扫码、现场操作 | | 盘点车 | 面向批量盘点和现场巡检 | | RFID 打印机 | 支持标签打印和档案标识制作 | | RFID 服务 | 负责读写器、标签、设备事件和主系统之间的衔接 | ### 产品边界 * RFID 关注实物档案识别、盘点和现场操作。 * RFID 会和档案管理产生业务联动,例如绑定标签、盘点、出入库识别。 * RFID 相关设备包含门口机、手持机、盘点车、RFID 打印机等。 * 读写器、设备服务、标签协议、打印协议等技术实现放到系统架构或设备文档。 * 截至目前仍在开发中的能力,需要在具体页面标记状态,不要和已稳定能力混写。 ### 后续建议拆页 ```text RFID ├─ RFID 总览 ├─ RFID 标签 ├─ 门口机 ├─ 手持机 ├─ 盘点车 └─ RFID 打印机 ``` ## 其他 | 能力 | 说明 | 关联模块 | | --- | --- | --- | | 授权管理 | 系统授权、离线授权、授权审批和授权校验 | 授权服务、部署交付 | | 大屏展示 | 新大屏、定制大屏、库房状态展示 | 大屏前端、后端接口、数据可视化 | | 密集架 / 回转柜 | 归入档案管理中的档案架具和库位能力,其他页只保留入口 | 档案管理、系统架构、设备接入 | | 打印服务 | 普通打印、标签打印、模板打印 | 打印服务、本地服务、RFID 打印机 | | 人脸识别 | 身份识别、门禁或现场操作辅助 | 人脸服务、门口机、项目定制 | | 服务监控 | Windows 服务、本地服务、现场程序状态监控 | 本地服务、运维工具 | | 项目定制 | 面向客户项目的差异功能和交付形态 | 项目分支、定制仓库、交付文档 | ## 推荐拆页方式 产品能力页不要直接写代码实现。每个页面先描述业务对象、流程和边界,再链接到系统架构、代码仓库和调试文档。 ## 当前目录 ```text 1-产品视图 ├─ 档案管理 ├─ 环境控制 ├─ 数字化 ├─ RFID └─ 其他 ``` ## 单篇文档模板 每个产品能力建议按同一模板维护。 ```text 业务目标 核心对象 主要流程 状态流转 前端入口 后端模块 关联设备 配置项 常见问题 关联仓库 ``` ## 维护原则 * 产品视图只描述“用户能做什么”和“业务怎么流转”。 * 技术实现细节放到系统架构、代码仓库或调试文档。 * 项目定制差异只写摘要,详细内容放到项目定制目录。 * 一个能力如果同时涉及前端、后端和设备,也仍然只在产品视图里维护一份业务说明,避免多处重复。 --- --- url: /wiki/sdv/archive-management.md --- # 档案管理 ![档案管理业务场景](/illustrations/archive-management-overview.png) 档案管理是智档宝的基础业务主线,负责把库区、档案、档案装具、借阅、盘点和权限组织成可管理、可查询、可追溯的业务体系。 ## 业务定位 档案管理重点回答三个问题: * 档案在哪里:档案归属哪个库房、库区、架体、柜体或格口。 * 档案是什么:档案有哪些著录信息、密级、保管期限、电子文件和业务扩展字段。 * 档案怎么流转:档案从建档、上架、借阅、归还、盘点异常到销毁如何变化。 ## 目录总览 | 目录 | 解决的问题 | 主要内容 | | --- | --- | --- | | 库区 | 档案和装具实际放在哪里 | 库房、库区、层级结构、密集架、回转柜、当前接入类型 | | 档案 | 一份档案如何建档、扩展和流转 | 档案主数据、档案分类、自定义字段、导入导出、生命周期、借阅、回转柜盘点 | | 档案装具 | 档案盒、袋、夹等载体如何管理 | 装具类型、装具位置、装具字段、装具内档案、装具借阅和盘点 | | 打印 | 档案业务中哪些内容需要输出纸质或标签 | 档案标签、装具标签、借阅单、移交单、盘点单、模板和字段 | | 研发参考 | 研发如何理解产品对象和代码模块 | 产品对象、模型映射、前后端入口、关联仓库 | | 产品边界 | 哪些内容属于档案管理,哪些不属于 | 数字化、RFID、环境控制、设备协议和系统架构边界 | ## 核心对象 | 对象 | 说明 | | --- | --- | | 库区 | 档案存放的业务空间,承载架体、柜体、权限、统计和盘点范围 | | 档案 | 系统管理的核心业务对象,包含基础信息、状态、位置、扩展字段和关联文件 | | 档案装具 | 档案盒、档案袋、档案夹、档案箱、防磁柜、光盘、磁带等承载对象 | | 档案架具 | 密集架、固定列、回转柜等实体或逻辑存放结构 | | 借阅记录 | 记录借阅申请、审批、借出、归还和超期情况 | | 盘点记录 | 记录盘点任务、盘点结果、差异和处理状态 | | 用户 / 权限 | 控制人员能访问的库房、档案范围和操作能力 | ## 前端页面结构 当前前端主线按“档案概览 / 档案维护”组织。档案概览面向日常检索、建档和对象操作;档案维护面向待办队列、异常处理和借阅流转。 | 一级入口 | 二级入口 | 主要处理对象 | 前端目录 | | --- | --- | --- | --- | | 档案概览 | 档案概览 | 单份档案、电子档案、档案位置、暂存、组卷、借阅、转移、删除、出库、导出 | `fit-archive-ng/src/views/ArchivesManagement/overview/File` | | 档案概览 | 档案装具概览 | 档案盒、袋、夹、箱等装具,支持暂存、拆卷、借阅、转移、删除、出库、导出 | `fit-archive-ng/src/views/ArchivesManagement/overview/FileBox` | | 档案维护 | 新档上架 | 待分配明确库位的档案和装具 | `fit-archive-ng/src/views/ArchivesManagement/maintain/PutOnShelves` | | 档案维护 | 档案回收站 | 已删除但可恢复或销毁的档案和装具 | `fit-archive-ng/src/views/ArchivesManagement/maintain/RecycleBin` | | 档案维护 | 遗失档案 | 现场确认遗失后的档案和装具,可找回或彻底遗失处理 | `fit-archive-ng/src/views/ArchivesManagement/maintain/LostFile` | | 档案维护 | 借阅审批 | 待审批、已通过、已拒绝等借阅申请 | `fit-archive-ng/src/views/ArchivesManagement/maintain/BorrowingApproval` | | 档案维护 | 待取档案 | 审批通过后等待现场取档的借阅对象 | `fit-archive-ng/src/views/ArchivesManagement/maintain/PendingFile` | | 档案维护 | 在借档案 | 已借出、可归还或标记遗失的对象 | `fit-archive-ng/src/views/ArchivesManagement/maintain/BorrowingFiles` | | 档案维护 | 超期档案 | 超过借阅期限的在借对象 | `fit-archive-ng/src/views/ArchivesManagement/maintain/OverdueFile` | | 档案维护 | 归还上架 | 已归还但还需要重新确认位置的档案和装具 | `fit-archive-ng/src/views/ArchivesManagement/maintain/ReturnToShelf` | | 档案维护 | 借阅用户 | 借阅人账号、审批人和借阅权限维护 | `fit-archive-ng/src/views/ArchivesManagement/maintain/FileUser` | | 档案维护 | 已出库档案 | 已出库但可找回的档案和装具 | `fit-archive-ng/src/views/ArchivesManagement/maintain/outLibraryFile` | 页面上看到的“档案概览”和“档案装具概览”是两套对象列表,但维护页通常会同时提供档案和装具两个 Tab。写业务说明时不要把“档案”和“档案装具”合成一个对象,也不要把“分类”写成实体装具。 ## 库区 库区用于描述档案实物存放的空间范围。它是库房管理、上架、查找、借阅取档、归还上架、盘点和大屏统计的共同基础。 ### 层级结构 ```text 库房 └─ 库区 └─ 架体 / 柜体 ├─ 密集架:列 / 左右侧 / 节 / 层 / 格 └─ 回转柜:柜体 / 层 / 格口 └─ 档案 / 档案装具 ``` | 层级 | 产品含义 | | --- | --- | | 库房 | 档案保管的物理空间,通常也是权限、统计和大屏展示的基础范围 | | 库区 | 库房下的业务分区,可按楼层、房间、区域或项目习惯划分 | | 架体 / 柜体 | 密集架、固定列、回转柜等档案架具 | | 密集架位置 | 通过列、左右侧、节、层、格定位档案或装具 | | 回转柜位置 | 通过柜体、层、格口定位档案 | | 档案 / 装具 | 最终落位到库区中的实体对象 | 对外或跨系统调用开架能力时,不能只提供“第几列”。密集架同一列通常有左右两面,必须提供档案所在侧,必要时再带上节、层、格。推荐位置编码可按“区域号-列号-侧编码-节-层-格”组织,例如 `A01-3-01-2-4-5`,其中 `01` 表示左侧,`02` 表示右侧。 ### 密集架 密集架是库区中最常见的智能架具。产品上需要把“库位结构”和“设备联动”分开理解:档案管理负责库位、状态和业务流程,设备服务负责执行开架、闭架、移动列控制和状态回传。 | 能力 | 产品说明 | | --- | --- | | 固定列 / 移动列 | 维护密集架的固定列、移动列和列号关系 | | 架体结构 | 维护区、列、左侧 / 右侧、节、层、格等空间结构 | | 库位映射 | 将档案、档案盒或档案袋绑定到具体库位 | | 上架 / 下架 | 将待上架档案放入指定库位,或从库位移出 | | 开架 / 闭架联动 | 在业务操作中触发或提示现场架体动作 | | 状态回传 | 展示架体在线、移动、异常、占用等状态 | | 盘点联动 | 结合库位清单、设备状态或 RFID 结果完成盘点 | | 结构 / 统计 | 说明 | | --- | --- | | 固定列位置 | 支持左侧、右侧、中间等固定列位置口径 | | 列号范围 | 描述一个库区内密集架可用列号 | | 业务列号 / 设备列号 | 用户看到的列号和硬件通信使用的列号可能不同 | | 左右侧节层格 | 左侧和右侧可分别配置节数、层数、格数 | | 左右侧在库数 | 按左右侧统计在库档案数量 | | 左右侧借阅数 | 按左右侧统计借阅相关档案数量 | | 通道距离 | 可展示当前通道距离百分比 | | AI / 异物状态 | 可展示分析中、空闲、资源不足、平台离线、无异物、有物、有人有物等状态 | #### 密集架接入类型 | 接入类型 | 当前实现口径 | 协议 | 对接文档 / 资料 | | --- | --- | --- | --- | | FD-01 | 方德密集架 | TCP Client / USB Serial | [FD-01 协议文档](/wiki/reference-docs#fd-01-密集架协议),网盘:[固定列与计算机间通讯协议 V5](https://pan.feidu.fit/%E5%BC%80%E5%8F%91/%E5%AF%B9%E6%8E%A5%E6%96%87%E6%A1%A3/%E5%9B%BA%E5%AE%9A%E5%88%97%E4%B8%8E%E8%AE%A1%E7%AE%97%E6%9C%BA%E9%97%B4%E9%80%9A%E8%AE%AF%E5%8D%8F%E8%AE%AEV5%E7%89%88%E6%9C%AC%EF%BC%88%E7%AC%AC3%E6%96%B9%EF%BC%89.doc) | | FD-02 | 北泰 / TLU6820 系列 | HTTP | 网盘:[密集架远程对接接口 V1.9](https://pan.feidu.fit/%E5%BC%80%E5%8F%91/%E5%AF%B9%E6%8E%A5%E6%96%87%E6%A1%A3/%E5%AF%86%E9%9B%86%E6%9E%B6%E8%BF%9C%E7%A8%8B%E5%AF%B9%E6%8E%A5%E6%8E%A5%E5%8F%A3V1.9%281%29.docx)、[密集架远程控制实例](https://pan.feidu.fit/%E5%BC%80%E5%8F%91/%E5%AF%B9%E6%8E%A5%E6%96%87%E6%A1%A3/%E5%AF%86%E9%9B%86%E6%9E%B6%E8%BF%9C%E7%A8%8B%E6%8E%A7%E5%88%B6%E5%AE%9E%E4%BE%8B%282%29.docx) | | FD-03 | 天骄固定列 WebApi | HTTP | 网盘:[密集架固定列 WebApi 通信协议 v3.1.1](https://pan.feidu.fit/%E5%BC%80%E5%8F%91/%E5%AF%B9%E6%8E%A5%E6%96%87%E6%A1%A3/%E5%AF%86%E9%9B%86%E6%9E%B6%E5%9B%BA%E5%AE%9A%E5%88%97WebApi%E9%80%9A%E4%BF%A1%E5%8D%8F%E8%AE%AEv3.1.1.pdf) | | FD-04 | 云档密集架 | HTTP | 网盘:[云档 Apifox 导出](https://pan.feidu.fit/%E5%BC%80%E5%8F%91/%E5%AF%B9%E6%8E%A5%E6%96%87%E6%A1%A3/%E4%BA%91%E6%A1%A3Apifox%E5%AF%BC%E5%87%BA.pdf) | | FD-05 | 华升 / 高频密集架 | HTTP | 网盘:[高频密集架管理系统对接接口说明书 V1.4](https://pan.feidu.fit/%E5%BC%80%E5%8F%91/%E5%AF%B9%E6%8E%A5%E6%96%87%E6%A1%A3/%E9%AB%98%E9%A2%91%E5%AF%86%E9%9B%86%E6%9E%B6%E7%AE%A1%E7%90%86%E7%B3%BB%E7%BB%9F%E5%AF%B9%E6%8E%A5%E6%8E%A5%E5%8F%A3%E8%AF%B4%E6%98%8E%E4%B9%A6V1.4%281%29.docx)、[智能密集架控制系统对接接口说明书 V1.3](https://pan.feidu.fit/%E5%BC%80%E5%8F%91/%E5%AF%B9%E6%8E%A5%E6%96%87%E6%A1%A3/%E6%99%BA%E8%83%BD%E5%AF%86%E9%9B%86%E6%9E%B6%E6%8E%A7%E5%88%B6%E7%B3%BB%E7%BB%9F%E5%AF%B9%E6%8E%A5%E6%8E%A5%E5%8F%A3%E8%AF%B4%E6%98%8E%E4%B9%A6V1.3%E6%9C%80%E6%96%B0%E7%89%88.docx)、[华升密集架.rar](https://pan.feidu.fit/%E5%BC%80%E5%8F%91/%E5%AF%B9%E6%8E%A5%E6%96%87%E6%A1%A3/%E5%8D%8E%E5%8D%87%E5%AF%86%E9%9B%86%E6%9E%B6.rar) | | FD-06 | 飞度密集架 | HTTP / WS | 网盘:[飞度密集架 Apifox 导出](https://pan.feidu.fit/%E5%BC%80%E5%8F%91/%E5%AF%B9%E6%8E%A5%E6%96%87%E6%A1%A3/%E9%A3%9E%E5%BA%A6%E5%AF%86%E9%9B%86%E6%9E%B6Apifox%E5%AF%BC%E5%87%BA.pdf),以 `fit-denserack`、`smart-doc-vault` 中的 FD-06 实现和现场镜像为准 | 网盘目录:[开发 / 对接文档](https://pan.feidu.fit/%E5%BC%80%E5%8F%91/%E5%AF%B9%E6%8E%A5%E6%96%87%E6%A1%A3)。 | 接入类型 | 现场识别特征 | 代码入口 | | --- | --- | --- | | FD-01 | 固定列协议,走串口服务器或 USB 串口;库区配置里 `accessMode` 常见为 `串口服务器` 或 `USB串口` | `smart-doc-vault/pkg/mjj/fd01_mjj.go`、`service/system/mjj.go` | | FD-02 | HTTP 路径为 `/IntelligentCabinetAPIServer/...`,常见接口有 `OpenCol`、`ReportStatus`、`ReportInfo`,文档默认端口为 `16000` | `smart-doc-vault/pkg/mjj/fd02_mjj.go`、`service/system/mjj_fd02.go` | | FD-03 | HTTP 路径为 `/MjjWebApi/...`,请求头 `token` 由开发识别码、用户名、密码 Base64 生成;库区配置会额外维护授权码、用户名、密码 | `smart-doc-vault/pkg/mjj/fd03_mjj.go` | | FD-04 | HTTP 固定请求 `/MjjWebApi`,动作放在 JSON 字段 `Op`,例如 `GetConfig`、`getShelfStatus`、`OpenShelf`、`CloseShelf` | `smart-doc-vault/pkg/mjj/fd04_mjj.go` | | FD-05 | HTTP 路径为 `/denseshelf/...`,返回字段常见 `resultcode`、`resultdata`,按 `zone` 区号操作 | `smart-doc-vault/pkg/mjj/fd05_mjj.go` | | FD-06 | 飞度自研密集架,平台侧维护 `FD06AuthCode`,支持 WebSocket 绑定和 `/mjj/fd06proxy/...` HTTP 代理 | `smart-doc-vault/pkg/mjj/fd06_mjj.go`、`mjjs/mjj_fd06.go`、`service/system/mjj_ws.go` | 当前代码实现中,FD-03 是天骄固定列 WebApi,FD-04 是云档密集架;历史资料里如果出现相反写法,以代码实现和现场接口路径为准。 ### 回转柜 回转柜也是库区中的智能架具,更适合按“档案直接落格口”理解。它和密集架一样归入库区管理,但现场动作、通信协议和控制程序通常会单独实现。 RFID 在这里可以理解为“给档案或装具一个可被无线读取的身份”。档案绑定 RFID 标签后,读写器可以在取档、归档、盘点时读取标签号,再和系统中的档案、格口、库位关系进行比对。回转柜场景下,RFID 通常不直接决定业务状态,而是作为辅助识别手段,用来确认“拿到的是不是这份档案”“归回的是不是这个格口”“盘点结果和系统记录是否一致”。 | 能力 | 产品说明 | | --- | --- | | 柜体管理 | 维护回转柜设备和所属库区 | | 格口 / 库位 | 将柜体内部空间映射成可绑定档案的位置 | | 取档 | 根据档案位置找到对应柜体和格口,辅助现场取档 | | 归档 | 将归还档案重新绑定到柜体库位 | | 状态同步 | 展示柜体在线、故障、占用或执行状态 | | 项目定制 | 不同项目的柜体型号、库位规则和操作流程可能不同 | | 统计项 | 产品说明 | | --- | --- | | 全部档案 | 柜内系统记录的总档案数,不论状态 | | 在库档案 | 柜内实际可视为在库的档案,包含在库和借阅未取 | | 在借档案 | 借阅流程中的档案,包含借阅中和在借未取 | | 不在库档案 | 系统记录在柜内,但盘点不到或未按借阅流程出库的档案 | | 剩余格口 | 回转柜总格口数减去已占用档案数 | #### 回转柜档案状态 回转柜有一套特殊的档案展示状态。普通密集架主要看 `ArchiveModel.Status`,而回转柜档案会优先结合最新盘点结果 `InventoryResultModel.NewBorrowStatus` 展示状态;同时用盘点结果判断 `HzgStatus`,结果为“正常 / 盘盈”时视为在位,其他结果通常视为不在位。 | 回转柜展示状态 | 形成口径 | 产品含义 | | --- | --- | --- | | 待上架 | 业务状态仍是待上架 | 档案还没有完成格口确认 | | 在库 | 档案状态、借阅关系和盘点结果一致,或归还后已盘到原格口 | 柜内可视为正常在位 | | 未在库 | 系统认为应在库,但盘点未识别到对应 RFID | 需要人工确认是漏读、错放、取走未登记还是遗失 | | 借阅审批 | 档案在库,存在待审批借阅申请 | 审批未完成,现场不应直接取走 | | 借阅待取 | 审批通过,等待现场取档 | 柜内仍可能在位,表示审批通过但尚未取走 | | 借阅 | 档案处于借阅流程,且盘点关系支持当前状态 | 业务上已进入借阅状态 | | 借阅未取 | 档案业务状态是借阅,但回转柜盘点仍显示在位 | 常见于系统已登记借出、现场尚未取走或状态未同步 | | 归还待上架 | 档案已归还,但盘点或位置尚未确认 | 需要完成归还上架或重新确认格口 | | 借阅超期 | 借阅超过期限 | 借阅流程异常状态,仍需结合在位 / 不在位判断现场处理 | 这组状态不应直接套到密集架或普通档案盒上。回转柜状态更像“业务状态 + 借阅审批状态 + RFID 盘点结果”的合成展示,用来指导现场开柜、取档、归还和异常处理。 回转柜不要默认套用档案盒上架逻辑。具体 TCP 服务、控制命令和厂商差异放到系统架构或设备调试文档。 #### 回转柜接入类型 | 接入类型 | 厂商 | 协议 | 对接文档 | | --- | --- | --- | --- | | FD-01 | 中芯回转柜 | TCP server | 网盘:[回转柜通讯协议](https://pan.feidu.fit/%E5%BC%80%E5%8F%91/%E5%AF%B9%E6%8E%A5%E6%96%87%E6%A1%A3/%E5%9B%9E%E8%BD%AC%E6%9F%9C%E9%80%9A%E8%AE%AF%E5%8D%8F%E8%AE%AE%E6%94%B9%281%29.docx)、[回转柜补充](https://pan.feidu.fit/%E5%BC%80%E5%8F%91/%E5%AF%B9%E6%8E%A5%E6%96%87%E6%A1%A3/%E5%9B%9E%E8%BD%AC%E6%9F%9C%E8%A1%A5%E5%85%85.jpg),调试:[网络协议调试地址](/wiki/network-protocol-debug-urls) | 调试协议侧已有旧文档记录: | 标识 | 说明 | | --- | --- | | `hzg` | 回转柜,TCP server | | `mjj` | 密集架,TCP Client / USB,其中 USB 已弃用 | | `udp` | 设备调试,UDP | | `mqtt` | 设备通信,MQTT | ## 档案 档案是一切业务流转的核心对象。它既包含标准著录信息,也需要承接项目差异字段,并且要在生命周期中持续变化。 ### 档案主数据 | 字段方向 | 产品说明 | | --- | --- | | 基础信息 | 档案名称、档案编号、备注、维护人、创建时间 | | 分类信息 | 目录位置、分类路径、年度、类别、全宗或项目定义的分类字段 | | 保管属性 | 保密等级、有效期、保管期限、责任部门 | | 实体位置 | 库房、库区、架体、柜体、层级位置 | | 装具关系 | 档案可以归属到档案盒、档案袋等装具 | | 电子档案 | 物理档案可以挂接电子档案文件 | | RFID | 档案可绑定 RFID 标签,用于盘点和状态判断 | | 审批关系 | 档案可关联借阅审批 | | 回转柜盘点关系 | 档案可关联最新回转柜盘点结果,展示在位 / 不在位 | | 类型 | 当前口径 | | --- | --- | | 保密等级 | 公开、内部、秘密、机密、绝密 | | 有效期 | 永久、三年、五年、十年、十五年、二十年、二十五年、三十年 | 当前前端“新建档案”不是单一表单,而是先选择档案类型,再决定是否直接入库或进入待上架队列。 | 前端档案类型 | 代码值 | 产品含义 | | --- | --- | --- | | 独立成盒 | `A` | 不需要记录装具内部细分档案信息,按单份档案选择位置或进入待上架 | | 存入现有盒 | `B` | 将档案信息存入一个已有档案装具内,不单独选择上架模式 | | 多册组卷 | `C` | 创建新的档案装具并记录其中档案信息,后续按装具位置处理 | | 上架模式 | 代码值 | 产品含义 | | --- | --- | --- | | 直接入库 | `A` | 直接选择档案位置或档案装具位置,创建后自动完成上架 | | 暂不分配位置 | `B` | 先选择大致库房位置,创建后进入“新档上架”等待分配明确库位 | 本地静态词典里还保留了“档案载体类型”和“档案门类”的基础口径:载体类型包括纸质档案、电子档案、照片档案、音视频档案;档案门类包括文书档案、科技档案、会计档案、声像档案。项目落地时可以扩展字段,但这些名称应优先作为检索和导入导出的稳定口径。 这些字段是查询、权限、借阅审批和档案移交销毁判断的基础,不建议只作为普通备注字段维护。 ### 档案分类 档案分类用于替代传统“卷宗”在系统里的组织作用。传统卷宗更像一组纸质材料的业务集合,但在智档宝里,分类应当承担“怎么归类、怎么检索、怎么授权、怎么统计”的职责;实体承载关系交给档案装具处理。 | 概念 | 当前口径 | | --- | --- | | 档案分类 | 档案的业务归属和目录层级,用来组织档案、设置查询条件、统计范围和权限范围 | | 卷宗 | 作为传统业务说法保留理解,不建议在新模型里作为独立核心对象扩展 | | 档案装具 | 档案盒、袋、夹等实体承载对象,解决“档案放在哪个盒子里” | | 库区位置 | 库房、库区、架体、层格等空间位置,解决“档案或装具放在哪里” | 分类可以按客户业务定义成多级树,例如“年度 / 门类 / 保管期限 / 项目 / 部门”。同一份档案只要分类路径清楚,就可以被查询、导入、导出、授权和统计;是否装入某个档案盒,不应该改变它的分类含义。 前端实现上,档案分类对应的是 `/dir/*` 目录树接口,而不是一个叫“卷宗”的独立模型。系统支持维护根分类名称、加载子目录、新增、编辑、删除和批量排序。 | 能力 | 接口口径 | | --- | --- | | 分类树 | `/dir/getDirs`、`/dir/getDirChildren` | | 新增 / 编辑 / 删除 | `/dir/addDir`、`/dir/editDir`、`/dir/deleteDir` | | 排序 | `/dir/batchSort` | | 根分类名称 | `/setting/getRootDirName`、`/setting/setRootDirName` | ```text 档案分类 ├─ 文书档案 │ ├─ 永久 │ └─ 定期 ├─ 项目档案 │ ├─ 项目 A │ └─ 项目 B └─ 会计档案 ``` 维护分类时要避免把“分类”和“装具”混用:分类是逻辑目录,装具是实体载体。一个分类下可以有很多档案,这些档案可以分布在多个档案盒中;一个档案盒也可能承载同一分类下的一批档案。 ### 自定义字段 自定义字段用于承接不同项目、不同客户、不同档案类型的著录差异。它的目标是让项目可以扩展字段,而不是为了每个客户反复修改档案主数据。 | 字段类型 | 说明 | | --- | --- | | 档案扩展字段 | 补充档案主数据之外的项目著录项,例如合同编号、业务系统编号、责任人、所属项目等 | | 字段展示 | 在档案详情、列表、查询条件中按项目需要展示 | | 导入导出 | 导入模板、导出表格、批量维护时需要保持字段含义一致 | | 项目差异 | 不同客户项目可以维护不同字段,但同一项目内字段命名要稳定 | #### 历史方案演进 自定义字段在智档宝里不是一次成型的能力,历史上大致经历了“JSON 扩展字段”到“字段定义 + EAV 值表 + 表头配置”的演进。 | 阶段 | 方案 | 解决的问题 | 局限 | | --- | --- | --- | --- | | 早期方案 | 在档案或装具主数据里保存 JSON 格式扩展字段 | 不改数据库表结构就能承接项目著录差异,适合快速交付 | 查询、筛选、导入校验、字段重命名和统计都比较重,跨数据库兼容也不好控制 | | 过渡方案 | 保留前端 `extends` 结构,字段用 `id-字段ID` 作为动态列标识 | 前端列表、详情、导入导出可以用统一方式处理标准字段和扩展字段 | 值如果只靠 JSON 保存,精确筛选和全文搜索仍然依赖额外解析 | | 当前主线 | 字段定义表 + EAV 值表 + 每用户表头配置 | 字段可配置,值可按字段 ID 查询和筛选,列表列宽、排序、显隐可按用户保存 | 字段数量过多时查询会变复杂,需要控制字段治理和索引策略 | 当前实现里,档案和档案装具各自有一套扩展字段体系:档案使用 `sys_archive_extend`、`sys_archive_extend_value`、`sys_archive_field`;装具使用 `sys_box_extend`、`sys_box_extend_value`、`sys_box_field`。字段类型目前以 `text`、`date`、`select` 为主,`select` 字段需要维护可选值,必填字段会在建档或建装具时校验。 | 当前能力 | 档案接口 / 表 | 装具接口 / 表 | 说明 | | --- | --- | --- | --- | | 字段定义 | `/archive/addArchiveExt`、`/archive/editArchiveExt`、`/archive/deleteArchiveExt`、`sys_archive_extend` | `/box/addBoxExt`、`/box/editBoxExt`、`/box/deleteBoxExt`、`sys_box_extend` | 维护字段名称、类型、选项、必填和备注 | | 字段值 | `sys_archive_extend_value` | `sys_box_extend_value` | 按对象 ID + 字段 ID 保存值,字段名冗余保存用于减少关联成本 | | 表头配置 | `/archive/getArchiveSysExtList`、`/archive/setArchiveField`、`/archive/setArchiveFieldWidth`、`sys_archive_field` | `/box/getBoxExtSysList`、`/box/setBoxField`、`/box/setBoxFieldWidth`、`sys_box_field` | 支持列表列显隐、排序、列宽和动态字段列 | | 查询筛选 | `id-字段ID` 进入字段过滤,EAV 子查询匹配 | `id-字段ID` 进入字段过滤,EAV 子查询匹配 | 前端动态列的 `dataIndex` 形如 `id-12` | | 导入导出 | `archive_excel.go` | `box_excel.go` | 导入模板和导出清单会读取扩展字段定义 | 因此,文档里说“自定义字段”时要区分三个层面:字段定义决定能填什么,字段值记录每个档案或装具填了什么,表头配置决定某个用户在列表里怎么看。不要把扩展字段直接理解成“在主表里临时加一列”。 维护原则: * 标准字段用于所有项目都稳定存在的内容,例如档案编号、名称、状态、密级、位置。 * 自定义字段用于项目差异和客户著录差异,例如额外编号、业务分类、备注字段。 * 自定义字段应进入查询、导入、导出和详情展示,但不应直接替代生命周期状态、库位、借阅审批等核心字段。 * 字段名称、字段类型和导入导出口径需要稳定维护,避免同一含义在不同项目中出现多个名字。 ### 导入导出 导入导出是档案管理的批量交付入口。它不只是“下载 Excel / 上传 Excel”,还承担字段模板、数据校验、错误回填、批量建档、批量建装具和现场核对清单的职责。 | 能力 | 档案 | 档案装具 | 说明 | | --- | --- | --- | --- | | 下载模板 | `/archive/excelTemplate` | `/box/excelTemplate` | 根据基础字段和当前扩展字段生成模板 | | 上传文件 | `/archive/importExcelUpload` | `/box/importExcelUpload` | 上传后校验文件类型、表头和重复导入 | | 开始导入 | `/archive/importExcelStart` | `/box/importExcelStart` | 使用上传返回的 `key` 执行导入,档案装具导入还会带位置和分类参数 | | 错误文件 | `/archive/downloadExcelError` | `/box/downloadExcelError` | 把验证错误、创建错误写回原 Excel,便于修正后重新提交 | | 导出列表 | `/archive/exportArchiveList` | `/box/exportBoxList` | 支持导出所选、导出本页、导出全部 | | 出库导出 | 出库档案列表 | 出库档案装具列表 | 表头会把删除人、删除原因、删除时间替换成出库人、出库原因、出库时间 | 当前导入流程分两步:先上传 Excel,后端读取并缓存文件,返回导入 `key`;再由前端带 `key` 调用开始导入接口。这样做的好处是可以先做表头校验和重复文件判断,再进入真正的数据校验和批量创建。 ```text 下载模板 ↓ 填写 Excel ↓ 上传文件,得到 key ↓ 开始导入 ├─ 成功:生成档案 / 装具并写入日志 └─ 失败:下载带错误列和批注的 Excel,修正后重新上传 ``` | 校验点 | 产品口径 | | --- | --- | | 表头校验 | 档案模板必须包含“档案名称”,装具模板必须包含“档案装具名称” | | 必填字段 | 档案名称、档案编号、装具名称、编号、类型,以及自定义字段中标记为必填的字段 | | 编号唯一 | 档案编号和装具编号不应重复,批量文件内部也要避免重复 | | 下拉字段 | 保密等级、有效期、装具类型、`select` 自定义字段需要使用模板提供的可选值 | | 时间字段 | 支持常见日期时间格式,导入错误文件会尽量保留时间列格式 | | 位置和分类 | 导入时需要明确对象最终归属的库房、库区、位置或分类,不能只靠 Excel 备注描述 | | 并发导入 | 当前档案导入和装具导入各自有导入锁,同一类导入任务同时只处理一个 | | 重复文件 | 后端会计算文件 MD5,避免同一文件被重复导入 | 导出要区分“业务清单”和“数据迁移”。导出所选、本页、全部适合现场核对和交付清单;如果要做系统间迁移,必须确认字段定义、分类树、库区位置和装具关系是否已经在目标系统中存在。不要把导出的列表文件直接当作完整备份。 ### 档案生命周期 档案生命周期描述实体档案从建档、上架、借阅、归还到异常处理和最终销毁的完整状态流转。 ```text 建档 / 导入 ↓ 待上架 ↓ 在库 ├─ 借阅审批中 │ ↓ │ 借阅待取 │ ↓ │ 借阅中 │ ↓ │ 归还待上架 │ ↓ │ 在库 ├─ 盘点异常 │ ├─ 不在库 │ └─ 遗失 ├─ 删除 / 回收站 └─ 已销毁 ``` | 状态 / 场景 | 产品说明 | | --- | --- | | 待上架 | 档案已经建档或导入,但还没有落到明确库位 | | 在库 | 档案已经绑定库位,处于可借阅、可盘点状态 | | 借阅审批中 | 借阅申请已提交,等待审批 | | 借阅待取 | 审批通过但档案还未被取走 | | 借阅中 | 档案已经借出 | | 归还待上架 | 档案已归还,但还未重新绑定或确认库位 | | 借阅超期 | 借阅超过期限,需要提醒或处理 | | 不在库 | 盘点或现场识别发现档案不在预期位置 | | 遗失 | 经业务确认后的遗失状态 | | 删除 / 回收站 | 软删除状态,可恢复 | | 已出库 | 通过出库操作移出当前库内管理,可在“已出库档案”中找回 | | 已销毁 | 业务上已销毁或停止使用,不再作为正常档案流转 | 当前前端列表常用状态筛选集中在 `待上架`、`在库`、`借阅`、`归还上架`。`借阅审批`、`待取档案`、`在借档案`、`超期档案`更多体现为维护页队列和审批关系,不应简单等同于档案主表的单一状态。回转柜还会额外使用 `未在库`、`借阅未取`、`归还待上架` 等合成展示状态,具体口径见“回转柜档案状态”。 回转柜盘点会影响状态展示。例如回转柜盘点结果为“正常 / 盘盈”时,可以展示为“在位”;否则展示为“不在位”。回转柜盘点结果不应直接替代业务审批流程,但会提示后续处理动作。 ### 借阅与归还 借阅能力由审批流程承载,档案和装具都可能参与借阅。 | 阶段 | 产品说明 | | --- | --- | | 申请 | 用户选择档案、装具或电子档案发起借阅 | | 审批 | 审批人确认是否允许借阅 | | 待取 | 审批通过,等待现场取档 | | 借阅中 | 档案已从库位取走,进入借阅周期 | | 归还 | 借阅完成后归还档案 | | 归还待上架 | 归还后还需要重新确认库位 | | 超期 | 超过借阅期限,进入提醒或处理 | 前端真实流程里,借阅从“借阅车”开始,审批通过后进入待取,现场取档后进入在借,归还后再进入归还上架。 | 操作入口 | 接口口径 | 说明 | | --- | --- | --- | | 借阅车 | `/borrow/list`、`/borrow/add`、`/borrow/delete`、`/borrow/deletes` | 临时收集要借阅的档案、装具或电子档案 | | 创建借阅 | `/borrow/create` | 提交用途、原因、期限、审批人和借阅对象 | | 审批列表 / 详情 | `/approval/list`、`/approval/info` | 查看审批单及其中的档案、装具对象 | | 同意 / 拒绝 | `/approval/agree`、`/approval/reject` | 审批人处理申请 | | 开始取档 | `/approval/start` | 审批通过后进入现场取档阶段 | | 归还 | `/approval/return` | 借阅完成后登记归还 | | 归还上架 | `/approval/getArchiveList`、`/approval/getBoxList`、`/approval/returnShelf` | 对已归还对象重新确认库位 | 借阅状态和回转柜盘点结果会互相影响展示。例如“借阅待取”但回转柜盘点仍在位,可以理解为审批通过但现场未取;“借阅中”但回转柜盘点仍在位,则需要业务处理确认。 ### 维护页面口径 档案维护页本质是一组待办和异常队列,和概览页的对象清单互相补充。 | 维护入口 | 产品口径 | 关键动作 | | --- | --- | --- | | 新档上架 | 创建时选择“暂不分配位置”的档案和装具 | 计算可用容量、选择明确位置、完成上架 | | 档案回收站 | 软删除后的档案和装具 | 恢复、销毁、导出 | | 遗失档案 | 借阅或盘点后确认遗失的对象 | 找回、彻底遗失、导出 | | 已出库档案 | 出库后的档案和装具 | 找回到原位置或进入新档上架 | | 待取档案 | 审批通过但尚未取走的对象 | 查看审批、开始取档或后续流转 | | 在借档案 | 已借出对象 | 查看审批、全部归还上架、标记存在遗失 | | 超期档案 | 借阅超过期限的对象 | 提醒处理、归还上架、标记遗失 | | 归还上架 | 已归还但未重新上架的对象 | 选择上架模式、确认位置、完成归还上架 | | 借阅用户 | 借阅人和审批相关账号 | 新增、编辑、启停、修改密码 | ### 回转柜盘点 这里的盘点特指回转柜盘点,用于校验系统记录和回转柜内实物是否一致。当前支持定时、手动、自动等盘点类型,结果包含正常、盘盈、盘亏、异常、设备忙、设备离线。 | 回转柜盘点结果 | 产品说明 | | --- | --- | | 正常 | 系统记录和现场识别一致 | | 盘盈 | 现场识别到系统预期外或位置外的档案 | | 盘亏 | 系统记录应在库,但现场未识别到 | | 异常 | 盘点过程出现业务或数据异常 | | 设备忙 | 回转柜设备暂时无法执行盘点 | | 设备离线 | 设备不可用或通信失败 | 回转柜盘点结果需要给出处理动作,例如更改档案状态为未在库、档案上架至位置、档案转移至位置、借阅未取、已借阅取走、已归还上架、新建未知档案等。处理动作应由业务人员确认后执行,避免设备误读直接改变档案业务状态。 ## 档案装具 档案装具用于承载和组织实体档案。它既有自己的基础信息和状态,也能绑定位置、参与借阅和盘点。 | 装具类型 | 说明 | | --- | --- | | 档案盒 | 最常见的档案载体,可包含多份档案 | | 档案袋 | 适合零散或特定材料归集 | | 档案夹 | 适合临时或轻量归档 | | 档案箱 | 适合批量存放 | | 档案架 | 可作为普通实体架具记录 | | 防磁柜 | 适合特殊载体或安全要求更高的材料 | | 光盘 / 磁带 | 用于电子介质归档 | | 能力 | 说明 | | --- | --- | | 基础信息 | 装具名称、编号、类型、状态、密级、有效期 | | 自定义字段 | 承接不同项目对装具的额外著录要求 | | 装具内档案 | 一个装具可包含多份档案 | | 所在库位 | 装具可以落到库区、密集架或其他库位中 | | 借阅 / 归还 | 装具可参与借阅、归还和待上架流程 | | 盘点 / 异常处理 | 装具可参与盘点、异常定位和差异处理 | ### 组卷与拆卷 组卷和拆卷在系统里更适合理解为“档案与装具关系的建立、重建和销毁”,而不是重新发明一个卷宗对象。当前前端的拆卷口径比较强:拆卷时会销毁档案装具,并要求给拆出的档案重新指定位置或待上架范围。 | 操作 | 产品含义 | 系统变化 | | --- | --- | --- | | 组卷到新装具 | 把若干份档案归入新建档案盒、档案袋或档案夹 | 先创建装具,再调用 `/archive/archiveRoll` 建立档案与新装具关系 | | 组卷到已有装具 | 把若干份档案归入已有档案装具 | 直接调用 `/archive/archiveRoll`,档案原先在其他装具中时会移入目标装具 | | 拆卷 | 将一个装具拆开,拆出的档案重新选择位置、库房位置和分类 | 调用 `/box/unRoll`;前端提示会销毁档案装具,并记录拆卷原因 | | 位置转移 | 档案或装具从一个库位转移到另一个库位 | 调用档案或装具批量转移接口,分类不应变化 | | 整盒上架 | 装具整体绑定到库位 | 装具内档案继承或关联该装具位置,现场按盒取放 | | 整盒借阅 | 借阅对象选择装具 | 装具和装具内档案都需要进入可追踪的借阅状态 | 组卷时要先确认档案分类和基础著录已经稳定,再把档案放入装具。前端组卷弹窗会提示:如果所选档案在现有装具中,组卷完成后档案将移入新的装具。拆卷时必须保留操作记录,尤其是借阅中、归还待上架、盘点异常的档案,不能只删除装具关系后就认为业务完成。 上架时既可能直接上架档案,也可能先把档案归入装具,再把装具放到密集架或其他库位中。回转柜当前更适合按档案直接落格口理解,不建议默认把装具逻辑套到回转柜上。 ## 打印 打印在档案管理中主要服务于“实物标识”和“业务单据”。产品上要先明确打印对象、模板字段和触发场景,具体打印服务、本地驱动、RFID 打印机协议等实现细节放到系统架构或设备文档中维护。 ### 打印对象 | 对象 | 产品说明 | | --- | --- | | 档案标签 | 给单份档案生成纸质标签、条码、二维码或 RFID 标签内容,用于粘贴、识别和盘点 | | 档案装具标签 | 给档案盒、档案袋、档案箱等装具生成标签,便于装具上架、借阅和盘点 | | 借阅单 | 借阅审批通过后输出取档、借出、归还或签收单据 | | 移交 / 上架单 | 批量建档、移交、上架、归档时输出操作清单 | | 盘点单 | 盘点任务执行前后输出盘点范围、结果差异和处理记录 | | 查询结果 | 按查询条件导出或打印档案列表,适合现场核对和人工流转 | ### 触发场景 | 场景 | 说明 | | --- | --- | | 建档后打印 | 档案建档或导入后打印档案标签 | | 装具生成后打印 | 新建档案盒、档案袋或档案箱后打印装具标签 | | 上架前打印 | 上架前打印位置、编号、装具和档案清单,便于现场核对 | | 借阅审批后打印 | 审批通过后打印借阅单、取档单或签收单 | | 归还处理时打印 | 归还后打印归还确认单或重新上架清单 | | 盘点前后打印 | 盘点前打印盘点范围,盘点后打印差异和处理结果 | ### 模板和字段 打印模板应围绕业务对象维护,不建议在代码里写死版式。不同项目可以有不同模板,但字段含义要稳定。 | 模板字段 | 说明 | | --- | --- | | 基础字段 | 档案编号、档案名称、分类、年度、密级、保管期限 | | 位置字段 | 库房、库区、架体、列、侧、节、层、格或回转柜格口 | | 装具字段 | 装具编号、装具名称、装具类型、装具内档案数量 | | 借阅字段 | 借阅人、部门、审批人、借阅时间、归还期限、用途 | | 标识字段 | 条码、二维码、RFID 编码、系统唯一编号 | | 项目字段 | 通过自定义字段补充项目特定著录项 | ### 服务演进和仓库 档案管理里的打印能力不是单个接口。它经历过普通标签 / 单据打印、本地打印服务增强,再到 RFID 标签打印的演进。写业务文档时建议按“业务对象”和“本地服务形态”分开描述。 | 阶段 | GitLab 仓库 | 当前定位 | 主要说明 | | --- | --- | --- | --- | | 老打印服务 | [`fit-archive/electron-hiprint`](https://gitlab.singzer.cn/fit-archive/electron-hiprint) | 普通打印和早期标签打印服务 | 基于 Electron 和 `vue-plugin-hiprint`,面向本机打印机列表、静默打印、PDF / HTML 打印等基础能力;历史接口以 Socket.IO `news` 等事件为主 | | 新打印服务 | [`fit-archive/rfid/rfid-printer-node`](https://gitlab.singzer.cn/fit-archive/rfid/rfid-printer-node) | 当前打印服务演进版本 | 继续兼容普通打印,同时补充服务面板、打印机能力识别、日志、驱动检查、Socket.IO `17521` 端口和 `/api/printer-list` 等能力 | | RFID 打印衍生 | [`fit-archive/rfid/rfid-printer-node`](https://gitlab.singzer.cn/fit-archive/rfid/rfid-printer-node)、[`fit-archive/rfid/fit-archive-ng`](https://gitlab.singzer.cn/fit-archive/rfid/fit-archive-ng)、[`fit-archive/rfid/smart-doc-vault-rfid`](https://gitlab.singzer.cn/fit-archive/rfid/smart-doc-vault-rfid)、[`fit-archive/rfid/rfid-device-go`](https://gitlab.singzer.cn/fit-archive/rfid/rfid-device-go) | RFID 标签打印、读写和现场识别链路 | 前端选择 RFID 打印能力,后端维护档案 / 标签业务关系,本地服务调用 RFID 打印机读 TID、写 EPC 或打印标签;设备服务负责 RFID 读写器和现场设备侧能力 | 普通打印和 RFID 打印不要混成同一种能力。普通打印解决“把单据或标签版式打出来”,RFID 打印还要处理标签芯片识别、TID / EPC、厂商 SDK、驱动、耗材状态和现场读写验证。 ### 产品边界 * 档案管理负责决定“打印什么、什么时候打印、模板使用哪些业务字段”。 * 老打印服务、新打印服务和 RFID 打印服务都属于实现形态;档案管理页只维护业务对象、触发场景和字段口径。 * RFID 标签写入、RFID 打印机、TID / EPC 和标签协议归入 RFID 或设备接入文档。 * 普通打印机驱动、本地打印服务、`electron-hiprint`、`rfid-printer-node`、部署端口等实现放到系统架构或本地服务文档。 * 导出 Excel / PDF 和打印可以共用字段口径,但不要把导出能力直接等同于打印能力。 ## 研发参考 结合当前智档宝代码结构,档案管理的核心模型不是单表档案,而是一组围绕“库区 + 档案 + 装具 + 状态 + 审批 + 盘点”的模型。 | 产品对象 | 代码模型 / 模块 | 产品含义 | | --- | --- | --- | | 档案 | `ArchiveModel` / `sys_archive` | 档案主数据,包含编号、名称、状态、密级、有效期、位置、RFID、扩展字段和电子档案挂接 | | 档案装具 | `BoxModel` / `sys_box` | 档案盒、袋、夹、箱等实体载体,可绑定多个档案 | | 库房位置 | `LocationModel` | 库房位置树,承载库房、楼层、房间等位置路径 | | 库区 | `AreaModel` | 库房下的业务区域,区分智能密集架、回转柜等库区类型 | | 架体 / 柜体 | `ShelfModel` / `sys_shelf` | 密集架列、固定列、移动列、回转柜柜体等实体架具 | | 借阅审批 | `ApprovalModel` / `ApprovalConnectModel` | 借阅、待取、归还、超期、驳回、取消等流程状态 | | 盘点任务 | `InventoryModel` | 手动、定时、自动盘点任务 | | 回转柜盘点结果 | `InventoryResultModel` | 正常、盘盈、盘亏、异常、设备忙、设备离线等回转柜盘点明细 | 前端主要入口集中在 `fit-archive-ng/src/views/ArchivesManagement`,接口层集中在 `fit-archive-ng/src/api/ArchivesManagement`、`ApiBorrowManagement`、`ApiSystemManagement/apiArchivesSort`、`ApiReservoirManagement` 等目录。后端路由侧主要在 `smart-doc-vault/router/system/archive.go`、`box.go`、`borrow.go`、`approval.go`、`shelf.go`、`location.go`、`mjj.go`、`hzg.go`。 | 前端模块 | 主要接口 | 说明 | | --- | --- | --- | | `overview/File` | `/archive/getArchiveList`、`/archive/addArchive`、`/archive/editArchive`、`/archive/archiveRoll`、`/archive/batchTransferArchive`、`/archive/exportArchiveList` | 档案概览、新建、编辑、组卷、转移、导出和暂存 | | `overview/FileBox` | `/box/getBoxList`、`/box/addBox`、`/box/editBox`、`/box/unRoll`、`/box/batchTransferBox`、`/box/exportBoxList` | 档案装具概览、新建、编辑、拆卷、转移、导出和暂存 | | `maintain/PutOnShelves` | `/maintain/putOnShelves/getArchiveList`、`/archive/newArchiveShelf`、`/maintain/putOnShelves/getBoxList`、`/box/newBoxShelf` | 新档上架,分档案和装具 | | `maintain/RecycleBin` | `/maintain/deleteArchiveList`、`/archive/recoverArchive`、`/archive/batchDestroyArchive`、`/maintain/deleteBoxList`、`/box/recoverBox`、`/box/batchDestroyBox` | 回收站恢复和销毁 | | `ApiBorrowManagement` | `/borrow/create`、`/approval/list`、`/approval/info`、`/approval/agree`、`/approval/reject`、`/approval/start`、`/approval/return`、`/approval/returnShelf` | 借阅申请、审批、取档、归还和归还上架 | | `ApiSystemManagement/apiArchivesSort` | `/dir/getDirs`、`/dir/getDirChildren`、`/dir/addDir`、`/dir/editDir`、`/dir/deleteDir`、`/dir/batchSort` | 档案分类目录树 | ### 关联仓库 | 仓库 / 目录 | 视角 | 说明 | | --- | --- | --- | | `fit-archive/fdmjj` | 密集架主线 | 飞度密集架相关前后端、设备联动和项目交付能力索引 | | `fit-archive/hzg` | 回转柜主线 | 回转柜相关业务、库位映射和现场控制能力索引 | | `fit-archive/A` | 项目版本线 | 架具能力在项目版本中的定制入口 | | `fit-archive/B` | 项目版本线 | 架具能力在项目版本中的定制入口 | | `fit-archive-ng` | 当前前端业务系统 | 档案总览、维护、上架、借阅审批、设备管理等页面入口 | | `smart-doc-vault` | 后端主服务 | 档案、装具、审批、盘点、库房、架体、密集架、回转柜等 API 和业务服务 | | `fit-denserack*` | 密集架终端 / 控制 | 密集架本地终端、开架接口、硬件控制和项目更新能力 | ## 产品边界 * 档案管理关注库区、档案、装具、生命周期、借阅、盘点和权限。 * 自定义字段只承接项目著录差异,不替代生命周期、库位、借阅审批等核心字段。 * 文件上传、文件解析、文件预览和全文搜索归入数字化。 * RFID 标签识别、门口机、手持机、盘点车归入 RFID。 * 温湿度、空调、除湿、漏水、摄像头、门禁等现场环境能力归入环境控制。 * 密集架 / 回转柜在档案管理中只描述架具、库位、状态和业务联动。 * 设备协议、服务进程、TCP / UDP / MQTT、数据库、对象存储等实现细节放到系统架构或设备接入文档。 --- --- url: /wiki/sdv/environment.md --- # 环境控制 环境控制是智档宝面向库房环境和现场安全的能力板块,关注环境数据采集、设备控制、异常告警和现场联动。 ![智档宝环境控制](/illustrations/sdv-environment-control-xiaohei.png) ## 设备草稿 下面这张是讲解现场设备、网络、网关和调试入口时使用的 Excalidraw 草稿,用于辅助理解环境控制设备接入,不作为最终架构定稿。 ## 业务定位 环境控制回答“库房现场是否安全、环境是否正常、设备是否可控”的问题。它服务于档案保管环境,也服务于现场运维和大屏展示。 ## 设备类型 环境控制设备先按设备类型组织,再在每个类型下面看具体型号、主子设备关系和业务能力。这样比直接按“温湿度、漏水、空调”罗列更接近现场调试和后端实现。 | 设备类型 | 说明 | 典型设备 | | --- | --- | --- | | POE 设备 | 飞度自研或适配的 POE / MQTT 设备,是当前环境控制主线 | 网关 Lite、中枢网关、空气质量传感器、温湿度传感器、漏水报警、短信报警、16DI、8DO、加湿除湿一体机 | | 其他设备 | 不走 POE 设备模型,但属于库房现场安防和视频能力 | 推流盒子、摄像头、门禁、海康 ISAPI / 网关、监控平台 | | 虚拟设备 | 不一定有独立硬件,更多是平台内聚合、映射或软件状态 | 大屏卡片、智能面板展示项、软件模拟设备、状态聚合设备 | | 无线设备 | 通过无线网络或 LoRaWAN 平台进入系统,后端以 `chirpstack` 源类型区分 | ChirpStack 设备、无线温湿度、无线采集节点 | ### POE 设备 POE 设备是当前环境控制的主线设备模型。这里的“POE”不只是供电方式,也代表一套现场接入方式:设备接入局域网,平台先通过 UDP 做发现和网络配置,再通过 MQTT 做运行期数据上报、状态同步和控制下发。 #### UDP UDP 是 POE 设备的现场发现和初始化配置通道。设备刚上电、还没有接入平台时,实施人员先通过 UDP 在局域网里找到设备,再把设备改到正确的网络和 MQTT 配置。 | 能力 | 说明 | | --- | --- | | 发现设备 | 扫描局域网里的 POE 设备,拿到 SN、IP、MAC、设备型号、固件版本等基础信息 | | 设置 IP | 把设备设置为静态 IP 或指定网络参数,避免现场重启后地址漂移 | | 设置 MQTT | 把 MQTT 服务器地址、端口等连接参数写入设备 | | 重启 / 重置 | 远程重启设备,或在配置错误时重置设备 | | 端口 | 方向 / 场景 | 说明 | | --- | --- | --- | | `10086/udp` | 平台广播 / 发现 / 配置 | 当前 `fdmjj` 后端 `UdpBoardCast` 使用的主线端口,后端 Dockerfile 也暴露这个 UDP 端口 | | `1234/udp` | 历史发现 / 模拟工具 / 软网关兼容 | `virtual-device-builder`、`soft-gateway` 等历史或模拟工具仍会向 `255.255.255.255:1234` 广播设备状态,后端 Dockerfile 也保留暴露 | | `1883/tcp` | MQTT 连接结果 | 不是 UDP 端口;UDP 的 `Set_Mqtt` 会把设备指向这个 MQTT broker 端口 | 现场排查时不要只看其中一个 UDP 端口。当前主线配置优先看 `10086/udp`,但历史虚拟设备、软网关和部分调试工具可能还在发 `1234/udp`;防火墙、容器端口映射、交换机 VLAN 和广播隔离要一起确认。 | UDP 命令 | 方向 | 用途 | | --- | --- | --- | | `Device_Status_BoardCast` | 设备 -> 平台 | 设备主动广播自己的 SN、IP、MAC、固件、MQTT 状态和基础信息,用于设备列表和在线发现 | | `DISCOVERY` | 设备 -> 平台 | 设备请求平台下发 MQTT 地址;平台侧需要打开设备发现开关才会响应 | | `Set_Mqtt` | 平台 -> 设备 | 下发 MQTT broker 地址和端口,让设备进入运行期 MQTT 通道 | | `IP_MODE_SET` | 平台 -> 设备 | 设置静态 IP、网关、掩码、DNS 或网络模式 | | `REBOOT` | 平台 -> 设备 | 重启设备 | | `RESET` | 平台 -> 设备 | 重置设备配置 | 设备状态广播示例,常见于 `Device_Status_BoardCast`: ```json { "device_info": { "device_type": "FEIDU_POE_GATEWAY_LITE", "HW_version": "1.0", "FW_version": "1.4.0", "role": "NONE", "read_time_interval": 5000, "compile_time": 1714576349, "device_sn": "e465b86741fb", "ip": "192.168.0.52", "mac": "E4:65:B8:67:41:FB", "gateway": "192.168.0.1", "dns": "169.254.0.1", "subnet": "255.255.255.0", "NetWork_Mode": "STATIC", "mqtt_server_host": "192.168.0.2", "mqtt_server_port": 1883, "clientID": "esp32-e465b86741fb", "mqtt_status": true, "mqtt_config_st": "true", "device_ota_status": "false", "register_status": "false", "deviceOnDI1": "none", "deviceOnDI2": "none", "deviceOnDI3": "none", "deviceOnDI4": "none" }, "command": "Device_Status_BoardCast", "task_id": -1, "param": { "message": "Device_Status_BoardCast" } } ``` 设备主动发现示例: ```json { "device_info": { "device_sn": "e465b86741fb" }, "command": "DISCOVERY", "task_id": 1, "param": {} } ``` 平台回发 MQTT 配置示例: ```json { "device_sn": "e465b86741fb", "command": "Set_Mqtt", "task_id": 1, "mqtt_server_host": "192.168.0.2", "mqtt_server_port": "1883" } ``` 平台下发网络配置示例: ```json { "device_sn": "e465b86741fb", "command": "IP_MODE_SET", "task_id": 1710000000000, "param": { "NetWork_Mode": "STATIC", "ip": "192.168.0.52", "gateway": "192.168.0.1", "subnet": "255.255.255.0", "dns": "192.168.0.1" } } ``` 平台重启 / 重置设备示例: ```json { "device_sn": "e465b86741fb", "command": "REBOOT", "task_id": 123 } ``` ```json { "device_sn": "e465b86741fb", "command": "RESET", "task_id": 123 } ``` UDP 解决的是“设备在哪里、怎么让它连上平台”。如果 UDP 扫不到设备,优先检查供电、网线、交换机 VLAN、电脑和设备是否在同一网段,以及现场防火墙是否拦截广播。 #### MQTT MQTT 是 POE 设备运行期的主通道。设备完成 UDP 初始化后,会连接到平台配置的 MQTT 服务,后端再根据设备消息创建、更新和控制设备。 参考资料:[POE 设备 MQTT 协议说明](https://www.yuque.com/u278353/kb/cctwwabm0lm313sh?singleDoc#)。 当前 `fdmjj` 后端订阅的是固定 topic,不是按设备 SN 分 topic。旧代码注释里出现过 `/sn/control`、`/sn/information`、`/sn/warning` 这种方向,但当前主线按 `information`、`warning`、`control` 三个 topic 维护。 | Topic | 方向 | 用途 | 后端入口 | | --- | --- | --- | --- | | `information` | 设备 / 虚拟设备 -> 后端 | 常规状态、传感器数据、控制回包、心跳类数据 | `MqttInfoMessageHandler` | | `warning` | 设备 / 虚拟设备 -> 后端 | 突发事件、DI 变化、报警触发类数据 | `MqttWarningMessageHandler` | | `control` | 后端 -> 设备 / 虚拟设备 | 控制命令、读取命令、继电器控制、空调控制、设置命令 | `SendCommand` 发布 | | 消息对象 | 说明 | | --- | --- | | `device_info` | 设备基础信息,包含 `device_type`、SN、IP、MAC、固件版本、MQTT 状态等 | | `command` | 设备上报或控制命令,例如传感器读取、继电器状态、空调控制、漏水状态等 | | `param` | 命令参数和业务数据,例如温湿度、空气质量、串口号、地址、DI/DO 状态等 | | `device_type` | 后端识别设备处理分支的关键字段,例如 `FEIDU_POE_GATEWAY_LITE` | | `task_id` | `-1` 表示普通上报;非负数通常表示控制请求 / 回包,用于后端等待响应 | | `device_sn` | 控制下发时放在顶层;设备上报时以 `device_info.device_sn` 为准 | 后端按 `device_type` 分流处理 MQTT 消息。主设备消息会更新自己的在线和状态;网关类设备还会根据串口、地址、DI/DO 通道,把数据同步到子设备。 设备状态上报示例,发布到 `information`: ```json { "device_info": { "device_type": "FEIDU_POE_AIR_SENSOR", "HW_version": "0.3", "FW_version": "1.2.3", "role": "NONE", "read_time_interval": 5000, "compile_time": 1714455742, "device_sn": "a0b765fa0c77", "ip": "192.168.0.55", "mac": "A0:B7:65:FA:0C:77", "gateway": "192.168.0.1", "dns": "169.254.0.1", "subnet": "255.255.255.0", "NetWork_Mode": "STATIC", "mqtt_server_host": "192.168.0.2", "mqtt_server_port": 1883, "clientID": "esp32-a0b765fa0c77", "mqtt_status": true, "mqtt_config_st": "true", "register_status": "false" }, "command": "get_sensor", "task_id": -1, "param": { "temp": 19.48, "humidity": 31.65, "tvoc": 216, "eco2": 534, "pm10": 31, "pm25": 46, "pm100": 58, "ch2o": 0.052 } } ``` 网关子设备上报示例,发布到 `information`。后端会按 `device_info.device_sn + serial + address` 形成子设备 SN,例如 `e465b86741fb_Serial1_3`: ```json { "device_info": { "device_type": "FEIDU_POE_GATEWAY_LITE", "device_sn": "e465b86741fb", "clientID": "esp32-e465b86741fb", "mqtt_status": true, "mqtt_config_st": "true" }, "command": "get_device_temp_hum", "task_id": -1, "param": { "serial": "Serial1", "address": 3, "temperature": 22.6, "humidity": 53.1, "message": "success" } } ``` DI 变化示例,发布到 `warning`。后端只处理 `DIstatusN = Changed` 的通道,并把对应子设备状态同步到 Redis 和报警逻辑: ```json { "device_info": { "device_type": "FEIDU_POE_16DI_CONTROL", "device_sn": "d8132a2f7a1b" }, "command": "IO_change", "task_id": -1, "param": { "DI1": 1, "DIstatus1": "Changed", "DI2": 0, "DIstatus2": "Unchanged" } } ``` 后端控制示例,发布到 `control`。设备或虚拟设备需要订阅 `control`,按顶层 `device_sn` 判断是否是自己的命令;如果 `device_sn = "#"`,表示广播命令: ```json { "command": "relay_control", "task_id": 123, "device_sn": "08f9e08bd9f3", "relay_states": [ { "relay_index": 1, "activate": true, "connection_type": "normally_open" } ], "param": {} } ``` 控制类命令如果需要同步等待结果,设备应在 `information` 回一条相同 `task_id` 的消息。后端会把回包放进内存消息中心的 `task_`;空调学习是例外,使用 `air_conditioner_learn_` 等待。 | 常见 `device_type` | 常见 `command` | 处理逻辑 | | --- | --- | --- | | `FEIDU_POE_AIR_SENSOR` | `get_sensor` | 直接更新空气质量传感器状态 | | `FEIDU_POE_GATEWAY_LITE` | `get_io_status` | 更新网关状态,并同步 DI 子设备 | | `FEIDU_POE_GATEWAY_LITE` | `relay_status_read` | 按 `relay_states` 创建 / 更新 DO 子设备 | | `FEIDU_POE_GATEWAY_LITE` | `get_device_temp_hum`、`get_air_quality` | 按 `serial` + `address` 更新网关串口子设备 | | `FEIDU_POE_GATEWAY_LITE` | `custom_*` | 自定义第三方设备数据,直接同步到 `网关SN_serial_address` | | `FEIDU_POE_16DI_CONTROL` | `get_io_status`、`IO_change` | 16DI 主设备状态和 DI 子通道状态 | | `FEIDU_POE_8DO_CONTROLLER` | `relay_status_read` | 8DO 主设备状态和继电器子通道状态 | | `FEIDU_POE_DEHUMIDIFIER` | `DEVICE_STATUS_PUBLISH` | 独立 POE 加湿除湿一体机状态 | #### 在线方式 POE 设备在线不是只看页面上有没有设备,而是看设备是否能持续完成“网络连接 -> MQTT 连接 -> 状态上报 -> 后端更新时间”这条链路。 | 判断层 | 说明 | | --- | --- | | UDP 可发现 | 说明设备在局域网里可见,但不等于已经接入业务系统 | | MQTT 已连接 | 说明设备已经连上 MQTT 服务,是进入业务系统的前提 | | 最近有上报 | 后端根据最新 MQTT 消息刷新 `LastUpdateTime`、缓存和设备状态 | | 主子设备关系正常 | 数据库里主设备 `isMain = true`,子设备通过 `pid` 挂到主设备下 | | 来源类型正确 | POE 主线设备默认属于 `sourceType = fit`,区别于无线设备的 `sourceType = chirpstack` | 典型链路是:设备上电入网后,实施先用 UDP 扫描到设备,配置设备 IP 和 MQTT 服务器;设备连接 MQTT 后上报 `device_info`、`command`、`param`;后端按 `device_type` 创建或更新主设备,再按串口、地址、DI/DO 通道派生子设备。 现场排查时可以按这个顺序判断:先看 UDP 能不能发现设备;再看设备是否配置到正确的 MQTT 地址;再看 MQTT 是否在线并上报;最后看数据库里主设备 `isMain`、子设备 `pid`、SN 命名和通道绑定是否正确。 #### 设备类型 POE 设备内部再按设备层级理解:主设备直接入网,子设备挂在主设备下面;部分独立传感器虽然不管理子设备,但仍作为 POE 主设备接入。 | 层级 | 说明 | 典型设备 / 能力 | | --- | --- | --- | | 主设备 | 直接入网,有独立 SN,平台把它作为设备树的根节点或独立节点 | 网关 Lite、中枢网关、16DI、8DO、空气质量传感器、短信报警模块、POE 加湿除湿一体机、漏水报警模块 | | 网关串口子设备 | 挂在网关串口下,通常按“父设备 SN + 串口 + 地址”形成子设备 SN | 空调控制器、新风净化一体机、加湿除湿一体机、紫外线传感器、除霉机、新风机、窗帘、驱鼠器、健康防护一体机 | | DI 输入子设备 | 挂在网关或 16DI 下,采集开关量、报警输入或传感器触发状态 | 人体传感器、烟雾传感器、消防主机、温感传感器、漏水报警监测点、未连接通道 | | DO 输出子设备 | 挂在网关或 8DO 下,用于继电器输出、声光报警或设备联动 | 声光报警器、继电器输出、8DO 子设备 | | 展示 / 操作子设备 | 以设备身份进入页面或大屏,但更多承担展示、入口或现场操作能力 | 智能面板、大屏可视设备图标 | #### POE 主设备列表 | 设备型号 | 中文名称 | 主要职责 | 备注 | | --- | --- | --- | --- | | `FEIDU_POE_GATEWAY_LITE` | 网关 Lite | 通过 MQTT 接入平台,管理 DI 通道、DO 输出和串口子设备 | 常见现场主网关;创建后会自动生成 DI 子通道 | | `FEIDU_POE_CENTER_CONTROL` | 中枢网关 | 汇总或控制一组环境设备,处理传感器和漏水等状态 | 更偏集中控制入口 | | `FEIDU_POE_16DI_CONTROL` | 16 路采集 | 采集多路开关量输入 | 常用于人体、烟感、消防、温感等输入 | | `FEIDU_POE_8DO_CONTROLLER` | 8 路控制 | 控制多路继电器输出 | 常用于声光报警、联动输出 | | `FEIDU_POE_AIR_SENSOR` | 空气质量传感器 | 上报温湿度、PM、TVOC、CO2、甲醛等空气质量数据 | 直接 MQTT 上报,更新频率较高 | | `FEIDU_POE_DEHUMIDIFIER` | POE 加湿除湿一体机 | 上报和控制加湿、除湿、漏水等状态 | 作为独立主设备接入 | | `FEIDU_POE_SMS_SENDER` | 短信报警模块 | 上报在线和时间状态,配合报警通知 | 常用于现场短信告警 | | `FEIDU_POE_VOICE_ALARM_WATER_LEAK_SENSOR` | 漏水报警模块 | 上报漏水状态和监测点状态 | 可以派生漏水报警监测点 | #### 网关子设备列表 | 子设备类型 | 代码 / 显示名 | 接入逻辑 | 典型用途 | | --- | --- | --- | --- | | 空调控制器 | `空调控制器` | 挂在网关串口,按串口和地址轮询状态、下发控制 | 空调学习、空调控制、环境联动 | | 新风净化一体机 | `新风净化一体机` | 挂在网关串口,读取和控制净化设备 | 空气质量联动 | | 加湿除湿一体机 | `加湿除湿一体机` | 可作为网关串口子设备,也可能有独立 POE 型号 | 湿度控制、恒温恒湿 | | 紫外线传感器 | `紫外线传感器` | 挂在网关串口,上报紫外线状态 | 特殊环境监测 | | 除霉机 | `除霉机` | 挂在网关串口,读取和控制除霉设备 | 库房环境治理 | | 新风机 | `新风机` | 挂在网关串口,读取和控制新风设备 | 通风联动 | | 智能窗帘 | `智能窗帘` | 挂在网关串口,执行窗帘控制 | 光照或现场联动 | | 网关串口漏水报警 | `网关-串口-漏水报警` | 挂在网关串口,上报漏水状态 | 漏水报警和联动 | | 网关空气质量传感器 | `空气质量传感器` | 挂在网关串口,上报空气质量数据 | 温湿度、PM、TVOC、CO2 等 | | 驱鼠器 | `驱鼠器` | 挂在网关串口,读取或控制设备状态 | 安防和库房防护 | | 健康防护一体机 | `健康防护一体机` | 挂在网关串口,读取和控制设备 | 综合环境治理 | | 温湿度传感器 | `温湿度传感器` | 挂在网关串口,上报温湿度 | 环境曲线和报警 | | 智能面板 | `智能面板` | 挂在网关下面,作为现场展示和操作入口 | 大屏、面板、库房现场查看 | #### DI / DO 通道设备 | 类型 | 设备 / 通道 | 逻辑 | | --- | --- | --- | | DI 输入 | 人体传感器、烟雾传感器、消防主机、温感传感器 | 后端把输入通道作为子设备管理,通道状态变化进入报警或联动逻辑。 | | 漏水监测点 | `漏水报警监测点` | 漏水模块或网关串口漏水设备可以拆出监测点,用于区分具体漏水位置。 | | DO 输出 | 声光报警器、继电器输出、8DO 子设备 | 输出通道用于报警联动、手动控制或自动控制策略。 | | 未连接 | `未连接` | 网关 DI 通道默认可能先建成未连接,用于保留通道位置;现场绑定后再变成具体传感器。 | ### 其他设备 其他设备通常走独立接口或厂商协议,不一定进入 POE 的主子设备树,但产品上仍属于环境控制现场能力。当前按监控和门禁两条线维护。 #### 监控 监控能力围绕摄像头接入、通道配置和视频预览。当前推流盒子对接的是讯思维(`xsw`),后端通过 `smart-doc-vault/xsw` 访问推流盒子。这里用的是逆向网页接口,不是按厂商正式对接文档接入;维护时应以现有页面接口、登录态和返回结构为准。 | 能力 | 当前口径 | | --- | --- | | 推流盒子 | 当前对接讯思维(`xsw`),作为监控推流服务器管理 | | 摄像头通道 | 在推流盒子下维护通道、RTSP 地址、用户名、密码和所属位置 | | 流状态 | 通过逆向网页接口读取讯思维设备信息、通道配置、推流状态和带宽信息 | | 预览地址 | 后端按推流盒子 IP 和通道拼出 FLV、WebSocket FLV、RTMP、HLS、HTTP-TS、RTSP 等地址;前端当前优先播放 `wsFlv` | | 页面入口 | 设备管理 / 监控、库房监控大屏卡片、3D 库房或设备点位预览 | 当前前端监控预览不是普通 `