Skip to content

Commit

Permalink
Merge pull request #1625 from innovationacademy-kr/common/dev/feat_co…
Browse files Browse the repository at this point in the history
…in/admin/sohyupar#1604

Common/dev/feat coin/admin/sohyupar#1604
  • Loading branch information
chyo1 authored Jun 3, 2024
2 parents c8d8649 + 43d13f2 commit fe96be5
Show file tree
Hide file tree
Showing 17 changed files with 318 additions and 11 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package org.ftclub.cabinet.admin.dto;

import java.time.LocalDateTime;
import lombok.AllArgsConstructor;
import lombok.Getter;

@Getter
@AllArgsConstructor
public class AdminItemHistoryDto {

private LocalDateTime purchaseAt;
private LocalDateTime usedAt;
private String itemName;
private String itemDetails;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package org.ftclub.cabinet.admin.dto;

import java.util.List;
import lombok.AllArgsConstructor;
import lombok.Getter;

@Getter
@AllArgsConstructor
public class AdminItemHistoryPaginationDto {

private List<AdminItemHistoryDto> itemHistories;
private Long totalLength;
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,17 @@
package org.ftclub.cabinet.admin.item.controller;

import lombok.RequiredArgsConstructor;
import org.ftclub.cabinet.admin.dto.AdminItemHistoryPaginationDto;
import org.ftclub.cabinet.admin.item.service.AdminItemFacadeService;
import org.ftclub.cabinet.admin.statistics.service.AdminStatisticsFacadeService;
import org.ftclub.cabinet.auth.domain.AuthGuard;
import org.ftclub.cabinet.auth.domain.AuthLevel;
import org.ftclub.cabinet.dto.ItemAssignDto;
import org.ftclub.cabinet.dto.ItemAssignRequestDto;
import org.ftclub.cabinet.dto.ItemCreateDto;
import org.ftclub.cabinet.log.Logging;
import org.springframework.data.domain.Pageable;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
Expand All @@ -19,18 +24,34 @@
public class AdminItemController {

private final AdminItemFacadeService adminItemFacadeService;
private final AdminStatisticsFacadeService adminStatisticsFacadeService;


@PostMapping("")
@AuthGuard(level = AuthLevel.ADMIN_ONLY)
public void createItem(@RequestBody ItemCreateDto itemCreateDto) {
adminItemFacadeService.createItem(itemCreateDto.getPrice(),
itemCreateDto.getSku(), itemCreateDto.getType());
itemCreateDto.getSku(), itemCreateDto.getType());
}

@PostMapping("/assign")
@AuthGuard(level = AuthLevel.ADMIN_ONLY)
public void assignItem(@RequestBody ItemAssignDto itemAssignDto) {
adminItemFacadeService.assignItem(itemAssignDto.getUserIds(), itemAssignDto.getItemSku());
public void assignItem(@RequestBody ItemAssignRequestDto itemAssignRequestDto) {
adminItemFacadeService.assignItem(itemAssignRequestDto.getUserIds(),
itemAssignRequestDto.getItemSku());
}

/**
* 특정 유저의 아이템 history 조회
*
* @param userId
* @param pageable
* @return
*/
@GetMapping("/users/{userId}")
@AuthGuard(level = AuthLevel.ADMIN_ONLY)
public AdminItemHistoryPaginationDto getUserItemHistoryPagination(
@PathVariable(value = "userId") Long userId, Pageable pageable) {
return adminItemFacadeService.getUserItemHistories(userId, pageable);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,24 @@

import java.time.LocalDateTime;
import java.util.List;
import java.util.stream.Collectors;
import lombok.RequiredArgsConstructor;
import org.ftclub.cabinet.admin.dto.AdminItemHistoryDto;
import org.ftclub.cabinet.admin.dto.AdminItemHistoryPaginationDto;
import org.ftclub.cabinet.dto.ItemPurchaseCountDto;
import org.ftclub.cabinet.dto.ItemStatisticsDto;
import org.ftclub.cabinet.item.domain.Item;
import org.ftclub.cabinet.item.domain.ItemHistory;
import org.ftclub.cabinet.item.domain.ItemType;
import org.ftclub.cabinet.item.domain.Sku;
import org.ftclub.cabinet.item.service.ItemCommandService;
import org.ftclub.cabinet.item.service.ItemHistoryCommandService;
import org.ftclub.cabinet.item.service.ItemHistoryQueryService;
import org.ftclub.cabinet.item.service.ItemPolicyService;
import org.ftclub.cabinet.item.service.ItemQueryService;
import org.ftclub.cabinet.mapper.ItemMapper;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

Expand All @@ -19,6 +30,9 @@ public class AdminItemFacadeService {
private final ItemQueryService itemQueryService;
private final ItemCommandService itemCommandService;
private final ItemHistoryCommandService itemHistoryCommandService;
private final ItemHistoryQueryService itemHistoryQueryService;
private final ItemPolicyService itemPolicyService;
private final ItemMapper itemMapper;

@Transactional
public void createItem(Integer Price, Sku sku, ItemType type) {
Expand All @@ -34,4 +48,28 @@ public void assignItem(List<Long> userIds, Sku sku) {
}
itemHistoryCommandService.purchaseItem(userIds, item.getId(), now);
}

@Transactional(readOnly = true)
public AdminItemHistoryPaginationDto getUserItemHistories(Long userId, Pageable pageable) {
Page<ItemHistory> itemHistoryWithItem =
itemHistoryQueryService.getItemHistoriesByUserIdWithItem(userId, pageable);

List<AdminItemHistoryDto> result = itemHistoryWithItem.stream()
.map(ih -> itemMapper.toAdminItemHistoryDto(ih, ih.getItem()))
.collect(Collectors.toList());

return new AdminItemHistoryPaginationDto(result, itemHistoryWithItem.getTotalElements());
}

@Transactional(readOnly = true)
public ItemStatisticsDto getItemPurchaseStatistics() {
List<Item> itemsOnSale = itemQueryService.getUseItemIds();
List<ItemPurchaseCountDto> result = itemsOnSale.stream()
.map(item -> {
int userCount = itemHistoryQueryService.getPurchaseCountByItemId(item.getId());
return itemMapper.toItemPurchaseCountDto(item, userCount);
}).collect(Collectors.toList());

return new ItemStatisticsDto(result);
}
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,18 @@
package org.ftclub.cabinet.admin.statistics.controller;

import java.time.LocalDateTime;
import lombok.RequiredArgsConstructor;
import org.ftclub.cabinet.admin.item.service.AdminItemFacadeService;
import org.ftclub.cabinet.admin.statistics.service.AdminStatisticsFacadeService;
import org.ftclub.cabinet.auth.domain.AuthGuard;
import org.ftclub.cabinet.auth.domain.AuthLevel;
import org.ftclub.cabinet.dto.CoinCollectStatisticsDto;
import org.ftclub.cabinet.dto.CoinStaticsDto;
import org.ftclub.cabinet.dto.ItemStatisticsDto;
import org.ftclub.cabinet.dto.TotalCoinAmountDto;
import org.ftclub.cabinet.log.Logging;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.format.annotation.DateTimeFormat.ISO;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
Expand All @@ -19,6 +25,7 @@
public class AdminStatisticsControllerV5 {

private final AdminStatisticsFacadeService adminStatisticsFacadeService;
private final AdminItemFacadeService adminItemFacadeService;

/**
* 특정 연도, 월의 동전 줍기 횟수를 횟수 별로 통계를 내서 반환
Expand Down Expand Up @@ -46,4 +53,32 @@ public TotalCoinAmountDto getTotalCoinAmount() {
return adminStatisticsFacadeService.getTotalCoinAmount();
}

/**
* 아이템별 구매 인원 조회
*
* @return
*/
@GetMapping("/items")
@AuthGuard(level = AuthLevel.ADMIN_ONLY)
public ItemStatisticsDto getItemPurchaseStatistics() {
return adminItemFacadeService.getItemPurchaseStatistics();
}

/**
* 특정 기간동안 재화 사용량 및 발행량 조회
*
* @param startDate
* @param endDate 조회를 원하는 기간
* @return
*/
@GetMapping("/coins/use")
@AuthGuard(level = AuthLevel.ADMIN_ONLY)
public CoinStaticsDto getCoinStaticsDto(
@RequestParam("startDate") @DateTimeFormat(iso = ISO.DATE_TIME) LocalDateTime startDate,
@RequestParam("endDate") @DateTimeFormat(iso = ISO.DATE_TIME) LocalDateTime endDate) {
return adminStatisticsFacadeService.getCoinStaticsDto(startDate.toLocalDate(),
endDate.toLocalDate());

}

}
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,11 @@
import static org.ftclub.cabinet.cabinet.domain.CabinetStatus.OVERDUE;
import static org.ftclub.cabinet.item.domain.Sku.COIN_COLLECT;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;
import java.util.Comparator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
Expand All @@ -16,8 +20,10 @@
import org.ftclub.cabinet.cabinet.service.CabinetQueryService;
import org.ftclub.cabinet.dto.BlockedUserPaginationDto;
import org.ftclub.cabinet.dto.CabinetFloorStatisticsResponseDto;
import org.ftclub.cabinet.dto.CoinAmountDto;
import org.ftclub.cabinet.dto.CoinCollectStatisticsDto;
import org.ftclub.cabinet.dto.CoinCollectedCountDto;
import org.ftclub.cabinet.dto.CoinStaticsDto;
import org.ftclub.cabinet.dto.LentsStatisticsResponseDto;
import org.ftclub.cabinet.dto.OverdueUserCabinetDto;
import org.ftclub.cabinet.dto.OverdueUserCabinetPaginationDto;
Expand Down Expand Up @@ -170,4 +176,50 @@ public TotalCoinAmountDto getTotalCoinAmount() {
// 재화 총 사용량, 현재 총 보유량 (총 공급량 - 총 사용량) 반환
return new TotalCoinAmountDto(-1 * totalCoinUsage, totalCoinSupply + totalCoinUsage);
}

/**
* 특정 기간동안 재화 사용량 및 발행량 조회
*
* @param startDate
* @param endDate 조회를 원하는 기간
* @return
*/
public CoinStaticsDto getCoinStaticsDto(LocalDate startDate, LocalDate endDate) {
Map<LocalDate, Long> issuedAmount = new LinkedHashMap<>();
Map<LocalDate, Long> usedAmount = new LinkedHashMap<>();
long dayDifference = ChronoUnit.DAYS.between(startDate, endDate) + 1;
IntStream.range(0, (int) dayDifference)
.mapToObj(startDate::plusDays)
.forEach(date -> {
issuedAmount.put(date, 0L);
usedAmount.put(date, 0L);
});

List<ItemHistory> usedCoins =
itemHistoryQueryService.getUsedCoinHistoryBetween(startDate,
endDate);

usedCoins.forEach(
ih -> {
Long price = ih.getItem().getPrice();
LocalDate date = ih.getUsedAt().toLocalDate();

if (price > 0) {
issuedAmount.put(date, issuedAmount.get(date) + price);
} else {
usedAmount.put(date, usedAmount.get(date) + price);
}
});
List<CoinAmountDto> issueCoin = convertMapToList(issuedAmount);
List<CoinAmountDto> usedCoin = convertMapToList(usedAmount);

return new CoinStaticsDto(issueCoin, usedCoin);
}

List<CoinAmountDto> convertMapToList(Map<LocalDate, Long> map) {
return map.entrySet().stream()
.map(entry -> itemMapper.toCoinAmountDto(entry.getKey(), entry.getValue()))
.sorted(Comparator.comparing(CoinAmountDto::getDate))
.collect(Collectors.toList());
}
}
13 changes: 13 additions & 0 deletions backend/src/main/java/org/ftclub/cabinet/dto/CoinAmountDto.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package org.ftclub.cabinet.dto;

import java.time.LocalDate;
import lombok.AllArgsConstructor;
import lombok.Getter;

@Getter
@AllArgsConstructor
public class CoinAmountDto {

private LocalDate date;
private Long amount;
}
13 changes: 13 additions & 0 deletions backend/src/main/java/org/ftclub/cabinet/dto/CoinStaticsDto.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package org.ftclub.cabinet.dto;

import java.util.List;
import lombok.AllArgsConstructor;
import lombok.Getter;

@Getter
@AllArgsConstructor
public class CoinStaticsDto {

private List<CoinAmountDto> issuedCoin;
private List<CoinAmountDto> usedCoin;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package org.ftclub.cabinet.dto;

import java.util.List;
import lombok.AllArgsConstructor;
import lombok.Getter;

@Getter
@AllArgsConstructor
public class ItemAssignPaginationDto {

Long total;
private List<ItemAssignResponseDto> items;
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class ItemAssignDto {
public class ItemAssignRequestDto {

private Sku itemSku;
private List<Long> userIds;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package org.ftclub.cabinet.dto;

import java.time.LocalDateTime;
import lombok.AllArgsConstructor;
import lombok.Getter;
import org.ftclub.cabinet.item.domain.Sku;

@Getter
@AllArgsConstructor
public class ItemAssignResponseDto {

private Sku itemSku; // sku
private String itemName; // itemType
private String itemDetails; // sku.description
private LocalDateTime issuedDate; // itemHistory -> purchasedAt
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package org.ftclub.cabinet.dto;

import lombok.AllArgsConstructor;
import lombok.Getter;

@Getter
@AllArgsConstructor
public class ItemPurchaseCountDto {

private String itemName;
private String itemDetails;
private int userCount;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package org.ftclub.cabinet.dto;


import java.util.List;
import lombok.AllArgsConstructor;
import lombok.Getter;

@Getter
@AllArgsConstructor
public class ItemStatisticsDto {

private List<ItemPurchaseCountDto> items;
}
Loading

0 comments on commit fe96be5

Please sign in to comment.