Files
medica-info/medica-info/Components/Pages/Apteka.razor
T
2026-10-22 15:59:02 +07:00

195 lines
6.8 KiB
Plaintext

@page "/apteka"
@using System.Xml
@using Microsoft.AspNetCore.Components.Web
@rendermode RenderMode.InteractiveServer
<PageTitle>Apteka</PageTitle>
<h1>Центральный склад</h1>
<div>
<InputText @onkeydown="HandleKeyPress" @bind-Value="lekInput" />
<InputSelect @bind-Value="otdValue">
<option value="">Все</option>
<option value="***Аптека НСК***">***Аптека НСК***</option>
<option value="НСК_Поликлиника">НСК_Поликлиника</option>
<option value="НСК_Стационар">НСК_Стационар</option>
<option value="НСК_Реанимация">НСК_Реанимация</option>
<option value="НСК_Лаборатория">НСК_Лаборатория</option>
<option value="НСК_Оперблок">НСК_Оперблок</option>
<option value="НСК_Лучевая диагностика">НСК_Лучевая диагностика</option>
<option value="НСК_ЦСО">НСК_ЦСО</option>
<option value="НСК_Дневной стационар">НСК_Дневной стационар</option>
</InputSelect>
<button class="btn btn-primary" @onclick="OnSearchClicked">Поиск</button>
</div>
@if (apteka == null || apteka.Count == 0)
{
<p><em>Данные не найдены или загружаются...</em></p>
}
else
{
<p>Актуальная информация по базе в ООО "Медика НСК", на <label> 07:00 "@DateTime.Now.ToString("dd-MM-yyyy")"</label></p>
<form>
<table class="table">
<thead>
<tr>
<th>Название лекарств</th>
<th>МНН</th>
<th>Ед. изм. отпуска</th>
<th>Цена</th>
<th>Всего</th>
<th>Склад нахождения</th>
</tr>
</thead>
<tbody>
@foreach (var item in apteka)
{
<tr>
<td>@item.lekName</td>
<td>@item.lekNameMNN</td>
<td>@item.qty</td>
<td>@item.price</td>
<td>@item.available</td>
<td>@item.OTD</td>
</tr>
}
</tbody>
<tfoot>
ООО "Медика НСК" - эта ионформация является справочной, актуальные остатки уточняйте.
</tfoot>
</table>
</form>
}
@code {
private List<AptekaFore> apteka = new List<AptekaFore>();
private string lekInput { set; get; } = string.Empty;
private string lekInputMNN { set; get; } = string.Empty;
private string otdValue { set; get; } = string.Empty;
private string data { set; get; } = string.Empty;
protected override async Task OnInitializedAsync()
{
string filter = string.IsNullOrWhiteSpace(lekInput) ? null : lekInput.Trim();
string filterOTD = string.IsNullOrWhiteSpace(otdValue) ? null : otdValue.Trim();
await LoadAndFilterAptekaAsync(filter, filterOTD);
}
private async Task OnSearchClicked()
{
string filter = string.IsNullOrWhiteSpace(lekInput) ? null : lekInput.Trim();
string filterOTD = string.IsNullOrWhiteSpace(otdValue) ? null : otdValue.Trim();
await LoadAndFilterAptekaAsync(filter, filterOTD);
}
private async Task HandleKeyPress(KeyboardEventArgs keyboardEventArgs)
{
if (keyboardEventArgs.Code == "Enter")
{
await OnSearchClicked();
}
}
private async Task LoadAndFilterAptekaAsync(string? filter, string? filterOTD)
{
// string file = @"/Medica/Apteka/price.xml";
string file = @"/app/Data/Apteka/price.xml";
XmlDocument xml = new XmlDocument();
xml.Load(file);
XmlElement? root = xml.DocumentElement;
apteka.Clear();
if (root != null)
{
foreach (XmlElement row in root.ChildNodes)
{
if (row.Name != "ROW")
continue;
var prodNode = row.SelectSingleNode("PROD");
if (prodNode == null)
continue;
if (!string.IsNullOrEmpty(filter) &&
!prodNode.InnerText.Contains(filter, StringComparison.OrdinalIgnoreCase))
{
continue;
}
AptekaFore item = new AptekaFore();
foreach (XmlNode child in row.ChildNodes)
{
switch (child.Name)
{
case "PROD":
item.lekName = child.InnerText;
break;
case "UNIT":
item.qty = child.InnerText;
break;
case "PRICE1":
item.price = PriceEdit(child.InnerText);
break;
case "QTY":
item.available = qtyForF2(child.InnerText);
break;
case "OTD":
item.OTD = child.InnerText;
break;
}
}
if (!string.IsNullOrEmpty(filterOTD) &&
!item.OTD.Equals(filterOTD, StringComparison.OrdinalIgnoreCase))
{
continue;
}
apteka.Add(item);
}
}
StateHasChanged();
await Task.CompletedTask;
}
private string PriceEdit(string value)
{
if (float.TryParse(value.Replace('.', '.'), out float val))
{
if (val < 10000)
return (val *= 1.8f).ToString("F2");
else if (val < 25000)
return (val *= 1.6f).ToString("F2");
else if (val < 100000)
return (val *= 1.5f).ToString("F2");
else if (val < 500000)
return (val *= 1.35f).ToString("F2");
else
return (val *= 1.25f).ToString("F2");
}
return value;
}
private string qtyForF2(string value)
{
float val = float.Parse(value);
int vali =(int)MathF.Round(val);
if (vali == 0) return value;
return vali.ToString();
}
private class AptekaFore
{
public string lekName { get; set; } = string.Empty;
public string lekNameMNN { get; set; } = string.Empty;
public string qty { get; set; } = string.Empty;
public string price { get; set; } = string.Empty;
public string available { get; set; } = string.Empty;
public string OTD { get; set; } = string.Empty;
}
}