video_monitor/app/utils/Utils.py
2026-08-30 22:23:12 +08:00

108 lines
3.4 KiB
Python
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.

import random
import time
from app.utils.LanguageUtils import LANG_UI_DICT
import collections
def buildPageLabels(page, page_num, lang='zh'):
"""
:param page: 当前页面
:param page_num: 总页数
:param lang: 语言代码,默认 'zh'
:return:
返回式例:
[{'page': 1, 'name': 1, 'cur': True}, {'page': 2, 'name': 2, 'cur': False}, {'page': 2, 'name': '下一页'}]
"""
T = LANG_UI_DICT.get(lang, LANG_UI_DICT['zh'])
label_first = T.get('perm_first_page', '首页')
label_prev = T.get('perm_prev_page', '上一页')
label_next = T.get('perm_next_page', '下一页')
label_last = T.get('perm_last_page', '尾页')
pageLabels = []
if page > 1:
pageLabels.append({
"page": 1,
"name": label_first
})
pageLabels.append({
"page": page - 1, # 当前页点击时候触发的页数
"name": label_prev
})
if page == 1:
pageArray = [1, 2, 3, 4]
else:
pageArray = list(range(page - 1, page + 3)) # page-1,page,page+1,page+2
for p in pageArray:
if p <= page_num:
if page == p:
cur = 1
else:
cur = 0
pageLabels.append({
"page": p,
"name": p,
"cur": cur
})
if page + 1 <= page_num:
pageLabels.append({
"page": page + 1,
"name": label_next
})
if page_num > 0:
pageLabels.append({
"page": page_num,
"name": label_last
})
return pageLabels
def group_by_field(data, field):
"""
根据数据项中的field参数将一维列表分组为二维列表
Args:
data: list of dicts, 一维数据结构每个数据项为字典包含field键
Returns:
list of lists: 二维数据结构每个子列表包含相同field的数据项
"""
grouped_dict = collections.defaultdict(list)
for item in data:
# 获取stream_name作为分组键
value = item.get(field)
grouped_dict[value].append(item)
# 将字典中的值转换为二维列表
return list(grouped_dict.values())
class GB28181CodeUtils:
def __init__(self, default_area_code="34020000", default_industry="13"):
"""
初始化生成器
:param default_area_code: 默认行政区划码 (8位)
:param default_industry: 默认行业编码 (2位)
"""
self.default_area_code = default_area_code
self.default_industry = default_industry
def generate_by_time(self, area_code=None):
"""
基于当前时间生成编号(常用于流水号场景)
格式:行政区(8) + 行业(2) + 年月日时分秒(10) + 随机(0-9)
注意这种格式总长度也是20位但逻辑不同
"""
area = area_code if area_code else self.default_area_code
# 截取时间的后10位数字作为序列号的一部分
time_str = time.strftime("%y%m%d%H%M%S") # 12位取后10位或者做处理
# 使用毫秒时间戳的后4位 + 3位随机数作为序列号确保快速连续调用也不重复
ms_part = f"{int(time.time() * 1000) % 10000:04d}"
rand_part = f"{random.randint(0, 999):03d}"
serial = ms_part + rand_part
return f"{area}{self.default_industry}200{serial}"