package com.ruoyi.inhospvisit.api; import com.ruoyi.common.core.service.dto.PatMedReq; import com.ruoyi.common.core.service.dto.PatMedRes; import com.ruoyi.inhospvisit.domain.PatMedInhosp; import com.ruoyi.inhospvisit.domain.PatMedInhospDTO; import com.ruoyi.inhospvisit.domain.PatMedInhospVO; import java.util.Date; import java.util.List; import java.util.Map; /** * 出入院模块对外基础出入院信息数据访问契约。 * *

为什么单独一个契约,而不是塞进 {@link InhospVisitApi}

* 两者管辖范围不同: * * *

独占边界(本次改造的目标)

* {@code PatMedInhospMapper} 与其 1181 行 XML 已搬入本模块, * 其它模块不得再直接注入该 Mapper;一律经由本契约访问。 * 这样"出入院信息只有一处实现"成为编译期可验证的事实。 * *

⚠️ 与原 Mapper 的语义一致性

* 本契约的每个方法都是 {@code PatMedInhospMapper} 对应方法的纯转发: * 不加工参数、不补默认值、不改时间戳(调用方原本就自行 {@code setCreateTime} 等), * 因此逐方法语义与搬迁前完全一致。 */ public interface InhospVisitDataService { // ==================== 查询 ==================== /** * 按主键查询出入院记录。 * * @param inhospid 出入院记录主键 * @return 记录,不存在返回 {@code null} */ PatMedInhosp selectPatMedInhospByInhospid(Long inhospid); /** * 按实体字段做等值条件查询。 * * @param patMedInhosp 查询条件(非 null 字段参与过滤) * @return 记录集合,无匹配返回空集合 */ List selectPatMedInhosp(PatMedInhosp patMedInhosp); /** * 按患者编号 + 出院日期查询出院记录(出院时间只比较到天)。 * * @param patno 患者编号 * @param dayStart 查询日期当天 00:00:00 * @param dayEnd 查询日期的次日 00:00:00 * @return 出院记录集合,按 inhospid 倒序 */ List selectOutInhospByPatnoAndOutDate(String patno, Date dayStart, Date dayEnd); /** * 查询患者标签(单患者,GROUP_CONCAT 拼接)。 * * @param patid 患者档案id * @return 标签串,无标签返回 {@code null} */ String getTagnameBypatid(Long patid); /** * 批量查询患者标签。 * * @param patids 患者档案id集合,调用方须保证非空且已去重 * @return 每行含 {@code patid}、{@code tagname} 两个 key */ List> getTagnameByPatids(List patids); /** * 通用列表查询(最常用入口)。 * * @param patMedInhosp 查询条件 * @return 记录集合 */ List selectPatMedInhospList(PatMedInhosp patMedInhosp); /** * 按住院流水号查询。 * * @param patMedInhosp 查询条件(含 serialnum) * @return 记录集合 */ List selectPatMedInhospListBySerialnum(PatMedInhosp patMedInhosp); /** * 查询某机构下全部在院记录("在院信息刷新"的取数入口)。 *

* 只查 {@code pat_med_inhosp} 自身、只取刷新要用的列(inhospid / serialnum / orgid / * campusid / 科室三列 / 病区三列 / bed_no),不 join 档案表、不按证件号过滤 —— * 否则证件号未补全的在院患者会被静默漏刷新。 *

* 在院口径:{@code inhospstate='0' and del_flag='0'}(与门户"在院患者"列表一致, * 实测在院行 endtime 恒为 null)。 * * @param orgid 机构ID(如 20001001) * @return 在院记录集合,按 inhospid 升序;无数据返回空集合 */ List selectInhospRefreshCandidates(String orgid); /** * 按 VO 条件查询(支持多科室/多病区集合条件)。 * * @param patMedInhospVO 查询条件 * @return 记录集合 */ List selectPatMedInhospListByCondition(PatMedInhospVO patMedInhospVO); /** * 出院/入院人数与随访人次统计(首页 ECharts 用)。 * * @param patMedReq 统计条件 * @return 统计结果 */ PatMedRes selectPatMedInhospCount(PatMedReq patMedReq); /** * 查询三个维度里任意一个仍未处理的出院患者。 * * @return 待处理记录集合 */ List selectNeedProcessList(); /** * 查询患者住院记录(通过入院申请单信息),返回 DTO 列表。 *

* ⚠️ 本方法原样保留了一个原代码缺陷,未做修正: *

     * List<PatMedInhosp> rows = selectPatMedInhospList(query);
     * if (!CollectionUtils.isEmpty(rows)) {
     *     return null;          // ← 查到记录反而返回 null,条件写反了
     * }
     * 
* 后果:查到记录时恒返回 {@code null};查不到记录时返回空列表。 * 也就是说原实现里那段"给每条记录补 finishFlag(是否宣教过)"的循环永远不会执行, * 因此本方法不依赖 {@code service_subtask}(随访子任务表)。 *

* 若将来要修这个缺陷,除了把条件改成 {@code isEmpty},还需要恢复那段补 * {@code finishFlag} 的逻辑(判据:该患者是否存在 {@code service_type="4"} 的子任务), * 届时需要给本模块补一个查询子任务的能力。 *

* 前端当前没有调用该端点(已核对 {@code smartor-web/src})。 * * @param patMedInhosp 查询条件 * @return 见上;缺陷保留,故查到记录时为 {@code null} */ List selectPatMedInhospByApplication(PatMedInhosp patMedInhosp); // ==================== 写入 ==================== /** * 新增出入院记录。 * * @param patMedInhosp 记录({@code createTime}/{@code updateTime} 由调用方设置, * 本方法不代填 —— 与搬迁前一致) * @return 影响行数 */ int insertPatMedInhosp(PatMedInhosp patMedInhosp); /** * 批量新增出入院记录。 * * @param list 记录集合 * @return 影响行数 */ int insertPatMedInhospBatch(List list); /** * 修改出入院记录("传什么更新什么")。 * * @param patMedInhosp 记录(须含主键) * @return 影响行数 */ int updatePatMedInhosp(PatMedInhosp patMedInhosp); /** * 按主键删除。 * * @param inhospid 主键 * @return 影响行数 */ int deletePatMedInhospByInhospid(Long inhospid); /** * 按住院编码删除。 * * @param inhospno 住院编码 * @return 影响行数 */ int deletePatMedInhospByInhospno(String inhospno); /** * 按主键集合批量删除。 * * @param inhospids 主键集合 * @return 影响行数 */ int deletePatMedInhospByInhospids(Long[] inhospids); }