From 96315d5f8f24dbb77cc226e857c8a02c513942fc Mon Sep 17 00:00:00 2001 From: xuejiahao Date: Wed, 11 Mar 2026 17:43:03 +0800 Subject: [PATCH] apply pattern when username change --- .../pvc-desktop-main.js | 87 +++++++++++++----- .../pvc-desktop-main.js | 88 +++++++++++-------- .../pvc-desktop-view.js | 19 ++++ 3 files changed, 135 insertions(+), 59 deletions(-) diff --git a/src/サービスレポート・出張経費精算入力/pvc-desktop-main.js b/src/サービスレポート・出張経費精算入力/pvc-desktop-main.js index d7b040a..ad81605 100644 --- a/src/サービスレポート・出張経費精算入力/pvc-desktop-main.js +++ b/src/サービスレポート・出張経費精算入力/pvc-desktop-main.js @@ -144,27 +144,7 @@ // 管理者かどうかを取得 isAdmin = groupCodes.indexOf(adminGroupCode) !== -1; - var editUserCode = record.engineer_mechanic.value.length > 0 ? record.engineer_mechanic.value[0].code : ""; - return getSystemControlRecord(editUserCode).then(function (systemRecord) { - if (systemRecord != null) { - // サービスレポート承認者グループに所属するユーザーかどうかを取得 - const serviceReportAuthorizerCodes = - systemRecord.サービスレポート承認者グループ.value.map(function ( - group - ) { - return group.code; - }); - isServiceReportAuthorizer = serviceReportAuthorizerCodes.some( - function (serviceReportAuthorizerCode) { - return groupCodes.indexOf(serviceReportAuthorizerCode) !== -1; - } - ); - - // システムコントロール情報の設定 - setSystemControlField(systemRecord, record); - setSystemInfo(record); - } - }); + return fetchSystemControlAndUpdateFields(record, groupCodes); }) .then(function () { setHiddenField(isAdmin); @@ -183,6 +163,41 @@ } ); + /** + * 「engineer_mechanic」変更時の処理を行います。 + */ + kintone.events.on( + [ + "app.record.create.change.engineer_mechanic", + "app.record.edit.change.engineer_mechanic", + ], + function ( + /** @type {kintone.AppEvent__サービスレポート_出張経費精算入力} */ + event + ) { + const record = event.record; + + if (record.engineer_mechanic.value.length > 0) { + pvc.util.ui.showSpinner(); + getLoginUserGroupCodes() + .then(function (groupCodes) { + return fetchSystemControlAndUpdateFields(record, groupCodes); + }) + .then(function () { + setDisabledField(record, isServiceReportAuthorizer); + kintone.app.record.set(event); + pvc.util.ui.hideSpinner(); + }) + .catch(function (error) { + pvc.util.ui.hideSpinner(); + console.error(error); + alert("システムエラーが発生しました"); + }); + } + return event; + } + ); + /** * 「作業時間情報」変更時の処理を行います。 */ @@ -987,6 +1002,36 @@ return pvc.util.array.sum(includeTimeNumList); } + /** + * 指定されたユーザーコードのシステムコントロール情報を取得してフィールドに設定します。 + * @param {kintone.AppRecord__サービスレポート_出張経費精算入力} record + * @param {string[]} groupCodes - ログインユーザーの所属グループコードリスト + * @returns {Promise} + */ + function fetchSystemControlAndUpdateFields(record, groupCodes) { + var userCode = record.engineer_mechanic.value.length > 0 ? record.engineer_mechanic.value[0].code : ""; + return getSystemControlRecord(userCode).then(function (systemRecord) { + if (systemRecord != null) { + // サービスレポート承認者グループに所属するユーザーかどうかを取得 + const serviceReportAuthorizerCodes = + systemRecord.サービスレポート承認者グループ.value.map(function ( + group + ) { + return group.code; + }); + isServiceReportAuthorizer = serviceReportAuthorizerCodes.some( + function (serviceReportAuthorizerCode) { + return groupCodes.indexOf(serviceReportAuthorizerCode) !== -1; + } + ); + + // システムコントロール情報の設定 + setSystemControlField(systemRecord, record); + setSystemInfo(record); + } + }); + } + /** * システムコントロールのレコードを取得します。 * @param {string} userCode - ユーザーコード(engineer_mechanic.コード) diff --git a/src/勤怠申請入力(内勤者用)/pvc-desktop-main.js b/src/勤怠申請入力(内勤者用)/pvc-desktop-main.js index fff7f25..dc6a690 100644 --- a/src/勤怠申請入力(内勤者用)/pvc-desktop-main.js +++ b/src/勤怠申請入力(内勤者用)/pvc-desktop-main.js @@ -53,15 +53,9 @@ setHiddenTableRowButton(); pvc.util.ui.showSpinner(); - var userCode = record.氏名.value.length > 0 ? record.氏名.value[0].code : ""; - return getSystemControlRecord(userCode) - .then(function (systemRecord) { + return fetchAndSetSystemControlInfo(record) + .then(function () { pvc.util.ui.hideSpinner(); - if (systemRecord != null) { - setSystemControlField(systemRecord, record); - setSystemInfo(record); - } - return event; }) .catch(function (error) { @@ -90,39 +84,42 @@ ) { const record = event.record; const sinseiNengetu = pvc.util.obj.toNumber(record.申請年月.value) || 0; + + // 既存の申請年月変更時の処理を継続 if (isNengetuNum(sinseiNengetu) && record.氏名.value.length > 0) { - kintone.Promise.resolve().then(function () { - pvc.util.ui.showSpinner(); + pvc.util.ui.showSpinner(); + // 「氏名」変更時にシステムコントロールの情報を取得 + fetchAndSetSystemControlInfo(record) + .then(function () { + /** @type {{ record: kintone.AppRecord__勤怠申請入力_内勤者用 }} */ + const r = kintone.app.record.get(); + return existsDuplicateData(r.record) + .then(function (isExists) { + if (isExists) { + // 重複するデータが既に存在する場合 + alert("既に登録済です。"); + return; + } - /** @type {{ record: kintone.AppRecord__勤怠申請入力_内勤者用 }} */ - const r = kintone.app.record.get(); - return existsDuplicateData(r.record) - .then(function (isExists) { - if (isExists) { - // 重複するデータが既に存在する場合 - alert("既に登録済です。"); - return; - } + // 就業届テーブルにデータを作成 + return setSyuugyouTodokeTable(r.record).then(function () { + // 使用不可を設定 + setDisabledField(r.record); - // 就業届テーブルにデータを作成 - return setSyuugyouTodokeTable(r.record).then(function () { - // 使用不可を設定 - setDisabledField(r.record); - - // レコードに値を設定 - kintone.app.record.set(r); - }); - }) - .then(function () { - // スピナーを非表示 - pvc.util.ui.hideSpinner(); - }) - .catch(function (error) { - pvc.util.ui.hideSpinner(); - console.error(error); - alert("システムエラーが発生しました"); - }); - }); + // レコードに値を設定 + kintone.app.record.set(r); + }); + }) + }) + .then(function () { + // スピナーを非表示 + pvc.util.ui.hideSpinner(); + }) + .catch(function (error) { + pvc.util.ui.hideSpinner(); + console.error(error); + alert("システムエラーが発生しました"); + }); } return event; } @@ -719,6 +716,21 @@ return strValue.length === 6 && 1 <= mm && mm <= 12; } + /** + * 指定されたユーザーコードのシステムコントロール情報を取得してフィールドに設定します。 + * @param {kintone.AppRecord__勤怠申請入力_内勤者用} record + * @returns {Promise} + */ + function fetchAndSetSystemControlInfo(record) { + var userCode = record.氏名.value.length > 0 ? record.氏名.value[0].code : ""; + return getSystemControlRecord(userCode).then(function (systemRecord) { + if (systemRecord != null) { + setSystemControlField(systemRecord, record); + setSystemInfo(record); + } + }); + } + /** * システムコントロールのレコードを取得します。 * @param {string} userCode - ユーザーコード(氏名.コード) diff --git a/src/勤怠申請入力(内勤者用)/pvc-desktop-view.js b/src/勤怠申請入力(内勤者用)/pvc-desktop-view.js index 4415267..69a0a0e 100644 --- a/src/勤怠申請入力(内勤者用)/pvc-desktop-view.js +++ b/src/勤怠申請入力(内勤者用)/pvc-desktop-view.js @@ -1,6 +1,25 @@ (function () { "use strict"; + /** + * 新規登録・編集画面保存時の処理 + * 氏名に複数のユーザーが設定されている場合は、エラーを表示して保存をキャンセルする + */ + kintone.events.on( + ["app.record.create.submit", "app.record.edit.submit"], + function (event) { + const record = event.record; + + // 氏名に複数のユーザーが設定されている場合は、エラーを表示して保存をキャンセル + if (record.氏名.value.length > 1) { + event.error = "氏名にユーザーが複数設定されています"; + return event; + } + + return event; + } + ); + /** * 一覧画面の編集保存時の処理 */