@page "/management/buffer"
@inject IUnitOfWork _unit
@inject IDialogService DialogService
@inject ISnackbar Snackbar
<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ý Buffers</MudText>
<div class="d-flex flex-row-reverse flex-grow-1 gap-4">
<MudButton OnClick="()=>{ShowAddBufferActive = true;}" Variant="Variant.Filled" EndIcon="@Icons.Material.Filled.AddBox" Color="Color.Success">Thêm Buffer</MudButton>
<MudDivider DividerType="DividerType.Middle" Style="height: 2px" />
<MudGrid Justify="Justify.SpaceBetween">
<MudTextField @bind-Value="SearchBufferIP" Label="Địa chỉ IP" Variant="Variant.Text"></MudTextField>
<MudTextField @bind-Value="SearchBufferName" Label="Tên buffer" Variant="Variant.Text"></MudTextField>
<MudTextField @bind-Value="SearchMgzCode" Label="Mã vật liệu" Variant="Variant.Text"></MudTextField>
<MudTextField @bind-Value="SearchBoxCode" Label="Mã thùng pcb" Variant="Variant.Text"></MudTextField>
<MudSelect T="int" @bind-Value="SearchBufferType" Label="Trạng thái" AnchorOrigin="Origin.BottomCenter" Class="w-100">
<MudSelectItem Value="BufferTypes.ALL">--All--</MudSelectItem>
<MudSelectItem Value="BufferTypes.BOTH">Buffer chia lẻ</MudSelectItem>
<MudSelectItem Value="BufferTypes.INPUT">Buffer Input</MudSelectItem>
<MudSelectItem Value="BufferTypes.OUTPUT">Buffer Output</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="BufferSearchClick">Tìm kiếm</MudButton>
<MudTable T="MaterialBufferDTO" Items="@BufferSearchList" Dense="true" Hover="true" Bordered="false" Striped="false" SortLabel="Sort By"
Virtualize="true" FixedHeader="true">
<MudTh><MudTableSortLabel Class="d-flex justify-center flex-grow-1" Style="text-align:center;" SortBy="new Func<MaterialBufferDTO, object>(x=>x.BufferIp)">IP Buffer</MudTableSortLabel></MudTh>
<MudTh><MudTableSortLabel Class="d-flex justify-center flex-grow-1" Style="text-align:center;" SortBy="new Func<MaterialBufferDTO, object>(x=>x.BufferType)">Loại Buffer</MudTableSortLabel></MudTh>
<MudTh><MudTableSortLabel Class="d-flex justify-center flex-grow-1" Style="text-align:center;" SortBy="new Func<MaterialBufferDTO, object>(x=>x.BufferName)">CTU Code</MudTableSortLabel></MudTh>
<MudTh><MudTableSortLabel Class="d-flex justify-center flex-grow-1" Style="text-align:center;" SortBy="new Func<MaterialBufferDTO, object>(x=>x.BufferBoxCapa)">Chế độ</MudTableSortLabel></MudTh>
<MudTh><MudTableSortLabel Class="d-flex justify-center flex-grow-1" Style="text-align:center;" SortBy="new Func<MaterialBufferDTO, object>(x=>x.BufferBoxQty)">Id Slip</MudTableSortLabel></MudTh>
<MudTh><MudTableSortLabel Class="d-flex justify-center flex-grow-1" Style="text-align:center;" SortBy="new Func<MaterialBufferDTO, object>(x=>x.BufferBoxQty)">Số lượng out</MudTableSortLabel></MudTh>
<MudTd Style="text-align:center;" DataLabel="IP Buffer">@context.BufferIp</MudTd>
<MudTd Style="text-align:center;" DataLabel="Loại Buffer">
context.BufferType switch
BufferTypes.INPUT => "Buffer Nhập",
BufferTypes.OUTPUT => "Buffer Xuất",
BufferTypes.BOTH => "Buffer Chia Lẻ",
<MudTd Style="text-align:center;" DataLabel="Mã vị trí">@context.PositionCode</MudTd>
<MudTd Style="text-align:center;" DataLabel="Chế độ">@context.BufferStatus</MudTd>
<MudTd Style="text-align:center;" DataLabel="Trạng thái">@context.IdSlip</MudTd>
<MudTd Style="text-align:center;" DataLabel="Số lượng out">@context.Sl</MudTd>
<div class="d-flex flex-row gap-1 justify-content-end">
<MudIconButton Color="@Color.Default" Variant="Variant.Filled" Icon="@Icons.Material.Filled.Edit" OnClick="@(() => EditBufferClick(context))"></MudIconButton>
<MudIconButton Color="@Color.Dark" Variant="Variant.Filled" Icon="@Icons.Material.Filled.Scanner" OnClick="@(() => DeleteSlipClick(context))"></MudIconButton>
<MudIconButton Color="@Color.Surface" Variant="Variant.Filled" Icon="@Icons.Material.Filled.SwitchRight" OnClick="@(() => SwitchState(context))"></MudIconButton>
<MudIconButton Color="@Color.Error" Variant="Variant.Filled" Icon="@Icons.Material.Filled.Delete" Disabled="@(context.MaterialBufferBoxInfos.Any(b=>b.PosStatus == BufferStatus.HAS_BOX))" OnClick="@(() => DeleteBufferClick(@context))"></MudIconButton>
<MudTablePager PageSizeOptions="new int[]{ 10, 50, 100}" />
<MudOverlay Visible="ShowAddBufferActive" DarkBackground>
<MudCard Style="@($"width: 800px;")">
<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="@(()=>{ShowAddBufferActive = false;})" />
<MudCardContent Class="d-flex flex-column flex-grow-1 gap-4">
<MudTextField T="string" Label="Buffer IP" Variant="Variant.Text" @bind-Value="@AddBufferIP" />
<MudTextField T="string" Label="Tên Buffer" Variant="Variant.Text" @bind-Value="@AddBufferName" />
<MudTextField T="string" Label="Buffer Possition" Variant="Variant.Text" @bind-Value="@AddBufferPos" />
<MudNumericField T="int" Label="Số box tối đa" Variant="Variant.Text" @bind-Value="@AddBufferCapa" />
<MudSelect T="int" Label="Loại buffer" AnchorOrigin="Origin.BottomCenter" @bind-Value="@AddBufferType" Class="w-100">
<MudSelectItem Value="BufferTypes.INPUT">Buffer Input</MudSelectItem>
<MudSelectItem Value="BufferTypes.OUTPUT">Buffer Output</MudSelectItem>
<MudSelectItem Value="BufferTypes.BOTH">Buffer Chia</MudSelectItem>
<MudButton Variant="Variant.Filled" EndIcon="@Icons.Material.Filled.AddBox" Color="Color.Success" OnClick="BufferAddClick">Submit</MudButton>
<MudOverlay Visible="ShowEditBufferActive" DarkBackground>
<MudCard Style="@($"width: 800px;")">
<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="@(()=>{ShowEditBufferActive = false;})" />
<MudCardContent Class="d-flex flex-column flex-grow-1 gap-4">
<MudTextField T="string" Label="Buffer IP" Variant="Variant.Text" @bind-Value="@bufferEdit.BufferIp" />
<MudTextField T="string" Label="Buffer Name" Variant="Variant.Text" @bind-Value="@bufferEdit.BufferName" />
<MudNumericField T="int" Label="Số box tối đa" Variant="Variant.Text" @bind-Value="@bufferEdit.BufferBoxCapa" />
<MudSelect T="int" Label="Loại buffer" AnchorOrigin="Origin.BottomCenter" @bind-Value="@bufferEdit.BufferType" Class="w-100">
<MudSelectItem Value="BufferTypes.INPUT">Buffer Input</MudSelectItem>
<MudSelectItem Value="BufferTypes.OUTPUT">Buffer Output</MudSelectItem>
<MudSelectItem Value="BufferTypes.BOTH">Buffer Chia</MudSelectItem>
<MudButton Variant="Variant.Filled" EndIcon="@Icons.Material.Filled.AddBox" Color="Color.Success" OnClick="BufferEditClick">Submit</MudButton>
<MudOverlay Visible="ShowDetailBufferActive" DarkBackground>
<MudCard Style="@($"width: 1000px;")">
<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="@(()=>{ShowDetailBufferActive = false;})" />
<MudCardContent Class="d-flex flex-column flex-grow-1 gap-4">
<MudTable T="MaterialMagBuffEntity" Items="@BufferDetailList" Dense="true" Hover="true" Bordered="false" Striped="false" SortLabel="Sort By"
Virtualize="true" FixedHeader="true">
<MudTh><MudTableSortLabel Class="d-flex justify-center flex-grow-1" Style="text-align:center;" SortBy="new Func<MaterialMagBuffEntity, object>(x=>x.BufferName)">Buffer Số</MudTableSortLabel></MudTh>
<MudTh><MudTableSortLabel Class="d-flex justify-center flex-grow-1" Style="text-align:center;" SortBy="new Func<MaterialMagBuffEntity, object>(x=>x.BufferIP)">IP Buffer</MudTableSortLabel></MudTh>
<MudTh><MudTableSortLabel Class="d-flex justify-center flex-grow-1" Style="text-align:center;" SortBy="new Func<MaterialMagBuffEntity, object>(x=>x.BufferType)">Loại Buffer</MudTableSortLabel></MudTh>
<MudTh><MudTableSortLabel Class="d-flex justify-center flex-grow-1" Style="text-align:center;" SortBy="new Func<MaterialMagBuffEntity, object>(x=>x.PositionCode)">CTU Code</MudTableSortLabel></MudTh>
<MudTh><MudTableSortLabel Class="d-flex justify-center flex-grow-1" Style="text-align:center;" SortBy="new Func<MaterialMagBuffEntity, object>(x=>x.PosStatus)">Trạng Thái</MudTableSortLabel></MudTh>
<MudTh><MudTableSortLabel Class="d-flex justify-center flex-grow-1" Style="text-align:center;" SortBy="new Func<MaterialMagBuffEntity, object>(x=>x.MissionId)">Mission Id</MudTableSortLabel></MudTh>
<MudTh><MudTableSortLabel Class="d-flex justify-center flex-grow-1" Style="text-align:center;" SortBy="new Func<MaterialMagBuffEntity, object>(x=>x.StatusId)">Status Id</MudTableSortLabel></MudTh>
<MudTd Style="text-align:center;" DataLabel="Buffer Số">@context.BufferNumber</MudTd>
<MudTd Style="text-align:center;" DataLabel="IP Buffer">@context.BufferIP</MudTd>
<MudTd Style="text-align:center;" DataLabel="Loại Buffer">
context.BufferType switch
BufferTypes.INPUT => "Buffer Nhập",
BufferTypes.OUTPUT => "Buffer Xuất",
BufferTypes.BOTH => "Chia Lẻ",
<MudTd Style="text-align:center;" DataLabel="CTU Code">@context.PositionCode</MudTd>
<MudTd Style="text-align:center;" DataLabel="Trạng Thái">@context.PosStatus</MudTd>
<MudTd Style="text-align:center;" DataLabel="Mission Id">@context.MissionId</MudTd>
<MudTd Style="text-align:center;" DataLabel="Status Id">@context.StatusId</MudTd>
<div class="d-flex flex-row gap-1 justify-content-end">
<MudIconButton Color="@Color.Default" Variant="Variant.Filled" Icon="@Icons.Material.Filled.Edit" OnClick="@(() => EditPosBufferClick(context))"></MudIconButton>
<MudTablePager PageSizeOptions="new int[]{ 10, 50, 100}" />
<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<MaterialBufferDTO> BufferSearchList = new List<MaterialBufferDTO>();
private int SearchCountResult = 0;
private int SearchBufferNumber = 0;
private string SearchBufferIP = "";
private string SearchBufferName = "";
private string SearchMgzCode = "";
private string SearchBoxCode = "";
private int SearchBufferType = BufferTypes.ALL;
private async void BufferSearchClick()
BufferSearchList.Clear();
BufferSearchList = await _unit.MaterialMagBuffes.GetBufferInfor(SearchBufferIP, SearchBufferName, SearchBufferType);
SearchCountResult = BufferSearchList.Count();
private bool ShowAddBufferActive = false;
private int AddBufferNumber = 0;
private string AddBufferIP = "";
private string AddBufferPos = "";
private string AddBufferName = "";
private int AddBufferCapa = 0;
private int AddBufferType = BufferTypes.INPUT;
private async void BufferAddClick()
if (string.IsNullOrEmpty(AddBufferIP) || string.IsNullOrEmpty(AddBufferPos) || AddBufferType == BufferTypes.ALL || AddBufferCapa == 0)
Snackbar.Add("Thiếu dữ liệu đầu vào");
for (int i = 1; i <= AddBufferCapa; i++)
MaterialMagBuffEntity _buffEntity = new MaterialMagBuffEntity();
_buffEntity.BufferIP = AddBufferIP;
_buffEntity.BufferType = AddBufferType;
_buffEntity.PositionCode = AddBufferPos;
_buffEntity.BufferNumber = i;
_buffEntity.PosStatus = BufferStatus.NO_BOX;
_buffEntity.CreateAt = DateTime.Now;
_buffEntity.ModifiedAt = DateTime.Now;
_buffEntity.StatusId = "";
_buffEntity.LastTimeAt = DateTime.Now;
_buffEntity.BufferName = AddBufferName;
await _unit.MaterialMagBuffes.AddAsync(_buffEntity);
await _unit.CompleteAsync();
OpenDialog("Đã thêm buffer xong", NDialogSeverity.SUCCESS);
ShowAddBufferActive = false;
private bool ShowDetailBufferActive = false;
private List<MaterialMagBuffEntity> BufferDetailList = new List<MaterialMagBuffEntity>();
private bool ShowEditBufferActive = false;
private MaterialBufferDTO bufferEdit = null;
private MaterialBufferDTO currentEdit = null;
private int EditBufferType = BufferTypes.INPUT;
private void EditPosBufferClick(MaterialMagBuffEntity posBuf)
private void EditBufferClick(MaterialBufferDTO buffer)
bufferEdit = new MaterialBufferDTO
BufferIp = buffer.BufferIp,
BufferName = buffer.BufferName,
BufferBoxCapa = buffer.BufferBoxCapa,
BufferBoxQty = buffer.BufferBoxQty,
BufferNumber = buffer.BufferNumber,
BufferType = buffer.BufferType,
MaterialBufferBoxInfos = buffer.MaterialBufferBoxInfos,
PositionCode = buffer.PositionCode
ShowEditBufferActive = true;
private async void BufferEditClick()
if(currentEdit.BufferBoxCapa != bufferEdit.BufferBoxCapa)
foreach (var buf in bufferEdit.MaterialBufferBoxInfos)
_unit.MaterialMagBuffes.Delete(buf);
await _unit.CompleteAsync();
for (int i = 1; i <= bufferEdit.BufferBoxCapa; i++)
MaterialMagBuffEntity _buffEntity = new MaterialMagBuffEntity();
_buffEntity.BufferIP = bufferEdit.BufferIp;
_buffEntity.BufferType = bufferEdit.BufferType;
_buffEntity.PositionCode = bufferEdit.PositionCode;
_buffEntity.BufferName = bufferEdit.BufferName;
_buffEntity.BufferNumber = i;
_buffEntity.PosStatus = BufferStatus.NO_BOX;
_buffEntity.CreateAt = DateTime.Now;
_buffEntity.ModifiedAt = DateTime.Now;
_buffEntity.StatusId = "";
_buffEntity.LastTimeAt = DateTime.Now;
await _unit.MaterialMagBuffes.AddAsync(_buffEntity);
await _unit.CompleteAsync();
foreach (var buf in bufferEdit.MaterialBufferBoxInfos)
buf.BufferIP = bufferEdit.BufferIp;
buf.BufferName = bufferEdit.BufferName;
buf.BufferType = bufferEdit.BufferType;
buf.ModifiedAt = DateTime.Now;
_unit.MaterialMagBuffes.Update(buf);
await _unit.CompleteAsync();
currentEdit.BufferIp = bufferEdit.BufferIp;
currentEdit.BufferName = bufferEdit.BufferName;
currentEdit.BufferType = bufferEdit.BufferType;
currentEdit.BufferBoxCapa = bufferEdit.BufferBoxCapa;
ShowEditBufferActive = false;
Snackbar.Add("Đã update xong", Severity.Success);
private async void DeleteSlipClick(MaterialBufferDTO buffer)
var _buffer = await _unit.MaterialMagBuffes.FindFirstAsync1(m => m.BufferIP == buffer.BufferIp, "", true);
var _miss = await _unit.CTUMissions.FindAsync(m => m.Remark == _buffer.BufferIP && m.MissionStatus <= MissionStatus.OUT_PUT);
if ((_buffer.IdMatch_1 > 1) && (_miss.Count() == 0) && (_buffer.sl_1 != 0))
if (_buffer.UseStatus == BufferUseStatus.AUTO2MANUAL)
_buffer.UseStatus = BufferUseStatus.MANUAL;
_buffer.ModifiedAt = DateTime.Now;
_unit.MaterialMagBuffes.Update(_buffer);
await _unit.CompleteAsync();
var _misclear = await _unit.CTUMissions.FindAsync(m => m.Remark == _buffer.BufferIP && m.MissionStatus > MissionStatus.OUT_PUT);
foreach (var mission in _misclear)
var _mgz = await _unit.MaterialMgzes.FindFirstAsync(m => m.Id == mission.MagazineId);
var _hismgz = JsonConvert.DeserializeObject<MaterialMgzHisEntity>(JsonConvert.SerializeObject(_mgz));
_hismgz.Id = Guid.NewGuid();
_hismgz.ModifiedAt = DateTime.Now;
_hismgz.Tracking = MagazineTracking.COMPLETED;
await _unit.MaterialMgzHises.AddAsync(_hismgz);
_unit.MaterialMgzes.Delete(_mgz);
await _unit.CompleteAsync();
var _his2 = JsonConvert.DeserializeObject<CTUMissionHisEntity>(JsonConvert.SerializeObject(mission));
_his2.Id = Guid.NewGuid();
_his2.MissionStatus = MissionStatus.COMPLETED;
_his2.ModifiedAt = DateTime.Now;
await _unit.CTUMissionHises.AddAsync(_his2); ;
_unit.CTUMissions.Delete(mission);
await _unit.CompleteAsync();
Snackbar.Add("Đã xóa xong", Severity.Success);
Snackbar.Add("Không thể xóa", Severity.Success);
private async void SwitchState(MaterialBufferDTO buffer)
var _buffer = await _unit.MaterialMagBuffes.FindFirstAsync1(m => m.BufferIP == buffer.BufferIp, "", true);
_buffer.UseStatus = _buffer.UseStatus switch
BufferUseStatus.MANUAL => BufferUseStatus.MANUAL2AUTO,
BufferUseStatus.MANUAL2AUTO => BufferUseStatus.MANUAL,
BufferUseStatus.AUTO => BufferUseStatus.AUTO2MANUAL,
BufferUseStatus.AUTO2MANUAL => BufferUseStatus.AUTO,
_unit.MaterialMagBuffes.Update(_buffer);
await _unit.CompleteAsync();
_buffer = await _unit.MaterialMagBuffes.FindFirstAsync1(m => m.BufferIP == buffer.BufferIp, "", true);
BufferSearchList = BufferSearchList.Select(b =>
b.BufferIp == buffer.BufferIp ? new MaterialBufferDTO
PositionCode = b.PositionCode,
BufferNumber = b.BufferNumber,
BufferType = b.BufferType,
BufferName = b.BufferName,
BufferBoxCapa = b.BufferBoxCapa,
BufferBoxQty = b.BufferBoxQty,
BufferStatus = _buffer.UseStatus switch
BufferUseStatus.MANUAL => BufferUseStatusText.MANUAL,
BufferUseStatus.MANUAL2AUTO => BufferUseStatusText.MANUAL2AUTO,
BufferUseStatus.AUTO => BufferUseStatusText.AUTO,
BufferUseStatus.AUTO2MANUAL => BufferUseStatusText.AUTO2MANUAL,
Snackbar.Add("Đã cập nhật", Severity.Success);
private async void DeleteBufferClick(MaterialBufferDTO buffer)
var parameters = new DialogParameters<DialogYesNo>();
parameters.Add(x => x.ContentText, $"Bạn có chắc chắn muốn xóa buffer {buffer.BufferIp} này không?");
parameters.Add(x => x.ButtonText, "Ðồnng ý");
parameters.Add(x => x.Color, Color.Error);
var options = new DialogOptions() { CloseButton = true, MaxWidth = MaxWidth.ExtraSmall };
var dialog = DialogService.Show<DialogYesNo>("Yêu cầu xóa buffer", parameters, options);
var result = await dialog.Result;
foreach (var buf in buffer.MaterialBufferBoxInfos)
_unit.MaterialMagBuffes.Delete(buf);
await _unit.CompleteAsync();
Snackbar.Add("Đã xóa xong", Severity.Success);
BufferSearchList.Remove(buffer);