
# 如何使用服务编排开发业务的基本逻辑
#### 场景描述
**实现场景**：根据查询到的呼吸机资源，数据判断资源是否充足，并修改相关资源信息。
**实现方案**：提前创建好呼吸机资源对象Respirator，使用服务编排实现上述场景功能。
1. 通过循环图元对传入的数组对象变量RespiratorInfos（即空闲状态下的呼吸机资源数组）进行遍历，并将数组中的每个元素放置到对象变量RespiratorInfo（空闲状态下的呼吸机资源数组元素）中。
2. 通过"赋值"图元，设置参数。 将当前遍历的对象变量元素，添加到此次申请的原始呼吸机资源数组中，并对计数进行加一操作。将当前遍历的对象变量元素的字段医院信息修改为发起呼吸机申请的医院信息，将呼吸机状态修改为"使用中"，并添加到申请后的呼吸机资源数组中。
   
3. 通过"决策"图元，判断资源是否充足。
   - 走"ResourceEnough1"分支：在空闲状态下的呼吸机资源满足申请数量时，跳出循环，返回信息"资源充足，申请呼吸机成功！"。
   
   - 走"ResourceNotEnough1"分支：循环遍历全部元素后仍未满足申请数量，将走Finish连线进行资源是否充足的判断：
     - 走"ResourceEnough2"分支：资源充足情况下，返回"资源充足，申请呼吸机成功！"。
     
     - 走"ResourceNotEnough2"分支：当此次申请的呼吸机资源数组中，实际存在的资源数量比申请的数量少时，代表申请的资源不足，返回信息"资源不足，申请失败！"。
      
    
图1总体编排流程   
![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001933046652.png "点击放大")
 #### 前提条件
开发呼吸机申请服务，首先需要创建呼吸机资源对象Respirator，作为呼吸机申请服务处理的对象。
表1Respirator对象自定义字段 
| 字段名      | 字段类型 | 字段含义                |
|:---|:---|:---|
| status   | 文本   | 呼吸机当前状态，"空闲"或"使用中"。 |
| hospital | 文本   | 呼吸机当前所在医院。          |
   
1. 参考[经典应用开发工作台介绍](https://support.huaweicloud.com/usermanual-astrozero/astrozero_05_0005.html)中操作，登录经典版应用设计器。
2. 将鼠标放在某个应用的目录上（例如，Model文件夹上），单击 "+"，选择"对象"。
3. 设置对象的标签和名称为"Respirator"，单击"添加"。
   
   图2添加Respirator对象   
   ![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001960285689.png "点击放大")
   
   
4. 在"自定义字段"页签，单击"新建"。
5. 字段类型选择"文本"，单击"下一步"。
6. 设置字段标签和名称为"status"，"数据长度"设置为"255"，单击"下一步"。
7. 设置字段的访问权限，即哪些Profile可以查看或修改该字段，单击"下一步"。
8. 添加到页面布局保持默认，即默认该字段加入所有布局，单击"保存"。
9. 参考[3]\~[8]中操作，新建"hospital"字段。
 
 #### 操作步骤
1. 参考[如何创建服务编排](https://support.huaweicloud.com/usermanual-astrozero/astrozero_05_0601.html#astrozero_05_0601__section1133218183213)中操作，创建一个名称和标签为"ProcessRespiratorResource"的服务编排。
   
   图3添加ProcessRespiratorResource服务编排   
   ![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001933046604.png "点击放大")
   
   
2. 参照[表2]，定义服务编排用到的变量，并设置该服务编排的入参和出参。
   
    表2变量说明 
   | 变量名                   | 变量类型           | 变量说明                       |
   |:---|:---|:---|
   | num                   | 数字             | 申请的呼吸机数量。                  |
   | count                 | 数字             | 添加到此次申请的呼吸机资源数组中资源数量。      |
   | hospital              | 文本             | 申请呼吸机的医院。                  |
   | msg                   | 文本             | 申请结果。                      |
   | RespiratorInfo        | Respirator对象   | 系统中空闲状态下的呼吸机资源数组元素。        |
   | RespiratorInfos       | Respirator对象数组 | 系统中空闲状态下的呼吸机资源数组。          |
   | RespiratorRecs        | Respirator对象数组 | 此次申请的原始呼吸机资源数组。            |
   | RespiratorInfosUpdate | Respirator对象数组 | 申请成功后，已修改所在地信息和状态的呼吸机资源数组。 |
      
   1. 在服务编排编辑器页面右侧，选择![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001960125953.png)。
   
   2. 在全局上下文页面，单击"变量"后的加号，创建普通变量。
      图4添加变量   
      ![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001960125997.png "点击放大") 
   
   3. 单击新增变量后的"..."，选择"设置"。
      图5设置变量   
      ![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001932887256.png "点击放大") 
   
   4. 配置数字类型的变量"num"，单击"保存"。
      图6配置变量   
      ![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001960125933.png "点击放大")
      表3变量参数说明 
      | 参数    | 参数说明                                                                    |
      |:---|:---|
      | 名称    | 新建变量的名称，直接输入"num"。                                                      |
      | 数据类型  | 变量的数据类型，根据需要直接在下拉框中选择即可。 本示例配置为"数字"。 |
      | 默认值   | 变量的默认取值。 本示例不用配置。                   |
      | 描述    | 新增变量的描述说明，建议填写该变量的作用。                                                   |
      | 是否为数组 | 是否为数组型变量即集合变量。 本示例不勾选。               |
         
      
   
   5. 参考上述操作，创建其他普通变量"count"（**数字** 类型）、"hospital"（**文本** 类型）和"msg"（**文本**类型）。
   
   6. 在全局上下文页面，单击"对象变量"后的![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001933046576.png)，创建对象变量。
      图7添加对象变量   
      ![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001932887220.png) 
   
   7. 设置对象变量名称为"RespiratorInfo" ，对象中选择[前提条件]中创建的对象Respirator，设置字段描述信息（可选），单击"保存"。
      图8配置对象变量   
      ![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001960285701.png "点击放大") 
   
   8. 按照上述操作，创建对象变量"RespiratorInfos"，对象选择[前提条件]中创建的对象Respirator，设置字段描述信息（可选），**选中"是否为数组"** ，单击"保存"。
      图9配置数组类型对象变量   
      ![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001960125989.png "点击放大") 
   
   9. 按照上述操作，创建**数组** 类型的对象变量"RespiratorRecs"和"RespiratorInfosUpdate"。
      所有变量创建完成后，效果如下图所示。
      图10成功创建变量效果   
      ![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001933046624.png "点击放大") 
   
   10. 设置开始图元的入参和出参。
       1. 在画布中，单击"开始"图元![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001960125893.png)。
       
       2. 在右侧菜单，选择![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001932887248.png)，单击右上角的"全局上下文"，进入"全局上下文"页面。
       
       3. 将变量"num"、变量"hospital"、数组对象变量"RespiratorInfos"拖拽到"入参"中，将变量"msg"、数组对象变量"RespiratorRecs"和"RespiratorInfosUpdate"拖拽到"出参"中。
          图11配置服务编排的入参、出参   
          ![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001960285801.png "点击放大") 
        
   
   
   
   
3. 编排该服务主要使用了"赋值"、"循环"、"跳出循环"和"决策"四种图元，按照下图将相关图元拖拽到画布中对应位置。 
   图12拖拽图元   
   ![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001960125881.png "点击放大")
   
   
4. 配置"循环"图元。
   
   1. 单击画布中的"循环"图元Loop0，在"基本信息"页面中配置图元标签为"循环呼吸机资源"、"名称"为"LoopRespirator"。
      图13配置"循环"图元基本信息   
      ![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001932887180.png "点击放大") 
   
   2. 单击![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001932887168.png)，在"循环"页面进行配置。
      将创建的对象变量"RespiratorInfos"，由展开的"全局上下文"页面拖拽到"数组"输入框中，将创建的对象变量"RespiratorInfo"拖拽到"元素"输入框中，"排序"保持"升序"。
      图14配置"循环"页面   
      ![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001960125993.png "点击放大")
      ![](https://support.huaweicloud.com/usermanual-astrozero/public_sys-resources/note_3.0-zh-cn.png)
      如上图配置，能够将数组对象变量RespiratorInfos进行遍历，并将数组中的每个元素放置到对象变量RespiratorInfo中，进行下一步操作。
      
   
   3. 在画布上，把鼠标放在起点图元![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001932887204.png)图元上，从"+"拖动鼠标，在起点图元和"循环"图元间增加连线。
   
   4. 从"循环"图元Loop0连向"赋值"图元Assignment0，连线类型为"Next"（即"下一个取值"）。
   
   5. 从"循环"图元Loop0连向"决策"图元Decision1，连线类型为"Finish"（即"遍历结束"）。
      图15连接图元   
      ![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001932887244.png "点击放大") 
   
   
   
   
5. 配置"赋值"图元Assignment0。 
   1. 单击画布中的"赋值"图元Assignment0，在"基本信息"页面中配置图元标签为"设置参数"、"名称"为"SetParams"。
   
   2. 如下图所示，单击![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001932887200.png)，在"赋值"页面单击"新增行"，添加赋值语句，在展开的"全局上下文"页面拖拽变量到赋值语句中。
      图16配置"赋值"图元   
      ![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001960285749.png "点击放大")
      ![](https://support.huaweicloud.com/usermanual-astrozero/public_sys-resources/note_3.0-zh-cn.png)
      赋值语句实现如下功能：
      - 将当前遍历的对象变量元素添加到此次申请的呼吸机资源数组中，并对计数进行加一操作。
      
      - 将当前遍历的对象变量元素的医院字段修改为发出申请的医院信息，将状态字段修改为"使用中"，并添加到数组中作为修改对象记录时的入参信息。
      
      - 赋值图元中的变量对顺序无要求，上图仅是示例。
        
   
   3. 从"赋值"图元Assignment0连向"决策"图元Decision0。
   
   
   
   
6. 配置"决策"图元Decision0。 
   1. 单击画布中的"决策"图元Decision0，在"基本信息"页面中配置图元标签为"判断资源是否足够"、"名称"为"JudgeNum"。
   
   2. 单击![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001932887268.png)，在"决策"页面做如下设置。
      如[图17]所示，单击"默认"结果，将名称设置为"ResourceNotEnough1"。如[图18]所示，单击"新增"，新增一个名为"ResourceEnough1"的结果。在右侧单击"新增行"，新增可视公式"{!num} == {!count}"。其中，变量和值是由展开的"全局上下文"页面拖拽来的。
      图17分支ResourceNotEnough1   
      ![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001932887240.png "点击放大")
      图18分支ResourceEnough1   
      ![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001960125941.png "点击放大") 
   
   3. 从"决策"图元Decision0连向"循环"图元，连线类型为"ResourceNotEnough1"，从"决策"图元Decision0连向"跳出循环"图元Break0，连线类型为"ResourceEnough1"。
      图19连接"决策"图元和其他图元   
      ![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001932887252.png "点击放大")
      ![](https://support.huaweicloud.com/usermanual-astrozero/public_sys-resources/note_3.0-zh-cn.png)
      连线的作用是当此次申请的呼吸机资源数组中的资源数量与申请的数量相同时，代表申请的资源已足够，走"ResourceEnough1"分支，可跳出循环。否则走"ResourceNotEnough1"分支，遍历一个元素进行数据处理。
      
   
   
   
   
7. 配置"跳出循环"图元Break0。 
   1. 单击画布中的"跳出循环"图元Break0，在"基本信息"页面中配置图元标签为"资源足够跳出循环"，名称为"Break"。
   
   2. 单击![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001960285673.png "点击放大")，在"跳出循环"页面的"循环"下拉框中，选择需要中断的循环"LoopRespirator"（在[4]中配置的"LoopRespirator"）。
      图20配置"跳出循环"页面   
      ![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001933046616.png "点击放大") 
   
   3. 从"跳出循环"Break0连向"赋值"图元Assignment1。
   
   
   
   
8. 配置"赋值"图元Assignment1。 
   1. 单击画布中的"赋值"图元Assignment1，在"基本信息"页面中配置图元标签为"设置资源充足的返回信息"，名称为"setSuccessed"。
   
   2. 如下图所示，单击![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001960285729.png)，在"赋值"页面单击"新增行"，添加赋值语句"msg = 资源充足，申请呼吸机成功！"。
      图21配置"赋值"图元Assignment1。   
      ![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001960125981.png "点击放大") 
   
   
   
   
9. 配置"决策"图元Decision1。 
   1. 单击画布中的"决策"图元Decision1，在"基本信息"页面中配置图元标签为"判断资源是否足够"，名称为"judgeNum2"。
   
   2. 单击![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001933046544.png)，在"决策"页面做如下设置。
      如[图22]所示，单击"默认"结果，将名称设置为"ResourceEnough2"。如[图23]所示，在右侧单击"新增行"，新增一个名为"ResourceNotEnough2"的结果，新增可视公式"{!num} \> {!count}"。
      图22分支"ResourceEnough2"   
      ![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001932887228.png "点击放大")
      图23分支"ResourceNotEnough2"   
      ![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001933046564.png "点击放大") 
   
   3. 从"决策"图元Decision1连向"赋值"图元"设置资源充足的返回信息"，连线类型为"ResourceEnough2"，从"决策"图元Decision1连向"赋值"图元Assignment2，连线类型为"ResourceNotEnough2"。
      图24连接"决策"图元和其他图元   
      ![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001960126009.png "点击放大")
      ![](https://support.huaweicloud.com/usermanual-astrozero/public_sys-resources/note_3.0-zh-cn.png)
      当此次申请的呼吸机资源数组中实际存在的资源数量比申请的数量少时，代表申请的资源不足，走"ResourceNotEnough2"分支，设置资源不足情况下的返回信息。否则走"ResourceEnough2"分支，资源充足情况下返回"资源充足，申请呼吸机成功！"。
      
   
   
   
   
10. 配置"赋值"图元Assignment2。 
    1. 单击画布中的"赋值"图元Assignment2，在"基本信息"页面中配置图元标签为"设置资源不足的返回信息"，名称为"setFailed"。
    
    2. 如下图所示，单击![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001932887192.png)，在"赋值"页面单击"新增行"添加如下赋值语句，从展开的"全局上下文"页面中拖拽变量和常量到赋值语句中。
       图25配置"赋值"图元Assignment2   
       ![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001932887196.png "点击放大")
       赋值语句如下：
       - msg = 资源不足，申请失败！
       
       - RespiratorRecs = {!$GlobalConstant.Null}
       
       - RespiratorInfosUpdate = {!$GlobalConstant.Null}
       
       
       ![](https://support.huaweicloud.com/usermanual-astrozero/public_sys-resources/note_3.0-zh-cn.png)
       配置服务返回信息参数，将对象数组清空，提示"资源不足，申请失败！"。
       
    
    
    
    
11. 在页面上方，单击![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001960285777.png)，保存服务编排。
12. 保存后，单击![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001932887208.png)，运行服务编排。
13. 在服务编排运行页面，设置输入参数，单击"运行"，申请2台呼吸机。 
    其中，"CNAME"为命名空间名称，请替换为环境中实际配置的命名空间。
    ```
    {
        "num": 2,
        "hospital": "第8人民医院",
        "RespiratorInfos": [
            {
                "CNAME__hospital__CST": "第1人民医院",
                "CNAME__status__CST": "空闲",
                "createdBy": "10gd000000cEMpInogYS",
                "createdBy.name": "test",
                "createdDate": "2020-12-14 17:18:12",
                "currencyIsoCode": "USD",
                "id": "cVjc000000fgrFwQI9WC",
                "lastModifiedBy": "10gd000000cEMpInogYS",
                "lastModifiedBy.name": "test",
                "lastModifiedDate": "2020-12-14 17:18:12",
                "name": "呼吸机3",
                "owner": "10gd000000cEMpInogYS",
                "owner.name": "test"
            },
            {
                "CNAME__hospital__CST": "第1人民医院",
                "CNAME__status__CST": "空闲",
                "createdBy": "10gd000000cEMpInogYS",
                "createdBy.name": "test",
                "createdDate": "2020-12-14 17:18:12",
                "currencyIsoCode": "USD",
                "id": "cVjc000000fgrFwSqXgm",
                "lastModifiedBy": "10gd000000cEMpInogYS",
                "lastModifiedBy.name": "test",
                "lastModifiedDate": "2020-12-14 17:18:12",
                "name": "呼吸机4",
                "owner": "10gd000000cEMpInogYS",
                "owner.name": "test"
            },
            {
                "CNAME__hospital__CST": "第2人民医院",
                "CNAME__status__CST": "空闲",
                "createdBy": "10gd000000cEMpInogYS",
                "createdBy.name": "test",
                "createdDate": "2020-12-14 17:18:12",
                "currencyIsoCode": "USD",
                "id": "cVjc000000fgrFwUpjbE",
                "lastModifiedBy": "10gd000000cEMpInogYS",
                "lastModifiedBy.name": "test",
                "lastModifiedDate": "2020-12-14 17:18:12",
                "name": "呼吸机5",
                "owner": "10gd000000cEMpInogYS",
                "owner.name": "test"
            },
            {
                "CNAME__hospital__CST": "第2人民医院",
                "CNAME__status__CST": "空闲",
                "createdBy": "10gd000000cEMpInogYS",
                "createdBy.name": "test",
                "createdDate": "2020-12-14 17:18:12",
                "currencyIsoCode": "USD",
                "id": "cVjc000000fgrFwX6Wdk",
                "lastModifiedBy": "10gd000000cEMpInogYS",
                "lastModifiedBy.name": "test",
                "lastModifiedDate": "2020-12-14 17:18:12",
                "name": "呼吸机6",
                "owner": "10gd000000cEMpInogYS",
                "owner.name": "test"
            },
            {
                "CNAME__hospital__CST": "第3人民医院",
                "CNAME__status__CST": "空闲",
                "createdBy": "10gd000000cEMpInogYS",
                "createdBy.name": "test",
                "createdDate": "2020-12-14 17:18:12",
                "currencyIsoCode": "USD",
                "id": "cVjc000000fgrFwbe6im",
                "lastModifiedBy": "10gd000000cEMpInogYS",
                "lastModifiedBy.name": "test",
                "lastModifiedDate": "2020-12-14 17:18:12",
                "name": "呼吸机8",
                "owner": "10gd000000cEMpInogYS",
                "owner.name": "test"
            }
        ]
    }
    ```
    
    
14. 检查输出页签的结果，是否符合预期。 
    返回如下信息，表示系统中空闲状态下的呼吸机数量大于申请所需的数量。在资源满足的情况下返回申请成功后，修改所在地信息和状态的呼吸机资源数组"RespiratorInfosUpdate"，以及返回申请的原始呼吸机资源数组"RespiratorRecs"。返回信息msg，即"资源充足，申请呼吸机成功！"。
    ```
    {
      "interviewId": "002N000000m53Y4zJwci",
      "outputs": {
        "RespiratorInfosUpdate": [
          {
            "createdBy": "10gd000000cEMpInogYS",
            "createdBy.name": "test",
            "createdDate": "2020-12-14 17:18:12",
            "currencyIsoCode": "USD",
            "CNAME__hospital__CST": "第8人民医院",
            "CNAME__status__CST": "使用中",
            "id": "cVjc000000fgrFwQI9WC",
            "lastModifiedBy": "10gd000000cEMpInogYS",
            "lastModifiedBy.name": "test",
            "lastModifiedDate": "2020-12-14 17:18:12",
            "name": "呼吸机3",
            "owner": "10gd000000cEMpInogYS",
            "owner.name": "test"
          },
          {
            "createdBy": "10gd000000cEMpInogYS",
            "createdBy.name": "test",
            "createdDate": "2020-12-14 17:18:12",
            "currencyIsoCode": "USD",
            "CNAME__hospital__CST": "第8人民医院",
            "CNAME__status__CST": "使用中",
            "id": "cVjc000000fgrFwSqXgm",
            "lastModifiedBy": "10gd000000cEMpInogYS",
            "lastModifiedBy.name": "test",
            "lastModifiedDate": "2020-12-14 17:18:12",
            "name": "呼吸机4",
            "owner": "10gd000000cEMpInogYS",
            "owner.name": "test"
          }
        ],
        "RespiratorRecs": [
          {
            "createdBy": "10gd000000cEMpInogYS",
            "createdBy.name": "test",
            "createdDate": "2020-12-14 17:18:12",
            "currencyIsoCode": "USD",
            "CNAME__hospital__CST": "第1人民医院",
            "CNAME__status__CST": "空闲",
            "id": "cVjc000000fgrFwQI9WC",
            "lastModifiedBy": "10gd000000cEMpInogYS",
            "lastModifiedBy.name": "test",
            "lastModifiedDate": "2020-12-14 17:18:12",
            "name": "呼吸机3",
            "owner": "10gd000000cEMpInogYS",
            "owner.name": "test"
          },
          {
            "createdBy": "10gd000000cEMpInogYS",
            "createdBy.name": "test",
            "createdDate": "2020-12-14 17:18:12",
            "currencyIsoCode": "USD",
            "CNAME__hospital__CST": "第1人民医院",
            "CNAME__status__CST": "空闲",
            "id": "cVjc000000fgrFwSqXgm",
            "lastModifiedBy": "10gd000000cEMpInogYS",
            "lastModifiedBy.name": "test",
            "lastModifiedDate": "2020-12-14 17:18:12",
            "name": "呼吸机4",
            "owner": "10gd000000cEMpInogYS",
            "owner.name": "test"
          }
        ],
        "msg": "资源充足，申请呼吸机成功！"
      }
    }
    ```
    
    
15. 在服务编排编辑器页面上方，单击![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001960125905.png)，启用服务编排。
 
