From 2e6b7c8ab5280647905ff823fafdfb1c3e9aac58 Mon Sep 17 00:00:00 2001 From: "makabe.t" Date: Fri, 8 Mar 2024 05:45:53 +0000 Subject: [PATCH] =?UTF-8?q?Merged=20PR=20818:=20function=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## 概要 [Task3879: function修正](https://paruru.nds-tyo.co.jp:8443/tfs/ReciproCollection/fa4924a4-d079-4fab-9fb5-a9a11eb205f0/_workitems/edit/3879) - 行番号をExcelの表記通りとなるように修正 - 途中から始められるようにforループを修正 ## レビューポイント - 共有 ## UIの変更 - Before/Afterのスクショなど - スクショ置き場 ## クエリの変更 - Repositoryを変更し、クエリが変更された場合は変更内容を確認する - Before/Afterのクエリ - クエリ置き場 ## 動作確認状況 - ローカルで確認、develop環境で確認など - 行った修正がデグレを発生させていないことを確認できるか - 具体的にどのような確認をしたか - どのケースに対してどのような手段でデグレがないことを担保しているか ## 補足 - 相談、参考資料などがあれば --- dictation_client/src/features/user/selectors.ts | 2 +- dictation_function/src/constants/index.ts | 2 ++ dictation_function/src/functions/importUsers.ts | 16 +++++++++++----- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/dictation_client/src/features/user/selectors.ts b/dictation_client/src/features/user/selectors.ts index dc25752..eb9852c 100644 --- a/dictation_client/src/features/user/selectors.ts +++ b/dictation_client/src/features/user/selectors.ts @@ -389,7 +389,7 @@ export const selectImportFileName = (state: RootState) => export const selectImportValidationErrors = (state: RootState) => { const csvUsers = state.user.apps.importUsers; - let rowNumber = 0; + let rowNumber = 1; const invalidInput: number[] = []; const duplicatedEmailsMap = new Map(); diff --git a/dictation_function/src/constants/index.ts b/dictation_function/src/constants/index.ts index f955c2d..fe21f13 100644 --- a/dictation_function/src/constants/index.ts +++ b/dictation_function/src/constants/index.ts @@ -335,3 +335,5 @@ export const RoleNumberMap: Record = { } as const; export const SYSTEM_IMPORT_USERS = "import-users"; + +export const ROW_START_INDEX = 2; diff --git a/dictation_function/src/functions/importUsers.ts b/dictation_function/src/functions/importUsers.ts index 40a281b..38716b9 100644 --- a/dictation_function/src/functions/importUsers.ts +++ b/dictation_function/src/functions/importUsers.ts @@ -7,6 +7,7 @@ import { IMPORT_USERS_STAGE_FILE_NAME, IMPORT_USERS_STAGES, RoleNumberMap, + ROW_START_INDEX, SYSTEM_IMPORT_USERS, TIERS, } from "../constants"; @@ -47,7 +48,7 @@ export async function importUsersProcessing( if (targetFileName === undefined) { throw new Error("targetFileName is undefined"); } - let row = 1; + let row = ROW_START_INDEX; // stage.jsonを取得(ダウンロード)して読み込む let stageData = await blobstorageService.downloadFileData( @@ -78,24 +79,29 @@ export async function importUsersProcessing( if (!isStageJson(stage)) { throw new Error("stage.json is invalid"); } + context.log(`start stage: ${JSON.stringify(stage)}`); // 作業中のstage.jsonが存在する場合は、処理を再開する if ( stage.state !== IMPORT_USERS_STAGES.CREATED && stage.state !== IMPORT_USERS_STAGES.DONE ) { + context.log( + `stage is pending. filename: ${stage.filename} row: ${stage.row}` + ); + // stage.jsonが存在し、内部状態が処理中で、最終更新日時が10分以上前だった場合は処理中断とみなして途中から再開 const nowUnixTime = getCurrentUnixTime(); if (nowUnixTime - stage.update > 10 * 60) { // stage.jsonの内容から処理対象のfilepathを特定する - context.log(stage.filename); + context.log(`pending filename: ${stage.filename}`); if (stage.filename === undefined) { context.log("stage.filename is undefined"); break; } targetFileName = stage.filename; // 処理開始行をstage.jsonを元に復元する - row = stage.row ?? 1; + row = stage.row ?? ROW_START_INDEX; } else { // 内部状態が処理中であれば処理中断(処理が終わる前にTimerから再度起動されてしまったケース) context.log("stage is processing"); @@ -144,9 +150,9 @@ export async function importUsersProcessing( imports.user_role ); - // 一括登録ユーザー一覧をループして、一括登録ユーザーを一括登録する const errors: ErrorRow[] = []; - for (const user of imports.data) { + // 一括登録ユーザー一覧をループして、一括登録ユーザーを一括登録する(中断された場合は途中から再開するため、sliceで開始行を指定する) + for (const user of imports.data.slice(row - ROW_START_INDEX)) { { // stage.jsonを更新(ユーザー追加開始) const updateSuccess = await blobstorageService.updateFile(