#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ 测试对账单单价匹配功能 - 详细版本 """ import sqlite3 import sys import os def test_price_matching(): """测试价格匹配逻辑""" # 连接数据库 conn = sqlite3.connect('server/data.db') c = conn.cursor() print("=== 对账单单价匹配测试 ===\n") # 获取所有客户订单 print("1. 获取所有客户订单数据...") 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] print(f" 共找到 {len(order_prices)} 个不同的合同号") # 显示每个合同的物料列表 print("\n2. 客户订单中的合同号及物料:") for order_no, materials in sorted(order_prices.items()): print(f"\n 合同号: {order_no}") for material, price in sorted(materials.items()): print(f" - 物料: {material[:50]}... , 单价: {price}") # 获取所有对账单 print("\n\n3. 检查对账单匹配情况...") c.execute('SELECT id, contract_no, material_name, unit_price FROM reconciliations ORDER BY contract_no') reconciliations = c.fetchall() # 统计匹配情况 matched = 0 not_matched = [] for recon in reconciliations: recon_id, contract_no, material_name, current_price = recon new_price = None match_type = "" # 精确匹配合同号 if contract_no in order_prices: # 尝试精确匹配物料名 if material_name in order_prices[contract_no]: new_price = order_prices[contract_no][material_name] match_type = "精确匹配" 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 match_type = f"部分匹配(订单物料: {order_material[:30]}...)" break # 如果精确匹配没找到,尝试模糊匹配合同号 if new_price is None: for order_no, materials in order_prices.items(): if contract_no in order_no or order_no in contract_no: if material_name in materials: new_price = materials[material_name] match_type = f"模糊匹配合同号({order_no})" break else: # 尝试部分匹配物料名 for order_material, price in materials.items(): if material_name in order_material or order_material in material_name: new_price = price match_type = f"模糊匹配(订单: {order_no}, 物料: {order_material[:30]}...)" break if new_price is not None: break if new_price is not None: matched += 1 print(f" ✓ ID={recon_id}, 合同={contract_no}, 匹配类型: {match_type}") else: not_matched.append((recon_id, contract_no, material_name)) print(f"\n\n4. 匹配结果统计:") print(f" 总对账单记录数: {len(reconciliations)}") print(f" 成功匹配: {matched}") print(f" 未匹配: {len(not_matched)}") if not_matched: print(f"\n5. 未匹配的记录(前10条):") for recon_id, contract_no, material_name in not_matched[:10]: print(f" ✗ ID={recon_id}, 合同号={contract_no}, 物料={material_name[:50]}...") # 检查是否有相似的合同号 similar_orders = [o for o in order_prices.keys() if contract_no[:10] in o or o[:10] in contract_no] if similar_orders: print(f" → 相似合同号: {', '.join(similar_orders)}") # 测试特定匹配案例 print(f"\n6. 测试特定匹配案例:") test_cases = [ ("CGDD002878", "AP-DZ006灯条基站"), ("CGDD002878", "WD1MK0SMD0551"), ("CGDD001850", "AP-DZ009灯条基站"), ] for contract_no, material_name in test_cases: print(f"\n 测试: 合同号={contract_no}, 物料={material_name}") if contract_no in order_prices: print(f" 找到合同号,包含 {len(order_prices[contract_no])} 个物料") for mat, price in order_prices[contract_no].items(): if material_name in mat or mat in material_name: print(f" ✓ 匹配成功: {mat[:50]}... -> {price}") break else: print(f" ✗ 未找到匹配的物料") else: print(f" ✗ 未找到合同号") # 查找相似合同号 similar = [o for o in order_prices.keys() if contract_no in o or o in contract_no] if similar: print(f" → 相似合同号: {similar}") conn.close() print("\n=== 优化建议 ===") print("1. 确保对账单的合同号与客户订单的订单号完全一致") print("2. 物料名称应该标准化,避免使用简写或别名") print("3. 可以在上传发货单时自动匹配客户订单单价") print("4. 对于无法匹配的记录,可以手动设置默认单价") if __name__ == '__main__': test_price_matching()