package com.docus.server.message.mapper;


import com.docus.server.message.dto.TbasicQrPreciseCondition;
import com.docus.server.message.entity.MaternalInfantRelationship;
import com.docus.server.message.entity.TBasic;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

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

@Mapper
public interface TBasicMapper {
    List<String> getPatientIdsByInpatientNoAndTimes(@Param("inpatientNo") String inHospIndexNo, @Param("admissTimes") Integer visitNo);

    List<String> getPatientIdByPreciseConditions(@Param("condition")TbasicQrPreciseCondition condition);

    /*
     * 广州脑科查询主键
     */
    List<String> getGznkPatientIdByPreciseConditions(@Param("condition")TbasicQrPreciseCondition condition);

    /*
     * 梅州三院查询主键
     */
    List<String> getMzsyPatientIdByPreciseConditions(@Param("condition")TbasicQrPreciseCondition condition);


    /**
     * 更新医生提交时间
     *
     * @param patientId  病案主键
     * @param submitTime 提交时间
     * @return database操作行
     */
    int insertOrUpdateDoctorSubmitTime(@Param("patientId") String patientId, @Param("submitTime") Date submitTime);

    /**
     * 更新护士提交时间
     *
     * @param patientId  病案主键
     * @param submitTime 提交时间
     * @return database操作行
     */
    int insertOrUpdateNurseSubmitTime(@Param("patientId") String patientId, @Param("submitTime") Date submitTime);

    /**
     * 更新护理文件数量
     *
     * @param patientId 病案主键
     * @param fileCount 文件数量
     * @return database操作行
     */
    int insertOrUpdateNurseFileCount(@Param("patientId") String patientId, @Param("fileCount") Integer fileCount);


    /**
     * 更新质控护士和责任护士
     *
     * @param patientId 病案主键
     * @param qcNurse 质控护士
     * @param dutyNurse 责任护士
     * @return database操作行
     */
    int insertOrUpdateNurse(@Param("patientId") String patientId, @Param("qcNurse") String qcNurse, @Param("dutyNurse") String dutyNurse);

    /**
     * 根据病案主键查询出院病案的数量，一般用于判断病案是否出院
     *
     * @param patientId 病案主键
     * @return 出院数量
     */
    int getDischargeCount(@Param("patientId") String patientId);

    /**
     * 更新出院时间
     *
     * @param patientId 病案主键
     * @param disDate   出院时间
     * @return database操作行
     */
    int updateDisDateTime(@Param("patientId") String patientId, @Param("disDate") String disDate);

    int updateDisDeptAndWardCode(@Param("patientId") String patientId,
                                 @Param("deptCode") String deptCode,
                                 @Param("deptCodeName") String deptCodeName,
                                 @Param("wardCode") String wardCode,
                                 @Param("wardCodeName") String wardCodeName);


    /**
     * 更新基础信息，是否重症患者
     *
     * @param inpatientNo 病案号
     * @param admissTimes 住院次数
     * @param state       状态 1是，0否
     * @return 数据库操作行
     */
    int updIcuRecordState(@Param("inpatientNo") String inpatientNo, @Param("admissTimes") Integer admissTimes, @Param("state") int state);

    /**
     * 根据病案主键和来源，统计未作废的文件数量
     *
     * @param patientId 病案主键
     * @param source    系统/采集来源
     * @return 未作废文件数量
     */
    int getFileCountByPatientAndSource(@Param("patientId") String patientId, @Param("source") String source);

    /**
     * 更新电子病历提交状态
     *
     * @param patientId      病案主键
     * @param emrSubmitState 提交状态 0 否 1 是
     * @return 数据库操作
     */
    int updateEmrSubmitState(@Param("patientId") String patientId, @Param("emrSubmitState") int emrSubmitState);


    int updateNursCollectState(@Param("patientId") String patientId, @Param("emrSubmitState") int submitState);
    /**
     * 根据住院号和住院次数查询出院日期 yyyyMMdd
     * @param inpatientNo 住院号
     * @param admissTimes 住院次数
     * @return 出院日期 yyyyMMdd
     */
    String getDischargeDateByInpatientNoAndTimes(@Param("inpatientNo") String inpatientNo,@Param("admissTimes") Integer admissTimes);

    /**
     * 根据条件查，是否是产科的患者，查询数量
     * @param patientId 病案主键
     * @param haveBabyQuery 产科患者的查询条件，不能为空
     * @return 数量
     */
    int isHaveBaby(@Param("patientId")String patientId, @Param("haveBabyQuery") String haveBabyQuery);

    /**
     * 根据主键查患者信息
     * @param patientId 患者主键
     * @return 患者信息
     */
    TBasic getTBasicInfo(@Param("patientId")String patientId);

    /**
     * 根据病案主键查询患者索引
     * @param patientId 病案主键
     * @return 患者索引
     */
    String getSdRyIndex(@Param("patientId") String patientId);

    /**
     * 根据母亲的id和住院次数，查询母婴关联关系
     * @param parentIndex 母亲的id
     * @param parentTimes 母亲住院次数
     * @return 母婴关联关系
     */
    List<MaternalInfantRelationship> getMiRelationByPatientIndexAndAdmissTimes(@Param("parentIndex")String parentIndex, @Param("parentTimes") String parentTimes);

    /**
     * 根据医院患者索引查询病案主键
     * @param sdRyIndex 患者索引
     * @return 病案主键
     */
    String getPatientIdBySdRyIndex(@Param("sdRyIndex")String sdRyIndex);


    Long getLastBackLogId(@Param("patientId") String patientId);

    int updateBackLogSubmitTime(@Param("id") Long id,@Param("time") String time);
}
