package com.openhis.workflow.service;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

import com.baomidou.mybatisplus.extension.service.IService;
import com.openhis.medication.dto.AdjustPriceMedListDto;
import com.openhis.workflow.domain.SupplyRequest;
import com.openhis.workflow.dto.ChangePriceDto;

/**
 * 供应申请管理Service接口
 *
 * @author system
 * @date 2025-02-20
 */
public interface ISupplyRequestService extends IService<SupplyRequest> {

    /**
     * 通过单据号查询单据信息
     *
     * @param busNo 单据号
     * @return 单据信息
     */
    List<SupplyRequest> getSupplyByBusNo(String busNo);

    /**
     * 通过原始单据号查询单据信息
     *
     * @param originalBusNo 原始单据号
     * @return 单据信息
     */
    List<SupplyRequest> getSupplyByOriginalBusNo(String originalBusNo);

    /**
     * 同意申请
     *
     * @param busNo 单据号
     * @param now 当前时间
     * @return 单据详情
     */
    List<SupplyRequest> agreeRequest(String busNo, Date now);

    /**
     * 添加原始单据号
     *
     * @param busNo 单据号
     * @param originalBusNo 原始单据号
     * @return 单据详情
     */
    List<SupplyRequest> addOriginalBusNo(String busNo, String originalBusNo);

    /**
     * 将原始单据号信息的原始单据号删除
     *
     * @param busNo 单据号
     * @return 单据详情
     */
    boolean updateByBusNo(String busNo);

    /**
     * 将原始单据号信息的状态改为已失效
     *
     * @param busNo 单据号
     * @return 单据详情
     */
    boolean updateStatusEnumByBusNo(String busNo);

    /**
     * 提交审批
     *
     * @param busNo 单据号
     * @return 操作结果
     */
    boolean submitApproval(String busNo);

    /**
     * 撤回
     *
     * @param busNo 单据号
     * @return 操作结果
     */
    boolean withdrawApproval(String busNo);

    /**
     * 删除单据
     *
     * @param busNo 单据号
     * @return 操作结果
     */
    boolean removeByBusNo(String busNo);

    /**
     * 驳回申请
     *
     * @param busNo 单据号
     */
    boolean rejectRequest(String busNo);

    /**
     * 获取供应项目所在表
     *
     * @param agreedList 供应单据信息
     * @return 供应项目所在表
     */
    String getItemTable(List<SupplyRequest> agreedList);

    /**
     * 获取供应的物品
     *
     * @param agreedList 供应单据
     * @return 物品id
     */
    List<Long> getItem(List<SupplyRequest> agreedList);

    /**
     * 校验(已经审批通过的单号(请求状态是同意),不能再重复编辑请求)
     *
     * @param busNo 单据号
     */
    boolean supplyRequestValidation(String busNo);

    /**
     * 验证是否发生过业务
     *
     * @param itemId 项目id
     * @return 校验结果
     */
    boolean verifyAbleEdit(Long itemId);

    /**
     * 通过单据号删除单据信息
     *
     * @param busNo 单据号
     */
    boolean deleteRequest(String busNo);

    /**
     * 更新请求状态：同意
     *
     * @param supplyRequestIdList 供应申请id列表
     */
    void updateCompletedStatusBatch(List<Long> supplyRequestIdList);

    /**
     * 根据id，获取供应申请列表
     *
     * @param requestIdList id列表
     * @return 供应发放列表
     */
    List<SupplyRequest> selectByIdList(List<Long> requestIdList);

    /**
     * Desc: 根据 调价单号 查询 supplyrequest 和 价格主表
     * 
     * @param busNo
     * @Author raymond
     * @Date 10:13 2025/10/19
     * @return java.util.List<com.openhis.workflow.dto.ChangePriceDto>
     **/
    List<ChangePriceDto> searchDataForBusNo(String busNo);

    /**
     * 生成汇总发药单
     *
     * @param medicationId
     * @param locationId
     * @param lotNumber
     * @param patientId
     * @param minQuantity
     * @param minUnitCode
     * @param practitionerId
     * @param now
     * @param busNo
     */
    Long createSummarySupplyRequest(Long medicationId, Long locationId, String lotNumber, Long patientId,
        BigDecimal minQuantity, String minUnitCode, Long practitionerId, Date now, String busNo);

    /**
     * 生成汇总发药单（耗材）
     *
     * @param deviceId
     * @param locationId
     * @param lotNumber
     * @param minQuantity
     * @param minUnitCode
     * @param practitionerId
     * @param now
     * @param busNo
     */
    Long createDeviceSummarySupplyRequest(Long deviceId, Long locationId, String lotNumber, BigDecimal minQuantity,
        String minUnitCode, Long practitionerId, Date now, String busNo);

    /**
     * Desc: 根据调价单号 查询 原价 med
     * 
     * @param busNo
     * @Author raymond
     * @Date 14:10 2025/10/21
     * @return java.util.List<com.openhis.medication.dto.AdjustPriceMedListDto>
     **/
    List<AdjustPriceMedListDto> searchMedInfoDataForBusNo(String busNo);

    /**
     * Desc: 查询历史数据 药品调价数据
     * 
     * @param busNo
     * @param createTime
     * @Author raymond
     * @Date 07:22 2025/10/29
     * @return java.util.List<com.openhis.medication.dto.AdjustPriceMedListDto>
     **/
    List<AdjustPriceMedListDto> searchHistoryMedInfoData(String busNo, Date createTime);

    /**
     * Desc: 根据调价单号 查询 原价 device
     *
     * @param busNo
     * @Author raymond
     * @Date 14:10 2025/10/21
     * @return java.util.List<com.openhis.medication.dto.AdjustPriceMedListDto>
     **/
    List<AdjustPriceMedListDto> searchDeviceInfoDataForBusNo(String busNo);

    /**
     * Desc: 查询历史数据 耗材调价数据
     * 
     * @param busNo
     * @param createTime
     * @Author raymond
     * @Date 08:57 2025/10/29
     * @return java.util.List<com.openhis.medication.dto.AdjustPriceMedListDto>
     **/
    List<AdjustPriceMedListDto> searchHistoryDeviceInfoDataForBusNo(String busNo, Date createTime);

    /**
     * Desc: 根据调价单号 查询 原价 activity
     *
     * @param busNo
     * @Author raymond
     * @Date 14:10 2025/10/21
     * @return java.util.List<com.openhis.medication.dto.AdjustPriceMedListDto>
     **/
    List<AdjustPriceMedListDto> searchActivityInfoDataForBusNo(String busNo);

    /**
     * Desc: 根据调价单号 查询 历史原价 activity
     * 
     * @param busNo
     * @Author raymond
     * @Date 10:01 2025/10/29
     * @return java.util.List<com.openhis.medication.dto.AdjustPriceMedListDto>
     **/
    List<AdjustPriceMedListDto> searchHistoryActivityInfoDataForBusNo(String busNo);

    /**
     * Desc: 根据调价单号 查询 原价 health
     *
     * @param busNo
     * @Author raymond
     * @Date 14:10 2025/10/21
     * @return java.util.List<com.openhis.medication.dto.AdjustPriceMedListDto>
     **/
    List<AdjustPriceMedListDto> searchHealthInfoDataForBusNo(String busNo);

    /**
     * Desc: 根据调价单号 查询 历史原价 health
     * 
     * @param busNo
     * @Author raymond
     * @Date 10:00 2025/10/29
     * @return java.util.List<com.openhis.medication.dto.AdjustPriceMedListDto>
     **/
    List<AdjustPriceMedListDto> searchHistoryHealthInfoDataForBusNo(String busNo);

    /**
     * 取消汇总
     *
     * @param summaryNoList 汇总单号
     * @return 处理结果
     */
    List<Long> cancelSummarySupplyRequest(List<String> summaryNoList);

    /**
     * Desc: 根据 批次号查询 分组后的 产品ID
     * 
     * @param busNo
     * @Author raymond
     * @Date 13:36 2025/10/30
     * @return java.util.List<com.openhis.workflow.dto.ChangePriceDto>
     **/
    List<ChangePriceDto> searchGroupDataForBusNo(String busNo);
}
