Intention/api/globalData.py

147 lines
6.0 KiB
Python

# globalData.py
import json
import logging
import redis
from logger_util import setup_logger
from config import redis_url
logger = setup_logger("GlobalData", level=logging.DEBUG)
class GlobalData:
# 数据字段
standard_company_program = {}
standard_company_name_list = []
simply_to_standard_company_name_map = {}
pinyin_simply_to_standard_company_name_map = {}
standard_project_name_list = []
simply_to_standard_project_name_map = {}
pinyin_simply_to_standard_project_name_map = {}
standard_construct_name_list = []
simply_to_standard_construct_name_map = {}
pinyin_simply_to_standard_construct_name_map = {}
standard_constractor_name_list = []
simply_to_standard_constractor_name_map = {}
pinyin_simply_to_standard_constractor_name_map = {}
standard_team_leader_name_list = []
simply_to_standard_team_leader_name_map = {}
pinyin_simply_to_standard_team_leader_name_map = {}
@classmethod
def update_from_redis(cls):
import sys
from utils import (
clean_useless_company_name,
clean_useless_project_name,
clean_useless_team_leader_name
)
#实施组织(分公司)和项目名
cls._update_company_program()
#工程名
cls._update_list_data('SBD_QUERY_DATA:PROJECT_NAME', './standard_data/standard_project.txt',
cls.standard_project_name_list, cls.simply_to_standard_project_name_map,
cls.pinyin_simply_to_standard_project_name_map, clean_useless_project_name)
logger.info(f"工程名数量:{len(cls.standard_project_name_list)}")
#建管单位
cls._update_list_data('SBD_QUERY_DATA:CONSTRUCTION_UNIT', './standard_data/construct_unit.txt',
cls.standard_construct_name_list, cls.simply_to_standard_construct_name_map,
cls.pinyin_simply_to_standard_construct_name_map, clean_useless_company_name)
logger.info(f"建管单位数量:{len(cls.standard_construct_name_list)}")
#分包单位
cls._update_list_data('SBD_QUERY_DATA:SUBCONTRACTOR', './standard_data/sub_contract.txt',
cls.standard_constractor_name_list, cls.simply_to_standard_constractor_name_map,
cls.pinyin_simply_to_standard_constractor_name_map, clean_useless_company_name)
logger.info(f"分包单位数量:{len(cls.standard_constractor_name_list)}")
#班组名称
cls._update_list_data('SBD_QUERY_DATA:TEAM', './standard_data/team_leader.txt',
cls.standard_team_leader_name_list, cls.simply_to_standard_team_leader_name_map,
cls.pinyin_simply_to_standard_team_leader_name_map, clean_useless_team_leader_name)
logger.info(f"班组名称数量:{len(cls.standard_team_leader_name_list)}")
@classmethod
def _update_company_program(cls):
from utils import (
load_standard_json_data,
save_dict_to_file,
clean_useless_company_name,
text_to_pinyin
)
# 公司与项目关系数据
try:
r = redis.from_url(redis_url, decode_responses=True)
json_str = r.get('SBD_QUERY_DATA:STANDARD_COMPANY_PROGRAM')
if json_str:
temp_data = json.loads(json_str)
save_dict_to_file(temp_data,"./standard_data/standard_company_program.json")
logger.info("[Info] Loaded STANDARD_COMPANY_PROGRAM from Redis")
else:
raise ValueError("Redis key not found")
except Exception as e:
logger.error(f"[Error] Error loading STANDARD_COMPANY_PROGRAM: {e}")
temp_data = load_standard_json_data("./standard_data/standard_company_program.json")
if temp_data != cls.standard_company_program:
cls.standard_company_program.clear()
cls.standard_company_program.update(temp_data)
cls.standard_company_name_list.clear()
cls.standard_company_name_list.extend(list(temp_data.keys()))
cls.simply_to_standard_company_name_map.clear()
cls.simply_to_standard_company_name_map.update({
clean_useless_company_name(kw): kw for kw in cls.standard_company_name_list
})
cls.pinyin_simply_to_standard_company_name_map.clear()
cls.pinyin_simply_to_standard_company_name_map.update({
text_to_pinyin(clean_useless_company_name(kw)): kw for kw in cls.standard_company_name_list
})
@classmethod
def _update_list_data(cls, redis_key, local_path, target_list, simple_map, pinyin_map, cleaner):
from utils import (
load_standard_name_list,
save_standard_name_list_to_file,
text_to_pinyin
)
try:
r = redis.from_url(redis_url, decode_responses=True)
json_str = r.get(redis_key)
except Exception as e:
logger.info(f"[Error] Redis error on key '{redis_key}': {e}")
json_str = None
if json_str:
try:
temp_list = json.loads(json_str)
save_standard_name_list_to_file(temp_list,local_path)
logger.info(f"[Info] Loaded {redis_key} from Redis")
except json.JSONDecodeError as e:
logger.info(f"[Warning] JSON decode error on key '{redis_key}': {e}")
temp_list = load_standard_name_list(local_path)
else:
logger.info(f"[Info] Redis key '{redis_key}' not found. Loading from local file...")
temp_list = load_standard_name_list(local_path)
if temp_list != target_list:
target_list.clear()
target_list.extend(temp_list)
simple_map.clear()
simple_map.update({
cleaner(kw): kw for kw in temp_list
})
pinyin_map.clear()
pinyin_map.update({
text_to_pinyin(cleaner(kw)): kw for kw in temp_list
})