Различия
Здесь показаны различия между двумя версиями данной страницы.
Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
расширенная.настройка:рассылка.уведомлений:push [2018/08/17 12:32] a.korobka |
расширенная.настройка:рассылка.уведомлений:push [2019/07/04 08:22] (текущий) |
||
---|---|---|---|
Строка 16: | Строка 16: | ||
Также, для работы с данными событиями дополняется справочник типов смс сообщений (SMS_REF) с настройками рассылки | Также, для работы с данными событиями дополняется справочник типов смс сообщений (SMS_REF) с настройками рассылки | ||
- | ^ Идентификатор\\ рассылки ^ Назначение ^ Объект формирования уведомления | | + | ^ Идентификатор\\ рассылки ^ Назначение ^ Объект формирования уведомления ^ Действие при получении\\ в мобильном приложении | |
- | | 70001 |Новое назначение к доктору|Триггер на таблице SCHEDULE, с отправкой на события наступаемые более чем через 10 минут от текущего времени| | + | | 70001 |Новое назначение к доктору|Триггер на таблице SCHEDULE, с отправкой на события наступаемые более чем через 10 минут от текущего времени|Откроется страница «Мои записи», вкладка «Текущие»| |
- | | 70002 |Перенос назначения|:::| | + | | 70002 |Перенос назначения|:::|:::| |
- | | 70003 |Отмена назначения|:::| | + | | 70003 |Отмена назначения|:::|:::| |
- | | 70005 |Повторная явка|Скрипт в репликаторе, выполняемый по филиальным БД, раз в сутки| | + | | 70005 |Повторная явка|Скрипт в репликаторе, выполняемый по филиальным БД, раз в сутки|Открывается расписание доктора, с пропуском всех промежуточных экранов (выбор отделения, филиала, доктора)| |
- | | 70006 |Результат исследования|Триггер на таблице TREATSCH, с проверкой всех услуг наряда на готовность| | + | | 70006 |Результат исследования|Триггер на таблице TREATSCH, с проверкой всех услуг наряда на готовность|Открывается страница «Медицинские данные»| |
- | | 70008 |Оценка приема|Триггер на таблице ORDERS, с проверкой наличия записи в расписании, и наличия суммы за прием, с задержкой 2 часа на отправку| | + | | 70008 |Оценка приема|Триггер на таблице ORDERS, с проверкой наличия записи в расписании, и наличия суммы за прием, с задержкой 2 часа на отправку|Открывается форма оценки приема| |
+ | | |Акции|PHP-скрипт при добавлении акции|Открывается страница акций, с полным текстом соответствующей акции| | ||
Тип рассылки: Только Push.\\ | Тип рассылки: Только Push.\\ | ||
Строка 28: | Строка 29: | ||
==== Запись ==== | ==== Запись ==== | ||
- | === Push объект == | + | <spoiler|Push объект> |
<code javascript> | <code javascript> | ||
{ | { | ||
Строка 62: | Строка 63: | ||
</code> | </code> | ||
В поле ''action'' передается производимое действие (''new'' - новое назначение; ''move'' - перенесено назначение; ''delete'' - удалено назначение) | В поле ''action'' передается производимое действие (''new'' - новое назначение; ''move'' - перенесено назначение; ''delete'' - удалено назначение) | ||
+ | </spoiler> | ||
- | === Триггер == | + | <spoiler|Триггер> |
<code sql> | <code sql> | ||
create or alter trigger USER$SCHEDULE_PUSH for SCHEDULE | create or alter trigger USER$SCHEDULE_PUSH for SCHEDULE | ||
Строка 191: | Строка 193: | ||
smstypeid = 0; | smstypeid = 0; | ||
smsprofileid = 1; | smsprofileid = 1; | ||
- | --in autonomous transaction do | + | -- |
- | begin | + | insert into SMS_LOG(LOGID,SMSTYPEID,SMSREFID,SMSPROFILEID,FILIAL, |
- | insert into SMS_LOG(LOGID,SMSTYPEID,SMSREFID,SMSPROFILEID,FILIAL, | + | CREATEDATE,SMSTEXT,PCODE,UID,INTERNALID,PLANBTIME,PLANFTIME,STATE) |
- | CREATEDATE,SMSTEXT,PCODE,UID,INTERNALID,PLANBTIME,PLANFTIME,STATE) | + | values(:logid, :smstypeid, :smsrefid, :smsprofileid, :filial, |
- | values(:logid, :smstypeid, :smsrefid, :smsprofileid, :filial, | + | current_timestamp, :pushtext, :pcode, :uid, :internalid, current_timestamp, :planftime, 0); |
- | current_timestamp, :pushtext, :pcode, :uid, :internalid, current_timestamp, :planftime, 0); | + | insert into SMS_LOGDET(SMSID,LOGID,PHONETYPE,EXTSMSID,PHPREFIX,PHONE,STATE,NOTIFICATIONID) |
- | insert into SMS_LOGDET(SMSID,LOGID,PHONETYPE,EXTSMSID,PHPREFIX,PHONE,STATE,NOTIFICATIONID) | + | values(:smsid, :logid, 21, null, null, null, 0, :notify); |
- | values(:smsid, :logid, 21, null, null, null, 0, :notify); | + | |
- | end | + | |
end | end | ||
end | end | ||
Строка 206: | Строка 205: | ||
end | end | ||
</code> | </code> | ||
+ | </spoiler> | ||
+ | |||
+ | === Нюансы === | ||
+ | Рассылка будет формироваться, в случае если назначение позже 10 минут от текущего времени | ||
+ | |||
==== Повторная явка ==== | ==== Повторная явка ==== | ||
- | === Push объект == | + | <spoiler|Push объект> |
<code javascript> | <code javascript> | ||
{ | { | ||
Строка 232: | Строка 236: | ||
} | } | ||
</code> | </code> | ||
+ | </spoiler> | ||
- | === Триггер == | + | Скрипт выполняется раз в день и указан на [[:администрирование:скрипты:фбд:Push - повторная явка|отдельной странице]] |
- | <code sql> | + | |
- | execute block | + | |
- | as | + | |
- | -- константы | + | |
- | declare ttl int; | + | |
- | declare day_delay int; | + | |
- | declare cnt int; | + | |
- | declare uid type of column doctor.dcode; | + | |
- | -- данные пациента | + | |
- | declare notify type of column clphones.notificationid; | + | |
- | declare pcode type of column clients.pcode; | + | |
- | -- данные приема | + | |
- | declare treatcode type of column treat.treatcode; | + | |
- | declare return_date date; | + | |
- | 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; | + | |
- | -- процедура поиска | + | |
- | declare procedure prc_datelist | + | |
- | returns ( | + | |
- | treatdate type of column paramsinfo.treatdate, | + | |
- | treatcode type of column paramsinfo.treatcode, | + | |
- | pcode type of column clients.pcode, | + | |
- | dcode type of column doctor.dcode, | + | |
- | return_date date | + | |
- | ) | + | |
- | as | + | |
- | declare txt type of column paramsinfo.valuetext; | + | |
- | declare p1 int; | + | |
- | declare tmp type of column paramsinfo.valuetext; | + | |
- | -- | + | |
- | declare date_litera ttext16; | + | |
- | declare date_interv int; | + | |
- | -- | + | |
- | begin | + | |
- | for select lower(trim(valuetext)), treatdate, treatcode, pcode, dcode from paramsinfo p | + | |
- | 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 '%за результатами анализ%' | + | |
- | into txt, treatdate, treatcode, pcode, dcode do | + | |
- | begin | + | |
- | return_date = 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 | ||
- | return_date = case when date_litera like 'год%' then dateadd(date_interv year to treatdate) | ||
- | when date_litera like 'мес%' then dateadd(date_interv month to treatdate) | ||
- | when date_litera like 'нед%' then dateadd(date_interv week to treatdate) | ||
- | when date_litera like 'дн%' then dateadd(date_interv day to treatdate) | ||
- | when date_litera like 'ден%' then dateadd(date_interv day to treatdate) | ||
- | else null end; | ||
- | end | ||
- | end | ||
- | |||
- | -- первой указана дата | ||
- | else | ||
- | begin | ||
- | --ret_date= current_date; | ||
- | tmp = substring(txt from 1 for 10); | ||
- | begin | ||
- | begin | ||
- | return_date = cast(tmp as date); | ||
- | end | ||
- | when any do begin end | ||
- | end | ||
- | |||
- | tmp = substring(txt from 1 for 8); | ||
- | if (return_date is null) then | ||
- | begin | ||
- | begin | ||
- | return_date = cast(tmp as date); | ||
- | end | ||
- | when any do begin end | ||
- | end | ||
- | |||
- | end | ||
- | -- | ||
- | if (return_date is not null) then | ||
- | suspend; | ||
- | -- | ||
- | end | ||
- | end | ||
- | -- end prc_datelist | ||
- | -- | ||
- | begin | ||
- | day_delay = 1; -- приглашать за 1 день минимум | ||
- | ttl = day_delay*24*60*60; -- напоминание держится (расчет на отправку сразу) | ||
- | uid = null; | ||
- | -- филиал выполнения | ||
- | 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<= :return_date order by bdate desc | ||
- | into structid; | ||
- | -- | ||
- | for select tx.pcode, tx.dcode, tx.return_date, tx.treatcode, cp.notificationid | ||
- | from prc_datelist tx | ||
- | left join clphones cp on cp.pcode=tx.pcode | ||
- | where tx.return_date between current_date+ :day_delay and current_date+1+ :day_delay | ||
- | and coalesce(cp.isdeleted,0)=0 and cp.phonetype=21 | ||
- | into pcode, dcode, return_date, treatcode, notify do | ||
- | begin | ||
- | pushtext = null; | ||
- | schid = null; | ||
- | dcode_send = null; | ||
- | -- беру специализацию | ||
- | 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= :return_date 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 | ||
- | -- поиск услуги (повторной) | ||
- | select first 1 ws.schid | ||
- | from wschema ws | ||
- | left join get_pricebyid(:return_date, 1, :filial, :fjid, 0, ws.schid) s on 1=1 | ||
- | where ws.structid= :structid and ws.speccode= :spec and ws.repconsult=1 /* повторная */ | ||
- | and s.sprice>0 | ||
- | order by rand() | ||
- | into schid; | ||
- | if (schid is null) then | ||
- | select first 1 ws.schid | ||
- | from wschema ws | ||
- | left join get_pricebyid(:return_date, 1, :filial, :fjid, 0, ws.schid) s on 1=1 | ||
- | where ws.structid= :structid and ws.speccode= :spec and ws.consult=1 /* первичная - повторной нет */ | ||
- | and s.sprice>0 | ||
- | order by rand() | ||
- | into schid; | ||
- | -- поиск доктора, с учетом услуги | ||
- | select first 1 dcode, worktime from ( | ||
- | select 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 doctor d | ||
- | join doctshedule ds on ds.dcode=d.dcode and ds.wdate= :return_date | ||
- | join wschema ws on ws.schid= :schid | ||
- | left join USER$WEB__DOCTOR_WSCHEMA(d.dcode, ws.schid) u on 1=1 | ||
- | left join dicinfo dic on dic.refid=-10010011 and dic.dcode=d.dcode and dic.rekvint1=ws.schid | ||
- | where d.filial= :filial and coalesce(d.locked,0)=0 and u.avalue=1) | ||
- | where alltime>denytime /* есть время для записи */ | ||
- | and alltime-denytime > worktime | ||
- | order by case when :dcode = dcode then 0 else 1 end, alltime-denytime desc, rand() | ||
- | into 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":"Приглашаем Вас на повторный прием к доктору.",'; | ||
- | 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(:return_date))||'",'; | ||
- | 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(return_date 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 | ||
- | -- | ||
- | suspend; | ||
- | end | ||
- | end | ||
- | </code> | ||
==== Результат исследования ==== | ==== Результат исследования ==== | ||
- | === Push объект == | + | <spoiler|Push объект> |
<code javascript> | <code javascript> | ||
{ | { | ||
Строка 505: | Строка 262: | ||
} | } | ||
</code> | </code> | ||
+ | </spoiler> | ||
==== Оценка приема ==== | ==== Оценка приема ==== | ||
- | === Push объект == | + | <spoiler|Push объект> |
<code javascript> | <code javascript> | ||
{ | { | ||
Строка 528: | Строка 286: | ||
} | } | ||
</code> | </code> | ||
+ | </spoiler> | ||
- | === Триггер == | + | <spoiler|Триггер> |
<code sql> | <code sql> | ||
create or alter trigger USER$ORDERS_PUSH for ORDERS | create or alter trigger USER$ORDERS_PUSH for ORDERS | ||
Строка 657: | Строка 416: | ||
end | end | ||
</code> | </code> | ||
+ | </spoiler> | ||
==== Акции ==== | ==== Акции ==== | ||
- | == Push объект == | + | <spoiler|Push объект> |
(при передаче объекта используется картинка с самым маленьким размером - 2) | (при передаче объекта используется картинка с самым маленьким размером - 2) | ||
<code javascript> | <code javascript> | ||
Строка 684: | Строка 444: | ||
} | } | ||
</code> | </code> | ||
+ | </spoiler> | ||