# 开发一个业务场景脚本实例
#### 场景说明
根据**对象**的数据生成资源列表数据，用于前台数据呈现，启用本脚本后，可实现数据导入模板使用。
创建脚本前，需要**先创建** 脚本中操作的对象ApprovedResource，其字段如[表1]所示。
 表1对象说明 
| 字段标签        | 字段名称           | 字段类型  | 取值                                                                                                                                                                                                                                                                                                        | 读写权限 | 含义       |
|:---|:---|:---|:---|:---|:---|
| ownerId      | ownerId       | 文本   | 长度：255                                                                                                                                                                                                                                                                                                    | 全选     | 资源拥有者ID |
| ResourceName | ResourceName | 文本  | 长度：255                                                                                                                                                                                                                                                                                                      | 全选     | 资源名称    |
| Type          | Type             | 选项列表   | 枚举值如下： - File  - Folder                                                                                         | 全选   | 资源类型      |
| SubmitDate     | SubmitDate     | 日期/时间 | 不涉及                                                                                                                                                                                                                                                                                                       | 全选  | 资源提交时间  |
| ApproveDate  | ApproveDate     | 日期/时间  | 不涉及                                                                                                                                                                                                                                                                                                        | 全选     | 资源审批时间   |
| Status       | Status          | 选项列表  | 枚举值如下： - Waiting  - Submitted  - Approved   | 全选     | 审批状态      |
   
#### 开发一个业务场景脚本实例
1. 参考[登录经典应用设计器](https://support.huaweicloud.com/usermanual-astrozero/astrozero_05_5025.html)中操作，登录经典版应用设计器。
2. 创建一个脚本操作的对象ApprovedResource。 
   1. 将光标放在一个存放对象的应用目录（例如Model）上，单击![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001960126437.png)，选择"对象"。
   
   2. 设置对象的标签和名称为"ApprovedResource"，单击"添加"。
      图1添加对象ApprovedResource   
      ![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001960286269.png "点击放大") 
   
   3. 导入字段模板，创建字段模板。 请单击[import-fields-template.zip](https://obs-for-bj4-gongyouyun-update.obs.cn-north-4.myhuaweicloud.com/obs/deploy/import-fields-template.zip)，下载并解压获取"import-fields-template.xlsm"，将待导入字段模板到本地。
      
   
   4. 在自定义对象的"自定义字段"页签，单击"批量创建 \> 批量导入字段"，选择上一步下载的字段模板，单击"确定"。
      图2批量导入字段   
      ![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001960126469.png "点击放大") 
   
   
   
   
3. 将光标放在某个文件夹（例如Logic）上，单击![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001933047128.png)，选择"脚本"。
4. 选择"创建一个新脚本"，设置脚本名称为"ResourceListScript"，单击"添加"，进入脚本编辑器页面。 
   图3新增脚本   
   ![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001960286261.png "点击放大")
   - 名称：新增脚本的名称，设置为ResourceListScript。
   
   - 模板：脚本模板，用于生成不同类型的脚本，本示例设置为"空脚本"。
     - 空脚本：创建一个空脚本。
     
     - 空白测试脚本：创建一个空测试脚本。
     
     - 示例服务脚本：对外提供服务的脚本，可通过restful直接调用。
     
     - 示例内部脚本：是内部库代码，只能被其它脚本import使用。
     
     - 示例安装脚本：在安装或升级应用/BO包时，在导入实例化配置数据之前或者之后执行的脚本。一般用于预清理数据、删除和更新数据等。
     
     - 示例自定义接口前置/后置脚本：在开放低代码平台的服务编排、脚本或者操作对象数据接口给第三方系统调用时，通过该示例脚本可实现在第三方系统配置这些接口的访问权限。
      
   
   - 描述：新建脚本的描述信息，建议设置为脚本的功能。
   
   
   
   
5. 在脚本编辑器中，将以下脚本代码粘贴到代码编辑区。 
   其中，"CNAME__"替换为实际的命名空间、对象名、字段名。
   ```
   //导入该脚本所依赖的标准库文件，decimal和context是系统预置的标准库。
   import * as db from 'db';
   import * as decimal from 'decimal';
   import * as context from 'context';
   //声明该脚本中所应用到的ApprovedResource__CST对象
   @useObject(['CNAME__ApprovedResource__CST'])
   //定义入参变量ownerId、limit、offset，分别表示资源拥有者ID、每页展示的资源条数、每页展示第一条资源的偏移量，即从offset+1条资源开始展示。
   @action.object({ type: 'param' })
   export class Input {
       @action.param({ type: 'string', required: true })
       ownerId: string;
       @action.param({ type: 'number', required: true })
       limit: number;
       @action.param({ type: 'number', required: true })
       offset: number;
   }
   //定义出参变量resource和totalCount，分别表示资源数组集合和资源总数（固定100）。
   @action.object({ type: 'param' })
   export class Output {
       @action.param({ type: 'any', isCollection: true, label: "object" })
       resource: object[];
       @action.param({ type: 'number' })
       totalCount: number;
   }
   //定义查询SQL语句，用于查询某条资源审批详情；SQL语句中的表名和字段名要和预定义的对象名和字段名保持一致。
   class querySql {
       static queryRecord = "select CNAME__Status__CST, CNAME__SubmitDate__CST, CNAME__ApproveDate__CST from CNAME__ApprovedResource__CST where CNAME__ownerId__CST=? and CNAME__ResourceName__CST=?";
   }
   //定义数据源方法体，用于模拟数据源，并支持状态检查和分页功能。
   @action.object({ type: 'method' })
   export class getFileList {
       @action.method({ input: "Input", output: "Output", label: "getFileList" })
       getFileList(input: Input): Output {
           let outResult = new Output()
           let resource: Array<Object> = [];
           let resourceLimit: Array<Object> = [];
           outResult.totalCount = 100;
           try {
               let sequence = "";
               for (let i = 1; i < 51; i++) {
                   if (i < 10) {
                       sequence = "0" + i;
                   } else {
                       sequence = "" + i;
                   }
                   let file = {
                       "ownerId": input.ownerId,
                       "approveDate": null,
                       "resourceName": "File" + sequence,
                       "status": "Waiting",
                       "submitDate": null,
                       "type": "File"
                   }
                   let folder = {
                       "ownerId": input.ownerId,
                       "approveDate": null,
                       "resourceName": "Folder" + sequence,
                       "status": "Waiting",
                       "submitDate": null,
                       "type": "Folder"
                   }
                   resource.push(file);
                   resource.push(folder);
               }
               if (resource.length > 0) {
                   for (let i = 0; i < resource.length; i++) {
                       let s = db.sql()
                       let query = s.exec(querySql.queryRecord, { params: [input.ownerId, resource[i].resourceName] });
                       if (query.length == 1) {
                           resource[i].status = query[0]["CNAME__Status__CST"];
                           resource[i].submitDate = query[0]["CNAME__SubmitDate__CST"];
                           resource[i].approveDate = query[0]["CNAME__ApproveDate__CST"];
                       }
                   }
               }
               for (let j = 0; j < decimal.toNumber(input.limit); j++) {
                   console.log(decimal.toNumber(input.offset) + j);
                   resourceLimit.push(resource[decimal.toNumber(input.offset) + j]);
                   outResult.resource = resourceLimit;
               }
               return outResult;
           } catch (error) {
               console.log(error.name, error.message);
               error.Error(error.name, error.message);
           }
       }
   }
   ```
   
   
6. 单击代码编辑器上方的![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001960126473.png)，保存脚本。
7. 运行测试脚本。 
   1. 单击编辑器上方的![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001932887740.png)，执行脚本。
   
   2. 在页面底部"输入参数"页签中，输入请求报文，单击测试窗口右上角的![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001960286273.png)。
      ```
      { 
         "ownerId":"123", 
         "limit":3, 
         "offset":1
      }
      ```
      脚本的入参支持写入http-header参数，如下所示。
      ```
      {
        "http-header": {
          "header1": "value1"
        }
      }
      ```
      
   
   3. 检查输出参数中的结果，是否符合预期。
      ```
      {
          "resource": [
              {
                  "approveDate": null,
                  "ownerId": "123",
                  "resourceName": "Folder01",
                  "status": "Waiting",
                  "submitDate": null,
                  "type": "Folder"
              },
              {
                  "approveDate": null,
                  "ownerId": "123",
                  "resourceName": "File02",
                  "status": "Waiting",
                  "submitDate": null,
                  "type": "File"
              },
              {
                  "approveDate": null,
                  "ownerId": "123",
                  "resourceName": "Folder02",
                  "status": "Waiting",
                  "submitDate": null,
                  "type": "Folder"
              }
          ],
          "totalCount": 100
      }
      ```
      
   
   
   
   
8. 单击代码编辑器上方的![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001960286277.png)，启用脚本。
   
   后续在新版本功能中如果需要更新该脚本，可单击编辑器上方的![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001933047132.png)，选择"新建版本"。在新建的版本中更改脚本并保存、测试及启用。单击编辑器上方的![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001933047140.png)，选择对比版本，可将当前版本与历史版本进行比对。
   
   
 
