From d2f70dbba98e651b09c2b4dbe37d250044080ee8 Mon Sep 17 00:00:00 2001
From: tuqin <tuqin@tuqin.cn>
Date: 星期三, 21 十月 2026 17:26:18 +0800
Subject: [PATCH] feat(基础数据): 新增油库信息/储罐信息模块(移植自新疆融邦环保分支)

---
 src/main/java/com/ruoyi/basic/service/impl/ProductModelServiceImpl.java |   80 +++++++++++++++++++++++++++++++++++++++-
 1 files changed, 78 insertions(+), 2 deletions(-)

diff --git a/src/main/java/com/ruoyi/basic/service/impl/ProductModelServiceImpl.java b/src/main/java/com/ruoyi/basic/service/impl/ProductModelServiceImpl.java
index fa75953..0f2e47a 100644
--- a/src/main/java/com/ruoyi/basic/service/impl/ProductModelServiceImpl.java
+++ b/src/main/java/com/ruoyi/basic/service/impl/ProductModelServiceImpl.java
@@ -58,9 +58,19 @@
     public int addOrEditProductModel(ProductModelDto productModelDto) {
         String model = StringUtils.trim(productModelDto.getModel());
         String productCode = StringUtils.trim(productModelDto.getProductCode());
+        String drawingNo = StringUtils.trim(productModelDto.getDrawingNo());
         productModelDto.setModel(model);
         productModelDto.setProductCode(productCode);
+        productModelDto.setDrawingNo(drawingNo);
+        // 鍥惧彿蹇呭~
+        if (StringUtils.isEmpty(drawingNo)) {
+            throw new ServiceException("鍥惧彿涓嶈兘涓虹┖");
+        }
+        if (drawingNo.length() > 255) {
+            throw new ServiceException("鍥惧彿闀垮害涓嶈兘瓒呰繃255涓瓧绗�");
+        }
         checkModelAndProductCodeUnique(model, productCode, productModelDto.getId());
+        checkDrawingNoUnique(drawingNo, productModelDto.getId());
 
         if (productModelDto.getId() == null) {
             ProductModel productModel = new ProductModel();
@@ -68,6 +78,23 @@
             return productModelMapper.insert(productModel);
         } else {
             return productModelMapper.updateById(productModelDto);
+        }
+    }
+
+    /**
+     * 鍥惧彿鍞竴鏍¢獙锛堝叏灞�锛岀紪杈戞椂鎺掗櫎鑷韩锛�
+     */
+    private void checkDrawingNoUnique(String drawingNo, Long currentId) {
+        if (StringUtils.isEmpty(drawingNo)) {
+            return;
+        }
+        LambdaQueryWrapper<ProductModel> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(ProductModel::getDrawingNo, drawingNo)
+                .ne(currentId != null, ProductModel::getId, currentId)
+                .last("limit 1");
+        ProductModel duplicateProductModel = productModelMapper.selectOne(queryWrapper);
+        if (duplicateProductModel != null) {
+            throw new ServiceException("鍥惧彿" + drawingNo + "宸茬粡瀛樺湪");
         }
     }
 
@@ -161,12 +188,16 @@
             Map<String, Long> nodeCache = new HashMap<>();
             for (int i = 0; i < rows.size(); i++) {
                 ProductImportRowDto row = rows.get(i);
-                int rowNum = i + 2;
+                //  娌℃湁鍚嶇О/缂栫爜/瑙勬牸鐨勮鏋勪笉鎴愪骇鍝佹暟鎹紝鎸夌┖琛岃烦杩�
+                if (hasNoProductContent(row)) {
+                    continue;
+                }
                 String parentName = trimToNull(row.getProductParentName());
                 String categoryName = trimToNull(row.getProductCategoryName());
                 String productName = trimToNull(row.getProductName());
                 if (productName == null) {
-                    throw new ServiceException("绗� " + rowNum + " 琛� [浜у搧鍚嶇О] 涓嶈兘涓虹┖");
+                    throw new ServiceException(String.format("宸ヤ綔琛ㄣ��%s銆戠 %d 琛� [浜у搧鍚嶇О] 涓嶈兘涓虹┖锛堣琛屽凡濉細%s锛�",
+                            sheetName, resolveRowNum(row, i), describeRow(row)));
                 }
 
                 String model = trimToNull(row.getModel());
@@ -196,10 +227,20 @@
                     code = generateUniqueCode(generatedCodes);
                 }
 
+                // 鍥惧彿锛氬鍏ユ椂鍙�夛紝濉啓鍒欐牎楠屽敮涓�
+                String drawingNo = trimToNull(row.getDrawingNo());
+                if (drawingNo != null) {
+                    if (drawingNo.length() > 255) {
+                        throw new ServiceException("宸ヤ綔绨裤��" + sheetName + "銆戠 " + resolveRowNum(row, i) + " 琛岋細鍥惧彿闀垮害涓嶈兘瓒呰繃255涓瓧绗�");
+                    }
+                    checkDrawingNoUnique(drawingNo, null);
+                }
+
                 ProductModel productModel = new ProductModel();
                 productModel.setProductId(leafId);
                 productModel.setProductCode(code);
                 productModel.setModel(model);
+                productModel.setDrawingNo(drawingNo);
                 productModel.setUnit(trimToNull(row.getUnit()));
                 productModelMapper.insert(productModel);
                 successCount++;
@@ -291,6 +332,41 @@
         return keys;
     }
 
+    /**
+     * 瑙f瀽鏃朵細璺宠繃绌鸿
+     */
+    private static int resolveRowNum(ProductImportRowDto row, int index) {
+        return row.getExcelRowNum() != null ? row.getExcelRowNum() : index + 2;
+    }
+
+    private static boolean hasNoProductContent(ProductImportRowDto row) {
+        return trimToNull(row.getProductName()) == null
+                && trimToNull(row.getProductCode()) == null
+                && trimToNull(row.getModel()) == null;
+    }
+
+    private static String describeRow(ProductImportRowDto row) {
+        StringBuilder description = new StringBuilder();
+        appendFilledColumn(description, "浜у搧鐖剁被", row.getProductParentName());
+        appendFilledColumn(description, "浜у搧澶х被", row.getProductCategoryName());
+        appendFilledColumn(description, "浜у搧鍚嶇О", row.getProductName());
+        appendFilledColumn(description, "浜у搧缂栫爜", row.getProductCode());
+        appendFilledColumn(description, "瑙勬牸鍨嬪彿", row.getModel());
+        appendFilledColumn(description, "鍗曚綅", row.getUnit());
+        return description.length() == 0 ? "鏃�" : description.toString();
+    }
+
+    private static void appendFilledColumn(StringBuilder description, String columnName, String value) {
+        String trimmed = trimToNull(value);
+        if (trimmed == null) {
+            return;
+        }
+        if (description.length() > 0) {
+            description.append("锛�");
+        }
+        description.append(columnName).append('=').append(trimmed);
+    }
+
     private static String dedupKey(String productName, String model, String productCode) {
         String normalizedModel = trimToNull(model) == null ? "/" : model.trim();
         String normalizedCode = productCode == null ? "" : productCode.trim();

--
Gitblit v1.9.3