Обновлены SQL-запрос и обработчики в main.py для улучшения работы с данными о повреждениях:
- Изменен запрос в методе fetch_salvage_detailed_info для получения новых полей и улучшения точности данных. - Добавлены функции форматирования даты, парсинга локации и обработки состояния автомобиля. - Обновлен вывод информации о повреждениях, включая количество фотографий. Эти изменения повышают информативность и удобство использования бота.
This commit is contained in:
parent
fb3615e71c
commit
c686f55bc7
59
db.py
59
db.py
@ -84,26 +84,19 @@ class OracleDatabase:
|
|||||||
with conn.cursor() as cur:
|
with conn.cursor() as cur:
|
||||||
query = """
|
query = """
|
||||||
SELECT
|
SELECT
|
||||||
vin,
|
odo,
|
||||||
make,
|
odos,
|
||||||
model,
|
dem1,
|
||||||
vehicle_year,
|
dem2,
|
||||||
vehicle_type,
|
month||'/'||year as sale_date,
|
||||||
primary_damage,
|
JSON_VALUE(jdata, '$.RepCost') AS j_rep_cost,
|
||||||
secondary_damage,
|
JSON_VALUE(jdata, '$.Runs_Drive') AS j_runs_drive,
|
||||||
sale_date,
|
JSON_VALUE(jdata, '$.Locate') AS j_locate,
|
||||||
odometer,
|
(select count(*) from salvagedb.salvage_images si where si.vin = s.vin and fn =1) img_count
|
||||||
sale_title_state,
|
FROM salvagedb.salvagedb s
|
||||||
sale_title_type,
|
LEFT JOIN salvagedb.addinfo i ON s.num = i.numid
|
||||||
seller,
|
WHERE vin = :vin AND svin = substr(:vin, 1, 10)
|
||||||
lot,
|
ORDER BY year DESC, month DESC
|
||||||
estimate_repair_cost,
|
|
||||||
actual_cash_value,
|
|
||||||
sale_country,
|
|
||||||
sale_location
|
|
||||||
FROM salvagedb.salvagedb
|
|
||||||
WHERE vin = :vin
|
|
||||||
ORDER BY sale_date DESC
|
|
||||||
"""
|
"""
|
||||||
cur.execute(query, {"vin": vin})
|
cur.execute(query, {"vin": vin})
|
||||||
results = cur.fetchall()
|
results = cur.fetchall()
|
||||||
@ -112,23 +105,15 @@ class OracleDatabase:
|
|||||||
detailed_records = []
|
detailed_records = []
|
||||||
for row in results:
|
for row in results:
|
||||||
record = {
|
record = {
|
||||||
'vin': row[0],
|
'odo': row[0],
|
||||||
'make': row[1],
|
'odos': row[1],
|
||||||
'model': row[2],
|
'dem1': row[2],
|
||||||
'vehicle_year': row[3],
|
'dem2': row[3],
|
||||||
'vehicle_type': row[4],
|
'sale_date': row[4],
|
||||||
'primary_damage': row[5],
|
'j_rep_cost': row[5],
|
||||||
'secondary_damage': row[6],
|
'j_runs_drive': row[6],
|
||||||
'sale_date': row[7],
|
'j_locate': row[7],
|
||||||
'odometer': row[8],
|
'img_count': row[8]
|
||||||
'sale_title_state': row[9],
|
|
||||||
'sale_title_type': row[10],
|
|
||||||
'seller': row[11],
|
|
||||||
'lot': row[12],
|
|
||||||
'estimate_repair_cost': row[13],
|
|
||||||
'actual_cash_value': row[14],
|
|
||||||
'sale_country': row[15],
|
|
||||||
'sale_location': row[16]
|
|
||||||
}
|
}
|
||||||
detailed_records.append(record)
|
detailed_records.append(record)
|
||||||
|
|
||||||
|
|||||||
124
main.py
124
main.py
@ -13,6 +13,65 @@ from db import OracleDatabase
|
|||||||
from middlewares.db import DbSessionMiddleware
|
from middlewares.db import DbSessionMiddleware
|
||||||
|
|
||||||
|
|
||||||
|
def get_us_state_name(state_code: str) -> str:
|
||||||
|
"""
|
||||||
|
Конвертирует двухбуквенный код штата США в полное название
|
||||||
|
"""
|
||||||
|
states = {
|
||||||
|
'AL': 'Alabama', 'AK': 'Alaska', 'AZ': 'Arizona', 'AR': 'Arkansas', 'CA': 'California',
|
||||||
|
'CO': 'Colorado', 'CT': 'Connecticut', 'DE': 'Delaware', 'FL': 'Florida', 'GA': 'Georgia',
|
||||||
|
'HI': 'Hawaii', 'ID': 'Idaho', 'IL': 'Illinois', 'IN': 'Indiana', 'IA': 'Iowa',
|
||||||
|
'KS': 'Kansas', 'KY': 'Kentucky', 'LA': 'Louisiana', 'ME': 'Maine', 'MD': 'Maryland',
|
||||||
|
'MA': 'Massachusetts', 'MI': 'Michigan', 'MN': 'Minnesota', 'MS': 'Mississippi', 'MO': 'Missouri',
|
||||||
|
'MT': 'Montana', 'NE': 'Nebraska', 'NV': 'Nevada', 'NH': 'New Hampshire', 'NJ': 'New Jersey',
|
||||||
|
'NM': 'New Mexico', 'NY': 'New York', 'NC': 'North Carolina', 'ND': 'North Dakota', 'OH': 'Ohio',
|
||||||
|
'OK': 'Oklahoma', 'OR': 'Oregon', 'PA': 'Pennsylvania', 'RI': 'Rhode Island', 'SC': 'South Carolina',
|
||||||
|
'SD': 'South Dakota', 'TN': 'Tennessee', 'TX': 'Texas', 'UT': 'Utah', 'VT': 'Vermont',
|
||||||
|
'VA': 'Virginia', 'WA': 'Washington', 'WV': 'West Virginia', 'WI': 'Wisconsin', 'WY': 'Wyoming',
|
||||||
|
'DC': 'District of Columbia'
|
||||||
|
}
|
||||||
|
return states.get(state_code.upper(), state_code)
|
||||||
|
|
||||||
|
|
||||||
|
def format_sale_date(date_str: str) -> str:
|
||||||
|
"""
|
||||||
|
Форматирует дату продажи из MM/YYYY в красивый формат
|
||||||
|
"""
|
||||||
|
if not date_str or date_str == 'None' or '/' not in date_str:
|
||||||
|
return "Unknown"
|
||||||
|
|
||||||
|
try:
|
||||||
|
month, year = date_str.split('/')
|
||||||
|
months = {
|
||||||
|
'1': 'January', '2': 'February', '3': 'March', '4': 'April',
|
||||||
|
'5': 'May', '6': 'June', '7': 'July', '8': 'August',
|
||||||
|
'9': 'September', '10': 'October', '11': 'November', '12': 'December'
|
||||||
|
}
|
||||||
|
month_name = months.get(month.lstrip('0'), month)
|
||||||
|
return f"{month_name} {year}"
|
||||||
|
except:
|
||||||
|
return date_str
|
||||||
|
|
||||||
|
|
||||||
|
def parse_location(location_str: str) -> str:
|
||||||
|
r"""
|
||||||
|
Парсит и форматирует локацию из формата ST\TOWN
|
||||||
|
"""
|
||||||
|
if not location_str or location_str == 'None':
|
||||||
|
return "Unknown Location"
|
||||||
|
|
||||||
|
try:
|
||||||
|
if '\\' in location_str:
|
||||||
|
state_code, city = location_str.split('\\', 1)
|
||||||
|
state_name = get_us_state_name(state_code.strip())
|
||||||
|
city_formatted = city.strip().title()
|
||||||
|
return f"{city_formatted}, {state_name}"
|
||||||
|
else:
|
||||||
|
return location_str
|
||||||
|
except:
|
||||||
|
return location_str
|
||||||
|
|
||||||
|
|
||||||
if getenv("DEBUG",'0') == '1':
|
if getenv("DEBUG",'0') == '1':
|
||||||
logging.basicConfig(level=logging.INFO)
|
logging.basicConfig(level=logging.INFO)
|
||||||
else:
|
else:
|
||||||
@ -489,38 +548,45 @@ async def successful_payment_handler(message: Message, db: OracleDatabase = None
|
|||||||
for idx, record in enumerate(salvage_records[:5], 1): # Показываем максимум 5 записей
|
for idx, record in enumerate(salvage_records[:5], 1): # Показываем максимум 5 записей
|
||||||
report += f"📋 **Record #{idx}**\n"
|
report += f"📋 **Record #{idx}**\n"
|
||||||
|
|
||||||
|
# Дата продажи с красивым форматированием
|
||||||
if record['sale_date']:
|
if record['sale_date']:
|
||||||
report += f"📅 **Sale Date:** {record['sale_date']}\n"
|
formatted_date = format_sale_date(record['sale_date'])
|
||||||
|
report += f"📅 **Sale Date:** {formatted_date}\n"
|
||||||
|
|
||||||
if record['primary_damage']:
|
# Основное повреждение
|
||||||
report += f"⚠️ **Primary Damage:** {record['primary_damage']}\n"
|
if record['dem1']:
|
||||||
|
report += f"⚠️ **Primary Damage:** {record['dem1']}\n"
|
||||||
|
|
||||||
if record['secondary_damage']:
|
# Вторичное повреждение
|
||||||
report += f"⚠️ **Secondary Damage:** {record['secondary_damage']}\n"
|
if record['dem2']:
|
||||||
|
report += f"⚠️ **Secondary Damage:** {record['dem2']}\n"
|
||||||
|
|
||||||
if record['vehicle_type']:
|
# Одометр
|
||||||
report += f"🚙 **Vehicle Type:** {record['vehicle_type']}\n"
|
if record['odo']:
|
||||||
|
try:
|
||||||
|
odo_value = int(record['odo']) if record['odo'] else 0
|
||||||
|
odo_status = f" ({record['odos']})" if record['odos'] else ""
|
||||||
|
report += f"🛣️ **Odometer:** {odo_value:,} miles{odo_status}\n"
|
||||||
|
except (ValueError, TypeError):
|
||||||
|
report += f"🛣️ **Odometer:** {record['odo']}\n"
|
||||||
|
|
||||||
if record['odometer']:
|
# Стоимость ремонта
|
||||||
report += f"🛣️ **Odometer:** {record['odometer']:,} miles\n"
|
if record['j_rep_cost']:
|
||||||
|
try:
|
||||||
|
repair_cost = float(record['j_rep_cost']) if record['j_rep_cost'] else 0
|
||||||
|
if repair_cost > 0:
|
||||||
|
report += f"💰 **Repair Cost:** ${repair_cost:,.2f}\n"
|
||||||
|
except (ValueError, TypeError):
|
||||||
|
report += f"💰 **Repair Cost:** ${record['j_rep_cost']}\n"
|
||||||
|
|
||||||
if record['sale_title_state']:
|
# Состояние двигателя/движения
|
||||||
report += f"📍 **Title State:** {record['sale_title_state']}\n"
|
if record['j_runs_drive']:
|
||||||
|
report += f"🔧 **Engine Status:** {record['j_runs_drive']}\n"
|
||||||
|
|
||||||
if record['sale_title_type']:
|
# Локация с конвертированными штатами
|
||||||
report += f"📄 **Title Type:** {record['sale_title_type']}\n"
|
if record['j_locate']:
|
||||||
|
formatted_location = parse_location(record['j_locate'])
|
||||||
if record['seller']:
|
report += f"📍 **Sale Location:** {formatted_location}\n"
|
||||||
report += f"🏢 **Seller:** {record['seller']}\n"
|
|
||||||
|
|
||||||
if record['estimate_repair_cost']:
|
|
||||||
report += f"💰 **Estimated Repair Cost:** ${record['estimate_repair_cost']:,}\n"
|
|
||||||
|
|
||||||
if record['actual_cash_value']:
|
|
||||||
report += f"💵 **Actual Cash Value:** ${record['actual_cash_value']:,}\n"
|
|
||||||
|
|
||||||
if record['sale_location']:
|
|
||||||
report += f"📍 **Sale Location:** {record['sale_location']}\n"
|
|
||||||
|
|
||||||
report += "\n"
|
report += "\n"
|
||||||
|
|
||||||
@ -538,6 +604,14 @@ async def successful_payment_handler(message: Message, db: OracleDatabase = None
|
|||||||
builder.adjust(2)
|
builder.adjust(2)
|
||||||
|
|
||||||
await message.answer(report, reply_markup=builder.as_markup(), parse_mode="Markdown")
|
await message.answer(report, reply_markup=builder.as_markup(), parse_mode="Markdown")
|
||||||
|
|
||||||
|
# Отправляем отдельное сообщение о фотографиях
|
||||||
|
if salvage_records and salvage_records[0]['img_count'] > 0:
|
||||||
|
img_count = salvage_records[0]['img_count']
|
||||||
|
photo_message = f"📸 **Photo Information**\n\n"
|
||||||
|
photo_message += f"🖼️ **{img_count} damage photos** found in our database for this vehicle.\n"
|
||||||
|
photo_message += f"These photos show the actual condition and damage of the vehicle during auction."
|
||||||
|
await message.answer(photo_message, parse_mode="Markdown")
|
||||||
else:
|
else:
|
||||||
# Нет записей - возвращаем деньги
|
# Нет записей - возвращаем деньги
|
||||||
try:
|
try:
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user