在宜搭中,将多张“需求单据”(子单)合并成一张“总表”(主单),通常有两种核心场景和实现方案。请根据您的具体业务需求选择:
场景一:人工手动合并(最常用、最灵活)
适用情况:需要人工审核、筛选哪些单据要合并,或者合并不定时发生。
核心原理:利用宜搭的 “关联表单” 组件 + “业务关联规则”。
步骤 1:设计“总表”表单
新建一个普通表单或流程表单,命名为“需求汇总单”。
添加一个 “关联表单” 组件(关键步骤):
选择“允许选择多条数据”。
过滤条件(可选):例如只展示“状态=待汇总”的单据。
标签:设为“关联需求明细”。
关联表单:选择您的“需求单据”。
数据源设置:
字段映射:配置需要显示在总表中的字段(如需求名称、金额、申请人等)。
添加其他汇总字段(如“总金额”、“总数量”),这些可以通过公式自动计算关联表单中的数据。
步骤 2:配置“业务关联规则”(实现状态更新)
当总表提交后,需要自动把那些被关联的“需求单据”状态改为“已汇总”,防止重复合并。
进入“需求汇总单”的 “业务关联规则” 设置。
新建规则:
触发时机:选择“数据提交后”或“审批通过后”。
执行动作:选择“更新数据”。
目标表单:选择“需求单据”。
匹配条件:
需求单据.ID等于当前表单.关联需求明细.ID。更新内容:将“需求单据”的某个状态字段(如“汇总状态”)更新为“已汇总”。
步骤 3:使用流程
用户打开“需求汇总单”。
点击“关联需求明细”组件,从弹出的列表中选择多张需要合并的单据。
系统自动计算总金额。
提交/审批通过后,原单据状态自动变更。
场景二:系统自动定时合并(自动化)
适用情况:每天/每周固定时间,将特定条件下的所有未合并单据自动打包成一张总表。
核心原理:利用宜搭的 “集成&自动化” (Integration & Automation)。
步骤 1:准备“总表”表单
同上,确保总表中有“关联表单”组件或“子表单”组件来承载明细数据。
注意:如果是通过自动化写入,使用“子表单”可能比“关联表单”更容易处理数据写入(因为关联表单通常用于引用,而子表单用于存储副本数据)。建议根据是否需要保留原始单据的独立性来决定:
若需保留原单据独立存在且可追溯 -> 用 关联表单(但自动化写入关联关系较复杂,通常需配合脚本)。
若只是生成一份存档记录,原单据继续流转 -> 用 子表单 存储数据副本。
推荐方案(使用子表单存储副本):
在“总表”中添加 “子表单” 组件。
在子表单内放置与“需求单据”一致的字段。
步骤 2:配置自动化流程
进入应用管理 -> 集成&自动化。
新建自动化流:
再次循环,将原“需求单据”的状态更新为“已汇总”。
模块:创建“需求汇总单”。
字段映射:将处理好的数组变量填入“子表单”字段。
同时可以填入汇总后的总金额等。
遍历查询到的所有单据数据。
将每条数据的字段映射到一个数组变量中,格式需符合“子表单”的数据结构。
模块:查询“需求单据”。
过滤条件:
汇总状态等于未汇总且日期等于今天。触发器:选择“定时触发”(例如:每天 18:00)或“数据触发”(当满足特定条件时)。
动作 1:查询数据。
动作 2:数据处理 (循环)。
动作 3:创建数据。
动作 4:更新原数据(可选)。
场景三:在流程中动态合并(高级)
适用情况:在审批流程的某个节点,审批人决定将手头的几个单据合并。
在流程设计的某个节点(如“部门经理审批”)。
该节点的表单设计中包含 “关联表单” 组件(同场景一)。
审批人在处理任务时,手动选择多条待办单据进行关联。
后续节点通过 “业务关联规则” 或 “节点事件” 去更新原单据状态。
💡 核心难点与解决方案
| 需求点 | 推荐组件/方法 | 说明 |
|---|---|---|
| 选择多张单据 | 关联表单组件 | 必须开启“多选”模式。这是最原生的选择方式。 |
| 自动计算总和 | 公式 / JS | 关联表单本身不支持直接 SUM。需在总表加一个数字字段,公式写不了跨组件聚合时,需用 JS (onLoad/onChange) 遍历关联表单数据求和。 |
| 防止重复合并 | 状态字段 + 过滤 | 在原单据加“是否已汇总”字段。在关联表单的过滤条件中设定 是否已汇总 == 否。合并成功后通过规则将该字段改为 是。 |
| 数据同步问题 | 业务关联规则 | 如果原单据修改了,总表里的“关联表单”数据会自动同步最新值(因为是引用)。如果希望总表定格在合并那一刻的数据快照,请使用 “子表单” 并通过自动化复制数据,而不是用关联表单。 |
🚀 快速实施建议(JS 求和示例)
如果您选择了 场景一,并且发现关联表单无法自动计算总金额,请在总表表单设计页,点击 “页面设置” -> “自定义代码”,添加以下逻辑:
// 监听关联表单组件的变化
export function onFieldChange({ field, value, oldValue }) {
// 假设关联表单组件的唯一标识是 'associationField_1'
if (field === 'associationField_1') {
let totalAmount = 0;
// value 是一个数组,包含选中的所有行数据
if (value && value.length > 0) {
value.forEach(row => {
// 假设原单据中金额字段标识是 'amount'
// 注意:这里取的是关联过来的字段值,具体 key 需查看组件配置
const amount = parseFloat(row['amount']) || 0;
totalAmount += amount;
});
}
// 将计算结果赋值给总表的总金额字段 (假设标识为 'total_sum')
this.$('total_sum').setValue(totalAmount);
}
}总结:
想要灵活、人工控制:用 关联表单组件 + 业务关联规则。
想要全自动、定时归档:用 集成&自动化 + 子表单。
想要数据快照(不随原单变化):务必用 子表单 复制数据,不要用关联表单。