2025-11-12 14:01:26 +08:00
|
|
|
|
|
|
|
|
|
|
"""监控服务"""
|
|
|
|
|
|
import time
|
|
|
|
|
|
import threading
|
|
|
|
|
|
from datetime import datetime
|
|
|
|
|
|
from database.access_db import AccessDB
|
|
|
|
|
|
from database.sql_server import SQLServerDB
|
|
|
|
|
|
from config.settings import ACCESS_DB_PATH, ACCESS_DB_PASSWORD, MONITOR_INTERVAL
|
|
|
|
|
|
from tcp.server import TCPServer
|
|
|
|
|
|
|
|
|
|
|
|
class MonitoringService:
|
|
|
|
|
|
def __init__(self, tcp_server):
|
|
|
|
|
|
self.tcp_server = tcp_server
|
|
|
|
|
|
self.task_flags = {}
|
|
|
|
|
|
self.monitored_tasks = set()
|
|
|
|
|
|
self.inserted_tasks = {}
|
|
|
|
|
|
self.tasks_lock = threading.Lock()
|
|
|
|
|
|
|
|
|
|
|
|
def monitor_access_flag_changes(self):
|
|
|
|
|
|
"""监控Access数据库中派发任务的Flag状态"""
|
|
|
|
|
|
print("开始监控Access数据库中派发任务的Flag状态")
|
|
|
|
|
|
|
|
|
|
|
|
while True:
|
|
|
|
|
|
try:
|
|
|
|
|
|
# 每2秒检查一次
|
|
|
|
|
|
time.sleep(MONITOR_INTERVAL)
|
|
|
|
|
|
|
|
|
|
|
|
with self.tasks_lock:
|
|
|
|
|
|
# 如果没有需要监控的任务,跳过
|
|
|
|
|
|
if not self.monitored_tasks:
|
|
|
|
|
|
continue
|
|
|
|
|
|
|
|
|
|
|
|
# 创建需要监控的任务列表副本
|
|
|
|
|
|
tasks_to_monitor = self.monitored_tasks.copy()
|
|
|
|
|
|
|
|
|
|
|
|
# 检查SQL Server中任务是否还存在
|
|
|
|
|
|
sql_db = SQLServerDB()
|
|
|
|
|
|
try:
|
|
|
|
|
|
existing_tasks_in_sql = sql_db.check_existing_tasks(list(tasks_to_monitor))
|
|
|
|
|
|
finally:
|
|
|
|
|
|
sql_db.close()
|
|
|
|
|
|
|
|
|
|
|
|
# 分离已删除和未删除的任务
|
|
|
|
|
|
erp_ids_str = [str(erp_id) for erp_id in tasks_to_monitor]
|
|
|
|
|
|
deleted_from_sql_tasks = set(erp_ids_str) - existing_tasks_in_sql
|
|
|
|
|
|
|
|
|
|
|
|
print(f"SQL Server中仍存在的任务: {existing_tasks_in_sql}")
|
|
|
|
|
|
print(f"已从SQL Server删除的任务: {deleted_from_sql_tasks}")
|
|
|
|
|
|
|
|
|
|
|
|
# 只有已从SQL Server删除的任务才需要在Access中查找
|
|
|
|
|
|
if not deleted_from_sql_tasks:
|
|
|
|
|
|
continue
|
|
|
|
|
|
|
|
|
|
|
|
# 查询Access数据库中已删除任务的状态
|
|
|
|
|
|
access_db = AccessDB(ACCESS_DB_PATH, ACCESS_DB_PASSWORD)
|
|
|
|
|
|
try:
|
|
|
|
|
|
current_tasks = access_db.query_task_status(list(deleted_from_sql_tasks))
|
|
|
|
|
|
finally:
|
|
|
|
|
|
access_db.close()
|
|
|
|
|
|
|
|
|
|
|
|
# 处理任务状态变化
|
|
|
|
|
|
self._process_task_status_changes(deleted_from_sql_tasks, current_tasks)
|
|
|
|
|
|
|
|
|
|
|
|
except Exception as e:
|
|
|
|
|
|
print(f"监控Access数据库 Flag时发生错误: {e}")
|
|
|
|
|
|
import traceback
|
|
|
|
|
|
traceback.print_exc()
|
|
|
|
|
|
continue
|
|
|
|
|
|
|
|
|
|
|
|
def _process_task_status_changes(self, deleted_from_sql_tasks, current_tasks):
|
|
|
|
|
|
"""处理任务状态变化"""
|
|
|
|
|
|
# 检查每个已删除任务的状态变化
|
|
|
|
|
|
for erp_id_str in deleted_from_sql_tasks:
|
|
|
|
|
|
erp_id = int(erp_id_str)
|
|
|
|
|
|
current_flag = current_tasks.get(erp_id_str, "")
|
|
|
|
|
|
previous_flag = self.task_flags.get(erp_id_str, "")
|
|
|
|
|
|
|
|
|
|
|
|
# 添加调试信息
|
|
|
|
|
|
print(f"检查任务 {erp_id} - 当前Flag: '{current_flag}', 之前Flag: '{previous_flag}'")
|
|
|
|
|
|
|
|
|
|
|
|
# 如果状态发生变化
|
|
|
|
|
|
if current_flag != previous_flag:
|
|
|
|
|
|
with self.tasks_lock:
|
|
|
|
|
|
artifact_id = self.inserted_tasks.get(erp_id, "Unknown")
|
|
|
|
|
|
print(
|
|
|
|
|
|
f"派发任务 ErpID {erp_id} (ArtifactID: {artifact_id}) 的Flag值已更新: {previous_flag} -> {current_flag}")
|
|
|
|
|
|
self.task_flags[erp_id_str] = current_flag
|
|
|
|
|
|
|
|
|
|
|
|
# 根据Flag值末尾的字母执行相应操作并更新自定义数据表状态
|
|
|
|
|
|
self._handle_flag_status_change(erp_id, current_flag, artifact_id)
|
|
|
|
|
|
|
|
|
|
|
|
# 检查是否有任务记录已被删除(不在查询结果中但仍在监控列表中)
|
|
|
|
|
|
# 这表示任务可能已完成或从系统中移除
|
|
|
|
|
|
missing_tasks = set(deleted_from_sql_tasks) - set(current_tasks.keys())
|
|
|
|
|
|
if missing_tasks:
|
|
|
|
|
|
self._handle_missing_tasks(missing_tasks)
|
|
|
|
|
|
|
|
|
|
|
|
def _handle_flag_status_change(self, erp_id, current_flag, artifact_id):
|
|
|
|
|
|
"""处理标志状态变化"""
|
|
|
|
|
|
if current_flag.endswith('d'):
|
|
|
|
|
|
self._handle_status_d(erp_id, artifact_id)
|
|
|
|
|
|
elif current_flag.endswith('w'):
|
|
|
|
|
|
self._handle_status_w(erp_id, artifact_id)
|
|
|
|
|
|
elif current_flag.endswith('n'):
|
|
|
|
|
|
self._handle_status_n(erp_id, artifact_id)
|
|
|
|
|
|
elif current_flag.endswith('p'):
|
|
|
|
|
|
self._handle_status_p(erp_id, artifact_id)
|
|
|
|
|
|
elif current_flag.endswith('x'):
|
|
|
|
|
|
self._handle_status_x(erp_id, artifact_id)
|
|
|
|
|
|
|
|
|
|
|
|
def _handle_status_d(self, erp_id, artifact_id):
|
|
|
|
|
|
"""处理状态'd' - 未进行生产"""
|
|
|
|
|
|
print(f"派发任务 ErpID {erp_id}: 未进行生产")
|
|
|
|
|
|
# 调用同事提供的状态更新函数
|
|
|
|
|
|
try:
|
|
|
|
|
|
print(1)
|
2025-11-12 16:49:40 +08:00
|
|
|
|
update_custom_table_status(erp_id, "未进行生产")
|
2025-11-12 14:01:26 +08:00
|
|
|
|
except Exception as e:
|
|
|
|
|
|
print(f"更新状态时出错: {e}")
|
|
|
|
|
|
|
|
|
|
|
|
# 发送数据给TCP客户端(只发送erp_id和状态)
|
|
|
|
|
|
try:
|
|
|
|
|
|
status_data = {
|
|
|
|
|
|
"erp_id": erp_id,
|
|
|
|
|
|
"status": "未进行生产"
|
|
|
|
|
|
}
|
|
|
|
|
|
self.tcp_server.send_data(status_data)
|
|
|
|
|
|
except Exception as e:
|
|
|
|
|
|
print(f"发送状态数据给TCP客户端时出错: {e}")
|
|
|
|
|
|
|
|
|
|
|
|
def _handle_status_w(self, erp_id, artifact_id):
|
|
|
|
|
|
"""处理状态'w' - 正在生产中"""
|
|
|
|
|
|
print(f"派发任务 ErpID {erp_id}: 正在生产中")
|
|
|
|
|
|
# 调用同事提供的状态更新函数
|
|
|
|
|
|
try:
|
|
|
|
|
|
print(2)
|
2025-11-12 16:49:40 +08:00
|
|
|
|
update_custom_table_status(erp_id, "正在生产中")
|
2025-11-12 14:01:26 +08:00
|
|
|
|
except Exception as e:
|
|
|
|
|
|
print(f"更新状态时出错: {e}")
|
|
|
|
|
|
|
|
|
|
|
|
# 发送数据给TCP客户端(只发送erp_id和状态)
|
|
|
|
|
|
try:
|
|
|
|
|
|
status_data = {
|
|
|
|
|
|
"erp_id": erp_id,
|
|
|
|
|
|
"status": "正在生产中"
|
|
|
|
|
|
}
|
|
|
|
|
|
self.tcp_server.send_data(status_data)
|
|
|
|
|
|
except Exception as e:
|
|
|
|
|
|
print(f"发送状态数据给TCP客户端时出错: {e}")
|
|
|
|
|
|
|
|
|
|
|
|
def _handle_status_n(self, erp_id, artifact_id):
|
|
|
|
|
|
"""处理状态'n' - 生产完毕"""
|
|
|
|
|
|
print(f"派发任务 ErpID {erp_id}: 生产完毕")
|
|
|
|
|
|
# 任务完成,可以从监控列表中移除
|
|
|
|
|
|
with self.tasks_lock:
|
|
|
|
|
|
self.monitored_tasks.discard(erp_id)
|
|
|
|
|
|
print(f"派发任务 ErpID {erp_id} 已完成,停止监控")
|
|
|
|
|
|
# 调用同事提供的状态更新函数
|
|
|
|
|
|
try:
|
|
|
|
|
|
print(3)
|
2025-11-12 16:49:40 +08:00
|
|
|
|
update_custom_table_status(erp_id, "生产完毕")
|
2025-11-12 14:01:26 +08:00
|
|
|
|
except Exception as e:
|
|
|
|
|
|
print(f"更新状态时出错: {e}")
|
|
|
|
|
|
|
|
|
|
|
|
# 发送数据给TCP客户端(只发送erp_id和状态)
|
|
|
|
|
|
try:
|
|
|
|
|
|
status_data = {
|
|
|
|
|
|
"erp_id": erp_id,
|
|
|
|
|
|
"status": "生产完毕"
|
|
|
|
|
|
}
|
|
|
|
|
|
self.tcp_server.send_data(status_data)
|
|
|
|
|
|
except Exception as e:
|
|
|
|
|
|
print(f"发送状态数据给TCP客户端时出错: {e}")
|
|
|
|
|
|
|
|
|
|
|
|
def _handle_status_p(self, erp_id, artifact_id):
|
|
|
|
|
|
"""处理状态'p' - 生产中断"""
|
|
|
|
|
|
print(f"派发任务 ErpID {erp_id}: 生产中断")
|
|
|
|
|
|
# 任务中断,可以从监控列表中移除
|
|
|
|
|
|
with self.tasks_lock:
|
|
|
|
|
|
self.monitored_tasks.discard(erp_id)
|
|
|
|
|
|
print(f"派发任务 ErpID {erp_id} 已中断,停止监控")
|
|
|
|
|
|
# 调用同事提供的状态更新函数
|
|
|
|
|
|
try:
|
|
|
|
|
|
print(4)
|
2025-11-12 16:49:40 +08:00
|
|
|
|
update_custom_table_status(erp_id, "生产中断")
|
2025-11-12 14:01:26 +08:00
|
|
|
|
except Exception as e:
|
|
|
|
|
|
print(f"更新状态时出错: {e}")
|
|
|
|
|
|
|
|
|
|
|
|
# 发送数据给TCP客户端(只发送erp_id和状态)
|
|
|
|
|
|
try:
|
|
|
|
|
|
status_data = {
|
|
|
|
|
|
"erp_id": erp_id,
|
|
|
|
|
|
"status": "生产中断"
|
|
|
|
|
|
}
|
|
|
|
|
|
self.tcp_server.send_data(status_data)
|
|
|
|
|
|
except Exception as e:
|
|
|
|
|
|
print(f"发送状态数据给TCP客户端时出错: {e}")
|
|
|
|
|
|
|
|
|
|
|
|
def _handle_status_x(self, erp_id, artifact_id):
|
|
|
|
|
|
"""处理状态'x' - 数据已接收"""
|
|
|
|
|
|
print(f"派发任务 ErpID {erp_id}: 数据已接收")
|
|
|
|
|
|
# 调用同事提供的状态更新函数
|
|
|
|
|
|
try:
|
|
|
|
|
|
print(5)
|
|
|
|
|
|
# update_custom_table_status(erp_id, "数据已接收")
|
|
|
|
|
|
except Exception as e:
|
|
|
|
|
|
print(f"更新状态时出错: {e}")
|
|
|
|
|
|
|
|
|
|
|
|
# 发送数据给TCP客户端(只发送erp_id和状态)
|
|
|
|
|
|
try:
|
|
|
|
|
|
status_data = {
|
|
|
|
|
|
"erp_id": erp_id,
|
|
|
|
|
|
"status": "数据已接收"
|
|
|
|
|
|
}
|
|
|
|
|
|
self.tcp_server.send_data(status_data)
|
|
|
|
|
|
except Exception as e:
|
|
|
|
|
|
print(f"发送状态数据给TCP客户端时出错: {e}")
|
|
|
|
|
|
|
|
|
|
|
|
def _handle_missing_tasks(self, missing_tasks):
|
|
|
|
|
|
"""处理缺失的任务"""
|
|
|
|
|
|
for erp_id_str in missing_tasks:
|
|
|
|
|
|
erp_id = int(erp_id_str)
|
|
|
|
|
|
with self.tasks_lock:
|
|
|
|
|
|
artifact_id = self.inserted_tasks.get(erp_id, "Unknown")
|
|
|
|
|
|
self.monitored_tasks.discard(erp_id)
|
|
|
|
|
|
self.inserted_tasks.pop(erp_id, None)
|
|
|
|
|
|
self.task_flags.pop(erp_id_str, None)
|
|
|
|
|
|
print(f"派发任务 ErpID {erp_id} (ArtifactID: {artifact_id}) 记录已从Access数据库中删除或完成")
|