364 lines
12 KiB
Markdown
364 lines
12 KiB
Markdown
# 需求:
|
||
|
||
- 设计一个Python后台服务程序,用于自动化采集和处理温度数据
|
||
- 通过WebSocket接收外部系统的消息触发
|
||
- 支持事件驱动的数据采集和处理流程
|
||
|
||
# 功能:
|
||
|
||
- WebSocket服务
|
||
- 接收外部系统的消息
|
||
- 处理消息并触发相应的数据采集流程
|
||
- 支持消息的实时响应
|
||
- 数据采集
|
||
- 定时向第三方接口发送请求,获取返回内容中的图片url
|
||
- 根据图片url获取图片,并使用OCR技术读取图片中电子显示屏中的数字(温度)信息
|
||
- 将处理结果存储到数据库并提供查询接口
|
||
- 事件处理
|
||
- 支持事件的增删改查
|
||
- 支持事件的状态跟踪
|
||
- 支持事件的搜索和过滤
|
||
|
||
# 系统架构:
|
||
|
||
- 采用分层架构设计
|
||
- 数据采集层:负责与第三方API交互
|
||
- 业务处理层:负责数据处理和OCR识别
|
||
- 数据持久层:负责数据存储
|
||
- API接口层:提供对外服务接口
|
||
|
||
# 技术选型:
|
||
|
||
- 开发语言:Python 3.8+
|
||
- Web框架:FastAPI
|
||
- 数据库:MySQL 8.0+
|
||
- ORM:SQLAlchemy
|
||
- 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容器化部署
|
||
- 支持多环境配置(开发、测试、生产)
|
||
- 提供部署文档和运维手册
|