拓冰建站拓冰建站
首页 / 资讯中心 / 正文

Educoder数据流图DFD通关:分层分解、命名规范与父子平衡

做过头歌educoder软件工程导论实验的人大概率在“结构化分析方法-数据流图”这一关停过很久。题目给的是一段几百字的需求描述让你在一个在线画布上拖方框、拉箭头然后点提交系统告诉你哪一条数据流不平衡、哪个加工没编号。很多人第一次提交被打回五六次最后干脆照着别人的截图抄抄完还是没搞明白为什么要这么画。这篇就把数据流图DFDData Flow Diagram从头到尾拆一遍它到底在描述什么、四类元素怎么用、自顶向下逐层分解的每一步怎么落地、educoder 的评测点在什么地方、我踩过的那些坑又是怎么绕过去的。不管你是刚学软件工程导论的大一新生还是准备课程设计答辩、需要用 DFD 给老师讲清楚系统结构的老油条下面这些内容都能直接拿去用。1. 先搞清楚 educoder 这道题到底在考什么很多同学一上来就急着拖图形结果画得挺满提交全是红叉。问题不在手上而在脑子里没建立“这道题要我输出什么”的模型。头歌的这套实验本质是让你用一套标准化的图形语言把一段自然语言的业务描述翻译成计算机和相关人员都能看懂的模型评测系统查的就是这套翻译是否守规矩。1.1 结构化分析方法在导论课里的位置软件工程导论里结构化分析方法SAStructured Analysis是最早接触的一整套“面向过程”的需求建模手段它主要由三样东西组成数据流图、数据字典、加工说明也叫小说明。数据流图负责画“系统的数据怎么流动”数据字典负责解释“图里每个名字是什么意思”加工说明负责讲“最底层的那个加工具体怎么算”。这三者是配套的缺一个模型就不完整。导论课之所以把它放在很靠前的位置是因为它训练的是“分解”这个能力。一个复杂系统谁也没法一口气说清楚那就先画出整个系统和外界的关系再把系统内部拆成几个大加工大加工继续往下拆直到每个加工都简单到能用一段话描述清楚。这个“自顶向下、逐层分解”的思路后面学面向对象、学架构设计其实都在反复用只是换了个壳。educoder 的实验通常只聚焦在数据流图上数据字典和加工说明有时作为附加题或客观题出现。所以你要清楚这一关的主角是图但图的背后是分解逻辑评测系统考的是逻辑图形只是表达形式。1.2 数据流图不是流程图别混为一谈这是我见过最普遍的认知错误。很多人把数据流图画成了程序流程图用菱形表示判断、用箭头表示“然后执行下一步”画完自己觉得挺合理系统判错还一脸懵。这两者的区别用一句话说就是数据流图看的是“数据”流程图看的是“动作的顺序”。数据流图里没有“先做A再做B”这种时间顺序也没有判断分支。它回答的问题是这个数据从哪来、经过哪个加工变成什么、最后存到哪里或者输出给谁。箭头代表的是数据在流动不是控制权在转移。举个生活化的例子做菜的流程图是“先洗菜、再切菜、再下锅”而对应的数据流图是“生菜 菜谱 → 加工‘切配’ → 切好的菜”“切好的菜 调料 → 加工‘烹饪’ → 成品菜”。前者关注步骤先后后者关注物料怎么被加工成另一个物料。所以画 DFD 的时候你的脑子里不应该有“第一步第二步”而应该有“有哪些数据、它们在哪些加工之间来回跑”。理解这一点后面很多奇怪的扣分你就能自己解释清楚了。判断类逻辑比如“如果库存不足就提示”在数据流图里是不直接体现的它藏在加工说明里最多表现为同一个加工有两条不同的输出流。1.3 头歌实验的评测逻辑与常见卡点educoder 这类平台的数据流图实验评测方式大致分两种一种是客观题式给你一张图或一段描述让你选正确的元素、选正确的分解结果另一种是作图题在画布上拖拽图形连线提交后由后台比对标准答案的结构。客观题主要考概念比如“下列哪一项不属于数据流图的元素”“父图和子图之间必须满足什么关系”这类题错了一般就是概念没记牢翻回去把四类元素的定义和平衡原则背熟就行。作图题才是真正的难点。它的判分点通常包括外部实体有没有画对、加工的层级和编号对不对、数据流有没有遗漏或多余、父子图是否平衡、有没有出现不该有的控制流。后台一般不看你图形摆得好不好看看的是拓扑结构有哪些节点、节点之间连了哪些边、边的方向对不对。这就意味着你画的图哪怕歪歪扭扭只要结构对就能过反过来画得再漂亮多连一条线照样扣分。我个人的经验是作图题被打回时先别急着改图形位置先对着“平衡原则”和“命名规范”这两条硬规则自查八成问题都出在这。后面第 5 章会把高频错误整理成速查表你可以直接拿去当提交前的检查清单。2. 数据流图的四类元素与命名规范图形是数据流图的皮规范是它的骨。这一章把四类元素、命名规则、分层约定这三件事讲透这是你后面所有操作的基础也是 educoder 客观题最爱考的地方。2.1 外部实体、加工、数据存储、数据流各自的图形符号数据流图只有四种基本元素但每一种的图形符号在不同的教材和工具里略有差别头歌的画布一般会固定一套你要先认清它用的是哪一套。外部实体外部参与者用矩形表示代表系统之外、和系统有数据交换的人、组织或另一个系统。比如“学生”“教师”“银行系统”。它是数据的源头或终点不参与系统内部的加工。加工处理用圆角矩形或圆形表示代表对数据做某种变换。名字必须是动宾结构比如“审核申请”“计算成绩”。加工可以有编号用来体现层级比如 1、2、1.1、1.2。数据存储用开口矩形右边不封口或者两条平行横线表示代表数据静止存放的地方比如“学生信息表”“订单库”。注意它存的是数据不是文件本身。数据流用带箭头的线表示代表数据在流动箭头方向就是数据流向线上要标数据流的名字比如“成绩单”“借阅请求”。这四类元素里最容易画错的是数据存储。很多人会给数据存储画一个封闭的方框那就和外部实体撞符号了评测系统很可能直接判你少了一个外部实体或多了一个。还有一个细节数据流两端必须是有意义的连接箭头不能悬空也不能自己指向自己。提示画之前先看画布左侧的图例头歌不同实验的符号可能有细微差别按它给的来不要凭记忆画。2.2 命名这件事比画线更容易丢分我见过太多人图形结构完全正确就因为名字起得随意被打回。命名规范是数据流图里最容易忽视、又最容易被扣分的部分值得单独拎出来说。加工的名字必须是“动词 宾语”这是铁律。“处理”“加工”“操作”“模块”这种词一律不合格因为它们没有说清楚到底做了什么。正确写法是“录入借书信息”“核对身份”“生成账单”。评测系统里如果带了关键词校验像“处理数据”这种名字会直接被标记为“加工命名不规范”。数据流的名字必须是名词或名词短语代表流动的“东西”。“发送”“输入”“传递”这类动词不能做数据流名因为它们是动作不是数据。你想表达“学生把借书请求交给系统”数据流应该叫“借书请求”而不是“提交请求”。外部实体和数据存储的名字也有讲究外部实体用现实中的角色或系统名数据存储用“××表”“××库”“××文件”这种能看出是存放地的名字。还有一个隐藏规则——同一个名字不能同时出现在两种元素上。你不能既有一个叫“学生”的数据存储又有一个叫“学生”的外部实体这样评测系统无法判断你指的是哪一个。注意头歌的客观题里常有一道“下列命名哪个是正确的”选项里往往混着“处理信息”“数据2”“输入”这类干扰项记住“加工动宾、数据流名词、存储带表/库”这三条就能秒选。2.3 分层结构上下文图、0层图、子图的约定数据流图不是一张图而是一组图。一个完整的数据流图模型通常从一张顶层图开始逐层往下拆。头歌的实验经常让你在“顶层图—0层图—1层图”之间来回切换所以层级的命名和编号必须搞清楚。顶层图也叫上下文图Context Diagram它把整个系统当成一个加工有的教材就画一个圆圈编号 0外面挂上所有和系统交互的外部实体以及它们和系统之间的输入输出数据流。顶层图里不出现数据存储也不出现系统内部的细节因为这时候系统还是个黑盒。0层图是对顶层图那个唯一加工的第一次分解。它把系统内部拆成若干主要加工编号 1、2、3……同时把顶层图里的输入输出流分配到这些加工上这时候数据存储开始出现。关键点来了顶层图的输入输出流在 0层图里必须全部能找到对应这就是第一层“父子平衡”。1层图是对 0层图里某个加工的继续分解。比如 0层图里的加工 2“处理借阅”在 1层图里可能被拆成 2.1“验证借阅资格”、2.2“登记借出”、2.3“更新库存”。编号用小数点表示层级2 的子加工就是 2.1、2.2、2.3。继续往下拆就是 2级、3级编号依次加长。这套编号规则看着简单但它直接决定你能不能通过评测。评测系统会检查“父图里编号为 2 的加工其输入输出流是否和子图边界上的流一一对应”对不上就是平衡性错误。下一章我会用一个具体案例把平衡校验的实操过程走一遍。3. 自顶向下逐层分解的完整实操过程概念讲完了这一章进入真正动手的环节。我会拿一个经典的“图书借阅管理系统”当例子把从读需求到画出多层数据流图的每一步都走一遍。你把这套流程套到 educoder 的题目上基本就是照抄作业。3.1 从需求描述里抠出外部实体与输入输出流拿到一段需求描述第一件事不是画图而是抄关键词。把描述里出现的“人/角色”“系统”“数据/信息/单据”三类词圈出来分别对应外部实体、外部系统、数据流。以图书借阅系统为例需求描述大概是“读者向系统提交借书请求管理员审核读者资格系统记录借阅信息并更新图书库存读者归还图书时系统更新库存并生成归还记录管理员可以查询借阅情况。”读完这段话你先做三件事找出外部实体读者、管理员。这两个是系统之外的角色。找出可能的加工提交借书请求、审核资格、记录借阅、更新库存、生成归还记录、查询借阅情况。找出数据流借书请求、资格信息、借阅信息、库存变更、归还记录、查询结果。这一步不需要你判断对错先把素材都捞出来。捞得越全后面画图越不容易漏。我个人的习惯是用一张纸分三列写实体、加工候选、数据候选然后用线把“谁产生谁、谁流向谁”连起来这张草稿就是你画正式数据流图的地基。实操心得需求里凡是出现“查询”“统计”“生成××单”的地方几乎都对应一个或几个数据流凡是出现“如果/当……时”的地方往往是加工说明里的逻辑不要急着在图上画成分支。3.2 画上下文图顶层图的具体步骤与参数上下文图是整个模型的第一张也是最容易画的一张因为它简单到只有“一个加工 若干外部实体 若干数据流”。但正因为简单它的数据流最容易被漏。画上下文图的步骤是这样的在画布中间放一个加工名字就叫“图书借阅管理系统”编号可以标 0。在四周放外部实体左边放“读者”右边放“管理员”。把每一条跨越系统边界的数据流画出来。读者这边进系统的是“借书请求”“归还请求”出系统的是“借阅结果”“归还回执”。管理员这边进系统的是“审核结果”“查询条件”出系统的是“借阅情况”。这里有一个非常重要的原则上下文图里一个外部实体和系统之间的数据流必须是成对出现的“请求—响应”关系不一定严格成对但要有来有往。如果你只画了“读者→系统”的借书请求却没画系统回给读者的结果评测很可能判你缺少输出流。因为一个正常的交互系统不会只收不回。数据流的命名在这一层就要定下来后面 0层图、1层图要沿用这些名字。你如果在上层叫“借书请求”下层突然改叫“借阅申请”评测系统会认为这是两条不同的流平衡检查直接挂掉。所以命名一次定好全模型统一这是我踩过的最深的坑之一。3.3 0层图的分解与父子平衡校验0层图是重头戏。你要把顶层图里那个大加工拆开同时保证拆完之后边界上的数据流和顶层图完全一致。接着图书借阅的例子我把系统拆成三个主要加工1“借阅办理”、2“归还办理”、3“借阅管理”。然后分配数据流加工 1 借阅办理输入“借书请求”输出“借阅结果”需要读“读者信息表”核对资格写“借阅记录表”。加工 2 归还办理输入“归还请求”输出“归还回执”更新“借阅记录表”和“图书库存表”。加工 3 借阅管理输入“查询条件”输出“借阅情况”读“借阅记录表”。现在做父子平衡校验方法是逐条核对顶层图的每一条流顶层图数据流方向在0层图中对应的加工是否平衡借书请求读者→系统加工1 输入是借阅结果系统→读者加工1 输出是归还请求读者→系统加工2 输入是归还回执系统→读者加工2 输出是审核结果管理员→系统加工1 或单独加工视拆分而定借阅情况系统→管理员加工3 输出是这张表就是平衡检查的核心工具。只要有一条顶层流在 0层图里找不到“落脚点”平衡就不成立。反过来说0层图里也不能凭空多出一条顶层图没有的、跨越系统边界的流。注意“跨越系统边界”这几个字——0层图内部加工之间、加工和数据存储之间的流是可以新增的那不叫不平衡那叫分解。提示educoder 判平衡时往往只看“顶层图的外部输入输出流”和“0层图边界流”是否一一对应。你在画的时候可以把顶层图的流列表贴在旁边画一条勾一条。3.4 再往下分解1层图与数据字典的配合如果题目要求继续分解比如把加工 1“借阅办理”拆开那就进入 1层图。加工 1 在 1层图里变成三个子加工1.1“验证读者资格”、1.2“登记借出”、1.3“更新库存”。这时候仍然是同样的平衡规则加工 1 在 0层图里的输入“借书请求”、输出“借阅结果”以及它和“读者信息表”“借阅记录表”之间的流都要在 1层图的边界上原样出现。这里会出现一个新手常犯的错误把 0层图里加工 1 与数据存储之间的流在 1层图里“重新分配”给了某个子加工而不是让子加工去读写数据存储。这在某些情况下是可以的但前提是 0层图里那条流本身就要体现在 1层图的边界上或者能被合理的内部流替代。判断标准还是那句话看父图的边界流有没有在子图里落实。数据字典在这一步开始发挥作用。图上出现了“读者信息表”“借阅记录表”“图书库存表”这些数据存储数据字典就要给出每个存储的数据项组成比如“读者信息表 读者编号 姓名 学号 借阅权限”。数据流也可以进数据字典比如“借书请求 读者编号 图书编号 请求时间”。educoder 的数据字典题一般是客观题形式给你定义让你判断正误或者让你补全某个条目。数据字典的符号约定要记牢考频很高表示“定义为”如借书请求 读者编号 图书编号表示“与”即各项都出现[ | ]表示“或”在括号内选一个如状态 [已借 | 可借]{ }表示“重复”如借阅列表 { 借阅记录 }( )表示“可选”如备注 ( 说明 )把这几个符号背熟数据字典的客观题基本就是送分。而它对作图题的帮助在于当你拿不准某条数据流该包含哪些内容时翻一翻数据字典往往能反推出这条流应该连到哪个加工或存储上这个技巧我在第 6 章还会细讲。4. educoder 平台上机实操一次完整的答题记录纸上谈兵结束这一章还原一次真实的上机过程。我把读题、画图、自查、提交、被打回、再改的整条链路都记下来你可以对着自己的操作比对看是哪一步出了问题。4.1 题目读法与打分点拆解头歌的作图题一般会给你三段东西任务描述一段业务需求、任务要求明确要画到第几层、有几个加工、评测说明告诉你判分点。很多人只读第一段就开始画这是大忌后两段才是决定你能不能过的关键。任务描述负责给素材任务要求负责划范围。比如要求里写“请画出该系统的 0层数据流图加工数量不超过 5 个”那你就老老实实拆 3 到 5 个加工别硬拆成 8 个拆多了不合规拆少了覆盖不全。评测说明里如果写“检查父子平衡、检查元素类型、检查命名规范”那你提交前就按这三项逐一过一遍。我的做法是把任务要求抄在便签上画的时候随时瞄一眼。特别是“画到第几层”这一条很多人画了 1层图但题目只要 0层图结果多画的部分反而被判为结构错误。范围意识比画图技巧更重要。4.2 画布操作与提交前的自查清单头歌的画布操作和大多数在线绘图工具差不多左侧图例拖图形选中元素可以改名拖动端口连线线上可以加标注。几个操作层面的坑要提醒一下。第一连线时注意端口吸附。你看着是连上了实际可能只连了个“边框”没吸附到端点提交后系统识别成悬空线。连完一条就拖一下图元看线是不是跟着走跟着走才是真连上。第二改名字要改对元素。有时候你双击的是线改的却是名字标注结果元素本身还叫“矩形1”。提交前挨个点一遍所有图元确认名字都改过了。第三层级编号别偷懒。加工不写编号评测无法判断层级关系很可能直接判结构缺失。我一般画完先给加工编号再连线这样心里始终有张层级表。提交前我固定跑一遍自查清单外部实体是否都是矩形、加工是否都有动宾名字和编号、数据存储是否都是开口矩形、数据流是否有名字和方向、父子图的边界流是否一一对应、有没有多余的悬空线。这六条查完再点提交通过率能高一大截。4.3 一个具体案例教务选课系统的 DFD 落地光说图书借阅可能不够我换个案例——教务选课系统把 0层图的完整落地过程再走一遍你可以拿它当模板。需求学生选课、退课教师录入成绩教务员维护课程信息学生和教师都能查询课表。先抠元素外部实体是学生、教师、教务员数据存储候选有课程表、选课记录表、成绩表、课表加工候选有选课处理、退课处理、成绩录入、课程维护、课表查询。接着拆 0层图的加工我拆成四个1“选课与退课”、2“成绩录入”、3“课程信息维护”、4“课表查询”。然后分配流加工 1输入学生的“选课请求”“退课请求”输出“选课结果”“退课回执”读写“选课记录表”读“课程表”判断容量。加工 2输入教师的“成绩数据”输出“录入确认”写“成绩表”。加工 3输入教务员的“课程信息”输出“维护结果”读写“课程表”。加工 4输入学生/教师的“查询条件”输出“课表”读“选课记录表”“课程表”“成绩表”。画完再回顶层图核对顶层图里学生进系统的是“选课请求/退课请求/查询条件”出系统的是“选课结果/退课回执/课表”教师进的是“成绩数据/查询条件”出的是“录入确认/课表”教务员进的是“课程信息”出的是“维护结果”。逐条比对 0层图全部能找到对应平衡成立。这个案例里有个细节特别容易被评测挑出来加工 1 同时处理选课和退课读写了“课程表”和“选课记录表”那这两条读写流在图上必须画全。有人只画了“选课记录表”忘了“课程表”认为课程表是加工 3 管的跟加工 1 没关系。但只要加工 1 需要判断课程容量它就必须读课程表这条流不能省。判断某条流该不该画的标准不是“这个数据归谁管”而是“这个加工有没有用到它”。5. 常见问题与排查技巧实录前四章是正向流程这一章讲反向排查。我在头歌上被打回的那些次问题基本集中在下面这几类整理成可查的清单你遇到红叉时直接对号入座。5.1 平衡性错误的排查方法平衡性错误是数据流图里出现频率最高的判错项也是最难看出来的。因为它不是说某条线画错了而是说两张图之间对不上。排查方法我总结成一句口诀先看边界再看方向最后看名字。先看边界。把顶层图所有跨越系统边界的流列出来再列 0层图所有边界流两边数量必须一致。多了少了都是错。再看方向。同一条流在顶层图里是“读者→系统”在 0层图里却变成了“系统→读者”这就是方向错误。方向错比数量错更隐蔽因为你肉眼扫过去流是有的只有逐个比方向才能发现。最后看名字。前面提过同一条流在两层图里必须同名。有人上层叫“借书请求”下层叫“借阅申请”系统判定这是两条不同的流于是同时报“缺少借书请求”和“多出借阅申请”。这种错最冤但只要养成“命名一次定死”的习惯就能避免。实操心得我在画 0层图之前会把顶层图的流复制到一个临时文本框里画完一条划掉一条全划完再检查有没有剩余这个方法几乎能杜绝平衡性错误。5.2 黑洞、奇迹、灰洞的识别这三个词听起来玄乎其实是数据流图里对“加工”的三种典型缺陷的俗称educoder 的客观题特别爱考。黑洞只有输入没有输出的加工。数据进去了出不来好像被黑洞吞了。比如“审核申请”只接了“申请单”却没有输出“审核结果”这就是黑洞。任何加工都应该有输出否则它存在的意义是什么奇迹只有输出没有输入的加工。数据凭空产生不科学。比如“生成账单”没有任何输入却直接输出账单那账单的数据从哪来这类加工要么缺了输入流要么应该直接连到某个数据存储作为来源。灰洞有输入也有输出但输出无法由输入推导出来相当于偷偷加了料。比如“计算总价”输入是“单价”输出却是“总价”中间少了“数量”这个输入输出对不上输入就是灰洞。识别这三类缺陷的方法很机械对每个加工检查它的输入流能不能推出它的输出流。推不出来就找问题。我考试时习惯给每个加工画一个“输入集”和“输出集”两边比一比黑洞和灰洞基本一眼看穿。5.3 命名与符号类错误的速查表命名和符号错误属于“低级但高频”整理成表最省事。下面这张表可以直接当提交前的检查清单用。错误类型典型表现正确做法加工命名不规范叫“处理”“模块”“功能”用动宾结构如“录入成绩”数据流命名不规范叫“发送”“输入”“数据1”用名词短语如“成绩单”元素符号混用外部实体画成开口矩形外部实体用矩形数据存储用开口矩形编号缺失加工没有 1、2、3 编号每层加工都要有对应层级编号跨层同名同一流在两层名字不同一次命名全模型统一悬空连线箭头没接上任何图元连线后拖动图元确认吸附出现控制流画了“如果……则……”分支判断逻辑放进加工说明图上不画这张表里我划重点的是最后一条。很多同学在其他课程里画惯了流程图一画 DFD 就手痒加上判断分支结果被扣分还觉得自己画得更详细。记住数据流图表达的是数据变换不是流程控制判断逻辑归加工说明管。6. 一些更省力的做法与经验总结前面讲的都是“怎么把图做对”这一章聊点“怎么做得更快”。这些技巧不是标准答案是我自己摸索出来的用熟了能省下不少重复劳动。6.1 用数据字典反推数据流当你卡在“这条流到底该连到哪”的时候翻数据字典往往比盯着图看更有效。因为数据字典里定义了每个数据项的组成而数据流的组成决定了它必须从哪里来、到哪里去。举个例子你有一条流叫“借阅记录”数据字典里写“借阅记录 读者编号 图书编号 借出日期 应还日期”。那么这条流的产生必然需要一个能拿到“读者编号”“图书编号”“日期”的加工——“登记借出”正好满足。而它的去向要么是数据存储“借阅记录表”要么是输出给某个查询加工。顺着数据字典往回推流的上下游就清楚了。这个方法的本质是数据流的名字不是随便起的它背后有确定的字段组成字段决定来源和去向。educoder 如果同时考了数据字典题那它其实是在给你提示你可以拿字典的定义去校验自己的图。提示如果题目没给数据字典你可以自己简单列一份哪怕不写进答案也能帮你理清哪些流是必要的、哪些是多余的。6.2 从手工练习到上机一次性通过最后分享几个我在练习阶段总结的习惯适合准备考试或者刷头歌关卡的同学。第一先用纸笔把顶层图和 0层图画出来再上机。纸上改起来快画错了划掉重来就行上机改图要拖来拖去效率低还容易把已经连好的线弄乱。我一般纸上定稿上机照着摆基本一次成型。第二给每个加工作一份“输入输出小卡”。就是每个加工写一行输入有哪些流、输出有哪些流、读写了哪些存储。全部写完再统一连图。这样能保证没有黑洞和灰洞也不会漏掉读写流。第三练手时别只练一个系统。图书借阅、教务选课、银行取款、医院挂号、外卖下单这几个是软件工程导论里的经典案例翻来覆去就是那几种结构。把其中两三个画熟再遇到新题目你会发现套路是相通的先找实体、再定分层、最后填流。真正变化的是业务名不变的是分解逻辑和那几条平衡规则。第四善用课程设计的机会。不少同学做毕设或课设时也要画 DFD那时候需求是自己写的更容易画歪。你可以反过来练先把自己系统的数据字典列出来再根据字典反推数据流图最后拿平衡原则验一遍。这套流程走顺了导论课的实验和后面的课设就能一次性打通不用学两遍。我自己在这门课里最大的体会是数据流图这东西技巧占三成规范占七成。画得漂亮没用守规矩才有分。把四类元素的符号、命名规则、分层编号、父子平衡这四件事刻进肌肉记忆剩下的就是拿案例多练几遍练到看见一段需求就能条件反射地拆出实体和加工这一关就真的过了。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门