From 3056ee733c1c00cc75c4cadd4aa35987732f756d Mon Sep 17 00:00:00 2001
From: 吴羡 <16976746+Xian-TT3@user.noreply.gitee.com>
Date: 星期三, 04 十一月 2026 14:52:34 +0800
Subject: [PATCH] 修复检验委托单导出问题

---
 cnas-process/src/main/java/com/ruoyi/process/service/impl/InspectionOrderServiceImpl.java |  637 +++++++++++++++++++++++++++++++++++++++++++++++++++++----
 1 files changed, 592 insertions(+), 45 deletions(-)

diff --git a/cnas-process/src/main/java/com/ruoyi/process/service/impl/InspectionOrderServiceImpl.java b/cnas-process/src/main/java/com/ruoyi/process/service/impl/InspectionOrderServiceImpl.java
index 3bf8cd5..b8c2066 100644
--- a/cnas-process/src/main/java/com/ruoyi/process/service/impl/InspectionOrderServiceImpl.java
+++ b/cnas-process/src/main/java/com/ruoyi/process/service/impl/InspectionOrderServiceImpl.java
@@ -3,6 +3,7 @@
 import cn.hutool.core.util.StrUtil;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@@ -20,6 +21,7 @@
 import com.ruoyi.inspect.service.InsOrderService;
 import com.ruoyi.inspect.service.InsReportService;
 import com.ruoyi.inspect.util.HackLoopTableRenderPolicy;
+import com.ruoyi.process.dto.InspectionOrderDetailExportDto;
 import com.ruoyi.process.dto.InspectionOrderDto;
 import com.ruoyi.process.dto.InspectionOrderExportDto;
 import com.ruoyi.process.mapper.InspectionOrderMapper;
@@ -90,14 +92,86 @@
 
 
     /**
-     * 妫�楠屽鎵樺崟鍒嗛〉鏌ヨ
-     * @param page
-     * @param InspectionOrder
-     * @return
+     * 妫�楠屽鎵樺崟鍒嗛〉鏌ヨ锛氬悓涓�鎵规鐨勬牱鍝佸悎骞舵垚涓�琛屽睍绀恒��
+     * 杩囨护鏉′欢鍏堝尮閰嶈鍗曪紝鍐嶆寜鎵规琛ュ叏鎴愬憳锛屾渶鍚庡湪鍐呭瓨閲屽垎缁勫拰鍒嗛〉銆�
      */
     @Override
-    public IPage<InspectionOrderDto> pageInspectionOrder(Page page, InspectionOrder InspectionOrder) {
-        return baseMapper.pageInspectionOrder(page, QueryWrappers.queryWrappers(InspectionOrder));
+    public IPage<InspectionOrderDto> pageInspectionOrder(Page page, InspectionOrder inspectionOrderQuery) {
+        QueryWrapper<InspectionOrder> queryWrapper = QueryWrappers.queryWrappers(inspectionOrderQuery);
+        queryWrapper.orderByDesc("create_time").orderByDesc("inspection_order_id");
+        List<InspectionOrder> matched = baseMapper.selectList(queryWrapper);
+
+        Page<InspectionOrderDto> result = new Page<>(page.getCurrent(), page.getSize(), 0);
+        if (matched.isEmpty()) {
+            result.setRecords(Collections.emptyList());
+            return result;
+        }
+
+        Set<String> batchNos = matched.stream()
+                .map(InspectionOrder::getBatchNo)
+                .filter(StrUtil::isNotBlank)
+                .collect(Collectors.toSet());
+        List<InspectionOrder> allOrders = new ArrayList<>(matched);
+        if (!batchNos.isEmpty()) {
+            Set<Integer> matchedIds = matched.stream()
+                    .map(InspectionOrder::getInspectionOrderId)
+                    .collect(Collectors.toSet());
+            allOrders.addAll(baseMapper.selectList(Wrappers.<InspectionOrder>lambdaQuery()
+                    .in(InspectionOrder::getBatchNo, batchNos)
+                    .notIn(InspectionOrder::getInspectionOrderId, matchedIds)));
+        }
+
+        Map<String, List<InspectionOrder>> membersByGroup = allOrders.stream()
+                .collect(Collectors.groupingBy(this::batchGroupKey));
+        Map<Integer, String> groupKeyById = allOrders.stream()
+                .collect(Collectors.toMap(InspectionOrder::getInspectionOrderId, this::batchGroupKey, (first, ignored) -> first));
+        Map<String, Integer> detailCountByGroup = new HashMap<>();
+        List<InspectionOrderDetail> details = inspectionOrderDetailService.list(
+                Wrappers.<InspectionOrderDetail>lambdaQuery()
+                        .in(InspectionOrderDetail::getInspectionOrderId, groupKeyById.keySet())
+                        .select(InspectionOrderDetail::getInspectionOrderId));
+        for (InspectionOrderDetail detail : details) {
+            String groupKey = groupKeyById.get(detail.getInspectionOrderId());
+            if (groupKey != null) {
+                detailCountByGroup.merge(groupKey, 1, Integer::sum);
+            }
+        }
+
+        // 鎸夊尮閰嶈鍗曠殑鍏堝悗椤哄簭杈撳嚭鍒嗙粍锛涗唬琛ㄥ崟鍥哄畾鍙栫粍鍐呮渶鏃╃殑璁㈠崟锛屼繚璇佺炕椤电ǔ瀹�
+        LinkedHashMap<String, InspectionOrder> orderedGroups = new LinkedHashMap<>();
+        for (InspectionOrder order : matched) {
+            orderedGroups.putIfAbsent(batchGroupKey(order), order);
+        }
+        List<InspectionOrderDto> groups = new ArrayList<>();
+        for (Map.Entry<String, InspectionOrder> entry : orderedGroups.entrySet()) {
+            List<InspectionOrder> members = membersByGroup.getOrDefault(entry.getKey(),
+                    Collections.singletonList(entry.getValue()));
+            InspectionOrder representative = members.stream()
+                    .min(Comparator.comparing(InspectionOrder::getInspectionOrderId))
+                    .orElse(entry.getValue());
+            InspectionOrderDto dto = new InspectionOrderDto();
+            BeanUtils.copyProperties(representative, dto);
+            dto.setMemberCount(members.size());
+            dto.setDetailCount(detailCountByGroup.getOrDefault(entry.getKey(), 0));
+            groups.add(dto);
+        }
+
+        long total = groups.size();
+        int from = (int) Math.min(total, Math.max(0L, (page.getCurrent() - 1) * page.getSize()));
+        int to = (int) Math.min(total, from + page.getSize());
+        result.setTotal(total);
+        result.setRecords(from >= to ? Collections.emptyList() : new ArrayList<>(groups.subList(from, to)));
+        return result;
+    }
+
+    private String batchGroupKey(InspectionOrder order) {
+        return StrUtil.isBlank(order.getBatchNo()) ? "#" + order.getInspectionOrderId() : order.getBatchNo();
+    }
+
+    private List<InspectionOrder> listBatchMembers(String batchNo) {
+        return baseMapper.selectList(Wrappers.<InspectionOrder>lambdaQuery()
+                .eq(InspectionOrder::getBatchNo, batchNo)
+                .orderByAsc(InspectionOrder::getInspectionOrderId));
     }
 
     /**
@@ -146,14 +220,7 @@
         /*鏂板7.8鎶ュ憡缁撴灉*/
         ProcessReport processReport = new ProcessReport();
         processReport.setInspectionOrderId(inspectionOrder.getInsOrderId());
-        processReport.setInsReportCode(inspectionOrder.getEntrustCode());//鎶ュ憡缂栧彿=濮旀墭缂栧彿
-        //椤垫暟
-        try {
-            com.aspose.words.Document doc = new com.aspose.words.Document(path);
-            processReport.setPages(doc.getPageCount()+"");
-        } catch (Exception e) {
-        }
-        processReport.setNumber("1");//鍙戦�佷唤鏁伴粯璁�1
+        processReport.setInsReportCode(insReport.getCode());//鎶ュ憡缂栧彿浣跨敤姝e紡鎶ュ憡缂栧彿
         processReport.setSend(inspectionOrder.getCommissionUnit());//鍙戝線浣曞=濮旀墭鍗曚綅
         processReport.setMethod(inspectionOrder.getSend()==1?"鑷彇":"鍏朵粬");//鍙戦�佹柟寮�
         processReport.setSendTime(insReport.getRatifyTime().toLocalDate());//鍙戦�佹棩鏈�
@@ -227,6 +294,77 @@
                 .collect(Collectors.toSet());
     }
 
+    private void syncHeaderSampleFields(InspectionOrderDto inspectionOrder) {
+        if (CollectionUtils.isEmpty(inspectionOrder.getOrderDetailList())) {
+            return;
+        }
+        InspectionOrderDetail first = inspectionOrder.getOrderDetailList().get(0);
+        if (StrUtil.isNotBlank(first.getSampleName())) {
+            inspectionOrder.setSampleName(first.getSampleName());
+        }
+        if (StrUtil.isNotBlank(first.getQuantity())) {
+            inspectionOrder.setQuantity(first.getQuantity());
+        }
+        if (StrUtil.isNotBlank(first.getSampleStatus())) {
+            inspectionOrder.setSampleStatus(first.getSampleStatus());
+        }
+    }
+
+    private void applyRequirementFields(InspectionOrderDto inspectionOrder) {
+        if (inspectionOrder.getSampleDisposal() != null) {
+            inspectionOrder.setProcessing(Integer.valueOf(2).equals(inspectionOrder.getSampleDisposal()) ? 1 : 0);
+        }
+        if (inspectionOrder.getReportDelivery() != null) {
+            inspectionOrder.setSend(Integer.valueOf(1).equals(inspectionOrder.getReportDelivery()) ? 1 : 0);
+        }
+    }
+
+    private void syncInsOrderRequirement(InspectionOrderDto inspectionOrder) {
+        if (inspectionOrder.getInsOrderId() == null) {
+            return;
+        }
+        InsOrder insOrder = new InsOrder();
+        insOrder.setId(inspectionOrder.getInsOrderId());
+        insOrder.setSubcontractType(inspectionOrder.getSubcontractType());
+        if (inspectionOrder.getSubcontractType() != null) {
+            insOrder.setSubcontractCompany(Integer.valueOf(1).equals(inspectionOrder.getSubcontractType())
+                    ? (inspectionOrder.getSubcontractCompany() == null ? "" : inspectionOrder.getSubcontractCompany())
+                    : "");
+        }
+        insOrder.setSampleDisposal(inspectionOrder.getSampleDisposal());
+        insOrder.setResultEvaluation(inspectionOrder.getResultEvaluation());
+        insOrder.setReportDelivery(inspectionOrder.getReportDelivery());
+        insOrder.setReportAddress(inspectionOrder.getReportAddress());
+        insOrder.setReportReceiver(inspectionOrder.getReportReceiver());
+        if (inspectionOrder.getSampleDisposal() != null) {
+            insOrder.setProcessing(inspectionOrder.getProcessing());
+        }
+        if (inspectionOrder.getReportDelivery() != null) {
+            insOrder.setSend(inspectionOrder.getSend());
+        }
+        insOrderService.updateById(insOrder);
+    }
+
+    private void fillRequirementFields(InspectionOrder inspectionOrder, InspectionOrderDto dto, InsOrder insOrder) {
+        Integer sampleDisposal = insOrder == null ? null : insOrder.getSampleDisposal();
+        if (sampleDisposal == null) {
+            sampleDisposal = inspectionOrder.getProcessing() != null && inspectionOrder.getProcessing() == 1 ? 2 : 1;
+        }
+        Integer reportDelivery = insOrder == null ? null : insOrder.getReportDelivery();
+        if (reportDelivery == null) {
+            reportDelivery = inspectionOrder.getSend() != null && inspectionOrder.getSend() == 1 ? 1 : 2;
+        }
+        Integer subcontractType = insOrder != null && insOrder.getSubcontractType() != null ? insOrder.getSubcontractType() : 0;
+        dto.setSubcontractType(subcontractType);
+        dto.setSubcontractCompany(subcontractType == 1 && insOrder != null && insOrder.getSubcontractCompany() != null
+                ? insOrder.getSubcontractCompany() : "");
+        dto.setSampleDisposal(sampleDisposal);
+        dto.setResultEvaluation(insOrder != null && insOrder.getResultEvaluation() != null ? insOrder.getResultEvaluation() : 0);
+        dto.setReportDelivery(reportDelivery);
+        dto.setReportAddress(insOrder != null && insOrder.getReportAddress() != null ? insOrder.getReportAddress() : "");
+        dto.setReportReceiver(insOrder != null && insOrder.getReportReceiver() != null ? insOrder.getReportReceiver() : "");
+    }
+
     /**
      * 妫�楠屽鎵樺崟淇敼
      * @param InspectionOrder
@@ -234,24 +372,143 @@
      */
     @Override
     public boolean updateInspectionOrder(InspectionOrderDto InspectionOrder) {
+        if (StrUtil.isNotBlank(InspectionOrder.getBatchNo())) {
+            return updateBatchInspectionOrder(InspectionOrder);
+        }
+        applyRequirementFields(InspectionOrder);
+        syncHeaderSampleFields(InspectionOrder);
         baseMapper.updateById(InspectionOrder);
 
-        // 鍒犻櫎涔嬪墠鐨勮鎯�
-        inspectionOrderDetailService.remove(Wrappers.<InspectionOrderDetail>lambdaQuery()
-                .eq(InspectionOrderDetail::getInspectionOrderId, InspectionOrder.getInspectionOrderId()));
+        // 鏄庣粏涓� null 琛ㄧず鏈涓嶇淮鎶ゆ槑缁嗭紝淇濈暀鍘熸暟鎹紱绌烘暟缁勮〃绀烘竻绌�
+        if (InspectionOrder.getOrderDetailList() != null) {
+            inspectionOrderDetailService.remove(Wrappers.<InspectionOrderDetail>lambdaQuery()
+                    .eq(InspectionOrderDetail::getInspectionOrderId, InspectionOrder.getInspectionOrderId()));
 
-        // 鏂板璇︽儏
-        for (InspectionOrderDetail InspectionOrderDetail : InspectionOrder.getOrderDetailList()) {
-            InspectionOrderDetail.setInspectionOrderId(InspectionOrder.getInspectionOrderId());
+            if (CollectionUtils.isNotEmpty(InspectionOrder.getOrderDetailList())) {
+                for (InspectionOrderDetail InspectionOrderDetail : InspectionOrder.getOrderDetailList()) {
+                    InspectionOrderDetail.setInspectionOrderId(InspectionOrder.getInspectionOrderId());
+                }
+                inspectionOrderDetailService.saveBatch(InspectionOrder.getOrderDetailList());
+            }
         }
-        inspectionOrderDetailService.saveBatch(InspectionOrder.getOrderDetailList());
 
-        //淇敼7.9鎶ュ憡缁撴灉
-        ProcessReport processReport = processReportService.getOne(Wrappers.<ProcessReport>lambdaQuery().eq(ProcessReport::getInspectionOrderId, InspectionOrder.getInspectionOrderId()));
-        processReport.setInsReportCode(InspectionOrder.getEntrustCode());//鎶ュ憡缂栧彿=濮旀墭缂栧彿
-        processReportService.updateById(processReport);
+        syncInsOrderRequirement(InspectionOrder);
+        syncProcessReport(InspectionOrder.getInsOrderId());
 
         return true;
+    }
+
+    /**
+     * 鍚堝苟缂栬緫锛氬叕鍏卞鎵樹俊鎭箍鎾埌鏁存壒锛屾槑缁嗘寜琛屾墍灞炲鎵樺崟鍐欏洖銆�
+     */
+    private boolean updateBatchInspectionOrder(InspectionOrderDto inspectionOrder) {
+        List<InspectionOrder> members = listBatchMembers(inspectionOrder.getBatchNo());
+        if (members.isEmpty()) {
+            throw new ErrorException("鎵规鏁版嵁涓嶅瓨鍦�");
+        }
+        Set<Integer> memberIds = members.stream()
+                .map(InspectionOrder::getInspectionOrderId)
+                .collect(Collectors.toSet());
+        Integer representativeId = inspectionOrder.getInspectionOrderId();
+        if (representativeId == null || !memberIds.contains(representativeId)) {
+            representativeId = members.get(0).getInspectionOrderId();
+        }
+        applyRequirementFields(inspectionOrder);
+
+        for (InspectionOrder member : members) {
+            copyBatchHeader(inspectionOrder, member);
+            baseMapper.updateById(member);
+        }
+
+        if (inspectionOrder.getOrderDetailList() != null) {
+            inspectionOrderDetailService.remove(Wrappers.<InspectionOrderDetail>lambdaQuery()
+                    .in(InspectionOrderDetail::getInspectionOrderId, memberIds));
+            if (CollectionUtils.isNotEmpty(inspectionOrder.getOrderDetailList())) {
+                Map<Integer, List<InspectionOrderDetail>> detailsByOwner = new LinkedHashMap<>();
+                for (InspectionOrderDetail detail : inspectionOrder.getOrderDetailList()) {
+                    Integer ownerId = detail.getInspectionOrderId();
+                    if (ownerId == null || !memberIds.contains(ownerId)) {
+                        ownerId = representativeId;
+                    }
+                    detail.setInspectionOrderDetailId(null);
+                    detail.setInspectionOrderId(ownerId);
+                    detailsByOwner.computeIfAbsent(ownerId, key -> new ArrayList<>()).add(detail);
+                }
+                final Integer fallbackOwnerId = representativeId;
+                for (Map.Entry<Integer, List<InspectionOrderDetail>> entry : detailsByOwner.entrySet()) {
+                    InspectionOrder member = members.stream()
+                            .filter(item -> item.getInspectionOrderId().equals(entry.getKey()))
+                            .findFirst()
+                            .orElse(members.stream()
+                                    .filter(item -> item.getInspectionOrderId().equals(fallbackOwnerId))
+                                    .findFirst().orElse(null));
+                    InspectionOrderDetail first = entry.getValue().get(0);
+                    if (member != null) {
+                        if (StrUtil.isNotBlank(first.getSampleName())) {
+                            member.setSampleName(first.getSampleName());
+                        }
+                        if (StrUtil.isNotBlank(first.getQuantity())) {
+                            member.setQuantity(first.getQuantity());
+                        }
+                        if (StrUtil.isNotBlank(first.getSampleStatus())) {
+                            member.setSampleStatus(first.getSampleStatus());
+                        }
+                        baseMapper.updateById(member);
+                    }
+                    inspectionOrderDetailService.saveBatch(entry.getValue());
+                }
+            }
+        }
+
+        for (InspectionOrder member : members) {
+            InspectionOrderDto memberDto = new InspectionOrderDto();
+            BeanUtils.copyProperties(inspectionOrder, memberDto);
+            memberDto.setInspectionOrderId(member.getInspectionOrderId());
+            memberDto.setInsOrderId(member.getInsOrderId());
+            memberDto.setEntrustCode(member.getEntrustCode());
+            memberDto.setBatchNo(member.getBatchNo());
+            syncInsOrderRequirement(memberDto);
+            syncProcessReport(member.getInsOrderId());
+        }
+        return true;
+    }
+
+    private void copyBatchHeader(InspectionOrderDto source, InspectionOrder target) {
+        target.setCommissionUnit(source.getCommissionUnit());
+        target.setCommissionDate(source.getCommissionDate());
+        target.setCommissionUser(source.getCommissionUser());
+        target.setCommissionPhone(source.getCommissionPhone());
+        target.setProduction(source.getProduction());
+        target.setIsLeave(source.getIsLeave());
+        target.setSampleSource(source.getSampleSource());
+        target.setProcessing(source.getProcessing());
+        target.setSend(source.getSend());
+        target.setCriterionRule(source.getCriterionRule());
+        target.setCriterionRuleRemark(source.getCriterionRuleRemark());
+        target.setGeneralOfficeUser(source.getGeneralOfficeUser());
+        target.setReceiptData(source.getReceiptData());
+        target.setReceiveStatus(source.getReceiveStatus());
+        target.setFeeStatus(source.getFeeStatus());
+        target.setSampleTakerUser(source.getSampleTakerUser());
+        target.setSampleData(source.getSampleData());
+        target.setAppointed(source.getAppointed());
+    }
+
+    private void syncProcessReport(Integer insOrderId) {
+        if (insOrderId == null) {
+            return;
+        }
+        ProcessReport processReport = processReportService.getOne(Wrappers.<ProcessReport>lambdaQuery()
+                .eq(ProcessReport::getInspectionOrderId, insOrderId)
+                .last("limit 1"));
+        InsReport insReport = insReportService.getOne(Wrappers.<InsReport>lambdaQuery()
+                .eq(InsReport::getInsOrderId, insOrderId)
+                .orderByDesc(InsReport::getId)
+                .last("limit 1"));
+        if (processReport != null && insReport != null) {
+            processReport.setInsReportCode(insReport.getCode());//鎶ュ憡缂栧彿浣跨敤姝e紡鎶ュ憡缂栧彿
+            processReportService.updateById(processReport);
+        }
     }
 
     /**
@@ -261,12 +518,15 @@
      */
     @Override
     public boolean delInspectionOrder(Integer inspectionOrderId) {
+        InspectionOrder order = baseMapper.selectById(inspectionOrderId);
         inspectionOrderDetailService.remove(Wrappers.<InspectionOrderDetail>lambdaQuery()
                 .eq(InspectionOrderDetail::getInspectionOrderId, inspectionOrderId));
         baseMapper.deleteById(inspectionOrderId);
-        //鍒犻櫎7.8鎶ュ憡
-        processReportService.remove(Wrappers.<ProcessReport>lambdaQuery()
-                .eq(ProcessReport::getInspectionOrderId, inspectionOrderId));
+        //鍒犻櫎7.8鎶ュ憡锛堣琛� inspection_order_id 瀛樼殑鏄垚鍝佽鍗昳d锛�
+        if (order != null && order.getInsOrderId() != null) {
+            processReportService.remove(Wrappers.<ProcessReport>lambdaQuery()
+                    .eq(ProcessReport::getInspectionOrderId, order.getInsOrderId()));
+        }
         //鍒犻櫎瀵瑰簲鐨勮澶囦娇鐢ㄨ褰�
         processOrderDeviceService.remove(Wrappers.<ProcessOrderDevice>lambdaQuery()
                 .eq(ProcessOrderDevice::getInspectionOrderId, inspectionOrderId));
@@ -284,6 +544,21 @@
         return true;
     }
 
+    @Override
+    public boolean delInspectionOrder(Integer inspectionOrderId, String batchNo) {
+        if (StrUtil.isBlank(batchNo)) {
+            return delInspectionOrder(inspectionOrderId);
+        }
+        List<InspectionOrder> members = listBatchMembers(batchNo);
+        if (members.isEmpty()) {
+            return delInspectionOrder(inspectionOrderId);
+        }
+        for (InspectionOrder member : members) {
+            delInspectionOrder(member.getInspectionOrderId());
+        }
+        return true;
+    }
+
     /**
      * 妫�楠屽鎵樺崟鏌ョ湅璇︽儏
      * @param inspectionOrderId
@@ -295,9 +570,81 @@
         InspectionOrderDto inspectionOrderDto = new InspectionOrderDto();
         BeanUtils.copyProperties(inspectionOrder, inspectionOrderDto);
 
+        InsOrder insOrder = inspectionOrder.getInsOrderId() == null ? null : insOrderService.getById(inspectionOrder.getInsOrderId());
+        fillRequirementFields(inspectionOrder, inspectionOrderDto, insOrder);
+        if (inspectionOrderDto.getSampleSource() == null) {
+            inspectionOrderDto.setSampleSource(1);
+        }
+        if (inspectionOrderDto.getReceiveStatus() == null) {
+            inspectionOrderDto.setReceiveStatus(1);
+        }
+        if (inspectionOrderDto.getFeeStatus() == null) {
+            inspectionOrderDto.setFeeStatus(2);
+        }
+
         // 鏌ヨ璇︾粏淇℃伅
         inspectionOrderDto.setOrderDetailList(inspectionOrderDetailService.list(Wrappers.<InspectionOrderDetail>lambdaQuery()
-                .eq(InspectionOrderDetail::getInspectionOrderId, inspectionOrderId)));
+                .eq(InspectionOrderDetail::getInspectionOrderId, inspectionOrderId)
+                .orderByAsc(InspectionOrderDetail::getInspectionOrderDetailId)));
+        return inspectionOrderDto;
+    }
+
+    /**
+     * 鎸夋壒娆℃煡鐪嬶細澶翠俊鎭彇浠h〃鍗曪紝鏄庣粏鍚堝苟鏁存壒鏍峰搧銆�
+     */
+    @Override
+    public InspectionOrderDto getInspectionOrderOne(Integer inspectionOrderId, String batchNo) {
+        if (StrUtil.isBlank(batchNo)) {
+            return getInspectionOrderOne(inspectionOrderId);
+        }
+        List<InspectionOrder> members = listBatchMembers(batchNo);
+        if (members.isEmpty()) {
+            return getInspectionOrderOne(inspectionOrderId);
+        }
+        InspectionOrder representative = members.stream()
+                .filter(item -> item.getInspectionOrderId().equals(inspectionOrderId))
+                .findFirst()
+                .orElse(members.get(0));
+        InspectionOrderDto inspectionOrderDto = new InspectionOrderDto();
+        BeanUtils.copyProperties(representative, inspectionOrderDto);
+
+        InsOrder insOrder = representative.getInsOrderId() == null ? null
+                : insOrderService.getById(representative.getInsOrderId());
+        fillRequirementFields(representative, inspectionOrderDto, insOrder);
+        if (inspectionOrderDto.getSampleSource() == null) {
+            inspectionOrderDto.setSampleSource(1);
+        }
+        if (inspectionOrderDto.getReceiveStatus() == null) {
+            inspectionOrderDto.setReceiveStatus(1);
+        }
+        if (inspectionOrderDto.getFeeStatus() == null) {
+            inspectionOrderDto.setFeeStatus(2);
+        }
+        inspectionOrderDto.setMemberCount(members.size());
+
+        Map<Integer, String> entrustCodeById = members.stream()
+                .collect(Collectors.toMap(InspectionOrder::getInspectionOrderId,
+                        item -> item.getEntrustCode() == null ? "" : item.getEntrustCode()));
+        List<InspectionOrderDetail> details = inspectionOrderDetailService.list(
+                Wrappers.<InspectionOrderDetail>lambdaQuery()
+                        .in(InspectionOrderDetail::getInspectionOrderId, entrustCodeById.keySet())
+                        .orderByAsc(InspectionOrderDetail::getInspectionOrderId)
+                        .orderByAsc(InspectionOrderDetail::getInspectionOrderDetailId));
+        Map<Integer, List<InspectionOrderDetail>> detailsByOwner = details.stream()
+                .collect(Collectors.groupingBy(InspectionOrderDetail::getInspectionOrderId,
+                        LinkedHashMap::new, Collectors.toList()));
+        for (InspectionOrder member : members) {
+            List<InspectionOrderDetail> ownerDetails = detailsByOwner.get(member.getInspectionOrderId());
+            if (CollectionUtils.isEmpty(ownerDetails)) {
+                continue;
+            }
+            List<String> codes = buildDetailEntrustCodes(member.getEntrustCode(), ownerDetails);
+            for (int index = 0; index < ownerDetails.size(); index++) {
+                ownerDetails.get(index).setEntrustCode(codes.get(index));
+            }
+        }
+        inspectionOrderDto.setOrderDetailList(details);
+        inspectionOrderDto.setDetailCount(details.size());
         return inspectionOrderDto;
     }
 
@@ -322,6 +669,27 @@
         inspectionOrderDto.setAppointed(order.getAppointed());//绾﹀畾鏃堕棿
         inspectionOrderDto.setSend(order.getSend());//鎶ュ憡鍙戦�佹柟寮�
         inspectionOrderDto.setCommissionPhone(order.getPhone());//鎶ュ憡鍙戦�佹柟寮�
+
+        Integer subcontractType = order.getSubcontractType() == null ? 0 : order.getSubcontractType();
+        inspectionOrderDto.setSubcontractType(subcontractType);
+        inspectionOrderDto.setSubcontractCompany(subcontractType == 1 && order.getSubcontractCompany() != null
+                ? order.getSubcontractCompany() : "");
+        Integer sampleDisposal = order.getSampleDisposal();
+        if (sampleDisposal == null) {
+            sampleDisposal = order.getProcessing() != null && order.getProcessing() == 1 ? 2 : 1;
+        }
+        inspectionOrderDto.setSampleDisposal(sampleDisposal);
+        inspectionOrderDto.setResultEvaluation(order.getResultEvaluation() == null ? 0 : order.getResultEvaluation());
+        Integer reportDelivery = order.getReportDelivery();
+        if (reportDelivery == null) {
+            reportDelivery = order.getSend() != null && order.getSend() == 1 ? 1 : 2;
+        }
+        inspectionOrderDto.setReportDelivery(reportDelivery);
+        inspectionOrderDto.setReportAddress(order.getReportAddress() == null ? "" : order.getReportAddress());
+        inspectionOrderDto.setReportReceiver(order.getReportReceiver() == null ? "" : order.getReportReceiver());
+        inspectionOrderDto.setSampleSource(1);
+        inspectionOrderDto.setReceiveStatus(1);
+        inspectionOrderDto.setFeeStatus(2);
 
         return inspectionOrderDto;
     }
@@ -370,31 +738,124 @@
 
     @Override
     public void exportInspectionOrder(Integer inspectionOrderId, HttpServletResponse response) {
-        InspectionOrder inspectionOrder = baseMapper.selectById(inspectionOrderId);
-        InspectionOrderExportDto inspectionOrderExportDto = extracted(inspectionOrder);
-        List<InspectionOrderDetail> list = inspectionOrderDetailService.list(Wrappers.<InspectionOrderDetail>lambdaQuery()
-                .eq(InspectionOrderDetail::getInspectionOrderId, inspectionOrderId));
-        int index = 1;
-        for (InspectionOrderDetail inspectionOrderDetail : list) {
-            inspectionOrderDetail.setIndex(index);
-            index++;
-        }
+        exportSingleInspectionOrder(inspectionOrderId, response);
+    }
 
+    @Override
+    public void exportInspectionOrder(Integer inspectionOrderId, String batchNo, HttpServletResponse response) {
+        if (StrUtil.isBlank(batchNo)) {
+            exportSingleInspectionOrder(inspectionOrderId, response);
+            return;
+        }
+        List<InspectionOrder> members = listBatchMembers(batchNo);
+        if (members.isEmpty()) {
+            exportSingleInspectionOrder(inspectionOrderId, response);
+            return;
+        }
+        InspectionOrder representative = members.stream()
+                .filter(item -> item.getInspectionOrderId().equals(inspectionOrderId))
+                .findFirst()
+                .orElse(members.get(0));
+        InsOrder insOrder = representative.getInsOrderId() == null ? null
+                : insOrderService.getById(representative.getInsOrderId());
+        InspectionOrderExportDto inspectionOrderExportDto = extracted(representative, insOrder);
+
+        Map<Integer, List<InspectionOrderDetail>> detailsByOwner = inspectionOrderDetailService.list(
+                        Wrappers.<InspectionOrderDetail>lambdaQuery()
+                                .in(InspectionOrderDetail::getInspectionOrderId, members.stream()
+                                        .map(InspectionOrder::getInspectionOrderId)
+                                        .collect(Collectors.toList()))
+                                .orderByAsc(InspectionOrderDetail::getInspectionOrderId)
+                                .orderByAsc(InspectionOrderDetail::getInspectionOrderDetailId))
+                .stream()
+                .collect(Collectors.groupingBy(InspectionOrderDetail::getInspectionOrderId,
+                        LinkedHashMap::new, Collectors.toList()));
+
+        List<InspectionOrderDetailExportDto> detailList = new ArrayList<>();
+        for (InspectionOrder member : members) {
+            List<InspectionOrderDetail> ownerDetails = detailsByOwner.get(member.getInspectionOrderId());
+            if (CollectionUtils.isEmpty(ownerDetails)) {
+                continue;
+            }
+            List<String> detailEntrustCodes = buildDetailEntrustCodes(member.getEntrustCode(), ownerDetails);
+            for (int i = 0; i < ownerDetails.size(); i++) {
+                InspectionOrderDetail inspectionOrderDetail = ownerDetails.get(i);
+                InspectionOrderDetailExportDto row = new InspectionOrderDetailExportDto();
+                row.setSampleName(StrUtil.isNotBlank(inspectionOrderDetail.getSampleName())
+                        ? inspectionOrderDetail.getSampleName() : member.getSampleName());
+                row.setSampleNumber(inspectionOrderDetail.getSampleNumber());
+                row.setTestItem(inspectionOrderDetail.getTestItem());
+                row.setQuantity(StrUtil.isNotBlank(inspectionOrderDetail.getQuantity())
+                        ? inspectionOrderDetail.getQuantity() : member.getQuantity());
+                row.setSampleStatus(StrUtil.isNotBlank(inspectionOrderDetail.getSampleStatus())
+                        ? inspectionOrderDetail.getSampleStatus() : member.getSampleStatus());
+                row.setTestStandard(inspectionOrderDetail.getTestStandard());
+                row.setRemark(inspectionOrderDetail.getRemark());
+                row.setEntrustCode(detailEntrustCodes.get(i));
+                detailList.add(row);
+            }
+        }
+        inspectionOrderExportDto.setProjectName(detailList.size() + "涓牱鍝�");
+        writeInspectionOrderExport(inspectionOrderExportDto, detailList, response);
+    }
+
+    private void exportSingleInspectionOrder(Integer inspectionOrderId, HttpServletResponse response) {
+        InspectionOrder inspectionOrder = baseMapper.selectById(inspectionOrderId);
+        InsOrder insOrder = inspectionOrder.getInsOrderId() == null ? null : insOrderService.getById(inspectionOrder.getInsOrderId());
+        InspectionOrderExportDto inspectionOrderExportDto = extracted(inspectionOrder, insOrder);
+        List<InspectionOrderDetail> list = inspectionOrderDetailService.list(Wrappers.<InspectionOrderDetail>lambdaQuery()
+                .eq(InspectionOrderDetail::getInspectionOrderId, inspectionOrderId)
+                .orderByAsc(InspectionOrderDetail::getInspectionOrderDetailId));
+        List<String> detailEntrustCodes = buildDetailEntrustCodes(inspectionOrder.getEntrustCode(), list);
+        List<InspectionOrderDetailExportDto> detailList = new ArrayList<>();
+        if (list.isEmpty()) {
+            InspectionOrderDetailExportDto row = new InspectionOrderDetailExportDto();
+            row.setSampleName(inspectionOrder.getSampleName());
+            row.setQuantity(inspectionOrder.getQuantity());
+            row.setSampleStatus(inspectionOrder.getSampleStatus());
+            row.setEntrustCode(inspectionOrder.getEntrustCode());
+            detailList.add(row);
+        } else {
+            for (int i = 0; i < list.size(); i++) {
+                InspectionOrderDetail inspectionOrderDetail = list.get(i);
+                InspectionOrderDetailExportDto row = new InspectionOrderDetailExportDto();
+                row.setSampleName(StrUtil.isNotBlank(inspectionOrderDetail.getSampleName())
+                        ? inspectionOrderDetail.getSampleName() : inspectionOrder.getSampleName());
+                row.setSampleNumber(inspectionOrderDetail.getSampleNumber());
+                row.setTestItem(inspectionOrderDetail.getTestItem());
+                row.setQuantity(StrUtil.isNotBlank(inspectionOrderDetail.getQuantity())
+                        ? inspectionOrderDetail.getQuantity() : inspectionOrder.getQuantity());
+                row.setSampleStatus(StrUtil.isNotBlank(inspectionOrderDetail.getSampleStatus())
+                        ? inspectionOrderDetail.getSampleStatus() : inspectionOrder.getSampleStatus());
+                row.setTestStandard(inspectionOrderDetail.getTestStandard());
+                row.setRemark(inspectionOrderDetail.getRemark());
+                row.setEntrustCode(detailEntrustCodes.get(i));
+                detailList.add(row);
+            }
+        }
+        inspectionOrderExportDto.setProjectName(detailList.size() + "涓牱鍝�");
+        writeInspectionOrderExport(inspectionOrderExportDto, detailList, response);
+    }
+
+    private void writeInspectionOrderExport(InspectionOrderExportDto inspectionOrderExportDto,
+                                            List<InspectionOrderDetailExportDto> detailList,
+                                            HttpServletResponse response) {
         // 鑾峰彇璺緞
         InputStream inputStream = this.getClass().getResourceAsStream("/static/inspection-order.docx");
         Configure configure = Configure.builder()
-                .bind("inspectionOrderDetailList", new HackLoopTableRenderPolicy())
+                .bind("inspectionOrderDetailList", new HackLoopTableRenderPolicy("[[", "]]"))
                 .build();
         XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render(
                 new HashMap<String, Object>() {{
                     put("inspectionOrder", inspectionOrderExportDto);
-                    put("inspectionOrderDetailList", list);
+                    put("inspectionOrderDetailList", detailList);
                 }});
 
         try {
             response.setContentType("application/msword");
             String fileName = URLEncoder.encode(
-                    inspectionOrderExportDto.getSampleName(), "UTF-8");
+                    StrUtil.isBlank(inspectionOrderExportDto.getSampleName())
+                            ? "瀹㈡埛妫�娴嬪鎵樹功" : inspectionOrderExportDto.getSampleName(), "UTF-8");
             response.setHeader("Content-disposition",
                     "attachment;filename=" + fileName + ".docx");
             OutputStream os = response.getOutputStream();
@@ -408,7 +869,7 @@
         }
     }
 
-    private InspectionOrderExportDto extracted(InspectionOrder inspectionOrder) {
+    private InspectionOrderExportDto extracted(InspectionOrder inspectionOrder, InsOrder insOrder) {
         DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy骞碝M鏈坉d鏃�");
         InspectionOrderExportDto inspectionOrderExportDto = new InspectionOrderExportDto();
         BeanUtils.copyProperties(inspectionOrder, inspectionOrderExportDto);
@@ -427,13 +888,99 @@
         }
 
         inspectionOrderExportDto.setIsLeave1(inspectionOrder.getIsLeave() != null && inspectionOrder.getIsLeave() == 1? "鈽�" : "鈻�");
-        inspectionOrderExportDto.setIsLeave2(inspectionOrder.getIsLeave() != null && inspectionOrder.getIsLeave() == 0? "鈽�" : "鈻�");
-        inspectionOrderExportDto.setSend0(inspectionOrder.getSend() != null && inspectionOrder.getSend() == 1? "鈽�" : "鈻�");
-        inspectionOrderExportDto.setSend1(inspectionOrder.getSend() != null && inspectionOrder.getSend() == 0? "鈽�" : "鈻�");
+        inspectionOrderExportDto.setIsLeave2(inspectionOrder.getIsLeave() != null && inspectionOrder.getIsLeave() != 1? "鈽�" : "鈻�");
         inspectionOrderExportDto.setProcessing0(inspectionOrder.getProcessing() != null && inspectionOrder.getProcessing() == 0? "鈽�" : "鈻�");
         inspectionOrderExportDto.setProcessing1(inspectionOrder.getProcessing() != null && inspectionOrder.getProcessing() == 1? "鈽�" : "鈻�");
         inspectionOrderExportDto.setCriterionRule0(inspectionOrder.getCriterionRule() != null && inspectionOrder.getCriterionRule() == 0? "鈽�" : "鈻�");
         inspectionOrderExportDto.setCriterionRule1(inspectionOrder.getCriterionRule() != null && inspectionOrder.getCriterionRule() == 1? "鈽�" : "鈻�");
+
+        Integer subcontractType = insOrder != null && insOrder.getSubcontractType() != null ? insOrder.getSubcontractType() : 0;
+        Integer sampleDisposal = insOrder == null ? null : insOrder.getSampleDisposal();
+        if (sampleDisposal == null) {
+            sampleDisposal = inspectionOrder.getProcessing() != null && inspectionOrder.getProcessing() == 1 ? 2 : 1;
+        }
+        Integer resultEvaluation = insOrder != null && insOrder.getResultEvaluation() != null ? insOrder.getResultEvaluation() : 0;
+        Integer reportDelivery = insOrder == null ? null : insOrder.getReportDelivery();
+        if (reportDelivery == null) {
+            reportDelivery = inspectionOrder.getSend() != null && inspectionOrder.getSend() == 1 ? 1 : 2;
+        }
+
+        inspectionOrderExportDto.setSubcontractType(subcontractType);
+        inspectionOrderExportDto.setSubcontractCompany(subcontractType == 1 && insOrder != null && insOrder.getSubcontractCompany() != null
+                ? insOrder.getSubcontractCompany() : "");
+        inspectionOrderExportDto.setSubcontractYes(subcontractType == 1 ? "鈽�" : "鈻�");
+        inspectionOrderExportDto.setSubcontractNo(subcontractType == 0 ? "鈽�" : "鈻�");
+        inspectionOrderExportDto.setSampleDisposal(sampleDisposal);
+        inspectionOrderExportDto.setResultEvaluation(resultEvaluation);
+        inspectionOrderExportDto.setResultEvaluationYes(resultEvaluation == 1 ? "鈽�" : "鈻�");
+        inspectionOrderExportDto.setResultEvaluationNo(resultEvaluation == 0 ? "鈽�" : "鈻�");
+        inspectionOrderExportDto.setReportDelivery(reportDelivery);
+        inspectionOrderExportDto.setSendSelf(reportDelivery == 1 ? "鈽�" : "鈻�");
+        inspectionOrderExportDto.setSendExpress(reportDelivery == 2 ? "鈽�" : "鈻�");
+        inspectionOrderExportDto.setSendElectronic(reportDelivery == 3 ? "鈽�" : "鈻�");
+        boolean express = reportDelivery == 2;
+        inspectionOrderExportDto.setReportAddress(express && insOrder != null && insOrder.getReportAddress() != null
+                ? insOrder.getReportAddress() : "");
+        inspectionOrderExportDto.setReportReceiver(express && insOrder != null && insOrder.getReportReceiver() != null
+                ? insOrder.getReportReceiver() : "");
+
+        int sampleSource = inspectionOrder.getSampleSource() == null ? 1 : inspectionOrder.getSampleSource();
+        int receiveStatus = inspectionOrder.getReceiveStatus() == null ? 1 : inspectionOrder.getReceiveStatus();
+        int feeStatus = inspectionOrder.getFeeStatus() == null ? 2 : inspectionOrder.getFeeStatus();
+        inspectionOrderExportDto.setSourceSend(sampleSource == 1 ? "鈽�" : "鈻�");
+        inspectionOrderExportDto.setSourceSample(sampleSource == 2 ? "鈽�" : "鈻�");
+        inspectionOrderExportDto.setReceiveOk(receiveStatus == 1 ? "鈽�" : "鈻�");
+        inspectionOrderExportDto.setReceiveDefect(receiveStatus == 2 ? "鈽�" : "鈻�");
+        inspectionOrderExportDto.setReceiveReject(receiveStatus == 3 ? "鈽�" : "鈻�");
+        inspectionOrderExportDto.setFeeReceived(feeStatus == 1 ? "鈽�" : "鈻�");
+        inspectionOrderExportDto.setFeeUnpaid(feeStatus == 2 ? "鈽�" : "鈻�");
+        inspectionOrderExportDto.setFeePrepaid(feeStatus == 3 ? "鈽�" : "鈻�");
         return inspectionOrderExportDto;
     }
+
+    private static String buildDetailEntrustCode(String orderEntrustCode, String sampleNumber) {
+        if (StrUtil.isBlank(orderEntrustCode) || StrUtil.isBlank(sampleNumber)) {
+            return orderEntrustCode;
+        }
+        String trimmed = sampleNumber.trim();
+        String suffix = trimmed.length() >= 2 ? trimmed.substring(trimmed.length() - 2) : trimmed;
+        int index = orderEntrustCode.lastIndexOf('-');
+        return index < 0 ? orderEntrustCode : orderEntrustCode.substring(0, index + 1) + suffix;
+    }
+
+    /**
+     * 閫愯濮旀墭缂栧彿锛氶粯璁ゅ彇鏍峰搧缂栧彿鍚庝袱浣嶏紱鍑虹幇閲嶅鎴栦负绌烘椂鐢ㄨ鍙峰厹搴曪紝淇濊瘉涓嶉噸澶嶃��
+     */
+    private static List<String> buildDetailEntrustCodes(String orderEntrustCode, List<InspectionOrderDetail> details) {
+        List<String> bases = details.stream()
+                .map(detail -> buildDetailEntrustCode(orderEntrustCode, detail.getSampleNumber()))
+                .map(base -> base == null ? "" : base)
+                .collect(Collectors.toList());
+        Map<String, Integer> counts = new HashMap<>();
+        for (String base : bases) {
+            counts.merge(base, 1, Integer::sum);
+        }
+        String prefix = "";
+        if (StrUtil.isNotBlank(orderEntrustCode)) {
+            int index = orderEntrustCode.lastIndexOf('-');
+            prefix = index < 0 ? orderEntrustCode + "-" : orderEntrustCode.substring(0, index + 1);
+        }
+        Set<String> used = new HashSet<>();
+        List<String> result = new ArrayList<>();
+        for (int i = 0; i < bases.size(); i++) {
+            String base = bases.get(i);
+            String candidate = base;
+            if (StrUtil.isBlank(base) || counts.getOrDefault(base, 0) > 1 || used.contains(candidate)) {
+                int seq = i + 1;
+                candidate = prefix + String.format("%02d", seq);
+                while (used.contains(candidate)) {
+                    seq += bases.size();
+                    candidate = prefix + String.format("%02d", seq);
+                }
+            }
+            used.add(candidate);
+            result.add(candidate);
+        }
+        return result;
+    }
 }

--
Gitblit v1.9.3