From fbd4ecb70baf2e671876ca809a81f6e6fe7342ee Mon Sep 17 00:00:00 2001
From: liding <756868258@qq.com>
Date: 星期日, 20 九月 2026 19:52:50 +0800
Subject: [PATCH] feat(inspect): 新增检测标准方法报告文本功能并优化报告生成 - 委托编号生成逻辑调整为下单时生成并校验唯一性,避免审核时重复 - 新增标准模板价格字段及对应的数据模型和数据库映射 - 订单费用详情查询逻辑重构为基于模板价格计算方式 - 新增标准模板与设备绑定关系的数据结构和管理功能 - 委托编号唯一性校验逻辑增强

---
 inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderServiceImpl.java |   92 ++++++++++++++++++++++++++++++++++++++--------
 1 files changed, 76 insertions(+), 16 deletions(-)

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 be9fcb1..5be630d 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
@@ -364,6 +364,15 @@
                 }
             }
         });
+        // 涓嬪崟鏃剁敓鎴愬鎵樼紪鍙峰苟鏍¢獙鍞竴鎬э紱瀛e害妫�楠屽鐢ㄨ繘鍘傛楠岀紪鍙凤紝鐣欏緟瀹℃牳澶勭悊銆�
+        if (!InsOrderTypeConstants.QUARTERLY_TEST.equals(insOrder.getOrderType())) {
+            String entrustCode = buildEntrustCode(insOrder, Collections.emptyList());
+            assertEntrustCodeUnique(entrustCode, insOrder.getId());
+            insOrder.setEntrustCode(entrustCode);
+            insOrderMapper.update(null, Wrappers.<InsOrder>lambdaUpdate()
+                    .eq(InsOrder::getId, insOrder.getId())
+                    .set(InsOrder::getEntrustCode, entrustCode));
+        }
         //鍘熸潗鏂欎笅鍗曟垨澶栬喘鎴愬搧涓嬪崟
         if (Objects.nonNull(insOrder.getTypeSource())&&Objects.nonNull(insOrder.getIfsInventoryId())) {
             // 濮旀墭浜哄氨鏄姤妫�浜�, 鐢熶骇鍗曚綅灏辨槸渚涘簲鍟嗗崟浣�
@@ -464,6 +473,10 @@
         if (dto == null || dto.getInsOrder() == null || dto.getStandardTreeId() == null) {
             throw new ErrorException("涓嬪崟淇℃伅鎴栨爣鍑嗕笉鑳戒负绌�");
         }
+        String sampleCode = StringUtils.trim(dto.getSampleCode());
+        if (StringUtils.isBlank(sampleCode) || sampleCode.length() < 2) {
+            throw new ErrorException("鏍峰搧缂栧彿涓嶈兘涓虹┖涓斾笉鑳藉皯浜�2浣�");
+        }
         StandardTree standard = standardTreeService.getById(dto.getStandardTreeId());
         if (standard == null || StringUtils.isBlank(standard.getSample())
                 || standard.getSampleType() != null || standard.getModel() != null) {
@@ -540,7 +553,7 @@
 
         InsSample sample = new InsSample();
         sample.setInsOrderId(order.getId());
-        sample.setSampleCode(dto.getSampleCode());
+        sample.setSampleCode(sampleCode);
         sample.setFactory(null);
         sample.setLaboratory(standard.getLaboratory());
         sample.setSampleType(null);
@@ -569,11 +582,19 @@
             product.setSort(productSort++);
             insProductMapper.insert(product);
         }
-        saveTemplateSnapshots(order.getId(), selections);
+        saveTemplateSnapshots(order.getId(), selections, bindingMap);
+
+        // 涓嬪崟鏃剁敓鎴愬鎵樼紪鍙峰苟鏍¢獙鍞竴鎬э紝閲嶅鍒欐彁绀猴紝閬垮厤鐣欏埌瀹℃牳鎵嶆姤閿欍��
+        String entrustCode = buildEntrustCode(order, Collections.singletonList(sample));
+        assertEntrustCodeUnique(entrustCode, order.getId());
+        insOrderMapper.update(null, Wrappers.<InsOrder>lambdaUpdate()
+                .eq(InsOrder::getId, order.getId())
+                .set(InsOrder::getEntrustCode, entrustCode));
         return order.getId();
     }
 
-    private void saveTemplateSnapshots(Integer orderId, List<OrderTemplateSelectionDto> selections) {
+    private void saveTemplateSnapshots(Integer orderId, List<OrderTemplateSelectionDto> selections,
+                                       Map<Integer, StandardTreeTemplateBindingVo> bindingMap) {
         for (OrderTemplateSelectionDto selection : selections) {
             StandardTemplate template = standardTemplateService.getById(selection.getTemplateId());
             if (template == null) {
@@ -588,6 +609,18 @@
             snapshot.setThing(template.getThing());
             snapshot.setSort(selection.getSort());
             insOrderStandardTemplateMapper.insert(snapshot);
+
+            StandardTreeTemplateBindingVo binding = bindingMap.get(selection.getTemplateId());
+            List<Integer> deviceIds = binding == null || binding.getDeviceIds() == null
+                    ? Collections.emptyList() : binding.getDeviceIds();
+            for (int index = 0; index < deviceIds.size(); index++) {
+                InsOrderTemplateDevice relation = new InsOrderTemplateDevice();
+                relation.setInsOrderId(orderId);
+                relation.setTemplateId(selection.getTemplateId());
+                relation.setDeviceId(deviceIds.get(index));
+                relation.setSort(index);
+                insOrderTemplateDeviceMapper.insert(relation);
+            }
         }
     }
 
@@ -671,17 +704,12 @@
     public int upInsOrderOfState(InsOrder insOrder) {
         insOrder.setExamineTime(LocalDateTime.now());
         if (insOrder.getState() == 1) {
-            //瀹℃牳閫氳繃鎵嶄細鐢熸垚濮旀墭缂栧彿
+            //濮旀墭缂栧彿宸插湪涓嬪崟鏃剁敓鎴愬苟鏍¢獙鍞竴鎬э紝瀹℃牳鏃跺鐢紱鍘嗗彶/瀛e害妫�楠岃鍗曞厹搴曠敓鎴愩��
             InsOrder order = this.getById(insOrder.getId());
-            // 濮旀墭缂栧彿鎸夐�佹牱鏃ユ湡鐙珛娴佹按锛屼緥濡傦細LMSY-20260909-01銆�
-            // 鍘嗗彶/澶栭儴璁㈠崟鏈~鍐欓�佹牱鏃ユ湡鏃跺洖閫�鍒板綋澶╋紝閬垮厤褰卞搷鍘熸湁娴佺▼銆�
-            LocalDate entrustDate = order.getSampleDate() == null ? LocalDate.now() : order.getSampleDate();
-            String entrustCodePrefix = "LMSY-"
-                    + entrustDate.format(DateTimeFormatter.BASIC_ISO_DATE)
-                    + "-";
-            String no = numberGenerator.generateNumberWithPrefix(2,
-                    entrustCodePrefix,
-                    InsOrder::getEntrustCode);
+            List<InsSample> insSamples = insSampleMapper.selectList(Wrappers.<InsSample>lambdaQuery()
+                    .eq(InsSample::getInsOrderId, insOrder.getId())
+                    .orderByAsc(InsSample::getId));
+            String no = order.getEntrustCode();
             // 鍒ゆ柇鏄惁鏄搴︽楠�, 鏄搴︽楠屽彇娑堝師鏉愭枡瀛e害妫�楠屼笅鍗�
             if (InsOrderTypeConstants.QUARTERLY_TEST.equals(order.getOrderType())) {
                 ifsInventoryQuantityMapper.update(null,  Wrappers.<IfsInventoryQuantity>lambdaUpdate()
@@ -697,11 +725,12 @@
                   no = order1.getEntrustCode();
                 }
             }
+            if (StringUtils.isBlank(no)) {
+                no = buildEntrustCode(order, insSamples);
+            }
+            assertEntrustCodeUnique(no, order.getId());
 
             int count = 1;
-            // 鏌ヨ鏍峰搧琛�
-            List<InsSample> insSamples = insSampleMapper.selectList(Wrappers.<InsSample>lambdaQuery()
-                    .eq(InsSample::getInsOrderId, insOrder.getId()));
             for (InsSample insSample : insSamples) {
                 if (StringUtils.isBlank(insSample.getSampleCode())) {
                     // 濡傛灉鍙湁涓�涓牱鍝佸氨涓嶉渶瑕佹嫾鎺ユ暟瀛�
@@ -720,6 +749,37 @@
         return insOrderMapper.updateById(insOrder);
     }
 
+    /**
+     * 濮旀墭缂栧彿鍏ㄥ眬鍞竴锛岀敓鎴愮紪鍙峰拰鍚庣画鎻愪氦鍓嶅潎闇�鎺掗櫎褰撳墠璁㈠崟鍚庢牎楠屻��
+     */
+    private void assertEntrustCodeUnique(String entrustCode, Integer currentOrderId) {
+        Long count = insOrderMapper.selectCount(Wrappers.<InsOrder>lambdaQuery()
+                .eq(InsOrder::getEntrustCode, entrustCode)
+                .ne(currentOrderId != null, InsOrder::getId, currentOrderId));
+        if (count > 0) {
+            throw new ErrorException("鏍峰搧/濮旀墭鍗曞凡瀛樺湪锛岃纭鏍峰搧缂栧彿");
+        }
+    }
+
+    /**
+     * 鐢熸垚濮旀墭缂栧彿锛氭柊鑱氱洿缁戞ā鏉胯鍗曟湯涓や綅鍙栨牱鍝佺紪鍙锋湯涓や綅锛屽叾浣欐寜閫佹牱鏃ユ湡鐢熸垚搴忓彿銆�
+     */
+    private String buildEntrustCode(InsOrder order, List<InsSample> insSamples) {
+        LocalDate entrustDate = order.getSampleDate() == null ? LocalDate.now() : order.getSampleDate();
+        String entrustCodePrefix = "LMSY-"
+                + entrustDate.format(DateTimeFormatter.BASIC_ISO_DATE)
+                + "-";
+        if (isDirectTemplateOrder(order, insSamples)) {
+            String sampleCode = insSamples.get(0).getSampleCode();
+            if (StringUtils.isBlank(sampleCode) || sampleCode.trim().length() < 2) {
+                throw new ErrorException("鏍峰搧缂栧彿涓嶈兘涓虹┖涓斾笉鑳藉皯浜�2浣�");
+            }
+            sampleCode = sampleCode.trim();
+            return entrustCodePrefix + sampleCode.substring(sampleCode.length() - 2);
+        }
+        return numberGenerator.generateNumberWithPrefix(2, entrustCodePrefix, InsOrder::getEntrustCode);
+    }
+
     @Override
     public Map<String, Object> getInsOrderAndSample(Integer id, String laboratory) {
         Map<String, Object> map = new HashMap<>();

--
Gitblit v1.9.3