Enterprise Resource Planning Blogs by SAP
Get insights and updates about cloud ERP and RISE with SAP, SAP S/4HANA and SAP S/4HANA Cloud, and more enterprise management capabilities with SAP blog posts.
cancel
Showing results for 
Search instead for 
Did you mean: 


英語版はこちらからアクセスできます。

Enhancing Quality Inspection in EWM with OCR: The QM Quick Inspect App

要約


SAP Build Apps、SAP BTP Kyma、SAP S/4HANA、Amazon Textractを組み合わせることで、品質管理のデータ入力作業を文字認識技術に置き換えることができ、工場で働く品質管理担当者の作業時間を短縮できます。

注意: 品質管理(QM)モジュールでは通常 "Inspection"の訳語として”検査” という用語が使われますが、アプリで撮影した用紙では "点検" という言葉が用いられています。したがって、アプリ内の用紙に関連する文脈では "点検"、それ以外は "検査" という用語を使用していくことにします。

ユースケース


ある日本の天井クレーン製造会社は、天井クレーンの出荷前に安全検査を実施しています。この検査には全72項目の点検項目があり、結果は "良" や "修理" を表した、AやBなどの略語を用いています。この企業はSAP S/4HANA EWMを倉庫管理に導入しており、出荷時の品質検査プロセスもそのシステム上に組み込みたいと考えていました。しかし、点検報告書を紙で記入していて、数十項目もの点検項目を手入力で送信する作業に手間がかかっていました。その作業を効率化するため、文字認識技術を活用して点検項目結果を自動的に解析し、API通信でSAP S/4HANAの品質管理モジュールにその解析結果から作られた品質検査結果と使用決定を送信するアプリを開発しました。


アーキテクチャ



ソリューションアーキテクチャ




  • SAP Build Apps:  ローコードノーコードサービスで、豊富なコンポーネントと関数がデフォルトで用意されており、少ない労力でアプリを開発できます。また、UIベースのデプロイ機能や、API通信で受け取ったオブジェクトの型から型定義を自動的に行う機能、コーディングの補完機能などが備わっているため、プログラミングに不慣れな人でも開発しやすいサービスとなっています。

  • Kyma: マイクロサービスアーキテクチャに基づいたプラットフォームで、異なるサービス間のAPI管理などの機能を提供するオーケストレーションアプリです。このプロジェクトでは、Kyma上でNode.jsのミドルウェア開発を行いました。詳細なアーキテクチャについては、以下のリンクを参照してください。


Architecting Out-of-the-Box Node.js Middleware Development for SAP S/4HANA

  • SAP S/4HANA: EWM(拡張倉庫管理)とQM(品質管理)モジュールを使っています。Embedded EWMでは、QMモジュールで製品の品質を担保しながら顧客や他の倉庫に配送できます。今回の EWMモジュールを使った品質管理の設定と作成したアプリと同様の流れをSAP S/4HANA上で再現する方法については、以下の2つのリンクに記載していますので、必要に応じて参照してください。また、それらの記事では入庫時の品質管理についての手順が書かれていますが、Inspection typeを変更することで、出荷時の品質管理ができます。


Customizing: Quality Inspection in EWM under No Inspection Rule

Execution: Quality Inspection in EWM under No Inspection Rule

  • Amazon Textract: 光学的文字認識(OCR)を行うことができ、表形式の文字認識機能も備えています。


品質管理の基本的なフロー


アプリケーションの説明に入る前に、品質管理の基本的な流れを見てみましょう。




品質管理の基本的なフロー


品質検査計画

品質検査計画は、製品の品質検査手順と仕様を説明したものです。この計画には、検査手順、検査特性、およびその他のデータが含まれます。検査計画には複数の品質検査工程を設定でき、各工程には複数の品質検査特性があります。今回の検査用紙の例では、2列目の項目が品質検査工程に対応し、「ロードチェーン」や「走行レール」などが該当します。一方、表の点検項目は品質検査特性に該当し、「キズ、変形はないか」や「取付ボルトの緩み、脱落の有無」などが含まれます。


品質検査計画の構成



点検報告書


品質検査ロット

品質検査ロットは、品質検査に関連する情報を記録、処理、管理するためのものです。これには検査処理データ、検査結果、査定コスト、使用決定などが含まれます。前述の品質検査計画を特定の検査ロットに割り当てることで、製品の品質検査を実施できます。

品質検査結果

品質検査結果は、実際の品質検査の結果を指します。これには、検査中に得られた試験値や評価が含まれます。検査結果は、製品が品質基準を満たしているか、欠陥が見つかったかを示します。

使用決定

使用決定は品質検査結果に基づいて行われ、その後フォローアップアクションが発生します。フォローアップアクションとして、Accepted(承認)されると出荷手続きが進行し、Rejected(拒否)されるとさらなる検査や分析のために出荷中止などのプロセスが続きます。また、使用決定のための検査スコアがあり、これはSAP S/4HANA内で採点方式と合格基準を調整できます。今回の天井クレーンの場合、すべての点検項目でA(良い、Accepted)、すなわち検査スコアが100点でなければなりません。1つでも問題がある場合は出荷を中止し、その項目に対して修理依頼を要請します。


品質検査結果と使用決定


今回のアプリケーションは倉庫内の品質検査者が使用するものであるため、品質検査計画や品質検査ロットの生成には関与せず、検査ロットの情報をもとに品質検査結果と使用決定を処理します。

アプリのメインプロセスとその実装


品質検査リストページ - 進行中のリスト

このページでは、品質検査対象の一覧を表示します。提供されているクエリパラメータを利用することで、日付範囲や検査の完了状況を絞り込んで検索できます。
















テクニカルサービス名 API_INSPECTIONLOT_SRV
HTTP Method GET
エンドポイントとクエリパラメータ /A_InspectionLot?$filter=InspectionLotStartDate ge datetime'2023-09-01T00:00:00' and InspectionLotStartDate le datetime'2023-09-30T23:59:59' and to_InspectionLotWithStatus/InspLotStatusInspCompleted eq null and Plant eq '1710'





品質検査リストページ - 進行中




日付範囲を定めるためのカレンダーは、SAP Build Appsのマーケットプレイスにある"Date field"というコンポーネントをインストールすることで利用できます。


マーケットプレイスにあるDate fieldコンポーネント



品質検査リストページ - カレンダー


画像解析ページ

品質検査リストページで選択した検査ロットに関する検査用紙の写真を撮影し、それをAmazon Textractを使って解析します。




画像解析ページ




解析結果ページ - 解析結果の取得

解析結果、日本語と英語データ、品質検査特性を含むocrオブジェクトをSAP Build Appsに渡します。

まず、解析結果について見ていきます。Amazon Textractのレスポンスは以下のようになっています。
{
Blocks: [
{
BlockType: "WORD",
Confidence: 99.12993621826172,
Text: "B",
TextType: "HANDWRITING",
Geometry: {
//...
},
Id: "0cafe990-c84d-4113-a413-6905c0ba0ca2",
},
{
BlockType: "CELL",
Confidence: 87.060546875,
RowIndex: 3,
ColumnIndex: 5,
RowSpan: 1,
ColumnSpan: 1,
Geometry: {
// ...
},
Id: "c310d6ad-9390-4b3f-a38f-7759daa009a8",
Relationships: [
{
Type: "CHILD",
Ids: ["0cafe990-c84d-4113-a413-6905c0ba0ca2"],
},
],
},
// ...
],
};

BlockType、RowIndex、ColumnIndex、RelationshipsのIdsを使って各点検項目の点検番号(index)と検査結果を含むオブジェクトの配列を作成します。
[
{
index: "1",
inspectionResult: "A",
},
{
index: "2",
inspectionResult: "A",
},
// ...
];

次に、日本語と英語データに関して説明させていただきます。Amazon Textractには現在(2023/9/12)、表形式の日本語データの解析機能がないため、Node.js上に点検項目の日本語データとそれを翻訳した英語データを直接作成します。

最後に品質検査特性についてですが、ある検査ロットに対する検査特性一覧を取得します。検査項目の検査工程ID、検査特性ID、定性特性か定量特性といった情報が記載してあります。















テクニカルサービス名 API_INSPECTIONLOT_SRV
HTTP Method GET
エンドポイントとクエリパラメータ

/A_InspectionCharacteristic?$filter=InspectionLot eq '17000001000'


取得した検査特性一覧のレスポンスで必要なものだけを取り出すと、
[
{
InspectionLot: "17000001000",
InspPlanOperationInternalID: "1",
InspSpecIsQuantitative: false,
InspectionCharacteristic: "10",
SelectedCodeSet: "QUAL-CRN",
},
{
InspectionLot: "17000001000",
InspPlanOperationInternalID: "1",
InspSpecIsQuantitative: false,
InspectionCharacteristic: "20",
SelectedCodeSet: "QUAL-CRN",
},
// ...
];

今回の72項目は全て定性特性であるため、どのような定性基準を使うかといった情報も取得する必要があります。そのためにSelectedCodeSetを後ほど使用します。

そして、このそれぞれの検査項目と先ほどAmazon Textractから解析結果を紐づけます。こうして作られたocrオブジェクトをSAP Build Appsに送信します。
const ocr = [
{
jaID: "押釦スイッチ",
enID: "Button",
isShow: true,
characteristicList: [
{
index: "1",
inspectionOperationJA: "押釦スイッチ",
inspectionOperationEN: "Button",
inspectionCharacteristicJA: "ケース、 方向表示の損傷",
inspectionCharacteristicEN:
"Damage to the case and direction indicators",
inspectionResult: "A",
inspectionResultText: "Accepted",
lotID: "17000001000",
operationID: "1",
characteristicID: "10",
catalogName: "QUAL-CRN",
chacteristicAttributeID: "",
resultCategory: "",
validValuesNumber: 1,
},
{
index: "2",
inspectionOperationJA: "押釦スイッチ",
inspectionOperationEN: "Button",
inspectionCharacteristicJA: "スイッチの作動状態、ゴムカバーの亀裂",
inspectionCharacteristicEN:
"Operational status of switches and cracks in rubber covers",
inspectionResult: "A",
inspectionResultText: "Accepted",
lotID: "17000001000",
operationID: "1",
characteristicID: "20",
catalogName: "QUAL-CRN",
chacteristicAttributeID: "",
resultCategory: "",
validValuesNumber: 1,
},
// ...
],
},
{
jaID: "ロードチェーン",
enID: "Load chain",
isShow: true,
characteristicList: [
{
index: "5",
inspectionOperationJA: "ロードチェーン",
inspectionOperationEN: "Load chain",
inspectionCharacteristicJA: "キズ、変形は無いか",
inspectionCharacteristicEN: "Check for scratches and deformations",
inspectionResult: "D",
inspectionResultText: "Defective",
lotID: "17000001000",
operationID: "2",
characteristicID: "10",
catalogName: "QUAL-CRN",
chacteristicAttributeID: "",
resultCategory: "",
validValuesNumber: 1,
},
// ...
],
},
// ...
];

SAP Build AppsではReact NativeやFlutterなどのモバイルアプリ開発フレームワークと同様に、配列に繰り返し処理を用いることで、配列の各要素の情報を持つコンポーネントを作成することができます。これを使って、operationList(検査工程一覧)とそれぞれのcharacteristicList(検査特性一覧)に対してコンポーネントを作成します。


コンポーネント生成のためのocr (operation list)に対する繰り返し処理 



コンポーネント生成のためのcharacteristic listに対する繰り返し処理


そして、各要素のindexなどの値を適宜コンポーネントのContentなどに代入します。


Characteristic listの各indexの代入


このようなプロセスで作成された解析結果ページが下の画像です。


解析結果ページ


解析結果ページ - 検査結果と使用決定をSAP S/4HANAに送信

検査結果と使用決定をSAP S/4HANAに送信するために、まずそれぞれの品質特性に対するカタログ(選択肢のリスト)をSelectedCodeSetを使って取得します。パフォーマンスを向上させるために、これらのリクエストにキャッシュを利用します。
















テクニカルサービス名

API_CHARCATTRIBUTECATALOG_SRV

HTTP Method GET
エンドポイントとクエリパラメータ /A_CharcAttribSeldSetCode?$filter=CharacteristicAttributeCodeGrp eq 'QUAL-CRN'
















テクニカルサービス名

API_CHARCATTRIBUTECATALOG_SRV

HTTP Method GET
エンドポイントとクエリパラメータ /A_CharcAttribSeldSetCodeT?$filter=CharacteristicAttributeCodeGrp eq 'QUAL-CRN'




この二つのGETリクエストによって得られるAPIレスポンスを組み合わせます。
[
{
CharacteristicAttributeCodeGrp: "QUAL-CRN",
CharacteristicAttributeCode: "1",
CharcAttributeValuation: "A",
CharacteristicAttributeCodeTxt: "Accepted",
},
{
CharacteristicAttributeCodeGrp: "QUAL-CRN",
CharacteristicAttributeCode: "2",
CharcAttributeValuation: "R",
CharacteristicAttributeCodeTxt: "Repair",
},
{
CharacteristicAttributeCodeGrp: "QUAL-CRN",
CharacteristicAttributeCode: "3",
CharcAttributeValuation: "R",
CharacteristicAttributeCodeTxt: "Observation",
},
{
CharacteristicAttributeCodeGrp: "QUAL-CRN",
CharacteristicAttributeCode: "4",
CharcAttributeValuation: "R",
CharacteristicAttributeCodeTxt: "Defective",
},
];

ocrオブジェクトのinspectionResult(A, B, C, Dのいずれか)に対応するものをinspectionResultTextを使って、カタログから探します。
const findCharacteristicAttribute = (inspectionResultText) => {
const foundCharacteristic = catalog.find(
(characteristic) =>
characteristic.CharacteristicAttributeCodeTxt === inspectionResultText
);

if (foundCharacteristic) {
return {
CharacteristicAttributeCatalog:
foundCharacteristic.CharacteristicAttributeCode,
CharacteristicAttributeCode:
foundCharacteristic.CharacteristicAttributeCode,
InspectionValuationResult: foundCharacteristic.CharcAttributeValuation,
};
} else {
// Error handling
}
};

72個の検査特性に対して、findCharacteristicAttributeで取得したオブジェクトとID情報などをSAP S/4HANAに送ります。















テクニカルサービス名 API_INSPECTIONLOT_SRV
HTTP Method POST
エンドポイント

/A_InspectionResult



// Headers
{
"Content-Type": "application/json",
"x-csrf-token": "ZAaslFH-gRaItcYMUQ_SWw==\r",
Cookie: "sap-usercontext=...",
}
// Body
{
InspectionLot: "17000001000",
InspPlanOperationInternalID: "1",
InspectionCharacteristic: "10",
CharacteristicAttributeCatalog: "1",
CharacteristicAttributeCodeGrp: "QUAL-CRN",
CharacteristicAttributeCode: "1",
InspResultValidValuesNumber: "1",
InspectionResultText: "",
InspectionResultHasLongText: "",
InspectionValuationResult: "A",
InspectionResultStatus: "5",
};

次に使用決定に関するHTTPリクエストを送信しますが、使用決定に対して、想定している更新状態がNode.js側(クライアント側)とサーバー側で一致していることを保証するために、検査ロットに関するGETリクエストでChangedDateTimeという値を取得し、ETagとして使います。
















テクニカルサービス名 API_INSPECTIONLOT_SRV
HTTP Method GET
エンドポイント

/A_InspectionLot('17000001000')


SAP S/4HANA上で「UD01」という使用決定グループの「A1」という使用決定コードに対するフォローアップアクションを「検査済みの製品をステージングエリアに移動させる」というように設定されているため、リクエストの際にフォローアップアクションに関する情報を別途渡す必要はありません。

















テクニカルサービス名 API_INSPECTIONLOT_SRV
HTTP Method POST
エンドポイント

/A_InspLotUsageDecision




// Headers
{
"Content-Type": "application/json",
"x-csrf-token": "ZAaslFH-gRaItcYMUQ_SWw==\r\n",
Cookie: "sap-usercontext=...",
}
// Body
{
d: {
InspectionLot: "17000001000",
InspLotUsageDecisionLevel: "L",
InspectionLotQualityScore: "100",
InspLotUsageDecisionCatalog: "3",
SelectedCodeSetPlant: "1710",
InspLotUsgeDcsnSelectedSet: "UD01",
InspLotUsageDecisionCodeGroup: "UD01",
InspectionLotUsageDecisionCode: "A1",
ChangedDateTime: "/Date(1563885880000+0000)/",
},
};

この一連のHTTPのやり取りによって品質検査を完了させます。


解析結果ページ - 品質検査完了


品質検査リストページ - 完了したリスト

品質検査リストページで17000001000の検査ロットのステータスが進行中から完了に変わったことが確認できます。


品質検査リストページ - 完了



終わりに


このプロジェクトでは、SAP Build Apps、SAP BTP KymaとNode.js、SAP S/4HANA、およびAmazon Textractを組み合わせて、品質管理のデータ入力作業を効率化しました。要件に応じて以下のような機能を追加することも考えられます。

  • 検査結果の確認機能: 入力ミスが絶対に許されない検査項目に対しては、解析された検査結果をモーダルで表示し、ユーザーが間違いがないか確認できる機能を追加します。これにより、品質データの正確性を確保できます。

  • 写真による解析精度向上: 解析結果の精度が低い場合、1つの点検用紙に対して2枚の写真を撮り、解析ミスを防止する機能を組み込みます。解析精度は学習データや解析する文字、文字数、言語などに大きく依存するという点に注意が必要です。



  • 紙の点検用紙の代替: 品質管理プロセスにおいて、手袋をつける必要がない場合、紙の点検用紙ではなく直接モバイルアプリ上で点検報告を作成する機能を追加します。これにより、紙媒体に介在するプロセスを無くせます。


参考文献