123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214 |
- # coding=utf-8
- from django.db import transaction
- import datetime
- from django.utils import timezone
- from django.db.models import Count
- from rest_framework.decorators import action
- from django.conf import settings
- from rest_framework.views import APIView
- from utils import response_ok, response_error
- from utils.custom_modelviewset import CustomModelViewSet
- from utils.exceptions import CustomError
- from utils.permission import IsTenantUser
- from .serializers import RepairOrderSerializer
- from .models import RepairOrder, RepairOrderRecord
- from .filters import RepairOrderFilter
- from apps.tenant import tenant_log
- from apps.log.models import BizLog
- from apps.tenant.employee.serializers import Employee, EmployeeSerializer,User
- from apps.wxapp.models import CustomerWechat
- class DictView(APIView):
- permission_classes = [IsTenantUser, ]
- def get(self, request):
- tenant = request.user.employee.tenant
- ret = {
- 'status': settings.REPAIR_STATUS_CHOICES,
- }
- return response_ok(ret)
- class GetEmployeeView(APIView):
- permission_classes = [IsTenantUser, ]
- def get(self, request):
- employees = EmployeeSerializer(
- Employee.objects.filter(status__lte=Employee.DAY_OFF, type=Employee.EMPLOYEE, tenant=request.user.employee.tenant), many=True).data
- data = []
- for emp in employees:
- dict = {
- 'id': emp['user'],
- 'name': '{0}-{1}-{2}-{3}'.format(emp['name'], emp['tel'], emp['position'], emp['status_text'])
- }
- data.append(dict)
- return response_ok(data)
- class OrderRecordView(APIView):
- permission_classes = [IsTenantUser, ]
- def get(self, request):
- order_id = request.GET.get('order_id')
- records = RepairOrderRecord.objects.filter(repair_order_id=order_id).order_by('-operation_time')
- data = []
- for record in records:
- dict = record.get_records(order_id)
- data.append(dict)
- return response_ok(data)
- class RepairOrderViewSet(CustomModelViewSet):
- permission_classes = [IsTenantUser, ]
- queryset = RepairOrder.objects.filter(delete=False)
- serializer_class = RepairOrderSerializer
- def filter_queryset(self, queryset):
- queryset = queryset.filter(tenant=self.request.user.employee.tenant)
- f = RepairOrderFilter(self.request.GET, queryset=queryset)
- return f.qs
- def destroy(self, request, *args, **kwargs):
- with transaction.atomic():
- instance = self.get_object()
- if instance.tenant != request.user.employee.tenant:
- raise CustomError(u'禁止跨企业操作!')
- super(RepairOrderViewSet, self).destroy(self, request, *args, **kwargs)
- tenant_log(self.request.user.employee, BizLog.DELETE, u'删除报修单[%s],id=%d' % (instance.no, instance.id))
- return response_ok()
- @action(methods=['post'], detail=True)
- def check(self, request, pk):
- # 审核
- try:
- with transaction.atomic():
- user = self.request.user
- instance = RepairOrder.get_instance_by_id(pk, user.employee.tenant)
- instance.check_repair_order(user)
- except CustomError as e:
- return response_error(e.get_error_msg())
- except Exception as e:
- return response_error(str(e))
- return response_ok('审核完成!')
- @action(methods=['post'], detail=True)
- def dispatch_employee(self, request, pk):
- # 派工
- try:
- user_ids = self.request.data.get('user_ids')
- if not user_ids:
- return response_error('请选择维修工人!')
- user = self.request.user
- with transaction.atomic():
- instance = RepairOrder.get_instance_by_id(pk, user.employee.tenant)
- if not instance.status == settings.CHECKED:
- return response_error('当前报修工单状态非待派单状态,不能进行派单!')
- instance.dispatch_repair_order(user, user_ids)
- if user.id != user_ids:
- user = User.objects.filter(id=user_ids).first()
- CustomerWechat.sendDispatchMsg(user, instance.user.employee.name, instance.device_address,
- instance.fault_des, instance.create_time, instance.no)
- except CustomError as e:
- return response_error(e.get_error_msg())
- except Exception as e:
- import traceback
- traceback.print_exc()
- return response_error(str(e))
- return response_ok('派工完成!')
- @action(methods=['post'], detail=True)
- def turn_employee(self, request, pk):
- # 转单
- try:
- user_ids = request.data.get('user_id')
- if not user_ids:
- return response_error('请选择维修工人!')
- user = self.request.user
- with transaction.atomic():
- instance = RepairOrder.get_instance_by_id(pk, user.employee.tenant)
- if not instance.status == settings.DISPATCH:
- return response_error('当前报修单状态还未派单,不能进行转单!')
- instance.repair_users_id = user_ids
- instance.save()
- # 记录操作
- RepairOrderRecord.objects.create(repair_order=instance, status=settings.TURN_EMPLOYEE, user=user,
- repair_users=user_ids)
- except CustomError as e:
- return response_error(e.get_error_msg())
- except Exception as e:
- return response_error(str(e))
- return response_ok('派单完成!')
- @action(methods=['post'], detail=True)
- def cancel(self, request, pk):
- # 作废
- try:
- if not self.request.user.has_perm('repair_order.invalid_repair_order'):
- raise CustomError(u"您没有[报修工单-作废]权限,无法执行该操作,请联系管理员分配权限!")
- with transaction.atomic():
- user = self.request.user
- instance = RepairOrder.get_instance_by_id(pk, user.employee.tenant)
- instance.invalid(user)
- except CustomError as e:
- return response_error(e.get_error_msg())
- except Exception as e:
- return response_error(str(e))
- return response_ok('工单作废完成!')
- class HomeStatisticsView(APIView):
- '''首页统计数据'''
- permission_classes = [IsTenantUser, ]
- def get(self, request):
- statistics = {
- 'wait_check':0, #待审核
- 'is_check':0, # 待接单
- 'working':0, #维修中
- 'hang_up':0, #挂起中
- 'complete':0, #已完成
- 'appraise':0, #已评价
- }
- if request.user or request.user.is_authenticated:
- tenant = request.user.employee.tenant
- rows = RepairOrder.objects.filter(tenant=tenant)
- # statistics['total'] = rows.filter(status__gte=RepairOrder.CHECKED).count()
- statistics['wait_check'] = rows.filter(status=RepairOrder.NOT_CHECKED).count()
- statistics['is_check'] = rows.filter(status=RepairOrder.CHECKED).count()
- statistics['working'] = rows.filter(status=RepairOrder.DISPATCH).count()
- statistics['hang_up'] = rows.filter(status=RepairOrder.HANG_UP).count()
- statistics['complete'] = rows.filter(status=RepairOrder.FINISH).count()
- statistics['appraise'] = rows.filter(status=RepairOrder.APPRAISE).count()
- return response_ok(statistics)
- else:
- return response_ok(statistics)
- class RepairTypeView(APIView):
- permission_classes = [IsTenantUser, ]
- def get(self, request):
- tenant = request.user.employee.tenant
- order_records = RepairOrder.objects.filter(tenant=tenant,status__gte=RepairOrder.CHECKED)
- order_records = order_records.values('repair_type').annotate(count=Count('id')).order_by('repair_type').values(
- 'repair_type__name', 'count')
- return response_ok(
- [{'name': order_record['repair_type__name'], 'value': order_record['count']} for order_record in order_records])
- class RepairOrderView(APIView):
- permission_classes = [IsTenantUser, ]
- def get(self, request):
- order_mouth = [] # 日期
- repair_counts = [] # 报修量
- finish_counts = [] # 完工量
- tenant = request.user.employee.tenant
- now = timezone.now()
- for d in range(30):
- date = (now + datetime.timedelta(days=-d)).strftime('%Y-%m-%d')
- order_mouth.append(date[5:])
- rows = RepairOrder.objects.filter(tenant=tenant,create_time__gte=date, create_time__lte=date + ' 23:59:59', status__in=[RepairOrder.CHECKED, RepairOrder.FINISH])
- check_counts = rows.filter(status__gte=RepairOrder.CHECKED).count()
- finish_count = rows.filter(status__gte=RepairOrder.FINISH).count()
- repair_counts.append(check_counts)
- finish_counts.append(finish_count)
- return response_ok({
- 'finish_counts': sorted(finish_counts),
- 'repair_counts': sorted(repair_counts),
- 'order_mouth': sorted(order_mouth),
- })
|