riskManagement_uitl.py 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337
  1. from models import *
  2. from utils import *
  3. from sqlalchemy import and_, or_
  4. from datetime import datetime, timedelta
  5. from dateutil.relativedelta import relativedelta
  6. from common.db import db_user, db_yzy, db_msg_center
  7. from common import YzyApi
  8. from config import settings
  9. def area_code_get_ancestors_names(db,area_info, ancestors_name=''):
  10. # print(area_info)
  11. if area_info is None:
  12. # print(ancestors_name)
  13. return ancestors_name
  14. else:
  15. ancestors_name = area_info.area_name + ancestors_name
  16. return area_code_get_ancestors_names(db,area_code_get_area_info(db,area_info.parent_code), ancestors_name)
  17. def area_code_get_area_info(db,area_code):
  18. # 机构id获取机构信息
  19. query = db.query(GovdataArea)
  20. query = query.filter(GovdataArea.status == '1')
  21. query = query.filter(GovdataArea.area_code == area_code)
  22. return query.first()
  23. def get_area_num(db,rang):
  24. query = db.query(GovdataArea)
  25. if rang=='0':
  26. return 1
  27. elif rang=='1':
  28. query = query.filter(and_(GovdataArea.area_code.like('%000000'),GovdataArea.area_code.notlike('%00000000')))
  29. return query.count()
  30. elif rang=='2':
  31. query = query.filter(and_(GovdataArea.area_code.like('%000'),GovdataArea.area_code.notlike('%000000')))
  32. return query.count()
  33. elif rang=='3':
  34. query = query.filter(GovdataArea.area_code.notlike('%000'))
  35. return query.count()
  36. else:
  37. return 0
  38. def get_area_code_list(db,rang):
  39. query = db.query(GovdataArea)
  40. if rang=='0':
  41. return ['440900000000']
  42. elif rang=='1':
  43. query = query.filter(and_(GovdataArea.area_code.like('%000000'),GovdataArea.area_code.notlike('%00000000')))
  44. return list({i.area_code for i in query.all()})
  45. elif rang=='2':
  46. query = query.filter(and_(GovdataArea.area_code.like('%000'),GovdataArea.area_code.notlike('%000000')))
  47. return list({i.area_code for i in query.all()})
  48. elif rang=='3':
  49. query = query.filter(GovdataArea.area_code.notlike('%000'))
  50. return list({i.area_code for i in query.all()})
  51. else:
  52. return []
  53. def get_area_code_exclude_list(db,rang,list_1):
  54. query = db.query(GovdataArea)
  55. if rang=='0' and '440900000000' not in list_1:
  56. return ['440900000000']
  57. elif rang=='1':
  58. query = query.filter(and_(GovdataArea.area_code.like('%000000'),GovdataArea.area_code.notlike('%00000000'),~GovdataArea.area_code.in_(list_1)))
  59. return list({i.area_code for i in query.all()})
  60. elif rang=='2':
  61. query = query.filter(and_(GovdataArea.area_code.like('%000'),GovdataArea.area_code.notlike('%000000'),~GovdataArea.area_code.in_(list_1)))
  62. return list({i.area_code for i in query.all()})
  63. elif rang=='3':
  64. query = query.filter(GovdataArea.area_code.notlike('%000'),~GovdataArea.area_code.in_(list_1))
  65. return list({i.area_code for i in query.all()})
  66. else:
  67. return []
  68. def area_code_get_task_range(area_code):
  69. if '00000000'==area_code[4:]:
  70. return '0'
  71. elif '00000000'!=area_code[4:] and '000000'==area_code[6:] :
  72. return '1'
  73. elif '000000'!=area_code[6:] and '000'==area_code[9:] :
  74. return '2'
  75. elif '000'!=area_code[9:]:
  76. return '3'
  77. else:
  78. return '-1'
  79. def area_code_rang_get_area_children_list(db,rang,area_code,complete_area_code_list):
  80. if int(area_code_get_task_range(area_code))>int(rang): #如果当前区划层级低于任务所属层级,返回空列表
  81. return []
  82. root_area = db.query(GovdataArea).filter_by(area_code=area_code).first()
  83. if not root_area:
  84. return [] # 如果没有找到区划,返回空列表
  85. # 然后,根据层级递归查找所有子区划
  86. area_codes = []
  87. def recursive_search(current_area):
  88. if area_code_get_task_range(current_area.area_code) == rang:
  89. if current_area.area_code not in complete_area_code_list:
  90. area_codes.append(current_area.area_code)
  91. else:
  92. for child in db.query(GovdataArea).filter_by(parent_code=current_area.area_code).all():
  93. recursive_search(child)
  94. recursive_search(root_area) # 从根区划开始递归搜索
  95. return area_codes
  96. def get_task_date_list(cycle,start_date,end_date,corn_query):
  97. # 生成日期列表
  98. date_list = []
  99. if cycle=='4': #仅一次,返回当天
  100. date_list.append(datetime.today())
  101. return date_list
  102. elif cycle=='3': #每天
  103. current_date = start_date
  104. while current_date <= end_date:
  105. # 将日期添加到列表中
  106. date_list.append(current_date)
  107. # 增加一天
  108. current_date += timedelta(days=1)
  109. return date_list
  110. elif cycle=='2': #每周
  111. days_ahead = (7+int(corn_query) - start_date.weekday()) % 7
  112. current_date = start_date + timedelta(days=days_ahead)
  113. while current_date <= end_date:
  114. # 将日期添加到列表中
  115. date_list.append(current_date)
  116. # 增加七天
  117. current_date += timedelta(days=7)
  118. return date_list
  119. elif cycle=='1': #每月
  120. if '-' in corn_query:
  121. corn_query = corn_query.split("-")[-1]
  122. days_ahead = datetime.strptime(start_date.strftime("%Y-%m-")+corn_query, "%Y-%m-%d")
  123. if days_ahead>start_date:
  124. current_date = days_ahead
  125. else:
  126. current_date = days_ahead+relativedelta(months=1)
  127. while current_date <= end_date:
  128. # 将日期添加到列表中
  129. date_list.append(current_date)
  130. # 增加七天
  131. current_date += relativedelta(months=1)
  132. return date_list
  133. elif cycle=='0': #每月
  134. if '-' in corn_query:
  135. y,m,d = corn_query.split("-")
  136. else:
  137. d,m = corn_query.split()
  138. days_ahead = datetime.strptime(start_date.strftime("%Y-")+m+'-'+d, "%Y-%m-%d")
  139. if days_ahead>start_date:
  140. current_date = days_ahead
  141. else:
  142. current_date = days_ahead+relativedelta(years=1)
  143. while current_date <= end_date:
  144. # 将日期添加到列表中
  145. date_list.append(current_date)
  146. # 增加七天
  147. current_date += relativedelta(years=1)
  148. return date_list
  149. def rang_get_user_list(db,rang):
  150. area_list = get_area_code_list(db, rang)
  151. user_list = db.query(RiskManagementInspectionUser).filter(RiskManagementInspectionUser.del_flag=='0').filter(RiskManagementInspectionUser.area_code.in_(area_list)).all()
  152. return user_list
  153. # 巡查业务
  154. def create_children_task(db,task_info,corn_query):
  155. cycle = task_info.inspection_cycle
  156. task_range = task_info.inspection_range
  157. for t in get_task_date_list(cycle,task_info.start_time,task_info.end_time,corn_query):
  158. new_children_task = RiskManagementInspectionTaskChildrenTask(
  159. id = new_guid(),
  160. task_id= task_info.id,
  161. task_number= task_info.task_number,
  162. type = task_info.inspection_business,
  163. tsak_time = t,
  164. cycle=cycle,
  165. task_range = task_range,
  166. task_num=get_area_num(db,task_range),
  167. create_by=task_info.create_by
  168. )
  169. db.add(new_children_task)
  170. db.commit()
  171. # 发送粤政易消息
  172. user_list = rang_get_user_list(db, task_range)
  173. for user_info in user_list:
  174. to_user_id = user_info.user_id
  175. yzy_account = user_info.yzy_account
  176. task_title = get_task_title_by_type(task_info.inspection_business)
  177. description = f"你有一个{task_title}任务需要处理,点击处理"
  178. detail_url = "{}/yjxp/#/worker/inspectionWork".format(settings.YZY_WEB_ROOT)
  179. foreign_key = "0"
  180. from_scenario = ""
  181. send_yzy_msg(db, to_user_id, task_info.id, yzy_account, description, detail_url, foreign_key, from_scenario)
  182. def get_task_title_by_type(type: int) -> str:
  183. if type == '0':
  184. return '城市隐患巡查'
  185. elif type == '1':
  186. return '森林防火巡查'
  187. elif type == '2':
  188. return '重点危化企业巡查'
  189. elif type == '3':
  190. return '重点水库水位巡查'
  191. else:
  192. return str(type)
  193. # 发送粤政易消息
  194. def send_yzy_msg(db: Session, to_user_id: int, task_id: int, yzy_account: str, description: str, detail_url: str, foreign_key:str, from_scenario: str) -> None:
  195. yzy_userid = db_yzy.get_userid_by_account(db, yzy_account)
  196. data = {
  197. "yzy_userid": yzy_userid,
  198. "mobile": yzy_account,
  199. "content": description,
  200. "recorded_by": 0,
  201. "detail_url": detail_url,
  202. "foreign_key": str(task_id),
  203. "from_scenario": "risk_management_inspection_task",
  204. "title": "数据报送提醒"
  205. }
  206. YzyApi.add_to_msg_queue(db, data)
  207. db_msg_center.add_msg(db, "隐患巡查", str(task_id), to_user_id)
  208. def create_risk_children_task(db,task_info,corn_query):
  209. cycle = task_info.task_cycle
  210. task_range = task_info.task_range
  211. for t in get_task_date_list(cycle,task_info.start_time,task_info.end_time,corn_query):
  212. new_children_task = RiskManagementRiskTaskChildrenTask(
  213. id = new_guid(),
  214. task_id= task_info.id,
  215. task_number= task_info.task_number,
  216. type = task_info.risk_type,
  217. tsak_time = t,
  218. cycle=cycle,
  219. task_range = task_range,
  220. task_num=get_area_num(db,task_range),
  221. create_by=task_info.create_by
  222. )
  223. db.add(new_children_task)
  224. db.commit()
  225. def create_rescue_resources_children_task(db,task_info,corn_query):
  226. cycle = task_info.task_cycle
  227. task_range = task_info.task_range
  228. for t in get_task_date_list(cycle,task_info.start_time,task_info.end_time,corn_query):
  229. new_children_task = RiskManagementRescueResourcesTaskChildrenTask(
  230. id = new_guid(),
  231. task_id= task_info.id,
  232. task_number= task_info.task_number,
  233. type = task_info.type,
  234. tsak_time = t,
  235. cycle=cycle,
  236. task_range = task_range,
  237. task_num=get_area_num(db,task_range),
  238. create_by=task_info.create_by
  239. )
  240. db.add(new_children_task)
  241. db.commit()
  242. def inspection_task_id_get_inspection_task_info(db,id):
  243. query = db.query(RiskManagementInspectionTask)
  244. query = query.filter(RiskManagementInspectionTask.del_flag != '2')
  245. query = query.filter(RiskManagementInspectionTask.id == id)
  246. return query.first()
  247. def inspection_task_children_task_id_get_inspection_task_children_task_info(db,id):
  248. query = db.query(RiskManagementInspectionTaskChildrenTask)
  249. query = query.filter(RiskManagementInspectionTaskChildrenTask.del_flag != '2')
  250. query = query.filter(RiskManagementInspectionTaskChildrenTask.id == id)
  251. return query.first()
  252. def inspection_task_children_task_id_get_inspection_task_children_task_log_info(db,children_task_id):
  253. query = db.query(RiskManagementInspectionTaskChildrenTaskLog)
  254. query = query.filter(RiskManagementInspectionTaskChildrenTaskLog.del_flag != '2')
  255. query = query.filter(RiskManagementInspectionTaskChildrenTaskLog.children_task_id == children_task_id)
  256. return query.all()
  257. def risk_task_id_get_risk_task_info(db,id):
  258. query = db.query(RiskManagementRiskTask)
  259. query = query.filter(RiskManagementRiskTask.del_flag != '2')
  260. query = query.filter(RiskManagementRiskTask.id == id)
  261. return query.first()
  262. def risk_task_children_task_id_get_risk_task_children_task_info(db,id):
  263. query = db.query(RiskManagementRiskTaskChildrenTask)
  264. query = query.filter(RiskManagementRiskTaskChildrenTask.del_flag != '2')
  265. query = query.filter(RiskManagementRiskTaskChildrenTask.id == id)
  266. return query.first()
  267. def risk_task_children_task_id_get_risk_task_children_task_log_info(db,children_task_id):
  268. query = db.query(RiskManagementRiskTaskChildrenTaskLog)
  269. query = query.filter(RiskManagementRiskTaskChildrenTaskLog.del_flag != '2')
  270. query = query.filter(RiskManagementRiskTaskChildrenTaskLog.children_task_id == children_task_id)
  271. return query.all()
  272. def resource_task_id_get_resource_task_info(db,id):
  273. query = db.query(RiskManagementRescueResourcesTask)
  274. query = query.filter(RiskManagementRescueResourcesTask.del_flag != '2')
  275. query = query.filter(RiskManagementRescueResourcesTask.id == id)
  276. return query.first()
  277. def resource_task_children_task_id_get_resource_task_children_task_info(db,id):
  278. query = db.query(RiskManagementRescueResourcesTaskChildrenTask)
  279. query = query.filter(RiskManagementRescueResourcesTaskChildrenTask.del_flag != '2')
  280. query = query.filter(RiskManagementRescueResourcesTaskChildrenTask.id == id)
  281. return query.first()
  282. def resource_task_children_task_id_get_resource_task_children_task_log_info(db,children_task_id):
  283. query = db.query(RiskManagementRescueResourcesTaskChildrenTaskLog)
  284. query = query.filter(RiskManagementRescueResourcesTaskChildrenTaskLog.del_flag != '2')
  285. query = query.filter(RiskManagementRescueResourcesTaskChildrenTaskLog.children_task_id == children_task_id)
  286. return query.all()
  287. def get_file_query_fun(db,from_scenario,foreign_key):
  288. file_query = db.query(RiskManagementFile)
  289. file_query = file_query.filter(RiskManagementFile.del_flag != '2')
  290. file_query = file_query.filter(RiskManagementFile.from_scenario == from_scenario)
  291. file_query = file_query.filter(RiskManagementFile.foreign_key == foreign_key)
  292. files = file_query.all()
  293. result = [{
  294. "uid": file.file_id,
  295. "status": file.status,
  296. "name": file.file_name_desc,
  297. "url": file.file_name #"/api/file/download/%s" %
  298. } for file in files]
  299. return result
  300. def user_id_get_task_range(db,user_id):
  301. query = db.query(RiskManagementInspectionUser)
  302. query = query.filter(RiskManagementInspectionUser.del_flag!='2')
  303. query = query.filter(RiskManagementInspectionUser.user_id==user_id)
  304. area_code_list = query.all()
  305. result = []
  306. for i in area_code_list:
  307. task_range = area_code_get_task_range(i.area_code)
  308. if task_range not in result:
  309. result.append(task_range)
  310. return result