CAST(AES_DECRYPT(FROM_BASE64(jkp.card_no),'*#id#') AS CHAR) AS card_no,
jkp.phone,
t1.*,
so1.name AS city_name,
so2.name AS area_name,
so3.name AS street_name,
so4.name AS community_name,
jlpvr.id AS id,
jlpvr.id AS visit_record_id,
jlpvr.key_person_visit_id,
jlpvr.plan_name,
jlpvr.plan_type,
jlpvr.rating_type,
jlpvr.plan_start_data,
jlpvr.plan_end_data,
jlpvr.overdue_date,
jlpvr.do_status,
t1.rating_type as rating_level,
v.sys_type_office_label,
v.sys_type_office_value,
v.id AS key_person_visit_id,
t1.sys_type AS rating_dict_type,
v.plan_name AS plan_name,
v.plan_type AS plan_type,
v.rating_type AS plan_rating_type,
CASE
WHEN DATEDIFF(jlpvr.plan_end_data, CURDATE()) < 0 THEN 0
ELSE DATEDIFF(jlpvr.plan_end_data, CURDATE())
END AS remain_days,
jlpvr.is_overdue AS is_overdue,
CASE
WHEN jlpvr.overdue_date IS NOT NULL AND CURDATE() >= jlpvr.overdue_date AND CURDATE() <= jlpvr.plan_end_data THEN '1'
ELSE '0'
END AS is_near_due
FROM jl_key_person jkp
LEFT JOIN jl_key_person_visit_record jlpvr ON jkp.id = jlpvr.key_person_id AND jlpvr.is_history = '2'
LEFT JOIN sys_office so1 ON jkp.city_id = so1.id
LEFT JOIN sys_office so2 ON jkp.area_id = so2.id
LEFT JOIN sys_office so3 ON jkp.street_id = so3.id
LEFT JOIN sys_office so4 ON jkp.community_id = so4.id
UNION ALL
WHEN r.id is NULL THEN
'1'
WHEN
v.id is NOT NULL AND r.id is not NULL
AND DATE_FORMAT(NOW(),'%Y-%m-%d') < DATE_FORMAT(DATE_ADD(r.visit_time, INTERVAL v.visit_start_day DAY), '%Y-%m-%d') THEN
'0'
WHEN
v.id is NOT NULL AND r.id is not NULL
AND DATE_FORMAT(NOW(),'%Y-%m-%d') >= DATE_FORMAT(DATE_ADD(r.visit_time, INTERVAL v.visit_start_day DAY), '%Y-%m-%d')
AND DATE_FORMAT(NOW(),'%Y-%m-%d') < DATE_FORMAT(DATE_ADD(r.visit_time, INTERVAL v.visit_end_day - v.overdue_warning_day DAY), '%Y-%m-%d') THEN
'1'
WHEN
v.id is NOT NULL AND r.id is not NULL
AND DATE_FORMAT(NOW(),'%Y-%m-%d') >= DATE_FORMAT(DATE_ADD(r.visit_time, INTERVAL v.visit_end_day - v.overdue_warning_day DAY), '%Y-%m-%d')
AND DATE_FORMAT(NOW(),'%Y-%m-%d') <= DATE_FORMAT(DATE_ADD(r.visit_time, INTERVAL v.visit_end_day DAY), '%Y-%m-%d') THEN
'2'
WHEN
v.id is NOT NULL AND r.id is not NULL
AND DATE_FORMAT(NOW(),'%Y-%m-%d') > DATE_FORMAT(DATE_ADD(r.visit_time, INTERVAL v.visit_end_day DAY), '%Y-%m-%d') THEN
'3'
ELSE
'1'
END AS 'visit_status'
FROM
(
SELECT
jkm.id AS key_person_id,
jkm.name,
jkm.sys_type,
jkm.card_no AS enc_card_no,
CAST(AES_DECRYPT(FROM_BASE64(jkm.card_no),'*#id#') AS CHAR) AS card_no,
jkm.phone,
so1.name AS city_name,
so2.name AS area_name,
so3.name AS street_name,
so4.name AS community_name,
jlpvr.id AS id,
jlpvr.id AS visit_record_id,
jlpvr.key_person_visit_id,
jlpvr.plan_name,
jlpvr.plan_type,
jlpvr.rating_type,
jlpvr.plan_start_data,
jlpvr.plan_end_data,
jlpvr.overdue_date,
jlpvr.do_status,
CASE
WHEN DATEDIFF(jlpvr.plan_end_data, CURDATE()) < 0 THEN 0
ELSE DATEDIFF(jlpvr.plan_end_data, CURDATE())
END AS remain_days,
jlpvr.is_overdue AS is_overdue,
CASE
WHEN jlpvr.overdue_date IS NOT NULL AND CURDATE() >= jlpvr.overdue_date AND CURDATE() <= jlpvr.plan_end_data THEN '1'
ELSE '0'
END AS is_near_due
FROM jl_key_person_minor jkm
LEFT JOIN jl_key_person_visit_record jlpvr ON jkm.id = jlpvr.key_person_id AND jlpvr.is_history = '2'
LEFT JOIN sys_office so1 ON jkm.city_id = so1.id
LEFT JOIN sys_office so2 ON jkm.area_id = so2.id
LEFT JOIN sys_office so3 ON jkm.street_id = so3.id
LEFT JOIN sys_office so4 ON jkm.community_id = so4.id
) t
kp.id AS person_id,
kp.name,
CAST(AES_DECRYPT(FROM_BASE64(kp.card_no),'*#id#') AS CHAR) AS card_no,
kp.phone,
kp.sys_type,
kp.city_id,
kp.area_id,
kp.street_id,
kp.community_id,
s.rating_type
FROM
(<includerefid="getPsersonList"></include>) kp,
jl_key_person_rating_summary s
WHERE
s.key_person_id = kp.id
AND s.is_history = '1'
) t1
LEFT JOIN jl_key_person_visit v ON v.rating_type = t1.rating_type AND v.status = '1' AND v.sys_type_office_label = #{params.office_label} AND v.rating_dict_type = t1.sys_type
LEFT JOIN jl_key_person_visit_record r ON t1.person_id = r.key_person_id AND r.is_new = '1' AND r.sys_type_office_label = #{params.office_label}
LEFT JOIN sys_office so1 ON t1.city_id = so1.id
LEFT JOIN sys_office so2 ON t1.area_id = so2.id
LEFT JOIN sys_office so3 ON t1.street_id = so3.id
LEFT JOIN sys_office so4 ON t1.community_id = so4.id
<where>
<!-- 仅返回“有计划”的人员:当前记录存在且标记为当前(is_history='2') -->
AND t.visit_record_id IS NOT NULL
<iftest="params.name != null and params.name != ''">
AND t.name LIKE CONCAT('%', #{params.name}, '%')
<iftest="params.rating_level != null and params.rating_level != ''">
AND v.rating_type = #{params.rating_level}
</if>
<iftest="params.card_no != null and params.card_no != ''">
AND t.enc_card_no = TO_BASE64(AES_ENCRYPT(#{params.card_no},'*#id#'))
</if>
<iftest="params.city_id != null and params.city_id != ''">
AND EXISTS (
SELECT 1 FROM sys_office so WHERE so.name = t.city_name AND so.id = #{params.city_id}
)
</if>
<iftest="params.area_id != null and params.area_id != ''">
AND EXISTS (
SELECT 1 FROM sys_office so WHERE so.name = t.area_name AND so.id = #{params.area_id}
)
</if>
<iftest="params.street_id != null and params.street_id != ''">
AND EXISTS (
SELECT 1 FROM sys_office so WHERE so.name = t.street_name AND so.id = #{params.street_id}
)
</if>
<iftest="params.community_id != null and params.community_id != ''">
AND EXISTS (
SELECT 1 FROM sys_office so WHERE so.name = t.community_name AND so.id = #{params.community_id}
)
</if>
<iftest="params.rating_type != null and params.rating_type != ''">
AND t.rating_type = #{params.rating_type}
</if>
<iftest="params.do_status != null and params.do_status != ''">
AND t.do_status = #{params.do_status}
</if>
<iftest="params.is_overdue != null and params.is_overdue != ''">
AND t.is_overdue = #{params.is_overdue}
</if>
<!-- 数据范围 -->
<iftest="params.visit_status != null and params.visit_status != ''">
<choose>
<whentest='params.scope_grade == "3"'>
AND EXISTS (
SELECT 1 FROM sys_office so WHERE so.name = t.city_name AND so.id = #{params.scope_area_id}
)
<whentest='params.visit_status == "0"'>
AND v.id is NOT NULL
AND r.id is not NULL
AND DATE_FORMAT(NOW(),'%Y-%m-%d') < DATE_FORMAT(DATE_ADD(r.visit_time, INTERVAL v.visit_start_day DAY), '%Y-%m-%d')
</when>
<whentest='params.scope_grade == "4"'>
AND EXISTS (
SELECT 1 FROM sys_office so WHERE so.name = t.area_name AND so.id = #{params.scope_area_id}
<whentest='params.visit_status == "1"'>
AND (
r.id is NULL
or
(
v.id is NOT NULL
AND r.id is not NULL
AND DATE_FORMAT(NOW(),'%Y-%m-%d') >= DATE_FORMAT(DATE_ADD(r.visit_time, INTERVAL v.visit_start_day DAY), '%Y-%m-%d')
AND DATE_FORMAT(NOW(),'%Y-%m-%d') < DATE_FORMAT(DATE_ADD(r.visit_time, INTERVAL v.visit_end_day - v.overdue_warning_day DAY), '%Y-%m-%d')
)
</when>
<whentest='params.scope_grade == "5"'>
AND EXISTS (
SELECT 1 FROM sys_office so WHERE so.name = t.street_name AND so.id = #{params.scope_area_id}
)
</when>
<whentest='params.scope_grade == "6"'>
AND EXISTS (
SELECT 1 FROM sys_office so WHERE so.name = t.community_name AND so.id = #{params.scope_area_id}
)
<whentest='params.visit_status == "2"'>
AND v.id is NOT NULL
AND r.id is not NULL
AND DATE_FORMAT(NOW(),'%Y-%m-%d') >= DATE_FORMAT(DATE_ADD(r.visit_time, INTERVAL v.visit_end_day - v.overdue_warning_day DAY), '%Y-%m-%d')
AND DATE_FORMAT(NOW(),'%Y-%m-%d') <= DATE_FORMAT(DATE_ADD(r.visit_time, INTERVAL v.visit_end_day DAY), '%Y-%m-%d')
</when>
<whentest='params.visit_status == "3"'>
AND v.id is NOT NULL
AND r.id is not NULL
AND DATE_FORMAT(NOW(),'%Y-%m-%d') > DATE_FORMAT(DATE_ADD(r.visit_time, INTERVAL v.visit_end_day DAY), '%Y-%m-%d')
</when>
<!-- 0/2 不做范围限制(总机构、省) -->
</choose>
<iftest="params.rating_dict_type != null and params.rating_dict_type != ''">
AND t.sys_type = #{params.rating_dict_type}
</if>
</where>
ORDER BY
CASE t.do_status WHEN '0' THEN 0 WHEN '1' THEN 1 WHEN '2' THEN 2 ELSE 9 END ASC,