@page "/management/mission"
@inject IUnitOfWork _unit
@inject IDialogService DialogService
@inject ISnackbar Snackbar
@inject IRefreshService _timer
<div class="d-flex flex-column flex-grow-1 gap-2">
<MudCard Class="" Elevation="2">
<MudCardHeader class="d-flex flex-row align-items-center justify-content-center">
<MudText Typo="Typo.h4">Quản lý nhiệm vụ</MudText>
<div class="d-flex flex-row-reverse flex-grow-1 gap-4">
<MudButton OnClick="ClearAllMission" Variant="Variant.Filled" EndIcon="@Icons.Material.Filled.ClearAll" Color="Color.Error">Clear All Missions</MudButton>
<MudDivider DividerType="DividerType.Middle" Style="height: 2px" />
<MudGrid Justify="Justify.SpaceBetween">
<MudSelect T="int" @bind-Value="SearchMissionType" I Label="Loại nhiệm vụ" AnchorOrigin="Origin.BottomCenter" Class="w-100">
<MudSelectItem Value="BufferTypes.ALL">--All--</MudSelectItem>
<MudSelectItem Value="BufferTypes.INPUT">@MissionTypeText.INPUT</MudSelectItem>
<MudSelectItem Value="BufferTypes.OUTPUT">@MissionTypeText.OUTPUT</MudSelectItem>
<MudTextField @bind-Value="SearchCTUTaskCode" Label="Mã nhiệm vụ" Variant="Variant.Text"></MudTextField>
<MudTextField @bind-Value="SearchMgzId" Label="Magazine Code" Variant="Variant.Text"></MudTextField>
<MudTextField @bind-Value="SearchMgzIdSlip" Label="IdTranslip" Variant="Variant.Text"></MudTextField>
<MudTextField @bind-Value="SearchPosCodeStart" Label="Mã vị trí bắt đầu" Variant="Variant.Text"></MudTextField>
<MudTextField @bind-Value="SearchPosCodeEnd" Label="Mã vị trí kết thúc" Variant="Variant.Text"></MudTextField>
<MudText>Đã tìm được: <b>@SearchCountResult</b> kết quả</MudText>
<MudButton Variant="Variant.Filled" EndIcon="@Icons.Material.Filled.Search" Color="Color.Primary" OnClick="MissionSearchClick">Tìm kiếm</MudButton>
<MudTable T="MissionViewDTO" Items="@MissionSearchList" 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<MissionViewDTO, object>(x=>x.MissionTypeText)">Loại NV</MudTableSortLabel></MudTh>
<MudTh><MudTableSortLabel Class="d-flex justify-center flex-grow-1" Style="text-align:center;" SortBy="new Func<MissionViewDTO, object>(x=>x.MgzSite)">Site</MudTableSortLabel></MudTh>
<MudTh><MudTableSortLabel Class="d-flex justify-center flex-grow-1" Style="text-align:center;" SortBy="new Func<MissionViewDTO, object>(x=>x.StartPosCode)">Vị trí đầu</MudTableSortLabel></MudTh>
<MudTh><MudTableSortLabel Class="d-flex justify-center flex-grow-1" Style="text-align:center;" SortBy="new Func<MissionViewDTO, object>(x=>x.EndPosCode)">Vị trí cuối</MudTableSortLabel></MudTh>
<MudTh><MudTableSortLabel Class="d-flex justify-center flex-grow-1" Style="text-align:center;" SortBy="new Func<MissionViewDTO, object>(x=>x.CTUTaskCode)">Mã nhiệm vụ</MudTableSortLabel></MudTh>
<MudTh><MudTableSortLabel Class="d-flex justify-center flex-grow-1" Style="text-align:center;" SortBy="new Func<MissionViewDTO, object>(x=>x.CTUTaskCode)">Magazine Code</MudTableSortLabel></MudTh>
<MudTh><MudTableSortLabel Class="d-flex justify-center flex-grow-1" Style="text-align:cen`ter;" SortBy="new Func<MissionViewDTO, object>(x=>x.MissionStatus)">Trạng thái</MudTableSortLabel></MudTh>
<MudTh><MudTableSortLabel Class="d-flex justify-center flex-grow-1" Style="text-align:cen`ter;" SortBy="new Func<MissionViewDTO, object>(x=>x.MissionStatus)">IdSlip</MudTableSortLabel></MudTh>
<MudTh><MudTableSortLabel Class="d-flex justify-center flex-grow-1" Style="text-align:center;" SortBy="new Func<MissionViewDTO, object>(x=>x.MissionCreateTime)">Thời gian tạo</MudTableSortLabel></MudTh>
<div class="d-flex flex-row gap-1 justify-content-start">
<MudIconButton Variant="Variant.Filled" Icon="@Icons.Material.Filled.Download" Color="@Color.Success" OnClick="@(() => PutAndGet(context))"></MudIconButton>
<MudTd Style="text-align:center;" DataLabel="Loại NV">@context.MissionTypeText </MudTd>
<MudTd Style="text-align:center;" DataLabel="Site">@context.MgzSite </MudTd>
<MudTd Style="text-align:center;" DataLabel="IP Buffer">@context.StartPosCode </MudTd>
<MudTd Style="text-align:center;" DataLabel="Mã vị trí">@context.EndPosCode </MudTd>
<MudTd Style="text-align:center;" DataLabel="Capa Buffer">@context.CTUTaskCode </MudTd>
<MudTd Style="text-align:center;" DataLabel="Capa Buffer">@context.MagazineCode </MudTd>
<MudTd Style="text-align:center;" DataLabel="Loại Buffer">
<MudChip T="string" Style="@($"background:{context.MissionStatusColor};")">@context.MissionStatusText</MudChip>
<MudTd Style="text-align:center;" DataLabel="IdSlip">@context.IdSlip </MudTd>
<MudTd Style="text-align:center;" DataLabel="Thời gian tạo">@context.MissionCreateTime.ToString("dd/MM/yyyy hh:mm tt") </MudTd>
<div class="d-flex flex-row gap-1 justify-content-end">
@*<MudIconButton Variant="Variant.Filled" Icon="@Icons.Material.Filled.Download" Color="@Color.Success" OnClick="@(() => PutAndGet(context))"></MudIconButton>*@
<MudIconButton Color="@Color.Error" Variant="Variant.Filled" Icon="@Icons.Material.Filled.Delete" OnClick="@(() => DeleteMissionClick(@context))"></MudIconButton>
<MudTablePager PageSizeOptions="new int[]{ int.MaxValue, 20, 50, 100}"
RowsPerPageString="Số dòng hiển thị" />
<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 MissionViewDTO currentmis = null;
private string SearchCTUTaskCode = "";
private string SearchPosCodeStart = "";
private string SearchPosCodeEnd = "";
private int SearchMissionStatus = MissionStatus.ALL;
private int SearchMissionType = BufferTypes.ALL;
private string SearchMgzId = "";
private long? SearchMgzIdSlip = null;
private List<string> SearchMissionStatusArray = new List<string>();
private int SearchCountResult = 0;
private List<MissionViewDTO> MissionSearchList = new List<MissionViewDTO>();
protected override void OnInitialized()
private async void MissionSearchClick()
MissionSearchList = await _unit.CTUMissions.GetAllMissionsAsync(SearchMissionType, SearchPosCodeStart, SearchPosCodeEnd, SearchMgzId, SearchMgzIdSlip, SearchCTUTaskCode, SearchMissionStatus);
SearchCountResult = MissionSearchList.Count();
_timer.RefreshChanged += TimerRefreshHandle;
private async void TimerRefreshHandle()
_ = InvokeAsync(async () =>
MissionSearchList = await _unit.CTUMissions.GetAllMissionsAsync(SearchMissionType, SearchPosCodeStart, SearchPosCodeEnd, SearchMgzId, SearchMgzIdSlip, SearchCTUTaskCode, SearchMissionStatus);
SearchCountResult = MissionSearchList.Count();
private async void DeleteMissionClick(MissionViewDTO mission)
var _mission = await _unit.CTUMissions.FindFirstAsync(m => m.Id == mission.MissionId);
var _mgz = await _unit.MaterialMgzes.FindFirstAsync(m => m.Id == _mission.MagazineId);
if(_mgz.Tracking != MagazineTracking.IN_RACK)
var _hismgz = JsonConvert.DeserializeObject<MaterialMgzHisEntity>(JsonConvert.SerializeObject(_mgz));
_hismgz.Id = Guid.NewGuid();
_hismgz.ParentId = _mgz.Id;
_hismgz.ModifiedAt = DateTime.Now;
_hismgz.Tracking = MagazineTracking.DELETED;
await _unit.MaterialMgzHises.AddAsync(_hismgz);
_unit.MaterialMgzes.Delete(_mgz);
await _unit.CompleteAsync();
_mgz.ParentId = Guid.Empty;
_mgz.Tracking = MagazineTracking.IN_RACK;
_mgz.ModifiedAt = DateTime.Now;
_unit.MaterialMgzes.Update(_mgz);
var _hismission = JsonConvert.DeserializeObject<CTUMissionHisEntity>(JsonConvert.SerializeObject(_mission));
_hismission.Id = Guid.NewGuid();
_hismission.MissionStatus = MissionStatus.COMPLETED;
_hismission.ModifiedAt = DateTime.Now;
await _unit.CTUMissionHises.AddAsync(_hismission); ;
_unit.CTUMissions.Delete(_mission);
await _unit.CompleteAsync();
Snackbar.Add("Đã xóa xong", Severity.Success);
MissionSearchList.Remove(mission);
private bool ShowAddMission = false;
private async Task ClearAllMission()
var _mislist = await _unit.CTUMissions.GetAllAsync();
foreach (var _mis in _mislist)
_unit.CTUMissions.Delete(_mis);
await _unit.CompleteAsync();
Snackbar.Add($"Đã xóa hết nhiệm vụ", Severity.Success);
private async void PutAndGet(MissionViewDTO mission)
var _mission = await _unit.CTUMissions.FindFirstAsync(m => m.Id == mission.MissionId);
if (_mission.TaskType == BufferTypes.INPUT)
_mission.MissionStatus = MissionStatus.IN_GET;
_unit.CTUMissions.Update(_mission);
await _unit.CompleteAsync();
Snackbar.Add("Đã cho phép lấy hàng", Severity.Success);
else if (_mission.TaskType == BufferTypes.OUTPUT)
_mission.MissionStatus = MissionStatus.OUT_PUT;
_unit.CTUMissions.Update(_mission);
await _unit.CompleteAsync();
Snackbar.Add("Đã cho phép đặt hàng", Severity.Success);