案例分享:用 Nocobase 做个标准专业的“销售订单”,以及关系字段的典型用法

先看看结果:
通过两张数据库表来实现,销售订单表,销售订单商品及劳务明细表。
销售订单新增、编辑、保存、删除时,同时影响这两张表内的数据。
这两张表是个整体,缺了谁都不行。
关键知识点:1,关系型字段;2,子表格/子表单;3,触发器。
一,列表销售订单,如下图:
未选择销售订单时的界面:


选择某销售订单时的界面:

二,添加销售订单,如下图:

三,编辑销售订单,如下图:

四,查看销售订单,如下图:

实现步骤:
第一步:建表,建字段,如下图:
建两个表:销售订单表,销售订单商品及劳务明细表


建销售订单表的字段:

建销售订单商品及劳务明细表的字段

要点:
(两个表,行业称之为单据头和单据体;也有称表单和明细、主表和从表、父表和子表…)
1,单据头和单据体分开建表;
2,分开建表后,在单据头表内增加一个“一对多”关系字段,如下图:

3,注意其他的关系字段:单据头上的客户、销售员;单据体上的商品及劳务;
4,(重要说明!)本次设计的销售订单,尚有众多业务需求未满足,但不影响本贴的分享目的,比如:
销售的业绩统计里,可能需要“销售分组”;
销售价格可能需要控制;
销售员或销售组的可销范围可能需要控制;
销售订单明细(表体)里的计量单位,要考虑多计量单位,否则无法面向企业业务;
销售订单明细(表体)里的税种、税率、计法,要考虑情况挺多,否则无法面向企业业务;
销售订单状态、变更…

第二步:建列表区块,如下图:


要点:
1,图中是两个列表区块,上面是表头表的区块;下面是“表体表”的区块;
2,上部的表头列表区块主动“连接数据区块”下部的表体列表区块,实现选择上部时,下部出现表体明细;
3,“用两个列表区块”是不对的!实属无奈,Nocobase 目前无法在一个列表区块内实现多层列表;

第三步:建区块,实现订单新增/订单编辑,如下图:


要点:
1,添加区块 和 编辑区块 可以共用一个表单模板;
2,(重要!)以表头表即销售订单表为主视角,建立表单区块;
3,表单区块内的一对多关系字段“商品与劳务明细”,其字段组件要改为子表格,如下图:

4,针对这个“子表格”,继续配置其字段。
5,一对多关系字段“商品与劳务明细”的字段组件,除了选择子表格外,还可以选择“子表单”,结果如下图:

6,用哪个?子表单?子表格?答案是:
极少数场景下,子表单是更适合的;
99%场景下应该用子表格,但 nocobase 子表格的能力需要补充。

第四步:修缮。
1,将表体的一些数字汇总到表头,如下图:


配置方法,如下图:

2,销售订单编辑时,如果在子表格内删行,实际只是清空了外键,并没有真正的删除数据行,会导致这一行明细数据成为“孤行”,必须解决,如下图:


会造成如下图的孤行:

官方的解释是:
设计功能“允许增加已有数据”,如下图:

实际上,这个说法并不坚固,原因有:
1,至少应该是可以选择真删除还是假删除,因为,绝大多数场景下的表体脱离表头是无意义的;
2,当设置关系字段的删除关系为 cascade 时,删除销售订单会删除所有子表格明细行,这与编辑时删除单行的表现(假删除)不一致。
解决方案:
暂时只能通过在数据库表上增加触发器解决。(工作流能力欠缺,无法实现。)
(触发器知识略,需要请私联。)

主要内容如上,下占一楼总结下 Nocobase 在这一块的相关的能力欠缺。

2 Likes

以下讨论需求及建议,与本贴主题内容相关,不外延:
1,列表区块,目前无法展示多层表格(主表,子表,孙表)。
(在子表内创建反向关系字段后,可以从子表/孙表 出发创建列表区块,可以曲线实现“一行内展示主表、子表、孙表”的内容,但无法解决查看、编辑、添加、删除等问题。)
总之,要以父表的视角创建列表区块,穿透子表列表、孙表列表…要在父表的视角下添加、查看、编辑、删除…

2,子表格,无法选择关系字段的属性值,比如:
销售订单的子表格,有“商品及劳务”字段,希望关联显示商品及劳务的“主单位”、“形态(商品/劳务)”、“来源(外购/自制/客供)”等等。
再比如,在子表格内有商品编码、商品名称两个字段,商品编码字段是选择字段,选定后分别显示商品编码和商品名称。

3,子表格的字段的可选值范围,无法根据关系字段来判断,比如:
销售订单的子表格,有“销售单位”字段,与“计量单位表”是多对一关系,但要受到行内的“商品及劳务”的可用单位的限制。(商品及劳务的可用单位,在商品及劳务表内。)

4,表格、子表格,应该有合计行。
5,表格、子表格的列宽无法拖动,这个肯定不行,全局都要改。
6,所有区块的 label 和 input 都是上下布局,这个并无绝对优势。在众多场景更适合 label 和 input 左右布局。
7,迫切需要 flex 容器、页签(纵向页签、横向页签)来满足多字段表单布局,有些字段应该成组(呈上下、或左右布局的组)。
8,迫切需要设置表单字段的宽度(拖动功能鸡肋)。
9,单据上某些字段需要编码规则,比如单据编号,做成收费插件来卖更合适。(字段类型里的“自动编码”字段是鸡肋)
10,再说一次,“区块模板”急需要管理,至少要排序,分组,禁止重名,修改日期。
11,表单的“联动规则”无法影响子表格,子表格无法设置联动规则,所以子表格的行无法联动计算,这个肯定不行,必须实现。
12,复杂的“联动规则”可以做成“业务规则”商业插件更合适。
13,子表格数据孤行的问题,应该正视并解决。

4 Likes

其实这个功能有的

子表格遇到这种场景适合用关联区块直接关联一个表格区块来处理,但是这个过程目前缺乏子表格的直接编辑功能;

子表格的"关联计算"在最新的1.3.21版本里实现了.

没明白,能指点下吗?这个能力很重要.
(官方的演示范例是通过在业务表单增加字段,设置字段的默认值来处理的,这种方法不行.)

这个真应该修正,参考ORM的标准,基本的聚合根思想有的。主从表这种场景是最核心的场景了。

并没有你期待的那种形态的实现方式,这个问题已经发现且存在很久了,主要是子表格的关联性查询不支持导致的

已经具备 删除和解除关联的操作差异,其实不太需要关注假删除

贴主这种场景是 主从, 从UI上看,肯定是希望做删除,而不是解除关系。

默认的这个表格有删除按钮,是解除关系,如何变成删除?

搞个触发器就好了