301 lines
16 KiB
Python
Executable File
301 lines
16 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.develop.serializers import CleanDataSerializer, GenerateVoiceSerializer, SendSmsSerializer, \
|
|
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 create_remind, notify_event
|
|
from apps.system.tasks import show
|
|
from apps.third.clients import dhClient
|
|
from apps.utils.sms import send_sms
|
|
from apps.utils.speech import generate_voice
|
|
|
|
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
|
|
# 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}
|
|
dispatch_dahua_event(data=data)
|
|
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()
|