views.py 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  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. # 租户下面的账号,只查询账号所在区域的部门数据
  25. if request.user.is_admin() and request.user.employee.department:
  26. ret['area'] = [{
  27. 'id': request.user.employee.department.area.id,
  28. 'name': request.user.employee.department.area.name,
  29. }]
  30. ret['department'] = AreaDepartmentSerializer(
  31. Department.objects.filter(delete=False, enable=True, area=request.user.employee.department.area),
  32. many=True).data
  33. else:
  34. ret['area'] = AreaSerializer(Area.objects.filter(delete=False, enable=True, tenant=tenant), many=True).data
  35. ret['department'] = AreaDepartmentSerializer(
  36. Department.objects.filter(delete=False, enable=True, area__tenant=tenant), many=True).data
  37. return response_ok(ret)
  38. class GetEmployeeView(APIView):
  39. permission_classes = [IsTenantUser, ]
  40. def get(self, request):
  41. department_id = request.GET.get('department_id')
  42. employees = EmployeeSerializer(
  43. Employee.objects.filter(status__lt=Employee.LEAVE_OFFICE, type=Employee.EMPLOYEE,
  44. department_id=department_id), many=True).data
  45. data = []
  46. for emp in employees:
  47. dict = {
  48. 'id': emp['user'],
  49. 'name': '{0}-{1}-{2}-{3}'.format(emp['name'], emp['tel'], emp['position_text'], emp['status_text'])
  50. }
  51. data.append(dict)
  52. return response_ok(data)
  53. class OrderRecordView(APIView):
  54. permission_classes = [IsTenantUser, ]
  55. def get(self, request):
  56. order_id = request.GET.get('order_id')
  57. records = RepairOrderRecord.objects.filter(repair_order_id=order_id).order_by('-operation_time')
  58. data = []
  59. for record in records:
  60. dict = record.get_records(order_id)
  61. data.append(dict)
  62. return response_ok(data)
  63. class RepairOrderViewSet(CustomModelViewSet):
  64. permission_classes = [IsTenantUser, ]
  65. queryset = RepairOrder.objects.filter(delete=False)
  66. serializer_class = RepairOrderSerializer
  67. @permission_required('repair_order.browse_repair_order')
  68. def filter_queryset(self, queryset):
  69. queryset = queryset.filter(tenant=self.request.user.employee.tenant)
  70. f = RepairOrderFilter(self.request.GET, queryset=queryset)
  71. return f.qs
  72. @permission_required('repair_order.delete_repair_order')
  73. def destroy(self, request, *args, **kwargs):
  74. with transaction.atomic():
  75. instance = self.get_object()
  76. if instance.tenant != request.user.employee.tenant:
  77. raise CustomError(u'禁止跨租户操作!')
  78. super(RepairOrderViewSet, self).destroy(self, request, *args, **kwargs)
  79. tenant_log(self.request.user.employee, BizLog.DELETE, u'删除报修单[%s],id=%d' % (instance.no, instance.id))
  80. return response_ok()
  81. @action(methods=['post'], detail=True)
  82. def check(self, request, pk):
  83. # 审核
  84. try:
  85. if not self.request.user.has_perm('repair_order.check_repair_order'):
  86. raise CustomError(u"您没有[报修工单-审核]权限,无法执行该操作,请联系管理员分配权限!")
  87. with transaction.atomic():
  88. user = self.request.user
  89. instance = RepairOrder.get_instance_by_id(pk, user.employee.tenant)
  90. instance.check_repair_order(user)
  91. except CustomError as e:
  92. return response_error(e.get_error_msg())
  93. except Exception as e:
  94. return response_error(str(e))
  95. return response_ok('审核完成!')
  96. @action(methods=['post'], detail=True)
  97. def dispatch_employee(self, request, pk):
  98. # 派工
  99. try:
  100. if not self.request.user.has_perm('repair_order.dispatch_repair_order'):
  101. raise CustomError(u"您没有[报修工单-派工]权限,无法执行该操作,请联系管理员分配权限!")
  102. user_ids = self.request.data.get('user_ids')
  103. if not user_ids:
  104. return response_error('请选择维修工人!')
  105. user = self.request.user
  106. with transaction.atomic():
  107. instance = RepairOrder.get_instance_by_id(pk, user.employee.tenant)
  108. if not instance.status == settings.CHECKED:
  109. return response_ok('当前报修工单状态非待派单状态,不能进行派单!')
  110. instance.dispatch_repair_order(user, user_ids)
  111. except CustomError as e:
  112. return response_error(e.get_error_msg())
  113. except Exception as e:
  114. import traceback
  115. traceback.print_exc()
  116. return response_error(str(e))
  117. return response_ok('派工完成!')
  118. @action(methods=['post'], detail=True)
  119. def turn_employee(self, request, pk):
  120. # 转单
  121. try:
  122. if not self.request.user.has_perm('repair_order.dispatch_repair_order'):
  123. raise CustomError(u"您没有[报修工单-派工]权限,无法执行该操作,请联系管理员分配权限!")
  124. user_ids = self.request.data.get('user_ids')
  125. if not user_ids:
  126. return response_error('请选择维修工人!')
  127. user = self.request.user
  128. with transaction.atomic():
  129. instance = RepairOrder.get_instance_by_id(pk, user.employee.tenant)
  130. if not instance.status == settings.DISPATCH:
  131. return response_ok('当前报修工单状态还未派单待派单,不能进行转单!')
  132. instance.repair_users.clear()
  133. for user_id in user_ids:
  134. instance.repair_users.add(user_id)
  135. instance.save()
  136. # 记录操作
  137. RepairOrderRecord.objects.create(repair_order=instance, status=settings.TURN_EMPLOYEE, user=user,
  138. repair_users=user_ids)
  139. except CustomError as e:
  140. return response_error(e.get_error_msg())
  141. except Exception as e:
  142. return response_error(str(e))
  143. return response_ok('派工完成!')
  144. @action(methods=['post'], detail=True)
  145. def cancel(self, request, pk):
  146. # 作废
  147. try:
  148. if not self.request.user.has_perm('repair_order.invalid_repair_order'):
  149. raise CustomError(u"您没有[报修工单-作废]权限,无法执行该操作,请联系管理员分配权限!")
  150. with transaction.atomic():
  151. user = self.request.user
  152. instance = RepairOrder.get_instance_by_id(pk, user.employee.tenant)
  153. instance.invalid(user)
  154. except CustomError as e:
  155. return response_error(e.get_error_msg())
  156. except Exception as e:
  157. return response_error(str(e))
  158. return response_ok('工单作废完成!')