CRM——销售与客户
一、銷售與客戶——表結構
1、客戶類型
(1)公共客戶(公共資源)
必備條件:沒有報名;
在必備條件滿足的情況下,滿足以下任意條件都是公共客戶:
3天沒有跟進;15天沒有成單。
(2)我的客戶
原銷售——三江:
2018-5-18 12:00 龍泰 男 2018-5-18 正在跟進
2018-5-19 0:0 龍泰 男 2018-5-19 15天未成單
搶單銷售——暴雨:
2018-5-19 12:00 龍泰 男 2018-5-19 正在跟進
2018-5-20 0:0 龍泰 男 2018-5-20 正在跟進
2018-5-21 0:0 龍泰 男 2018-5-21 正在跟進
2018-5-22 0:0 龍泰 男 2018-5-22 正在跟進
2018-5-23 0:0 龍泰 男 2018-5-23 3天未成單
搶單銷售——大傻:
2018-5-23 0:0 龍泰 男 2018-5-23 正在跟進
2、添加客戶分布表(CustomerDistrbute)
(1)為什么創建客戶分布表,為什么不能直接用Customer?
因為:銷售可以查看,自己的客戶是否已過期,是否正在跟進,月底可以算業績!不能說沒談成,就沒有業績!!
(2)更新models.py
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__函數返回客戶名和顧問名
(3)再次執行數據庫遷移加載新表到數據庫中
manage.py@CRM_demo > makemigrations manage.py@CRM_demo > migrate
3、新的表結構
二、公共客戶
繼續配置Customer自定義配置類,擴展公共客戶路由、視圖、模板。
1、添加public客戶url
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
2、定制公共客戶視圖
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())
注意:
(1)datetime模塊的使用
datetime.datetime:表示的是日期時間。
datetime.timedelta:表示時間間隔,即兩個時間點之間的長度
now = datetime.datetime.now() # 當前日期 delta_day3 = datetime.timedelta(days=3) # 時間間隔三天 delta_day15 = datetime.timedelta(days=15) # 時間間隔15天
(2)根據公共客戶條件篩選客戶
# 三天未跟進: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: 泰哥>]>
3、public.html基礎設計渲染
<!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>
public.html
顯示效果如下所示:
4、exclude排除——公共客戶原課程顧問不可見
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: 泰哥>]>
顯示效果:
5、在public.html渲染當前客戶跟進記錄
<!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={{%20customer.pk%20}}">跟進記錄</a></td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
</div>
</body>
</html>
public.html
(1)渲染跟進記錄的a標簽時,添加href地址:
<td><a href="/stark/crm/consultrecord/?customer={{%20customer.pk%20}}">跟進記錄</a></td>
(2)顯示效果:
點擊泰哥的跟進記錄,調整到客戶記錄頁面,并過濾泰哥的記錄:
三、確認跟進
1、增加確認跟進url和我的客戶url
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
2、更改課程顧問和對應的時間
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("跟進成功!")
注意:
(1)更改課程需要提前過濾
先進行過濾是為了防止多個用戶同時搶單,最后給了最后一個搶單的人,先過濾再搶單,后搶單的人已經找不到之前看到的客戶,提示已經被跟進了。
(2)創建一條客戶分布記錄
CustomerDistrbute.objects.create(
customer_id=customer_id,
consultant_id=user_id,
date=now,
status=1
)
(3)ret是update的返回值
update返回值返回的是更新的數據條數。
3、頁面布局
<!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={{%20customer.pk%20}}">跟進記錄</a></td>
<td><a href="/stark/crm/customer/further/{{ customer.pk }}">確認跟進</a></td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
</div>
</body>
</html>
public.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>
mycustomer.html
4、測試驗證
兩個瀏覽器同時訪問:
先跟進的瀏覽器:
后跟進的瀏覽器:
四、我的客戶
1、新增url
temp.append(url(r"mycustomer/", self.mycustomer))
2、我的客戶視圖
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())
注意:
(1)在客戶分布表查詢
不能在Customer表查詢,這查詢到的只是正在跟蹤客戶的信息。之前的跟蹤過得信息不會顯示。需要在客戶分布表查詢。
(2)模擬登陸銷售
在mycustomer視圖函數下配置user_id,值等于哪個顧問的pk值就是模擬的誰登陸。
3、模板和展示效果
mycustomer.html見跟進記錄那一章。
展示效果如下所示:
五、定時任務監控放入公共客戶
每天晚上12點檢測CustomerDistribute哪個客戶過期,一旦過期就調整為公共客戶。
總結
以上是生活随笔為你收集整理的CRM——销售与客户的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 说一个人的格局小是什么意思
- 下一篇: 服装公司名字大全简洁大气356个