Push - повторная явка

EXECUTE block
AS
/*
 * Скрипт рассылки пуш-уведомлений для повторного визита пациентов
 *
 * Автор: Коробка А.А.
 */
-- константы
DECLARE ttl INT;
DECLARE day_delay INT;
DECLARE datemsg DATE;
DECLARE cnt INT;
DECLARE uid TYPE OF COLUMN doctor.dcode;
-- данные протокола
DECLARE date_interv INT;
DECLARE p1 INT;
DECLARE txt TYPE OF COLUMN paramsinfo.valuetext;
DECLARE tmp TYPE OF COLUMN paramsinfo.valuetext;
DECLARE date_litera ttext16;
-- данные пациента
DECLARE pcode TYPE OF COLUMN clients.pcode;
DECLARE notify TYPE OF COLUMN clphones.notificationid;
-- данные приема
DECLARE treatcode TYPE OF COLUMN treat.treatcode;
DECLARE trdate TYPE OF COLUMN treat.treatdate;
DECLARE fjid TYPE OF COLUMN filials.jid;
DECLARE filial TYPE OF COLUMN filials.filid;
DECLARE fname TYPE OF COLUMN filials.shortname;
DECLARE depnum TYPE OF COLUMN departments.depnum;
DECLARE depname TYPE OF COLUMN departments.depname;
DECLARE dcode TYPE OF COLUMN doctor.dcode;
DECLARE dname TYPE OF COLUMN doctor.dname;
DECLARE dcode_send TYPE OF COLUMN doctor.dcode;
-- данные по услуге
DECLARE spec INT;
DECLARE schid TYPE OF COLUMN wschema.schid;
DECLARE worktime INT;
DECLARE structid TYPE OF COLUMN wschema.structid;
-- вставка сообщения
DECLARE logid TYPE OF COLUMN sms_log.logid;
DECLARE smsid TYPE OF COLUMN sms_logdet.smsid;
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 pushtext TYPE OF COLUMN sms_log.smstext;
DECLARE planbtime TYPE OF COLUMN sms_log.planbtime;
DECLARE planftime TYPE OF COLUMN sms_log.planftime;
BEGIN
  day_delay = 1; -- приглашать за 1 день минимум
  ttl = day_delay*24*60*60; -- напоминание держится (расчет на отправку сразу)
  uid = 0;
  -- филиал выполнения
  SELECT FIRST 1 f.filid, f.shortname, f.jid
    FROM repl$getgrpid g
    LEFT JOIN filials f ON f.grpid=g.repl$grpid
    INTO filial, fname, fjid;
  -- поиск структуры
  SELECT FIRST 1 structid FROM pricestructure
   WHERE bdate<= CURRENT_DATE+1+ :day_delay ORDER BY bdate DESC
    INTO structid;
  FOR SELECT p.pcode, p.treatdate, dcode, treatcode, LOWER(TRIM(valuetext)), cp.notificationid
        FROM paramsinfo p
        LEFT JOIN clphones cp ON cp.pcode=p.pcode
       WHERE p.codeparams IN (990001860/* повторная явка */,990002043/*гастро*/,
                              990001689/*аллерг-1*/,990001823/*аллерг-2*/,
                              990001748/*невро*/,640000067/*берем*/,
                              990002216/*офтальм*/)
         AND p.ver_no = 0
         AND p.treatdate BETWEEN current_date-370 AND CURRENT_DATE
         AND TRIM(valuetext)!=''
         AND valuetext NOT LIKE '%за результатами%'
         AND COALESCE(cp.isdeleted,0)=0
         AND cp.phonetype=21
         AND cp.notificationid>''
  INTO pcode, trdate, dcode, treatcode, txt, notify do
  BEGIN
    datemsg = NULL;
    date_interv = 0;
    --
    while (POSITION('  ', txt)>0) do
    BEGIN
      txt = REPLACE(txt, '  ', ' ');
    END
 
    -- первым указано `через N период`
    IF (POSITION('через ', txt)=1) THEN
    BEGIN
      -- отсекаем 1е слово
      tmp = TRIM(SUBSTRING(txt FROM 6));
      -- иищем начало 2го слова
      p1 = POSITION(' ', tmp);
      IF (p1>0) THEN
      BEGIN
        BEGIN
          date_interv = TRIM(SUBSTRING(tmp FROM 1 FOR p1));
          date_litera = TRIM(SUBSTRING(tmp FROM p1 FOR 6));
        END
        WHEN any do BEGIN END
      END
      --
      IF (date_interv>0) THEN
      BEGIN
        datemsg = CASE WHEN date_litera LIKE 'год%' THEN dateadd(date_interv YEAR  TO trdate)
                       WHEN date_litera LIKE 'мес%' THEN dateadd(date_interv MONTH TO trdate)
                       WHEN date_litera LIKE 'нед%' THEN dateadd(date_interv week  TO trdate)
                       WHEN date_litera LIKE 'дн%'  THEN dateadd(date_interv DAY   TO trdate)
                       WHEN date_litera LIKE 'ден%' THEN dateadd(date_interv DAY   TO trdate)
                       ELSE NULL END;
      END
    END
 
    -- первой указана дата
    ELSE
    BEGIN
      tmp = SUBSTRING(txt FROM 1 FOR 10);
      BEGIN
        BEGIN
          datemsg = CAST(tmp AS DATE);
        END
        WHEN any do BEGIN END
      END
 
      tmp = SUBSTRING(txt FROM 1 FOR 8);
      IF (datemsg IS NULL) THEN
      BEGIN
        BEGIN
          datemsg = CAST(tmp AS DATE);
        END
        WHEN any do BEGIN END
      END
    END
 
    IF ( datemsg BETWEEN CURRENT_DATE+ :day_delay AND CURRENT_DATE+1+ :day_delay ) THEN
    BEGIN
      -- беру специализацию
      SELECT FIRST 1 ws.speccode FROM treat t
        JOIN orderdet od ON od.orderno=t.orderno
        JOIN wschema ws ON ws.schid=od.schcode
       WHERE t.treatcode= :treatcode
         AND ws.consult=1
        INTO spec;
      -- смотрю наличие записей к доктору
      SELECT COUNT(*)
        FROM doctor d
        LEFT JOIN USER$WEB__DOCTOR_WSCHEMA(d.dcode, NULL, :spec) u ON 1=1
        LEFT JOIN schedule s ON s.workdate= :datemsg AND s.dcode=d.dcode
       WHERE d.filial= :filial
         AND COALESCE(d.locked,0)=0
         AND u.avalue=1
         AND s.pcode= :pcode
        INTO cnt;
      -- готовлю сообщение
      IF (cnt=0) THEN
      BEGIN
        pushtext = NULL;
        schid = NULL;
        dcode_send = NULL;
        SELECT FIRST  1 schid, dcode, worktime
          FROM (SELECT ws.schid, d.dcode, COALESCE(ws.worktime, dic.rekvint3) worktime,
                      (ds.endhour*60+ds.endmin) - (ds.beghour*60+ds.begmin) alltime,
                      (SELECT SUM(CASE WHEN pcode>0 OR nazndis=1 THEN (s.fhour*60+s.fmin)-(s.bhour*60+s.bmin) ELSE 0 END )
                         FROM schedule s LEFT JOIN shedmarks m ON m.mrkid=s.tmstatus WHERE s.schedident=ds.schedident) denytime
                  FROM wschema ws
                  LEFT JOIN get_pricebyid(:datemsg, 1, :filial, :fjid, 0, ws.schid) s ON 1=1
                  LEFT JOIN doctspec dsp ON dsp.speccode= ws.speccode
                  JOIN doctor d ON d.dcode=dsp.dcode AND d.filial= :filial
                  LEFT JOIN USER$WEB__DOCTOR_WSCHEMA(d.dcode, ws.schid) u ON 1=1
                  JOIN doctshedule ds ON ds.dcode=d.dcode AND ds.wdate= :datemsg
                  LEFT JOIN dicinfo dic ON dic.refid=-10010011 AND dic.dcode=d.dcode AND dic.rekvint1=ws.schid
                 WHERE ws.structid= :structid AND ws.speccode= :spec AND ws.consult=1
                   AND s.sprice>0
                   AND u.avalue=1
                 ORDER BY COALESCE(repconsult,0) DESC /* повторная выше */, CASE WHEN d.dcode= :dcode THEN 1 ELSE 0 END DESC /* тот же доктор выше */)
         WHERE alltime>denytime /* есть время для записи */
           AND alltime-denytime > worktime
          INTO schid, dcode_send, worktime;
        -- возможность формирования
        IF (schid IS NOT NULL AND dcode_send IS NOT NULL) THEN
        BEGIN
          -- данные
          SELECT d.dname, dep.depnum, dep.depname
            FROM doctor d
            LEFT JOIN departments dep ON dep.depnum=d.depnum
           WHERE  d.dcode= :dcode_send
            INTO dname, depnum, depname;
          -- формирование текста
          pushtext = '{"to":"'||notify||'","time_to_leave":'||ttl||',"notification":{';
          pushtext = pushtext||'"title":"Приглашение","body":"Приглашаем Вас на повторный прием на '||(SELECT datestr FROM formatdate(:datemsg))||' к доктору '||dname||'.",';
          pushtext = pushtext||'"sound":"true","tag":"record"},';
          pushtext = pushtext||'"data":{"action":"record",';
          pushtext = pushtext||'"DCode":'||dcode_send||',"DName":"'||dname||'",';
          pushtext = pushtext||'"DepNum":'||depnum||',"DepName":"'||depname||'",';
          pushtext = pushtext||'"filial":'||filial||',"FName":"'||fname||'",';
          pushtext = pushtext||'"WorkDate":"'||(SELECT datestr FROM formatdate(:datemsg))||'",';
          pushtext = pushtext||'"SchList":"'||schid||'","wtime":"'||worktime||'",';
          pushtext = pushtext||'}}';
          -- заполняем данные
          logid = gen_id(SMS_LOG_GEN, 1);
          smsid = gen_id(SMS_GEN, 1);
          smstypeid = 0;
          smsprofileid = 1;
          smsrefid = 70005;
          planbtime = dateadd(9 HOUR TO CAST(CURRENT_DATE AS TIMESTAMP));
          planftime = dateadd(18 HOUR TO CAST(datemsg AS TIMESTAMP));
          -- вставляем запись
          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, :treatcode, :planbtime, :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
END

администрирование/скрипты/фбд/push.-.повторная.явка.txt · Последние изменения: 2019/07/04 08:18 (внешнее изменение)