<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[26Obsidian]]></title><description><![CDATA[Obsidian 数字花园]]></description><link>http://github.com/dylang/node-rss</link><image><url>site-lib/media/favicon.png</url><title>26Obsidian</title><link></link></image><generator>Webpage HTML Export plugin for Obsidian</generator><lastBuildDate>Sun, 12 Apr 2026 11:40:34 GMT</lastBuildDate><atom:link href="site-lib/rss.xml" rel="self" type="application/rss+xml"/><pubDate>Sun, 12 Apr 2026 11:40:32 GMT</pubDate><ttl>60</ttl><dc:creator></dc:creator><item><title><![CDATA[PRD｜采购数字化-子码选型模块-自动选型逻辑说明]]></title><description><![CDATA[
自动选型按单张选型单执行，资源池在同一张选型单内共享。
自动选型只处理逻辑本身，前置校验、交互展示、接口同步等已由其他模块承接，本文不展开。
资源瓶颈限制是方案必须满足的约束：任一已选方案导致任一限制物料累计数量超限，即该方案不可选。
呆料积压限制仅作为子码排序优先级，不构成报错条件，也不存在“必须消化”“必须命中”的硬性要求。
A类顶码（机型独配顶码）无需校验子码可用条件，因为只有一个子码，怎么都要排产；但若存在资源限制，仍需校验资源是否满足。
**B类顶码（非机型独配且存在可用子码）仅允许“当前可用子码集合”参与自动选型。
任一 A 类顶码因资源限制无法分配，或任一 B 类顶码轮询全部可用子码后仍无法满足资源限制时，整张选型单直接报错终止。
在相同输入、相同约束、相同主数据前提下，自动选型结果应保持一致。 事实独配定义调整
顶码分类调整，加入异常无子码不参与运算逻辑
有效子码判断逻辑调整
统一顶码分类表述
增加子码排序逻辑
呆料积压无需考虑限制数量，改为考虑优先级
自动计算逻辑调整，优化整合
加入计算日志展示
报错内容整合
仅适用于非机型独配顶码。满足以下全部条件的子码，才视为可用子码：
子码信号代码有效：信号代码均为 NULL；
子码关联的内外机信号代码有效：信号代码均为 NULL；
子码关联的内外机量产状态有效：值均为 01 或 02；
子码关联的内外机质量状态有效：值均不为 01 或 03。 明确口径：A类顶码无需考虑上述可用子码判定规则。
顶码展开后，子码数量 = 1，即一个顶码只有一个子码。事实独配是指：对于B类顶码(可用非机型独配顶码)，在某一限制类型下，针对用户填写的候选物料集合，在该顶码的当前可用子码集合中，至少存在 1 个候选物料被所有可用子码共同命中，则认定该顶码对该物料构成事实独配。
当用户填写物料数量 = 1 时，若该物料被该顶码全部可用子码共同命中，则构成事实独配；
当用户填写物料数量 &gt;= 2 时，若其中任意一个物料被该顶码全部可用子码共同命中，则构成事实独配；
事实独配需明确落到具体物料值；
事实独配需按限制类型分别判断。
示例：
用户配置压缩机限制为 A、B、C。
某顶码 KH30001 的 3 个可用子码对应压缩机分别为 A、AB、AC。
由于 A 被全部子码共同命中，因此 KH30001 对压缩机 A 构成事实独配。当前至少支持以下 7 类核心选型依据物料：
压缩机 风机 压机 主芯片 主板 显示板 遥控器 用户填写：物料类型 + 物料编码 + 限制数量。规则定义：
自动选型生成的整体方案，不允许超出任一资源限制；
只要某候选子码导致任一限制物料累计数量超上限，即该子码不可选；
多个资源限制并存时，必须同时满足；
资源在同一张选型单内共享，需边分配边扣减。
用户填写：物料类型 + 物料编码 + 限制优先级。规则定义：
呆料仅作为子码排序优先级使用；
优先级数字越小，优先级越高；
命中更多呆料、命中更高优先级呆料的子码，在排序中优先；
未命中呆料不报错，系统继续按既定轮询规则分配。
为兼容后续 BOM 单台消耗量不为 1 的场景，统一采用以下计算方式：
资源占用数量 = 需求数量 × 单台 BOM 中该资源物料消耗量
呆料命中数量 = 需求数量 × 单台 BOM 中该呆料物料消耗量
当前版本默认单台 BOM 中该物料消耗量为 1；后续若接入非 1 的消耗量，仍按上述统一公式计算，无需改动主流程。系统支持单据绑定成本。成本字段本质上是成本偏差金额，例如：0、0.1、0.22、0.4。规则定义：
数值越小，成本越优；
0 表示成本最优，至少会有一个0；
同一顶码下，系统会基于成本偏差金额生成成本排序值： 成本最优：排序值 = 0；
次优：排序值 = 1；
以此类推； 若某子码未匹配到成本，则展示为未维护。
A类顶码直接将需求量分配至唯一子码。处理要求：
不校验子码可用条件；
若存在资源限制，则先校验该唯一子码分配后是否超出限制；
若超出限制，整张选型单直接报错终止。 无资源限制时，成本直接参与子码排序；
有资源限制时，成本在“资源满足”的前提下参与子码排序；
若子码未维护成本，则排在已维护成本的子码之后；
若候选子码均未维护成本，则按子码末尾排序值进行排序。
按顶码内置排序（数据库 ID）升序处理。按以下优先顺序处理：
事实独配物料数量：从大到小，大值优先；
顶码可用子码中的最小成本偏差金额：从小到大，小值优先；若顶码全部可用子码均未维护成本，则排在已维护成本的顶码之后；
顶码需求总量：从大到小，大值优先；
顶码内置排序：数据库 ID 升序。 说明：第 2 条的比较口径是“顶码下全部可用子码中，最优那个子码对应的最小成本偏差金额”，不是顶码人工展示时的成本排序值。
排序示例：最终排序：A &gt; B &gt; C &gt; D
A &gt; B：A 事实独配数量（2）&gt; B（1）
B &gt; C/D：B 有事实独配，C/D 无
C &gt; D：C 最小成本差额（0.01）&lt; D（0.2）
对单个顶码下的候选子码，按以下优先顺序排序：
命中的呆料数量：从多到少；
命中的高优先级呆料数量：从多到少，且优先级数字越小越优先；
成本排序值：从小到大，小值优先；未维护成本排在已维护成本之后；
子码末尾排序：大值优先。 说明：在无呆料限制场景下，第 1、2 条自然不生效，子码实际按成本排序值和子码末尾排序处理。
为确保同一输入下自动选型结果始终一致，系统必须满足以下稳定性原则：
顶码排序与子码排序都必须采用固定且完整的优先级链路；
当前排序维度相同的情况下，必须继续比较下一个优先级维度，直到得出唯一顺序；
若前置排序维度全部相同，则必须落到最终兜底字段；
顶码排序的最终兜底字段为：顶码内置排序（数据库 ID）升序；
子码排序的最终兜底字段为：子码末尾排序值从大到小；
实现层不得省略任一排序维度或兜底字段，否则视为不满足稳定性原则。 说明：稳定性原则的目标，是确保在相同输入、相同约束、相同主数据前提下，自动选型结果可重复、可验证、可复盘。
当场景中存在资源限制时，B类顶码(可用非机型独配顶码) 按“子码排序规则”得到排序列表后，按照列表顺序逐个尝试。系统在轮询某个候选子码时，首先执行预分配判断。预分配阶段只做“是否超限”的判断。只有当候选子码通过预分配校验后，系统才正式确认该子码为当前顶码的选型结果，并立即同步扣减当前选型单内共享资源池的剩余量。若当前顶码属于事实独配顶码，且当前候选子码预分配后已无法满足资源限制，则说明该顶码在当前限制条件下不存在可绕开的资源路径，此时系统不再继续尝试其他候选，直接整单报错终止。若当前顶码不属于事实独配顶码，则当某个候选子码预分配超限时，系统跳过当前子码，继续按既定排序尝试下一个候选子码，直到找到可分配子码或全部候选尝试结束。当以下两种情况之一发生时，当前顶码轮询结束：
已找到满足资源限制的候选子码，并完成正式分配；
全部可用子码均尝试完成，仍无可行方案，则整张选型单直接报错终止。 未配置任何呆料限制；
未配置任何资源限制。
本场景下，系统按统一顶码分类规则对选型单内顶码进行分类：
A类：机型独配顶码；
B类：非机型独配顶码，按可用条件过滤后仍存在 &gt;= 1 个可用子码；
C类：非机型独配顶码，按可用条件过滤后无可用子码；
D类：已失效顶码，或异常无真实子码的顶码。 本场景不存在资源限制，也不存在呆料优先级干扰；
C类、D类顶码不参与运算；
计算顺序固定为：先完成全部 A 类顶码，再开始处理 B 类顶码；
A类顶码按顶码排序规则逐个处理，直接分配唯一子码；
B类顶码在 A 类全部处理完成后，再按顶码排序规则逐个处理，并按子码排序规则直接取首位子码；
本场景不存在资源报错路径。 按顶码分类规则完成顶码分类；
C类、D类顶码不参与运算；
按顶码排序规则先处理全部 A 类顶码，逐个分配唯一子码；
A 类顶码全部完成后，再按顶码排序规则处理 B 类顶码；
每个 B 类顶码按子码排序规则直接取首位子码；
全部分配完成后，输出自动选型结果。 未配置呆料限制；
已配置一个或多个资源限制。
本场景下，系统按统一顶码分类规则对选型单内顶码进行分类：
A类：机型独配顶码；
B类：非机型独配顶码，按可用条件过滤后仍存在 &gt;= 1 个可用子码；
C类：非机型独配顶码，按可用条件过滤后无可用子码；
D类：已失效顶码，或异常无真实子码的顶码。 资源瓶颈限制为必须满足的硬约束；
C类、D类顶码不参与运算；
计算顺序固定为：先完成全部 A 类顶码，再开始处理 B 类顶码；
A类顶码按顶码排序规则逐个处理，分配唯一子码后立即执行资源校验；
任一 A 类顶码资源校验不通过，整张选型单直接报错终止；
仅当全部 A 类顶码处理完成且未报错后，才进入 B 类顶码处理阶段；
B类顶码按顶码排序规则逐个处理；每个顶码先按子码排序规则形成候选顺序，再执行子码轮询与资源校验；
任一 B 类顶码轮询全部可用子码后仍无可行方案，则整张选型单直接报错终止。 完成顶码分类，剔除 C 类、D 类顶码；
按顶码排序规则先处理全部 A 类顶码，逐个分配唯一子码并校验资源；
任一 A 类顶码资源校验不通过，整单报错终止；
A 类顶码全部完成后，再按顶码排序规则处理 B 类顶码；
每个 B 类顶码先按子码排序规则生成候选顺序，再执行子码轮询与资源校验；
任一 B 类顶码无可行子码，整单报错终止；
全部分配完成后，输出自动选型结果。 已配置呆料限制；
未配置资源限制。
本场景下，系统按统一顶码分类规则进行顶码分类：
A类：机型独配顶码；
B类：非机型独配顶码，按可用条件过滤后仍存在 &gt;= 1 个可用子码；
C类：非机型独配顶码，按可用条件过滤后无可用子码；
D类：已失效顶码，或异常无真实子码的顶码。 本场景不存在资源限制，因此无需执行资源轮询；
呆料仅影响子码排序优先级，不影响是否可分配；
C类、D类顶码不参与运算；
计算顺序固定为：先完成全部 A 类顶码，再开始处理 B 类顶码；
A类顶码按顶码排序规则逐个处理，直接分配唯一子码；
B类顶码在 A 类全部处理完成后，再按顶码排序规则逐个处理，并按子码排序规则直接取首位子码；
无需再区分“命中呆料顶码”与“未命中呆料顶码”分别执行不同流程；
呆料优先级已自然体现在子码排序结果中。 完成顶码分类，剔除 C 类、D 类顶码；
按顶码排序规则先处理全部 A 类顶码，逐个分配唯一子码；
A 类顶码全部完成后，再按顶码排序规则处理 B 类顶码；
每个 B 类顶码按子码排序规则直接取首位子码，呆料优先级已在排序中体现；
全部分配完成后，输出自动选型结果。 说明：由于子码排序规则中“命中的呆料数量”“命中的高优先级呆料数量”优先，因此系统会自然优先选到更符合呆料目标的子码，无需额外增加其他处理逻辑。 已配置呆料限制；
已配置资源限制。
本场景下，系统按统一顶码分类规则进行顶码分类：
A类：机型独配顶码；
B类：非机型独配顶码，按可用条件过滤后仍存在 &gt;= 1 个可用子码；
C类：非机型独配顶码，按可用条件过滤后无可用子码；
D类：已失效顶码，或异常无真实子码的顶码。
若需要解释“该 B 类顶码是否具备消化呆料的潜力”，系统可额外记录“命中呆料顶码 / 未命中呆料顶码”标签，但该标签不改变主流程分支。
资源限制必须满足，呆料仅影响子码排序先后；
C类、D类顶码不参与运算；
计算顺序固定为：先完成全部 A 类顶码，再开始处理 B 类顶码；
A类顶码按顶码排序规则逐个处理，分配唯一子码后立即执行资源校验；
任一 A 类顶码资源校验不通过，整张选型单直接报错终止；
仅当全部 A 类顶码处理完成且未报错后，才进入 B 类顶码处理阶段；
B类顶码统一按同一逻辑处理：先按子码排序规则形成候选顺序，再执行子码轮询与资源校验；
无需再区分“命中呆料顶码”与“未命中呆料顶码”分别走不同流程；
任一 B 类顶码轮询全部可用子码后仍无可行方案，则整张选型单直接报错终止。 说明：本图与 9.2.4 场景 B 保持一致。因为只要存在资源限制，主流程就应统一；场景 D 仅在“子码排序规则”中额外纳入呆料优先级。 完成顶码分类，剔除 C 类、D 类顶码；
按顶码排序规则先处理全部 A 类顶码，逐个分配唯一子码并校验资源；
任一 A 类顶码资源校验不通过，整单报错终止；
A 类顶码全部完成后，再按顶码排序规则处理 B 类顶码；
每个 B 类顶码先按子码排序规则生成候选顺序，再执行子码轮询与资源校验，呆料仅影响排序先后；
任一 B 类顶码无可行子码，整单报错终止；
全部分配完成后，输出自动选型结果。 说明：在该场景下，呆料仍然只影响排序顺序，不单独构成报错条件；系统统一按排序结果进行子码轮询即可，无需额外增加拆分处理逻辑。 报错触发流程立即中断，不继续后续顶码的分配，需用户线下协调资源后重新计算。 任一报错场景发生后，整张选型单直接报错终止；
不保留部分成功、部分失败的自动选型结果；
错误信息统一按5段式结构输出： 计算结果
报错编码
报错内容
报错顶码
限制条件
处理建议 当 A类顶码分配时，或 B类中的事实独配顶码在子码轮询过程中，因资源瓶颈限制无法满足而导致方案不可继续时，系统按两段式结构输出错误信息。报错内容：
计算结果：失败
报错编码：ERROR_001
报错内容：机型独配顶码限制数量无法满足
报错顶码：【顶码】
限制条件：【限制物料类型-限制编码-限制数量值】（多条时用 / 隔开）
处理建议：请线下协调对应限制物料资源数量；调整输入限制后重新发起自动选型计算。
报错内容：
计算结果：失败
报错编码：ERROR_002
报错内容：事实独配顶码限制数量无法满足
报错顶码：【顶码】
限制条件：【限制物料类型-限制编码-限制数量值】（多条时用 / 隔开）
处理建议：请线下协调对应限制物料资源数量；调整输入限制后重新发起自动选型计算。
当 B类顶码的全部可用子码按既定排序规则完成轮询后，仍均无法满足资源瓶颈限制时，系统按两段式结构输出错误信息。报错内容：
计算结果：失败
报错编码：ERROR_003
报错内容：当前限制条件导致顶码无解
报错顶码：【顶码】
限制条件：【限制物料类型-限制编码-限制数量值】（多条时用 / 隔开）
处理建议：请线下协调对应限制物料资源数量；调整输入限制后重新发起自动选型计算。
当单据的顶码无A类或者B类顶码时，无法进行自动选型计算，单据报错。报错内容：
计算结果：失败
报错编码：ERROR_004
报错内容：无可参与计算的顶码
报错顶码：-(固定展示-)
限制条件：-(固定展示-)
处理建议：此单据不满足自动选型条件，请人工手动选型。
【自动选型计算日志】用于对一次自动选型任务的实际计算过程进行可视化还原，面向业务用户、产品、研发、测试提供统一的过程查看口径。该模块不是对规则文档的重复罗列，而是将一次真实计算过程以“顶部概览 + 辅助说明 + 步骤卡片 + 顶码明细”的方式进行展示，帮助用户快速回答以下问题：
本次计算进入了哪个场景；
本次纳入计算的顶码有多少、分别是什么；
系统按什么顺序处理这些顶码；
每个顶码最终为什么成功、失败、跳过或未执行；
整张选型单最终为什么成功，或为什么失败终止。
日志模块需同时满足以下目标：
业务可读：业务用户无需阅读底层规则文档，也能理解本次计算过程；
过程可回放：能够清晰还原“先做了什么，再做了什么，为什么这样做”；
异常可定位：一旦失败，可快速定位失败步骤、失败顶码、失败限制条件；
结果可核对：成功时可以直接核对最终选型结果，失败时可以直接查看错误结论与处理建议；
口径统一：日志中使用的术语、步骤命名、状态表达必须与自动选型主逻辑保持一致。
日志用于解释系统如何完成自动选型，不替代主流程规则文档。
规则定义仍以正文规则为准；
日志以更易读的形式呈现“本次实际发生的计算过程”；
页面强调“发生了什么”和“为什么会这样”，而不是完整复述规则条文。
日志步骤不机械展示全部理论步骤，而是根据当前单据的实际计算路径动态生成。例如：
若当前单据不存在 A 类顶码，则不展示“机型独配顶码分配”步骤；
若当前单据计算成功，则最终展示“输出自动选型结果”；
若当前单据计算失败，则最终展示“报错终止”；
若前序顶码报错，则后续未执行顶码只展示“未执行”结果，不继续生成明细过程。
自动选型按单张选型单执行，因此日志也按单张选型单组织。同一张选型单内：
共享同一份日志上下文；
共享同一资源池；
共享同一场景识别结果；
共享同一约束口径。
日志外层采用少量步骤式结构，降低业务阅读负担；步骤内部再按顶码逐条展开，保证过程可追溯。页面阅读层级固定为：
第 1 层：整单概览；
第 2 层：步骤卡片；
第 3 层：顶码摘要行；
第 4 层：顶码展开明细。
日志应优先让用户快速看结论，再按需查看细节。具体要求：
步骤卡片头部必须直接给出步骤标题、步骤状态、本步摘要；
顶码默认先展示一行结论；
用户点击后再查看完整过程；
失败顶码默认展开，确保异常信息优先暴露。
若当前单据同时存在 A 类顶码与 B 类顶码，则日志必须明确体现：
先处理 A 类顶码；
A 类处理完成后，再进入 B 类顶码；
任一报错发生后，整单立即终止。
若不存在 A 类顶码，则日志直接从 B 类顶码分配步骤开始。任一报错触发后，日志必须明确说明：
报错发生在哪个步骤；
报错发生在哪个顶码；
对应限制条件是什么；
为什么不再继续后续候选或后续顶码；
哪些顶码因此未进入执行。
日志页顶部需以概览卡片形式展示本次计算的总体结果，帮助用户在进入步骤明细前先建立整体认知。顶部概览固定展示以下 4 个指标卡：
说明：HTML 原型中的 Demo 切换仅用于原型展示成功态/失败态；正式业务页面默认仅展示当前一次真实计算结果，不提供业务用户手工切换成功/失败态。
日志页面需提供一个默认折叠的辅助说明区，统一解释当前页面中的业务术语与计算口径。命名固定为：计算口径与业务术语说明该区域默认折叠，用户按需展开；不应打断主流程阅读。该区域至少覆盖以下内容：
A类顶码（机型独配顶码）；
B类顶码（可用非独配顶码）；
C类 / D类顶码；
资源瓶颈限制；
呆料积压限制；
事实独配；
计算顺序；
成本排序口径。
主步骤区是日志主体，按步骤卡片形式展示本次自动选型过程。每个步骤卡片头部固定包含：
步骤编号；
步骤标题；
步骤摘要；
步骤状态（成功 / 失败）。
步骤内部再根据步骤类型展示对应内容。在 A 类顶码分配步骤、B 类顶码分配步骤中，均需按顶码逐条展示。每个顶码的展示结构固定为：
顶码摘要表中的一行结论；
对应的可展开详情卡片；
详情卡片中包含基础信息、排序结果、资源校验、处理结论等内容。
对于“未执行”的顶码：
仅在步骤汇总表中展示“未执行”及原因；
不生成展开明细卡片。
若所有参与计算的顶码均成功完成分配，则日志需展示：
顶部概览中的整单结果 = 成功；
主步骤区中的各步骤状态 = 成功；
最终步骤为“输出自动选型结果”；
最终结果汇总表中列出所有成功分配的顶码及最终子码。
若任一顶码触发报错，则日志需展示：
顶部概览中的整单结果 = 失败；
报错发生步骤的状态 = 失败；
最终步骤为“报错终止”；
步骤汇总表中清楚展示失败顶码与未执行顶码；
失败顶码默认展开明细；
页面最终展示错误编码、报错内容、报错顶码、限制条件、失败阶段与处理建议。
日志模块只承接“解释实际计算过程”的职责，规则定义仍由正文其他章节给出。因此：
第 1～12 章负责说明“系统应该如何算”；
第 13～14 章负责说明“系统算完以后，如何把过程展示出来”。
日志页面中的所有字段命名、分类名称、报错编码、排序依据表达，必须与前文规则定义保持一致，避免前后口径不统一。自动选型的核心不是单纯给顶码选一个子码，而是将顶码分类、可用子码过滤、事实独配识别、成本排序、呆料优先级、资源轮询与整单报错机制统一为一套可执行的规则体系。
语言收敛：统一顶码分类表述为 A / B / C / D；
逻辑收敛：将“命中呆料”从分类分支收敛为排序标签；
实现收敛：补充稳定性原则，明确最终兜底规则；
展示收敛：明确采用步骤流式全量计算日志，并给出完整 mock 示例。
]]></description><link>自动选型终版逻辑.html</link><guid isPermaLink="false">采购数字化/4月需求/自动选型终版逻辑.md</guid><pubDate>Sun, 12 Apr 2026 09:33:19 GMT</pubDate></item></channel></rss>