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

12 KiB
Raw Blame History

需求:

  • 设计一个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:
    • 传递参数:
      • 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
          {
              "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}
        
    • 响应参数: 获取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
          }
      

后台系统功能:

  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容器化部署
  • 支持多环境配置(开发、测试、生产)
  • 提供部署文档和运维手册