HKC_Blazor/MasaBlazorApp3/Pages/SelfTake.razor

298 lines
15 KiB
Plaintext

@page "/take/self"
<div class="container-fluid">
<div class="row">
<div class="col-12 mb-4">
<RadzenTemplateForm Data="@orderInfo" Submit="@(((OrderInfo args) => { Submit(args); }))">
<RadzenFieldset Text="@myText.WriteOrder">
<RadzenRow Gap="1rem">
<RadzenColumn Size="4">
<RadzenRow AlignItems="AlignItems.Center">
<RadzenColumn Size="4">
<RadzenLabel Text="@myText.OrderNo" Component="OrderNo" />
</RadzenColumn>
<RadzenColumn Size="8">
<RadzenTextBox @bind-Value="orderInfo.OrderNo" Style="width: 100%;" Name="OrderNo"></RadzenTextBox>
<RadzenRequiredValidator Text="@myText.InputOrderTips" Component="OrderNo" />
</RadzenColumn>
</RadzenRow>
</RadzenColumn>
<RadzenColumn Size="4">
<RadzenRow AlignItems="AlignItems.Center">
<RadzenColumn Size="4">
<RadzenLabel Text="@myText.OrderDate" Component="OrderDate" />
</RadzenColumn>
<RadzenColumn Size="8">
<RadzenDatePicker DateFormat="yyyy-MM-dd HH:mm:ss" CurrentDateChanged="@OnCurrentDateChanged"
ShowTime="true" ShowSeconds="true"
@bind-Value="orderInfo.OrderDate" Style="width: 100%;" Name="OrderDate" />
<RadzenRequiredValidator Text="@myText.InputOrderDate" Component="OrderDate" />
</RadzenColumn>
</RadzenRow>
</RadzenColumn>
<RadzenColumn Size="4">
<RadzenRow AlignItems="AlignItems.Center">
<RadzenColumn Size="4">
<RadzenLabel Text="@myText.PatientName" Component="PatientName" />
</RadzenColumn>
<RadzenColumn Size="8">
<RadzenTextBox @bind-Value="orderInfo.PatientName" Style="width: 100%;" Name="PatientName"></RadzenTextBox>
<RadzenRequiredValidator Text="@myText.InputPatientName" Component="PatientName" />
</RadzenColumn>
</RadzenRow>
</RadzenColumn>
<RadzenColumn Size="2">
<RadzenRow AlignItems="AlignItems.Center">
<RadzenColumn Size="4">
<RadzenLabel Text="@myText.Sex" Component="Sex" />
</RadzenColumn>
<RadzenColumn Size="8">
<RadzenTextBox @bind-Value="orderInfo.Sex" Style="width: 100%;" Name="Sex"></RadzenTextBox>
<RadzenRequiredValidator Text="@myText.InputPatientSex" Component="Sex" />
</RadzenColumn>
</RadzenRow>
</RadzenColumn>
<RadzenColumn Size="2">
<RadzenRow AlignItems="AlignItems.Center">
<RadzenColumn Size="4">
<RadzenLabel Text="@myText.Age" Component="Age" />
</RadzenColumn>
<RadzenColumn Size="8">
<RadzenTextBox @bind-Value="orderInfo.Age" Style="width: 100%;" Name="Age"></RadzenTextBox>
<RadzenRequiredValidator Text="@myText.InputPatientAge" Component="Age" />
</RadzenColumn>
</RadzenRow>
</RadzenColumn>
<RadzenColumn Size="4">
<RadzenRow AlignItems="AlignItems.Center">
<RadzenColumn Size="4">
<RadzenLabel Text="@myText.OrderDoctor" Component="DoctorName" />
</RadzenColumn>
<RadzenColumn Size="8">
<RadzenTextBox @bind-Value="orderInfo.DoctorName" Style="width: 100%;" Name="DoctorName"></RadzenTextBox>
<RadzenRequiredValidator Text="@myText.Doctor" Component="DoctorName" />
</RadzenColumn>
</RadzenRow>
</RadzenColumn>
<RadzenColumn Size="4">
<RadzenRow AlignItems="AlignItems.Center">
<RadzenColumn Size="4">
<RadzenLabel Text="@myText.DeptName" Component="DeptName" />
</RadzenColumn>
<RadzenColumn Size="8">
<RadzenTextBox @bind-Value="orderInfo.DeptName" Style="width: 100%;" Name="DeptName"></RadzenTextBox>
<RadzenRequiredValidator Text="@myText.InputDept" Component="DeptName" />
</RadzenColumn>
</RadzenRow>
</RadzenColumn>
<RadzenColumn Size="6">
<RadzenRow AlignItems="AlignItems.Center">
<RadzenColumn Size="2">
<RadzenLabel Text="@myText.Diagnose" Component="Disease" />
</RadzenColumn>
<RadzenColumn Size="10">
<RadzenTextBox @bind-Value="orderInfo.Disease" Style="width: 100%;" Name="Disease"></RadzenTextBox>
<RadzenRequiredValidator Text="@myText.InputDisease" Component="Disease" />
</RadzenColumn>
</RadzenRow>
</RadzenColumn>
<RadzenColumn Size="6">
<RadzenStack Orientation="Orientation.Horizontal" AlignItems="AlignItems.Center" JustifyContent="JustifyContent.SpaceBetween">
<RadzenButton Size="ButtonSize.Large" ButtonType="ButtonType.Submit" Disabled="@(detailsToInsert.Count() > 0 || detailsToUpdate.Count() > 0)" Text="@myText.Confirm" />
<RadzenButton Size="ButtonSize.Large" Icon="add_circle_outline" ButtonStyle="ButtonStyle.Success" Click="@InsertRow" Disabled="@(detailsToInsert.Count() > 0)" Text="@myText.Add" />
</RadzenStack>
</RadzenColumn>
</RadzenRow>
</RadzenFieldset>
</RadzenTemplateForm>
</div>
<div class="col-12 mb-4">
<RadzenDataGrid @ref="grid"
EmptyText="@myText.AddNewOrder"
Data="@orderDetails"
EditMode="DataGridEditMode.Single"
RowUpdate="@((OrderDetail od) => { OnUpdateRow(od); })" RowCreate="@((OrderDetail od) => { OnCreateRow(od); })"
AllowColumnResize="true" AllowAlternatingRows="false"
SelectionMode="DataGridSelectionMode.Single">
<Columns>
<RadzenDataGridColumn Title="@myText.DrugName" Property="Drug.DrugName">
<EditTemplate Context="od">
<RadzenDropDownDataGrid AllowVirtualization="true" Name="Drug" TValue="DrugInfo" @bind-Value="od.Drug" Data="@drugInfos" Style="width:100%; display: block;" AllowFilteringByAllStringColumns="true">
<Columns>
<RadzenDropDownDataGridColumn Property="DrugId" Title="@myText.DrugCode" />
<RadzenDropDownDataGridColumn Property="DrugName" Width="120px" Title="@myText.DrugName" />
<RadzenDropDownDataGridColumn Property="DrugSpec" Title="@myText.Spec" />
<RadzenDropDownDataGridColumn Property="StockQuantity" Title="@myText.Inventory" Frozen="true" FrozenPosition="FrozenColumnPosition.Right" />
</Columns>
</RadzenDropDownDataGrid>
<RadzenCustomValidator Style="position: absolute;z-index: 9999;" Component="Drug" Validator="@(() => !String.IsNullOrEmpty(od.Drug.DrugId))" Text="@myText.SelectDrug" />
<RadzenCustomValidator Component="Drug" Validator="@(() => ValidateDrug(od.Drug))" Text="@myText.HasSelect" />
</EditTemplate>
</RadzenDataGridColumn>
<RadzenDataGridColumn Title="@myText.Spec" Property="Drug.DrugSpec"></RadzenDataGridColumn>
<RadzenDataGridColumn Title="@myText.Quantity" Property="Quantity">
<EditTemplate Context="od">
<RadzenNumeric Style="width:100%; display: block;" Name="Quantity" @bind-Value=@od.Quantity />
<RadzenNumericRangeValidator Style="position: absolute;z-index: 9999;" Min="1" Max="@od.Drug.StockQuantity" Text="@myText.InputTips" Component="Quantity" />
</EditTemplate>
</RadzenDataGridColumn>
<RadzenDataGridColumn Context="detail" Filterable="false" Sortable="false" TextAlign="TextAlign.Right" Frozen="true" FrozenPosition="FrozenColumnPosition.Right">
<Template Context="detail">
<RadzenButton Icon="edit" ButtonStyle="ButtonStyle.Light" Variant="Variant.Flat" Size="ButtonSize.Medium" Click="@(args => EditRow(detail))" @onclick:stopPropagation="true">
</RadzenButton>
<RadzenButton ButtonStyle="ButtonStyle.Danger" Icon="delete" Variant="Variant.Flat" Shade="Shade.Lighter" Size="ButtonSize.Medium" class="my-1 ms-1" Click="@(args => DeleteRow(detail))" @onclick:stopPropagation="true">
</RadzenButton>
</Template>
<EditTemplate Context="detail">
<RadzenButton Icon="check" ButtonStyle="ButtonStyle.Success" Variant="Variant.Flat" Size="ButtonSize.Medium" Click="@((args) => SaveRow(detail))" aria-label="Save">
</RadzenButton>
<RadzenButton Icon="close" ButtonStyle="ButtonStyle.Light" Variant="Variant.Flat" Size="ButtonSize.Medium" class="my-1 ms-1" Click="@((args) => CancelEdit(detail))" aria-label="Cancel">
</RadzenButton>
<RadzenButton ButtonStyle="ButtonStyle.Danger" Icon="delete" Variant="Variant.Flat" Shade="Shade.Lighter" Size="ButtonSize.Medium" class="my-1 ms-1" Click="@(args => DeleteRow(detail))" aria-label="Delete">
</RadzenButton>
</EditTemplate>
</RadzenDataGridColumn>
</Columns>
</RadzenDataGrid>
</div>
</div>
</div>
@code {
@inject IChannelListDao channelListDao;
@inject IDrugInfoDao drugInfoDao;
@inject NotificationService _message
@inject DialogService dialogService;
@inject Toolbelt.Blazor.I18nText.I18nText I18nText;
private I18nText.local myText = new I18nText.local();
RadzenDataGrid<OrderDetail> grid;
List<OrderDetail> orderDetails = new();
List<DrugInfo> drugInfos = new();
List<OrderDetail> detailsToInsert = new();
List<OrderDetail> detailsToUpdate = new();
OrderInfo orderInfo = new OrderInfo()
{
OrderDate = DateTime.Now
};
void Reset()
{
detailsToInsert.Clear();
detailsToUpdate.Clear();
}
void Reset(OrderDetail orderDetail)
{
detailsToInsert.Remove(orderDetail);
detailsToUpdate.Remove(orderDetail);
}
async Task InsertRow()
{
Reset();
var orderDetail = new OrderDetail();
detailsToInsert.Add(orderDetail);
await grid.InsertRow(orderDetail);
}
async Task EditRow(OrderDetail orderDetail)
{
Reset();
detailsToUpdate.Add(orderDetail);
await grid.EditRow(orderDetail);
}
async Task SaveRow(OrderDetail orderDetail)
{
await grid.UpdateRow(orderDetail);
}
void CancelEdit(OrderDetail orderDetail)
{
Reset(orderDetail);
grid.CancelEditRow(orderDetail);
grid.Reload();
}
async Task DeleteRow(OrderDetail orderDetail)
{
Reset(orderDetail);
orderDetails.Remove(orderDetail);
grid.CancelEditRow(orderDetail);
await grid.Reload();
}
void OnUpdateRow(OrderDetail orderDetail)
{
Reset(orderDetail);
grid.Reload();
}
void OnCreateRow(OrderDetail orderDetail)
{
// 数据库添加用户
detailsToInsert.Remove(orderDetail);
orderDetails.Add(orderDetail);
grid.Reload();
}
async void Submit(OrderInfo orderInfo)
{
if (orderDetails.Count == 0)
{
_message.Notify(
new NotificationMessage { Severity = NotificationSeverity.Error, Summary = myText.Tips, Detail = $"请添加用药详情", Duration = 3000 }
);
}
else
{
//弹出待取药品所在库位、库存信息
var b = await dialogService.OpenAsync<SelfTakeDialog>(
myText.TakeDetail,
new Dictionary<string, object>() { { "order", orderInfo }, { "orderDetails", orderDetails } },
new DialogOptions() { Width = "85vw", Resizable = true, Draggable = true, ShowClose = false }
);
if (b)
{
_message.Notify(
new NotificationMessage { Severity = NotificationSeverity.Success, Summary = myText.Tips, Detail = $"取药完成", Duration = 3000 }
);
}
}
}
async Task reloadGrid()
{
await grid.Reload();
}
bool ValidateDrug(DrugInfo drugInfo)
{
return !orderDetails.Any(od => od.Drug.DrugId.Equals(drugInfo?.DrugId));
}
protected override async Task OnInitializedAsync()
{
myText = await I18nText.GetTextTableAsync<I18nText.local>(this);
drugInfos = await drugInfoDao.GetAllDrugAndStock();
base.OnInitializedAsync();
}
void OnCurrentDateChanged(DateTime args)
{
orderInfo.OrderDate = new DateTime(args.Year, args.Month, args.Day, args.Hour, args.Minute, args.Second);
}
}