zxl
2025-12-02 4f2c9b54c8d0f358f3b7c6821f091a493b24e006
ycl-server/src/main/java/com/ycl/platform/service/impl/WorkOrderServiceImpl.java
@@ -150,14 +150,76 @@
        List<String> serialNumberList = workOrderList.stream().map(WorkOrder::getSerialNumber).collect(Collectors.toList());
        // 查出数据库中国标码对应的未完成的工单
        List<WorkOrder> inDatabaseWorkOrderList = baseMapper.getNotFinishedWorkOrders(serialNumberList);
        inDatabaseWorkOrderList.stream().forEach(item -> {
            if (StringUtils.hasText(item.getErrorType())) {
                item.setErrorTypeList(List.of(item.getErrorType().split(",")));
        log.info("打印出inDatabaseWorkOrderList:{}",inDatabaseWorkOrderList);
        // 2. 按 serialNumber 分组,合并错误类型
        Map<String, WorkOrder> mergedWorkOrders = new LinkedHashMap<>();
        for (WorkOrder order : inDatabaseWorkOrderList) {
            String serialNumber = order.getSerialNumber();
            if (mergedWorkOrders.containsKey(serialNumber)) {
                // 如果序列号已存在,合并错误类型
                WorkOrder existingOrder = mergedWorkOrders.get(serialNumber);
                //判断时间先后
                boolean isExistingNewer = existingOrder.getCreateTime() != null &&
                        order.getCreateTime() != null &&
                        existingOrder.getCreateTime().after(order.getCreateTime());
                WorkOrder latestOrder = isExistingNewer ? existingOrder : order;
                WorkOrder olderOrder = isExistingNewer ? order : existingOrder;
                List<String> latestErrorTypes = latestOrder.getErrorTypeList() != null
                        ? new ArrayList<>(latestOrder.getErrorTypeList())
                        : new ArrayList<>();
                if (StringUtils.hasText(olderOrder.getErrorType())) {
                    List<String> olderErrorTypes = Arrays.asList(olderOrder.getErrorType().split(","));
                    latestErrorTypes.addAll(olderErrorTypes);
                }
                // 去重并更新错误类型
                List<String> uniqueErrorTypes = latestErrorTypes.stream()
                        .distinct()
                        .collect(Collectors.toList());
                latestOrder.setErrorTypeList(uniqueErrorTypes);
                latestOrder.setErrorType(String.join(",", uniqueErrorTypes));
                // 更新Map中的工单为最新的工单
                mergedWorkOrders.put(serialNumber, latestOrder);
            } else {
                item.setErrorTypeList(new ArrayList<>(1));
                // 如果序列号不存在,初始化错误类型列表并添加到Map
                if (StringUtils.hasText(order.getErrorType())) {
                    order.setErrorTypeList(Arrays.asList(order.getErrorType().split(",")));
                } else {
                    order.setErrorTypeList(new ArrayList<>(1));
                }
                mergedWorkOrders.put(serialNumber, order);
            }
        });
        Map<String, WorkOrder> mapping = inDatabaseWorkOrderList.stream().collect((Collectors.toMap(WorkOrder::getSerialNumber, workOrder -> workOrder)));
        }
        log.info("打印出mergedWorkOrders合并后:{}",inDatabaseWorkOrderList);
// 3. 获取合并后的工单列表(保持顺序)
//        List<WorkOrder> finalWorkOrderList = new ArrayList<>(mergedWorkOrders.values());
//        Map<String, WorkOrder> mapping = null;
//        try {
//            mapping = finalWorkOrderList.stream()
//                    .collect(Collectors.toMap(WorkOrder::getSerialNumber, workOrder -> workOrder));
//        } catch (IllegalStateException e) {
//            // 捕获键重复异常
//            System.err.println("错误:发现重复的序列号,无法创建映射");
//            System.err.println("异常详情:" + e.getMessage());
//
//            // 可选:你可以在这里处理异常,比如返回一个空Map或者使用备用策略
//            // 方案1:返回空Map
//            mapping = new HashMap<>(); // Java 9+
//
//        }
        List<WorkOrder> waitAddList = new ArrayList<>(48);
        List<WorkOrderErrorType> waitAddErrorTypeList = new ArrayList<>(48);
        Integer updateNum = 0;
@@ -169,7 +231,7 @@
        // 即将要添加的错误类型
        List<WorkOrderErrorType> willAddErrorType = new ArrayList<>(96);
        for (WorkOrder workOrder : workOrderList) {
            WorkOrder databaseWorkOrder = mapping.get(workOrder.getSerialNumber());
            WorkOrder databaseWorkOrder = mergedWorkOrders.get(workOrder.getSerialNumber());
            if (Objects.nonNull(databaseWorkOrder)) {
                //判断是否是今天的工单
                if (!isSameDay(databaseWorkOrder.getCreateTime(), now)) {