必備條件:沒有報名;css
在必備條件知足的狀況下,知足如下任意條件都是公共客戶:html
3天沒有跟進;15天沒有成單。python
原銷售——三江:
2018-5-18 12:00 龍泰 男 2018-5-18 正在跟進
2018-5-19 0:0 龍泰 男 2018-5-19 15天未成單數據庫
搶單銷售——暴雨:django
2018-5-19 12:00 龍泰 男 2018-5-19 正在跟進bootstrap
2018-5-20 0:0 龍泰 男 2018-5-20 正在跟進瀏覽器
2018-5-21 0:0 龍泰 男 2018-5-21 正在跟進session
2018-5-22 0:0 龍泰 男 2018-5-22 正在跟進app
2018-5-23 0:0 龍泰 男 2018-5-23 3天未成單ide
搶單銷售——大傻:
2018-5-23 0:0 龍泰 男 2018-5-23 正在跟進
由於:銷售能夠查看,本身的客戶是否已過時,是否正在跟進,月底能夠算業績!不能說沒談成,就沒有業績!!
class CustomerDistrbute(models.Model): """ customer:客戶 consultant:跟進人 date:日期 status:狀態 meno: """ customer = models.ForeignKey("Customer", related_name="customers", on_delete=models.CASCADE) consultant = models.ForeignKey(verbose_name="課程顧問", to="UserInfo", limit_choices_to={"depart_id":1001}, on_delete=models.CASCADE) 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
注意:__str__函數返回客戶名和顧問名
manage.py@CRM_demo > makemigrations manage.py@CRM_demo > migrate
繼續配置Customer自定義配置類,擴展公共客戶路由、視圖、模板。
class CustomerConfig(ModelStark): def extra_url(self): """擴展路由""" temp = [] temp.append(url((r"cancel_course/(\d+)/(\d+)"), self.cancel_course)) temp.append(url(r"public", self.public_customer)) return temp
def public_customer(self, request): """公共客戶""" # 未報名、且三天未跟進或15天未成單 from django.db.models import Q import datetime now = datetime.datetime.now() # datetime.datetime:表示日期時間 # datetime.timedelta:表示時間間隔,即兩個時間點之間的長度 delta_day3 = datetime.timedelta(days=3) delta_day15 = datetime.timedelta(days=15) # 三天未跟進:now-last_consult_date>3 ===> last_consult_date < now - 3 # 15天未成單:now-recv_data > 15 ====> recv_data < now - 15 user_id = 2 # 課程顧問吳三江 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) # <QuerySet [<Customer: 小東北>, <Customer: 泰哥>]> return render(request, "public.html", locals())
注意:
datetime.datetime:表示的是日期時間。
datetime.timedelta:表示時間間隔,即兩個時間點之間的長度
now = datetime.datetime.now() # 當前日期 delta_day3 = datetime.timedelta(days=3) # 時間間隔三天 delta_day15 = datetime.timedelta(days=15) # 時間間隔15天
# 三天未跟進:now-last_consult_date>3 ===> last_consult_date < now - 3 # 15天未成單:now-recv_data > 15 ====> recv_data < 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) print(customer_list) # <QuerySet [<Customer: 小東北>, <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> </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> </tr> {% endfor %} </tbody> </table> </div> </div> </div> </body> </html>
顯示效果以下所示:
filter按條件篩選,exclude按條件排除。
user_id = 2 # 課程顧問吳三江 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) # <QuerySet [<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> </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> </tr> {% endfor %} </tbody> </table> </div> </div> </div> </body> </html>
<td><a href="/stark/crm/consultrecord/?customer={{ customer.pk }}">跟進記錄</a></td>
點擊泰哥的跟進記錄,調整到客戶記錄頁面,並過濾泰哥的記錄:
class CustomerConfig(ModelStark): 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
def further(self, request, customer_id): """跟進客戶""" user_id = 2 # 這裏是模擬登錄狀態requet.session.get("user_id") import datetime from django.db.models import Q 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("跟進成功!")
注意:
先進行過濾是爲了防止多個用戶同時搶單,最後給了最後一個搶單的人,先過濾再搶單,後搶單的人已經找不到以前看到的客戶,提示已經被跟進了。
CustomerDistrbute.objects.create( customer_id=customer_id, consultant_id=user_id, date=now, status=1 )
update返回值返回的是更新的數據條數。
<!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>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h3>個人客戶</h3> <ul> {% for customer_distribute in customer_distribute_list %} <li> {# 一個客戶有多種分佈狀態 #} {{ customer_distribute.customer }}--{{ customer_distribute.date }}--{{ customer_distribute.get_status_display }} </li> {% endfor %} </ul> </body> </html>
兩個瀏覽器同時訪問:
先跟進的瀏覽器:
後跟進的瀏覽器:
temp.append(url(r"mycustomer/", self.mycustomer))
class CustomerConfig(ModelStark): def mycustomer(self, request): """個人客戶""" user_id = 2 customer_distribute_list = CustomerDistrbute.objects.filter(consultant=user_id) return render(request, "mycustomer.html", locals())
注意:
不能在Customer表查詢,這查詢到的只是正在跟蹤客戶的信息。以前的跟蹤過得信息不會顯示。須要在客戶分佈表查詢。
在mycustomer視圖函數下配置user_id,值等於哪一個顧問的pk值就是模擬的誰登錄。
mycustomer.html見跟進記錄那一章。
展現效果以下所示:
天天晚上12點檢測CustomerDistribute哪一個客戶過時,一旦過時就調整爲公共客戶。