CRM项目总结
一:开发背景
在公司日益扩大的过程中,不可避免的会伴随着更多问题出现。
对外 : 如何更好的管理客户与公司的关系?如何更及时的了解客户日益发展的需求变化?公司的产品是否真的符合客户需求?以及公司新产品信息是否更有针对性的及时推送给客户?客户没有
对内 : 公司发展壮大,部门越来越多,如何明确每个部门的权限?如何合理的调配公司人员?如何合理的分配客户资源?如何精确的处理绩效考核?以及更重要的在销售管理中,如何更及时的了解是什么阻碍了公司的发展?是什么影响了销售的业绩?销售的服务是否让客户满意?
面对这么多的问题,这个时候就需要来一套完整的CRM就显得很有必要了。
二:开发周期
- 计划在两个月内完成项目的初步设计以及功能的初步实现。
- 基础功能完成后,会预留两个月时间来完成bug修复以及微调根据公司业务发展的业务需求。
- 项目上线后,开发人员持续跟进项目。根据公司业务发展和管理体系实时调整。
三:功能
1 from django.db import models 2 from rbac import models as rbac_model 3 # Create your models here. 4 5 6 class Department(models.Model): 7 """ 8 部门表 9 市场部 1000 10 销售 1001 11 """ 12 title = models.CharField(verbose_name='部门名称', max_length=16) 13 code = models.IntegerField(verbose_name='部门编号',unique=True,null=False) 14 15 def __str__(self): 16 return self.title 17 18 19 class UserInfo(models.Model): 20 """ 21 员工表 22 """ 23 auth = models.OneToOneField(verbose_name='用户权限', to=rbac_model.User,null=True,blank=True) 24 name = models.CharField(verbose_name='员工姓名', max_length=16) 25 username = models.CharField(verbose_name='用户名', max_length=32) 26 password = models.CharField(verbose_name='密码', max_length=64) 27 email = models.EmailField(verbose_name='邮箱', max_length=64) 28 openid = models.CharField(verbose_name='微信唯一ID', max_length=64, null=True, blank=True) 29 depart = models.ForeignKey(verbose_name='部门', to="Department",to_field="code") 30 31 def __str__(self): 32 return self.name 33 34 35 class Course(models.Model): 36 """ 37 课程表 38 如: 39 Linux基础 40 Linux架构师 41 Python自动化开发精英班 42 Python自动化开发架构师班 43 """ 44 name = models.CharField(verbose_name='课程名称', max_length=32) 45 46 def __str__(self): 47 return self.name 48 49 50 class School(models.Model): 51 """ 52 校区表 53 54 """ 55 title = models.CharField(verbose_name='校区名称', max_length=32) 56 57 def __str__(self): 58 return self.title 59 60 61 class ClassList(models.Model): 62 """ 63 班级表 64 如: 65 烧饼 打饼班 1期 10000 2017-11-11 2018-5-11 66 """ 67 school = models.ForeignKey(verbose_name='校区', to='School') 68 course = models.ForeignKey(verbose_name='课程名称', to='Course') 69 70 semester = models.IntegerField(verbose_name="班级(期)") 71 price = models.IntegerField(verbose_name="学费") 72 start_date = models.DateField(verbose_name="开班日期") 73 graduate_date = models.DateField(verbose_name="结业日期", null=True, blank=True) 74 memo = models.CharField(verbose_name='说明', max_length=256, blank=True, null=True, ) 75 teachers = models.ManyToManyField(verbose_name='任课老师', to='UserInfo', related_name='teach_classes',limit_choices_to={'depart_id__in':[1003,1004]}) 76 tutor = models.ForeignKey(verbose_name='班主任', to='UserInfo', related_name='classes',limit_choices_to={'depart_id':1002}) 77 78 def __str__(self): 79 return "{0}({1}期)".format(self.course.name, self.semester) 80 81 82 class Customer(models.Model): 83 """ 84 客户表 85 """ 86 qq = models.CharField(verbose_name='qq', max_length=64, unique=True, help_text='QQ号必须唯一') 87 88 name = models.CharField(verbose_name='学生姓名', max_length=16) 89 gender_choices = ((1, '男'), (2, '女')) 90 gender = models.SmallIntegerField(verbose_name='性别', choices=gender_choices) 91 92 education_choices = ( 93 (1, '重点大学'), 94 (2, '普通本科'), 95 (3, '独立院校'), 96 (4, '民办本科'), 97 (5, '大专'), 98 (6, '民办专科'), 99 (7, '高中'), 100 (8, '其他') 101 ) 102 education = models.IntegerField(verbose_name='学历', choices=education_choices, blank=True, null=True, ) 103 graduation_school = models.CharField(verbose_name='毕业学校', max_length=64, blank=True, null=True) 104 major = models.CharField(verbose_name='所学专业', max_length=64, blank=True, null=True) 105 106 experience_choices = [ 107 (1, '在校生'), 108 (2, '应届毕业'), 109 (3, '半年以内'), 110 (4, '半年至一年'), 111 (5, '一年至三年'), 112 (6, '三年至五年'), 113 (7, '五年以上'), 114 ] 115 experience = models.IntegerField(verbose_name='工作经验', blank=True, null=True, choices=experience_choices) 116 work_status_choices = [ 117 (1, '在职'), 118 (2, '无业') 119 ] 120 work_status = models.IntegerField(verbose_name="职业状态", choices=work_status_choices, default=1, blank=True, 121 null=True) 122 company = models.CharField(verbose_name="目前就职公司", max_length=64, blank=True, null=True) 123 salary = models.CharField(verbose_name="当前薪资", max_length=64, blank=True, null=True) 124 125 source_choices = [ 126 (1, "qq群"), 127 (2, "内部转介绍"), 128 (3, "官方网站"), 129 (4, "百度推广"), 130 (5, "360推广"), 131 (6, "搜狗推广"), 132 (7, "腾讯课堂"), 133 (8, "广点通"), 134 (9, "高校宣讲"), 135 (10, "渠道代理"), 136 (11, "51cto"), 137 (12, "智汇推"), 138 (13, "网盟"), 139 (14, "DSP"), 140 (15, "SEO"), 141 (16, "其它"), 142 ] 143 source = models.SmallIntegerField('客户来源', choices=source_choices, default=1) 144 referral_from = models.ForeignKey( 145 'self', 146 blank=True, 147 null=True, 148 verbose_name="转介绍自学员", 149 help_text="若此客户是转介绍自内部学员,请在此处选择内部学员姓名", 150 related_name="internal_referral" 151 ) 152 course = models.ManyToManyField(verbose_name="咨询课程", to="Course") 153 154 status_choices = [ 155 (1, "已报名"), 156 (2, "未报名") 157 ] 158 status = models.IntegerField( 159 verbose_name="状态", 160 choices=status_choices, 161 default=2, 162 help_text=u"选择客户此时的状态" 163 ) 164 consultant = models.ForeignKey(verbose_name="课程顾问", to='UserInfo', related_name='consultant',limit_choices_to={'depart_id':1005}) 165 date = models.DateField(verbose_name="咨询日期", auto_now_add=True) 166 167 recv_date = models.DateField(verbose_name='接单时间',null=True,blank=True) 168 169 last_consult_date = models.DateField(verbose_name="最后跟进日期", auto_now_add=True) 170 171 def __str__(self): 172 return "姓名:{0},QQ:{1}".format(self.name, self.qq, ) 173 174 175 class CustomerDistribution(models.Model): 176 """客户分配表""" 177 user = models.ForeignKey(verbose_name="当前客户顾问",to='UserInfo',limit_choices_to={'depart_id':1005},related_name="cds",null=True,blank=True) 178 customer = models.ForeignKey(verbose_name="客户",to="Customer",related_name="dealers",null=True,blank=True) 179 ctime = models.DateField(auto_now_add=True,null=True,blank=True) 180 status_choices = ( 181 (1,'正在跟进'), 182 (2,'已成单'), 183 (3,'三天未跟进'), 184 (4,'十五天未成单'), 185 ) 186 status = models.IntegerField(verbose_name="状态",choices=status_choices,default=1) 187 memo = models.CharField(verbose_name="更多信息",max_length=255,null=True,blank=True) 188 189 190 class SaleRank(models.Model): 191 """销售权重与分配""" 192 user = models.ForeignKey(to="UserInfo",verbose_name='课程顾问',limit_choices_to={'depart':1005}) 193 num = models.IntegerField(verbose_name='数量') 194 weight = models.IntegerField(verbose_name='权重') 195 def __str__(self): 196 return '权重:{0}