
# 使用华为云Astro轻应用文件模板生成合同文档
#### 应用场景
华为云Astro轻应用低代码平台提供了文档类模板创建能力，支持快速创建"Word文档"、"Excel文档"、"邮件"和"短信"四种类型的模板，以满足多样化的业务文档需求，提升文档的制作效率与规范性。
本实践以**Word文档**为例进行介绍，基于该功能开发者可以根据不同客户设置不同类型的打印模板。例如，用户在商品订单管理系统中，基于商品、价格等信息，自动生成了商品订单列表。在处理完自己的订单后，可以使用模板功能将订单信息同步到合同模板中，生成合同文档，用于签订线下合同。同样，在财务领域，可以使用文档模板来生成定制化的发票和收据。对于需要发送正式邀请的场合，文档模板可以用来创建和打印专业的商务信函。
#### 方案优势
用户可以在服务编排中，通过拖、拉、拽的方式调用文档模板节点、配置模板的输入输出参数，用于生成具体的文档。同时可以将该服务编排包装成开放接口供第三方使用，也可以在华为云Astro轻应用的标准页面中直接调用供业务用户下载。
#### 约束与限制
- 用户上传Word文档后（文档中包含使用${*参数*}定义的文本类型的变量），只能预览该文档模板或生成具体的文档，不能直接在界面上对其进行修改。如果需要，只能在本地更改Word模板样式后重新上传。
- 生成的docx类型的文档模板，只支持文本类的变量替换，无法动态替换二维码、图片等内容。
 
#### 操作流程
在华为云Astro轻应用中，通过文件模板生成具体合同文档的操作流程，如[图1]所示。
图1使用文件模板生成合同文档操作流程   
![](https://support.huaweicloud.com/bestpractice-astrozero/zh-cn_image_0000002124117941.png)
#### 步骤一：创建文档模板场景并配置模板
创建一个模板场景并在场景中添加一个合同模板。在模板场景的配置中，添加文档模板中需要替换的参数。模板场景是一个业务场景的集合，在模板场景中支持创建多个模板，模板之间共享数据结构。
1. 创建一个低代码应用。 
   1. 参考[授权用户使用华为云Astro轻应用并购买实例](https://support.huaweicloud.com/usermanual-astrozero/astrozero_05_9046.html)中操作，申请华为云Astro轻应用免费试用或购买商业实例。
   
   2. 实例购买后，在华为云Astro轻应用服务控制台的"主页"中，单击"进入首页"，进入应用开发页面。
   
   3. 在"应用"中，单击"新建低代码应用"或单击![](https://support.huaweicloud.com/bestpractice-astrozero/zh-cn_image_0000002134818046.png "点击放大")，进入新建低代码应用页面。
      首次创建应用时，请根据界面提示创建一个命名空间。命名空间一旦创建，不能修改和删除，创建前请确认好相关信息。建议使用公司或团队的缩写作为命名空间。
      
   
   4. 在新建低代码应用页面，应用类型选择"标准应用"，单击"确定"。
   
   5. 输入应用的标签和名称，单击"新建"，即可进入应用设计器。
      图2创建一个空白应用   
      ![](https://support.huaweicloud.com/bestpractice-astrozero/zh-cn_image_0000002170372113.png "点击放大")
      表1新建空白应用参数说明 
      | 参数 | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     | 示例      |
      |:---|:---|:---|
      | 标签 | 新建应用的标签，长度不能超过80个字符。标签是应用在系统中的唯一标识，创建后不支持修改。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           | 我的第一个应用 |
      | 名称 | 新建应用的名称，输入标签值后单击该参数的输入框，系统会自动生成应用的名称，同时自动在名称前，添加***命名空间***__。命名要求如下： - 长度不能超过31个字符，包括前缀命名空间的长度。 名称前的内容为命名空间，在华为云Astro轻应用中为了避免不同租户间数据的重名，租户在首次创建应用时需要先定义一个命名空间。一个租户只能创建一个命名空间，创建后不支持修改。   - 必须以英文字母开头，只能由英文字母、数字或单下划线组成，且不允许以下划线结尾。   | A       |
         
      
   
   
   
   
2. 创建文件模板场景。
   
   1. 在应用设计器的左侧导航栏中，选择"逻辑"，单击"更多 \> 模板"。
      图3单击模板   
      ![](https://support.huaweicloud.com/bestpractice-astrozero/zh-cn_image_0000002104859657.png) 
   
   2. 单击"添加模板场景"，设置模板场景的标签和名称，单击"确定"。
      图4创建模板场景   
      ![](https://support.huaweicloud.com/bestpractice-astrozero/zh-cn_image_0000002069401498.png "点击放大")
      表2新建模板场景参数说明 
      | 参数 | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         | 示例       |
      |:---|:---|:---|
      | 标签 | 新建模板场景的名称，创建后可修改。 取值范围：1\~80个字符。                                                                                                                                                                                                                                                                                                                                                                                                                                                                            | 文档模板     |
      | 名称 | 新建模板场景在系统中的标识，创建后不支持修改。命名要求如下： - 长度不能超过64个字符，包括前缀命名空间的长度。 标识前模糊掉的内容为命名空间，在华为云Astro轻应用中为了避免不同租户间数据的重名，租户在首次创建应用时需要先定义一个命名空间。一个租户只能创建一个命名空间，创建后不支持修改。   - 必须以英文字母开头，只能由英文字母，数字和下划线组成，且不能以下划线结尾。   | docModel |
         
      
   
   
   
   
3. 在"配置"页签，设置模板文件的存储位置，单击"保存"。
   
   图5设置文件存储   
   ![](https://support.huaweicloud.com/bestpractice-astrozero/zh-cn_image_0000002275302085.png "点击放大")
   表3文件存储参数说明 
   | 参数     | 说明                                                                                                                                                                                                                                                                                            | 示例                    |
   |:---|:---|:---|
   | 连接器类型  | 文件存储的连接器类型，当前仅支持"OBS"和"MINIO"两种。在华为云Astro轻应用中，通过创建OBS、MINIO连接器，可将数据存储到OBS和MINIO中，详细介绍请参见[对接OBS云对象存储实例](https://support.huaweicloud.com/usermanual-astrozero/astrozero_05_9217.html)、[对接MINIO存储华为云Astro轻应用对象或资产](https://support.huaweicloud.com/usermanual-astrozero/astrozero_05_9218.html)。 | OBS                   |
   | 连接器名称  | 在华为云Astro轻应用中创建OBS或MINIO连接器的名称，可在"集成 \> 连接器 \> 连接器实例 \> 存储 \> OBS/MINIO"中查看。                                                                                                                                                                                                                  | *命名空间*__OBS_Connector |
   | 连接器桶名  | 创建连接器时，配置的OBS或MINIO桶名称。如何查看OBS桶信息，请参见[查看桶信息](https://support.huaweicloud.com/usermanual-obs/obs_03_0312.html)                                                                                                                                                                                 | template-obs          |
   | 文件存储位置 | 指定文件在OBS或MINIO桶中的存储路径。                                                                                                                                                                                                                                                                        | docTemplate           |
      
   
   
4. 在"模板"页签，单击"添加"，创建合同模板。
   
   图6新建合同模板   
   ![](https://support.huaweicloud.com/bestpractice-astrozero/zh-cn_image_0000002297411153.png "点击放大")
   表4新建模板参数说明 
   | 参数   | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  | 示例            |
   |:---|:---|:---|
   | 标签   | 新建模板的名称，创建后可修改。 取值范围：1\~80个字符。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        | 合同文档模板        |
   | 名称   | 新建模板在系统中的标识，创建后不支持修改。命名要求如下： - 长度不能超过63个字符，包括前缀命名空间的长度。 标识前模糊掉的内容为命名空间，在华为云Astro轻应用中为了避免不同租户间数据的重名，租户在首次创建应用时需要先定义一个命名空间。一个租户只能创建一个命名空间，创建后不支持修改。   - 必须以英文字母开头，只能由英文字母，数字和下划线组成，且不能以下划线结尾。                                                                                                                                                           | contractModel |
   | 模板类型 | 新建文档模板的类型。 - Word文档：支持用户上传Word格式的文档模板，文档的大小建议小于10M。  - Excel文档：支持用户上传Excel类型的文档模板。上传的Excel文档不能超过10个Sheet页，每个Sheet页中**列** 不能超过200个，**行** 不能超过1000个，**单元格** **内**字符串的长度不超过500个字符。  - 邮件：支持用户在模板编辑界面编写邮件模板。  - 短信：支持用户在模板编辑界面编写短信模板。   | Word文档        |
      
   
   
5. 在"数据"页签，为合同文档模板添加[表5]中参数。
   
   此处添加的模板参数，对应文档模板中需要替换的内容。
   图7为合同模板添加公司名称参数   
   ![](https://support.huaweicloud.com/bestpractice-astrozero/zh-cn_image_0000002107313193.png "点击放大")
    表5待添加参数 
   | 名称     | 唯一标识             | 数据类型 |
   |:---|:---|:---|
   | 公司名称   | companyName      | 文本   |
   | 合同金额   | amount           | 数字   |
   | 订单数目   | orderNum         | 数字   |
   | 合同签订人  | person           | 文本   |
   | 合同日期   | date             | 日期   |
   | 合同名称   | contractName     | 文本   |
   | 乙方公司名称 | otherCompanyName | 文本   |
      
   
   
6. 上传文档模板。 
   1. 在"模板"页签，单击[4]中创建模板后的![](https://support.huaweicloud.com/bestpractice-astrozero/zh-cn_image_0000002105290609.png)，进入合同文档模板页面。
      图8进入模板编辑页面   
      ![](https://support.huaweicloud.com/bestpractice-astrozero/zh-cn_image_0000002071633742.png "点击放大") 
   
   2. 单击"点击上传"，选择本地待上传的Word文档，查看上传后效果。
      上传操作执行成功后，在[3]中配置的OBS桶中可查看到已上传的Word文档，如[图11]所示。
      图9上传Word文档   
      ![](https://support.huaweicloud.com/bestpractice-astrozero/zh-cn_image_0000002107273993.png "点击放大")
      图10查看文档上传后效果   
      ![](https://support.huaweicloud.com/bestpractice-astrozero/zh-cn_image_0000002107314621.png "点击放大")
      图11在OBS桶中查看文档是否上传   
      ![](https://support.huaweicloud.com/bestpractice-astrozero/zh-cn_image_0000002071635322.png "点击放大")
      本实践中待上传的Word文档内容如下，实际使用时请根据自身的业务需求进行上传。
      ```
      ${命名空间__contractName}
       
      第一条合同目的
      本合同旨在规定${命名空间__companyName} 向乙方购买商品/服务的具体条款和条件。
       
      第二条商品/服务描述
      商品/服务的详细描述，包括但不限于型号、规格、数量、单价等。
      订单数目：${命名空间__orderNum}
       
      第三条价格条款
      商品/服务的总额为 ${命名空间__amount} 元。
       
      第四条质量保证
      乙方保证所提供的商品/服务符合约定的质量标准
       
      第五条违约责任
      如一方违反合同条款，违约方应赔偿对方因此遭受的所有损失。
       
      第六条生效条件
      本合同自双方授权代表签字盖章之日起生效。
       
      甲方：${命名空间__companyName}
      乙方：${命名空间__otherCompanyName}
       
      合同签订人：${命名空间__person}
      日期：${命名空间__date}
      ```
      
   
   3. 单击页面右上方的"预览"，输入参数，预览效果。 例如，在"输入参数"中输入如下模板参数，查看合同中对应参数是否被替换。
      ```
      {
          "命名空间__contractName": "买卖合同",
          "命名空间__companyName": "xx有限公司"
      }
      ```
      图12合同中参数已被替换   
      ![](https://support.huaweicloud.com/bestpractice-astrozero/zh-cn_image_0000002107319133.png) 
   
   4. 预览符合预期后，单击页面右上方的"启用"，启用文档模板。
   
   
   
   
7. 返回文档模板场景中，单击"启用"，启用模板场景。 
   图13启用模板场景   
   ![](https://support.huaweicloud.com/bestpractice-astrozero/zh-cn_image_0000002071480006.png "点击放大")
   
   
 
 #### 步骤二：创建对象存储模板中内容和模板实例
创建一个对象并在对象中添加字段，用于存储文档模板中的内容和后续生成的模板实例。
1. 在应用设计器的左侧导航栏中，选择"数据"，单击对象中的"+"。
2. 设置对象的名称和唯一标识，单击"确定"。 
   图14创建对象docObject   
   ![](https://support.huaweicloud.com/bestpractice-astrozero/zh-cn_image_0000002071717390.png "点击放大")
   表6新建docObject对象参数说明 
   | 参数   | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   | 示例        |
   |:---|:---|:---|
   | 对象名称 | 新建对象的名称，创建后可修改。 取值范围：1\~80个字符。                                                                                                                                                                                                                                                                                                                                                                                                                                                                         | 文档模板对象    |
   | 唯一标识 | 新建对象在系统中的标识，创建后不支持修改。命名要求如下： - 长度不能超过63个字符，包括前缀命名空间的长度。 标识前模糊掉的内容为命名空间，在华为云Astro轻应用中为了避免不同租户间数据的重名，租户在首次创建应用时需要先定义一个命名空间。一个租户只能创建一个命名空间，创建后不支持修改。   - 必须以英文字母开头，只能由英文字母，数字和下划线组成，且不能以下划线结尾。   | docObject |
      
   
   
3. 在已创建的对象中，单击![](https://support.huaweicloud.com/bestpractice-astrozero/zh-cn_image_0000002070082920.png "点击放大")，进入对象详情页面。
   
   图15选择编辑按钮   
   ![](https://support.huaweicloud.com/bestpractice-astrozero/zh-cn_image_0000002071558838.png "点击放大")
   
   
4. 在"字段"页签，单击"添加"，为对象添加companyName字段。 
   图16添加companyName字段   
   ![](https://support.huaweicloud.com/bestpractice-astrozero/zh-cn_image_0000002071559970.png "点击放大")
   表7添加companyName字段参数说明 
   | 参数   | 说明                                                                                                                                                                                                                                                                                                                                                                                        | 示例          |
   |:---|:---|:---|
   | 显示名称 | 新建字段的名称，创建后可修改。 取值范围：1\~63个字符。                                                                                                                                                                                                                                                                                                                | 公司名称        |
   | 唯一标识 | 新建字段在系统中的标识，创建后不支持修改。命名要求如下： - 长度不能超过63个字符，包括前缀命名空间的长度。  - 必须以英文字母开头，只能由英文字母，数字和单下划线组成，且不能以下划线结尾。   | companyName |
   | 字段类型 | 单击![](https://support.huaweicloud.com/bestpractice-astrozero/zh-cn_image_0000002069923164.png)，在弹出的页面中，根据页面提供的参数解释，选择新建字段所属的类型。                                                                                                                                                                                                                                                           | 文本          |
   | 数据长度 | 允许输入字段的长度。                                                                                                                                                                                                                                                                                                                                                                                | 64          |
      
   
   
5. 按照上述操作，为对象继续添加[表8]中字段。
   
   图17查看对象中字段   
   ![](https://support.huaweicloud.com/bestpractice-astrozero/zh-cn_image_0000002107390657.png "点击放大")
    表8待添加对象字段 
   | 名称        | 唯一标识             | 数据类型           |
   |:---|:---|:---|
   | 公司名称（已添加） | companyName      | 文本             |
   | 合同金额      | amount           | 数字             |
   | 订单数目      | orderNum         | 数字             |
   | 合同签订人     | person           | 文本             |
   | 合同日期      | date             | 日期             |
   | 合同名称      | contractName     | 文本             |
   | 乙方公司名称    | otherCompanyName | 文本             |
   | 合同模板实例    | modedoc          | 文本（数据长度设置为255） |
      
   
   
 
 #### 步骤三：创建服务编排生成文档
创建一个服务编排，添加"调用模板"和"记录创建"两个图元，用于根据合同中参数创建具体的文档。
1. 在应用设计器的左侧导航栏中，选择"逻辑"，单击编排后的"+"。
2. 设置服务编排的标签和名称，单击"添加"。 
   图18新建服务编排   
   ![](https://support.huaweicloud.com/bestpractice-astrozero/zh-cn_image_0000002071569166.png "点击放大")
   表9新建服务编排参数说明 
   | 参数 | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        | 示例             |
   |:---|:---|:---|
   | 标签 | 服务编排的标签名，用于在界面展示，创建后可修改。 取值范围：1\~64个字符。                                                                                                                                                                                                                                                                                                                                                                                                                                                                    | 根据合同模板创建具体文档实例 |
   | 名称 | 服务编排在系统中的唯一标识，创建后不支持修改。命名要求如下： - 长度不能超过64个字符，包括前缀命名空间的长度。 标识前模糊掉的内容为命名空间，在华为云Astro轻应用中为了避免不同租户间数据的重名，租户在首次创建应用时需要先定义一个命名空间。一个租户只能创建一个命名空间，创建后不支持修改。   - 名称必须以英文字母开头，只能由英文字母、数字或单下划线组成，且不能以下划线结尾。   | docFlow        |
      
   
   
3. 创建全局上下文变量。
   
   1. 在服务编排设计页面，选中开始节点，单击![](https://support.huaweicloud.com/bestpractice-astrozero/zh-cn_image_0000002105648453.png)。
   
   2. 在全局上下文中，单击变量后的![](https://support.huaweicloud.com/bestpractice-astrozero/zh-cn_image_0000002105649233.png)，新建变量variable0。
   
   3. 单击variable0变量后的![](https://support.huaweicloud.com/bestpractice-astrozero/zh-cn_image_0000002105729513.png)，选择"设置"。
   
   4. 将变量的"名称"设置为"companyName"，单击"保存"。
      图19新建companyName变量   
      ![](https://support.huaweicloud.com/bestpractice-astrozero/zh-cn_image_0000002071740464.png "点击放大") 
   
   5. 按照上述操作，创建[表10]中的变量。
      图20查看已创建的变量   
      ![](https://support.huaweicloud.com/bestpractice-astrozero/zh-cn_image_0000002105773609.png "点击放大")
       表10需要创建的全局上下文变量 
      | 名称               | 数据类型 |
      |:---|:---|
      | companyName（已创建） | 文本   |
      | amount           | 数字   |
      | orderNum         | 数字   |
      | person           | 文本   |
      | date             | 日期   |
      | contractName     | 文本   |
      | otherCompanyName | 文本   |
      | modedoc          | 文本   |
         
      
   
   6. 选中开始节点，设置节点的输入参数和输出参数。
      图21设置入参和出参   
      ![](https://support.huaweicloud.com/bestpractice-astrozero/zh-cn_image_0000002071776170.png "点击放大") 
   
   
   
   
4. 添加调用模板节点。 
   1. 在"基本"图元中，拖拽"调用模板"图元到开始图元后。
      图22拖拽调用模板图元到画布中   
      ![](https://support.huaweicloud.com/bestpractice-astrozero/zh-cn_image_0000002071777062.png "点击放大") 
   
   2. 选中调用模板图元，单击![](https://support.huaweicloud.com/bestpractice-astrozero/zh-cn_image_0000002105777545.png)，设置调用模板。
      图23设置调用模板图元   
      ![](https://support.huaweicloud.com/bestpractice-astrozero/zh-cn_image_0000002105740001.png "点击放大")
      表11调用模板图元设置说明 
      | 参数      | 说明                                                                       | 示例                                                       |
      |:---|:---|:---|
      | 请选择模板场景 | 选择调用模板图元关联的模板场景，即[2]中创建的。 | *命名空间*__docModel                                         |
      | 请选择模板类型 | 选择待调用模板的类型。                                                              | Word文档                                                   |
      | 请选择文档模板 | 选择模板场景中创建的文档模板，即[4]中创建的。      | *命名空间*__contractModel                                    |
      | 连接器类型   | 根据选择的文档模板自动进行关联。                                                         | OBS                                                      |
      | 连接器名称   | 根据选择的文档模板自动进行关联。                                                         | *命名空间*__OBS_Connector                                    |
      | 连接器桶名   | 根据选择的文档模板自动进行关联。                                                         | template-obs                                             |
      | 文件存储位置  | 根据选择的文档模板自动进行关联。                                                         | docTemplate                                              |
      | 向模板传入数据 | 向模板中传入数据，将入参变量一次赋值给对应的模板参数。                                              | [3]中创建的变量 |
      | 文档保存地址  | 将出参modelDoc变量放入文档保存地址，用于存放生成的文档名。                                        | modedoc                                                  |
         
      
   
   
   
   
5. 添加创建记录节点。 
   1. 在"基本"图元中，拖拽"记录创建"图元到"调用模板"图元后。
      图24添加记录创建图元   
      ![](https://support.huaweicloud.com/bestpractice-astrozero/zh-cn_image_0000002071941878.png "点击放大") 
   
   2. 选中记录创建图元，单击![](https://support.huaweicloud.com/bestpractice-astrozero/zh-cn_image_0000002069919876.png)，将入参、出参变量都存入[步骤二：创建对象存储模板中内容和模板实例]中创建的对象中。
      图25记录创建设置   
      ![](https://support.huaweicloud.com/bestpractice-astrozero/zh-cn_image_0000002107543929.png "点击放大") 
   
   
   
   
6. 连接图元指定逻辑关系，即从开始图元连向调用模板图元，从调用模板图元连向记录创建图元。 
   图26指定图元逻辑关系   
   ![](https://support.huaweicloud.com/bestpractice-astrozero/zh-cn_image_0000002071785602.png)
   
   
7. 单击页面上方的![](https://support.huaweicloud.com/bestpractice-astrozero/zh-cn_image_0000002105802857.png "点击放大")，保存服务编排。
8. 单击![](https://support.huaweicloud.com/bestpractice-astrozero/zh-cn_image_0000002070533516.png "点击放大")，进入服务编排调试页面。
   
   在输入参数中，输入如下内容，并单击"运行"。
   ```
   {
       "companyName": "A公司",
       "amount": "10",
       "orderNum": "2",
       "person": "张三",
       "date": "2024-11-05",
       "contractName": "新采购合同",
       "otherCompanyName": "B公司"
   }
   ```
   执行成功后，提示如下信息。登录OBS服务控制台，在[3]中配置的路径下会生成[图27]中的合同文档。将合同文档下载到本地，查看合同中内容，如[图29]所示，可发现合同中的内容已被替换。
   图27服务编排执行成功   
   ![](https://support.huaweicloud.com/bestpractice-astrozero/zh-cn_image_0000002071951706.png "点击放大")
   图28查看新生成的合同文档   
   ![](https://support.huaweicloud.com/bestpractice-astrozero/zh-cn_image_0000002071952326.png "点击放大")
   图29查看合同内容   
   ![](https://support.huaweicloud.com/bestpractice-astrozero/zh-cn_image_0000002107633721.png)
   
   
9. 单击页面上方的![](https://support.huaweicloud.com/bestpractice-astrozero/zh-cn_image_0000002105762841.png "点击放大")，启用服务编排。
 
 #### 步骤四：创建下载文档的脚本
创建一个脚本，用于根据文档名下载OBS桶中生成的合同文档。
1. 在应用设计器的左侧导航栏中，选择"逻辑"，单击脚本后的"+"。
2. 新建一个空白的脚本，名称设置为"docScript"，单击"添加"。 
   图30创建脚本docScript   
   ![](https://support.huaweicloud.com/bestpractice-astrozero/zh-cn_image_0000002161369757.png "点击放大")
   
   
3. 在脚本编辑器中，输入示例代码。 
   本示例代码主要用于下载文档，示例中的"命名空间__OBS_Connector"为[3]中配置的连接器名称，"docTemplate"为[3]中配置的文件存储位置。
   ```
   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/";
               // 调用连接器下载，命名空间__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;
       }
   }
   ```
   
   
4. 单击![](https://support.huaweicloud.com/bestpractice-astrozero/zh-cn_image_0000002106373169.png)，保存脚本。
5. 运行测试脚本。 
   1. 单击编辑器上方的![](https://support.huaweicloud.com/bestpractice-astrozero/zh-cn_image_0000002070801372.png)，执行脚本。
   
   2. 设置输入参数，单击测试窗口右上角的![](https://support.huaweicloud.com/bestpractice-astrozero/zh-cn_image_0000002106481289.png)，查看返回消息。
      ```
      {
          "docName": "1730874683589013855743152260007e733dd-80ea-19f1-b7a0-93fdcd20a541_命名空间__contractModel.docx"
      }
      ```
      其中，"1730874683589013855743152260007e733dd-80ea-19f1-b7a0-93fdcd20a541_命名空间__contractModel.docx"为[步骤三：创建服务编排生成文档]中生成的文档，即通过脚本根据文档名下载OBS桶中的实际合同文档。
      图31查看输出参数   
      ![](https://support.huaweicloud.com/bestpractice-astrozero/zh-cn_image_0000002106474093.png "点击放大") 
   
   
   
   
6. 脚本测试完成后，单击页面上方的![](https://support.huaweicloud.com/bestpractice-astrozero/zh-cn_image_0000002070641592.png)，启用该脚本。
 
#### 步骤5：通过标准页面调用服务编排和脚本实现文档的生成和下载
设计一个标准页面，通过调用服务编排和脚本，在前端页面实现合同文档的生成和下载等功能。
1. 新建一个标准页面。 
   1. 在应用设计器中，选择"界面"，单击页面后的"+"，新建一个标准页面。
   
   2. 设置标准页面的标签和名称，单击"添加"。
      图32添加标准页面   
      ![](https://support.huaweicloud.com/bestpractice-astrozero/zh-cn_image_0000002107772149.png "点击放大")
      表12新建标准页面参数说明 
      | 参数 | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   | 示例         |
      |:---|:---|:---|
      | 标签 | 输入标准页面的标签名，用于在页面显示，创建后可修改。 取值范围：1\~64个字符。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 | 文档模板标准页    |
      | 名称 | 输入标准页面的名称，名称是标准页面在系统中的唯一标识，创建后不可修改。命名要求如下： - 长度不能超过64个字符，包括前缀命名空间的长度。 标识前模糊掉的内容为命名空间，在华为云Astro轻应用中为了避免不同租户间数据的重名，租户在首次创建应用时需要先定义一个命名空间。一个租户只能创建一个命名空间，创建后不支持修改。   - 必须以英文字母开头，只能由英文字母、数字或单下划线组成，且不能以下划线结尾。   | docModePge |
         
      
   
   
   
   
2. 新增对象模型。 
   1. 在标准页面底部，单击"模型视图"，将页面从设计视图切换到模型视图。
   
   2. 单击"新增模型"，输入模型名称（flowDemo）、"来源"选择"服务"，单击"下一步"。
      图33新增服务编排对象模型   
      ![](https://support.huaweicloud.com/bestpractice-astrozero/zh-cn_image_0000002107773249.png "点击放大") 
   
   3. 选择[步骤三：创建服务编排生成文档]中创建的服务编排，单击"下一步"，再单击"确定"，完成模型的创建。
      图34选择目标服务编排   
      ![](https://support.huaweicloud.com/bestpractice-astrozero/zh-cn_image_0000002107774085.png "点击放大") 
   
   4. 再次单击"新增模型"，输入模型名称（scriptDemo）、"来源"选择"服务"，单击"下一步"。
      图35新增脚本对象模型   
      ![](https://support.huaweicloud.com/bestpractice-astrozero/zh-cn_image_0000002107854489.png "点击放大") 
   
   5. 选择[步骤四：创建下载文档的脚本]中创建的脚本，单击"下一步"，再单击"确定"，完成模型的创建。
      图36选择目标脚本   
      ![](https://support.huaweicloud.com/bestpractice-astrozero/zh-cn_image_0000002072055824.png "点击放大") 
   
   
   
   
3. 设计一个标准页面，用于生成和下载合同文档。 
   1. 在标准页面底部，单击"设计视图"，从模型视图切换到设计视图。
   
   2. 从基本组件中，拖拽输入框（4个）、数字输入框（2个）和日期选择器到标准页面的画布中，布局如[图37]。
      图37拖拽组件到画布   
      ![](https://support.huaweicloud.com/bestpractice-astrozero/zh-cn_image_0000002072056412.png "点击放大") 
   
   3. 选中组件，修改组件的标签，修改后效果如[图38]所示。
      图38修改组件标签   
      ![](https://support.huaweicloud.com/bestpractice-astrozero/zh-cn_image_0000002071899720.png "点击放大") 
   
   4. 选中公司名称输入框，在"属性 \> 数据绑定"中，单击"值（value）绑定"后的![](https://support.huaweicloud.com/bestpractice-astrozero/zh-cn_image_0000002070988806.png)。
      图39选择值绑定   
      ![](https://support.huaweicloud.com/bestpractice-astrozero/zh-cn_image_0000002072061544.png "点击放大") 
   
   5. 选择[2.b]模型中的"companyName"，单击"确定"。
      图40绑定companyName   
      ![](https://support.huaweicloud.com/bestpractice-astrozero/zh-cn_image_0000002107781697.png "点击放大") 
   
   6. 按照上述操作，分别为其他组件绑定模型。 "合同名称"绑定"flowdemo.inputParam.contractName"，"合同签订人"绑定"flowdemo.inputParam.person"，"乙方公司名称"绑定"flowdemo.inputParam.otherCompanyName"，"合同金额"绑定"flowdemo.inputParam.amount"，"订单数目"绑定"flowdemo.inputParam.orderNum"，"订单日期"绑定"flowdemo.inputParam.date"。
      
   
   
   
   
4. 为标准页面添加一个按钮组件。 
   1. 从"基本组件 \> 基本"中，拖拽一个按钮组件到订单日期组件下方，并将按钮的"显示名称"修改为"提交合同参数并生成文档实例"。
      图41添加按钮组件   
      ![](https://support.huaweicloud.com/bestpractice-astrozero/zh-cn_image_0000002071902500.png "点击放大") 
   
   2. 选中按钮组件，在"事件"页签中，单击"点击"后的![](https://support.huaweicloud.com/bestpractice-astrozero/zh-cn_image_0000002106652533.png)，进入添加动作页面。
   
   3. 在自定义动作中，输入如下示例代码，单击"创建"。
      本示例代码实现的功能：根据服务编排模型中设置的合同参数，生成对应的合同文档。其中，"flowDemo"为[2.b]中创建的服务编排模型。
      ```
      $model.ref('flowDemo').run().then(function(data){
          console.log(data);
          context.$message.success('Submitted successfully.');
      }).catch(function(error){
          context.$message.error('Submission failed:' + error.resMsg);
      });
      ```
      
   
   
   
   
5. 为标准页面添加一个表格组件。 
   1. 从"基本组件 \> 布局"中，拖拽一个表格组件到按钮组件下方。
      图42添加表格组件   
      ![](https://support.huaweicloud.com/bestpractice-astrozero/zh-cn_image_0000002107864281.png "点击放大") 
   
   2. 选中表格组件，在"属性 \> 数据绑定"中，单击"值（value）绑定"后的![](https://support.huaweicloud.com/bestpractice-astrozero/zh-cn_image_0000002106695105.png)。
   
   3. 单击"新建模型"，输入模型名称（obj）、"来源"选择"对象"，单击"下一步"。
      图43设置模型基本信息   
      ![](https://support.huaweicloud.com/bestpractice-astrozero/zh-cn_image_0000002072065208.png "点击放大") 
   
   4. 选择[步骤二：创建对象存储模板中内容和模板实例]中创建的对象和字段，单击"下一步"，再单击"确定"。
      图44模型设置   
      ![](https://support.huaweicloud.com/bestpractice-astrozero/zh-cn_image_0000002107865805.png "点击放大") 
   
   5. 在选择模型中，选中创建的模型，将对象模型绑定到表格上。
      图45为表格绑定模型   
      ![](https://support.huaweicloud.com/bestpractice-astrozero/zh-cn_image_0000002072066492.png "点击放大") 
   
   6. 选中表格组件，为表格添加一个操作列。
      图46为表格添加操作列   
      ![](https://support.huaweicloud.com/bestpractice-astrozero/zh-cn_image_0000002071043428.png "点击放大") 
   
   7. 单击新建操作列后的![](https://support.huaweicloud.com/bestpractice-astrozero/zh-cn_image_0000002070876076.png)，在操作按钮中，单击"添加操作按钮"。
      图47添加操作按钮   
      ![](https://support.huaweicloud.com/bestpractice-astrozero/zh-cn_image_0000002106844849.png "点击放大") 
   
   8. 单击![](https://support.huaweicloud.com/bestpractice-astrozero/zh-cn_image_0000002070889076.png)，单击"动作列表"后的![](https://support.huaweicloud.com/bestpractice-astrozero/zh-cn_image_0000002070890280.png)，为按钮添加事件。
      图48为按钮添加动作   
      ![](https://support.huaweicloud.com/bestpractice-astrozero/zh-cn_image_0000002106848389.png "点击放大") 
   
   9. 在自定义动作中，输入如下示例代码，单击"创建"。
      本示例代码主要实现的功能：根据合同模板实例的字段名，从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.error('DownLoad failed:' + error.resMsg);
      });
      ```
      
   
   10. 将操作按钮的"标签"设置为"下载文档"，同时将基本属性中的"列标题"设置为"下载"。
       图49更改操作列标题和操作的标签   
       ![](https://support.huaweicloud.com/bestpractice-astrozero/zh-cn_image_0000002106693797.png "点击放大") 
   
   11. 返回标准页面，在属"性 \> 表格区块"中，单击工具栏后的"添加"，为表格添加一个工具栏。
       图50为表格添加工具栏   
       ![](https://support.huaweicloud.com/bestpractice-astrozero/zh-cn_image_0000002107124101.png "点击放大") 
   
   
   
   
6. 标准页面设计完成后，单击页面上方的![](https://support.huaweicloud.com/bestpractice-astrozero/zh-cn_image_0000002107124813.png "点击放大")，保存标准页面。
 
#### 步骤六：验证合同文档生成和下载功能
1. 在标准页面上方，单击![](https://support.huaweicloud.com/bestpractice-astrozero/zh-cn_image_0000002071404954.png)，进入预览页面。
2. 输入合同内容，单击"提交合同参数并生成文档实例"。 
   图51输入合同内容   
   ![](https://support.huaweicloud.com/bestpractice-astrozero/zh-cn_image_0000002071245162.png "点击放大")
   
   
3. 提示"Submitted successfully"后，单击"刷新"，即可查看到提交的合同数据。 
   图52查看提交的合同数据   
   ![](https://support.huaweicloud.com/bestpractice-astrozero/zh-cn_image_0000002071405022.png "点击放大")
   
   
4. 单击数据后的"下载文档"，将合同文档下载到本地并查看文档内容。 
   图53合同文档被下载到本地   
   ![](https://support.huaweicloud.com/bestpractice-astrozero/zh-cn_image_0000002107753665.png "点击放大")
   图54查看下载到本地合同的内容   
   ![](https://support.huaweicloud.com/bestpractice-astrozero/zh-cn_image_0000002107755093.png)
   
   
 
