# EAM 资产管理系统
**Repository Path**: MerlinRong/EAM
## Basic Information
- **Project Name**: EAM 资产管理系统
- **Description**: 企业拥有大量且种类繁杂的设备资产(如生产设备、车辆、电梯、空调、IT 资产等)。传统管理方式存在台账不清、维护滞后、备件库存不合理、维修成本难以统计等痛点。本项目旨在构建一套全生命周期的 EAM 系统,实现资产数字化、维护预防化、工单流转自动化及决策数据化。
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 0
- **Created**: 2026-10-07
- **Last Updated**: 2026-10-10
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# EAM 资产管理系统
**Enterprise Asset Management — 全生命周期企业资产管理平台**







设备台账 · 预防性维护 · 工单流转 · 扫码巡检 · 备件库存 · 折旧报废 · 统计报表
---
## 📋 目录
- [功能特性](#-功能特性)
- [技术栈](#-技术栈)
- [架构总览](#-架构总览)
- [快速开始](#-快速开始)
- [生产部署](#-生产部署)
- [运行测试](#-运行测试)
- [项目结构](#-项目结构)
- [关键设计决策](#-关键设计决策)
- [Git 提交规范](#-git-提交规范)
- [路线图](#-路线图)
## ✨ 功能特性
### 资产管理
- 🌳 **多级分类树**:物化路径优化子树查询,支持 BOM 父子设备层级
- 🏷️ **属性模板**:按分类自定义扩展属性(JSONB),前端动态表单渲染
- 📱 **二维码体系**:HMAC 签名 + 版本号,防伪造扫码、重置即作废
- 📉 **智能折旧**:直线法 / 双倍余额递减(末两年自动转直线)/ 工作量法
### 维护与工单
- 🔁 **工单状态机**:显式转移表驱动,非法流转 422、角色越权 403
- ⏱️ **SLA 管理**:按设备重要等级自动匹配时限,临期预警、超时升级督办
- 🤖 **PM 自动生成**:Celery Beat 定时扫描,周期幂等去重
- 📍 **扫码巡检**:验签 + 路线校验防假巡检,异常项一键转维修工单
### 备件与报表
- 📦 **库存事务**:行级锁 + before/after 流水快照,杜绝超卖
- 🔔 **安全库存预警**:阈值触发通知,支持自动采购申请
- 📊 **数据看板**:MTBF / MTTR / 故障原因帕累托 / 维修成本多维分析
- 🕵️ **全程审计**:SQLAlchemy 事件监听零侵入记录变更前后值
## 🛠 技术栈
| 层级 | 技术 |
| --- | --- |
| 后端 | FastAPI · SQLAlchemy 2.0 (async) · Alembic · Celery |
| 数据 | PostgreSQL 16 · Redis 7 |
| 前端 | Vue 3 · TypeScript · Element Plus · ECharts · Pinia |
| 部署 | Docker Compose · Nginx |
## 🏗 架构总览
```
┌───────────────┐
用户 ────────▶│ Nginx │
└──────┬────────┘
┌─────────┴─────────┐
▼ ▼
Vue3 SPA (dist) FastAPI × 4 workers
api → services → models
状态机 · 策略模式 · RBAC
│ │
┌───────────────┤ │
▼ ▼ ▼
PostgreSQL 16 Redis 7 Celery Worker/Beat
(业务库) (缓存/锁/MQ) PM生成·SLA升级·月度折旧·库存预警
```
## 🚀 快速开始
### 1. 后端
```bash
git clone https://gitee.com/MerlinRong/EAM.git
cd EAM/backend
python -m venv .venv
.venv\Scripts\pip install -e ".[dev]" # Windows
# Linux/macOS: source .venv/bin/activate && pip install -e ".[dev]"
# 启动中间件(可选,缺省回退 SQLite)
docker compose -f deploy/docker-compose.dev.yml up -d
.venv\Scripts\python -m uvicorn app.main:app --reload
```
> API 文档:http://localhost:8000/docs · 健康检查:`/health`
> 默认管理员 `admin / admin123`(⚠️ 仅 seed 用途,登录后请立即修改)
### 2. 前端
```bash
cd frontend
npm install
npm run dev # http://localhost:5173,/api 自动代理到 :8000
```
## 🐳 生产部署
```bash
# 1. 配置环境变量(修改全部密钥!)
cp deploy/.env.example deploy/.env
# 2. 构建前端
cd frontend && npm run build
# 3. 一键编排
docker compose -f deploy/docker-compose.yml up -d --build
# 4. 首次部署生成数据库
cd backend
alembic revision --autogenerate -m "init"
alembic upgrade head
```
服务清单:`nginx`(80) · `fastapi-app`(×4) · `celery-worker` · `celery-beat` · `postgresql:16` · `redis:7`,全部带健康检查与自动重启。
## ✅ 运行测试
```bash
cd backend
.venv\Scripts\python -m pytest tests/ -q
# 44 passed — 状态机全量转移表 / 折旧三算法边界 / 二维码验签
# 库存防超卖 / PM 幂等 / SLA 时限 / 扫码防伪
```
## 📁 项目结构
```
EAM/
├── backend/
│ ├── app/
│ │ ├── api/v1/ # 路由层(auth/assets/work_orders/inspections/spare_parts/...)
│ │ ├── services/ # 业务层:状态机、库存事务、折旧策略、PM 生成
│ │ ├── models/ # SQLAlchemy 2.0 异步模型
│ │ ├── tasks/ # Celery 任务 + Beat 调度表
│ │ ├── core/ # JWT / RBAC / 配置 / 统一响应
│ │ └── db/ # 会话管理 / 审计监听
│ ├── tests/ # pytest(44 项)
│ └── alembic/ # 数据库迁移
├── frontend/
│ └── src/
│ ├── api/ # axios 封装 + 契约对齐
│ ├── views/ # 看板/台账/工单看板/报表/H5扫码报修
│ ├── stores/ # Pinia(auth RBAC)
│ └── router/ # 路由 + 登录守卫
└── deploy/ # Docker Compose / Nginx / .env.example
```
## 💡 关键设计决策
| 主题 | 方案 | 为什么 |
| --- | --- | --- |
| 工单流转 | 显式状态机转移表 | 全量可测试、可导出文档,新增状态只改表不改逻辑 |
| 扩展属性 | JSONB + 属性模板 | 避免动态加列,GIN 索引可查,服务端 Schema 校验 |
| 二维码 | HMAC 签名 + 版本号 | 防伪造打卡;重置旧码立即失效 |
| 库存扣减 | `SELECT ... FOR UPDATE` + 流水快照 | 并发防超卖,任意流水可独立还原现场 |
| 折旧 | 策略模式注册表 | 新算法零侵入接入(开闭原则) |
| 审计 | SQLAlchemy 事件监听 | 业务代码零侵入,before/after 差异自动采集 |
## 📌 Git 提交规范
Conventional Commits,每次功能改动完成即创建对应 commit:
```
feat(P2): 工单状态机 fix(库存): 并发领用超卖 test(折旧): 双倍余额用例
```
## 🗺 路线图
- [x] P0-P5 核心域开发(资产 / 工单 / 巡检 / 备件 / 折旧 / 报表)
- [ ] 工作流引擎对接(维修/报废审批,当前为内置 `decide` 模拟,需实现 `WorkflowAdapter`)
- [ ] 消息通道扩展(企微/钉钉/邮件/短信,当前落库 inapp)
- [ ] PostgreSQL 并发压测(testcontainers,QPS ≥ 1000)
- [ ] 移动端相机扫码(BarcodeDetector,当前支持手工粘贴/输入码)
---
Made with ❤️ by EAM Team