Как изменить состояние задачи при изменении других полей

Есть задача, с полями, состояние, согласован, описание и дата окончания. Мне нужно, чтобы при установки значения поля согласован в "Да", задача изменяла свое с "Согласование" на "In Progress". При работе процесса, выдается ошибка, что я не могу изменить значения поля с типом State. const entities = require('@jetbrains/youtrack-scripting-api/entities'); const workflow = require('@jetbrains/youtrack-scripting-api/workflow'); exports.rule = entities.Issue.onChange({ title: 'Установить статус экспертиза, если состояние "да"', guard: (ctx) => { var fs = ctx.issue.fields; return fs.becomes(ctx.Согласован, ctx.Согласован.BeOk);//, ctx.State, ctx.State.BeAgreement); }, action: (ctx) => { const issue = ctx.issue; issue.fields['Состояние']="In Progress"; } }, requirements: { State: { type: entities.State.fieldType, }, Согласован:{ type:entities.EnumField.fieldType, BeOk:{ name:"Да" } } } });
1
13 comments

Здравствуйте,

Спасибо за ваше обращение. 

Прежде всего, я рекомендую прописать в секции Requirements поля и их значения, которые вы используете в скрипте (например, поле Состояние и значение In Progress). Также, определите в секции Requirements полю "Состояние" и полю "Согласован" псевдоним на латинице, с помощью которого вы будете обращаться к этому полю в скрипте (так же, как вы это сделали для значения "Да"), например:

Status: {
      type: entities.State.fieldType,
      name: "Состояние"
      Done: {
        name: "Сделано"
      }

Верно ли, что в вашем проекте есть и поле Состояние, и поле State? Если нет, то убедитесь, пожалуйста, что в секции Requirements у вас определены только актуальные поля для этого проекта.

Второй момент - я рекомендую выставлять поле в значение, используя объекты, определенные в секции Requirements. Например, выставить поле Состояние в значение In Progress не через присвоение строки, а через присваивание объекта ctx.Status.InProgress. 

Если все это не поможет, приложите, пожалуйста, актуальный код (пожалуйста, отформатируйте его, как в редакторе, чтобы избежать опечаток и недопониманий) и скриншот ошибки, которую вы получаете при работе процесса. 

0

Не помогло.

В логе есть оба поля (state и состояние), но пользователь видит поле Состояние.
Сделал как написали, но не помогло.

Вот код:

const entities = require('@jetbrains/youtrack-scripting-api/entities');

const workflow = require('@jetbrains/youtrack-scripting-api/workflow');

 

exports.rule = entities.Issue.onChange({

  // TODO: give the rule a human-readable title

  title: 'Установить статус экспертиза, если состояние "да"',

  guard: (ctx) => {

    // TODO specify the conditions for executing the rule

    var fs = ctx.issue.fields;

    return fs.becomes(ctx.Согласован, ctx.Согласован.BeOk, ctx.State, ctx.State.BeAgreement);

//    return true;

  },

  action: (ctx) => {

    const issue = ctx.issue;

    // TODO: specify what to do when a change is applied to an issue

    workflow.message('переведите Состояние заявки в "Экспертиза"');

    //ctx.fields.State.BeAgreement="In Progress";

  },

  requirements: {

    // TODO: add requirements

                State: {

      type: entities.State.fieldType,

      //

      //"In Progress":{}

      BeAgreement: {

        name: "In Progress"

      }

      },   

    Согласован:{

      type:entities.EnumField.fieldType,

      BeOk:{

        name:"Да"

      }    

    }

  }

});

0

Alexzander Kashin

Вы забыли указать имя поля State в секции Requirements: сейчас воркфлоу пытается поменять именно поле "State", а не "Состояние". Попробуйте использовать этот код, он переводит значение поля "Состояние" в In Progress, когда значение поля "Согласован" становится "Да":

const entities = require('@jetbrains/youtrack-scripting-api/entities');
const workflow = require('@jetbrains/youtrack-scripting-api/workflow');

exports.rule = entities.Issue.onChange({

  title: 'Установить статус экспертиза, если состояние "да"',
  guard: (ctx) => {

    var fs = ctx.issue.fields;
    return fs.becomes(ctx.Согласован, ctx.Согласован.BeOk, ctx.Status, ctx.Status.BeAgreement);

  },

  action: (ctx) => {
    
    const issue = ctx.issue;
    ctx.issue.fields.Status=ctx.Status.BeAgreement.name;

  },

  requirements: {

    Status: {
    type: entities.State.fieldType,
      name: "Состояние",
      BeAgreement: {
        name: "In Progress"
      }
      },   

    Согласован:{
      type:entities.EnumField.fieldType,
      BeOk:{
        name:"Да"

      }    
    }
  }
});
0

Теперь вот такая ошибка:
"Поле "Согласован" не поддерживается для задач с State:Экспертиза "

0

Alexzander Kashin

Скорее всего, у вас поле "Согласован" - conditional. То есть оно отображается в зависимости от значений другого поля. В этом случае воркфлоу не может поменять значение этого поля, потому что оно скрыто. Уберите, пожалуйста, в настройках поля зависимость от другого поля.

0

Спасибо. Помогло, но не полностью.
Покончил к этому рабочему процессу аналогичный проект и там эта функция не работает.
Наименование полей и состояний у проектов одинаково

0

Alexzander Kashin

Показывает ли рабочий процесс ошибку? Есть ли ошибки в консоли редактора? Покажите, пожалуйста, списки полей для обоих проектов.

0

Это проект где все работает. 

 

Вот проект, в котором не работает:

Вот сам код:

const entities = require('@jetbrains/youtrack-scripting-api/entities');
const workflow = require('@jetbrains/youtrack-scripting-api/workflow');
exports.rule = entities.Issue.onChange({
  // TODO: give the rule a human-readable title
 title: 'Установить статус экспертиза, если состояние "да"',
 guard: (ctx) => {
 // TODO specify the conditions for executing the rule
var fs = ctx.issue.fields;
 return fs.becomes(ctx.Согласован, ctx.Согласован.BeOk, ctx.Status, ctx.Status.BeAgreement);
//    return true;

  },
action: (ctx) => {
   const issue = ctx.issue;
   // TODO: specify what to do when a change is applied to an issue
  Object.keys(issue.fields).forEach(key => console.log(key+'\n'+issue.fields[key]));
   workflow.message('переведите Состояние заявки в "Экспертиза"');
  //ctx.fields.State.BeAgreement="In Progress";

   //if (issue.fields.Status.name=="Согласование"){  ctx.issue.fields.Status=ctx.Status.BeAgreement.name;
  //}
 },
requirements: {
// TODO: add requirements
  //State: {
   Status:{
      type: entities.State.fieldType,
     name:"Состояние",
     BeAgreement: {
       name: "In Progress"
      }
     },    
   Согласован:{
     type:entities.EnumField.fieldType,
     BeOk:{
       name:"Да"
  }    
    }
  }
});

 

0

Спасибо за скриншоты!

У вас путаница с названиями полей. Смотрите, в первом проекте у вас у "Состояния" псевдоним State. Во втором у "Согласован" - Status. В requirements у вас Status используется для поля "Состояние", поэтому код может некорректно работать во втором проекте.

Попробуйте поменять имена полей в воркфлоу. Укажите вместо "Status", например, "Sostoyanie" (коряво, конечно, но зато точно не запутаетесь), чтобы получилось что-то подобное:

 Sostoyanie:{
      type: entities.State.fieldType,
     name:"Состояние",
     BeAgreement: {
       name: "In Progress"
      }
     },    
   Soglasovan:{
     type:entities.EnumField.fieldType,
     name: "Согласован",
     BeOk:{
       name:"Да"
  }    

И в самом коде тоже поменяйте все обращения на "Soglasovan" и "Sostoyanie".

0

Не сработало.  Теперь при попытке сменить состояние или согласован выдаёт ошибку:

set-boss2executer/set-status-n rule threw an exception when processing the following issue: Projects-13

 

0

А вы в коде поменяли обращения? В `guard` должно быть

return fs.becomes(ctx.Soglasovan, ctx.Soglasovan.BeOk, ctx.Sostoyanie, ctx.Sostoyanie.BeAgreement);
0

Да, но опечатался. Заработала. Спасибо

0

Отлично! Рада была помочь :)

0

Please sign in to leave a comment.