Commit 245a942e by lizefeng

新增现金流的sku视图查询

parent 42d21f94
......@@ -2010,8 +2010,8 @@ and start_date<=@end_date and end_date>=@start_date
bailun_sku = m.bailun_sku,
site = m.site_code,
create_user = user.UserName,
bdate = m.date.GetMonthFirstDay(),
edate = m.date.LastDayOfMonth(),
bdate = m.date.GetMonthFirstDay().ToDayHome(),
edate = m.date.LastDayOfMonth().ToDayEnd(),
update_date = DateTime.Now,
update_user = user.UserName,
project = m.project
......
......@@ -37,32 +37,34 @@ namespace AutoTurnOver.DB
})).ToList();
// 查询库存表
var stockDatas =( await _connection.QueryAsync<Models.dc_base_stock>(" select * from dc_base_stock where warehouse_code in @warehouse_codes and bailun_sku=@bailun_sku ", new
var stockDatas = (await _connection.QueryAsync<Models.dc_base_stock>(" select * from dc_base_stock where warehouse_code in @warehouse_codes and bailun_sku=@bailun_sku ", new
{
warehouse_code = warehouse_codes,
warehouse_codes = warehouse_codes,
bailun_sku = skuData.sku
})).ToList();
//查询在途数据
var transitDatas =( await _connection.QueryAsync<Models.dc_mid_transit>(" select * from dc_mid_transit where warehouse_code in @warehouse_codes and bailun_sku=@bailun_sku ", new
var transitDatas = (await _connection.QueryAsync<Models.dc_mid_transit>(" select * from dc_mid_transit where warehouse_code in @warehouse_codes and bailun_sku=@bailun_sku ", new
{
warehouse_code = warehouse_codes,
warehouse_codes = warehouse_codes,
bailun_sku = skuData.sku
})).ToList();
var baseSkuData = _connection.QueryFirstOrDefault<dc_base_sku>(" select * from dc_base_sku where bailun_sku=@bailun_sku ", new { bailun_sku = skuData.sku });
var turnover_days = turnover_datas[0].turnover_days;
var endDate = now.AddDays(turnover_days).LastDayOfMonth().ToDayEnd();
var turnoverDaysEndDate = now.AddDays(turnover_days).LastDayOfMonth().ToDayEnd();
// 查询配置的销量
var salesDayConfigs = _connection.Query<dc_ana_deviation_sales_day_config>(" select * from dc_ana_deviation_sales_day_config where project=@project and bailun_sku=@bailun_sku and site in @sites and `date`>=@bdate and `date`<=@edate ", new
var month12 = DateTime.Parse(now.ToString("yyyy-12-31 23:59:59"));
var salesDayConfigs = _connection.Query<dc_ana_deviation_sales_day_config>(" select * from dc_ana_deviation_sales_day_config where project=@project and bailun_sku=@bailun_sku and site in @sites and `edate`>=@bdate and `bdate`<=@edate ", new
{
bailun_sku = baseSkuData.bailun_sku,
sites = skuDatas.Select(s=>s.site).ToList(),
sites = skuDatas.Select(s => s.site).ToList(),
bdate = now,
edate = endDate,
edate = month12,
project = skuData.project
}).ToList();
var thisDate = now;
List<dc_ana_deviation> datas = new List<dc_ana_deviation>();
while (thisDate <= endDate)
while (thisDate <= month12)
{
var thisBdate = thisDate.ToDayHome();
var thisEdate = thisDate.LastDayOfMonth().ToDayEnd();
......@@ -81,11 +83,11 @@ namespace AutoTurnOver.DB
// 读取实际值 【销售产品数量】、【销售产品产品成本】、【剩余可用库存数量】、【剩余可用库存金额】、【剩余调拨库存数量】、【剩余调拨库存金额】、【采购在途库存金额】、【采购在途库存数量】
SaveDeviation(datas, new dc_ana_deviation { bdate = now, edate = nowEdate, date_str = nowDateStr, field_type = "实际值", field = "剩余可用库存数量", project = skuData.project, sku = skuData.sku, val = stockDatas.Sum(s=>s.usable_stock) });
SaveDeviation(datas, new dc_ana_deviation { bdate = now, edate = nowEdate, date_str = nowDateStr, field_type = "实际值", field = "剩余可用库存数量", project = skuData.project, sku = skuData.sku, val = stockDatas.Sum(s => s.usable_stock) });
SaveDeviation(datas, new dc_ana_deviation { bdate = now, edate = nowEdate, date_str = nowDateStr, field_type = "实际值", field = "剩余可用库存金额", project = skuData.project, sku = skuData.sku, val = stockDatas.Sum(s => s.usable_stock) * baseSkuData.unit_price });
SaveDeviation(datas, new dc_ana_deviation { bdate = now, edate = nowEdate, date_str = nowDateStr, field_type = "实际值", field = "采购在途库存数量", project = skuData.project, sku = skuData.sku, val = transitDatas.Sum(s=>s.quantity_purchase) });
SaveDeviation(datas, new dc_ana_deviation { bdate = now, edate = nowEdate, date_str = nowDateStr, field_type = "实际值", field = "采购在途库存数量", project = skuData.project, sku = skuData.sku, val = transitDatas.Sum(s => s.quantity_purchase) });
SaveDeviation(datas, new dc_ana_deviation { bdate = now, edate = nowEdate, date_str = nowDateStr, field_type = "实际值", field = "采购在途库存金额", project = skuData.project, sku = skuData.sku, val = transitDatas.Sum(s => s.quantity_purchase) * baseSkuData.unit_price });
SaveDeviation(datas, new dc_ana_deviation { bdate = now, edate = nowEdate, date_str = nowDateStr, field_type = "实际值", field = "剩余调拨库存数量", project = skuData.project, sku = skuData.sku, val = transitDatas.Sum(s=>s.quantity_transfer) });
SaveDeviation(datas, new dc_ana_deviation { bdate = now, edate = nowEdate, date_str = nowDateStr, field_type = "实际值", field = "剩余调拨库存数量", project = skuData.project, sku = skuData.sku, val = transitDatas.Sum(s => s.quantity_transfer) });
SaveDeviation(datas, new dc_ana_deviation { bdate = now, edate = nowEdate, date_str = nowDateStr, field_type = "实际值", field = "剩余调拨库存金额", project = skuData.project, sku = skuData.sku, val = transitDatas.Sum(s => s.quantity_transfer) * baseSkuData.unit_price });
// 查询销量
......@@ -93,13 +95,6 @@ namespace AutoTurnOver.DB
SaveDeviation(datas, new dc_ana_deviation { bdate = now, edate = nowEdate, date_str = nowDateStr, field_type = "实际值", field = "销售产品数量", project = skuData.project, sku = skuData.sku, val = omsSale });
SaveDeviation(datas, new dc_ana_deviation { bdate = now, edate = nowEdate, date_str = nowDateStr, field_type = "实际值", field = "销售产品成本", project = skuData.project, sku = skuData.sku, val = omsSale * baseSkuData.unit_price });
// 推测值 【销售产品数量】【销售产品产品成本】【剩余可用库存数量】【剩余可用库存金额】【采购在途库存数量】【采购在途库存金额】
// 推测值涉及实际数据,所以只能推测下个月的数据
//var nextBDay = now.AddMonths(1).GetMonthFirstDay().ToDayHome();
//var nextEDay = nextBDay.LastDayOfMonth().ToDayEnd();
//var nextDateStr = nextBDay.ToString("yyyy-MM");
//SaveDeviation(datas, new dc_ana_deviation { bdate = nextBDay, edate = nextEDay, date_str = nextDateStr, field_type = "推测值", field = "销售产品数量", project = skuData.project, sku = skuData.sku, warehouse_code = warehouse.warehouse_code, val = stockData.usable_stock });
//SaveDeviation(datas, new dc_ana_deviation { bdate = nextBDay, edate = nextEDay, date_str = nextDateStr, field_type = "推测值", field = "销售产品成本", project = skuData.project, sku = skuData.sku, warehouse_code = warehouse.warehouse_code, val = stockData.usable_stock * baseSkuData.unit_price });
var lastMonthB = now.AddMonths(-1).GetMonthFirstDay().ToDayHome();
var lastMonthE = lastMonthB.LastDayOfMonth().ToDayEnd();
......@@ -115,10 +110,9 @@ namespace AutoTurnOver.DB
field = "销售产品数量",
project = skuData.project,
sku = skuData.sku,
val = _connection.QueryFirstOrDefault<decimal?>(" select `val` from dc_ana_deviation where sku=@sku and warehouse_code=@warehouse_code and project=@project and field=@field and date_str=@date_str and field_type=@field_type ", new
val = _connection.QueryFirstOrDefault<decimal?>(" select `val` from dc_ana_deviation where sku=@sku and project=@project and field=@field and date_str=@date_str and field_type=@field_type ", new
{
sku = skuData.sku,
warehouse_code = skuData.warehouse_code,
project = skuData.project,
field = "剩余可用库存数量",
date_str = lastMonthDateStr,
......@@ -138,12 +132,12 @@ namespace AutoTurnOver.DB
});
// 查询今日的预计到货数据
var baseTransExpectarrivaltimeDatas = _connection.Query<dc_base_trans_expectarrivaltime_temp>(" select * from dc_base_trans_expectarrivaltime where bailun_sku=@bailun_sku and warehouse_code=@warehouse_code and expectarrivaltime>=@btime and expectarrivaltime<=@etime ", new
var baseTransExpectarrivaltimeDatas = _connection.Query<dc_base_trans_expectarrivaltime_temp>(" select * from dc_base_trans_expectarrivaltime where bailun_sku=@bailun_sku and warehouse_code in @warehouse_codes and expectarrivaltime>=@btime and expectarrivaltime<=@etime ", new
{
warehouse_code = skuData.warehouse_code,
warehouse_codes = warehouse_codes,
bailun_sku = baseSkuData.bailun_sku,
etime = now,
btime = nowEdate
btime = now,
etime = nowEdate
});
SaveDeviation(datas, new dc_ana_deviation
{
......@@ -167,8 +161,40 @@ namespace AutoTurnOver.DB
sku = skuData.sku,
val = datas.FirstOrDefault(s => s.field == "剩余可用库存数量" && s.field_type == "推测值" && s.date_str == nowDateStr).val * baseSkuData.unit_price
});
SaveDeviation(datas, new dc_ana_deviation { bdate = now, edate = nowEdate, date_str = nowDateStr, field_type = "推测值", field = "采购在途库存数量", project = skuData.project, sku = skuData.sku, val = turnover_datas.Sum(s=>s.quantity_final_advise) });
SaveDeviation(datas, new dc_ana_deviation { bdate = now, edate = nowEdate, date_str = nowDateStr, field_type = "推测值", field = "采购在途库存金额", project = skuData.project, sku = skuData.sku, val = turnover_datas.Sum(s => s.quantity_final_advise) * baseSkuData.unit_price });
// 周转算法 实际可以用库存+周转期预测到货-周转期预测销量
var turnoverDaysTransExpectarrivaltimeDatas = _connection.Query<dc_base_trans_expectarrivaltime_temp>(" select * from dc_base_trans_expectarrivaltime where bailun_sku=@bailun_sku and warehouse_code in @warehouse_codes and expectarrivaltime<=@etime ", new
{
warehouse_codes = warehouse_codes,
bailun_sku = baseSkuData.bailun_sku,
etime = turnoverDaysEndDate
});
SaveDeviation(datas, new dc_ana_deviation
{
bdate = now,
edate = nowEdate,
date_str = nowDateStr,
field_type = "推测值",
field = "采购在途库存数量",
project = skuData.project,
sku = skuData.sku,
val =
datas.FirstOrDefault(s => s.field == "剩余可用库存数量" && s.field_type == "实际值" && s.date_str == nowDateStr).val
+ turnoverDaysTransExpectarrivaltimeDatas.Sum(s => s.count)
- salesDayConfigs.Where(s => s.bdate <= turnoverDaysEndDate).Sum(s => s.sales)
});
SaveDeviation(datas, new dc_ana_deviation
{
bdate = now,
edate = nowEdate,
date_str = nowDateStr,
field_type = "推测值",
field = "采购在途库存金额",
project = skuData.project,
sku = skuData.sku,
val =
datas.FirstOrDefault(s => s.field == "采购在途库存数量" && s.field_type == "推测值" && s.date_str == nowDateStr).val * baseSkuData.unit_price
});
// 偏差分析 【产品成本预计偏差值】、【产品成本预计偏差比例】、【销售数量预计偏差值】、【销售数量预计偏差比例】、【产品成本实际偏差值】、【产品成本实际偏差比例】、【销售数量实际偏差值】、【销售数量实际偏差比例】
......@@ -194,7 +220,7 @@ namespace AutoTurnOver.DB
project = skuData.project,
sku = skuData.sku,
val = datas.FirstOrDefault(s => s.field == "产品成本预计偏差值" && s.field_type == "偏差分析" && s.date_str == nowDateStr).val
.Division( datas.FirstOrDefault(s => s.field == "销售产品成本" && s.field_type == "预测值" && s.date_str == nowDateStr).val)
.Division(datas.FirstOrDefault(s => s.field == "销售产品成本" && s.field_type == "预测值" && s.date_str == nowDateStr).val)
});
SaveDeviation(datas, new dc_ana_deviation
{
......@@ -292,7 +318,7 @@ namespace AutoTurnOver.DB
project = skuData.project,
sku = skuData.sku,
val = datas.FirstOrDefault(s => s.field == "剩余可用库存数量" && s.field_type == "实际值" && s.date_str == nowDateStr).val
- datas.Where(s => s.field == "销售产品数量" && s.field_type == "预测值" && s.bdate <= endDate && s.edate >= now).Sum(s => s.val) // 未来周转期的预测销量
- datas.Where(s => s.field == "销售产品数量" && s.field_type == "预测值" && s.bdate <= turnoverDaysEndDate && s.edate >= now).Sum(s => s.val) // 未来周转期的预测销量
});
SaveDeviation(datas, new dc_ana_deviation
{
......@@ -315,18 +341,101 @@ namespace AutoTurnOver.DB
field = "是否断货",
project = skuData.project,
sku = skuData.sku,
val = stockDatas.Sum(s=>s.usable_stock)
val = stockDatas.Sum(s => s.usable_stock)
});
return 1;
}
/// <summary>
/// 查询sku汇总视图
/// </summary>
/// <param name="search_data"></param>
/// <param name="offset"></param>
/// <param name="limit"></param>
/// <param name="total"></param>
/// <param name="order"></param>
/// <param name="sort"></param>
/// <returns></returns>
/// <exception cref="NotImplementedException"></exception>
public static IEnumerable<deviation_view_dto> GetSkuViews(deviation_search_dto search_data, int offset, int limit, ref int total, string order, string sort)
{
var datas = GetDatas(search_data);
var viewDatas = new List<deviation_view_dto>() { };
var year = DateTime.Now.Year;
foreach (var item in datas.GroupBy(s => new { s.sku, s.project, s.field, s.field_type }))
{
deviation_view_dto itemData = new deviation_view_dto()
{
field = item.Key.field,
field_type = item.Key.field_type,
group_key = item.Key.sku,
project = item.Key.project,
month1 = GetVal(item.AsQueryable(), $"{year}-01"),
month2 = GetVal(item.AsQueryable(), $"{year}-02"),
month3 = GetVal(item.AsQueryable(), $"{year}-03"),
month4 = GetVal(item.AsQueryable(), $"{year}-04"),
month5 = GetVal(item.AsQueryable(), $"{year}-05"),
month6 = GetVal(item.AsQueryable(), $"{year}-06"),
month7 = GetVal(item.AsQueryable(), $"{year}-07"),
month8 = GetVal(item.AsQueryable(), $"{year}-08"),
month9 = GetVal(item.AsQueryable(), $"{year}-09"),
month10 = GetVal(item.AsQueryable(), $"{year}-010"),
month11 = GetVal(item.AsQueryable(), $"{year}-011"),
month12 = GetVal(item.AsQueryable(), $"{year}-012")
};
viewDatas.Add(itemData);
}
total = viewDatas.Count();
var views = viewDatas.Take(limit).Skip(offset);
return views;
}
public static decimal? GetVal(IQueryable<dc_ana_deviation> list, string date_str)
{
var data = list.FirstOrDefault(s => date_str == s.date_str);
if (data == null)
{
return null;
}
else
{
return data.val;
}
}
public static List<dc_ana_deviation> GetDatas(deviation_search_dto search_data)
{
var yearBdate = DateTime.Parse(DateTime.Now.ToString("yyyy-01-01 00:00:00"));
var yearEdate = DateTime.Parse(DateTime.Now.ToString("yyyy-12-31 23:59:59"));
var sql = " select * from dc_ana_deviation where bdate<=@yearEdate and edate>=@yearBdate ";
DynamicParameters parameters = new DynamicParameters();
parameters.Add("yearBdate", yearBdate);
parameters.Add("yearEdate", yearEdate);
if (!string.IsNullOrWhiteSpace(search_data.project))
{
sql += " and t1.project=@project ";
parameters.Add("project", search_data.project);
}
if (!string.IsNullOrWhiteSpace(search_data.sku))
{
sql += " and t1.sku=@sku ";
parameters.Add("sku", search_data.sku);
}
return _connection.Query<dc_ana_deviation>(sql, parameters, commandTimeout: 0).ToList();
}
public async static Task<decimal> GetOmsSale(DateTime btime, DateTime etime, List<dc_ana_deviation_sku> anaSkus)
{
var sql = " select * from dc_base_oms_sku where warehouse_code in @warehouse_codes and bailun_sku=@bailun_sku and bailun_order_status not in ('Canceled') and bailun_interception_status in ('None', 'Failed') and paid_time<=@etime and paid_time>=@btime ";
DynamicParameters parameters = new DynamicParameters();
parameters.Add("warehouse_codes", anaSkus.Select(s=>s.warehouse_code).ToList());
parameters.Add("warehouse_codes", anaSkus.Select(s => s.warehouse_code).ToList());
parameters.Add("bailun_sku", anaSkus[0].sku);
parameters.Add("btime", btime);
parameters.Add("etime", etime);
......@@ -337,9 +446,9 @@ namespace AutoTurnOver.DB
var platforms = anaSkus.Where(s => !string.IsNullOrWhiteSpace(s.platform)).Select(s => s.platform).ToList();
omsDatas = omsDatas.Where(s => platforms.Contains(s.platform_type)).ToList();
}
if (anaSkus.Any(s => s.account>0))
if (anaSkus.Any(s => s.account > 0))
{
var accounts = anaSkus.Where(s =>s.account>0).Select(s => s.account.Value.ToString()).ToList();
var accounts = anaSkus.Where(s => s.account > 0).Select(s => s.account.Value.ToString()).ToList();
omsDatas = omsDatas.Where(s => accounts.Contains(s.bailun_account_id)).ToList();
}
if (anaSkus.Any(s => !string.IsNullOrWhiteSpace(s.site)))
......@@ -355,6 +464,10 @@ namespace AutoTurnOver.DB
public static void SaveDeviation(List<dc_ana_deviation> datas, dc_ana_deviation data)
{
if (data.field_type != "偏差分析")
{
data.val = Math.Max(data.val, 0);
}
data._ts = DateTime.Now;
data.id = _connection.QueryFirstOrDefault<int?>(" select id from dc_ana_deviation where sku=@sku and project=@project and field=@field and date_str=@date_str and field_type=@field_type ", new
{
......@@ -384,7 +497,7 @@ namespace AutoTurnOver.DB
var skuGroups = _connection.Query<dc_ana_deviation_sku>(" select * from dc_ana_deviation_sku ").ToList().GroupBy(s => new { s.sku, s.project });
foreach (var item in skuGroups)
{
RabbitMQHelper.EnqueneMsg("aims:deviation-v2:input", new t_task_queue { id = item.ToJson(), create_time = DateTime.Now });
RabbitMQHelper.EnqueneMsg("aims:deviation-v3:input", new t_task_queue { id = item.ToJson(), create_time = DateTime.Now });
}
}
}
......
using System;
using System.Collections.Generic;
using System.Text;
namespace AutoTurnOver.Models
{
public class deviation_search_dto
{
public string sku { get; set; }
public string project { get; set; }
}
public class deviation_view_dto
{
public string group_key { get; set; }
public string project { get; set; }
public string field { get; set; }
public string field_type { get; set; }
public decimal? month1 { get; set; }
public decimal? month2 { get; set; }
public decimal? month3 { get; set; }
public decimal? month4 { get; set; }
public decimal? month5 { get; set; }
public decimal? month6 { get; set; }
public decimal? month7 { get; set; }
public decimal? month8 { get; set; }
public decimal? month9 { get; set; }
public decimal? month10 { get; set; }
public decimal? month11 { get; set; }
public decimal? month12 { get; set; }
}
}
using AutoTurnOver.DB;
using AutoTurnOver.Models;
using System;
using System.Collections.Generic;
using System.Dynamic;
using System.Text;
namespace AutoTurnOver.Services
{
public class DeviationServices
{
/// <summary>
/// 获取sku视图
/// </summary>
/// <param name="search_data"></param>
/// <param name="offset"></param>
/// <param name="limit"></param>
/// <param name="total"></param>
/// <param name="order"></param>
/// <param name="sort"></param>
/// <returns></returns>
public IEnumerable<deviation_view_dto> GetSkuViews(deviation_search_dto search_data, int offset, int limit, ref int total, string order = "", string sort = "")
{
var datas = dc_ana_deviation_dao.GetSkuViews(search_data, offset, limit, ref total, order, sort);
return datas;
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using AutoTurnOver.Services;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using AutoTurnOver.Utility;
using AutoTurnOver.Models.Report;
using System.Data;
using AutoTurnOver.Common;
using System.IO;
using AutoTurnOver.Models;
using AutoTurnOver.Models.stock;
using AutoTurnOver.DB;
using Dapper;
using AutoTurnOver.Models.auto;
namespace AutoTurnOver.Controllers
{
[Route("api/[controller]/[action]")]
[ApiController]
public class DeviationController : ControllerBase
{
/// <summary>
/// 差异分析 现金流 sku视图
/// </summary>
/// <param name="project"></param>
/// <param name="sku"></param>
/// <param name="offset"></param>
/// <param name="limit"></param>
/// <param name="order"></param>
/// <param name="sort"></param>
/// <returns></returns>
public JsonResult GetSkuViews(string project, string sku, int offset, int limit, string order, string sort)
{
var m = new deviation_search_dto
{
project = project,
sku = sku
};
var services = new DeviationServices();
var total = 0;
var list = services.GetSkuViews(m, offset, limit, ref total, order: order, sort: sort);
return new JsonResult(new
{
rows = list,
total = total,
});
}
}
}
\ No newline at end of file
......@@ -11,7 +11,7 @@ namespace ResetOutofstock
class DeviationRabbitBackgroundService : RabbitWorkerBase<t_task_queue>
{
public DeviationRabbitBackgroundService() : base("差异分析服务", "aims:deviation-v2:input", 1)
public DeviationRabbitBackgroundService() : base("差异分析服务", "aims:deviation-v3:input", 1)
{
}
......@@ -27,7 +27,7 @@ namespace ResetOutofstock
}
catch (Exception e)
{
RabbitMQHelper.EnqueneMsg("aims:deviation-v2:input", taskDto);
RabbitMQHelper.EnqueneMsg("aims:deviation-v3:input", taskDto);
Console.WriteLine($"差异分析服务 数据异常,异常原因为:{e.Message},异常堆栈为:{e.StackTrace}");
}
......
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