From 5525a49fc67b31e397f9cc1a3715f52bd71665ad Mon Sep 17 00:00:00 2001 From: "LAPTOP-L3VE7KK2\\USER" Date: Thu, 14 Nov 2024 17:33:12 +0900 Subject: [PATCH] =?UTF-8?q?=EA=B2=AC=EC=A0=81=EC=84=9C=20BOM=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 --- .../displayItem/DisplayItemController.java | 3 +- .../biz/displayItem/DisplayItemMapper.java | 4 +- .../biz/displayItem/DisplayItemService.java | 17 ++-- .../displayItem/dto/ItemDetailResponse.java | 54 +++++++++++ .../biz/displayItem/dto/ItemResponse.java | 6 ++ .../qcast/biz/estimate/EstimateMapper.java | 3 + .../qcast/biz/estimate/EstimateService.java | 90 +++++++++++++++---- .../qcast/biz/estimate/dto/ItemRequest.java | 11 ++- .../qcast/biz/estimate/dto/ItemResponse.java | 11 ++- .../mappers/displayItem/displayItemMapper.xml | 27 +++++- .../mappers/estimate/estimateMapper.xml | 40 ++++++++- 11 files changed, 234 insertions(+), 32 deletions(-) create mode 100644 src/main/java/com/interplug/qcast/biz/displayItem/dto/ItemDetailResponse.java diff --git a/src/main/java/com/interplug/qcast/biz/displayItem/DisplayItemController.java b/src/main/java/com/interplug/qcast/biz/displayItem/DisplayItemController.java index 71025bca..443e192d 100644 --- a/src/main/java/com/interplug/qcast/biz/displayItem/DisplayItemController.java +++ b/src/main/java/com/interplug/qcast/biz/displayItem/DisplayItemController.java @@ -1,6 +1,7 @@ package com.interplug.qcast.biz.displayItem; import com.interplug.qcast.biz.displayItem.dto.DisplayItemRequest; +import com.interplug.qcast.biz.displayItem.dto.ItemDetailResponse; import com.interplug.qcast.biz.displayItem.dto.ItemResponse; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -37,7 +38,7 @@ public class DisplayItemController { @Operation(description = "제품 상세 정보를 조회한다.") @GetMapping("/item-detail") @ResponseStatus(HttpStatus.OK) - public ItemResponse getItemDetail(@RequestParam("itemId") String itemId) throws Exception { + public ItemDetailResponse getItemDetail(@RequestParam("itemId") String itemId) throws Exception { return displayItemService.getItemDetail(itemId); } } diff --git a/src/main/java/com/interplug/qcast/biz/displayItem/DisplayItemMapper.java b/src/main/java/com/interplug/qcast/biz/displayItem/DisplayItemMapper.java index bac6f917..9a83680c 100644 --- a/src/main/java/com/interplug/qcast/biz/displayItem/DisplayItemMapper.java +++ b/src/main/java/com/interplug/qcast/biz/displayItem/DisplayItemMapper.java @@ -12,7 +12,9 @@ public interface DisplayItemMapper { List getItemList(@Param("saleStoreId") String saleStoreId); - ItemResponse getItemDetail(@Param("itemId") String itemId); + ItemDetailResponse getItemDetail(@Param("itemId") String itemId); + + List selectItemBomList(@Param("itemId") String itemId); /** * 아이템 정보 동기화 diff --git a/src/main/java/com/interplug/qcast/biz/displayItem/DisplayItemService.java b/src/main/java/com/interplug/qcast/biz/displayItem/DisplayItemService.java index 3cd4110d..e4149b17 100644 --- a/src/main/java/com/interplug/qcast/biz/displayItem/DisplayItemService.java +++ b/src/main/java/com/interplug/qcast/biz/displayItem/DisplayItemService.java @@ -45,11 +45,18 @@ public class DisplayItemService { * @param itemId * @return */ - public ItemResponse getItemDetail(String itemId) { + public ItemDetailResponse getItemDetail(String itemId) { - ItemResponse itemResponse = displayItemMapper.getItemDetail(itemId); + ItemDetailResponse itemDetailResponse = displayItemMapper.getItemDetail(itemId); + + if (itemDetailResponse != null) { + // BOM 헤더 아이템인 경우 BOM List를 내려준다. + if ("ERLA".equals(itemDetailResponse.getItemCtgGr())) { + List itemBomList = displayItemMapper.selectItemBomList(itemId); + + itemDetailResponse.setItemBomList(itemBomList); + } - if (itemResponse != null) { // 견적특이사항 관련 데이터 셋팅 String[] arrItemId = {itemId}; @@ -64,10 +71,10 @@ public class DisplayItemService { spnAttrCds += noteResponse.getCode(); } - itemResponse.setSpnAttrCds(spnAttrCds); + itemDetailResponse.setSpnAttrCds(spnAttrCds); } - return itemResponse; + return itemDetailResponse; } /** diff --git a/src/main/java/com/interplug/qcast/biz/displayItem/dto/ItemDetailResponse.java b/src/main/java/com/interplug/qcast/biz/displayItem/dto/ItemDetailResponse.java new file mode 100644 index 00000000..ac739919 --- /dev/null +++ b/src/main/java/com/interplug/qcast/biz/displayItem/dto/ItemDetailResponse.java @@ -0,0 +1,54 @@ +package com.interplug.qcast.biz.displayItem.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import java.util.List; +import lombok.Data; + +@Data +public class ItemDetailResponse { + + @Schema(description = "Itme Id") + private String itemId; + + @Schema(description = "Item No") + private String itemNo; + + @Schema(description = "Item Name") + private String itemName; + + @Schema(description = "Goods No") + private String goodsNo; + + @Schema(description = "Unit") + private String unit; + + @Schema(description = "Specification") + private String specification; + + @Schema(description = "pnow_w") + private String pnowW; + + @Schema(description = "Item Group") + private String itemGroup; + + @Schema(description = "Module Flag") + private String moduleFlg; + + @Schema(description = "PKG Material Flag") + private String pkgMaterialFlg; + + @Schema(description = "File Upload Flag") + private String fileUploadFlg; + + @Schema(description = "Sale Price") + private String salePrice; + + @Schema(description = "Item Ctg Group") + private String itemCtgGr; + + @Schema(description = "견적 특이사항 코드") + private String spnAttrCds; + + @Schema(description = "Bom 목록") + List itemBomList; +} diff --git a/src/main/java/com/interplug/qcast/biz/displayItem/dto/ItemResponse.java b/src/main/java/com/interplug/qcast/biz/displayItem/dto/ItemResponse.java index 1a7dbc1b..53ea1468 100644 --- a/src/main/java/com/interplug/qcast/biz/displayItem/dto/ItemResponse.java +++ b/src/main/java/com/interplug/qcast/biz/displayItem/dto/ItemResponse.java @@ -42,6 +42,12 @@ public class ItemResponse { @Schema(description = "Sale Price") private String salePrice; + @Schema(description = "Item Ctg Group") + private String itemCtgGr; + + @Schema(description = "Bom Amount") + private String bomAmount; + @Schema(description = "견적 특이사항 코드") private String spnAttrCds; } 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 594c6392..5bce0c41 100644 --- a/src/main/java/com/interplug/qcast/biz/estimate/EstimateMapper.java +++ b/src/main/java/com/interplug/qcast/biz/estimate/EstimateMapper.java @@ -21,6 +21,9 @@ public interface EstimateMapper { // 아이템 마스터 목록 조회 public List selectItemMasterList(EstimateRequest estimateRequest); + // 아이템 마스터 BOM 목록 조회 + public List selectItemMasterBomList(String itemId); + // 견적서 지붕재 인증용량 조회 public String selectEstimateRoofCertVolKw(EstimateRequest estimateRequest); 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 c2a7902d..1e61c381 100644 --- a/src/main/java/com/interplug/qcast/biz/estimate/EstimateService.java +++ b/src/main/java/com/interplug/qcast/biz/estimate/EstimateService.java @@ -345,10 +345,13 @@ public class EstimateService { estimateRequest.setArrItemId(arrItemId); // 아이템의 마스터 정보 및 정가 정보 조회 List itemResponseList = estimateMapper.selectItemMasterList(estimateRequest); + // BOM 정보 목록 + List estimateBomList = new ArrayList(); int j = 1; for (ItemRequest itemRequest : itemList) { - itemRequest.setDispOrder(String.valueOf(j++)); + int dispOrder = 100 * j++; + itemRequest.setDispOrder(String.valueOf(dispOrder)); for (ItemResponse itemResponse : itemResponseList) { if (itemRequest.getItemId().equals(itemResponse.getItemId())) { @@ -362,11 +365,52 @@ public class EstimateService { itemRequest.setFileUploadFlg(itemResponse.getFileUploadFlg()); itemRequest.setPkgMaterialFlg(itemResponse.getPkgMaterialFlg()); itemRequest.setItemGroup(itemResponse.getItemGroup()); + itemRequest.setItemCtgGr(itemResponse.getItemCtgGr()); itemRequest.setPartAdd("0"); itemRequest.setDelFlg("0"); break; } } + + // 아이템 BOM Header인 경우 컴포넌트 등록 처리 + if ("ERLA".equals(itemRequest.getItemCtgGr())) { + List itemBomList = + estimateMapper.selectItemMasterBomList(itemRequest.getItemId()); + + int k = 1; + for (ItemResponse itemResponse : itemBomList) { + ItemRequest bomItem = new ItemRequest(); + + bomItem.setPaDispOrder(String.valueOf(dispOrder)); + bomItem.setDispOrder(String.valueOf(dispOrder + k++)); + bomItem.setItemId(itemResponse.getItemId()); + bomItem.setItemNo(itemResponse.getItemNo()); + bomItem.setItemName(itemResponse.getItemName()); + bomItem.setUnit(itemResponse.getUnit()); + bomItem.setPnowW(itemResponse.getPnowW()); + bomItem.setSpecification(itemResponse.getPnowW()); + bomItem.setAmount( + String.valueOf( + Integer.parseInt(itemResponse.getBomAmount()) + * Integer.parseInt(itemRequest.getAmount()))); + bomItem.setBomAmount(itemResponse.getBomAmount()); + bomItem.setUnitPrice(itemResponse.getSalePrice()); + bomItem.setSalePrice(itemResponse.getSalePrice()); + bomItem.setFileUploadFlg(itemResponse.getFileUploadFlg()); + bomItem.setPkgMaterialFlg(itemResponse.getPkgMaterialFlg()); + bomItem.setItemGroup(itemResponse.getItemGroup()); + bomItem.setItemCtgGr(itemResponse.getItemCtgGr()); + bomItem.setPartAdd("0"); + bomItem.setDelFlg("0"); + + estimateBomList.add(bomItem); + } + } + } + + // BOM 컴포넌트 추가 + for (ItemRequest estimateBom : estimateBomList) { + itemList.add(estimateBom); } // [4]. 견적특이사항 관련 데이터 셋팅 @@ -438,6 +482,11 @@ public class EstimateService { String moduleModel = ""; String pcTypeNo = ""; for (ItemRequest itemRequest : itemList) { + if (StringUtils.isEmpty(itemRequest.getDispOrder())) { + throw new QcastException( + ErrorCode.INVALID_INPUT_VALUE, + message.getMessage("common.message.required.data", "Display Order")); + } if (StringUtils.isEmpty(itemRequest.getItemId())) { throw new QcastException( ErrorCode.INVALID_INPUT_VALUE, @@ -516,12 +565,12 @@ public class EstimateService { // 견적서 아이템 신규 추가 String hisNo = estimateMapper.selectEstimateItemHisNo(estimateRequest); // 아이템 히스토리 번호 조회 - int j = 1, k = 1; for (ItemRequest itemRequest : itemList) { itemRequest.setHisNo(hisNo); itemRequest.setObjectNo(estimateRequest.getObjectNo()); itemRequest.setPlanNo(estimateRequest.getPlanNo()); - itemRequest.setDispOrder(String.valueOf(k++)); + itemRequest.setBomAmount( + !StringUtils.isEmpty(itemRequest.getBomAmount()) ? itemRequest.getBomAmount() : "0"); itemRequest.setPartAdd( !StringUtils.isEmpty(itemRequest.getPartAdd()) ? itemRequest.getPartAdd() : "0"); itemRequest.setItemChangeFlg( @@ -533,8 +582,6 @@ public class EstimateService { estimateMapper.insertEstimateItemHis(itemRequest); if (!"1".equals(itemRequest.getDelFlg())) { - itemRequest.setDispOrder(String.valueOf(j++)); - estimateMapper.insertEstimateItem(itemRequest); } } @@ -738,6 +785,10 @@ public class EstimateService { for (ItemResponse itemResponse : estimateItemList) { itemResponse.setNo(String.valueOf(j++)); + System.out.println(">>>>>>>>>" + itemResponse.getSalePrice()); + System.out.println(">>>>>>>>>" + itemResponse.getAmount()); + System.out.println(">>>>>>>>>" + itemResponse.getSaleTotPrice()); + // 문자열 통화로 변환 처리 itemResponse.setSalePrice( String.format("%1$,.0f", Double.parseDouble(itemResponse.getSalePrice()))); @@ -902,26 +953,29 @@ public class EstimateService { // 아이템 단가 합산 itemResponse.setSaleTotPrice(String.valueOf(salePrice.multiply(amount))); - // YJSS인 경우 (PKG 단가 * 모듈용량) + 패키지 제외상품 총 합산 - // YJOD인 경우 모든 아이템의 총 합산 - if ("YJSS".equals(estimateType)) { - if ("1".equals(itemResponse.getPkgMaterialFlg())) { // 패키지 제외상품 여부(1) - supplyPrice = supplyPrice.add(salePrice.multiply(amount)); + // 컴포넌트는 제외하고 계산 + if (StringUtils.isEmpty(itemResponse.getPaDispOrder())) { + // YJSS인 경우 (PKG 단가 * 모듈용량) + 패키지 제외상품 총 합산 + // YJOD인 경우 모든 아이템의 총 합산 + if ("YJSS".equals(estimateType)) { + if ("1".equals(itemResponse.getPkgMaterialFlg())) { // 패키지 제외상품 여부(1) + supplyPrice = supplyPrice.add(salePrice.multiply(amount)); + } else { + if ("1".equals(itemResponse.getModuleFlg())) { + totVol = totVol.add(pnowW.multiply(amount)); + } + } } else { if ("1".equals(itemResponse.getModuleFlg())) { totVol = totVol.add(pnowW.multiply(amount)); } - } - } else { - if ("1".equals(itemResponse.getModuleFlg())) { - totVol = totVol.add(pnowW.multiply(amount)); + + supplyPrice = supplyPrice.add(salePrice.multiply(amount)); } - supplyPrice = supplyPrice.add(salePrice.multiply(amount)); + // 주문수량 더하기 + totAmount = totAmount.add(amount); } - - // 주문수량 더하기 - totAmount = totAmount.add(amount); } if ("YJSS".equals(estimateType)) { 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 fe6ebe19..cdaf6adf 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 @@ -20,9 +20,12 @@ public class ItemRequest { @Schema(description = "아이템 ID") private String itemId; - @Schema(description = "정렬순서") + @Schema(description = "정렬번호") private String dispOrder; + @Schema(description = "부모 정렬번호") + private String paDispOrder; + @Schema(description = "아이템 번호") private String itemNo; @@ -38,6 +41,9 @@ public class ItemRequest { @Schema(description = "수량") private String amount; + @Schema(description = "BOM 수량") + private String bomAmount; + @Schema(description = "변경수량") private String amountChange; @@ -71,6 +77,9 @@ public class ItemRequest { @Schema(description = "아이템 그룹코드") private String itemGroup; + @Schema(description = "아이템 CTG 그룹코드") + private String itemCtgGr; + @Schema(description = "히스토리 번호") private String hisNo; diff --git a/src/main/java/com/interplug/qcast/biz/estimate/dto/ItemResponse.java b/src/main/java/com/interplug/qcast/biz/estimate/dto/ItemResponse.java index bc6df38e..05ca03b7 100644 --- a/src/main/java/com/interplug/qcast/biz/estimate/dto/ItemResponse.java +++ b/src/main/java/com/interplug/qcast/biz/estimate/dto/ItemResponse.java @@ -14,9 +14,12 @@ public class ItemResponse { @Schema(description = "플랜번호") private String planNo; - @Schema(description = "노출번호") + @Schema(description = "정렬번호") private String dispOrder; + @Schema(description = "부모 정렬번호") + private String paDispOrder; + @Schema(description = "번호") private String no; @@ -38,6 +41,9 @@ public class ItemResponse { @Schema(description = "수량") private String amount; + @Schema(description = "BOM 수량") + private String bomAmount; + @Schema(description = "단가") private String salePrice; @@ -65,6 +71,9 @@ public class ItemResponse { @Schema(description = "아이템 그룹코드") private String itemGroup; + @Schema(description = "아이템 CTG 그룹코드") + private String itemCtgGr; + @Schema(description = "모듈여부") private String moduleFlg; } diff --git a/src/main/resources/mappers/displayItem/displayItemMapper.xml b/src/main/resources/mappers/displayItem/displayItemMapper.xml index fc7118f9..22c63523 100644 --- a/src/main/resources/mappers/displayItem/displayItemMapper.xml +++ b/src/main/resources/mappers/displayItem/displayItemMapper.xml @@ -82,7 +82,7 @@ ORDER BY TT.DISP_ORDER - /* sqlid : com.interplug.qcast.displayItem.getItemDetail */ SELECT MI.ITEM_ID @@ -96,6 +96,7 @@ , MI.MODULE_FLG , MI.PKG_MATERIAL_FLG , MI.FILE_UPLOAD_FLG + , MI.ITEM_CTG_GR , ISNULL(MPPM.SALE_PRICE, '0') AS SALE_PRICE FROM M_ITEM MI LEFT OUTER JOIN M_PRICE_PATTERN_MONEY MPPM @@ -105,6 +106,30 @@ AND MI.ITEM_ID = #{itemId} + + /* sqlid : com.interplug.qcast.displayItem.setItemSyncSave */ MERGE M_ITEM AS A diff --git a/src/main/resources/mappers/estimate/estimateMapper.xml b/src/main/resources/mappers/estimate/estimateMapper.xml index 0ce51d25..01242caa 100644 --- a/src/main/resources/mappers/estimate/estimateMapper.xml +++ b/src/main/resources/mappers/estimate/estimateMapper.xml @@ -169,12 +169,14 @@ PE.OBJECT_NO , PE.PLAN_NO , PE.DISP_ORDER + , PE.PA_DISP_ORDER , PE.ITEM_ID , PE.ITEM_NO , PE.ITEM_NAME , PE.UNIT , PE.SPECIFICATION , PE.AMOUNT + , PE.BOM_AMOUNT , PE.UNIT_PRICE , PE.SALE_PRICE , PE.FILE_UPLOAD_FLG @@ -204,6 +206,7 @@ , I.ITEM_GROUP , I.PKG_MATERIAL_FLG , I.FILE_UPLOAD_FLG + , I.ITEM_CTG_GR , ISNULL(PPM.SALE_PRICE, '0') AS SALE_PRICE FROM M_ITEM I WITH (NOLOCK) LEFT OUTER JOIN M_PRICE_PATTERN_MONEY PPM @@ -215,6 +218,27 @@ + +