views.py 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. # coding=utf-8
  2. from django.db import transaction
  3. from rest_framework.decorators import action
  4. from django.conf import settings
  5. from rest_framework.views import APIView
  6. from utils import response_ok, response_error
  7. from utils.custom_modelviewset import CustomModelViewSet
  8. from utils.exceptions import CustomError
  9. from utils.permission import IsTenantUser, permission_required
  10. from .serializers import RepairOrderSerializer
  11. from .models import RepairOrder, RepairOrderRecord, RepairOrderFinish
  12. from .filters import RepairOrderFilter
  13. from apps.tenant import tenant_log
  14. from apps.log.models import BizLog
  15. from apps.tenant.area.serializers import AreaSerializer, AreaDepartmentSerializer, Area, Department
  16. from apps.tenant.employee.serializers import Employee, EmployeeSerializer
  17. class DictView(APIView):
  18. permission_classes = [IsTenantUser, ]
  19. def get(self, request):
  20. tenant = request.user.employee.tenant
  21. ret = {
  22. 'status': settings.REPAIR_STATUS_CHOICES,
  23. }
  24. return response_ok(ret)
  25. class GetEmployeeView(APIView):
  26. permission_classes = [IsTenantUser, ]
  27. def get(self, request):
  28. employees = EmployeeSerializer(
  29. Employee.objects.filter(status__lte=Employee.DAY_OFF, type=Employee.EMPLOYEE, ), many=True).data
  30. data = []
  31. for emp in employees:
  32. dict = {
  33. 'id': emp['user'],
  34. 'name': '{0}-{1}-{2}-{3}'.format(emp['name'], emp['tel'], emp['position'], emp['status_text'])
  35. }
  36. data.append(dict)
  37. return response_ok(data)
  38. class OrderRecordView(APIView):
  39. permission_classes = [IsTenantUser, ]
  40. def get(self, request):
  41. order_id = request.GET.get('order_id')
  42. records = RepairOrderRecord.objects.filter(repair_order_id=order_id).order_by('-operation_time')
  43. data = []
  44. for record in records:
  45. dict = record.get_records(order_id)
  46. data.append(dict)
  47. return response_ok(data)
  48. class RepairOrderViewSet(CustomModelViewSet):
  49. permission_classes = [IsTenantUser, ]
  50. queryset = RepairOrder.objects.filter(delete=False)
  51. serializer_class = RepairOrderSerializer
  52. def filter_queryset(self, queryset):
  53. queryset = queryset.filter(tenant=self.request.user.employee.tenant)
  54. f = RepairOrderFilter(self.request.GET, queryset=queryset)
  55. return f.qs
  56. def destroy(self, request, *args, **kwargs):
  57. with transaction.atomic():
  58. instance = self.get_object()
  59. if instance.tenant != request.user.employee.tenant:
  60. raise CustomError(u'禁止跨企业操作!')
  61. super(RepairOrderViewSet, self).destroy(self, request, *args, **kwargs)
  62. tenant_log(self.request.user.employee, BizLog.DELETE, u'删除报修单[%s],id=%d' % (instance.no, instance.id))
  63. return response_ok()
  64. @action(methods=['post'], detail=True)
  65. def check(self, request, pk):
  66. # 审核
  67. try:
  68. with transaction.atomic():
  69. user = self.request.user
  70. instance = RepairOrder.get_instance_by_id(pk, user.employee.tenant)
  71. instance.check_repair_order(user)
  72. except CustomError as e:
  73. return response_error(e.get_error_msg())
  74. except Exception as e:
  75. return response_error(str(e))
  76. return response_ok('审核完成!')
  77. @action(methods=['post'], detail=True)
  78. def dispatch_employee(self, request, pk):
  79. # 派工
  80. try:
  81. user_ids = self.request.data.get('user_ids')
  82. if not user_ids:
  83. return response_error('请选择维修工人!')
  84. user = self.request.user
  85. with transaction.atomic():
  86. instance = RepairOrder.get_instance_by_id(pk, user.employee.tenant)
  87. if not instance.status == settings.CHECKED:
  88. return response_ok('当前报修工单状态非待派单状态,不能进行派单!')
  89. instance.dispatch_repair_order(user, user_ids)
  90. except CustomError as e:
  91. return response_error(e.get_error_msg())
  92. except Exception as e:
  93. import traceback
  94. traceback.print_exc()
  95. return response_error(str(e))
  96. return response_ok('派工完成!')
  97. @action(methods=['post'], detail=True)
  98. def turn_employee(self, request, pk):
  99. # 转单
  100. try:
  101. user_ids = self.request.data.get('user_ids')
  102. if not user_ids:
  103. return response_error('请选择维修工人!')
  104. user = self.request.user
  105. with transaction.atomic():
  106. instance = RepairOrder.get_instance_by_id(pk, user.employee.tenant)
  107. if not instance.status == settings.DISPATCH:
  108. return response_ok('当前报修工单状态还未派单待派单,不能进行转单!')
  109. instance.repair_users.clear()
  110. for user_id in user_ids:
  111. instance.repair_users.add(user_id)
  112. instance.save()
  113. # 记录操作
  114. RepairOrderRecord.objects.create(repair_order=instance, status=settings.TURN_EMPLOYEE, user=user,
  115. repair_users=user_ids)
  116. except CustomError as e:
  117. return response_error(e.get_error_msg())
  118. except Exception as e:
  119. return response_error(str(e))
  120. return response_ok('派工完成!')
  121. @action(methods=['post'], detail=True)
  122. def cancel(self, request, pk):
  123. # 作废
  124. try:
  125. if not self.request.user.has_perm('repair_order.invalid_repair_order'):
  126. raise CustomError(u"您没有[报修工单-作废]权限,无法执行该操作,请联系管理员分配权限!")
  127. with transaction.atomic():
  128. user = self.request.user
  129. instance = RepairOrder.get_instance_by_id(pk, user.employee.tenant)
  130. instance.invalid(user)
  131. except CustomError as e:
  132. return response_error(e.get_error_msg())
  133. except Exception as e:
  134. return response_error(str(e))
  135. return response_ok('工单作废完成!')