views.py 16 KB

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