一、销售与客户——表结构

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={{ customer.pk }}">跟进记录</a></td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
</div>
</body>
</html>

public.html

(1)渲染跟进记录的a标签时,添加href地址:

<td><a href="/stark/crm/consultrecord/?customer={{ customer.pk }}">跟进记录</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={{ customer.pk }}">跟进记录</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——销售与客户的更多相关文章

  1. 3 CRM 销售与客户 我的客户,公共客户池

    1.销售与客户的表结构 1.公共客户与我的客户 ---公共客户(公共资源) 1.没有报名 2.3天没有跟进 3.15天没有成单 客户分布表 龙泰 男 yuan 2018-5-1 3天未跟进 龙泰 男 ...

  2. CRM - 销售与客户

    一.销售与客户 - 表结构 ---公共客户(公共资源) 1.没有报名 2.3天没有跟进 3.15天没有成单 客户分布表 龙泰 男 yuan 2018-5-1 3天未跟进 龙泰 男 三江 2018-5- ...

  3. 如何借助CRM销售管理系统提升业绩?

    与传统企业销售模式不同,现代企业在网络背书下,销售活动与网络密切相关.销售数据需要网络保存,销售渠道需要网络挖掘.在线的销售软件让销售活动起到了事半功倍的效果.CRM销售管理系统是企业必不可少的在线软 ...

  4. 企业管理CRM不只是客户录入系统

    企业在举办营销活动或者展会之后,将会收集到大量的客户信息,将这些信息有效地整理.完善.储存也是一个不小的工程.如果您的企业经常面遇到这样的情况,不妨使用Zoho CRM系统来帮您完成.但是,Zoho ...

  5. 【JAVAEE学习笔记】hibernate01:简介、搭建、配置文件详解、API详解和CRM练习:保存客户

    今日学习:hibernate是什么 一.hibernate是什么 框架是什么: 1.框架是用来提高开发效率的 2.封装了好了一些功能.我们需要使用这些功能时,调用即可.不需要再手动实现. 3.所以框架 ...

  6. JAVAEE学习——hibernate01:简介、搭建、配置文件详解、API详解和CRM练习:保存客户

    今日学习:hibernate是什么 一.hibernate是什么 框架是什么: 1.框架是用来提高开发效率的 2.封装了好了一些功能.我们需要使用这些功能时,调用即可.不需要再手动实现. 3.所以框架 ...

  7. crm销售管理系统一

    一.环境配置 1.首先配置pip,环境变量配置 pip 9.0.1 from c:\users\administrator\envs\crm\lib\site-packages (python 3.6 ...

  8. CRM系统对管理客户的帮助

    我们可以把客户关系看做是一种长期的投资,在资源有限的基础上,把人力财力物力放到那些能够持续创造价值的客户身上,从而为企业带来源源不断的收益.通过进行客户关系管理,能够让企业与客户之间建立沟通的渠道,形 ...

  9. Hibernate框架:CRM练习--保存客户

    crm:customer ralation manager 客户关系管理系统 一.准备 1.创建web项目 2.导包 最终为: 3.引入静态页面 将文件复制放入项目的WebContent目录下面: 4 ...

随机推荐

  1. The server of Apache (三)——网页优化

    在企业中,部署apache后只采用默认的配置参数,会有很多问题,因为那些配置都是针对以前服务器配置的. 一.网页压缩 1.介绍 配置apache的网页压缩功能,是使用Gzip压缩算法来对apache服 ...

  2. [SCOI2007]最大土地面积(旋转卡壳)

    首先,最大四边形的四个点一定在凸包上 所以先求凸包 有个结论,若是随机数据,凸包包括的点大约是\(\log_2n\)个 然鹅,此题绝对不会这么轻松,若\(O(n^4)\)枚举,只有50分 所以还是要想 ...

  3. CentOS 中安装 mysql 5.7+

    参考:https://www.cnblogs.com/jimboi/p/6405560.html 1.下载rpm文件 wget https://dev.mysql.com/get/mysql57-co ...

  4. Foremost恢复Linux中已删除的文件

    Foremost 我们只能在Linux中恢复已删除的文件,只要这些扇区在硬盘上没有被覆盖. 首先安装 要在CentOS上安装Foremost,我们将从官方网页下载并安装最前面的rpm.打开终端并执行以 ...

  5. [BZOJ 5415] 归程

    一棵KrusKal重构树,然而我数组开小了,忘记清空一个标记 洛谷传送门 BZOJ传送门 ......好像成权限题了Orz 回顾我们用KrusKal做生成树的时候,我们将边排序后连通各个连通块,那么边 ...

  6. ssm框架搭建出现的异常:The import org.springframework cannot be resolved

    1.检查是否有这个包;是否在maven依赖中添加了spring-context.,检查后我有这个包,而且在仓库中找到了 2.怀疑没有下完整,将其删除又导了一遍,还是报错. 3.后来重启了一遍eclip ...

  7. Flask之flask-script 指定端口

    简介 Flask-Scropt插件为在Flask里编写额外的脚本提供了支持.这包括运行一个开发服务器,一个定制的Python命令行,用于执行初始化数据库.定时任务和其他属于web应用之外的命令行任务的 ...

  8. FFT 深夜摸鱼小笔记

    本次笔记学习自算法导论 FFT核心:系数表示→(单位复数根)点值表示→(插值)系数表示 关于单位复数根 n次单位复数根\(ω\)为满足\(ω^n=1\)的复数 n次单位复数根恰好有n个,表示为\(ω_ ...

  9. HDU - 2147 博弈 P/N分析

    结论题,很显然和奇偶有关 PS.尝试用dfs写出PN表写崩了 #include<iostream> #include<algorithm> #include<cstdio ...

  10. 2019.3.13 Java的特性——继承

    继承 面向对象编程(OOP)三大特征:继承,封装,多态 目的:为了减少重复代码,避免复制粘贴 创建父类Animal public class Animal { private String name; ...