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

import cn.hnthyy.thmz.entity.MzException;
import cn.hnthyy.thmz.entity.his.mz.MzyRequest;
import cn.hnthyy.thmz.entity.his.mz.MzyZdChargeType;

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

public interface MzyRequestService {
    /**
     * 根据日期查询所有号表
     *
     * @param requestDay
     * @return
     */
    List<MzyRequest> queryMzyRequestByRequestDay(String requestDay);

    /**
     * 按日期和时间区间查询可以挂号的科室编号
     *
     * @param requestDay
     * @param ampm
     * @return
     */
    List<String> queryUnitCodeByRequestDay(String requestDay, String ampm);


    /**
     * 按日期和时间区间以及部门编码与号别类型查询可以挂号的医生编号及费用类型
     *
     * @param requestDay
     * @param unitCode
     * @param ampm
     * @param chargeType
     * @return
     */
    List<MzyRequest> queryDoctorCodeByRequestDay(String requestDay, String unitCode, String ampm, String chargeType);


    /**
     * 按日期和时间区间以及部门编码查询可以挂号的号别
     *
     * @param requestDay
     * @param unitCode
     * @param ampm
     * @return
     */
    List<MzyZdChargeType> queryChargeTypeByRequestDay(String requestDay, String unitCode, String ampm);

    /**
     * 获取挂号号别的最新编号，并更新
     *
     * @param mzyRequest 当前号别对象
     */
    Integer getReqOrder(MzyRequest mzyRequest) throws MzException;


    /**
     * 同步排班表
     *
     * @return
     */
    int synchronizationRequest();


    /**
     * 查询当天最新的排班信息
     *
     * @return
     */
    List<MzyRequest> queryRequestForToday(Date today);


    /**
     * 根据所以筛选条件查询号表
     *
     * @param mzyRequest
     * @return
     */
    MzyRequest queryMzyRequestByAllParams(MzyRequest mzyRequest);


    /**
     * 保存排班表
     *
     * @return
     */
    int saveRequest(MzyRequest mzyRequest);


    /**
     * 保存排班表
     *
     * @return
     */
    int saveRequest(List<MzyRequest> mzyRequests, String opId) throws MzException;


    /**
     * 按时间区间查询号表数据
     *
     * @param beginDate
     * @param endDate
     * @return
     */
    List<MzyRequest> queryByTimes(Date beginDate, Date endDate, String unitCode, String ampm);

    /**
     * 根据主键查询号表信息
     *
     * @param id
     * @return
     */
    MzyRequest queryById(Long id);


    /**
     * 科室号源统计
     * @param beginDate
     * @param endDate
     * @param unitCode
     * @return
     */
    List<Map<String,Object>> queryNumByDateAndDept(Date beginDate, Date endDate, String unitCode);


    /**
     * 查询可以挂号的科室内医生信息
     * @param requestDay 挂号日期
     * @param ampms 当上下午不为空时，查询不在入参数集合的所有的号源
     * @param unitCode 科室编码
     * @return
     */
    List<Map<String,Object>> queryDoctorByDateAndDept(Date requestDay, List<String> ampms, String unitCode);

    /**
     * 查询医生的号源信息
     * @param requestDay
     * @param ampms
     * @param unitCode
     * @param doctorCode
     * @return
     */
    List<Map<String,Object>> queryRequestByDateAndDeptAndDoctor(Date requestDay,List<String> ampms, String unitCode, String doctorCode);



    /**
     * 删除号表数据
     * @param id
     * @return
     */
    int  removeMzyRequestById(Long id);


    /**
     * 根据排版主键和生日计算挂号费用 是否要加收附加费用7岁以内的孩子的
     * @param mzyRequestId
     * @param birthDay
     * @return
     */
    MzyZdChargeType calculateAddition(Long mzyRequestId, Date birthDay) throws MzException;

}
