views.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296
  1. # coding=utf-8
  2. from rest_framework.views import APIView
  3. from django.db.models import Q
  4. import traceback
  5. import datetime
  6. from rest_framework.serializers import ValidationError
  7. from django.utils import timezone
  8. from rest_framework.decorators import action
  9. from utils.permission import isLogin, permission_required, check_permission
  10. from utils.custom_modelviewset import CustomModelViewSet
  11. from utils import response_ok, response_error
  12. from utils.exceptions import CustomError
  13. from apps.log.models import BizLog
  14. from apps.option.models import Option
  15. from apps.option.serializers import OptionComboboxSerializer
  16. from .models import ReportCustomer,NewCustomer,Review
  17. from .serializers import ReportCustomerSerializer,NewCustomerSerializer, ReviewSerializer
  18. from .filters import ReportCustomerFilter,NewCustomerFilter,ReviewFilter
  19. from django.contrib.auth import get_user_model
  20. User = get_user_model()
  21. class ReportCustomerViewSet(CustomModelViewSet):
  22. permission_classes = [isLogin]
  23. queryset = ReportCustomer.objects.filter()
  24. serializer_class = ReportCustomerSerializer
  25. @permission_required('customer.view_report_customer')
  26. def filter_queryset(self, queryset):
  27. queryset = queryset.filter(
  28. Q(store_id__in=self.request.user.get_manager_range()) |
  29. Q(create_user=self.request.user))
  30. f = ReportCustomerFilter(self.request.GET, queryset=queryset)
  31. return f.qs
  32. @permission_required('customer.add_report_customer')
  33. def perform_create(self, serializer):
  34. super(ReportCustomerViewSet, self).perform_create(serializer)
  35. instance = serializer.instance
  36. validated_data = serializer.validated_data
  37. BizLog.objects.addnew(self.request.user, BizLog.INSERT,
  38. u'添加客户报备[%s],id=%d' % (instance.name, instance.id), validated_data)
  39. @permission_required('customer.add_report_customer')
  40. def perform_update(self, serializer):
  41. super(ReportCustomerViewSet, self).perform_update(serializer)
  42. instance = serializer.instance
  43. validated_data = serializer.validated_data
  44. BizLog.objects.addnew(self.request.user, BizLog.UPDATE,
  45. u'修改客户报备[%s],id=%d' % (instance.name, instance.id), validated_data)
  46. @permission_required('customer.delete_report_customer')
  47. def perform_destroy(self, instance):
  48. BizLog.objects.addnew(self.request.user, BizLog.DELETE,
  49. u'删除客户报备[%s],id=%d' % (instance.name, instance.id))
  50. super(ReportCustomerViewSet, self).perform_destroy(instance)
  51. @action(methods=['post'], detail=True)
  52. def dispatch_customer(self, request, pk):
  53. check_permission(request, 'customer.check_report_customer')
  54. # 报备客户审核 分配
  55. user_id = request.POST.get('user')
  56. try:
  57. instance = ReportCustomer.objects.filter(id=pk).first()
  58. if not instance:
  59. raise CustomError('当前客户报备信息有误,请刷新重试!')
  60. instance.check_user = self.request.user
  61. instance.report_status = ReportCustomer.CHECKED
  62. instance.check_time = timezone.now()
  63. instance.save()
  64. BizLog.objects.addnew(request.user, BizLog.INSERT,
  65. u'分配客户报备[%s],id=%d' % (instance.name, instance.id))
  66. # 创建潜客跟踪表
  67. potential_level = Option.objects.filter(type=Option.POTENTIAL_LEVEL, enable=True).order_by('sort').first()
  68. stage_progress = Option.objects.filter(type=Option.STAGE_PROGRESS, enable=True).order_by('sort').first()
  69. if not potential_level.track_day:
  70. raise CustomError('当前潜客级别,没有可用跟踪天数!')
  71. next_time = (timezone.now() + datetime.timedelta(days=potential_level.track_day)).strftime('%Y-%m-%d')
  72. customer = NewCustomer.objects.create(report_customer=instance, potential_level=potential_level,
  73. track_user_id=user_id, next_time=next_time, stage_progress=stage_progress,
  74. create_user=instance.create_user,store=instance.store,
  75. name=instance.name,tel=instance.tel,village=instance.village,
  76. address=instance.address,source=instance.source,notes=instance.notes,
  77. )
  78. projects = instance.project.all()
  79. for project in projects:
  80. customer.project.add(project.id)
  81. except CustomError as e:
  82. return response_error(e.get_error_msg())
  83. except Exception as e:
  84. return response_error(str(e))
  85. return response_ok()
  86. @action(methods=['post'], detail=True)
  87. def sign_hit(self, request, pk):
  88. check_permission(request, 'customer.check_report_customer')
  89. # 报备客户标记撞单
  90. try:
  91. instance = ReportCustomer.objects.filter(id=pk).first()
  92. if not instance:
  93. raise CustomError('当前客户报备信息有误,请刷新重试!')
  94. instance.check_user = self.request.user
  95. instance.report_status = ReportCustomer.REPEAT_REPORT
  96. instance.check_time = timezone.now()
  97. instance.save()
  98. BizLog.objects.addnew(request.user, BizLog.INSERT,
  99. u'标记客户[%s]为撞单,id=%d' % (instance.name, instance.id))
  100. except CustomError as e:
  101. return response_error(e.get_error_msg())
  102. except Exception as e:
  103. return response_error(str(e))
  104. return response_ok()
  105. class ReportCustomerDictView(APIView):
  106. permission_classes = [isLogin]
  107. def get(self, request):
  108. source = Option.objects.filter(type=Option.CUSTOMER_SOURCE, enable=True)
  109. project = Option.objects.filter(type=Option.CATEGORY, enable=True)
  110. level = Option.objects.filter(type=Option.POTENTIAL_LEVEL, enable=True)
  111. serializer_source = OptionComboboxSerializer(source, many=True)
  112. serializer_project = OptionComboboxSerializer(project, many=True)
  113. serializer_level = OptionComboboxSerializer(level, many=True)
  114. return response_ok({
  115. 'source': serializer_source.data,
  116. 'project': serializer_project.data,
  117. 'level': serializer_level.data,
  118. })
  119. class UserDictView(APIView):
  120. permission_classes = [isLogin]
  121. def get(self, request):
  122. store = request.user.store
  123. if not store:
  124. return response_error('当前账号未绑定门店,禁止分配客户!')
  125. users = User.objects.filter(store=store).values('id', 'name')
  126. users = [{'value': user['id'], 'lable': user['name']} for user in users]
  127. return response_ok(users)
  128. class NewCustomerViewSet(CustomModelViewSet):
  129. permission_classes = []
  130. queryset = NewCustomer.objects.filter()
  131. serializer_class = NewCustomerSerializer
  132. def filter_queryset(self, queryset):
  133. queryset = queryset.filter()
  134. f = NewCustomerFilter(self.request.GET, queryset=queryset)
  135. return f.qs
  136. def perform_update(self, serializer):
  137. super(NewCustomerViewSet, self).perform_update(serializer)
  138. instance = serializer.instance
  139. validated_data = serializer.validated_data
  140. def paginate_queryset(self, queryset):
  141. if self.paginator is None or self.request.GET.get('export'):
  142. return None
  143. return self.paginator.paginate_queryset(queryset, self.request, view=self)
  144. @action(methods=['post'], detail=True)
  145. def add_review(self, request, pk):
  146. # 添加跟踪报告
  147. check_permission(request, 'customer.add_review')
  148. description = request.POST.get('description')
  149. instruction = request.POST.get('instruction')
  150. is_entry = request.POST.get('is_entry') == '1'
  151. is_giveup = request.POST.get('is_giveup') == '1'
  152. potential_level = request.POST.get('potential_level')
  153. next_time = request.POST.get('next_time')
  154. try:
  155. instance = NewCustomer.objects.filter(id=pk).first()
  156. if not instance:
  157. raise CustomError('当前客户信息有误,请刷新重试!')
  158. data = {
  159. 'customer':instance.id,
  160. 'store':request.user.store.id,
  161. 'create_user':request.user.id,
  162. 'description':description,
  163. 'instruction':instruction,
  164. 'is_entry':is_entry,
  165. 'is_giveup':is_giveup,
  166. }
  167. serializer = ReviewSerializer(data=data)
  168. if serializer.is_valid(raise_exception=True):
  169. serializer.save()
  170. sort = 1
  171. track_day = 1
  172. try:
  173. sort = int(instance.stage_progress.sort)
  174. track_day = int(instance.stage_progress.track_day)
  175. except:
  176. pass
  177. # 预定客户,提交跟踪报告此字段为空
  178. if sort > 1 or not next_time:
  179. next_time = (timezone.now() + datetime.timedelta(days=track_day)).strftime('%Y-%m-%d')
  180. data = {
  181. 'potential_level':potential_level or None, #预定客户,无客户等级
  182. 'next_time':next_time,
  183. 'end_time':timezone.now(),
  184. 'stage_progress':instance.stage_progress.id,
  185. }
  186. ser = self.serializer_class(instance, data=data, partial=True)
  187. if ser.is_valid(raise_exception=True):
  188. ser.save()
  189. except ValidationError as e:
  190. traceback.print_exc()
  191. return response_error('数据格式有误')
  192. except CustomError as e:
  193. return response_error(e.get_error_msg())
  194. except Exception as e:
  195. return response_error(str(e))
  196. return response_ok()
  197. class StageCountView(APIView):
  198. permission_classes = [isLogin]
  199. def get(self,request):
  200. data = []
  201. stage_progress = Option.objects.filter(type=Option.STAGE_PROGRESS, enable=True).order_by('sort')
  202. user = request.user
  203. time_now = timezone.now().strftime('%Y-%m-%d')
  204. for stage in stage_progress:
  205. new_customers = NewCustomer.objects.filter(Q(track_user=user) |
  206. Q(track_user__store_id__in=request.user.get_manager_range()),
  207. stage_progress=stage)
  208. stage_count = {
  209. 'stage_id': stage.id, # 阶段名称
  210. 'stage': stage.name, # 阶段名称
  211. 'total_count': new_customers.count(), # 总人数
  212. 'today_count': new_customers.filter(next_time=time_now).count(), # 今日人数
  213. 'overdue_count': new_customers.filter(next_time__lt=time_now).count() # 逾期人数
  214. }
  215. data.append(stage_count)
  216. return response_ok(data)
  217. class ReviewViewSet(CustomModelViewSet):
  218. permission_classes = [isLogin]
  219. queryset = Review.objects.filter()
  220. serializer_class = ReviewSerializer
  221. def filter_queryset(self, queryset):
  222. queryset = queryset.filter()
  223. f = ReviewFilter(self.request.GET, queryset=queryset)
  224. return f.qs
  225. @action(methods=['post'], detail=True)
  226. def track_review(self, request, pk):
  227. check_permission(request, 'customer.check_review')
  228. # 跟踪审核
  229. check_status = request.POST.get('check_status')
  230. check_comment = request.POST.get('check_comment')
  231. next_time = request.POST.get('next_time')
  232. try:
  233. instance = Review.objects.filter(id=pk).first()
  234. if int(check_status) == Review.KEEPUP:
  235. instance.check_user = request.user
  236. instance.check_status = check_status
  237. instance.check_comment = check_comment
  238. instance.check_time = timezone.now()
  239. instance.save()
  240. if int(check_status) == Review.ABANDON:
  241. instance.check_user = request.user
  242. instance.check_status = check_status
  243. instance.check_comment = check_comment
  244. instance.check_time = timezone.now()
  245. instance.save()
  246. instance.customer.status = NewCustomer.ABANDONED
  247. instance.customer.next_time = next_time
  248. instance.customer.save()
  249. except CustomError as e:
  250. return response_error(e.get_error_msg())
  251. except Exception as e:
  252. return response_error(str(e))
  253. return response_ok()