| | |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.arrivalnotice.MesWmArrivalNoticeLineDO; |
| | | import cn.iocoder.yudao.module.mes.dal.mysql.wm.arrivalnotice.MesWmArrivalNoticeMapper; |
| | | import cn.iocoder.yudao.module.mes.enums.wm.MesWmArrivalNoticeStatusEnum; |
| | | import cn.iocoder.yudao.module.erp.api.purchase.ErpPurchaseOrderApi; |
| | | import cn.iocoder.yudao.module.erp.api.purchase.dto.ErpPurchaseOrderRespDTO; |
| | | import cn.iocoder.yudao.module.erp.api.purchase.dto.ErpPurchaseOrderItemRespDTO; |
| | | import cn.iocoder.yudao.module.mes.service.mdm.MesMdmItemService; |
| | | import jakarta.annotation.Resource; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.stereotype.Service; |
| | |
| | | @Resource |
| | | private cn.iocoder.yudao.module.mes.service.md.vendor.MesMdVendorService vendorService; |
| | | |
| | | @Resource |
| | | private ErpPurchaseOrderApi purchaseOrderApi; |
| | | |
| | | @Resource |
| | | private MesMdmItemService mdmItemService; |
| | | |
| | | @Override |
| | | public Long createArrivalNotice(MesWmArrivalNoticeSaveReqVO createReqVO) { |
| | | // 校验数据 |
| | |
| | | validateCodeUnique(reqVO.getId(), reqVO.getCode()); |
| | | // 校验供应商存在且启用 |
| | | vendorService.validateVendorExistsAndEnable(reqVO.getVendorId()); |
| | | // 校验采购订单存在 |
| | | if (reqVO.getPurchaseOrderId() != null) { |
| | | ErpPurchaseOrderRespDTO purchaseOrder = purchaseOrderApi.getPurchaseOrder(reqVO.getPurchaseOrderId()).getCheckedData(); |
| | | if (purchaseOrder == null) { |
| | | throw exception(WM_PURCHASE_ORDER_NOT_EXISTS); |
| | | } |
| | | } |
| | | } |
| | | |
| | | @Override |
| | |
| | | return arrivalNoticeMapper.selectCountByVendorId(vendorId); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public Long generateArrivalNoticeFromPurchaseOrder(Long purchaseOrderId) { |
| | | // 1. 获取采购订单 |
| | | ErpPurchaseOrderRespDTO purchaseOrder = purchaseOrderApi.getPurchaseOrder(purchaseOrderId).getCheckedData(); |
| | | if (purchaseOrder == null) { |
| | | throw exception(WM_PURCHASE_ORDER_NOT_EXISTS); |
| | | } |
| | | |
| | | // 2. 获取采购订单明细 |
| | | List<ErpPurchaseOrderItemRespDTO> items = purchaseOrderApi.getPurchaseOrderItemList(purchaseOrderId).getCheckedData(); |
| | | if (CollUtil.isEmpty(items)) { |
| | | throw exception(WM_PURCHASE_ORDER_NO_ITEM); |
| | | } |
| | | |
| | | // 3. 生成到货通知单编码(使用编码规则服务) |
| | | String code = generateArrivalNoticeCode(); |
| | | |
| | | // 4. 创建到货通知单主表 |
| | | MesWmArrivalNoticeDO notice = new MesWmArrivalNoticeDO(); |
| | | notice.setCode(code); |
| | | notice.setName(purchaseOrder.getNo() + "到货通知"); |
| | | notice.setPurchaseOrderId(purchaseOrderId); |
| | | notice.setPurchaseOrderCode(purchaseOrder.getNo()); |
| | | notice.setVendorId(purchaseOrder.getSupplierId()); |
| | | notice.setStatus(MesWmArrivalNoticeStatusEnum.PREPARE.getStatus()); |
| | | arrivalNoticeMapper.insert(notice); |
| | | |
| | | // 5. 遍历明细创建到货通知单行 |
| | | for (ErpPurchaseOrderItemRespDTO item : items) { |
| | | MesWmArrivalNoticeLineDO line = new MesWmArrivalNoticeLineDO(); |
| | | line.setNoticeId(notice.getId()); |
| | | line.setPurchaseOrderItemId(item.getId()); |
| | | // 注意:这里需要根据 ERP 产品 ID 映射到 MES 物料 ID |
| | | // 实际项目中需要通过映射服务处理,这里暂时留空让用户手动选择 |
| | | line.setArrivalQuantity(item.getCount() != null ? item.getCount().subtract(item.getInCount() != null ? item.getInCount() : BigDecimal.ZERO) : BigDecimal.ZERO); |
| | | line.setIqcCheckFlag(false); // 默认不需要检验,用户可修改 |
| | | arrivalNoticeLineService.createArrivalNoticeLineFromPurchaseOrderItem(line); |
| | | } |
| | | |
| | | return notice.getId(); |
| | | } |
| | | |
| | | /** |
| | | * 生成到货通知单编码 |
| | | */ |
| | | private String generateArrivalNoticeCode() { |
| | | // TODO: 使用编码规则服务生成编码 |
| | | return "AN" + System.currentTimeMillis(); |
| | | } |
| | | |
| | | } |