Demo bảng điều phối giao vận

Một bàn điều phối và một màn hình tài xế trên cùng một cơ sở dữ liệu trình duyệt. Sáu mươi đơn hàng trải ba ngày, tám tài xế, và một bộ quy tắc từ chối tuyến quá tải ngay tại chỗ thả, rồi từ chối lần nữa bên trong lệnh ghi.

Mở bản demo

Mở logistics.taiphamsolutions.com trong tab mới. Không cần tài khoản, không cần đăng ký, và mọi thao tác của bạn đều không rời khỏi trình duyệt. Ứng dụng demo chỉ có bản tiếng Anh.

Bản demo này làm gì

Người điều phối có cả cái bảng: đơn chưa gán ở một bên, các tuyến trong ngày ở bên kia, kéo để gán, và thứ tự điểm dừng sắp xếp lại được. Tài xế chỉ có một tuyến cùng các điểm dừng trên đó, với lấy hàng, khởi hành, đến nơi, giao hàng và giao thất bại là những thao tác duy nhất. Quản trị viên có tài xế, phương tiện và hộp gửi đi, còn người xem thấy tất cả và không đổi được gì.

Các quy tắc nằm trong một thư mục TypeScript thuần, không có DOM, không có cơ sở dữ liệu và không có framework nào bên trong, và một bài kiểm thử đi khắp thư mục đó để giữ nguyên như vậy. Máy trạng thái của đơn hàng, bộ quy tắc tải trọng và bảng phân quyền đều là hàm, nên đúng phép kiểm tra làm mờ ô thả cũng là phép kiểm tra chạy bên trong lệnh ghi. Một thành phần giao diện quên hỏi cũng không thể tạo ra lỗi tải trọng hay lỗi phân quyền.

Một lần từ chối là một giá trị chứ không phải một ngoại lệ. Hàm bảo vệ trả về lý do nó từ chối, và lý do đó mang theo một khóa dịch, nên lời từ chối hiện ra thành một câu trong ngôn ngữ người đọc thay vì một thông báo lỗi chung chung. Trạng thái, mức ưu tiên và mã thất bại được lưu dưới dạng mã máy rồi mới dịch lúc vẽ ra màn hình, nên chuyển sang tiếng Việt cũng viết lại luôn các dòng nhật ký cũ.

Kéo một đơn hàng cồng kềnh vào tuyến xe máy. Ô thả tự vô hiệu hóa và nói rõ giới hạn nào bị phá, còn lần thử đó vẫn được ghi vào dòng thời gian kiểm toán.

Tính năng

60 đơn hàng trải ba ngày, 8 tài xế, 8 phương tiện và 18 tuyến, với một xe van đang nằm xưởng và một tài xế hết ca, được tạo sẵn ngay lần mở đầu tiên.

Bảng và kéo để gán

Đơn chưa gán, các tuyến trong ngày, và một ô thả tự vô hiệu hóa, mang theo đúng cái giới hạn nó sẽ phá làm chú thích.

Tải trọng được kiểm tra hai lần

Khối lượng, thể tích và số điểm dừng theo từng phương tiện, chặn ở giao diện và khẳng định lại ở tầng kho dữ liệu, nên không nửa nào là chốt chặn duy nhất.

Ca chạy và chứng từ giao hàng

Lấy hàng, khởi hành, đến nơi, rồi một chữ ký vẽ trên canvas, một tấm ảnh, hoặc một mã thất bại kèm ghi chú. Mỗi bước là một chuyển trạng thái hợp lệ, hoặc không có gì cả.

Dòng thời gian kiểm toán và hộp gửi đi

Mọi thay đổi đều ghi sự kiện và mục hộp gửi đi trong cùng một giao dịch, nên nhật ký không thể lệch khỏi dữ liệu mà nó mô tả.

Quy trình khép kín, từ đầu đến cuối

Mọi bước dưới đây đều diễn ra bên trong bản demo. Không có điểm nào mà công việc rời khỏi trình duyệt rồi quay lại.

  1. Đơn hàng đổ về

    Sáu mươi đơn trải ba ngày, mỗi đơn có khung giờ lấy và khung giờ giao, khối lượng, thể tích và mức ưu tiên.

  2. Dựng một tuyến

    Đơn được kéo vào tuyến của một tài xế, và giới hạn khối lượng, thể tích, số điểm dừng của phương tiện quyết định ô thả nhận cái gì.

  3. Ngày làm việc được điều phối

    Người điều phối bàn giao tuyến. Từ đây tài xế là vai duy nhất di chuyển được một điểm dừng, và chỉ trên tuyến của chính mình.

  4. Tài xế chạy tuyến

    Lấy hàng, khởi hành, đến nơi, giao hàng. Một bước nhảy mà máy trạng thái không cho phép sẽ bị từ chối kèm lý do đã dịch, chứ không bị bỏ qua lặng lẽ.

  5. Chứng từ giao hàng, hoặc một lần thất bại

    Một chữ ký trên canvas hoặc một tấm ảnh đóng lại điểm dừng. Một lần thất bại cũng đóng nó lại, kèm mã và ghi chú, vì một ngày không có gì hỏng thì không phải một ngày làm thật.

  6. Nhật ký chính là bằng chứng

    Thực thể, sự kiện kiểm toán và mục hộp gửi đi được ghi trong một giao dịch, và bộ đếm Lamport tăng ngay bên trong giao dịch đó, nên hai tab không thể sinh ra cùng một giá trị đồng hồ.

Cái gì là thật, cái gì thì không

Không có máy chủ nào phía sau, và chính điều đó quyết định cả hai cột. Cột trái là những phần mà ràng buộc ấy khiến chúng đáng được làm cho tử tế. Cột phải là những phần nó loại trừ.

Được xử lý thật

  • Tải trọng bị từ chối ngay tại ô thả, rồi bị từ chối lần nữa bên trong lệnh ghi
  • Từng dòng của bảng phân quyền, do một bài kiểm thử khẳng định chứ không do mắt người rà lại
  • Khởi động nguội khi đã ngắt mạng, kiểm tra trong trình duyệt thật trên đúng bản dựng đã đóng gói
  • Chuyển trạng thái không hợp lệ bị từ chối kèm lý do đọc thành câu trong cả hai ngôn ngữ

Cố ý không làm thật

  • Nút đổi vai không phải là xác thực. Không có máy chủ nào để xác thực, và giao diện nói thẳng điều đó
  • Hộp gửi đi không bao giờ được một máy chủ thật rút hàng. Nó được dựng thật, xem được, và một lần kết nối lại mô phỏng sẽ đẩy hết
  • Không có bản đồ, không có công cụ tìm đường và không có định vị phương tiện. Điểm dừng có tọa độ nhưng không có gì vẽ chúng lên
  • Không có gì đồng bộ giữa các thiết bị. Dữ liệu nằm theo từng hồ sơ trình duyệt, nên mở trên điện thoại là một bản mới

Được xây dựng thế nào

Phần mô tả này thuyết phục hơn cả bản thân ứng dụng, nên nó nằm ngay trên trang thay vì trong một kho mã không ai mở được.

Công nghệ
Svelte 5, TypeScript và Vite, với IndexedDB qua idb và một service worker cho lần mở khi ngoại tuyến. Không có máy chủ ứng dụng sau bất kỳ màn hình nào.
Ranh giới
Thư mục nghiệp vụ là TypeScript thuần, không DOM, không IndexedDB và không framework nào bên trong, và một bài kiểm thử đi khắp thư mục đó để giữ nguyên như vậy.
Ngân sách
60 KB gzip cho tuyến đầu tiên và 110 KB cho toàn bộ, tính từ bản kê của trình dựng chứ không đoán theo tên tệp. Hiện tại là 37,5 KB và 90,3 KB.
Kiểm thử
206 bài kiểm thử trên máy trạng thái, tải trọng, từng dòng của bảng phân quyền, tính đầy đủ của nhật ký và độ bền khi ngoại tuyến, cùng một lượt chạy khói lái bản dựng thật trong Chrome thật cho thao tác kéo, khung ký tên và lần mở khi không có mạng.

Các bản demo khác

Mỗi bản là một loại bài toán khác nhau, và tất cả đều nằm trong menu Bản demo ở đầu trang.

Muốn một bản như thế này nhưng chạy theo quy tắc của bạn?

Bản này được làm dưới một ràng buộc mà không ai tự chọn. Bản của bạn sẽ có máy chủ, tài khoản thật, và cả những phần thực sự khó trong nghiệp vụ. Hãy cho chúng tôi biết phần mềm cần làm được gì, chúng tôi sẽ nói cần những gì để làm ra nó.

Cứ mang tới bài toán còn ngổn ngang. Đó là kiểu trao đổi chúng tôi thích nhất.