Skip to content

Commit

Permalink
Merge pull request #3073 from moodpulse/tubeNumber_13symbols
Browse files Browse the repository at this point in the history
Tube number 11symbols
  • Loading branch information
mikhailprivalov authored Sep 15, 2023
2 parents ce02e84 + e28672d commit 234a6b2
Show file tree
Hide file tree
Showing 16 changed files with 219 additions and 12 deletions.
1 change: 1 addition & 0 deletions api/directions/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -63,4 +63,5 @@
path('directions-by-hospital-sent', views.get_directions_by_hospital_sent),
path('meta-info', views.meta_info),
path('resend-results', views.resend_results),
path('need-order-redirection', views.need_order_redirection),
]
11 changes: 11 additions & 0 deletions api/directions/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -276,6 +276,17 @@ def resend_results(request):
return status_response(True)


@login_required()
def need_order_redirection(request):
request_data = json.loads(request.body)
ids = request_data['ids']
for pk in ids:
direction = Napravleniya.objects.get(pk=pk)
direction.need_order_redirection = True
direction.save()
return status_response(True)


@login_required
def directions_history(request):
# SQL-query
Expand Down
6 changes: 5 additions & 1 deletion api/laboratory/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -194,7 +194,11 @@ def search(request):
except Napravleniya.DoesNotExist:
direction = None
iss = None
if direction and direction.hospital and direction.hospital != doc.hospital:
user_groups = [str(x) for x in request.user.groups.all()]
contol_hosp = False
if "Направления-все МО" not in user_groups:
contol_hosp = True
if direction and direction.hospital and direction.hospital != doc.hospital and contol_hosp:
direction = None
iss = None
mnext = False
Expand Down
2 changes: 1 addition & 1 deletion api/patients/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -185,7 +185,7 @@ def patients_search_card(request):
| Q(card__phone__in=normalized_phones)
| Q(card__doctorcall__phone__in=normalized_phones)
)
if is_ecp_search or ":" in query:
if is_ecp_search or ":" in query[0]:
ecp_id = query.split(':')[1]
patient_data = search_patient_ecp_by_person_id(ecp_id)
if patient_data and (patient_data.get('PersonSnils_Snils') or patient_data.get('enp')):
Expand Down
4 changes: 4 additions & 0 deletions api/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -2137,6 +2137,7 @@ def organization_data(request):
org['strictExternalNumbers'] = hospital.strict_external_numbers
org['hl7SenderApplication'] = hospital.hl7_sender_application
org['hl7ReceiverAapplication'] = hospital.hl7_receiver_appplication
org['isAutotransfer'] = hospital.is_auto_transfer_hl7_file

return JsonResponse({"org": org})

Expand Down Expand Up @@ -2165,6 +2166,7 @@ def organization_data_update(request):
'resultPullFtpServerUrl': str,
'hl7SenderApplication': str,
'hl7ReceiverAapplication': str,
'isAutotransfer': bool,
}

data = data_parse(
Expand Down Expand Up @@ -2206,6 +2208,7 @@ def organization_data_update(request):
result_pull_by_numbers: Optional[str] = data[17] or None
hl7_sender_application: Optional[str] = data[18] or None
hl7_receiver_appplication: Optional[str] = data[19] or None
is_auto_transfer = data[20]

if not title:
return status_response(False, 'Название не может быть пустым')
Expand Down Expand Up @@ -2284,6 +2287,7 @@ def organization_data_update(request):
hospital.okpo = okpo
hospital.hl7_receiver_appplication = hl7_receiver_appplication
hospital.hl7_sender_application = hl7_sender_application
hospital.is_auto_transfer_hl7_file = is_auto_transfer

if has_full_ftp_access:
hospital.orders_pull_by_numbers = orders_pull_by_numbers
Expand Down
1 change: 1 addition & 0 deletions appconf/manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,7 @@ def l2_modules() -> dict:
"send_orgs_email_results",
"send_patients_email_results",
"docx_aggregate_laboratory_results",
"need_order_redirection",
"chats",
"csv_load_file",
"transfer_card",
Expand Down
2 changes: 1 addition & 1 deletion dashboards/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ def exec_query(dashboard_pk, dates_param):
metadata_charts = get_charts_dataset(dashboard_pk)
# обход по графикам датасетов
for md in metadata_charts:
if not check_server_port(md.ip_address, md.port):
if not check_server_port(md.ip_address, int(md.port)):
continue
if not data_chart.get(md.chart_id):
data_chart[md.chart_id] = [
Expand Down
9 changes: 5 additions & 4 deletions directions/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -1599,6 +1599,7 @@ def gen_napravleniya_by_issledovaniya(
ext_additional_num = ExternalAdditionalOrder.objects.filter(external_add_order=external_additional_order_number).first()
if not ext_additional_num:
ext_additional_num = ExternalAdditionalOrder.objects.create(external_add_order=external_additional_order_number)
ext_additional_num.save()

issledovaniye = Issledovaniya(
napravleniye=directions_for_researches[dir_group],
Expand Down Expand Up @@ -3324,10 +3325,10 @@ class NumberGenerator(models.Model):
key = models.CharField(choices=KEYS, max_length=128, db_index=True, verbose_name='Тип диапазона')
year = models.IntegerField(verbose_name='Год', db_index=True)
is_active = models.BooleanField(verbose_name='Активность диапазона', db_index=True)
start = models.PositiveIntegerField(verbose_name='Начало диапазона')
end = models.PositiveIntegerField(verbose_name='Конец диапазона', null=True, blank=True, default=None)
last = models.PositiveIntegerField(verbose_name='Последнее значение диапазона', null=True, blank=True)
free_numbers = ArrayField(models.PositiveIntegerField(verbose_name='Свободные номера'), default=list, blank=True)
start = models.PositiveBigIntegerField(verbose_name='Начало диапазона')
end = models.PositiveBigIntegerField(verbose_name='Конец диапазона', null=True, blank=True, default=None)
last = models.PositiveBigIntegerField(verbose_name='Последнее значение диапазона', null=True, blank=True)
free_numbers = ArrayField(models.PositiveBigIntegerField(verbose_name='Свободные номера'), default=list, blank=True)
prepend_length = models.PositiveSmallIntegerField(verbose_name='Длина номера', help_text='Если номер короче, впереди будет добавлено недостающее кол-во "0"')

def __str__(self):
Expand Down
92 changes: 88 additions & 4 deletions ftp_orders/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,10 @@

from clients.models import Individual, CardBase
from contracts.models import PriceName
from directions.models import Napravleniya, RegisteredOrders, NumberGenerator, TubesRegistration, IstochnikiFinansirovaniya, NapravleniyaHL7LinkFiles
from directions.models import Napravleniya, RegisteredOrders, NumberGenerator, TubesRegistration, IstochnikiFinansirovaniya, NapravleniyaHL7LinkFiles, Issledovaniya, Result
from ftp_orders.sql_func import get_tubesregistration_id_by_iss
from hospitals.models import Hospitals
from directory.models import Researches
from directory.models import Researches, Fractions
from laboratory.settings import BASE_DIR
from laboratory.utils import current_time
from slog.models import Log
Expand Down Expand Up @@ -221,7 +221,6 @@ def pull_order(self, file: str):
obr = order.children[0]
orders_by_numbers[obr.OBR_3.value].append(obr.OBR_4.OBR_4_4.value)
additional_order_number_by_service[obr.OBR_4.OBR_4_4.value] = obr.OBR_2.OBR_2_1.value

orders_by_numbers = dict(orders_by_numbers)

self.log(family, name, patronymic, birthday, sex)
Expand Down Expand Up @@ -350,6 +349,81 @@ def pull_result(self, file: str):
return

self.log("HL7 parsed")
obr = hl7_result.ORU_R01_RESPONSE.ORU_R01_ORDER_OBSERVATION.OBR
external_add_order, iss_id = None, None
is_confirm = False
if "L2" not in obr.OBR_2.OBR_2_1.value:
external_add_order = obr.OBR_2.OBR_2_1.value
else:
iss_id = (obr.OBR_2.OBR_2_1.value).split("_")[1]
doctor_family_confirm = obr.OBR_32.OBR_32_2.value
doctor_name_confirm = obr.OBR_32.OBR_32_3.value
doctor_patronymic_confirm = obr.OBR_32.OBR_32_4.value
doctor_fio = f"{doctor_family_confirm} {doctor_name_confirm} {doctor_patronymic_confirm}"
date_time_confirm = obr.OBR_8.value
if obr.OBR_25.value == "F":
is_confirm = True
elif obr.OBR_25.value == "D":
is_confirm = False

obxes = hl7_result.ORU_R01_RESPONSE.ORU_R01_ORDER_OBSERVATION.ORU_R01_OBSERVATION
fractions = {"fsli": "", "title_fraction": "", "value": "", "refs": "", "units": "", "jpeg": "", "html": "", "doc_confirm": "", "date_confirm": "", "note_data": ""}
result = []
for obx in obxes:
tmp_fractions = fractions.copy()
if (obx.OBX.obx_3.obx_3_1.value).lower == "pdf":
continue
elif (obx.OBX.obx_3.obx_3_1.value).lower() == "jpg":
tmp_fractions["jpg"] = obx.OBX.obx_5.obx_5_5.value
result.append(tmp_fractions.copy())
continue
elif (obx.OBX.obx_3.obx_3_1.value).lower() == "image":
tmp_fractions["html"] = obx.OBX.obx_5.obx_5_1.value
result.append(tmp_fractions.copy())
continue
tmp_fractions["fsli"] = obx.OBX.obx_3.obx_3_1.value
tmp_fractions["title_fraction"] = obx.OBX.obx_3.obx_3_2.value
tmp_fractions["value"] = obx.OBX.obx_5.obx_5_1.value
tmp_fractions["units"] = obx.OBX.obx_6.obx_6_1.value
tmp_fractions["refs"] = obx.OBX.obx_7.obx_7_1.value
result.append(tmp_fractions.copy())

if external_add_order:
iss = Issledovaniya.objects.filter(external_add_order__external_add_order=external_add_order).first()
else:
iss = Issledovaniya.objects.filter(id=iss_id).first()

if is_confirm:
iss.lab_comment = ""
iss.time_confirmation = datetime.datetime.strptime(date_time_confirm, '%Y%m%d%H%M%S')
iss.time_save = current_time()
iss.doc_confirmation_string = doctor_fio
iss.save()

for res in result:
fraction = Fractions.objects.filter(fsli=res["fsli"]).first()
if not fraction:
continue
value = res["value"]
units = res["units"]
ref_str = res["refs"]
if ref_str:
ref_str = ref_str.replace("\"", "'")
ref_str = f'{{"Все": "{ref_str}"}}'
Result(
issledovaniye=iss,
fraction=fraction,
value=value,
units=units,
ref_f=ref_str,
ref_m=ref_str,
).save()
else:
iss.lab_comment = ("",)
iss.time_confirmation = (None,)
iss.time_save = current_time()
iss.doc_confirmation_string = ""
iss.save()

def push_order(self, direction: Napravleniya):
hl7 = core.Message("ORM_O01", validation_level=VALIDATION_LEVEL.QUIET)
Expand Down Expand Up @@ -577,7 +651,17 @@ def process_push_orders():
print(f'Iterating over {len(ftp_links)} servers') # noqa: F201
for ftp_url, ftp_connection in ftp_connections.items():
directions_to_sync = []
for direction in Napravleniya.objects.filter(external_executor_hospital=ftp_connection.hospital, need_order_redirection=True)[:50]:
directions = []
directions_external_executor = []
if ftp_connection.hospital.is_auto_transfer_hl7_file:
directions = Napravleniya.objects.filter(hospital=ftp_connection.hospital, need_order_redirection=True)[:50]
else:
directions_external_executor = Napravleniya.objects.filter(external_executor_hospital=ftp_connection.hospital, need_order_redirection=True)[:50]
for dir_external in directions_external_executor:
if dir_external not in directions:
directions.append(dir_external)

for direction in directions:
is_recieve = False
for tube in TubesRegistration.objects.filter(issledovaniya__napravleniye=direction).distinct():
is_recieve = True
Expand Down
1 change: 1 addition & 0 deletions hospitals/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ class Hospitals(models.Model):
hl7_sender_application = models.CharField(max_length=55, blank=True, default=None, null=True, help_text='HL7 приложение отправитель')
hl7_receiver_appplication = models.CharField(max_length=55, blank=True, default=None, null=True, help_text='HL7 приложение получатель')
hl7_rule_file = models.CharField(max_length=60, null=True, blank=True, default="default.json", help_text="Название ф-ла правил HL7")
is_auto_transfer_hl7_file = models.BooleanField(default=False, blank=True, help_text='Автоматическая отправка файла в каталог', db_index=True)

@staticmethod
def get_default_hospital() -> Optional['Hospitals']:
Expand Down
7 changes: 7 additions & 0 deletions l2-frontend/src/construct/ConstructOrg.vue
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,13 @@
label="Требовать наличие интервалов/генератора номеров ёмкостей при получении заказов"
/>
</div>
<div class="full-width">
<FormulateInput
type="checkbox"
name="isAutotransfer"
label="Автоматически пересылать"
/>
</div>
<div class="full-width">
<FormulateInput
type="text"
Expand Down
6 changes: 6 additions & 0 deletions l2-frontend/src/registerHooks.ts
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,12 @@ export default (instance: Vue): void => {
instance.$ok('Запланирована повторная отправка результатов.\nРезультаты должны быть подтверждены полностью.\nУ пациента должен быть заполнен email и разраешена отправка.');
});

instance.$root.$on('directions:need_order_redirection', async ids => {
await instance.$api('directions/need-order-redirection', { ids });
// eslint-disable-next-line max-len
instance.$ok('Запланирована повторная отправка направления исполнителю');
});

instance.$root.$on('print:aggregate_laboratory_results', async pks => {
window.open(`/forms/docx?type=113.02&directions=${pks}`, '_blank');
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,7 @@ export default {
return {
l2_send_patients_email_results: this.$store.getters.modules.l2_send_patients_email_results,
l2_docx_aggregate_laboratory_results: this.$store.getters.modules.l2_docx_aggregate_laboratory_results,
l2_need_order_redirection: this.$store.getters.modules.l2_need_order_redirection,
};
},
menuItemsFiltered() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,13 @@ const menuItems = [
this.$root.$emit('print:aggregate_laboratory_results', this.checked);
},
},
{
title: 'Отправить внешнему исполнителю',
requiredModule: 'l2_need_order_redirection',
handler() {
this.$root.$emit('directions:need_order_redirection', this.checked);
},
},
];

export default {
Expand Down
75 changes: 75 additions & 0 deletions statistic/sql_func.py
Original file line number Diff line number Diff line change
Expand Up @@ -331,6 +331,81 @@ def statistics_research(research_id, d_s, d_e, hospital_id_filter, is_purpose=0,
return row


def statistics_research_create_directions(research_id, d_s, d_e, hospital_id_filter):
"""
На входе: research_id - id-услуги, d_s- дата начала, d_e - дата.кон, fin - источник финансирования
выход: Физлицо, Дата рождения, Возраст, Карта, Исследование, Источник финансирования, Стоимость, Исполнитель,
Направление, создано направление(дата), Дата подтверждения услуги, Время подтверждения.
:return:
"""

with connection.cursor() as cursor:
cursor.execute(
""" WITH
t_hosp AS
(SELECT id, title FROM hospitals_hospitals),
t_iss AS
(SELECT directions_napravleniya.client_id, directions_issledovaniya.napravleniye_id as napr, directions_napravleniya.hospital_id as hospital_id,
directions_napravleniya.vich_code as vich_code,
to_char(directions_issledovaniya.time_confirmation AT TIME ZONE %(tz)s, 'DD.MM.YYYY') AS date_confirm,
to_char(directions_issledovaniya.time_confirmation AT TIME ZONE %(tz)s, 'HH24:MI:SS') AS time_confirm,
to_char(directions_napravleniya.data_sozdaniya AT TIME ZONE %(tz)s, 'DD.MM.YYYY') AS create_date_napr,
to_char(directions_napravleniya.data_sozdaniya AT TIME ZONE %(tz)s, 'HH24:MI:SS') AS create_time_napr,
directions_issledovaniya.doc_confirmation_id as doc, users_doctorprofile.fio as doc_fio,
directions_issledovaniya.coast, directions_issledovaniya.discount,
directions_issledovaniya.how_many, directions_napravleniya.data_sozdaniya, directions_napravleniya.istochnik_f_id,
directions_istochnikifinansirovaniya.title as ist_f,
directions_issledovaniya.research_id, directions_issledovaniya.time_confirmation,
statistics_tickets_visitpurpose.title as purpose_title,
directions_issledovaniya.purpose_id,
dir_price_category.title as dir_category,
iss_price_category.title as iss_category
FROM directions_issledovaniya
LEFT JOIN directions_napravleniya
ON directions_issledovaniya.napravleniye_id=directions_napravleniya.id
LEFT JOIN users_doctorprofile
ON directions_issledovaniya.doc_confirmation_id=users_doctorprofile.id
LEFT JOIN directions_istochnikifinansirovaniya
ON directions_napravleniya.istochnik_f_id=directions_istochnikifinansirovaniya.id
LEFT JOIN statistics_tickets_visitpurpose
ON statistics_tickets_visitpurpose.id=directions_issledovaniya.purpose_id
LEFT JOIN contracts_pricecategory dir_price_category
ON directions_napravleniya.price_category_id=dir_price_category.id
LEFT JOIN contracts_pricecategory iss_price_category
ON directions_issledovaniya.price_category_id=iss_price_category.id
WHERE directions_napravleniya.data_sozdaniya AT TIME ZONE %(tz)s BETWEEN %(d_start)s AND %(d_end)s
AND directions_issledovaniya.research_id=%(research_id)s
AND
CASE WHEN %(hospital_id_filter)s > 0 THEN
directions_napravleniya.hospital_id = %(hospital_id_filter)s
WHEN %(hospital_id_filter)s = -1 THEN
directions_issledovaniya.napravleniye_id IS NOT NULL
END
),
t_card AS
(SELECT DISTINCT ON (clients_card.id) clients_card.id, clients_card.number AS num_card,
clients_individual.family as ind_family,
clients_individual.name AS ind_name, clients_individual.patronymic,
to_char(clients_individual.birthday, 'DD.MM.YYYY') as birthday,
clients_individual.birthday as date_born
FROM clients_individual
LEFT JOIN clients_card ON clients_individual.id = clients_card.individual_id)
SELECT napr, date_confirm, time_confirm, create_date_napr, create_time_napr, doc_fio, coast, discount,
how_many, ((coast + (coast/100 * discount)) * how_many)::NUMERIC(10,2) AS sum_money, ist_f, time_confirmation, num_card,
ind_family, ind_name, patronymic, birthday, date_born,
to_char(EXTRACT(YEAR from age(time_confirmation, date_born)), '999') as ind_age, t_hosp.title, t_iss.purpose_title, t_iss.vich_code, dir_category, iss_category FROM t_iss
LEFT JOIN t_card ON t_iss.client_id = t_card.id
LEFT JOIN t_hosp ON t_iss.hospital_id = t_hosp.id
ORDER BY time_confirmation""",
params={'research_id': research_id, 'd_start': d_s, 'd_end': d_e, 'tz': TIME_ZONE, 'hospital_id_filter': hospital_id_filter},
)

row = cursor.fetchall()
return row


def custom_statistics_research(research_id, d_s, d_e, filter_hospital_id, medical_exam):
"""
на входе: research_id - id-услуги, d_s- дата начала, d_e - дата.кон
Expand Down
Loading

0 comments on commit 234a6b2

Please sign in to comment.