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

import cn.hnthyy.thmz.entity.his.mz.MzReceiptSerial;
import cn.hnthyy.thmz.entity.thmz.Mzmxsr;
import cn.hnthyy.thmz.enums.YesNoEnum;
import cn.hnthyy.thmz.vo.*;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Map;

public interface ChargeFeeVoService {
    /**
     * 日结列表的收费清单 未结账
     *
     * @param userIdCode
     * @return
     */
    List<ChargeFeeVo> queryChargeFeeVoUnAccount(String userIdCode);

    /**
     * 日结汇总的收费清单
     *
     * @param hisDate 是否是历史数据，Yes 历史数据
     * @param caseType  0 结账基准  1  收费基准
     * @param beginDate 开始时间
     * @param endDate   结束时间
     * @return
     */
    List<ChargeFeeVo> queryChargeFeeVoCollect(YesNoEnum hisDate, String caseType, Date beginDate, Date endDate);

    /**
     * 重打结算单的收费清单 日结列表
     *
     * @param userIdCode
     * @param caseType
     * @param dcountDate
     * @return
     */
    List<ChargeFeeVo> queryChargeFeeVoReprint(String userIdCode,String caseType,Date dcountDate);

    /**
     * 可以被重打结算列表用户与日期列表
     *
     * @param userIdCode 用户编码
     * @param beginDate  开始时间
     * @param endDate    结束时间
     * @return
     */
    List<DcountDateListVo> queryDcountDateList(String userIdCode,Date beginDate,Date endDate);


    /**
     * 日结列表的挂号清单 未结账
     *
     * @param userIdCode
     * @return
     */
    List<ReqrecVo> queryReqrecVoUnAccount(String userIdCode);

    /**
     * 重打日结列表的挂号清单 已结账
     *
     * @param userIdCode
     * @param caseType
     * @param dcountDate
     * @return
     */
    List<ReqrecVo> queryReqrecVoReprint(String userIdCode,String caseType,Date dcountDate);

    /**
     * 费用汇总 挂号清单
     *
     * @param hisDate 是否是历史数据，Yes 历史数据
     * @param caseType
     * @param beginDate
     * @param endDate
     * @return
     */
    List<ReqrecVo> queryReqrecVoCollect(YesNoEnum hisDate,String caseType,Date beginDate,Date endDate);

    /**
     * 费用日结 收费所用票号
     *
     * @param userIdCode
     * @return
     */
    List<ReceiptBillVo> querySfReceiptBillVoUnAccount(String userIdCode);


    /**
     * 费用日结 挂号所用票号
     *
     * @param userIdCode
     * @return
     */
    List<ReceiptBillVo> queryGhReceiptBillVoUnAccount(String userIdCode);

    /**
     * 重打日结 收费所用票号
     *
     * @param userIdCode
     * @param dcountDate
     * @return
     */
    List<ReceiptBillVo> querySfReceiptBillVoReprint(String userIdCode, Date dcountDate);


    /**
     * 重打日结 挂号所用票号
     *
     * @param userIdCode
     * @param dcountDate
     * @return
     */
    List<ReceiptBillVo> queryGhReceiptBillVoReprint(String userIdCode,Date dcountDate);

    /**
     * 收款类别数据汇总，当参数只有用户编号时是查询未结算数据，有用户编号和 dcountDate 结算时间是查询 重新打印结算单  当只有开始和结束时间时是查询结算汇总
     *
     * @param userIdCode
     * @param dcountDate
     * @param beginDate
     * @param endDate
     * @return
     */
    List<ChargeCountVo> queryChargeCountVo(String userIdCode,Date dcountDate,Date beginDate,Date endDate);


    /**
     * 各种费用数据汇总，当参数只有用户编号时是查询未结算数据，有用户编号和 dcountDate 结算时间是查询 重新打印结算单  当只有开始和结束时间时是查询结算汇总
     *
     * @param userIdCode
     * @param dcountDate
     * @param beginDate
     * @param endDate
     * @return
     */
    List<MzReceiptSerial> queryMzReceiptSerial(String userIdCode,Date dcountDate, Date beginDate, Date endDate);

    /**
     * 查询收费发票数  payMark = 0  总票数  payMark = 1 退号数  payMark =2 作废票数
     *
     * @param userIdCode
     * @param payMark
     * @return
     */
    Integer countReceipt(String userIdCode, String payMark, Date dcountDate);

    /**
     * 查询收费作废发票明细
     * @param userIdCode
     * @param dcountDate
     * @return
     */
    List<ReceiptVo> queryReceiptVo(String userIdCode,Date dcountDate);


    /**
     * 查询挂号发票数   cancelMark = 0  总票数  cancelMark = 1 退号数
     *
     * @param userIdCode
     * @param cancelMark
     * @return
     */
    Integer countReqrecReceipt(String userIdCode, String cancelMark, Date dcountDate, Date beginDate, Date endDate);

    /**
     * 查询挂号收入构成表格数据
     * @param userIdCode
     * @param dcountDate
     * @param beginDate
     * @param endDate
     * @return
     */
    List<ReqrecVo> queryMzReceiptSerialCount(String userIdCode, Date dcountDate, Date beginDate,Date endDate);



    /**
     * 查询退号明细
     * @param userIdCode
     * @param dcountDate
     * @return
     */
    List<ReceiptVo> queryThMzReceiptSerial(String userIdCode, Date dcountDate);

    /**
     * 判断是否有退费后没重收的数据
     * @param userIdCode
     * @return
     */
    Integer queryTFWDFPCount(String userIdCode);

    /**
     * 查询总计金额
     * @param userIdCode
     * @return
     */
    BigDecimal queryTotalCharge(String userIdCode);

    /**
     * 费用日结结算
     * @param userIdCode
     * @return
     */
    Date dcountCharge(String userIdCode);


    /**
     * 在发票表中查询当前日期范围内有收款记录的收费员
     * @param beginDate
     * @param endDate
     * @return
     */
    List<String> queryAllOperatorFromReceipt(Date beginDate, Date endDate);

    /**
     * 在挂号表中查询当前日期范围内有收款记录的收费员
     * @param beginDate
     * @param endDate
     * @return
     */
    List<String> queryAllOperatorFromReqrec(Date beginDate, Date endDate);



    /**
     * 挂号工作量一览表
     * @param beginDate
     * @param endDate
     * @param cashId
     * @return
     */
    List<WorkloadVo> queryGhWorkloadVo(YesNoEnum hisDate,Date beginDate, Date endDate,String cashId,YesNoEnum orderByDcountDate);

    /**
     * 门诊收费一览表
     * @param beginDate
     * @param endDate
     * @param cashId
     * @return
     */
    List<WorkloadVo>  querySfWorkloadVo(YesNoEnum hisDate,Date beginDate, Date endDate,String cashId,YesNoEnum orderByDcountDate);


    /**
     * 门诊收据分类统计表
     * @param beginDate
     * @param endDate
     * @return
     */
    List<ChargeDetailVo> queryChargeDetailVos(YesNoEnum hisDate,Date beginDate, Date endDate);



    /**
     * 查询是否有可以日结的数据
     * @param userIdCode
     * @return
     */
    Integer queryCountCanDaily(String userIdCode);

    /**
     * 数据清洗，将在老系统日结的数据清洗一次
     * @return
     */
    int refeshPayManData(String userIdCode, Date dcountDate);

    /**
     * 查询自助发票明细
     * @param userIdCode
     * @param dcountDate
     * @return
     */
    List<ReceiptVo> queryZiZhuReceiptVo(String userIdCode, Date dcountDate);

    /**
     * 修复发票表和收费表中不一致的数据
     * @param beginDate
     * @param endDate
     * @return
     */
    int refeshInconformityData(Date beginDate,Date endDate);


    /**
     * 清洗payId
     * @return
     */
    int setPayId();


    /**
     * 查询泰和医院门诊明细收入
     * @param thmzmxsrParamsVo
     * @return
     */
    List<Mzmxsr> queryThmzmxsr(ThmzmxsrParamsVo thmzmxsrParamsVo);



    /**
     * 清洗门诊部数据
     * @return
     */
    int modifyMzService();



    /**
     * 统计选定日期内费用总额 用于判断是否需要插入收费明细
     * @param thmzmxsrParamsVo
     * @return
     */
    List<Map<String,Object>> querySumAmount(ThmzmxsrParamsVo thmzmxsrParamsVo);
}
