views.py 17 KB

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