package com.sw.mes.store.api.interfaces.consumer;

import com.sw.mes.core.exception.BusinessException;
import com.sw.mes.store.dto.WarehouseAllotBillDto;
import com.sw.mes.store.entity.WarehouseAllotBill;
import com.sw.mes.store.entity.WarehouseInputBill;
import com.sw.mes.store.entity.WarehouseOutputBill;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;

/**
 * @Description 线边仓请求外部的接口，此接口所有方法必须要实现
 * @Author wupeng
 * @Date 2023/12/22 16:33
 **/
@Service
public interface WarehouseConsumerService {

    /**
     * 生成入库单号
     **/
    default String genInputBillNo() {
        throw new BusinessException("请实现【生成入库单号】接口，方法体为空则默认生成");
    }

    /**
     * 生成出库单号
     **/
    default String genOutputBillNo() {
        throw new BusinessException("请实现【生成出库单号】接口，方法体为空则默认生成");
    }

    /**
     * 线边仓审核入库后需要执行的补充业务逻辑
     **/
    default void afterAuditInput(WarehouseInputBill inputBill) {
        throw new BusinessException("请实现【线边仓审核入库后需要执行的特殊业务逻辑】接口，无则方法体为空即可");
    }

    /**
     * 线边仓自动入库后需要执行的补充业务逻辑
     **/
    @Async
    default void afterAutoInput(WarehouseInputBill inputBill) {
        throw new BusinessException("请实现【线边仓自动入库后需要执行的特殊业务逻辑】接口，无则方法体为空即可");
    }

    /**
     * 线边仓拒绝入库后需要执行的补充业务逻辑
     **/
    default void afterInputReject(WarehouseInputBill inputBill) {
        throw new BusinessException("请实现【线边仓拒绝入库后需要执行的特殊业务逻辑】接口，无则方法体为空即可");
    }

    /**
     * 线边仓取消入库后需要执行的补充业务逻辑
     **/
    default void afterInputCancel(WarehouseInputBill inputBill) {
        throw new BusinessException("请实现【线边仓拒取消入库后需要执行的特殊业务逻辑】接口，无则方法体为空即可");
    }

    /**
     * 线边仓审核出库后需要执行的补充业务逻辑
     **/
    default void afterAuditOutput(WarehouseOutputBill outputBill) {
        throw new BusinessException("请实现【线边仓审核出库后需要执行的特殊业务逻辑】接口，无则方法体为空即可");
    }

    /**
     * 线边仓自动出库后需要执行的补充业务逻辑
     **/
    default void afterAutoOutput(WarehouseOutputBill outputBill) {
        throw new BusinessException("请实现【线边仓自动出库后需要执行的特殊业务逻辑】接口，无则方法体为空即可");
    }

    /**
     * 线边仓拒绝出库后需要执行的补充业务逻辑
     **/
    default void afterOutputReject(WarehouseOutputBill outputBill) {
        throw new BusinessException("请实现【线边仓拒绝出库后需要执行的特殊业务逻辑】接口，无则方法体为空即可");
    }

    /**
     * 线边仓取消出库后需要执行的补充业务逻辑
     **/
    default void afterOutputCancel(WarehouseOutputBill outputBill) {
        throw new BusinessException("请实现【线边仓取消出库后需要执行的特殊业务逻辑】接口，无则方法体为空即可");
    }

    /**
     * 线边仓调拨审核之后需要执行的业务逻辑
     * @param warehouseAllotBillDto
     */
    @Async
    default void afterAuditAllot(WarehouseAllotBillDto warehouseAllotBillDto) {
        throw new BusinessException("请实现【线边仓调拨单审核后需要执行的特殊业务逻辑】接口，无则方法体为空即可");
    }
}
