Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
148 changes: 148 additions & 0 deletions Wintime-Control-Frontend/src/views/reports/AssetsReportView.vue
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,8 @@
<el-select v-model="reportType" class="w-48">
<el-option label="Пресс-формы" value="Molds" />
<el-option label="Наладчики" value="Personnel" />
<el-option label="Пресс-формы по ТПА" value="MoldsByImm" />
<el-option label="Наладчики по ТПА" value="PersonnelByImm" />
</el-select>
</el-form-item>
<el-form-item>
Expand Down Expand Up @@ -117,6 +119,7 @@
<el-table :data="reportData?.personnelData || []" stripe style="width: 100%">
<el-table-column prop="fullName" label="Наладчик" min-width="200" />
<el-table-column prop="completedTasks" label="Выполнено заданий" width="140" align="center" />
<el-table-column prop="workedShifts" label="Отработано смен" width="140" align="center" />
<el-table-column prop="totalWorkSeconds" label="Время работы (ч)" width="140">
<template #default="{ row }">
{{ (row.totalWorkSeconds / 3600).toFixed(2) }}
Expand All @@ -127,6 +130,151 @@
{{ (row.avgSetupTime / 60).toFixed(1) }}
</template>
</el-table-column>
<el-table-column label="Общее время наладки (ч)" width="160" align="center">
<template #default="{ row }">
{{ row.totalSetupSeconds ? (row.totalSetupSeconds / 3600).toFixed(1) : '—' }}
</template>
</el-table-column>
</el-table>
</el-card>

<!-- Таблица: Наладчики по ТПА -->
<el-card v-loading="loading" v-if="reportType === 'PersonnelByImm'">
<el-table
:data="reportData?.personnelByImmData || []"
row-key="personnelId"
stripe
style="width: 100%"
>
<el-table-column type="expand">
<template #default="{ row }">
<div v-if="row.immBreakdown.length > 0">
<div
v-for="imm in row.immBreakdown"
:key="imm.immId"
class="flex items-center text-sm text-gray-500 py-1.5 border-b border-gray-100 last:border-0"
>
<div class="flex-1 pl-6" style="min-width: 200px">{{ imm.immName }}</div>
<div class="text-center" style="width: 150px">{{ imm.completedTasks }}</div>
<div class="text-center" style="width: 150px">{{ (imm.totalWorkSeconds / 3600).toFixed(2) }}</div>
<div class="text-center" style="width: 170px">{{ imm.avgSetupTime ? (imm.avgSetupTime / 60).toFixed(1) : '—' }}</div>
<div class="text-center" style="width: 160px">{{ imm.totalSetupSeconds ? (imm.totalSetupSeconds / 3600).toFixed(1) : '—' }}</div>
</div>
</div>
<div v-else class="py-2 pl-6 text-gray-400 text-sm">Нет данных за период</div>
</template>
</el-table-column>
<el-table-column prop="fullName" label="Наладчик" min-width="200" />
<el-table-column prop="completedTasks" label="Выполнено заданий" width="150" align="center" />
<el-table-column prop="workedShifts" label="Отработано смен" width="140" align="center" />
<el-table-column label="Время работы (ч)" width="150" align="center">
<template #default="{ row }">
{{ (row.totalWorkSeconds / 3600).toFixed(2) }}
</template>
</el-table-column>
<el-table-column label="Ср. время наладки (мин)" width="170" align="center">
<template #default="{ row }">
{{ (row.avgSetupTime / 60).toFixed(1) }}
</template>
</el-table-column>
<el-table-column label="Общее время наладки (ч)" width="160" align="center">
<template #default="{ row }">
{{ row.totalSetupSeconds ? (row.totalSetupSeconds / 3600).toFixed(1) : '—' }}
</template>
</el-table-column>
</el-table>
</el-card>

<!-- Таблица: Пресс-формы по ТПА -->
<el-card v-loading="loading" v-if="reportType === 'MoldsByImm'">
<el-table
:data="reportData?.moldsByImmData || []"
row-key="moldId"
stripe
style="width: 100%"
>
<el-table-column type="expand">
<template #default="{ row }">
<div v-if="row.immBreakdown.length > 0">
<div
v-for="imm in row.immBreakdown"
:key="imm.immId"
class="flex items-center text-sm text-gray-500 py-1.5 border-b border-gray-100 last:border-0"
>
<div class="flex-1 pl-6" style="min-width: 200px">{{ imm.immName }}</div>
<div class="text-center" style="width: 120px">{{ imm.totalCycles }}</div>
<div class="text-center" style="width: 130px">{{ imm.workHours?.toFixed(2) || '0.00' }}</div>
<div style="width: 630px"></div>
</div>
</div>
<div v-else class="py-2 pl-6 text-gray-400 text-sm">Нет данных за период</div>
</template>
</el-table-column>
<el-table-column prop="moldName" label="Пресс-форма" min-width="200" />
<el-table-column prop="totalCycles" label="Смыканий" width="120" align="center" />
<el-table-column prop="workHours" label="Наработка (часы)" width="130" align="center">
<template #default="{ row }">
{{ row.workHours?.toFixed(2) || '0.00' }}
</template>
</el-table-column>
<el-table-column prop="to1Cycles" label="ТО-1" width="120" align="center">
<template #default="{ row }">
<span v-if="row.to1Cycles">
<el-tag :type="row.allTimeTotalCycles >= row.to1Cycles ? 'danger' : 'info'" size="small">
{{ row.to1Cycles.toLocaleString() }}
</el-tag>
</span>
<span v-else class="text-gray-400">—</span>
</template>
</el-table-column>
<el-table-column prop="to2Cycles" label="ТО-2" width="120" align="center">
<template #default="{ row }">
<span v-if="row.to2Cycles">
<el-tag :type="row.allTimeTotalCycles >= row.to2Cycles ? 'danger' : 'info'" size="small">
{{ row.to2Cycles.toLocaleString() }}
</el-tag>
</span>
<span v-else class="text-gray-400">—</span>
</template>
</el-table-column>
<el-table-column label="Ресурс" width="210" align="left">
<template #default="{ row }">
<div class="flex items-center gap-2">
<div class="flex-shrink-0 w-4 flex justify-center">
<el-icon v-if="row.remainingResource < 10000" color="#F56C6C" :size="15"><CircleCloseFilled /></el-icon>
<el-icon v-else-if="row.remainingResource < 50000" color="#E6A23C" :size="15"><WarningFilled /></el-icon>
<el-icon v-else color="#909399" :size="15"><CircleCheckFilled /></el-icon>
</div>
<div class="flex-1 text-xs leading-tight min-w-0">
<div>{{ row.allTimeTotalCycles.toLocaleString() }} / {{ row.maxResourceCycles.toLocaleString() }}</div>
<el-progress
:percentage="Math.min(100, Math.round(row.allTimeTotalCycles / row.maxResourceCycles * 100))"
:show-text="false"
:color="row.remainingResource < 10000 ? '#F56C6C' : row.remainingResource < 50000 ? '#E6A23C' : '#409EFF'"
:stroke-width="6"
class="mt-1"
/>
</div>
</div>
</template>
</el-table-column>
<el-table-column label="Износ" width="70" align="center">
<template #default="{ row }">
<span
class="text-xs font-medium tabular-nums"
:class="row.remainingResource < 10000 ? 'text-red-500' : row.remainingResource < 50000 ? 'text-yellow-500' : 'text-gray-400'"
>
{{ Math.min(100, Math.round(row.allTimeTotalCycles / row.maxResourceCycles * 100)) }}%
</span>
</template>
</el-table-column>
<el-table-column prop="remainingResource" label="Остаток" width="110" align="center">
<template #default="{ row }">
<el-tag :type="row.remainingResource < 10000 ? 'danger' : row.remainingResource < 50000 ? 'warning' : 'success'">
{{ row.remainingResource.toLocaleString() }}
</el-tag>
</template>
</el-table-column>
</el-table>
</el-card>
</div>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@
<el-option
v-for="shift in shifts"
:key="shift.id"
:label="`Смена ${shift.number} (${shift.startTime}–${shift.endTime})`"
:label="`Смена ${shift.number}: (${shift.startTime}–${shift.endTime})`"
:value="shift.id"
/>
</el-select>
Expand Down
15 changes: 15 additions & 0 deletions Wintime.Control.Core/DTOs/Report/AssetsMoldByImmItemDto.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
namespace Wintime.Control.Core.DTOs.Report;

public class AssetsMoldByImmItemDto
{
public Guid MoldId { get; set; }
public string? MoldName { get; set; }
public int TotalCycles { get; set; }
public decimal WorkHours { get; set; }
public int MaxResourceCycles { get; set; }
public int? To1Cycles { get; set; }
public int? To2Cycles { get; set; }
public int AllTimeTotalCycles { get; set; }
public int RemainingResource { get; set; }
public List<AssetsMoldImmBreakdownDto> ImmBreakdown { get; set; } = [];
}
9 changes: 9 additions & 0 deletions Wintime.Control.Core/DTOs/Report/AssetsMoldImmBreakdownDto.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
namespace Wintime.Control.Core.DTOs.Report;

public class AssetsMoldImmBreakdownDto
{
public Guid ImmId { get; set; }
public string? ImmName { get; set; }
public int TotalCycles { get; set; }
public decimal WorkHours { get; set; }
}
13 changes: 13 additions & 0 deletions Wintime.Control.Core/DTOs/Report/AssetsPersonnelByImmItemDto.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
namespace Wintime.Control.Core.DTOs.Report;

public class AssetsPersonnelByImmItemDto
{
public string PersonnelId { get; set; } = string.Empty;
public string? FullName { get; set; }
public int CompletedTasks { get; set; }
public int TotalWorkSeconds { get; set; }
public decimal AvgSetupTime { get; set; }
public int TotalSetupSeconds { get; set; }
public int WorkedShifts { get; set; }
public List<AssetsPersonnelImmBreakdownDto> ImmBreakdown { get; set; } = [];
}
11 changes: 11 additions & 0 deletions Wintime.Control.Core/DTOs/Report/AssetsPersonnelImmBreakdownDto.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
namespace Wintime.Control.Core.DTOs.Report;

public class AssetsPersonnelImmBreakdownDto
{
public Guid ImmId { get; set; }
public string? ImmName { get; set; }
public int CompletedTasks { get; set; }
public int TotalWorkSeconds { get; set; }
public decimal AvgSetupTime { get; set; }
public int TotalSetupSeconds { get; set; }
}
2 changes: 2 additions & 0 deletions Wintime.Control.Core/DTOs/Report/AssetsPersonnelItemDto.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,6 @@ public class AssetsPersonnelItemDto
public int CompletedTasks { get; set; }
public int TotalWorkSeconds { get; set; }
public decimal AvgSetupTime { get; set; }
public int TotalSetupSeconds { get; set; }
public int WorkedShifts { get; set; }
}
2 changes: 2 additions & 0 deletions Wintime.Control.Core/DTOs/Report/AssetsReportDto.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,6 @@ public class AssetsReportDto
public string ReportType { get; set; } = string.Empty;
public List<AssetsMoldItemDto>? MoldData { get; set; }
public List<AssetsPersonnelItemDto>? PersonnelData { get; set; }
public List<AssetsMoldByImmItemDto>? MoldsByImmData { get; set; }
public List<AssetsPersonnelByImmItemDto>? PersonnelByImmData { get; set; }
}
9 changes: 9 additions & 0 deletions Wintime.Control.Core/Entities/Shift.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,14 @@
namespace Wintime.Control.Core.Entities;

/// <summary>
/// Рабочая смена. Задаёт временной интервал работы и перерыв внутри суток.
/// Все временны́е значения хранятся в минутах от начала суток (0 = 00:00).
/// </summary>
/// <remarks>
/// Смен может быть несколько; их интервалы не должны перекрываться.
/// Смена может переходить через полночь: если <c>StartMinutes + DurationMinutes &gt; 1440</c>,
/// она заканчивается в следующих сутках.
/// </remarks>
public class Shift : BaseEntity
{
public int StartMinutes { get; set; }
Expand Down
Loading
Loading