package com.ruoyi.production.service.impl; 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.basic.mapper.ProductModelMapper; import com.ruoyi.basic.pojo.ProductModel; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.framework.web.domain.R; import com.ruoyi.production.mapper.PieceRateConfigMapper; import com.ruoyi.production.pojo.PieceRateConfig; import com.ruoyi.production.service.PieceRateConfigService; import lombok.AllArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; @AllArgsConstructor @Service @Transactional(rollbackFor = Exception.class) public class PieceRateConfigServiceImpl extends ServiceImpl implements PieceRateConfigService { private final ProductModelMapper productModelMapper; @Override public IPage listPage(Page page, PieceRateConfig query) { return this.page(page, Wrappers.lambdaQuery() .like(query.getOperationName() != null && !query.getOperationName().isEmpty(), PieceRateConfig::getOperationName, query.getOperationName()) .like(query.getProductModel() != null && !query.getProductModel().isEmpty(), PieceRateConfig::getProductModel, query.getProductModel()) .eq(query.getProductModelId() != null, PieceRateConfig::getProductModelId, query.getProductModelId()) .eq(query.getStatus() != null, PieceRateConfig::getStatus, query.getStatus()) .orderByDesc(PieceRateConfig::getId)); } @Override public R add(PieceRateConfig config) { validate(config); checkDuplicate(config.getProductModelId(), config.getOperationName(), null); fillProductModel(config); if (config.getStatus() == null) { config.setStatus(1); } this.save(config); return R.ok(); } @Override public R update(PieceRateConfig config) { if (config.getId() == null) { throw new ServiceException("参数错误:id不能为空"); } PieceRateConfig exist = this.getById(config.getId()); if (exist == null) { throw new ServiceException("计件单价配置不存在"); } validate(config); checkDuplicate(config.getProductModelId(), config.getOperationName(), config.getId()); fillProductModel(config); this.updateById(config); return R.ok(); } @Override public R changeStatus(Long id, Integer status) { if (id == null || status == null || (status != 0 && status != 1)) { throw new ServiceException("参数错误:id与状态(0/1)必传"); } PieceRateConfig exist = this.getById(id); if (exist == null) { throw new ServiceException("计件单价配置不存在"); } PieceRateConfig update = new PieceRateConfig(); update.setId(id); update.setStatus(status); this.updateById(update); return R.ok(); } @Override public BigDecimal matchPrice(Long productModelId, String operationName) { if (productModelId == null || operationName == null || operationName.isEmpty()) { return null; } PieceRateConfig config = this.getOne(Wrappers.lambdaQuery() .eq(PieceRateConfig::getProductModelId, productModelId) .eq(PieceRateConfig::getOperationName, operationName) .eq(PieceRateConfig::getStatus, 1) .orderByDesc(PieceRateConfig::getId) .last("limit 1"), false); return config == null ? null : config.getUnitPrice(); } private void validate(PieceRateConfig config) { if (config.getProductModelId() == null) { throw new ServiceException("请选择产品规格"); } if (config.getOperationName() == null || config.getOperationName().trim().isEmpty()) { throw new ServiceException("工序名称不能为空"); } config.setOperationName(config.getOperationName().trim()); if (config.getUnitPrice() == null || config.getUnitPrice().compareTo(BigDecimal.ZERO) <= 0) { throw new ServiceException("计件单价必须大于0"); } } private void checkDuplicate(Long productModelId, String operationName, Long excludeId) { long count = this.count(Wrappers.lambdaQuery() .eq(PieceRateConfig::getProductModelId, productModelId) .eq(PieceRateConfig::getOperationName, operationName) .ne(excludeId != null, PieceRateConfig::getId, excludeId)); if (count > 0) { throw new ServiceException("该产品规格下工序[" + operationName + "]已存在计件单价配置"); } } private void fillProductModel(PieceRateConfig config) { ProductModel model = productModelMapper.selectById(config.getProductModelId()); if (model == null) { throw new ServiceException("产品规格不存在"); } config.setProductModel(model.getModel()); } }