195 lines
6.8 KiB
Plaintext
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;
|
|
}
|
|
}
|