video_monitor/app/utils/Utils.py

108 lines
3.4 KiB
Python
Raw Normal View History

2026-08-30 22:22:11 +08:00
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}"