inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderPlanServiceImpl.java
@@ -84,7 +84,6 @@
import java.util.concurrent.atomic.AtomicReference;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
 * 检验任务-业务实现层
@@ -380,6 +379,9 @@
    @Override
    public int uploadFile(Integer orderId, MultipartFile file) {
        if (orderId == null || file == null || file.isEmpty()) {
            throw new ErrorException("请选择要上传的附件");
        }
        String urlString;
        String pathName;
        String path;
@@ -406,7 +408,7 @@
            urlString = realpath + "/" + pathName;
            file.transferTo(new File(urlString));
            insOrderFile.setFileUrl(pathName);
            return insOrderFileMapper.insert(insOrderFile);
            return insOrderFileMapper.insert(insOrderFile) > 0 ? insOrderFile.getId() : 0;
        } catch (Exception e) {
            e.printStackTrace();
            System.err.println("附件上传错误");
@@ -1684,8 +1686,9 @@
        boolean directTemplateOrder = isDirectTemplateOrder(orderId);
        if (currentState != null && Objects.equals(currentState.getInsState(), 5)
                && existingReport != null && StringUtils.isNotBlank(existingReport.getUrl())
                && Objects.equals(existingReport.getIsPass(), 1)
                && (!directTemplateOrder || StringUtils.isNotBlank(existingReport.getInspectionUrl()))) {
            // 防止复核页面重复点击或网络重试重复生成报告、重复发起报告审批。
            // 仅对仍在报告编制中的记录防重复;退回检验任务的报告需要继续执行并恢复 is_pass。
            return 1;
        }
        if (directTemplateOrder && Objects.equals(type, 1)
@@ -1964,10 +1967,12 @@
        if (StringUtils.isBlank(tempPdfName)) {
            throw new ErrorException("报告预览文件生成失败");
        }
        // generateReport 会写入当前时间;重新生成不应改变原审批记录时间。
        // generateReport 会写入当前时间,部分报告还会暂时写入 is_pass=0;
        // 重新生成不应改变原审批记录时间和可见状态。
        insReportMapper.update(null, Wrappers.<InsReport>lambdaUpdate()
                .eq(InsReport::getId, reportId)
                .set(InsReport::getWriteTime, report.getWriteTime())
                .set(InsReport::getIsPass, report.getIsPass())
                .set(InsReport::getTempUrlPdf, "/word/" + tempPdfName));
    }
@@ -3535,7 +3540,7 @@
        String insTime = formatReportTestDate(detectionDates);
        String insTimeEn = formatReportTestDateEn(detectionDates, monthNames);
        // 检验环境:优先汇总各模板填写的温湿度,报告展示全部模板的最小值到最大值。
        // 检验环境:优先汇总各模板填写的温度,报告展示全部模板的最小值到最大值。
        String environment = buildReportEnvironment(orderId, insOrder);
        String finalEnvironment = environment;
        LocalDateTime finalSendTime = sendTime;
@@ -3619,6 +3624,7 @@
        String finalResultRemark = resultRemark;
        String equipmentText = buildEquipmentText(finalDeviceList);
        String issueDate = now.format(DateTimeFormatter.ofPattern("yyyy年MM月dd日"));
        String conclusionDate = now.format(DateTimeFormatter.ofPattern("yyyy 年 MM 月 dd 日"));
        String finalReportModelStr = finalModelStr;
        LocalDateTime finalReportSendTime = finalSendTime;
        XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
@@ -3662,6 +3668,7 @@
                    put("customer", finalCustomerName);
                    put("category", finalDetectionCategory);
                    put("date", issueDate);
                    put("conclusionDate", conclusionDate);
                    put("maker", defaultReportText(insOrder.getProduction(), "/"));
                    put("env", finalEnvironment);
                    put("qty", defaultReportText(insOrder.getTestQuantity(), "/"));
@@ -3891,12 +3898,18 @@
        for (Map<String, String> device : deviceList) {
            String name = getMapText(device, "deviceName", "device_name");
            String managementNumber = getMapText(device, "managementNumber", "management_number");
            String factoryNo = getMapText(device, "factoryNo", "factory_no");
            if (StringUtils.isBlank(name) || "/".equals(name.trim())) {
                continue;
            }
            String number = StringUtils.isBlank(managementNumber) || "/".equals(managementNumber.trim())
                    ? "出厂编号" : managementNumber.trim();
            String item = name.trim() + ":" + number;
            String number = managementNumber;
            if (StringUtils.isBlank(number) || "/".equals(number.trim())) {
                number = factoryNo;
            }
            if (StringUtils.isBlank(number) || "/".equals(number.trim())) {
                continue;
            }
            String item = name.trim() + ":" + number.trim();
            equipmentItems.add(item);
        }
        if (equipmentItems.isEmpty()) {
@@ -3915,22 +3928,12 @@
        List<InsOrderStandardTemplate> snapshots = insOrderStandardTemplateService.list(
                Wrappers.<InsOrderStandardTemplate>lambdaQuery()
                        .eq(InsOrderStandardTemplate::getInsOrderId, orderId)
                        .select(InsOrderStandardTemplate::getTemperature,
                                InsOrderStandardTemplate::getHumidity));
                        .select(InsOrderStandardTemplate::getTemperature));
        List<String> temperatures = snapshots.stream()
                .map(InsOrderStandardTemplate::getTemperature)
                .filter(StringUtils::isNotBlank)
                .collect(Collectors.toList());
        List<String> humidities = snapshots.stream()
                .map(InsOrderStandardTemplate::getHumidity)
                .filter(StringUtils::isNotBlank)
                .collect(Collectors.toList());
        String temperature = formatConditionRange(temperatures, order.getTemperature(), "℃");
        String humidity = formatConditionRange(humidities, order.getHumidity(), "%RH");
        return Stream.of(temperature, humidity)
                .filter(StringUtils::isNotBlank)
                .collect(Collectors.joining(" "));
        return formatConditionRange(temperatures, order.getTemperature(), "℃");
    }
    private static String formatConditionRange(List<String> values, String fallback, String unit) {