views.py 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. # coding=utf-8
  2. import traceback
  3. from rest_framework.views import APIView
  4. from rest_framework.decorators import action
  5. from django.db import transaction
  6. import datetime
  7. from django.utils import timezone
  8. from utils.custom_modelviewset import CustomModelViewSet
  9. from utils.exceptions import CustomError
  10. from .serializers import OrderSerializer, ProgressDetailsSerializer
  11. from .filters import OrderFilter
  12. from apps.log.models import BizLog
  13. from django.db.models import Q
  14. from utils import response_ok, response_error
  15. from utils.permission import isLogin, check_permission, permission_required
  16. from apps.customer.models import NewCustomer, NewCustomerRemind
  17. from apps.order.models import Order, ProgressDetails
  18. from apps.option.models import Option
  19. from apps.upload.models import Upload
  20. from apps.upload.serializers import UploadSerializer
  21. class GetProcessView(APIView):
  22. permission_classes = [isLogin]
  23. def get(self, request):
  24. customer_id = request.query_params.get('customer_id')
  25. dispatch = request.query_params.get('dispatch') # 分配服务人员,
  26. instance = NewCustomer.objects.filter(id=customer_id).first()
  27. if not instance:
  28. raise CustomError('当前客户信息有误,请刷新重试!')
  29. if instance.stage_progress.end_stage:
  30. data = {
  31. 'error_message': u'当前客户订单等待分配中,请勿重复更新!',
  32. }
  33. return response_ok(data)
  34. order = Order.objects.filter(customer=instance).first()
  35. # 分配服务人员,不做重复更新判断
  36. if order and order.status == Order.WAIT_DISPATCH and not dispatch:
  37. data = {
  38. 'error_message': u'当前客户订单等待分配中,请勿重复更新!',
  39. }
  40. return response_ok(data)
  41. option = Option.objects.filter(type=instance.stage_progress.type, sort__gt=instance.stage_progress.sort,
  42. enable=True).order_by('sort').first()
  43. if option:
  44. data = {
  45. 'now_process_text': instance.stage_progress.name,
  46. 'next_process_text': option.name,
  47. 'next_process_id': option.id,
  48. }
  49. return response_ok(data)
  50. else:
  51. data = {
  52. 'error_message': u'未找到下个阶段进度,请联系管理员设置!',
  53. }
  54. return response_ok(data)
  55. class OrderViewSet(CustomModelViewSet):
  56. permission_classes = [isLogin]
  57. queryset = Order.objects.filter()
  58. serializer_class = OrderSerializer
  59. @permission_required('order.view_order')
  60. def filter_queryset(self, queryset):
  61. queryset = queryset.filter(
  62. Q(store_id__in=self.request.user.get_manager_range()) |
  63. Q(service_user=self.request.user) |
  64. Q(customer__create_user=self.request.user)
  65. )
  66. f = OrderFilter(self.request.GET, queryset=queryset)
  67. return f.qs
  68. def paginate_queryset(self, queryset):
  69. if self.paginator is None or self.request.GET.get('export'):
  70. return None
  71. return self.paginator.paginate_queryset(queryset, self.request, view=self)
  72. @action(methods=['post'], detail=True)
  73. def dispatch_service(self, request, pk):
  74. # 订单分配服务人员
  75. check_permission(request, 'order.order_process_dispatch')
  76. stage_progress = request.POST.get('stage_progress')
  77. service = request.POST.get('service')
  78. try:
  79. with transaction.atomic():
  80. stage_progress = Option.objects.filter(id=stage_progress, enable=True).order_by('sort').first()
  81. if not stage_progress:
  82. raise CustomError('阶段进度有误,请刷新重试!')
  83. if not stage_progress.track_day:
  84. raise CustomError('下一阶段进度,没有可用跟踪天数,请联系管理员设置!')
  85. Order.objects.filter(id=pk).update(stage_progress=stage_progress, service_user_id=service,
  86. status=Order.NORMAL)
  87. next_time = (timezone.now() + datetime.timedelta(days=stage_progress.track_day)).strftime('%Y-%m-%d')
  88. # 更新进度,删除上一个跟踪人提醒
  89. order = self.get_object()
  90. NewCustomerRemind.objects.filter(customer=order.customer, remind_user=order.customer.track_user).delete()
  91. NewCustomer.objects.filter(id=order.customer_id).update(
  92. stage_progress=stage_progress,
  93. track_user_id=service,
  94. next_time=next_time,
  95. )
  96. if not stage_progress.end_stage:
  97. NewCustomerRemind.objects.create(customer=order.customer, store=order.customer.store, remind_user_id=service, next_time=next_time)
  98. operation = u'分配服务人员为:{}'.format(order.service_user.name)
  99. ProgressDetails.objects.create(order=order, user=request.user, operation=operation,)
  100. except CustomError as e:
  101. return response_error(e.get_error_msg())
  102. except Exception as e:
  103. return response_error(str(e))
  104. return response_ok()
  105. @action(methods=['post'], detail=True)
  106. def uncheck(self, request, pk):
  107. # 撤销进度审核
  108. try:
  109. instance = Order.objects.filter(id=pk).first()
  110. if not instance:
  111. raise CustomError('订单不存在')
  112. instance.status = Order.NORMAL
  113. instance.save()
  114. stage_progress = Option.objects.filter(type=instance.stage_progress.type,
  115. sort__gt=instance.stage_progress.sort,
  116. enable=True).order_by('sort').first()
  117. user = request.user
  118. operation = u'撤销【{0}】进度审核。'.format(stage_progress.name)
  119. ProgressDetails.objects.create(order=instance, user=user, operation=operation)
  120. except CustomError as e:
  121. return response_error(e.get_error_msg())
  122. except Exception as e:
  123. return response_error(str(e))
  124. return response_ok(u'撤销完成!')
  125. class GetDetailsView(APIView):
  126. permission_classes = [isLogin]
  127. def get(self, request):
  128. # 进度明细
  129. order_id = request.GET.get('order_id')
  130. details = ProgressDetails.objects.filter(order_id=order_id).order_by('-operation_time')
  131. data = ProgressDetailsSerializer(details, many=True).data
  132. return response_ok(data)
  133. class GetFilesView(APIView):
  134. permission_classes = [isLogin]
  135. def get(self, request):
  136. # 附件内容
  137. id = request.GET.get('id')
  138. images = Upload.objects.filter(progress_details_id=id)
  139. img_data = UploadSerializer(images, many=True).data
  140. return response_ok(img_data)