Files
2026-06-02 17:44:03 +08:00

92 lines
3.4 KiB
Python

"""字典数据缓存服务
启动时从 MySQL 加载岗位分类、行业、专业分类、地区数据到内存。
"""
from sqlalchemy import select, text
from app.core.database import MysqlSession
from app.core.logger import log
class DictCacheService:
"""字典缓存,单例使用"""
def __init__(self):
self.job_category_text: str = ""
self.industry_text: str = ""
self.major_category_text: str = ""
self._region_list: list[dict] = []
async def refresh(self) -> None:
"""加载全量字典数据"""
async with MysqlSession() as session:
# 岗位分类(三级叶子,带父级路径)
result = await session.execute(text("""
SELECT c.id, c.name, c.parent_id, c.root_id, c.level,
p.name AS parent_name, r.name AS root_name
FROM bg_job_category c
LEFT JOIN bg_job_category p ON c.parent_id = p.id
LEFT JOIN bg_job_category r ON c.root_id = r.id
WHERE c.level = 3
"""))
categories = result.mappings().all()
self.job_category_text = ", ".join(
f"{c['id']}:{c['name']}({c['root_name']}/{c['parent_name']})"
for c in categories
)
# 行业(二级叶子,带父级)
result = await session.execute(text("""
SELECT i.id, i.name, p.name AS parent_name
FROM bg_industry i
LEFT JOIN bg_industry p ON i.parent_id = p.id
WHERE i.level = 2
"""))
industries = result.mappings().all()
self.industry_text = ", ".join(
f"{i['id']}:{i['name']}({i['parent_name']})"
for i in industries
)
# 专业分类(三级叶子,带父级路径)
result = await session.execute(text("""
SELECT m.id, m.name, m.parent_id, m.root_id,
p.name AS parent_name, r.name AS root_name
FROM bg_major_category m
LEFT JOIN bg_major_category p ON m.parent_id = p.id
LEFT JOIN bg_major_category r ON m.root_id = r.id
WHERE m.level = 3
"""))
majors = result.mappings().all()
self.major_category_text = ", ".join(
f"{m['id']}:{m['name']}({m['root_name']}/{m['parent_name']})"
for m in majors
)
# 地区(省市级)
result = await session.execute(text("""
SELECT code, name FROM bg_china_regions_code WHERE city_code IS NULL
"""))
self._region_list = [dict(r) for r in result.mappings().all()]
log.info(
"字典缓存加载完成: 岗位分类{}条, 行业{}条, 专业{}条, 地区{}",
len(categories), len(industries), len(majors), len(self._region_list),
)
def match_region_code(self, city_name: str) -> str | None:
"""根据城市名模糊匹配地区编码"""
if not city_name:
return None
name = city_name.replace("", "").replace("", "").strip()
for r in self._region_list:
r_name = r["name"].replace("", "").replace("", "")
if name in r_name or r_name in name:
return r["code"]
return None
# 全局单例
dict_cache = DictCacheService()