remind serializer
This commit is contained in:
parent
c79833681b
commit
adc6781854
|
@ -26,6 +26,9 @@ class AreaCreateUpdateSerializer(CustomModelSerializer):
|
||||||
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', 'manager']
|
'stay_minute_min', 'stay_minute_max', 'manager']
|
||||||
|
extra_kwargs = {
|
||||||
|
'belong_dept': {'required': True},
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
class AccessCreateSerializer(CustomModelSerializer):
|
class AccessCreateSerializer(CustomModelSerializer):
|
||||||
|
|
|
@ -118,10 +118,6 @@ class Remind(BaseModel):
|
||||||
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.SET_NULL, null=True, blank=True)
|
on_delete=models.SET_NULL, null=True, blank=True)
|
||||||
post = models.ForeignKey(Post, verbose_name='岗位',
|
|
||||||
on_delete=models.SET_NULL, null=True, blank=True)
|
|
||||||
dept = models.ForeignKey(Dept, verbose_name='部门',
|
|
||||||
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)
|
||||||
|
|
|
@ -83,13 +83,22 @@ class EventSerializer(serializers.ModelSerializer):
|
||||||
fields = '__all__'
|
fields = '__all__'
|
||||||
|
|
||||||
|
|
||||||
|
class EventSimpleSerializer(serializers.ModelSerializer):
|
||||||
|
cates_ = EventCateSimpleSerializer(source='cates', read_only=True, many=True)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
model = Event
|
||||||
|
fields = ['id', 'cates_', 'voice_msg', 'create_time']
|
||||||
|
|
||||||
|
|
||||||
class EventHandleSerializer(CustomModelSerializer):
|
class EventHandleSerializer(CustomModelSerializer):
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Event
|
model = Event
|
||||||
fields = ['handle_desc']
|
fields = ['handle_desc', 'mark']
|
||||||
|
|
||||||
|
|
||||||
class RemindSerializer(CustomModelSerializer):
|
class RemindSerializer(CustomModelSerializer):
|
||||||
|
event_ = EventSimpleSerializer(source='event', read_only=True)
|
||||||
recipient_ = UserSimpleSerializer(source='recipient', read_only=True)
|
recipient_ = UserSimpleSerializer(source='recipient', read_only=True)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
|
|
|
@ -5,13 +5,13 @@ from apps.utils.sms import send_sms
|
||||||
import requests
|
import requests
|
||||||
from apps.am.models import Access, Area
|
from apps.am.models import Access, Area
|
||||||
from apps.am.tasks import cache_areas_info
|
from apps.am.tasks import cache_areas_info
|
||||||
from apps.ecm.models import AlgoChannel, Event, EventCate, Eventdo
|
from apps.ecm.models import AlgoChannel, Event, EventCate, Eventdo, NotifySetting, Remind
|
||||||
from apps.hrm.models import Employee
|
from apps.hrm.models import Employee
|
||||||
from apps.system.models import User
|
from apps.system.models import User
|
||||||
from apps.third.clients import xxClient
|
from apps.third.clients import xxClient
|
||||||
from apps.third.models import TDevice
|
from apps.third.models import TDevice
|
||||||
from apps.third.tapis import xxapis
|
from apps.third.tapis import xxapis
|
||||||
from apps.utils.queryset import get_child_queryset2
|
from apps.utils.queryset import get_child_queryset2, get_parent_queryset
|
||||||
from django.core.cache import cache
|
from django.core.cache import cache
|
||||||
import time
|
import time
|
||||||
import shapely.geometry
|
import shapely.geometry
|
||||||
|
@ -21,6 +21,8 @@ from django.conf import settings
|
||||||
import os
|
import os
|
||||||
from apps.utils.speech import generate_voice
|
from apps.utils.speech import generate_voice
|
||||||
from threading import Thread
|
from threading import Thread
|
||||||
|
|
||||||
|
from apps.vm.models import Visit
|
||||||
requests.packages.urllib3.disable_warnings()
|
requests.packages.urllib3.disable_warnings()
|
||||||
|
|
||||||
|
|
||||||
|
@ -76,8 +78,37 @@ def algo_handle(codes: list, data: dict):
|
||||||
return ['helmet']
|
return ['helmet']
|
||||||
|
|
||||||
|
|
||||||
|
def notify_event(event: Event):
|
||||||
|
"""事件后续处理:
|
||||||
|
|
||||||
|
Args:
|
||||||
|
event (Event): _description_
|
||||||
|
"""
|
||||||
|
# 生成通知文本
|
||||||
|
voice_msg = ''
|
||||||
|
ep = event.employee
|
||||||
|
if ep:
|
||||||
|
ep_name = ep.name
|
||||||
|
ep_type = '员工'
|
||||||
|
if ep.type == 'rempoyee':
|
||||||
|
ep_type = '相关方人员'
|
||||||
|
elif ep.type == 'visitor':
|
||||||
|
ep_type = '访客'
|
||||||
|
voice_msg = '位于{}的{}{},'.format(event.area.name, ep_type, ep_name)
|
||||||
|
else:
|
||||||
|
voice_msg = '位于{}的未知人员,'.format(event.area.name)
|
||||||
|
for i in event.cates.all():
|
||||||
|
voice_msg = voice_msg + i.name + ','
|
||||||
|
event.voice_msg = voice_msg + ',请及时处理'
|
||||||
|
event.save()
|
||||||
|
# 喇叭播放
|
||||||
|
Thread(target=save_voice_and_speak, args=(event,), daemon=True).start()
|
||||||
|
# 创建提醒
|
||||||
|
Thread(target=create_remind, args=(event,), daemon=True).start()
|
||||||
|
|
||||||
|
|
||||||
def save_voice_and_speak(event: Event):
|
def save_voice_and_speak(event: Event):
|
||||||
"""生成并保存语音地址并喇叭播放
|
"""生成语音同时喇叭播放
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
event (Event): _description_
|
event (Event): _description_
|
||||||
|
@ -99,11 +130,79 @@ def save_voice_and_speak(event: Event):
|
||||||
|
|
||||||
def create_remind(event: Event):
|
def create_remind(event: Event):
|
||||||
"""
|
"""
|
||||||
创建事件提醒并发送短信
|
创建事件提醒并发送短信/微信
|
||||||
"""
|
"""
|
||||||
if event.employee and event.employee.phone:
|
# 向当事人本人发送通知
|
||||||
t_sms = Thread(target=send_sms, args=(event.employee.phone, '1001', {'code': '5678'}), daemon=True)
|
# if event.employee and event.employee.phone:
|
||||||
t_sms.start()
|
# t_sms = Thread(target=send_sms, args=(event.employee.phone, '1001', {'code': '5678'}), daemon=True)
|
||||||
|
# t_sms.start()
|
||||||
|
# 查找所有提醒配置
|
||||||
|
n_s = NotifySetting.objects.filter(event_cate__in=event.cates.all()).order_by('sort')
|
||||||
|
area_level = event.area.level
|
||||||
|
for i in n_s:
|
||||||
|
if i.user and area_level >= i.filter_area_level:
|
||||||
|
Remind.objects.get_or_create(event=event, recipient=i.user,
|
||||||
|
defaults={
|
||||||
|
'event': event,
|
||||||
|
'recipient': i.user,
|
||||||
|
'notify_setting': i,
|
||||||
|
'can_handle': i.can_handle,
|
||||||
|
})
|
||||||
|
elif i.post and area_level >= i.filter_area_level:
|
||||||
|
qs = User.objects.filter(posts=i.post)
|
||||||
|
if i.filter_recipient == 20: # 当事人所在部门以上
|
||||||
|
if event.employee and event.employee.user:
|
||||||
|
qs = qs.filter(depts__in=get_parent_queryset(event.employee.user.belong_dept))
|
||||||
|
elif i.filter_recipient == 40: # 属地部门以上
|
||||||
|
if event.area.belong_dept:
|
||||||
|
qs = qs.filter(depts__in=get_parent_queryset(event.area.belong_dept))
|
||||||
|
for m in qs:
|
||||||
|
Remind.objects.get_or_create(event=event, recipient=m,
|
||||||
|
defaults={
|
||||||
|
'event': event,
|
||||||
|
'recipient': m,
|
||||||
|
'notify_setting': i,
|
||||||
|
'can_handle': i.can_handle,
|
||||||
|
})
|
||||||
|
elif i.variable and area_level >= i.filter_area_level:
|
||||||
|
if i.variable == 'self':
|
||||||
|
if event.employee and event.employee.user:
|
||||||
|
Remind.objects.get_or_create(event=event, recipient=event.employee.user,
|
||||||
|
defaults={
|
||||||
|
'event': event,
|
||||||
|
'recipient': event.employee.user,
|
||||||
|
'notify_setting': i,
|
||||||
|
'can_handle': i.can_handle,
|
||||||
|
})
|
||||||
|
elif i.variable == 'area_manager':
|
||||||
|
if event.area.manager:
|
||||||
|
Remind.objects.get_or_create(event=event, recipient=event.area.manager,
|
||||||
|
defaults={
|
||||||
|
'event': event,
|
||||||
|
'recipient': event.area.manager,
|
||||||
|
'notify_setting': i,
|
||||||
|
'can_handle': i.can_handle,
|
||||||
|
})
|
||||||
|
elif i.variable == 'visit_receptionist':
|
||||||
|
if event.employee and event.employee.type == 'visitor': # 确定是访客
|
||||||
|
visit = Visit.objects.filter(visitors__employee=event.employee, state=Visit.V_WORKING).first()
|
||||||
|
if visit:
|
||||||
|
Remind.objects.get_or_create(event=event, recipient=visit.receptionist,
|
||||||
|
defaults={
|
||||||
|
'event': event,
|
||||||
|
'recipient': visit.receptionist,
|
||||||
|
'notify_setting': i,
|
||||||
|
'can_handle': i.can_handle,
|
||||||
|
})
|
||||||
|
# 开始发送通知
|
||||||
|
for i in Remind.objects.filter(event=event):
|
||||||
|
if i.notify_setting.sms_enable:
|
||||||
|
if i.user.employee.phone:
|
||||||
|
Thread(target=send_sms, args=(i.user.employee.phone, '1001', {'code': '5678'}), daemon=True).start()
|
||||||
|
if i.notify_setting.wechat_enable:
|
||||||
|
pass
|
||||||
|
event.is_pushed = True
|
||||||
|
event.save()
|
||||||
|
|
||||||
|
|
||||||
def dispatch_dahua_event(data: dict):
|
def dispatch_dahua_event(data: dict):
|
||||||
|
@ -137,20 +236,6 @@ def dispatch_dahua_event(data: dict):
|
||||||
event.area = area
|
event.area = area
|
||||||
event.obj_cate = obj_cate
|
event.obj_cate = obj_cate
|
||||||
event.vchannel = vchannel
|
event.vchannel = vchannel
|
||||||
voice_msg = ''
|
|
||||||
if ep:
|
|
||||||
ep_name = ep.name
|
|
||||||
ep_type = '员工'
|
|
||||||
if ep.type == 'rempoyee':
|
|
||||||
ep_type = '相关方人员'
|
|
||||||
elif ep.type == 'visitor':
|
|
||||||
ep_type = '访客'
|
|
||||||
voice_msg = '位于{}的{}{},'.format(area.name, ep_type, ep_name)
|
|
||||||
else:
|
|
||||||
voice_msg = '位于{}的未知人员,'.format(area.name)
|
|
||||||
for i in ecs:
|
|
||||||
voice_msg = voice_msg + i.name + ','
|
|
||||||
event.voice_msg = voice_msg + ',请及时处理'
|
|
||||||
event.employee = ep
|
event.employee = ep
|
||||||
event.save()
|
event.save()
|
||||||
for i in ecs:
|
for i in ecs:
|
||||||
|
@ -159,10 +244,7 @@ def dispatch_dahua_event(data: dict):
|
||||||
'event': event
|
'event': event
|
||||||
})
|
})
|
||||||
if event:
|
if event:
|
||||||
t_v = Thread(target=save_voice_and_speak, args=(event,), daemon=True)
|
notify_event(event)
|
||||||
t_v.start()
|
|
||||||
t_r = Thread(target=create_remind, args=(event,), daemon=True)
|
|
||||||
t_r.start()
|
|
||||||
|
|
||||||
|
|
||||||
def dispatch_xunxi_event(data: dict):
|
def dispatch_xunxi_event(data: dict):
|
||||||
|
|
|
@ -71,6 +71,7 @@ class EventViewSet(ListModelMixin, RetrieveModelMixin, CustomGenericViewSet):
|
||||||
"""
|
"""
|
||||||
obj = self.get_object()
|
obj = self.get_object()
|
||||||
data = request.data
|
data = request.data
|
||||||
|
obj.mark = data.get('mark')
|
||||||
obj.handle_desc = data.get('handle_desc', '')
|
obj.handle_desc = data.get('handle_desc', '')
|
||||||
obj.handle_user = request.user
|
obj.handle_user = request.user
|
||||||
obj.handle_time = timezone.now()
|
obj.handle_time = timezone.now()
|
||||||
|
@ -82,6 +83,8 @@ class RemindViewSet(ListModelMixin, CustomGenericViewSet):
|
||||||
perms_map = {'get': 'envent:view'}
|
perms_map = {'get': 'envent:view'}
|
||||||
queryset = Remind.objects.all()
|
queryset = Remind.objects.all()
|
||||||
serializer_class = RemindSerializer
|
serializer_class = RemindSerializer
|
||||||
|
select_related_fields = ['recipient', 'event']
|
||||||
|
prefetch_related_fields = ['event__cates']
|
||||||
|
|
||||||
@action(methods=['get'], detail=False, perms_map={'get': '*'})
|
@action(methods=['get'], detail=False, perms_map={'get': '*'})
|
||||||
def my(self, request, *args, **kwargs):
|
def my(self, request, *args, **kwargs):
|
||||||
|
|
|
@ -41,6 +41,7 @@ class Visit(CommonBModel):
|
||||||
leave_time = models.DateTimeField('离开时间')
|
leave_time = models.DateTimeField('离开时间')
|
||||||
count_people = models.PositiveSmallIntegerField('来访人数', null=True, blank=True)
|
count_people = models.PositiveSmallIntegerField('来访人数', null=True, blank=True)
|
||||||
receptionist = models.ForeignKey(User, verbose_name='接待人', on_delete=models.CASCADE)
|
receptionist = models.ForeignKey(User, verbose_name='接待人', on_delete=models.CASCADE)
|
||||||
|
visitors = models.ManyToManyField('vm.visitor', through='vm.vpeople', related_name='v_visitors')
|
||||||
# create_by 创建人
|
# create_by 创建人
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue