使用AstroZero文件模板生成合同文档
应用场景
AstroZero低代码平台提供了一个文件模板功能,基于该功能开发者可以根据不同客户设置不同类型的打印模板。例如,用户在商品订单管理系统中,基于商品、价格等信息,自动生成了商品订单列表。在处理完自己的订单后,可以使用模板功能将订单信息同步到合同模板中,生成合同文档,用于签订线下合同。同样,在财务领域,可以使用文档模板来生成定制化的发票和收据。对于需要发送正式邀请的场合,文档模板可以用来创建和打印专业的商务信函。
方案优势
用户可以在服务编排中,通过拖、拉、拽的方式调用文档模板节点、配置模板的输入输出参数,用于生成具体的文档。同时可以将该服务编排包装成开放接口供第三方使用,也可以在AstroZero的标准页面中直接调用供业务用户下载。
约束与限制
用户上传Word文档后(文档中包含使用${参数}定义的文本类型的变量),只能预览该文档模板或生成具体的文档,不能直接在界面上对其进行修改。如果需要,只能在本地更改Word模板样式后重新上传。
目前模板功能只支持生成docx类型的文档模板,并且只支持文本类的变量替换,无法动态替换二维码、图片等内容。
步骤一:创建文档模板场景并配置模板
创建一个模板场景并在场景中添加一个合同模板。在模板场景的配置中,添加文档模板中需要替换的参数。模板场景是一个业务场景的集合,在模板场景中支持创建多个模板,模板之间共享数据结构。
- 创建文件模板场景。
- 在应用设计器的左侧导航栏中,选择“逻辑”,单击 。
图2 单击模板
- 单击“添加模板场景”,设置模板场景的标签和名称,单击“确定”。
图3 创建模板场景
表1 新建模板场景参数说明 参数
说明
示例
标签
新建模板场景的名称,创建后可修改。
取值范围:1~80个字符。
文档模板
名称
新建模板场景在系统中的标识,创建后不支持修改。命名要求如下:
- 长度不能超过64个字符,包括前缀命名空间的长度。
说明:
标识前模糊掉的内容为命名空间,在AstroZero中为了避免不同租户间数据的重名,租户在首次创建应用时需要先定义一个命名空间。一个租户只能创建一个命名空间,创建后不支持修改。
- 必须以英文字母开头,只能由英文字母,数字和下划线组成,且不能以下划线结尾。
docModel
- 长度不能超过64个字符,包括前缀命名空间的长度。
- 在应用设计器的左侧导航栏中,选择“逻辑”,单击 。
- 在“配置”页签,设置模板文件的存储位置,单击“保存”。
图4 设置文件存储
表2 文件存储参数说明 参数
说明
示例
连接器类型
文件存储的连接器类型,当前仅支持“OBS”和“MINIO”两种。在AtroZero中,通过创建OBS、MINIO连接器,可将数据存储到OBS和MINIO中,详细介绍请参见对接OBS云对象存储实例、对接MINIO存储AstroZero对象或资产。
OBS
连接器名称
在AstroZero中创建OBS或MINIO连接器的名称,可在
中查看。命名空间__OBS_Connector
连接器桶名
创建连接器时,配置的OBS或MINIO桶名称。如何查看OBS桶信息,请参见查看桶信息。
template-obs
文件存储位置
指定文件在OBS或MINIO桶中的存储路径。
docTemplate
- 在“模板”页签,单击“添加”,创建合同模板。
图5 新建合同模板
表3 新建模板参数说明 参数
说明
示例
标签
新建模板的名称,创建后可修改。
取值范围:1~80个字符。
合同档模板
名称
新建模板在系统中的标识,创建后不支持修改。命名要求如下:
- 长度不能超过63个字符,包括前缀命名空间的长度。
说明:
标识前模糊掉的内容为命名空间,在AstroZero中为了避免不同租户间数据的重名,租户在首次创建应用时需要先定义一个命名空间。一个租户只能创建一个命名空间,创建后不支持修改。
- 必须以英文字母开头,只能由英文字母,数字和下划线组成,且不能以下划线结尾。
contractModel
- 长度不能超过63个字符,包括前缀命名空间的长度。
- 在“数据”页签,为合同文档模板添加表4中参数。
- 上传文档模板。
- 在“模板”页签,单击3中创建模板后的,进入合同文档模板页面。
图7 进入模板编辑页面
- 单击“点击上传”,选择本地待上传的word文档,查看上传后效果。
图8 上传word文档
图9 查看文档上传后效果
本实践中待上传的word文档内容如下,实际使用时请根据自身的业务需求进行上传。
${命名空间__contractName} 第一条合同目的 本合同旨在规定${命名空间__companyName} 向乙方购买商品/服务的具体条款和条件。 第二条商品/服务描述 商品/服务的详细描述,包括但不限于型号、规格、数量、单价等。 订单数目:${命名空间__orderNum} 第三条价格条款 商品/服务的总额为 ${命名空间__amount} 元。 第四条质量保证 乙方保证所提供的商品/服务符合约定的质量标准 第五条违约责任 如一方违反合同条款,违约方应赔偿对方因此遭受的所有损失。 第六条生效条件 本合同自双方授权代表签字盖章之日起生效。 甲方:${命名空间__companyName} 乙方:${命名空间__otherCompanyName} 合同签订人:${命名空间__person} 日期:${命名空间__date}
- 单击页面右上方的“预览”,输入参数,预览效果。
例如,在“输入参数”中输入如下模板参数,查看合同中对应参数是否被替换。
{ "命名空间__contractName": "买卖合同", "命名空间__companyName": "xx有限公司" }
图11 合同中参数已被替换
- 预览符合预期后,单击页面右上方的“启用”,启用文档模板。
- 在“模板”页签,单击3中创建模板后的,进入合同文档模板页面。
- 返回文档模板场景中,单击“启用”,启用模板场景。
图12 启用模板场景
步骤二:创建对象存储模板中内容和模板实例
创建一个对象并在对象中添加字段,用于存储文档模板中的内容和后续生成的模板实例。
- 在应用设计器的左侧导航栏中,选择“数据”,单击对象中的“+”。
- 设置对象的名称和唯一标识,单击“确定”。
图13 创建对象docObject
表5 新建docObject对象参数说明 参数
说明
示例
对象名称
新建对象的名称,创建后可修改。
取值范围:1~80个字符。
文档模板对象
唯一标识
新建对象在系统中的标识,创建后不支持修改。命名要求如下:
- 长度不能超过63个字符,包括前缀命名空间的长度。
说明:
标识前模糊掉的内容为命名空间,在AstroZero中为了避免不同租户间数据的重名,租户在首次创建应用时需要先定义一个命名空间。一个租户只能创建一个命名空间,创建后不支持修改。
- 必须以英文字母开头,只能由英文字母,数字和下划线组成,且不能以下划线结尾。
docObject
- 长度不能超过63个字符,包括前缀命名空间的长度。
- 在已创建的对象中,单击,进入对象详情页面。
图14 选择编辑按钮
- 在“字段”页签,单击“添加”,为对象添加companyName字段。
图15 添加companyName字段
表6 添加companyName字段参数说明 参数
说明
示例
显示名称
新建字段的名称,创建后可修改。
取值范围:1~63个字符。
公司名称
唯一标识
新建字段在系统中的标识,创建后不支持修改。命名要求如下:
- 长度不能超过63个字符,包括前缀命名空间的长度。
- 必须以英文字母开头,只能由英文字母,数字和单下划线组成,且不能以下划线结尾。
companyName
字段类型
单击,在弹出的页面中,根据页面提供的参数解释,选择新建字段所属的类型。
文本
数据长度
允许输入字段的长度。
64
- 按照上述操作,为对象继续添加表7中字段。
图16 查看对象中字段
步骤三:创建服务编排生成文档
创建一个服务编排,添加“生成文档”和“记录创建”两个图元,用于根据合同中参数创建具体的文档。
- 在应用设计器的左侧导航栏中,选择“逻辑”,单击编排后的“+”。
- 设置服务编排的标签和名称,单击“添加”。
图17 新建服务编排
表8 新建服务编排参数说明 参数
说明
示例
标签
服务编排的标签名,用于在界面展示,创建后可修改。
取值范围:1~64个字符。
根据合同模板创建具体文档实例
名称
服务编排在系统中的唯一标识,创建后不支持修改。命名要求如下:
- 长度不能超过64个字符,包括前缀命名空间的长度。
说明:
名称前的内容为命名空间,在AstroZero中为了避免不同租户间数据的重名,租户在首次创建应用时需要先定义一个命名空间。一个租户只能创建一个命名空间,创建后不支持修改。
- 名称必须以英文字母开头,只能由英文字母、数字或单下划线组成,且不能以下划线结尾。
docFlow
- 长度不能超过64个字符,包括前缀命名空间的长度。
- 创建全局上下文变量。
- 在服务编排设计页面,选中开始节点,单击。
- 在全局上下文中,单击变量后的,新建变量variable0。
- 单击variable0变量后的,选择“设置”。
- 将变量的“名称”设置为“companyName”,单击“保存”。
图18 新建companyName变量
- 按照上述操作,创建表9中的变量。
图19 查看已创建的变量
- 选中开始节点,设置节点的输入参数和输出参数。
图20 设置入参和出参
- 添加生成文档节点。
- 在“基本”图元中,拖拽“生成文档”图元到开始图元后。
图21 拖拽生成文档图元到画布中
- 选中生成文档图元,单击,设置生成文档。
图22 设置生成文档图元
表10 生成文档图元设置说明 参数
说明
示例
请选择模板场景
选择生成文档图元关联的模板场景,即1中创建的。
命名空间__docModel
请选择文档模板
选择模板场景中创建的文档模板,即3中创建的。
命名空间__docModel
连接器类型
根据选择的文档模板自动进行关联。
OBS
连接器名称
根据选择的文档模板自动进行关联。
命名空间__OBS_Connector
连接器桶名
根据选择的文档模板自动进行关联。
template-obs
向模板传入数据
向模板中传入数据,将入参变量一次赋值给对应的模板参数。
3中创建的变量
文档保存地址
将出参modelDoc变量放入文档保存地址,用于存放生成的文档名。
modedoc
- 在“基本”图元中,拖拽“生成文档”图元到开始图元后。
- 添加创建记录节点。
- 在“基本”图元中,拖拽“记录创建”图元到“生成文档”图元后。
图23 添加记录创建图元
- 选中记录创建图元,单击,将入参、出参变量都存入步骤二:创建对象存储模板中内容和模板实例中创建的对象中。
图24 记录创建设置
- 在“基本”图元中,拖拽“记录创建”图元到“生成文档”图元后。
- 连接图元指定逻辑关系,即从开始图元连向生成文档图元,从生成文档图元连向记录创建图元。
图25 指定图元逻辑关系
- 单击页面上方的,保存服务编排。
- 单击,进入服务编排调试页面。
在输入参数中,输入如下内容,并单击“运行”。
{ "companyName": "A公司", "amount": "10", "orderNum": "2", "person": "张三", "date": "2024-11-05", "contractName": "新采购合同", "otherCompanyName": "B公司" }
执行成功后,提示如下信息。登录OBS服务控制台,在2中配置的路径下会生成图26中的合同文档。将合同文档下载到本地,查看合同中内容,如图28所示,可发现合同中的内容已被替换。
图27 查看新生成的合同文档
- 单击页面上方的,启用服务编排。
步骤四:创建下载文档的脚本
创建一个脚本,用于根据文档名下载OBS桶中生成的合同文档。
- 在应用设计器的左侧导航栏中,选择“逻辑”,单击脚本后的“+”。
- 新建一个空白的脚本,名称设置为“docScript”,单击“添加”。
图29 创建脚本docScript
- 在脚本编辑器中,输入示例代码。
本示例代码主要用于下载文档,示例中的“命名空间__OBS_Connector”为2中配置的连接器名称,“docTemplate”为2中配置的文件存储位置。
import * as context from 'context';//导入上下文相关的标准库 import * as objectstorage from 'objectstorage'; //定义入参结构 @action.object({ type: "param" }) export class ActionInput { @action.param({ type: 'String', required: true, label: 'String' }) docName: string; } //定义出参结构 @action.object({ type: "param" }) export class ActionOutput { @action.param({ type: 'Any' }) buf: any; } @action.object({ type: "method" }) export class CreateWorkOrder { //定义接口类,接口的入参为ActionInput,出参为ActionOutput @action.method({ input: 'ActionInput', output: 'ActionOutput' }) public createWorkOrder(input: ActionInput): ActionOutput { let out = new ActionOutput(); //新建出参ActionOutput类型的实例,作为返回值 let error = new Error(); //新建错误类型的实例,用于在发生错误时保存错误信息 try { // OBS桶路径,和模板配置中的一致 let path = "docTemplate/"; // 调用连接器下载,NS1__OBS_Connector为调用连接器名称 let obsCli = objectstorage.newClient(objectstorage.StoreType.OBS, "命名空间__OBS_Connector"); let data = obsCli.getObject(path + input.docName); out.buf = data; } catch (error) { console.error(error.name, error.message); context.setError(error.name, error.message); } return out; } }
- 单击,保存脚本。
- 运行测试脚本。
- 单击编辑器上方的,执行脚本。
- 设置输入参数,单击测试窗口右上角的,查看返回消息。
{ "docName": "1730874683589013855743152260007e733dd-80ea-19f1-b7a0-93fdcd20a541_NS1__contractModel.docx" }
其中,“1730874683589013855743152260007e733dd-80ea-19f1-b7a0-93fdcd20a541_NS1__contractModel.docx”为步骤三:创建服务编排生成文档中生成的文档,即通过脚本根据文档名下载OBS桶中的实际合同文档。
图30 查看输出参数
- 脚本测试完成后,单击页面上方的,启用该脚本。
步骤5:通过标准页面调用服务编排和脚本实现文档的生成和下载
设计一个标准页面,通过调用服务编排和脚本,在前端页面实现合同文档的生成和下载等功能。
- 新建一个标准页面。
- 在应用设计器中,选择“界面”,单击页面后的“+”,新建一个标准页面。
- 设置标准页面的标签和名称,单击“添加”。
图31 添加标准页面
表11 新建标准页面参数说明 参数
说明
示例
标签
输入标准页面的标签名,用于在页面显示,创建后可修改。
取值范围:1~64个字符。
文档模板标准页
名称
输入标准页面的名称,名称是标准页面在系统中的唯一标识,创建后不可修改。命名要求如下:
- 长度不能超过64个字符,包括前缀命名空间的长度。
说明:
名称前的内容为命名空间,在AstroZero中为了避免不同租户间数据的重名,租户在首次创建应用时需要先定义一个命名空间。一个租户只能创建一个命名空间,创建后不支持修改。
- 必须以英文字母开头,只能由英文字母、数字或单下划线组成,且不能以下划线结尾。
docModePge
- 长度不能超过64个字符,包括前缀命名空间的长度。
- 新增对象模型。
- 在标准页面底部,单击“模型视图”,将页面从设计视图切换到模型视图。
- 单击“新增模型”,输入模型名称(flowDemo)、“来源”选择“服务”,单击“下一步”。
图32 新增服务编排对象模型
- 选择步骤三:创建服务编排生成文档中创建的服务编排,单击“下一步”,再单击“确定”,完成模型的创建。
图33 选择目标服务编排
- 再次单击“新增模型”,输入模型名称(scriptDemo)、“来源”选择“服务”,单击“下一步”。
图34 新增脚本对象模型
- 选择步骤四:创建下载文档的脚本中创建的脚本,单击“下一步”,再单击“确定”,完成模型的创建。
图35 选择目标脚本
- 设计一个标准页面,用于生成和下载合同文档。
- 在标准页面底部,单击“设计视图”,从模型视图切换到设计视图。
- 从基本组件中,拖拽输入框(4个)、数字输入框(2个)和日期选择器到标准页面的画布中,布局如图36。
- 选中组件,修改组件的标签,修改后效果如图37所示。
- 选中公司名称输入框,在“值(value)绑定”后的。
图38 选择值绑定
中,单击 - 选择2.b模型中的“companyName”,单击“确定”。
图39 绑定companyName
- 按照上述操作,分别为其他组件绑定模型。
“合同名称”绑定“flowdemo.inputParam.contractName”,“合同签订人”绑定“flowdemo.inputParam.person”,“乙方公司名称”绑定“flowdemo.inputParam.otherCompanyName”,“合同金额”绑定“flowdemo.inputParam.amount”,“订单数目”绑定“flowdemo.inputParam.orderNum”,“订单日期”绑定“flowdemo.inputParam.date”。
- 为标准页面添加一个按钮组件。
- 从“显示名称”修改为“提交合同参数并生成文档实例”。
图40 添加按钮组件
中,拖拽一个按钮组件到订单日期组件下方,并将按钮的 - 选中按钮组件,在“事件”页签中,单击“点击”后的,进入添加动作页面。
- 在自定义动作中,输入如下示例代码,单击“创建”。
本示例代码实现的功能:根据服务编排模型中设置的合同参数,生成对应的合同文档。其中,“flowDemo”为2.b中创建的服务编排模型。
$model.ref('flowDemo').run().then(function(data){ console.log(data); context.$message.success('Submitted successfully.'); }).catch(function(error){ context.$message.success('Submission failed:' + error.resMsg); });
- 从“显示名称”修改为“提交合同参数并生成文档实例”。
- 为标准页面添加一个表格组件。
- 从图41 添加表格组件
中,拖拽一个表格组件到按钮组件下方。
- 选中表格组件,在“值(value)绑定”后的。 中,单击
- 单击“新建模型”,输入模型名称(obj)、“来源”选择“对象”,单击“下一步”。
图42 设置模型基本信息
- 选择步骤二:创建对象存储模板中内容和模板实例中创建的对象和字段,单击“下一步”,再单击“确定”。
图43 模型设置
- 在选择模型中,选中创建的模型,将对象模型绑定到表格上。
图44 为表格绑定模型
- 选中表格组件,为表格添加一个操作列。
图45 为表格添加操作列
- 单击新建操作列后的,在操作按钮中,单击“添加操作按钮”。
图46 添加操作按钮
- 单击,单击“动作列表”后的,为按钮添加事件。
图47 为按钮添加动作
- 在自定义动作中,输入如下示例代码,单击“创建”。
本示例代码主要实现的功能:根据合同模板实例的字段名,从OBS中下载服务编排生成的文档。其中,“命名空间__modedoc__CST”为合同模板实例的字段名,“scriptDemo”为2.d中创建的脚本对象模型。
// base64解码函数 function base64DecodeToBinary(base64String) { // 解码Base64字符串 const binaryString = atob(base64String); // 将解码后的字符串转换为二进制数据 const len = binaryString.length; const bytes = new Uint8Array(len); for (let i = 0; i < len; i++) { bytes[i] = binaryString.charCodeAt(i); } // 将Uint8Array转换为Blob const blob = new Blob([bytes]); return blob; } // 获取表格中的行数据,命名空间__modedoc__CST为表格中合同模板实例的字段名 var rowData = context.$component.current.$attrs.row; const docName = rowData.命名空间__modedoc__CST; // 设置脚本入参 let originData = $model.ref('scriptDemo').getData(); originData.inputParam.docName = docName; $model.ref('scriptDemo').setData(originData); //运行脚本,从OBS中下载服务编排生成的文档 $model.ref('scriptDemo').run().then(function(data){ const decodedString = base64DecodeToBinary(data.buf); const url = URL.createObjectURL(decodedString); let link = document.createElement('a'); link.href = url; // 设置下载的文档名称,命名空间__modedoc__CST为表格中合同模板实例的字段名 link.setAttribute('download', rowData.命名空间__modedoc__CST); document.body.appendChild(link); link.click(); URL.revokeObjectURL(link.href); document.body.removeChild(link); context.$message.success('DownLoad successfully.'); }).catch(function(error){ console.log('error is', error); context.$message.success('DownLoad failed:' + error.resMsg); });
- 将操作按钮的“标签”设置为“下载文档”,同时将基本属性中的“列标题”设置为“下载”。
图48 更改操作列标题和操作的标签
- 返回标准页面,在属“添加”,为表格添加一个工具栏。
图49 为表格添加工具栏
中,单击工具栏后的
- 从
- 标准页面设计完成后,单击页面上方的,保存标准页面。
步骤六:验证合同文档生成和下载功能
- 在标准页面上方,单击,进入预览页面。
- 输入合同内容,单击“提交合同参数并生成文档实例”。
图50 输入合同内容
- 提示“Submitted successfully”后,单击“刷新”,即可查看到提交的合同数据。
图51 查看提交的合同数据
- 单击数据后的“下载文档”,将合同文档下载到本地并查看文档内容。
图52 合同文档被下载到本地
图53 查看下载到本地合同的内容