views.py 8.9 KB

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