package cn.hnthyy.thmz.service.his.mz;

import cn.hnthyy.thmz.entity.MzException;
import cn.hnthyy.thmz.entity.his.mz.MzChargeDetail;
import cn.hnthyy.thmz.entity.his.mz.MzDepositFile;
import cn.hnthyy.thmz.entity.his.mz.MzReceiptSerial;
import cn.hnthyy.thmz.entity.thmz.ReceiptSerialFee;
import cn.hnthyy.thmz.enums.YesNoEnum;
import cn.hnthyy.thmz.pageDto.MzChargeDetailPageDto;
import cn.hnthyy.thmz.vo.MzDepositFileVo;
import cn.hnthyy.thmz.vo.MzPrescriptionVo;
import cn.hnthyy.thmz.vo.ThmzmxsrParamsVo;

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

public interface MzChargeDetailService {
    /**
     * 统计符合条件的费用信息
     *
     * @param mzChargeDetailPageDto
     * @return
     */
    int countMzChargeDetail(MzChargeDetailPageDto mzChargeDetailPageDto);

    /**
     * 分页查询收费信息
     *
     * @param mzChargeDetailPageDto
     * @return
     */
    List<MzChargeDetail> queryMzChargeDetailWithPage(MzChargeDetailPageDto mzChargeDetailPageDto);
//    /**
//     * 查询收费信息
//     * @param mzChargeDetailPageDto
//     * @return
//     */
//    List<MzChargeDetail> queryMzChargeDetail(MzChargeDetailPageDto mzChargeDetailPageDto);

//    /**
//     * 将医技表与用药方式和耗材的费用写入收费明细表
//     * @param mzChargeDetail
//     * @return
//     * @throws Exception
//     */
//    int saveFullMzChargeDetail(MzChargeDetail mzChargeDetail) throws MzException;

//
//    /**
//     * 查询近三天内没有缴费的药品处方
//     * @param patientId
//     * @return
//     */
//    List<Map<String, Object>> queryUnPaidChargeDetail(String patientId);

    /**
     * 将未缴费的处方转成完整的收费明细 只能看不会入库
     *
     * @param mzChargeDetail
     * @return
     */
    MzChargeDetail unPaidToFullChargeDetail(MzChargeDetail mzChargeDetail) throws MzException;

    /**
     * 将未缴费的处方转成完整的收费明细
     *
     * @param patientId 病人id
     * @param name 病人姓名
     * @return
     */
    List<MzChargeDetail> unPaidToFullChargeDetail(String patientId,String name) throws MzException;


    /**
     * 按照费用类型查询费用明细
     *
     * @param
     * @return
     */
    List<MzChargeDetail> queryMzChargeDetailByBillItemCode(String patientId, Integer times, Integer receiptNo, String payMark, String billItemCode, List<String> billItemTypes);

    /**
     * 收费操作
     *
     * @param opId
     * @param mzDepositFileVo
     * @return
     */
    int chargeFee(String opId, MzDepositFileVo mzDepositFileVo) throws MzException;

    /**
     * 查询当前就诊次数的所有取药号与药房信息
     *
     * @param patientId
     * @param times
     * @return
     */
    List<MzChargeDetail> queryFyJl(String patientId, Integer times);


    /**
     * 修改发票打印标记
     *
     * @param patientId
     * @param times
     * @return
     */
    int modifyPrintFlag(String patientId, List<Integer> times);

    /**
     * 查询收费信息
     *
     * @param mzChargeDetail
     * @return
     */
    List<MzChargeDetail> queryChargeDetail(MzChargeDetail mzChargeDetail);

    /**
     * 获取待缴费的费用明细 按照西药，中药，医技分类
     *
     * @param mzChargeDetail
     * @return
     */
    List<MzChargeDetail> getTempMzChargeDetailListForUnPaid(MzChargeDetail mzChargeDetail) throws MzException;


    /**
     * 退费操作
     *
     * @param opId
     * @param mzDepositFileVo
     * @return
     */
    int refundFee(String opId, MzDepositFileVo mzDepositFileVo) throws MzException;

    /**
     * 获取退费后新产生的缴费明细记录
     *
     * @param opId
     * @param mzDepositFileVo
     * @param yesNo           是否入库，Yes 入库，需要产生新的times
     * @return
     * @throws MzException
     */
    List<MzChargeDetail> getNewListForRefundFee(String opId, MzDepositFileVo mzDepositFileVo, YesNoEnum yesNo) throws MzException;


    /**
     * 获取 退费后新产生的待缴费的费用明细 按照西药，中药，医技分类
     *
     * @param opId
     * @param mzDepositFileVo
     * @param yesNo           是否入库，Yes 入库，需要产生新的times
     * @return
     */
    List<MzChargeDetail> getTempMzChargeDetailListForNewListForRefundFee(String opId, MzDepositFileVo mzDepositFileVo, YesNoEnum yesNo) throws MzException;

    /**
     * 保存明细
     *
     * @param mzChargeDetails
     */
    void saveMzChargeDetail(List<MzChargeDetail> mzChargeDetails);

    /**
     * 更新收费状态，并入库发药记录
     *
     * @param opId
     * @param patientId
     * @param times
     * @param name
     * @param mzChargeDetailList
     * @param now
     * @param serialNo
     * @param chequeType
     * @param refundTimes        被退费次数 为null 时是收费
     * @throws MzException
     */
    void updateChargeFlag(String opId, String patientId, Integer times, String name, List<MzChargeDetail> mzChargeDetailList, Date now, int serialNo, String chequeType, Integer refundTimes) throws MzException;

    /**
     * 收费后续处理，入库收费发票表记录 和 收费方式
     *
     * @param patientId
     * @param times
     * @param mzDepositFiles
     * @param now
     * @param serialNo
     * @param mzReceiptSerial
     * @throws MzException
     */
    void afterChargeFee(String patientId, Integer times, List<MzDepositFile> mzDepositFiles, Date now, int serialNo, MzReceiptSerial mzReceiptSerial, BigDecimal totalPayable,ReceiptSerialFee receiptSerialFee) throws MzException;


    /**
     * 本院记账退费重收操作
     *
     * @param opId
     * @param mzDepositFileVo
     * @return
     */
    int chargeFeeForByjz(String opId, MzDepositFileVo mzDepositFileVo) throws MzException;


    /**
     * 查询病人缴费记录
     *
     * @param hisDate   Yes 历史数据
     * @param patientId
     * @param name
     * @param serialNo
     * @param beginDate
     * @param endDate
     * @return
     */
    List<Map<String, Object>> queryChargeListByPatient(YesNoEnum hisDate, String patientId, String name, String serialNo, Date beginDate, Date endDate);


    /**
     * 根据病人编码和收费流水号查询缴费明细
     *
     * @param hisDate   Yes 历史数据
     * @param patientId
     * @param serialNo
     * @return
     */
    List<Map<String, Object>> queryChargeDetailByPatient(YesNoEnum hisDate, String patientId, String serialNo);


    /**
     * 清洗老系统打印发票数据
     *
     * @return
     */
    int refshOldSystemReceiptData();


    /**
     * 修改病人姓名  120病人缴费时调用
     *
     * @param name
     * @param patientId
     * @param times
     * @return
     */
    int modifyNameByPatientIdAndTimes(String name, String patientId, Integer times);


    /**
     * 查询120 病人姓名
     *
     * @param patientId
     * @param times
     * @return
     */
    String queryJZName(String patientId, Integer times);


    /**
     * @param thmzmxsrParamsVo caseType = 1 申请科室核算报表  0 执行科室核算报表
     * @return
     */
    List<Map<String, Object>> queryDepetBusinessReport(ThmzmxsrParamsVo thmzmxsrParamsVo);

    /**
     * 格式化收费记录 构造包含病人信息的挂号记录视图
     *
     * @param mzChargeDetails
     */
    void formatMzChargeDetail(List<MzChargeDetail> mzChargeDetails);

    /**
     * 将套餐归类，并计算总费用
     *
     * @param mzChargeDetailList
     * @return
     */
    List<MzChargeDetail> getMzChargeDetails(List<MzChargeDetail> mzChargeDetailList);

    /**
     * 保存处方信息
     * @param mzPrescriptionVo
     * @return
     */
    int savePrescription(MzPrescriptionVo mzPrescriptionVo) throws MzException;


    /**
     * 查询药房类型
     * @param
     * @return
     */
    List<String> queryGroupNo(MzChargeDetail mzChargeDetail);

    /**
     * 修改付款方式
     * @param chequeType 新付款方式
     * @param receiptSn 流水号
     * @param oldChequeType 老的付款方式
     * @return
     */
    int modifyChequType( String chequeType,Integer receiptSn,String oldChequeType) throws MzException;


//    /**
//     * 同步备份库数据到正式库 修复记账的数据
//     * @param mzChargeDetail
//     * @return
//     */
//    int reSaveDetailFromBak(MzChargeDetail mzChargeDetail);
}
