feat: 完成商品批量工具后端接口与Excel导入导出
All checks were successful
Build and Deploy TenantApi + SkuWorker / build-and-deploy (push) Successful in 1m49s
All checks were successful
Build and Deploy TenantApi + SkuWorker / build-and-deploy (push) Successful in 1m49s
This commit is contained in:
@@ -0,0 +1,362 @@
|
||||
using Microsoft.AspNetCore.Http;
|
||||
|
||||
namespace TakeoutSaaS.TenantApi.Contracts.Product;
|
||||
|
||||
/// <summary>
|
||||
/// 批量范围请求。
|
||||
/// </summary>
|
||||
public sealed class ProductBatchScopeRequest
|
||||
{
|
||||
/// <summary>
|
||||
/// 范围类型(all/category/selected/manual)。
|
||||
/// </summary>
|
||||
public string Type { get; set; } = "all";
|
||||
|
||||
/// <summary>
|
||||
/// 单个分类 ID(兼容字段)。
|
||||
/// </summary>
|
||||
public string? CategoryId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 分类 ID 列表(按分类时)。
|
||||
/// </summary>
|
||||
public List<string> CategoryIds { get; set; } = [];
|
||||
|
||||
/// <summary>
|
||||
/// 商品 ID 列表(手动选择时)。
|
||||
/// </summary>
|
||||
public List<string> ProductIds { get; set; } = [];
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 批量调价预览请求。
|
||||
/// </summary>
|
||||
public sealed class BatchPriceAdjustPreviewRequest
|
||||
{
|
||||
/// <summary>
|
||||
/// 门店 ID。
|
||||
/// </summary>
|
||||
public string StoreId { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 批量范围。
|
||||
/// </summary>
|
||||
public ProductBatchScopeRequest Scope { get; set; } = new();
|
||||
|
||||
/// <summary>
|
||||
/// 调价方向(up/down)。
|
||||
/// </summary>
|
||||
public string Direction { get; set; } = "up";
|
||||
|
||||
/// <summary>
|
||||
/// 调价方式(fixed/percent)。
|
||||
/// </summary>
|
||||
public string AmountType { get; set; } = "fixed";
|
||||
|
||||
/// <summary>
|
||||
/// 调价数值。
|
||||
/// </summary>
|
||||
public decimal Amount { get; set; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 批量调价请求。
|
||||
/// </summary>
|
||||
public sealed class BatchPriceAdjustRequest
|
||||
{
|
||||
/// <summary>
|
||||
/// 门店 ID。
|
||||
/// </summary>
|
||||
public string StoreId { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 批量范围。
|
||||
/// </summary>
|
||||
public ProductBatchScopeRequest Scope { get; set; } = new();
|
||||
|
||||
/// <summary>
|
||||
/// 调价方向(up/down)。
|
||||
/// </summary>
|
||||
public string Direction { get; set; } = "up";
|
||||
|
||||
/// <summary>
|
||||
/// 调价方式(fixed/percent)。
|
||||
/// </summary>
|
||||
public string AmountType { get; set; } = "fixed";
|
||||
|
||||
/// <summary>
|
||||
/// 调价数值。
|
||||
/// </summary>
|
||||
public decimal Amount { get; set; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 批量上下架请求。
|
||||
/// </summary>
|
||||
public sealed class BatchSaleSwitchRequest
|
||||
{
|
||||
/// <summary>
|
||||
/// 门店 ID。
|
||||
/// </summary>
|
||||
public string StoreId { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 批量范围。
|
||||
/// </summary>
|
||||
public ProductBatchScopeRequest Scope { get; set; } = new();
|
||||
|
||||
/// <summary>
|
||||
/// 动作(on/off)。
|
||||
/// </summary>
|
||||
public string Action { get; set; } = "off";
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 批量移动分类请求。
|
||||
/// </summary>
|
||||
public sealed class BatchMoveCategoryRequest
|
||||
{
|
||||
/// <summary>
|
||||
/// 门店 ID。
|
||||
/// </summary>
|
||||
public string StoreId { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 源分类 ID(可选)。
|
||||
/// </summary>
|
||||
public string? SourceCategoryId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 目标分类 ID。
|
||||
/// </summary>
|
||||
public string TargetCategoryId { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 批量范围。
|
||||
/// </summary>
|
||||
public ProductBatchScopeRequest Scope { get; set; } = new();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 批量同步门店请求。
|
||||
/// </summary>
|
||||
public sealed class BatchSyncStoreRequest
|
||||
{
|
||||
/// <summary>
|
||||
/// 源门店 ID。
|
||||
/// </summary>
|
||||
public string SourceStoreId { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 目标门店 ID 列表。
|
||||
/// </summary>
|
||||
public List<string> TargetStoreIds { get; set; } = [];
|
||||
|
||||
/// <summary>
|
||||
/// 商品 ID 列表。
|
||||
/// </summary>
|
||||
public List<string> ProductIds { get; set; } = [];
|
||||
|
||||
/// <summary>
|
||||
/// 是否同步价格。
|
||||
/// </summary>
|
||||
public bool SyncPrice { get; set; } = true;
|
||||
|
||||
/// <summary>
|
||||
/// 是否同步库存。
|
||||
/// </summary>
|
||||
public bool SyncStock { get; set; } = true;
|
||||
|
||||
/// <summary>
|
||||
/// 是否同步状态。
|
||||
/// </summary>
|
||||
public bool SyncStatus { get; set; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 批量导出请求。
|
||||
/// </summary>
|
||||
public sealed class BatchExportRequest
|
||||
{
|
||||
/// <summary>
|
||||
/// 门店 ID。
|
||||
/// </summary>
|
||||
public string StoreId { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 批量范围。
|
||||
/// </summary>
|
||||
public ProductBatchScopeRequest Scope { get; set; } = new();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 批量导入请求(表单)。
|
||||
/// </summary>
|
||||
public sealed class BatchImportRequest
|
||||
{
|
||||
/// <summary>
|
||||
/// 门店 ID。
|
||||
/// </summary>
|
||||
public string StoreId { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 导入文件。
|
||||
/// </summary>
|
||||
public IFormFile? File { get; set; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 批量工具通用结果。
|
||||
/// </summary>
|
||||
public sealed class BatchToolResultResponse
|
||||
{
|
||||
/// <summary>
|
||||
/// 总条数。
|
||||
/// </summary>
|
||||
public int TotalCount { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 成功条数。
|
||||
/// </summary>
|
||||
public int SuccessCount { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 失败条数。
|
||||
/// </summary>
|
||||
public int FailedCount { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 跳过条数。
|
||||
/// </summary>
|
||||
public int SkippedCount { get; set; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 调价预览项。
|
||||
/// </summary>
|
||||
public sealed class BatchPricePreviewItemResponse
|
||||
{
|
||||
/// <summary>
|
||||
/// 商品 ID。
|
||||
/// </summary>
|
||||
public string ProductId { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 商品名称。
|
||||
/// </summary>
|
||||
public string ProductName { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 原价。
|
||||
/// </summary>
|
||||
public decimal OriginalPrice { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 新价。
|
||||
/// </summary>
|
||||
public decimal NewPrice { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 变动值。
|
||||
/// </summary>
|
||||
public decimal DeltaPrice { get; set; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 调价预览结果。
|
||||
/// </summary>
|
||||
public sealed class BatchPricePreviewResponse
|
||||
{
|
||||
/// <summary>
|
||||
/// 预览项。
|
||||
/// </summary>
|
||||
public List<BatchPricePreviewItemResponse> Items { get; set; } = [];
|
||||
|
||||
/// <summary>
|
||||
/// 总影响商品数。
|
||||
/// </summary>
|
||||
public int TotalCount { get; set; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Excel 文件响应。
|
||||
/// </summary>
|
||||
public sealed class BatchExcelFileResponse
|
||||
{
|
||||
/// <summary>
|
||||
/// 文件名。
|
||||
/// </summary>
|
||||
public string FileName { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// Base64 文件内容。
|
||||
/// </summary>
|
||||
public string FileContentBase64 { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 导出总条数。
|
||||
/// </summary>
|
||||
public int TotalCount { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 成功条数。
|
||||
/// </summary>
|
||||
public int SuccessCount { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 失败条数。
|
||||
/// </summary>
|
||||
public int FailedCount { get; set; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 导入错误项。
|
||||
/// </summary>
|
||||
public sealed class BatchImportErrorItemResponse
|
||||
{
|
||||
/// <summary>
|
||||
/// 行号。
|
||||
/// </summary>
|
||||
public int RowNo { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 错误说明。
|
||||
/// </summary>
|
||||
public string Message { get; set; } = string.Empty;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 批量导入结果。
|
||||
/// </summary>
|
||||
public sealed class BatchImportResultResponse
|
||||
{
|
||||
/// <summary>
|
||||
/// 总条数。
|
||||
/// </summary>
|
||||
public int TotalCount { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 成功条数。
|
||||
/// </summary>
|
||||
public int SuccessCount { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 失败条数。
|
||||
/// </summary>
|
||||
public int FailedCount { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 跳过条数。
|
||||
/// </summary>
|
||||
public int SkippedCount { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 文件名。
|
||||
/// </summary>
|
||||
public string FileName { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 错误明细。
|
||||
/// </summary>
|
||||
public List<BatchImportErrorItemResponse> Errors { get; set; } = [];
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user