#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ 测试对账单单价刷新功能 """ import sqlite3 import sys import os # 添加项目路径 sys.path.append(os.path.dirname(os.path.abspath(__file__))) def test_price_refresh(): """测试价格刷新功能""" # 连接数据库 conn = sqlite3.connect('server/data.db') c = conn.cursor() print("=== 测试对账单单价刷新功能 ===\n") # 1. 检查数据库结构 print("1. 检查数据库表结构...") c.execute("PRAGMA table_info(customer_orders)") customer_orders_columns = c.fetchall() print(f" customer_orders 表字段: {[col[1] for col in customer_orders_columns]}") c.execute("PRAGMA table_info(reconciliations)") reconciliations_columns = c.fetchall() print(f" reconciliations 表字段: {[col[1] for col in reconciliations_columns]}") # 2. 查看现有数据 print("\n2. 查看现有数据...") c.execute("SELECT COUNT(*) FROM customer_orders") customer_orders_count = c.fetchone()[0] print(f" 客户订单记录数: {customer_orders_count}") c.execute("SELECT COUNT(*) FROM reconciliations") reconciliations_count = c.fetchone()[0] print(f" 对账单记录数: {reconciliations_count}") # 3. 显示部分示例数据 print("\n3. 客户订单示例数据:") c.execute("SELECT order_no, material, unit_price FROM customer_orders LIMIT 5") for row in c.fetchall(): print(f" 订单号: {row[0]}, 物料: {row[1][:30]}..., 单价: {row[2]}") print("\n4. 对账单示例数据:") c.execute("SELECT contract_no, material_name, unit_price FROM reconciliations LIMIT 5") for row in c.fetchall(): print(f" 合同号: {row[0]}, 物料: {row[1][:30]}..., 单价: {row[2]}") # 4. 测试价格匹配逻辑 print("\n5. 测试价格匹配逻辑...") # 获取所有客户订单 c.execute('SELECT order_no, material, unit_price FROM customer_orders') customer_orders = c.fetchall() # 构建订单单价字典 order_prices = {} for order in customer_orders: order_no = order[0] if order_no not in order_prices: order_prices[order_no] = {} # 处理物料名称(支持换行符分割的多个物料) materials = str(order[1]).split('\n') for material in materials: material = material.strip() if material: order_prices[order_no][material] = order[2] # 测试对账单匹配 c.execute('SELECT id, contract_no, material_name, unit_price FROM reconciliations LIMIT 10') test_reconciliations = c.fetchall() matched_count = 0 for recon in test_reconciliations: recon_id, contract_no, material_name, current_price = recon new_price = None # 精确匹配合同号 if contract_no in order_prices: # 尝试精确匹配物料名 if material_name in order_prices[contract_no]: new_price = order_prices[contract_no][material_name] else: # 尝试部分匹配 for order_material, price in order_prices[contract_no].items(): if material_name in order_material or order_material in material_name: new_price = price break if new_price is not None: print(f" ✓ 匹配成功: 对账单ID={recon_id}, 合同号={contract_no}, 当前单价={current_price}, 匹配单价={new_price}") matched_count += 1 else: print(f" ✗ 未匹配: 对账单ID={recon_id}, 合同号={contract_no}, 物料={material_name[:30]}...") print(f"\n 测试结果: {matched_count}/{len(test_reconciliations)} 条记录成功匹配") conn.close() print("\n=== 测试完成 ===") print("\n功能说明:") print("1. 已添加 /api/reconciliations/refresh-prices 接口,用于批量刷新所有对账单单价") print("2. 已添加 /api/reconciliations/fetch-price 接口,用于根据合同号和物料名获取单个单价") print("3. 前端已添加'刷新单价'按钮,支持手动批量刷新") print("4. 新增/编辑对账单时,可通过'获取单价'按钮从客户订单获取最新单价") print("\n使用方法:") print("- 批量刷新: 在对账单管理页面点击'刷新单价'按钮") print("- 单个获取: 在新增/编辑对账单时,填写合同号和物料名称后点击'获取单价'") if __name__ == '__main__': test_price_refresh()