Files
29WxOrder/29WxOrderWpf/Ctrls/Statistics/Models/ShopRevenueStatisticsModels.cs
T
chfei cc0904c728 增加 利润明细
移除有效订单明细
增加待退回金额明细 列表备注功能
2026-10-09 17:15:50 +08:00

528 lines
16 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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&lt;Dictionary&lt;string, List&lt;ShopStatsResponse&gt;&gt;&gt;
/// 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&lt;List&lt;ShopStatsTrendResponse&gt;&gt;
/// 请求参数: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&lt;List&lt;ShopOrderDetailResponse&gt;&gt;
/// 请求参数: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&lt;店铺ID, List&lt;ShopStatsResponse&gt;&gt;:
/// 汇总时每个店铺 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; }
}
}