package cn.iocoder.yudao.module.mes.api.itemreceipt; import cn.hutool.core.collection.CollUtil; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.mes.api.itemreceipt.dto.MesWmItemReceiptLineRespDTO; import cn.iocoder.yudao.module.mes.api.itemreceipt.dto.MesWmItemReceiptRespDTO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.itemreceipt.MesWmItemReceiptDO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.itemreceipt.MesWmItemReceiptLineDO; import cn.iocoder.yudao.module.mes.dal.mysql.wm.itemreceipt.MesWmItemReceiptLineMapper; import cn.iocoder.yudao.module.mes.dal.mysql.wm.itemreceipt.MesWmItemReceiptMapper; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; import java.math.BigDecimal; import java.util.List; import java.util.Map; import java.util.stream.Collectors; /** * MES 采购入库单 API 实现类 */ @Service public class MesWmItemReceiptApiImpl implements MesWmItemReceiptApi { @Resource private MesWmItemReceiptMapper itemReceiptMapper; @Resource private MesWmItemReceiptLineMapper itemReceiptLineMapper; @Override public List getItemReceiptListByPurchaseOrderId(Long purchaseOrderId) { if (purchaseOrderId == null) { return List.of(); } List receipts = itemReceiptMapper.selectListByPurchaseOrderId(purchaseOrderId); if (CollUtil.isEmpty(receipts)) { return List.of(); } Map> lineMap = itemReceiptLineMapper .selectListByReceiptIds(receipts.stream().map(MesWmItemReceiptDO::getId).toList()) .stream().collect(Collectors.groupingBy(MesWmItemReceiptLineDO::getReceiptId)); return receipts.stream() .map(receipt -> convert(receipt, lineMap.getOrDefault(receipt.getId(), List.of()))) .toList(); } @Override public MesWmItemReceiptRespDTO getItemReceipt(Long id) { MesWmItemReceiptDO receipt = itemReceiptMapper.selectById(id); if (receipt == null) { return null; } return convert(receipt, itemReceiptLineMapper.selectListByReceiptId(id)); } private MesWmItemReceiptRespDTO convert(MesWmItemReceiptDO receipt, List lines) { MesWmItemReceiptRespDTO resp = BeanUtils.toBean(receipt, MesWmItemReceiptRespDTO.class); List lineResps = BeanUtils.toBean(lines, MesWmItemReceiptLineRespDTO.class); resp.setLines(lineResps); resp.setTotalPrice(lineResps.stream() .map(line -> line.getTotalPrice() != null ? line.getTotalPrice() : calcLineAmount(line)) .filter(amount -> amount != null) .reduce(BigDecimal.ZERO, BigDecimal::add)); return resp; } private BigDecimal calcLineAmount(MesWmItemReceiptLineRespDTO line) { if (line.getPrice() == null || line.getReceivedQuantity() == null) { return null; } return line.getPrice().multiply(line.getReceivedQuantity()); } }