增加tdevice 字符长度

This commit is contained in:
曹前明 2022-06-30 18:28:24 +08:00
parent a623a006fb
commit bdf4445497
20 changed files with 181 additions and 17 deletions

View File

@ -13,6 +13,8 @@ class AreaSimpleSerializer(CustomModelSerializer):
class AreaSerializer(CustomModelSerializer): class AreaSerializer(CustomModelSerializer):
manager_name = serializers.CharField(source='manager.name', read_only=True)
class Meta: class Meta:
model = Area model = Area
fields = '__all__' fields = '__all__'
@ -23,7 +25,7 @@ class AreaCreateUpdateSerializer(CustomModelSerializer):
model = Area model = Area
fields = ['name', 'level', 'number', 'visitor_yes', 'remployee_yes', 'employee_yes', fields = ['name', 'level', 'number', 'visitor_yes', 'remployee_yes', 'employee_yes',
'belong_dept', 'count_people_min', 'count_people_max', 'count_people', 'cate', 'belong_dept', 'count_people_min', 'count_people_max', 'count_people', 'cate',
'stay_minute_min', 'stay_minute_max'] 'stay_minute_min', 'stay_minute_max', 'manager']
class AccessCreateSerializer(CustomModelSerializer): class AccessCreateSerializer(CustomModelSerializer):

View File

@ -23,6 +23,7 @@ class EventCate(CommonAModel):
speakers = models.ManyToManyField(TDevice, verbose_name='固定音响', blank=True) speakers = models.ManyToManyField(TDevice, verbose_name='固定音响', blank=True)
filter_area_level = models.PositiveSmallIntegerField('固定音响区域级别过滤', choices=Area.AREA_LEVEL_CHOICES, filter_area_level = models.PositiveSmallIntegerField('固定音响区域级别过滤', choices=Area.AREA_LEVEL_CHOICES,
default=Area.AREA_1) default=Area.AREA_1)
hanle_minute = models.PositiveSmallIntegerField('处理时间', default=0, help_text='超过处理时间事件状态变为超时未处理,0代表未配置')
def __str__(self): def __str__(self):
return self.name return self.name
@ -57,7 +58,11 @@ class Event(CommonBModel):
""" """
事件 事件
""" """
cates = models.ForeignKey(EventCate, verbose_name='事件种类', on_delete=models.CASCADE) EVENT_MARK_CHOICES = (
(10, '正常'),
(20, '误报'),
)
cates = models.ManyToManyField(EventCate, verbose_name='关联事件种类', through='ecm.eventdo')
imgs = models.ManyToManyField(File, verbose_name='事件图片', blank=True) imgs = models.ManyToManyField(File, verbose_name='事件图片', blank=True)
area = models.ForeignKey(Area, verbose_name='发生区域', on_delete=models.CASCADE) area = models.ForeignKey(Area, verbose_name='发生区域', on_delete=models.CASCADE)
location = models.JSONField('事件点位坐标', default=dict, null=False, blank=True) location = models.JSONField('事件点位坐标', default=dict, null=False, blank=True)
@ -65,6 +70,9 @@ class Event(CommonBModel):
max_length=20, null=True, blank=True) max_length=20, null=True, blank=True)
people = models.ForeignKey(Employee, verbose_name='当事人', people = models.ForeignKey(Employee, verbose_name='当事人',
on_delete=models.CASCADE, null=True, blank=True) on_delete=models.CASCADE, null=True, blank=True)
state = models.PositiveSmallIntegerField('事件状态', default=10)
msg = models.TextField('事件文本', null=True, blank=True)
mark = models.PositiveSmallIntegerField('事件标记', default=10)
handle_time = models.DateTimeField('处理时间', null=True, blank=True) handle_time = models.DateTimeField('处理时间', null=True, blank=True)
handle_user = models.ForeignKey(User, verbose_name='处理人', handle_user = models.ForeignKey(User, verbose_name='处理人',
on_delete=models.CASCADE, null=True, blank=True) on_delete=models.CASCADE, null=True, blank=True)
@ -72,7 +80,15 @@ class Event(CommonBModel):
is_pushed = models.BooleanField('是否已推送', default=False) is_pushed = models.BooleanField('是否已推送', default=False)
# class class Eventdo(models.Model):
cate = models.ForeignKey(EventCate, verbose_name='关联事件种类',
on_delete=models.CASCADE)
event = models.ForeignKey(Event, verbose_name='关联事件',
on_delete=models.CASCADE)
handle_time = models.DateTimeField('处理时间', null=True, blank=True)
handle_user = models.ForeignKey(User, verbose_name='处理人',
on_delete=models.CASCADE, null=True, blank=True)
handle_desc = models.TextField('处理描述', null=True, blank=True)
class Remind(BaseModel): class Remind(BaseModel):
@ -84,11 +100,11 @@ class Remind(BaseModel):
recipient = models.ForeignKey(User, verbose_name='接收人', recipient = models.ForeignKey(User, verbose_name='接收人',
on_delete=models.CASCADE) on_delete=models.CASCADE)
notify_setting = models.ForeignKey(NotifySetting, verbose_name='通过哪个配置', notify_setting = models.ForeignKey(NotifySetting, verbose_name='通过哪个配置',
on_delete=models.CASCADE, null=True, blank=True) on_delete=models.SET_NULL, null=True, blank=True)
post = models.ForeignKey(Post, verbose_name='岗位', post = models.ForeignKey(Post, verbose_name='岗位',
on_delete=models.CASCADE, null=True, blank=True) on_delete=models.SET_NULL, null=True, blank=True)
dept = models.ForeignKey(Dept, verbose_name='部门', dept = models.ForeignKey(Dept, verbose_name='部门',
on_delete=models.CASCADE, null=True, blank=True) on_delete=models.SET_NULL, null=True, blank=True)
msg = models.TextField('推送文本', null=True, blank=True) msg = models.TextField('推送文本', null=True, blank=True)
is_read = models.BooleanField('站内信已读', default=False) is_read = models.BooleanField('站内信已读', default=False)
can_handle = models.BooleanField('是否可处理', default=False) can_handle = models.BooleanField('是否可处理', default=False)

View File

@ -89,7 +89,7 @@ class EcmService:
if area and blts and blts.employee: # 如果是人 if area and blts and blts.employee: # 如果是人
if area.type == Area.AREA_TYPE_FIX: if area.type == Area.AREA_TYPE_FIX:
# 更新人员位置信息缓存 # 更新人员位置信息缓存
key_str = f'ep_{blts.employee.id}' key_str = 'ep_{}'.format(blts.employee.id)
ep_loc_dict = cache.get_or_set( ep_loc_dict = cache.get_or_set(
key_str, cls.ep_default_dict, timeout=None key_str, cls.ep_default_dict, timeout=None
) )
@ -164,7 +164,7 @@ class EcmService:
if blts.employee: if blts.employee:
# 从缓存查询人员位置信息 # 从缓存查询人员位置信息
time2 = int(time.time()) time2 = int(time.time())
key_str = f'ep_{blts.employee.id}' key_str = 'ep_{}'.format(blts.employee.id)
ep_loc_dict = cache.get_or_set( ep_loc_dict = cache.get_or_set(
key_str, cls.ep_default_dict, timeout=None key_str, cls.ep_default_dict, timeout=None
) )

View File

@ -117,3 +117,8 @@ class DhClient:
"response_ms": self._get_response_ms() "response_ms": self._get_response_ms()
}) })
Tlog(**self.log).save() Tlog(**self.log).save()
def get_full_pic(self, path: str):
"""返回完整访问地址
"""
return '{}/evo-apigw/evo-oss/{}?token={}'.format(settings.DAHUA_BASE_URL, path, self.token)

View File

@ -0,0 +1,18 @@
# Generated by Django 3.2.12 on 2022-06-30 10:26
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('third', '0004_auto_20220630_1025'),
]
operations = [
migrations.AlterField(
model_name='tdevice',
name='code',
field=models.CharField(db_index=True, max_length=50, verbose_name='设备唯一标识'),
),
]

View File

@ -32,7 +32,7 @@ class TDevice(BaseModel):
(DEVICE_PANEL, '面板机') (DEVICE_PANEL, '面板机')
) )
type = models.PositiveSmallIntegerField('设备类型', choices=DEVICE_CHOICE) type = models.PositiveSmallIntegerField('设备类型', choices=DEVICE_CHOICE)
code = models.CharField('设备唯一标识', max_length=20, db_index=True) code = models.CharField('设备唯一标识', max_length=50, db_index=True)
location = models.JSONField('位置信息', default=dict, location = models.JSONField('位置信息', default=dict,
null=False, blank=True) null=False, blank=True)
area = models.ForeignKey(Area, on_delete=models.CASCADE, area = models.ForeignKey(Area, on_delete=models.CASCADE,

View File

@ -5,6 +5,10 @@ from apps.third.models import TDevice
from apps.utils.serializers import CustomModelSerializer from apps.utils.serializers import CustomModelSerializer
class PicSerializer(serializers.Serializer):
path = serializers.CharField(label='图片oss地址')
class TDeviceSerializer(CustomModelSerializer): class TDeviceSerializer(CustomModelSerializer):
class Meta: class Meta:
model = TDevice model = TDevice

View File

@ -87,6 +87,10 @@ dhapis = {
"video_realtime": { "video_realtime": {
"url": "/evo-apigw/admin/API/video/stream/realtime", "url": "/evo-apigw/admin/API/video/stream/realtime",
"method": "post" "method": "post"
},
"alarm_detail": {
"url": "/evo-apigw/evo-event/1.2.0/alarm-record/detail?alarmCode={alarmCode}&dbType={dbType}&alarmDate={alarmDate}",
"method": "get"
} }
} }
@ -124,5 +128,9 @@ spapis = {
"device_list": { "device_list": {
"url": "/api/devices", "url": "/api/devices",
"method": "get" "method": "get"
},
"send_to_device": {
"url": "/api/sendtodevice",
"method": "post"
} }
} }

View File

@ -13,7 +13,7 @@ from apps.utils.viewsets import CustomGenericViewSet
from rest_framework.mixins import CreateModelMixin from rest_framework.mixins import CreateModelMixin
from rest_framework.decorators import action from rest_framework.decorators import action
from apps.third.serializers import RequestCommonSerializer from apps.third.serializers import PicSerializer, RequestCommonSerializer
from rest_framework import serializers from rest_framework import serializers
import stomp import stomp
from django.conf import settings from django.conf import settings
@ -121,6 +121,15 @@ class XxCommonViewSet(CreateModelMixin, CustomGenericViewSet):
""" """
return Response(xxapis) return Response(xxapis)
@action(methods=['get'], detail=False,
permission_classes=[IsAuthenticated])
def token(self, request, pk=None):
"""获取token
获取token
"""
return Response({'token': xxClient.token})
class DhCommonViewSet(CreateModelMixin, CustomGenericViewSet): class DhCommonViewSet(CreateModelMixin, CustomGenericViewSet):
perms_map = {'post': '*'} perms_map = {'post': '*'}
@ -157,6 +166,25 @@ class DhCommonViewSet(CreateModelMixin, CustomGenericViewSet):
""" """
return Response(dhapis) return Response(dhapis)
@action(methods=['get'], detail=False,
permission_classes=[IsAuthenticated])
def token(self, request, pk=None):
"""获取token
获取token
"""
return Response({'token': dhClient.token})
@action(methods=['post'], detail=False,
permission_classes=[IsAuthenticated],
serializer_class=PicSerializer)
def full_pic(self, request, pk=None):
"""获取完整图片地址
获取完整图片地址
"""
return Response({'url': dhClient.get_full_pic(path=request.data.get('path'))})
@action(methods=['post'], detail=False, @action(methods=['post'], detail=False,
permission_classes=[IsAdminUser], permission_classes=[IsAdminUser],
serializer_class=serializers.Serializer) serializer_class=serializers.Serializer)

View File

@ -1,6 +1,7 @@
import django.utils.timezone as timezone import django.utils.timezone as timezone
from django.db import models from django.db import models
from django.db.models.query import QuerySet from django.db.models.query import QuerySet
from yaml import serialize
from apps.utils.snowflake import idWorker from apps.utils.snowflake import idWorker
# 自定义软删除查询基类 # 自定义软删除查询基类
@ -157,3 +158,10 @@ class CommonBDModel(BaseModel):
class Meta: class Meta:
abstract = True abstract = True
# class Smslog(BaseModel):
# """
# 短信发送记录表
# """
# phone = models.CharField('号码')

View File

@ -17,6 +17,7 @@ class CustomModelSerializer(DynamicFieldsMixin, serializers.ModelSerializer):
""" """
自定义serializer/包含创建和新增字段处理 自定义serializer/包含创建和新增字段处理
""" """
def __init__(self, instance=None, data=empty, request=None, **kwargs): def __init__(self, instance=None, data=empty, request=None, **kwargs):
super().__init__(instance, data, **kwargs) super().__init__(instance, data, **kwargs)
self.request: Request = request or self.context.get('request', None) self.request: Request = request or self.context.get('request', None)
@ -38,3 +39,9 @@ class CustomModelSerializer(DynamicFieldsMixin, serializers.ModelSerializer):
if hasattr(instance, 'update_by'): if hasattr(instance, 'update_by'):
validated_data['update_by'] = getattr(self.request, 'user', None) validated_data['update_by'] = getattr(self.request, 'user', None)
return super().update(instance, validated_data) return super().update(instance, validated_data)
class SendSmsSerializer(serializers.Serializer):
phone = serializers.CharField(label='手机号')
template_code = serializers.CharField(label='模板标识')
template_param = serializers.JSONField(label='模板参数')

35
apps/utils/sms.py Normal file
View File

@ -0,0 +1,35 @@
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.request import CommonRequest
from django.conf import settings
import json
def send_sms(phone: str, template_code: str, template_param: dict):
client = AcsClient(settings.XNIU_SMS_KEY, settings.XNIU_SMS_SECRET, 'default')
request = CommonRequest()
# 固定json
request.set_accept_format('json')
# 固定地址
request.set_domain('sms11.hzgxr.com:40081')
# 固定POST
request.set_method('POST')
# 固定HTTP
request.set_protocol_type('http') # https | http
# 固定版本号
request.set_version('2017-05-25')
# 固定操作名
request.set_action_name('SendSms')
# 手机号码
request.add_query_param('PhoneNumbers', phone)
# 签名名称
request.add_query_param('SignName', "国家建材网")
# 模板CODE
request.add_query_param('TemplateCode', template_code)
# 如果有模板参数 填写模板参数 如果无 无须填写
request.add_query_param('TemplateParam', json.dumps(template_param))
res = client.do_action(request)
res_dict = json.loads(str(res, encoding='utf-8'))
if res_dict['result'] == 0:
return True, 'OK', res_dict['BizId']
else:
return False, res_dict['Message'], res_dict['BizId']

6
apps/utils/speech.py Normal file
View File

@ -0,0 +1,6 @@
from aip import AipSpeech
from django.conf import settings
def generate_voice(msg:str):
client = AipSpeech(settings.BD_SP_ID, settings.BD_SP_KEY, settings.BD_SP_SECRET)

View File

@ -1,10 +1,11 @@
from django.urls import path, include from django.urls import path, include
from rest_framework import routers from rest_framework import routers
from apps.utils.views import SignatureViewSet from apps.utils.views import SignatureViewSet, TestViewSet
API_BASE_URL = 'api/utils/' API_BASE_URL = 'api/utils/'
router = routers.DefaultRouter() router = routers.DefaultRouter()
router.register('signature', SignatureViewSet, basename='signature') router.register('signature', SignatureViewSet, basename='signature')
router.register('test', TestViewSet, basename='util_test')
urlpatterns = [ urlpatterns = [
path(API_BASE_URL, include(router.urls)), path(API_BASE_URL, include(router.urls)),

View File

@ -2,15 +2,18 @@
import os import os
import cv2 import cv2
from django.http import HttpResponse from django.http import HttpResponse
from yaml import serialize
from apps.utils.errors import SIGN_MAKE_FAIL from apps.utils.errors import SIGN_MAKE_FAIL
from apps.utils.sms import send_sms
from server.settings import BASE_DIR from server.settings import BASE_DIR
import numpy as np import numpy as np
from rest_framework.response import Response from rest_framework.response import Response
from rest_framework.exceptions import ParseError from rest_framework.exceptions import ParseError
from apps.utils.viewsets import CustomGenericViewSet from apps.utils.viewsets import CustomGenericViewSet
from apps.utils.mixins import CustomCreateModelMixin from apps.utils.mixins import CustomCreateModelMixin
from apps.utils.serializers import GenSignatureSerializer from apps.utils.serializers import GenSignatureSerializer, SendSmsSerializer
from rest_framework.views import APIView from rest_framework.views import APIView
from rest_framework.decorators import action
class SignatureViewSet(CustomCreateModelMixin, CustomGenericViewSet): class SignatureViewSet(CustomCreateModelMixin, CustomGenericViewSet):
@ -52,7 +55,18 @@ class SignatureViewSet(CustomCreateModelMixin, CustomGenericViewSet):
raise ParseError(**SIGN_MAKE_FAIL) raise ParseError(**SIGN_MAKE_FAIL)
def map_config(request): class TestViewSet(CustomGenericViewSet):
path = os.path.join(BASE_DIR, 'dist/data/map/0000/mapConfig.conf') authentication_classes = ()
with open(path) as f: permission_classes = ()
return HttpResponse(f.read(), content_type='application/octet-stream')
@action(methods=['post'], detail=False, serializer_class=SendSmsSerializer)
def send_sms(self, request, pk=None):
"""发送短信测试
发送短信测试
"""
serializer = SendSmsSerializer(data=request.data)
serializer.is_valid(raise_exception=True)
vdata = serializer.validated_data
res = send_sms(**vdata)
return Response(res)

BIN
media/default/abc.mp3 Normal file

Binary file not shown.

BIN
media/default/abc2.mp3 Normal file

Binary file not shown.

View File

@ -20,3 +20,5 @@ channels-redis==3.4.0
django-restql==0.15.2 django-restql==0.15.2
stomp.py==8.0.0 stomp.py==8.0.0
shapely==1.8.2 shapely==1.8.2
aliyun-python-sdk-core==2.13.36
baidu-aip==4.16.6

View File

@ -380,3 +380,14 @@ SP_PASSWORD = conf.SP_PASSWORD
SD_PWD = conf.SD_PWD SD_PWD = conf.SD_PWD
BACKUP_PATH = conf.BACKUP_PATH BACKUP_PATH = conf.BACKUP_PATH
SH_PATH = conf.SH_PATH SH_PATH = conf.SH_PATH
# 小牛短信
XNIU_SMS_KEY = conf.XNIU_SMS_KEY
XNIU_SMS_SECRET = conf.XNIU_SMS_SECRET
# 百度语音
BD_SP_ID = conf.BD_SP_ID
BD_SP_KEY = conf.BD_SP_KEY
BD_SP_SECRET = conf.BD_SP_SECRET

View File

@ -21,7 +21,6 @@ from drf_yasg import openapi
from drf_yasg.views import get_schema_view from drf_yasg.views import get_schema_view
from rest_framework.documentation import include_docs_urls from rest_framework.documentation import include_docs_urls
from django.views.generic import TemplateView from django.views.generic import TemplateView
from apps.utils.views import map_config
schema_view = get_schema_view( schema_view = get_schema_view(
openapi.Info( openapi.Info(