final version, reports with names, loading many-to-many entity
This commit is contained in:
parent
c62dd35f93
commit
bce2e9612a
@ -14,7 +14,7 @@ public class Contract
|
|||||||
public int ExecutorID { get; private set; }
|
public int ExecutorID { get; private set; }
|
||||||
|
|
||||||
[DisplayName("Заказчик")]
|
[DisplayName("Заказчик")]
|
||||||
public int CustomerName { get; private set; }
|
public string CustomerName { get; private set; } = string.Empty;
|
||||||
|
|
||||||
[Browsable(false)]
|
[Browsable(false)]
|
||||||
public ExecutorPost ExecutorPost { get; private set; }
|
public ExecutorPost ExecutorPost { get; private set; }
|
||||||
@ -60,21 +60,6 @@ public class Contract
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Contract CreateEntity(TempServiceContract tempServiceContract, IEnumerable<Service> services)
|
|
||||||
{
|
|
||||||
return new Contract
|
|
||||||
{
|
|
||||||
Id = tempServiceContract.Id,
|
|
||||||
CustomerID = tempServiceContract.CustomerID,
|
|
||||||
ExecutorID = tempServiceContract.ExecutorID,
|
|
||||||
Category = tempServiceContract.Category,
|
|
||||||
ConclusionDate = tempServiceContract.ConclusionDate,
|
|
||||||
Deadline = tempServiceContract.Deadline,
|
|
||||||
PaymentAmount = tempServiceContract.PaymentAmount,
|
|
||||||
Services = services
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
public void SetServices(IEnumerable<Service> services)
|
public void SetServices(IEnumerable<Service> services)
|
||||||
{
|
{
|
||||||
if (services != null && services.Any())
|
if (services != null && services.Any())
|
||||||
|
@ -12,11 +12,8 @@ public class ServiceContract
|
|||||||
[Browsable(false)]
|
[Browsable(false)]
|
||||||
public int ContractId { get; private set; }
|
public int ContractId { get; private set; }
|
||||||
|
|
||||||
[DisplayName("Заказчик")]
|
[DisplayName("Описание услуги")]
|
||||||
public int CustomerName { get; private set; }
|
public string ServiceDescription { get; private set; } = string.Empty;
|
||||||
|
|
||||||
[DisplayName("Исполнитель")]
|
|
||||||
public int ExecutorName { get; private set; }
|
|
||||||
|
|
||||||
public static ServiceContract CreateElement(int id, int serviceId, int contractId)
|
public static ServiceContract CreateElement(int id, int serviceId, int contractId)
|
||||||
{
|
{
|
||||||
|
@ -39,7 +39,7 @@ internal class ChartReport
|
|||||||
{
|
{
|
||||||
return _contractRepository
|
return _contractRepository
|
||||||
.ReadContracts(dateFrom: dateTime.Date, dateTo: dateTime.Date.AddDays(1))
|
.ReadContracts(dateFrom: dateTime.Date, dateTo: dateTime.Date.AddDays(1))
|
||||||
.GroupBy(x => x.CustomerID, (key, group) => new
|
.GroupBy(x => x.CustomerName, (key, group) => new
|
||||||
{
|
{
|
||||||
Id = key,
|
Id = key,
|
||||||
Count = group.Sum(x => x.Services.Count())
|
Count = group.Sum(x => x.Services.Count())
|
||||||
|
@ -46,21 +46,18 @@ internal class TableReport
|
|||||||
.GroupBy(x => x.ConclusionDate)
|
.GroupBy(x => x.ConclusionDate)
|
||||||
.Select(x => new
|
.Select(x => new
|
||||||
{
|
{
|
||||||
x.First().ExecutorID,
|
x.First().ExecutorFullName,
|
||||||
Date = x.First().ConclusionDate,
|
Date = x.First().ConclusionDate,
|
||||||
CountIn = (int?)x.Count(),
|
CountIn = (int?)x.Count(),
|
||||||
CountOut = (int?)null
|
CountOut = (int?)null
|
||||||
})
|
})
|
||||||
.Union(
|
.Union(
|
||||||
_contractRepository
|
_contractRepository
|
||||||
.ReadContracts()
|
.ReadContracts(customerId: customerId, dateFrom: startDate, dateTo: endDate)
|
||||||
.Where(x => x.Deadline >= startDate
|
|
||||||
&& x.Deadline <= endDate
|
|
||||||
&& x.CustomerID == customerId)
|
|
||||||
.GroupBy(x => x.Deadline)
|
.GroupBy(x => x.Deadline)
|
||||||
.Select(x => new
|
.Select(x => new
|
||||||
{
|
{
|
||||||
x.First().ExecutorID,
|
x.First().ExecutorFullName,
|
||||||
Date = x.First().Deadline,
|
Date = x.First().Deadline,
|
||||||
CountIn = (int?)null,
|
CountIn = (int?)null,
|
||||||
CountOut = (int?)x.Count()
|
CountOut = (int?)x.Count()
|
||||||
@ -71,7 +68,7 @@ internal class TableReport
|
|||||||
|
|
||||||
return new List<string[]>() { item }
|
return new List<string[]>() { item }
|
||||||
.Union(data.Select(x => new string[] {
|
.Union(data.Select(x => new string[] {
|
||||||
x.ExecutorID.ToString(),
|
x.ExecutorFullName,
|
||||||
x.Date.ToString(),
|
x.Date.ToString(),
|
||||||
x.CountIn?.ToString() ?? string.Empty,
|
x.CountIn?.ToString() ?? string.Empty,
|
||||||
x.CountOut?.ToString() ?? string.Empty
|
x.CountOut?.ToString() ?? string.Empty
|
||||||
|
@ -101,10 +101,12 @@ public class ContractRepository : IContractRepository
|
|||||||
|
|
||||||
using var connection = new NpgsqlConnection(_connectionString.ConnectionString);
|
using var connection = new NpgsqlConnection(_connectionString.ConnectionString);
|
||||||
var querySelect = @$"
|
var querySelect = @$"
|
||||||
SELECT c.*, sc.ServiceId, s.Description,
|
SELECT c.*,
|
||||||
CONCAT(cu.Name, ' ', cu.Contact) as CustomerName,
|
CONCAT(cu.Name, ' ', cu.Contact) as CustomerName,
|
||||||
e.Post as ExecutorPost,
|
e.Post as ExecutorPost,
|
||||||
e.Name as ExecutorName
|
e.Name as ExecutorName,
|
||||||
|
sc.ServiceId,
|
||||||
|
s.Description as ServiceDescription
|
||||||
FROM Contracts c
|
FROM Contracts c
|
||||||
INNER JOIN ServiceContract sc ON sc.ContractId = c.Id
|
INNER JOIN ServiceContract sc ON sc.ContractId = c.Id
|
||||||
LEFT JOIN Services s ON sc.ServiceId = s.Id
|
LEFT JOIN Services s ON sc.ServiceId = s.Id
|
||||||
@ -112,9 +114,35 @@ public class ContractRepository : IContractRepository
|
|||||||
LEFT JOIN Executors e ON e.Id = c.ExecutorId
|
LEFT JOIN Executors e ON e.Id = c.ExecutorId
|
||||||
{builder.Build()};
|
{builder.Build()};
|
||||||
";
|
";
|
||||||
var serviceDict = new Dictionary<int, List<Service>>();
|
|
||||||
var contracts = connection.Query<Contract, Service>(querySelect, new { dateFrom, dateTo, customerId, executorId });
|
var contractsDict = new Dictionary<int, List<ServiceContract>>();
|
||||||
|
|
||||||
|
var contracts = connection.Query<Contract, ServiceContract, Contract>(querySelect, (contract, serviceContract) =>
|
||||||
|
{
|
||||||
|
if (!contractsDict.TryGetValue(contract.Id, out var sc))
|
||||||
|
{
|
||||||
|
sc = [];
|
||||||
|
contractsDict.Add(contract.Id, sc);
|
||||||
|
}
|
||||||
|
|
||||||
|
sc.Add(serviceContract);
|
||||||
|
return contract;
|
||||||
|
}, splitOn: "ServiceId", param: new
|
||||||
|
{
|
||||||
|
dateFrom,
|
||||||
|
dateTo,
|
||||||
|
customerId,
|
||||||
|
executorId
|
||||||
|
});
|
||||||
_logger.LogDebug("Полученные объекты: {json}", JsonConvert.SerializeObject(contracts));
|
_logger.LogDebug("Полученные объекты: {json}", JsonConvert.SerializeObject(contracts));
|
||||||
|
|
||||||
|
return contractsDict.Select(x =>
|
||||||
|
{
|
||||||
|
var c = contracts.First(y => y.Id == x.Key);
|
||||||
|
c.SetServices(x.Value.Select(x => Service.CreateEntity(x.ServiceId, x.ServiceDescription)));
|
||||||
|
return c;
|
||||||
|
}).ToArray();
|
||||||
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
_logger.LogError(ex, "Ошибка при чтении объектов");
|
_logger.LogError(ex, "Ошибка при чтении объектов");
|
||||||
|
Loading…
x
Reference in New Issue
Block a user