Задача [0156, часть 3]: Шаблоны проектов: API, события

Формулировка проблемы: необходимо выделить все свойства шаблона проекта.

Связанные задачи: 0156, часть 1, 0156, часть 2, 0156, часть 4, 0156, часть 5.

Общее решение по «Шаблонам проектов» поделено на 5 задач. В данной задаче добавлены новые методы API.

Решение: необходимо реализовать следующие API методы для работы с шаблонами проектов, оперирующие объектами "Шаблон проекта":

Структура объектов "Шаблон проекта"
  • settings:

    • calcType - тип расчета сроков:

      • 0 - автоматический;

      • 1 - ручной;

    • progressCalcType - тип расчета прогресса:

      • 0 - Среднее арифметическое;

      • 1 - Среднее взвешенное;

    • progressRecalculation - перерасчет прогресса при изменении сроков:

      • true - настройка включена;

      • false - настройка выключена;

    • actionWeightField - вес мероприятия (строка);

    • datesType - тип ввода сроков:

      • 0 - стандарнтый (дата начала и длительность)

      • 1 - абсолютный (дата начала и завершения);

    • progressType - тип прогресса:

      • 1 - фактический прогресс / прогресс по работе;

      • 2 - фактический прогресс / плановый прогресс;

  • id - идентификатор шаблона;

  • name - название шаблона;

  • code - код шаблона;

  • visible - признак видимости шаблона:

    • true - видимый;

    • false - скрыт;

  • risks - список рисков:

    • riskID - идентификатор риска;

    • riskName - название риска;

    • planID - идентификатор проекта;

    • enterDate - дата начала;

    • deleted - удален ли риск;

    • authorInfo:

      • userID - идентификатор владельца проекта;

      • userName - имя владельца проекта;

    • resUserInfo:

      • userID - идентификатор ответственного;

      • userName - имя ответственного;

    • probability - вероятность;

    • impact - воздействие;

    • description - описание риска (мероприятия);

    • statusID - идентификатор статуса;

    • status - название статуса;

    • typeID - идентификатор типа риска;

    • typeName - тип риска;

  • fields - список отображаемых полей:

    • length - длительность;

    • start_date - начало;

    • finish_date - завершение;

    • depends_on - зависит;

    • responsible - ответственный;

    • cost_planned - плановая стоимость;

    • cost_fact - фактическая стоимость;

    • percent - прогресс;

  • actions - список мероприятий:

    • id - идентификатор мероприятия;

    • structNumber - структурный номер мероприятия;

    • name - название мероприятия;

    • duration - длительность мероприятия (в днях);

    • links - зависимости мероприятия:

      • fromSN - структурный номер мероприятия, от которого зависит данное;

      • linkType - тип зависимости:

        • SS - зависимость типа Начало-Начало;

        • SF - зависимость типа Начало-Окончание;

        • FS - зависимость типа Окончание-Начало;

        • FF - зависимость типа Окончание-Окончание;

      • delay - задержка (в днях);

      • valid - признак валидности зависимости:

        • true - валидна;

        • false - невалидна;

    • parentId - идентификатор родительского мероприятия.

Метод, который возвращает список всех шаблонов, удовлетворяющих запросу

URL метода: rest/api/projects/templates/list.

Тип запроса: POST.

Метод принимает json со следующими параметрами:

  • ascending - направление сортировки (не обяз.):

    • true - по возрастанию (по умолчанию);

    • false - по убыванию;

  • countInPart - количество шаблонов на странице (не обяз., по умолчанию - 30);

  • pageNumber - номер страницы (не обяз., по умолчанию - 0);

  • search - поисковой запрос (не обяз.).

Пример отсылаемого json'а:

{
    "ascending": true,
    "search": "тест",
    "pageNumber": 0,
    "countInPart": 30
}

В случае успешного выполнения необходимо возвращать массив c заполненными ранее полями в виде, описанном в структуре "Шаблон проекта".

Примечание

  • если параметр search будет пустым, должен вернуться полный список шаблонов;

  • если ни одно значение не будет соответствовать запросу, должен вернуться пустой массив.

Метод, который возвращает шаблон проекта с заданным ID

URL метода: rest/api/projects/templates/{id}.

Тип запроса: GET.

Метод принимает следующий обязательный строковый параметр:

  • id - идентификатор шаблона.

В случае успешного выполнения необходимо возвращать json c полями, описанными в структуре "Шаблон проекта".

В случае неуспешного выполнения - см. альтернативные потоки событий 1, 2.

Метод, который сохраняет шаблон проекта

URL метода: rest/api/projects/templates/{id}.

Тип запроса: POST.

Метод принимает json со следующими параметрами:

  • settings:

    • calcType - тип расчета сроков (не обяз., по умолчанию 0);

    • progressCalcType - тип расчета прогресса (не обяз., по умолчанию 0);

    • progressRecalculation - перерасчет прогресса при изменении сроков (не обяз., по умолчанию false);

    • actionWeightField - вес мероприятия (обяз. только при progressCalcType=1);

    • datesType - тип ввода сроков (не обяз., по умолчанию 0);

    • progressType - тип прогресса (не обяз., по умолчанию 1);

  • name - название шаблона (обяз.);

  • code - код шаблона (обяз.);

  • visible - признак видимости шаблона (не обяз., по умолчанию true);

  • risks - список рисков (не обяз.);

  • fields - список отображаемых полей (не обяз.); по умолчанию:

    • length - длительность;

    • start_date - начало;

    • finish_date - завершение;

    • depends_on - зависит;

    • responsible - ответственный;

    • percent - прогресс;

  • actions - список мероприятий (не обяз.):

    • name - название мероприятия (обяз.);

    • duration - длительность мероприятия (в днях) (не обяз., по умолчанию 1);

    • links - зависимости мероприятия (не обяз.):

      • fromSN - структурный номер мероприятия, от которого зависит данное;

      • linkType - тип зависимости;

      • delay - задержка (в днях).

В случае успешного выполнения необходимо возвращать json c измененными полями, описанными в структуре "Шаблон проекта".

В случае неуспешного выполнения - см. альтернативные потоки событий 3-6.

Метод, который изменяет видимость шаблона проекта

URL метода: /rest/projects/templates/{id}/visible/{true|false}.

Тип запроса: POST.

Метод принимает следующие обязательные параметры:

  • id - идентификатор шаблона;

  • visible - видимость шаблона (true / false).

В случае успешного выполнения необходимо возвращать статус запроса.

В случае неуспешного выполнения - см. альтернативные потоки событий 1, 2.

Метод, который добавляет новый шаблон

URL метода: rest/api/projects/templates/newTemplate.

Тип запроса: POST.

Метод принимает json со параметрами, описанными в методе, который сохраняет шаблон проекта (но параметры id шаблона и planID должны быть null).

В случае успешного выполнения необходимо возвращать json c заполненными ранее полями в виде, описанном в структуре "Шаблон проекта".

В случае неуспешного выполнения - см. альтернативные потоки событий 3-6.

Метод, который возвращает количество страниц при заданных параметрах

URL метода: rest/api/projects/templates/pagesCount.

Тип запроса: GET.

Метод принимает следующие строковые параметры:

  • countInPart - количество элементов на странице (не обяз., по умолчанию - 35);

  • search - строка поиска.

Метод возвращает количество страниц, соответствующее указанному параметру.

Примечание

  • если параметр search будет пустым, должно вернуться общее количество страниц;

  • если ни одно значение не будет соответствовать запросу, должно вернуться значение 0.

Метод, который возвращает список мероприятий шаблона

URL метода: rest/api/projects/templates/actions/list.

Тип запроса: GET.

Метод принимает следующий обязательный строковый параметр:

  • templateId - идентификатор шаблона.

В случае успешного выполнения необходимо возвращать json c полями из объекта actions, описанными в структуре "Шаблон проекта".

В случае неуспешного выполнения - см. альтернативные потоки событий 7, 8.

Метод, который возвращает список названий шаблонов, их кодов и ID

URL метода: rest/api/projects/templates/names.

Тип запроса: GET.

Метод возвращает массив параметров:

  • name - название шаблона;

  • id - идентификатор шаблона;

  • code - код шаблона.

Альтернативные потоки событий
  • Альтернативный поток событий №1. Параметр id не передан, либо он пустой. Сервер возвращает ошибку:

    Не передан параметр id

    действие не осуществляется;

  • Альтернативный поток событий №2. Передан несуществующий параметр id. Сервер возвращает ошибку:

    Передан несуществующий параметр id

    действие не осуществляется.

  • Альтернативный поток событий №3. Параметр name не передан, либо он пустой. Сервер возвращает ошибку:

    Не передан параметр name шаблона проекта

    действие не осуществляется;

  • Альтернативный поток событий №4. Параметр code не передан, либо он пустой. Сервер возвращает ошибку:

    Не передан параметр code

    действие не осуществляется;

  • Альтернативный поток событий №5. Параметр name не передан, либо он пустой (при передаче иных параметров из массива actions). Сервер возвращает ошибку:

    Не передан параметр name мероприятия проекта

    действие не осуществляется;

  • Альтернативный поток событий №6. Параметр name не передан, либо он пустой (только при progressCalcType=1). Сервер возвращает ошибку:

    Не передан параметр actionWeightField

    действие не осуществляется;

  • Альтернативный поток событий №7. Параметр templateId не передан, либо он пустой. Сервер возвращает ошибку:

    Не передан параметр templateId

    действие не осуществляется;

  • Альтернативный поток событий №8. Передан несуществующий параметр templateId. Сервер возвращает ошибку:

    Передан несуществующий параметр templateId

    действие не осуществляется.

Примеры возвращаемых массивов
  • для методов rest/api/projects/templates/(list; {id}; newTemplate; pagesCount; actions/list):

{
    "errorCode": 0,
    "errorMessage": null,
    "object": {
        "settings": {
            "calcType": 0,
            "progressCalcType": 0,
            "progressRecalculation": false,
            "actionWeightField": null,
            "datesType": 0,
            "progressType": 1
        },
        "id": "74f874f4-d477-4c83-b4d3-7631b70b1f84",
        "name": "1",
        "code": "1",
        "visible": true,
        "risks": [
            {
                "riskID": null,
                "riskName": "example_risk",
                "planID": "dd081e05-7a2c-454b-9972-441fd465704a",
                "enterDate": null,
                "deleted": null,
                "authorInfo": {
                    "userID": "1",
                    "userName": null
                },
                "resUserInfo": {
                    "userID": null,
                    "userName": null
                },
                "probability": 13,
                "impact": 50,
                "description": "Мероприятия по риску",
                "statusID": 3,
                "status": "Проводятся мероприятия",
                "typeID": "inst",
                "typeName": "Институциональные риски"
            },
            {
                "riskID": "a2c32707-8a1b-4fba-8609-ca54adb554db",
                "riskName": "dsfdfsdf",
                "planID": "dd081e05-7a2c-454b-9972-441fd465704a",
                "enterDate": "2015-08-12T00:00:00.000+0600",
                "deleted": "2015-08-12T11:12:08.076+0600",
                "authorInfo": {
                    "userID": "0a9eb338-9176-4ae3-8f0f-c3800f5685d9",
                    "userName": "Иванов И."
                },
                "resUserInfo": {
                    "userID": null,
                    "userName": ""
                },
                "probability": 13,
                "impact": 50,
                "description": "Описание мероприятий по риску",
                "statusID": 2,
                "status": "Запланирован",
                "typeID": "inst",
                "typeName": "Институциональные риски"
            }
        ],
        "fields": [
            "length",
            "start_date",
            "finish_date",
            "depends_on",
            "responsible",
            "percent"
        ],
        "actions": [
            {
                "id": "283d0b59-c1f8-48f1-8b6b-2c05394d7473",
                "structNumber": {
                    "numbers": []
                },
                "name": "1",
                "duration": 1,
                "links": null,
                "parentId": null
            },
            {
                "id": "565f4b10-726f-403d-8dda-a7390679d41f",
                "structNumber": {
                    "numbers": [
                        1
                    ]
                },
                "name": "1.1",
                "duration": 1,
                "links": null,
                "parentId": "283d0b59-c1f8-48f1-8b6b-2c05394d7473"
            },
            {
                "id": "6c3c1e45-1c04-4e01-8bf1-ada01b19f804",
                "structNumber": {
                    "numbers": [
                        2
                    ]
                },
                "name": "1.2",
                "duration": 1,
                "links": [
                    {
                        "fromSN": {
                            "numbers": [
                                3
                            ]
                        },
                        "linkType": "SS",
                        "toSN": {
                            "numbers": [
                                2
                            ]
                        },
                        "delay": 1,
                        "link": null,
                        "error": "NO",
                        "valid": true
                    }
                ],
                "parentId": "283d0b59-c1f8-48f1-8b6b-2c05394d7473"
            },
            {
                "id": "900d7fab-986b-4faa-8551-c83c254aa581",
                "structNumber": {
                    "numbers": [
                        3
                    ]
                },
                "name": "1.3",
                "duration": 1,
                "links": null,
                "parentId": "283d0b59-c1f8-48f1-8b6b-2c05394d7473"
            },
            {
                "id": "e40985dc-c616-49db-b7c0-c5c7ae978045",
                "structNumber": {
                    "numbers": [
                        4
                    ]
                },
                "name": "1.4",
                "duration": 1,
                "links": null,
                "parentId": "283d0b59-c1f8-48f1-8b6b-2c05394d7473"
            }
        ]
    },
    "sessionState": 1,
    "comment": null,
    "messages": [],
    "valid": true,
    "messageToString": null
  • для метода rest/api/projects/templates/names:

[
    {
        "name": "1000",
        "id": "517acf86-1d9a-4f01-a478-dacd3242ccbb",
        "code": "1000"
    },
    {
        "name": "1000005",
        "id": "1a8ce533-57c9-47fb-b102-fc60d4ab5a32",
        "code": "hgsudshguopsdjg"
    },
    {
        "name": "1000005",
        "id": "ad20fc0c-0202-4e85-8d5c-ba5d67100d97",
        "code": "1000005"
    },
    {
        "name": "1000010",
        "id": "1bc126a4-b56d-4598-84f3-445da8fd3bdf",
        "code": "1000010"
    },
    {
        "name": "100006",
        "id": "0c151228-8e24-4eb9-bda5-773a054c4e5a",
        "code": "100006"
    },
    {
        "name": "100006",
        "id": "7804bd17-29ae-48b5-aded-14e058c13b01",
        "code": "100006"
    },
    {
        "name": "100007",
        "id": "4bc6801b-7b3a-4e2d-a323-c406cde79f70",
        "code": "100007"
    },
    {
        "name": "10001",
        "id": "d72d002e-ea0e-4b86-8e07-b0dbe9214e79",
        "code": "10001"
    }
]