SalesTargetCommandServiceImpl.java
package com.deveagles.be15_deveagles_be.features.staffsales.command.application.service.impl;
import com.deveagles.be15_deveagles_be.features.staffsales.command.application.dto.StaffSalesTargetInfo;
import com.deveagles.be15_deveagles_be.features.staffsales.command.application.dto.request.SetSalesTargetRequest;
import com.deveagles.be15_deveagles_be.features.staffsales.command.application.service.SalesTargetCommandService;
import com.deveagles.be15_deveagles_be.features.staffsales.command.domain.aggregate.SalesTarget;
import com.deveagles.be15_deveagles_be.features.staffsales.command.domain.aggregate.StaffSalesSettingType;
import com.deveagles.be15_deveagles_be.features.staffsales.command.repository.SalesTargetRepository;
import java.time.YearMonth;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@Slf4j
@Service
@RequiredArgsConstructor
public class SalesTargetCommandServiceImpl implements SalesTargetCommandService {
private final SalesTargetRepository salesTargetRepository;
@Override
public void setSalesTarget(Long shopId, SetSalesTargetRequest request) {
YearMonth ym = YearMonth.from(request.targetDate());
// 1. 기존 데이터 조회
List<SalesTarget> existing =
salesTargetRepository.findByShopIdAndYearMonth(shopId, ym.getYear(), ym.getMonthValue());
// 2. BULK 설정 처리
if (request.type() == StaffSalesSettingType.BULK) {
// 기존 STAFF 설정 비활성화
existing.stream().filter(e -> e.getStaffId() != null).forEach(e -> e.setStatus(false));
// BULK 데이터 저장
request
.targetAmounts()
.forEach(
(category, amount) -> {
Optional<SalesTarget> existingBulk =
existing.stream()
.filter(
e ->
e.getStaffId() == null
&& ((category.equals("membership") && e.isMembership())
|| (category.equals("items") && e.isItems())))
.findFirst();
if (existingBulk.isPresent()) {
SalesTarget target = existingBulk.get();
target.setSalesAmount(amount);
target.setStatus(true);
salesTargetRepository.save(target);
} else {
createSalesTarget(shopId, null, ym, category, amount);
}
});
} else if (request.type() == StaffSalesSettingType.STAFF) {
for (StaffSalesTargetInfo info : request.staffTargets()) {
Long staffId = info.getStaffId();
Map<String, Integer> amounts = info.getTargetAmounts();
for (Map.Entry<String, Integer> entry : amounts.entrySet()) {
String category = entry.getKey();
Integer amount = entry.getValue();
Optional<SalesTarget> existingStaffTarget =
existing.stream()
.filter(
e ->
Objects.equals(e.getStaffId(), staffId)
&& ((category.equals("membership") && e.isMembership())
|| (category.equals("items") && e.isItems())))
.findFirst();
if (existingStaffTarget.isPresent()) {
SalesTarget target = existingStaffTarget.get();
target.setSalesAmount(amount);
target.setStatus(true);
salesTargetRepository.save(target);
} else {
createSalesTarget(shopId, staffId, ym, category, amount);
}
}
}
}
}
private void createSalesTarget(
Long shopId, Long staffId, YearMonth ym, String category, Integer amount) {
SalesTarget newTarget =
SalesTarget.builder()
.shopId(shopId)
.staffId(staffId)
.targetYear(ym.getYear())
.targetMonth(ym.getMonthValue())
.applyStatus(true)
.sales(amount)
.membership(category.equals("membership"))
.items(category.equals("items"))
.build();
salesTargetRepository.save(newTarget);
}
}