| | |
| | | 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); |
| | | |
| | |
| | | } |
| | | } |
| | | |
| | | /** 与订单作废使用同一订单行锁;支持历史请求仅传订单号。 */ |
| | | 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) { |
| | | MesWmSalesNoticeDO notice = salesNoticeMapper.selectByCode(code); |
| | | if (notice == null) { |
| | |
| | | @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. 获取销售订单明细 |