diff --git a/src/main/java/com/interplug/qcast/biz/estimate/EstimateController.java b/src/main/java/com/interplug/qcast/biz/estimate/EstimateController.java index 4552609b..6fe3ec28 100644 --- a/src/main/java/com/interplug/qcast/biz/estimate/EstimateController.java +++ b/src/main/java/com/interplug/qcast/biz/estimate/EstimateController.java @@ -59,9 +59,9 @@ public class EstimateController { @Operation(description = "견적서를 복사한다.") @PostMapping("/save-estimate-copy") @ResponseStatus(HttpStatus.CREATED) - public EstimateResponse insertEstimateCopy(@RequestBody EstimateRequest estimateRequest) + public EstimateResponse insertEstimateCopy(@RequestBody EstimateCopyRequest estimateCopyRequest) throws Exception { - return estimateService.insertEstimateCopy(estimateRequest); + return estimateService.insertEstimateCopy(estimateCopyRequest); } @Operation(description = "견적서를 엑셀로 다운로드한다.") 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 5bce0c41..5e287c47 100644 --- a/src/main/java/com/interplug/qcast/biz/estimate/EstimateMapper.java +++ b/src/main/java/com/interplug/qcast/biz/estimate/EstimateMapper.java @@ -30,6 +30,9 @@ public interface EstimateMapper { // 견적서 지붕재 목록 조회 public List selectEstimateRoofList(EstimateRequest estimateRequest); + // 견적서 지붕재 아이템 목록 조회 + public List selectEstimateRoofItemList(EstimateRequest estimateRequest); + // 견적서 지붕재 PC 목록 조회 public List selectEstimateRoofPcList(EstimateRequest estimateRequest); @@ -76,5 +79,5 @@ public interface EstimateMapper { public int deleteEstimateItemList(EstimateRequest estimateRequest); // 견적서 복사 - public int insertEstimateCopy(EstimateRequest estimateRequest); + public int insertEstimateCopy(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 f6d6108a..3fa16552 100644 --- a/src/main/java/com/interplug/qcast/biz/estimate/EstimateService.java +++ b/src/main/java/com/interplug/qcast/biz/estimate/EstimateService.java @@ -6,9 +6,8 @@ import com.interplug.qcast.biz.file.FileMapper; import com.interplug.qcast.biz.file.dto.FileRequest; import com.interplug.qcast.biz.file.dto.FileResponse; import com.interplug.qcast.biz.object.ObjectMapper; +import com.interplug.qcast.biz.object.dto.ObjectRequest; import com.interplug.qcast.biz.object.dto.ObjectResponse; -import com.interplug.qcast.biz.object.dto.PlanRequest; -import com.interplug.qcast.biz.object.dto.PlanResponse; import com.interplug.qcast.biz.pwrGnrSimulation.PwrGnrSimService; import com.interplug.qcast.biz.pwrGnrSimulation.dto.PwrGnrSimGuideResponse; import com.interplug.qcast.biz.pwrGnrSimulation.dto.PwrGnrSimRequest; @@ -50,6 +49,9 @@ public class EstimateService { @Autowired Messages message; + @Value("${file.ini.root.path}") + private String baseDirPath; + @Value("${qsp.url}") private String QSP_API_URL; @@ -607,98 +609,186 @@ public class EstimateService { /** * 견적서 복사 * - * @param estimateRequest 견적서 복사 정보 + * @param estimateCopyRequest 견적서 복사 정보 * @return EstimateResponse 견적서 복사 후 상세 정보 * @throws Exception */ - public EstimateResponse insertEstimateCopy(EstimateRequest estimateRequest) throws Exception { + public EstimateResponse insertEstimateCopy(EstimateCopyRequest estimateCopyRequest) + throws Exception { // Validation - if (StringUtils.isEmpty(estimateRequest.getObjectNo())) { + if (StringUtils.isEmpty(estimateCopyRequest.getObjectNo())) { throw new QcastException( ErrorCode.INVALID_INPUT_VALUE, message.getMessage("common.message.required.data", "Object No")); } - if (StringUtils.isEmpty(estimateRequest.getPlanNo())) { + if (StringUtils.isEmpty(estimateCopyRequest.getPlanNo())) { throw new QcastException( ErrorCode.INVALID_INPUT_VALUE, message.getMessage("common.message.required.data", "Plan No")); } - + // 응답 객체 EstimateResponse response = new EstimateResponse(); - // [1]. 총 플랜 목록 조회 및 제약조건 처리 (플랜 10개까지만 등록) - PlanRequest planRequest = new PlanRequest(); - planRequest.setObjectNo(estimateRequest.getObjectNo()); - List planList = objectMapper.selectPlanList(planRequest); - if (planList.size() > 9) { - throw new QcastException( - ErrorCode.INTERNAL_SERVER_ERROR, message.getMessage("common.message.plan.save.limit")); - } + try { - List itemList = new ArrayList(); - List estimateItemList = estimateMapper.selectEstimateItemList(estimateRequest); - for (ItemResponse itemResponse : estimateItemList) { - ItemRequest itemRequest = new ItemRequest(); - itemRequest.setItemId(itemResponse.getItemId()); - itemRequest.setAmount(itemResponse.getAmount()); + ObjectRequest objectRequest = new ObjectRequest(); + objectRequest.setSaleStoreId(estimateCopyRequest.getCopySaleStoreId()); + objectRequest.setReceiveUser( + StringUtils.defaultString(estimateCopyRequest.getCopyReceiveUser())); + objectRequest.setDelFlg("0"); + objectRequest.setTempFlg("0"); + objectRequest.setTempDelFlg("0"); + objectRequest.setUserId(estimateCopyRequest.getUserId()); - itemList.add(itemRequest); - } + // [1]. 신규 물건번호 생성 + objectMapper.insertObjectNo(objectRequest); + objectRequest.setObjectNo(estimateCopyRequest.getObjectNo()); + objectRequest.setCopyObjectNo(objectMapper.selectObjectNo(objectRequest)); - // [2]. 아이템 관련 데이터 셋팅 (복사 시 정가 셋팅) - String[] arrItemId = new String[itemList.size()]; - int i = 0; - for (ItemRequest itemRequest : itemList) { - arrItemId[i++] = itemRequest.getItemId(); - } - estimateRequest.setArrItemId(arrItemId); - // 아이템의 마스터 정보 및 정가 정보 조회 - List itemResponseList = estimateMapper.selectItemMasterList(estimateRequest); + // [2]. 물건정보 복사 + objectRequest.setContentsPath(baseDirPath + "\\\\" + objectRequest.getCopyObjectNo()); + objectMapper.insertObjectCopy(objectRequest); + objectRequest.setObjectNo(objectRequest.getCopyObjectNo()); + objectMapper.updateObjectDelivery(objectRequest); - int j = 1; - for (ItemRequest itemRequest : itemList) { - itemRequest.setDispOrder(String.valueOf(j++)); + // [3]. 아이템 관련 데이터 셋팅 (복사 시 정가 셋팅) + EstimateRequest estimateRequest = new EstimateRequest(); + estimateRequest.setObjectNo(estimateCopyRequest.getObjectNo()); + estimateRequest.setPlanNo(estimateCopyRequest.getPlanNo()); - for (ItemResponse itemResponse : itemResponseList) { - if (itemRequest.getItemId().equals(itemResponse.getItemId())) { - itemRequest.setItemNo(itemResponse.getItemNo()); - itemRequest.setItemName(itemResponse.getItemName()); - itemRequest.setUnit(itemResponse.getUnit()); - itemRequest.setPnowW(itemResponse.getPnowW()); - itemRequest.setSpecification(itemResponse.getPnowW()); - itemRequest.setUnitPrice(itemResponse.getSalePrice()); - itemRequest.setSalePrice(itemResponse.getSalePrice()); - itemRequest.setPkgMaterialFlg(itemResponse.getPkgMaterialFlg()); - itemRequest.setItemGroup(itemResponse.getItemGroup()); + List itemList = new ArrayList(); + List estimateItemList = estimateMapper.selectEstimateItemList(estimateRequest); + for (ItemResponse itemResponse : estimateItemList) { + ItemRequest itemRequest = new ItemRequest(); + itemRequest.setDispOrder(itemResponse.getDispOrder()); + itemRequest.setPaDispOrder(itemResponse.getPaDispOrder()); + itemRequest.setItemId(itemResponse.getItemId()); + itemRequest.setAmount(itemResponse.getAmount()); + itemRequest.setBomAmount(itemResponse.getBomAmount()); + itemRequest.setSpecialNoteCd(itemResponse.getSpecialNoteCd()); + itemRequest.setItemChangeFlg("0"); - break; + itemList.add(itemRequest); + } + + String[] arrItemId = new String[itemList.size()]; + int i = 0; + for (ItemRequest itemRequest : itemList) { + arrItemId[i++] = itemRequest.getItemId(); + } + estimateRequest.setArrItemId(arrItemId); + // 아이템의 마스터 정보 및 정가 정보 조회 + List itemResponseList = estimateMapper.selectItemMasterList(estimateRequest); + + for (ItemRequest itemRequest : itemList) { + for (ItemResponse itemResponse : itemResponseList) { + if (itemRequest.getItemId().equals(itemResponse.getItemId())) { + itemRequest.setItemNo(itemResponse.getItemNo()); + itemRequest.setItemName(itemResponse.getItemName()); + itemRequest.setUnit(itemResponse.getUnit()); + itemRequest.setPnowW(itemResponse.getPnowW()); + itemRequest.setSpecification(itemResponse.getPnowW()); + itemRequest.setUnitPrice(itemResponse.getSalePrice()); + itemRequest.setSalePrice(itemResponse.getSalePrice()); + itemRequest.setPkgMaterialFlg(itemResponse.getPkgMaterialFlg()); + itemRequest.setFileUploadFlg(itemResponse.getFileUploadFlg()); + itemRequest.setItemGroup(itemResponse.getItemGroup()); + + break; + } } } + + // [4]. 견적서 복사 + estimateCopyRequest.setCopyObjectNo(objectRequest.getObjectNo()); + estimateCopyRequest.setCopyPlanNo("1"); + estimateMapper.insertEstimateCopy(estimateCopyRequest); + + // [5]. 견적서 아이템 복사 + for (ItemRequest itemRequest : itemList) { + itemRequest.setObjectNo(estimateCopyRequest.getCopyObjectNo()); + itemRequest.setPlanNo(estimateCopyRequest.getCopyPlanNo()); + itemRequest.setPartAdd( + !StringUtils.isEmpty(itemRequest.getPartAdd()) ? itemRequest.getPartAdd() : "0"); + itemRequest.setItemChangeFlg( + !StringUtils.isEmpty(itemRequest.getItemChangeFlg()) + ? itemRequest.getItemChangeFlg() + : "0"); + itemRequest.setUserId(estimateCopyRequest.getUserId()); + + estimateMapper.insertEstimateItem(itemRequest); + } + + // [6]. 견적서 지붕재 복사 + List roofList = estimateMapper.selectEstimateRoofList(estimateRequest); + List roofItemList = estimateMapper.selectEstimateRoofItemList(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()); + itemRequest.setCircuit(roofItemResponse.getCircuit()); + + estimateMapper.insertEstimateRoofItem(itemRequest); + } + } + + // [7]. 견적서 도면 복사 (추후 개발 필요) + + // [8]. QSP Q.CAST SEND API + List resultList = new ArrayList(); + estimateRequest.setObjectNo(estimateCopyRequest.getCopyObjectNo()); + estimateRequest.setPlanNo(estimateCopyRequest.getCopyPlanNo()); + resultList = this.sendEstimateApi(estimateRequest); + // API에서 받은 문서번호 업데이트 + for (EstimateSendResponse result : resultList) { + estimateRequest.setObjectNo(result.getObjectNo()); + estimateRequest.setPlanNo(result.getPlanNo()); + estimateRequest.setDocNo(result.getDocNo()); + estimateRequest.setSyncFlg(result.getSyncFlg()); + + estimateMapper.updateEstimateApi(estimateRequest); + } + + } catch (Exception e) { + throw new QcastException(ErrorCode.INTERNAL_SERVER_ERROR); } - // 견적서 복사 - estimateMapper.insertEstimateCopy(estimateRequest); - - // 견적서 아이템 복사 - for (ItemRequest itemRequest : itemList) { - itemRequest.setObjectNo(estimateRequest.getObjectNo()); - itemRequest.setPlanNo(estimateRequest.getCopyPlanNo()); - itemRequest.setPartAdd( - !StringUtils.isEmpty(itemRequest.getPartAdd()) ? itemRequest.getPartAdd() : "0"); - itemRequest.setItemChangeFlg( - !StringUtils.isEmpty(itemRequest.getItemChangeFlg()) - ? itemRequest.getItemChangeFlg() - : "0"); - itemRequest.setUserId(estimateRequest.getUserId()); - - estimateMapper.insertEstimateItem(itemRequest); - } - - // 도면 복사 (추후 개발 필요) - - // 리턴 - response.setObjectNo(estimateRequest.getObjectNo()); - response.setPlanNo(estimateRequest.getCopyPlanNo()); + // [9]. 최종 생성 물건번호 리턴 + response.setObjectNo(estimateCopyRequest.getCopyObjectNo()); + response.setPlanNo(estimateCopyRequest.getCopyPlanNo()); return response; } diff --git a/src/main/java/com/interplug/qcast/biz/estimate/dto/EstimateCopyRequest.java b/src/main/java/com/interplug/qcast/biz/estimate/dto/EstimateCopyRequest.java new file mode 100644 index 00000000..e90d5442 --- /dev/null +++ b/src/main/java/com/interplug/qcast/biz/estimate/dto/EstimateCopyRequest.java @@ -0,0 +1,31 @@ +package com.interplug.qcast.biz.estimate.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +public class EstimateCopyRequest { + @Schema(description = "물건번호") + private String objectNo; + + @Schema(description = "플랜번호") + private String planNo; + + @Schema(description = "판매점ID") + private String saleStoreId; + + @Schema(description = "복사 판매점 ID") + private String copySaleStoreId; + + @Schema(description = "복사 물건번호") + private String copyObjectNo; + + @Schema(description = "복사 플랜번호") + private String copyPlanNo; + + @Schema(description = "복사 담당자명") + private String copyReceiveUser; + + @Schema(description = "사용자아이디") + private String userId; +} 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 d7d9073f..8d7b428b 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 @@ -156,9 +156,6 @@ public class EstimateRequest { @Schema(description = "비고") private String remarks; - @Schema(description = "복사 플랜번호") - private String copyPlanNo; - @Schema(description = "아이템번호 목록") private String[] arrItemId; 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 cdaf6adf..960a29a7 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 @@ -71,6 +71,9 @@ public class ItemRequest { @Schema(description = "PC 아이템 ID") private String pcItemId; + @Schema(description = "회로") + private String circuit; + @Schema(description = "W") private String pnowW; 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 4aebc2c5..1a2aedcc 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 @@ -48,6 +48,9 @@ public class RoofRequest { @Schema(description = "각도") private String angle; + @Schema(description = "경사각 선택코드") + private String classType; + @Schema(description = "방위각") private String azimuth; 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 77b9c447..927a570a 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 @@ -77,12 +77,24 @@ public class RoofResponse { @Schema(description = "아이템 번호") private String itemNo; + @Schema(description = "아이템명") + private String itemName; + + @Schema(description = "W") + private String specification; + @Schema(description = "매수") private String amount; @Schema(description = "용량") private String volKw; + @Schema(description = "PC 아이템 ID") + private String pcItemId; + + @Schema(description = "회로") + private String circuit; + @Schema(description = "Pc 모듈 매수") private String pcModuleAmount; } 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 00b9bb7c..1d7fb162 100644 --- a/src/main/java/com/interplug/qcast/biz/object/ObjectMapper.java +++ b/src/main/java/com/interplug/qcast/biz/object/ObjectMapper.java @@ -43,6 +43,9 @@ public interface ObjectMapper { // 물건정보 등록 public int insertObject(ObjectRequest objectRequest); + // 물건정보 복사 + public int insertObjectCopy(ObjectRequest objectRequest); + // 물건정보 수정 public int updateObject(ObjectRequest objectRequest); diff --git a/src/main/java/com/interplug/qcast/biz/object/dto/ObjectRequest.java b/src/main/java/com/interplug/qcast/biz/object/dto/ObjectRequest.java index d9a36cbe..4a07696a 100644 --- a/src/main/java/com/interplug/qcast/biz/object/dto/ObjectRequest.java +++ b/src/main/java/com/interplug/qcast/biz/object/dto/ObjectRequest.java @@ -152,6 +152,9 @@ public class ObjectRequest { @Schema(description = "검색 - 정렬순서") private String schSortType; + @Schema(description = "복사 물건번호") + private String copyObjectNo; + // 페이징정보 @Schema(description = "시작 Row") private String startRow; diff --git a/src/main/resources/mappers/estimate/estimateMapper.xml b/src/main/resources/mappers/estimate/estimateMapper.xml index 3b1c8d38..49e45638 100644 --- a/src/main/resources/mappers/estimate/estimateMapper.xml +++ b/src/main/resources/mappers/estimate/estimateMapper.xml @@ -291,6 +291,7 @@ , P.PLAN_NO , ROUND(CAST(P.SETUP_HEIGHT AS FLOAT), 2) AS SETUP_HEIGHT , P.SURFACE_TYPE + , RE.ROOF_NO , RE.ROOF_SURFACE , RE.ROOF_MATERIAL_ID , RE.SUPPORT_METHOD_ID @@ -319,6 +320,25 @@ AND P.PLAN_NO = #{planNo} + +