def registration_summary1():
"""逻辑基本一样,只是后面月份的数量是前面月份的基础上添加的"""
dates = []
values = []
current_date = Date.today()
# 生成过去24个月的日期列表(保持原有逻辑)
for i in range(24):
next_month = current_date + relativedelta(months=-i)
dates.insert(0, next_month)
# 先获取每个月的独立新注册数量
monthly_counts = []
for date in dates:
count = Parts.objects.filter(deleted=False, create__year=date.year, create__month=date.month).count()
monthly_counts.append(count)
# 计算累积数量(关键修改:将独立计数转为累积和)
cumulative_sum = 0
for count in monthly_counts:
cumulative_sum += count
values.append(cumulative_sum)
return {
"date": dates,
"value": values, # 现在value是累积数量
}
def registration_summary2():
# 目标分组(根据用户需求定义)
target_workgroups = ["A", "B", "C", "D", "E", "F", "G", "H"]
csv_data_list = []
# 生成过去24个月的日期列表(格式:YYYY-MM)
dates = []
current_date = Date.today()
for i in range(24):
next_month = current_date + relativedelta(months=-i)
dates.insert(0, next_month.strftime("%Y-%m")) # 格式化为"YYYY-MM"
# 初始化series结构(每个workgroup对应一个长度为24的数组,初始值0)
series = {wg: [0]*24 for wg in target_workgroups}
# 查询所有有效零件的创建时间和workgroup(按月份和workgroup分组统计)
monthly_grouped = Parts.objects.filter(
deleted=False,
workgroup__in=target_workgroups # 只统计目标分组
).annotate(
year=ExtractYear('create'),
month=ExtractMonth('create')
).values(
'workgroup', 'year', 'month' # 按workgroup、年、月分组
).annotate(
count=Count('id') # 统计每月数量
).order_by('year', 'month') # 按时间排序
# 填充每月原始数量(非累积)
for item in monthly_grouped:
# 构造月份字符串(如"2024-05")
month_str = f"{item['year']}-{item['month']:02d}"
# 找到该月份在dates中的索引
if month_str in dates:
index = dates.index(month_str)
# 对应workgroup的该月数量累加
series[item['workgroup']][index] = item['count']
# 计算每个workgroup的累积数量(关键修改)
for wg in target_workgroups:
cumulative = 0
for i in range(len(dates)):
cumulative += series[wg][i]
series[wg][i] = cumulative
return {
"xaxis": dates,
"legend": target_workgroups,
"series": series
}
def registration_summary_csv():
# 获取分组统计数据(复用registration_summary2的逻辑)
summary_data = registration_summary2()
xaxis = summary_data["xaxis"] # 格式如["2024-03", "2024-04", "2024-05"...]
series = summary_data["series"] # 各workgroup的累积数据
# 获取最近3个月的月份缩写(如Jan, Feb, Mar)
current_month = datetime.today()
target_months = []
for i in range(2, -1, -1): # 前两个月+当前月(倒序取最近3个)
month_date = current_month - relativedelta(months=i)
target_months.append(month_date.strftime("%b")) # 转换为月份缩写
# 提取最近3个月在xaxis中的索引(xaxis是按时间顺序排列的)
# 示例xaxis: ["2024-03", "2024-04", "2024-05", ..., "2025-04"]
# 假设当前是2025-04,则最近3个月是2025-02, 2025-03, 2025-04
# 需要找到这三个月份在xaxis中的位置
target_month_strs = [
(current_month - relativedelta(months=i)).strftime("%Y-%m")
for i in range(2, -1, -1)
]
indices = [xaxis.index(ms) for ms in target_month_strs if ms in xaxis]
# 构建CSV数据
csv_rows = []
# 表头:月份缩写(如Jan, Feb, Mar)
csv_rows.append([""] + target_months)
# 各workgroup的数据行
for wg in ["A", "B", "C", "E", "F", "G", "H"]: # 按用户示例顺序
# 提取该workgroup最近3个月的累积值(若索引存在则取,否则0)
values = [series[wg][i] if i < len(series[wg]) else 0 for i in indices]
csv_rows.append([wg] + values)
# 生成CSV响应
response = HttpResponse(content_type='text/csv')
response['Content-Disposition'] = 'attachment; filename="registration_summary.csv"'
writer = csv.writer(response)
writer.writerows(csv_rows)
return response
[ Chf test ]
发表评论
85 views