From 063f2bd382875d360e72c1e7ad0cb57b138743e8 Mon Sep 17 00:00:00 2001 From: ysCha Date: Wed, 31 Dec 2025 09:45:05 +0900 Subject: [PATCH 1/5] =?UTF-8?q?"storeAdditionalJob","businessChargerJob","?= =?UTF-8?q?adminUserJob"=20=ED=97=88=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/interplug/qcast/batch/JobLauncherController.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/interplug/qcast/batch/JobLauncherController.java b/src/main/java/com/interplug/qcast/batch/JobLauncherController.java index ebcdf9cf..6aed0869 100644 --- a/src/main/java/com/interplug/qcast/batch/JobLauncherController.java +++ b/src/main/java/com/interplug/qcast/batch/JobLauncherController.java @@ -236,7 +236,10 @@ public class JobLauncherController { "specialNoteDispItemAdditionalJob", "planConfirmJob", "estimateSyncJob", - "bomJob" + "bomJob", + "storeAdditionalJob", + "businessChargerJob", + "adminUserJob" )); // 스케줄러가 비활성화되어 있고, 허용된 작업이 아닌 경우 From 7de30987854d2cbbcad7c361b1f56c58dc8d8ea6 Mon Sep 17 00:00:00 2001 From: ysCha Date: Wed, 31 Dec 2025 14:22:58 +0900 Subject: [PATCH 2/5] =?UTF-8?q?resetFailedJobs=EA=B0=80=20=EC=8B=A4?= =?UTF-8?q?=ED=96=89=EB=90=98=EB=A9=B4=EC=84=9C=20DB=EC=97=90=20=EB=81=BC?= =?UTF-8?q?=EC=96=B4=EC=9E=88=EB=8D=98(STARTED)=20=EC=83=81=ED=83=9C?= =?UTF-8?q?=EB=93=A4=EC=9D=84=20=EB=AA=A8=EB=91=90=20=EC=8B=A4=ED=8C=A8(FA?= =?UTF-8?q?ILED)=EB=A1=9C=20=EB=B0=94=EA=BF=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../qcast/batch/JobLauncherController.java | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/main/java/com/interplug/qcast/batch/JobLauncherController.java b/src/main/java/com/interplug/qcast/batch/JobLauncherController.java index 6aed0869..f2bcddbd 100644 --- a/src/main/java/com/interplug/qcast/batch/JobLauncherController.java +++ b/src/main/java/com/interplug/qcast/batch/JobLauncherController.java @@ -10,12 +10,16 @@ import org.springframework.batch.core.explore.JobExplorer; import org.springframework.batch.core.launch.JobLauncher; import org.springframework.batch.core.repository.JobExecutionAlreadyRunningException; import org.springframework.batch.core.repository.JobInstanceAlreadyCompleteException; +import org.springframework.batch.core.repository.JobRepository; import org.springframework.batch.core.repository.JobRestartException; import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.context.event.ApplicationReadyEvent; 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 org.springframework.context.event.EventListener; +import java.time.LocalDateTime; @RestController @RequiredArgsConstructor @@ -25,6 +29,7 @@ public class JobLauncherController { private final JobLauncher jobLauncher; private final JobExplorer jobExplorer; + private final JobRepository jobRepository; // 생성자 주입을 위해 필드 추가 @Value("${qsp.master-admin-user-batch-url}") private String qspInterfaceUrl; @@ -32,6 +37,26 @@ public class JobLauncherController { @Value("${spring.profiles.scheduler}") private String scheduler; + /** + * 서버 시작 시 실행 중(STARTED)인 상태로 남은 Job들을 FAILED 처리 + */ + @EventListener(ApplicationReadyEvent.class) + public void resetFailedJobs() { + log.info("Checking for 'STARTED' jobs to reset after reboot..."); + for (String jobName : jobs.keySet()) { + Set runningExecutions = jobExplorer.findRunningJobExecutions(jobName); + for (JobExecution execution : runningExecutions) { + execution.setStatus(BatchStatus.FAILED); + execution.setExitStatus(ExitStatus.FAILED.addExitDescription("Reset on application startup")); + execution.setEndTime(LocalDateTime.now()); // new Date() 대신 LocalDateTime.now() 사용 + jobRepository.update(execution); + log.info("Reset job execution {} for job {}", execution.getId(), jobName); + } + } + } + + + /** * 특정 Job을 매핑으로 실행하는 메소드 * From efb29f8eb67b446bcf0afb28e5a4faf454c57120 Mon Sep 17 00:00:00 2001 From: ysCha Date: Wed, 31 Dec 2025 14:55:49 +0900 Subject: [PATCH 3/5] =?UTF-8?q?=EB=B0=B0=EC=B9=98=EA=B0=80=20=EB=A9=88?= =?UTF-8?q?=EC=B6=B0=EC=9E=88=EB=8D=94=EB=9D=BC=EB=8F=84=201=EC=8B=9C?= =?UTF-8?q?=EA=B0=84=EB=A7=8C=20=EC=A7=80=EB=82=98=EB=A9=B4=20=EB=B3=84?= =?UTF-8?q?=EB=8F=84=EC=9D=98=20=EC=A1=B0=EC=B9=98=20=EC=97=86=EC=9D=B4=20?= =?UTF-8?q?=EB=8B=A4=EC=9D=8C=20=EC=8B=A4=ED=96=89=20=EB=95=8C=20=EC=9E=90?= =?UTF-8?q?=EB=8F=99=EC=9C=BC=EB=A1=9C=20=EC=A0=95=EC=83=81=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../qcast/batch/JobLauncherController.java | 40 +++++++++++++++---- 1 file changed, 32 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/interplug/qcast/batch/JobLauncherController.java b/src/main/java/com/interplug/qcast/batch/JobLauncherController.java index f2bcddbd..0dac1462 100644 --- a/src/main/java/com/interplug/qcast/batch/JobLauncherController.java +++ b/src/main/java/com/interplug/qcast/batch/JobLauncherController.java @@ -1,5 +1,6 @@ package com.interplug.qcast.batch; +import java.time.Duration; import java.util.*; import java.util.concurrent.ConcurrentHashMap; @@ -292,19 +293,42 @@ public class JobLauncherController { */ private boolean isJobRunning(String jobName) { try { - List jobInstances = jobExplorer.findJobInstancesByJobName(jobName, 0, 1); - if (jobInstances.isEmpty()) { + Set runningExecutions = jobExplorer.findRunningJobExecutions(jobName); + if (runningExecutions.isEmpty()) { return false; } - JobInstance latestJobInstance = jobInstances.get(0); - List jobExecutions = jobExplorer.getJobExecutions(latestJobInstance); + boolean isActuallyBlocked = false; + for (JobExecution execution : runningExecutions) { + LocalDateTime startTime = execution.getStartTime(); + if (startTime == null) continue; - return jobExecutions.stream() - .anyMatch(execution -> execution.getStatus() == BatchStatus.STARTED - || execution.getStatus() == BatchStatus.STARTING); + // 현재 시간과 시작 시간의 차이 계산 + Duration duration = Duration.between(startTime, LocalDateTime.now()); + long hours = duration.toHours(); + + if (hours >= 1) { + // 1시간 이상 경과한 경우 로그 출력 및 DB 강제 업데이트 + log.warn("Job {} (Execution ID: {}) 가 실행된 지 {}시간이 지났습니다. 상태를 FAILED로 초기화하고 재실행을 시도합니다.", + jobName, execution.getId(), hours); + + execution.setStatus(BatchStatus.FAILED); + execution.setExitStatus(ExitStatus.FAILED.addExitDescription("Forcefully reset: Running for more than 1 hour")); + execution.setEndTime(LocalDateTime.now()); + jobRepository.update(execution); + + log.info("Job {} 의 이전 실행 상태가 성공적으로 초기화되었습니다.", jobName); + } else { + // 1시간 미만으로 실행 중인 잡이 있다면 진짜 실행 중인 것으로 간주 + log.info("Job {} 가 현재 실행 중입니다. (시작 시간: {}, 경과 시간: {}분)", + jobName, startTime, duration.toMinutes()); + isActuallyBlocked = true; + } + } + + return isActuallyBlocked; } catch (Exception e) { - log.error("Error checking job running status: {}", e.getMessage()); + log.error("Job 상태 확인 중 오류 발생: {}", e.getMessage()); return false; } } From 493f006d74e7fccdb42cc07410832b893cafe7be Mon Sep 17 00:00:00 2001 From: yscha Date: Fri, 2 Jan 2026 14:21:22 +0900 Subject: [PATCH 4/5] estimateMapper.xml --- .../mappers/estimate/estimateMapper.xml | 1910 ++++++++--------- 1 file changed, 954 insertions(+), 956 deletions(-) diff --git a/src/main/resources/mappers/estimate/estimateMapper.xml b/src/main/resources/mappers/estimate/estimateMapper.xml index fa04ea1c..3ea6d81c 100644 --- a/src/main/resources/mappers/estimate/estimateMapper.xml +++ b/src/main/resources/mappers/estimate/estimateMapper.xml @@ -6,84 +6,84 @@ /* sqlid : com.interplug.qcast.biz.estimate.selectPdfEstimateDetail */ SELECT - T.* - , SS1.SALE_STORE_NAME AS CUST_SALE_STORE_NAME - , COALESCE(NULLIF(SS2.DISP_COMPANY_NAME, ''), SS2.SALE_STORE_NAME) AS SALE_STORE_NAME - , COALESCE(NULLIF(SS2.DISP_ZIP_NO, ''), SS2.ZIP_NO) AS ZIP_NO - , COALESCE(NULLIF(SS2.DISP_ADDRESS, ''), SS2.ADDRESS) AS ADDRESS - , COALESCE(NULLIF(SS2.DISP_TEL, ''), SS2.TEL) AS TEL - , COALESCE(NULLIF(SS2.DISP_FAX, ''), SS2.FAX) AS FAX - , SSI2.BIZ_NO + T.* + , SS1.SALE_STORE_NAME AS CUST_SALE_STORE_NAME + , COALESCE(NULLIF(SS2.DISP_COMPANY_NAME, ''), SS2.SALE_STORE_NAME) AS SALE_STORE_NAME + , COALESCE(NULLIF(SS2.DISP_ZIP_NO, ''), SS2.ZIP_NO) AS ZIP_NO + , COALESCE(NULLIF(SS2.DISP_ADDRESS, ''), SS2.ADDRESS) AS ADDRESS + , COALESCE(NULLIF(SS2.DISP_TEL, ''), SS2.TEL) AS TEL + , COALESCE(NULLIF(SS2.DISP_FAX, ''), SS2.FAX) AS FAX + , SSI2.BIZ_NO FROM - ( - SELECT - P.OBJECT_NO - , P.PLAN_NO - , CONVERT(VARCHAR(10), P.DRAWING_ESTIMATE_CREATE_DATE, 121) AS DRAWING_ESTIMATE_CREATE_DATE - , P.ESTIMATE_VALIDITY_TERM - , P.SNOWFALL - , CONVERT(NVARCHAR(10), P.LAST_EDIT_DATETIME, 121) AS ESTIMATE_DATE - , PI.ESTIMATE_TYPE - , PI.ESTIMATE_OPTION - , PI.PKG_ASP - , PI.REMARKS - , O.SALE_STORE_ID - , O.OBJECT_NAME - , O.OBJECT_NAME_OMIT - , (SELECT SALE_STORE_ID FROM M_USER WHERE USER_ID = OI.CREATE_USER) AS CREATE_SALE_STORE_ID - , ISNULL(MP.PREF_NAME, '') AS PREF_NAME - , ISNULL(MPA.AREA_NAME, '') AS AREA_NAME - , ISNULL(C1.CODE_NM, '') AS STANDARD_WIND_SPEED_NAME - FROM T_PLAN P WITH (NOLOCK) + ( + SELECT + P.OBJECT_NO + , P.PLAN_NO + , CONVERT(VARCHAR(10), P.DRAWING_ESTIMATE_CREATE_DATE, 121) AS DRAWING_ESTIMATE_CREATE_DATE + , P.ESTIMATE_VALIDITY_TERM + , P.SNOWFALL + , CONVERT(NVARCHAR(10), P.LAST_EDIT_DATETIME, 121) AS ESTIMATE_DATE + , PI.ESTIMATE_TYPE + , PI.ESTIMATE_OPTION + , PI.PKG_ASP + , PI.REMARKS + , O.SALE_STORE_ID + , O.OBJECT_NAME + , O.OBJECT_NAME_OMIT + , (SELECT SALE_STORE_ID FROM M_USER WHERE USER_ID = OI.CREATE_USER) AS CREATE_SALE_STORE_ID + , ISNULL(MP.PREF_NAME, '') AS PREF_NAME + , ISNULL(MPA.AREA_NAME, '') AS AREA_NAME + , ISNULL(C1.CODE_NM, '') AS STANDARD_WIND_SPEED_NAME + FROM T_PLAN P WITH (NOLOCK) INNER JOIN T_PLAN_INFO PI WITH (NOLOCK) ON P.OBJECT_NO = PI.OBJECT_NO - AND P.PLAN_NO = PI.PLAN_NO - INNER JOIN T_OBJECT O WITH (NOLOCK) + AND P.PLAN_NO = PI.PLAN_NO + INNER JOIN T_OBJECT O WITH (NOLOCK) ON P.OBJECT_NO = O.OBJECT_NO - INNER JOIN T_OBJECT_INFO OI WITH (NOLOCK) + INNER JOIN T_OBJECT_INFO OI WITH (NOLOCK) ON O.OBJECT_NO = OI.OBJECT_NO - LEFT OUTER JOIN T_SIMULATION_PREFECTURE MP WITH (NOLOCK) + LEFT OUTER JOIN T_SIMULATION_PREFECTURE MP WITH (NOLOCK) ON O.PREF_ID = MP.PREF_ID - LEFT OUTER JOIN T_SIMULATION_AREA MPA WITH (NOLOCK) + LEFT OUTER JOIN T_SIMULATION_AREA MPA WITH (NOLOCK) ON O.PREF_ID = MPA.PREF_ID - AND OI.AREA_ID = MPA.AREA_ID - AND MPA.DEL_FLG = 0 - LEFT OUTER JOIN M_COMM_L C1 WITH (NOLOCK) + AND OI.AREA_ID = MPA.AREA_ID + AND MPA.DEL_FLG = 0 + LEFT OUTER JOIN M_COMM_L C1 WITH (NOLOCK) ON C1.HEAD_CD = '202000' - AND P.STANDARD_WIND_SPEED_ID = C1.CODE - WHERE P.OBJECT_NO = #{objectNo} - AND P.PLAN_NO = #{planNo} - ) T - LEFT OUTER JOIN M_SALES_STORE SS1 WITH (NOLOCK) - ON T.SALE_STORE_ID = SS1.SALE_STORE_ID - LEFT OUTER JOIN M_SALES_STORE SS2 WITH (NOLOCK) - ON T.CREATE_SALE_STORE_ID = SS2.SALE_STORE_ID - LEFT OUTER JOIN M_SALES_STORE_INFO SSI2 WITH (NOLOCK) - ON T.CREATE_SALE_STORE_ID = SSI2.SALE_STORE_ID + AND P.STANDARD_WIND_SPEED_ID = C1.CODE + WHERE P.OBJECT_NO = #{objectNo} + AND P.PLAN_NO = #{planNo} + ) T + LEFT OUTER JOIN M_SALES_STORE SS1 WITH (NOLOCK) + ON T.SALE_STORE_ID = SS1.SALE_STORE_ID + LEFT OUTER JOIN M_SALES_STORE SS2 WITH (NOLOCK) + ON T.CREATE_SALE_STORE_ID = SS2.SALE_STORE_ID + LEFT OUTER JOIN M_SALES_STORE_INFO SSI2 WITH (NOLOCK) + ON T.CREATE_SALE_STORE_ID = SSI2.SALE_STORE_ID @@ -248,16 +248,16 @@ @@ -265,270 +265,270 @@ /* sqlid : com.interplug.qcast.biz.estimate.selectEstimateNoteTitleList */ SELECT - MAX(T.CODE_NM) AS CODE_NM - , STUFF(( - SELECT '、' + CODE FROM M_COMM_L T2 - WHERE T2.HEAD_CD = '202400' AND T.REF_CHR3 = T2.REF_CHR3 - FOR XML PATH('')),1,1,'' + MAX(T.CODE_NM) AS CODE_NM + , STUFF(( + SELECT '、' + CODE FROM M_COMM_L T2 + WHERE T2.HEAD_CD = '202400' AND T.REF_CHR3 = T2.REF_CHR3 + FOR XML PATH('')),1,1,'' ) AS CODE - , CASE WHEN T.REF_CHR1 = 'PROD' AND COUNT(1) > 1 THEN '1' ELSE '0' END AS PKG_YN + , CASE WHEN T.REF_CHR1 = 'PROD' AND COUNT(1) > 1 THEN '1' ELSE '0' END AS PKG_YN FROM ( - SELECT - CL.CODE - , CL.CODE_NM - , CL.REF_CHR1 - , CAST(CL.REF_CHR3 AS INT) AS REF_CHR3 - , CL.PRIORITY - , OSN.REMARKS - FROM M_COMM_L CL WITH (NOLOCK) + SELECT + CL.CODE + , CL.CODE_NM + , CL.REF_CHR1 + , CAST(CL.REF_CHR3 AS INT) AS REF_CHR3 + , CL.PRIORITY + , OSN.REMARKS + FROM M_COMM_L CL WITH (NOLOCK) INNER JOIN T_OBJECT_SPECIAL_NOTE OSN WITH (NOLOCK) - ON CL.CODE = OSN.SPN_ATTR_CD - WHERE CL.HEAD_CD = '202400' - AND CL.DEL_FLG = '0' - AND OSN.USE_FLG = '1' - AND OSN.DEL_FLG = '0' - ) T + ON CL.CODE = OSN.SPN_ATTR_CD + WHERE CL.HEAD_CD = '202400' + AND CL.DEL_FLG = '0' + AND OSN.USE_FLG = '1' + AND OSN.DEL_FLG = '0' + ) T GROUP BY T.REF_CHR1, T.REF_CHR3 ORDER BY T.REF_CHR3 ASC @@ -567,74 +567,74 @@ /* sqlid : com.interplug.qcast.biz.estimate.updateObject */ UPDATE T_OBJECT SET - LAST_EDIT_DATETIME = GETDATE() - , LAST_EDIT_USER = #{userId} - , OBJECT_NAME = #{objectName} - , OBJECT_NAME_OMIT = #{objectNameOmit} - , ADDRESSEE_COMPANY_NAME = #{objectName} + ' ' + ISNULL(#{objectNameOmit}, '') - , ADDRESSEE_COMPANY_NAME_OMIT = #{objectNameOmit} - + LAST_EDIT_DATETIME = GETDATE() + , LAST_EDIT_USER = #{userId} + , OBJECT_NAME = #{objectName} + , OBJECT_NAME_OMIT = #{objectNameOmit} + , ADDRESSEE_COMPANY_NAME = #{objectName} + ' ' + ISNULL(#{objectNameOmit}, '') + , ADDRESSEE_COMPANY_NAME_OMIT = #{objectNameOmit} + , RECEIVE_USER = #{charger} - + WHERE OBJECT_NO = #{objectNo} @@ -642,19 +642,19 @@ /* sqlid : com.interplug.qcast.biz.estimate.updateObjectInfo */ UPDATE T_OBJECT_INFO SET - OBJECT_NO = #{objectNo} - + OBJECT_NO = #{objectNo} + , STANDARD_WIND_SPEED_ID = #{standardWindSpeedId} - - + + , VERTICAL_SNOW_COVER = #{snowfall} - - + + , SURFACE_TYPE = #{surfaceType} - - + + , INSTALL_HEIGHT = #{setupHeight} - + WHERE OBJECT_NO = #{objectNo} @@ -662,80 +662,80 @@ /* sqlid : com.interplug.qcast.biz.estimate.updateEstimate */ UPDATE T_PLAN SET - LAST_EDIT_DATETIME = GETDATE() - , LAST_EDIT_USER = #{userId} - - - , CONSTRUCT_SPECIFICATION = #{constructSpecification} - , SETUP_HEIGHT = #{setupHeight} - , WEATHER_POINT = #{weatherPoint} - , SLOPE = #{slope} - , ROOF_MATERIAL_ID = #{roofMaterialId} - , SUPPORT_METHOD_ID = #{supportMethodId} - , DRAWING_ESTIMATE_CREATE_DATE = GETDATE() - , ESTIMATE_VALIDITY_TERM = '発行日より1ヶ月' - , SNOWFALL = #{snowfall} - , STANDARD_WIND_SPEED_ID = #{standardWindSpeedId} - , SUPPORT_MEAKER = #{supportMeaker} - , NORTH_ARRANGEMENT = #{northArrangement} - , ROOF_MATERIAL_ID_MULTI = #{roofMaterialIdMulti} - , SUPPORT_METHOD_ID_MULTI = #{supportMethodIdMulti} - , SUPPORT_MEAKER_MULTI = #{supportMeaker} - - - , CHARGER = #{charger} - , CAPACITY = #{capacity} - , MODULE_MODEL = #{moduleModel} - , PC_TYPE_NO = #{pcTypeNo} + LAST_EDIT_DATETIME = GETDATE() + , LAST_EDIT_USER = #{userId} + + + , CONSTRUCT_SPECIFICATION = #{constructSpecification} + , SETUP_HEIGHT = #{setupHeight} + , WEATHER_POINT = #{weatherPoint} + , SLOPE = #{slope} + , ROOF_MATERIAL_ID = #{roofMaterialId} + , SUPPORT_METHOD_ID = #{supportMethodId} + , DRAWING_ESTIMATE_CREATE_DATE = GETDATE() + , ESTIMATE_VALIDITY_TERM = '発行日より1ヶ月' + , SNOWFALL = #{snowfall} + , STANDARD_WIND_SPEED_ID = #{standardWindSpeedId} + , SUPPORT_MEAKER = #{supportMeaker} + , NORTH_ARRANGEMENT = #{northArrangement} + , ROOF_MATERIAL_ID_MULTI = #{roofMaterialIdMulti} + , SUPPORT_METHOD_ID_MULTI = #{supportMethodIdMulti} + , SUPPORT_MEAKER_MULTI = #{supportMeaker} + + + , CHARGER = #{charger} + , CAPACITY = #{capacity} + , MODULE_MODEL = #{moduleModel} + , PC_TYPE_NO = #{pcTypeNo} WHERE OBJECT_NO = #{objectNo} - AND PLAN_NO = #{planNo} + AND PLAN_NO = #{planNo} /* sqlid : com.interplug.qcast.biz.estimate.updateEstimateInfo */ UPDATE T_PLAN_INFO SET - ESTIMATE_TYPE = #{estimateType} - , SEC_SAP_SALES_STORE_CD = #{secSapSalesStoreCd} - - - , CONSTRUCT_SPECIFICATION_MULTI = #{constructSpecificationMulti} - , ANGLE = #{angle} - , SURFACE_TYPE = #{surfaceType} - , ESTIMATE_DATE = CONVERT(NVARCHAR(10), GETDATE(), 121) - , FILE_FLG = '0' - , ESTIMATE_OPTION = #{estimateOption} - , PKG_ASP = NULL - , PRICE_CD = #{priceCd} - , TEMP_FLG = CASE WHEN TEMP_FLG = '0' THEN '0' ELSE #{tempFlg} END - , CREATE_DATETIME = GETDATE() - , CREATE_USER = #{userId} - - - , ESTIMATE_DATE = #{estimateDate} - , FILE_FLG = #{fileFlg} - , ESTIMATE_OPTION = #{estimateOption} - , REMARKS = #{remarks} - , PKG_ASP = #{pkgAsp} - , PRICE_CD = #{priceCd} - , TEMP_FLG = '0' - - + ESTIMATE_TYPE = #{estimateType} + , SEC_SAP_SALES_STORE_CD = #{secSapSalesStoreCd} + + + , CONSTRUCT_SPECIFICATION_MULTI = #{constructSpecificationMulti} + , ANGLE = #{angle} + , SURFACE_TYPE = #{surfaceType} + , ESTIMATE_DATE = CONVERT(NVARCHAR(10), GETDATE(), 121) + , FILE_FLG = '0' + , ESTIMATE_OPTION = #{estimateOption} + , PKG_ASP = NULL + , PRICE_CD = #{priceCd} + , TEMP_FLG = CASE WHEN TEMP_FLG = '0' THEN '0' ELSE #{tempFlg} END + , CREATE_DATETIME = GETDATE() + , CREATE_USER = #{userId} + + + , ESTIMATE_DATE = #{estimateDate} + , FILE_FLG = #{fileFlg} + , ESTIMATE_OPTION = #{estimateOption} + , REMARKS = #{remarks} + , PKG_ASP = #{pkgAsp} + , PRICE_CD = #{priceCd} + , TEMP_FLG = '0' + + WHERE OBJECT_NO = #{objectNo} - AND PLAN_NO = #{planNo} + AND PLAN_NO = #{planNo} /* sqlid : com.interplug.qcast.biz.estimate.updateEstimate */ UPDATE T_PLAN SET - CAPACITY = #{capacity} - , MODULE_MODEL = #{moduleModel} - , PC_TYPE_NO = #{pcTypeNo} - , LAST_EDIT_DATETIME = GETDATE() - , LAST_EDIT_USER = #{userId} + CAPACITY = #{capacity} + , MODULE_MODEL = #{moduleModel} + , PC_TYPE_NO = #{pcTypeNo} + , LAST_EDIT_DATETIME = GETDATE() + , LAST_EDIT_USER = #{userId} WHERE OBJECT_NO = #{objectNo} - AND PLAN_NO = #{planNo} + AND PLAN_NO = #{planNo} @@ -743,23 +743,23 @@ UPDATE T_PLAN SET CONSTRUCT_SPECIFICATION = NULL - ,SETUP_HEIGHT = NULL - ,WEATHER_POINT = NULL - ,SLOPE = NULL - ,ROOF_MATERIAL_ID = NULL - ,SUPPORT_METHOD_ID = NULL - ,MODULE_MODEL = NULL - ,DRAWING_ESTIMATE_CREATE_DATE = NULL - ,ESTIMATE_VALIDITY_TERM = NULL - ,CAPACITY = NULL - ,SNOWFALL = NULL - ,STANDARD_WIND_SPEED_ID = NULL - ,PC_TYPE_NO = NULL - ,ROOF_MATERIAL_ID_MULTI = NULL - ,SUPPORT_MEAKER_MULTI = NULL - ,SUPPORT_METHOD_ID_MULTI = NULL - ,LAST_EDIT_DATETIME = GETDATE() - ,LAST_EDIT_USER = #{userId} + ,SETUP_HEIGHT = NULL + ,WEATHER_POINT = NULL + ,SLOPE = NULL + ,ROOF_MATERIAL_ID = NULL + ,SUPPORT_METHOD_ID = NULL + ,MODULE_MODEL = NULL + ,DRAWING_ESTIMATE_CREATE_DATE = NULL + ,ESTIMATE_VALIDITY_TERM = NULL + ,CAPACITY = NULL + ,SNOWFALL = NULL + ,STANDARD_WIND_SPEED_ID = NULL + ,PC_TYPE_NO = NULL + ,ROOF_MATERIAL_ID_MULTI = NULL + ,SUPPORT_MEAKER_MULTI = NULL + ,SUPPORT_METHOD_ID_MULTI = NULL + ,LAST_EDIT_DATETIME = GETDATE() + ,LAST_EDIT_USER = #{userId} WHERE OBJECT_NO = #{objectNo} AND PLAN_NO = #{planNo} @@ -768,16 +768,16 @@ /* sqlid : com.interplug.qcast.biz.estimate.updateEstimateInfoReset */ UPDATE T_PLAN_INFO SET - ESTIMATE_TYPE = #{estimateType} - , FILE_FLG = '0' - , ESTIMATE_OPTION = #{estimateOption} - , REMARKS = NULL - , PKG_ASP = NULL - , PRICE_CD = #{priceCd} - , TEMP_FLG = CASE WHEN TEMP_FLG = '0' THEN '0' ELSE #{tempFlg} END - , SEC_SAP_SALES_STORE_CD = #{secSapSalesStoreCd} + ESTIMATE_TYPE = #{estimateType} + , FILE_FLG = '0' + , ESTIMATE_OPTION = #{estimateOption} + , REMARKS = NULL + , PKG_ASP = NULL + , PRICE_CD = #{priceCd} + , TEMP_FLG = CASE WHEN TEMP_FLG = '0' THEN '0' ELSE #{tempFlg} END + , SEC_SAP_SALES_STORE_CD = #{secSapSalesStoreCd} WHERE OBJECT_NO = #{objectNo} - AND PLAN_NO = #{planNo} + AND PLAN_NO = #{planNo} @@ -807,78 +807,78 @@ /* sqlid : com.interplug.qcast.biz.estimate.updateEstimateLock */ UPDATE T_PLAN_INFO SET - LOCK_FLG = #{lockFlg} + LOCK_FLG = #{lockFlg} WHERE OBJECT_NO = #{objectNo} - AND PLAN_NO = #{planNo} + AND PLAN_NO = #{planNo} /* sqlid : com.interplug.qcast.biz.estimate.updateEstimateApi */ UPDATE T_PLAN_INFO SET - DOC_NO = #{docNo} - , SYNC_FLG = #{syncFlg} + DOC_NO = #{docNo} + , SYNC_FLG = #{syncFlg} WHERE OBJECT_NO = #{objectNo} - AND PLAN_NO = #{planNo} + AND PLAN_NO = #{planNo} /* sqlid : com.interplug.qcast.biz.estimate.insertEstimateDrawingItem */ INSERT INTO T_PART_DRAWING_ESTIMATE ( - OBJECT_NO - , PLAN_NO - , DISP_ORDER - , ITEM_ID - , AMOUNT - , LAST_EDIT_DATETIME - , LAST_EDIT_USER + OBJECT_NO + , PLAN_NO + , DISP_ORDER + , ITEM_ID + , AMOUNT + , LAST_EDIT_DATETIME + , LAST_EDIT_USER ) VALUES ( - #{objectNo} - , #{planNo} - , #{dispOrder} - , #{itemId} - , #{amount} - , GETDATE() - , #{userId} - ) + #{objectNo} + , #{planNo} + , #{dispOrder} + , #{itemId} + , #{amount} + , GETDATE() + , #{userId} + ) /* sqlid : com.interplug.qcast.biz.estimate.insertEstimateItem */ INSERT INTO T_PART_ESTIMATE ( - OBJECT_NO - , PLAN_NO - , DISP_ORDER - , ITEM_ID - , ITEM_NO - , ITEM_NAME - , UNIT - , SPECIFICATION - , AMOUNT - + OBJECT_NO + , PLAN_NO + , DISP_ORDER + , ITEM_ID + , ITEM_NO + , ITEM_NAME + , UNIT + , SPECIFICATION + , AMOUNT + , AMOUNT_CHANGE - - , PART_ADD - , LAST_EDIT_DATETIME - , LAST_EDIT_USER + + , PART_ADD + , LAST_EDIT_DATETIME + , LAST_EDIT_USER ) VALUES ( - #{objectNo} - , #{planNo} - , #{dispOrder} - , #{itemId} - , #{itemNo} - , #{itemName} - , #{unit} - , #{specification} - , #{amount} - + #{objectNo} + , #{planNo} + , #{dispOrder} + , #{itemId} + , #{itemNo} + , #{itemName} + , #{unit} + , #{specification} + , #{amount} + , #{amountChange} - - , #{partAdd} - , GETDATE() - , #{userId} + + , #{partAdd} + , GETDATE() + , #{userId} ) @@ -886,45 +886,45 @@ /* sqlid : com.interplug.qcast.biz.estimate.insertEstimateInfoItem */ INSERT INTO T_PART_ESTIMATE_INFO ( - OBJECT_NO - , PLAN_NO - , DISP_ORDER - , UNIT_PRICE - , SALE_PRICE - , BOM_AMOUNT - + OBJECT_NO + , PLAN_NO + , DISP_ORDER + , UNIT_PRICE + , SALE_PRICE + , BOM_AMOUNT + , PA_DISP_ORDER - - + + , SPECIAL_NOTE_CD - - , PKG_MATERIAL_FLG - , FILE_UPLOAD_FLG - , OPEN_FLG - , UNIT_OPEN_FLG - , ITEM_CHANGE_FLG - , DISP_CABLE_FLG - , ITEM_TP_CD + + , PKG_MATERIAL_FLG + , FILE_UPLOAD_FLG + , OPEN_FLG + , UNIT_OPEN_FLG + , ITEM_CHANGE_FLG + , DISP_CABLE_FLG + , ITEM_TP_CD ) VALUES ( - #{objectNo} - , #{planNo} - , #{dispOrder} - , #{unitPrice} - , #{salePrice} - , #{bomAmount} - + #{objectNo} + , #{planNo} + , #{dispOrder} + , #{unitPrice} + , #{salePrice} + , #{bomAmount} + , #{paDispOrder} - - + + , #{specialNoteCd} - - , #{pkgMaterialFlg} - , #{fileUploadFlg} - , #{openFlg} - , #{unitOpenFlg} - , #{itemChangeFlg} - , #{dispCableFlg} - , #{itemTpCd} + + , #{pkgMaterialFlg} + , #{fileUploadFlg} + , #{openFlg} + , #{unitOpenFlg} + , #{itemChangeFlg} + , #{dispCableFlg} + , #{itemTpCd} ) @@ -932,59 +932,59 @@ /* sqlid : com.interplug.qcast.biz.estimate.insertEstimateItemHits */ INSERT INTO T_PART_ESTIMATE_HIS ( - HIS_NO - , OBJECT_NO - , PLAN_NO - , DISP_ORDER - + HIS_NO + , OBJECT_NO + , PLAN_NO + , DISP_ORDER + , PA_DISP_ORDER - - , ITEM_ID - , ITEM_NO - , ITEM_NAME - , UNIT - , AMOUNT - , BOM_AMOUNT - , UNIT_PRICE - , SALE_PRICE - + + , ITEM_ID + , ITEM_NO + , ITEM_NAME + , UNIT + , AMOUNT + , BOM_AMOUNT + , UNIT_PRICE + , SALE_PRICE + , SPECIAL_NOTE_CD - - , PKG_MATERIAL_FLG - , OPEN_FLG - , ITEM_CHANGE_FLG - , FILE_UPLOAD_FLG - , PART_ADD - , DEL_FLG - , CREATE_DATETIME - , CREATE_USER + + , PKG_MATERIAL_FLG + , OPEN_FLG + , ITEM_CHANGE_FLG + , FILE_UPLOAD_FLG + , PART_ADD + , DEL_FLG + , CREATE_DATETIME + , CREATE_USER ) VALUES ( - #{hisNo} - , #{objectNo} - , #{planNo} - , #{dispOrder} - + #{hisNo} + , #{objectNo} + , #{planNo} + , #{dispOrder} + , #{paDispOrder} - - , #{itemId} - , #{itemNo} - , #{itemName} - , #{unit} - , #{amount} - , #{bomAmount} - , #{unitPrice} - , #{salePrice} - + + , #{itemId} + , #{itemNo} + , #{itemName} + , #{unit} + , #{amount} + , #{bomAmount} + , #{unitPrice} + , #{salePrice} + , #{specialNoteCd} - - , #{pkgMaterialFlg} - , #{openFlg} - , #{itemChangeFlg} - , #{fileUploadFlg} - , #{partAdd} - , #{delFlg} - , GETDATE() - , #{userId} + + , #{pkgMaterialFlg} + , #{openFlg} + , #{itemChangeFlg} + , #{fileUploadFlg} + , #{partAdd} + , #{delFlg} + , GETDATE() + , #{userId} ) @@ -992,49 +992,49 @@ /* sqlid : com.interplug.qcast.biz.estimate.insertEstimateRoof */ INSERT INTO T_PART_ROOF_ESTIMATE ( - ROOF_SURFACE_ID - , OBJECT_NO - , PLAN_NO - , ROOF_SURFACE - , ROOF_MATERIAL_ID - , SUPPORT_METHOD_ID - , CONSTRUCT_SPECIFICATION - + ROOF_SURFACE_ID + , OBJECT_NO + , PLAN_NO + , ROOF_SURFACE + , ROOF_MATERIAL_ID + , SUPPORT_METHOD_ID + , CONSTRUCT_SPECIFICATION + , SLOPE - - + + , ANGLE - - + + , CLASS_TYPE - - + + , AZIMUTH - - , CREATE_DATETIME - , CREATE_USER + + , CREATE_DATETIME + , CREATE_USER ) VALUES ( - #{roofSurfaceId} - , #{objectNo} - , #{planNo} - , #{roofSurface} - , #{roofMaterialId} - , #{supportMethodId} - , #{constructSpecification} - + #{roofSurfaceId} + , #{objectNo} + , #{planNo} + , #{roofSurface} + , #{roofMaterialId} + , #{supportMethodId} + , #{constructSpecification} + , #{slope} - - + + , #{angle} - - + + , #{classType} - - + + , #{azimuth} - - , GETDATE() - , #{userId} + + , GETDATE() + , #{userId} ) @@ -1046,32 +1046,32 @@ INSERT INTO T_PART_ROOF_ITEM_ESTIMATE ( - ROOF_ITEM_NO - , ROOF_SURFACE_ID - , OBJECT_NO - , PLAN_NO - , ITEM_ID - , ITEM_NO - , ITEM_NAME - , SPECIFICATION - , AMOUNT - , PC_ITEM_ID - , QCAST_CUST_PRD_ID - , NORTH_MODULE_YN + ROOF_ITEM_NO + , ROOF_SURFACE_ID + , OBJECT_NO + , PLAN_NO + , ITEM_ID + , ITEM_NO + , ITEM_NAME + , SPECIFICATION + , AMOUNT + , PC_ITEM_ID + , QCAST_CUST_PRD_ID + , NORTH_MODULE_YN ) SELECT - #{roofItemNo} AS ROOF_ITEM_NO - , #{roofSurfaceId} AS ROOF_SURFACE_ID - , #{objectNo} AS OBJECT_NO - , #{planNo} AS PLAN_NO - , I.ITEM_ID - , I.ITEM_NO - , I.ITEM_NAME - , I.PNOW_W - , #{amount} - , #{pcItemId} - , #{qcastCustPrdId} - , #{northModuleYn} + #{roofItemNo} AS ROOF_ITEM_NO + , #{roofSurfaceId} AS ROOF_SURFACE_ID + , #{objectNo} AS OBJECT_NO + , #{planNo} AS PLAN_NO + , I.ITEM_ID + , I.ITEM_NO + , I.ITEM_NAME + , I.PNOW_W + , #{amount} + , #{pcItemId} + , #{qcastCustPrdId} + , #{northModuleYn} FROM M_ITEM I WITH (NOLOCK) WHERE I.ITEM_ID = #{itemId} @@ -1084,17 +1084,17 @@ INSERT INTO T_PART_CIRCUIT_ITEM_ESTIMATE ( - CIRCUIT_NO - , OBJECT_NO - , PLAN_NO - , ITEM_ID - , CIRCUIT_CFG + CIRCUIT_NO + , OBJECT_NO + , PLAN_NO + , ITEM_ID + , CIRCUIT_CFG ) VALUES ( - #{circuitNo} - , #{objectNo} - , #{planNo} - , #{itemId} - , #{circuitCfg} + #{circuitNo} + , #{objectNo} + , #{planNo} + , #{itemId} + , #{circuitCfg} ) @@ -1102,21 +1102,21 @@ /* sqlid : com.interplug.qcast.biz.estimate.deleteEstimateRoofList */ DELETE FROM T_PART_ROOF_ESTIMATE WHERE OBJECT_NO = #{objectNo} - AND PLAN_NO = #{planNo} + AND PLAN_NO = #{planNo} /* sqlid : com.interplug.qcast.biz.estimate.deleteEstimateRoofItemList */ DELETE FROM T_PART_ROOF_ITEM_ESTIMATE WHERE OBJECT_NO = #{objectNo} - AND PLAN_NO = #{planNo} + AND PLAN_NO = #{planNo} /* sqlid : com.interplug.qcast.biz.estimate.deleteEstimateCircuitItemList */ DELETE FROM T_PART_CIRCUIT_ITEM_ESTIMATE WHERE OBJECT_NO = #{objectNo} - AND PLAN_NO = #{planNo} + AND PLAN_NO = #{planNo} @@ -1130,7 +1130,7 @@ /* sqlid : com.interplug.qcast.biz.estimate.deleteEstimateItemList */ DELETE FROM T_PART_ESTIMATE WHERE OBJECT_NO = #{objectNo} - AND PLAN_NO = #{planNo} + AND PLAN_NO = #{planNo} @@ -1144,162 +1144,162 @@ /* sqlid : com.interplug.qcast.biz.estimate.insertEstimateCopy */ INSERT INTO T_PLAN ( - OBJECT_NO - , PLAN_NO - , CONSTRUCT_SPECIFICATION - , SETUP_HEIGHT - , WEATHER_POINT - , ROOF_KIND_ID - , SLOPE - , ROOF_MATERIAL_CLASS_ID - , ROOF_MATERIAL_ID - , SUPPORT_METHOD_ID - , MODULE_MODEL - , DRAWING_ESTIMATE_CREATE_DATE - , CHARGER - , ESTIMATE_VALIDITY_TERM - , DECISION_PLAN - , NUMBER - , CAPACITY - , SNOWFALL - , STANDARD_WIND_SPEED_CHECK - , OPTION_COVER - , HANWFA_FLG - , STAND_KIND_ID - , STANDARD_WIND_SPEED_ID - , SUPPORT_MEAKER - , CONSUMPTION_TAX_ID - , STATUS - , LAST_EDIT_DATETIME - , LAST_EDIT_USER - , DEL_FLG - , PC_TYPE_NO - , NORTH_ARRANGEMENT - , ROOF_MATERIAL_ID_MULTI - , SUPPORT_METHOD_ID_MULTI - , SUPPORT_MEAKER_MULTI - , DIFF_ROOF_ENABLED + OBJECT_NO + , PLAN_NO + , CONSTRUCT_SPECIFICATION + , SETUP_HEIGHT + , WEATHER_POINT + , ROOF_KIND_ID + , SLOPE + , ROOF_MATERIAL_CLASS_ID + , ROOF_MATERIAL_ID + , SUPPORT_METHOD_ID + , MODULE_MODEL + , DRAWING_ESTIMATE_CREATE_DATE + , CHARGER + , ESTIMATE_VALIDITY_TERM + , DECISION_PLAN + , NUMBER + , CAPACITY + , SNOWFALL + , STANDARD_WIND_SPEED_CHECK + , OPTION_COVER + , HANWFA_FLG + , STAND_KIND_ID + , STANDARD_WIND_SPEED_ID + , SUPPORT_MEAKER + , CONSUMPTION_TAX_ID + , STATUS + , LAST_EDIT_DATETIME + , LAST_EDIT_USER + , DEL_FLG + , PC_TYPE_NO + , NORTH_ARRANGEMENT + , ROOF_MATERIAL_ID_MULTI + , SUPPORT_METHOD_ID_MULTI + , SUPPORT_MEAKER_MULTI + , DIFF_ROOF_ENABLED ) SELECT - #{copyObjectNo} AS OBJECT_NO - , #{copyPlanNo} AS PLAN_NO - , P.CONSTRUCT_SPECIFICATION - , P.SETUP_HEIGHT - , P.WEATHER_POINT - , P.ROOF_KIND_ID - , P.SLOPE - , P.ROOF_MATERIAL_CLASS_ID - , P.ROOF_MATERIAL_ID - , P.SUPPORT_METHOD_ID - , P.MODULE_MODEL - , GETDATE() AS DRAWING_ESTIMATE_CREATE_DATE - - - , #{copyReceiveUser} AS CHARGER - - - , P.CHARGER - - - , P.ESTIMATE_VALIDITY_TERM - , P.DECISION_PLAN - , P.NUMBER - , P.CAPACITY - , P.SNOWFALL - , P.STANDARD_WIND_SPEED_CHECK - , P.OPTION_COVER - , P.HANWFA_FLG - , P.STAND_KIND_ID - , P.STANDARD_WIND_SPEED_ID - , P.SUPPORT_MEAKER - , P.CONSUMPTION_TAX_ID - , '1' AS STATUS - , GETDATE() AS LAST_EDIT_DATETIME - , #{userId} AS LAST_EDIT_USER - , P.DEL_FLG - , P.PC_TYPE_NO - , P.NORTH_ARRANGEMENT - , P.ROOF_MATERIAL_ID_MULTI - , P.SUPPORT_METHOD_ID_MULTI - , P.SUPPORT_MEAKER_MULTI - , P.DIFF_ROOF_ENABLED + #{copyObjectNo} AS OBJECT_NO + , #{copyPlanNo} AS PLAN_NO + , P.CONSTRUCT_SPECIFICATION + , P.SETUP_HEIGHT + , P.WEATHER_POINT + , P.ROOF_KIND_ID + , P.SLOPE + , P.ROOF_MATERIAL_CLASS_ID + , P.ROOF_MATERIAL_ID + , P.SUPPORT_METHOD_ID + , P.MODULE_MODEL + , GETDATE() AS DRAWING_ESTIMATE_CREATE_DATE + + + , #{copyReceiveUser} AS CHARGER + + + , P.CHARGER + + + , P.ESTIMATE_VALIDITY_TERM + , P.DECISION_PLAN + , P.NUMBER + , P.CAPACITY + , P.SNOWFALL + , P.STANDARD_WIND_SPEED_CHECK + , P.OPTION_COVER + , P.HANWFA_FLG + , P.STAND_KIND_ID + , P.STANDARD_WIND_SPEED_ID + , P.SUPPORT_MEAKER + , P.CONSUMPTION_TAX_ID + , '1' AS STATUS + , GETDATE() AS LAST_EDIT_DATETIME + , #{userId} AS LAST_EDIT_USER + , P.DEL_FLG + , P.PC_TYPE_NO + , P.NORTH_ARRANGEMENT + , P.ROOF_MATERIAL_ID_MULTI + , P.SUPPORT_METHOD_ID_MULTI + , P.SUPPORT_MEAKER_MULTI + , P.DIFF_ROOF_ENABLED FROM T_PLAN P WITH (NOLOCK) WHERE P.OBJECT_NO = #{objectNo} - AND P.PLAN_NO = #{planNo} + AND P.PLAN_NO = #{planNo} /* sqlid : com.interplug.qcast.biz.estimate.insertEstimateInfoCopy */ INSERT INTO T_PLAN_INFO ( - OBJECT_NO - , PLAN_NO - , CONSTRUCT_SPECIFICATION_MULTI - , ANGLE - , SURFACE_TYPE - , ORDER_FLG - , ESTIMATE_DATE - , ESTIMATE_TYPE - , FILE_FLG - , ESTIMATE_OPTION - , PKG_ASP - , PRICE_CD - , REMARKS - , TEMP_FLG - , LOCK_FLG - , SYNC_FLG - , CREATE_DATETIME - , CREATE_USER - , SEC_SAP_SALES_STORE_CD + OBJECT_NO + , PLAN_NO + , CONSTRUCT_SPECIFICATION_MULTI + , ANGLE + , SURFACE_TYPE + , ORDER_FLG + , ESTIMATE_DATE + , ESTIMATE_TYPE + , FILE_FLG + , ESTIMATE_OPTION + , PKG_ASP + , PRICE_CD + , REMARKS + , TEMP_FLG + , LOCK_FLG + , SYNC_FLG + , CREATE_DATETIME + , CREATE_USER + , SEC_SAP_SALES_STORE_CD ) SELECT - #{copyObjectNo} AS OBJECT_NO - , #{copyPlanNo} AS PLAN_NO - , PI.CONSTRUCT_SPECIFICATION_MULTI - , PI.ANGLE - , PI.SURFACE_TYPE - , '0' AS ORDER_FLG - , PI.ESTIMATE_DATE - , PI.ESTIMATE_TYPE - , PI.FILE_FLG - , PI.ESTIMATE_OPTION - , PI.PKG_ASP - , 'UNIT_PRICE' AS PRICE_CD - , PI.REMARKS - , '1' AS TEMP_FLG - , '0' AS LOCK_FLG - , '0' AS SYNC_FLG - , GETDATE() AS CREATE_DATETIME - , #{userId} AS CREATE_USER - , PI.SEC_SAP_SALES_STORE_CD + #{copyObjectNo} AS OBJECT_NO + , #{copyPlanNo} AS PLAN_NO + , PI.CONSTRUCT_SPECIFICATION_MULTI + , PI.ANGLE + , PI.SURFACE_TYPE + , '0' AS ORDER_FLG + , PI.ESTIMATE_DATE + , PI.ESTIMATE_TYPE + , PI.FILE_FLG + , PI.ESTIMATE_OPTION + , PI.PKG_ASP + , 'UNIT_PRICE' AS PRICE_CD + , PI.REMARKS + , '1' AS TEMP_FLG + , '0' AS LOCK_FLG + , '0' AS SYNC_FLG + , GETDATE() AS CREATE_DATETIME + , #{userId} AS CREATE_USER + , PI.SEC_SAP_SALES_STORE_CD FROM T_PLAN_INFO PI WITH (NOLOCK) WHERE PI.OBJECT_NO = #{objectNo} - AND PI.PLAN_NO = #{planNo} + AND PI.PLAN_NO = #{planNo} /* sqlid : com.interplug.qcast.biz.estimate.insertEstimateRoofCopy */ INSERT INTO T_PART_ROOF_ESTIMATE ( - ROOF_SURFACE_ID - , OBJECT_NO - , PLAN_NO - , ROOF_SURFACE - , ROOF_MATERIAL_ID - , SUPPORT_METHOD_ID - , CONSTRUCT_SPECIFICATION - , SLOPE - , ANGLE - , CLASS_TYPE - , AZIMUTH - , CREATE_DATETIME - , CREATE_USER + ROOF_SURFACE_ID + , OBJECT_NO + , PLAN_NO + , ROOF_SURFACE + , ROOF_MATERIAL_ID + , SUPPORT_METHOD_ID + , CONSTRUCT_SPECIFICATION + , SLOPE + , ANGLE + , CLASS_TYPE + , AZIMUTH + , CREATE_DATETIME + , CREATE_USER ) SELECT - PRE.ROOF_SURFACE_ID - , #{copyObjectNo} AS OBJECT_NO - , #{copyPlanNo} AS PLAN_NO - , PRE.ROOF_SURFACE + PRE.ROOF_SURFACE_ID + , #{copyObjectNo} AS OBJECT_NO + , #{copyPlanNo} AS PLAN_NO + , PRE.ROOF_SURFACE , PRE.ROOF_MATERIAL_ID , PRE.SUPPORT_METHOD_ID , PRE.CONSTRUCT_SPECIFICATION @@ -1311,86 +1311,86 @@ , #{userId} AS CREATE_USER FROM T_PART_ROOF_ESTIMATE PRE WITH (NOLOCK) WHERE PRE.OBJECT_NO = #{objectNo} - AND PRE.PLAN_NO = #{planNo} + AND PRE.PLAN_NO = #{planNo} /* sqlid : com.interplug.qcast.biz.estimate.insertEstimateRoofItemCopy */ INSERT INTO T_PART_ROOF_ITEM_ESTIMATE ( - ROOF_ITEM_NO - , ROOF_SURFACE_ID - , OBJECT_NO - , PLAN_NO - , ITEM_ID - , ITEM_NO - , ITEM_NAME - , SPECIFICATION - , AMOUNT - , PC_ITEM_ID - , NORTH_MODULE_YN + ROOF_ITEM_NO + , ROOF_SURFACE_ID + , OBJECT_NO + , PLAN_NO + , ITEM_ID + , ITEM_NO + , ITEM_NAME + , SPECIFICATION + , AMOUNT + , PC_ITEM_ID + , NORTH_MODULE_YN ) SELECT - PRIE.ROOF_ITEM_NO - , PRIE.ROOF_SURFACE_ID - , #{copyObjectNo} AS OBJECT_NO - , #{copyPlanNo} AS PLAN_NO - , PRIE.ITEM_ID - , PRIE.ITEM_NO - , PRIE.ITEM_NAME - , PRIE.SPECIFICATION - , PRIE.AMOUNT - , PRIE.PC_ITEM_ID - , PRIE.NORTH_MODULE_YN + PRIE.ROOF_ITEM_NO + , PRIE.ROOF_SURFACE_ID + , #{copyObjectNo} AS OBJECT_NO + , #{copyPlanNo} AS PLAN_NO + , PRIE.ITEM_ID + , PRIE.ITEM_NO + , PRIE.ITEM_NAME + , PRIE.SPECIFICATION + , PRIE.AMOUNT + , PRIE.PC_ITEM_ID + , PRIE.NORTH_MODULE_YN FROM T_PART_ROOF_ITEM_ESTIMATE PRIE WITH (NOLOCK) WHERE PRIE.OBJECT_NO = #{objectNo} - AND PRIE.PLAN_NO = #{planNo} + AND PRIE.PLAN_NO = #{planNo} /* sqlid : com.interplug.qcast.biz.estimate.insertEstimateCircuitItemCopy */ INSERT INTO T_PART_CIRCUIT_ITEM_ESTIMATE ( - CIRCUIT_NO - , OBJECT_NO - , PLAN_NO - , ITEM_ID - , CIRCUIT_CFG + CIRCUIT_NO + , OBJECT_NO + , PLAN_NO + , ITEM_ID + , CIRCUIT_CFG ) SELECT - PCIE.CIRCUIT_NO - , #{copyObjectNo} AS OBJECT_NO - , #{copyPlanNo} AS PLAN_NO - , PCIE.ITEM_ID - , PCIE.CIRCUIT_CFG + PCIE.CIRCUIT_NO + , #{copyObjectNo} AS OBJECT_NO + , #{copyPlanNo} AS PLAN_NO + , PCIE.ITEM_ID + , PCIE.CIRCUIT_CFG FROM T_PART_CIRCUIT_ITEM_ESTIMATE PCIE WITH (NOLOCK) WHERE PCIE.OBJECT_NO = #{objectNo} - AND PCIE.PLAN_NO = #{planNo} + AND PCIE.PLAN_NO = #{planNo} /* sqlid : com.interplug.qcast.biz.estimate.insertEstimateDrawingItemCopy */ INSERT INTO T_PART_DRAWING_ESTIMATE ( - OBJECT_NO - , PLAN_NO - , DISP_ORDER - , ITEM_ID - , AMOUNT - , LAST_EDIT_DATETIME - , LAST_EDIT_USER + OBJECT_NO + , PLAN_NO + , DISP_ORDER + , ITEM_ID + , AMOUNT + , LAST_EDIT_DATETIME + , LAST_EDIT_USER ) SELECT - #{copyObjectNo} AS OBJECT_NO - , #{copyPlanNo} AS PLAN_NO - , PDE.DISP_ORDER - , PDE.ITEM_ID - , PDE.AMOUNT - , GETDATE() AS LAST_EDIT_DATETIME - , #{userId} AS LAST_EDIT_USER + #{copyObjectNo} AS OBJECT_NO + , #{copyPlanNo} AS PLAN_NO + , PDE.DISP_ORDER + , PDE.ITEM_ID + , PDE.AMOUNT + , GETDATE() AS LAST_EDIT_DATETIME + , #{userId} AS LAST_EDIT_USER FROM T_PART_DRAWING_ESTIMATE PDE WITH (NOLOCK) WHERE PDE.OBJECT_NO = #{objectNo} - AND PDE.PLAN_NO = #{planNo} + AND PDE.PLAN_NO = #{planNo} @@ -1413,11 +1413,9 @@ /* sqlid : com.interplug.qcast.biz.estimate.updatePlanConfirmSync */ - UPDATE T_PLAN + UPDATE T_PLAN_INFO SET - ORDER_FLG = '1' - , LAST_EDIT_DATETIME = GETDATE() - , LAST_EDIT_USER = 'system' + ORDER_FLG = '1' WHERE OBJECT_NO = #{objectNo} AND PLAN_NO = #{planNo} @@ -1428,18 +1426,18 @@ TOP 1 T.CONSTRUCT_SPECIFICATION FROM ( - SELECT - PRE.CONSTRUCT_SPECIFICATION - , CASE WHEN LEFT(PRE.ROOF_SURFACE, 1) = '南' THEN 1 - WHEN LEFT(PRE.ROOF_SURFACE, 1) = '東' THEN 2 - WHEN LEFT(PRE.ROOF_SURFACE, 1) = '西' THEN 3 - WHEN LEFT(PRE.ROOF_SURFACE, 1) = '北' THEN 4 - ELSE 5 END ROOF_SURFACE_NUM - , (SELECT ISNULL(SUM(AMOUNT), 0) FROM T_PART_ROOF_ITEM_ESTIMATE WHERE ROOF_SURFACE_ID = PRE.ROOF_SURFACE_ID AND OBJECT_NO = PRE.OBJECT_NO AND PLAN_NO = PRE.PLAN_NO) AS MODULE_TCNT - FROM T_PART_ROOF_ESTIMATE PRE WITH (NOLOCK) - WHERE PRE.OBJECT_NO = #{objectNo} - AND PRE.PLAN_NO = #{planNo} - ) T + SELECT + PRE.CONSTRUCT_SPECIFICATION + , CASE WHEN LEFT(PRE.ROOF_SURFACE, 1) = '南' THEN 1 + WHEN LEFT(PRE.ROOF_SURFACE, 1) = '東' THEN 2 + WHEN LEFT(PRE.ROOF_SURFACE, 1) = '西' THEN 3 + WHEN LEFT(PRE.ROOF_SURFACE, 1) = '北' THEN 4 + ELSE 5 END ROOF_SURFACE_NUM + , (SELECT ISNULL(SUM(AMOUNT), 0) FROM T_PART_ROOF_ITEM_ESTIMATE WHERE ROOF_SURFACE_ID = PRE.ROOF_SURFACE_ID AND OBJECT_NO = PRE.OBJECT_NO AND PLAN_NO = PRE.PLAN_NO) AS MODULE_TCNT + FROM T_PART_ROOF_ESTIMATE PRE WITH (NOLOCK) + WHERE PRE.OBJECT_NO = #{objectNo} + AND PRE.PLAN_NO = #{planNo} + ) T ORDER BY T.MODULE_TCNT DESC, T.ROOF_SURFACE_NUM ASC From ac00a93719b43fc9075dd79f3bd8aa8ce198ce38 Mon Sep 17 00:00:00 2001 From: yscha Date: Fri, 2 Jan 2026 15:43:15 +0900 Subject: [PATCH 5/5] estimateMapper.xml --- src/main/resources/mappers/estimate/estimateMapper.xml | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/main/resources/mappers/estimate/estimateMapper.xml b/src/main/resources/mappers/estimate/estimateMapper.xml index 3ea6d81c..b8d99320 100644 --- a/src/main/resources/mappers/estimate/estimateMapper.xml +++ b/src/main/resources/mappers/estimate/estimateMapper.xml @@ -184,7 +184,7 @@ , P.LAST_EDIT_USER , (SELECT CODE FROM M_COMM_L WHERE HEAD_CD = '200800' AND CODE_NM = O.OBJECT_NAME_OMIT) AS OBJECT_NAME_OMIT_CD FROM T_PLAN P WITH (NOLOCK) - INNER JOIN T_PLAN_INFO PI WITH (NOLOCK) + INNER JOIN T_PLAN_INFO PI WITH (NOLOCK) ON P.OBJECT_NO = PI.OBJECT_NO AND P.PLAN_NO = PI.PLAN_NO INNER JOIN T_OBJECT O WITH (NOLOCK) @@ -193,7 +193,9 @@ ON O.OBJECT_NO = OI.OBJECT_NO INNER JOIN M_SALES_STORE SS WITH(NOLOCK) ON O.SALE_STORE_ID = SS.SALE_STORE_ID - WHERE PI.SYNC_FLG = '0' + WHERE P.DEL_FLG = '0' + AND PI.TEMP_FLG = '0' + AND PI.SYNC_FLG = '0' AND OI.SOURCE_ORIGIN = 'QCAST_III' AND OI.ORG_DEL_FLG = '0' @@ -1413,9 +1415,11 @@ /* sqlid : com.interplug.qcast.biz.estimate.updatePlanConfirmSync */ - UPDATE T_PLAN_INFO + UPDATE T_PLAN SET ORDER_FLG = '1' + , LAST_EDIT_DATETIME = GETDATE() + , LAST_EDIT_USER = 'system' WHERE OBJECT_NO = #{objectNo} AND PLAN_NO = #{planNo}