views.py 15 KB

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