|
@@ -6,11 +6,11 @@ from django.db import transaction
|
|
from rest_framework.views import APIView
|
|
from rest_framework.views import APIView
|
|
from rest_framework import generics
|
|
from rest_framework import generics
|
|
import datetime
|
|
import datetime
|
|
-from django.db.models import Sum,Count
|
|
|
|
-from rest_framework_jwt.views import ObtainJSONWebToken,VerifyJSONWebToken,RefreshJSONWebToken
|
|
|
|
|
|
+from django.db.models import Sum, Count
|
|
|
|
+from rest_framework_jwt.views import ObtainJSONWebToken, VerifyJSONWebToken, RefreshJSONWebToken
|
|
from rest_framework.serializers import ValidationError
|
|
from rest_framework.serializers import ValidationError
|
|
from utils import response_ok, response_error
|
|
from utils import response_ok, response_error
|
|
-from apps.tenant.option.serializers import OptionSerializer,Option
|
|
|
|
|
|
+from apps.tenant.option.serializers import OptionSerializer, Option
|
|
from django.utils import timezone
|
|
from django.utils import timezone
|
|
from apps.tenant.notices.models import Notices
|
|
from apps.tenant.notices.models import Notices
|
|
from apps.tenant.notices.serializers import NoticesWXSerializer
|
|
from apps.tenant.notices.serializers import NoticesWXSerializer
|
|
@@ -19,7 +19,7 @@ from utils.permission import isLogin, IsTenantUser
|
|
from utils.wx.WXBizDataCrypt import WXBizDataCrypt
|
|
from utils.wx.WXBizDataCrypt import WXBizDataCrypt
|
|
from apps.tenant.poster.serializer import PosterSerializer, Poster
|
|
from apps.tenant.poster.serializer import PosterSerializer, Poster
|
|
from apps.tenant.device.models import DeviceModel
|
|
from apps.tenant.device.models import DeviceModel
|
|
-from apps.tenant.repair_order.models import RepairOrder,RepairOrderComment
|
|
|
|
|
|
+from apps.tenant.repair_order.models import RepairOrder, RepairOrderComment
|
|
from .serializers import *
|
|
from .serializers import *
|
|
|
|
|
|
class CustomerRefreshTokenView(RefreshJSONWebToken):
|
|
class CustomerRefreshTokenView(RefreshJSONWebToken):
|
|
@@ -99,10 +99,10 @@ class HomeStatisticsView(APIView):
|
|
|
|
|
|
def get(self, request):
|
|
def get(self, request):
|
|
statistics = {
|
|
statistics = {
|
|
- 'total':0, #总报修
|
|
|
|
- 'wait':0, #待维修
|
|
|
|
- 'working':0, #维修中
|
|
|
|
- 'complete':0, #已完工
|
|
|
|
|
|
+ 'total': 0, # 总报修
|
|
|
|
+ 'wait': 0, # 待维修
|
|
|
|
+ 'working': 0, # 维修中
|
|
|
|
+ 'complete': 0, # 已完工
|
|
}
|
|
}
|
|
if request.user and request.user.is_authenticated:
|
|
if request.user and request.user.is_authenticated:
|
|
tenant = request.user.employee.tenant
|
|
tenant = request.user.employee.tenant
|
|
@@ -110,26 +110,28 @@ class HomeStatisticsView(APIView):
|
|
statistics['total'] = rows.filter(status__gte=RepairOrder.CHECKED).count()
|
|
statistics['total'] = rows.filter(status__gte=RepairOrder.CHECKED).count()
|
|
statistics['wait'] = rows.filter(status=RepairOrder.CHECKED).count()
|
|
statistics['wait'] = rows.filter(status=RepairOrder.CHECKED).count()
|
|
statistics['working'] = rows.filter(status=RepairOrder.DISPATCH).count()
|
|
statistics['working'] = rows.filter(status=RepairOrder.DISPATCH).count()
|
|
- statistics['complete'] = rows.filter(status__in=[RepairOrder.FINISH,RepairOrder.APPRAISE,]).count()
|
|
|
|
|
|
+ statistics['complete'] = rows.filter(status__in=[RepairOrder.FINISH, RepairOrder.APPRAISE, ]).count()
|
|
return response_ok(statistics)
|
|
return response_ok(statistics)
|
|
else:
|
|
else:
|
|
return response_ok(statistics)
|
|
return response_ok(statistics)
|
|
|
|
|
|
|
|
+
|
|
class StatisticsRepairView(APIView):
|
|
class StatisticsRepairView(APIView):
|
|
'''小程序统计数据'''
|
|
'''小程序统计数据'''
|
|
permission_classes = [IsTenantUser, ]
|
|
permission_classes = [IsTenantUser, ]
|
|
|
|
+
|
|
def get(self, request):
|
|
def get(self, request):
|
|
- days = int(request.GET.get('days')) # 7 30 365
|
|
|
|
- data = []# 报修数据
|
|
|
|
|
|
+ days = int(request.GET.get('days')) # 7 30 365
|
|
|
|
+ data = [] # 报修数据
|
|
tenant = request.user.employee.tenant
|
|
tenant = request.user.employee.tenant
|
|
now = timezone.now()
|
|
now = timezone.now()
|
|
- rows = RepairOrder.objects.filter(tenant=tenant,status__gte=RepairOrder.CHECKED)
|
|
|
|
|
|
+ rows = RepairOrder.objects.filter(tenant=tenant, status__gte=RepairOrder.CHECKED)
|
|
if days < 31:
|
|
if days < 31:
|
|
for d in range(days):
|
|
for d in range(days):
|
|
date = (now + datetime.timedelta(days=-d)).strftime('%Y-%m-%d')
|
|
date = (now + datetime.timedelta(days=-d)).strftime('%Y-%m-%d')
|
|
item = {
|
|
item = {
|
|
- 'title':date[5:],
|
|
|
|
- 'data':rows.filter(create_time__gte=date,create_time__lte=date+' 23:59:59').count(),
|
|
|
|
|
|
+ 'title': date[5:],
|
|
|
|
+ 'data': rows.filter(create_time__gte=date, create_time__lte=date + ' 23:59:59').count(),
|
|
}
|
|
}
|
|
data.append(item)
|
|
data.append(item)
|
|
data = data[::-1]
|
|
data = data[::-1]
|
|
@@ -168,7 +170,7 @@ class StatisticsRepairView(APIView):
|
|
month = int(year_month[1])
|
|
month = int(year_month[1])
|
|
item = {
|
|
item = {
|
|
'title': year_months,
|
|
'title': year_months,
|
|
- 'data':rows.filter(create_time__year=year, create_time__month=month).count(),
|
|
|
|
|
|
+ 'data': rows.filter(create_time__year=year, create_time__month=month).count(),
|
|
}
|
|
}
|
|
data.append(item)
|
|
data.append(item)
|
|
return response_ok(data)
|
|
return response_ok(data)
|
|
@@ -176,21 +178,22 @@ class StatisticsRepairView(APIView):
|
|
class StatisticsEvaluateView(APIView):
|
|
class StatisticsEvaluateView(APIView):
|
|
'''小程序评价统计数据'''
|
|
'''小程序评价统计数据'''
|
|
permission_classes = [IsTenantUser, ]
|
|
permission_classes = [IsTenantUser, ]
|
|
|
|
+
|
|
def get(self, request):
|
|
def get(self, request):
|
|
- days = int(request.GET.get('days')) # 7 30 365
|
|
|
|
- data = []# 评价数据
|
|
|
|
|
|
+ days = int(request.GET.get('days')) # 7 30 365
|
|
|
|
+ data = [] # 评价数据
|
|
tenant = request.user.employee.tenant
|
|
tenant = request.user.employee.tenant
|
|
now = timezone.now()
|
|
now = timezone.now()
|
|
date = (now + datetime.timedelta(days=-days)).strftime('%Y-%m-%d')
|
|
date = (now + datetime.timedelta(days=-days)).strftime('%Y-%m-%d')
|
|
# 分组统计分析
|
|
# 分组统计分析
|
|
- rows = RepairOrderComment.objects.filter(repair_order__tenant=tenant,create_time__gte=date,) \
|
|
|
|
|
|
+ rows = RepairOrderComment.objects.filter(repair_order__tenant=tenant, create_time__gte=date, ) \
|
|
.values('repair_user_id') \
|
|
.values('repair_user_id') \
|
|
- .annotate(starts=Sum('start'),count=Count('id')) \
|
|
|
|
|
|
+ .annotate(starts=Sum('start'), count=Count('id')) \
|
|
.values('repair_user__employee__name', 'starts', 'count')
|
|
.values('repair_user__employee__name', 'starts', 'count')
|
|
for row in rows:
|
|
for row in rows:
|
|
item = {
|
|
item = {
|
|
- 'title':row['repair_user__employee__name'],
|
|
|
|
- 'data':round(float(row['starts']) / float(row['count']),2),
|
|
|
|
|
|
+ 'title': row['repair_user__employee__name'],
|
|
|
|
+ 'data': round(float(row['starts']) / float(row['count']), 2),
|
|
}
|
|
}
|
|
data.append(item)
|
|
data.append(item)
|
|
data.sort(key=lambda d: d['data'], reverse=True)
|
|
data.sort(key=lambda d: d['data'], reverse=True)
|
|
@@ -222,17 +225,22 @@ class PosterView(generics.ListAPIView):
|
|
|
|
|
|
class DictView(APIView):
|
|
class DictView(APIView):
|
|
permission_classes = [isLogin, ]
|
|
permission_classes = [isLogin, ]
|
|
|
|
+
|
|
def get(self, request):
|
|
def get(self, request):
|
|
tenant = request.user.employee.tenant
|
|
tenant = request.user.employee.tenant
|
|
ret = {
|
|
ret = {
|
|
- 'repair_type': OptionSerializer(Option.objects.filter(delete=False,type=Option.REPAIRS_TYPE, enable=True, tenant=tenant), many=True).data,
|
|
|
|
- 'fault_cause': OptionSerializer(Option.objects.filter(delete=False,type=Option.FAULT_CAUSE, enable=True, tenant=tenant), many=True).data,
|
|
|
|
|
|
+ 'repair_type': OptionSerializer(
|
|
|
|
+ Option.objects.filter(delete=False, type=Option.REPAIRS_TYPE, enable=True, tenant=tenant),
|
|
|
|
+ many=True).data,
|
|
|
|
+ 'fault_cause': OptionSerializer(
|
|
|
|
+ Option.objects.filter(delete=False, type=Option.FAULT_CAUSE, enable=True, tenant=tenant),
|
|
|
|
+ many=True).data,
|
|
}
|
|
}
|
|
return response_ok(ret)
|
|
return response_ok(ret)
|
|
|
|
|
|
|
|
|
|
class NoticesView(generics.ListAPIView):
|
|
class NoticesView(generics.ListAPIView):
|
|
- queryset = Notices.objects.filter(type=Notices.NOTICE,end_time__gte=timezone.now().date())
|
|
|
|
|
|
+ queryset = Notices.objects.filter(type=Notices.NOTICE, end_time__gte=timezone.now().date())
|
|
serializer_class = NoticesWXSerializer
|
|
serializer_class = NoticesWXSerializer
|
|
|
|
|
|
def filter_queryset(self, queryset):
|
|
def filter_queryset(self, queryset):
|
|
@@ -258,7 +266,7 @@ class NoticesDetailView(generics.RetrieveAPIView):
|
|
return response_ok(NoticesWXSerializer(self.get_object()).data)
|
|
return response_ok(NoticesWXSerializer(self.get_object()).data)
|
|
|
|
|
|
class MessageView(generics.ListAPIView):
|
|
class MessageView(generics.ListAPIView):
|
|
- queryset = Notices.objects.filter(type=Notices.MESSAGE,end_time__gte=timezone.now().date())
|
|
|
|
|
|
+ queryset = Notices.objects.filter(type=Notices.MESSAGE, end_time__gte=timezone.now().date())
|
|
serializer_class = NoticesWXSerializer
|
|
serializer_class = NoticesWXSerializer
|
|
|
|
|
|
def filter_queryset(self, queryset):
|
|
def filter_queryset(self, queryset):
|
|
@@ -271,6 +279,7 @@ class MessageView(generics.ListAPIView):
|
|
f = NoticesFilter(self.request.GET, queryset=queryset)
|
|
f = NoticesFilter(self.request.GET, queryset=queryset)
|
|
return f.qs
|
|
return f.qs
|
|
|
|
|
|
|
|
+
|
|
class MessageListView(generics.ListAPIView):
|
|
class MessageListView(generics.ListAPIView):
|
|
permission_classes = [IsTenantUser, ]
|
|
permission_classes = [IsTenantUser, ]
|
|
queryset = Notices.objects.filter(type=Notices.MESSAGE)
|
|
queryset = Notices.objects.filter(type=Notices.MESSAGE)
|
|
@@ -281,12 +290,27 @@ class MessageListView(generics.ListAPIView):
|
|
f = NoticesFilter(self.request.GET, queryset=queryset)
|
|
f = NoticesFilter(self.request.GET, queryset=queryset)
|
|
return f.qs
|
|
return f.qs
|
|
|
|
|
|
|
|
+
|
|
class DeviceView(APIView):
|
|
class DeviceView(APIView):
|
|
permission_classes = [isLogin, ]
|
|
permission_classes = [isLogin, ]
|
|
|
|
+
|
|
def get(self, request):
|
|
def get(self, request):
|
|
param = request.GET.get('param')
|
|
param = request.GET.get('param')
|
|
|
|
+ device_id = request.GET.get('device_id')
|
|
data = []
|
|
data = []
|
|
rows = DeviceModel.objects.filter(tenant=request.user.employee.tenant)
|
|
rows = DeviceModel.objects.filter(tenant=request.user.employee.tenant)
|
|
|
|
+ if device_id:
|
|
|
|
+ item = rows.filter(id=device_id).first()
|
|
|
|
+ if item:
|
|
|
|
+ data = {
|
|
|
|
+ 'id': item.id,
|
|
|
|
+ 'name': item.name,
|
|
|
|
+ 'address': '{}{}'.format(item.branch, item.address),
|
|
|
|
+ }
|
|
|
|
+ return response_ok(data)
|
|
|
|
+ else:
|
|
|
|
+ return response_error('设备信息错误,请重新查询!')
|
|
|
|
+
|
|
if param:
|
|
if param:
|
|
rows = rows.filter(Q(name=param) | Q(device_no=param) | Q(device_model=param))
|
|
rows = rows.filter(Q(name=param) | Q(device_no=param) | Q(device_model=param))
|
|
else:
|
|
else:
|
|
@@ -294,11 +318,11 @@ class DeviceView(APIView):
|
|
for item in rows:
|
|
for item in rows:
|
|
build_dict = {
|
|
build_dict = {
|
|
'id': item.id,
|
|
'id': item.id,
|
|
- 'name':item.name,
|
|
|
|
- 'device_no':item.device_no,
|
|
|
|
- 'device_model':item.device_model,
|
|
|
|
- 'branch':item.branch,
|
|
|
|
- 'address':item.address,
|
|
|
|
|
|
+ 'name': item.name,
|
|
|
|
+ 'device_no': item.device_no,
|
|
|
|
+ 'device_model': item.device_model,
|
|
|
|
+ 'branch': item.branch,
|
|
|
|
+ 'address': item.address,
|
|
}
|
|
}
|
|
data.append(build_dict)
|
|
data.append(build_dict)
|
|
|
|
|