mall-portrait-common 0.1.1

Common utilities and types for mall portrait projects.
Documentation
use serde::{Deserialize, Serialize};
use uuid::Uuid;

/// 标准化的用户事件
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UserEvent {
    /// 全局唯一事件ID
    pub event_id: Uuid,
    /// 商城ID
    pub mall_id: String,
    /// 用户ID
    pub user_id: String,
    /// 事件发生时间(Unix时间戳,秒)
    pub event_time: i64,
    /// 数据接入时间(Unix时间戳,秒)
    pub ingestion_time: i64,
    /// 数据来源
    pub source: DataSource,
    /// 身份标识
    pub global_id: String,
    /// 事件类型
    pub event_type: EventType,
    /// 客户端 IP
    pub ip: Option<String>,
    /// User-Agent
    pub user_agent: Option<String>,
    /// 设备类型
    pub device_type: Option<DeviceType>,
    /// 操作系统
    pub os: Option<String>,
    /// 浏览器
    pub browser: Option<String>,
    /// 会话 ID
    pub session_id: Option<String>,
    /// 地理位置:国家
    pub location_country: Option<String>,
    /// 地理位置:省
    pub location_province: Option<String>,
    /// 地理位置:市
    pub location_city: Option<String>,
    /// 地理位置:纬度
    pub location_latitude: Option<f64>,
    /// 地理位置:经度
    pub location_longitude: Option<f64>,
    /// 数据质量评分 (0-1)
    pub quality_score: f32,
    /// 校验错误信息
    pub validation_errors: Vec<String>,
    /// 订单号
    pub no: Option<String>,
    /// 产品名称
    pub product_name: Option<String>,
    /// 下单时间
    pub order_time: Option<i64>,
    /// 游玩日期
    pub play_date: Option<i64>,
    /// 开始日期
    pub start_date: Option<i64>,
    /// 结束日期
    pub end_date: Option<i64>,
    /// 支付时间
    pub payment_time: Option<i64>,
    /// 取消时间
    pub cancellation_time: Option<i64>,
    /// 订单状态
    pub order_status: Option<String>,
    /// 预定数量
    pub quantity: Option<u32>,
    /// 取消数量
    pub cancellation_quantity: Option<u32>,
    /// 单价
    pub unit_price: Option<f64>,
    /// 总价
    pub total_price: Option<f64>,
    /// 采购价
    pub purchase_price: Option<f64>,
    /// 购买人姓名
    pub purchaser_name: Option<String>,
    /// 购买人手机号
    pub purchaser_phone: Option<String>,
    /// 购买人身份证号
    pub purchaser_id_card: Option<String>,
    /// 分销商名称
    pub distributor_name: Option<String>,
    /// 分销商分组
    pub distributor_group: Option<String>,
    /// 供应商
    pub supplier_name: Option<String>,
    /// 支付方式
    pub payment_method: Option<String>,
    /// 房型名称
    pub room_type: Option<String>,
    /// 房间号
    pub room_number: Option<String>,
    /// 订单类型
    pub order_type: Option<String>,
    /// 预定类型
    pub booking_type: Option<String>,
    /// 订单来源
    pub order_source: Option<String>,
    /// 预定时间
    pub booking_time: Option<i64>,
    /// 入住日期
    pub check_in_date: Option<i64>,
    /// 退房日期
    pub check_out_date: Option<i64>,
    /// 预定房间数
    pub room_count: Option<u32>,
    /// 预定人数
    pub guest_count: Option<u32>,
}

/// 数据源枚举
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum DataSource {
    TicketOrderCsv { path: String },
    HomestayOrderExcel { path: String, sheet: String },
}

/// 事件类型
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum EventType {
    /// 门票订单下单
    TicketOrderPlaced,
    /// 民宿订单下单
    AccommodationOrderPlaced,
    Custom(String),
}


#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct EventContext {
    pub ip: Option<String>,
    pub user_agent: Option<String>,
    pub device_type: Option<DeviceType>,
    pub os: Option<String>,
    pub browser: Option<String>,
    pub location: Option<GeoLocation>,
    pub session_id: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum DeviceType {
    Mobile,
    Desktop,
    Tablet,
    Unknown,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GeoLocation {
    pub country: Option<String>,
    pub province: Option<String>,
    pub city: Option<String>,
    pub latitude: Option<f64>,
    pub longitude: Option<f64>,
}