Compare commits

...

4 Commits
main ... main

Author SHA1 Message Date
kongfp 951caadfb1 fix bugs 11 months ago
kongfp 6a1552831a fix bugs 11 months ago
kongfp 6888645e24 修改启动脚本 11 months ago
kongfp 930338a139 add workshop and device 11 months ago

1
.gitignore vendored

@ -11,6 +11,7 @@ __pycache__/
migrations migrations
pictures pictures
avatars avatars
locations
# Distribution / packaging # Distribution / packaging
.Python .Python

@ -336,3 +336,32 @@ class MessageModel(models.Model):
class Meta: class Meta:
db_table = "message" db_table = "message"
class WorkshopModel(models.Model):
CODE = ((0, ""), (1, ""))
name = models.CharField(max_length=1024, default="", verbose_name="位置名称", null=True, blank=True)
picture = models.ImageField(upload_to='locations', verbose_name="位置图片")
status = models.IntegerField(verbose_name="是否删除", default=0, choices=CODE)
create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间', null=True)
update_time = models.DateTimeField(auto_now=True, verbose_name='更新时间', null=True)
class Meta:
db_table = "workshop"
class WorkshopDeviceModel(models.Model):
CODE = ((0, ""), (1, ""))
workshop_id = models.IntegerField(verbose_name="布点id", null=False)
device_id = models.IntegerField(verbose_name="设备id", null=False)
x_ordinate = models.CharField(max_length=128, verbose_name="横坐标", null=False)
y_ordinate = models.CharField(max_length=128, verbose_name="纵坐标", null=False)
icon = models.CharField(max_length=8, verbose_name="图标", null=True)
status = models.IntegerField(verbose_name="是否删除", default=0, choices=CODE)
create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间', null=True)
update_time = models.DateTimeField(auto_now=True, verbose_name='更新时间', null=True)
class Meta:
db_table = "workshop_device"

@ -1,6 +1,7 @@
import copy import copy
import datetime import datetime
import json import json
import os
import random import random
import re import re
from decimal import Decimal from decimal import Decimal
@ -13,7 +14,8 @@ from app import consts, shortuuid
from app.models import AuthUser, ServerModel, AlgModelModel, ModelClassificationModel, EnterpriseModel, \ from app.models import AuthUser, ServerModel, AlgModelModel, ModelClassificationModel, EnterpriseModel, \
EnterpriseDeviceModel, DeviceClassificationModel, WarningStatisticsModel, EnterpriseNodeModel, ComputeConfigModel, \ EnterpriseDeviceModel, DeviceClassificationModel, WarningStatisticsModel, EnterpriseNodeModel, ComputeConfigModel, \
ModelVersionModel, EnterpriseAlertDeviceModel, ModelHubModel, EnterpriseBusiModelModel, \ ModelVersionModel, EnterpriseAlertDeviceModel, ModelHubModel, EnterpriseBusiModelModel, \
EnterpriseBusiModelNodeModel, EnterpriseBusiModelNodeDeviceModel, ServerLogModel, FilesModel, MessageModel EnterpriseBusiModelNodeModel, EnterpriseBusiModelNodeDeviceModel, ServerLogModel, FilesModel, MessageModel, \
WorkshopModel, WorkshopDeviceModel
import logging import logging
logger = logging.getLogger('mylogger') logger = logging.getLogger('mylogger')
@ -489,3 +491,51 @@ class MessageSerializer(serializers.ModelSerializer):
ret = super().to_internal_value(data) ret = super().to_internal_value(data)
return ret return ret
class WorkshopSerializer(serializers.ModelSerializer):
class Meta:
model = WorkshopModel
fields = "__all__"
def to_representation(self, instance):
ret = super().to_representation(instance)
ret["picture"] = ret["picture"].replace("127.0.0.1", os.getenv("SERVER_IP", "192.168.10.21:8000"))
return ret
def to_internal_value(self, data):
ret = super().to_internal_value(data)
return ret
class WorkshopDeviceSerializer(serializers.ModelSerializer):
class Meta:
model = WorkshopDeviceModel
fields = "__all__"
def to_representation(self, instance):
ret = super().to_representation(instance)
try:
device_obj = EnterpriseDeviceModel.objects.filter(id=instance.device_id).get()
except:
device_obj = None
ret["device_name"] = device_obj.name if device_obj else None
try:
workshop_obj = WorkshopModel.objects.filter(id=instance.workshop_id).get()
except:
workshop_obj = None
ret["workshop_name"] = workshop_obj.name if workshop_obj else None
return ret
def to_internal_value(self, data):
ret = super().to_internal_value(data)
return ret

@ -28,6 +28,8 @@ urlpatterns = [
views.EnterpriseBusiModelNodeDeviceModelViewSet.as_view({'post': 'create', "get": "list"})), views.EnterpriseBusiModelNodeDeviceModelViewSet.as_view({'post': 'create', "get": "list"})),
path('warning_statistics/', views.WarningStatisticsModelViewSet.as_view({'post': 'create', "get": "list"})), path('warning_statistics/', views.WarningStatisticsModelViewSet.as_view({'post': 'create', "get": "list"})),
path('get_warning_names/', views.WarningStatisticsModelViewSet.as_view({"get": "get_warning_names"})),
path('get_warning_types/', views.WarningStatisticsModelViewSet.as_view({"get": "get_warning_types"})),
path('compute_config/', views.ComputeConfigModelViewSet.as_view({'post': 'create', "get": "list"})), path('compute_config/', views.ComputeConfigModelViewSet.as_view({'post': 'create', "get": "list"})),
path('files/', views.FilesModelViewSet.as_view({'post': 'create', "get": "list", "delete": "destroy"})), path('files/', views.FilesModelViewSet.as_view({'post': 'create', "get": "list", "delete": "destroy"})),
@ -39,4 +41,7 @@ urlpatterns = [
path('warnings_and_message/', views.WarningsAndMessageModelViewSet.as_view({'get': 'list'})), path('warnings_and_message/', views.WarningsAndMessageModelViewSet.as_view({'get': 'list'})),
path('classify_warnings/', views.ClassifyWarningsModelViewSet.as_view({'get': 'list'})), path('classify_warnings/', views.ClassifyWarningsModelViewSet.as_view({'get': 'list'})),
path('workshops/', views.WorkshopModelViewSet.as_view({'post': 'create', "get": "list"})),
path('workshop_devices/', views.WorkshopDeviceModelViewSet.as_view({'post': 'create', "get": "list", "delete": "destroy"})),
path('get_devices/', views.WorkshopDeviceModelViewSet.as_view({"get": "get_devices"})),
] ]

@ -29,11 +29,12 @@ class UserViewSet(ModelViewSet):
password = data.get('password') password = data.get('password')
# 验证是否过期 # 验证是否过期
enterprise_obj = EnterpriseModel.objects.filter(account=username, pwd=password).last() # enterprise_obj = EnterpriseModel.objects.filter(account=username, pwd=password).last()
enterprise_obj = EnterpriseModel.objects.last()
if not enterprise_obj: if not enterprise_obj:
response = { response = {
'success': False, 'success': False,
'msg': "该账号不存在", 'msg': "企业不存在",
'data': { 'data': {
'username': None, 'username': None,
'roles': [], 'roles': [],
@ -65,7 +66,7 @@ class UserViewSet(ModelViewSet):
except Exception as e: except Exception as e:
response = { response = {
'success': False, 'success': False,
'msg': str(e), 'msg': "用户登录失败,请查证用户名及密码",
'data': { 'data': {
'username': None, 'username': None,
'roles': [], 'roles': [],

@ -1,3 +1,4 @@
import datetime
import json import json
import logging import logging
import random import random
@ -13,11 +14,11 @@ from app.serializers import ServerSerializer, AlgModelSerializer, EnterpriseSeri
DeviceClassificationSerializer, WarningStatisticsSerializer, EnterpriseNodeSerializer, ComputeConfigSerializer, \ DeviceClassificationSerializer, WarningStatisticsSerializer, EnterpriseNodeSerializer, ComputeConfigSerializer, \
ModelVersionSerializer, EnterpriseAlertDeviceSerializer, ModelHubSerializer, EnterpriseBusiModelSerializer, \ ModelVersionSerializer, EnterpriseAlertDeviceSerializer, ModelHubSerializer, EnterpriseBusiModelSerializer, \
EnterpriseBusiModelNodeSerializer, EnterpriseBusiModelNodeDeviceSerializer, ServerLogSerializer, \ EnterpriseBusiModelNodeSerializer, EnterpriseBusiModelNodeDeviceSerializer, ServerLogSerializer, \
ModelClassificationSerializer, FilesSerializer, MessageSerializer ModelClassificationSerializer, FilesSerializer, MessageSerializer, WorkshopSerializer, WorkshopDeviceSerializer
from app.models import ServerModel, AlgModelModel, EnterpriseModel, EnterpriseDeviceModel, DeviceClassificationModel, \ from app.models import ServerModel, AlgModelModel, EnterpriseModel, EnterpriseDeviceModel, DeviceClassificationModel, \
WarningStatisticsModel, EnterpriseNodeModel, ComputeConfigModel, ModelVersionModel, EnterpriseAlertDeviceModel, \ WarningStatisticsModel, EnterpriseNodeModel, ComputeConfigModel, ModelVersionModel, EnterpriseAlertDeviceModel, \
ModelHubModel, EnterpriseBusiModelModel, EnterpriseBusiModelNodeModel, EnterpriseBusiModelNodeDeviceModel, \ ModelHubModel, EnterpriseBusiModelModel, EnterpriseBusiModelNodeModel, EnterpriseBusiModelNodeDeviceModel, \
ServerLogModel, ModelClassificationModel, FilesModel, MessageModel ServerLogModel, ModelClassificationModel, FilesModel, MessageModel, WorkshopModel, WorkshopDeviceModel
logger = logging.getLogger('mylogger') logger = logging.getLogger('mylogger')
@ -1015,7 +1016,7 @@ class WarningStatisticsModelViewSet(ModelViewSet):
device_suid = data.get("device_suid") device_suid = data.get("device_suid")
warning_type = data.get("warning_type") warning_type = data.get("warning_type")
start_trigger_time = data.get("start_time") start_trigger_time = data.get("start_time")
end_trigger_time = data.get("end_time") # end_trigger_time = data.get("end_time")
if warning_level: if warning_level:
self.queryset = self.queryset.filter(warning_level=warning_level) self.queryset = self.queryset.filter(warning_level=warning_level)
@ -1045,7 +1046,16 @@ class WarningStatisticsModelViewSet(ModelViewSet):
self.queryset = self.queryset.filter(warning_type=warning_type) self.queryset = self.queryset.filter(warning_type=warning_type)
if start_trigger_time: if start_trigger_time:
self.queryset = self.queryset.filter(trigger_time__in=[start_trigger_time, end_trigger_time])
try:
start_datetime = datetime.datetime.strptime(start_trigger_time, "%Y-%m-%d")
except Exception as e:
logger.error(f"查询告警时间格式报错{e},参数为:{start_trigger_time}")
return Response({"data": None, "msg": "时间格式不正确", "success": False, "status": 400})
end_datetime = start_datetime + datetime.timedelta(days=1)
self.queryset = self.queryset.filter(trigger_time__range=[start_datetime, end_datetime])
if not (obj_id or obj_suid): if not (obj_id or obj_suid):
return Response({ return Response({
@ -1073,6 +1083,26 @@ class WarningStatisticsModelViewSet(ModelViewSet):
"status": 200 "status": 200
}) })
def get_warning_names(self, request, *args, **kwargs):
warning_names = self.queryset.values_list("warning_name", flat=True).order_by("warning_name").distinct()
return Response({
"data": warning_names,
"msg": None,
"success": True,
"status": 200
})
def get_warning_types(self, request, *args, **kwargs):
warning_types = self.queryset.values_list('warning_type', flat=True).order_by("warning_type").distinct()
return Response({
"data": warning_types,
"msg": None,
"success": True,
"status": 200
})
class EnterpriseNodeModelViewSet(ModelViewSet): class EnterpriseNodeModelViewSet(ModelViewSet):
# 查询类 # 查询类
@ -2063,3 +2093,218 @@ class ClassifyWarningsModelViewSet(ModelViewSet):
"success": True, "success": True,
"status": 200 "status": 200
}) })
class WorkshopModelViewSet(ModelViewSet):
# 查询类
queryset = WorkshopModel.objects.all().order_by("id")
# 序列化类
serializer_class = WorkshopSerializer
# 分页类
pagination_class = MyPageNumberPagination
def list(self, request, *args, **kwargs):
data = request.query_params
obj_id = data.get("id")
status = data.get("status", 0)
if status in (0, 1):
self.queryset = self.queryset.filter(status=status)
if not obj_id:
return Response({
"data": super().list(request, *args, **kwargs).data,
"msg": None,
"success": True,
"status": 200
})
else:
try:
instance = self.queryset.filter(id=obj_id).get()
except Exception as e:
logger.error(f"查询对象报错:{e}")
return Response({"msg": "该对象不存在", "status": 400, "success": False, "data": None})
serializer = self.get_serializer(instance)
return Response({
"data": serializer.data,
"msg": None,
"success": True,
"status": 200
})
def create(self, request, *args, **kwargs):
data = request.data
obj_id = data.get("id")
if not obj_id:
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
self.perform_create(serializer)
headers = self.get_success_headers(serializer.data)
# return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
return Response({
"data": serializer.data,
"msg": None,
"success": True,
"status": 200
}, headers=headers)
else:
partial = kwargs.pop('partial', True)
try:
instance = self.queryset.filter(id=obj_id).get()
except Exception as e:
logger.error(f"查询对象报错:{e}")
return Response({"msg": "该对象不存在", "status": 400, "success": False, "data": None})
serializer = self.get_serializer(instance, data=request.data, partial=partial)
serializer.is_valid(raise_exception=True)
self.perform_update(serializer)
if getattr(instance, '_prefetched_objects_cache', None):
instance._prefetched_objects_cache = {}
# 同步删除所有相关联记录
if data.get("status") in (1, "1"):
WorkshopDeviceModel.objects.filter(workshop_id=obj_id).all().update(status=1)
return Response({
"data": serializer.data,
"msg": None,
"success": True,
"status": 200
})
class WorkshopDeviceModelViewSet(ModelViewSet):
# 查询类
queryset = WorkshopDeviceModel.objects.all().order_by("id")
# 序列化类
serializer_class = WorkshopDeviceSerializer
# 分页类
pagination_class = MyPageNumberPagination
def list(self, request, *args, **kwargs):
data = request.query_params
obj_id = data.get("id")
status = data.get("status", 0)
workshop_id = data.get("workshop_id")
if status in (0, 1):
self.queryset = self.queryset.filter(status=status)
if workshop_id:
self.queryset = self.queryset.filter(workshop_id=workshop_id)
if not obj_id:
return Response({
"data": super().list(request, *args, **kwargs).data,
"msg": None,
"success": True,
"status": 200
})
else:
try:
instance = self.queryset.filter(id=obj_id).get()
except Exception as e:
logger.error(f"查询对象报错:{e}")
return Response({"msg": "该对象不存在", "status": 400, "success": False, "data": None})
serializer = self.get_serializer(instance)
return Response({
"data": serializer.data,
"msg": None,
"success": True,
"status": 200
})
def create(self, request, *args, **kwargs):
data = request.data
obj_id = data.get("id") or data.get("wd_id")
# 设备重复绑定
# device_id = data.get("device_id")
# workshop_id = data.get("workshop_id")
# exist_obj = self.queryset.filter(device_id=device_id).last()
# if exist_obj:
# if exist_obj.workshop_id == workshop_id:
# obj_id = obj_id if obj_id else exist_obj.id
if not obj_id:
# exist_id = data.get("wd_id")
# WorkshopDeviceModel.objects.filter(id=exist_id).update(status=1)
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
self.perform_create(serializer)
headers = self.get_success_headers(serializer.data)
return Response({
"data": serializer.data,
"msg": "新增成功",
"success": True,
"status": 200
}, headers=headers)
else:
partial = kwargs.pop('partial', True)
try:
instance = self.queryset.filter(id=obj_id).get()
except Exception as e:
logger.error(f"查询对象报错:{e}")
return Response({"msg": "该对象不存在", "status": 400, "success": False, "data": None})
serializer = self.get_serializer(instance, data=request.data, partial=partial)
serializer.is_valid(raise_exception=True)
self.perform_update(serializer)
if getattr(instance, '_prefetched_objects_cache', None):
instance._prefetched_objects_cache = {}
return Response({
"data": serializer.data,
"msg": "编辑成功",
"success": True,
"status": 200
})
def destroy(self, request, *args, **kwargs):
data = request.data
ids = data.get("ids")
self.queryset.filter(id__in=ids).all().update(status=1)
return Response({
"data": None,
"msg": "删除成功",
"success": True,
"status": 200
})
def get_devices(self, request, *args, **kwargs):
device_ids_dict = dict()
# device_ids = self.queryset.filter(status=0).order_by("id").values("device_id", "id")
wd_objs = self.queryset.filter(status=0).order_by("id").all()
wd_objs_serializer = self.get_serializer(wd_objs, many=True)
for obj in wd_objs_serializer.data:
device_ids_dict[obj.get("device_id")] = obj
queryset = EnterpriseDeviceModel.objects.all()
serializer = EnterpriseDeviceSerializer(queryset, many=True)
res = []
for i in serializer.data:
if i.get("id") in device_ids_dict:
i["is_binding"] = True
i["wd_id"] = device_ids_dict[i.get("id")].get("id")
i["workshop_name"] = device_ids_dict[i.get("id")].get("workshop_name")
else:
i["is_binding"] = False
res.append(i)
return Response({
"data": res,
"msg": None,
"success": True,
"status": 200
})

@ -5,18 +5,19 @@ export MYSQL_USER="general"
export MYSQL_PASSWORD="#Yaxin0504" export MYSQL_PASSWORD="#Yaxin0504"
export MYSQL_HOST="127.0.0.1" export MYSQL_HOST="127.0.0.1"
export MYSQL_PORT="3306" export MYSQL_PORT="3306"
export SERVER_IP="192.168.10.21:8000"
while ! nc -z db 3306 ; do #while ! nc -z db 3306 ; do
echo "Waiting for the MySQL Server" # echo "Waiting for the MySQL Server"
sleep 3 # sleep 3
done #done
pip install -r requirements.txt&& pip install -r requirements.txt&&
python manage.py makemigrations&& python manage.py makemigrations&&
python manage.py migrate&& python manage.py migrate&&
nohup python3 manage.py runserver 0.0.0.0:8000 && nohup python3 manage.py runserver 0.0.0.0:8000 &
echo '通用平台项目启动完成' echo '通用平台项目启动完成'
tail -f /dev/null tail -f /dev/null

Loading…
Cancel
Save