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

Имеется задача: Показать диалоговое окно подтверждения с кнопками OK и KO для подтверждения отмены Обращения (Case), если пользователь нажал на статус Cancel в DCM.
Если была нажата кнопка OK, то Case отменяется.
Если была нажата кнопка KO, то Case вернется к предыдущему статусу.

Я попытался отобразить диалоговое окно по событию OnSaving объекта Case.
Вот моя функция:

public override void OnSaving(object sender, EntityBeforeEventArgs e) {  
string status = UpdateData(sender);
if(status!="Canceled") {
base.OnSaving(sender, e);
  	} else {
    		//Todo: Show dialog with question
  		//Todo: Get response OK or KO
                /*if(response ="OK"){
                        base.OnSaving(sender, e);
                 }else{
                        e.IsCanceled = true;
        }*/
}
}

К сожалению, я не нашла никакой информации о том, как отобразить диалоговое окно на стороне сервера.
Я знаю способ отправки сообщений с клиентской стороны (this.showConfirmationDialog(message, function(returnCode)), но не знаю, как вернуть результат нажатия кнопки на сервер для завершения метода OnSaving.

private void SendMessage(object sender) {
       var entity = (Entity)sender; 
       var userConnection = entity.UserConnection;
      string senderName = "MySenderNameCase";  
      string message = JsonConvert.SerializeObject(new {test = "status"});
      MsgChannelUtilities.PostMessage(userConnection, senderName, message);
  }             

Пожалуйста, подскажите, как правильно выполнить эту задачу.
Спасибо.
С наилучшими пожеланиями,
Мария

Нравится

4 комментария
Лучший ответ

Мы делали подтверждение перехода Case на финальный статус на странице, выдавая showConfirmationDialog в функции Save.

 

this.showConfirmationDialog(confirmationMessage.message, function(result) {
    if (result === Terrasoft.MessageBoxButtons.YES.returnCode) {
        this.save(scopeArguments);
     } else {
        this.onDiscardChangesClick();
    }
}, ["Yes", "No"]);

 

Мы делали подтверждение перехода Case на финальный статус на странице, выдавая showConfirmationDialog в функции Save.

 

this.showConfirmationDialog(confirmationMessage.message, function(result) {
    if (result === Terrasoft.MessageBoxButtons.YES.returnCode) {
        this.save(scopeArguments);
     } else {
        this.onDiscardChangesClick();
    }
}, ["Yes", "No"]);

 

Здравствуйте, Владимир.

Спасибо за ваш ответ.

 

Это помогло решить задачу!

 

Mariia Prostiak,

 как все же у Вас получилось положить всплывающий вопрос в Save?

this.save(scopeArguments); - и что ложили в "scopeArguments". Если не сложно, можете написать код функции, есть такая же задача на решении?

Владимир Соколов,

 или подскажите Вы, как в Save реализовали данное всплавающее соощение не получив рекурсии

Показать все комментарии

Коллеги всем доброго времени суток. Подскажите, кто нибудь работал с событийным слоем Entity.
Написал класс обработчик в качестве примера для обучения скомпилировал приложение упал сайт.
Вот пример класса обработчика:
 

using System;
using System.Web;
using Terrasoft.Core;
using Terrasoft.Core.Entities;
using Terrasoft.Core.Entities.Events;


namespace Terrasoft.Configuration
{
    [EntityEventListener(SchemaName = "Order")]
    public class OrderEntityEventListener : BaseEntityEventListener
    {

        private UserConnection _userConnection;

        private LogService _logService;
        public UserConnection UserConnection
        {
            get
            {
                if (_userConnection != null)
                {
                    return _userConnection;
                }
                _userConnection = HttpContext.Current.Session["UserConnection"] as UserConnection;
                if (_userConnection != null)
                {
                    return _userConnection;
                }
                return _userConnection;
            }

            set { _userConnection = value; }
        }        

        public LogService LogService { get => _logService; set => _logService = value; }

        public OrderEntityEventListener()
        {
            LogService = new LogService(UserConnection);
        }

        public override void OnInserting(object sender, EntityBeforeEventArgs e)
        {
            try
            {
                base.OnInserting(sender, e);
                
                var systemUserName = UserConnection.CurrentUser.ContactName;
                var systemUserId = UserConnection.CurrentUser.ContactId;
                LogService.RecInfo($"LOG:[OnInserting]:systemUserId: {systemUserId}; systemUserName:{systemUserName}");
            }
            catch (Exception exception)
            {
                LogService.RecInfo($"LOG:[OnInserting]:Exception: {exception.Message}; {exception.InnerException}");
            }

        }
    }
}

Подскажите, что тут не так? Если кто работал, скинте пожалуйста примеры.
Заранее благодарен

Нравится

1 комментарий
Лучший ответ

Добрый день, Алексей!

UserConnection необходимо получать из sender

Пример:

public override void OnSaved(object sender, EntityAfterEventArgs e) {
            base.OnSaved(sender, e);
            var entity = (Entity) sender;
            var userConnection = entity.UserConnection;
        }

Ошибка заключается в том, что слушатели изменений сущностей, работают не только при изменении значений через карточку (в данном случае есть HttpContext) но и в фоновом режиме (процессы, планировщик - без HttpContext).

Добрый день, Алексей!

UserConnection необходимо получать из sender

Пример:

public override void OnSaved(object sender, EntityAfterEventArgs e) {
            base.OnSaved(sender, e);
            var entity = (Entity) sender;
            var userConnection = entity.UserConnection;
        }

Ошибка заключается в том, что слушатели изменений сущностей, работают не только при изменении значений через карточку (в данном случае есть HttpContext) но и в фоновом режиме (процессы, планировщик - без HttpContext).

Показать все комментарии