CRM——銷售與客戶

1、銷售與客戶——表結構

一、客戶類型

(1)公共客戶(公共資源)

  必備條件:沒有報名;css

  在必備條件知足的狀況下,知足如下任意條件都是公共客戶:html

    3天沒有跟進;15天沒有成單。python

(2)個人客戶

原銷售——三江:
  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 正在跟進

二、添加客戶分佈表(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

三、新的表結構

2、公共客戶

  繼續配置Customer自定義配置類,擴展公共客戶路由、視圖、模板。

一、添加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

二、定製公共客戶視圖

    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: 泰哥>]>

三、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

  顯示效果以下所示:

  

四、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: 泰哥>]>

  顯示效果:

  

五、在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)顯示效果:

  

  點擊泰哥的跟進記錄,調整到客戶記錄頁面,並過濾泰哥的記錄:

  

3、確認跟進

一、增長確認跟進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

二、更改課程顧問和對應的時間

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返回值返回的是更新的數據條數。

三、頁面佈局

<!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、個人客戶

一、新增url

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())

  注意:

(1)在客戶分佈表查詢

  不能在Customer表查詢,這查詢到的只是正在跟蹤客戶的信息。以前的跟蹤過得信息不會顯示。須要在客戶分佈表查詢。

(2)模擬登錄銷售

  在mycustomer視圖函數下配置user_id,值等於哪一個顧問的pk值就是模擬的誰登錄。

三、模板和展現效果

  mycustomer.html見跟進記錄那一章。

  展現效果以下所示:

  

5、定時任務監控放入公共客戶

  天天晚上12點檢測CustomerDistribute哪一個客戶過時,一旦過時就調整爲公共客戶。

相關文章
相關標籤/搜索