| | |
| | | |
| | | import cn.hutool.core.util.ObjUtil; |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.module.aftersales.api.AfterSaleTicketApi; |
| | | import cn.iocoder.yudao.module.aftersales.api.dto.AfterSaleWarehouseReturnStageReqDTO; |
| | | import cn.iocoder.yudao.module.aftersales.api.dto.AfterSaleWarehouseReturnCreateReqDTO; |
| | | import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; |
| | |
| | | import java.util.Collections; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | import java.util.Objects; |
| | | |
| | | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| | | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; |
| | |
| | | private MesMdmItemService mdmItemService; |
| | | @Resource |
| | | private MesWmTransactionService wmTransactionService; |
| | | @Resource |
| | | private AfterSaleTicketApi afterSaleTicketApi; |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | |
| | | MesWmReturnSalesDO returnSales = BeanUtils.toBean(createReqVO, MesWmReturnSalesDO.class); |
| | | returnSales.setStatus(MesWmReturnSalesStatusEnum.PREPARE.getStatus()); |
| | | returnSalesMapper.insert(returnSales); |
| | | |
| | | // 3. 同步关联售后工单:仓储退货留痕 + 工单进入待退货 |
| | | AfterSaleWarehouseReturnCreateReqDTO returnReqDTO = new AfterSaleWarehouseReturnCreateReqDTO(); |
| | | returnReqDTO.setSaleOrderId(createReqVO.getSaleOrderId()); |
| | | returnReqDTO.setReturnSalesId(returnSales.getId()); |
| | | returnReqDTO.setReturnSalesCode(createReqVO.getCode()); |
| | | returnReqDTO.setReturnReason(createReqVO.getReturnReason()); |
| | | afterSaleTicketApi.onWarehouseReturnCreated(returnReqDTO); |
| | | |
| | | return returnSales.getId(); |
| | | } |
| | | |
| | |
| | | |
| | | @Override |
| | | public PageResult<MesWmReturnSalesDO> getReturnSalesPage(MesWmReturnSalesPageReqVO pageReqVO) { |
| | | List<Long> permittedClientIds = customerApi.getPermittedCustomerIds(); |
| | | return returnSalesMapper.selectPage(pageReqVO, permittedClientIds); |
| | | return returnSalesMapper.selectPage(pageReqVO, (List<Long>) null); |
| | | } |
| | | |
| | | @Override |
| | |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void stockReturnSales(Long id) { |
| | | // 1.1 校验存在 + 待上架状态 |
| | | MesWmReturnSalesDO returnSales = validateReturnSalesExists(id); |
| | | MesWmReturnSalesDO returnSales = returnSalesMapper.selectByIdForUpdate(id); |
| | | if (returnSales == null) throw exception(WM_RETURN_SALES_NOT_EXISTS); |
| | | if (ObjUtil.notEqual(MesWmReturnSalesStatusEnum.APPROVED.getStatus(), returnSales.getStatus())) { |
| | | throw exception(WM_RETURN_SALES_STATUS_NOT_APPROVED); |
| | | } |
| | | // 1.2 检查每个行的明细数量是否完成上架 |
| | | List<MesWmReturnSalesLineDO> lines = returnSalesLineService.getReturnSalesLineListByReturnId(id); |
| | | if (CollUtil.isEmpty(lines)) { |
| | | throw exception(WM_RETURN_SALES_NO_LINE); |
| | | } |
| | | if (CollUtil.isNotEmpty(lines)) { |
| | | // 批量查询所有明细 |
| | | List<MesWmReturnSalesDetailDO> allDetails = returnSalesDetailService.getReturnSalesDetailListByReturnId(id); |
| | |
| | | allDetails, MesWmReturnSalesDetailDO::getLineId); |
| | | // 检查每行的明细数量 |
| | | for (MesWmReturnSalesLineDO line : lines) { |
| | | if (line.getNcrDispositionId() != null && Objects.equals(line.getQualityStatus(), MesWmQualityStatusEnum.FAIL.getStatus())) { |
| | | if (!detailMap.getOrDefault(line.getId(), Collections.emptyList()).isEmpty()) { |
| | | throw exception(WM_RETURN_SALES_LINE_NOT_QUALIFIED); |
| | | } |
| | | continue; // 不合格数量由 NCR 独立处理,不在原退货单再次入库 |
| | | } |
| | | if (ObjUtil.notEqual(line.getQualityStatus(), MesWmQualityStatusEnum.PASS.getStatus())) { |
| | | throw exception(WM_RETURN_SALES_LINE_NOT_QUALIFIED); |
| | | } |
| | | List<MesWmReturnSalesDetailDO> details = detailMap.getOrDefault(line.getId(), Collections.emptyList()); |
| | | BigDecimal totalDetailQuantity = CollectionUtils.getSumValue(details, |
| | | MesWmReturnSalesDetailDO::getQuantity, BigDecimal::add, BigDecimal.ZERO); |
| | | // 对比行数量与明细总数量,不满足直接抛出 |
| | | if (line.getQuantity().compareTo(totalDetailQuantity) > 0) { |
| | | if (line.getQuantity() == null || line.getQuantity().compareTo(totalDetailQuantity) != 0) { |
| | | MesMdmItemDO item = mdmItemService.validateItemExistsAndEnable(line.getItemId()); |
| | | throw exception(WM_RETURN_SALES_DETAIL_QUANTITY_MISMATCH, |
| | | item.getCode() + " " + item.getName() + " 未完成上架"); |
| | |
| | | // 3. 更新退货单状态 |
| | | returnSalesMapper.updateById(new MesWmReturnSalesDO() |
| | | .setId(id).setStatus(MesWmReturnSalesStatusEnum.FINISHED.getStatus())); |
| | | if (returnSales.getSaleOrderId() != null) { |
| | | afterSaleTicketApi.onWarehouseReturnInboundFinished(new AfterSaleWarehouseReturnStageReqDTO() |
| | | .setSaleOrderId(returnSales.getSaleOrderId()) |
| | | .setReturnSalesId(returnSales.getId()) |
| | | .setReturnSalesCode(returnSales.getCode())); |
| | | } |
| | | } |
| | | |
| | | private void createTransactionList(MesWmReturnSalesDO returnSales) { |
| | |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void cancelReturnSales(Long id) { |
| | | // 校验存在 |
| | | MesWmReturnSalesDO returnSales = validateReturnSalesExists(id); |
| | | MesWmReturnSalesDO returnSales = returnSalesMapper.selectByIdForUpdate(id); |
| | | if (returnSales == null) throw exception(WM_RETURN_SALES_NOT_EXISTS); |
| | | // 已完成和已取消不允许取消 |
| | | if (ObjectUtils.equalsAny(returnSales.getStatus(), |
| | | MesWmReturnSalesStatusEnum.FINISHED.getStatus(), |
| | |
| | | public Boolean checkReturnSalesQuantity(Long id) { |
| | | List<MesWmReturnSalesLineDO> lines = returnSalesLineService.getReturnSalesLineListByReturnId(id); |
| | | for (MesWmReturnSalesLineDO line : lines) { |
| | | if (line.getNcrDispositionId() != null && Objects.equals(line.getQualityStatus(), MesWmQualityStatusEnum.FAIL.getStatus())) { |
| | | continue; |
| | | } |
| | | List<MesWmReturnSalesDetailDO> details = returnSalesDetailService.getReturnSalesDetailListByLineId(line.getId()); |
| | | BigDecimal totalDetailQty = CollectionUtils.getSumValue(details, |
| | | MesWmReturnSalesDetailDO::getQuantity, BigDecimal::add, BigDecimal.ZERO); |