diff --git a/src/main/java/com/interplug/qcast/batch/JobLauncherController.java b/src/main/java/com/interplug/qcast/batch/JobLauncherController.java index d79b24a1..df75f034 100644 --- a/src/main/java/com/interplug/qcast/batch/JobLauncherController.java +++ b/src/main/java/com/interplug/qcast/batch/JobLauncherController.java @@ -178,4 +178,34 @@ public class JobLauncherController { return "OK"; } + + /** + * 영업사원 동기화 배치 + * + * @return + * @throws JobInstanceAlreadyCompleteException + * @throws JobExecutionAlreadyRunningException + * @throws JobParametersInvalidException + * @throws JobRestartException + */ + @Scheduled(cron = "0 0 0 * * *") + public String businessChargerJob() + throws JobInstanceAlreadyCompleteException, + JobExecutionAlreadyRunningException, + JobParametersInvalidException, + JobRestartException { + + String jobName = "businessChargerJob"; + Job job = jobs.get(jobName); + if (job == null) { + return "Job " + jobName + " not found"; + } + + JobParameters jobParameters = + new JobParametersBuilder().addDate("time", new Date()).toJobParameters(); + + jobLauncher.run(job, jobParameters); + + return "OK"; + } } diff --git a/src/main/java/com/interplug/qcast/batch/master/BomConfiguration.java b/src/main/java/com/interplug/qcast/batch/master/BomConfiguration.java index d5225292..7cb2bfb8 100644 --- a/src/main/java/com/interplug/qcast/batch/master/BomConfiguration.java +++ b/src/main/java/com/interplug/qcast/batch/master/BomConfiguration.java @@ -23,7 +23,7 @@ import org.springframework.context.annotation.Configuration; import org.springframework.http.HttpMethod; import org.springframework.transaction.PlatformTransactionManager; -/** chunk 방식의 Job을 생성하는 Configuration */ +/** Bom Item 마스터 동기화 배치 */ @Configuration public class BomConfiguration implements JobExecutionListener { private final DisplayItemService displayItemService; diff --git a/src/main/java/com/interplug/qcast/batch/master/BusinessChargerConfiguration.java b/src/main/java/com/interplug/qcast/batch/master/BusinessChargerConfiguration.java new file mode 100644 index 00000000..13032a6a --- /dev/null +++ b/src/main/java/com/interplug/qcast/batch/master/BusinessChargerConfiguration.java @@ -0,0 +1,85 @@ +package com.interplug.qcast.batch.master; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.interplug.qcast.biz.user.UserService; +import com.interplug.qcast.biz.user.dto.BusinessChargerSyncResponse; +import com.interplug.qcast.util.InterfaceQsp; +import java.util.Collections; +import java.util.List; +import org.springframework.batch.core.Job; +import org.springframework.batch.core.JobExecutionListener; +import org.springframework.batch.core.Step; +import org.springframework.batch.core.configuration.annotation.StepScope; +import org.springframework.batch.core.job.builder.JobBuilder; +import org.springframework.batch.core.repository.JobRepository; +import org.springframework.batch.core.step.builder.StepBuilder; +import org.springframework.batch.item.ItemProcessor; +import org.springframework.batch.item.ItemReader; +import org.springframework.batch.item.ItemWriter; +import org.springframework.batch.item.support.ListItemReader; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.HttpMethod; +import org.springframework.transaction.PlatformTransactionManager; + +/** 영업사원 동기화 배치 */ +@Configuration +public class BusinessChargerConfiguration implements JobExecutionListener { + private final UserService userService; + + private final InterfaceQsp interfaceQsp; + + List businessChargerSyncList; + + @Value("${qsp.master-business-charger-batch-url}") + private String qspInterfaceUrl; + + public BusinessChargerConfiguration(UserService userService, InterfaceQsp interfaceQsp) { + this.userService = userService; + this.interfaceQsp = interfaceQsp; + } + + @Bean + public Job businessChargerJob(JobRepository jobRepository, Step businessChargerStep) { + return new JobBuilder("businessChargerJob", jobRepository).start(businessChargerStep).build(); + } + + @Bean + public Step businessChargerStep( + JobRepository jobRepository, PlatformTransactionManager transactionManager) throws Exception { + return new StepBuilder("businessChargerStep", jobRepository) + .chunk(100, transactionManager) + .reader(businessChargerReader()) + .processor(businessChargerProcessor()) + .writer(businessChargerWriter()) + .build(); + } + + @Bean + @StepScope + public ItemReader businessChargerReader() throws Exception { + this.businessChargerSyncList = + interfaceQsp.callApiData( + HttpMethod.GET, + qspInterfaceUrl, + null, + new TypeReference>() {}); + return (businessChargerSyncList != null) + ? new ListItemReader<>(businessChargerSyncList) + : new ListItemReader<>(Collections.emptyList()); + } + + @Bean + public ItemProcessor + businessChargerProcessor() { + return item -> item; + } + + @Bean + public ItemWriter businessChargerWriter() { + return items -> { + userService.setBusinessChargerSyncSave((List) items.getItems()); + }; + } +} diff --git a/src/main/java/com/interplug/qcast/batch/master/MaterialConfiguration.java b/src/main/java/com/interplug/qcast/batch/master/MaterialConfiguration.java index c6477823..04212798 100644 --- a/src/main/java/com/interplug/qcast/batch/master/MaterialConfiguration.java +++ b/src/main/java/com/interplug/qcast/batch/master/MaterialConfiguration.java @@ -24,7 +24,7 @@ import org.springframework.context.annotation.Configuration; import org.springframework.http.HttpMethod; import org.springframework.transaction.PlatformTransactionManager; -/** chunk 방식의 Job을 생성하는 Configuration */ +/** Item 마스터 동기화 배치 */ @Configuration public class MaterialConfiguration implements JobExecutionListener { private final DisplayItemService displayItemService; diff --git a/src/main/java/com/interplug/qcast/biz/user/UserMapper.java b/src/main/java/com/interplug/qcast/biz/user/UserMapper.java index 2a5ff0b5..70892027 100644 --- a/src/main/java/com/interplug/qcast/biz/user/UserMapper.java +++ b/src/main/java/com/interplug/qcast/biz/user/UserMapper.java @@ -1,5 +1,6 @@ package com.interplug.qcast.biz.user; +import com.interplug.qcast.biz.user.dto.BusinessChargerSyncResponse; import com.interplug.qcast.biz.user.dto.StoreRequest; import com.interplug.qcast.biz.user.dto.UserRequest; import org.apache.ibatis.annotations.Mapper; @@ -42,4 +43,23 @@ public interface UserMapper { * @throws Exception */ int setUserSave(UserRequest userReqList) throws Exception; + + /** + * 영업사원 삭제 + * + * @param + * @return + * @throws Exception + */ + int deleteBusinessChargerSync() throws Exception; + + /** + * 영업사원 정보 동기화 저장 + * + * @param businessChargerSyncData + * @return + * @throws Exception + */ + int setBusinessChargerSyncSave(BusinessChargerSyncResponse businessChargerSyncData) + throws Exception; } diff --git a/src/main/java/com/interplug/qcast/biz/user/UserService.java b/src/main/java/com/interplug/qcast/biz/user/UserService.java index 76dcfe36..47c46486 100644 --- a/src/main/java/com/interplug/qcast/biz/user/UserService.java +++ b/src/main/java/com/interplug/qcast/biz/user/UserService.java @@ -1,5 +1,6 @@ package com.interplug.qcast.biz.user; +import com.interplug.qcast.biz.user.dto.BusinessChargerSyncResponse; import com.interplug.qcast.biz.user.dto.StoreRequest; import com.interplug.qcast.biz.user.dto.UserRequest; import java.util.List; @@ -82,4 +83,21 @@ public class UserService { } } } + + /** + * 영업사원 정보 동기화 + * + * @param businessChargerSyncList 영업사원 목록 + * @return + * @throws Exception + */ + public int setBusinessChargerSyncSave(List businessChargerSyncList) + throws Exception { + int cnt = 0; + userMapper.deleteBusinessChargerSync(); + for (BusinessChargerSyncResponse businessChargerSyncData : businessChargerSyncList) { + cnt += userMapper.setBusinessChargerSyncSave(businessChargerSyncData); + } + return cnt; + } } diff --git a/src/main/java/com/interplug/qcast/biz/user/dto/BusinessChargerSyncResponse.java b/src/main/java/com/interplug/qcast/biz/user/dto/BusinessChargerSyncResponse.java new file mode 100644 index 00000000..f4520950 --- /dev/null +++ b/src/main/java/com/interplug/qcast/biz/user/dto/BusinessChargerSyncResponse.java @@ -0,0 +1,27 @@ +package com.interplug.qcast.biz.user.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +/** 아이템 동기화 Request */ +@Data +public class BusinessChargerSyncResponse { + + @Schema(description = "Business Charger Code") + String businessChargerCd; + + @Schema(description = "Business Charger Name") + String businessCharger; + + @Schema(description = "Business Charger Team Code") + String businessTeamCd; + + @Schema(description = "Business Charger Telephone") + String businessChargerTel; + + @Schema(description = "Business Charger Email") + String businessChargerMail; + + @Schema(description = "Delete Flg") + String delFlg; +} diff --git a/src/main/resources/mappers/user/userMapper.xml b/src/main/resources/mappers/user/userMapper.xml index 65f2498d..0ec87a1a 100644 --- a/src/main/resources/mappers/user/userMapper.xml +++ b/src/main/resources/mappers/user/userMapper.xml @@ -249,4 +249,41 @@ ); + + UPDATE M_BUSINESS_CHARGER SET DEL_FLG = '1' + + + + /* sqlid : com.interplug.qcast.user.setBusinessChargerSyncSave */ + MERGE INTO M_BUSINESS_CHARGER AS A + USING ( SELECT #{businessChargerCd} AS BUSINESS_CHARGER_CD ) AS D + ON A.BUSINESS_CHARGER_CD = D.BUSINESS_CHARGER_CD + WHEN MATCHED THEN + UPDATE SET + BUSINESS_CHARGER = #{businessCharger} + , BUSINESS_TEAM_CD = #{businessTeamCd} + , BUSINESS_CHARGER_TEL = #{businessChargerTel} + , BUSINESS_CHARGER_MAIL = #{businessChargerMail} + , DEL_FLG = #{delFlg} + , LAST_EDIT_DATETIME = GETDATE() + WHEN NOT MATCHED THEN + INSERT ( + BUSINESS_CHARGER_CD + , BUSINESS_CHARGER + , BUSINESS_TEAM_CD + , BUSINESS_CHARGER_TEL + , BUSINESS_CHARGER_MAIL + , DEL_FLG + , LAST_EDIT_DATETIME + ) VALUES ( + #{businessChargerCd} + , #{businessCharger} + , #{businessTeamCd} + , #{businessChargerTel} + , #{businessChargerMail} + , #{delFlg} + , GETDATE() + ); + + \ No newline at end of file