Commit ca69cf84 by lizefeng

记录历史缺货

parent 86d04be6
......@@ -343,6 +343,7 @@ t1.*,t2.warehouse_name,t3.sku_title_cn as 'sku_name',t4.create_time,t3.buyer_nam
(t5.quantity_safe_inventory) as 'quantity_safe_inventory', -- 安全库存
(t5.daily_weighted_sales) as 'daily_weighted_sales', -- 日均加权
(t5.quantity_out_stock) as 'quantity_out_stock', -- 缺货
(t7.quantity_out_stock) as 'realtime_quantity_out_stock', -- 实时缺货
(t5.quantity_transfer) as 'quantity_transfer', -- 调拨在途
(t5.quantity_purchase) as 'quantity_purchase', -- 采购在途
(t5.quantity_inventory) as 'quantity_inventory', -- 库存数
......@@ -355,6 +356,7 @@ left join dc_base_warehouse as t2 on t1.warehouse_code = t2.warehouse_code
left join dc_base_sku as t3 on t1.bailun_sku = t3.bailun_sku
left join dc_auto_purchase_advise as t4 on t1.main_id = t4.id
left join dc_auto_turnover as t5 on t1.warehouse_code = t5.warehouse_code and t1.bailun_sku = t5.bailun_sku
left join dc_mid_transit as t7 on t1.bailun_sku = t7.bailun_sku and t1.warehouse_code = t7.warehouse_code
where 1=1 ";
}
......
......@@ -293,6 +293,132 @@ where 1=1
/// <summary>
/// 缺货改0
/// </summary>
/// <param name="m"></param>
/// <param name="offset"></param>
/// <param name="limit"></param>
/// <param name="total"></param>
/// <returns></returns>
public static List<out_stock_dto> OutStockList(out_stock_search_dto m, int offset, int limit, ref int total, string order = "", string sort = "")
{
var list = new List<out_stock_dto>();
try
{
DynamicParameters parameters = new DynamicParameters();
string sql = "";
string countSql = "";
countSql = @"
select
count(1)
from dc_mid_transit as t1
left join dc_base_sku as t2 on t1.bailun_sku = t2.bailun_sku
left join dc_base_warehouse as t_db on t1.warehouse_code = t_db.warehouse_code
left join china_warehouse_stock as t3 on t1.bailun_sku = t3.bailun_sku and t_db.hq_type='国内仓'
left join china_warehouse_unshipped as t4 on t1.bailun_sku = t4.bailun_sku and t_db.hq_type='国内仓'
where ( t_db.hq_type!='国内仓' or t2.buyer_name not in ('张莹霞','张莹霞1') ) and t_db.hq_type!='fba仓' and (case when t_db.hq_type='国内仓' then (ifnull(t4.sum_unshipped_quantity,0) - ifnull(t3.sum_usable_stock,0)) else t1.quantity_out_stock end )>0
";
sql = @"
select t2.product_code,
t1.warehouse_code,
t_db.warehouse_name,
t1.bailun_sku,
t2.sku_title_cn as 'sku_name',
(case when t_db.hq_type='国内仓' then (ifnull(t4.sum_unshipped_quantity,0) - ifnull(t3.sum_usable_stock,0)) else t1.quantity_out_stock end ) as 'sum_quantity_out_stock',
( case when t7.`status`=0 or t7.`status` is null then '监控中' else '停止监控' end ) as 'monitor_status',
t2.buyer_name,
t8.bailun_require_logistics as 'ebay_bailun_require_logistics',
t8.logistics_method_name as 'ebay_logistics_method_name'
from dc_mid_transit as t1
left join dc_base_sku as t2 on t1.bailun_sku = t2.bailun_sku
left join dc_base_warehouse as t_db on t1.warehouse_code = t_db.warehouse_code
left join china_warehouse_stock as t3 on t1.bailun_sku = t3.bailun_sku and t_db.hq_type='国内仓'
left join china_warehouse_unshipped as t4 on t1.bailun_sku = t4.bailun_sku and t_db.hq_type='国内仓'
left join dc_auto_config_sku_warehouse as t7 on t1.bailun_sku = t7.bailun_sku and t1.warehouse_code = t7.warehouse_code
left join (
select bailun_sku,warehouse_code,GROUP_CONCAT(DISTINCT bailun_require_logistics) as 'bailun_require_logistics',GROUP_CONCAT(DISTINCT logistics_method_name) as 'logistics_method_name' from dc_base_oms_sku_outofstock as t1 where t1. platform_type='ebay' and t1.bailun_picking_status!='TotalPicked' GROUP BY bailun_sku,warehouse_code
) as t8 on t1.bailun_sku = t8.bailun_sku and t1.warehouse_code = t8.warehouse_code
where ( t_db.hq_type!='国内仓' or t2.buyer_name not in ('张莹霞','张莹霞1') ) and t_db.hq_type!='fba仓' and (case when t_db.hq_type='国内仓' then (ifnull(t4.sum_unshipped_quantity,0) - ifnull(t3.sum_usable_stock,0)) else t1.quantity_out_stock end )>0
";
if (!string.IsNullOrWhiteSpace(m.key_words) && m.search_type > 0)
{
switch (m.search_type.Value)
{
case 1:
sql += " and t1.bailun_sku =@bailun_sku ";
countSql += " and t1.bailun_sku =@bailun_sku ";
parameters.Add("bailun_sku", m.key_words);
break;
case 2:
sql += " and t2.product_code =@product_inner_code ";
countSql += " t2.product_code =@product_inner_code ";
parameters.Add("product_code", m.key_words);
break;
default: break;
}
}
if (!string.IsNullOrWhiteSpace(m.warehousetype))
{
sql += " and t_db.hq_type=" + $"'{m.warehousetype}'";
countSql += " and t_db.hq_type=" + $"'{m.warehousetype}'";
}
if (m.warehousearea > 0)
{
sql += " and t_db.area_id=" + m.warehousearea;
countSql += " and t_db.area_id=" + m.warehousearea;
}
if (m.warehouse_code != null)
{
sql += $" and t1.warehouse_code=@warehouse_code ";
countSql += $" and t1.warehouse_code=@warehouse_code ";
parameters.Add("warehouse_code", m.warehouse_code);
}
if (!string.IsNullOrWhiteSpace(m.purchase_user))
{
sql += " and t2.buyer_name =@buyer_name ";
countSql += " and t2.buyer_name =@buyer_name ";
parameters.Add("buyer_name", m.purchase_user);
}
if (limit > 10000 || m.isSum)
{
total = 0;
}
else
{
total = _connection.ExecuteScalar<int>(countSql, parameters, commandTimeout: 0);
//设置默认排序字段
if (!string.IsNullOrEmpty(sort) && !string.IsNullOrEmpty(order))
{
sql += " order by " + sort;
if (!string.IsNullOrEmpty(order))
{
sql += " " + order;
}
else
{
sql += " asc";
}
}
sql += " limit " + offset + "," + limit;
}
var obj = _connection.Query<out_stock_dto>(sql, parameters, buffered: false, commandTimeout: 0);
return obj.AsList();
}
catch (Exception ex)
{
return list;
}
}
/// <summary>
/// 刷新缺货数据
/// </summary>
public static void ResetOutofstock()
......@@ -410,6 +536,18 @@ alter table dc_not_stock_goods_sales rename dc_not_stock_goods_salesTemp;
alter table dc_not_stock_goods_sales_temp rename dc_not_stock_goods_sales;
alter table dc_not_stock_goods_salesTemp rename dc_not_stock_goods_sales_temp;
truncate table dc_not_stock_goods_sales_temp; ", commandTimeout: 0);
_connection.Execute(@" -- 记录历史缺货
insert ignore into dc_outofstock_history(`bailun_sku`,`warehouse_code`) (
select
t1.bailun_sku,t1.warehouse_code
from dc_mid_transit as t1
left join dc_base_sku as t2 on t1.bailun_sku = t2.bailun_sku
left join dc_base_warehouse as t_db on t1.warehouse_code = t_db.warehouse_code
left join china_warehouse_stock as t3 on t1.bailun_sku = t3.bailun_sku and t_db.hq_type='国内仓'
left join china_warehouse_unshipped as t4 on t1.bailun_sku = t4.bailun_sku and t_db.hq_type='国内仓'
where ( t_db.hq_type!='国内仓' or t2.buyer_name not in ('张莹霞','张莹霞1') ) and t_db.hq_type!='fba仓' and (case when t_db.hq_type='国内仓' then (ifnull(t4.sum_unshipped_quantity,0) - ifnull(t3.sum_usable_stock,0)) else t1.quantity_out_stock end )>0
)");
}
catch (Exception ex)
{
......@@ -427,5 +565,7 @@ truncate table dc_not_stock_goods_sales_temp; ", commandTimeout: 0);
{
_connection.Insert(data);
}
}
}
......
......@@ -186,6 +186,8 @@ namespace AutoTurnOver.Models
public decimal quantity_out_stock { get; set; }
public decimal realtime_quantity_out_stock { get; set; }
public decimal quantity_transfer { get; set; }
public decimal quantity_purchase { get; set; }
......
using System;
using System.Collections.Generic;
using System.Text;
namespace AutoTurnOver.Models
{
public class out_stock_dto
{
public string product_code { get; set; }
public string warehouse_code { get; set; }
public string warehouse_name { get; set; }
public string bailun_sku { get; set; }
public string sku_name { get; set; }
public decimal? sum_quantity_out_stock { get; set; }
public string monitor_status { get; set; }
public string buyer_name { get; set; }
public string ebay_bailun_require_logistics { get; set; }
public string ebay_logistics_method_name { get; set; }
}
public class out_stock_search_dto
{
public int? search_type { get; set; }
public string warehousetype { get; set; }
public int? warehousearea { get; set; }
public string warehouse_code { get; set; }
public string key_words { get; set; }
public string purchase_user { get; set; }
public bool isSum { get; set; }
}
}
......@@ -320,5 +320,11 @@ namespace AutoTurnOver.Services
{
return report.QuantityOutStockDetailList(m, offset, limit, ref total, order, sort);
}
public List<out_stock_dto> OutStockList(out_stock_search_dto m, int offset, int limit, ref int total, string order = "", string sort = "")
{
return report.OutStockList(m, offset, limit, ref total, order, sort);
}
}
}
......@@ -173,7 +173,7 @@ namespace AutoTurnOver.Controllers
DataTable table = new DataTable();
string[] cols = new string[] { "初始建议数", "系统建议数", "采购数量", "是否已推送", "时间", "sku", "产品名称", "产品14日日均", "仓库编码","仓库名称",
"内部商品编码", "商品建议采购", "商品14日日均", "商品moq", "日均加权销量", "缺货", "调拨在途", "采购在途", "库存数",
"内部商品编码", "商品建议采购", "商品14日日均", "商品moq", "日均加权销量", "缺货","实时缺货", "调拨在途", "采购在途", "库存数",
"采购金额", "供应链长度", "供应商名称", "采购类型","采购员","突增关注"
};
foreach (var item in cols)
......@@ -201,6 +201,7 @@ namespace AutoTurnOver.Controllers
row["商品moq"] = itemData.goods_moq;
row["日均加权销量"] = itemData.daily_weighted_sales;
row["缺货"] = itemData.quantity_out_stock;
row["实时缺货"] = itemData.realtime_quantity_out_stock;
row["调拨在途"] = itemData.quantity_transfer;
row["采购在途"] = itemData.quantity_purchase;
row["库存数"] = itemData.quantity_inventory;
......
......@@ -10,6 +10,7 @@ using AutoTurnOver.Models.Report;
using System.Data;
using AutoTurnOver.Common;
using System.IO;
using AutoTurnOver.Models;
namespace AutoTurnOver.Controllers
{
......@@ -271,31 +272,64 @@ namespace AutoTurnOver.Controllers
}
/// <summary>
/// 导出实时缺货
/// 缺货改0
/// </summary>
/// <param name="bailun_sku"></param>
/// <param name="warehousecode"></param>
/// <param name="product_inner_code"></param>
/// <param name="purchase_user"></param>
/// <param name="offset"></param>
/// <param name="limit"></param>
/// <param name="order"></param>
/// <param name="sort"></param>
/// <param name="warehousetype"></param>
/// <param name="warehousearea"></param>
/// <returns></returns>
public JsonResult OutStockList(int? search_type, string warehousecode, string key_words, string purchase_user, int offset, int limit, string order, string sort, string warehousetype, int? warehousearea)
{
var m = new out_stock_search_dto
{
search_type = search_type,
key_words = key_words,
purchase_user = purchase_user,
warehousearea = warehousearea,
warehousetype = warehousetype,
warehouse_code = warehousecode
};
var services = new ReportServices();
var total = 0;
var list = services.OutStockList(m, offset, limit, ref total, order: order, sort: sort);
return new JsonResult(new
{
rows = list,
total = total,
});
}
/// <summary>
/// 导出缺货改0数据
/// </summary>
/// <param name="sku"></param>
/// <param name="warehousecode"></param>
/// <returns></returns>
public FileResult QuantityOutStockDetailExport(int? bailun_account_id, int? search_type, string warehousecode, string key_words, string purchase_user, int offset, int limit, string order, string sort, string warehousetype, int? warehousearea)
public FileResult OutStockExport(int? search_type, string warehousecode, string key_words, string purchase_user, int offset, int limit, string order, string sort, string warehousetype, int? warehousearea)
{
var m = new quantity_out_stock_detail_search_dto
var m = new out_stock_search_dto
{
search_type = search_type,
key_words = key_words,
purchase_user = purchase_user,
warehousearea = warehousearea,
warehousetype = warehousetype,
warehouse_code = warehousecode,
bailun_account_id = bailun_account_id
warehouse_code = warehousecode
};
var services = new ReportServices();
var total = 0;
var list = services.QuantityOutStockDetailList(m, 0, int.MaxValue, ref total, order: order, sort: sort);
var list = services.OutStockList(m, 0, int.MaxValue, ref total, order: order, sort: sort);
// Detail
DataTable table = new DataTable();
string[] cols = new string[] { "缺货统计时间", "平台订单号", "平台类型", "百伦订单号", "付款交易号", "站点", "付款时间", "销售账号","国家","sku",
"产品名称", "订单sku销量", "发货仓库编码","发货仓库", "是否缺货", "仓库总缺货", "国内仓总缺货", "其他有库存仓库", "其他仓库库存数","国内仓是否缺货","采购员",
"平台物流方式", "发货物流方式", "sku监控状态", "销售状态", "总在途库存数", "最先到货采购单","最快到货时间","采购单供应商","采购单阿里巴巴单号","采购单物流单号"
string[] cols = new string[] { "商品编码", "仓库编码", "仓库名称", "sku", "产品名称", "缺货总数量", "sku监控状态", "采购员","平台物流方式","发货物流方式"
};
foreach (var item in cols)
{
......@@ -306,42 +340,21 @@ namespace AutoTurnOver.Controllers
{
DataRow row = table.NewRow();
row["缺货统计时间"] = itemData.gmt_out_stock_modified;
row["平台订单号"] = itemData.origin_order_id;
row["平台类型"] = itemData.platform_type;
row["百伦订单号"] = itemData.bailun_order_id;
row["付款交易号"] = itemData.transaction_id;
row["站点"] = itemData.website;
row["付款时间"] = itemData.pay_time;
row["销售账号"] = itemData.seller_account;
row["国家"] = itemData.receipt_country;
row["商品编码"] = itemData.product_code;
row["仓库编码"] = itemData.warehouse_code;
row["仓库名称"] = itemData.warehouse_name;
row["sku"] = itemData.bailun_sku;
row["产品名称"] = itemData.sku_name;
row["订单sku销量"] = itemData.bailun_sku_quantity_ordered;
row["发货仓库编码"] = itemData.warehouse_code;
row["发货仓库"] = itemData.warehouse_name;
row["是否缺货"] = itemData.is_out_stock;
row["仓库总缺货"] = itemData.quantity_out_stock;
row["国内仓总缺货"] = itemData.sum_quantity_out_stock;
row["其他有库存仓库"] = itemData.other_codes;
row["其他仓库库存数"] = itemData.other_stock;
row["国内仓是否缺货"] = itemData.is_sum_quantity_out_stock;
row["缺货总数量"] = itemData.sum_quantity_out_stock;
row["采购员"] = itemData.buyer_name;
row["平台物流方式"] = itemData.bailun_require_logistics;
row["发货物流方式"] = itemData.logistics_method_name;
row["sku监控状态"] = itemData.monitor_status;
row["销售状态"] = itemData.sku_status;
row["总在途库存数"] = itemData.quantity_ontheway;
row["最先到货采购单"] = itemData.min_buy.no;
row["最快到货时间"] = itemData.min_buy.arrival_date;
row["采购单供应商"] = itemData.min_buy.supplier_name;
row["采购单阿里巴巴单号"] = itemData.min_buy.alibaba_order_id;
row["采购单物流单号"] = itemData.min_buy.logistics_order_id;
row["平台物流方式"] = itemData.ebay_bailun_require_logistics;
row["发货物流方式"] = itemData.ebay_logistics_method_name;
table.Rows.Add(row);
}
var fileName = AppContext.BaseDirectory + @"Result\RealtimeStock\实时缺货明细数据.csv";
var fileName = AppContext.BaseDirectory + @"Result\RealtimeStock\缺货改0数据.csv";
DataTableHelper.SaveCSV(table, fileName);
......@@ -351,7 +364,7 @@ namespace AutoTurnOver.Controllers
stream.CopyTo(memory);
}
memory.Position = 0;
return File(memory, "text/csv", "实时缺货明细数据.csv");
return File(memory, "text/csv", "缺货改0数据.csv");
}
}
}
\ No newline at end of file
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