From 15ab71731792909317731198908caeae640debe1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=BF=9E=E9=BE=99=E5=88=9A?= Date: Fri, 21 Aug 2026 14:12:28 +0800 Subject: [PATCH] =?UTF-8?q?perf:=20=E4=B8=89=E6=96=B9=E8=A8=80=20Mapper=20?= =?UTF-8?q?XML=20SQL=20=E4=BC=98=E5=8C=96=EF=BC=88SARG/JOIN/=E6=AD=BB?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=EF=BC=89+=20Solon=20=E5=8F=AF=E7=A9=BA?= =?UTF-8?q?=E5=8F=82=E6=95=B0=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit SQL 优化(结果契约不变,三方言真实测试库回归通过): - 删除 bsm getTotalConclusion/getTotalSuggest 死代码(依赖 Oracle 18c 已移除的 wm_concat,接口未引用,汇总逻辑在应用层) - SARG 优化 13 处:日期列函数包裹(to_char/CONVERT = 年份)改为 范围查询,使医院库日期索引可命中(体检结果表逐年增长, 按身份证查历史接口为主要受益者) - bsm getResultByIdcardAndYearAll/getItemByPeIdAll:每行标量子查询 改 LEFT JOIN pe_unit_dict;逗号 join 改 ANSI 写法 - ya getPhyexamStatus/getPeStatusByIdnoAndYear:巨型 CASE 状态位 表达式从重复计算 6 次提为子查询 status_sum + ISNULL 防 NULL 改写过程修复: - Oracle TO_DATE('2026','YYYY') 默认当前月首日陷阱(实测复现), 改拼接 '-01-01' 完整日期 - getResultByIdNoOrPeId 的可空参数在 Solon 下被当必填, 加 required=false 回归:bsm/nx/ya 三方言年份/日期查询族接口全部通过 Co-Authored-By: Claude --- .../com/hospital/front/api/order/OrderApi.kt | 4 +- .../front/mapper/bsm/BsmOrderMapper.xml | 63 ++++++------ .../front/mapper/nx/NxOrderMapper.xml | 23 +++-- .../front/mapper/ya/YaOrderMapper.xml | 99 +++++++++---------- 4 files changed, 94 insertions(+), 95 deletions(-) diff --git a/src/main/kotlin/com/hospital/front/api/order/OrderApi.kt b/src/main/kotlin/com/hospital/front/api/order/OrderApi.kt index b702cef..12addd2 100644 --- a/src/main/kotlin/com/hospital/front/api/order/OrderApi.kt +++ b/src/main/kotlin/com/hospital/front/api/order/OrderApi.kt @@ -142,8 +142,8 @@ class OrderApi { /** 16. 根据 id_code 或 pe_id 和审查年份查询体检报告 */ @Mapping(value = "/getResultByIdNoOrPeId", method = [MethodType.POST]) fun getResultByIdNoOrPeId( - @Param("idNo") idNo: String?, - @Param("peId") peId: String?, + @Param(value = "idNo", required = false) idNo: String?, + @Param(value = "peId", required = false) peId: String?, @Param("auditYear") auditYear: String, ): Result>> { if (idNo.isNullOrBlank() && peId.isNullOrBlank()) { diff --git a/src/main/resources/com/hospital/front/mapper/bsm/BsmOrderMapper.xml b/src/main/resources/com/hospital/front/mapper/bsm/BsmOrderMapper.xml index ca7a970..5044365 100644 --- a/src/main/resources/com/hospital/front/mapper/bsm/BsmOrderMapper.xml +++ b/src/main/resources/com/hospital/front/mapper/bsm/BsmOrderMapper.xml @@ -166,12 +166,8 @@ where PE_ID = #{peId} and CONCLUSION_TEXT is not null - + - @@ -279,7 +270,8 @@ FROM V_PHYEXAM_RESULT WHERE - to_char( AUDIT_DATE, 'yyyy-mm-dd' ) = #{auditDate} + AUDIT_DATE >= TO_DATE(#{auditDate}, 'YYYY-MM-DD') + and AUDIT_DATE < TO_DATE(#{auditDate}, 'YYYY-MM-DD') + 1 @@ -358,7 +348,8 @@ and PE_ID = #{peId} - and to_char(AUDIT_DATE,'yyyy')=#{auditYear} + and AUDIT_DATE >= TO_DATE(#{auditYear} || '-01-01', 'YYYY-MM-DD') + and AUDIT_DATE < ADD_MONTHS(TO_DATE(#{auditYear} || '-01-01', 'YYYY-MM-DD'), 12) @@ -368,7 +359,8 @@ and ID_NO = #{idNo} - and to_char(PE_PRE_DATE,'yyyy') = to_char(SYSDATE,'yyyy') + and PE_PRE_DATE >= TRUNC(SYSDATE, 'YYYY') + and PE_PRE_DATE < ADD_MONTHS(TRUNC(SYSDATE, 'YYYY'), 12) order by PE_PRE_DATE desc @@ -393,7 +385,8 @@ and ID_NO = #{idNo} - and to_char(PE_PRE_DATE,'yyyy') = to_char(SYSDATE,'yyyy') + and PE_PRE_DATE >= TRUNC(SYSDATE, 'YYYY') + and PE_PRE_DATE < ADD_MONTHS(TRUNC(SYSDATE, 'YYYY'), 12) order by PE_PRE_DATE desc diff --git a/src/main/resources/com/hospital/front/mapper/nx/NxOrderMapper.xml b/src/main/resources/com/hospital/front/mapper/nx/NxOrderMapper.xml index ad6bfb5..7a208a8 100644 --- a/src/main/resources/com/hospital/front/mapper/nx/NxOrderMapper.xml +++ b/src/main/resources/com/hospital/front/mapper/nx/NxOrderMapper.xml @@ -214,7 +214,8 @@ V_PHYEXAM_PE_STATUS WHERE id_no = #{idNo} - AND CONVERT ( VARCHAR ( 4 ), Pe_pre_date, 23 ) = #{year} + AND Pe_pre_date >= CONVERT(DATETIME, #{year} + '-01-01') + AND Pe_pre_date < DATEADD(YEAR, 1, CONVERT(DATETIME, #{year} + '-01-01')) @@ -233,7 +234,8 @@ and ID_NO = #{idNo} - and CONVERT ( VARCHAR ( 4 ), PE_PRE_DATE, 23 ) = CONVERT ( VARCHAR ( 4 ), GETDATE(), 23 ) + and PE_PRE_DATE >= CONVERT(DATETIME, CONVERT(VARCHAR(4), GETDATE(), 23) + '-01-01') + and PE_PRE_DATE < DATEADD(YEAR, 1, CONVERT(DATETIME, CONVERT(VARCHAR(4), GETDATE(), 23) + '-01-01')) order by PE_PRE_DATE desc @@ -251,9 +253,10 @@ and ID_NO = #{idNo} - and CONVERT ( VARCHAR ( 4 ), PE_PRE_DATE, 23 ) = CONVERT ( VARCHAR ( 4 ), GETDATE(), 23 ) + and PE_PRE_DATE >= CONVERT(DATETIME, CONVERT(VARCHAR(4), GETDATE(), 23) + '-01-01') + and PE_PRE_DATE < DATEADD(YEAR, 1, CONVERT(DATETIME, CONVERT(VARCHAR(4), GETDATE(), 23) + '-01-01')) - + @@ -320,7 +325,8 @@ CONVERT(varchar(100),max(PE_QUEUE_DATE),20) PE_QUEUE_DATE, CONVERT(varchar(100),max(AUDIT_DATE),20) AUDIT_DATE from V_PHYEXAM_RESULT - where CONVERT(varchar(100),AUDIT_DATE,23) = #{auditDate} + where AUDIT_DATE >= CONVERT(DATETIME, #{auditDate}) + AND AUDIT_DATE < DATEADD(DAY, 1, CONVERT(DATETIME, #{auditDate})) group by id_no,NAME,PE_ID,UNIT_NAME @@ -376,7 +382,8 @@ and PE_ID = #{peId} - and CONVERT(varchar(4),AUDIT_DATE,23)=#{auditYear} + and AUDIT_DATE >= CONVERT(DATETIME, #{auditYear} + '-01-01') + and AUDIT_DATE < DATEADD(YEAR, 1, CONVERT(DATETIME, #{auditYear} + '-01-01')) group by id_no,NAME,PE_ID,UNIT_NAME diff --git a/src/main/resources/com/hospital/front/mapper/ya/YaOrderMapper.xml b/src/main/resources/com/hospital/front/mapper/ya/YaOrderMapper.xml index 054e3fe..26289ca 100644 --- a/src/main/resources/com/hospital/front/mapper/ya/YaOrderMapper.xml +++ b/src/main/resources/com/hospital/front/mapper/ya/YaOrderMapper.xml @@ -59,32 +59,28 @@ --> @@ -286,7 +281,8 @@ FROM V_TJBGJG WHERE - CONVERT(varchar(100),shsj,23)= #{auditDate} + shsj >= CONVERT(DATETIME, #{auditDate}) + AND shsj < DATEADD(DAY, 1, CONVERT(DATETIME, #{auditDate})) GROUP BY SFZH,XM,TJH,DWMC @@ -342,7 +338,8 @@ and TJH = #{peId} - and CONVERT(varchar(4),shsj,23)=#{auditYear} + and shsj >= CONVERT(DATETIME, #{auditYear} + '-01-01') + and shsj < DATEADD(YEAR, 1, CONVERT(DATETIME, #{auditYear} + '-01-01')) GROUP BY SFZH,XM,TJH,DWMC @@ -357,7 +354,8 @@ and SFZH = #{idNo} - and CONVERT ( VARCHAR ( 4 ), JCWCSJ, 23 ) = CONVERT ( VARCHAR ( 4 ), GETDATE(), 23 ) + and JCWCSJ >= CONVERT(DATETIME, CONVERT(VARCHAR(4), GETDATE(), 23) + '-01-01') + and JCWCSJ < DATEADD(YEAR, 1, CONVERT(DATETIME, CONVERT(VARCHAR(4), GETDATE(), 23) + '-01-01')) order by JCWCSJ desc @@ -390,9 +388,10 @@ and SFZH = #{idNo} - and CONVERT ( VARCHAR ( 4 ), JCWCSJ, 23 ) = CONVERT ( VARCHAR ( 4 ), GETDATE(), 23 ) + and JCWCSJ >= CONVERT(DATETIME, CONVERT(VARCHAR(4), GETDATE(), 23) + '-01-01') + and JCWCSJ < DATEADD(YEAR, 1, CONVERT(DATETIME, CONVERT(VARCHAR(4), GETDATE(), 23) + '-01-01')) - +