package cn.iocoder.yudao.module.mes.service.qc.ncr;
|
|
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
|
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.arrivalnotice.MesWmArrivalNoticeDO;
|
import cn.iocoder.yudao.module.mes.dal.mysql.qc.ncr.MesQcPurchaseReturnMapper;
|
import cn.iocoder.yudao.module.mes.dal.mysql.qc.ncr.MesQcPurchaseConcessionMapper;
|
import cn.iocoder.yudao.module.mes.dal.mysql.wm.arrivalnotice.MesWmArrivalNoticeLineMapper;
|
import cn.iocoder.yudao.module.mes.dal.mysql.wm.arrivalnotice.MesWmArrivalNoticeMapper;
|
import cn.iocoder.yudao.module.mes.enums.qc.MesQcCheckResultEnum;
|
import cn.iocoder.yudao.module.mes.enums.wm.MesWmArrivalNoticeStatusEnum;
|
import jakarta.annotation.Resource;
|
import org.springframework.stereotype.Service;
|
import org.springframework.transaction.annotation.Transactional;
|
import java.math.BigDecimal;
|
import java.util.Objects;
|
|
/** 依据各行原始质检结论和真实退货确认重新计算到货单状态。 */
|
@Service
|
public class MesQcArrivalDispositionService {
|
@Resource private MesWmArrivalNoticeMapper arrivalNoticeMapper;
|
@Resource private MesWmArrivalNoticeLineMapper lineMapper;
|
@Resource private MesQcPurchaseReturnMapper returnMapper;
|
@Resource private MesQcPurchaseConcessionMapper concessionMapper;
|
|
@Transactional(rollbackFor = Exception.class)
|
public void refresh(Long noticeId) {
|
var notice = arrivalNoticeMapper.selectOne(new LambdaQueryWrapperX<MesWmArrivalNoticeDO>()
|
.eq(MesWmArrivalNoticeDO::getId, noticeId).last("FOR UPDATE"));
|
if (notice == null || !Objects.equals(notice.getStatus(), MesWmArrivalNoticeStatusEnum.PENDING_QC.getStatus())) return;
|
var lines = lineMapper.selectListByNoticeId(noticeId);
|
if (lines.isEmpty()) return;
|
boolean hasReceiptQuantity = false;
|
for (var line : lines) {
|
if (Boolean.TRUE.equals(line.getIqcCheckFlag())) {
|
if (line.getIqcId() == null || line.getIqcCheckResult() == null || line.getQualifiedQuantity() == null) return;
|
if (!MesQcCheckResultEnum.canInbound(line.getIqcCheckResult())) {
|
var returned = returnMapper.selectConfirmedByIqcId(line.getIqcId());
|
var concession = concessionMapper.selectByIqcId(line.getIqcId());
|
boolean returnDone = returned != null && Objects.equals(returned.getNoticeLineId(), line.getId());
|
boolean concessionDone = concession != null && Objects.equals(concession.getNoticeLineId(), line.getId());
|
if (!returnDone && !concessionDone) return;
|
}
|
}
|
BigDecimal quantity = line.getQualifiedQuantity() != null ? line.getQualifiedQuantity() : line.getArrivalQuantity();
|
if (quantity == null || quantity.signum() < 0) return;
|
if (quantity.signum() > 0) hasReceiptQuantity = true;
|
}
|
arrivalNoticeMapper.updateById(new MesWmArrivalNoticeDO().setId(noticeId)
|
.setStatus(hasReceiptQuantity ? MesWmArrivalNoticeStatusEnum.PENDING_RECEIPT.getStatus()
|
: MesWmArrivalNoticeStatusEnum.FINISHED.getStatus()));
|
}
|
}
|