views.py 13 KB

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