views.py 17 KB

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