ERP/test_shipment_upload.py
2025-11-25 10:35:02 +08:00

163 lines
5.5 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
测试发货单上传解析功能
"""
import pandas as pd
import numpy as np
def test_parse_shipment():
"""测试解析发货单"""
file_path = '/home/hyx/work/生产管理系统/发货单-20251121.xls'
# 读取Excel文件
df = pd.read_excel(file_path, header=None)
print("=== 解析发货单头部信息 ===")
# 提取头部信息
shipment_date = None
transport_method = None
# 解析发货日期第1行索引2
if len(df) > 1 and len(df.columns) > 2:
shipment_date_raw = df.iloc[1, 2]
if pd.notna(shipment_date_raw):
if isinstance(shipment_date_raw, pd.Timestamp):
shipment_date = shipment_date_raw.strftime('%Y-%m-%d')
else:
shipment_date = str(shipment_date_raw)
print(f"发货日期: {shipment_date}")
# 解析供货方式第2行索引2
if len(df) > 2 and len(df.columns) > 2:
transport_method_raw = df.iloc[2, 2]
if pd.notna(transport_method_raw):
transport_method = str(transport_method_raw)
print(f"供货方式(运输单号): {transport_method}")
# 找到表格数据的起始行(序号、采购单号、物料编码...
header_row = None
for i in range(len(df)):
if df.iloc[i, 0] == '序号':
header_row = i
break
if header_row is None:
print("错误:无法识别发货单格式,未找到表格头部")
return
print(f"\n表格起始行: {header_row}")
# 从表格起始行读取数据
data_df = pd.read_excel(file_path, header=header_row)
print(f"表格列名: {data_df.columns.tolist()}")
# 过滤掉合计行和备注行(只保留序号为数字的行)
valid_data = data_df[data_df['序号'].apply(lambda x: isinstance(x, (int, float)) and not pd.isna(x))]
print(f"\n有效数据行数: {len(valid_data)}")
# 模拟客户订单数据
customer_orders = {
'CGDD002878': {
'order_date': '2025-11-15',
'material': 'AP-DZ006 灯条基站',
'unit_price': 150.5
},
'CGDD003082': {
'order_date': '2025-11-18',
'material': '飞机盒',
'unit_price': 5.0
}
}
print("\n=== 解析数据行 ===")
last_contract_no = None
for idx, row in valid_data.iterrows():
print(f"\n序号: {int(row['序号'])}")
# 提取数据
contract_no = row.get('采购单号')
if pd.isna(contract_no):
if last_contract_no:
contract_no = last_contract_no
print(f" 采购单号: {contract_no} (继承上一行)")
else:
print(f" 采购单号: 空 (错误)")
continue
else:
contract_no = str(contract_no).strip()
last_contract_no = contract_no
print(f" 采购单号(合同编号): {contract_no}")
material_code = row.get('物料编码')
if pd.isna(material_code):
print(f" 物料编码: 空 (错误)")
continue
material_code = str(material_code).strip().replace('\n', ' ')
print(f" 物料编码(物料名称): {material_code}")
spec_model = row.get('规格型号')
if pd.isna(spec_model):
spec_model = ''
else:
spec_model = str(spec_model).strip()
print(f" 规格型号: {spec_model}")
quantity = row.get('实送数量')
if pd.isna(quantity):
print(f" 实送数量: 空 (错误)")
continue
quantity = int(float(quantity))
print(f" 实送数量(数量): {quantity}")
unit = row.get('单位')
if pd.isna(unit):
unit = 'pcs'
else:
unit = str(unit).strip()
print(f" 单位: {unit}")
# 从备注中提取运输单号(如果有)
remark = row.get('备注')
transport_no = transport_method or ''
if pd.notna(remark):
remark_str = str(remark).strip()
if remark_str:
transport_no = remark_str
print(f" 运输单号: {transport_no}")
# 从客户订单中查找单价和下单时间
unit_price = 0
order_date = shipment_date or ''
if contract_no in customer_orders:
order_info = customer_orders[contract_no]
# 匹配物料名称
if material_code in order_info['material']:
unit_price = order_info['unit_price']
order_date = order_info['order_date']
print(f" 含税单价: {unit_price} (从客户订单查找)")
print(f" 下单时间: {order_date} (从客户订单查找)")
else:
print(f" 含税单价: {unit_price} (未找到匹配的客户订单)")
print(f" 下单时间: {order_date} (使用发货日期)")
else:
print(f" 含税单价: {unit_price} (未找到对应的采购单号)")
print(f" 下单时间: {order_date} (使用发货日期)")
# 计算含税金额
total_amount = quantity * unit_price
print(f" 含税金额: {total_amount}")
print(f" 交货日期: {shipment_date}")
print(f" 出货日期: {shipment_date}")
if __name__ == '__main__':
test_parse_shipment()