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<PieceRateConfigMapper, PieceRateConfig> implements PieceRateConfigService {
|
|
private final ProductModelMapper productModelMapper;
|
|
@Override
|
public IPage<PieceRateConfig> listPage(Page<PieceRateConfig> page, PieceRateConfig query) {
|
return this.page(page, Wrappers.<PieceRateConfig>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.<PieceRateConfig>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.<PieceRateConfig>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());
|
}
|
}
|