package com.openhis.medication.service;

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

import com.baomidou.mybatisplus.extension.service.IService;
import com.openhis.medication.domain.MedicationDispense;
import com.openhis.medication.domain.MedicationRequest;

/**
 * 药品发放管理Service接口
 *
 * @author system
 * @date 2025-02-20
 */
public interface IMedicationDispenseService extends IService<MedicationDispense> {

    /**
     * 处理药品发放信息
     *
     * @param medicationRequest 药品请求信息
     * @param dbOpType db操作类型
     * @return 发放id
     */
    Long handleMedicationDispense(MedicationRequest medicationRequest, String dbOpType);

    /**
     * 医嘱执行生成药品发放,状态为待配药
     * 
     * @param medicationRequest 药品医嘱请求
     * @param procedureId 执行记录id
     * @param plannedDispenseTime 预定发药时间
     * @return 发放id
     */
    Long generateMedicationDispense(MedicationRequest medicationRequest, Long procedureId, Date plannedDispenseTime);

    /**
     * 删除药品发放信息
     * 
     * @param medReqId 药品请求id
     */
    void deleteMedicationDispense(Long medReqId);

    /**
     * 更新未发放药品状态：停止发放
     *
     * @param medDisIdList 发放id列表
     * @param refund 停止原因：退费
     */
    void updateStopDispenseStatus(List<Long> medDisIdList, Integer refund);

    /**
     * 更新药品状态：待配药
     *
     * @param medicationRequestIdList 请求id列表
     */
    void updatePreparationDispenseStatus(List<Long> medicationRequestIdList);

    /**
     * 更新药品状态：暂停
     *
     * @param medReqIdList 请求id列表
     */
    void updateOnHoldDispenseStatus(List<Long> medReqIdList);

    /**
     * 验证是否发过药
     *
     * @param medicationDefId 药品定义id
     * @return 验证结果
     */
    boolean verifyAbleEdit(Long medicationDefId);

    /**
     * 通过请求id获取药品发放信息
     *
     * @param requestIdList 请求id
     * @return 发放信息
     */
    List<MedicationDispense> selectByRequestIdList(List<Long> requestIdList);

    /**
     * 更新药品状态：已汇总
     *
     * @param medDispenseId 发放id列表
     * @param busNo 汇总单号
     */
    void updateDispenseStatusSummarized(List<Long> medDispenseId, String busNo);

    /**
     * 通过执行id获取药品发放信息
     *
     * @param procedureIdList 执行id列表
     * @return 发放信息
     */
    List<MedicationDispense> getMedDispenseByProcedureId(List<Long> procedureIdList);

    /**
     * 取消汇总
     *
     * @param summaryNoList 汇总单号列表
     * @return 取消结果
     */
    boolean cancelMedicationSummary(List<String> summaryNoList);

    /**
     * 更新药品发放状态
     *
     * @param dispenseIdList 发放id列表
     * @param dispenseStatus 发放状态
     */
    void updateDispenseStatus(List<Long> dispenseIdList, Integer dispenseStatus);

    /**
     * 通过汇总单号获取药品发放信息
     *
     * @param summaryNoList 汇总单号列表
     * @return 发放信息
     */
    List<MedicationDispense> getMedDispenseBySummaryNo(List<String> summaryNoList);
}