prod_full_analysis.py 5.64 KB
import pyodbc

# 生产环境数据库
conn = pyodbc.connect(
    'DRIVER={ODBC Driver 17 for SQL Server};'
    'SERVER=192.168.1.168,1433;'
    'DATABASE=wms4_global;'
    'UID=sa;PWD=HHrobot123.'
)

cursor = conn.cursor()

print("=" * 80)
print("【生产环境】ERP推送问题单据分析")
print("=" * 80)

# 1. 查看所有表
print("\n【数据库表列表】")
cursor.execute("""
    SELECT TABLE_NAME 
    FROM INFORMATION_SCHEMA.TABLES 
    WHERE TABLE_TYPE = 'BASE TABLE'
    ORDER BY TABLE_NAME
""")
tables = [row[0] for row in cursor.fetchall()]
print(f"共 {len(tables)} 张表")

# 2. 查看入库单状态分布
print("\n\n【一、入库单状态分布】")
print("-" * 60)

cursor.execute("""
    SELECT 
        COUNT(*) as total,
        SUM(CASE WHEN first_status = 0 THEN 1 ELSE 0 END) as 新建,
        SUM(CASE WHEN first_status = 50 THEN 1 ELSE 0 END) as 组盘中,
        SUM(CASE WHEN first_status = 100 THEN 1 ELSE 0 END) as 已提交,
        SUM(CASE WHEN first_status = 200 THEN 1 ELSE 0 END) as 已确认,
        SUM(CASE WHEN first_status = 800 THEN 1 ELSE 0 END) as 已回传,
        SUM(CASE WHEN first_status = 900 THEN 1 ELSE 0 END) as 已完成
    FROM receipt_header
""")
row = cursor.fetchone()
print(f"入库单总数: {row[0]}")
print(f"  新建(0): {row[1]}")
print(f"  组盘中(50): {row[2]}")
print(f"  已提交(100): {row[3]}")
print(f"  已确认(200): {row[4]}")
print(f"  已回传(800): {row[5]}")
print(f"  已完成(900): {row[6]}")

# 3. 查看出库单状态分布
print("\n\n【二、出库单状态分布】")
print("-" * 60)

cursor.execute("""
    SELECT 
        COUNT(*) as total,
        SUM(CASE WHEN first_status = 0 THEN 1 ELSE 0 END) as 新建,
        SUM(CASE WHEN first_status = 50 THEN 1 ELSE 0 END) as 组盘中,
        SUM(CASE WHEN first_status = 100 THEN 1 ELSE 0 END) as 已提交,
        SUM(CASE WHEN first_status = 200 THEN 1 ELSE 0 END) as 已确认,
        SUM(CASE WHEN first_status = 800 THEN 1 ELSE 0 END) as 已回传,
        SUM(CASE WHEN first_status = 900 THEN 1 ELSE 0 END) as 已完成
    FROM shipment_header
""")
row = cursor.fetchone()
print(f"出库单总数: {row[0]}")
print(f"  新建(0): {row[1]}")
print(f"  组盘中(50): {row[2]}")
print(f"  已提交(100): {row[3]}")
print(f"  已确认(200): {row[4]}")
print(f"  已回传(800): {row[5]}")
print(f"  已完成(900): {row[6]}")

# 4. 问题入库单分析
print("\n\n【三、问题入库单分析】")
print("-" * 60)
print("排除条件:调拨入库(DBR/dbr)、倒扣料、已回传(800)、已完成(900)、新建(0)")

# 按类型统计
cursor.execute("""
    SELECT 
        type,
        COUNT(*) as cnt
    FROM receipt_header
    WHERE first_status NOT IN (0, 800, 900)
    AND type NOT IN ('DBR', 'dbr')
    GROUP BY type
    ORDER BY cnt DESC
""")
print("\n问题入库单按类型统计:")
for row in cursor.fetchall():
    print(f"  {row[0]}: {row[1]} 条")

# 详细问题入库单
print("\n问题入库单详情(前50条):")
print(f"{'入库单号':<35} {'类型':<12} {'头状态':<10} {'尾状态':<10} {'创建时间':<20}")
print("-" * 87)

cursor.execute("""
    SELECT TOP 50
        code,
        type,
        first_status,
        last_status,
        CONVERT(VARCHAR, create_time, 120) as create_time
    FROM receipt_header
    WHERE first_status NOT IN (0, 800, 900)
    AND type NOT IN ('DBR', 'dbr')
    ORDER BY create_time DESC
""")

for row in cursor.fetchall():
    code = row[0] or ''
    bill_type = row[1] or ''
    first = row[2] if row[2] is not None else '-'
    last = row[3] if row[3] is not None else '-'
    create_time = row[4] or ''
    print(f"{code:<35} {bill_type:<12} {str(first):<10} {str(last):<10} {create_time:<20}")

# 5. 问题出库单分析
print("\n\n【四、问题出库单分析】")
print("-" * 60)

cursor.execute("""
    SELECT 
        type,
        COUNT(*) as cnt
    FROM shipment_header
    WHERE first_status NOT IN (0, 800, 900)
    AND type NOT IN ('DBR', 'dbr')
    GROUP BY type
    ORDER BY cnt DESC
""")
print("\n问题出库单按类型统计:")
for row in cursor.fetchall():
    print(f"  {row[0]}: {row[1]} 条")

print("\n问题出库单详情(前50条):")
print(f"{'出库单号':<35} {'类型':<12} {'头状态':<10} {'尾状态':<10} {'创建时间':<20}")
print("-" * 87)

cursor.execute("""
    SELECT TOP 50
        code,
        type,
        first_status,
        last_status,
        CONVERT(VARCHAR, create_time, 120) as create_time
    FROM shipment_header
    WHERE first_status NOT IN (0, 800, 900)
    AND type NOT IN ('DBR', 'dbr')
    ORDER BY create_time DESC
""")

for row in cursor.fetchall():
    code = row[0] or ''
    bill_type = row[1] or ''
    first = row[2] if row[2] is not None else '-'
    last = row[3] if row[3] is not None else '-'
    create_time = row[4] or ''
    print(f"{code:<35} {bill_type:<12} {str(first):<10} {str(last):<10} {create_time:<20}")

# 6. 查看组盘相关表
print("\n\n【五、组盘相关表分析】")
print("-" * 60)

# 查找组盘相关表
inout_tables = [t for t in tables if 'inout' in t.lower() or 'container' in t.lower() or 'group' in t.lower() or '组盘' in t]
print(f"组盘相关表: {inout_tables}")

for table in inout_tables[:5]:
    print(f"\n表 {table} 结构:")
    cursor.execute(f"""
        SELECT COLUMN_NAME, DATA_TYPE 
        FROM INFORMATION_SCHEMA.COLUMNS 
        WHERE TABLE_NAME = '{table}'
        ORDER BY ORDINAL_POSITION
    """)
    cols = [(row[0], row[1]) for row in cursor.fetchall()]
    for col in cols:
        if 'status' in col[0].lower() or 'inout' in col[0].lower():
            print(f"  *** {col[0]}: {col[1]}")
        else:
            print(f"  {col[0]}: {col[1]}")

conn.close()
print("\n\n分析完成!")