
# 创建"查询工单"脚本及公共接口
本节中的后台逻辑主要是通过脚本的形式，实现对工单记录的查询，然后将查询脚本封装成一个公共接口，供页面调用。
工单列表（客服人员）页面中，为了实现查询并显示已有工单信息功能，需要开发"查询工单"脚本和对应公共接口。
#### 创建"查询工单"脚本
1. 在"我的应用"中，单击"设备维修管理系统"，进入应用。
2. 在"WorkOrder"目录中，将鼠标放在"Script"上，单击界面上出现的"+"，在弹出菜单中选择"脚本"。
3. 在弹窗中，选中"创建一个新脚本"，在"名称"文本框中输入"queryWorkOrder"，单击"添加"。 
   系统实际创建的脚本名称为"***HW__*** queryWorkOrder"，"***HW__***"前缀由租户命名空间namespace决定。新建创建的脚本，默认是当前用户锁定状态，可以进行编辑保存等操作。
   当编辑已有脚本时，为防止编辑时多人篡改，编辑前请单击![](https://support.huaweicloud.com/bestpractice-astrozero/zh-cn_image_0000001482911645.png)进行锁定。
   
   
4. 在代码编辑器中插入如下脚本代码。 
   脚本代码中，"HW"为命名空间的名称，请根据实际需求进行替换。
   ```
   import * as context from 'context';
   import * as db from 'db';
   import * as decimal from 'decimal';//导入decimal数据类型相关的标准库
    
   @useObject(['HW__WorkOrder__CST'])
    
   @action.object({ type: "param" })
   export class ActionInput {
       @action.param({ type: 'String' })
       title: string;
       @action.param({ type: 'String' })
       status: string;
       @action.param({ type: 'String' })
       createdBy: string;
       @action.param({ type: 'Boolean' })
       isFME: boolean;
       @action.param({ type: 'Number', min: 0 })
       start: decimal.Decimal;//分页信息，表示从第几条数据开始查询
       @action.param({ type: 'Number', min: 0 })
       limit: decimal.Decimal;//分页信息，表示一次查询几条数据
   }
    
   @action.object({ type: "param" })
   export class ActionOutput {
       @action.param({ type: 'Any', label: 'object', isCollection: true })
       workOrderList: object[];
       @action.param({ type: 'String' })
       total: string;//总共查到几条数据
   }
    
   @action.object({ type: "method" })
   export class QueryWorkOrder {
       @action.method({ input: 'ActionInput', output: 'ActionOutput' })
       public queryWorkOrder(input: ActionInput): ActionOutput {
           let out = new ActionOutput();    //新建出参ActionOutput类型的实例，作为返回值
           let error = new Error();    //新建错误类型的实例，用于在发生错误时保存错误信息
           try {
               let s = db.object('HW__WorkOrder__CST');    //获取HW__WorkOrder__CST这个Object的操作实例
    
               //condition是db标准库queryByCondition方法的入参（查询条件）
               let condition = {
                   "conjunction": "AND",
                   "conditions": []
               };
               //基本查询条件
               condition.conditions.push({
                   "field": "id",
                   "operator": "isnotnull",
               });
               condition.conditions.push({
                   "field": "id",
                   "operator": "ne",
                   "value": ""
               });
               //按title查询
               if (input.title && input.title != "") {
                   condition.conditions.push({
                       "field": "HW__title__CST",//与对象中的字段名保持一致
                       "operator": "contains",
                       "value": input.title
                   });
               }
               //按status查询
               if (input.status && input.status != "") {
                   condition.conditions.push({
                       "field": "HW__status__CST",//与对象中的字段名保持一致
                       "operator": "eq",
                       "value": input.status
                   });
               }
               //按title查询
               if (input.createdBy && input.createdBy != "") {
                   condition.conditions.push({
                       "field": "createdBy",//与对象中的字段名保持一致
                       "operator": "eq",
                       "value": input.createdBy
                   });
               }
               if (input.isFME) {
                   condition.conditions.push({
                       "field": "HW__assignedFme__CST",
                       "operator": "eq",
                       "value": context.getUserName()
                   });
               }
               let option = {
                   "options": {
                       "orderby": [{
                           "field": "createdDate",
                           "order": "desc"
                       }]
                   }
               };
               //如果有分页
               if (input.start && input.limit) {
                   let start = decimal.toNumber(input.start);//将decimal类型转换为接口需要的number类型
                   let limit = decimal.toNumber(input.limit);
                   option.options['limit'] = limit;
                   option.options['skip'] = start;
               }
               let workOrderList = s.queryByCondition(condition, option);
               for (let i in workOrderList) {
                   if (workOrderList[i].HW__status__CST == "关闭") {
                       workOrderList[i].isDeal = true;
                   }
               }
               out.workOrderList = workOrderList;
               //调用查询符合condition条件的数据总数的接口
               out.total = s.count(condition) + "";
           } catch (error) {
               console.error(error.name, error.message);
               context.setError(error.name, error.message);
           }
           return out;
       }
   }
   ```
   
   
5. 单击编辑器上方的![](https://support.huaweicloud.com/bestpractice-astrozero/zh-cn_image_0000001483071933.png)，保存图标。
6. 测试脚本能否正常执行。 
   1. 单击编辑器上方的![](https://support.huaweicloud.com/bestpractice-astrozero/zh-cn_image_0000001432992754.png)，执行脚本。
   
   2. 在界面底部，查询脚本可以不提供输入参数，直接单击测试窗口右上角![](https://support.huaweicloud.com/bestpractice-astrozero/zh-cn_image_0000001432992758.png)执行图标。
      执行成功，会在"输出"页签返回查询结果。
      图1输出结果示例   
      ![](https://support.huaweicloud.com/bestpractice-astrozero/zh-cn_image_0000001432835130.png "点击放大") 
   
   
   
   
7. 测试成功，单击编辑器上方的![](https://support.huaweicloud.com/bestpractice-astrozero/zh-cn_image_0000001432835122.png)，启用发布脚本。
 
#### 创建"查询工单"公共接口
1. 在"我的应用"中，单击"设备维修管理系统"，进入应用。
2. 单击页面下方的"服务"，进入公共接口创建页面。
3. 单击"新建"，创建"查询工单"脚本"***HW__*** queryWorkOrder"的公共接口。
   
   设置接口参数信息：操作名称为"queryWorkOrder"，版本为"1.0.0"，URL为"/queryWorkOrder"，"类型"选择"脚本"，"资源"为"***HW__***queryWorkOrder"，方法为"POST"，然后单击"保存"。
   其中，"***HW__***"前缀由租户命名空间namespace决定，请根据实际情况进行选择。
   图2新建queryWorkOrder接口   
   ![](https://support.huaweicloud.com/bestpractice-astrozero/zh-cn_image_0000001482991373.png "点击放大")
   
   
 
