KIS Z. Руководство разработчика — различия между версиями
Admin (обсуждение | вклад) |
Admin (обсуждение | вклад) |
||
| Строка 1: | Строка 1: | ||
| + | Внимание, это экспорт из файла markodwn "kis-z\client\doc\MarkDown\KIS_Z Руководство разработчика\KIS_Z Руководство разработчика.md" | ||
| + | |||
| + | Картинки смотреть там | ||
| + | |||
__TOC__ | __TOC__ | ||
| + | |||
= Разработка БД = | = Разработка БД = | ||
Версия 10:26, 22 мая 2019
Внимание, это экспорт из файла markodwn "kis-z\client\doc\MarkDown\KIS_Z Руководство разработчика\KIS_Z Руководство разработчика.md"
Картинки смотреть там
Содержание
- 1 Разработка БД
- 2 Инструменты разработчика
- 3 Параметры командной строки
- 4 Устройство платформы
- 5 Структура исходных кодов
- 6 Разработка
- 6.1 Разработка пользовательских форм на основе шаблонов
- 6.2 Продвинутый функционал в формах редактороах (Entity)
- 6.3 Разработка форм-списков
- 6.4 Разработка форм-выбора сущностей
- 6.5 Хелперы для создания элементов интерфеса
- 6.6 Подключение печатных форм и отчетов
- 6.7 Работа с правами
- 6.8 Модальные формы
- 7 Конфигурирование АРМ (начального меню)
- 8 Разработка отчетов
- 9 Аудит данных (история изменения)
- 10 Обновление системы
- 11 Настройщик соответствий справочников с внешними системами
- 12 Рекомендации по пользовательскому интерфейсу
- 13 Языковая локализация
- 14 Сборник рецептов
- 15 Настройка среды Delphi
- 16 Компоненты и документация
Разработка БД
Описание будет в отдельном документе. Разделы:
- Соглашение об именовании
- Функция dev.do_all_ok
Инструменты разработчика
- Devar dbMonitor - мониторинг SQL, Также можно отправить любое свое сообщение (см справку по TuniMonitor)
- Во время работы приложения можно получить вызвать окно системной информации нажав комбинацию клавишу ThinkEHR. Из этого окна можно вызвать инспектор объектов формы, нажав комбинацию клавиш Ctrl+Shift+I. Здесь можно увидеть все датасеты, и статус, и данных в них
- окно информации о непредвиденной ошибке. Если ошибка не обработана, то появиться окно в котором можно увидеть полный CallStack программы, загруженные модули и т.п.
- секция DEBUG
- логирование CodeSITE. См https://www.webdelphi.ru/2011/11/obzor-instrumenta-codesite/ и сецию debug файла kis.ini
- свое логирование в папку LOG (см модуль KIS.FileUtils и константу cnlogdir)
- выгрузка сущностей в SQL
- редактор АРМ
- редактор системных запросов
- список системных форм
- выполнение SQL скриптов
Параметры командной строки
Все параметры регистронезависимы
- /USER=<имя пользователя> - пользователь (чтобы не набирать каждый раз)
- /PASSWORD=<пароль> - пароль
- /NOEHR - запуск без подключения к Think!EHR
- /NOUPDATE - запуск без процедуры обновления локальных файлов
- /NOMQTT -- без подключения к брокеру MQTT
- /NAVBARHIDE - скрывает панель навигации
- /AWP=<AWP_ID> - запускает нужный АРМ (если есть права). GUID без кавычек в фигурных скобках
- /FORM=<имя класса формы> - сразу открывает нужную форму -список (специально для разработчика).
- /SKIN=<имя скина> - имя скина по умолчанию
- /WinEntityClass=<EntityID> - запуск формы редактора сущности
- /NAVBARHIDE -- запуск со скрытой панелью навигации
- /RIBBON_HIDETABGroup -- скрыть закладки ленты
- /WIDTH=<xxx> ширина главного окна
- /HEIGHT=<xxx> высота главного окна
Устройство платформы
Архитектура
Подсистема безопасности
Настройки системы
Основные принципы
- настройка подключения к БД храниться в файле kis.ini
- все остальные настройки, необходимые для работы системы хранятся в разделах mm.adj
- для особенной конфигурации клиента (как правило сетевой) существует файл kis.local.ini, в котором существуют разделы перекрывающие соответствующие параметры mm.adj
Файл подключения kis.ini
[Postgresql] server=192.168.1.16 port=7432 database=emiac1 sslmode
[Debug] MEMORYLEAK=TRUE Выводить сообщения об утечки памяти EXCEPTIONSHOW=TRUE Показывать исключения CodeSite = True - включает посылку сообщений CodeSite CodeSiteLogFile = True - сообщения CodeSite Будут записаны в файл (имя будет совпадать с именем exe)
Глобальные настройки системы mm.adj
Глобальные настройки системы определяют поведение системы в целом и одинаковые для всех пользователей системы
Редактировать можно через АРМ Администратор -> глобальные настройки. По каждой настройке можно сразу посмотреть журнал изменения.
Прочитанные настройки системы можно увидеть через: Параметры- Параметры КИС
Клиент (kis_z) когда нужно считывает настройку и помещает ее в кэш. Настройка будет сохранена в локальном кэше до конца сеанса (пока kis_z не закроют)
// группа функций: работа с таблицей настроек mm.adj
function GetAdj(ASection: String; AParam: string): String;
function GetAdjCashed(ASection: String; AParam: string): String;
function GetAdjCashedDef(ASection: String; AParam: String; ADef: String = '0'): String;
procedure SetAdjCashed(ASection: String; AParam: string; AValue: String);
procedure SetAdjCashedNoDB(ASection: String; AParam: string; AValue: String);
function DelAdjCashed(ASection: String; AParam: string): String;Сетевые настройки в kis.local.ini
Иногда, некоторые глобальные настройки необходимо переопределить для определенных пользователей. Например, адреса подключения к сторонним сервисам. Такие настройки можно определить в файле kis.local.ini
// Читает из файла локальных настроек
function GetAdjFromLocalIni(ASection: String; AParam: string;ADef: String = '0') : String;Локальные предпочтения пользователя
Сохраняются в реестре (HKEYCURRENTUSER\Software\OT\KIS\kis_z) через модуль dmConf.
Рекомендуется сохраняться настройки с учетом текущего применённого профиля пользователя:
procedure TfmAuditTablesList.SaveLastPostion;
begin
if uq1.RecordCount > 0 then
dmConf.AppStorage.WriteString(RegProfilePreferences + Self.Classname,
uq1.FieldByName('id').AsString);
end;procedure TfmAuditTablesList.LoadLastPostion;
var
S : String;
begin
S := dmConf.AppStorage.ReadString(RegProfilePreferences + Self.Classname);
uq1.Locate('id', S, []);
end;Обратите внимание на фунцию RegProfilePreferences, объявленную в модуле dConf
Структура исходных кодов
Правила именования файлов
Префиксы
| префикс | описание | Пример |
|---|---|---|
| f | Модуль содержит TForm | fEmpList |
| d | Модуль содержит TDatamodul | dMain, dDept |
| u | unit |
Суффиксы файлов
Модули редакторы сущности должны заканчиваться на Entity, например fEmpEntity
Модули списки должны заканчиваться на List, например fEmpList
Модули выбора сущности должны заканчиваться на Get, например fEmpGet
Модули с модальными формами должны заканчиваться на Modal, например fAWPChangeModal
Расположение файлов
Соглашение об именовании компонентов
Формат комментариев
Системные датамодули
dmMain
В модуле собраны следующие категории процедур
аутентификация,
авторизация (проверка прав, профили)
аудит входа-выхода
соединение с postgresql , обработка ошибок, мониторинг SQL
системный каталог postgresql
Внимание, модуль не должен содержать бизнес-логику приложения. Предполагается что он может быть легко адаптирован под другие проекты
dmImages
Модуль для работы с изображениями (иконки на кнопках и пр.), скинами и стилями
dmConfig
процедуры, константы для работы с локальными настройками (в реестер или еще где)
Модуль не должен содержать бизнесс логику приложения и по возможность может быть быстро адаптирован для работы в другом приложении
dmRepControl
Репозиторих общих контролов, таких как:
- пол
- разрешено/запрещено
- системный атрибут
Не следует здесь размешать контролы для своих модулей. Делайте свой пользовательский датамодуль. Например, контролы с операциями собраны в dmOper, контролы с отделениями в dDept и т.п.
dmMQTT
Получение оповещений MQTT
Функциональные датамодули
dmDept
Невизуальный модуль, который содержит:
- справочные датасеты, связанные с отделениями (отделения, сотрудники, специализации, кабинеты)
- репозиторий контролов:
- комбобокс выбор отделения,
- комбокс выбор подразделения,
- комбобокс выбор профиля
- и т.п.
Singleton используйте dmDept_init
dmMdoc
Невизуальный датамодуль, которые содержить справочные Dataset, и репозитарий контролов для медицинских документов (пока в основном для статкарты). Например справочние датасеты для статкарты: место жительства, результат госпитализации, гражданство, и т.п.
Singleton используйте dmMdoc_init
dmNaz
Невизуальный датамодуль, которые содержить справочные Dataset, и репозитарий контролов связанные с типами назначений
Singleton используйте dmNaz_init
dmDiag
Невизуальный датамодуль, которые содержить справочные Dataset, и репозитарий контролов связанные с типами диагнозов
Singleton используйте dmDiag_init
dmOper
Невизуальный датамодуль, которые содержить справочные Dataset, и репозитарий контролов связанные с Операциями
Singleton используйте dmOper_init
dmSickleave
Невизуальный датамодуль, которые содержить справочные Dataset, и репозитарий контролов связанные с Листками нетрудспособности
Singleton используйте dmSickleave_init
dmAmbticket
Рарзработка своих функциональных датамодулей
Экземпляры датамодулей должны создаваться только когда потребуется
Базовый класс TKISWin и единообразные иконки и горячие клавиши
Этот класс ответственен за одинаковость иконок в dxBarManager и горячих клавиш. Основные формы наследуются от этого класса.
Типы форм
Для пользователя можно выделить следующие типы визуальных форм:
- Список (наследник от класса TKISWinEntity из модуля KISWIN.Entity.)
- Редактор сущности (наследник от класса TKISWinList из модуля KISWin.List)
- Выбор сущности (наследник от класса TKISWinGet из модуля KISWin.Get)
- Модальная форма (общего предка нет, нужно делать нужно из шаблона)
- Главная форма (она одна единственная)
- Вспомогательные формы (например: формы закладки для мед документов, формы простых фильтров для списков)
Форма список
Класс TKISWinList реализовывает след функционал
- Лента риббон дочится на главную ленту риббон
- При активации деактивации формы, главная форма отображает риббон соответствующей формы
- Вешаеются обработчики на стандартные кнопки "Редактировать", "Панель поиска".
- Вешается даблклик на grid / treelist
Форма редактор сущности
Класс реализовывает следующий функционал
- определятся список модифицируемых датасетов ModifiedDataSet (через переопределение процедуры DefineDataSet)
- Связывает состояние кнопки "Сохранить" с состоянием датасеотов из ModifiedDataSet. Если хоть в одном датасет есть что сохранять, то Enabled=True
- Вешает стандартные обработчики на кнопки "Сохранить" (сохраняются все датасеты из ModifiedDataSet), "Удалить", "Закрыть", "И выбрать"
- Формирует Caption формы - в зависимости от идентификатора сушности
- При сохранении данных посылает сообщение FNotifyMessage
- Показывет системные формы по горячим клавишам Ctrl+Shift + L
Обмен сообщениями между формами
Формы посылают глобально всем другим формам уведомления через Postmessage. Список всех констант- сообщений для посылки между формами определен в файле uOTMessages. Сообщения можно посылать через
Разработка
Разработка пользовательских форм на основе шаблонов
В папке SRCTemplate\Script расположены скрипты для создания следующих типов форм:
- Форма список
- Форма - редактор сущности
- Модальная форма
- Форма выбор
Для создания формы, необходимо в файле "1.bat" раскомментировать нужные строки и задать название новым модулям системы.
Форму список и форму редактор сущности лучше создавать одновременно (тогда сразу же заработают перекрестные ссылки).
Продвинутый функционал в формах редактороах (Entity)
Сохранение данных в редакторах (Entity)
Если стандартная процедура с последовательными сохранением всех датасетов добавленных в ModifyDataset не подходит, то необходимо переопределить процедуру
procedure SaveData; reintroduce;override;...procedure TfmPeopleEntity.SaveData;begininherited;
dmMain.con.ExecProc('mm.people_set_fio_equally', [EntityID]);
end;
Дополнительные проверки при сохранении
procedure CheckData; overload; Virtual;
Создание подчиненной сущности
Рекомендации по открытию подчиненных датасетов
Выгрузка в SQL
По умолчанию TKISWinEntity выгружает в SQL результат работы функции dev.dml_json по главному dataset. Если нужно написать что-то сложнее, то необходимо переопределить функцию GetSQL. См например TfmFileEntity.GetSQL
Разделы в ИБ, ТЛ ИБ, статкарте, амблуаторном талоне
Разработка форм-списков
Разработка форм-выбора сущностей
Хелперы для создания элементов интерфеса
Хелепер для пенели поиска
Сейчас это делает KISWINList. Достаточно положить кнопку и назвать ее "Панель поиска". Но например в модальных формах можно добавить такой функционал самому:
TOTcxTableViewFindPanelButton.Create(bbFindPanel, tv1);
Хелпер для серверного фильтра
Связывает кнопку вызова фильтра,панель фильтра, сплиттер
- В диазайнер необходимо
- созадать кнопку вызова фильтра (TcxBarButton)
- положить панель фильтра
- положить сплитер (TcxSplitter), связав его с панелью
На onCreate создать хелпер
uOTFilter.TOTFilter.Create(bbFilter, spFilter, bbFilterClose);
Хелпер для выбора (добавления) полей в списки
- Объявить переменную:
private FFieldChoiceForGridButtonHelper : fFieldChoiceForGridByUQModal.TFieldChoiceForGridButtonHelper;
- Дописать создание на FormCreate
FFieldChoiceForGridButtonHelper := fFieldChoiceForGridByUQModal.TFieldChoiceForGridButtonHelper.create(bbField, tv1,4, bbRefreshClick );
- В процедуре формирования запроса RefreshData
// Добавим дополнительные поля FFieldChoiceForGridButtonHelper.SQL_Append_additional_Fields(sSelect, sFrom, sWhere );Создание ButtonEdit связанного с формой выбора или редактора сущности
Убедиться в том что классы выбора/реактора созданы (или создать их с помощь шаблона).
В Дизайнере
- В датасете выбрать поле
- Связать tcxButtonEdit c этим полем
- на FormCreate:
SetaAsIBISRightEdit(bbRght, 'rght_id', nil);
Хелпер выбора периода (дата с, дата по)
Связывает контролы TcxDateEdit с выпадающим меню
На FormCreate:
bbOutDT.DropDownMenu :=uPeriodPopup.GetPopupForPeriod(Self,dtFrom, dtTo );
Хелпер выбора периода рождения (дети, взрослые)
Связывает контролы TcxDateEdit с выпадающим меню
На FormCreate: bbBirthDropDown.DropDownMenu :=uPeriodPopup.GetPopupForRojd(Self,dtBirthBeg, dtBirthEnd );
Подключение печатных форм и отчетов
Работа с правами
Модальные формы
интерфейс, принципы применения
Конфигурирование АРМ (начального меню)
В АРМ разработчика можно настроить начальное меню панели навигации, которое будет доступно пользователю. Для этого заходим в АРМ разработчика (закладка КИС в ленте) и выбираем в панели навигации пункт АРМ:
Разработка отчетов
Печатные формы Fastreport
ReportWorkShop
Аудит данных (история изменения)
На каждую таблицу триггерами может поддреживаться своя таблица истории изменения данных в схеме audit.
Включение / выключение
select audit.enablelog('mm', 'emp') select audit.disablelog('mm', 'emp')
Настройка журнала аудита и архивные журналы
Для больших журналов есть возможность разбить на оперативный и архивный журнал. Архивный журнал будет располагаться в схеме audit2.
Просмотр изменений по основной таблице конкретной сущности
За отображение журнала изменений отвечает модуль fChangeHistoryLIST. Для вызова журнал изменений по конкретной сущности используйте следующий код:
fChangeHistoryLIST.ShowChangeHistoryByTable('mm','emp',EntityID,'id');Просмотр изменений по сводному журналу.
- Сначала нужно скофигурировать сводный журнал через интерфейс
fAuditUnionHistoryLIST.ShowUnionChangeHistoryByEntity(1, GUIDNoBrace(Self.EntityID));где 1- это константа, определяющая сводный журнал
Обновление системы
Формат обновления
Порядок применения обновления
Создание обновлений БД
Создание обновлений метаданных ThinkEHR
Настройщик соответствий справочников с внешними системами
Рекомендации по пользовательскому интерфейсу
Подписи к кнопка должны быть глаголами в повелительном наклонении совершенного вида:
- Выполнить
- Сохранить
- Редактировать
- Октрыть
Или Существительными ед числа
- Статкарта
- ИБ
Языковая локализация
Используется компонент Devexpress TcxLocalizer (лежит в модуе dConf). Файл с языковым ресурсам называется Localization.lng и должен лежать рядом с exe. Это обычный текстовый файл, но его можно править с помощью утилиты Localizer Editor ("C:\Lib\DevExpress 18.1.9\ExpressLibrary\cxLocalizerEditor.exe" )
Пример как правильно получить значение локализованной строки: cxGetResourceString(@cxSFilterOperatorNotBetween); Более подробно описана в справке "C:\Lib\DevExpress 18.1.9\ExpressLibrary\Help\ExpressCrossPlatformLibrary.chm"
Сборник рецептов
Настройка среды Delphi
Компоненты и документация
Embarcadero Delphi 10.3
Devexpress VCL 18.1
UniDac VCL 7.4
FastReprot 6.3
JEDI
Postgresql
Начинать с документации https://postgrespro.ru/docs/postgresql/10/index, все что ниже, это дополнительное чтение
Книги
Работа с PostgreSQL настройка и масштабирование http://postgresql.leopard.in.ua/
Что нового
- PostgreSQL 9.3 Что нового http://habrahabr.ru/post/195898/
- PostgreSQL 9.4 Что нового? http://habrahabr.ru/post/234909/
- PostgreSQL 9.5: что нового? Часть 1. INSERT… ON CONFLICT DO NOTHING/UPDATE и ROW LEVEL SECURITY https://habr.com/post/264281/
- PostgreSQL 9.5: что нового? Часть 2. TABLESAMPLE https://habr.com/post/266759/
- PostgreSQL 9.5: что нового? Часть 3. GROUPING SETS, CUBE, ROLLUP https://habr.com/post/269849/
- Секционирование в PostgreSQL 10 и не только https://habr.com/company/postgrespro/blog/353472/
- Как ускорили PostgreSQL 10 https://habr.com/company/postgrespro/blog/352144/
- Что нового в PostgreSQL 11: JSONB-трансформы https://habr.com/company/postgrespro/blog/354264/
- Что нового в PostgreSQL 11: INCLUDE-индексы https://habr.com/company/postgrespro/blog/353126/
Оптимизация запросов
- Оптимизация запросов. Основы EXPLAIN в PostgreSQL https://habr.com/post/203320/
- Оптимизация запросов. Основы EXPLAIN в PostgreSQL (часть 2) http://habrahabr.ru/post/203386/
- Оптимизация запросов. Основы EXPLAIN в PostgreSQL (часть 3) https://habr.com/post/203484/
Цикл статей Индексы в postgersql:
- Индексы в postgresql -1 (механизм индексирования) https://habrahabr.ru/company/postgrespro/blog/326096/
- Индексы в postgresql - 2 https://habr.com/company/postgrespro/blog/326106/
- Индексы в postgresql - 3 https://habr.com/company/postgrespro/blog/328280/
- Индексы в postgresql - 4 (Btree) https://habr.com/company/postgrespro/blog/330544/
- Индексы в postgresql - 5 (Gist) https://habr.com/company/postgrespro/blog/333878/
- Индексы в postgresql - 6 (SP-GIST) https://habr.com/company/postgrespro/blog/337502/
- Индексы в postgresql - 7 (GIN) https://habr.com/company/postgrespro/blog/340978/
- Индексы в postgresql - 8 (джин в ром) https://habr.com/company/postgrespro/blog/343488/
- Индексы в postgresql - 9 (BRIN-индексы) https://habr.com/company/postgrespro/blog/346460/
- Индексы в postgresql - 10 (bloom) https://habr.com/company/postgrespro/blog/349224/
- Производительность запросов в PostgreSQL – шаг за шагом Илья Космодемьянский http://highload.guide/blog/queryperformancepostgreSQL.html
- Understanding EXPLAIN (pdf на 42 страницы) https://www.dalibo.org/media/understandingexplain.pdf SQL запросы
- Как посчитать всё на свете одним SQL-запросом (Очень рекомендую). Оконные функции PostgreSQL https://habr.com/post/268983/
- И снова о рекурсивных запросах https://habr.com/company/postgrespro/blog/318398/
Администрирование
- Илья Космодемьянский — Внутреннее устройство PostgreSQL для практикующих инженеров https://youtu.be/jGOkSerUPw4
- PostgreSQL: архитектура, настройка и оптимизация https://www.youtube.com/watch?v=oSlS54Ou7Ms
- Как PostgreSQL работает с диском, Илья Космодемьянский PostgreSQL Consulting https://www.youtube.com/watch?v=NY-9HUnmR6c
- Администрирование PostgreSQL 9.4 (базовый курс). Postgres professional | Тверь 16-18 декабря 2015 https://www.youtube.com/playlist?list=PLaFqU3KCWw6KzGwUubZm-9-vKsi6vh5qC
- DBA 2. «Администрирование PostgreSQL 9.5. Расширенный курс» Postgres professional https://www.youtube.com/watch?v=iODeKnTD1kA&list=PLaFqU3KCWw6JgufXBiW4dEB2-tDpmOXPH
- Как не потерять данные в PostgreSQL https://habr.com/post/197742/
Разное
Презентация сравнение с другими SQL http://www.slideshare.net/MarkusWinand/modern-sql (Презентация недоступна) и в целом сайт https://modern-sql.com/
- трех минутный тест как хорошо вы знаете индексы в postgresql (а-а ссылка потерялась!!)
- Блог на сайте https://postgrespro.ru/blog/pgsql. Большинство из перечисленных здесь ссылок есть