Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
Y
ypt_mgw_local
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
苏星豪
ypt_mgw_local
Commits
bfb23559
提交
bfb23559
authored
12月 09, 2022
作者:
zhang wei
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fix: 诗仙太白-积分明细报表
上级
5ed0e863
显示空白字符变更
内嵌
并排
正在显示
6 个修改的文件
包含
324 行增加
和
0 行删除
+324
-0
forms.py
company/forms.py
+9
-0
models.py
company/models.py
+110
-0
views.py
company/views.py
+60
-0
points.html
templates/company/points.html
+41
-0
points_list.html
templates/company/points_list.html
+103
-0
left.html
templates/left.html
+1
-0
没有找到文件。
company/forms.py
浏览文件 @
bfb23559
...
...
@@ -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
)
company/models.py
浏览文件 @
bfb23559
...
...
@@ -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
company/views.py
浏览文件 @
bfb23559
...
...
@@ -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
templates/company/points.html
0 → 100644
浏览文件 @
bfb23559
{% 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 %}
templates/company/points_list.html
0 → 100644
浏览文件 @
bfb23559
{% 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>
templates/left.html
浏览文件 @
bfb23559
...
...
@@ -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>
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论