From 51786b723d0a91d11476776d9ce50af7994dc4bd Mon Sep 17 00:00:00 2001
From: liding <756868258@qq.com>
Date: 星期三, 23 九月 2026 15:58:53 +0800
Subject: [PATCH] feat(inspect): 完善检验订单状态管理和样品接收流程

---
 inspect-server/src/main/java/com/ruoyi/inspect/event/NewJuOrderPlacedEvent.java              |   14 
 inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsSampleReceiptMapper.java            |   26 +
 inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsOrderMapper.java                    |    2 
 inspect-server/src/main/resources/static/inspection-report-template-v2.docx                  |    0 
 inspect-server/src/main/java/com/ruoyi/inspect/dto/SampleReceiptPageDto.java                 |   52 ++
 inspect-server/src/main/java/com/ruoyi/inspect/pojo/InsOrderTemplate.java                    |    5 
 inspect-server/src/main/java/com/ruoyi/inspect/controller/InsOrderController.java            |    2 
 inspect-server/src/main/resources/mapper/InsOrderMapper.xml                                  |   12 
 cnas-process/src/main/java/com/ruoyi/process/listener/NewJuOrderInspectionListener.java      |   70 +++
 cnas-process/src/main/java/com/ruoyi/process/pojo/ProcessDeal.java                           |   10 
 inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderServiceImpl.java         |   79 +++
 inspect-server/src/main/java/com/ruoyi/inspect/dto/SampleReceiptQueryDto.java                |   17 
 inspect-server/src/main/java/com/ruoyi/inspect/pojo/InsReport.java                           |   17 
 inspect-server/src/main/resources/static/detection-report-template-v2.docx                   |    0 
 inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderPlanServiceImpl.java     |   44 +-
 cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessTotaldealServiceImpl.java   |  137 +++++--
 inspect-server/src/main/resources/mapper/InsSampleReceiptMapper.xml                          |  108 +++++
 inspect-server/src/main/resources/mapper/InsSampleMapper.xml                                 |   34 +
 inspect-server/src/main/java/com/ruoyi/inspect/pojo/InsOrder.java                            |   24 +
 inspect-server/src/main/java/com/ruoyi/inspect/vo/InsOrderTemplateDetailVo.java              |   22 +
 inspect-server/src/main/java/com/ruoyi/inspect/pojo/InsSampleReceipt.java                    |   42 ++
 inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderTemplateServiceImpl.java |   48 ++
 inspect-server/src/main/java/com/ruoyi/inspect/service/InsOrderTemplateService.java          |    3 
 inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsSampleReceiptServiceImpl.java |  165 ++++++++
 basic-server/src/main/java/com/ruoyi/basic/utils/StandardTemplateInspectionItemParser.java   |   35 +
 inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsReportServiceImpl.java        |   13 
 inspect-server/src/main/java/com/ruoyi/inspect/service/InsSampleReceiptService.java          |   24 +
 inspect-server/src/main/java/com/ruoyi/inspect/dto/SampleOrderDto.java                       |    7 
 inspect-server/src/main/java/com/ruoyi/inspect/vo/InsOrderPrintingVo.java                    |    3 
 inspect-server/src/main/java/com/ruoyi/inspect/controller/InsSampleReceiptController.java    |   58 +++
 inspect-server/src/main/java/com/ruoyi/inspect/dto/SampleReceiptActionDto.java               |   17 
 31 files changed, 974 insertions(+), 116 deletions(-)

diff --git a/basic-server/src/main/java/com/ruoyi/basic/utils/StandardTemplateInspectionItemParser.java b/basic-server/src/main/java/com/ruoyi/basic/utils/StandardTemplateInspectionItemParser.java
index d2fd833..fe80870 100644
--- a/basic-server/src/main/java/com/ruoyi/basic/utils/StandardTemplateInspectionItemParser.java
+++ b/basic-server/src/main/java/com/ruoyi/basic/utils/StandardTemplateInspectionItemParser.java
@@ -52,10 +52,7 @@
                     continue;
                 }
                 Integer row = cell.getInteger("r");
-                String item = value.getString("v");
-                if (!StringUtils.hasText(item)) {
-                    item = value.getString("m");
-                }
+                String item = getCellText(value);
                 if (row == null || !StringUtils.hasText(item)) {
                     throw new BaseException("鈥滄楠岄」鈥濇爣璁版墍鍦ㄥ崟鍏冩牸蹇呴』濉啓妫�楠岄」鍚嶇О");
                 }
@@ -74,6 +71,36 @@
         return result;
     }
 
+    /**
+     * 璇诲彇 Luckysheet 鍗曞厓鏍兼枃鏈紝鍏煎鏅�氭枃鏈拰 inlineStr 瀵屾枃鏈��
+     */
+    private static String getCellText(JSONObject value) {
+        String text = value.getString("v");
+        if (StringUtils.hasText(text)) {
+            return text;
+        }
+        text = value.getString("m");
+        if (StringUtils.hasText(text)) {
+            return text;
+        }
+
+        JSONObject cellType = value.getJSONObject("ct");
+        JSONArray segments = cellType == null ? null : cellType.getJSONArray("s");
+        if (segments == null || segments.isEmpty()) {
+            return text;
+        }
+        StringBuilder richText = new StringBuilder();
+        for (Object segmentObject : segments) {
+            if (segmentObject instanceof JSONObject) {
+                String segmentText = ((JSONObject) segmentObject).getString("v");
+                if (segmentText != null) {
+                    richText.append(segmentText);
+                }
+            }
+        }
+        return richText.toString();
+    }
+
     private static boolean isInspectionItem(JSONObject value) {
         JSONObject ps = value.getJSONObject("ps");
         return ps != null && INSPECTION_ITEM_MARK.equals(ps.getString("value"));
diff --git a/cnas-process/src/main/java/com/ruoyi/process/listener/NewJuOrderInspectionListener.java b/cnas-process/src/main/java/com/ruoyi/process/listener/NewJuOrderInspectionListener.java
new file mode 100644
index 0000000..c444fa5
--- /dev/null
+++ b/cnas-process/src/main/java/com/ruoyi/process/listener/NewJuOrderInspectionListener.java
@@ -0,0 +1,70 @@
+package com.ruoyi.process.listener;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.ruoyi.inspect.event.NewJuOrderPlacedEvent;
+import com.ruoyi.inspect.pojo.InsOrder;
+import com.ruoyi.inspect.service.InsOrderService;
+import com.ruoyi.process.mapper.InspectionOrderMapper;
+import com.ruoyi.process.pojo.InspectionOrder;
+import lombok.AllArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.context.event.EventListener;
+import org.springframework.stereotype.Component;
+
+import java.time.LocalDate;
+
+/**
+ * 鏂拌仛鎴愬搧涓嬪崟鎴愬姛鍚庯紝鑷姩鐢熸垚涓�鏉℃楠屽鎵樺崟銆�
+ */
+@Component
+@AllArgsConstructor
+public class NewJuOrderInspectionListener {
+
+    private final InsOrderService insOrderService;
+    private final InspectionOrderMapper inspectionOrderMapper;
+
+    @EventListener
+    public void onNewJuOrderPlaced(NewJuOrderPlacedEvent event) {
+        InsOrder order = insOrderService.getById(event.getInsOrderId());
+        if (order == null) {
+            return;
+        }
+        // 骞傜瓑锛氬悓涓�鎴愬搧璁㈠崟宸叉湁妫�楠屽鎵樺崟鍒欒烦杩�
+        Long count = inspectionOrderMapper.selectCount(Wrappers.<InspectionOrder>lambdaQuery()
+                .eq(InspectionOrder::getInsOrderId, order.getId()));
+        if (count > 0) {
+            return;
+        }
+        InspectionOrder inspectionOrder = new InspectionOrder();
+        inspectionOrder.setInsOrderId(order.getId());
+        inspectionOrder.setEntrustCode(order.getEntrustCode());
+        // 璇曟牱鍚嶇О浼樺厛鍙栨姤鍛婂睍绀哄瓧娈�
+        inspectionOrder.setSampleName(StringUtils.isNotBlank(order.getSampleView())
+                ? order.getSampleView() : order.getSample());
+        inspectionOrder.setProduction(order.getProduction());
+        inspectionOrder.setQuantity(order.getTestQuantity());
+        inspectionOrder.setCommissionDate(LocalDate.now());
+        inspectionOrder.setCommissionUnit(order.getCompany());
+        inspectionOrder.setCommissionUser(order.getPrepareUser());
+        inspectionOrder.setCommissionPhone(order.getPhone());
+        inspectionOrder.setSampleStatus("瀹屽ソ");
+        // 鏄惁鐣欐牱璇箟杞崲锛歩ns 0鍚�/1鏄� -> cnas 1鏄�/2鍚�
+        inspectionOrder.setIsLeave(Integer.valueOf(1).equals(order.getIsLeave()) ? 1 : 2);
+        // 鏍峰搧澶勭疆锛�1濮旀墭鏂瑰彇鍥�/2妫�娴嬫柟澶勭疆 -> processing 0濮旀墭鍗曚綅鍙栧洖/1瀹為獙瀹ゅ鐞嗭紱鏈�夋椂娌跨敤鏃у瓧娈�
+        if (Integer.valueOf(1).equals(order.getSampleDisposal())) {
+            inspectionOrder.setProcessing(0);
+        } else if (Integer.valueOf(2).equals(order.getSampleDisposal())) {
+            inspectionOrder.setProcessing(1);
+        } else {
+            inspectionOrder.setProcessing(order.getProcessing());
+        }
+        // 鎶ュ憡浜や粯鏂瑰紡锛�1鑷彇 -> send 1锛屽叾浣� 0锛涙湭閫夋椂娌跨敤鏃у瓧娈�
+        if (order.getReportDelivery() != null) {
+            inspectionOrder.setSend(Integer.valueOf(1).equals(order.getReportDelivery()) ? 1 : 0);
+        } else {
+            inspectionOrder.setSend(order.getSend());
+        }
+        // 鎶ュ憡鏂囦欢涓庣害瀹氭椂闂寸敓鎴愭椂涓虹┖锛屽悗缁湪妫�楠屽鎵樺崟椤甸潰缂栬緫/涓婁紶
+        inspectionOrderMapper.insert(inspectionOrder);
+    }
+}
diff --git a/cnas-process/src/main/java/com/ruoyi/process/pojo/ProcessDeal.java b/cnas-process/src/main/java/com/ruoyi/process/pojo/ProcessDeal.java
index 721c609..f40dfed 100644
--- a/cnas-process/src/main/java/com/ruoyi/process/pojo/ProcessDeal.java
+++ b/cnas-process/src/main/java/com/ruoyi/process/pojo/ProcessDeal.java
@@ -26,6 +26,7 @@
 public class ProcessDeal implements Serializable {
 
 
+    @ApiModelProperty("涓婚敭")
     @TableId(value = "id", type = IdType.AUTO)
     private Integer id;
 
@@ -48,21 +49,28 @@
     @JsonFormat(pattern = "yyyy-MM-dd")
     private LocalDate dealTime;
 
+    @ApiModelProperty("鍒涘缓浜�")
     @TableField(fill = FieldFill.INSERT)
     private Integer createUser;
 
+    @ApiModelProperty("鏇存柊浜�")
     @TableField(fill = FieldFill.INSERT_UPDATE)
     private Integer updateUser;
 
+    @ApiModelProperty("鍒涘缓鏃堕棿")
     @TableField(fill = FieldFill.INSERT)
     private LocalDateTime createTime;
 
+    @ApiModelProperty("鏇存柊鏃堕棿")
     @TableField(fill = FieldFill.INSERT_UPDATE)
     private LocalDateTime updateTime;
 
     @ApiModelProperty("鍏宠仈鐨勫巻鍙叉�昏〃id")
     private Integer totaldealId;
 
-    @ApiModelProperty("鍏宠仈鐨勬牱鍝佹帴鏀秈d")
+    @ApiModelProperty("鍏宠仈鐨勫巻鍙插缃牱鍝乮d")
     private Integer processSampleId;
+
+    @ApiModelProperty("鍏宠仈鐨勬楠屾牱鍝乮d(ins_sample)")
+    private Integer insSampleId;
 }
diff --git a/cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessTotaldealServiceImpl.java b/cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessTotaldealServiceImpl.java
index ee516b8..7b0c053 100644
--- a/cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessTotaldealServiceImpl.java
+++ b/cnas-process/src/main/java/com/ruoyi/process/service/impl/ProcessTotaldealServiceImpl.java
@@ -15,16 +15,19 @@
 import com.ruoyi.common.utils.QueryWrappers;
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.framework.exception.ErrorException;
+import com.ruoyi.inspect.mapper.InsOrderMapper;
+import com.ruoyi.inspect.mapper.InsSampleMapper;
+import com.ruoyi.inspect.mapper.InsSampleReceiptMapper;
+import com.ruoyi.inspect.pojo.InsOrder;
+import com.ruoyi.inspect.pojo.InsSample;
+import com.ruoyi.inspect.pojo.InsSampleReceipt;
 import com.ruoyi.inspect.util.HackLoopTableRenderPolicy;
 import com.ruoyi.inspect.util.UserUtils;
+import org.apache.commons.lang3.StringUtils;
 import com.ruoyi.process.dto.ProcessDealDto;
-import com.ruoyi.process.mapper.InspectionOrderMapper;
 import com.ruoyi.process.mapper.ProcessDealMapper;
-import com.ruoyi.process.mapper.ProcessSampleMapper;
 import com.ruoyi.process.mapper.ProcessTotaldealMapper;
-import com.ruoyi.process.pojo.InspectionOrder;
 import com.ruoyi.process.pojo.ProcessDeal;
-import com.ruoyi.process.pojo.ProcessSample;
 import com.ruoyi.process.pojo.ProcessTotaldeal;
 import com.ruoyi.process.service.ProcessDealService;
 import com.ruoyi.process.service.ProcessTotaldealService;
@@ -44,12 +47,17 @@
 import java.nio.file.Files;
 import java.nio.file.Paths;
 import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
 import java.time.YearMonth;
 import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -67,13 +75,7 @@
     private ProcessTotaldealMapper processTotaldealMapper;
 
     @Resource
-    private ProcessSampleMapper processSampleMapper;
-
-    @Resource
     private ProcessDealService processDealService;
-
-    @Resource
-    private InspectionOrderMapper inspectionOrderMapper;
 
    @Resource
    private ProcessDealMapper processDealMapper;
@@ -84,6 +86,15 @@
 
     @Resource
     private UserMapper userMapper;
+
+    @Resource
+    private InsOrderMapper insOrderMapper;
+
+    @Resource
+    private InsSampleMapper insSampleMapper;
+
+    @Resource
+    private InsSampleReceiptMapper insSampleReceiptMapper;
 
     @Override
     public IPage<ProcessTotaldeal> pageProcessTotaldeal(Page page, ProcessTotaldeal processTotaldeal) {
@@ -139,49 +150,93 @@
 
     @Override
     public int addProcessTotaldeal(String month) {
-        //鏂板鎬昏〃
-        ProcessTotaldeal processTotaldeal = new ProcessTotaldeal();
+        //鏂板鎬昏〃锛堝悓涓�鏈堜唤澶嶇敤宸叉湁鎬昏〃锛�
+        ProcessTotaldeal processTotaldeal;
         List<ProcessTotaldeal> processTotaldeals = processTotaldealMapper.selectList(Wrappers.<ProcessTotaldeal>lambdaQuery()
                 .eq(ProcessTotaldeal::getMonth, month));
-        if (processTotaldeals.size()<=0) {
+        if (processTotaldeals.size() <= 0) {
+            processTotaldeal = new ProcessTotaldeal();
             processTotaldeal.setMonth(month);//鏈堜唤
             processTotaldeal.setSubmitState("寰呮彁浜�");
             processTotaldealMapper.insert(processTotaldeal);
-        }else {
-            processTotaldeal=processTotaldeals.get(0);
+        } else {
+            processTotaldeal = processTotaldeals.get(0);
         }
-        //鏂板璇︽儏琛�
         //1.鑾峰彇璇ユ湀浠界殑绗竴澶╁拰鏈�鍚庝竴澶�
         DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM");
         YearMonth yearMonth = YearMonth.parse(month, formatter);
-        LocalDate firstDay = yearMonth.atDay(1);
-        LocalDate lastDay = yearMonth.atEndOfMonth();
-        //2.鏌ヨ鍦ㄨ繖涓椂闂磋寖鍥村唴鐨勬墍鏈夋牱鍝佺櫥璁扮殑鏁版嵁
-        List<ProcessSample> processSamples = processSampleMapper.selectList(Wrappers.<ProcessSample>lambdaQuery()
-                .between(ProcessSample::getLeaveDate, firstDay, lastDay));
-        if (processSamples.size()>0){
-            //鑾峰彇澶勭悊鏂瑰紡
-            InspectionOrder inspectionOrder = inspectionOrderMapper.selectById(processSamples.get(0).getInspectionOrderId());
-            List<ProcessDeal> processDeals = new ArrayList<>();
-            for (ProcessSample processSample : processSamples) {
-                long count = processDealService.count(Wrappers.<ProcessDeal>lambdaQuery().eq(ProcessDeal::getProcessSampleId, processSample.getId()));
-                if (count>0){
-                    continue;
-                }
-                ProcessDeal processDeal = new ProcessDeal();
-                processDeal.setSampleName(processSample.getSampleName());//鏍峰搧鍚嶇О
-                processDeal.setSampleCode(processSample.getSampleCode());//鏍峰搧缂栧彿
-                processDeal.setSampleSupplier(processSample.getSampleSupplier());//渚涙牱鍗曚綅
-                processDeal.setNum(processSample.getNum());//鏍峰搧鏁伴噺
-                processDeal.setDealMethod(inspectionOrder.getProcessing()==1?"瀹為獙瀹ゅ鐞�":"濮旀墭鍗曚綅鍙栧洖");//澶勭悊鏂瑰紡
-                processDeal.setDealTime(LocalDate.now());//鏃堕棿=褰撳墠鏃堕棿
-                processDeal.setTotaldealId(processTotaldeal.getId());//鎬昏〃id
-                processDeal.setProcessSampleId(processSample.getId());//鏍峰搧鎺ユ敹id
-                processDeals.add(processDeal);
+        LocalDateTime startTime = yearMonth.atDay(1).atStartOfDay();
+        LocalDateTime endTime = yearMonth.atEndOfMonth().atTime(LocalTime.MAX);
+        //2.璇ユ湀涓嬪崟鐨勫鎵樺崟锛堟帓闄ゅ師鏉愭枡锛宼ypeSource 涓虹┖瑙嗕负鎴愬搧锛�
+        List<InsOrder> orders = insOrderMapper.selectList(Wrappers.<InsOrder>lambdaQuery()
+                .ge(InsOrder::getCreateTime, startTime)
+                .le(InsOrder::getCreateTime, endTime));
+        if (orders.isEmpty()) {
+            return 0;
+        }
+        //3.鍙繚鐣欏凡鐢熸垚鏍峰搧鎺ユ敹璁板綍鐨勫鎵橈紙宸插鏍稿彈鐞嗭級
+        List<Integer> orderIds = orders.stream().map(InsOrder::getId).collect(Collectors.toList());
+        List<InsSampleReceipt> receipts = insSampleReceiptMapper.selectList(Wrappers.<InsSampleReceipt>lambdaQuery()
+                .in(InsSampleReceipt::getInsOrderId, orderIds));
+        Set<Integer> receiptOrderIds = receipts.stream().map(InsSampleReceipt::getInsOrderId).collect(Collectors.toSet());
+        Map<Integer, InsOrder> orderMap = orders.stream()
+                .filter(order -> !Integer.valueOf(1).equals(order.getTypeSource()))
+                .filter(order -> receiptOrderIds.contains(order.getId()))
+                .collect(Collectors.toMap(InsOrder::getId, order -> order, (a, b) -> a));
+        if (orderMap.isEmpty()) {
+            return 0;
+        }
+        //4.濮旀墭瀵瑰簲鐨勬牱鍝�
+        List<InsSample> samples = insSampleMapper.selectList(Wrappers.<InsSample>lambdaQuery()
+                .in(InsSample::getInsOrderId, orderMap.keySet()));
+        if (samples.isEmpty()) {
+            return 0;
+        }
+        //5.宸茶繘鍏ヤ换浣曞缃壒娆$殑鏍峰搧璺宠繃锛堣法鏈堜篃涓嶄細閲嶅甯﹀叆锛�
+        List<Integer> sampleIds = samples.stream().map(InsSample::getId).collect(Collectors.toList());
+        Set<Integer> dealtSampleIds = processDealService.list(Wrappers.<ProcessDeal>lambdaQuery()
+                .select(ProcessDeal::getInsSampleId)
+                .in(ProcessDeal::getInsSampleId, sampleIds))
+                .stream().map(ProcessDeal::getInsSampleId).filter(Objects::nonNull).collect(Collectors.toSet());
+        List<ProcessDeal> processDeals = new ArrayList<>();
+        for (InsSample insSample : samples) {
+            if (dealtSampleIds.contains(insSample.getId())) {
+                continue;
             }
+            InsOrder order = orderMap.get(insSample.getInsOrderId());
+            ProcessDeal processDeal = new ProcessDeal();
+            //鏍峰搧鍚嶇О浼樺厛鍙栨姤鍛婂睍绀哄瓧娈�
+            processDeal.setSampleName(order != null && StringUtils.isNotBlank(order.getSampleView())
+                    ? order.getSampleView() : insSample.getSample());
+            processDeal.setSampleCode(insSample.getSampleCode());//鏍峰搧缂栧彿
+            processDeal.setSampleSupplier(order == null ? null : order.getCompany());//渚涙牱鍗曚綅=濮旀墭鍗曚綅
+            processDeal.setNum(insSample.getQuantity() == null ? 1 : insSample.getQuantity());//鏍峰搧鏁伴噺
+            processDeal.setDealMethod(resolveDealMethod(order));//澶勭悊鏂瑰紡=涓嬪崟鏃堕�夋嫨鐨勬牱鍝佸缃�
+            processDeal.setDealTime(LocalDate.now());//鏃堕棿=褰撳墠鏃堕棿
+            processDeal.setTotaldealId(processTotaldeal.getId());//鎬昏〃id
+            processDeal.setInsSampleId(insSample.getId());//妫�楠屾牱鍝乮d
+            processDeals.add(processDeal);
+        }
+        if (!processDeals.isEmpty()) {
             processDealService.saveBatch(processDeals);
         }
-        return 0;
+        return processDeals.size();
+    }
+
+    /**
+     * 澶勭悊鏂瑰紡锛氫笅鍗曟椂鐨勬牱鍝佸缃� 1濮旀墭鏂瑰彇鍥� 2妫�娴嬫柟澶勭疆锛涘巻鍙插崟鏃犺瀛楁鏃跺洖閫�鏃х殑澶勭悊鏂瑰紡瀛楁
+     */
+    private String resolveDealMethod(InsOrder order) {
+        if (order == null) {
+            return StringUtils.EMPTY;
+        }
+        if (Integer.valueOf(1).equals(order.getSampleDisposal())) {
+            return "濮旀墭鍗曚綅鍙栧洖";
+        }
+        if (Integer.valueOf(2).equals(order.getSampleDisposal())) {
+            return "瀹為獙瀹ゅ鐞�";
+        }
+        return Integer.valueOf(1).equals(order.getProcessing()) ? "瀹為獙瀹ゅ鐞�" : "濮旀墭鍗曚綅鍙栧洖";
     }
 
     @Override
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/controller/InsOrderController.java b/inspect-server/src/main/java/com/ruoyi/inspect/controller/InsOrderController.java
index 464d94c..35c07d1 100644
--- a/inspect-server/src/main/java/com/ruoyi/inspect/controller/InsOrderController.java
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/controller/InsOrderController.java
@@ -75,7 +75,7 @@
     @ApiOperation(value = "妫�楠屽垎閰�")
     @PostMapping("/upInsOrder")
     public Result<?> upInsOrder(Integer orderId, Integer sampleId, String appointed, Integer userId,String sonLaboratory) {
-        return Result.success(insOrderService.upInsOrder(orderId, sampleId, appointed, userId,sonLaboratory));
+        return Result.fail("璇峰湪鏍峰搧鎺ユ敹椤甸潰閫夋嫨涓绘楠屼汉鍚庢彁浜ゆ楠�");
     }
 
     @ApiOperation(value = "娣诲姞妫�楠屼笅鍗曟暟鎹�")
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/controller/InsSampleReceiptController.java b/inspect-server/src/main/java/com/ruoyi/inspect/controller/InsSampleReceiptController.java
new file mode 100644
index 0000000..76ce116
--- /dev/null
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/controller/InsSampleReceiptController.java
@@ -0,0 +1,58 @@
+package com.ruoyi.inspect.controller;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.inspect.dto.SampleReceiptActionDto;
+import com.ruoyi.inspect.dto.SampleReceiptQueryDto;
+import com.ruoyi.inspect.service.InsSampleReceiptService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletResponse;
+
+@RestController
+@RequestMapping("/insSampleReceipt")
+@Api(tags = "鏍峰搧鎺ユ敹")
+@AllArgsConstructor
+public class InsSampleReceiptController {
+    private final InsSampleReceiptService insSampleReceiptService;
+
+    @ApiOperation("鏍峰搧鎺ユ敹鍒嗛〉")
+    @GetMapping("/page")
+    public Result page(Page<?> page, SampleReceiptQueryDto query) {
+        return Result.success(insSampleReceiptService.page(page, query));
+    }
+
+    @ApiOperation("鏍峰搧鎺ユ敹璇︽儏")
+    @GetMapping("/{id}")
+    public Result detail(@PathVariable Integer id) {
+        return Result.success(insSampleReceiptService.detail(id));
+    }
+
+    @ApiOperation("鎻愪氦妫�楠�")
+    @PostMapping("/submit")
+    public Result submit(@RequestBody SampleReceiptActionDto dto) {
+        insSampleReceiptService.submit(dto);
+        return Result.success();
+    }
+
+    @ApiOperation("鎷掓敹鏍峰搧")
+    @PostMapping("/reject")
+    public Result reject(@RequestBody SampleReceiptActionDto dto) {
+        insSampleReceiptService.reject(dto);
+        return Result.success();
+    }
+
+    @ApiOperation("鏍峰搧鎺ユ敹瀵煎嚭")
+    @GetMapping("/export")
+    public void export(SampleReceiptQueryDto query, HttpServletResponse response) {
+        insSampleReceiptService.export(query, response);
+    }
+}
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/dto/SampleOrderDto.java b/inspect-server/src/main/java/com/ruoyi/inspect/dto/SampleOrderDto.java
index bdf55f3..2a60950 100644
--- a/inspect-server/src/main/java/com/ruoyi/inspect/dto/SampleOrderDto.java
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/dto/SampleOrderDto.java
@@ -28,6 +28,7 @@
     @ApiModelProperty("鏍峰搧鍨嬪彿")
     private String sampleModel;
 
+    @ApiModelProperty("鎸囨淳妫�楠屼汉id")
     private String assign;
 
     @ExcelProperty(index = 4, value = "鏍峰搧鏁伴噺")
@@ -44,11 +45,14 @@
     @ApiModelProperty("鎶ュ憡id")
     private String reportId;
 
+    @ApiModelProperty("绯荤粺鐢熸垚鎶ュ憡鍦板潃")
     @TableField("`url`")
     private String url;
 
+    @ApiModelProperty("鎵嬪姩涓婁紶鎶ュ憡鍦板潃")
     private String urlS;
 
+    @ApiModelProperty("涓嬪崟浜哄鍚�")
     private String name;
 
     @ExcelProperty(index = 5, value = "妫�楠屼汉")
@@ -86,6 +90,7 @@
     @ApiModelProperty("瀛愬疄楠屽")
     private String sonLaboratory;
 
+    @ApiModelProperty("鏍峰搧鍚嶇О锛堝師鏉愭枡鍙栨牱鍝佸瓧娈碉紝鎴愬搧鍙栨姤鍛婂睍绀哄瓧娈碉級")
     private String sampleStr;
 
 
@@ -95,5 +100,7 @@
     @ApiModelProperty("璁㈠崟id(瀵煎嚭鐢�)")
     private String ids;
 
+    @ApiModelProperty("鎷掓敹鍘熷洜")
+    private String sampleRejectRemark;
 
 }
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/dto/SampleReceiptActionDto.java b/inspect-server/src/main/java/com/ruoyi/inspect/dto/SampleReceiptActionDto.java
new file mode 100644
index 0000000..20a8a5b
--- /dev/null
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/dto/SampleReceiptActionDto.java
@@ -0,0 +1,17 @@
+package com.ruoyi.inspect.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class SampleReceiptActionDto {
+
+    @ApiModelProperty("鏍峰搧鎺ユ敹璁板綍ID")
+    private Integer receiptId;
+
+    @ApiModelProperty("涓绘楠屼汉ID")
+    private Integer mainInspectorId;
+
+    @ApiModelProperty("鎺ユ敹澶囨敞锛屾嫆鏀舵椂涓烘嫆鏀跺娉�")
+    private String remark;
+}
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/dto/SampleReceiptPageDto.java b/inspect-server/src/main/java/com/ruoyi/inspect/dto/SampleReceiptPageDto.java
new file mode 100644
index 0000000..0140c26
--- /dev/null
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/dto/SampleReceiptPageDto.java
@@ -0,0 +1,52 @@
+package com.ruoyi.inspect.dto;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Data
+@ExcelIgnoreUnannotated
+public class SampleReceiptPageDto {
+
+    @ApiModelProperty("鏍峰搧鎺ユ敹璁板綍ID")
+    private Integer receiptId;
+    @ApiModelProperty("濮旀墭鍗旾D")
+    private Integer orderId;
+    @ApiModelProperty("鏍峰搧ID")
+    private Integer sampleId;
+    @ApiModelProperty("鏍峰搧鎺ユ敹鐘舵�� 0寰呮帴鏀� 1宸叉彁浜ゆ楠� 2宸叉嫆鏀� 3宸插彇娑�")
+    private Integer status;
+    @ExcelProperty(value = "鏍峰搧鍚嶇О", index = 0)
+    @ApiModelProperty("鏍峰搧鍚嶇О")
+    private String sampleName;
+    @ExcelProperty(value = "鏍峰搧缂栧彿", index = 1)
+    @ApiModelProperty("鏍峰搧缂栧彿")
+    private String sampleCode;
+    @ExcelProperty(value = "妫�娴嬮」鐩�", index = 2)
+    @ApiModelProperty("妫�娴嬮」鐩�")
+    private String inspectionItem;
+    @ExcelProperty(value = "濮旀墭缂栧彿", index = 3)
+    @ApiModelProperty("濮旀墭缂栧彿")
+    private String entrustCode;
+    @ExcelProperty(value = "鏂规硶鏍囧噯", index = 4)
+    @ApiModelProperty("鏂规硶鏍囧噯")
+    private String methodStandard;
+    @ApiModelProperty("涓绘楠屼汉ID")
+    private Integer mainInspectorId;
+    @ExcelProperty(value = "涓绘浜虹瀛�", index = 5)
+    @ApiModelProperty("涓绘楠屼汉濮撳悕")
+    private String mainInspectorName;
+    @ExcelProperty(value = "澶囨敞", index = 6)
+    @ApiModelProperty("鎺ユ敹澶囨敞")
+    private String remark;
+    @ExcelProperty(value = "鎷掓敹澶囨敞", index = 7)
+    @ApiModelProperty("鎷掓敹澶囨敞")
+    private String rejectRemark;
+    @ApiModelProperty("鎺ユ敹澶勭悊鏃堕棿")
+    private LocalDateTime receiveTime;
+    @ApiModelProperty("鎺ユ敹澶勭悊浜�")
+    private String receiveUserName;
+}
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/dto/SampleReceiptQueryDto.java b/inspect-server/src/main/java/com/ruoyi/inspect/dto/SampleReceiptQueryDto.java
new file mode 100644
index 0000000..9407aad
--- /dev/null
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/dto/SampleReceiptQueryDto.java
@@ -0,0 +1,17 @@
+package com.ruoyi.inspect.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class SampleReceiptQueryDto {
+
+    @ApiModelProperty("鏍峰搧鎺ユ敹鐘舵�� 0寰呮帴鏀� 1宸叉彁浜ゆ楠� 2宸叉嫆鏀� 3宸插彇娑�")
+    private Integer status;
+    @ApiModelProperty("濮旀墭缂栧彿")
+    private String entrustCode;
+    @ApiModelProperty("鏍峰搧缂栧彿")
+    private String sampleCode;
+    @ApiModelProperty("鏍峰搧鍚嶇О")
+    private String sampleName;
+}
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/event/NewJuOrderPlacedEvent.java b/inspect-server/src/main/java/com/ruoyi/inspect/event/NewJuOrderPlacedEvent.java
new file mode 100644
index 0000000..a59a6ef
--- /dev/null
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/event/NewJuOrderPlacedEvent.java
@@ -0,0 +1,14 @@
+package com.ruoyi.inspect.event;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+/**
+ * 鏂拌仛鐩寸粦妯℃澘涓嬪崟鎴愬姛浜嬩欢銆�
+ */
+@Data
+@AllArgsConstructor
+public class NewJuOrderPlacedEvent {
+
+    private Integer insOrderId;
+}
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsOrderMapper.java b/inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsOrderMapper.java
index d418b17..3876924 100644
--- a/inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsOrderMapper.java
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsOrderMapper.java
@@ -30,7 +30,7 @@
 public interface InsOrderMapper extends BaseMapper<InsOrder> {
 
     //鑾峰彇妫�楠屼笅鍗曟暟鎹�
-    IPage<SampleOrderDto> selectInsOrderPage(@Param("page") IPage<InsOrder> page, @Param("ew") QueryWrapper<SampleOrderDto> ew, @Param("laboratory") String laboratory, @Param("isOrderAll") String isOrderAll);
+    IPage<SampleOrderDto> selectInsOrderPage(@Param("page") IPage<InsOrder> page, @Param("ew") QueryWrapper<SampleOrderDto> ew, @Param("laboratory") String laboratory, @Param("isOrderAll") String isOrderAll, @Param("receiptSubmitted") String receiptSubmitted);
 
 
     String getLaboratoryCode(@Param("name") String name);
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsSampleReceiptMapper.java b/inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsSampleReceiptMapper.java
new file mode 100644
index 0000000..efb4c8e
--- /dev/null
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsSampleReceiptMapper.java
@@ -0,0 +1,26 @@
+package com.ruoyi.inspect.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.inspect.dto.SampleReceiptPageDto;
+import com.ruoyi.inspect.dto.SampleReceiptQueryDto;
+import com.ruoyi.inspect.pojo.InsSampleReceipt;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+@Mapper
+public interface InsSampleReceiptMapper extends BaseMapper<InsSampleReceipt> {
+
+    IPage<SampleReceiptPageDto> selectPage(Page<?> page, @Param("query") SampleReceiptQueryDto query);
+
+    SampleReceiptPageDto selectDetail(@Param("id") Integer id);
+
+    InsSampleReceipt selectForUpdate(@Param("id") Integer id);
+
+    int insertIgnore(@Param("orderId") Integer orderId, @Param("sampleId") Integer sampleId);
+
+    List<SampleReceiptPageDto> selectExportList(@Param("query") SampleReceiptQueryDto query);
+}
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/pojo/InsOrder.java b/inspect-server/src/main/java/com/ruoyi/inspect/pojo/InsOrder.java
index 7a8f596..9a93ab5 100644
--- a/inspect-server/src/main/java/com/ruoyi/inspect/pojo/InsOrder.java
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/pojo/InsOrder.java
@@ -67,7 +67,7 @@
     @ApiModelProperty("鏄惁鐣欐牱")
     private Integer isLeave;
 
-    @ApiModelProperty("鐘舵��:-1:鍘熸潗鏂欐挙鍥�  1锛氭楠屽鐞� 0锛氬緟瀹℃牳 2锛氶��鍥� 3锛氭挙閿�")
+    @ApiModelProperty("鐘舵��:-1:鍘熸潗鏂欐挙鍥� 0:寰呭鏍� 1:鏍峰搧鎺ユ敹/妫�楠屽鐞� 2:閫�鍥� 3:鎾ら攢 4:宸叉楠� 5:浣滃簾")
     private Integer state;
 
     @ExcelProperty(index = 7, value = "澶囨敞")
@@ -160,6 +160,7 @@
     private Integer prepareUserId;
 
     @ExcelProperty(index = 12, value = "濮旀墭浜�")
+    @ApiModelProperty("濮旀墭浜�")
     private String prepareUser;
 
     @ApiModelProperty(name = "濮旀墭浜鸿嫳鏂�")
@@ -233,6 +234,27 @@
     @ApiModelProperty("棣栨淇濆瓨妫�楠屾ā鏉垮�兼椂闂�")
     private LocalDateTime firstInspectDate;
 
+    @ApiModelProperty("鍒嗗寘鍐呭 0鏃� 1鏈�")
+    private Integer subcontractType;
+
+    @ApiModelProperty("鍒嗗寘鍗曚綅淇℃伅")
+    private String subcontractCompany;
+
+    @ApiModelProperty("鏍峰搧澶勭疆 1濮旀墭鏂瑰彇鍥� 2妫�娴嬫柟澶勭疆")
+    private Integer sampleDisposal;
+
+    @ApiModelProperty("瀵圭粨鏋滆瘎浠� 0鍚� 1鏄�")
+    private Integer resultEvaluation;
+
+    @ApiModelProperty("鎶ュ憡浜や粯鏂瑰紡 1鑷彇 2蹇�� 3鐢靛瓙浼犻��")
+    private Integer reportDelivery;
+
+    @ApiModelProperty("鎶ュ憡瀵勯�佸湴鍧�")
+    private String reportAddress;
+
+    @ApiModelProperty("鏀朵欢浜哄強鐢佃瘽")
+    private String reportReceiver;
+
     @ApiModelProperty("鏍锋満鍛�(闄や簡鍏朵粬鎴愬搧澶栬繖涓瓧娈靛繀閫�,鐢ㄤ簬浼佷笟寰俊鎺ㄩ��)")
     @TableField(exist = false)
     private Integer issueUser;
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/pojo/InsOrderTemplate.java b/inspect-server/src/main/java/com/ruoyi/inspect/pojo/InsOrderTemplate.java
index eca4601..1da3e56 100644
--- a/inspect-server/src/main/java/com/ruoyi/inspect/pojo/InsOrderTemplate.java
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/pojo/InsOrderTemplate.java
@@ -18,6 +18,7 @@
     /**
      *
      */
+    @ApiModelProperty("涓婚敭")
     @TableId(type = IdType.AUTO)
     private Integer id;
 
@@ -33,6 +34,10 @@
     @ApiModelProperty("妯℃澘鍐呭")
     private String thing;
 
+    @ApiModelProperty("缁戝畾鐨勬爣鍑嗗簱浜岀骇鏍囧噯ID")
+    private Integer standardTreeId;
+
+    @ApiModelProperty("鍒涘缓浜�")
     @TableField(fill = FieldFill.INSERT)
     private Integer createUser;
 
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/pojo/InsReport.java b/inspect-server/src/main/java/com/ruoyi/inspect/pojo/InsReport.java
index 85f7c8f..2f2e668 100644
--- a/inspect-server/src/main/java/com/ruoyi/inspect/pojo/InsReport.java
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/pojo/InsReport.java
@@ -18,6 +18,7 @@
     /**
      *
      */
+    @ApiModelProperty("涓婚敭")
     @TableId(type = IdType.AUTO)
     private Integer id;
 
@@ -27,7 +28,7 @@
     /**
      * 澶栭敭锛氭楠屽崟id
      */
-    @ApiModelProperty("鍒涘缓鏃堕棿")
+    @ApiModelProperty("妫�楠屽崟id")
     private Integer insOrderId;
 
     /** 0锛氭娴嬫姤鍛婏紙浠呮娴嬫暟鎹級锛�1锛氭楠屾姤鍛婏紙鍚垽瀹氱粨鏋滐級 */
@@ -37,7 +38,7 @@
     /**
      * 绯荤粺鐢熸垚鎶ュ憡鍦板潃
      */
-    @ApiModelProperty("鍒涘缓鏃堕棿")
+    @ApiModelProperty("绯荤粺鐢熸垚鎶ュ憡鍦板潃")
     private String url;
 
     /**
@@ -49,13 +50,13 @@
     /**
      * 鎵嬪姩涓婁紶鎶ュ憡鍦板潃
      */
-    @ApiModelProperty("鍒涘缓鏃堕棿")
+    @ApiModelProperty("鎵嬪姩涓婁紶鎶ュ憡鍦板潃")
     private String urlS;
 
     /**
      * 涓存椂鎶ュ憡鍦板潃
      */
-    @ApiModelProperty("鍒涘缓鏃堕棿")
+    @ApiModelProperty("涓存椂鎶ュ憡鍦板潃")
     private String tempUrlPdf;
 
     /**
@@ -79,21 +80,22 @@
     /**
      * 澶栭敭锛氱敤鎴穒d锛堟彁浜や汉锛�
      */
-    @ApiModelProperty("鍒涘缓鏃堕棿")
+    @ApiModelProperty("鎻愪氦浜虹敤鎴穒d")
     private Integer writeUserId;
 
     /**
      * 澶栭敭锛氱敤鎴穒d锛堟壒鍑嗕汉锛�
      */
-    @ApiModelProperty("鍒涘缓鏃堕棿")
+    @ApiModelProperty("鎵瑰噯浜虹敤鎴穒d")
     private Integer ratifyUserId;
 
     /**
      * 澶栭敭锛氱敤鎴穒d锛堝鏍镐汉锛�
      */
-    @ApiModelProperty("鍒涘缓鏃堕棿")
+    @ApiModelProperty("瀹℃牳浜虹敤鎴穒d")
     private Integer examineUserId;
 
+    @ApiModelProperty("鍒涘缓浜�")
     @TableField(fill = FieldFill.INSERT)
     private Integer createUser;
 
@@ -102,6 +104,7 @@
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private LocalDateTime createTime;
 
+    @ApiModelProperty("鏇存柊浜�")
     @TableField(fill = FieldFill.INSERT_UPDATE)
     private Integer updateUser;
 
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/pojo/InsSampleReceipt.java b/inspect-server/src/main/java/com/ruoyi/inspect/pojo/InsSampleReceipt.java
new file mode 100644
index 0000000..a42f8f8
--- /dev/null
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/pojo/InsSampleReceipt.java
@@ -0,0 +1,42 @@
+package com.ruoyi.inspect.pojo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Data
+@TableName("ins_sample_receipt")
+public class InsSampleReceipt {
+
+    @ApiModelProperty("涓婚敭")
+    @TableId(type = IdType.AUTO)
+    private Integer id;
+    @ApiModelProperty("濮旀墭鍗旾D")
+    private Integer insOrderId;
+    @ApiModelProperty("鏍峰搧ID")
+    private Integer insSampleId;
+    @ApiModelProperty("鏍峰搧鎺ユ敹鐘舵�� 0寰呮帴鏀� 1宸叉彁浜ゆ楠� 2宸叉嫆鏀� 3宸插彇娑�")
+    private Integer status;
+    @ApiModelProperty("涓绘楠屼汉ID")
+    private Integer mainInspectorId;
+    @ApiModelProperty("鎺ユ敹澶勭悊浜篒D")
+    private Integer receiveUserId;
+    @ApiModelProperty("鎺ユ敹澶勭悊鏃堕棿")
+    private LocalDateTime receiveTime;
+    @ApiModelProperty("鎻愪氦妫�楠屾椂闂�")
+    private LocalDateTime submitTime;
+    @ApiModelProperty("鎷掓敹澶囨敞")
+    private String rejectRemark;
+    @ApiModelProperty("鍒涘缓浜�")
+    private Integer createUser;
+    @ApiModelProperty("鍒涘缓鏃堕棿")
+    private LocalDateTime createTime;
+    @ApiModelProperty("鏇存柊浜�")
+    private Integer updateUser;
+    @ApiModelProperty("鏇存柊鏃堕棿")
+    private LocalDateTime updateTime;
+}
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/service/InsOrderTemplateService.java b/inspect-server/src/main/java/com/ruoyi/inspect/service/InsOrderTemplateService.java
index 03d6894..3dc7f9f 100644
--- a/inspect-server/src/main/java/com/ruoyi/inspect/service/InsOrderTemplateService.java
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/service/InsOrderTemplateService.java
@@ -2,6 +2,7 @@
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.ruoyi.inspect.pojo.InsOrderTemplate;
+import com.ruoyi.inspect.vo.InsOrderTemplateDetailVo;
 
 import java.util.List;
 
@@ -16,7 +17,7 @@
 
     List<InsOrderTemplate> selectInsOrderTemplate(String company);
 
-    String selectInsOrderTemplateById(Integer id);
+    InsOrderTemplateDetailVo selectInsOrderTemplateById(Integer id);
 
     int delInsOrderTemplate(Integer id);
 
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/service/InsSampleReceiptService.java b/inspect-server/src/main/java/com/ruoyi/inspect/service/InsSampleReceiptService.java
new file mode 100644
index 0000000..6c163e0
--- /dev/null
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/service/InsSampleReceiptService.java
@@ -0,0 +1,24 @@
+package com.ruoyi.inspect.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.inspect.dto.SampleReceiptActionDto;
+import com.ruoyi.inspect.dto.SampleReceiptPageDto;
+import com.ruoyi.inspect.dto.SampleReceiptQueryDto;
+import com.ruoyi.inspect.pojo.InsSampleReceipt;
+
+import javax.servlet.http.HttpServletResponse;
+
+public interface InsSampleReceiptService extends IService<InsSampleReceipt> {
+
+    IPage<SampleReceiptPageDto> page(Page<?> page, SampleReceiptQueryDto query);
+
+    SampleReceiptPageDto detail(Integer id);
+
+    void submit(SampleReceiptActionDto dto);
+
+    void reject(SampleReceiptActionDto dto);
+
+    void export(SampleReceiptQueryDto query, HttpServletResponse response);
+}
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderPlanServiceImpl.java b/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderPlanServiceImpl.java
index dff3ad5..5cfeb47 100644
--- a/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderPlanServiceImpl.java
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderPlanServiceImpl.java
@@ -274,11 +274,11 @@
         // 鏌ヨ璁㈠崟Id
         InsOrder order = insOrderMapper.selectFirstSubmit(dto.getId());
         if (order == null) {
-            return BeanUtil.isEmpty(insProducts) ? null : insProducts;
+            return BeanUtil.isEmpty(insProducts) ? Collections.emptyList() : insProducts;
         }
         insProducts = mergeDirectTemplateSnapshots(order, dto.getId(), dto.getLaboratory(), insProducts);
         if (BeanUtil.isEmpty(insProducts)) {
-            return null;
+            return Collections.emptyList();
         }
         getTemplateThing(order, insProducts, dto.getLaboratory());
         return insProducts;
@@ -300,14 +300,6 @@
         if (snapshots.isEmpty()) {
             return source;
         }
-        InsSample sample = insSampleMapper.selectById(sampleId);
-        boolean directTemplateOrder = source.stream()
-                .anyMatch(product -> product.getTemplateRowIndex() != null)
-                || isDirectTemplateSample(order, sample);
-        if (!directTemplateOrder) {
-            return source;
-        }
-
         Map<Integer, List<InsProduct>> productsByTemplate = source.stream()
                 .filter(product -> product.getTemplateId() != null)
                 .collect(Collectors.groupingBy(InsProduct::getTemplateId, LinkedHashMap::new, Collectors.toList()));
@@ -3588,10 +3580,7 @@
             firstInspectDate = submitTime;
         }
 
-        String insTime = firstInspectDate.format(DateTimeFormatter.ofPattern("yyyy骞碝M鏈坉d鏃�")) + "-"
-                + submitTime.format(DateTimeFormatter.ofPattern("yyyy骞碝M鏈坉d鏃�"));
-        String testStartDate = firstInspectDate.format(DateTimeFormatter.ofPattern("yyyy骞碝M鏈坉d鏃�"));
-        String testEndDate = submitTime.format(DateTimeFormatter.ofPattern("yyyy骞碝M鏈坉d鏃�"));
+        String insTime = formatReportTestDate(firstInspectDate, submitTime);
 
         String insTimeEn = monthNames[firstInspectDate.getMonthValue() - 1] + " " + firstInspectDate.format(DateTimeFormatter.ofPattern("dd, yyyy")) + "-"
                 + monthNames[submitTime.getMonthValue() - 1] + " " + submitTime.format(DateTimeFormatter.ofPattern("dd, yyyy"));
@@ -3738,8 +3727,6 @@
                     put("batch", finalBatchNo);
                     put("phone", defaultReportText(insOrder.getPhone(), "/"));
                     put("testDate", insTime);
-                    put("testStartDate", testStartDate);
-                    put("testEndDate", testEndDate);
                     put("entrustNo", defaultReportText(insOrder.getEntrustCode(), "/"));
                     put("sampling", "/");
                     put("standard", finalStandardMethodText);
@@ -3954,16 +3941,21 @@
         if (CollectionUtils.isEmpty(deviceList)) {
             return "/";
         }
-        Set<String> lines = new LinkedHashSet<>();
-        int sequence = 1;
+        Set<String> equipmentItems = new LinkedHashSet<>();
         for (Map<String, String> device : deviceList) {
             String name = getMapText(device, "deviceName", "device_name");
             String managementNumber = getMapText(device, "managementNumber", "management_number");
-            String line = sequence++ + ". " + defaultReportText(name, "/");
+            String item = defaultReportText(name, "/");
             if (StringUtils.isNotBlank(managementNumber)) {
-                line += "锛�" + managementNumber;
+                item += "锛�" + managementNumber;
             }
-            lines.add(line);
+            equipmentItems.add(item);
+        }
+        List<String> items = new ArrayList<>(equipmentItems);
+        List<String> lines = new ArrayList<>();
+        for (int i = 0; i < items.size(); i++) {
+            String punctuation = i == items.size() - 1 ? "銆�" : "锛�";
+            lines.add((i + 1) + ". " + items.get(i) + punctuation);
         }
         return String.join("\n", lines);
     }
@@ -3984,7 +3976,7 @@
                 .collect(Collectors.toList());
 
         String temperature = formatConditionRange(temperatures, order.getTemperature(), "鈩�");
-        String humidity = formatConditionRange(humidities, order.getHumidity(), "%");
+        String humidity = formatConditionRange(humidities, order.getHumidity(), "%RH");
         return Stream.of(temperature, humidity)
                 .filter(StringUtils::isNotBlank)
                 .collect(Collectors.joining(" "));
@@ -4057,6 +4049,14 @@
         return StringUtils.isNotBlank(fallback) ? fallback : "/";
     }
 
+    private static String formatReportTestDate(LocalDateTime startTime, LocalDateTime endTime) {
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy骞碝M鏈坉d鏃�");
+        if (startTime.toLocalDate().equals(endTime.toLocalDate())) {
+            return startTime.format(formatter);
+        }
+        return startTime.format(formatter) + "鑷�" + endTime.format(formatter);
+    }
+
     /**
      * 璁$畻琛ㄦ牸鍒楀搴�
      *
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderServiceImpl.java b/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderServiceImpl.java
index 5be630d..e1bc8a1 100644
--- a/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderServiceImpl.java
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderServiceImpl.java
@@ -57,6 +57,7 @@
 import lombok.AllArgsConstructor;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.BeanUtils;
+import org.springframework.context.ApplicationEventPublisher;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Isolation;
 import org.springframework.transaction.annotation.Transactional;
@@ -107,6 +108,8 @@
     private StandardTemplateService standardTemplateService;
     private InsOrderStandardTemplateMapper insOrderStandardTemplateMapper;
     private InsOrderTemplateDeviceMapper insOrderTemplateDeviceMapper;
+    private InsSampleReceiptMapper insSampleReceiptMapper;
+    private ApplicationEventPublisher applicationEventPublisher;
 
 
 
@@ -120,7 +123,10 @@
             isOrderAll = "1";
             sampleOrderDto.setState(null);
         }
-        return insOrderMapper.selectInsOrderPage(page, QueryWrappers.queryWrappers(sampleOrderDto), laboratory, isOrderAll);
+        // 妫�楠屼腑锛氭柊鑱氫笅鍗曞厤瀹℃牳鍗冲彈鐞嗭紝闇�鏍峰搧鎺ユ敹鎻愪氦鍚庯紙ins_sample_receipt.status=1锛夋墠灞曠ず
+        String receiptSubmitted = sampleOrderDto.getState() != null && sampleOrderDto.getState() == 1 ? "1" : null;
+        return insOrderMapper.selectInsOrderPage(page, QueryWrappers.queryWrappers(sampleOrderDto), laboratory,
+                isOrderAll, receiptSubmitted);
     }
 
 
@@ -175,13 +181,17 @@
         }
 
         if (userId != null) {
-            InsSampleUser insSampleUser = new InsSampleUser();
-            insSampleUser.setState(0);
-            insSampleUser.setUserId(userId);
-            insSampleUser.setInsSampleId(orderId);
-            insSampleUser.setSonLaboratory(directTemplateOrder
-                    ? DIRECT_TEMPLATE_LABORATORY : sonLaboratory);
-            insSampleUserMapper.insert(insSampleUser);
+            Set<String> assignedLaboratories = StringUtils.isBlank(sonLaboratory)
+                    ? taskLaboratories
+                    : Collections.singleton(sonLaboratory);
+            for (String laboratory : assignedLaboratories) {
+                InsSampleUser insSampleUser = new InsSampleUser();
+                insSampleUser.setState(0);
+                insSampleUser.setUserId(userId);
+                insSampleUser.setInsSampleId(orderId);
+                insSampleUser.setSonLaboratory(laboratory);
+                insSampleUserMapper.insert(insSampleUser);
+            }
         }
 
         // 鍒ゆ柇璁㈠崟鏈夋病鏈夌粦瀹氭娊鏍疯鍒�
@@ -412,9 +422,7 @@
             // 瀹℃牳妫�楠屽崟
             upInsOrderOfState(insOrder);
 
-            // 鍒嗛厤妫�楠屼汉
-            String sonLaboratory = insOrder.getTypeSource().equals(1)?"鍘熸潗鏂�":"鎴愬搧瀹為獙瀹�";
-            upInsOrder(insOrder.getId(), null, appointed != null ? appointed.toString() : null, SecurityUtils.getUserId().intValue(), sonLaboratory);
+            // 瀹℃牳閫氳繃鍚庝粎杩涘叆鏍峰搧鎺ユ敹锛涚敱鏍峰搧鎺ユ敹椤甸潰閫夋嫨涓绘楠屼汉鍚庡啀鍒涘缓妫�楠屼换鍔°��
 
             //鏄惁涓哄師鏉愭枡涓嬪崟
             if(insOrder.getTypeSource().equals(1)){
@@ -477,6 +485,24 @@
         if (StringUtils.isBlank(sampleCode) || sampleCode.length() < 2) {
             throw new ErrorException("鏍峰搧缂栧彿涓嶈兘涓虹┖涓斾笉鑳藉皯浜�2浣�");
         }
+        // 濮旀墭瑕佹眰瀛楁鏍¢獙锛氬洓缁勫崟閫夊繀閫夛紝鍒嗗寘/蹇�掕仈鍔ㄥ繀濉�
+        InsOrder reqOrder = dto.getInsOrder();
+        if (reqOrder.getSubcontractType() == null || reqOrder.getSampleDisposal() == null
+                || reqOrder.getResultEvaluation() == null || reqOrder.getReportDelivery() == null) {
+            throw new ErrorException("璇烽�夋嫨鍒嗗寘鍐呭銆佹牱鍝佸缃�佸缁撴灉璇勪环鍜屾姤鍛婁氦浠樻柟寮�");
+        }
+        if (Integer.valueOf(1).equals(reqOrder.getSubcontractType())
+                && StringUtils.isBlank(reqOrder.getSubcontractCompany())) {
+            throw new ErrorException("鍒嗗寘鍐呭涓烘湁鏃讹紝鍒嗗寘鍗曚綅淇℃伅涓嶈兘涓虹┖");
+        }
+        if (Integer.valueOf(2).equals(reqOrder.getReportDelivery())) {
+            if (StringUtils.isBlank(reqOrder.getReportAddress())) {
+                throw new ErrorException("鎶ュ憡浜や粯鏂瑰紡涓哄揩閫掓椂锛屾姤鍛婂瘎閫佸湴鍧�涓嶈兘涓虹┖");
+            }
+            if (StringUtils.isBlank(reqOrder.getReportReceiver())) {
+                throw new ErrorException("鎶ュ憡浜や粯鏂瑰紡涓哄揩閫掓椂锛屾敹浠朵汉鍙婄數璇濅笉鑳戒负绌�");
+            }
+        }
         StandardTree standard = standardTreeService.getById(dto.getStandardTreeId());
         if (standard == null || StringUtils.isBlank(standard.getSample())
                 || standard.getSampleType() != null || standard.getModel() != null) {
@@ -537,7 +563,9 @@
 
         InsOrder order = dto.getInsOrder();
         order.setId(null);
-        order.setState(0);
+        // 鏂拌仛涓嬪崟鍏嶅鏍革細鐩存帴鍙楃悊锛屼笅鍗曞嵆娴佽浆鍒版牱鍝佹帴鏀�
+        order.setState(1);
+        order.setExamineTime(LocalDateTime.now());
         order.setIsExemption(0);
         order.setFactory(null);
         order.setLaboratory(standard.getLaboratory());
@@ -549,6 +577,14 @@
         // 鏂拌仛璁㈠崟鐨勭幆澧冩潯浠剁敱妫�楠屼换鍔″~鍐欙紝閬垮厤涓嬪崟妯℃澘鎴栨祻瑙堝櫒缂撳瓨甯﹀叆鏃у�笺��
         order.setTemperature(null);
         order.setHumidity(null);
+        // 鏈懡涓仈鍔ㄦ潯浠舵椂娓呯┖瀵瑰簲鏂囨湰瀛楁锛岄伩鍏嶆ā鏉垮揩鐓ф垨娴忚鍣ㄧ紦瀛樺甫鍏ユ棫鍊笺��
+        if (!Integer.valueOf(1).equals(order.getSubcontractType())) {
+            order.setSubcontractCompany(null);
+        }
+        if (!Integer.valueOf(2).equals(order.getReportDelivery())) {
+            order.setReportAddress(null);
+            order.setReportReceiver(null);
+        }
         insOrderMapper.insert(order);
 
         InsSample sample = new InsSample();
@@ -590,6 +626,10 @@
         insOrderMapper.update(null, Wrappers.<InsOrder>lambdaUpdate()
                 .eq(InsOrder::getId, order.getId())
                 .set(InsOrder::getEntrustCode, entrustCode));
+        // 鍏嶅鏍稿悗鐢变笅鍗曠敓鎴愬緟鎺ユ敹鐨勬牱鍝佹帴鏀惰褰曪紝涓绘楠屼汉浠嶅湪鏍峰搧鎺ユ敹椤甸潰閫夋嫨鍚庢墠鍒涘缓妫�楠屼换鍔�
+        insSampleReceiptMapper.insertIgnore(order.getId(), sample.getId());
+        // 鍚屼簨鍔″唴鍙戝竷涓嬪崟浜嬩欢锛岀敱 cnas-process 鑷姩鐢熸垚妫�楠屽鎵樺崟锛涚洃鍚櫒寮傚父浼氳繛甯︿笅鍗曞洖婊�
+        applicationEventPublisher.publishEvent(new com.ruoyi.inspect.event.NewJuOrderPlacedEvent(order.getId()));
         return order.getId();
     }
 
@@ -701,6 +741,7 @@
      * @return
      */
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public int upInsOrderOfState(InsOrder insOrder) {
         insOrder.setExamineTime(LocalDateTime.now());
         if (insOrder.getState() == 1) {
@@ -746,7 +787,17 @@
 
             insOrder.setEntrustCode(no);
         }
-        return insOrderMapper.updateById(insOrder);
+        int updated = insOrderMapper.updateById(insOrder);
+        if (updated > 0 && Integer.valueOf(1).equals(insOrder.getState())) {
+            List<InsSample> samples = insSampleMapper.selectList(Wrappers.<InsSample>lambdaQuery()
+                    .eq(InsSample::getInsOrderId, insOrder.getId())
+                    .orderByAsc(InsSample::getId));
+            if (samples.size() != 1) {
+                throw new ErrorException("濮旀墭鍗曞繀椤讳笖鍙兘鍖呭惈涓�涓牱鍝侊紝涓嶈兘杩涘叆鏍峰搧鎺ユ敹娴佺▼");
+            }
+            insSampleReceiptMapper.insertIgnore(insOrder.getId(), samples.get(0).getId());
+        }
+        return updated;
     }
 
     /**
@@ -1104,7 +1155,7 @@
         insOrder.setState(1);
 
         upInsOrderOfState(insOrder);
-        upInsOrder(insOrder.getId(), null, appointed != null ? appointed.toString() : null, SecurityUtils.getUserId().intValue(), "鍘熸潗鏂�");
+        // 瀹℃牳閫氳繃鍚庝粎杩涘叆鏍峰搧鎺ユ敹锛涚敱鏍峰搧鎺ユ敹椤甸潰閫夋嫨涓绘楠屼汉鍚庡啀鍒涘缓妫�楠屼换鍔°��
 
         return insOrder.getId();
     }
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderTemplateServiceImpl.java b/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderTemplateServiceImpl.java
index b56ffeb..0de8550 100644
--- a/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderTemplateServiceImpl.java
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderTemplateServiceImpl.java
@@ -1,14 +1,21 @@
 package com.ruoyi.inspect.service.impl;
 
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.basic.dto.StandardTreeTemplateBindingVo;
+import com.ruoyi.basic.service.StandardTreeService;
 import com.ruoyi.inspect.mapper.InsOrderTemplateMapper;
 import com.ruoyi.inspect.pojo.InsOrderTemplate;
 import com.ruoyi.inspect.service.InsOrderTemplateService;
+import com.ruoyi.inspect.vo.InsOrderTemplateDetailVo;
 import lombok.AllArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Service;
 
+import java.util.ArrayList;
 import java.util.List;
 
 /**
@@ -22,6 +29,8 @@
         implements InsOrderTemplateService {
 
     private InsOrderTemplateMapper insOrderTemplateMapper;
+
+    private StandardTreeService standardTreeService;
 
     @Override
     public int addInsOrderTemplate(InsOrderTemplate insOrderTemplate) {
@@ -42,8 +51,39 @@
     }
 
     @Override
-    public String selectInsOrderTemplateById(Integer id) {
-        return insOrderTemplateMapper.selectById(id).getThing();
+    public InsOrderTemplateDetailVo selectInsOrderTemplateById(Integer id) {
+        InsOrderTemplate template = insOrderTemplateMapper.selectById(id);
+        InsOrderTemplateDetailVo vo = new InsOrderTemplateDetailVo();
+        if (template == null) {
+            vo.setTemplateBindings(new ArrayList<>());
+            return vo;
+        }
+        vo.setThing(template.getThing());
+        // 浼樺厛鍙栨ā鏉垮垪涓婃寔涔呭寲鐨勬爣鍑咺D锛屽巻鍙叉暟鎹洖閫�鍒颁粠琛ㄥ崟蹇収 addObj.standardTreeId 瑙f瀽
+        Integer standardTreeId = template.getStandardTreeId();
+        if (standardTreeId == null) {
+            standardTreeId = parseStandardTreeId(template.getThing());
+        }
+        vo.setStandardTreeId(standardTreeId);
+        if (standardTreeId != null) {
+            List<StandardTreeTemplateBindingVo> bindings = standardTreeService.selectTemplateBindings(standardTreeId);
+            vo.setTemplateBindings(bindings == null ? new ArrayList<>() : bindings);
+        } else {
+            vo.setTemplateBindings(new ArrayList<>());
+        }
+        return vo;
+    }
+
+    private Integer parseStandardTreeId(String thing) {
+        if (StringUtils.isBlank(thing)) {
+            return null;
+        }
+        try {
+            JSONObject addObj = JSON.parseObject(thing).getJSONObject("addObj");
+            return addObj == null ? null : addObj.getInteger("standardTreeId");
+        } catch (Exception ignored) {
+            return null;
+        }
     }
 
     @Override
@@ -51,7 +91,3 @@
         return insOrderTemplateMapper.deleteById(id);
     }
 }
-
-
-
-
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsReportServiceImpl.java b/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsReportServiceImpl.java
index bfb7516..5333df2 100644
--- a/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsReportServiceImpl.java
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsReportServiceImpl.java
@@ -6,6 +6,7 @@
 import com.alibaba.excel.ExcelWriter;
 import com.alibaba.excel.write.metadata.WriteSheet;
 import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
+import com.aspose.words.FontSettings;
 import com.aspose.words.License;
 import com.aspose.words.SaveFormat;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@@ -87,6 +88,12 @@
 @Slf4j
 public class InsReportServiceImpl extends ServiceImpl<InsReportMapper, InsReport>
         implements InsReportService {
+    static {
+        // Linux 鏈嶅姟鍣ㄧ己灏戜腑鏂囧瓧浣擄紝鎶ュ憡杞� PDF 鏃朵腑鏂囦細鍙樻垚鏂瑰潡锛涘皢妯℃澘瀛椾綋鏄犲皠鍒� Noto CJK 鍏滃簳銆�
+        FontSettings.addFontSubstitutes("瀹嬩綋", "Noto Serif CJK SC");
+        FontSettings.addFontSubstitutes("榛戜綋", "Noto Sans CJK SC");
+    }
+
     private static final int DETECTION_REPORT = 0;
     private static final int INSPECTION_REPORT = 1;
 
@@ -307,6 +314,9 @@
             if (userId == null) {
                 throw new ErrorException("缂哄皯鎵瑰噯浜�");
             }
+            if (Objects.equals(insReport.getExamineUserId(), userId)) {
+                throw new ErrorException("瀹℃牳浜哄拰鎵瑰噯浜轰笉鑳戒负鍚屼竴浜猴紝璇烽噸鏂伴�夋嫨鎵瑰噯浜�");
+            }
         }
         insReport.setRatifyUserId(userId);//鎵瑰噯浜�
         //鑾峰彇瀹℃牳浜虹殑绛惧悕鍦板潃
@@ -389,6 +399,9 @@
     @Transactional(rollbackFor = Exception.class)
     public int ratifyReport(Integer id, Integer isRatify, String ratifyTell) {
         InsReport insReport = insReportMapper.selectById(id);
+        if (Objects.equals(insReport.getExamineUserId(), SecurityUtils.getUserId().intValue())) {
+            throw new ErrorException("瀹℃牳浜哄拰鎵瑰噯浜轰笉鑳戒负鍚屼竴浜猴紝璇烽噸鏂伴�夋嫨鎵瑰噯浜�");
+        }
         insReport.setIsRatify(isRatify);
         if (ObjectUtils.isNotEmpty(ratifyTell)) {
             insReport.setRatifyTell(ratifyTell);
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsSampleReceiptServiceImpl.java b/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsSampleReceiptServiceImpl.java
new file mode 100644
index 0000000..90e6e7e
--- /dev/null
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsSampleReceiptServiceImpl.java
@@ -0,0 +1,165 @@
+package com.ruoyi.inspect.service.impl;
+
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.ExcelWriter;
+import com.alibaba.excel.write.metadata.WriteSheet;
+import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.framework.exception.ErrorException;
+import com.ruoyi.inspect.dto.SampleReceiptActionDto;
+import com.ruoyi.inspect.dto.SampleReceiptPageDto;
+import com.ruoyi.inspect.dto.SampleReceiptQueryDto;
+import com.ruoyi.inspect.mapper.InsOrderMapper;
+import com.ruoyi.inspect.mapper.InsOrderStandardTemplateMapper;
+import com.ruoyi.inspect.mapper.InsProductMapper;
+import com.ruoyi.inspect.mapper.InsSampleMapper;
+import com.ruoyi.inspect.mapper.InsSampleReceiptMapper;
+import com.ruoyi.inspect.mapper.InsSampleUserMapper;
+import com.ruoyi.inspect.pojo.InsOrder;
+import com.ruoyi.inspect.pojo.InsOrderStandardTemplate;
+import com.ruoyi.inspect.pojo.InsProduct;
+import com.ruoyi.inspect.pojo.InsSample;
+import com.ruoyi.inspect.pojo.InsSampleReceipt;
+import com.ruoyi.inspect.pojo.InsSampleUser;
+import com.ruoyi.inspect.service.InsOrderService;
+import com.ruoyi.inspect.service.InsOrderStateService;
+import com.ruoyi.inspect.service.InsSampleReceiptService;
+import com.ruoyi.system.mapper.UserMapper;
+import lombok.AllArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.net.URLEncoder;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.List;
+
+@Service
+@AllArgsConstructor
+public class InsSampleReceiptServiceImpl extends ServiceImpl<InsSampleReceiptMapper, InsSampleReceipt>
+        implements InsSampleReceiptService {
+    private final InsSampleReceiptMapper receiptMapper;
+    private final InsOrderMapper insOrderMapper;
+    private final InsOrderStandardTemplateMapper insOrderStandardTemplateMapper;
+    private final InsSampleMapper insSampleMapper;
+    private final InsProductMapper insProductMapper;
+    private final InsSampleUserMapper insSampleUserMapper;
+    private final InsOrderStateService insOrderStateService;
+    private final InsOrderService insOrderService;
+    private final UserMapper userMapper;
+
+    @Override
+    public com.baomidou.mybatisplus.core.metadata.IPage<SampleReceiptPageDto> page(Page<?> page, SampleReceiptQueryDto query) {
+        return receiptMapper.selectPage(page, query);
+    }
+
+    @Override
+    public SampleReceiptPageDto detail(Integer id) {
+        return receiptMapper.selectDetail(id);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void submit(SampleReceiptActionDto dto) {
+        if (dto == null || dto.getReceiptId() == null || dto.getMainInspectorId() == null) {
+            throw new ErrorException("璇烽�夋嫨涓绘楠屼汉");
+        }
+        InsSampleReceipt receipt = receiptMapper.selectForUpdate(dto.getReceiptId());
+        ensurePending(receipt);
+        InsOrder order = insOrderMapper.selectById(receipt.getInsOrderId());
+        if (order == null || !Integer.valueOf(1).equals(order.getState())) {
+            throw new ErrorException("璇ュ鎵樺綋鍓嶇姸鎬佷笉鍏佽鏍峰搧鎺ユ敹");
+        }
+        List<InsSample> samples = insSampleMapper.selectList(Wrappers.<InsSample>lambdaQuery()
+                .eq(InsSample::getInsOrderId, order.getId()).orderByAsc(InsSample::getId));
+        if (samples.size() != 1 || !samples.get(0).getId().equals(receipt.getInsSampleId())) {
+            throw new ErrorException("璇ュ鎵樼殑鏍峰搧鏁伴噺寮傚父锛岃妫�鏌ヤ笅鍗曟暟鎹�");
+        }
+        InsSample sample = samples.get(0);
+        // 鍙蛋鏂拌仛鐩寸粦妯℃澘娴佺▼锛氬鎵樺崟蹇呴』宸茬粦瀹氬師濮嬭褰曟ā鏉匡紙涓嬪崟鏃剁敓鎴愯鍗曟ā鏉垮揩鐓э級
+        Long snapshotCount = insOrderStandardTemplateMapper.selectCount(Wrappers.<InsOrderStandardTemplate>lambdaQuery()
+                .eq(InsOrderStandardTemplate::getInsOrderId, order.getId()));
+        if (snapshotCount == 0) {
+            throw new ErrorException("璇ュ鎵樻湭缁戝畾鍘熷璁板綍妯℃澘锛屼笉鑳芥彁浜ゆ楠�");
+        }
+        Long productCount = insProductMapper.selectCount(Wrappers.<InsProduct>lambdaQuery()
+                .eq(InsProduct::getInsSampleId, sample.getId()).eq(InsProduct::getState, 1));
+        if (productCount == 0) {
+            throw new ErrorException("璇ュ鎵樻湭缁戝畾妫�楠岄」鐩紝涓嶈兘鎻愪氦妫�楠�");
+        }
+        if (userMapper.selectById(dto.getMainInspectorId()) == null) {
+            throw new ErrorException("涓绘楠屼汉涓嶅瓨鍦ㄦ垨宸插仠鐢�");
+        }
+        if (insOrderStateService.count(Wrappers.lambdaQuery(com.ruoyi.inspect.pojo.InsOrderState.class)
+                .eq(com.ruoyi.inspect.pojo.InsOrderState::getInsOrderId, order.getId())) > 0
+                || insSampleUserMapper.selectCount(Wrappers.<InsSampleUser>lambdaQuery()
+                .eq(InsSampleUser::getInsSampleId, order.getId())) > 0) {
+            throw new ErrorException("璇ュ鎵樺凡杩涘叆妫�楠屼换鍔★紝涓嶈兘閲嶅鎻愪氦");
+        }
+        String appointed = LocalDateTime.now().plusHours(insProductMapper.selectOrderManDay(order.getId()))
+                .format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+        insOrderService.upInsOrder(order.getId(), sample.getId(), appointed, dto.getMainInspectorId(), null);
+        receipt.setStatus(1);
+        receipt.setMainInspectorId(dto.getMainInspectorId());
+        receipt.setReceiveUserId(SecurityUtils.getUserId().intValue());
+        receipt.setReceiveTime(LocalDateTime.now());
+        receipt.setSubmitTime(LocalDateTime.now());
+        receiptMapper.updateById(receipt);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void reject(SampleReceiptActionDto dto) {
+        if (dto == null || dto.getReceiptId() == null || StringUtils.isBlank(dto.getRemark())) {
+            throw new ErrorException("璇峰~鍐欐嫆鏀跺娉�");
+        }
+        if (dto.getRemark().trim().length() > 500) {
+            throw new ErrorException("鎷掓敹澶囨敞涓嶈兘瓒呰繃500涓瓧绗�");
+        }
+        InsSampleReceipt receipt = receiptMapper.selectForUpdate(dto.getReceiptId());
+        ensurePending(receipt);
+        if (insOrderStateService.count(Wrappers.lambdaQuery(com.ruoyi.inspect.pojo.InsOrderState.class)
+                .eq(com.ruoyi.inspect.pojo.InsOrderState::getInsOrderId, receipt.getInsOrderId())) > 0) {
+            throw new ErrorException("璇ュ鎵樺凡杩涘叆妫�楠屼换鍔★紝涓嶈兘鎷掓敹");
+        }
+        receipt.setStatus(2);
+        receipt.setRejectRemark(dto.getRemark().trim());
+        receipt.setReceiveUserId(SecurityUtils.getUserId().intValue());
+        receipt.setReceiveTime(LocalDateTime.now());
+        receiptMapper.updateById(receipt);
+        InsOrder order = new InsOrder();
+        order.setId(receipt.getInsOrderId());
+        order.setState(5);
+        insOrderMapper.updateById(order);
+    }
+
+    private void ensurePending(InsSampleReceipt receipt) {
+        if (receipt == null || !Integer.valueOf(0).equals(receipt.getStatus())) {
+            throw new ErrorException("璇ユ牱鍝佹帴鏀惰褰曞凡琚鐞嗭紝璇峰埛鏂板悗閲嶈瘯");
+        }
+    }
+
+    @Override
+    public void export(SampleReceiptQueryDto query, HttpServletResponse response) {
+        List<SampleReceiptPageDto> list = receiptMapper.selectExportList(query);
+        response.setContentType("application/vnd.ms-excel");
+        response.setCharacterEncoding("UTF-8");
+        try {
+            String fileName = URLEncoder.encode("鏍峰搧鎺ユ敹瀵煎嚭", "UTF-8");
+            response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
+            ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream())
+                    .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()).build();
+            WriteSheet sheet = EasyExcel.writerSheet(0, "鏍峰搧鎺ユ敹瀵煎嚭").head(SampleReceiptPageDto.class).build();
+            excelWriter.write(list, sheet);
+            excelWriter.finish();
+        } catch (IOException e) {
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+    }
+}
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/vo/InsOrderPrintingVo.java b/inspect-server/src/main/java/com/ruoyi/inspect/vo/InsOrderPrintingVo.java
index 46595ea..e5b823f 100644
--- a/inspect-server/src/main/java/com/ruoyi/inspect/vo/InsOrderPrintingVo.java
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/vo/InsOrderPrintingVo.java
@@ -35,6 +35,9 @@
     @ApiModelProperty("妫�娴嬬紪鍙�")
     private String entrustCode;
 
+    @ApiModelProperty("鏍峰搧缂栫爜")
+    private String sampleCode;
+
     @ApiModelProperty("鏍峰搧鏁伴噺")
     private String testQuantity;
 
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/vo/InsOrderTemplateDetailVo.java b/inspect-server/src/main/java/com/ruoyi/inspect/vo/InsOrderTemplateDetailVo.java
new file mode 100644
index 0000000..e807a1f
--- /dev/null
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/vo/InsOrderTemplateDetailVo.java
@@ -0,0 +1,22 @@
+package com.ruoyi.inspect.vo;
+
+import com.ruoyi.basic.dto.StandardTreeTemplateBindingVo;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/** 濮旀墭鍗曟ā鏉胯鎯咃細琛ㄥ崟蹇収 + 缁戝畾鐨勬爣鍑� + 璇ユ爣鍑嗕笅鐨勫師濮嬭褰曟ā鏉裤�� */
+@Data
+public class InsOrderTemplateDetailVo {
+
+    @ApiModelProperty("琛ㄥ崟蹇収JSON")
+    private String thing;
+
+    @ApiModelProperty("缁戝畾鐨勬爣鍑嗗簱浜岀骇鏍囧噯ID")
+    private Integer standardTreeId;
+
+    @ApiModelProperty("鏍囧噯缁戝畾鐨勫師濮嬭褰曟ā鏉�")
+    private List<StandardTreeTemplateBindingVo> templateBindings = new ArrayList<>();
+}
diff --git a/inspect-server/src/main/resources/mapper/InsOrderMapper.xml b/inspect-server/src/main/resources/mapper/InsOrderMapper.xml
index 8589361..dbd6da9 100644
--- a/inspect-server/src/main/resources/mapper/InsOrderMapper.xml
+++ b/inspect-server/src/main/resources/mapper/InsOrderMapper.xml
@@ -115,12 +115,14 @@
         GROUP_CONCAT(DISTINCT isa.model SEPARATOR ' ') AS sample_model,
         u.name,
         testing_name,
-        ip.son_laboratory
+        ip.son_laboratory,
+        isr.reject_remark AS sample_reject_remark
         FROM
         ins_order io
         LEFT JOIN
         ins_sample isa ON io.id = isa.ins_order_id
         left join ins_product ip on ip.ins_sample_id = isa.id
+        LEFT JOIN ins_sample_receipt isr ON isr.ins_order_id = io.id
         LEFT JOIN
         ins_sample_user isau ON isau.ins_sample_id = io.id
         LEFT JOIN
@@ -152,7 +154,10 @@
         ORDER BY ins_sample_id) isu ON isu.ins_sample_id = io.id
         where (io.ifs_inventory_id IS NULL OR TRIM(io.ifs_inventory_id)  = '')
         <if test="isOrderAll != null and isOrderAll != ''">
-            AND io.state in (1, 4)
+            AND io.state in (1, 4, 5)
+        </if>
+        <if test="receiptSubmitted != null and receiptSubmitted != ''">
+            AND isr.status = 1
         </if>
         <if test="laboratory!=null and laboratory!=''">
             AND io.laboratory=#{laboratory}
@@ -411,6 +416,7 @@
                      GROUP_CONCAT(DISTINCT isa.model SEPARATOR ' ') AS sample_model,
                      io2.prepare_user,
                      io2.entrust_code,
+                     GROUP_CONCAT(DISTINCT isa.sample_code SEPARATOR ' ') AS sample_code,
                      io2.test_quantity,
                      io2.ins_state,
                      JSON_OBJECT(
@@ -433,7 +439,7 @@
         from ( <include refid="selectInsOrderExport"/>
         where (io.ifs_inventory_id IS NULL OR TRIM(io.ifs_inventory_id)  = '')
         <if test="isOrderAll != null and isOrderAll != ''">
-            AND io.state in (1, 4)
+            AND io.state in (1, 4, 5)
         </if>
         <if test="laboratory!=null and laboratory!=''">
             AND io.laboratory=#{laboratory}
diff --git a/inspect-server/src/main/resources/mapper/InsSampleMapper.xml b/inspect-server/src/main/resources/mapper/InsSampleMapper.xml
index c540fb2..ad6224c 100644
--- a/inspect-server/src/main/resources/mapper/InsSampleMapper.xml
+++ b/inspect-server/src/main/resources/mapper/InsSampleMapper.xml
@@ -491,18 +491,20 @@
                  left join ins_product ip on isa.id = ip.ins_sample_id
                  left join ins_product_result ipr on ip.id = ipr.ins_product_id
         where ins_order_id = #{id}
-          and (
-              (ip.state = 1 and ip.son_laboratory = #{laboratory})
-              or (
-                  ip.id is null
-                  and #{laboratory} = '鏂拌仛'
-                  and exists (
-                      select 1
-                      from ins_order_standard_template iost
-                      where iost.ins_order_id = isa.ins_order_id
-                  )
-              )
-          )
+        <if test="laboratory != null and laboratory != ''">
+            and (
+                (ip.state = 1 and ip.son_laboratory = #{laboratory})
+                or (
+                    ip.id is null
+                    and #{laboratory} = '鏂拌仛'
+                    and exists (
+                        select 1
+                        from ins_order_standard_template iost
+                        where iost.ins_order_id = isa.ins_order_id
+                    )
+                )
+            )
+        </if>
     </select>
     <select id="getSampleEn" resultType="java.lang.String">
         select name_en
@@ -608,10 +610,12 @@
                  left join ins_product_result ipr on ip.id = ipr.ins_product_id
         where ins_sample_id = #{id}
           and state = 1
+        <if test="laboratory != null and laboratory != ''">
           and ip.son_laboratory = #{laboratory}
+        </if>
           and ins_fiber_id is null
           and ins_fibers_id is null
-          and (standard_method_list_id is not null or template_row_index is not null)
+          and template_id is not null
         /* 鐢电紗閰嶇疆鏍囪瘑 */
         <if test="cableTag == null or cableTag == ''">
             and ip.cable_tag is null
@@ -635,10 +639,12 @@
         left join ins_product_result ipr on ip.id = ipr.ins_product_id
         where ins_sample_id = #{id}
         and state = 1
+        <if test="laboratory != null and laboratory != ''">
         and ip.son_laboratory = #{laboratory}
+        </if>
         and ins_fiber_id is null
         and ins_fibers_id is null
-        and (standard_method_list_id is not null or template_row_index is not null)
+        and template_id is not null
         and ip.raw_material_tag = #{rawMaterialTag}
         order by sort asc
     </select>
diff --git a/inspect-server/src/main/resources/mapper/InsSampleReceiptMapper.xml b/inspect-server/src/main/resources/mapper/InsSampleReceiptMapper.xml
new file mode 100644
index 0000000..0c54e84
--- /dev/null
+++ b/inspect-server/src/main/resources/mapper/InsSampleReceiptMapper.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.inspect.mapper.InsSampleReceiptMapper">
+    <sql id="receiptColumns">
+        r.id receipt_id, r.ins_order_id order_id, r.ins_sample_id sample_id, r.status,
+        isa.sample sample_name, isa.sample_code, io.entrust_code,
+        COALESCE(iost.method_standard, sm.code) method_standard,
+        ip.inspection_item, r.main_inspector_id, u.name main_inspector_name,
+        COALESCE(isa.remark, io.remark) remark, r.reject_remark, r.receive_time,
+        ru.name receive_user_name
+    </sql>
+    <select id="selectPage" resultType="com.ruoyi.inspect.dto.SampleReceiptPageDto">
+        SELECT
+        <include refid="receiptColumns"/>
+        FROM ins_sample_receipt r
+        JOIN ins_order io ON io.id = r.ins_order_id
+        JOIN ins_sample isa ON isa.id = r.ins_sample_id
+        LEFT JOIN standard_method sm ON sm.id = isa.standard_method_list_id
+        LEFT JOIN (
+        SELECT ins_order_id,
+        GROUP_CONCAT(DISTINCT number ORDER BY sort SEPARATOR '\n') method_standard
+        FROM ins_order_standard_template
+        GROUP BY ins_order_id
+        ) iost ON iost.ins_order_id = io.id
+        LEFT JOIN (
+        SELECT ins_sample_id,
+        GROUP_CONCAT(DISTINCT inspection_item ORDER BY sort SEPARATOR '\n') inspection_item
+        FROM ins_product
+        WHERE state = 1
+        GROUP BY ins_sample_id
+        ) ip ON ip.ins_sample_id = isa.id
+        LEFT JOIN user u ON u.id = r.main_inspector_id
+        LEFT JOIN user ru ON ru.id = r.receive_user_id
+        WHERE 1 = 1
+        <if test="query.status != null">AND r.status = #{query.status}</if>
+        <if test="query.entrustCode != null and query.entrustCode != ''">AND io.entrust_code LIKE CONCAT('%',
+            #{query.entrustCode}, '%')
+        </if>
+        <if test="query.sampleCode != null and query.sampleCode != ''">AND isa.sample_code LIKE CONCAT('%',
+            #{query.sampleCode}, '%')
+        </if>
+        <if test="query.sampleName != null and query.sampleName != ''">AND isa.sample LIKE CONCAT('%',
+            #{query.sampleName}, '%')
+        </if>
+        GROUP BY r.id
+        ORDER BY r.create_time DESC
+    </select>
+    <select id="selectDetail" resultType="com.ruoyi.inspect.dto.SampleReceiptPageDto">
+        SELECT <include refid="receiptColumns"/>
+        FROM ins_sample_receipt r
+        JOIN ins_order io ON io.id = r.ins_order_id
+        JOIN ins_sample isa ON isa.id = r.ins_sample_id
+        LEFT JOIN standard_method sm ON sm.id = isa.standard_method_list_id
+        LEFT JOIN (
+            SELECT ins_order_id,
+                   GROUP_CONCAT(DISTINCT number ORDER BY sort SEPARATOR '\n') method_standard
+            FROM ins_order_standard_template
+            GROUP BY ins_order_id
+        ) iost ON iost.ins_order_id = io.id
+        LEFT JOIN (
+            SELECT ins_sample_id,
+                   GROUP_CONCAT(DISTINCT inspection_item ORDER BY sort SEPARATOR '\n') inspection_item
+            FROM ins_product
+            WHERE state = 1
+            GROUP BY ins_sample_id
+        ) ip ON ip.ins_sample_id = isa.id
+        LEFT JOIN user u ON u.id = r.main_inspector_id
+        LEFT JOIN user ru ON ru.id = r.receive_user_id
+        WHERE r.id = #{id}
+        GROUP BY r.id
+    </select>
+    <select id="selectExportList" resultType="com.ruoyi.inspect.dto.SampleReceiptPageDto">
+        SELECT <include refid="receiptColumns"/>
+        FROM ins_sample_receipt r
+        JOIN ins_order io ON io.id = r.ins_order_id
+        JOIN ins_sample isa ON isa.id = r.ins_sample_id
+        LEFT JOIN standard_method sm ON sm.id = isa.standard_method_list_id
+        LEFT JOIN (
+            SELECT ins_order_id,
+                   GROUP_CONCAT(DISTINCT number ORDER BY sort SEPARATOR '\n') method_standard
+            FROM ins_order_standard_template
+            GROUP BY ins_order_id
+        ) iost ON iost.ins_order_id = io.id
+        LEFT JOIN (
+            SELECT ins_sample_id,
+                   GROUP_CONCAT(DISTINCT inspection_item ORDER BY sort SEPARATOR '\n') inspection_item
+            FROM ins_product
+            WHERE state = 1
+            GROUP BY ins_sample_id
+        ) ip ON ip.ins_sample_id = isa.id
+        LEFT JOIN user u ON u.id = r.main_inspector_id
+        LEFT JOIN user ru ON ru.id = r.receive_user_id
+        WHERE 1 = 1
+        <if test="query.status != null"> AND r.status = #{query.status}</if>
+        <if test="query.entrustCode != null and query.entrustCode != ''"> AND io.entrust_code LIKE CONCAT('%', #{query.entrustCode}, '%')</if>
+        <if test="query.sampleCode != null and query.sampleCode != ''"> AND isa.sample_code LIKE CONCAT('%', #{query.sampleCode}, '%')</if>
+        <if test="query.sampleName != null and query.sampleName != ''"> AND isa.sample LIKE CONCAT('%', #{query.sampleName}, '%')</if>
+        GROUP BY r.id
+        ORDER BY r.create_time DESC
+    </select>
+    <select id="selectForUpdate" resultType="com.ruoyi.inspect.pojo.InsSampleReceipt">
+        SELECT * FROM ins_sample_receipt WHERE id = #{id} FOR UPDATE
+    </select>
+    <insert id="insertIgnore">
+        INSERT IGNORE INTO ins_sample_receipt(ins_order_id, ins_sample_id, status, create_time, update_time)
+        VALUES(#{orderId}, #{sampleId}, 0, NOW(), NOW())
+    </insert>
+</mapper>
diff --git a/inspect-server/src/main/resources/static/detection-report-template-v2.docx b/inspect-server/src/main/resources/static/detection-report-template-v2.docx
index 54d6b84..eb4dc66 100644
--- a/inspect-server/src/main/resources/static/detection-report-template-v2.docx
+++ b/inspect-server/src/main/resources/static/detection-report-template-v2.docx
Binary files differ
diff --git a/inspect-server/src/main/resources/static/inspection-report-template-v2.docx b/inspect-server/src/main/resources/static/inspection-report-template-v2.docx
index 4bb0c32..045bf37 100644
--- a/inspect-server/src/main/resources/static/inspection-report-template-v2.docx
+++ b/inspect-server/src/main/resources/static/inspection-report-template-v2.docx
Binary files differ

--
Gitblit v1.9.3