Commit 2761d73f by 泽锋 李

新增fba实时库存查询

parent b5192314
......@@ -610,6 +610,269 @@ left join dc_base_warehouse as dbw on t1.warehouse_code = dbw.warehouse_code
}
return obj;
}
public static List<dc_base_stock_fba_dto> RealtimeFbaList(dc_base_stock_search_dto search_data, List<bailun_category_new_dto> categoryModels, ref int total)
{
DynamicParameters parameters = new DynamicParameters();
var sql = "";
if (search_data.isSum || search_data.is_warehouse_sum)
{
sql = @"
select
sum(t1.amount_sales_usd_1) as 'amount_sales_usd_1',
sum(t1.bailun_sku_quantity_ordered_1) as 'bailun_sku_quantity_ordered_1',
sum(t1.amount_sales_usd_7) as 'amount_sales_usd_7',
sum(t1.bailun_sku_quantity_ordered_7) as 'bailun_sku_quantity_ordered_7',
sum(t1.amount_sales_usd_30) as 'amount_sales_usd_30',
sum(t1.bailun_sku_quantity_ordered_30) as 'bailun_sku_quantity_ordered_30',
sum(t6.quantity_purchase) as 'quantity_purchase',
sum(t6.quantity_transfer) as 'quantity_transfer',
sum(t6.quantity_transfer_order) as 'quantity_transfer_order',
sum(t6.quantity_transfer_temp_schedule) as 'quantity_transfer_temp_schedule',
sum(t6.quantity_transfer_temporary_storage) as 'quantity_transfer_temporary_storage',
sum((t6.quantity_purchase+t6.quantity_transfer)) as 'sum_mid',
sum(ts1.usable_stock) as 'usable_stock_01',
sum(ts2.usable_stock) as 'usable_stock_02',
sum(t2.usable_stock) as 'usable_stock',
sum(((t6.quantity_purchase+t6.quantity_transfer)*t3.unit_price)) as 'sum_mid_amount',
sum(( t2.usable_stock*t3.unit_price)) as 'usable_stock_amount',
sum(((t6.quantity_purchase+t6.quantity_transfer+t2.usable_stock)*t3.unit_price)) as 'sum_amount',
sum(((t6.quantity_purchase+t6.quantity_transfer+t2.usable_stock)) as 'sum_stock')
from dc_config_fba_extend as t1
left JOIN dc_base_stock as t2 on t1.bailun_sku_warehouse_code = t2.bailun_sku_warehouse_code
left join dc_base_sku as t3 on t1.bailun_sku = t3.bailun_sku
left join dc_base_warehouse as t4 on t1.warehouse_code = t4.warehouse_code
left join dc_auto_config_sku_warehouse as t5 on t1.bailun_sku = t5.bailun_sku and t1.warehouse_code = t5.warehouse_code
left join dc_mid_transit as t6 on t1.bailun_sku = t6.bailun_sku and t1.warehouse_code = t6.warehouse_code
left join (select ts1.bailun_sku,ts1.usable_stock from dc_base_stock as ts1 where ts1.bailun_sku in (select bailun_sku from dc_config_fba_extend ) and ts1.warehouse_code='GZBLWH') as ts1 on t1.bailun_sku = ts1.bailun_sku
left join (select ts1.bailun_sku,ts1.usable_stock from dc_base_stock as ts1 where ts1.bailun_sku in (select bailun_sku from dc_config_fba_extend ) and ts1.warehouse_code='GZBLZZG') as ts2 on t1.bailun_sku = ts2.bailun_sku
";
if (search_data.has_tort != null)
{
sql += " left join dc_base_tort as t7 on t1.bailun_sku = t7.bailun_sku ";
}
sql += " where t1.bailun_sku_warehouse_code!='' ";
}
else
{
sql = @"
select
t1.bailun_account,t1.web_site,t1.asin,t1.bailun_sku,t1.product_type,t1.group_name,t1.sale_name,t3.sku_title_cn,
t1.warehouse_code,t4.warehouse_name,t4.area_name,
t1.amount_sales_usd_1,t1.bailun_sku_quantity_ordered_1,t1.amount_sales_usd_7,t1.bailun_sku_quantity_ordered_7,t1.amount_sales_usd_30,t1.bailun_sku_quantity_ordered_30,
( case when t5.`status`=0 or t5.`status` is null then 0 else 1 end ) as 'monitor_status',
t3.buyer_name,t3.unit_price,t3.weight,
t6.quantity_purchase,t6.quantity_transfer,t6.quantity_transfer_order,t6.quantity_transfer_temp_schedule,t6.quantity_transfer_temporary_storage,(t6.quantity_purchase+t6.quantity_transfer) as 'sum_mid',
ts1.usable_stock as 'usable_stock_01',ts2.usable_stock as 'usable_stock_02', t2.usable_stock,
((t6.quantity_purchase+t6.quantity_transfer)*t3.unit_price) as 'sum_mid_amount',( t2.usable_stock*t3.unit_price) as 'usable_stock_amount',((t6.quantity_purchase+t6.quantity_transfer+t2.usable_stock)*t3.unit_price) as 'sum_amount'
from dc_config_fba_extend as t1
left JOIN dc_base_stock as t2 on t1.bailun_sku_warehouse_code = t2.bailun_sku_warehouse_code
left join dc_base_sku as t3 on t1.bailun_sku = t3.bailun_sku
left join dc_base_warehouse as t4 on t1.warehouse_code = t4.warehouse_code
left join dc_auto_config_sku_warehouse as t5 on t1.bailun_sku = t5.bailun_sku and t1.warehouse_code = t5.warehouse_code
left join dc_mid_transit as t6 on t1.bailun_sku = t6.bailun_sku and t1.warehouse_code = t6.warehouse_code
left join (select ts1.bailun_sku,ts1.usable_stock from dc_base_stock as ts1 where ts1.bailun_sku in (select bailun_sku from dc_config_fba_extend ) and ts1.warehouse_code='GZBLWH') as ts1 on t1.bailun_sku = ts1.bailun_sku
left join (select ts1.bailun_sku,ts1.usable_stock from dc_base_stock as ts1 where ts1.bailun_sku in (select bailun_sku from dc_config_fba_extend ) and ts1.warehouse_code='GZBLZZG') as ts2 on t1.bailun_sku = ts2.bailun_sku
left join dc_base_tort as t7 on t1.bailun_sku = t7.bailun_sku
where t1.bailun_sku_warehouse_code!=''
";
}
var countSql = @"
select
count(1)
from
dc_config_fba_extend as t1
left join dc_base_warehouse as t4 on t4.warehouse_code = t4.warehouse_code
";
if ((categoryModels != null && categoryModels.Count >= 1) || !string.IsNullOrWhiteSpace(search_data.buyer_name) || search_data.product_type > 0)
{
countSql += " left join dc_base_sku as t3 on t1.bailun_sku = t3.bailun_sku ";
}
if (search_data.has_tort != null)
{
countSql += " left join dc_base_tort as t7 on t1.bailun_sku = t7.bailun_sku ";
}
if (search_data.monitor_status != null)
{
countSql += " left join dc_auto_config_sku_warehouse as t5 on t1.bailun_sku = t5.bailun_sku and t1.warehouse_code = t5.warehouse_code ";
}
countSql += "where 1=1 ";
parameters.Add("time", DateTime.Now.ToString("yyyy-MM-dd 00:00:00"));
if (search_data.f_start_date != null)
{
sql += " and t2.`first_inbound_date`>=@f_start_date ";
countSql += " and t2.`first_inbound_date`>=@f_start_date ";
parameters.Add("f_start_date", search_data.f_start_date.Value.ToString("yyyy-MM-dd 00:00:00"));
}
if (search_data.f_end_date != null)
{
sql += " and t2.`first_inbound_date`<=@f_end_date ";
countSql += " and t2.`first_inbound_date`<=@f_end_date ";
parameters.Add("f_end_date", search_data.f_end_date.Value.ToString("yyyy-MM-dd 23:59:59"));
}
if (search_data.start_date != null && search_data.end_date != null)
{
sql += " and t1.bailun_sku_warehouse_code in (select t_re.bailun_sku_warehouse_code from dc_base_stock_record_effective as t_re where t_re.stock_time >=@start_date and t_re.stock_time <=@end_date ) ";
countSql += " and t1.bailun_sku_warehouse_code in (select t_re.bailun_sku_warehouse_code from dc_base_stock_record_effective as t_re where t_re.stock_time >=@start_date and t_re.stock_time <=@end_date ) ";
parameters.Add("start_date", search_data.start_date.Value.ToString("yyyy-MM-dd 00:00:00"));
parameters.Add("end_date", search_data.end_date.Value.ToString("yyyy-MM-dd 23:59:59"));
}
if (categoryModels != null && categoryModels.Count >= 1)
{
sql += " and t3.category_simple_id in ( " + string.Join(",", categoryModels.Select(s => s.id).Distinct()) + ")";
countSql += " and t3.category_simple_id in ( " + string.Join(",", categoryModels.Select(s => s.id).Distinct()) + ")";
}
if (!string.IsNullOrWhiteSpace(search_data.buyer_name))
{
sql += " and t3.buyer_name = @buyer_name ";
countSql += " and t3.buyer_name = @buyer_name ";
parameters.Add("buyer_name", search_data.buyer_name);
}
if (search_data.product_type > 0)
{
sql += " and t3.product_type = @product_type ";
countSql += " and t3.product_type = @product_type ";
parameters.Add("product_type", search_data.product_type);
}
if (search_data.monitor_status == 1)
{
sql += " and t5.`status`=1 ";
countSql += " and t5.`status`=1 ";
}
if (search_data.monitor_status == 0)
{
sql += " and ( t5.`status`=0 or t5.`status` is null ) ";
countSql += " and ( t5.`status`=0 or t5.`status` is null ) ";
}
if (search_data.has_tort != null)
{
if (search_data.has_tort == 0)
{
sql += " and t7.id is null ";
countSql += " and t7.id is null ";
}
else if (search_data.has_tort == 1)
{
sql += " and t7.id is not null ";
countSql += " and t7.id is not null ";
}
}
if (!string.IsNullOrWhiteSpace(search_data.warehousetype))
{
sql += " and t4.hq_type = @hq_type ";
countSql += " and t4.hq_type = @hq_type ";
parameters.Add("hq_type", search_data.warehousetype);
}
if (search_data.warehousearea > 0)
{
sql += " and t4.area_id = @area_id ";
countSql += " and t4.area_id = @area_id ";
parameters.Add("area_id", search_data.warehousearea);
}
if (search_data.searchType > 0 && !string.IsNullOrWhiteSpace(search_data.key_words))
{
switch (search_data.searchType)
{
case 1:
sql += " and t1.bailun_sku in @bailun_skus ";
countSql += " and t1.bailun_sku in @bailun_skus ";
parameters.Add("bailun_skus", search_data.key_words.Split(','));
break;
case 2:
sql += " and t1.bailun_sku like @bailun_sku ";
countSql += " and t1.bailun_sku like @bailun_sku ";
parameters.Add("bailun_sku", $"%{search_data.key_words}%");
break;
case 3:
sql += " and t3.product_inner_code like @product_inner_code ";
countSql += " and t3.product_inner_code like @product_inner_code ";
parameters.Add("product_inner_code", $"%{search_data.key_words}%");
break;
case 4:
sql += " and t3.sku_title_cn like @sku_title_cn ";
countSql += " and t3.sku_title_cn like @sku_title_cn ";
parameters.Add("sku_title_cn", $"%{search_data.key_words}%");
break;
case 5:
sql += " and t3.product_inner_code = @product_inner_code ";
countSql += " and t3.product_inner_code = @product_inner_code ";
parameters.Add("product_inner_code", $"{search_data.key_words}");
break;
}
}
if (!string.IsNullOrWhiteSpace(search_data.warehousecode))
{
sql += " and t1.warehouse_code=@warehouse_code ";
countSql += " and t1.warehouse_code=@warehouse_code ";
parameters.Add("warehouse_code", search_data.warehousecode);
}
if (!string.IsNullOrWhiteSpace(search_data.supplier_name))
{
sql += " and t3.suppliers_name =@suppliers_name ";
parameters.Add("suppliers_name", search_data.supplier_name);
}
if (search_data.isSum)
{
total = 0;
}
else
{
if (search_data.is_warehouse_sum)
{
countSql += " group by t1.warehouse_code ";
sql += " group by t1.warehouse_code ";
total = _connection.Query<int>(countSql, parameters, commandTimeout: 0).Count();
}
else
{
if (search_data.limit > 1000)
{
total = 0;
}
else{
total = _connection.QueryFirst<int>(countSql, parameters, commandTimeout: 0);
}
}
if (!string.IsNullOrEmpty(search_data.sort) && !string.IsNullOrEmpty(search_data.order))
{
sql += " order by " + search_data.sort;
if (!string.IsNullOrEmpty(search_data.order))
{
sql += " " + search_data.order;
}
else
{
sql += " asc";
}
}
sql += " limit " + search_data.offset + "," + search_data.limit;
}
var obj = _connection.Query<dc_base_stock_fba_dto>(sql, parameters, buffered: false, commandTimeout: 0).AsList();
return obj;
}
/// <summary>
/// 缺货推送记录
......
......@@ -384,6 +384,44 @@ namespace AutoTurnOver.Models
}
}
public class dc_base_stock_fba_dto
{
public string bailun_account { get; set; }
public string web_site { get; set; }
public string asin { get; set; }
public string bailun_sku { get; set; }
public string product_type { get; set; }
public string group_name { get; set; }
public string sale_name { get; set; }
public string sku_title_cn { get; set; }
public string warehouse_code { get; set; }
public string warehouse_name { get; set; }
public string area_name { get; set; }
public decimal amount_sales_usd_1 { get; set; }
public decimal bailun_sku_quantity_ordered_1 { get; set; }
public decimal amount_sales_usd_7 { get; set; }
public decimal bailun_sku_quantity_ordered_7 { get; set; }
public decimal amount_sales_usd_30 { get; set; }
public decimal bailun_sku_quantity_ordered_30 { get; set; }
public int monitor_status { get; set; }
public string buyer_name { get; set; }
public decimal unit_price { get; set; }
public decimal weight { get; set; }
public decimal quantity_purchase { get; set; }
public decimal quantity_transfer { get; set; }
public decimal quantity_transfer_order { get; set; }
public decimal quantity_transfer_temp_schedule { get; set; }
public decimal quantity_transfer_temporary_storage { get; set; }
public decimal sum_mid { get; set; }
public decimal usable_stock_01 { get; set; }
public decimal usable_stock_02 { get; set; }
public decimal usable_stock { get; set; }
public decimal sum_mid_amount { get; set; }
public decimal usable_stock_amount { get; set; }
public decimal sum_amount { get; set; }
}
public class dc_base_stock_search_dto
{
[Description("监控状态")]
......
......@@ -49,6 +49,16 @@ namespace AutoTurnOver.Services
return DB.daily.RealtimeList(search_data, categoryModels, ref total);
}
public List<dc_base_stock_fba_dto> RealtimeFbaList(dc_base_stock_search_dto search_data,ref int total)
{
List<bailun_category_new_dto> categoryModels = null;
if (!string.IsNullOrWhiteSpace(search_data.categoryIds))
{
categoryModels = ApiServices.GetNewClientNodesByIds(search_data.categoryIds.Split(',').Select(s => int.Parse(s)).ToList());
}
return DB.daily.RealtimeFbaList(search_data, categoryModels, ref total);
}
public List<dc_auto_shortage_push_route_dto> ShortagePushList(string platform, string bailun_sku, int offset, int limit, ref int total, DateTime? start_date, DateTime? end_date, string warehousecode, string warehousetype, int? warehousearea)
{
return DB.daily.ShortagePushList(platform, bailun_sku, offset, limit,ref total, start_date, end_date, warehousecode, warehousetype, warehousearea);
......@@ -284,6 +294,99 @@ namespace AutoTurnOver.Services
}
public string FbaExport(dc_base_stock_search_dto search_data)
{
try
{
export_count++;
var services = new DailyServices();
var fileName = AppContext.BaseDirectory + $@"Fba实时库存-{DateTime.Now.ToString("yyyyMMddHHmmss")}{Guid.NewGuid()}.csv";
int page = 1;
int rows = 50000;
if (export_count == 1)
{
rows = 250000;
}
while (true)
{
int total = 0;
search_data.offset = (page - 1)* rows;
search_data.limit = rows;
var list = services.RealtimeFbaList(search_data,ref total);
if (list == null || list.Count <= 0) break;
DataTable table = new DataTable();
string[] cols = new string[] { "账号","站点","asin","仓库sku","产品类型","分组名称","销售名称","产品名称"
,"昨日review分数","昨日reivew个数","仓库编码","仓库名称","国家"
,"昨日销量","昨日销售额USD","近7天销量","近7天销售额USD","近30天销量","近30天销售额USD","监控状态","采购员","采购价","重量"
,"实时采购在途","实时调拨在途(总)","实时调拨在途(调拨单)","实时调拨在途(采购临时)","实时调拨在途(暂存)","总在途数","广州01仓可用库存","广州02仓可用库存","FBA 可售库存"
,"在途金额","可配库存金额","在途+可配总库存"
};
foreach (var item in cols)
{
table.Columns.Add(item);
}
foreach (var itemData in list)
{
DataRow row = table.NewRow();
row["账号"] = itemData.bailun_account;
row["站点"] = itemData.web_site;
row["asin"] = itemData.asin;
row["仓库sku"] = itemData.bailun_sku;
row["产品类型"] = itemData.product_type;
row["分组名称"] = itemData.group_name;
row["销售名称"] = itemData.sale_name;
row["产品名称"] = itemData.sku_title_cn;
row["仓库编码"] = itemData.warehouse_code;
row["仓库名称"] = itemData.warehouse_name;
row["国家"] = itemData.area_name;
row["昨日销量"] = itemData.bailun_sku_quantity_ordered_1;
row["昨日销售额USD"] = itemData.amount_sales_usd_1;
row["近7天销量"] = itemData.bailun_sku_quantity_ordered_7;
row["近7天销售额USD"] = itemData.amount_sales_usd_7;
row["近30天销量"] = itemData.bailun_sku_quantity_ordered_30;
row["近30天销售额USD"] = itemData.amount_sales_usd_30;
row["监控状态"] = itemData.monitor_status == 0 ? "监控中" : "停止监控";
row["采购员"] = itemData.buyer_name;
row["采购价"] = itemData.unit_price;
row["重量"] = itemData.weight;
row["实时采购在途"] = itemData.quantity_purchase;
row["实时调拨在途(总)"] = itemData.quantity_transfer;
row["实时调拨在途(调拨单)"] = itemData.quantity_transfer_order;
row["实时调拨在途(采购临时)"] = itemData.quantity_transfer_temp_schedule;
row["实时调拨在途(暂存)"] = itemData.quantity_transfer_temporary_storage;
row["总在途数"] = itemData.sum_mid;
row["广州01仓可用库存"] = itemData.usable_stock_01;
row["广州02仓可用库存"] = itemData.usable_stock_02;
row["FBA 可售库存"] = itemData.usable_stock;
row["在途金额"] = itemData.sum_mid;
row["可配库存金额"] = itemData.sum_mid_amount;
row["在途+可配总库存"] = itemData.sum_amount;
table.Rows.Add(row);
}
CsvFileHelper.SaveCSV(table, fileName, page == 1);
page++;
}
return fileName;
}
catch (Exception)
{
export_count--;
throw;
}
}
public async void GenerateData()
{
try
......
......@@ -47,6 +47,9 @@ namespace AutoTurnOver.Services
case "商品销售情况统计":
item.result_file_url = await DownloadGoods(item.parameter, item);
break;
case "Fba实时库存":
item.result_file_url = await DownloadFbaStock(item.parameter, item);
break;
default: throw new Exception("无法识别的任务");
}
item.end_date = DateTime.Now;
......@@ -110,6 +113,20 @@ namespace AutoTurnOver.Services
return fileData;
}
/// <summary>
/// 下载库存
/// </summary>
public async Task<string> DownloadFbaStock(string par_json, dc_task_download download_data)
{
dc_base_stock_search_dto search_data = par_json.ToObject<dc_base_stock_search_dto>();
Console.WriteLine("DownloadStock - 开始生成文件");
var memory = new DailyServices().FbaExport(search_data);
Console.WriteLine("DownloadStock - 开始生成上传文件");
var fileData = await AutoTurnOver.Utility.QiNiuCloudHelper.UploadSectioningAsync(memory);
Console.WriteLine("DownloadStock - 上传完毕");
return fileData;
}
/// <summary>
/// 下载周转表
/// </summary>
public async Task<string> DownloadAuto(string par_json, dc_task_download download_data)
......
......@@ -35,7 +35,7 @@ namespace AutoTurnOver.Utility
}
else
{
RedisClient.redisClient.SetStringKey(name, cache.ToString(), new TimeSpan(0, minutes, 0, 0));
RedisClient.redisClient.SetStringKey(name, cache.ToString(), new TimeSpan(0, 0, minutes, 0));
}
}
......@@ -49,7 +49,7 @@ namespace AutoTurnOver.Utility
if (minutes <= 0)
RedisClient.redisClient.SetStringKey(name, cache.ToJson(), (DateTime.Parse(DateTime.Now.ToString("yyyy-MM-dd 23:59:59")) - DateTime.Now));
else
RedisClient.redisClient.SetStringKey(name, cache.ToJson(), new TimeSpan(0, minutes, 0, 0));
RedisClient.redisClient.SetStringKey(name, cache.ToJson(), new TimeSpan(0, 0, minutes, 0));
}
else
return default(T);
......
......@@ -125,6 +125,17 @@ namespace AutoTurnOver.Controllers
return new JsonResult(list == null || list.Count <= 0 ? new dc_base_stock_dto() : list[0]);
}
[HttpGet("RealtimeFbaListSumFooter")]
public JsonResult RealtimeFbaListSumFooter([FromQuery]dc_base_stock_search_dto search_data)
{
var services = new DailyServices();
var total = 0;
search_data.isSum = true;
var list = services.RealtimeFbaList(search_data, ref total) ;
return new JsonResult(list == null || list.Count <= 0 ? new dc_base_stock_fba_dto() : list[0]);
}
public class GetSkus_dto
{
......
......@@ -87,6 +87,40 @@ namespace AutoTurnOver.Controllers
});
}
} /// <summary>
/// 实时库存
/// </summary>
/// <param name="sku"></param>
/// <param name="warehousecode"></param>
/// <param name="offset"></param>
/// <param name="limit"></param>
/// <returns></returns>
[UseAction]
[BrowseLog("Bailun_aims", "访问【百伦自动周转系统】->【实时数据】->【FBA实时库存】->【搜索】页面", 0)]
public JsonResult RealtimeFbaList([FromQuery]dc_base_stock_search_dto search_data)
{
try
{
var services = new DailyServices();
var total = 0;
var list = services.RealtimeFbaList(search_data, ref total);
return new JsonResult(new
{
rows = list,
total = total,
});
}
catch (Exception ex)
{
return new JsonResult(new
{
message = ex.Message,
stack_trace = ex.StackTrace
});
}
}
public JsonResult RealtimeListSumFooter([FromQuery]dc_base_stock_search_dto search_data)
......@@ -99,6 +133,16 @@ namespace AutoTurnOver.Controllers
return new JsonResult(list == null || list.Count <= 0 ? new dc_base_stock_dto() : list[0]);
}
public JsonResult RealtimeFbaListSumFooter([FromQuery]dc_base_stock_search_dto search_data)
{
var services = new DailyServices();
var total = 0;
search_data.isSum = true;
var list = services.RealtimeFbaList(search_data, ref total);
return new JsonResult(list == null || list.Count <= 0 ? new dc_base_stock_fba_dto() : list[0]);
}
/// <summary>
......@@ -241,6 +285,35 @@ namespace AutoTurnOver.Controllers
}
/// <summary>
/// 导出Fba实时库存
/// </summary>
/// <param name="sku"></param>
/// <param name="warehousecode"></param>
/// <returns></returns>
public JsonResult ExportFbaRealtime([FromQuery]dc_base_stock_search_dto search_data)
{
try
{
var user = AutoUtility.GetUser();
search_data.limit = int.MaxValue;
dc_task_download_dao.PushData<dc_base_stock_search_dto>(new dc_task_download
{
parameter = search_data.ToJson(),
task_name = "Fba实时库存"
}, user);
return new JsonResult(new { success = true });
}
catch (Exception ex)
{
return new JsonResult(new { success = false,message = ex.Message });
}
//int total = 0;
//var memory = new DailyServices().Export(user, monitor_status, searchType, key_words, warehousecode, supplier_name, offset, limit, ref total, warehousetype, warehousearea, has_tort: has_tort, buyer_name: buyer_name, start_date: start_date, end_date: end_date, f_start_date: f_start_date, f_end_date: f_end_date);
//return File(memory, "text/csv", $"{user.UserAccount}实时库存.csv");
}
/// <summary>
/// 缺货订单
/// </summary>
/// <param name="sku"></param>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment