package com.ruoyi.production.service.impl; import cn.hutool.core.bean.BeanUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; 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.common.exception.ServiceException; import com.ruoyi.production.bean.dto.ProductionOrderRoutingOperationParamDto; import com.ruoyi.production.bean.vo.ProductionOrderRoutingOperationParamVo; import com.ruoyi.production.mapper.ProductionOrderMapper; import com.ruoyi.production.mapper.ProductionOrderRoutingOperationMapper; import com.ruoyi.production.mapper.ProductionOrderRoutingOperationParamMapper; import com.ruoyi.production.pojo.ProductionOrder; import com.ruoyi.production.pojo.ProductionOrderRoutingOperation; import com.ruoyi.production.pojo.ProductionOrderRoutingOperationParam; import com.ruoyi.production.service.ProductionOrderRoutingOperationParamService; import com.ruoyi.technology.mapper.TechnologyParamMapper; import com.ruoyi.technology.mapper.TechnologyRoutingOperationParamMapper; import com.ruoyi.technology.pojo.TechnologyParam; import com.ruoyi.technology.pojo.TechnologyRoutingOperationParam; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; @Service @Transactional(rollbackFor = Exception.class) @RequiredArgsConstructor public class ProductionOrderRoutingOperationParamServiceImpl extends ServiceImpl implements ProductionOrderRoutingOperationParamService { private final ProductionOrderRoutingOperationParamMapper productionOrderRoutingOperationParamMapper; private final ProductionOrderRoutingOperationMapper productionOrderRoutingOperationMapper; private final ProductionOrderMapper productionOrderMapper; private final TechnologyParamMapper technologyParamMapper; private final TechnologyRoutingOperationParamMapper technologyRoutingOperationParamMapper; @Override public IPage pageProductionOrderRoutingOperationParam(Page page, ProductionOrderRoutingOperationParamDto dto) { Page entityPage = new Page<>(page.getCurrent(), page.getSize(), page.getTotal()); return this.page(entityPage, buildQueryWrapper(dto)) .convert(item -> BeanUtil.copyProperties(item, ProductionOrderRoutingOperationParamVo.class)); } @Override public List listProductionOrderRoutingOperationParam(ProductionOrderRoutingOperationParamDto dto) { return BeanUtil.copyToList(this.list(buildQueryWrapper(dto)), ProductionOrderRoutingOperationParamVo.class); } @Override public ProductionOrderRoutingOperationParamVo getProductionOrderRoutingOperationParamInfo(Long id) { ProductionOrderRoutingOperationParam item = this.getById(id); return item == null ? null : BeanUtil.copyProperties(item, ProductionOrderRoutingOperationParamVo.class); } @Override public boolean saveProductionOrderRoutingOperationParam(ProductionOrderRoutingOperationParam item) { ProductionOrderRoutingOperation routingOperation = getRoutingOperation(item.getProductionOrderRoutingOperationId()); fillFromSourceParam(item, routingOperation); validateManualFields(item); checkDuplicate(item); return this.saveOrUpdate(item); } @Override public boolean removeProductionOrderRoutingOperationParam(Long id) { return this.removeById(id); } private LambdaQueryWrapper buildQueryWrapper(ProductionOrderRoutingOperationParamDto dto) { ProductionOrderRoutingOperationParam query = dto == null ? new ProductionOrderRoutingOperationParam() : dto; return Wrappers.lambdaQuery() .eq(query.getId() != null, ProductionOrderRoutingOperationParam::getId, query.getId()) .eq(query.getProductionProductMainId() != null, ProductionOrderRoutingOperationParam::getProductionProductMainId, query.getProductionProductMainId()) .isNull(query.getProductionProductMainId() == null, ProductionOrderRoutingOperationParam::getProductionProductMainId) .eq(query.getProductionOrderId() != null, ProductionOrderRoutingOperationParam::getProductionOrderId, query.getProductionOrderId()) .eq(query.getProductionOrderRoutingOperationId() != null, ProductionOrderRoutingOperationParam::getProductionOrderRoutingOperationId, query.getProductionOrderRoutingOperationId()) .eq(query.getTechnologyOperationId() != null, ProductionOrderRoutingOperationParam::getTechnologyOperationId, query.getTechnologyOperationId()) .eq(query.getTechnologyRoutingOperationParamId() != null, ProductionOrderRoutingOperationParam::getTechnologyRoutingOperationParamId, query.getTechnologyRoutingOperationParamId()) .eq(query.getTechnologyOperationParamId() != null, ProductionOrderRoutingOperationParam::getTechnologyOperationParamId, query.getTechnologyOperationParamId()) .like(query.getParamCode() != null && !query.getParamCode().trim().isEmpty(), ProductionOrderRoutingOperationParam::getParamCode, query.getParamCode()) .like(query.getParamName() != null && !query.getParamName().trim().isEmpty(), ProductionOrderRoutingOperationParam::getParamName, query.getParamName()) .orderByAsc(ProductionOrderRoutingOperationParam::getProductionOrderRoutingOperationId) .orderByAsc(ProductionOrderRoutingOperationParam::getId); } private ProductionOrderRoutingOperation getRoutingOperation(Long productionOrderRoutingOperationId) { if (productionOrderRoutingOperationId == null) { throw new ServiceException("productionOrderRoutingOperationId is required"); } ProductionOrderRoutingOperation routingOperation = productionOrderRoutingOperationMapper.selectById(productionOrderRoutingOperationId); if (routingOperation == null) { throw new ServiceException("Production order routing operation not found"); } return routingOperation; } private void fillFromSourceParam(ProductionOrderRoutingOperationParam item, ProductionOrderRoutingOperation routingOperation) { item.setProductionOrderId(routingOperation.getProductionOrderId()); item.setProductionOrderRoutingOperationId(routingOperation.getId()); ProductionOrder productionOrder = productionOrderMapper.selectById(routingOperation.getProductionOrderId()); if (productionOrder == null) { throw new ServiceException("Production order not found"); } if (item.getParamId() == null) { return; } TechnologyParam sourceParam = technologyParamMapper.selectById(item.getParamId()); if (sourceParam == null) { throw new ServiceException("Technology param not found"); } if (item.getTechnologyOperationParamId() != null) { TechnologyRoutingOperationParam sourceRoutingOperationParam = technologyRoutingOperationParamMapper.selectById(item.getTechnologyOperationParamId()); item.setTechnologyOperationId(sourceRoutingOperationParam.getTechnologyOperationId()); item.setTechnologyOperationParamId(sourceRoutingOperationParam.getTechnologyOperationParamId()); if (item.getStandardValue() == null) { item.setStandardValue(sourceRoutingOperationParam.getStandardValue()); } } item.setParamId(sourceParam.getId()); item.setParamCode(sourceParam.getParamCode()); item.setParamName(sourceParam.getParamName()); item.setParamType(sourceParam.getParamType()); item.setParamFormat(sourceParam.getParamFormat()); item.setUnit(sourceParam.getUnit()); item.setIsRequired(sourceParam.getIsRequired()); if (item.getRemark() == null || item.getRemark().trim().isEmpty()) { item.setRemark(sourceParam.getRemark()); } } private void validateManualFields(ProductionOrderRoutingOperationParam item) { if (item.getParamCode() == null || item.getParamCode().trim().isEmpty()) { throw new ServiceException("paramCode is required"); } if (item.getParamName() == null || item.getParamName().trim().isEmpty()) { throw new ServiceException("paramName is required"); } } private void checkDuplicate(ProductionOrderRoutingOperationParam item) { boolean duplicate = productionOrderRoutingOperationParamMapper.selectCount( Wrappers.lambdaQuery() .isNull(ProductionOrderRoutingOperationParam::getProductionProductMainId) .eq(ProductionOrderRoutingOperationParam::getProductionOrderRoutingOperationId, item.getProductionOrderRoutingOperationId()) .eq(item.getTechnologyRoutingOperationParamId() != null, ProductionOrderRoutingOperationParam::getTechnologyRoutingOperationParamId, item.getTechnologyRoutingOperationParamId()) .eq(item.getTechnologyRoutingOperationParamId() == null && item.getParamCode() != null, ProductionOrderRoutingOperationParam::getParamCode, item.getParamCode()) .ne(item.getId() != null, ProductionOrderRoutingOperationParam::getId, item.getId()) ) > 0; if (duplicate) { throw new ServiceException("Duplicate production order routing operation param"); } } }