video.py 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255
  1. from __future__ import annotations
  2. from datetime import datetime
  3. from pydantic import BaseModel, Field
  4. from app.schemas.common import ORMModel
  5. # ---------------------------------------------------------------------------
  6. # 视频通道
  7. # ---------------------------------------------------------------------------
  8. class VideoChannelCreate(BaseModel):
  9. mine_id: str
  10. code: str
  11. name: str
  12. module: str
  13. area_group: str = ""
  14. location: str = ""
  15. device_type: str = ""
  16. point_code: str = ""
  17. protocol: str = "GB/T 28181"
  18. stream_url: str = ""
  19. status: str = "online"
  20. file_path: str = ""
  21. preview_image_path: str = ""
  22. resolution: str = ""
  23. frame_rate: int | None = None
  24. is_enabled: bool = True
  25. sort_order: int = 0
  26. properties: dict = Field(default_factory=dict)
  27. class VideoChannelUpdate(BaseModel):
  28. name: str | None = None
  29. module: str | None = None
  30. area_group: str | None = None
  31. location: str | None = None
  32. device_type: str | None = None
  33. point_code: str | None = None
  34. protocol: str | None = None
  35. stream_url: str | None = None
  36. status: str | None = None
  37. file_path: str | None = None
  38. preview_image_path: str | None = None
  39. resolution: str | None = None
  40. frame_rate: int | None = None
  41. is_enabled: bool | None = None
  42. sort_order: int | None = None
  43. properties: dict | None = None
  44. class VideoChannelRead(ORMModel):
  45. id: str
  46. mine_id: str
  47. data_source_id: str | None
  48. code: str
  49. name: str
  50. module: str
  51. area_group: str
  52. location: str
  53. device_type: str
  54. point_code: str
  55. protocol: str
  56. stream_url: str
  57. status: str
  58. file_path: str
  59. file_name: str
  60. file_size: int
  61. duration_seconds: int | None
  62. resolution: str
  63. frame_rate: int | None
  64. preview_image_path: str
  65. is_enabled: bool
  66. sort_order: int
  67. last_online_at: datetime | None
  68. properties: dict
  69. has_video: bool = False
  70. media_available: bool = False
  71. playback_url: str = ""
  72. snapshot_url: str = ""
  73. # ---------------------------------------------------------------------------
  74. # 识别抓拍图像
  75. # ---------------------------------------------------------------------------
  76. class VideoSnapshotRead(ORMModel):
  77. id: str
  78. mine_id: str
  79. channel_id: str
  80. channel_name: str = ""
  81. module: str
  82. snapshot_type: str
  83. event_type: str
  84. level: str
  85. title: str
  86. file_path: str
  87. file_name: str
  88. file_size: int
  89. width: int | None
  90. height: int | None
  91. thumbnail_path: str
  92. plate_no: str
  93. person_name: str
  94. person_count: int
  95. team_name: str
  96. gap_mm: float | None
  97. confidence: float | None
  98. captured_at: datetime
  99. properties: dict
  100. media_available: bool = False
  101. image_url: str = ""
  102. thumbnail_url: str = ""
  103. # ---------------------------------------------------------------------------
  104. # 视频分析事件
  105. # ---------------------------------------------------------------------------
  106. class VideoEventUpdate(BaseModel):
  107. status: str | None = None
  108. handled_by: str | None = None
  109. handle_remark: str | None = None
  110. class VideoAnalysisEventRead(ORMModel):
  111. id: str
  112. mine_id: str
  113. channel_id: str | None
  114. channel_name: str = ""
  115. snapshot_id: str | None
  116. module: str
  117. event_type: str
  118. category: str
  119. level: str
  120. title: str
  121. description: str
  122. confidence: float | None
  123. status: str
  124. occurred_at: datetime
  125. handled_at: datetime | None
  126. handled_by: str
  127. handle_remark: str
  128. properties: dict
  129. snapshot_image_url: str = ""
  130. # ---------------------------------------------------------------------------
  131. # 通行与操作记录
  132. # ---------------------------------------------------------------------------
  133. class VideoRecordRead(ORMModel):
  134. id: str
  135. mine_id: str
  136. channel_id: str
  137. device_name: str
  138. module: str
  139. record_type: str
  140. record_type_label: str = ""
  141. area_name: str
  142. location: str
  143. plate_no: str
  144. person_name: str
  145. person_count: int
  146. team_name: str
  147. operation_type: str
  148. compare_result: str
  149. warn_type: str
  150. result: str
  151. handle_status: str
  152. device_status: str
  153. level: str
  154. gap_mm: float | None
  155. stay_seconds: int | None
  156. enter_time: datetime | None
  157. leave_time: datetime | None
  158. occurred_at: datetime
  159. snapshot_id: str | None
  160. snapshot_image_url: str = ""
  161. properties: dict
  162. # ---------------------------------------------------------------------------
  163. # 页面配置与总览
  164. # ---------------------------------------------------------------------------
  165. class VideoRecordTab(BaseModel):
  166. record_type: str
  167. label: str
  168. columns: list[str]
  169. class VideoModuleConfig(BaseModel):
  170. key: str
  171. title: str
  172. status_title: str
  173. selector_label: str
  174. type_filter_label: str
  175. type_filter_options: list[str]
  176. scope_filter_label: str
  177. scope_filter_options: list[str]
  178. snapshot_types: list[str]
  179. record_tabs: list[VideoRecordTab]
  180. class VideoSummaryCard(BaseModel):
  181. key: str
  182. label: str
  183. value: int | float
  184. unit: str = ""
  185. hint: str = ""
  186. tone: str = "default"
  187. class VideoStatusMetric(BaseModel):
  188. key: str
  189. label: str
  190. value: int | float
  191. unit: str = ""
  192. tone: str = "normal"
  193. class VideoPlatformOverview(BaseModel):
  194. mine_id: str
  195. channel_total: int
  196. channel_configured: int
  197. channel_online: int
  198. channel_offline: int
  199. channel_fault: int
  200. event_open_count: int
  201. snapshot_count: int
  202. modules: list[VideoModuleConfig]
  203. summary: list[VideoSummaryCard]
  204. class VideoStatusOverview(BaseModel):
  205. mine_id: str
  206. module: str
  207. status_title: str
  208. metrics: list[VideoStatusMetric]
  209. class VideoModuleSummaryRead(BaseModel):
  210. module: str
  211. title: str
  212. status_title: str
  213. metrics: list[VideoStatusMetric]
  214. summary: list[VideoSummaryCard]