견적서 API 수정(회로구성도 추가 개발)

This commit is contained in:
LAPTOP-L3VE7KK2\USER 2025-01-13 15:01:27 +09:00
parent 8c2e191247
commit 5efa39fe64
12 changed files with 123 additions and 77 deletions

View File

@ -3,6 +3,7 @@ package com.interplug.qcast.batch;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import lombok.RequiredArgsConstructor;
import org.springframework.batch.core.BatchStatus;
import org.springframework.batch.core.ExitStatus;
import org.springframework.batch.core.Job;
@ -19,7 +20,6 @@ import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import lombok.RequiredArgsConstructor;
@RestController
@RequiredArgsConstructor
@ -310,7 +310,7 @@ public class JobLauncherController {
* @throws JobParametersInvalidException
* @throws JobRestartException
*/
@Scheduled(cron = "1 0 0 * * *")
@Scheduled(cron = "0 05 04 * * *")
public String planConfirmJob() throws JobInstanceAlreadyCompleteException,
JobExecutionAlreadyRunningException, JobParametersInvalidException, JobRestartException {
@ -339,7 +339,7 @@ public class JobLauncherController {
* @throws JobParametersInvalidException
* @throws JobRestartException
*/
@Scheduled(cron = "1 20 0 * * *")
@Scheduled(cron = "0 20 04 * * *")
public String estimateSyncJob() throws JobInstanceAlreadyCompleteException,
JobExecutionAlreadyRunningException, JobParametersInvalidException, JobRestartException {

View File

@ -79,7 +79,7 @@ public class EstimateController {
return estimateService.updateEstimateReset(estimateRequest);
}
@Operation(description = "견적서 잠금여부를 저장한다.")
@Operation(description = "견적서 잠금여부를 저장한다.")
@PostMapping("/save-estimate-lock")
@ResponseStatus(HttpStatus.CREATED)
public void updateEstimateLock(@RequestBody EstimateRequest estimateRequest) throws Exception {

View File

@ -40,7 +40,7 @@ public interface EstimateMapper {
public List<RoofResponse> selectEstimateRoofItemList(EstimateRequest estimateRequest);
// 견적서 지붕재 PC 목록 조회
public List<RoofResponse> selectEstimateRoofPcList(EstimateRequest estimateRequest);
public List<ItemResponse> selectEstimateCircuitItemList(EstimateRequest estimateRequest);
// 견적서 지붕재 용량 목록 조회
public List<RoofResponse> selectEstimateRoofVolList(EstimateRequest estimateRequest);
@ -78,6 +78,9 @@ public interface EstimateMapper {
// 견적서 지붕재 아이템 등록
public int insertEstimateRoofItem(ItemRequest itemRequest);
// 견적서 지붕재 회로구성 아이템 등록
public int insertEstimateCircuitItem(ItemRequest itemRequest);
// 견적서 도면 아이템 등록
public int insertEstimateDrawingItem(ItemRequest itemRequest);
@ -93,6 +96,9 @@ public interface EstimateMapper {
// 견적서 지붕재 아이템 목록 삭제(물리 삭제)
public int deleteEstimateRoofItemList(EstimateRequest estimateRequest);
// 견적서 회로구성 아이템 목록 삭제(물리 삭제)
public int deleteEstimateCircuitItemList(EstimateRequest estimateRequest);
// 견적서 도면 아이템 목록 삭제(물리 삭제)
public int deleteEstimateDrawingItemList(EstimateRequest estimateRequest);

View File

@ -272,14 +272,10 @@ public class EstimateService {
ErrorCode.INVALID_INPUT_VALUE,
message.getMessage("common.message.required.data", "Sale Store ID"));
}
if (StringUtils.isEmpty(estimateRequest.getSapSalesStoreCd())) {
throw new QcastException(
ErrorCode.INVALID_INPUT_VALUE,
message.getMessage("common.message.required.data", "Sap Sale Store Code"));
}
String splitStr = "";
List<RoofRequest> roofList = new ArrayList<RoofRequest>();
List<ItemRequest> circuitItemList = estimateRequest.getCircuitItemList();
List<ItemRequest> itemList = estimateRequest.getItemList();
estimateRequest.setTempFlg("0");
@ -582,9 +578,10 @@ public class EstimateService {
// 도면 작성일 경우에만 지붕재, 도면 아이템 데이터 초기화 저장
if ("1".equals(estimateRequest.getDrawingFlg())) {
// 견적서 지붕면/아이템 제거
// 견적서 지붕면/아이템 PC 회로구성도 제거
estimateMapper.deleteEstimateRoofList(estimateRequest);
estimateMapper.deleteEstimateRoofItemList(estimateRequest);
estimateMapper.deleteEstimateCircuitItemList(estimateRequest);
// 견적서 지붕면/아이템 신규 추가
for (RoofRequest roofRequest : roofList) {
@ -604,6 +601,16 @@ public class EstimateService {
}
}
// 견적서 회로구성 아이템 신규 추가
for (ItemRequest circuitItemRequest : circuitItemList) {
circuitItemRequest.setObjectNo(estimateRequest.getObjectNo());
circuitItemRequest.setPlanNo(estimateRequest.getPlanNo());
circuitItemRequest.setItemId(circuitItemRequest.getItemId());
circuitItemRequest.setCircuitCfg(circuitItemRequest.getCircuitCfg());
estimateMapper.insertEstimateCircuitItem(circuitItemRequest);
}
// 견적서 도면 아이템 제거
estimateMapper.deleteEstimateDrawingItemList(estimateRequest);
// 견적서 도면 아이템 등록
@ -806,6 +813,8 @@ public class EstimateService {
// [6]. 견적서 지붕재 복사
List<RoofResponse> roofList = estimateMapper.selectEstimateRoofList(estimateRequest);
List<RoofResponse> roofItemList = estimateMapper.selectEstimateRoofItemList(estimateRequest);
List<ItemResponse> circuitItemList =
estimateMapper.selectEstimateCircuitItemList(estimateRequest);
for (RoofResponse roofResponse : roofList) {
List<RoofResponse> roofItemList2 = new ArrayList<RoofResponse>();
@ -848,6 +857,17 @@ public class EstimateService {
}
}
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);
}
// [7]. 견적서 도면 복사 (추후 개발 필요)
// [8]. QSP Q.CAST SEND API
@ -1273,7 +1293,8 @@ public class EstimateService {
// 지붕재 목록 조회
RoofInfoResponse roofInfoResponse = new RoofInfoResponse();
List<RoofResponse> roofList = estimateMapper.selectEstimateRoofList(estimateRequest);
List<RoofResponse> roofPcList = estimateMapper.selectEstimateRoofPcList(estimateRequest);
List<ItemResponse> circuitItemList =
estimateMapper.selectEstimateCircuitItemList(estimateRequest);
estimateRequest.setSchItemGroup("MODULE_");
List<RoofResponse> roofVolList = estimateMapper.selectEstimateRoofVolList(estimateRequest);
@ -1300,7 +1321,7 @@ public class EstimateService {
roofInfoResponse.setModuleTotVolKw(String.valueOf(moduleTotVolKw));
roofInfoResponse.setRoofList(roofList);
roofInfoResponse.setRoofPcList(roofPcList);
roofInfoResponse.setCircuitItemList(circuitItemList);
roofInfoResponse.setRoofVolList(roofVolList);
// 인증용량 구하기 (지붕면마다 모듈과 PCS의 용량을 서로 비교해 낮은쪽 용량으로 합산)
@ -1885,17 +1906,17 @@ public class EstimateService {
elm = doc.getElementById("notStandItemList_detail");
elm.append(sb.toString());
if (data.getRoofInfo().getRoofPcList() != null) {
if (data.getRoofInfo().getCircuitItemList() != null) {
no = 1;
sb = new StringBuilder();
for (RoofResponse roofResponse : data.getRoofInfo().getRoofPcList()) {
for (ItemResponse itemResponse : data.getRoofInfo().getCircuitItemList()) {
sb.append("<tr>");
sb.append("<td>" + (no++) + "</td>");
sb.append(
"<td style='text-align:left;'>"
+ StringUtils.defaultString(roofResponse.getItemNo())
+ "["
+ roofResponse.getPcModuleAmount()
+ StringUtils.defaultString(itemResponse.getItemNo())
+ " ["
+ itemResponse.getCircuitCfg()
+ "]"
+ "</td>");
sb.append("</tr>");

View File

@ -195,6 +195,9 @@ public class EstimateRequest {
@Schema(description = "지붕재 목록")
List<RoofRequest> roofList;
@Schema(description = "지붕재 목록")
List<ItemRequest> circuitItemList;
@Schema(description = "아이템 목록")
List<ItemRequest> itemList;

View File

@ -14,6 +14,9 @@ public class ItemRequest {
@Schema(description = "플랜번호")
private String planNo;
@Schema(description = "지붕재 아이템 번호")
private String roofItemNo;
@Schema(description = "지붕재 번호")
private String roofNo;
@ -74,8 +77,11 @@ public class ItemRequest {
@Schema(description = "PC 아이템 ID")
private String pcItemId;
@Schema(description = "회로")
private String circuit;
@Schema(description = "회로번호")
private String circuitNo;
@Schema(description = "회로구성도")
private String circuitCfg;
@Schema(description = "W")
private String pnowW;

View File

@ -79,4 +79,7 @@ public class ItemResponse {
@Schema(description = "모듈여부")
private String moduleFlg;
@Schema(description = "회로구성도")
private String circuitCfg;
}

View File

@ -21,8 +21,8 @@ public class RoofInfoResponse {
@Schema(description = "지붕면 목록")
private List<RoofResponse> roofList;
@Schema(description = "지붕면 파워컨디셔너 목록")
private List<RoofResponse> roofPcList;
@Schema(description = "파워컨디셔너 목록")
private List<ItemResponse> circuitItemList;
@Schema(description = "지붕면 용량 목록")
private List<RoofResponse> roofVolList;

View File

@ -91,10 +91,4 @@ public class RoofResponse {
@Schema(description = "PC 아이템 ID")
private String pcItemId;
@Schema(description = "회로")
private String circuit;
@Schema(description = "Pc 모듈 매수")
private String pcModuleAmount;
}

View File

@ -327,7 +327,7 @@
, ISNULL((
SELECT
SUM((AMOUNT * CAST(ISNULL(SPECIFICATION, 0) AS FLOAT) / 1000))
FROM T_ROOF_ITEM_ESTIMATE (NOLOCK)
FROM T_PART_ROOF_ITEM_ESTIMATE (NOLOCK)
WHERE OBJECT_NO = PE.OBJECT_NO
AND PLAN_NO = PE.PLAN_NO
AND PC_ITEM_ID = PE.ITEM_ID
@ -364,7 +364,7 @@
, ISNULL(C2.CODE_NM, '') AS SUPPORT_METHOD_NAME
, ISNULL(C3.CODE_NM, '') AS CONSTRUCT_SPECIFICATION_NAME
FROM T_PLAN P WITH (NOLOCK)
INNER JOIN T_ROOF_ESTIMATE RE WITH (NOLOCK)
INNER JOIN T_PART_ROOF_ESTIMATE RE WITH (NOLOCK)
ON P.OBJECT_NO = RE.OBJECT_NO
AND P.PLAN_NO = RE.PLAN_NO
LEFT OUTER JOIN M_COMM_L C1 WITH (NOLOCK)
@ -392,48 +392,26 @@
, ISNULL(PIE.SPECIFICATION, '') AS SPECIFICATION
, PIE.AMOUNT
, PIE.PC_ITEM_ID
FROM T_ROOF_ITEM_ESTIMATE PIE WITH (NOLOCK)
FROM T_PART_ROOF_ITEM_ESTIMATE PIE WITH (NOLOCK)
WHERE PIE.OBJECT_NO = #{objectNo}
AND PIE.PLAN_NO = #{planNo}
ORDER BY PIE.ROOF_NO
</select>
<select id="selectEstimateRoofPcList" parameterType="com.interplug.qcast.biz.estimate.dto.EstimateRequest" resultType="com.interplug.qcast.biz.estimate.dto.RoofResponse">
/* sqlid : com.interplug.qcast.biz.estimate.selectEstimateRoofPcList */
<select id="selectEstimateCircuitItemList" parameterType="com.interplug.qcast.biz.estimate.dto.EstimateRequest" resultType="com.interplug.qcast.biz.estimate.dto.ItemResponse">
/* sqlid : com.interplug.qcast.biz.estimate.selectEstimateCircuitItemList */
SELECT
T.ITEM_ID
, T.ITEM_NO
, SUM(T.AMOUNT) AS AMOUNT
, SUM(T.PC_AMOUNT) AS PC_MODULE_AMOUNT
FROM
(
SELECT
P.OBJECT_NO
, P.PLAN_NO
, RE.ROOF_NO
, RE.ROOF_SURFACE
, ROUND(CAST(RE.SLOPE AS FLOAT), 2) AS SLOPE
, RIE.AMOUNT
, CAST(RIE.SPECIFICATION AS FLOAT) SPECIFICATION
, I.ITEM_ID
, I.ITEM_NO
, I.ITEM_GROUP
, (SELECT SUM(AMOUNT) FROM T_ROOF_ITEM_ESTIMATE WHERE ROOF_NO = RIE.ROOF_NO AND OBJECT_NO = RIE.OBJECT_NO AND PLAN_NO = RIE.PLAN_NO AND PC_ITEM_ID = RIE.ITEM_ID) AS PC_AMOUNT
FROM T_PLAN P WITH (NOLOCK)
INNER JOIN T_ROOF_ESTIMATE RE WITH (NOLOCK)
ON P.OBJECT_NO = RE.OBJECT_NO
AND P.PLAN_NO = RE.PLAN_NO
INNER JOIN T_ROOF_ITEM_ESTIMATE RIE WITH (NOLOCK)
ON RE.ROOF_NO = RIE.ROOF_NO
AND RE.OBJECT_NO = RE.OBJECT_NO
AND RE.PLAN_NO = RE.PLAN_NO
INNER JOIN M_ITEM I WITH (NOLOCK)
ON RIE.ITEM_ID = I.ITEM_ID
WHERE P.OBJECT_NO = #{objectNo}
AND P.PLAN_NO = #{planNo}
AND I.ITEM_GROUP = 'PC_'
) T
GROUP BY T.ITEM_ID, T.ITEM_NO
PE.ITEM_ID
, PE.ITEM_NO
, PE.ITEM_NAME
, PCIE.CIRCUIT_CFG
FROM T_PART_ESTIMATE PE WITH (NOLOCK)
INNER JOIN T_PART_CIRCUIT_ITEM_ESTIMATE PCIE WITH (NOLOCK)
ON PE.OBJECT_NO = PCIE.OBJECT_NO
AND PE.PLAN_NO = PCIE.PLAN_NO
AND PE.ITEM_ID = PCIE.ITEM_ID
WHERE PE.OBJECT_NO = #{objectNo}
AND PE.PLAN_NO = #{planNo}
</select>
<select id="selectEstimateRoofVolList" parameterType="com.interplug.qcast.biz.estimate.dto.EstimateRequest" resultType="com.interplug.qcast.biz.estimate.dto.RoofResponse">
@ -463,10 +441,10 @@
, I.ITEM_ID
, I.ITEM_GROUP
FROM T_PLAN P WITH (NOLOCK)
INNER JOIN T_ROOF_ESTIMATE RE WITH (NOLOCK)
INNER JOIN T_PART_ROOF_ESTIMATE RE WITH (NOLOCK)
ON P.OBJECT_NO = RE.OBJECT_NO
AND P.PLAN_NO = RE.PLAN_NO
INNER JOIN T_ROOF_ITEM_ESTIMATE RIE WITH (NOLOCK)
INNER JOIN T_PART_ROOF_ITEM_ESTIMATE RIE WITH (NOLOCK)
ON RE.ROOF_NO = RIE.ROOF_NO
AND RE.OBJECT_NO = RE.OBJECT_NO
AND RE.PLAN_NO = RE.PLAN_NO
@ -846,7 +824,7 @@
SELECT @@IDENTITY
</selectKey>
INSERT INTO T_ROOF_ESTIMATE
INSERT INTO T_PART_ROOF_ESTIMATE
(
OBJECT_NO
, PLAN_NO
@ -894,9 +872,14 @@
<insert id="insertEstimateRoofItem" parameterType="com.interplug.qcast.biz.estimate.dto.ItemRequest">
/* sqlid : com.interplug.qcast.biz.estimate.insertEstimateRoofItem */
INSERT INTO T_ROOF_ITEM_ESTIMATE
<selectKey resultType="String" keyProperty="roofItemNo" order="BEFORE">
SELECT CAST(ISNULL(MAX(ROOF_ITEM_NO), 0) + 1 AS NVARCHAR) FROM T_PART_ROOF_ITEM_ESTIMATE WHERE OBJECT_NO = #{objectNo} AND PLAN_NO = #{planNo}
</selectKey>
INSERT INTO T_PART_ROOF_ITEM_ESTIMATE
(
ROOF_NO
ROOF_ITEM_NO
, ROOF_NO
, OBJECT_NO
, PLAN_NO
, ITEM_ID
@ -907,7 +890,8 @@
, PC_ITEM_ID
)
SELECT
#{roofNo} AS ROOF_NO
#{roofItemNo} AS ROOF_ITEM_NO
, #{roofNo} AS ROOF_NO
, #{objectNo} AS OBJECT_NO
, #{planNo} AS PLAN_NO
, I.ITEM_ID
@ -920,16 +904,45 @@
WHERE I.ITEM_ID = #{itemId}
</insert>
<insert id="insertEstimateCircuitItem" parameterType="com.interplug.qcast.biz.estimate.dto.ItemRequest">
/* sqlid : com.interplug.qcast.biz.estimate.insertEstimateCircuitItem */
<selectKey resultType="String" keyProperty="circuitNo" order="BEFORE">
SELECT CAST(ISNULL(MAX(CIRCUIT_NO), 0) + 1 AS NVARCHAR) FROM T_PART_CIRCUIT_ITEM_ESTIMATE WHERE OBJECT_NO = #{objectNo} AND PLAN_NO = #{planNo}
</selectKey>
INSERT INTO T_PART_CIRCUIT_ITEM_ESTIMATE
(
CIRCUIT_NO
, OBJECT_NO
, PLAN_NO
, ITEM_ID
, CIRCUIT_CFG
) VALUES (
#{circuitNo}
, #{objectNo}
, #{planNo}
, #{itemId}
, #{circuitCfg}
)
</insert>
<delete id="deleteEstimateRoofList" parameterType="com.interplug.qcast.biz.estimate.dto.EstimateRequest">
/* sqlid : com.interplug.qcast.biz.estimate.deleteEstimateRoofList */
DELETE FROM T_ROOF_ESTIMATE
DELETE FROM T_PART_ROOF_ESTIMATE
WHERE OBJECT_NO = #{objectNo}
AND PLAN_NO = #{planNo}
</delete>
<delete id="deleteEstimateRoofItemList" parameterType="com.interplug.qcast.biz.estimate.dto.EstimateRequest">
/* sqlid : com.interplug.qcast.biz.estimate.deleteEstimateRoofItemList */
DELETE FROM T_ROOF_ITEM_ESTIMATE
DELETE FROM T_PART_ROOF_ITEM_ESTIMATE
WHERE OBJECT_NO = #{objectNo}
AND PLAN_NO = #{planNo}
</delete>
<delete id="deleteEstimateCircuitItemList" parameterType="com.interplug.qcast.biz.estimate.dto.EstimateRequest">
/* sqlid : com.interplug.qcast.biz.estimate.deleteEstimateCircuitItemList */
DELETE FROM T_PART_CIRCUIT_ITEM_ESTIMATE
WHERE OBJECT_NO = #{objectNo}
AND PLAN_NO = #{planNo}
</delete>

View File

@ -38,7 +38,7 @@
, A.CLASS_TYPE
, A.AZIMUTH
, (CASE WHEN A.CLASS_TYPE = 0 THEN A.SLOPE ELSE A.ANGLE END) AS SLOPE_ANGLE
FROM T_ROOF_ESTIMATE A WITH (NOLOCK)
FROM T_PART_ROOF_ESTIMATE A WITH (NOLOCK)
WHERE A.OBJECT_NO = #{objectNo}
AND A.PLAN_NO = #{planNo}
</select>
@ -85,8 +85,8 @@
, A.CLASS_TYPE
, A.AZIMUTH
, (CASE WHEN A.CLASS_TYPE = 0 THEN A.SLOPE ELSE A.ANGLE END) AS SLOPE_ANGLE
FROM T_ROOF_ESTIMATE A WITH (NOLOCK)
INNER JOIN T_ROOF_ITEM_ESTIMATE B WITH (NOLOCK)
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_NO = B.ROOF_NO