#!/usr/bin/env python3 """ 测试采购需求状态更新为"已下单"后期初库存的更新功能 """ import sqlite3 import sys import os # 添加项目路径 sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) DB_PATH = 'server/data.db' def test_purchase_demand_ordered_update(): """测试采购需求状态更新为已下单后期初库存自动更新""" # 连接数据库 conn = sqlite3.connect(DB_PATH) c = conn.cursor() try: # 1. 创建测试物料 material_code = 'TEST001' material_name = '测试物料' # 插入期初库存记录 c.execute('''INSERT OR REPLACE INTO initial_stock (material_code, material_name, stock_qty, created_at, updated_at) VALUES (?, ?, ?, datetime('now', 'localtime'), datetime('now', 'localtime'))''', (material_code, material_name, 100)) # 2. 创建采购需求记录 c.execute('''INSERT INTO purchase_demand (demand_no, material_code, material_name, order_qty, bom_unit_qty, total_demand, initial_stock, net_demand, min_package, actual_purchase_qty, status, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, datetime('now', 'localtime'), datetime('now', 'localtime'))''', ('TEST001', material_code, material_name, 10, 5, 50, 100, 0, 10, 50, 'pending')) demand_id = c.lastrowid # 3. 更新状态为已下单 c.execute('''UPDATE purchase_demand SET status = 'ordered', updated_at = datetime('now', 'localtime') WHERE id = ?''', (demand_id,)) # 4. 模拟计算新的期初库存:实际采购 - 总需求 actual_purchase_qty = 50 total_demand = 50 expected_stock = actual_purchase_qty - total_demand # 更新期初库存 c.execute('''INSERT OR REPLACE INTO initial_stock (material_code, material_name, stock_qty, updated_at) VALUES (?, ?, ?, datetime('now', 'localtime'))''', (material_code, material_name, expected_stock)) conn.commit() # 5. 验证结果 c.execute('SELECT stock_qty FROM initial_stock WHERE material_code = ?', (material_code,)) result = c.fetchone() if result: actual_stock = result[0] print(f"✅ 测试通过!") print(f" - 物料编码: {material_code}") print(f" - 实际采购数量: {actual_purchase_qty}") print(f" - 总需求: {total_demand}") print(f" - 期望期初库存: {expected_stock}") print(f" - 实际期初库存: {actual_stock}") if actual_stock == expected_stock: print(f" - 期初库存更新正确!") else: print(f" - ❌ 期初库存更新错误!") else: print("❌ 测试失败:未找到期初库存记录") # 6. 清理测试数据 c.execute('DELETE FROM purchase_demand WHERE id = ?', (demand_id,)) c.execute('DELETE FROM initial_stock WHERE material_code = ?', (material_code,)) conn.commit() except Exception as e: print(f"❌ 测试出错: {e}") conn.rollback() finally: conn.close() if __name__ == '__main__': print("开始测试采购需求状态更新功能...") print("=" * 50) test_purchase_demand_ordered_update() print("=" * 50) print("测试完成!")