合格证清单表 → SalePlan 模型 字段映射分析¶
一、数据来源¶
文件:
temp/excel/202603合格证清单表.xlsx工作表:
合格证_2026总行数: 2516(含表头)
表头行: 第1行
总列数: 150
二、需要排除的行¶
以下关键词匹配的行将被跳过(共约845行):
小计、合计- 汇总行年度计划- 标题/说明行查询无重复编号- 辅助信息行最后刷新时间- 元数据行自产执行状态、未发货- 状态标签行蓝字代表、黄色代表、蓝色代表- 图例行是否发货重点- 说明行
有效数据行: 1670 行
三、动态列检测结果¶
通过检查1670条有效数据行,共有 87 列有数据,63 列完全为空。
3.1 核心数据区(前43列)¶
Excel列号 |
Excel表头 |
有效示例值 |
说明 |
是否导入模型 |
|---|---|---|---|---|
1 |
订货日期 |
2025-11-28 00:00:00 |
合格证清单的订货日期(datetime) |
✅ 导入 plan_date(备选,列33更精确优先) |
2 |
订货单位 |
湖北海岸山科技有限公司 |
合格证清单的客户名称 |
✅ 导入 customer(备选,列34更精确优先) |
3 |
产品名称 |
减压阀 |
合格证实际打印的产品名称,与销售计划导出名称可能不一致 |
✅ 导入 cert_product_name(合格证打印版) |
4 |
产品型号 |
ZJHP-40P |
合格证实际打印的产品型号,与销售计划导出型号可能不一致 |
✅ 导入 cert_product_model(合格证打印版) |
5 |
产品规格 |
DN25 |
合格证实际打印的规格,与销售计划导出规格可能不一致 |
✅ 导入 cert_product_spec(合格证打印版) |
6 |
数量 |
1 |
需要打印的合格证数量(int) |
✅ 导入 quantity |
7 |
产品编号 |
V2512115Y-115Y |
出厂产品编号,编号规则:V+YYMM+流水号+产品类型后缀,有起止编号区间 |
✅ 导入 product_code |
8 |
工作温度℃ |
100 |
合格证打印的温度,打印后从模板回填 |
❌ 不入模型,仅回填到certificate_remarks |
9 |
发证日期 |
2026-02-02 14:55:13 |
合格证逐个打印完毕后最后一台的时间,回填到excel |
❌ 不入模型,可存certificate_remarks |
10 |
生产令号 |
编号:027 |
这是同一订单在销售计划中的原始顺序号,不是生产令号。真正的生产令号在列71(子项目) |
✅ 导入 production_order_no(作为顺序追踪号) |
11 |
供货商 |
★外购 |
供货方式:生产(无后缀)、外购(Y)、维修类(XL)、供应(G) |
✅ 导入 supply_type(需解析前缀) |
12 |
备注 |
(长文本) |
合格证历史记录+备注 |
❌ 不入模型,存certificate_remarks |
13 |
装配试压人员/是否已发货 |
2026 2月 已发货 |
发货状态,可通过超链接查询最后出现的销售计划表,根据字体色/背景色判断是否发货 |
✅ 导入 execution_status(需解析) |
14 |
工作介质 |
水等 |
合格证打印后从模板回填 |
❌ 不入模型,存certificate_remarks |
15 |
试压标准 |
GB/T 4213-2008 |
试压标准号,打印后从模板回填 |
✅ 导入 test_standard |
16 |
技术要求 |
(长文本) |
多字段拼接的复合文本(含设备位号/子项目/产品编号/种类/重量等),用于方便查看,实际导入意义不大 |
❌ 不导入,各字段已单独录入 |
17 |
备注 |
(空) |
从销售计划读取的原始备注 |
❌ 不导入(通常为空) |
18 |
营销部要货计划单号 |
202511_No0260 |
格式为YYYYMM_No+四位计划单号,销售模型中仅存YYMM_四位计划单号 |
✅ 导入 plan_no(需去掉前缀年份和No) |
19 |
试压报告超链接存放地址列1 |
(文件路径) |
超链接地址 |
❌ 不导入 |
20 |
试压报告超链接存放地址列2 |
(文件路径) |
超链接地址 |
❌ 不导入 |
21 |
质保书超链接存放地址列1 |
(文件路径) |
超链接地址 |
❌ 不导入 |
23 |
质保书超链接存放地址列3 |
(文件路径) |
超链接地址 |
❌ 不导入 |
24 |
销售计划行号 |
3136 |
销售计划的原始行号(int) |
✅ 导入 sale_plan_row(辅助追踪) |
25 |
是否发货重点 |
(空) |
标记列 |
❌ 不导入(通常为空) |
26 |
黄色代表外购 |
自产 |
自产/外购标记 |
✅ 辅助判断 supply_type |
27 |
蓝色代表已回 |
(空) |
外购返回标记 |
❌ 不导入(通常为空) |
28 |
蓝字代表已发 |
已发货 |
基本可认定是否发货 |
✅ 辅助判断 execution_status |
29 |
导入时间 |
最后刷新时间:2026-02-11 |
数据刷新时间 |
❌ 不导入(元数据) |
30 |
项目名称 |
105所核电项目 |
项目名称 |
✅ 导入 project_name |
31 |
项目单位 |
(空) |
项目单位 |
✅ 导入 project_unit |
32 |
种类 |
(空) |
种类 |
✅ 导入 category |
33 |
订货日期(重复) |
2025-11-28 |
销售计划导出的原始数据备份-订货日期,数据更精确 |
✅ 导入 plan_date(优先于列1) |
34 |
订 货 单 位(重复) |
湖北海岸山科技有限公司 |
销售计划导出的原始数据备份-订货单位,数据更精确 |
✅ 导入 customer(优先于列2) |
35 |
产品名称(重复) |
减压阀 |
销售计划导出的原始数据备份-产品名称,合同原始值 |
✅ 导入 product_name(合同原始版) |
36 |
产 品 型 号(重复) |
ZJHP-40P |
销售计划导出的原始数据备份-产品型号,合同原始值 |
✅ 导入 product_model(合同原始版) |
37 |
规格(重复) |
DN25 |
销售计划导出的原始数据备份-规格,合同原始值 |
✅ 导入 product_spec(合同原始版) |
38 |
数量(重复) |
1900-01-01(错误日期) |
销售计划导出的原始数据备份-数量,格式异常(数值被错误读为日期) |
❌ 不导入(列6已获取,且格式异常) |
39 |
外购产品移交单开单日期 |
(空) |
外购相关 |
❌ 不导入(多为空白) |
40 |
外购产品移交单号 |
(空) |
外购相关 |
❌ 不导入(多为空白) |
41 |
计划交货期 |
2025-12-30 |
计划交货日期 |
✅ 导入 planned_delivery_date |
43 |
合同号 |
HAS-CG-20251102 |
合同号 |
✅ 导入 contract_no |
3.2 后续有数据列(44-149列)¶
Excel列号 |
Excel表头 |
有效示例值 |
说明 |
是否导入模型 |
|---|---|---|---|---|
44 |
跟单表入库日期 |
(空) |
跟单相关 |
❌ 不导入(多为空白) |
45 |
A045 |
(空) |
无效列 |
❌ 不导入 |
47 |
ID_Row |
2 |
行ID |
❌ 不导入 |
48 |
产品名称 |
V2512115Y-115Y |
另一个产品编号(表头命名有误) |
❌ 不导入 |
49 |
产品型号3 |
(空) |
第三版产品型号 |
❌ 不导入 |
50 |
产品规格(mm) |
1900-03-20(错误日期) |
规格,数值被错误读取为日期格式 |
❌ 不导入 |
53 |
阀体材质 |
【未填写材质】 |
材质信息,用于制作质保书时读取零件材料牌号 |
❌ 不导入(多为未填写) |
54 |
阀杆材质 |
【未填写材质】 |
材质信息,用于制作质保书时读取零件材料牌号 |
❌ 不导入(多为未填写) |
55 |
启闭件材质 |
【未填写材质】 |
材质信息,用于制作质保书时读取零件材料牌号 |
❌ 不导入(多为未填写) |
63 |
手轮 |
(日志记录) |
操作日志 |
❌ 不导入 |
66 |
产品位号@销售计划 |
_编号:0007 |
产品位号 |
❌ 不导入(有列70设备位号) |
67 |
业务归口@销售计划 |
夏磊 |
业务归口(人员名) |
✅ 导入 business_dept |
69 |
技术要求 |
接管:¢114*16 |
未拼接的原始技术要求纯文本 |
✅ 导入 tech_requirements(优先使用此列) |
70 |
设备位号 |
【空白】 |
计划日期≥2025-01-01时记录的是销售订单号 |
✅ 导入 equipment_code(注意语义变化) |
71 |
子项目 |
【空白】 |
计划日期≥2025-01-01时记录的是真正的生产令号 |
✅ 导入 production_order_no(覆盖列10的值) |
72 |
产品编号 |
_编号:0007 |
初次导入时用种类+序号拼接的产品编号 |
❌ 不导入(列7已有) |
73 |
种类 |
【空白】 |
销售计划的种类:不计价、来料修复等 |
✅ 导入 category(备选) |
74 |
重量 |
序号:0010_0010 |
按批次给每台产品的序号,考虑了台数 |
✅ 导入 weight(需解析数字) |
75 |
序号 |
编号:007 |
每行的序号,不考虑数量字段台数 |
❌ 不导入 |
76-86 |
subaddress/screentip/... |
(超链接相关) |
超链接元数据 |
❌ 不导入 |
95 |
修改后的自动编号为:备注 |
(空) |
备注 |
❌ 不导入 |
96 |
A096 |
(复合信息串) |
销售信息某些字段的原始拼接字符串,曾用于回查销售计划表 |
❌ 不导入(可后期拼接) |
97-105 |
A097~A105 |
(散列数据) |
散列数据 |
❌ 不导入 |
118 |
A118 |
(空) |
未知 |
❌ 不导入 |
120 |
A120 |
A26R00002 |
编号 |
❌ 不导入 |
121 |
A121 |
(空) |
未知 |
❌ 不导入 |
123-124 |
A123~A124 |
(空) |
未知 |
❌ 不导入 |
149 |
装配试压人员/是否已发货(重复) |
(空) |
重复列 |
❌ 不导入 |
四、Excel列 → SalePlan模型字段 最终映射¶
4.1 直接映射¶
Excel列号 |
Excel表头 |
SalePlan模型字段 |
优先级 |
说明 |
|---|---|---|---|---|
1 |
订货日期 |
plan_date |
1 |
合格证清单的订货日期(备选,列33优先) |
2 |
订货单位 |
customer |
1 |
合格证清单的客户名称(备选,列34优先) |
3 |
产品名称 |
cert_product_name |
0 |
合格证实际打印版(可能与销售计划不一致) |
4 |
产品型号 |
cert_product_model |
0 |
合格证实际打印版(NOT NULL,跳过空值行) |
5 |
产品规格 |
cert_product_spec |
0 |
合格证实际打印版 |
6 |
数量 |
quantity |
0 |
需打印的合格证数量 |
7 |
产品编号 |
product_code |
0 |
出厂产品编号(V+YYMM+流水号+后缀) |
15 |
试压标准 |
test_standard |
0 |
合格证打印后回填 |
18 |
营销部要货计划单号 |
plan_no |
1 |
需解析:去掉前两位年份和"No" |
24 |
销售计划行号 |
sale_plan_row |
2 |
辅助追踪字段 |
30 |
项目名称 |
project_name |
0 |
项目名称 |
31 |
项目单位 |
project_unit |
1 |
项目单位 |
32 |
种类 |
category |
0 |
种类(首选) |
33 |
订货日期(重复) |
plan_date |
-1 |
销售计划原始数据,数据更精确,优先于列1 |
34 |
订 货 单 位(重复) |
customer |
-1 |
销售计划原始数据,数据更精确,优先于列2 |
35 |
产品名称(重复) |
product_name |
0 |
销售计划原始产品名称(合同原始版) |
36 |
产 品 型 号(重复) |
product_model |
0 |
销售计划原始产品型号(合同原始版) |
37 |
规格(重复) |
product_spec |
0 |
销售计划原始规格(合同原始版) |
41 |
计划交货期 |
planned_delivery_date |
0 |
计划交货日期 |
43 |
合同号 |
contract_no |
0 |
合同号 |
67 |
业务归口@销售计划 |
business_dept |
1 |
业务归口人员 |
69 |
技术要求(纯文本) |
tech_requirements |
0 |
优先使用此列的纯文本技术要求 |
70 |
设备位号 |
equipment_code |
0 |
2025年后记录的是销售订单号 |
73 |
种类 |
category |
2 |
种类(备选,列32优先) |
74 |
重量 |
weight |
1 |
需解析数字 |
4.2 需要特殊处理/条件覆盖的映射¶
Excel列号 |
Excel表头 |
处理方式 |
目标字段 |
说明 |
|---|---|---|---|---|
10 |
生产令号 |
直接映射为追踪号 |
production_order_no |
这是销售计划原始顺序号,不是真正的生产令号 |
71 |
子项目 |
覆盖列10的值 |
production_order_no |
真正的生产令号(2025年后有效) |
11 |
供货商 |
解析前缀映射 |
supply_type |
★外购→外购, ★待图生产→待图生产, ★自产→自产 |
26 |
黄色代表外购 |
辅助判断 |
supply_type |
当列11无有效值时使用 |
13 |
装配试压人员/是否已发货 |
解析状态 |
execution_status |
提取"已发货"/"未发货" |
28 |
蓝字代表已发 |
辅助判断 |
execution_status |
当列13无有效值时使用 |
8 |
工作温度℃ |
合并到备注 |
certificate_remarks |
格式:"工作温度: {值}℃" |
14 |
工作介质 |
合并到备注 |
certificate_remarks |
格式:"工作介质: {值}" |
9 |
发证日期 |
合并到备注 |
certificate_remarks |
格式:"发证日期: {值}" |
12 |
备注 |
合并到备注 |
certificate_remarks |
格式:"备注: {值}" |
4.3 不导入的列分类¶
类别 |
列号 |
原因 |
|---|---|---|
超链接地址 |
19, 20, 21, 23 |
文件路径超链接 |
超链接元数据 |
76-86 |
subaddress/screentip等 |
重复列(销售计划备份,格式异常) |
38 |
数量被错误读为日期格式 |
备用备注 |
17 |
通常为空 |
复合文本拼接 |
16 |
多字段拼接文本,各字段已单独录入 |
辅助标记(常空) |
25, 27, 39, 40 |
多为空白 |
元数据 |
29, 47 |
导入时间、行ID |
内部ID/重复信息 |
48, 49, 50 |
命名有误或格式异常 |
材质(未填写) |
53, 54, 55 |
多为"【未填写材质】" |
操作日志 |
63 |
手轮操作记录 |
产品位号 |
66 |
有列70设备位号 |
拼接产品编号 |
72 |
列7已有正式产品编号 |
序号(不考虑台数) |
75 |
仅行序号 |
散列/辅助数据 |
95, 96, 97-105, 118, 120, 121, 123-124 |
复合信息串或散列数据 |
重复列 |
149 |
与列13相同 |
无效/空列 |
44, 45, 其余未列出的空列 |
无有效数据 |
五、小计行排除策略¶
小计行的特征:
前几列中某个单元格包含"小计"文字
大部分列(除了汇总列)为空
产品型号(第4列)通常为空或为特殊值
排除方法:在读取数据后,按以下规则过滤:
扫描每行前5列,如果任一列包含"小计"/"合计"关键词,跳过该行
同时跳过包含"查询无重复编号"/"最后刷新时间"/"年度计划"等关键词的行
同时跳过产品型号(第4列)为空的行
六、建议的白名单列¶
基于以上分析,以下是导入 SalePlan 模型时应读取的 Excel 列:
# 直接映射列(列号 → 模型字段)
CERT_LIST_COLUMN_MAPPING = {
1: "plan_date", # 订货日期
2: "customer", # 订货单位
3: "product_name", # 产品名称(合格证打印版)
4: "product_model", # 产品型号(合格证打印版,NOT NULL)
5: "product_spec", # 产品规格(合格证打印版)
6: "quantity", # 数量
7: "product_code", # 产品编号
10: "production_order_no", # 销售计划原始顺序号(列71会覆盖)
15: "test_standard", # 试压标准
18: "plan_no", # 营销部要货计划单号(需解析)
24: "sale_plan_row", # 销售计划行号(辅助)
30: "project_name", # 项目名称
31: "project_unit", # 项目单位
32: "category", # 种类(首选)
41: "planned_delivery_date", # 计划交货期
43: "contract_no", # 合同号
67: "business_dept", # 业务归口
69: "tech_requirements", # 技术要求(纯文本,优先使用)
70: "equipment_code", # 设备位号(2025年后为销售订单号)
73: "category_alt", # 种类(备选)
74: "weight_raw", # 重量(需解析数字)
}
# 特殊处理列(需要解析/合并到备注或辅助字段)
SPECIAL_COLUMNS = {
8: "working_temp", # 工作温度 → certificate_remarks
9: "cert_issue_date", # 发证日期 → certificate_remarks
11: "supply_source", # 供货商 → supply_type(解析前缀)
12: "cert_remarks_raw", # 备注 → certificate_remarks
13: "execution_status_raw", # 装配试压人员/是否已发货 → execution_status
14: "working_medium", # 工作介质 → certificate_remarks
26: "supply_type_indicator", # 黄色代表外购 → supply_type(备选)
28: "execution_status_indicator", # 蓝字代表已发 → execution_status(备选)
71: "true_production_order_no", # 真正的生产令号 → 覆盖 production_order_no
}
关键处理逻辑¶
两组产品字段区分:
列3-5(合格证实际打印版)→
cert_product_name/model/spec列35-37(销售计划原始值备份)→
product_name/model/specSalePlan模型使用逻辑:优先取
cert_product_*,为空则回退到product_*
plan_date/customer 优先级:列33-34(销售计划备份,数据更精确)> 列1-2
production_order_no 覆盖:先取列10的值,如果列71有值则覆盖
supply_type 解析:列11优先,解析★前缀;列26备选,"自产"/"外购"
execution_status 解析:列13优先,提取"已发货"/"未发货";列28备选
certificate_remarks 拼接:合并列8(工作温度)、列14(工作介质)、列9(发证日期)、列12(备注)
plan_no 解析:从"202511_No0260"提取"2511_0260"
category 优先级:列32 > 列73
tech_requirements 优先级:列69(纯文本) > 列16(复合文本)
七、与 SalesPlan 导入脚本的关系¶
import_sales_plan.py 从销售计划Excel导入数据,而 import_cert_list.py 从合格证清单导入数据。两者的区别:
方面 |
销售计划导入 |
合格证清单导入 |
|---|---|---|
数据来源 |
销售计划工作簿 |
合格证清单表 |
产品名称/型号/规格 |
销售计划原始版 → |
列35-37(销售计划备份)→ |
产品编号 |
无(由编号规则生成) |
已分配的出厂编号 |
生产令号 |
原始值 |
列10=顺序号, 列71=真实生产令号 |
设备位号 |
原始值 |
2025年后实际存的是销售订单号 |
合格证信息 |
无 |
工作温度/介质/发证日期/备注等 |
发货状态 |
可能有 |
装配试压人员/是否已发货列 |