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