+17

Sử dụng Slack và GAS để tự động đặt cơm hộp trong công ty

Tình cờ mình đọc được bài viết khá hay ho về cách viết chương trình Order cơm tự động, nên muốn giới thiệu cho các bạn cùng ngâm cứu. Biết đâu lại có cao nhân vận dụng và viết tool đặt chè, trà sữa cho team (hehe)

Nội dung bài dịch.

Bối cảnh

Ở công ty chúng tôi có chế độ “Cơm trưa miễn phí”. Những ai đặt cơm từ ngày hôm trước sẽ được công ty trả tiền cơm cho.(Qúa tuyệt vời, ahjhj) ) Gần công ty chúng tôi có quán bento (cơm hộp kiểu Nhật) vừa rẻ vừa ngon. Cơm còn được free ship nữa. Tuy nhiên, quán bento chỉ nhận order qua điện thoại hoặc FAX nên ngày nào cũng phải có một người trong công ty chúng tôi tổng hợp, chốt order và tính toán tiền và gửi số lượng order cơm cho quán bento này. Việc này khá là tốn nhiều thời gian và hơi phiền. Cụ thể, hàng ngày người chốt order sẽ phải làm những công việc cụ thể như sau: • Kêu gọi: Hỏi xem “Ngày mai có chế nào đặt cơm không? • Remind: trước khi chốt phải remind những người chưa trả lời ngay được do bận công việc…v.v • Cancel: Khi chốt order xong, cũng sẽ có trường hợp có người cancel, bỏ không đặt cơm nữa. => trừ người này ra và tính lại số lượng cơm cần đặt. • Chốt lần cuối & Order với quán cơm: sau khi tổng hợp cần đặt bao nhiêu suất cơm, sẽ điện thoại hoặc fax đơn hàng đến cho quán. Thông thường sẽ có người thực hiện những công việc trên. Tuy nhiên, ở công ty chúng tôi có ít người, mà ai cũng bận nên không thể làm như cách truyền thống được. Chúng tôi đã tự động hóa việc đặt cơm này, sao cho effort con người là ít nhất. Do vậy, công ty chúng tôi đã sử dụng slack và GoogleAppScript để tự động hóa việc order cơm. Sau đây, tôi sẽ giải thích lần lượt về cách làm. Mời các bạn tham khảo. Biết đâu các bạn cũng tự viết tool đặt cơm, gọi trà sữa cho team mình (yeah3)

Đầu tiên, hãy xem thành quả mà chúng tôi đã phát triển

Kêu gọi

Slack sẽ tự tính số người order (những người để PHẨY)

Remind

Remind mọi người khi đến deadline đăng ký cơm trưa

Sẽ remind như trên (Remind khi đến giờ chốt)

Cancel

Những người đã order xong nhưng muốn cancel

Thì sẽ đánh dấu gạch dưới

Xác định số lượng & Order cho quán cơm

Sẽ làm như sau (Sau khi đã quyết định số lượng, sẽ tự động xác định số lượng, và gửi FAX đến quán cơm)

Các bạn thấy không, tất cả các thao tác trên đều được thực hiện tự động.

Trước khi giới thiệu về hệ thống này, tôi muốn giới thiệu với các bạn sự tiện lợi của GAS (Google App Script) – tool mà công ty sử dụng rất nhiều cho ứng dụng này.

GoogleAppScript

GoogleAppScript (viết tắt: GAS) là dịch vụ mà người dùng có thể viết ra các web app có liên kết với các hệ thống của Google như Gmail, SpreadSheet...v.v một cách đơn giản bằng Javascript
Ưu điểm • Không cần server • Miễn phí (Thần thánh @.@) • Có thể dùng được nhiều API có liên kết với các Service khác của Google Nhược điểm • Khó chỉnh sửa editor trên browser, chưa hoàn thiện) • Viết nhiều API nên khi làm với nhiều API thì không thể chia file được => Khá tù • Thời gian xử lý timer lệch khoảng 1 giờ. Khá là lâu Trên đây, mình đã trình bày các ưu điểm và nhược điểm của GAS. Tuy nhiên, nếu bạn muốn làm 1 app đơn giản, miễn phí, không cần tới Server thì mình nghĩ GAS khá phù hợp. (Tuy nhiên, nếu bạn muốn làm ở mức phức tạp hơn conbot bento – cơm hộp, thì mình nghĩ các bạn nên dùng Framework thì tốt hơn)

CẤU TRÚC

Đến khi thống kê số lượng Order Các bước xử lý thống kê số lượng được cấu tạo như sơ đồ trên.

Kêu gọi và Remind

Đầu tiên, khi kêu gọi “Ngày mai có ai đặt cơm hộp khônggggg?”, bạn sẽ gọi ra IncomingWebhook của Slack bằng Xử lý timer của GAS.リPhần remind cũng đang thực hiện xử lý giống như vậy.

function setCallTrigger() {
    for (var i = 0; i < Const.triggers.triggerDays.length; i++) {
      ScriptApp.newTrigger("triggerCall")
        .timeBased()
        .onWeekDay(Const.triggers.triggerDays[i])
        .atHour(Const.triggers.callTrigger.hour)
        .nearMinute(Const.triggers.callTrigger.minute)
        .create();
    }
  }
...
  function triggerCall() {
    loadSlackModule().send_slack('<!channel> Có ai đặt cơm trưa không?');
  }

Khi Order, cancel: Nếu ai đó mention là 「ノ」/Có; 「_」/Cancel như dưới đây: thì sẽ setting OutgoingWebHook để bắn POST request lên GAS

Trên GAS sẽ lặp lại xử lý theo các request được gửi đến và thêm hoặc bớt số lượng Order vào SpreadSheet số người đã mention. Sau khi hoàn tất sẽ trả về câu trả lời (số lượng đặt cơm) trên Slack.

function doPost(e) {
  var request = parse_request(e);
  var commandar = loadCommander();

  #phân chia xử lý
  switch (true) {
    case /^obento/.test(request.text):
      commandar.command_order(request);
      break;
    case /^ノ/.test(request.text):
      commandar.command_add(request);
      break;
    case /^_/.test(request.text):
      commandar.command_cancel(request);
      break;
    default:
      no_command(request);
  }
...
}
...
  # Order
  Commandar.command_add = function(request) {
    var date = loadDateUtils().parseDateTime(request.text);
    SpreadSheet.write_sheet(request.user, date, 1);
    var amount = loadSummerizer().summerizeOrder().orderAmount;
    var slack_result = "<@" + request.user + "> \n" + (date.getMonth() + 1) + "月" + date.getDate() + "Đã ghi order ngày hôm nay. \n  Thống kê ở thời điểm hiện tại" + amount + "suất"
    loadSlackModule().send_slack(slack_result)
  }

  # Cancel
  Commandar.command_cancel = function(request) {
    var date = loadDateUtils().parseDateTime(request.text);
    SpreadSheet.write_sheet(request.user, date, -1);
    var amount = loadSummerizer().summerizeOrder().orderAmount;
    var slack_result = "<@" + request.user + "> \n" + (date.getMonth() + 1) + "月" + date.getDate() + "Đã cancel số lượng order ngày hôm nay.  \n Thống kê ở thời điểm hiện tại" + amount + "suất"
    loadSlackModule().send_slack(slack_result)
  }

Confirm số lượng và Order đến quán cơm

Phần confirm số lượng & đặt hàng sẽ theo sơ đồ trên.

Confirm số lượng

Đầu tiên, khi đến thời gian chốt order, GAS sẽ lấy giá trị thống kê trên SpreadSheet, rồi tổng hợp, confirm là hôm nay order bao nhiêu suất. Xử lý khi order với quán cơm. Hiện tại, để gửi FAX số lượng order cho cửa hàng, chúng tôi đang sử dụng service gửi fax thông qua mail, có tên là efax. Dịch vụ này cũng có API nhưng việc xử lý nó khá phức tạp nên chúng tôi đã sử dụng GmailAPI của GAS và thực hiện gửi fax gián tiếp - gửi fax thông qua mail trên efax.

  Commandar.command_order = function (request) {
    // *prod*
    var fax_email_address = "xxxxxxxxx@efaxsend.com"
    var params = parse_order_text(request.text);
    var subject = "Công ty MAMORIO " + params.month + "tháng" + params.day + "Order trong 1 ngày"
    var body = "Hello. Công ty MAMORIO đây ạ." + params.month + "tháng" + params.day + "ngày, Hôm nay chúng tôi đặt cơm. Số lượng:" + params.amount + "suất"

    // *gửi mail*
    MailApp.sendEmail(fax_email_address,
      subject,
      body);

    // *Thông báo kết quả trên slack*
    var slack_result = "<@" + request.user + ">" + params.month + "tháng" + params.day + "ngày" + params.amount + "đã đặt n suất. (Sau khi gửi FAX xong sẽ thông báo tại đây)"
    loadSlackModule().send_slack(slack_result)
  }


Thông báo hoàn tất việc gửi Fax

Cuối cùng, thông báo hoàn tất việc gửi fax sẽ được gửi về nơi gửi (From) thông qua Gmail. Vì đang dùng email App trong Slack, nên thông báo này cũng được bắn lên channel Bento-cơm trưa trên Slack

Kết bài

Bằng việc sử dụng GAS, chúng ta có thể dễ dàng nâng cao hiệu suất công việc. Nếu có thời gian, các bạn hãy làm thử xem sao nhé! Bạn nào muốn tham khảo code thì có thể xem source code tại gist Mình đã up lên đó rồi.

Link bài gốc: http://qiita.com/kazuooooo/items/3a605a4d0e20df870eaf?utm_source=Qiitaニュース&utm_campaign=847b787450-Qiita_newsletter_259_10_05_2017&utm_medium=email&utm_term=0_e44feaa081-847b787450-33433141

Sưu tầm & Dịch bài : Thanh Thảo


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí