增加tdevice 字符长度
This commit is contained in:
parent
a623a006fb
commit
bdf4445497
|
@ -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):
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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='设备唯一标识'),
|
||||
),
|
||||
]
|
|
@ -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,
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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('号码')
|
||||
|
|
|
@ -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='模板参数')
|
||||
|
|
|
@ -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']
|
|
@ -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)
|
||||
|
|
@ -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)),
|
||||
|
|
|
@ -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)
|
||||
|
|
Binary file not shown.
Binary file not shown.
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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(
|
||||
|
|
Loading…
Reference in New Issue