xiaoyi
2 天以前 14c80fbd16a51a355138345ecf69df9ca37746bf
yudao-module-aftersales/src/main/java/cn/iocoder/yudao/module/aftersales/service/returnobj/AfterSaleReturnServiceImpl.java
@@ -20,6 +20,8 @@
import cn.iocoder.yudao.module.aftersales.service.permission.bo.AfterSalePermissionCreateReqBO;
import cn.iocoder.yudao.module.mes.api.returnsales.MesWmReturnSalesApi;
import cn.iocoder.yudao.module.mes.api.returnsales.dto.MesWmReturnSalesCreateReqDTO;
import cn.iocoder.yudao.module.mes.api.returnsales.dto.MesWmReturnSalesLineCreateDTO;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@@ -33,6 +35,7 @@
import java.util.List;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.invalidParamException;
import static cn.iocoder.yudao.module.aftersales.enums.ErrorCodeConstants.*;
/**
@@ -62,6 +65,8 @@
    @Override
    @Transactional(rollbackFor = Exception.class)
    public Long createReturn(AfterSaleReturnSaveReqVO createReqVO, Long userId) {
        if (Integer.valueOf(3).equals(createReqVO.getReturnType()))
            throw invalidParamException("仅退款流程尚未接入财务审核,暂不能创建退货申请");
        // 1. 校验工单存在
        AfterSaleTicketDO ticket = ticketMapper.selectById(createReqVO.getTicketId());
        if (ticket == null) {
@@ -122,6 +127,18 @@
        if (!AfterSaleReturnStatusEnum.DRAFT.getStatus().equals(returnDO.getStatus())) {
            throw exception(RETURN_APPROVE_FAIL);
        }
        if (Integer.valueOf(3).equals(returnDO.getReturnType()))
            throw invalidParamException("仅退款流程尚未接入财务审核,暂不能同步为实物退货单");
        List<AfterSaleReturnItemDO> items = returnItemMapper.selectListByReturnId(id);
        if (CollUtil.isEmpty(items) || items.stream().anyMatch(item -> item.getItemId() == null
                || item.getReturnQuantity() == null || item.getReturnQuantity().signum() <= 0))
            throw invalidParamException("请先填写有效的退货物料及数量");
        // 在事务中抢占草稿状态,避免并发审核重复生成退货单。
        if (returnMapper.update(null, new LambdaUpdateWrapper<AfterSaleReturnDO>()
                .eq(AfterSaleReturnDO::getId, id)
                .eq(AfterSaleReturnDO::getStatus, AfterSaleReturnStatusEnum.DRAFT.getStatus())
                .set(AfterSaleReturnDO::getStatus, AfterSaleReturnStatusEnum.AUDITING.getStatus())) != 1)
            throw exception(RETURN_APPROVE_FAIL);
        // 2. 获取关联工单(用于获取销售订单号等冗余信息)
        AfterSaleTicketDO ticket = ticketMapper.selectById(returnDO.getTicketId());
@@ -138,13 +155,22 @@
        mesReqDTO.setRemark("售后工单退货 - 工单号: " + (ticket != null ? ticket.getNo() : ""));
        mesReqDTO.setAfterSaleReturnId(returnDO.getId());
        Long mesReturnId = mesWmReturnSalesApi.createReturnSales(mesReqDTO);
        if (mesReturnId == null) throw invalidParamException("MES 退货单创建失败");
        for (AfterSaleReturnItemDO item : items) {
            var line = new MesWmReturnSalesLineCreateDTO();
            line.setReturnId(mesReturnId); line.setItemId(item.getItemId()); line.setQuantity(item.getReturnQuantity());
            line.setBatchId(item.getBatchId()); line.setBatchCode(item.getBatchCode()); line.setRemark(item.getRemark());
            Long lineId = mesWmReturnSalesApi.createReturnSalesLine(line);
            if (lineId == null || returnItemMapper.updateById(new AfterSaleReturnItemDO().setId(item.getId()).setMesReturnLineId(lineId)) != 1)
                throw invalidParamException("MES 退货明细同步失败");
        }
        // 4. 更新退货申请状态
        returnMapper.updateById(new AfterSaleReturnDO().setId(id)
        if (returnMapper.updateById(new AfterSaleReturnDO().setId(id)
                .setStatus(AfterSaleReturnStatusEnum.APPROVED.getStatus())
                .setMesReturnId(mesReturnId)
                .setMesReturnCode(returnDO.getNo())
                .setAuditTime(LocalDateTime.now()));
                .setAuditTime(LocalDateTime.now())) != 1) throw invalidParamException("更新退货申请失败");
    }
    @Override