dev #450

Merged
ysCha merged 6 commits from dev into prd-deploy 2026-04-01 13:13:06 +09:00
8 changed files with 199 additions and 15 deletions
Showing only changes of commit 7211101ac5 - Show all commits

View File

@ -110,4 +110,11 @@ public class EstimateController {
public void deleteEstimate(@RequestBody EstimateRequest estimateRequest) throws Exception {
estimateService.deleteEstimate(estimateRequest);
}
@Operation(description = "발전시뮬레이션 필요 데이터 상세 조회를 조회한다.")
@GetMapping("/simulation-estimate-info")
@ResponseStatus(HttpStatus.OK)
public SimulationEstimateResponse selectSimulationEstimateInfo(EstimateRequest estimateRequest) throws Exception {
return estimateService.selectSimulationEstimateInfo(estimateRequest);
}
}

View File

@ -152,4 +152,13 @@ public interface EstimateMapper {
public int updateEstimateInfoInit(EstimateRequest estimateRequest);
public int insertCanvasPopupStatusCopy(EstimateCopyRequest estimateCopyRequest);
// 발전시뮬레이션 지붕재 목록 조회
public List<SimulationRoofResponse> selectSimulationEstimateRoofList(EstimateRequest estimateRequest);
// 발전시뮬레이션 지붕재 아이템 목록 조회
public List<SimulationItemResponse> selectSimulationEstimateRoofModuleList(EstimateRequest estimateRequest);
// 발전시뮬레이션 지붕재 아이템 목록 조회
public List<SimulationItemResponse> selectSimulationEstimateRoofPcsList(EstimateRequest estimateRequest);
}

View File

@ -18,6 +18,7 @@ import java.util.stream.Collectors;
import com.interplug.qcast.biz.canvaspopupstatus.CanvasPopupStatusService;
import com.interplug.qcast.biz.canvaspopupstatus.dto.CanvasPopupStatus;
import com.interplug.qcast.biz.estimate.dto.*;
import com.interplug.qcast.biz.pwrGnrSimulation.dto.PwrGnrSimRoofResponse;
import org.apache.commons.lang3.StringEscapeUtils;
import org.apache.commons.lang3.StringUtils;
@ -41,21 +42,6 @@ import org.springframework.web.util.UriComponentsBuilder;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.interplug.qcast.biz.canvasStatus.CanvasStatusService;
import com.interplug.qcast.biz.canvasStatus.dto.CanvasStatusCopyRequest;
import com.interplug.qcast.biz.estimate.dto.EstimateApiResponse;
import com.interplug.qcast.biz.estimate.dto.EstimateCopyRequest;
import com.interplug.qcast.biz.estimate.dto.EstimateRequest;
import com.interplug.qcast.biz.estimate.dto.EstimateResponse;
import com.interplug.qcast.biz.estimate.dto.EstimateSendRequest;
import com.interplug.qcast.biz.estimate.dto.EstimateSendResponse;
import com.interplug.qcast.biz.estimate.dto.ItemRequest;
import com.interplug.qcast.biz.estimate.dto.ItemResponse;
import com.interplug.qcast.biz.estimate.dto.NoteRequest;
import com.interplug.qcast.biz.estimate.dto.NoteResponse;
import com.interplug.qcast.biz.estimate.dto.PlanSyncResponse;
import com.interplug.qcast.biz.estimate.dto.PriceRequest;
import com.interplug.qcast.biz.estimate.dto.RoofInfoResponse;
import com.interplug.qcast.biz.estimate.dto.RoofRequest;
import com.interplug.qcast.biz.estimate.dto.RoofResponse;
import com.interplug.qcast.biz.file.FileMapper;
import com.interplug.qcast.biz.file.dto.FileRequest;
import com.interplug.qcast.biz.file.dto.FileResponse;
@ -3013,4 +2999,62 @@ public class EstimateService {
return null;
}
}
/**
* 발전시뮬레이션 견적서 상세 조회
*
* @param estimateRequest 견적서 정보(물건번호, 플랜번호)
* @return EstimateResponse 견적서 상세 정보
* @throws Exception
*/
public SimulationEstimateResponse selectSimulationEstimateInfo(EstimateRequest estimateRequest) throws Exception {
// Validation
if (StringUtils.isEmpty(estimateRequest.getObjectNo())) {
throw new QcastException(ErrorCode.INVALID_INPUT_VALUE,
message.getMessage("common.message.required.data", "Object No"));
}
if (StringUtils.isEmpty(estimateRequest.getPlanNo())) {
throw new QcastException(ErrorCode.INVALID_INPUT_VALUE,
message.getMessage("common.message.required.data", "Plan No"));
}
SimulationEstimateResponse response = new SimulationEstimateResponse();
// 견적서 상세 조회
EstimateResponse estimateResponse = estimateMapper.selectEstimateDetail(estimateRequest);
if (estimateResponse == null) {
throw new QcastException(ErrorCode.NOT_FOUND, message.getMessage("common.message.no.data"));
} else {
// 지역코드 셋팅
response.setObjectNo(estimateRequest.getObjectNo());
response.setPlanNo(estimateRequest.getPlanNo());
response.setAreaId(estimateResponse.getAreaId());
// 지붕면 정보 목록 조회
List<SimulationRoofResponse> roofList = estimateMapper.selectSimulationEstimateRoofList(estimateRequest);
// 지붕면 설치 모듈 정보 목록 조회
List<SimulationItemResponse> roofModuleList = estimateMapper.selectSimulationEstimateRoofModuleList(estimateRequest);
// roofModuleList roofSurfaceId 기준으로 그룹핑
Map<String, List<SimulationItemResponse>> roofItemMap = roofModuleList.stream()
.collect(Collectors.groupingBy(SimulationItemResponse::getRoofSurfaceId));
// roofList 항목에 매핑된 roofModuleList 세팅
roofList.forEach(roof ->
roof.setRoofModuleList(
roofItemMap.getOrDefault(roof.getRoofSurfaceId(), Collections.emptyList())
)
);
// 지붕면 설치 PCS 목록 조회
List<SimulationItemResponse> pcsList = estimateMapper.selectSimulationEstimateRoofPcsList(estimateRequest);
response.setRoofList(roofList);
response.setPcsList(pcsList);
}
return response;
}
}

View File

@ -215,6 +215,9 @@ public class EstimateResponse {
@Schema(description = "하위 판매점명")
private String agencySaleStoreName;
@Schema(description = "지역코드")
private String areaId;
@Schema(description = "한랭지 대책여부")
private String coldRegionFlg;

View File

@ -0,0 +1,24 @@
package com.interplug.qcast.biz.estimate.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.util.List;
@Data
public class SimulationEstimateResponse {
@Schema(description = "물건번호")
private String objectNo;
@Schema(description = "플랜번호")
private String planNo;
@Schema(description = "지역코드")
private String areaId;
@Schema(description = "지붕면 정보 목록")
List<SimulationRoofResponse> roofList;
@Schema(description = "PCS 정보 목록")
List<SimulationItemResponse> pcsList;
}

View File

@ -0,0 +1,25 @@
package com.interplug.qcast.biz.estimate.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
import lombok.Setter;
// @Data
@Getter
@Setter
public class SimulationItemResponse {
@Schema(description = "지붕면 ID")
private String roofSurfaceId;
@Schema(description = "아이템 아이디")
private String itemId;
@Schema(description = "아이템 번호")
private String itemNo;
@Schema(description = "아이템명")
private String itemName;
@Schema(description = "매수")
private String amount;
}

View File

@ -0,0 +1,30 @@
package com.interplug.qcast.biz.estimate.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
import lombok.Setter;
import java.util.List;
// @Data
@Getter
@Setter
public class SimulationRoofResponse {
@Schema(description = "지붕면 ID")
private String roofSurfaceId;
@Schema(description = "지붕면")
private String roofSurface;
@Schema(description = "경사")
private String slope;
@Schema(description = "각도")
private String angle;
@Schema(description = "방위각")
private String azimuth;
@Schema(description = "지붕면 모듈 정보 목록")
List<SimulationItemResponse> roofModuleList;
}

View File

@ -63,6 +63,7 @@
, O.SALE_STORE_ID
, B.SALE_STORE_ID AS SAP_SALE_STORE_ID
, B.SAP_SALES_STORE_CD
, OI.AREA_ID
, ISNULL(OI.COLD_REGION_FLG, '0') AS COLD_REGION_FLG
, ISNULL(OI.SALT_AREA_FLG, '0') AS SALT_AREA_FLG
, SS.FIRST_AGENT_ID
@ -1543,4 +1544,45 @@
AND PLAN_NO = #{planNo}
</update>
<select id="selectSimulationEstimateRoofList" parameterType="com.interplug.qcast.biz.estimate.dto.EstimateRequest" resultType="com.interplug.qcast.biz.estimate.dto.SimulationRoofResponse">
/* sqlid : com.interplug.qcast.biz.estimate.selectSimulationEstimateRoofList */
SELECT
RE.ROOF_SURFACE_ID
, RE.OBJECT_NO
, RE.PLAN_NO
, RE.ROOF_SURFACE
, RE.SLOPE
, RE.ANGLE
, RE.AZIMUTH
FROM T_PART_ROOF_ESTIMATE RE WITH (NOLOCK)
WHERE RE.OBJECT_NO = #{objectNo}
AND RE.PLAN_NO = #{planNo}
ORDER BY RE.ROOF_SURFACE_ID
</select>
<select id="selectSimulationEstimateRoofModuleList" parameterType="com.interplug.qcast.biz.estimate.dto.EstimateRequest" resultType="com.interplug.qcast.biz.estimate.dto.SimulationItemResponse">
/* sqlid : com.interplug.qcast.biz.estimate.selectSimulationEstimateRoofModuleList */
SELECT
PIE.ROOF_SURFACE_ID
, PIE.ITEM_ID
, PIE.ITEM_NO
, PIE.ITEM_NAME
, SUM(AMOUNT) AS AMOUNT
FROM T_PART_ROOF_ITEM_ESTIMATE PIE WITH (NOLOCK)
WHERE PIE.OBJECT_NO = #{objectNo}
AND PIE.PLAN_NO = #{planNo}
GROUP BY PIE.ROOF_SURFACE_ID, PIE.ITEM_ID , PIE.ITEM_NO, PIE.ITEM_NAME
</select>
<select id="selectSimulationEstimateRoofPcsList" parameterType="com.interplug.qcast.biz.estimate.dto.EstimateRequest" resultType="com.interplug.qcast.biz.estimate.dto.SimulationItemResponse">
/* sqlid : com.interplug.qcast.biz.estimate.selectSimulationEstimateRoofPcsList */
SELECT
CIE.ITEM_ID
, COUNT(1) AS AMOUNT
FROM T_PART_CIRCUIT_ITEM_ESTIMATE CIE WITH (NOLOCK)
WHERE CIE.OBJECT_NO = #{objectNo}
AND CIE.PLAN_NO = #{planNo}
GROUP BY CIE.ITEM_ID
</select>
</mapper>