# Глава 11: Подзадачи и расчёт трудозатрат

<iframe width="800" height="436" src="https://player.bilibili.com/player.html?isOutside=true&aid=114042521847248&bvid=BV13jPcedEic&cid=28510064142&p=1" scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="true"></iframe>

Дорогие друзья, перед нами новая глава! По мере роста бизнеса задач становится больше и они усложняются — простого управления уже недостаточно. Нам нужно более детально работать с задачами, разбивая их на уровни и помогая команде работать эффективнее!

### 11.1 Планирование задач: от общего к частному

Мы будем разбивать сложные задачи на управляемые подзадачи, отслеживать их прогресс и поддерживать многоуровневую иерархию. Приступим к планированию!

---

### 11.2 Создание таблицы подзадач

#### 11.2.1 Проектирование структуры подзадач

Создадим «Таблицу подзадач» (Sub Tasks — [**древовидная таблица**](https://docs-cn.nocobase.com/handbook/collection-tree)) с древовидной структурой. Атрибуты подзадачи похожи на основную задачу: «Название», «Статус», «Ответственный», «Прогресс» и т. п. При необходимости можно добавить комментарии, документы и пр.

Чтобы связать подзадачи с основной задачей, создадим связь многие-к-одному: каждая подзадача относится к одной основной задаче. Также добавим обратное отношение, чтобы прямо в основной задаче можно было просматривать и управлять подзадачами.

![](https://static-docs.nocobase.com/nocobase_tutorials_zh/202412210038668.png)

> 💡 Совет: рекомендуется создавать подзадачи в блоке связанных данных на странице основной задачи — так удобнее!

#### 11.2.2 Отображение подзадач на странице управления задачами

Установите способ просмотра «Таблицы задач» в [**режим страницы**](https://docs-cn.nocobase.com/handbook/ui/pop-up#%E9%A1%B5%E9%9D%A2).

![](https://static-docs.nocobase.com/nocobase_tutorials_zh/202412210038281.png)

На странице создайте новую вкладку «Управление подзадачами», добавьте таблицу подзадач и выберите древовидное представление. Так подзадачи можно будет просматривать и управлять ими прямо на странице задачи.

![](https://static-docs.nocobase.com/nocobase_tutorials_zh/202412210039360.png)

---

### 11.3. График сравнения трудозатрат: оценка общих трудозатрат и прогресса (опционально)

Не теряя темпа, создадим детализацию трудозатрат и график их сравнения, чтобы оценивать общие трудозатраты и прогресс.

#### 11.3.1 Добавление полей времени и трудозатрат для подзадач

Добавьте в таблицу подзадач следующие поля:

- **Дата начала**
- **Дата окончания**
- **Общие трудозатраты**
- **Оставшиеся трудозатраты**

![](https://static-docs.nocobase.com/nocobase_tutorials_zh/202412210039376.png)

С помощью этих полей можно динамически рассчитывать продолжительность задачи и затраты времени.

#### 11.3.2 Расчёт продолжительности задачи

Создадим в таблице подзадач [поле-формулу](https://docs-cn.nocobase.com/handbook/field-formula) «Дни», вычисляющее продолжительность задачи.

![](https://static-docs.nocobase.com/nocobase_tutorials_zh/202412210039534.png)

Формулы могут вычисляться разными способами:

- Math.js

  > Использует библиотеку [math.js](https://mathjs.org/) — позволяет вычислять сложные числовые формулы.
  >
- Formula.js

  > Использует библиотеку [Formula.js](https://formulajs.info/functions/) — для распространённых формул. Если Вы знакомы с формулами Excel, она Вам понравится!
  >
- Шаблон строк

  > Способ конкатенации строк — подходит для динамических описаний, номеров и т. п.
  >

Здесь подойдёт `Formula.js` — она похожа на Excel и удобна для распространённых формул.

Формула для поля «Дни»:

```html
DAYS(Дата окончания, Дата начала)
```

Используйте латиницу в нижнем регистре, чтобы избежать ошибок.

![](https://static-docs.nocobase.com/nocobase_tutorials_zh/202412210039721.png)

Проверим на странице — поле «Дни» уже динамически меняется в зависимости от дат начала и окончания!

![](https://static-docs.nocobase.com/nocobase_tutorials_zh/202412210040540.png)

---

### 11.4 Ежедневный учёт трудозатрат: отслеживание реального прогресса (опционально)

#### 11.4.1 Создание таблицы ежедневного учёта трудозатрат

Создадим таблицу ежедневного учёта трудозатрат для фиксации ежедневных результатов. Поля:

- **Трудозатраты за день** (hours, рекомендуется целое число)
- **Дата**
- **Идеальные трудозатраты** (ideal_hours, рекомендуется целое число)
- **Связанная подзадача**: связь [многие-к-одному](https://docs-cn.nocobase.com/handbook/data-modeling/collection-fields/associations/m2o) с подзадачами.

![](https://static-docs.nocobase.com/nocobase_tutorials_zh/202412210040220.png)

#### 11.4.2 Отображение ежедневных трудозатрат на странице подзадачи

Вернитесь на страницу редактирования подзадачи и выведите таблицу ежедневных трудозатрат как [подтаблицу](https://docs-cn.nocobase.com/handbook/ui/fields/specific/sub-table); расставьте остальные поля. Это позволит удобно вводить и просматривать трудозатраты на странице подзадачи.

![](https://static-docs.nocobase.com/nocobase_tutorials_zh/202412210040223.png)

![](https://static-docs.nocobase.com/nocobase_tutorials_zh/202412210040658.png)

---

### 11.5 Ключевые расчёты и правила связывания (опционально)

Чтобы точнее оценивать прогресс задач и оставшиеся трудозатраты, выполним несколько ключевых настроек.

#### 11.5.1 Настройка [обязательных полей](https://docs-cn.nocobase.com/handbook/ui/fields/field-settings/required) для подзадачи

Сделайте поля **Дата начала**, **Дата окончания** и **Прогноз трудозатрат** [обязательными](https://docs-cn.nocobase.com/handbook/ui/fields/field-settings/required), чтобы все данные были заполнены и могли использоваться для расчёта.

#### 11.5.2 Настройка [правил связывания](https://docs-cn.nocobase.com/handbook/ui/actions/action-settings/linkage-rule) для доли выполнения и оставшихся трудозатрат

Добавьте в таблицу подзадач следующие правила:

- **Доля выполнения**: сумма ежедневных трудозатрат / прогноз трудозатрат

```html
SUM(【Текущая форма / Ежедневные трудозатраты / Трудозатраты за день】)  /  【Текущая форма / Прогноз трудозатрат】
```

- **Оставшиеся трудозатраты**: прогноз трудозатрат - сумма ежедневных трудозатрат

```html
【Текущая форма / Прогноз трудозатрат】 - SUM(【Текущая форма / Ежедневные трудозатраты / Трудозатраты за день】)
```

![202411170353551731786835.png](https://static-docs.nocobase.com/nocobase_tutorials_zh/202412210041551.png)

- Аналогично настроим правило связывания для идеальных трудозатрат в таблице ежедневных трудозатрат:

```html
  【Текущая форма / Прогноз трудозатрат】 / 【Текущая форма / Длительность задачи】
```

![](https://static-docs.nocobase.com/nocobase_tutorials_zh/202412210041181.png)

![](https://static-docs.nocobase.com/nocobase_tutorials_zh/202412210041066.png)

Так мы в реальном времени получаем долю выполнения и оставшиеся трудозатраты.

![](https://static-docs.nocobase.com/nocobase_tutorials_zh/202412210041018.png)

### 11.6 Создание графика прогресса задачи (опционально)

#### 11.6.1 Создание [графика](https://docs-cn.nocobase.com/handbook/data-visualization/user/chart-block) прогресса

Создайте новый блок графика, отображающий **сумму ежедневных трудозатрат** и **сумму идеальных трудозатрат** в динамике по датам.

Установите ограничение 【Связанная задача/Id】 равно 【Текущая запись модального окна/ID】 — так график будет отражать реальную ситуацию по текущей задаче.

![202411170417341731788254.png](https://static-docs.nocobase.com/nocobase_tutorials_zh/202412210042680.png)

![202411170418231731788303.png](https://static-docs.nocobase.com/nocobase_tutorials_zh/202412210042027.png)

#### 11.6.2 Отображение базовой информации и динамики прогресса

Помните [блок Markdown](https://docs-cn.nocobase.com/handbook/ui/blocks/other-blocks/markdown)? Через него выведем базовую информацию о задаче и её прогрессе.

Используем шаблон [`Handlebars.js`](https://docs-cn.nocobase.com/handbook/template-handlebars), чтобы отрендерить процент:

![](https://static-docs.nocobase.com/nocobase_tutorials_zh/202412210043291.png)

```html
Progress of Last Update:
<p style="font-size: 54px; font-weight: bold; color: green;">
{{floor (multiply $nRecord.complete_percent 100)}}
 %
</p>
```

Для динамического рендеринга используется синтаксис [Handlebars.js](https://docs-cn.nocobase.com/handbook/template-handlebars) — подробности в официальной документации.

---

### 11.7 Итог

Поздравляем! Мы реализовали разбиение задач на подзадачи. Многоуровневое управление, ежедневный учёт трудозатрат и графики позволяют чётко видеть прогресс и помогают команде работать эффективнее. Спасибо за терпение, продолжайте в том же духе — впереди увлекательная [следующая глава](https://www.nocobase.com/cn/tutorials/project-tutorial-meeting-room-booking)!

---

Продолжайте экспериментировать! Если возникнут вопросы — не забывайте о [официальной документации NocoBase](https://docs-cn.nocobase.com/) и [сообществе NocoBase](https://forum.nocobase.com/).
