コードレビュー #1220
完了ND10020_顧客新規登録 コードレビュー 2回目
0%
ファイル
渡邉 拓英 さんが1年以上前に更新 · 編集済み
まだレビュー中です。
※全てのファイルは既定のフォーマッターを使用してください。
フォーマットしてください。ctrl + shift + f
自動フォーマットはお好みで設定してください。
SVN \3-DOS_ProjectSource\環境構築\環境構築.txt
SVN \3-DOS_ProjectSource\環境構築\フォーマッター変更.xlsx
・設計書 画面項目仕様
「制御」項目の「mode1 取得先」と「disp1」はセットです。
「mode2 取得先」だけがあり、「disp2」が存在しないのは、おかしいです。
ND10020Controller
・コメントを正しく修正してください。
/**
* 顧客台帳入力選択
*/
@Controller
@RequestMapping("/ND10020")
public class ND10020Controller extends BaseController {
・JAVADOCを正しく記載してください。

/**
* COMM_AREA 顧客マスタ(基本情報)
*/
@Autowired
VKCUSTMService vkcustmService;
@Autowired
VKCUSTWService vkcustwService;
@Autowired
VKHCBKMService vkhcbkmService;
・プロパティはプロパティで宣言しない。
→JavaのWebアプリケーションでクラスのフィールド変数を使うのは危険です。(NGです)
その理由は: スレッドセーフではない(異なるリクエストでデータが競合) マルチスレッド環境でデータ競合が発生する
Singleton Beanに状態を持たせると影響範囲が広がる
/**
* プロパティ一覧
*
*/
// 所在地郵便番号フラグ
String syozaiYubinFlg = " ";
// 請求先郵便番号フラグ
String seikyuYubinFlg = " ";
// 顧客コード
String newKokyakuCd = "";
・TODOが残っています。修正してください。
//TODO トランザクションの問題(?)でマスタ更新直後のデータを取得出来ない問題が発生する
// 事象1. 01.新規登録 で遷移した時に直前に追加された初期値のSTVKCUSTWが取得できずnullになる
// 事象2. mode3で登録処理をして選択画面に遷移後、再度ここに遷移した時更新したデータを取得できない
// TODO 区分の値のみを画面から受け取る方針
// 区分名は区分と統合するデザインで仮決定したためひとまずコメントアウト
// 請求区分入力チェック区分 ※
・論理演算子 「|」が使用されています。理由が無ければ「||」で統一してください。
if (!("INP".equals(getCommAreaDt("COMM_USER", "COMM_SYOUKAI_KBN")) &&
"".equals((getCommAreaDt("ND10010", "COMM_CUSTCD")))) | "9".equals(form.getND0200098())) {
// 獲得従業員コード
disabledList.add("ND0200001");
// 担当従業員コード
disabledList.add("ND0200003");
}
// 店所コード <> 9000, 9500 または 登録抹消区分 = 9 の場合
if ((!"9000".equals(getCommArea().get().getCOMM_TEN_CODE()) &&
!"9500".equals(getCommArea().get().getCOMM_TEN_CODE())) | "9".equals(form.getND0200098())) {
// 各種区分 本社でのみ入力できる項目をロック
・実装が合っていない 9000以外且つ、9500以外は存在しません。
// 店所コード <> 9000, 9500 または 登録抹消区分 = 9 の場合
if ((!"9000".equals(getCommArea().get().getCOMM_TEN_CODE()) &&
!"9500".equals(getCommArea().get().getCOMM_TEN_CODE()))
| "9".equals(form.getND0200098())) {
・未確定ならTODOを書きましょう(可能ならレッドマインのチケットも切れば漏れが無くせます。
// 顧客台帳照会選択 に遷移
return "MP*****";
・validateModeX ※今回は、このままで問題ありません。
設計書と実装の書き方が合わないため、リスト形式で必須・形式・文字数でチェックする方式をやめました。
設計書の粒度同様に、単項目ごとにチェック処理を記載してください。
/**
* 入力チェック mode2
*
* @param form
* @param errors
* @return
*/
private BindingResult validateMode2(MPND020Form form, List<String> errors) {
// 結果
BindingResult bindingResult = new DataBinder(form).getBindingResult();
// 未入力チェック
baseRequiredCheck(form, bindingResult, errors, getRequiredListMode2(form));
// ※未入力時、この項目の以下のチェックを行わない。
if (bindingResult.hasErrors()) {
return bindingResult;
}
// 形式チェック
baseFormatCheck(form, bindingResult, errors, getFormatListMode2(form));
// 文字数チェック
baseCharCountCheck(form, bindingResult, errors, getCharCountListMode2(form));
return bindingResult;
}
サンプル BK10010
/**
* 入力チェック mode2 ※Header入力チェック 集配票、代表集配票
*
* @param form フォーム
* @param tensyoCd 店所コード
* @param commShuId commShuId
* @return
*/
private BindingResult validateMode2(MPBK020Form form, List<String> errors, Model model, ValuesRecord record) {
// 結果
BindingResult bindingResult = new DataBinder(form).getBindingResult();
// 項目チェック
// BK0200001 入力区分
// 未入力チェック ERR_1
baseRequiredCheck(form, bindingResult, errors, "BK0200001", "入力区分", "ERR_1");
// 形式チェック 数値か ERR_1
baseFormatCheck(form, bindingResult, errors, "BK0200001", "入力区分", "9", "ERR_1");
// 文字数チェック
baseCharCountCheck(form, bindingResult, errors, "BK0200001", "入力区分", 1, "ERR_1");
// 範囲チェック 1 or 4 or 5 でなければエラー ERR_1
if (!Arrays.asList("1", "4", "5").contains(form.getBK0200001())) {
baseAddError(bindingResult, "BK0200001", "ERR_1");
}
// BK0200002 回送入力票NO
// 未入力チェック 未入力の場合、この項目の以下のチェックは行わない
// var required = baseRequiredCheck(form, bindingResult, errors, "BK0200002", "入力区分", "ERR_1");
if (!form.getBK0200002().isBlank()) {
// 形式チェック 数値か ERR_1
baseFormatCheck(form, bindingResult, errors, "BK0200002", "入力区分", "9", "ERR_1");
// 文字数チェック 8桁か ERR_1
baseCharCountCheck(form, bindingResult, errors, "BK0200002", "入力区分", 8, "ERR_1");
if (!("90000000".compareTo(form.getBK0200002()) <= 0 &&
"99999999".compareTo(form.getBK0200002()) >= 0)) {
// 範囲チェック "90000000 ≦ 回送入力票NO ≦ 99999999
// 上記範囲外はエラー" ERR_1
baseAddError(bindingResult, "BK0200002", "ERR_1");
}
// 共通チェック "共通クラス[LSO0020]を使用して、末尾に付加されている「チェックデジット」が7DRか確認。
// LSO0020.処理結果がfalseの場合、エラー
// プロパティ
// チェックデジット型式:7DR
// 値:引数.画面.回送入力票NO" ERR_1
LSO0020 lso0020 = new LSO0020();
lso0020.setCheckDigitType(CheckDigitTypes.DR7);
lso0020.setDataVlaue(getFormValue("BK0200002", form));
lso0020.inspectCheckDigit();
if (lso0020.getResult() == false) {
baseAddError(bindingResult, "BK0200002", "ERR_1");
}
}
return bindingResult;
}
・設計書 「データチェック仕様」の下部
「全てのチェックがOKの場合、以下の分岐でセットするエラーコードを決定する」以下の文章は、「画面レイアウト」シートのvalidateModeX等に記載してください。
設計書はツールを使用して、ソースコードをある程度出力します。表の想定外な使用方法は、ツールで取込・出力できなくなります。
・設計書 画面項目仕様 「編集:全」や、「編集:ア」はおかしいです。「形式」ですよね。

・設計書 画面項目仕様 「mode2 取得先」のNo163 等で「画面.ND0200096」等の記載がありますが、画面に入った値は引き継がれるため、基本的に記載不要です。

MPND020Form
MPND020.html
・divの閉じタグが足りないらしいですよ

渡邉 拓英 さんが1年以上前に更新 · 編集済み
2025/05/08
ND10020Controller
・コメントを正しく修正してください。「顧客台帳入力選択」 → 「顧客基本情報入力」
/**
* 顧客台帳入力選択
*/
@Controller
@RequestMapping("/ND10020")
public class ND10020Controller extends BaseController {
・OR 請求先所在地 大字・丁目等 の頭1文字目 != '←' の場合 !のっとが無い??
if ("000000".equals(form.getND0200103())
|| "←".equals(form.getND0200104().substring(0, 1))) {
・setKokyakuDtByMPND020FormUpdate 各種マスタ関連は、既に「getDataMode2」メソッドで取得済みではないでしょうか?
不要な取得は避けた方がよいです。
・894行目「PropertieVariablemode2 pvmode23 = new PropertieVariablemode2("", "");」
フィールド変数ですよね?
JavaのWebアプリケーションでクラスのフィールド変数を使うのは危険です。(NGです)
・画面項目仕様:形式と実装の確認をお願いします。
形式:全の場合、半角「--------」を表示できません。
形式:全に対して「setInputMan('ND0200063', '', 10, '',」 ''は合っていません。
形式:全は、全角文字のみです。
形式は「日本語」ではないですか?




2683行目 処理が合っていません。左右逆です。意味を考えてください。
設計書「顧客名区分名カナ に$マーク、数字が含まれる」
if (Arrays.asList("$", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9").contains(form.getND0200009())) {
・2705行目、2710行目 コメントになっています。「新規登録の場合のみチェック」が不要であれば、清書してください。
/**
* 存在チェック
*/
private BindingResult checkIsEmptyMode2(MPND020Form form, BindingResult bindingResult,
Optional<OVJYUGY> kakuJyuDt, Optional<OVJYUGY> tantJyuDt, Optional<RDTENS> nyuuryokuTenDt,
Optional<RDTENS> kokyakuTenDt1, Optional<RDTENS> kokyakuTenDt2, Optional<RDTENS> kokyakuTenDt3,
Optional<RDTENS> kokyakuTenDt4, Optional<RDCODE> gyousyuName, Optional<VKCHINM> syozaitiNameDt,
Optional<VKCHINM> seikyuutiNameDt) {
// 画面毎のデータチェック
// 新規登録の場合のみチェック
if ("INP".equals(getCommAreaDt("COMM_USER", "COMM_SYOUKAI_KBN"))
&& "".equals(getCommAreaDt("ND10010", "COMM_CUSTCD"))) {
// 獲得従業員コード
if (kakuJyuDt.isEmpty()) {
// メッセージ設定
// baseAddError(bindingResult, "ND0200001", "ERR ");
}
// 担当従業員コード
if (tantJyuDt.isEmpty()) {
// メッセージ設定
// baseAddError(bindingResult, "ND0200003", "ERR ");
}
}