package com.ruoyi.os.service;

import com.ruoyi.inventory.domain.HealthcareDrugArchive;
import com.ruoyi.os.domain.*;

import java.util.List;

/**
 * 诊断信息Service接口
 *
 * @author 何顺
 * @date 2024-09-17
 */
public interface IPatientDiagnosisService {

    /**
     * 查询病历列表
     * 
     * @param healthcareOsPatientDiagnosis 参数
     * @return 包含所有医疗记录的列表
     */
    public List<HealthcareOsPatientDiagnosis> queryMedicalRecordList(
            HealthcareOsPatientDiagnosis healthcareOsPatientDiagnosis);

    /**
     * gain Patient diagnosis information
     * 获得患者诊断信息
     * 
     * @param id 患者id
     * @return 患者诊断信息
     */
    public PatientMedicalRecordsVO gainPatientDiagnosisInformation(Long id);

    /**
     * 修改 患者 诊断
     * 
     * @param patientMedicalRecordsVO 参数
     * @return 状态 提示信息
     */
    public int updateDiagnosis(PatientMedicalRecordsVO patientMedicalRecordsVO);

    /**
     * 保存 修改 患者 诊断
     * 
     * @param patientMedicalRecordsVO 参数
     * @return 状态 提示信息
     */
    public int saveUpdateDiagnosis(PatientMedicalRecordsVO patientMedicalRecordsVO);

    /**
     * 修改 库存 根据 处方 返回 药品
     * 
     * @param patientMedicalRecordsVO 参数
     */
    public void removeDrugModifyInventory(PatientMedicalRecordsVO patientMedicalRecordsVO);

    /**
     * 添加 患者 诊断
     * 
     * @param patientMedicalRecordsVO 参数
     * @return 返回 成功 提示信息
     */
    public int addDiagnosis(PatientMedicalRecordsVO patientMedicalRecordsVO);

    /**
     * 保存 变成 待发 修改 库存
     * 
     * @param patientMedicalRecordsVO 参数
     * @return 返回 成功 提示信息
     */
    public int saveAddDiagnosis(PatientMedicalRecordsVO patientMedicalRecordsVO);

    /**
     * saveDiagnosis 保存 患者 诊断
     * 
     * @param patientMedicalRecordsVO 参数
     * @return 返回 成功 提示信息
     */
    public int saveDiagnosis(PatientMedicalRecordsVO patientMedicalRecordsVO);

    /**
     * 删除 患者 诊断
     * 
     * @param id 患者id
     * @return 返回 成功 提示信息
     */
    public int removeDiagnosis(Long id);

    /**
     * 判断 库存
     * 
     * @param prescriptionDetailsList 参数
     *
     */
    public void judgeStock(List<List<HealthcareOsPrescriptionDetails>> prescriptionDetailsList);

    /**
     * 判断 库存 在 修改 处方
     * 
     * @param prescriptionDetailsList 参数
     *
     */
    public void modifyJudgeStock(List<List<HealthcareOsPrescriptionDetails>> prescriptionDetailsList);

    /**
     * 修改患者状态
     * 
     * @param id     患者id
     * @param status 状态
     * @return 返回 成功 提示信息
     */
    public int updateStatus(Long id, Long status);

    /**
     * @param drugArchivesVO 参数
     * @return 返回 药品 列表
     **/
    public List<DrugArchivesVO> gainDrugList(DrugArchivesVO drugArchivesVO);

    /**
     * @param healthcareDrugArchive 参数
     * @return 返回 药品 列表 价格
     **/
    public List<DrugArchivesVO> gainDrugPriceList(HealthcareDrugArchive healthcareDrugArchive);

    /**
     * 获取 药品 名称 列表 gainMedicineArchiveList
     * 
     * @param healthcareDrugArchive 参数
     * @return 返回 药品名称 列表
     */
    public List<String> gainMedicineNameList(HealthcareDrugArchive healthcareDrugArchive);

    /**
     * 获取 药品 名称 列表
     * 
     * @param drugArchivesVO 参数
     * @return 返回 药品 档案 列表
     */
    public List<HealthcareDrugArchive> gainMedicineArchiveList(DrugArchivesVO drugArchivesVO);

    /**
     * 获取 药品 库存 列表
     * 
     * @param drugArchivesVO 参数
     * @return 返回 药品库存 列表
     */
    public List<DrugArchivesVO> gainDrugInventoryList(DrugArchivesVO drugArchivesVO);

    /**
     * 获取 患者 诊断 详情 列表 没有 id 的
     * 
     * @param patientMedicalRecordsVO 参数
     * @return 返回 列表
     */
    public List<PatientMedicalRecordsVO> gainPrescriptionDetailsList(PatientMedicalRecordsVO patientMedicalRecordsVO);

    /**
     * 获取 症状 对应 的 数量
     * 
     * @param countDiagnosisVO 参数
     * @return 返回 列表
     */
    public List<CountDiagnosisVO> obtainSymptomStatisticsNumber(CountDiagnosisVO countDiagnosisVO);

    /**
     * 按患者ID统计历史医保报销累计金额(仅统计已发药)
     * 
     * @param patientId 患者ID
     * @param yearDate  年份日期(用于过滤当年数据)
     * @return 历史医保报销累计金额
     */
    public java.math.BigDecimal getHistoryReimbursementByPatientId(Long patientId, java.util.Date yearDate);

    /**
     * 获取 症状 对应 的 数量 月份
     * 
     * @param countDiagnosisVO 参数
     * @return 返回 列表
     */
    public List<List<CountDiagnosisVO>> obtainSymptomStatisticsNumberMonth(CountDiagnosisVO countDiagnosisVO);

    /**
     * 导出是医保的数据列表
     * 邵政文
     * 2025-05-14
     */
    public List<PatientMedicalRecordsYesVO> gainPrescriptionDetailsYesList(
            PatientMedicalRecordsVO patientMedicalRecordsVO);

    /**
     * 宁博 2025-05-21
     * 验证医保是否可用
     * 
     * @param idCard 省份证
     * @param name   姓名
     * @return 0 可用 1 不可用
     */
    int verifyInsuranceStatus(String idCard, String name);

    /**
     * 发药更正:仅调整基础字段(是否医保、报销比率等),不改处方明细与库存
     * 
     * @param patientMedicalRecordsVO 入参包含 patientDiagnosisId、isInsured、value 等
     * @return 影响行数
     */
    public int adjustBasicFields(PatientMedicalRecordsVO patientMedicalRecordsVO);
}
