# 开发 mm Task 定时任务

## 规则（Rules）

- 定时任务位于 `app/{模块名}/plugin/{插件名}/task/{任务名}/` 下
- 每个任务包含 `task.json` + `index.js`
- 需要在 `config.json` 的 `sys.task` 中启用定时任务功能
- 在所属 App 的 `_init` 中调用 `$.admin.task()` 注册

## 方法（Methods）

### 步骤1：启用定时任务

在 `config.json` 中设置：

```json
"sys": {
    "task": true
}
```

### 步骤2：创建目录结构

```
app/{模块名}/plugin/{插件名}/task/{任务名}/
├── task.json
└── index.js
```

### 步骤3：编写 task.json

```json
{
    "name": "my_task",
    "title": "我的定时任务",
    "description": "任务描述",
    "state": 1,
    "interval": 3600000,
    "wait": 0,
    "time": "",
    "main": "./index.js",
    "func_name": "main",
    "scope": "sys",
    "sort": 100,
    "show": 0,
    "end": false
}
```

关键字段：
- `interval`：执行间隔（毫秒），如 `3600000` 为1小时，`10800000` 为3小时
- `wait`：启动后延迟执行时间（毫秒），0 表示立即执行
- `time`：指定执行时间，如 `"02:00"` 表示凌晨2点
- `state`：1 启用，0 禁用

### 步骤4：编写 index.js

```javascript
async function main() {
    $.log.info('定时任务执行');
    // 业务逻辑
    var list = await db.new('表名', '主键').get({ state: 1 });
    // 处理数据...
}
exports.main = main;
```

### 步骤5：注册定时任务

在所属 App 的 `_init` 中注册：

```javascript
if (config.sys.task) {
    var task = $.admin.task('app名', '定时任务');
    await task.call('update', 'app/');
    task.run();
}
```

## 技巧（Tips）

- **interval** 设置合理间隔，避免高频执行影响性能
- **日志记录**：任务中记录执行日志便于排查问题
- **超时保护**：长任务设置超时机制，避免任务堆积
- **参考实现**：`app/tool/plugin/baidu_submit/task/auto_baidu_submit/`
