liding
2026-09-01 bf2026a38d4d36371060673d4651b6e05ca90632
cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceServiceImpl.java
@@ -547,17 +547,18 @@
            throw new RuntimeException("导入文件没有设备数据");
        }
        Set<String> managementNumbers = new HashSet<>();
        Set<String> fileKeys = new HashSet<>();
        for (int i = 0; i < rows.size(); i++) {
            String managementNumber = required(rows.get(i).getManagementNumber(), i + 2, "管理编号");
            if (!managementNumbers.add(managementNumber)) {
                throw new RuntimeException("第" + (i + 2) + "行:管理编号" + managementNumber + "在文件中重复");
            String deviceName = required(rows.get(i).getDeviceName(), i + 2, "仪器名称");
            String specificationModel = required(rows.get(i).getSpecificationModel(), i + 2, "规格型号");
            if (!fileKeys.add(deviceKey(deviceName, specificationModel, managementNumber))) {
                throw new RuntimeException("第" + (i + 2) + "行:仪器名称+规格型号+管理编号在文件中重复");
            }
        }
        Set<String> existingNumbers = baseMapper.selectList(Wrappers.<Device>lambdaQuery()
                        .in(Device::getManagementNumber, managementNumbers)
                        .select(Device::getManagementNumber))
                .stream().map(Device::getManagementNumber).collect(Collectors.toSet());
        Set<String> existingKeys = baseMapper.selectList(Wrappers.<Device>lambdaQuery()
                        .select(Device::getDeviceName, Device::getSpecificationModel, Device::getManagementNumber))
                .stream().map(d -> deviceKey(d.getDeviceName(), d.getSpecificationModel(), d.getManagementNumber())).collect(Collectors.toSet());
        Map<String, List<SysDept>> departmentMap = sysDeptMapper.selectDeptList(new SysDept()).stream()
                .filter(item -> StringUtils.isNotBlank(item.getDeptName()))
@@ -573,8 +574,10 @@
            int rowNumber = i + 2;
            DeviceImport row = rows.get(i);
            String managementNumber = required(row.getManagementNumber(), rowNumber, "管理编号");
            if (existingNumbers.contains(managementNumber)) {
                throw new RuntimeException("第" + rowNumber + "行:管理编号" + managementNumber + "已存在");
            String deviceName = required(row.getDeviceName(), rowNumber, "仪器名称");
            String specificationModel = required(row.getSpecificationModel(), rowNumber, "规格型号");
            if (existingKeys.contains(deviceKey(deviceName, specificationModel, managementNumber))) {
                throw new RuntimeException("第" + rowNumber + "行:仪器名称“" + deviceName + "”+规格型号“" + specificationModel + "”+管理编号“" + managementNumber + "”已存在");
            }
            String laboratoryName = required(row.getLaboratoryName(), rowNumber, "所属部门");
@@ -584,10 +587,10 @@
            }
            Device device = new Device();
            device.setDeviceName(required(row.getDeviceName(), rowNumber, "仪器名称"));
            device.setSpecificationModel(required(row.getSpecificationModel(), rowNumber, "规格型号"));
            device.setDeviceName(deviceName);
            device.setSpecificationModel(specificationModel);
            device.setManagementNumber(managementNumber);
            device.setActivationDate(parseDate(row.getActivationDate(), rowNumber, "校准有效期", true));
            device.setActivationDate(parseDate(row.getActivationDate()));
            device.setSubordinateDepartmentsId(departments.get(0).getDeptId().intValue());
            device.setDeviceStatus(Integer.valueOf(dictValue(statusMap, row.getDeviceStatus(), rowNumber, "当前状态", true)));
            device.setCalibrationDate(required(row.getCalibrationDate(), rowNumber, "校准周期(月)"));
@@ -596,12 +599,12 @@
            device.setFactoryNo(trim(row.getFactoryNo()));
            device.setAssetCode(trim(row.getAssetCode()));
            device.setOrigin(trim(row.getOrigin()));
            device.setAcquisitionDate(parseDate(row.getAcquisitionDate(), rowNumber, "购置日期", false));
            device.setAcquisitionDate(parseDate(row.getAcquisitionDate()));
            device.setStoragePoint(trim(row.getStoragePoint()));
            device.setTechnicalIndicators(trim(row.getTechnicalIndicators()));
            device.setCalibrationServices(trim(row.getCalibrationServices()));
            device.setLastCalibrationDate(parseDate(row.getLastCalibrationDate(), rowNumber, "最近校准日期", false));
            device.setNextCalibrationDate(parseDate(row.getNextCalibrationDate(), rowNumber, "下次校准日期", false));
            device.setLastCalibrationDate(parseDate(row.getLastCalibrationDate()));
            device.setNextCalibrationDate(parseDate(row.getNextCalibrationDate()));
            device.setLargeCategory(dictValue(typeMap, row.getLargeCategory(), rowNumber, "设备类型", false));
            device.setUnitPrice(parseDecimal(row.getUnitPrice(), rowNumber, "单价(万元)"));
@@ -642,19 +645,16 @@
        return value;
    }
    private LocalDateTime parseDate(String input, int rowNumber, String column, boolean required) {
    private LocalDateTime parseDate(String input) {
        String text = trim(input);
        if (StringUtils.isBlank(text)) {
            if (required) {
                throw new RuntimeException("第" + rowNumber + "行:" + column + "不能为空");
            }
            return null;
        }
        String datePart = text.replace('/', '-').split("\\s+")[0];
        try {
            return LocalDate.parse(text.substring(0, Math.min(text.length(), 10)).replace('/', '-'), DateTimeFormatter.ofPattern("yyyy-M-d"))
                    .atStartOfDay();
            return LocalDate.parse(datePart, DateTimeFormatter.ofPattern("yyyy-M-d")).atStartOfDay();
        } catch (Exception e) {
            throw new RuntimeException("第" + rowNumber + "行:" + column + "格式应为yyyy-MM-dd", e);
            return null;
        }
    }
@@ -678,6 +678,12 @@
        return value;
    }
    private String deviceKey(String deviceName, String specificationModel, String managementNumber) {
        return (deviceName == null ? "" : deviceName.trim()) + "|"
                + (specificationModel == null ? "" : specificationModel.trim()) + "|"
                + (managementNumber == null ? "" : managementNumber.trim());
    }
    private String trim(String value) {
        return value == null ? null : value.trim();
    }