from models import * from utils import * from sqlalchemy import and_, or_ from datetime import datetime, timedelta from dateutil.relativedelta import relativedelta from common.db import db_user, db_yzy, db_msg_center, db_dict from common import YzyApi from config import settings def area_code_get_ancestors_names(db,area_info, ancestors_name=''): # print(area_info) if area_info is None: # print(ancestors_name) return ancestors_name else: ancestors_name = area_info.area_name + ancestors_name return area_code_get_ancestors_names(db,area_code_get_area_info(db,area_info.parent_code), ancestors_name) def area_code_get_area_info(db,area_code): # 机构id获取机构信息 query = db.query(GovdataArea) query = query.filter(GovdataArea.status == '1') query = query.filter(GovdataArea.area_code == area_code) return query.first() def get_area_num(db,rang): query = db.query(GovdataArea) if rang=='0': return 1 elif rang=='1': query = query.filter(and_(GovdataArea.area_code.like('%000000'),GovdataArea.area_code.notlike('%00000000'))) return query.count() elif rang=='2': query = query.filter(and_(GovdataArea.area_code.like('%000'),GovdataArea.area_code.notlike('%000000'))) return query.count() elif rang=='3': query = query.filter(GovdataArea.area_code.notlike('%000')) return query.count() else: return 0 def get_area_code_list(db,rang): query = db.query(GovdataArea) if rang=='0': return ['440900000000'] elif rang=='1': query = query.filter(and_(GovdataArea.area_code.like('%000000'),GovdataArea.area_code.notlike('%00000000'))) return list({i.area_code for i in query.all()}) elif rang=='2': query = query.filter(and_(GovdataArea.area_code.like('%000'),GovdataArea.area_code.notlike('%000000'))) return list({i.area_code for i in query.all()}) elif rang=='3': query = query.filter(GovdataArea.area_code.notlike('%000')) return list({i.area_code for i in query.all()}) else: return [] def get_area_code_exclude_list(db,rang,list_1): query = db.query(GovdataArea) if rang=='0' and '440900000000' not in list_1: return ['440900000000'] elif rang=='1': query = query.filter(and_(GovdataArea.area_code.like('%000000'),GovdataArea.area_code.notlike('%00000000'),~GovdataArea.area_code.in_(list_1))) return list({i.area_code for i in query.all()}) elif rang=='2': query = query.filter(and_(GovdataArea.area_code.like('%000'),GovdataArea.area_code.notlike('%000000'),~GovdataArea.area_code.in_(list_1))) return list({i.area_code for i in query.all()}) elif rang=='3': query = query.filter(GovdataArea.area_code.notlike('%000'),~GovdataArea.area_code.in_(list_1)) return list({i.area_code for i in query.all()}) else: return [] def area_code_get_task_range(area_code): if '00000000'==area_code[4:]: return '0' elif '00000000'!=area_code[4:] and '000000'==area_code[6:] : return '1' elif '000000'!=area_code[6:] and '000'==area_code[9:] : return '2' elif '000'!=area_code[9:]: return '3' else: return '-1' def area_code_rang_get_area_children_list(db,rang,area_code,complete_area_code_list): if int(area_code_get_task_range(area_code))>int(rang): #如果当前区划层级低于任务所属层级,返回空列表 return [] root_area = db.query(GovdataArea).filter_by(area_code=area_code).first() if not root_area: return [] # 如果没有找到区划,返回空列表 # 然后,根据层级递归查找所有子区划 area_codes = [] def recursive_search(current_area): if area_code_get_task_range(current_area.area_code) == rang: if current_area.area_code not in complete_area_code_list: area_codes.append(current_area.area_code) else: for child in db.query(GovdataArea).filter_by(parent_code=current_area.area_code).all(): recursive_search(child) recursive_search(root_area) # 从根区划开始递归搜索 return area_codes def get_task_date_list(cycle,start_date,end_date,corn_query): # 生成日期列表 date_list = [] if cycle=='4': #仅一次,返回当天 date_list.append(start_date)#datetime.today()) #是否需要加个日期? return date_list elif cycle=='3': #每天 current_date = start_date while current_date <= end_date: # 将日期添加到列表中 date_list.append(current_date) # 增加一天 current_date += timedelta(days=1) return date_list elif cycle=='2': #每周 days_ahead = (7+int(corn_query) - start_date.weekday()) % 7 current_date = start_date + timedelta(days=days_ahead) while current_date <= end_date: # 将日期添加到列表中 date_list.append(current_date) # 增加七天 current_date += timedelta(days=7) return date_list elif cycle=='1': #每月 if '-' in corn_query: corn_query = corn_query.split("-")[-1] days_ahead = datetime.strptime(start_date.strftime("%Y-%m-")+corn_query, "%Y-%m-%d") if days_ahead>start_date: current_date = days_ahead else: current_date = days_ahead+relativedelta(months=1) while current_date <= end_date: # 将日期添加到列表中 date_list.append(current_date) # 增加七天 current_date += relativedelta(months=1) return date_list elif cycle=='0': #每月 if '-' in corn_query: m,d = corn_query.split("-") else: d,m = corn_query.split() days_ahead = datetime.strptime(start_date.strftime("%Y-")+m+'-'+d, "%Y-%m-%d") if days_ahead>start_date: current_date = days_ahead else: current_date = days_ahead+relativedelta(years=1) while current_date <= end_date: # 将日期添加到列表中 date_list.append(current_date) # 增加七天 current_date += relativedelta(years=1) return date_list def rang_get_user_list(db,rang): area_list = get_area_code_list(db, rang) user_list = db.query(RiskManagementInspectionUser).filter(RiskManagementInspectionUser.del_flag=='0').filter(RiskManagementInspectionUser.area_code.in_(area_list)).all() return user_list # 巡查业务 def create_children_task(db,task_info,corn_query): cycle = task_info.inspection_cycle task_range = task_info.inspection_range for t in get_task_date_list(cycle,task_info.start_time,task_info.end_time,corn_query): new_children_task = RiskManagementInspectionTaskChildrenTask( id = new_guid(), task_id= task_info.id, task_number= task_info.task_number, type = task_info.inspection_business, tsak_time = t, cycle=cycle, task_range = task_range, task_num=get_area_num(db,task_range), create_by=task_info.create_by ) db.add(new_children_task) db.commit() # 发送粤政易消息 user_list = rang_get_user_list(db, task_range) for user_info in user_list: to_user_id = user_info.user_id yzy_account = user_info.yzy_account task_title = get_task_title_by_type(task_info.inspection_business) description = f"你有一个{task_title}任务需要处理,点击处理" detail_url = "{}/yjxp/#/worker/inspectionWork".format(settings.YZY_WEB_ROOT) foreign_key = str(task_info.id) from_scenario = "risk_management_inspection_task" send_yzy_msg(db, "隐患巡查", to_user_id, yzy_account, description, detail_url, foreign_key, from_scenario) def get_task_title_by_type(type: str) -> str: if type == '0': return '城市隐患巡查' elif type == '1': return '森林防火巡查' elif type == '2': return '重点危化企业巡查' elif type == '3': return '重点水库水位巡查' else: return str(type) # 发送粤政易消息 def send_yzy_msg(db: Session, msg_type: str, to_user_id: int, yzy_account: str, description: str, detail_url: str, foreign_key:str, from_scenario: str) -> None: yzy_userid = db_yzy.get_userid_by_account(db, yzy_account) data = { "yzy_userid": yzy_userid, "mobile": yzy_account, "content": description, "recorded_by": 0, "detail_url": detail_url, "foreign_key": foreign_key, "from_scenario": from_scenario, "title": "数据报送提醒" } YzyApi.add_to_msg_queue(db, data) db_msg_center.add_message(db, msg_type, to_user_id, "数据报送提醒", description, foreign_key, from_scenario) # 风险防控排查 def create_risk_children_task(db,task_info,corn_query): cycle = task_info.task_cycle task_range = task_info.task_range for t in get_task_date_list(cycle,task_info.start_time,task_info.end_time,corn_query): new_children_task = RiskManagementRiskTaskChildrenTask( id = new_guid(), task_id= task_info.id, task_number= task_info.task_number, type = task_info.risk_type, tsak_time = t, cycle=cycle, task_range = task_range, task_num=get_area_num(db,task_range), create_by=task_info.create_by ) db.add(new_children_task) db.commit() # 发送粤政易消息 user_list = rang_get_user_list(db, task_range) for user_info in user_list: to_user_id = user_info.user_id yzy_account = user_info.yzy_account task_title = db_dict.get_dict_label(db, 'risk_type', task_info.risk_type) description = f"你有一个{task_title}任务需要处理,点击处理" detail_url = "{}/yjxp/#/worker/riskManagement".format(settings.YZY_WEB_ROOT) foreign_key = str(task_info.id) from_scenario = "risk_management_risk_task" send_yzy_msg(db, "风险排查", to_user_id, yzy_account, description, detail_url, foreign_key, from_scenario) def create_rescue_resources_children_task(db,task_info,corn_query): cycle = task_info.task_cycle task_range = task_info.task_range for t in get_task_date_list(cycle,task_info.start_time,task_info.end_time,corn_query): new_children_task = RiskManagementRescueResourcesTaskChildrenTask( id = new_guid(), task_id= task_info.id, task_number= task_info.task_number, type = task_info.type, tsak_time = t, cycle=cycle, task_range = task_range, task_num=get_area_num(db,task_range), create_by=task_info.create_by ) db.add(new_children_task) db.commit() # 发送粤政易消息 user_list = rang_get_user_list(db, task_range) for user_info in user_list: to_user_id = user_info.user_id yzy_account = user_info.yzy_account task_title = get_rescue_resources_task_title_by_type(task_info.type) description = f"你有一个{task_title}任务需要处理,点击处理" detail_url = "{}/yjxp/#/worker/rescueManagement".format(settings.YZY_WEB_ROOT) foreign_key = str(task_info.id) from_scenario = "risk_management_rescue_resources_task" send_yzy_msg(db, "数据采集", to_user_id, yzy_account, description, detail_url, foreign_key, from_scenario) def get_rescue_resources_task_title_by_type(type: str) -> str: if type == '0': return '庇护场所' elif type == '1': return '救援队伍' elif type == '2': return '救援设备' else: return str(type) def inspection_task_id_get_inspection_task_info(db,id): query = db.query(RiskManagementInspectionTask) query = query.filter(RiskManagementInspectionTask.del_flag != '2') query = query.filter(RiskManagementInspectionTask.id == id) return query.first() def inspection_task_children_task_id_get_inspection_task_children_task_info(db,id): query = db.query(RiskManagementInspectionTaskChildrenTask) query = query.filter(RiskManagementInspectionTaskChildrenTask.del_flag != '2') query = query.filter(RiskManagementInspectionTaskChildrenTask.id == id) return query.first() def inspection_task_children_task_id_get_inspection_task_children_task_log_info(db,children_task_id): query = db.query(RiskManagementInspectionTaskChildrenTaskLog) query = query.filter(RiskManagementInspectionTaskChildrenTaskLog.del_flag != '2') query = query.filter(RiskManagementInspectionTaskChildrenTaskLog.children_task_id == children_task_id) return query.all() def risk_task_id_get_risk_task_info(db,id): query = db.query(RiskManagementRiskTask) query = query.filter(RiskManagementRiskTask.del_flag != '2') query = query.filter(RiskManagementRiskTask.id == id) return query.first() def risk_task_children_task_id_get_risk_task_children_task_info(db,id): query = db.query(RiskManagementRiskTaskChildrenTask) query = query.filter(RiskManagementRiskTaskChildrenTask.del_flag != '2') query = query.filter(RiskManagementRiskTaskChildrenTask.id == id) return query.first() def risk_task_children_task_id_get_risk_task_children_task_log_info(db,children_task_id): query = db.query(RiskManagementRiskTaskChildrenTaskLog) query = query.filter(RiskManagementRiskTaskChildrenTaskLog.del_flag != '2') query = query.filter(RiskManagementRiskTaskChildrenTaskLog.children_task_id == children_task_id) return query.all() def resource_task_id_get_resource_task_info(db,id): query = db.query(RiskManagementRescueResourcesTask) query = query.filter(RiskManagementRescueResourcesTask.del_flag != '2') query = query.filter(RiskManagementRescueResourcesTask.id == id) return query.first() def resource_task_children_task_id_get_resource_task_children_task_info(db,id): query = db.query(RiskManagementRescueResourcesTaskChildrenTask) query = query.filter(RiskManagementRescueResourcesTaskChildrenTask.del_flag != '2') query = query.filter(RiskManagementRescueResourcesTaskChildrenTask.id == id) return query.first() def resource_task_children_task_id_get_resource_task_children_task_log_info(db,children_task_id): query = db.query(RiskManagementRescueResourcesTaskChildrenTaskLog) query = query.filter(RiskManagementRescueResourcesTaskChildrenTaskLog.del_flag != '2') query = query.filter(RiskManagementRescueResourcesTaskChildrenTaskLog.children_task_id == children_task_id) return query.all() def get_file_query_fun(db,from_scenario,foreign_key): file_query = db.query(RiskManagementFile) file_query = file_query.filter(RiskManagementFile.del_flag != '2') file_query = file_query.filter(RiskManagementFile.from_scenario == from_scenario) file_query = file_query.filter(RiskManagementFile.foreign_key == foreign_key) files = file_query.all() result = [{ "uid": file.file_id, "status": file.status, "name": file.file_name_desc, "url": file.file_name #"/api/file/download/%s" % } for file in files] return result def user_id_get_task_range(db,user_id): query = db.query(RiskManagementInspectionUser) query = query.filter(RiskManagementInspectionUser.del_flag!='2') query = query.filter(RiskManagementInspectionUser.user_id==user_id) area_code_list = query.all() result = [] for i in area_code_list: task_range = area_code_get_task_range(i.area_code) if task_range not in result: result.append(task_range) return result