---公共客戶(公共資源)
一、沒有報名
二、3天沒有跟進
三、15天沒有成單
客戶分佈表
龍泰 男 yuan 2018-5-1 3天未跟進
龍泰 男 三江 2018-5-5 15天未成單
龍泰 男 暴雨 2018-5-21 正在跟進
---個人客戶(搶單)
crontab:
2018-5-15 12:00 龍泰 男 三江 2018-5-15 正在跟進
2018-5-16 0:0
2018-5-17 0:0
2018-5-18 0:0
2018-5-19 0:0 龍泰 男 三江 2018-5-19 3天未跟進
key: CustomerDistrbute爲何建立 ,爲何不能直接用Customer
由於:銷售能夠查看,本身的客戶是否已過時,是否正在跟進,月底能夠算業績!
不能說沒談成,就沒有業績!!
一過時,就改了。定時腳原本完成!!
linux 固定時間,執行腳本 os 去作,
天天00:00去監測!
隔半天或隔一天,腳本天天凌晨監測一遍過時就放到公共客戶。
新增客戶分佈表:
class CustomerDistrbute(models.Model): customer = models.ForeignKey("Customer", related_name="customers") consultant = models.ForeignKey(verbose_name="課程顧問", to="UserInfo", limit_choices_to={"depart_id":1001}) date = models.DateField() status_choices = ( (1, '正在跟進'), (2, '已報名'), (3, '三天未跟進'), (4, '15天未成單'), ) status = models.IntegerField(choices=status_choices, default=1) meno = models.CharField(max_length=255) def __str__(self): return self.customer.name + ":" + self.consultant.name
新的表結構css
知識點html
temp.append(url(r'^public/', self.public_customer))
datetime.datetime datetime.date datetime.time datetime.timedelta(days=7) now = datetime.datetime.now() delta_day3 = datetime.timedelta(days=3) delta_day15 = datetime.timedelta(days=15)
# 3天未跟進 now - last_consult_date > 3 --> last_consult_date < now - 3 # 15天未成單 now - recv_date > 15 --> recv_date < now - 15 Q查詢 last_consult_date__lt recv_date__lt customer_list = Customer.objects.filter( Q(last_consult_date__lt=now-delta_day3)|Q(recv_date__lt=now-delta_day15),status=2)
# 不該該讓以前的課程顧問 再看到這個已經放到公共名單的人了 user_id = 3 customer_list = Customer.objects.filter( Q(last_consult_date__lt=now - delta_day3) | Q(recv_date__lt=now - delta_day15),
status=2).exclude(consultant=user_id)
# print(customer_list.query) """ SELECT "crm_customer"."id", "crm_customer"."qq", "crm_customer"."name", "crm_customer"."gender", "crm_customer"."education", "crm_customer"."graduation_school", "crm_customer"."major", "crm_customer"."experience", "crm_customer"."work_status", "crm_customer"."company", "crm_customer"."salary", "crm_customer"."source", "crm_customer"."referral_from_id", "crm_customer"."status", "crm_customer"."consultant_id", "crm_customer"."date", "crm_customer"."recv_date", "crm_customer"."last_consult_date" FROM "crm_customer" WHERE (("crm_customer"."last_consult_date" < 2018-06-24 OR "crm_customer"."recv_date" < 2018-06-12) AND "crm_customer"."status" = 2) """
def public_customer(self, request): # 未報名且3天未跟進或者15天未成單 from django.db.models import Q import datetime """ datetime.datetime datetime.date datetime.time datetime.timedelta(days=7) """ now = datetime.datetime.now() delta_day3 = datetime.timedelta(days=3) delta_day15 = datetime.timedelta(days=15) # 3天未跟進 now - last_consult_date > 3 --> last_consult_date < now - 3 # 15天未成單 now - recv_date > 15 --> recv_date < now - 15 # customer_list = Customer.objects.filter( # Q(last_consult_date__lt=now-delta_day3)|Q(recv_date__lt=now-delta_day15),status=2) # 不該該讓以前的課程顧問 再看到這我的已經放到公共名單的人了 user_id = 3 customer_list = Customer.objects.filter( Q(last_consult_date__lt=now - delta_day3) | Q(recv_date__lt=now - delta_day15), status=2).exclude(consultant=user_id) # print(customer_list.query) """ SELECT "crm_customer"."id", "crm_customer"."qq", "crm_customer"."name", "crm_customer"."gender", "crm_customer"."education", "crm_customer"."graduation_school", "crm_customer"."major", "crm_customer"."experience", "crm_customer"."work_status", "crm_customer"."company", "crm_customer"."salary", "crm_customer"."source", "crm_customer"."referral_from_id", "crm_customer"."status", "crm_customer"."consultant_id", "crm_customer"."date", "crm_customer"."recv_date", "crm_customer"."last_consult_date" FROM "crm_customer" WHERE (("crm_customer"."last_consult_date" < 2018-06-24 OR "crm_customer"."recv_date" < 2018-06-12) AND "crm_customer"."status" = 2) """ print("----->>:", customer_list) return render(request, 'public.html', locals())
------------------------
temp.append(url(r'^public/', self.public_customer))
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <link rel="stylesheet" href="/static/bootstrap/css/bootstrap.css"> </head> <body> <h3>公共客戶</h3> <div class="container"> <div class="row"> <div class="col-md-6"> <table class="table table-bordered table-striped"> <thead> <tr> <th>ID</th> <th>姓名</th> <th>QQ</th> <th>課程顧問</th> <th>跟進詳情</th> <th>確認跟進</th> </tr> </thead> <tbody> {% for customer in customer_list %} <tr> <td>{{ forloop.counter }}</td> <td>{{ customer.name }}</td> <td>{{ customer.qq }}</td> <td>{{ customer.consultant }}</td> <td><a href="/stark/crm/consultrecord/?customer={{ customer.pk }}">跟進記錄</a></td> <td><a href="/stark/crm/customer/further/{{ customer.pk }}">確認跟進</a></td> </tr> {% endfor %} </tbody> </table> </div> </div> </div> </body> </html>
知識點linux
temp.append(url(r'^further/(\d+)', self.further))
必定要先過濾;防止多個用戶同時搶單,給了 最後一個搶單的人;先過濾以後再搶單,注意提示已經被跟進了。ajax
ret = Customer.objects.filter(pk=customer_id).filter( Q(last_consult_date__lt=now-delta_day3)|Q(recv_date__lt=now-delta_day15),status=2).update( consultant=user_id,last_consult_date = now,recv_date=now )
爲個人客戶頁面作準備sql
CustomerDistrbute.objects.create( customer_id=customer_id,consultant_id=user_id, date=now,status=1, )
temp.append(url(r'^further/(\d+)', self.further)) ------------------------------------------------------- def further(self, request,customer_id): """確認跟進""" user_id = 3 now = datetime.datetime.now() delta_day3 = datetime.timedelta(days=3) delta_day15 = datetime.timedelta(days=15) # 爲該客戶更改課程顧問 和對應得時間, ret = Customer.objects.filter(pk=customer_id).filter( Q(last_consult_date__lt=now-delta_day3)|Q(recv_date__lt=now-delta_day15),status=2).update( consultant=user_id,last_consult_date = now,recv_date=now ) if not ret: return HttpResponse('已經被跟進了') CustomerDistrbute.objects.create( customer_id=customer_id,consultant_id=user_id, date=now,status=1, ) return HttpResponse('跟進成功')
知識點django
temp.append(url(r'^mycustomer/', self.mycustomer))
不能再 Customer表查詢,這裏查到的只是正在跟蹤的客戶信息bootstrap
可是,以前跟蹤過的客戶,狀態也要顯示app
customer_distrubute_list = CustomerDistrbute.objects.filter(consultant_id=user_id)
temp.append(url(r'^mycustomer/', self.mycustomer)) --------------------------------------------- def mycustomer(self, request): user_id = 3 customer_distrubute_list = CustomerDistrbute.objects.filter(consultant_id=user_id) return render(request,'mycustomer.html', locals())
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h4>個人客戶</h4> <ul> {% for customer_distrubute in customer_distrubute_list %} <li> {{ customer_distrubute.customer }} -----{{ customer_distrubute.date|date:'Y-m-d' }} -----{{ customer_distrubute.get_status_display }} </li> {% endfor %} </ul> </body> </html>
# -*- coding:utf-8 -*- from .models import * from stark.service.stark import site, ModelStark from django.utils.safestring import mark_safe from django.conf.urls import url from django.shortcuts import HttpResponse,reverse,redirect,render import datetime from django.db.models import Q class DepartmentConfig(ModelStark): list_display = ['title', 'code'] site.register(Department, DepartmentConfig) class UserInfoConfig(ModelStark): list_display = ["name", 'email', 'depart'] site.register(UserInfo, UserInfoConfig) class ClassListConfig(ModelStark): def display_classname(self,obj=None,header=False): if header: return "班級名稱" return "%s(%s)"%(obj.course.name, obj.semester) list_display = [display_classname, 'tutor', 'teachers'] site.register(ClassList, ClassListConfig) class CustomerConfig(ModelStark): def display_course(self, obj=None, header=False): if header: return "諮詢課程" temp = [] for course in obj.course.all(): temp.append("<a href='/stark/crm/customer/cancel_course/%s/%s' style='border:1px solid #369; padding:3px 6px;'><span>%s</span></a> "%(obj.pk,course.pk,course.name)) return mark_safe("".join(temp)) def cancel_course(self, request, customer_id, course_id): customer_obj = Customer.objects.filter(pk=customer_id).first() customer_obj.course.remove(course_id) return redirect(self.get_list_url()) # 重定向到當前表得查看頁面 def public_customer(self, request): # 未報名且3天未跟進或者15天未成單 from django.db.models import Q import datetime """ datetime.datetime datetime.date datetime.time datetime.timedelta(days=7) """ now = datetime.datetime.now() delta_day3 = datetime.timedelta(days=3) delta_day15 = datetime.timedelta(days=15) # 3天未跟進 now - last_consult_date > 3 --> last_consult_date < now - 3 # 15天未成單 now - recv_date > 15 --> recv_date < now - 15 # customer_list = Customer.objects.filter( # Q(last_consult_date__lt=now-delta_day3)|Q(recv_date__lt=now-delta_day15),status=2) # 不該該讓以前的課程顧問 再看到這個已經放到公共名單的人了 user_id = 3 customer_list = Customer.objects.filter( Q(last_consult_date__lt=now - delta_day3) | Q(recv_date__lt=now - delta_day15), status=2).exclude(consultant=user_id) # print(customer_list.query) """ SELECT "crm_customer"."id", "crm_customer"."qq", "crm_customer"."name", "crm_customer"."gender", "crm_customer"."education", "crm_customer"."graduation_school", "crm_customer"."major", "crm_customer"."experience", "crm_customer"."work_status", "crm_customer"."company", "crm_customer"."salary", "crm_customer"."source", "crm_customer"."referral_from_id", "crm_customer"."status", "crm_customer"."consultant_id", "crm_customer"."date", "crm_customer"."recv_date", "crm_customer"."last_consult_date" FROM "crm_customer" WHERE (("crm_customer"."last_consult_date" < 2018-06-24 OR "crm_customer"."recv_date" < 2018-06-12) AND "crm_customer"."status" = 2) """ print("----->>:", customer_list) return render(request, 'public.html', locals()) def further(self, request,customer_id): """確認跟進""" user_id = 3 now = datetime.datetime.now() delta_day3 = datetime.timedelta(days=3) delta_day15 = datetime.timedelta(days=15) # 爲該客戶更改課程顧問 和對應得時間, ret = Customer.objects.filter(pk=customer_id).filter( Q(last_consult_date__lt=now-delta_day3)|Q(recv_date__lt=now-delta_day15),status=2).update( consultant=user_id,last_consult_date = now,recv_date=now ) if not ret: return HttpResponse('已經被跟進了') CustomerDistrbute.objects.create( customer_id=customer_id,consultant_id=user_id, date=now,status=1, ) return HttpResponse('跟進成功') def mycustomer(self, request): user_id = 3 customer_distrubute_list = CustomerDistrbute.objects.filter(consultant_id=user_id) return render(request,'mycustomer.html', locals()) def extra_url(self): temp = [] temp.append(url(r'^cancel_course/(\d+)/(\d+)', self.cancel_course)) temp.append(url(r'^public/', self.public_customer)) temp.append(url(r'^further/(\d+)', self.further)) temp.append(url(r'^mycustomer/', self.mycustomer)) return temp list_display = ["name", "gender",display_course ,"consultant"] site.register(Customer, CustomerConfig) class ConsultRecordConfig(ModelStark): list_display = ["customer", 'consultant','date','note'] site.register(ConsultRecord, ConsultRecordConfig) from django.http import JsonResponse class StudentConfig(ModelStark): def score_view(self,request,sid): if request.is_ajax(): # print(request.GET) cid = request.GET.get('cid') sid = request.GET.get('sid') # 跨表查 study_record_list = StudyRecord.objects.filter(student=sid,course_record__class_obj=cid) data_list = [] for study_record in study_record_list: day_num = study_record.course_record.day_num data_list.append(["day%s"%day_num,study_record.score]) # # [['day94', 85], ['day95', 85], ['day96', -1]] return JsonResponse(data_list,safe=False) else: student = Student.objects.filter(pk=sid).first() class_list = student.class_list.all() return render(request,'score_view.html', locals()) def extra_url(self): temp = [] temp.append(url(r"^score_view/(\d+)",self.score_view)) return temp def score_show(self, obj=None, header=False): if header: return "查當作績" return mark_safe("<a href='score_view/%s'>查當作績</a>"%obj.pk) list_display = ['customer','class_list',score_show] list_display_links = ['customer'] site.register(Student,StudentConfig) class CourseRecordConfig(ModelStark): def score(self,request, course_record_id): if request.method == "POST": print('post::::', request.POST) """ <QueryDict: {'csrfmiddlewaretoken': ['muIrf7pwbxIueSJcKADRlZEGVbzzRZOaiGVkBV8DGYC2V9gmxZtyZgujddFtTojk'], 'score_33': ['100'], 'homework_note_33': ['很好'], 'score_34': ['85'], 'homework_note_34': ['棒'], 'score_35': ['60'], 'homework_note_35': ['None']}> """ data = {} # data={"33":{"score":100,"homework_note":'xxx'},} for key,value in request.POST.items(): if key == "csrfmiddlewaretoken":continue field, pk = key.rsplit('_', 1) if pk in data: data[pk][field] = value else: data[pk] = {field:value} print("data-->",data) """ {'33': {'score': '90', 'homework_note': '很好'}, '34': {'score': '80', 'homework_note': '幫幫噠'}, '35': {'score': '50', 'homework_note': '沒問題'}} """ for pk,update_data in data.items(): StudyRecord.objects.filter(pk=pk).update(**update_data) return redirect(request.path) else: study_record_list = StudyRecord.objects.filter(course_record__id=course_record_id) score_choices = StudyRecord.score_choices return render(request,'score.html',locals()) def extra_url(self): temp = [] temp.append(url(r'^record_score/(\d+)', self.score)) return temp def record(self, obj=None, header=False): if header: return "學習記錄" return mark_safe("<a href='/stark/crm/studyrecord/?course_record=%s'>記錄</a>"%(obj.pk)) def record_score(self, obj=None, header=False): if header: return "錄入成績" return mark_safe("<a href='record_score/%s'>錄入成績</a>"%obj.pk) list_display = ["class_obj", 'day_num', "teacher", record, record_score ] def patch_studyrecord(self,request,queryset): # print('queryset:--》',queryset) temp = [] for course_record in queryset: # 與course_record 關聯得班級對應得學生 students_list = Student.objects.filter(class_list__id = course_record.class_obj.pk) for student in students_list: student_obj = StudyRecord(course_record=course_record,student=student) temp.append(student_obj) StudyRecord.objects.bulk_create(temp) actions = [patch_studyrecord] patch_studyrecord.short_description = "批量生成學習記錄" site.register(CourseRecord,CourseRecordConfig) class StudyRecordConfig(ModelStark): list_display = ['student','course_record','record','score'] def patch_late(self, request, queryset): queryset.update(record="late") patch_late.short_description = "遲到" actions = [patch_late] site.register(StudyRecord,StudyRecordConfig) site.register(Course) site.register(School) class CustomerDistrbuteConfig(ModelStark): list_display = ["customer",'consultant','date','status'] site.register(CustomerDistrbute,CustomerDistrbuteConfig)