package cn.iocoder.yudao.module.system.service.biz;

import com.alibaba.fastjson.JSONArray;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
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 java.util.List;

/**
 * 药品库存数量表 Service 接口
 *
 * @author 系统管理员
 */
public interface MedicineInventoryService {

    /**
     * 创建库存记录
     *
     * @param inventory 库存记录
     * @return 记录ID
     */
    Long createInventory(MedicineInventoryDO inventory);

    /**
     * 更新库存记录
     *
     * @param inventory 库存记录
     */
    void updateInventory(MedicineInventoryDO inventory);

    /**
     * 根据ID查询库存记录
     *
     * @param id 记录ID
     * @return 库存记录
     */
    MedicineInventoryDO getInventory(Long id);

    /**
     * 根据药品标识码查询库存信息
     *
     * @param barcode 药品标识码
     * @return 库存信息
     */
    MedicineInventoryDO getInventoryByBarcode(String barcode);

    /**
     * 根据批次号查询库存信息
     *
     * @param batchNumber 批次号
     * @return 库存信息列表
     */
    List<MedicineInventoryDO> getInventoriesByBatchNumber(String batchNumber);

    /**
     * 根据库存状态查询库存信息
     *
     * @param inventoryStatus 库存状态：1-正常 2-近效期 3-短缺 4-积压 5-过期 6-停用
     * @return 库存信息列表
     */
    List<MedicineInventoryDO> getInventoriesByStatus(Integer inventoryStatus);

    /**
     * 根据机构ID查询库存信息
     *
     * @param tenantId 机构ID
     * @return 库存信息列表
     */
    JSONArray getInventoriesByTenantId(Long tenantId);

    /**
     * 根据药品名称模糊查询库存信息
     *
     * @param drugName 药品名称
     * @return 库存信息列表
     */
    List<MedicineInventoryDO> getInventoriesByDrugName(String drugName);

    /**
     * 删除库存记录
     *
     * @param id 记录ID
     */
    void deleteInventory(Long id);

    /**
     * 批量删除库存记录
     *
     * @param ids 记录ID数组
     */
    void deleteInventories(Long[] ids);

    /**
     * 分页查询库存信息
     *
     * @param pageReqVO 分页查询条件（必须包含机构ID）
     * @return 分页结果
     */
    PageResult<MedicineInventoryDO> getInventoryPage(MedicineInventoryPageReqVO pageReqVO);

    /**
     * 不分页条件查询库存信息
     *
     * @param reqVO 查询条件（必须包含机构ID）
     * @return 列表结果
     */
    List<MedicineInventoryDO> getInventoryList(MedicineInventoryListReqVO reqVO);

}

