Это старая версия документа.


Push уведомления

Технология push используется для рассылки персонализированных сообщений на мобильные телефоны. Для рассылки сообщений используется сервер FCM1)

Подписка на функции осуществляется через функцию API2) Личного кабинета пациента.
Непосредственная рассылка объектов осуществляется сервисом смс-рассылки

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

Также, для работы с данными событиями дополняется справочник типов смс сообщений (SMS_REF) с настройками рассылки

Идентификатор
рассылки
Назначение Объект формирования
70001 Новое назначение к докторуТриггер на таблице SCHEDULE, с отправкой на события наступаемые более чем через 10 минут от текущего времени
70002 Перенос назначения
70003 Отмена назначения
70005 Повторная явкаСкрипт в репликаторе, выполняемый по филиальным БД, раз в сутки
70006 Результат исследованияТриггер на таблице TREATSCH, с проверкой всех услуг наряда на готовность
70008 Оценка приемаТриггер на таблице ORDERS, с проверкой наличия записи в расписании, и наличия суммы за прием, с задержкой 2 часа на отправку

Тип рассылки: Только Push.
Время рассылки: с 0ч до 23ч.

Запись

Push объект
{
    "to":"<to>",
    "time_to_leave":2119200,
    "notification":{
        "title":"Назначение перенесено",
        "body":"Назначение к доктору перенесено с 07.11.2017 на 08.11.2017.",
        "sound":"true",
        "tag":"schedule"
    },
    "data":{
        "datatype":"schedule",
        "action":"[new|move|delete]",
        "old":{
            "SchedId":641286841,
            "DCode":50000040,
            "DName":"Рябинина С.Н.",
            "WorkDate":"07.11.2017",
            "BHour":9,
            "BMin":30
        },
        "new":{
            "SchedId":641286841,
            "DCode":50000040,
            "DName":"Рябинина С.Н.",
            "WorkDate":"08.11.2017",
            "BHour":8,
            "BMin":30
        },
    }
}

В поле action передается производимое действие (new - новое назначение; move - перенесено назначение; delete - удалено назначение)

Триггер
CREATE OR ALTER TRIGGER USER$SCHEDULE_PUSH FOR SCHEDULE
active after INSERT OR UPDATE OR DELETE POSITION 99
AS
DECLARE action VARCHAR(6);
DECLARE send INT;
DECLARE ttl INT;
DECLARE time_delay INT; -- время, после которого рассылка не формируется;
DECLARE notify TYPE OF COLUMN clphones.NOTIFICATIONID;
--
DECLARE logid TYPE OF COLUMN sms_log.logid;
DECLARE smsid TYPE OF COLUMN sms_logdet.smsid;
 
DECLARE uid TYPE OF COLUMN doctor.dcode;
DECLARE filial TYPE OF COLUMN filials.filid;
 
DECLARE smstypeid TYPE OF COLUMN sms_log.smstypeid;
DECLARE smsrefid TYPE OF COLUMN sms_log.smsrefid;
DECLARE smsprofileid TYPE OF COLUMN sms_log.smsprofileid;
DECLARE internalid TYPE OF COLUMN sms_log.internalid;
DECLARE pcode TYPE OF COLUMN sms_log.pcode;
DECLARE planftime TYPE OF COLUMN sms_log.planftime;
DECLARE pushtext TYPE OF COLUMN sms_log.smstext;
BEGIN
  time_delay = 600;
 
  IF (EXISTS(SELECT * FROM repl$getaccess WHERE repl$access = 'USER')) THEN
  BEGIN
    IF (EXISTS(SELECT * FROM repl$getgrpid g JOIN filials f ON f.grpid=g.repl$grpid WHERE f.ismain=1)) THEN
      exit;
 
    -- формируем переменные
    send = 0;
    ttl = 0;
    IF (updating)THEN
    BEGIN
      IF (NEW.workdate!=OLD.workdate) THEN
      BEGIN
        send = 1;
      END
      ELSE IF (NEW.bhour*60+NEW.bmin != OLD.bhour*60+OLD.bmin) THEN
      BEGIN
        send = 1;
      END
      ttl = datediff(SECOND FROM CURRENT_TIMESTAMP TO dateadd(NEW.bmin MINUTE TO dateadd(NEW.bhour HOUR TO NEW.workdate)) );
      smsrefid = 70002;
      pcode = NEW.pcode;
      action = 'move';
    END
    ELSE IF (inserting) THEN
    BEGIN
      send = 1;
      ttl = datediff(SECOND FROM CURRENT_TIMESTAMP TO dateadd(NEW.bmin MINUTE TO dateadd(NEW.bhour HOUR TO NEW.workdate)) );
      smsrefid = 70001;
      pcode = NEW.pcode;
      action = 'new';
    END
    ELSE IF (deleting) THEN
    BEGIN
      send = 1;
      ttl = datediff(SECOND FROM CURRENT_TIMESTAMP TO dateadd(OLD.bmin MINUTE TO dateadd(OLD.bhour HOUR TO OLD.workdate)) );
      smsrefid = 70003;
      pcode = OLD.pcode;
      action = 'delete';
    END
 
    IF (ttl>2419200) THEN
      ttl = 2419200;
 
    -- смотрим наличие пациента
    IF (COALESCE(pcode,0)=0) THEN
      exit;
 
    -- смотрим наличие идентификатора
    notify = NULL;
    SELECT NOTIFICATIONID FROM clphones cp WHERE cp.pcode= :pcode AND COALESCE(cp.isdeleted,0)=0 AND cp.phonetype=21
      INTO notify;
    notify = COALESCE(notify,'-');
 
    SELECT current_uid FROM s_session_info INTO uid;
    -- формируем данные
    -- если есть идентификатор, можно рассылать, событие будет не ранее чем через time_delay сек
    IF (notify != '-' AND send=1 AND ttl>time_delay)THEN
    BEGIN
      pushtext = '{"to":"'||notify||'","time_to_leave":'||ttl||',"notification":{';
 
      IF (inserting) THEN
      BEGIN
        pushtext = pushtext||'"title":"Новое назначение","body":"У Вас новое назначение к доктору на '||(SELECT datestr FROM formatdate(NEW.workdate))||'."';
      END
      ELSE IF (updating) THEN
      BEGIN
        pushtext = pushtext||'"title":"Назначение перенесено","body":"Назначение к доктору перенесено';
        IF (OLD.workdate != NEW.workdate) THEN
          pushtext = pushtext||' с '||(SELECT datestr FROM formatdate(OLD.workdate));
        pushtext = pushtext||' на '||(SELECT datestr FROM formatdate(NEW.workdate))||'."';
      END
      ELSE
      BEGIN
        pushtext = pushtext||'"title":"Назначение отменено","body":"Назначение к доктору на '||(SELECT datestr FROM formatdate(OLD.workdate))||' отменено."';
      END
      pushtext = pushtext||',"sound":"true","tag":"schedule"},';
      pushtext = pushtext||'"data":{"action":"'||action||'",';
 
      -- формируем старый объект
      IF (updating OR deleting) THEN
      BEGIN
        pushtext = pushtext||'"old":{"SchedId":"'||OLD.schedid||'","DCode":"'||OLD.dcode||'","DName":"'||(SELECT dname FROM doctor WHERE dcode= OLD.dcode)||'","WorkDate":"'||(SELECT datestr FROM formatdate(OLD.workdate))||'","BHour":"'||OLD.bhour||'","BMin":"'||OLD.bmin||'"},';
        filial = OLD.filial;
        internalid = OLD.schedid;
      END
 
      -- формируем новый объект
      IF (inserting OR updating) THEN
      BEGIN
        pushtext = pushtext||'"new":{"SchedId":'||NEW.schedid||',"DCode":"'||NEW.dcode||'","DName":"'||(SELECT dname FROM doctor WHERE dcode= NEW.dcode)||'","WorkDate":"'||(SELECT datestr FROM formatdate(NEW.workdate))||'","BHour":"'||NEW.bhour||'","BMin":"'||NEW.bmin||'"},';
        filial = NEW.filial;
        internalid = NEW.schedid;
      END
      planftime = dateadd(ttl SECOND TO CURRENT_TIMESTAMP);
 
      pushtext = pushtext||'}}';
 
      logid = gen_id(SMS_LOG_GEN, 1);
      smsid = gen_id(SMS_GEN, 1);
      smstypeid = 0;
      smsprofileid = 1;
      --in autonomous transaction do
      BEGIN
        INSERT INTO SMS_LOG(LOGID,SMSTYPEID,SMSREFID,SMSPROFILEID,FILIAL,
                   CREATEDATE,SMSTEXT,PCODE,UID,INTERNALID,PLANBTIME,PLANFTIME,STATE)
            VALUES(:logid, :smstypeid, :smsrefid, :smsprofileid, :filial,
                   CURRENT_TIMESTAMP, :pushtext, :pcode, :uid, :internalid, CURRENT_TIMESTAMP, :planftime, 0);
        INSERT INTO SMS_LOGDET(SMSID,LOGID,PHONETYPE,EXTSMSID,PHPREFIX,PHONE,STATE,NOTIFICATIONID)
            VALUES(:smsid, :logid, 21, NULL, NULL, NULL, 0, :notify);
      END
 
    END
  END
  --
END

Повторная явка

Push объект
{
    "to":"<to>",
    "time_to_leave":2119200,
    "notification":{
        "title":"Приглашение",
        "body":"Приглашаем Вас на повторный прием к доктору",
        "sound":"true",
        "tag":"record"
    },
    "data":{
        "action":"record",
        "DCode":10101010,
        "DName":"Фартух Д.А.",
        "DepNum":120,
        "DepName":"Дерматолог",
        "filial":1,
        "FName":"Коломенский",
        "WorkDate":"21.11.2017",
        "SchList":"0,990099,990088",
        "wtime":45
    }
}

Результат исследования

Push объект
{
    "to":"<to>",
    "time_to_leave":"2119200",
    "notification":{
        "title":"Новое заключение",
        "body":"У Вас новое заключение доктора (результат исследования)",
        "sound":"true",
        "tag":"protocol"
    },
    "data":{
        "action":"protocol",
        "ProtocolID":99009900,
        "TreatCode":99009911,
        "DCode":99009922,
        "DName":"Фартух Д.А.",
        "ProtName":"Биохимия крови",
    }
}

Оценка приема

Push объект
{
    "to":"<to>",
    "time_to_leave":"2119200",
    "notification":{
        "title":"Оценка посещения",
        "body":"Пожалуйста, оцените прием доктора",
        "sound":"true",
        "tag":"mark"
    },
    "data":{
        "action":"mark",
        "SchedId":99009900,
        "DCode":99009922,
        "DName":"Фартух Д.А.",
        "filial":1,
        "FName":"Коломенский",
    }
}

Акции

Push объект

(при передаче объекта используется картинка с самым маленьким размером - 2)

{
    "to":"/topic/shares",
    "time_to_leave":"2119200",
    "notification":{
        "title":"Оценка посещения",
        "body":"Пожалуйста, оцените прием доктора",
        "sound":"true",
        "tag":"shares"
    },
    "data":{
        "action":"shares",
        "info":<InfoRecord>,
    }
}
1)
Firebase Cloud Message server
2)
запрос /client/modify/push

расширенная.настройка/рассылка.уведомлений/push.1534314629.txt.gz · Последние изменения: 2018/08/15 09:30 (внешнее изменение)