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 implements ReceivingDetailService { private final DeliveryDetailMapper deliveryDetailMapper; @Override public IPage> getReceivingDetailPage(Page page, QueryWrapper gen) { return baseMapper.getReceivingDetailPage(page, gen); } @Override public List getReceivingDetail(QueryWrapper 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.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); } } }