Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 12 additions & 11 deletions CLAUDE.md

Large diffs are not rendered by default.

20 changes: 13 additions & 7 deletions docs/PRODUCT_SPEC.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,27 +13,31 @@

入力の順序は固定します。QR待機中にCode 128を受け取っても進まず、Code 128待機中にQRを受け取っても進みません。不一致は履歴へ保存しません。

仕向地は作業セッション単位で固定します。最初に受理したQRの仕向地をそのセッションの仕向地として確定し、以後は別の仕向地のQRを受理せず、案内を表示して工程と一致件数を保ちます。固定はカメラ・Bluetoothで共通で、「次のコードを照合」「QRを読み取りなおす」でも不一致でも解除しません。仕向地を変えるにはセッションを終了します。
仕向地は澤井製作所、モルテン、デンソーの3つです。仕向地は作業セッション単位で固定します。最初に受理したQRの仕向地をそのセッションの仕向地として確定し、以後は別の仕向地のQRを受理せず、案内を表示して工程と一致件数を保ちます。固定はカメラ・Bluetoothで共通で、「次のコードを照合」「QRを読み取りなおす」でも不一致でも解除しません。仕向地を変えるにはセッションを終了します。

## 品番の抽出と比較

QRのレコード様式は仕向地ごとに異なるため、先に仕向地を判定し、その様式の固定位置からだけ品番を取り出します
QRのレコード様式は仕向地ごとに異なるため、先に仕向地を判定し、その様式が定める場所からだけ品番を取り出します

- 仕向地「澤井製作所」のQRは66桁固定長で、1〜10桁目がカード番号(英字4文字+数字6文字)、11〜20桁目が10桁の品目番号です。以降に枝番、納入数量、指示数、工場コード、受入部品庫、供給先が続きます。
- 仕向地「モルテン」のQRは61桁固定長で、7〜16桁目が左詰めの部品番号(9桁または10桁、余りは空白)です。ほかに受注者、納品番号、納入先、TYロケーション、供給先、収容数、納入指示日(JUMP)、時刻を固定位置に持ちます。末尾の空白も1レコードの一部なので、57〜61桁で届いた読取値は空白で61桁へ補完してから解析します。
- Code 128は `品番@管理コード` 形式で、`@` より前を品番として使います。品番の表記は澤井製作所が `4-2-4`、モルテンは `4-2-3` または `4-2-4` です。
- 仕向地「デンソー」のQRはJAMA自己記述形式のかんばんレコードで、桁数は固定しません。`JAMA` + 版1桁 + ヘッダ長4桁 + 前置き10桁 + 「項目番号3桁+桁数2桁」の並び + 固定長データ部で構成し、項目定義の桁数の合計がデータ部の長さと過不足なく一致することを確かめます。品番は項目104(ハイフンなし10桁)から取り出します。項目112(収容数)と項目152(かんばん連番)も必須です。実物のかんばんは221桁・ヘッダ長119・項目21個・データ部97桁ですが、桁数ではなくヘッダの宣言どおりに解析します。
- Code 128は `品番@管理コード` 形式で、`@` より前を品番として使います。品番の表記は澤井製作所が `4-2-4`、モルテンは `4-2-3` または `4-2-4`、デンソーは `6-4` です。
- 品番は大文字化し、ハイフン・空白など英数字以外を除去して比較します。
- `@` 以降の管理コードは一致判定へ影響しません。
- どちらの様式としても解析できないQRからは品番を取り出しません。空の値、品番を抽出できない値、異なる品番は不一致です。
- いずれの様式としても解析できないQRからは品番を取り出しません。空の値、品番を抽出できない値、異なる品番は不一致です。

QRの入力は、カメラ・Bluetoothとも伝送終端(CR/LF/NUL)だけを取り除いたうえで、仕向地ごとの桁数と必須フィールドを検証します。モルテンのレコードでは空白を取り除きません。Code 128の入力も、カメラ・Bluetoothとも `4-2-4@管理コード`(モルテンは `4-2-3@管理コード` も)の業務形式を検証し、逆順入力や業務外のコードを受理しません。カメラのCode 128は形式検証を通った値だけを同一値2回の確定候補にします。
仕向地の判定はデンソーを最初に試します。澤井製作所のレコード解析は先頭10桁が英字4文字+数字6文字であればよいという寛容な条件のため、`JAMA5011...` で始まるかんばんをカード番号として受理してしまうからです。デンソーとして解析できないときにだけ、澤井製作所(66桁)、モルテン(57〜61桁)、空白を落とした澤井製作所の順で判定します。

QRの入力は、カメラ・Bluetoothとも伝送終端(CR/LF/NUL)だけを取り除いたうえで、仕向地ごとの桁数と必須フィールドを検証します。モルテンのレコードでは空白を取り除きません。デンソーのレコードも空白欄がデータなので取り除きません。Code 128の入力も、カメラ・Bluetoothとも `4-2-4@管理コード`(モルテンは `4-2-3@管理コード`、デンソーは `6-4@管理コード`)の業務形式を検証し、逆順入力や業務外のコードを受理しません。カメラのCode 128は形式検証を通った値だけを同一値2回の確定候補にします。

## 重複判定

同じ箱を二重に検査していないかは、作業セッション内の箱固有キーで判定します。キーの作り方は仕向地ごとに異なります。

- 澤井製作所: QR全文。カード番号が箱ごとに異なるため、QRだけで箱を識別できます。
- モルテン: 61桁へ正規化したQR全文とCode 128全文の組。QRは1品番1レコードで箱を区別しないため、現品票の管理コードまで含めて識別します。
- デンソー: QR全文。かんばん連番(項目152)が箱ごとに異なるため、QRだけで箱を識別できます。

品番では判定しません。同じ品番の別の箱はそれぞれ記録し、同じ箱の再読取だけを重複とします。重複は結果として表示しますが、履歴と一致件数には加えません。

Expand All @@ -43,8 +47,9 @@ QRの入力は、カメラ・Bluetoothとも伝送終端(CR/LF/NUL)だけを

- 澤井製作所: 品番ごとに数え、結果には「この品番は本セッションで n 箱目」を表示します。
- モルテン: 納品番号ごとに数え、結果には「納品番号 X は本セッションで n 箱目(累計 m 個)」を表示します。累計は同じ納品番号の各箱の収容数の合計です。
- デンソー: 澤井製作所と同じく品番ごとに数え、結果には「この品番は本セッションで n 箱目」を表示します。かんばんの指示数と収容数から求まる予定箱数は表示しません。

累計は進捗の目安であり、納品番号やセッションの完了はアプリで判定しません。
累計は進捗の目安であり、納品番号やセッションの完了はアプリで判定しません。デンソーでも同様に、指示数に対する完了は判定しません。

## 履歴とPDF

Expand All @@ -53,11 +58,12 @@ QRの入力は、カメラ・Bluetoothとも伝送終端(CR/LF/NUL)だけを
- 共通: 仕向地、セッション名、開始・終了時刻、一致件数、品番ごとの箱数、各箱の管理コードと両ペイロード全文。
- 澤井製作所: カード番号、品目番号、枝番、納入数量、指示数、工場コード、受入部品庫、供給先。
- モルテン: セッションの納品番号数と、納品番号ごとの箱数・累計収容数。各記録の受注者、部品番号、納品番号、納入先、TYロケーション、供給先、収容数、納入指示日(JUMP)、時刻。
- デンソー: 履歴詳細には各記録の帳票区分、部品番号、包装、収容数、次区、指示、かんばん連番、管理番号、納入日、便、指示数、アイテムNo、受入を出します。PDFは品番ごとにかんばんの要約(部品番号・収容数・指示数、次区・指示・納入日・便、管理番号・アイテムNo・受入)を置き、その配下の各箱へかんばん連番と管理コードを並べます。納品番号ごとの集計はモルテンだけの出力であり、デンソーには出しません。

## データとプライバシー

照合、履歴保存、音・触覚を含む基本機能は端末内で完結します。カメラ画像、不一致の値、ユーザーアカウント、分析データを外部へ送信しません。将来この境界を変更する場合は、両プラットフォームのプライバシー宣言とストア回答を更新します。

## 共通テスト資源

機械可読な入力と期待結果は [`shared/test-fixtures/matching-cases.json`](../shared/test-fixtures/matching-cases.json)、実機・エミュレーターで表示できる画像は [`shared/test-fixtures/images`](../shared/test-fixtures/images) に置きます。fixtureは`schemaVersion` 2で35ケースあり、各ケースはQRの仕向地を示す`destination`(`sawai` / `molten`)を持ちます。どちらの様式でもないQRを扱う`non-standard-qr-is-mismatch`と`empty-values`だけが`destination`を持ちません。画像は両仕向地のQRとCode 128を含み、モルテン分は `molten-` で始まる5点です。SwiftとKotlinの照合テストは、同じケースを満たすことを受け入れ条件とします。
機械可読な入力と期待結果は [`shared/test-fixtures/matching-cases.json`](../shared/test-fixtures/matching-cases.json)、実機・エミュレーターで表示できる画像は [`shared/test-fixtures/images`](../shared/test-fixtures/images) に置きます。fixtureは`schemaVersion` 2で47ケースあり、各ケースはQRの仕向地を示す`destination`(`sawai` / `molten` / `denso`)を持ちます。いずれの様式でもないQRを扱う`non-standard-qr-is-mismatch`と`empty-values`だけが`destination`を持ちません。画像は3仕向地のQRとCode 128を含み、モルテン分は `molten-` で始まる5点、デンソー分は `denso-` で始まる3点です。SwiftとKotlinの照合テストは、同じケースを満たすことを受け入れ条件とします。
Loading