Commit 3e2e6442 by guanzhenshan

增加库存分析报表页面

parent e21b10df
......@@ -567,5 +567,41 @@ namespace Bailun.DC.Services
return obj.Where(a=>!string.IsNullOrEmpty(a)).ToList();
}
}
/// <summary>
/// 获取淘汰sku列表
/// </summary>
/// <param name="page">当前页</param>
/// <param name="pagesize">每页记录数</param>
/// <param name="start">更新开始时间</param>
/// <param name="end">更新结束时间</param>
/// <param name="total">符合条件的记录数</param>
/// <returns></returns>
public List<string> ListWeedOut(int page, int pagesize, DateTime? start, DateTime? end,ref int total)
{
using (var cn = new MySqlConnection(Common.GlobalConfig.ConnectionString))
{
if (cn.State == System.Data.ConnectionState.Closed)
{
cn.Open();
}
var sql = "select DISTINCT sku from dc_sku_monitor where is_weedout=1 ";
if (start.HasValue)
{
sql += " and weedout_updatetime>='"+start.Value.ToString("yyyy-MM-dd HH:mm:ss")+"'";
}
if (end.HasValue)
{
sql += " and weedout_updatetime<'"+end.Value.ToString("yyyy-MM-dd HH:mm:ss")+"'";
}
var obj = cn.Page<string>(page, pagesize, sql, ref total);
return obj.AsList();
}
}
}
}
......@@ -441,6 +441,85 @@ namespace Bailun.DC.Services
}
}
/// <summary>
///
/// </summary>
/// <param name="warehousetype"></param>
/// <param name="warehousecode"></param>
/// <returns></returns>
public dc_mid_warehouse_redundancy ListWarehouseRedundancyCount(string warehousetype, string warehousecode)
{
using (var cn = new MySqlConnection(Common.GlobalConfig.ConnectionString))
{
if (cn.State == System.Data.ConnectionState.Closed)
{
cn.Open();
}
var sqlparam = new DynamicParameters();
var sql = @"select sum(skucount) skucount,sum(productcount) productcount,sum(amount_total) amount_total,sum(skusales_count) skusales_count,(sum(skusales_count)/sum(skucount))skusales_rate,sum(daily_productsale_count) daily_productsale_count,(sum(daily_productsale_count)/sum(productcount)) productsale_rate,sum(dailysale_amount) dailysale_amount,(sum(dailysale_amount)/sum(amount_total)) saleamount_rate, sum(redundancy_sku_count) redundancy_sku_count,(sum(redundancy_sku_count)/sum(skucount)) redundancy_sku_rate,sum(redundancy_product_count) redundancy_product_count,(sum(redundancy_product_count)/sum(productcount)) redundancy_product_rate,sum(redundancy_amount) redundancy_amount,(sum(redundancy_amount)/sum(amount_total)) redundancy_amount_rate from dc_mid_warehouse_redundancy t1 ";
if (!string.IsNullOrEmpty(warehousetype))
{
sql += " join dc_base_warehouse t2 on t1.warehouse_code=t2.warehouse_code and t2.hq_type=@warehousetype";
sqlparam.Add("warehousetype", warehousetype);
}
sql += "where t1.day = '" + DateTime.Now.AddDays(-1).ToString("yyyy-MM-dd") + "'";
if (!string.IsNullOrEmpty(warehousecode))
{
sql += " and t1.warehouse_code=@code";
sqlparam.Add("code", warehousecode);
}
var obj = cn.QueryFirstOrDefault<dc_mid_warehouse_redundancy>(sql);
return obj;
}
}
/// <summary>
/// 获取sku冗余前100的数据
/// </summary>
/// <param name="warehousecode"></param>
/// <returns></returns>
public List<List<dc_mid_skuwarehouse_redundancy>> GetSkuRedundancy(string warehousecode)
{
using (var cn = new MySqlConnection(Common.GlobalConfig.ConnectionString))
{
if(cn.State== System.Data.ConnectionState.Closed)
{
cn.Open();
}
//前100冗余金额sku分析
var sql1 = "select * from dc_mid_skuwarehouse_redundancy where warehouse_code='"+warehousecode+ "' and day='"+DateTime.Now.AddDays(-1).ToString("yyyy-MM-dd")+ "' order by redundancy_amount desc limit 100";
//前100冗余个数sku分析
var sql2 = "select * from dc_mid_skuwarehouse_redundancy where warehouse_code='" + warehousecode + "' and day='" + DateTime.Now.AddDays(-1).ToString("yyyy-MM-dd") + "' order by redundancy_product_count desc limit 100";
//前100个数动销最快sku分析
var sql3 = "select * from dc_mid_skuwarehouse_redundancy where warehouse_code='" + warehousecode + "' and day='" + DateTime.Now.AddDays(-1).ToString("yyyy-MM-dd") + "' order by productsale_rate desc limit 100";
//前100金额动销最快sku分析
var sql4 = "select * from dc_mid_skuwarehouse_redundancy where warehouse_code='" + warehousecode + "' and day='" + DateTime.Now.AddDays(-1).ToString("yyyy-MM-dd") + "' order by saleamount_rate desc limit 100";
var obj1 = cn.Query<dc_mid_skuwarehouse_redundancy>(sql1);
var obj2 = cn.Query<dc_mid_skuwarehouse_redundancy>(sql2);
var obj3 = cn.Query<dc_mid_skuwarehouse_redundancy>(sql3);
var obj4 = cn.Query<dc_mid_skuwarehouse_redundancy>(sql4);
var list = new List<List<dc_mid_skuwarehouse_redundancy>>();
list.Add(obj1.AsList());
list.Add(obj2.AsList());
list.Add(obj3.AsList());
list.Add(obj4.AsList());
return list;
}
}
}
}
......@@ -150,18 +150,95 @@ namespace Bailun.DC.Web.Areas.Reports.Controllers
return View();
}
/// <summary>
/// 仓库冗余报告分析数据
/// </summary>
/// <param name="parameter">分页信息</param>
/// <param name="warehousetype">仓库类型</param>
/// <param name="code">仓库编码</param>
/// <returns></returns>
public string WarehouseRedundancyJson(BtTableParameter parameter, string warehousetype, string code)
{
var total = 0;
var services = new Services.WareHouseServices();
var obj = services.ListWarehouseRedundancy(parameter, warehousetype, code, ref total);
var count_obj = services.ListWarehouseRedundancyCount(warehousetype, code);
var list = obj.Select(a => new {
a.warehouse_code,
a.warehouse_name,
amount_total = (a.amount_total??0).ToString("N2"),
dailysale_amount = (a.dailysale_amount??0).ToString("N2"),
daily_productsale_count = (a.daily_productsale_count??0).ToString("N0"),
day = a.day.ToString("yyyy-MM-dd"),
productcount = (a.productcount??0).ToString("N0"),
productsale_rate = ((a.productsale_rate??0)*100).ToString("N4"),
redundancy_amount = (a.redundancy_amount??0).ToString("N2"),
redundancy_amount_rate = ((a.redundancy_amount_rate??0)*100).ToString("N4"),
redundancy_product_count = (a.redundancy_product_count??0).ToString("N0"),
redundancy_product_rate = ((a.redundancy_product_rate??0)*100).ToString("N4"),
redundancy_sku_count = (a.redundancy_sku_count??0).ToString("N0"),
redundancy_sku_rate = ((a.redundancy_sku_rate??0)*100).ToString("N4"),
saleamount_rate = ((a.saleamount_rate??0)*100).ToString("N4"),
skucount = (a.skucount??0).ToString("N0"),
skusales_count = (a.skusales_count??0).ToString("N2"),
skusales_rate = ((a.skusales_rate??0)*100).ToString("N4")
});
return JsonConvert.SerializeObject(new {
total = total,
rows = list,
count_row = new {
warehouse_name = "合计",
amount_total = (count_obj.amount_total ?? 0).ToString("N2"),
dailysale_amount = (count_obj.dailysale_amount ?? 0).ToString("N2"),
daily_productsale_count = (count_obj.daily_productsale_count ?? 0).ToString("N2"),
//day = a.day.ToString("yyyy-MM-dd"),
productcount = (count_obj.productcount ?? 0).ToString("N0"),
productsale_rate = ((count_obj.productsale_rate ?? 0) * 100).ToString("N4"),
redundancy_amount = (count_obj.redundancy_amount ?? 0).ToString("N2"),
redundancy_amount_rate = ((count_obj.redundancy_amount_rate ?? 0) * 100).ToString("N4"),
redundancy_product_count = (count_obj.redundancy_product_count ?? 0).ToString("N0"),
redundancy_product_rate = ((count_obj.redundancy_product_rate ?? 0) * 100).ToString("N4"),
redundancy_sku_count = (count_obj.redundancy_sku_count ?? 0).ToString("N0"),
redundancy_sku_rate = ((count_obj.redundancy_sku_rate ?? 0) * 100).ToString("N4"),
saleamount_rate = ((count_obj.saleamount_rate ?? 0) * 100).ToString("N4"),
skucount = (count_obj.skucount ?? 0).ToString("N0"),
skusales_count = (count_obj.skusales_count ?? 0).ToString("N2"),
skusales_rate = ((count_obj.skusales_rate ?? 0) * 100).ToString("N4")
}
});
}
/// <summary>
/// 仓库sku库存冗余分析
/// </summary>
/// <param name="warehousecode"></param>
/// <returns></returns>
public ActionResult SkuRedundancy(string warehousecode)
{
ViewBag.warehousecode = warehousecode;
return View();
}
/// <summary>
///
/// </summary>
/// <param name="warehousecode"></param>
/// <returns></returns>
[HttpPost]
public JsonResult SkuRedundancyJson(string warehousecode)
{
var services = new Services.WareHouseServices();
var obj = services.GetSkuRedundancy(warehousecode);
return Json(obj);
}
}
}
\ No newline at end of file

@{
ViewData["Title"] = "SkuRedundancy";
Layout = "~/Pages/Shared/_MainLayout.cshtml";
ViewBag.Nav = new string[] { "库存", "库存分析报表",ViewBag.warehousecode+" 库存冗余分析" };
}
<div class="row">
<div class="col-sm-12">
<div class="tabs-container">
<ul class="nav nav-tabs">
<li class="active">
<a data-toggle="tab" href="#tab-1" aria-expanded="true"> 前100冗余金额sku分析</a>
</li>
<li class="">
<a data-toggle="tab" href="#tab-2" aria-expanded="false">前100冗余个数sku分析</a>
</li>
<li class="">
<a data-toggle="tab" href="#tab-3" aria-expanded="false">前100个数动销最快sku分析</a>
</li>
<li class="">
<a data-toggle="tab" href="#tab-4" aria-expanded="false">前100金额动销最快sku分析</a>
</li>
</ul>
<div class="tab-content">
<div id="tab-1" class="tab-pane active">
<div class="panel-body">
<table class="table table-hover table-bordered table-condensed table-striped" style="table-layout:fixed;">
<thead>
<tr>
<th>sku</th>
<th>产品个数</th>
<th>库存总金额</th>
<th>日销产品个数</th>
<th>动销产品比例</th>
<th>日销金额</th>
<th>动销金额比例</th>
<th>冗余产品个数</th>
<th>冗余个数比例</th>
<th>冗余金额</th>
<th>冗余金额比例</th>
</tr>
</thead>
<tbody id="tb1">
</tbody>
</table>
</div>
</div>
<div id="tab-2" class="tab-pane">
<div class="panel-body">
<table class="table table-hover table-bordered table-condensed table-striped" style="table-layout:fixed;">
<thead>
<tr>
<th>sku</th>
<th>产品个数</th>
<th>库存总金额</th>
<th>日销产品个数</th>
<th>动销产品比例</th>
<th>日销金额</th>
<th>动销金额比例</th>
<th>冗余产品个数</th>
<th>冗余个数比例</th>
<th>冗余金额</th>
<th>冗余金额比例</th>
</tr>
</thead>
<tbody id="tb2"></tbody>
</table>
</div>
</div>
<div id="tab-3" class="tab-pane">
<div class="panel-body">
<table class="table table-hover table-bordered table-condensed table-striped" style="table-layout:fixed;">
<thead>
<tr>
<th>sku</th>
<th>产品个数</th>
<th>库存总金额</th>
<th>昨日销量</th>
<th>昨日销售金额</th>
<th>过去3天日均</th>
<th>过去7天日均</th>
<th>过去14天日均</th>
<th>过去30天日均</th>
<th>日周转率</th>
<th>周周转率</th>
<th>月周转率</th>
<th>缺货数</th>
</tr>
</thead>
<tbody id="tb3">
</tbody>
</table>
</div>
</div>
<div id="tab-4" class="tab-pane">
<div class="panel-body">
<table class="table table-hover table-bordered table-condensed table-striped" style="table-layout:fixed;">
<thead>
<tr>
<th>sku</th>
<th>产品个数</th>
<th>库存总金额</th>
<th>昨日销量</th>
<th>昨日销售金额</th>
<th>过去3天日均</th>
<th>过去7天日均</th>
<th>过去14天日均</th>
<th>过去30天日均</th>
<th>日周转率</th>
<th>周周转率</th>
<th>月周转率</th>
<th>缺货数</th>
</tr>
</thead>
<tbody id="tb4">
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</div>
@section css{
}
@section scripts{
<script type="text/javascript">
$(document).ready(function () {
list();
})
var indexload;
function list() {
indexload = layer.load();
$.submit({
type:'POST',
url: '@Url.Content("~/Reports/Warehouse/SkuRedundancyJson")',
paramData: 'warehousecode=@(ViewBag.warehousecode)',
func: function (result) {
layer.close(indexload);
if (result != undefined && result != null && result.length == 4) {
for (var i in result) {
var obj = result[i];
var s = '';
if (i < 2) { //前100冗余金额sku分析,前100冗余个数sku分析模版
var shtml = '';
for (var o in obj) {
/*
<th>产品个数</th>
<th>库存总金额</th>
<th>日销产品个数</th>
<th>动销产品比例</th>
<th>日销金额</th>
<th>动销金额比例</th>
<th>冗余产品个数</th>
<th>冗余个数比例</th>
<th>冗余金额</th>
<th>冗余金额比例</th>
*/
shtml += '<tr><td>' + obj[o].bailun_sku + '</td>';
shtml += '<td>' + obj[o].productcount + '</td>';
shtml += '<td>' + obj[o].amount_total + '</td>';
shtml += '<td>' + obj[o].daily_productsale_count + '</td>';
shtml += '<td>' + obj[o].productsale_rate + '</td>';
shtml += '<td>' + obj[o].dailysale_amount + '</td>';
shtml += '<td>' + obj[o].saleamount_rate + '</td>';
shtml += '<td>' + obj[o].redundancy_product_count + '</td>';
shtml += '<td>' + obj[o].redundancy_product_rate + '</td>';
shtml += '<td>' + obj[o].redundancy_amount + '</td>';
shtml += '<td>' + obj[o].redundancy_amount_rate + '</td>';
shtml += '</tr>';
}
$('#tb' + (i + 1)).append(shtml);
}
else if(i>1 && i<4){ //前100个数动销最快sku分析,前100金额动销最快sku分析
}
}
}
}
})
}
</script>
}
......@@ -7,9 +7,11 @@
<div class="row">
<div class="col-sm-12">
<div class="alert alert-info">
说明:日销为过去7天日均销量
</div>
<div class="ibox-content m-b-sm border-bottom">
<form id="toolbar">
<div class="form-inline" style="line-height:40px;">
<div class="form-group">
<label>仓库类型:</label>
......@@ -25,7 +27,7 @@
</div>
<div class="form-group">
<label>仓库:</label>
<select id="warehousecode" name="warehousecode" class="form-control" style="width:160px;">
<select id="code" name="code" class="form-control" style="width:160px;">
<option value="">选择仓库</option>
</select>
</div>
......@@ -71,7 +73,9 @@
function list() {
var columns = [
{
field: 'warehouse_name', title: '仓库名称', width: '190', sortable: false, iscount: true
field: 'warehouse_name', title: '仓库名称', width: '190', sortable: false, iscount: true, formatter: function (idx, data) {
return '<div onclick="ShowSku(\'' + data.warehouse_code + '\')">' + data.warehouse_name + '</div>';
}
},
{
field: 'skucount', title: 'Sku总个数', width: '120', sortable: true, iscount: true
......@@ -97,14 +101,14 @@
},
{ field: 'saleamount_rate', title: '动销金额比例', width: '130', sortable: true, iscount: true },
{ field: 'redundancy_sku_count', title: '冗余sku个数', width: '130', sortable: true, iscount: true },
{ field: 'redundancy_sku_rate', title: '冗余sku个数比例', width: '100', sortable: true, iscount: true },
{ field: 'redundancy_sku_rate', title: '冗余sku个数比例', width: '150', sortable: true, iscount: true },
{ field: 'redundancy_product_count', title: '冗余产品个数', width: '120', sortable: true, iscount: true },
{ field: 'redundancy_product_rate', title: '冗余产品个数比例', width: '130', sortable: true, iscount: true },
{ field: 'redundancy_product_rate', title: '冗余产品个数比例', width: '150', sortable: true, iscount: true },
{ field: 'redundancy_amount', title: '冗余金额', width: '100', sortable: true, iscount: true },
{ field: 'redundancy_amount_rate', title: '冗余金额比例', width: '130', sortable: true, iscount: true },
];
var url = '@Url.Content("~/Reports/Warehouse/LogicWarehouseJson")' + '?' + $("#toolbar").serialize();
var url = '@Url.Content("~/Reports/Warehouse/WarehouseRedundancyJson")' + '?' + $("#toolbar").serialize();
if (tb == undefined) {
tb = OnlyTable("roletable", columns, url, "", {
......@@ -139,18 +143,19 @@
type:'POST',
func: function (result) {
if (result != null && result != undefined) {
$('#warehousecode').html('<option value="">仓库不限</option>');
$('#code').html('<option value="">仓库不限</option>');
for (var i = 0; i < result.length; i++) {
$('#warehousecode').append('<option value="' + result[i].warehouse_code + '">' + result[i].warehouse_name + '</option>');
$('#code').append('<option value="' + result[i].warehouse_code + '">' + result[i].warehouse_name + '</option>');
}
}
}
})
}
function SkuDetail(code) {
layer_show('Sku仓库', '@Url.Content("~/Reports/Warehouse/ListWareHouseSku?code=")' + code,'90%','90%');
function ShowSku(warehousecode) {
layer_show('sku仓库库存分析', '@Url.Content("~/Reports/Warehouse/SkuRedundancy?warehousecode=")' + warehousecode, '95%', '95%');
}
</script>
......
......@@ -85,5 +85,27 @@ namespace Bailun.DC.Web.Controllers
return result;
}
/// <summary>
/// 获取淘汰sku列表
/// </summary>
/// <param name="page">当前页</param>
/// <param name="pagesize">每页记录数</param>
/// <param name="start">淘汰开始时间</param>
/// <param name="end">淘汰结束时间</param>
/// <returns></returns>
[HttpPost]
public JsonResult ListWeekOutSku(int page, int pagesize, DateTime? start, DateTime? end)
{
var total = 0;
var list = new Services.SkuMonitorServices().ListWeedOut(page, pagesize, start, end,ref total);
return Json(new {
success = true,
data = list,
total = total
});
}
}
}
\ No newline at end of file
......@@ -90,6 +90,9 @@
</li>
</ul>
</li>
<li>
<a class="J_menuItem" href="@Url.Content("~/Reports/Warehouse/WarehouseRedundancy")" data-index="0">仓库库存分析报表</a>
</li>
</ul>
</li>
<li>
......
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