小売の現場駆動でバーコードジェネレーターをノーコードでサクッと作った

この記事は、[AEON Advent Calendar 2023](https://qiita.com/advent-calendar/2023/aeon)の３日目です🎉

https://qiita.com/advent-calendar/2023/aeon

はじめまして！
イオンリテールという、AEONグループの総合小売業の企業で働く渡邊と申します。

総合小売業とは衣・食・住・H&BCに各テナントを合わせた広い領域を扱う小売業となります。そこで現在私は**ネットスーパーの新規事業検証**に関する部署におり、本記事ではそこの現場における開発のお話をしたいかなと思います。

## バーコード生成の仕組みが急遽必要となった

さて、ネットスーパーの新規事業といってもイメージが湧かないなという方も多いかと思いますので、少しそのお話をさせていただきます。**そんなのいらん！フロントエンドのコード見せろ！という方は次の章からお読みください**（大したもんではありませんが）

具体的なお話としては、ネットスーパーの新規システム導入に関するものです。現状弊社はWebで受けたお客さまの注文の**商品リストを紙に印刷**して、店舗にて集荷（以下、ピッキングと呼びます）し、お客さまの元へ配送をおこなっています!

> <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2100048/5d2f537a-d7b7-f063-cf18-f7ef3dcf3a88.jpeg" width=50% alt="IMG_3633.JPG">
>
> 実際の紙ピッキングリスト
> ~~普通に終わってる~~

そのような非効率性を改善するために、商品受注からピッキング、ラストワンマイルの配送までを一貫して管理できるシステムの導入を検討しており、その現場での検証を私のチームで実施しております（チームメンバーは４名となりますが、本筋ではないので割愛します）

### 検証の大まかな流れと立ち上げ段階で発生した問題

その検証において、ピッキング業務部分で問題が発生しました。注文から配送までをデータ化して管理していくために、ピッキング過程で利用するカートやカゴについてもデータとして持たせる必要があるのですが、そのために大量のバーコードを生成する必要がありました。イメージとしては下の写真の通りです

> <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2100048/30e96f1e-6280-b7fd-f4f5-7c31211893c7.jpeg" width="50%" alt="IMG_0307.JPG">
>
> - こんな感じのカートにカゴを積んでピッキングします

> <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2100048/90604702-b3a6-db69-1495-2961ce0f175a.jpeg" width="50%" alt="IMG_0310.JPG">
>
> - 左下に見えるようにカゴにバーコードを貼ります
> - カートにもバーコードを貼ることで、ピッキングしているカート、カゴ、カゴの中に入っている商品を紐づけます

> <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2100048/9c5b4162-2319-bd2e-dd46-b9f3b1216c1b.jpeg" width="50%" alt="IMG_0306.JPG">
>
> - ピッキングしたカゴと保管場所（バッファリングスペース）もバーコードで紐付けします
> - バッファリングスペースと配送する車両と荷物も紐付け、お客さまのもとに商品を配送します

### 開発するための要件

　このように、お客さまの注文 => カゴ => ピッキングするカート => バッファリングスペース => 配送車両 それぞれをバーコードスキャンしながら紐づけていく都合上、各課程において各器具ごとに**全て異なるバーコードを生成し貼り付ける**ことが必要となりました。さらに、検証を実施している都合上、**急遽予定外のバーコードが必要となる**場合もあり、既存のWebサービスとして存在しているバーコードジェネレーターでは非常に非効率な検証となることが予想されました。要件をまとめますと、

- 大量のバーコードを生成することが必要
- 突発的にバーコードを生成することも必要
- 店舗の売場でもスマートフォンなどで参照することが必要

このことから、URLを参照すればPCでもスマートフォンでも利用できるWebを媒体としてバーコードジェネレーターを生成することとしました

## 作成したプロダクト

次のURLにある通りのバーコードジェネレーターを作成しました。OGPも設定せず、タイトルもまんまと、プロトタイプ感満載ですね。

https://simplebarcodegen.netlify.app/

実装のGitHubはこちら

https://github.com/watanabe-tsubasa/barcode_generator/tree/main

OGPのバー見ればわかるように、**TypeScriptというノーコードツールを用いて作成しました**。GitHub見ればわかるよーという方は是非ともみてみてください。

### 動作・使い方

> <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2100048/bd02ff0b-1cb8-b789-fa84-8e12bd0239e8.gif" width=75% alt="単一.gif">
> 
> 単一のバーコードを売場で生成したい時などは、この様に入力すれば生成します

> <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2100048/73f90fc8-ccfb-cebe-5e07-8d9108625949.gif" width="75%" alt="複数.gif">
>
> 複数生成時はCSVをアップできます

これらは運用に必要な器具類を登録するためのCODE128というバーコード規格となります。
商品のバーコードを生成するときは、EAN13などを選んでください。

> <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2100048/f3198b88-57ed-1659-50b9-8a393da6b288.png" width="75%" alt="スクリーンショット 2023-12-04 9.12.49.png">
>
> 商品の場合この様に生成されます

### 実行環境

```json: package.json
{
  "name": "app",
  "private": true,
  "version": "0.0.0",
  "type": "module",
  "scripts": {
    "dev": "vite",
    "build": "tsc && vite build",
    "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0",
    "preview": "vite preview"
  },
  "dependencies": {
    "@chakra-ui/icons": "^2.1.1",
    "@chakra-ui/react": "^2.8.1",
    "@emotion/react": "^11.11.1",
    "@emotion/styled": "^11.11.0",
    "@types/encoding-japanese": "^2.0.3",
    "@types/jsbarcode": "^3.11.3",
    "encoding-japanese": "^2.0.0",
    "framer-motion": "^10.16.4",
    "jsbarcode": "^3.11.5",
    "react": "^18.2.0",
    "react-dom": "^18.2.0",
    "react-error-boundary": "^4.0.11"
  },
  "devDependencies": {
    "@types/react": "^18.2.15",
    "@types/react-dom": "^18.2.7",
    "@typescript-eslint/eslint-plugin": "^6.0.0",
    "@typescript-eslint/parser": "^6.0.0",
    "@vitejs/plugin-react": "^4.0.3",
    "eslint": "^8.45.0",
    "eslint-plugin-react-hooks": "^4.6.0",
    "eslint-plugin-react-refresh": "^0.4.3",
    "typescript": "^5.0.2",
    "vite": "^4.4.5"
  }
}

```

- バーコードジェネレーターとしては[jsbarcode](https://www.npmjs.com/package/jsbarcode)を選択

https://www.npmjs.com/package/jsbarcode

最近まで更新が続いている（記事執筆時にも Last publishが 20 days ago）のと、TSネイティブサポートされているのが主な理由です。
必要なバーコード規格も問題なくカバーされておりました（CODE128, EAN-13, EAN-8）。

- UIは慣れている[ChakraUI](https://chakra-ui.com/)

https://chakra-ui.com/

webページが見やすく、目当てのUIを探しやすいので好みです

- ホスティングはNetlify

### 開発環境

![スクリーンショット 2023-12-04 7.28.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2100048/6e2987bb-1548-7f6b-6f5e-e159cb135aea.png)


**最速の肉まん**

https://bun.sh/

ver 1.0.6だったと思う。
これ使ったらもう`Node.js`には戻れない。

私はMacでやるときはローカルのVScode（今後はcursorかな）で開発していますが、windowsの方でもGitHub CodeSpacesなどで 

```bash
curl -fsSL https://bun.sh/install | bash
```

これを実行していただければ使えますので試してみてください。

::: note
2024.05.31追記 windowsのbunもリリースされました
:::

これで、

```bash
bun create vite app
```

で`vite`をバンドラーとして利用するReactプロジェクトを開始できます。`Next.js`使うまでもないけど、`create-react-app`は公式非推奨だしなあ、という感じの規模感で安定して動いているので便利です。

https://bun.sh/guides/ecosystem/vite

### 気をつけた点の解説

以下、後日詳細追記します。🙇‍♂️

#### Global State

今回はバーコード体系を Context　系統のHooksを用いて管理しました。
CSVファイルを読み込ませる時にバーコード生成コンポーネントに対してバケツリレーが発生することを防ぐためです

#### バーコードを生成する部分

svgで生成してuseRefで頑張る感じ

#### ToastのカスタムHook

alertは動作が止まってダサいので、ChakraUIのToastをラップしたカスタムHookで出すようにしています

#### コンポーネントの構成

よくあるアトミックデザインで

#### TypeScript はノーコードツールなのか

サジェスト効きまくって、修正もバシバシ入って、ほとんど自分でコード書いている感覚ないです。だからノーコード！
というと、少し嫌味っぽいかもしれませんが、JSに抵抗感があった方程TSに乗り換えてほしいかなとおもっています。型を定義しなければいけないというのが私も昔はハードル高いのではと思っていましたが、実際は実行時にエラーが発生することが明らかに減り、前述の通りサジェストも非常に有効で、慣れてしまえばJS書きたくないなと思えるほどでした。

#### 作るのにどれくらいかかったのか

1時間

## このプロダクトの現在

作成自体は10月の下旬で、現在は順調とはいえないものの検証系が立ち上がり、日々ピッキング作業ができている状況ですので、ひとまず役割を終えたのかなと思っています。

このように現場の一従業員が開発できると、スピード感のある新規事業展開につながることを実感できましたので、これからも頑張っていきたいと思います。

明日は @hikkie さんの New Relic系の記事となります！
是非とも次も読んでくださいね！