kangda/doc/requirement.md
2025-05-16 17:22:50 +08:00

364 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 需求:
- 设计一个Python后台服务程序用于自动化采集和处理温度数据
- 通过WebSocket接收外部系统的消息触发
- 支持事件驱动的数据采集和处理流程
# 功能:
- WebSocket服务
- 接收外部系统的消息
- 处理消息并触发相应的数据采集流程
- 支持消息的实时响应
- 数据采集
- 定时向第三方接口发送请求获取返回内容中的图片url
- 根据图片url获取图片并使用OCR技术读取图片中电子显示屏中的数字(温度)信息
- 将处理结果存储到数据库并提供查询接口
- 事件处理
- 支持事件的增删改查
- 支持事件的状态跟踪
- 支持事件的搜索和过滤
# 系统架构:
- 采用分层架构设计
- 数据采集层负责与第三方API交互
- 业务处理层负责数据处理和OCR识别
- 数据持久层:负责数据存储
- API接口层提供对外服务接口
# 技术选型:
- 开发语言Python 3.8+
- Web框架FastAPI
- 数据库MySQL 8.0+
- ORMSQLAlchemy
- OCR引擎PaddleOCR
- 定时任务APScheduler
- HTTP客户端aiohttp
- 图片处理Pillow
- 日志loguru
# 具体第三方接口:
- 获取token和refresh接口
- url:
- http://erpapi.concoai.com/basis-api/user/login
- 传递参数:
- Query参数
- cookie_flag: Optional[str] = None
- device_id: Optional[str] = None
- is_login: Optional[str] = None
- lang: Optional[str] = None
- password: Optional[str] = None
- username: Optional[str] = None
- 响应参数: 重点保存 data中的token和refreshtoken
```json
{
"code": "2000",
"message": "成功",
"total": null,
"data": {
"token": "xxx",
"refreshToken": "xxx",
"isLogin": null,
"username": null,
"password": null,
"rolePath": "/index/staff-page"
},
"rows": null
}
```
- 获取列表页接口
- url:
- http://erpapi.concoai.com/robot/event/page
- 传递参数:
- Header 参数
- token
- refreshToken
- Body 参数
```json
{"pageNo": 1, "pageSize": 10000}
```
- 响应参数: 获取rows中 的eventId ,insDate, insDateShow
```json
{
"code": "2000",
"message": "成功",
"total": 1,
"data": null,
"rows": [
{
"eventId": "a462a29d7481495380cd47035b19edc0",
"tenantInfoId": "4fff5d4bcc4b4239941ff077a0da8958",
"reportEventId": null,
"number": "ROB23100098",
"name": "X32305000019",
"eclassify": "2",
"operationType": "2",
"etype": "E000007",
"etypeName": "日常巡检",
"enTypeName": "Routine patrol",
"hkTypeName": "日常巡檢\r",
"reportStatus": "0",
"results": "2",
"insDate": "2025-05-06T16:44:31",
"insDateShow": "2025-05-06 16:44:31",
"updDate": null,
"updDateShow": null,
"fileType": null,
"area": null,
"floor": null,
"map": null,
"staffId": null,
"targetUserId": null,
"position": null,
"actualStaffName": null,
"targetStaffName": "员工1",
"routeName": "test",
"phoneAddress": null,
"width": null,
"height": null,
"resolution": null,
"originX": null,
"originY": null,
"imgList": null,
"robotType": "08",
"eventFloor": null,
"floorName": null,
"coordId": null,
"coord": null,
"coordName": null,
"positonName": "A3",
"processingRemark": null,
"carId": null,
"parkingSpaceType": null,
"parkingSpaceNumber": null,
"carNumber": null,
"eno": null,
"instrument": null,
"evideo": null
}
]
}
```
- 获取事件详情接口
- url:
- http://erpapi.concoai.com/robot/event/{eventId}
- 传递参数:
- 路径变量:
- eventId
- 请求头参数:
- token:
- refreshToken
- 响应参数: 主要获取imgList中的图片url.
```json
{
"code": "2000",
"message": "成功",
"total": null,
"data": {
"eventId": "a462a29d7481495380cd47035b19edc0",
"tenantInfoId": "4fff5d4bcc4b4239941ff077a0da8958",
"reportEventId": "bb96f28e14d944c79f44321edca4395f",
"number": "ROB23100098",
"name": "X32305000019",
"eclassify": "2",
"operationType": "2",
"etype": "E000007",
"etypeName": "日常巡检",
"enTypeName": null,
"hkTypeName": null,
"reportStatus": "0",
"results": "2",
"insDate": null,
"insDateShow": "2025-05-06 16:44:31",
"updDate": null,
"updDateShow": null,
"fileType": "2",
"area": "区域1",
"floor": "",
"map": null,
"staffId": null,
"targetUserId": null,
"position": "75.104378,90.402679",
"actualStaffName": null,
"targetStaffName": "员工1",
"routeName": "test",
"phoneAddress": "http://file.prod.concoai.com/image/4fff5d4bcc4b4239941ff077a0da8958/4f60fbd391e98327f6ee13df1455f23e.jpg",
"width": "3994.0",
"height": "4816.0",
"resolution": "0.100000",
"originX": "-111.361710",
"originY": " -255.272873",
"imgList": [
"http://file.prod.concoai.com/image/4fff5d4bcc4b4239941ff077a0da8958/168c66b32421d8e8d5bc13a0bbb87a30.jpeg"
],
"robotType": "08",
"eventFloor": null,
"floorName": null,
"coordId": null,
"coord": null,
"coordName": null,
"positonName": "A3",
"processingRemark": null,
"carId": null,
"parkingSpaceType": null,
"parkingSpaceNumber": null,
"carNumber": null,
"eno": null,
"instrument": null,
"evideo": null
},
"rows": null
}
```
# 后台系统功能:
1. WebSocket服务
- 实现WebSocket服务器
- 处理WebSocket连接管理
- 实现消息的接收和响应
- 支持心跳检测和重连机制
2. 认证管理
- 通过第三方的获取token和refresh接口获取token和refreshToken
- 实现token自动刷新机制
- token失效自动重试机制
3. 数据采集
- 定时调用列表页接口获取事件数据
- 实现增量采集,避免重复处理
- 异常重试机制
- 并发控制
4. 数据处理
- 图片下载和预处理
- OCR识别温度数据
- 数据清洗和验证
- 异常数据处理
5. 数据存储
- 事件信息表
- 图片信息表
- 温度数据表
- 处理日志表
6. API接口
- WebSocket接口
- 条件获取列表接口
- 查看列表项详情接口,支持分页查询
- 修改列表详情接口
- 删除列表某一项接口
# 数据库设计:
1. 事件表(event)
- event_id varchar(50) primary key 事件Id
- tenant_info_id varchar(100)
- report_event_id varchar(100)
- number varchar(20)
- name varchar(20)
- eclassify varchar(5)
- operation_type varchar(5)
- etype varchar(10)
- etype_name varchar(20)
- en_type_name varchar(20)
- hk_type_name varchar(20)
- report_status varchar(5)
- results varchar(5)
- ins_date datetime
- ins_date_show datetime
- upd_date datetime
- upd_date_show datetime
- file_type varchar(5)
- area varchar(20)
- floor varchar(10)
- map varchar(20)
- staff_id varchar(40)
- target_user_id varchar(40)
- position varchar(30)
- actual_staff_name varchar(20)
- target_staff_name varchar(20)
- route_name varchar(20)
- phone_address varchar(500)
- width varchar(10)
- height varchar(10)
- resolution varchar(10)
- origin_x varchar(20)
- origin_y varchar(20)
- img_list_id varchar(20)
- robot_type varchar(5)
- event_floor varchar(10)
- floor_name varchar(10)
- coord_id varchar(40)
- coord_name varchar(30)
- position_name varchar(20)
- processing_remark varchar(300)
- card_id varchar(40)
- parking_space_type varchar(10)
- parking_space_number varchar(40)
- car_number varchar(40)
- eno varchar(40)
- instrument varchar(40)
- evideo varchar(40)
- create_time datetime COMMENT '本地后台创建时间'
- update_time datetime DEFAULT CURRENT_TIMESTAMP COMMENT '本地后台更新时间'
2. 图片表(image)
- image_id: VARCHAR(40) PRIMARY KEY COMMENT '图片ID'
- event_id: VARCHAR(50) NOT NULL COMMENT '关联事件ID'
- image_url: VARCHAR(500) NOT NULL COMMENT '图片URL'
- local_path: VARCHAR(200) COMMENT '本地存储路径'
- create_time: DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间'
- INDEX idx_event_id (event_id),
- FOREIGN KEY (event_id) REFERENCES event(event_id)
3. 温度数据表(temperature)
- temp_id: VARCHAR(32) PRIMARY KEY COMMENT '温度记录ID'
- event_id: VARCHAR(50) NOT NULL COMMENT '关联事件ID'
- image_id: VARCHAR(40) NOT NULL COMMENT '关联图片ID'
- temperature: varchar(20) NOT NULL COMMENT '温度值'
- confidence: varchar(20) NOT NULL COMMENT '识别置信度'
- create_time: DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间'
- INDEX idx_event_id (event_id),
- INDEX idx_create_time (create_time),
- FOREIGN KEY (event_id) REFERENCES event(event_id),
- FOREIGN KEY (image_id) REFERENCES image(image_id)
4. 处理日志表(process_log)
- log_id: VARCHAR(32) PRIMARY KEY COMMENT '日志ID'
- event_id: VARCHAR(32) NOT NULL COMMENT '关联事件ID'
- process_status: TINYINT NOT NULL COMMENT '处理状态'
- error_message: TEXT COMMENT '错误信息'
- create_time: DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间'
- INDEX idx_event_id (event_id),
- INDEX idx_create_time (create_time),
- FOREIGN KEY (event_id) REFERENCES event(event_id)
# 性能要求:
- 系统响应时间API接口响应时间<500ms
- 并发处理能力支持10个并发请求
- 数据处理能力每分钟处理不少于100张图片
- 系统可用性99.9%
# 安全要求:
- 实现接口认证机制
- 敏感数据加密存储
- 操作日志记录
- 异常监控告警
# 部署要求:
- 支持Docker容器化部署
- 支持多环境配置开发测试生产
- 提供部署文档和运维手册