배치 (노출아이템) 관련 위치 변경

This commit is contained in:
DESKTOP-6ARNG1Q\dlsgk 2025-01-15 10:59:11 +09:00
parent 1b456efcc2
commit f97ab43107
4 changed files with 131 additions and 88 deletions

View File

@ -1,8 +1,14 @@
package com.interplug.qcast.batch.master; package com.interplug.qcast.batch.master;
import com.interplug.qcast.biz.specialNote.SpecialNoteService;
import com.interplug.qcast.biz.specialNote.dto.SpecialNoteItemRequest;
import com.interplug.qcast.biz.specialNote.dto.SpecialNoteRequest;
import com.interplug.qcast.biz.specialNote.dto.SpecialNoteSyncResponse;
import com.interplug.qcast.util.InterfaceQsp;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.function.Consumer; import java.util.function.Consumer;
import lombok.extern.slf4j.Slf4j;
import org.springframework.batch.core.Job; import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobExecution; import org.springframework.batch.core.JobExecution;
import org.springframework.batch.core.JobExecutionListener; import org.springframework.batch.core.JobExecutionListener;
@ -19,14 +25,6 @@ import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpMethod; import org.springframework.http.HttpMethod;
import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.PlatformTransactionManager;
import com.interplug.qcast.biz.displayItem.DisplayItemService;
import com.interplug.qcast.biz.displayItem.dto.DisplayItemRequest;
import com.interplug.qcast.biz.specialNote.SpecialNoteService;
import com.interplug.qcast.biz.specialNote.dto.SpecialNoteItemRequest;
import com.interplug.qcast.biz.specialNote.dto.SpecialNoteRequest;
import com.interplug.qcast.biz.specialNote.dto.SpecialNoteSyncResponse;
import com.interplug.qcast.util.InterfaceQsp;
import lombok.extern.slf4j.Slf4j;
@Configuration @Configuration
@Slf4j @Slf4j
@ -35,92 +33,100 @@ public class SpecialNoteDispItemJobConfiguration implements JobExecutionListener
private final InterfaceQsp interfaceQsp; private final InterfaceQsp interfaceQsp;
private final SpecialNoteService specialNoteService; private final SpecialNoteService specialNoteService;
private final DisplayItemService displayItemService;
@Value("${qsp.master-special-note-disp-item-batch-url}") @Value("${qsp.master-special-note-disp-item-batch-url}")
private String qspMasterSpecialNoteDispItemBatchUrl; private String qspMasterSpecialNoteDispItemBatchUrl;
private SpecialNoteSyncResponse SpecialNoteDispItemSyncResponse; private SpecialNoteSyncResponse SpecialNoteDispItemSyncResponse;
public SpecialNoteDispItemJobConfiguration(InterfaceQsp interfaceQsp, public SpecialNoteDispItemJobConfiguration(
SpecialNoteService specialNoteService, DisplayItemService displayItemService) { InterfaceQsp interfaceQsp, SpecialNoteService specialNoteService) {
this.interfaceQsp = interfaceQsp; this.interfaceQsp = interfaceQsp;
this.specialNoteService = specialNoteService; this.specialNoteService = specialNoteService;
this.displayItemService = displayItemService;
} }
@Override @Override
public void beforeJob(JobExecution jobExecution) { public void beforeJob(JobExecution jobExecution) {
log.info("Job 시작: 초기화 메서드 호출 중..."); log.info("Job 시작: 초기화 메서드 호출 중...");
try { try {
this.SpecialNoteDispItemSyncResponse = interfaceQsp.callApiData(HttpMethod.GET, this.SpecialNoteDispItemSyncResponse =
qspMasterSpecialNoteDispItemBatchUrl, null, SpecialNoteSyncResponse.class); interfaceQsp.callApiData(
log.info("API 호출 완료, 항목 수: {}", HttpMethod.GET,
this.SpecialNoteDispItemSyncResponse.getSdOrderSpnList().size()); qspMasterSpecialNoteDispItemBatchUrl,
null,
SpecialNoteSyncResponse.class);
log.info(
"API 호출 완료, 항목 수: {}", this.SpecialNoteDispItemSyncResponse.getSdOrderSpnList().size());
} catch (Exception e) { } catch (Exception e) {
log.error("specialNoteDispItemSyncResponse 갱신 중 오류: {}", e.getMessage()); log.error("specialNoteDispItemSyncResponse 갱신 중 오류: {}", e.getMessage());
} }
} }
@Bean @Bean
public Job specialNoteDispItemAdditionalJob(JobRepository jobRepository, Step specialNoteStep, public Job specialNoteDispItemAdditionalJob(
Step specialNoteItemStep, Step storeDispItemStep) { JobRepository jobRepository, Step specialNoteStep, Step specialNoteItemStep) {
return new JobBuilder("specialNoteDispItemAdditionalJob", jobRepository).start(specialNoteStep) return new JobBuilder("specialNoteDispItemAdditionalJob", jobRepository)
.next(specialNoteItemStep).next(storeDispItemStep).listener(this).build(); .start(specialNoteStep)
.next(specialNoteItemStep)
.listener(this)
.build();
} }
private <T> Step buildStep(String stepName, JobRepository jobRepository, private <T> Step buildStep(
PlatformTransactionManager transactionManager, ItemReader<T> reader, ItemWriter<T> writer) { String stepName,
return new StepBuilder(stepName, jobRepository).<T, T>chunk(10, transactionManager) JobRepository jobRepository,
.reader(reader).writer(writer).build(); PlatformTransactionManager transactionManager,
ItemReader<T> reader,
ItemWriter<T> writer) {
return new StepBuilder(stepName, jobRepository)
.<T, T>chunk(10, transactionManager)
.reader(reader)
.writer(writer)
.build();
} }
@Bean @Bean
public Step specialNoteStep(JobRepository jobRepository, public Step specialNoteStep(
PlatformTransactionManager transactionManager) { JobRepository jobRepository, PlatformTransactionManager transactionManager) {
return buildStep("specialNoteStep", jobRepository, transactionManager, specialNoteListReader(), return buildStep(
createWriter((items) -> { "specialNoteStep",
try { jobRepository,
log.debug("Special Note batch processing {} items", items.size()); transactionManager,
specialNoteService.setSpecialNoteBatch(items); specialNoteListReader(),
log.debug("Successfully processed Special Note batch"); createWriter(
} catch (Exception e) { (items) -> {
log.error("Error processing Special Note batch: {}", e.getMessage(), e); try {
throw new RuntimeException("Failed to process Special Note batch", e); log.debug("Special Note batch processing {} items", items.size());
} specialNoteService.setSpecialNoteBatch(items);
}, "specialNote")); log.debug("Successfully processed Special Note batch");
} catch (Exception e) {
log.error("Error processing Special Note batch: {}", e.getMessage(), e);
throw new RuntimeException("Failed to process Special Note batch", e);
}
},
"specialNote"));
} }
@Bean @Bean
public Step specialNoteItemStep(JobRepository jobRepository, public Step specialNoteItemStep(
PlatformTransactionManager transactionManager) { JobRepository jobRepository, PlatformTransactionManager transactionManager) {
return buildStep("specialNoteItemStep", jobRepository, transactionManager, return buildStep(
specialNoteItemListReader(), createWriter((items) -> { "specialNoteItemStep",
try { jobRepository,
log.debug("Special Note Item batch processing {} items", items.size()); transactionManager,
specialNoteService.setSpecialNoteItemBatch(items); specialNoteItemListReader(),
log.debug("Successfully processed Special Note Item batch"); createWriter(
} catch (Exception e) { (items) -> {
log.error("Error processing Special Note Item batch: {}", e.getMessage(), e); try {
throw new RuntimeException("Failed to process Special Note Item batch", e); log.debug("Special Note Item batch processing {} items", items.size());
} specialNoteService.setSpecialNoteItemBatch(items);
}, "specialNoteItem")); log.debug("Successfully processed Special Note Item batch");
} } catch (Exception e) {
log.error("Error processing Special Note Item batch: {}", e.getMessage(), e);
@Bean throw new RuntimeException("Failed to process Special Note Item batch", e);
public Step storeDispItemStep(JobRepository jobRepository, }
PlatformTransactionManager transactionManager) { },
return buildStep("storeDispItemStep", jobRepository, transactionManager, "specialNoteItem"));
storeDispItemListReader(), createWriter((items) -> {
try {
log.debug("Store Disp Item batch processing {} items", items.size());
displayItemService.setStoreDispItemBatch(items);
log.debug("Successfully processed Store Disp Item batch");
} catch (Exception e) {
log.error("Error processing Store Disp Item batch: {}", e.getMessage(), e);
throw new RuntimeException("Failed to process Store Disp Item batch", e);
}
}, "storeDispItem"));
} }
private <T> ListItemReader<T> createReader(List<T> items, String readerName) { private <T> ListItemReader<T> createReader(List<T> items, String readerName) {
@ -131,25 +137,21 @@ public class SpecialNoteDispItemJobConfiguration implements JobExecutionListener
@Bean @Bean
@StepScope @StepScope
public ListItemReader<SpecialNoteRequest> specialNoteListReader() { public ListItemReader<SpecialNoteRequest> specialNoteListReader() {
return createReader(SpecialNoteDispItemSyncResponse != null return createReader(
? SpecialNoteDispItemSyncResponse.getSdOrderSpnList() SpecialNoteDispItemSyncResponse != null
: null, "specialNote"); ? SpecialNoteDispItemSyncResponse.getSdOrderSpnList()
: null,
"specialNote");
} }
@Bean @Bean
@StepScope @StepScope
public ListItemReader<SpecialNoteItemRequest> specialNoteItemListReader() { public ListItemReader<SpecialNoteItemRequest> specialNoteItemListReader() {
return createReader(SpecialNoteDispItemSyncResponse != null return createReader(
? SpecialNoteDispItemSyncResponse.getSdOrderSpnItemList() SpecialNoteDispItemSyncResponse != null
: null, "specialNoteItem"); ? SpecialNoteDispItemSyncResponse.getSdOrderSpnItemList()
} : null,
"specialNoteItem");
@Bean
@StepScope
public ListItemReader<DisplayItemRequest> storeDispItemListReader() {
return createReader(SpecialNoteDispItemSyncResponse != null
? SpecialNoteDispItemSyncResponse.getStoreDispItemList()
: null, "storeDispItem");
} }
private <T> ItemWriter<T> createWriter(Consumer<List<T>> processor, String writerName) { private <T> ItemWriter<T> createWriter(Consumer<List<T>> processor, String writerName) {

View File

@ -1,5 +1,7 @@
package com.interplug.qcast.batch.master; package com.interplug.qcast.batch.master;
import com.interplug.qcast.biz.displayItem.DisplayItemService;
import com.interplug.qcast.biz.displayItem.dto.DisplayItemRequest;
import com.interplug.qcast.biz.storeFavorite.StoreFavoriteService; import com.interplug.qcast.biz.storeFavorite.StoreFavoriteService;
import com.interplug.qcast.biz.storeFavorite.dto.StoreFavoriteRequest; import com.interplug.qcast.biz.storeFavorite.dto.StoreFavoriteRequest;
import com.interplug.qcast.biz.user.UserService; import com.interplug.qcast.biz.user.UserService;
@ -32,6 +34,7 @@ public class StoreJobConfiguration implements JobExecutionListener {
private final InterfaceQsp interfaceQsp; private final InterfaceQsp interfaceQsp;
private final UserService userService; private final UserService userService;
private final StoreFavoriteService storeFavService; private final StoreFavoriteService storeFavService;
private final DisplayItemService displayItemService;
@Value("${qsp.master-store-batch-url}") @Value("${qsp.master-store-batch-url}")
private String qspMasterStoreBatchUrl; private String qspMasterStoreBatchUrl;
@ -39,10 +42,14 @@ public class StoreJobConfiguration implements JobExecutionListener {
private StoreSyncResponse storeSyncResponse; private StoreSyncResponse storeSyncResponse;
public StoreJobConfiguration( public StoreJobConfiguration(
InterfaceQsp interfaceQsp, UserService userService, StoreFavoriteService storeFavService) { InterfaceQsp interfaceQsp,
UserService userService,
StoreFavoriteService storeFavService,
DisplayItemService displayItemService) {
this.interfaceQsp = interfaceQsp; this.interfaceQsp = interfaceQsp;
this.userService = userService; this.userService = userService;
this.storeFavService = storeFavService; this.storeFavService = storeFavService;
this.displayItemService = displayItemService;
} }
@Override @Override
@ -60,11 +67,16 @@ public class StoreJobConfiguration implements JobExecutionListener {
@Bean @Bean
public Job storeAdditionalJob( public Job storeAdditionalJob(
JobRepository jobRepository, Step storeStep, Step userStep, Step favoriteStep) { JobRepository jobRepository,
Step storeStep,
Step userStep,
Step favoriteStep,
Step storeDispItemStep) {
return new JobBuilder("storeAdditionalJob", jobRepository) return new JobBuilder("storeAdditionalJob", jobRepository)
.start(storeStep) .start(storeStep)
.next(userStep) .next(userStep)
.next(favoriteStep) .next(favoriteStep)
.next(storeDispItemStep)
.listener(this) .listener(this)
.build(); .build();
} }
@ -138,6 +150,28 @@ public class StoreJobConfiguration implements JobExecutionListener {
"favorite")); "favorite"));
} }
@Bean
public Step storeDispItemStep(
JobRepository jobRepository, PlatformTransactionManager transactionManager) {
return buildStep(
"storeDispItemStep",
jobRepository,
transactionManager,
storeDispItemListReader(),
createWriter(
(items) -> {
try {
log.debug("Store Disp Item batch processing {} items", items.size());
displayItemService.setStoreDispItemBatch(items);
log.debug("Successfully processed Store Disp Item batch");
} catch (Exception e) {
log.error("Error processing Store Disp Item batch: {}", e.getMessage(), e);
throw new RuntimeException("Failed to process Store Disp Item batch", e);
}
},
"storeDispItem"));
}
private <T> ListItemReader<T> createReader(List<T> items, String readerName) { private <T> ListItemReader<T> createReader(List<T> items, String readerName) {
log.info("{}Reader 호출됨...", readerName); log.info("{}Reader 호출됨...", readerName);
return new ListItemReader<>(items != null ? items : Collections.emptyList()); return new ListItemReader<>(items != null ? items : Collections.emptyList());
@ -163,6 +197,14 @@ public class StoreJobConfiguration implements JobExecutionListener {
storeSyncResponse != null ? storeSyncResponse.getStoreFavList() : null, "storeFav"); storeSyncResponse != null ? storeSyncResponse.getStoreFavList() : null, "storeFav");
} }
@Bean
@StepScope
public ListItemReader<DisplayItemRequest> storeDispItemListReader() {
return createReader(
storeSyncResponse != null ? storeSyncResponse.getStoreDispItemList() : null,
"storeDispItem");
}
private <T> ItemWriter<T> createWriter(Consumer<List<T>> processor, String writerName) { private <T> ItemWriter<T> createWriter(Consumer<List<T>> processor, String writerName) {
return items -> { return items -> {
try { try {

View File

@ -1,8 +1,7 @@
package com.interplug.qcast.biz.specialNote.dto; package com.interplug.qcast.biz.specialNote.dto;
import java.util.List;
import com.interplug.qcast.biz.displayItem.dto.DisplayItemRequest;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import java.util.List;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
@ -15,8 +14,4 @@ public class SpecialNoteSyncResponse {
@Schema(description = "견적 특이사항 아이템 목록") @Schema(description = "견적 특이사항 아이템 목록")
private List<SpecialNoteItemRequest> sdOrderSpnItemList; private List<SpecialNoteItemRequest> sdOrderSpnItemList;
@Schema(description = "노출 아이템 목록")
private List<DisplayItemRequest> storeDispItemList;
} }

View File

@ -1,5 +1,6 @@
package com.interplug.qcast.biz.user.dto; package com.interplug.qcast.biz.user.dto;
import com.interplug.qcast.biz.displayItem.dto.DisplayItemRequest;
import com.interplug.qcast.biz.storeFavorite.dto.StoreFavoriteRequest; import com.interplug.qcast.biz.storeFavorite.dto.StoreFavoriteRequest;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import java.util.List; import java.util.List;
@ -18,4 +19,7 @@ public class StoreSyncResponse {
@Schema(description = "즐겨찾기 목록") @Schema(description = "즐겨찾기 목록")
private List<StoreFavoriteRequest> storeFavList; private List<StoreFavoriteRequest> storeFavList;
@Schema(description = "노출 아이템 목록")
private List<DisplayItemRequest> storeDispItemList;
} }