528 lines
16 KiB
C#
528 lines
16 KiB
C#
using Newtonsoft.Json;
|
||
using System;
|
||
using System.Collections.Generic;
|
||
using WPFCommon.Models;
|
||
|
||
namespace _29WxOrderWpf.Ctrls.Statistics.Models
|
||
{
|
||
/// <summary>
|
||
/// 店铺营收统计 - 查询参数。
|
||
/// 对应新接口 shop_revenue_statistics/get_shop_order_amount 与
|
||
/// shop_revenue_statistics/get_shop_stats_details 的请求体(StartDate / EndDate / ShopIds)。
|
||
/// </summary>
|
||
public class ShopRevenueStatisticsQuery
|
||
{
|
||
/// <summary>开始日期</summary>
|
||
public DateTime StartDate { get; set; }
|
||
|
||
/// <summary>结束日期</summary>
|
||
public DateTime EndDate { get; set; }
|
||
|
||
/// <summary>
|
||
/// 选中的店铺 ERP 店铺ID(ShopLoginInfo.ErpShopId)列表;
|
||
/// 空/Null 表示全部店铺(服务层会取全部店铺的 ErpShopId)。
|
||
/// </summary>
|
||
public List<string> ShopIds { get; set; }
|
||
}
|
||
|
||
/// <summary>
|
||
/// 店铺统计记录(接口返回)。
|
||
/// 接口返回结构:
|
||
/// shop_revenue_statistics/GetShopStats -> Result<Dictionary<string, List<ShopStatsResponse>>>
|
||
/// Key = 店铺ID,Value = 该店铺按 <see cref="ShopStatsGroupType"/> 聚合后的记录列表
|
||
/// (汇总=1 条;天/周/月=每个自然日/自然周/自然月各 1 条)。
|
||
/// 注意:接口只返回按 GroupType 聚合后的记录,不返回“整段汇总”,
|
||
/// 页面上的汇总卡片由客户端对返回记录自行合计(GroupType=Summary 时每店铺一条,直接相加即可)。
|
||
/// 金额字段单位均为“分”,显示时需除以 100 转为元。
|
||
/// </summary>
|
||
public class ShopStatsResponse
|
||
{
|
||
/// <summary>
|
||
/// 店铺ID
|
||
/// </summary>
|
||
public string ShopId { get; set; }
|
||
|
||
/// <summary>
|
||
/// 销售订单创建日期
|
||
/// </summary>
|
||
public DateTime StatDate { get; set; }
|
||
|
||
/// <summary>
|
||
/// 订单数(有效订单,不含退款订单)
|
||
/// </summary>
|
||
public int OrderCount { get; set; }
|
||
|
||
/// <summary>
|
||
/// 销售总额(分)
|
||
/// </summary>
|
||
public long SalesAmount { get; set; }
|
||
|
||
/// <summary>
|
||
/// 利润(分)
|
||
/// </summary>
|
||
public long ProfitAmount { get; set; }
|
||
|
||
/// <summary>
|
||
/// 平台佣金(分)
|
||
/// </summary>
|
||
public long PlatformFee { get; set; }
|
||
|
||
/// <summary>
|
||
/// 退款订单数
|
||
/// </summary>
|
||
public int RefundOrderCount { get; set; }
|
||
|
||
/// <summary>
|
||
/// 已成功退款金额(分,店铺端已退款成功)
|
||
/// </summary>
|
||
public long RefundDone { get; set; }
|
||
|
||
/// <summary>
|
||
/// 退款处理中金额(分,店铺端退款中)
|
||
/// </summary>
|
||
public long RefundPending { get; set; }
|
||
|
||
/// <summary>
|
||
/// 采购单数
|
||
/// </summary>
|
||
public int PurchaseCount { get; set; }
|
||
|
||
/// <summary>
|
||
/// 总花费金额(分,买手号采购付款金额)
|
||
/// </summary>
|
||
public long TotalPurchase { get; set; }
|
||
|
||
/// <summary>
|
||
/// 售后中买手总金额(分)
|
||
/// </summary>
|
||
public long TotalRefund => DoneRefund + PendingRefund + RejectedRefund;
|
||
|
||
/// <summary>
|
||
/// 已成功退款金额(分,买手号采购退款成功)
|
||
/// </summary>
|
||
public long DoneRefund { get; set; }
|
||
|
||
/// <summary>
|
||
/// 未退回金额(分)
|
||
/// </summary>
|
||
public long PendingRefund { get; set; }
|
||
|
||
/// <summary>
|
||
/// 被拒绝金额(分)
|
||
/// </summary>
|
||
public long RejectedRefund { get; set; }
|
||
}
|
||
|
||
/// <summary>
|
||
/// 销售趋势记录(接口返回):跨店铺合计后的按天趋势,供综合统计页的销售趋势折线图使用。
|
||
/// 接口返回结构:
|
||
/// shop_revenue_statistics/GetShopStatsTrend
|
||
/// -> Result<List<ShopStatsTrendResponse>>
|
||
/// 请求参数:StartDate / EndDate / ShopIds(不需要 GroupType,固定按天返回)。
|
||
/// 金额字段单位为“分”,显示时需除以 100 转为元。
|
||
/// </summary>
|
||
public class ShopStatsTrendResponse
|
||
{
|
||
/// <summary>
|
||
/// 统计日期(天)
|
||
/// </summary>
|
||
public DateTime StatDate { get; set; }
|
||
|
||
/// <summary>
|
||
/// 销售额(分)
|
||
/// </summary>
|
||
public long SalesAmount { get; set; }
|
||
|
||
/// <summary>
|
||
/// 订单数
|
||
/// </summary>
|
||
public int OrderCount { get; set; }
|
||
}
|
||
|
||
/// <summary>
|
||
/// 订单明细(接口返回):订单列表弹窗 ShowOrderDialogView 的数据行。
|
||
/// 接口返回结构:
|
||
/// shop_revenue_statistics/GetShopOrderDetails
|
||
/// -> Result<List<ShopOrderDetailResponse>>
|
||
/// 请求参数:StartDate / EndDate / ShopIds / OrderType(见 <see cref="ShopOrderDetailType"/>)。
|
||
/// 金额字段单位均为“分”,显示时需除以 100 转为元。
|
||
/// </summary>
|
||
public class ShopOrderDetailResponse
|
||
{
|
||
/// <summary>
|
||
/// 店铺ID
|
||
/// </summary>
|
||
public long ShopId { get; set; }
|
||
|
||
/// <summary>
|
||
/// 店铺名称
|
||
/// </summary>
|
||
public string ShopName { get; set; }
|
||
|
||
/// <summary>
|
||
/// 商铺订单号
|
||
/// </summary>
|
||
public string OrderId { get; set; }
|
||
|
||
/// <summary>
|
||
/// 订单创建时间
|
||
/// </summary>
|
||
public DateTime CreateTime { get; set; }
|
||
|
||
/// <summary>
|
||
/// 订单金额(分)
|
||
/// </summary>
|
||
public int OrderPrice { get; set; }
|
||
|
||
/// <summary>
|
||
/// 订单退款金额(分),即商铺订单商品明细的退款金额之和;有效订单为 0
|
||
/// </summary>
|
||
public int OrderRefundAmount { get; set; }
|
||
|
||
/// <summary>
|
||
/// 利润
|
||
/// </summary>
|
||
public long ProfitAmount { get; set; }
|
||
|
||
/// <summary>
|
||
/// 平台佣金
|
||
/// </summary>
|
||
public long PlatformFee { get; set; }
|
||
|
||
/// <summary>
|
||
/// 外采金额(分),即该订单下所有买手订单的购买金额之和
|
||
/// </summary>
|
||
public int OutAmount { get; set; }
|
||
|
||
/// <summary>
|
||
/// 买手未退回金额(分),即买手订单中退款未成功的退款金额之和;无售后时为 0
|
||
/// </summary>
|
||
public int UnrefundedAmount { get; set; }
|
||
|
||
/// <summary>
|
||
/// 买手订单信息(一个订单号对应多个买手订单)
|
||
/// </summary>
|
||
public List<BuyerOrderInfo> BuyerOrders { get; set; } = new List<BuyerOrderInfo>();
|
||
}
|
||
|
||
/// <summary>
|
||
/// 买手订单信息(订单明细下的子项,一个商铺订单可对应多个买手订单)
|
||
/// </summary>
|
||
public class BuyerOrderInfo
|
||
{
|
||
/// <summary>
|
||
/// 买手订单ID
|
||
/// </summary>
|
||
public long Id { get; set; }
|
||
/// <summary>
|
||
/// 仓库类型 0,1直发
|
||
/// </summary>
|
||
public int PurchaseType { get; set; }
|
||
/// <summary>
|
||
/// 外部订单(买手订单)号
|
||
/// </summary>
|
||
public string OutOrderSn { get; set; }
|
||
|
||
/// <summary>
|
||
/// 金额(分)
|
||
/// </summary>
|
||
public int OutAmount { get; set; }
|
||
|
||
public long RefundId { get; set; }
|
||
/// <summary>
|
||
/// 退款金额(分)
|
||
/// </summary>
|
||
public int RefundAmount { get; set; }
|
||
|
||
/// <summary>
|
||
/// 退款状态
|
||
/// </summary>
|
||
public string RefundStatusText { get; set; }
|
||
|
||
public DateTime CreateTime { get; set; }
|
||
public string Remark { get; set; }
|
||
}
|
||
|
||
/// <summary>
|
||
/// 顶部汇总卡片数据(金额单位:元)
|
||
/// </summary>
|
||
public class ShopRevenueSummary
|
||
{
|
||
/// <summary>销售额(最终有效销售额)</summary>
|
||
public decimal SalesAmount { get; set; }
|
||
/// <summary>有效订单数(已扣除退款订单)</summary>
|
||
public int ValidOrderCount { get; set; }
|
||
|
||
/// <summary>利润(实际利润)</summary>
|
||
public decimal Profit { get; set; }
|
||
|
||
/// <summary>退款金额(统计期间店铺端退款:已成功 + 处理中)</summary>
|
||
public decimal RefundAmount { get; set; }
|
||
|
||
/// <summary>退款订单数</summary>
|
||
public int RefundOrderCount { get; set; }
|
||
|
||
/// <summary>平台服务费总额(元)</summary>
|
||
public decimal PlatformFeeTotal { get; set; }
|
||
|
||
/// <summary>
|
||
/// 达人佣金(元)。
|
||
/// 新接口未提供该字段,固定为 0,保留属性与页面展示,待后端补充字段后直接接上。
|
||
/// </summary>
|
||
public decimal Commission { get; set; }
|
||
|
||
/// <summary>客单价(平均每单金额)</summary>
|
||
public decimal AvgOrderAmount { get; set; }
|
||
|
||
/// <summary>退款率(退款订单占比,百分数,如 2.31 表示 2.31%)</summary>
|
||
public decimal RefundRate { get; set; }
|
||
|
||
/// <summary>平均利润率(利润 / 采购金额,百分数,如 12.34 表示 12.34%)</summary>
|
||
public decimal AverageProfitRate { get; set; }
|
||
/// <summary>买手号付款金额(采购金额,元)</summary>
|
||
public decimal BuyerPaymentAmount { get; set; }
|
||
|
||
/// <summary>买手号退款金额(采购退款金额,元)</summary>
|
||
public decimal BuyerRefundAmount { get; set; }
|
||
/// <summary>买手号退款成功金额(采购退款金额,元)</summary>
|
||
public decimal BuyerRefundSuccessedAmount { get; set; }
|
||
/// <summary>买手号剩余退款金额(尚未成功退款的金额,元)</summary>
|
||
public decimal BuyerRefundRemainingAmount => BuyerRefundAmount - BuyerRefundSuccessedAmount;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 销售趋势数据点(金额单位:元)
|
||
/// </summary>
|
||
public class RevenueTrendPoint
|
||
{
|
||
/// <summary>日期</summary>
|
||
public DateTime Date { get; set; }
|
||
|
||
/// <summary>日期文本(MM-dd)</summary>
|
||
public string DateText { get { return Date.ToString("MM-dd"); } }
|
||
|
||
/// <summary>当日销售额(元)</summary>
|
||
public decimal SalesAmount { get; set; }
|
||
|
||
/// <summary>当日有效订单数</summary>
|
||
public int OrderCount { get; set; }
|
||
}
|
||
|
||
/// <summary>
|
||
/// 店铺销售占比数据(金额单位:元)
|
||
/// </summary>
|
||
public class ShopSalesProportionItem
|
||
{
|
||
/// <summary>店铺名称</summary>
|
||
public string ShopName { get; set; }
|
||
|
||
/// <summary>销售额(元)</summary>
|
||
public decimal SalesAmount { get; set; }
|
||
|
||
/// <summary>占比(0~100)</summary>
|
||
public double Percentage { get; set; }
|
||
}
|
||
|
||
/// <summary>
|
||
/// 店铺统计表格行(金额单位:元)
|
||
/// </summary>
|
||
public class ShopStatisticsItem
|
||
{
|
||
/// <summary>店铺名称</summary>
|
||
public string ShopName { get; set; }
|
||
|
||
/// <summary>订单数(有效订单,不含退款订单)</summary>
|
||
public int OrderCount { get; set; }
|
||
|
||
/// <summary>销售额(元)</summary>
|
||
public decimal SalesAmount { get; set; }
|
||
/// <summary>采购金额(元)</summary>
|
||
public decimal BuyerPaymentAmount { get; set; }
|
||
/// <summary>利润(元)</summary>
|
||
public decimal Profit { get; set; }
|
||
|
||
/// <summary>退款金额(元)</summary>
|
||
public decimal RefundAmount { get; set; }
|
||
|
||
/// <summary>平台服务费总额(元)</summary>
|
||
public decimal PlatformFeeTotal { get; set; }
|
||
|
||
/// <summary>达人佣金(元)。新接口未提供该字段,固定为 0。</summary>
|
||
public decimal Commission { get; set; }
|
||
|
||
/// <summary>客单价(元)</summary>
|
||
public decimal AvgOrderAmount { get; set; }
|
||
|
||
/// <summary>平均利润率(利润 / 采购金额,百分数,如 12.34 表示 12.34%)</summary>
|
||
public decimal AverageProfitRate { get; set; }
|
||
}
|
||
|
||
/// <summary>
|
||
/// 统计周期类型:天 / 周 / 月
|
||
/// </summary>
|
||
public enum PeriodStatisticType
|
||
{
|
||
/// <summary>按天统计</summary>
|
||
Day = 0,
|
||
|
||
/// <summary>按周统计(周一起始)</summary>
|
||
Week = 1,
|
||
|
||
/// <summary>按月统计</summary>
|
||
Month = 2
|
||
}
|
||
|
||
/// <summary>
|
||
/// 接口聚合方式(请求参数 GroupType,按数字传值)。
|
||
/// 每种方式都返回 Dictionary<店铺ID, List<ShopStatsResponse>>:
|
||
/// 汇总时每个店铺 1 条,天/周/月时每个店铺每个周期 1 条。
|
||
/// </summary>
|
||
public enum ShopStatsGroupType
|
||
{
|
||
/// <summary>
|
||
/// 汇总:每个商铺只返回一条(整个查询范围合计)
|
||
/// </summary>
|
||
Summary = 0,
|
||
|
||
/// <summary>
|
||
/// 天:按自然日聚合,每个商铺每天一条
|
||
/// </summary>
|
||
Day = 1,
|
||
|
||
/// <summary>
|
||
/// 周:按自然周聚合(周一为一周开始),每个商铺每周一条
|
||
/// </summary>
|
||
Week = 2,
|
||
|
||
/// <summary>
|
||
/// 月:按自然月聚合,每个商铺每月一条
|
||
/// </summary>
|
||
Month = 3
|
||
}
|
||
|
||
/// <summary>
|
||
/// 订单明细类型(订单列表弹窗的入口类型,对应接口参数 OrderType,按数字传值)。
|
||
/// 数值与后端枚举保持一致:有效订单=1、退款订单=2、买手未退回金额的订单=3
|
||
/// (后端枚举里的“全部订单 All=0”本页不使用,故不定义)。
|
||
/// </summary>
|
||
public enum ShopOrderDetailType
|
||
{
|
||
/// <summary>有效订单:没有发生售后的订单(对应统计里的订单数 / 销售额 / 利润口径)</summary>
|
||
Valid = 1,
|
||
|
||
/// <summary>退款订单:发生过售后的订单(对应统计里的退款订单数口径)</summary>
|
||
Refund = 2,
|
||
|
||
/// <summary>买手未退回金额的订单:退款订单中买手款项还没退回的(对应统计里的未退回金额口径)</summary>
|
||
BuyerUnrefunded = 3,
|
||
/// <summary>
|
||
/// 利润订单 有效订单+退款订单利润>0
|
||
/// </summary>
|
||
Profit = 4,
|
||
}
|
||
|
||
/// <summary>
|
||
/// 天/周/月周期统计表格行(金额单位:元)。
|
||
/// 按所选店铺(或全部店铺)统计:天统计每天一行;周统计每周一行;月统计每月一行。
|
||
/// </summary>
|
||
public class ShopPeriodStatisticsItem
|
||
{
|
||
/// <summary>周期开始日期(用于排序)</summary>
|
||
public DateTime PeriodStart { get; set; }
|
||
|
||
/// <summary>周期显示文本(天:yyyy-MM-dd;周:yyyy-MM-dd ~ yyyy-MM-dd;月:yyyy-MM)</summary>
|
||
public string Period { get; set; }
|
||
|
||
/// <summary>订单数(有效订单,不含退款订单)</summary>
|
||
public int OrderCount { get; set; }
|
||
|
||
/// <summary>销售额(元)</summary>
|
||
public decimal SalesAmount { get; set; }
|
||
/// <summary>买手号付款金额(采购金额,元)</summary>
|
||
public decimal BuyerPaymentAmount { get; set; }
|
||
|
||
/// <summary>利润(元)</summary>
|
||
public decimal Profit { get; set; }
|
||
|
||
/// <summary>退款金额(元)</summary>
|
||
public decimal RefundAmount { get; set; }
|
||
|
||
/// <summary>平台服务费总额(元)</summary>
|
||
public decimal PlatformFeeTotal { get; set; }
|
||
|
||
/// <summary>达人佣金(元)。新接口未提供该字段,固定为 0。</summary>
|
||
public decimal Commission { get; set; }
|
||
|
||
/// <summary>平均利润率(利润 / 采购金额,百分数,如 12.34 表示 12.34%)</summary>
|
||
public decimal AverageProfitRate { get; set; }
|
||
|
||
/// <summary>客户数</summary>
|
||
public int CustomerCount { get; set; }
|
||
|
||
/// <summary>客单价(元)</summary>
|
||
public decimal AvgOrderAmount { get; set; }
|
||
}
|
||
|
||
/// <summary>
|
||
/// 店铺营收统计 - 一次查询的全部聚合结果(综合统计页使用)。
|
||
/// 由两次请求组成:
|
||
/// shop_revenue_statistics/GetShopStats(GroupType=Summary)-> 卡片/店铺统计表/销售占比(每店铺一条,与区间长度无关)
|
||
/// shop_revenue_statistics/GetShopStatsTrend -> 销售趋势(跨店铺合计的按天序列)
|
||
/// </summary>
|
||
public class ShopRevenueStatisticsResult
|
||
{
|
||
/// <summary>汇总卡片数据</summary>
|
||
public ShopRevenueSummary Summary { get; set; }
|
||
|
||
/// <summary>销售趋势(按天,缺失日期补 0)</summary>
|
||
public List<RevenueTrendPoint> Trend { get; set; }
|
||
|
||
/// <summary>店铺销售占比(饼图)</summary>
|
||
public List<ShopSalesProportionItem> ShopProportions { get; set; }
|
||
|
||
/// <summary>店铺统计表格</summary>
|
||
public List<ShopStatisticsItem> ShopStatistics { get; set; }
|
||
}
|
||
|
||
/// <summary>
|
||
/// 店铺营收统计 - 天/周/月周期统计查询结果(周期统计页使用)。
|
||
/// 接口不返回整段汇总,Summary 由返回的周期数据在客户端合计得出。
|
||
/// </summary>
|
||
public class ShopPeriodStatisticsResult
|
||
{
|
||
/// <summary>汇总卡片数据(整个查询时间段,客户端合计)</summary>
|
||
public ShopRevenueSummary Summary { get; set; }
|
||
|
||
/// <summary>周期统计表格(天/周/月各一行)</summary>
|
||
public List<ShopPeriodStatisticsItem> Items { get; set; }
|
||
}
|
||
|
||
/// <summary>
|
||
/// 店铺下拉选项
|
||
/// </summary>
|
||
public class ShopOption
|
||
{
|
||
/// <summary>店铺ID(ShopLoginInfo.ShopId)</summary>
|
||
public string ShopId { get; set; }
|
||
|
||
/// <summary>ERP 店铺ID(ShopLoginInfo.ErpShopId),统计接口的 ShopIds 使用该字段</summary>
|
||
public string ErpShopId { get; set; }
|
||
|
||
/// <summary>店铺名称</summary>
|
||
public string ShopName { get; set; }
|
||
}
|
||
|
||
/// <summary>
|
||
/// 时间范围下拉选项
|
||
/// </summary>
|
||
public class TimeRangeOption
|
||
{
|
||
/// <summary>显示文本(如:今天、昨天、本周、本月、最近10天、自定义)</summary>
|
||
public string Text { get; set; }
|
||
|
||
/// <summary>值(today / yesterday / week / month / last10 / custom)</summary>
|
||
public string Value { get; set; }
|
||
}
|
||
|
||
}
|