Commit 70c9abf0 by guanzhenshan

增加仓库进销存报表

parent ce75ce53
......@@ -6,33 +6,105 @@ namespace Bailun.DC.Models
{
public class dc_daily_purchase_sell_stock
{
/// <summary>
///
/// </summary>
public int id { get; set; }
/// <summary>
/// 记录时间
/// </summary>
public DateTime record_time { get; set; }
/// <summary>
/// sku
/// </summary>
public string bailun_sku { get; set; }
/// <summary>
/// 仓库编码
/// </summary>
public string warehouse_code { get; set; }
/// <summary>
/// 仓库名称
/// </summary>
public string warehouse_name { get; set; }
/// <summary>
/// 期初库存数
/// </summary>
public int start_stock_count { get; set; }
/// <summary>
/// 期初库存金额
/// </summary>
public decimal start_stock_amount { get; set; }
/// <summary>
/// 期初在途数量
/// </summary>
public int start_onway_count { get; set; }
/// <summary>
/// 期初在途金额
/// </summary>
public decimal start_onway_amount { get; set; }
/// <summary>
/// 期末库存数量
/// </summary>
public int end_stock_count { get; set; }
/// <summary>
/// 期末库存金额
/// </summary>
public decimal end_stock_amount { get; set; }
/// <summary>
/// 期末在途数
/// </summary>
public int end_onway_count { get; set; }
/// <summary>
/// 期末在途金额
/// </summary>
public decimal end_onway_amount { get; set; }
/// <summary>
/// 创建时间
/// </summary>
public DateTime createtime { get; set; }
/// <summary>
/// 在库差异数量
/// </summary>
public int? diff_stock_count { get; set; }
/// <summary>
/// 在库差异金额
/// </summary>
public decimal? diff_stock_amount { get; set; }
/// <summary>
/// 在途差异数量
/// </summary>
public int? diff_onway_count { get; set; }
/// <summary>
/// 在途差异金额
/// </summary>
public decimal? diff_onway_amount { get; set; }
/// <summary>
/// 总数量
/// </summary>
public int count { get; set; }
/// <summary>
/// 总金额
/// </summary>
public int amount { get; set; }
}
}
......@@ -3118,7 +3118,7 @@ group by currency";
#endregion
#region
#region 跨境电商现金流分析
/// <summary>
/// 每日总收支明细
......@@ -3167,5 +3167,161 @@ group by currency";
}
#endregion
#region 进销存
/// <summary>
/// 仓库进销存
/// </summary>
/// <param name="parameter">分页信息</param>
/// <param name="warehousetype">仓库类型</param>
/// <param name="warehouse">仓库编码</param>
/// <param name="start">期初日期</param>
/// <param name="end">期末日期</param>
/// <param name="total">符合条件的记录数</param>
/// <returns></returns>
public List<dc_daily_purchase_sell_stock> ListWHPurchaseSellStock(BtTableParameter parameter, string warehousetype, string warehouse, DateTime start, DateTime end,ref int total)
{
var sqlparam = new DynamicParameters();
var sqlcount = $@"select count(DISTINCT t1.warehouse_code) from dc_daily_purchase_sell_stock t1 ";
var sql = $@"select t1.warehouse_code,t1.warehouse_name,sum(t2.start_onway_count) start_onway_count,sum(t2.start_stock_count) start_stock_count,sum(t2.start_onway_amount) start_onway_amount,sum(t2.start_stock_amount) start_stock_amount,sum(t3.end_onway_count) end_onway_count,sum(t3.end_stock_count) end_stock_count,sum(t3.end_onway_amount) end_onway_amount,sum(t3.end_stock_amount) end_stock_amount,t4.end_stock_amount as amount,t4.end_stock_count as count from (select DISTINCT t1.bailun_sku,t1.warehouse_code,t1.warehouse_name from dc_daily_purchase_sell_stock t1
";
if (!string.IsNullOrEmpty(warehousetype))
{
sql += " join dc_base_warehouse t2 on t1.warehouse_code=t2.warehouse_code and t2.hq_type='"+warehousetype+"'";
sqlcount += " join dc_base_warehouse t2 on t1.warehouse_code=t2.warehouse_code and t2.hq_type='"+warehousetype+"'";
//sqlparam.Add("hq_type", warehousetype);
if (!string.IsNullOrEmpty(warehouse))
{
sql += " and t2.warehouse_code='"+warehouse+"'";
sqlcount += " and t2.warehouse_code='"+warehouse+"'";
//sqlparam.Add("warehouse", warehouse);
}
}
if (!string.IsNullOrEmpty(warehouse))
{
sql += $@" where t1.record_time='{start.ToString("yyyy-MM-dd")}' or t1.record_time='{end.ToString("yyyy-MM-dd")}') t1
left join dc_daily_purchase_sell_stock t2 on t1.bailun_sku=t2.bailun_sku and t1.warehouse_code=t2.warehouse_code and t2.record_time='{start.ToString("yyyy-MM-dd")}' and t2.warehouse_code='{warehouse}'
left join dc_daily_purchase_sell_stock t3 on t1.bailun_sku=t3.bailun_sku and t1.warehouse_code=t3.warehouse_code and t3.record_time='{end.ToString("yyyy-MM-dd")}' and t3.warehouse_code='{warehouse}'";
}
else
{
sql += $@" where t1.record_time='{start.ToString("yyyy-MM-dd")}' or t1.record_time='{end.ToString("yyyy-MM-dd")}') t1
left join dc_daily_purchase_sell_stock t2 on t1.bailun_sku=t2.bailun_sku and t1.warehouse_code=t2.warehouse_code and t2.record_time='{start.ToString("yyyy-MM-dd")}'
left join dc_daily_purchase_sell_stock t3 on t1.bailun_sku=t3.bailun_sku and t1.warehouse_code=t3.warehouse_code and t3.record_time='{end.ToString("yyyy-MM-dd")}'";
}
sql += $"left join (select t01.bailun_sku,t01.warehouse_code,sum(t01.end_stock_count) end_stock_count,sum(t01.end_stock_amount) end_stock_amount from dc_daily_purchase_sell_stock t01 ";
if (!string.IsNullOrEmpty(warehousetype))
{
sql += " join dc_base_warehouse t02 on t01.warehouse_code=t02.warehouse_code and t02.hq_type='" + warehousetype + "'";
if (!string.IsNullOrEmpty(warehouse))
{
sql += " and t02.warehouse_code='" + warehouse + "'";
}
}
sql += $" where t01.record_time>='{start.ToString("yyyy-MM-dd")}' and t01.record_time<='{end.ToString("yyyy-MM-dd")}' group by t01.bailun_sku,t01.warehouse_code) t4 on t1.bailun_sku=t4.bailun_sku and t4.warehouse_code=t1.warehouse_code";
sql += " group by t1.warehouse_code ";
sqlcount += $" where t1.record_time='{start.ToString("yyyy-MM-dd")}' or t1.record_time='{end.ToString("yyyy-MM-dd")}'";
if (!string.IsNullOrEmpty(parameter.sort))
{
sql += " order by "+parameter.sort+" "+parameter.order;
}
using (var cn = new MySqlConnection(Common.GlobalConfig.ConnectionString))
{
if (cn.State == ConnectionState.Closed)
{
cn.Open();
}
try
{
var obj = cn.Page<dc_daily_purchase_sell_stock>(parameter.pageIndex, parameter.limit, sql, ref total, sqlparam, sqlcount, 2 * 60);
return obj.ToList();
}
catch (Exception ex)
{
throw ex;
}
}
}
/// <summary>
/// 仓库进销存总计
/// </summary>
/// <param name="warehousetype">仓库类型</param>
/// <param name="warehouse">仓库编码</param>
/// <param name="start">期初日期</param>
/// <param name="end">期末日期</param>
/// <returns></returns>
public dc_daily_purchase_sell_stock ListWHPurchaseSellStockCount(string warehousetype, string warehouse, DateTime start, DateTime end)
{
var sqlparam = new DynamicParameters();
var sql = $@"select sum(t2.start_onway_count) start_onway_count,sum(t2.start_stock_count) start_stock_count,sum(t2.start_onway_amount) start_onway_amount,sum(t2.start_stock_amount) start_stock_amount,sum(t3.end_onway_count) end_onway_count,sum(t3.end_stock_count) end_stock_count,sum(t3.end_onway_amount) end_onway_amount,sum(t3.end_stock_amount) end_stock_amount,sum(t4.end_stock_amount) as amount,sum(t4.end_stock_count) as count from (select DISTINCT t1.bailun_sku,t1.warehouse_code,t1.warehouse_name from dc_daily_purchase_sell_stock 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("hq_type", warehousetype);
if (!string.IsNullOrEmpty(warehouse))
{
sql += " and t2.warehouse_code='"+warehouse+"'";
//sqlparam.Add("warehouse", warehouse);
}
}
if (!string.IsNullOrEmpty(warehouse))
{
sql += $@" where t1.record_time='{start.ToString("yyyy-MM-dd")}' or t1.record_time='{end.ToString("yyyy-MM-dd")}') t1
left join dc_daily_purchase_sell_stock t2 on t1.bailun_sku=t2.bailun_sku and t1.warehouse_code=t2.warehouse_code and t2.record_time='{start.ToString("yyyy-MM-dd")}' and t2.warehouse_code='{warehouse}'
left join dc_daily_purchase_sell_stock t3 on t1.bailun_sku=t3.bailun_sku and t1.warehouse_code=t3.warehouse_code and t3.record_time='{end.ToString("yyyy-MM-dd")}' and t2.warehouse_code='{warehouse}'";
}
else
{
sql += $@" where t1.record_time='{start.ToString("yyyy-MM-dd")}' or t1.record_time='{end.ToString("yyyy-MM-dd")}') t1
left join dc_daily_purchase_sell_stock t2 on t1.bailun_sku=t2.bailun_sku and t1.warehouse_code=t2.warehouse_code and t2.record_time='{start.ToString("yyyy-MM-dd")}'
left join dc_daily_purchase_sell_stock t3 on t1.bailun_sku=t3.bailun_sku and t1.warehouse_code=t3.warehouse_code and t3.record_time='{end.ToString("yyyy-MM-dd")}'";
}
sql += $"left join (select t01.bailun_sku,t01.warehouse_code,sum(t01.end_stock_count) end_stock_count,sum(t01.end_stock_amount) end_stock_amount from dc_daily_purchase_sell_stock t01 ";
if (!string.IsNullOrEmpty(warehousetype))
{
sql += " join dc_base_warehouse t02 on t01.warehouse_code=t02.warehouse_code and t02.hq_type='" + warehousetype + "'";
if (!string.IsNullOrEmpty(warehouse))
{
sql += " and t02.warehouse_code='" + warehouse + "'";
}
}
sql += $" where t01.record_time>='{start.ToString("yyyy-MM-dd")}' and t01.record_time<='{end.ToString("yyyy-MM-dd")}' group by t01.bailun_sku,t01.warehouse_code) t4 on t1.bailun_sku=t4.bailun_sku and t4.warehouse_code=t1.warehouse_code";
using (var cn = new MySqlConnection(Common.GlobalConfig.ConnectionString))
{
if (cn.State == ConnectionState.Closed)
{
cn.Open();
}
var obj = cn.QueryFirstOrDefault<dc_daily_purchase_sell_stock>(sql, sqlparam, null, 2 * 60);
return obj;
}
}
#endregion
}
}
......@@ -5187,6 +5187,80 @@ namespace Bailun.DC.Web.Areas.Reports.Controllers
#endregion
#region 进销存报表
/// <summary>
/// 仓库进销存报表
/// </summary>
/// <returns></returns>
public ActionResult WHPurchaseSellStock()
{
return View();
}
/// <summary>
/// 仓库进销存报表
/// </summary>
/// <param name="parameter">分页信息</param>
/// <param name="warehousetype">仓库类型</param>
/// <param name="warehouse">仓库编码</param>
/// <param name="start">期初时间</param>
/// <param name="end">期末时间</param>
/// <returns></returns>
public string WHPurchaseSellStockJson(BtTableParameter parameter, string warehousetype, string warehouse, DateTime start, DateTime end)
{
var total = 0;
var _services = new Services.FinanceReportServices();
var obj = _services.ListWHPurchaseSellStock(parameter, warehousetype, warehouse, start, end, ref total);
var objCount = _services.ListWHPurchaseSellStockCount(warehousetype, warehouse, start, end);
var list = obj.Select(a => new {
a.warehouse_code,
a.warehouse_name,
start_onway_amount = a.start_onway_amount.ToString("N2"),
start_onway_count = a.start_onway_count.ToString("N0"),
start_stock_amount=a.start_stock_amount.ToString("N2"),
start_stock_count = a.start_stock_count.ToString("N0"),
end_onway_amount = a.end_onway_amount.ToString("N2"),
end_onway_count = a.end_onway_count.ToString("N0"),
end_stock_amount = a.end_stock_amount.ToString("N2"),
end_stock_count = a.end_stock_count.ToString("N0"),
diff_onway_amount = (a.end_onway_amount-a.start_onway_amount).ToString("N2"),
diff_onway_count = (a.end_onway_count-a.start_onway_count).ToString("N0"),
diff_stock_amount = (a.end_stock_amount-a.start_stock_amount).ToString("N2"),
diff_stock_count = (a.end_stock_count - a.start_stock_count).ToString("N0"),
count = a.count.ToString("N0"),
amount = a.amount.ToString("N2"),
});
return JsonConvert.SerializeObject(new { total = total, rows = list,
count_row = new {
warehouse_name = "总计",
start_onway_amount = objCount.start_onway_amount.ToString("N2"),
start_onway_count = objCount.start_onway_count.ToString("N0"),
start_stock_amount = objCount.start_stock_amount.ToString("N2"),
start_stock_count = objCount.start_stock_count.ToString("N0"),
end_onway_amount = objCount.end_onway_amount.ToString("N2"),
end_onway_count = objCount.end_onway_count.ToString("N0"),
end_stock_amount = objCount.end_stock_amount.ToString("N2"),
end_stock_count = objCount.end_stock_count.ToString("N0"),
diff_onway_amount = (objCount.diff_onway_amount??0).ToString("N2"),
diff_onway_count = (objCount.diff_onway_count??0).ToString("N0"),
diff_stock_amount = (objCount.diff_stock_amount??0).ToString("N2"),
diff_stock_count = (objCount.diff_stock_count??0).ToString("N0"),
count = objCount.count.ToString("N0"),
amount = objCount.amount.ToString("N2"),
}
});
}
#endregion
}
......

@{
ViewData["Title"] = "仓库进销存";
Layout = "~/Pages/Shared/_MainLayout.cshtml";
ViewBag.Nav = new string[] { "财务报表", "仓库进销存" };
}
<div class="row">
<div class="col-sm-12">
<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>
<select id="warehousetype" name="warehousetype" class="form-control">
<option value="">选择仓库类型</option>
<option value="国内仓">国内仓</option>
<option value="海外仓">海外仓</option>
<option value="FBA仓">FBA仓</option>
<option value="第三方仓库">第三方仓库</option>
<option value="半成品仓">半成品仓</option>
<option value="耗材仓">耗材仓</option>
</select>
</div>
<div class="form-group">
<label>仓库:</label>
<select id="warehouse" name="warehouse" class="form-control">
<option value="">请选择仓库</option>
</select>
</div>
<div class="form-group">
<label>日期</label>
<input id="start" name="start" class="form-control" style="width:100px" value="@(DateTime.Now.AddDays(-7).ToString("yyyy-MM-dd"))" />至
<input id="end" name="end" class="form-control" style="width:100px" value="@(DateTime.Now.AddDays(-1).ToString("yyyy-MM-dd"))" />
</div>
<div class="form-group">
<label>&nbsp;</label>
<button type="button" class="btn btn-primary" onclick="list();"><i class="fa fa-search"></i>&nbsp;查询</button>
</div>
</div>
</form>
</div>
<div class="ibox-content m-b-sm border-bottom">
<table id="roletable" style="table-layout:fixed;"></table>
</div>
</div>
</div>
@section css{
<style>
.mules {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
</style>
}
@section scripts{
<script type="text/javascript">
var tb;
$(document).ready(function () {
var height = document.body.clientHeight;
$("#roletable").attr("data-height", (height - 160));
laydate.render({ elem: '#start' });
laydate.render({ elem: '#end' });
list();
$('#warehousetype').change(function () {
listwarehouse();
})
})
function list() {
var columns = [
{ field: 'warehouse_name', title: '仓库名称', width: '180' },
{ field: 'start_stock_amount', title: '期初-在库金额', width: '130', iscount: true, sortable: true },
{ field: 'start_stock_count', title: '期初-在库数量', width: '130', iscount: true, sortable: true },
{ field: 'start_onway_amount', title: '期初-在途金额', width: '130', iscount: true, sortable: true },
{ field: 'start_onway_count', title: '期初-在途数量', width: '130', iscount: true, sortable: true },
{ field: 'end_stock_amount', title: '期末-在库金额', width: '130', iscount: true, sortable: true },
{ field: 'end_stock_count', title: '期末-在库数量', width: '130', iscount: true, sortable: true },
{ field: 'end_onway_amount', title: '期末-在途金额', width: '130', iscount: true, sortable: true },
{ field: 'end_onway_count', title: '期末-在途数量', width: '130', iscount: true, sortable: true },
{ field: 'diff_stock_amount', title: '差异-在库金额', width: '130', iscount: true },
{ field: 'diff_stock_count', title: '差异-在库数量', width: '130', iscount: true },
{ field: 'diff_onway_amount', title: '差异-在途金额', width: '130', iscount: true },
{ field: 'diff_onway_count', title: '差异-在途数量', width: '130', iscount: true },
{ field: 'amount', title: '总金额', width: '130', iscount: true, sortable: true },
{ field: 'count', title: '总数量', width: '130', iscount: true, sortable: true }
];
var url = '@Url.Content("~/Reports/Finance/WHPurchaseSellStockJson")' + '?' + $("#toolbar").serialize();
if (tb == undefined) {
tb = OnlyTable("roletable", columns, url, "", {
showfooter: true, showCount: true
});
}
else {
tb.bootstrapTable('refresh', { url: url });
}
}
function listwarehouse() {
var type = $('#warehousetype').val();
$.submit({
url: '@Url.Content("~/Home/ListWareHouse")',
paramData: 'warehousetype=' + type,
type:'POST',
func: function (result) {
if (result != null && result != undefined) {
$('#warehouse').html('<option value="">仓库不限</option>');
for (var i = 0; i < result.length; i++) {
$('#warehouse').append('<option value="' + result[i].warehouse_code + '">' + result[i].warehouse_name + '</option>');
}
}
}
})
}
</script>
}
\ 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