@inject IUnitOfWork _unit
@inject ILogDataService _log
@inject IDialogService DialogService
@inject ISnackbar Snackbar
@inject ICTUService CTUService
<div class="d-flex flex-column flex-grow-1 gap-2">
<MudCard Class="" Elevation="2">
<MudCardHeader Class="d-flex justify-space-between flex-grow-1 gap-4">
<MudText Typo="Typo.h4">Quản lý Racks</MudText>
<div class="d-flex flex-row-reverse flex-grow-1 gap-4">
<MudButton OnClick="AutoGenerateCTUCodeClick" Variant="Variant.Filled" EndIcon="@Icons.Material.Filled.Sync" Color="Color.Primary">Tạo CTU Code</MudButton>
<MudButton OnClick="()=>{ShowAddRackActive = true;}" Variant="Variant.Filled" EndIcon="@Icons.Material.Filled.AddBox" Color="Color.Success">Thêm Rack</MudButton>
<MudDivider DividerType="DividerType.Middle" Style="height: 2px" />
<MudGrid Justify="Justify.SpaceBetween">
<MudNumericField @bind-Value="RackNumberSearch" Label="Dãy rack" Variant="Variant.Text"></MudNumericField>
<MudNumericField @bind-Value="RackRowSearch" Label="Tầng rack" Variant="Variant.Text"></MudNumericField>
<MudNumericField @bind-Value="RackColumnSearch" Label="Vị trí rack" Variant="Variant.Text"></MudNumericField>
<MudTextField @bind-Value="PosCodeSearch" Label="CTU Code" Variant="Variant.Text"></MudTextField>
<MudTextField @bind-Value="MgzCodeSearch" Label="Mã Magazine" Variant="Variant.Text"></MudTextField>
<MudTextField @bind-Value="PCBCodeSearch" Label="Mã PCB" Variant="Variant.Text"></MudTextField>
<MudTextField @bind-Value="BoxCodeSearch" Label="Mã thùng" Variant="Variant.Text"></MudTextField>
<MudSelect T="int" @bind-Value="RackStatusSearch" Label="Trạng thái" AnchorOrigin="Origin.BottomCenter" Class="w-100">
<MudSelectItem Value="RackStatus.ALL">--All--</MudSelectItem>
<MudSelectItem Value="RackStatus.EMPTY">Không có thùng</MudSelectItem>
<MudSelectItem Value="RackStatus.IN_WAITING">Chờ hàng vào</MudSelectItem>
<MudSelectItem Value="RackStatus.HAS_BOX">Đang có hàng</MudSelectItem>
<MudSelectItem Value="RackStatus.HAS_FIXED_BOX">Hàng có plan</MudSelectItem>
<MudSelectItem Value="RackStatus.OUT_WAITING">Đợi lấy ra</MudSelectItem>
<MudSelectItem Value="RackStatus.UNDEFINED">Không xác định</MudSelectItem>
<MudSelectItem Value="RackStatus.NO_MAGAZINE">Thùng bị rỗng</MudSelectItem>
<MudText>Đã tìm được: <b>@SearchCountResult</b> kết quả</MudText>
<MudButton Variant="Variant.Filled" EndIcon="@Icons.Material.Filled.Search" Color="Color.Primary" OnClick="RackSearchClick">Tìm kiếm</MudButton>
<MudTable T="MaterialRackDTO" Items="@RackSearchList" Dense="true" Hover="true" Bordered="false" Striped="false" SortLabel="Sort By"
@bind-SelectedItem="RackSelected" Virtualize="true" FixedHeader="true">
<MudTh><MudTableSortLabel Class="d-flex justify-center flex-grow-1" Style="text-align:center;" SortBy="new Func<MaterialRackDTO, object>(x=>x.RackNumber)">Dãy rack</MudTableSortLabel></MudTh>
<MudTh><MudTableSortLabel Class="d-flex justify-center flex-grow-1" Style="text-align:center;" SortBy="new Func<MaterialRackDTO, object>(x=>x.RackCode)">Vị trí</MudTableSortLabel></MudTh>
<MudTh><MudTableSortLabel Class="d-flex justify-center flex-grow-1" Style="text-align:center;" SortBy="new Func<MaterialRackDTO, object>(x=>x.PositionCode)">Mã vị trí</MudTableSortLabel></MudTh>
<MudTh><MudTableSortLabel Class="d-flex justify-center flex-grow-1" Style="text-align:center;" SortBy="new Func<MaterialRackDTO, object>(x=>x.MgzCode)">Mã Magazine</MudTableSortLabel></MudTh>
<MudTh><MudTableSortLabel Class="d-flex justify-center flex-grow-1" Style="text-align:center;" SortBy="new Func<MaterialRackDTO, object>(x=>x.PCBCode)">Mã PCB</MudTableSortLabel></MudTh>
<MudTh><MudTableSortLabel Class="d-flex justify-center flex-grow-1" Style="text-align:center;" SortBy="new Func<MaterialRackDTO, object>(x=>x.PCBQty)">Số lượng PCB</MudTableSortLabel></MudTh>
<MudTh><MudTableSortLabel Class="d-flex justify-center flex-grow-1" Style="text-align:center;" SortBy="new Func<MaterialRackDTO, object>(x=>x.RackPriority)">Ưu tiên</MudTableSortLabel></MudTh>
<MudTh><MudTableSortLabel Class="d-flex justify-center flex-grow-1" Style="text-align:center;" SortBy="new Func<MaterialRackDTO, object>(x=>x.RackStatus)">Trạng thái</MudTableSortLabel></MudTh>
<MudTd Style="text-align:center;" DataLabel="Dãy rack">@context.RackNumber</MudTd>
<MudTd Style="text-align:center;" DataLabel="Tên rack">@(context.RackCol.ToString("00")+context.RackRow.ToString("00"))</MudTd>
<MudTd Style="text-align:center;" DataLabel="Mã vị trí">@context.PositionCode</MudTd>
<MudTd Style="text-align:center;" DataLabel="Mã Magazine">@context.MgzCode</MudTd>
<MudTd Style="text-align:center;" DataLabel="Mã PCB">@context.PCBCode</MudTd>
<MudTd Style="text-align:center;" DataLabel="Số lượng PCB">@context.PCBQty</MudTd>
<MudTd Style="text-align:center;" DataLabel="Ưu tiên">@context.RackPriority</MudTd>
<MudTd DataLabel="Trạng thái" Class="d-flex justify-content-center">
<MudChip T="string" Style="@($"background:{context.RackStatusColor};")">@context.RackStatusString</MudChip>
<div class="d-flex flex-row gap-1 justify-content-end">
<MudIconButton Color="@Color.Secondary" Variant="Variant.Filled" Icon="@Icons.Material.Filled.CleaningServices" Disabled="@(context.RackStatus == RackStatus.EMPTY)" OnClick="@(() => RackClearBoxClick(context))"></MudIconButton>
<MudIconButton Color="@Color.Primary" Variant="Variant.Filled" Icon="@Icons.Material.Filled.Directions" Disabled="@(context.RackStatus == RackStatus.EMPTY || context.RackStatus == RackStatus.UNDEFINED)" OnClick="@(() => RackOutputBoxClick(context))"></MudIconButton>
<MudIconButton Color="@Color.Default" Variant="Variant.Filled" Icon="@Icons.Material.Filled.Edit" OnClick="@(() => RackSearchEditOpenClick(context))"></MudIconButton>
<MudIconButton Color="@Color.Error" Variant="Variant.Filled" Icon="@Icons.Material.Filled.Delete" Disabled="@(context.RackStatus != RackStatus.EMPTY)" OnClick="@(() => RackSearchDeleteClick(@context))"></MudIconButton>
<MudTablePager PageSizeOptions="new int[]{ 10, 50, 100}" />
<MudOverlay Visible="ShowAddRackActive" DarkBackground>
<MudCard Style="@($"width: 300px;")">
<MudCardHeader Class="d-flex justify-content-between align-items-center" Style="@($"background:{Colors.Green.Lighten5}; height: 60px; border-bottom: 1px solid #BDBDBD; margin-left: 0px; margin-right: 0px; padding-bottom: 8px;")">
<MudText Typo="Typo.h5" Class="">
<MudIconButton Icon="@Icons.Material.Filled.Close" OnClick="@(()=>{ShowAddRackActive = false;})" />
<MudCardContent Class="d-flex flex-column flex-grow-1 gap-4">
<MudNumericField T="int" Label="Số rack" Variant="Variant.Text" @bind-Value="@RackNumberAdd" />
<MudNumericField T="int" Label="Số tầng rack" Variant="Variant.Text" @bind-Value="@RackRowNumberlAdd" />
<MudNumericField T="int" Label="Số cột rack" Variant="Variant.Text" @bind-Value="@RackColNumberAdd" />
<MudButton Variant="Variant.Filled" EndIcon="@Icons.Material.Filled.AddBox" Color="Color.Success" OnClick="RackAddClick">Submit</MudButton>
<MudOverlay Visible="ShowEditRackActive" DarkBackground>
<MudCard Style="@($"width: 300px;")">
<MudCardHeader Class="d-flex justify-content-between align-items-center" Style="@($"background:{Colors.Green.Lighten5}; height: 60px; border-bottom: 1px solid #BDBDBD; margin-left: 0px; margin-right: 0px; padding-bottom: 8px;")">
<MudText Typo="Typo.h5" Class="">
<MudIconButton Icon="@Icons.Material.Filled.Close" OnClick="@(()=>{ShowEditRackActive = false; rackEdit=null;})" />
<MudCardContent Class="d-flex flex-column flex-grow-1 gap-4">
<MudTextField Label="Mã CTU của Rack" Variant="Variant.Text" @bind-Value="@rackEdit.PositionCode" />
<MudNumericField T="int" Label="Rack ưu tiên" Variant="Variant.Text" @bind-Value="@rackEdit.RackPriority" />
<MudButton Variant="Variant.Filled" EndIcon="@Icons.Material.Filled.AddBox" Color="Color.Success" OnClick="RackEditSubmitClick">Submit</MudButton>
<MudOverlay Visible="LoadDataActive" DarkBackground="true" ZIndex="9999" AutoClose="false">
<MudProgressCircular Color="Color.Primary" Style="height:70px;width:70px;" Indeterminate="true" />
private bool LoadDataActive = false;
private void OpenDialog(string msg, int status)
var parameters = new DialogParameters<NDialog>();
parameters.Add(x => x.ContentText, msg);
parameters.Add(x => x.Severity, status);
var options = new DialogOptions() { MaxWidth = MaxWidth.ExtraSmall };
DialogService.Show<NDialog>("", parameters, options);
private List<MaterialRackDTO> RackSearchList = new List<MaterialRackDTO>();
private MaterialRackDTO RackSelected = new MaterialRackDTO();
private int SearchCountResult = 0;
private int RackNumberSearch = 0;
private int RackRowSearch = 0;
private int RackColumnSearch = 0;
private int RackStatusSearch = RackStatus.ALL;
private string PosCodeSearch = "";
private string MgzCodeSearch = "";
private string BoxCodeSearch = "";
private string PCBCodeSearch = "";
private async void RackSearchClick()
RackSearchList = await _unit.MaterialMagRacks.GetMaterialRacks(RackNumberSearch, RackRowSearch, RackColumnSearch, MgzCodeSearch,PCBCodeSearch, BoxCodeSearch, RackStatusSearch);
SearchCountResult = RackSearchList.Count();
private void RackClearBoxClick(MaterialRackDTO rack)
var _rack = _unit.MaterialMagRacks.GetById(rack.RackId);
_rack.RackStatus = RackStatus.EMPTY;
_rack.ModifiedAt = DateTime.Now;
_unit.MaterialMagRacks.Modify(_rack);
Snackbar.Add("Đã xóa thùng khỏi rack", Severity.Success);
RackSearchList.Remove(rack);
private async void RackOutputBoxClick(MaterialRackDTO rack)
var parameters = new DialogParameters<DialogSelectBuffOut>();
parameters.Add(x => x.ContentText, $"Bạn muốn đưa thùng hàng đến đâu?");
parameters.Add(x => x.ButtonText, "Chắc chắn");
parameters.Add(x => x.Color, Color.Error);
parameters.Add(x => x.BufferTypeSelect, BufferTypes.BOTH);
var options = new DialogOptions() { CloseButton = true, MaxWidth = MaxWidth.ExtraSmall };
var dialog = DialogService.Show<DialogSelectBuffOut>("Lấy hàng ra vị trí chia lẻ", parameters, options);
var result = await dialog.Result;
var buff = (MaterialMagBuffEntity)result.Data;
var _rack = _unit.MaterialMagRacks.GetById(rack.RackId);
var _ctu = _unit.CTUMissions.CreateMission(_rack.PositionCode, buff.PositionCode, _rack.MagazineId, buff.BufferType);
var a = await CTUService.RunTask(_ctu.StartPosCode, _ctu.EndPosCode, _ctu.TaskType == BufferTypes.INPUT ? true : false);
_unit.CTUMissions.DeleteMission(_ctu);
if (a.TaskResponseInfo.code != "99")
_rack.MissionId = _ctu.Id;
_rack.RackStatus = RackStatus.UNDEFINED;
_rack.ModifiedAt = DateTime.Now;
_unit.MaterialMagRacks.Modify(_rack);
_ctu.MissionStatus = MissionStatus.SEND_CTU_OK;
_ctu.CMDReturn = a.TaskResponseInfo.data;
_unit.CTUMissions.UpdateMission(_ctu);
_rack.MissionId = _ctu.Id;
_rack.RackStatus = RackStatus.OUT_WAITING;
_rack.ModifiedAt = DateTime.Now;
_unit.MaterialMagRacks.Modify(_rack);
private void RackSearchDeleteClick(MaterialRackDTO rack)
bool ShowEditRackActive = false;
MaterialMagRackEntity rackEdit = null;
private void RackEditSubmitClick()
var _rack = _unit.MaterialMagRacks.GetById(rackEdit.Id);
OpenDialog("Không tìm thấy rack", NDialogSeverity.ERROR);
_rack.RackPriority = rackEdit.RackPriority;
_rack.PositionCode = rackEdit.PositionCode;
_unit.MaterialMagRacks.Modify(_rack);
Snackbar.Add("Sửa thành công", Severity.Success);
private void RackSearchEditOpenClick(MaterialRackDTO rack)
var _rack = _unit.MaterialMagRacks.GetById(rack.RackId);
OpenDialog("Không tìm thấy rack", NDialogSeverity.ERROR);
rackEdit = new MaterialMagRackEntity
PositionCode = rack.PositionCode,
RackPriority = rack.RackPriority
ShowEditRackActive = true;
private bool ShowAddRackActive = false;
private int RackNumberAdd = 0;
private int RackRowNumberlAdd = 0;
private int RackColNumberAdd = 0;
private async void RackAddClick()
for (int rack = 1; rack <= RackNumberAdd; rack++)
for (int row = 1; row <= RackRowNumberlAdd; row++)
for (int col = 1; col <= RackColNumberAdd; col++)
var _rackExist = await _unit.MaterialMagRacks.GetRackByName(rack,row,col);
MaterialMagRackEntity _rack = new MaterialMagRackEntity();
_rack.CreateAt = DateTime.Now;
_rack.ModifiedAt = DateTime.Now;
_rack.UseStatus = UseStatus.USE;
_rack.MissionId = Guid.Empty;
_rack.RackStatus = RackStatus.EMPTY;
_rack.MagazineId = Guid.Empty;
_rack.RackPriority = int.Parse(col.ToString()+row.ToString()+rack.ToString());
_unit.MaterialMagRacks.Add(_rack);
ShowAddRackActive = false;
OpenDialog("Đã thêm rack xong", NDialogSeverity.SUCCESS);
#region Ctu code generate
private void AutoGenerateCTUCodeClick()
var _racks = _unit.MaterialMagRacks.GetAll();
foreach (var rack in _racks)
var _ctuCode = $"PCB{rack.RackNumber.ToString("00")}{rack.ColNumber.ToString("0")}0150{rack.RowNumber.ToString("0")}013";
rack.PositionCode = _ctuCode;
rack.ModifiedAt = DateTime.Now;
_unit.MaterialMagRacks.Modify(rack);
Snackbar.Add($"Hoàn thành tạo {_racks.Count()} code vị trí CTU",Severity.Success);