oee修复,提交app同步以及质保书

This commit is contained in:
2026-05-13 17:09:00 +08:00
parent f0b68382e3
commit 7a4f8a4a29
2 changed files with 83 additions and 27 deletions

View File

@@ -39,16 +39,20 @@ public class GalvanizeOeeServiceImpl implements IGalvanizeOeeService {
List<AcidOeeDailySummaryVo> summaries = galvanizeOeeMasterMapper.selectDailySummary(startDate, endDate, galvanizeCreateBy);
if (summaries == null || summaries.isEmpty()) return Collections.emptyList();
Map<String, Long> downtimeByDate = aggregateDowntimeByDate(startDate, endDate);
Map<String, Long> plannedDowntimeByDate = new HashMap<>();
Map<String, Long> downtimeByDate = aggregateDowntimeByDate(startDate, endDate, plannedDowntimeByDate);
Map<String, List<CoilInfo>> coilInfoByDate = getCoilNosByDate(startDate, endDate);
List<BigDecimal> dailyCycles = new ArrayList<>();
for (AcidOeeDailySummaryVo s : summaries) {
s.setLineId("DX1");
s.setLineName("镀锌一线");
Long plannedDowntime = plannedDowntimeByDate.getOrDefault(s.getStatDate(), 0L);
Long loading = Math.max(0, 1440 - plannedDowntime);
s.setPlannedDowntimeMin(plannedDowntime);
s.setLoadingTimeMin(loading);
Long downtime = downtimeByDate.getOrDefault(s.getStatDate(), 0L);
s.setDowntimeMin(downtime);
Long loading = s.getLoadingTimeMin() == null ? 0L : s.getLoadingTimeMin();
Long run = Math.max(0, loading - downtime);
s.setRunTimeMin(run);
BigDecimal ton = s.getTotalOutputTon();
@@ -230,15 +234,62 @@ public class GalvanizeOeeServiceImpl implements IGalvanizeOeeService {
}
}
private Map<String, Long> aggregateDowntimeByDate(String startDate, String endDate) {
/**
* 按日期聚合停机时间,同时将计划停机写入 plannedDowntimeOut。
* - "计划停机" stopType 不计入 OEE 停机时间,也不计入负荷时间。
* - 跨天事件按实际分钟数拆分到各天。
*/
private Map<String, Long> aggregateDowntimeByDate(String startDate, String endDate,
Map<String, Long> plannedDowntimeOut) {
List<Klptcm1ProStoppageVo> events = getStoppageEvents(startDate, endDate);
Map<String, Long> map = new HashMap<>();
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
Calendar cal = Calendar.getInstance();
for (Klptcm1ProStoppageVo e : events) {
if (e.getStartDate() == null || e.getDuration() == null || e.getDuration() <= 0) continue;
long min = Math.max(1, (e.getDuration() + 59) / 60);
map.merge(df.format(e.getStartDate()), min, Long::sum);
boolean isPlanned = "计划停机".equals(e.getStopType());
Map<String, Long> targetMap = isPlanned ? plannedDowntimeOut : map;
Date eventStart = e.getStartDate();
long durationSec = e.getDuration();
long durationMin = (durationSec + 59) / 60;
cal.setTime(eventStart);
cal.add(Calendar.SECOND, (int) durationSec);
Date eventEnd = cal.getTime();
String startDateStr = df.format(eventStart);
String endDateStr = df.format(eventEnd);
if (startDateStr.equals(endDateStr)) {
targetMap.merge(startDateStr, durationMin, Long::sum);
} else {
cal.setTime(eventStart);
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
Date currentDayStart = cal.getTime();
while (currentDayStart.before(eventEnd)) {
cal.setTime(currentDayStart);
cal.add(Calendar.DAY_OF_MONTH, 1);
Date nextDayStart = cal.getTime();
Date dayEnd = nextDayStart.before(eventEnd) ? nextDayStart : eventEnd;
long dayMinutes = Math.max(0, (dayEnd.getTime() - Math.max(currentDayStart.getTime(), eventStart.getTime())) / (1000 * 60));
if (dayMinutes > 0) {
targetMap.merge(df.format(currentDayStart), dayMinutes, Long::sum);
}
currentDayStart = nextDayStart;
}
}
}
return map;
}