123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368 |
- # coding=utf-8
- from django.conf import settings
- from django.db import transaction
- from django.db.models import Q
- from rest_framework import generics
- from rest_framework.views import APIView
- from rest_framework.decorators import action
- from utils import response_ok, response_error
- from utils.custom_modelviewset import CustomModelViewSet
- from utils.exceptions import CustomError
- from utils.permission import isLogin, IsEmployee
- from apps.tenant.repair_order.models import RepairOrder, RepairOrderRecord, RepairOrderComment, RepairOrderFinish, DeviceModel
- from apps.tenant.repair_order.filters import RepairOrderFilter
- from apps.upload.models import Upload
- from apps.log.models import BizLog
- from apps.tenant import tenant_log
- from apps.tenant.inspection_order.models import InspectionOrder
- from apps.wxapp.models import CustomerWechat
- from .serializers import (RepairOrderSerializer, RepairOrderListSerializer,
- RepairOrderDetailSerializer)
- from apps.tenant.employee.models import Employee,User
- class RepairOrderDetailView(generics.RetrieveAPIView):
- permission_classes = [isLogin, ]
- queryset = RepairOrder.objects.filter(delete=False)
- serializer_class = RepairOrderDetailSerializer
- def retrieve(self, request, *args, **kwargs):
- instance = self.get_object()
- serializer = self.get_serializer(instance)
- return response_ok(serializer.data)
- class RepairOrderMineView(generics.ListAPIView):
- permission_classes = [isLogin, ]
- queryset = RepairOrder.objects.filter(delete=False)
- serializer_class = RepairOrderListSerializer
- def filter_queryset(self, queryset):
- # 服务评价,管理者可以看到所有,报修人只能看到自己报修的,检修人只能看到派给自己的单子
- queryset = queryset.filter(tenant=self.request.user.employee.tenant)
- if self.request.user.is_repair():
- queryset = queryset.filter(user=self.request.user)
- if self.request.user.is_employee():
- queryset = queryset.filter(Q(repair_users=self.request.user) | Q(user=self.request.user))
- f = RepairOrderFilter(self.request.GET, queryset=queryset)
- return f.qs
- class RepairOrderCountView(APIView):
- def get(self, request):
- if not request.user or not request.user.is_authenticated:
- return response_ok({
- 'NOT_CHECKED_COUNT':0,
- 'CHECKED_COUNT':0,
- 'USER_NOT_CHECKED_COUNT': 0,
- 'USER_CHECKED_COUNT': 0,
- 'APPRAISE_COUNT': 0,
- 'FINISH':0,
- 'DISPATCH':0,
- })
- queryset = RepairOrder.objects.filter(delete=False, tenant=self.request.user.employee.tenant)
- return response_ok({
- 'NOT_CHECKED_COUNT':queryset.filter(status__lte=settings.CHECKED).count(), # 审批中心,待审核待派单
- 'CHECKED_COUNT':queryset.filter(status=settings.CHECKED,).count(), # 维修中心,待派单
- 'USER_NOT_CHECKED_COUNT':queryset.filter(status=settings.NOT_CHECKED,user = request.user).count(), # 我的,待审核
- 'USER_CHECKED_COUNT':queryset.filter(status=settings.CHECKED,user = request.user).count(), # 我的,待派单
- 'APPRAISE_COUNT': queryset.filter(status=settings.APPRAISE, user = request.user).count(), # 我的,已完工
- 'FINISH':queryset.filter(status=settings.FINISH, user = request.user).count(), # 服务评价,待评价
- 'DISPATCH':queryset.filter(status=settings.DISPATCH, user = request.user).count(), # 我的,已派单
- })
- class RepairOrderAllView(generics.ListAPIView):
- permission_classes = [isLogin, ]
- queryset = RepairOrder.objects.filter(delete=False)
- serializer_class = RepairOrderListSerializer
- def filter_queryset(self, queryset):
- queryset = queryset.filter(tenant=self.request.user.employee.tenant)
- if self.request.user.is_employee():
- #检修人 维修中心
- queryset = queryset.filter(Q(repair_users=self.request.user) | Q(user=self.request.user) | Q(repair_users__isnull=True))
- elif self.request.user.is_repair():
- queryset = queryset.filter(user=self.request.user)
- f = RepairOrderFilter(self.request.GET, queryset=queryset)
- return f.qs
- class DispatchRepairOrderView(generics.ListAPIView):
- # 我的维修单
- permission_classes = [IsEmployee, ]
- # 查询维修工单记录状态为已派单的
- queryset = RepairOrder.objects.filter()
- serializer_class = RepairOrderDetailSerializer
- def get_queryset(self):
- queryset = self.queryset.filter(tenant=self.request.user.employee.tenant, repair_users=self.request.user)
- return queryset
- def filter_queryset(self, queryset):
- f = RepairOrderFilter(self.request.GET, queryset=queryset)
- return f.qs
- class RepairOrderViewSet(CustomModelViewSet):
- permission_classes = (isLogin, )
- queryset = RepairOrder.objects.filter(delete=False)
- serializer_class = RepairOrderSerializer
- def filter_queryset(self, queryset):
- queryset = queryset.filter(tenant=self.request.user.employee.tenant, )
- if self.request.user.is_repair:
- queryset = queryset.filter(repair_users=self.request.user)
- f = RepairOrderFilter(self.request.GET, queryset=queryset)
- return f.qs
- def perform_create(self, serializer):
- super(RepairOrderViewSet, self).perform_create(serializer)
- instance = serializer.instance
- # 发送微信通知
- emplees = Employee.objects.filter(tenant=instance.tenant, type__in=[Employee.ADMIN, Employee.SUPER])
- for emp in emplees:
- CustomerWechat.sendWaitCheckMsg(emp.user, instance.name, instance.device_address,
- instance.fault_des, instance.no)
- validated_data = serializer.validated_data
- tenant_log(self.request.user.employee, BizLog.INSERT, u'添加报修工单[%s],id=%d' % (instance.name, instance.id),
- validated_data)
- @action(methods=['post'], detail=False)
- def upload_image(self, request):
- file = self.request.FILES.get('file')
- user = self.request.user
- upload = Upload.objects._addnew(user.employee.tenant, user, Upload.REPAIR_IMAGE, file)
- if upload:
- return response_ok(upload.id)
- return response_error('上传失败,请重新上传!')
- @action(methods=['post'], detail=False)
- def upload_voice(self, request):
- file = self.request.FILES.get('file')
- time = self.request.POST.get('time')
- user = self.request.user
- upload = Upload.objects._addnew_voice(user.employee.tenant, user, Upload.REPAIR_VOICE, file, time)
- if upload:
- return response_ok(upload.id)
- return response_error('上传失败,请重新上传!')
- @action(methods=['get'], detail=True)
- def check(self, request, pk):
- # 审核
- try:
- if not self.request.user.is_admin():
- raise CustomError(u"非管理人员,禁止操作!")
- 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 hang_up(self, request, pk):
- # 挂起
- try:
- if not self.request.user.is_employee():
- raise CustomError(u"非维修师傅,禁止操作!")
- reason = request.data.get('reason')
- if not reason:
- raise CustomError('请填写挂起原因')
- with transaction.atomic():
- user = self.request.user
- instance = RepairOrder.get_instance_by_id(pk, user.employee.tenant)
- instance.hange_up_repair_order(user, reason)
- 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=['get'], detail=True)
- def cancel_hang_up(self, request, pk):
- # 取消挂起,继续施工
- try:
- if not self.request.user.is_employee():
- raise CustomError(u"非维修师傅,禁止操作!")
- with transaction.atomic():
- user = self.request.user
- instance = RepairOrder.get_instance_by_id(pk, user.employee.tenant)
- instance.cancel_hange_up_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 = 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.CHECKED:
- return response_ok('当前报修工单状态非待派单状态,不能进行派单!')
- 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=['get'], detail=True)
- def rob_repair(self, request, pk):
- # 抢单
- try:
- if not self.request.user.is_employee():
- raise CustomError(u"非维修师傅,禁止操作!")
- with transaction.atomic():
- user = self.request.user
- instance = RepairOrder.get_instance_by_id(pk, user.employee.tenant)
- if not instance.status == settings.CHECKED:
- raise CustomError('当前报修工单状态非待派单状态,不能进行抢单!')
- instance.status = settings.DISPATCH
- instance.repair_users = user
- instance.save()
- RepairOrderRecord.objects.create(repair_order=instance, status=settings.DISPATCH, user=user,
- repair_users=user.id, notes='成功抢单')
- 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 finish(self, request, pk):
- # 完工
- if not self.request.user.is_employee():
- raise CustomError(u"非维修师傅,禁止操作!")
- try:
- content = request.data.get('content')
- images = request.data.get('images', None)
- quality_date = request.data.get('quality_date') or None
- fault_cause_id = request.data.get('fault_cause')
- user = self.request.user
- instance = RepairOrder.get_instance_by_id(pk, user.employee.tenant)
- if not instance.status == settings.DISPATCH:
- raise CustomError('当前报修工单状态非派单状态,不能进行完工操作!')
- with transaction.atomic():
- # 更新工单状态为完工
- instance.status = settings.FINISH
- instance.save()
- if instance.device:
- instance.device.status = DeviceModel.FINE
- instance.device.save()
- # 写入完工表
- repair_order_finish = RepairOrderFinish.objects.create(repair_order_id=pk,
- fault_cause_id=fault_cause_id,
- quality_date=quality_date, content=content)
- if images:
- for image in images.split(','):
- repair_order_finish.images.add(image)
- repair_order_finish.save()
- # 增加工单记录
- RepairOrderRecord.objects.create(repair_order_id=pk, status=settings.FINISH, user=user, notes=content)
- # 判断是否为巡检转报修,更新巡检状态
- inspection_order = InspectionOrder.objects.filter(repair_order=instance).first()
- if inspection_order:
- inspection_order.status = InspectionOrder.REPAIR
- inspection_order.save()
- # 发送微信通知
- CustomerWechat.sendFinishMsg(instance.user, user.employee.name, instance.device_address,
- instance.fault_des, instance.no)
- 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=['get'], detail=True)
- def invalid(self, request, pk):
- # 作废
- try:
- if not self.request.user.is_admin():
- 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('工单作废完成!')
- @action(methods=['post'], detail=True)
- def comment(self, request, pk):
- # 评价
- try:
- content = request.data.get('content')
- start = request.data.get('start', 5)
- if not content:
- return response_error('评价内容不能为空!')
- user = self.request.user
- instance = RepairOrder.get_instance_by_id(pk, user.employee.tenant)
- if not instance.status == settings.FINISH:
- raise CustomError('当前报修工单状态非派单状态,不能进行评价操作!')
- with transaction.atomic():
- instance.status = settings.APPRAISE
- instance.save()
- RepairOrderComment.objects.create(repair_order=instance, content=content, start=start, user=user, repair_user=instance.repair_users)
- # 增加工单记录
- RepairOrderRecord.objects.create(repair_order_id=pk, status=settings.APPRAISE, user=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=['get'], detail=True)
- def repair_order_record(self, request, pk):
- # 维修工单记录
- user = self.request.user
- instance = RepairOrder.get_instance_by_id(pk, user.employee.tenant)
- records = RepairOrderRecord.objects.filter(repair_order=instance).order_by('-operation_time')
- data = []
- for record in records:
- dict = record.get_records(instance.id)
- data.append(dict)
- return response_ok(data)
- def destroy(self, request, *args, **kwargs):
- try:
- if not self.request.user.is_admin():
- raise CustomError(u"非管理人员,禁止操作!")
- with transaction.atomic():
- instance = self.get_object()
- instance.delete = True
- instance.save()
- tenant_log(self.request.user.employee, BizLog.DELETE,
- u'删除报修工单[%s],id=%d' % (instance.name, instance.id))
- except CustomError as e:
- return response_error(e.get_error_msg())
- except Exception as e:
- return response_error(str(e))
- return response_ok()
|