diff --git a/src/tag-log/dto/subType/InOutLog.type.v1.ts b/src/tag-log/dto/subType/InOutLog.type.v1.ts deleted file mode 100644 index 36f1e09..0000000 --- a/src/tag-log/dto/subType/InOutLog.type.v1.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { ApiProperty } from '@nestjs/swagger'; - -export class InOutLogTypeV1 { - @ApiProperty({ - description: '입장한 시간 (타임스탬프, 초 단위)', - example: 1658980000, - }) - inTimeStamp: number; - - @ApiProperty({ - description: '퇴장한 시간 (타임스탬프, 초 단위)', - example: 1658989999, - }) - outTimeStamp: number; - - @ApiProperty({ - description: '체류 시간 (초 단위)', - example: 9999, - }) - durationSecond: number; -} diff --git a/src/tag-log/tag-log.service.ts b/src/tag-log/tag-log.service.ts index ccae69e..ac5427b 100644 --- a/src/tag-log/tag-log.service.ts +++ b/src/tag-log/tag-log.service.ts @@ -8,7 +8,6 @@ import { DeviceInfoDto } from './dto/device-info.dto'; import { InOutDto } from './dto/inout.dto'; import { PairInfoDto } from './dto/pair-info.dto'; import { InOutLogType } from './dto/subType/InOutLog.type'; -import { InOutLogTypeV1 } from './dto/subType/InOutLog.type.v1'; import { TagLogDto } from './dto/tag-log.dto'; import { IDeviceInfoRepository } from './repository/interface/device-info-repository.interface'; import { IPairInfoRepository } from './repository/interface/pair-info-repository.interface'; @@ -187,28 +186,6 @@ export class TagLogService { return taglogs; } - /** - * 인자로 들어간 디바이스가 쌍이 맞는지 확인하는 함수입니다. - * - * @param deviceInfo - * @param enterDevice - * @param device - * @version 2 - */ - validateDevicePair( - deviceInfos: PairInfoDto[], - inDevice: number, - outDevice: number, - ): boolean { - //this.logger.debug(`@validateDevicePair) ${inDevice} - ${outDevice}`); - // TODO: O(N) 보다 더 적게 시간을 소요하도록 리팩터링 필요 - const find = deviceInfos.find( - (device) => - device.in_device === inDevice && device.out_device === outDevice, - ); - return !!find; - } - /** * 인자로 들어간 디바이스 번호가 입실 디바이스인지 확인합니다. * @@ -363,7 +340,7 @@ export class TagLogService { } /** - * tagStart에서 tagEnd의 기간 내에 userId의 태그로그를 전부 반환합니다. + * tagStart에서 tagEnd의 기간 내의 태그로그를 반환합니다. * 24시를 기준으로 가상 태그로그가 포함되어 있습니다. * * @param userId number @@ -419,6 +396,8 @@ export class TagLogService { /** * 일별 모든 태그를 반환합니다. + * version 3: 짝이 맞는 태그로그를 반환합니다. + * version 4: 유저의 태그로그를 전부 반환합니다. * * @param userId 사용자 ID * @param date 날짜 @@ -495,6 +474,8 @@ export class TagLogService { /** * 인자로 들어가는 사용자 ID와 날짜에 대한 월별 모든 태그를 반환합니다. + * version 3: 짝이 맞는 태그로그를 반환합니다. + * version 4: 유저의 태그로그를 전부 반환합니다. * * @param userId 사용자 ID * @param date 날짜 @@ -655,199 +636,4 @@ export class TagLogService { } return taglogs; } - - /** - * 기기 쌍 정보와 태깅한 로그들을 이용하여 출입 로그를 반환합니다. - * - * @param taglogs 입출입 로그 - * @param deviceInfos 기기 짝 정보 - * @version 2 - */ - getPairsByTagLogs( - taglogs: TagLogDto[], - deviceInfos: PairInfoDto[], - ): InOutLogTypeV1[] { - this.logger.debug(`@getPairsByTagLogs)`); - - /** - * 데이터를 날짜의 내림차순으로 정렬 - */ - // const timeLines = taglogs - // //.sort((a, b) => (a.tag_at < b.tag_at ? 1 : -1)) - // .map((v) => ({ - // tag_at: v.tag_at, - // device_id: v.device_id, - // })); - const timeLines = taglogs; - - let leave: TagLogDto | null = null; - const resultPairs: InOutLogTypeV1[] = []; - - // 타임라인 배열이 빌 때까지 루프를 돌립니다. - while (timeLines.length > 0) { - // 가장 뒤의 원소(가장 늦은 날짜)를 뽑습니다. - const val = timeLines.pop(); - - // 만약 퇴장로그로 가정한 로그가 없다면 뽑은 원소를 넣고 루프를 다시 실행합니다. - if (leave === null) { - leave = val; - continue; - } - - // 뽑아낸 원소를 임시로 저장합니다. - const temp: TagLogDto | null = val; - - // 퇴장로그로 가정한 로그와 현재 뽑아낸 로그가 기기 짝이 맞는지 확인합니다. - if ( - this.validateDevicePair(deviceInfos, temp.device_id, leave.device_id) - ) { - // 기기 짝이 맞을 경우 임시 원소를 입장 로그로 지정합니다. - const enter = temp; - - // 입장 로그와 퇴장 로그가 짝이 맞는지 확인합니다. - if (this.dateCalculator.checkEqualDay(enter.tag_at, leave.tag_at)) { - // 만약 동일한 날짜에 속한다면 해당 쌍이 짝이 됩니다. - const inTimeStamp = this.dateCalculator.toTimestamp(enter.tag_at); - const outTimeStamp = this.dateCalculator.toTimestamp(leave.tag_at); - resultPairs.push({ - inTimeStamp, - outTimeStamp, - durationSecond: outTimeStamp - inTimeStamp, - }); - } else { - // 만약 입장 로그와 퇴장 로그가 짝이 맞지만, 동일한 날짜에 속하지 않으면 일 단위로 자릅니다. - - // 퇴장 로그의 정시 (00시)를 기준으로 두 날짜의 간격을 자릅니다. 두 날짜는 가상의 입퇴장 짝이 됩니다. - const virtualEnterTime = this.dateCalculator.getStartOfDate( - leave.tag_at, - ); - const virtualLeaveTime = this.dateCalculator.getEndOfLastDate( - leave.tag_at, - ); - - // 가상 입장시간 (퇴장시간의 날짜의 정시 - 00시)과 퇴장시간이 짝을 맞춥니다. - const inTimeStamp = this.dateCalculator.toTimestamp(virtualEnterTime); - const outTimeStamp = this.dateCalculator.toTimestamp(leave.tag_at); - resultPairs.push({ - inTimeStamp, - outTimeStamp, - durationSecond: outTimeStamp - inTimeStamp, - }); - - // 그리고 가상 퇴장시간을 다시 배열에 넣어 가상 퇴장시간과 맞는 짝을 찾습니다. - timeLines.push(val); - timeLines.push({ - tag_at: virtualLeaveTime, - device_id: leave.device_id, - idx: -1, - card_id: val.card_id, - }); - } - - // 퇴장로그로 가정한 로그를 초기화합니다. - leave = null; - } else { - // pair가 아닌 경우 뽑아낸 로그를 퇴장로그로 가정하고 루프를 다시 실행합니다. - leave = temp; - } - } - - return resultPairs; - } - - /** - * 인자로 들어가는 사용자 ID와 날짜에 대한 일별 누적시간을 반환합니다. - * - * @param userId 사용자 ID - * @param date 날짜 - * @returns InOutLogType[] - * @version 2 - */ - async getPerDay(userId: number, date: Date): Promise { - this.logger.debug(`@getPerDay) ${userId}, ${date}`); - const tagStart = this.dateCalculator.getStartOfDate(date); - const tagEnd = this.dateCalculator.getEndOfDate(date); - - const pairs = await this.pairInfoRepository.findAll(); - - const cards = await this.userService.findCardsByUserId( - userId, - tagStart, - tagEnd, - ); - - const tagLogs = await this.tagLogRepository.findTagLogsByCards( - cards, - tagStart, - tagEnd, - ); - - const sortedTagLogs = tagLogs.sort((a, b) => - a.tag_at > b.tag_at ? 1 : -1, - ); - - // FIXME: 임시 조치임 - const filteredTagLogs = sortedTagLogs.filter( - (v) => v.device_id !== 35 && v.device_id !== 16, - ); - - const trimmedTagLogs = await this.trimTagLogs( - filteredTagLogs, - cards, - tagStart, - tagEnd, - ); - - const resultPairs = this.getPairsByTagLogs(trimmedTagLogs, pairs); - - return resultPairs; - } - - /** - * 인자로 들어가는 사용자 ID와 날짜에 대한 월별 누적시간을 반환합니다. - * - * @param userId 사용자 ID - * @param date 날짜 - * @returns InOutLogType[] - * @version 2 - */ - async getPerMonth(userId: number, date: Date): Promise { - this.logger.debug(`@getPerMonth) ${userId}, ${date}`); - const tagStart = this.dateCalculator.getStartOfMonth(date); - const tagEnd = this.dateCalculator.getEndOfMonth(date); - - const pairs = await this.pairInfoRepository.findAll(); - - const cards = await this.userService.findCardsByUserId( - userId, - tagStart, - tagEnd, - ); - - const tagLogs = await this.tagLogRepository.findTagLogsByCards( - cards, - tagStart, - tagEnd, - ); - - const sortedTagLogs = tagLogs.sort((a, b) => - a.tag_at > b.tag_at ? 1 : -1, - ); - - // FIXME: 임시 조치임 - const filteredTagLogs = sortedTagLogs.filter( - (v) => v.device_id !== 35 && v.device_id !== 16, - ); - - const trimmedTagLogs = await this.trimTagLogs( - filteredTagLogs, - cards, - tagStart, - tagEnd, - ); - - const resultPairs = this.getPairsByTagLogs(trimmedTagLogs, pairs); - - return resultPairs; - } }