[{"data":1,"prerenderedAt":536},["ShallowReactive",2],{"rainink-post-erp-wms-mes-qc-requirement-method":3,"rainink-content-index":348},{"id":4,"title":5,"body":6,"category":330,"cover":331,"date":332,"description":333,"draft":334,"extension":335,"featured":334,"lang":331,"meta":336,"navigation":337,"order":331,"path":338,"period":331,"pinned":334,"repo":331,"seo":339,"slug":331,"stack":331,"stem":340,"tags":341,"thumb":331,"toc":337,"updated":331,"__hash__":347},"content\u002Fposts\u002Ferp-wms-mes-qc-requirement-method.md","先画全链路，再切分期：我做 ERP\u002FWMS\u002FMES\u002FQC 需求的方法",{"type":7,"value":8,"toc":319},"minimark",[9,16,21,24,27,30,33,36,92,104,107,137,140,143,146,169,172,176,179,182,193,196,246,249,252,256,259,276,279,282,286,300,303,306,309,316],[10,11,12],"blockquote",{},[13,14,15],"p",{},"需求阶段最贵的错误不是写错一个字段，而是把系统的边界划错了。",[17,18,20],"h2",{"id":19},"起步时只做一个-mes后来发现划小了","起步时只做一个 MES，后来发现划小了",[13,22,23],{},"最初的范围是一个独立的 MES：生产订单、工序、报工、质检。写到流程部分就卡住了——生产计划从哪来？物料齐套谁来判断？成品入库之后怎么出库？",[13,25,26],{},"这些问题的答案都不在 MES 里。它们分别属于 ERP（销售订单、MRP、采购）和 WMS（收货、上架、拣货、出库）。",[13,28,29],{},"所以我停掉了单系统设计，改成先把 ERP、WMS、MES、QC 四条链合起来画一遍端到端流程。这个决定的代价是前期多花了大量时间，收益是后面每一份需求文档都不需要猜\"上游给我什么、下游要我什么\"。",[17,31,32],{"id":32},"编号体系是流程文档的地基",[13,34,35],{},"合并多份基线文档时，最大的风险不是内容重复，而是同一个节点被两套编号指代。我的做法是先定编号规则，再动内容：",[37,38,39,55],"table",{},[40,41,42],"thead",{},[43,44,45,49,52],"tr",{},[46,47,48],"th",{},"系列",[46,50,51],{},"覆盖范围",[46,53,54],{},"示例",[56,57,58,70,81],"tbody",{},[43,59,60,64,67],{},[61,62,63],"td",{},"N 系列",[61,65,66],{},"销售链",[61,68,69],{},"N01 销售订单创建、N03 MRP 运算、N09 完工入库、N12 销售出库过账",[43,71,72,75,78],{},[61,73,74],{},"P 系列",[61,76,77],{},"采购链",[61,79,80],{},"P01 采购需求、P09 来料检验任务、P12 三单匹配过账、P13 采购付款",[43,82,83,86,89],{},[61,84,85],{},"Q 系列",[61,87,88],{},"质检链",[61,90,91],{},"Q01 来料 IQC、Q02 首检、Q03 巡检 IPQC、Q04 完工 FQC、Q05 出货 OQC",[13,93,94,95,99,100,103],{},"这里有个很容易踩的坑：采购链本来就有 ",[96,97,98],"code",{},"P09 来料检验","，质检链又要加 ",[96,101,102],{},"Q01 来料 IQC","，看起来是重复建站。",[13,105,106],{},"解法是把职责拆开，并在文档里写明重编逻辑：",[108,109,110,122,131],"ul",{},[111,112,113,116,117,121],"li",{},[96,114,115],{},"P09"," 是",[118,119,120],"strong",{},"采购链上的检验任务","（一个待办事项）；",[111,123,124,116,127,130],{},[96,125,126],{},"Q01",[118,128,129],{},"质检能力节点","（真正执行检验、出判定结论的动作）；",[111,132,133,136],{},[96,134,135],{},"P10"," 保留为判定分支节点（合格入库 \u002F 不合格退货让步）。",[13,138,139],{},"任务与执行分离，重复感就消失了。如果不在编号规则章节写清楚这件事，后面每个读文档的人都会重新困惑一次。",[17,141,142],{"id":142},"分支条件必须显式编号",[13,144,145],{},"端到端流程里真正麻烦的不是主干，是分支。我把分支也编号，并且在节点明细和流程图里同时标注：",[108,147,148,151,154,157,160,163,166],{},[111,149,150],{},"N03 MRP 运算完成，若缺料 → 自动进入 P01 采购需求，到货后汇合回 N04；",[111,152,153],{},"N06 齐套检查缺料 → 等待采购，或触发补料；",[111,155,156],{},"N08 生产执行首检不合格 → 停线\u002F调整；",[111,158,159],{},"Q03 巡检异常 → 隔离\u002F返工；",[111,161,162],{},"Q04 完工检验不合格 → 返工\u002F让步\u002F报废；",[111,164,165],{},"Q05 出货检验不合格 → 拦截出货\u002F返工；",[111,167,168],{},"P10 来料检验不合格 → 退货\u002F让步接收。",[13,170,171],{},"分支不定编号，讨论时只能靠描述，两个人说的\"那个不合格分支\"很可能不是同一个。",[17,173,175],{"id":174},"插拔与撤回把可配置性当成需求","插拔与撤回：把可配置性当成需求",[13,177,178],{},"这个方案要能作为模板交付给不同客户，所以流程节点必须能插拔——某个客户的业务里没有 FQC，就关掉 Q04，流程自动跳过。",[13,180,181],{},"插拔开关本身是需求，不是实现细节。文档里要回答的是：",[108,183,184,187,190],{},[111,185,186],{},"关掉这个节点后，上下游怎么衔接？",[111,188,189],{},"谁能开关？",[111,191,192],{},"开关变更要不要留痕？",[13,194,195],{},"撤回则要分级，而不是简单允许\u002F不允许：",[37,197,198,211],{},[40,199,200],{},[43,201,202,205,208],{},[46,203,204],{},"层级",[46,206,207],{},"范围",[46,209,210],{},"约束",[56,212,213,224,235],{},[43,214,215,218,221],{},[61,216,217],{},"自由撤回",[61,219,220],{},"未产生下游单据、未过任何闸点",[61,222,223],{},"发起人可撤回",[43,225,226,229,232],{},[61,227,228],{},"受限撤回",[61,230,231],{},"已产生下游单据但未过账",[61,233,234],{},"需下游确认 + 权限",[43,236,237,240,243],{},[61,238,239],{},"禁止撤回",[61,241,242],{},"硬闸点之后",[61,244,245],{},"只能走反向单据冲销",[13,247,248],{},"硬闸点固定为三个：N12 销售出库过账、P12 三单匹配过账、P13 采购付款。过了这三处，纸质\u002F财务事实已经发生，系统里唯一正确的处理方式是生成反向单据，不是\"撤回\"。",[13,250,251],{},"质检判定通过之后的撤回单列一条规则：可以撤，但需要权限，并且要保留判定记录——因为检验结论是质量追溯的证据，不能凭空消失。",[17,253,255],{"id":254},"先把范围收口成里程碑再逐流程写需求","先把范围收口成里程碑，再逐流程写需求",[13,257,258],{},"全链路画完之后，不要立刻开始写全部需求文档，那样会失控。先按里程碑把实施范围切开：",[108,260,261,264,267,270,273],{},[111,262,263],{},"M1 主数据与权限底座；",[111,265,266],{},"M2 销售与采购主干；",[111,268,269],{},"M3 生产执行与报工；",[111,271,272],{},"M4 质检全链路；",[111,274,275],{},"M5 出入库与财务过账衔接。",[13,277,278],{},"每个里程碑产出一份实施清单，写清楚依赖关系、验收口径和不做的东西。然后再按流程顺序，一份一份产出需求设计文档——销售订单 → MRP → 采购 → 来料 → 生产 → 完工 → 出货。",[13,280,281],{},"这个顺序的好处是：每份文档的上游接口都已经定稿，不需要预留一堆\"待定\"。",[17,283,285],{"id":284},"需求阶段只聊业务不聊代码","需求阶段只聊业务，不聊代码",[13,287,288,289,292,293,292,296,299],{},"这条是我的红线。需求文档里出现 ",[96,290,291],{},"entity","、",[96,294,295],{},"service",[96,297,298],{},"DTO"," 这类词，说明设计已经越界到了实现层，而实现层的信息会在开发阶段过期，最后文档既不能给业务看，也不能给开发用。",[13,301,302],{},"需求文档要回答的是：谁在什么状态下能做什么动作、数据从哪来、判定规则是什么、异常怎么处理、怎么验收。",[13,304,305],{},"代码级别的约定（表结构、接口路径、状态字段类型）放到开发提示词里，单独维护。两者分开，文档才能活得久。",[17,307,308],{"id":308},"小结",[13,310,311,312,315],{},"需求阶段真正要交付的不是文档量，是一套",[118,313,314],{},"不会自相矛盾的边界","：编号不重复、分支能指认、闸点不可逆、插拔有约定、分期可交付。",[13,317,318],{},"把这些先钉死，后面的设计文档就只是填内容；反之，每一份文档都要重新吵一次同样的架。",{"title":320,"searchDepth":321,"depth":321,"links":322},"",2,[323,324,325,326,327,328,329],{"id":19,"depth":321,"text":20},{"id":32,"depth":321,"text":32},{"id":142,"depth":321,"text":142},{"id":174,"depth":321,"text":175},{"id":254,"depth":321,"text":255},{"id":284,"depth":321,"text":285},{"id":308,"depth":321,"text":308},"tech",null,"2026-10-20","ERP\u002FWMS\u002FMES\u002FQC 需求方法：先用编号体系与硬闸点把端到端流程关进文档，再按里程碑切成可交付的分期。",false,"md",{},true,"\u002Fposts\u002Ferp-wms-mes-qc-requirement-method",{"title":5,"description":333},"posts\u002Ferp-wms-mes-qc-requirement-method",[342,343,344,345,346],"MES","ERP","WMS","需求设计","流程设计","oOe-RyAZIfibrBbA7VuFUmk121RydPtME79j7Z5XMW4",{"all":349,"posts":471,"essays":496,"projects":497,"tags":504},[350,367,381,392,404,408,418,430,441,460],{"title":351,"description":352,"path":353,"slug":354,"category":330,"categoryLabel":355,"kind":356,"tags":357,"date":362,"updated":363,"minutes":364,"pinned":337,"draft":334,"order":365,"stack":366,"period":320,"repo":320,"thumb":320},"用 Nuxt 4 + Nuxt Content 搭一个纯静态个人站","站点骨架的取舍：内容目录怎么定、SSG 怎么预渲染、设计令牌怎么从原型抽成一套 CSS 变量，以及首屏主题闪烁的解法。","\u002Fposts\u002Fnuxt4-static-site","nuxt4-static-site","技术","post",[358,359,360,361],"Nuxt","Nuxt Content","SSG","前端工程化","2026-10-12","2026-10-18",5,0,[],{"title":368,"description":369,"path":370,"slug":371,"category":330,"categoryLabel":355,"kind":356,"tags":372,"date":378,"updated":320,"minutes":379,"pinned":334,"draft":334,"order":365,"stack":380,"period":320,"repo":320,"thumb":320},"国内服务器部署的十个坑：从镜像源到 certbot","从镜像源到 certbot 的十个真实故障：nvm 拉不动、目录权限、空库迁移、Host 头命中错站、证书续期与备案期验收。","\u002Fposts\u002Fcn-server-deploy-pitfalls","cn-server-deploy-pitfalls",[373,374,375,376,377],"部署","踩坑","Nginx","PowerShell","运维","2026-10-22",6,[],{"title":382,"description":383,"path":384,"slug":385,"category":330,"categoryLabel":355,"kind":356,"tags":386,"date":389,"updated":320,"minutes":390,"pinned":334,"draft":334,"order":365,"stack":391,"period":320,"repo":320,"thumb":320},"一台腾讯云轻量跑起多站点：从裸机到 HTTPS 的实际路径","一台 2C4G 腾讯云轻量同时承载后台、接口与静态站：备案施工顺序、Nginx 多 server 块、certbot 签证书与上线验收。","\u002Fposts\u002Fmulti-site-deploy-to-https","multi-site-deploy-to-https",[373,375,387,377,388],"HTTPS","腾讯云","2026-10-21",7,[],{"title":393,"description":394,"path":395,"slug":396,"category":330,"categoryLabel":355,"kind":356,"tags":397,"date":332,"updated":320,"minutes":402,"pinned":334,"draft":334,"order":365,"stack":403,"period":320,"repo":320,"thumb":320},"底座能力的边界：什么该沉进数据字典，什么必须单独立表","B 端底座能力的边界判断：哪些配置该沉进数据字典、哪些必须单独立表，以及单级字典不升级成树的理由。","\u002Fposts\u002Fbase-dictionary-boundary","base-dictionary-boundary",[398,399,400,401],"B端","架构设计","数据字典","super-admin",4,[],{"title":5,"description":333,"path":338,"slug":405,"category":330,"categoryLabel":355,"kind":356,"tags":406,"date":332,"updated":320,"minutes":402,"pinned":334,"draft":334,"order":365,"stack":407,"period":320,"repo":320,"thumb":320},"erp-wms-mes-qc-requirement-method",[342,343,344,345,346],[],{"title":409,"description":410,"path":411,"slug":412,"category":330,"categoryLabel":355,"kind":356,"tags":413,"date":416,"updated":320,"minutes":402,"pinned":334,"draft":334,"order":365,"stack":417,"period":320,"repo":320,"thumb":320},"主数据状态机不是字段，是一份跨模块公共契约","MES 主数据状态机的设计取舍：六态加停用怎么定、四方口径为什么必须交叉核对，以及 BOM 与编号体系为什么会互相污染。","\u002Fposts\u002Fmes-master-data-state-machine","mes-master-data-state-machine",[342,414,345,415],"领域建模","状态机","2026-10-19",[],{"title":419,"description":420,"path":421,"slug":422,"category":330,"categoryLabel":355,"kind":356,"tags":423,"date":428,"updated":320,"minutes":364,"pinned":334,"draft":334,"order":365,"stack":429,"period":320,"repo":320,"thumb":320},"B 端后台底座：把权限、菜单、请求收敛成三层","后台系统做多了会发现，真正需要沉淀的不是页面，而是权限模型、动态菜单和请求层这三块底座。","\u002Fposts\u002Fvue3-admin-base","vue3-admin-base",[424,425,426,427],"Vue","后台","架构","权限","2026-09-24",[],{"title":431,"description":432,"path":433,"slug":434,"category":330,"categoryLabel":355,"kind":356,"tags":435,"date":439,"updated":320,"minutes":364,"pinned":334,"draft":334,"order":365,"stack":440,"period":320,"repo":320,"thumb":320},"工作流引擎实操笔记：节点、流转与幂等","从状态机到可配置流程：一次工作流引擎落地中关于节点模型、流转条件、幂等与补偿的实操记录。","\u002Fposts\u002Fworkflow-engine-notes","workflow-engine-notes",[436,437,426,438],"工作流","后端","幂等","2026-08-30",[],{"title":442,"description":443,"path":444,"slug":401,"category":445,"categoryLabel":446,"kind":445,"tags":447,"date":448,"updated":320,"minutes":449,"pinned":334,"draft":334,"order":449,"stack":450,"period":458,"repo":320,"thumb":459},"Super Admin 后台底座","一套可复用的 B 端后台前端底座：权限三层收敛、动态菜单、请求层封装与通用表格表单组件，新项目接入只需替换业务页面。","\u002Fprojects\u002Fsuper-admin","project","项目",[424,425,361],"2026-05-20",1,[451,452,453,454,455,456,457],"Vue 3","TypeScript","Vite","Pinia","Antdv Next","Node.js","Next.js","2026 年至今","SA",{"title":461,"description":462,"path":463,"slug":464,"category":445,"categoryLabel":446,"kind":445,"tags":465,"date":363,"updated":320,"minutes":449,"pinned":334,"draft":334,"order":466,"stack":467,"period":469,"repo":320,"thumb":470},"雨墨 RainInk 本站","你正在看的这个站：Nuxt 4 + Nuxt Content 的纯静态个人站，手写设计令牌、无评论无用户输入、产物可直接静态托管。","\u002Fprojects\u002Frainink-site","rainink-site",[358,360,361],3,[468,451,359,452],"Nuxt 4","2026 年 10 月","RI",[472,475,478,481,484,487,490,493],{"title":351,"description":352,"path":353,"slug":354,"category":330,"categoryLabel":355,"kind":356,"tags":473,"date":362,"updated":363,"minutes":364,"pinned":337,"draft":334,"order":365,"stack":474,"period":320,"repo":320,"thumb":320},[358,359,360,361],[],{"title":368,"description":369,"path":370,"slug":371,"category":330,"categoryLabel":355,"kind":356,"tags":476,"date":378,"updated":320,"minutes":379,"pinned":334,"draft":334,"order":365,"stack":477,"period":320,"repo":320,"thumb":320},[373,374,375,376,377],[],{"title":382,"description":383,"path":384,"slug":385,"category":330,"categoryLabel":355,"kind":356,"tags":479,"date":389,"updated":320,"minutes":390,"pinned":334,"draft":334,"order":365,"stack":480,"period":320,"repo":320,"thumb":320},[373,375,387,377,388],[],{"title":393,"description":394,"path":395,"slug":396,"category":330,"categoryLabel":355,"kind":356,"tags":482,"date":332,"updated":320,"minutes":402,"pinned":334,"draft":334,"order":365,"stack":483,"period":320,"repo":320,"thumb":320},[398,399,400,401],[],{"title":5,"description":333,"path":338,"slug":405,"category":330,"categoryLabel":355,"kind":356,"tags":485,"date":332,"updated":320,"minutes":402,"pinned":334,"draft":334,"order":365,"stack":486,"period":320,"repo":320,"thumb":320},[342,343,344,345,346],[],{"title":409,"description":410,"path":411,"slug":412,"category":330,"categoryLabel":355,"kind":356,"tags":488,"date":416,"updated":320,"minutes":402,"pinned":334,"draft":334,"order":365,"stack":489,"period":320,"repo":320,"thumb":320},[342,414,345,415],[],{"title":419,"description":420,"path":421,"slug":422,"category":330,"categoryLabel":355,"kind":356,"tags":491,"date":428,"updated":320,"minutes":364,"pinned":334,"draft":334,"order":365,"stack":492,"period":320,"repo":320,"thumb":320},[424,425,426,427],[],{"title":431,"description":432,"path":433,"slug":434,"category":330,"categoryLabel":355,"kind":356,"tags":494,"date":439,"updated":320,"minutes":364,"pinned":334,"draft":334,"order":365,"stack":495,"period":320,"repo":320,"thumb":320},[436,437,426,438],[],[],[498,501],{"title":442,"description":443,"path":444,"slug":401,"category":445,"categoryLabel":446,"kind":445,"tags":499,"date":448,"updated":320,"minutes":449,"pinned":334,"draft":334,"order":449,"stack":500,"period":458,"repo":320,"thumb":459},[424,425,361],[451,452,453,454,455,456,457],{"title":461,"description":462,"path":463,"slug":464,"category":445,"categoryLabel":446,"kind":445,"tags":502,"date":363,"updated":320,"minutes":449,"pinned":334,"draft":334,"order":466,"stack":503,"period":469,"repo":320,"thumb":470},[358,360,361],[468,451,359,452],[505,507,508,509,510,511,512,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,531,532,533,534,535],{"name":342,"count":321,"weight":506},1.6,{"name":375,"count":321,"weight":506},{"name":426,"count":321,"weight":506},{"name":377,"count":321,"weight":506},{"name":373,"count":321,"weight":506},{"name":345,"count":321,"weight":506},{"name":398,"count":449,"weight":513},1.25,{"name":343,"count":449,"weight":513},{"name":387,"count":449,"weight":513},{"name":358,"count":449,"weight":513},{"name":359,"count":449,"weight":513},{"name":376,"count":449,"weight":513},{"name":360,"count":449,"weight":513},{"name":401,"count":449,"weight":513},{"name":424,"count":449,"weight":513},{"name":344,"count":449,"weight":513},{"name":361,"count":449,"weight":513},{"name":425,"count":449,"weight":513},{"name":437,"count":449,"weight":513},{"name":436,"count":449,"weight":513},{"name":438,"count":449,"weight":513},{"name":400,"count":449,"weight":513},{"name":427,"count":449,"weight":513},{"name":399,"count":449,"weight":513},{"name":346,"count":449,"weight":513},{"name":415,"count":449,"weight":513},{"name":388,"count":449,"weight":513},{"name":374,"count":449,"weight":513},{"name":414,"count":449,"weight":513},1792738754342]