views.py 13 KB

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