#
Junjie
1 天以前 7b87595a7379c7b250233e2bfcbf8b44ab4a539d
src/main/java/com/zy/asrs/service/impl/WrkAnalysisServiceImpl.java
@@ -16,6 +16,8 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.stream.Collectors;
@@ -28,7 +30,8 @@
            WrkStsType.SETTLE_INBOUND.sts,
            WrkStsType.COMPLETE_OUTBOUND.sts,
            WrkStsType.SETTLE_OUTBOUND.sts,
            WrkStsType.COMPLETE_LOC_MOVE.sts
            WrkStsType.COMPLETE_LOC_MOVE.sts,
            WrkStsType.COMPLETE_CRN_MOVE.sts
    );
    private static final String MODE_TASK = "TASK";
    private static final String MODE_TIME = "TIME";
@@ -184,7 +187,9 @@
        entity.setRgvNo(wrkMast.getRgvNo());
        entity.setFinalWrkSts(wrkMast.getWrkSts());
        entity.setUpdateTime(time);
        if (Objects.equals(wrkMast.getIoType(), WrkIoType.LOC_MOVE.id) && entity.getStationDurationMs() == null) {
        if ((Objects.equals(wrkMast.getIoType(), WrkIoType.LOC_MOVE.id)
                || Objects.equals(wrkMast.getIoType(), WrkIoType.CRN_MOVE.id))
                && entity.getStationDurationMs() == null) {
            entity.setStationDurationMs(0L);
        }
        this.updateById(entity);
@@ -223,7 +228,9 @@
        if (entity.getAppeTime() != null) {
            entity.setTotalDurationMs(durationMs(entity.getAppeTime(), time));
        }
        if (Objects.equals(wrkMast.getIoType(), WrkIoType.LOC_MOVE.id) && entity.getStationDurationMs() == null) {
        if ((Objects.equals(wrkMast.getIoType(), WrkIoType.LOC_MOVE.id)
                || Objects.equals(wrkMast.getIoType(), WrkIoType.CRN_MOVE.id))
                && entity.getStationDurationMs() == null) {
            entity.setStationDurationMs(0L);
        }
        FaultSummary faultSummary = buildFaultSummary(wrkMast.getWrkNo(), time);
@@ -263,6 +270,7 @@
        ioTypes.add(option("1", "IN", "入库", WrkIoType.IN.id));
        ioTypes.add(option("2", "OUT", "出库", WrkIoType.OUT.id));
        ioTypes.add(option("3", "LOC_MOVE", "移库", WrkIoType.LOC_MOVE.id));
        ioTypes.add(option("4", "CRN_MOVE", "堆垛机移动", WrkIoType.CRN_MOVE.id));
        List<Map<String, Object>> timeFields = new ArrayList<>();
        timeFields.add(option(TIME_FIELD_FINISH, TIME_FIELD_FINISH, "完成时间", TIME_FIELD_FINISH));
        timeFields.add(option(TIME_FIELD_APPE, TIME_FIELD_APPE, "创建时间", TIME_FIELD_APPE));
@@ -464,6 +472,10 @@
        summary.put("taskEndTime", taskEndTime);
        summary.put("taskEndTime$", formatDate(taskEndTime));
        summary.put("taskDurationMs", taskStartTime == null || taskEndTime == null ? null : durationMs(taskStartTime, taskEndTime));
        summary.put("avgTaskBeatDurationMs", list.isEmpty() || taskStartTime == null || taskEndTime == null
                ? null
                : durationMs(taskStartTime, taskEndTime) / list.size());
        summary.put("avgTaskPerHour", calculateAvgTaskPerHour(list.size(), summary.get("taskDurationMs")));
        summary.put("avgTotalDurationMs", average(list, item -> item.getTotalDurationMs() != null, WrkAnalysis::getTotalDurationMs));
        summary.put("avgStationDurationMs", average(list, item -> !METRIC_PARTIAL.equals(item.getMetricCompleteness()) && item.getStationDurationMs() != null, WrkAnalysis::getStationDurationMs));
        summary.put("avgCraneDurationMs", average(list, item -> !METRIC_PARTIAL.equals(item.getMetricCompleteness()) && item.getCraneDurationMs() != null, WrkAnalysis::getCraneDurationMs));
@@ -813,6 +825,9 @@
        if (Objects.equals(ioType, WrkIoType.LOC_MOVE.id)) {
            return "移库";
        }
        if (Objects.equals(ioType, WrkIoType.CRN_MOVE.id)) {
            return "堆垛机移动";
        }
        return String.valueOf(ioType);
    }
@@ -839,6 +854,19 @@
        return count == 0 ? null : total / count;
    }
    private Double calculateAvgTaskPerHour(int taskCount, Object taskDurationMsValue) {
        if (taskCount <= 0 || !(taskDurationMsValue instanceof Number)) {
            return null;
        }
        long taskDurationMs = ((Number) taskDurationMsValue).longValue();
        if (taskDurationMs <= 0L) {
            return null;
        }
        return BigDecimal.valueOf(taskCount * 3600000D / taskDurationMs)
                .setScale(2, RoundingMode.HALF_UP)
                .doubleValue();
    }
    private void applyRange(QueryWrapper<WrkMastLog> wrapper, String column, String rawValue) {
        if (Cools.isEmpty(rawValue) || !rawValue.contains("~")) {
            return;