From fc24827d4eb7b15c28a184123376eb758d93a9ad Mon Sep 17 00:00:00 2001
From: gongchunyi <deslre0381@gmail.com>
Date: 星期五, 10 四月 2026 17:25:30 +0800
Subject: [PATCH] feat: 生产计划导入验证产品是否存在、申请单编号重复、强度是否正确

---
 src/main/java/com/ruoyi/productionPlan/service/impl/ProductionPlanServiceImpl.java |  123 ++++++++++++++++++++++++++++++++--------
 1 files changed, 98 insertions(+), 25 deletions(-)

diff --git a/src/main/java/com/ruoyi/productionPlan/service/impl/ProductionPlanServiceImpl.java b/src/main/java/com/ruoyi/productionPlan/service/impl/ProductionPlanServiceImpl.java
index cd3e463..c84b469 100644
--- a/src/main/java/com/ruoyi/productionPlan/service/impl/ProductionPlanServiceImpl.java
+++ b/src/main/java/com/ruoyi/productionPlan/service/impl/ProductionPlanServiceImpl.java
@@ -120,6 +120,10 @@
         //  鏌ヨ涓荤敓浜ц鍒�
         List<ProductionPlanDto> plans = productionPlanMapper.selectWithMaterialByIds(productionPlanDto.getIds());
 
+        if (plans == null || plans.isEmpty()) {
+            throw new ServiceException("涓嬪彂澶辫触,鐢熶骇璁″垝涓嶅瓨鍦�");
+        }
+
         //  鏍¢獙鏄惁瀛樺湪涓嶅悓鐨勪骇鍝佸悕绉�
         String firstProductName = plans.get(0).getProductName();
         if (plans.stream().anyMatch(p -> p.getProductName() == null || !p.getProductName().equals(firstProductName))) {
@@ -148,7 +152,7 @@
         productOrder.setPlanCompleteTime(productionPlanDto.getPlanCompleteTime());
         productOrder.setStatus(ProductOrderStatusEnum.WAIT.getCode());
         productOrder.setStrength(productionPlanDto.getStrength());
-        productOrder.setProductMaterialSkuId(productionPlanDto.getProductMaterialSkuId());
+        productOrder.setProductMaterialSkuId(plans.get(0).getProductMaterialSkuId());
 
         Long orderId = productOrderService.insertProductOrder(productOrder);
 
@@ -221,6 +225,14 @@
     @Override
     @Transactional(rollbackFor = Exception.class)
     public boolean add(ProductionPlanDto productionPlanDto) {
+        if (StringUtils.isEmpty(productionPlanDto.getApplyNo())) {
+            throw new ServiceException("鏂板澶辫触锛岀敵璇峰崟缂栧彿涓嶈兘涓虹┖");
+        }
+        Long count = productionPlanMapper.selectCount(Wrappers.<ProductionPlan>lambdaQuery()
+                .eq(ProductionPlan::getApplyNo, productionPlanDto.getApplyNo()));
+        if (count > 0) {
+            throw new ServiceException("鏂板澶辫触锛岀敵璇峰崟缂栧彿 " + productionPlanDto.getApplyNo() + " 宸插瓨鍦�");
+        }
         productionPlanDto.setDataSourceType(DataSourceTypeEnum.MANUAL.getCode());
         productionPlanDto.setStatus(0);
         productionPlanMapper.insert(productionPlanDto);
@@ -230,16 +242,37 @@
     @Override
     @Transactional(rollbackFor = Exception.class)
     public boolean update(ProductionPlanDto productionPlanDto) {
-        // 宸蹭笅鍙戠姸鎬侊紝涓嶈兘缂栬緫
-        if (productionPlanDto.getStatus() != 0) {
-            throw new BaseException("宸蹭笅鍙戞垨閮ㄥ垎涓嬪彂鐘舵�侊紝涓嶈兘缂栬緫");
+        if (productionPlanDto == null || productionPlanDto.getId() == null) {
+            throw new ServiceException("缂栬緫澶辫触,鏁版嵁涓嶈兘涓虹┖");
         }
+        ProductionPlan productionPlan = getById(productionPlanDto.getId());
+        if (productionPlan == null) {
+            throw new ServiceException("缂栬緫澶辫触,涓荤敓浜ц鍒掍笉瀛樺湪");
+        }
+
+        if (StringUtils.isNotEmpty(productionPlanDto.getApplyNo())
+                && !productionPlanDto.getApplyNo().equals(productionPlan.getApplyNo())) {
+
+            Long count = productionPlanMapper.selectCount(Wrappers.<ProductionPlan>lambdaQuery()
+                    .eq(ProductionPlan::getApplyNo, productionPlanDto.getApplyNo())
+                    .ne(ProductionPlan::getId, productionPlanDto.getId())); // 鎺掗櫎鑷韩
+
+            if (count > 0) {
+                throw new ServiceException("缂栬緫澶辫触锛岀敵璇峰崟缂栧彿 " + productionPlanDto.getApplyNo() + " 宸茶鍗犵敤");
+            }
+        }
+        // 宸蹭笅鍙戠姸鎬侊紝涓嶈兘缂栬緫
+        if (productionPlan.getStatus() != 0) {
+            throw new BaseException("缂栬緫澶辫触,璇ョ敓浜ц鍒掑凡涓嬪彂鎴栭儴鍒嗕笅鍙戠姸鎬�,绂佹缂栬緫");
+        }
+
         // 鏌ヨ鏄惁鏈夊叧鑱旇鍗�
-        boolean hasProductOrderPlan = productOrderPlanMapper.selectList(Wrappers.<ProductOrderPlan>lambdaQuery().eq(ProductOrderPlan::getProductionPlanId, productionPlanDto.getId())).stream().anyMatch(p -> p.getProductOrderId() != null);
+        boolean hasProductOrderPlan = productOrderPlanMapper.selectList(Wrappers.<ProductOrderPlan>lambdaQuery()
+                        .eq(ProductOrderPlan::getProductionPlanId, productionPlanDto.getId()))
+                .stream().anyMatch(p -> p.getProductOrderId() != null);
+
         if (hasProductOrderPlan) {
-            //  濡傛灉鍏宠仈锛屾柟鏁板彧鑳介�掑
-            ProductionPlan currentPlan = productionPlanMapper.selectById(productionPlanDto.getId());
-            if (productionPlanDto.getVolume().compareTo(currentPlan.getVolume()) < 0) {
+            if (productionPlanDto.getVolume().compareTo(productionPlan.getVolume()) < 0) {
                 throw new BaseException("鏂规暟涓嶈兘閫掑噺");
             }
         }
@@ -471,28 +504,68 @@
         if (list == null || list.isEmpty()) {
             throw new ServiceException("Excel娌℃湁鏁版嵁");
         }
-        List<ProductionPlan> entityList = new ArrayList<>(list.size());
-        ProductionPlan entity;
-        for (ProductionPlanImportDto dto : list) {
-            entity = new ProductionPlan();
-            BeanUtils.copyProperties(dto, entity);
-            entity.setAssignedQuantity(BigDecimal.ZERO);
-            entity.setCreateTime(LocalDateTime.now());
-            entity.setUpdateTime(LocalDateTime.now());
-            entity.setDataSourceType(DataSourceTypeEnum.DING_TALK.getCode());
 
-            // 鏍规嵁鐗╂枡缂栫爜濉厖鍏宠仈ID
-            if (StringUtils.isNotEmpty(dto.getMaterialCode())) {
-                LambdaQueryWrapper<ProductMaterialSku> skuQueryWrapper = new LambdaQueryWrapper<>();
-                skuQueryWrapper.eq(ProductMaterialSku::getMaterialCode, dto.getMaterialCode());
-                ProductMaterialSku sku = productMaterialSkuService.getOne(skuQueryWrapper);
-                if (sku != null) {
-                    entity.setProductMaterialSkuId(sku.getId());
+        Set<String> applyNos = new HashSet<>();
+        Set<String> materialCodes = new HashSet<>();
+        for (int i = 0; i < list.size(); i++) {
+            ProductionPlanImportDto dto = list.get(i);
+            String applyNo = dto.getApplyNo();
+            String materialCode = dto.getMaterialCode();
+
+            if (StringUtils.isEmpty(applyNo)) {
+                throw new ServiceException("瀵煎叆澶辫触锛氱 " + (i + 2) + " 琛岀敵璇峰崟缂栧彿涓嶈兘涓虹┖");
+            }
+            if (!applyNos.add(applyNo)) {
+                throw new ServiceException("瀵煎叆澶辫触锛欵xcel 涓瓨鍦ㄩ噸澶嶇殑鐢宠鍗曠紪鍙�: " + applyNo);
+            }
+            if (StringUtils.isEmpty(materialCode)) {
+                throw new ServiceException("瀵煎叆澶辫触锛氱 " + (i + 2) + " 琛岀墿鏂欑紪鐮佷笉鑳戒负绌�");
+            }
+
+            String strength = dto.getStrength();
+            if (StringUtils.isNotEmpty(strength)) {
+                if (!"A3.5".equals(strength) && !"A5.0".equals(strength)) {
+                    throw new ServiceException("瀵煎叆澶辫触锛氱 " + (i + 2) + " 琛屽己搴﹀彧鑳芥槸 A3.5 鎴� A5.0");
                 }
             }
 
-            entityList.add(entity);
+            materialCodes.add(materialCode);
         }
+
+        //  鐢宠鍗曠紪鍙锋槸鍚﹀凡瀛樺湪
+        Long existApplyNoCount = baseMapper.selectCount(Wrappers.<ProductionPlan>lambdaQuery()
+                .in(ProductionPlan::getApplyNo, applyNos));
+        if (existApplyNoCount > 0) {
+            List<String> existApplyNos = baseMapper.selectList(Wrappers.<ProductionPlan>lambdaQuery()
+                            .in(ProductionPlan::getApplyNo, applyNos))
+                    .stream().map(ProductionPlan::getApplyNo).collect(Collectors.toList());
+            throw new ServiceException("瀵煎叆澶辫触锛岀敵璇峰崟缂栧彿宸插瓨鍦�: " + String.join(", ", existApplyNos));
+        }
+
+        Map<String, Long> skuMap = productMaterialSkuService.list(Wrappers.<ProductMaterialSku>lambdaQuery()
+                        .in(ProductMaterialSku::getMaterialCode, materialCodes))
+                .stream().collect(Collectors.toMap(ProductMaterialSku::getMaterialCode, ProductMaterialSku::getId, (k1, k2) -> k1));
+
+        List<String> missingCodes = materialCodes.stream()
+                .filter(code -> !skuMap.containsKey(code))
+                .collect(Collectors.toList());
+        if (!missingCodes.isEmpty()) {
+            throw new ServiceException("瀵煎叆澶辫触锛屼互涓嬬墿鏂欑紪鐮佷笉瀛樺湪: " + String.join(", ", missingCodes));
+        }
+
+        LocalDateTime now = LocalDateTime.now();
+        List<ProductionPlan> entityList = list.stream().map(dto -> {
+            ProductionPlan entity = new ProductionPlan();
+            BeanUtils.copyProperties(dto, entity);
+            entity.setProductMaterialSkuId(skuMap.get(dto.getMaterialCode()));
+            entity.setAssignedQuantity(BigDecimal.ZERO);
+            entity.setDataSourceType(DataSourceTypeEnum.MANUAL.getCode());
+            entity.setStatus(0);
+            entity.setCreateTime(now);
+            entity.setUpdateTime(now);
+            return entity;
+        }).collect(Collectors.toList());
+
         this.saveBatch(entityList);
     }
 

--
Gitblit v1.9.3