[ Chf test ]


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