|
|
|
|
@ -16,7 +16,7 @@ from sklearn import model_selection as ms
|
|
|
|
|
from sqlalchemy import text
|
|
|
|
|
from django.contrib.gis.db.models.functions import Distance
|
|
|
|
|
from postamates.settings import AGE_DAY_LIMIT
|
|
|
|
|
from postamates.settings import DB_URL
|
|
|
|
|
from postamates.settings import DB_URL, STATUS_TASK_NAME
|
|
|
|
|
from service.models import PlacementPoint, LastMLCall
|
|
|
|
|
from service import models
|
|
|
|
|
from service.utils import log_to_telegram
|
|
|
|
|
@ -24,12 +24,43 @@ import base64
|
|
|
|
|
from io import StringIO
|
|
|
|
|
from django.core.cache import cache
|
|
|
|
|
from service.layer_service import LayerService
|
|
|
|
|
from service.service import PointService
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@shared_task()
|
|
|
|
|
def raschet(table_name='service_placementpoint'):
|
|
|
|
|
LastMLCall.objects.all().delete()
|
|
|
|
|
LastMLCall.objects.create()
|
|
|
|
|
status, _ = models.TaskStatus.objects.get_or_create(task_name=STATUS_TASK_NAME)
|
|
|
|
|
raschet_objs = models.RaschetObjects.objects.all()
|
|
|
|
|
if raschet_objs:
|
|
|
|
|
status.status = 'Начало расчета кол-ва ПВЗ вокруг точек'
|
|
|
|
|
status.save()
|
|
|
|
|
total = raschet_objs.count()
|
|
|
|
|
for _i, r_o in enumerate(raschet_objs):
|
|
|
|
|
obj = models.Post_and_pvz.objects.get(id=r_o.obj_id)
|
|
|
|
|
LayerService().count_post_pvz_for_placementpoint(obj)
|
|
|
|
|
status.status = "Подсчет кол-ва ПВЗ вокруг точек: " + str(int((_i + 1) / total * 100)) + "%"
|
|
|
|
|
status.save()
|
|
|
|
|
status.status = 'Расчет кол-ва ПВЗ вокруг точек завершен'
|
|
|
|
|
status.save()
|
|
|
|
|
group_objects = models.RaschetGroups.objects.all()
|
|
|
|
|
group_total = group_objects.count()
|
|
|
|
|
if group_objects:
|
|
|
|
|
status.status = 'Начало расчета расстояний'
|
|
|
|
|
status.save()
|
|
|
|
|
qs = models.PlacementPoint.objects.all()
|
|
|
|
|
for _k, g_o in enumerate(group_objects):
|
|
|
|
|
g = models.Post_and_pvzGroup.objects.get(id=g_o.obj_id)
|
|
|
|
|
for q in qs:
|
|
|
|
|
PointService.calculate_dist_for_group(point=q, group=g)
|
|
|
|
|
status.status = "Подсчет расстояний: " + str(int(_k / group_total * 100)) + "%"
|
|
|
|
|
status.save()
|
|
|
|
|
status.status = "Подсчет расстояний завершен"
|
|
|
|
|
status.save()
|
|
|
|
|
models.RaschetObjects.objects.all().delete()
|
|
|
|
|
models.RaschetGroups.objects.all().delete()
|
|
|
|
|
# Запуск ML
|
|
|
|
|
status.status = 'Запуск ML'
|
|
|
|
|
status.save()
|
|
|
|
|
log_to_telegram('start raschet')
|
|
|
|
|
try:
|
|
|
|
|
log_to_telegram('try connect to db')
|
|
|
|
|
@ -47,11 +78,10 @@ def raschet(table_name='service_placementpoint'):
|
|
|
|
|
pts = gpd.GeoDataFrame(pts, geometry='geometry', crs='epsg:4326')
|
|
|
|
|
pts = pts.to_crs('epsg:32637')
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
feats = [
|
|
|
|
|
'id', 'metro_dist', 'target_dist', 'property_price_bargains', 'property_price_offers',
|
|
|
|
|
'property_mean_floor',
|
|
|
|
|
'property_era', 'flats_cnt', 'popul_home', 'popul_job', 'yndxfood_sum',
|
|
|
|
|
'property_era', 'flats_cnt', 'popul_home', 'popul_job', 'yndxfood_sum',
|
|
|
|
|
'yndxfood_cnt', 'school_cnt', 'kindergar_cnt', 'target_post_cnt', 'public_stop_cnt', 'sport_center_cnt',
|
|
|
|
|
'pharmacy_cnt', 'supermarket_cnt', 'supermarket_premium_cnt', 'clinic_cnt', 'bank_cnt', 'reca_cnt',
|
|
|
|
|
'lab_cnt', 'culture_cnt', 'attraction_cnt', 'mfc_cnt', 'bc_cnt', 'tc_cnt', 'rival_pvz_cnt',
|
|
|
|
|
@ -77,7 +107,6 @@ def raschet(table_name='service_placementpoint'):
|
|
|
|
|
)
|
|
|
|
|
pts_trn.loc[pts_trn.target_dist > 700, 'target_dist'] = 700
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
pts_trn['buf'] = pts_trn.buffer(500)
|
|
|
|
|
pts_trn = gpd.GeoDataFrame(pts_trn, geometry='buf', crs='epsg:32637')
|
|
|
|
|
target_post = gpd.sjoin(pts_trn, pts_target, op='contains').groupby('id', as_index=False).agg({'cnt': 'count'})
|
|
|
|
|
@ -197,6 +226,8 @@ def raschet(table_name='service_placementpoint'):
|
|
|
|
|
except Exception as e:
|
|
|
|
|
log_to_telegram(f'Ошибка при обновлении полей в базе данных: {e}')
|
|
|
|
|
log_to_telegram('Начинается обновление полей в базе')
|
|
|
|
|
status.status = 'Перерасчет ML: 50%'
|
|
|
|
|
status.save()
|
|
|
|
|
# Загрузка в базу обновленных значений
|
|
|
|
|
try:
|
|
|
|
|
log_to_telegram('Подключение к базе данных 2')
|
|
|
|
|
@ -279,7 +310,8 @@ def raschet(table_name='service_placementpoint'):
|
|
|
|
|
conn2.close()
|
|
|
|
|
cache.clear()
|
|
|
|
|
log_to_telegram('end raschet')
|
|
|
|
|
|
|
|
|
|
status.status = 'Перерасчет ML завершен'
|
|
|
|
|
status.save()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@shared_task
|
|
|
|
|
@ -340,6 +372,8 @@ def load_post_and_pvz(obj_id: int):
|
|
|
|
|
status.status = "Завершено"
|
|
|
|
|
cache.clear()
|
|
|
|
|
status.save()
|
|
|
|
|
LastMLCall.objects.all().delete()
|
|
|
|
|
LastMLCall.objects.create()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@shared_task()
|
|
|
|
|
@ -408,39 +442,38 @@ def load_data(obj_id: int):
|
|
|
|
|
status.save()
|
|
|
|
|
models.TempFiles.objects.all().delete()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@shared_task()
|
|
|
|
|
def start_pvz_group_count(instance_id: int):
|
|
|
|
|
instance = models.Post_and_pvzGroup.objects.filter(id=instance_id).first()
|
|
|
|
|
objects = models.Post_and_pvz.objects.filter(group=instance)
|
|
|
|
|
objects.update(include_in_ml=instance.include_in_ml, visible=instance.visible)
|
|
|
|
|
status, _ = models.TaskStatus.objects.get_or_create(task_name='Смена статуса для групп ПВЗ и Постаматов')
|
|
|
|
|
total = objects.count()
|
|
|
|
|
for _i, obj in enumerate(objects):
|
|
|
|
|
status.status = "Подсчет кол-ва ПВЗ вокруг точек: " + str(int((_i + 1) / total * 100)) + "%"
|
|
|
|
|
status.save()
|
|
|
|
|
LayerService().count_post_pvz_for_placementpoint(obj)
|
|
|
|
|
status.status = "Подсчет завершен"
|
|
|
|
|
status.save()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@shared_task()
|
|
|
|
|
def start_pvz_category_count(instance_id: int):
|
|
|
|
|
status, _ = models.TaskStatus.objects.get_or_create(task_name='Смена статуса для категорий ПВЗ и Постаматов')
|
|
|
|
|
instance = models.Post_and_pvzCategory.objects.filter(id=instance_id).first()
|
|
|
|
|
groups = models.Post_and_pvzGroup.objects.filter(category=instance)
|
|
|
|
|
groups.update(include_in_ml=instance.include_in_ml, visible=instance.visible)
|
|
|
|
|
total = 0
|
|
|
|
|
for gr in groups:
|
|
|
|
|
total += models.Post_and_pvz.objects.filter(group=gr).count()
|
|
|
|
|
for gr in groups:
|
|
|
|
|
_i = 0
|
|
|
|
|
objects = models.Post_and_pvz.objects.filter(group=gr)
|
|
|
|
|
objects.update(include_in_ml=instance.include_in_ml, visible=instance.visible)
|
|
|
|
|
for obj in objects:
|
|
|
|
|
_i += 1
|
|
|
|
|
status.status = "Подсчет кол-ва ПВЗ вокруг точек: " + str(int(_i / total * 100)) + "%"
|
|
|
|
|
status.save()
|
|
|
|
|
LayerService().count_post_pvz_for_placementpoint(obj)
|
|
|
|
|
status.status = "Подсчет завершен"
|
|
|
|
|
status.save()
|
|
|
|
|
# @shared_task()
|
|
|
|
|
# def start_pvz_group_count(instance_id: int):
|
|
|
|
|
# instance = models.Post_and_pvzGroup.objects.filter(id=instance_id).first()
|
|
|
|
|
# objects = models.Post_and_pvz.objects.filter(group=instance)
|
|
|
|
|
# objects.update(include_in_ml=instance.include_in_ml, visible=instance.visible)
|
|
|
|
|
# status, _ = models.TaskStatus.objects.get_or_create(task_name='Смена статуса для групп ПВЗ и Постаматов')
|
|
|
|
|
# total = objects.count()
|
|
|
|
|
# for _i, obj in enumerate(objects):
|
|
|
|
|
# status.status = "Подсчет кол-ва ПВЗ вокруг точек: " + str(int((_i + 1) / total * 100)) + "%"
|
|
|
|
|
# status.save()
|
|
|
|
|
# LayerService().count_post_pvz_for_placementpoint(obj)
|
|
|
|
|
# status.status = "Подсчет завершен"
|
|
|
|
|
# status.save()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# @shared_task()
|
|
|
|
|
# def start_pvz_category_count(instance_id: int):
|
|
|
|
|
# status, _ = models.TaskStatus.objects.get_or_create(task_name='Смена статуса для категорий ПВЗ и Постаматов')
|
|
|
|
|
# instance = models.Post_and_pvzCategory.objects.filter(id=instance_id).first()
|
|
|
|
|
# groups = models.Post_and_pvzGroup.objects.filter(category=instance)
|
|
|
|
|
# groups.update(include_in_ml=instance.include_in_ml, visible=instance.visible)
|
|
|
|
|
# total = 0
|
|
|
|
|
# for gr in groups:
|
|
|
|
|
# total += models.Post_and_pvz.objects.filter(group=gr).count()
|
|
|
|
|
# for gr in groups:
|
|
|
|
|
# _i = 0
|
|
|
|
|
# objects = models.Post_and_pvz.objects.filter(group=gr)
|
|
|
|
|
# objects.update(include_in_ml=instance.include_in_ml, visible=instance.visible)
|
|
|
|
|
# for obj in objects:
|
|
|
|
|
# _i += 1
|
|
|
|
|
# status.status = "Подсчет кол-ва ПВЗ вокруг точек: " + str(int(_i / total * 100)) + "%"
|
|
|
|
|
# status.save()
|
|
|
|
|
# LayerService().count_post_pvz_for_placementpoint(obj)
|
|
|
|
|
# status.status = "Подсчет завершен"
|
|
|
|
|
# status.save()
|
|
|
|
|
|