老男孩PythonDjango之路 -CRM开发表结构设计

    /    2019-04-19

3. 客户跟进表,这张表的意义很容易理解, 一个客户今天咨询后,你录入到了客户信息表,但他没报名, 所以过了一段时间,销售还得再跟他聊聊吧,聊完后,结果又没报,那也得纪录下来吧,因为每个销售每天要聊很多人,你不纪录的话, 可能下次再跟这个人聊时,你早已忘记上次聊了什么了, 这样会让客户觉得这个销售不专业,相反,如果把每次跟进的内容都纪录下来, 过了几个月,这个客户再跟你聊时,竟然发现,你还记得他的所有情况,他就觉得你很重视他,说不定一感动就报名了,哈哈。 所以,一条客户信息可能会对应多条跟进记录,是个1对多的关系,必须单独搞张表来记录

class CustomerFollowUp(models.Model):
    '''存储客户的后续跟进信息'''
    customer = models.ForeignKey(Customer,verbose_name=u"所咨询客户")
    note = models.TextField(u"跟进内容...")
    status_choices = ((1,u"近期无报名计划"),
                      (2,u"2个月内报名"),
                      (3,u"1个月内报名"),
                      (4,u"2周内报名"),
                      (5,u"1周内报名"),
                      (6,u"2天内报名"),
                      (7,u"已报名"),
                      (8,u"已交全款"),
                      )
    status = models.IntegerField(u"状态",choices=status_choices,help_text=u"选择客户此时的状态")

    consultant = models.ForeignKey("UserProfile",verbose_name=u"跟踪人")
    date = models.DateField(u"跟进日期",auto_now_add=True)

    def __str__(self):
        return u"%s, %s" %(self.customer,self.status)

    class Meta:
        verbose_name = u'客户咨询跟进记录'
        verbose_name_plural = u"客户咨询跟进记录"

CustomerFollowUp

4. 班级表, 学生以班级为单位管理,这个表被学员表反向关联, 即每个学员报名时需要选择班级

class ClassList(models.Model):
    '''存储班级信息'''
    #创建班级时需要选择这个班所学的课程
    branch = models.ForeignKey("Branch",verbose_name="校区")
    course = models.ForeignKey("Course",verbose_name=u"课程")
    class_type_choices = ((0,'面授'),(1,'随到随学网络'))
    class_type = models.SmallIntegerField(choices=class_type_choices,default=0)
    total_class_nums = models.PositiveIntegerField("课程总节次",default=10)
    semester = models.IntegerField(u"学期")
    price = models.IntegerField(u"学费", default=10000)
    start_date = models.DateField(u"开班日期")
    graduate_date = models.DateField(u"结业日期", blank=True, null=True)
    #选择这个班包括的讲师,可以是多个
    teachers = models.ManyToManyField("UserProfile", verbose_name=u"讲师")

    def __str__(self):
         return "%s(%s)" % (self.course, self.semester)

    class Meta:
        verbose_name = u'班级列表'
        verbose_name_plural = u"班级列表"
        #为避免重复创建班级,课程名+学期做联合唯一
        unique_together = ("course""semester")
    #自定义方法,反向查找每个班级学员的数量,在后台admin里 list_display加上这个"get_student_num"就可以看到
    def get_student_num(self):
        return "%s" % self.customer_set.select_related().count()

    get_student_num.short_description = u'学员数量'

ClassList

5. 课程表,存储课程介绍\大纲等基本信息

class Course(models.Model):
    '''存储所开设课程的信息'''
    name = models.CharField(u"课程名",max_length=64,unique=True)
    description = models.TextField("课程描述")
    outline = models.TextField("课程大纲")
    period  = models.IntegerField("课程周期(Month)")

    def __str__(self):
        return self.name

Course

6. 上课纪录表,每个班级都要上很多次课,讲师每上一次课的纪录都要纪录下来,以后可以方便统计讲师工资什么的

class CourseRecord(models.Model):
    '''存储各班级的上课记录'''

    #讲师创建上课纪录时要选择是上哪个班的课
    course = models.ForeignKey(ClassList, verbose_name="班级(课程)")
    day_num = models.IntegerField("节次", help_text="此处填写第几节课或第几天课程...,必须为数字")
    date = models.DateField(auto_now_add=True, verbose_name="上课日期")
    teacher = models.ForeignKey("UserProfile", verbose_name="讲师")
    has_homework = models.BooleanField(default=True, verbose_name="本节有作业")
    homework_title = models.CharField(max_length=128,blank=True,null=True)
    homework_requirement = models.TextField(blank=True,null=True)

    def __str__(self):
        return "%s 第%s天" % (self.course, self.day_num)

    class Meta:
        verbose_name = u'上课纪录'
        verbose_name_plural = u"上课纪录"
        unique_together = ('course''day_num')

CourseRecord

7. 学员学习纪录表,思考一下,如果你想实现纪录每位学员的详细学习纪录,即精确到每节课的成绩\出勤情况,怎么办?其实很简单, 先来看一下此时班级\上课纪录\学员学习纪录的关系图:

class StudyRecord(models.Model):
    '''存储所有学员的详细的学习成绩情况'''
    student = models.ForeignKey("Customer",verbose_name=u"学员")
    course_record = models.ForeignKey(CourseRecord, verbose_name=u"第几天课程")
    record_choices = (('checked'u"已签到"),
                      ('late',u"迟到"),
                      ('noshow',u"缺勤"),
                      ('leave_early',u"早退"),
                      )
    record = models.CharField(u"上课纪录",choices=record_choices,default="checked",max_length=64)
    score_choices = ((100'A+'),   (90,'A'),
                     (85,'B+'),     (80,'B'),
                     (70,'B-'),     (60,'C+'),
                     (50,'C'),      (40,'C-'),
                     (-50,'D'),       (0,'N/A'),
                     (-100,'COPY'), (-1000,'FAIL'),
                     )
    score = models.IntegerField(u"本节成绩",choices=score_choices,default=-1)
    date = models.DateTimeField(auto_now_add=True)
    note = models.CharField(u"备注",max_length=255,blank=True,null=True)

    def __str__(self):
        return u"%s,学员:%s,纪录:%s, 成绩:%s" %(self.course_record,self.student.name,self.record,self.get_score_display())

    class Meta:
        verbose_name = u'学员学习纪录'
        verbose_name_plural = u"学员学习纪录"
        #一个学员,在同一节课只可能出现一次,所以这里把course_record + student 做成联合唯一
        unique_together = ('course_record','student')

StudyRecord

可以看出,一个班级对应多节课,每节课又对应多个学生的出勤和成绩,我们已经通过班级表(”ClassList”)和上课纪录表(”CourseRecord”)存储了班级信息和每节上课纪录,想存学生的每节课学习纪录的话只需要再搞一个表就可以了。


(4)

分享至