package com.zg.project.wisdom.service;

import java.util.List;

import com.zg.project.Inventory.domain.dto.QueryDTO;
import com.zg.project.Inventory.domain.vo.ChartDataVO;
import com.zg.project.wisdom.domain.RkInfo;
import com.zg.project.wisdom.domain.dto.*;
import com.zg.project.wisdom.domain.vo.PcodeQtyVO;

/**
 * 库存单据主Service接口
 * 
 * @author zg
 * @date 2025-05-28
 */
public interface IRkInfoService 
{
    /**
     * 查询库存单据主
     * 
     * @param id 库存单据主主键
     * @return 库存单据主
     */
    public RkInfo selectRkInfoById(Long id);

    /**
     * 查询库存单据主列表
     *
     * @param rkInfo 库存单据主
     * @return 库存单据主集合
     */
    public List<RkInfo> selectRkInfoList(RkInfo rkInfo);

    /**
     * 按 bill_no 分组返回单据列表（复用 selectRkInfoVo，SQL 外层分组聚合）
     * @param query 与 /list 相同的查询条件
     */
    List<RkInfo> selectGroupedByBill(RkInfoQueryDTO query);

    /**
     * 修改库存单据主
     * 
     * @param rkInfo 库存单据主
     * @return 结果
     */
    public int updateRkInfo(RkInfo rkInfo);

    /**
     * 批量删除库存单据主
     * 
     * @param ids 需要删除的库存单据主主键集合
     * @return 结果
     */
    public int deleteRkInfoByIds(Long[] ids);

    /**
     * 删除库存单据主信息
     * 
     * @param
     * @return 结果
     */
    int deleteRkInfoById(RkCancelDTO dto);

    /**
     * 批量新增入库记录
     * @param dto 入库数据
     * @return RkSubmitResultVO 提交结果
     */
    void batchInsert(PcRkInfoBatchDTO dto);

    /**
     * APP新增入库单据
     * @param dto
     * @return
     */
    int batchInsertApp(RkInfoBatchDTO dto);

    /**
     * 根据单据编号删除入库单据
     * @param billNo
     */
    void deleteByBillNo(String billNo);

    /**
     * 统计逾期库存数量
     * @return
     */
    int countOverdueStock();

    /**
     * 获取最新20条逾期库存列表
     * @param i
     * @return
     */
    List<RkInfo> selectTopOverdueStock(int i);

    /**
     * 批量出库
     * @param dto
     * @return
     */
    int batchOutStock(StockOutDTO dto);

    /**
     * 撤销出库
     * @param
     */
    int deleteByCkBillNo(String billNoCk);

    /**
     * 盘点开始匹配
     * @param dto
     * @return
     */
    void matchWithStatus(QueryDTO dto);

    /**
     * 统计指定仓库的库存数量
     * @param warehouse
     * @return
     */
    int countGetByWh(String warehouse);

    /**
     * 图表统计：每个库位有多少个货物
     * @param dto
     * @return
     */
    ChartDataVO matchWithAll(QueryDTO dto);

    /**
     * 还料入库
     * @param dto
     * @return
     */
    int refundMaterial(RefundRequestDTO dto);

    /**
     * 撤销出库
     * @param id
     */
    void cancelOutStockById(Long id);

    /**
     * 根据ids恢复出库或入库
     * @param ids
     */
    void revertByIds(Long[] ids);

    /**
     * 按库位查询货物数量
     * @param pcode
     * @return
     */
    List<RkInfo> listRkInfoByPcode(String pcode);

    /**
     * 获取需要配送的出库列表
     * @param query
     * @return
     */
    List<RkInfo> selectDeliveryAll(RkInfo query);
}
