package com.xinelu.applet.mapper.appletlogin;

import com.xinelu.applet.dto.appletlogin.AppointmentConsumableDTO;
import com.xinelu.applet.vo.appletlogin.NurserStationItemConsumableVO;
import com.xinelu.applet.vo.appletlogin.NurserStationItemInfoVO;
import com.xinelu.applet.vo.appletlogin.PatientVO;
import com.xinelu.applet.vo.appletlogin.RegisterPatientInfoVO;
import com.xinelu.applet.vo.diseaseinfo.DiseasesInfoVO;
import com.xinelu.manage.domain.nursetype.NurseType;
import com.xinelu.manage.domain.patientinfo.PatientInfo;
import com.xinelu.manage.vo.patientinfo.PatientInfoVO;
import org.apache.ibatis.annotations.Param;

import java.time.LocalDate;
import java.time.LocalTime;
import java.util.List;

/**
 * @Description
 * @Author 纪寒
 * @Date 2022-09-02 10:57:17
 * @Version 1.0
 */
public interface AppletLoginMapper {

    /**
     * 根据openid查询被护理人信息
     *
     * @param openId 微信openId
     * @return 被护理人基本信息
     */
    PatientInfo getPatientInfoByOpenId(String openId);

    /**
     * 根据patientId查询被护理人信息
     *
     * @param patientId 用户id主键
     * @return 被护理人基本信息
     */
    PatientInfo getPatientInfoByPatientId(Long patientId);

    /**
     * 查询所有的基本信息
     *
     * @return 基本信息集合
     */
    List<DiseasesInfoVO> getAllDiseaseInfo();

    /**
     * 查询所有的护理类型信息
     *
     * @return 护理类型信息集合
     */
    List<NurseType> getAllNurseTypeInfo();

    /**
     * 根据手机号或者身份证号查询被护理人信息
     *
     * @param phone  手机号
     * @param cardNo 身份证号
     * @return 数量
     */
    int getPatientByPhoneAndCardNo(@Param("phone") String phone, @Param("cardNo") String cardNo);

    /**
     * 查询护理人列表信息
     *
     * @param openId 微信的openid
     * @return 护理人信息集合
     */
    List<PatientVO> getPatientInfoList(String openId);

    /**
     * 查询预约护理站项目信息
     *
     * @param stationId          护理站id
     * @param stationItemId      护理站项目id
     * @param stationItemPriceId 护理站项目价格id
     * @return 护理项目信息集合
     */
    NurserStationItemInfoVO getNurserStationItemInfo(@Param("stationId") Long stationId,
                                                     @Param("stationItemId") Long stationItemId,
                                                     @Param("stationItemPriceId") Long stationItemPriceId);

    /**
     * 查询护理站项目耗材信息
     *
     * @param stationId     护理站id
     * @param stationItemId 护理项目id
     * @return 护理项目耗材集合
     */
    List<NurserStationItemConsumableVO> getItemConsumableList(@Param("stationId") Long stationId,
                                                              @Param("stationItemId") Long stationItemId);

    /**
     * 批量新增订单耗材信息
     *
     * @param orderConsumableList 耗材详情表集合
     * @return 新增结果
     */
    int insertBatchOrderConsumable(List<AppointmentConsumableDTO> orderConsumableList);

    /**
     * 根据被护理人id查询被护理人相关信息
     *
     * @param patientId 被护理人id
     * @return 被护理人相关信息
     */
    RegisterPatientInfoVO getRegisterPatientInfoById(Long patientId);

    /**
     * 根据被护理人id查询被护理人护理类型信息
     *
     * @param patientId 被护理人id
     * @return 被护理人护理类型集合
     */
    List<NurseType> getPatientNurseTypeInfo(Long patientId);

    /**
     * 根据phone查询被护理人信息
     *
     * @param phone  手机号
     * @param openId 用户微信openId
     * @return 被护理人基本信息
     */
    PatientInfoVO getPatientInfoByPhone(@Param("phone") String phone, @Param("openId") String openId);

    /**
     * 根据会员id查询疾病信息
     *
     * @param patientId 会员id
     * @return java.util.List<com.xinyilu.base.vo.diseaseinfo.DiseasesInfoVO>
     **/
    List<DiseasesInfoVO> selectPatientDiseaseInfos(Long patientId);

    /**
     * 查询预约护理站项目信息(0203项目详情)
     *
     * @param stationId          护理站id
     * @param stationItemId      护理站项目id
     * @param stationItemPriceId 护理站项目价格id
     * @return 护理项目信息集合
     */
    NurserStationItemInfoVO getNurserStationItemAndPoser(@Param("stationId") Long stationId,
                                                         @Param("stationItemId") Long stationItemId,
                                                         @Param("stationItemPriceId") Long stationItemPriceId);

    /**
     * 根据护理项目id和预约时间点统计预约订单数量
     *
     * @param itemId           护理项目id
     * @param serviceDate      预约时间日期
     * @param serviceStartTime 预约时间点
     * @param orderStatusList  预约订单状态
     * @return 订单数量
     */
    Integer getAppointOrderCountByIdAndTime(@Param("itemId") Long itemId, @Param("serviceDate") LocalDate serviceDate,
                                            @Param("serviceStartTime") LocalTime serviceStartTime,
                                            @Param("orderStatusList") List<String> orderStatusList);


    /**
     * 删除会员账户信息，逻辑删除
     *
     * @param patientId 会员id
     * @return 删除数量
     */
    int deletePatientInfoById(Long patientId);
}
