views.py 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308
  1. # coding=utf-8
  2. from django.conf import settings
  3. from django.db import transaction
  4. from rest_framework import generics
  5. from rest_framework.views import APIView
  6. from rest_framework.decorators import action
  7. from utils import response_ok, response_error
  8. from utils.custom_modelviewset import CustomModelViewSet
  9. from utils.exceptions import CustomError
  10. from utils.permission import IsTenantUser, permission_required, isLogin, IsEmployee
  11. from apps.tenant.repair_order.models import RepairOrder, RepairOrderRecord, RepairOrderComment, RepairOrderFinish
  12. from apps.tenant.repair_order.filters import RepairOrderFilter
  13. from apps.upload.models import Upload
  14. from apps.log.models import BizLog
  15. from apps.tenant import tenant_log
  16. from apps.tenant.inspection_order.models import InspectionOrder
  17. from apps.WechatApplet.models import WechatApplet
  18. from apps.wxapp.models import CustomerWechat
  19. from .serializers import (RepairOrderSerializer, RepairOrderListSerializer,
  20. RepairOrderDetailSerializer)
  21. from apps.tenant.employee.models import Employee
  22. class RepairOrderDetailView(generics.RetrieveAPIView):
  23. permission_classes = [isLogin, ]
  24. queryset = RepairOrder.objects.filter(delete=False)
  25. serializer_class = RepairOrderDetailSerializer
  26. def retrieve(self, request, *args, **kwargs):
  27. instance = self.get_object()
  28. serializer = self.get_serializer(instance)
  29. return response_ok(serializer.data)
  30. class RepairOrderMineView(generics.ListAPIView):
  31. permission_classes = [isLogin, ]
  32. queryset = RepairOrder.objects.filter(delete=False)
  33. serializer_class = RepairOrderListSerializer
  34. def filter_queryset(self, queryset):
  35. queryset = queryset.filter(tenant=self.request.user.employee.tenant, user=self.request.user)
  36. f = RepairOrderFilter(self.request.GET, queryset=queryset)
  37. return f.qs
  38. class RepairOrderCountView(APIView):
  39. def get(self, request):
  40. if not request.user or not request.user.is_authenticated:
  41. return response_ok({
  42. 'NOT_CHECKED_COUNT': 0,
  43. 'CHECKED_COUNT': 0,
  44. })
  45. queryset = RepairOrder.objects.filter(delete=False, tenant=self.request.user.employee.tenant)
  46. return response_ok({
  47. 'NOT_CHECKED_COUNT': queryset.filter(status=settings.NOT_CHECKED).count(),
  48. 'CHECKED_COUNT': queryset.filter(status=settings.CHECKED).count()
  49. })
  50. class RepairOrderAllView(generics.ListAPIView):
  51. permission_classes = [isLogin, ]
  52. queryset = RepairOrder.objects.filter(delete=False)
  53. serializer_class = RepairOrderListSerializer
  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. class DispatchRepairOrderView(generics.ListAPIView):
  59. # 我的维修单
  60. permission_classes = [IsEmployee, ]
  61. # 查询维修工单记录状态为已派单的
  62. queryset = RepairOrder.objects.filter()
  63. serializer_class = RepairOrderDetailSerializer
  64. def get_queryset(self):
  65. queryset = self.queryset.filter(tenant=self.request.user.employee.tenant, repair_users=self.request.user)
  66. return queryset
  67. def filter_queryset(self, queryset):
  68. f = RepairOrderFilter(self.request.GET, queryset=queryset)
  69. return f.qs
  70. class RepairOrderViewSet(CustomModelViewSet):
  71. permission_classes = (isLogin, )
  72. queryset = RepairOrder.objects.filter(delete=False)
  73. serializer_class = RepairOrderSerializer
  74. def filter_queryset(self, queryset):
  75. queryset = queryset.filter(tenant=self.request.user.employee.tenant, )
  76. if self.request.user.is_repair:
  77. queryset = queryset.filter(repair_users=self.request.user)
  78. f = RepairOrderFilter(self.request.GET, queryset=queryset)
  79. return f.qs
  80. def perform_create(self, serializer):
  81. super(RepairOrderViewSet, self).perform_create(serializer)
  82. instance = serializer.instance
  83. # 发送微信通知
  84. emplees = Employee.objects.filter(tenant=instance.tenant, type=Employee.ADMIN)
  85. for emp in emplees:
  86. CustomerWechat.sendWaitCheckMsg(emp.user, instance.user.employee.name, instance.device_address,
  87. instance.fault_des, instance.no)
  88. validated_data = serializer.validated_data
  89. tenant_log(self.request.user.employee, BizLog.INSERT, u'添加报修工单[%s],id=%d' % (instance.name, instance.id),
  90. validated_data)
  91. @action(methods=['post'], detail=False)
  92. def upload_image(self, request):
  93. file = self.request.FILES.get('file')
  94. user = self.request.user
  95. upload = Upload.objects._addnew(user.employee.tenant, user, Upload.REPAIR_IMAGE, file)
  96. if upload:
  97. return response_ok(upload.id)
  98. return response_error('上传失败,请重新上传!')
  99. @action(methods=['get'], detail=True)
  100. def check(self, request, pk):
  101. # 审核
  102. try:
  103. if not self.request.user.is_admin():
  104. raise CustomError(u"非管理人员,禁止操作!")
  105. with transaction.atomic():
  106. user = self.request.user
  107. instance = RepairOrder.get_instance_by_id(pk, user.employee.tenant)
  108. instance.check_repair_order(user)
  109. except CustomError as e:
  110. return response_error(e.get_error_msg())
  111. except Exception as e:
  112. return response_error(str(e))
  113. return response_ok('审核完成!')
  114. @action(methods=['post'], detail=True)
  115. def hang_up(self, request, pk):
  116. # 挂起
  117. try:
  118. if not self.request.user.is_employee():
  119. raise CustomError(u"非维修师傅,禁止操作!")
  120. reason = request.data.get('reason')
  121. if not reason:
  122. raise CustomError('请填写挂起原因')
  123. with transaction.atomic():
  124. user = self.request.user
  125. instance = RepairOrder.get_instance_by_id(pk, user.employee.tenant)
  126. instance.hange_up_repair_order(user, reason)
  127. except CustomError as e:
  128. return response_error(e.get_error_msg())
  129. except Exception as e:
  130. return response_error(str(e))
  131. return response_ok('成功挂起!')
  132. @action(methods=['get'], detail=True)
  133. def cancel_hang_up(self, request, pk):
  134. # 取消挂起,继续施工
  135. try:
  136. if not self.request.user.is_employee():
  137. raise CustomError(u"非维修师傅,禁止操作!")
  138. with transaction.atomic():
  139. user = self.request.user
  140. instance = RepairOrder.get_instance_by_id(pk, user.employee.tenant)
  141. instance.cancel_hange_up_repair_order(user)
  142. except CustomError as e:
  143. return response_error(e.get_error_msg())
  144. except Exception as e:
  145. return response_error(str(e))
  146. return response_ok('成功取消挂起!')
  147. @action(methods=['get'], detail=True)
  148. def rob_repair(self, request, pk):
  149. # 抢单
  150. try:
  151. if not self.request.user.is_employee():
  152. raise CustomError(u"非维修师傅,禁止操作!")
  153. with transaction.atomic():
  154. user = self.request.user
  155. instance = RepairOrder.get_instance_by_id(pk, user.employee.tenant)
  156. if not instance.status == settings.CHECKED:
  157. raise CustomError('当前报修工单状态非待派单状态,不能进行抢单!')
  158. instance.status = settings.DISPATCH
  159. instance.repair_users = user
  160. instance.save()
  161. RepairOrderRecord.objects.create(repair_order=instance, status=settings.DISPATCH, user=user,
  162. repair_users=user.id, notes='成功抢单')
  163. except CustomError as e:
  164. return response_error(e.get_error_msg())
  165. except Exception as e:
  166. return response_error(str(e))
  167. return response_ok('抢单成功!')
  168. @action(methods=['post'], detail=True)
  169. def finish(self, request, pk):
  170. # 完工
  171. if not self.request.user.is_employee():
  172. raise CustomError(u"非维修师傅,禁止操作!")
  173. try:
  174. content = request.data.get('content')
  175. images = request.data.get('images', None)
  176. quality_date = request.data.get('quality_date') or None
  177. fault_cause_id = request.data.get('fault_cause')
  178. user = self.request.user
  179. instance = RepairOrder.get_instance_by_id(pk, user.employee.tenant)
  180. if not instance.status == settings.DISPATCH:
  181. raise CustomError('当前报修工单状态非派单状态,不能进行完工操作!')
  182. with transaction.atomic():
  183. # 更新工单状态为完工
  184. instance.status = settings.FINISH
  185. instance.save()
  186. # 写入完工表
  187. repair_order_finish = RepairOrderFinish.objects.create(repair_order_id=pk,
  188. fault_cause_id=fault_cause_id,
  189. quality_date=quality_date, content=content)
  190. if images:
  191. for image in images.split(','):
  192. repair_order_finish.images.add(image)
  193. repair_order_finish.save()
  194. # 增加工单记录
  195. RepairOrderRecord.objects.create(repair_order_id=pk, status=settings.FINISH, user=user, notes=content)
  196. # 判断是否为巡检转报修,更新巡检状态
  197. inspection_order = InspectionOrder.objects.filter(repair_order=instance).first()
  198. if inspection_order:
  199. inspection_order.status = InspectionOrder.REPAIR
  200. inspection_order.save()
  201. # 发送微信通知
  202. CustomerWechat.sendFinishMsg(instance.user, user.employee.name, instance.device_address,
  203. instance.fault_des, instance.no)
  204. except CustomError as e:
  205. return response_error(e.get_error_msg())
  206. except Exception as e:
  207. return response_error(str(e))
  208. return response_ok('完工完成!')
  209. @action(methods=['get'], detail=True)
  210. def invalid(self, request, pk):
  211. # 作废
  212. try:
  213. if not self.request.user.is_admin():
  214. raise CustomError(u"非管理人员,禁止操作!")
  215. with transaction.atomic():
  216. user = self.request.user
  217. instance = RepairOrder.get_instance_by_id(pk, user.employee.tenant)
  218. instance.invalid(user)
  219. except CustomError as e:
  220. return response_error(e.get_error_msg())
  221. except Exception as e:
  222. return response_error(str(e))
  223. return response_ok('工单作废完成!')
  224. @action(methods=['post'], detail=True)
  225. def comment(self, request, pk):
  226. # 评价
  227. try:
  228. content = request.data.get('content')
  229. start = request.data.get('start', 5)
  230. if not content:
  231. return response_error('评价内容不能为空!')
  232. user = self.request.user
  233. instance = RepairOrder.get_instance_by_id(pk, user.employee.tenant)
  234. if not instance.status == settings.FINISH:
  235. raise CustomError('当前报修工单状态非派单状态,不能进行评价操作!')
  236. with transaction.atomic():
  237. instance.status = settings.APPRAISE
  238. instance.save()
  239. RepairOrderComment.objects.create(repair_order=instance, content=content, start=start, user=user, repair_user=instance.repair_users)
  240. # 增加工单记录
  241. RepairOrderRecord.objects.create(repair_order_id=pk, status=settings.APPRAISE, user=user)
  242. except CustomError as e:
  243. return response_error(e.get_error_msg())
  244. except Exception as e:
  245. return response_error(str(e))
  246. return response_ok('工单评价完成!')
  247. @action(methods=['get'], detail=True)
  248. def repair_order_record(self, request, pk):
  249. # 维修工单记录
  250. user = self.request.user
  251. instance = RepairOrder.get_instance_by_id(pk, user.employee.tenant)
  252. records = RepairOrderRecord.objects.filter(repair_order=instance).order_by('-operation_time')
  253. data = []
  254. for record in records:
  255. dict = record.get_records(instance.id)
  256. data.append(dict)
  257. return response_ok(data)
  258. def destroy(self, request, *args, **kwargs):
  259. try:
  260. if not self.request.user.is_admin():
  261. raise CustomError(u"非管理人员,禁止操作!")
  262. with transaction.atomic():
  263. instance = self.get_object()
  264. instance.delete = True
  265. instance.save()
  266. tenant_log(self.request.user.employee, BizLog.DELETE,
  267. u'删除报修工单[%s],id=%d' % (instance.name, instance.id))
  268. except CustomError as e:
  269. return response_error(e.get_error_msg())
  270. except Exception as e:
  271. return response_error(str(e))
  272. return response_ok()