From e3799b9d987596de79ae7607a205d547c8060340 Mon Sep 17 00:00:00 2001
From: gongchunyi <deslre0381@gmail.com>
Date: 星期三, 29 四月 2026 16:27:24 +0800
Subject: [PATCH] feat: 工序修改为字典,首页产品部件统计调整

---
 src/main/java/com/ruoyi/production/service/impl/ProductProcessServiceImpl.java |  194 +++++++++++++++++++++++++++++++++++++++++-------
 1 files changed, 164 insertions(+), 30 deletions(-)

diff --git a/src/main/java/com/ruoyi/production/service/impl/ProductProcessServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProductProcessServiceImpl.java
index 65e3392..71bf805 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductProcessServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductProcessServiceImpl.java
@@ -1,14 +1,21 @@
 package com.ruoyi.production.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 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.basic.pojo.Product;
+import com.ruoyi.basic.pojo.ProductModel;
+import com.ruoyi.basic.service.IProductModelService;
+import com.ruoyi.basic.service.IProductService;
 import com.ruoyi.common.exception.ServiceException;
+import com.ruoyi.common.utils.DictUtils;
+import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.common.utils.poi.ExcelUtil;
 import com.ruoyi.production.dto.ProductProcessDto;
-import com.ruoyi.production.enums.ProductProcessEnum;
+import com.ruoyi.production.dto.ProductProcessImportDto;
 import com.ruoyi.production.mapper.ProcessRouteItemMapper;
 import com.ruoyi.production.mapper.ProductProcessMapper;
 import com.ruoyi.production.mapper.ProductProcessRouteItemMapper;
@@ -16,6 +23,8 @@
 import com.ruoyi.production.pojo.ProductProcess;
 import com.ruoyi.production.pojo.ProductProcessRouteItem;
 import com.ruoyi.production.service.ProductProcessService;
+import com.ruoyi.project.system.domain.SysUser;
+import com.ruoyi.project.system.mapper.SysUserMapper;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -24,11 +33,15 @@
 import org.springframework.util.CollectionUtils;
 import org.springframework.web.multipart.MultipartFile;
 
+import java.math.BigDecimal;
+import java.util.ArrayList;
 import java.util.List;
+import java.util.stream.Collectors;
 
 @Slf4j
 @Service
-public class ProductProcessServiceImpl extends ServiceImpl<ProductProcessMapper, ProductProcess> implements ProductProcessService {
+public class ProductProcessServiceImpl extends ServiceImpl<ProductProcessMapper, ProductProcess>
+        implements ProductProcessService {
 
     @Autowired
     private ProductProcessMapper productProcessMapper;
@@ -38,6 +51,15 @@
 
     @Autowired
     private ProductProcessRouteItemMapper productProcessRouteItemMapper;
+
+    @Autowired
+    private IProductModelService productModelService;
+
+    @Autowired
+    private IProductService productService;
+
+    @Autowired
+    private SysUserMapper sysUserMapper;
 
     @Override
     public IPage<ProductProcessDto> listPage(Page page, ProductProcessDto productProcessDto) {
@@ -50,10 +72,6 @@
         if (ObjectUtils.isEmpty(productProcessDto.getName())) {
             throw new ServiceException("閮ㄤ欢鍚嶇О涓嶈兘涓虹┖");
         }
-        long count = this.count(Wrappers.<ProductProcess>lambdaQuery().eq(ProductProcess::getName, productProcessDto.getName()));
-        if (count > 0) {
-            throw new ServiceException("閮ㄤ欢鍚嶇О宸插瓨鍦紝涓嶈兘閲嶅");
-        }
 
         if (ObjectUtils.isNotEmpty(productProcessDto.getNo())) {
             long noCount = this.count(Wrappers.<ProductProcess>lambdaQuery().eq(ProductProcess::getNo, productProcessDto.getNo()));
@@ -61,13 +79,29 @@
                 throw new ServiceException("宸ュ簭缂栧彿宸插瓨鍦紝涓嶈兘閲嶅");
             }
         }
+        // 鍒ゆ柇璁″垝宸ユ椂鏄惁涓虹┖
+        if (ObjectUtils.isEmpty(productProcessDto.getSalaryQuota())) {
+            throw new ServiceException("鏂板澶辫触,璁″垝宸ユ椂涓嶈兘涓虹┖");
+        }
+        // 鍒ゆ柇浜у搧鏄惁瀛樺湪
+        if (ObjectUtils.isEmpty(productProcessDto.getProductModelId())) {
+            throw new ServiceException("鏂板澶辫触,閮ㄤ欢涓嶈兘涓虹┖");
+        }
+        ProductModel productModel = productModelService.getById(productProcessDto.getProductModelId());
+        if (productModel == null) {
+            throw new ServiceException("鏂板澶辫触,璇ラ儴浠朵笉瀛樺湪");
+        }
+        validateDuplicateTypeForSameProduct(productModel.getId(), productProcessDto.getType(), null);
 
         ProductProcess productProcess = new ProductProcess();
         BeanUtils.copyProperties(productProcessDto, productProcess);
+        productProcess.setProductModelId(productModel.getId());
+
+        validatePlanner(productProcessDto.getPlannerId(), productProcessDto.getPlannerName(), null);
+
         boolean save = productProcessMapper.insert(productProcess) > 0;
         if (save && ObjectUtils.isEmpty(productProcess.getNo())) {
             String no = "GX" + String.format("%08d", productProcess.getId());
-            // 娉ㄦ剰锛氳繖閲岀敱浜庢槸鑷姩鐢熸垚鐨� ID 琛ュ叏锛岄�氬父涓嶄細閲嶅锛屼絾寤鸿 set 涔嬪悗鏇存柊
             productProcess.setNo(no);
             productProcessMapper.updateById(productProcess);
         }
@@ -76,15 +110,11 @@
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void update(ProductProcessDto productProcessDto) {
+        if (ObjectUtils.isEmpty(productProcessDto.getId())) {
+            throw new ServiceException("淇敼澶辫触锛屽伐搴廔D涓嶈兘涓虹┖");
+        }
         if (ObjectUtils.isEmpty(productProcessDto.getName())) {
             throw new ServiceException("閮ㄤ欢鍚嶇О涓嶈兘涓虹┖");
-        }
-
-        long nameCount = this.count(Wrappers.<ProductProcess>lambdaQuery()
-                .eq(ProductProcess::getName, productProcessDto.getName())
-                .ne(ProductProcess::getId, productProcessDto.getId()));
-        if (nameCount > 0) {
-            throw new ServiceException("閮ㄤ欢鍚嶇О宸插瓨鍦紝涓嶈兘閲嶅");
         }
         if (ObjectUtils.isNotEmpty(productProcessDto.getNo())) {
             long noCount = this.count(Wrappers.<ProductProcess>lambdaQuery()
@@ -95,6 +125,25 @@
             }
         }
 
+        ProductProcess oldProductProcess = this.getById(productProcessDto.getId());
+        if (oldProductProcess == null) {
+            throw new ServiceException("淇敼澶辫触锛屽伐搴忎笉瀛樺湪");
+        }
+        Long finalProductModelId = ObjectUtils.isNotEmpty(productProcessDto.getProductModelId())
+                ? productProcessDto.getProductModelId() : oldProductProcess.getProductModelId();
+        Integer finalType = ObjectUtils.isNotEmpty(productProcessDto.getType())
+                ? productProcessDto.getType() : oldProductProcess.getType();
+
+        // 鍒ゆ柇鍏宠仈浜у搧鏄惁瀛樺湪
+        ProductModel productModel = productModelService.getById(finalProductModelId);
+        if (productModel == null) {
+            throw new ServiceException("淇敼澶辫触锛屽叧鑱旈儴浠朵笉瀛樺湪");
+        }
+        validateDuplicateTypeForSameProduct(productModel.getId(), finalType, productProcessDto.getId());
+
+        // 鏍¢獙璁″垝浜哄憳
+        validatePlanner(productProcessDto.getPlannerId(), productProcessDto.getPlannerName(), null);
+
         ProductProcess productProcess = new ProductProcess();
         BeanUtils.copyProperties(productProcessDto, productProcess);
         this.updateById(productProcess);
@@ -104,31 +153,66 @@
     @Transactional(rollbackFor = Exception.class)
     public void importData(MultipartFile file) {
         try {
-            ExcelUtil<ProductProcess> util = new ExcelUtil<>(ProductProcess.class);
-            List<ProductProcess> productProcessList = util.importExcel(file.getInputStream());
-            if (CollectionUtils.isEmpty(productProcessList)) {
+            ExcelUtil<ProductProcessImportDto> util = new ExcelUtil<>(ProductProcessImportDto.class);
+            List<ProductProcessImportDto> importList = util.importExcel(file.getInputStream());
+            if (CollectionUtils.isEmpty(importList)) {
                 throw new ServiceException("妯℃澘閿欒鎴栧鍏ユ暟鎹负绌�");
             }
 
-            for (int i = 0; i < productProcessList.size(); i++) {
-                ProductProcess productProcess = productProcessList.get(i);
+            List<ProductProcess> productProcessList = new ArrayList<>();
+            for (int i = 0; i < importList.size(); i++) {
+                ProductProcessImportDto importDto = importList.get(i);
                 int rowNum = i + 2;
+                SysUser sysUser = null;
 
-                if (ObjectUtils.isEmpty(productProcess)) {
+                if (ObjectUtils.isEmpty(importDto)) {
                     throw new ServiceException("绗�" + rowNum + "琛屾暟鎹负绌猴紝璇蜂娇鐢ㄦ纭殑妯℃澘杩涜瀵煎叆");
                 }
-                if (ObjectUtils.isEmpty(productProcess.getName())) {
+                if (ObjectUtils.isEmpty(importDto.getName())) {
                     throw new ServiceException("绗�" + rowNum + "琛岋細閮ㄤ欢鍚嶇О涓嶈兘涓虹┖");
                 }
-                if (ObjectUtils.isEmpty(productProcess.getProductProcessType())) {
-                    throw new ServiceException("绗�" + rowNum + "琛岋細閮ㄤ欢銆�" + productProcess.getName() + "銆戠殑绫诲瀷涓嶈兘涓虹┖");
+                if (ObjectUtils.isEmpty(importDto.getProductModel())) {
+                    throw new ServiceException("绗�" + rowNum + "琛岋細閮ㄤ欢瑙勬牸涓嶈兘涓虹┖");
                 }
-                ProductProcessEnum enumByInfo = ProductProcessEnum.getEnumByInfo(productProcess.getProductProcessType());
-                if (ObjectUtils.isEmpty(enumByInfo)) {
-                    throw new ServiceException("绗�" + rowNum + "琛岋細閮ㄤ欢銆�" + productProcess.getName() + "銆戠殑绫诲瀷銆�" + productProcess.getProductProcessType() + "銆戜笉瀛樺湪锛岃濉啓姝g‘鐨勭被鍨嬶細鍔犲伐銆佸埉鏉垮喎鑺埗浣溿�佺璺粍瀵广�佺綈浣撹繛鎺ュ強璋冭瘯銆佹祴璇曟墦鍘嬨�佸叾浠�");
-                }else {
-                    productProcess.setType(enumByInfo.getCode());
+                //  妫�楠屼骇鍝佷笌绫诲瀷鏄惁瀛樺湪
+                Product product = productService.getOne(new LambdaQueryWrapper<Product>().eq(Product::getProductName, importDto.getName()));
+                if (product == null) {
+                    throw new ServiceException("绗�" + rowNum + "琛�: 閮ㄤ欢銆�" + importDto.getName() + "銆戜笉瀛樺湪");
                 }
+                ProductModel productModel = productModelService.getOne(new LambdaQueryWrapper<ProductModel>().eq(ProductModel::getProductId, product.getId()).eq(ProductModel::getModel, importDto.getProductModel()));
+                if (ObjectUtils.isEmpty(productModel)) {
+                    throw new ServiceException("绗�" + rowNum + "琛岋細閮ㄤ欢瑙勬牸銆�" + importDto.getProductModel() + "銆戜笉瀛樺湪");
+                }
+
+                if (ObjectUtils.isEmpty(importDto.getProductProcessType())) {
+                    throw new ServiceException("绗�" + rowNum + "琛岋細閮ㄤ欢銆�" + importDto.getName() + "銆戠殑绫诲瀷涓嶈兘涓虹┖");
+                }
+                String dictValue = DictUtils.getDictValue("product_process_type", importDto.getProductProcessType());
+                if (StringUtils.isEmpty(dictValue)) {
+                    throw new ServiceException("绗�" + rowNum + "琛岋細閮ㄤ欢銆�" + importDto.getName() + "銆戠殑绫诲瀷銆�"
+                            + importDto.getProductProcessType() + "銆戜笉瀛樺湪锛岃濉啓姝g‘鐨勭被鍨嬶細" + DictUtils.getDictLabels("product_process_type"));
+                }
+                // 妫�楠岃鍒掑伐鏃�
+                if (importDto.getSalaryQuota() == null || importDto.getSalaryQuota().compareTo(BigDecimal.ZERO) < 0) {
+                    throw new ServiceException("绗�" + rowNum + "琛岋細璁″垝宸ユ椂涓嶈兘涓虹┖涓庤礋鏁�");
+                }
+                // 妫�楠岃鍒掍汉鍛�
+                if (StringUtils.isNotEmpty(importDto.getPlannerName())) {
+                    sysUser = sysUserMapper.selectUserByNickName(importDto.getPlannerName());
+                    if (ObjectUtils.isEmpty(sysUser)) {
+                        throw new ServiceException("绗�" + rowNum + "琛岋細璁″垝浜哄憳銆�" + importDto.getPlannerName() + "銆戜笉瀛樺湪");
+                    }
+                }
+
+                ProductProcess productProcess = new ProductProcess();
+                BeanUtils.copyProperties(importDto, productProcess);
+                productProcess.setProductModelId(productModel.getId());
+                productProcess.setType(Integer.valueOf(dictValue));
+                if (sysUser != null) {
+                    productProcess.setPlannerId(sysUser.getUserId());
+                    productProcess.setPlannerName(sysUser.getNickName());
+                }
+                productProcessList.add(productProcess);
             }
 
             saveOrUpdateBatch(productProcessList);
@@ -140,12 +224,62 @@
         }
     }
 
+    /**
+     * 鏍¢獙璁″垝浜哄憳鏄惁瀛樺湪
+     *
+     * @param plannerId   璁″垝浜哄憳ID
+     * @param plannerName 璁″垝浜哄憳濮撳悕
+     * @param rowNum      琛屽彿
+     */
+    private void validatePlanner(Long plannerId, String plannerName, Integer rowNum) {
+        String prefix = rowNum != null ? "绗�" + rowNum + "琛岋細" : "";
+        if (plannerId != null) {
+            if (sysUserMapper.selectUserById(plannerId) == null) {
+                throw new ServiceException(prefix + "璁″垝浜哄憳ID銆�" + plannerId + "銆戜笉瀛樺湪");
+            }
+        } else if (ObjectUtils.isNotEmpty(plannerName)) {
+            if (sysUserMapper.selectUserByNickName(plannerName) == null) {
+                throw new ServiceException(prefix + "璁″垝浜哄憳濮撳悕銆�" + plannerName + "銆戜笉瀛樺湪");
+            }
+        }
+    }
+
+    /**
+     * 鏍¢獙鍚屼竴浜у搧涓嬪伐搴忕被鍨嬩笉鑳介噸澶�
+     */
+    private void validateDuplicateTypeForSameProduct(Long productModelId, Integer type, Long excludeId) {
+        if (productModelId == null || type == null) {
+            return;
+        }
+        ProductModel currentModel = productModelService.getById(productModelId);
+        if (currentModel == null || currentModel.getProductId() == null) {
+            return;
+        }
+        List<ProductModel> productModels = productModelService.list(
+                Wrappers.<ProductModel>lambdaQuery().eq(ProductModel::getProductId, currentModel.getProductId()));
+        if (CollectionUtils.isEmpty(productModels)) {
+            return;
+        }
+        List<Long> productModelIds = productModels.stream().map(ProductModel::getId).collect(Collectors.toList());
+        LambdaQueryWrapper<ProductProcess> queryWrapper = Wrappers.<ProductProcess>lambdaQuery()
+                .in(ProductProcess::getProductModelId, productModelIds)
+                .eq(ProductProcess::getType, type);
+        if (excludeId != null) {
+            queryWrapper.ne(ProductProcess::getId, excludeId);
+        }
+        if (this.count(queryWrapper) > 0) {
+            throw new ServiceException("鎿嶄綔澶辫触锛屽悓涓�浜у搧涓嶈兘瀛樺湪閲嶅鐨勯儴浠剁被鍨�");
+        }
+    }
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void batchDelete(List<Integer> ids) {
         // 鏌ヨ鏄惁鐢熶骇涓凡缁忓紩鐢ㄤ簡杩欎簺宸ュ簭
-        List<ProcessRouteItem> processRouteItems = processRouteItemMapper.selectList(Wrappers.<ProcessRouteItem>lambdaQuery().in(ProcessRouteItem::getProcessId, ids));
-        List<ProductProcessRouteItem> productProcessRouteItems = productProcessRouteItemMapper.selectList(Wrappers.<ProductProcessRouteItem>lambdaQuery().in(ProductProcessRouteItem::getProcessId, ids));
+        List<ProcessRouteItem> processRouteItems = processRouteItemMapper
+                .selectList(Wrappers.<ProcessRouteItem>lambdaQuery().in(ProcessRouteItem::getProcessId, ids));
+        List<ProductProcessRouteItem> productProcessRouteItems = productProcessRouteItemMapper.selectList(
+                Wrappers.<ProductProcessRouteItem>lambdaQuery().in(ProductProcessRouteItem::getProcessId, ids));
         if (!CollectionUtils.isEmpty(processRouteItems) || !CollectionUtils.isEmpty(productProcessRouteItems)) {
             throw new ServiceException("璇ュ伐搴忓凡缁忚浣跨敤锛屾棤娉曞垹闄�");
         }

--
Gitblit v1.9.3