規則分配腳本

需求:

1.根據用戶編寫的要報規則,去mysql庫里SysManage_Rule表獲取已經啟用的規則作為條件(例如[{“field”: “關鍵詞”, “logic”: “AND”, “value”: “阿爾法”, “operator”: “=”,, “assign_user”: “user222”}])條件即為:關鍵詞=阿爾法
2.根據此條件去lxdb的all_report表進行查詢,查詢邏輯是每10min獲取最新數據,滿足條件的對all_report表的report_handler字段打上分配人名以及yb_importanceid填上要報規則的id
要報規則頁面:
在這里插入圖片描述
SysManage_Rule表
在這里插入圖片描述

解決辦法

規則分配腳本(supervisor運行):

import argparse
import os
import django
import time
from datetime import datetime, timedelta
import sys
import json# 添加項目路徑,確保 Django 配置正確
sys.path.append('/home/rpadmin/web/yb-backend')# 初始化 Django 環境
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "yb.settings")
django.setup()# 導入自定義模塊和參數
from DBreport.functions.get_table_mapping import get_gather_table
from wrapper.Params import TOREPORT, GATHER_TABLE
from DBconn.DBfunctions.dynamicQueryBase import DynamicQueryBaseEngine
from SysManage.models import SysmanageRule# 字段名映射:中文字段名 -> 英文字段名
field_mapping = {"報文要素": "text_content","語種": "audio_languagename","關鍵詞": "keyword","文種": "text_lang","實體": "text_entity","來源手段": "hj_means"
}# 初始記錄時間,第一次運行查很早之前的數據
last_run_time = datetime.now() - timedelta(minutes=1600000)def replace_field_names(data, mapping):new_data = {}for user, rules in data.items():new_rules = []for rule in rules:new_rule = rule.copy()if new_rule.get('field') in mapping:new_rule['field'] = mapping[new_rule['field']]new_rules.append(new_rule)new_data[user] = new_rulesreturn new_datadef run_rule_dispatch():global last_run_time# 獲取數據庫連接和數據表對象db_conn = get_gather_table()gather_table = db_conn.load_table(GATHER_TABLE)print("[調試] all_report 字段列表:", [col.name for col in gather_table.columns])# 查詢所有啟用狀態的規則rules = SysmanageRule.objects.filter(rule_status=1)for rule in rules:rule_id = rule.idrule_name = rule.rule_namerule_content = rule.rule_content# 檢查規則內容格式是否為列表if isinstance(rule_content, list):conditions = rule_contentelse:print(f"[跳過] 規則《{rule_name}》內容應為列表格式")continue# 替換條件中的字段名conditions = replace_field_names({rule_name: conditions}, field_mapping)[rule_name]filters = []keyword_value = None  # 保存關鍵詞值(如果存在)for cond in conditions:field = cond.get("field")operator = cond.get("operator")value = cond.get("value")if cond.get("assign_user"):assign_user = cond["assign_user"]if not field or not operator or value is None:continue# 如果字段為 keyword 且是等于操作,延遲處理if field == "keyword" and operator == "=":keyword_value = valueelse:filters.append((field, operator, value))# 增加時間過濾:只查上次運行之后新增的數據filters.append(('hj_createtime', '>=', last_run_time))# 關鍵詞特殊處理:模糊匹配 audio_asr 或 trans_sidebyside 的 original_content/ translat_content 字段if keyword_value is not None:# audio_asr 模糊匹配filters_audio = filters + [('audio_asr', 'like', f"%{keyword_value}%")]# 執行原始查詢(不帶關鍵詞)用于后續文本內容篩選raw_trans_records = db_conn.execute_dynamic_query(gather_table,filters,limit=5,  # 僅預覽前5條,必要時可調整或移除ignore_fields=[])matched_trans_data = []for row in raw_trans_records['data']:try:trans_data = row.get('trans_sidebyside')if isinstance(trans_data, str):trans_data = json.loads(trans_data)  # JSON 反序列化if isinstance(trans_data, dict):original = trans_data.get("original_content", "")translated = trans_data.get("translat_content", "")if keyword_value in original or keyword_value in translated:matched_trans_data.append(row)except Exception:continue# 執行 audio_asr 匹配查詢result1 = db_conn.execute_dynamic_query(gather_table, filters_audio, ignore_fields=[])# 合并兩類結果(根據 lxid 去重)combined_data = {row['lxid']: row for row in result1['data']}for row in matched_trans_data:combined_data.setdefault(row['lxid'], row)total_count = len(combined_data)print(f"[調試] 條件命中記錄數:{total_count}")if total_count:first_row = list(combined_data.values())[0]print("[調試] 命中示例記錄:", first_row)# 構造更新內容updates = {'report_handler': assign_user,'yb_importanceid': str(rule_id),'yb_importancename': rule_name,'assign_rule_type': TOREPORT}# 遍歷命中記錄逐條更新affected = 0for row in combined_data.values():row_filter = [('lxid', '=', row['lxid'])]try:count = DynamicQueryBaseEngine.update_record(db_conn, gather_table, updates, row_filter)affected += countexcept Exception as e:print(f"[×] 更新失敗:{str(e)}")print(f"[?] 規則《{rule_name}》執行成功,分配人:{assign_user},更新{affected}條")continue# 正常流程處理:無關鍵詞匹配邏輯print(f"[調試] 規則《{rule_name}》篩選條件:{filters}")result_data = db_conn.execute_dynamic_query(gather_table,filters,limit=5,ignore_fields=[])print(f"[調試] 條件命中記錄數:{result_data['total_count']}")if result_data['data']:print("[調試] 命中示例記錄:", result_data['data'][0])updates = {'report_handler': assign_user,'yb_importanceid': str(rule_id),'yb_importancename': rule_name,'assign_rule_type': TOREPORT}try:affected = DynamicQueryBaseEngine.update_record(db_conn, gather_table, updates, filters)print(f"[?] 規則《{rule_name}》執行成功,分配人:{assign_user},更新{affected}條")except Exception as e:print(f"[×] 規則《{rule_name}》執行失敗:{str(e)}")# 關閉連接,記錄當前時間用于下輪過濾db_conn.close()last_run_time = datetime.now()if __name__ == "__main__":while True:print(f"\n[調試] 開始執行調度任務,當前時間:{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")run_rule_dispatch()print(f"[調試] 任務執行完成,等待10分鐘...\n")time.sleep(600)  # 每10分鐘運行一次

指定分配人接口(即向rule_content字段里添加assign_user):

@class_operation_logger(operation_name="/指定要報規則分配人")
class RuleAssignUserUpdateAPIView(APIView):"""接收 assign_user 和 規則id,指定規則的 rule_content 中每一項的 assign_userPOST /api/sys/update-assign-user/Body:{"id": 2,"assign_user": "user002"}"""def post(self, request, *args, **kwargs):rule_id = request.data.get("id")assign_user = request.data.get("assign_user")if not rule_id or not assign_user:return ErrorResponse(data=False, msg="參數id 和 assign_user 都是必填的")# 獲取要更新的規則rule = get_object_or_404(SysmanageRule, pk=rule_id)try:content_list = rule.rule_content or []if not isinstance(content_list, list):raise ValueError("rule_content 必須是列表")except Exception as e:return ErrorResponse(data=False, msg=f"讀取 rule_content 失敗:{str(e)}")# 創建或更新每一項的 assign_userfor cond in content_list:cond['assign_user'] = assign_user# 保存回庫rule.rule_content = content_listrule.save(update_fields=['rule_content'])return SuccessResponse(msg=f"id為 {rule_id} 的規則的分配人已更新為 {assign_user}")

Supervisor工具詳見文章Supervisor進程管理

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/916220.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/916220.shtml
英文地址,請注明出處:http://en.pswp.cn/news/916220.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SEO實戰派白楊SEO:SEO中說的框計算、知心搜索(知識圖譜)是什么?有什么用處?

SEO里框計算是什么?有什么用處?SEO里框計劃算是百度2010年提出的,指當用戶搜索某些關鍵詞查詢時,搜索引擎在結果頁直接展示答案的技術(如天氣、匯率等),用戶無需點擊網站即可獲取信息&#xff0…

軟件工程:軟件需求

簡介本篇博客記錄了我在軟件工程學習過程中關于軟件需求與面向對象基礎知識的學習體會和要點總結。博客共分為三個關卡內容:第1關圍繞“軟件需求”的定義、分類及分析過程展開,讓我清晰地理解了功能性需求、非功能性需求與約束條件的區別;第2…

MES系統是什么,有哪些特性?

MES系統是一套面向制造企業車間執行層的生產信息化管理系統。它能夠為操作人員和管理人員提供計劃的執行、跟蹤以及所有資源(包括人、設備、物料、客戶需求等)的當前狀態。通過MES系統可以對從訂單下達到產品完成的整個生產過程進行優化管理。當工廠發生…

Vue2下

六:vue-router (重要) (一). 對路由的理解 1.什么是路由 路由(Router) 是管理頁面跳轉和 URL 與視圖映射關系的機制,核心作用是:根據不同的 URL 路徑,展示對…

在 Windows 上安裝設置 MongoDB及常見問題

介紹 MongoDB 是一個開源的 NoSQL 數據庫系統,它以一種靈活的類似 JSON 的格式(稱為 BSON(二進制 JSON))存儲數據。它使用動態模式,這意味著與關系型數據庫不同,MongoDB 不需要在向數據庫添加數…

Effective C++ 條款01:視 C++ 為一個語言聯邦

Effective C 條款01:視 C 為一個語言聯邦核心思想:C 是由多個子語言組成的聯邦,每個子語言有自己的編程范式。理解這些子語言及其規則切換,是寫出高效 C 代碼的關鍵。 四個子語言及其規則: C 語言 基礎:過程…

云效CI/CD教程(PHP項目)

參考文檔 參考云效的官方文檔https://help.aliyun.com/zh/yunxiao/ 一、新建代碼庫 這是第一步,和碼云的差不多 二、配SSH密鑰 這個和碼云,github上類似,都需要,云效的SSH密鑰證書不是采用 RSA算法,而是采用了ED2…

單片機是怎么控制的

單片機作為電子系統的控制核心,通過接收外部信號、執行預設程序、驅動外部設備的方式實現控制功能,其控制過程涉及信號輸入、數據處理和指令輸出三個關鍵環節,每個環節的協同配合決定了整體控制效果。 信號輸入:獲取外部信息 單片…

deepseek本地部署,輕松實現編程自由

小伙伴們,大家好,今天我們來實現deepseek本地部署,輕松實現編程自由!安裝ollama 安裝ollama 首先我們安裝ollama 打開ollama官網,下載安裝符合自己系統的版本。 找到要安裝的模型deepseek-r1開始-運行 輸入cmd出現…

基礎NLP | 常用工具

編輯器 PycharmVSCodeSpyderPython 自帶 ideVim 機器學習相關python框架 Pytorch 學術界寵兒,調試方便,目前的主流Tensorflow 大名鼎鼎,工程配套完善Keras 高級封裝,簡單好用,現已和Tensorflow合體Gensim 訓練詞向…

Unity3D + VR頭顯 × RTSP|RTMP播放器:構建沉浸式遠程診療系統的技術實踐

一、背景:遠程醫療邁入“沉浸式協同”的新階段 過去,遠程醫療主要依賴視頻會議系統,實現基礎的遠程問診、會診或術中指導。雖然初步解決了地域限制問題,但其單視角、平面化、缺乏沉浸感與交互性的特征,已無法滿足臨床…

海云安斬獲“智能金融創新應用“標桿案例 彰顯AI安全左移技術創新實力

近日,由中國人民銀行廣東省分行、廣東省金融管理局、廣東省政務服務和數據管理局指導,廣東省金融科技協會主辦的“智能金融 創新應用”優秀案例名單最終揭曉,海云安開發者安全助手系統項目憑借其創新的"AI安全左移"技術架構&#x…

Fluent許可與網絡安全策略

在流體動力學模擬領域,Fluent軟件因其卓越的性能和廣泛的應用而備受用戶青睞。然而,隨著網絡安全威脅的不斷增加,確保Fluent許可的安全性和合規性變得尤為重要。本文將探討Fluent許可與網絡安全策略的關系,為您提供一套有效的安全…

如何借助AI工具?打贏通信設備制造的高風險之戰?(案例分享)

你是否曾在項目管理中遇到過那種讓人心跳加速的瞬間,當一項風險突然暴露出來時,全隊似乎都屏住了呼吸?今天,我就來分享一個我親歷的項目案例,講述我們如何借助具體的AI工具,實現從數據到決策的華麗轉變&…

Web服務器(Tomcat、項目部署)

1. 簡介 1.1 什么是Web服務器 Web服務器是一個應用程序(軟件),對HTTP協議的操作進行封裝,使得程序員不必直接對協議進行操作,讓Web開發更加便捷。主要功能是"提供網上信息瀏覽服務"。 Web服務器是安裝在服…

list 介紹 及 底層

list的相關文檔:list - C Reference 一、list的介紹及使用 list中的接口比較多,此處類似,只需要掌握如何正確的使用,然后再去深入研究背后的原理,已達到可擴展的能力。以下為list中一些常見的重要接口。我們庫里的list…

HCIP MGRE實驗

一、實驗要求 1、R5為ISP,只能進行IP地址配置,其所有地址均配為公有Ip地址; 2、 R1和R5間使用PPP的PAP認證,R5為主認證方; R2與R5之間使用PPP的CHAP認證,R5為主認證方; R3與R5之間使用HDLC封裝; 3、R2、R3構建一…

基于PyTorch的多視角二維流場切片三維流場預測模型

基于PyTorch的多視角二維流場切片三維流場預測模型 前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家,覺得好請收藏。點擊跳轉到網站。 1. 引言 計算流體動力學(CFD)在工程設計和科學研究中扮演…

全新輕量化PHP網盤搜索引擎系統源碼

內容目錄一、詳細介紹二、效果展示1.部分代碼2.效果圖展示三、學習資料下載一、詳細介紹 全新輕量化PHP網盤搜索引擎系統源碼 基于PHPMYSQL開發 一、多樣篩選功能:網站支持5類篩選功能,包括默認搜索、網盤類型、文件大小、時間排序以及網盤來源&#x…

C study notes[3]

文章目錄operatonsloopsreferencesoperatons the fundamental operators such as ,-,* in C language can be simply manipulated. int sum 5 3; // sum 8 int difference 10 - 4; // difference 6 int product 6 * 7; // product 42the operator / was left to in…