news 2026/10/5 5:29:03

S/4HANA FICO Coding Block客户化字段增强:从结构到报表的完整排查指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
S/4HANA FICO Coding Block客户化字段增强:从结构到报表的完整排查指南

2025年还在做的SAP S/4 HANA FICO全套项目越来越多,按理说给Coding Block增加客户化字段这活儿属于标准能力外的基本功,但恰恰是这种“简单需求”最容易把人磨疯。我在项目里已经不止一次遇到:字段加了,界面找不到;界面有了,过账不落库;落库了,报表又看不见。更气人的是,每一个环节单独拆开都不难,组合在一起就成了排查一整天的深坑。今天把我在S4 codingblock客户化字段增强上踩过的这些小问题,以及对应的排查思路完整梳理一遍,供正在做同类增强的同行参考。

1. 先搞清楚S/4里Coding Block扩展的正规路径,别在ECC老路上硬走

1.1 COBL附加结构:还能用,但S/4里至少要挂对层级

Coding Block这个概念,从ECC时代过来的人都熟。它就是财务凭证里那组“可用于客户化分配”的字段集合,平时挂在COBL这个通用结构上,FB50、F-02、F-29这些录入界面都会把它当作编码块来处理。

ECC时代最经典的做法,是在COBL结构下面加一个Append Structure,比如ZCOBL_CUSTOM,把你要的客户化字段挂进去。然后通过CMOD的BADI去赋值,或者直接在屏幕增强里读取。这套逻辑在S/4HANA里并没有被抛弃,但有个关键点很多人会忽略:附加结构一定要挂在COBL上,而不是挂在老教程里写的CI_COBL上。

CI_COBL是ECC某些项目为了统一客户化字段而引入的“壳结构”,在S/4里它的作用远没有以前那么可靠。我在一个项目上接手的时候,前任顾问把字段append到了CI_COBL,结果F-02里怎么都调不出来,结构激活也报警告。后来把这个Z结构从CI_COBL上拆下来,重新挂到COBL上,界面问题就解决了大半。这种差异文档里写得很含糊,但实际影响非常直接。

另外,S/4里做附加结构时,字段类型和长度要格外小心。Coding Block的字段会被很多程序引用,如果你加了一个类型不适合的字段,比如在金额类上下文里塞了个CHAR100,激活时很可能出现“表字段不一致”之类的提示。并且,凡是能加到COBL上的字段,一定要记得同步激活它所属的数据元素域,否则后面建BADI时赋值逻辑可能因为类型不匹配被直接忽略。

1.2 BADI FI_CODING_BLOCK_ACC与FI_CODING_BLOCK_PL:填充逻辑的入口

只加结构,字段只是个空壳。真正往Coding Block客户化字段里塞值的,是那两个老牌BADI:FI_CODING_BLOCK_ACC和FI_CODING_BLOCK_PL。

FI_CODING_BLOCK_ACC主要管资产负债类科目和普通费用科目的Coding Block填充,FI_CODING_BLOCK_PL管利润分析相关的编码块填充。很多人在S/4里以为只要一个增强就够了,但实际要根据你的字段使用的科目类型去决定实现哪个、还是两个都实现。

这里有一个常见的误区:在SE18里把实现类建好了、代码也写了,但就是触发不了。原因多半是增强点的实现是“空实现”,或者你在做增强时把filter条件配错了。FI_CODING_BLOCK_ACC在调用时会传入T_CODE、BUKRS、CALL_TYPE等参数,如果你在这些参数上加了限制,比如BUKRS = '1000',那公司代码1000以外过账就完全不会进入你的逻辑。排查时看一眼filter和参数条件,往往比反复改代码有效。

还要注意S/4HANA版本差异。2020之前的版本和之后的版本,对BADI调用链路的支持有一些细微差别,部分界面已经迁移到RAP应用上,比如Fiori的“管理日记账分录”等App,走的不再是传统GUI里的那套调用点。你如果只测了SAP GUI事务代码,没测Fiori,很容易误判BADI没生效。

1.3 In-App扩展字段:省事,但别指望它能解决所有界面问题

S/4HANA里主推的扩展方式是“Custom Fields”这类In-App扩展,在Fiori里用“自定义字段”应用,直接在业务上下文上添加字段,系统会自动生成附加结构、数据库字段,甚至自动接到部分应用界面。

这套机制对纯Fiori场景很友好,字段加完,App里刷新一下就能在“自定义字段”页签里看到。但我们做Coding Block增强的场景里,它有两个天然的局限。

第一,界面摆放位置是固定的。你没法把字段精确地插到“利润中心”“订单”这些标准字段旁边,只能在“自定义字段”区域里出现。对于财务用户来说,每次录凭证都要切到另一个页签去维护客户化字段,体验很差,很多项目验收这一关就过不去。

第二,标准“Custom Fields”框架的发布范围是受业务上下文限制的。你发布给“日记账分录”上下文,不等于FB50的Coding Block区域里就会自动出现。老GUI事务的交互式屏幕,并不像Fiori那样天然支持扩展字段热插拔。

所以我的建议是:如果甲方对界面位置和交互校验有明确要求,不要纠结于纯In-App扩展,老老实实“COBL结构 + BADI赋值 + 必要的屏幕增强”一条龙。如果只是需要在后台记录一个参考字段、不强求界面位置,那用扩展字段框架能省很多事。两条路各有适用场景,选型本身也是项目里最容易出现分歧的地方。

2. “字段加了界面看不到”的排查过程

2.1 症状:F-02 Coding Block区域没有输入框

我遇到的一个典型项目需求是这样的:在F-02过账的Coding Block里增加一个“内部申请单号”ZZAPPLNUM,用于后续对账和报表追溯。按照老经验,我先把COMPUTED_ZZAPPLNUM挂到了COBL,激活成功,然后写BADI,结果测试时打开F-02,Coding Block区域里根本找不到ZZAPPLNUM这个输入框。

当时的第一反应是屏幕配置问题,于是去SPRO里找“Coding Block”的屏幕变式,翻了半天发现S/4的Coding Block屏幕已经不是简单的字段隐藏/显示配置能覆盖的。它不只是“把这个字段放开显示”的问题,而是这个字段压根没有被屏幕程序绑定进去。

这种症状最迷惑人的地方在于:结构激活完全正常,SE11里也能看到ZZAPPLNUM在COBL里,BADI代码也写了,但屏幕上就是没有。做财务增强的人如果经验不足,很容易在“是不是需要额外配置”这个方向上绕弯路。

2.2 排查链路:从数据结构到子屏幕

遇到这种情况,我建议按下面的链路一步步查,不要跳步。

第一步,确认字段确实挂在COBL上。进入SE11查看COBL,展开组件列表,如果里面没有你的Z结构,或者Z结构字段是红色的未激活状态,那问题还在数据字典层面。这里特别提醒:结构激活后一定要留意激活日志,如果出现“已激活但存在非活动子对象”这种提示,后续引用时大概率会出问题。

第二步,看屏幕子程序。F-02这类凭证录入事务,Coding Block区域是由多个子屏幕构成的,通常位于函数组SAPLFKMP或相关屏幕增强中。你需要判断你的字段是否被屏幕的字段池捕获。如果在屏幕Painter里根本没有这个字段,那只改结构当然不会显示。

这里要说明一点:S/4里直接改标准屏幕的做法,传输和升级风险都高,我不推荐一上来就动标准屏幕。更可控的做法是用屏幕增强BADI,比如AC_ACCOUNTING_SCREEN_ACC,在运行时把字段附加到行项目屏幕上。这个BADI在S/4里仍然可以工作,但实现方式比ECC要复杂,需要你在方法里维护好字段的可见性和输入状态。

第三步,验证运行时的字段目录。你可以在F-02界面打开字段选择(通过“编辑”菜单里的字段选择或BOPF配置应用),看ZZAPPLNUM是否在可选字段列表里。如果字段已经出现在可选列表,只是没有默认显示,那属于布局配置问题;如果字段连选都选不到,说明屏幕程序没绑定进去。

2.3 屏幕增强的落地办法:AC_DOCUMENT系列增强

在实际项目中,我最后是用了BADIAC_ACCOUNTING_SCREEN_ACC才把ZZAPPLNUM在行项目屏幕上显示出来。这是S/4下财务凭证行项目屏幕增强里比较正统的出口。

它的思路是:在BADI实现类里拿到当前的屏幕字段对象,把你自定义的字段“塞”进屏幕结构,并控制它的显示属性和输入状态。因为Coding Block里的字段会被带到行项目、甚至被后续的科目分配使用,所以在做屏幕增强时一定要注意:字段是“纯显示”还是“可输入”,以及它在抬头、行项目、Coding Block三个层面的状态是否一致。

这里有个容易忽略的细节:很多财务凭证录入界面,Coding Block区域所展示的字段来自一个内部“屏幕字段池”,这个池子并不是每次打开都重新从DB读一遍,而是复用会话的字段状态。所以如果你在测试时只是改了代码、重新激活,却没退出整个事务重新进入,经常会出现“还在用旧界面”的假象。我遇到不下三次这种情况,最后都是让用户全部注销重登才真正看到新字段。

如果连AC_ACCOUNTING_SCREEN_ACC也不想碰,还有一个取巧的办法:在Coding Block里用现有标准字段“改名”使用。比如用ZZ*开头客户化字段无法显示时,有些项目就把字段塞进标准的参考字段里。这个方案只适合快速应急,长期维护一定会埋雷,不建议学。

2.4 一个小提示:传输请求和激活顺序

界面增强这种改动,往往涉及多个传输请求:数据字典层的结构请求、BADI实现类的请求、屏幕Painter或运行时增强的请求。如果你的传输顺序反了,比如结构请求还没释放,屏幕增强已经释放到下一套系统,目标系统很容易出现激活失败。

我的习惯是:在开发系统里先把结构、BADI、屏幕增强全部做完并完整测试通过,再一次性释放到同一传输链。这样能减少很多“字段到了测试机但BADI没到”的割裂问题。释放顺序上,先释放数据字典对象,再释放ABAP程序相关对象,最后释放屏幕相关对象,这个顺序虽然不是100%强制,但在S/4里有很多隐含依赖。

3. “界面有了字段却不落库”的坑:问题多半在BADI

3.1 增强点没被调用:先断点,再猜原因

界面问题解决后,下一个坑接踵而至:字段在界面上能输入了,但过账完成后去查BSEG或ACDOCA,ZZAPPLNUM字段是空的。

这种问题第一反应肯定是BADI赋值逻辑有问题。但你要分清楚是“BADI根本没被调用”还是“调用了但没正确赋值”。

判断方法很简单:在实现类的方法里打一个外部断点,然后去F-02做一张凭证。如果断点根本不停,说明你的BADI实现没有被激活,或者这个调用点根本没有把你这个实现类拉进来。常见原因有:

  • 增强实现类处于“非活动”状态,或者增强Spot没有“启用”。
  • 你实现的是FI_CODING_BLOCK_PL,但测试科目的P&L标识和利润分析配置让它没走PL分支,而是走了ACC分支。
  • S/4版本的界面调用链里,这个BADI本身就不触发。比如某些Fiori App记账时根本不会调用传统编码块BADI。

如果断点能停住,但执行完看字段还是空,那就进入下一步查赋值逻辑。

3.2 参数写错结构:赋值没写回CBL

FI_CODING_BLOCK_ACC的接口参数里,最核心的是CBL,它是Coding Block字段的结构,类型是COBL。很多人实现的时候,会在方法里读CBL的字段,但赋值时却没有把值写回CBL,而是写进了某个局部变量,或者写到了CBL_TCBL里,然后代码结束了,系统自然拿不到你赋的值。

我见过一段很典型的“看似没毛病”的代码,逻辑是这样的:

METHOD if_ex_fi_coding_block_acc~change_coding_block. DATA: lv_appl TYPE zzs_cbl-zzapplnum. IF cbl-bukrs = '1000'. lv_appl = 'ABC123'. ENDIF. ENDMETHOD.

这段代码的问题很明显:lv_appl是局部变量,赋值完就丢了,CBL里的ZZAPPLNUM根本没动。

正确做法是直接改CBL结构的字段:

METHOD if_ex_fi_coding_block_acc~change_coding_block. IF cbl-bukrs = '1000'. cbl-zzapplnum = 'ABC123'. ENDIF. ENDMETHOD.

这里特别提醒,CBL参数类型是COBL,它包含标准字段和你的附加结构字段。你只有在结构增强正确挂到COBL上的前提下,才能用cbl-zzapplnum访问到它。如果结构没挂对,即使BADI被调用,编译器也可能报“ZZAPPLNUM不是CBL的组件”的错误。

3.3 账表扩展:BSEG_ADD / ACDOCA_ADD不能少

第三个导致不落库的原因,很多人会忽略:Coding Block的字段并不等于BSEG或ACDOCA的字段。

在S/4HANA里,财务凭证的主数据最终会写进ACDOCA,但Coding Block作为一个“输入载体”,它的字段能不能跟着一起落库,取决于行项目表有没有对应的扩展字段。你只在COBL上加了ZZAPPLNUM,BSEG/ACDOCA里没有它,过账时这个值根本无处安放。

解决方式是在BSEG和ACDOCA对应的扩展结构上也挂上这个字段。S/4里常用的扩展结构包括BSEG_ADD、ACDOCA_ADD等。字段挂完之后,再通过BADI或者在标准的“编码块到账表”价值流中把CBL字段的值映射过去。

当然,很多情况下这一步并不是纯手工的。SAP在S/4里提供了一些自动映射机制,但它的生效前提是字段命名、类型都满足约定。如果你用的是ZZ*开头,并且结构挂载正确,大部分场景下系统会自动带过来。但我的建议是不要完全“彼信于自动映射”。在项目测试阶段,先做一张简单凭证,用SE16N直接查ACDOCA里该字段的值,如果为空,再检查是否需要在BADI里额外写映射逻辑。

3.4 验证数据转换:不只是“有值”就算过

即便字段落库成功了,也还有一层很烦人的问题:你填充进来的值,可能在Coding Block传递时被某些逻辑清空或覆盖。

比如S/4在过账时,某些业务场景(比如跨公司代码、内部订单结算、资产购置后资本化)会重新初始化部分Coding Block字段。你的自定义字段如果没有在后续的处理链中被保留,就会出现“录入时看到值,但报表里没值”的情况。

所以测试时不要只测最简单的F-02直接过账,还要测几种典型场景:

  • 标准采购订单的发票校验MIRO,Coding Block字段是否会自动带入。
  • 总账科目分配和内部订单结算时,字段是否被覆盖。
  • 跨公司代码/跨业务范围过账时,字段是否被清空。

这些场景往往才是生产环境里真正会爆雷的地方。在开发环境只测一种成功路径,是远远不够的。

4. 报表和Fiori里看不到自定义字段,这是S/4另一层课

4.1 经典报表ALV字段目录如何把Z字段带出来

当字段终于能录入、能落库了,第三个“小问题”紧接着出现:用FBL3N、FAGLL03这些标准报表去查,自定义字段根本不在列上。

首先我们要明确,这不算异常。标准报表的ALV字段目录是固定的,不会因为你往ACDOCA里加了个字段就自动多出一列。想让字段出现在报表里,有几个层面要做:

第一,字段目录层面。很多标准报表的字段目录来自配置或程序内定义的L_FCAT,你需要把自定义字段追加进去。如果报表提供了“布局”设置,你可以在布局管理里手动加入该字段。问题是标准布局通常不允许用户随便添加未发布的字段。

第二,如果是你自开发的报表,那很简单,在ALV的FIELDCAT里追加字段即可。但要注意,S/4新账表架构下,查询ACDOCA时,很多Z字段已经可以通过ACDOCA直接select到,不一定需要JOIN回BSEG。

第三,对于SAP标准报表,比较省事的做法是通过“扩展字段发布”机制。S/4里有一个“自定义字段”框架,现在不少标准Fiori报表和部分GUI报表都支持动态字段发布。字段发布完成后,用户可以在报表设置里把Z字段拖出来。但如果你想在标准FBL3N里强制显示,可能还是要动手改报表或做增强。

有一种观点认为,既然ACDOCA都存了字段,标准报表就该能显示,这其实是把S/4想简单了。S/4的字段扩展框架和经典ALV字段目录是两套逻辑,中间没有全自动的桥。

4.2 Fiori自定义字段发布:做完保存只是第一步

如果你的用户用Fiori的“管理日记账分录”之类的App,那有一条独立的路要走完:发布自定义字段到对应App。

具体流程大致是:

  1. 在Fiori的“自定义字段”应用里找到对应的业务上下文,比如总账日记账分录相关上下文。
  2. 添加你的ZZAPPLNUM字段,并选择“发布”。
  3. 发布完成后,进入目标App的“自定义布局”或“个性化”设置,把字段拖到表格或明细区域。
  4. 保存个性化设置,最好再做一次角色权限刷新。

这个流程里,最容易漏的是第三步。很多人发布完字段就以为App里自动会出现,结果打开App,表格里仍然没有。原因就是该App本身没有启用这个字段的显示,或者当前用户没有个性化权限。

另外,Fiori的发布对象是有版本的。如果你的字段在发布后又改了标签或长度,已经发布的App可能需要重新发布一次才能同步新标签。这个也是项目里容易扯皮的点,建议字段模型稳定后再发布,避免反复调整。

4.3 权限和角色:容易被忽略的“小问题”

自定义字段在报表和Fiori里显示不出来,还有一种跟增强本身无关的原因:权限。

在S/4里,字段级别的权限控制比ECC更细。用户如果缺少对应授权对象,可能在报表字段选择里面根本看不到这个字段,或者在查询时字段值被自动遮断。

遇到报表里缺字段,不要只盯着代码层面,还要让系统管理员查一下角色里的字段级权限配置。特别是涉及生产、成本、利润分析相关字段时,F_ACCOD、K_ACCOD这类授权对象可能都要放行。

我碰到过一个案例:开发环境一切正常,测试环境某个用户就是看不到Z字段,最后发现是测试角色没有刷新,角色分配里根本没有新的授权对象。这种问题排查起来很耗时间,但它真的就是“小问题”——普通权限刷新即可解决。

5. 一张速查表和一个先做原型的好习惯

5.1 添加Coding Block客户化字段的完整步骤清单

踩过这么多坑之后,我把一套相对稳的步骤整理成了清单,现在做S/4 FICO项目里再遇到这类需求,基本按这个顺序推进:

  1. 先和业务确认字段的使用位置:在录入界面是否必须输入,在报表里是否必须显示,是否需要进ACDOCA用于报表透视。
  2. 在COBL结构下挂新增结构,所有客户化字段都用ZZ*开头,避免和标准字段冲突。
  3. 按需将字段挂到BSEG/ACDOCA的扩展结构(如果确认要落库到行项目)。
  4. 使用SE18检查FI_CODING_BLOCK_ACC和FI_CODING_BLOCK_PL,根据科目类型决定实现哪个或两个都实现。
  5. 在BADI实现类中,用断点验证方法确实被调用,并用正确的CBL结构赋值。
  6. 如果需要显示在老的GUI录入界面,使用屏幕增强BADI把字段绑到Coding Block区域。
  7. 做完整测试:覆盖FB50、F-02、MIRO开发校验等至少三种过账路径,每种路径都验证值进入ACDOCA。
  8. 针对自开发报表或标准报表,判断是否需要追加ALV字段目录或发布Fiori自定义字段。
  9. 最后统一释放在一起,传输到QA后做集成测试,测试角色权限刷新。

这套流程看上去有些冗余,但它能最大程度避免“一步错、步步错”的情况。

5.2 常见问题速查表

下面这个表格是我在项目里反复用到的排查速查表,也分享出来:

症状最常见原因先查什么
字段在界面不显示附加结构挂错位置或屏幕未绑定SE11查看COBL下是否有你的Z结构
字段在有些交易能看到,有些看不到不同交易使用了不同屏幕程序检查目标事务是否走同一屏幕增强BADI
BADI断点不停实现类未激活或调用链变更SE18查看实现类是否有效,排除Fiori路径
字段不落库到ACDOCA缺少BSEG/ACDOCA扩展字段,或赋值未写回CBL过账后SE16N查ACDOCA中Z字段
报表看不到字段ALV字段目录未追加检查报表布局设置和扩展字段发布状态
Fiori App看不到字段自定义字段未发布到App进入“自定义字段”应用检查发布状态
用户无权限看到字段角色未刷新或字段级授权缺失检查授权对象和角色分配

这张表不是为了让你直接抄答案,而是帮你快速定位方向。实际排错时,“先查什么”那一列往往能节省一两个小时。

5.3 原型先行:RAP快速验证vs Hand-code落生产

最后分享一个工作习惯:在正式写结构增强和BADI之前,我建议先用平台自带的扩展字段框架快速做一个原型,让业务用户在原型里确认字段类型、长度、标签、是否必填这些基础信息。

为什么这么做?因为Coding Block增强一旦往结构、BADI、屏幕增强、报表发布这条链路走,改动面大、传输对象多、回归成本高。如果前期连字段定义都没和业务达成一致,后面每改一次都是一整条链路的返工。

原型阶段不需要做屏幕强排列,也不需要写BADI,直接通过In-App扩展把字段加到相关上下文,让业务在Fiori或GUI的“自定义字段”区域里感受一下。业务确认无误后,再决定是直接采用标准扩展字段方案,还是切换到“COBL + BADI + 屏幕增强”的重型方案。

说白了,原型解决的是“做什么”的问题,Hand-code解决的是“怎么放得好看、怎么落得稳”的问题。两者并不冲突,但顺序不能反过来。

如果说还有什么经验值得强调,那就是:S/4里的字段增强,表面上是技术活,实际上每一个“小问题”背后都牵涉到数据字典、过账链路、屏幕框架、报表发布、权限模型这好几层。你在动手加字段之前,最好自己先把数据流从头到尾画一遍,想清楚字段从哪里来、在哪里被修改、最终落到哪张表、通过什么方式展示。画不清楚,就一定会踩坑。这不是吓唬人,是我在“S4 codingblock增加客户化字段”这条路上反复验证过的结论。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/5 5:27:56

AI编程效率翻倍:3个可复用工作流实战指南

1. 为什么“工作流”比“提示词”更值得花时间我见过太多人把 AI 编程的精力全砸在收集提示词上,硬盘里存了几百个prompt.md,真到写业务代码的时候还是一个函数一个函数地手动补全。问题出在哪?提示词解决的是“单次对话质量”,而…

作者头像 李华
网站建设 2026/10/5 5:27:53

中文影评情感分析:RNN模型实战包(含预训练权重与预测接口)

简介:本资源是一份面向自然语言处理初学者与深度学习实践者的电影评论情感分析实战项目,聚焦RNN模型在文本分类任务中的端到端实现,适用于人工智能课程设计、NLP入门实验及模型复现训练场景。压缩包共4个文件,含2个核心Python脚本…

作者头像 李华
网站建设 2026/10/5 5:27:49

PX4 offboard开发全流程实战:从环境搭建到首个自主飞行程序

开头把PX4的offboard开发跑通,是我这几年在无人机方向做过最值得的一件事。如果你在网上搜过“PX4开发”,大概率会看到一堆零零散散的资料:有人讲怎么编译固件,有人贴一段mavros的Python代码,还有人直接扔给你一套仿真…

作者头像 李华
网站建设 2026/10/5 5:27:47

三相逆变器双PI参数调节与短路特性分析

搞三相逆变器的人,早晚都会碰到两个绕不开的问题:双PI控制器参数到底怎么调,以及短路的时候逆变器扛不扛得住。前者决定系统稳不稳、动态快不快,后者决定故障时会不会炸管子、烧电容、跳机。这两个问题看着是两件事,实…

作者头像 李华
网站建设 2026/10/5 5:27:04

用GoDec加速RPCA:低秩稀疏分解在视频前背景分离中的工程实践

前阵子有位做安防监控方向的朋友找到我,问怎么把固定摄像头画面里的行人和车辆干净地抠出来,同时背景保持稳定,方便后续做目标跟踪。我第一反应就是RPCA(鲁棒主成分分析,Robust Principal Component Analysis&#xff…

作者头像 李华
网站建设 2026/10/5 5:24:35

89C52通过IIC驱动0.96寸OLED(SSD1306)完整指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华