Selaa lähdekoodia

解决导出可能为负数的问题

wukai 11 kuukautta sitten
vanhempi
commit
7db844b96c

+ 2 - 2
ruoyi-admin/src/main/java/com/ruoyi/biz/tools/Tools.java

@@ -220,7 +220,7 @@ public class Tools {
     public static Pair<Date, Date> teamA(LocalDate localDate) {
         LocalDateTime ldt = LocalDateTime.of(localDate, LocalTime.MIN);
         LocalDateTime start = ldt.plusHours(7);
-        LocalDateTime end = start.plusHours(11).minusSeconds(1);
+        LocalDateTime end = start.plusHours(12).minusSeconds(1);
         Date sTime = Date.from(start.atZone(ZoneId.systemDefault()).toInstant());
         Date eTime = Date.from(end.atZone(ZoneId.systemDefault()).toInstant());
         return new Pair<>(sTime, eTime);
@@ -235,7 +235,7 @@ public class Tools {
     public static Pair<Date, Date> teamB(LocalDate localDate) {
         LocalDateTime ldt = LocalDateTime.of(localDate, LocalTime.MIN);
         LocalDateTime start = ldt.plusHours(19);
-        LocalDateTime end = start.plusHours(11).minusSeconds(1);
+        LocalDateTime end = start.plusHours(12).minusSeconds(1);
         Date sTime = Date.from(start.atZone(ZoneId.systemDefault()).toInstant());
         Date eTime = Date.from(end.atZone(ZoneId.systemDefault()).toInstant());
         return new Pair<>(sTime, eTime);

+ 139 - 0
ruoyi-admin/src/test/java/com/jjt/CalcDayTest.java

@@ -1,13 +1,33 @@
 package com.jjt;
 
 import com.ruoyi.RuoYiApplication;
+import com.ruoyi.biz.domain.TwinCalcAlarms;
+import com.ruoyi.biz.domain.TwinCalcDay;
+import com.ruoyi.biz.domain.TwinCalcHour;
+import com.ruoyi.biz.domain.TwinCalcStop;
+import com.ruoyi.biz.mapper.TwinCalcDayMapper;
+import com.ruoyi.biz.service.ITwinCalcAlarmsService;
 import com.ruoyi.biz.service.ITwinCalcDayService;
+import com.ruoyi.biz.service.ITwinCalcHourService;
+import com.ruoyi.biz.service.ITwinCalcStopService;
+import com.ruoyi.biz.tools.Tools;
+import javafx.util.Pair;
 import org.junit.jupiter.api.Test;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.jdbc.core.JdbcTemplate;
 
 import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.time.LocalDate;
+import java.time.ZoneOffset;
+import java.util.Date;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.atomic.AtomicLong;
+import java.util.function.BiConsumer;
+import java.util.stream.Collectors;
 
 /**
  * DataProcess$
@@ -21,6 +41,12 @@ public class CalcDayTest {
     private JdbcTemplate jdbcTemplate;
     @Resource
     private ITwinCalcDayService dayService;
+    @Resource
+    private ITwinCalcHourService hourService;
+    @Resource
+    private ITwinCalcStopService stopService;
+    @Resource
+    private ITwinCalcAlarmsService alarmsService;
 
     public static void main(String[] args) {
         LocalDate localDate = LocalDate.parse("2024-06-27");
@@ -39,4 +65,117 @@ public class CalcDayTest {
 //        dayService.calc4date(localDate);
     }
 
+    @Test
+    void test1() {
+        LocalDate localDate = LocalDate.parse("2024-06-27");
+        Date date = Date.from(localDate.atStartOfDay(ZoneOffset.of("+8")).toInstant());
+        //计算统计时间
+        Pair<Date, Date> pair = Tools.calcDay(localDate);
+        Date sTime = pair.getKey();
+        Date eTime = pair.getValue();
+        List<TwinCalcHour> hourList = hourService.selectTwinCalcHourListByDate(sTime, eTime);
+        hourList = hourList.stream().filter(d -> d.getDeviceId().equals(10L)).collect(Collectors.toList());
+        List<TwinCalcStop> stopList = stopService.selectTwinCalcStopListByDate(sTime, eTime);
+        List<TwinCalcAlarms> alarmsList = alarmsService.selectTwinCalcAlarmsListByDate(sTime, eTime);
+        Pair<Date, Date> teamPairA = Tools.teamA(localDate);
+        Pair<Date, Date> teamPairB = Tools.teamB(localDate);
+        // 提取A班和B班的开始和结束时间,避免在循环中重复调用
+        Date startTimeA = teamPairA.getKey();
+        Date endTimeA = teamPairA.getValue();
+        Date startTimeB = teamPairB.getKey();
+        Date endTimeB = teamPairB.getValue();
+        Map<Long, List<TwinCalcHour>> hourDeviceGroup = hourList.stream().collect(Collectors.groupingBy(TwinCalcHour::getDeviceId, LinkedHashMap::new, Collectors.toList()));
+        for (Map.Entry<Long, List<TwinCalcHour>> entry : hourDeviceGroup.entrySet()) {
+            List<TwinCalcHour> hours = entry.getValue();
+            TwinCalcDay day = new TwinCalcDay(date);
+            day.setDeviceId(entry.getKey());
+            //计算产量数据
+            day.calcHours(hours);
+            //计算停机数据
+            List<TwinCalcStop> stops = stopList.stream().filter(s -> s.getDeviceId().equals(entry.getKey())).collect(Collectors.toList());
+            AtomicLong closeA = new AtomicLong(0L);
+            AtomicLong closeB = new AtomicLong(0L);
+            //A班停机计数
+            BiConsumer<Integer, Integer> updateDayA = (type, count) -> {
+                switch (type) {
+                    case 1:
+                        day.setStop1A(day.getStop1A() + count);
+                        break;
+                    case 2:
+                        day.setStop2A(day.getStop2A() + count);
+                        break;
+                    case 3:
+                        day.setStop3A(day.getStop3A() + count);
+                        break;
+                    default:
+                }
+            };
+
+            BiConsumer<Integer, Integer> updateDayB = (type, count) -> {
+                switch (type) {
+                    case 1:
+                        day.setStop1B(day.getStop1B() + count);
+                        break;
+                    case 2:
+                        day.setStop2B(day.getStop2B() + count);
+                        break;
+                    case 3:
+                        day.setStop3B(day.getStop3B() + count);
+                        break;
+                    default:
+                }
+            };
+
+            // 使用Stream API,结合if-else逻辑的优化
+            stops.stream().forEach(stop -> {
+                // 根据停机时间判断属于哪个班次
+                boolean isAshift = !stop.getStartTime().after(endTimeA) && !stop.getEndTime().before(startTimeA);
+                Date shiftStart = isAshift ? startTimeA : startTimeB;
+                Date shiftEnd = isAshift ? endTimeA : endTimeB;
+                AtomicLong totalStopTime = isAshift ? closeA : closeB;
+                BiConsumer<Integer, Integer> eventCounter = isAshift ? updateDayA : updateDayB;
+
+                // 调整停机时间
+                if (stop.getEndTime().compareTo(shiftEnd) > 0) {
+                    stop.setEndTime(shiftEnd);
+                }
+                if (stop.getStartTime().compareTo(shiftStart) < 0) {
+                    stop.setStartTime(shiftStart);
+                }
+
+                // 计算并更新停机时间和事件计数
+                long stopTime = (stop.getEndTime().getTime() - stop.getStartTime().getTime()) / 1000;
+                updateStopCounters(stopTime, stop.getStopType(), totalStopTime, eventCounter);
+            });
+
+            //计算稼动率
+            //AB班排班时间,要乘以设备总数
+            long teamTimeA = 12L * 60 * 60;
+            long teamTimeB = 12L * 60 * 60;
+            long totalTeamTime = teamTimeA + teamTimeB;
+
+            long openTimeA = teamTimeA - closeA.get();
+            long openTimeB = teamTimeB - closeB.get();
+            long totalOpenTime = openTimeA + openTimeB;
+            BigDecimal ea = BigDecimal.valueOf(openTimeA).divide(BigDecimal.valueOf(teamTimeA), 2, RoundingMode.HALF_UP);
+            BigDecimal eb = BigDecimal.valueOf(openTimeB).divide(BigDecimal.valueOf(teamTimeB), 2, RoundingMode.HALF_UP);
+            BigDecimal ee = BigDecimal.valueOf(totalOpenTime).divide(BigDecimal.valueOf(totalTeamTime), 2, RoundingMode.HALF_UP);
+            day.setOpenTimeA(BigDecimal.valueOf(openTimeA));
+            day.setOpenTimeB(BigDecimal.valueOf(openTimeB));
+            day.setCloseTimeA(BigDecimal.valueOf(closeA.get()));
+            day.setCloseTimeB(BigDecimal.valueOf(closeB.get()));
+            day.setEfficiencyA(ea);
+            day.setEfficiencyB(eb);
+            day.setEfficiency(ee);
+            List<TwinCalcAlarms> alarms = alarmsList.stream().filter(a -> a.getDeviceId().equals(entry.getKey())).collect(Collectors.toList());
+            day.setAlarm((long) alarms.size());
+        }
+    }
+
+    void updateStopCounters(long stopTime, int stopType, AtomicLong
+            totalTimeCounter, BiConsumer<Integer, Integer> eventCounterUpdater) {
+        totalTimeCounter.addAndGet(stopTime);
+        eventCounterUpdater.accept(stopType, 1);
+    }
+
 }