NineRiskBoardMapper.xml 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  3. <mapper namespace="cn.iocoder.yudao.module.system.dal.mysql.biz.NineRiskBoardMapper">
  4. <!-- 机构过滤:不传 tenantIds 时交由框架的多租户插件处理 -->
  5. <sql id="tenantFilter">
  6. <if test="reqVO.tenantIds != null and reqVO.tenantIds.length > 0">
  7. AND t.tenant_id IN
  8. <foreach item="id" collection="reqVO.tenantIds" open="(" separator="," close=")">
  9. #{id}
  10. </foreach>
  11. </if>
  12. </sql>
  13. <!--
  14. 九防评估扁平化明细。
  15. 9 张九防表结构一致(elder_id / assessor / assess_date / risk_level / assess_score / tenant_id),
  16. 因此可用 UNION ALL 合并为一张「虚拟宽表」,再统一关联 elderly_info 补充长者档案,
  17. 并沿床位链路关联 org_build_bed / org_build_room / org_build_floor / org_build 取得位置信息。
  18. 楼栋、楼层过滤与所有看板指标都基于这一次查询完成。
  19. -->
  20. <select id="selectAssessFlatList"
  21. resultType="cn.iocoder.yudao.module.system.dal.mysql.biz.bo.NineRiskAssessFlatBO">
  22. SELECT
  23. a.assessId,
  24. a.itemCode,
  25. a.elderId,
  26. a.assessor,
  27. a.assessDate,
  28. a.riskLevel,
  29. a.assessScore,
  30. ei.elder_name AS elderName,
  31. ei.elder_sex AS elderSex,
  32. ei.elder_age AS elderAge,
  33. ei.nurse_level_id AS nurseLevelId,
  34. ei.nurse_level_name AS nurseLevelName,
  35. <!-- 楼栋、楼层的 id 与名称取自同一条关联链路,避免热力图分组键与展示名称对不上 -->
  36. ob.id AS buildId,
  37. ob.build_name AS buildName,
  38. obf.id AS floorId,
  39. obf.floor_name AS floorName,
  40. obb.bed_name AS bedName,
  41. ei.contract_number AS contractNumber
  42. FROM (
  43. <include refid="unionAllAssess"/>
  44. ) a
  45. INNER JOIN elderly_info ei ON ei.id = a.elderId AND ei.deleted = 0
  46. <!--
  47. 楼栋、楼层、床位名称统一从各自的主表取,不使用 elderly_info 上冗余的
  48. build_name / floor_name / bed_name,避免主表改名后看板展示到过期数据。
  49. 沿用项目既有写法:从长者的 bed_id 出发,按 床位 -> 房间 -> 楼层 -> 楼栋 逐级关联,
  50. 并带上 tenant_id 保证多租户隔离。一律用 LEFT JOIN,
  51. 长者未分配床位时仍应计入统计,只是名称为空。
  52. -->
  53. LEFT JOIN org_build_bed obb ON obb.id = ei.bed_id AND obb.tenant_id = ei.tenant_id
  54. LEFT JOIN org_build_room obr ON obr.id = obb.room_id AND obr.tenant_id = obb.tenant_id
  55. LEFT JOIN org_build_floor obf ON obf.id = obr.floor_id AND obf.tenant_id = obr.tenant_id
  56. LEFT JOIN org_build ob ON ob.id = obf.build_id AND ob.tenant_id = obf.tenant_id
  57. <where>
  58. <!-- 楼栋过滤,不传即全部;与展示口径一致,走床位关联链路而非 elderly_info 冗余字段 -->
  59. <if test="reqVO.buildId != null">
  60. AND obf.build_id = #{reqVO.buildId}
  61. </if>
  62. <!-- 楼层过滤,不传即全部 -->
  63. <if test="reqVO.floorId != null">
  64. AND obr.floor_id = #{reqVO.floorId}
  65. </if>
  66. <!-- 仅统计在住长者 -->
  67. AND ei.in_status = 1
  68. <if test="trendStartDay != null">
  69. AND (a.assessDate IS NULL OR a.assessDate &gt;= #{trendStartDay})
  70. </if>
  71. </where>
  72. <!--
  73. 同一长者在同一张九防表可能有多条记录,这里按「长者 + 九防项 + 评估日期 + 主键」排序,
  74. 便于上层按顺序取到每个「长者 + 九防项」的最新一条;月度趋势仍使用全量历史数据
  75. -->
  76. ORDER BY a.elderId, a.itemCode, a.assessDate, a.assessId
  77. </select>
  78. <!-- 9 张九防评估表的 UNION ALL;itemCode 与 NineRiskItemEnum 的 code 一一对应 -->
  79. <sql id="unionAllAssess">
  80. SELECT t.id AS assessId, 'fallDown' AS itemCode, t.elder_id AS elderId, t.assessor AS assessor,
  81. t.assess_date AS assessDate, t.risk_level AS riskLevel, t.assess_score AS assessScore
  82. FROM elderly_fall_down t WHERE 1 = 1 <include refid="tenantFilter"/>
  83. UNION ALL
  84. SELECT t.id, 'pressureSores', t.elder_id, t.assessor,
  85. t.assess_date, t.risk_level, t.assess_score
  86. FROM elderly_pressure_sores t WHERE 1 = 1 <include refid="tenantFilter"/>
  87. UNION ALL
  88. SELECT t.id, 'fallPreventionMeasures', t.elder_id, t.assessor,
  89. t.assess_date, t.risk_level, t.assess_score
  90. FROM elderly_fall_prevention_measures t WHERE 1 = 1 <include refid="tenantFilter"/>
  91. UNION ALL
  92. SELECT t.id, 'empyrosis', t.elder_id, t.assessor,
  93. t.assess_date, t.risk_level, t.assess_score
  94. FROM elderly_empyrosis t WHERE 1 = 1 <include refid="tenantFilter"/>
  95. UNION ALL
  96. SELECT t.id, 'wanderAway', t.elder_id, t.assessor,
  97. t.assess_date, t.risk_level, t.assess_score
  98. FROM elderly_wander_away t WHERE 1 = 1 <include refid="tenantFilter"/>
  99. UNION ALL
  100. SELECT t.id, 'suicideRisk', t.elder_id, t.assessor,
  101. t.assess_date, t.risk_level, t.assess_score
  102. FROM elderly_assess_suicide_risk t WHERE 1 = 1 <include refid="tenantFilter"/>
  103. UNION ALL
  104. SELECT t.id, 'antiEntertainment', t.elder_id, t.assessor,
  105. t.assess_date, t.risk_level, t.assess_score
  106. FROM elderly_anti_entertainment t WHERE 1 = 1 <include refid="tenantFilter"/>
  107. UNION ALL
  108. SELECT t.id, 'simpleMentalState', t.elder_id, t.assessor,
  109. t.assess_date, t.risk_level, t.assess_score
  110. FROM elderly_assess_simple_mental_state t WHERE 1 = 1 <include refid="tenantFilter"/>
  111. UNION ALL
  112. SELECT t.id, 'asphyxiationByChoking', t.elder_id, t.assessor,
  113. t.assess_date, t.risk_level, t.assess_score
  114. FROM elderly_asphyxiation_by_choking t WHERE 1 = 1 <include refid="tenantFilter"/>
  115. </sql>
  116. <!--
  117. 知情书统计。风险知情书不属于九防,单独统计;
  118. 签署与否以 second_elder_sign 是否为空判断。
  119. -->
  120. <select id="selectDisclosureStat" resultType="java.util.Map">
  121. SELECT
  122. COUNT(*) AS total,
  123. SUM(CASE WHEN t.second_elder_sign IS NOT NULL AND t.second_elder_sign != ''
  124. THEN 1 ELSE 0 END) AS signedCount
  125. FROM elderly_risk_disclosure_statement t
  126. INNER JOIN elderly_info ei ON ei.id = t.elder_id AND ei.deleted = 0
  127. <!-- 楼栋、楼层过滤口径与 selectAssessFlatList 保持一致,同样走床位关联链路 -->
  128. LEFT JOIN org_build_bed obb ON obb.id = ei.bed_id AND obb.tenant_id = ei.tenant_id
  129. LEFT JOIN org_build_room obr ON obr.id = obb.room_id AND obr.tenant_id = obb.tenant_id
  130. LEFT JOIN org_build_floor obf ON obf.id = obr.floor_id AND obf.tenant_id = obr.tenant_id
  131. <where>
  132. <if test="reqVO.buildId != null">
  133. AND obf.build_id = #{reqVO.buildId}
  134. </if>
  135. <if test="reqVO.floorId != null">
  136. AND obr.floor_id = #{reqVO.floorId}
  137. </if>
  138. AND ei.in_status = 1
  139. <include refid="tenantFilter"/>
  140. </where>
  141. </select>
  142. </mapper>