task.py 3.81 KB
"""
数据模型 - 补货任务
"""

from dataclasses import dataclass, field
from decimal import Decimal
from datetime import datetime
from typing import Optional
from enum import IntEnum


class TaskStatus(IntEnum):
    """任务状态"""
    RUNNING = 0
    SUCCESS = 1
    FAILED = 2


@dataclass
class ReplenishmentTask:
    """AI补货任务"""
    
    task_no: str
    group_id: int
    dealer_grouping_id: int
    
    id: Optional[int] = None
    dealer_grouping_name: Optional[str] = None
    brand_grouping_id: Optional[int] = None
    plan_amount: Decimal = Decimal("0")
    actual_amount: Decimal = Decimal("0")
    part_count: int = 0
    base_ratio: Optional[Decimal] = None
    status: TaskStatus = TaskStatus.RUNNING
    error_message: str = ""
    llm_provider: str = ""
    llm_model: str = ""
    llm_total_tokens: int = 0
    statistics_date: str = ""
    start_time: Optional[datetime] = None
    end_time: Optional[datetime] = None
    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,
            "dealer_grouping_name": self.dealer_grouping_name,
            "brand_grouping_id": self.brand_grouping_id,
            "plan_amount": float(self.plan_amount),
            "actual_amount": float(self.actual_amount),
            "part_count": self.part_count,
            "base_ratio": float(self.base_ratio) if self.base_ratio else None,
            "status": int(self.status),
            "error_message": self.error_message,
            "llm_provider": self.llm_provider,
            "llm_model": self.llm_model,
            "llm_total_tokens": self.llm_total_tokens,
            "statistics_date": self.statistics_date,
        }


@dataclass
class ReplenishmentDetail:
    """AI补货建议明细"""
    
    task_no: str
    group_id: int
    dealer_grouping_id: int
    shop_id: int
    part_code: str
    
    id: Optional[int] = None
    brand_grouping_id: Optional[int] = None
    shop_name: Optional[str] = None
    part_name: Optional[str] = None
    unit: Optional[str] = None
    cost_price: Decimal = Decimal("0")
    current_ratio: Optional[Decimal] = None
    base_ratio: Optional[Decimal] = None
    post_plan_ratio: Optional[Decimal] = None
    valid_storage_cnt: Decimal = Decimal("0")
    avg_sales_cnt: Decimal = Decimal("0")
    suggest_cnt: int = 0
    suggest_amount: Decimal = Decimal("0")
    suggestion_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,
            "brand_grouping_id": self.brand_grouping_id,
            "shop_id": self.shop_id,
            "shop_name": self.shop_name,
            "part_code": self.part_code,
            "part_name": self.part_name,
            "unit": self.unit,
            "cost_price": float(self.cost_price),
            "current_ratio": float(self.current_ratio) if self.current_ratio else None,
            "base_ratio": float(self.base_ratio) if self.base_ratio else None,
            "post_plan_ratio": float(self.post_plan_ratio) if self.post_plan_ratio else None,
            "valid_storage_cnt": float(self.valid_storage_cnt),
            "avg_sales_cnt": float(self.avg_sales_cnt),
            "suggest_cnt": self.suggest_cnt,
            "suggest_amount": float(self.suggest_amount),
            "suggestion_reason": self.suggestion_reason,
            "priority": self.priority,
            "llm_confidence": self.llm_confidence,
            "statistics_date": self.statistics_date,
        }