ドキュメント目次

配置驱动:字段、编号、模板

本文说明配置驱动系统中字段、编号、模板各自的生效范围与边界:哪些配置厂内可自改并当天生效,哪些改动不会有效果、哪些仍需排期开发。

  • 字段分两套:配置中心存库可改,导入导出为静态文件
  • 按配置生成的列表60+页面在用,表单仅2个,详情为0
  • 编号取号先锁行防重,已修复大小写、假兜底与前缀冲突
  • 打印模板改为从模板表取回渲染,字段映射与页面参数生效
  • 后端字段强制与档案加值目前仅覆盖客户线

15.1 老板要的那件事,和系统真能干的四件事

老陈第一次听人讲这套系统时,只记住了一句话:改口径不用找厂商。

他要的其实很具体。列表里把"含税单价"那列挪到前面,业务员不想天天翻;报价单上的产品规格改成必填,别再有人不填就发出去;工单号想带上前缀;月底导出去给供应商对账的那张表,表头别再来一句"这个字段是你们系统里的英文名"。

这四件事,系统里对应着四样能配的东西:字段、编号、模板,再加状态。状态那一件单独写在第十六章,因为它牵到流转规则,比前三件重。

先把话说在前面,免得读到后面误会:这里不是把"能配"两字夸一遍。 能配的、配了不动的、配了会出事的地方,这一章一处一处划清楚。划清楚了,"改口径不找厂商"这句话才有边界,厂里才知道哪些事今晚就能定,哪些事还得排开发。

15.2 字段这件事,实际上是两套并行

先拆"字段"。翻开配置中心,确实有一个模块配置页,管到十个业务域,每个域下面能改字段的显示名、顺序、必填、显不显示、校验规则、联动动作,还有字段级的可见与可改。这套是存在库里、运行时能改的。

但导入导出用的是另一套:随程序一起发出去的静态定义文件,里面写着哪些列进模板、列名叫什么、类型是什么、值怎么归一。目前只覆盖三类对象——客户、订单、采购订单。

这两套是不是同一个东西?不是,而且写代码的人自己就把这句话写在文件头里了:它们是两套独立体系,各司其职,不必强行合并。

区别不在数量,在脾气。

配置中心那套导入导出那套
存在哪库里,页面上改文件里,跟程序一起发版
谁能改有权限的管理员开发
改完怎么生效前端重新拉一次配置进程重启(读进来就缓存着,没有重载入口)
管什么屏幕上怎么显示、怎么校验表格进出怎么对得上

于是有一条要提前告知实施的人:别指望在配置中心改个字段名,导出表的表头就跟着变了。 那两份清单各记各的,一份改了,另一份不会知道。

15.3 配下去,真生效的是什么

这是全章最该看的一节。系统里有三种按配置长出来的页面:列表、表单、详情。本轮实测的引用面差别很大。

  • 按配置长出来的列表,六十多个页面在用。 工艺路线、工单、四类库房、入库、领料、盘点……这一类是真跑起来了。列宽、顺序、能不能筛,配置改完页面就变了。
  • 按配置长出来的表单,只有两个页面在用,都在客户这条线上。
  • 按配置长出来的详情,一个页面都没在用。 组件写完了,挂在路由上没人打开过。

再看三处更要紧的。

第一,校验以前只长在浏览器里,现在后端也认一份了。 配置里那格必填、那格取值范围、那条正则,过去只在前端翻成表单规则,后端各业务对象的保存接口不读它,只按自己那张表的白名单收字段——绕开页面直接提交,字段级必填和格式就没人管。现在补了一个后端拦截器:保存前拿这份配置再校一遍必填、长度、数值范围、正则。它目前接在客户这条线(新建、更新、建档申请三处保存前都过一道)。其余业务对象的保存口仍按各自表白名单收,还没挂上这道拦截。

第二,字段级权限以前是有表没接线。 库里建了这张表,字段说明也写了能配到"谁能看、谁能改",但后端没有任何一处读它。现在补了一个接口:按模块返回每个字段对各角色的可见、可改、隐藏,前端按当前登录人的角色取这份配置来定字段显不显、能不能改。种子数据里也铺了一组演示配置。它不再是纯摆设了。

第三,配置的缓存以前会咬人。 前端拉过一次配置就存在内存里,代码写了一个清缓存的函数却全仓没一处调用——管理员改完字段配置,正开着的页面看不到变化,得整页刷新。现在接上了:字段配置一保存,会话内那份缓存跟着失效。取配置那一步要是失败,也不再悄悄交回一份"没有字段"的空配置(那会让整张表突然变空),而是把"拉取失败"这个信号带出来给界面提示。

15.4 想给单据加一格,得先知道往哪放

第三章讲过"档案能加值、单据不能加格"。这里补上实现细节,因为它正好是上面两套字段的接口处。

四张档案表——客户、物料、产品、产品资料——各留了一个能装任意键值的格子。用户在配置中心新加一个字段,值有地方落。

但只有客户这条线是通的。后端有一个动作:把提交上来的、表里没有的键,收进那个额外格子里;读的时候再摊平回顶层,交给前端表单。连导入都做了同样的抽取。

物料和产品资料呢?格子和整列白名单在,没有那步抽取。前端要是不显式地把额外值打包送进来,就在白名单门口被丢掉。产品资料只在复制版本时把这一格原样带过去,平时不写。

至于单据:报价、订单、采购、生产任务,根本没有这一格。所以"想给订单加个字段"这件事,无论在哪套配置里点,都变不出来——这是一次加列的开发。第六章那句话在此处仍然算数。

15.5 编号:四件套里做得最实的一件,和三处漏

先说实的。库里给每类单据各立了一条编号规则:前缀、日期格式、序号位数、后缀、是否每天重新从一开数、示例,都能填,页面上能增删改,带权限码,改动进操作日志。

生成函数也不糊弄:取号先锁那一行,两个人同时开单不会拿到同一个号;序号推进后只做数据刷新、不提前提交,回滚时不会留下一个已烧掉的号。这两点是很多自研单号系统真正翻车的地方,这里是做对的。

三处漏也一并说清。

其一,规则码是对字符串,大小写不算同一个——这一处收了。 以前代码里有一处传小写、库里存大写,取号直接抛"编号规则不存在"、那一段又没有兜底。它的位置不轻:首批订单的成品入库后,系统要把这个产品自动同步进产品资料库,同步就断在这一步。现在规则码预置统一成全大写,那条走小写的调用也改成了大写码。更补了一道启动自检:开机扫一遍代码里引用的规则码,跟库内的比,缺哪个就在日志里点名告警(只告警、不拦启动)。

其二,兜底以前有一种等于没写——这一处收了。 有几处取号失败的异常分支,退的那一行调的是同一个函数的同一个规则码,第一次失败第二次必然同样失败,纯属假兜底。这些写法清掉了:现在要么按真规则退、退不成再落到时间戳,要么明着报缺规则。留着的一句实话:退到时间戳那几处,同一天同一秒开两张仍会撞号——它是把"单子开不出来"换成了"号形变了",不是彻底的重号防护。

其三,前缀以前会撞——这一处收了大半。 早先本地库里有三组规则的前缀、日期格式、序号位数完全一样:请购单有条为省事加的别名规则,各数各的号;订单也有一条别名规则;对账单和试制编号干脆共用"同一前缀加同一天加同一位数"。现在别名规则并掉了(请购、订单都统一走正典码,零消费的别名规则删掉),对账单换了新前缀,不再和试制长一个模样。剩一句:改的是规则,不改存量已发出去的那些号。

这两件事后来是怎么被发现要补的?种子文件里留着两句注释:一句"补充,消除随机数",一句"补充,消除剩余取号缺失"。前者说明早年的单号是随机拼的,会撞;后者说明真有过代码调一条不存在的规则。 补是补上了,脾气收住了大半,只剩退时间戳撞号那一条。

15.6 模板:能填一张表,出不来一张纸

打印模板这一件,配置面看着最齐:模板编码唯一,属于哪个模块、启不启用、是不是默认,模板正文是一段网页文本,另有页面参数(纸张、横竖、四边留白)和字段映射(哪一格取单据的哪个字段、明细表取哪几列)。增删改查齐全,权限码单独一个,改动进操作日志。

真到出纸这一步,落点以前不在这里。打开列表页的打印,读的是模块配置里带的那段模板正文——不是打印模板表里的那一条。而三处结构没人接上:页面参数没人读,字段映射没人读,配置里那个"选哪个模板"的编号也没人读。这一处改了。

打开列表页的打印,如今优先按那个编号(或模板 ID)从模板表取回那一条去渲染。取不到或者没启用,直接报错,不再悄悄回退去读模块配置里那段内联正文。走模板表这条路时,字段映射(明细取哪几列)和页面参数都进了渲染。一句边界:没挂模板编号的老页面仍会回退到内联正文——所以"能填也能出"要看那张页到底选没选模板。

于是以前那三处"没人读",走模板表这条路时基本都接上了。

一句判断:打印模板从"能填不能出"变成了"选了模板就能出"。 模板表成了唯一出处,填进去的正文、参数、映射不再是死数据。想把一张真正会打出来的单据格式改掉,从填表到出纸这一串不用再经开发——前提是那张页得先把模板编号选上。

15.7 一条分界线,划在这里

第十六章末尾说过要把这条线完整划一遍,就是这张。

厂里自己改,当天见效: 列表有哪些列、谁在前、能不能筛;字段显示名与顺序;表单里的必填与取值范围(页面拦一道,客户这条线后端也拦一道);字段级的谁能看谁能改(走新接口);打印模板选哪一条及其字段映射;编号的前缀、日期样式、序号位数、是否每日重置;状态显示名、颜色、下拉选项;配完字段配置正开着的页面能即时跟上(缓存会失效)。

改不动,或者改了不出效果: 给单据加一格(没地方存);导入导出的列清单(在静态文件里,改一次发一次版);跨表才能判的卡控(不许调函数、不许查库);非客户那些业务对象的字段强制(后端拦截器还没挂到它们的保存口)。

第三类最容易在实施时扯皮:配置改了不生效这一句投诉,如今剩两条——改的是不被读的那列(非客户线的后端强制)、改的是导入导出那套(在静态文件里)。缓存不生效那一条接上了。

15.8 这一章不做的事

  • 不做低代码平台。 没有拖拽设计器、没有自定义对象、没有把任意表变成业务模块的能力。列表能配,是因为列的骨架是写死的。
  • 不宣称"一处配置处处生效"。 字段两套、模板两处、编号一个字符串码,上面已经逐条摆开。
  • 后端强制目前只接了客户这条线。 字段配置的必填与格式,后端拦截器现在只在客户的新建、更新、建档申请三处生效;别的业务对象还没挂。把这道拦覆盖到全部保存口,是排期里的事,不是设计意图。
  • 不把配置项数量当卖点。 能配多少格不重要,配下去会不会有人听才重要。

15.9 今晚能定的两条

  1. 把"能配的东西"分成两本账。 一本是厂里可自改、改完当天有效的(15.7 左列),指定一个人管,改完在群里说一句"谁改了哪一格";另一本是要提需求的(右列),别让人在配置页上反复点。这一条不花钱,只挡住八成的"改了没生效"。
  2. 单号只认一处。 编号规则是配出来的。以前同一业务两条规则并存、取号还会因大小写断在半路,这些已经收口(别名并掉、码统一大写、开机自检)。留一句规矩:任何单据的号只以开出来那一刻为准,不许手工改。 改一次,后面三套对账逻辑就要多认一种写法。

这一章能定的事就一句:能改的东西是真能改,只是改到哪、谁听、什么时候听见,都得先说清楚。 "改口径不找厂商"这话没错,只是它管的是上面左列那一半。