package cn.iocoder.yudao.module.system.dal.mysql.biz;

import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.system.controller.admin.biz.vo.MedicineInventoryListReqVO;
import cn.iocoder.yudao.module.system.controller.admin.biz.vo.MedicineInventoryPageReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.biz.MedicineInventoryDO;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;

/**
 * 药品库存数量表 Mapper
 *
 * @author 系统管理员
 */
@Mapper
public interface MedicineInventoryMapper extends BaseMapperX<MedicineInventoryDO> {

    /**
     * 根据药品标识码查询库存信息
     *
     * @param barcode 药品标识码
     * @return 库存信息
     */
    default MedicineInventoryDO selectByBarcode(String barcode) {
        return selectOne(new LambdaQueryWrapperX<MedicineInventoryDO>()
                .eqIfPresent(MedicineInventoryDO::getBarcode, barcode));
    }

    /**
     * 根据批次号查询库存信息
     *
     * @param batchNumber 批次号
     * @return 库存信息列表
     */
    default List<MedicineInventoryDO> selectListByBatchNumber(String batchNumber) {
        return selectList(new LambdaQueryWrapperX<MedicineInventoryDO>()
                .eqIfPresent(MedicineInventoryDO::getBatchNumber, batchNumber)
                .orderByDesc(MedicineInventoryDO::getCreatedAt));
    }

    /**
     * 根据库存状态查询库存信息
     *
     * @param inventoryStatus 库存状态：1-正常 2-近效期 3-短缺 4-积压 5-过期 6-停用
     * @return 库存信息列表
     */
    default List<MedicineInventoryDO> selectListByInventoryStatus(Integer inventoryStatus) {
        return selectList(new LambdaQueryWrapperX<MedicineInventoryDO>()
                .eqIfPresent(MedicineInventoryDO::getInventoryStatus, inventoryStatus)
                .orderByDesc(MedicineInventoryDO::getCreatedAt));
    }

    /**
     * 根据机构ID查询库存信息
     *
     * @param tenantId 机构ID
     * @return 库存信息列表
     */
    default List<MedicineInventoryDO> selectListByTenantId(Long tenantId) {
        return selectList(new LambdaQueryWrapperX<MedicineInventoryDO>()
                .eqIfPresent(MedicineInventoryDO::getTenantId, tenantId)
                .orderByDesc(MedicineInventoryDO::getCreatedAt));
    }

    /**
     * 根据药品名称模糊查询库存信息
     *
     * @param drugName 药品名称
     * @return 库存信息列表
     */
    default List<MedicineInventoryDO> selectListByDrugName(String drugName) {
        return selectList(new LambdaQueryWrapperX<MedicineInventoryDO>()
                .likeIfPresent(MedicineInventoryDO::getDrugName, drugName)
                .orderByDesc(MedicineInventoryDO::getCreatedAt));
    }

    /**
     * 分页查询库存信息
     *
     * @param reqVO 分页查询条件
     * @return 分页结果
     */
    default PageResult<MedicineInventoryDO> selectPage(MedicineInventoryPageReqVO reqVO) {
        return selectPage(reqVO, new LambdaQueryWrapperX<MedicineInventoryDO>()
                .eq(MedicineInventoryDO::getTenantId, reqVO.getTenantId())
                .eqIfPresent(MedicineInventoryDO::getBarcode, reqVO.getBarcode())
                .likeIfPresent(MedicineInventoryDO::getDrugName, reqVO.getDrugName())
                .eqIfPresent(MedicineInventoryDO::getBatchNumber, reqVO.getBatchNumber())
                .eqIfPresent(MedicineInventoryDO::getInventoryStatus, reqVO.getInventoryStatus())
                .eqIfPresent(MedicineInventoryDO::getType, reqVO.getType())
                .orderByDesc(MedicineInventoryDO::getCreatedAt));
    }

    /**
     * 不分页条件查询库存信息
     *
     * @param reqVO 查询条件
     * @return 列表结果
     */
    default List<MedicineInventoryDO> selectList(MedicineInventoryListReqVO reqVO) {
        return selectList(new LambdaQueryWrapperX<MedicineInventoryDO>()
                .eq(MedicineInventoryDO::getTenantId, reqVO.getTenantId())
                .eqIfPresent(MedicineInventoryDO::getBarcode, reqVO.getBarcode())
                .likeIfPresent(MedicineInventoryDO::getDrugName, reqVO.getDrugName())
                .eqIfPresent(MedicineInventoryDO::getBatchNumber, reqVO.getBatchNumber())
                .eqIfPresent(MedicineInventoryDO::getInventoryStatus, reqVO.getInventoryStatus())
                .eqIfPresent(MedicineInventoryDO::getType, reqVO.getType())
                .orderByDesc(MedicineInventoryDO::getCreatedAt));
    }
}



