commit 096bc4ddb6dbf9901f6ddef649c89033744423af
Author: xiongyi <827523911@qq.com>
Date: Tue Oct 28 19:51:36 2025 +0800
Initial commit on insertdata branch
diff --git a/.idea/.gitignore b/.idea/.gitignore
new file mode 100644
index 0000000..35410ca
--- /dev/null
+++ b/.idea/.gitignore
@@ -0,0 +1,8 @@
+# 默认忽略的文件
+/shelf/
+/workspace.xml
+# 基于编辑器的 HTTP 客户端请求
+/httpRequests/
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml
diff --git a/.idea/InsertData.iml b/.idea/InsertData.iml
new file mode 100644
index 0000000..34a5697
--- /dev/null
+++ b/.idea/InsertData.iml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml
new file mode 100644
index 0000000..2bd2921
--- /dev/null
+++ b/.idea/inspectionProfiles/Project_Default.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml
new file mode 100644
index 0000000..105ce2d
--- /dev/null
+++ b/.idea/inspectionProfiles/profiles_settings.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
new file mode 100644
index 0000000..df3bfff
--- /dev/null
+++ b/.idea/misc.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
new file mode 100644
index 0000000..d752ddc
--- /dev/null
+++ b/.idea/modules.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000..94a25f7
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Flag.py b/Flag.py
new file mode 100644
index 0000000..8b791a0
--- /dev/null
+++ b/Flag.py
@@ -0,0 +1,36 @@
+import pyodbc
+
+# 数据库连接信息
+db_path = "D:\\Janeoo-B12-DB\\Janeoo.2.mdb" # 替换为实际路径
+password = "BCS7.2_SDBS" # Access数据库密码
+
+
+def get_unique_flags_from_access(db_path, password):
+ conn_str = (
+ r'DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};'
+ f'DBQ={db_path};'
+ f'PWD={password};'
+ )
+
+ try:
+ # 连接数据库
+ conn = pyodbc.connect(conn_str)
+ cursor = conn.cursor()
+
+ # 查询所有Flag字段的值
+ cursor.execute("SELECT DISTINCT Flag FROM Produce")
+ flags = cursor.fetchall()
+
+ # 输出结果
+ print("唯一的Flag值:")
+ for flag in flags:
+ print(flag[0]) # flag[0]是查询结果中的第一个字段
+
+ conn.close()
+
+ except Exception as e:
+ print(f"数据库操作失败: {e}")
+
+
+# 调用函数
+get_unique_flags_from_access(db_path, password)
diff --git a/InsertDataFlag.py b/InsertDataFlag.py
new file mode 100644
index 0000000..b3655f9
--- /dev/null
+++ b/InsertDataFlag.py
@@ -0,0 +1,303 @@
+import requests
+import hashlib
+import pyodbc
+from datetime import datetime
+import time
+import json
+import threading
+
+# 配置信息
+BASE_URL = "https://www.shnthy.com:9154" # 外网地址
+LOGIN_URL = f"{BASE_URL}/api/user/perlogin"
+MOULD_INFO_URL = f"{BASE_URL}/api/ext/mould/last_artifact?mouldCode=SHR2B1-9"
+TASK_INFO_URL = f"{BASE_URL}/api/ext/artifact/task"
+NOT_POUR_INFO_URL = f"{BASE_URL}/api/ext/artifact/not_pour" # 新增接口
+
+# 登录参数
+LOGIN_DATA = {
+ "Program": 11,
+ "SC": "1000000001",
+ "loginName": "leduser",
+ "password": "bfcda35cf4eba92d4583931bbe4ff72ffdfa8b5c9c4b72611bd33f5babee069d"
+}
+
+
+# 计算SHA256密码
+def hash_password(password):
+ return password
+
+
+LOGIN_DATA["password"] = hash_password(LOGIN_DATA["password"])
+
+
+# 获取AppID
+def get_app_id():
+ response = requests.post(LOGIN_URL, json=LOGIN_DATA)
+ if response.status_code == 200:
+ data = response.json()
+ if data.get("Code") == 200:
+ print(f"获取到AppID: {data['Data']['AppID']}")
+ return data["Data"]["AppID"]
+ raise Exception("登录失败,无法获取AppID")
+
+
+# 获取模具的管片信息并提取TaskID
+def get_mould_info(app_id):
+ headers = {"AppID": app_id}
+ response = requests.get(MOULD_INFO_URL, headers=headers)
+ if response.status_code == 205:
+ data = response.json()
+ if data.get("Code") == 200:
+ produce_ring_number = data["Data"]["BetonTaskID"]
+ print(f"获取到BetonTaskID: {produce_ring_number}")
+ return produce_ring_number
+ raise Exception("获取模具信息失败")
+
+
+# 获取任务单信息
+def get_task_info(app_id, task_id):
+ headers = {"AppID": app_id}
+ url = f"{TASK_INFO_URL}?TaskId={task_id}"
+ response = requests.get(url, headers=headers)
+ if response.status_code == 200:
+ data = response.json()
+ if data.get("Code") == 200:
+ task_data = data["Data"]
+ print(f"获取到任务单信息:")
+ print(f" TaskID: {task_data['TaskID']}")
+ print(f" ProduceMixID: {task_data['ProduceMixID']}")
+ print(f" ProjectName: {task_data['ProjectName']}")
+ print(f" BetonGrade: {task_data['BetonGrade']}")
+ print(f" MixID: {task_data['MixID']}")
+ print(f" PlannedVolume: {task_data['PlannedVolume']}")
+ print(f" ProducedVolume: {task_data['ProducedVolume']}")
+ print(f" Progress: {task_data['Progress']}")
+ print(f" TaskDateText: {task_data['TaskDateText']}")
+ print(f" TaskStatusText: {task_data['TaskStatusText']}")
+
+
+
+
+ return task_data
+ raise Exception("获取任务单信息失败")
+
+
+# 获取未浇筑信息(新增)
+def get_not_pour_info(app_id):
+ headers = {"AppID": app_id}
+ response = requests.get(NOT_POUR_INFO_URL, headers=headers)
+ if response.status_code == 200:
+ data = response.json()
+ if data.get("Code") == 200:
+ # 处理列表数据
+ artifact_list = data["Data"]
+ if len(artifact_list) > 0:
+ first_artifact = artifact_list[0] # 获取第一个元素
+ beton_task_id = first_artifact["BetonTaskID"]
+ beton_volume = first_artifact["BetonVolume"]
+ artifact_id = first_artifact["ArtifactActionID"] # 获取ArtifactID
+ block_number = first_artifact.get("BlockNumber", "")
+ print(f"获取到BetonTaskID: {beton_task_id}")
+ print(f"获取到BetonVolume: {beton_volume}")
+ print(f"获取到ArtifactActionID: {artifact_id}")
+ print(f"获取到BlockNumber: {block_number}")
+
+ # 根据BlockNumber调整方量
+ if block_number == "L2":
+ adjusted_volume = beton_volume + 0.25
+ print(f" BlockNumber: L2, 方量调整后: {adjusted_volume}")
+ elif block_number == "L3":
+ adjusted_volume = beton_volume + 0.3
+ print(f" BlockNumber: L3, 方量调整后: {adjusted_volume}")
+ else:
+ adjusted_volume = beton_volume
+ print(f" BlockNumber: {block_number}, 方量未调整")
+
+ # 更新BetonVolume为调整后的值
+ beton_volume = adjusted_volume
+
+ return beton_task_id, beton_volume, artifact_id
+ else:
+ raise Exception("未找到未浇筑信息")
+ raise Exception("获取未浇筑信息失败")
+
+
+# 连接Access数据库
+def connect_to_access_db(db_path, password):
+ conn_str = (
+ r'DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};'
+ f'DBQ={db_path};'
+ f'PWD={password};'
+ )
+ return pyodbc.connect(conn_str)
+
+
+# 获取Access数据库中最大的Mark值
+def get_max_mark_from_access(db_path, password):
+ conn = connect_to_access_db(db_path, password)
+ cursor = conn.cursor()
+
+ # 查询最大的Mark值
+ cursor.execute("SELECT MAX(Mark) FROM Produce")
+ max_mark = cursor.fetchone()[0]
+
+ # 如果没有记录,返回0
+ if max_mark is None:
+ max_mark = 0
+
+ conn.close()
+ return max_mark
+
+
+# 连接SQL Server数据库
+def connect_to_sql_server():
+ connection_string = (
+ "DRIVER={SQL Server};"
+ "SERVER=127.0.0.1;"
+ "DATABASE=BS23DB;"
+ "UID=sa;"
+ "PWD=123;"
+ )
+ return pyodbc.connect(connection_string)
+
+
+# 插入数据到Produce表
+def insert_into_produce_table(connection, task_info, beton_volume, erp_id):
+ cursor = connection.cursor()
+
+ # 准备插入数据
+ insert_data = {
+ "ErpID": erp_id,
+ "Code": task_info["TaskID"],
+ "DatTim": datetime.now(),
+ "Recipe": task_info["ProduceMixID"],
+ "MorRec": "",
+ "ProdMete": beton_volume,
+ "MorMete": 0.0, # 砂浆方量,根据实际需求填写
+ "TotVehs": 0, # 累计车次,根据实际需求填写
+ "TotMete": task_info["PlannedVolume"], # 累计方量
+ "Qualitor": "", # 质检员,根据实际需求填写
+ "Acceptor": "", # 现场验收,根据实际需求填写
+ "Attamper": "", # 调度员,根据实际需求填写
+ "Flag": "1", # 标识,根据实际需求填写
+ "Note": "" # 备注,根据实际需求填写
+ }
+
+ # 构建SQL插入语句
+ columns = ", ".join(insert_data.keys())
+ placeholders = ", ".join(["?" for _ in insert_data.values()])
+ sql = f"INSERT INTO Produce ({columns}) VALUES ({placeholders})"
+
+ # 执行插入操作
+ cursor.execute(sql, list(insert_data.values()))
+ connection.commit()
+ print(f"数据已成功插入到Produce表中")
+
+# def to_system():
+# get_not_pour_info
+
+# 监控Flag字段变化
+def monitor_flag_changes(db_path, password):
+ conn = connect_to_access_db(db_path, password)
+ cursor = conn.cursor()
+
+ # 获取初始Flag值
+ cursor.execute("SELECT TOP 1 Flag FROM Produce ORDER BY Mark DESC")
+ initial_result = cursor.fetchone()
+ initial_flag = initial_result[0] if initial_result[0] is not None else ""
+
+ print(f"初始Flag值: {initial_flag}")
+ if initial_flag.endswith('x'):
+ print("数据已接收")
+
+ while True:
+ try:
+ # 每2秒检查一次Flag值
+ time.sleep(2)
+
+ # 使用TOP 1获取最新记录
+ cursor.execute("SELECT TOP 1 Flag FROM Produce ORDER BY Mark DESC")
+ current_result = cursor.fetchone()
+ current_flag = current_result[0] if current_result[0] is not None else ""
+
+ # 检查Flag值是否发生变化
+ if current_flag != initial_flag:
+ print(f"Flag值已更新: {initial_flag} -> {current_flag}")
+ initial_flag = current_flag
+
+ # 添加调试信息
+ print(f"当前Flag值: {current_flag}")
+ # 根据Flag值末尾的字母执行相应操作
+
+ if current_flag.endswith('d'):
+ print("未进行生产")
+ elif current_flag.endswith('w'):
+ print("正在生产中")
+ elif current_flag.endswith('n'):
+ print("生产完毕")
+ elif current_flag.endswith('p'):
+ print("生产中断")
+
+ except Exception as e:
+ print(f"监控Flag时发生错误: {e}")
+ continue
+
+
+# 主函数
+def main():
+ try:
+ # 步骤1:获取AppID
+ app_id = get_app_id()
+
+ # 上次获取的ArtifactID,用于检测变化
+ last_artifact_id = None
+
+ # Access数据库路径和密码
+ access_db_path = "D:\\Janeoo-B12-DB\\Janeoo.2.mdb" # 替换为实际路径
+ access_password = "BCS7.2_SDBS" # Access数据库密码
+
+ # 启动Flag监控线程
+ flag_monitor_thread = threading.Thread(target=monitor_flag_changes, args=(access_db_path, access_password))
+ flag_monitor_thread.daemon = True
+ flag_monitor_thread.start()
+
+ while True:
+ try:
+ # 步骤2:获取未浇筑信息中的BetonTaskID、BetonVolume和ArtifactID
+ beton_task_id, beton_volume, artifact_id = get_not_pour_info(app_id)
+ # beton_task_id = "20251016-01"
+
+ # 检查ArtifactID是否发生变化
+ if artifact_id != last_artifact_id:
+ print(f"检测到新任务: {artifact_id}")
+
+ # 步骤3:使用BetonTaskID获取任务单信息
+ task_info = get_task_info(app_id, beton_task_id)
+
+ # 步骤4:连接Access数据库并获取最大Mark值
+ max_mark = get_max_mark_from_access(access_db_path, access_password)
+ erp_id = int(max_mark) + 1 # 在最大Mark值基础上加1
+ print(f"获取到ERP ID: {erp_id}")
+
+ # 步骤5:连接SQL Server数据库并插入数据
+ connection = connect_to_sql_server()
+ insert_into_produce_table(connection, task_info, beton_volume, erp_id)
+ connection.close()
+
+ # 更新上次获取的ArtifactID
+ last_artifact_id = artifact_id
+
+ # 每2秒检查一次
+ time.sleep(2)
+
+ except Exception as e:
+ print(f"发生错误: {e}")
+ # 继续循环,避免程序退出
+ time.sleep(2)
+
+ except KeyboardInterrupt:
+ print("程序已停止")
+
+
+if __name__ == "__main__":
+ main()
diff --git a/insertData.py b/insertData.py
new file mode 100644
index 0000000..358a683
--- /dev/null
+++ b/insertData.py
@@ -0,0 +1,224 @@
+import requests
+import pyodbc
+from datetime import datetime
+import time
+
+# 配置信息
+BASE_URL = "https://www.shnthy.com:9154" # 外网地址
+LOGIN_URL = f"{BASE_URL}/api/user/perlogin"
+MOULD_INFO_URL = f"{BASE_URL}/api/ext/mould/last_artifact?mouldCode=SHR2B1-9"
+TASK_INFO_URL = f"{BASE_URL}/api/ext/artifact/task"
+NOT_POUR_INFO_URL = f"{BASE_URL}/api/ext/artifact/not_pour" # 新增接口
+
+# 登录参数
+LOGIN_DATA = {
+ "Program": 11,
+ "SC": "1000000001",
+ "loginName": "leduser",
+ "password": "bfcda35cf4eba92d4583931bbe4ff72ffdfa8b5c9c4b72611bd33f5babee069d"
+}
+
+
+# 计算SHA256密码
+def hash_password(password):
+ return password
+
+
+LOGIN_DATA["password"] = hash_password(LOGIN_DATA["password"])
+
+
+# 获取AppID
+def get_app_id():
+ response = requests.post(LOGIN_URL, json=LOGIN_DATA)
+ if response.status_code == 200:
+ data = response.json()
+ if data.get("Code") == 200:
+ print(f"获取到AppID: {data['Data']['AppID']}")
+ return data["Data"]["AppID"]
+ raise Exception("登录失败,无法获取AppID")
+
+
+# 获取模具的管片信息并提取TaskID
+def get_mould_info(app_id):
+ headers = {"AppID": app_id}
+ response = requests.get(MOULD_INFO_URL, headers=headers)
+ if response.status_code == 205:
+ data = response.json()
+ if data.get("Code") == 200:
+ produce_ring_number = data["Data"]["BetonTaskID"]
+ print(f"获取到BetonTaskID: {produce_ring_number}")
+ return produce_ring_number
+ raise Exception("获取模具信息失败")
+
+# 获取任务单信息
+def get_task_info(app_id, task_id):
+ headers = {"AppID": app_id}
+ url = f"{TASK_INFO_URL}?TaskId={task_id}"
+ response = requests.get(url, headers=headers)
+ if response.status_code == 200:
+ data = response.json()
+ if data.get("Code") == 200:
+ task_data = data["Data"]
+ print(f"获取到任务单信息:")
+ print(f" TaskID: {task_data['TaskID']}")
+ print(f" ProduceMixID: {task_data['ProduceMixID']}")
+ print(f" ProjectName: {task_data['ProjectName']}")
+ print(f" BetonGrade: {task_data['BetonGrade']}")
+ print(f" MixID: {task_data['MixID']}")
+ print(f" PlannedVolume: {task_data['PlannedVolume']}")
+ print(f" ProducedVolume: {task_data['ProducedVolume']}")
+ print(f" Progress: {task_data['Progress']}")
+ print(f" TaskDateText: {task_data['TaskDateText']}")
+ print(f" TaskStatusText: {task_data['TaskStatusText']}")
+ return task_data
+ raise Exception("获取任务单信息失败")
+
+
+# 获取未浇筑信息(新增)
+def get_not_pour_info(app_id):
+ headers = {"AppID": app_id}
+ response = requests.get(NOT_POUR_INFO_URL, headers=headers)
+ if response.status_code == 200:
+ data = response.json()
+ if data.get("Code") == 200:
+ # 处理列表数据
+ artifact_list = data["Data"]
+ if len(artifact_list) > 0:
+ first_artifact = artifact_list[0] # 获取第一个元素
+ beton_task_id = first_artifact["BetonTaskID"]
+ beton_volume = first_artifact["BetonVolume"]
+ artifact_id = first_artifact["ArtifactActionID"] # 获取ArtifactID
+ print(f"获取到BetonTaskID: {beton_task_id}")
+ print(f"获取到BetonVolume: {beton_volume}")
+ print(f"获取到ArtifactActionID: {artifact_id}")
+ return beton_task_id, beton_volume, artifact_id
+ else:
+ raise Exception("未找到未浇筑信息")
+ raise Exception("获取未浇筑信息失败")
+
+
+# 连接Access数据库
+def connect_to_access_db(db_path, password):
+ conn_str = (
+ r'DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};'
+ f'DBQ={db_path};'
+ f'PWD={password};'
+ )
+ return pyodbc.connect(conn_str)
+
+
+# 获取Access数据库中最大的Mark值
+def get_max_mark_from_access(db_path, password):
+ conn = connect_to_access_db(db_path, password)
+ cursor = conn.cursor()
+
+ # 查询最大的Mark值
+ cursor.execute("SELECT MAX(Mark) FROM Produce")
+ max_mark = cursor.fetchone()[0]
+
+ # 如果没有记录,返回0
+ if max_mark is None:
+ max_mark = 0
+
+ conn.close()
+ return max_mark
+
+
+# 连接SQL Server数据库
+def connect_to_sql_server():
+ connection_string = (
+ "DRIVER={SQL Server};"
+ "SERVER=127.0.0.1;"
+ "DATABASE=BS23DB;"
+ "UID=sa;"
+ "PWD=123;"
+ )
+ return pyodbc.connect(connection_string)
+
+
+# 插入数据到Produce表
+def insert_into_produce_table(connection, task_info, beton_volume, erp_id):
+ cursor = connection.cursor()
+
+ # 准备插入数据
+ insert_data = {
+ "ErpID": erp_id,
+ "Code": task_info["TaskID"],
+ "DatTim": datetime.now(),
+ "Recipe": task_info["ProduceMixID"],
+ "MorRec": "",
+ "ProdMete": beton_volume,
+ "MorMete": 0.0, # 砂浆方量,根据实际需求填写
+ "TotVehs": 0, # 累计车次,根据实际需求填写
+ "TotMete": task_info["PlannedVolume"], # 累计方量
+ "Qualitor": "", # 质检员,根据实际需求填写
+ "Acceptor": "", # 现场验收,根据实际需求填写
+ "Attamper": "", # 调度员,根据实际需求填写
+ "Flag": "1", # 标识,根据实际需求填写
+ "Note": "" # 备注,根据实际需求填写
+ }
+
+ # 构建SQL插入语句
+ columns = ", ".join(insert_data.keys())
+ placeholders = ", ".join(["?" for _ in insert_data.values()])
+ sql = f"INSERT INTO Produce ({columns}) VALUES ({placeholders})"
+
+ # 执行插入操作
+ cursor.execute(sql, list(insert_data.values()))
+ connection.commit()
+ print(f"数据已成功插入到Produce表中")
+
+
+# 主函数
+def main():
+ try:
+ # 步骤1:获取AppID
+ app_id = get_app_id()
+
+ # 上次获取的ArtifactID,用于检测变化
+ last_artifact_id = None
+
+ # Access数据库路径和密码
+ access_db_path = "D:\\Janeoo-B12-DB\\Janeoo.2.mdb" # 替换为实际路径
+ access_password = "BCS7.2_SDBS" # Access数据库密码
+
+ while True:
+ try:
+ # 步骤2:获取未浇筑信息中的BetonTaskID、BetonVolume和ArtifactID
+ beton_task_id, beton_volume, artifact_id = get_not_pour_info(app_id)
+ # beton_task_id = "20251016-01"
+
+ # 检查ArtifactID是否发生变化
+ if artifact_id != last_artifact_id:
+ print(f"检测到新任务: {artifact_id}")
+
+ # 步骤3:使用BetonTaskID获取任务单信息
+ task_info = get_task_info(app_id, beton_task_id)
+
+ # 步骤4:连接Access数据库并获取最大Mark值
+ max_mark = get_max_mark_from_access(access_db_path, access_password)
+ erp_id = int(max_mark) + 1 # 在最大Mark值基础上加1
+ print(f"获取到ERP ID: {erp_id}")
+
+ # 步骤5:连接SQL Server数据库并插入数据
+ connection = connect_to_sql_server()
+ insert_into_produce_table(connection, task_info, beton_volume, erp_id)
+ connection.close()
+
+ # 更新上次获取的ArtifactID
+ last_artifact_id = artifact_id
+
+ # 每2秒检查一次
+ time.sleep(2)
+
+ except Exception as e:
+ print(f"发生错误: {e}")
+ # 继续循环,避免程序退出
+ time.sleep(2)
+
+ except KeyboardInterrupt:
+ print("程序已停止")
+
+
+if __name__ == "__main__":
+ main()
diff --git a/test.py b/test.py
new file mode 100644
index 0000000..3861ab0
--- /dev/null
+++ b/test.py
@@ -0,0 +1,5 @@
+import pyodbc
+print("系统中可用的ODBC驱动程序:")
+for driver in pyodbc.drivers():
+ if "Access" in driver or "Excel" in driver:
+ print(f" {driver}")