gongchunyi
2026-04-29 e3799b9d987596de79ae7607a205d547c8060340
src/main/java/com/ruoyi/production/service/impl/ProductProcessServiceImpl.java
@@ -11,11 +11,11 @@
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.dto.ProductProcessImportDto;
import com.ruoyi.production.enums.ProductProcessEnum;
import com.ruoyi.production.mapper.ProcessRouteItemMapper;
import com.ruoyi.production.mapper.ProductProcessMapper;
import com.ruoyi.production.mapper.ProductProcessRouteItemMapper;
@@ -25,7 +25,6 @@
import com.ruoyi.production.service.ProductProcessService;
import com.ruoyi.project.system.domain.SysUser;
import com.ruoyi.project.system.mapper.SysUserMapper;
import com.ruoyi.project.system.service.ISysUserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
@@ -37,6 +36,7 @@
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
@Slf4j
@Service
@@ -91,6 +91,7 @@
        if (productModel == null) {
            throw new ServiceException("新增失败,该部件不存在");
        }
        validateDuplicateTypeForSameProduct(productModel.getId(), productProcessDto.getType(), null);
        ProductProcess productProcess = new ProductProcess();
        BeanUtils.copyProperties(productProcessDto, productProcess);
@@ -109,6 +110,9 @@
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void update(ProductProcessDto productProcessDto) {
        if (ObjectUtils.isEmpty(productProcessDto.getId())) {
            throw new ServiceException("修改失败,工序ID不能为空");
        }
        if (ObjectUtils.isEmpty(productProcessDto.getName())) {
            throw new ServiceException("部件名称不能为空");
        }
@@ -121,13 +125,21 @@
            }
        }
        // 判断关联产品是否存在
        if (ObjectUtils.isNotEmpty(productProcessDto.getProductModelId())) {
            ProductModel productModel = productModelService.getById(productProcessDto.getProductModelId());
            if (productModel == null) {
                throw new ServiceException("修改失败,关联部件不存在");
            }
        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);
@@ -175,10 +187,10 @@
                if (ObjectUtils.isEmpty(importDto.getProductProcessType())) {
                    throw new ServiceException("第" + rowNum + "行:部件【" + importDto.getName() + "】的类型不能为空");
                }
                ProductProcessEnum enumByInfo = ProductProcessEnum.getEnumByInfo(importDto.getProductProcessType());
                if (ObjectUtils.isEmpty(enumByInfo)) {
                String dictValue = DictUtils.getDictValue("product_process_type", importDto.getProductProcessType());
                if (StringUtils.isEmpty(dictValue)) {
                    throw new ServiceException("第" + rowNum + "行:部件【" + importDto.getName() + "】的类型【"
                            + importDto.getProductProcessType() + "】不存在,请填写正确的类型:加工、刮板冷芯制作、管路组对、罐体连接及调试、测试打压、其他");
                            + importDto.getProductProcessType() + "】不存在,请填写正确的类型:" + DictUtils.getDictLabels("product_process_type"));
                }
                // 检验计划工时
                if (importDto.getSalaryQuota() == null || importDto.getSalaryQuota().compareTo(BigDecimal.ZERO) < 0) {
@@ -195,7 +207,7 @@
                ProductProcess productProcess = new ProductProcess();
                BeanUtils.copyProperties(importDto, productProcess);
                productProcess.setProductModelId(productModel.getId());
                productProcess.setType(enumByInfo.getCode());
                productProcess.setType(Integer.valueOf(dictValue));
                if (sysUser != null) {
                    productProcess.setPlannerId(sysUser.getUserId());
                    productProcess.setPlannerName(sysUser.getNickName());
@@ -232,6 +244,34 @@
        }
    }
    /**
     * 校验同一产品下工序类型不能重复
     */
    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) {