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.dto.ProductionOrderRoutingOperationParamSyncDto; 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.TechnologyRoutingOperationParamMapper; 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 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.getTechnologyRoutingOperationId()); fillFromSourceParam(item, routingOperation); validateManualFields(item); checkDuplicate(item); return this.saveOrUpdate(item); } @Override public boolean removeProductionOrderRoutingOperationParam(Long id) { return this.removeById(id); } @Override public int syncProductionOrderRoutingOperationParam(ProductionOrderRoutingOperationParamSyncDto syncDto) { if (syncDto == null || syncDto.getProductionOrderRoutingOperationId() == null) { throw new ServiceException("productionOrderRoutingOperationId is required"); } ProductionOrderRoutingOperation routingOperation = getRoutingOperation(syncDto.getProductionOrderRoutingOperationId()); List sourceParamList = technologyRoutingOperationParamMapper.selectList( Wrappers.lambdaQuery() .eq(TechnologyRoutingOperationParam::getTechnologyRoutingOperationId, routingOperation.getTechnologyRoutingOperationId()) .orderByAsc(TechnologyRoutingOperationParam::getId) ); boolean replaceExisting = syncDto.getReplaceExisting() == null || syncDto.getReplaceExisting(); if (replaceExisting) { productionOrderRoutingOperationParamMapper.delete( Wrappers.lambdaQuery() .eq(ProductionOrderRoutingOperationParam::getTechnologyRoutingOperationId, routingOperation.getId()) ); } int successCount = 0; for (TechnologyRoutingOperationParam sourceParam : sourceParamList) { boolean exists = productionOrderRoutingOperationParamMapper.selectCount( Wrappers.lambdaQuery() .eq(ProductionOrderRoutingOperationParam::getTechnologyRoutingOperationId, routingOperation.getId()) .eq(ProductionOrderRoutingOperationParam::getTechnologyRoutingOperationParamId, sourceParam.getId()) ) > 0; if (!replaceExisting && exists) { continue; } ProductionOrderRoutingOperationParam target = new ProductionOrderRoutingOperationParam(); target.setTechnologyRoutingOperationId(routingOperation.getId()); target.setTechnologyRoutingOperationParamId(sourceParam.getId()); target.setProductionOrderId(routingOperation.getProductionOrderId()); target.setTechnologyOperationId(sourceParam.getTechnologyOperationId()); target.setTechnologyOperationParamId(sourceParam.getTechnologyOperationParamId()); target.setParamId(sourceParam.getParamId()); target.setParamCode(sourceParam.getParamCode()); target.setParamName(sourceParam.getParamName()); target.setParamType(sourceParam.getParamType()); target.setParamFormat(sourceParam.getParamFormat()); target.setUnit(sourceParam.getUnit()); target.setIsRequired(sourceParam.getIsRequired()); target.setRemark(sourceParam.getRemark()); target.setStandardValue(sourceParam.getStandardValue()); productionOrderRoutingOperationParamMapper.insert(target); successCount++; } return successCount; } 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.getProductionOrderId() != null, ProductionOrderRoutingOperationParam::getProductionOrderId, query.getProductionOrderId()) .eq(query.getTechnologyRoutingOperationId() != null, ProductionOrderRoutingOperationParam::getTechnologyRoutingOperationId, query.getTechnologyRoutingOperationId()) .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::getTechnologyRoutingOperationId) .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.setTechnologyRoutingOperationId(routingOperation.getId()); item.setProductionOrderId(routingOperation.getProductionOrderId()); ProductionOrder productionOrder = productionOrderMapper.selectById(routingOperation.getProductionOrderId()); if (productionOrder == null) { throw new ServiceException("Production order not found"); } if (item.getTechnologyRoutingOperationParamId() == null) { return; } TechnologyRoutingOperationParam sourceParam = technologyRoutingOperationParamMapper.selectById(item.getTechnologyRoutingOperationParamId()); if (sourceParam == null) { throw new ServiceException("Technology routing operation param not found"); } if (!routingOperation.getTechnologyRoutingOperationId().equals(sourceParam.getTechnologyRoutingOperationId())) { throw new ServiceException("Source param does not belong to routing operation"); } item.setTechnologyOperationId(sourceParam.getTechnologyOperationId()); item.setTechnologyOperationParamId(sourceParam.getTechnologyOperationParamId()); item.setParamId(sourceParam.getParamId()); 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()); } if (item.getStandardValue() == null) { item.setStandardValue(sourceParam.getStandardValue()); } } 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() .eq(ProductionOrderRoutingOperationParam::getTechnologyRoutingOperationId, item.getTechnologyRoutingOperationId()) .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"); } } }