2026-03-19 18:00:55 +08:00
<?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= "com.zcloud.primeport.persistence.mapper.ClosedAreaMapper" >
<select id= "getCountByHgAuthArea" resultType= "com.zcloud.primeport.persistence.dataobject.ClosedAreaDO" >
SELECT
2026-03-20 16:30:58 +08:00
dic.dict_label hg_auth_area_name,
dic.dict_value hg_auth_area,
2026-03-19 18:00:55 +08:00
IFNULL(tmp.totalChildAreasCount,0) total_area_count,
IFNULL(tmp.totalCorpCount,0) total_corp_count
FROM
`jjb-saas-config`.`conf_dict_tree` dic
LEFT JOIN (
SELECT
ca.hg_auth_area,
COUNT( ca.id ) totalChildAreasCount,
COUNT( DISTINCT ca.jurisdictional_corp_id ) totalCorpCount
FROM
`closed_area` ca
WHERE
ca.delete_enum = 'FALSE'
GROUP BY
ca.hg_auth_area) tmp on CONVERT(tmp.hg_auth_area USING utf8mb4) = CONVERT( dic.dict_value USING utf8mb4)
WHERE
dic.parent_id = ( SELECT id FROM `jjb-saas-config`.`conf_dict_tree` dicp WHERE dicp.dict_value = 'HG_AUTH_AREA' AND dicp.delete_enum = 'FALSE' )
AND dic.delete_enum = 'FALSE'
2026-04-29 18:12:08 +08:00
AND dic.dict_value != 'QHD_GQ_DXGQ'
2026-03-19 18:00:55 +08:00
ORDER BY dic.id
</select>
<select id= "listPage" resultType= "com.zcloud.primeport.persistence.dataobject.ClosedAreaDO" >
SELECT
c.*,
CASE
WHEN COUNT( child.id ) > 0 THEN
1 ELSE 2
END AS has_child
FROM
closed_area c
LEFT JOIN closed_area child ON c.id = child.parent_id
AND child.delete_enum = 'FALSE'
WHERE
c.delete_enum = 'FALSE'
2026-03-20 16:14:27 +08:00
<if test= "params.parentId != null" >
AND c.parent_id = #{params.parentId}
2026-03-19 18:00:55 +08:00
</if>
2026-07-03 15:01:43 +08:00
<if test= "params.closedArea != null" >
AND c.hg_auth_area = #{params.closedArea}
</if>
2026-03-20 16:35:50 +08:00
<if test= "params.hgAuthArea != null and params.hgAuthArea != ''" >
AND C.hg_auth_area = #{params.hgAuthArea}
</if>
2026-03-20 16:14:27 +08:00
<if test= "params.closedAreaName != null and params.closedAreaName != ''" >
AND C.closed_area_name LIKE CONCAT('%', #{params.closedAreaName}, '%')
2026-03-19 18:00:55 +08:00
</if>
2026-08-13 14:07:08 +08:00
<if test= "params.corpinfoId != null" >
AND c.jurisdictional_corp_id = #{params.corpinfoId}
</if>
2026-03-19 18:00:55 +08:00
GROUP BY
c.id
ORDER BY
c.id
</select>
2026-07-02 08:47:43 +08:00
<select id= "listCount" resultType= "com.zcloud.primeport.persistence.dataobject.ClosedAreaCountDO" >
SELECT
c.*,
CASE WHEN child_cnt > 0 THEN 1 ELSE 2 END AS has_child,
IFNULL(person_cnt, 0) AS person_count,
IFNULL(car_cnt, 0) AS car_count
FROM
closed_area c
LEFT JOIN (
SELECT parent_id, COUNT(id) child_cnt
FROM closed_area
WHERE delete_enum = 'FALSE'
GROUP BY parent_id
) child ON c.id = child.parent_id
-- 人员申请数量预统计
LEFT JOIN (
SELECT closed_area_id, COUNT(DISTINCT id) person_cnt
FROM closed_area_person_apply
WHERE delete_enum = 'FALSE'
GROUP BY closed_area_id
) cpa ON c.id = cpa.closed_area_id
-- 车辆申请数量预统计
LEFT JOIN (
SELECT closed_area_id, COUNT(DISTINCT id) car_cnt
FROM closed_area_car_apply
WHERE delete_enum = 'FALSE'
GROUP BY closed_area_id
) cca ON c.id = cca.closed_area_id
WHERE
c.delete_enum = 'FALSE'
<if test= "params.corpId != null" >
AND c.tenant_id = #{params.corpId}
</if>
<if test= "params.parentId != null" >
AND c.parent_id = #{params.parentId}
</if>
<if test= "params.closedAreaName != null and params.closedAreaName != ''" >
AND C.closed_area_name LIKE CONCAT('%', #{params.closedAreaName}, '%')
</if>
GROUP BY
c.id
ORDER BY
c.id
</select>
2026-08-28 13:35:58 +08:00
<!-- 近七天封闭区域现存人员、车辆:按同一区域同一身份最后一条进出记录判断,最后为进才计入 -->
2026-08-21 11:16:14 +08:00
<select id= "listPositionCount" resultType= "com.zcloud.primeport.persistence.dataobject.ClosedAreaCountDO" >
2026-08-28 13:35:58 +08:00
WITH RECURSIVE area_tree AS (
SELECT id AS ancestor_area_id, id AS area_id
FROM closed_area
WHERE delete_enum = 'FALSE'
UNION ALL
SELECT area_tree.ancestor_area_id, child.id AS area_id
FROM area_tree
INNER JOIN closed_area child ON child.parent_id = area_tree.area_id
AND child.delete_enum = 'FALSE'
),
person_event_area AS (
SELECT DISTINCT
m.closed_area_id,
har.id,
har.person_id,
har.enter_or_exit,
har.event_time
FROM hk_access_record har
INNER JOIN mkmj_gate mg ON har.door_index_code = mg.hk_index_code
AND mg.delete_enum = 'FALSE'
INNER JOIN mkmj m ON mg.mkmj_id = m.id
AND m.delete_enum = 'FALSE'
WHERE har.delete_enum = 'FALSE'
AND har.person_id IS NOT NULL
AND har.person_id != ''
AND har.enter_or_exit IN (1, 2)
AND har.event_time > = DATE_SUB(UTC_TIMESTAMP() + INTERVAL 8 HOUR, INTERVAL 7 DAY)
),
person_last_record AS (
SELECT
person_event_area.closed_area_id,
person_event_area.person_id,
person_event_area.enter_or_exit,
ROW_NUMBER() OVER (
PARTITION BY person_event_area.person_id
ORDER BY person_event_area.event_time DESC, person_event_area.id DESC
) AS row_num
FROM person_event_area
),
unique_park_area AS (
SELECT
mg.kh_park_sys_code,
MAX(m.closed_area_id) AS closed_area_id
FROM mkmj_gate mg
INNER JOIN mkmj m ON mg.mkmj_id = m.id
AND m.delete_enum = 'FALSE'
WHERE mg.delete_enum = 'FALSE'
AND mg.kh_park_sys_code IS NOT NULL
AND mg.kh_park_sys_code != ''
GROUP BY mg.kh_park_sys_code
HAVING COUNT(DISTINCT m.closed_area_id) = 1
),
vehicle_event_area AS (
SELECT DISTINCT
m.closed_area_id,
hvar.id,
hvar.plate_no,
hvar.enter_or_exit,
hvar.event_time
FROM hk_vehicle_access_record hvar
INNER JOIN mkmj_gate mg ON hvar.lane_index_code = mg.hk_index_code
AND mg.delete_enum = 'FALSE'
INNER JOIN mkmj m ON mg.mkmj_id = m.id
AND m.delete_enum = 'FALSE'
WHERE hvar.delete_enum = 'FALSE'
AND hvar.plate_no IS NOT NULL
AND hvar.plate_no != ''
AND hvar.enter_or_exit IN (0, 1)
AND hvar.event_time > = DATE_SUB(UTC_TIMESTAMP() + INTERVAL 8 HOUR, INTERVAL 7 DAY)
UNION ALL
SELECT
unique_park_area.closed_area_id,
hvar.id,
hvar.plate_no,
hvar.enter_or_exit,
hvar.event_time
FROM hk_vehicle_access_record hvar
INNER JOIN unique_park_area ON hvar.park_syscode = unique_park_area.kh_park_sys_code
WHERE hvar.delete_enum = 'FALSE'
AND hvar.plate_no IS NOT NULL
AND hvar.plate_no != ''
AND hvar.enter_or_exit IN (0, 1)
AND hvar.event_time > = DATE_SUB(UTC_TIMESTAMP() + INTERVAL 8 HOUR, INTERVAL 7 DAY)
AND NOT EXISTS (
SELECT 1
FROM mkmj_gate lane_gate
WHERE lane_gate.hk_index_code = hvar.lane_index_code
AND lane_gate.delete_enum = 'FALSE'
)
),
vehicle_last_record AS (
SELECT
vehicle_event_area.closed_area_id,
vehicle_event_area.plate_no,
vehicle_event_area.enter_or_exit,
ROW_NUMBER() OVER (
PARTITION BY vehicle_event_area.plate_no
ORDER BY vehicle_event_area.event_time DESC, vehicle_event_area.id DESC
) AS row_num
FROM vehicle_event_area
),
person_current_count AS (
SELECT
area_tree.ancestor_area_id AS closed_area_id,
COUNT(*) AS person_count
FROM person_last_record
INNER JOIN area_tree ON area_tree.area_id = person_last_record.closed_area_id
WHERE person_last_record.row_num = 1
AND person_last_record.enter_or_exit = 1
GROUP BY area_tree.ancestor_area_id
),
vehicle_current_count AS (
SELECT
area_tree.ancestor_area_id AS closed_area_id,
COUNT(*) AS car_count
FROM vehicle_last_record
INNER JOIN area_tree ON area_tree.area_id = vehicle_last_record.closed_area_id
WHERE vehicle_last_record.row_num = 1
AND vehicle_last_record.enter_or_exit = 0
GROUP BY area_tree.ancestor_area_id
)
2026-08-21 11:16:14 +08:00
SELECT
c.*,
2026-08-28 13:35:58 +08:00
CASE WHEN child_cnt > 0 THEN 1 ELSE 2 END AS has_child,
COALESCE(person_current_count.person_count, 0) AS person_count,
COALESCE(vehicle_current_count.car_count, 0) AS car_count
FROM closed_area c
2026-08-21 11:16:14 +08:00
LEFT JOIN (
2026-08-28 13:35:58 +08:00
SELECT parent_id, COUNT(id) child_cnt
FROM closed_area
WHERE delete_enum = 'FALSE'
GROUP BY parent_id
2026-08-21 11:16:14 +08:00
) child ON c.id = child.parent_id
2026-08-28 13:35:58 +08:00
LEFT JOIN person_current_count ON c.id = person_current_count.closed_area_id
LEFT JOIN vehicle_current_count ON c.id = vehicle_current_count.closed_area_id
WHERE c.delete_enum = 'FALSE'
2026-08-21 11:16:14 +08:00
<if test= "params.corpId != null" >
AND c.jurisdictional_corp_id = #{params.corpId}
</if>
<if test= "params.parentId != null" >
AND c.parent_id = #{params.parentId}
</if>
<if test= "params.closedAreaName != null and params.closedAreaName != ''" >
2026-08-28 13:35:58 +08:00
AND c.closed_area_name LIKE CONCAT('%', #{params.closedAreaName}, '%')
2026-08-21 11:16:14 +08:00
</if>
2026-08-28 13:35:58 +08:00
ORDER BY c.id
2026-08-21 11:16:14 +08:00
</select>
2026-07-27 09:45:38 +08:00
<select id= "corpStat" resultType= "com.zcloud.primeport.persistence.dataobject.ClosedAreaCorpStatDO" >
SELECT
IFNULL(COUNT(DISTINCT ca.id), 0) AS closed_area_count,
IFNULL(COUNT(DISTINCT CASE WHEN mp.passage_type = 'HGKM_MKMJ_PASSAGE_TYPE_CAR' THEN mp.id END), 0) AS car_passage_count,
IFNULL(COUNT(DISTINCT CASE WHEN mp.passage_type = 'HGKM_MKMJ_PASSAGE_TYPE_CAR_R' THEN mp.id END), 0) AS person_passage_count
FROM closed_area ca
LEFT JOIN mkmj m ON ca.id = m.closed_area_id AND m.delete_enum = 'FALSE'
LEFT JOIN mkmj_passage mp ON m.id = mp.mkmj_id AND mp.delete_enum = 'FALSE'
WHERE ca.delete_enum = 'FALSE'
<if test= "params.corpinfoId != null" >
AND ca.jurisdictional_corp_id = #{params.corpinfoId}
</if>
</select>
2026-08-19 16:55:53 +08:00
<!-- 封闭区域人员进出记录(含子区域递归查询) -->
2026-08-28 13:35:58 +08:00
<sql id= "personInOutTimeFilters" >
2026-08-19 16:55:53 +08:00
<if test= "params.startTime != null and params.startTime != ''" >
AND har.event_time > = CONCAT(#{params.startTime}, ' 00:00:00')
</if>
<if test= "params.endTime != null and params.endTime != ''" >
AND har.event_time < = CONCAT(#{params.endTime}, ' 23:59:59')
</if>
</sql>
2026-08-28 13:35:58 +08:00
<!-- 全部封闭区域人员进出记录:通过平台人员身份证与海康事件证件号关联 -->
<sql id= "personInOutBaseQuery" >
<choose >
<when test= "params.closedAreaId != null" >
WITH RECURSIVE area_tree AS (
SELECT id FROM closed_area WHERE id = #{params.closedAreaId} AND delete_enum = 'FALSE'
UNION ALL
SELECT ca.id FROM closed_area ca INNER JOIN area_tree at ON ca.parent_id = at.id WHERE ca.delete_enum = 'FALSE'
)
SELECT har.*
FROM hk_access_record har
INNER JOIN mkmj_gate mg ON har.door_index_code = mg.hk_index_code AND mg.delete_enum = 'FALSE'
INNER JOIN mkmj m ON mg.mkmj_id = m.id AND m.delete_enum = 'FALSE'
INNER JOIN area_tree at ON m.closed_area_id = at.id
WHERE har.delete_enum = 'FALSE'
<if test= "params.personName != null and params.personName != ''" >
AND har.person_name LIKE CONCAT('%', #{params.personName}, '%')
</if>
<include refid= "personInOutTimeFilters" />
</when>
<otherwise >
SELECT har.*
FROM hk_access_record har
INNER JOIN `user` u ON u.user_id_card = har.certificate_no AND u.delete_enum = 'FALSE'
WHERE har.delete_enum = 'FALSE'
<choose >
<when test= "params.deptId != null and ((params.personName != null and params.personName != '') or (params.personPhone != null and params.personPhone != '') or (params.personIdCard != null and params.personIdCard != ''))" >
AND u.department_id = #{params.deptId}
</when>
<when test= "params.personIdCard != null and params.personIdCard != ''" >
AND u.user_id_card = #{params.personIdCard}
</when>
<otherwise >
AND 1 = 0
</otherwise>
</choose>
<if test= "params.personName != null and params.personName != ''" >
AND u.`name` LIKE CONCAT('%', #{params.personName}, '%')
</if>
<if test= "params.personPhone != null and params.personPhone != ''" >
AND u.phone = #{params.personPhone}
</if>
<if test= "params.personIdCard != null and params.personIdCard != ''" >
AND u.user_id_card = #{params.personIdCard}
</if>
<if test= "params.startTime != null and params.startTime != ''" >
AND har.event_time > = CONCAT(#{params.startTime}, ' 00:00:00')
</if>
<if test= "params.endTime != null and params.endTime != ''" >
AND har.event_time < = CONCAT(#{params.endTime}, ' 23:59:59')
</if>
<if test= "params.doorName != null and params.doorName != ''" >
AND har.door_name LIKE CONCAT('%', #{params.doorName}, '%')
</if>
<include refid= "personInOutTimeFilters" />
</otherwise>
</choose>
</sql>
2026-08-19 16:55:53 +08:00
<select id= "listPersonInOutRecord" resultType= "com.zcloud.primeport.persistence.dataobject.HkAccessRecordDO" >
<include refid= "personInOutBaseQuery" />
ORDER BY har.event_time DESC
<if test= "params.pageSize != null" >
LIMIT #{params.offset}, #{params.pageSize}
</if>
</select>
<select id= "countPersonInOutRecord" resultType= "long" >
SELECT COUNT(1)
FROM (
<include refid= "personInOutBaseQuery" />
) tmp
</select>
<!-- 封闭区域车辆进出记录(含子区域递归查询) -->
<sql id= "vehicleInOutBaseQuery" >
WITH RECURSIVE area_tree AS (
SELECT id FROM closed_area WHERE id = #{params.closedAreaId} AND delete_enum = 'FALSE'
UNION ALL
SELECT ca.id FROM closed_area ca INNER JOIN area_tree at ON ca.parent_id = at.id WHERE ca.delete_enum = 'FALSE'
)
SELECT hvar.*
FROM hk_vehicle_access_record hvar
INNER JOIN mkmj_gate mg ON hvar.lane_index_code = mg.hk_index_code AND mg.delete_enum = 'FALSE'
INNER JOIN mkmj m ON mg.mkmj_id = m.id AND m.delete_enum = 'FALSE'
INNER JOIN area_tree at ON m.closed_area_id = at.id
WHERE hvar.delete_enum = 'FALSE'
<if test= "params.vehiclePlateNumber != null and params.vehiclePlateNumber != ''" >
AND hvar.plate_no LIKE CONCAT('%', #{params.vehiclePlateNumber}, '%')
</if>
2026-08-21 11:16:14 +08:00
<if test= "(params.arrivalStartTime != null and params.arrivalStartTime != '') or (params.arrivalEndTime != null and params.arrivalEndTime != '') or (params.departureStartTime != null and params.departureStartTime != '') or (params.departureEndTime != null and params.departureEndTime != '')" >
AND (
<trim prefixOverrides= "OR" >
<if test= "(params.arrivalStartTime != null and params.arrivalStartTime != '') or (params.arrivalEndTime != null and params.arrivalEndTime != '')" >
OR (
hvar.enter_or_exit = 0
<if test= "params.arrivalStartTime != null and params.arrivalStartTime != ''" >
AND hvar.event_time > = CONCAT(#{params.arrivalStartTime}, ' 00:00:00')
</if>
<if test= "params.arrivalEndTime != null and params.arrivalEndTime != ''" >
AND hvar.event_time < = CONCAT(#{params.arrivalEndTime}, ' 23:59:59')
</if>
)
</if>
<if test= "(params.departureStartTime != null and params.departureStartTime != '') or (params.departureEndTime != null and params.departureEndTime != '')" >
OR (
hvar.enter_or_exit = 1
<if test= "params.departureStartTime != null and params.departureStartTime != ''" >
AND hvar.event_time > = CONCAT(#{params.departureStartTime}, ' 00:00:00')
</if>
<if test= "params.departureEndTime != null and params.departureEndTime != ''" >
AND hvar.event_time < = CONCAT(#{params.departureEndTime}, ' 23:59:59')
</if>
)
</if>
</trim>
)
2026-08-19 16:55:53 +08:00
</if>
</sql>
<select id= "listVehicleInOutRecord" resultType= "com.zcloud.primeport.persistence.dataobject.HkVehicleAccessRecordDO" >
<include refid= "vehicleInOutBaseQuery" />
ORDER BY hvar.event_time DESC
<if test= "params.pageSize != null" >
LIMIT #{params.offset}, #{params.pageSize}
</if>
</select>
<select id= "countVehicleInOutRecord" resultType= "long" >
SELECT COUNT(1)
FROM (
<include refid= "vehicleInOutBaseQuery" />
) tmp
</select>
2026-08-21 16:57:14 +08:00
<!-- 按企业和口门统计海康封闭区域人员进出记录 -->
<select id= "listPersonRecordStat"
resultType="com.zcloud.primeport.persistence.dataobject.ClosedAreaRecordStatDO">
SELECT m.id AS mkmj_id,
m.mkmj_name,
COUNT(DISTINCT CASE WHEN har.enter_or_exit = 1 THEN har.id END) AS in_count,
COUNT(DISTINCT CASE WHEN har.enter_or_exit = 2 THEN har.id END) AS out_count
FROM hk_access_record har
INNER JOIN mkmj_gate mg
ON har.door_index_code = mg.hk_index_code
AND mg.delete_enum = 'FALSE'
INNER JOIN mkmj m
ON mg.mkmj_id = m.id
AND m.delete_enum = 'FALSE'
INNER JOIN closed_area ca
ON m.closed_area_id = ca.id
AND ca.delete_enum = 'FALSE'
WHERE har.delete_enum = 'FALSE'
AND ca.jurisdictional_corp_id = #{corpinfoId}
AND har.event_time > = #{startTime}
AND har.event_time < #{endTime}
GROUP BY m.id, m.mkmj_name
ORDER BY m.id
</select>
<!-- 按企业和口门统计海康封闭区域车辆进出记录 -->
<select id= "listVehicleRecordStat"
resultType="com.zcloud.primeport.persistence.dataobject.ClosedAreaRecordStatDO">
SELECT m.id AS mkmj_id,
m.mkmj_name,
COUNT(DISTINCT CASE WHEN hvar.enter_or_exit = 0 THEN hvar.id END) AS in_count,
COUNT(DISTINCT CASE WHEN hvar.enter_or_exit = 1 THEN hvar.id END) AS out_count
FROM hk_vehicle_access_record hvar
INNER JOIN mkmj_gate mg
ON hvar.lane_index_code = mg.hk_index_code
AND mg.delete_enum = 'FALSE'
INNER JOIN mkmj m
ON mg.mkmj_id = m.id
AND m.delete_enum = 'FALSE'
INNER JOIN closed_area ca
ON m.closed_area_id = ca.id
AND ca.delete_enum = 'FALSE'
WHERE hvar.delete_enum = 'FALSE'
AND ca.jurisdictional_corp_id = #{corpinfoId}
AND hvar.event_time > = #{startTime}
AND hvar.event_time < #{endTime}
GROUP BY m.id, m.mkmj_name
ORDER BY m.id
</select>
2026-03-19 18:00:55 +08:00
</mapper>