12 KiB
12 KiB
需求:
- 设计一个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:
- 传递参数:
- 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
- Query参数
- 响应参数: 重点保存 data中的token和refreshtoken
{ "code": "2000", "message": "成功", "total": null, "data": { "token": "xxx", "refreshToken": "xxx", "isLogin": null, "username": null, "password": null, "rolePath": "/index/staff-page" }, "rows": null }
-
获取列表页接口
- url:
- 传递参数:
- Header 参数
- token
- refreshToken
- Body 参数
{"pageNo": 1, "pageSize": 10000}
- Header 参数
- 响应参数: 获取rows中 的eventId ,insDate, insDateShow
{ "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:
- 传递参数:
- 路径变量:
- eventId
- 请求头参数:
- token:
- refreshToken
- 路径变量:
- 响应参数: 主要获取imgList中的图片url.
{ "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 }
后台系统功能:
-
WebSocket服务
- 实现WebSocket服务器
- 处理WebSocket连接管理
- 实现消息的接收和响应
- 支持心跳检测和重连机制
-
认证管理
- 通过第三方的获取token和refresh接口获取token和refreshToken
- 实现token自动刷新机制
- token失效自动重试机制
-
数据采集
- 定时调用列表页接口获取事件数据
- 实现增量采集,避免重复处理
- 异常重试机制
- 并发控制
-
数据处理
- 图片下载和预处理
- OCR识别温度数据
- 数据清洗和验证
- 异常数据处理
-
数据存储
- 事件信息表
- 图片信息表
- 温度数据表
- 处理日志表
-
API接口
- WebSocket接口
- 条件获取列表接口
- 查看列表项详情接口,支持分页查询
- 修改列表详情接口
- 删除列表某一项接口
数据库设计:
-
事件表(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 '本地后台更新时间'
-
图片表(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)
-
温度数据表(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)
-
处理日志表(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容器化部署
- 支持多环境配置(开发、测试、生产)
- 提供部署文档和运维手册