From 4f4fad22c68eb9da055f0842e8a2f32ec37a29b1 Mon Sep 17 00:00:00 2001 From: Daseul Kim Date: Tue, 14 Jan 2025 16:09:56 +0900 Subject: [PATCH 01/21] =?UTF-8?q?feat:=20PCS=20=EC=8A=B9=EC=95=95=EC=84=A4?= =?UTF-8?q?=EC=A0=95=20=EC=A0=95=EB=B3=B4=20=EC=A1=B0=ED=9A=8C=20api=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../qcast/biz/master/MasterController.java | 14 ++++++-- .../qcast/biz/master/MasterService.java | 10 ++++-- ...endRequest.java => ApiPcsInfoRequest.java} | 11 +++---- ...temRequest.java => ApiPcsItemRequest.java} | 9 +++-- ...st.java => ApiPcsModuleItemIdRequest.java} | 4 +-- ...est.java => ApiPcsRoofSurfaceRequest.java} | 8 ++--- .../ApiPcsVoltageStepUpConnResponse.java | 29 ++++++++++++++++ .../ApiPcsVoltageStepUpOptionResponse.java | 20 +++++++++++ .../ApiPcsVoltageStepUpPcsItemResponse.java | 33 +++++++++++++++++++ .../ApiPcsVoltageStepUpResponse.java | 18 ++++++++++ ...oltageStepUpRoofSurfaceModuleResponse.java | 17 ++++++++++ ...piPcsVoltageStepUpRoofSurfaceResponse.java | 24 ++++++++++++++ .../ApiPcsVoltageStepUpSerQtyResponse.java | 27 +++++++++++++++ 13 files changed, 204 insertions(+), 20 deletions(-) rename src/main/java/com/interplug/qcast/biz/master/dto/pcs/{autorecommend/ApiPcsAutoRecommendRequest.java => ApiPcsInfoRequest.java} (63%) rename src/main/java/com/interplug/qcast/biz/master/dto/pcs/{autorecommend/ApiPcsAutoRecommendPcsItemRequest.java => ApiPcsItemRequest.java} (64%) rename src/main/java/com/interplug/qcast/biz/master/dto/pcs/{autorecommend/ApiPcsAutoRecommendModuleItemIdRequest.java => ApiPcsModuleItemIdRequest.java} (72%) rename src/main/java/com/interplug/qcast/biz/master/dto/pcs/{autorecommend/ApiPcsAutoRecommendRoofSurfaceRequest.java => ApiPcsRoofSurfaceRequest.java} (66%) create mode 100644 src/main/java/com/interplug/qcast/biz/master/dto/pcs/voltagestepup/ApiPcsVoltageStepUpConnResponse.java create mode 100644 src/main/java/com/interplug/qcast/biz/master/dto/pcs/voltagestepup/ApiPcsVoltageStepUpOptionResponse.java create mode 100644 src/main/java/com/interplug/qcast/biz/master/dto/pcs/voltagestepup/ApiPcsVoltageStepUpPcsItemResponse.java create mode 100644 src/main/java/com/interplug/qcast/biz/master/dto/pcs/voltagestepup/ApiPcsVoltageStepUpResponse.java create mode 100644 src/main/java/com/interplug/qcast/biz/master/dto/pcs/voltagestepup/ApiPcsVoltageStepUpRoofSurfaceModuleResponse.java create mode 100644 src/main/java/com/interplug/qcast/biz/master/dto/pcs/voltagestepup/ApiPcsVoltageStepUpRoofSurfaceResponse.java create mode 100644 src/main/java/com/interplug/qcast/biz/master/dto/pcs/voltagestepup/ApiPcsVoltageStepUpSerQtyResponse.java diff --git a/src/main/java/com/interplug/qcast/biz/master/MasterController.java b/src/main/java/com/interplug/qcast/biz/master/MasterController.java index f7259c98..5a35c318 100644 --- a/src/main/java/com/interplug/qcast/biz/master/MasterController.java +++ b/src/main/java/com/interplug/qcast/biz/master/MasterController.java @@ -3,11 +3,12 @@ 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.autorecommend.ApiPcsAutoRecommendRequest; +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.maker.ApiPcsMakerResponse; 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; @@ -224,13 +225,20 @@ public class MasterController { return masterService.getPcsSeriesItemList(pcsSeriesItemListRequest); } - @Operation(description = "시리즈 중 자동으로 추천 PCS 정보 조회한다.") + @Operation(description = "시리즈 중 자동으로 추천 PCS 정보를 조회한다.") @PostMapping("/getPcsAutoRecommendList") public ApiResponse getPcsAutoRecommendList( - @RequestBody ApiPcsAutoRecommendRequest autoRecommendRequest) { + @RequestBody ApiPcsInfoRequest autoRecommendRequest) { return masterService.getPcsAutoRecommendList(autoRecommendRequest); } + @Operation(description = "PCS 승압설정 정보를 조회한다.") + @PostMapping("/getPcsVoltageStepUpList") + public ApiResponse getPcsVoltageStepUpList( + @RequestBody ApiPcsInfoRequest pcsVoltageStepUpRequest) { + return masterService.getPcsVoltageStepUpList(pcsVoltageStepUpRequest); + } + /** remote api group : quotation */ @Operation(description = "견적서 아이템을 조회한다.") @PostMapping("/getQuotationItem") diff --git a/src/main/java/com/interplug/qcast/biz/master/MasterService.java b/src/main/java/com/interplug/qcast/biz/master/MasterService.java index 8b084618..b7a8222c 100644 --- a/src/main/java/com/interplug/qcast/biz/master/MasterService.java +++ b/src/main/java/com/interplug/qcast/biz/master/MasterService.java @@ -3,11 +3,12 @@ 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.autorecommend.ApiPcsAutoRecommendRequest; +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.maker.ApiPcsMakerResponse; 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; @@ -88,5 +89,10 @@ public interface MasterService { // 시리즈 중 자동으로 추천 PCS 정보 조회 @PostMapping("/pcsAutoRecommendList") public ApiResponse getPcsAutoRecommendList( - @RequestBody ApiPcsAutoRecommendRequest req); + @RequestBody ApiPcsInfoRequest req); + + // PCS 승압설정 정보 조회 + @PostMapping("/pcsVoltageStepUpList") + public ApiResponse getPcsVoltageStepUpList( + @RequestBody ApiPcsInfoRequest req); } diff --git a/src/main/java/com/interplug/qcast/biz/master/dto/pcs/autorecommend/ApiPcsAutoRecommendRequest.java b/src/main/java/com/interplug/qcast/biz/master/dto/pcs/ApiPcsInfoRequest.java similarity index 63% rename from src/main/java/com/interplug/qcast/biz/master/dto/pcs/autorecommend/ApiPcsAutoRecommendRequest.java rename to src/main/java/com/interplug/qcast/biz/master/dto/pcs/ApiPcsInfoRequest.java index 33cb58ec..93d003f4 100644 --- a/src/main/java/com/interplug/qcast/biz/master/dto/pcs/autorecommend/ApiPcsAutoRecommendRequest.java +++ b/src/main/java/com/interplug/qcast/biz/master/dto/pcs/ApiPcsInfoRequest.java @@ -1,6 +1,5 @@ -package com.interplug.qcast.biz.master.dto.pcs.autorecommend; +package com.interplug.qcast.biz.master.dto.pcs; -import com.interplug.qcast.biz.master.dto.pcs.ApiPcsModuleItemRequest; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotNull; import java.util.List; @@ -9,8 +8,8 @@ import lombok.Setter; @Getter @Setter -@Schema(description = "시리즈 중 자동으로 추천 PCS 정보 조회 요청 객체") -public class ApiPcsAutoRecommendRequest { +@Schema(description = "PCS 정보 조회 요청 객체") +public class ApiPcsInfoRequest { @Schema(description = "Max접속(과적)여부") @NotNull public String maxConnYn; @@ -29,9 +28,9 @@ public class ApiPcsAutoRecommendRequest { @Schema(description = "지붕면별 목록") @NotNull - public List roofSurfaceList; + public List roofSurfaceList; @Schema(description = "PCS아이템ID") @NotNull - public List pcsItemList; + public List pcsItemList; } diff --git a/src/main/java/com/interplug/qcast/biz/master/dto/pcs/autorecommend/ApiPcsAutoRecommendPcsItemRequest.java b/src/main/java/com/interplug/qcast/biz/master/dto/pcs/ApiPcsItemRequest.java similarity index 64% rename from src/main/java/com/interplug/qcast/biz/master/dto/pcs/autorecommend/ApiPcsAutoRecommendPcsItemRequest.java rename to src/main/java/com/interplug/qcast/biz/master/dto/pcs/ApiPcsItemRequest.java index 16d771cc..d75c57ca 100644 --- a/src/main/java/com/interplug/qcast/biz/master/dto/pcs/autorecommend/ApiPcsAutoRecommendPcsItemRequest.java +++ b/src/main/java/com/interplug/qcast/biz/master/dto/pcs/ApiPcsItemRequest.java @@ -1,4 +1,4 @@ -package com.interplug.qcast.biz.master.dto.pcs.autorecommend; +package com.interplug.qcast.biz.master.dto.pcs; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotNull; @@ -7,8 +7,8 @@ import lombok.Setter; @Getter @Setter -@Schema(description = "시리즈 중 자동으로 추천 PCS 정보 조회 PCS 아이템 요청 객체") -public class ApiPcsAutoRecommendPcsItemRequest { +@Schema(description = "PCS 아이템 요청 객체") +public class ApiPcsItemRequest { @Schema(description = "PCS제품ID", maxLength = 20) @NotNull private String itemId; @@ -20,4 +20,7 @@ public class ApiPcsAutoRecommendPcsItemRequest { @Schema(description = "PCS시리즈코드", maxLength = 10) @NotNull private String pcsSerCd; + + @Schema(description = "선택한직렬매수(적용직렬매수)", maxLength = 10) + private Integer applySerQty; } diff --git a/src/main/java/com/interplug/qcast/biz/master/dto/pcs/autorecommend/ApiPcsAutoRecommendModuleItemIdRequest.java b/src/main/java/com/interplug/qcast/biz/master/dto/pcs/ApiPcsModuleItemIdRequest.java similarity index 72% rename from src/main/java/com/interplug/qcast/biz/master/dto/pcs/autorecommend/ApiPcsAutoRecommendModuleItemIdRequest.java rename to src/main/java/com/interplug/qcast/biz/master/dto/pcs/ApiPcsModuleItemIdRequest.java index 0bfc50f3..036315e9 100644 --- a/src/main/java/com/interplug/qcast/biz/master/dto/pcs/autorecommend/ApiPcsAutoRecommendModuleItemIdRequest.java +++ b/src/main/java/com/interplug/qcast/biz/master/dto/pcs/ApiPcsModuleItemIdRequest.java @@ -1,4 +1,4 @@ -package com.interplug.qcast.biz.master.dto.pcs.autorecommend; +package com.interplug.qcast.biz.master.dto.pcs; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotNull; @@ -8,7 +8,7 @@ import lombok.Setter; @Getter @Setter @Schema(description = "PCS 모듈아이템 ID 요청 객체") -public class ApiPcsAutoRecommendModuleItemIdRequest { +public class ApiPcsModuleItemIdRequest { @Schema(description = "제품ID", maxLength = 20) @NotNull private String itemId; diff --git a/src/main/java/com/interplug/qcast/biz/master/dto/pcs/autorecommend/ApiPcsAutoRecommendRoofSurfaceRequest.java b/src/main/java/com/interplug/qcast/biz/master/dto/pcs/ApiPcsRoofSurfaceRequest.java similarity index 66% rename from src/main/java/com/interplug/qcast/biz/master/dto/pcs/autorecommend/ApiPcsAutoRecommendRoofSurfaceRequest.java rename to src/main/java/com/interplug/qcast/biz/master/dto/pcs/ApiPcsRoofSurfaceRequest.java index 7dc9e3a1..24e3f968 100644 --- a/src/main/java/com/interplug/qcast/biz/master/dto/pcs/autorecommend/ApiPcsAutoRecommendRoofSurfaceRequest.java +++ b/src/main/java/com/interplug/qcast/biz/master/dto/pcs/ApiPcsRoofSurfaceRequest.java @@ -1,4 +1,4 @@ -package com.interplug.qcast.biz.master.dto.pcs.autorecommend; +package com.interplug.qcast.biz.master.dto.pcs; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotNull; @@ -8,8 +8,8 @@ import lombok.Setter; @Getter @Setter -@Schema(description = "시리즈 중 자동으로 추천 PCS 정보 조회 지붕면 요청 객체") -public class ApiPcsAutoRecommendRoofSurfaceRequest { +@Schema(description = "PCS 아이템 지붕면 요청 객체") +public class ApiPcsRoofSurfaceRequest { @Schema(description = "지붕면ID") @NotNull private String roofSurfaceId; @@ -24,5 +24,5 @@ public class ApiPcsAutoRecommendRoofSurfaceRequest { @Schema(description = "모듈아이템 List(도면에 설치된 모듈)") @NotNull - private List moduleList; + private List moduleList; } diff --git a/src/main/java/com/interplug/qcast/biz/master/dto/pcs/voltagestepup/ApiPcsVoltageStepUpConnResponse.java b/src/main/java/com/interplug/qcast/biz/master/dto/pcs/voltagestepup/ApiPcsVoltageStepUpConnResponse.java new file mode 100644 index 00000000..6561961a --- /dev/null +++ b/src/main/java/com/interplug/qcast/biz/master/dto/pcs/voltagestepup/ApiPcsVoltageStepUpConnResponse.java @@ -0,0 +1,29 @@ +package com.interplug.qcast.biz.master.dto.pcs.voltagestepup; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +@Schema(description = "PCS 승압설정 정보 조회 연결함목록 응답 객체") +public class ApiPcsVoltageStepUpConnResponse { + + @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; +} diff --git a/src/main/java/com/interplug/qcast/biz/master/dto/pcs/voltagestepup/ApiPcsVoltageStepUpOptionResponse.java b/src/main/java/com/interplug/qcast/biz/master/dto/pcs/voltagestepup/ApiPcsVoltageStepUpOptionResponse.java new file mode 100644 index 00000000..876c98a6 --- /dev/null +++ b/src/main/java/com/interplug/qcast/biz/master/dto/pcs/voltagestepup/ApiPcsVoltageStepUpOptionResponse.java @@ -0,0 +1,20 @@ +package com.interplug.qcast.biz.master.dto.pcs.voltagestepup; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +@Schema(description = "PCS 승압설정 정보 조회 옵션목록(모니터선택) 응답 객체") +public class ApiPcsVoltageStepUpOptionResponse { + + @Schema(description = "PCS옵션코드", maxLength = 10) + private String pcsOptCd; + + @Schema(description = "PCS옵션코드명", maxLength = 100) + private String pcsOptNm; + + @Schema(description = "PCS옵션코드명(일본)", maxLength = 100) + private String pcsOptNmJp; +} diff --git a/src/main/java/com/interplug/qcast/biz/master/dto/pcs/voltagestepup/ApiPcsVoltageStepUpPcsItemResponse.java b/src/main/java/com/interplug/qcast/biz/master/dto/pcs/voltagestepup/ApiPcsVoltageStepUpPcsItemResponse.java new file mode 100644 index 00000000..693acb40 --- /dev/null +++ b/src/main/java/com/interplug/qcast/biz/master/dto/pcs/voltagestepup/ApiPcsVoltageStepUpPcsItemResponse.java @@ -0,0 +1,33 @@ +package com.interplug.qcast.biz.master.dto.pcs.voltagestepup; + +import io.swagger.v3.oas.annotations.media.Schema; +import java.util.List; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +@Schema(description = "PCS 승압설정 정보 조회 PCS 아이템 응답 객체") +public class ApiPcsVoltageStepUpPcsItemResponse { + + @Schema(description = "PCS메이커코드", maxLength = 10) + private String pcsMkrCd; + + @Schema(description = "PCS시리즈코드", maxLength = 10) + private String pcsSerCd; + + @Schema(description = "PCS 아이템 ID", maxLength = 20) + private String itemId; + + @Schema(description = "PCS 제품명", maxLength = 100) + private String itemNm; + + @Schema(description = "PCS 제품명(Basic Material)") + private String goodsNo; + + @Schema(description = "직렬매수 목록") + private List serQtyList; + + @Schema(description = "연결함목록") + private List connList; +} diff --git a/src/main/java/com/interplug/qcast/biz/master/dto/pcs/voltagestepup/ApiPcsVoltageStepUpResponse.java b/src/main/java/com/interplug/qcast/biz/master/dto/pcs/voltagestepup/ApiPcsVoltageStepUpResponse.java new file mode 100644 index 00000000..b89ae874 --- /dev/null +++ b/src/main/java/com/interplug/qcast/biz/master/dto/pcs/voltagestepup/ApiPcsVoltageStepUpResponse.java @@ -0,0 +1,18 @@ +package com.interplug.qcast.biz.master.dto.pcs.voltagestepup; + +import io.swagger.v3.oas.annotations.media.Schema; +import java.util.List; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +@Schema(description = "PCS 승압설정 정보 조회 응답 객체") +public class ApiPcsVoltageStepUpResponse { + + @Schema(description = "PCS 아이템 목록") + private List pcsItemList; + + @Schema(description = "옵션목록(모니터선택)") + private List optionList; +} diff --git a/src/main/java/com/interplug/qcast/biz/master/dto/pcs/voltagestepup/ApiPcsVoltageStepUpRoofSurfaceModuleResponse.java b/src/main/java/com/interplug/qcast/biz/master/dto/pcs/voltagestepup/ApiPcsVoltageStepUpRoofSurfaceModuleResponse.java new file mode 100644 index 00000000..d2c25095 --- /dev/null +++ b/src/main/java/com/interplug/qcast/biz/master/dto/pcs/voltagestepup/ApiPcsVoltageStepUpRoofSurfaceModuleResponse.java @@ -0,0 +1,17 @@ +package com.interplug.qcast.biz.master.dto.pcs.voltagestepup; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +@Schema(description = "PCS 승압설정 정보 조회 모듈아이템 List(도면에 설치된 모듈) 응답 객체") +public class ApiPcsVoltageStepUpRoofSurfaceModuleResponse { + + @Schema(description = "제품ID", maxLength = 20) + private String itemId; + + @Schema(description = "회로구성번호((1-1,1-1,1-2,1-2,2-1,2-2.....))", maxLength = 10) + private String circuit; +} diff --git a/src/main/java/com/interplug/qcast/biz/master/dto/pcs/voltagestepup/ApiPcsVoltageStepUpRoofSurfaceResponse.java b/src/main/java/com/interplug/qcast/biz/master/dto/pcs/voltagestepup/ApiPcsVoltageStepUpRoofSurfaceResponse.java new file mode 100644 index 00000000..5fb96a99 --- /dev/null +++ b/src/main/java/com/interplug/qcast/biz/master/dto/pcs/voltagestepup/ApiPcsVoltageStepUpRoofSurfaceResponse.java @@ -0,0 +1,24 @@ +package com.interplug.qcast.biz.master.dto.pcs.voltagestepup; + +import io.swagger.v3.oas.annotations.media.Schema; +import java.util.List; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +@Schema(description = "PCS 승압설정 정보 조회 지붕면 응답 객체") +public class ApiPcsVoltageStepUpRoofSurfaceResponse { + + @Schema(description = "지붕면ID", maxLength = 50) + private String roofSurfaceId; + + @Schema(description = "지붕면방위(동,서,남,북,동남,서북 등등)", maxLength = 10) + private String roofSurface; + + @Schema(description = "촌수(경사도)", maxLength = 10) + private Double roofSurfaceIncl; + + @Schema(description = "모듈아이템 List(도면에 설치된 모듈)") + private List moduleList; +} diff --git a/src/main/java/com/interplug/qcast/biz/master/dto/pcs/voltagestepup/ApiPcsVoltageStepUpSerQtyResponse.java b/src/main/java/com/interplug/qcast/biz/master/dto/pcs/voltagestepup/ApiPcsVoltageStepUpSerQtyResponse.java new file mode 100644 index 00000000..830acb5a --- /dev/null +++ b/src/main/java/com/interplug/qcast/biz/master/dto/pcs/voltagestepup/ApiPcsVoltageStepUpSerQtyResponse.java @@ -0,0 +1,27 @@ +package com.interplug.qcast.biz.master.dto.pcs.voltagestepup; + +import io.swagger.v3.oas.annotations.media.Schema; +import java.util.List; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +@Schema(description = "PCS 승압설정 정보 조회 직렬매수 응답 객체") +public class ApiPcsVoltageStepUpSerQtyResponse { + + @Schema(description = "직렬매수", maxLength = 10) + private Integer serQty; + + @Schema(description = "병렬수(회로수)", maxLength = 10) + private Integer paralQty; + + @Schema(description = "추천여부", maxLength = 1) + private String rmdYn; + + @Schema(description = "사용가능여부", maxLength = 1) + private String usePossYn; + + @Schema(description = "지붕면 목록") + private List roofSurfaceList; +} From 8c42932f8b60d1574ad072104b2dc913beeb9b15 Mon Sep 17 00:00:00 2001 From: Daseul Kim Date: Tue, 14 Jan 2025 17:12:06 +0900 Subject: [PATCH 02/21] =?UTF-8?q?refactor:=20=EA=B2=AC=EC=A0=81=EC=84=9C?= =?UTF-8?q?=20=EC=95=84=EC=9D=B4=ED=85=9C=20=EC=A1=B0=ED=9A=8C=20api=20req?= =?UTF-8?q?uest=20body=EC=97=90=20pcs=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../quotation/ApiQuotationItemPcsRequest.java | 32 +++++++++++++++++++ .../quotation/ApiQuotationItemRequest.java | 4 +++ 2 files changed, 36 insertions(+) create mode 100644 src/main/java/com/interplug/qcast/biz/master/dto/quotation/ApiQuotationItemPcsRequest.java diff --git a/src/main/java/com/interplug/qcast/biz/master/dto/quotation/ApiQuotationItemPcsRequest.java b/src/main/java/com/interplug/qcast/biz/master/dto/quotation/ApiQuotationItemPcsRequest.java new file mode 100644 index 00000000..e8a74fdd --- /dev/null +++ b/src/main/java/com/interplug/qcast/biz/master/dto/quotation/ApiQuotationItemPcsRequest.java @@ -0,0 +1,32 @@ +package com.interplug.qcast.biz.master.dto.quotation; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +@Schema(description = "Api 견적서 아이템 조회 PCS 요청 객체") +public class ApiQuotationItemPcsRequest { + + @Schema(description = "PCS메이커코드", maxLength = 10) + @NotNull + public String pcsMkrCd; + + @Schema(description = "PCS시리즈코드", maxLength = 10) + @NotNull + public String pcsSerCd; + + @Schema(description = "PCS 아이템ID", maxLength = 20) + @NotNull + public String pcsItemId; + + @Schema(description = "PCS옵션코드", maxLength = 20) + @NotNull + public String pscOptCd; + + @Schema(description = "병렬수(회로수)") + @NotNull + public Integer paralQty; +} diff --git a/src/main/java/com/interplug/qcast/biz/master/dto/quotation/ApiQuotationItemRequest.java b/src/main/java/com/interplug/qcast/biz/master/dto/quotation/ApiQuotationItemRequest.java index 600eb75b..bc6c494a 100644 --- a/src/main/java/com/interplug/qcast/biz/master/dto/quotation/ApiQuotationItemRequest.java +++ b/src/main/java/com/interplug/qcast/biz/master/dto/quotation/ApiQuotationItemRequest.java @@ -143,4 +143,8 @@ public class ApiQuotationItemRequest { @Schema(description = "랙") @NotNull public List racks; + + @Schema(description = "PCS") + @NotNull + public List pcses; } From db10023a63319b550af4fc1b03d9793ff2fc549c Mon Sep 17 00:00:00 2001 From: "LAPTOP-L3VE7KK2\\USER" Date: Wed, 15 Jan 2025 10:27:25 +0900 Subject: [PATCH 03/21] =?UTF-8?q?=EB=AC=BC=EA=B1=B4=EC=A0=95=EB=B3=B4=20?= =?UTF-8?q?=EA=B0=B1=EC=8B=A0=EC=9D=BC=20=EC=88=98=EC=A0=95=20API=20?= =?UTF-8?q?=EA=B0=9C=EB=B0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../qcast/biz/object/ObjectController.java | 7 ++++++ .../qcast/biz/object/ObjectMapper.java | 3 +++ .../qcast/biz/object/ObjectService.java | 22 +++++++++++++++++++ .../resources/mappers/object/objectMapper.xml | 22 +++++++++++++++++++ 4 files changed, 54 insertions(+) diff --git a/src/main/java/com/interplug/qcast/biz/object/ObjectController.java b/src/main/java/com/interplug/qcast/biz/object/ObjectController.java index 55d9031d..d08f0d94 100644 --- a/src/main/java/com/interplug/qcast/biz/object/ObjectController.java +++ b/src/main/java/com/interplug/qcast/biz/object/ObjectController.java @@ -93,6 +93,13 @@ public class ObjectController { return objectService.updateObject(objectRequest); } + @Operation(description = "물건정보 갱신일을 수정한다.") + @PutMapping("/update-object-date") + @ResponseStatus(HttpStatus.CREATED) + public void updateObjectLastEditDate(@RequestBody ObjectRequest objectRequest) throws Exception { + objectService.updateObjectLastEditDate(objectRequest); + } + @Operation(description = "물건정보을 삭제한다.") @DeleteMapping("/{objectNo}") @ResponseStatus(HttpStatus.NO_CONTENT) diff --git a/src/main/java/com/interplug/qcast/biz/object/ObjectMapper.java b/src/main/java/com/interplug/qcast/biz/object/ObjectMapper.java index 1d7fb162..b3530d35 100644 --- a/src/main/java/com/interplug/qcast/biz/object/ObjectMapper.java +++ b/src/main/java/com/interplug/qcast/biz/object/ObjectMapper.java @@ -49,6 +49,9 @@ public interface ObjectMapper { // 물건정보 수정 public int updateObject(ObjectRequest objectRequest); + // 물건정보 갱신일 수정 + public int updateObjectLastEditDate(ObjectRequest objectRequest); + // 물건정보 삭제 public int deleteObject(ObjectRequest objectRequest); diff --git a/src/main/java/com/interplug/qcast/biz/object/ObjectService.java b/src/main/java/com/interplug/qcast/biz/object/ObjectService.java index aceacb3d..bd98916a 100644 --- a/src/main/java/com/interplug/qcast/biz/object/ObjectService.java +++ b/src/main/java/com/interplug/qcast/biz/object/ObjectService.java @@ -398,6 +398,28 @@ public class ObjectService { return objectResponse; } + /** + * 물건정보 갱신일 수정 + * + * @param objectRequest + * @throws Exception + */ + public void updateObjectLastEditDate(ObjectRequest objectRequest) throws Exception { + // Validation + if (StringUtils.isEmpty(objectRequest.getObjectNo())) { + throw new QcastException( + ErrorCode.INVALID_INPUT_VALUE, + message.getMessage("common.message.required.data", "Object No")); + } + + try { + // object 갱신일 수정 + objectMapper.updateObjectLastEditDate(objectRequest); + } catch (Exception e) { + throw new QcastException(ErrorCode.INTERNAL_SERVER_ERROR); + } + } + /** * 물건정보 삭제 * diff --git a/src/main/resources/mappers/object/objectMapper.xml b/src/main/resources/mappers/object/objectMapper.xml index a0d58133..12318176 100644 --- a/src/main/resources/mappers/object/objectMapper.xml +++ b/src/main/resources/mappers/object/objectMapper.xml @@ -632,6 +632,28 @@ WHERE OBJECT_NO = #{objectNo} + + /* sqlid : com.interplug.qcast.biz.object.updateObjectLastEditDate */ + UPDATE T_OBJECT + SET + OBJECT_NO = #{objectNo} + + , STANDARD_WIND_SPEED_ID = #{standardWindSpeedId} + + + , VERTICAL_SNOW_COVER = #{verticalSnowCover} + + + , SURFACE_TYPE = #{surfaceType} + + + , INSTALL_HEIGHT = #{installHeight} + + , LAST_EDIT_DATETIME = GETDATE() + , LAST_EDIT_USER = #{userId} + WHERE OBJECT_NO = #{objectNo} + + /* sqlid : com.interplug.qcast.biz.object.updateObjectDelivery */ UPDATE A SET From ec4b979cef607c134c65bd90ce701d510ef1018d Mon Sep 17 00:00:00 2001 From: Daseul Kim Date: Wed, 15 Jan 2025 10:50:38 +0900 Subject: [PATCH 04/21] =?UTF-8?q?refactor:=20PCS=20=EC=8A=B9=EC=95=95?= =?UTF-8?q?=EC=84=A4=EC=A0=95=20=EC=A0=95=EB=B3=B4=20=EC=A1=B0=ED=9A=8C=20?= =?UTF-8?q?api=20=EC=9D=91=EB=8B=B5=20=ED=95=84=EB=93=9C=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../voltagestepup/ApiPcsVoltageStepUpPcsItemResponse.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/interplug/qcast/biz/master/dto/pcs/voltagestepup/ApiPcsVoltageStepUpPcsItemResponse.java b/src/main/java/com/interplug/qcast/biz/master/dto/pcs/voltagestepup/ApiPcsVoltageStepUpPcsItemResponse.java index 693acb40..a392bf83 100644 --- a/src/main/java/com/interplug/qcast/biz/master/dto/pcs/voltagestepup/ApiPcsVoltageStepUpPcsItemResponse.java +++ b/src/main/java/com/interplug/qcast/biz/master/dto/pcs/voltagestepup/ApiPcsVoltageStepUpPcsItemResponse.java @@ -22,9 +22,12 @@ public class ApiPcsVoltageStepUpPcsItemResponse { @Schema(description = "PCS 제품명", maxLength = 100) private String itemNm; - @Schema(description = "PCS 제품명(Basic Material)") + @Schema(description = "PCS 제품명(Basic Material)", maxLength = 40) private String goodsNo; + @Schema(description = "PCS 회로구성정보(모듈수) - 발전시물레이션에서 사용", maxLength = 50) + private String circuitCfg; + @Schema(description = "직렬매수 목록") private List serQtyList; From f97ab43107d6725fb2e63fc19ab02d076118fc83 Mon Sep 17 00:00:00 2001 From: "DESKTOP-6ARNG1Q\\dlsgk" Date: Wed, 15 Jan 2025 10:59:11 +0900 Subject: [PATCH 05/21] =?UTF-8?q?=EB=B0=B0=EC=B9=98=20(=EB=85=B8=EC=B6=9C?= =?UTF-8?q?=EC=95=84=EC=9D=B4=ED=85=9C)=20=EA=B4=80=EB=A0=A8=20=EC=9C=84?= =?UTF-8?q?=EC=B9=98=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SpecialNoteDispItemJobConfiguration.java | 162 +++++++++--------- .../batch/master/StoreJobConfiguration.java | 46 ++++- .../dto/SpecialNoteSyncResponse.java | 7 +- .../qcast/biz/user/dto/StoreSyncResponse.java | 4 + 4 files changed, 131 insertions(+), 88 deletions(-) diff --git a/src/main/java/com/interplug/qcast/batch/master/SpecialNoteDispItemJobConfiguration.java b/src/main/java/com/interplug/qcast/batch/master/SpecialNoteDispItemJobConfiguration.java index 195004b0..d1448c5e 100644 --- a/src/main/java/com/interplug/qcast/batch/master/SpecialNoteDispItemJobConfiguration.java +++ b/src/main/java/com/interplug/qcast/batch/master/SpecialNoteDispItemJobConfiguration.java @@ -1,8 +1,14 @@ 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; @@ -19,14 +25,6 @@ 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.displayItem.DisplayItemService; -import com.interplug.qcast.biz.displayItem.dto.DisplayItemRequest; -import com.interplug.qcast.biz.specialNote.SpecialNoteService; -import com.interplug.qcast.biz.specialNote.dto.SpecialNoteItemRequest; -import com.interplug.qcast.biz.specialNote.dto.SpecialNoteRequest; -import com.interplug.qcast.biz.specialNote.dto.SpecialNoteSyncResponse; -import com.interplug.qcast.util.InterfaceQsp; -import lombok.extern.slf4j.Slf4j; @Configuration @Slf4j @@ -35,92 +33,100 @@ public class SpecialNoteDispItemJobConfiguration implements JobExecutionListener private final InterfaceQsp interfaceQsp; private final SpecialNoteService specialNoteService; - private final DisplayItemService displayItemService; @Value("${qsp.master-special-note-disp-item-batch-url}") private String qspMasterSpecialNoteDispItemBatchUrl; private SpecialNoteSyncResponse SpecialNoteDispItemSyncResponse; - public SpecialNoteDispItemJobConfiguration(InterfaceQsp interfaceQsp, - SpecialNoteService specialNoteService, DisplayItemService displayItemService) { + public SpecialNoteDispItemJobConfiguration( + InterfaceQsp interfaceQsp, SpecialNoteService specialNoteService) { this.interfaceQsp = interfaceQsp; this.specialNoteService = specialNoteService; - this.displayItemService = displayItemService; } @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()); + 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, Step storeDispItemStep) { - return new JobBuilder("specialNoteDispItemAdditionalJob", jobRepository).start(specialNoteStep) - .next(specialNoteItemStep).next(storeDispItemStep).listener(this).build(); + public Job specialNoteDispItemAdditionalJob( + JobRepository jobRepository, Step specialNoteStep, Step specialNoteItemStep) { + return new JobBuilder("specialNoteDispItemAdditionalJob", jobRepository) + .start(specialNoteStep) + .next(specialNoteItemStep) + .listener(this) + .build(); } - private Step buildStep(String stepName, JobRepository jobRepository, - PlatformTransactionManager transactionManager, ItemReader reader, ItemWriter writer) { - return new StepBuilder(stepName, jobRepository).chunk(10, transactionManager) - .reader(reader).writer(writer).build(); + private Step buildStep( + String stepName, + JobRepository jobRepository, + PlatformTransactionManager transactionManager, + ItemReader reader, + ItemWriter writer) { + return new StepBuilder(stepName, jobRepository) + .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")); + 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")); - } - - @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")); + 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 ListItemReader createReader(List items, String readerName) { @@ -131,25 +137,21 @@ public class SpecialNoteDispItemJobConfiguration implements JobExecutionListener @Bean @StepScope public ListItemReader specialNoteListReader() { - return createReader(SpecialNoteDispItemSyncResponse != null - ? SpecialNoteDispItemSyncResponse.getSdOrderSpnList() - : null, "specialNote"); + return createReader( + SpecialNoteDispItemSyncResponse != null + ? SpecialNoteDispItemSyncResponse.getSdOrderSpnList() + : null, + "specialNote"); } @Bean @StepScope public ListItemReader specialNoteItemListReader() { - return createReader(SpecialNoteDispItemSyncResponse != null - ? SpecialNoteDispItemSyncResponse.getSdOrderSpnItemList() - : null, "specialNoteItem"); - } - - @Bean - @StepScope - public ListItemReader storeDispItemListReader() { - return createReader(SpecialNoteDispItemSyncResponse != null - ? SpecialNoteDispItemSyncResponse.getStoreDispItemList() - : null, "storeDispItem"); + return createReader( + SpecialNoteDispItemSyncResponse != null + ? SpecialNoteDispItemSyncResponse.getSdOrderSpnItemList() + : null, + "specialNoteItem"); } private ItemWriter createWriter(Consumer> processor, String writerName) { diff --git a/src/main/java/com/interplug/qcast/batch/master/StoreJobConfiguration.java b/src/main/java/com/interplug/qcast/batch/master/StoreJobConfiguration.java index 20fb8cf6..ed2443a7 100644 --- a/src/main/java/com/interplug/qcast/batch/master/StoreJobConfiguration.java +++ b/src/main/java/com/interplug/qcast/batch/master/StoreJobConfiguration.java @@ -1,5 +1,7 @@ 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; @@ -32,6 +34,7 @@ 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; @@ -39,10 +42,14 @@ public class StoreJobConfiguration implements JobExecutionListener { private StoreSyncResponse storeSyncResponse; public StoreJobConfiguration( - InterfaceQsp interfaceQsp, UserService userService, StoreFavoriteService storeFavService) { + InterfaceQsp interfaceQsp, + UserService userService, + StoreFavoriteService storeFavService, + DisplayItemService displayItemService) { this.interfaceQsp = interfaceQsp; this.userService = userService; this.storeFavService = storeFavService; + this.displayItemService = displayItemService; } @Override @@ -60,11 +67,16 @@ public class StoreJobConfiguration implements JobExecutionListener { @Bean public Job storeAdditionalJob( - JobRepository jobRepository, Step storeStep, Step userStep, Step favoriteStep) { + JobRepository jobRepository, + Step storeStep, + Step userStep, + Step favoriteStep, + Step storeDispItemStep) { return new JobBuilder("storeAdditionalJob", jobRepository) .start(storeStep) .next(userStep) .next(favoriteStep) + .next(storeDispItemStep) .listener(this) .build(); } @@ -138,6 +150,28 @@ public class StoreJobConfiguration implements JobExecutionListener { "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 ListItemReader createReader(List items, String readerName) { log.info("{}Reader 호출됨...", readerName); return new ListItemReader<>(items != null ? items : Collections.emptyList()); @@ -163,6 +197,14 @@ public class StoreJobConfiguration implements JobExecutionListener { storeSyncResponse != null ? storeSyncResponse.getStoreFavList() : null, "storeFav"); } + @Bean + @StepScope + public ListItemReader storeDispItemListReader() { + return createReader( + storeSyncResponse != null ? storeSyncResponse.getStoreDispItemList() : null, + "storeDispItem"); + } + private ItemWriter createWriter(Consumer> processor, String writerName) { return items -> { try { diff --git a/src/main/java/com/interplug/qcast/biz/specialNote/dto/SpecialNoteSyncResponse.java b/src/main/java/com/interplug/qcast/biz/specialNote/dto/SpecialNoteSyncResponse.java index 01ee06ad..ecaad88f 100644 --- a/src/main/java/com/interplug/qcast/biz/specialNote/dto/SpecialNoteSyncResponse.java +++ b/src/main/java/com/interplug/qcast/biz/specialNote/dto/SpecialNoteSyncResponse.java @@ -1,8 +1,7 @@ package com.interplug.qcast.biz.specialNote.dto; -import java.util.List; -import com.interplug.qcast.biz.displayItem.dto.DisplayItemRequest; import io.swagger.v3.oas.annotations.media.Schema; +import java.util.List; import lombok.Getter; import lombok.Setter; @@ -15,8 +14,4 @@ public class SpecialNoteSyncResponse { @Schema(description = "견적 특이사항 아이템 목록") private List sdOrderSpnItemList; - - @Schema(description = "노출 아이템 목록") - private List storeDispItemList; - } diff --git a/src/main/java/com/interplug/qcast/biz/user/dto/StoreSyncResponse.java b/src/main/java/com/interplug/qcast/biz/user/dto/StoreSyncResponse.java index 1df9f990..aa3d62b3 100644 --- a/src/main/java/com/interplug/qcast/biz/user/dto/StoreSyncResponse.java +++ b/src/main/java/com/interplug/qcast/biz/user/dto/StoreSyncResponse.java @@ -1,5 +1,6 @@ package com.interplug.qcast.biz.user.dto; +import com.interplug.qcast.biz.displayItem.dto.DisplayItemRequest; import com.interplug.qcast.biz.storeFavorite.dto.StoreFavoriteRequest; import io.swagger.v3.oas.annotations.media.Schema; import java.util.List; @@ -18,4 +19,7 @@ public class StoreSyncResponse { @Schema(description = "즐겨찾기 목록") private List storeFavList; + + @Schema(description = "노출 아이템 목록") + private List storeDispItemList; } From 2930910b520d98923b4cdc3a0d0352c3c7faea36 Mon Sep 17 00:00:00 2001 From: "LAPTOP-L3VE7KK2\\USER" Date: Thu, 16 Jan 2025 09:07:59 +0900 Subject: [PATCH 06/21] =?UTF-8?q?=EA=B2=AC=EC=A0=81=EC=84=9C=20=EC=A0=80?= =?UTF-8?q?=EC=9E=A5=20API=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../qcast/biz/estimate/EstimateMapper.java | 15 ++- .../qcast/biz/estimate/EstimateService.java | 97 +++++---------- .../biz/estimate/dto/EstimateRequest.java | 4 +- .../qcast/biz/estimate/dto/ItemRequest.java | 5 +- .../qcast/biz/estimate/dto/RoofRequest.java | 6 +- .../qcast/biz/estimate/dto/RoofResponse.java | 4 +- .../pwrGnrSimulation/PwrGnrSimService.java | 4 +- .../dto/PwrGnrSimRoofResponse.java | 2 +- .../mappers/estimate/estimateMapper.xml | 117 +++++++++++++++--- .../pwrGnrSimulation/pwrGnrSimMapper.xml | 6 +- 10 files changed, 164 insertions(+), 96 deletions(-) diff --git a/src/main/java/com/interplug/qcast/biz/estimate/EstimateMapper.java b/src/main/java/com/interplug/qcast/biz/estimate/EstimateMapper.java index 407a594c..2d5c137c 100644 --- a/src/main/java/com/interplug/qcast/biz/estimate/EstimateMapper.java +++ b/src/main/java/com/interplug/qcast/biz/estimate/EstimateMapper.java @@ -72,13 +72,13 @@ public interface EstimateMapper { // 견적서 API 정보 수정 public int updateEstimateApi(EstimateRequest estimateRequest); - // 견적서 지붕재 등록 + // 견적서 지붕면 등록 public int insertEstimateRoof(RoofRequest roofRequest); - // 견적서 지붕재 아이템 등록 + // 견적서 지붕면 아이템 등록 public int insertEstimateRoofItem(ItemRequest itemRequest); - // 견적서 지붕재 회로구성 아이템 등록 + // 견적서 지붕면 회로구성 아이템 등록 public int insertEstimateCircuitItem(ItemRequest itemRequest); // 견적서 도면 아이템 등록 @@ -108,6 +108,15 @@ public interface EstimateMapper { // 견적서 복사 public int insertEstimateCopy(EstimateCopyRequest estimateCopyRequest); + // 견적서 지붕면 복사 + public int insertEstimateRoofCopy(EstimateCopyRequest estimateCopyRequest); + + // 견적서 지붕면 아이템 복사 + public int insertEstimateRoofItemCopy(EstimateCopyRequest estimateCopyRequest); + + // 견적서 지붕면 회로구성 아이템 복사 + public int insertEstimateCircuitItemCopy(EstimateCopyRequest estimateCopyRequest); + // 견적서 도면 아이템 복사 public int insertEstimateDrawingItemCopy(EstimateCopyRequest estimateCopyRequest); diff --git a/src/main/java/com/interplug/qcast/biz/estimate/EstimateService.java b/src/main/java/com/interplug/qcast/biz/estimate/EstimateService.java index fd576929..1e5d7383 100644 --- a/src/main/java/com/interplug/qcast/biz/estimate/EstimateService.java +++ b/src/main/java/com/interplug/qcast/biz/estimate/EstimateService.java @@ -300,7 +300,7 @@ public class EstimateService { } // [2]. 지붕재 관련 데이터 셋팅 - roofList = estimateRequest.getRoofList(); + roofList = estimateRequest.getRoofSurfaceList(); // 지붕재 시공사양 ID String constructSpecifications = ""; @@ -576,7 +576,7 @@ public class EstimateService { : "UNIT_PRICE"); estimateMapper.updateEstimate(estimateRequest); - // 도면 작성일 경우에만 지붕재, 도면 아이템 데이터 초기화 후 저장 + // 도면 작성일 경우에만 지붕면, 도면 아이템 데이터 초기화 후 저장 if ("1".equals(estimateRequest.getDrawingFlg())) { // 견적서 지붕면/아이템 및 PC 회로구성도 제거 estimateMapper.deleteEstimateRoofList(estimateRequest); @@ -591,11 +591,32 @@ public class EstimateService { estimateMapper.insertEstimateRoof(roofRequest); - List roofItemList = roofRequest.getRoofItemList(); + List moduleList = roofRequest.getModuleList(); + List roofItemList = new ArrayList(); + + // 동일 모듈, PCS 아이템 묶기 + for (ItemRequest itemRequest : moduleList) { + boolean overLap = false; + for (ItemRequest data : roofItemList) { + if (itemRequest.getItemId().equals(data.getItemId()) + && itemRequest.getPcItemId().equals(data.getPcItemId())) { + data.setAmount( + String.valueOf(Integer.parseInt(data.getAmount()) + 1)); // 데이터 존재하면 카운팅 + 1 + overLap = true; + break; + } + } + + if (!overLap) { + itemRequest.setAmount("1"); + roofItemList.add(itemRequest); + } + } + for (ItemRequest itemRequest : roofItemList) { + itemRequest.setRoofSurfaceId(roofRequest.getRoofSurfaceId()); itemRequest.setObjectNo(estimateRequest.getObjectNo()); itemRequest.setPlanNo(estimateRequest.getPlanNo()); - itemRequest.setRoofNo(roofRequest.getRoofNo()); estimateMapper.insertEstimateRoofItem(itemRequest); } @@ -692,6 +713,7 @@ public class EstimateService { } } catch (Exception e) { + e.printStackTrace(); throw new QcastException(ErrorCode.INTERNAL_SERVER_ERROR); } } @@ -811,71 +833,19 @@ public class EstimateService { estimateMapper.insertEstimateItem(itemRequest); } - // [6]. 견적서 지붕재 및 도면 초기 데이터 복사 - List roofList = estimateMapper.selectEstimateRoofList(estimateRequest); - List roofItemList = estimateMapper.selectEstimateRoofItemList(estimateRequest); - List circuitItemList = - estimateMapper.selectEstimateCircuitItemList(estimateRequest); - - for (RoofResponse roofResponse : roofList) { - List roofItemList2 = new ArrayList(); - - // 현재 매칭되는 지붕재 아이템 축출 - for (RoofResponse roofItemResponse : roofItemList) { - if (roofResponse.getRoofNo().equals(roofItemResponse.getRoofNo())) { - roofItemList2.add(roofItemResponse); - } - } - - RoofRequest roofRequest = new RoofRequest(); - roofRequest.setObjectNo(estimateCopyRequest.getCopyObjectNo()); - roofRequest.setPlanNo(estimateCopyRequest.getCopyPlanNo()); - roofRequest.setRoofSurface(roofResponse.getRoofSurface()); - roofRequest.setRoofMaterialId(roofResponse.getRoofMaterialId()); - roofRequest.setSupportMethodId(roofResponse.getSupportMethodId()); - roofRequest.setConstructSpecification(roofResponse.getConstructSpecification()); - roofRequest.setSlope(roofResponse.getSlope()); - roofRequest.setAngle(roofResponse.getAngle()); - roofRequest.setClassType(roofResponse.getClassType()); - roofRequest.setAzimuth(roofResponse.getAzimuth()); - roofRequest.setUserId(estimateCopyRequest.getUserId()); - - estimateMapper.insertEstimateRoof(roofRequest); - - for (RoofResponse roofItemResponse : roofItemList2) { - ItemRequest itemRequest = new ItemRequest(); - itemRequest.setRoofNo(roofRequest.getRoofNo()); - itemRequest.setObjectNo(estimateCopyRequest.getCopyObjectNo()); - itemRequest.setPlanNo(estimateCopyRequest.getCopyPlanNo()); - itemRequest.setItemId(roofItemResponse.getItemId()); - itemRequest.setItemNo(roofItemResponse.getItemNo()); - itemRequest.setItemName(roofItemResponse.getItemName()); - itemRequest.setSpecification(roofItemResponse.getSpecification()); - itemRequest.setAmount(roofItemResponse.getAmount()); - itemRequest.setPcItemId(roofItemResponse.getPcItemId()); - - estimateMapper.insertEstimateRoofItem(itemRequest); - } - } - - for (ItemResponse itemResponse : circuitItemList) { - ItemRequest circuitItemRequest = new ItemRequest(); - - circuitItemRequest.setObjectNo(estimateCopyRequest.getCopyObjectNo()); - circuitItemRequest.setPlanNo(estimateCopyRequest.getCopyPlanNo()); - circuitItemRequest.setItemId(itemResponse.getItemId()); - circuitItemRequest.setCircuitCfg(itemResponse.getCircuitCfg()); - - estimateMapper.insertEstimateCircuitItem(circuitItemRequest); - } - + // [6]. 견적서 지붕면 및 도면 초기 데이터 복사 + // 견적서 지붕면 복사 + estimateMapper.insertEstimateRoofCopy(estimateCopyRequest); + // 견적서 지붕면 아이템 복사 + estimateMapper.insertEstimateRoofItemCopy(estimateCopyRequest); + // 견적서 지붕면 회로구성 아이템 복사 + estimateMapper.insertEstimateCircuitItemCopy(estimateCopyRequest); // 도면 초기 데이타 복사(초기화 위해 필요) estimateMapper.insertEstimateDrawingItemCopy(estimateCopyRequest); // [7]. 견적서 도면 복사 (추후 개발 필요) // [8]. QSP Q.CAST SEND API - /* List resultList = new ArrayList(); estimateRequest.setObjectNo(estimateCopyRequest.getCopyObjectNo()); estimateRequest.setPlanNo(estimateCopyRequest.getCopyPlanNo()); @@ -890,7 +860,6 @@ public class EstimateService { estimateMapper.updateEstimateApi(estimateRequest); } - */ } catch (Exception e) { throw new QcastException(ErrorCode.INTERNAL_SERVER_ERROR); diff --git a/src/main/java/com/interplug/qcast/biz/estimate/dto/EstimateRequest.java b/src/main/java/com/interplug/qcast/biz/estimate/dto/EstimateRequest.java index c384a1b2..6f7e2a59 100644 --- a/src/main/java/com/interplug/qcast/biz/estimate/dto/EstimateRequest.java +++ b/src/main/java/com/interplug/qcast/biz/estimate/dto/EstimateRequest.java @@ -193,9 +193,9 @@ public class EstimateRequest { // 데이터 목록 관련 정보 @Schema(description = "지붕재 목록") - List roofList; + List roofSurfaceList; - @Schema(description = "지붕재 목록") + @Schema(description = "PC 회로구성도 목록") List circuitItemList; @Schema(description = "아이템 목록") diff --git a/src/main/java/com/interplug/qcast/biz/estimate/dto/ItemRequest.java b/src/main/java/com/interplug/qcast/biz/estimate/dto/ItemRequest.java index 44c948e1..054f7401 100644 --- a/src/main/java/com/interplug/qcast/biz/estimate/dto/ItemRequest.java +++ b/src/main/java/com/interplug/qcast/biz/estimate/dto/ItemRequest.java @@ -18,7 +18,7 @@ public class ItemRequest { private String roofItemNo; @Schema(description = "지붕재 번호") - private String roofNo; + private String roofSurfaceId; @Schema(description = "아이템 ID") private String itemId; @@ -80,6 +80,9 @@ public class ItemRequest { @Schema(description = "회로번호") private String circuitNo; + @Schema(description = "회로구성번호") + private String circuit; + @Schema(description = "회로구성도") private String circuitCfg; diff --git a/src/main/java/com/interplug/qcast/biz/estimate/dto/RoofRequest.java b/src/main/java/com/interplug/qcast/biz/estimate/dto/RoofRequest.java index 1a2aedcc..18288d5c 100644 --- a/src/main/java/com/interplug/qcast/biz/estimate/dto/RoofRequest.java +++ b/src/main/java/com/interplug/qcast/biz/estimate/dto/RoofRequest.java @@ -15,8 +15,8 @@ public class RoofRequest { @Schema(description = "플랜번호") private String planNo; - @Schema(description = "지붕재 번호") - private String roofNo; + @Schema(description = "지붕재 ID") + private String roofSurfaceId; @Schema(description = "지붕면") private String roofSurface; @@ -58,5 +58,5 @@ public class RoofRequest { private String userId; @Schema(description = "아이템 목록") - List roofItemList; + List moduleList; } diff --git a/src/main/java/com/interplug/qcast/biz/estimate/dto/RoofResponse.java b/src/main/java/com/interplug/qcast/biz/estimate/dto/RoofResponse.java index 4337db13..a1c9bd6f 100644 --- a/src/main/java/com/interplug/qcast/biz/estimate/dto/RoofResponse.java +++ b/src/main/java/com/interplug/qcast/biz/estimate/dto/RoofResponse.java @@ -14,8 +14,8 @@ public class RoofResponse { @Schema(description = "플랜번호") private String planNo; - @Schema(description = "지붕재 번호") - private String roofNo; + @Schema(description = "지붕면 ID") + private String roofSurfaceId; @Schema(description = "지붕면") private String roofSurface; diff --git a/src/main/java/com/interplug/qcast/biz/pwrGnrSimulation/PwrGnrSimService.java b/src/main/java/com/interplug/qcast/biz/pwrGnrSimulation/PwrGnrSimService.java index 48029e5e..290b2073 100644 --- a/src/main/java/com/interplug/qcast/biz/pwrGnrSimulation/PwrGnrSimService.java +++ b/src/main/java/com/interplug/qcast/biz/pwrGnrSimulation/PwrGnrSimService.java @@ -115,7 +115,7 @@ public class PwrGnrSimService { // 견적서의 지붕재 목록 조회 List roofList = pwrGnrSimMapper.selectRoofList(pwrGnrSimRequest); - int roofLength = roofList.size(); // Set의 크기 = 고유 roofNo 개수 + int roofLength = roofList.size(); // Set의 크기 = 고유 roofSurfaceId 개수 // 지붕재 정보가 없음. if (roofList == null || roofList.isEmpty()) { @@ -262,7 +262,7 @@ public class PwrGnrSimService { // 지붕별 모듈정보 셋팅 int j = 0; for (PwrGnrSimRoofResponse m : roofModuleList) { - if (data.getRoofNo().equals(m.getRoofNo())) { + if (data.getRoofSurfaceId().equals(m.getRoofSurfaceId())) { dSpecification += m.getTotSpecification(); if (j == 0) { dModuleInput1[i] = Integer.parseInt(m.getAmount()); diff --git a/src/main/java/com/interplug/qcast/biz/pwrGnrSimulation/dto/PwrGnrSimRoofResponse.java b/src/main/java/com/interplug/qcast/biz/pwrGnrSimulation/dto/PwrGnrSimRoofResponse.java index c7e2af8f..5fa61895 100644 --- a/src/main/java/com/interplug/qcast/biz/pwrGnrSimulation/dto/PwrGnrSimRoofResponse.java +++ b/src/main/java/com/interplug/qcast/biz/pwrGnrSimulation/dto/PwrGnrSimRoofResponse.java @@ -7,7 +7,7 @@ import lombok.Data; public class PwrGnrSimRoofResponse { @Schema(description = "지붕재") - private String roofNo; + private String roofSurfaceId; @Schema(description = "지붕명") private String roofSurface; diff --git a/src/main/resources/mappers/estimate/estimateMapper.xml b/src/main/resources/mappers/estimate/estimateMapper.xml index 7e7e8f84..1ef6efd6 100644 --- a/src/main/resources/mappers/estimate/estimateMapper.xml +++ b/src/main/resources/mappers/estimate/estimateMapper.xml @@ -351,7 +351,7 @@ , P.PLAN_NO , ROUND(CAST(P.SETUP_HEIGHT AS FLOAT), 2) AS SETUP_HEIGHT , P.SURFACE_TYPE - , RE.ROOF_NO + , RE.ROOF_SURFACE_ID , RE.ROOF_SURFACE , RE.ROOF_MATERIAL_ID , RE.SUPPORT_METHOD_ID @@ -383,7 +383,7 @@ /* sqlid : com.interplug.qcast.api.pwrGnrSimulation.selectRoofItemList (견적서 지붕재 아이템 정보 조회) */ - SELECT - A.ROOF_SURFACE_ID - , B.ITEM_ID - , B.AMOUNT - , B.ITEM_NO - , ISNULL((B.AMOUNT * TRY_CAST(B.SPECIFICATION AS FLOAT)), 0) AS TOT_SPECIFICATION /* 용량 */ - , C.ITEM_GROUP - /* 추후 지붕재테이블로 봐야함. */ - , C.TEMP_LOSS - , C.TEMP_COEFF - , C.CNV_EFF - , C.AMP - , B.SPECIFICATION - , A.ROOF_SURFACE - , A.CLASS_TYPE - , A.AZIMUTH - , (CASE WHEN A.CLASS_TYPE = 0 THEN A.SLOPE ELSE A.ANGLE END) AS SLOPE_ANGLE - , (CASE WHEN A.CLASS_TYPE = 0 THEN CAST(CAST(A.SLOPE AS INT)AS VARCHAR) + '寸' ELSE CAST(CAST(A.ANGLE AS INT)AS VARCHAR) + N'º' END) AS SLOPE_ANGLE_TXT - FROM T_PART_ROOF_ESTIMATE A WITH (NOLOCK) - INNER JOIN T_PART_ROOF_ITEM_ESTIMATE B WITH (NOLOCK) - ON A.OBJECT_NO = B.OBJECT_NO - AND A.PLAN_NO = B.PLAN_NO - AND A.ROOF_SURFACE_ID = B.ROOF_SURFACE_ID - INNER JOIN M_ITEM C WITH (NOLOCK) - ON B.ITEM_ID = C.ITEM_ID - WHERE A.OBJECT_NO = #{objectNo} - AND A.PLAN_NO = #{planNo} - AND C.ITEM_GROUP = #{itemGroup} - ORDER BY B.SPECIFICATION DESC + SELECT T.* + FROM ( + SELECT + A.ROOF_SURFACE_ID + , B.ITEM_ID + , SUM(B.AMOUNT) AS AMOUNT + , B.ITEM_NO + , ISNULL((SUM(B.AMOUNT) * TRY_CAST(MAX(B.SPECIFICATION) AS FLOAT)),0) AS TOT_SPECIFICATION /* 용량 */ + , MAX(C.ITEM_GROUP) AS ITEM_GROUP /* 추후 지붕재테이블로 봐야함. */ + , MAX(C.TEMP_LOSS) AS TEMP_LOSS + , MAX(C.TEMP_COEFF ) AS TEMP_COEFF + , MAX(C.CNV_EFF) AS CNV_EFF + , MAX(C.AMP) AS AMP + , MAX(B.SPECIFICATION) AS SPECIFICATION + , A.ROOF_SURFACE AS ROOF_SURFACE + , A.CLASS_TYPE AS CLASS_TYPE + , A.AZIMUTH AS AZIMUTH + , (CASE + WHEN A.CLASS_TYPE = 0 THEN A.SLOPE + ELSE A.ANGLE END) AS SLOPE_ANGLE + , (CASE + WHEN A.CLASS_TYPE = 0 THEN CAST(CAST(A.SLOPE AS INT)AS VARCHAR) + '寸' + ELSE CAST(CAST(A.ANGLE AS INT)AS VARCHAR) + N'º' END) AS SLOPE_ANGLE_TXT + FROM T_PART_ROOF_ESTIMATE A WITH (NOLOCK) + INNER JOIN T_PART_ROOF_ITEM_ESTIMATE B WITH (NOLOCK) + ON A.OBJECT_NO = B.OBJECT_NO + AND A.PLAN_NO = B.PLAN_NO + AND A.ROOF_SURFACE_ID = B.ROOF_SURFACE_ID + INNER JOIN M_ITEM C WITH (NOLOCK) + ON B.ITEM_ID = C.ITEM_ID + WHERE A.OBJECT_NO = #{objectNo} + AND A.PLAN_NO = #{planNo} + AND C.ITEM_GROUP = #{itemGroup} + GROUP BY A.ROOF_SURFACE_ID, A.ROOF_SURFACE, A.CLASS_TYPE, A.AZIMUTH, A.ANGLE, A.SLOPE, B.ITEM_ID, B.ITEM_NO + ) T + ORDER BY T.SPECIFICATION DESC \ No newline at end of file diff --git a/src/main/resources/template/excel/excel_download_quotation_detail_template.xlsx b/src/main/resources/template/excel/excel_download_quotation_detail_template.xlsx index b350a1bb431a4ec6ec10105490da489fa2a5d635..3b142409e37eec054993a3503be322e42e0a026e 100644 GIT binary patch delta 18643 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 Date: Thu, 16 Jan 2025 11:02:13 +0900 Subject: [PATCH 08/21] =?UTF-8?q?feat:=20=EB=B0=B0=EC=B9=98=EB=90=9C=20?= =?UTF-8?q?=EB=AA=A8=EB=93=88=EC=9D=84=20=EC=84=A0=ED=83=9D=ED=95=9C=20PCS?= =?UTF-8?q?=EB=A1=9C=20=ED=9A=8C=EB=A1=9C=20=EA=B5=AC=EC=84=B1=20=EA=B0=80?= =?UTF-8?q?=EB=8A=A5=20=EC=97=AC=EB=B6=80=20=EC=B2=B4=ED=81=AC=20api=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/interplug/qcast/biz/master/MasterController.java | 6 ++++++ .../java/com/interplug/qcast/biz/master/MasterService.java | 5 +++++ 2 files changed, 11 insertions(+) diff --git a/src/main/java/com/interplug/qcast/biz/master/MasterController.java b/src/main/java/com/interplug/qcast/biz/master/MasterController.java index 5a35c318..4009aac7 100644 --- a/src/main/java/com/interplug/qcast/biz/master/MasterController.java +++ b/src/main/java/com/interplug/qcast/biz/master/MasterController.java @@ -232,6 +232,12 @@ public class MasterController { 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 getPcsVoltageStepUpList( diff --git a/src/main/java/com/interplug/qcast/biz/master/MasterService.java b/src/main/java/com/interplug/qcast/biz/master/MasterService.java index b7a8222c..44d4f092 100644 --- a/src/main/java/com/interplug/qcast/biz/master/MasterService.java +++ b/src/main/java/com/interplug/qcast/biz/master/MasterService.java @@ -1,5 +1,6 @@ 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; @@ -91,6 +92,10 @@ public interface MasterService { public ApiResponse getPcsAutoRecommendList( @RequestBody ApiPcsInfoRequest req); + // 배치된 모듈을 선택한 PCS로 회로 구성 가능 여부 체크 + @PostMapping("/pcsVoltageChk") + public ApiResponse getPcsVoltageChk(@RequestBody ApiPcsInfoRequest req); + // PCS 승압설정 정보 조회 @PostMapping("/pcsVoltageStepUpList") public ApiResponse getPcsVoltageStepUpList( From 98c8da785907504033cf01947bb6bcc13d5e5bf2 Mon Sep 17 00:00:00 2001 From: Daseul Kim Date: Thu, 16 Jan 2025 11:28:15 +0900 Subject: [PATCH 09/21] =?UTF-8?q?feat:=20=EC=BA=94=EB=B2=84=EC=8A=A4=20?= =?UTF-8?q?=ED=8C=9D=EC=97=85=20=EC=83=81=ED=83=9C=20=EC=83=9D=EC=84=B1/?= =?UTF-8?q?=EC=A0=80=EC=9E=A5/=EC=82=AD=EC=A0=9C=20api=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CanvasPopupStatusController.java | 80 ++++++++++++++++ .../CanvasPopupStatusMapper.java | 37 ++++++++ .../CanvasPopupStatusService.java | 91 +++++++++++++++++++ .../dto/CanvasPopupStatus.java | 28 ++++++ .../CanvasPopupStatusMapper.xml | 51 +++++++++++ 5 files changed, 287 insertions(+) create mode 100644 src/main/java/com/interplug/qcast/biz/canvaspopupstatus/CanvasPopupStatusController.java create mode 100644 src/main/java/com/interplug/qcast/biz/canvaspopupstatus/CanvasPopupStatusMapper.java create mode 100644 src/main/java/com/interplug/qcast/biz/canvaspopupstatus/CanvasPopupStatusService.java create mode 100644 src/main/java/com/interplug/qcast/biz/canvaspopupstatus/dto/CanvasPopupStatus.java create mode 100644 src/main/resources/mappers/canvaspopupstatus/CanvasPopupStatusMapper.xml diff --git a/src/main/java/com/interplug/qcast/biz/canvaspopupstatus/CanvasPopupStatusController.java b/src/main/java/com/interplug/qcast/biz/canvaspopupstatus/CanvasPopupStatusController.java new file mode 100644 index 00000000..3cdcdef4 --- /dev/null +++ b/src/main/java/com/interplug/qcast/biz/canvaspopupstatus/CanvasPopupStatusController.java @@ -0,0 +1,80 @@ +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 객체 + * @throws QcastException 조회된 데이터가 없을 경우 예외 발생 + */ + @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); + } +} diff --git a/src/main/java/com/interplug/qcast/biz/canvaspopupstatus/CanvasPopupStatusMapper.java b/src/main/java/com/interplug/qcast/biz/canvaspopupstatus/CanvasPopupStatusMapper.java new file mode 100644 index 00000000..bfe59520 --- /dev/null +++ b/src/main/java/com/interplug/qcast/biz/canvaspopupstatus/CanvasPopupStatusMapper.java @@ -0,0 +1,37 @@ +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); +} diff --git a/src/main/java/com/interplug/qcast/biz/canvaspopupstatus/CanvasPopupStatusService.java b/src/main/java/com/interplug/qcast/biz/canvaspopupstatus/CanvasPopupStatusService.java new file mode 100644 index 00000000..aaffa1b1 --- /dev/null +++ b/src/main/java/com/interplug/qcast/biz/canvaspopupstatus/CanvasPopupStatusService.java @@ -0,0 +1,91 @@ +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; + +@Service +@RequiredArgsConstructor +public class CanvasPopupStatusService { + + private final CanvasPopupStatusMapper canvasPopupStatusMapper; + + /** + * Canvas Popup Status 조회 + * + * @param objectNo 조회할 object 번호 + * @param planNo 조회할 plan 번호 + * @param popupType 조회할 popup 타입 + * @return 조회된 CanvasPopupStatus 객체 + * @throws QcastException 조회된 데이터가 없을 경우 예외 발생 + */ + 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); + if (cps == null) throw new QcastException(ErrorCode.NOT_FOUND); + return cps; + } + + /** + * Canvas Popup Status 저장 - 이미 존재하는 데이터인 경우 수정, 없는 경우 생성 + * + * @param cps 저장할 CanvasPopupStatus 객체 + * @throws QcastException 저장 중 예외 발생 시 + */ + 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 생성 중 예외 발생 시 + */ + 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 { + // 존재 유무 확인 + selectCanvasPopupStatus(cps.getObjectNo(), cps.getPlanNo(), cps.getPopupType()); + try { + canvasPopupStatusMapper.deleteCanvasPopupStatus(cps); + } catch (Exception e) { + throw new QcastException(ErrorCode.INTERNAL_SERVER_ERROR, e.getMessage()); + } + } +} diff --git a/src/main/java/com/interplug/qcast/biz/canvaspopupstatus/dto/CanvasPopupStatus.java b/src/main/java/com/interplug/qcast/biz/canvaspopupstatus/dto/CanvasPopupStatus.java new file mode 100644 index 00000000..2cad4a04 --- /dev/null +++ b/src/main/java/com/interplug/qcast/biz/canvaspopupstatus/dto/CanvasPopupStatus.java @@ -0,0 +1,28 @@ +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; +} diff --git a/src/main/resources/mappers/canvaspopupstatus/CanvasPopupStatusMapper.xml b/src/main/resources/mappers/canvaspopupstatus/CanvasPopupStatusMapper.xml new file mode 100644 index 00000000..52dcb1ed --- /dev/null +++ b/src/main/resources/mappers/canvaspopupstatus/CanvasPopupStatusMapper.xml @@ -0,0 +1,51 @@ + + + + + + + + + INSERT INTO T_CANVAS_POPUP_STATUS + (object_no, + plan_no, + popup_type, + popup_status) + VALUES (#{objectNo}, + #{planNo}, + #{popupType}, + #{popupStatus}) + + + + UPDATE T_CANVAS_POPUP_STATUS + SET popup_status = #{popupStatus} + WHERE object_no = #{objectNo} + AND plan_no = #{planNo} + AND popup_type = #{popupType} + + + + DELETE + FROM T_CANVAS_POPUP_STATUS + WHERE object_no = #{objectNo} + AND plan_no = #{planNo} + AND popup_type = #{popupType} + + + \ No newline at end of file From 333ae0fa04931314646984e2db67a9075bb8ecd8 Mon Sep 17 00:00:00 2001 From: "DESKTOP-6ARNG1Q\\dlsgk" Date: Thu, 16 Jan 2025 14:07:44 +0900 Subject: [PATCH 10/21] =?UTF-8?q?=EB=B0=9C=EC=A0=84=EC=8B=9C=EB=AE=AC?= =?UTF-8?q?=EB=A0=88=EC=9D=B4=EC=85=98=20=EB=AA=A8=EB=93=88=20=EC=88=9C?= =?UTF-8?q?=EC=84=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pwrGnrSimulation/PwrGnrSimService.java | 74 +++++++++---------- .../pwrGnrSimulation/pwrGnrSimMapper.xml | 2 +- 2 files changed, 36 insertions(+), 40 deletions(-) diff --git a/src/main/java/com/interplug/qcast/biz/pwrGnrSimulation/PwrGnrSimService.java b/src/main/java/com/interplug/qcast/biz/pwrGnrSimulation/PwrGnrSimService.java index 290b2073..72f73060 100644 --- a/src/main/java/com/interplug/qcast/biz/pwrGnrSimulation/PwrGnrSimService.java +++ b/src/main/java/com/interplug/qcast/biz/pwrGnrSimulation/PwrGnrSimService.java @@ -123,44 +123,46 @@ public class PwrGnrSimService { return exceptionRes; } - // 지붕재의 모든 모듈 Item 조회 + // 지붕재의 모든 Group 모듈 Item 조회 pwrGnrSimRequest.setItemGroup("MODULE_"); - List roofModuleList = + List roofGroupModuleList = pwrGnrSimMapper.selectRoofItemList(pwrGnrSimRequest); - // 전체 모듈에서 모듈 그룹형태로 변경 + // 전체 모듈에서 SORT 변경 (총용량 DESC) List moduleGroupList = - roofModuleList.stream() - .collect( - Collectors.groupingBy( - PwrGnrSimRoofResponse::getItemId, // 첫 번째 그룹화 기준 - Collectors.collectingAndThen( - Collectors.toList(), - list -> { - // 그룹화된 첫 번째 요소를 기반으로 새 객체 생성 - ObjectMapper mapper = new ObjectMapper(); - PwrGnrSimRoofResponse setDto = - mapper.convertValue(list.get(0), PwrGnrSimRoofResponse.class); - - // specification 합산 - double totSpecification = - list.stream() - .mapToDouble(response -> response.getTotSpecification()) - .sum(); - - totSpecification = totSpecification / 1000; - - // 합산 결과 설정 - setDto.setTotSpecification(totSpecification); - - return setDto; - }))) - .values() - .stream() + roofGroupModuleList.stream() .sorted( Comparator.comparingDouble(PwrGnrSimRoofResponse::getTotSpecification) .reversed()) // 내림차순 정렬 .collect(Collectors.toList()); + // .collect( + // Collectors.groupingBy( + // PwrGnrSimRoofResponse::getItemId, // 첫 번째 그룹화 기준 + // Collectors.collectingAndThen( + // Collectors.toList(), + // list -> { + // // 그룹화된 첫 번째 요소를 기반으로 새 객체 생성 + // ObjectMapper mapper = new ObjectMapper(); + // PwrGnrSimRoofResponse setDto = + // mapper.convertValue(list.get(0), + // PwrGnrSimRoofResponse.class); + // + // // specification 합산 + // double totSpecification = + // list.stream() + // .mapToDouble(response -> + // response.getTotSpecification()) + // .sum(); + // + // totSpecification = totSpecification / 1000; + // + // // 합산 결과 설정 + // setDto.setTotSpecification(totSpecification); + // + // return setDto; + // }))) + // .values() + // .stream() // 모듈 아이템이 없음. if (moduleGroupList.isEmpty()) { @@ -168,12 +170,7 @@ public class PwrGnrSimService { return exceptionRes; } - // 지붕재의 모든 PCS Item 조회 - // pwrGnrSimRequest.setItemGroup("PC_"); - // List roofPcsList = - // pwrGnrSimMapper.selectRoofItemList(pwrGnrSimRequest); - - // GROUP PCS Group Item 조회 + // 모든GROUP PCS Group Item 조회 List pcsGroupList = pwrGnrSimMapper.selectRoofPcsGroupList(pwrGnrSimRequest); @@ -261,7 +258,7 @@ public class PwrGnrSimService { // 지붕별 모듈정보 셋팅 int j = 0; - for (PwrGnrSimRoofResponse m : roofModuleList) { + for (PwrGnrSimRoofResponse m : moduleGroupList) { if (data.getRoofSurfaceId().equals(m.getRoofSurfaceId())) { dSpecification += m.getTotSpecification(); if (j == 0) { @@ -271,7 +268,6 @@ public class PwrGnrSimService { } else { dModuleInput3[i] = Integer.parseInt(m.getAmount()); } - j++; } } @@ -306,7 +302,7 @@ public class PwrGnrSimService { pwrGnrSimRes.setAreaName(planInfo.getAreaName()); pwrGnrSimRes.setSnowfall(planInfo.getSnowfall()); pwrGnrSimRes.setStandardWindSpeedId(planInfo.getStandardWindSpeedId()); - pwrGnrSimRes.setRoofModuleList(roofModuleList); + pwrGnrSimRes.setRoofModuleList(roofGroupModuleList); pwrGnrSimRes.setPcsList(pcsGroupList); return pwrGnrSimRes; diff --git a/src/main/resources/mappers/pwrGnrSimulation/pwrGnrSimMapper.xml b/src/main/resources/mappers/pwrGnrSimulation/pwrGnrSimMapper.xml index c49984e5..d2a7554d 100644 --- a/src/main/resources/mappers/pwrGnrSimulation/pwrGnrSimMapper.xml +++ b/src/main/resources/mappers/pwrGnrSimulation/pwrGnrSimMapper.xml @@ -103,6 +103,6 @@ AND C.ITEM_GROUP = #{itemGroup} GROUP BY A.ROOF_SURFACE_ID, A.ROOF_SURFACE, A.CLASS_TYPE, A.AZIMUTH, A.ANGLE, A.SLOPE, B.ITEM_ID, B.ITEM_NO ) T - ORDER BY T.SPECIFICATION DESC + ORDER BY T.ROOF_SURFACE_ID ASC, T.ITEM_ID ASC \ No newline at end of file From ed69fa171d61d4e28b2cf2980f932affdae68914 Mon Sep 17 00:00:00 2001 From: "LAPTOP-L3VE7KK2\\USER" Date: Thu, 16 Jan 2025 14:33:25 +0900 Subject: [PATCH 11/21] =?UTF-8?q?=EC=A7=80=EB=B6=95=EB=A9=B4=20=EC=95=84?= =?UTF-8?q?=EC=9D=B4=ED=85=9C=20=EB=AA=A9=EB=A1=9D=20=EC=BF=BC=EB=A6=AC=20?= =?UTF-8?q?=EC=98=A4=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/interplug/qcast/biz/estimate/EstimateService.java | 3 +-- src/main/resources/mappers/estimate/estimateMapper.xml | 8 +++++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/interplug/qcast/biz/estimate/EstimateService.java b/src/main/java/com/interplug/qcast/biz/estimate/EstimateService.java index 1e5d7383..cf738b13 100644 --- a/src/main/java/com/interplug/qcast/biz/estimate/EstimateService.java +++ b/src/main/java/com/interplug/qcast/biz/estimate/EstimateService.java @@ -935,7 +935,6 @@ public class EstimateService { String[] arrItemId = new String[itemList.size()]; int i = 0; for (ItemRequest itemRequest : itemList) { - System.out.println(">>>>>>>>>>>>>>>>" + itemRequest.getItemId()); arrItemId[i++] = itemRequest.getItemId(); } estimateRequest.setArrItemId(arrItemId); @@ -1266,7 +1265,7 @@ public class EstimateService { estimateResponse.setNoteList(noteList); } - // 지붕재 목록 조회 + // 지붕면 목록 조회 RoofInfoResponse roofInfoResponse = new RoofInfoResponse(); List roofList = estimateMapper.selectEstimateRoofList(estimateRequest); List circuitItemList = diff --git a/src/main/resources/mappers/estimate/estimateMapper.xml b/src/main/resources/mappers/estimate/estimateMapper.xml index 1ef6efd6..94c24600 100644 --- a/src/main/resources/mappers/estimate/estimateMapper.xml +++ b/src/main/resources/mappers/estimate/estimateMapper.xml @@ -424,6 +424,7 @@ , T.SLOPE , T.ANGLE , T.CLASS_TYPE + , T.ITEM_ID , SUM(T.AMOUNT) AS AMOUNT , ROUND(SUM(T.AMOUNT * T.SPECIFICATION / 1000), 4) AS VOL_KW FROM @@ -446,8 +447,8 @@ AND P.PLAN_NO = RE.PLAN_NO INNER JOIN T_PART_ROOF_ITEM_ESTIMATE RIE WITH (NOLOCK) ON RE.ROOF_SURFACE_ID = RIE.ROOF_SURFACE_ID - AND RE.OBJECT_NO = RE.OBJECT_NO - AND RE.PLAN_NO = RE.PLAN_NO + AND RE.OBJECT_NO = RIE.OBJECT_NO + AND RE.PLAN_NO = RIE.PLAN_NO INNER JOIN M_ITEM I WITH (NOLOCK) ON RIE.ITEM_ID = I.ITEM_ID WHERE P.OBJECT_NO = #{objectNo} @@ -456,7 +457,8 @@ AND I.ITEM_GROUP = #{schItemGroup} ) T - GROUP BY T.OBJECT_NO, T.PLAN_NO, T.ROOF_SURFACE_ID, T.ROOF_SURFACE, T.SLOPE, T.ANGLE, T.CLASS_TYPE + GROUP BY T.OBJECT_NO, T.PLAN_NO, T.ROOF_SURFACE_ID, T.ROOF_SURFACE, T.SLOPE, T.ANGLE, T.CLASS_TYPE, T.ITEM_ID + ORDER BY T.ROOF_SURFACE_ID, T.ITEM_ID - /* sqlid : com.interplug.qcast.canvasStatus.getCanvasStatusNewObjectNo */ - SELECT #{userId} + FORMAT(GETDATE(), 'yyMMdd') + RIGHT('000' + CAST(ISNULL(MAX(CAST(RIGHT(object_no, 3) AS INT)), 0) + 1 AS VARCHAR (3)), 3) AS objectNo - FROM TB_CANVAS_STATUS - WHERE object_no LIKE #{userId} + FORMAT(GETDATE(), 'yyMMdd') + '%' - + - + - + - + - + - + - + - - /* sqlid : com.interplug.qcast.canvasStatus.insertCanvasStatus 견적서 등록 */ - INSERT INTO TB_CANVAS_STATUS - ( user_id - , object_no - , image_name - , canvas_status - , regist_datetime - , bg_image_name - , map_position_address) - VALUES ( #{userId} - , #{objectNo} - , #{imageName} - , #{canvasStatus} - , GETDATE() - , #{bgImageName} - , #{mapPositionAddress}) - + + /* sqlid : com.interplug.qcast.canvasStatus.insertCanvasStatus 견적서 등록 */ + INSERT INTO TB_CANVAS_STATUS + ( user_id + , object_no + , image_name + , canvas_status + , regist_datetime + , bg_image_name + , map_position_address) + VALUES ( #{userId} + , #{objectNo} + , #{imageName} + , #{canvasStatus} + , GETDATE() + , #{bgImageName} + , #{mapPositionAddress}) + - - /* sqlid : com.interplug.qcast.canvasStatus.updateCanvasStatus 견적서 수정 */ - UPDATE TB_CANVAS_STATUS - SET canvas_status = #{canvasStatus} - , bg_image_name = #{bgImageName} - , map_position_address = #{mapPositionAddress} - , last_edit_datetime = GETDATE() - WHERE id = #{id} - + + /* sqlid : com.interplug.qcast.canvasStatus.updateCanvasStatus 견적서 수정 */ + UPDATE TB_CANVAS_STATUS + SET canvas_status = #{canvasStatus} + , bg_image_name = #{bgImageName} + , map_position_address = #{mapPositionAddress} + , last_edit_datetime = GETDATE() + WHERE id = #{id} + - - /* sqlid : com.interplug.qcast.canvasStatus.deleteObjectNoCanvasStatus 견적서 삭제 */ - DELETE - FROM TB_CANVAS_STATUS - WHERE object_no = #{objectNo} - + + /* sqlid : com.interplug.qcast.canvasStatus.deleteObjectNoCanvasStatus 견적서 삭제 */ + DELETE + FROM TB_CANVAS_STATUS + WHERE object_no = #{objectNo} + - - /* sqlid : com.interplug.qcast.canvasStatus.deleteIdCanvasStatus 이미지(템플릿) 삭제 */ - DELETE - FROM TB_CANVAS_STATUS - WHERE id = #{id} - + + /* sqlid : com.interplug.qcast.canvasStatus.deleteIdCanvasStatus 이미지(템플릿) 삭제 */ + DELETE + FROM TB_CANVAS_STATUS + WHERE id = #{id} + \ No newline at end of file From 558d8b9b5c0c619d6a2c252e37390249938341ae Mon Sep 17 00:00:00 2001 From: Daseul Kim Date: Thu, 16 Jan 2025 15:48:38 +0900 Subject: [PATCH 14/21] =?UTF-8?q?refactor:=20PCS=20=EC=8B=9C=EB=A6=AC?= =?UTF-8?q?=EC=A6=88=20=EC=95=84=EC=9D=B4=ED=85=9C=20=EB=AA=A9=EB=A1=9D=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=20api=20=EC=9D=91=EB=8B=B5=20=ED=95=84?= =?UTF-8?q?=EB=93=9C=20=EC=9D=BC=EB=B6=80=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pcs/series/ApiPcsSeriesItemResponse.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/main/java/com/interplug/qcast/biz/master/dto/pcs/series/ApiPcsSeriesItemResponse.java b/src/main/java/com/interplug/qcast/biz/master/dto/pcs/series/ApiPcsSeriesItemResponse.java index c23003f7..8176e003 100644 --- a/src/main/java/com/interplug/qcast/biz/master/dto/pcs/series/ApiPcsSeriesItemResponse.java +++ b/src/main/java/com/interplug/qcast/biz/master/dto/pcs/series/ApiPcsSeriesItemResponse.java @@ -47,6 +47,24 @@ public class ApiPcsSeriesItemResponse { @Schema(description = "회로수(최대병렬수)") public Integer paralMax; + @Schema(description = "최소직렬수") + public Integer serMinQty; + + @Schema(description = "표준직렬수") + public Integer serMaxQty; + + @Schema(description = "과적직렬수(표준이상)") + public Integer serStdMaxQty; + + @Schema(description = "표준직렬수(표준-한랭지)") + public Integer serColdZoneMaxQty; + + @Schema(description = "과적직렬수(표준이상-한랭지)") + public Integer serStdColdZoneMaxQty; + + @Schema(description = "최소매수(모듈최소매수)") + public Integer moduleMinQty; + @Schema(description = "표준매수(모듈표준매수)") public String moduleStdQty; From 1cff3f578a831a85b138188cb85b429b1fe10f54 Mon Sep 17 00:00:00 2001 From: "LAPTOP-L3VE7KK2\\USER" Date: Thu, 16 Jan 2025 16:14:49 +0900 Subject: [PATCH 15/21] =?UTF-8?q?=EA=B2=AC=EC=A0=81=EC=84=9C=20PDF=20?= =?UTF-8?q?=EB=8B=A4=EC=9A=B4=EB=A1=9C=EB=93=9C=20=EA=B2=BD=EC=B9=AD=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/interplug/qcast/biz/estimate/EstimateService.java | 3 +++ .../template/pdf/pdf_download_quotation_detail_template.html | 1 + 2 files changed, 4 insertions(+) diff --git a/src/main/java/com/interplug/qcast/biz/estimate/EstimateService.java b/src/main/java/com/interplug/qcast/biz/estimate/EstimateService.java index cf738b13..3d8118a9 100644 --- a/src/main/java/com/interplug/qcast/biz/estimate/EstimateService.java +++ b/src/main/java/com/interplug/qcast/biz/estimate/EstimateService.java @@ -1709,6 +1709,9 @@ public class EstimateService { elm = doc.getElementById("objectName1"); elm.text(StringUtils.defaultString(data.getObjectName())); + elm = doc.getElementById("objectNameOmit1"); + elm.text(StringUtils.defaultString(data.getObjectNameOmit())); + elm = doc.getElementById("objectNo1"); elm.text( StringUtils.defaultString(data.getObjectNo()) diff --git a/src/main/resources/template/pdf/pdf_download_quotation_detail_template.html b/src/main/resources/template/pdf/pdf_download_quotation_detail_template.html index 4f73428a..44a1492b 100644 --- a/src/main/resources/template/pdf/pdf_download_quotation_detail_template.html +++ b/src/main/resources/template/pdf/pdf_download_quotation_detail_template.html @@ -367,6 +367,7 @@
件名 : +
From e07445aa28c5cfbb7f5e7f196ca9c3483088927f Mon Sep 17 00:00:00 2001 From: "LAPTOP-L3VE7KK2\\USER" Date: Thu, 16 Jan 2025 17:47:33 +0900 Subject: [PATCH 16/21] =?UTF-8?q?=EA=B2=AC=EC=A0=81=EC=84=9C=20=EC=97=91?= =?UTF-8?q?=EC=85=80/PDF=20=EB=8B=A4=EC=9A=B4=EB=A1=9C=EB=93=9C=EB=AA=85?= =?UTF-8?q?=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../qcast/biz/estimate/EstimateService.java | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/interplug/qcast/biz/estimate/EstimateService.java b/src/main/java/com/interplug/qcast/biz/estimate/EstimateService.java index 3d8118a9..1e40090c 100644 --- a/src/main/java/com/interplug/qcast/biz/estimate/EstimateService.java +++ b/src/main/java/com/interplug/qcast/biz/estimate/EstimateService.java @@ -846,6 +846,7 @@ public class EstimateService { // [7]. 견적서 도면 복사 (추후 개발 필요) // [8]. QSP Q.CAST SEND API + /* List resultList = new ArrayList(); estimateRequest.setObjectNo(estimateCopyRequest.getCopyObjectNo()); estimateRequest.setPlanNo(estimateCopyRequest.getCopyPlanNo()); @@ -860,6 +861,7 @@ public class EstimateService { estimateMapper.updateEstimateApi(estimateRequest); } + */ } catch (Exception e) { throw new QcastException(ErrorCode.INTERNAL_SERVER_ERROR); @@ -1224,12 +1226,6 @@ public class EstimateService { HttpServletRequest request, HttpServletResponse response, EstimateRequest estimateRequest) throws Exception { - // file Name 명이 없는경우 - if (estimateRequest.getFileName() == null || "".equals(estimateRequest.getFileName())) { - estimateRequest.setFileName( - "Quation_Detail_" + new SimpleDateFormat("yyyyMMdd").format(new Date())); - } - EstimateResponse estimateResponse = new EstimateResponse(); String splitStr = "、"; @@ -1237,6 +1233,16 @@ public class EstimateService { // 견적서 상세 조회 estimateResponse = estimateMapper.selectEstimatePdfDetail(estimateRequest); + // file Name 명이 없는경우 + if (estimateRequest.getFileName() == null || "".equals(estimateRequest.getFileName())) { + estimateRequest.setFileName( + estimateResponse.getObjectNo() + + "_" + + estimateResponse.getObjectName() + + "_" + + new SimpleDateFormat("yyyyMMdd").format(new Date())); + } + if ("1".equals(estimateRequest.getSchDisplayFlg())) { estimateResponse.setCustSaleStoreName(estimateResponse.getObjectName()); estimateResponse.setCustOmit(estimateResponse.getObjectNameOmit()); From b928105f893718ecfb62669549ce295ad5b327f2 Mon Sep 17 00:00:00 2001 From: "DESKTOP-6ARNG1Q\\dlsgk" Date: Fri, 17 Jan 2025 09:23:13 +0900 Subject: [PATCH 17/21] =?UTF-8?q?=EB=B0=9C=EC=A0=84=EC=8B=9C=EB=AE=AC?= =?UTF-8?q?=EB=A0=88=EC=9D=B4=EC=85=98=20=EC=9E=91=EC=84=B1=EC=9D=BC=20->?= =?UTF-8?q?=20=EA=B0=B1=EC=8B=A0=EC=9D=BC=EB=A1=9C=20=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=ED=84=B0=20=EC=A1=B0=ED=9A=8C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/mappers/pwrGnrSimulation/pwrGnrSimMapper.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/mappers/pwrGnrSimulation/pwrGnrSimMapper.xml b/src/main/resources/mappers/pwrGnrSimulation/pwrGnrSimMapper.xml index d2a7554d..c9b43a26 100644 --- a/src/main/resources/mappers/pwrGnrSimulation/pwrGnrSimMapper.xml +++ b/src/main/resources/mappers/pwrGnrSimulation/pwrGnrSimMapper.xml @@ -9,7 +9,7 @@ SELECT A.OBJECT_NO /* 물건번호 */ , A.PLAN_NO /* 물건번호 */ - , CONVERT(VARCHAR(10), A.DRAWING_ESTIMATE_CREATE_DATE, 121) AS DRAWING_ESTIMATE_CREATE_DATE/* 작성일 */ + , CONVERT(VARCHAR(10), A.LAST_EDIT_DATETIME, 121) AS DRAWING_ESTIMATE_CREATE_DATE/* 작성일 */ , A.CAPACITY /* 시스템 용량 */ , A.SNOWFALL/* 적설조건 */ , ISNULL(C1.CODE_NM, '') AS STANDARD_WIND_SPEED_ID/* 풍속조건명 */ From 7e4a240e2acc66abdec2c58a87c41b44458ae674 Mon Sep 17 00:00:00 2001 From: Daseul Kim Date: Fri, 17 Jan 2025 16:59:28 +0900 Subject: [PATCH 18/21] =?UTF-8?q?refactor:=20canvas=20status=20=ED=8C=A8?= =?UTF-8?q?=ED=82=A4=EC=A7=80=20=EC=9D=BC=EB=B6=80=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - planNo 추가 - image_name 삭제 - description, 주석 설명 수정 --- .../canvasStatus/CanvasStatusController.java | 12 ++++----- .../biz/canvasStatus/CanvasStatusMapper.java | 18 ++++++------- .../biz/canvasStatus/CanvasStatusService.java | 20 +++++++------- .../biz/canvasStatus/dto/CanvasStatus.java | 2 +- .../dto/CanvasStatusResponse.java | 2 +- .../canvasStatus/canvasStatusMapper.xml | 27 ++++++++++--------- 6 files changed, 41 insertions(+), 40 deletions(-) diff --git a/src/main/java/com/interplug/qcast/biz/canvasStatus/CanvasStatusController.java b/src/main/java/com/interplug/qcast/biz/canvasStatus/CanvasStatusController.java index 80736052..27ef93d3 100644 --- a/src/main/java/com/interplug/qcast/biz/canvasStatus/CanvasStatusController.java +++ b/src/main/java/com/interplug/qcast/biz/canvasStatus/CanvasStatusController.java @@ -17,41 +17,41 @@ import org.springframework.web.bind.annotation.*; public class CanvasStatusController { private final CanvasStatusService canvasStatusService; - @Operation(description = "계정에 해당하는 전체 견적서를 조회 한다.") + @Operation(description = "사용자(userId)에 해당하는 전체 캔버스를 조회 한다.") @GetMapping("/canvas-statuses/{userId}") public List selectAllCanvasStatus(@PathVariable String userId) throws QcastException { return canvasStatusService.selectAllCanvasStatus(userId); } - @Operation(description = "견적서를 조회 한다.") + @Operation(description = "사용자(userId)와 물건번호(objectNo)에 해당하는 캔버스를 조회 한다.") @GetMapping("/canvas-statuses/by-object/{objectNo}/{userId}") public List 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); } - @Operation(description = "견적서를 수정 한다.") + @Operation(description = "캔버스를 수정 한다.") @PutMapping("/canvas-statuses") public void updateCanvasStatus(@RequestBody CanvasStatus cs) throws QcastException { canvasStatusService.updateCanvasStatus(cs); } - @Operation(description = "견적서를 삭제 한다.") + @Operation(description = "물건번호(objectNo)에 해당하는캔버스를 삭제 한다.") @DeleteMapping("/canvas-statuses/by-object/{objectNo}") @ResponseStatus(HttpStatus.NO_CONTENT) public void deleteObjectNoCanvasStatus(@PathVariable String objectNo) throws QcastException { canvasStatusService.deleteObjectNoCanvasStatus(objectNo); } - @Operation(description = "견적서의 이미지(템플릿)를 삭제 한다.") + @Operation(description = "id에 해당하는 캔버스를 삭제 한다.") @DeleteMapping("/canvas-statuses/by-id/{id}") @ResponseStatus(HttpStatus.NO_CONTENT) public void deleteIdCanvasStatus(@PathVariable Integer id) throws QcastException { diff --git a/src/main/java/com/interplug/qcast/biz/canvasStatus/CanvasStatusMapper.java b/src/main/java/com/interplug/qcast/biz/canvasStatus/CanvasStatusMapper.java index df5bb1d5..94c312e0 100644 --- a/src/main/java/com/interplug/qcast/biz/canvasStatus/CanvasStatusMapper.java +++ b/src/main/java/com/interplug/qcast/biz/canvasStatus/CanvasStatusMapper.java @@ -14,30 +14,30 @@ public interface CanvasStatusMapper { // imageName 생성(미사용) public CanvasStatus getCanvasStatusImageAdd(String objectNo); - // 전체 견적서 조회 + // 전체 캔버스 조회 by 사용자(userId) public List selectAllCanvasStatus(String userId); - // 견적서 조회(objectNo/userId) + // 캔버스 조회 by 물건번호(objectNo) && 사용자(userId) public List selectObjectNoCanvasStatus(String objectNo, String userId); - // 견적서 조회(Max id) + // 캔버스 조회 by Max(id) public List getMaxIdCanvasStatus(String objectNo, String userId); - // 견적서 조회(id별) + // 캔버스 조회 by id public List getIdCanvasStatus(Integer id); - // 견적서 조회(objectNo) + // 캔버스 조회 by 물건번호(objectNo) public List 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); } diff --git a/src/main/java/com/interplug/qcast/biz/canvasStatus/CanvasStatusService.java b/src/main/java/com/interplug/qcast/biz/canvasStatus/CanvasStatusService.java index f3483548..281bb3e3 100644 --- a/src/main/java/com/interplug/qcast/biz/canvasStatus/CanvasStatusService.java +++ b/src/main/java/com/interplug/qcast/biz/canvasStatus/CanvasStatusService.java @@ -13,7 +13,7 @@ import org.springframework.stereotype.Service; public class CanvasStatusService { private final CanvasStatusMapper canvasStatusMapper; - // 전체 견적서 조회 + // 사용자(userId)에 해당하는 전체 캔버스 조회 public List selectAllCanvasStatus(String userId) throws QcastException { List result = null; @@ -26,7 +26,7 @@ public class CanvasStatusService { return result; } - // 견적서 조회(objectNo) + // 사용자(userId)와 물건번호(objectNo)에 해당하는 캔버스 조회 public List selectObjectNoCanvasStatus(String objectNo, String userId) throws QcastException { List result = null; @@ -43,7 +43,7 @@ public class CanvasStatusService { return result; } - // 견적서 등록 + // 캔버스 등록 public Integer insertCanvasStatus(CanvasStatus cs) throws QcastException { Integer id = 0; @@ -58,14 +58,14 @@ public class CanvasStatusService { id = maxId.get(0).getId(); } catch (Exception e) { - throw new QcastException(ErrorCode.INVALID_INPUT_VALUE, "견적서 등록 중 오류 발생"); + throw new QcastException(ErrorCode.INVALID_INPUT_VALUE, "캔버스 등록 중 오류 발생"); } // 생성된 id 반환 return id; } - // 견적서 수정 + // 캔버스 수정 public void updateCanvasStatus(CanvasStatus cs) throws QcastException { if (cs.getId() == null) { @@ -79,11 +79,11 @@ public class CanvasStatusService { if (existingStatus.size() > 0) { canvasStatusMapper.updateCanvasStatus(cs); } else { - throw new QcastException(ErrorCode.NOT_FOUND, "수정할 견적서가 존재하지 않습니다."); + throw new QcastException(ErrorCode.NOT_FOUND, "수정할 캔버스가 존재하지 않습니다."); } } - // 전체 견적서 삭제 + // 물건번호(objectNo)에 해당하는 캔버스 삭제 public void deleteObjectNoCanvasStatus(String objectNo) throws QcastException { if (objectNo == null || objectNo.trim().isEmpty()) { @@ -98,11 +98,11 @@ public class CanvasStatusService { if (existingStatus.size() > 0) { canvasStatusMapper.deleteObjectNoCanvasStatus(objectNo); } else { - throw new QcastException(ErrorCode.NOT_FOUND, "삭제할 견적서가 존재하지 않습니다."); + throw new QcastException(ErrorCode.NOT_FOUND, "삭제할 캔버스가 존재하지 않습니다."); } } - // 이미지(템플릿) 삭제 + // id에 해당하는 캔버스 삭제 public void deleteIdCanvasStatus(Integer id) throws QcastException { if (id == null) { @@ -116,7 +116,7 @@ public class CanvasStatusService { if (existingStatus.size() > 0) { canvasStatusMapper.deleteIdCanvasStatus(id); } else { - throw new QcastException(ErrorCode.NOT_FOUND, "삭제할 견적서가 존재하지 않습니다."); + throw new QcastException(ErrorCode.NOT_FOUND, "삭제할 캔버스가 존재하지 않습니다."); } } } diff --git a/src/main/java/com/interplug/qcast/biz/canvasStatus/dto/CanvasStatus.java b/src/main/java/com/interplug/qcast/biz/canvasStatus/dto/CanvasStatus.java index f0a74443..f5e25418 100644 --- a/src/main/java/com/interplug/qcast/biz/canvasStatus/dto/CanvasStatus.java +++ b/src/main/java/com/interplug/qcast/biz/canvasStatus/dto/CanvasStatus.java @@ -7,7 +7,7 @@ public class CanvasStatus { private Integer id; // PK ID private String userId; // 사용자 ID private String objectNo; // 견적서 번호 - private String imageName; // 이미지명 + private String planNo; // 플랜 번호 private String canvasStatus; // 캠버스 상태 private String bgImageName; // 배경 이미지명 private String mapPositionAddress; // 배경 CAD 파일명 diff --git a/src/main/java/com/interplug/qcast/biz/canvasStatus/dto/CanvasStatusResponse.java b/src/main/java/com/interplug/qcast/biz/canvasStatus/dto/CanvasStatusResponse.java index e6530eda..4fb4a44c 100644 --- a/src/main/java/com/interplug/qcast/biz/canvasStatus/dto/CanvasStatusResponse.java +++ b/src/main/java/com/interplug/qcast/biz/canvasStatus/dto/CanvasStatusResponse.java @@ -10,7 +10,7 @@ public class CanvasStatusResponse { private Integer id; // PK ID private String userId; // 사용자 ID private String objectNo; // 견적서 번호 - private String imageName; // 이미지명 + private String planNo; // 플랜 번호 private String canvasStatus; // 캠버스 상태 private Date registDatetime; // 생성일시 private Date lastEditDatetime; // 수정일시 diff --git a/src/main/resources/mappers/canvasStatus/canvasStatusMapper.xml b/src/main/resources/mappers/canvasStatus/canvasStatusMapper.xml index cf2acfb6..92a207e8 100644 --- a/src/main/resources/mappers/canvasStatus/canvasStatusMapper.xml +++ b/src/main/resources/mappers/canvasStatus/canvasStatusMapper.xml @@ -22,11 +22,11 @@ - /* sqlid : com.interplug.qcast.canvasStatus.selectObjectNoCanvasStatus 견적서 조회 */ + /* sqlid : com.interplug.qcast.canvasStatus.selectObjectNoCanvasStatus 캔버스 조회 by (물건번호(objectNo) + and 사용자(userId)) */ SELECT id , user_id , object_no - , image_name + , plan_no , canvas_status , regist_datetime , last_edit_datetime @@ -57,7 +58,7 @@ - /* sqlid : com.interplug.qcast.canvasStatus.getIdCanvasStatus 견적서 조회(id별) */ + /* sqlid : com.interplug.qcast.canvasStatus.getIdCanvasStatus 캔버스 조회 by id */ SELECT id FROM TB_CANVAS_STATUS WHERE id = #{id} @@ -74,7 +75,7 @@