提交 90a85118 authored 作者: Chris Harris's avatar Chris Harris

Merge remote-tracking branch 'origin/dev' into dev

......@@ -244,6 +244,8 @@ def ajaxBanquetApply(request):
code = codes[i]['code']
product_id = codes[i]['product_id']
package_id = codes[i]['package_id']
label_id = codes[i]['label_id']
label_pk_id = codes[i]['label_pk_id']
needAdd = True
......@@ -264,7 +266,9 @@ def ajaxBanquetApply(request):
apply=apply,
code=code,
product_id=product_id,
package_id=package_id
package_id=package_id,
label_id=label_id,
label_pk_id=label_pk_id
)
ac.save()
......@@ -465,7 +469,7 @@ def ajaxBanquetDetail(request):
sWhere=f" where apply_id = {id}"
cur.execute("select id,(select name from product_product where id = product_id),product_id,code,package_id from banquet_apply_codes "+sWhere)
cur.execute("select id,(select name from product_product where id = product_id),product_id,code,package_id,label_id,label_pk_id from banquet_apply_codes "+sWhere)
rs = cur.fetchall()
codes = []
for r in rs:
......@@ -480,7 +484,9 @@ def ajaxBanquetDetail(request):
'product_id':r[2],
'code':r[3],
'package':pkg,
'package_id':r[4]
'package_id':r[4],
'label_id': r[5],
'label_pk_id': r[6]
})
res['detail']['codes'] = codes
......
......@@ -501,6 +501,15 @@ class Company_UploadFiles_Form(ModelForm):
self.fields['category'].queryset = FileCategory.objects.all()
class BonusPoints_Form(ModelForm):
class Meta:
model=BonusPoints
fields = ['points','remark']
def __init__(self, *args, **kwargs):
self._user = kwargs.pop('user')
super(BonusPoints_Form, self).__init__(*args, **kwargs)
self.fields['points'].queryset = BonusPoints.objects.filter(company_id=self._user.company.id)
......@@ -2014,3 +2014,112 @@ class OperationLog(models.Model):
class Meta:
verbose_name=_('修改删除操作日志')
verbose_name_plural=_('修改删除操作日志')
# 2022-11-23
class BonusPoints(models.Model):
'''
云平台渠道促销经销商积分表,适用于非期结性、可随时兑换、实时反映经销商当前积分的情况
'''
ancestor_id=models.IntegerField(_('所属族系'),blank=True,null=True)
company=models.OneToOneField(Company,verbose_name=_('所属公司'),related_name='bonuspoints_company',on_delete=models.CASCADE)
points=models.DecimalField(_('当前积分值'), max_digits=12, decimal_places=2,blank=True,null=True)
remark=models.CharField(_('备注说明'),max_length=100,blank=True,null=True)
tm=models.DateTimeField(_('更新时间'),auto_now =True)
channelpromotions = models.ForeignKey('sales.ChannelPromotions', verbose_name=_('所属渠道返利'),
on_delete=models.CASCADE,related_name='bonuspointslog_ChannelPromotions',
blank=True, null=True)
class Meta:
verbose_name=_('渠道促销经销商积分')
verbose_name_plural=_('渠道促销经销商积分')
class BonusPointsLog(models.Model):
'''
云平台用户积分变化记录表,记录用户每一次积分变化及获取积分的明细
'''
# 冗余,为提高查询速度
ancestor_id=models.IntegerField(_('所属族系'),blank=True,null=True)
company=models.ForeignKey(Company,verbose_name=_('所属公司'),related_name='bonuspointslog_company',on_delete=models.CASCADE)
user=models.ForeignKey(User,verbose_name=_('用户帐号'),on_delete=models.CASCADE,related_name='bonuspointslog_user')
channelpromotions=models.ForeignKey('sales.ChannelPromotions',verbose_name=_('所属渠道返利'),on_delete=models.CASCADE,related_name='bonuspointslog_activity',blank=True,null=True)
# 触发积分变化的对像源,如收货确认由终端入库inventory.Batch,宴会申请banquet.Apply 触发
contenttype = models.ForeignKey(ContentType, verbose_name='实例对像',on_delete=models.CASCADE,blank=True,null=True)
# 触发积分变化的对像实例,如batch.id, apply.id
object_id = models.IntegerField(verbose_name='实例ID',blank=True,null=True)
# 快速实现content_type操作,快速插入数据 不会生成数据库表中的字段
content_object = GenericForeignKey('contenttype', 'object_id')
# 启用事务,将当前变化值实时反映到BonusPoints用户积分
self_points = models.DecimalField(_('确认收货方积分值'), max_digits=12, decimal_places=2, blank=True, null=True)
parent_points = models.JSONField(_('经济发货方积分值'), default=list, blank=True, null=True)
dt=models.DateField(_('日期'),auto_now_add=True,db_index=True)
tm=models.DateTimeField(_('时间'),auto_now_add=True)
remark=models.CharField(_('备注说明'),max_length=100,blank=True,null=True)
class Meta:
verbose_name=_('用户积分日志')
verbose_name_plural=_('用户积分日志')
class PointsLogDetails(models.Model):
'''
云平台积分变化物流标签明细表
'''
# 冗余,为提高查询速度
ancestor_id=models.IntegerField(_('所属族系'),blank=True,null=True)
# 冗余,为提高查询速度
company=models.ForeignKey(Company,verbose_name=_('所属公司'),on_delete=models.CASCADE,related_name='pointslogdetails_company')
# 冗余,为提高查询速度
user=models.ForeignKey(User,verbose_name=_('用户帐号'),on_delete=models.CASCADE,related_name='pointslogdetails_user')
# 冗余,为提高查询速度
channelpromotions=models.ForeignKey('sales.ChannelPromotions',verbose_name=_('所属渠道返利'),on_delete=models.CASCADE,related_name='pointslogdetails_activity',blank=True,null=True)
log=models.ForeignKey(BonusPointsLog,verbose_name=_('所属积分日志'),on_delete=models.CASCADE)
label_code = models.CharField(_('标签号码'), max_length=20, db_index=True)
label_id = models.BigIntegerField(_('标签ID'), db_index=True)
label_pk_id = models.BigIntegerField(_('标签PKID'), db_index=True)
label_pkg = models.SmallIntegerField(_('标签类型'), db_index=True)
self_points = models.DecimalField(_('自身积分值'), max_digits=12, decimal_places=2,default=0)
parent_points = models.DecimalField(_('顶级发货商积分值'),max_digits=12, decimal_places=2,default=0)
dt=models.DateField(_('日期'),auto_now_add=True,db_index=True)
tm=models.DateTimeField(_('时间'),auto_now_add=True)
company_fr_id = models.IntegerField(_("顶级发货经销商"),blank=True,null=True)
err = models.CharField(_('错误信息'), max_length=100, blank=True, null=True)
remark=models.CharField(_('备注说明'),max_length=100,blank=True,null=True)
class Meta:
verbose_name=_('积分物流标签明细')
verbose_name_plural=_('积分物流标签明细')
class PointsRedeemed(models.Model):
ancestor_id=models.IntegerField(_('所属族系'),blank=True,null=True)
company=models.ForeignKey(Company,verbose_name=_('所属公司'),on_delete=models.CASCADE,related_name='pointsredeem_company')
user=models.ForeignKey(User,verbose_name=_('用户帐号'),on_delete=models.CASCADE,related_name='pointsredeem_user')
# 启用事务,将当前兑换值 实时反映到BonusPoints用户积分
points=models.DecimalField(_('兑换积分值'), max_digits=12, decimal_places=2)
# 可能兑换成现金/微信零钱
amount=models.DecimalField(_('金额'), max_digits=12, decimal_places=2,blank=True,null=True)
payment_method=models.SmallIntegerField(_('付款方式'), default=1, choices=((1,'微信钱包'),(2,'银行卡'),(3,'货返')))
invoice_needed=models.SmallIntegerField(_('是否开票'), default=0, choices=((1,'开票提现'),(0,'不开票提现')))
bank_receipt=models.CharField(_('银行/微信回单编号'),max_length=50,blank=True,null=True)
# 也可能兑换礼品、卡券等奖项
award=models.ForeignKey('sales.Award',verbose_name=_('兑换奖项'),on_delete=models.CASCADE,blank=True,null=True)
qty=models.IntegerField(_('兑换奖项个数'), blank=True,null=True)
dt=models.DateField(_('日期'),auto_now_add=True,db_index=True)
tm=models.DateTimeField(_('时间'),auto_now_add=True)
remark=models.CharField(_('备注说明'),max_length=100,blank=True,null=True)
class Meta:
verbose_name=_('积分兑换')
verbose_name_plural=_('积分兑换')
\ No newline at end of file
......@@ -7247,3 +7247,62 @@ def fg_movement(request,company_id):
# 2022-11-04
data['clmns']=clmns
return JsonResponse(data)
# 当前积分
@login_required
def bonusPoints(request):
data = {'data': [], 'clmns': [], 'e': [],
'subtt': ['渠道促销', '积分'], 'murl': '', 'dt': False, 'add': True}
data['clmns'] = ['当前积分', '父级公司名字', '经销商名字', '备注','更新时间','积分变化明细']
data['show_add'] = False
data['murl'] = '/company/bonusPoints/edit/'
for t in BonusPoints.objects.filter(company_id=request.user.company_id):
cur = connection.cursor()
s=f"""select name,(select name from company_company where id={t.company_id})
from company_company where id={t.ancestor_id}
"""
cur.execute(s)
r=cur.fetchone()
data['data'].append([
"<a href='/company/bonusPoints/edit/" +
str(t.id) + "/'>" + str(t.points) + "</a>",
r[0],r[1],
t.remark,
t.tm.strftime("%Y-%m-%d %H:%M:%S"),
"<a class='btn btn-default btn-xs' href='company/bonusPoints/edit_list/" + str(t.id) + "/'>详情</a>"
])
return render(request, 'obj/list_obj.html', data)
#积分编辑
@login_required
def bonusPoints_edit(request, id=None):
if id:
obj = BonusPoints.objects.get(id=int(id))
else:
obj = BonusPoints(company_id=request.user.company_id)
if request.method == 'GET':
form = BonusPoints_Form(instance=obj, user=request.user)
else:
form = BonusPoints_Form(request.POST, instance=obj, user=request.user)
if form.is_valid():
form.save()
return render(request, 'company/points.html',{'form': form})
@login_required
def bonusPoints_edit_list(request, id=None,type=None):
data = {'data': [], 'clmns': [], 'e': [],
'subtt': ['积分变化明细', '积分'], 'murl': '', 'dt': False, 'add': True }
data['clmns']=['经销商','收货方积分积分','发货方积分','更新时间','操作人']
for t in BonusPointsLog.objects.filter(company_id=request.user.company_id):
cur = connection.cursor()
s = f""" select (select name from company_company where {t.company_id}=id),
(select last_name from company_user where {t.user_id}=id) from company_BonusPointsLog b where company_id={t.company_id}
"""
cur.execute(s)
r = cur.fetchone()
data['data'].append([r[0], str(t.parent_points), str(t.self_points), t.tm.strftime("%Y-%m-%d %H:%M:%S"),r[1]])
data['data'] = SafeString(data['data'])
return render(request, 'company/points_list.html', data)
\ No newline at end of file
......@@ -1216,6 +1216,12 @@ urlpatterns = [
# 代码仓库CI/CD测试
url('ci-cd/', inventory_views.hello_ci_cd),
#诗仙太白积分活动
url(r'^company/bonusPoints/$', company_views.bonusPoints),
url(r'^company/bonusPoints/edit/$', company_views.bonusPoints_edit),
url(r'^company/bonusPoints/edit/(?P<id>\d+)/$', company_views.bonusPoints_edit),
url(r'^company/bonusPoints/edit_list/(?P<id>\d+)/$', company_views.bonusPoints_edit_list),
]
if settings.DEBUG:
......
......@@ -5323,7 +5323,7 @@ def holiday_list(request):
data['clmns'] = [_('节日名称'), _('日期'), _('备注')]
cur = connection.cursor()
s = "select name,to_char(dt,'yyyy-mm-dd'),coalesce(remark,''),id from sales_holiday where company_id = " + str(
cid) + "or company_id is null"
cid) + " or company_id is null"
cur.execute(s)
r = cur.fetchall()
for i in r:
......
{% extends 'obj_form.html' %}
{% load i18n %}
{% block subtitle %}
<ol class="breadcrumb">
<li>{% trans '渠道促销' %}</li>
<li>{% trans '当前积分' %}</li>
</ol>
{% endblock %}
{% block form_content %}
<script>
$(document).ready(function () {
$('.btn-save').click(function () {
$.SubmitForm('#obj_form form', '{{request.path}}',function (){
$('.alert').fadeIn();
});
});
})
</script>
<div class="alert alert-success" role="alert" style="display: none">保存成功!</div>
<div class="form-group product_photo">
<label class="col-sm-2 control-label ">当前积分</label>
<div class="col-sm-8">{{ form.points }}</div>
</div>
<div class="form-group product_photo">
<label class="col-sm-2 control-label ">修改原因</label>
<div class="col-sm-8">{{ form.remark }}</div>
</div>
<div>
<a class="btn btn-primary btn-save" type="button" style="float:right;">保存</a>
</div>
{% endblock %}
{% load i18n %}
{% block subtitle %}
<ol class="breadcrumb">
<li>{% trans '积分变化明细' %}</li>
<li>{% trans '积分' %}</li>
</ol>
{% endblock %}
{# <link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">#}
{# <link type="text/css" rel="stylesheet"#}
{# href="https://davis.china315net.com/static/assets/vendors/datatables.net-bs/css/dataTables.bootstrap.min.css">#}
{# <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js"></script>#}
{# <script src="//cdn.datatables.net/1.12.1/js/jquery.dataTables.min.js"></script>#}
<script type="text/javascript">
$(document).ready(function(){
var table=$('#tb-dlgs').DataTable({
dom: 'Bfrtip',
autoWidth: false,
buttons: [{extend:'excelHtml5',text:'导出到Excel'}],
language:lng,
data:{{data|safe}}
});
table.columns().every( function () {
var that = this;
$('input', this.footer() ).on( 'keyup change clear', function () {
if ( that.search() !== this.value ) {
that.search( this.value ).draw();
}
});
});
/*
$('#tb-dlg').on("click","td a",function(){
$("#bg-modal").modal('hide');
$.RefreshContent($(this).attr('href'));
return false;
});
*/
});
var lng = {
"sProcessing": "处理中...",
"sLengthMenu": "显示 _MENU_ 项结果",
"sZeroRecords": "没有匹配结果",
"sInfo": "显示第 _START_ 至 _END_ 项结果,共 _TOTAL_ 项",
"sInfoEmpty": "显示第 0 至 0 项结果,共 0 项",
"sInfoFiltered": "(由 _MAX_ 项结果过滤)",
"sInfoPostFix": "",
"sSearch": "搜索:",
"sUrl": "",
"sEmptyTable": "表中数据为空",
"sLoadingRecords": "载入中...",
"sInfoThousands": ",",
"oPaginate": {
"sFirst": "首页",
"sPrevious": "上页",
"sNext": "下页",
"sLast": "末页"
},
"oAria": {
"sSortAscending": ": 以升序排列此列",
"sSortDescending": ": 以降序排列此列"
}
}
</script>
<div id="inventory-list" class="table-responsive">
<div class='x_panel'>
<table id="tb-dlgs" class="table table-striped table-bordered dt-responsive" width="100%">
<thead>
<tr>
<th style='width:15%'>{% trans "经销商" %}</th>
<th style='width:20%'>{% trans "收货方积分积分" %}</th>
<th style='width:8%'>{% trans "发货方积分" %}</th>
<th style='width:8%'>{% trans "更新时间" %}</th>
<th style='width:8%'>{% trans "操作人" %}</th>
</tr>
</thead>
<tfoot>
<th><input type="text" placeholder="{% trans "经销商" %}"></th>
<th><input type="text" placeholder="{% trans "收货方积分积分" %}"></th>
<th><input type="text" placeholder="{% trans "发货方积分" %}"></th>
<th><input type="text" placeholder="{% trans "更新时间" %}"></th>
<th><input type="text" placeholder="{% trans "操作人" %}"></th>
</tfoot>
</table>
</div>
</div>
......@@ -822,6 +822,7 @@
{% endifequal %}
<li><a class="l-a" href="/sales/channelpromotion/list/batch/">{% trans '扫码奖励明细' %}</a></li>
<li><a class="l-a" href="/company/bonusPoints/">{% trans '当前积分' %}</a></li>
{% ifequal user.company.level_id 1 %}
<li><a class="l-a" href="/sales/channelretate/period/redeem/">{% trans '奖励结算与核销' %}</a></li>
......
......@@ -57,7 +57,7 @@
{% endfor %}
</div>
</div>
<div class="form-group">
<label class="col-md-2 control-label">产品系列授权</label>
<div class='col-sm-4'>
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论