133 lines
5.3 KiB
Python
133 lines
5.3 KiB
Python
|
|
"""主程序入口"""
|
|||
|
|
import time
|
|||
|
|
import threading
|
|||
|
|
from datetime import datetime
|
|||
|
|
from API.client import APIClient
|
|||
|
|
from API.mix_weight_api import MixWeightAPI
|
|||
|
|
from services.task_service import TaskService
|
|||
|
|
from services.monitoring_service import MonitoringService
|
|||
|
|
from database.access_db import AccessDB
|
|||
|
|
from database.sql_server import SQLServerDB
|
|||
|
|
from tcp.server import TCPServer
|
|||
|
|
from config.settings import (
|
|||
|
|
ACCESS_DB_PATH, ACCESS_DB_PASSWORD,
|
|||
|
|
TCP_HOST, TCP_PORT, CHECK_INTERVAL, MAX_AGE_HOURS
|
|||
|
|
)
|
|||
|
|
from utils.helpers import cleanup_old_timestamps
|
|||
|
|
|
|||
|
|
def start_api_service():
|
|||
|
|
"""启动配比重量API服务"""
|
|||
|
|
api = MixWeightAPI()
|
|||
|
|
api.run(host='127.0.0.1', port=5001, debug=False, threaded=True)
|
|||
|
|
|
|||
|
|
def main():
|
|||
|
|
api_thread = threading.Thread(target=start_api_service)
|
|||
|
|
api_thread.daemon = True
|
|||
|
|
api_thread.start()
|
|||
|
|
try:
|
|||
|
|
# 初始化TCP服务端
|
|||
|
|
tcp_server = TCPServer(host=TCP_HOST, port=TCP_PORT)
|
|||
|
|
tcp_server_thread = threading.Thread(target=tcp_server.start)
|
|||
|
|
tcp_server_thread.daemon = True
|
|||
|
|
tcp_server_thread.start()
|
|||
|
|
|
|||
|
|
# 等待服务端启动
|
|||
|
|
time.sleep(1)
|
|||
|
|
|
|||
|
|
# 初始化服务
|
|||
|
|
api_client = APIClient()
|
|||
|
|
task_service = TaskService()
|
|||
|
|
monitoring_service = MonitoringService(tcp_server)
|
|||
|
|
|
|||
|
|
# 步骤1:获取AppID
|
|||
|
|
app_id = api_client.login()
|
|||
|
|
task_service.api_client.app_id = app_id
|
|||
|
|
|
|||
|
|
# 存储上次获取的所有ArtifactID
|
|||
|
|
last_artifact_ids = set()
|
|||
|
|
last_artifact_list = [] # 用于存储上一次的完整artifact_list
|
|||
|
|
|
|||
|
|
# 启动Access数据库Flag监控线程
|
|||
|
|
access_monitor_thread = threading.Thread(target=monitoring_service.monitor_access_flag_changes)
|
|||
|
|
access_monitor_thread.daemon = True
|
|||
|
|
access_monitor_thread.start()
|
|||
|
|
|
|||
|
|
while True:
|
|||
|
|
try:
|
|||
|
|
# 步骤2:获取所有未浇筑信息
|
|||
|
|
tasks, artifact_list, send_list, half_volume = task_service.process_not_pour_info()
|
|||
|
|
current_artifact_ids = {task["artifact_id"] for task in tasks}
|
|||
|
|
|
|||
|
|
# 检查artifact_list是否发生变化
|
|||
|
|
if artifact_list != last_artifact_list:
|
|||
|
|
print(f"检测到artifact_list更新: {artifact_list}")
|
|||
|
|
|
|||
|
|
# 处理新出现的任务
|
|||
|
|
new_artifact_ids = current_artifact_ids - last_artifact_ids
|
|||
|
|
if new_artifact_ids:
|
|||
|
|
print(f"检测到 {len(new_artifact_ids)} 个新任务")
|
|||
|
|
|
|||
|
|
for task in tasks:
|
|||
|
|
if task["artifact_id"] in new_artifact_ids:
|
|||
|
|
task_info = api_client.get_task_info(task["beton_task_id"])
|
|||
|
|
|
|||
|
|
# 步骤4:连接Access数据库并获取最大Mark值
|
|||
|
|
access_db = AccessDB(ACCESS_DB_PATH, ACCESS_DB_PASSWORD)
|
|||
|
|
try:
|
|||
|
|
max_mark = access_db.get_max_mark()
|
|||
|
|
finally:
|
|||
|
|
access_db.close()
|
|||
|
|
|
|||
|
|
erp_id = int(max_mark) + 1
|
|||
|
|
|
|||
|
|
# 步骤5:连接SQL Server数据库并插入数据
|
|||
|
|
sql_db = SQLServerDB()
|
|||
|
|
try:
|
|||
|
|
# 准备插入数据
|
|||
|
|
insert_data = {
|
|||
|
|
"ErpID": erp_id,
|
|||
|
|
"Code": task_info["TaskID"],
|
|||
|
|
"DatTim": datetime.now(),
|
|||
|
|
"Recipe": task_info["ProduceMixID"],
|
|||
|
|
"MorRec": "",
|
|||
|
|
"ProdMete": task["beton_volume"],
|
|||
|
|
"MorMete": 0.0,
|
|||
|
|
"TotVehs": 0,
|
|||
|
|
"TotMete": task_info["PlannedVolume"],
|
|||
|
|
"Qualitor": "",
|
|||
|
|
"Acceptor": "",
|
|||
|
|
"Attamper": "",
|
|||
|
|
"Flag": "1",
|
|||
|
|
"Note": ""
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
sql_db.insert_produce_data(insert_data)
|
|||
|
|
print(f"数据已成功插入到Produce表中,ERP ID: {erp_id}")
|
|||
|
|
finally:
|
|||
|
|
sql_db.close()
|
|||
|
|
|
|||
|
|
# 更新上次获取的ArtifactID集合和artifact_list
|
|||
|
|
last_artifact_ids = current_artifact_ids
|
|||
|
|
last_artifact_list = artifact_list.copy()
|
|||
|
|
|
|||
|
|
# 每10分钟清理一次过期的时间戳记录
|
|||
|
|
cleanup_old_timestamps(task_service.artifact_timestamps, current_artifact_ids, MAX_AGE_HOURS)
|
|||
|
|
|
|||
|
|
# 每10秒检查一次
|
|||
|
|
time.sleep(CHECK_INTERVAL)
|
|||
|
|
|
|||
|
|
except Exception as e:
|
|||
|
|
print(f"发生错误: {e}")
|
|||
|
|
# 继续循环,避免程序退出
|
|||
|
|
time.sleep(2)
|
|||
|
|
|
|||
|
|
except KeyboardInterrupt:
|
|||
|
|
print("程序已停止")
|
|||
|
|
# 停止TCP服务端
|
|||
|
|
if 'tcp_server' in locals():
|
|||
|
|
tcp_server.stop()
|
|||
|
|
|
|||
|
|
|
|||
|
|
if __name__ == "__main__":
|
|||
|
|
main()
|