```markdown
## 任务相关

#### 校验任务参数

* 方法说明

  校验输入参数中的 task_id 和 task_label 字段对应的数据是否在数据库中存在。

```python
async def check_task_param(param: str) -> bool
```

* 输入参数

  其参数 `param` 是 JSON 字符串，结构如下：

```
{
    # 任务类型 id
    "task_id": "12345",
    # 任务名称
    "task_label": "Ps2Ws"
}
```

* 输出参数
* True，对应的任务数据在数据库中存在。
* False，对应的任务数据在数据库中不存在，或task_id和task_label同时为空。
* 异常

  本方法不抛出异常。

#### 异步创建并运行一个任务

* 方法说明

  本方法是非阻塞方法，将在脚本中创建一个线程，来执行天风任务的实例。

```python 
async def create_wind_task(param: str) -> str
```

* 输入参数

  其参数 `param` 是 JSON 字符串，结构如下：

```
{
    # 任务类型 id
    "task_id": "12345",
    # 任务名称
    "task_label": "Ps2Ws",
    # 指定创建的任务实例的id
    "task_record_id": "04d11f4f-d17c-4a41-9cf7-67de468035f9",
    # 在天风任务中定义的参数
    "input_params": "{\"fromSite\":\"PS-01\"}"
}
```

**注意**：`task_id` 和 `task_label` 两者必选其一。如果同时存在，将首选使用 `task_id` 字段。

**注意，input_params 字段，是个 JSON 字符串。需要在脚本里将任务参数序列化为 JSON。**

* 输出参数

  JSON字符串

```
{
    "code": 200,  # 200表示成功 -1表示失败
    "msg": ""     # 提示信息
}
```

* 异常

  本方法不抛出异常。

#### 根据任务实例 ID 查询任务实例

* 方法说明

  根据任务实例 ID 查询任务数据。

```python
async def get_task_record_by_id(task_record_id: str) -> str
```

* 输入参数

  task_record_id，str 类型，是任务实例的唯一 ID。
* 输出参数
* 如存在指定 ID 的任务实例，返回 JSON 格式的字符串。

  ```
  {
      # 任务实例id
      "id": "123",
      # 天风任务id
      "def_id": "6743",
      # 天风任务名
      "def_label": "agvMove",
      # 任务实例状态（1000：运行中，1001：终止，1002：暂停，1003：结束，1004：异常结束，1005：重启异常，1006：异常中断）
      "status": 1000,
      # 任务创建时间
      "created_on": "2022-02-12 11:23:12.0",
      # 任务结束时间
      "ended_on": "2022-02-12 11:26:12.0",
      # 任务状态描述
      "state_description": "物料搬运中",
      # 外部订单号
      "out_order_no": "D6567812",
      # 机器人Id
      "agv_id": ""
  }
  ```
* 如果不存在指定 ID 的任务实例，返回 "null"。
* 异常

  本方法抛出异常。

#### 根据外部单号查询任务实例列表

* 方法说明

  根据外部单号查询任务实例列表。

```python
async def get_task_record_by_agv_id(agv_id: str) -> str
```

* 输入参数

  agv_id，str 类型，是机器人 ID。
* 输出参数（JSON 格式的字符串）：

  是 JSON 数组，包含查询到的任务实例数据。

```
  [{
      # 任务实例id
      "id": "123",
      # 天风任务id
      "def_id": "6743",
      # 天风任务名
      "def_label": "agvMove",
      # 任务实例状态（1000：运行中，1001：终止，1002：暂停，1003：结束，1004：异常结束, 1005：重启异常, 1006：异常中断）
      "status": 1000,
      # 任务创建时间
      "created_on": "2022-02-12 11:23:12",
      # 结束原因
      "ended_reason": "运行结束",
      # 任务结束时间
      "ended_on": "2022-02-12 11:26:12",
      # 任务状态描述
      "state_description": "物料搬运中",
      # 外部订单号
      "out_order_no": "D6567812"
  }]
```

如果不存在对应机器人的任务实例数据，返回 "[]"。

* 异常

  本方法抛出异常。

#### 任务封口

* 方法说明

  将VWED任务系统中指定ID的任务封口。

```python
async def mark_complete(task_id: str, auto_get_token: bool = True) -> Dict[str, Any]
```

* 输入参数

  task_id，str 类型，VWED任务系统任务ID。
  auto_get_token，bool 类型，是否自动获取登录token，默认True。
* 输出参数

  返回字典类型，包含封口结果信息。
  
```
{
    "success": True/False,    # 封口是否成功
    "message": "...",         # 提示信息
    "data": {...}            # 封口结果数据（成功时）
}
```

* 异常

  本方法不抛出异常。

#### 校验任务实例ID是否存在

* 方法说明

  校验任务实例id是否存在。

```python
async def is_task_record_id_exist(task_record_id: str) -> bool
```

* 输入参数

  task_record_id，str 类型，任务实例id。
* 输出参数
* True，存在。
* False，不存在。
* 异常

  本方法会抛出异常。

#### 校验任务名称是否存在

* 方法说明

  校验任务名称是否存在。

```python
async def is_task_label_exist(task_name: str) -> bool
```

* 输入参数

  task_name，str 类型，任务名称。
* 输出参数
* True，存在。
* False，不存在。
* 异常

  本方法会抛出异常。

#### 根据查询条件获取任务实例

* 方法说明

  根据参数的条件查询任务实例。

```python
async def query_task_record(param: str) -> str
```

* 输入参数

  其参数 `param` 是 JSON 字符串，结构如下：

```
{
    # 任务类型 id
    "task_id": "",
    # 任务实例 id
    "task_record_id": "",
    # 任务实例状态（1000：运行中，1001：终止，1002：暂停，1003：结束，1004：异常结束，1005：重启异常，1006：异常中断）
    "status": "",
    # 执行任务的机器人 id
    "agv_id": "",
    # 开始时间，需满足'yyyy-MM-dd HH:mm:ss'格式。如果该值非空，则返回创建日期大于该时间的任务实例
    "start_date": "",
    # 结束时间，需满足'yyyy-MM-dd HH:mm:ss'格式。如果该值非空，则返回创建日期小于该时间的任务实例
    "end_date": ""
}
```

* 输出参数

  是 JSON 数组，包含查询到的任务实例数据。

```
  [{
      # 任务实例id
      "id": "123",
      # 天风任务id
      "def_id": "6743",
      # 天风任务名
      "def_label": "agvMove",
      # 任务实例状态（1000：运行中，1001：终止，1002：暂停，1003：结束，1004：异常结束，1005：重启异常，1006：异常中断）
      "status": 1000,
      # 任务创建时间
      "created_on": "2022-02-12 11:23:12",
      # 结束原因
      "ended_reason": "运行结束",
      # 任务结束时间
      "ended_on": "2022-02-12 11:26:12",
      # 任务状态描述
      "state_description": "物料搬运中",
      # 外部订单号
      "out_order_no": "D6567812"
  }]
```

如果不存在满足条件的任务实例数据，返回 "[]"。

* 异常

  本方法抛出异常。

#### 接收并持久化第三方系统任务请求

* 方法说明

```python
def save_task_log(log_param: str) -> None
```

* 输入参数

  其参数 `param` 是 JSON 字符串，结构如下：

```
{
    # 任务类型 id
    "task_id": "402883a27cda555f017cda6f55ad01b6",
    # 任务实例 id
    "task_record_id": "04d11f4f-d17c-4a41-9cf7-67de468035f9",
    # 任务块 id
    "block_id": 2,
    # 日志信息
    "message": "[RootBp]任务开始运行：task_id=402883a27cda555f017cda6f55ad01b6",
    # 日志级别：1，正常运行；2，正常停止；3，异常中断。
    "level": 1
}
```

* 输出参数

  无
* 异常

  本方法不抛出异常。

#### 创建并运行一个任务

* 方法说明

  本方法是阻塞方法，可以在脚本中创建一个天风任务的实例，并在任务执行结束后返回。

```python
async def sync_create_wind_task(task_param: str) -> str
```

* 输入参数

  其参数 `param` 是 JSON 字符串，结构如下：

```
{
    # 任务类型 id
    "task_id": "12345",
    # 任务名称
    "task_label": "Ps2Ws",
    # 指定创建的任务实例的id
    "task_record_id": "04d11f4f-d17c-4a41-9cf7-67de468035f9",
    # 在天风任务中定义的参数
    "input_params": "{\"fromSite\":\"PS-01\"}"
}
```

**注意**，`task_id` 和 `task_label` 两者必选其一。如果同时存在，将首选使用 `task_id` 字段。

**注意，input_params 字段，是个 JSON 字符串。需要在脚本里将任务参数序列化为 JSON。**

* 输出参数
* "9013"，任务正常结束。
* "9014"，任务异常结束。
* 异常

  本方法不抛出异常。

#### 终止任务

* 方法说明

  本方法是非阻塞方法，可用于终止多个正在运行的天风任务实例。

```python
async def terminate_tasks(param: str) -> None
```

* 输入参数

  其参数 `param` 是 JSON 字符串，结构如下：

```
[
    {
        # 指定创建的任务实例的id
        "task_record_id": "04d11f4f-d17c-4a41-9cf7-67de468035f9"
    },
    {
        # 指定创建的任务实例的id
        "task_record_id": "04d11f4f-d17c-4a41-9cf7-67de468035fe"
    }
]
```

* 输出参数

  无
* 异常

  本方法会抛出异常。

#### 查询子任务的任务id列表

* 方法说明

  本方法是非阻塞方法，可根据父任务的id查询所有子任务的id。

```python
async def get_children_task_record_id(record_id: str) -> str
```

* 输入参数

  record_id，父任务的record_id。
* 输出参数

  包含子任务id的 JSON 字符串，转换成 JSON 对象之后的示例数据如下所示：

```
[
"child-58d549a4-6d4c-4e01-a327-269e3d4c1863",
"child-sdsdfvsd-qrwe-4e02-a327-269eqwcfs863"
]
```

​ 如果不存在满足条件的子任务，返回 "[]"。

* 异常

  本方法会抛出异常。

#### 设置任务优先级

* 方法说明

  本方法是非阻塞方法，可根据设置任务的优先级。设置前会先验证任务记录ID是否存在。

```python
async def set_task_priority(task_record_id: str, priority: int) -> None
```

* 输入参数

  task_record_id，任务的实例id。

  priority, 任务的优先级
* 输出参数

  无
* 异常

  本方法会抛出异常。当任务记录ID不存在时，会抛出包含详细错误信息的异常。