package cn.iocoder.yudao.module.flow.service.outbound;

import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.flow.controller.admin.outbound.vo.*;
import cn.iocoder.yudao.module.flow.dal.dataobject.outbound.OutboundDO;

import javax.validation.Valid;
import java.util.Collection;
import java.util.List;
import java.util.Map;

/**
 * 出库单 Service 接口
 *
 * @author 芋道源码
 */
public interface OutboundService {

    /**
     * 创建出库单
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createOutbound(@Valid OutboundCreateReqVO createReqVO);

    /**
     * 更新出库单
     *
     * @param updateReqVO 更新信息
     */
    void updateOutbound(@Valid OutboundUpdateReqVO updateReqVO);

    /**
     * 删除出库单
     *
     * @param id 编号
     */
    void deleteOutbound(Long id);

    /**
     * 获得出库单
     *
     * @param id 编号
     * @return 出库单
     */
    OutboundRespVO getOutbound(Long id);

    /**
     * 获得出库单列表
     *
     * @param ids 编号
     * @return 出库单列表
     */
    List<OutboundDO> getOutboundList(Collection<Long> ids);

    /**
     * 获得出库单分页
     *
     * @param pageReqVO 分页查询
     * @return 出库单分页
     */
    PageResult<OutboundDO> getOutboundPage(OutboundPageReqVO pageReqVO);

    /**
     * 根据id获取主表和子表的信息
     *
     * @param
     * @return
     */
    public Map<String, Object> getOutboundGoodsInfoById(Long id);

    /**
     * 根据单号查询主单,再根据主单查询子单
     *
     * @param outBoundId
     * @return
     */
    public OutboundDTO getOutboundGoodsInfoOutBoundId(String outBoundId);

    /**
     * 上链
     * @param id id
     */
    void upChain(Long id);

    /**
     * 更新链状态
     * @param id id
     * @param state 状态
     */
    void updateChainStatus(Long id, Integer state);


    /**
     * 获得首页出库的统计数据
     * @return 出库数据
     */
    OutboundInfoDataRespVO getOutboundInfoDataStatistics();
}
