part_summary.py 2.07 KB
"""
数据模型 - 配件汇总
"""

from dataclasses import dataclass
from decimal import Decimal
from datetime import datetime
from typing import Optional


@dataclass
class ReplenishmentPartSummary:
    """AI补货建议-配件汇总"""
    
    task_no: str
    group_id: int
    dealer_grouping_id: int
    part_code: str
    
    id: Optional[int] = None
    part_name: Optional[str] = None
    unit: Optional[str] = None
    cost_price: Decimal = Decimal("0")
    
    # 商家组合级别汇总数据
    total_storage_cnt: Decimal = Decimal("0")
    total_avg_sales_cnt: Decimal = Decimal("0")
    group_current_ratio: Optional[Decimal] = None
    
    # 补货建议汇总
    total_suggest_cnt: int = 0
    total_suggest_amount: Decimal = Decimal("0")
    shop_count: int = 0
    need_replenishment_shop_count: int = 0
    
    # LLM分析结果
    part_decision_reason: str = ""
    priority: int = 2
    llm_confidence: float = 0.8
    
    # 元数据
    statistics_date: str = ""
    create_time: Optional[datetime] = None

    def to_dict(self) -> dict:
        """转换为字典"""
        return {
            "task_no": self.task_no,
            "group_id": self.group_id,
            "dealer_grouping_id": self.dealer_grouping_id,
            "part_code": self.part_code,
            "part_name": self.part_name,
            "unit": self.unit,
            "cost_price": float(self.cost_price),
            "total_storage_cnt": float(self.total_storage_cnt),
            "total_avg_sales_cnt": float(self.total_avg_sales_cnt),
            "group_current_ratio": float(self.group_current_ratio) if self.group_current_ratio else None,
            "total_suggest_cnt": self.total_suggest_cnt,
            "total_suggest_amount": float(self.total_suggest_amount),
            "shop_count": self.shop_count,
            "need_replenishment_shop_count": self.need_replenishment_shop_count,
            "part_decision_reason": self.part_decision_reason,
            "priority": self.priority,
            "llm_confidence": self.llm_confidence,
            "statistics_date": self.statistics_date,
        }