feat: 新增库房功能

This commit is contained in:
zhu-mengmeng 2025-07-19 10:29:10 +08:00
parent 083cc3f675
commit e6c7c3a46e
5 changed files with 242 additions and 29 deletions

View File

@ -184,4 +184,52 @@ class GcApi:
except Exception as e:
logging.error(f"获取订单列表失败: {str(e)}")
return {"status": False, "message": f"获取订单列表失败: {str(e)}"}
return {"status": False, "message": f"获取订单列表失败: {str(e)}"}
def get_params(self, stype, main, corp_id):
"""
获取指定参数信息
Args:
stype: 参数类型"库房档案"
main: 主参数"XC"
corp_id: 公司ID
Returns:
dict: 参数信息列表
"""
try:
# API 配置中的键名
api_key = "get_params"
# 构建GET请求参数
params = {
"stype": stype,
"main": main,
"corp_id": corp_id
}
# 发送GET请求
response = self.api_utils.get(api_key, params=params)
# 检查响应状态
if response.get("success", False):
return {
"status": True,
"data": response.get("data", []),
"message": "获取参数信息成功"
}
else:
return {
"status": False,
"data": [],
"message": response.get("message", "获取参数信息失败")
}
except Exception as e:
logging.error(f"获取参数信息失败: {str(e)}")
return {
"status": False,
"data": [],
"message": f"获取参数信息失败: {str(e)}"
}

View File

@ -7,8 +7,8 @@
"enable_keyboard_listener": false,
"enable_camera": false
},
"base_url": "http://localhost:8084",
"mode": "standalone"
"base_url": "http://localhost:8085",
"mode": "api"
},
"apis": {
"get_tray_info": "/apjt/xcsc/tpda/getByTp_note/",
@ -16,7 +16,8 @@
"get_order_info": "/jsjt/xcsc/tprk/getXsddBzrkGridListToWsbz.do",
"add_order_info": "/jsjt/xcsc/tprk/bzrkAdd01.do",
"get_xpack": "/jsjt/xcsc/tprk/getXpackToWsbz.do",
"ismt_option": "/jsjt/xcsc/tprk/ismtOptioTonWsbz.do"
"ismt_option": "/jsjt/xcsc/tprk/ismtOptioTonWsbz.do",
"get_params": "/select/getcombcodeWsbz.do"
},
"database": {
"default": "sqlite",

Binary file not shown.

View File

@ -9,6 +9,7 @@ from PySide6.QtCore import Qt, QDateTime, QTimer
class MainWindowUI(QMainWindow):
# 定义字段映射为类属性,方便外部引用
FIELD_MAPPING = {
"库房": "lib",
"客户": "customerexp",
"规格": "size",
"材质": "cz",
@ -348,14 +349,32 @@ class MainWindowUI(QMainWindow):
label.setAlignment(Qt.AlignLeft | Qt.AlignVCenter)
label.setStyleSheet("background-color: #FAFAFA; padding: 5px;")
# 创建值改为QLineEdit
value = QLineEdit("")
value.setFont(self.normal_font)
value.setAlignment(Qt.AlignLeft | Qt.AlignVCenter)
value.setStyleSheet("background-color: white; padding: 5px; border: 1px solid #cccccc;")
value.setFrame(False)
value.setContentsMargins(0, 0, 0, 0)
value.setFixedHeight(35)
# 根据字段类型创建不同的值组件
if field_name == "库房":
# 库房字段使用QComboBox完全复刻托盘号组件的配置
value = QComboBox()
value.setFixedHeight(35)
value.setStyleSheet("QComboBox { border: 1px solid #cccccc; padding: 3px; background-color: white; } QComboBox::drop-down { border: none; width: 20px; }")
value.setFont(QFont("微软雅黑", 12))
value.setEditable(False) # 设置为不可编辑,确保是纯下拉选择
value.setInsertPolicy(QComboBox.NoInsert) # 不自动插入用户输入到列表中
value.setMaxVisibleItems(10) # 设置下拉框最多显示10个项目
# 添加默认选项
value.addItem("成品库")
value.addItem("退回仓")
value.addItem("散装库")
value.addItem("不合格库(线材)")
value.addItem("废丝库")
value.setCurrentIndex(0) # 默认选择第一个
else:
# 其他字段使用QLineEdit
value = QLineEdit("")
value.setFont(self.normal_font)
value.setAlignment(Qt.AlignLeft | Qt.AlignVCenter)
value.setStyleSheet("background-color: white; padding: 5px; border: 1px solid #cccccc;")
value.setFrame(False)
value.setContentsMargins(0, 0, 0, 0)
value.setFixedHeight(35)
# 保存引用
self.info_labels[field_name] = label

View File

@ -339,6 +339,9 @@ class MainWindow(MainWindowUI):
# 加载托盘号列表
self.load_pallet_codes()
# 加载库房数据
self.load_warehouse_data()
logging.info("显示主页面")
def load_pallet_codes(self):
@ -378,6 +381,78 @@ class MainWindow(MainWindowUI):
self.tray_edit.clear()
self.tray_edit.setCurrentText("")
def load_warehouse_data(self):
"""从API加载库房数据并更新到信息表格的库房组件"""
try:
# 获取信息表格中的库房组件
warehouse_combo = self.info_values.get("库房")
if not warehouse_combo:
logging.warning("未找到库房组件")
return
# 获取当前选中的库房,以便保留用户选择
current_warehouse = warehouse_combo.currentText()
# 清空当前项目
warehouse_combo.clear()
# 调用API获取库房数据
from apis.gc_api import GcApi
gc_api = GcApi()
# 调用get_params接口获取库房信息
response = gc_api.get_params("库房档案", "XC", self.corp_id)
if response.get("status", False):
warehouse_data = response.get("data", [])
if warehouse_data and len(warehouse_data) > 0:
# 添加库房到下拉框
for warehouse in warehouse_data:
warehouse_name = warehouse.get("combtext", "")
if warehouse_name:
warehouse_combo.addItem(warehouse_name)
# 默认选择成品库房
default_index = warehouse_combo.findText("成品库")
if default_index != -1:
warehouse_combo.setCurrentIndex(default_index)
elif warehouse_combo.count() > 0:
# 如果没有找到成品库,选择第一个
warehouse_combo.setCurrentIndex(0)
# 如果有之前的选择,尝试恢复它
if current_warehouse:
index = warehouse_combo.findText(current_warehouse)
if index != -1:
warehouse_combo.setCurrentIndex(index)
logging.info(f"已加载库房数据,共 {len(warehouse_data)}")
else:
logging.warning("未找到库房数据,库房列表将为空")
else:
logging.error(f"获取库房数据失败: {response.get('message', '未知错误')}")
# 如果API调用失败添加默认选项
warehouse_combo.addItem("成品库")
warehouse_combo.addItem("退回仓")
warehouse_combo.addItem("散装库")
warehouse_combo.addItem("不合格库(线材)")
warehouse_combo.addItem("废丝库")
warehouse_combo.setCurrentIndex(0)
except Exception as e:
logging.error(f"加载库房数据失败: {str(e)}")
# 如果加载失败,添加默认选项
warehouse_combo = self.info_values.get("库房")
if warehouse_combo:
warehouse_combo.clear()
warehouse_combo.addItem("成品库")
warehouse_combo.addItem("退回仓")
warehouse_combo.addItem("散装库")
warehouse_combo.addItem("不合格库(线材)")
warehouse_combo.addItem("废丝库")
warehouse_combo.setCurrentIndex(0)
def show_settings_page(self):
"""显示设置页面"""
# 创建设置窗口
@ -741,12 +816,23 @@ class MainWindow(MainWindowUI):
order_info = {}
for field_name, label in self.info_values.items():
order_info_key = self.FIELD_MAPPING.get(field_name)
if order_info_key:
# 根据控件类型选择合适的方法获取文本
if isinstance(label, QTextEdit):
order_info[order_info_key] = label.toPlainText()
else:
order_info[order_info_key] = label.text()
if order_info_key and label is not None:
try:
# 根据控件类型选择合适的方法获取文本
if isinstance(label, QTextEdit):
order_info[order_info_key] = label.toPlainText()
elif isinstance(label, QComboBox):
order_info[order_info_key] = label.currentText()
else:
order_info[order_info_key] = label.text()
except RuntimeError as e:
# 如果对象已被删除,记录错误并跳过
logging.warning(f"控件对象已被删除,字段: {field_name}, 错误: {str(e)}")
continue
except Exception as e:
# 其他异常也记录并跳过
logging.warning(f"获取控件文本失败,字段: {field_name}, 错误: {str(e)}")
continue
# 更新/补充 qd 字段
order_info["qd"] = self._current_gc_qd
# 再调用 update_info_table
@ -1998,6 +2084,12 @@ class MainWindow(MainWindowUI):
info['pono'] = self._current_order_code
info["dycz"] = info.get("cz")
info['qd'] = self._current_gc_qd
# 添加库房信息
warehouse_combo = self.info_values.get("库房")
if warehouse_combo:
info['lib'] = warehouse_combo.currentText()
else:
info['lib'] = "成品库" # 默认值
# 获取本机IP地址
# import socket
# try:
@ -3563,29 +3655,82 @@ class MainWindow(MainWindowUI):
# 记录 order_info 中的所有键,用于调试
logging.debug(f"订单信息键: {list(order_info.keys())}")
# 更新表格内容
# 更新表格内容 - 智能更新:已有就更新,没有就新增,空值不覆盖
for field_name, field_key in field_mapping.items():
if field_name in self.info_values:
value = ""
# 对可能存在的键进行安全检查
if field_name in self.info_values and self.info_values[field_name] is not None:
try:
# 获取当前控件中的值
current_value = ""
if isinstance(self.info_values[field_name], QTextEdit):
current_value = self.info_values[field_name].toPlainText()
elif isinstance(self.info_values[field_name], QComboBox):
current_value = self.info_values[field_name].currentText()
else:
current_value = self.info_values[field_name].text()
except RuntimeError as e:
# 如果对象已被删除,记录错误并跳过
logging.warning(f"控件对象已被删除,字段: {field_name}, 错误: {str(e)}")
continue
except Exception as e:
# 其他异常也记录并跳过
logging.warning(f"获取控件文本失败,字段: {field_name}, 错误: {str(e)}")
continue
# 获取API返回的新值
new_value = ""
if field_key and field_key in order_info:
value = str(order_info[field_key])
new_value = str(order_info[field_key])
# 特殊处理线径公差
if field_name == "线径公差" and "bccd" in order_info and "tccd" in order_info:
bccd = order_info.get("bccd")
tccd = order_info.get("tccd")
if bccd is not None and tccd is not None:
value = f"{bccd} - {tccd}"
new_value = f"{bccd} - {tccd}"
# 特殊处理强度范围
if field_name == "强度范围" and "bqd" in order_info and "tqd" in order_info:
bqd = order_info.get("bqd")
tqd = order_info.get("tqd")
if bqd is not None and tqd is not None:
value = f"{bqd} - {tqd}"
# 根据控件类型选择合适的方法设置文本
if isinstance(self.info_values[field_name], QTextEdit):
self.info_values[field_name].setPlainText(value)
new_value = f"{bqd} - {tqd}"
# 智能更新逻辑:如果新值不为空且与当前值不同,则更新;如果新值为空但当前值不为空,则保持当前值
if new_value and new_value != current_value:
# 有新值且与当前值不同,进行更新
try:
if isinstance(self.info_values[field_name], QTextEdit):
self.info_values[field_name].setPlainText(new_value)
elif isinstance(self.info_values[field_name], QComboBox):
# 对于QComboBox尝试找到匹配的选项并设置
combo = self.info_values[field_name]
index = combo.findText(new_value)
if index != -1:
combo.setCurrentIndex(index)
else:
# 如果没找到匹配的选项,添加新选项
combo.addItem(new_value)
combo.setCurrentText(new_value)
else:
self.info_values[field_name].setText(new_value)
logging.debug(f"更新字段 '{field_name}': '{current_value}' -> '{new_value}'")
except RuntimeError as e:
# 如果对象已被删除,记录错误并跳过
logging.warning(f"控件对象已被删除,无法更新字段: {field_name}, 错误: {str(e)}")
continue
except Exception as e:
# 其他异常也记录并跳过
logging.warning(f"更新控件文本失败,字段: {field_name}, 错误: {str(e)}")
continue
elif not new_value and current_value:
# 新值为空但当前值不为空,保持当前值
logging.debug(f"保持字段 '{field_name}' 的当前值: '{current_value}' (API返回空值)")
elif not new_value and not current_value:
# 新值和当前值都为空,无需操作
logging.debug(f"字段 '{field_name}' 新值和当前值都为空,无需更新")
else:
self.info_values[field_name].setText(value)
# 新值与当前值相同,无需更新
logging.debug(f"字段 '{field_name}' 值未变化: '{current_value}'")
else:
logging.warning(f"字段名 '{field_name}' 在info_values中不存在")