# ECSM業主平台 (業主理貨看板)
###### tags: `SUDA`
## :memo: ECSM理貨看板相關設定
### Step 1:新增功能選單(理貨看板):(Database:ECSM)
:::info
:bulb:
USE [ECSM]
GO
INSERT INTO [ecsm].[Functions]([FuncId],[FuncName],[Uri],[ParentId],[Sort],[IsAjax],[ProjectId],[Enabled],[Deleted],[CreatedAt],[CreatedBy],[UpdatedAt],[UpdatedBy])
select 'D80','理貨看板',null,@TopParentId,0,0,4,1,0,GETDATE(),'NoName',getdate(),'NoName'
declare @ParentId int =-1
select @ParentId=Id from ecsm.Functions
where FuncName ='理貨看板'
INSERT INTO [ecsm].[Functions]([FuncId],[FuncName],[Uri],[ParentId],[Sort],[IsAjax],[ProjectId],[Enabled],[Deleted],[CreatedAt],[CreatedBy],[UpdatedAt],[UpdatedBy])
select 'D8010','業主理貨看板','/Dashboard/Dashboard',@ParentId,0,0,4,1,0,GETDATE(),'NoName',getdate(),'NoName'
INSERT INTO [ecsm].[Functions]([FuncId],[FuncName],[Uri],[ParentId],[Sort],[IsAjax],[ProjectId],[Enabled],[Deleted],[CreatedAt],[CreatedBy],[UpdatedAt],[UpdatedBy])
select 'D8020','業主訂單出貨統計','/Dashboard/DashboardCustomerOrders',@ParentId,1,0,4,1,0,GETDATE(),'NoName',getdate(),'NoName'
GO
--建立功能項目
with fn as
(
select id from ECSM.Functions
where left(FuncId,1)='D' and FuncId in ('D80','D8010','D8020')
),
tp as
(
select 1 as FType union select 2 union select 3 union select 4 union select 5
)
insert [ecsm].[FunctionActionTypes] ([Function_id],[ActionType_id])
select * from fn,tp
GO
:::
### Step 2:以系統管理者登入系統設定角色權限(99999999999)
會員專區 => 權限管理 => 角色維護 =>設定相關角色
- [x] **ecsmadmin**
- [X] **ecsmsers**
=>明細=> 理貨看板功能區全勾
### Step 3:建立View(Database:WMS)
:::warning
USE [WMS]
GO
Create view [wms].[CustomerOrderMappingsDashboardView] as
select a.DCId,a.CustomerId,c.UnifiedBusinessNo,a.CustomerOrderNo ,a.CustomerOrderId
,a.BatchImportId ,b.BatchStatus ,b.DataDate,b.ImportDate,b.OrderImportType
,a.WMSOrderId
,d.WMSOrderStatus
,d.CreatedAt as WMSCreatedAt
,d.WarehouseOutDate
,iif(b.OrderImportType=1,dateadd(D,1, b.DataDate),b.DataDate) as DashboardDate
from wms.CustomerOrderMappings a inner join wms.CustomerBatchImports b on a.BatchImportId =b.BatchImportId and a.CustomerId =b.CustomerId and a.DCId =b.DCId
inner join wms.Customers c on a.CustomerId =c.CustomerId
inner join wms.WMSOrders d on a.WMSOrderId =d.WMSOrderId
where d.WMSOrderStatus<>3
GO
Create view [wms].[CustomerOrderDashboardView] as
select a.CustomerOrderId ,a.CustomerId ,c.UnifiedBusinessNo ,a.DCId ,a.BatchImportId ,a.CustomerOrderNo,a.OrderDate,a.CreatedAt ,a.OrderStatus
,b.BatchStatus ,b.DataDate,b.ImportDate,b.OrderImportType
,iif(b.OrderImportType=1,dateadd(D,1, b.DataDate),b.DataDate) as DashboardDate
from wms.CustomerOrders a (nolock) inner join wms.CustomerBatchImports b (nolock) on a.BatchImportId =b.BatchImportId and a.DCId =b.DCId and a.CustomerId =b.CustomerId
inner join wms.Customers c (nolock) on a.CustomerId =c.CustomerId
and a.OrderStatus in (0,1,2,6)
GO
Create view [wms].[WMSOrderDashboardView] as
select a.WMSOrderId,a.DCId ,a.CustomerId ,c.UnifiedBusinessNo,a.BatchImportId,a.WMSOrderStatus,a.CustomerOrderNo,a.CreatedAt as WMSCreatedAt,a.WarehouseOutDate
,b.BatchStatus ,b.DataDate,b.ImportDate,b.OrderImportType
,iif(b.OrderImportType=1,dateadd(D,1, b.DataDate),b.DataDate) as DashboardDate
from WMS.WMSOrders a (nolock) inner join wms.CustomerBatchImports b (nolock) on a.BatchImportId =b.BatchImportId and a.DCId =b.DCId and a.CustomerId =b.CustomerId
inner join wms.Customers c (nolock) on a.CustomerId =c.CustomerId
where a.WMSOrderStatus in (0,1,2)
GO
:::
:::info
:bulb: **Hint:**
批次
| BatchStatus| Memo|
| -----------|:----|
| 0 |待處理|
| 1 |庫分中|
| 2 |已庫分|
| 5 |有缺貨|
| 6 |待補貨|
| 7 |已取消|
| 8 |失敗|
| 9 |已刪除|
訂單:
| OrderStatus | Memo |
| -------- | -------- |
| 0 | 待庫分 |
| 1 | 庫分中 |
| 2 | 已庫分 |
| 6 | 缺貨 |
| 9 | 取消訂單 |
出貨單:
| WMSOrderStatus | Memo |
| -------- | -------- |
| 0 | 待處理 |
| 1 | QC中 |
| 2 | 已出貨 |
| 3 | 取消出貨 |
:::
### Step 4:建立View(Database:ECSM)
:::info
USE [ECSM]
GO
Create VIEW [ECSM].[WmsCustomerOrderMappingsDashboardView] as
select * FROM [WMSDB].wms.Wms.CustomerOrderMappingsDashboardView
GO
Create VIEW [ECSM].[WmsCustomerOrderDashboardView] as
select * from [WMSDB].[wms].[wms].[CustomerOrderDashboardView]
GO
Create VIEW [ECSM].[WmsWMSOrderDashboardView] as
select * from [WMSDB].[wms].[wms].[WMSOrderDashboardView]
GO
:::
## :memo: 前端設計模型:
:::info
```
namespace ECSM.DomainModels.Dashboard
{
/// <summary>
/// 查詢泛用型別
/// </summary>
public class DashboardDailyQuery
{
/// <summary>
/// 特販代號
/// </summary>
[Display(Name = "DC編號")]
public string DCId { get; set; }
[Display(Name = "業主")]
public string UnifiedBusinessNo{ get; set; }
/// <summary>
/// 業主代號
/// </summary>
[Display(Name = "業主")]
public int? CustomerId { get; set; }
/// <summary>
/// 查詢日期
/// </summary>
public DateTime? BeginDate { get; set; }
public DateTime? EndDate { get; set; }
}
/// <summary>
/// 區間查詢結果:回傳每日資料的集合
/// </summary>
public class DashboardQueryRangeOrdersResult
{
public IList<DashboardDailyQueryResult> RangeOrders { get; set; } = new List<DashboardDailyQueryResult>();
}
/// <summary>
/// 日查詢結果:回傳該日資料
/// </summary>
public class DashboardDailyQueryResult
{
[Display(Name = "DC編號")]
public string DCId { get; set; }
public string DCName { get; set; }
[Display(Name = "業主")]
public int CustomerId { get; set; }
[Display(Name = "通路")]
public int DistributorId { get; set; }
[Display(Name = "業主訂單日期")]
public string DashboardDate { get; set; }
/// <summary>
/// 訂單日期
/// </summary>
[Display(Name = "業主訂單時間")]
public DateTime? OrderTime { get; set; }
/// <summary>
/// 出貨日期
/// </summary>
[Display(Name = "出貨日期")]
public DateTime ShipmentTime { get; set; }
/// <summary>
/// 訂單完成率
/// </summary>
///
[Display(Name = "訂單完成率")]
public decimal OrderPercentage { get; set; }
/// <summary>
/// 訂單總數
/// </summary>
[Display(Name = "訂單筆數")]
public int OrderTotal { get; set; }
/// <summary>
/// 訂單完成數
/// </summary>
[Display(Name = "訂單完成數")]
public int OrderFinishedTotal { get; set; }
/// <summary>
/// PCS總數 需出貨數:商品SKU
/// </summary>
[Display(Name = "PCS總數")]
public int PCSTotal { get; set; }
/// <summary>
/// PCS完成數 商品出貨數 商品SKU
/// </summary>
[Display(Name = "PCS完成數")]
public int PCSFinishedTotal { get; set; }
/// <summary>
/// PCS完成比例 商品出貨數比例 商品SKU
/// </summary>
///
[Display(Name = "PCS完成比例")]
public decimal PCSPercentage { get; set; }
/// <summary>
/// 出貨總張數
/// </summary>
[Display(Name = "出貨單數")]
public int ShipmentTotal { get; set; }
/// <summary>
/// 出貨完成張數
/// </summary>
[Display(Name = "出貨單完成數")]
public int ShipmentFinishedTotal { get; set; }
/// <summary>
/// 出貨完成比例
/// </summary>
///
[Display(Name = "出貨完成比例")]
public decimal ShipmentPercentage { get; set; }
/// <summary>
/// 分時明細資料
/// </summary>
public IList<OrderDaily> DahboardOrderDailyDetails { get; set; } = new List<OrderDaily>();
/// <summary>
/// 圓餅圖資料
/// </summary>
public IList<DashboardChartQueryResult> DashboardChartResultMaster { get; set; } = new List<DashboardChartQueryResult>();
/// <summary>
/// 分時長條圖資料
/// </summary>
public IList<DashboardChartQueryResult> DashboardChartResultDetails { get; set; } = new List<DashboardChartQueryResult>();
}
public class OrderDaily
{
public string Title { get; set; }
public DateTime OrderTime { get; set; }
public int OrderTotal { get; set; }
public int OrderFinishedTotal { get; set; }
public int ShipmentTotal { get; set; }
public int ShipmentFinishedTotal { get; set; }
}
public class DashboardChartQueryResult
{
public string Category { get; set; }
public decimal Value { get; set; }
public string OrderBy { get; set; }
}
}
```
:::
:::success
:bulb: **Hint:** 定義說明
* DashBoardDate(看板訂單日期):
依BAT轉入時的類別在View中設定:0:AM單;1:PM單;2:業主自訂
wms.CustomerBatchImports.OrderImportType
EX:PM單以艾多美算隔日訂單加一天處理;餘日期同步資料日期
DashboardDate =iif(b.OrderImportType=1,dateadd(D,1, b.DataDate),b.DataDate)
* 業主看版:
訂單完成率:當日業主訂單數轉庫分數/當日業主訂單數
訂單數:當日業主訂單數(排除作廢)
出貨單數:該日出貨單總數。(以出貨單對照到的批次記錄DashboardDate認列。)
出貨完成數:該日出貨單狀態=2(已出貨)數量
* 業主訂單出貨統計:以業主訂單為主(會拆併單。有其一未出貨則算未完成)
以wms.CustomerOrderMappings中的出貨及Bat中記錄為主來源。
訂單數:為該集合中(CustomerOrderNo).distinct.count
未完成訂單數:出貨單狀態<>2集合中(CustomerOrderNo).distinct.count
:::
:::danger
:bulb: **Hint:** 圖表相關(Kendo Ui)
圓餅圖:
```
script:
$scope.vm.PieChart = response.data.DashboardChartResultMaster;
html:
<div kendo-chart
k-title="{ text: '訂單完成率', position: 'top' }"
k-series-defaults="{ type: 'pie',labels: { visible: true ,format:'{0}筆'} }"
k-series="[{
field: 'Value',
categoryField: 'Category',
padding: 0,
color: '#b8b8b8',
}]"
k-data-source=vm.PieChart
k-series-colors="['#66b3ff', '#b2d9ff']"
k-tooltip="{ visible: true, template: '${ category }: #:value# 筆 (#=percentage.toFixed(3) * 100 # %)' }"
k-legend="{ position: 'left' }"
style="height: 300px; width:300px;">
</div>
```
長條圖:
```
Script:
var ds = new kendo.data.DataSource({
data: response.data.DashboardChartResultDetails,
group: [
{ field: "OrderBy", dir: "asc" }
],
sort: [
{ field: "Category", dir: "asc" }
]
});
$scope.vm.StackbarChart = ds;
html:
<div kendo-chart
k-title="{ text: '訂單分時完成率', position: 'top' }"
k-series-defaults="{ type: 'bar', stack: true }"
k-series="[{
field: 'Value',
categoryField: 'Category'
}]"
k-data-source=vm.StackbarChart
categoryAxis="{field:'Value'}"
@*k-series-colors="['#66b3ff', '#b2d9ff']"*@
k-tooltip="{ visible: true, template: '#= category # : #= value #%' }"
k-legend="{ position: 'left' }"
style="height: 800px; width:500px;">
</div>
```
:::