views.py 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. # coding=utf-8
  2. from django.db import transaction
  3. import datetime
  4. from django.utils import timezone
  5. from django.db.models import Count
  6. from rest_framework.decorators import action
  7. from django.conf import settings
  8. from rest_framework.views import APIView
  9. from utils import response_ok, response_error
  10. from utils.custom_modelviewset import CustomModelViewSet
  11. from utils.exceptions import CustomError
  12. from utils.permission import IsTenantUser
  13. from .serializers import RepairOrderSerializer
  14. from .models import RepairOrder, RepairOrderRecord
  15. from .filters import RepairOrderFilter
  16. from apps.tenant import tenant_log
  17. from apps.log.models import BizLog
  18. from apps.tenant.employee.serializers import Employee, EmployeeSerializer,User
  19. from apps.wxapp.models import CustomerWechat
  20. class DictView(APIView):
  21. permission_classes = [IsTenantUser, ]
  22. def get(self, request):
  23. tenant = request.user.employee.tenant
  24. ret = {
  25. 'status': settings.REPAIR_STATUS_CHOICES,
  26. }
  27. return response_ok(ret)
  28. class GetEmployeeView(APIView):
  29. permission_classes = [IsTenantUser, ]
  30. def get(self, request):
  31. employees = EmployeeSerializer(
  32. Employee.objects.filter(status__lte=Employee.DAY_OFF, type=Employee.EMPLOYEE, tenant=request.user.employee.tenant), many=True).data
  33. data = []
  34. for emp in employees:
  35. dict = {
  36. 'id': emp['user'],
  37. 'name': '{0}-{1}-{2}-{3}'.format(emp['name'], emp['tel'], emp['position'], emp['status_text'])
  38. }
  39. data.append(dict)
  40. return response_ok(data)
  41. class OrderRecordView(APIView):
  42. permission_classes = [IsTenantUser, ]
  43. def get(self, request):
  44. order_id = request.GET.get('order_id')
  45. records = RepairOrderRecord.objects.filter(repair_order_id=order_id).order_by('-operation_time')
  46. data = []
  47. for record in records:
  48. dict = record.get_records(order_id)
  49. data.append(dict)
  50. return response_ok(data)
  51. class RepairOrderViewSet(CustomModelViewSet):
  52. permission_classes = [IsTenantUser, ]
  53. queryset = RepairOrder.objects.filter(delete=False)
  54. serializer_class = RepairOrderSerializer
  55. def filter_queryset(self, queryset):
  56. queryset = queryset.filter(tenant=self.request.user.employee.tenant)
  57. f = RepairOrderFilter(self.request.GET, queryset=queryset)
  58. return f.qs
  59. def destroy(self, request, *args, **kwargs):
  60. with transaction.atomic():
  61. instance = self.get_object()
  62. if instance.tenant != request.user.employee.tenant:
  63. raise CustomError(u'禁止跨企业操作!')
  64. super(RepairOrderViewSet, self).destroy(self, request, *args, **kwargs)
  65. tenant_log(self.request.user.employee, BizLog.DELETE, u'删除报修单[%s],id=%d' % (instance.no, instance.id))
  66. return response_ok()
  67. @action(methods=['post'], detail=True)
  68. def check(self, request, pk):
  69. # 审核
  70. try:
  71. with transaction.atomic():
  72. user = self.request.user
  73. instance = RepairOrder.get_instance_by_id(pk, user.employee.tenant)
  74. instance.check_repair_order(user)
  75. except CustomError as e:
  76. return response_error(e.get_error_msg())
  77. except Exception as e:
  78. return response_error(str(e))
  79. return response_ok('审核完成!')
  80. @action(methods=['post'], detail=True)
  81. def dispatch_employee(self, request, pk):
  82. # 派工
  83. try:
  84. user_ids = self.request.data.get('user_ids')
  85. if not user_ids:
  86. return response_error('请选择维修工人!')
  87. user = self.request.user
  88. with transaction.atomic():
  89. instance = RepairOrder.get_instance_by_id(pk, user.employee.tenant)
  90. if not instance.status == settings.CHECKED:
  91. return response_error('当前报修工单状态非待派单状态,不能进行派单!')
  92. instance.dispatch_repair_order(user, user_ids)
  93. if user.id != user_ids:
  94. user = User.objects.filter(id=user_ids).first()
  95. CustomerWechat.sendDispatchMsg(user, instance.user.employee.name, instance.device_address,
  96. instance.fault_des, instance.create_time, instance.no)
  97. except CustomError as e:
  98. return response_error(e.get_error_msg())
  99. except Exception as e:
  100. import traceback
  101. traceback.print_exc()
  102. return response_error(str(e))
  103. return response_ok('派工完成!')
  104. @action(methods=['post'], detail=True)
  105. def turn_employee(self, request, pk):
  106. # 转单
  107. try:
  108. user_ids = request.data.get('user_id')
  109. if not user_ids:
  110. return response_error('请选择维修工人!')
  111. user = self.request.user
  112. with transaction.atomic():
  113. instance = RepairOrder.get_instance_by_id(pk, user.employee.tenant)
  114. if not instance.status == settings.DISPATCH:
  115. return response_error('当前报修单状态还未派单,不能进行转单!')
  116. instance.repair_users_id = user_ids
  117. instance.save()
  118. # 记录操作
  119. RepairOrderRecord.objects.create(repair_order=instance, status=settings.TURN_EMPLOYEE, user=user,
  120. repair_users=user_ids)
  121. except CustomError as e:
  122. return response_error(e.get_error_msg())
  123. except Exception as e:
  124. return response_error(str(e))
  125. return response_ok('派单完成!')
  126. @action(methods=['post'], detail=True)
  127. def cancel(self, request, pk):
  128. # 作废
  129. try:
  130. if not self.request.user.has_perm('repair_order.invalid_repair_order'):
  131. raise CustomError(u"您没有[报修工单-作废]权限,无法执行该操作,请联系管理员分配权限!")
  132. with transaction.atomic():
  133. user = self.request.user
  134. instance = RepairOrder.get_instance_by_id(pk, user.employee.tenant)
  135. instance.invalid(user)
  136. except CustomError as e:
  137. return response_error(e.get_error_msg())
  138. except Exception as e:
  139. return response_error(str(e))
  140. return response_ok('工单作废完成!')
  141. class HomeStatisticsView(APIView):
  142. '''首页统计数据'''
  143. permission_classes = [IsTenantUser, ]
  144. def get(self, request):
  145. statistics = {
  146. 'wait_check':0, #待审核
  147. 'is_check':0, # 待接单
  148. 'working':0, #维修中
  149. 'hang_up':0, #挂起中
  150. 'complete':0, #已完成
  151. 'appraise':0, #已评价
  152. }
  153. if request.user or request.user.is_authenticated:
  154. tenant = request.user.employee.tenant
  155. rows = RepairOrder.objects.filter(tenant=tenant)
  156. # statistics['total'] = rows.filter(status__gte=RepairOrder.CHECKED).count()
  157. statistics['wait_check'] = rows.filter(status=RepairOrder.NOT_CHECKED).count()
  158. statistics['is_check'] = rows.filter(status=RepairOrder.CHECKED).count()
  159. statistics['working'] = rows.filter(status=RepairOrder.DISPATCH).count()
  160. statistics['hang_up'] = rows.filter(status=RepairOrder.HANG_UP).count()
  161. statistics['complete'] = rows.filter(status=RepairOrder.FINISH).count()
  162. statistics['appraise'] = rows.filter(status=RepairOrder.APPRAISE).count()
  163. return response_ok(statistics)
  164. else:
  165. return response_ok(statistics)
  166. class RepairTypeView(APIView):
  167. permission_classes = [IsTenantUser, ]
  168. def get(self, request):
  169. tenant = request.user.employee.tenant
  170. order_records = RepairOrder.objects.filter(tenant=tenant,status__gte=RepairOrder.CHECKED)
  171. order_records = order_records.values('repair_type').annotate(count=Count('id')).order_by('repair_type').values(
  172. 'repair_type__name', 'count')
  173. return response_ok(
  174. [{'name': order_record['repair_type__name'], 'value': order_record['count']} for order_record in order_records])
  175. class RepairOrderView(APIView):
  176. permission_classes = [IsTenantUser, ]
  177. def get(self, request):
  178. order_mouth = [] # 日期
  179. repair_counts = [] # 报修量
  180. finish_counts = [] # 完工量
  181. tenant = request.user.employee.tenant
  182. now = timezone.now()
  183. for d in range(30):
  184. date = (now + datetime.timedelta(days=-d)).strftime('%Y-%m-%d')
  185. order_mouth.append(date[5:])
  186. rows = RepairOrder.objects.filter(tenant=tenant,create_time__gte=date, create_time__lte=date + ' 23:59:59', status__in=[RepairOrder.CHECKED, RepairOrder.FINISH])
  187. check_counts = rows.filter(status__gte=RepairOrder.CHECKED).count()
  188. finish_count = rows.filter(status__gte=RepairOrder.FINISH).count()
  189. repair_counts.append(check_counts)
  190. finish_counts.append(finish_count)
  191. return response_ok({
  192. 'finish_counts': sorted(finish_counts),
  193. 'repair_counts': sorted(repair_counts),
  194. 'order_mouth': sorted(order_mouth),
  195. })