day43 crm开发之跟缴费功能开发
查看缴费列表
缴费表结构设计
class PaymentRecord(models.Model):
"""
缴费申请
"""
customer = models.ForeignKey(Customer, verbose_name="客户", on_delete=models.CASCADE)
consultant = models.ForeignKey(verbose_name="课程顾问", to='UserInfo', help_text="谁签的单就选谁", on_delete=models.CASCADE)
pay_type_choices = [
(1, "报名费"),
(2, "学费"),
(3, "退学"),
(4, "其他"),
]
pay_type = models.IntegerField(verbose_name="费用类型", choices=pay_type_choices, default=1)
paid_fee = models.IntegerField(verbose_name="金额", default=0)
class_list = models.ForeignKey(verbose_name="申请班级", to="ClassList", on_delete=models.CASCADE)
apply_date = models.DateTimeField(verbose_name="申请日期", auto_now_add=True)
confirm_status_choices = (
(1, '申请中'),
(2, '已确认'),
(3, '已驳回'),
)
confirm_status = models.IntegerField(verbose_name="确认状态", choices=confirm_status_choices, default=1)
confirm_date = models.DateTimeField(verbose_name="确认日期", null=True, blank=True)
confirm_user = models.ForeignKey(verbose_name="审批人", to='UserInfo', related_name='confirms', null=True, blank=True, on_delete=models.CASCADE)
note = models.TextField(verbose_name="备注", blank=True, null=True)
缴费列表展示
web应用新建缴费功能视图
# -*- encoding: utf-8 -*-
"""
@File : payment_record.py
@Time : 2022/3/13 10:17
@Author : simon
@Email : 294168604@qq.com
@Software: PyCharm
"""
from django.conf.urls import url
from stark.service.v1 import StarkHandler, get_choice_text
class PaymentRecordHandler(StarkHandler):
list_display = [get_choice_text('缴费类型', 'pay_type'), 'paid_fee', 'class_list', 'consultant',
get_choice_text('状态', 'confirm_status')]
def get_list_display(self):
"""
获取页面上应该显示的列,预留的自定义扩展,例如:以后根据用户的不同显示不同的列
:return:
"""
value = []
if self.list_display:
value.extend(self.list_display)
return value
def get_urls(self):
patterns = [
url(r'^list/(?P<customer_id>\d+)/$', self.wrapper(self.changelist_view), name=self.get_list_url_name),
url(r'^add/(?P<customer_id>\d+)/$', self.wrapper(self.add_view), name=self.get_add_url_name),
]
patterns.extend(self.extra_urls())
return patterns
私户视图新增列名‘缴费’
效果展示:
添加缴费记录功能
设计学生表结构
class Student(models.Model):
"""
学生表
"""
customer = models.OneToOneField(verbose_name='客户信息', to='Customer', on_delete=models.CASCADE)
qq = models.CharField(verbose_name='QQ号', max_length=32)
mobile = models.CharField(verbose_name='手机号', max_length=32)
emergency_contract = models.CharField(verbose_name='紧急联系人电话', max_length=32)
class_list = models.ManyToManyField(verbose_name="已报班级", to='ClassList', blank=True,null=True)
student_status_choices = [
(1, "申请中"),
(2, "在读"),
(3, "毕业"),
(4, "退学")
]
student_status = models.IntegerField(verbose_name="学员状态", choices=student_status_choices, default=1)
memo = models.CharField(verbose_name='备注', max_length=255, blank=True, null=True)
def __str__(self):
return self.customer.name
缴费记录列表不需要展示操作的列即删除编辑按钮不需要,缴费记录视图新建一个列定义
效果展示:
判断客户存不存在学生记录,缴费添加记录是不一样的页面,完整缴费视图代码参考
# -*- encoding: utf-8 -*-
"""
@File : payment_record.py
@Time : 2022/3/13 10:17
@Author : simon
@Email : 294168604@qq.com
@Software: PyCharm
"""
from django.conf.urls import url
from django.shortcuts import HttpResponse
from django import forms
from stark.service.v1 import StarkHandler, get_choice_text, StarkModelForm
from web import models
class PaymentRecordModelForm(StarkModelForm):
class Meta:
model = models.PaymentRecord
fields = ['pay_type', 'paid_fee', 'class_list', 'note']
class StudentPaymentRecordModelForm(StarkModelForm):
qq = forms.CharField(label='QQ号', max_length=32)
mobile = forms.CharField(label='手机号', max_length=32)
emergency_contract = forms.CharField(label='紧急联系人电话', max_length=32)
class Meta:
model = models.PaymentRecord
fields = ['pay_type', 'paid_fee', 'class_list', 'qq', 'mobile', 'emergency_contract', 'note']
class PaymentRecordHandler(StarkHandler):
list_display = [get_choice_text('缴费类型', 'pay_type'), 'paid_fee', 'class_list', 'consultant',
get_choice_text('状态', 'confirm_status')]
def get_list_display(self):
"""
获取页面上应该显示的列,预留的自定义扩展,例如:以后根据用户的不同显示不同的列
:return:
"""
value = []
if self.list_display:
value.extend(self.list_display)
return value
def get_urls(self):
patterns = [
url(r'^list/(?P<customer_id>\d+)/$', self.wrapper(self.changelist_view), name=self.get_list_url_name),
url(r'^add/(?P<customer_id>\d+)/$', self.wrapper(self.add_view), name=self.get_add_url_name),
]
patterns.extend(self.extra_urls())
return patterns
def get_queryset(self, request, *args, **kwargs):
customer_id = kwargs.get('customer_id')
current_user_id = request.session['user_info']['id']
return self.model_class.objects.filter(customer_id=customer_id, customer__consultant_id=current_user_id)
def get_model_form_class(self, is_add, request, pk, *args, **kwargs):
# 如果当前客户有学生信息,则使用PaymentRecordModelForm;否则StudentPaymentRecordModelForm
customer_id = kwargs.get('customer_id')
student_exists = models.Student.objects.filter(customer_id=customer_id).exists()
if student_exists:
return PaymentRecordModelForm
return StudentPaymentRecordModelForm
def save(self, request, form, is_update, *args, **kwargs):
customer_id = kwargs.get('customer_id')
current_user_id = request.session['user_info']['id']
object_exists = models.Customer.objects.filter(id=customer_id,
consultant_id=current_user_id).exists()
if not object_exists:
return HttpResponse('非法操作')
form.instance.customer_id = customer_id
form.instance.consultant_id = current_user_id
# 创建缴费记录信息
form.save()
# 创建学员信息
class_list = form.cleaned_data['class_list']
fetch_student_object = models.Student.objects.filter(customer_id=customer_id).first()
if not fetch_student_object:
qq = form.cleaned_data['qq']
mobile = form.cleaned_data['mobile']
emergency_contract = form.cleaned_data['emergency_contract']
student_object = models.Student.objects.create(customer_id=customer_id, qq=qq, mobile=mobile,
emergency_contract=emergency_contract)
student_object.class_list.add(class_list.id)
else:
fetch_student_object.class_list.add(class_list.id)
由于自定义了model_form需要修改stark组件通用model_form
结果展示:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具