Skip to content
This repository was archived by the owner on Aug 14, 2026. It is now read-only.

Repository files navigation

采购三单匹配工具包

概述

本工具包用于匹配和分析SAP系统中的采购订单、收货单、发票三单数据,支持完整的差异分析和分类统计。适用于SAP ECC和S4HANA系统导出的KPMG格式数据。

重要说明:本代码逻辑与参考代码 采购三单-妙可.py 保持一致,确保计算结果的一致性。

功能特性

  • 三单匹配:自动匹配采购订单、收货单、发票数据
  • 差异分析:支持四个大类13个子类的完整分类体系,按发票金额_本币统计占比
  • 清单生成:分别生成采购订单、收货单、发票三个清单,支持更多字段展示
  • 可配置化:通过配置文件轻松适配不同项目需求
  • 高性能:支持pickle缓存,大幅提升数据读取速度(首次读取TXT后自动缓存为pkl)
  • 多文件支持:自动处理拆分的MSEG文件和RSEG相关文件
  • 智能文件匹配:自动识别并合并基础文件和RSEG文件
  • 数据验证:支持数据完整性检查和匹配后数量验证
  • 字段命名规范:所有输出字段采用"中文释义_字段名"格式,清晰易懂

代码运行逻辑

整体流程

1. 数据读取阶段
   ├── 读取订单数据(EKKO + EKPO + EKKO_RSEG + EKPO_RSEG)
   ├── 读取收货数据(MSEG + MSEG_RSEG)
   └── 读取发票数据(RSEG + RBKP)

2. 数据处理阶段
   ├── 处理订单数据(合并、筛选、汇总)
   ├── 处理收货数据(合并、筛选、汇总)
   └── 处理发票数据(合并、筛选、汇总)

3. 数据匹配阶段
   └── 三单匹配(以发票为基础,左连接收货和订单)

4. 结果导出阶段
   ├── 导出匹配结果(有发票的单据)
   └── 导出未测试单据(无发票的单据,分为3类)

5. 差异分析阶段
   └── 对匹配结果进行差异分类和统计

详细运行流程

步骤1:读取订单数据(EKKO + EKPO)

  1. 文件匹配

    • 匹配 MM*EKKO*.TXT 文件(排除 *EKKO_RSEG*.TXT
    • 匹配 MM*EKPO*.TXT 文件(排除 *EKPO_RSEG*.TXT
    • 匹配 MM*EKKO_RSEG*.TXT 文件(单独读取并合并)
    • 匹配 MM*EKPO_RSEG*.TXT 文件(单独读取并合并)
  2. 缓存检查

    • 优先检查 pickle 文件夹中是否有对应的 .pkl 缓存文件
    • 如果有缓存,直接读取pkl文件(快速)
    • 如果没有缓存,读取TXT文件并自动保存为pkl缓存
  3. 数据合并

    • 合并基础文件和RSEG文件:pd.concat([df_ekko_0, df_ekko_rseg])
    • 确保 BUKRS 字段为字符串类型:dtype={'BUKRS': str}
  4. 数据验证(如果 ENABLE_DATA_VALIDATION = True):

    • 检查RBKP表的 BUKRS + BELNR 是否重复
    • 检查EKKO表的 BUKRS + EBELN 是否重复

步骤2:处理订单数据(process_order_data)

与参考代码逻辑一致

  1. 数据合并

    • EKPO(订单行项目)左连接 EKKO(订单抬头)
    • 合并键:['BUKRS', 'EBELN', 'MANDT']
  2. 字段处理

    • 提取 记录建立日期df_order['记录建立日期'] = df_order['AEDAT_y']
    • 删除所有包含 _y 后缀的列(EKKO表的字段)
    • 将所有 _x 后缀替换为空(EKPO表的字段)
    • 物料号处理:
      MATNR = MATNR.fillna(0).astype(int).astype(str).map(lambda x: x if x != '0' else '')
    • 空值填充:
      • EBELN, EBELP, UEBTO → 填充为 0
      • BUKRS, BSART, MATNR, UEBTK → 填充为空字符串 ''
  3. 金额和数量计算(考虑退货调整):

    订单金额_外币 = NETWR * RETPO调整系数
    订单金额_本币 = NETWR * WKURS * RETPO调整系数
    订单数量 = MENGE * RETPO调整系数
    • RETPO调整系数
      • RETPO = ''(空)→ 系数 = 1(正常订单)
      • RETPO = 'X' → 系数 = -1(退货订单,需要取反)
  4. 数据筛选(根据配置):

    • 筛选已删除订单:LOEKZ.isna()(只保留未删除的订单)
    • 筛选日期范围:记录建立日期 在指定年月范围内(如果启用)
    • 筛选订单类型:BSART = ORDER_TYPE(如果启用,默认'Z001')
    • 筛选物料号:MATNR != ''MATNR < MATNR_MAX(如果启用,默认500000)
  5. 数据汇总

    • 使用 pivot_table['BUKRS', 'EBELN', 'EBELP', 'BSART', 'MATNR', 'UEBTO', 'UEBTK'] 汇总
    • 汇总字段:订单金额_外币订单金额_本币订单数量
    • 汇总方式:aggfunc='sum'(求和)
  6. 创建物料映射表

    • 从订单数据中提取 ['MATNR', 'BUKRS', 'EBELN', 'EBELP', 'TXZ01']
    • 用于后续匹配时添加物料描述

步骤3:读取收货数据(MSEG)

  1. 文件匹配

    • 匹配 MM*MSEG*.TXT 文件(可能多个,自动合并)
    • 匹配 MM*MSEG_RSEG*.TXT 文件(单独读取并合并)
  2. 缓存检查

    • 优先使用pickle缓存
    • 首次读取自动保存缓存
  3. 数据合并

    • 合并所有MSEG基础文件和MSEG_RSEG文件

步骤4:处理收货数据(process_receipt_data)

与参考代码逻辑一致

  1. 数据筛选

    • 只保留有订单号的数据:EBELN.notna()
  2. 字段处理

    • EBELN 转换为整数:EBELN.astype(int)
    • LIFNR(供应商)转换为字符串:
      LIFNR = LIFNR.map(lambda x: str(int(x)) if ~np.isnan(x) else '')
  3. 金额和数量计算(考虑借贷标识):

    入库金额 = DMBTR * SHKZG调整系数
    交货成本 = BNBTR * SHKZG调整系数
    交货数量 = BPMNG * SHKZG调整系数
    • SHKZG调整系数
      • SHKZG = 'S'(借方)→ 系数 = 1(正常收货)
      • SHKZG = 'H'(贷方)→ 系数 = -1(退货,需要取反)
  4. 数据筛选(根据配置):

    • 筛选物料号:MATNR.notnull()MATNR < MATNR_MAX(如果启用,默认500000)
  5. 数据汇总

    • 使用 pivot_table['BUKRS', 'EBELN', 'EBELP'] 汇总
    • 汇总字段:入库金额交货成本交货数量
    • 汇总方式:aggfunc='sum'(求和)

步骤5:读取发票数据(RSEG + RBKP)

  1. 文件匹配

    • 匹配发票RSEG文件:MM*RSEG_0001.TXT(只匹配文件名中只有一个下划线的文件,排除其他表的RSEG文件)
    • 匹配RBKP文件:MM*RBKP*.TXT(自动排除 *BLOCKED*.TXT 文件)
  2. 缓存检查

    • 优先使用pickle缓存
    • 首次读取自动保存缓存

步骤6:处理发票数据(process_invoice_data)

与参考代码逻辑一致

  1. 数据合并

    • RSEG(发票行项目)左连接 RBKP(发票抬头)
    • 合并键:['BUKRS', 'BELNR']
    • 重要:使用 suffixes=('_rseg', '_rbkp') 明确区分来源,优先保留RBKP字段
  2. 字段处理

    • 处理列名冲突:对于同时存在于RSEG和RBKP的字段,优先使用RBKP版本
    • 删除冲突的RSEG字段(带_rseg后缀),保留RBKP字段(带_rbkp后缀)
    • 统一字段名:去掉所有_rbkp_rseg后缀
    • 确定日期字段:BUDATBUDAT_xBUDAT_y
  3. 金额和数量计算(考虑借贷标识和排除标识):

    发票金额_本币 = WRBTR * KURSF * SHKZG调整系数
    发票校验差异 = STOCK_POSTING * KURSF  # 注意:未调整借贷方向
    发票数量 = MENGE * SHKZG调整系数 * EXKBE排除系数
    • SHKZG调整系数
      • SHKZG = 'S'(借方)→ 系数 = 1(正常发票)
      • SHKZG = 'H'(贷方)→ 系数 = -1(贷项凭证,需要取反)
    • EXKBE排除系数
      • EXKBE = ''(空)→ 系数 = 0(排除,不计算数量)
      • EXKBE = 'X' → 系数 = 1(包含,计算数量)
    • 重要发票校验差异 只乘以汇率,不调整借贷方向(与参考代码一致)
  4. 数据筛选(根据配置):

    • 筛选物料号:MATNR.notnull()MATNR < MATNR_MAX(如果启用,默认500000)
    • 筛选日期范围:BUDAT 在指定年月范围内(如果启用)
    • 筛选关键字段:BUKRSEBELNEBELP 非空(如果启用)
  5. 数据汇总

    • 如果 BUKRS 有有效值:按 ['BUKRS', 'EBELN', 'EBELP'] 汇总
    • 如果 BUKRS 全部为空:按 ['EBELN', 'EBELP'] 汇总,并添加空的 BUKRS
    • 汇总字段:发票金额_本币发票校验差异发票数量
    • 汇总方式:aggfunc='sum'(求和)

步骤7:执行三单匹配(match_three_documents)

与参考代码逻辑一致

  1. 确定匹配键(动态匹配键):

    • 检查发票的 BUKRS 字段是否有有效值(非空且非空字符串)
    • 如果有:使用 ['BUKRS', 'EBELN', 'EBELP'] 作为匹配键
    • 如果没有:使用 ['EBELN', 'EBELP'] 作为匹配键
  2. 数据匹配

    • 记录匹配前的发票数量:num_test = len(pivot_invoice)
    • 以发票汇总表为基础(pivot_invoice
    • 左连接收货汇总表(pivot_mseg
    • 左连接订单汇总表(pivot_order
  3. 匹配后数量检查

    • 如果 ENABLE_MATCH_COUNT_CHECK = True
      • 检查匹配后数量是否等于匹配前数量:len(df_join) == num_test
      • 如果不一致,给出警告
  4. 筛选订单类型

    • 如果启用筛选:df_join = df_join[df_join['BSART'] == ORDER_TYPE]
    • 默认筛选 BSART == 'Z001'
  5. 添加物料描述

    • matnr_mapper 合并 TXZ01(物料描述)
  6. 合并额外字段

    • 从订单数据合并:记录建立日期供应商_订单订单单位汇率
    • 从收货数据合并:供应商_收货收货日期收货过账日期交货数量_参考单位_MEINS交货数量_参考单位_ERFME
    • 从发票数据合并:发票号发票过账日期供应商_发票发票行项目文本发票数量单位发票数量_参考单位_BSTME
  7. 填充空值

    • 以下字段填充为0并四舍五入到2位小数:
      • 发票数量, 发票校验差异, 发票金额_本币
      • 交货成本, 交货数量, 入库金额
      • 订单数量, 订单金额_本币
  8. 计算差异字段

    # 基础金额字段
    订单-金额 = 订单金额_本币
    入库单-金额 = 入库金额 - 交货成本
    发票-金额 = 发票金额_本币 - 发票校验差异 - 交货成本
    
    # 金额差异
    订单-入库单金额差异 = 订单-金额 - 入库单-金额
    订单-发票金额差异 = 订单-金额 - 发票-金额
    入库单-发票金额差异 = 入库单-金额 - 发票-金额
    
    # 数量差异
    订单-交货数量差异 = 订单数量 - 交货数量
    订单-发票数量差异 = 订单数量 - 发票数量
    入库单-发票数量差异 = 交货数量 - 发票数量

步骤8:导出结果(export_results)

  1. 字段重命名

    • 所有输出字段采用"中文释义_字段名"格式(如:公司代码_BUKRS订单金额_本币_计算
    • 确保字段名称清晰易懂
  2. 导出匹配结果(有发票的单据):

    • 文件名:采购三单匹配结果_YYYY_M-M月_XXX.xlsx
    • 包含所有匹配数据和差异字段
  3. 导出未测试单据(无发票的单据):

    • 文件名:采购三单匹配结果_未测试单据_YYYY_M-M月_XXX.xlsx
    • 分类导出(3个Sheet):
      • Sheet1: 其他未测试1 - 有订单和收货,但无发票
      • Sheet2: 其他未测试2 - 只有订单,无收货和发票
      • Sheet3: 其他未测试3 - 只有收货,无订单和发票

步骤9:差异分析(difference_analysis.py)

  1. 读取匹配结果

    • 自动查找最新的匹配结果文件(排除"未测试单据"和"差异分析"文件)
  2. 应用分类逻辑

    • 四个大类分类

      • 无差异:金额差异 < 0.1元 且 数量差异 < 0.01
      • 金额差异:金额差异 ≥ 0.1元 且 数量差异 < 0.01
      • 数量差异:金额差异 < 0.1元 且 数量差异 ≥ 0.01
      • 均有差异:金额差异 ≥ 0.1元 且 数量差异 ≥ 0.01
    • 金额差异细分

      • 尾差(<1):金额差异 < 1元
      • 汇率导致尾差:存在汇率差异(暂未实现)
      • 交货成本导致差异:存在交货成本
    • 均有差异细分

      • 未完全交货:订单数量 > 交货数量 且 交货数量 = 发票数量
      • 过量交货:订单数量 < 交货数量 且 交货数量 = 发票数量
      • 未完全开票:订单数量 = 交货数量 且 交货数量 < 发票数量
      • 预制发票:订单数量 > 交货数量,发票数量 > 交货数量,且订单数量 = 发票数量
      • 其他:不符合上述类型的其他情况
  3. 统计口径

    • 按发票金额_本币统计占比(而非按订单数量)
    • 占比 = 分类发票金额_本币 / 总发票金额_本币 × 100%
    • 同时显示记录数和金额
  4. 输出结果

    • 文件名:采购三单匹配结果_差异分析_YYYY_M-M月_XXX.xlsx
    • 包含多个Sheet(所有分类结果在同一Excel文件的不同Sheet中):
      • 四个大类:统计四个大类的记录数、金额和占比
      • 金额差异细分:统计金额差异的细分情况
      • 均有差异细分:统计均有差异的细分情况
      • 详细数据:包含所有分类标记的详细数据
      • 各分类详细记录:每个分类的详细记录(Sheet名称根据分类名称自动调整)

字段处理说明

订单数据字段处理

输出字段 来源字段 处理逻辑
订单金额_外币 EKPO.NETWR NETWR * RETPO调整系数
订单金额_本币 EKPO.NETWR, EKKO.WKURS NETWR * WKURS * RETPO调整系数
订单数量 EKPO.MENGE MENGE * RETPO调整系数
记录建立日期 EKKO.AEDAT 转换为日期格式
物料描述 EKPO.TXZ01 直接提取

RETPO调整系数

  • RETPO = ''(空)→ 系数 = 1(正常订单)
  • RETPO = 'X' → 系数 = -1(退货订单,需要取反)

收货数据字段处理

输出字段 来源字段 处理逻辑
入库金额 MSEG.DMBTR DMBTR * SHKZG调整系数
交货成本 MSEG.BNBTR BNBTR * SHKZG调整系数
交货数量 MSEG.BPMNG BPMNG * SHKZG调整系数

SHKZG调整系数

  • SHKZG = 'S'(借方)→ 系数 = 1(正常收货)
  • SHKZG = 'H'(贷方)→ 系数 = -1(退货,需要取反)

发票数据字段处理

输出字段 来源字段 处理逻辑
发票金额_本币 RSEG.WRBTR, RBKP.KURSF WRBTR * KURSF * SHKZG调整系数
发票校验差异 RSEG.STOCK_POSTING, RBKP.KURSF STOCK_POSTING * KURSF未调整借贷方向
发票数量 RSEG.MENGE MENGE * SHKZG调整系数 * EXKBE排除系数
过账日期 RBKP.BUDAT 转换为日期格式

SHKZG调整系数

  • SHKZG = 'S'(借方)→ 系数 = 1(正常发票)
  • SHKZG = 'H'(贷方)→ 系数 = -1(贷项凭证,需要取反)

EXKBE排除系数

  • EXKBE = ''(空)→ 系数 = 0(排除,不计算数量)
  • EXKBE = 'X' → 系数 = 1(包含,计算数量)

重要发票校验差异 只乘以汇率,不调整借贷方向(与参考代码一致)

计算字段说明

基础金额字段

订单-金额 = 订单金额_本币
入库单-金额 = 入库金额 - 交货成本
发票-金额 = 发票金额_本币 - 发票校验差异 - 交货成本

说明

  • 订单-金额:订单的净金额(不含交货成本)
  • 入库单-金额:收货的净金额(入库金额减去交货成本)
  • 发票-金额:发票的净金额(发票金额减去校验差异和交货成本)

差异字段

订单-入库单金额差异 = 订单-金额 - 入库单-金额
订单-发票金额差异 = 订单-金额 - 发票-金额
入库单-发票金额差异 = 入库单-金额 - 发票-金额

订单-交货数量差异 = 订单数量 - 交货数量
订单-发票数量差异 = 订单数量 - 发票数量
入库单-发票数量差异 = 交货数量 - 发票数量

差异计算规则

  • 正数:表示订单/入库单 > 发票(订单多、发票少)
  • 负数:表示订单/入库单 < 发票(订单少、发票多)
  • 零:表示完全匹配

字段命名规范

所有输出字段采用"中文释义_字段名"格式,例如:

  • 公司代码_BUKRS
  • 采购订单号_EBELN
  • 订单金额_本币_计算
  • 交货数量_参考单位_MEINS
  • 发票数量单位_MEINS

这种命名方式使得:

  1. 字段含义清晰明了(中文释义)
  2. 便于追溯字段来源(原始字段名)
  3. 区分计算字段和原始字段(_计算后缀)

数据文件核对说明

文件匹配情况

✅ 已匹配的文件类型

  1. EKKO文件(采购订单抬头)

    • 基础文件: MM*EKKO*.TXT(排除RSEG文件)
    • RSEG文件: MM*EKKO_RSEG*.TXT
    • 匹配模式: 自动排除重复的RSEG文件
  2. EKPO文件(采购订单行项目)

    • 基础文件: MM*EKPO*.TXT(排除RSEG文件)
    • RSEG文件: MM*EKPO_RSEG*.TXT
    • 匹配模式: 自动排除重复的RSEG文件
  3. MSEG文件(收货单)

    • 基础文件: MM*MSEG*.TXT(可能多个,自动合并)
    • RSEG文件: MM*MSEG_RSEG*.TXT
    • 匹配模式: 自动合并所有匹配的文件
  4. RSEG文件(发票行项目)

    • 发票RSEG文件: MM*RSEG_0001.TXT(只匹配发票RSEG,排除其他表的RSEG文件)
    • 匹配模式: 通过下划线数量区分(发票RSEG只有一个下划线)
  5. RBKP文件(发票抬头)

    • 基础文件: MM*RBKP*.TXT
    • BLOCKED文件: MM*RBKP_BLOCKED*.TXT(已自动排除)
    • 匹配模式: 自动排除BLOCKED文件

文件命名规则

实际文件命名格式

  • 格式: MM2501T12表名_编号.TXT
  • 示例: MM2501T12EKKO_0001.TXT
  • RSEG文件: MM2501T12表名_RSEG_0001.TXTMM2501T12RSEG_0001.TXT

配置文件中的匹配模式

  • MM*EKKO*.TXT - 匹配所有EKKO文件(代码中会排除RSEG文件)
  • MM*EKKO_RSEG*.TXT - 专门匹配EKKO的RSEG文件
  • MM*RSEG_0001.TXT - 匹配发票RSEG文件(代码中会进一步过滤)

注意事项

  1. RSEG文件区分:

    • 发票RSEG文件: MM2501T12RSEG_0001.TXT(只有一个下划线)
    • 其他表RSEG文件: MM2501T12表名_RSEG_0001.TXT(两个下划线)
    • 代码已自动区分并只读取发票RSEG文件
  2. BLOCKED文件:

    • MM2501T12RBKP_BLOCKED_0001.TXT 已自动排除
    • 这是已阻止的发票,不应包含在正常匹配中
  3. MSEG文件分片:

    • MSEG文件可能被分成多个文件(如0001_001到0002_002)
    • 代码会自动合并所有匹配的MSEG文件

快速开始

1. 环境要求

  • Python 3.7+
  • 必需库:
    pip install pandas numpy openpyxl chardet

2. 配置设置

编辑 config.py 文件,修改以下配置:

# 数据路径配置
DATA_FOLDER = r'C:\Users\Aatro\Desktop\New\MM 1-12'
OUTPUT_FOLDER = r'C:\Users\Aatro\Desktop\New\Purchase_Three_Match_Results_2025_Full_Year'
PICKLE_FOLDER = 'pickle'

# 日期筛选配置
ORDER_YEAR = 2025
ORDER_MONTH_START = 1
ORDER_MONTH_END = 12

INVOICE_YEAR = 2025
INVOICE_MONTH_START = 1
INVOICE_MONTH_END = 12

# 业务筛选配置
ORDER_TYPE = 'Z001'
MATNR_MAX = 500000

# 筛选开关配置
ENABLE_ALL_FILTERS = True
FILTER_DELETED_ORDERS = True
FILTER_ORDER_DATE = True
FILTER_INVOICE_DATE = True
FILTER_ORDER_TYPE = True
FILTER_MATNR_MAX = True
FILTER_MATNR_NOTNULL = True
FILTER_BUKRS_NOTNULL = True

# 数据验证配置
ENABLE_DATA_VALIDATION = True
ENABLE_MATCH_COUNT_CHECK = True

3. 运行脚本

运行三单匹配

python purchase_three_match.py

运行差异分析

python difference_analysis.py

生成三个清单

python three_lists.py

文件结构

PurchaseThreeMatchToolkit/
├── config.py                    # 配置文件
├── purchase_three_match.py      # 三单匹配主程序
├── difference_analysis.py       # 差异分析程序
├── three_lists.py              # 清单生成程序
├── utils/
│   └── DylanTools.py           # 工具函数(TXT文件读取)
├── pickle/                     # pickle缓存文件夹(自动生成)
├── README.md                   # 本文档
└── 分类逻辑说明.md             # 差异分析分类逻辑详细说明

输出文件说明

三单匹配结果

  • 主要匹配结果采购三单匹配结果_YYYY_M-M月_XXX.xlsx

    • 包含所有有发票的单据匹配结果
    • 包含所有差异字段
    • 字段命名采用"中文释义_字段名"格式
  • 未测试单据采购三单匹配结果_未测试单据_YYYY_M-M月_XXX.xlsx

    • Sheet1: 其他未测试1(有订单和收货,但无发票)
    • Sheet2: 其他未测试2(只有订单,无收货和发票)
    • Sheet3: 其他未测试3(只有收货,无订单和发票)

差异分析结果

  • 差异分析结果采购三单匹配结果_差异分析_YYYY_M-M月_XXX.xlsx
    • Sheet1: 四个大类(统计四个大类的记录数、金额和占比)
    • Sheet2: 金额差异细分(统计金额差异的细分情况)
    • Sheet3: 均有差异细分(统计均有差异的细分情况)
    • Sheet4: 详细数据(包含所有分类标记的详细数据)
    • 其他Sheet: 各分类的详细记录(Sheet名称根据分类名称自动调整)

三个清单

  • 采购订单清单采购订单清单_YYYY_M-M月_XXX.xlsx

    • 包含订单的详细信息,字段丰富
  • 收货单清单收货单清单_YYYY_M-M月_第N部分_XXX.xlsx

    • 如果数据量超过Excel限制(1,048,575行),会自动拆分为多个文件
    • 包含收货的详细信息
  • 采购发票清单采购发票清单_YYYY_M-M月_XXX.xlsx

    • 包含发票的详细信息,包括文本描述字段
    • 字段命名采用"中文释义_字段名"格式

注意事项

  1. 数据格式:确保数据文件为KPMG格式的TXT文件,分隔符为 #|#
  2. 文件命名:确保文件命名符合配置中的模式(如 MM*EKKO*.TXT
  3. BUKRS字段:代码会自动将BUKRS转换为字符串类型,避免类型不匹配
  4. 缓存机制:首次运行会读取TXT文件并保存为pkl缓存,后续运行会直接使用缓存(速度更快)
  5. 数据验证:建议启用数据验证功能,检查数据完整性和匹配后数量
  6. 字段命名:所有输出字段采用"中文释义_字段名"格式,便于理解和追溯
  7. 发票数据合并:RSEG和RBKP合并时,优先保留RBKP字段,确保数据完整性

更新日志

v1.5.0 (2025-02-07)

  • 字段扩展和命名规范

    • 三单匹配结果中释放更多字段(订单、收货、发票的额外字段)
    • 所有输出字段采用"中文释义_字段名"格式
    • 清单生成支持更多字段展示
  • 发票清单优化

    • 修复发票清单字段为空的问题(优化RSEG和RBKP合并逻辑)
    • 添加更多文本描述字段
    • 优化字段冲突处理(优先保留RBKP字段)
  • 文档整理

    • 合并多个README文件为一个统一的README.md
    • 更新分类逻辑说明文档

v1.4.0 (2025-02-06)

  • 差异分析优化

    • 统计口径改为按发票金额_本币统计占比(而非按订单数量)
    • 金额差异阈值优化为0.1元(之前为0.01元)
    • 金额差异小于0.1元的归纳入"无差异"大类
  • 代码优化

    • 添加pickle缓存机制,首次读取TXT文件自动保存缓存
    • 优化文件匹配逻辑,自动排除RSEG重复文件
    • 支持发票RSEG文件的精确匹配(通过下划线数量区分)
    • 自动排除RBKP的BLOCKED文件
    • 添加数据验证和匹配后数量检查功能
  • 文档完善

    • 详细说明代码运行逻辑和字段处理
    • 添加差异分析说明和统计口径说明
    • 确保与参考代码逻辑一致

v1.3.0 (2025-02-06)

  • ✅ 添加pickle缓存机制,首次读取TXT文件自动缓存
  • ✅ 优化文件匹配逻辑,自动排除RSEG重复文件
  • ✅ 支持发票RSEG文件的精确匹配(通过下划线数量区分)
  • ✅ 自动排除RBKP的BLOCKED文件
  • ✅ 更新README,详细说明代码运行逻辑和字段处理

参考

  • 参考代码:参考/采购三单-妙可.py
  • 字段对照表:参考/字段处理代码/三单结果字段对照表.md
  • 分类逻辑说明:分类逻辑说明.md

About

Final purchase three-way matching toolkit

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages