增加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):
manager_name = serializers.CharField(source='manager.name', read_only=True)
class Meta:
model = Area
fields = '__all__'
@ -23,7 +25,7 @@ class AreaCreateUpdateSerializer(CustomModelSerializer):
model = Area
fields = ['name', 'level', 'number', 'visitor_yes', 'remployee_yes', 'employee_yes',
'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):

View File

@ -23,6 +23,7 @@ class EventCate(CommonAModel):
speakers = models.ManyToManyField(TDevice, verbose_name='固定音响', blank=True)
filter_area_level = models.PositiveSmallIntegerField('固定音响区域级别过滤', choices=Area.AREA_LEVEL_CHOICES,
default=Area.AREA_1)
hanle_minute = models.PositiveSmallIntegerField('处理时间', default=0, help_text='超过处理时间事件状态变为超时未处理,0代表未配置')
def __str__(self):
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)
area = models.ForeignKey(Area, verbose_name='发生区域', on_delete=models.CASCADE)
location = models.JSONField('事件点位坐标', default=dict, null=False, blank=True)
@ -65,6 +70,9 @@ class Event(CommonBModel):
max_length=20, null=True, blank=True)
people = models.ForeignKey(Employee, verbose_name='当事人',
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_user = models.ForeignKey(User, verbose_name='处理人',
on_delete=models.CASCADE, null=True, blank=True)
@ -72,7 +80,15 @@ class Event(CommonBModel):
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):
@ -84,11 +100,11 @@ class Remind(BaseModel):
recipient = models.ForeignKey(User, verbose_name='接收人',
on_delete=models.CASCADE)
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='岗位',
on_delete=models.CASCADE, null=True, blank=True)
on_delete=models.SET_NULL, null=True, blank=True)
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)
is_read = 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.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(
key_str, cls.ep_default_dict, timeout=None
)
@ -164,7 +164,7 @@ class EcmService:
if blts.employee:
# 从缓存查询人员位置信息
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(
key_str, cls.ep_default_dict, timeout=None
)

View File

@ -117,3 +117,8 @@ class DhClient:
"response_ms": self._get_response_ms()
})
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, '面板机')
)
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,
null=False, blank=True)
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
class PicSerializer(serializers.Serializer):
path = serializers.CharField(label='图片oss地址')
class TDeviceSerializer(CustomModelSerializer):
class Meta:
model = TDevice

View File

@ -87,6 +87,10 @@ dhapis = {
"video_realtime": {
"url": "/evo-apigw/admin/API/video/stream/realtime",
"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": {
"url": "/api/devices",
"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.decorators import action
from apps.third.serializers import RequestCommonSerializer
from apps.third.serializers import PicSerializer, RequestCommonSerializer
from rest_framework import serializers
import stomp
from django.conf import settings
@ -121,6 +121,15 @@ class XxCommonViewSet(CreateModelMixin, CustomGenericViewSet):
"""
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):
perms_map = {'post': '*'}
@ -157,6 +166,25 @@ class DhCommonViewSet(CreateModelMixin, CustomGenericViewSet):
"""
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,
permission_classes=[IsAdminUser],
serializer_class=serializers.Serializer)

View File

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

View File

@ -17,6 +17,7 @@ class CustomModelSerializer(DynamicFieldsMixin, serializers.ModelSerializer):
"""
自定义serializer/包含创建和新增字段处理
"""
def __init__(self, instance=None, data=empty, request=None, **kwargs):
super().__init__(instance, data, **kwargs)
self.request: Request = request or self.context.get('request', None)
@ -38,3 +39,9 @@ class CustomModelSerializer(DynamicFieldsMixin, serializers.ModelSerializer):
if hasattr(instance, 'update_by'):
validated_data['update_by'] = getattr(self.request, 'user', None)
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 rest_framework import routers
from apps.utils.views import SignatureViewSet
from apps.utils.views import SignatureViewSet, TestViewSet
API_BASE_URL = 'api/utils/'
router = routers.DefaultRouter()
router.register('signature', SignatureViewSet, basename='signature')
router.register('test', TestViewSet, basename='util_test')
urlpatterns = [
path(API_BASE_URL, include(router.urls)),

View File

@ -2,15 +2,18 @@
import os
import cv2
from django.http import HttpResponse
from yaml import serialize
from apps.utils.errors import SIGN_MAKE_FAIL
from apps.utils.sms import send_sms
from server.settings import BASE_DIR
import numpy as np
from rest_framework.response import Response
from rest_framework.exceptions import ParseError
from apps.utils.viewsets import CustomGenericViewSet
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.decorators import action
class SignatureViewSet(CustomCreateModelMixin, CustomGenericViewSet):
@ -52,7 +55,18 @@ class SignatureViewSet(CustomCreateModelMixin, CustomGenericViewSet):
raise ParseError(**SIGN_MAKE_FAIL)
def map_config(request):
path = os.path.join(BASE_DIR, 'dist/data/map/0000/mapConfig.conf')
with open(path) as f:
return HttpResponse(f.read(), content_type='application/octet-stream')
class TestViewSet(CustomGenericViewSet):
authentication_classes = ()
permission_classes = ()
@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
stomp.py==8.0.0
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
BACKUP_PATH = conf.BACKUP_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 rest_framework.documentation import include_docs_urls
from django.views.generic import TemplateView
from apps.utils.views import map_config
schema_view = get_schema_view(
openapi.Info(