| | |
| | | import cn.iocoder.yudao.module.mes.enums.wm.MesWmOutStatusEnum; |
| | | import cn.iocoder.yudao.module.mes.enums.wm.MesWmProductSalesStatusEnum; |
| | | import cn.iocoder.yudao.module.mes.service.md.autocode.MesMdAutoCodeRecordService; |
| | | import cn.iocoder.yudao.module.mes.service.md.client.MesMdClientService; |
| | | import cn.iocoder.yudao.module.crm.api.customer.CrmCustomerApi; |
| | | import cn.iocoder.yudao.module.erp.api.sale.ErpSaleOrderApi; |
| | | import cn.iocoder.yudao.module.erp.api.sale.dto.ErpSaleOrderItemRespDTO; |
| | | import cn.iocoder.yudao.module.erp.api.sale.dto.ErpSaleOrderRespDTO; |
| | |
| | | @Resource |
| | | private MesWmSalesNoticeLineService salesNoticeLineService; |
| | | @Resource |
| | | private MesMdClientService clientService; |
| | | private CrmCustomerApi customerApi; |
| | | |
| | | @Resource |
| | | private ErpSaleOrderApi saleOrderApi; |
| | |
| | | private MesWmSalesNoticeLineMapper salesNoticeLineMapper; |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public Long createSalesNotice(MesWmSalesNoticeSaveReqVO createReqVO) { |
| | | lockReferencedSaleOrder(createReqVO, null); |
| | | // 校验数据 |
| | | validateSalesNoticeSave(createReqVO); |
| | | |
| | |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void updateSalesNotice(MesWmSalesNoticeSaveReqVO updateReqVO) { |
| | | // 校验存在 + 草稿状态 |
| | | validateSalesNoticeExistsAndDraft(updateReqVO.getId()); |
| | | MesWmSalesNoticeDO existing = validateSalesNoticeExistsAndDraft(updateReqVO.getId()); |
| | | lockReferencedSaleOrder(updateReqVO, existing); |
| | | // 校验数据 |
| | | validateSalesNoticeSave(updateReqVO); |
| | | |
| | |
| | | |
| | | @Override |
| | | public PageResult<MesWmSalesNoticeDO> getSalesNoticePage(MesWmSalesNoticePageReqVO pageReqVO) { |
| | | return salesNoticeMapper.selectPage(pageReqVO); |
| | | return salesNoticeMapper.selectPage(pageReqVO, (List<Long>) null); |
| | | } |
| | | |
| | | @Override |
| | |
| | | validateNoticeCodeUnique(saveReqVO.getId(), saveReqVO.getCode()); |
| | | // 校验客户存在 |
| | | if (saveReqVO.getClientId() != null) { |
| | | clientService.validateClientExistsAndEnable(saveReqVO.getClientId()); |
| | | customerApi.validateCustomer(saveReqVO.getClientId()); |
| | | } |
| | | } |
| | | |
| | | /** 与订单作废使用同一订单行锁;支持历史请求仅传订单号。 */ |
| | | private void lockReferencedSaleOrder(MesWmSalesNoticeSaveReqVO request, MesWmSalesNoticeDO existing) { |
| | | Long orderId = request.getSaleOrderId(); |
| | | String orderNo = request.getSaleOrderCode(); |
| | | if (orderId == null && (orderNo == null || orderNo.isBlank()) && existing != null) { |
| | | orderId = existing.getSaleOrderId(); |
| | | orderNo = existing.getSaleOrderCode(); |
| | | } |
| | | if (orderId == null && (orderNo == null || orderNo.isBlank())) return; |
| | | ErpSaleOrderRespDTO order = saleOrderApi.lockSaleOrderForNotice(orderId, orderNo).getCheckedData(); |
| | | if (order == null) throw exception(WM_SALES_NOTICE_SALE_ORDER_NOT_EXISTS); |
| | | request.setSaleOrderId(order.getId()); |
| | | request.setSaleOrderCode(order.getNo()); |
| | | } |
| | | |
| | | private void validateNoticeCodeUnique(Long id, String code) { |
| | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public Long generateSalesNoticeFromSaleOrder(Long saleOrderId) { |
| | | // 先锁定订单,再检查通知;与订单作废串行执行。 |
| | | ErpSaleOrderRespDTO saleOrder = saleOrderApi.lockSaleOrderForNotice(saleOrderId, null).getCheckedData(); |
| | | if (saleOrder == null) throw exception(WM_SALES_NOTICE_SALE_ORDER_NOT_EXISTS); |
| | | // 1. 校验是否已生成过发货通知单(防止重复生成) |
| | | MesWmSalesNoticeDO existNotice = salesNoticeMapper.selectBySaleOrderId(saleOrderId); |
| | | if (existNotice != null) { |
| | | throw exception(WM_SALES_NOTICE_ALREADY_EXISTS); |
| | | } |
| | | |
| | | // 2. 获取销售订单信息 |
| | | ErpSaleOrderRespDTO saleOrder = saleOrderApi.getSaleOrder(saleOrderId).getCheckedData(); |
| | | if (saleOrder == null) { |
| | | throw exception(WM_SALES_NOTICE_SALE_ORDER_NOT_EXISTS); |
| | | } |
| | | |
| | | // 3. 获取销售订单明细 |