from sqlalchemy import and_, or_, desc, func from sqlalchemy.orm import Session from module_admin.entity.do.vecset_do import SysVecset from module_admin.entity.do.dasset_do import SysDasset from module_admin.entity.vo.vecset_vo import VecsetModel, CurrentVecsetInfo, VecsetQueryModel from utils.time_format_util import object_format_datetime, list_format_datetime, format_datetime_dict_list from datetime import datetime, time from typing import Union, List class VecsetDao: """ 数据智能语句配置模块数据库操作层 """ @classmethod def get_vecset_by_name(cls, db: Session, stab_name: str): """ 根据字段名获取字段信息 :param db: orm对象 :param stab_name: 表名称 :return: 当前表名称信息对象 """ query_vecset_info = db.query(SysVecset) \ .filter(SysVecset.status == 0, SysVecset.del_flag == 0, SysVecset.stab_name == stab_name) \ .order_by(desc(SysVecset.create_time)).distinct().first() return query_vecset_info @classmethod def get_vecset_by_info(cls, db: Session, vecset: VecsetModel): """ 根据字段参数获取字段信息 :param db: orm对象 :param vecset: 表名称参数 :return: 当前表名称参数的表名称信息对象 """ query_vecset_info = db.query(SysVecset) \ .filter(SysVecset.del_flag == 0, SysVecset.onum == vecset.onum) \ .order_by(desc(SysVecset.create_time)).distinct().first() return query_vecset_info @classmethod def get_vecset_by_id(cls, db: Session, onum: int): """ 根据onum获取字段信息 :param db: orm对象 :param onum: 序号id :return: 当前onum的信息对象 """ query_vecset_basic_info = db.query(SysVecset) \ .filter(SysVecset.status == 0, SysVecset.del_flag == 0, SysVecset.onum == onum) \ .distinct().first() query_vecset_dasset_info = db.query(SysDasset).select_from(SysVecset) \ .filter( SysVecset.status == 0, SysVecset.del_flag == 0, SysVecset.onum == onum) \ .join(SysDasset, and_(SysVecset.dasset_id == SysDasset.dasset_id, SysDasset.status == 0, SysDasset.del_flag == 0)) \ .distinct().first() results = dict( vecset_basic_info=object_format_datetime(query_vecset_basic_info), vecset_dasset_info=object_format_datetime(query_vecset_dasset_info) ) return CurrentVecsetInfo(**results) @classmethod def get_vecset_detail_by_id(cls, db: Session, onum: int): """ 根据onum获取字段详细信息 :param db: orm对象 :param onum: 序号id :return: 当前onum的信息对象 """ query_vecset_basic_info = db.query(SysVecset) \ .filter(SysVecset.del_flag == 0, SysVecset.onum == onum) \ .distinct().first() query_vecset_dasset_info = db.query(SysDasset).select_from(SysVecset) \ .filter(SysVecset.del_flag == 0, SysVecset.onum == onum) \ .join(SysDasset, and_(SysVecset.dasset_id == SysDasset.dasset_id, SysDasset.status == 0, SysDasset.del_flag == 0)) \ .distinct().first() results = dict( vecset_basic_info=object_format_datetime(query_vecset_basic_info), vecset_dasset_info=object_format_datetime(query_vecset_dasset_info) ) return CurrentVecsetInfo(**results) @classmethod def get_vecset_list(cls, db: Session, query_object: VecsetQueryModel, data_scope_sql: str): """ 根据查询参数获取字段列表信息 :param db: orm对象 :param query_object: 查询参数对象 :param data_scope_sql: 数据权限对应的查询sql语句 :return: 字段列表信息对象 """ vecset_list = db.query(SysVecset, SysDasset) \ .filter(SysVecset.del_flag == 0, or_(SysVecset.dasset_id == query_object.dasset_id, SysVecset.dasset_id.in_( db.query(SysDasset.dasset_id).filter(func.find_in_set(query_object.dasset_id, SysDasset.dasset_ancestors)) )) if query_object.dasset_id else True, SysVecset.stab_name.like(f'%{query_object.stab_name}%') if query_object.stab_name else True, SysVecset.squery.like(f'%{query_object.squery}%') if query_object.squery else True, SysVecset.sanal_plan.like(f'%{query_object.sanal_plan}%') if query_object.sanal_plan else True, SysVecset.sintnt_term.like(f'%{query_object.sintnt_term}%') if query_object.sintnt_term else True, SysVecset.ssql.like(f'%{query_object.ssql}%') if query_object.ssql else True, SysVecset.sim_thrsh.like(f'%{query_object.sim_thrsh}%') if query_object.sim_thrsh else True, SysVecset.status == query_object.status if query_object.status else True, SysVecset.create_time.between( datetime.combine(datetime.strptime(query_object.create_time_start, '%Y-%m-%d'), time(00, 00, 00)), datetime.combine(datetime.strptime(query_object.create_time_end, '%Y-%m-%d'), time(23, 59, 59))) if query_object.create_time_start and query_object.create_time_end else True, eval(data_scope_sql) ) \ .outerjoin(SysDasset, and_(SysVecset.dasset_id == SysDasset.dasset_id, SysDasset.status == 0, SysDasset.del_flag == 0)) \ .distinct().all() result_list: List[Union[dict, None]] = [] if vecset_list: for item in vecset_list: obj = dict( onum=item[0].onum, dasset_id=item[0].dasset_id, dasset_name=item[1].dasset_name if item[1] else '', stab_name=item[0].stab_name, squery=item[0].squery, sanal_plan=item[0].sanal_plan, sintnt_term=item[0].sintnt_term, ssql=item[0].ssql, sim_thrsh=item[0].sim_thrsh, status=item[0].status, del_flag=item[0].del_flag, create_by=item[0].create_by, create_time=item[0].create_time, update_by=item[0].update_by, update_time=item[0].update_time, remark=item[0].remark ) result_list.append(obj) return format_datetime_dict_list(result_list) @classmethod def add_vecset_dao(cls, db: Session, vecset: VecsetModel): """ 新增字段数据库操作 :param db: orm对象 :param vecset: 字段对象 :return: 新增校验结果 """ db_vecset = SysVecset(**vecset.dict()) db.add(db_vecset) db.flush() return db_vecset @classmethod def edit_vecset_dao(cls, db: Session, vecset: dict): """ 编辑字段数据库操作 :param db: orm对象 :param vecset: 需要更新的字段字典 :return: 编辑校验结果 """ db.query(SysVecset) \ .filter(SysVecset.squery == vecset.get('squery')) \ .update(vecset) @classmethod def delete_vecset_dao(cls, db: Session, vecset: VecsetModel): """ 删除字段数据库操作 :param db: orm对象 :param vecset: 字段对象 :return: """ db.query(SysVecset) \ .filter(SysVecset.onum == vecset.onum) \ .update({SysVecset.del_flag: '2', SysVecset.update_by: vecset.update_by, SysVecset.update_time: vecset.update_time}) @classmethod def get_vecset_dasset_info(cls, db: Session, dasset_id: int): dasset_basic_info = db.query(SysDasset) \ .filter(SysDasset.dasset_id == dasset_id, SysDasset.status == 0, SysDasset.del_flag == 0 ) \ .first() return dasset_basic_info @classmethod def get_vecset_by_info_imp(cls, db: Session, vecset: VecsetModel): """ 根据字段参数获取字段信息 :param db: orm对象 :param vecset: 表名称参数 :return: 当前表名称参数的表名称信息对象 """ query_vecset_info_imp = db.query(SysVecset) \ .filter(SysVecset.del_flag == 0, SysVecset.squery == vecset.squery) \ .order_by(desc(SysVecset.create_time)).distinct().first() return query_vecset_info_imp