package com.chinaztt.mes.warehouse.service.impl;
|
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
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.baomidou.mybatisplus.extension.toolkit.SqlHelper;
|
import com.chinaztt.mes.warehouse.dto.ReceivingDetailDTO;
|
import com.chinaztt.mes.warehouse.entity.DeliveryDetail;
|
import com.chinaztt.mes.warehouse.entity.ReceivingDetail;
|
import com.chinaztt.mes.warehouse.mapper.DeliveryDetailMapper;
|
import com.chinaztt.mes.warehouse.mapper.ReceivingDetailMapper;
|
import com.chinaztt.mes.warehouse.service.ReceivingDetailService;
|
import lombok.AllArgsConstructor;
|
import org.springframework.stereotype.Service;
|
import org.springframework.transaction.annotation.Transactional;
|
|
import java.math.BigDecimal;
|
import java.time.LocalDateTime;
|
import java.util.List;
|
|
/**
|
* 收货明细表
|
*
|
* @author cxf
|
* @date 2020-10-12 14:11:38
|
*/
|
@Service
|
@AllArgsConstructor
|
@Transactional(rollbackFor = Exception.class)
|
public class ReceivingDetailServiceImpl extends ServiceImpl<ReceivingDetailMapper, ReceivingDetail> implements ReceivingDetailService {
|
private final DeliveryDetailMapper deliveryDetailMapper;
|
|
@Override
|
public IPage<List<ReceivingDetailDTO>> getReceivingDetailPage(Page page, QueryWrapper<ReceivingDetailDTO> gen) {
|
return baseMapper.getReceivingDetailPage(page, gen);
|
}
|
|
@Override
|
public List<ReceivingDetailDTO> getReceivingDetail(QueryWrapper<ReceivingDetailDTO> gen) {
|
return baseMapper.getReceivingDetail(gen);
|
}
|
|
@Override
|
public ReceivingDetailDTO getReceivingDetailById(Long id) {
|
return baseMapper.getReceivingDetailById(id);
|
}
|
|
@Override
|
public boolean save(ReceivingDetail receivingDetail) {
|
receivingDetail.setReceiptTime(LocalDateTime.now());
|
checkDifference(receivingDetail);
|
return SqlHelper.retBool(baseMapper.insert(receivingDetail));
|
}
|
|
@Override
|
public boolean updateById(ReceivingDetail receivingDetail) {
|
receivingDetail.setReceiptTime(LocalDateTime.now());
|
ReceivingDetail receivingDetailOld = baseMapper.selectById(receivingDetail.getId());
|
// 1.根据老的明细数据量清除送货清单的接受数量
|
receivingDetailOld.setReceiveQty(receivingDetailOld.getReceiveQty().negate());
|
checkDifference(receivingDetailOld);
|
// 2.根据新的明细增加对应送货清单的接收数量
|
checkDifference(receivingDetail);
|
return SqlHelper.retBool(baseMapper.updateById(receivingDetail));
|
}
|
|
@Override
|
public boolean deleteById(Long id) {
|
ReceivingDetail receivingDetail = baseMapper.selectById(id);
|
receivingDetail.setReceiveQty(receivingDetail.getReceiveQty().negate());
|
checkDifference(receivingDetail);
|
return SqlHelper.retBool(baseMapper.deleteById(id));
|
}
|
|
/**
|
* 计算差异数据(可以上数据库锁)
|
*
|
* @param receivingDetail
|
*/
|
public synchronized void checkDifference(ReceivingDetail receivingDetail) {
|
DeliveryDetail deliveryDetail = deliveryDetailMapper.selectOne(Wrappers.<DeliveryDetail>query().lambda().eq(DeliveryDetail::getReceivingMainId, receivingDetail.getReceivingMainId())
|
.eq(DeliveryDetail::getPartId, receivingDetail.getPartId()));
|
if (deliveryDetail != null) {
|
// 1.存在
|
BigDecimal receiveQty = deliveryDetail.getReceiveQty() == null ? BigDecimal.ZERO : deliveryDetail.getReceiveQty();
|
deliveryDetail.setReceiveQty(receiveQty.add(receivingDetail.getReceiveQty()));
|
deliveryDetail.setDifferenceQty(deliveryDetail.getDeliveryQty().subtract(deliveryDetail.getReceiveQty()));
|
deliveryDetailMapper.updateById(deliveryDetail);
|
} else {
|
// 2.不存在
|
deliveryDetail = new DeliveryDetail();
|
deliveryDetail.setReceivingMainId(receivingDetail.getReceivingMainId());
|
deliveryDetail.setPartId(receivingDetail.getPartId());
|
deliveryDetail.setDeliveryQty(BigDecimal.ZERO);
|
deliveryDetail.setReceiveQty(receivingDetail.getReceiveQty());
|
deliveryDetail.setDifferenceQty(deliveryDetail.getDeliveryQty().subtract(deliveryDetail.getReceiveQty()));
|
deliveryDetailMapper.insert(deliveryDetail);
|
}
|
}
|
}
|