from sqlalchemy import and_, or_, desc, func from sqlalchemy.orm import Session from sqlalchemy.sql.expression import text from module_admin.entity.do.dassetdict_do import SysDassetdict from module_admin.entity.do.dasset_do import SysDasset from module_admin.entity.vo.dassetdict_vo import DassetdictModel, CurrentDassetdictInfo, DassetdictQueryModel 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 DassetdictDao: """ 数据资产字典管理模块数据库操作层 """ @classmethod def get_dassetdict_by_name(cls, db: Session, dict_fn: str): """ 根据字段名获取字段信息 :param db: orm对象 :param dict_fn: 字段名称 :return: 当前字段名的字段信息对象 """ query_dassetdict_info = db.query(SysDassetdict) \ .filter(SysDassetdict.status == 0, SysDassetdict.del_flag == 0, SysDassetdict.dict_fn == dict_fn) \ .order_by(SysDassetdict.order_asc).distinct().first() #.order_by(desc(SysDassetdict.create_time)).distinct().first() return query_dassetdict_info @classmethod def get_dassetdict_by_info(cls, db: Session, dassetdict: DassetdictModel): """ 根据字段参数获取字段信息 :param db: orm对象 :param dassetdict: 字段参数 :return: 当前字段参数的字段信息对象 """ query_dassetdict_info = db.query(SysDassetdict) \ .filter(SysDassetdict.del_flag == 0, SysDassetdict.dict_fn == dassetdict.dict_fn) \ .order_by(SysDassetdict.order_asc).distinct().first() #.order_by(desc(SysDassetdict.create_time)).distinct().first() return query_dassetdict_info @classmethod def get_dassetdict_by_id(cls, db: Session, dict_id: int): """ 根据dict_id获取字段信息 :param db: orm对象 :param dict_id: 字段id :return: 当前dict_id的字段信息对象 """ query_dassetdict_basic_info = db.query(SysDassetdict) \ .filter(SysDassetdict.status == 0, SysDassetdict.del_flag == 0, SysDassetdict.dict_id == dict_id) \ .distinct().first() query_dassetdict_dasset_info = db.query(SysDasset).select_from(SysDassetdict) \ .filter( SysDassetdict.status == 0, SysDassetdict.del_flag == 0, SysDassetdict.dict_id == dict_id) \ .join(SysDasset, and_(SysDassetdict.dasset_id == SysDasset.dasset_id, SysDasset.status == 0, SysDasset.del_flag == 0)) \ .distinct().first() results = dict( dassetdict_basic_info=object_format_datetime(query_dassetdict_basic_info), dassetdict_dasset_info=object_format_datetime(query_dassetdict_dasset_info) ) return CurrentDassetdictInfo(**results) @classmethod def get_dassetdict_detail_by_id(cls, db: Session, dict_id: int): """ 根据dict_id获取字段详细信息 :param db: orm对象 :param dict_id: 字段id :return: 当前dict_id的字段信息对象 """ query_dassetdict_basic_info = db.query(SysDassetdict) \ .filter(SysDassetdict.del_flag == 0, SysDassetdict.dict_id == dict_id) \ .distinct().first() query_dassetdict_dasset_info = db.query(SysDasset).select_from(SysDassetdict) \ .filter(SysDassetdict.del_flag == 0, SysDassetdict.dict_id == dict_id) \ .join(SysDasset, and_(SysDassetdict.dasset_id == SysDasset.dasset_id, SysDasset.status == 0, SysDasset.del_flag == 0)) \ .distinct().first() results = dict( dassetdict_basic_info=object_format_datetime(query_dassetdict_basic_info), dassetdict_dasset_info=object_format_datetime(query_dassetdict_dasset_info) ) return CurrentDassetdictInfo(**results) @classmethod def get_dassetdict_list(cls, db: Session, query_object: DassetdictQueryModel, data_scope_sql: str): """ 根据查询参数获取字段列表信息 :param db: orm对象 :param query_object: 查询参数对象 :param data_scope_sql: 数据权限对应的查询sql语句 :return: 字段列表信息对象 """ dassetdict_list = db.query(SysDassetdict, SysDasset) \ .filter(SysDassetdict.del_flag == 0, or_(SysDassetdict.dasset_id == query_object.dasset_id, SysDassetdict.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, SysDassetdict.dict_fn.like(f'%{query_object.dict_fn}%') if query_object.dict_fn else True, SysDassetdict.dict_fccn.like(f'%{query_object.dict_fccn}%') if query_object.dict_fccn else True, SysDassetdict.dict_pk.like(f'%{query_object.dict_pk}%') if query_object.dict_pk else True, SysDassetdict.dict_dft.like(f'%{query_object.dict_dft}%') if query_object.dict_dft else True, SysDassetdict.dict_ft.like(f'%{query_object.dict_ft}%') if query_object.dict_ft else True, SysDassetdict.data_dict_no.like(f'%{query_object.data_dict_no}%') if query_object.data_dict_no else True, SysDassetdict.dict_al.like(f'%{query_object.dict_al}%') if query_object.dict_al else True, SysDassetdict.dict_sg.like(f'%{query_object.dict_sg}%') if query_object.dict_sg else True, # SysDassetdict.dict_sg.like(f'%{query_object.dict_sg}%') if query_object.dict_sg else True, SysDassetdict.status == query_object.status if query_object.status else True, SysDassetdict.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_(SysDassetdict.dasset_id == SysDasset.dasset_id, SysDasset.status == 0, SysDasset.del_flag == 0)) \ .distinct().all() result_list: List[Union[dict, None]] = [] if dassetdict_list: for item in dassetdict_list: obj = dict( dasset_id=item[0].dasset_id, dict_id=item[0].dict_id, tab_name=item[0].tab_name, dasset_name=item[1].dasset_name if item[1] else '', dict_fn=item[0].dict_fn, tab_cn_name=item[0].tab_cn_name, data_dict_no=item[0].data_dict_no, dict_fccn=item[0].dict_fccn, dict_pk=item[0].dict_pk, dict_dft=item[0].dict_dft, dict_ft=item[0].dict_ft, dict_bc=item[0].dict_bc, dict_al=item[0].dict_al, memo=item[0].memo, dict_sg=item[0].dict_sg, 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, order_asc=item[0].order_asc ) result_list.append(obj) return format_datetime_dict_list(result_list) @classmethod def add_dassetdict_dao(cls, db: Session, dassetdict: DassetdictModel): """ 新增字段数据库操作 :param db: orm对象 :param dassetdict: 字段对象 :return: 新增校验结果 """ db_dassetdict = SysDassetdict(**dassetdict.dict()) db.add(db_dassetdict) db.commit() db.flush() # 构建原生SQL更新语句 update_sql = """ update sys_dasset_dict a join ( select dasset_id,dasset_name,dasset_remark from sys_dasset ) b on a.dasset_id = b.dasset_id set a.tab_name = b.dasset_name , a.tab_cn_name = b.dasset_remark """ # 构建原生SQL更新语句 update_sql2 = """ update sys_dasset_dict a join ( select row_number() over(PARTITION BY a.tab_name order by dict_id ) as s1, a.* from sys_dasset_dict a ) b on a.dict_id = b.dict_id set a.order_asc = b.s1 """ # 执行原生SQL db.execute(text(update_sql)) db.execute(text(update_sql2)) db.commit() db.flush() return db_dassetdict @classmethod def edit_dassetdict_dao(cls, db: Session, dassetdict: dict): """ 编辑字段数据库操作 :param db: orm对象 :param dassetdict: 需要更新的字段字典 :return: 编辑校验结果 """ db.query(SysDassetdict) \ .filter(SysDassetdict.dict_id == dassetdict.get('dict_id')) \ .update(dassetdict) db.commit() db.flush() @classmethod def delete_dassetdict_dao(cls, db: Session, dassetdict: DassetdictModel): """ 删除字段数据库操作 :param db: orm对象 :param dassetdict: 字段对象 :return: """ db.query(SysDassetdict) \ .filter(SysDassetdict.dict_id == dassetdict.dict_id) \ .delete() #.update({SysDassetdict.del_flag: '2'}) @classmethod def get_dassetdict_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_dassetdict_by_info(cls, db: Session, dassetdict: DassetdictModel): """ 根据字段信息参数获取dassetdict信息 :param db: orm对象 :param user: dassetdict参数 :return: 当前dassetdict参数的dassetdict信息对象 """ query_dassetdict_info = db.query(SysDassetdict) \ .filter(SysDassetdict.status == 0, SysDassetdict.dict_id == dassetdict.dict_id) \ .order_by(SysDassetdict.dict_id,SysDassetdict.order_asc).distinct().first() #增加排序字段的增序 return query_dassetdict_info