Files
ccdi/lsfx-mock-server/services/staff_identity_repository.py

112 lines
4.0 KiB
Python

from typing import Dict, List
from config.settings import settings
class StaffIdentityRepository:
"""从员工信息库中读取员工及亲属身份证信息。"""
def _connect(self):
try:
import pymysql
except ImportError as exc:
raise RuntimeError("缺少 PyMySQL 依赖,无法读取员工信息库") from exc
return pymysql.connect(
host=settings.CCDI_DB_HOST,
port=settings.CCDI_DB_PORT,
user=settings.CCDI_DB_USERNAME,
password=settings.CCDI_DB_PASSWORD,
database=settings.CCDI_DB_NAME,
charset="utf8mb4",
connect_timeout=settings.CCDI_DB_CONNECT_TIMEOUT_SECONDS,
cursorclass=pymysql.cursors.DictCursor,
)
def select_random_staff_with_families(self) -> Dict[str, object]:
"""随机选择一个员工,并读取其有效亲属证件号。"""
with self._connect() as connection:
with connection.cursor() as cursor:
cursor.execute(
"""
SELECT s.name AS staff_name, s.id_card AS staff_id_card
FROM ccdi_base_staff s
WHERE COALESCE(TRIM(s.id_card), '') <> ''
AND s.status = '0'
AND EXISTS (
SELECT 1
FROM ccdi_staff_fmy_relation r
WHERE r.person_id = s.id_card
AND r.status = 1
AND COALESCE(TRIM(r.relation_cert_no), '') <> ''
)
ORDER BY RAND()
LIMIT 1
"""
)
staff = cursor.fetchone()
if not staff:
cursor.execute(
"""
SELECT s.name AS staff_name, s.id_card AS staff_id_card
FROM ccdi_base_staff s
WHERE COALESCE(TRIM(s.id_card), '') <> ''
AND s.status = '0'
ORDER BY RAND()
LIMIT 1
"""
)
staff = cursor.fetchone()
if not staff:
raise RuntimeError("员工信息库中不存在可用身份证号")
cursor.execute(
"""
SELECT DISTINCT relation_cert_no
FROM ccdi_staff_fmy_relation
WHERE person_id = %s
AND status = 1
AND COALESCE(TRIM(relation_cert_no), '') <> ''
ORDER BY relation_cert_no
""",
(staff["staff_id_card"],),
)
family_rows = cursor.fetchall()
family_id_cards: List[str] = [
row["relation_cert_no"]
for row in family_rows
if row["relation_cert_no"] != staff["staff_id_card"]
]
return {
"staff_name": staff["staff_name"],
"staff_id_card": staff["staff_id_card"],
"family_id_cards": family_id_cards,
}
def select_active_staff_identities(self) -> List[Dict[str, str]]:
"""读取所有可用于征信样本导出的员工身份。"""
with self._connect() as connection:
with connection.cursor() as cursor:
cursor.execute(
"""
SELECT s.name AS staff_name, s.id_card AS staff_id_card
FROM ccdi_base_staff s
WHERE COALESCE(TRIM(s.name), '') <> ''
AND COALESCE(TRIM(s.id_card), '') <> ''
AND s.status = '0'
ORDER BY s.staff_id
"""
)
rows = cursor.fetchall()
return [
{
"staff_name": row["staff_name"],
"staff_id_card": row["staff_id_card"],
}
for row in rows
]