本工具包用于匹配和分析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. 差异分析阶段
└── 对匹配结果进行差异分类和统计
-
文件匹配:
- 匹配
MM*EKKO*.TXT文件(排除*EKKO_RSEG*.TXT) - 匹配
MM*EKPO*.TXT文件(排除*EKPO_RSEG*.TXT) - 匹配
MM*EKKO_RSEG*.TXT文件(单独读取并合并) - 匹配
MM*EKPO_RSEG*.TXT文件(单独读取并合并)
- 匹配
-
缓存检查:
- 优先检查
pickle文件夹中是否有对应的.pkl缓存文件 - 如果有缓存,直接读取pkl文件(快速)
- 如果没有缓存,读取TXT文件并自动保存为pkl缓存
- 优先检查
-
数据合并:
- 合并基础文件和RSEG文件:
pd.concat([df_ekko_0, df_ekko_rseg]) - 确保
BUKRS字段为字符串类型:dtype={'BUKRS': str}
- 合并基础文件和RSEG文件:
-
数据验证(如果
ENABLE_DATA_VALIDATION = True):- 检查RBKP表的
BUKRS + BELNR是否重复 - 检查EKKO表的
BUKRS + EBELN是否重复
- 检查RBKP表的
与参考代码逻辑一致
-
数据合并:
- EKPO(订单行项目)左连接 EKKO(订单抬头)
- 合并键:
['BUKRS', 'EBELN', 'MANDT']
-
字段处理:
- 提取
记录建立日期: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→ 填充为 0BUKRS,BSART,MATNR,UEBTK→ 填充为空字符串''
- 提取
-
金额和数量计算(考虑退货调整):
订单金额_外币 = NETWR * RETPO调整系数 订单金额_本币 = NETWR * WKURS * RETPO调整系数 订单数量 = MENGE * RETPO调整系数
RETPO调整系数:RETPO = ''(空)→ 系数 = 1(正常订单)RETPO = 'X'→ 系数 = -1(退货订单,需要取反)
-
数据筛选(根据配置):
- 筛选已删除订单:
LOEKZ.isna()(只保留未删除的订单) - 筛选日期范围:
记录建立日期在指定年月范围内(如果启用) - 筛选订单类型:
BSART = ORDER_TYPE(如果启用,默认'Z001') - 筛选物料号:
MATNR != ''且MATNR < MATNR_MAX(如果启用,默认500000)
- 筛选已删除订单:
-
数据汇总:
- 使用
pivot_table按['BUKRS', 'EBELN', 'EBELP', 'BSART', 'MATNR', 'UEBTO', 'UEBTK']汇总 - 汇总字段:
订单金额_外币、订单金额_本币、订单数量 - 汇总方式:
aggfunc='sum'(求和)
- 使用
-
创建物料映射表:
- 从订单数据中提取
['MATNR', 'BUKRS', 'EBELN', 'EBELP', 'TXZ01'] - 用于后续匹配时添加物料描述
- 从订单数据中提取
-
文件匹配:
- 匹配
MM*MSEG*.TXT文件(可能多个,自动合并) - 匹配
MM*MSEG_RSEG*.TXT文件(单独读取并合并)
- 匹配
-
缓存检查:
- 优先使用pickle缓存
- 首次读取自动保存缓存
-
数据合并:
- 合并所有MSEG基础文件和MSEG_RSEG文件
与参考代码逻辑一致
-
数据筛选:
- 只保留有订单号的数据:
EBELN.notna()
- 只保留有订单号的数据:
-
字段处理:
EBELN转换为整数:EBELN.astype(int)LIFNR(供应商)转换为字符串:LIFNR = LIFNR.map(lambda x: str(int(x)) if ~np.isnan(x) else '')
-
金额和数量计算(考虑借贷标识):
入库金额 = DMBTR * SHKZG调整系数 交货成本 = BNBTR * SHKZG调整系数 交货数量 = BPMNG * SHKZG调整系数
SHKZG调整系数:SHKZG = 'S'(借方)→ 系数 = 1(正常收货)SHKZG = 'H'(贷方)→ 系数 = -1(退货,需要取反)
-
数据筛选(根据配置):
- 筛选物料号:
MATNR.notnull()且MATNR < MATNR_MAX(如果启用,默认500000)
- 筛选物料号:
-
数据汇总:
- 使用
pivot_table按['BUKRS', 'EBELN', 'EBELP']汇总 - 汇总字段:
入库金额、交货成本、交货数量 - 汇总方式:
aggfunc='sum'(求和)
- 使用
-
文件匹配:
- 匹配发票RSEG文件:
MM*RSEG_0001.TXT(只匹配文件名中只有一个下划线的文件,排除其他表的RSEG文件) - 匹配RBKP文件:
MM*RBKP*.TXT(自动排除*BLOCKED*.TXT文件)
- 匹配发票RSEG文件:
-
缓存检查:
- 优先使用pickle缓存
- 首次读取自动保存缓存
与参考代码逻辑一致
-
数据合并:
- RSEG(发票行项目)左连接 RBKP(发票抬头)
- 合并键:
['BUKRS', 'BELNR'] - 重要:使用
suffixes=('_rseg', '_rbkp')明确区分来源,优先保留RBKP字段
-
字段处理:
- 处理列名冲突:对于同时存在于RSEG和RBKP的字段,优先使用RBKP版本
- 删除冲突的RSEG字段(带
_rseg后缀),保留RBKP字段(带_rbkp后缀) - 统一字段名:去掉所有
_rbkp和_rseg后缀 - 确定日期字段:
BUDAT、BUDAT_x或BUDAT_y
-
金额和数量计算(考虑借贷标识和排除标识):
发票金额_本币 = WRBTR * KURSF * SHKZG调整系数 发票校验差异 = STOCK_POSTING * KURSF # 注意:未调整借贷方向 发票数量 = MENGE * SHKZG调整系数 * EXKBE排除系数
SHKZG调整系数:SHKZG = 'S'(借方)→ 系数 = 1(正常发票)SHKZG = 'H'(贷方)→ 系数 = -1(贷项凭证,需要取反)
EXKBE排除系数:EXKBE = ''(空)→ 系数 = 0(排除,不计算数量)EXKBE = 'X'→ 系数 = 1(包含,计算数量)
- 重要:
发票校验差异只乘以汇率,不调整借贷方向(与参考代码一致)
-
数据筛选(根据配置):
- 筛选物料号:
MATNR.notnull()且MATNR < MATNR_MAX(如果启用,默认500000) - 筛选日期范围:
BUDAT在指定年月范围内(如果启用) - 筛选关键字段:
BUKRS、EBELN、EBELP非空(如果启用)
- 筛选物料号:
-
数据汇总:
- 如果
BUKRS有有效值:按['BUKRS', 'EBELN', 'EBELP']汇总 - 如果
BUKRS全部为空:按['EBELN', 'EBELP']汇总,并添加空的BUKRS列 - 汇总字段:
发票金额_本币、发票校验差异、发票数量 - 汇总方式:
aggfunc='sum'(求和)
- 如果
与参考代码逻辑一致
-
确定匹配键(动态匹配键):
- 检查发票的
BUKRS字段是否有有效值(非空且非空字符串) - 如果有:使用
['BUKRS', 'EBELN', 'EBELP']作为匹配键 - 如果没有:使用
['EBELN', 'EBELP']作为匹配键
- 检查发票的
-
数据匹配:
- 记录匹配前的发票数量:
num_test = len(pivot_invoice) - 以发票汇总表为基础(
pivot_invoice) - 左连接收货汇总表(
pivot_mseg) - 左连接订单汇总表(
pivot_order)
- 记录匹配前的发票数量:
-
匹配后数量检查:
- 如果
ENABLE_MATCH_COUNT_CHECK = True:- 检查匹配后数量是否等于匹配前数量:
len(df_join) == num_test - 如果不一致,给出警告
- 检查匹配后数量是否等于匹配前数量:
- 如果
-
筛选订单类型:
- 如果启用筛选:
df_join = df_join[df_join['BSART'] == ORDER_TYPE] - 默认筛选
BSART == 'Z001'
- 如果启用筛选:
-
添加物料描述:
- 从
matnr_mapper合并TXZ01(物料描述)
- 从
-
合并额外字段:
- 从订单数据合并:
记录建立日期、供应商_订单、订单单位、汇率 - 从收货数据合并:
供应商_收货、收货日期、收货过账日期、交货数量_参考单位_MEINS、交货数量_参考单位_ERFME - 从发票数据合并:
发票号、发票过账日期、供应商_发票、发票行项目文本、发票数量单位、发票数量_参考单位_BSTME
- 从订单数据合并:
-
填充空值:
- 以下字段填充为0并四舍五入到2位小数:
发票数量,发票校验差异,发票金额_本币交货成本,交货数量,入库金额订单数量,订单金额_本币
- 以下字段填充为0并四舍五入到2位小数:
-
计算差异字段:
# 基础金额字段 订单-金额 = 订单金额_本币 入库单-金额 = 入库金额 - 交货成本 发票-金额 = 发票金额_本币 - 发票校验差异 - 交货成本 # 金额差异 订单-入库单金额差异 = 订单-金额 - 入库单-金额 订单-发票金额差异 = 订单-金额 - 发票-金额 入库单-发票金额差异 = 入库单-金额 - 发票-金额 # 数量差异 订单-交货数量差异 = 订单数量 - 交货数量 订单-发票数量差异 = 订单数量 - 发票数量 入库单-发票数量差异 = 交货数量 - 发票数量
-
字段重命名:
- 所有输出字段采用"中文释义_字段名"格式(如:
公司代码_BUKRS、订单金额_本币_计算) - 确保字段名称清晰易懂
- 所有输出字段采用"中文释义_字段名"格式(如:
-
导出匹配结果(有发票的单据):
- 文件名:
采购三单匹配结果_YYYY_M-M月_XXX.xlsx - 包含所有匹配数据和差异字段
- 文件名:
-
导出未测试单据(无发票的单据):
- 文件名:
采购三单匹配结果_未测试单据_YYYY_M-M月_XXX.xlsx - 分类导出(3个Sheet):
- Sheet1: 其他未测试1 - 有订单和收货,但无发票
- Sheet2: 其他未测试2 - 只有订单,无收货和发票
- Sheet3: 其他未测试3 - 只有收货,无订单和发票
- 文件名:
-
读取匹配结果:
- 自动查找最新的匹配结果文件(排除"未测试单据"和"差异分析"文件)
-
应用分类逻辑:
-
四个大类分类:
- 无差异:金额差异 < 0.1元 且 数量差异 < 0.01
- 金额差异:金额差异 ≥ 0.1元 且 数量差异 < 0.01
- 数量差异:金额差异 < 0.1元 且 数量差异 ≥ 0.01
- 均有差异:金额差异 ≥ 0.1元 且 数量差异 ≥ 0.01
-
金额差异细分:
- 尾差(<1):金额差异 < 1元
- 汇率导致尾差:存在汇率差异(暂未实现)
- 交货成本导致差异:存在交货成本
-
均有差异细分:
- 未完全交货:订单数量 > 交货数量 且 交货数量 = 发票数量
- 过量交货:订单数量 < 交货数量 且 交货数量 = 发票数量
- 未完全开票:订单数量 = 交货数量 且 交货数量 < 发票数量
- 预制发票:订单数量 > 交货数量,发票数量 > 交货数量,且订单数量 = 发票数量
- 其他:不符合上述类型的其他情况
-
-
统计口径:
- 按发票金额_本币统计占比(而非按订单数量)
- 占比 = 分类发票金额_本币 / 总发票金额_本币 × 100%
- 同时显示记录数和金额
-
输出结果:
- 文件名:
采购三单匹配结果_差异分析_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
这种命名方式使得:
- 字段含义清晰明了(中文释义)
- 便于追溯字段来源(原始字段名)
- 区分计算字段和原始字段(
_计算后缀)
-
EKKO文件(采购订单抬头)
- 基础文件:
MM*EKKO*.TXT(排除RSEG文件) - RSEG文件:
MM*EKKO_RSEG*.TXT - 匹配模式: 自动排除重复的RSEG文件
- 基础文件:
-
EKPO文件(采购订单行项目)
- 基础文件:
MM*EKPO*.TXT(排除RSEG文件) - RSEG文件:
MM*EKPO_RSEG*.TXT - 匹配模式: 自动排除重复的RSEG文件
- 基础文件:
-
MSEG文件(收货单)
- 基础文件:
MM*MSEG*.TXT(可能多个,自动合并) - RSEG文件:
MM*MSEG_RSEG*.TXT - 匹配模式: 自动合并所有匹配的文件
- 基础文件:
-
RSEG文件(发票行项目)
- 发票RSEG文件:
MM*RSEG_0001.TXT(只匹配发票RSEG,排除其他表的RSEG文件) - 匹配模式: 通过下划线数量区分(发票RSEG只有一个下划线)
- 发票RSEG文件:
-
RBKP文件(发票抬头)
- 基础文件:
MM*RBKP*.TXT - BLOCKED文件:
MM*RBKP_BLOCKED*.TXT(已自动排除) - 匹配模式: 自动排除BLOCKED文件
- 基础文件:
- 格式:
MM2501T12表名_编号.TXT - 示例:
MM2501T12EKKO_0001.TXT - RSEG文件:
MM2501T12表名_RSEG_0001.TXT或MM2501T12RSEG_0001.TXT
MM*EKKO*.TXT- 匹配所有EKKO文件(代码中会排除RSEG文件)MM*EKKO_RSEG*.TXT- 专门匹配EKKO的RSEG文件MM*RSEG_0001.TXT- 匹配发票RSEG文件(代码中会进一步过滤)
-
RSEG文件区分:
- 发票RSEG文件:
MM2501T12RSEG_0001.TXT(只有一个下划线) - 其他表RSEG文件:
MM2501T12表名_RSEG_0001.TXT(两个下划线) - 代码已自动区分并只读取发票RSEG文件
- 发票RSEG文件:
-
BLOCKED文件:
MM2501T12RBKP_BLOCKED_0001.TXT已自动排除- 这是已阻止的发票,不应包含在正常匹配中
-
MSEG文件分片:
- MSEG文件可能被分成多个文件(如0001_001到0002_002)
- 代码会自动合并所有匹配的MSEG文件
- Python 3.7+
- 必需库:
pip install pandas numpy openpyxl chardet
编辑 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 = Truepython purchase_three_match.pypython difference_analysis.pypython three_lists.pyPurchaseThreeMatchToolkit/
├── 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- 包含发票的详细信息,包括文本描述字段
- 字段命名采用"中文释义_字段名"格式
- 数据格式:确保数据文件为KPMG格式的TXT文件,分隔符为
#|# - 文件命名:确保文件命名符合配置中的模式(如
MM*EKKO*.TXT) - BUKRS字段:代码会自动将BUKRS转换为字符串类型,避免类型不匹配
- 缓存机制:首次运行会读取TXT文件并保存为pkl缓存,后续运行会直接使用缓存(速度更快)
- 数据验证:建议启用数据验证功能,检查数据完整性和匹配后数量
- 字段命名:所有输出字段采用"中文释义_字段名"格式,便于理解和追溯
- 发票数据合并:RSEG和RBKP合并时,优先保留RBKP字段,确保数据完整性
-
✅ 字段扩展和命名规范:
- 三单匹配结果中释放更多字段(订单、收货、发票的额外字段)
- 所有输出字段采用"中文释义_字段名"格式
- 清单生成支持更多字段展示
-
✅ 发票清单优化:
- 修复发票清单字段为空的问题(优化RSEG和RBKP合并逻辑)
- 添加更多文本描述字段
- 优化字段冲突处理(优先保留RBKP字段)
-
✅ 文档整理:
- 合并多个README文件为一个统一的README.md
- 更新分类逻辑说明文档
-
✅ 差异分析优化:
- 统计口径改为按发票金额_本币统计占比(而非按订单数量)
- 金额差异阈值优化为0.1元(之前为0.01元)
- 金额差异小于0.1元的归纳入"无差异"大类
-
✅ 代码优化:
- 添加pickle缓存机制,首次读取TXT文件自动保存缓存
- 优化文件匹配逻辑,自动排除RSEG重复文件
- 支持发票RSEG文件的精确匹配(通过下划线数量区分)
- 自动排除RBKP的BLOCKED文件
- 添加数据验证和匹配后数量检查功能
-
✅ 文档完善:
- 详细说明代码运行逻辑和字段处理
- 添加差异分析说明和统计口径说明
- 确保与参考代码逻辑一致
- ✅ 添加pickle缓存机制,首次读取TXT文件自动缓存
- ✅ 优化文件匹配逻辑,自动排除RSEG重复文件
- ✅ 支持发票RSEG文件的精确匹配(通过下划线数量区分)
- ✅ 自动排除RBKP的BLOCKED文件
- ✅ 更新README,详细说明代码运行逻辑和字段处理
- 参考代码:
参考/采购三单-妙可.py - 字段对照表:
参考/字段处理代码/三单结果字段对照表.md - 分类逻辑说明:
分类逻辑说明.md