212 lines
8.8 KiB
C#
212 lines
8.8 KiB
C#
using ComponentsLibraryNet60.Models;
|
||
using ControlsLibraryNet60.Data;
|
||
using ControlsLibraryNet60.Models;
|
||
using PluginsConventionLibrary;
|
||
using PortalAccountsBusinessLogic.BusinessLogics;
|
||
using PortalAccountsContracts.BindingModels;
|
||
using PortalAccountsContracts.BusinessLogicsContracts;
|
||
using PortalAccountsContracts.ViewModels;
|
||
using PortalAccountsDatabaseImplement.Implements;
|
||
using RodionovLibrary.NonVisualComponents.HelperModels;
|
||
using System.Text;
|
||
|
||
namespace PortalAccountsView
|
||
{
|
||
public class PluginsConvention : IPluginsConvention
|
||
{
|
||
private readonly IAccountLogic _accountLogic;
|
||
private readonly IRoleLogic _roleLogic;
|
||
private readonly ControlDataTreeTable _controlDataTreeTable = new();
|
||
private readonly RodionovLibrary.NonVisualComponents.WordLongTextComponent _wordLongTextComponent = new();
|
||
private readonly ComponentsLibraryNet60.DocumentWithTable.ComponentDocumentWithTableMultiHeaderPdf _componentDocumentWithTableMultiHeaderPdf = new();
|
||
private readonly ComponentsLibraryNet60.DocumentWithChart.ComponentDocumentWithChartPieExcel _componentDocumentWithChartPieExcel = new();
|
||
|
||
public PluginsConvention()
|
||
{
|
||
_accountLogic = new AccountLogic(new AccountStorage());
|
||
_roleLogic = new RoleLogic(new RoleStorage());
|
||
ReloadData();
|
||
}
|
||
|
||
public string PluginName => "LabWork3 Plugin";
|
||
|
||
public UserControl GetControl => _controlDataTreeTable;
|
||
|
||
public PluginsConventionElement GetElement
|
||
{
|
||
get
|
||
{
|
||
var selected = _controlDataTreeTable.GetSelectedObject<AccountViewModel>()
|
||
?? throw new Exception("Не удалось получить выбранный элемент");
|
||
return new PluginsConventionAccount()
|
||
{
|
||
Id = IntToGuid(selected.Id),
|
||
Login = selected.Login,
|
||
Warnings = selected.Warnings,
|
||
RoleName = selected.RoleName,
|
||
Rating = selected.OutputRating
|
||
};
|
||
}
|
||
}
|
||
|
||
public Form GetForm(PluginsConventionElement element)
|
||
{
|
||
var formAccount = new FormAccount(_accountLogic, _roleLogic);
|
||
if (element != null)
|
||
{
|
||
formAccount.Id = element.Id.GetHashCode();
|
||
}
|
||
return formAccount;
|
||
}
|
||
|
||
public Form GetThesaurus()
|
||
{
|
||
return new FormRoles(_roleLogic);
|
||
}
|
||
|
||
public bool DeleteElement(PluginsConventionElement element)
|
||
{
|
||
return _accountLogic.Delete(
|
||
new AccountBindingModel { Id = element.Id.GetHashCode() }
|
||
);
|
||
}
|
||
|
||
public void ReloadData()
|
||
{
|
||
try
|
||
{
|
||
var accounts = _accountLogic.ReadList(null) ?? throw new Exception("Не удалось получить список аккаунтов");
|
||
|
||
_controlDataTreeTable.Clear();
|
||
|
||
var nodeNames = new Queue<string>();
|
||
nodeNames.Enqueue("RoleName");
|
||
nodeNames.Enqueue("OutputRating");
|
||
nodeNames.Enqueue("Id");
|
||
nodeNames.Enqueue("Login");
|
||
_controlDataTreeTable.LoadConfig(new DataTreeNodeConfig { NodeNames = nodeNames });
|
||
|
||
foreach (var account in accounts)
|
||
{
|
||
account.OutputRating = account.Rating?.ToString() ?? "Отсутствует";
|
||
}
|
||
_controlDataTreeTable.AddTable(accounts);
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
||
}
|
||
}
|
||
|
||
public bool CreateSimpleDocument(PluginsConventionSaveDocument saveDocument)
|
||
{
|
||
try
|
||
{
|
||
var accounts = _accountLogic.ReadList(null) ?? throw new Exception("Не удалось получить список аккаунтов");
|
||
List<string> paragraphs = new();
|
||
foreach (var account in accounts)
|
||
{
|
||
if (account.Rating == null)
|
||
{
|
||
paragraphs.Add($"{account.Login}: {(string.IsNullOrWhiteSpace(account.Warnings) ? "Предупреждения отсутствуют" : account.Warnings)}");
|
||
}
|
||
}
|
||
_wordLongTextComponent.CreateWordText(new WordLongTextInfo()
|
||
{
|
||
FileName = saveDocument.FileName,
|
||
Title = "Аккаунты без рейтинга",
|
||
Paragraphs = paragraphs.ToArray()
|
||
});
|
||
MessageBox.Show("Готово!");
|
||
return true;
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
MessageBox.Show("Произошла ошибка: " + ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
||
return false;
|
||
}
|
||
}
|
||
|
||
public bool CreateTableDocument(PluginsConventionSaveDocument saveDocument)
|
||
{
|
||
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
|
||
try
|
||
{
|
||
var accounts = _accountLogic.ReadList(null) ?? throw new Exception("Не удалось получить список аккаунтов");
|
||
foreach (var account in accounts)
|
||
{
|
||
account.OutputRating = account.Rating?.ToString() ?? "нет";
|
||
}
|
||
_componentDocumentWithTableMultiHeaderPdf.CreateDoc(new ComponentDocumentWithTableHeaderDataConfig<AccountViewModel>
|
||
{
|
||
FilePath = saveDocument.FileName,
|
||
Header = "Аккаунты портала",
|
||
ColumnsRowsWidth = new List<(int, int)> { (10, 10), (10, 10), (10, 10), (10, 10) }, // ширина столбцов и высота строк
|
||
Headers = new List<(int ColumnIndex, int RowIndex, string Header, string PropertyName)>
|
||
{
|
||
(0, 0, "Id", "Id"),
|
||
(1, 0, "Логин", "Login"),
|
||
(2, 0, "Роль", "RoleName"),
|
||
(3, 0, "Рейтинг", "OutputRating")
|
||
},
|
||
Data = accounts.OrderBy(x => x.Id).ToList()
|
||
});
|
||
MessageBox.Show("Готово!");
|
||
return true;
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
MessageBox.Show("Произошла ошибка: " + ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
||
return false;
|
||
}
|
||
}
|
||
|
||
public bool CreateChartDocument(PluginsConventionSaveDocument saveDocument)
|
||
{
|
||
try
|
||
{
|
||
var accounts = _accountLogic.ReadList(null) ?? throw new Exception("Не удалось получить список аккаунтов");
|
||
var roleMapping = new List<string>();
|
||
var data = new Dictionary<string, List<(int Date, double Value)>>
|
||
{
|
||
{
|
||
"Аккаунты",
|
||
accounts
|
||
.Where(x => x.Rating != null)
|
||
.GroupBy(x => x.RoleName)
|
||
.Select((group, index) =>
|
||
{
|
||
roleMapping.Add($"{group.Key} - {index + 1}");
|
||
|
||
return (Date: index + 1, Value: (double)group.Count());
|
||
})
|
||
.ToList()
|
||
}
|
||
};
|
||
_componentDocumentWithChartPieExcel.CreateDoc(new ComponentDocumentWithChartConfig
|
||
{
|
||
FilePath = saveDocument.FileName,
|
||
Header = $"Аккаунты с рейтингом по ролям ({string.Join(", ", roleMapping)})",
|
||
ChartTitle = "Круговая диаграмма",
|
||
LegendLocation = Location.Bottom,
|
||
Data = data
|
||
});
|
||
MessageBox.Show("Готово!");
|
||
return true;
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
MessageBox.Show("Произошла ошибка: " + ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
||
return false;
|
||
}
|
||
}
|
||
|
||
private Guid IntToGuid(int value)
|
||
{
|
||
byte[] bytes = new byte[16];
|
||
BitConverter.GetBytes(value).CopyTo(bytes, 0);
|
||
return new Guid(bytes);
|
||
}
|
||
}
|
||
}
|