#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ 委外管理系统测试脚本 用于验证委外工单、发料、入库等功能是否正常工作 """ import sys import os # 添加server目录到路径 sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'server')) from app import init_db, get_db def test_database_tables(): """测试数据库表是否正确创建""" print("=" * 60) print("测试1: 检查数据库表结构") print("=" * 60) # 初始化数据库 init_db() conn = get_db() c = conn.cursor() # 检查委外工单表 c.execute("SELECT name FROM sqlite_master WHERE type='table' AND name='outsourcing_orders'") if c.fetchone(): print("✓ 委外工单表 (outsourcing_orders) 创建成功") else: print("✗ 委外工单表创建失败") return False # 检查委外发料表 c.execute("SELECT name FROM sqlite_master WHERE type='table' AND name='outsourcing_material_issue'") if c.fetchone(): print("✓ 委外发料表 (outsourcing_material_issue) 创建成功") else: print("✗ 委外发料表创建失败") return False # 检查委外在制库存表 c.execute("SELECT name FROM sqlite_master WHERE type='table' AND name='outsourcing_wip_stock'") if c.fetchone(): print("✓ 委外在制库存表 (outsourcing_wip_stock) 创建成功") else: print("✗ 委外在制库存表创建失败") return False # 检查成品入库表 c.execute("SELECT name FROM sqlite_master WHERE type='table' AND name='finished_goods_receipt'") if c.fetchone(): print("✓ 成品入库表 (finished_goods_receipt) 创建成功") else: print("✗ 成品入库表创建失败") return False conn.close() print("\n所有数据库表创建成功!\n") return True def test_table_structure(): """测试表结构是否正确""" print("=" * 60) print("测试2: 检查表结构字段") print("=" * 60) conn = get_db() c = conn.cursor() # 检查委外工单表字段 c.execute("PRAGMA table_info(outsourcing_orders)") columns = [row[1] for row in c.fetchall()] required_columns = ['id', 'order_no', 'customer_order_no', 'product_code', 'product_name', 'production_qty', 'outsourcing_factory', 'delivery_date', 'status', 'created_by', 'created_at', 'updated_at'] print("\n委外工单表字段:") for col in required_columns: if col in columns: print(f" ✓ {col}") else: print(f" ✗ {col} (缺失)") # 检查委外发料表字段 c.execute("PRAGMA table_info(outsourcing_material_issue)") columns = [row[1] for row in c.fetchall()] required_columns = ['id', 'issue_no', 'outsourcing_order_no', 'material_code', 'material_name', 'issue_qty', 'unit', 'issue_date', 'created_by', 'created_at', 'updated_at'] print("\n委外发料表字段:") for col in required_columns: if col in columns: print(f" ✓ {col}") else: print(f" ✗ {col} (缺失)") # 检查成品入库表字段 c.execute("PRAGMA table_info(finished_goods_receipt)") columns = [row[1] for row in c.fetchall()] required_columns = ['id', 'receipt_no', 'outsourcing_order_no', 'product_code', 'product_name', 'receipt_qty', 'receipt_date', 'created_by', 'created_at', 'updated_at'] print("\n成品入库表字段:") for col in required_columns: if col in columns: print(f" ✓ {col}") else: print(f" ✗ {col} (缺失)") # 检查委外在制库存表字段 c.execute("PRAGMA table_info(outsourcing_wip_stock)") columns = [row[1] for row in c.fetchall()] required_columns = ['id', 'outsourcing_order_no', 'material_code', 'material_name', 'wip_qty', 'unit', 'updated_at'] print("\n委外在制库存表字段:") for col in required_columns: if col in columns: print(f" ✓ {col}") else: print(f" ✗ {col} (缺失)") conn.close() print("\n表结构检查完成!\n") return True def create_test_data(): """创建测试数据""" print("=" * 60) print("测试3: 创建测试数据") print("=" * 60) conn = get_db() c = conn.cursor() try: # 创建测试BOM数据 print("\n创建测试BOM数据...") test_bom = [ ('AP05', 'AP05物流版', 'R001', '电阻-10K', 1, 'pcs', 100, '供应商A', None, 'system', '2026-03-13', '2026-03-13'), ('AP05', 'AP05物流版', 'C001', '电容-100uF', 2, 'pcs', 50, '供应商B', None, 'system', '2026-03-13', '2026-03-13'), ('AP05', 'AP05物流版', 'IC001', '芯片-主控', 1, 'pcs', 1, '供应商C', None, 'system', '2026-03-13', '2026-03-13'), ] for bom in test_bom: c.execute('''INSERT OR IGNORE INTO bom ( product_code, product_name, material_code, material_name, unit_qty, unit, min_package, supplier, remark, created_by, created_at, updated_at ) VALUES (?,?,?,?,?,?,?,?,?,?,?,?)''', bom) print("✓ BOM测试数据创建成功") # 创建测试期初库存数据 print("\n创建测试期初库存数据...") test_stock = [ ('R001', '电阻-10K', 500, 'pcs', 100, '供应商A', None, 'system', '2026-03-13', '2026-03-13'), ('C001', '电容-100uF', 1000, 'pcs', 50, '供应商B', None, 'system', '2026-03-13', '2026-03-13'), ('IC001', '芯片-主控', 200, 'pcs', 1, '供应商C', None, 'system', '2026-03-13', '2026-03-13'), ] for stock in test_stock: c.execute('''INSERT OR IGNORE INTO initial_stock ( material_code, material_name, stock_qty, unit, min_package, supplier, remark, created_by, created_at, updated_at ) VALUES (?,?,?,?,?,?,?,?,?,?)''', stock) print("✓ 期初库存测试数据创建成功") # 创建测试客户订单数据 print("\n创建测试客户订单数据...") c.execute('''INSERT OR IGNORE INTO customer_orders ( order_date, order_no, customer_name, material, quantity, unit_price, created_by, created_at, updated_at ) VALUES (?,?,?,?,?,?,?,?,?)''', ('2026-03-13', 'CO20260313001', '测试客户', 'AP05物流版', 100, 1000.00, 'system', '2026-03-13', '2026-03-13')) print("✓ 客户订单测试数据创建成功") conn.commit() print("\n所有测试数据创建成功!\n") except Exception as e: print(f"\n✗ 创建测试数据失败: {str(e)}\n") conn.rollback() return False finally: conn.close() return True def main(): """主测试函数""" print("\n") print("╔" + "=" * 58 + "╗") print("║" + " " * 15 + "委外管理系统测试脚本" + " " * 15 + "║") print("╚" + "=" * 58 + "╝") print("\n") # 运行测试 success = True if not test_database_tables(): success = False if not test_table_structure(): success = False if not create_test_data(): success = False # 输出测试结果 print("=" * 60) if success: print("✓ 所有测试通过!委外管理系统已准备就绪。") print("\n下一步操作:") print("1. 启动服务器: cd server && python app.py") print("2. 访问系统: http://localhost:5000") print("3. 进入\"委外管理\"菜单开始使用") else: print("✗ 部分测试失败,请检查错误信息。") print("=" * 60) print("\n") if __name__ == '__main__': main()