Please use this identifier to cite or link to this item:
https://er.chdtu.edu.ua/handle/ChSTU/6194| Title: | Мобільний додаток з транспортної логістики |
| Authors: | Оксамитна, Любов Павлівна Волков, Іван Сергійович |
| Keywords: | ПРЕДМЕТНА ОБЛАСТЬ;МОБІЛЬНИЙ ДОДАТОК;ТРАНСПОРТНА ЛОГІСТИКА;ПРОЄКТУВАННЯ. |
| Issue Date: | 14-Jun-2023 |
| Abstract: | На сьогоднішній день логістичний підхід в технологіях транспортних процесів є однією з найбільш важливих і актуальних проблем. Він характеризується досягненням оптимальності руху матеріального потоку в процесі додатку до нього логістичних операцій. Найпопулярнішими критеріями є умови та порядок постачання і політика транспортування. Необхідність вирішення питань організації транспортної логістики на підприємстві, її ефективне використання за допомогою сучасних інформаційних технологій обумовлює актуальність обраної теми кваліфікаційної роботи бакалавра. Мета кваліфікаційної роботи бакалавра – створення мобільного додатку з транспортної логістики. Об’єкт дослідження: процеси транспортної логістики. Предмет дослідження: мобільний додаток з транспортної логістики. |
| URI: | https://er.chdtu.edu.ua/handle/ChSTU/6194 |
| Appears in Collections: | 122 Комп’ютерні науки (Комп’ютерні науки та прикладне програмування) |
Files in This Item:
| File | Description | Size | Format | |
|---|---|---|---|---|
| Пояснювальна записка_Волков Іван_КН-1901_2022-2023.pdf Restricted Access | 3.06 MB | Adobe PDF | View/Open Request a copy |
Items in DSpace are protected by copyright, with all rights reserved, unless otherwise indicated.
Extracted text
6
МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИЧЕРКАСЬКИЙ ДЕРЖАВНИЙ
ТЕХНОЛОГІЧНИЙ УНІВЕРСИТЕТ
Факультет інформаційних технологій і систем
Кафедра комп’ютерних наук та системного аналізу
Пояснювальна записка
до кваліфікаційної роботи
бакалавра
(освітньо-кваліфікаційний рівень)
на тему: «Мобільний додаток з транспортної логістики»
Виконав: студент 4 курсу, групи КН-1901
спеціальності 122 «Комп’ютерні науки»
(шифр і назва спеціальності)
освітня програма «Комп’ютерні науки та
(назва освітньої програми)
прикладне програмування
Волков Іван Сергійович
Керівник __________ Оксамитна Л.П.
(прізвище та ініціали)
Рецензент __________ Колесніков Д.В.
(прізвище та ініціали)
Черкаси 2023 року
7
Бланк завдання на кваліфікаційну роботу бакалавра студенту
Черкаський державний технологічний університет
Факультет Інформаційних технологій і систем
Кафедра Комп’ютерних наук та системного аналізу
Освітньо-кваліфікаційний рівень Бакалавр
Спеціальність 122 – Комп’ютерні науки
Освітня програма Комп’ютерні науки та прикладне програмування
ЗАТВЕРДЖУЮ
Завідувач кафедри КНСА
_______________ Юрій ТРИУС
«____» _____________ 2023 р.
ЗАВДАННЯ
на кваліфікаційну роботу бакалавра студенту
Волкову Івану Сергійовичу
(прізвище, ім‘я, по батькові)
1. Тема роботи Мобільний додаток з транспортної логістики
Керівник роботи Оксамитна Л.П., к.т.н., доцент
(прізвище, ім’я, по батькові, науковий ступінь, вчене звання)
затверджені наказом університету від «24» лютого 2023 р. №43/04.
2. Строк подання студентом роботи до 12 червня 2023 року
3. Вихідні дані до роботи:
Практичні навики роботи з інформаційними ресурсами. Робота з базами даних.
Звіт з виробничої практики. Звіт з переддипломної практики.
4. Зміст пояснювальної записки (перелік питань, що їх належить розробити):
Вступ
4.1. Дослідження транспортно-логістичної системи.
4.2. Проектування та розробка мобільного додатку з транспортної логістики.
4.3. Тестування мобільного додатку.
Висновки.
5. Перелік додатків (з точним зазначенням назв додатків):
5.1. Додаток А. Специфікація 482.ЧДТУ. 31911-01.
5 .2. Додаток Б. Текст програми.
5.3. Додаток В. Інструкція користувача.
5.4. Додаток Г. Публікація по темі кваліфікаційної роботи бакалавра в збірнику тез ЧДТУ.
5.5. Презентація у вигляді 31 слайду.
6 . Консультанти розділів роботи
8
Прізвище, ініціали та Підпис, дата
Розділ
посадаконсультанта завдання видав завдання прийняв
7. Дата видачі завдання 11.01.2023
КАЛЕНДАРНИЙ ПЛАН
Строк виконання
№ з/п Назва етапів кваліфікаційної роботи бакалавра Примітка
етапів роботи
1 Видача завдання на кваліфікаційну роботу
11.01.2023 Виконано
бакалавра.
2 Аналіз літературних джерел, об’єкту та предмету
до 13.02.2023 Виконано
дослідження.
3 Написання теоретичного розділу кваліфікаційної
до 15.03.2023 Виконано
роботи бакалавра.
4 Написання аналітичного розділу кваліфікаційної
до 01.04.2023 Виконано
роботи бакалавра.
5 Написання практичних розділів й висновків до
до 01.05.2023 Виконано
кваліфікаційної роботи бакалавра.
6 Передзахист кваліфікаційної роботи бакалавра
01.06.2023 Виконано
на засіданні кафедри КНСА.
7 Подання роботи завідувачу кафедри КНСА. до 12.06.2023 Виконано
8 Захист кваліфікаційної роботи бакалавра. 14.06.2023 Виконано
Студент _____________________________ Волков І.С.
(підпис)
Керівник роботи ____________________________ Оксамитна Л.П.
(підпис)
9
РЕФЕРАТ
Кваліфікаційна робота бакалавра містить: 69 с., 23 рис., 1 таблицю, 16
використаних джерел, 3 додатки.
Актуальність теми. На сьогоднішній день логістичний підхід в технологіях
транспортних процесів є однією з найбільш важливих і актуальних проблем. Він
характеризується досягненням оптимальності руху матеріального потоку в процесі
додатку до нього логістичних операцій. Найпопулярнішими критеріями є умови та
порядок постачання і політика транспортування. Необхідність вирішення питань
організації транспортної логістики на підприємстві, її ефективне використання за
допомогою сучасних інформаційних технологій обумовлює актуальність обраної
теми кваліфікаційної роботи бакалавра.
Мета роботи і задачі дослідження. Мета кваліфікаційної роботи бакалавра –
створення мобільного додатку з транспортної логістики.
Для досягнення поставленої мети були поставлені такі завдання:
дослідити транспортно-логістичну систему України;
виконати порівняльний аналіз існуючих мобільних додатків з транспортної
логістики;
обрати програмно-технічні засоби для розробки мобільного додатку з
транспортної логістики;
розробити мобільний додаток з транспортної логістики;
провести тестування мобільного додатку з транспортної логістики.
Об’єкт дослідження: процеси транспортної логістики.
Предмет дослідження: мобільний додаток з транспортної логістики.
Методи дослідження.
– теоретичний (аналіз літератури з проблеми дослідження);
– емпіричний – полягав у створенні та налаштуванні мобільного додатку з
транспортної логістики;
– порівняльний – для здійснення порівнянь існуючих мобільних додатків з
транспортної логістики.
10
Перелік ключових слів: ПРЕДМЕТНА ОБЛАСТЬ, МОБІЛЬНИЙ ДОДАТОК,
ТРАНСПОРТНА ЛОГІСТИКА, ПРОЄКТУВАННЯ.
ABSTRACT
Master’s work contains: 69 pages, 23 figures, 1 table, 16 sources used, 3
attachments.
Actuality of theme: Today, the logistics approach in the technologies of transport
processes is one of the most important and urgent problems. It is characterized by achieving
the optimality of the movement of the material flow in the process of adding logistics
operations to it. The most popular criteria are terms and conditions of delivery and
transportation policy. The need to solve the issues of the organization of transport logistics
at the enterprise, its effective use with the help of modern information technologies
determines the relevance of the chosen topic of the bachelor's qualification work.
Purpose and tasks of the research: The purpose of the master’s qualification work
is to create a mobile application for transport logistics.
To achieve this goal, the following tasks are solved in the work:
– to study the transport and logistics system of Ukraine;
– perform a comparative analysis of existing mobile applications for transport logistics;
– choose software and technical means for developing a mobile application for transport
logistics;
– to develop a mobile application for transport logistics;
– to test the mobile application for transport logistics.
The object of research: transport logistics processes.
The subject of research: mobile application for transport logistics.
Research methods:
– theoretical (analysis of the literature on the research problem);
– empirical – consisted in creating and setting up a mobile application for transport
logistics;
– comparative – for comparing existing mobile applications for transport logistics.
The list of keywords: SUBJECT FIELD, MOBILE APPLICATION, TRANSPORT
LOGISTICS, DESIGNING.
11
ЗМІСТ
Стор.
ПЕРЕЛІК УМОВНИХ ПОЗНАЧЕНЬ, СИМВОЛІВ, СКОРОЧЕНЬ І
ТЕРМІНІВ 13
ВСТУП 14
1 ДОСЛІДЖЕННЯ ТРАНСПОРТНО-ЛОГІСТИЧНОЇ СИСТЕМИ 16
1.1 Структура транспортно-логістичної системи України 16
1.2 Мобільні пристрої як обов’язковий інструмент в транспортній 20
логістиці
1.2.1 Місце логістичних додатків в цифровій екосистемі 24
1.2.2 Вимоги, яким повинен відповідати мобільний додаток 27
1.2.3 Пакетні мобільні сервіси для логістики 28
1.2.4 Етапи розробки мобільного додатку з транспортної логістики 31
1.3 Порівняльний аналіз існуючих мобільних додатків з 33
транспортної логістики
1.3.1 Аналіз додатку «TransParking» 33
1.3.2 Аналіз додатку «Bans For Trucks». 35
1.3.3 Аналіз додатку «Loads2GO!». 37
1.3.4 Аналіз додатку «TransTask» 39
1.3.5 Аналіз додатку «ICE - In Case of Emergency» 41
1.4 Аналіз порівнянь існуючих рішень розглянутих реалізацій 43
Висновки до розділу 1 49
2 ПРОЕКТУВАННЯ ТА РОЗРОБКА МОБІЛЬНОГО ДОДАТКУ З
ТРАНСПОРТНОЇ ЛОГІСТИКИ 50
2.1 Опис функціонального програмного середовища для розробки 50
2.2 Обґрунтування вибору сучасних технологій веб-програмування 52
для створення мобільного додатку
12
2.3 Огляд Lardi-Trans API 53
2.4 Опис проектування та розробки мобільного додатку з 55
транспортної логістики
Висновки до розділу 2 61
3 ТЕСТУВАННЯ МОБІЛЬНОГО ДОДАТКУ 62
3.1 Особливості тестування мобільного додатку 62
3.2 Тест-кейси перевірки працездатності застосунку 64
3.3 Ручне тестування мобільного додатку з транспортної логістики 65
на новітніх “розумних телефонах”
Висновки до розділу 3 67
ВИСНОВКИ 68
СПИСОК ВИКОРИСТАНИХ ДЖЕРЕЛ 70
Додаток А. Специфікація 482.ЧДТУ. 31911-01 72
Додаток Б. Текст програми 74
Додаток В. Інструкція користувача 105
13
ПЕРЕЛІК УМОВНИХ ПОЗНАЧЕНЬ, СИМВОЛІВ, СКОРОЧЕНЬ І ТЕРМІНІВ
БД – база даних;
ПЗ – програмне забезпечення;
ТЛС – транспортно-логістична система;
РТЛС – регіональні логістичні транспортні системи;
ТЛЦ – транспортно-логістичний центр;
ІТЛСУ – інтегрована транспортно-логістична система України.
14
ВСТУП
У сучасній транспортній інфраструктурі України відповідно до стандартів
світової економіки поступово відбуваються структурні системні зміни, орієнтовані на
логістику. Стратегія логістики характеризується, передусім, ефектом інтеграції, що
призводить до зменшення витрат та зростанню якості обслуговування
вантажовідправників та вантажоотримувачів.
На сьогоднішній день логістичний підхід в технологіях транспортних процесів
є однією з найбільш важливих і актуальних проблем. Він характеризується
досягненням оптимальності руху матеріального потоку в процесі додатку до нього
логістичних операцій. Найпопулярнішими критеріями є умови та порядок поставок
(логістика поставок) і політика транспортування.
Актуальність даної теми.
При раціоналізації логістичних процесів у минулому основна увага, як правило,
приділялося фізичному підйомно-транспортному процесу. Сьогодні увага усе більш
звертається на інформаційний потік, за допомогою якого планують матеріальний
потік, керують ним і контролюють його. Поліпшення інформатики й організації
нерідко може принести більший ефект, чим технічні інновації.
Питання транспортної логістики ґрунтовно досліджуються у працях відомих
вчених (Миротин Л.Б., Тишбаев И.Е, Безель Б.П.), які розглядають дану проблему,
ґрунтуючись на засадах розвиненої ринкової економіки.
Необхідність вирішення питань організації транспортної логістики на
підприємстві, її ефективне використання за допомогою сучасних інформаційних
технологій обумовлює актуальність обраної теми кваліфікаційної роботи бакалавра.
Мета кваліфікаційної роботи бакалавра – створення мобільного додатку з
транспортної логістики.
Для досягнення поставленої мети були поставлені такі завдання:
дослідити транспортно-логістичну систему України;
виконати порівняльний аналіз існуючих мобільних додатків з транспортної
логістики;
15
обрати програмно-технічні засоби для розробки мобільного додатку з
транспортної логістики;
розробити мобільний додаток з транспортної логістики;
провести тестування мобільного додатку з транспортної логістики.
Об’єкт і предмет дослідження.
Об’єктом дослідження є процеси транспортної логістики.
Предметом дослідження є мобільний додаток з транспортної логістики.
Для вирішення поставлених завдань були застосовані наступні методи
дослідження:
– теоретичний (аналіз літератури з проблеми дослідження);
– емпіричний – полягав у спостереженні та налаштуванні мобільного додатку з
транспортної логістики;
– порівняльний – для здійснення порівнянь існуючих мобільних додатків з
транспортної логістики.
Для створення програмного забезпечення використано новітні технології, а
саме: Android, Kotlin, Jetpack Compose, GPS, Google Maps, REST. Обрані технології
задовольняють всім функціональним і не функціональним вимогам до такого типу
програмного забезпечення (ПЗ).
16
1 ДОСЛІДЖЕННЯ ТРАНСПОРТНО-ЛОГІСТИЧНОЇ СИСТЕМИ
1.1 Структура транспортно-логістичної системи України
Транспортно-логістична система (ТЛС) – це інтегрована сукупність суб’єктів
транспортно-логістичної діяльності та об’єктів транспортно-логістичної
інфраструктури, що взаємодіють між собою з метою оптимізації руху вантажопотоків
“від дверей до дверей” за мінімальних витрат на максимально вигідних умовах.
Вона є засобом інтеграції вітчизняного транспортного комплексу в міжнародні
транспортно-логістичні системи шляхом забезпечення їх ефективної взаємодії;
задовольняє потреби споживачів транспортно-логістичних послуг внаслідок
гармонізації їх інтересів з інтересами всіх учасників транспортно-розподільчого
процесу; сприяє реалізації ефективної транспортної політики на основі
раціонального розподілу інвестиційних коштів держави та приватного сектору;
створює гнучку тарифну політику на різних видах транспорту з метою збільшення
транзитних вантажних потоків через територію України на основі формування
оптимальних схем доставлення вантажу [1].
Для підвищення стійкості функціювання транспортно-логістичних систем нині
необхідно вирішити завдання по скороченню витрат, вдосконаленню управління
перевізним процесом, обґрунтуванню нормативів трудових, фінансових і
матеріальних ресурсів. Особливе значення в умовах конкуренції має пошук нових
форм інтеграції транспорту, митних органів, експедиторів, вантажовласників і інших
учасників логістичного ланцюга доставлення вантажів.
При створенні нових транспортно-логістичних систем і моделюванні процесу
їх функціонування необхідно застосовувати не "реактивний" підхід до управління
власністю, а "про-активний". В цьому випадку при управлінні інфраструктурою
враховується довгострокова перспектива розвитку транспортно-логістичних систем,
а не тільки реакція на поточну зміну ситуації на транспортному ринку.
До завдання стратегічного планування відноситься і визначення нормативів, що
забезпечують зниження експлуатаційних витрат в період спаду перевезень і
17
підвищення надійності в період збільшення розмірів вантажопотоків, що
переробляються.
Основні елементи транспортно-логістичної системи в розрізі функціональної та
забезпечувальної підсистем представлено на рисунку 1.1.
Створення транспортно-логістичних систем припускає розвиток інтеграційних
зв'язків з потенційними партнерами, серед яких можуть виступати і конкуренти (різні
види транспорту, експедиторські структури. Структура транспортно-логістичної
системи України має складатися з п’яти рівнів логістичної взаємодії.
Рисунок 1.1 – Елементи транспортно-логістичної системи
Перелічимо рівні логістичної взаємодії:
взаємодія об’єктів транспортно-логістичної інфраструктури (термінальні та
вантажні комплекси, складські господарства, підприємства різних видів транспорту
та транспортно-логістичного сервісу тощо);
логістичні транспортні центри місцевого, регіонального та міжнародного
призначення;
регіональні логістичні транспортні системи;
18
логістичні транспортні кластери;
інтегрована транспортно-логістична система України (підсистема економічної
системи країни та міжнародних транспортно-логістичних систем).
Розглянемо більш детально кожний із вище наведених рівнів транспортно-
логістичної системи України окремо.
Перший рівень транспортно-логістичної системи характеризується низьким
ступенем взаємодії об’єктів логістичної інфраструктури. Основною метою, що
реалізується на цьому рівні, є координація, а також синхронізація процесів
транспортно-логістичного обслуговування вантажного потоку “від дверей до дверей”
за оптимальних витрат та відповідного рівня логістичного сервісу. Зауважимо, що на
сьогодні стан розвитку об’єктів транспортно-логістичної інфраструктури країни не
задовольняє потребам національної економіки.
На другому рівні формуються логістичні транспортні центри локального,
регіонального та міжнародного значення, а також інформаційно-аналітичні центри.
Основними завданнями функціонування транспортно-логістичних центів (ТЛЦ) є
забезпечення надання транспортно-логістичних послуг за мінімальних витрат на
логістичне обслуговування та логістичну інфраструктуру шляхом кооперації
транспортно-логістичних компаній, що надають спеціалізований комплекс
логістичних послуг. Варто додати, що ТЛЦ утворюють логістичні транспортні вузли
– центри зростання національної та регіональної економіки. Наявність розвинутої
логістичної інфраструктури та професійних ТЛЦ також дає змогу організувати
оптимальні схеми доставлення вантажу за інтермодальними та мультимодальними
технологіями [1, 2].
Третій рівень являє собою регіональні логістичні транспортні системи (РТЛС),
які спрямовані на оптимізацію руху вантажного потоку в межах певного регіону.
Звідси виходить, що основним обмеженням цього рівня інтеграції є його
територіальна належність. РТЛС сприяють взаємодії суб’єктів транспортно-
логістичної діяльності при обслуговуванні вантажного потоку на території
конкретного регіону, використовуючи його специфіку та потенційні можливості.
19
РТЛС є підсистемою регіональної економічної системи та транспортно-логістичного
кластера.
Логістичні транспортні кластери (ТЛК) формуються на четвертому рівні та на
відміну від РТЛС, мають головне обмеження не за територіальними ознаками, а по
наближенню знаходження учасників транспортно-розподільчого процесу до
міжнародних транспортних коридорів. ТЛК спрямовані на оптимізацію руху
вантажного потоку у міжнародних ланцюгах постачання. ТЛК концентрує в собі
транспортно-логістичну інфраструктуру прикордонних територій та певних регіонів,
логістичні транспортні компанії, виробничі підприємства тощо. Концепція створення
ТЛК має базуватися на нормативно-правовому регулюванні, організаційному,
фінансовому, технічному, а також інформаційному забезпеченні діяльності
транспортно-логістичних підприємств.
На останньому п’ятому рівні формується інтегрована транспортно-логістична
система України (ІТЛСУ), основною метою якої є координація організаційно-
економічної, технічної та технологічної взаємодії суб’єктів ринку транспортно-
логістичних послуг і об’єктів транспортно-логістичної інфраструктури країни для
забезпечення оптимального руху вантажного потоку “від дверей до дверей”;
підвищення ефективності економічної системи держави та зайняття
конкурентоспроможних позицій на світовому ринку транспортно-логістичних
послуг.
На створення ефективної ІТЛСУ як підсистеми економічної системи країни та
складової частини міжнародних транспортно-логістичних систем безпосередньо
впливають: міжнародне та національне регулювання перевезення вантажів, фінансова
система країни (транспортної галузі), ринкова інфраструктура, природно ресурсний
потенціал країни (транспортної галузі), ринок споживачів транспортно-логістичних
послуг.
Слід зазначити, що базисом для функціювання та розвитку транспортно-
логістичних систем є види транспортну. Розглянемо наступні види транспорту:
Автомобільний транспорт: автомобільні дороги, автостанції, автомобільні
перевезення вантажів та пасажирів.
20
Залізничний транспорт: залізничні магістралі, залізничні станції, вантажні
термінали, залізничні перевезення вантажів та пасажирів.
Водний транспорт: річки, канали, морські порти, річкові порти, вантажні
термінали, перевезення вантажів та пасажирів по внутрішніх водних шляхах та
морському шляху.
Повітряний транспорт: аеропорти, авіалінії, вантажні термінали, перевезення
вантажів та пасажирів повітряними суднами.
Трубопровідний транспорт: нафтопроводи, газопроводи, трубопроводи для
перевезення нафти, газу та інших речовин.
Логістична інфраструктура: склади, логістичні центри, термінали,
дистрибуційні мережі, системи управління логістичними потоками.
Ці види транспорту відповідають за перевезення вантажів та пасажирів в
Україні, а також забезпечують зв'язок з іншими країнами. Кожен з цих видів
транспорту має свої особливості і переваги, які використовуються залежно від потреб
і можливостей.
Важливо зазначити, що структура транспортно-логістичної системи України
також включає інфраструктуру, таку як дороги, залізничні магістралі, порти,
аеропорти, річкові та морські термінали, а також склади та логістичні центри. Ці
елементи співпрацюють між собою, забезпечуючи ефективну організацію
транспортних потоків та логістичних процесів у країні.
Збалансована та розвинута структура транспортно-логістичної системи є
важливим фактором для економічного розвитку країни, забезпечуючи швидкий та
безперебійний рух товарів та пасажирів, зниження транспортних витрат та
покращення логістичних процесів.
1.2 Мобільні пристрої як обов’язковий інструмент в транспортній
логістиці
Мобільні пристрої стали невід'ємною частиною сучасного світу і мають
великий вплив на різні галузі бізнесу, в тому числі і на транспортну логістику. Вони
21
стали обов'язковим інструментом для покращення ефективності та ефективного
управління логістичними процесами.
Переваги використання мобільних пристроїв у транспортній логістиці
незаперечні. Перш за все, вони забезпечують мобільність та доступність інформації.
Завдяки мобільним додаткам, логісти, водії транспортних засобів, вантажники та
інші учасники логістичних процесів можуть отримати необхідну інформацію у
реальному часі, безпосередньо на місці роботи або під час переміщення.
Застосування мобільних пристроїв також сприяє автоматизації та оптимізації
логістичних процесів. Завдяки цим пристроям можна вести облік вантажів,
відстежувати їх рух, контролювати запаси, планувати маршрути та навантаження
транспорту, спілкуватися з клієнтами та партнерами, проводити аналіз даних та
приймати обґрунтовані рішення.
Крім того, мобільні пристрої дозволяють знизити витрати та покращити
ефективність комунікації. Замість телефонних дзвінків або електронних листів,
співробітники можуть взаємодіяти через спеціалізовані додатки, обмінюючись
інформацією, виконуючи завдання та координуючи дії.
Таким чином, використання мобільних пристроїв є необхідним у транспортній
логістиці для покращення ефективності, зниження витрат та оптимізації логістичних
процесів. Вони дозволяють забезпечити швидкий доступ до інформації,
автоматизувати процеси та підвищити рівень комунікації між учасниками
логістичного ланцюжка. Такий інструмент стає необхідним для сучасних
підприємств, які бажають бути конкурентоспроможними та ефективно управляти
логістичними процесами.
Одним з основних чинників успішного функціонування підприємств,
організацій торгівлі та сфери послуг в сучасній економіці є скорочення витрат,
пов'язаних з доставлянням вантажів. Ця обставина визначила необхідність виділення
діяльності транспортно-експедиційних організацій як неодмінної частини
транспортно-логістичної системи. Основним завданням функціонування
транспортно-експедиційних організацій виступає пошук оптимального для
потенційного замовника варіанта доставляння вантажу на одному або більше видах
22
транспорту на основі договору транспортної експедиції, забезпечення збереження
вантажу, а також надання комплексу додаткових послуг [2].
Для підвищення ефективності транспортного бізнесу в сучасному світі
підприємці та бізнесмени використовують портативні девайси. При цьому власнику
транспортного або логістичного бізнесу необхідно розуміти основні особливості
розробки мобільних додатків для логістики та розуміти які корисні функції можуть
мати такі додатки.
Мобільні пристрої в сучасних умовах – обов’язковий інструмент в транспортній
логістиці. Такі додатки призначені розв'язувати проблеми, з якими стикається будь-
який бізнес, пов’язаний з наданням послуг перевезення вантажів, товарів,
кореспонденції тощо. Розв'язання транспортної задачі, трекінг, онлайн-зв’язок з
водієм, створення бази знань стає можливим завдяки таким розробкам.
Розглянемо обґрунтування необхідності розробки мобільних додатків для
вантажоперевезень [3].
мобільні додатки вантажоперевезень дозволяють компанії випередити
конкурентні підприємства завдяки цифровізації бізнес-процесів;
офісні операції, включаючи звітність, обговорення нюансів транспортування та
інших деталей, переносяться в смартфон, що значно спрощує доступ до потрібної
інформації;
відстеження і контроль транспорту виходять на новий рівень, завдяки чому
прозорість дій всього залученого персоналу істотно підвищується;
адміністратори, працівники та клієнти отримують єдиний онлайн-простір, який
дозволяє контролювати бізнес-процеси набагато ефективніше;
додаток дозволяє аналізувати потреби клієнтів в real-time режимі та адаптувати
дії компанії відповідно до отриманих даних.
Види мобільних додатків для логістики:
1. Додатки, орієнтовані на документообіг. Вони дозволять транспортним
сервісам оптимізувати обробку документації, що стосується вантажоперевезень, і
підвищити ефективність виконання певних бізнес-задач.
23
2. Додатки для диспетчерів. Такі додатки забезпечать диспетчерам кращу
взаємодію з водіями та дозволять їм швидше відстежувати зміни в замовленнях.
3. Додатки для контролю водіїв. Додатки допоможуть компаніями підвищити
якість послуг завдяки виявленню малопродуктивних співробітників, які відхиляються
від запланованих маршрутів або витрачають занадто багато палива.
4. Додатки для пошуку оптимального маршруту. Ці додатки аналізують доступні
водіям дороги з урахуванням різних факторів на кшталт необхідного часу,
транспортних пробок і дорожніх подій.
5. Додатки для вантажних брокерів. Додатки дозволяють їм регулювати всі
процеси, що стосуються завантаження транспортних засобів, а також відповідної
документації.
6. Додатки для складського обліку. Додатки допомагають транспортним
компаніям оптимізувати та прискорити пошук перевезеної продукції, а також процеси
навантаження і розвантаження автомобілів.
Особливості додатку для транспортної галузі.
Мобільний додаток і транспорт, контрольований таким сервісом, отримує ряд
вагомих переваг, які спрощують роботу співробітників та клієнтський досвід [3]:
клієнти зможуть підбирати транспортні засоби та визначати витрати на
перевезення заздалегідь завдяки зручній функції мобільного сервісу;
контролювання всіх автомобілів, включаючи інформацію про їх завантаженість
та технічний стан, буде здійснюватися зі смартфона;
відстежуючи розташування водіїв в real-time режимі, клієнти зможуть бачити,
чи дотримуються співробітники вірного маршруту і коректного графіка доставляння
вантажу;
адміністратори зможуть керувати основними бізнес-процесами, включаючи
формування документів, проведення платежів і комунікацію зі співробітниками, за
допомогою простої панелі додатку;
клієнти також будуть отримувати вичерпні дані про виконання замовлень за
рахунок простого функціонала;
зворотній зв'язок із логістами;
24
водії зможуть оптимізувати свою роботу та стежити за станом транспортного
засобу прямо через інтерфейс програми.
1.2.1 Місце логістичних додатків в цифровій екосистемі. Логістичні додатки
займають важливе місце в цифровій екосистемі, оскільки вони сприяють
автоматизації та оптимізації логістичних процесів. Вони входять в склад
інформаційно-комунікаційних технологій (ІКТ), які використовуються для
ефективного управління логістичними операціями.
Логістичні додатки дозволяють збирати, обробляти та аналізувати великий
обсяг даних, пов'язаних з вантажами, маршрутами, складами, транспортом та іншими
складовими логістичного ланцюжка. Вони надають можливість в реальному часі
відстежувати рух вантажів, контролювати запаси, планувати маршрути,
координувати дії між учасниками логістичного процесу.
Цифрові логістичні додатки сприяють покращенню ефективності, зниженню
витрат та підвищенню якості логістичних послуг. Вони дозволяють здійснювати
швидку обробку та передачу інформації, спрощують комунікацію між учасниками
логістичного ланцюжка, забезпечують автоматизоване управління процесами.
Логістичні додатки займають важливе місце в цифровій екосистемі, що
постійно розвивається. Вони виконують ключову роль у поліпшенні ефективності та
оптимізації логістичних процесів на різних етапах постачального ланцюга.
Переваги логістичних додатків полягають у їх здатності забезпечити швидкий
та зручний обмін інформацією між усіма учасниками логістичного ланцюга. Вони
дозволяють відстежувати рух товарів, контролювати складський запас, планувати
маршрути доставки та використання транспорту, а також спілкуватися з клієнтами та
партнерами. Цифрові логістичні додатки також надають доступ до різноманітних
аналітичних інструментів, що дозволяють здійснювати прогнозування попиту,
виявляти тенденції ринку, аналізувати ефективність процесів та знаходити шляхи для
їх вдосконалення.
В сучасному світі, де швидкість, точність та прозорість є ключовими факторами
успіху, логістичні додатки допомагають підприємствам досягати конкурентних
переваг. Вони сприяють автоматизації та оптимізації процесів, забезпечують
25
оперативний обмін даними та спрощують взаємодію між учасниками постачального
ланцюга.
Отже, логістичні додатки є важливим інструментом в цифровій екосистемі,
який допомагає підприємствам покращити ефективність своїх логістичних процесів,
зменшити витрати, підвищити рівень обслуговування та зайняти конкурентні позиції
на ринку. Вони стають невід'ємною частиною сучасного логістичного управління та
сприяють досягненню стратегічних цілей підприємств.
Логістичні додатки відіграють важливу роль у цифровій екосистемі, яка є
комплексною системою взаємодії між різними суб'єктами, технологіями та
платформами. Цифрова екосистема у сфері логістики включає різноманітні додатки,
програми та онлайн-платформи, що спрямовані на покращення логістичних процесів,
забезпечення ефективності та оптимізації управління ланцюгом постачання.
Логістичні додатки займають центральне місце в цифровій екосистемі, оскільки
вони дозволяють забезпечити зручний доступ до інформації, автоматизувати процеси
та виконувати різноманітні функції, що допомагають в ефективному управлінні
логістичними операціями. Наприклад, такі додатки можуть забезпечувати моніторинг
та відстеження вантажів, планування маршрутів, управління запасами, координацію
дій між різними учасниками логістичного процесу, аналіз даних та прийняття рішень.
В цифровій екосистемі логістичних додатків важливою є їх інтеграція з іншими
технологіями та платформами. Наприклад, логістичний додаток може бути
пов'язаний з системами управління складом, електронними ринками, системами
транспорту, системами електронної комерції та іншими. Це дозволяє створити
комплексну цифрову інфраструктуру, яка забезпечує ефективну взаємодію між
різними ланками логістичного ланцюга та забезпечує оптимальні умови для
виконання логістичних операцій.
Таким чином, логістичні додатки відіграють важливу роль у цифровій
екосистемі, сприяючи покращенню координації, ефективності та оптимізації
логістичних процесів. Вони стають необхідним інструментом для підприємств, які
бажають досягти конкурентних переваг і просунутися вперед у сучасному світі
логістики.
26
Додаток для транспортної компанії – це найчастіше елемент TMS (Transport
Management System), яка використовується в бізнесі. Завдання TMS-додатку – надати
водіям та диспетчерам основні інструменти для функціонування та управління
ланцюжками постачання.
Розглянемо базові завдання, які вирішують додатки для транспортної логістики.
Управління автопарком. Моніторинг, контроль та гнучке управління парком
транспорту через централізовану IT-систему.
Оптимізація процесів на складах. Програмне забезпечення для складів
допомагає вести базу даних щодо наявних запасів. Крім того, автоматизація
допомагає побудувати крос-докінг.
Логістика останньої милі. Додатки незамінні у системі доставляння товарів
безпосередньо до клієнта. Успішний додаток кур’єрської служби допомагає
покращувати імідж та клієнтський досвід користувачів.
Софт для контролю маршрутів. Такі додатки оперативно надають дані
стосовно поточних маршрутів та доставляння вантажів. Це передбачає, що сервіси
можуть відстежувати місце перебування та переміщення водіїв у режимі реального
часу.
Окремо можна говорити про сервісні додатки для користувачів послуг, які
дозволяють формувати транспортні замовлення, відстежувати їх статус, спілкуватись
зі службою підтримки тощо.
Основні підходи про технічну сторону створення софту для логістики.
Розробка додатку. Передбачає створення продукту під конкретні операційні
системи – перш за все мобільні. Додаток пишеться на спеціалізованих мовах і
фреймворках. Зокрема для iOS використовують Swift та Objective-C, а для Android –
Kotlin та Java.
Розробка кросплатформного додатку. Передбачає побудову додатку на
універсальних інструментах, тобто додаток буде працювати як під iOS, так і під
Android. Сучасний ринок пропонує фреймворки для розробки кросплатформних
сервісів – Flutter, React Native, Xamarin тощо.
27
У кожного з підходів є переваги та недоліки. Кросплатформний додаток,
зазвичай, набагато рентабельніший з точки зору «ціна/якість». Однак, деякі
специфічні функції та важливі для логістики можливості набагато краще працюють в
нативній розробці. Якщо треба в режимі реального часу слідкувати за рухом сотень,
або навіть тисяч машин чи кур’єрів, то нативний додаток, зазвичай, буде працювати
швидше і стабільніше.
1.2.2 Вимоги, яким повинен відповідати мобільний додаток. З одного боку,
такий інструмент має увібрати в себе складний функціонал логістичного
менеджменту, бути швидким стабільним і надійним, оновлювати ключову
інформацію в реальному часі. З іншого – він має бути зручним та привабливим, аби
користувачі, що звикли до довершених інтерфейсів Google та Apple, хотіли ним
користуватися.
В цілому, додатки мають відповідати двом ключовим вимогам:
1. Оперативність. Логістика завжди обмежена в часі, тому не можна гаяти
жодної секунди. У галузі вантажоперевезень кожен може зіткнутися з поломками
транспорту, заторами на дорогах, страйками працівників, надзвичайними
обставинами та погодними умовами. Крім того, існує термін придатності товарів,
принцип сусідства вантажів та безліч інших питань. Всі ці фактори впливають на час
відправлення та доставляння вантажу. Успішний додаток працює на оперативність,
а не проти неї – через доступні інструменти оптимізації маршрутів, електронний
документообіг, зручні інструменти зв’язку з водіями, диспетчерами та клієнтами,
через моніторинг відвантажень та рух транспорту в реальному часі.
2. Юзабіліті. Ніколи не можна забувати, що додаток – це «вікно», через яке
працюють люди на місцях – водії, диспетчери, контрагенти, клієнти. Цей інструмент
має бути зручним і абсолютно зрозумілим для кожного користувача. Понад те, він
має бути естетичним, щоб ним хотілося користуватися. Відомі приклади того, як
працівники транспортних компаній просто уникали користування логістичним
софтом, навіть якщо він дає непоганий функціонал і теоретично спрощує роботу.
Причина банальна – неактуальний дизайн, незручний інтерфейс. Юзабіліті будь-
28
якого продукту має відповідати високим стандартам – це запорука його успішного
впровадження в бізнес. Розглянемо й інші вимоги для додатку [3].
Додаток як засіб безпеки.
Успішність логістики залежить від багатьох факторів. Стан здоров'я
працівників, травматизм на складах й навіть стан гальм у вантажівці – все це впливає
на доставлення. Гарний логістичний додаток може дати декілька інструментів для
безпеки – на додачу до свого ключового функціоналу.
Захист життя та здоров’я. Чим більше співробітники працюють, тим вищими
будуть ризики їх хвороби чи виробничого травматизму. Для запобігання цьому у
логістичний додаток можна додати, наприклад, функціонал фітнес-трекерів. Сьогодні
навіть бюджетні фітнес-браслети дають можливість знімати базові фізичні метрики
та слідкувати за пульсом та тиском водія. Якщо стан здоров’я людини різко
погіршується, або вона засинає за кермом, то система сповістить про це миттєво.
Безпека на складі. Для захисту складських приміщень можна використати
інтернет речей. Це ефективний шлях моніторити фізичні умови на складі (такі, як
рівень температури та вологості всередині складських приміщень), запобігти
порушенню правил безпеки та проникненню сторонніх осіб. Наприклад, система
може відмовляти співробітнику в доступі в небезпечну зону, поки вона не підтвердить
в додатку, що вдягнула шолом чи респіратор.
Безпека транспорту. Додаток може працювати у зв’язці з телематичною
системою та електронним обладнанням вантажівки, аби спростити моніторинг рівня
палива, часу поїздки, маршруту та інших даних. Ця інформація потрібна не лише для
аналітики та показника ефективності, але й для запобігання аваріям.
1.2.3 Пакетні мобільні сервіси для логістики. Пакетні мобільні сервіси для
логістики включають в себе додатки та програми, які надають функціонал для
управління логістичними процесами на мобільних пристроях, таких як смартфони і
планшети. Вони пропонують широкий спектр можливостей, спрощуючи роботу
логістичних спеціалістів та підприємств в цілому. Однак, як у будь-якій технології,
існують як переваги, так і недоліки пакетних мобільних сервісів для логістики.
Переваги пакетних мобільних сервісів для логістики:
29
Мобільність: завдяки мобільним додаткам, логістичні спеціалісти можуть мати
доступ до необхідної інформації та функціоналу навіть поза офісом. Це дозволяє
оперативно реагувати на зміни, контролювати процеси та вирішувати проблеми в
реальному часі.
Підвищена продуктивність: Пакетні мобільні сервіси дозволяють
автоматизувати та оптимізувати багато логістичних процесів. Вони забезпечують
швидкий доступ до даних, спрощують взаємодію між учасниками постачального
ланцюга, полегшують моніторинг та управління запасами та забезпечують ефективне
планування маршрутів та доставку.
Збільшена точність та точність: Використання мобільних сервісів дозволяє
уникнути помилок, пов'язаних з ручним введенням даних або збереженням
інформації на паперових носіях. Автоматичне оновлення даних та можливість
синхронізувати їх з центральною базою даних забезпечують більш високу точність та
достовірність інформації.
Недоліки пакетних мобільних сервісів для логістики:
Вартість та впровадження: впровадження пакетних мобільних сервісів може
бути пов'язано з певними витратами на розробку, налаштування та навчання
персоналу. Крім того, потрібно враховувати витрати на обладнання та підтримку
інфраструктури.
Безпека: з використанням мобільних пристроїв пов'язані питання щодо безпеки
даних. Важливо забезпечити захист інформації від несанкціонованого доступу,
крадіжок або втрати пристрою.
Залежність від технології: якщо виникають проблеми з мобільними
пристроями, програмним забезпеченням або мережею зв'язку, це може вплинути на
продуктивність та доступність логістичної інформації.
Необхідно зазначити, що переваги та недоліки пакетних мобільних сервісів для
логістики можуть варіюватися залежно від конкретного додатку та умов його
використання. Важливо провести аналіз, оцінити потреби підприємства та визначити,
які переваги переважають над можливими недоліками перед впровадженням такого
додатку.
30
На перший погляд, купівля хмарного рішення або пакетного софту від вендора
здається кращою ідеєю, ніж розробка власного додатку.
Насправді це не завжди так, адже необхідно зважати на низку переваг та
недоліків готових рішень. Розглянемо їх детальніше [3].
Переваги готових рішень:
1. Час. Можна запустити платформу за лічені дні, оскільки здійснюється
купівля вже готового продукту.
2. Безліч функцій та інтеграцій. Новітні розробки мають всі необхідні функції,
а також аналітику, можливості моніторингу та планування.
3. Мінімальні інвестиції на старті. Не потрібно вкладатися у розробку, хоча
інтеграція й може коштувати значних коштів. Звісно, хмарний SaaS-сервіс, зазвичай,
можна запустити з мінімальними витратами.
Недоліки готових рішень:
1. Налаштування. Попри безліч корисних функцій, доведеться підлаштовувати
обрану систему під власні потреби. При тому додавання нових функцій буде
проблематичним, або навіть неможливим.
2. Витрати. Впровадження готової розробки теж коштує грошей. Перш ніж
купувати, варто підрахувати рентабельність такої інвестиції, незалежно від того, що
це одноразова чи щомісячна виплата. Альтернативою цього є розробка мобільного
рішення спеціально для власного бізнесу, яке буде містити лише потрібний
функціонал та технології.
Переваги та недоліки власної розробки.
Водночас розробка мобільного додатку під власне технічне завдання має свої
переваги та недоліки. Розгляньмо їх детально.
Переваги власної розробки:
1. Функціональність. Кастомні логістичні додатки можна забезпечити будь-
яким функціоналом, розвивати в будь-якому напрямку. Такий додаток буде містити
лише потрібні функції.
31
2. Простота розвитку. До системи легко додавати нові будь-які функції та коли
завгодно. Крім того, якщо частина функціонала стане непотрібною, її завжди можна
прибрати.
3. Масштабування бізнесу. Наприклад, у разі готового рішення компанія
нерідко сплачує не лише за використання системи, але й за кожну особу чи
вантажівку, яка підключена до системи. З власними мобільним рішенням цих
видатків немає.
4. Незалежність. Маючи власний додаток, кожен сам вирішує як йому
працювати. Натомість обране готове рішення залежить від компанії-вендора. Якщо
вона закриється, то доведеться терміново шукати альтернативу.
Кастомне рішення має певні недоліки:
1. Час для розробки. Так, на етапі створення доведеться витратити певний час,
аби отримати мобільний додаток своєї мрії. При цьому також необхідно буде
закріпити за розробкою відповідального менеджера, який слідкуватиме за перебігом
робіт та консультуватиме розробників.
2. Виправлення помилок. Якщо користувач оперує власною платформою, то уся
відповідальність за стабільність та розвиток системи покладається на нього.
Фактично, йому потрібно буде сформувати власний штат розробників, або заручитись
допомогою надійного діджитал-партнера.
1.2.4 Етапи розробки мобільного додатку. Розробка мобільного додатку
включає кілька етапів, які допомагають забезпечити успішну реалізацію проекту.
Основні етапи розробки мобільного додатку включають:
Планування: на цьому етапі визначаються цілі та об'єктиви додатку, вивчаються
потреби користувачів, аналізується конкурентне оточення та складається загальний
план розробки.
Проектування і дизайн: на цьому етапі визначається структура додатку, його
функціональні можливості та інтерфейс. Розробляється прототип, що демонструє
взаємодію користувача з додатком.
32
Розробка функціоналу: на цьому етапі виконується програмування додатку,
реалізація його основних функцій та модулів. Розробляються серверні та клієнтські
компоненти додатку.
Тестування: після завершення розробки проводяться різні види тестування, щоб
виявити та виправити помилки та дефекти. Виконується тестування
функціональності, взаємодії, продуктивності та безпеки додатку.
Реліз та розгортання: після успішного тестування додаток готовий до релізу.
Він розгортається на мобільних платформах (App Store, Google Play) або
розповсюджується через інші канали. Розробники забезпечують підтримку та
оновлення додатку.
Підтримка та вдосконалення: після релізу додаток потребує постійної
підтримки та вдосконалення. За допомогою зворотного зв'язку від користувачів
збираються відгуки та пропозиції для поліпшення додатку, виконуються оновлення
та додавання нових функцій.
Важливо враховувати, що етапи розробки мобільного додатку можуть
змінюватися в залежності від конкретних вимог та особливостей проекту. Правильне
планування, дизайн, програмування, тестування та підтримка грають важливу роль у
створенні успішного мобільного додатку.
Мобільна платформа може принести транспортній логістиці істотні дивіденди,
якщо відповідально підійти до розробки додатку для такого бізнесу. Потрібно
розуміти всі нюанси та особливості створення подібних додатків. Завдяки цьому
можливо реалізувати в додатку абсолютно всі необхідні функції для ефективної
роботи водіїв, диспетчерів, вантажовідправників та замовників які безпосередньо
залежать від якісної та швидкісної доставляння вантажу.
Коротко розглянемо етапи розробки мобільного додатку [3].
1) Аналітика.
Перш ніж розпочинати реалізацію проекту, аналізуються конкурентні мобільні
додатки з транспортної логістики та визначаються майбутні завдання відповідно до
побажань замовника.
2) Проектування.
33
Зібравши інформацію про цільовий ринок, команда проектувальників формує
завдання для дизайнерів і програмістів. Як результат, створюється повне технічне
завдання, яке узгоджується з замовником.
3) Дизайн.
Візуальна складова програми грає величезну роль, завжди реалізуються з
думкою про якісний користувацький досвід. Надалі прототип демонструється
замовнику, обговорюються всі необхідні нюанси.
4) Розробка.
На цій стадії всі затверджені ідеї реалізуються в форматі коду. Після цього,
тестується готовий додаток, намагаючись знайти в ньому проблеми та вирішити їх ще
до завантаження.
Тому, аналізуючи різні вже існуючі додатки з транспортної логістики, важливо
розуміти що робота професійного водія дуже цікава, хоч і пов'язана з багатьма
труднощами. Відсутність гарного паркування на дорозі, обмеження руху вантажівок
або брак доступу до вантажної біржі можуть сильно ускладнити життя далекобійника.
На щастя, з'являється все більше мобільних програм, які полегшують їм життя.
Для того, щоб визначитися з тим, як саме буде виглядати власний мобільний
додаток з транспортної логістики, необхідно вивчити існуючі аналоги. Для аналізу
було обрано декілька додатків з відповідною тематикою і призначенням, детальний
аналіз яких представлено далі.
1.3 Порівняльний аналіз існуючих мобільних додатків з транспортної
логістики
1.3.1 Аналіз додатку «TransParking». Першим розглянемо мобільний додаток
«TransParking», проаналізувавши його дизайн та функціонал [4].
Додаток «TransParking» знаходиться за адресою:
https://www.trans.eu/ua/blog/tfc/5-dodatkiv-dlia-pereviznyka/. Головна сторінка додатку
«TransParking» представлена на рис. 1.1.
34
Рисунок 1.1 – Головна сторінка додатку «TransParking»
«TransParking» – це безкоштовний додаток, який за лічені секунди показує
найближчі паркінги для вантажних автомобілів.
Кожен водій працює по сценарію тахографа, який вимагає перерви. Водій не
знає, чи зможе повечеряти, прийняти душ або скористатися Інтернетом на наступній
стоянці. Насправді він навіть не знає, коли на маршруті з'явиться місце для
паркування і чи будуть вільні місця. Тим часом тахограф продовжує безжально
цокати – так само як безжально виписуються штрафи за перевищення робочого часу
водія. А штрафи за порушення дозволеного часу за кермом неабиякі: нерідкі випадки
втрати дуже великих грошей.
«TransParking» – це додаток, який розв'язує проблему доступу паркування для
вантажівок. Він дозволяє шукати безкоштовні паркування в радіусі 50 км та за
вказаним маршрутом. Додаток показує понад 33 000 паркувальних місць по всій
Європі, ретельно проаналізованих та перевірених. Широкі фільтри є великою його
перевагою. Користувач може знайти саме те паркування, яке його цікавить: стоянку з
моніторингом або сторожем, з рестораном, душем і доступом до Інтернету або
розташовану на вибраній заправній станції. Коли водій під'їжджає до паркування, він
може зарезервувати місце. Завдяки цьому додаток не дозволяє людям резервувати
місця "про запас" і надає реальні дані про заповнення конкретного паркування.
«TransParking» – додаток для пошуку паркування з найвищим рейтингом: він
має 4,5/5 зірок у магазині Google Play.
Переваги додатку «TransParking»:
35
1. Зручність використання: додаток має простий та зрозумілий інтерфейс, який
дозволяє користувачам легко знаходити й бронювати місце для паркування для своєї
вантажівки.
2. Широке охоплення: додаток надає інформацію про паркувальні місця для
вантажівок у різних регіонах, що робить його корисним інструментом для водіїв
вантажівок, що працюють на міжнародних маршрутах.
3. Економія часу та засобів: додаток дозволяє водіям вантажівок заздалегідь
забронювати місце для паркування, що дозволяє їм економити час і уникнути
додаткових витрат на пошук паркування.
4. Відгуки та рейтинги: додаток надає відгуки та рейтинги інших користувачів,
що допомагає водіям вантажівок вибирати найбільш слушні місця для паркування та
уникати проблемних місць.
Недоліки додатку «TransParking»:
1. Обмежене охоплення: програма може бути не корисною для водіїв
вантажівок, що працюють у регіонах, де немає підтримки «TransParking».
2. Не завжди точна інформація: інформація про наявність місць для паркування
в додатку може бути не завжди точною або актуальною, оскільки вона може
змінюватися з часом.
3. Потенційні проблеми з бронюванням: можуть виникнути проблеми з
бронюванням місця для паркування, такі як затримки або скасування бронювання, що
може призвести до додаткових витрат на пошук паркування.
1.3.2 Аналіз додатку «Bans For Trucks». Другим в роботі проаналізовано
додаток з транспортної логістики «Bans For Trucks» [4, 5]. Додаток «Bans For Trucks»
знаходиться за адресою: https://trafficban.com/. Головна сторінка додатку «Bans For
Trucks» представлена на рис. 1.2.
Додаток «Bans For Trucks» – це перевірка тимчасових обмежень руху в Європі.
Звісно, що час має вирішальне значення для водіїв за багатьма параметрами.
Один із них – необхідність доставляння вантажу вчасно. Затримки в доставці є однією
з найпоширеніших причин суперечок між клієнтом та перевізником, адже саме
останній несе відповідальність за своєчасну доставляння товару.
36
Рисунок 1.2 – Головна сторінка додатку «Bans For Trucks»
Однак, запізнення з доставлянням не завжди пов'язане із поганими намірами
водія. Дуже часто це пов'язано із зовнішніми факторами, такими як погана погода або
обмеження руху вантажівок. Останні можуть бути особливо несподіваними, якщо
вони раптово з'являються на цій ділянці дороги.
«Bans For Trucks» – ще один високо оцінений додаток у своїй категорії. Він дає
огляд тимчасових та екологічних обмежень на рух вантажівок за певним маршрутом
у 40 країнах Європи та Азії та дозволяє детально проаналізувати ту чи іншу заборону
(наприклад, коли і де вона діє, чи поширюється вона на всі транспортні засоби чи
тільки на ті, які перевозять небезпечні вантажі або понад певний тоннаж). Додаток
також можна використовувати як планувальник маршрутів: з ним можна розрахувати,
коли вам потрібно виїхати, щоб прибути на місце розвантаження у певний час, і у час
прибуття на місце, якщо виїхати у вибраний час. Програма також покаже
альтернативні маршрути через різні країни.
Переваги додатку «Bans For Trucks»:
1. Зручність використання: додаток має простий та зрозумілий інтерфейс, що
дозволяє користувачам легко знайти інформацію про дорожні обмеження для
вантажівок.
37
2. Безкоштовність: сайт надає інформацію про дорожні обмеження
безкоштовно, без реєстрації або підписки.
3. Широке охоплення: додаток надає інформацію про дорожні обмеження для
вантажівок у більш, ніж 25 країнам Європи, що робить його корисним інструментом
для водіїв вантажівок, що працюють на міжнародних маршрутах.
Недоліки додатку «Bans For Trucks»:
1. Обмежена інформація: додаток надає інформацію лише про дорожні
обмеження для вантажівок, але не надає іншу інформацію, яка може бути корисною
для водіїв вантажівок, такою як місця для відпочинку та заправки.
2. Обмежене охоплення: додаток покриває лише Європу, що робить його не
корисним для водіїв вантажівок, що працюють в інших регіонах світу.
3. Не завжди точна інформація: інформація на «Bans For Trucks» може бути не
завжди точною чи актуальною, оскільки вона може змінюватись з часом, і додаток не
завжди оновлює свою інформацію у реальному часі. Тому водії вантажівок завжди
повинні перевіряти інформацію на інших джерелах перед тим, як приймати рішення
на основі інформації, отриманої на «Bans For Trucks.
1.3.3 Аналіз додатку «Loads2GO!». Наступним в роботі проаналізовано
додаток з транспортної логістики «Loads2GO» [4, 6]. Додаток «Loads2GO!»
знаходиться за адресою: http://www.juliebender.com. Головна сторінка додатку
«Loads2GO» представлена на рис. 1.3.
Додаток з транспортної логістики «Loads2GO» – це пошук вантажів, коли і де
кому зручно. Багато транспортних компаній працюють поодинці. Це має свої
переваги, але водночас одна людина відповідає за всі види діяльності, які у великих
компаніях розподілені між кількома співробітниками. Однією з таких завдань, вкрай
важливої підтримки фінансової ліквідності перевізника, є пошук вантажних
пропозицій. Віддаючи повну справедливість диспетчерам, чию роботу не псує брак
часу, не можна заперечувати, що доступ до комп'ютера значно полегшує пошук
замовлень на перевезення. Принаймні так було донедавна. «Loads2GO» – це додаток,
який робить перевізника повністю незалежним щодо прийому замовлень, надаючи
йому доступ до всіх вантажів з платформи Trans.eu у його телефоні.
38
Рисунок 1.3 – Головна сторінка додатку «Loads2GO»
Користувач може завантажити всі фільтри, раніше встановлені на Платформі.
Завдяки цьому йому не доведеться вказувати деталі замовлення щоразу при активації
програми. Що важливо, фільтри, визначені на одному пристрої (наприклад, на
комп'ютері) автоматично зберігаються на іншому (наприклад, на смартфоні). Окрім
біржі, «Loads2GO» також підтримує замовлення постійних клієнтів. Кожна
пропозиція – як біржова, так і приватна може бути предметом переговорів (якщо
замовник припускає таку можливість), а з самим замовником можна зв'язатися через
чат. Повідомлення роблять пошук замовлень простішим і зручнішим: як тільки
перевізник вкаже, які вантажі його цікавлять, він отримає повідомлення, навіть якщо
програма не відкрита. Розглянемо переваги та недоліки додатку «Loads2GO».
Переваги додатку «Loads2GO!»:
1. Зручність використання: програма має простий і зрозумілий інтерфейс, який
дозволяє користувачам легко знаходити вантажі та перевізників для своїх
транспортних компаній.
2. Широкий вибір вантажів: програма надає доступ до широкого вибору
вантажів, що робить його корисним інструментом для транспортних компаній, які
шукають нових клієнтів та замовлення.
39
3. Економія часу та засобів: додаток дозволяє транспортним компаніям швидко
знаходити нові замовлення та клієнтів, що дозволяє їм економити час та гроші на
маркетингу та пошуку нових клієнтів.
4. Безпека та зручність оплати: додаток забезпечує безпеку та зручність оплати
за послуги перевезень, що дозволяє транспортним компаніям та водіям вантажівок
зручно та безпечно проводити бізнес.
Недоліки додатку «Loads2GO!»:
1. Обмежений охоплення: програма може бути не корисною для транспортних
компаній та водіїв вантажівок, що працюють у регіонах, де немає підтримки
Loads2GO!
2. Конкуренція: додаток має безліч конкурентів на ринку пошуку вантажів та
перевізників, що може знизити ефективність використання програми для деяких
транспортних компаній.
3. Не завжди точна інформація: інформація про доступні вантажі та перевізники
у додатку може бути не завжди точною або актуальною, оскільки вона може
змінюватися з часом.
1.3.4 Аналіз додатку «TransTask». Також в кваліфікаційні роботі бакалавра
проаналізовано додаток з транспортної логістики «TransTask» [4, 7]. Додаток
«TransTask» знаходиться за адресою: http://www.charredwooduk.com.
«TransTask» – це додаток з транспортної логістики для використання
моніторингу на транспорті без телематики. Вимогою до клієнта є відстежувати хід
виконання замовлення практично стала нормою. У великих компаніях телематика є
стандартом, але для невеликих компаній витрати на неї часто виявляються непомірно
високими. Більше того, спілкування по телефону або SMS не завжди таке ефективне,
як хотілося б диспетчеру або водієві.
Розглянемо, як повідомити про хід виконання транспортного замовлення без
інвестицій у дорогі телематичні пристрої та стомлюючого обміну повідомленнями
завдяки «TransTask». Це стало можливим завдяки інструменту, який потребує
встановлення лише на смартфон. Головна сторінка додатку «TransTask»
представлена на рис. 1.4.
40
Рисунок 1.4 – Головна сторінка додатку «TransTask»
Водій може бачити у додатку деталі кожного замовлення, до якого він
приписаний (диспетчером), наприклад, дату та місце навантаження чи
розвантаження. Якщо в дорозі виникли проблеми, він може сигналізувати про них,
встановивши відповідний статус, а після завершення замовлення надсилає
підтвердження через програму.
Переваги додатку «TransTask»:
1. Зручність використання: програма має простий і зрозумілий інтерфейс, який
дозволяє користувачам легко створювати, призначати та відстежувати завдання та
замовлення.
2. Оптимізація процесів: програма допомагає оптимізувати процеси в
транспортних компаніях, підвищуючи ефективність та знижуючи витрати на
керування замовленнями та завданнями.
3. Легкість впровадження: програма легко інтегрується з іншими системами та
дозволяє швидко впровадити його в роботу транспортної компанії.
4. Оповіщення та звіти: програма дозволяє надсилати повідомлення та
отримувати звіти про виконання завдань та замовлень, що підвищує прозорість та
контроль у роботі транспортної компанії.
Недоліки додатку «TransTask»:
41
1. Обмежений функціонал: програма може бути обмеженою у функціоналі для
деяких транспортних компаній, які потребують ширшого набору інструментів та
функцій.
2. Вартість: програма може мати високу вартість у використанні для деяких
транспортних компаній, особливо для малих бізнесів.
3. Потрібне навчання: для ефективного використання програми потрібне
навчання та підготовка персоналу, що може вимагати додаткових ресурсів та часу для
транспортної компанії.
1.3.5 Аналіз додатку «ICE - In Case of Emergency». Останнім в роботі
проаналізовано додаток з транспортної логістики «ICE - In Case of Emergency» [4, 8].
Додаток «ICE - In Case of Emergency» знаходиться за адресою: http://icecontact.com/.
«ICE - In Case of Emergency» – це додаток для iPhone/iPod, який відстежує
інформацію людей про невідкладну медичну допомогу ICE. Це допоможе кожному
упорядкувати особисту медичну інформацію, щоб відстежувати власні контакти
екстреної медичної допомоги, контакти лікарів, інформацію про страхування, ваші
алергії/реакції, ваші ліки, захворювання, групу крові, записи про
вакцинацію/імунізацію та інші важливі медичні дані. Додаток зберігає екстрену
медичну інформацію. Головна сторінка мобільного додатку «ICE - In Case of
Emergency» (програми) представлена на рис. 1.5.
Рисунок 1.5 – Головна сторінка додатку «ICE - In Case of Emergency»
42
«ICE - In Case of Emergency» – це програма, яка дозволяє зберігати інформацію
про стан здоров'я користувача, про його приймання ліків, перенесені захворювання,
алергію або групу крові. Крім особистих даних, варто ввести контактні дані своїх
близьких. Завдяки можливості перегляду програми навіть із заблокованого телефону,
екстрені служби можуть отримати інформацію, необхідну для порятунку життя та
здоров'я, та зв'язатися з близькими людини, яка потрапила в аварію.
Варто зазначити, що для транспортної логістики, існують деякі програми, які
полегшують життя водія, а інші можуть його врятувати. Можна впевнено сказати, що
робота професійного водія – це заняття з високим рівнем ризику. Це стосується не
тільки потенційних наслідків тривалого сидіння, але й, можливо, насамперед до
нещасних випадків на дорозі. А вони залежать не лише від самого водія, а й від інших
учасників дорожнього руху та поганих погодних умов.
Ця програма являє собою набір декількох корисних інструментів, основні
функції призначені для надзвичайних ситуацій.
– Інформація про ICE: три ICE-контакти, на яких можна здійснювати прямий
набір, не розблоковуючи телефон. Також інформація про профіль користувача,
абсолютно безкоштовна для редагування тексту.
– ICE Auto Alarm: якщо користувач на самоті і трапляється щось серйозне, сам
він не може викликати допомогу, тоді ця програма викликає допомогу по телефону.
Таким чином, «ICE - In Case of Emergency» – це одна з тих програм, яку,
зазвичай, бажано нікому не використовувати, але її безумовно варто мати у своєму
телефоні.
Переваги «ICE - In Case of Emergency»:
1. Швидкий доступ до важливої інформації: програма дозволяє швидко
отримати доступ до важливих контактів для зв'язку у разі надзвичайних ситуацій.
2. Легкість використання: програма має простий і зрозумілий інтерфейс, що
робить його легким у використанні.
3. Можливість додавання медичної інформації: додаток також дозволяє
додавати медичну інформацію, таку як група крові, алергії, медикаменти тощо, що
може бути корисним у разі потреби медичної допомоги.
43
4. Безпека: програма може бути захищена паролем або Touch ID, що робить
збережену інформацію доступною лише для користувача.
Недоліки «ICE - In Case of Emergency»:
1. Обмежений функціонал: програма може бути обмеженою у функціоналі для
деяких користувачів, які можуть шукати ширший набір інструментів та функцій.
2. Необхідність актуалізації інформації: для ефективного використання
програми необхідно оновлювати та актуалізувати збережену інформацію, що може
вимагати додаткових зусиль та часу.
3. Необхідність повідомлень: програма не завжди може надати інформацію про
надзвичайні ситуації, якщо користувач не налаштував повідомлення і не перевіряє
програму регулярно.
4. Необхідність збереження даних в Інтернеті: для збереження інформації в
програмі необхідний доступ до Інтернету, що може бути проблематично у разі
відсутності зв'язку або при поганій якості сигналу.
1.4 Аналіз порівнянь існуючих рішень розглянутих реалізацій
У таблиці 1.1 представлено порівняльний аналіз розглянутих сайтів, а саме:
«TransParking», «Bans For Trucks», «Loads2GO!», «TransTask», «ICE - In Case of
Emergency».
Для порівняльного аналізу додатків наведено критерії, які можна
використовувати, а саме:
Дизайн та інтерфейс: оцінка зовнішнього вигляду та зручності інтерфейсу
додатку для користувача.
Швидкість завантаження: оцінка часу, необхідної для завантаження додатку
та швидкості роботи.
Функціональність: оцінка наявності необхідних функцій та їх зручності
використання.
Безпека: оцінка заходів безпеки, що приймаються для захисту персональних
даних користувача.
44
Наявність новин та відгуків: оцінка наявності актуальних новин та відгуків
користувачів про додаток.
Вартість: оцінка вартості додатку та можливості його безкоштовного
використання.
Наявність реклами: оцінка кількості та наявності реклами у додатку.
Інтеграція з іншими додатками: Оцінка наявності можливості інтеграції з
іншими додатками та їх зручності використання додатками та їх зручності
використання.
Наявність підтримки: оцінка наявності та якості підтримки користувачів.
додатками та їх зручності використання додатками та їх зручності використання.
Наявність підтримки: оцінка наявності та якості підтримки користувачів.
Наявність оновлень: оцінка наявності та регулярності оновлень додатку.
Результати порівнянь існуючих рішень розглянутих реалізацій представлені в
табл. 1.1. У цій таблиці для порівняння додатків за різними критеріями застосовано
оцінки від «1» до «10», де «1» – найнижчий рівень, а «10» – найвищий рівень.
Таблиця 1.1 – Таблиця порівнянь існуючих рішень розглянутих реалізацій
Критерії Назви додатків
порівняння «Trans «Bans For «Loads «Trans «ICE - In Case
Parking» Trucks» 2GO!» Task» of Emergency»
Дизайн та інтерфейс 8 7 9 6 7
Швидкість
9 7 8 8 9
завантаження
Функціональність 7 8 9 6 6
Безпека 9 8 7 7 9
Наявність новин та
6 7 8 6 9
відгуків
Вартість Вільна Вільна Вільна Платна Вільна
Наявність реклами Ні Так Так Ні Ні
45
Інтеграція з іншими
7 8 6 7 8
додатками
Наявність
7 8 7 6 9
підтримки
Наявність оновлень 8 9 7 7 9
За аналізом таблиці можна зробити наступні висновки:
Щодо дизайну та інтерфейсу, найкращими оцінками користувачів є додатки
«Loads2GO!» (9/10) та «TransParking» (8/10).
Щодо швидкості завантаження, найкращі оцінки отримали додатки
«TransParking та «CE – In Case of Emergency (9/10).
Щодо функціональності, то лідерами є додатки «Loads2GO!» та «Bans For
Trucks». Вони мають найвищі оцінки (9/10 та 8/10 відповідно).
Щодо безпеки, то найвищі оцінки отримали додатки «TransParking» та «ICE -
In Case of Emergency» (9/10).
Наявність новин та відгуків про додаток найкраще реалізовано в «Bans For
Trucks», «Loads2GO!» та «ICE - In Case of Emergency».
Вартість всіх додатків безкоштовна.
Щодо наявності реклами, лише «Bans For Trucks має рекламу у своєму додатку.
Щодо інтеграції з іншими додатками, найкращі оцінки мають додатки «Bans For
Trucks та «TransTask» (8/10 та 7/10 відповідно).
Щодо наявності підтримки, найкращі оцінки отримали додатки «ICE - In Case
of Emergency» та «Bans For Trucks» (9/10 та 8/10 відповідно).
Щодо наявності оновлень, найкращі оцінки отримали додатки «Bans For Trucks,
«TransParking» та «ICE - In Case of Emergency» (9/10, 8/10 та 9/10 відповідно).
Загальний аналіз таблиці порівнянь додатків показує, що всі розглянуті додатки
мають свої переваги та недоліки.
Щодо дизайну та інтерфейсу, найкращі оцінки отримали додатки «Loads2GO!»
та «Bans For Trucks», що можуть приваблювати користувачів своїм сучасним
виглядом та добре продуманим інтерфейсом.
46
У відношенні швидкості завантаження, найкращі оцінки отримали додатки
«TransParking та «ICE - In Case of Emergency, що свідчить про їх ефективність та
зручність використання.
Функціональність додатків, згідно з проведеним порівняльним аналізом, є
достатньо високою у додатках «Loads2GO! та «Bans For Trucks».
Наскільки стосується безпеки, тут найкращі оцінки отримали додатки
«TransParking» та «ICE - In Case of Emergency», що дозволяє користувачам бути
впевненими у безпеці використання цих додатків.
Наявність новин та відгуків про додаток також відіграє важливу роль у виборі
користувачів. У цьому відношенні найкращі результати показали додатки
«Loads2GO!» та «ICE - In Case of Emergency», оскільки вони мають багато позитивних
відгуків в інтернеті.
У відношенні вартості та наявності реклами всі додатки є безкоштовними,
проте «Bans For Trucks» та «Loads2GO!» мають наявність реклам.
Щодо інтеграції з іншими додатками та підтримки користувачів, найвищі бали
отримали «Bans For Trucks» та «ICE – In Case of Emergency».
Нарешті, найкращі результати щодо оновлення показали додатки «Bans For
Trucks» та «ICE - In Case of Emergency».
Отже, при виборі найкращого додатку для користувачів, потрібно враховувати
багато критеріїв та врахувати їх важливість у відповідно до потреб та очікувань
користувачів. З таблиці порівнянь можна зробити наступні висновки:
Якщо дизайн та інтерфейс є найважливішими критеріями, то найкращим
варіантом буде «Loads2GO!, оскільки він отримав вищий бал за дизайн та інтерфейс.
Якщо швидкість завантаження та безпека є основними критеріями, то
«TransParking» буде кращим варіантом, оскільки він отримав вищі бали за ці критерії.
Якщо користувачам потрібна велика функціональність та можливості інтеграції
з іншими додатками, то найкращим варіантом буде «Bans For Trucks», оскільки він
отримав високі бали за ці критерії.
47
Якщо користувачам важливо наявність новин та відгуків про додаток, то
найкращим варіантом буде «ICE - In Case of Emergency», оскільки він отримав
найвищий бал за цей критерій.
Враховуючи всі критерії, додатки «Bans For Trucks» та «TransParking» можуть
бути відмінними варіантами для користувачів, оскільки вони отримали високі бали за
багато критеріїв та є більш універсальними у додаткових можливостях.
Зрештою, вибір найкращого додатку залежить від потреб та вимог користувача.
Тому варто зважати на всі критерії та зробити свій вибір на підставі власних переваг
і потреб.
Зважаючи на аналіз вищезгаданих додатків, можна зробити наступні висновки
про їх характеристики:
«TransParking» має зручний та простий дизайн та інтерфейс, але недостатньо
швидку та обмежену функціональність.
«Bans For Trucks» має середній рівень дизайну та інтерфейсу, але працює
повільно та містить рекламу.
«Loads2GO!» має високий рівень дизайну та інтерфейсу, працює досить швидко
та має високий рівень функціональності.
«TransTask» має простий та зручний дизайн, але обмежена функціональність та
працює повільно.
«ICE - In Case of Emergency» має простий та зручний дизайн, швидкий та
безпечний, має наявність новин та відгуків, але також має обмежену
функціональність.
Загалом вибір додатку залежить від індивідуальних потреб та вимог
користувача. Наприклад, якщо користувачеві потрібен додаток для зручного та
безпечного паркування, «TransParking» та «Loads2GO!» можуть бути відмінним
вибором. Якщо ж користувачеві потрібний додаток для аварійних ситуацій, «ICE - In
Case of Emergency» може бути найкращим вибором. У будь-якому випадку,
користувачам потрібно звернути увагу на критерії, що найбільш важливі для них та
обрати додаток, що відповідає їх потребам.
48
Проаналізувавши існуючі рішення розглянутих реалізацій, в кваліфікаційній
роботі бакалавра при розробці мобільного додатку з транспортної логістики варто
звернути увагу на такі моменти:
− додаток повинен мати простий та зрозумілий інтерфейс, щоб користувачі могли
легко знаходити потрібну інформацію та взаємодіяти з додатком без проблем;
− швидкість завантаження: додаток повинен працювати швидко та без перебоїв,
оскільки це дозволяє користувачам ефективно використовувати свою годину та
збільшує задоволення від використання додатку;
− функціональність: додаток повинен мати всі необхідні функції для виконання
різних завдань, пов'язаних з транспортною логістикою, такі як відстеження вантажів,
управління маршрутами, замовлення транспорту тощо;
− безпека: додаток повинен забезпечувати безпеку даних та транзакцій
користувачів, щоб уникнути можливих кібератак та мішечництва;
− наявність новин та відгуків: додаток повинен мати можливість отримувати
оновлення та відгуки користувачів, щоб розвиватися та вдосконалюватися з часом;
− вартість та наявність реклами: додаток може бути безкоштовним або мати
платні функції, але в будь-якому випадку повинен бути зрозумілий та прозорий щодо
вартості та наявності реклами;
− інтеграція з іншими додатками: додаток повинен мати можливість інтеграції з
іншими додатками для зручності користувачів;
− наявність підтримки та оновлень: додаток повинен мати підтримку
користувачів та регулярне оновлення.
Таким чином, при розробці додатку, що розглядається у кваліфікаційній роботі
бакалавра, необхідно дотримуватися вищезгаданих рекомендацій, а також
враховувати потреби та очікування користувачів, щоб створити зручний та
функціональний додаток, який буде успішно використовуватись у сфері транспортної
логістики.
При розробці мобільного додатку з транспортної логістики варто звернути
увагу на всі ці моменти, а також на те, як можна забезпечити максимальну зручність
та простоту використання для користувачів. Наприклад, можна використовувати
49
інтуїтивно зрозумілі елементи інтерфейсу, використовувати візуалізації для кращого
розуміння інформації та взаємодії з користувачем. Щодо швидкості завантаження,
потрібно звернути увагу на оптимізацію додатку та його ресурсів, щоб забезпечити
максимальну швидкість роботи та уникнути затримок та зависань.
Крім того, корисно провести дослідження потреб та очікувань користувачів,
щоб забезпечити максимальну відповідність додатку їх потреб та очікувань. Важливо
також забезпечити наявність зручної системи зворотного зв'язку для користувачів,
щоб вони могли поділитися своїми враженнями та пропозиціями щодо покращення
додатку.
Висновки до розділу 1
У цьому розділі було проведено дослідження предметної галузі, а саме:
структуру транспортно-логістичної системи у контексті сучасних технологій; роль
мобільних пристроїв як необхідного інструменту у транспортній логістиці; місце
логістичних додатків у цифровій екосистемі та їх вплив на ефективність транспортно-
логістичних процесів. В результаті аналізу отримано важливі висновки та
рекомендації щодо розробки мобільного додатку для транспортної логістики з метою
підвищення ефективності та зручності керування транспортними процесами.
Проведений порівняльний аналіз мобільних додатків з транспортної логістики:
«TransParking», «Bans For Trucks», «Loads2GO!», «TransTask та ICE - In Case of
Emergency». Для кожного з додатків були проаналізовані такі критерії, як: дизайн та
інтерфейс, швидкість завантаження, функціональність, безпека, наявність новин та
відгуків, вартість, наявність реклами, інтеграція з іншими додатками, наявність
підтримки та оновлення. В результаті аналізу було визначено переваги та недоліки
кожного з додатків, а також їх загальну придатність для використання у транспортній
логістиці.
Представлено таблицю порівнянь існуючих рішень та визначені головні
критерії щодо розробки мобільного додатку для транспортної логістики.
50
2 ПРОЕКТУВАННЯ ТА РОЗРОБКА МОБІЛЬНОГО ДОДАТКУ З
ТРАНСПОРТНОЇ ЛОГІСТИКИ
2.1 Опис функціонального програмного середовища для розробки
Для розробки програм для Android-телефонів зазвичай використовують Android
Studio (рис. 2.1) – це інтегроване середовище розробки (Integrated Development
Environment, IDE), створене спеціально для розробки програмного забезпечення для
платформи Android. Воно надає розробникам потужні інструменти для створення,
тестування та налагодження мобільних додатків:
https://uk.wikipedia.org/wiki/Android_Studio.
Рисунок 2.1 – Вигляд сучасної версії Android Studio
Основні функції Android Studio включають наступне:
1. Потужний редактор коду з підсвічуванням синтаксису, автодоповненням та
можливістю рефакторингу коду. Це полегшує написання якісного й ефективного коду
для нашого додатку.
2. Широкий набір інструментів, які допомагають розробникам створювати
додатки. Це включає графічний редактор інтерфейсу користувача, де можна
51
створювати і налаштовувати макети екранів, а також редактор маніфесту додатку, де
визначаються його характеристики.
3. Можливість запускати та тестувати додатки на емуляторах Android, які
можна налаштувати для різних версій операційної системи та пристроїв. Крім того,
можна підключити реальні пристрої для налагодження та тестування.
4. Потужні інструменти для налагодження (debugging) та профілювання
(profiling) додатків. З їх допомогою можна знайти й виправити помилки, а також
аналізувати продуктивність додатку для покращення його роботи.
5. Підтримує інтеграцію з популярними системами зберігання версій, такими
як Git. Це дозволяє розробникам просто керувати версіями свого коду та спілкуватися
з іншими розробниками.
Для управління версіями коду використано Git – розподілена система керування
версіями файлів та спільної роботи. Проєкт створив Лінус Торвальдс для керування
розробкою ядра Linux, а сьогодні підтримується Джуніо Хамано (англ. Junio C.
Hamano). Git є однією з найефективніших, надійних і високопродуктивних систем
керування версіями, що надає гнучкі засоби нелінійної розробки, що базуються на
відгалуженні і злитті гілок. Для забезпечення цілісності історії та стійкості до змін
заднім числом використовуються криптографічні методи, також можлива прив'язка
цифрових підписів розробників до тегів і комітів: https://uk.wikipedia.org/wiki/Git.
Основні концепції Git:
1. Репозиторій: git зберігає всю історію проєкту у репозиторії. Репозиторій
може бути локальним (розташованим на вашому комп'ютері) або віддаленим
(розташованим на сервері або хмарному сервісі). Він містить всі файли, коміти, гілки
та іншу інформацію про розробку проєкту.
2. Коміт – представляє собою зафіксований стан репозиторію в певний момент
часу. Він включає зміни, зроблені в файловій системі, такі як додавання, вилучення
або зміна файлів. Коміти зберігаються у хронологічному порядку, і вони утворюють
історію проєкту.
3. Гілки – використовуються для розділення розвитку проєкту на незалежні
лінії. Кожна гілка являє собою окремий шлях розвитку, де можна вносити зміни без
52
впливу на основну гілку (зазвичай вона називається "master" або "main"). Гілки
дозволяють розробникам працювати паралельно, експериментувати зі змінами і
об'єднувати їх зміни пізніше.
4. Злиття (Merge) і виправлення конфліктів: Злиття використовується для
об'єднання змін з однієї гілки до іншої. При злитті Git автоматично знаходить зміни,
які не конфліктують, та об'єднує їх. Однак, коли дві гілки вносять зміни до одного й
того ж рядка в одному файлі, виникає конфлікт, і його потрібно вручну вирішити.
5. Відгалуження і перемикання гілок: відгалуження дозволяє створювати нові
гілки з існуючих гілок. Ви можете створювати відгалуження для розвитку нових
функцій, виправлення помилок або проведення експериментів. Перемикання гілок
дозволяє перемикатись між різними гілками в репозиторії.
2.2 Обґрунтування вибору сучасних технологій програмування для
створення мобільного додатку
Для створення мобільного додатку з транспортної логістики у кваліфікаційній
роботі бакалавра використано такі засоби:
− Основна мова програмування – Kotlin;
− Бібліотека для HTTP-запитів – volley;
− Бібліотека для серіалізації – kotlinx-serialization-json;
− Фреймворк користувацького інтерфейсу – Jetpack Compose;
− Google Play Services (робота з картами);
Kotlin є офіційною мовою програмування для розробки Android-додатків,
підтримуваною компанією Google. Вона пропонує багато переваг, таких як
безпечність типів, спрощене управління пам'яттю і покращену продуктивність. Kotlin
також інтегрується з Java, що дає можливість використовувати наявний Java-код у
проекті.
Бібліотека Volley розроблена Google і пропонує зручний спосіб виконання
HTTP-запитів у мобільних додатках. Вона надає простий і зрозумілий інтерфейс для
53
виконання запитів і обробки відповідей. Volley також підтримує кешування даних і
обробку паралельних запитів, що робить його ефективним у використанні.
Бібліотека kotlinx.serialization-json дозволяє серіалізувати та десеріалізувати
дані у форматі JSON. Вона має зручний синтаксис і хорошу продуктивність. Оскільки
розробка мобільного додатку з транспортної логістики, ймовірно, включатиме обмін
даними з сервером у форматі JSON, використання такої бібліотеки дозволить зручно
опрацьовувати ці дані.
Jetpack Compose є сучасним фреймворком користувацького інтерфейсу для
розробки Android-додатків. Він замінює традиційний XML-підхід розробки і дозволяє
створювати користувацький інтерфейс за допомогою декларативного підходу. Jetpack
Compose пропонує багато готових компонентів і спрощує розробку і підтримку
інтерфейсу.
Робота з картами в мобільних додатках може бути зручною за допомогою
Google Play Services. Ці бібліотеки надають доступ до різних функцій, пов'язаних з
картографією, таких як відображення мап, розташування користувача, маршрутизація
тощо. Використання Google Play Services спрощує інтеграцію карт у додаток і
забезпечує доступ до надійних і актуальних картографічних сервісів.
2.3 Огляд Lardi-Trans API
Щоб не створювати ще один «велосипед» чи «колесо», було вирішено
використати вже існуючий сервіс менеджменту транспортної логістики, а саме сайт
Lardi-Trans.
Lardi-Trans є однією з найбільших онлайн-платформ в Україні, спеціалізованою
на транспортній логістиці. Вона надає послуги для перевезення вантажів,
забезпечуючи зручне спілкування та співпрацю між власниками вантажівок,
перевізниками та клієнтами. Lardi-Trans створена з метою полегшити транспортну
логістику та зробити процес перевезень більш зручним та ефективним для всіх сторін
– клієнтів і перевізників. Платформа надає доступ до великого пулу перевізників, що
54
дозволяє знайти оптимальне рішення для різних видів вантажів та потреб [https://lardi-
trans.com].
Можливості Lardi-Trans:
1. Платформа дозволяє користувачам шукати та знаходити перевізників для
перевезення своїх вантажів. Вона надає широкий вибір перевізників з різними типами
транспорту та великим географічним охопленням.
2. Клієнти можуть розміщувати замовлення на перевезення вантажів через
Lardi-Trans. Вони можуть вказати тип вантажу, розміри, вагу та маршрут перевезення.
Перевізники, і собі можуть відгукнутися на замовлення та запропонувати свої
послуги.
3. Платформа надає можливість відстежування руху вантажу під час
перевезення. Це дозволяє клієнтам бути в курсі процесу доставляння та забезпечує
більшу прозорість і контроль над перевезенням.
4. Користувачі можуть залишати відгуки та оцінки про перевізників після
завершення перевезень. Це допомагає іншим користувачам при виборі надійного та
якісного перевізника.
5. Платформа також надає можливість здійснювати фінансові угоди між
сторонами. Клієнти можуть оплачувати послуги перевізників через систему Lardi-
Trans, що спрощує фінансові взаємовідносини та забезпечує більшу безпеку угод.
Lardi-Trans надає свій API (application programming interface) – це програмний
інтерфейс програмування додатків, який надає розробникам доступ до
функціональності транспортної логістичної платформи Lardi-Trans. За допомогою
цього API, розробники можуть інтегрувати функціональність Lardi-Trans у свої
додатки або сервіси. Основні можливості API Lardi-Trans включають наступне:
− Робота з перевезеннями: API дозволяє отримувати інформацію про наявні
перевезення, створювати нові перевезення, оновлювати та скасовувати перевезення.
− Управління автомобілями та водіями: розробники можуть отримувати
інформацію про автомобілі та водіїв, керувати даними про них, створювати нові
записи та оновлювати існуючі.
55
− Отримання інформації про навантаження: доступ до даних про
навантаження, включаючи деталі, статус та маршрут.
2.4 Опис проектування та розробки мобільного додатку з транспортної
логістики
Розробка починається з визначення конкретного технічного завдання.
Розроблювальний мобільний додаток повинен мати:
– сторінку з логіном для ідентифікації користувача;
– головну сторінку, де розміщена карта з показом маршрутів та дистанції з
найближчими точками інтересу (кафе, ресторани, туалети, гральні місця, заправки
тощо);
– сторінку з вантажами, де можна переглядати поточні вантажі, редагувати та
видаляти їх; також має бути кнопка для побудови маршруту та показу його на карті
на головній сторінці;
– сторінку з налаштуваннями, де можна вийти з акаунту користувача.
Спроектована схема інтерфейсу користувача показана на рис. 2.2.
Рисунок 2.2 – Структура інтерфейсу користувача
56
Наступник кроком йде довгоочікувана розробка. Зразу слід виконати
програмну абстракцію над Google Maps API (рис. 2.3).
Рисунок 2.3 – Клас-об’єкт «GoogleDirectionsApi»
Як можна споглядати, використовується клас RequestQueue з бібліотеки volley
для створення черги обробки http-запитів. Для побудови URL використовується Java-
клас Uri. Для тестування, в разі помилки запиту, робиться вивід в консоль.
Для комунікування з Lardi-Trans через API створено спеціальну абстракцію
(рис. 2.4). Функція checkToken використовується для перевірки ідентифікатора
користувача на екрані логіну.
Рисунок 2.4 – Клас-об’єкт «LardiTransApi»
57
Приклад отримання даних з Lardi-Trans API показано на рис. 2.5.
Рисунок 2.5 – Код запиту на отримання всіх вантажів
Нарешті, прийшов час створювати користувацький інтерфейс. Для цього можна
найкраще використати активність типу «Jetpack Compose» (рис. 2.6).
Рисунок 2.6 – Додавання активності типу «Jetpack Compose» в проект
Для організації сторінок, створено спеціальний масив з переліком сторінок, як
видно на рис. 2.7. Потім цей масив використовується для створення реактивного
інтерфейсу кнопок нижньої навігації в додатку (рис. 2.8). Відображення контенту
58
вибраної (поточної) сторінки робиться за допомогою NavHost з бібліотеки
«navigation-compose» (рис. 2.9).
Рисунок 2.7 – Закодований перелік сторінок (вкладок)
Рисунок 2.8 – Код відображення нижнього меню навігації
Рисунок 2.9 – Код відображення поточної сторінки в додатку
Після того, як була налаштована навігація, прийшов час реалізації самих
сторінок. Найголовніша фіча головної сторінки – мапа.
Для того, щоб можна було побачити поточну позицію свого розумного
телефону, потрібно запитати доступ у системи до локації (рис. 2.10).
Код реалізації карти за допомогою Google API можна побачити на рис. 2.11.
59
Рисунок 2.10 – Код перевірки доступу до локації мобільного пристрою
Рисунок 2.11 – Код відображення мапи
При отриманні побудованого маршруту з Google API, повернуті дані містять
так звані «PolyLines», закодовані в рядковий формат. Ці лінії містять інформацію про
найкращий маршрут. Щоб можна було дістати точки латитуди та лонгітуди для
60
відображення ліній на карті, використано бібліотеку «android-maps-utils», яка надає
функцію «PolyUtil.decode» для виконання відповідної задачі.
Сторінка вантажів містить список вантажів. На кожний вантаж можна
натиснути та перейти до активності модифікації та перегляду детальної інформації
про вантаж з можливістю видалити його чи побудувати найкращий маршрут.
Поверхневий код відображення сторінки вантажів показано на рис. 2.12. Для
відображення дати розроблено окремий, красивий компонент «DateItem». Як видно з
рис. 2.12, також використовується компонент «CargoItem» – ще один розроблений
елемент для зручного відображення вантажів в одному списку.
Рисунок 2.12 – Код відображення сторінки вантажів
Урешті мається сенс зробити сторінку налаштувань. Вона досить проста. Код
відображення сторінки налаштувань представлено на рис. 2.13. У вказаному
технічному завданні потрібно зробити тільки кнопку виходу з акаунту користувача та
перехід на сторінку логіна. Фінальний код розробленого застосунку є в додатку Б.
61
Рисунок 2.13 – Код відображення сторінки налаштувань
Висновки до розділу 2
В цьому розділі представлено опис функціонального програмного середовища
та обґрунтовано вибір сучасних технологій Android-програмування для проєктування
і розробки мобільного додатку з транспортної логістики.
Описано предметну область та представлено проєктування Android-застосунку
з транспортної логістики з використанням Kotlin, Volley, kotlinx-serialization-json,
Jetpack Compose та Google Play Services, який було розроблено використовуючи IDE
Android Studio.
Розроблена перша версія застосунку з часом може вийти в дистрибуцію у
Google PlayMarket та розвиватися далі із землі до небес.
62
3 ТЕСТУВАННЯ МОБІЛЬНОГО ДОДАТКУ
3.1 Особливості тестування мобільного додатку
Тестування мобільних додатків (рис. 3.1) має свої особливості порівняно з
тестуванням інших видів програмного забезпечення.
Рисунок 3.1 – Варіанти тестування мобільних застосунків
Оскільки мобільні додатки призначені для роботи на різних мобільних
платформах, таких як iOS та Android, тестування вимагає врахування специфіки
кожної платформи.
Тестування в цілому відповідає загальним принципам тестування. Але також
присутній ряд особливостей, які характерні саме для тестування мобільних додатків.
Для того, щоб зрозуміти особливості тестування додатків на мобільних пристроях,
необхідно враховувати чинники, які відрізняють мобільний додаток від десктопного,
а саме: специфічні й різноманітні операційні системи для мобільних платформ, різні
конфігурації комплектувальних компонентів, функціональність таких пристроїв, як
63
комунікатори та ін. У звʼязку з цими факторами, підхід до тестування додатків на
мобільних пристроях досить сильно відрізняється від десктопного. З'являється велика
кількість додаткових нюансів та вимог, які необхідно протестувати:
https://training.qatestlab.com/blog/technical-articles/testing-mobile-devices.
Мобільні платформи мають власні вимоги та обмеження. Тестувальникам
потрібно переконатися, що додаток працює належним чином на кожній платформі, а
також забезпечити сумісність з різними версіями операційної системи.
Різні мобільні пристрої мають різні розміри екрана та роздільну здатність.
Додаток повинен відображатися на екрані правильно та коректно працювати на
різних розмірах екрана.
Мобільні пристрої мають обмежені апаратні ресурси, такі як обсяг оперативної
пам'яті та потужність процесора. Тестувальники повинні переконатися, що додаток
працює ефективно та не споживає надто багато ресурсів пристрою.
На кожній платформі може бути кілька версій операційної системи, які можуть
відрізнятися за функціональністю та можливостями. Тестувальники повинні
переконатися, що додаток працює належним чином на різних версіях операційної
системи та використовує доступні функції.
Існує широкий асортимент мобільних пристроїв з різними характеристиками та
можливостями. Тестувальники повинні переконатися, що додаток працює належним
чином на різних пристроях, включаючи популярні моделі.
Мобільні додатки можуть взаємодіяти з іншими додатками на пристрої, такими
як камера, геолокація, календар та інші. Потрібно перевірити, чи працює взаємодія з
іншими додатками коректно та безпечно.
Додатки можуть використовувати мобільний інтернет або Wi-Fi для зв'язку з
сервером чи іншими пристроями. Тестувальники повинні переконатися, що додаток
працює належним чином при різних умовах мережі, таких як погане підключення або
перемикання з однієї мережі на іншу.
Безпека є важливим аспектом мобільних додатків. Тестувальники повинні
перевірити додаток на вразливості, такі як витоки даних, недостатного захисту
інформації та можливість несанкціонованого доступу.
64
3.2 Тест-кейси перевірки працездатності застосунку
Для маєтку упевненості у створеному продукті потрібно запровадити наступні
тести.
Базові:
– логін по персональному ідентифікатору користувача – після натискання кнопки
входу відбувається перехід до головного екрана застосунку;
– на головній сторінці на карті правильно відображається поточна локація
користувача;
– в налаштуваннях кнопка виходу з акаунту працює – після натискання
відбувається перехід на екран логіну.
Сторінка вантажів:
– по натисненню кнопки «+» можна додати новий вантаж;
– додавання нового вантажу насправді відбувається – новододаний вантаж видно
в списку вантажів;
– додавання нового вантажу не відбувається при наявності не введених полів;
– функціонал відображення видалених вантажів працює;
– короткі дані вантажі у списку вантажів являється правильними.
– для вантажу будується правильний маршрут.
3.3 Ручне тестування додатку на новітніх «розумних телефонах»
Для тестування вирішено мобільного додатку з транспортної логістики
використати розумний телефон «Xiaomi Redmi Note 10 Pro» – найкращий у своєму
проявленні. Це один з популярних смартфонів, випущених компанією Xiaomi. Він був
представлений у березні 2021 року і став одним із флагманських пристроїв серії
Redmi Note 10.
Redmi Note 10 Pro має красивий дизайн зі скляною задньою панеллю і
металевою рамкою. На фронтальній панелі розміщений 6,67-дюймовий Super
AMOLED-дисплей з роздільною здатністю Full HD+. Цей дисплей підтримує частоту
оновлення 120 Гц, що робить зображення дуже плавним і різким.
65
Усередині Redmi Note 10 Pro працює потужний восьмиядерний процесор
Qualcomm Snapdragon 732G, який забезпечує швидку та ефективну продуктивність.
Процесор поєднується з 6 або 8 гігабайтами оперативної пам'яті, що дозволяє
запускати багатозадачні програми та ігри без затримок:
https://www.gsmarena.com/xiaomi_redmi_note_10_pro-10662.php. Тестування має бути
дуже приємним на цьому телефоні.
Також для тестування було застосовано телефон Google Pixel 4 – з лінійки
найкращих смартфонів з операційною системою Android – з цим не суперечить жоден
експерт: https://www.businessinsider.com/google-pixel-is-the-best-android-phone-why-
2016-10. Тестування деяких базових кейсів показано на рис. 3.2. Все працює гарно, як
треба.
Рисунок 3.2 – Тестування логіну та поточної локації телефону
66
Тестування сторінки вантажів не розчарувало – всі кейси показали результати
придатності до використання користувачем (рис. 3.3).
Рисунок 3.3 – Тестування коректності інформації та перегляду видалених вантажів
Останній штрих – це перевірити прокладку маршруту. Цей кейс також «ОК»
(рис. 3.4).
Рисунок 3.4 – Тестування перегляду вантажу та побудови найкращого маршруту
67
Висновки до розділу 3
В цьому розділі розкладено основні поняття тестування, розписано тест-кейси
для перевірки працездатності розробленого додатку. В результаті вдалося
впевнитися, що:
– логін по персональному ідентифікатору користувача працює;
– на головній сторінці на карті правильно відображається поточна локація
користувача;
– в налаштуваннях кнопка виходу з акаунту працює;
– по натисненню кнопки «+» на сторінці вантажів можна додати новий вантаж;
– додавання нового вантажу не відбувається при наявності не введених полів;
– функціонал відображення видалених вантажів працює;
– короткі дані вантажі у списку вантажів являється правильними.
– для вантажу будується правильний маршрут.
Отже, розроблений мобільний додаток з транспортної логістики готовий до
публікації в «продакшн».
68
ВИСНОВКИ
Мета кваліфікаційної роботи бакалавра досягнута, тобто в ході її виконання
було успішно досліджено предметну область транспортної логістики та розроблено
мобільний додаток з транспортної логістики. Процес дослідження включав огляд
літератури, аналіз наукових робіт та публікацій, що стосуються даної галузі. Крім
того, було проведено порівняльний аналіз існуючих мобільних додатків з
транспортною логістикою, що дало змогу визначити їх переваги та недоліки і
врахувати ці аспекти під час розробки власного додатку.
У процесі розробки був створений мобільний додаток, що включає необхідну
інформацію про транспортні ресурси, вантажі, замовлення та клієнтів. Були обрані
програмно-технічні засоби, які найкраще відповідали вимогам проекту. Завдяки
цьому, було можливо розробити мобільний додаток з транспортної логістики, який
мав інтуїтивно зрозумілий інтерфейс та функціональність для ефективного
управління транспортними ресурсами, вантажами та замовленнями.
Отриманий результат, а саме розроблений мобільний додаток, може бути
використаний в реальних умовах підприємницької діяльності, сприяючи покращенню
ефективності та економічності транспортної логістики. Він надає можливість
оптимізувати логістичні процеси, забезпечуючи швидкий та зручний доступ до
необхідної інформації, покращує управління транспортними ресурсами.
Отже, ця кваліфікаційна робота бакалавра внесла свій внесок у розвиток
транспортної логістики шляхом створення мобільного додатку, що відповідає
сучасним потребам та вимогам галузі.
Для досягнення поставленої мети в роботі було розв'язано наступні завдання:
– дослідження предметної області: було проведено аналіз та вивчення основних
аспектів транспортної логістики, включаючи процеси, методи, технології та
інструменти, що застосовуються в цій галузі.
– порівняльний аналіз існуючих мобільних додатків з транспортною логістикою:
було проаналізовано різноманітні додатки, які використовуються для оптимізації
транспортно-логістичних процесів, з метою виявлення їх переваг та недоліків.
69
– розробка мобільного додатку, яка включала необхідну інформацію про
транспортні ресурси, маршрути, вантажі, замовлення та інші важливі дані для
ефективного управління транспортною логістикою.
– вибір програмно-технічних засобів: було обрано відповідні програмно-технічні
засоби для реалізації функціоналу мобільного додатку, з урахуванням вимог проекту
та потреб користувачів.
– розробка мобільного додатку з транспортною логістикою: на основі
проведеного аналізу та розробленої бази даних було розроблено та реалізовано
мобільний додаток, який надавав користувачам можливість здійснювати ефективне
управління транспортними ресурсами, вантажами, замовленнями та спілкуванням з
клієнтами.
– завдання, поставлені перед роботою, були успішно виконані, що дозволило
досягти мети створення мобільного додатку з транспортною логістикою.
В результаті роботи розроблений мобільний додаток з транспортної логістики,
який надає користувачам зручні та ефективні інструменти для управління
транспортними ресурсами, вантажами та замовленнями. Додаток включає
функціонал, такий як розкладання маршрутів, відстеження вантажів та звітність про
перевезення вантажів за попередній період також в додатку є інформація про вантажі,
маршрути, замовлення та інші параметри.
Вибрано відповідні програмно-технічні засоби для реалізації додатку,
забезпечуючи оптимальну продуктивність та надійність роботи.
Проведене тестування додатку для переконання в його коректному
функціюванні та відповідності вимогам.
В цілому, розроблений мобільний додаток з транспортної логістики має
потенціал покращити ефективність управління транспортно-логістичними
процесами, сприяючи оптимізації витрат.
Результатом роботи є функціональний та ефективний додаток, який може бути
використаний в реальних умовах підприємницької діяльності для оптимізації
транспортно-логістичних процесів.
70
СПИСОК ВИКОРИСТАНИХ ДЖЕРЕЛ
1. Устенко М.О. Актуальність формування транспортно-логістичних систем в
умовах євроінтеграції. URL: file:///C:/Users/Admin/Downloads/aktualnist-formuvannya-
transportno-logistichnih-sistem-v-umovah-evrointegratsiyi.pdf (дата звернення:
12.01.2023).
2. Косік В.А. Інформатизація логістичного забезпечення підприємств
автотранспортної галузі. URL: (дата звернення: 02.02.2023).
3. Мобільний додаток «Bans For Trucks». URL: https://trafficban.com/ (дата
звернення: 02.02.2023).
4. Мобільний додаток «Loads2GO». URL: http://www.juliebender.com. (дата
звернення: 02.02.2023).
5. Мобільний додаток «TransTask». URL: https://transtask.ru.aptoide.com/app/ (дата
звернення: 02.02.2023).
6. Мобільний додаток «ICE - In Case of Emergency». URL: http://icecontact.com/
(дата звернення: 02.02.2023).
7. WordPress. URL: https://uk.wordpress.org/ (дата звернення: 14.01.2023).
8. The React Framework for the Web. URL: https://nextjs.org/ (дата звернення:
14.01.2023).
9. Огляд Serverless архітектури. URL: https://codeguida.com/post/1466 (дата
звернення: 14.01.2023).
10. MongoDB. URL: https://www.mongodb.com/ (дата звернення: 14.01.2023).
11. https://www.businessinsider.com/google-pixel-is-the-best-android-phone-why-
2016-10 (дата звернення: 12.05.2023)
12. https://training.qatestlab.com/blog/technical-articles/testing-mobile-devices (дата
звернення: 12.05.2023)
13. https://lardi-trans.com (дата звернення: 22.04.2023)
14. https://console.cloud.google.com/welcome?project=silver-courier-383016 (дата
звернення: 22.04.2023)
15. https://uk.wikipedia.org/wiki/Android_Studio (дата звернення: 08.04.2023)
71
16. https://www.gsmarena.com/xiaomi_redmi_note_10_pro-10662.php
(дата звернення: 08.04.2023)
72
ДОДАТОК А
Затверджую
Зав. кафедри КНСА,
______________ Юрій ТРИУС
«____»____________2023 р.
МОБІЛЬНИЙ ДОДАТОК З ТРАНСПОРТНОЇ ЛОГІСТИКИ
Специфікація 482.ЧДТУ. 31911-01
Листів 2
Розробник ____________________ Волков І.С.
Керівник ____________________ Оксамитна Л.П.
Черкаси – 2023
73
482.ЧДТУ. 31911-01
Позначення Найменування Примітка
Документація
482.ЧДТУ. 31911-01 12 01 Текст програми
482.ЧДТУ. 31911-01 34 01 Інструкція користувача
74
ДОДАТОК Б
МОБІЛЬНИЙ ДОДАТОК З ТРАНСПОРТНОЇ ЛОГІСТИКИ
Текст програми482.ЧДТУ. 31911-01 12 01
Листів 32
Розробник _____________ Волков І.С.
Черкаси – 2023
75
plugins {
id 'com.android.application' version '8.0.1' apply false
id 'com.android.library' version '8.0.1' apply false
id 'org.jetbrains.kotlin.android' version '1.8.20' apply false
id 'org.jetbrains.kotlin.plugin.serialization' version '1.8.20' apply false
id 'com.google.android.libraries.mapsplatform.secrets-gradle-plugin' version '2.0.1'
apply false
}
plugins {
id 'com.android.application'
id 'org.jetbrains.kotlin.android'
id 'org.jetbrains.kotlin.plugin.serialization'
id 'com.google.android.libraries.mapsplatform.secrets-gradle-plugin'
}
android {
namespace 'com.volkov.transport'
compileSdk 33
defaultConfig {
applicationId "com.volkov.transport"
minSdk 26
targetSdk 33
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
vectorDrawables {
useSupportLibrary true
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'),
'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}
buildFeatures {
compose true
buildConfig true
76
}
composeOptions {
kotlinCompilerExtensionVersion '1.4.6'
}
packagingOptions {
resources {
excludes += '/META-INF/{AL2.0,LGPL2.1}'
}
}
}
dependencies {
implementation 'androidx.core:core-ktx:1.10.0'
implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.5.0"
implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.6.1'
implementation 'androidx.activity:activity-compose:1.7.1'
implementation platform('androidx.compose:compose-bom:2022.10.00')
implementation 'androidx.compose.ui:ui'
implementation 'androidx.compose.ui:ui-graphics'
implementation 'androidx.compose.ui:ui-tooling-preview'
implementation 'androidx.compose.material3:material3'
implementation 'androidx.navigation:navigation-compose:2.5.3'
implementation("androidx.compose.runtime:runtime-livedata:1.4.3")
implementation "io.github.vanpra.compose-material-dialogs:datetime:0.9.0"
implementation 'com.google.maps.android:maps-compose:2.11.4'
implementation 'com.google.maps.android:android-maps-utils:0.4'
implementation 'com.google.android.gms:play-services-maps:18.1.0'
implementation 'com.google.android.gms:play-services-location:21.0.1'
implementation 'com.android.volley:volley:1.2.1'
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
androidTestImplementation 'androidx.compose.ui:ui-test-junit4'
androidTestImplementation platform('androidx.compose:compose-bom:2022.10.00')
debugImplementation 'androidx.compose.ui:ui-tooling'
debugImplementation 'androidx.compose.ui:ui-test-manifest'
}
@file:OptIn(ExperimentalMaterial3Api::class)
package com.volkov.transport
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.Row
77
import androidx.compose.foundation.layout.fillMaxHeight
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.material3.Button
import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.NavigationBarDefaults
import androidx.compose.material3.OutlinedTextField
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBar
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.unit.dp
import com.google.android.gms.maps.model.LatLng
import com.vanpra.composematerialdialogs.MaterialDialog
import com.vanpra.composematerialdialogs.datetime.date.datepicker
import com.vanpra.composematerialdialogs.rememberMaterialDialogState
import com.volkov.transport.component.DropDownField
import com.volkov.transport.component.MultiDropDownField
import com.volkov.transport.component.NumberField
import com.volkov.transport.model.AreaDTO
import com.volkov.transport.model.CargoAddPayload
import com.volkov.transport.model.CargoContentDTO
import com.volkov.transport.model.CargoDTO
import com.volkov.transport.model.CargoEditPayload
import com.volkov.transport.model.CargoLoadTypeDTO
import com.volkov.transport.model.CountryDTO
import com.volkov.transport.model.TownDTO
import com.volkov.transport.model.WaypointDTO
import com.volkov.transport.model.WaypointEditDTO
import com.volkov.transport.tab.currentCargoDeparture
import com.volkov.transport.tab.currentCargoDestination
import com.volkov.transport.ui.theme.SoftRed
import com.volkov.transport.ui.theme.VolkovTransportTheme
import com.volkov.transport.util.LardiTransApi
import com.volkov.transport.util.getActivity
import java.time.format.DateTimeFormatter
import java.time.format.FormatStyle
var selectedCargoItem: CargoDTO? = null
var selectedCargoItemStatus = ""
78
class CargoItemActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
VolkovTransportTheme {
CargoItemContent()
}
}
}
}
class Address1(val country: CountryDTO?, val area: AreaDTO?, val town: TownDTO?) {
companion object {
fun fromWaypoint(waypoint: WaypointDTO): Address1 {
return Address1(waypoint.country, waypoint.area, waypoint.town)
}
}
override fun toString(): String {
return listOfNotNull(
country?.name,
area?.name,
town?.name
).joinToString(", ")
}
}
@Composable
fun AddressField(waypoint: WaypointDTO) {
var townsSearchResult by remember { mutableStateOf(listOf<Address1>()) }
var countries by remember { mutableStateOf(listOf<CountryDTO>()) }
var areas by remember { mutableStateOf(listOf<AreaDTO>()) }
var currAddress1 by remember { mutableStateOf(Address1.fromWaypoint(waypoint)) }
var currAddress2 by remember { mutableStateOf(waypoint.address) }
LaunchedEffect(Unit) {
LardiTransApi.getCountries {
countries = it
}
LardiTransApi.getAreas {
areas = it
}
}
Column {
DropDownField(selectedItem = currAddress1,
options = townsSearchResult,
placeholderText = "Адреса 1",
isError = waypoint.town == null,
79
onQuery = { query ->
LardiTransApi.getTownNames(query) { results ->
townsSearchResult = results.map { res ->
Address1(
countries.find { it.sign == res.countrySign }
?: CountryDTO("", ""),
areas.find { it.id == res.areaId },
TownDTO(res.id, res.name)
)
}.filter { it.country?.name != null }
}
},
onSelect = {
currAddress1 = it
waypoint.country = it.country
waypoint.area = it.area
waypoint.town = it.town
},
getText = { it.toString() })
Box(Modifier.height(8.dp))
OutlinedTextField(
value = currAddress2,
onValueChange = {
currAddress2 = it
waypoint.address = it
},
label = { Text("Адреса 2") },
modifier = Modifier.fillMaxWidth()
)
}
}
@Composable
fun CargoItemContent() {
val ctx = LocalContext.current
val dto = selectedCargoItem!!.copy()
var cargoNamesSearchResult by remember { mutableStateOf(listOf<CargoContentDTO>()) }
var cargoLoadTypes by remember { mutableStateOf(listOf<CargoLoadTypeDTO>()) }
var currCargoContent by remember { mutableStateOf(dto.content) }
var dateFrom by remember { mutableStateOf(dto.dateFrom()) }
var dateTo by remember { mutableStateOf(dto.dateTo()) }
val waypointFrom by remember { mutableStateOf(dto.waypointListSource[0]) }
val waypointTo by remember { mutableStateOf(dto.waypointListTarget[0]) }
var currLoadTypes by remember { mutableStateOf(dto.loadTypes) }
var currLength by remember { mutableStateOf(dto.size.length.toString()) }
var currWidth by remember { mutableStateOf(dto.size.width.toString()) }
80
var currHeight by remember { mutableStateOf(dto.size.height.toString()) }
var currVolumeFrom by remember { mutableStateOf(dto.size.volumeFrom.toString()) }
var currVolumeTo by remember { mutableStateOf(dto.size.volumeTo.toString()) }
var currMassFrom by remember { mutableStateOf(dto.size.massFrom.toString()) }
var currMassTo by remember { mutableStateOf(dto.size.massTo.toString()) }
val dateFromDialogState = rememberMaterialDialogState()
val dateToDialogState = rememberMaterialDialogState()
fun onSave() {
try {
if (dto.id != null) {
val payload =
CargoEditPayload(
dto.waypointListSource.map { WaypointEditDTO.fromWaypoint(it) },
dto.waypointListTarget.map { WaypointEditDTO.fromWaypoint(it) },
dateFrom,
dateTo,
currCargoContent.id!!,
dto.loadTypes.map { it.id },
currLength.toFloat(),
currWidth.toFloat(),
currHeight.toFloat(),
currVolumeFrom.toFloat(),
currVolumeTo.toFloat(),
currMassFrom.toFloat(),
currMassTo.toFloat()
)
LardiTransApi.editCargo(selectedCargoItemStatus, dto.id, payload) {
ctx.getActivity()?.finish()
}
} else {
val payload =
CargoAddPayload(
dto.waypointListSource.map { WaypointEditDTO.fromWaypoint(it) },
dto.waypointListTarget.map { WaypointEditDTO.fromWaypoint(it) },
dateFrom,
dateTo,
currCargoContent.id,
dto.loadTypes.map { it.id },
currLength.toFloat(),
currWidth.toFloat(),
currHeight.toFloat(),
currVolumeFrom.toFloat(),
currVolumeTo.toFloat(),
currMassFrom.toFloat(),
currMassTo.toFloat()
)
LardiTransApi.addCargo(payload) {
81
ctx.getActivity()?.finish()
}
}
} catch (_: Exception) {
}
}
fun onThrowToBin() {
LardiTransApi.throwToBinCargo(dto.id!!) {
selectedCargoItemStatus = "deleted"
ctx.getActivity()?.finish()
}
}
fun onRestore() {
LardiTransApi.restoreCargo(dto.id!!) {
selectedCargoItemStatus = "published"
ctx.getActivity()?.finish()
}
}
fun onShowRoute() {
currentCargoDeparture.value = LatLng(waypointFrom.lat, waypointFrom.lon)
currentCargoDestination.value = LatLng(waypointTo.lat, waypointTo.lon)
goToHome.value = true
ctx.getActivity()?.finish()
}
LaunchedEffect(Unit) {
LardiTransApi.getLoadTypes {
cargoLoadTypes = it
}
}
Scaffold(
topBar = {
TopAppBar(title = {
Row(
Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.SpaceBetween,
verticalAlignment = Alignment.CenterVertically
) {
Text("Вантаж")
Button(modifier = Modifier
.height(40.dp)
.padding(end = 10.dp),
contentPadding = PaddingValues(16.dp, 5.dp),
onClick = { onSave() }) {
Text("Зберегти")
}
82
}
})
},
bottomBar = {
Surface(
color = NavigationBarDefaults.containerColor,
tonalElevation = NavigationBarDefaults.Elevation
) {
if (dto.id != null) {
Box(
Modifier
.fillMaxWidth()
.padding(vertical = 12.dp)
) {
Button(
onClick = { onShowRoute() },
modifier = Modifier.align(Alignment.Center)
) {
Text("Прокласти маршрут")
}
}
}
}
}
) { padd ->
Column(
Modifier
.padding(padd)
.padding(horizontal = 16.dp)
.verticalScroll(rememberScrollState())
.fillMaxHeight(0.8f),
verticalArrangement = Arrangement.spacedBy(16.dp)
) {
DropDownField(selectedItem = currCargoContent,
options = cargoNamesSearchResult,
placeholderText = "Оберіть вміст вантажу",
isError = currCargoContent.id == null,
onQuery = { query ->
LardiTransApi.getCargoNames(query) {
cargoNamesSearchResult = it
}
},
onSelect = { currCargoContent = it },
getText = { it.name })
Column {
Text("Звідки:")
Box(Modifier.height(6.dp))
AddressField(waypointFrom)
83
}
Column {
Text("Куди:")
Box(Modifier.height(6.dp))
AddressField(waypointTo)
}
Row(
Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.SpaceBetween,
verticalAlignment = Alignment.CenterVertically
) {
Text("Дата завантаження: ")
Button(onClick = { dateFromDialogState.show() }) {
Text(
dateFrom.format(DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM))
)
}
}
Row(
Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.SpaceBetween,
verticalAlignment = Alignment.CenterVertically
) {
Text("Дата вивантаження: ")
Button(onClick = { dateToDialogState.show() }) {
Text(
dateTo.format(DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM))
)
}
}
Column(
Modifier.fillMaxWidth(),
) {
Text("Типи вивантаження:")
Box(Modifier.height(8.dp))
MultiDropDownField(
selectedItems = currLoadTypes,
options = cargoLoadTypes,
onChange = {
currLoadTypes = it
},
getText = {
it.name
}
)
}
84
Column {
Row {
NumberField(
value = currLength,
onChange = { currLength = it },
label = "Довжина (м)",
modifier = Modifier.weight(1.0f),
)
NumberField(
value = currWidth,
onChange = { currWidth = it },
label = "Ширина (м)",
modifier = Modifier.weight(1.0f),
)
NumberField(
value = currHeight,
onChange = { currHeight = it },
label = "Висота (м)",
modifier = Modifier.weight(1.0f),
)
}
Box(Modifier.height(8.dp))
Row {
NumberField(
value = currVolumeFrom,
onChange = { currVolumeFrom = it },
label = "Мін. обʼєм (㎥)",
modifier = Modifier.weight(1.0f),
)
NumberField(
value = currVolumeTo,
onChange = { currVolumeTo = it },
label = "Макс. обʼєм (㎥)",
modifier = Modifier.weight(1.0f),
)
}
Box(Modifier.height(8.dp))
Row {
NumberField(
value = currMassFrom,
onChange = { currMassFrom = it },
label = "Мін. маса (т)",
isError = currMassFrom.toFloatOrNull() == 0f,
modifier = Modifier.weight(1.0f),
)
NumberField(
value = currMassTo,
onChange = { currMassTo = it },
label = "Макс. маса (т)",
85
modifier = Modifier.weight(1.0f),
)
}
}
if (selectedCargoItemStatus == "deleted") {
Button(onClick = { onRestore() }) {
Text("Відновити")
}
} else {
Button(
colors = ButtonDefaults.buttonColors(containerColor = SoftRed),
onClick = { onThrowToBin() }) {
Text("Видалити", color = Color.White)
}
}
Box(Modifier.height(32.dp))
}
}
MaterialDialog(dialogState = dateFromDialogState, buttons = {
positiveButton("Ok")
negativeButton("Cancel")
}) {
datepicker(initialDate = dateFrom) { date ->
dateFrom = date
}
}
MaterialDialog(dialogState = dateToDialogState, buttons = {
positiveButton("Ok")
negativeButton("Cancel")
}) {
datepicker(initialDate = dateFrom, allowedDateValidator = { it >= dateFrom }) { date
->
dateTo = date
}
}
}
@file:OptIn(ExperimentalMaterial3Api::class, ExperimentalMaterial3Api::class)
package com.volkov.transport
import android.content.Context
import android.content.Intent
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.layout.Box
86
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxHeight
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.Button
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.OutlinedTextField
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBar
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.unit.dp
import com.volkov.transport.ui.theme.VolkovTransportTheme
import com.volkov.transport.util.LARDI_TOKEN
import com.volkov.transport.util.LardiTransApi
class LoginActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
VolkovTransportTheme {
Scaffold(
topBar = {
TopAppBar(title = { Text("VolkovTransport") })
},
) { padd ->
Box(Modifier.padding(padd)) {
LoginActivityContent()
}
}
}
}
}
}
@Composable
fun LoginActivityContent() {
val ctx = LocalContext.current
var token by remember { mutableStateOf("") }
var error by remember { mutableStateOf("") }
val tokenIsValid = token.isNotBlank()
87
val onSignIn = {
LARDI_TOKEN = token
error = ""
LardiTransApi.checkToken { userIsValid ->
if (userIsValid) {
val prefs = ctx.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE)
prefs.edit().putString(PREF_LARDI_TOKEN, token).apply()
val intent = Intent(ctx, MainActivity::class.java)
ctx.startActivity(intent)
} else {
error = "Невірний ID"
}
}
}
Column(Modifier.padding(horizontal = 20.dp)) {
Box(modifier = Modifier.fillMaxHeight(0.2f))
OutlinedTextField(
value = token,
onValueChange = { token = it },
modifier = Modifier.fillMaxWidth(),
label = { Text(text = "Personal ID") }
)
Box(Modifier.height(30.dp))
Button(
modifier = Modifier.align(Alignment.End),
enabled = tokenIsValid,
onClick = { onSignIn() }) {
Text("Sign in")
}
if (error.isNotEmpty()) {
Text(
error,
color = Color(218, 92, 92),
modifier = Modifier.align(Alignment.CenterHorizontally)
)
}
}
}
package com.volkov.transport
import android.content.Intent
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Icon
88
import androidx.compose.material3.NavigationBar
import androidx.compose.material3.NavigationBarItem
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBar
import androidx.compose.runtime.*
import androidx.compose.runtime.livedata.observeAsState
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.painterResource
import androidx.lifecycle.MutableLiveData
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.compose.currentBackStackEntryAsState
import androidx.navigation.compose.rememberNavController
import com.volkov.transport.tab.TabCargo
import com.volkov.transport.tab.TabHome
import com.volkov.transport.tab.TabSettings
import com.volkov.transport.ui.theme.VolkovTransportTheme
import com.volkov.transport.util.BottomNavItem
import com.volkov.transport.util.GoogleDirectionsApi
import com.volkov.transport.util.LARDI_TOKEN
import com.volkov.transport.util.LardiTransApi
const val TAG = "VTRS"
const val PREFS_NAME = "main_prefs"
const val PREF_LARDI_TOKEN = "lardi_token"
val TABS = arrayOf(
BottomNavItem("home", R.drawable.round_home_24, "Home"),
BottomNavItem("cargo", R.drawable.round_local_shipping_24, "Cargo"),
BottomNavItem("settings", R.drawable.round_settings_24, "Settings")
)
var goToHome = MutableLiveData(false)
class MainActivity : ComponentActivity() {
@OptIn(ExperimentalMaterial3Api::class)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
GoogleDirectionsApi.initialize(this)
LardiTransApi.initialize(this)
setContent {
val navController = rememberNavController()
val navBackStackEntry by navController.currentBackStackEntryAsState()
val prefs = getSharedPreferences(PREFS_NAME, MODE_PRIVATE)
LARDI_TOKEN = prefs.getString(PREF_LARDI_TOKEN, "")!!
val signedIn = LARDI_TOKEN.isNotBlank()
89
if (!signedIn) {
val intent = Intent(this, LoginActivity::class.java)
startActivity(intent)
finish()
}
val doGoToHome = goToHome.observeAsState()
if (doGoToHome.value!!) {
goToHome.value = false
navController.navigate("home")
}
VolkovTransportTheme {
Scaffold(
topBar = {
TopAppBar(title = { Text("VolkovTransport") })
},
bottomBar = {
NavigationBar {
TABS.forEach { item ->
NavigationBarItem(
selected = navBackStackEntry?.destination?.route ==
item.route,
onClick = { navController.navigate(item.route) },
icon = {
Icon(
painterResource(item.icon),
contentDescription = item.label
)
},
label = { Text(item.label) },
)
}
}
}) { padd ->
NavHost(
navController = navController,
startDestination = "home",
modifier = Modifier.padding(padd)
) {
composable("home") { TabHome() }
composable("cargo") { TabCargo() }
composable("settings") { TabSettings() }
}
}
}
}
}
}
90
package com.volkov.transport.util
import androidx.annotation.DrawableRes
class BottomNavItem(val route: String, @DrawableRes val icon: Int, val label: String)
package com.volkov.transport.util
import android.content.Context
import android.net.Uri
import android.util.Log
import com.android.volley.RequestQueue
import com.android.volley.toolbox.JsonObjectRequest
import com.android.volley.toolbox.Volley
import com.google.android.gms.maps.model.LatLng
import com.volkov.transport.BuildConfig
import com.volkov.transport.TAG
import kotlinx.serialization.Serializable
import kotlinx.serialization.decodeFromString
import kotlinx.serialization.json.Json
@Serializable
data class MapLocation(val lat: Double, val lng: Double)
@Serializable
data class MapPolyline(val points: String)
@Serializable
data class MapRouteStep(
val start_location: MapLocation,
val end_location: MapLocation,
val polyline: MapPolyline,
val travel_mode: String
) {
fun startLocation(): LatLng {
return LatLng(start_location.lat, start_location.lng)
}
fun endLocation(): LatLng {
return LatLng(end_location.lat, end_location.lng)
}
}
@Serializable
data class MapRouteLegDistance(val value: Double)
@Serializable
data class MapRouteLeg(val steps: List<MapRouteStep>, val distance: MapRouteLegDistance)
@Serializable
91
data class MapRoute(val legs: List<MapRouteLeg>)
@Serializable
data class DirectionsResponse(val routes: List<MapRoute>)
object GoogleDirectionsApi {
var requestQueue: RequestQueue? = null
private val json = Json {
ignoreUnknownKeys = true
}
fun initialize(ctx: Context) {
requestQueue = Volley.newRequestQueue(ctx)
}
fun get(
fromLoc: LatLng, toLoc: LatLng, waypoint: LatLng, onSuccess: (DirectionsResponse) ->
Unit
) {
val uri =
Uri.parse("https://maps.googleapis.com/maps/api/directions/json").buildUpon()
.appendQueryParameter("key", BuildConfig.MAPS_API_KEY)
.appendQueryParameter("origin", "${fromLoc.latitude},${fromLoc.longitude}")
.appendQueryParameter("destination", "${toLoc.latitude},${toLoc.longitude}")
.appendQueryParameter("waypoints",
"${waypoint.latitude},${waypoint.longitude}")
.appendQueryParameter("units", "metric")
.build()
val request = JsonObjectRequest(uri.toString(), { result ->
val resJson = json.decodeFromString<DirectionsResponse>(result.toString())
onSuccess(resJson)
}) { error ->
Log.e(TAG, "onErrorResponse: Error= $error")
Log.e(TAG, "onErrorResponse: Error= " + error.message)
}
requestQueue!!.add(request)
}
}
package com.volkov.transport.util
import android.content.Context
import android.net.Uri
import android.util.Log
import com.android.volley.NetworkResponse
import com.android.volley.ParseError
import com.android.volley.RequestQueue
import com.android.volley.Response
import com.android.volley.Response.ErrorListener
import com.android.volley.Response.Listener
92
import com.android.volley.toolbox.HttpHeaderParser
import com.android.volley.toolbox.StringRequest
import com.android.volley.toolbox.Volley
import com.volkov.transport.TAG
import com.volkov.transport.model.AreaDTO
import com.volkov.transport.model.CargoAddPayload
import com.volkov.transport.model.CargoContentDTO
import com.volkov.transport.model.CargoDTO
import com.volkov.transport.model.CargoEditPayload
import com.volkov.transport.model.CargoLoadTypeDTO
import com.volkov.transport.model.CountryDTO
import com.volkov.transport.model.RestoreFromBasketPayload
import com.volkov.transport.model.ThrowToBasketPayload
import com.volkov.transport.model.TownSearchResultDTO
import kotlinx.serialization.decodeFromString
import kotlinx.serialization.encodeToString
import kotlinx.serialization.json.Json
import kotlinx.serialization.json.JsonArray
import kotlinx.serialization.json.JsonObject
import kotlinx.serialization.json.decodeFromJsonElement
import kotlinx.serialization.json.jsonArray
import java.io.UnsupportedEncodingException
import java.nio.charset.Charset
var LARDI_TOKEN = ""
class LardiRequest(
method: Int,
url: String,
private val body: String?,
responseListener: Listener<String>,
errListener: ErrorListener
) : StringRequest(method, url, responseListener, errListener) {
override fun getBodyContentType(): String {
return "application/json"
}
override fun getBody(): ByteArray? {
return body?.toByteArray(Charsets.UTF_8)
}
override fun getHeaders(): MutableMap<String, String> {
val headers = HashMap(super.getHeaders())
headers["Authorization"] = LARDI_TOKEN
return headers
}
override fun parseNetworkResponse(response: NetworkResponse?): Response<String> {
return try {
93
val jsonString = String(
response!!.data,
charset(HttpHeaderParser.parseCharset(response.headers, "utf-8"))
)
Response.success(jsonString, HttpHeaderParser.parseCacheHeaders(response))
} catch (e: UnsupportedEncodingException) {
Response.error(ParseError(e))
}
}
companion object {
fun get(
url: String, responseListener: Listener<String>, errListener: ErrorListener?
): LardiRequest {
return LardiRequest(
Method.GET,
url,
null,
responseListener,
errListener ?: ErrorListener { })
}
fun post(
url: String,
body: String?,
responseListener: Listener<String>,
errListener: ErrorListener?
): LardiRequest {
return LardiRequest(
Method.POST,
url,
body,
responseListener,
errListener ?: ErrorListener { })
}
fun put(
url: String,
body: String?,
responseListener: Listener<String>,
errListener: ErrorListener?
): LardiRequest {
return LardiRequest(
Method.PUT,
url,
body,
responseListener,
errListener ?: ErrorListener { })
}
}
94
}
object LardiTransApi {
private const val BASE_URL = "https://api.lardi-trans.com/v2"
private const val LANG = "uk"
private var requestQueue: RequestQueue? = null
private val json = Json {
ignoreUnknownKeys = true
}
fun initialize(ctx: Context) {
requestQueue = Volley.newRequestQueue(ctx)
}
fun checkToken(onResult: (userIsValid: Boolean) -> Unit) {
val request =
LardiRequest.get("$BASE_URL/proposals/my/cargoes/published?language=$LANG", {
onResult(true)
}) { error ->
Log.e(TAG, "onErrorResponse: Error= $error")
onResult(false)
}
requestQueue!!.add(request)
}
fun getCargos(status: String, onSuccess: (List<CargoDTO>) -> Unit) {
val request =
LardiRequest.get("$BASE_URL/proposals/my/cargoes/$status?language=$LANG", { res
->
val arr = json.decodeFromString<JsonObject>(res)["content"]!!.jsonArray
onSuccess(arr.map { json.decodeFromJsonElement(it) })
}) { error ->
Log.e(TAG, "onErrorResponse: Error= $error")
}
requestQueue!!.add(request)
}
fun getCargoNames(query: String, onSuccess: (List<CargoContentDTO>) -> Unit) {
if (query.length < 3) {
return
}
val uri = Uri.parse("$BASE_URL/references/cargo").buildUpon()
.appendQueryParameter("language", LANG).appendQueryParameter("query",
query).build()
val request = LardiRequest.get(uri.toString(), { res ->
val arr = json.decodeFromString<JsonArray>(res)
95
val list: List<CargoContentDTO> = arr.map { json.decodeFromJsonElement(it) }
onSuccess(list)
}) { error ->
Log.e(TAG, "onErrorResponse: Error= $error")
}
requestQueue!!.add(request)
}
fun getCountries(onSuccess: (List<CountryDTO>) -> Unit) {
val uri = Uri.parse("$BASE_URL/references/countries").buildUpon()
.appendQueryParameter("language", LANG).build()
val request = LardiRequest.get(uri.toString(), { res ->
val arr = json.decodeFromString<JsonArray>(res)
val list: List<CountryDTO> = arr.map { json.decodeFromJsonElement(it) }
onSuccess(list)
}) { error ->
Log.e(TAG, "onErrorResponse: Error= $error")
}
requestQueue!!.add(request)
}
fun getAreas(onSuccess: (List<AreaDTO>) -> Unit) {
val uri = Uri.parse("$BASE_URL/references/areas").buildUpon()
.appendQueryParameter("language", LANG).build()
val request = LardiRequest.get(uri.toString(), { res ->
val arr = json.decodeFromString<JsonArray>(res)
val list: List<AreaDTO> = arr.map { json.decodeFromJsonElement(it) }
onSuccess(list)
}) { error ->
Log.e(TAG, "onErrorResponse: Error= $error")
}
requestQueue!!.add(request)
}
fun getTownNames(query: String, onSuccess: (List<TownSearchResultDTO>) -> Unit) {
val uri = Uri.parse("$BASE_URL/references/towns/by/name").buildUpon()
.appendQueryParameter("language", LANG)
.appendQueryParameter("limit", "5")
.appendQueryParameter("query", query).build()
val request = LardiRequest.get(uri.toString(), { res ->
val arr = json.decodeFromString<JsonArray>(res)
val list: List<TownSearchResultDTO> = arr.map { json.decodeFromJsonElement(it) }
onSuccess(list)
}) { error ->
Log.e(TAG, "onErrorResponse: Error= $error")
}
requestQueue!!.add(request)
96
}
fun getLoadTypes(onSuccess: (List<CargoLoadTypeDTO>) -> Unit) {
val uri = Uri.parse("$BASE_URL/references/load/types").buildUpon()
.appendQueryParameter("language", LANG).build()
val request = LardiRequest.get(uri.toString(), { res ->
val arr = json.decodeFromString<JsonArray>(res)
val list: List<CargoLoadTypeDTO> = arr.map { json.decodeFromJsonElement(it) }
onSuccess(list)
}) { error ->
Log.e(TAG, "onErrorResponse: Error= $error")
}
requestQueue!!.add(request)
}
fun getPublishedCargos(onSuccess: (List<CargoDTO>) -> Unit) {
getCargos("published", onSuccess)
}
fun getDeletedCargos(onSuccess: (List<CargoDTO>) -> Unit) {
getCargos("deleted", onSuccess)
}
fun addCargo(payload: CargoAddPayload, onSuccess: () -> Unit) {
Log.d(TAG, payload.toString())
val request =
LardiRequest.post("$BASE_URL/proposals/my/add/cargo",
json.encodeToString(payload),
{
onSuccess()
}) { error ->
Log.e(TAG, "onErrorResponse: Error= $error
${error.networkResponse.data.toString(
Charset.defaultCharset())}")
}
requestQueue!!.add(request)
}
fun editCargo(status: String, id: Long, payload: CargoEditPayload, onSuccess: () ->
Unit) {
val request =
LardiRequest.put("$BASE_URL/proposals/my/cargo/$status/${id}",
json.encodeToString(payload),
{
onSuccess()
}) { error ->
Log.e(TAG, "onErrorResponse: Error= $error ")
}
97
requestQueue!!.add(request)
}
fun throwToBinCargo(id: Long, onSuccess: () -> Unit) {
val request =
LardiRequest.post("$BASE_URL/proposals/my/basket/throw?language=$LANG",
json.encodeToString(ThrowToBasketPayload(listOf(id))),
{
onSuccess()
}) { error ->
Log.e(TAG, "onErrorResponse: Error= $error")
}
requestQueue!!.add(request)
}
fun restoreCargo(id: Long, onSuccess: () -> Unit) {
val request =
LardiRequest.post("$BASE_URL/proposals/my/basket/restore?language=$LANG",
json.encodeToString(RestoreFromBasketPayload(listOf(id))),
{
onSuccess()
}) { error ->
Log.e(TAG, "onErrorResponse: Error= $error")
}
requestQueue!!.add(request)
}
}
package com.volkov.transport.util
import android.Manifest
import android.content.Context
import android.location.Location
import android.os.Looper
import androidx.annotation.RequiresPermission
import androidx.compose.runtime.mutableStateOf
import com.google.android.gms.location.LocationCallback
import com.google.android.gms.location.LocationRequest
import com.google.android.gms.location.LocationResult
import com.google.android.gms.location.LocationServices
object LocationUtil {
var locationState = mutableStateOf<Location?>(null)
var started = false
private var locationCallback = object : LocationCallback() {
override fun onLocationResult(res: LocationResult) {
locationState.value = res.lastLocation
}
}
98
@RequiresPermission(Manifest.permission.ACCESS_COARSE_LOCATION)
fun start(ctx: Context) {
if (started) {
return
}
val locationClient = LocationServices.getFusedLocationProviderClient(ctx)
locationClient.requestLocationUpdates(
LocationRequest.Builder(1000).build(),
locationCallback,
Looper.getMainLooper()
)
started = true
}
}
package com.volkov.transport.util
import android.content.Context
import android.util.Log
import com.android.volley.RequestQueue
import com.android.volley.toolbox.JsonObjectRequest
import com.android.volley.toolbox.Volley
import com.google.android.gms.maps.model.LatLng
import com.volkov.transport.BuildConfig
import com.volkov.transport.TAG
class NearbyPlace(val location: LatLng, val iconUrl: String)
object NearbySearch {
var requestQueue: RequestQueue? = null
fun initialize(ctx: Context) {
requestQueue = Volley.newRequestQueue(ctx)
}
fun run(
location: LatLng, radius: Float, types: List<String>, onSuccess: (List<NearbyPlace>)
-> Unit
) {
val googlePlacesUrl =
StringBuilder("https://maps.googleapis.com/maps/api/place/nearbysearch/json?").append("locat
ion=${location.latitude},${location.longitude}")
.append("&radius=").append(radius).append("&type=${types.joinToString("|")}"
)
.append("&key=${BuildConfig.MAPS_API_KEY}")
val request = JsonObjectRequest(googlePlacesUrl.toString(), {
val jsonResults = it.getJSONArray("results")
99
val places = arrayListOf<NearbyPlace>()
for (i in 0 until jsonResults.length()) {
val placeJson = jsonResults.getJSONObject(i)
val jsonLoc = placeJson.getJSONObject("geometry").getJSONObject("location")
places.add(
NearbyPlace(
location = LatLng(
jsonLoc.getDouble("lat"), jsonLoc.getDouble("lng")
), iconUrl = placeJson.getString("icon")
)
)
}
onSuccess(places)
}) { error ->
Log.e(TAG, "onErrorResponse: Error= $error")
Log.e(TAG, "onErrorResponse: Error= " + error.message)
}
requestQueue!!.add(request)
}
}
package com.volkov.transport.util
import android.content.Context
import android.content.ContextWrapper
import androidx.activity.ComponentActivity
fun Context.getActivity(): ComponentActivity? = when (this) {
is ComponentActivity -> this
is ContextWrapper -> baseContext.getActivity()
else -> null
}
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<path
android:fillColor="#3DDC84"
android:pathData="M0,0h108v108h-108z" />
<path
android:fillColor="#00000000"
android:pathData="M9,0L9,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
100
android:pathData="M19,0L19,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M29,0L29,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M39,0L39,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M49,0L49,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M59,0L59,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M69,0L69,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M79,0L79,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M89,0L89,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M99,0L99,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,9L108,9"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
101
android:pathData="M0,19L108,19"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,29L108,29"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,39L108,39"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,49L108,49"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,59L108,59"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,69L108,69"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,79L108,79"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,89L108,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,99L108,99"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,29L89,29"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
102
android:pathData="M19,39L89,39"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,49L89,49"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,59L89,59"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,69L89,69"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,79L89,79"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M29,19L29,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M39,19L39,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M49,19L49,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M59,19L59,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M69,19L69,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
1 03
android:pathData="M79,19L79,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
</vector>
<vector android:height="24dp" android:tint="#000000"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M10,19v-5h4v5c0,0.55
0.45,1 1,1h3c0.55,0 1,-0.45 1,-1v-7h1.7c0.46,0 0.68,-0.57 0.33,-0.87L12.67,3.6c-0.38,-0.34 -
0.96,-0.34 -1.34,0l-8.36,7.53c-0.34,0.3 -0.13,0.87 0.33,0.87H5v7c0,0.55 0.45,1 1,1h3c0.55,0
1,-0.45 1,-1z"/>
</vector>
<vector android:height="24dp" android:tint="#000000"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M19.5,8L17,8L17,6c0,-
1.1 -0.9,-2 -2,-2L3,4c-1.1,0 -2,0.9 -2,2v9c0,1.1 0.9,2 2,2 0,1.66 1.34,3 3,3s3,-1.34 3,-
3h6c0,1.66 1.34,3 3,3s3,-1.34 3,-3h1c0.55,0 1,-0.45 1,-1v-3.33c0,-0.43 -0.14,-0.85 -0.4,-
1.2L20.3,8.4c-0.19,-0.25 -0.49,-0.4 -0.8,-0.4zM6,18c-0.55,0 -1,-0.45 -1,-1s0.45,-1 1,-1
1,0.45 1,1 -0.45,1 -1,1zM19.5,9.5l1.96,2.5L17,12L17,9.5h2.5zM18,18c-0.55,0 -1,-0.45 -1,-
1s0.45,-1 1,-1 1,0.45 1,1 -0.45,1 -1,1z"/>
</vector>
<vector android:height="24dp" android:tint="#000000"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M19.5,12c0,-0.23 -
0.01,-0.45 -0.03,-0.68l1.86,-1.41c0.4,-0.3 0.51,-0.86 0.26,-1.3l-1.87,-3.23c-0.25,-0.44 -
0.79,-0.62 -1.25,-0.42l-2.15,0.91c-0.37,-0.26 -0.76,-0.49 -1.17,-0.68l-0.29,-2.31C14.8,2.38
14.37,2 13.87,2h-3.73C9.63,2 9.2,2.38 9.14,2.88L8.85,5.19c-0.41,0.19 -0.8,0.42 -
1.17,0.68L5.53,4.96c-0.46,-0.2 -1,-0.02 -1.25,0.42L2.41,8.62c-0.25,0.44 -0.14,0.99
0.26,1.3l1.86,1.41C4.51,11.55 4.5,11.77 4.5,12s0.01,0.45 0.03,0.68l-1.86,1.41c-0.4,0.3 -
0.51,0.86 -0.26,1.3l1.87,3.23c0.25,0.44 0.79,0.62 1.25,0.42l2.15,-0.91c0.37,0.26 0.76,0.49
1.17,0.68l0.29,2.31C9.2,21.62 9.63,22 10.13,22h3.73c0.5,0 0.93,-0.38 0.99,-0.88l0.29,-
2.31c0.41,-0.19 0.8,-0.42 1.17,-0.68l2.15,0.91c0.46,0.2 1,0.02 1.25,-0.42l1.87,-3.23c0.25,-
0.44 0.14,-0.99 -0.26,-1.3l-1.86,-1.41C19.49,12.45 19.5,12.23 19.5,12zM12.04,15.5c-1.93,0 -
3.5,-1.57 -3.5,-3.5s1.57,-3.5 3.5,-3.5s3.5,1.57 3.5,3.5S13.97,15.5 12.04,15.5z"/>
</vector>
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<application
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
1 04
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.VolkovTransport"
tools:targetApi="31">
<meta-data
android:name="com.google.android.geo.API_KEY"
android:value="${MAPS_API_KEY}" />
<activity
android:name=".LoginActivity"
android:exported="false"
android:label="@string/title_activity_login"
android:theme="@style/Theme.VolkovTransport" />
<activity
android:name=".MainActivity"
android:exported="true"
android:theme="@style/Theme.VolkovTransport">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".CargoItemActivity"
android:exported="false"
android:label="@string/title_activity_cargo_item"
android:theme="@style/Theme.VolkovTransport" />
</application>
</manifest>
105
ДОДАТОК В
МОБІЛЬНИЙ ДОДАТОК З ТРАНСПОРТНОЇ ЛОГІСТИКИ
ІНСТРУКЦІЯ КОРИСТУВАЧА
482. ЧДТУ. 31911-01 34 01
Листів 2
Розробник _____________ Волков І.С.
Черкаси – 2023
1 06
1. Встановити інсталяційний файл (.apk) на розумний пристрій (смартфон).
2. Запустити застосунок з назвою «VolkovTransport».