package com.zg.project.wisdom.mapper;

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

import com.zg.project.wisdom.domain.RkInfo;
import com.zg.project.wisdom.domain.RkRecord;
import com.zg.project.wisdom.domain.vo.StockStatisticVO;
import io.lettuce.core.dynamic.annotation.Param;

/**
 * 出入库记录Mapper接口
 * 
 * @author zg
 * @date 2026-01-20
 */
public interface RkRecordMapper 
{
    /**
     * 查询出入库记录
     * 
     * @param id 出入库记录主键
     * @return 出入库记录
     */
    public RkRecord selectRkRecordById(Long id);

    /**
     * 根据单据号查询出入库记录明细
     *
     * @param billNo 单据号
     * @return 出入库记录明细列表
     */
    List<RkRecord> selectRkRecordListByBillNo(String billNo);

    /**
     * 查询出入库记录列表
     * 
     * @param rkRecord 出入库记录
     * @return 出入库记录集合
     */
    public List<RkRecord> selectRkRecordList(RkRecord rkRecord);

    /**
     * 新增出入库记录
     * 
     * @param rkRecord 出入库记录
     * @return 结果
     */
    public int insertRkRecord(RkRecord rkRecord);

    /**
     * 修改出入库记录
     * 
     * @param rkRecord 出入库记录
     * @return 结果
     */
    public int updateRkRecord(RkRecord rkRecord);

    /**
     * 删除出入库记录
     * 
     * @param id 出入库记录主键
     * @return 结果
     */
    public int deleteRkRecordById(Long id);

    /**
     * 批量删除出入库记录
     * 
     * @param ids 需要删除的数据主键集合
     * @return 结果
     */
    int deleteRkRecordByIds(@Param("ids") Long[] ids);

    /**
     * 修改执行状态
     *
     * @param ids 出入库记录主键
     * @param execStatus 执行状态
     * @return 结果
     */

    int updateExecStatusByIds(@Param("ids") List<Long> ids,
                              @Param("execStatus") String execStatus);
    /**
     * 根据ID列表查询记录列表
     *
     * @param ids ID列表
     * @return 记录列表
     */
    List<RkRecord> selectRkRecordByIds(@Param("ids") List<Long> ids);

    /**
     * 根据单据ID更新记录
     *
     * @param rkInfo 单据信息
     */
    void updateByRkInfo(RkInfo rkInfo);

    /**
     * 根据单据号查询记录数量
     *
     * @param billNo 单据号
     * @return 记录数量
     */
    int countByBillNo(String billNo);

    /**
     * 根据单据号查询预入库记录数量
     *
     * @param billNo 单据号
     * @return 记录数量
     */
    int countPreByBillNo(@Param("billNo") String billNo);

    int countPreOutByBillNo(@Param("billNo") String billNo);

    /**
     * 根据单据ID查询记录
     *
     * @param rkInfoId 单据ID
     * @return 记录
     */
    RkRecord selectRkRecordByRkInfoId(@Param("rkInfoId") Long rkInfoId);

    /**
     * 入库统计
     */
    StockStatisticVO selectInRecordStatistic(RkRecord query);

    /**
     * 出库统计
     */
    StockStatisticVO selectOutRecordStatistic(RkRecord query);

    /**
     * 借出入库
     */
    int updateBorrowReturnRecordById(@Param("id") Long id,
                                     @Param("isBorrowed") String isBorrowed,
                                     @Param("returnTime") Date returnTime,
                                     @Param("updateBy") String updateBy,
                                     @Param("updateTime") Date updateTime);

    /**
     * 查询某个单据下仍为预入库状态的记录数量
     */
    int countPreInRecordByBillNo(@Param("billNo") String billNo);
}
