
package com.tmerclub.cloud.product.service;

import com.tmerclub.cloud.api.product.dto.StockBillLogItemDTO;
import com.tmerclub.cloud.common.database.dto.PageDTO;
import com.tmerclub.cloud.common.database.vo.PageVO;
import com.tmerclub.cloud.common.order.bo.RefundStockOperateBO;
import com.tmerclub.cloud.common.product.dto.SkuDTO;
import com.tmerclub.cloud.common.product.vo.StockBillLogVO;
import com.tmerclub.cloud.product.bo.mongo.MongoStockBillLogBO;
import com.tmerclub.cloud.product.bo.mongo.MongoStockBillLogItemBO;
import com.tmerclub.cloud.product.dto.StockBillLogDTO;
import com.tmerclub.cloud.product.model.StockBillLog;
import com.tmerclub.cloud.product.vo.StockBillLogExcelVO;
import com.tmerclub.cloud.product.vo.mongo.MongoStockBillLogVO;

import java.util.Date;
import java.util.List;

/**
 * 出入库明细
 *
 * @author lhd
 * @date 2022-06-22 16:57:26
 */
public interface StockBillLogService {

    /**
     * 分页获取出入库明细列表
     * @param pageDTO 分页参数
     * @param stockBillLogDtO
     * @return 出入库明细列表分页数据
     */
    PageVO<MongoStockBillLogBO> page(PageDTO pageDTO, StockBillLogDTO stockBillLogDtO);

    /**
     * 根据出入库明细id获取出入库明细
     *
     * @param stockBillLogId 出入库明细id
     * @return 出入库明细
     */
    MongoStockBillLogVO getByStockBillLogId(Long stockBillLogId);

    /**
     * 获取导出的出入库明细列表
     * @param stockBillLogDTO
     * @return
     */
    List<StockBillLogExcelVO> exportStockBillLogList(StockBillLogDTO stockBillLogDTO);

    /**
     * 保存出入库明细信息
     * @param stockBillLog
     */
    void saveInfo(StockBillLogVO stockBillLog);


    /**
     * 根据订单生成出入库明细
     * @param refundStockOperateBO
     * @return 需要修改的sku库存列表
     */
    void generateStockLogOfRefundOrderList(RefundStockOperateBO refundStockOperateBO);

    /**
     * 根据订单生成出入库明细
     * @param stockBillLogItems
     * @param stockBillType
     * @param stockType
     * @return 是否成功 失败代表是空列表或者已经添加成功了，不需要重复操作
     */
    void generateStockLogOfOrderList(List<StockBillLogItemDTO> stockBillLogItems);

    /**
     * 更新出入库明细信息
     * @param stockBillLogDTO
     */
    void updateInfo(StockBillLogDTO stockBillLogDTO);

    /**
     * 获取出入库订单号关联数量
     * @param orderId
     * @param value
     * @return
     */
    long countByOrderId(Long orderId, Integer value);

    /**
     * 作废出入库明细单
     * @param shopId
     * @param stockBillLogId
     */
    void voided(Long shopId, Long stockBillLogId);

    /**
     * 通过实物盘点创建库存变更日志
     * @param stockBillLog
     * @param skuDTOList
     */
    void generateStockLogOfTakeStock(StockBillLog stockBillLog, List<SkuDTO> skuDTOList);

    /**
     * 根据订单id列表和库存类型，删除sku库存记录
     * @param orderIds
     * @param stockBillType
     */
    void removeByOrderIds(List<Long> orderIds, Integer stockBillType);

    /**
     * 获取库存发生改变的商品id列表
     * @param beginTime
     * @param endTime
     * @return 商品id列表
     */
    List<Long> listSpuIdOfStockChange(Date beginTime, Date endTime);

    /**
     * 版本升级后，初始化出入库明细记录
     */
    void initStockBillLog();

    List<MongoStockBillLogItemBO> listLastSkuStock();
}
