Orang suka pengiriman. Dengan sedikit biaya, Anda membeli kesempatan untuk mendapatkan barang-barang yang diperlukan tanpa meninggalkan rumah: makanan dari restoran favorit Anda, furnitur besar, buku yang ingin Anda baca untuk waktu yang lama, dan memang apa saja. Dan peningkatan jumlah layanan untuk pengiriman cepat segala sesuatu di dunia hanya menegaskan tesis ini. Ya, dan untuk toko itu nilai tambah - dia telah bermitra dengan pengiriman barang apa pun ke pintu dan meningkatkan ceknya.
Kami di "Crossroads" memiliki pengiriman kami sendiri. Untuk seseorang dari luar, proses pengiriman dari toko ke rumah terlihat seperti ini:
- Saya memilih sesuatu di situs dan menaruhnya di keranjang.
- Saya memasukkan alamat dan membayar pesanan.
- Toko dengan cepat memberikan pesanan kepada kurir.
- Kurir mengirimkan pesanan.
Faktanya, semuanya sedikit lebih rumit. Nama saya Vitaliy, saya adalah kepala departemen pengembangan, dan hari ini saya akan memberi tahu Anda bagaimana semuanya bekerja untuk kita. Dan tentang apa.

Dua aplikasi bertanggung jawab atas stabilitas proses - showcase dan aplikasi mobile pengguna. Semuanya klasik dengan etalase - pembeli mengunjungi situs, meluangkan waktu untuk memilih produk dan mengisi keranjang, memeriksa kartu produk. Langkah terakhir di sini adalah melakukan pemesanan. Setelah itu, pesanan ditransfer untuk diproses lebih lanjut ke back office.
Secara umum, back office untuk toko online adalah sistem di mana banyak tindakan dilakukan pada barang: kami meresepkan partisipasi barang dalam promosi tertentu, mengikat spanduk untuk ini, menyoroti zona merek dan banyak lagi. Tentu saja, pesanan diproses di sini. Ketika pembeli menyelesaikan proses pemesanan dan pesanan tiba di back office, itu harus dikonfirmasi. Ini terjadi secara otomatis jika kita sudah tahu pembeli ini, atau oleh operator dalam mode manual sesuai dengan skema yang biasa "Halo, apakah Anda memesan sesuatu di sini, mengkonfirmasi, apakah datanya benar?" Dan seterusnya. Dan di sini partisipasi back office dalam proses pembentukan pengiriman sudah berakhir, pesanan dikonfirmasi, status diubah dari "Diproses" ke "Pergi". Pesanan dalam WMS (di mana disediakan, dikumpulkan, barang pesanan yang tidak tersedia dan yang dibuat untuk memesan dari pemasok) dan pada saat yang sama dapat mulai dialihkan oleh ahli logistik. Secara umum, WMS dan logistik adalah sistem independen yang bekerja dengan pesanan secara paralel.
Sementara itu, dalam persediaan
Sistem WMS adalah kombinasi dari perangkat lunak kami, gudang, karyawan dari gudang dan perangkat ini, yang secara signifikan menyederhanakan kehidupan karyawan ini. Terminal kecil, yang dipasang di pergelangan tangan seorang karyawan, memungkinkan Anda untuk dengan cepat mengumpulkan pesanan dalam urutan yang diinginkan.

Konsistensi penting karena kami mengirimkan pesanan kepada pelanggan kami di kotak persimpangan jalan khusus. Dan dengan sebuah kotak, itu persegi panjang. Seperti kebanyakan kotak.
Oleh karena itu, perlu untuk mengamati dua kondisi pada saat yang sama - dan mengisi kotak itu sendiri sebanyak mungkin sehingga klien tidak menerima dua kotak yang hanya setengah penuh (keduanya tidak ekonomis, ramah lingkungan, dan umumnya aneh), dan isi kotak sesuai dengan prinsip "dari berat ke cahaya" ". Sistem memperhitungkan ukuran produk dan kemasannya. Mengetahui hal ini dan parameter kotak, dimungkinkan untuk membentuk pesanan sehingga kotak diisi hingga maksimum. Ini juga memungkinkan Anda untuk menyingkirkan situasi ketika mobil kurir tampaknya telah menggantikan semua 100% dimuat dengan kotak, tetapi setengah kosong.
Dan sistem menulis untuk pekerja gudang agar dapat mengumpulkan pesanan. Beberapa orang ingin mendapatkan sebuah kotak di mana seorang karyawan gudang yang baik meletakkan tiga lusin telur ke bagian paling bawah, dengan hati-hati meletakkan di atas 10 paket susu dan beberapa kilogram sayuran, misalnya. Dengan susu, pasti, semuanya akan baik-baik saja, yang tidak bisa dikatakan tentang telur. Segala macam cookie yang rapuh juga selalu ada di atas.

Plus, Anda harus mengikuti aturan lingkungan barang. Katakanlah akan sangat menyedihkan bagi Anda jika Anda memesan 2 varietas apel, roti gulung dan ikan, dan semua ini berbau tidak dengan ikan, tetapi dengan deterjen secara umum, karena semuanya tiba dalam satu kotak. Oleh karena itu, makanan - secara terpisah, bahan kimia rumah tangga - secara terpisah. Lingkungan barang ditentukan oleh standar SanPiN. Dan kami mengamati mereka. Dari sudut pandang manusia, ini adalah model yang logis dan hanya benar. Dari sudut pandang gudang, ini adalah variabel tambahan saat membangun rute pekerja gudang.
Sistem memperhitungkan segala sesuatu dan membangun rute, berkat karyawan yang mengumpulkan pesanan dalam urutan yang diinginkan - terminal membawanya ke rak yang benar. Jika Anda melebih-lebihkan, sepertinya pekerjaan bagian klien dari aplikasi adalah seperti ini: "Guy, pergi ke B4, bawa 5 paket tepung, letakkan di bagian paling bawah kotak. Lalu dari A2, ambil susu. Tidak, bukan yang ini, yang ada di sel itu. β

Begitu mereka membuat aplikasi untuk orang-orang gudang, itu perlu untuk membuat aplikasi untuk kurir. Ini membantu tidak hanya untuk membangun rute, tetapi juga dalam proses untuk dengan cepat mencetak cek dan mencatat status pesanan baru. Nah, metrik, di mana tidak ada metrik - kita melihat di mana kurir tertentu berada, dia biasanya cocok dengan jadwal atau tidak, dia mencetak cek ketika mentransfer pesanan ke pembeli atau tidak, dan seterusnya.

Ngomong-ngomong, mengapa kita tidak mencetak cek sekaligus: ketika kita membawa kotak kita ke klien, dia dapat menolak produk apa pun dengan alasan apa pun. Sebagai contoh, dia berhasil keluar dan membeli es krim untuk dirinya sendiri, atau seketika dia merebus dua liter susu dan memutuskan bahwa ikan dan acar mentimun untuk malam ini hanyalah sebuah ide. Secara umum, ada banyak alasan untuk menolak posisi apa pun, termasuk "perubahan pikiran". Oleh karena itu, kurir menghapus posisi yang ditolak oleh klien, dan mencetak cek terakhir.
Di bawah tenda
Kami menulis aplikasi kami di Swift dan Kotlin (iOS dan Android, masing-masing). Dalam hal ini, seluruh backend berputar dalam PHP, kami memutuskan untuk melakukan database pada Postgres, untuk broker kami memiliki Rabbit mq.
Ya, jelas bahwa pada 2019 semua orang melakukan segalanya berdasarkan prinsip seluler terlebih dahulu, tetapi entah bagaimana ternyata situs itu lebih dekat dan lebih mahal. Dia bekerja di Lavarel. Dalam arah layanan microser, kami juga baru saja mulai bergerak, jadi saat ini baik situs dan aplikasi adalah monolith yang besar dan kuat yang duduk dan menunggu itu sudah ditarik untuk layanan microser.
Ngomong-ngomong, Postgres yang disebutkan itu menunjukkan dirinya sebagai hambatan dari waktu ke waktu, jadi kami akan mengubah sesuatu. Kami secara aktif menggunakan penyeimbang, karena beban pada sistem dapat mengambil nilai yang sangat berbeda.
Semua hal ini berlokasi di server dalam bentuk ini:
16 server aplikasi dengan PHP-FPM dan Postgres, Postgres memiliki 1 master dan 4 budak. Seperti yang Anda lihat, tidak ada sepeda. Seluruh kantor belakang terintegrasi dengan sistem internal - WMS, gudang, logistik, akuntansi dan pemasaran.
Kami meluncurkan aplikasi seluler dan situs web pada tahun 2017. Saat ini, beban rata-rata pada sistem adalah sekitar 6.000 pesanan per hari. Di satu sisi, itu tidak terlalu banyak, di sisi lain, masih layak mempertimbangkan bahwa ini tidak tersebar secara merata selama 24 jam, orang tidak memesan makanan sepanjang waktu, ada juga garter untuk kegiatan standar selama jam kerja. Permintaan PHP sendiri (termasuk API) sekitar 70.000 dalam 5 menit.
Jalur pemesanan
Segera setelah pesanan berhasil dikumpulkan di gudang dan siap untuk melakukan perjalanan, itu dialihkan. Sekarang kami mulai menggunakan Yandex. Bercak untuk ini - produk bagus yang memungkinkan kami untuk dengan cepat membangun rute optimal bagi pengemudi dengan mempertimbangkan situasi lalu lintas akun - kemacetan lalu lintas, cuaca, lantai, penghalang, dan kesenangan lainnya. Ini membantu kami menghemat bahan bakar, sehingga kurir tidak memutari kota. Pengemudi memiliki rute yang jelas, daftar pesanan di mana pesanan harus diangkut, pesanan itu sendiri ditempatkan di dalam mobil sedemikian rupa sehingga mereka dikirim dalam urutan yang sama.

Kami membuat aplikasi untuk kurir untuk Android, seperti yang sudah saya tulis, di Kotlin. Di dalamnya perutean dijahit, kemampuan untuk berkomunikasi dengan klien (kami menyembunyikan nomor klien, pengemudi hanya memiliki tombol "Panggilan"), kemampuan untuk mengedit pesanan dan menghapus sesuatu, mencetak cek, dan juga membayar pesanan.

Secara terpisah, tentang telemetri: aplikasi mempertimbangkan segalanya: waktu perjalanan, waktu kedatangan ke klien, dan waktu keberangkatan, ini sangat membantu untuk membangun banyak laporan analitik dan melacak logistik. Misalnya, kurir tidak bergerak selama beberapa waktu, tetapi secara umum ia harus - mereka menghubunginya dan menentukan apakah semuanya baik-baik saja. Koneksi dengan logistik dalam hal ini sangat penting, karena ada situasi ketika kurir, misalnya, pukul 15.00 harus di satu alamat, dan pukul 15.30 - di lain. Tetapi pada alamat pertama ada hambatan karena kontrol akses di halaman, penghalang atau gerbang, saya harus menghabiskan 10 menit tambahan untuk menghubungi klien, sehingga klien menghubungi keamanan dan sebagainya, Anda tahu bagaimana itu terjadi.

Tetapi dari sudut pandang klien pada jam 15.30 ini tidak pernah menjadi masalah sama sekali, ia menunggu pesanan pada waktu yang ditentukan. Oleh karena itu, pengemudi menghubungi ahli logistik, mereka memantau secara khusus telemetri, dan mereka sendiri menghubungi klien berikutnya, menentukan interval waktu untuk pengiriman karena hambatan pada penghalang. Tentu saja, bagaimanapun, sedih ketika kurir terlambat. Tetapi ketika dia terlambat dan tidak memperingatkan tentang hal itu - itu bahkan lebih buruk.
Secara umum, jika dasar, ini adalah cara kami bekerja. Anda mungkin lebih tertarik untuk belajar tentang pengoperasian gudang dan WMS, atau tentang aplikasi untuk pengemudi atau pekerja gudang, atau tentang perutean, kemudian hanya menulis tentang hal itu di komentar, dan saya akan membuat posting terpisah.
Terima kasih sudah membaca.