简介:这是一份面向计算机专业学生、课程设计者及信息系统初学者整理的库存管理系统数据流图文档,重点解决从业务描述到分层DFD表达的问题。文档以1个doc文件交付,压缩包约67KB,篇幅集中,便于直接查阅和打印。内容围绕采购入库、领料出库、库存查询、库存分析与预警等核心流程展开,给出顶层DFD、第一层DFD、第二层DFD及第三层DFD的层次化表达,并涉及入库单审核、退货与记账、出库单审核处理、库存流水账、库存信息更新、库存统计表与出入库统计等数据流关系。读者可据此理解部门、单据、数据存储和加工过程之间的对应关系,也可用于课程作业、系统分析报告或数据库设计的流程梳理。已有3139人学习,适合需要参考分层数据流图画法与库存业务建模思路的读者。
1. 库存管理系统数据流图:先看清入库单、出库单和流水账的三条线
库存管理系统数据流图不是一张给评审看的装饰图。把顶层DFD摊开,采购部门S1用入库单F1把货推进来,领料部门S2用领料单F4和出库单F3把货领走,统计部门S1和有关人员S3再从库存信息F5、库存明细F6、出入库统计表F7里拿结果。图里真正要盯的是三本账:单据、库存流水账、库存信息。单据是凭据,流水账是过程,库存信息是结存;三者对不上,图就只是画得热闹。这份资源适合正在做库存管理课程设计、写需求规格说明书、或者接手一套老库存系统要补文档的人。它把顶层、一层、二层、三层DFD都摊开了,P1入库、P2出库、P3查询、P4分析预警四个加工都在,能直接拿来做评审底稿。但别急着照抄,先把S1/S2/S3和F1-F7的边界读明白,否则后面每一层都会继承同一个错误。
2. 顶层与一层DFD怎么读:S1/S2/S3到P1/P2/P3/P4的边界核对
2.1 先定边界:外部实体、数据存储和加工不是一回事
读库存管理系统数据流图,第一步不是看箭头多不多,而是把四类元素分开:外部实体、加工、数据流、数据存储。采购部门S1、领料部门S2、统计部门/有关人员S3是外部实体,它们只负责发起请求或接收结果,不参与系统内部的计算。P1入库管理、P2出库管理、P3库存查询、P4库存分析预警是加工,输入数据流进来,经过判断、记账、汇总,再输出数据流。库存流水账、库存信息、库存明细是数据存储,是系统内部要落下来的账。很多图把“管理员”画成外部实体,和采购部门并列,结果一层图里P1.1审核、P1.2入库处理都找不到责任人。常见做法是把管理员写进加工说明,作为加工的执行角色,而不是单独画一个外部实体。除非管理员是独立岗位、在系统外完成审批,才考虑画成外部实体。
边界定错,后面全乱。比如把“库存流水账”画成外部实体,P1和P2都往它写数据,看着像两个部门在交换数据,实际上它是系统内部的数据存储;再比如把“入库单”和“入库数据”合并成一条流,审核和记账就分不开,退货单F1.1.2也没有挂靠点。血泪经验是先把S1、S2、S3三个外部实体钉死,再把P1-P4四个加工钉死,最后才连数据流。顺序反过来,很容易画出“采购部门直接写库存信息”这种越界箭头。
提示:顶层图只回答“系统边界在哪”,不要在这一层解释字段和状态;字段、状态、异常分支留到二层和三层。
2.2 顶层图核对数据流F1-F7:每条流都要有起点、终点和触发单据
顶层DFD里,F1入库单从采购部门S1进入P1入库管理,F3出库单和F4领料单从领料部门S2进入P2出库管理,F5库存信息在P1、P2、P3、P4之间被读写,F6库存明细和F7出入库统计表/库存统计表流向S3有关人员。这里容易混淆的是F3和F4:领料单是领料部门发起的申请,出库单是审核后生成的执行凭证,两条流不能合并成一条“领料出库”。合并之后,P2.1审核和P2.2出库处理就没有输入输出区分,不合格出库单驳回到哪里也说不清。另一个容易漏的是F2入库数据/库存流水账:它不是给外部实体看的报表,而是P1写进数据存储的流水记录,后面P3查询和P4分析都要读它。
我一般会做一张核对表,把每条数据流的编号、名称、起点、终点、触发单据、落库位置、异常分支都填一遍。填不出来的格,就是图里没画清楚的地方。下面这张表按资源里的F1-F7整理,字段名可以按自己项目改,但“起点—终点—落库—异常”四列不要省。
| 数据流 | 名称 | 起点 | 终点 | 触发单据/动作 | 落库或输出 | 异常分支 |
|---|---|---|---|---|---|---|
| F1 | 入库单 | 采购部门S1 | P1入库管理 | 采购到货 | 入库单表 | 不合格退回S1 |
| F2 | 入库数据/库存流水账 | P1入库处理 | 库存流水账 | 审核合格后记账 | 流水账表 | 记账失败挂起 |
| F3 | 出库单 | 领料部门S2 | P2出库管理 | 领料申请审核后 | 出库单表 | 不合格驳回 |
| F4 | 领料单 | 领料部门S2 | P2.1审核 | 领料申请 | 领料单表 | 超库存驳回 |
| F5 | 库存信息 | 库存信息存储 | P1/P2/P3/P4 | 记账、查询、预警 | 库存结存表 | 结存为负告警 |
| F6 | 库存明细 | P3库存查询 | 有关人员S3 | 查询请求 | 明细视图 | 无权限脱敏 |
| F7 | 出入库统计表/库存统计表 | P4库存分析预警 | 统计部门S1/有关人员S3 | 统计周期 | 统计报表 | 口径不一致复核 |
这张表的作用不是替代DFD,而是逼着每条箭头落地。比如F2如果只写“入库数据”,不写落到库存流水账,二层图里P1.1.3单据记账就没有输出;F5如果只写“库存信息”,不写被P2出库处理读取,出库扣减就成了无源之水。参数上,F1、F3、F4是单据类数据流,必须带单号、物料编码、数量、日期、状态;F2是流水类数据流,必须带来源单号、方向、数量、结存快照;F5是结存类数据流,必须带物料编码、库位、结存数量、安全库存;F6、F7是查询和统计类数据流,必须带时间范围、统计维度、可见范围。把这些参数写进数据字典,后面做表结构和接口时就不会拍脑袋。
2.3 一层图拆入库和出库:审核、处理、流水账三段不能揉在一起
一层DFD把P1拆成P1.1审核和P1.2入库处理,把P2拆成P2.1审核和P2.2出库处理,这是整张图最值得抄的结构。入库侧,采购部门S1把F1入库单送进P1.1,管理员审核后,合格的入库单进入P1.2,不合格的退回S1或转P1.1.2填写退货单;P1.2入库处理负责更新库存流水账F2和库存信息F5。出库侧,领料部门S2把F3出库单和F4领料单送进P2.1,审核合格后进入P2.2出库处理,不合格驳回;P2.2更新库存流水账和库存信息。审核和记账分开,是为了让“单据状态”有地方落:审核只改单据状态,记账才写流水账和结存。两者揉成一个加工,月末对账时就会翻车——单据显示已审核,流水账里却没有这笔,库存信息也不知道该不该减。
具体操作可以按五步走。第一步,在顶层图上圈出S1、S2、S3,确认没有第四个外部实体混进来。第二步,把P1-P4四个加工画在一层,P1只保留P1.1审核和P1.2入库处理,P2只保留P2.1审核和P2.2出库处理,P3库存查询和P4库存分析预警先保留为独立加工,不要在一层就拆成查询明细和预警规则。第三步,给每个加工标输入流和输出流:P1.1输入F1,输出合格入库单到P1.2、不合格入库单回S1;P1.2输入合格入库单,输出F2到库存流水账、更新F5。第四步,检查数据存储的读写方向:库存流水账被P1.2和P2.2写,被P3和P4读;库存信息被P1.2和P2.2更新,被P3和P4读;库存明细由P3读。第五步,做父子平衡:顶层图里P1的输入F1、输出F2和F5,必须在一层图的P1.1、P1.2边界上找得到,不能凭空多出“入库通知单”或“质检单”。
注意:一层图里不要把“管理员”画成数据存储,也不要把“审核”画成外部实体;审核是P1.1这个加工的动作,管理员是加工说明里的执行角色。
3. 二层与三层DFD落地:P1.1.1到P1.1.5的审核、退货与记账拆解
3.1 把P1.1拆成P1.1.1-P1.1.5:每层只解决一个判断
资源里的三层DFD把P1.1继续拆成P1.1.1单据审核、P1.1.2填写退货单、P1.1.3单据记账、P1.1.4更新删除库存信息、P1.1.5打印输出。这个拆法不算细,但够用,关键是每个加工只做一个判断。P1.1.1单据审核的输入是F1入库单、退货单、发票,输出是合格入库单和不合格入库单;P1.1.2填写退货单只处理不合格分支,输出退货信息给采购部门S1;P1.1.3单据记账把合格入库单写成库存流水账,输出库存记录表和入库记录;P1.1.4更新删除库存信息负责结存数量的增减和冲销;P1.1.5打印输出负责把退货信息、库存记录表、入库记录打成凭据。这里最容易出错的是P1.1.3和P1.1.4的边界:记账写流水,更新改结存,两者可以放在同一个事务里,但在DFD上必须分开画,否则退货红冲时找不到“只冲流水不改结存”的中间状态。
把三层加工做成检查表,比盯着图看有效。下面这张表按资源里的编号整理,重点是“输入流、输出流、数据存储、异常分支”四列。
| 加工编号 | 加工名 | 输入流 | 输出流 | 读写的数据存储 | 异常分支 |
|---|---|---|---|---|---|
| P1.1.1 | 单据审核 | F1入库单、退货单、发票 | 合格入库单、不合格入库单 | 入库单表 | 缺发票挂起 |
| P1.1.2 | 填写退货单 | 不合格入库单 | 退货信息到S1 | 退货单表 | 退货数量大于入库数量 |
| P1.1.3 | 单据记账 | 合格入库单 | 库存流水账F2、入库记录 | 库存流水账 | 重复记账拦截 |
| P1.1.4 | 更新删除库存信息 | 记账结果 | 库存信息F5 | 库存信息表 | 结存为负告警 |
| P1.1.5 | 打印输出 | 退货信息、库存记录表、入库记录 | 打印凭据 | 无 | 打印失败重打 |
填这张表时,P1.1.1的输入里为什么有“退货单”?因为退货单不是凭空产生的,它可能来自上一笔入库的售后,也可能是本次审核不合格后的反向单据。资源里把退货单放在P1.1.1输入侧,说明审核时要同时看原入库单和退货单,防止同一批货反复入库。P1.1.3的输出“库存记录表”和“入库记录”不是两个新数据存储,而是库存流水账的两种视图:库存记录表按物料汇总,入库记录按单据明细展开。这个区分不写清楚,后面做统计表F7时就会把流水账和入库单直接混在一起,口径一定漂。
3.2 数据字典:F1-F7和S1-S3的字段约定先写死
DFD只画箭头,不写字段,但落地时字段必须补。数据字典是DFD的“黑匣子说明书”,没有它,开发只能猜。下面给一份最小字段约定,按资源里的F1-F7和S1-S3整理,字段名可以按团队规范改,但类型和约束要留着。
| 元素 | 类型 | 关键字段 | 约束 |
|---|---|---|---|
| S1采购部门 | 外部实体 | 部门编码、联系人 | 只发起入库和接收退货 |
| S2领料部门 | 外部实体 | 部门编码、领料人 | 只发起领料和出库申请 |
| S3统计部门/有关人员 | 外部实体 | 角色、可见范围 | 只读F6、F7 |
| F1入库单 | 单据流 | 单号、供应商、物料编码、数量、单价、状态 | 单号唯一,状态机控制 |
| F2库存流水账 | 流水流 | 流水号、来源单号、方向、数量、结存快照 | 只追加,不物理删除 |
| F3出库单 | 单据流 | 单号、领料部门、物料编码、数量、状态 | 超库存驳回 |
| F4领料单 | 单据流 | 申请单号、领料人、用途、明细行 | 与出库单多对一 |
| F5库存信息 | 结存流 | 物料编码、库位、结存数量、安全库存 | 结存不能为负 |
| F6库存明细 | 查询流 | 物料编码、批次、库位、可用量 | 按权限脱敏 |
| F7统计表 | 统计流 | 统计周期、维度、出入库合计、结存 | 口径固定到流水账 |
这份字典里,F1和F3是单据,F2是流水,F5是结存,三层数据不要混。比如“数量”在F1里是入库数量,在F2里要带方向(正数入库、负数出库或退货红冲),在F5里是结存数量。字段同名不代表含义相同,数据字典里最好把“数量口径”单独写一行。另一个容易漏的是S3的可见范围:DFD不表达权限,但查询加工P3如果没有输入限制,统计部门能看到采购价、领料部门能看到全库库存,就是越权。常见做法是在F6、F7的数据字典里加“可见部门”和“脱敏字段”,在P3加工说明里写清楚“按角色过滤”。
3.3 用表结构反推DFD一致性:一张流水账表能暴露三条断头流
DFD评审时,光看图容易放过“数据流没有落库”的问题。拿表结构反推,会直接很多。下面这段SQL不是资源自带的代码,而是按F1、F2、F5的最小字段做的映射示例,用来检查每条数据流有没有对应的落地位置。字段类型按常见库存系统习惯给,实际项目按数据库规范改。
-- F1入库单:单据流落地,状态机控制审核和记账 CREATE TABLE inbound_order ( id BIGINT PRIMARY KEY, order_no VARCHAR(32) NOT NULL UNIQUE COMMENT '入库单号,对应F1', supplier_code VARCHAR(32) NOT NULL COMMENT '供应商编码', material_code VARCHAR(32) NOT NULL COMMENT '物料编码', qty DECIMAL(18,4) NOT NULL COMMENT '入库数量', status VARCHAR(16) NOT NULL COMMENT 'DRAFT/WAIT_AUDIT/PASSED/REJECTED/POSTED', created_at DATETIME NOT NULL ); -- F2库存流水账:只追加,方向字段区分入库、出库、退货红冲 CREATE TABLE inventory_flow ( id BIGINT PRIMARY KEY, flow_no VARCHAR(32) NOT NULL UNIQUE COMMENT '流水号,对应F2', biz_no VARCHAR(32) NOT NULL COMMENT '来源单据号', biz_type VARCHAR(16) NOT NULL COMMENT 'IN/OUT/RETURN_IN/RETURN_OUT', material_code VARCHAR(32) NOT NULL, qty DECIMAL(18,4) NOT NULL COMMENT '正数入库,负数出库或红冲', balance_qty DECIMAL(18,4) NOT NULL COMMENT '记账后结存快照', created_at DATETIME NOT NULL ); -- F5库存信息:结存表,P1.2和P2.2更新,P3/P4读取 CREATE TABLE inventory_stock ( material_code VARCHAR(32) PRIMARY KEY, stock_qty DECIMAL(18,4) NOT NULL COMMENT '结存数量,对应F5', safety_qty DECIMAL(18,4) NOT NULL DEFAULT 0 COMMENT '安全库存', location_code VARCHAR(32) COMMENT '库位' );这段SQL的逻辑是:F1落在inbound_order,F2落在inventory_flow,F5落在inventory_stock。order_no唯一,保证同一张入库单不会重复审核;flow_no唯一,保证流水不重复;biz_type把入库、出库、退货红冲分开,避免退货单只改结存不改流水;balance_qty是记账后的结存快照,方便对账时按流水回放。参数上,status至少要覆盖草稿、待审、合格、驳回、已记账五个状态,少一个状态,P1.1.1和P1.1.3的边界就会糊;qty在流水账里允许负数,但库存信息里的stock_qty要有非负约束或告警,防止出库超领。用这三张表回查DFD,如果某条数据流找不到表,或者某张表没有数据流写入,就是断头流。常见的是F4领料单没有独立表,只挂在出库单备注里,结果P2.1审核时无法按领料明细校验库存,这就是图省事留下的坑。
提示:表结构只是校验工具,不要反过来让DFD去迁就某张表;先保证数据流有起点、终点和落库位置,再谈索引和性能。
4. 库存分析预警与查询:P3/P4的统计口径和接口清单
4.1 库存流水账到统计表的聚合链路:期初加入库减出库等于结存
P4库存分析预警和P3库存查询在一层图里经常被画成两个孤立的加工,输入F5、输出F6/F7,看起来能跑,实际口径对不上。正确的链路是:P1.2和P2.2写库存流水账F2,P1.1.4和P2.2更新库存信息F5,P4从F2和F5聚合出出入库统计表F7,P3从F5和库存明细读F6。统计表不能直接读F1入库单和F3出库单,因为单据有未审核、已驳回、已冲销状态,直接读单据会把无效数据算进去。库存流水账只记录已记账的流水,口径最干净。计算关系是:期初结存 + 入库流水合计 - 出库流水合计 = 期末结存。退货红冲按负向入库或正向出库处理,必须在流水账里有方向字段,不能只在库存信息上做加减。
统计表F7至少要分三个维度:按物料、按库位、按部门。按物料看总量,按库位看存放位置,按部门看领料成本。时间口径要写死:是自然月、财务月还是滚动30天;是记账时间还是单据时间。资源里F7叫“出入库统计表/库存统计表”,这两个名字经常被混用:出入库统计表看期间发生额,库存统计表看期末结存。做DFD时可以在P4下面拆两个子加工,一个算发生额,一个算结存,但一层图不必拆太细,先在加工说明里写清口径。常见错误是P4同时读F5和F1,导致同一批入库既在流水账里算一次,又在单据里算一次,统计结果翻倍。排查时拿一张物料编码,把F2流水按时间排序,手工加一遍期初和出入库,再和F7对,对不上就查是不是多读了单据表。
4.2 预警阈值和查询权限:P3/P4的输入不只是库存信息
P4库存分析预警的输入除了F5库存信息,还应该有安全库存、补货点、呆滞天数这些参数。资源里没有单独画参数流,落地时可以在数据字典里加“预警规则表”,或者把它作为F5的扩展字段。预警规则至少有三类:低于安全库存触发补货提醒,高于上限触发积压提醒,超过呆滞天数触发处理提醒。阈值不要写死在P4加工里,否则采购部门调整安全库存时要改代码。常见做法是把安全库存放在物料主数据或库存信息表里,P4只做比较和输出。P3库存查询的输入是查询条件,包括物料编码、库位、时间范围、部门;输出F6库存明细。查询加工本身不写数据,但要有权限过滤:采购部门看入库和供应商相关字段,领料部门看自己部门的领料记录和可用量,统计部门看汇总表,有关人员S3按角色看脱敏后的明细。DFD不画权限箭头,但可以在P3的加工说明里写“按角色过滤可见范围”,在接口层做数据权限。
权限这块最容易翻车的地方是“库存明细F6直接暴露采购单价”。库存明细是给查询用的,不是给所有人看的。解决方式不是把F6拆成十几条流,而是在数据字典里给字段加敏感级别,P3输出时按角色脱敏。另一个坑是P4预警直接推给所有有关人员S3,导致领料部门收到采购补货提醒。预警的接收对象要按规则配:安全库存预警给采购,呆滞预警给仓库和财务,超领预警给领料部门主管。这些内容在DFD上可以用“接收对象”字段表达,不必再加外部实体。
4.3 从DFD到接口清单:每条跨边界数据流至少对应一个动作
DFD评审完,下一步是让开发能接手。我一般会把跨边界的数据流翻译成接口清单,一条流至少对应一个查询或一个写动作。下面这张表按资源里的P1-P4整理,接口名只是示例,不绑定框架。
| DFD数据流 | 接口/动作 | 输入 | 输出 | 校验点 |
|---|---|---|---|---|
| F1入库单到P1.1 | POST /inbound/audit | 单号、审核结果 | 合格/不合格 | 单据状态必须是待审 |
| F1合格到P1.2 | POST /inbound/post | 单号 | 流水号、结存 | 防重复记账 |
| F3/F4到P2.1 | POST /outbound/audit | 领料单、出库单 | 合格/驳回 | 可用量校验 |
| F3合格到P2.2 | POST /outbound/post | 出库单号 | 流水号、结存 | 结存不能为负 |
| F5到P3 | GET /inventory/{materialCode} | 物料编码、库位 | 库存明细 | 数据权限 |
| F5/F2到P4 | GET /inventory/alerts | 规则类型、部门 | 预警列表 | 阈值有效 |
| F2到F7 | GET /inventory/summary | 时间范围、维度 | 统计表 | 口径固定 |
这张表的好处是,DFD里每条箭头都能找到落点。如果某条流翻译不出接口,要么是图画多了,要么是加工说明没写清。比如“P1.1.5打印输出”不一定有后端接口,但要有打印任务或报表导出动作;如果连这个都没有,三层图里的打印输出就是空加工。接口清单还能反向检查数据流方向:F5从库存信息到P3是读,P3不能反写F5;F2从P1.2到库存流水账是写,P3只能读不能改。把这些约束写进接口注释,后面联调时少很多扯皮。
注意:统计接口的时间参数要统一时区,单据时间和记账时间不要混用;预警接口要返回触发规则和当前值,不能只返回一句“库存不足”。
5. 避坑与排查:库存管理系统数据流图最常见的五类翻车点
5.1 数据流断头与黑匣子加工
现象:顶层图有F1入库单,翻到一层图找不到F1;或者P4库存分析预警只有输出F7,没有输入F2和F5。评审时看着箭头很多,实际每条流都悬空。原因通常有两个:一是父子图不平衡,顶层图画了某条流,一层图拆分时忘了挂到子加工上;二是把加工作成黑匣子,只写“库存分析”四个字,不写输入输出,画图的人自己也说不清分析什么。解决方式很笨但有效:给每条数据流编号,做一张父子平衡表,顶层图的输入输出必须在一层图边界上出现;每个加工至少有一个输入流和一个输出流,分析预警类加工必须接库存流水账或库存信息,不能凭空生成统计表。断头流不补,后面做接口时一定缺参数。
5.2 单据状态和流水账对不上
现象:入库单显示已审核,库存流水账里没有这笔;出库单已经打印,库存信息却没减。月末对账时,财务拿单据数量对流水账,差额查不出来。原因多半是把审核和记账揉成一个加工,审核通过就直接改结存,流水账没写或者写漏;也可能是状态字段太少,只有“未审/已审”,没有“已记账/已冲销”。解决方式是把P1.1.1审核、P1.1.3记账、P1.1.4更新库存信息分开,审核只改单据状态,记账才写流水,更新结存由记账结果驱动。状态机至少覆盖草稿、待审、合格、驳回、已记账、已冲销。流水账只追加不修改,冲销用负向流水,不用物理删除。这样即使中途失败,也能按流水回放。
5.3 退货单与红冲流水各走各的
现象:采购退货后,库存信息减了,库存流水账没有反向记录;或者退货单生成了新入库单,导致入库合计虚高。原因是对退货的建模不统一:有人把退货当反向入库,有人当出库,还有人只在库存信息上做减法。DFD里P1.1.2填写退货单和P1.1.3单据记账的边界没写清,退货信息只流向S1,没有回流到流水账。解决方式是明确退货走负向入库流水,biz_type标RETURN_IN,关联原入库单号;库存信息由流水账汇总更新,不允许手工改结存。退货数量不能大于原入库数量,红冲流水要带原流水号。这样统计表按流水账聚合时,退货会自然抵减,不会虚高。
5.4 统计表口径漂移
现象:F7出入库统计表和F5库存信息对不上,同样的物料,统计表显示入库100,库存信息只增加了80。原因是统计表直接读单据表,把驳回、未记账、已冲销的单据也算进去;或者时间口径一个按单据日期,一个按记账日期。解决方式是F7只从库存流水账聚合,统计期间按记账时间,期初结存取上期期末,期末结存用期初加入库减出库复核。统计维度固定为物料、库位、部门三选一,不要在一个接口里混多个口径。做DFD时在P4加工说明里写清“数据源只读F2和F5”,不要画一条从F1直接到F7的箭头,那条箭头就是口径漂移的源头。
5.5 查询权限越界
现象:领料部门在P3库存查询里能看到全库库存和采购单价,统计部门能看到未审核的入库单。原因是DFD只画了F5到P3的数据流,没有画可见范围,开发默认全量返回。解决方式是在数据字典里给F5、F6加敏感级别和可见部门,在P3加工说明里写“按角色过滤”,接口层做数据权限。查询类加工不写数据,但读的范围要受控;统计类加工输出F7时,汇总层可以放开,明细层要脱敏。权限不是DFD的图形元素,但它是数据流边界的一部分,漏了就会在验收时被安全评审打回来。
提示:避坑检查不要等评审会才做,画完一层图就先把“断头流、状态机、退货红冲、统计口径、权限”五项过一遍,改图成本最低。
6. 让DFD能验收:三层图一致性检查与评审技巧
6.1 用一张检查表跑完顶层到三层
DFD画完能不能验收,不看图好不好看,看能不能通过一致性检查。我一般会按下面这张表逐项打勾,顶层、一层、二层、三层各跑一遍。检查表不复杂,但能挡住大部分返工。
| 检查项 | 检查方法 | 不通过的表现 |
|---|---|---|
| 父子平衡 | 顶层输入输出在一层边界找得到 | 顶层有F1,一层没有对应入口 |
| 加工完整 | 每个加工至少一进一出 | P4只有输出没有输入 |
| 数据流编号 | F1-F7编号唯一,起点终点明确 | 同一条流两个编号或断头 |
| 数据存储读写 | 每个存储至少一个写、一个读 | 库存流水账只写不读 |
| 外部实体边界 | 外部实体不直连数据存储 | 采购部门直接写库存信息 |
| 状态覆盖 | 单据状态覆盖审核、记账、冲销 | 只有未审/已审两态 |
| 统计口径 | F7只从F2/F5聚合 | F7直连F1/F3 |
| 权限边界 | P3输出带可见范围 | 明细全量返回 |
这张表里,父子平衡和加工完整是最容易出问题的两项。父子平衡不是把顶层图的箭头原样复制到一层,而是看顶层图的输入输出有没有在一层图的子加工边界上出现。比如顶层图P1输入F1、输出F2和F5,一层图P1.1输入F1、输出合格入库单,P1.2输入合格入库单、输出F2并更新F5,这就平衡了。如果一层图多出一条“入库通知单”输入,顶层图没有,就要问这条流从哪来。加工完整则要求每个加工有输入有输出,P4库存分析预警不能只输出F7,必须接F2和F5;P3库存查询不能只输出F6,必须接查询条件和F5。
6.2 评审时先问退货单和统计口径
评审会上最容易冷场的问题是“这个图能开发吗”。我的习惯是先不问字段,先问两个问题:退货单从哪来、到哪去;F7统计表的数据源是哪张表。退货单能问出P1.1.2、P1.1.3、P1.1.4的边界是否清楚,统计口径能问出P4有没有直接读单据。如果这两个问题答不上来,字段写得再细也没用。另一个技巧是把F1-F7写在纸上左列,P1-P4写右列,逐条连线,连不上的就是断头流;连上了但方向反的,就是读写越界。评审前跑一遍,比在会上翻图快。
从那以后我每次拿到库存管理系统数据流图,都先跑一遍父子平衡和退货红冲检查,再谈表结构和接口;图上的箭头可以少,但每条流的起点、终点、落库位置不能省。希望帮到你。
本文还有配套的精品资源,点击获取