Compare commits

..

No commits in common. "feature/qcast-925" and "main" have entirely different histories.

234 changed files with 2443 additions and 13088 deletions

3
.gitignore vendored
View File

@ -33,6 +33,3 @@ build/
### VS Code ###
.vscode/
### logs ###
qcast3/

45
pom.xml
View File

@ -15,7 +15,6 @@
<description>qcast</description>
<properties>
<java.version>17</java.version>
<spring-cloud.version>2023.0.2</spring-cloud.version>
</properties>
<dependencies>
<!-- Spring Boot Start -->
@ -27,10 +26,6 @@
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-batch</artifactId>
@ -108,7 +103,7 @@
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
<version>2.3.0</version>
<version>2.6.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
@ -165,47 +160,9 @@
<version>1.0.9</version>
</dependency>
<!--pdf-->
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.18.1</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>html2pdf</artifactId>
<version>4.0.3</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>kernel</artifactId>
<version>7.2.5</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>layout</artifactId>
<version>7.2.5</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>io</artifactId>
<version>7.2.5</version>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>

View File

@ -1,13 +1,9 @@
package com.interplug.qcast.batch;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import lombok.RequiredArgsConstructor;
import org.springframework.batch.core.BatchStatus;
import org.springframework.batch.core.ExitStatus;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobExecution;
import org.springframework.batch.core.JobParameters;
import org.springframework.batch.core.JobParametersBuilder;
import org.springframework.batch.core.JobParametersInvalidException;
@ -15,7 +11,6 @@ import org.springframework.batch.core.launch.JobLauncher;
import org.springframework.batch.core.repository.JobExecutionAlreadyRunningException;
import org.springframework.batch.core.repository.JobInstanceAlreadyCompleteException;
import org.springframework.batch.core.repository.JobRestartException;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
@ -28,9 +23,6 @@ public class JobLauncherController {
private final JobLauncher jobLauncher;
@Value("${qsp.master-admin-user-batch-url}")
private String qspInterfaceUrl;
/**
* 특정 Job을 매핑으로 실행하는 메소드
*
@ -42,35 +34,59 @@ public class JobLauncherController {
* @throws JobRestartException
*/
@GetMapping("/batch/job/{jobName}") // Path Variable로 jobName을 받음
public Map<String, Object> launchJob(@PathVariable String jobName)
throws JobInstanceAlreadyCompleteException, JobExecutionAlreadyRunningException,
JobParametersInvalidException, JobRestartException {
public String launchJob(@PathVariable String jobName)
throws JobInstanceAlreadyCompleteException,
JobExecutionAlreadyRunningException,
JobParametersInvalidException,
JobRestartException {
Job job = jobs.get(jobName);
Map<String, Object> resultMap = new HashMap<String, Object>();
if (job == null) {
// return "Job " + jobName + " not found";
resultMap.put("code", "FAILED");
resultMap.put("message", "Job" + jobName + " not found");
return resultMap;
return "Job " + jobName + " not found";
}
JobParameters jobParameters = new JobParametersBuilder().addString("jobName", jobName)
.addDate("time", new Date()).toJobParameters();
JobParameters jobParameters =
new JobParametersBuilder()
.addString("jobName", jobName)
.addDate("time", new Date())
.toJobParameters();
JobExecution jobExecution = jobLauncher.run(job, jobParameters);
jobLauncher.run(job, jobParameters);
return "Job " + jobName + " started";
}
/**
* 스케줄러로 Job을 실행하는 메소드
*
* @return
* @throws JobInstanceAlreadyCompleteException
* @throws JobExecutionAlreadyRunningException
* @throws JobParametersInvalidException
* @throws JobRestartException
*/
@Scheduled(cron = "0 55 23 * * *")
public String scheduleJobLauncher()
throws JobInstanceAlreadyCompleteException,
JobExecutionAlreadyRunningException,
JobParametersInvalidException,
JobRestartException {
BatchStatus status = jobExecution.getStatus();
ExitStatus exitStatus = jobExecution.getExitStatus();
String jobName = "sampleOtherJob";
Job job = jobs.get(jobName);
if (job == null) {
return "Job " + jobName + " not found";
}
resultMap.put("code", status.toString());
resultMap.put("message", exitStatus.getExitDescription());
JobParameters jobParameters =
new JobParametersBuilder()
.addString("jobName", jobName)
.addDate("time", new Date())
.toJobParameters();
jobLauncher.run(job, jobParameters);
// return "Job " + jobName + " started";
return resultMap;
return "Job " + jobName + " started";
}
/**
@ -82,22 +98,24 @@ public class JobLauncherController {
* @throws JobParametersInvalidException
* @throws JobRestartException
*/
// @Scheduled(cron = "*/5 * * * * *")
// @Scheduled(cron = "*/5 * * * * *")
@Scheduled(cron = "0 55 23 * * *")
public String storeAdditionalInfoJob() throws JobInstanceAlreadyCompleteException,
JobExecutionAlreadyRunningException, JobParametersInvalidException, JobRestartException {
public String storeAdditionalInfoJob()
throws JobInstanceAlreadyCompleteException,
JobExecutionAlreadyRunningException,
JobParametersInvalidException,
JobRestartException {
String jobName = "storeAdditionalJob";
Job job = jobs.get(jobName);
if (job == null) {
return "Job " + jobName + " not found";
}
if ("Y".equals(System.getProperty("spring.profiles.scheduler"))) {
JobParameters jobParameters =
new JobParametersBuilder().addDate("time", new Date()).toJobParameters();
JobParameters jobParameters =
new JobParametersBuilder().addDate("time", new Date()).toJobParameters();
jobLauncher.run(job, jobParameters);
jobLauncher.run(job, jobParameters);
}
return "OK";
}
@ -110,9 +128,12 @@ public class JobLauncherController {
* @throws JobParametersInvalidException
* @throws JobRestartException
*/
@Scheduled(cron = "0 30 02 * * *")
public String materialJob() throws JobInstanceAlreadyCompleteException,
JobExecutionAlreadyRunningException, JobParametersInvalidException, JobRestartException {
@Scheduled(cron = "0 0 0 * * *")
public String materialJob()
throws JobInstanceAlreadyCompleteException,
JobExecutionAlreadyRunningException,
JobParametersInvalidException,
JobRestartException {
String jobName = "materialJob";
Job job = jobs.get(jobName);
@ -120,241 +141,10 @@ public class JobLauncherController {
return "Job " + jobName + " not found";
}
if ("Y".equals(System.getProperty("spring.profiles.scheduler"))) {
JobParameters jobParameters =
new JobParametersBuilder().addDate("time", new Date()).toJobParameters();
JobParameters jobParameters =
new JobParametersBuilder().addDate("time", new Date()).toJobParameters();
jobLauncher.run(job, jobParameters);
}
return "OK";
}
/**
* BOM 아이템 동기화 배치
*
* @return
* @throws JobInstanceAlreadyCompleteException
* @throws JobExecutionAlreadyRunningException
* @throws JobParametersInvalidException
* @throws JobRestartException
*/
@Scheduled(cron = "0 40 02 * * *")
public String bomJob() throws JobInstanceAlreadyCompleteException,
JobExecutionAlreadyRunningException, JobParametersInvalidException, JobRestartException {
String jobName = "bomJob";
Job job = jobs.get(jobName);
if (job == null) {
return "Job " + jobName + " not found";
}
if ("Y".equals(System.getProperty("spring.profiles.scheduler"))) {
JobParameters jobParameters =
new JobParametersBuilder().addDate("time", new Date()).toJobParameters();
jobLauncher.run(job, jobParameters);
}
return "OK";
}
/**
* 영업사원 동기화 배치
*
* @return
* @throws JobInstanceAlreadyCompleteException
* @throws JobExecutionAlreadyRunningException
* @throws JobParametersInvalidException
* @throws JobRestartException
*/
@Scheduled(cron = "0 40 03 * * *")
public String businessChargerJob() throws JobInstanceAlreadyCompleteException,
JobExecutionAlreadyRunningException, JobParametersInvalidException, JobRestartException {
String jobName = "businessChargerJob";
Job job = jobs.get(jobName);
if (job == null) {
return "Job " + jobName + " not found";
}
if ("Y".equals(System.getProperty("spring.profiles.scheduler"))) {
JobParameters jobParameters =
new JobParametersBuilder().addDate("time", new Date()).toJobParameters();
jobLauncher.run(job, jobParameters);
}
return "OK";
}
/**
* 관리자 유저 동기화 배치
*
* @return
* @throws JobInstanceAlreadyCompleteException
* @throws JobExecutionAlreadyRunningException
* @throws JobParametersInvalidException
* @throws JobRestartException
*/
@Scheduled(cron = "0 0 01 * * *")
public String adminUserJob() throws JobInstanceAlreadyCompleteException,
JobExecutionAlreadyRunningException, JobParametersInvalidException, JobRestartException {
String jobName = "adminUserJob";
Job job = jobs.get(jobName);
if (job == null) {
return "Job " + jobName + " not found";
}
if ("Y".equals(System.getProperty("spring.profiles.scheduler"))) {
JobParameters jobParameters =
new JobParametersBuilder().addDate("time", new Date()).toJobParameters();
jobLauncher.run(job, jobParameters);
}
return "OK";
}
/**
* 가격 동기화 배치
*
* @return
* @throws JobInstanceAlreadyCompleteException
* @throws JobExecutionAlreadyRunningException
* @throws JobParametersInvalidException
* @throws JobRestartException
*/
@Scheduled(cron = "0 0 0 * * *")
public String priceJob() throws JobInstanceAlreadyCompleteException,
JobExecutionAlreadyRunningException, JobParametersInvalidException, JobRestartException {
String jobName = "priceJob";
Job job = jobs.get(jobName);
if (job == null) {
return "Job " + jobName + " not found";
}
if ("Y".equals(System.getProperty("spring.profiles.scheduler"))) {
JobParameters jobParameters =
new JobParametersBuilder().addDate("time", new Date()).toJobParameters();
jobLauncher.run(job, jobParameters);
}
return "OK";
}
/**
* 공통코드 M_COMM_H, M_COMM_L 동기화 배치
*
* @return
* @throws JobInstanceAlreadyCompleteException
* @throws JobExecutionAlreadyRunningException
* @throws JobParametersInvalidException
* @throws JobRestartException
*/
@Scheduled(cron = "0 10 03 * * *")
public String commonCodeJob() throws JobInstanceAlreadyCompleteException,
JobExecutionAlreadyRunningException, JobParametersInvalidException, JobRestartException {
String jobName = "commonCodeJob";
Job job = jobs.get(jobName);
if (job == null) {
return "Job " + jobName + " not found";
}
if ("Y".equals(System.getProperty("spring.profiles.scheduler"))) {
JobParameters jobParameters =
new JobParametersBuilder().addDate("time", new Date()).toJobParameters();
jobLauncher.run(job, jobParameters);
}
return "OK";
}
/**
* Q.CAST 견적특이사항 / 아이템 표시, 미표시 동기화 배치
*
* @return
* @throws JobInstanceAlreadyCompleteException
* @throws JobExecutionAlreadyRunningException
* @throws JobParametersInvalidException
* @throws JobRestartException
*/
@Scheduled(cron = "0 30 23 * * *")
public String specialNoteDispItemAdditionalInfoJob() throws JobInstanceAlreadyCompleteException,
JobExecutionAlreadyRunningException, JobParametersInvalidException, JobRestartException {
String jobName = "specialNoteDispItemAdditionalJob";
Job job = jobs.get(jobName);
if (job == null) {
return "Job " + jobName + " not found";
}
if ("Y".equals(System.getProperty("spring.profiles.scheduler"))) {
JobParameters jobParameters =
new JobParametersBuilder().addDate("time", new Date()).toJobParameters();
jobLauncher.run(job, jobParameters);
}
return "OK";
}
/**
* Plan Confrim 동기화 배치
*
* @return
* @throws JobInstanceAlreadyCompleteException
* @throws JobExecutionAlreadyRunningException
* @throws JobParametersInvalidException
* @throws JobRestartException
*/
@Scheduled(cron = "0 05 04 * * *")
public String planConfirmJob() throws JobInstanceAlreadyCompleteException,
JobExecutionAlreadyRunningException, JobParametersInvalidException, JobRestartException {
String jobName = "planConfirmJob";
Job job = jobs.get(jobName);
if (job == null) {
return "Job " + jobName + " not found";
}
if ("Y".equals(System.getProperty("spring.profiles.scheduler"))) {
JobParameters jobParameters =
new JobParametersBuilder().addDate("time", new Date()).toJobParameters();
jobLauncher.run(job, jobParameters);
}
return "OK";
}
/**
* 견적서 전송 동기화 배치
*
* @return
* @throws JobInstanceAlreadyCompleteException
* @throws JobExecutionAlreadyRunningException
* @throws JobParametersInvalidException
* @throws JobRestartException
*/
@Scheduled(cron = "0 20 04 * * *")
public String estimateSyncJob() throws JobInstanceAlreadyCompleteException,
JobExecutionAlreadyRunningException, JobParametersInvalidException, JobRestartException {
String jobName = "estimateSyncJob";
Job job = jobs.get(jobName);
if (job == null) {
return "Job " + jobName + " not found";
}
if ("Y".equals(System.getProperty("spring.profiles.scheduler"))) {
JobParameters jobParameters =
new JobParametersBuilder().addDate("time", new Date()).toJobParameters();
jobLauncher.run(job, jobParameters);
}
jobLauncher.run(job, jobParameters);
return "OK";
}

View File

@ -1,83 +0,0 @@
package com.interplug.qcast.batch.estimate;
import com.interplug.qcast.biz.estimate.EstimateService;
import com.interplug.qcast.biz.estimate.dto.EstimateSyncResponse;
import com.interplug.qcast.biz.estimate.dto.PlanSyncResponse;
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.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;
/** Plan 확정 Item 마스터 동기화 배치 */
@Configuration
public class EstimateSyncConfiguration implements JobExecutionListener {
private final EstimateService estimateService;
private final InterfaceQsp interfaceQsp;
EstimateSyncResponse estimateSyncResponse;
@Value("${qsp.estimate-sync-batch-url}")
private String qspInterfaceUrl;
public EstimateSyncConfiguration(EstimateService estimateService, InterfaceQsp interfaceQsp) {
this.estimateService = estimateService;
this.interfaceQsp = interfaceQsp;
}
@Bean
public Job estimateSyncJob(JobRepository jobRepository, Step estimateSyncStep) {
return new JobBuilder("estimateSyncJob", jobRepository).start(estimateSyncStep).build();
}
@Bean
public Step estimateSyncStep(
JobRepository jobRepository, PlatformTransactionManager transactionManager) throws Exception {
return new StepBuilder("estimateSyncStep", jobRepository)
.<PlanSyncResponse, PlanSyncResponse>chunk(100, transactionManager)
.reader(estimateSyncReader())
.processor(estimateSyncProcessor())
.writer(estimateSyncWriter())
.build();
}
@Bean
@StepScope
public ListItemReader<PlanSyncResponse> estimateSyncReader() throws Exception {
this.estimateSyncResponse =
interfaceQsp.callApiData(
HttpMethod.POST,
qspInterfaceUrl,
estimateService.selectEstimateSyncFailList(),
EstimateSyncResponse.class);
return (estimateSyncResponse != null)
? new ListItemReader<>(estimateSyncResponse.getSuccessList())
: new ListItemReader<>(Collections.emptyList());
}
@Bean
public ItemProcessor<PlanSyncResponse, PlanSyncResponse> estimateSyncProcessor() {
return item -> item;
}
@Bean
public ItemWriter<PlanSyncResponse> estimateSyncWriter() {
return items -> {
estimateService.setEstimateSyncSave((List<PlanSyncResponse>) items.getItems());
};
}
}

View File

@ -1,80 +0,0 @@
package com.interplug.qcast.batch.estimate;
import com.fasterxml.jackson.core.type.TypeReference;
import com.interplug.qcast.biz.estimate.EstimateService;
import com.interplug.qcast.biz.estimate.dto.PlanSyncResponse;
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.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;
/** Plan 확정 Item 마스터 동기화 배치 */
@Configuration
public class PlanConfrimConfiguration implements JobExecutionListener {
private final EstimateService estimateService;
private final InterfaceQsp interfaceQsp;
List<PlanSyncResponse> planSyncList;
@Value("${qsp.estimate-plan-confirm-batch-url}")
private String qspInterfaceUrl;
public PlanConfrimConfiguration(EstimateService estimateService, InterfaceQsp interfaceQsp) {
this.estimateService = estimateService;
this.interfaceQsp = interfaceQsp;
}
@Bean
public Job planConfirmJob(JobRepository jobRepository, Step planConfirmStep) {
return new JobBuilder("planConfirmJob", jobRepository).start(planConfirmStep).build();
}
@Bean
public Step planConfirmStep(
JobRepository jobRepository, PlatformTransactionManager transactionManager) throws Exception {
return new StepBuilder("planConfirmStep", jobRepository)
.<PlanSyncResponse, PlanSyncResponse>chunk(100, transactionManager)
.reader(planConfirmReader())
.processor(planConfirmProcessor())
.writer(planConfirmWriter())
.build();
}
@Bean
@StepScope
public ListItemReader<PlanSyncResponse> planConfirmReader() throws Exception {
this.planSyncList =
interfaceQsp.callApiData(
HttpMethod.GET, qspInterfaceUrl, null, new TypeReference<List<PlanSyncResponse>>() {});
return (planSyncList != null)
? new ListItemReader<>(planSyncList)
: new ListItemReader<>(Collections.emptyList());
}
@Bean
public ItemProcessor<PlanSyncResponse, PlanSyncResponse> planConfirmProcessor() {
return item -> item;
}
@Bean
public ItemWriter<PlanSyncResponse> planConfirmWriter() {
return items -> {
estimateService.setPlanConfirmSyncSave((List<PlanSyncResponse>) items.getItems());
};
}
}

View File

@ -1,80 +0,0 @@
package com.interplug.qcast.batch.master;
import com.fasterxml.jackson.core.type.TypeReference;
import com.interplug.qcast.biz.displayItem.DisplayItemService;
import com.interplug.qcast.biz.displayItem.dto.BomSyncResponse;
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.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;
/** Bom Item 마스터 동기화 배치 */
@Configuration
public class BomConfiguration implements JobExecutionListener {
private final DisplayItemService displayItemService;
private final InterfaceQsp interfaceQsp;
List<BomSyncResponse> bomSyncList;
@Value("${qsp.master-bom-batch-url}")
private String qspInterfaceUrl;
public BomConfiguration(DisplayItemService displayItemService, InterfaceQsp interfaceQsp) {
this.displayItemService = displayItemService;
this.interfaceQsp = interfaceQsp;
}
@Bean
public Job bomJob(JobRepository jobRepository, Step bomStep) {
return new JobBuilder("bomJob", jobRepository).start(bomStep).build();
}
@Bean
public Step bomStep(JobRepository jobRepository, PlatformTransactionManager transactionManager)
throws Exception {
return new StepBuilder("bomStep", jobRepository)
.<BomSyncResponse, BomSyncResponse>chunk(100, transactionManager)
.reader(bomReader())
.processor(bomProcessor())
.writer(bomWriter())
.build();
}
@Bean
@StepScope
public ListItemReader<BomSyncResponse> bomReader() throws Exception {
this.bomSyncList =
interfaceQsp.callApiData(
HttpMethod.GET, qspInterfaceUrl, null, new TypeReference<List<BomSyncResponse>>() {});
return (bomSyncList != null)
? new ListItemReader<>(bomSyncList)
: new ListItemReader<>(Collections.emptyList());
}
@Bean
public ItemProcessor<BomSyncResponse, BomSyncResponse> bomProcessor() {
return item -> item;
}
@Bean
public ItemWriter<BomSyncResponse> bomWriter() {
return items -> {
displayItemService.setBomSyncSave((List<BomSyncResponse>) items.getItems());
};
}
}

View File

@ -2,6 +2,7 @@ package com.interplug.qcast.batch.master;
import com.fasterxml.jackson.core.type.TypeReference;
import com.interplug.qcast.biz.displayItem.DisplayItemService;
import com.interplug.qcast.biz.displayItem.dto.ItemSyncRequest;
import com.interplug.qcast.biz.displayItem.dto.ItemSyncResponse;
import com.interplug.qcast.util.InterfaceQsp;
import java.util.Collections;
@ -14,6 +15,7 @@ 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;
@ -22,7 +24,7 @@ import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpMethod;
import org.springframework.transaction.PlatformTransactionManager;
/** Item 마스터 동기화 배치 */
/** chunk 방식의 Job을 생성하는 Configuration */
@Configuration
public class MaterialConfiguration implements JobExecutionListener {
private final DisplayItemService displayItemService;
@ -57,12 +59,14 @@ public class MaterialConfiguration implements JobExecutionListener {
@Bean
@StepScope
public ListItemReader<ItemSyncResponse> materialReader() throws Exception {
public ItemReader<ItemSyncResponse> materialReader() throws Exception {
ItemSyncRequest itemSyncRequest = new ItemSyncRequest();
itemSyncRequest.setAllYn("N");
this.itemSyncList =
interfaceQsp.callApiData(
HttpMethod.GET,
qspInterfaceUrl + "?allYn=Y",
null,
qspInterfaceUrl,
itemSyncRequest,
new TypeReference<List<ItemSyncResponse>>() {});
return (itemSyncList != null)
? new ListItemReader<>(itemSyncList)

View File

@ -1,153 +0,0 @@
package com.interplug.qcast.batch.master;
import com.interplug.qcast.biz.displayItem.DisplayItemService;
import com.interplug.qcast.biz.displayItem.dto.PriceItemSyncResponse;
import com.interplug.qcast.biz.displayItem.dto.PriceSyncResponse;
import com.interplug.qcast.util.InterfaceQsp;
import java.util.Collections;
import java.util.List;
import java.util.function.Consumer;
import lombok.extern.slf4j.Slf4j;
import org.springframework.batch.core.*;
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.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;
/** Price 동기화 배치 */
@Configuration
@Slf4j
public class PriceJobConfiguration implements JobExecutionListener {
private final InterfaceQsp interfaceQsp;
private final DisplayItemService displayItemService;
@Value("${qsp.master-price-batch-url}")
private String qspInterfaceUrl;
private PriceSyncResponse priceSyncResponse;
public PriceJobConfiguration(InterfaceQsp interfaceQsp, DisplayItemService displayItemService) {
this.interfaceQsp = interfaceQsp;
this.displayItemService = displayItemService;
}
@Override
public void beforeJob(JobExecution jobExecution) {
log.info("Job 시작: 초기화 메서드 호출 중...");
try {
this.priceSyncResponse =
interfaceQsp.callApiData(
HttpMethod.GET, qspInterfaceUrl + "?allYn=N", null, PriceSyncResponse.class);
log.info("API 호출 완료, 항목 수: {}", this.priceSyncResponse.getModulePriceList().size());
} catch (Exception e) {
log.error("priceSyncResponse 갱신 중 오류: {}", e.getMessage());
}
}
@Bean
public Job priceJob(JobRepository jobRepository, Step modulePriceStep, Step bosPriceStep) {
return new JobBuilder("priceJob", jobRepository)
.start(modulePriceStep)
.next(bosPriceStep)
.listener(this)
.build();
}
private <T> Step buildStep(
String stepName,
JobRepository jobRepository,
PlatformTransactionManager transactionManager,
ItemReader<T> reader,
ItemWriter<T> writer) {
return new StepBuilder(stepName, jobRepository)
.<T, T>chunk(100, transactionManager)
.reader(reader)
.writer(writer)
.build();
}
@Bean
public Step modulePriceStep(
JobRepository jobRepository, PlatformTransactionManager transactionManager) {
return buildStep(
"modulePriceStep",
jobRepository,
transactionManager,
modulePriceListReader(),
createWriter(
(items) -> {
try {
log.debug("Module Price batch processing {} items", items.size());
displayItemService.setPriceSyncSave(items);
log.debug("Successfully processed Module Price batch");
} catch (Exception e) {
log.error("Error processing Module Price batch: {}", e.getMessage(), e);
throw new RuntimeException("Failed to process Module Price batch", e);
}
},
"module price"));
}
@Bean
public Step bosPriceStep(
JobRepository jobRepository, PlatformTransactionManager transactionManager) {
return buildStep(
"bosPriceStep",
jobRepository,
transactionManager,
bosPriceListReader(),
createWriter(
(items) -> {
try {
log.debug("Bos Price batch processing {} items", items.size());
displayItemService.setPriceSyncSave(items);
log.debug("Successfully processed Bos Price batch");
} catch (Exception e) {
log.error("Error processing Bos Price batch: {}", e.getMessage(), e);
throw new RuntimeException("Failed to process Bos Price batch", e);
}
},
"bos price"));
}
private <T> ListItemReader<T> createReader(List<T> items, String readerName) {
log.info("{}Reader 호출됨...", readerName);
return new ListItemReader<>(items != null ? items : Collections.emptyList());
}
@Bean
@StepScope
public ListItemReader<PriceItemSyncResponse> modulePriceListReader() {
return createReader(
priceSyncResponse != null ? priceSyncResponse.getModulePriceList() : null, "module");
}
@Bean
@StepScope
public ListItemReader<PriceItemSyncResponse> bosPriceListReader() {
return createReader(
priceSyncResponse != null ? priceSyncResponse.getBosPriceList() : null, "bos");
}
private <T> ItemWriter<T> createWriter(Consumer<List<T>> processor, String writerName) {
return items -> {
try {
List<T> itemList = (List<T>) items.getItems();
processor.accept(itemList);
log.info("{}Writer: {} items 처리 완료", writerName, items.size());
} catch (Exception e) {
log.error("{}Writer 오류: {}", writerName, e.getMessage());
throw e;
}
};
}
}

View File

@ -1,169 +0,0 @@
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.List;
import java.util.function.Consumer;
import lombok.extern.slf4j.Slf4j;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobExecution;
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.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
@Slf4j
public class SpecialNoteDispItemJobConfiguration implements JobExecutionListener {
private final InterfaceQsp interfaceQsp;
private final SpecialNoteService specialNoteService;
@Value("${qsp.master-special-note-disp-item-batch-url}")
private String qspMasterSpecialNoteDispItemBatchUrl;
private SpecialNoteSyncResponse SpecialNoteDispItemSyncResponse;
public SpecialNoteDispItemJobConfiguration(
InterfaceQsp interfaceQsp, SpecialNoteService specialNoteService) {
this.interfaceQsp = interfaceQsp;
this.specialNoteService = specialNoteService;
}
@Override
public void beforeJob(JobExecution jobExecution) {
log.info("Job 시작: 초기화 메서드 호출 중...");
try {
this.SpecialNoteDispItemSyncResponse =
interfaceQsp.callApiData(
HttpMethod.GET,
qspMasterSpecialNoteDispItemBatchUrl,
null,
SpecialNoteSyncResponse.class);
log.info(
"API 호출 완료, 항목 수: {}", this.SpecialNoteDispItemSyncResponse.getSdOrderSpnList().size());
} catch (Exception e) {
log.error("specialNoteDispItemSyncResponse 갱신 중 오류: {}", e.getMessage());
}
}
@Bean
public Job specialNoteDispItemAdditionalJob(
JobRepository jobRepository, Step specialNoteStep, Step specialNoteItemStep) {
return new JobBuilder("specialNoteDispItemAdditionalJob", jobRepository)
.start(specialNoteStep)
.next(specialNoteItemStep)
.listener(this)
.build();
}
private <T> Step buildStep(
String stepName,
JobRepository jobRepository,
PlatformTransactionManager transactionManager,
ItemReader<T> reader,
ItemWriter<T> writer) {
return new StepBuilder(stepName, jobRepository)
.<T, T>chunk(10, transactionManager)
.reader(reader)
.writer(writer)
.build();
}
@Bean
public Step specialNoteStep(
JobRepository jobRepository, PlatformTransactionManager transactionManager) {
return buildStep(
"specialNoteStep",
jobRepository,
transactionManager,
specialNoteListReader(),
createWriter(
(items) -> {
try {
log.debug("Special Note batch processing {} items", items.size());
specialNoteService.setSpecialNoteBatch(items);
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
public Step specialNoteItemStep(
JobRepository jobRepository, PlatformTransactionManager transactionManager) {
return buildStep(
"specialNoteItemStep",
jobRepository,
transactionManager,
specialNoteItemListReader(),
createWriter(
(items) -> {
try {
log.debug("Special Note Item batch processing {} items", items.size());
specialNoteService.setSpecialNoteItemBatch(items);
log.debug("Successfully processed Special Note Item batch");
} catch (Exception e) {
log.error("Error processing Special Note Item batch: {}", e.getMessage(), e);
throw new RuntimeException("Failed to process Special Note Item batch", e);
}
},
"specialNoteItem"));
}
private <T> ListItemReader<T> createReader(List<T> items, String readerName) {
log.info("{}Reader 호출됨...", readerName);
return new ListItemReader<>(items != null ? items : Collections.emptyList());
}
@Bean
@StepScope
public ListItemReader<SpecialNoteRequest> specialNoteListReader() {
return createReader(
SpecialNoteDispItemSyncResponse != null
? SpecialNoteDispItemSyncResponse.getSdOrderSpnList()
: null,
"specialNote");
}
@Bean
@StepScope
public ListItemReader<SpecialNoteItemRequest> specialNoteItemListReader() {
return createReader(
SpecialNoteDispItemSyncResponse != null
? SpecialNoteDispItemSyncResponse.getSdOrderSpnItemList()
: null,
"specialNoteItem");
}
private <T> ItemWriter<T> createWriter(Consumer<List<T>> processor, String writerName) {
return items -> {
try {
List<T> itemList = (List<T>) items.getItems();
processor.accept(itemList);
log.info("{}Writer: {} items 처리 완료", writerName, items.size());
} catch (Exception e) {
log.error("{}Writer 오류: {}", writerName, e.getMessage());
throw e;
}
};
}
}

View File

@ -1,13 +1,10 @@
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.dto.StoreFavoriteRequest;
import com.interplug.qcast.biz.user.UserService;
import com.interplug.qcast.biz.user.dto.StoreRequest;
import com.interplug.qcast.biz.user.dto.StoreSyncResponse;
import com.interplug.qcast.biz.user.dto.StoreSyncResquest;
import com.interplug.qcast.biz.user.dto.UserRequest;
import com.interplug.qcast.util.InterfaceQsp;
import java.util.Collections;
@ -35,7 +32,6 @@ public class StoreJobConfiguration implements JobExecutionListener {
private final InterfaceQsp interfaceQsp;
private final UserService userService;
private final StoreFavoriteService storeFavService;
private final DisplayItemService displayItemService;
@Value("${qsp.master-store-batch-url}")
private String qspMasterStoreBatchUrl;
@ -43,26 +39,19 @@ public class StoreJobConfiguration implements JobExecutionListener {
private StoreSyncResponse storeSyncResponse;
public StoreJobConfiguration(
InterfaceQsp interfaceQsp,
UserService userService,
StoreFavoriteService storeFavService,
DisplayItemService displayItemService) {
InterfaceQsp interfaceQsp, UserService userService, StoreFavoriteService storeFavService) {
this.interfaceQsp = interfaceQsp;
this.userService = userService;
this.storeFavService = storeFavService;
this.displayItemService = displayItemService;
}
@Override
public void beforeJob(JobExecution jobExecution) {
log.info("Job 시작: 초기화 메서드 호출 중...");
try {
StoreSyncResquest storeSyncResquest = new StoreSyncResquest();
storeSyncResquest.setAllYn("N"); // 전체가 아닌 날짜조건으로 조회
this.storeSyncResponse =
interfaceQsp.callApiData(
HttpMethod.GET, qspMasterStoreBatchUrl, storeSyncResquest, StoreSyncResponse.class);
HttpMethod.GET, qspMasterStoreBatchUrl, null, StoreSyncResponse.class);
log.info("API 호출 완료, 항목 수: {}", this.storeSyncResponse.getStoreList().size());
} catch (Exception e) {
log.error("storeSyncResponse 갱신 중 오류: {}", e.getMessage());
@ -71,16 +60,11 @@ public class StoreJobConfiguration implements JobExecutionListener {
@Bean
public Job storeAdditionalJob(
JobRepository jobRepository,
Step storeStep,
Step userStep,
Step favoriteStep,
Step storeDispItemStep) {
JobRepository jobRepository, Step storeStep, Step userStep, Step favoriteStep) {
return new JobBuilder("storeAdditionalJob", jobRepository)
.start(storeStep)
.next(userStep)
.next(favoriteStep)
.next(storeDispItemStep)
.listener(this)
.build();
}
@ -109,9 +93,12 @@ public class StoreJobConfiguration implements JobExecutionListener {
createWriter(
(items) -> {
try {
log.debug("Store batch processing {} items", items.size());
userService.setStoreBatch(items);
log.debug("Successfully processed store batch");
} catch (Exception e) {
log.error("Error processing store batch: {}", e.getMessage(), e);
throw new RuntimeException("Failed to process store batch", e);
}
},
"store"));
@ -127,9 +114,12 @@ public class StoreJobConfiguration implements JobExecutionListener {
createWriter(
(items) -> {
try {
log.debug("User batch processing {} items", items.size());
userService.setUserBatch(items);
log.debug("Successfully processed user batch");
} catch (Exception e) {
log.error("Error processing user batch: {}", e.getMessage(), e);
throw new RuntimeException("Failed to process user batch", e);
}
},
"user"));
@ -146,36 +136,17 @@ public class StoreJobConfiguration implements JobExecutionListener {
createWriter(
(items) -> {
try {
log.debug("Favorite batch processing {} items", items.size());
storeFavService.setStoreFavoriteBatch(items);
log.debug("Successfully processed favorite batch");
} catch (Exception e) {
log.error("Error processing favorite batch: {}", e.getMessage(), e);
throw new RuntimeException("Failed to process favorite batch", e);
}
},
"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) {
log.info("{}Reader 호출됨...", readerName);
return new ListItemReader<>(items != null ? items : Collections.emptyList());
@ -201,14 +172,6 @@ public class StoreJobConfiguration implements JobExecutionListener {
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) {
return items -> {
try {

View File

@ -1,83 +0,0 @@
package com.interplug.qcast.batch.system;
import com.fasterxml.jackson.core.type.TypeReference;
import com.interplug.qcast.biz.user.UserService;
import com.interplug.qcast.biz.user.dto.AdminUserSyncResponse;
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.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 AdminUserConfiguration implements JobExecutionListener {
private final UserService userService;
private final InterfaceQsp interfaceQsp;
List<AdminUserSyncResponse> adminUserSyncList;
@Value("${qsp.master-admin-user-batch-url}")
private String qspInterfaceUrl;
public AdminUserConfiguration(UserService userService, InterfaceQsp interfaceQsp) {
this.userService = userService;
this.interfaceQsp = interfaceQsp;
}
@Bean
public Job adminUserJob(JobRepository jobRepository, Step adminUserStep) {
return new JobBuilder("adminUserJob", jobRepository).start(adminUserStep).build();
}
@Bean
public Step adminUserStep(
JobRepository jobRepository, PlatformTransactionManager transactionManager) throws Exception {
return new StepBuilder("adminUserStep", jobRepository)
.<AdminUserSyncResponse, AdminUserSyncResponse>chunk(100, transactionManager)
.reader(adminUserReader())
.processor(adminUserProcessor())
.writer(adminUserWriter())
.build();
}
@Bean
@StepScope
public ListItemReader<AdminUserSyncResponse> adminUserReader() throws Exception {
this.adminUserSyncList =
interfaceQsp.callApiData(
HttpMethod.GET,
qspInterfaceUrl,
null,
new TypeReference<List<AdminUserSyncResponse>>() {});
return (adminUserSyncList != null)
? new ListItemReader<>(adminUserSyncList)
: new ListItemReader<>(Collections.emptyList());
}
@Bean
public ItemProcessor<AdminUserSyncResponse, AdminUserSyncResponse> adminUserProcessor() {
return item -> item;
}
@Bean
public ItemWriter<AdminUserSyncResponse> adminUserWriter() {
return items -> {
userService.setAdminUserSyncSave((List<AdminUserSyncResponse>) items.getItems());
};
}
}

View File

@ -1,84 +0,0 @@
package com.interplug.qcast.batch.system;
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.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<BusinessChargerSyncResponse> 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)
.<BusinessChargerSyncResponse, BusinessChargerSyncResponse>chunk(100, transactionManager)
.reader(businessChargerReader())
.processor(businessChargerProcessor())
.writer(businessChargerWriter())
.build();
}
@Bean
@StepScope
public ListItemReader<BusinessChargerSyncResponse> businessChargerReader() throws Exception {
this.businessChargerSyncList =
interfaceQsp.callApiData(
HttpMethod.GET,
qspInterfaceUrl,
null,
new TypeReference<List<BusinessChargerSyncResponse>>() {});
return (businessChargerSyncList != null)
? new ListItemReader<>(businessChargerSyncList)
: new ListItemReader<>(Collections.emptyList());
}
@Bean
public ItemProcessor<BusinessChargerSyncResponse, BusinessChargerSyncResponse>
businessChargerProcessor() {
return item -> item;
}
@Bean
public ItemWriter<BusinessChargerSyncResponse> businessChargerWriter() {
return items -> {
userService.setBusinessChargerSyncSave((List<BusinessChargerSyncResponse>) items.getItems());
};
}
}

View File

@ -1,139 +0,0 @@
package com.interplug.qcast.batch.system;
import java.util.Collections;
import java.util.List;
import java.util.function.Consumer;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobExecution;
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.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;
import com.interplug.qcast.biz.commCode.CommCodeService;
import com.interplug.qcast.biz.commCode.dto.CommonCodeSyncResponse;
import com.interplug.qcast.biz.commCode.dto.DetailCodeRequest;
import com.interplug.qcast.biz.commCode.dto.HeadCodeRequest;
import com.interplug.qcast.util.InterfaceQsp;
import lombok.extern.slf4j.Slf4j;
/** 공통코드 동기화 배치 */
@Configuration
@Slf4j
public class CommonCodeConfiguration implements JobExecutionListener {
private final InterfaceQsp interfaceQsp;
private final CommCodeService commCodeService;
@Value("${qsp.system-commonCode-batch-url}")
private String qspInterfaceUrl;
private CommonCodeSyncResponse commonCodeSyncResponse;
public CommonCodeConfiguration(InterfaceQsp interfaceQsp, CommCodeService commCodeService) {
this.interfaceQsp = interfaceQsp;
this.commCodeService = commCodeService;
}
@Override
public void beforeJob(JobExecution jobExecution) {
log.info("Job 시작: 초기화 메서드 호출 중...");
try {
this.commonCodeSyncResponse = interfaceQsp.callApiData(HttpMethod.GET, qspInterfaceUrl, null,
CommonCodeSyncResponse.class);
log.info("API 호출 완료, 항목 수: {}", this.commonCodeSyncResponse.getApiHeadCdList().size());
log.info("API 호출 완료, 항목 수: {}", this.commonCodeSyncResponse.getApiCommCdList().size());
} catch (Exception e) {
log.error("commonCodeSyncResponse 갱신 중 오류: {}", e.getMessage());
}
}
@Bean
public Job commonCodeJob(JobRepository jobRepository, Step headCodeStep, Step commonCodeStep) {
return new JobBuilder("commonCodeJob", jobRepository).start(headCodeStep).next(commonCodeStep)
.listener(this).build();
}
private <T> Step buildStep(String stepName, JobRepository jobRepository,
PlatformTransactionManager transactionManager, ItemReader<T> reader, ItemWriter<T> writer) {
return new StepBuilder(stepName, jobRepository).<T, T>chunk(10, transactionManager)
.reader(reader).writer(writer).build();
}
@Bean
public Step headCodeStep(JobRepository jobRepository,
PlatformTransactionManager transactionManager) {
return buildStep("headCodeStep", jobRepository, transactionManager, headCodeListReader(),
createWriter((items) -> {
try {
log.debug("HeadCode batch processing {} items", items.size());
commCodeService.setHeaderCodeSyncSave(items);
log.debug("Successfully processed headCommonCode batch");
} catch (Exception e) {
log.error("Error processing headCommonCode batch: {}", e.getMessage(), e);
throw new RuntimeException("Failed to process headCommonCode batch", e);
}
}, "headCode"));
}
@Bean
public Step commonCodeStep(JobRepository jobRepository,
PlatformTransactionManager transactionManager) {
return buildStep("commonCodeStep", jobRepository, transactionManager, commonCodeListReader(),
createWriter((items) -> {
try {
log.debug("commonCodeStep batch processing {} items", items.size());
commCodeService.setCommonCodeSyncSave(items);
log.debug("Successfully processed commonCode batch");
} catch (Exception e) {
log.error("Error processing commonCode batch: {}", e.getMessage(), e);
throw new RuntimeException("Failed to process commonCode batch", e);
}
}, "commonCode"));
}
private <T> ListItemReader<T> createReader(List<T> items, String readerName) {
log.info("{}Reader 호출됨...", readerName);
return new ListItemReader<>(items != null ? items : Collections.emptyList());
}
@Bean
@StepScope
public ListItemReader<HeadCodeRequest> headCodeListReader() {
return createReader(
commonCodeSyncResponse != null ? commonCodeSyncResponse.getApiHeadCdList() : null,
"headCode");
}
@Bean
@StepScope
public ListItemReader<DetailCodeRequest> commonCodeListReader() {
return createReader(
commonCodeSyncResponse != null ? commonCodeSyncResponse.getApiCommCdList() : null,
"commonCode");
}
private <T> ItemWriter<T> createWriter(Consumer<List<T>> processor, String writerName) {
return items -> {
try {
List<T> itemList = (List<T>) items.getItems();
processor.accept(itemList);
log.info("{}Writer: {} items 처리 완료", writerName, items.size());
} catch (Exception e) {
log.error("{}Writer 오류: {}", writerName, e.getMessage());
throw e;
}
};
}
}

View File

@ -2,14 +2,15 @@ package com.interplug.qcast.biz.canvasBasicSetting;
import com.interplug.qcast.biz.canvasBasicSetting.dto.CanvasBasicSettingInfo;
import com.interplug.qcast.biz.canvasBasicSetting.dto.CanvasBasicSettingResponse;
import com.interplug.qcast.biz.canvasBasicSetting.dto.RoofAllocationSettingInfo;
import com.interplug.qcast.config.Exception.QcastException;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import java.util.List;
import java.util.Map;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import java.util.List;
import java.util.Map;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.*;
@ -20,52 +21,24 @@ import org.springframework.web.bind.annotation.*;
@Tag(name = "CanvasBasicSettingController", description = "Canvas Basic Setting 관련 API")
public class CanvasBasicSettingController {
private final CanvasBasicSettingService canvasBasicSettingService;
@Operation(description = "Canvas Basic Setting 정보를 조회 한다.")
@GetMapping("/canvas-basic-settings/by-object/{objectNo}/{planNo}")
public List<CanvasBasicSettingResponse> selectCanvasBasicSetting(@PathVariable String objectNo, @PathVariable Integer planNo)
throws QcastException {
@GetMapping("/canvas-basic-settings/by-object/{objectNo}")
public List<CanvasBasicSettingResponse> selectCanvasBasicSetting(@PathVariable String objectNo) {
log.debug("Basic Setting 조회 ::::: " + objectNo + " : " + planNo);
log.debug("Basic Setting 조회 ::::: " + objectNo);
return canvasBasicSettingService.selectCanvasBasicSetting(objectNo, planNo);
return canvasBasicSettingService.selectCanvasBasicSetting(objectNo);
}
@Operation(description = "Canvas Basic Setting 정보를 등록 한다.")
@PostMapping("/canvas-basic-settings")
@ResponseStatus(HttpStatus.CREATED)
public Map<String, String> insertCanvasBasicSetting(@RequestBody CanvasBasicSettingInfo csi) throws QcastException {
public Map<String, String> insertCanvasBasicSetting(@RequestBody CanvasBasicSettingInfo csi) {
log.debug("Basic Setting 등록 ::::: " + csi.getObjectNo());
return canvasBasicSettingService.insertCanvasBasicSetting(csi);
}
@Operation(description = "Canvas Basic Setting 정보를 삭제 한다.")
@DeleteMapping("/canvas-basic-settings/delete-basic-settings/{objectNo}/{planNo}")
@ResponseStatus(HttpStatus.NO_CONTENT)
public void deleteCanvasBasicSetting(@PathVariable String objectNo, @PathVariable Integer planNo) throws QcastException {
log.debug("Basic Setting 삭제 ::::: " + objectNo + " : " + planNo);
canvasBasicSettingService.deleteCanvasBasicSetting(objectNo, planNo);
}
@Operation(description = "지붕면 할당 정보를 등록 한다.")
@PostMapping("/roof-allocation-settings")
@ResponseStatus(HttpStatus.CREATED)
public Map<String, String> insertRoofAllocSetting(@RequestBody RoofAllocationSettingInfo rasi) throws QcastException {
log.debug("지붕면 할당 등록 ::::: " + rasi.getObjectNo());
return canvasBasicSettingService.insertRoofAllocSetting(rasi);
}
@Operation(description = "Canvas 지붕재추가 Setting 정보를 삭제 한다.")
@DeleteMapping("/canvas-basic-settings/delete-RoofMaterials/{objectNo}/{planNo}")
@ResponseStatus(HttpStatus.NO_CONTENT)
public void deleteRoofMaterialsAdd(@PathVariable String objectNo, @PathVariable Integer planNo) throws QcastException {
canvasBasicSettingService.deleteRoofMaterialsAdd(objectNo, planNo);
}
}

View File

@ -6,40 +6,21 @@ import org.apache.ibatis.annotations.Mapper;
import com.interplug.qcast.biz.canvasBasicSetting.dto.CanvasBasicSettingInfo;
import com.interplug.qcast.biz.canvasBasicSetting.dto.CanvasBasicSettingResponse;
import com.interplug.qcast.biz.canvasBasicSetting.dto.RoofAllocationInfo;
import com.interplug.qcast.biz.canvasBasicSetting.dto.RoofMaterialsAddInfo;
@Mapper
public interface CanvasBasicSettingMapper {
// Canvas Basic Setting 유무 조회
public CanvasBasicSettingInfo getCanvasBasicSettingCnt(String objectNo, Integer planNo);
// Canvas Basic Setting 조회(objectNo)
public List<CanvasBasicSettingResponse> selectCanvasBasicSetting(String objectNo);
// Canvas Basic Setting 등록
public void insertCanvasBasicSetting(CanvasBasicSettingInfo csi);
// Canvas 지붕재추가 Setting 등록
public void insertRoofMaterialsAdd(RoofMaterialsAddInfo rma);
// Canvas Basic Setting 조회(objectNo)
public List<CanvasBasicSettingResponse> selectCanvasBasicSetting(String objectNo, Integer planNo);
// Canvas Basic Setting 등록
public void insertCanvasBasicSetting(CanvasBasicSettingInfo csi);
// Canvas Basic Setting 수정
public void updateCanvasBasicSetting(CanvasBasicSettingInfo csi);
// Canvas Basic Setting 삭제
public void deleteCanvasBasicSetting(String objectNo, Integer planNo);
// Canvas 지붕재추가 Setting 유무 조회
public RoofMaterialsAddInfo getRoofMaterialsCnt(String objectNo, Integer planNo);
// Canvas 지붕재추가 Setting 등록
public void insertRoofMaterialsAdd(RoofMaterialsAddInfo rma);
// Canvas 지붕재추가 Setting 수정
public void updateRoofMaterialsAdd(RoofMaterialsAddInfo rma);
// 지붕면 할당 Setting 등록
public void insertRoofAllocation(RoofAllocationInfo rai);
// Canvas 지붕재추가 Setting 삭제
public void deleteRoofMaterialsAdd(String objectNo, Integer planNo);
// Canvas 지붕재추가 Setting 삭제
public void deleteRoofMaterialsAdd(String objectNo);
}

View File

@ -1,150 +1,61 @@
package com.interplug.qcast.biz.canvasBasicSetting;
import com.interplug.qcast.biz.canvasBasicSetting.dto.CanvasBasicSettingInfo;
import com.interplug.qcast.biz.canvasBasicSetting.dto.CanvasBasicSettingResponse;
import com.interplug.qcast.biz.canvasBasicSetting.dto.RoofAllocationInfo;
import com.interplug.qcast.biz.canvasBasicSetting.dto.RoofAllocationSettingInfo;
import com.interplug.qcast.biz.canvasBasicSetting.dto.RoofMaterialsAddInfo;
import com.interplug.qcast.config.Exception.ErrorCode;
import com.interplug.qcast.config.Exception.QcastException;
import lombok.RequiredArgsConstructor;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@Slf4j
import com.interplug.qcast.biz.canvasBasicSetting.dto.CanvasBasicSettingInfo;
import com.interplug.qcast.biz.canvasBasicSetting.dto.CanvasBasicSettingResponse;
import com.interplug.qcast.biz.canvasBasicSetting.dto.RoofMaterialsAddInfo;
@Service
@RequiredArgsConstructor
public class CanvasBasicSettingService {
private final CanvasBasicSettingMapper canvasBasicSettingMapper;
private final CanvasBasicSettingMapper canvasBasicSettingMapper;
//Canvas Basic Setting 조회(objectNo)
public List<CanvasBasicSettingResponse> selectCanvasBasicSetting(String objectNo, Integer planNo) throws QcastException {
try {
return canvasBasicSettingMapper.selectCanvasBasicSetting(objectNo, planNo);
} catch (Exception e) {
throw new QcastException(ErrorCode.INTERNAL_SERVER_ERROR, e.getMessage());
}
// Canvas Basic Setting 조회(objectNo)
public List<CanvasBasicSettingResponse> selectCanvasBasicSetting(String objectNo) {
return canvasBasicSettingMapper.selectCanvasBasicSetting(objectNo);
}
// Canvas Basic Setting 등록
public Map<String, String> insertCanvasBasicSetting(CanvasBasicSettingInfo csi) throws QcastException {
public Map<String, String> insertCanvasBasicSetting(CanvasBasicSettingInfo csi) {
Map<String, String> response = new HashMap<>();
if (csi.getObjectNo() == null && csi.getPlanNo() == null) {
throw new QcastException (ErrorCode.INVALID_INPUT_VALUE ,"올바르지 않은 입력값입니다.");
}
try {
// 먼저 데이터가 존재하는지 확인
CanvasBasicSettingInfo cntData = canvasBasicSettingMapper.getCanvasBasicSettingCnt(csi.getObjectNo(), csi.getPlanNo());
log.debug("cntData ::::: " + cntData);
// 데이터가 존재하지 않으면 insert
if (cntData.getRoofCnt().intValue() < 1) {
// 도면/치수/각도 정보 insert
canvasBasicSettingMapper.insertCanvasBasicSetting(csi);
// for-each 루프를 사용하여 지붕재추가 Setting
for (RoofMaterialsAddInfo rma : csi.getRoofMaterialsAddList()) {
rma.setObjectNo(csi.getObjectNo());
rma.setPlanNo(csi.getPlanNo());
// 신규 지붕재추가 정보 insert
canvasBasicSettingMapper.insertRoofMaterialsAdd(rma);
}
response.put("objectNo", csi.getObjectNo());
response.put("returnMessage", "common.message.confirm.mark");
} else {
// 도면/치수/각도 정보 update
canvasBasicSettingMapper.updateCanvasBasicSetting(csi);
// for-each 루프를 사용하여 지붕재추가 Setting
for (RoofMaterialsAddInfo rma : csi.getRoofMaterialsAddList()) {
rma.setObjectNo(csi.getObjectNo());
rma.setPlanNo(csi.getPlanNo());
// 신규 지붕재추가 정보 insert
canvasBasicSettingMapper.updateRoofMaterialsAdd(rma);
}
response.put("objectNo", csi.getObjectNo());
response.put("returnMessage", "common.message.confirm.mark");
}
} catch (Exception e) {
throw new QcastException(ErrorCode.INTERNAL_SERVER_ERROR, e.getMessage());
}
// 생성된 objectNo 반환
return response;
}
// Canvas Basic Setting 삭제
public void deleteCanvasBasicSetting(String objectNo, Integer planNo) throws QcastException {
if ((objectNo == null || objectNo.trim().isEmpty()) && (planNo == null)) {
throw new QcastException (ErrorCode.INVALID_INPUT_VALUE ,"올바르지 않은 입력값입니다.");
}
try {
// Canvas Basic Setting 정보 삭제
canvasBasicSettingMapper.deleteCanvasBasicSetting(objectNo, planNo);
// 지붕재추가 정보 삭제
canvasBasicSettingMapper.deleteRoofMaterialsAdd(objectNo, planNo);
} catch (Exception e) {
if (e instanceof QcastException) throw e;
throw new QcastException(ErrorCode.INTERNAL_SERVER_ERROR, e.getMessage());
}
}
// 지붕면 할당 Setting 등록
public Map<String, String> insertRoofAllocSetting(RoofAllocationSettingInfo rasi) throws QcastException {
Map<String, String> response = new HashMap<>();
if (rasi.getObjectNo() == null && rasi.getPlanNo() == null) {
throw new QcastException (ErrorCode.INVALID_INPUT_VALUE ,"올바르지 않은 입력값입니다.");
}
try {
// 도면/치수/각도 정보 insert/update
canvasBasicSettingMapper.insertCanvasBasicSetting(csi);
// 기존 지붕재추가 정보 삭제 insert
canvasBasicSettingMapper.deleteRoofMaterialsAdd(rasi.getObjectNo(), rasi.getPlanNo());
canvasBasicSettingMapper.deleteRoofMaterialsAdd(csi.getObjectNo());
// for-each 루프를 사용하여 지붕재추가 Setting
for (RoofAllocationInfo rai : rasi.getRoofAllocationList()) {
rai.setObjectNo(rasi.getObjectNo());
rai.setPlanNo(rasi.getPlanNo());
canvasBasicSettingMapper.insertRoofAllocation(rai);
int roofSeq = 1;
// for-each 루프를 사용하여 지붕재추가 Setting
for (RoofMaterialsAddInfo rma : csi.getRoofMaterialsAddList()) {
rma.setObjectNo(csi.getObjectNo());
rma.setRoofSeq(roofSeq++); //roofSeq는 순차적으로 새로 생성하여 insert
// 신규 지붕재추가 정보 insert
canvasBasicSettingMapper.insertRoofMaterialsAdd(rma);
}
response.put("objectNo", rasi.getObjectNo());
response.put("objectNo", csi.getObjectNo());
response.put("returnMessage", "common.message.confirm.mark");
} catch (Exception e) {
throw new QcastException(ErrorCode.INTERNAL_SERVER_ERROR, e.getMessage());
response.put("objectNo", csi.getObjectNo());
response.put("returnMessage", "common.message.save.error");
}
// 생성된 objectNo 반환
return response;
}
// 지붕재추가 삭제
public void deleteRoofMaterialsAdd(String objectNo, Integer planNo) throws QcastException {
if ((objectNo == null || objectNo.trim().isEmpty()) && (planNo == null)) {
throw new QcastException (ErrorCode.INVALID_INPUT_VALUE ,"올바르지 않은 입력값입니다.");
}
try {
canvasBasicSettingMapper.deleteRoofMaterialsAdd(objectNo, planNo);
} catch (Exception e) {
if (e instanceof QcastException) throw e;
throw new QcastException(ErrorCode.INTERNAL_SERVER_ERROR, e.getMessage());
}
}
}

View File

@ -11,10 +11,8 @@ import lombok.Setter;
public class CanvasBasicSettingInfo {
private String objectNo; //견적서 번호
private Integer planNo; // plan 번호
private Integer roofSizeSet; //치수(복사도/실측값/육지붕)
private int roofSizeSet; //치수(복사도/실측값/육지붕)
private String roofAngleSet; //각도(경사/각도)
private Integer roofCnt; //존재여부
private Date registDatetime; //생성일시
private Date lastEditDatetime; //수정일시

View File

@ -6,19 +6,16 @@ import lombok.Setter;
@Getter
@Setter
public class CanvasBasicSettingResponse {
private String objectNo; // 견적서 번호
private Integer planNo; // plan 번호
private Integer roofSizeSet; // 치수(복사도/실측값/육지붕)
private String roofAngleSet; // 각도(경사/각도)
private boolean roofApply; // 적용
private Integer roofSeq; // 순번 SEQ
private String roofMatlCd; // 타입
private Integer roofWidth; // 넓이
private Integer roofHeight; // 높이
private Integer roofHajebichi; // 하제비치
private String roofGap; // 간격
private String roofLayout; // 방식
private Float roofPitch; // 경사도
private Float roofAngle; // 각도
}
private String objectNo; //견적서 번호
private int roofDrawingSet; //도면(치수)
private int roofSizeSet; //치수(복사도/실측값/육지붕)
private String roofAngleSet; //각도(경사/각도)
private int roofSeq; //순번 SEQ
private int roofType; //타입
private int roofWidth; //넓이
private int roofHeight; //높이
private int roofGap; //간격
private String roofLayout; //방식
}

View File

@ -1,27 +0,0 @@
package com.interplug.qcast.biz.canvasBasicSetting.dto;
import java.sql.Date;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class RoofAllocationInfo {
private String objectNo; // 견적서 번호
private Integer planNo; // plan 번호
private boolean roofApply; // 적용
private Integer roofSeq; // 순번 SEQ
private String roofMatlCd; // 타입
private Integer roofWidth; // 넓이
private Integer roofHeight; // 높이
private Integer roofHajebichi;// 하제비치
private String roofGap; // 간격
private String roofLayout; // 방식
private Float roofPitch; // 경사도
private Float roofAngle; // 각도
private Date registDatetime; // 생성일시
private Date lastEditDatetime;// 수정일시
private String returnMessage; // return message
}

View File

@ -1,18 +0,0 @@
package com.interplug.qcast.biz.canvasBasicSetting.dto;
import java.util.List;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class RoofAllocationSettingInfo {
private String objectNo; //견적서 번호
private Integer planNo; // plan 번호
private Integer roofSizeSet; //치수(복사도/실측값/육지붕)
private String roofAngleSet; //각도(경사/각도)
private List<RoofAllocationInfo> roofAllocationList;
}

View File

@ -8,21 +8,17 @@ import lombok.Setter;
@Getter
@Setter
public class RoofMaterialsAddInfo {
private String objectNo; // 견적서 번호
private Integer planNo; // plan 번호
private boolean roofApply; // 적용
private Integer roofSeq; // 순번 SEQ
private String roofMatlCd; // 타입
private Integer roofWidth; // 넓이
private Integer roofHeight; // 높이
private Integer roofHajebichi;// 하제비치
private String roofGap; // 간격
private String roofLayout; // 방식
private Float roofPitch; // 경사도
private Float roofAngle; // 각도
private Integer roofCnt; // 존재여부
private Date registDatetime; // 생성일시
private Date lastEditDatetime;// 수정일시
private String returnMessage; // return message
private String objectNo; //견적서 번호
private boolean roofApply; //적용
private int roofSeq; //순번 SEQ
private int roofType; //타입
private int roofWidth; //넓이
private int roofHeight; //높이
private int roofHajebichi; //하제비치
private int roofGap; //간격
private String roofLayout; //방식
private Date registDatetime; //생성일시
private Date lastEditDatetime; //수정일시
}

View File

@ -0,0 +1,42 @@
package com.interplug.qcast.biz.canvasGridSetting;
import com.interplug.qcast.biz.canvasGridSetting.dto.CanvasGridSettingInfo;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import java.util.Map;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.*;
@Slf4j
@RestController
@RequestMapping("/api/canvas-management")
@RequiredArgsConstructor
@Tag(name = "CanvasGridSettingController", description = "Canvas Grid Setting 관련 API")
public class CanvasGridSettingController {
private final CanvasGridSettingService canvasGridSettingService;
@Operation(description = "Canvas Grid Setting 정보를 조회 한다.")
@GetMapping("/canvas-grid-settings/by-object/{objectNo}")
public CanvasGridSettingInfo selectCanvasGridSetting(@PathVariable String objectNo) {
log.debug("Grid Setting 조회 ::::: " + objectNo);
return canvasGridSettingService.selectCanvasGridSetting(objectNo);
}
@Operation(description = "Canvas Grid Setting 정보를 등록 한다.")
@PostMapping("/canvas-grid-settings")
@ResponseStatus(HttpStatus.CREATED)
public Map<String, String> insertCanvasGridStatus(@RequestBody CanvasGridSettingInfo csi) {
log.debug("Grid Setting 등록 ::::: " + csi.getObjectNo());
return canvasGridSettingService.insertCanvasGridSetting(csi);
}
}

View File

@ -0,0 +1,16 @@
package com.interplug.qcast.biz.canvasGridSetting;
import com.interplug.qcast.biz.canvasGridSetting.dto.CanvasGridSettingInfo;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface CanvasGridSettingMapper {
// Canvas Grid Setting 조회(objectNo)
public CanvasGridSettingInfo selectCanvasGridSetting(String objectNo);
// Canvas Grid Setting 등록
public void insertCanvasGridSetting(CanvasGridSettingInfo csi);
}

View File

@ -0,0 +1,43 @@
package com.interplug.qcast.biz.canvasGridSetting;
import com.interplug.qcast.biz.canvasGridSetting.dto.CanvasGridSettingInfo;
import lombok.RequiredArgsConstructor;
import java.util.HashMap;
import java.util.Map;
import org.springframework.stereotype.Service;
@Service
@RequiredArgsConstructor
public class CanvasGridSettingService {
private final CanvasGridSettingMapper canvasGridSettingMapper;
// Canvas Setting 조회(objectNo)
public CanvasGridSettingInfo selectCanvasGridSetting(String objectNo) {
return canvasGridSettingMapper.selectCanvasGridSetting(objectNo);
}
// Canvas Setting 등록
public Map<String, String> insertCanvasGridSetting(CanvasGridSettingInfo csi) {
Map<String, String> response = new HashMap<>();
try {
canvasGridSettingMapper.insertCanvasGridSetting(csi);
response.put("objectNo", csi.getObjectNo());
response.put("returnMessage", "common.message.confirm.mark");
} catch (Exception e) {
response.put("objectNo", csi.getObjectNo());
response.put("returnMessage", "common.message.save.error");
}
// 생성된 objectNo 반환
return response;
}
}

View File

@ -0,0 +1,24 @@
package com.interplug.qcast.biz.canvasGridSetting.dto;
import java.sql.Date;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class CanvasGridSettingInfo {
private String objectNo; //견적서 번호
private boolean dotGridDisplay; // 그리드 표시
private boolean lineGridDisplay; // 그리드 표시
private Integer gridType; //그리드 설정 타입
private Integer gridHorizon; //가로 간격
private Integer gridVertical; //세로 간격
private Integer gridRatio; //비율 간격
private String gridDimen; //치수 간격
private Date registDatetime; //생성일시
private Date lastEditDatetime; //수정일시
private String returnMessage; //return message
}

View File

@ -1,12 +1,14 @@
package com.interplug.qcast.biz.canvasSetting;
import com.interplug.qcast.biz.canvasSetting.dto.CanvasSettingInfo;
import com.interplug.qcast.config.Exception.QcastException;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import java.util.Map;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import java.util.Map;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.*;
@ -17,34 +19,33 @@ import org.springframework.web.bind.annotation.*;
@Tag(name = "CanvasSettingController", description = "Canvas Setting 관련 API")
public class CanvasSettingController {
private final CanvasSettingService canvasSettingService;
@Operation(description = "Canvas Setting 정보를 조회 한다.")
@GetMapping("/canvas-settings/by-object/{objectNo}")
public CanvasSettingInfo selectCanvasSetting(@PathVariable String objectNo)
throws QcastException {
log.debug("Setting 조회 ::::: " + objectNo);
return canvasSettingService.selectCanvasSetting(objectNo);
public CanvasSettingInfo selectCanvasSetting(@PathVariable String objectNo) {
log.debug("Setting 조회 ::::: " + objectNo);
return canvasSettingService.selectCanvasSetting(objectNo);
}
@Operation(description = "Canvas Setting 정보를 등록 한다.")
@PostMapping("/canvas-settings")
@ResponseStatus(HttpStatus.CREATED)
public Map<String, String> insertCanvasSetting(@RequestBody CanvasSettingInfo csi)
throws QcastException {
log.debug("Setting 등록 ::::: " + csi.getObjectNo());
return canvasSettingService.insertCanvasSetting(csi);
public Map<String, String> insertCanvasSetting(@RequestBody CanvasSettingInfo csi) {
log.debug("Setting 등록 ::::: " + csi.getObjectNo());
return canvasSettingService.insertCanvasSetting(csi);
}
@Operation(description = "Canvas Setting 정보를 수정 한다.")
@PutMapping("/canvas-settings")
public void updateCanvasStatus(@RequestBody CanvasSettingInfo csi) throws QcastException {
log.debug("Setting 수정 ::::: " + csi.getObjectNo());
canvasSettingService.updateCanvasSetting(csi);
public void updateCanvasStatus(@RequestBody CanvasSettingInfo csi) {
log.debug("Setting 수정 ::::: " + csi.getObjectNo());
canvasSettingService.updateCanvasSetting(csi);
}
}

View File

@ -7,9 +7,6 @@ import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface CanvasSettingMapper {
// Canvas Setting 유무 조회
public CanvasSettingInfo getCanvasSettingCnt(String objectNo);
// Canvas Setting 조회(objectNo)
public CanvasSettingInfo selectCanvasSetting(String objectNo);

View File

@ -1,63 +1,48 @@
package com.interplug.qcast.biz.canvasSetting;
import com.interplug.qcast.biz.canvasSetting.dto.CanvasSettingInfo;
import com.interplug.qcast.config.Exception.ErrorCode;
import com.interplug.qcast.config.Exception.QcastException;
import lombok.RequiredArgsConstructor;
import java.util.HashMap;
import java.util.Map;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
@Service
@RequiredArgsConstructor
public class CanvasSettingService {
private final CanvasSettingMapper canvasSettingMapper;
private final CanvasSettingMapper canvasSettingMapper;
// Canvas Setting 조회(objectNo)
public CanvasSettingInfo selectCanvasSetting(String objectNo) throws QcastException {
try {
return canvasSettingMapper.selectCanvasSetting(objectNo);
} catch (Exception e) {
throw new QcastException(ErrorCode.INTERNAL_SERVER_ERROR, e.getMessage());
}
}
// Canvas Setting 조회(objectNo)
public CanvasSettingInfo selectCanvasSetting(String objectNo) {
return canvasSettingMapper.selectCanvasSetting(objectNo);
}
// Canvas Setting 등록
public Map<String, String> insertCanvasSetting(CanvasSettingInfo csi) throws QcastException {
// Canvas Setting 등록
public Map<String, String> insertCanvasSetting(CanvasSettingInfo csi) {
Map<String, String> response = new HashMap<>();
Map<String, String> response = new HashMap<>();
try {
canvasSettingMapper.insertCanvasSetting(csi);
response.put("objectNo", csi.getObjectNo());
response.put("returnMessage", "common.message.confirm.mark");
} catch (Exception e) {
response.put("objectNo", csi.getObjectNo());
response.put("returnMessage", "common.message.save.error");
}
if (csi.getObjectNo() == null) {
throw new QcastException(ErrorCode.INVALID_INPUT_VALUE, "올바르지 않은 입력값입니다.");
}
// 생성된 objectNo 반환
return response;
try {
}
// 먼저 데이터가 존재하는지 확인
CanvasSettingInfo cntData = canvasSettingMapper.getCanvasSettingCnt(csi.getObjectNo());
// Canvas Setting 수정
public void updateCanvasSetting(CanvasSettingInfo csi) {
canvasSettingMapper.updateCanvasSetting(csi);
}
// 데이터가 존재하지 않으면 insert
if (cntData.getCnt().intValue() < 1) {
canvasSettingMapper.insertCanvasSetting(csi);
} else {
canvasSettingMapper.updateCanvasSetting(csi);
}
response.put("objectNo", csi.getObjectNo());
response.put("returnMessage", "common.message.confirm.mark");
} catch (Exception e) {
throw new QcastException(ErrorCode.INTERNAL_SERVER_ERROR, e.getMessage());
}
// 생성된 objectNo 반환
return response;
}
// Canvas Setting 수정
public void updateCanvasSetting(CanvasSettingInfo csi) throws QcastException {
try {
canvasSettingMapper.updateCanvasSetting(csi);
} catch (Exception e) {
throw new QcastException(ErrorCode.INTERNAL_SERVER_ERROR, e.getMessage());
}
}
}

View File

@ -31,40 +31,8 @@ public class CanvasSettingInfo {
private boolean adsorpRangeMedium; //흡착범위설정
private boolean adsorpRangeLarge; //흡착범위설정
private boolean adsorpPoint; //흡착점 ON OFF
private boolean dotGridDisplay;
private boolean lineGridDisplay;
private Integer gridType;
private Integer gridHorizon;
private Integer gridVertical;
private Integer gridRatio;
private String gridDimen;
private String gridColor;
private String wordFont;
private String wordFontStyle;
private Integer wordFontSize;
private String wordFontColor;
private String flowFont;
private String flowFontStyle;
private Integer flowFontSize;
private String flowFontColor;
private String dimensioFont;
private String dimensioFontStyle;
private Integer dimensioFontSize;
private String dimensioFontColor;
private String circuitNumFont;
private String circuitNumFontStyle;
private Integer circuitNumFontSize;
private String circuitNumFontColor;
private String lengthFont;
private String lengthFontStyle;
private Integer lengthFontSize;
private String lengthFontColor;
private Integer originPixel;
private String originColor;
private Integer originHorizon;
private Integer originVertical;
private Date registDatetime; //생성일시
private Date lastEditDatetime; //수정일시
private String returnMessage; //return message
private Integer cnt; //견적서 유무
}

View File

@ -17,44 +17,43 @@ import org.springframework.web.bind.annotation.*;
public class CanvasStatusController {
private final CanvasStatusService canvasStatusService;
@Operation(description = "사용자(userId)에 해당하는 전체 캔버스를 조회 한다.")
@Operation(description = "계정에 해당하는 전체 견적서를 조회 한다.")
@GetMapping("/canvas-statuses/{userId}")
public List<CanvasStatusResponse> selectAllCanvasStatus(@PathVariable String userId)
throws QcastException {
public List<CanvasStatusResponse> selectAllCanvasStatus(@PathVariable String userId) throws QcastException {
return canvasStatusService.selectAllCanvasStatus(userId);
}
@Operation(description = "물건번호(objectNo)에 해당하는 캔버스를 조회 한다.")
@GetMapping("/canvas-statuses/by-object/{objectNo}")
public List<CanvasStatusResponse> selectObjectNoCanvasStatus(@PathVariable String objectNo)
throws QcastException {
return canvasStatusService.selectObjectNoCanvasStatus(objectNo);
@Operation(description = "견적서를 조회 한다.")
@GetMapping("/canvas-statuses/by-object/{objectNo}/{userId}")
public List<CanvasStatusResponse> selectObjectNoCanvasStatus(@PathVariable String objectNo, @PathVariable String userId) throws QcastException {
return canvasStatusService.selectObjectNoCanvasStatus(objectNo, userId);
}
@Operation(description = "캔버스를 등록 한다.")
@Operation(description = "견적서를 등록 한다.")
@PostMapping("/canvas-statuses")
@ResponseStatus(HttpStatus.CREATED)
public Integer insertCanvasStatus(@RequestBody CanvasStatus cs) throws QcastException {
return canvasStatusService.insertCanvasStatus(cs);
return canvasStatusService.insertCanvasStatus(cs);
}
@Operation(description = "캔버스를 수정 한다.")
@Operation(description = "견적서를 수정 한다.")
@PutMapping("/canvas-statuses")
public void updateCanvasStatus(@RequestBody CanvasStatus cs) throws QcastException {
canvasStatusService.updateCanvasStatus(cs);
canvasStatusService.updateCanvasStatus(cs);
}
@Operation(description = "물건번호(objectNo)에 해당하는캔버스를 삭제 한다.")
@Operation(description = "견적서를 삭제 한다.")
@DeleteMapping("/canvas-statuses/by-object/{objectNo}")
@ResponseStatus(HttpStatus.NO_CONTENT)
public void deleteObjectNoCanvasStatus(@PathVariable String objectNo) throws QcastException {
canvasStatusService.deleteObjectNoCanvasStatus(objectNo);
canvasStatusService.deleteObjectNoCanvasStatus(objectNo);
}
@Operation(description = "id에 해당하는 캔버스를 삭제 한다.")
@Operation(description = "견적서의 이미지(템플릿)를 삭제 한다.")
@DeleteMapping("/canvas-statuses/by-id/{id}")
@ResponseStatus(HttpStatus.NO_CONTENT)
public void deleteIdCanvasStatus(@PathVariable Integer id) throws QcastException {
canvasStatusService.deleteIdCanvasStatus(id);
canvasStatusService.deleteIdCanvasStatus(id);
}
}

View File

@ -1,50 +1,47 @@
package com.interplug.qcast.biz.canvasStatus;
import com.interplug.qcast.biz.canvasStatus.dto.CanvasStatus;
import com.interplug.qcast.biz.canvasStatus.dto.CanvasStatusCopyRequest;
import com.interplug.qcast.biz.canvasStatus.dto.CanvasStatusResponse;
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface CanvasStatusMapper {
// objectNo 생성(미사용)
public CanvasStatus getCanvasStatusNewObjectNo(String userId);
// objectNo 생성(미사용)
public CanvasStatus getCanvasStatusNewObjectNo(String userId);
// imageName 생성(미사용)
public CanvasStatus getCanvasStatusImageAdd(String objectNo);
// 전체 견적서 조회
public List<CanvasStatusResponse> selectAllCanvasStatus(String userId);
// 견적서 조회(objectNo/userId)
public List<CanvasStatusResponse> selectObjectNoCanvasStatus(String objectNo, String userId);
// 견적서 조회(Max id)
public List<CanvasStatusResponse> getMaxIdCanvasStatus(String objectNo, String userId);
// 견적서 조회(id별)
public List<CanvasStatusResponse> getIdCanvasStatus(Integer id);
// 견적서 조회(objectNo)
public List<CanvasStatusResponse> getObjectNoCanvasStatus(String objectNo);
// 견적서 등록
public void insertCanvasStatus(CanvasStatus cs);
// 견적서 수정
public void updateCanvasStatus(CanvasStatus cs);
// 견적서 삭제
public void deleteObjectNoCanvasStatus(String objectNo);
// 이미지(템플릿) 삭제
public void deleteIdCanvasStatus(Integer id);
// imageName 생성(미사용)
public CanvasStatus getCanvasStatusImageAdd(String objectNo);
// 전체 캔버스 조회 by 사용자(userId)
public List<CanvasStatusResponse> selectAllCanvasStatus(String userId);
// 캔버스 조회 by 물건번호(objectNo)
public List<CanvasStatusResponse> selectObjectNoCanvasStatus(String objectNo);
// 캔버스 조회 by Max(id)
public List<CanvasStatusResponse> getMaxIdCanvasStatus(String objectNo, String userId);
// 캔버스 조회 by id
public List<CanvasStatusResponse> getIdCanvasStatus(Integer id);
// 캔버스 조회 by 물건번호(objectNo)
public List<CanvasStatusResponse> getObjectNoCanvasStatus(String objectNo);
// 캔버스 등록
public void insertCanvasStatus(CanvasStatus cs);
// 캔버스 수정
public void updateCanvasStatus(CanvasStatus cs);
// 캔버스 삭제 by 물건번호(objectNo)
public void deleteObjectNoCanvasStatus(String objectNo);
// 캔버스 삭제 by id (미사용)
public void deleteIdCanvasStatus(Integer id);
// 캔버스 삭제플래그 변경 by id
public void updateDeletedCanvasStatus(Integer id);
// 캔버스 복사
public int copyCanvasStatus(CanvasStatusCopyRequest cs);
}
}

View File

@ -1,209 +1,122 @@
package com.interplug.qcast.biz.canvasStatus;
import com.interplug.qcast.biz.canvasBasicSetting.CanvasBasicSettingMapper;
import com.interplug.qcast.biz.canvasBasicSetting.dto.CanvasBasicSettingInfo;
import com.interplug.qcast.biz.canvasBasicSetting.dto.CanvasBasicSettingResponse;
import com.interplug.qcast.biz.canvasBasicSetting.dto.RoofMaterialsAddInfo;
import com.interplug.qcast.biz.canvasStatus.dto.CanvasStatus;
import com.interplug.qcast.biz.canvasStatus.dto.CanvasStatusCopyRequest;
import com.interplug.qcast.biz.canvasStatus.dto.CanvasStatusResponse;
import com.interplug.qcast.config.Exception.ErrorCode;
import com.interplug.qcast.config.Exception.QcastException;
import java.util.List;
import lombok.RequiredArgsConstructor;
import java.util.List;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
@RequiredArgsConstructor
public class CanvasStatusService {
private final CanvasStatusMapper canvasStatusMapper;
private final CanvasBasicSettingMapper canvasBasicSettingMapper;
private final CanvasStatusMapper canvasStatusMapper;
// 사용자(userId) 해당하는 전체 캔버스 조회
public List<CanvasStatusResponse> selectAllCanvasStatus(String userId) throws QcastException {
List<CanvasStatusResponse> result = null;
// 전체 견적서 조회
public List<CanvasStatusResponse> selectAllCanvasStatus(String userId) throws QcastException {
List<CanvasStatusResponse> result = null;
if (userId != null && !userId.trim().isEmpty()) {
result = canvasStatusMapper.selectAllCanvasStatus(userId);
} else {
throw new QcastException (ErrorCode.INVALID_INPUT_VALUE ,"올바르지 않은 입력값입니다.");
}
return result;
}
try {
if (userId != null && !userId.trim().isEmpty()) {
result = canvasStatusMapper.selectAllCanvasStatus(userId);
} else {
throw new QcastException(ErrorCode.INVALID_INPUT_VALUE, "올바르지 않은 입력값입니다.");
}
} catch (Exception e) {
if (e instanceof QcastException) throw e;
throw new QcastException(ErrorCode.INTERNAL_SERVER_ERROR, e.getMessage());
}
// 견적서 조회(objectNo)
public List<CanvasStatusResponse> selectObjectNoCanvasStatus(String objectNo, String userId) throws QcastException {
List<CanvasStatusResponse> result = null;
if (objectNo != null && !objectNo.trim().isEmpty() && userId != null && !userId.trim().isEmpty()) {
result = canvasStatusMapper.selectObjectNoCanvasStatus(objectNo, userId);
} else {
throw new QcastException (ErrorCode.INVALID_INPUT_VALUE ,"올바르지 않은 입력값입니다.");
}
return result;
}
return result;
}
// 견적서 등록
public Integer insertCanvasStatus(CanvasStatus cs) throws QcastException {
Integer id = 0;
// 데이터가 없으면 저장
try {
canvasStatusMapper.insertCanvasStatus(cs);
// 데이터 저장 Max id 확인
List<CanvasStatusResponse> maxId = canvasStatusMapper.getMaxIdCanvasStatus(cs.getObjectNo(), cs.getUserId());
id = maxId.get(0).getId();
} catch (Exception e) {
throw new QcastException (ErrorCode.INVALID_INPUT_VALUE ,"견적서 등록 중 오류 발생");
}
// 생성된 id 반환
return id;
}
// 물건번호(objectNo) 해당하는 캔버스 조회
public List<CanvasStatusResponse> selectObjectNoCanvasStatus(String objectNo)
throws QcastException {
List<CanvasStatusResponse> result = null;
// 견적서 수정
public void updateCanvasStatus(CanvasStatus cs) throws QcastException {
try {
if (objectNo != null && !objectNo.trim().isEmpty()) {
result = canvasStatusMapper.selectObjectNoCanvasStatus(objectNo);
} else {
throw new QcastException(ErrorCode.INVALID_INPUT_VALUE, "올바르지 않은 입력값입니다.");
}
} catch (Exception e) {
if (e instanceof QcastException) throw e;
throw new QcastException(ErrorCode.INTERNAL_SERVER_ERROR, e.getMessage());
}
if (cs.getId() == null) {
throw new QcastException (ErrorCode.INVALID_INPUT_VALUE ,"올바르지 않은 입력값입니다.");
}
// 먼저 데이터가 존재하는지 확인
List<CanvasStatusResponse> existingStatus = canvasStatusMapper.getIdCanvasStatus(cs.getId());
return result;
}
// 데이터가 존재하지 않으면 수정하지 않고 예외를 던짐
if (existingStatus.size() > 0) {
canvasStatusMapper.updateCanvasStatus(cs);
} else {
throw new QcastException (ErrorCode.NOT_FOUND ,"수정할 견적서가 존재하지 않습니다.");
}
}
// 캔버스 등록
public Integer insertCanvasStatus(CanvasStatus cs) throws QcastException {
// 전체 견적서 삭제
public void deleteObjectNoCanvasStatus(String objectNo) throws QcastException {
if (objectNo == null || objectNo.trim().isEmpty()) {
throw new QcastException (ErrorCode.INVALID_INPUT_VALUE ,"올바르지 않은 입력값입니다.");
}
// 먼저 데이터가 존재하는지 확인
List<CanvasStatusResponse> existingStatus = canvasStatusMapper.getObjectNoCanvasStatus(objectNo);
// 데이터가 존재하지 않으면 수정하지 않고 예외를 던짐
if (existingStatus.size() > 0) {
canvasStatusMapper.deleteObjectNoCanvasStatus(objectNo);
} else {
throw new QcastException (ErrorCode.NOT_FOUND ,"삭제할 견적서가 존재하지 않습니다.");
}
}
Integer id = 0;
// 이미지(템플릿) 삭제
public void deleteIdCanvasStatus(Integer id) throws QcastException {
if (id == null) {
throw new QcastException (ErrorCode.INVALID_INPUT_VALUE ,"올바르지 않은 입력값입니다.");
}
// 먼저 데이터가 존재하는지 확인
List<CanvasStatusResponse> existingStatus = canvasStatusMapper.getIdCanvasStatus(id);
// 데이터가 존재하지 않으면 수정하지 않고 예외를 던짐
if (existingStatus.size() > 0) {
canvasStatusMapper.deleteIdCanvasStatus(id);
} else {
throw new QcastException (ErrorCode.NOT_FOUND ,"삭제할 견적서가 존재하지 않습니다.");
}
}
// 데이터가 없으면 저장
try {
canvasStatusMapper.insertCanvasStatus(cs);
// 데이터 저장 Max id 확인
List<CanvasStatusResponse> maxId =
canvasStatusMapper.getMaxIdCanvasStatus(cs.getObjectNo(), cs.getUserId());
id = maxId.get(0).getId();
} catch (Exception e) {
throw new QcastException(ErrorCode.INTERNAL_SERVER_ERROR, e.getMessage());
}
// 생성된 id 반환
return id;
}
// 캔버스 수정
public void updateCanvasStatus(CanvasStatus cs) throws QcastException {
if (cs.getId() == null) {
throw new QcastException(ErrorCode.INVALID_INPUT_VALUE, "올바르지 않은 입력값입니다.");
}
try {
// 먼저 데이터가 존재하는지 확인
List<CanvasStatusResponse> existingStatus = canvasStatusMapper.getIdCanvasStatus(cs.getId());
// 데이터가 존재하지 않으면 수정하지 않고 예외를 던짐
if (existingStatus.size() > 0) {
canvasStatusMapper.updateCanvasStatus(cs);
} else {
throw new QcastException(ErrorCode.NOT_FOUND, "수정할 캔버스가 존재하지 않습니다.");
}
} catch (Exception e) {
if (e instanceof QcastException) throw e;
throw new QcastException(ErrorCode.INTERNAL_SERVER_ERROR, e.getMessage());
}
}
// 물건번호(objectNo) 해당하는 캔버스 삭제
public void deleteObjectNoCanvasStatus(String objectNo) throws QcastException {
if (objectNo == null || objectNo.trim().isEmpty()) {
throw new QcastException(ErrorCode.INVALID_INPUT_VALUE, "올바르지 않은 입력값입니다.");
}
try {
// 먼저 데이터가 존재하는지 확인
List<CanvasStatusResponse> existingStatus =
canvasStatusMapper.getObjectNoCanvasStatus(objectNo);
// 데이터가 존재하지 않으면 수정하지 않고 예외를 던짐
if (existingStatus.size() > 0) {
canvasStatusMapper.deleteObjectNoCanvasStatus(objectNo);
} else {
throw new QcastException(ErrorCode.NOT_FOUND, "삭제할 캔버스가 존재하지 않습니다.");
}
} catch (Exception e) {
if (e instanceof QcastException) throw e;
throw new QcastException(ErrorCode.INTERNAL_SERVER_ERROR, e.getMessage());
}
}
// id에 해당하는 캔버스 삭제
public void deleteIdCanvasStatus(Integer id) throws QcastException {
if (id == null) {
throw new QcastException(ErrorCode.INVALID_INPUT_VALUE, "올바르지 않은 입력값입니다.");
}
try {
// 먼저 데이터가 존재하는지 확인
List<CanvasStatusResponse> existingStatus = canvasStatusMapper.getIdCanvasStatus(id);
// 데이터가 존재하지 않으면 처리하지 않고 예외를 던짐
if (existingStatus.size() > 0) {
// 데이터를 삭제하는 기존 방식에서 데이터를 삭제하지 않고 deleted 데이터를 바꾸는 방식으로 변경 (2025.02.11)
// canvasStatusMapper.deleteIdCanvasStatus(id);
canvasStatusMapper.updateDeletedCanvasStatus(id);
} else {
throw new QcastException(ErrorCode.NOT_FOUND, "삭제할 캔버스가 존재하지 않습니다.");
}
} catch (Exception e) {
if (e instanceof QcastException) throw e;
throw new QcastException(ErrorCode.INTERNAL_SERVER_ERROR, e.getMessage());
}
}
// 캔버스 복사 등록
@Transactional
public int copyCanvasStatus(CanvasStatusCopyRequest cs, Boolean flag) throws QcastException {
try {
if (flag) {
// 배치면 초기설정 정보 조회
List<CanvasBasicSettingResponse> selData =
canvasBasicSettingMapper.selectCanvasBasicSetting(
cs.getOriginObjectNo(), Integer.parseInt(cs.getOriginPlanNo()));
if (!selData.isEmpty()) {
// 번째 데이터만 CanvasBasicSettingInfo로 변환하여 insert 실행
CanvasBasicSettingResponse firstData = selData.get(0);
// CanvasBasicSettingResponse CanvasBasicSettingInfo 변환
CanvasBasicSettingInfo basicSettingInfo = new CanvasBasicSettingInfo();
basicSettingInfo.setObjectNo(cs.getObjectNo());
basicSettingInfo.setPlanNo(Integer.parseInt(cs.getPlanNo()));
basicSettingInfo.setRoofSizeSet(firstData.getRoofSizeSet());
basicSettingInfo.setRoofAngleSet(firstData.getRoofAngleSet());
// 도면/치수/각도 정보 insert ( 번만 실행)
canvasBasicSettingMapper.insertCanvasBasicSetting(basicSettingInfo);
// 나머지 RoofMaterialsAddInfo 처리
for (CanvasBasicSettingResponse data : selData) {
// CanvasBasicSettingResponse RoofMaterialsAddInfo 변환
RoofMaterialsAddInfo roofMaterials = new RoofMaterialsAddInfo();
roofMaterials.setObjectNo(cs.getObjectNo());
roofMaterials.setPlanNo(Integer.parseInt(cs.getPlanNo()));
roofMaterials.setRoofApply(data.isRoofApply());
roofMaterials.setRoofSeq(data.getRoofSeq());
roofMaterials.setRoofMatlCd(data.getRoofMatlCd());
roofMaterials.setRoofWidth(data.getRoofWidth());
roofMaterials.setRoofHeight(data.getRoofHeight());
roofMaterials.setRoofHajebichi(data.getRoofHajebichi());
roofMaterials.setRoofGap(data.getRoofGap());
roofMaterials.setRoofLayout(data.getRoofLayout());
roofMaterials.setRoofPitch(data.getRoofPitch());
roofMaterials.setRoofAngle(data.getRoofAngle());
// 지붕재 추가 Setting insert (여러 가능)
canvasBasicSettingMapper.insertRoofMaterialsAdd(roofMaterials);
}
}
}
canvasStatusMapper.copyCanvasStatus(cs);
return cs.getId();
} catch (Exception e) {
throw new QcastException(ErrorCode.INTERNAL_SERVER_ERROR, "캔버스 복사 중 오류 발생");
}
}
}

View File

@ -7,7 +7,7 @@ public class CanvasStatus {
private Integer id; // PK ID
private String userId; // 사용자 ID
private String objectNo; // 견적서 번호
private String planNo; // 플랜 번호
private String imageName; // 이미지명
private String canvasStatus; // 캠버스 상태
private String bgImageName; // 배경 이미지명
private String mapPositionAddress; // 배경 CAD 파일명

View File

@ -1,28 +0,0 @@
package com.interplug.qcast.biz.canvasStatus.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
@Schema(description = "캔버스 복사 요청 객체")
public class CanvasStatusCopyRequest {
@Schema(description = "ID", hidden = true)
private Integer id;
@Schema(description = "원본 물건 번호")
private String originObjectNo;
@Schema(description = "원본 플랜 번호")
private String originPlanNo;
@Schema(description = "복사본 저장할 사용자 ID")
private String userId;
@Schema(description = "복사본 저장할 물건 번호")
private String objectNo;
@Schema(description = "복사본 저장할 플랜 번호")
private String planNo;
}

View File

@ -10,7 +10,7 @@ public class CanvasStatusResponse {
private Integer id; // PK ID
private String userId; // 사용자 ID
private String objectNo; // 견적서 번호
private String planNo; // 플랜 번호
private String imageName; // 이미지명
private String canvasStatus; // 캠버스 상태
private Date registDatetime; // 생성일시
private Date lastEditDatetime; // 수정일시

View File

@ -1,79 +0,0 @@
package com.interplug.qcast.biz.canvaspopupstatus;
import com.interplug.qcast.biz.canvaspopupstatus.dto.CanvasPopupStatus;
import com.interplug.qcast.config.Exception.ErrorCode;
import com.interplug.qcast.config.Exception.QcastException;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/api/v1/canvas-popup-status")
@RequiredArgsConstructor
@Tag(name = "CanvasPopupStatusController", description = "Canvas Popup Status 관련 API")
public class CanvasPopupStatusController {
private final CanvasPopupStatusService canvasPopupStatusService;
/**
* 캔버스 팝업 상태를 조회한다.
*
* @param objectNo 물건정보 번호
* @param planNo plan 번호
* @param popupType 캔버스 팝업 단계
* @return 조회된 CanvasPopupStatus 객체, 조회된 데이터가 없을 경우 객체 반환
*/
@Operation(description = "캔버스 팝업 상태를 조회한다.")
@GetMapping
public CanvasPopupStatus getCanvasPopupStatus(
@RequestParam @Schema(description = "물건정보 번호") String objectNo,
@RequestParam @Schema(description = "plan 번호") Integer planNo,
@RequestParam @Schema(description = "캔버스 팝업 단계") String popupType)
throws QcastException {
if (objectNo == null
|| objectNo.trim().isEmpty()
|| planNo == null
|| popupType == null
|| popupType.trim().isEmpty()) {
throw new QcastException(ErrorCode.INVALID_INPUT_VALUE);
}
return canvasPopupStatusService.selectCanvasPopupStatus(objectNo, planNo, popupType);
}
/**
* 캔버스 팝업 상태를 저장 또는 수정한다.
*
* @param canvasPopupStatus 저장 또는 수정할 CanvasPopupStatus 객체
* @throws QcastException 저장 또는 수정 예외 발생
*/
@Operation(description = "캔버스 팝업 상태를 저장 또는 수정한다.")
@PostMapping
public void saveCanvasPopupStatus(@RequestBody CanvasPopupStatus canvasPopupStatus)
throws QcastException {
canvasPopupStatusService.saveCanvasPopupStatus(canvasPopupStatus);
}
/**
* 캔버스 팝업 상태를 삭제한다. (미사용)
*
* @param canvasPopupStatus 삭제할 CanvasPopupStatus 객체
* @throws QcastException 삭제 예외 발생
*/
@Operation(description = "캔버스 팝업 상태를 삭제한다. (미사용)")
@DeleteMapping
@ResponseStatus(HttpStatus.NO_CONTENT)
public void deleteCanvasPopupStatus(@RequestBody CanvasPopupStatus canvasPopupStatus)
throws QcastException {
canvasPopupStatusService.deleteCanvasPopupStatus(canvasPopupStatus);
}
}

View File

@ -1,37 +0,0 @@
package com.interplug.qcast.biz.canvaspopupstatus;
import com.interplug.qcast.biz.canvaspopupstatus.dto.CanvasPopupStatus;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface CanvasPopupStatusMapper {
/**
* Canvas Popup Status 조회
*
* @param canvasPopupStatus 조회할 CanvasPopupStatus 객체
* @return 조회된 CanvasPopupStatus 객체
*/
public CanvasPopupStatus selectCanvasPopupStatus(CanvasPopupStatus canvasPopupStatus);
/**
* Canvas Popup Status 생성
*
* @param canvasPopupStatus 생성할 CanvasPopupStatus 객체
*/
public void insertCanvasPopupStatus(CanvasPopupStatus canvasPopupStatus);
/**
* Canvas Popup Status 수정
*
* @param canvasPopupStatus 수정할 CanvasPopupStatus 객체
*/
public void updateCanvasPopupStatus(CanvasPopupStatus canvasPopupStatus);
/**
* Canvas Popup Status 삭제
*
* @param canvasPopupStatus 삭제할 CanvasPopupStatus 객체
*/
public void deleteCanvasPopupStatus(CanvasPopupStatus canvasPopupStatus);
}

View File

@ -1,91 +0,0 @@
package com.interplug.qcast.biz.canvaspopupstatus;
import com.interplug.qcast.biz.canvaspopupstatus.dto.CanvasPopupStatus;
import com.interplug.qcast.config.Exception.ErrorCode;
import com.interplug.qcast.config.Exception.QcastException;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
@RequiredArgsConstructor
@Transactional(readOnly = true)
public class CanvasPopupStatusService {
private final CanvasPopupStatusMapper canvasPopupStatusMapper;
/**
* Canvas Popup Status 조회
*
* @param objectNo 조회할 object 번호
* @param planNo 조회할 plan 번호
* @param popupType 조회할 popup 타입
* @return 조회된 CanvasPopupStatus 객체, 조회된 데이터가 없을 경우 객체 반환
*/
public CanvasPopupStatus selectCanvasPopupStatus(
String objectNo, Integer planNo, String popupType) throws QcastException {
CanvasPopupStatus request =
CanvasPopupStatus.builder().objectNo(objectNo).planNo(planNo).popupType(popupType).build();
CanvasPopupStatus cps = canvasPopupStatusMapper.selectCanvasPopupStatus(request);
return cps != null ? cps : CanvasPopupStatus.builder().build();
}
/**
* Canvas Popup Status 저장 - 이미 존재하는 데이터인 경우 수정, 없는 경우 생성
*
* @param cps 저장할 CanvasPopupStatus 객체
* @throws QcastException 저장 예외 발생
*/
@Transactional
public void saveCanvasPopupStatus(CanvasPopupStatus cps) throws QcastException {
CanvasPopupStatus chk = canvasPopupStatusMapper.selectCanvasPopupStatus(cps);
if (chk == null) {
createCanvasPopupStatus(cps);
} else {
updateCanvasPopupStatus(cps);
}
}
/**
* Canvas Popup Status 생성
*
* @param cps 생성할 CanvasPopupStatus 객체
* @throws QcastException 생성 예외 발생
*/
@Transactional
public void createCanvasPopupStatus(CanvasPopupStatus cps) throws QcastException {
try {
canvasPopupStatusMapper.insertCanvasPopupStatus(cps);
} catch (Exception e) {
throw new QcastException(ErrorCode.INTERNAL_SERVER_ERROR, e.getMessage());
}
}
/**
* Canvas Popup Status 수정
*
* @param cps 수정할 CanvasPopupStatus 객체
* @throws QcastException 수정 예외 발생
*/
public void updateCanvasPopupStatus(CanvasPopupStatus cps) throws QcastException {
try {
canvasPopupStatusMapper.updateCanvasPopupStatus(cps);
} catch (Exception e) {
throw new QcastException(ErrorCode.INTERNAL_SERVER_ERROR, e.getMessage());
}
}
/**
* Canvas Popup Status 삭제
*
* @param cps 삭제할 CanvasPopupStatus 객체
* @throws QcastException 삭제 예외 발생
*/
public void deleteCanvasPopupStatus(CanvasPopupStatus cps) throws QcastException {
try {
canvasPopupStatusMapper.deleteCanvasPopupStatus(cps);
} catch (Exception e) {
throw new QcastException(ErrorCode.INTERNAL_SERVER_ERROR, e.getMessage());
}
}
}

View File

@ -1,28 +0,0 @@
package com.interplug.qcast.biz.canvaspopupstatus.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
@Builder
@Schema(description = "캔버스 팝업 상태")
public class CanvasPopupStatus {
// @Schema(description = "id")
// private Long id;
@Schema(description = "물건정보 번호")
private String objectNo;
@Schema(description = "plan 번호")
private Integer planNo;
@Schema(description = "캔버스 팝업 단계")
private String popupType;
@Schema(description = "캔버스 팝업 상태 데이터")
private String popupStatus;
}

View File

@ -3,54 +3,14 @@ package com.interplug.qcast.biz.commCode;
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import com.interplug.qcast.biz.commCode.dto.CodeRes;
import com.interplug.qcast.biz.commCode.dto.DetailCodeRequest;
import com.interplug.qcast.biz.commCode.dto.HeadCodeRequest;
@Mapper
public interface CommCodeMapper {
/**
* Qcast 공통코드 저장시 실시간 동기화
*
* @param codeRes
* @return
*/
int setCommHUpdate(CodeRes codeRes);
/**
* Qcast 공통코드 저장시 실시간 동기화
*
* @param codeRes
* @return
*/
int setCommLUpdate(CodeRes codeRes);
/**
* QCast에서 사용하는 공통코드 조회
*
* @return
*/
List<CodeRes> selectQcastCommCode();
/**
* 배치 공통코드 헤더 정보 동기화 저장
*
* @param headCodeReq
* @return
* @throws Exception
*/
int setHeadCodeSyncSave(HeadCodeRequest headCodeReq) throws Exception;
/**
* 배치 공통코드 상세 정보 동기화 저장
*
* @param detailCodeReq
* @return
* @throws Exception
*/
int setCommonCodeSyncSave(DetailCodeRequest detailCodeReq) throws Exception;
}

View File

@ -1,17 +1,13 @@
package com.interplug.qcast.biz.commCode;
import java.util.ArrayList;
import java.util.List;
import org.springframework.stereotype.Service;
import com.interplug.qcast.biz.commCode.dto.CodeReq;
import com.interplug.qcast.biz.commCode.dto.CodeRes;
import com.interplug.qcast.biz.commCode.dto.CommCodeRes;
import com.interplug.qcast.biz.commCode.dto.DetailCodeRequest;
import com.interplug.qcast.biz.commCode.dto.HeadCodeRequest;
import java.util.ArrayList;
import java.util.List;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@Slf4j
@Service
@RequiredArgsConstructor
public class CommCodeService {
@ -53,55 +49,17 @@ public class CommCodeService {
public List<CommCodeRes> selectQcastCommCode() {
List<CodeRes> result = commCodeMapper.selectQcastCommCode();
List<CommCodeRes> commCodeList = new ArrayList<>();
result.forEach(cr -> {
commCodeList.add(CommCodeRes.builder().clHeadCd(cr.getClHeadCd()).clCode(cr.getClCode())
.clCodeNm(cr.getClCodeNm()).clCodeJp(cr.getClCodeJp()).clPriority(cr.getClPriority())
.clRefChr1(cr.getClRefChr1()).clRefChr2(cr.getClRefChr2()).build());
});
result.forEach(
cr -> {
commCodeList.add(
CommCodeRes.builder()
.clHeadCd(cr.getClHeadCd())
.clCode(cr.getClCode())
.clCodeNm(cr.getClCodeNm())
.clCodeJp(cr.getClCodeJp())
.clPriority(cr.getClPriority())
.build());
});
return commCodeList;
}
/**
* 헤더코드 동기화
*
* @param headCodeList
* @throws Exception
*/
public void setHeaderCodeSyncSave(List<HeadCodeRequest> headCodeList) throws Exception {
// 헤더코드 동기화
for (HeadCodeRequest headCodeReq : headCodeList) {
try {
if ("Y".equals(headCodeReq.getQcCommYn()) && "N".equals(headCodeReq.getDelYn())) {
headCodeReq.setDelFlg(0);
} else {
headCodeReq.setDelFlg(1);
}
commCodeMapper.setHeadCodeSyncSave(headCodeReq);
} catch (Exception e) {
log.error(e.getMessage());
}
}
}
/**
* 상세코드 동기화
*
* @param detailCodeList
* @throws Exception
*/
public void setCommonCodeSyncSave(List<DetailCodeRequest> detailCodeList) throws Exception {
// 상세코드 동기화
for (DetailCodeRequest detailCodeReq : detailCodeList) {
try {
if ("A".equals(detailCodeReq.getStatCd()) && "N".equals(detailCodeReq.getDelYn())) {
detailCodeReq.setDelFlg(0);
} else {
detailCodeReq.setDelFlg(1);
}
commCodeMapper.setCommonCodeSyncSave(detailCodeReq);
} catch (Exception e) {
log.error(e.getMessage());
}
}
}
}

View File

@ -11,6 +11,4 @@ public class CommCodeRes {
private String clCodeNm;
private String clCodeJp;
private Integer clPriority;
private String clRefChr1;
private String clRefChr2;
}

View File

@ -1,17 +0,0 @@
package com.interplug.qcast.biz.commCode.dto;
import java.util.List;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class CommonCodeSyncResponse {
@Schema(description = "공통코드 H 목록")
private List<HeadCodeRequest> apiHeadCdList;
@Schema(description = "공통코드 L 목록")
private List<DetailCodeRequest> apiCommCdList;
}

View File

@ -1,28 +0,0 @@
package com.interplug.qcast.biz.commCode.dto;
import lombok.Data;
@Data
public class DetailCodeRequest {
private String headCd;
private String code;
private String readCd;
private String codeNm;
private String codeJp;
private String code4Th;
private String refChr1;
private String refChr2;
private String refChr3;
private String refChr4;
private String refChr5;
private Integer refNum1;
private Integer refNum2;
private Integer refNum3;
private Integer refNum4;
private Integer refNum5;
private Integer priority;
private String refCnt;
private String statCd;
private Integer delFlg;
private String delYn;
}

View File

@ -1,26 +0,0 @@
package com.interplug.qcast.biz.commCode.dto;
import lombok.Data;
@Data
public class HeadCodeRequest {
private String headCd;
private String headId;
private String headNm;
private String headJp;
private String head4Th;
private String refChr1;
private String refChr2;
private String refChr3;
private String refChr4;
private String refChr5;
private String refNum1;
private String refNum2;
private String refNum3;
private String refNum4;
private String refNum5;
private String remarks;
private Integer delFlg;
private String qcCommYn;
private String delYn;
}

View File

@ -1,12 +1,5 @@
package com.interplug.qcast.biz.community;
import com.interplug.qcast.biz.community.dto.BoardRequest;
import com.interplug.qcast.biz.community.dto.BoardResponse;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
@ -14,6 +7,13 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;
import com.interplug.qcast.biz.community.dto.BoardRequest;
import com.interplug.qcast.biz.community.dto.BoardResponse;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@RestController
@ -41,11 +41,9 @@ public class BoardController {
@Operation(description = "커뮤니티(공지사항, FAQ, 자료다운로드) 파일 다운로드를 진행한다.")
@GetMapping("/file/download")
@ResponseStatus(HttpStatus.OK)
public void getFileDownload(
HttpServletResponse response,
@RequestParam(required = true) String keyNo,
@RequestParam String zipYn)
throws Exception {
boardService.getFileDownload(response, keyNo, zipYn);
public void getFileDownload(HttpServletResponse response,
@RequestParam(required = true) String encodeFileNo) throws Exception {
boardService.getFileDownload(response, encodeFileNo);
}
}

View File

@ -1,5 +1,17 @@
package com.interplug.qcast.biz.community;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpMethod;
import org.springframework.stereotype.Service;
import org.springframework.util.StreamUtils;
import org.springframework.web.util.UriComponentsBuilder;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.interplug.qcast.biz.community.dto.BoardRequest;
@ -9,20 +21,8 @@ import com.interplug.qcast.config.Exception.QcastException;
import com.interplug.qcast.config.message.Messages;
import com.interplug.qcast.util.InterfaceQsp;
import jakarta.servlet.http.HttpServletResponse;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpMethod;
import org.springframework.stereotype.Service;
import org.springframework.util.StreamUtils;
import org.springframework.web.util.UriComponentsBuilder;
@Slf4j
@Service
@ -30,7 +30,8 @@ import org.springframework.web.util.UriComponentsBuilder;
public class BoardService {
private final InterfaceQsp interfaceQsp;
@Autowired Messages message;
@Autowired
Messages message;
@Value("${qsp.url}")
private String QSP_API_URL;
@ -49,14 +50,12 @@ public class BoardService {
/* [0]. Validation Check */
if ("".equals(boardRequest.getSchNoticeClsCd())) {
// [msg] {0} is required input value.
throw new QcastException(
ErrorCode.INVALID_INPUT_VALUE,
throw new QcastException(ErrorCode.INVALID_INPUT_VALUE,
message.getMessage("common.message.required.data", "Notice Cls Code"));
}
if ("".equals(boardRequest.getSchNoticeTpCd())) {
// [msg] {0} is required input value.
throw new QcastException(
ErrorCode.INVALID_INPUT_VALUE,
throw new QcastException(ErrorCode.INVALID_INPUT_VALUE,
message.getMessage("common.message.required.data", "Notice Type Code"));
}
@ -67,17 +66,12 @@ public class BoardService {
}
String url = QSP_API_URL + "/api/board/list";
String apiUrl =
UriComponentsBuilder.fromHttpUrl(url)
.queryParam("noticeNo", boardRequest.getNoticeNo())
.queryParam("schTitle", encodedSchTitle)
.queryParam("schNoticeTpCd", boardRequest.getSchNoticeTpCd())
.queryParam("schNoticeClsCd", boardRequest.getSchNoticeClsCd())
.queryParam("startRow", boardRequest.getStartRow())
.queryParam("endRow", boardRequest.getEndRow())
.queryParam("schMainYn", boardRequest.getSchMainYn())
.build()
.toUriString();
String apiUrl = UriComponentsBuilder.fromHttpUrl(url)
.queryParam("noticeNo", boardRequest.getNoticeNo()).queryParam("schTitle", encodedSchTitle)
.queryParam("schNoticeTpCd", boardRequest.getSchNoticeTpCd())
.queryParam("schNoticeClsCd", boardRequest.getSchNoticeClsCd())
.queryParam("startRow", boardRequest.getStartRow())
.queryParam("endRow", boardRequest.getEndRow()).build().toUriString();
/* [2]. QSP API CALL -> Response */
String strResponse = interfaceQsp.callApi(HttpMethod.GET, apiUrl, null);
@ -109,18 +103,14 @@ public class BoardService {
/* [0]. Validation Check */
if (boardRequest.getNoticeNo() == null) {
// [msg] {0} is required input value.
throw new QcastException(
ErrorCode.INVALID_INPUT_VALUE,
throw new QcastException(ErrorCode.INVALID_INPUT_VALUE,
message.getMessage("common.message.required.data", "Notice No"));
}
/* [1]. QSP API (url + param) Setting */
String url = QSP_API_URL + "/api/board/detail";
String apiUrl =
UriComponentsBuilder.fromHttpUrl(url)
.queryParam("noticeNo", boardRequest.getNoticeNo())
.build()
.toUriString();
String apiUrl = UriComponentsBuilder.fromHttpUrl(url)
.queryParam("noticeNo", boardRequest.getNoticeNo()).build().toUriString();
/* [2]. QSP API CALL -> Response */
String strResponse = interfaceQsp.callApi(HttpMethod.GET, apiUrl, null);
@ -145,24 +135,17 @@ public class BoardService {
* @param encodeFileNo
* @throws Exception
*/
public void getFileDownload(HttpServletResponse response, String keyNo, String zipYn)
throws Exception {
public void getFileDownload(HttpServletResponse response, String encodeFileNo) throws Exception {
/* [0]. Validation Check */
if ("".equals(keyNo)) {
if ("".equals(encodeFileNo)) {
// [msg] {0} is required input value.
String arg = "Y".equals(zipYn) ? "Notice No" : "File No";
throw new QcastException(
ErrorCode.INVALID_INPUT_VALUE, message.getMessage("common.message.required.data", arg));
throw new QcastException(ErrorCode.INVALID_INPUT_VALUE,
message.getMessage("common.message.required.data", "File No"));
}
/* [1]. QSP API (url + fileNo) Setting */
String url = QSP_API_URL + "/api/file/downloadFile";
if ("Y".equals(zipYn)) {
url += "?noticeNo=" + keyNo;
} else {
url += "?fileNo=" + keyNo;
}
String url = QSP_API_URL + "/api/file/downloadFile" + "?encodeFileNo=" + encodeFileNo;
/* [2]. QSP API CALL -> Response */
Map<String, String> result = new HashMap<String, String>();
@ -171,13 +154,10 @@ public class BoardService {
if (byteResponse != null && byteResponse.length > 0) {
try {
/* [3]. API 응답 파일 처리 */
response.addHeader("Access-Control-Expose-Headers", "Content-Disposition");
response.setContentType(
!"".equals(result.get("type")) && result.get("type") != null
? result.get("type")
!"".equals(result.get("type")) && result.get("type") != null ? result.get("type")
: "application/octet-stream");
response.setHeader(
"Content-Disposition",
response.setHeader("Content-Disposition",
!"".equals(result.get("disposition")) && result.get("disposition") != null
? result.get("disposition")
: "attachment;");
@ -190,15 +170,14 @@ public class BoardService {
} catch (Exception e) {
// [msg] File download error
throw new QcastException(
ErrorCode.INTERNAL_SERVER_ERROR,
throw new QcastException(ErrorCode.INTERNAL_SERVER_ERROR,
message.getMessage("common.message.file.download.error"));
}
} else {
// [msg] File does not exist.
throw new QcastException(
ErrorCode.NOT_FOUND, message.getMessage("common.message.file.download.exists"));
throw new QcastException(ErrorCode.NOT_FOUND,
message.getMessage("common.message.file.download.exists"));
}
}
}

View File

@ -25,7 +25,4 @@ public class BoardRequest {
/** 종료 행 */
private int endRow;
/** 메인여부 */
private String schMainYn;
}

View File

@ -1,23 +1,14 @@
package com.interplug.qcast.biz.displayItem;
import com.interplug.qcast.biz.displayItem.dto.DisplayItemRequest;
import com.interplug.qcast.biz.displayItem.dto.ItemDetailResponse;
import com.interplug.qcast.biz.displayItem.dto.ItemRequest;
import com.interplug.qcast.biz.displayItem.dto.ItemResponse;
import com.interplug.qcast.config.Exception.QcastException;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import java.util.List;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
@Slf4j
@RestController
@ -27,46 +18,26 @@ import org.springframework.web.bind.annotation.RestController;
public class DisplayItemController {
private final DisplayItemService displayItemService;
/**
* 전시제품 정보 등록/수정
*
* @param displayItemRequest
* @throws QcastException
*/
@Operation(description = "전시제품 정보를 등록/수정한다. (동기화)")
@PostMapping("/display-item-save")
@ResponseStatus(HttpStatus.OK)
public void setStoreDisplayItemSave(@RequestBody DisplayItemRequest displayItemRequest)
throws QcastException {
throws Exception {
displayItemService.setStoreDisplayItemSave(displayItemRequest);
}
/**
* 제품 목록 조회
*
* @param itemRequest
* @return
* @throws QcastException
*/
@Operation(description = "제품 목록을 조회한다.")
@PostMapping("/item-list")
@GetMapping("/item-list")
@ResponseStatus(HttpStatus.OK)
public List<ItemResponse> getItemList(@RequestBody ItemRequest itemRequest)
throws QcastException {
return displayItemService.getItemList(itemRequest);
public List<ItemResponse> getItemList(@RequestParam("saleStoreId") String saleStoreId)
throws Exception {
return displayItemService.getItemList(saleStoreId);
}
/**
* 제품 상세 정보 조회
*
* @param itemId
* @return
* @throws QcastException
*/
@Operation(description = "제품 상세 정보를 조회한다.")
@GetMapping("/item-detail")
@ResponseStatus(HttpStatus.OK)
public ItemDetailResponse getItemDetail(@RequestParam String itemId) throws QcastException {
public ItemResponse getItemDetail(@RequestParam("itemId") String itemId) throws Exception {
return displayItemService.getItemDetail(itemId);
}
}

View File

@ -1,6 +1,8 @@
package com.interplug.qcast.biz.displayItem;
import com.interplug.qcast.biz.displayItem.dto.*;
import com.interplug.qcast.biz.displayItem.dto.DisplayItemRequest;
import com.interplug.qcast.biz.displayItem.dto.ItemResponse;
import com.interplug.qcast.biz.displayItem.dto.ItemSyncResponse;
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@ -10,11 +12,9 @@ public interface DisplayItemMapper {
void setStoreDisplayItemSave(DisplayItemRequest displayItemRequest) throws Exception;
List<ItemResponse> getItemList(ItemRequest itemRequest);
List<ItemResponse> getItemList(@Param("saleStoreId") String saleStoreId);
ItemDetailResponse getItemDetail(@Param("itemId") String itemId);
List<ItemResponse> selectItemBomList(@Param("itemId") String itemId);
ItemResponse getItemDetail(@Param("itemId") String itemId);
/**
* 아이템 정보 동기화
@ -24,40 +24,4 @@ public interface DisplayItemMapper {
* @throws Exception
*/
int setItemSyncSave(ItemSyncResponse itemInfoSync);
/**
* 아이템 추가 정보 동기화
*
* @param itemInfoSync 아이템 정보
* @return
* @throws Exception
*/
int setItemInfoSyncSave(ItemSyncResponse itemInfoSync);
/**
* BOM 아이템 정보 삭제
*
* @param bomInfoSync 아이템 정보
* @return
* @throws Exception
*/
int deleteBomSync(BomSyncResponse bomInfoSync);
/**
* BOM 아이템 정보 동기화
*
* @param bomInfoSync 아이템 정보
* @return
* @throws Exception
*/
int setBomSyncSave(BomSyncResponse bomInfoSync);
/**
* 아이템 가격 정보 동기화
*
* @param priceItemSyncResponse 아이템 가격 정보
* @return
* @throws Exception
*/
int setPriceItemSyncSave(PriceItemSyncResponse priceItemSyncResponse);
}

View File

@ -1,11 +1,11 @@
package com.interplug.qcast.biz.displayItem;
import com.interplug.qcast.biz.displayItem.dto.*;
import com.interplug.qcast.biz.displayItem.dto.DisplayItemRequest;
import com.interplug.qcast.biz.displayItem.dto.ItemResponse;
import com.interplug.qcast.biz.displayItem.dto.ItemSyncResponse;
import com.interplug.qcast.biz.estimate.EstimateMapper;
import com.interplug.qcast.biz.estimate.dto.NoteRequest;
import com.interplug.qcast.biz.estimate.dto.NoteResponse;
import com.interplug.qcast.config.Exception.ErrorCode;
import com.interplug.qcast.config.Exception.QcastException;
import io.micrometer.common.util.StringUtils;
import java.util.List;
import lombok.RequiredArgsConstructor;
@ -25,29 +25,20 @@ public class DisplayItemService {
* 판매점 노출 아이템 정보 저장
*
* @param displayItemRequest
* @throws QcastException
* @throws Exception
*/
public void setStoreDisplayItemSave(DisplayItemRequest displayItemRequest) throws QcastException {
try {
displayItemMapper.setStoreDisplayItemSave(displayItemRequest);
} catch (Exception e) {
throw new QcastException(ErrorCode.INTERNAL_SERVER_ERROR, e.getMessage());
}
public void setStoreDisplayItemSave(DisplayItemRequest displayItemRequest) throws Exception {
displayItemMapper.setStoreDisplayItemSave(displayItemRequest);
}
/**
* 아이템 목록 조회
*
* @param itemRequest
* @param saleStoreId
* @return
* @throws QcastException
*/
public List<ItemResponse> getItemList(ItemRequest itemRequest) throws QcastException {
try {
return displayItemMapper.getItemList(itemRequest);
} catch (Exception e) {
throw new QcastException(ErrorCode.INTERNAL_SERVER_ERROR, e.getMessage());
}
public List<ItemResponse> getItemList(String saleStoreId) {
return displayItemMapper.getItemList(saleStoreId);
}
/**
@ -56,39 +47,29 @@ public class DisplayItemService {
* @param itemId
* @return
*/
public ItemDetailResponse getItemDetail(String itemId) throws QcastException {
try {
ItemDetailResponse itemDetailResponse = displayItemMapper.getItemDetail(itemId);
public ItemResponse getItemDetail(String itemId) {
if (itemDetailResponse != null) {
// BOM 헤더 아이템인 경우 BOM List를 내려준다.
if ("ERLA".equals(itemDetailResponse.getItemCtgGr())) {
List<ItemResponse> itemBomList = displayItemMapper.selectItemBomList(itemId);
ItemResponse itemResponse = displayItemMapper.getItemDetail(itemId);
itemDetailResponse.setItemBomList(itemBomList);
}
if (itemResponse != null) {
// 견적특이사항 관련 데이터 셋팅
String[] arrItemId = {itemId};
// 견적특이사항 관련 데이터 셋팅
String[] arrItemId = {itemId};
NoteRequest noteRequest = new NoteRequest();
noteRequest.setArrItemId(arrItemId);
noteRequest.setSchSpnTypeCd("PROD");
List<NoteResponse> noteItemList = estimateMapper.selectEstimateNoteItemList(noteRequest);
NoteRequest noteRequest = new NoteRequest();
noteRequest.setArrItemId(arrItemId);
noteRequest.setSchSpnTypeCd("PROD");
List<NoteResponse> noteItemList = estimateMapper.selectEstimateNoteItemList(noteRequest);
String spnAttrCds = "";
for (NoteResponse noteResponse : noteItemList) {
spnAttrCds += !StringUtils.isEmpty(spnAttrCds) ? "" : "";
spnAttrCds += noteResponse.getCode();
}
itemDetailResponse.setSpnAttrCds(spnAttrCds);
String spnAttrCds = "";
for (NoteResponse noteResponse : noteItemList) {
spnAttrCds += !StringUtils.isEmpty(spnAttrCds) ? "" : "";
spnAttrCds += noteResponse.getCode();
}
return itemDetailResponse;
} catch (Exception e) {
throw new QcastException(ErrorCode.INTERNAL_SERVER_ERROR, e.getMessage());
itemResponse.setSpnAttrCds(spnAttrCds);
}
return itemResponse;
}
/**
@ -101,62 +82,8 @@ public class DisplayItemService {
public int setItemSyncSave(List<ItemSyncResponse> itemSyncList) throws Exception {
int cnt = 0;
for (ItemSyncResponse itemSyncData : itemSyncList) {
cnt += displayItemMapper.setItemSyncSave(itemSyncData);
cnt += displayItemMapper.setItemInfoSyncSave(itemSyncData);
displayItemMapper.setItemSyncSave(itemSyncData);
}
return cnt;
}
/**
* 아이템 정보 동기화
*
* @param bomSyncList 아이템 목록
* @return
* @throws Exception
*/
public int setBomSyncSave(List<BomSyncResponse> bomSyncList) throws Exception {
int cnt = 0;
for (BomSyncResponse bomSyncData : bomSyncList) {
if ("D".equals(bomSyncData.getStatCd())) {
// Bom 아이템 삭제 처리
cnt += displayItemMapper.deleteBomSync(bomSyncData);
} else {
// Bom 아이템 수정/등록 처리
cnt += displayItemMapper.setBomSyncSave(bomSyncData);
}
}
return cnt;
}
/**
* 아이템 가격 정보 동기화
*
* @param priceItemSyncList 가격 목록
* @return
* @throws Exception
*/
public int setPriceSyncSave(List<PriceItemSyncResponse> priceItemSyncList) throws Exception {
int cnt = 0;
for (PriceItemSyncResponse priceItemSyncResponse : priceItemSyncList) {
cnt += displayItemMapper.setPriceItemSyncSave(priceItemSyncResponse);
}
return cnt;
}
/**
* 노출 아이템 동기화 - Batch
*
* @param displayItemList
* @throws Exception
*/
public void setStoreDispItemBatch(List<DisplayItemRequest> displayItemList) throws Exception {
// 노출 아이템 동기화
for (DisplayItemRequest displayItemRequest : displayItemList) {
try {
displayItemMapper.setStoreDisplayItemSave(displayItemRequest);
} catch (Exception e) {
log.error(e.getMessage());
}
}
}
}

View File

@ -1,25 +0,0 @@
package com.interplug.qcast.biz.displayItem.dto;
import com.interplug.qcast.util.DefaultResponse;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
/** Bom 아이템 동기화 Response */
@Data
public class BomSyncResponse extends DefaultResponse {
@Schema(description = "Material Number")
String packageItemId;
@Schema(description = "Bom Code")
String itemId;
@Schema(description = "Amount")
String amount;
@Schema(description = "Manual Flag")
String manualFlg;
@Schema(description = "Status Code(A, D)")
String statCd;
}

View File

@ -1,57 +0,0 @@
package com.interplug.qcast.biz.displayItem.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import java.util.List;
import lombok.Data;
@Data
public class ItemDetailResponse {
@Schema(description = "Itme Id")
private String itemId;
@Schema(description = "Item No")
private String itemNo;
@Schema(description = "Item Name")
private String itemName;
@Schema(description = "Goods No")
private String goodsNo;
@Schema(description = "Unit")
private String unit;
@Schema(description = "Specification")
private String specification;
@Schema(description = "pnow_w")
private String pnowW;
@Schema(description = "Item Group")
private String itemGroup;
@Schema(description = "Module Flag")
private String moduleFlg;
@Schema(description = "PKG Material Flag")
private String pkgMaterialFlg;
@Schema(description = "File Upload Flag")
private String fileUploadFlg;
@Schema(description = "오픈가 Flag")
private String openFlg;
@Schema(description = "Sale Price")
private String salePrice;
@Schema(description = "Item Ctg Group")
private String itemCtgGr;
@Schema(description = "견적 특이사항 코드")
private String spnAttrCds;
@Schema(description = "Bom 목록")
List<ItemResponse> itemBomList;
}

View File

@ -1,17 +0,0 @@
package com.interplug.qcast.biz.displayItem.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
public class ItemRequest {
@Schema(description = "Sale Store Id")
private String saleStoreId;
@Schema(description = "Cold Zone Flg")
private String coldZoneFlg;
@Schema(description = "Salt-affected Flg")
private String saltAffectedFlg;
}

View File

@ -9,9 +9,6 @@ public class ItemResponse {
@Schema(description = "Itme Id")
private String itemId;
@Schema(description = "Item No")
private String itemNo;
@Schema(description = "Item Name")
private String itemName;
@ -42,12 +39,6 @@ public class ItemResponse {
@Schema(description = "Sale Price")
private String salePrice;
@Schema(description = "Item Ctg Group")
private String itemCtgGr;
@Schema(description = "Bom Amount")
private String bomAmount;
@Schema(description = "견적 특이사항 코드")
private String spnAttrCds;
}

View File

@ -34,9 +34,6 @@ public class ItemSyncResponse extends DefaultResponse {
@Schema(description = "Power Class")
String pnowW;
@Schema(description = "Item Ctg Group")
String itemCtgGr;
@Schema(description = "Qcast Material Group Code")
String itemGroup;
@ -136,18 +133,6 @@ public class ItemSyncResponse extends DefaultResponse {
@Schema(description = "PKG Material Flg")
String pkgMaterialFlg;
@Schema(description = "Temp Loss")
String tempLoss;
@Schema(description = "Temperature Coefficient")
String tempCoeff;
@Schema(description = "AMP")
String amp;
@Schema(description = "Conversion Efficiency")
String cnvEff;
@Schema(description = "Status Code(A, D)")
String statCd;

View File

@ -1,21 +0,0 @@
package com.interplug.qcast.biz.displayItem.dto;
import com.interplug.qcast.util.DefaultResponse;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
/** 아이템 동기화 Response */
@Data
public class PriceItemSyncResponse extends DefaultResponse {
@Schema(description = "Price Pattern(정가 : 510,.A가격 : 513, C가격 : 514)")
String pricePattern;
@Schema(description = "Material Number")
String itemId;
@Schema(description = "Price Amount")
String salePrice;
@Schema(description = "Price Amount")
String costPrice;
}

View File

@ -1,11 +0,0 @@
package com.interplug.qcast.biz.displayItem.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
/** 가격 동기화 Request */
@Data
public class PriceSyncRequest {
@Schema(description = "All Material Master Yn")
private String allYn;
}

View File

@ -1,17 +0,0 @@
package com.interplug.qcast.biz.displayItem.dto;
import com.interplug.qcast.util.DefaultResponse;
import io.swagger.v3.oas.annotations.media.Schema;
import java.util.List;
import lombok.Data;
/** 가격 동기화 Response */
@Data
public class PriceSyncResponse extends DefaultResponse {
@Schema(description = "Module Price")
private List<PriceItemSyncResponse> modulePriceList;
@Schema(description = "Bos Price")
private List<PriceItemSyncResponse> bosPriceList;
}

View File

@ -22,25 +22,18 @@ public class EstimateController {
@Operation(description = "1차점 가격 관리 목록을 조회한다.")
@GetMapping("/price/store-price-list")
@ResponseStatus(HttpStatus.OK)
public EstimateApiResponse selectStorePriceList(PriceRequest priceRequest) throws Exception {
public PriceResponse selectStorePriceList(PriceRequest priceRequest) throws Exception {
return estimateService.selectStorePriceList(priceRequest);
}
@Operation(description = "아이템 가격 목록을 조회한다.")
@PostMapping("/price/item-price-list")
@ResponseStatus(HttpStatus.OK)
public EstimateApiResponse selectItemPriceList(@RequestBody PriceRequest priceRequest)
public PriceResponse selectItemPriceList(@RequestBody PriceRequest priceRequest)
throws Exception {
return estimateService.selectItemPriceList(priceRequest);
}
@Operation(description = "견적서 특이사항 타이틀 목록을 조회한다.")
@GetMapping("/special-note-title-list")
@ResponseStatus(HttpStatus.OK)
public List<NoteResponse> selectSpecialNoteTitleList(NoteRequest noteRequest) throws Exception {
return estimateService.selectSpecialNoteTitleList(noteRequest);
}
@Operation(description = "견적서 특이사항 목록을 조회한다.")
@GetMapping("/special-note-list")
@ResponseStatus(HttpStatus.OK)
@ -51,7 +44,7 @@ public class EstimateController {
@Operation(description = "견적서 상세를 조회한다.")
@GetMapping("/{objectNo}/{planNo}/detail")
@ResponseStatus(HttpStatus.OK)
public EstimateResponse selectEstimateDetail(
public EstimateResponse selectObjectDetail(
@PathVariable String objectNo, @PathVariable String planNo) throws Exception {
return estimateService.selectEstimateDetail(objectNo, planNo);
}
@ -66,24 +59,9 @@ public class EstimateController {
@Operation(description = "견적서를 복사한다.")
@PostMapping("/save-estimate-copy")
@ResponseStatus(HttpStatus.CREATED)
public EstimateResponse insertEstimateCopy(@RequestBody EstimateCopyRequest estimateCopyRequest)
public EstimateResponse insertEstimateCopy(@RequestBody EstimateRequest estimateRequest)
throws Exception {
return estimateService.insertEstimateCopy(estimateCopyRequest);
}
@Operation(description = "견적서를 초기화한다.")
@PostMapping("/reset-estimate")
@ResponseStatus(HttpStatus.CREATED)
public EstimateResponse updateEstimateReset(@RequestBody EstimateRequest estimateRequest)
throws Exception {
return estimateService.updateEstimateReset(estimateRequest);
}
@Operation(description = "견적서 잠금여부를 저장한다.")
@PostMapping("/save-estimate-lock")
@ResponseStatus(HttpStatus.CREATED)
public void updateEstimateLock(@RequestBody EstimateRequest estimateRequest) throws Exception {
estimateService.updateEstimateLock(estimateRequest);
return estimateService.insertEstimateCopy(estimateRequest);
}
@Operation(description = "견적서를 엑셀로 다운로드한다.")

View File

@ -1,6 +1,7 @@
package com.interplug.qcast.biz.estimate;
import com.interplug.qcast.biz.estimate.dto.*;
import com.interplug.qcast.biz.object.dto.*;
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
@ -12,138 +13,42 @@ public interface EstimateMapper {
// 견적서 PDF 상세 확인
public EstimateResponse selectEstimatePdfDetail(EstimateRequest estimateRequest);
// 견적서 API 상세 확인
public EstimateSendResponse selectEstimateApiDetail(EstimateRequest estimateRequest);
// 견적서 API 실패 목록 조회
public List<EstimateSendResponse> selectEstimateApiFailList();
// 견적서 도면 아이템 목록 조회
public List<ItemResponse> selectEstimateDrawingItemList(EstimateRequest estimateRequest);
// 견적서 아이템 목록 조회
public List<ItemResponse> selectEstimateItemList(EstimateRequest estimateRequest);
// 아이템 마스터 목록 조회
public List<ItemResponse> selectItemMasterList(EstimateRequest estimateRequest);
// 아이템 마스터 BOM 목록 조회
public List<ItemResponse> selectItemMasterBomList(String itemId);
// 견적서 지붕재 인증용량 조회
public String selectEstimateRoofCertVolKw(EstimateRequest estimateRequest);
// 견적서 지붕재 목록 조회
public List<RoofResponse> selectEstimateRoofList(EstimateRequest estimateRequest);
// 견적서 지붕재 아이템 목록 조회
public List<RoofResponse> selectEstimateRoofItemList(EstimateRequest estimateRequest);
// 견적서 지붕재 PC 목록 조회
public List<ItemResponse> selectEstimateCircuitItemList(EstimateRequest estimateRequest);
// 견적서 지붕재 용량 목록 조회
public List<RoofResponse> selectEstimateRoofVolList(EstimateRequest estimateRequest);
// 견적서 특이사항 타이틀 목록 조회
public List<NoteResponse> selectEstimateNoteTitleList(NoteRequest noteRequest);
// 견적서 특이사항 목록 조회
// 아이템 마스터 목록 조회
public List<NoteResponse> selectEstimateNoteList(NoteRequest noteRequest);
// 아이템 마스터 목록 조회
public List<NoteResponse> selectEstimateNoteItemList(NoteRequest noteRequest);
// 아이템 히스토리 번호 조회
public String selectEstimateItemHisNo(EstimateRequest estimateRequest);
// 물건정보 수정
public int updateObject(EstimateRequest estimateRequest);
// 물건정보 상세 수정
public int updateObjectInfo(EstimateRequest estimateRequest);
// 견적서 정보 수정
public int updateEstimate(EstimateRequest estimateRequest);
// 견적서 상세 정보 수정
public int updateEstimateInfo(EstimateRequest estimateRequest);
// 견적서 정보 초기화
public int updateEstimateReset(EstimateRequest estimateRequest);
// 견적서 상세 정보 초기화
public int updateEstimateInfoReset(EstimateRequest estimateRequest);
// 견적서 잠금 수정
public int updateEstimateLock(EstimateRequest estimateRequest);
// 견적서 API 정보 수정
public int updateEstimateApi(EstimateRequest estimateRequest);
// 견적서 지붕면 등록
// 견적서 지붕재 등록
public int insertEstimateRoof(RoofRequest roofRequest);
// 견적서 지붕 아이템 등록
// 견적서 지붕재 아이템 등록
public int insertEstimateRoofItem(ItemRequest itemRequest);
// 견적서 지붕면 회로구성 아이템 등록
public int insertEstimateCircuitItem(ItemRequest itemRequest);
// 견적서 도면 아이템 등록
public int insertEstimateDrawingItem(ItemRequest itemRequest);
// 견적서 아이템 등록
public int insertEstimateItem(ItemRequest itemRequest);
// 견적서 아이템 상세 등록
public int insertEstimateInfoItem(ItemRequest itemRequest);
// 견적서 아이템 히스토리 등록
public int insertEstimateItemHis(ItemRequest itemRequest);
// 견적서 지붕재 목록 삭제(물리 삭제)
public int deleteEstimateRoofList(EstimateRequest estimateRequest);
// 견적서 지붕재 아이템 목록 삭제(물리 삭제)
public int deleteEstimateRoofItemList(EstimateRequest estimateRequest);
// 견적서 회로구성 아이템 목록 삭제(물리 삭제)
public int deleteEstimateCircuitItemList(EstimateRequest estimateRequest);
// 견적서 도면 아이템 목록 삭제(물리 삭제)
public int deleteEstimateDrawingItemList(EstimateRequest estimateRequest);
// 견적서 아이템 목록 삭제(물리 삭제)
public int deleteEstimateItemList(EstimateRequest estimateRequest);
// 견적서 아이템 상세 목록 삭제(물리 삭제)
public int deleteEstimateInfoItemList(EstimateRequest estimateRequest);
// 견적서 복사
public int insertEstimateCopy(EstimateCopyRequest estimateCopyRequest);
// 견적서 상세 복사
public int insertEstimateInfoCopy(EstimateCopyRequest estimateCopyRequest);
// 견적서 지붕면 복사
public int insertEstimateRoofCopy(EstimateCopyRequest estimateCopyRequest);
// 견적서 지붕면 아이템 복사
public int insertEstimateRoofItemCopy(EstimateCopyRequest estimateCopyRequest);
// 견적서 지붕면 회로구성 아이템 복사
public int insertEstimateCircuitItemCopy(EstimateCopyRequest estimateCopyRequest);
// 견적서 도면 아이템 복사
public int insertEstimateDrawingItemCopy(EstimateCopyRequest estimateCopyRequest);
// Plan 확정 동기화
public int updatePlanConfirmSync(PlanSyncResponse planSyncData);
// 견적서 Q.ORDER 연동 시공타입 조회
public String selectEstimateConstructSpecification(EstimateRequest estimateRequest);
// 견적서 수정일 변경
public int updateEstimateLastEditDate(EstimateRequest estimateRequest);
public int insertEstimateCopy(EstimateRequest estimateRequest);
}

View File

@ -1,31 +0,0 @@
package com.interplug.qcast.biz.estimate.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
public class EstimateCopyRequest {
@Schema(description = "물건번호")
private String objectNo;
@Schema(description = "플랜번호")
private String planNo;
@Schema(description = "판매점ID")
private String saleStoreId;
@Schema(description = "복사 판매점 ID")
private String copySaleStoreId;
@Schema(description = "복사 물건번호")
private String copyObjectNo;
@Schema(description = "복사 플랜번호")
private String copyPlanNo;
@Schema(description = "복사 담당자명")
private String copyReceiveUser;
@Schema(description = "사용자아이디")
private String userId;
}

View File

@ -1,6 +1,5 @@
package com.interplug.qcast.biz.estimate.dto;
import com.interplug.qcast.biz.file.dto.FileRequest;
import io.swagger.v3.oas.annotations.media.Schema;
import java.util.List;
import lombok.Data;
@ -22,9 +21,6 @@ public class EstimateRequest {
@Schema(description = "안건명")
private String objectName;
@Schema(description = "경칭")
private String objectNameOmit;
@Schema(description = "시공방법")
private String constructSpecification;
@ -154,62 +150,32 @@ public class EstimateRequest {
@Schema(description = "가격코드")
private String priceCd;
@Schema(description = "QSP 동기화 여부")
private String syncFlg;
@Schema(description = "잠금 여부")
private String lockFlg;
@Schema(description = "임시저장 여부")
private String tempFlg;
@Schema(description = "비고")
private String remarks;
@Schema(description = "복사 플랜번호")
private String copyPlanNo;
@Schema(description = "아이템번호 목록")
private String[] arrItemId;
// 다운로드 관련 조건
@Schema(description = "검색 - 다운로드 구분")
private String schDownload;
@Schema(description = "검색 - 다운로드 정가 표시여부")
@Schema(description = "다운로드 정가 표시여부")
private String schUnitPriceFlg;
@Schema(description = "검색 - 다운로드 표시여부")
@Schema(description = "다운로드 표시여부")
private String schDisplayFlg;
@Schema(description = "검색 - 가대중량표 포함 여부")
@Schema(description = "가대중량표 포함 여부")
private String schWeightFlg;
@Schema(description = "검색 - 도면/시뮬레이션 포함 여부")
@Schema(description = "도면 포함 여부")
private String schDrawingFlg;
@Schema(description = "검색 - 아이템 그룹")
private String schItemGroup;
@Schema(description = "검색 - 아이템 BOM 제외여부")
private String schBomNotExist;
// 데이터 목록 관련 정보
@Schema(description = "지붕재 목록")
List<RoofRequest> roofSurfaceList;
@Schema(description = "PC 회로구성도 목록")
List<ItemRequest> circuitItemList;
List<RoofRequest> roofList;
@Schema(description = "아이템 목록")
List<ItemRequest> itemList;
@Schema(description = "첨부파일 목록")
List<FileRequest> fileList;
@Schema(description = "삭제 첨부파일 목록")
List<FileRequest> deleteFileList;
@Schema(description = "다운로드 파일명")
private String fileName;
@Schema(description = "발전시뮬레이션 타입")
private String pwrGnrSimType;
}

View File

@ -1,9 +1,8 @@
package com.interplug.qcast.biz.estimate.dto;
import java.util.List;
import com.interplug.qcast.biz.file.dto.FileResponse;
import com.interplug.qcast.biz.pwrGnrSimulation.dto.PwrGnrSimResponse;
import io.swagger.v3.oas.annotations.media.Schema;
import java.util.List;
import lombok.Data;
@Data
@ -80,9 +79,6 @@ public class EstimateResponse {
@Schema(description = "기준풍속ID")
private String standardWindSpeedId;
@Schema(description = "기준풍속명")
private String standardWindSpeedName;
@Schema(description = "가대 메이커명")
private String supportMeaker;
@ -143,24 +139,12 @@ public class EstimateResponse {
@Schema(description = "가격코드")
private String priceCd;
@Schema(description = "잠금 여부")
private String lockFlg;
@Schema(description = "임시저장 여부")
private String tempFlg;
@Schema(description = "비고")
private String remarks;
@Schema(description = "갱신일")
private String lastEditDatetime;
@Schema(description = "생성일")
private String createDatetime;
@Schema(description = "생성자 아이디")
private String createUser;
// 가격 관련 정보
@Schema(description = "총 수량")
private String totAmount;
@ -190,12 +174,6 @@ public class EstimateResponse {
@Schema(description = "경칭")
private String objectNameOmit;
@Schema(description = "도도부현명")
private String prefName;
@Schema(description = "지역명")
private String areaName;
@Schema(description = "물건정보 비고")
private String objectRemarks;
@ -214,18 +192,6 @@ public class EstimateResponse {
@Schema(description = "하위 판매점명")
private String agencySaleStoreName;
@Schema(description = "한랭지 대책여부")
private String coldRegionFlg;
@Schema(description = "염해지역 아이템사용 여부")
private String saltAreaFlg;
@Schema(description = "도면이미지1")
private byte[] drawingImg1;
@Schema(description = "도면이미지2")
private byte[] drawingImg2;
// 판매점 정보
@Schema(description = "고객 판매점명")
private String custSaleStoreName;
@ -267,16 +233,4 @@ public class EstimateResponse {
@Schema(description = "첨부파일 목록")
List<FileResponse> fileList;
@Schema(description = "지붕재 정보")
RoofInfoResponse roofInfo;
@Schema(description = "발전시뮬레이션 정보")
PwrGnrSimResponse pwrGnrSim;
@Schema(description = "SAP STORE ID")
private String sapSaleStoreId;
@Schema(description = "SAP STORE CD")
private String sapSalesStoreCd;
}

View File

@ -1,11 +0,0 @@
package com.interplug.qcast.biz.estimate.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import java.util.List;
import lombok.Data;
@Data
public class EstimateSendRequest {
@Schema(description = "견적서 목록 정보")
List<EstimateSendResponse> quoteList;
}

View File

@ -1,118 +0,0 @@
package com.interplug.qcast.biz.estimate.dto;
import com.interplug.qcast.biz.file.dto.FileResponse;
import io.swagger.v3.oas.annotations.media.Schema;
import java.util.List;
import lombok.Data;
@Data
public class EstimateSendResponse {
@Schema(description = "물건번호")
private String objectNo;
@Schema(description = "플랜번호")
private String planNo;
@Schema(description = "판매점 ID")
private String saleStoreId;
@Schema(description = "물건명")
private String objectName;
@Schema(description = "경칭코드")
private String objectNameOmitCd;
@Schema(description = "견적서 등록일")
private String estimateDetailCreateDate;
@Schema(description = "수취회사명")
private String receiveCompanyName;
@Schema(description = "수취자명")
private String receiveUser;
@Schema(description = "배송지 우편번호")
private String deliveryZipNo;
@Schema(description = "배송지 주소")
private String deliveryTarget;
@Schema(description = "배송지 연락처")
private String deliveryTel;
@Schema(description = "배송 희망일")
private String deliveryHopeDate;
@Schema(description = "사양확장일")
private String specificationConfirmDate;
@Schema(description = "결제기간일")
private String paymentTerms;
@Schema(description = "차종류 코드")
private String carKindCd;
@Schema(description = "Track 종류 코드")
private String trackKind;
@Schema(description = "Track 10톤 배송일")
private String track10tDelivery;
@Schema(description = "Track 무게 코드")
private String trackWeight;
@Schema(description = "Track 시간 지정")
private String trackTimeSpecify;
@Schema(description = "Track 시간")
private String trackTime;
@Schema(description = "포리프트 여부")
private String forklift;
@Schema(description = "전압여부 (주택:0, 저압:1)")
private String houseClassCd;
@Schema(description = "영업사원 코드")
private String businessChargerCd;
@Schema(description = "영업사원 그룹 코드")
private String businessGroupCd;
@Schema(description = "시공방법")
private String constructSpecification;
@Schema(description = "북면설치여부")
private String northArrangement;
@Schema(description = "견적서 타입 (YJSS, YJOD)")
private String estimateType;
@Schema(description = "주택패키지 단가")
private String pkgAsp;
@Schema(description = "삭제여부")
private String delFlg;
@Schema(description = "마지막 수정일")
private String lastEditDatetime;
@Schema(description = "마지막 수정자")
private String lastEditUser;
@Schema(description = "저장타입(3:Q.CAST III)")
private String saveType;
@Schema(description = "문서번호")
private String docNo;
@Schema(description = "동기화 처리여부")
private String syncFlg;
// 데이터 목록 관련 정보
@Schema(description = "아이템 목록")
List<ItemResponse> itemList;
@Schema(description = "첨부파일 목록")
List<FileResponse> fileList;
}

View File

@ -1,14 +0,0 @@
package com.interplug.qcast.biz.estimate.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import java.util.List;
import lombok.Data;
@Data
public class EstimateSyncResponse {
@Schema(description = "실패목록")
private List<PlanSyncResponse> failList;
@Schema(description = "성공목록")
private List<PlanSyncResponse> successList;
}

View File

@ -14,21 +14,15 @@ public class ItemRequest {
@Schema(description = "플랜번호")
private String planNo;
@Schema(description = "지붕재 아이템 번호")
private String roofItemNo;
@Schema(description = "지붕재 번호")
private String roofSurfaceId;
private String roofNo;
@Schema(description = "아이템 ID")
private String itemId;
@Schema(description = "정렬번호")
@Schema(description = "정렬순서")
private String dispOrder;
@Schema(description = "부모 정렬번호")
private String paDispOrder;
@Schema(description = "아이템 번호")
private String itemNo;
@ -44,9 +38,6 @@ public class ItemRequest {
@Schema(description = "수량")
private String amount;
@Schema(description = "BOM 수량")
private String bomAmount;
@Schema(description = "변경수량")
private String amountChange;
@ -68,42 +59,15 @@ public class ItemRequest {
@Schema(description = "아이템 특이사항 코드")
private String specialNoteCd;
@Schema(description = "아이템 오픈가 여부")
private String openFlg;
@Schema(description = "아이템 변경 여부")
private String itemChangeFlg;
@Schema(description = "대표 케이블 여부")
private String dispCableFlg;
@Schema(description = "PC 아이템 ID")
private String pcItemId;
@Schema(description = "회로번호")
private String circuitNo;
@Schema(description = "회로구성번호")
private String circuit;
@Schema(description = "회로구성도")
private String circuitCfg;
@Schema(description = "W")
private String pnowW;
@Schema(description = "아이템 그룹코드")
private String itemGroup;
@Schema(description = "아이템 CTG 그룹코드")
private String itemCtgGr;
@Schema(description = "히스토리 번호")
private String hisNo;
@Schema(description = "삭제여부")
private String delFlg;
@Schema(description = "사용자아이디")
private String userId;
}

View File

@ -14,12 +14,9 @@ public class ItemResponse {
@Schema(description = "플랜번호")
private String planNo;
@Schema(description = "정렬번호")
@Schema(description = "노출번호")
private String dispOrder;
@Schema(description = "부모 정렬번호")
private String paDispOrder;
@Schema(description = "번호")
private String no;
@ -41,9 +38,6 @@ public class ItemResponse {
@Schema(description = "수량")
private String amount;
@Schema(description = "BOM 수량")
private String bomAmount;
@Schema(description = "단가")
private String salePrice;
@ -62,27 +56,15 @@ public class ItemResponse {
@Schema(description = "아이템 특이사항 코드")
private String specialNoteCd;
@Schema(description = "아이템 오픈가 여부")
private String openFlg;
@Schema(description = "아이템 변경 여부")
private String itemChangeFlg;
@Schema(description = "대표 케이블 여부")
private String dispCableFlg;
@Schema(description = "W")
private String pnowW;
@Schema(description = "아이템 그룹코드")
private String itemGroup;
@Schema(description = "아이템 CTG 그룹코드")
private String itemCtgGr;
@Schema(description = "모듈여부")
private String moduleFlg;
@Schema(description = "회로구성도")
private String circuitCfg;
}

View File

@ -16,7 +16,4 @@ public class NoteResponse {
@Schema(description = "견적특이사항")
private String remarks;
@Schema(description = "특이사항 묶음 여부")
private String pkgYn;
}

View File

@ -1,22 +0,0 @@
package com.interplug.qcast.biz.estimate.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
public class PlanSyncResponse {
@Schema(description = "물건번호")
private String objectNo;
@Schema(description = "플랜번호")
private String planNo;
@Schema(description = "견적서번호")
private String docNo;
@Schema(description = "동기화여부")
private String syncFlg;
@Schema(description = "메시지")
private String message;
}

View File

@ -3,7 +3,7 @@ package com.interplug.qcast.biz.estimate.dto;
import lombok.Data;
@Data
public class EstimateApiResponse {
public class PriceResponse {
/** API response result */
private Object result;

View File

@ -1,29 +0,0 @@
package com.interplug.qcast.biz.estimate.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import java.util.List;
import lombok.Getter;
import lombok.Setter;
// @Data
@Getter
@Setter
public class RoofInfoResponse {
@Schema(description = "인증용량")
private String certVolKw;
@Schema(description = "모듈 총 수")
private String moduleTotAmount;
@Schema(description = "모듈 총 용량")
private String moduleTotVolKw;
@Schema(description = "지붕면 목록")
private List<RoofResponse> roofList;
@Schema(description = "파워컨디셔너 목록")
private List<ItemResponse> circuitItemList;
@Schema(description = "지붕면 용량 목록")
private List<RoofResponse> roofVolList;
}

View File

@ -15,8 +15,8 @@ public class RoofRequest {
@Schema(description = "플랜번호")
private String planNo;
@Schema(description = "지붕재 ID")
private String roofSurfaceId;
@Schema(description = "지붕재 번호")
private String roofNo;
@Schema(description = "지붕면")
private String roofSurface;
@ -48,9 +48,6 @@ public class RoofRequest {
@Schema(description = "각도")
private String angle;
@Schema(description = "경사각 선택코드")
private String classType;
@Schema(description = "방위각")
private String azimuth;
@ -58,5 +55,5 @@ public class RoofRequest {
private String userId;
@Schema(description = "아이템 목록")
List<ItemRequest> moduleList;
List<ItemRequest> roofItemList;
}

View File

@ -1,94 +0,0 @@
package com.interplug.qcast.biz.estimate.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
import lombok.Setter;
// @Data
@Getter
@Setter
public class RoofResponse {
@Schema(description = "물건번호")
private String objectNo;
@Schema(description = "플랜번호")
private String planNo;
@Schema(description = "지붕면 ID")
private String roofSurfaceId;
@Schema(description = "지붕면")
private String roofSurface;
@Schema(description = "지붕재 아이템 ID")
private String roofMaterialId;
@Schema(description = "지붕재 아이템명")
private String roofMaterialName;
@Schema(description = "공법 ID")
private String supportMethodId;
@Schema(description = "공법명")
private String supportMethodName;
@Schema(description = "시공사양 ID")
private String constructSpecification;
@Schema(description = "시공사양명")
private String constructSpecificationName;
@Schema(description = "지붕재 아이템명")
private String roofMaterialIdMulti;
@Schema(description = "공법명")
private String supportMethodIdMulti;
@Schema(description = "시공방법명")
private String constructSpecificationMulti;
@Schema(description = "가대메이커명")
private String supportMeaker;
@Schema(description = "경사")
private String slope;
@Schema(description = "각도")
private String angle;
@Schema(description = "방위각")
private String azimuth;
@Schema(description = "경사각 선택코드")
private String classType;
@Schema(description = "경사각 선택명")
private String classTypeName;
@Schema(description = "면조도구분")
private String surfaceType;
@Schema(description = "설치높이")
private String setupHeight;
@Schema(description = "아이템 ID")
private String itemId;
@Schema(description = "아이템 번호")
private String itemNo;
@Schema(description = "아이템명")
private String itemName;
@Schema(description = "W")
private String specification;
@Schema(description = "매수")
private String amount;
@Schema(description = "용량")
private String volKw;
@Schema(description = "PC 아이템 ID")
private String pcItemId;
}

View File

@ -74,4 +74,5 @@ public class ExcelDownController {
log.error(e.getMessage());
}
}
}

View File

@ -48,10 +48,12 @@ public class FileController {
@Operation(description = "파일을 업로드 한다.")
@PostMapping("/fileUpload")
@ResponseStatus(HttpStatus.OK)
public List<FileRequest> fileUpload(
public Integer fileUpload(
HttpServletRequest request, HttpServletResponse response, FileRequest fileRequest)
throws Exception {
return fileService.fileUpload(request, fileRequest);
List<FileRequest> saveFileList = fileService.getUploadFileList(request, fileRequest);
Integer resultCnt = fileService.setFile(saveFileList, null);
return resultCnt;
}
@Operation(description = "파일을 삭제 한다.")

View File

@ -26,15 +26,6 @@ public interface FileMapper {
*/
Integer insertFile(FileRequest fileInsertReq) throws Exception;
/**
* 파일 상세정보 등록
*
* @param fileInsertReq
* @return
* @throws Exception
*/
Integer insertFileInfo(FileRequest fileInsertReq) throws Exception;
/**
* 파일 1건 조회
*

View File

@ -102,7 +102,6 @@ public class FileService {
}
String strSrcFileNm = multipartFile.getOriginalFilename();
strSrcFileNm = this.getUniqueFileName(strFileFolderPath, strSrcFileNm);
File file = new File(strFileFolderPath, strSrcFileNm);
multipartFile.transferTo(file);
@ -200,7 +199,6 @@ public class FileService {
for (FileRequest fileInsertReq : saveFilelist) {
if (!"".equals(fileInsertReq.getObjectNo()) && !"".equals(fileInsertReq.getCategory())) {
iResult += fileMapper.insertFile(fileInsertReq);
fileMapper.insertFileInfo(fileInsertReq);
}
}
}
@ -220,8 +218,6 @@ public class FileService {
HttpServletRequest request, HttpServletResponse response, FileRequest fileRequest)
throws Exception {
System.out.println("fileRequest>>>" + fileRequest.toString());
// 필수값 체크
if (fileRequest.getObjectNo() == null || fileRequest.getObjectNo().isEmpty()) {
throw new QcastException(
@ -239,46 +235,42 @@ public class FileService {
ErrorCode.NOT_FOUND, message.getMessage(" common.message.file.download.exists"));
}
try {
// 첨부파일 물리적 경로
String strSeparator = File.separator;
String filePath = baseDirPath + strSeparator + fileResponse.getObjectNo();
if (fileResponse.getPlanNo() != null && !fileResponse.getPlanNo().isEmpty()) {
filePath += strSeparator + fileResponse.getPlanNo();
}
filePath += strSeparator + fileResponse.getFaileName();
// 첨부파일 물리적 경로
String strSeparator = File.separator;
String filePath = baseDirPath + strSeparator + fileResponse.getObjectNo();
if (fileResponse.getPlanNo() != null && !fileResponse.getPlanNo().isEmpty()) {
filePath += strSeparator + fileResponse.getPlanNo();
}
filePath += strSeparator + fileResponse.getFaileName();
File file = new File(filePath);
if (!file.exists()) {
log.error("### File not found: {}", filePath);
throw new QcastException(ErrorCode.INTERNAL_SERVER_ERROR);
}
File file = new File(filePath);
if (!file.exists()) {
log.error("### File not found: {}", filePath);
throw new QcastException(ErrorCode.INTERNAL_SERVER_ERROR);
}
String mimeType = URLConnection.guessContentTypeFromName(file.getName());
if (mimeType == null) {
mimeType = "application/octet-stream";
}
String mimeType = URLConnection.guessContentTypeFromName(file.getName());
if (mimeType == null) {
mimeType = "application/octet-stream";
}
String originalFileName = fileResponse.getFaileName();
String encodedFileName =
URLEncoder.encode(originalFileName, StandardCharsets.UTF_8).replaceAll("\\+", "%20");
String originalFileName = fileResponse.getFaileName();
String encodedFileName =
URLEncoder.encode(originalFileName, StandardCharsets.UTF_8).replaceAll("\\+", "%20");
response.setHeader("Content-Transfer-Encoding", "binary;");
response.setHeader("Pragma", "no-cache;");
response.setHeader("Expires", "-1;");
response.setHeader("Content-Disposition", "attachment; filename=\"" + encodedFileName + "\"");
response.setContentType(mimeType);
response.setContentLength((int) file.length());
response.setHeader("Content-Transfer-Encoding", "binary;");
response.setHeader("Pragma", "no-cache;");
response.setHeader("Expires", "-1;");
response.setHeader("Content-Disposition", "attachment; filename=\"" + encodedFileName + "\"");
response.setContentType(mimeType);
response.setContentLength((int) file.length());
try (InputStream inputStream = new BufferedInputStream(new FileInputStream(file))) {
FileCopyUtils.copy(inputStream, response.getOutputStream());
} catch (IOException e) {
throw new QcastException(
ErrorCode.INTERNAL_SERVER_ERROR,
message.getMessage("common.message.file.download.error"));
}
} catch (Exception e) {
e.printStackTrace();
try (InputStream inputStream = new BufferedInputStream(new FileInputStream(file))) {
FileCopyUtils.copy(inputStream, response.getOutputStream());
} catch (IOException e) {
throw new QcastException(
ErrorCode.INTERNAL_SERVER_ERROR,
message.getMessage("common.message.file.download.error"));
}
}
@ -347,40 +339,4 @@ public class FileService {
return iResult;
}
public List<FileRequest> fileUpload(HttpServletRequest request, FileRequest fileRequest)
throws Exception {
List<FileRequest> saveFileList = this.getUploadFileList(request, fileRequest);
// Integer resultCnt = this.setFile(saveFileList, null);
return saveFileList;
}
public String getUniqueFileName(String uploadDir, String fileName) {
File dir = new File(uploadDir);
if (!dir.exists()) {
dir.mkdirs(); // 디렉터리가 없으면 생성
}
String name = fileName;
String extension = "";
// 파일명과 확장자 분리
int dotIndex = fileName.lastIndexOf(".");
if (dotIndex >= 0) {
name = fileName.substring(0, dotIndex);
extension = fileName.substring(dotIndex);
}
File file = new File(uploadDir, fileName);
int counter = 1;
// 파일명이 중복될 경우 번호를 붙임
while (file.exists()) {
String newFileName = name + "_" + counter + extension;
file = new File(uploadDir, newFileName);
counter++;
}
return file.getName();
}
}

View File

@ -30,6 +30,6 @@ public class FileRequest {
@Schema(description = "zip 파일 이름")
private String zipFileName;
@Schema(description = "planNo null 체크 Flag (NULL=1, NOT NULL=0)")
private String planNoNullChkFlg;
@Schema(description = "planNo null 체크 Flag (NULL=1, NOT NULL=0)", defaultValue = "1")
private String planNoNullChkFlg = "1";
}

View File

@ -1,5 +1,21 @@
package com.interplug.qcast.biz.login;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Base64;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.PatchMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;
import com.interplug.qcast.biz.login.dto.JoinUser;
import com.interplug.qcast.biz.login.dto.LoginUser;
import com.interplug.qcast.biz.login.dto.UserLoginResponse;
@ -10,24 +26,8 @@ import com.interplug.qcast.config.Exception.QcastException;
import com.interplug.qcast.config.message.Messages;
import com.interplug.qcast.util.DefaultResponse;
import io.swagger.v3.oas.annotations.Operation;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Base64;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.PatchMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;
@Slf4j
@RestController
@ -37,7 +37,8 @@ public class LoginController {
// @Autowired private LoginService loginService;
private final LoginService loginService;
@Autowired Messages message;
@Autowired
Messages message;
@Value("${qsp.aes256.key}")
String loginPasswordAesKey;
@ -45,9 +46,10 @@ public class LoginController {
@Value("${qsp.auto.login.aes256.key}")
String autoLoginAesKey;
/**
* Q.CAST III에 로그인하여 사용자 정보를 획득한다.
*
*
* @param loginUser LoginUser
* @return UserLoginResponse
* @throws Exception
@ -67,7 +69,7 @@ public class LoginController {
/**
* 가입 신청 정보를 등록한다.
*
*
* @param joinUser JoinUser
* @return DefaultResponse
* @throws Exception
@ -81,7 +83,7 @@ public class LoginController {
/**
* 비밀번호를 초기화한다.
*
*
* @param userPassword UserPassword
* @return DefaultResponse
* @throws Exception
@ -94,7 +96,7 @@ public class LoginController {
/**
* 비밀번호를 변경한다.
*
*
* @param userPassword UserPassword
* @return DefaultResponse
* @throws Exception
@ -107,7 +109,7 @@ public class LoginController {
/**
* 자동 로그인에 사용하는 아이디를 암호화한다.
*
*
* @param loginUser LoginUser
* @return String
* @throws Exception
@ -119,8 +121,7 @@ public class LoginController {
String loginEncryptId = "";
if ("".equals(loginUser.getLoginId()) || loginUser.getLoginId() == null) {
throw new QcastException(
ErrorCode.INVALID_INPUT_VALUE,
throw new QcastException(ErrorCode.INVALID_INPUT_VALUE,
message.getMessage("common.message.required.data", "User Id"));
}
@ -135,19 +136,16 @@ public class LoginController {
byte[] keyData = loginPasswordAesKey.getBytes();
SecretKey secureKey = new SecretKeySpec(keyData, "AES");
Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding");
c.init(
Cipher.ENCRYPT_MODE,
secureKey,
c.init(Cipher.ENCRYPT_MODE, secureKey,
new IvParameterSpec(encryptKey.substring(0, 16).getBytes()));
byte[] encrypted = c.doFinal(loginUser.getLoginId().getBytes("UTF-8"));
// [2]. 암호화 셋팅
loginEncryptId = new String(Base64.getEncoder().encode(encrypted));
;
loginEncryptId = new String(Base64.getEncoder().encode(encrypted));;
} catch (Exception e) {
throw new QcastException(
ErrorCode.INTERNAL_SERVER_ERROR, message.getMessage("common.message.error"));
throw new QcastException(ErrorCode.INTERNAL_SERVER_ERROR,
message.getMessage("common.message.error"));
}
return loginEncryptId;
@ -155,7 +153,7 @@ public class LoginController {
/**
* 자동 로그인에 사용하는 아이디를 복호화한다.
*
*
* @param loginUser LoginUser
* @return String
* @throws Exception
@ -167,8 +165,7 @@ public class LoginController {
String loginDecryptId = "";
if ("".equals(loginUser.getLoginId()) || loginUser.getLoginId() == null) {
throw new QcastException(
ErrorCode.INVALID_INPUT_VALUE,
throw new QcastException(ErrorCode.INVALID_INPUT_VALUE,
message.getMessage("common.message.required.data", "User Id"));
}
@ -183,9 +180,7 @@ public class LoginController {
byte[] keyData = loginPasswordAesKey.getBytes();
SecretKey secureKey = new SecretKeySpec(keyData, "AES");
Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding");
c.init(
Cipher.DECRYPT_MODE,
secureKey,
c.init(Cipher.DECRYPT_MODE, secureKey,
new IvParameterSpec(decryptKey.substring(0, 16).getBytes("UTF-8")));
byte[] byteStr = Base64.getDecoder().decode(loginUser.getLoginId().getBytes());
@ -194,10 +189,11 @@ public class LoginController {
loginDecryptId = new String(c.doFinal(byteStr), "UTF-8");
} catch (Exception e) {
throw new QcastException(
ErrorCode.INTERNAL_SERVER_ERROR, message.getMessage("common.message.error"));
throw new QcastException(ErrorCode.INTERNAL_SERVER_ERROR,
message.getMessage("common.message.error"));
}
return loginDecryptId;
}
}

View File

@ -35,7 +35,7 @@ public class LoginService {
/**
* 로그인 처리
*
*
* @param loginUser LoginUser
* @return UserLoginResponse
* @throws Exception
@ -72,7 +72,7 @@ public class LoginService {
/**
* 가입 신청 등록
*
*
* @param joinUser JoinUser
* @return DefaultResponse
* @throws Exception
@ -98,13 +98,9 @@ public class LoginService {
throw new QcastException(ErrorCode.INVALID_INPUT_VALUE,
message.getMessage("common.message.required.data", "Telephone"));
if (joinUser.getBizNo() == null || "".equals(joinUser.getBizNo()))
if (joinUser.getFax() == null || "".equals(joinUser.getFax()))
throw new QcastException(ErrorCode.INVALID_INPUT_VALUE,
message.getMessage("common.message.required.data", "Business Registration No"));
// if (joinUser.getFax() == null || "".equals(joinUser.getFax()))
// throw new QcastException(
// ErrorCode.INVALID_INPUT_VALUE, message.getMessage("common.message.required.data", "Fax"));
message.getMessage("common.message.required.data", "Fax"));
if (joinUser.getUserInfo().getUserId() == null || "".equals(joinUser.getUserInfo().getUserId()))
throw new QcastException(ErrorCode.INVALID_INPUT_VALUE,
@ -114,18 +110,18 @@ public class LoginService {
throw new QcastException(ErrorCode.INVALID_INPUT_VALUE,
message.getMessage("common.message.required.data", "Name"));
if (joinUser.getUserInfo().getUserNmKana() == null
|| "".equals(joinUser.getUserInfo().getUserNmKana()))
throw new QcastException(ErrorCode.INVALID_INPUT_VALUE,
message.getMessage("common.message.required.data", "Name Kana"));
// if (joinUser.getUserInfo().getUserNmKana() == null
// || "".equals(joinUser.getUserInfo().getUserNmKana()))
// throw new QcastException(ErrorCode.INVALID_INPUT_VALUE,
// message.getMessage("common.message.required.data", "Name Kana"));
if (joinUser.getUserInfo().getTelNo() == null || "".equals(joinUser.getUserInfo().getTelNo()))
throw new QcastException(ErrorCode.INVALID_INPUT_VALUE,
message.getMessage("common.message.required.data", "Telephone"));
// if (joinUser.getUserInfo().getFax() == null || "".equals(joinUser.getUserInfo().getFax()))
// throw new QcastException(
// ErrorCode.INVALID_INPUT_VALUE, message.getMessage("common.message.required.data", "Fax"));
if (joinUser.getUserInfo().getFax() == null || "".equals(joinUser.getUserInfo().getFax()))
throw new QcastException(ErrorCode.INVALID_INPUT_VALUE,
message.getMessage("common.message.required.data", "Fax"));
if (joinUser.getUserInfo().getEmail() == null || "".equals(joinUser.getUserInfo().getEmail()))
throw new QcastException(ErrorCode.INVALID_INPUT_VALUE,
@ -149,7 +145,7 @@ public class LoginService {
/**
* 비밀번호 초기화
*
*
* @param userPassword UserPassword
* @return DefaultResponse
* @throws Exception
@ -181,7 +177,7 @@ public class LoginService {
/**
* 비밀번호 변경
*
*
* @param userPassword UserPassword
* @return DefaultResponse
* @throws Exception

View File

@ -39,8 +39,10 @@ public class MainPageController {
// 물건정보 목록 조회
ObjectRequest objectRequest = new ObjectRequest();
objectRequest.setSaleStoreId(saleStoreId);
objectRequest.setStartRow("1");
objectRequest.setEndRow("3");
List<ObjectResponse> objectList = objectService.selectObjectMainList(objectRequest);
List<ObjectResponse> objectList = objectService.selectObjectList(objectRequest);
mainPageResponse.setObjectList(objectList);
return mainPageResponse;

View File

@ -1,130 +0,0 @@
package com.interplug.qcast.biz.master;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
@Schema(description = "Api 시공법 목록 조회 요청 객체 빌더")
public class ApiConstructionBuilder {
@Schema(description = "모듈타입코드")
private String moduleTpCd;
@Schema(description = "지붕재코드")
private String roofMatlCd;
@Schema(description = "가대메이커코드")
private String trestleMkrCd;
@Schema(description = "공법코드")
private String constMthdCd;
@Schema(description = "지붕기초코드")
private String roofBaseCd;
@Schema(description = "면조도")
private String illuminationTp;
@Schema(description = "설치높이")
private String instHt;
@Schema(description = "풍속")
private String stdWindSpeed;
@Schema(description = "적설량")
private String stdSnowLd;
@Schema(description = "경사도코드")
private String inclCd;
@Schema(description = "서까래기초코드")
private String raftBaseCd;
@Schema(description = "하제(망둥어)피치")
private Integer roofPitch;
public ApiConstructionBuilder setModuleTpCd(String moduleTpCd){
this.moduleTpCd = moduleTpCd;
return this;
}
public ApiConstructionBuilder setRoofMatlCd(String roofMatlCd){
this.roofMatlCd = roofMatlCd;
return this;
}
public ApiConstructionBuilder setTrestleMkrCd(String trestleMkrCd){
this.trestleMkrCd = trestleMkrCd;
return this;
}
public ApiConstructionBuilder setConstMthdCd(String constMthdCd){
this.constMthdCd = constMthdCd;
return this;
}
public ApiConstructionBuilder setRoofBaseCd(String roofBaseCd){
this.roofBaseCd = roofBaseCd;
return this;
}
public ApiConstructionBuilder setIlluminationTp(String illuminationTp){
this.illuminationTp = illuminationTp;
return this;
}
public ApiConstructionBuilder setInstHt(String instHt){
this.instHt = instHt;
return this;
}
public ApiConstructionBuilder setStdWindSpeed(String stdWindSpeed){
this.stdWindSpeed = stdWindSpeed;
return this;
}
public ApiConstructionBuilder setStdSnowLd(String stdSnowLd){
this.stdSnowLd = stdSnowLd;
return this;
}
public ApiConstructionBuilder setInclCd(String inclCd){
this.inclCd = inclCd;
return this;
}
public ApiConstructionBuilder setRaftBaseCd(String raftBaseCd){
this.raftBaseCd = raftBaseCd;
return this;
}
public ApiConstructionBuilder setRoofPitch(Integer roofPitch){
this.roofPitch = roofPitch;
return this;
}
public ApiConstructionBuilder (String moduleTpCd, String roofMatlCd, String trestleMkrCd, String constMthdCd, String roofBaseCd, String illuminationTp,
String instHt, String stdWindSpeed, String stdSnowLd, String inclCd, String raftBaseCd, Integer roofPitch) {
this.moduleTpCd = moduleTpCd;
this.roofMatlCd = roofMatlCd;
this.trestleMkrCd = trestleMkrCd;
this.constMthdCd = constMthdCd;
this.roofBaseCd = roofBaseCd;
this.illuminationTp = illuminationTp;
this.instHt = instHt;
this.stdWindSpeed = stdWindSpeed;
this.stdSnowLd = stdSnowLd;
this.inclCd = inclCd;
this.raftBaseCd = raftBaseCd;
this.roofPitch = roofPitch;
}
public ApiConstructionBuilder build(){
return new ApiConstructionBuilder(moduleTpCd, roofMatlCd, trestleMkrCd, constMthdCd, roofBaseCd, illuminationTp,
instHt, stdWindSpeed, stdSnowLd, inclCd, raftBaseCd, roofPitch);
}
}

View File

@ -1,74 +0,0 @@
package com.interplug.qcast.biz.master;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
@Schema(description = "Api 가대 목록 조회 요청 객체 빌더")
public class ApiTrestleBuilder {
@Schema(description = "모듈타입코드")
private String moduleTpCd;
@Schema(description = "지붕재코드")
private String roofMatlCd;
@Schema(description = "서까래기초코드")
private String raftBaseCd;
@Schema(description = "가대메이커코드")
private String trestleMkrCd;
@Schema(description = "공법코드")
private String constMthdCd;
@Schema(description = "지붕기초코드")
private String roofBaseCd;
public ApiTrestleBuilder setModuleTpCd(String moduleTpCd){
this.moduleTpCd = moduleTpCd;
return this;
}
public ApiTrestleBuilder setRoofMatlCdCd(String roofMatlCd){
this.roofMatlCd = roofMatlCd;
return this;
}
public ApiTrestleBuilder setRaftBaseCd(String raftBaseCd){
this.raftBaseCd = raftBaseCd;
return this;
}
public ApiTrestleBuilder setTrestleMkrCd(String trestleMkrCd){
this.trestleMkrCd = trestleMkrCd;
return this;
}
public ApiTrestleBuilder setConstMthdCd(String constMthdCd){
this.constMthdCd = constMthdCd;
return this;
}
public ApiTrestleBuilder setRoofBaseCd(String roofBaseCd){
this.roofBaseCd = roofBaseCd;
return this;
}
public ApiTrestleBuilder (String moduleTpCd, String roofMatlCd, String raftBaseCd, String trestleMkrCd, String constMthdCd, String roofBaseCd) {
this.moduleTpCd = moduleTpCd;
this.roofMatlCd = roofMatlCd;
this.raftBaseCd = raftBaseCd;
this.trestleMkrCd = trestleMkrCd;
this.constMthdCd = constMthdCd;
this.roofBaseCd = roofBaseCd;
}
public ApiTrestleBuilder build(){
return new ApiTrestleBuilder(moduleTpCd, roofMatlCd, raftBaseCd, trestleMkrCd, constMthdCd, roofBaseCd);
}
}

View File

@ -1,52 +0,0 @@
package com.interplug.qcast.biz.master;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
@Builder
@Schema(description = "Api 가대 상세 조회 요청 객체 빌더")
public class ApiTrestleDetailBuilder {
@Schema(description = "모듈타입코드")
private String moduleTpCd;
@Schema(description = "지붕재코드")
private String roofMatlCd;
@Schema(description = "가대메이커코드")
private String trestleMkrCd;
@Schema(description = "공법코드")
private String constMthdCd;
@Schema(description = "지붕기초코드")
private String roofBaseCd;
@Schema(description = "면조도")
private String illuminationTp;
@Schema(description = "설치높이")
private String instHt;
@Schema(description = "풍속")
private String stdWindSpeed;
@Schema(description = "적설량")
private String stdSnowLd;
@Schema(description = "경사도코드")
private String inclCd;
@Schema(description = "시공법")
private String constTp;
@Schema(description = "혼합모듈번호")
private Integer mixMatlNo;
@Schema(description = "하제(망둥어)피치")
private Integer roofPitch;
}

View File

@ -1,274 +0,0 @@
package com.interplug.qcast.biz.master;
import com.interplug.qcast.biz.master.dto.*;
import com.interplug.qcast.biz.master.dto.construction.ApiConstructionResponse;
import com.interplug.qcast.biz.master.dto.moduletype.ApiModuleTpResponse;
import com.interplug.qcast.biz.master.dto.pcs.ApiPcsInfoRequest;
import com.interplug.qcast.biz.master.dto.pcs.autorecommend.ApiPcsAutoRecommendResponse;
import com.interplug.qcast.biz.master.dto.pcs.connoption.ApiPcsConnOptionRequest;
import com.interplug.qcast.biz.master.dto.pcs.connoption.ApiPcsConnOptionResponse;
import com.interplug.qcast.biz.master.dto.pcs.maker.ApiPcsMakerResponse;
import com.interplug.qcast.biz.master.dto.pcs.menualconf.ApiPcsMenualConfRequest;
import com.interplug.qcast.biz.master.dto.pcs.series.ApiPcsSeriesItemRequest;
import com.interplug.qcast.biz.master.dto.pcs.series.ApiPcsSeriesItemResponse;
import com.interplug.qcast.biz.master.dto.pcs.voltagestepup.ApiPcsVoltageStepUpResponse;
import com.interplug.qcast.biz.master.dto.quotation.ApiQuotationItemRequest;
import com.interplug.qcast.biz.master.dto.quotation.ApiQuotationItemResponse;
import com.interplug.qcast.biz.master.dto.roofmaterial.ApiRoofMaterialResponse;
import com.interplug.qcast.biz.master.dto.trestle.ApiTrestleResponse;
import com.interplug.qcast.biz.master.dto.trestle.detail.ApiTrestleDetailRequest;
import com.interplug.qcast.biz.master.dto.trestle.detail.ApiTrestleDetailResponse;
import com.interplug.qcast.config.Exception.ErrorCode;
import com.interplug.qcast.config.Exception.QcastException;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import java.util.ArrayList;
import java.util.List;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/api/v1/master")
@RequiredArgsConstructor
@Tag(name = "MasterController", description = "Master API")
public class MasterController {
private final MasterService masterService;
private final QuotationService quotationService;
@Operation(description = "지붕재 목록을 조회한다.")
@GetMapping("/getRoofMaterialList")
public ApiResponse<List<ApiRoofMaterialResponse>> getRoofMaterialList() {
return masterService.getRoofMaterialList();
}
@Operation(description = "모듈 타입별 아이템 목록을 조회한다.")
@GetMapping("/getModuleTypeItemList")
public ApiResponse<List<ApiModuleTpResponse>> getModuleTypeItemList(
@Parameter(description = "지붕재 코드 목록") @RequestParam("arrRoofMatlCd")
List<String> roofMaterialCd)
throws QcastException {
if (roofMaterialCd == null
|| roofMaterialCd.isEmpty()
|| roofMaterialCd.size() > 4
|| roofMaterialCd.stream().anyMatch(s -> s == null || s.trim().isEmpty())) {
throw new QcastException(ErrorCode.INVALID_INPUT_VALUE);
}
return masterService.getModuleTypeItemList(roofMaterialCd);
}
@Operation(description = "가대 목록 조회한다.")
@GetMapping("/getTrestleList")
public ApiResponse<List<ApiTrestleResponse>> getTrestleList(
@Parameter(description = "모듈타입코드") @RequestParam(required = false) String moduleTpCd,
@Parameter(description = "지붕재코드") @RequestParam(required = false) String roofMatlCd,
@Parameter(description = "서까래기초코드") @RequestParam(required = false) String raftBaseCd,
@Parameter(description = "가대메이커코드") @RequestParam(required = false) String trestleMkrCd,
@Parameter(description = "공법코드") @RequestParam(required = false) String constMthdCd,
@Parameter(description = "지붕기초코드") @RequestParam(required = false) String roofBaseCd) {
ApiTrestleBuilder apiTrestleInfoBuilder =
new ApiTrestleBuilder(
moduleTpCd, roofMatlCd, raftBaseCd, trestleMkrCd, constMthdCd, roofBaseCd);
ApiTrestleBuilder atb =
apiTrestleInfoBuilder
.setModuleTpCd(moduleTpCd)
.setRoofMatlCdCd(roofMatlCd)
.setRaftBaseCd(raftBaseCd)
.setTrestleMkrCd(trestleMkrCd)
.setConstMthdCd(constMthdCd)
.setRoofBaseCd(roofBaseCd)
.build();
return masterService.getTrestleList(
atb.getModuleTpCd(),
atb.getRoofMatlCd(),
atb.getRaftBaseCd(),
atb.getTrestleMkrCd(),
atb.getConstMthdCd(),
atb.getRoofBaseCd());
}
@Operation(description = "시공법 목록 조회한다.")
@GetMapping("/getConstructionList")
public ApiResponse<List<ApiConstructionResponse>> getConstructionList(
@Parameter(description = "모듈타입코드") @RequestParam String moduleTpCd,
@Parameter(description = "지붕재코드") @RequestParam String roofMatlCd,
@Parameter(description = "가대메이커코드") @RequestParam String trestleMkrCd,
@Parameter(description = "공법코드") @RequestParam String constMthdCd,
@Parameter(description = "지붕기초코드") @RequestParam String roofBaseCd,
@Parameter(description = "면조도") @RequestParam String illuminationTp,
@Parameter(description = "설치높이") @RequestParam String instHt,
@Parameter(description = "풍속") @RequestParam String stdWindSpeed,
@Parameter(description = "적설량") @RequestParam String stdSnowLd,
@Parameter(description = "경사도코드") @RequestParam String inclCd,
@Parameter(description = "서까래기초코드") @RequestParam(required = false) String raftBaseCd,
@Parameter(description = "하제(망둥어)피치") @RequestParam(required = false) Integer roofPitch)
throws QcastException {
if (moduleTpCd == null
|| moduleTpCd.trim().isEmpty()
|| roofMatlCd == null
|| roofMatlCd.trim().isEmpty()
|| trestleMkrCd == null
|| trestleMkrCd.trim().isEmpty()
|| constMthdCd == null
|| constMthdCd.trim().isEmpty()
|| roofBaseCd == null
|| roofBaseCd.trim().isEmpty()
|| illuminationTp == null
|| illuminationTp.trim().isEmpty()
|| instHt == null
|| instHt.trim().isEmpty()
|| stdWindSpeed == null
|| stdWindSpeed.trim().isEmpty()
|| stdSnowLd == null
|| stdSnowLd.trim().isEmpty()
|| inclCd == null
|| inclCd.trim().isEmpty()) {
throw new QcastException(ErrorCode.INVALID_INPUT_VALUE);
}
ApiConstructionBuilder apiConstructionBuilder =
new ApiConstructionBuilder(
moduleTpCd,
roofMatlCd,
trestleMkrCd,
constMthdCd,
roofBaseCd,
illuminationTp,
instHt,
stdWindSpeed,
stdSnowLd,
inclCd,
raftBaseCd,
roofPitch);
ApiConstructionBuilder acb =
apiConstructionBuilder
.setModuleTpCd(moduleTpCd)
.setRoofMatlCd(roofMatlCd)
.setTrestleMkrCd(trestleMkrCd)
.setConstMthdCd(constMthdCd)
.setRoofBaseCd(roofBaseCd)
.setIlluminationTp(illuminationTp)
.setInstHt(instHt)
.setStdWindSpeed(stdWindSpeed)
.setStdSnowLd(stdSnowLd)
.setInclCd(inclCd)
.setRaftBaseCd(raftBaseCd)
.setRoofPitch(roofPitch)
.build();
return masterService.getConstructionList(
acb.getModuleTpCd(),
acb.getRoofMatlCd(),
acb.getTrestleMkrCd(),
acb.getConstMthdCd(),
acb.getRoofBaseCd(),
acb.getIlluminationTp(),
acb.getInstHt(),
acb.getStdWindSpeed(),
acb.getStdSnowLd(),
acb.getInclCd(),
acb.getRaftBaseCd(),
acb.getRoofPitch());
}
@Operation(description = "가대 상세 조회한다.")
@PostMapping("/getTrestleDetailList")
public ArrayList<ApiResponse<ApiTrestleDetailResponse>> getTrestleDetailList(
@RequestBody List<ApiTrestleDetailRequest> reqList) {
ArrayList<ApiResponse<ApiTrestleDetailResponse>> results = new ArrayList<>();
for (ApiTrestleDetailRequest req : reqList) {
ApiResponse<ApiTrestleDetailResponse> response =
masterService.getTrestleDetailList(
req.getModuleTpCd(),
req.getRoofMatlCd(),
req.getTrestleMkrCd(),
req.getConstMthdCd(),
req.getRoofBaseCd(),
req.getIlluminationTp(),
req.getInstHt(),
req.getStdWindSpeed(),
req.getStdSnowLd(),
req.getInclCd(),
req.getConstTp(),
req.getMixMatlNo(),
req.getRoofPitch(),
req.getWorkingWidth());
ApiTrestleDetailResponse data = response.getData();
if (data != null) {
data.setRoofIndex(req.getRoofIndex()); // roofIndex 추가하기 위함
}
ApiResultResponse resultCode = response.getResult();
ApiResponse<ApiTrestleDetailResponse> resultResponse = new ApiResponse<>();
resultResponse.setData(data);
resultResponse.setResult(resultCode);
results.add(resultResponse);
}
return results;
}
@Operation(description = "PCS 메이커, 시리즈 조회한다.")
@GetMapping("/pcsMakerList")
public ApiResponse<List<ApiPcsMakerResponse>> getPcsMakerList(
@Parameter(description = "PCS 메이커 코드") @RequestParam(required = false) String pcsMkrCd,
@Parameter(description = "혼합모듈번호") @RequestParam(required = false) String mixMatlNo) {
return masterService.getPcsMakerList(pcsMkrCd, mixMatlNo);
}
@Operation(description = "PCS 시리즈 아이템 목록을 조회한다.")
@PostMapping("/getPcsSeriesItemList")
public ApiResponse<List<ApiPcsSeriesItemResponse>> getPcsSeriesItemList(
@RequestBody ApiPcsSeriesItemRequest pcsSeriesItemListRequest) {
return masterService.getPcsSeriesItemList(pcsSeriesItemListRequest);
}
@Operation(description = "시리즈 중 자동으로 추천 PCS 정보를 조회한다.")
@PostMapping("/getPcsAutoRecommendList")
public ApiResponse<ApiPcsAutoRecommendResponse> getPcsAutoRecommendList(
@RequestBody ApiPcsInfoRequest autoRecommendRequest) {
return masterService.getPcsAutoRecommendList(autoRecommendRequest);
}
@Operation(description = "배치된 모듈을 선택한 PCS로 회로 구성 가능 여부 체크한다.")
@PostMapping("/getPcsVoltageChk")
public ApiResultResponse getPcsVoltageChk(@RequestBody ApiPcsInfoRequest pcsVoltageChkRequest) {
return masterService.getPcsVoltageChk(pcsVoltageChkRequest).getResult();
}
@Operation(description = "PCS 승압설정 정보를 조회한다.")
@PostMapping("/getPcsVoltageStepUpList")
public ApiResponse<ApiPcsVoltageStepUpResponse> getPcsVoltageStepUpList(
@RequestBody ApiPcsInfoRequest pcsVoltageStepUpRequest) {
return masterService.getPcsVoltageStepUpList(pcsVoltageStepUpRequest);
}
@Operation(description = "PCS 수동회로 확정 체크한다.")
@PostMapping("/getPcsMenualConfChk")
public ApiResultResponse getPcsMenualConfChk(
@RequestBody ApiPcsMenualConfRequest pcsMenualConfChkRequest) {
return masterService.getPcsMenualConfChk(pcsMenualConfChkRequest).getResult();
}
@Operation(description = "PCS 접속함 및 옵션 목록을 조회한다.")
@PostMapping("/getPcsConnOptionItemList")
public ApiResponse<ApiPcsConnOptionResponse> getPcsConnOptionItemList(
@RequestBody ApiPcsConnOptionRequest pcsConnOptionRequest) {
return masterService.getPcsConnOptionItemList(pcsConnOptionRequest);
}
/** remote api group : quotation */
@Operation(description = "견적서 아이템을 조회한다.")
@PostMapping("/getQuotationItem")
public ApiResponse<List<ApiQuotationItemResponse>> getQuotationItem(
@RequestBody ApiQuotationItemRequest quotationItemRequest) {
return quotationService.getQuotationItem(quotationItemRequest);
}
}

View File

@ -1,116 +0,0 @@
package com.interplug.qcast.biz.master;
import com.fasterxml.jackson.databind.JsonNode;
import com.interplug.qcast.biz.master.dto.*;
import com.interplug.qcast.biz.master.dto.construction.ApiConstructionResponse;
import com.interplug.qcast.biz.master.dto.moduletype.ApiModuleTpResponse;
import com.interplug.qcast.biz.master.dto.pcs.ApiPcsInfoRequest;
import com.interplug.qcast.biz.master.dto.pcs.autorecommend.ApiPcsAutoRecommendResponse;
import com.interplug.qcast.biz.master.dto.pcs.connoption.ApiPcsConnOptionRequest;
import com.interplug.qcast.biz.master.dto.pcs.connoption.ApiPcsConnOptionResponse;
import com.interplug.qcast.biz.master.dto.pcs.maker.ApiPcsMakerResponse;
import com.interplug.qcast.biz.master.dto.pcs.menualconf.ApiPcsMenualConfRequest;
import com.interplug.qcast.biz.master.dto.pcs.series.ApiPcsSeriesItemRequest;
import com.interplug.qcast.biz.master.dto.pcs.series.ApiPcsSeriesItemResponse;
import com.interplug.qcast.biz.master.dto.pcs.voltagestepup.ApiPcsVoltageStepUpResponse;
import com.interplug.qcast.biz.master.dto.roofmaterial.ApiRoofMaterialResponse;
import com.interplug.qcast.biz.master.dto.trestle.ApiTrestleResponse;
import com.interplug.qcast.biz.master.dto.trestle.detail.ApiTrestleDetailResponse;
import java.util.List;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
// @FeignClient(name = "master", url = "${feign.master.url}")
@FeignClient(name = "master", url = "${qsp.url}/api/master")
public interface MasterService {
// 지붕재 목록 조회
@GetMapping("/roofMaterialList")
public ApiResponse<List<ApiRoofMaterialResponse>> getRoofMaterialList();
// 모듈 타입별 아이템 목록 조회
@GetMapping("/moduleTypeItemList")
public ApiResponse<List<ApiModuleTpResponse>> getModuleTypeItemList(
@RequestParam("arrRoofMatlCd") List<String> roofMaterialCd);
// 가대 목록 조회
@GetMapping("/trestle")
public ApiResponse<List<ApiTrestleResponse>> getTrestleList(
@RequestParam(required = false) String moduleTpCd,
@RequestParam(required = false) String roofMatlCd,
@RequestParam(required = false) String raftBaseCd,
@RequestParam(required = false) String trestleMkrCd,
@RequestParam(required = false) String constMthdCd,
@RequestParam(required = false) String roofBaseCd);
// 시공법 목록 조회
@GetMapping("/construction")
public ApiResponse<List<ApiConstructionResponse>> getConstructionList(
@RequestParam String moduleTpCd,
@RequestParam String roofMatlCd,
@RequestParam String trestleMkrCd,
@RequestParam String constMthdCd,
@RequestParam String roofBaseCd,
@RequestParam String illuminationTp,
@RequestParam String instHt,
@RequestParam String stdWindSpeed,
@RequestParam String stdSnowLd,
@RequestParam String inclCd,
@RequestParam(required = false) String raftBaseCd,
@RequestParam(required = false) Integer roofPitch);
// 가대 상세 조회
@GetMapping(value = "/trestle/detail", consumes = "application/json")
public ApiResponse<ApiTrestleDetailResponse> getTrestleDetailList(
@RequestParam String moduleTpCd,
@RequestParam String roofMatlCd,
@RequestParam String trestleMkrCd,
@RequestParam String constMthdCd,
@RequestParam String roofBaseCd,
@RequestParam String illuminationTp,
@RequestParam String instHt,
@RequestParam String stdWindSpeed,
@RequestParam String stdSnowLd,
@RequestParam String inclCd,
@RequestParam String constTp,
@RequestParam(required = false) Integer mixMatlNo,
@RequestParam(required = false) Integer roofPitch,
@RequestParam(required = false) String workingWidth);
// PCS Maker, 시리즈 목록 조회
@GetMapping("/pcsMakerList")
public ApiResponse<List<ApiPcsMakerResponse>> getPcsMakerList(
@RequestParam(required = false) String pcsMkrCd,
@RequestParam(required = false) String mixMatlNo);
// PCS 시리즈 아이템 목록 조회
@PostMapping("/pcsSeriesItemList")
public ApiResponse<List<ApiPcsSeriesItemResponse>> getPcsSeriesItemList(
@RequestBody ApiPcsSeriesItemRequest req);
// 시리즈 자동으로 추천 PCS 정보 조회
@PostMapping("/pcsAutoRecommendList")
public ApiResponse<ApiPcsAutoRecommendResponse> getPcsAutoRecommendList(
@RequestBody ApiPcsInfoRequest req);
// 배치된 모듈을 선택한 PCS로 회로 구성 가능 여부 체크
@PostMapping("/pcsVoltageChk")
public ApiResponse<JsonNode> getPcsVoltageChk(@RequestBody ApiPcsInfoRequest req);
// PCS 승압설정 정보 조회
@PostMapping("/pcsVoltageStepUpList")
public ApiResponse<ApiPcsVoltageStepUpResponse> getPcsVoltageStepUpList(
@RequestBody ApiPcsInfoRequest req);
// PCS 수동회로 확정 체크
@PostMapping("/pcsMenualConfChk")
public ApiResponse<JsonNode> getPcsMenualConfChk(@RequestBody ApiPcsMenualConfRequest req);
// PCS 접속함 옵션 목록 조회
@PostMapping("/pcsConnOptionItemList")
public ApiResponse<ApiPcsConnOptionResponse> getPcsConnOptionItemList(
@RequestBody ApiPcsConnOptionRequest req);
}

View File

@ -1,18 +0,0 @@
package com.interplug.qcast.biz.master;
import com.interplug.qcast.biz.master.dto.ApiResponse;
import com.interplug.qcast.biz.master.dto.quotation.ApiQuotationItemRequest;
import com.interplug.qcast.biz.master.dto.quotation.ApiQuotationItemResponse;
import java.util.List;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
@FeignClient(name = "quotation", url = "${qsp.url}/api/quotation")
public interface QuotationService {
// 견적서 아이템 조회
@PostMapping("/item")
public ApiResponse<List<ApiQuotationItemResponse>> getQuotationItem(
@RequestBody ApiQuotationItemRequest req);
}

View File

@ -1,20 +0,0 @@
package com.interplug.qcast.biz.master.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
@Schema(description = "결과 데이터")
public class ApiResponse<T> {
@Schema(description = "목록 데이터")
private T data;
@Schema(description = "목록 데이터2")
private T data2;
@Schema(description = "API 결과 데이터")
private ApiResultResponse result;
}

View File

@ -1,22 +0,0 @@
package com.interplug.qcast.biz.master.dto;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
@Schema(description = "API 결과 데이터")
@JsonIgnoreProperties(ignoreUnknown = true)
public class ApiResultResponse {
@Schema(description = "결과 코드")
private Integer code;
private String resultCode;
@Schema(description = "결과 메시지")
private String message;
private String resultMsg;
}

View File

@ -1,50 +0,0 @@
package com.interplug.qcast.biz.master.dto.construction;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
@Schema(description = "Api 시공법 목록 조회 요청 객체")
public class ApiConstructionRequest {
@Schema(description = "Language코드")
private String langCd;
@Schema(description = "모듈타입코드")
private String moduleTpCd;
@Schema(description = "지붕재코드")
private String roofMatlCd;
@Schema(description = "가대메이커코드")
private String trestleMkrCd;
@Schema(description = "공법코드")
private String constMthdCd;
@Schema(description = "지붕기초코드")
private String roofBaseCd;
@Schema(description = "면조도")
private String illuminationTp;
@Schema(description = "설치높이")
private String instHt;
@Schema(description = "풍속")
private String stdWindSpeed;
@Schema(description = "적설량")
private String stdSnowLd;
@Schema(description = "경사도코드")
private String inclCd;
@Schema(description = "서까래기초코드")
private String raftBaseCd;
@Schema(description = "하제(망둥어)피치")
private Integer roofPitch;
}

View File

@ -1,35 +0,0 @@
package com.interplug.qcast.biz.master.dto.construction;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
@Schema(description = "Api 시공법 목록 조회 응답 객체")
public class ApiConstructionResponse {
@Schema(description = "시공법")
private String constTp;
@Schema(description = "시공법명")
private String constTpNm;
@Schema(description = "시공법명(일본)")
private String constTpJp;
@Schema(description = "시공법가능여부")
private String constPossYn;
@Schema(description = "치조가능여부")
private String plvrYn;
@Schema(description = "처마커버설치가능여부")
private String cvrYn;
@Schema(description = "처마커버설치최대단수")
private Integer cvrLmtRow;
@Schema(description = "낙설방지금구설치가능여부")
private String snowGdPossYn;
}

View File

@ -1,43 +0,0 @@
package com.interplug.qcast.biz.master.dto.moduletype;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class ApiModuleTpItemResponse {
@Schema(description = "제품ID")
private String itemId;
@Schema(description = "제품명")
private String itemNm;
@Schema(description = "제품명(Basic Material)")
private String goodsNo;
@Schema(description = "제품타입(A1, A2, A1A2, B, B1...)")
private String itemTp;
@Schema(description = "모듈타입코드")
private String moduleTpCd;
@Schema(description = "색상")
private String color;
@Schema(description = "장경")
private String longAxis;
@Schema(description = "단경")
private String shortAxis;
@Schema(description = "두께")
private String thickness;
@Schema(description = "제품용량")
private String wpOut;
@Schema(description = "혼합모듈번호")
private String mixMatlNo;
}

View File

@ -1,17 +0,0 @@
package com.interplug.qcast.biz.master.dto.moduletype;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
@Schema(description = "제품 데이터 요청 객체")
public class ApiModuleTpRequest {
@Schema(description = "Language코드")
private String langCd;
@Schema(description = "지붕재코드")
private String roofMatlCd;
}

View File

@ -1,33 +0,0 @@
package com.interplug.qcast.biz.master.dto.moduletype;
import io.swagger.v3.oas.annotations.media.Schema;
import java.util.List;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
@Schema(description = "제품 데이터 응답 객체")
public class ApiModuleTpResponse {
@Schema(description = "제품ID")
private String itemId;
@Schema(description = "제품명")
private String itemNm;
@Schema(description = "제품명(Basic Material)")
private String goodsNo;
@Schema(description = "제품타입(A1, A2, A1A2, B, B1...)")
private String itemTp;
@Schema(description = "혼합모듈번호")
private String mixMatlNo;
@Schema(description = "혼합모듈여부")
private String mixItemTpYn;
@Schema(description = "제품 상세 데이터")
private List<ApiModuleTpItemResponse> itemList;
}

View File

@ -1,29 +0,0 @@
package com.interplug.qcast.biz.master.dto.pcs;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
@Schema(description = "PCS 연결함목록 응답 객체")
public class ApiPcsConnResponse {
@Schema(description = "제품ID", maxLength = 20)
private String itemId;
@Schema(description = "제품명", maxLength = 100)
private String itemNm;
@Schema(description = "제품명(Basic Material)", maxLength = 40)
private String goodsNo;
@Schema(description = "병렬수(회로수)", maxLength = 10)
private Integer connMaxParalCnt;
@Schema(description = "최대전력", maxLength = 10)
private Integer connAllowCur;
@Schema(description = "승압병렬수", maxLength = 10)
private Integer vStuParalCnt;
}

View File

@ -1,36 +0,0 @@
package com.interplug.qcast.biz.master.dto.pcs;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotNull;
import java.util.List;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
@Schema(description = "PCS 정보 조회 요청 객체")
public class ApiPcsInfoRequest {
@Schema(description = "Max접속(과적)여부")
@NotNull
public String maxConnYn;
@Schema(description = "동일회로도여부")
@NotNull
public String smpCirYn;
@Schema(description = "한랭지여부")
@NotNull
public String coldZoneYn;
@Schema(description = "사용된 모듈아이템 List")
@NotNull
public List<ApiPcsModuleItemRequest> useModuleItemList;
@Schema(description = "지붕면별 목록")
@NotNull
public List<ApiPcsRoofSurfaceRequest> roofSurfaceList;
@Schema(description = "PCS아이템ID")
@NotNull
public List<ApiPcsItemRequest> pcsItemList;
}

View File

@ -1,26 +0,0 @@
package com.interplug.qcast.biz.master.dto.pcs;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotNull;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
@Schema(description = "PCS 아이템 요청 객체")
public class ApiPcsItemRequest {
@Schema(description = "PCS제품ID", maxLength = 20)
@NotNull
private String itemId;
@Schema(description = "PCS메이커코드", maxLength = 10)
@NotNull
private String pcsMkrCd;
@Schema(description = "PCS시리즈코드", maxLength = 10)
@NotNull
private String pcsSerCd;
@Schema(description = "선택한직렬매수(적용직렬매수)", maxLength = 10)
private Integer applySerQty;
}

Some files were not shown because too many files have changed in this diff Show More