factory/apps/develop/views.py

405 lines
21 KiB
Python
Executable File

from rest_framework.views import APIView
from rest_framework.permissions import IsAdminUser
from rest_framework.response import Response
from rest_framework.serializers import Serializer
from rest_framework.decorators import action
from apps.am.models import Area
from apps.develop.serializers import AreaManSerializer, CleanDataSerializer, GenerateVoiceSerializer, SendSmsSerializer, SpeakerSerializer, \
TestTaskSerializer, TestAlgoSerializer
from apps.develop.tasks import backup_database, backup_media, reload_web_git, reload_server_git, reload_server_only
from rest_framework.exceptions import APIException
from apps.ecm.service import check_not_in_place, create_remind, handle_xx_event, loc_change, notify_event, rail_in, snap_and_analyse
from apps.ecm.tasks import opl_task, update_count_people
from apps.opm.models import Opl
from apps.system.tasks import show
from apps.third.clients import dhClient
from apps.third.models import TDevice
from apps.utils.sms import send_sms
from apps.utils.speech import generate_voice
from apps.third.clients import spClient
from apps.utils.viewsets import CustomGenericViewSet
from apps.utils.wx import wxClient
from apps.wf.models import State, Transition, Workflow
from django.db import transaction
from apps.utils.snowflake import idWorker
from django.core.cache import cache
# Create your views here.
class ReloadServerGit(APIView):
authentication_classes = []
permission_classes = []
def post(self, request):
"""
拉取后端代码并重启服务
拉取后端代码并重启服务
"""
reload_server_git.delay()
return Response()
# if completed.returncode == 0:
# return Response()
# else:
# from server.settings import myLogger
# myLogger.error(completed)
# raise ParseError(completed.stderr)
class ReloadClientGit(APIView):
authentication_classes = []
permission_classes = []
def post(self, request):
"""
拉取前端代码并打包
拉取前端代码并打包
"""
reload_web_git.delay()
return Response()
# completed = reload_web_git()
# if completed.returncode == 0:
# return Response()
# else:
# raise APIException(completed.stdout)
class ReloadServerOnly(APIView):
permission_classes = [IsAdminUser]
def post(self, request):
"""
仅重启服务
仅重启服务
"""
completed = reload_server_only()
if completed.returncode == 0:
return Response()
else:
raise APIException(completed.stdout)
class BackupDatabase(APIView):
permission_classes = [IsAdminUser]
def post(self, request):
"""
备份数据库到指定位置
备份数据库到指定位置
"""
err_str = backup_database()
if err_str:
raise APIException(err_str)
return Response()
class BackupMedia(APIView):
permission_classes = [IsAdminUser]
def post(self, request):
"""
备份资源到指定位置
备份资源到指定位置
"""
err_str = backup_media()
if err_str:
raise APIException(err_str)
return Response()
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)
@action(methods=['post'], detail=False, serializer_class=GenerateVoiceSerializer)
def generate_voice(self, request, pk=None):
"""文字转语音测试
文字转语音测试
"""
serializer = GenerateVoiceSerializer(data=request.data)
serializer.is_valid(raise_exception=True)
vdata = serializer.validated_data
res = generate_voice(**vdata)
return Response(res)
@action(methods=['post'], detail=False, serializer_class=TestTaskSerializer)
def task(self, request, pk=None):
"""任务派发测试
任务派发测试
"""
serializer = TestTaskSerializer(data=request.data)
serializer.is_valid(raise_exception=True)
vdata = serializer.validated_data
ret = {}
task = show.delay(*vdata.get('args', []), **vdata.get('kwargs', {}))
ret['task_id'] = task.task_id
# from celery.app.control import Control
# from server.celery import app
# celery_control = Control(app=app)
# # 关闭作业监控任务
# res = celery_control.revoke(task.task_id, terminate=True)
return Response(ret)
@action(methods=['post'], detail=False, serializer_class=Serializer)
def remind_event(self, request, pk=None):
"""测试事件推送
测试事件推送
"""
from apps.ecm.models import Event
event = Event.objects.get(id='1562718567894487040')
create_remind(event, params={'area': '生产车间', 'employee': '访客石非凡', 'event': '未带安全帽'})
return Response()
@action(methods=['post'], detail=False, serializer_class=TestAlgoSerializer)
def test_algo(self, request, pk=None):
"""测试算法1
测试算法1
"""
from apps.ai.main import ai_analyse
face_img = dhClient.get_full_pic(path=request.data['face_img'])
global_img = dhClient.get_full_pic(path=request.data['global_img'])
ret = ai_analyse(codes=['helmet'],
face_img=face_img,
global_img=global_img)
return Response({'result': ret.keys(), 'face_img': face_img, 'global_img': global_img})
@action(methods=['post'], detail=False, serializer_class=Serializer)
def test_algo_full(self, request, pk=None):
"""测试算法2
测试算法2
"""
from apps.ecm.service import dispatch_dahua_event
data = {'id': None, 'category': 'alarm', 'method': 'alarm.msg', 'info': {'orgName': '河北省', 'alarmPictureSize': '885977', 'nodeCode': '1002182$1$0$0', 'deviceCode': '1002182', 'alarmCode': '{B55A1489-0064-8D42-B6F4-EFF2DE1DA9B1}', 'alarmPicture': '6ad010cf-ce45-11ec-9715-e4246c7d1635/20220831/1/dsf_3c4ef3fe-290f-11ed-884a-e4246c7d1635_55425449_56311426.jpg', 'nodeType': 2, 'deviceName': '192.168.10.155',
'alarmDate': '1661942981', 'alarmGrade': 2, 'isSave': True, 'unitType': 1, 'unitSeq': 0, 'extend': {'params': {'ObjectType': 'Human', 'GroupId': 30.0, 'ObjectSubType': ''}, 'objectSubType': ''}, 'alarmType': 964, 'channelSeq': 0, 'orgCode': '001', 'channelName': '192.168.10.155_视频通道_1', 'alarmStat': 1, 'isEvent': True}, 'subsystem': 'admin', 'userIds': None, 'sid': None, 'domainId': None, 'infoArray': None, 'protocol': None}
data = {'id': 1662026969203, 'category': 'alarm', 'method': 'alarm.msg', 'info': {'orgName': '曲阳县金隅水泥厂', 'nodeCode': '1000038$1$0$24', 'deviceCode': '1000038', 'alarmCode': '44df73ba-a423-4479-af70-1f930b00a7e0', 'alarmPicture': '6ad010cf-ce45-11ec-9715-e4246c7d1635/20220901/1/dsf_80fed821-29c9-11ed-884a-e4246c7d1635_27257520_27264993.jpg', 'nodeType': 2, 'alarmDate': '1662026965', 'alarmGrade': 2, 'isSave': True, 'extend': {'faceImageUrl': ['6ad010cf-ce45-11ec-9715-e4246c7d1635/20220901/1/dsf_80fed821-29c9-11ed-884a-e4246c7d1635_27257520_27264993.jpg'], 'glass': 0, 'beard': 0, 'candidateInfo': [{'birthday': '2022-8-24', 'faceImageUrl': [
'6ad010cf-ce45-11ec-9715-e4246c7d1635/20220901/1/dsf_80fed821-29c9-11ed-884a-e4246c7d1635_27264993_27338395.jpg'], 'groupName': '全体人员', 'similarity': 97, 'sex': 1, 'cardType': 1, 'name': '曹前明', 'devPersonId': '48', 'id': '342422199004040175', 'type': 0}], 'sex': 0, 'occurrenceCount': 0, 'deviceCode': '1000038', 'globalScenePicUrl': '6ad010cf-ce45-11ec-9715-e4246c7d1635/20220901/1/dsf_80fed821-29c9-11ed-884a-e4246c7d1635_26915031_27257520.jpg', 'eye': 0, 'alarmType': 1001003, 'perFlag': -1, 'mouth': 0, 'feature': [], 'isHit': True, 'channelSeq': 24, 'szSerialUUID': '', 'channelName': '窑头平台值班室', 'beginTime': 1662026965, 'endTime': 1662026965, 'age': -1, 'mask': 0}, 'unitType': 1, 'alarmType': 1001003, 'channelSeq': 24, 'orgCode': '001001001', 'channelName': '窑头平台值班室', 'alarmStat': 1, 'isEvent': True}, 'subsystem': 'evo-face', 'userIds': None, 'sid': None, 'domainId': None, 'infoArray': None, 'protocol': None}
# data = {'id': 1662032288888, 'category': 'alarm', 'method': 'alarm.msg', 'info': {'orgName': '曲阳县金隅水泥厂', 'nodeCode': '1000038$1$0$25', 'deviceCode': '1000038', 'alarmCode': 'c3df59cd-59d0-4f46-a32c-d2bf7778b37d', 'alarmPicture': '6ad010cf-ce45-11ec-9715-e4246c7d1635/20220901/1/dsf_80fed821-29c9-11ed-884a-e4246c7d1635_44280859_44288676.jpg', 'nodeType': 2, 'alarmDate': '1662032288', 'alarmGrade': 2, 'isSave': True, 'extend': {'faceImageUrl': ['6ad010cf-ce45-11ec-9715-e4246c7d1635/20220901/1/dsf_80fed821-29c9-11ed-884a-e4246c7d1635_44280859_44288676.jpg'], 'glass': 0, 'beard': 0, 'candidateInfo': [], 'sex': 0, 'occurrenceCount': 0, 'deviceCode': '1000038', 'globalScenePicUrl': '6ad010cf-ce45-11ec-9715-e4246c7d1635/20220901/1/dsf_80fed821-29c9-11ed-884a-e4246c7d1635_44127174_44280859.jpg', 'eye': 0, 'alarmType': 1001000, 'perFlag': -1, 'mouth': 0, 'feature': [], 'isHit': True, 'channelSeq': 25, 'szSerialUUID': '', 'channelName': '公司大门口', 'beginTime': 1662032284, 'endTime': 1662032284, 'age': -1, 'mask': 0}, 'unitType': 1, 'alarmType': 1001000, 'channelSeq': 25, 'orgCode': '001001001', 'channelName': '公司大门口', 'alarmStat': 1, 'isEvent': True}, 'subsystem': 'evo-face', 'userIds': None, 'sid': None, 'domainId': None, 'infoArray': None, 'protocol': None}
data = {'id': 1662099853937, 'category': 'alarm', 'method': 'alarm.msg', 'info': {'orgName': '曲阳县金隅水泥厂', 'nodeCode': '1000038$1$0$24', 'deviceCode': '1000038', 'alarmCode': 'c520e09f-4b5d-4d04-be7b-005386a9b835', 'alarmPicture': '6ad010cf-ce45-11ec-9715-e4246c7d1635/20220902/1/dsf_a880f743-2a7e-11ed-884a-e4246c7d1635_57321861_57329128.jpg', 'nodeType': 2, 'alarmDate': '1662099849', 'alarmGrade': 2, 'isSave': True, 'extend': {'faceImageUrl': ['6ad010cf-ce45-11ec-9715-e4246c7d1635/20220902/1/dsf_a880f743-2a7e-11ed-884a-e4246c7d1635_57321861_57329128.jpg'], 'glass': 0, 'beard': 0, 'candidateInfo': [{'birthday': '2022-8-24', 'faceImageUrl': [
'6ad010cf-ce45-11ec-9715-e4246c7d1635/20220902/1/dsf_a880f743-2a7e-11ed-884a-e4246c7d1635_57329128_57402530.jpg'], 'groupName': '全体人员', 'similarity': 99, 'sex': 1, 'cardType': 1, 'name': '曹前明', 'devPersonId': '48', 'id': '342422199004040175', 'type': 0}], 'sex': 0, 'occurrenceCount': 0, 'deviceCode': '1000038', 'globalScenePicUrl': '6ad010cf-ce45-11ec-9715-e4246c7d1635/20220902/1/dsf_a880f743-2a7e-11ed-884a-e4246c7d1635_56995669_57321861.jpg', 'eye': 0, 'alarmType': 1001003, 'perFlag': -1, 'mouth': 0, 'feature': [], 'isHit': True, 'channelSeq': 24, 'szSerialUUID': '', 'channelName': '窑头平台值班室', 'beginTime': 1662099849, 'endTime': 1662099849, 'age': -1, 'mask': 0}, 'unitType': 1, 'alarmType': 1001003, 'channelSeq': 24, 'orgCode': '001001001', 'channelName': '窑头平台值班室', 'alarmStat': 1, 'isEvent': True}, 'subsystem': 'evo-face', 'userIds': None, 'sid': None, 'domainId': None, 'infoArray': None, 'protocol': None}
data = {'id': 1662786479984, 'category': 'alarm', 'method': 'alarm.msg', 'info': {'orgName': '曲阳县金隅水泥厂', 'nodeCode': '1000038$1$0$24', 'deviceCode': '1000038', 'alarmCode': 'b672731c-4807-47e6-a468-c5f85a68e87d', 'alarmPicture': '6ad010cf-ce45-11ec-9715-e4246c7d1635/20220910/1/dsf_2c1150b4-309b-11ed-884a-e4246c7d1635_45588364_45596445.jpg', 'nodeType': 2, 'alarmDate': '1662786477', 'alarmGrade': 2, 'isSave': True, 'extend': {'faceImageUrl': ['6ad010cf-ce45-11ec-9715-e4246c7d1635/20220910/1/dsf_2c1150b4-309b-11ed-884a-e4246c7d1635_45588364_45596445.jpg'], 'glass': 0, 'beard': 0, 'candidateInfo': [{'birthday': '2022-8-24', 'faceImageUrl': [
'6ad010cf-ce45-11ec-9715-e4246c7d1635/20220910/1/dsf_2c1150b4-309b-11ed-884a-e4246c7d1635_45596445_45673444.jpg'], 'groupName': '全体人员', 'similarity': 81, 'sex': 2, 'cardType': 1, 'name': '石静', 'devPersonId': '47', 'id': '371324199502156548', 'type': 0}], 'sex': 0, 'occurrenceCount': 0, 'deviceCode': '1000038', 'globalScenePicUrl': '6ad010cf-ce45-11ec-9715-e4246c7d1635/20220910/1/dsf_2c1150b4-309b-11ed-884a-e4246c7d1635_45288246_45588364.jpg', 'eye': 0, 'alarmType': 1001003, 'perFlag': -1, 'mouth': 0, 'feature': [], 'isHit': True, 'channelSeq': 24, 'szSerialUUID': '', 'channelName': '窑头平台值班室', 'beginTime': 1662786477, 'endTime': 1662786477, 'age': -1, 'mask': 0}, 'unitType': 1, 'alarmType': 1001003, 'channelSeq': 24, 'orgCode': '001001001', 'channelName': '窑头平台值班室', 'alarmStat': 1, 'isEvent': True}, 'subsystem': 'evo-face', 'userIds': None, 'sid': None, 'domainId': None, 'infoArray': None, 'protocol': None}
dispatch_dahua_event(data=data)
return Response()
@action(methods=['post'], detail=False, serializer_class=Serializer)
def test_snap(self, request, pk=None):
"""测试抓图识别
测试抓图识别
"""
code = request.data['code']
vc = TDevice.objects.get(code=code)
snap_and_analyse(vc, ['fire1'], Opl.objects.get(id='1568880208688320512'))
return Response()
@action(methods=['post'], detail=False, serializer_class=Serializer)
def test_snap_task(self, request, pk=None):
"""测试抓图识别任务
测试抓图识别任务
"""
code = request.data['code']
task = opl_task.delay([code], '1568880208688320512')
task_id = task.task_id
test_snap_list = cache.get('test_snap_task', [])
test_snap_list.append(task_id)
cache.set('test_snap_task', test_snap_list)
return Response({'test_snap_task': task_id})
@action(methods=['post'], detail=False, serializer_class=Serializer)
def close_snap_task(self, request, pk=None):
"""关闭抓图识别任务
关闭抓图识别任务
"""
test_snap_list = cache.get('test_snap_task', [])
from celery.app.control import Control
from server.celery import app
celery_control = Control(app=app)
# 关闭作业视频监控任务
for i in test_snap_list:
celery_control.revoke(i, terminate=True)
cache.set('test_snap_task', [])
return Response()
@action(methods=['post'], detail=False, serializer_class=Serializer)
def test_loc_change(self, request, pk=None):
"""位置信息改变
位置信息改变
"""
data = {'buildId': '204878', 'floorNo': 'Floor1', 'userId': '1918B20019F5', 'timestampMillisecond': 1663064881805, 'xMillimeter': 316654, 'yMillimeter': 361852,
'zMillimeter': 0, 'pointProperties': 0, 'locationType': 1, 'status': 2, 'src': 0, 'longitude': 114.7395738002794, 'latitude': 38.621726856149856}
res = loc_change(data=data)
return Response(res)
@action(methods=['post'], detail=False, serializer_class=Serializer)
def test_one_key_alarm(self, request, pk=None):
"""一键报警事件
一键报警事件
"""
data = {'buildId': '204878', 'mac': '1918B20019F5',
'time': 1663067822887, 'event': 'alarm', 'alarmTypeName': '一键报警'}
res = handle_xx_event(name='one_key_alarm', data=data)
return Response(res)
@action(methods=['post'], detail=False, serializer_class=Serializer)
def test_rail_in(self, request, pk=None):
"""测试围栏进入
测试围栏进入
"""
data = {'railId': '80fe94bff7b240aa893976965197487c', 'userId': '1918B20019F5',"railName":"二道门",
'time': 1663067822887, "type":1, "buildId": "204878", "floorNo":"Floor1"}
res = rail_in(data=data)
return Response(res)
@action(methods=['post'], detail=False, serializer_class=AreaManSerializer)
def test_area_man(self, request, pk=None):
"""测试区域超员/缺员事件
测试区域超员/缺员事件
"""
res = update_count_people(i=Area.objects.get(id=request.data['area']))
return Response(res)
@action(methods=['post'], detail=False, serializer_class=Serializer)
def test_not_in_place(self, request, pk=None):
check_not_in_place(Opl.objects.get(id='1568880208688320512'))
return Response()
@action(methods=['post'], detail=False, serializer_class=SpeakerSerializer)
def test_speaker(self, request, pk=None):
spClient.speak(path='/media/2022/09/11/349b3451-50b9-4501-aded-c85a76967920.mp3', sns=request.data['sns'],
v_num=2)
return Response()
@action(methods=['post'], detail=False, serializer_class=Serializer)
def send_wx_msg(self, request, pk=None):
"""微信模板消息发送测试
微信模板消息发送测试
"""
data = {
"touser": "ocAnm5vab6QGOnf2dqpuUZGJ0xyw",
"template_id": "wczl-hB_bs8CpxwO8_KZuogSTPFXqhBxf8C5HjKl2M4",
"url": "http://weixin.qq.com/download",
# "miniprogram":{
# "appid":"xiaochengxuappid12345",
# "pagepath":"index?foo=bar"
# },
"client_msg_id": "MSG_000001",
"data": {
"first": {
"value": "恭喜你购买成功!",
"color": "#173177"
},
}
}
# url = 'https://api.weixin.qq.com/cgi-bin/message/template/send?access_token'+wxClient.token
# print(url)
# rt = requests.post(url=url, json=data).text
res = wxClient.send_tem_msg(data=data)
return Response(res)
@action(methods=['post'], detail=False, serializer_class=Serializer, permission_classes=[])
@transaction.atomic
def correct_data(self, request, pk=None):
"""修正数据
修正数据
"""
for i in Transition.objects.all():
if i.condition_expression:
pass
else:
i.condition_expression = []
i.save()
# wf = Workflow.objects.get(id='1544859644185415680')
# objs = Workflow.objects.filter(key__istartswith='opl_').exclude(id='1544859644185415680')
# for i in objs:
# for s in State.objects.filter(workflow=wf):
# sta = State()
# sta.id = idWorker.get_id()
# sta.workflow = i
# for f in State._meta.fields:
# if f.name not in ['workflow', 'create_time', 'update_time', 'id']:
# setattr(sta, f.name, getattr(s, f.name))
# sta.save()
# for t in Transition.objects.filter(workflow=wf):
# tr = Transition()
# tr.id = idWorker.get_id()
# tr.workflow = i
# for f in Transition._meta.fields:
# if f.name not in ['workflow', 'create_time', 'update_time', 'id']:
# setattr(tr, f.name, getattr(t, f.name))
# tr.save()
return Response()
@action(methods=['post'], detail=False, serializer_class=CleanDataSerializer, permission_classes=[IsAdminUser])
def clean_data(self, request, pk=None):
"""清空数据
清空数据
"""
datas = request.data['datas']
from apps.wf.models import Ticket
from apps.hrm.models import Employee
from apps.system.models import User, Dept
if 'visit' in datas:
# 访客
from apps.vm.models import Visit, Visitor
Visit.objects.get_queryset(all=True).delete(soft=False)
Visitor.objects.get_queryset(all=True).delete(soft=False)
Ticket.objects.get_queryset(all=True).filter(workflow__key='visit').delete(soft=False)
Employee.objects.get_queryset(all=True).filter(type='visitor').delete(soft=False)
User.objects.get_queryset(all=True).filter(type='visitor').delete(soft=False)
if 'rpm' in datas:
from apps.rpm.models import Rparty
Rparty.objects.get_queryset(all=True).delete(soft=False)
Ticket.objects.get_queryset(all=True).filter(workflow__key='rpj').delete(soft=False)
Employee.objects.get_queryset(all=True).filter(type='remployee').delete(soft=False)
User.objects.get_queryset(all=True).filter(type='remployee').delete(soft=False)
Dept.objects.get_queryset(all=True).filter(type='rparty').delete(soft=False)
if 'event' in datas:
from apps.ecm.models import Event
Event.objects.all().delete()
if 'opm' in datas:
from apps.opm.models import Operation
Operation.objects.all().delete()
Ticket.objects.get_queryset(all=True).filter(workflow__key__contains='opl_').delete(soft=False)
if 'ptask' in datas:
from django_celery_results.models import TaskResult
TaskResult.objects.filter(task_name__in=['apps.vm.tasks.close_visit_by_leave_time',
'apps.rpm.tasks.close_rpj_by_leave_time']).delete()
return Response()