Commit 0f029daa by guanzhenshan

增加亚马逊非FBA销售统计报表

parent b8dac237
using System;
using System.Collections.Generic;
using System.Text;
namespace Bailun.DC.Models.Orders
{
/// <summary>
/// 亚马逊销售统计Model
/// </summary>
public class mAmazonStatistics
{
/// <summary>
/// 平台
/// </summary>
public string platform_type { get; set; }
/// <summary>
/// 销售帐号
/// </summary>
public string seller_account { get; set; }
/// <summary>
/// 站点
/// </summary>
public string website { get; set; }
/// <summary>
/// 商品收入
/// </summary>
public decimal amount_product { get; set; }
/// <summary>
/// 产品成本
/// </summary>
public decimal cost_product { get; set; }
/// <summary>
/// 亚马逊fba费
/// </summary>
public decimal fba_fee { get; set; }
/// <summary>
/// 平台佣金
/// </summary>
public decimal platform_fee { get; set; }
/// <summary>
/// 头程费
/// </summary>
public decimal head_fee { get; set; }
/// <summary>
/// 销售数量
/// </summary>
public int order_count { get; set; }
/// <summary>
/// fba销售数量
/// </summary>
public int fba_salecount { get; set; }
/// <summary>
/// 非fba销售数量
/// </summary>
public int nofba_salecount { get; set; }
/// <summary>
/// 提现损耗
/// </summary>
public decimal loss_withdrawal { get; set; }
/// <summary>
/// 总支出
/// </summary>
public decimal cost_count { get; set; }
/// <summary>
/// 非fba预测物流费用
/// </summary>
public decimal nofba_forecast_logisticsfee { get; set; }
/// <summary>
/// 非fba实际物流费
/// </summary>
public decimal nofba_logisticsfee { get; set; }
/// <summary>
/// fba利润
/// </summary>
public decimal fba_profit { get; set; }
/// <summary>
/// 非FBA预测利润
/// </summary>
public decimal nofba_forecast_profit { get; set; }
/// <summary>
/// 非FBA实际利润
/// </summary>
public decimal nofba_profit { get; set; }
/// <summary>
/// 总预测利润
/// </summary>
public decimal forecast_profit_count { get; set; }
/// <summary>
/// 总预测利润率%
/// </summary>
public decimal forecast_profit_rate { get; set; }
/// <summary>
/// 总实际利润
/// </summary>
public decimal profit_count { get; set; }
/// <summary>
/// 总实际利润率
/// </summary>
public decimal profit_rate { get; set; }
/// <summary>
/// 币种
/// </summary>
public string currency { get; set; }
}
}
......@@ -2,6 +2,9 @@
using System.Collections.Generic;
using System.Text;
using Bailun.DC.Common;
using Bailun.DC.Models;
using Dapper;
using MySql.Data.MySqlClient;
namespace Bailun.DC.Services
{
......@@ -37,6 +40,87 @@ namespace Bailun.DC.Services
return 1;
}
/// <summary>
/// 获取平台列表
/// </summary>
/// <returns></returns>
public static List<string> ListPlatForm()
{
using (var cn = new MySqlConnection(Common.GlobalConfig.ConnectionString))
{
if (cn.State == System.Data.ConnectionState.Closed)
{
cn.Open();
}
var sql = "select platform_type from dc_base_oms_order";
sql += " group by platform_type order by platform_type";
return cn.Query<string>(sql).AsList();
}
}
/// <summary>
/// 获取销售帐号列表
/// </summary>
/// <param name="platform">平台编码</param>
/// <returns></returns>
public static List<string> ListAccount(string platform)
{
using (var cn = new MySqlConnection(Common.GlobalConfig.ConnectionString))
{
if (cn.State == System.Data.ConnectionState.Closed)
{
cn.Open();
}
var sqlparam = new DynamicParameters();
var sql = "select seller_account from dc_base_oms_order";
if (!string.IsNullOrWhiteSpace(platform))
{
sql += " where platform_type=@platform_type";
sqlparam.Add("platform_type", platform);
}
sql += " group by seller_account order by seller_account";
return cn.Query<string>(sql, sqlparam).AsList();
}
}
/// <summary>
/// 获取平台站点列表
/// </summary>
/// <param name="platform">平台编码</param>
/// <returns></returns>
public static List<string> ListWebSite(string platform)
{
using (var cn = new MySqlConnection(Common.GlobalConfig.ConnectionString))
{
if (cn.State == System.Data.ConnectionState.Closed)
{
cn.Open();
}
var sqlparam = new DynamicParameters();
var sql = "select website from dc_base_oms_order";
if (!string.IsNullOrWhiteSpace(platform))
{
sql += " where platform_type=@platform_type";
sqlparam.Add("platform_type", platform);
}
sql += " group by website order by website";
return cn.Query<string>(sql, sqlparam).AsList();
}
}
}
#region 汇率实体 ExchangeRate
......
using System;
using System.Collections.Generic;
using System.Text;
using Bailun.DC.Models;
using Bailun.DC.DB;
using Dapper;
using MySql.Data.MySqlClient;
namespace Bailun.DC.Services
{
public class OrdersServices
{
/// <summary>
/// 获取亚马逊的销售统计数据(非FBA)
/// </summary>
/// <param name="parameter">分页信息</param>
/// <param name="account">销售帐号</param>
/// <param name="website">站点</param>
/// <param name="start">付款开始时间</param>
/// <param name="end">付款结束时间</param>
/// <param name="total">符合条件的记录数</param>
/// <returns></returns>
public List<Models.Orders.mAmazonStatistics> ListAmazonStatistics(BtTableParameter parameter, string account, string website, DateTime start, DateTime end,ref int total)
{
var sqlparam = new DynamicParameters();
var sql = @"select platform_type,seller_account,website,sum(amount_product*seller_order_exchange_rate) 'amount_product',sum(cost_product) 'cost_product',sum(cost_platform_fee*seller_order_exchange_rate) 'platform_fee',sum(cost_first) 'head_fee',count(id) 'order_count',sum(cost_total+cost_first) 'cost_count',sum(cost_shipping) 'nofba_logisticsfee',(sum(amount_product*seller_order_exchange_rate)-sum(cost_shipping)-sum(cost_total+cost_first)) 'profit_count',(sum(amount_product*seller_order_exchange_rate)-sum(cost_estimate_logistics)-sum(cost_total+cost_first)) forecast_profit_count,(sum(amount_product*seller_order_exchange_rate)-sum(cost_shipping)-sum(cost_total+cost_first))/sum(amount_product*seller_order_exchange_rate) 'profit_rate',sum(cost_estimate_logistics) as nofba_forecast_logisticsfee,(sum(amount_product*seller_order_exchange_rate)-sum(cost_estimate_logistics)-sum(cost_total+cost_first))/sum(amount_product*seller_order_exchange_rate) forecast_profit_rate, order_currency 'currency' from dc_base_oms_order where paid_time>='" + start.ToString("yyyy-MM-dd")+"' and paid_time<'"+end.ToString("yyyy-MM-dd")+"' and platform_type='Amazon' and bailun_order_status!='Canceled' ";
if (!string.IsNullOrWhiteSpace(account))
{
sql += " and seller_account=@seller_account";
sqlparam.Add("seller_account", account);
}
if (!string.IsNullOrWhiteSpace(website))
{
sql += " and website=@website";
sqlparam.Add("website", website);
}
sql += " group by seller_account,website,order_currency,platform_type";
if (!string.IsNullOrWhiteSpace(parameter.sort))
{
sql += "order by @sort";
sqlparam.Add("sort", parameter.sort);
if (!string.IsNullOrWhiteSpace(parameter.order))
{
sql += " @order";
sqlparam.Add("order", parameter.order);
}
}
using (var cn = new MySqlConnection(Common.GlobalConfig.ConnectionString))
{
if (cn.State == System.Data.ConnectionState.Closed)
{
cn.Open();
}
var obj = cn.Page<Models.Orders.mAmazonStatistics>(parameter.pageIndex, parameter.limit, sql, ref total, sqlparam);
return obj.AsList();
}
}
}
}
......@@ -3,6 +3,8 @@ using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Bailun.DC.Models;
using Newtonsoft.Json;
namespace Bailun.DC.Web.Areas.Reports.Controllers
{
......@@ -13,5 +15,82 @@ namespace Bailun.DC.Web.Areas.Reports.Controllers
{
return View();
}
/// <summary>
/// 亚马逊销售统计
/// </summary>
/// <returns></returns>
public ActionResult AmazonSaleStatistics()
{
return View();
}
/// <summary>
/// 非FBA销售统计
/// </summary>
/// <param name="parameter">分页信息</param>
/// <param name="sellaccount">销售帐号</param>
/// <param name="website">站点</param>
/// <param name="start">付款开始时间</param>
/// <param name="end">付款结束时间</param>
/// <returns></returns>
public string ListAmazonSaleStatisticsJson(BtTableParameter parameter, string sellaccount, string website, DateTime start, DateTime end)
{
var total = 0;
var list = new Services.OrdersServices().ListAmazonStatistics(parameter, sellaccount, website, start, end, ref total);
var obj = list.Select(p => new
{
p.platform_type,
p.seller_account,
p.website,
amount_product = p.amount_product.ToString("###,###.##"),
cost_product = p.cost_product.ToString("###,###.##"),
platform_fee = p.platform_fee.ToString("###,###.##"),
head_fee = p.head_fee.ToString("###,###.##"),
p.order_count,
loss_withdrawal = p.loss_withdrawal,
cost_count = p.cost_count.ToString("###,###.##"),
forecast_profit_count = p.forecast_profit_count.ToString("###,###.##"),
nofba_logisticsfee = p.nofba_logisticsfee.ToString("###,###.##"),
nofba_forecast_logisticsfee = p.nofba_forecast_logisticsfee.ToString("###,###.##"),
forecast_profit_rate = (100*p.forecast_profit_rate).ToString("###,###.##"),
profit_count = p.profit_count.ToString("###,###.##"),
profit_rate = (100*p.profit_rate).ToString("###,###.##"),
p.currency
});
return JsonConvert.SerializeObject(new { total = total, rows = obj });
}
#region Common
/// <summary>
/// 获取帐号列表
/// </summary>
/// <param name="platform">平台编码</param>
/// <returns></returns>
[HttpPost]
public JsonResult ListAccount(string platform)
{
var result = Services.CommonServices.ListAccount(platform);
return Json(result);
}
/// <summary>
/// 获取站点列表
/// </summary>
/// <param name="platform">平台编码</param>
/// <returns></returns>
[HttpPost]
public JsonResult ListWebSite(string platform)
{
var result = Services.CommonServices.ListWebSite(platform);
return Json(result);
}
#endregion
}
}
\ No newline at end of file

@{
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="stype" name="stype" class="form-control">
<option value="1">按平台账号</option>
<option value="2">按销售员</option>
</select>
</div>*@
<div class="form-group">
<label>销售帐号:</label>
<select id="saleaccount" name="saleaccount" class="form-control" style="width:160px;">
<option value="">选择帐号</option>
</select>
</div>
<div class="form-group">
<label>站点:</label>
<select id="website" name="website" class="form-control">
<option value="">选择站点</option>
</select>
</div>
<div class="form-group">
<label>付款时间</label>
<input id="start" name="start" type="text" class="form-control" style="width:130px;" value="@(DateTime.Now.AddDays(-7).ToString("yyyy-MM-dd"))" />
<span>至</span>
<input id="end" name="end" type="text" class="form-control" style="width:130px;" value="@(DateTime.Now.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 () {
laydate.render({ elem: '#start' });
laydate.render({ elem: '#end' });
var height = document.body.clientHeight;
$("#roletable").attr("data-height", (height - 160));
list();
listAccount();
listWebsite();
})
function list() {
var columns = [
{ field: 'platform_type', title: '平台',width:'100',sortable:true },
{
field: 'seller_account', title: '销售帐号', width: '130', sortable: true, formatter: function (idx, data) {
var str = '<p class="mules" title="' + data.seller_account + '">' + data.seller_account + '</p>';
return str;
}
},
{ field: 'website', title: '站点', width: '80', sortable: true },
{ field: 'amount_product', title: '商品收入', width: '100', sortable: true },
{ field: 'cost_product', title: '产品成本', width: '100', sortable: true },
{ field: 'platform_fee', title: '平台佣金费', width: '110', sortable: true },
{ field: 'head_fee', title: '头程费', width: '100', sortable: true },
{ field: 'order_count', title: '销售数量', width: '100', sortable: true },
{ field: 'loss_withdrawal', title: '提现损耗', width: '100', sortable: true },
{ field: 'cost_count', title: '总支出', width: '110', sortable: true },
{ field: 'nofba_forecast_logisticsfee', title: '预测物流费', width: '110', sortable: true },
{ field: 'nofba_logisticsfee', title: '实际物流费', width: '110', sortable: true },
{ field: 'forecast_profit_count', title: '预测利润', width: '110', sortable: true },
{ field: 'forecast_profit_rate', title: '预测利润率%', width: '120', sortable: true },
{ field: 'profit_count', title: '实际利润', width: '120', sortable: true },
{ field: 'profit_rate', title: '总实际利润率%', width: '130', sortable: true },
{ field: 'currency', title: '币种', width: '80' },
];
var url = '@Url.Content("~/Reports/Orders/ListAmazonSaleStatisticsJson")' + '?' + $("#toolbar").serialize();
if (tb == undefined) {
tb = OnlyTable("roletable", columns, url, "",);
}
else {
tb.bootstrapTable('refresh', { url: url });
}
}
function listAccount() {
$.submit({
url: '@Url.Content("~/Reports/Orders/ListAccount")',
type:'POST',
paramData: 'platform=Amazon',
func: function (result) {
if (result != null && result != undefined) {
$('#saleaccount').html('<option value="">选择帐号</option>');
for (var i = 0; i < result.length; i++) {
$('#saleaccount').append('<option value="' + result[i] + '">' + result[i]+'</option>');
}
}
}
})
}
function listWebsite() {
$.submit({
url: '@Url.Content("~/Reports/Orders/ListWebSite")',
type:'POST',
paramData: 'platform=Amazon',
func: function (result) {
if (result != null && result != undefined) {
$('#website').html('<option value="">选择站点</option>');
for (var i = 0; i < result.length; i++) {
$('#website').append('<option value="' + result[i] + '">' + result[i]+'</option>');
}
}
}
})
}
</script>
}
......@@ -27,7 +27,6 @@
<ItemGroup>
<Folder Include="Areas\Reports\Data\" />
<Folder Include="Areas\Reports\Models\" />
<Folder Include="Areas\Reports\Views\Orders\" />
<Folder Include="Areas\Reports\Views\Sku\" />
</ItemGroup>
......
......@@ -199,7 +199,7 @@
<span class="nav-label">库存周转报表</span>
<span class="fa arrow"></span>
</a>
<ul class="nav nav-second-level">
<ul class="nav nav-third-level">
<li>
<a class="J_menuItem" href="@Url.Content("~/Reports/Inventory/DataWareHouse")" data-index="0" style="padding-left:74px;">
<span class="nav-label">数据仓</span>
......@@ -220,6 +220,39 @@
</li>
<li>
<a href="#">
<i class="fa fa-bar-chart"></i>
<span class="nav-label">统计</span>
<span class="fa arrow"></span>
</a>
<ul class="nav nav-second-level">
<li>
<a href="javascript:;">
<i class="fa fa-money"></i>
<span class="nav-label">亚马逊</span>
<span class="fa arrow"></span>
</a>
<ul class="nav nav-third-level">
<li>
<a class="J_menuItem" href="@Url.Content("~/Reports/Orders/AmazonSaleStatistics")" data-index="0" style="padding-left:74px;">
<span>非FBA销售统计</span>
</a>
</li>
<li>
<a class="J_menuItem" href="@Url.Content("~/Reports/Finance/Index")" data-index="0" style="padding-left:74px;">
<span>订单流水</span>
</a>
</li>
<li>
<a class="J_menuItem" href="@Url.Content("~/Reports/Finance/Index")" data-index="0" style="padding-left:74px;">
<span>财务费用</span>
</a>
</li>
</ul>
</li>
</ul>
</li>
<li>
<a href="#">
<i class="fa fa-usd"></i>
<span class="nav-label">财务报表</span>
<span class="fa arrow"></span>
......
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