| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147 |
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
- <mapper namespace="cn.iocoder.yudao.module.system.dal.mysql.biz.NineRiskBoardMapper">
- <!-- 机构过滤:不传 tenantIds 时交由框架的多租户插件处理 -->
- <sql id="tenantFilter">
- <if test="reqVO.tenantIds != null and reqVO.tenantIds.length > 0">
- AND t.tenant_id IN
- <foreach item="id" collection="reqVO.tenantIds" open="(" separator="," close=")">
- #{id}
- </foreach>
- </if>
- </sql>
- <!--
- 九防评估扁平化明细。
- 9 张九防表结构一致(elder_id / assessor / assess_date / risk_level / assess_score / tenant_id),
- 因此可用 UNION ALL 合并为一张「虚拟宽表」,再统一关联 elderly_info 补充长者档案,
- 并沿床位链路关联 org_build_bed / org_build_room / org_build_floor / org_build 取得位置信息。
- 楼栋、楼层过滤与所有看板指标都基于这一次查询完成。
- -->
- <select id="selectAssessFlatList"
- resultType="cn.iocoder.yudao.module.system.dal.mysql.biz.bo.NineRiskAssessFlatBO">
- SELECT
- a.assessId,
- a.itemCode,
- a.elderId,
- a.assessor,
- a.assessDate,
- a.riskLevel,
- a.assessScore,
- ei.elder_name AS elderName,
- ei.elder_sex AS elderSex,
- ei.elder_age AS elderAge,
- ei.nurse_level_id AS nurseLevelId,
- ei.nurse_level_name AS nurseLevelName,
- <!-- 楼栋、楼层的 id 与名称取自同一条关联链路,避免热力图分组键与展示名称对不上 -->
- ob.id AS buildId,
- ob.build_name AS buildName,
- obf.id AS floorId,
- obf.floor_name AS floorName,
- obb.bed_name AS bedName,
- ei.contract_number AS contractNumber
- FROM (
- <include refid="unionAllAssess"/>
- ) a
- INNER JOIN elderly_info ei ON ei.id = a.elderId AND ei.deleted = 0
- <!--
- 楼栋、楼层、床位名称统一从各自的主表取,不使用 elderly_info 上冗余的
- build_name / floor_name / bed_name,避免主表改名后看板展示到过期数据。
- 沿用项目既有写法:从长者的 bed_id 出发,按 床位 -> 房间 -> 楼层 -> 楼栋 逐级关联,
- 并带上 tenant_id 保证多租户隔离。一律用 LEFT JOIN,
- 长者未分配床位时仍应计入统计,只是名称为空。
- -->
- LEFT JOIN org_build_bed obb ON obb.id = ei.bed_id AND obb.tenant_id = ei.tenant_id
- LEFT JOIN org_build_room obr ON obr.id = obb.room_id AND obr.tenant_id = obb.tenant_id
- LEFT JOIN org_build_floor obf ON obf.id = obr.floor_id AND obf.tenant_id = obr.tenant_id
- LEFT JOIN org_build ob ON ob.id = obf.build_id AND ob.tenant_id = obf.tenant_id
- <where>
- <!-- 楼栋过滤,不传即全部;与展示口径一致,走床位关联链路而非 elderly_info 冗余字段 -->
- <if test="reqVO.buildId != null">
- AND obf.build_id = #{reqVO.buildId}
- </if>
- <!-- 楼层过滤,不传即全部 -->
- <if test="reqVO.floorId != null">
- AND obr.floor_id = #{reqVO.floorId}
- </if>
- <!-- 仅统计在住长者 -->
- AND ei.in_status = 1
- <if test="trendStartDay != null">
- AND (a.assessDate IS NULL OR a.assessDate >= #{trendStartDay})
- </if>
- </where>
- <!--
- 同一长者在同一张九防表可能有多条记录,这里按「长者 + 九防项 + 评估日期 + 主键」排序,
- 便于上层按顺序取到每个「长者 + 九防项」的最新一条;月度趋势仍使用全量历史数据
- -->
- ORDER BY a.elderId, a.itemCode, a.assessDate, a.assessId
- </select>
- <!-- 9 张九防评估表的 UNION ALL;itemCode 与 NineRiskItemEnum 的 code 一一对应 -->
- <sql id="unionAllAssess">
- SELECT t.id AS assessId, 'fallDown' AS itemCode, t.elder_id AS elderId, t.assessor AS assessor,
- t.assess_date AS assessDate, t.risk_level AS riskLevel, t.assess_score AS assessScore
- FROM elderly_fall_down t WHERE 1 = 1 <include refid="tenantFilter"/>
- UNION ALL
- SELECT t.id, 'pressureSores', t.elder_id, t.assessor,
- t.assess_date, t.risk_level, t.assess_score
- FROM elderly_pressure_sores t WHERE 1 = 1 <include refid="tenantFilter"/>
- UNION ALL
- SELECT t.id, 'fallPreventionMeasures', t.elder_id, t.assessor,
- t.assess_date, t.risk_level, t.assess_score
- FROM elderly_fall_prevention_measures t WHERE 1 = 1 <include refid="tenantFilter"/>
- UNION ALL
- SELECT t.id, 'empyrosis', t.elder_id, t.assessor,
- t.assess_date, t.risk_level, t.assess_score
- FROM elderly_empyrosis t WHERE 1 = 1 <include refid="tenantFilter"/>
- UNION ALL
- SELECT t.id, 'wanderAway', t.elder_id, t.assessor,
- t.assess_date, t.risk_level, t.assess_score
- FROM elderly_wander_away t WHERE 1 = 1 <include refid="tenantFilter"/>
- UNION ALL
- SELECT t.id, 'suicideRisk', t.elder_id, t.assessor,
- t.assess_date, t.risk_level, t.assess_score
- FROM elderly_assess_suicide_risk t WHERE 1 = 1 <include refid="tenantFilter"/>
- UNION ALL
- SELECT t.id, 'antiEntertainment', t.elder_id, t.assessor,
- t.assess_date, t.risk_level, t.assess_score
- FROM elderly_anti_entertainment t WHERE 1 = 1 <include refid="tenantFilter"/>
- UNION ALL
- SELECT t.id, 'simpleMentalState', t.elder_id, t.assessor,
- t.assess_date, t.risk_level, t.assess_score
- FROM elderly_assess_simple_mental_state t WHERE 1 = 1 <include refid="tenantFilter"/>
- UNION ALL
- SELECT t.id, 'asphyxiationByChoking', t.elder_id, t.assessor,
- t.assess_date, t.risk_level, t.assess_score
- FROM elderly_asphyxiation_by_choking t WHERE 1 = 1 <include refid="tenantFilter"/>
- </sql>
- <!--
- 知情书统计。风险知情书不属于九防,单独统计;
- 签署与否以 second_elder_sign 是否为空判断。
- -->
- <select id="selectDisclosureStat" resultType="java.util.Map">
- SELECT
- COUNT(*) AS total,
- SUM(CASE WHEN t.second_elder_sign IS NOT NULL AND t.second_elder_sign != ''
- THEN 1 ELSE 0 END) AS signedCount
- FROM elderly_risk_disclosure_statement t
- INNER JOIN elderly_info ei ON ei.id = t.elder_id AND ei.deleted = 0
- <!-- 楼栋、楼层过滤口径与 selectAssessFlatList 保持一致,同样走床位关联链路 -->
- LEFT JOIN org_build_bed obb ON obb.id = ei.bed_id AND obb.tenant_id = ei.tenant_id
- LEFT JOIN org_build_room obr ON obr.id = obb.room_id AND obr.tenant_id = obb.tenant_id
- LEFT JOIN org_build_floor obf ON obf.id = obr.floor_id AND obf.tenant_id = obr.tenant_id
- <where>
- <if test="reqVO.buildId != null">
- AND obf.build_id = #{reqVO.buildId}
- </if>
- <if test="reqVO.floorId != null">
- AND obr.floor_id = #{reqVO.floorId}
- </if>
- AND ei.in_status = 1
- <include refid="tenantFilter"/>
- </where>
- </select>
- </mapper>
|