fix: 优化过鱼到数统计逻辑

This commit is contained in:
tangwei 2026-06-05 13:16:25 +08:00
parent de8409bde4
commit abb685258c

View File

@ -21,25 +21,64 @@
<sql id="statisticsQuery"> <sql id="statisticsQuery">
WITH WITH
active_rivers AS (
SELECT
RVCD,
RVNM,
PRVCD,
GRD,
PATH,
ORDER_INDEX
FROM SD_RVCD_DIC
WHERE NVL(ENABLED, 1) = 1
AND NVL(IS_DELETED, 0) = 0
),
river_display AS (
SELECT
d.RVCD,
d.RVNM,
d.PRVCD,
d.GRD,
d.PATH,
d.ORDER_INDEX,
LTRIM(SYS_CONNECT_BY_PATH(d.RVNM, '-'), '-') AS BASIN_NAME,
SYS_CONNECT_BY_PATH(LPAD(NVL(d.ORDER_INDEX, 999999999), 10, '0'), '/') AS BASIN_ORDER_PATH
FROM active_rivers d
START WITH d.PRVCD IS NULL OR d.PRVCD = '' OR d.PRVCD = '0'
CONNECT BY PRIOR d.RVCD = d.PRVCD
ORDER SIBLINGS BY d.ORDER_INDEX ASC, d.RVCD ASC
),
river_relation AS (
SELECT
CONNECT_BY_ROOT d.RVCD AS ROOT_RVCD,
d.RVCD AS DESC_RVCD
FROM active_rivers d
START WITH d.PRVCD IS NULL OR d.PRVCD = '' OR d.PRVCD = '0'
CONNECT BY PRIOR d.RVCD = d.PRVCD
),
user_scope_detail AS ( user_scope_detail AS (
SELECT DISTINCT SELECT DISTINCT
su.ID AS USER_ID, su.ID AS USER_ID,
e.STCD AS STATION_CODE, e.STCD AS STATION_CODE,
h.HBRVCD AS BASIN_CODE, r.RVCD AS BASIN_CODE,
h.HBRVNM AS BASIN_NAME, r.BASIN_NAME AS BASIN_NAME,
e.ENNM AS STATION_NAME e.ENNM AS STATION_NAME,
FROM QGC_REFA.SYS_USER su r.BASIN_ORDER_PATH AS BASIN_ORDER_PATH
JOIN QGC_REFA.SYS_USER_DATA_SCOPE sud FROM SYS_USER su
JOIN SYS_USER_DATA_SCOPE sud
ON su.ID = sud.USER_ID ON su.ID = sud.USER_ID
AND sud.STATUS = 1 AND sud.STATUS = 1
AND sud.ORG_TYPE = 'HBRVCD' AND sud.ORG_TYPE IN ('RVCD', 'HBRVCD')
JOIN QGC_REFA.SD_HBRV_DIC h JOIN river_relation rr
ON sud.ORG_ID = h.HBRVCD ON sud.ORG_ID = rr.ROOT_RVCD
AND h.ENABLED = 1 JOIN SD_ENGINFO_B_H e
AND h.IS_DELETED = 0 ON e.REACHCD = rr.DESC_RVCD
JOIN QGC_REFA.SD_ENGINFO_B_H e
ON e.HBRVCD = h.HBRVCD
AND e.USFL = 1 AND e.USFL = 1
JOIN river_display r
ON e.REACHCD = r.RVCD
WHERE su.STATUS = 1 WHERE su.STATUS = 1
AND su.REG_STATUS IN ('PENDING', 'APPROVED', 'REJECTED') AND su.REG_STATUS IN ('PENDING', 'APPROVED', 'REJECTED')
@ -48,21 +87,20 @@
SELECT DISTINCT SELECT DISTINCT
su.ID AS USER_ID, su.ID AS USER_ID,
e.STCD AS STATION_CODE, e.STCD AS STATION_CODE,
h.HBRVCD AS BASIN_CODE, r.RVCD AS BASIN_CODE,
h.HBRVNM AS BASIN_NAME, r.BASIN_NAME AS BASIN_NAME,
e.ENNM AS STATION_NAME e.ENNM AS STATION_NAME,
FROM QGC_REFA.SYS_USER su r.BASIN_ORDER_PATH AS BASIN_ORDER_PATH
JOIN QGC_REFA.SYS_USER_DATA_SCOPE sud FROM SYS_USER su
JOIN SYS_USER_DATA_SCOPE sud
ON su.ID = sud.USER_ID ON su.ID = sud.USER_ID
AND sud.STATUS = 1 AND sud.STATUS = 1
AND sud.ORG_TYPE = 'STATION' AND sud.ORG_TYPE = 'STATION'
JOIN QGC_REFA.SD_ENGINFO_B_H e JOIN SD_ENGINFO_B_H e
ON sud.ORG_ID = e.STCD ON sud.ORG_ID = e.STCD
AND e.USFL = 1 AND e.USFL = 1
JOIN QGC_REFA.SD_HBRV_DIC h JOIN river_display r
ON e.HBRVCD = h.HBRVCD ON e.REACHCD = r.RVCD
AND h.ENABLED = 1
AND h.IS_DELETED = 0
WHERE su.STATUS = 1 WHERE su.STATUS = 1
AND su.REG_STATUS IN ('PENDING', 'APPROVED', 'REJECTED') AND su.REG_STATUS IN ('PENDING', 'APPROVED', 'REJECTED')
), ),
@ -81,7 +119,7 @@
), ),
distinct_basins AS ( distinct_basins AS (
SELECT DISTINCT USER_ID,BASIN_CODE, BASIN_NAME SELECT DISTINCT USER_ID, BASIN_CODE, BASIN_NAME, BASIN_ORDER_PATH
FROM user_scope_detail FROM user_scope_detail
WHERE USER_ID IN (SELECT USER_ID FROM filtered_users) WHERE USER_ID IN (SELECT USER_ID FROM filtered_users)
), ),
@ -96,11 +134,12 @@
SELECT SELECT
USER_ID, USER_ID,
RTRIM( RTRIM(
XMLAGG(XMLELEMENT(E, BASIN_NAME || ',') ORDER BY BASIN_NAME) XMLAGG(XMLELEMENT(E, BASIN_NAME || ',') ORDER BY BASIN_ORDER_PATH, BASIN_CODE)
.EXTRACT('//text()').GETCLOBVAL(), .EXTRACT('//text()').GETCLOBVAL(),
',' ','
) AS BASIN_NAMES, ) AS BASIN_NAMES,
MIN(BASIN_CODE) AS MIN_BASIN_CODE -- 辅助排序字段VARCHAR2 MIN(BASIN_CODE) AS MIN_BASIN_CODE,
MIN(BASIN_ORDER_PATH) AS MIN_BASIN_ORDER_PATH
FROM distinct_basins FROM distinct_basins
GROUP BY USER_ID GROUP BY USER_ID
), ),
@ -125,7 +164,7 @@
MIN(STRDT) AS MIN_STRDT, MIN(STRDT) AS MIN_STRDT,
MAX(STRDT) AS MAX_ENDDT, MAX(STRDT) AS MAX_ENDDT,
SUM(FCNT) AS TOTAL_FCNT SUM(FCNT) AS TOTAL_FCNT
FROM QGC_REFA.FISH_DRAFT_DATA FROM FISH_DRAFT_DATA
WHERE DELETED_FLAG = 0 WHERE DELETED_FLAG = 0
AND STATUS IN ('PENDING','APPROVED') AND STATUS IN ('PENDING','APPROVED')
GROUP BY CREATED_BY, TO_CHAR(STRDT, 'YYYY-MM') GROUP BY CREATED_BY, TO_CHAR(STRDT, 'YYYY-MM')
@ -140,7 +179,10 @@
su.REAL_NAME, su.REAL_NAME,
su.PHONE, su.PHONE,
su.NICKNAME || '/' || su.PHONE AS CONTACT, su.NICKNAME || '/' || su.PHONE AS CONTACT,
ba.MIN_BASIN_CODE AS BASIN_CODE,
sa.MIN_STATION_CODE AS STATION_CODE,
ba.MIN_BASIN_CODE, ba.MIN_BASIN_CODE,
ba.MIN_BASIN_ORDER_PATH,
sa.MIN_STATION_CODE, sa.MIN_STATION_CODE,
ba.BASIN_NAMES, ba.BASIN_NAMES,
sa.STATION_NAMES, sa.STATION_NAMES,
@ -150,7 +192,7 @@
fm.TOTAL_FCNT, fm.TOTAL_FCNT,
CASE WHEN fm.CREATED_BY IS NOT NULL THEN 1 ELSE 0 END AS HAS_DATA CASE WHEN fm.CREATED_BY IS NOT NULL THEN 1 ELSE 0 END AS HAS_DATA
FROM all_users u FROM all_users u
JOIN QGC_REFA.SYS_USER su JOIN SYS_USER su
ON u.USER_ID = su.ID ON u.USER_ID = su.ID
LEFT JOIN basin_agg ba LEFT JOIN basin_agg ba
ON u.USER_ID = ba.USER_ID ON u.USER_ID = ba.USER_ID
@ -180,10 +222,10 @@
SELECT * FROM ( SELECT * FROM (
SELECT SELECT
t.*, t.*,
ROW_NUMBER() OVER (ORDER BY t.MIN_BASIN_CODE,t.MIN_STATION_CODE,t.REPORT_MONTH,t.MIN_STRDT) AS rn ROW_NUMBER() OVER (ORDER BY t.MIN_BASIN_ORDER_PATH,t.MIN_STATION_CODE,t.REPORT_MONTH,t.MIN_STRDT) AS rn
FROM ( FROM (
<include refid="statisticsQuery"/> <include refid="statisticsQuery"/>
) t ORDER BY t.MIN_BASIN_CODE,t.MIN_STATION_CODE,t.REPORT_MONTH,t.MIN_STRDT ) t ORDER BY t.MIN_BASIN_ORDER_PATH,t.MIN_STATION_CODE,t.REPORT_MONTH,t.MIN_STRDT
) WHERE rn BETWEEN #{startRow}+1 AND #{endRow} ) WHERE rn BETWEEN #{startRow}+1 AND #{endRow}
</select> </select>
<select id="countStatistics" resultType="int"> <select id="countStatistics" resultType="int">
@ -192,4 +234,4 @@
) )
</select> </select>
</mapper> </mapper>