package com.xinelu.manage.mapper.signpatientmanageroutenode;

import com.xinelu.manage.domain.signpatientmanageroutenode.SignPatientManageRouteNode;
import com.xinelu.manage.dto.signpatientmanageroutenode.PatientTaskDto;
import com.xinelu.manage.dto.signpatientmanageroutenode.SignPatientManageRouteNodeDto;
import com.xinelu.manage.dto.signpatientmanageroutenode.UploadRobotPublishRecordDto;
import com.xinelu.manage.dto.statistics.FollowUpRateDto;
import com.xinelu.manage.dto.statistics.QuestionnaireTaskStatisticsDto;
import com.xinelu.manage.vo.homepage.PatientAndNode;
import com.xinelu.manage.vo.signpatientmanageroutenode.*;
import com.xinelu.manage.vo.specialdiseasenode.SpecialDiseaseNodeAuditVo;
import com.xinelu.manage.vo.statistics.QuestionnaireTaskStatisticsVo;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;

/**
 * 签约患者管理任务路径节点Mapper接口
 *
 * @author haown
 * @date 2024-03-18
 */
public interface SignPatientManageRouteNodeMapper {
    /**
     * 查询签约患者管理任务路径节点
     *
     * @param id 签约患者管理任务路径节点主键
     * @return 签约患者管理任务路径节点
     */
    SignPatientManageRouteNode selectSignPatientManageRouteNodeById(Long id);

    /**
     * 查询患者任务管理路径节点
     *
     * @param patientTaskDto 任务查询传输对象
     * @return 患者管理任务路径节点
     */
    List<SignPatientManageRouteNode> getNodeList(PatientTaskDto patientTaskDto);

    /**
     * 查询签约患者管理任务路径节点列表
     *
     * @param signPatientManageRouteNodeDto 签约患者管理任务路径节点查询传输对象
     * @return 签约患者管理任务路径节点集合
     */
    public List<SignPatientManageRouteNode> selectSignPatientManageRouteNodeList(SignPatientManageRouteNodeDto signPatientManageRouteNodeDto);

    List<PatientManageNodeListVo> selectPatientManageNodeList(SignPatientManageRouteNodeDto signPatientManageRouteNodeDto);

    /**
     * 新增签约患者管理任务路径节点
     *
     * @param signPatientManageRouteNode 签约患者管理任务路径节点
     * @return 结果
     */
    public int insertSignPatientManageRouteNode(SignPatientManageRouteNode signPatientManageRouteNode);

    int insertBatch(@Param("nodeList") List<SignPatientManageRouteNode> nodeList);

    /**
     * 修改签约患者管理任务路径节点
     *
     * @param signPatientManageRouteNode 签约患者管理任务路径节点
     * @return 结果
     */
    public int updateSignPatientManageRouteNode(SignPatientManageRouteNode signPatientManageRouteNode);

    /**
     * 删除签约患者管理任务路径节点
     *
     * @param id 签约患者管理任务路径节点主键
     * @return 结果
     */
    public int deleteSignPatientManageRouteNodeById(Long id);

    /**
     * 批量删除签约患者管理任务路径节点
     *
     * @param ids 需要删除的数据主键集合
     * @return 结果
     */
    public int deleteSignPatientManageRouteNodeByIds(Long[] ids);

    /**
     * 批量删除签约患者管理任务路径节点
     *
     * @param manageRouteId 需要删除的数据
     * @return 结果
     */
    int deleteRouteNodeByManageRouteId(Long manageRouteId);

    /**
     * 根据ManageRouteId  修改 拔打状态
     *
     * @param signPatientManageRouteNode
     * @return
     */
    int  updateDialStatus(SignPatientManageRouteNode signPatientManageRouteNode);

    /**
     *  修改 拔打状态
     * @param signPatientManageRouteNode
     * @return
     */
    int  updateDialStatusByNodeId(SignPatientManageRouteNode signPatientManageRouteNode);

    /**
     * 查询患者任务列表
     *
     * @param patientTaskDto 患者任务列表查询传输对象
     * @return 患者任务列表
     */
    List<PatientTaskVo> selectPatientTaskList(PatientTaskDto patientTaskDto);

    /**
     * 修改消息状态
     *
     * @param signPatientManageRouteNode 节点信息
     * @return int
     */
    int updateMessageStatus(SignPatientManageRouteNode signPatientManageRouteNode);

	List<SpecialDiseaseNodeAuditVo> selectByRouteId(Long manageRouteId);

	/**
	 * 任务审核，查询手动创建的任务节点详情
	 * @param manageRouteIds 路径主键列表
	 * @return 节点详细信息列表
	 */
	List<SignPatientManageNodeAuditVo> selectAuditNodeInfo(@Param("manageRouteIds") List<Long> manageRouteIds);

	/**
	 * 患者详情，查询任务节点详情
	 * @param manageRouteIds 路径主键列表
	 * @return 节点详细信息列表
	 */
	List<SignPatientTaskVo> selectNodeInfoByManageIds(@Param("manageRouteIds") List<Long> manageRouteIds);

	/**
	 * 根据路径主键列表查询节点列表
	 * @param manageRouteIds 路径主键列表
	 * @return 节点列表
	 */
	List<SignPatientManageRouteNode> selectNodesByManageIds(@Param("manageRouteIds") List<Long> manageRouteIds);

    /**
     * 查询患者管理路径节点内容
     *
     * @param patientId 患者id
     * @return 患者管理任务路径节点
     */
    List<SignPatientManageRouteNode> getRouteNodeContentList(Long patientId);

    /**
     * 查询需要推送短信数据
     *
     * @return TextMessage
     */
    List<TextMessage> selectMessagePushSign();

    /**
     * 修改执行状态
     *
     * @param manageRouteNodeIds 节点id
     * @param nodeExecuteStatus  执行状态
     * @param appletStatus       小程序发送状态
     * @param messageStatus      短信发送状态
     * @param officialStatus     公众号发送状态
     * @return int
     */
    int updateNodeExecuteStatusByIds(@Param("manageRouteNodeIds") List<Long> manageRouteNodeIds, @Param("nodeExecuteStatus") String nodeExecuteStatus, @Param("appletStatus") String appletStatus, @Param("messageStatus") String messageStatus, @Param("officialStatus") String officialStatus, @Param("nodeFinishDate") LocalDateTime nodeFinishDate);

    /**
     * 修改执行状态
     *
     * @param manageRouteNodeIds 节点id
     * @param taskIdExt  第三方返回的任务ID
     * @return int
     */
    int updateTaskIdExtBuIds(@Param("manageRouteNodeIds") List<Long> manageRouteNodeIds, @Param("taskIdExt") String taskIdExt);

    /**
     * 根据创建时间查询任务数量
     *
     * @param firstDay 本月第一天
     * @param now      当前时间
     * @return int
     */
    int selectNodeCountByCreateTime(@Param("firstDay") LocalDate firstDay, @Param("now") LocalDate now);

    /**
     * 推送方式
     *
     * @param phoneDialMethod 人工或ai
     * @param messagePushSign 短信标识
     * @param appletPushSign  微信标识
     * @return BigDecimal
     */
    BigDecimal selectNodeCount(@Param("phoneDialMethod") String phoneDialMethod, @Param("messagePushSign") Long messagePushSign, @Param("appletPushSign") Long appletPushSign);

    /**
     * 节点信息
     *
     * @return PatientAndNode
     */
    List<PatientAndNode> selectNodeExecuteStatus(Long hospitalAgencyId);

	List<PatientFollowUpPlanVo> getFollowUpPlan(FollowUpRateDto queryDto);

    /**
     * 外呼记录查询
     *
     * @param uploadRobotPublishRecordDto 时间信息
     * @return UploadRobotPublishRecordVo
     */
    List<UploadRobotPublishRecordVo> selectTaskContented(UploadRobotPublishRecordDto uploadRobotPublishRecordDto);

    /**
     * 问卷任务统计
     *
     * @param questionnaireTaskStatisticsDto 时间问卷信息
     * @return QuestionnaireTaskStatisticsDto
     */
    List<QuestionnaireTaskStatisticsVo> questionnaireTaskStatistics(QuestionnaireTaskStatisticsDto questionnaireTaskStatisticsDto);

    /**
     * 问卷任务选项统计
     *
     * @param uploadRobotPublishRecordDto 时间信息
     * @return UploadRobotPublishRecordVo
     */
    List<UploadRobotPublishRecordVo> selectTaskOptionContented(UploadRobotPublishRecordDto uploadRobotPublishRecordDto);

    /**
     * 根据节点ids查询同路径的节点ids
     *
     * @param ids 节点ids
     * @return SignPatientManageRouteNode
     */
    List<SignPatientManageRouteNode> selectSameManageRouteNodeIdByNodeIds(Long[] ids);

    /**
     * 根据路径ids查询路径的节点ids
     *
     * @param ids 路径ids
     * @return SignPatientManageRouteNode
     */
    List<SignPatientManageRouteNode> selectSameManageRouteNodeIdByRouteIds(List<Long> ids);

    /**
     * 查询节点id的路径id
     *
     * @param ids
     * @return Long
     */
    List<Long> selectManageRouteIdByIds(Long[] ids);

    /**
     * 查询节点信息
     *
     * @param signPatientManageRouteNode 节点信息
     * @return SignPatientManageRouteNode
     */
    SignPatientManageRouteNode selectSignPatientManageRouteNode(SignPatientManageRouteNode signPatientManageRouteNode);

    /**
     * 查询签约患者管理任务路径节点
     *
     * @param routeId 签约患者管理任务路径节点主键
     * @return 签约患者管理任务路径节点
     */
    List<SignPatientManageRouteNode> selectNodeByRouteId(Long routeId);
}
