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("生产订单工艺路线工序ID不能为空"); } ProductionOrderRoutingOperation routingOperation = productionOrderRoutingOperationMapper.selectById(productionOrderRoutingOperationId); if (routingOperation == null) { throw new ServiceException("生产订单工艺路线工序不存在"); } 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("生产订单不存在"); } if (item.getParamId() == null) { return; } TechnologyParam sourceParam = technologyParamMapper.selectById(item.getParamId()); if (sourceParam == null) { throw new ServiceException("工艺参数不存在"); } 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("参数编码不能为空"); } if (item.getParamName() == null || item.getParamName().trim().isEmpty()) { throw new ServiceException("参数名称不能为空"); } } 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("生产订单工艺路线工序参数重复"); } } }